Switch to RustCrypto for Hmac.

Emmanuel Gil Peyrot created

Change summary

sasl/Cargo.toml          |  1 +
sasl/src/common/scram.rs | 25 +++++++++++++++----------
2 files changed, 16 insertions(+), 10 deletions(-)

Detailed changes

sasl/Cargo.toml 🔗

@@ -22,6 +22,7 @@ scram = ["openssl"]
 base64 = "0.10"
 sha-1 = "0.8"
 sha2 = "0.8"
+hmac = "0.7"
 
 [dependencies.openssl]
 version = "0.10.7"

sasl/src/common/scram.rs 🔗

@@ -1,9 +1,8 @@
+use hmac::{Hmac, Mac};
 use openssl::error::ErrorStack;
 use openssl::hash::MessageDigest;
 use openssl::pkcs5::pbkdf2_hmac;
-use openssl::pkey::PKey;
 use openssl::rand::rand_bytes;
-use openssl::sign::Signer;
 use sha1::{Digest, Sha1 as Sha1_hash};
 use sha2::Sha256 as Sha256_hash;
 
@@ -57,10 +56,13 @@ impl ScramProvider for Sha1 {
     }
 
     fn hmac(data: &[u8], key: &[u8]) -> Vec<u8> {
-        let pkey = PKey::hmac(key).unwrap();
-        let mut signer = Signer::new(MessageDigest::sha1(), &pkey).unwrap();
-        signer.update(data).unwrap();
-        signer.sign_to_vec().unwrap()
+        type HmacSha1 = Hmac<Sha1_hash>;
+        let mut mac = HmacSha1::new_varkey(key).unwrap();
+        mac.input(data);
+        let result = mac.result();
+        let mut vec = Vec::with_capacity(Sha1_hash::output_size());
+        vec.extend_from_slice(result.code().as_slice());
+        vec
     }
 
     fn derive(password: &Password, salt: &[u8], iterations: usize) -> Result<Vec<u8>, String> {
@@ -123,10 +125,13 @@ impl ScramProvider for Sha256 {
     }
 
     fn hmac(data: &[u8], key: &[u8]) -> Vec<u8> {
-        let pkey = PKey::hmac(key).unwrap();
-        let mut signer = Signer::new(MessageDigest::sha256(), &pkey).unwrap();
-        signer.update(data).unwrap();
-        signer.sign_to_vec().unwrap()
+        type HmacSha256 = Hmac<Sha256_hash>;
+        let mut mac = HmacSha256::new_varkey(key).unwrap();
+        mac.input(data);
+        let result = mac.result();
+        let mut vec = Vec::with_capacity(Sha256_hash::output_size());
+        vec.extend_from_slice(result.code().as_slice());
+        vec
     }
 
     fn derive(password: &Password, salt: &[u8], iterations: usize) -> Result<Vec<u8>, String> {