xref: /freebsd/crypto/openssl/ssl/ssl_rsa_legacy.c (revision b077aed33b7b6aefca7b17ddb250cf521f938613)
1 /*
2  * Copyright 1995-2020 The OpenSSL Project Authors. All Rights Reserved.
3  *
4  * Licensed under the Apache License 2.0 (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 /* We need to use the deprecated RSA low level calls */
11 #define OPENSSL_SUPPRESS_DEPRECATED
12 
13 #include <openssl/err.h>
14 #include <openssl/rsa.h>
15 #include <openssl/ssl.h>
16 
SSL_use_RSAPrivateKey(SSL * ssl,RSA * rsa)17 int SSL_use_RSAPrivateKey(SSL *ssl, RSA *rsa)
18 {
19     EVP_PKEY *pkey;
20     int ret;
21 
22     if (rsa == NULL) {
23         ERR_raise(ERR_LIB_SSL, ERR_R_PASSED_NULL_PARAMETER);
24         return 0;
25     }
26     if ((pkey = EVP_PKEY_new()) == NULL) {
27         ERR_raise(ERR_LIB_SSL, ERR_R_EVP_LIB);
28         return 0;
29     }
30 
31     RSA_up_ref(rsa);
32     if (EVP_PKEY_assign_RSA(pkey, rsa) <= 0) {
33         RSA_free(rsa);
34         EVP_PKEY_free(pkey);
35         return 0;
36     }
37 
38     ret = SSL_use_PrivateKey(ssl, pkey);
39     EVP_PKEY_free(pkey);
40     return ret;
41 }
42 
SSL_use_RSAPrivateKey_file(SSL * ssl,const char * file,int type)43 int SSL_use_RSAPrivateKey_file(SSL *ssl, const char *file, int type)
44 {
45     int j, ret = 0;
46     BIO *in;
47     RSA *rsa = NULL;
48 
49     in = BIO_new(BIO_s_file());
50     if (in == NULL) {
51         ERR_raise(ERR_LIB_SSL, ERR_R_BUF_LIB);
52         goto end;
53     }
54 
55     if (BIO_read_filename(in, file) <= 0) {
56         ERR_raise(ERR_LIB_SSL, ERR_R_SYS_LIB);
57         goto end;
58     }
59     if (type == SSL_FILETYPE_ASN1) {
60         j = ERR_R_ASN1_LIB;
61         rsa = d2i_RSAPrivateKey_bio(in, NULL);
62     } else if (type == SSL_FILETYPE_PEM) {
63         j = ERR_R_PEM_LIB;
64         rsa = PEM_read_bio_RSAPrivateKey(in, NULL,
65                                          SSL_get_default_passwd_cb(ssl),
66                                          SSL_get_default_passwd_cb_userdata(ssl));
67     } else {
68         ERR_raise(ERR_LIB_SSL, SSL_R_BAD_SSL_FILETYPE);
69         goto end;
70     }
71     if (rsa == NULL) {
72         ERR_raise(ERR_LIB_SSL, j);
73         goto end;
74     }
75     ret = SSL_use_RSAPrivateKey(ssl, rsa);
76     RSA_free(rsa);
77  end:
78     BIO_free(in);
79     return ret;
80 }
81 
SSL_use_RSAPrivateKey_ASN1(SSL * ssl,const unsigned char * d,long len)82 int SSL_use_RSAPrivateKey_ASN1(SSL *ssl, const unsigned char *d, long len)
83 {
84     int ret;
85     const unsigned char *p;
86     RSA *rsa;
87 
88     p = d;
89     if ((rsa = d2i_RSAPrivateKey(NULL, &p, (long)len)) == NULL) {
90         ERR_raise(ERR_LIB_SSL, ERR_R_ASN1_LIB);
91         return 0;
92     }
93 
94     ret = SSL_use_RSAPrivateKey(ssl, rsa);
95     RSA_free(rsa);
96     return ret;
97 }
98 
SSL_CTX_use_RSAPrivateKey(SSL_CTX * ctx,RSA * rsa)99 int SSL_CTX_use_RSAPrivateKey(SSL_CTX *ctx, RSA *rsa)
100 {
101     int ret;
102     EVP_PKEY *pkey;
103 
104     if (rsa == NULL) {
105         ERR_raise(ERR_LIB_SSL, ERR_R_PASSED_NULL_PARAMETER);
106         return 0;
107     }
108     if ((pkey = EVP_PKEY_new()) == NULL) {
109         ERR_raise(ERR_LIB_SSL, ERR_R_EVP_LIB);
110         return 0;
111     }
112 
113     RSA_up_ref(rsa);
114     if (EVP_PKEY_assign_RSA(pkey, rsa) <= 0) {
115         RSA_free(rsa);
116         EVP_PKEY_free(pkey);
117         return 0;
118     }
119 
120     ret = SSL_CTX_use_PrivateKey(ctx, pkey);
121     EVP_PKEY_free(pkey);
122     return ret;
123 }
124 
SSL_CTX_use_RSAPrivateKey_file(SSL_CTX * ctx,const char * file,int type)125 int SSL_CTX_use_RSAPrivateKey_file(SSL_CTX *ctx, const char *file, int type)
126 {
127     int j, ret = 0;
128     BIO *in;
129     RSA *rsa = NULL;
130 
131     in = BIO_new(BIO_s_file());
132     if (in == NULL) {
133         ERR_raise(ERR_LIB_SSL, ERR_R_BUF_LIB);
134         goto end;
135     }
136 
137     if (BIO_read_filename(in, file) <= 0) {
138         ERR_raise(ERR_LIB_SSL, ERR_R_SYS_LIB);
139         goto end;
140     }
141     if (type == SSL_FILETYPE_ASN1) {
142         j = ERR_R_ASN1_LIB;
143         rsa = d2i_RSAPrivateKey_bio(in, NULL);
144     } else if (type == SSL_FILETYPE_PEM) {
145         j = ERR_R_PEM_LIB;
146         rsa = PEM_read_bio_RSAPrivateKey(in, NULL,
147                                          SSL_CTX_get_default_passwd_cb(ctx),
148                                          SSL_CTX_get_default_passwd_cb_userdata(ctx));
149     } else {
150         ERR_raise(ERR_LIB_SSL, SSL_R_BAD_SSL_FILETYPE);
151         goto end;
152     }
153     if (rsa == NULL) {
154         ERR_raise(ERR_LIB_SSL, j);
155         goto end;
156     }
157     ret = SSL_CTX_use_RSAPrivateKey(ctx, rsa);
158     RSA_free(rsa);
159  end:
160     BIO_free(in);
161     return ret;
162 }
163 
SSL_CTX_use_RSAPrivateKey_ASN1(SSL_CTX * ctx,const unsigned char * d,long len)164 int SSL_CTX_use_RSAPrivateKey_ASN1(SSL_CTX *ctx, const unsigned char *d,
165                                    long len)
166 {
167     int ret;
168     const unsigned char *p;
169     RSA *rsa;
170 
171     p = d;
172     if ((rsa = d2i_RSAPrivateKey(NULL, &p, (long)len)) == NULL) {
173         ERR_raise(ERR_LIB_SSL, ERR_R_ASN1_LIB);
174         return 0;
175     }
176 
177     ret = SSL_CTX_use_RSAPrivateKey(ctx, rsa);
178     RSA_free(rsa);
179     return ret;
180 }
181