libcli:auth: Use GnuTLS MD5 in encode_wkssvc_join_password_buffer()
authorAndreas Schneider <asn@samba.org>
Wed, 15 May 2019 06:03:31 +0000 (08:03 +0200)
committerAndrew Bartlett <abartlet@samba.org>
Tue, 21 May 2019 00:03:20 +0000 (00:03 +0000)
Signed-off-by: Andreas Schneider <asn@samba.org>
Reviewed-by: Andrew Bartlett <abartlet@samba.org>
libcli/auth/smbencrypt.c

index c1ce65388f49ae6781849e8f87ad8a5e9df5c7ea..ca1d42b678de1a512a14bf95214a801375a113ba 100644 (file)
@@ -906,11 +906,12 @@ void encode_wkssvc_join_password_buffer(TALLOC_CTX *mem_ctx,
                                        struct wkssvc_PasswordBuffer **pwd_buf)
 {
        uint8_t buffer[516];
-       MD5_CTX ctx;
+       gnutls_hash_hd_t hash_hnd = NULL;
        struct wkssvc_PasswordBuffer *my_pwd_buf = NULL;
        DATA_BLOB confounded_session_key;
        int confounder_len = 8;
        uint8_t confounder[8];
+       int rc;
 
        my_pwd_buf = talloc_zero(mem_ctx, struct wkssvc_PasswordBuffer);
        if (!my_pwd_buf) {
@@ -923,19 +924,39 @@ void encode_wkssvc_join_password_buffer(TALLOC_CTX *mem_ctx,
 
        generate_random_buffer((uint8_t *)confounder, confounder_len);
 
-       MD5Init(&ctx);
-       MD5Update(&ctx, session_key->data, session_key->length);
-       MD5Update(&ctx, confounder, confounder_len);
-       MD5Final(confounded_session_key.data, &ctx);
+       GNUTLS_FIPS140_SET_LAX_MODE();
+
+       rc = gnutls_hash_init(&hash_hnd, GNUTLS_DIG_MD5);
+       if (rc < 0) {
+               goto out;
+       }
+
+       rc = gnutls_hash(hash_hnd, session_key->data, session_key->length);
+       if (rc < 0) {
+               gnutls_hash_deinit(hash_hnd, NULL);
+               goto out;
+       }
+       rc = gnutls_hash(hash_hnd, confounder, confounder_len);
+       if (rc < 0) {
+               gnutls_hash_deinit(hash_hnd, NULL);
+               goto out;
+       }
+       gnutls_hash_deinit(hash_hnd, confounded_session_key.data);
 
        arcfour_crypt_blob(buffer, 516, &confounded_session_key);
 
        memcpy(&my_pwd_buf->data[0], confounder, confounder_len);
+       ZERO_ARRAY(confounder);
        memcpy(&my_pwd_buf->data[8], buffer, 516);
+       ZERO_ARRAY(buffer);
 
-       data_blob_free(&confounded_session_key);
+       data_blob_clear_free(&confounded_session_key);
 
        *pwd_buf = my_pwd_buf;
+
+out:
+       GNUTLS_FIPS140_SET_STRICT_MODE();
+       return;
 }
 
 WERROR decode_wkssvc_join_password_buffer(TALLOC_CTX *mem_ctx,