diff options
Diffstat (limited to 'src/lib/libcrypto/x509v3/v3_genn.c')
-rw-r--r-- | src/lib/libcrypto/x509v3/v3_genn.c | 70 |
1 files changed, 62 insertions, 8 deletions
diff --git a/src/lib/libcrypto/x509v3/v3_genn.c b/src/lib/libcrypto/x509v3/v3_genn.c index af716232f8..894afa7e03 100644 --- a/src/lib/libcrypto/x509v3/v3_genn.c +++ b/src/lib/libcrypto/x509v3/v3_genn.c | |||
@@ -88,12 +88,15 @@ int i2d_GENERAL_NAME(GENERAL_NAME *a, unsigned char **pp) | |||
88 | 88 | ||
89 | switch(a->type) { | 89 | switch(a->type) { |
90 | 90 | ||
91 | case GEN_OTHERNAME: | ||
92 | case GEN_X400: | 91 | case GEN_X400: |
93 | case GEN_EDIPARTY: | 92 | case GEN_EDIPARTY: |
94 | ret = i2d_ASN1_TYPE(a->d.other, pp); | 93 | ret = i2d_ASN1_TYPE(a->d.other, pp); |
95 | break; | 94 | break; |
96 | 95 | ||
96 | case GEN_OTHERNAME: | ||
97 | ret = i2d_OTHERNAME(a->d.otherName, pp); | ||
98 | break; | ||
99 | |||
97 | case GEN_EMAIL: | 100 | case GEN_EMAIL: |
98 | case GEN_DNS: | 101 | case GEN_DNS: |
99 | case GEN_URI: | 102 | case GEN_URI: |
@@ -137,12 +140,15 @@ GENERAL_NAME *d2i_GENERAL_NAME(GENERAL_NAME **a, unsigned char **pp, | |||
137 | 140 | ||
138 | switch(ret->type) { | 141 | switch(ret->type) { |
139 | /* Just put these in a "blob" for now */ | 142 | /* Just put these in a "blob" for now */ |
140 | case GEN_OTHERNAME: | ||
141 | case GEN_X400: | 143 | case GEN_X400: |
142 | case GEN_EDIPARTY: | 144 | case GEN_EDIPARTY: |
143 | M_ASN1_D2I_get_imp(ret->d.other, d2i_ASN1_TYPE,V_ASN1_SEQUENCE); | 145 | M_ASN1_D2I_get_imp(ret->d.other, d2i_ASN1_TYPE,V_ASN1_SEQUENCE); |
144 | break; | 146 | break; |
145 | 147 | ||
148 | case GEN_OTHERNAME: | ||
149 | M_ASN1_D2I_get_imp(ret->d.otherName, d2i_OTHERNAME,V_ASN1_SEQUENCE); | ||
150 | break; | ||
151 | |||
146 | case GEN_EMAIL: | 152 | case GEN_EMAIL: |
147 | case GEN_DNS: | 153 | case GEN_DNS: |
148 | case GEN_URI: | 154 | case GEN_URI: |
@@ -176,17 +182,20 @@ void GENERAL_NAME_free(GENERAL_NAME *a) | |||
176 | { | 182 | { |
177 | if (a == NULL) return; | 183 | if (a == NULL) return; |
178 | switch(a->type) { | 184 | switch(a->type) { |
179 | case GEN_OTHERNAME: | ||
180 | case GEN_X400: | 185 | case GEN_X400: |
181 | case GEN_EDIPARTY: | 186 | case GEN_EDIPARTY: |
182 | ASN1_TYPE_free(a->d.other); | 187 | ASN1_TYPE_free(a->d.other); |
183 | break; | 188 | break; |
184 | 189 | ||
190 | case GEN_OTHERNAME: | ||
191 | OTHERNAME_free(a->d.otherName); | ||
192 | break; | ||
193 | |||
185 | case GEN_EMAIL: | 194 | case GEN_EMAIL: |
186 | case GEN_DNS: | 195 | case GEN_DNS: |
187 | case GEN_URI: | 196 | case GEN_URI: |
188 | 197 | ||
189 | ASN1_IA5STRING_free(a->d.ia5); | 198 | M_ASN1_IA5STRING_free(a->d.ia5); |
190 | break; | 199 | break; |
191 | 200 | ||
192 | case GEN_DIRNAME: | 201 | case GEN_DIRNAME: |
@@ -194,7 +203,7 @@ void GENERAL_NAME_free(GENERAL_NAME *a) | |||
194 | break; | 203 | break; |
195 | 204 | ||
196 | case GEN_IPADD: | 205 | case GEN_IPADD: |
197 | ASN1_OCTET_STRING_free(a->d.ip); | 206 | M_ASN1_OCTET_STRING_free(a->d.ip); |
198 | break; | 207 | break; |
199 | 208 | ||
200 | case GEN_RID: | 209 | case GEN_RID: |
@@ -202,11 +211,11 @@ void GENERAL_NAME_free(GENERAL_NAME *a) | |||
202 | break; | 211 | break; |
203 | 212 | ||
204 | } | 213 | } |
205 | Free ((char *)a); | 214 | Free (a); |
206 | } | 215 | } |
207 | 216 | ||
208 | /* Now the GeneralNames versions: a SEQUENCE OF GeneralName These are needed as | 217 | /* Now the GeneralNames versions: a SEQUENCE OF GeneralName. These are needed as |
209 | * an explicit functions. | 218 | * explicit functions. |
210 | */ | 219 | */ |
211 | 220 | ||
212 | STACK_OF(GENERAL_NAME) *GENERAL_NAMES_new() | 221 | STACK_OF(GENERAL_NAME) *GENERAL_NAMES_new() |
@@ -235,3 +244,48 @@ return i2d_ASN1_SET_OF_GENERAL_NAME(a, pp, i2d_GENERAL_NAME, V_ASN1_SEQUENCE, | |||
235 | IMPLEMENT_STACK_OF(GENERAL_NAME) | 244 | IMPLEMENT_STACK_OF(GENERAL_NAME) |
236 | IMPLEMENT_ASN1_SET_OF(GENERAL_NAME) | 245 | IMPLEMENT_ASN1_SET_OF(GENERAL_NAME) |
237 | 246 | ||
247 | int i2d_OTHERNAME(OTHERNAME *a, unsigned char **pp) | ||
248 | { | ||
249 | int v = 0; | ||
250 | M_ASN1_I2D_vars(a); | ||
251 | |||
252 | M_ASN1_I2D_len(a->type_id, i2d_ASN1_OBJECT); | ||
253 | M_ASN1_I2D_len_EXP_opt(a->value, i2d_ASN1_TYPE, 0, v); | ||
254 | |||
255 | M_ASN1_I2D_seq_total(); | ||
256 | |||
257 | M_ASN1_I2D_put(a->type_id, i2d_ASN1_OBJECT); | ||
258 | M_ASN1_I2D_put_EXP_opt(a->value, i2d_ASN1_TYPE, 0, v); | ||
259 | |||
260 | M_ASN1_I2D_finish(); | ||
261 | } | ||
262 | |||
263 | OTHERNAME *OTHERNAME_new(void) | ||
264 | { | ||
265 | OTHERNAME *ret=NULL; | ||
266 | ASN1_CTX c; | ||
267 | M_ASN1_New_Malloc(ret, OTHERNAME); | ||
268 | ret->type_id = OBJ_nid2obj(NID_undef); | ||
269 | M_ASN1_New(ret->value, ASN1_TYPE_new); | ||
270 | return (ret); | ||
271 | M_ASN1_New_Error(ASN1_F_OTHERNAME_NEW); | ||
272 | } | ||
273 | |||
274 | OTHERNAME *d2i_OTHERNAME(OTHERNAME **a, unsigned char **pp, long length) | ||
275 | { | ||
276 | M_ASN1_D2I_vars(a,OTHERNAME *,OTHERNAME_new); | ||
277 | M_ASN1_D2I_Init(); | ||
278 | M_ASN1_D2I_start_sequence(); | ||
279 | M_ASN1_D2I_get(ret->type_id, d2i_ASN1_OBJECT); | ||
280 | M_ASN1_D2I_get_EXP_opt(ret->value, d2i_ASN1_TYPE, 0); | ||
281 | M_ASN1_D2I_Finish(a, OTHERNAME_free, ASN1_F_D2I_OTHERNAME); | ||
282 | } | ||
283 | |||
284 | void OTHERNAME_free(OTHERNAME *a) | ||
285 | { | ||
286 | if (a == NULL) return; | ||
287 | ASN1_OBJECT_free(a->type_id); | ||
288 | ASN1_TYPE_free(a->value); | ||
289 | Free (a); | ||
290 | } | ||
291 | |||