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 X509 *SSL_readcert(char *certfile)
75 /* open the certificate file */
76 fp = fopen(certfile, "r");
78 Log_warn("Unable to open the X509 file %s for reading.", certfile);
82 /* allocate memory for the cert structure */
85 if (PEM_read_X509(fp, &x509, NULL, NULL) == 0) {
86 /* error reading the x509 information - check the error stack */
87 Log_warn("Error trying to read X509 info.");
96 static RSA *SSL_readprivatekey(char *keyfile)
101 /* open the private key file for reading */
102 fp = fopen(keyfile, "r");
104 Log_warn("Unable to open the private key file %s for reading.", keyfile);
108 /* allocate memory for the RSA structure */
111 /* assign a callback function for the password */
113 /* read a private key from file */
114 if (PEM_read_RSAPrivateKey(fp, &rsa, NULL, NULL) <= 0) {
115 /* error reading the key - check the error stack */
116 Log_warn("Error trying to read private key.");
125 static void SSL_writecert(char *certfile, X509 *x509)
129 /* open the private key file */
130 fp = fopen(certfile, "w");
132 Log_warn("Unable to open the X509 file %s for writing", certfile);
135 if (PEM_write_X509(fp, x509) == 0) {
136 Log_warn("Error trying to write X509 info.");
141 static void SSL_writekey(char *keyfile, RSA *rsa)
145 /* open the private key file for reading */
146 fp = fopen(keyfile, "w");
148 Log_warn("Unable to open the private key file %s for writing.", keyfile);
152 if (PEM_write_RSAPrivateKey(fp, rsa, NULL, NULL, 0, NULL, NULL) == 0) {
153 Log_warn("Error trying to write private key");
158 static void SSL_initializeCert() {
160 char *crt = (char *)getStrConf(CERTIFICATE);
161 char *key = (char *)getStrConf(KEY);
164 bool_t did_load_cert = SSL_CTX_use_certificate_chain_file(context, crt);
165 rsa = SSL_readprivatekey(key);
167 if (!rsa || !did_load_cert) {
168 Log_info("Generating new server certificate.");
171 CRYPTO_mem_ctrl(CRYPTO_MEM_CHECK_ON);
174 pkey = EVP_PKEY_new();
175 rsa = RSA_generate_key(4096,RSA_F4,NULL,NULL);
176 EVP_PKEY_assign_RSA(pkey, rsa);
178 X509_set_version(x509, 2);
179 ASN1_INTEGER_set(X509_get_serialNumber(x509),1);
180 X509_gmtime_adj(X509_get_notBefore(x509),0);
181 X509_gmtime_adj(X509_get_notAfter(x509),60*60*24*365);
182 X509_set_pubkey(x509, pkey);
184 X509_NAME *name=X509_get_subject_name(x509);
186 X509_NAME_add_entry_by_txt(name, "CN", MBSTRING_ASC, (const uint8_t *)"Murmur Autogenerated Certificate v2", -1, -1, 0);
187 X509_set_issuer_name(x509, name);
188 SSL_add_ext(x509, NID_basic_constraints, "critical,CA:FALSE");
189 SSL_add_ext(x509, NID_ext_key_usage, "serverAuth,clientAuth");
190 SSL_add_ext(x509, NID_subject_key_identifier, "hash");
191 SSL_add_ext(x509, NID_netscape_comment, "Generated from umurmur");
193 X509_sign(x509, pkey, EVP_md5());
195 SSL_writecert(crt, x509);
196 SSL_writekey(key, rsa);
198 SSL_CTX_use_certificate(context, x509);
200 pkey = EVP_PKEY_new();
201 EVP_PKEY_assign_RSA(pkey, rsa);
204 SSL_CTX_use_PrivateKey(context, pkey);
207 Log_fatal("Failed to initialize TLS context.");
215 int i, offset = 0, cipherstringlen = 0;
216 STACK_OF(SSL_CIPHER) *cipherlist = NULL, *cipherlist_new = NULL;
221 OpenSSL_add_all_algorithms();
222 SSL_load_error_strings();
223 ERR_load_crypto_strings();
225 context = SSL_CTX_new(SSLv23_server_method());
226 SSL_CTX_set_options(context, SSL_OP_NO_SSLv2);
227 SSL_CTX_set_options(context, SSL_OP_NO_SSLv3);
228 SSL_CTX_set_options(context, SSL_OP_CIPHER_SERVER_PREFERENCE);
231 ERR_print_errors_fp(stderr);
235 SSL_CTX_set_cipher_list(context, ciphers);
237 EC_KEY *ecdhkey = EC_KEY_new_by_curve_name(NID_X9_62_prime256v1);
238 SSL_CTX_set_tmp_ecdh(context, ecdhkey);
239 EC_KEY_free(ecdhkey);
241 char const * sslCAPath = getStrConf(CAPATH);
242 if(sslCAPath != NULL)
244 SSL_CTX_load_verify_locations(context, NULL, sslCAPath);
247 SSL_initializeCert();
249 /* Set cipher list */
250 ssl = SSL_new(context);
251 cipherlist = (STACK_OF(SSL_CIPHER) *) SSL_get_ciphers(ssl);
252 cipherlist_new = (STACK_OF(SSL_CIPHER) *) sk_SSL_CIPHER_new_null();
254 for ( i = 0; (cipher = sk_SSL_CIPHER_value(cipherlist, i)) != NULL; i++) {
255 if (SSL_CIPHER_get_bits(cipher, NULL) >= 128) {
256 sk_SSL_CIPHER_push(cipherlist_new, cipher);
259 Log_debug("List of ciphers:");
260 if (cipherlist_new) {
261 for (i = 0; (cipher = sk_SSL_CIPHER_value(cipherlist_new, i)) != NULL; i++) {
262 Log_debug("%s", SSL_CIPHER_get_name(cipher));
263 cipherstringlen += strlen(SSL_CIPHER_get_name(cipher)) + 1;
265 cipherstring = Memory_safeMalloc(1, cipherstringlen + 1);
266 for (i = 0; (cipher = sk_SSL_CIPHER_value(cipherlist_new, i)) != NULL; i++) {
267 offset += sprintf(cipherstring + offset, "%s:", SSL_CIPHER_get_name(cipher));
272 sk_SSL_CIPHER_free(cipherlist_new);
274 if (strlen(cipherstring) == 0)
275 Log_fatal("No suitable ciphers found!");
277 if (SSL_CTX_set_cipher_list(context, cipherstring) == 0)
278 Log_fatal("Failed to set cipher list!");
282 SSL_CTX_set_verify(context, SSL_VERIFY_PEER|SSL_VERIFY_CLIENT_ONCE,
286 Log_info("OpenSSL library initialized");
290 void SSLi_deinit(void)
292 SSL_CTX_free(context);
296 int SSLi_nonblockaccept(SSL_handle_t *ssl, bool_t *SSLready)
299 rc = SSL_accept(ssl);
301 if (SSL_get_error(ssl, rc) == SSL_ERROR_WANT_READ ||
302 SSL_get_error(ssl, rc) == SSL_ERROR_WANT_WRITE) {
303 Log_debug("SSL not ready");
306 Log_warn("SSL error: %s", ERR_error_string(SSL_get_error(ssl, rc), NULL));
314 SSL_handle_t *SSLi_newconnection(int *fd, bool_t *SSLready)
319 ssl = SSL_new(context);
320 SSL_set_fd(ssl, *fd);
321 if (SSLi_nonblockaccept(ssl, SSLready) < 0) {
328 /* Create SHA1 of last certificate in the peer's chain. */
329 bool_t SSLi_getSHA1Hash(SSL_handle_t *ssl, uint8_t *hash)
335 x509 = SSL_get_peer_certificate(ssl);
340 len = i2d_X509(x509, NULL);
341 buf = Memory_safeMalloc(1, len);
346 SHA1(buf, len, hash);
351 void SSLi_closeconnection(SSL_handle_t *ssl)
356 void SSLi_shutdown(SSL_handle_t *ssl)
361 int SSLi_read(SSL_handle_t *ssl, uint8_t *buf, int len)
363 return SSL_read(ssl, buf, len);
366 int SSLi_write(SSL_handle_t *ssl, uint8_t *buf, int len)
368 return SSL_write(ssl, buf, len);
371 int SSLi_get_error(SSL_handle_t *ssl, int code)
373 return SSL_get_error(ssl, code);
376 bool_t SSLi_data_pending(SSL_handle_t *ssl)
378 return SSL_pending(ssl);
381 void SSLi_free(SSL_handle_t *ssl)
386 static int verify_callback(int preverify_ok, X509_STORE_CTX *ctx)
393 err_cert = X509_STORE_CTX_get_current_cert(ctx);
394 err = X509_STORE_CTX_get_error(ctx);
395 depth = X509_STORE_CTX_get_error_depth(ctx);
397 ssl = X509_STORE_CTX_get_ex_data(ctx, SSL_get_ex_data_X509_STORE_CTX_idx());
398 X509_NAME_oneline(X509_get_subject_name(err_cert), buf, 256);
402 err = X509_V_ERR_CERT_CHAIN_TOO_LONG;
403 X509_STORE_CTX_set_error(ctx, err);
406 Log_warn("SSL: verify error:num=%d:%s:depth=%d:%s\n", err,
407 X509_verify_cert_error_string(err), depth, buf);
410 * At this point, err contains the last verification error. We can use
411 * it for something special
413 if (!preverify_ok && (err == X509_V_ERR_UNABLE_TO_GET_ISSUER_CERT)) {
414 X509_NAME_oneline(X509_get_issuer_name(ctx->current_cert), buf, 256);
415 Log_warn("issuer= %s", buf);