Rust 使用HMAC作为泛型
我在更新板条箱Rust 使用HMAC作为泛型,rust,hmac,Rust,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依赖项 [依赖项] hmac=“0.7” sha2=“0.8” digest=“0.8” 最简单的工作示例
hmac
和digest
时遇到问题。我定义了一个函数,它接受HMAC函数的泛型类型,并在给定的输入上计算HMAC。我有一个函数,其hmac
和digest
的版本分别为0.7和0.8。然而,当我试图分别为最新版本0.10和0.9运行相同的逻辑时,我被阻止了
在我的机器中,我使用rustc 1.48.0(7eac88abb 2020-11-16)
工作示例具有以下Cargo.toml
依赖项
[依赖项]
hmac=“0.7”
sha2=“0.8”
digest=“0.8”
最简单的工作示例如下所示:
使用sha2::{Sha256};
使用hmac::{Mac,hmac};
HmacSha256型=Hmac;
使用摘要::泛型数组::typenum::{U32};
发布结构键([u8;2]);
impl密钥{
pub fn print_hmac(&self,message:&u8])
哪里
D:麦克,
{
让mut mac=D::new_varkey(self.0.as_ref()).unwrap();
mac.input(消息);
让result=mac.result();
让code_bytes=result.code();
println!(“{:?}”,代码字节)
}
}
pub fn main(){
设verif_key=key([12u8,33u8]);
验证键打印:(&[83u8,123u8]);
}
上面的代码运行良好,可以编译。但是,当我尝试将依赖项升级到最新版本时,一切都会中断
更新的Cargo.toml
:
[依赖项]
hmac=“0.10”
sha2=“0.9”
digest=“0.9”
更新后,我们对术语进行了一些更改:
.input() -> .update()
.result() -> .finalize()
.code() -> .into_bytes()
当我尝试运行它时,我得到以下错误
在当前作用域中找不到类型参数“D”的名为“new_varkey”的函数或关联项
因此,我尝试将泛型类型定义为NewMac
(为此,需要将第二行更改为usehmac::{Mac,hmac,NewMac};
)。但是,现在错误出现在函数.update()
和.finalize()
中
我还尝试传递摘要泛型类型,而不是Hmac,如下所示:
pub fn print\u hmac(&self,消息:&u8])
哪里
D:文摘,
{
让mut mac=Hmac:::new_varkey(self.0.as_ref()).unwrap();
mac.update(消息);
让结果=mac.finalize();
让code_bytes=result.into_bytes();
println!(“{:?}”,代码字节)
}
但仍然不起作用
我应该如何处理更新板条箱的通用Hmac功能
很抱歉发了这么长的帖子,我希望我能把我的问题说清楚。谢谢社区 最好看看跨版本更新的示例代码,幸运的是
hmac
的存储库中有
这些测试使用crypto mac
机箱中定义的new\u测试
宏。特别是,有一行与你的类似
let mut mac=::new_varkey(key).unwrap();
…这表明D
也应该被转换为代码中的NewMac
实现者
在实现您已经确定的命名法更新后,您的代码将使用从上面转换的附加作为NewMac
,以及D
上绑定的相应的新+NewMac
特征:
使用sha2::{Sha256};
使用hmac::{NewMac,Mac,hmac};
HmacSha256型=Hmac;
使用摘要::泛型数组::typenum::{U32};
发布结构键([u8;2]);
impl密钥{
pub fn print_hmac(&self,message:&u8])
哪里
D:Mac+NewMac,/`+NewMac`输入特征绑定
{
让mut mac=::new_varkey(self.0.as_ref()).unwrap();/`as NewMac`cast
mac.update(消息);
让结果=mac.finalize();
让code_bytes=result.into_bytes();
println!(“{:?}”,代码字节)
}
}
pub fn main(){
设verif_key=key([12u8,33u8]);
验证键打印:(&[83u8,123u8]);
}
最好看看跨版本更新的示例代码,幸运的是hmac
的存储库中有
这些测试使用crypto mac
机箱中定义的new\u测试
宏。特别是,有一行与你的类似
let mut mac=::new_varkey(key).unwrap();
…这表明D
也应该被转换为代码中的NewMac
实现者
在实现您已经确定的命名法更新后,您的代码将使用从上面转换的附加作为NewMac
,以及D
上绑定的相应的新+NewMac
特征:
使用sha2::{Sha256};
使用hmac::{NewMac,Mac,hmac};
HmacSha256型=Hmac;
使用摘要::泛型数组::typenum::{U32};
发布结构键([u8;2]);
impl密钥{
pub fn print_hmac(&self,message:&u8])
哪里
D:Mac+NewMac,/`+NewMac`输入特征绑定
{
让mut mac=::new_varkey(self.0.as_ref()).unwrap();/`as NewMac`cast
mac.update(消息);
让结果=mac.finalize();
让code_bytes=result.into_bytes();
println!(“{:?}”,代码字节)
}
}
pub fn main(){
设verif_key=key([12u8,33u8]);
验证键打印:(&[83u8,123u8]);
}