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