Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(55)

Side by Side Diff: nss/lib/ckfw/builtins/bfind.c

Issue 1843333003: Update NSPR to 4.12 and NSS to 3.23 on iOS (Closed) Base URL: https://chromium.googlesource.com/chromium/deps/nss.git@master
Patch Set: Created 4 years, 8 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch
OLDNEW
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 }
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698