1656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project/* crypto/pem/pem_all.c */
2656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project/* Copyright (C) 1995-1998 Eric Young (eay@cryptsoft.com)
3656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project * All rights reserved.
4656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project *
5656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project * This package is an SSL implementation written
6656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project * by Eric Young (eay@cryptsoft.com).
7656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project * The implementation was written so as to conform with Netscapes SSL.
8656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project *
9656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project * This library is free for commercial and non-commercial use as long as
10656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project * the following conditions are aheared to.  The following conditions
11656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project * apply to all code found in this distribution, be it the RC4, RSA,
12656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project * lhash, DES, etc., code; not just the SSL code.  The SSL documentation
13656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project * included with this distribution is covered by the same copyright terms
14656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project * except that the holder is Tim Hudson (tjh@cryptsoft.com).
15656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project *
16656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project * Copyright remains Eric Young's, and as such any Copyright notices in
17656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project * the code are not to be removed.
18656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project * If this package is used in a product, Eric Young should be given attribution
19656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project * as the author of the parts of the library used.
20656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project * This can be in the form of a textual message at program startup or
21656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project * in documentation (online or textual) provided with the package.
22656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project *
23656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project * Redistribution and use in source and binary forms, with or without
24656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project * modification, are permitted provided that the following conditions
25656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project * are met:
26656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project * 1. Redistributions of source code must retain the copyright
27656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project *    notice, this list of conditions and the following disclaimer.
28656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project * 2. Redistributions in binary form must reproduce the above copyright
29656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project *    notice, this list of conditions and the following disclaimer in the
30656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project *    documentation and/or other materials provided with the distribution.
31656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project * 3. All advertising materials mentioning features or use of this software
32656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project *    must display the following acknowledgement:
33656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project *    "This product includes cryptographic software written by
34656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project *     Eric Young (eay@cryptsoft.com)"
35656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project *    The word 'cryptographic' can be left out if the rouines from the library
36656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project *    being used are not cryptographic related :-).
37656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project * 4. If you include any Windows specific code (or a derivative thereof) from
38656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project *    the apps directory (application code) you must include an acknowledgement:
39656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project *    "This product includes software written by Tim Hudson (tjh@cryptsoft.com)"
40656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project *
41656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project * THIS SOFTWARE IS PROVIDED BY ERIC YOUNG ``AS IS'' AND
42656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
43656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
44656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project * ARE DISCLAIMED.  IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE
45656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
46656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
47656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
48656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
49656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
50656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
51656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project * SUCH DAMAGE.
52656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project *
53656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project * The licence and distribution terms for any publically available version or
54656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project * derivative of this code cannot be changed.  i.e. this code cannot simply be
55656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project * copied and put under another distribution licence
56656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project * [including the GNU Public Licence.]
57656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project */
58656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project/* ====================================================================
59656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project * Copyright (c) 1998-2002 The OpenSSL Project.  All rights reserved.
60656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project *
61656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project * Redistribution and use in source and binary forms, with or without
62656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project * modification, are permitted provided that the following conditions
63656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project * are met:
64656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project *
65656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project * 1. Redistributions of source code must retain the above copyright
66656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project *    notice, this list of conditions and the following disclaimer.
67656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project *
68656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project * 2. Redistributions in binary form must reproduce the above copyright
69656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project *    notice, this list of conditions and the following disclaimer in
70656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project *    the documentation and/or other materials provided with the
71656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project *    distribution.
72656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project *
73656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project * 3. All advertising materials mentioning features or use of this
74656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project *    software must display the following acknowledgment:
75656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project *    "This product includes software developed by the OpenSSL Project
76656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project *    for use in the OpenSSL Toolkit. (http://www.openssl.org/)"
77656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project *
78656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project * 4. The names "OpenSSL Toolkit" and "OpenSSL Project" must not be used to
79656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project *    endorse or promote products derived from this software without
80656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project *    prior written permission. For written permission, please contact
81656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project *    openssl-core@openssl.org.
82656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project *
83656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project * 5. Products derived from this software may not be called "OpenSSL"
84656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project *    nor may "OpenSSL" appear in their names without prior written
85656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project *    permission of the OpenSSL Project.
86656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project *
87656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project * 6. Redistributions of any form whatsoever must retain the following
88656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project *    acknowledgment:
89656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project *    "This product includes software developed by the OpenSSL Project
90656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project *    for use in the OpenSSL Toolkit (http://www.openssl.org/)"
91656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project *
92656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project * THIS SOFTWARE IS PROVIDED BY THE OpenSSL PROJECT ``AS IS'' AND ANY
93656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project * EXPRESSED OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
94656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
95656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project * PURPOSE ARE DISCLAIMED.  IN NO EVENT SHALL THE OpenSSL PROJECT OR
96656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project * ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
97656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
98656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
99656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
100656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT,
101656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
102656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED
103656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project * OF THE POSSIBILITY OF SUCH DAMAGE.
104656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project * ====================================================================
105656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project *
106656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project * This product includes cryptographic software written by Eric Young
107656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project * (eay@cryptsoft.com).  This product includes software written by Tim
108656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project * Hudson (tjh@cryptsoft.com).
109656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project *
110656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project */
111656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project
112656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project#include <stdio.h>
113656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project#include "cryptlib.h"
114656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project#include <openssl/bio.h>
115656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project#include <openssl/evp.h>
116656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project#include <openssl/x509.h>
117656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project#include <openssl/pkcs7.h>
118656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project#include <openssl/pem.h>
119656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project#ifndef OPENSSL_NO_RSA
120656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project#include <openssl/rsa.h>
121656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project#endif
122656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project#ifndef OPENSSL_NO_DSA
123656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project#include <openssl/dsa.h>
124656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project#endif
125656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project#ifndef OPENSSL_NO_DH
126656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project#include <openssl/dh.h>
127656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project#endif
128656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project
129656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project#ifndef OPENSSL_NO_RSA
130656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Projectstatic RSA *pkey_get_rsa(EVP_PKEY *key, RSA **rsa);
131656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project#endif
132656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project#ifndef OPENSSL_NO_DSA
133656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Projectstatic DSA *pkey_get_dsa(EVP_PKEY *key, DSA **dsa);
134656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project#endif
135656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project
136656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project#ifndef OPENSSL_NO_EC
137656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Projectstatic EC_KEY *pkey_get_eckey(EVP_PKEY *key, EC_KEY **eckey);
138656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project#endif
139656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project
140656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source ProjectIMPLEMENT_PEM_rw(X509_REQ, X509_REQ, PEM_STRING_X509_REQ, X509_REQ)
141656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project
142656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source ProjectIMPLEMENT_PEM_write(X509_REQ_NEW, X509_REQ, PEM_STRING_X509_REQ_OLD, X509_REQ)
143656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project
144656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source ProjectIMPLEMENT_PEM_rw(X509_CRL, X509_CRL, PEM_STRING_X509_CRL, X509_CRL)
145656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project
146656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source ProjectIMPLEMENT_PEM_rw(PKCS7, PKCS7, PEM_STRING_PKCS7, PKCS7)
147656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project
148656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source ProjectIMPLEMENT_PEM_rw(NETSCAPE_CERT_SEQUENCE, NETSCAPE_CERT_SEQUENCE,
149656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project					PEM_STRING_X509, NETSCAPE_CERT_SEQUENCE)
150656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project
151656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project
152656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project#ifndef OPENSSL_NO_RSA
153656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project
154656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project/* We treat RSA or DSA private keys as a special case.
155656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project *
156656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project * For private keys we read in an EVP_PKEY structure with
157656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project * PEM_read_bio_PrivateKey() and extract the relevant private
158656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project * key: this means can handle "traditional" and PKCS#8 formats
159656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project * transparently.
160656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project */
161656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project
162656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Projectstatic RSA *pkey_get_rsa(EVP_PKEY *key, RSA **rsa)
163656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project{
164656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	RSA *rtmp;
165656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	if(!key) return NULL;
166656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	rtmp = EVP_PKEY_get1_RSA(key);
167656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	EVP_PKEY_free(key);
168656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	if(!rtmp) return NULL;
169656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	if(rsa) {
170656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project		RSA_free(*rsa);
171656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project		*rsa = rtmp;
172656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	}
173656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	return rtmp;
174656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project}
175656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project
176656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source ProjectRSA *PEM_read_bio_RSAPrivateKey(BIO *bp, RSA **rsa, pem_password_cb *cb,
177656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project								void *u)
178656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project{
179656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	EVP_PKEY *pktmp;
180656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	pktmp = PEM_read_bio_PrivateKey(bp, NULL, cb, u);
181656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	return pkey_get_rsa(pktmp, rsa);
182656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project}
183656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project
184656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project#ifndef OPENSSL_NO_FP_API
185656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project
186656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source ProjectRSA *PEM_read_RSAPrivateKey(FILE *fp, RSA **rsa, pem_password_cb *cb,
187656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project								void *u)
188656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project{
189656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	EVP_PKEY *pktmp;
190656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	pktmp = PEM_read_PrivateKey(fp, NULL, cb, u);
191656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	return pkey_get_rsa(pktmp, rsa);
192656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project}
193656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project
194656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project#endif
195656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project
19604ef91b390dfcc6125913e2f2af502d23d7a5112Brian Carlstrom#ifdef OPENSSL_FIPS
19704ef91b390dfcc6125913e2f2af502d23d7a5112Brian Carlstrom
19804ef91b390dfcc6125913e2f2af502d23d7a5112Brian Carlstromint PEM_write_bio_RSAPrivateKey(BIO *bp, RSA *x, const EVP_CIPHER *enc,
19904ef91b390dfcc6125913e2f2af502d23d7a5112Brian Carlstrom                                               unsigned char *kstr, int klen,
20004ef91b390dfcc6125913e2f2af502d23d7a5112Brian Carlstrom                                               pem_password_cb *cb, void *u)
20104ef91b390dfcc6125913e2f2af502d23d7a5112Brian Carlstrom{
20204ef91b390dfcc6125913e2f2af502d23d7a5112Brian Carlstrom	if (FIPS_mode())
20304ef91b390dfcc6125913e2f2af502d23d7a5112Brian Carlstrom		{
20404ef91b390dfcc6125913e2f2af502d23d7a5112Brian Carlstrom		EVP_PKEY *k;
20504ef91b390dfcc6125913e2f2af502d23d7a5112Brian Carlstrom		int ret;
20604ef91b390dfcc6125913e2f2af502d23d7a5112Brian Carlstrom		k = EVP_PKEY_new();
20704ef91b390dfcc6125913e2f2af502d23d7a5112Brian Carlstrom		if (!k)
20804ef91b390dfcc6125913e2f2af502d23d7a5112Brian Carlstrom			return 0;
20904ef91b390dfcc6125913e2f2af502d23d7a5112Brian Carlstrom		EVP_PKEY_set1_RSA(k, x);
21004ef91b390dfcc6125913e2f2af502d23d7a5112Brian Carlstrom
21104ef91b390dfcc6125913e2f2af502d23d7a5112Brian Carlstrom		ret = PEM_write_bio_PrivateKey(bp, k, enc, kstr, klen, cb, u);
21204ef91b390dfcc6125913e2f2af502d23d7a5112Brian Carlstrom		EVP_PKEY_free(k);
21304ef91b390dfcc6125913e2f2af502d23d7a5112Brian Carlstrom		return ret;
21404ef91b390dfcc6125913e2f2af502d23d7a5112Brian Carlstrom		}
21504ef91b390dfcc6125913e2f2af502d23d7a5112Brian Carlstrom	else
21604ef91b390dfcc6125913e2f2af502d23d7a5112Brian Carlstrom		return PEM_ASN1_write_bio((i2d_of_void *)i2d_RSAPrivateKey,
21704ef91b390dfcc6125913e2f2af502d23d7a5112Brian Carlstrom					PEM_STRING_RSA,bp,x,enc,kstr,klen,cb,u);
21804ef91b390dfcc6125913e2f2af502d23d7a5112Brian Carlstrom}
21904ef91b390dfcc6125913e2f2af502d23d7a5112Brian Carlstrom
22004ef91b390dfcc6125913e2f2af502d23d7a5112Brian Carlstrom#ifndef OPENSSL_NO_FP_API
22104ef91b390dfcc6125913e2f2af502d23d7a5112Brian Carlstromint PEM_write_RSAPrivateKey(FILE *fp, RSA *x, const EVP_CIPHER *enc,
22204ef91b390dfcc6125913e2f2af502d23d7a5112Brian Carlstrom                                               unsigned char *kstr, int klen,
22304ef91b390dfcc6125913e2f2af502d23d7a5112Brian Carlstrom                                               pem_password_cb *cb, void *u)
22404ef91b390dfcc6125913e2f2af502d23d7a5112Brian Carlstrom{
22504ef91b390dfcc6125913e2f2af502d23d7a5112Brian Carlstrom	if (FIPS_mode())
22604ef91b390dfcc6125913e2f2af502d23d7a5112Brian Carlstrom		{
22704ef91b390dfcc6125913e2f2af502d23d7a5112Brian Carlstrom		EVP_PKEY *k;
22804ef91b390dfcc6125913e2f2af502d23d7a5112Brian Carlstrom		int ret;
22904ef91b390dfcc6125913e2f2af502d23d7a5112Brian Carlstrom		k = EVP_PKEY_new();
23004ef91b390dfcc6125913e2f2af502d23d7a5112Brian Carlstrom		if (!k)
23104ef91b390dfcc6125913e2f2af502d23d7a5112Brian Carlstrom			return 0;
23204ef91b390dfcc6125913e2f2af502d23d7a5112Brian Carlstrom
23304ef91b390dfcc6125913e2f2af502d23d7a5112Brian Carlstrom		EVP_PKEY_set1_RSA(k, x);
23404ef91b390dfcc6125913e2f2af502d23d7a5112Brian Carlstrom
23504ef91b390dfcc6125913e2f2af502d23d7a5112Brian Carlstrom		ret = PEM_write_PrivateKey(fp, k, enc, kstr, klen, cb, u);
23604ef91b390dfcc6125913e2f2af502d23d7a5112Brian Carlstrom		EVP_PKEY_free(k);
23704ef91b390dfcc6125913e2f2af502d23d7a5112Brian Carlstrom		return ret;
23804ef91b390dfcc6125913e2f2af502d23d7a5112Brian Carlstrom		}
23904ef91b390dfcc6125913e2f2af502d23d7a5112Brian Carlstrom	else
24004ef91b390dfcc6125913e2f2af502d23d7a5112Brian Carlstrom		return PEM_ASN1_write((i2d_of_void *)i2d_RSAPrivateKey,
24104ef91b390dfcc6125913e2f2af502d23d7a5112Brian Carlstrom					PEM_STRING_RSA,fp,x,enc,kstr,klen,cb,u);
24204ef91b390dfcc6125913e2f2af502d23d7a5112Brian Carlstrom}
24304ef91b390dfcc6125913e2f2af502d23d7a5112Brian Carlstrom#endif
24404ef91b390dfcc6125913e2f2af502d23d7a5112Brian Carlstrom
24504ef91b390dfcc6125913e2f2af502d23d7a5112Brian Carlstrom#else
24604ef91b390dfcc6125913e2f2af502d23d7a5112Brian Carlstrom
247656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source ProjectIMPLEMENT_PEM_write_cb_const(RSAPrivateKey, RSA, PEM_STRING_RSA, RSAPrivateKey)
24804ef91b390dfcc6125913e2f2af502d23d7a5112Brian Carlstrom
24904ef91b390dfcc6125913e2f2af502d23d7a5112Brian Carlstrom#endif
25004ef91b390dfcc6125913e2f2af502d23d7a5112Brian Carlstrom
251656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source ProjectIMPLEMENT_PEM_rw_const(RSAPublicKey, RSA, PEM_STRING_RSA_PUBLIC, RSAPublicKey)
252656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source ProjectIMPLEMENT_PEM_rw(RSA_PUBKEY, RSA, PEM_STRING_PUBLIC, RSA_PUBKEY)
253656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project
254656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project#endif
255656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project
256656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project#ifndef OPENSSL_NO_DSA
257656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project
258656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Projectstatic DSA *pkey_get_dsa(EVP_PKEY *key, DSA **dsa)
259656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project{
260656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	DSA *dtmp;
261656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	if(!key) return NULL;
262656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	dtmp = EVP_PKEY_get1_DSA(key);
263656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	EVP_PKEY_free(key);
264656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	if(!dtmp) return NULL;
265656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	if(dsa) {
266656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project		DSA_free(*dsa);
267656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project		*dsa = dtmp;
268656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	}
269656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	return dtmp;
270656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project}
271656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project
272656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source ProjectDSA *PEM_read_bio_DSAPrivateKey(BIO *bp, DSA **dsa, pem_password_cb *cb,
273656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project								void *u)
274656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project{
275656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	EVP_PKEY *pktmp;
276656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	pktmp = PEM_read_bio_PrivateKey(bp, NULL, cb, u);
277221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom	return pkey_get_dsa(pktmp, dsa);	/* will free pktmp */
278656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project}
279656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project
28004ef91b390dfcc6125913e2f2af502d23d7a5112Brian Carlstrom#ifdef OPENSSL_FIPS
28104ef91b390dfcc6125913e2f2af502d23d7a5112Brian Carlstrom
28204ef91b390dfcc6125913e2f2af502d23d7a5112Brian Carlstromint PEM_write_bio_DSAPrivateKey(BIO *bp, DSA *x, const EVP_CIPHER *enc,
28304ef91b390dfcc6125913e2f2af502d23d7a5112Brian Carlstrom                                               unsigned char *kstr, int klen,
28404ef91b390dfcc6125913e2f2af502d23d7a5112Brian Carlstrom                                               pem_password_cb *cb, void *u)
28504ef91b390dfcc6125913e2f2af502d23d7a5112Brian Carlstrom{
28604ef91b390dfcc6125913e2f2af502d23d7a5112Brian Carlstrom	if (FIPS_mode())
28704ef91b390dfcc6125913e2f2af502d23d7a5112Brian Carlstrom		{
28804ef91b390dfcc6125913e2f2af502d23d7a5112Brian Carlstrom		EVP_PKEY *k;
28904ef91b390dfcc6125913e2f2af502d23d7a5112Brian Carlstrom		int ret;
29004ef91b390dfcc6125913e2f2af502d23d7a5112Brian Carlstrom		k = EVP_PKEY_new();
29104ef91b390dfcc6125913e2f2af502d23d7a5112Brian Carlstrom		if (!k)
29204ef91b390dfcc6125913e2f2af502d23d7a5112Brian Carlstrom			return 0;
29304ef91b390dfcc6125913e2f2af502d23d7a5112Brian Carlstrom		EVP_PKEY_set1_DSA(k, x);
29404ef91b390dfcc6125913e2f2af502d23d7a5112Brian Carlstrom
29504ef91b390dfcc6125913e2f2af502d23d7a5112Brian Carlstrom		ret = PEM_write_bio_PrivateKey(bp, k, enc, kstr, klen, cb, u);
29604ef91b390dfcc6125913e2f2af502d23d7a5112Brian Carlstrom		EVP_PKEY_free(k);
29704ef91b390dfcc6125913e2f2af502d23d7a5112Brian Carlstrom		return ret;
29804ef91b390dfcc6125913e2f2af502d23d7a5112Brian Carlstrom		}
29904ef91b390dfcc6125913e2f2af502d23d7a5112Brian Carlstrom	else
30004ef91b390dfcc6125913e2f2af502d23d7a5112Brian Carlstrom		return PEM_ASN1_write_bio((i2d_of_void *)i2d_DSAPrivateKey,
30104ef91b390dfcc6125913e2f2af502d23d7a5112Brian Carlstrom					PEM_STRING_DSA,bp,x,enc,kstr,klen,cb,u);
30204ef91b390dfcc6125913e2f2af502d23d7a5112Brian Carlstrom}
30304ef91b390dfcc6125913e2f2af502d23d7a5112Brian Carlstrom
30404ef91b390dfcc6125913e2f2af502d23d7a5112Brian Carlstrom#ifndef OPENSSL_NO_FP_API
30504ef91b390dfcc6125913e2f2af502d23d7a5112Brian Carlstromint PEM_write_DSAPrivateKey(FILE *fp, DSA *x, const EVP_CIPHER *enc,
30604ef91b390dfcc6125913e2f2af502d23d7a5112Brian Carlstrom                                               unsigned char *kstr, int klen,
30704ef91b390dfcc6125913e2f2af502d23d7a5112Brian Carlstrom                                               pem_password_cb *cb, void *u)
30804ef91b390dfcc6125913e2f2af502d23d7a5112Brian Carlstrom{
30904ef91b390dfcc6125913e2f2af502d23d7a5112Brian Carlstrom	if (FIPS_mode())
31004ef91b390dfcc6125913e2f2af502d23d7a5112Brian Carlstrom		{
31104ef91b390dfcc6125913e2f2af502d23d7a5112Brian Carlstrom		EVP_PKEY *k;
31204ef91b390dfcc6125913e2f2af502d23d7a5112Brian Carlstrom		int ret;
31304ef91b390dfcc6125913e2f2af502d23d7a5112Brian Carlstrom		k = EVP_PKEY_new();
31404ef91b390dfcc6125913e2f2af502d23d7a5112Brian Carlstrom		if (!k)
31504ef91b390dfcc6125913e2f2af502d23d7a5112Brian Carlstrom			return 0;
31604ef91b390dfcc6125913e2f2af502d23d7a5112Brian Carlstrom		EVP_PKEY_set1_DSA(k, x);
31704ef91b390dfcc6125913e2f2af502d23d7a5112Brian Carlstrom		ret = PEM_write_PrivateKey(fp, k, enc, kstr, klen, cb, u);
31804ef91b390dfcc6125913e2f2af502d23d7a5112Brian Carlstrom		EVP_PKEY_free(k);
31904ef91b390dfcc6125913e2f2af502d23d7a5112Brian Carlstrom		return ret;
32004ef91b390dfcc6125913e2f2af502d23d7a5112Brian Carlstrom		}
32104ef91b390dfcc6125913e2f2af502d23d7a5112Brian Carlstrom	else
32204ef91b390dfcc6125913e2f2af502d23d7a5112Brian Carlstrom		return PEM_ASN1_write((i2d_of_void *)i2d_DSAPrivateKey,
32304ef91b390dfcc6125913e2f2af502d23d7a5112Brian Carlstrom					PEM_STRING_DSA,fp,x,enc,kstr,klen,cb,u);
32404ef91b390dfcc6125913e2f2af502d23d7a5112Brian Carlstrom}
32504ef91b390dfcc6125913e2f2af502d23d7a5112Brian Carlstrom#endif
32604ef91b390dfcc6125913e2f2af502d23d7a5112Brian Carlstrom
32704ef91b390dfcc6125913e2f2af502d23d7a5112Brian Carlstrom#else
32804ef91b390dfcc6125913e2f2af502d23d7a5112Brian Carlstrom
329656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source ProjectIMPLEMENT_PEM_write_cb_const(DSAPrivateKey, DSA, PEM_STRING_DSA, DSAPrivateKey)
33004ef91b390dfcc6125913e2f2af502d23d7a5112Brian Carlstrom
33104ef91b390dfcc6125913e2f2af502d23d7a5112Brian Carlstrom#endif
33204ef91b390dfcc6125913e2f2af502d23d7a5112Brian Carlstrom
333656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source ProjectIMPLEMENT_PEM_rw(DSA_PUBKEY, DSA, PEM_STRING_PUBLIC, DSA_PUBKEY)
334656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project
335656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project#ifndef OPENSSL_NO_FP_API
336656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project
337656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source ProjectDSA *PEM_read_DSAPrivateKey(FILE *fp, DSA **dsa, pem_password_cb *cb,
338656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project								void *u)
339656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project{
340656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	EVP_PKEY *pktmp;
341656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	pktmp = PEM_read_PrivateKey(fp, NULL, cb, u);
342221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom	return pkey_get_dsa(pktmp, dsa);	/* will free pktmp */
343656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project}
344656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project
345656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project#endif
346656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project
347656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source ProjectIMPLEMENT_PEM_rw_const(DSAparams, DSA, PEM_STRING_DSAPARAMS, DSAparams)
348656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project
349656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project#endif
350656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project
351656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project
352656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project#ifndef OPENSSL_NO_EC
353656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Projectstatic EC_KEY *pkey_get_eckey(EVP_PKEY *key, EC_KEY **eckey)
354656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project{
355656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	EC_KEY *dtmp;
356656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	if(!key) return NULL;
357656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	dtmp = EVP_PKEY_get1_EC_KEY(key);
358656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	EVP_PKEY_free(key);
359656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	if(!dtmp) return NULL;
360656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	if(eckey)
361656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	{
362656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project 		EC_KEY_free(*eckey);
363656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project		*eckey = dtmp;
364656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	}
365656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	return dtmp;
366656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project}
367656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project
368656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source ProjectEC_KEY *PEM_read_bio_ECPrivateKey(BIO *bp, EC_KEY **key, pem_password_cb *cb,
369656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project							void *u)
370656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project{
371656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	EVP_PKEY *pktmp;
372656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	pktmp = PEM_read_bio_PrivateKey(bp, NULL, cb, u);
373221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom	return pkey_get_eckey(pktmp, key);	/* will free pktmp */
374656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project}
375656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project
376656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source ProjectIMPLEMENT_PEM_rw_const(ECPKParameters, EC_GROUP, PEM_STRING_ECPARAMETERS, ECPKParameters)
377656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project
37804ef91b390dfcc6125913e2f2af502d23d7a5112Brian Carlstrom
37904ef91b390dfcc6125913e2f2af502d23d7a5112Brian Carlstrom
38004ef91b390dfcc6125913e2f2af502d23d7a5112Brian Carlstrom#ifdef OPENSSL_FIPS
38104ef91b390dfcc6125913e2f2af502d23d7a5112Brian Carlstrom
38204ef91b390dfcc6125913e2f2af502d23d7a5112Brian Carlstromint PEM_write_bio_ECPrivateKey(BIO *bp, EC_KEY *x, const EVP_CIPHER *enc,
38304ef91b390dfcc6125913e2f2af502d23d7a5112Brian Carlstrom                                               unsigned char *kstr, int klen,
38404ef91b390dfcc6125913e2f2af502d23d7a5112Brian Carlstrom                                               pem_password_cb *cb, void *u)
38504ef91b390dfcc6125913e2f2af502d23d7a5112Brian Carlstrom{
38604ef91b390dfcc6125913e2f2af502d23d7a5112Brian Carlstrom	if (FIPS_mode())
38704ef91b390dfcc6125913e2f2af502d23d7a5112Brian Carlstrom		{
38804ef91b390dfcc6125913e2f2af502d23d7a5112Brian Carlstrom		EVP_PKEY *k;
38904ef91b390dfcc6125913e2f2af502d23d7a5112Brian Carlstrom		int ret;
39004ef91b390dfcc6125913e2f2af502d23d7a5112Brian Carlstrom		k = EVP_PKEY_new();
39104ef91b390dfcc6125913e2f2af502d23d7a5112Brian Carlstrom		if (!k)
39204ef91b390dfcc6125913e2f2af502d23d7a5112Brian Carlstrom			return 0;
39304ef91b390dfcc6125913e2f2af502d23d7a5112Brian Carlstrom		EVP_PKEY_set1_EC_KEY(k, x);
39404ef91b390dfcc6125913e2f2af502d23d7a5112Brian Carlstrom
39504ef91b390dfcc6125913e2f2af502d23d7a5112Brian Carlstrom		ret = PEM_write_bio_PrivateKey(bp, k, enc, kstr, klen, cb, u);
39604ef91b390dfcc6125913e2f2af502d23d7a5112Brian Carlstrom		EVP_PKEY_free(k);
39704ef91b390dfcc6125913e2f2af502d23d7a5112Brian Carlstrom		return ret;
39804ef91b390dfcc6125913e2f2af502d23d7a5112Brian Carlstrom		}
39904ef91b390dfcc6125913e2f2af502d23d7a5112Brian Carlstrom	else
40004ef91b390dfcc6125913e2f2af502d23d7a5112Brian Carlstrom		return PEM_ASN1_write_bio((i2d_of_void *)i2d_ECPrivateKey,
40104ef91b390dfcc6125913e2f2af502d23d7a5112Brian Carlstrom						PEM_STRING_ECPRIVATEKEY,
40204ef91b390dfcc6125913e2f2af502d23d7a5112Brian Carlstrom						bp,x,enc,kstr,klen,cb,u);
40304ef91b390dfcc6125913e2f2af502d23d7a5112Brian Carlstrom}
40404ef91b390dfcc6125913e2f2af502d23d7a5112Brian Carlstrom
40504ef91b390dfcc6125913e2f2af502d23d7a5112Brian Carlstrom#ifndef OPENSSL_NO_FP_API
40604ef91b390dfcc6125913e2f2af502d23d7a5112Brian Carlstromint PEM_write_ECPrivateKey(FILE *fp, EC_KEY *x, const EVP_CIPHER *enc,
40704ef91b390dfcc6125913e2f2af502d23d7a5112Brian Carlstrom                                               unsigned char *kstr, int klen,
40804ef91b390dfcc6125913e2f2af502d23d7a5112Brian Carlstrom                                               pem_password_cb *cb, void *u)
40904ef91b390dfcc6125913e2f2af502d23d7a5112Brian Carlstrom{
41004ef91b390dfcc6125913e2f2af502d23d7a5112Brian Carlstrom	if (FIPS_mode())
41104ef91b390dfcc6125913e2f2af502d23d7a5112Brian Carlstrom		{
41204ef91b390dfcc6125913e2f2af502d23d7a5112Brian Carlstrom		EVP_PKEY *k;
41304ef91b390dfcc6125913e2f2af502d23d7a5112Brian Carlstrom		int ret;
41404ef91b390dfcc6125913e2f2af502d23d7a5112Brian Carlstrom		k = EVP_PKEY_new();
41504ef91b390dfcc6125913e2f2af502d23d7a5112Brian Carlstrom		if (!k)
41604ef91b390dfcc6125913e2f2af502d23d7a5112Brian Carlstrom			return 0;
41704ef91b390dfcc6125913e2f2af502d23d7a5112Brian Carlstrom		EVP_PKEY_set1_EC_KEY(k, x);
41804ef91b390dfcc6125913e2f2af502d23d7a5112Brian Carlstrom		ret = PEM_write_PrivateKey(fp, k, enc, kstr, klen, cb, u);
41904ef91b390dfcc6125913e2f2af502d23d7a5112Brian Carlstrom		EVP_PKEY_free(k);
42004ef91b390dfcc6125913e2f2af502d23d7a5112Brian Carlstrom		return ret;
42104ef91b390dfcc6125913e2f2af502d23d7a5112Brian Carlstrom		}
42204ef91b390dfcc6125913e2f2af502d23d7a5112Brian Carlstrom	else
42304ef91b390dfcc6125913e2f2af502d23d7a5112Brian Carlstrom		return PEM_ASN1_write((i2d_of_void *)i2d_ECPrivateKey,
42404ef91b390dfcc6125913e2f2af502d23d7a5112Brian Carlstrom						PEM_STRING_ECPRIVATEKEY,
42504ef91b390dfcc6125913e2f2af502d23d7a5112Brian Carlstrom						fp,x,enc,kstr,klen,cb,u);
42604ef91b390dfcc6125913e2f2af502d23d7a5112Brian Carlstrom}
42704ef91b390dfcc6125913e2f2af502d23d7a5112Brian Carlstrom#endif
42804ef91b390dfcc6125913e2f2af502d23d7a5112Brian Carlstrom
42904ef91b390dfcc6125913e2f2af502d23d7a5112Brian Carlstrom#else
43004ef91b390dfcc6125913e2f2af502d23d7a5112Brian Carlstrom
431656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source ProjectIMPLEMENT_PEM_write_cb(ECPrivateKey, EC_KEY, PEM_STRING_ECPRIVATEKEY, ECPrivateKey)
432656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project
43304ef91b390dfcc6125913e2f2af502d23d7a5112Brian Carlstrom#endif
43404ef91b390dfcc6125913e2f2af502d23d7a5112Brian Carlstrom
435656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source ProjectIMPLEMENT_PEM_rw(EC_PUBKEY, EC_KEY, PEM_STRING_PUBLIC, EC_PUBKEY)
436656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project
437656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project#ifndef OPENSSL_NO_FP_API
438656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project
439656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source ProjectEC_KEY *PEM_read_ECPrivateKey(FILE *fp, EC_KEY **eckey, pem_password_cb *cb,
440656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project 								void *u)
441656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project{
442656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	EVP_PKEY *pktmp;
443656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	pktmp = PEM_read_PrivateKey(fp, NULL, cb, u);
444221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom	return pkey_get_eckey(pktmp, eckey);	/* will free pktmp */
445656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project}
446656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project
447656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project#endif
448656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project
449656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project#endif
450656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project
451656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project#ifndef OPENSSL_NO_DH
452656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project
453656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source ProjectIMPLEMENT_PEM_rw_const(DHparams, DH, PEM_STRING_DHPARAMS, DHparams)
454656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project
455656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project#endif
456656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project
457656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source ProjectIMPLEMENT_PEM_rw(PUBKEY, EVP_PKEY, PEM_STRING_PUBLIC, PUBKEY)
458