diff options
Diffstat (limited to 'src/lib/libcrypto/pem/pem_pkey.c')
-rw-r--r-- | src/lib/libcrypto/pem/pem_pkey.c | 109 |
1 files changed, 101 insertions, 8 deletions
diff --git a/src/lib/libcrypto/pem/pem_pkey.c b/src/lib/libcrypto/pem/pem_pkey.c index 4da4c31ce5..8ecf24903b 100644 --- a/src/lib/libcrypto/pem/pem_pkey.c +++ b/src/lib/libcrypto/pem/pem_pkey.c | |||
@@ -65,7 +65,12 @@ | |||
65 | #include <openssl/x509.h> | 65 | #include <openssl/x509.h> |
66 | #include <openssl/pkcs12.h> | 66 | #include <openssl/pkcs12.h> |
67 | #include <openssl/pem.h> | 67 | #include <openssl/pem.h> |
68 | #ifndef OPENSSL_NO_ENGINE | ||
69 | #include <openssl/engine.h> | ||
70 | #endif | ||
71 | #include "asn1_locl.h" | ||
68 | 72 | ||
73 | int pem_check_suffix(const char *pem_str, const char *suffix); | ||
69 | 74 | ||
70 | EVP_PKEY *PEM_read_bio_PrivateKey(BIO *bp, EVP_PKEY **x, pem_password_cb *cb, void *u) | 75 | EVP_PKEY *PEM_read_bio_PrivateKey(BIO *bp, EVP_PKEY **x, pem_password_cb *cb, void *u) |
71 | { | 76 | { |
@@ -73,19 +78,14 @@ EVP_PKEY *PEM_read_bio_PrivateKey(BIO *bp, EVP_PKEY **x, pem_password_cb *cb, vo | |||
73 | const unsigned char *p=NULL; | 78 | const unsigned char *p=NULL; |
74 | unsigned char *data=NULL; | 79 | unsigned char *data=NULL; |
75 | long len; | 80 | long len; |
81 | int slen; | ||
76 | EVP_PKEY *ret=NULL; | 82 | EVP_PKEY *ret=NULL; |
77 | 83 | ||
78 | if (!PEM_bytes_read_bio(&data, &len, &nm, PEM_STRING_EVP_PKEY, bp, cb, u)) | 84 | if (!PEM_bytes_read_bio(&data, &len, &nm, PEM_STRING_EVP_PKEY, bp, cb, u)) |
79 | return NULL; | 85 | return NULL; |
80 | p = data; | 86 | p = data; |
81 | 87 | ||
82 | if (strcmp(nm,PEM_STRING_RSA) == 0) | 88 | if (strcmp(nm,PEM_STRING_PKCS8INF) == 0) { |
83 | ret=d2i_PrivateKey(EVP_PKEY_RSA,x,&p,len); | ||
84 | else if (strcmp(nm,PEM_STRING_DSA) == 0) | ||
85 | ret=d2i_PrivateKey(EVP_PKEY_DSA,x,&p,len); | ||
86 | else if (strcmp(nm,PEM_STRING_ECPRIVATEKEY) == 0) | ||
87 | ret=d2i_PrivateKey(EVP_PKEY_EC,x,&p,len); | ||
88 | else if (strcmp(nm,PEM_STRING_PKCS8INF) == 0) { | ||
89 | PKCS8_PRIV_KEY_INFO *p8inf; | 89 | PKCS8_PRIV_KEY_INFO *p8inf; |
90 | p8inf=d2i_PKCS8_PRIV_KEY_INFO(NULL, &p, len); | 90 | p8inf=d2i_PKCS8_PRIV_KEY_INFO(NULL, &p, len); |
91 | if(!p8inf) goto p8err; | 91 | if(!p8inf) goto p8err; |
@@ -119,7 +119,14 @@ EVP_PKEY *PEM_read_bio_PrivateKey(BIO *bp, EVP_PKEY **x, pem_password_cb *cb, vo | |||
119 | *x = ret; | 119 | *x = ret; |
120 | } | 120 | } |
121 | PKCS8_PRIV_KEY_INFO_free(p8inf); | 121 | PKCS8_PRIV_KEY_INFO_free(p8inf); |
122 | } | 122 | } else if ((slen = pem_check_suffix(nm, "PRIVATE KEY")) > 0) |
123 | { | ||
124 | const EVP_PKEY_ASN1_METHOD *ameth; | ||
125 | ameth = EVP_PKEY_asn1_find_str(NULL, nm, slen); | ||
126 | if (!ameth || !ameth->old_priv_decode) | ||
127 | goto p8err; | ||
128 | ret=d2i_PrivateKey(ameth->pkey_id,x,&p,len); | ||
129 | } | ||
123 | p8err: | 130 | p8err: |
124 | if (ret == NULL) | 131 | if (ret == NULL) |
125 | PEMerr(PEM_F_PEM_READ_BIO_PRIVATEKEY,ERR_R_ASN1_LIB); | 132 | PEMerr(PEM_F_PEM_READ_BIO_PRIVATEKEY,ERR_R_ASN1_LIB); |
@@ -130,6 +137,74 @@ err: | |||
130 | return(ret); | 137 | return(ret); |
131 | } | 138 | } |
132 | 139 | ||
140 | int PEM_write_bio_PrivateKey(BIO *bp, EVP_PKEY *x, const EVP_CIPHER *enc, | ||
141 | unsigned char *kstr, int klen, | ||
142 | pem_password_cb *cb, void *u) | ||
143 | { | ||
144 | char pem_str[80]; | ||
145 | if (!x->ameth || x->ameth->priv_encode) | ||
146 | return PEM_write_bio_PKCS8PrivateKey(bp, x, enc, | ||
147 | (char *)kstr, klen, | ||
148 | cb, u); | ||
149 | |||
150 | BIO_snprintf(pem_str, 80, "%s PRIVATE KEY", x->ameth->pem_str); | ||
151 | return PEM_ASN1_write_bio((i2d_of_void *)i2d_PrivateKey, | ||
152 | pem_str,bp,x,enc,kstr,klen,cb,u); | ||
153 | } | ||
154 | |||
155 | EVP_PKEY *PEM_read_bio_Parameters(BIO *bp, EVP_PKEY **x) | ||
156 | { | ||
157 | char *nm=NULL; | ||
158 | const unsigned char *p=NULL; | ||
159 | unsigned char *data=NULL; | ||
160 | long len; | ||
161 | int slen; | ||
162 | EVP_PKEY *ret=NULL; | ||
163 | |||
164 | if (!PEM_bytes_read_bio(&data, &len, &nm, PEM_STRING_PARAMETERS, | ||
165 | bp, 0, NULL)) | ||
166 | return NULL; | ||
167 | p = data; | ||
168 | |||
169 | if ((slen = pem_check_suffix(nm, "PARAMETERS")) > 0) | ||
170 | { | ||
171 | ret = EVP_PKEY_new(); | ||
172 | if (!ret) | ||
173 | goto err; | ||
174 | if (!EVP_PKEY_set_type_str(ret, nm, slen) | ||
175 | || !ret->ameth->param_decode | ||
176 | || !ret->ameth->param_decode(ret, &p, len)) | ||
177 | { | ||
178 | EVP_PKEY_free(ret); | ||
179 | ret = NULL; | ||
180 | goto err; | ||
181 | } | ||
182 | if(x) | ||
183 | { | ||
184 | if(*x) EVP_PKEY_free((EVP_PKEY *)*x); | ||
185 | *x = ret; | ||
186 | } | ||
187 | } | ||
188 | err: | ||
189 | if (ret == NULL) | ||
190 | PEMerr(PEM_F_PEM_READ_BIO_PARAMETERS,ERR_R_ASN1_LIB); | ||
191 | OPENSSL_free(nm); | ||
192 | OPENSSL_free(data); | ||
193 | return(ret); | ||
194 | } | ||
195 | |||
196 | int PEM_write_bio_Parameters(BIO *bp, EVP_PKEY *x) | ||
197 | { | ||
198 | char pem_str[80]; | ||
199 | if (!x->ameth || !x->ameth->param_encode) | ||
200 | return 0; | ||
201 | |||
202 | BIO_snprintf(pem_str, 80, "%s PARAMETERS", x->ameth->pem_str); | ||
203 | return PEM_ASN1_write_bio( | ||
204 | (i2d_of_void *)x->ameth->param_encode, | ||
205 | pem_str,bp,x,NULL,NULL,0,0,NULL); | ||
206 | } | ||
207 | |||
133 | #ifndef OPENSSL_NO_FP_API | 208 | #ifndef OPENSSL_NO_FP_API |
134 | EVP_PKEY *PEM_read_PrivateKey(FILE *fp, EVP_PKEY **x, pem_password_cb *cb, void *u) | 209 | EVP_PKEY *PEM_read_PrivateKey(FILE *fp, EVP_PKEY **x, pem_password_cb *cb, void *u) |
135 | { | 210 | { |
@@ -146,4 +221,22 @@ EVP_PKEY *PEM_read_PrivateKey(FILE *fp, EVP_PKEY **x, pem_password_cb *cb, void | |||
146 | BIO_free(b); | 221 | BIO_free(b); |
147 | return(ret); | 222 | return(ret); |
148 | } | 223 | } |
224 | |||
225 | int PEM_write_PrivateKey(FILE *fp, EVP_PKEY *x, const EVP_CIPHER *enc, | ||
226 | unsigned char *kstr, int klen, | ||
227 | pem_password_cb *cb, void *u) | ||
228 | { | ||
229 | BIO *b; | ||
230 | int ret; | ||
231 | |||
232 | if ((b=BIO_new_fp(fp, BIO_NOCLOSE)) == NULL) | ||
233 | { | ||
234 | PEMerr(PEM_F_PEM_WRITE_PRIVATEKEY,ERR_R_BUF_LIB); | ||
235 | return 0; | ||
236 | } | ||
237 | ret=PEM_write_bio_PrivateKey(b, x, enc, kstr, klen, cb, u); | ||
238 | BIO_free(b); | ||
239 | return ret; | ||
240 | } | ||
241 | |||
149 | #endif | 242 | #endif |