summaryrefslogtreecommitdiff
path: root/src/lib/libcrypto/x509v3/v3_genn.c
diff options
context:
space:
mode:
Diffstat (limited to 'src/lib/libcrypto/x509v3/v3_genn.c')
-rw-r--r--src/lib/libcrypto/x509v3/v3_genn.c52
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 */
120static const ASN1_TEMPLATE EDIPARTYNAME_seq_tt[] = { 121static 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
328static int
329EDIPARTYNAME_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. */
328int 360int
329GENERAL_NAME_cmp(GENERAL_NAME *a, GENERAL_NAME *b) 361GENERAL_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;