Lowered req autotools version to 2.63. Added 'foreign' switch to avoid adding standar...
[umurmur.git] / src / ssl.c
index 9d82cac4fbb097bdd8ece12af9ace8d8eedc0d39..6ed9aea15df1708fd46da57b73dc640eb478f354 100644 (file)
--- a/src/ssl.c
+++ b/src/ssl.c
@@ -1,5 +1,5 @@
-/* Copyright (C) 2009-2010, Martin Johansson <martin@fatbob.nu>
-   Copyright (C) 2005-2010, Thorvald Natvig <thorvald@natvig.com>
+/* Copyright (C) 2009-2011, Martin Johansson <martin@fatbob.nu>
+   Copyright (C) 2005-2011, Thorvald Natvig <thorvald@natvig.com>
 
    All rights reserved.
 
@@ -64,10 +64,12 @@ int ciphers[] =
 };
 static x509_cert certificate;
 static rsa_context key;
+bool_t builtInTestCertificate;
+
 havege_state hs; /* exported to crypt.c */
 
 /* DH prime */
-char *my_dhm_P =
+const char *my_dhm_P =
        "9CE85640903BF123906947FEDE767261" \
        "D9B4A973EB8F7D984A8C656E2BCC161C" \
        "183D4CA471BA78225F940F16D1D99CA3" \
@@ -75,19 +77,89 @@ char *my_dhm_P =
        "44FF6AB553EC7073AD0CB608F2A3B480" \
        "19E6C02BCED40BD30E91BB2469089670" \
        "DEF409C08E8AC24D1732A6128D2220DC53";
-char *my_dhm_G = "4";
+const char *my_dhm_G = "4";
+
+const char *test_key =
+       "-----BEGIN RSA PRIVATE KEY-----\r\n"
+       "MIICXAIBAAKBgQC/zZ5p/st9JUgoFIuNCwyYJhKhnqKlAk36RJJAXhJ/3FZCThQK\r\n"
+       "J0jxMCjnQb9envZPIKrAfyDtlEGKU8OI2HvDsFL7Y2fNjew0R9DoUyzPRVBInfW9\r\n"
+       "JP03aiOldpooTjXBrzoZV+DGqRYJE/IRJEyXir5NEJu624bMJm0XDVkxiwIDAQAB\r\n"
+       "AoGAPcFJiR01jYSsd+Mtj2sIUhCoHQuDmJdmXfcoE7t2P17FEzIqd55weN+lu9fK\r\n"
+       "cv/BlHaTI8mK45PBinUv1ubE6gzzyLtNgBW7ko8i23YQNMS4+8ApZZoCFsVbN533\r\n"
+       "/mFYcOmWpdgIsAOyi3gAyO5OyGA71a3gkNX+MDYc7PgbTkkCQQDq1NN/j6xVw4qc\r\n"
+       "3qunsMOVJxln7Gkgt0fOrCV0WltJNkKYiARwtpvB/SHIj6nHhun+J/ee/v+QjAL4\r\n"
+       "aUwC8OmnAkEA0RfWWVQ2Yxk9QjRcqcpDddtc+9xxM6Dt+edGDSYKRUB/S2cl/Sdg\r\n"
+       "abFdrFEnFdO03VknCrqUgweegeUJhU1tfQJBAKLFFjxK59cijMejCDRZr5eI3HFO\r\n"
+       "Sqgkoh8871Ew+ClM9OgpD3rY+CmEPZB5E+N7PmGublLEyXv1sHFi+w7m0e0CQDnH\r\n"
+       "eoYIzVapHNJ0ob6Rk/63dYRrsCRyLhDGpgbwIhps7kAp6sd/4BaU2qvJaSGQ9QPN\r\n"
+       "pQpD8NIcguKmJfFeKgkCQBABatS74xI2UAW/IIbRBg8a8z4v5JxEnQwp0EtmON2I\r\n"
+       "+AVBenUVFjpdjaaQ2/2IEgEwnzRfbERQfUlAkjczRaM=\r\n"
+       "-----END RSA PRIVATE KEY-----\r\n";
+
+const char *test_cert =
+       "-----BEGIN CERTIFICATE-----\r\n"
+       "MIICfDCCAeWgAwIBAgIJANEN9Jb9sp0oMA0GCSqGSIb3DQEBBQUAMFcxCzAJBgNV\r\n"
+       "BAYTAlNFMRMwEQYDVQQHDApHb3RoZW5idXJnMRAwDgYDVQQKDAd1TXVybXVyMSEw\r\n"
+       "HwYDVQQDDBh1TXVybXVyIHRlc3QgY2VydGlmaWNhdGUwHhcNMTEwMzIyMjIxMTEy\r\n"
+       "WhcNMjEwMzE5MjIxMTEyWjBXMQswCQYDVQQGEwJTRTETMBEGA1UEBwwKR290aGVu\r\n"
+       "YnVyZzEQMA4GA1UECgwHdU11cm11cjEhMB8GA1UEAwwYdU11cm11ciB0ZXN0IGNl\r\n"
+       "cnRpZmljYXRlMIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQC/zZ5p/st9JUgo\r\n"
+       "FIuNCwyYJhKhnqKlAk36RJJAXhJ/3FZCThQKJ0jxMCjnQb9envZPIKrAfyDtlEGK\r\n"
+       "U8OI2HvDsFL7Y2fNjew0R9DoUyzPRVBInfW9JP03aiOldpooTjXBrzoZV+DGqRYJ\r\n"
+       "E/IRJEyXir5NEJu624bMJm0XDVkxiwIDAQABo1AwTjAdBgNVHQ4EFgQUyI0/J6gS\r\n"
+       "G7vEZl1nKq9rAYAg/TMwHwYDVR0jBBgwFoAUyI0/J6gSG7vEZl1nKq9rAYAg/TMw\r\n"
+       "DAYDVR0TBAUwAwEB/zANBgkqhkiG9w0BAQUFAAOBgQCGL3T4a7g+MUtcjIq2XLON\r\n"
+       "cN/oPgPpMNcSPj7zQF1NVzjeQagvKIe3mL5sNIYuoIQm1Xm7aH2ueruhH0wkSOf0\r\n"
+       "+7U/g7r70U1CFWzfgwzz3EWRq3hUQmZ9/Xy9V2P/iRrFNyAKE8MneuVv3aAIN6/W\r\n"
+       "rWVxhCquqhFM3yIGe0f6hw==\r\n"
+       "-----END CERTIFICATE-----\r\n";
+
+
+static void initTestCert()
+{
+       int rc;
+       builtInTestCertificate = true;
+       rc = x509parse_crt(&certificate, (unsigned char *)test_cert,
+                                          strlen(test_cert));  
+       if (rc != 0)
+               Log_fatal("Could not parse built-in test certificate");
+       rc = x509parse_crt(&certificate, (unsigned char *)test_cert,
+                                          strlen(test_cert));  
+       if (rc != 0)
+               Log_fatal("Could not parse built-in test certificate");
+}
 
