1 From e498737a96e8832a2cb9141ab1fe51e129185a48 Mon Sep 17 00:00:00 2001
2 From: Simo Sorce <simo@redhat.com>
3 Date: Wed, 29 Jun 2016 11:15:11 -0400
4 Subject: [PATCH] Add compatibility with OpenSSL 1.1.0
6 In their continued wisdom OpenSSL developers keep breaking APIs left and right
7 with very poor documentation and forward/backward source compatibility.
9 Signed-off-by: Simo Sorce <simo@redhat.com>
11 src/crypto.c | 60 +++++++++++++++++++++++++++++++++++++++++-----------
12 1 file changed, 48 insertions(+), 12 deletions(-)
14 diff --git a/src/crypto.c b/src/crypto.c
15 index 9fe69f9..33a0c3e 100644
22 +#if OPENSSL_VERSION_NUMBER < 0x10100000L
23 +HMAC_CTX *HMAC_CTX_new(void)
27 + ctx = OPENSSL_malloc(sizeof(HMAC_CTX));
28 + if (!ctx) return NULL;
35 +void HMAC_CTX_free(HMAC_CTX *ctx)
37 + if (ctx == NULL) return;
39 + HMAC_CTX_cleanup(ctx);
43 +#define EVP_MD_CTX_new EVP_MD_CTX_create
44 +#define EVP_MD_CTX_free EVP_MD_CTX_destroy
48 int RAND_BUFFER(struct ntlm_buffer *random)
51 @@ -42,30 +68,34 @@ int HMAC_MD5_IOV(struct ntlm_buffer *key,
53 struct ntlm_buffer *result)
61 if (result->length != 16) return EINVAL;
63 - HMAC_CTX_init(&hmac_ctx);
64 + hmac_ctx = HMAC_CTX_new();
70 - ret = HMAC_Init_ex(&hmac_ctx, key->data, key->length, EVP_md5(), NULL);
71 + ret = HMAC_Init_ex(hmac_ctx, key->data, key->length, EVP_md5(), NULL);
77 for (i = 0; i < iov->num; i++) {
78 - ret = HMAC_Update(&hmac_ctx, iov->data[i]->data, iov->data[i]->length);
79 + ret = HMAC_Update(hmac_ctx, iov->data[i]->data, iov->data[i]->length);
86 - ret = HMAC_Final(&hmac_ctx, result->data, &len);
87 + ret = HMAC_Final(hmac_ctx, result->data, &len);
91 @@ -74,7 +104,7 @@ int HMAC_MD5_IOV(struct ntlm_buffer *key,
95 - HMAC_CTX_cleanup(&hmac_ctx);
96 + HMAC_CTX_free(hmac_ctx);
100 @@ -93,26 +123,32 @@ static int mdx_hash(const EVP_MD *type,
101 struct ntlm_buffer *payload,
102 struct ntlm_buffer *result)
109 if (result->length != 16) return EINVAL;
111 - EVP_MD_CTX_init(&ctx);
112 - ret = EVP_DigestInit_ex(&ctx, type, NULL);
113 + ctx = EVP_MD_CTX_new();
119 + EVP_MD_CTX_init(ctx);
120 + ret = EVP_DigestInit_ex(ctx, type, NULL);
126 - ret = EVP_DigestUpdate(&ctx, payload->data, payload->length);
127 + ret = EVP_DigestUpdate(ctx, payload->data, payload->length);
133 - ret = EVP_DigestFinal_ex(&ctx, result->data, &len);
134 + ret = EVP_DigestFinal_ex(ctx, result->data, &len);
138 @@ -121,7 +157,7 @@ static int mdx_hash(const EVP_MD *type,
142 - EVP_MD_CTX_cleanup(&ctx);
143 + if (ctx) EVP_MD_CTX_free(ctx);