gpt4 book ai didi

rust - 使用 HMAC 作为泛型

转载 作者:行者123 更新时间:2023-12-03 11:38:39 26 4
gpt4 key购买 nike

我无法更新箱子 hmacdigest .我定义了一个函数,它采用 HMAC 函数的泛型类型,并通过给定的输入计算 HMAC。我有一个使用 hmac 版本的函数和 digest分别为 0.7 和 0.8。但是,在尝试分别为最新版本 0.10 和 0.9 运行相同的逻辑时,我被阻止了。
在我的机器上,我使用 rustc 1.48.0 (7eac88abb 2020-11-16) .
工作示例具有以下 Cargo.toml依赖关系

[dependencies]
hmac = "0.7"
sha2 = "0.8"
digest = "0.8"
最小的工作示例如下:
use sha2::{Sha256};
use hmac::{Mac, Hmac};

type HmacSha256 = Hmac<Sha256>;
use digest::generic_array::typenum::{U32};

pub struct Key([u8; 2]);

impl Key {
pub fn print_hmac<D>(&self, message: &[u8])
where
D: Mac<OutputSize = U32>,
{
let mut mac = D::new_varkey(self.0.as_ref()).unwrap();
mac.input(message);

let result = mac.result();
let code_bytes = result.code();
println!("{:?}", code_bytes)
}
}

pub fn main() {
let verif_key = Key([12u8, 33u8]);
verif_key.print_hmac::<HmacSha256>(&[83u8, 123u8]);
}
上面的代码运行良好,并且可以编译。但是,当我尝试将依赖项升级到最新版本时,一切都会中断。
更新 Cargo.toml :
[dependencies]
hmac = "0.10"
sha2 = "0.9"
digest = "0.9"
随着更新,我们对术语进行了一些更改:
.input() -> .update()
.result() -> .finalize()
.code() -> .into_bytes()
当我尝试运行它时,出现以下错误 no function or associated item named 'new_varkey' found for type parameter 'D' in the current scope所以我尝试将泛型类型定义为 NewMac (因为需要将第二行更改为 use hmac::{Mac, Hmac, NewMac}; )。但是,现在错误出现在函数 .update() 中。和 .finalize() .
我还尝试传递 Digest 泛型类型,而不是 Hmac,如下所示:
pub fn print_hmac<D>(&self, message: &[u8])
where
D: Digest,
{
let mut mac = Hmac::<D>::new_varkey(self.0.as_ref()).unwrap();
mac.update(message);

let result = mac.finalise();
let code_bytes = result.into_bytes();
println!("{:?}", code_bytes)
}
但仍然无法正常工作。
我应该如何处理更新的 crate 的通用 Hmac 函数?
对不起,很长的帖子,我希望我能把我的问题说清楚。感谢社区!

最佳答案

很高兴查看随版本更新而更新的示例代码,幸运的是 hmacsome tests在其存储库中。
这些测试使用 new_test宏定义herecrypto-mac箱。特别是,有一条与您相似的线...

let mut mac = <$mac as NewMac>::new_varkey(key).unwrap();
...这表明 D应该转换为 NewMac您的代码中的实现者也是如此。
在实现您已经确定的命名法更新后,您的代码可以使用额外的 as NewMac从上面转换,以及相应的新 + NewMac特征绑定(bind)在 D :
use sha2::{Sha256};
use hmac::{NewMac, Mac, Hmac};

type HmacSha256 = Hmac<Sha256>;
use digest::generic_array::typenum::{U32};

pub struct Key([u8; 2]);

impl Key {
pub fn print_hmac<D>(&self, message: &[u8])
where
D: Mac<OutputSize = U32> + NewMac, // `+ NewMac` input trait bound
{
let mut mac = <D as NewMac>::new_varkey(self.0.as_ref()).unwrap(); // `as NewMac` cast
mac.update(message);

let result = mac.finalize();
let code_bytes = result.into_bytes();
println!("{:?}", code_bytes)
}
}

pub fn main() {
let verif_key = Key([12u8, 33u8]);
verif_key.print_hmac::<HmacSha256>(&[83u8, 123u8]);
}

关于rust - 使用 HMAC 作为泛型,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/65131677/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com