-/* 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.
#include <polarssl/ssl.h>
#include <polarssl/net.h>
-#define CA_CRT_FILENAME "ca.crt"
-
int ciphers[] =
{
SSL_EDH_RSA_AES_256_SHA,
};
static x509_cert certificate;
static rsa_context key;
+bool_t builtInTestCertificate;
+
havege_state hs; /* exported to crypt.c */
/* DH prime */
"DEF409C08E8AC24D1732A6128D2220DC53";
char *my_dhm_G = "4";
+static void initTestCert()
+{
+ int rc;
+ builtInTestCertificate = true;
+ rc = x509parse_crt(&certificate, (unsigned char *)test_srv_crt,
+ strlen(test_srv_crt));
+ if (rc != 0)
+ Log_fatal("Could not parse built-in test certificate");
+}
+
+static void initTestKey()
+{
+ int rc;
+
+ rc = x509parse_key(&key, (unsigned char *)test_srv_key,
+ strlen(test_srv_key), NULL, 0);
+ if (rc != 0)
+ Log_fatal("Could not parse built-in test RSA key");
+}
+
+/*
+ * How to generate a self-signed cert with openssl:
+ * 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);
-
- /* Look for CA certificate file in same dir */
- ca_file = malloc(strlen(crtfile) + strlen(CA_CRT_FILENAME) + 1);
- strcpy(ca_file, crtfile);
- p = strrchr(ca_file, '/');
- if (p != NULL)
- strcpy(p + 1, CA_CRT_FILENAME);
- else
- strcpy(ca_file, CA_CRT_FILENAME);
-
- 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);
+ if (rc != 0) {
+ Log_warn("Could not read certificate file %s", crtfile);
+ initTestCert();
+ return;
}
}
{
int rc;
char *keyfile = (char *)getStrConf(KEY);
-
+
if (keyfile == NULL)
Log_fatal("No key file specified");
rc = x509parse_keyfile(&key, keyfile, NULL);
}
#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);
void SSLi_init(void)
{
+ char verstring[12];
+
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);
+
+#ifdef POLARSSL_VERSION_MAJOR
+ version_get_string(verstring);
+ Log_info("PolarSSL library version %s initialized", verstring);
+#else
Log_info("PolarSSL library initialized");
+#endif
}
void SSLi_deinit(void)
Log_fatal("Failed to initalize: %d", rc);
ssl_set_endpoint(ssl, SSL_IS_SERVER);
- ssl_set_authmode(ssl, SSL_VERIFY_OPTIONAL);
+ ssl_set_authmode(ssl, SSL_VERIFY_NONE);
- ssl_set_rng(ssl, havege_rand, &hs);
- ssl_set_dbg(ssl, pssl_debug, NULL);
- ssl_set_bio(ssl, net_recv, fd, net_send, fd);
+ ssl_set_rng(ssl, HAVEGE_RAND, &hs);
+ ssl_set_dbg(ssl, pssl_debug, NULL);
+ ssl_set_bio(ssl, net_recv, fd, net_send, fd);
- ssl_set_ciphers(ssl, ciphers);
+#ifdef POLARSSL_API_V1
+ ssl_set_ciphersuites(ssl, ciphers);
+#else
+ ssl_set_ciphers(ssl, ciphers);
+#endif
ssl_set_session(ssl, 0, 0, ssn);
- ssl_set_ca_chain(ssl, certificate.next, NULL, NULL);
- ssl_set_own_cert(ssl, &certificate, &key);
- ssl_set_dh_param(ssl, my_dhm_P, my_dhm_G);
+ ssl_set_own_cert(ssl, &certificate, &key);
+ ssl_set_dh_param(ssl, my_dhm_P, my_dhm_G);
return ssl;
}
rc = ssl_handshake(ssl);
if (rc != 0) {
+#ifdef POLARSSL_API_V1
+ if (rc == POLARSSL_ERR_NET_WANT_READ || rc == POLARSSL_ERR_NET_WANT_WRITE) {
+#else
if (rc == POLARSSL_ERR_NET_TRY_AGAIN) {
+#endif
return 0;
} else {
Log_warn("SSL handshake failed: %d", rc);
int SSLi_read(SSL_handle_t *ssl, uint8_t *buf, int len)
{
int rc;
+
rc = ssl_read(ssl, buf, len);
+#ifdef POLARSSL_API_V1
+ if (rc == POLARSSL_ERR_NET_WANT_READ)
+#else
if (rc == POLARSSL_ERR_NET_TRY_AGAIN)
+#endif
return SSLI_ERROR_WANT_READ;
return rc;
}
int SSLi_write(SSL_handle_t *ssl, uint8_t *buf, int len)
{
int rc;
+
rc = ssl_write(ssl, buf, len);
+#ifdef POLARSSL_API_V1
+ if (rc == POLARSSL_ERR_NET_WANT_WRITE)
+#else
if (rc == POLARSSL_ERR_NET_TRY_AGAIN)
+#endif
return SSLI_ERROR_WANT_WRITE;
return rc;
}
void SSLi_free(SSL_handle_t *ssl)
{
- free(ssl->session);
+ Log_debug("SSLi_free");
+ free(ssl->session); /* XXX - Hmmm. */
+ ssl_free(ssl);
free(ssl);
}