diff options
Diffstat (limited to 'src/lib/libcrypto/asn1/x_req.c')
-rw-r--r-- | src/lib/libcrypto/asn1/x_req.c | 25 |
1 files changed, 23 insertions, 2 deletions
diff --git a/src/lib/libcrypto/asn1/x_req.c b/src/lib/libcrypto/asn1/x_req.c index 0cd572ee73..6dddd4f653 100644 --- a/src/lib/libcrypto/asn1/x_req.c +++ b/src/lib/libcrypto/asn1/x_req.c | |||
@@ -65,6 +65,14 @@ int i2d_X509_REQ_INFO(X509_REQ_INFO *a, unsigned char **pp) | |||
65 | { | 65 | { |
66 | M_ASN1_I2D_vars(a); | 66 | M_ASN1_I2D_vars(a); |
67 | 67 | ||
68 | if(a->asn1) { | ||
69 | if(pp) { | ||
70 | memcpy(*pp, a->asn1, a->length); | ||
71 | *pp += a->length; | ||
72 | } | ||
73 | return a->length; | ||
74 | } | ||
75 | |||
68 | M_ASN1_I2D_len(a->version, i2d_ASN1_INTEGER); | 76 | M_ASN1_I2D_len(a->version, i2d_ASN1_INTEGER); |
69 | M_ASN1_I2D_len(a->subject, i2d_X509_NAME); | 77 | M_ASN1_I2D_len(a->subject, i2d_X509_NAME); |
70 | M_ASN1_I2D_len(a->pubkey, i2d_X509_PUBKEY); | 78 | M_ASN1_I2D_len(a->pubkey, i2d_X509_PUBKEY); |
@@ -152,6 +160,7 @@ X509_REQ_INFO *X509_REQ_INFO_new(void) | |||
152 | M_ASN1_New(ret->pubkey,X509_PUBKEY_new); | 160 | M_ASN1_New(ret->pubkey,X509_PUBKEY_new); |
153 | M_ASN1_New(ret->attributes,sk_X509_ATTRIBUTE_new_null); | 161 | M_ASN1_New(ret->attributes,sk_X509_ATTRIBUTE_new_null); |
154 | ret->req_kludge=0; | 162 | ret->req_kludge=0; |
163 | ret->asn1 = NULL; | ||
155 | return(ret); | 164 | return(ret); |
156 | M_ASN1_New_Error(ASN1_F_X509_REQ_INFO_NEW); | 165 | M_ASN1_New_Error(ASN1_F_X509_REQ_INFO_NEW); |
157 | } | 166 | } |
@@ -159,11 +168,12 @@ X509_REQ_INFO *X509_REQ_INFO_new(void) | |||
159 | void X509_REQ_INFO_free(X509_REQ_INFO *a) | 168 | void X509_REQ_INFO_free(X509_REQ_INFO *a) |
160 | { | 169 | { |
161 | if (a == NULL) return; | 170 | if (a == NULL) return; |
171 | if(a->asn1) OPENSSL_free(a->asn1); | ||
162 | M_ASN1_INTEGER_free(a->version); | 172 | M_ASN1_INTEGER_free(a->version); |
163 | X509_NAME_free(a->subject); | 173 | X509_NAME_free(a->subject); |
164 | X509_PUBKEY_free(a->pubkey); | 174 | X509_PUBKEY_free(a->pubkey); |
165 | sk_X509_ATTRIBUTE_pop_free(a->attributes,X509_ATTRIBUTE_free); | 175 | sk_X509_ATTRIBUTE_pop_free(a->attributes,X509_ATTRIBUTE_free); |
166 | Free(a); | 176 | OPENSSL_free(a); |
167 | } | 177 | } |
168 | 178 | ||
169 | int i2d_X509_REQ(X509_REQ *a, unsigned char **pp) | 179 | int i2d_X509_REQ(X509_REQ *a, unsigned char **pp) |
@@ -189,6 +199,17 @@ X509_REQ *d2i_X509_REQ(X509_REQ **a, unsigned char **pp, long length) | |||
189 | M_ASN1_D2I_Init(); | 199 | M_ASN1_D2I_Init(); |
190 | M_ASN1_D2I_start_sequence(); | 200 | M_ASN1_D2I_start_sequence(); |
191 | M_ASN1_D2I_get(ret->req_info,d2i_X509_REQ_INFO); | 201 | M_ASN1_D2I_get(ret->req_info,d2i_X509_REQ_INFO); |
202 | |||
203 | /* Keep a copy of the original encoding for signature checking */ | ||
204 | ret->req_info->length = c.p - c.q; | ||
205 | if(!(ret->req_info->asn1 = OPENSSL_malloc(ret->req_info->length))) { | ||
206 | c.line=__LINE__; | ||
207 | c.error = ERR_R_MALLOC_FAILURE; | ||
208 | goto err; | ||
209 | } | ||
210 | |||
211 | memcpy(ret->req_info->asn1, c.q, ret->req_info->length); | ||
212 | |||
192 | M_ASN1_D2I_get(ret->sig_alg,d2i_X509_ALGOR); | 213 | M_ASN1_D2I_get(ret->sig_alg,d2i_X509_ALGOR); |
193 | M_ASN1_D2I_get(ret->signature,d2i_ASN1_BIT_STRING); | 214 | M_ASN1_D2I_get(ret->signature,d2i_ASN1_BIT_STRING); |
194 | M_ASN1_D2I_Finish(a,X509_REQ_free,ASN1_F_D2I_X509_REQ); | 215 | M_ASN1_D2I_Finish(a,X509_REQ_free,ASN1_F_D2I_X509_REQ); |
@@ -230,7 +251,7 @@ void X509_REQ_free(X509_REQ *a) | |||
230 | X509_REQ_INFO_free(a->req_info); | 251 | X509_REQ_INFO_free(a->req_info); |
231 | X509_ALGOR_free(a->sig_alg); | 252 | X509_ALGOR_free(a->sig_alg); |
232 | M_ASN1_BIT_STRING_free(a->signature); | 253 | M_ASN1_BIT_STRING_free(a->signature); |
233 | Free(a); | 254 | OPENSSL_free(a); |
234 | } | 255 | } |
235 | 256 | ||
236 | 257 | ||