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 #include "cert.h" | 5 #include "cert.h" |
6 #include "secoid.h" | 6 #include "secoid.h" |
7 #include "secder.h" /* XXX remove this when remove the DERTemplates */ | 7 #include "secder.h" /* XXX remove this when remove the DERTemplates */ |
8 #include "secasn1.h" | 8 #include "secasn1.h" |
9 #include "secitem.h" | 9 #include "secitem.h" |
10 #include <stdarg.h> | 10 #include <stdarg.h> |
(...skipping 22 matching lines...) Expand all Loading... |
33 int count = 0; | 33 int count = 0; |
34 if (array) { | 34 if (array) { |
35 while (*array++) { | 35 while (*array++) { |
36 count++; | 36 count++; |
37 } | 37 } |
38 } | 38 } |
39 return count; | 39 return count; |
40 } | 40 } |
41 | 41 |
42 static void ** | 42 static void ** |
43 AddToArray(PRArenaPool *arena, void **array, void *element) | 43 AddToArray(PLArenaPool *arena, void **array, void *element) |
44 { | 44 { |
45 unsigned count; | 45 unsigned count; |
46 void **ap; | 46 void **ap; |
47 | 47 |
48 /* Count up number of slots already in use in the array */ | 48 /* Count up number of slots already in use in the array */ |
49 count = 0; | 49 count = 0; |
50 ap = array; | 50 ap = array; |
51 if (ap) { | 51 if (ap) { |
52 while (*ap++) { | 52 while (*ap++) { |
53 count++; | 53 count++; |
(...skipping 23 matching lines...) Expand all Loading... |
77 | 77 |
78 oid = SECOID_FindOID(&ava->type); | 78 oid = SECOID_FindOID(&ava->type); |
79 | 79 |
80 if ( oid ) { | 80 if ( oid ) { |
81 return(oid->offset); | 81 return(oid->offset); |
82 } | 82 } |
83 return (SECOidTag)-1; | 83 return (SECOidTag)-1; |
84 } | 84 } |
85 | 85 |
86 static SECStatus | 86 static SECStatus |
87 SetupAVAType(PRArenaPool *arena, SECOidTag type, SECItem *it, unsigned *maxLenp) | 87 SetupAVAType(PLArenaPool *arena, SECOidTag type, SECItem *it, unsigned *maxLenp) |
88 { | 88 { |
89 unsigned char *oid; | 89 unsigned char *oid; |
90 unsigned oidLen; | 90 unsigned oidLen; |
91 unsigned char *cp; | 91 unsigned char *cp; |
92 int maxLen; | 92 int maxLen; |
93 SECOidData *oidrec; | 93 SECOidData *oidrec; |
94 | 94 |
95 oidrec = SECOID_FindOIDByTag(type); | 95 oidrec = SECOID_FindOIDByTag(type); |
96 if (oidrec == NULL) | 96 if (oidrec == NULL) |
97 return SECFailure; | 97 return SECFailure; |
(...skipping 11 matching lines...) Expand all Loading... |
109 if (cp == NULL) { | 109 if (cp == NULL) { |
110 return SECFailure; | 110 return SECFailure; |
111 } | 111 } |
112 it->len = oidLen; | 112 it->len = oidLen; |
113 PORT_Memcpy(cp, oid, oidLen); | 113 PORT_Memcpy(cp, oid, oidLen); |
114 *maxLenp = (unsigned)maxLen; | 114 *maxLenp = (unsigned)maxLen; |
115 return SECSuccess; | 115 return SECSuccess; |
116 } | 116 } |
117 | 117 |
118 static SECStatus | 118 static SECStatus |
119 SetupAVAValue(PRArenaPool *arena, int valueType, const SECItem *in, | 119 SetupAVAValue(PLArenaPool *arena, int valueType, const SECItem *in, |
120 SECItem *out, unsigned maxLen) | 120 SECItem *out, unsigned maxLen) |
121 { | 121 { |
122 PRUint8 *value, *cp, *ucs4Val; | 122 PRUint8 *value, *cp, *ucs4Val; |
123 unsigned valueLen, valueLenLen, total; | 123 unsigned valueLen, valueLenLen, total; |
124 unsigned ucs4Len = 0, ucs4MaxLen; | 124 unsigned ucs4Len = 0, ucs4MaxLen; |
125 | 125 |
126 value = in->data; | 126 value = in->data; |
127 valueLen = in->len; | 127 valueLen = in->len; |
128 switch (valueType) { | 128 switch (valueType) { |
129 case SEC_ASN1_PRINTABLE_STRING: | 129 case SEC_ASN1_PRINTABLE_STRING: |
(...skipping 30 matching lines...) Expand all Loading... |
160 return SECFailure; | 160 return SECFailure; |
161 } | 161 } |
162 out->data = cp; | 162 out->data = cp; |
163 out->len = total; | 163 out->len = total; |
164 cp = (PRUint8 *)DER_StoreHeader(cp, valueType, valueLen); | 164 cp = (PRUint8 *)DER_StoreHeader(cp, valueType, valueLen); |
165 PORT_Memcpy(cp, value, valueLen); | 165 PORT_Memcpy(cp, value, valueLen); |
166 return SECSuccess; | 166 return SECSuccess; |
167 } | 167 } |
168 | 168 |
169 CERTAVA * | 169 CERTAVA * |
170 CERT_CreateAVAFromRaw(PRArenaPool *pool, const SECItem * OID, | 170 CERT_CreateAVAFromRaw(PLArenaPool *pool, const SECItem * OID, |
171 const SECItem * value) | 171 const SECItem * value) |
172 { | 172 { |
173 CERTAVA *ava; | 173 CERTAVA *ava; |
174 int rv; | 174 int rv; |
175 | 175 |
176 ava = PORT_ArenaZNew(pool, CERTAVA); | 176 ava = PORT_ArenaZNew(pool, CERTAVA); |
177 if (ava) { | 177 if (ava) { |
178 rv = SECITEM_CopyItem(pool, &ava->type, OID); | 178 rv = SECITEM_CopyItem(pool, &ava->type, OID); |
179 if (rv) | 179 if (rv) |
180 return NULL; | 180 return NULL; |
181 | 181 |
182 rv = SECITEM_CopyItem(pool, &ava->value, value); | 182 rv = SECITEM_CopyItem(pool, &ava->value, value); |
183 if (rv) | 183 if (rv) |
184 return NULL; | 184 return NULL; |
185 } | 185 } |
186 return ava; | 186 return ava; |
187 } | 187 } |
188 | 188 |
189 CERTAVA * | 189 CERTAVA * |
190 CERT_CreateAVAFromSECItem(PRArenaPool *arena, SECOidTag kind, int valueType, | 190 CERT_CreateAVAFromSECItem(PLArenaPool *arena, SECOidTag kind, int valueType, |
191 SECItem *value) | 191 SECItem *value) |
192 { | 192 { |
193 CERTAVA *ava; | 193 CERTAVA *ava; |
194 int rv; | 194 int rv; |
195 unsigned maxLen; | 195 unsigned maxLen; |
196 | 196 |
197 ava = (CERTAVA*) PORT_ArenaZAlloc(arena, sizeof(CERTAVA)); | 197 ava = (CERTAVA*) PORT_ArenaZAlloc(arena, sizeof(CERTAVA)); |
198 if (ava) { | 198 if (ava) { |
199 rv = SetupAVAType(arena, kind, &ava->type, &maxLen); | 199 rv = SetupAVAType(arena, kind, &ava->type, &maxLen); |
200 if (rv) { | 200 if (rv) { |
201 /* Illegal AVA type */ | 201 /* Illegal AVA type */ |
202 return NULL; | 202 return NULL; |
203 } | 203 } |
204 rv = SetupAVAValue(arena, valueType, value, &ava->value, maxLen); | 204 rv = SetupAVAValue(arena, valueType, value, &ava->value, maxLen); |
205 if (rv) { | 205 if (rv) { |
206 /* Illegal value type */ | 206 /* Illegal value type */ |
207 return NULL; | 207 return NULL; |
208 } | 208 } |
209 } | 209 } |
210 return ava; | 210 return ava; |
211 } | 211 } |
212 | 212 |
213 CERTAVA * | 213 CERTAVA * |
214 CERT_CreateAVA(PRArenaPool *arena, SECOidTag kind, int valueType, char *value) | 214 CERT_CreateAVA(PLArenaPool *arena, SECOidTag kind, int valueType, char *value) |
215 { | 215 { |
216 SECItem item = { siBuffer, NULL, 0 }; | 216 SECItem item = { siBuffer, NULL, 0 }; |
217 | 217 |
218 item.data = (PRUint8 *)value; | 218 item.data = (PRUint8 *)value; |
219 item.len = PORT_Strlen(value); | 219 item.len = PORT_Strlen(value); |
220 | 220 |
221 return CERT_CreateAVAFromSECItem(arena, kind, valueType, &item); | 221 return CERT_CreateAVAFromSECItem(arena, kind, valueType, &item); |
222 } | 222 } |
223 | 223 |
224 CERTAVA * | 224 CERTAVA * |
225 CERT_CopyAVA(PRArenaPool *arena, CERTAVA *from) | 225 CERT_CopyAVA(PLArenaPool *arena, CERTAVA *from) |
226 { | 226 { |
227 CERTAVA *ava; | 227 CERTAVA *ava; |
228 int rv; | 228 int rv; |
229 | 229 |
230 ava = (CERTAVA*) PORT_ArenaZAlloc(arena, sizeof(CERTAVA)); | 230 ava = (CERTAVA*) PORT_ArenaZAlloc(arena, sizeof(CERTAVA)); |
231 if (ava) { | 231 if (ava) { |
232 rv = SECITEM_CopyItem(arena, &ava->type, &from->type); | 232 rv = SECITEM_CopyItem(arena, &ava->type, &from->type); |
233 if (rv) goto loser; | 233 if (rv) goto loser; |
234 rv = SECITEM_CopyItem(arena, &ava->value, &from->value); | 234 rv = SECITEM_CopyItem(arena, &ava->value, &from->value); |
235 if (rv) goto loser; | 235 if (rv) goto loser; |
236 } | 236 } |
237 return ava; | 237 return ava; |
238 | 238 |
239 loser: | 239 loser: |
240 return 0; | 240 return 0; |
241 } | 241 } |
242 | 242 |
243 /************************************************************************/ | 243 /************************************************************************/ |
244 /* XXX This template needs to go away in favor of the new SEC_ASN1 version. */ | 244 /* XXX This template needs to go away in favor of the new SEC_ASN1 version. */ |
245 static const SEC_ASN1Template cert_RDNTemplate[] = { | 245 static const SEC_ASN1Template cert_RDNTemplate[] = { |
246 { SEC_ASN1_SET_OF, | 246 { SEC_ASN1_SET_OF, |
247 offsetof(CERTRDN,avas), cert_AVATemplate, sizeof(CERTRDN) } | 247 offsetof(CERTRDN,avas), cert_AVATemplate, sizeof(CERTRDN) } |
248 }; | 248 }; |
249 | 249 |
250 | 250 |
251 CERTRDN * | 251 CERTRDN * |
252 CERT_CreateRDN(PRArenaPool *arena, CERTAVA *ava0, ...) | 252 CERT_CreateRDN(PLArenaPool *arena, CERTAVA *ava0, ...) |
253 { | 253 { |
254 CERTAVA *ava; | 254 CERTAVA *ava; |
255 CERTRDN *rdn; | 255 CERTRDN *rdn; |
256 va_list ap; | 256 va_list ap; |
257 unsigned count; | 257 unsigned count; |
258 CERTAVA **avap; | 258 CERTAVA **avap; |
259 | 259 |
260 rdn = (CERTRDN*) PORT_ArenaAlloc(arena, sizeof(CERTRDN)); | 260 rdn = (CERTRDN*) PORT_ArenaAlloc(arena, sizeof(CERTRDN)); |
261 if (rdn) { | 261 if (rdn) { |
262 /* Count number of avas going into the rdn */ | 262 /* Count number of avas going into the rdn */ |
(...skipping 20 matching lines...) Expand all Loading... |
283 *avap++ = ava; | 283 *avap++ = ava; |
284 } | 284 } |
285 va_end(ap); | 285 va_end(ap); |
286 } | 286 } |
287 *avap++ = 0; | 287 *avap++ = 0; |
288 } | 288 } |
289 return rdn; | 289 return rdn; |
290 } | 290 } |
291 | 291 |
292 SECStatus | 292 SECStatus |
293 CERT_AddAVA(PRArenaPool *arena, CERTRDN *rdn, CERTAVA *ava) | 293 CERT_AddAVA(PLArenaPool *arena, CERTRDN *rdn, CERTAVA *ava) |
294 { | 294 { |
295 rdn->avas = (CERTAVA**) AddToArray(arena, (void**) rdn->avas, ava); | 295 rdn->avas = (CERTAVA**) AddToArray(arena, (void**) rdn->avas, ava); |
296 return rdn->avas ? SECSuccess : SECFailure; | 296 return rdn->avas ? SECSuccess : SECFailure; |
297 } | 297 } |
298 | 298 |
299 SECStatus | 299 SECStatus |
300 CERT_CopyRDN(PRArenaPool *arena, CERTRDN *to, CERTRDN *from) | 300 CERT_CopyRDN(PLArenaPool *arena, CERTRDN *to, CERTRDN *from) |
301 { | 301 { |
302 CERTAVA **avas, *fava, *tava; | 302 CERTAVA **avas, *fava, *tava; |
303 SECStatus rv = SECSuccess; | 303 SECStatus rv = SECSuccess; |
304 | 304 |
305 /* Copy each ava from from */ | 305 /* Copy each ava from from */ |
306 avas = from->avas; | 306 avas = from->avas; |
307 if (avas) { | 307 if (avas) { |
308 if (avas[0] == NULL) { | 308 if (avas[0] == NULL) { |
309 rv = CERT_AddAVA(arena, to, NULL); | 309 rv = CERT_AddAVA(arena, to, NULL); |
310 return rv; | 310 return rv; |
(...skipping 22 matching lines...) Expand all Loading... |
333 SEC_ASN1_CHOOSER_IMPLEMENT(CERT_NameTemplate) | 333 SEC_ASN1_CHOOSER_IMPLEMENT(CERT_NameTemplate) |
334 | 334 |
335 CERTName * | 335 CERTName * |
336 CERT_CreateName(CERTRDN *rdn0, ...) | 336 CERT_CreateName(CERTRDN *rdn0, ...) |
337 { | 337 { |
338 CERTRDN *rdn; | 338 CERTRDN *rdn; |
339 CERTName *name; | 339 CERTName *name; |
340 va_list ap; | 340 va_list ap; |
341 unsigned count; | 341 unsigned count; |
342 CERTRDN **rdnp; | 342 CERTRDN **rdnp; |
343 PRArenaPool *arena; | 343 PLArenaPool *arena; |
344 | 344 |
345 arena = PORT_NewArena(DER_DEFAULT_CHUNKSIZE); | 345 arena = PORT_NewArena(DER_DEFAULT_CHUNKSIZE); |
346 if ( !arena ) { | 346 if ( !arena ) { |
347 return(0); | 347 return(0); |
348 } | 348 } |
349 | 349 |
350 name = (CERTName*) PORT_ArenaAlloc(arena, sizeof(CERTName)); | 350 name = (CERTName*) PORT_ArenaAlloc(arena, sizeof(CERTName)); |
351 if (name) { | 351 if (name) { |
352 name->arena = arena; | 352 name->arena = arena; |
353 | 353 |
(...skipping 34 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
388 loser: | 388 loser: |
389 PORT_FreeArena(arena, PR_FALSE); | 389 PORT_FreeArena(arena, PR_FALSE); |
390 return(0); | 390 return(0); |
391 } | 391 } |
392 | 392 |
393 void | 393 void |
394 CERT_DestroyName(CERTName *name) | 394 CERT_DestroyName(CERTName *name) |
395 { | 395 { |
396 if (name) | 396 if (name) |
397 { | 397 { |
398 PRArenaPool *arena = name->arena; | 398 PLArenaPool *arena = name->arena; |
399 name->rdns = NULL; | 399 name->rdns = NULL; |
400 name->arena = NULL; | 400 name->arena = NULL; |
401 if (arena) PORT_FreeArena(arena, PR_FALSE); | 401 if (arena) PORT_FreeArena(arena, PR_FALSE); |
402 } | 402 } |
403 } | 403 } |
404 | 404 |
405 SECStatus | 405 SECStatus |
406 CERT_AddRDN(CERTName *name, CERTRDN *rdn) | 406 CERT_AddRDN(CERTName *name, CERTRDN *rdn) |
407 { | 407 { |
408 name->rdns = (CERTRDN**) AddToArray(name->arena, (void**) name->rdns, rdn); | 408 name->rdns = (CERTRDN**) AddToArray(name->arena, (void**) name->rdns, rdn); |
409 return name->rdns ? SECSuccess : SECFailure; | 409 return name->rdns ? SECSuccess : SECFailure; |
410 } | 410 } |
411 | 411 |
412 SECStatus | 412 SECStatus |
413 CERT_CopyName(PRArenaPool *arena, CERTName *to, const CERTName *from) | 413 CERT_CopyName(PLArenaPool *arena, CERTName *to, const CERTName *from) |
414 { | 414 { |
415 CERTRDN **rdns, *frdn, *trdn; | 415 CERTRDN **rdns, *frdn, *trdn; |
416 SECStatus rv = SECSuccess; | 416 SECStatus rv = SECSuccess; |
417 | 417 |
418 if (!to || !from) { | 418 if (!to || !from) { |
419 PORT_SetError(SEC_ERROR_INVALID_ARGS); | 419 PORT_SetError(SEC_ERROR_INVALID_ARGS); |
420 return SECFailure; | 420 return SECFailure; |
421 } | 421 } |
422 | 422 |
423 CERT_DestroyName(to); | 423 CERT_DestroyName(to); |
(...skipping 276 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
700 } | 700 } |
701 | 701 |
702 avaValue.data = utf8Val; | 702 avaValue.data = utf8Val; |
703 avaValue.len = utf8ValLen; | 703 avaValue.len = utf8ValLen; |
704 } | 704 } |
705 | 705 |
706 retItem = SECITEM_DupItem(&avaValue); | 706 retItem = SECITEM_DupItem(&avaValue); |
707 PORT_FreeArena(newarena, PR_FALSE); | 707 PORT_FreeArena(newarena, PR_FALSE); |
708 return retItem; | 708 return retItem; |
709 } | 709 } |
OLD | NEW |