使用HMAC作为通用

阿齐尼格

我在更新包装箱hmac包装时遇到问题digest我定义了一个函数,该函数采用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)
    }

但仍然无法正常工作。

我应该如何为更新后的包装箱处理通用的Hmac功能?

抱歉,很长的帖子,希望我能阐明我的问题。谢谢社区!

安东诺克

这是很好的看一下例子代码跨版本更新更新,幸运的是hmac一些测试,在其仓库。

这些测试使用new_test宏定义这里crypto-mac箱子。特别是,有一条线与您的相似...

let mut mac = <$mac as NewMac>::new_varkey(key).unwrap();

...这建议也D应将其转换为NewMac代码中实现者。

实施已经确定的命名法更新后,您的代码as NewMac将与上面的其他强制转换以及+ NewMac绑定在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]);
}

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章