2 * Copyright 1999-2016 The OpenSSL Project Authors. All Rights Reserved.
4 * Licensed under the Apache License 2.0 (the "License"). You may not use
5 * this file except in compliance with the License. You can obtain a copy
6 * in the file LICENSE in the source distribution or at
7 * https://www.openssl.org/source/license.html
11 #include "internal/cryptlib.h"
12 #include <openssl/asn1t.h>
13 #include <openssl/conf.h>
14 #include <openssl/x509v3.h>
16 ASN1_SEQUENCE(OTHERNAME
) = {
17 ASN1_SIMPLE(OTHERNAME
, type_id
, ASN1_OBJECT
),
18 /* Maybe have a true ANY DEFINED BY later */
19 ASN1_EXP(OTHERNAME
, value
, ASN1_ANY
, 0)
20 } ASN1_SEQUENCE_END(OTHERNAME
)
22 IMPLEMENT_ASN1_FUNCTIONS(OTHERNAME
)
24 ASN1_SEQUENCE(EDIPARTYNAME
) = {
25 ASN1_IMP_OPT(EDIPARTYNAME
, nameAssigner
, DIRECTORYSTRING
, 0),
26 ASN1_IMP_OPT(EDIPARTYNAME
, partyName
, DIRECTORYSTRING
, 1)
27 } ASN1_SEQUENCE_END(EDIPARTYNAME
)
29 IMPLEMENT_ASN1_FUNCTIONS(EDIPARTYNAME
)
31 ASN1_CHOICE(GENERAL_NAME
) = {
32 ASN1_IMP(GENERAL_NAME
, d
.otherName
, OTHERNAME
, GEN_OTHERNAME
),
33 ASN1_IMP(GENERAL_NAME
, d
.rfc822Name
, ASN1_IA5STRING
, GEN_EMAIL
),
34 ASN1_IMP(GENERAL_NAME
, d
.dNSName
, ASN1_IA5STRING
, GEN_DNS
),
35 /* Don't decode this */
36 ASN1_IMP(GENERAL_NAME
, d
.x400Address
, ASN1_SEQUENCE
, GEN_X400
),
37 /* X509_NAME is a CHOICE type so use EXPLICIT */
38 ASN1_EXP(GENERAL_NAME
, d
.directoryName
, X509_NAME
, GEN_DIRNAME
),
39 ASN1_IMP(GENERAL_NAME
, d
.ediPartyName
, EDIPARTYNAME
, GEN_EDIPARTY
),
40 ASN1_IMP(GENERAL_NAME
, d
.uniformResourceIdentifier
, ASN1_IA5STRING
, GEN_URI
),
41 ASN1_IMP(GENERAL_NAME
, d
.iPAddress
, ASN1_OCTET_STRING
, GEN_IPADD
),
42 ASN1_IMP(GENERAL_NAME
, d
.registeredID
, ASN1_OBJECT
, GEN_RID
)
43 } ASN1_CHOICE_END(GENERAL_NAME
)
45 IMPLEMENT_ASN1_FUNCTIONS(GENERAL_NAME
)
47 ASN1_ITEM_TEMPLATE(GENERAL_NAMES
) =
48 ASN1_EX_TEMPLATE_TYPE(ASN1_TFLG_SEQUENCE_OF
, 0, GeneralNames
, GENERAL_NAME
)
49 ASN1_ITEM_TEMPLATE_END(GENERAL_NAMES
)
51 IMPLEMENT_ASN1_FUNCTIONS(GENERAL_NAMES
)
53 GENERAL_NAME
*GENERAL_NAME_dup(const GENERAL_NAME
*a
)
55 return (GENERAL_NAME
*)ASN1_dup((i2d_of_void
*)i2d_GENERAL_NAME
,
56 (d2i_of_void
*)d2i_GENERAL_NAME
,
60 /* Returns 0 if they are equal, != 0 otherwise. */
61 int GENERAL_NAME_cmp(GENERAL_NAME
*a
, GENERAL_NAME
*b
)
65 if (!a
|| !b
|| a
->type
!= b
->type
)
70 result
= ASN1_TYPE_cmp(a
->d
.other
, b
->d
.other
);
74 result
= OTHERNAME_cmp(a
->d
.otherName
, b
->d
.otherName
);
80 result
= ASN1_STRING_cmp(a
->d
.ia5
, b
->d
.ia5
);
84 result
= X509_NAME_cmp(a
->d
.dirn
, b
->d
.dirn
);
88 result
= ASN1_OCTET_STRING_cmp(a
->d
.ip
, b
->d
.ip
);
92 result
= OBJ_cmp(a
->d
.rid
, b
->d
.rid
);
98 /* Returns 0 if they are equal, != 0 otherwise. */
99 int OTHERNAME_cmp(OTHERNAME
*a
, OTHERNAME
*b
)
105 /* Check their type first. */
106 if ((result
= OBJ_cmp(a
->type_id
, b
->type_id
)) != 0)
108 /* Check the value. */
109 result
= ASN1_TYPE_cmp(a
->value
, b
->value
);
113 void GENERAL_NAME_set0_value(GENERAL_NAME
*a
, int type
, void *value
)
122 a
->d
.otherName
= value
;
146 void *GENERAL_NAME_get0_value(const GENERAL_NAME
*a
, int *ptype
)
156 return a
->d
.otherName
;
177 int GENERAL_NAME_set0_othername(GENERAL_NAME
*gen
,
178 ASN1_OBJECT
*oid
, ASN1_TYPE
*value
)
181 oth
= OTHERNAME_new();
184 ASN1_TYPE_free(oth
->value
);
187 GENERAL_NAME_set0_value(gen
, GEN_OTHERNAME
, oth
);
191 int GENERAL_NAME_get0_otherName(const GENERAL_NAME
*gen
,
192 ASN1_OBJECT
**poid
, ASN1_TYPE
**pvalue
)
194 if (gen
->type
!= GEN_OTHERNAME
)
197 *poid
= gen
->d
.otherName
->type_id
;
199 *pvalue
= gen
->d
.otherName
->value
;