andre@0: /* This Source Code Form is subject to the terms of the Mozilla Public andre@0: * License, v. 2.0. If a copy of the MPL was not distributed with this andre@0: * file, You can obtain one at http://mozilla.org/MPL/2.0/. */ andre@0: andre@0: #include "builtins.h" andre@0: andre@0: /* andre@0: * builtins/object.c andre@0: * andre@0: * This file implements the NSSCKMDObject object for the andre@0: * "builtin objects" cryptoki module. andre@0: */ andre@0: andre@0: /* andre@0: * Finalize - unneeded andre@0: * Destroy - CKR_SESSION_READ_ONLY andre@0: * IsTokenObject - CK_TRUE andre@0: * GetAttributeCount andre@0: * GetAttributeTypes andre@0: * GetAttributeSize andre@0: * GetAttribute andre@0: * SetAttribute - unneeded andre@0: * GetObjectSize andre@0: */ andre@0: andre@0: static CK_RV andre@0: builtins_mdObject_Destroy andre@0: ( andre@0: NSSCKMDObject *mdObject, andre@0: NSSCKFWObject *fwObject, andre@0: NSSCKMDSession *mdSession, andre@0: NSSCKFWSession *fwSession, andre@0: NSSCKMDToken *mdToken, andre@0: NSSCKFWToken *fwToken, andre@0: NSSCKMDInstance *mdInstance, andre@0: NSSCKFWInstance *fwInstance andre@0: ) andre@0: { andre@0: return CKR_SESSION_READ_ONLY; andre@0: } andre@0: andre@0: static CK_BBOOL andre@0: builtins_mdObject_IsTokenObject andre@0: ( andre@0: NSSCKMDObject *mdObject, andre@0: NSSCKFWObject *fwObject, andre@0: NSSCKMDSession *mdSession, andre@0: NSSCKFWSession *fwSession, andre@0: NSSCKMDToken *mdToken, andre@0: NSSCKFWToken *fwToken, andre@0: NSSCKMDInstance *mdInstance, andre@0: NSSCKFWInstance *fwInstance andre@0: ) andre@0: { andre@0: return CK_TRUE; andre@0: } andre@0: andre@0: static CK_ULONG andre@0: builtins_mdObject_GetAttributeCount andre@0: ( andre@0: NSSCKMDObject *mdObject, andre@0: NSSCKFWObject *fwObject, andre@0: NSSCKMDSession *mdSession, andre@0: NSSCKFWSession *fwSession, andre@0: NSSCKMDToken *mdToken, andre@0: NSSCKFWToken *fwToken, andre@0: NSSCKMDInstance *mdInstance, andre@0: NSSCKFWInstance *fwInstance, andre@0: CK_RV *pError andre@0: ) andre@0: { andre@0: builtinsInternalObject *io = (builtinsInternalObject *)mdObject->etc; andre@0: return io->n; andre@0: } andre@0: andre@0: static CK_RV andre@0: builtins_mdObject_GetAttributeTypes andre@0: ( andre@0: NSSCKMDObject *mdObject, andre@0: NSSCKFWObject *fwObject, andre@0: NSSCKMDSession *mdSession, andre@0: NSSCKFWSession *fwSession, andre@0: NSSCKMDToken *mdToken, andre@0: NSSCKFWToken *fwToken, andre@0: NSSCKMDInstance *mdInstance, andre@0: NSSCKFWInstance *fwInstance, andre@0: CK_ATTRIBUTE_TYPE_PTR typeArray, andre@0: CK_ULONG ulCount andre@0: ) andre@0: { andre@0: builtinsInternalObject *io = (builtinsInternalObject *)mdObject->etc; andre@0: CK_ULONG i; andre@0: andre@0: if( io->n != ulCount ) { andre@0: return CKR_BUFFER_TOO_SMALL; andre@0: } andre@0: andre@0: for( i = 0; i < io->n; i++ ) { andre@0: typeArray[i] = io->types[i]; andre@0: } andre@0: andre@0: return CKR_OK; andre@0: } andre@0: andre@0: static CK_ULONG andre@0: builtins_mdObject_GetAttributeSize andre@0: ( andre@0: NSSCKMDObject *mdObject, andre@0: NSSCKFWObject *fwObject, andre@0: NSSCKMDSession *mdSession, andre@0: NSSCKFWSession *fwSession, andre@0: NSSCKMDToken *mdToken, andre@0: NSSCKFWToken *fwToken, andre@0: NSSCKMDInstance *mdInstance, andre@0: NSSCKFWInstance *fwInstance, andre@0: CK_ATTRIBUTE_TYPE attribute, andre@0: CK_RV *pError andre@0: ) andre@0: { andre@0: builtinsInternalObject *io = (builtinsInternalObject *)mdObject->etc; andre@0: CK_ULONG i; andre@0: andre@0: for( i = 0; i < io->n; i++ ) { andre@0: if( attribute == io->types[i] ) { andre@0: return (CK_ULONG)(io->items[i].size); andre@0: } andre@0: } andre@0: andre@0: *pError = CKR_ATTRIBUTE_TYPE_INVALID; andre@0: return 0; andre@0: } andre@0: andre@0: static NSSCKFWItem andre@0: builtins_mdObject_GetAttribute andre@0: ( andre@0: NSSCKMDObject *mdObject, andre@0: NSSCKFWObject *fwObject, andre@0: NSSCKMDSession *mdSession, andre@0: NSSCKFWSession *fwSession, andre@0: NSSCKMDToken *mdToken, andre@0: NSSCKFWToken *fwToken, andre@0: NSSCKMDInstance *mdInstance, andre@0: NSSCKFWInstance *fwInstance, andre@0: CK_ATTRIBUTE_TYPE attribute, andre@0: CK_RV *pError andre@0: ) andre@0: { andre@0: NSSCKFWItem mdItem; andre@0: builtinsInternalObject *io = (builtinsInternalObject *)mdObject->etc; andre@0: CK_ULONG i; andre@0: andre@0: mdItem.needsFreeing = PR_FALSE; andre@0: mdItem.item = (NSSItem*) NULL; andre@0: andre@0: for( i = 0; i < io->n; i++ ) { andre@0: if( attribute == io->types[i] ) { andre@0: mdItem.item = (NSSItem*) &io->items[i]; andre@0: return mdItem; andre@0: } andre@0: } andre@0: andre@0: *pError = CKR_ATTRIBUTE_TYPE_INVALID; andre@0: return mdItem; andre@0: } andre@0: andre@0: static CK_ULONG andre@0: builtins_mdObject_GetObjectSize andre@0: ( andre@0: NSSCKMDObject *mdObject, andre@0: NSSCKFWObject *fwObject, andre@0: NSSCKMDSession *mdSession, andre@0: NSSCKFWSession *fwSession, andre@0: NSSCKMDToken *mdToken, andre@0: NSSCKFWToken *fwToken, andre@0: NSSCKMDInstance *mdInstance, andre@0: NSSCKFWInstance *fwInstance, andre@0: CK_RV *pError andre@0: ) andre@0: { andre@0: builtinsInternalObject *io = (builtinsInternalObject *)mdObject->etc; andre@0: CK_ULONG i; andre@0: CK_ULONG rv = sizeof(CK_ULONG); andre@0: andre@0: for( i = 0; i < io->n; i++ ) { andre@0: rv += sizeof(CK_ATTRIBUTE_TYPE) + sizeof(NSSItem) + io->items[i].size; andre@0: } andre@0: andre@0: return rv; andre@0: } andre@0: andre@0: static const NSSCKMDObject andre@0: builtins_prototype_mdObject = { andre@0: (void *)NULL, /* etc */ andre@0: NULL, /* Finalize */ andre@0: builtins_mdObject_Destroy, andre@0: builtins_mdObject_IsTokenObject, andre@0: builtins_mdObject_GetAttributeCount, andre@0: builtins_mdObject_GetAttributeTypes, andre@0: builtins_mdObject_GetAttributeSize, andre@0: builtins_mdObject_GetAttribute, andre@0: NULL, /* FreeAttribute */ andre@0: NULL, /* SetAttribute */ andre@0: builtins_mdObject_GetObjectSize, andre@0: (void *)NULL /* null terminator */ andre@0: }; andre@0: andre@0: NSS_IMPLEMENT NSSCKMDObject * andre@0: nss_builtins_CreateMDObject andre@0: ( andre@0: NSSArena *arena, andre@0: builtinsInternalObject *io, andre@0: CK_RV *pError andre@0: ) andre@0: { andre@0: if ( (void*)NULL == io->mdObject.etc) { andre@0: (void) nsslibc_memcpy(&io->mdObject,&builtins_prototype_mdObject, andre@0: sizeof(builtins_prototype_mdObject)); andre@0: io->mdObject.etc = (void *)io; andre@0: } andre@0: andre@0: return &io->mdObject; andre@0: }