+static void initTestKey()
+{
+       int rc;
+       
+       rc = x509parse_key(&key, (unsigned char *)test_key,
+                                          strlen(test_key), NULL, 0);
+       if (rc != 0)
+               Log_fatal("Could not parse built-in test RSA key");
+}
+
+/*
+ * openssl genrsa 1024 > host.key
+ * openssl req -new -x509 -nodes -sha1 -days 365 -key host.key > host.cert
+ */
 static void initCert()
 {
        int rc;
        char *crtfile = (char *)getStrConf(CERTIFICATE);
        char *ca_file, *p;
        
-       if (crtfile == NULL)
-               Log_fatal("No certificate file specified"); 
+       if (crtfile == NULL) {
+               Log_warn("No certificate file specified");
+               initTestCert();
+               return;
+       }
        rc = x509parse_crtfile(&certificate, crtfile);
-       if (rc != 0)
-               Log_fatal("Could not read certificate file %s", crtfile);
+       if (rc != 0) {
+               Log_warn("Could not read certificate file %s", crtfile);
+               initTestCert();
+               return;
+       }
        
        /* Look for CA certificate file in same dir */
        ca_file = malloc(strlen(crtfile) + strlen(CA_CRT_FILENAME) + 1);
@@ -101,14 +173,17 @@ static void initCert()
        rc = x509parse_crtfile(&certificate, ca_file);
        if (rc != 0) { /* No CA certifiacte found. Assume self-signed. */
                Log_info("CA certificate file %s not found. Assuming self-signed certificate.", ca_file);
-               /*
-                * Apparently PolarSSL needs to read something more into certificate chain.
-                * Doesn't seem to matter what. Read own certificate again.
-                */
-               rc = x509parse_crtfile(&certificate, crtfile);
-               if (rc != 0)
-                       Log_fatal("Could not read certificate file %s", crtfile);
        }
+       
+       /*
+        * PolarSSL 0.11 - 0.12,1 has a bug; it ignores the last certificate in the chain.
+        * Read the certificate again so that it gets last in chain. Later releases like 0.14.0 works
+        * fine with the extra certificate, so I don't see any harm in doing so.
+        */
+       rc = x509parse_crtfile(&certificate, crtfile);
+       if (rc != 0)
+               Log_fatal("Could not read certificate file %s", crtfile);
+       
        free(ca_file);
 }
 
@@ -116,7 +191,7 @@ static void initKey()
 {
        int rc;
        char *keyfile = (char *)getStrConf(KEY);
-       
+
        if (keyfile == NULL)
                Log_fatal("No key file specified"); 
        rc = x509parse_keyfile(&key, keyfile, NULL);
@@ -125,7 +200,7 @@ static void initKey()
 }
 
 #define DEBUG_LEVEL 0
-static void pssl_debug(void *ctx, int level, char *str)
+static void pssl_debug(void *ctx, int level, const char *str)
 {
     if (level <= DEBUG_LEVEL)
                Log_debug("PolarSSL [level %d]: %s", level, str);
@@ -134,7 +209,13 @@ static void pssl_debug(void *ctx, int level, char *str)
 void SSLi_init(void)
 {
        initCert();
-       initKey();
+       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 ***");
+               initTestKey();
+       }
+       else
+               initKey();
     havege_init(&hs);
        Log_info("PolarSSL library initialized");
 }