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