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: #ifndef BUILTINS_H michael@0: #include "builtins.h" michael@0: #endif /* BUILTINS_H */ michael@0: michael@0: /* michael@0: * builtins/find.c michael@0: * michael@0: * This file implements the NSSCKMDFindObjects object for the michael@0: * "builtin objects" cryptoki module. michael@0: */ michael@0: michael@0: struct builtinsFOStr { michael@0: NSSArena *arena; michael@0: CK_ULONG n; michael@0: CK_ULONG i; michael@0: builtinsInternalObject **objs; michael@0: }; michael@0: michael@0: static void michael@0: builtins_mdFindObjects_Final michael@0: ( michael@0: NSSCKMDFindObjects *mdFindObjects, michael@0: NSSCKFWFindObjects *fwFindObjects, 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: struct builtinsFOStr *fo = (struct builtinsFOStr *)mdFindObjects->etc; michael@0: NSSArena *arena = fo->arena; michael@0: michael@0: nss_ZFreeIf(fo->objs); michael@0: nss_ZFreeIf(fo); michael@0: nss_ZFreeIf(mdFindObjects); michael@0: if ((NSSArena *)NULL != arena) { michael@0: NSSArena_Destroy(arena); michael@0: } michael@0: michael@0: return; michael@0: } michael@0: michael@0: static NSSCKMDObject * michael@0: builtins_mdFindObjects_Next michael@0: ( michael@0: NSSCKMDFindObjects *mdFindObjects, michael@0: NSSCKFWFindObjects *fwFindObjects, 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: NSSArena *arena, michael@0: CK_RV *pError michael@0: ) michael@0: { michael@0: struct builtinsFOStr *fo = (struct builtinsFOStr *)mdFindObjects->etc; michael@0: builtinsInternalObject *io; michael@0: michael@0: if( fo->i == fo->n ) { michael@0: *pError = CKR_OK; michael@0: return (NSSCKMDObject *)NULL; michael@0: } michael@0: michael@0: io = fo->objs[ fo->i ]; michael@0: fo->i++; michael@0: michael@0: return nss_builtins_CreateMDObject(arena, io, pError); michael@0: } michael@0: michael@0: static int michael@0: builtins_derUnwrapInt(unsigned char *src, int size, unsigned char **dest) { michael@0: unsigned char *start = src; michael@0: int len = 0; michael@0: michael@0: if (*src ++ != 2) { michael@0: return 0; michael@0: } michael@0: len = *src++; michael@0: if (len & 0x80) { michael@0: int count = len & 0x7f; michael@0: len =0; michael@0: michael@0: if (count+2 > size) { michael@0: return 0; michael@0: } michael@0: while (count-- > 0) { michael@0: len = (len << 8) | *src++; michael@0: } michael@0: } michael@0: if (len + (src-start) != size) { michael@0: return 0; michael@0: } michael@0: *dest = src; michael@0: return len; michael@0: } michael@0: michael@0: static CK_BBOOL michael@0: builtins_attrmatch michael@0: ( michael@0: CK_ATTRIBUTE_PTR a, michael@0: const NSSItem *b michael@0: ) michael@0: { michael@0: PRBool prb; michael@0: michael@0: if( a->ulValueLen != b->size ) { michael@0: /* match a decoded serial number */ michael@0: if ((a->type == CKA_SERIAL_NUMBER) && (a->ulValueLen < b->size)) { michael@0: int len; michael@0: unsigned char *data = NULL; michael@0: michael@0: len = builtins_derUnwrapInt(b->data,b->size,&data); michael@0: if (data && michael@0: (len == a->ulValueLen) && michael@0: nsslibc_memequal(a->pValue, data, len, (PRStatus *)NULL)) { michael@0: return CK_TRUE; michael@0: } michael@0: } michael@0: return CK_FALSE; michael@0: } michael@0: michael@0: prb = nsslibc_memequal(a->pValue, b->data, b->size, (PRStatus *)NULL); michael@0: michael@0: if( PR_TRUE == prb ) { michael@0: return CK_TRUE; michael@0: } else { michael@0: return CK_FALSE; michael@0: } michael@0: } michael@0: michael@0: michael@0: static CK_BBOOL michael@0: builtins_match michael@0: ( michael@0: CK_ATTRIBUTE_PTR pTemplate, michael@0: CK_ULONG ulAttributeCount, michael@0: builtinsInternalObject *o michael@0: ) michael@0: { michael@0: CK_ULONG i; michael@0: michael@0: for( i = 0; i < ulAttributeCount; i++ ) { michael@0: CK_ULONG j; michael@0: michael@0: for( j = 0; j < o->n; j++ ) { michael@0: if( o->types[j] == pTemplate[i].type ) { michael@0: if( CK_FALSE == builtins_attrmatch(&pTemplate[i], &o->items[j]) ) { michael@0: return CK_FALSE; michael@0: } else { michael@0: break; michael@0: } michael@0: } michael@0: } michael@0: michael@0: if( j == o->n ) { michael@0: /* Loop ran to the end: no matching attribute */ michael@0: return CK_FALSE; michael@0: } michael@0: } michael@0: michael@0: /* Every attribute passed */ michael@0: return CK_TRUE; michael@0: } michael@0: michael@0: NSS_IMPLEMENT NSSCKMDFindObjects * michael@0: nss_builtins_FindObjectsInit michael@0: ( michael@0: NSSCKFWSession *fwSession, michael@0: CK_ATTRIBUTE_PTR pTemplate, michael@0: CK_ULONG ulAttributeCount, michael@0: CK_RV *pError michael@0: ) michael@0: { michael@0: /* This could be made more efficient. I'm rather rushed. */ michael@0: NSSArena *arena; michael@0: NSSCKMDFindObjects *rv = (NSSCKMDFindObjects *)NULL; michael@0: struct builtinsFOStr *fo = (struct builtinsFOStr *)NULL; michael@0: builtinsInternalObject **temp = (builtinsInternalObject **)NULL; michael@0: PRUint32 i; michael@0: michael@0: arena = NSSArena_Create(); michael@0: if( (NSSArena *)NULL == arena ) { michael@0: goto loser; michael@0: } michael@0: michael@0: rv = nss_ZNEW(arena, NSSCKMDFindObjects); michael@0: if( (NSSCKMDFindObjects *)NULL == rv ) { michael@0: *pError = CKR_HOST_MEMORY; michael@0: goto loser; michael@0: } michael@0: michael@0: fo = nss_ZNEW(arena, struct builtinsFOStr); michael@0: if( (struct builtinsFOStr *)NULL == fo ) { michael@0: *pError = CKR_HOST_MEMORY; michael@0: goto loser; michael@0: } michael@0: michael@0: fo->arena = arena; michael@0: /* fo->n and fo->i are already zero */ michael@0: michael@0: rv->etc = (void *)fo; michael@0: rv->Final = builtins_mdFindObjects_Final; michael@0: rv->Next = builtins_mdFindObjects_Next; michael@0: rv->null = (void *)NULL; michael@0: michael@0: temp = nss_ZNEWARRAY((NSSArena *)NULL, builtinsInternalObject *, michael@0: nss_builtins_nObjects); michael@0: if( (builtinsInternalObject **)NULL == temp ) { michael@0: *pError = CKR_HOST_MEMORY; michael@0: goto loser; michael@0: } michael@0: michael@0: for( i = 0; i < nss_builtins_nObjects; i++ ) { michael@0: builtinsInternalObject *o = (builtinsInternalObject *)&nss_builtins_data[i]; michael@0: michael@0: if( CK_TRUE == builtins_match(pTemplate, ulAttributeCount, o) ) { michael@0: temp[ fo->n ] = o; michael@0: fo->n++; michael@0: } michael@0: } michael@0: michael@0: fo->objs = nss_ZNEWARRAY(arena, builtinsInternalObject *, fo->n); michael@0: if( (builtinsInternalObject **)NULL == fo->objs ) { michael@0: *pError = CKR_HOST_MEMORY; michael@0: goto loser; michael@0: } michael@0: michael@0: (void)nsslibc_memcpy(fo->objs, temp, sizeof(builtinsInternalObject *) * fo->n); michael@0: nss_ZFreeIf(temp); michael@0: temp = (builtinsInternalObject **)NULL; michael@0: michael@0: return rv; michael@0: michael@0: loser: michael@0: nss_ZFreeIf(temp); michael@0: nss_ZFreeIf(fo); michael@0: nss_ZFreeIf(rv); michael@0: if ((NSSArena *)NULL != arena) { michael@0: NSSArena_Destroy(arena); michael@0: } michael@0: return (NSSCKMDFindObjects *)NULL; michael@0: } michael@0: