Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
6 changes: 6 additions & 0 deletions ext/tls/data/README
Original file line number Diff line number Diff line change
Expand Up @@ -8,3 +8,9 @@ $ openssl req -x509 -newkey rsa:4096 -keyout test-key.pem -out test-cert.pem -da
Set the private key password to 'cafebabe', and
"Common Name (e.g. server FQDN or YOUR name)" to 'localhost', in order
to run the test script successfully.

test-key-aes.pem contains the same key, encrypted with AES-256-CBC
instead of 3DES, because Mbed TLS 4.x doesn't support 3DES (and Mbed
TLS 2.x can't decrypt AES-encrypted keys). Regenerate it with:

$ openssl pkcs8 -in test-key.pem -topk8 -v2 aes-256-cbc -v2prf hmacWithSHA256 -out test-key-aes.pem
54 changes: 54 additions & 0 deletions ext/tls/data/test-key-aes.pem
Original file line number Diff line number Diff line change
@@ -0,0 +1,54 @@
-----BEGIN ENCRYPTED PRIVATE KEY-----
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
-----END ENCRYPTED PRIVATE KEY-----
11 changes: 9 additions & 2 deletions ext/tls/test.scm
Original file line number Diff line number Diff line change
Expand Up @@ -42,10 +42,17 @@
(tls-bind serv #f 0)
(set! serv-port (sockaddr-port (connection-self-address serv)))
(and (integer? serv-port) (positive? serv-port))))
;; Mbed TLS 4.x can't decrypt the 3DES-encrypted test-key.pem,
;; and Mbed TLS 2.x can't decrypt the AES-encrypted
;; test-key-aes.pem. Both contain the same key.
(test* "loading private key" #t
(boolean
(tls-load-private-key serv (datafile "test-key.pem")
"cafebabe")))
(guard (e [else
(tls-load-private-key serv
(datafile "test-key.pem")
"cafebabe")])
(tls-load-private-key serv (datafile "test-key-aes.pem")
"cafebabe"))))
(test* "loading server cert" #t
(boolean
(tls-load-certificate serv (datafile "test-cert.pem"))))
Expand Down
39 changes: 31 additions & 8 deletions ext/tls/tls-mbed.c
Original file line number Diff line number Diff line change
Expand Up @@ -39,8 +39,11 @@
#include <mbedtls/version.h>
#include <mbedtls/error.h>
#include <mbedtls/ssl.h>
#if MBEDTLS_VERSION_MAJOR < 4
/* Mbed TLS 4.x uses the PSA random generator internally */
#include <mbedtls/ctr_drbg.h>
#include <mbedtls/entropy.h>
#endif
#include <mbedtls/net_sockets.h>
#include <mbedtls/debug.h>
#include <psa/crypto.h> /* for psa_crypto_init */
Expand Down Expand Up @@ -85,8 +88,10 @@ typedef struct ScmMbedTLSRec {
enum MbedState state;
mbedtls_ssl_context ctx;
mbedtls_net_context conn;
#if MBEDTLS_VERSION_MAJOR < 4
mbedtls_entropy_context entropy;
mbedtls_ctr_drbg_context ctr_drbg;
#endif
mbedtls_ssl_config conf;
mbedtls_x509_crt ca;
mbedtls_pk_context pk;
Expand Down Expand Up @@ -153,11 +158,14 @@ static ScmObj mbed_connect(ScmTLS *tls,
ScmMbedTLS* t = (ScmMbedTLS*)tls;

mbed_context_check(t, "connect");
int r;
#if MBEDTLS_VERSION_MAJOR < 4
const char* pers = "Gauche";
int r = mbedtls_ctr_drbg_seed(&t->ctr_drbg, mbedtls_entropy_func,
&t->entropy,
(const unsigned char *)pers, strlen(pers));
r = mbedtls_ctr_drbg_seed(&t->ctr_drbg, mbedtls_entropy_func,
&t->entropy,
(const unsigned char *)pers, strlen(pers));
if (r != 0) mbed_error("mbedtls_ctr_drbg_seed() failed: %s (%d)", r);
#endif

int mbedtls_proto = MBEDTLS_NET_PROTO_TCP;
if (proto == SCM_TLS_PROTO_UDP) {
Expand All @@ -172,7 +180,9 @@ static ScmObj mbed_connect(ScmTLS *tls,
MBEDTLS_SSL_TRANSPORT_STREAM,
MBEDTLS_SSL_PRESET_DEFAULT);
if (r != 0) mbed_error("mbedtls_ssl_config_defaults() failed: %s (%d)", r);
#if MBEDTLS_VERSION_MAJOR < 4
mbedtls_ssl_conf_rng(&t->conf, mbedtls_ctr_drbg_random, &t->ctr_drbg);
#endif

ScmObj ca_bundle_path = SCM_UNDEFINED;
SCM_BIND_PROC(ca_bundle_path, "tls-ca-bundle-path",
Expand Down Expand Up @@ -246,13 +256,15 @@ static ScmObj mbed_bind(ScmTLS *tls,
mbed_error("mbedtls_net_bind() failed: %s (%d)", r);
}

#if MBEDTLS_VERSION_MAJOR < 4
const char* pers = "Gauche";
r = mbedtls_ctr_drbg_seed(&t->ctr_drbg, mbedtls_entropy_func,
&t->entropy,
(const unsigned char *)pers, strlen(pers));
if (r != 0) {
mbed_error("mbedtls_ctr_drbg_seed() failed: %s (%d)", r);
}
#endif

r = mbedtls_ssl_config_defaults(&t->conf,
MBEDTLS_SSL_IS_SERVER,
Expand All @@ -262,7 +274,9 @@ static ScmObj mbed_bind(ScmTLS *tls,
mbed_error("mbedtls_ssl_config_defaults() failed: %s (%d)", r);
}

#if MBEDTLS_VERSION_MAJOR < 4
mbedtls_ssl_conf_rng(&t->conf, mbedtls_ctr_drbg_random, &t->ctr_drbg);
#endif

r = mbedtls_ssl_conf_own_cert(&t->conf, &t->ca, &t->pk);
if (r != 0) {
Expand Down Expand Up @@ -400,11 +414,15 @@ static void mbed_cleanup(ScmMbedTLS *t)
idea. Also, ssl_context should be cleaned up before ssl_config. */
mbedtls_ssl_close_notify(&t->ctx);
mbedtls_net_free(&t->conn);
#if MBEDTLS_VERSION_MAJOR < 4
mbedtls_entropy_free(&t->entropy);
#endif
mbedtls_pk_free(&t->pk);
mbedtls_x509_crt_free(&t->ca);
mbedtls_ssl_free(&t->ctx);
#if MBEDTLS_VERSION_MAJOR < 4
mbedtls_ctr_drbg_free(&t->ctr_drbg);
#endif
mbedtls_ssl_config_free(&t->conf);
}

Expand Down Expand Up @@ -434,27 +452,28 @@ static ScmObj mbed_load_certificate(ScmTLS *tls,
return SCM_OBJ(tls);
}

#if MBEDTLS_VERSION_MAJOR >= 3
#if MBEDTLS_VERSION_MAJOR == 3
static int rng_get(void *prng, unsigned char *output, size_t output_len)
{
mbedtls_ctr_drbg_context *rng = prng;
return mbedtls_ctr_drbg_random(rng, output, output_len);
}
#endif /*MBEDTLS_VERSION_MAJOR >= 3*/
#endif /*MBEDTLS_VERSION_MAJOR == 3*/

static ScmObj mbed_load_private_key(ScmTLS *tls,
const char *filename,
const char *password)
{
ScmMbedTLS *t = (ScmMbedTLS*)tls;
#if MBEDTLS_VERSION_MAJOR < 3
#if MBEDTLS_VERSION_MAJOR < 3 || MBEDTLS_VERSION_MAJOR >= 4
/* Mbed TLS 4.x dropped the RNG arguments again */
int r = mbedtls_pk_parse_keyfile(&t->pk, filename, password);
#else /*MBEDTLS_VERSION_MAJOR >= 3*/
#else /*MBEDTLS_VERSION_MAJOR == 3*/
mbedtls_ctr_drbg_context rng;
mbedtls_ctr_drbg_init(&rng);
int r = mbedtls_pk_parse_keyfile(&t->pk, filename, password,
rng_get, &rng);
#endif /*MBEDTLS_VERSION_MAJOR >= 3*/
#endif /*MBEDTLS_VERSION_MAJOR == 3*/
if (r != 0) {
const int bufsiz = 4096;
char buf[bufsiz];
Expand Down Expand Up @@ -545,12 +564,16 @@ static ScmObj mbed_allocate(ScmClass *klass, ScmObj initargs)

t->state = UNCONNECTED;
mbedtls_ssl_config_init(&t->conf);
#if MBEDTLS_VERSION_MAJOR < 4
mbedtls_ctr_drbg_init(&t->ctr_drbg);
#endif
mbedtls_net_init(&t->conn);
mbedtls_ssl_init(&t->ctx);
mbedtls_x509_crt_init(&t->ca);
mbedtls_pk_init(&t->pk);
#if MBEDTLS_VERSION_MAJOR < 4
mbedtls_entropy_init(&t->entropy);
#endif

#ifdef MBEDTLS_DEBUG_C
mbedtls_ssl_conf_dbg(&t->conf, mbed_debug, stderr);
Expand Down
6 changes: 4 additions & 2 deletions ext/tls/tls.ac
Original file line number Diff line number Diff line change
Expand Up @@ -110,8 +110,10 @@ AS_IF([test $use_mbed = yes], [
LIBS_SAVE=${LIBS}
LDFLAGS="${LDFLAGS} ${MBEDTLS_LDFLAGS}"
MBEDTLS_LIBS=""
AC_SEARCH_LIBS([mbedtls_ctr_drbg_init], [mbedcrypto-3 mbedcrypto],
[MBEDTLS_LIBS="$ac_cv_search_mbedtls_ctr_drbg_init ${MBEDTLS_LIBS}"],
dnl Mbed TLS 4.x moved the crypto library to TF-PSA-Crypto, and the
dnl CTR-DRBG functions are private there.
AC_SEARCH_LIBS([psa_crypto_init], [mbedcrypto-3 mbedcrypto tfpsacrypto],
[MBEDTLS_LIBS="$ac_cv_search_psa_crypto_init ${MBEDTLS_LIBS}"],
[mbedtls_unavailable=yes])
AC_SEARCH_LIBS([mbedtls_x509_crt_init], [mbedx509-3 mbedx509],
[MBEDTLS_LIBS="$ac_cv_search_mbedtls_x509_crt_init ${MBEDTLS_LIBS}"],
Expand Down