1.1 --- /dev/null Thu Jan 01 00:00:00 1970 +0000 1.2 +++ b/security/nss/lib/ckfw/builtins/bfind.c Wed Dec 31 06:09:35 2014 +0100 1.3 @@ -0,0 +1,251 @@ 1.4 +/* This Source Code Form is subject to the terms of the Mozilla Public 1.5 + * License, v. 2.0. If a copy of the MPL was not distributed with this 1.6 + * file, You can obtain one at http://mozilla.org/MPL/2.0/. */ 1.7 + 1.8 +#ifndef BUILTINS_H 1.9 +#include "builtins.h" 1.10 +#endif /* BUILTINS_H */ 1.11 + 1.12 +/* 1.13 + * builtins/find.c 1.14 + * 1.15 + * This file implements the NSSCKMDFindObjects object for the 1.16 + * "builtin objects" cryptoki module. 1.17 + */ 1.18 + 1.19 +struct builtinsFOStr { 1.20 + NSSArena *arena; 1.21 + CK_ULONG n; 1.22 + CK_ULONG i; 1.23 + builtinsInternalObject **objs; 1.24 +}; 1.25 + 1.26 +static void 1.27 +builtins_mdFindObjects_Final 1.28 +( 1.29 + NSSCKMDFindObjects *mdFindObjects, 1.30 + NSSCKFWFindObjects *fwFindObjects, 1.31 + NSSCKMDSession *mdSession, 1.32 + NSSCKFWSession *fwSession, 1.33 + NSSCKMDToken *mdToken, 1.34 + NSSCKFWToken *fwToken, 1.35 + NSSCKMDInstance *mdInstance, 1.36 + NSSCKFWInstance *fwInstance 1.37 +) 1.38 +{ 1.39 + struct builtinsFOStr *fo = (struct builtinsFOStr *)mdFindObjects->etc; 1.40 + NSSArena *arena = fo->arena; 1.41 + 1.42 + nss_ZFreeIf(fo->objs); 1.43 + nss_ZFreeIf(fo); 1.44 + nss_ZFreeIf(mdFindObjects); 1.45 + if ((NSSArena *)NULL != arena) { 1.46 + NSSArena_Destroy(arena); 1.47 + } 1.48 + 1.49 + return; 1.50 +} 1.51 + 1.52 +static NSSCKMDObject * 1.53 +builtins_mdFindObjects_Next 1.54 +( 1.55 + NSSCKMDFindObjects *mdFindObjects, 1.56 + NSSCKFWFindObjects *fwFindObjects, 1.57 + NSSCKMDSession *mdSession, 1.58 + NSSCKFWSession *fwSession, 1.59 + NSSCKMDToken *mdToken, 1.60 + NSSCKFWToken *fwToken, 1.61 + NSSCKMDInstance *mdInstance, 1.62 + NSSCKFWInstance *fwInstance, 1.63 + NSSArena *arena, 1.64 + CK_RV *pError 1.65 +) 1.66 +{ 1.67 + struct builtinsFOStr *fo = (struct builtinsFOStr *)mdFindObjects->etc; 1.68 + builtinsInternalObject *io; 1.69 + 1.70 + if( fo->i == fo->n ) { 1.71 + *pError = CKR_OK; 1.72 + return (NSSCKMDObject *)NULL; 1.73 + } 1.74 + 1.75 + io = fo->objs[ fo->i ]; 1.76 + fo->i++; 1.77 + 1.78 + return nss_builtins_CreateMDObject(arena, io, pError); 1.79 +} 1.80 + 1.81 +static int 1.82 +builtins_derUnwrapInt(unsigned char *src, int size, unsigned char **dest) { 1.83 + unsigned char *start = src; 1.84 + int len = 0; 1.85 + 1.86 + if (*src ++ != 2) { 1.87 + return 0; 1.88 + } 1.89 + len = *src++; 1.90 + if (len & 0x80) { 1.91 + int count = len & 0x7f; 1.92 + len =0; 1.93 + 1.94 + if (count+2 > size) { 1.95 + return 0; 1.96 + } 1.97 + while (count-- > 0) { 1.98 + len = (len << 8) | *src++; 1.99 + } 1.100 + } 1.101 + if (len + (src-start) != size) { 1.102 + return 0; 1.103 + } 1.104 + *dest = src; 1.105 + return len; 1.106 +} 1.107 + 1.108 +static CK_BBOOL 1.109 +builtins_attrmatch 1.110 +( 1.111 + CK_ATTRIBUTE_PTR a, 1.112 + const NSSItem *b 1.113 +) 1.114 +{ 1.115 + PRBool prb; 1.116 + 1.117 + if( a->ulValueLen != b->size ) { 1.118 + /* match a decoded serial number */ 1.119 + if ((a->type == CKA_SERIAL_NUMBER) && (a->ulValueLen < b->size)) { 1.120 + int len; 1.121 + unsigned char *data = NULL; 1.122 + 1.123 + len = builtins_derUnwrapInt(b->data,b->size,&data); 1.124 + if (data && 1.125 + (len == a->ulValueLen) && 1.126 + nsslibc_memequal(a->pValue, data, len, (PRStatus *)NULL)) { 1.127 + return CK_TRUE; 1.128 + } 1.129 + } 1.130 + return CK_FALSE; 1.131 + } 1.132 + 1.133 + prb = nsslibc_memequal(a->pValue, b->data, b->size, (PRStatus *)NULL); 1.134 + 1.135 + if( PR_TRUE == prb ) { 1.136 + return CK_TRUE; 1.137 + } else { 1.138 + return CK_FALSE; 1.139 + } 1.140 +} 1.141 + 1.142 + 1.143 +static CK_BBOOL 1.144 +builtins_match 1.145 +( 1.146 + CK_ATTRIBUTE_PTR pTemplate, 1.147 + CK_ULONG ulAttributeCount, 1.148 + builtinsInternalObject *o 1.149 +) 1.150 +{ 1.151 + CK_ULONG i; 1.152 + 1.153 + for( i = 0; i < ulAttributeCount; i++ ) { 1.154 + CK_ULONG j; 1.155 + 1.156 + for( j = 0; j < o->n; j++ ) { 1.157 + if( o->types[j] == pTemplate[i].type ) { 1.158 + if( CK_FALSE == builtins_attrmatch(&pTemplate[i], &o->items[j]) ) { 1.159 + return CK_FALSE; 1.160 + } else { 1.161 + break; 1.162 + } 1.163 + } 1.164 + } 1.165 + 1.166 + if( j == o->n ) { 1.167 + /* Loop ran to the end: no matching attribute */ 1.168 + return CK_FALSE; 1.169 + } 1.170 + } 1.171 + 1.172 + /* Every attribute passed */ 1.173 + return CK_TRUE; 1.174 +} 1.175 + 1.176 +NSS_IMPLEMENT NSSCKMDFindObjects * 1.177 +nss_builtins_FindObjectsInit 1.178 +( 1.179 + NSSCKFWSession *fwSession, 1.180 + CK_ATTRIBUTE_PTR pTemplate, 1.181 + CK_ULONG ulAttributeCount, 1.182 + CK_RV *pError 1.183 +) 1.184 +{ 1.185 + /* This could be made more efficient. I'm rather rushed. */ 1.186 + NSSArena *arena; 1.187 + NSSCKMDFindObjects *rv = (NSSCKMDFindObjects *)NULL; 1.188 + struct builtinsFOStr *fo = (struct builtinsFOStr *)NULL; 1.189 + builtinsInternalObject **temp = (builtinsInternalObject **)NULL; 1.190 + PRUint32 i; 1.191 + 1.192 + arena = NSSArena_Create(); 1.193 + if( (NSSArena *)NULL == arena ) { 1.194 + goto loser; 1.195 + } 1.196 + 1.197 + rv = nss_ZNEW(arena, NSSCKMDFindObjects); 1.198 + if( (NSSCKMDFindObjects *)NULL == rv ) { 1.199 + *pError = CKR_HOST_MEMORY; 1.200 + goto loser; 1.201 + } 1.202 + 1.203 + fo = nss_ZNEW(arena, struct builtinsFOStr); 1.204 + if( (struct builtinsFOStr *)NULL == fo ) { 1.205 + *pError = CKR_HOST_MEMORY; 1.206 + goto loser; 1.207 + } 1.208 + 1.209 + fo->arena = arena; 1.210 + /* fo->n and fo->i are already zero */ 1.211 + 1.212 + rv->etc = (void *)fo; 1.213 + rv->Final = builtins_mdFindObjects_Final; 1.214 + rv->Next = builtins_mdFindObjects_Next; 1.215 + rv->null = (void *)NULL; 1.216 + 1.217 + temp = nss_ZNEWARRAY((NSSArena *)NULL, builtinsInternalObject *, 1.218 + nss_builtins_nObjects); 1.219 + if( (builtinsInternalObject **)NULL == temp ) { 1.220 + *pError = CKR_HOST_MEMORY; 1.221 + goto loser; 1.222 + } 1.223 + 1.224 + for( i = 0; i < nss_builtins_nObjects; i++ ) { 1.225 + builtinsInternalObject *o = (builtinsInternalObject *)&nss_builtins_data[i]; 1.226 + 1.227 + if( CK_TRUE == builtins_match(pTemplate, ulAttributeCount, o) ) { 1.228 + temp[ fo->n ] = o; 1.229 + fo->n++; 1.230 + } 1.231 + } 1.232 + 1.233 + fo->objs = nss_ZNEWARRAY(arena, builtinsInternalObject *, fo->n); 1.234 + if( (builtinsInternalObject **)NULL == fo->objs ) { 1.235 + *pError = CKR_HOST_MEMORY; 1.236 + goto loser; 1.237 + } 1.238 + 1.239 + (void)nsslibc_memcpy(fo->objs, temp, sizeof(builtinsInternalObject *) * fo->n); 1.240 + nss_ZFreeIf(temp); 1.241 + temp = (builtinsInternalObject **)NULL; 1.242 + 1.243 + return rv; 1.244 + 1.245 + loser: 1.246 + nss_ZFreeIf(temp); 1.247 + nss_ZFreeIf(fo); 1.248 + nss_ZFreeIf(rv); 1.249 + if ((NSSArena *)NULL != arena) { 1.250 + NSSArena_Destroy(arena); 1.251 + } 1.252 + return (NSSCKMDFindObjects *)NULL; 1.253 +} 1.254 +