libcli:smb: Use GnuTLS SHA256 HMAC in smb2_signing_sign_pdu()
authorAndreas Schneider <asn@samba.org>
Thu, 14 Mar 2019 16:22:22 +0000 (17:22 +0100)
committerAndrew Bartlett <abartlet@samba.org>
Tue, 30 Apr 2019 23:18:27 +0000 (23:18 +0000)
Signed-off-by: Andreas Schneider <asn@samba.org>
Reviewed-by: Andrew Bartlett <abartlet@samba.org>
libcli/smb/smb2_signing.c

index 1577dee5b0b54b5ef8f8341514aefab0bf160f23..22d1939c7aa32048f4475e7cc277544f4d8dce0b 100644 (file)
@@ -82,17 +82,29 @@ NTSTATUS smb2_signing_sign_pdu(DATA_BLOB signing_key,
 
                ZERO_ARRAY(key);
        } else {
-               struct HMACSHA256Context m;
-               uint8_t digest[SHA256_DIGEST_LENGTH];
+               gnutls_hmac_hd_t hmac_hnd = NULL;
+               uint8_t digest[gnutls_hmac_get_len(GNUTLS_MAC_SHA256)];
+               int rc;
+
+               rc = gnutls_hmac_init(&hmac_hnd,
+                                     GNUTLS_MAC_SHA256,
+                                     signing_key.data,
+                                     MIN(signing_key.length, 16));
+               if (rc < 0) {
+                       return NT_STATUS_NO_MEMORY;
+               }
 
-               ZERO_STRUCT(m);
-               hmac_sha256_init(signing_key.data, MIN(signing_key.length, 16), &m);
-               for (i=0; i < count; i++) {
-                       hmac_sha256_update((const uint8_t *)vector[i].iov_base,
-                                          vector[i].iov_len, &m);
+               for (i = 0; i < count; i++) {
+                       rc = gnutls_hmac(hmac_hnd,
+                                        vector[i].iov_base,
+                                        vector[i].iov_len);
+                       if (rc < 0) {
+                               gnutls_hmac_deinit(hmac_hnd, NULL);
+                               return NT_STATUS_NO_MEMORY;
+                       }
                }
-               hmac_sha256_final(digest, &m);
-               memcpy(res, digest, 16);
+               gnutls_hmac_deinit(hmac_hnd, digest);
+               memcpy(res, digest, sizeof(res));
        }
        DEBUG(5,("signed SMB2 message\n"));