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 |