22//! to the "soft" backend when it's unavailable.
33
44use crate :: { backend, Block , Key } ;
5+ use core:: mem:: ManuallyDrop ;
56use universal_hash:: { consts:: U16 , NewUniversalHash , Output , UniversalHash } ;
67
78cpuid_bool:: new!( clmul_cpuid, "pclmulqdq" , "sse4.1" ) ;
@@ -13,8 +14,8 @@ pub struct Polyval {
1314}
1415
1516union Inner {
16- clmul : backend:: clmul:: Polyval ,
17- soft : backend:: soft:: Polyval ,
17+ clmul : ManuallyDrop < backend:: clmul:: Polyval > ,
18+ soft : ManuallyDrop < backend:: soft:: Polyval > ,
1819}
1920
2021impl NewUniversalHash for Polyval {
@@ -26,11 +27,11 @@ impl NewUniversalHash for Polyval {
2627
2728 let inner = if clmul_present {
2829 Inner {
29- clmul : backend:: clmul:: Polyval :: new ( h) ,
30+ clmul : ManuallyDrop :: new ( backend:: clmul:: Polyval :: new ( h) ) ,
3031 }
3132 } else {
3233 Inner {
33- soft : backend:: soft:: Polyval :: new ( h) ,
34+ soft : ManuallyDrop :: new ( backend:: soft:: Polyval :: new ( h) ) ,
3435 }
3536 } ;
3637
@@ -45,27 +46,35 @@ impl UniversalHash for Polyval {
4546 #[ inline]
4647 fn update ( & mut self , x : & Block ) {
4748 if self . token . get ( ) {
48- unsafe { self . inner . clmul . update ( x) }
49+ unsafe { ( * self . inner . clmul ) . update ( x) }
4950 } else {
50- unsafe { self . inner . soft . update ( x) }
51+ unsafe { ( * self . inner . soft ) . update ( x) }
5152 }
5253 }
5354
5455 /// Reset internal state
5556 fn reset ( & mut self ) {
5657 if self . token . get ( ) {
57- unsafe { self . inner . clmul . reset ( ) }
58+ unsafe { ( * self . inner . clmul ) . reset ( ) }
5859 } else {
59- unsafe { self . inner . soft . reset ( ) }
60+ unsafe { ( * self . inner . soft ) . reset ( ) }
6061 }
6162 }
6263
6364 /// Get POLYVAL result (i.e. computed `S` field element)
6465 fn finalize ( self ) -> Output < Self > {
6566 let output_bytes = if self . token . get ( ) {
66- unsafe { self . inner . clmul . finalize ( ) . into_bytes ( ) }
67+ unsafe {
68+ ManuallyDrop :: into_inner ( self . inner . clmul )
69+ . finalize ( )
70+ . into_bytes ( )
71+ }
6772 } else {
68- unsafe { self . inner . soft . finalize ( ) . into_bytes ( ) }
73+ unsafe {
74+ ManuallyDrop :: into_inner ( self . inner . soft )
75+ . finalize ( )
76+ . into_bytes ( )
77+ }
6978 } ;
7079
7180 Output :: new ( output_bytes)
@@ -75,12 +84,14 @@ impl UniversalHash for Polyval {
7584impl Clone for Polyval {
7685 fn clone ( & self ) -> Self {
7786 let inner = if self . token . get ( ) {
87+ let clmul = unsafe { ( * self . inner . clmul ) . clone ( ) } ;
7888 Inner {
79- clmul : unsafe { self . inner . clmul . clone ( ) } ,
89+ clmul : ManuallyDrop :: new ( clmul ) ,
8090 }
8191 } else {
92+ let soft = unsafe { ( * self . inner . soft ) . clone ( ) } ;
8293 Inner {
83- soft : unsafe { self . inner . soft . clone ( ) } ,
94+ soft : ManuallyDrop :: new ( soft ) ,
8495 }
8596 } ;
8697
@@ -90,13 +101,3 @@ impl Clone for Polyval {
90101 }
91102 }
92103}
93-
94- #[ cfg( feature = "zeroize" ) ]
95- impl Drop for Polyval {
96- fn drop ( & mut self ) {
97- use zeroize:: Zeroize ;
98- const SIZE : usize = core:: mem:: size_of :: < Polyval > ( ) ;
99- let state = unsafe { & mut * ( self as * mut Polyval as * mut [ u8 ; SIZE ] ) } ;
100- state. zeroize ( ) ;
101- }
102- }
0 commit comments