11use std:: sync:: { Mutex , MutexGuard } ;
22
3- use cosmian_crypto_core:: { kdf256 , reexport:: rand_core:: SeedableRng , CsRng , Secret , SymmetricKey } ;
3+ use cosmian_crypto_core:: { reexport:: rand_core:: SeedableRng , CsRng , Secret , SymmetricKey } ;
44use zeroize:: Zeroizing ;
55
66use super :: {
@@ -10,7 +10,7 @@ use super::{
1010} ;
1111use crate :: {
1212 core:: {
13- primitives:: { decaps , encaps , full_decaps, refresh, rekey, setup} ,
13+ primitives:: { self , full_decaps, refresh, rekey, setup} ,
1414 MasterPublicKey , MasterSecretKey , UserSecretKey , XEnc , SHARED_SECRET_LENGTH ,
1515 } ,
1616 traits:: { KemAc , PkeAc } ,
@@ -156,7 +156,7 @@ impl Covercrypt {
156156 encapsulation : & XEnc ,
157157 ) -> Result < ( Secret < 32 > , XEnc ) , Error > {
158158 let ( _ss, rights) = full_decaps ( msk, encapsulation) ?;
159- encaps (
159+ primitives :: encaps (
160160 & mut * self . rng . lock ( ) . expect ( "Mutex lock failed!" ) ,
161161 mpk,
162162 & rights,
@@ -172,22 +172,22 @@ impl KemAc<SHARED_SECRET_LENGTH> for Covercrypt {
172172
173173 fn encaps (
174174 & self ,
175- mpk : & MasterPublicKey ,
175+ ek : & Self :: EncapsulationKey ,
176176 ap : & AccessPolicy ,
177177 ) -> Result < ( Secret < SHARED_SECRET_LENGTH > , Self :: Encapsulation ) , Self :: Error > {
178- encaps (
178+ primitives :: encaps (
179179 & mut * self . rng . lock ( ) . expect ( "Mutex lock failed!" ) ,
180- mpk ,
181- & mpk . access_structure . ap_to_enc_rights ( ap) ?,
180+ ek ,
181+ & ek . access_structure . ap_to_enc_rights ( ap) ?,
182182 )
183183 }
184184
185185 fn decaps (
186186 & self ,
187- usk : & UserSecretKey ,
188- enc : & XEnc ,
187+ dk : & Self :: DecapsulationKey ,
188+ enc : & Self :: Encapsulation ,
189189 ) -> Result < Option < Secret < SHARED_SECRET_LENGTH > > , Error > {
190- decaps ( & mut * self . rng . lock ( ) . expect ( "Mutex lock failed!" ) , usk , enc)
190+ primitives :: decaps ( & mut * self . rng . lock ( ) . expect ( "Mutex lock failed!" ) , dk , enc)
191191 }
192192}
193193
@@ -201,41 +201,28 @@ impl<const KEY_LENGTH: usize, E: AE<KEY_LENGTH, Error = Error>> PkeAc<KEY_LENGTH
201201
202202 fn encrypt (
203203 & self ,
204- mpk : & MasterPublicKey ,
204+ mpk : & Self :: EncryptionKey ,
205205 ap : & AccessPolicy ,
206206 ptx : & [ u8 ] ,
207- ) -> Result < ( XEnc , Vec < u8 > ) , Error > {
208- if SHARED_SECRET_LENGTH < KEY_LENGTH {
209- return Err ( Error :: ConversionFailed ( format ! (
210- "insufficient entropy to generate a {}-byte key from a {}-byte seed" ,
211- KEY_LENGTH , SHARED_SECRET_LENGTH
212- ) ) ) ;
213- }
207+ ) -> Result < Self :: Ciphertext , Self :: Error > {
214208 let ( seed, enc) = self . encaps ( mpk, ap) ?;
215- let mut sym_key = SymmetricKey :: default ( ) ;
216- kdf256 ! ( & mut * sym_key , & * seed ) ;
209+ // Locking Covercrypt RNG must be performed after encapsulation since
210+ // this encapsulation also requires locking the RNG.
217211 let mut rng = self . rng . lock ( ) . expect ( "poisoned lock" ) ;
218- let res = E :: encrypt ( & mut * rng , & sym_key , ptx ) ?;
219- Ok ( ( enc, res ) )
212+ let key = SymmetricKey :: derive ( & seed , b"Covercrypt AE key" ) ?;
213+ E :: encrypt ( & mut * rng , & key , ptx ) . map ( |ctx| ( enc, ctx ) )
220214 }
221215
222216 fn decrypt (
223217 & self ,
224- usk : & UserSecretKey ,
225- ctx : & ( XEnc , Vec < u8 > ) ,
226- ) -> Result < Option < Zeroizing < Vec < u8 > > > , Error > {
227- if SHARED_SECRET_LENGTH < KEY_LENGTH {
228- return Err ( Error :: ConversionFailed ( format ! (
229- "insufficient entropy to generate a {}-byte key from a {}-byte seed" ,
230- KEY_LENGTH , SHARED_SECRET_LENGTH
231- ) ) ) ;
232- }
233- let seed = self . decaps ( usk, & ctx. 0 ) ?;
234- seed. map ( |seed| {
235- let mut sym_key = SymmetricKey :: < KEY_LENGTH > :: default ( ) ;
236- kdf256 ! ( & mut * sym_key, & * seed) ;
237- E :: decrypt ( & sym_key, & ctx. 1 )
238- } )
239- . transpose ( )
218+ usk : & Self :: DecryptionKey ,
219+ ctx : & Self :: Ciphertext ,
220+ ) -> Result < Option < Zeroizing < Vec < u8 > > > , Self :: Error > {
221+ self . decaps ( usk, & ctx. 0 ) ?
222+ . map ( |seed| {
223+ let key = SymmetricKey :: derive ( & seed, b"Covercrypt AE key" ) ?;
224+ E :: decrypt ( & key, & ctx. 1 )
225+ } )
226+ . transpose ( )
240227 }
241228}
0 commit comments