Skip to content

Commit 7c302e6

Browse files
authored
Merge pull request #3387 from ProvableHQ/fix/disallow-request-like-sign
Reject Signature::sign for request-like messages
2 parents 8158693 + 2000077 commit 7c302e6

1 file changed

Lines changed: 45 additions & 0 deletions

File tree

  • console/account/src/signature

console/account/src/signature/sign.rs

Lines changed: 45 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -24,6 +24,12 @@ impl<N: Network> Signature<N> {
2424
if message.len() > N::MAX_DATA_SIZE_IN_FIELDS as usize {
2525
bail!("Cannot sign the message: the message exceeds maximum allowed size")
2626
}
27+
// Disallowing the case message[1] == N::hash_psd2(message[0]) to separate Signature::sign from Request::sign.
28+
if message.len() >= 2 && message[1] == N::hash_psd2(&[message[0]])? {
29+
bail!(
30+
"Invalid message: message[1] == N::hash_psd2([message[0]]) is disallowed. Please construct a different message or use Request::sign."
31+
);
32+
}
2733

2834
// Sample a random nonce from the scalar field.
2935
let nonce = Scalar::rand(rng);
@@ -77,3 +83,42 @@ impl<N: Network> Signature<N> {
7783
Self::sign(private_key, &fields, rng)
7884
}
7985
}
86+
87+
#[cfg(test)]
88+
mod tests {
89+
use super::*;
90+
use snarkvm_console_network::MainnetV0;
91+
92+
type CurrentNetwork = MainnetV0;
93+
94+
const ITERATIONS: u64 = 100;
95+
96+
#[test]
97+
fn test_sign_rejects_request_like_messages() -> Result<()> {
98+
let mut rng = TestRng::default();
99+
100+
for _ in 0..ITERATIONS {
101+
// Sample a new private key.
102+
let private_key = PrivateKey::<CurrentNetwork>::new(&mut rng)?;
103+
104+
// Request signatures begin with (tvk, tcm) where tcm = hash_psd2(tvk).
105+
let tvk = Field::<CurrentNetwork>::rand(&mut rng);
106+
let tcm = CurrentNetwork::hash_psd2(&[tvk])?;
107+
108+
// Add a small number of extra field elements to the message.
109+
let extra_fields =
110+
(0..rng.random_range(0..10)).map(|_| Field::rand(&mut rng)).collect::<Vec<Field<CurrentNetwork>>>();
111+
112+
let mut message = Vec::with_capacity(2 + extra_fields.len());
113+
message.extend([tvk, tcm]);
114+
message.extend(extra_fields);
115+
116+
let error = Signature::sign(&private_key, &message, &mut rng).unwrap_err();
117+
assert!(
118+
error.to_string().contains("message[1] == N::hash_psd2([message[0]])"),
119+
"unexpected error: {error}"
120+
);
121+
}
122+
Ok(())
123+
}
124+
}

0 commit comments

Comments
 (0)