1 /* 2 * Copyright 1995-2016 The OpenSSL Project Authors. All Rights Reserved. 3 * 4 * Licensed under the OpenSSL license (the "License"). You may not use 5 * this file except in compliance with the License. You can obtain a copy 6 * in the file LICENSE in the source distribution or at 7 * https://www.openssl.org/source/license.html 8 */ 9 10 #include <stdio.h> 11 #include "internal/cryptlib.h" 12 #include <openssl/bio.h> 13 #include <openssl/evp.h> 14 #include <openssl/x509.h> 15 #include <openssl/pkcs7.h> 16 #include <openssl/pem.h> 17 #include <openssl/rsa.h> 18 #include <openssl/dsa.h> 19 #include <openssl/dh.h> 20 21 #ifndef OPENSSL_NO_RSA 22 static RSA *pkey_get_rsa(EVP_PKEY *key, RSA **rsa); 23 #endif 24 #ifndef OPENSSL_NO_DSA 25 static DSA *pkey_get_dsa(EVP_PKEY *key, DSA **dsa); 26 #endif 27 28 #ifndef OPENSSL_NO_EC 29 static EC_KEY *pkey_get_eckey(EVP_PKEY *key, EC_KEY **eckey); 30 #endif 31 32 IMPLEMENT_PEM_rw(X509_REQ, X509_REQ, PEM_STRING_X509_REQ, X509_REQ) 33 34 IMPLEMENT_PEM_write(X509_REQ_NEW, X509_REQ, PEM_STRING_X509_REQ_OLD, X509_REQ) 35 IMPLEMENT_PEM_rw(X509_CRL, X509_CRL, PEM_STRING_X509_CRL, X509_CRL) 36 IMPLEMENT_PEM_rw(PKCS7, PKCS7, PEM_STRING_PKCS7, PKCS7) 37 38 IMPLEMENT_PEM_rw(NETSCAPE_CERT_SEQUENCE, NETSCAPE_CERT_SEQUENCE, 39 PEM_STRING_X509, NETSCAPE_CERT_SEQUENCE) 40 #ifndef OPENSSL_NO_RSA 41 /* 42 * We treat RSA or DSA private keys as a special case. For private keys we 43 * read in an EVP_PKEY structure with PEM_read_bio_PrivateKey() and extract 44 * the relevant private key: this means can handle "traditional" and PKCS#8 45 * formats transparently. 46 */ 47 static RSA *pkey_get_rsa(EVP_PKEY *key, RSA **rsa) 48 { 49 RSA *rtmp; 50 if (!key) 51 return NULL; 52 rtmp = EVP_PKEY_get1_RSA(key); 53 EVP_PKEY_free(key); 54 if (!rtmp) 55 return NULL; 56 if (rsa) { 57 RSA_free(*rsa); 58 *rsa = rtmp; 59 } 60 return rtmp; 61 } 62 63 RSA *PEM_read_bio_RSAPrivateKey(BIO *bp, RSA **rsa, pem_password_cb *cb, 64 void *u) 65 { 66 EVP_PKEY *pktmp; 67 pktmp = PEM_read_bio_PrivateKey(bp, NULL, cb, u); 68 return pkey_get_rsa(pktmp, rsa); 69 } 70 71 # ifndef OPENSSL_NO_STDIO 72 73 RSA *PEM_read_RSAPrivateKey(FILE *fp, RSA **rsa, pem_password_cb *cb, void *u) 74 { 75 EVP_PKEY *pktmp; 76 pktmp = PEM_read_PrivateKey(fp, NULL, cb, u); 77 return pkey_get_rsa(pktmp, rsa); 78 } 79 80 # endif 81 82 IMPLEMENT_PEM_write_cb_const(RSAPrivateKey, RSA, PEM_STRING_RSA, 83 RSAPrivateKey) 84 85 86 IMPLEMENT_PEM_rw_const(RSAPublicKey, RSA, PEM_STRING_RSA_PUBLIC, 87 RSAPublicKey) IMPLEMENT_PEM_rw(RSA_PUBKEY, RSA, 88 PEM_STRING_PUBLIC, 89 RSA_PUBKEY) 90 #endif 91 #ifndef OPENSSL_NO_DSA 92 static DSA *pkey_get_dsa(EVP_PKEY *key, DSA **dsa) 93 { 94 DSA *dtmp; 95 if (!key) 96 return NULL; 97 dtmp = EVP_PKEY_get1_DSA(key); 98 EVP_PKEY_free(key); 99 if (!dtmp) 100 return NULL; 101 if (dsa) { 102 DSA_free(*dsa); 103 *dsa = dtmp; 104 } 105 return dtmp; 106 } 107 108 DSA *PEM_read_bio_DSAPrivateKey(BIO *bp, DSA **dsa, pem_password_cb *cb, 109 void *u) 110 { 111 EVP_PKEY *pktmp; 112 pktmp = PEM_read_bio_PrivateKey(bp, NULL, cb, u); 113 return pkey_get_dsa(pktmp, dsa); /* will free pktmp */ 114 } 115 116 IMPLEMENT_PEM_write_cb_const(DSAPrivateKey, DSA, PEM_STRING_DSA, 117 DSAPrivateKey) 118 IMPLEMENT_PEM_rw(DSA_PUBKEY, DSA, PEM_STRING_PUBLIC, DSA_PUBKEY) 119 # ifndef OPENSSL_NO_STDIO 120 DSA *PEM_read_DSAPrivateKey(FILE *fp, DSA **dsa, pem_password_cb *cb, void *u) 121 { 122 EVP_PKEY *pktmp; 123 pktmp = PEM_read_PrivateKey(fp, NULL, cb, u); 124 return pkey_get_dsa(pktmp, dsa); /* will free pktmp */ 125 } 126 127 # endif 128 129 IMPLEMENT_PEM_rw_const(DSAparams, DSA, PEM_STRING_DSAPARAMS, DSAparams) 130 #endif 131 #ifndef OPENSSL_NO_EC 132 static EC_KEY *pkey_get_eckey(EVP_PKEY *key, EC_KEY **eckey) 133 { 134 EC_KEY *dtmp; 135 if (!key) 136 return NULL; 137 dtmp = EVP_PKEY_get1_EC_KEY(key); 138 EVP_PKEY_free(key); 139 if (!dtmp) 140 return NULL; 141 if (eckey) { 142 EC_KEY_free(*eckey); 143 *eckey = dtmp; 144 } 145 return dtmp; 146 } 147 148 EC_KEY *PEM_read_bio_ECPrivateKey(BIO *bp, EC_KEY **key, pem_password_cb *cb, 149 void *u) 150 { 151 EVP_PKEY *pktmp; 152 pktmp = PEM_read_bio_PrivateKey(bp, NULL, cb, u); 153 return pkey_get_eckey(pktmp, key); /* will free pktmp */ 154 } 155 156 IMPLEMENT_PEM_rw_const(ECPKParameters, EC_GROUP, PEM_STRING_ECPARAMETERS, 157 ECPKParameters) 158 159 160 IMPLEMENT_PEM_write_cb(ECPrivateKey, EC_KEY, PEM_STRING_ECPRIVATEKEY, 161 ECPrivateKey) 162 IMPLEMENT_PEM_rw(EC_PUBKEY, EC_KEY, PEM_STRING_PUBLIC, EC_PUBKEY) 163 # ifndef OPENSSL_NO_STDIO 164 EC_KEY *PEM_read_ECPrivateKey(FILE *fp, EC_KEY **eckey, pem_password_cb *cb, 165 void *u) 166 { 167 EVP_PKEY *pktmp; 168 pktmp = PEM_read_PrivateKey(fp, NULL, cb, u); 169 return pkey_get_eckey(pktmp, eckey); /* will free pktmp */ 170 } 171 172 # endif 173 174 #endif 175 176 #ifndef OPENSSL_NO_DH 177 178 IMPLEMENT_PEM_write_const(DHparams, DH, PEM_STRING_DHPARAMS, DHparams) 179 IMPLEMENT_PEM_write_const(DHxparams, DH, PEM_STRING_DHXPARAMS, DHxparams) 180 #endif 181 IMPLEMENT_PEM_rw(PUBKEY, EVP_PKEY, PEM_STRING_PUBLIC, PUBKEY) 182