xref: /openbsd-src/lib/libcrypto/pem/pem_all.c (revision 4a925a6a8d19d7b7ed705f131daa4c3c08f0db82)
1*4a925a6aSbeck /* $OpenBSD: pem_all.c,v 1.21 2023/07/07 13:40:44 beck Exp $ */
25b37fcf3Sryker /* Copyright (C) 1995-1998 Eric Young (eay@cryptsoft.com)
35b37fcf3Sryker  * All rights reserved.
45b37fcf3Sryker  *
55b37fcf3Sryker  * This package is an SSL implementation written
65b37fcf3Sryker  * by Eric Young (eay@cryptsoft.com).
75b37fcf3Sryker  * The implementation was written so as to conform with Netscapes SSL.
85b37fcf3Sryker  *
95b37fcf3Sryker  * This library is free for commercial and non-commercial use as long as
105b37fcf3Sryker  * the following conditions are aheared to.  The following conditions
115b37fcf3Sryker  * apply to all code found in this distribution, be it the RC4, RSA,
125b37fcf3Sryker  * lhash, DES, etc., code; not just the SSL code.  The SSL documentation
135b37fcf3Sryker  * included with this distribution is covered by the same copyright terms
145b37fcf3Sryker  * except that the holder is Tim Hudson (tjh@cryptsoft.com).
155b37fcf3Sryker  *
165b37fcf3Sryker  * Copyright remains Eric Young's, and as such any Copyright notices in
175b37fcf3Sryker  * the code are not to be removed.
185b37fcf3Sryker  * If this package is used in a product, Eric Young should be given attribution
195b37fcf3Sryker  * as the author of the parts of the library used.
205b37fcf3Sryker  * This can be in the form of a textual message at program startup or
215b37fcf3Sryker  * in documentation (online or textual) provided with the package.
225b37fcf3Sryker  *
235b37fcf3Sryker  * Redistribution and use in source and binary forms, with or without
245b37fcf3Sryker  * modification, are permitted provided that the following conditions
255b37fcf3Sryker  * are met:
265b37fcf3Sryker  * 1. Redistributions of source code must retain the copyright
275b37fcf3Sryker  *    notice, this list of conditions and the following disclaimer.
285b37fcf3Sryker  * 2. Redistributions in binary form must reproduce the above copyright
295b37fcf3Sryker  *    notice, this list of conditions and the following disclaimer in the
305b37fcf3Sryker  *    documentation and/or other materials provided with the distribution.
315b37fcf3Sryker  * 3. All advertising materials mentioning features or use of this software
325b37fcf3Sryker  *    must display the following acknowledgement:
335b37fcf3Sryker  *    "This product includes cryptographic software written by
345b37fcf3Sryker  *     Eric Young (eay@cryptsoft.com)"
355b37fcf3Sryker  *    The word 'cryptographic' can be left out if the rouines from the library
365b37fcf3Sryker  *    being used are not cryptographic related :-).
375b37fcf3Sryker  * 4. If you include any Windows specific code (or a derivative thereof) from
385b37fcf3Sryker  *    the apps directory (application code) you must include an acknowledgement:
395b37fcf3Sryker  *    "This product includes software written by Tim Hudson (tjh@cryptsoft.com)"
405b37fcf3Sryker  *
415b37fcf3Sryker  * THIS SOFTWARE IS PROVIDED BY ERIC YOUNG ``AS IS'' AND
425b37fcf3Sryker  * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
435b37fcf3Sryker  * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
445b37fcf3Sryker  * ARE DISCLAIMED.  IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE
455b37fcf3Sryker  * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
465b37fcf3Sryker  * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
475b37fcf3Sryker  * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
485b37fcf3Sryker  * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
495b37fcf3Sryker  * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
505b37fcf3Sryker  * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
515b37fcf3Sryker  * SUCH DAMAGE.
525b37fcf3Sryker  *
535b37fcf3Sryker  * The licence and distribution terms for any publically available version or
545b37fcf3Sryker  * derivative of this code cannot be changed.  i.e. this code cannot simply be
555b37fcf3Sryker  * copied and put under another distribution licence
565b37fcf3Sryker  * [including the GNU Public Licence.]
575b37fcf3Sryker  */
584fcf65c5Sdjm /* ====================================================================
594fcf65c5Sdjm  * Copyright (c) 1998-2002 The OpenSSL Project.  All rights reserved.
604fcf65c5Sdjm  *
614fcf65c5Sdjm  * Redistribution and use in source and binary forms, with or without
624fcf65c5Sdjm  * modification, are permitted provided that the following conditions
634fcf65c5Sdjm  * are met:
644fcf65c5Sdjm  *
654fcf65c5Sdjm  * 1. Redistributions of source code must retain the above copyright
664fcf65c5Sdjm  *    notice, this list of conditions and the following disclaimer.
674fcf65c5Sdjm  *
684fcf65c5Sdjm  * 2. Redistributions in binary form must reproduce the above copyright
694fcf65c5Sdjm  *    notice, this list of conditions and the following disclaimer in
704fcf65c5Sdjm  *    the documentation and/or other materials provided with the
714fcf65c5Sdjm  *    distribution.
724fcf65c5Sdjm  *
734fcf65c5Sdjm  * 3. All advertising materials mentioning features or use of this
744fcf65c5Sdjm  *    software must display the following acknowledgment:
754fcf65c5Sdjm  *    "This product includes software developed by the OpenSSL Project
764fcf65c5Sdjm  *    for use in the OpenSSL Toolkit. (http://www.openssl.org/)"
774fcf65c5Sdjm  *
784fcf65c5Sdjm  * 4. The names "OpenSSL Toolkit" and "OpenSSL Project" must not be used to
794fcf65c5Sdjm  *    endorse or promote products derived from this software without
804fcf65c5Sdjm  *    prior written permission. For written permission, please contact
814fcf65c5Sdjm  *    openssl-core@openssl.org.
824fcf65c5Sdjm  *
834fcf65c5Sdjm  * 5. Products derived from this software may not be called "OpenSSL"
844fcf65c5Sdjm  *    nor may "OpenSSL" appear in their names without prior written
854fcf65c5Sdjm  *    permission of the OpenSSL Project.
864fcf65c5Sdjm  *
874fcf65c5Sdjm  * 6. Redistributions of any form whatsoever must retain the following
884fcf65c5Sdjm  *    acknowledgment:
894fcf65c5Sdjm  *    "This product includes software developed by the OpenSSL Project
904fcf65c5Sdjm  *    for use in the OpenSSL Toolkit (http://www.openssl.org/)"
914fcf65c5Sdjm  *
924fcf65c5Sdjm  * THIS SOFTWARE IS PROVIDED BY THE OpenSSL PROJECT ``AS IS'' AND ANY
934fcf65c5Sdjm  * EXPRESSED OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
944fcf65c5Sdjm  * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
954fcf65c5Sdjm  * PURPOSE ARE DISCLAIMED.  IN NO EVENT SHALL THE OpenSSL PROJECT OR
964fcf65c5Sdjm  * ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
974fcf65c5Sdjm  * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
984fcf65c5Sdjm  * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
994fcf65c5Sdjm  * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
1004fcf65c5Sdjm  * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT,
1014fcf65c5Sdjm  * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
1024fcf65c5Sdjm  * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED
1034fcf65c5Sdjm  * OF THE POSSIBILITY OF SUCH DAMAGE.
1044fcf65c5Sdjm  * ====================================================================
1054fcf65c5Sdjm  *
1064fcf65c5Sdjm  * This product includes cryptographic software written by Eric Young
1074fcf65c5Sdjm  * (eay@cryptsoft.com).  This product includes software written by Tim
1084fcf65c5Sdjm  * Hudson (tjh@cryptsoft.com).
1094fcf65c5Sdjm  *
1104fcf65c5Sdjm  */
1115b37fcf3Sryker 
1125b37fcf3Sryker #include <stdio.h>
1138cf4d6a6Sjsing 
1148cf4d6a6Sjsing #include <openssl/opensslconf.h>
1158cf4d6a6Sjsing 
116913ec974Sbeck #include <openssl/bio.h>
117913ec974Sbeck #include <openssl/evp.h>
118913ec974Sbeck #include <openssl/pem.h>
119b6ab114eSjsing #include <openssl/pkcs7.h>
120b6ab114eSjsing #include <openssl/x509.h>
121b6ab114eSjsing 
122b6ab114eSjsing #ifndef OPENSSL_NO_DH
123b6ab114eSjsing #include <openssl/dh.h>
1244fcf65c5Sdjm #endif
1254fcf65c5Sdjm #ifndef OPENSSL_NO_DSA
1264fcf65c5Sdjm #include <openssl/dsa.h>
1274fcf65c5Sdjm #endif
128b6ab114eSjsing #ifndef OPENSSL_NO_RSA
129b6ab114eSjsing #include <openssl/rsa.h>
1304fcf65c5Sdjm #endif
1315b37fcf3Sryker 
132da347917Sbeck #ifndef OPENSSL_NO_RSA
133ba5406e9Sbeck static RSA *pkey_get_rsa(EVP_PKEY *key, RSA **rsa);
134ba5406e9Sbeck #endif
135da347917Sbeck #ifndef OPENSSL_NO_DSA
136ba5406e9Sbeck static DSA *pkey_get_dsa(EVP_PKEY *key, DSA **dsa);
137ba5406e9Sbeck #endif
138ba5406e9Sbeck 
1394fcf65c5Sdjm #ifndef OPENSSL_NO_EC
1404fcf65c5Sdjm static EC_KEY *pkey_get_eckey(EVP_PKEY *key, EC_KEY **eckey);
1414fcf65c5Sdjm #endif
1424fcf65c5Sdjm 
1435b37fcf3Sryker 
144e4ea9340Sjsing X509_REQ *
PEM_read_X509_REQ(FILE * fp,X509_REQ ** x,pem_password_cb * cb,void * u)145e4ea9340Sjsing PEM_read_X509_REQ(FILE *fp, X509_REQ **x, pem_password_cb *cb, void *u)
146e4ea9340Sjsing {
147e4ea9340Sjsing 	return PEM_ASN1_read((d2i_of_void *)d2i_X509_REQ, PEM_STRING_X509_REQ, fp,
148e4ea9340Sjsing 	    (void **)x, cb, u);
149e4ea9340Sjsing }
150*4a925a6aSbeck LCRYPTO_ALIAS(PEM_read_X509_REQ);
1515b37fcf3Sryker 
152e4ea9340Sjsing int
PEM_write_X509_REQ(FILE * fp,X509_REQ * x)15300ad794dSjsing PEM_write_X509_REQ(FILE *fp, X509_REQ *x)
15400ad794dSjsing {
15500ad794dSjsing 	return PEM_ASN1_write((i2d_of_void *)i2d_X509_REQ, PEM_STRING_X509_REQ, fp,
15600ad794dSjsing 	    x, NULL, NULL, 0, NULL, NULL);
15700ad794dSjsing }
158*4a925a6aSbeck LCRYPTO_ALIAS(PEM_write_X509_REQ);
15900ad794dSjsing 
16000ad794dSjsing X509_REQ *
PEM_read_bio_X509_REQ(BIO * bp,X509_REQ ** x,pem_password_cb * cb,void * u)16100ad794dSjsing PEM_read_bio_X509_REQ(BIO *bp, X509_REQ **x, pem_password_cb *cb, void *u)
16200ad794dSjsing {
16300ad794dSjsing 	return PEM_ASN1_read_bio((d2i_of_void *)d2i_X509_REQ, PEM_STRING_X509_REQ, bp,
16400ad794dSjsing 	    (void **)x, cb, u);
16500ad794dSjsing }
166*4a925a6aSbeck LCRYPTO_ALIAS(PEM_read_bio_X509_REQ);
16700ad794dSjsing 
16800ad794dSjsing int
PEM_write_bio_X509_REQ(BIO * bp,X509_REQ * x)169e4ea9340Sjsing PEM_write_bio_X509_REQ(BIO *bp, X509_REQ *x)
170e4ea9340Sjsing {
171e4ea9340Sjsing 	return PEM_ASN1_write_bio((i2d_of_void *)i2d_X509_REQ, PEM_STRING_X509_REQ, bp,
172e4ea9340Sjsing 	    x, NULL, NULL, 0, NULL, NULL);
173e4ea9340Sjsing }
174*4a925a6aSbeck LCRYPTO_ALIAS(PEM_write_bio_X509_REQ);
1755b37fcf3Sryker 
176e4ea9340Sjsing int
PEM_write_X509_REQ_NEW(FILE * fp,X509_REQ * x)177e4ea9340Sjsing PEM_write_X509_REQ_NEW(FILE *fp, X509_REQ *x)
178e4ea9340Sjsing {
179e4ea9340Sjsing 	return PEM_ASN1_write((i2d_of_void *)i2d_X509_REQ, PEM_STRING_X509_REQ_OLD, fp,
180e4ea9340Sjsing 	    x, NULL, NULL, 0, NULL, NULL);
181e4ea9340Sjsing }
182*4a925a6aSbeck LCRYPTO_ALIAS(PEM_write_X509_REQ_NEW);
183e4ea9340Sjsing 
18400ad794dSjsing int
PEM_write_bio_X509_REQ_NEW(BIO * bp,X509_REQ * x)18500ad794dSjsing PEM_write_bio_X509_REQ_NEW(BIO *bp, X509_REQ *x)
186e4ea9340Sjsing {
18700ad794dSjsing 	return PEM_ASN1_write_bio((i2d_of_void *)i2d_X509_REQ, PEM_STRING_X509_REQ_OLD, bp,
18800ad794dSjsing 	    x, NULL, NULL, 0, NULL, NULL);
189e4ea9340Sjsing }
190*4a925a6aSbeck LCRYPTO_ALIAS(PEM_write_bio_X509_REQ_NEW);
191e4ea9340Sjsing 
192e4ea9340Sjsing X509_CRL *
PEM_read_X509_CRL(FILE * fp,X509_CRL ** x,pem_password_cb * cb,void * u)193e4ea9340Sjsing PEM_read_X509_CRL(FILE *fp, X509_CRL **x, pem_password_cb *cb, void *u)
194e4ea9340Sjsing {
195e4ea9340Sjsing 	return PEM_ASN1_read((d2i_of_void *)d2i_X509_CRL, PEM_STRING_X509_CRL, fp,
196e4ea9340Sjsing 	    (void **)x, cb, u);
197e4ea9340Sjsing }
198*4a925a6aSbeck LCRYPTO_ALIAS(PEM_read_X509_CRL);
199e4ea9340Sjsing 
200e4ea9340Sjsing int
PEM_write_X509_CRL(FILE * fp,X509_CRL * x)201e4ea9340Sjsing PEM_write_X509_CRL(FILE *fp, X509_CRL *x)
202e4ea9340Sjsing {
203e4ea9340Sjsing 	return PEM_ASN1_write((i2d_of_void *)i2d_X509_CRL, PEM_STRING_X509_CRL, fp,
204e4ea9340Sjsing 	    x, NULL, NULL, 0, NULL, NULL);
205e4ea9340Sjsing }
206*4a925a6aSbeck LCRYPTO_ALIAS(PEM_write_X509_CRL);
207e4ea9340Sjsing 
20800ad794dSjsing X509_CRL *
PEM_read_bio_X509_CRL(BIO * bp,X509_CRL ** x,pem_password_cb * cb,void * u)20900ad794dSjsing PEM_read_bio_X509_CRL(BIO *bp, X509_CRL **x, pem_password_cb *cb, void *u)
210e4ea9340Sjsing {
21100ad794dSjsing 	return PEM_ASN1_read_bio((d2i_of_void *)d2i_X509_CRL, PEM_STRING_X509_CRL, bp,
212e4ea9340Sjsing 	    (void **)x, cb, u);
213e4ea9340Sjsing }
214*4a925a6aSbeck LCRYPTO_ALIAS(PEM_read_bio_X509_CRL);
215e4ea9340Sjsing 
21600ad794dSjsing int
PEM_write_bio_X509_CRL(BIO * bp,X509_CRL * x)21700ad794dSjsing PEM_write_bio_X509_CRL(BIO *bp, X509_CRL *x)
21800ad794dSjsing {
21900ad794dSjsing 	return PEM_ASN1_write_bio((i2d_of_void *)i2d_X509_CRL, PEM_STRING_X509_CRL, bp,
22000ad794dSjsing 	    x, NULL, NULL, 0, NULL, NULL);
22100ad794dSjsing }
222*4a925a6aSbeck LCRYPTO_ALIAS(PEM_write_bio_X509_CRL);
22300ad794dSjsing 
224e4ea9340Sjsing PKCS7 *
PEM_read_PKCS7(FILE * fp,PKCS7 ** x,pem_password_cb * cb,void * u)225e4ea9340Sjsing PEM_read_PKCS7(FILE *fp, PKCS7 **x, pem_password_cb *cb, void *u)
226e4ea9340Sjsing {
227e4ea9340Sjsing 	return PEM_ASN1_read((d2i_of_void *)d2i_PKCS7, PEM_STRING_PKCS7, fp,
228e4ea9340Sjsing 	    (void **)x, cb, u);
229e4ea9340Sjsing }
230*4a925a6aSbeck LCRYPTO_ALIAS(PEM_read_PKCS7);
231e4ea9340Sjsing 
232e4ea9340Sjsing int
PEM_write_PKCS7(FILE * fp,PKCS7 * x)23300ad794dSjsing PEM_write_PKCS7(FILE *fp, PKCS7 *x)
23400ad794dSjsing {
23500ad794dSjsing 	return PEM_ASN1_write((i2d_of_void *)i2d_PKCS7, PEM_STRING_PKCS7, fp,
23600ad794dSjsing 	    x, NULL, NULL, 0, NULL, NULL);
23700ad794dSjsing }
238*4a925a6aSbeck LCRYPTO_ALIAS(PEM_write_PKCS7);
23900ad794dSjsing 
24000ad794dSjsing PKCS7 *
PEM_read_bio_PKCS7(BIO * bp,PKCS7 ** x,pem_password_cb * cb,void * u)24100ad794dSjsing PEM_read_bio_PKCS7(BIO *bp, PKCS7 **x, pem_password_cb *cb, void *u)
24200ad794dSjsing {
24300ad794dSjsing 	return PEM_ASN1_read_bio((d2i_of_void *)d2i_PKCS7, PEM_STRING_PKCS7, bp,
24400ad794dSjsing 	    (void **)x, cb, u);
24500ad794dSjsing }
246*4a925a6aSbeck LCRYPTO_ALIAS(PEM_read_bio_PKCS7);
24700ad794dSjsing 
24800ad794dSjsing int
PEM_write_bio_PKCS7(BIO * bp,PKCS7 * x)249e4ea9340Sjsing PEM_write_bio_PKCS7(BIO *bp, PKCS7 *x)
250e4ea9340Sjsing {
251e4ea9340Sjsing 	return PEM_ASN1_write_bio((i2d_of_void *)i2d_PKCS7, PEM_STRING_PKCS7, bp,
252e4ea9340Sjsing 	    x, NULL, NULL, 0, NULL, NULL);
253e4ea9340Sjsing }
254*4a925a6aSbeck LCRYPTO_ALIAS(PEM_write_bio_PKCS7);
255e4ea9340Sjsing 
256da347917Sbeck #ifndef OPENSSL_NO_RSA
2575b37fcf3Sryker 
258ba5406e9Sbeck /* We treat RSA or DSA private keys as a special case.
259ba5406e9Sbeck  *
260ba5406e9Sbeck  * For private keys we read in an EVP_PKEY structure with
261ba5406e9Sbeck  * PEM_read_bio_PrivateKey() and extract the relevant private
262ba5406e9Sbeck  * key: this means can handle "traditional" and PKCS#8 formats
263ba5406e9Sbeck  * transparently.
264ba5406e9Sbeck  */
265913ec974Sbeck 
266a8b5ceceSjsing static RSA *
pkey_get_rsa(EVP_PKEY * key,RSA ** rsa)267a8b5ceceSjsing pkey_get_rsa(EVP_PKEY *key, RSA **rsa)
268ba5406e9Sbeck {
269ba5406e9Sbeck 	RSA *rtmp;
270a8b5ceceSjsing 
271a8b5ceceSjsing 	if (!key)
272a8b5ceceSjsing 		return NULL;
273ba5406e9Sbeck 	rtmp = EVP_PKEY_get1_RSA(key);
274ba5406e9Sbeck 	EVP_PKEY_free(key);
275a8b5ceceSjsing 	if (!rtmp)
276a8b5ceceSjsing 		return NULL;
277ba5406e9Sbeck 	if (rsa) {
278ba5406e9Sbeck 		RSA_free(*rsa);
279ba5406e9Sbeck 		*rsa = rtmp;
280ba5406e9Sbeck 	}
281ba5406e9Sbeck 	return rtmp;
282ba5406e9Sbeck }
283ba5406e9Sbeck 
284a8b5ceceSjsing RSA *
PEM_read_RSAPrivateKey(FILE * fp,RSA ** rsa,pem_password_cb * cb,void * u)285a8b5ceceSjsing PEM_read_RSAPrivateKey(FILE *fp, RSA **rsa, pem_password_cb *cb, void *u)
286ba5406e9Sbeck {
287ba5406e9Sbeck 	EVP_PKEY *pktmp;
288a8b5ceceSjsing 
289ba5406e9Sbeck 	pktmp = PEM_read_PrivateKey(fp, NULL, cb, u);
290ba5406e9Sbeck 	return pkey_get_rsa(pktmp, rsa);
291ba5406e9Sbeck }
292*4a925a6aSbeck LCRYPTO_ALIAS(PEM_read_RSAPrivateKey);
293ba5406e9Sbeck 
294e4ea9340Sjsing int
PEM_write_RSAPrivateKey(FILE * fp,RSA * x,const EVP_CIPHER * enc,unsigned char * kstr,int klen,pem_password_cb * cb,void * u)295e4ea9340Sjsing PEM_write_RSAPrivateKey(FILE *fp, RSA *x, const EVP_CIPHER *enc,
296e4ea9340Sjsing     unsigned char *kstr, int klen, pem_password_cb *cb, void *u)
297e4ea9340Sjsing {
298e4ea9340Sjsing         return PEM_ASN1_write((i2d_of_void *)i2d_RSAPrivateKey, PEM_STRING_RSA, fp,
299e4ea9340Sjsing 	    x, enc, kstr, klen, cb, u);
300e4ea9340Sjsing }
301*4a925a6aSbeck LCRYPTO_ALIAS(PEM_write_RSAPrivateKey);
302e4ea9340Sjsing 
303e4ea9340Sjsing RSA *
PEM_read_bio_RSAPrivateKey(BIO * bp,RSA ** rsa,pem_password_cb * cb,void * u)30400ad794dSjsing PEM_read_bio_RSAPrivateKey(BIO *bp, RSA **rsa, pem_password_cb *cb, void *u)
305e4ea9340Sjsing {
30600ad794dSjsing 	EVP_PKEY *pktmp;
30700ad794dSjsing 
30800ad794dSjsing 	pktmp = PEM_read_bio_PrivateKey(bp, NULL, cb, u);
30900ad794dSjsing 	return pkey_get_rsa(pktmp, rsa);
31000ad794dSjsing }
311*4a925a6aSbeck LCRYPTO_ALIAS(PEM_read_bio_RSAPrivateKey);
31200ad794dSjsing 
31300ad794dSjsing int
PEM_write_bio_RSAPrivateKey(BIO * bp,RSA * x,const EVP_CIPHER * enc,unsigned char * kstr,int klen,pem_password_cb * cb,void * u)31400ad794dSjsing PEM_write_bio_RSAPrivateKey(BIO *bp, RSA *x,
31500ad794dSjsing     const EVP_CIPHER *enc, unsigned char *kstr, int klen, pem_password_cb *cb,
31600ad794dSjsing     void *u)
31700ad794dSjsing {
31800ad794dSjsing 	return PEM_ASN1_write_bio((i2d_of_void *)i2d_RSAPrivateKey, PEM_STRING_RSA, bp,
31900ad794dSjsing 	    x, enc, kstr, klen, cb, u);
320e4ea9340Sjsing }
321*4a925a6aSbeck LCRYPTO_ALIAS(PEM_write_bio_RSAPrivateKey);
322e4ea9340Sjsing 
323e4ea9340Sjsing RSA *
PEM_read_RSAPublicKey(FILE * fp,RSA ** x,pem_password_cb * cb,void * u)324e4ea9340Sjsing PEM_read_RSAPublicKey(FILE *fp, RSA **x, pem_password_cb *cb, void *u)
325e4ea9340Sjsing {
326e4ea9340Sjsing 	return PEM_ASN1_read((d2i_of_void *)d2i_RSAPublicKey, PEM_STRING_RSA_PUBLIC, fp,
327e4ea9340Sjsing 	    (void **)x, cb, u);
328e4ea9340Sjsing }
329*4a925a6aSbeck LCRYPTO_ALIAS(PEM_read_RSAPublicKey);
330e4ea9340Sjsing 
331e4ea9340Sjsing int
PEM_write_RSAPublicKey(FILE * fp,const RSA * x)332e4ea9340Sjsing PEM_write_RSAPublicKey(FILE *fp, const RSA *x)
333e4ea9340Sjsing {
334e4ea9340Sjsing 	return PEM_ASN1_write((i2d_of_void *)i2d_RSAPublicKey, PEM_STRING_RSA_PUBLIC, fp,
335e4ea9340Sjsing 	    (void *)x, NULL, NULL, 0, NULL, NULL);
336e4ea9340Sjsing }
337*4a925a6aSbeck LCRYPTO_ALIAS(PEM_write_RSAPublicKey);
338e4ea9340Sjsing 
339e4ea9340Sjsing RSA *
PEM_read_bio_RSAPublicKey(BIO * bp,RSA ** x,pem_password_cb * cb,void * u)34000ad794dSjsing PEM_read_bio_RSAPublicKey(BIO *bp, RSA **x, pem_password_cb *cb, void *u)
341e4ea9340Sjsing {
34200ad794dSjsing 	return PEM_ASN1_read_bio((d2i_of_void *)d2i_RSAPublicKey, PEM_STRING_RSA_PUBLIC, bp,
343e4ea9340Sjsing 	    (void **)x, cb, u);
344e4ea9340Sjsing }
345*4a925a6aSbeck LCRYPTO_ALIAS(PEM_read_bio_RSAPublicKey);
346e4ea9340Sjsing 
34700ad794dSjsing int
PEM_write_bio_RSAPublicKey(BIO * bp,const RSA * x)34800ad794dSjsing PEM_write_bio_RSAPublicKey(BIO *bp, const RSA *x)
34900ad794dSjsing {
35000ad794dSjsing 	return PEM_ASN1_write_bio((i2d_of_void *)i2d_RSAPublicKey, PEM_STRING_RSA_PUBLIC, bp,
35100ad794dSjsing 	    (void *)x, NULL, NULL, 0, NULL, NULL);
35200ad794dSjsing }
353*4a925a6aSbeck LCRYPTO_ALIAS(PEM_write_bio_RSAPublicKey);
35400ad794dSjsing 
355e4ea9340Sjsing RSA *
PEM_read_RSA_PUBKEY(FILE * fp,RSA ** x,pem_password_cb * cb,void * u)356e4ea9340Sjsing PEM_read_RSA_PUBKEY(FILE *fp, RSA **x, pem_password_cb *cb, void *u)
357e4ea9340Sjsing {
358e4ea9340Sjsing 	return PEM_ASN1_read((d2i_of_void *)d2i_RSA_PUBKEY, PEM_STRING_PUBLIC, fp,
359e4ea9340Sjsing 	    (void **)x, cb, u);
360e4ea9340Sjsing }
361*4a925a6aSbeck LCRYPTO_ALIAS(PEM_read_RSA_PUBKEY);
362e4ea9340Sjsing 
363e4ea9340Sjsing int
PEM_write_RSA_PUBKEY(FILE * fp,RSA * x)364e4ea9340Sjsing PEM_write_RSA_PUBKEY(FILE *fp, RSA *x)
365e4ea9340Sjsing {
366e4ea9340Sjsing 	return PEM_ASN1_write((i2d_of_void *)i2d_RSA_PUBKEY, PEM_STRING_PUBLIC, fp,
367e4ea9340Sjsing 	    x, NULL, NULL, 0, NULL, NULL);
368e4ea9340Sjsing }
369*4a925a6aSbeck LCRYPTO_ALIAS(PEM_write_RSA_PUBKEY);
370913ec974Sbeck 
37100ad794dSjsing RSA *
PEM_read_bio_RSA_PUBKEY(BIO * bp,RSA ** x,pem_password_cb * cb,void * u)37200ad794dSjsing PEM_read_bio_RSA_PUBKEY(BIO *bp, RSA **x, pem_password_cb *cb, void *u)
37300ad794dSjsing {
37400ad794dSjsing 	return PEM_ASN1_read_bio((d2i_of_void *)d2i_RSA_PUBKEY, PEM_STRING_PUBLIC, bp,
37500ad794dSjsing 	    (void **)x, cb, u);
37600ad794dSjsing }
377*4a925a6aSbeck LCRYPTO_ALIAS(PEM_read_bio_RSA_PUBKEY);
37800ad794dSjsing 
37900ad794dSjsing int
PEM_write_bio_RSA_PUBKEY(BIO * bp,RSA * x)38000ad794dSjsing PEM_write_bio_RSA_PUBKEY(BIO *bp, RSA *x)
38100ad794dSjsing {
38200ad794dSjsing 	return PEM_ASN1_write_bio((i2d_of_void *)i2d_RSA_PUBKEY, PEM_STRING_PUBLIC, bp,
38300ad794dSjsing 	    x, NULL, NULL, 0, NULL, NULL);
38400ad794dSjsing }
385*4a925a6aSbeck LCRYPTO_ALIAS(PEM_write_bio_RSA_PUBKEY);
38600ad794dSjsing 
3875b37fcf3Sryker #endif
3885b37fcf3Sryker 
389da347917Sbeck #ifndef OPENSSL_NO_DSA
390913ec974Sbeck 
391a8b5ceceSjsing static DSA *
pkey_get_dsa(EVP_PKEY * key,DSA ** dsa)392a8b5ceceSjsing pkey_get_dsa(EVP_PKEY *key, DSA **dsa)
393ba5406e9Sbeck {
394ba5406e9Sbeck 	DSA *dtmp;
395a8b5ceceSjsing 
396a8b5ceceSjsing 	if (!key)
397a8b5ceceSjsing 		return NULL;
398ba5406e9Sbeck 	dtmp = EVP_PKEY_get1_DSA(key);
399ba5406e9Sbeck 	EVP_PKEY_free(key);
400a8b5ceceSjsing 	if (!dtmp)
401a8b5ceceSjsing 		return NULL;
402ba5406e9Sbeck 	if (dsa) {
403ba5406e9Sbeck 		DSA_free(*dsa);
404ba5406e9Sbeck 		*dsa = dtmp;
405ba5406e9Sbeck 	}
406ba5406e9Sbeck 	return dtmp;
407ba5406e9Sbeck }
408ba5406e9Sbeck 
409a8b5ceceSjsing DSA *
PEM_read_DSAPrivateKey(FILE * fp,DSA ** dsa,pem_password_cb * cb,void * u)41000ad794dSjsing PEM_read_DSAPrivateKey(FILE *fp, DSA **dsa, pem_password_cb *cb, void *u)
411ba5406e9Sbeck {
412ba5406e9Sbeck 	EVP_PKEY *pktmp;
413a8b5ceceSjsing 
41400ad794dSjsing 	pktmp = PEM_read_PrivateKey(fp, NULL, cb, u);
4150a5d6edeSdjm 	return pkey_get_dsa(pktmp, dsa);	/* will free pktmp */
416ba5406e9Sbeck }
417*4a925a6aSbeck LCRYPTO_ALIAS(PEM_read_DSAPrivateKey);
418ba5406e9Sbeck 
419e4ea9340Sjsing int
PEM_write_DSAPrivateKey(FILE * fp,DSA * x,const EVP_CIPHER * enc,unsigned char * kstr,int klen,pem_password_cb * cb,void * u)420e4ea9340Sjsing PEM_write_DSAPrivateKey(FILE *fp, DSA *x, const EVP_CIPHER *enc,
421e4ea9340Sjsing     unsigned char *kstr, int klen, pem_password_cb *cb, void *u)
422e4ea9340Sjsing {
423e4ea9340Sjsing         return PEM_ASN1_write((i2d_of_void *)i2d_DSAPrivateKey, PEM_STRING_DSA, fp,
424e4ea9340Sjsing 	    x, enc, kstr, klen, cb, u);
425e4ea9340Sjsing }
426*4a925a6aSbeck LCRYPTO_ALIAS(PEM_write_DSAPrivateKey);
427e4ea9340Sjsing 
428e4ea9340Sjsing DSA *
PEM_read_bio_DSAPrivateKey(BIO * bp,DSA ** dsa,pem_password_cb * cb,void * u)42900ad794dSjsing PEM_read_bio_DSAPrivateKey(BIO *bp, DSA **dsa, pem_password_cb *cb, void *u)
430e4ea9340Sjsing {
43100ad794dSjsing 	EVP_PKEY *pktmp;
43200ad794dSjsing 
43300ad794dSjsing 	pktmp = PEM_read_bio_PrivateKey(bp, NULL, cb, u);
43400ad794dSjsing 	return pkey_get_dsa(pktmp, dsa);	/* will free pktmp */
43500ad794dSjsing }
436*4a925a6aSbeck LCRYPTO_ALIAS(PEM_read_bio_DSAPrivateKey);
43700ad794dSjsing 
43800ad794dSjsing int
PEM_write_bio_DSAPrivateKey(BIO * bp,DSA * x,const EVP_CIPHER * enc,unsigned char * kstr,int klen,pem_password_cb * cb,void * u)43900ad794dSjsing PEM_write_bio_DSAPrivateKey(BIO *bp, DSA *x,
44000ad794dSjsing     const EVP_CIPHER *enc, unsigned char *kstr, int klen, pem_password_cb *cb,
44100ad794dSjsing     void *u)
44200ad794dSjsing {
44300ad794dSjsing 	return PEM_ASN1_write_bio((i2d_of_void *)i2d_DSAPrivateKey, PEM_STRING_DSA, bp,
44400ad794dSjsing 	    x, enc, kstr, klen, cb, u);
445e4ea9340Sjsing }
446*4a925a6aSbeck LCRYPTO_ALIAS(PEM_write_bio_DSAPrivateKey);
447e4ea9340Sjsing 
448e4ea9340Sjsing DSA *
PEM_read_DSA_PUBKEY(FILE * fp,DSA ** x,pem_password_cb * cb,void * u)449e4ea9340Sjsing PEM_read_DSA_PUBKEY(FILE *fp, DSA **x, pem_password_cb *cb, void *u)
450e4ea9340Sjsing {
451e4ea9340Sjsing 	return PEM_ASN1_read((d2i_of_void *)d2i_DSA_PUBKEY, PEM_STRING_PUBLIC, fp,
452e4ea9340Sjsing 	    (void **)x, cb, u);
453e4ea9340Sjsing }
454*4a925a6aSbeck LCRYPTO_ALIAS(PEM_read_DSA_PUBKEY);
455e4ea9340Sjsing 
456e4ea9340Sjsing int
PEM_write_DSA_PUBKEY(FILE * fp,DSA * x)457e4ea9340Sjsing PEM_write_DSA_PUBKEY(FILE *fp, DSA *x)
458e4ea9340Sjsing {
459e4ea9340Sjsing 	return PEM_ASN1_write((i2d_of_void *)i2d_DSA_PUBKEY, PEM_STRING_PUBLIC, fp,
460e4ea9340Sjsing 	    x, NULL, NULL, 0, NULL, NULL);
461e4ea9340Sjsing }
462*4a925a6aSbeck LCRYPTO_ALIAS(PEM_write_DSA_PUBKEY);
463ba5406e9Sbeck 
46400ad794dSjsing int
PEM_write_bio_DSA_PUBKEY(BIO * bp,DSA * x)46500ad794dSjsing PEM_write_bio_DSA_PUBKEY(BIO *bp, DSA *x)
466ba5406e9Sbeck {
46700ad794dSjsing 	return PEM_ASN1_write_bio((i2d_of_void *)i2d_DSA_PUBKEY, PEM_STRING_PUBLIC, bp,
46800ad794dSjsing 	    x, NULL, NULL, 0, NULL, NULL);
469ba5406e9Sbeck }
470*4a925a6aSbeck LCRYPTO_ALIAS(PEM_write_bio_DSA_PUBKEY);
471ba5406e9Sbeck 
472e4ea9340Sjsing DSA *
PEM_read_bio_DSA_PUBKEY(BIO * bp,DSA ** x,pem_password_cb * cb,void * u)47300ad794dSjsing PEM_read_bio_DSA_PUBKEY(BIO *bp, DSA **x, pem_password_cb *cb, void *u)
474e4ea9340Sjsing {
47500ad794dSjsing 	return PEM_ASN1_read_bio((d2i_of_void *)d2i_DSA_PUBKEY, PEM_STRING_PUBLIC, bp,
476e4ea9340Sjsing 	    (void **)x, cb, u);
477e4ea9340Sjsing }
478*4a925a6aSbeck LCRYPTO_ALIAS(PEM_read_bio_DSA_PUBKEY);
479e4ea9340Sjsing 
480e4ea9340Sjsing DSA *
PEM_read_DSAparams(FILE * fp,DSA ** x,pem_password_cb * cb,void * u)481e4ea9340Sjsing PEM_read_DSAparams(FILE *fp, DSA **x, pem_password_cb *cb, void *u)
482e4ea9340Sjsing {
483e4ea9340Sjsing 	return PEM_ASN1_read((d2i_of_void *)d2i_DSAparams, PEM_STRING_DSAPARAMS, fp,
484e4ea9340Sjsing 	    (void **)x, cb, u);
485e4ea9340Sjsing }
486*4a925a6aSbeck LCRYPTO_ALIAS(PEM_read_DSAparams);
487e4ea9340Sjsing 
488e4ea9340Sjsing int
PEM_write_DSAparams(FILE * fp,const DSA * x)489e4ea9340Sjsing PEM_write_DSAparams(FILE *fp, const DSA *x)
490e4ea9340Sjsing {
491e4ea9340Sjsing 	return PEM_ASN1_write((i2d_of_void *)i2d_DSAparams, PEM_STRING_DSAPARAMS, fp,
492e4ea9340Sjsing 	    (void *)x, NULL, NULL, 0, NULL, NULL);
493e4ea9340Sjsing }
494*4a925a6aSbeck LCRYPTO_ALIAS(PEM_write_DSAparams);
4954fcf65c5Sdjm 
49600ad794dSjsing DSA *
PEM_read_bio_DSAparams(BIO * bp,DSA ** x,pem_password_cb * cb,void * u)49700ad794dSjsing PEM_read_bio_DSAparams(BIO *bp, DSA **x, pem_password_cb *cb, void *u)
49800ad794dSjsing {
49900ad794dSjsing 	return PEM_ASN1_read_bio((d2i_of_void *)d2i_DSAparams, PEM_STRING_DSAPARAMS, bp,
50000ad794dSjsing 	    (void **)x, cb, u);
50100ad794dSjsing }
502*4a925a6aSbeck LCRYPTO_ALIAS(PEM_read_bio_DSAparams);
50300ad794dSjsing 
50400ad794dSjsing int
PEM_write_bio_DSAparams(BIO * bp,const DSA * x)50500ad794dSjsing PEM_write_bio_DSAparams(BIO *bp, const DSA *x)
50600ad794dSjsing {
50700ad794dSjsing 	return PEM_ASN1_write_bio((i2d_of_void *)i2d_DSAparams, PEM_STRING_DSAPARAMS, bp,
50800ad794dSjsing 	    (void *)x, NULL, NULL, 0, NULL, NULL);
50900ad794dSjsing }
510*4a925a6aSbeck LCRYPTO_ALIAS(PEM_write_bio_DSAparams);
51100ad794dSjsing 
5124fcf65c5Sdjm #endif
5134fcf65c5Sdjm 
5144fcf65c5Sdjm 
5154fcf65c5Sdjm #ifndef OPENSSL_NO_EC
516a8b5ceceSjsing static EC_KEY *
pkey_get_eckey(EVP_PKEY * key,EC_KEY ** eckey)517a8b5ceceSjsing pkey_get_eckey(EVP_PKEY *key, EC_KEY **eckey)
5184fcf65c5Sdjm {
5194fcf65c5Sdjm 	EC_KEY *dtmp;
520a8b5ceceSjsing 
521a8b5ceceSjsing 	if (!key)
522a8b5ceceSjsing 		return NULL;
5234fcf65c5Sdjm 	dtmp = EVP_PKEY_get1_EC_KEY(key);
5244fcf65c5Sdjm 	EVP_PKEY_free(key);
525a8b5ceceSjsing 	if (!dtmp)
526a8b5ceceSjsing 		return NULL;
527a8b5ceceSjsing 	if (eckey) {
5284fcf65c5Sdjm 		EC_KEY_free(*eckey);
5294fcf65c5Sdjm 		*eckey = dtmp;
5304fcf65c5Sdjm 	}
5314fcf65c5Sdjm 	return dtmp;
5324fcf65c5Sdjm }
5334fcf65c5Sdjm 
53400ad794dSjsing EC_GROUP *
PEM_read_ECPKParameters(FILE * fp,EC_GROUP ** x,pem_password_cb * cb,void * u)53500ad794dSjsing PEM_read_ECPKParameters(FILE *fp, EC_GROUP **x, pem_password_cb *cb, void *u)
5364fcf65c5Sdjm {
53700ad794dSjsing 	return PEM_ASN1_read((d2i_of_void *)d2i_ECPKParameters, PEM_STRING_ECPARAMETERS, fp,
53800ad794dSjsing 	    (void **)x, cb, u);
5394fcf65c5Sdjm }
540*4a925a6aSbeck LCRYPTO_ALIAS(PEM_read_ECPKParameters);
5414fcf65c5Sdjm 
54200ad794dSjsing int
PEM_write_ECPKParameters(FILE * fp,const EC_GROUP * x)54300ad794dSjsing PEM_write_ECPKParameters(FILE *fp, const EC_GROUP *x)
54400ad794dSjsing {
54500ad794dSjsing 	return PEM_ASN1_write((i2d_of_void *)i2d_ECPKParameters, PEM_STRING_ECPARAMETERS, fp,
54600ad794dSjsing 	    (void *)x, NULL, NULL, 0, NULL, NULL);
54700ad794dSjsing }
548*4a925a6aSbeck LCRYPTO_ALIAS(PEM_write_ECPKParameters);
5494fcf65c5Sdjm 
550e4ea9340Sjsing EC_GROUP *
PEM_read_bio_ECPKParameters(BIO * bp,EC_GROUP ** x,pem_password_cb * cb,void * u)551e4ea9340Sjsing PEM_read_bio_ECPKParameters(BIO *bp, EC_GROUP **x, pem_password_cb *cb, void *u)
552e4ea9340Sjsing {
553e4ea9340Sjsing 	return PEM_ASN1_read_bio((d2i_of_void *)d2i_ECPKParameters, PEM_STRING_ECPARAMETERS, bp,
554e4ea9340Sjsing 	    (void **)x, cb, u);
555e4ea9340Sjsing }
556*4a925a6aSbeck LCRYPTO_ALIAS(PEM_read_bio_ECPKParameters);
5574fcf65c5Sdjm 
558e4ea9340Sjsing int
PEM_write_bio_ECPKParameters(BIO * bp,const EC_GROUP * x)559e4ea9340Sjsing PEM_write_bio_ECPKParameters(BIO *bp, const EC_GROUP *x)
560e4ea9340Sjsing {
561e4ea9340Sjsing 	return PEM_ASN1_write_bio((i2d_of_void *)i2d_ECPKParameters, PEM_STRING_ECPARAMETERS, bp,
562e4ea9340Sjsing 	    (void *)x, NULL, NULL, 0, NULL, NULL);
563e4ea9340Sjsing }
564*4a925a6aSbeck LCRYPTO_ALIAS(PEM_write_bio_ECPKParameters);
565e4ea9340Sjsing 
56600ad794dSjsing EC_KEY *
PEM_read_ECPrivateKey(FILE * fp,EC_KEY ** eckey,pem_password_cb * cb,void * u)56700ad794dSjsing PEM_read_ECPrivateKey(FILE *fp, EC_KEY **eckey, pem_password_cb *cb, void *u)
568e4ea9340Sjsing {
56900ad794dSjsing 	EVP_PKEY *pktmp;
570e4ea9340Sjsing 
57100ad794dSjsing 	pktmp = PEM_read_PrivateKey(fp, NULL, cb, u);
57200ad794dSjsing 	return pkey_get_eckey(pktmp, eckey);	/* will free pktmp */
573e4ea9340Sjsing }
574*4a925a6aSbeck LCRYPTO_ALIAS(PEM_read_ECPrivateKey);
575e4ea9340Sjsing 
576e4ea9340Sjsing int
PEM_write_ECPrivateKey(FILE * fp,EC_KEY * x,const EVP_CIPHER * enc,unsigned char * kstr,int klen,pem_password_cb * cb,void * u)577e4ea9340Sjsing PEM_write_ECPrivateKey(FILE *fp, EC_KEY *x, const EVP_CIPHER *enc,
578e4ea9340Sjsing     unsigned char *kstr, int klen, pem_password_cb *cb, void *u)
579e4ea9340Sjsing {
580e4ea9340Sjsing         return PEM_ASN1_write((i2d_of_void *)i2d_ECPrivateKey, PEM_STRING_ECPRIVATEKEY, fp,
581e4ea9340Sjsing 	    x, enc, kstr, klen, cb, u);
582e4ea9340Sjsing }
583*4a925a6aSbeck LCRYPTO_ALIAS(PEM_write_ECPrivateKey);
584e4ea9340Sjsing 
585e4ea9340Sjsing EC_KEY *
PEM_read_bio_ECPrivateKey(BIO * bp,EC_KEY ** key,pem_password_cb * cb,void * u)58600ad794dSjsing PEM_read_bio_ECPrivateKey(BIO *bp, EC_KEY **key, pem_password_cb *cb, void *u)
587e4ea9340Sjsing {
58800ad794dSjsing 	EVP_PKEY *pktmp;
58900ad794dSjsing 	pktmp = PEM_read_bio_PrivateKey(bp, NULL, cb, u);
59000ad794dSjsing 	return pkey_get_eckey(pktmp, key);	/* will free pktmp */
59100ad794dSjsing }
592*4a925a6aSbeck LCRYPTO_ALIAS(PEM_read_bio_ECPrivateKey);
59300ad794dSjsing 
59400ad794dSjsing int
PEM_write_bio_ECPrivateKey(BIO * bp,EC_KEY * x,const EVP_CIPHER * enc,unsigned char * kstr,int klen,pem_password_cb * cb,void * u)59500ad794dSjsing PEM_write_bio_ECPrivateKey(BIO *bp, EC_KEY *x,
59600ad794dSjsing     const EVP_CIPHER *enc, unsigned char *kstr, int klen, pem_password_cb *cb,
59700ad794dSjsing     void *u)
59800ad794dSjsing {
59900ad794dSjsing 	return PEM_ASN1_write_bio((i2d_of_void *)i2d_ECPrivateKey, PEM_STRING_ECPRIVATEKEY, bp,
60000ad794dSjsing 	    x, enc, kstr, klen, cb, u);
601e4ea9340Sjsing }
602*4a925a6aSbeck LCRYPTO_ALIAS(PEM_write_bio_ECPrivateKey);
603e4ea9340Sjsing 
604e4ea9340Sjsing EC_KEY *
PEM_read_EC_PUBKEY(FILE * fp,EC_KEY ** x,pem_password_cb * cb,void * u)605e4ea9340Sjsing PEM_read_EC_PUBKEY(FILE *fp, EC_KEY **x, pem_password_cb *cb, void *u)
606e4ea9340Sjsing {
607e4ea9340Sjsing 	return PEM_ASN1_read((d2i_of_void *)d2i_EC_PUBKEY, PEM_STRING_PUBLIC, fp,
608e4ea9340Sjsing 	    (void **)x, cb, u);
609e4ea9340Sjsing }
610*4a925a6aSbeck LCRYPTO_ALIAS(PEM_read_EC_PUBKEY);
611e4ea9340Sjsing 
612e4ea9340Sjsing int
PEM_write_EC_PUBKEY(FILE * fp,EC_KEY * x)613e4ea9340Sjsing PEM_write_EC_PUBKEY(FILE *fp, EC_KEY *x)
614e4ea9340Sjsing {
615e4ea9340Sjsing 	return PEM_ASN1_write((i2d_of_void *)i2d_EC_PUBKEY, PEM_STRING_PUBLIC, fp,
616e4ea9340Sjsing 	    x, NULL, NULL, 0, NULL, NULL);
617e4ea9340Sjsing }
618*4a925a6aSbeck LCRYPTO_ALIAS(PEM_write_EC_PUBKEY);
6194fcf65c5Sdjm 
620a8b5ceceSjsing EC_KEY *
PEM_read_bio_EC_PUBKEY(BIO * bp,EC_KEY ** x,pem_password_cb * cb,void * u)62100ad794dSjsing PEM_read_bio_EC_PUBKEY(BIO *bp, EC_KEY **x, pem_password_cb *cb, void *u)
6224fcf65c5Sdjm {
62300ad794dSjsing 	return PEM_ASN1_read_bio((d2i_of_void *)d2i_EC_PUBKEY, PEM_STRING_PUBLIC, bp,
62400ad794dSjsing 	    (void **)x, cb, u);
6254fcf65c5Sdjm }
626*4a925a6aSbeck LCRYPTO_ALIAS(PEM_read_bio_EC_PUBKEY);
6274fcf65c5Sdjm 
62800ad794dSjsing int
PEM_write_bio_EC_PUBKEY(BIO * bp,EC_KEY * x)62900ad794dSjsing PEM_write_bio_EC_PUBKEY(BIO *bp, EC_KEY *x)
63000ad794dSjsing {
63100ad794dSjsing 	return PEM_ASN1_write_bio((i2d_of_void *)i2d_EC_PUBKEY, PEM_STRING_PUBLIC, bp,
63200ad794dSjsing 	    x, NULL, NULL, 0, NULL, NULL);
63300ad794dSjsing }
634*4a925a6aSbeck LCRYPTO_ALIAS(PEM_write_bio_EC_PUBKEY);
635913ec974Sbeck 
6365b37fcf3Sryker #endif
6375b37fcf3Sryker 
638da347917Sbeck #ifndef OPENSSL_NO_DH
639913ec974Sbeck 
64000ad794dSjsing DH *
PEM_read_DHparams(FILE * fp,DH ** x,pem_password_cb * cb,void * u)64100ad794dSjsing PEM_read_DHparams(FILE *fp, DH **x, pem_password_cb *cb, void *u)
64200ad794dSjsing {
64300ad794dSjsing 	return PEM_ASN1_read((d2i_of_void *)d2i_DHparams, PEM_STRING_DHPARAMS, fp,
64400ad794dSjsing 	    (void **)x, cb, u);
64500ad794dSjsing }
646*4a925a6aSbeck LCRYPTO_ALIAS(PEM_read_DHparams);
64700ad794dSjsing 
64800ad794dSjsing int
PEM_write_DHparams(FILE * fp,const DH * x)64900ad794dSjsing PEM_write_DHparams(FILE *fp, const DH *x)
65000ad794dSjsing {
65100ad794dSjsing 	return PEM_ASN1_write((i2d_of_void *)i2d_DHparams, PEM_STRING_DHPARAMS, fp,
65200ad794dSjsing 	    (void *)x, NULL, NULL, 0, NULL, NULL);
65300ad794dSjsing }
654*4a925a6aSbeck LCRYPTO_ALIAS(PEM_write_DHparams);
655e4ea9340Sjsing 
656e4ea9340Sjsing DH *
PEM_read_bio_DHparams(BIO * bp,DH ** x,pem_password_cb * cb,void * u)657e4ea9340Sjsing PEM_read_bio_DHparams(BIO *bp, DH **x, pem_password_cb *cb, void *u)
658e4ea9340Sjsing {
659e4ea9340Sjsing 	return PEM_ASN1_read_bio((d2i_of_void *)d2i_DHparams, PEM_STRING_DHPARAMS, bp,
660e4ea9340Sjsing 	    (void **)x, cb, u);
661e4ea9340Sjsing }
662*4a925a6aSbeck LCRYPTO_ALIAS(PEM_read_bio_DHparams);
663e4ea9340Sjsing 
664e4ea9340Sjsing int
PEM_write_bio_DHparams(BIO * bp,const DH * x)665e4ea9340Sjsing PEM_write_bio_DHparams(BIO *bp, const DH *x)
666e4ea9340Sjsing {
667e4ea9340Sjsing 	return PEM_ASN1_write_bio((i2d_of_void *)i2d_DHparams, PEM_STRING_DHPARAMS, bp,
668e4ea9340Sjsing 	    (void *)x, NULL, NULL, 0, NULL, NULL);
669e4ea9340Sjsing }
670*4a925a6aSbeck LCRYPTO_ALIAS(PEM_write_bio_DHparams);
671e4ea9340Sjsing 
6725b37fcf3Sryker #endif
6735b37fcf3Sryker 
674e4ea9340Sjsing EVP_PKEY *
PEM_read_PUBKEY(FILE * fp,EVP_PKEY ** x,pem_password_cb * cb,void * u)675e4ea9340Sjsing PEM_read_PUBKEY(FILE *fp, EVP_PKEY **x, pem_password_cb *cb, void *u)
676e4ea9340Sjsing {
677e4ea9340Sjsing 	return PEM_ASN1_read((d2i_of_void *)d2i_PUBKEY, PEM_STRING_PUBLIC, fp,
678e4ea9340Sjsing 	    (void **)x, cb, u);
679e4ea9340Sjsing }
680*4a925a6aSbeck LCRYPTO_ALIAS(PEM_read_PUBKEY);
681e4ea9340Sjsing 
682e4ea9340Sjsing int
PEM_write_PUBKEY(FILE * fp,EVP_PKEY * x)683e4ea9340Sjsing PEM_write_PUBKEY(FILE *fp, EVP_PKEY *x)
684e4ea9340Sjsing {
685e4ea9340Sjsing 	return PEM_ASN1_write((i2d_of_void *)i2d_PUBKEY, PEM_STRING_PUBLIC, fp,
686e4ea9340Sjsing 	    x, NULL, NULL, 0, NULL, NULL);
687e4ea9340Sjsing }
688*4a925a6aSbeck LCRYPTO_ALIAS(PEM_write_PUBKEY);
68900ad794dSjsing 
69000ad794dSjsing EVP_PKEY *
PEM_read_bio_PUBKEY(BIO * bp,EVP_PKEY ** x,pem_password_cb * cb,void * u)69100ad794dSjsing PEM_read_bio_PUBKEY(BIO *bp, EVP_PKEY **x, pem_password_cb *cb, void *u)
69200ad794dSjsing {
69300ad794dSjsing 	return PEM_ASN1_read_bio((d2i_of_void *)d2i_PUBKEY, PEM_STRING_PUBLIC, bp,
69400ad794dSjsing 	    (void **)x, cb, u);
69500ad794dSjsing }
696*4a925a6aSbeck LCRYPTO_ALIAS(PEM_read_bio_PUBKEY);
69700ad794dSjsing 
69800ad794dSjsing int
PEM_write_bio_PUBKEY(BIO * bp,EVP_PKEY * x)69900ad794dSjsing PEM_write_bio_PUBKEY(BIO *bp, EVP_PKEY *x)
70000ad794dSjsing {
70100ad794dSjsing 	return PEM_ASN1_write_bio((i2d_of_void *)i2d_PUBKEY, PEM_STRING_PUBLIC, bp,
70200ad794dSjsing 	    x, NULL, NULL, 0, NULL, NULL);
70300ad794dSjsing }
704*4a925a6aSbeck LCRYPTO_ALIAS(PEM_write_bio_PUBKEY);
705