diff options
author | beck <> | 2002-05-15 02:29:21 +0000 |
---|---|---|
committer | beck <> | 2002-05-15 02:29:21 +0000 |
commit | b64270d1e45fe7f3241e4c9b6ce60d5ac89bc2e9 (patch) | |
tree | fa27cf82a1250b64ed3bf5f4a18c7354d470bbcc /src/lib/libcrypto/x509v3/v3_alt.c | |
parent | e471e1ea98d673597b182ea85f29e30c97cd08b5 (diff) | |
download | openbsd-b64270d1e45fe7f3241e4c9b6ce60d5ac89bc2e9.tar.gz openbsd-b64270d1e45fe7f3241e4c9b6ce60d5ac89bc2e9.tar.bz2 openbsd-b64270d1e45fe7f3241e4c9b6ce60d5ac89bc2e9.zip |
OpenSSL 0.9.7 stable 2002 05 08 merge
Diffstat (limited to 'src/lib/libcrypto/x509v3/v3_alt.c')
-rw-r--r-- | src/lib/libcrypto/x509v3/v3_alt.c | 112 |
1 files changed, 84 insertions, 28 deletions
diff --git a/src/lib/libcrypto/x509v3/v3_alt.c b/src/lib/libcrypto/x509v3/v3_alt.c index 94bebcd448..0e9e7dcb4f 100644 --- a/src/lib/libcrypto/x509v3/v3_alt.c +++ b/src/lib/libcrypto/x509v3/v3_alt.c | |||
@@ -61,33 +61,28 @@ | |||
61 | #include <openssl/conf.h> | 61 | #include <openssl/conf.h> |
62 | #include <openssl/x509v3.h> | 62 | #include <openssl/x509v3.h> |
63 | 63 | ||
64 | static STACK_OF(GENERAL_NAME) *v2i_subject_alt(X509V3_EXT_METHOD *method, X509V3_CTX *ctx, STACK_OF(CONF_VALUE) *nval); | 64 | static GENERAL_NAMES *v2i_subject_alt(X509V3_EXT_METHOD *method, X509V3_CTX *ctx, STACK_OF(CONF_VALUE) *nval); |
65 | static STACK_OF(GENERAL_NAME) *v2i_issuer_alt(X509V3_EXT_METHOD *method, X509V3_CTX *ctx, STACK_OF(CONF_VALUE) *nval); | 65 | static GENERAL_NAMES *v2i_issuer_alt(X509V3_EXT_METHOD *method, X509V3_CTX *ctx, STACK_OF(CONF_VALUE) *nval); |
66 | static int copy_email(X509V3_CTX *ctx, STACK_OF(GENERAL_NAME) *gens); | 66 | static int copy_email(X509V3_CTX *ctx, GENERAL_NAMES *gens, int move_p); |
67 | static int copy_issuer(X509V3_CTX *ctx, STACK_OF(GENERAL_NAME) *gens); | 67 | static int copy_issuer(X509V3_CTX *ctx, GENERAL_NAMES *gens); |
68 | X509V3_EXT_METHOD v3_alt[] = { | 68 | X509V3_EXT_METHOD v3_alt[] = { |
69 | { NID_subject_alt_name, 0, | 69 | { NID_subject_alt_name, 0, ASN1_ITEM_ref(GENERAL_NAMES), |
70 | (X509V3_EXT_NEW)GENERAL_NAMES_new, | 70 | 0,0,0,0, |
71 | (X509V3_EXT_FREE)GENERAL_NAMES_free, | 71 | 0,0, |
72 | (X509V3_EXT_D2I)d2i_GENERAL_NAMES, | ||
73 | (X509V3_EXT_I2D)i2d_GENERAL_NAMES, | ||
74 | NULL, NULL, | ||
75 | (X509V3_EXT_I2V)i2v_GENERAL_NAMES, | 72 | (X509V3_EXT_I2V)i2v_GENERAL_NAMES, |
76 | (X509V3_EXT_V2I)v2i_subject_alt, | 73 | (X509V3_EXT_V2I)v2i_subject_alt, |
77 | NULL, NULL, NULL}, | 74 | NULL, NULL, NULL}, |
78 | { NID_issuer_alt_name, 0, | 75 | |
79 | (X509V3_EXT_NEW)GENERAL_NAMES_new, | 76 | { NID_issuer_alt_name, 0, ASN1_ITEM_ref(GENERAL_NAMES), |
80 | (X509V3_EXT_FREE)GENERAL_NAMES_free, | 77 | 0,0,0,0, |
81 | (X509V3_EXT_D2I)d2i_GENERAL_NAMES, | 78 | 0,0, |
82 | (X509V3_EXT_I2D)i2d_GENERAL_NAMES, | ||
83 | NULL, NULL, | ||
84 | (X509V3_EXT_I2V)i2v_GENERAL_NAMES, | 79 | (X509V3_EXT_I2V)i2v_GENERAL_NAMES, |
85 | (X509V3_EXT_V2I)v2i_issuer_alt, | 80 | (X509V3_EXT_V2I)v2i_issuer_alt, |
86 | NULL, NULL, NULL}, | 81 | NULL, NULL, NULL}, |
87 | }; | 82 | }; |
88 | 83 | ||
89 | STACK_OF(CONF_VALUE) *i2v_GENERAL_NAMES(X509V3_EXT_METHOD *method, | 84 | STACK_OF(CONF_VALUE) *i2v_GENERAL_NAMES(X509V3_EXT_METHOD *method, |
90 | STACK_OF(GENERAL_NAME) *gens, STACK_OF(CONF_VALUE) *ret) | 85 | GENERAL_NAMES *gens, STACK_OF(CONF_VALUE) *ret) |
91 | { | 86 | { |
92 | int i; | 87 | int i; |
93 | GENERAL_NAME *gen; | 88 | GENERAL_NAME *gen; |
@@ -102,8 +97,8 @@ STACK_OF(CONF_VALUE) *i2v_GENERAL_NAMES(X509V3_EXT_METHOD *method, | |||
102 | STACK_OF(CONF_VALUE) *i2v_GENERAL_NAME(X509V3_EXT_METHOD *method, | 97 | STACK_OF(CONF_VALUE) *i2v_GENERAL_NAME(X509V3_EXT_METHOD *method, |
103 | GENERAL_NAME *gen, STACK_OF(CONF_VALUE) *ret) | 98 | GENERAL_NAME *gen, STACK_OF(CONF_VALUE) *ret) |
104 | { | 99 | { |
105 | char oline[256]; | ||
106 | unsigned char *p; | 100 | unsigned char *p; |
101 | char oline[256]; | ||
107 | switch (gen->type) | 102 | switch (gen->type) |
108 | { | 103 | { |
109 | case GEN_OTHERNAME: | 104 | case GEN_OTHERNAME: |
@@ -154,10 +149,63 @@ STACK_OF(CONF_VALUE) *i2v_GENERAL_NAME(X509V3_EXT_METHOD *method, | |||
154 | return ret; | 149 | return ret; |
155 | } | 150 | } |
156 | 151 | ||
157 | static STACK_OF(GENERAL_NAME) *v2i_issuer_alt(X509V3_EXT_METHOD *method, | 152 | int GENERAL_NAME_print(BIO *out, GENERAL_NAME *gen) |
153 | { | ||
154 | unsigned char *p; | ||
155 | switch (gen->type) | ||
156 | { | ||
157 | case GEN_OTHERNAME: | ||
158 | BIO_printf(out, "othername:<unsupported>"); | ||
159 | break; | ||
160 | |||
161 | case GEN_X400: | ||
162 | BIO_printf(out, "X400Name:<unsupported>"); | ||
163 | break; | ||
164 | |||
165 | case GEN_EDIPARTY: | ||
166 | /* Maybe fix this: it is supported now */ | ||
167 | BIO_printf(out, "EdiPartyName:<unsupported>"); | ||
168 | break; | ||
169 | |||
170 | case GEN_EMAIL: | ||
171 | BIO_printf(out, "email:%s",gen->d.ia5->data); | ||
172 | break; | ||
173 | |||
174 | case GEN_DNS: | ||
175 | BIO_printf(out, "DNS:%s",gen->d.ia5->data); | ||
176 | break; | ||
177 | |||
178 | case GEN_URI: | ||
179 | BIO_printf(out, "URI:%s",gen->d.ia5->data); | ||
180 | break; | ||
181 | |||
182 | case GEN_DIRNAME: | ||
183 | BIO_printf(out, "DirName: "); | ||
184 | X509_NAME_print_ex(out, gen->d.dirn, 0, XN_FLAG_ONELINE); | ||
185 | break; | ||
186 | |||
187 | case GEN_IPADD: | ||
188 | p = gen->d.ip->data; | ||
189 | /* BUG: doesn't support IPV6 */ | ||
190 | if(gen->d.ip->length != 4) { | ||
191 | BIO_printf(out,"IP Address:<invalid>"); | ||
192 | break; | ||
193 | } | ||
194 | BIO_printf(out, "IP Address:%d.%d.%d.%d", p[0], p[1], p[2], p[3]); | ||
195 | break; | ||
196 | |||
197 | case GEN_RID: | ||
198 | BIO_printf(out, "Registered ID"); | ||
199 | i2a_ASN1_OBJECT(out, gen->d.rid); | ||
200 | break; | ||
201 | } | ||
202 | return 1; | ||
203 | } | ||
204 | |||
205 | static GENERAL_NAMES *v2i_issuer_alt(X509V3_EXT_METHOD *method, | ||
158 | X509V3_CTX *ctx, STACK_OF(CONF_VALUE) *nval) | 206 | X509V3_CTX *ctx, STACK_OF(CONF_VALUE) *nval) |
159 | { | 207 | { |
160 | STACK_OF(GENERAL_NAME) *gens = NULL; | 208 | GENERAL_NAMES *gens = NULL; |
161 | CONF_VALUE *cnf; | 209 | CONF_VALUE *cnf; |
162 | int i; | 210 | int i; |
163 | if(!(gens = sk_GENERAL_NAME_new_null())) { | 211 | if(!(gens = sk_GENERAL_NAME_new_null())) { |
@@ -184,9 +232,9 @@ static STACK_OF(GENERAL_NAME) *v2i_issuer_alt(X509V3_EXT_METHOD *method, | |||
184 | 232 | ||
185 | /* Append subject altname of issuer to issuer alt name of subject */ | 233 | /* Append subject altname of issuer to issuer alt name of subject */ |
186 | 234 | ||
187 | static int copy_issuer(X509V3_CTX *ctx, STACK_OF(GENERAL_NAME) *gens) | 235 | static int copy_issuer(X509V3_CTX *ctx, GENERAL_NAMES *gens) |
188 | { | 236 | { |
189 | STACK_OF(GENERAL_NAME) *ialt; | 237 | GENERAL_NAMES *ialt; |
190 | GENERAL_NAME *gen; | 238 | GENERAL_NAME *gen; |
191 | X509_EXTENSION *ext; | 239 | X509_EXTENSION *ext; |
192 | int i; | 240 | int i; |
@@ -219,10 +267,10 @@ static int copy_issuer(X509V3_CTX *ctx, STACK_OF(GENERAL_NAME) *gens) | |||
219 | 267 | ||
220 | } | 268 | } |
221 | 269 | ||
222 | static STACK_OF(GENERAL_NAME) *v2i_subject_alt(X509V3_EXT_METHOD *method, | 270 | static GENERAL_NAMES *v2i_subject_alt(X509V3_EXT_METHOD *method, |
223 | X509V3_CTX *ctx, STACK_OF(CONF_VALUE) *nval) | 271 | X509V3_CTX *ctx, STACK_OF(CONF_VALUE) *nval) |
224 | { | 272 | { |
225 | STACK_OF(GENERAL_NAME) *gens = NULL; | 273 | GENERAL_NAMES *gens = NULL; |
226 | CONF_VALUE *cnf; | 274 | CONF_VALUE *cnf; |
227 | int i; | 275 | int i; |
228 | if(!(gens = sk_GENERAL_NAME_new_null())) { | 276 | if(!(gens = sk_GENERAL_NAME_new_null())) { |
@@ -233,7 +281,10 @@ static STACK_OF(GENERAL_NAME) *v2i_subject_alt(X509V3_EXT_METHOD *method, | |||
233 | cnf = sk_CONF_VALUE_value(nval, i); | 281 | cnf = sk_CONF_VALUE_value(nval, i); |
234 | if(!name_cmp(cnf->name, "email") && cnf->value && | 282 | if(!name_cmp(cnf->name, "email") && cnf->value && |
235 | !strcmp(cnf->value, "copy")) { | 283 | !strcmp(cnf->value, "copy")) { |
236 | if(!copy_email(ctx, gens)) goto err; | 284 | if(!copy_email(ctx, gens, 0)) goto err; |
285 | } else if(!name_cmp(cnf->name, "email") && cnf->value && | ||
286 | !strcmp(cnf->value, "move")) { | ||
287 | if(!copy_email(ctx, gens, 1)) goto err; | ||
237 | } else { | 288 | } else { |
238 | GENERAL_NAME *gen; | 289 | GENERAL_NAME *gen; |
239 | if(!(gen = v2i_GENERAL_NAME(method, ctx, cnf))) | 290 | if(!(gen = v2i_GENERAL_NAME(method, ctx, cnf))) |
@@ -251,7 +302,7 @@ static STACK_OF(GENERAL_NAME) *v2i_subject_alt(X509V3_EXT_METHOD *method, | |||
251 | * GENERAL_NAMES | 302 | * GENERAL_NAMES |
252 | */ | 303 | */ |
253 | 304 | ||
254 | static int copy_email(X509V3_CTX *ctx, STACK_OF(GENERAL_NAME) *gens) | 305 | static int copy_email(X509V3_CTX *ctx, GENERAL_NAMES *gens, int move_p) |
255 | { | 306 | { |
256 | X509_NAME *nm; | 307 | X509_NAME *nm; |
257 | ASN1_IA5STRING *email = NULL; | 308 | ASN1_IA5STRING *email = NULL; |
@@ -273,6 +324,11 @@ static int copy_email(X509V3_CTX *ctx, STACK_OF(GENERAL_NAME) *gens) | |||
273 | NID_pkcs9_emailAddress, i)) >= 0) { | 324 | NID_pkcs9_emailAddress, i)) >= 0) { |
274 | ne = X509_NAME_get_entry(nm, i); | 325 | ne = X509_NAME_get_entry(nm, i); |
275 | email = M_ASN1_IA5STRING_dup(X509_NAME_ENTRY_get_data(ne)); | 326 | email = M_ASN1_IA5STRING_dup(X509_NAME_ENTRY_get_data(ne)); |
327 | if (move_p) | ||
328 | { | ||
329 | X509_NAME_delete_entry(nm, i); | ||
330 | i--; | ||
331 | } | ||
276 | if(!email || !(gen = GENERAL_NAME_new())) { | 332 | if(!email || !(gen = GENERAL_NAME_new())) { |
277 | X509V3err(X509V3_F_COPY_EMAIL,ERR_R_MALLOC_FAILURE); | 333 | X509V3err(X509V3_F_COPY_EMAIL,ERR_R_MALLOC_FAILURE); |
278 | goto err; | 334 | goto err; |
@@ -297,11 +353,11 @@ static int copy_email(X509V3_CTX *ctx, STACK_OF(GENERAL_NAME) *gens) | |||
297 | 353 | ||
298 | } | 354 | } |
299 | 355 | ||
300 | STACK_OF(GENERAL_NAME) *v2i_GENERAL_NAMES(X509V3_EXT_METHOD *method, | 356 | GENERAL_NAMES *v2i_GENERAL_NAMES(X509V3_EXT_METHOD *method, |
301 | X509V3_CTX *ctx, STACK_OF(CONF_VALUE) *nval) | 357 | X509V3_CTX *ctx, STACK_OF(CONF_VALUE) *nval) |
302 | { | 358 | { |
303 | GENERAL_NAME *gen; | 359 | GENERAL_NAME *gen; |
304 | STACK_OF(GENERAL_NAME) *gens = NULL; | 360 | GENERAL_NAMES *gens = NULL; |
305 | CONF_VALUE *cnf; | 361 | CONF_VALUE *cnf; |
306 | int i; | 362 | int i; |
307 | if(!(gens = sk_GENERAL_NAME_new_null())) { | 363 | if(!(gens = sk_GENERAL_NAME_new_null())) { |