From 100154677198dfb16a342f81bd120ba969b00343 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=D0=90=D1=80=D1=82=D1=91=D0=BC=20=D0=9F=D0=B0=D0=B2=D0=BB?= =?UTF-8?q?=D0=BE=D0=B2=20=5BArtyom=20Pavlov=5D?= Date: Tue, 3 Mar 2026 02:52:58 +0300 Subject: [PATCH] Relax `Clone` bounds --- belt-mac/src/block_api.rs | 31 +++++++++++++++---------------- belt-mac/src/lib.rs | 5 +++-- cbc-mac/src/block_api.rs | 28 ++++++++++++++-------------- cbc-mac/src/lib.rs | 7 ++++--- cmac/src/block_api.rs | 4 ++-- cmac/src/lib.rs | 3 ++- pmac/src/block_api.rs | 4 ++-- pmac/src/lib.rs | 3 ++- retail-mac/src/block_api.rs | 28 ++++++++++++++-------------- retail-mac/src/lib.rs | 10 +++++----- 10 files changed, 63 insertions(+), 60 deletions(-) diff --git a/belt-mac/src/block_api.rs b/belt-mac/src/block_api.rs index f090593..1e36a94 100644 --- a/belt-mac/src/block_api.rs +++ b/belt-mac/src/block_api.rs @@ -1,4 +1,3 @@ -use belt_block::BeltBlock; use cipher::{BlockCipherEncBackend, BlockCipherEncClosure, BlockCipherEncrypt}; use core::fmt; use digest::{ @@ -17,9 +16,9 @@ use digest::zeroize::{Zeroize, ZeroizeOnDrop}; /// Generic core BeltMac instance, which operates over blocks. #[derive(Clone)] -pub struct BeltMacCore +pub struct BeltMacCore where - C: BlockCipherEncrypt + SmallBlockSizeUser + Clone, + C: BlockCipherEncrypt + SmallBlockSizeUser, { cipher: C, state: Block, @@ -28,30 +27,30 @@ where impl BlockSizeUser for BeltMacCore where - C: BlockCipherEncrypt + SmallBlockSizeUser + Clone, + C: BlockCipherEncrypt + SmallBlockSizeUser, { type BlockSize = C::BlockSize; } impl OutputSizeUser for BeltMacCore where - C: BlockCipherEncrypt + SmallBlockSizeUser + Clone, + C: BlockCipherEncrypt + SmallBlockSizeUser, { type OutputSize = C::BlockSize; } impl InnerUser for BeltMacCore where - C: BlockCipherEncrypt + SmallBlockSizeUser + Clone, + C: BlockCipherEncrypt + SmallBlockSizeUser, { type Inner = C; } -impl MacMarker for BeltMacCore where C: BlockCipherEncrypt + SmallBlockSizeUser + Clone {} +impl MacMarker for BeltMacCore where C: BlockCipherEncrypt + SmallBlockSizeUser {} impl InnerInit for BeltMacCore where - C: BlockCipherEncrypt + SmallBlockSizeUser + Clone, + C: BlockCipherEncrypt + SmallBlockSizeUser, { #[inline] fn inner_init(cipher: C) -> Self { @@ -64,14 +63,14 @@ where impl BufferKindUser for BeltMacCore where - C: BlockCipherEncrypt + SmallBlockSizeUser + Clone, + C: BlockCipherEncrypt + SmallBlockSizeUser, { type BufferKind = Lazy; } impl UpdateCore for BeltMacCore where - C: BlockCipherEncrypt + SmallBlockSizeUser + Clone, + C: BlockCipherEncrypt + SmallBlockSizeUser, { #[inline] fn update_blocks(&mut self, blocks: &[Block]) { @@ -101,7 +100,7 @@ where impl Reset for BeltMacCore where - C: BlockCipherEncrypt + SmallBlockSizeUser + Clone, + C: BlockCipherEncrypt + SmallBlockSizeUser, { #[inline(always)] fn reset(&mut self) { @@ -111,7 +110,7 @@ where impl FixedOutputCore for BeltMacCore where - C: BlockCipherEncrypt + SmallBlockSizeUser + Clone, + C: BlockCipherEncrypt + SmallBlockSizeUser, { #[inline] fn finalize_fixed_core(&mut self, buffer: &mut Buffer, out: &mut Output) { @@ -148,7 +147,7 @@ where impl AlgorithmName for BeltMacCore where - C: BlockCipherEncrypt + SmallBlockSizeUser + Clone, + C: BlockCipherEncrypt + SmallBlockSizeUser, { fn write_alg_name(f: &mut fmt::Formatter<'_>) -> fmt::Result { f.write_str("BeltMac") @@ -157,7 +156,7 @@ where impl fmt::Debug for BeltMacCore where - C: BlockCipherEncrypt + SmallBlockSizeUser + Clone, + C: BlockCipherEncrypt + SmallBlockSizeUser, { fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result { f.write_str("BeltMacCore { ... }") @@ -167,7 +166,7 @@ where #[cfg(feature = "zeroize")] impl Drop for BeltMacCore where - C: BlockCipherEncrypt + SmallBlockSizeUser + Clone, + C: BlockCipherEncrypt + SmallBlockSizeUser, { fn drop(&mut self) { self.state.zeroize(); @@ -176,7 +175,7 @@ where #[cfg(feature = "zeroize")] impl ZeroizeOnDrop for BeltMacCore where - C: BlockCipherEncrypt + SmallBlockSizeUser + Clone + ZeroizeOnDrop + C: BlockCipherEncrypt + SmallBlockSizeUser + ZeroizeOnDrop { } diff --git a/belt-mac/src/lib.rs b/belt-mac/src/lib.rs index 0077725..12002e5 100644 --- a/belt-mac/src/lib.rs +++ b/belt-mac/src/lib.rs @@ -18,8 +18,9 @@ use digest::block_api::SmallBlockSizeUser; digest::buffer_fixed!( /// BeltMac instance generic over block cipher. - pub struct GenericBeltMac(block_api::BeltMacCore); - impl: ResetMacTraits AlgorithmName InnerInit; + #[derive(Clone)] + pub struct GenericBeltMac(block_api::BeltMacCore); + impl: BaseFixedTraits MacMarker Reset FixedOutputReset AlgorithmName InnerInit; ); /// BeltMac instance. diff --git a/cbc-mac/src/block_api.rs b/cbc-mac/src/block_api.rs index e16a11d..b3ccaf2 100644 --- a/cbc-mac/src/block_api.rs +++ b/cbc-mac/src/block_api.rs @@ -18,7 +18,7 @@ use digest::zeroize::{Zeroize, ZeroizeOnDrop}; #[derive(Clone)] pub struct CbcMacCore where - C: BlockCipherEncrypt + SmallBlockSizeUser + Clone, + C: BlockCipherEncrypt + SmallBlockSizeUser, { cipher: C, state: Block, @@ -26,30 +26,30 @@ where impl BlockSizeUser for CbcMacCore where - C: BlockCipherEncrypt + SmallBlockSizeUser + Clone, + C: BlockCipherEncrypt + SmallBlockSizeUser, { type BlockSize = C::BlockSize; } impl OutputSizeUser for CbcMacCore where - C: BlockCipherEncrypt + SmallBlockSizeUser + Clone, + C: BlockCipherEncrypt + SmallBlockSizeUser, { type OutputSize = C::BlockSize; } impl InnerUser for CbcMacCore where - C: BlockCipherEncrypt + SmallBlockSizeUser + Clone, + C: BlockCipherEncrypt + SmallBlockSizeUser, { type Inner = C; } -impl MacMarker for CbcMacCore where C: BlockCipherEncrypt + SmallBlockSizeUser + Clone {} +impl MacMarker for CbcMacCore where C: BlockCipherEncrypt + SmallBlockSizeUser {} impl InnerInit for CbcMacCore where - C: BlockCipherEncrypt + SmallBlockSizeUser + Clone, + C: BlockCipherEncrypt + SmallBlockSizeUser, { #[inline] fn inner_init(cipher: C) -> Self { @@ -60,14 +60,14 @@ where impl BufferKindUser for CbcMacCore where - C: BlockCipherEncrypt + SmallBlockSizeUser + Clone, + C: BlockCipherEncrypt + SmallBlockSizeUser, { type BufferKind = Eager; } impl UpdateCore for CbcMacCore where - C: BlockCipherEncrypt + SmallBlockSizeUser + Clone, + C: BlockCipherEncrypt + SmallBlockSizeUser, { #[inline] fn update_blocks(&mut self, blocks: &[Block]) { @@ -97,7 +97,7 @@ where impl Reset for CbcMacCore where - C: BlockCipherEncrypt + SmallBlockSizeUser + Clone, + C: BlockCipherEncrypt + SmallBlockSizeUser, { #[inline(always)] fn reset(&mut self) { @@ -107,7 +107,7 @@ where impl FixedOutputCore for CbcMacCore where - C: BlockCipherEncrypt + SmallBlockSizeUser + Clone, + C: BlockCipherEncrypt + SmallBlockSizeUser, { #[inline] fn finalize_fixed_core(&mut self, buffer: &mut Buffer, out: &mut Output) { @@ -123,7 +123,7 @@ where impl AlgorithmName for CbcMacCore where - C: BlockCipherEncrypt + SmallBlockSizeUser + Clone + AlgorithmName, + C: BlockCipherEncrypt + SmallBlockSizeUser + AlgorithmName, { fn write_alg_name(f: &mut fmt::Formatter<'_>) -> fmt::Result { f.write_str("CbcMac<")?; @@ -134,7 +134,7 @@ where impl fmt::Debug for CbcMacCore where - C: BlockCipherEncrypt + SmallBlockSizeUser + Clone + AlgorithmName, + C: BlockCipherEncrypt + SmallBlockSizeUser + AlgorithmName, { fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result { f.write_str("CbcMacCore<")?; @@ -146,7 +146,7 @@ where #[cfg(feature = "zeroize")] impl Drop for CbcMacCore where - C: BlockCipherEncrypt + SmallBlockSizeUser + Clone, + C: BlockCipherEncrypt + SmallBlockSizeUser, { fn drop(&mut self) { self.state.zeroize(); @@ -155,7 +155,7 @@ where #[cfg(feature = "zeroize")] impl ZeroizeOnDrop for CbcMacCore where - C: BlockCipherEncrypt + SmallBlockSizeUser + Clone + ZeroizeOnDrop + C: BlockCipherEncrypt + SmallBlockSizeUser + ZeroizeOnDrop { } diff --git a/cbc-mac/src/lib.rs b/cbc-mac/src/lib.rs index 3607d6d..6bf2ff5 100644 --- a/cbc-mac/src/lib.rs +++ b/cbc-mac/src/lib.rs @@ -18,13 +18,14 @@ use digest::block_api::CoreProxy; digest::buffer_fixed!( /// Generic CBC-MAC instance. - pub struct CbcMac(block_api::CbcMacCore); - impl: ResetMacTraits InnerInit; + #[derive(Clone)] + pub struct CbcMac(block_api::CbcMacCore); + impl: BaseFixedTraits MacMarker Reset FixedOutputReset InnerInit; ); impl AlgorithmName for CbcMac where - C: BlockCipherEncrypt + SmallBlockSizeUser + Clone + AlgorithmName, + C: BlockCipherEncrypt + SmallBlockSizeUser + AlgorithmName, { fn write_alg_name(f: &mut fmt::Formatter<'_>) -> fmt::Result { ::Core::write_alg_name(f) diff --git a/cmac/src/block_api.rs b/cmac/src/block_api.rs index bb54652..ef3b151 100644 --- a/cmac/src/block_api.rs +++ b/cmac/src/block_api.rs @@ -140,14 +140,14 @@ fn xor(buf: &mut Array, data: &Array) { } /// Helper trait implemented for cipher supported by CMAC -pub trait CmacCipher: SmallBlockSizeUser + BlockCipherEncrypt + Clone { +pub trait CmacCipher: SmallBlockSizeUser + BlockCipherEncrypt { /// Double block. See the [`Dbl`] trait docs for more information. fn dbl(block: Block) -> Block; } impl CmacCipher for C where - Self: SmallBlockSizeUser + BlockCipherEncrypt + Clone, + Self: SmallBlockSizeUser + BlockCipherEncrypt, Block: Dbl, { fn dbl(block: Block) -> Block { diff --git a/cmac/src/lib.rs b/cmac/src/lib.rs index 826114c..8897e5a 100644 --- a/cmac/src/lib.rs +++ b/cmac/src/lib.rs @@ -19,8 +19,9 @@ use digest::block_api::{AlgorithmName, CoreProxy}; digest::buffer_fixed!( /// Generic CMAC instance. + #[derive(Clone)] pub struct Cmac(block_api::CmacCore); - impl: ResetMacTraits InnerInit; + impl: BaseFixedTraits MacMarker Reset FixedOutputReset InnerInit; ); impl AlgorithmName for Cmac { diff --git a/pmac/src/block_api.rs b/pmac/src/block_api.rs index 0978492..cd75965 100644 --- a/pmac/src/block_api.rs +++ b/pmac/src/block_api.rs @@ -217,7 +217,7 @@ fn xor(buf: &mut Array, data: &Array) { /// /// Currently this trait is implemented for all block cipher encryptors /// with block size equal to 64 and 128 bits. -pub trait PmacCipher: SmallBlockSizeUser + BlockCipherEncrypt + Clone { +pub trait PmacCipher: SmallBlockSizeUser + BlockCipherEncrypt { /// Double block. See the [`Dbl`] trait docs for more information. fn dbl(block: Block) -> Block; /// Reverse double block.. See the [`Dbl`] trait docs for more information. @@ -226,7 +226,7 @@ pub trait PmacCipher: SmallBlockSizeUser + BlockCipherEncrypt + Clone { impl PmacCipher for C where - Self: SmallBlockSizeUser + BlockCipherEncrypt + Clone, + Self: SmallBlockSizeUser + BlockCipherEncrypt, Block: Dbl, { fn dbl(block: Block) -> Block { diff --git a/pmac/src/lib.rs b/pmac/src/lib.rs index 46c17bb..c67f6d0 100644 --- a/pmac/src/lib.rs +++ b/pmac/src/lib.rs @@ -19,8 +19,9 @@ use digest::block_api::{AlgorithmName, CoreProxy}; digest::buffer_fixed!( /// Generic PMAC instance with `LC_SIZE` = 20. + #[derive(Clone)] pub struct Pmac(block_api::PmacCore); - impl: ResetMacTraits InnerInit; + impl: BaseFixedTraits MacMarker Reset FixedOutputReset InnerInit; ); impl AlgorithmName for Pmac { diff --git a/retail-mac/src/block_api.rs b/retail-mac/src/block_api.rs index 9a8f4ca..0adde13 100644 --- a/retail-mac/src/block_api.rs +++ b/retail-mac/src/block_api.rs @@ -21,7 +21,7 @@ use cipher::zeroize::{Zeroize, ZeroizeOnDrop}; #[derive(Clone)] pub struct RetailMacCore where - C: BlockCipherEncrypt + SmallBlockSizeUser + BlockCipherDecrypt + Clone, + C: BlockCipherEncrypt + SmallBlockSizeUser + BlockCipherDecrypt, { cipher: C, cipher_prime: C, @@ -30,21 +30,21 @@ where impl BlockSizeUser for RetailMacCore where - C: BlockCipherEncrypt + SmallBlockSizeUser + BlockCipherDecrypt + Clone, + C: BlockCipherEncrypt + SmallBlockSizeUser + BlockCipherDecrypt, { type BlockSize = C::BlockSize; } impl OutputSizeUser for RetailMacCore where - C: BlockCipherEncrypt + SmallBlockSizeUser + BlockCipherDecrypt + Clone, + C: BlockCipherEncrypt + SmallBlockSizeUser + BlockCipherDecrypt, { type OutputSize = C::BlockSize; } impl KeySizeUser for RetailMacCore where - C: BlockCipherEncrypt + SmallBlockSizeUser + BlockCipherDecrypt + Clone, + C: BlockCipherEncrypt + SmallBlockSizeUser + BlockCipherDecrypt, ::_BlockSize: Mul, Prod<::_BlockSize, U2>: ArraySize, { @@ -52,20 +52,20 @@ where } impl MacMarker for RetailMacCore where - C: BlockCipherEncrypt + SmallBlockSizeUser + BlockCipherDecrypt + Clone + C: BlockCipherEncrypt + SmallBlockSizeUser + BlockCipherDecrypt { } impl BufferKindUser for RetailMacCore where - C: BlockCipherEncrypt + SmallBlockSizeUser + BlockCipherDecrypt + Clone, + C: BlockCipherEncrypt + SmallBlockSizeUser + BlockCipherDecrypt, { type BufferKind = Eager; } impl KeyInit for RetailMacCore where - C: BlockCipherEncrypt + SmallBlockSizeUser + BlockCipherDecrypt + Clone + KeyInit, + C: BlockCipherEncrypt + SmallBlockSizeUser + BlockCipherDecrypt + KeyInit, ::_BlockSize: Mul, Prod<::_BlockSize, U2>: ArraySize, { @@ -88,7 +88,7 @@ where impl UpdateCore for RetailMacCore where - C: BlockCipherEncrypt + SmallBlockSizeUser + BlockCipherDecrypt + Clone, + C: BlockCipherEncrypt + SmallBlockSizeUser + BlockCipherDecrypt, { #[inline] fn update_blocks(&mut self, blocks: &[Block]) { @@ -118,7 +118,7 @@ where impl Reset for RetailMacCore where - C: BlockCipherEncrypt + SmallBlockSizeUser + BlockCipherDecrypt + Clone, + C: BlockCipherEncrypt + SmallBlockSizeUser + BlockCipherDecrypt, { #[inline(always)] fn reset(&mut self) { @@ -128,7 +128,7 @@ where impl FixedOutputCore for RetailMacCore where - C: BlockCipherEncrypt + SmallBlockSizeUser + BlockCipherDecrypt + Clone, + C: BlockCipherEncrypt + SmallBlockSizeUser + BlockCipherDecrypt, { #[inline] fn finalize_fixed_core(&mut self, buffer: &mut Buffer, out: &mut Output) { @@ -150,7 +150,7 @@ where impl AlgorithmName for RetailMacCore where - C: BlockCipherEncrypt + SmallBlockSizeUser + BlockCipherDecrypt + Clone + AlgorithmName, + C: BlockCipherEncrypt + SmallBlockSizeUser + BlockCipherDecrypt + AlgorithmName, { fn write_alg_name(f: &mut fmt::Formatter<'_>) -> fmt::Result { f.write_str("RetailMac<")?; @@ -161,7 +161,7 @@ where impl fmt::Debug for RetailMacCore where - C: BlockCipherEncrypt + SmallBlockSizeUser + BlockCipherDecrypt + Clone + AlgorithmName, + C: BlockCipherEncrypt + SmallBlockSizeUser + BlockCipherDecrypt + AlgorithmName, { fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result { f.write_str("RetailMacCore<")?; @@ -173,7 +173,7 @@ where #[cfg(feature = "zeroize")] impl Drop for RetailMacCore where - C: BlockCipherEncrypt + SmallBlockSizeUser + BlockCipherDecrypt + Clone, + C: BlockCipherEncrypt + SmallBlockSizeUser + BlockCipherDecrypt, { fn drop(&mut self) { self.state.zeroize(); @@ -182,7 +182,7 @@ where #[cfg(feature = "zeroize")] impl ZeroizeOnDrop for RetailMacCore where - C: BlockCipherEncrypt + SmallBlockSizeUser + BlockCipherDecrypt + Clone + ZeroizeOnDrop + C: BlockCipherEncrypt + SmallBlockSizeUser + BlockCipherDecrypt + ZeroizeOnDrop { } diff --git a/retail-mac/src/lib.rs b/retail-mac/src/lib.rs index a445bfb..22da357 100644 --- a/retail-mac/src/lib.rs +++ b/retail-mac/src/lib.rs @@ -26,13 +26,13 @@ use digest::{ digest::buffer_fixed!( /// Generic Retail MAC instance. - pub struct RetailMac(RetailMacCore); - impl: ResetMacTraits; + pub struct RetailMac(RetailMacCore); + impl: BaseFixedTraits MacMarker Reset FixedOutputReset; ); impl KeySizeUser for RetailMac where - C: BlockCipherEncrypt + BlockCipherDecrypt + SmallBlockSizeUser + Clone, + C: BlockCipherEncrypt + BlockCipherDecrypt + SmallBlockSizeUser, ::_BlockSize: Mul, Prod<::_BlockSize, U2>: ArraySize, { @@ -41,7 +41,7 @@ where impl KeyInit for RetailMac where - C: BlockCipherEncrypt + BlockCipherDecrypt + SmallBlockSizeUser + Clone + KeyInit, + C: BlockCipherEncrypt + BlockCipherDecrypt + SmallBlockSizeUser + KeyInit, ::_BlockSize: Mul, Prod<::_BlockSize, U2>: ArraySize, { @@ -64,7 +64,7 @@ where impl AlgorithmName for RetailMac where - C: BlockCipherEncrypt + BlockCipherDecrypt + SmallBlockSizeUser + Clone + AlgorithmName, + C: BlockCipherEncrypt + BlockCipherDecrypt + SmallBlockSizeUser + AlgorithmName, { fn write_alg_name(f: &mut fmt::Formatter<'_>) -> fmt::Result { ::Core::write_alg_name(f)