1 /* Copyright (C) 2009-2014, Martin Johansson <martin@fatbob.nu>
2 Copyright (C) 2005-2014, Thorvald Natvig <thorvald@natvig.com>
6 Redistribution and use in source and binary forms, with or without
7 modification, are permitted provided that the following conditions
10 - Redistributions of source code must retain the above copyright notice,
11 this list of conditions and the following disclaimer.
12 - Redistributions in binary form must reproduce the above copyright notice,
13 this list of conditions and the following disclaimer in the documentation
14 and/or other materials provided with the distribution.
15 - Neither the name of the Developers nor the names of its contributors may
16 be used to endorse or promote products derived from this software without
17 specific prior written permission.
19 THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
20 ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
21 LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
22 A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE FOUNDATION OR
23 CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
24 EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
25 PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
26 PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF
27 LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
28 NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
29 SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
43 #include <openssl/x509v3.h>
44 #include <openssl/ssl.h>
45 #include <openssl/err.h>
46 #include <openssl/safestack.h>
49 static SSL_CTX *context;
50 static EVP_PKEY *pkey;
52 static char const * ciphers = "EECDH+CHACHA20:EECDH+AESGCM:EECDH+AES+TLSv1.2:EECDH+AES:AESGCM:AES:!aNULL:!DHE:!kECDH";
54 static int verify_callback(int preverify_ok, X509_STORE_CTX *ctx);
56 static int SSL_add_ext(X509 * crt, int nid, char *value) {
59 X509V3_set_ctx_nodb(&ctx);
60 X509V3_set_ctx(&ctx, crt, crt, NULL, NULL, 0);
61 ex = X509V3_EXT_conf_nid(NULL, &ctx, nid, value);
65 X509_add_ext(crt, ex, -1);
66 X509_EXTENSION_free(ex);
70 static RSA *SSL_readprivatekey(char *keyfile)
75 /* open the private key file for reading */
76 fp = fopen(keyfile, "r");
78 Log_warn("Unable to open the private key file %s for reading.", keyfile);
82 /* allocate memory for the RSA structure */
85 /* assign a callback function for the password */
87 /* read a private key from file */
88 if (PEM_read_RSAPrivateKey(fp, &rsa, NULL, NULL) <= 0) {
89 /* error reading the key - check the error stack */
90 Log_warn("Error trying to read private key.");
99 static void SSL_writecert(char *certfile, X509 *x509)
103 /* open the private key file */
104 fp = fopen(certfile, "w");
106 Log_warn("Unable to open the X509 file %s for writing", certfile);
109 if (PEM_write_X509(fp, x509) == 0) {
110 Log_warn("Error trying to write X509 info.");
115 static void SSL_writekey(char *keyfile, RSA *rsa)
119 /* open the private key file for reading */
120 fp = fopen(keyfile, "w");
122 Log_warn("Unable to open the private key file %s for writing.", keyfile);
126 if (PEM_write_RSAPrivateKey(fp, rsa, NULL, NULL, 0, NULL, NULL) == 0) {
127 Log_warn("Error trying to write private key");
132 static void SSL_initializeCert() {
134 char *crt = (char *)getStrConf(CERTIFICATE);
135 char *key = (char *)getStrConf(KEY);
138 bool_t did_load_cert = SSL_CTX_use_certificate_chain_file(context, crt);
139 rsa = SSL_readprivatekey(key);
141 if (!rsa || !did_load_cert) {
142 Log_info("Generating new server certificate.");
145 CRYPTO_mem_ctrl(CRYPTO_MEM_CHECK_ON);
148 pkey = EVP_PKEY_new();
149 rsa = RSA_generate_key(4096,RSA_F4,NULL,NULL);
150 EVP_PKEY_assign_RSA(pkey, rsa);
152 X509_set_version(x509, 2);
153 ASN1_INTEGER_set(X509_get_serialNumber(x509),1);
154 X509_gmtime_adj(X509_get_notBefore(x509),0);
155 X509_gmtime_adj(X509_get_notAfter(x509),60*60*24*365);
156 X509_set_pubkey(x509, pkey);
158 X509_NAME *name=X509_get_subject_name(x509);
160 X509_NAME_add_entry_by_txt(name, "CN", MBSTRING_ASC, (const uint8_t *)"Murmur Autogenerated Certificate v2", -1, -1, 0);
161 X509_set_issuer_name(x509, name);
162 SSL_add_ext(x509, NID_basic_constraints, "critical,CA:FALSE");
163 SSL_add_ext(x509, NID_ext_key_usage, "serverAuth,clientAuth");
164 SSL_add_ext(x509, NID_subject_key_identifier, "hash");
165 SSL_add_ext(x509, NID_netscape_comment, "Generated from umurmur");
167 X509_sign(x509, pkey, EVP_md5());
169 SSL_writecert(crt, x509);
170 SSL_writekey(key, rsa);
172 SSL_CTX_use_certificate(context, x509);
174 pkey = EVP_PKEY_new();
175 EVP_PKEY_assign_RSA(pkey, rsa);
178 SSL_CTX_use_PrivateKey(context, pkey);
181 Log_fatal("Failed to initialize TLS context.");
189 int i, offset = 0, cipherstringlen = 0;
190 STACK_OF(SSL_CIPHER) *cipherlist = NULL, *cipherlist_new = NULL;
191 const SSL_CIPHER *cipher;
192 char *cipherstring = NULL;
195 OpenSSL_add_all_algorithms();
196 SSL_load_error_strings();
197 ERR_load_crypto_strings();
199 context = SSL_CTX_new(SSLv23_server_method());
200 SSL_CTX_set_options(context, SSL_OP_NO_SSLv2);
201 SSL_CTX_set_options(context, SSL_OP_NO_SSLv3);
202 SSL_CTX_set_options(context, SSL_OP_CIPHER_SERVER_PREFERENCE);
205 ERR_print_errors_fp(stderr);
209 SSL_CTX_set_cipher_list(context, ciphers);
211 EC_KEY *ecdhkey = EC_KEY_new_by_curve_name(NID_X9_62_prime256v1);
212 SSL_CTX_set_tmp_ecdh(context, ecdhkey);
213 EC_KEY_free(ecdhkey);
215 char const * sslCAPath = getStrConf(CAPATH);
216 if(sslCAPath != NULL)
218 SSL_CTX_load_verify_locations(context, NULL, sslCAPath);
221 SSL_initializeCert();
223 /* Set cipher list */
224 ssl = SSL_new(context);
225 cipherlist = (STACK_OF(SSL_CIPHER) *) SSL_get_ciphers(ssl);
226 cipherlist_new = (STACK_OF(SSL_CIPHER) *) sk_SSL_CIPHER_new_null();
228 for ( i = 0; (cipher = sk_SSL_CIPHER_value(cipherlist, i)) != NULL; i++) {
229 if (SSL_CIPHER_get_bits(cipher, NULL) >= 128) {
230 sk_SSL_CIPHER_push(cipherlist_new, cipher);
233 Log_debug("List of ciphers:");
234 if (cipherlist_new) {
235 for (i = 0; (cipher = sk_SSL_CIPHER_value(cipherlist_new, i)) != NULL; i++) {
236 Log_debug("%s", SSL_CIPHER_get_name(cipher));
237 cipherstringlen += strlen(SSL_CIPHER_get_name(cipher)) + 1;
239 cipherstring = Memory_safeMalloc(1, cipherstringlen + 1);
240 for (i = 0; (cipher = sk_SSL_CIPHER_value(cipherlist_new, i)) != NULL; i++) {
241 offset += sprintf(cipherstring + offset, "%s:", SSL_CIPHER_get_name(cipher));
246 sk_SSL_CIPHER_free(cipherlist_new);
248 if (!cipherstring || !*cipherstring)
249 Log_fatal("No suitable ciphers found!");
251 if (SSL_CTX_set_cipher_list(context, cipherstring) == 0)
252 Log_fatal("Failed to set cipher list!");
256 SSL_CTX_set_verify(context, SSL_VERIFY_PEER|SSL_VERIFY_CLIENT_ONCE,
260 Log_info("OpenSSL library initialized");
264 void SSLi_deinit(void)
266 SSL_CTX_free(context);
270 int SSLi_nonblockaccept(SSL_handle_t *ssl, bool_t *SSLready)
273 rc = SSL_accept(ssl);
275 if (SSL_get_error(ssl, rc) == SSL_ERROR_WANT_READ ||
276 SSL_get_error(ssl, rc) == SSL_ERROR_WANT_WRITE) {
277 Log_debug("SSL not ready");
280 Log_warn("SSL error: %s", ERR_error_string(SSL_get_error(ssl, rc), NULL));
288 SSL_handle_t *SSLi_newconnection(int *fd, bool_t *SSLready)
293 ssl = SSL_new(context);
294 SSL_set_fd(ssl, *fd);
295 if (SSLi_nonblockaccept(ssl, SSLready) < 0) {
302 /* Create SHA1 of last certificate in the peer's chain. */
303 bool_t SSLi_getSHA1Hash(SSL_handle_t *ssl, uint8_t *hash)
309 x509 = SSL_get_peer_certificate(ssl);
314 len = i2d_X509(x509, NULL);
315 buf = Memory_safeMalloc(1, len);
320 SHA1(buf, len, hash);
325 void SSLi_closeconnection(SSL_handle_t *ssl)
330 void SSLi_shutdown(SSL_handle_t *ssl)
335 int SSLi_read(SSL_handle_t *ssl, uint8_t *buf, int len)
337 return SSL_read(ssl, buf, len);
340 int SSLi_write(SSL_handle_t *ssl, uint8_t *buf, int len)
342 return SSL_write(ssl, buf, len);
345 int SSLi_get_error(SSL_handle_t *ssl, int code)
347 return SSL_get_error(ssl, code);
350 bool_t SSLi_data_pending(SSL_handle_t *ssl)
352 return SSL_pending(ssl);
355 void SSLi_free(SSL_handle_t *ssl)
360 static int verify_callback(int preverify_ok, X509_STORE_CTX *ctx)
367 err_cert = X509_STORE_CTX_get_current_cert(ctx);
368 err = X509_STORE_CTX_get_error(ctx);
369 depth = X509_STORE_CTX_get_error_depth(ctx);
371 ssl = X509_STORE_CTX_get_ex_data(ctx, SSL_get_ex_data_X509_STORE_CTX_idx());
372 X509_NAME_oneline(X509_get_subject_name(err_cert), buf, 256);
376 err = X509_V_ERR_CERT_CHAIN_TOO_LONG;
377 X509_STORE_CTX_set_error(ctx, err);
380 Log_warn("SSL: verify error:num=%d:%s:depth=%d:%s\n", err,
381 X509_verify_cert_error_string(err), depth, buf);
384 * At this point, err contains the last verification error. We can use
385 * it for something special
387 if (!preverify_ok && (err == X509_V_ERR_UNABLE_TO_GET_ISSUER_CERT)) {
388 X509_NAME_oneline(X509_get_issuer_name(err_cert), buf, 256);
389 Log_warn("issuer= %s", buf);