Skip to content
This repository was archived by the owner on Jan 22, 2025. It is now read-only.

Commit c9e8f9c

Browse files
v1.17: [zk-token-sdk] Limit max seed length for key derivations (backport of #33700) (#33795)
[zk-token-sdk] Limit max seed length for key derivations (#33700) * limit max seed length for elgamal keypairs * limit max seed length for authenticated encryption keys * Apply suggestions from code review Co-authored-by: Jon Cinque <[email protected]> * rename `SeedLengthTooLarge` to `SeedLengthTooLong` --------- Co-authored-by: Jon Cinque <[email protected]> (cherry picked from commit dd2b1bb) Co-authored-by: samkim-crypto <[email protected]>
1 parent f3308f7 commit c9e8f9c

File tree

2 files changed

+27
-0
lines changed

2 files changed

+27
-0
lines changed

zk-token-sdk/src/encryption/auth_encryption.rs

+18
Original file line numberDiff line numberDiff line change
@@ -50,6 +50,8 @@ pub enum AuthenticatedEncryptionError {
5050
DerivationMethodNotSupported,
5151
#[error("seed length too short for derivation")]
5252
SeedLengthTooShort,
53+
#[error("seed length too long for derivation")]
54+
SeedLengthTooLong,
5355
}
5456

5557
struct AuthenticatedEncryption;
@@ -172,10 +174,14 @@ impl EncodableKey for AeKey {
172174
impl SeedDerivable for AeKey {
173175
fn from_seed(seed: &[u8]) -> Result<Self, Box<dyn error::Error>> {
174176
const MINIMUM_SEED_LEN: usize = AE_KEY_LEN;
177+
const MAXIMUM_SEED_LEN: usize = 65535;
175178

176179
if seed.len() < MINIMUM_SEED_LEN {
177180
return Err(AuthenticatedEncryptionError::SeedLengthTooShort.into());
178181
}
182+
if seed.len() > MAXIMUM_SEED_LEN {
183+
return Err(AuthenticatedEncryptionError::SeedLengthTooLong.into());
184+
}
179185

180186
let mut hasher = Sha3_512::new();
181187
hasher.update(seed);
@@ -278,4 +284,16 @@ mod tests {
278284
let null_signer = NullSigner::new(&Pubkey::default());
279285
assert!(AeKey::new_from_signer(&null_signer, Pubkey::default().as_ref()).is_err());
280286
}
287+
288+
#[test]
289+
fn test_aes_key_from_seed() {
290+
let good_seed = vec![0; 32];
291+
assert!(AeKey::from_seed(&good_seed).is_ok());
292+
293+
let too_short_seed = vec![0; 15];
294+
assert!(AeKey::from_seed(&too_short_seed).is_err());
295+
296+
let too_long_seed = vec![0; 65536];
297+
assert!(AeKey::from_seed(&too_long_seed).is_err());
298+
}
281299
}

zk-token-sdk/src/encryption/elgamal.rs

+9
Original file line numberDiff line numberDiff line change
@@ -76,6 +76,8 @@ pub enum ElGamalError {
7676
DerivationMethodNotSupported,
7777
#[error("seed length too short for derivation")]
7878
SeedLengthTooShort,
79+
#[error("seed length too long for derivation")]
80+
SeedLengthTooLong,
7981
}
8082

8183
/// Algorithm handle for the twisted ElGamal encryption scheme
@@ -449,10 +451,14 @@ impl ElGamalSecretKey {
449451
/// Derive an ElGamal secret key from an entropy seed.
450452
pub fn from_seed(seed: &[u8]) -> Result<Self, ElGamalError> {
451453
const MINIMUM_SEED_LEN: usize = ELGAMAL_SECRET_KEY_LEN;
454+
const MAXIMUM_SEED_LEN: usize = 65535;
452455

453456
if seed.len() < MINIMUM_SEED_LEN {
454457
return Err(ElGamalError::SeedLengthTooShort);
455458
}
459+
if seed.len() > MAXIMUM_SEED_LEN {
460+
return Err(ElGamalError::SeedLengthTooLong);
461+
}
456462
Ok(ElGamalSecretKey(Scalar::hash_from_bytes::<Sha3_512>(seed)))
457463
}
458464

@@ -1026,6 +1032,9 @@ mod tests {
10261032

10271033
let too_short_seed = vec![0; 31];
10281034
assert!(ElGamalKeypair::from_seed(&too_short_seed).is_err());
1035+
1036+
let too_long_seed = vec![0; 65536];
1037+
assert!(ElGamalKeypair::from_seed(&too_long_seed).is_err());
10291038
}
10301039

10311040
#[test]

0 commit comments

Comments
 (0)