| OLD | NEW |
| (Empty) |
| 1 /* This Source Code Form is subject to the terms of the Mozilla Public | |
| 2 * License, v. 2.0. If a copy of the MPL was not distributed with this | |
| 3 * file, You can obtain one at http://mozilla.org/MPL/2.0/. */ | |
| 4 | |
| 5 #ifdef DEBUG | |
| 6 static const char CVS_ID[] = "@(#) $RCSfile: bfind.c,v $ $Revision: 1.7 $ $Date:
2012/04/25 14:49:29 $"; | |
| 7 #endif /* DEBUG */ | |
| 8 | |
| 9 #ifndef BUILTINS_H | |
| 10 #include "builtins.h" | |
| 11 #endif /* BUILTINS_H */ | |
| 12 | |
| 13 /* | |
| 14 * builtins/find.c | |
| 15 * | |
| 16 * This file implements the NSSCKMDFindObjects object for the | |
| 17 * "builtin objects" cryptoki module. | |
| 18 */ | |
| 19 | |
| 20 struct builtinsFOStr { | |
| 21 NSSArena *arena; | |
| 22 CK_ULONG n; | |
| 23 CK_ULONG i; | |
| 24 builtinsInternalObject **objs; | |
| 25 }; | |
| 26 | |
| 27 static void | |
| 28 builtins_mdFindObjects_Final | |
| 29 ( | |
| 30 NSSCKMDFindObjects *mdFindObjects, | |
| 31 NSSCKFWFindObjects *fwFindObjects, | |
| 32 NSSCKMDSession *mdSession, | |
| 33 NSSCKFWSession *fwSession, | |
| 34 NSSCKMDToken *mdToken, | |
| 35 NSSCKFWToken *fwToken, | |
| 36 NSSCKMDInstance *mdInstance, | |
| 37 NSSCKFWInstance *fwInstance | |
| 38 ) | |
| 39 { | |
| 40 struct builtinsFOStr *fo = (struct builtinsFOStr *)mdFindObjects->etc; | |
| 41 NSSArena *arena = fo->arena; | |
| 42 | |
| 43 nss_ZFreeIf(fo->objs); | |
| 44 nss_ZFreeIf(fo); | |
| 45 nss_ZFreeIf(mdFindObjects); | |
| 46 if ((NSSArena *)NULL != arena) { | |
| 47 NSSArena_Destroy(arena); | |
| 48 } | |
| 49 | |
| 50 return; | |
| 51 } | |
| 52 | |
| 53 static NSSCKMDObject * | |
| 54 builtins_mdFindObjects_Next | |
| 55 ( | |
| 56 NSSCKMDFindObjects *mdFindObjects, | |
| 57 NSSCKFWFindObjects *fwFindObjects, | |
| 58 NSSCKMDSession *mdSession, | |
| 59 NSSCKFWSession *fwSession, | |
| 60 NSSCKMDToken *mdToken, | |
| 61 NSSCKFWToken *fwToken, | |
| 62 NSSCKMDInstance *mdInstance, | |
| 63 NSSCKFWInstance *fwInstance, | |
| 64 NSSArena *arena, | |
| 65 CK_RV *pError | |
| 66 ) | |
| 67 { | |
| 68 struct builtinsFOStr *fo = (struct builtinsFOStr *)mdFindObjects->etc; | |
| 69 builtinsInternalObject *io; | |
| 70 | |
| 71 if( fo->i == fo->n ) { | |
| 72 *pError = CKR_OK; | |
| 73 return (NSSCKMDObject *)NULL; | |
| 74 } | |
| 75 | |
| 76 io = fo->objs[ fo->i ]; | |
| 77 fo->i++; | |
| 78 | |
| 79 return nss_builtins_CreateMDObject(arena, io, pError); | |
| 80 } | |
| 81 | |
| 82 static int | |
| 83 builtins_derUnwrapInt(unsigned char *src, int size, unsigned char **dest) { | |
| 84 unsigned char *start = src; | |
| 85 int len = 0; | |
| 86 | |
| 87 if (*src ++ != 2) { | |
| 88 return 0; | |
| 89 } | |
| 90 len = *src++; | |
| 91 if (len & 0x80) { | |
| 92 int count = len & 0x7f; | |
| 93 len =0; | |
| 94 | |
| 95 if (count+2 > size) { | |
| 96 return 0; | |
| 97 } | |
| 98 while (count-- > 0) { | |
| 99 len = (len << 8) | *src++; | |
| 100 } | |
| 101 } | |
| 102 if (len + (src-start) != size) { | |
| 103 return 0; | |
| 104 } | |
| 105 *dest = src; | |
| 106 return len; | |
| 107 } | |
| 108 | |
| 109 static CK_BBOOL | |
| 110 builtins_attrmatch | |
| 111 ( | |
| 112 CK_ATTRIBUTE_PTR a, | |
| 113 const NSSItem *b | |
| 114 ) | |
| 115 { | |
| 116 PRBool prb; | |
| 117 | |
| 118 if( a->ulValueLen != b->size ) { | |
| 119 /* match a decoded serial number */ | |
| 120 if ((a->type == CKA_SERIAL_NUMBER) && (a->ulValueLen < b->size)) { | |
| 121 int len; | |
| 122 unsigned char *data; | |
| 123 | |
| 124 len = builtins_derUnwrapInt(b->data,b->size,&data); | |
| 125 if ((len == a->ulValueLen) && | |
| 126 nsslibc_memequal(a->pValue, data, len, (PRStatus *)NULL)) { | |
| 127 return CK_TRUE; | |
| 128 } | |
| 129 } | |
| 130 return CK_FALSE; | |
| 131 } | |
| 132 | |
| 133 prb = nsslibc_memequal(a->pValue, b->data, b->size, (PRStatus *)NULL); | |
| 134 | |
| 135 if( PR_TRUE == prb ) { | |
| 136 return CK_TRUE; | |
| 137 } else { | |
| 138 return CK_FALSE; | |
| 139 } | |
| 140 } | |
| 141 | |
| 142 | |
| 143 static CK_BBOOL | |
| 144 builtins_match | |
| 145 ( | |
| 146 CK_ATTRIBUTE_PTR pTemplate, | |
| 147 CK_ULONG ulAttributeCount, | |
| 148 builtinsInternalObject *o | |
| 149 ) | |
| 150 { | |
| 151 CK_ULONG i; | |
| 152 | |
| 153 for( i = 0; i < ulAttributeCount; i++ ) { | |
| 154 CK_ULONG j; | |
| 155 | |
| 156 for( j = 0; j < o->n; j++ ) { | |
| 157 if( o->types[j] == pTemplate[i].type ) { | |
| 158 if( CK_FALSE == builtins_attrmatch(&pTemplate[i], &o->items[j]) ) { | |
| 159 return CK_FALSE; | |
| 160 } else { | |
| 161 break; | |
| 162 } | |
| 163 } | |
| 164 } | |
| 165 | |
| 166 if( j == o->n ) { | |
| 167 /* Loop ran to the end: no matching attribute */ | |
| 168 return CK_FALSE; | |
| 169 } | |
| 170 } | |
| 171 | |
| 172 /* Every attribute passed */ | |
| 173 return CK_TRUE; | |
| 174 } | |
| 175 | |
| 176 NSS_IMPLEMENT NSSCKMDFindObjects * | |
| 177 nss_builtins_FindObjectsInit | |
| 178 ( | |
| 179 NSSCKFWSession *fwSession, | |
| 180 CK_ATTRIBUTE_PTR pTemplate, | |
| 181 CK_ULONG ulAttributeCount, | |
| 182 CK_RV *pError | |
| 183 ) | |
| 184 { | |
| 185 /* This could be made more efficient. I'm rather rushed. */ | |
| 186 NSSArena *arena; | |
| 187 NSSCKMDFindObjects *rv = (NSSCKMDFindObjects *)NULL; | |
| 188 struct builtinsFOStr *fo = (struct builtinsFOStr *)NULL; | |
| 189 builtinsInternalObject **temp = (builtinsInternalObject **)NULL; | |
| 190 PRUint32 i; | |
| 191 | |
| 192 arena = NSSArena_Create(); | |
| 193 if( (NSSArena *)NULL == arena ) { | |
| 194 goto loser; | |
| 195 } | |
| 196 | |
| 197 rv = nss_ZNEW(arena, NSSCKMDFindObjects); | |
| 198 if( (NSSCKMDFindObjects *)NULL == rv ) { | |
| 199 *pError = CKR_HOST_MEMORY; | |
| 200 goto loser; | |
| 201 } | |
| 202 | |
| 203 fo = nss_ZNEW(arena, struct builtinsFOStr); | |
| 204 if( (struct builtinsFOStr *)NULL == fo ) { | |
| 205 *pError = CKR_HOST_MEMORY; | |
| 206 goto loser; | |
| 207 } | |
| 208 | |
| 209 fo->arena = arena; | |
| 210 /* fo->n and fo->i are already zero */ | |
| 211 | |
| 212 rv->etc = (void *)fo; | |
| 213 rv->Final = builtins_mdFindObjects_Final; | |
| 214 rv->Next = builtins_mdFindObjects_Next; | |
| 215 rv->null = (void *)NULL; | |
| 216 | |
| 217 temp = nss_ZNEWARRAY((NSSArena *)NULL, builtinsInternalObject *, | |
| 218 nss_builtins_nObjects); | |
| 219 if( (builtinsInternalObject **)NULL == temp ) { | |
| 220 *pError = CKR_HOST_MEMORY; | |
| 221 goto loser; | |
| 222 } | |
| 223 | |
| 224 for( i = 0; i < nss_builtins_nObjects; i++ ) { | |
| 225 builtinsInternalObject *o = (builtinsInternalObject *)&nss_builtins_data[i]; | |
| 226 | |
| 227 if( CK_TRUE == builtins_match(pTemplate, ulAttributeCount, o) ) { | |
| 228 temp[ fo->n ] = o; | |
| 229 fo->n++; | |
| 230 } | |
| 231 } | |
| 232 | |
| 233 fo->objs = nss_ZNEWARRAY(arena, builtinsInternalObject *, fo->n); | |
| 234 if( (builtinsInternalObject **)NULL == fo->objs ) { | |
| 235 *pError = CKR_HOST_MEMORY; | |
| 236 goto loser; | |
| 237 } | |
| 238 | |
| 239 (void)nsslibc_memcpy(fo->objs, temp, sizeof(builtinsInternalObject *) * fo->n)
; | |
| 240 nss_ZFreeIf(temp); | |
| 241 temp = (builtinsInternalObject **)NULL; | |
| 242 | |
| 243 return rv; | |
| 244 | |
| 245 loser: | |
| 246 nss_ZFreeIf(temp); | |
| 247 nss_ZFreeIf(fo); | |
| 248 nss_ZFreeIf(rv); | |
| 249 if ((NSSArena *)NULL != arena) { | |
| 250 NSSArena_Destroy(arena); | |
| 251 } | |
| 252 return (NSSCKMDFindObjects *)NULL; | |
| 253 } | |
| 254 | |
| OLD | NEW |