Skip to content

Commit 02e07f2

Browse files
authored
Merge pull request #159 from Cosmian/refacto/PKE-AC
simplifies the implementation of `PkeAc` for Covercrypt
2 parents f420db7 + 8ebcd9f commit 02e07f2

2 files changed

Lines changed: 26 additions & 39 deletions

File tree

src/api.rs

Lines changed: 25 additions & 38 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
use 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};
44
use zeroize::Zeroizing;
55

66
use super::{
@@ -10,7 +10,7 @@ use super::{
1010
};
1111
use 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
}

src/traits.rs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -80,7 +80,7 @@ pub trait PkeAc<const KEY_LENGTH: usize, E: AE<KEY_LENGTH>> {
8080
/// decrypt this ciphertext.
8181
fn decrypt(
8282
&self,
83-
usk: &Self::DecryptionKey,
83+
dk: &Self::DecryptionKey,
8484
ctx: &Self::Ciphertext,
8585
) -> Result<Option<Zeroizing<Vec<u8>>>, Self::Error>;
8686
}

0 commit comments

Comments
 (0)