From 17be959fd7ae07da32a61adb396cb0d8c0c1d3da Mon Sep 17 00:00:00 2001 From: David Woodhouse Date: Thu, 19 Jun 2014 14:11:28 +0100 Subject: [PATCH] Add openconnect_md5() function for NTLMv2 Signed-off-by: David Woodhouse --- gnutls.c | 13 +++++++++++++ openconnect-internal.h | 1 + openssl.c | 11 +++++++++++ 3 files changed, 25 insertions(+) diff --git a/gnutls.c b/gnutls.c index ffd84bbc..abfacde3 100644 --- a/gnutls.c +++ b/gnutls.c @@ -2139,6 +2139,19 @@ int openconnect_sha1(unsigned char *result, void *data, int datalen) return 0; } +int openconnect_md5(unsigned char *result, void *data, int datalen) +{ + gnutls_datum_t d; + size_t md5len = MD5_SIZE; + + d.data = data; + d.size = datalen; + if (gnutls_fingerprint(GNUTLS_DIG_MD5, &d, result, &md5len)) + return -1; + + return 0; +} + int openconnect_random(void *bytes, int len) { if (gnutls_rnd(GNUTLS_RND_RANDOM, bytes, len)) diff --git a/openconnect-internal.h b/openconnect-internal.h index a207212e..377839c0 100644 --- a/openconnect-internal.h +++ b/openconnect-internal.h @@ -533,6 +533,7 @@ int cstp_handshake(struct openconnect_info *vpninfo, unsigned init); int get_cert_md5_fingerprint(struct openconnect_info *vpninfo, OPENCONNECT_X509 *cert, char *buf); int openconnect_sha1(unsigned char *result, void *data, int len); +int openconnect_md5(unsigned char *result, void *data, int len); int openconnect_random(void *bytes, int len); int openconnect_local_cert_md5(struct openconnect_info *vpninfo, char *buf); diff --git a/openssl.c b/openssl.c index 871eef68..90dc06f4 100644 --- a/openssl.c +++ b/openssl.c @@ -44,6 +44,17 @@ int openconnect_sha1(unsigned char *result, void *data, int len) return 0; } +int openconnect_md5(unsigned char *result, void *data, int len) +{ + EVP_MD_CTX c; + + EVP_MD_CTX_init(&c); + EVP_Digest(data, len, result, NULL, EVP_md5(), NULL); + EVP_MD_CTX_cleanup(&c); + + return 0; +} + int openconnect_get_cert_DER(struct openconnect_info *vpninfo, OPENCONNECT_X509 *cert, unsigned char **buf) {