Configure switch added for enabling PolarSSL HAVEGE random number generator. Default...
[umurmur.git] / src / ssl.c
index 2204a3cc3996dc59eb6b15968fcf5713fe2350e9..9c5236ec6815dff9d70f16890e1d5c973b436b7f 100644 (file)
--- a/src/ssl.c
+++ b/src/ssl.c
@@ -30,6 +30,7 @@
 */
 #include <string.h>
 #include <stdlib.h>
+#include <fcntl.h>
 
 #include "conf.h"
 #include "log.h"
 #include <polarssl/ssl.h>
 #include <polarssl/net.h>
 
+#ifdef POLARSSL_API_V1_2
+int ciphers[] =
+{
+    TLS_DHE_RSA_WITH_AES_256_CBC_SHA,
+    TLS_RSA_WITH_AES_256_CBC_SHA,
+    TLS_RSA_WITH_AES_128_CBC_SHA,
+    0
+};
+#else
 int ciphers[] =
 {
     SSL_EDH_RSA_AES_256_SHA,
-    SSL_EDH_RSA_CAMELLIA_256_SHA,
-    SSL_EDH_RSA_DES_168_SHA,
     SSL_RSA_AES_256_SHA,
-    SSL_RSA_CAMELLIA_256_SHA,
     SSL_RSA_AES_128_SHA,
-    SSL_RSA_CAMELLIA_128_SHA,
-    SSL_RSA_DES_168_SHA,
-    SSL_RSA_RC4_128_SHA,
-    SSL_RSA_RC4_128_MD5,
     0
 };
+#endif
 static x509_cert certificate;
 static rsa_context key;
 bool_t builtInTestCertificate;
 
-havege_state hs; /* exported to crypt.c */
+#ifdef USE_POLARSSL_HAVEGE
+havege_state hs;
+#else
+int urandom_fd;
+#endif
 
 /* DH prime */
 char *my_dhm_P =
@@ -77,6 +85,7 @@ char *my_dhm_P =
        "DEF409C08E8AC24D1732A6128D2220DC53";
 char *my_dhm_G = "4";
 
+#ifdef USE_POLARSSL_TESTCERT
 static void initTestCert()
 {
        int rc;
@@ -96,6 +105,7 @@ static void initTestKey()
        if (rc != 0)
                Log_fatal("Could not parse built-in test RSA key");
 }
+#endif
 
 /*
  * How to generate a self-signed cert with openssl:
@@ -108,14 +118,22 @@ static void initCert()
        char *crtfile = (char *)getStrConf(CERTIFICATE);
        
        if (crtfile == NULL) {
-               Log_warn("No certificate file specified");
+#ifdef USE_POLARSSL_TESTCERT
+               Log_warn("No certificate file specified. Falling back to test certificate.");
                initTestCert();
+#else
+               Log_fatal("No certificate file specified");
+#endif
                return;
        }
        rc = x509parse_crtfile(&certificate, crtfile);
        if (rc != 0) {
-               Log_warn("Could not read certificate file %s", crtfile);
+#ifdef USE_POLARSSL_TESTCERT
+               Log_warn("Could not read certificate file '%s'. Falling back to test certificate.", crtfile);
                initTestCert();
+#else
+               Log_fatal("Could not read certificate file '%s'", crtfile);
+#endif
                return;
        }
 }
@@ -132,6 +150,20 @@ static void initKey()
                Log_fatal("Could not read RSA key file %s", keyfile);
 }
 
+#ifndef USE_POLARSSL_HAVEGE
+int urandom_bytes(void *ctx, unsigned char *dest, size_t len)
+{
+       int cur;
+
+       while (len) {
+               cur = read(urandom_fd, dest, len);
+               if (cur < 0)
+                       continue;
+               len -= cur;
+       }
+}
+#endif
+
 #define DEBUG_LEVEL 0
 static void pssl_debug(void *ctx, int level, const char *str)
 {
@@ -144,14 +176,27 @@ void SSLi_init(void)
        char verstring[12];
        
        initCert();
+#ifdef USE_POLARSSL_TESTCERT
        if (builtInTestCertificate) {
                Log_warn("*** Using built-in test certificate and RSA key ***");
-               Log_warn("*** This is not secure! Please use a CA-signed certificate or create a self-signed certificate ***");
+               Log_warn("*** This is not secure! Please use a CA-signed certificate or create a key and self-signed certificate ***");
                initTestKey();
        }
        else
                initKey();
+#else
+       initKey();
+#endif
+
+       /* Initialize random number generator */
+#ifdef USE_POLARSSL_HAVEGE
     havege_init(&hs);
+#else
+    urandom_fd = open("/dev/urandom", O_RDONLY);
+    if (urandom_fd < 0)
+           Log_fatal("Cannot open /dev/urandom");
+    Log_info("Using random number generator /dev/urandom");
+#endif
     
 #ifdef POLARSSL_VERSION_MAJOR
     version_get_string(verstring);
@@ -170,8 +215,13 @@ void SSLi_deinit(void)
 /* Create SHA1 of last certificate in the peer's chain. */
 bool_t SSLi_getSHA1Hash(SSL_handle_t *ssl, uint8_t *hash)
 {
-       x509_cert *cert = ssl->peer_cert;
-       if (!ssl->peer_cert) {
+       x509_cert const *cert;
+#ifdef POLARSSL_API_V1_2
+       cert = ssl_get_peer_cert(ssl);
+#else
+       cert = ssl->peer_cert;
+#endif
+       if (!cert) {
                return false;
        }       
        sha1(cert->raw.p, cert->raw.len, hash);
@@ -193,12 +243,17 @@ SSL_handle_t *SSLi_newconnection(int *fd, bool_t *SSLready)
        
        rc = ssl_init(ssl);
        if (rc != 0 )
-               Log_fatal("Failed to initalize: %d", rc);
+               Log_fatal("Failed to initialize: %d", rc);
        
        ssl_set_endpoint(ssl, SSL_IS_SERVER);   
        ssl_set_authmode(ssl, SSL_VERIFY_OPTIONAL);
-
+       
+#ifdef USE_POLARSSL_HAVEGE
        ssl_set_rng(ssl, HAVEGE_RAND, &hs);
+#else
+       ssl_set_rng(ssl, urandom_bytes, NULL);
+#endif
+       
        ssl_set_dbg(ssl, pssl_debug, NULL);
        ssl_set_bio(ssl, net_recv, fd, net_send, fd);
 
@@ -207,7 +262,12 @@ SSL_handle_t *SSLi_newconnection(int *fd, bool_t *SSLready)
 #else
        ssl_set_ciphers(ssl, ciphers);
 #endif
+
+#ifdef POLARSSL_API_V1_2
+    ssl_set_session(ssl, ssn);
+#else
     ssl_set_session(ssl, 0, 0, ssn);
+#endif
     
     ssl_set_ca_chain(ssl, &certificate, NULL, NULL);
        ssl_set_own_cert(ssl, &certificate, &key);