On Fri, Sep 12, 2014 at 20:04, Ted Unangst wrote:
The neverending slog towards greatness continues.
Index: ressl.c
===================================================================
RCS file: /cvs/src/lib/libressl/ressl.c,v
retrieving revision 1.12
diff -u -p -r1.12 ressl.c
--- ressl.c 15 Aug 2014 16:55:32 -0000 1.12
+++ ressl.c 11 Sep 2014 19:18:49 -0000
@@ -29,7 +29,7 @@
#include <ressl.h>
#include "ressl_internal.h"
-extern struct ressl_config ressl_config_default;
+static struct ressl_config *ressl_config_default;
int
ressl_init(void)
@@ -42,6 +42,9 @@ ressl_init(void)
SSL_load_error_strings();
SSL_library_init();
+ if ((ressl_config_default = ressl_config_new()) == NULL)
+ return (-1);
+
ressl_initialised = 1;
return (0);
@@ -78,7 +81,7 @@ ressl_new(void)
if ((ctx = calloc(1, sizeof(*ctx))) == NULL)
return (NULL);
- ctx->config = &ressl_config_default;
+ ctx->config = ressl_config_default;
ressl_reset(ctx);
@@ -89,7 +92,7 @@ int
ressl_configure(struct ressl *ctx, struct ressl_config *config)
{
if (config == NULL)
- config = &ressl_config_default;
+ config = ressl_config_default;
ctx->config = config;
Index: ressl.h
===================================================================
RCS file: /cvs/src/lib/libressl/ressl.h,v
retrieving revision 1.13
diff -u -p -r1.13 ressl.h
--- ressl.h 27 Aug 2014 10:46:53 -0000 1.13
+++ ressl.h 16 Sep 2014 18:07:10 -0000
@@ -31,15 +31,15 @@ const char *ressl_error(struct ressl *ct
struct ressl_config *ressl_config_new(void);
void ressl_config_free(struct ressl_config *config);
-void ressl_config_set_ca_file(struct ressl_config *config, char *ca_file);
-void ressl_config_set_ca_path(struct ressl_config *config, char *ca_path);
-void ressl_config_set_cert_file(struct ressl_config *config, char *cert_file);
-void ressl_config_set_cert_mem(struct ressl_config *config, char *cert,
+int ressl_config_set_ca_file(struct ressl_config *config, const char *ca_file);
+int ressl_config_set_ca_path(struct ressl_config *config, const char *ca_path);
+int ressl_config_set_cert_file(struct ressl_config *config, const char
*cert_file);
+int ressl_config_set_cert_mem(struct ressl_config *config, const uint8_t *cert,
size_t len);
-void ressl_config_set_ciphers(struct ressl_config *config, char *ciphers);
+int ressl_config_set_ciphers(struct ressl_config *config, const char *ciphers);
int ressl_config_set_ecdhcurve(struct ressl_config *config, const char *);
-void ressl_config_set_key_file(struct ressl_config *config, char *key_file);
-void ressl_config_set_key_mem(struct ressl_config *config, char *key,
+int ressl_config_set_key_file(struct ressl_config *config, const char
*key_file);
+int ressl_config_set_key_mem(struct ressl_config *config, const uint8_t *key,
size_t len);
void ressl_config_set_verify_depth(struct ressl_config *config,
int verify_depth);
Index: ressl_config.c
===================================================================
RCS file: /cvs/src/lib/libressl/ressl_config.c,v
retrieving revision 1.8
diff -u -p -r1.8 ressl_config.c
--- ressl_config.c 27 Aug 2014 10:46:53 -0000 1.8
+++ ressl_config.c 16 Sep 2014 18:09:27 -0000
@@ -21,27 +21,60 @@
#include <ressl.h>
#include "ressl_internal.h"
-/*
- * Default configuration.
- */
-struct ressl_config ressl_config_default = {
- .ca_file = _PATH_SSL_CA_FILE,
- .ca_path = NULL,
- .ciphers = NULL,
- .ecdhcurve = NID_X9_62_prime256v1,
- .verify = 1,
- .verify_depth = 6,
-};
+static int
+set_string(const char **dest, const char *src)
+{
+ free((char *)*dest);
+ *dest = NULL;
+ if (src != NULL)
+ if ((*dest = strdup(src)) == NULL)
+ return -1;
+ return 0;
+}
+
+static void *
+memdup(const void *in, size_t len)
+{
+ void *out;
+
+ if ((out = malloc(len)) == NULL)
+ return NULL;
+ memcpy(out, in, len);
+ return out;
+}
+
+static int
+set_mem(char **dest, size_t *destlen, const void *src, size_t srclen)
+{
+ free(*dest);
+ *dest = NULL;
+ *destlen = 0;
+ if (src != NULL)
+ if ((*dest = memdup(src, srclen)) == NULL)
+ return -1;
+ *destlen = srclen;
+ return 0;
+}
struct ressl_config *
ressl_config_new(void)
{
struct ressl_config *config;
- if ((config = malloc(sizeof(*config))) == NULL)
+ if ((config = calloc(1, sizeof(*config))) == NULL)
return (NULL);
- memcpy(config, &ressl_config_default, sizeof(*config));
+ /*
+ * Default configuration.
+ */
+ if (ressl_config_set_ca_file(config, _PATH_SSL_CA_FILE) != 0) {
+ ressl_config_free(config);
+ return (NULL);
+ }
+ ressl_config_verify(config);
+ ressl_config_set_verify_depth(config, 6);
+ /* ? use function ? */
+ config->ecdhcurve = NID_X9_62_prime256v1;
return (config);
}
@@ -49,38 +82,50 @@ ressl_config_new(void)
void
ressl_config_free(struct ressl_config *config)
{
+ if (config == NULL)
+ return;
+ free((char *)config->ca_file);
+ free((char *)config->ca_path);
+ free((char *)config->cert_file);
+ free(config->cert_mem);
+ free((char *)config->ciphers);
+ free((char *)config->key_file);
+ if (config->key_mem != NULL) {
+ explicit_bzero(config->key_mem, config->key_len);
+ free(config->key_mem);
+ }
free(config);
}
-void
-ressl_config_set_ca_file(struct ressl_config *config, char *ca_file)
+int
+ressl_config_set_ca_file(struct ressl_config *config, const char *ca_file)
{
- config->ca_file = ca_file;
+ return set_string(&config->ca_file, ca_file);
}
-void
-ressl_config_set_ca_path(struct ressl_config *config, char *ca_path)
+int
+ressl_config_set_ca_path(struct ressl_config *config, const char *ca_path)
{
- config->ca_path = ca_path;
+ return set_string(&config->ca_path, ca_path);
}
-void
-ressl_config_set_cert_file(struct ressl_config *config, char *cert_file)
+int
+ressl_config_set_cert_file(struct ressl_config *config, const char *cert_file)
{
- config->cert_file = cert_file;
+ return set_string(&config->cert_file, cert_file);
}
-void
-ressl_config_set_cert_mem(struct ressl_config *config, char *cert, size_t len)
+int
+ressl_config_set_cert_mem(struct ressl_config *config, const uint8_t *cert,
+ size_t len)
{
- config->cert_mem = cert;
- config->cert_len = len;
+ return set_mem(&config->cert_mem, &config->cert_len, cert, len);
}
-void
-ressl_config_set_ciphers(struct ressl_config *config, char *ciphers)
+int
+ressl_config_set_ciphers(struct ressl_config *config, const char *ciphers)
{
- config->ciphers = ciphers;
+ return set_string(&config->ciphers, ciphers);
}
int
@@ -95,17 +140,19 @@ ressl_config_set_ecdhcurve(struct ressl_
return (0);
}
-void
-ressl_config_set_key_file(struct ressl_config *config, char *key_file)
+int
+ressl_config_set_key_file(struct ressl_config *config, const char *key_file)
{
- config->key_file = key_file;
+ return set_string(&config->key_file, key_file);
}
-void
-ressl_config_set_key_mem(struct ressl_config *config, char *key, size_t len)
+int
+ressl_config_set_key_mem(struct ressl_config *config, const uint8_t *key,
+ size_t len)
{
- config->key_mem = key;
- config->key_len = len;
+ if (config->key_mem)
+ explicit_bzero(config->key_mem, config->key_len);
+ return set_mem(&config->key_mem, &config->key_len, key, len);
}
void