Kamil Sindi
Kamil Sindi

Reputation: 22842

Rust equivalent of hmac digest in Python

I'm trying to find the Rust equivalent of the function below in Python. I've looked into the hmac crate but it's not clear how to get the same digest.

import base64
import hashlib
import hmac


def hmac_signature(key, msg):
    hmac_buffer = hmac.new(
        key=bytes(key, 'utf-8'),
        msg=bytes(msg, 'utf-8'),
        digestmod=hashlib.sha256
    )
    return base64.b64encode(hmac_buffer.digest()).decode('utf-8')

Attempt

use base64;
use sha2::Sha256;
use hmac::{Hmac, Mac};
use ring::{digest};


fn main() {
    let key = "secret";
    let msg = "message";

    let signature = hmac_signature(key, msg);

    let expected = "i19IcCmVwVmMVz2x4hhmqbgl1KeU0WnXBgoDYFeWNgs=";

    assert_eq!(signature, expected);
}

fn hmac_signature(key: &str, msg: &str) -> String {
    type HmacSha256 = Hmac<Sha256>;
    
    let mut mac = HmacSha256::new_from_slice(key.as_bytes()).unwrap();
    mac.update(&msg.as_bytes());

    let code_bytes = mac.finalize().into_bytes();

    let hash = |v| digest::digest(&digest::SHA256, v);
    let digest = hash(&code_bytes);

    return base64::encode(&digest);
}

Upvotes: 1

Views: 1024

Answers (1)

Kamil Sindi
Kamil Sindi

Reputation: 22842

use base64;
use sha2::Sha256;
use hmac::{Hmac, Mac};


fn main() {
    let key = "secret";
    let msg = "message";

    let signature = hmac_signature(key, msg);

    let expected = "i19IcCmVwVmMVz2x4hhmqbgl1KeU0WnXBgoDYFeWNgs=";

    assert_eq!(signature, expected);
}

fn hmac_signature(key: &str, msg: &str) -> String {
    type HmacSha256 = Hmac<Sha256>;
    
    let mut mac = HmacSha256::new_from_slice(key.as_bytes()).unwrap();
    mac.update(&msg.as_bytes());

    let code_bytes = mac.finalize().into_bytes();

    return base64::encode(&code_bytes.to_vec());
}

Upvotes: 2

Related Questions