diff --git a/include/libwebsockets.h b/include/libwebsockets.h index 04932f7c1..3b5504a21 100644 --- a/include/libwebsockets.h +++ b/include/libwebsockets.h @@ -539,6 +539,7 @@ struct lws; #if defined(LWS_WITH_TLS) #if defined(LWS_WITH_MBEDTLS) +#include #include #include #include diff --git a/include/libwebsockets/lws-genhash.h b/include/libwebsockets/lws-genhash.h index 6712caab0..ef0560352 100644 --- a/include/libwebsockets/lws-genhash.h +++ b/include/libwebsockets/lws-genhash.h @@ -34,6 +34,7 @@ enum lws_genhash_types { LWS_GENHASH_TYPE_UNKNOWN, + LWS_GENHASH_TYPE_MD5, LWS_GENHASH_TYPE_SHA1, LWS_GENHASH_TYPE_SHA256, LWS_GENHASH_TYPE_SHA384, @@ -53,7 +54,8 @@ struct lws_genhash_ctx { uint8_t type; #if defined(LWS_WITH_MBEDTLS) union { - mbedtls_sha1_context sha1; + mbedtls_md5_context md5; + mbedtls_sha1_context sha1; mbedtls_sha256_context sha256; mbedtls_sha512_context sha512; /* 384 also uses this */ const mbedtls_md_info_t *hmac; diff --git a/lib/tls/lws-gencrypto-common.c b/lib/tls/lws-gencrypto-common.c index 243c8abed..468b530e2 100644 --- a/lib/tls/lws-gencrypto-common.c +++ b/lib/tls/lws-gencrypto-common.c @@ -626,6 +626,8 @@ lws_genhash_size(enum lws_genhash_types type) switch(type) { case LWS_GENHASH_TYPE_UNKNOWN: return 0; + case LWS_GENHASH_TYPE_MD5: + return 16; case LWS_GENHASH_TYPE_SHA1: return 20; case LWS_GENHASH_TYPE_SHA256: diff --git a/lib/tls/mbedtls/lws-gencrypto.c b/lib/tls/mbedtls/lws-gencrypto.c index abbfd563e..dd91ad5a4 100644 --- a/lib/tls/mbedtls/lws-gencrypto.c +++ b/lib/tls/mbedtls/lws-gencrypto.c @@ -30,6 +30,9 @@ lws_gencrypto_mbedtls_hash_to_MD_TYPE(enum lws_genhash_types hash_type) mbedtls_md_type_t h = -1; switch (hash_type) { + case LWS_GENHASH_TYPE_MD5: + h = MBEDTLS_MD_MD5; + break; case LWS_GENHASH_TYPE_SHA1: h = MBEDTLS_MD_SHA1; break; diff --git a/lib/tls/mbedtls/lws-genhash.c b/lib/tls/mbedtls/lws-genhash.c index a5770d62e..7fee58947 100644 --- a/lib/tls/mbedtls/lws-genhash.c +++ b/lib/tls/mbedtls/lws-genhash.c @@ -36,6 +36,10 @@ lws_genhash_init(struct lws_genhash_ctx *ctx, enum lws_genhash_types type) ctx->type = type; switch (ctx->type) { + case LWS_GENHASH_TYPE_MD5: + mbedtls_md5_init(&ctx->u.md5); + MBA(mbedtls_md5_starts)(&ctx->u.md5); + break; case LWS_GENHASH_TYPE_SHA1: mbedtls_sha1_init(&ctx->u.sha1); MBA(mbedtls_sha1_starts)(&ctx->u.sha1); @@ -66,6 +70,9 @@ lws_genhash_update(struct lws_genhash_ctx *ctx, const void *in, size_t len) return 0; switch (ctx->type) { + case LWS_GENHASH_TYPE_MD5: + MBA(mbedtls_md5_update)(&ctx->u.md5, in, len); + break; case LWS_GENHASH_TYPE_SHA1: MBA(mbedtls_sha1_update)(&ctx->u.sha1, in, len); break; @@ -87,6 +94,10 @@ int lws_genhash_destroy(struct lws_genhash_ctx *ctx, void *result) { switch (ctx->type) { + case LWS_GENHASH_TYPE_MD5: + MBA(mbedtls_md5_finish)(&ctx->u.md5, result); + mbedtls_md5_free(&ctx->u.md5); + break; case LWS_GENHASH_TYPE_SHA1: MBA(mbedtls_sha1_finish)(&ctx->u.sha1, result); mbedtls_sha1_free(&ctx->u.sha1); diff --git a/lib/tls/openssl/lws-gencrypto.c b/lib/tls/openssl/lws-gencrypto.c index 995e26183..dd74149dd 100644 --- a/lib/tls/openssl/lws-gencrypto.c +++ b/lib/tls/openssl/lws-gencrypto.c @@ -37,6 +37,9 @@ lws_gencrypto_openssl_hash_to_NID(enum lws_genhash_types hash_type) switch (hash_type) { case LWS_GENHASH_TYPE_UNKNOWN: break; + case LWS_GENHASH_TYPE_MD5: + h = NID_md5; + break; case LWS_GENHASH_TYPE_SHA1: h = NID_sha1; break; @@ -62,6 +65,9 @@ lws_gencrypto_openssl_hash_to_EVP_MD(enum lws_genhash_types hash_type) switch (hash_type) { case LWS_GENHASH_TYPE_UNKNOWN: break; + case LWS_GENHASH_TYPE_MD5: + h = EVP_md5(); + break; case LWS_GENHASH_TYPE_SHA1: h = EVP_sha1(); break; diff --git a/lib/tls/openssl/lws-genhash.c b/lib/tls/openssl/lws-genhash.c index 6f686adae..88039048f 100644 --- a/lib/tls/openssl/lws-genhash.c +++ b/lib/tls/openssl/lws-genhash.c @@ -37,6 +37,9 @@ lws_genhash_init(struct lws_genhash_ctx *ctx, enum lws_genhash_types type) return 1; switch (ctx->type) { + case LWS_GENHASH_TYPE_MD5: + ctx->evp_type = EVP_md5(); + break; case LWS_GENHASH_TYPE_SHA1: ctx->evp_type = EVP_sha1(); break;