]>
Commit | Line | Data |
---|---|---|
d7e498ac RL |
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 | ||
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 | ||
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 | ||
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 | ||
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 | ||
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 | ||
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 | } |