mirror of
https://github.com/saymrwulf/curve25519-dalek-source.git
synced 2026-09-05 20:30:57 +00:00
Improve diagnostics when key being deserializing is too long (#294)
This commit is contained in:
parent
2931c688eb
commit
7901b21e06
3 changed files with 81 additions and 0 deletions
|
|
@ -666,6 +666,19 @@ impl<'d> Deserialize<'d> for SigningKey {
|
||||||
.next_element()?
|
.next_element()?
|
||||||
.ok_or_else(|| serde::de::Error::invalid_length(i, &"expected 32 bytes"))?;
|
.ok_or_else(|| serde::de::Error::invalid_length(i, &"expected 32 bytes"))?;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
let remaining = (0..)
|
||||||
|
.map(|_| seq.next_element::<u8>())
|
||||||
|
.take_while(|el| matches!(el, Ok(Some(_))))
|
||||||
|
.count();
|
||||||
|
|
||||||
|
if remaining > 0 {
|
||||||
|
return Err(serde::de::Error::invalid_length(
|
||||||
|
32 + remaining,
|
||||||
|
&"expected 32 bytes",
|
||||||
|
));
|
||||||
|
}
|
||||||
|
|
||||||
SigningKey::try_from(bytes).map_err(serde::de::Error::custom)
|
SigningKey::try_from(bytes).map_err(serde::de::Error::custom)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
||||||
|
|
@ -569,11 +569,25 @@ impl<'d> Deserialize<'d> for VerifyingKey {
|
||||||
A: serde::de::SeqAccess<'de>,
|
A: serde::de::SeqAccess<'de>,
|
||||||
{
|
{
|
||||||
let mut bytes = [0u8; 32];
|
let mut bytes = [0u8; 32];
|
||||||
|
|
||||||
for i in 0..32 {
|
for i in 0..32 {
|
||||||
bytes[i] = seq
|
bytes[i] = seq
|
||||||
.next_element()?
|
.next_element()?
|
||||||
.ok_or_else(|| serde::de::Error::invalid_length(i, &"expected 32 bytes"))?;
|
.ok_or_else(|| serde::de::Error::invalid_length(i, &"expected 32 bytes"))?;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
let remaining = (0..)
|
||||||
|
.map(|_| seq.next_element::<u8>())
|
||||||
|
.take_while(|el| matches!(el, Ok(Some(_))))
|
||||||
|
.count();
|
||||||
|
|
||||||
|
if remaining > 0 {
|
||||||
|
return Err(serde::de::Error::invalid_length(
|
||||||
|
32 + remaining,
|
||||||
|
&"expected 32 bytes",
|
||||||
|
));
|
||||||
|
}
|
||||||
|
|
||||||
VerifyingKey::try_from(&bytes[..]).map_err(serde::de::Error::custom)
|
VerifyingKey::try_from(&bytes[..]).map_err(serde::de::Error::custom)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
||||||
|
|
@ -542,6 +542,33 @@ mod serialisation {
|
||||||
assert_eq!(verifying_key, decoded_verifying_key);
|
assert_eq!(verifying_key, decoded_verifying_key);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
#[test]
|
||||||
|
fn serialize_deserialize_verifying_key_json_too_long() {
|
||||||
|
// derived from `serialize_deserialize_verifying_key_json` test
|
||||||
|
// trailing zero elements makes key too long (34 bytes)
|
||||||
|
let encoded_verifying_key_too_long = "[130,39,155,15,62,76,188,63,124,122,26,251,233,253,225,220,14,41,166,120,108,35,254,77,160,83,172,58,219,42,86,120,0,0]";
|
||||||
|
let de_err = serde_json::from_str::<VerifyingKey>(&encoded_verifying_key_too_long)
|
||||||
|
.unwrap_err()
|
||||||
|
.to_string();
|
||||||
|
assert!(
|
||||||
|
de_err.contains("invalid length 34"),
|
||||||
|
"expected invalid length error, got: {de_err}",
|
||||||
|
);
|
||||||
|
}
|
||||||
|
|
||||||
|
#[test]
|
||||||
|
fn serialize_deserialize_verifying_key_json_too_short() {
|
||||||
|
// derived from `serialize_deserialize_verifying_key_json` test
|
||||||
|
let encoded_verifying_key_too_long = "[130,39,155,15]";
|
||||||
|
let de_err = serde_json::from_str::<VerifyingKey>(&encoded_verifying_key_too_long)
|
||||||
|
.unwrap_err()
|
||||||
|
.to_string();
|
||||||
|
assert!(
|
||||||
|
de_err.contains("invalid length 4"),
|
||||||
|
"expected invalid length error, got: {de_err}"
|
||||||
|
);
|
||||||
|
}
|
||||||
|
|
||||||
#[test]
|
#[test]
|
||||||
fn serialize_deserialize_signing_key_bincode() {
|
fn serialize_deserialize_signing_key_bincode() {
|
||||||
let signing_key = SigningKey::from_bytes(&SECRET_KEY_BYTES);
|
let signing_key = SigningKey::from_bytes(&SECRET_KEY_BYTES);
|
||||||
|
|
@ -564,6 +591,33 @@ mod serialisation {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
#[test]
|
||||||
|
fn serialize_deserialize_signing_key_json_too_long() {
|
||||||
|
// derived from `serialize_deserialize_signing_key_json` test
|
||||||
|
// trailing zero elements makes key too long (34 bytes)
|
||||||
|
let encoded_signing_key_too_long = "[62,70,27,163,92,182,11,3,77,234,98,4,11,127,79,228,243,187,150,73,201,137,76,22,85,251,152,2,241,42,72,54,0,0]";
|
||||||
|
let de_err = serde_json::from_str::<SigningKey>(&encoded_signing_key_too_long)
|
||||||
|
.unwrap_err()
|
||||||
|
.to_string();
|
||||||
|
assert!(
|
||||||
|
de_err.contains("invalid length 34"),
|
||||||
|
"expected invalid length error, got: {de_err}",
|
||||||
|
);
|
||||||
|
}
|
||||||
|
|
||||||
|
#[test]
|
||||||
|
fn serialize_deserialize_signing_key_json_too_short() {
|
||||||
|
// derived from `serialize_deserialize_signing_key_json` test
|
||||||
|
let encoded_signing_key_too_long = "[62,70,27,163]";
|
||||||
|
let de_err = serde_json::from_str::<SigningKey>(&encoded_signing_key_too_long)
|
||||||
|
.unwrap_err()
|
||||||
|
.to_string();
|
||||||
|
assert!(
|
||||||
|
de_err.contains("invalid length 4"),
|
||||||
|
"expected invalid length error, got: {de_err}"
|
||||||
|
);
|
||||||
|
}
|
||||||
|
|
||||||
#[test]
|
#[test]
|
||||||
fn serialize_deserialize_signing_key_toml() {
|
fn serialize_deserialize_signing_key_toml() {
|
||||||
let demo = Demo {
|
let demo = Demo {
|
||||||
|
|
|
||||||
Loading…
Reference in a new issue