@@ -39,21 +39,6 @@ macro_rules! buffer_fixed {
3939 const OID : $crate:: const_oid:: ObjectIdentifier =
4040 $crate:: const_oid:: ObjectIdentifier :: new_unwrap( $oid) ;
4141 }
42-
43- impl $( < $( $lt $( : $clt $( + $dlt ) * ) ? ) ,+ >) ? Drop for $name$( < $( $lt ) ,+ >) ? {
44- #[ inline]
45- fn drop( & mut self ) {
46- #[ cfg( feature = "zeroize" ) ]
47- {
48- use $crate:: zeroize:: Zeroize ;
49- self . core. zeroize( ) ;
50- self . buffer. zeroize( ) ;
51- }
52- }
53- }
54-
55- #[ cfg( feature = "zeroize" ) ]
56- impl $( < $( $lt $( : $clt $( + $dlt ) * ) ? ) ,+ >) ? $crate:: zeroize:: ZeroizeOnDrop for $name$( < $( $lt ) ,+ >) ? { }
5742 } ;
5843
5944 // Terminates `impl_inner` sequences.
@@ -75,7 +60,7 @@ macro_rules! buffer_fixed {
7560 $crate:: buffer_fixed!(
7661 impl_inner: $name$( < $( $lt $( : $clt $( + $dlt ) * ) ? ) ,+ >) ?( $core_ty) ;
7762 BaseFixedTraits AlgorithmName Default Clone HashMarker
78- Reset FixedOutputReset SerializableState $( $trait_name) * ;
63+ Reset FixedOutputReset SerializableState ZeroizeOnDrop $( $trait_name) * ;
7964 ) ;
8065 } ;
8166
@@ -198,8 +183,8 @@ macro_rules! buffer_fixed {
198183 Self { core, buffer }
199184 }
200185 fn decompose( self ) -> ( Self :: Core , $crate:: block_api:: Buffer <Self :: Core >) {
201- let Self { ref core, ref buffer } = self ;
202- ( core. clone ( ) , buffer. clone ( ) )
186+ let Self { core, buffer } = self ;
187+ ( core, buffer)
203188 }
204189 }
205190
@@ -491,5 +476,30 @@ macro_rules! buffer_fixed {
491476 }
492477
493478 $crate:: buffer_fixed!( impl_inner: $name$( < $( $lt $( : $clt $( + $dlt ) * ) ? ) ,+ >) ?( $core_ty) ; $( $trait_name) * ; ) ;
494- }
479+ } ;
480+
481+ // Implements `ZeroizeOnDrop`
482+ (
483+ impl_inner: $name: ident
484+ $( < $( $lt: tt $( : $clt: tt $( + $dlt: tt ) * ) ? ) ,+ >) ?
485+ ( $core_ty: ty) ;
486+ ZeroizeOnDrop $( $trait_name: ident) * ;
487+ ) => {
488+ // Verify that `$core_ty` and `Bufer<$core_ty>` implement `ZeroizeOnDrop`
489+ #[ cfg( feature = "zeroize" ) ]
490+ const _: ( ) = {
491+ fn check_core$( < $( $lt $( : $clt $( + $dlt ) * ) ? ) ,+ >) ?( v: & $core_ty) {
492+ v as & dyn $crate:: zeroize:: ZeroizeOnDrop ;
493+ }
494+
495+ fn check_buffer$( < $( $lt $( : $clt $( + $dlt ) * ) ? ) ,+ >) ?( v: & $crate:: block_api:: Buffer <$core_ty>) {
496+ v as & dyn $crate:: zeroize:: ZeroizeOnDrop ;
497+ }
498+ } ;
499+
500+ #[ cfg( feature = "zeroize" ) ]
501+ impl $( < $( $lt $( : $clt $( + $dlt ) * ) ? ) ,+ >) ? $crate:: zeroize:: ZeroizeOnDrop for $name$( < $( $lt ) ,+ >) ? { }
502+
503+ $crate:: buffer_fixed!( impl_inner: $name$( < $( $lt $( : $clt $( + $dlt ) * ) ? ) ,+ >) ?( $core_ty) ; $( $trait_name) * ; ) ;
504+ } ;
495505}
0 commit comments