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