diff options
Diffstat (limited to 'src/lib/libcrypto/x509v3/v3_genn.c')
-rw-r--r-- | src/lib/libcrypto/x509v3/v3_genn.c | 52 |
1 files changed, 46 insertions, 6 deletions
diff --git a/src/lib/libcrypto/x509v3/v3_genn.c b/src/lib/libcrypto/x509v3/v3_genn.c index a6b7a18b17..b0269da5b0 100644 --- a/src/lib/libcrypto/x509v3/v3_genn.c +++ b/src/lib/libcrypto/x509v3/v3_genn.c | |||
@@ -1,4 +1,4 @@ | |||
1 | /* $OpenBSD: v3_genn.c,v 1.12 2015/09/26 17:38:41 jsing Exp $ */ | 1 | /* $OpenBSD: v3_genn.c,v 1.12.14.1 2020/12/08 15:10:03 tb Exp $ */ |
2 | /* Written by Dr Stephen N Henson (steve@openssl.org) for the OpenSSL | 2 | /* Written by Dr Stephen N Henson (steve@openssl.org) for the OpenSSL |
3 | * project 1999. | 3 | * project 1999. |
4 | */ | 4 | */ |
@@ -117,16 +117,17 @@ OTHERNAME_free(OTHERNAME *a) | |||
117 | ASN1_item_free((ASN1_VALUE *)a, &OTHERNAME_it); | 117 | ASN1_item_free((ASN1_VALUE *)a, &OTHERNAME_it); |
118 | } | 118 | } |
119 | 119 | ||
120 | /* Uses explicit tagging since DIRECTORYSTRING is a CHOICE type */ | ||
120 | static const ASN1_TEMPLATE EDIPARTYNAME_seq_tt[] = { | 121 | static const ASN1_TEMPLATE EDIPARTYNAME_seq_tt[] = { |
121 | { | 122 | { |
122 | .flags = ASN1_TFLG_IMPLICIT | ASN1_TFLG_OPTIONAL, | 123 | .flags = ASN1_TFLG_EXPLICIT | ASN1_TFLG_OPTIONAL, |
123 | .tag = 0, | 124 | .tag = 0, |
124 | .offset = offsetof(EDIPARTYNAME, nameAssigner), | 125 | .offset = offsetof(EDIPARTYNAME, nameAssigner), |
125 | .field_name = "nameAssigner", | 126 | .field_name = "nameAssigner", |
126 | .item = &DIRECTORYSTRING_it, | 127 | .item = &DIRECTORYSTRING_it, |
127 | }, | 128 | }, |
128 | { | 129 | { |
129 | .flags = ASN1_TFLG_IMPLICIT | ASN1_TFLG_OPTIONAL, | 130 | .flags = ASN1_TFLG_EXPLICIT, |
130 | .tag = 1, | 131 | .tag = 1, |
131 | .offset = offsetof(EDIPARTYNAME, partyName), | 132 | .offset = offsetof(EDIPARTYNAME, partyName), |
132 | .field_name = "partyName", | 133 | .field_name = "partyName", |
@@ -324,6 +325,37 @@ GENERAL_NAME_dup(GENERAL_NAME *a) | |||
324 | return ASN1_item_dup(&GENERAL_NAME_it, a); | 325 | return ASN1_item_dup(&GENERAL_NAME_it, a); |
325 | } | 326 | } |
326 | 327 | ||
328 | static int | ||
329 | EDIPARTYNAME_cmp(const EDIPARTYNAME *a, const EDIPARTYNAME *b) | ||
330 | { | ||
331 | int res; | ||
332 | |||
333 | /* | ||
334 | * Shouldn't be possible in a valid GENERAL_NAME, but we handle it | ||
335 | * anyway. OTHERNAME_cmp treats NULL != NULL, so we do the same here. | ||
336 | */ | ||
337 | if (a == NULL || b == NULL) | ||
338 | return -1; | ||
339 | if (a->nameAssigner == NULL && b->nameAssigner != NULL) | ||
340 | return -1; | ||
341 | if (a->nameAssigner != NULL && b->nameAssigner == NULL) | ||
342 | return 1; | ||
343 | /* If we get here, both have nameAssigner set or both unset. */ | ||
344 | if (a->nameAssigner != NULL) { | ||
345 | res = ASN1_STRING_cmp(a->nameAssigner, b->nameAssigner); | ||
346 | if (res != 0) | ||
347 | return res; | ||
348 | } | ||
349 | /* | ||
350 | * partyName is required, so these should never be NULL. We treat it in | ||
351 | * the same way as the a == NULL || b == NULL case above. | ||
352 | */ | ||
353 | if (a->partyName == NULL || b->partyName == NULL) | ||
354 | return -1; | ||
355 | |||
356 | return ASN1_STRING_cmp(a->partyName, b->partyName); | ||
357 | } | ||
358 | |||
327 | /* Returns 0 if they are equal, != 0 otherwise. */ | 359 | /* Returns 0 if they are equal, != 0 otherwise. */ |
328 | int | 360 | int |
329 | GENERAL_NAME_cmp(GENERAL_NAME *a, GENERAL_NAME *b) | 361 | GENERAL_NAME_cmp(GENERAL_NAME *a, GENERAL_NAME *b) |
@@ -334,8 +366,11 @@ GENERAL_NAME_cmp(GENERAL_NAME *a, GENERAL_NAME *b) | |||
334 | return -1; | 366 | return -1; |
335 | switch (a->type) { | 367 | switch (a->type) { |
336 | case GEN_X400: | 368 | case GEN_X400: |
369 | result = ASN1_TYPE_cmp(a->d.x400Address, b->d.x400Address); | ||
370 | break; | ||
371 | |||
337 | case GEN_EDIPARTY: | 372 | case GEN_EDIPARTY: |
338 | result = ASN1_TYPE_cmp(a->d.other, b->d.other); | 373 | result = EDIPARTYNAME_cmp(a->d.ediPartyName, b->d.ediPartyName); |
339 | break; | 374 | break; |
340 | 375 | ||
341 | case GEN_OTHERNAME: | 376 | case GEN_OTHERNAME: |
@@ -384,8 +419,11 @@ GENERAL_NAME_set0_value(GENERAL_NAME *a, int type, void *value) | |||
384 | { | 419 | { |
385 | switch (type) { | 420 | switch (type) { |
386 | case GEN_X400: | 421 | case GEN_X400: |
422 | a->d.x400Address = value; | ||
423 | break; | ||
424 | |||
387 | case GEN_EDIPARTY: | 425 | case GEN_EDIPARTY: |
388 | a->d.other = value; | 426 | a->d.ediPartyName = value; |
389 | break; | 427 | break; |
390 | 428 | ||
391 | case GEN_OTHERNAME: | 429 | case GEN_OTHERNAME: |
@@ -420,8 +458,10 @@ GENERAL_NAME_get0_value(GENERAL_NAME *a, int *ptype) | |||
420 | *ptype = a->type; | 458 | *ptype = a->type; |
421 | switch (a->type) { | 459 | switch (a->type) { |
422 | case GEN_X400: | 460 | case GEN_X400: |
461 | return a->d.x400Address; | ||
462 | |||
423 | case GEN_EDIPARTY: | 463 | case GEN_EDIPARTY: |
424 | return a->d.other; | 464 | return a->d.ediPartyName; |
425 | 465 | ||
426 | case GEN_OTHERNAME: | 466 | case GEN_OTHERNAME: |
427 | return a->d.otherName; | 467 | return a->d.otherName; |