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