44
55use crate :: { rounds:: Rounds , IV_SIZE , KEY_SIZE , BLOCK_SIZE } ;
66use super :: { avx2, sse2} ;
7+ use core:: mem:: ManuallyDrop ;
78
89/// Size of buffers passed to `generate` and `apply_keystream` for this
910/// backend, which operates on two blocks in parallel for optimal performance.
@@ -18,8 +19,8 @@ pub struct Core<R: Rounds> {
1819}
1920
2021union Inner < R : Rounds > {
21- avx2 : avx2:: Core < R > ,
22- sse2 : sse2:: Core < R > ,
22+ avx2 : ManuallyDrop < avx2:: Core < R > > ,
23+ sse2 : ManuallyDrop < sse2:: Core < R > > ,
2324}
2425
2526impl < R : Rounds > Core < R > {
@@ -31,11 +32,11 @@ impl<R: Rounds> Core<R> {
3132
3233 let inner = if avx2_present {
3334 Inner {
34- avx2 : avx2:: Core :: new ( key, iv) ,
35+ avx2 : ManuallyDrop :: new ( avx2:: Core :: new ( key, iv) ) ,
3536 }
3637 } else {
3738 Inner {
38- sse2 : sse2:: Core :: new ( key, iv) ,
39+ sse2 : ManuallyDrop :: new ( sse2:: Core :: new ( key, iv) ) ,
3940 }
4041 } ;
4142
@@ -46,9 +47,9 @@ impl<R: Rounds> Core<R> {
4647 #[ inline]
4748 pub fn generate ( & self , counter : u64 , output : & mut [ u8 ] ) {
4849 if self . token . get ( ) {
49- unsafe { self . inner . avx2 . generate ( counter, output) }
50+ unsafe { ( * self . inner . avx2 ) . generate ( counter, output) }
5051 } else {
51- unsafe { self . inner . sse2 . generate ( counter, output) }
52+ unsafe { ( * self . inner . sse2 ) . generate ( counter, output) }
5253 }
5354 }
5455
@@ -57,9 +58,9 @@ impl<R: Rounds> Core<R> {
5758 #[ cfg( feature = "cipher" ) ]
5859 pub fn apply_keystream ( & self , counter : u64 , output : & mut [ u8 ] ) {
5960 if self . token . get ( ) {
60- unsafe { self . inner . avx2 . apply_keystream ( counter, output) }
61+ unsafe { ( * self . inner . avx2 ) . apply_keystream ( counter, output) }
6162 } else {
62- unsafe { self . inner . sse2 . apply_keystream ( counter, output) }
63+ unsafe { ( * self . inner . sse2 ) . apply_keystream ( counter, output) }
6364 }
6465 }
6566}
@@ -68,11 +69,11 @@ impl<R: Rounds> Clone for Core<R> {
6869 fn clone ( & self ) -> Self {
6970 let inner = if self . token . get ( ) {
7071 Inner {
71- avx2 : unsafe { self . inner . avx2 } ,
72+ avx2 : ManuallyDrop :: new ( unsafe { ( * self . inner . avx2 ) . clone ( ) } ) ,
7273 }
7374 } else {
7475 Inner {
75- sse2 : unsafe { self . inner . sse2 } ,
76+ sse2 : ManuallyDrop :: new ( unsafe { ( * self . inner . sse2 ) . clone ( ) } ) ,
7677 }
7778 } ;
7879
0 commit comments