diff options
Diffstat (limited to 'src/lib/libcrypto/asn1/x_pubkey.c')
-rw-r--r-- | src/lib/libcrypto/asn1/x_pubkey.c | 80 |
1 files changed, 22 insertions, 58 deletions
diff --git a/src/lib/libcrypto/asn1/x_pubkey.c b/src/lib/libcrypto/asn1/x_pubkey.c index 4397a404b5..55630294b6 100644 --- a/src/lib/libcrypto/asn1/x_pubkey.c +++ b/src/lib/libcrypto/asn1/x_pubkey.c | |||
@@ -58,62 +58,25 @@ | |||
58 | 58 | ||
59 | #include <stdio.h> | 59 | #include <stdio.h> |
60 | #include "cryptlib.h" | 60 | #include "cryptlib.h" |
61 | #include <openssl/asn1_mac.h> | 61 | #include <openssl/asn1t.h> |
62 | #include <openssl/x509.h> | 62 | #include <openssl/x509.h> |
63 | 63 | ||
64 | int i2d_X509_PUBKEY(X509_PUBKEY *a, unsigned char **pp) | 64 | /* Minor tweak to operation: free up EVP_PKEY */ |
65 | { | 65 | static int pubkey_cb(int operation, ASN1_VALUE **pval, const ASN1_ITEM *it) |
66 | M_ASN1_I2D_vars(a); | 66 | { |
67 | 67 | if(operation == ASN1_OP_FREE_POST) { | |
68 | M_ASN1_I2D_len(a->algor, i2d_X509_ALGOR); | 68 | X509_PUBKEY *pubkey = (X509_PUBKEY *)*pval; |
69 | M_ASN1_I2D_len(a->public_key, i2d_ASN1_BIT_STRING); | 69 | EVP_PKEY_free(pubkey->pkey); |
70 | |||
71 | M_ASN1_I2D_seq_total(); | ||
72 | |||
73 | M_ASN1_I2D_put(a->algor, i2d_X509_ALGOR); | ||
74 | M_ASN1_I2D_put(a->public_key, i2d_ASN1_BIT_STRING); | ||
75 | |||
76 | M_ASN1_I2D_finish(); | ||
77 | } | ||
78 | |||
79 | X509_PUBKEY *d2i_X509_PUBKEY(X509_PUBKEY **a, unsigned char **pp, | ||
80 | long length) | ||
81 | { | ||
82 | M_ASN1_D2I_vars(a,X509_PUBKEY *,X509_PUBKEY_new); | ||
83 | |||
84 | M_ASN1_D2I_Init(); | ||
85 | M_ASN1_D2I_start_sequence(); | ||
86 | M_ASN1_D2I_get(ret->algor,d2i_X509_ALGOR); | ||
87 | M_ASN1_D2I_get(ret->public_key,d2i_ASN1_BIT_STRING); | ||
88 | if (ret->pkey != NULL) | ||
89 | { | ||
90 | EVP_PKEY_free(ret->pkey); | ||
91 | ret->pkey=NULL; | ||
92 | } | ||
93 | M_ASN1_D2I_Finish(a,X509_PUBKEY_free,ASN1_F_D2I_X509_PUBKEY); | ||
94 | } | 70 | } |
71 | return 1; | ||
72 | } | ||
95 | 73 | ||
96 | X509_PUBKEY *X509_PUBKEY_new(void) | 74 | ASN1_SEQUENCE_cb(X509_PUBKEY, pubkey_cb) = { |
97 | { | 75 | ASN1_SIMPLE(X509_PUBKEY, algor, X509_ALGOR), |
98 | X509_PUBKEY *ret=NULL; | 76 | ASN1_SIMPLE(X509_PUBKEY, public_key, ASN1_BIT_STRING) |
99 | ASN1_CTX c; | 77 | } ASN1_SEQUENCE_END_cb(X509_PUBKEY, X509_PUBKEY) |
100 | |||
101 | M_ASN1_New_Malloc(ret,X509_PUBKEY); | ||
102 | M_ASN1_New(ret->algor,X509_ALGOR_new); | ||
103 | M_ASN1_New(ret->public_key,M_ASN1_BIT_STRING_new); | ||
104 | ret->pkey=NULL; | ||
105 | return(ret); | ||
106 | M_ASN1_New_Error(ASN1_F_X509_PUBKEY_NEW); | ||
107 | } | ||
108 | 78 | ||
109 | void X509_PUBKEY_free(X509_PUBKEY *a) | 79 | IMPLEMENT_ASN1_FUNCTIONS(X509_PUBKEY) |
110 | { | ||
111 | if (a == NULL) return; | ||
112 | X509_ALGOR_free(a->algor); | ||
113 | M_ASN1_BIT_STRING_free(a->public_key); | ||
114 | if (a->pkey != NULL) EVP_PKEY_free(a->pkey); | ||
115 | OPENSSL_free(a); | ||
116 | } | ||
117 | 80 | ||
118 | int X509_PUBKEY_set(X509_PUBKEY **x, EVP_PKEY *pkey) | 81 | int X509_PUBKEY_set(X509_PUBKEY **x, EVP_PKEY *pkey) |
119 | { | 82 | { |
@@ -146,7 +109,7 @@ int X509_PUBKEY_set(X509_PUBKEY **x, EVP_PKEY *pkey) | |||
146 | } | 109 | } |
147 | } | 110 | } |
148 | else | 111 | else |
149 | #ifndef NO_DSA | 112 | #ifndef OPENSSL_NO_DSA |
150 | if (pkey->type == EVP_PKEY_DSA) | 113 | if (pkey->type == EVP_PKEY_DSA) |
151 | { | 114 | { |
152 | unsigned char *pp; | 115 | unsigned char *pp; |
@@ -206,7 +169,8 @@ EVP_PKEY *X509_PUBKEY_get(X509_PUBKEY *key) | |||
206 | long j; | 169 | long j; |
207 | int type; | 170 | int type; |
208 | unsigned char *p; | 171 | unsigned char *p; |
209 | #ifndef NO_DSA | 172 | #ifndef OPENSSL_NO_DSA |
173 | const unsigned char *cp; | ||
210 | X509_ALGOR *a; | 174 | X509_ALGOR *a; |
211 | #endif | 175 | #endif |
212 | 176 | ||
@@ -230,16 +194,16 @@ EVP_PKEY *X509_PUBKEY_get(X509_PUBKEY *key) | |||
230 | } | 194 | } |
231 | ret->save_parameters=0; | 195 | ret->save_parameters=0; |
232 | 196 | ||
233 | #ifndef NO_DSA | 197 | #ifndef OPENSSL_NO_DSA |
234 | a=key->algor; | 198 | a=key->algor; |
235 | if (ret->type == EVP_PKEY_DSA) | 199 | if (ret->type == EVP_PKEY_DSA) |
236 | { | 200 | { |
237 | if (a->parameter && (a->parameter->type == V_ASN1_SEQUENCE)) | 201 | if (a->parameter && (a->parameter->type == V_ASN1_SEQUENCE)) |
238 | { | 202 | { |
239 | ret->pkey.dsa->write_params=0; | 203 | ret->pkey.dsa->write_params=0; |
240 | p=a->parameter->value.sequence->data; | 204 | cp=p=a->parameter->value.sequence->data; |
241 | j=a->parameter->value.sequence->length; | 205 | j=a->parameter->value.sequence->length; |
242 | if (!d2i_DSAparams(&ret->pkey.dsa,&p,(long)j)) | 206 | if (!d2i_DSAparams(&ret->pkey.dsa,&cp,(long)j)) |
243 | goto err; | 207 | goto err; |
244 | } | 208 | } |
245 | ret->save_parameters=1; | 209 | ret->save_parameters=1; |
@@ -289,7 +253,7 @@ int i2d_PUBKEY(EVP_PKEY *a, unsigned char **pp) | |||
289 | /* The following are equivalents but which return RSA and DSA | 253 | /* The following are equivalents but which return RSA and DSA |
290 | * keys | 254 | * keys |
291 | */ | 255 | */ |
292 | #ifndef NO_RSA | 256 | #ifndef OPENSSL_NO_RSA |
293 | RSA *d2i_RSA_PUBKEY(RSA **a, unsigned char **pp, | 257 | RSA *d2i_RSA_PUBKEY(RSA **a, unsigned char **pp, |
294 | long length) | 258 | long length) |
295 | { | 259 | { |
@@ -327,7 +291,7 @@ int i2d_RSA_PUBKEY(RSA *a, unsigned char **pp) | |||
327 | } | 291 | } |
328 | #endif | 292 | #endif |
329 | 293 | ||
330 | #ifndef NO_DSA | 294 | #ifndef OPENSSL_NO_DSA |
331 | DSA *d2i_DSA_PUBKEY(DSA **a, unsigned char **pp, | 295 | DSA *d2i_DSA_PUBKEY(DSA **a, unsigned char **pp, |
332 | long length) | 296 | long length) |
333 | { | 297 | { |