Skip to content

Commit ea24b78

Browse files
committed
Update to &[&[u8]] messages
1 parent 2798f79 commit ea24b78

35 files changed

+190
-148
lines changed

Cargo.lock

Lines changed: 1 addition & 2 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

Cargo.toml

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -25,3 +25,5 @@ lms-signature = { path = "./lms" }
2525
ml-dsa = { path = "./ml-dsa" }
2626
rfc6979 = { path = "./rfc6979" }
2727
slh-dsa = { path = "./slh-dsa" }
28+
29+
signature = { git = "https://github.com/RustCrypto/traits", rev = "9e3f5ec97faf6a96c0bad7756402c940db240066" }

dsa/src/signing_key.rs

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -148,8 +148,9 @@ impl SigningKey {
148148
impl ZeroizeOnDrop for SigningKey {}
149149

150150
impl Signer<Signature> for SigningKey {
151-
fn try_sign(&self, msg: &[u8]) -> Result<Signature, signature::Error> {
152-
let digest = sha2::Sha256::new_with_prefix(msg);
151+
fn try_sign(&self, msg: &[&[u8]]) -> Result<Signature, signature::Error> {
152+
let mut digest = sha2::Sha256::default();
153+
msg.iter().for_each(|slice| digest.update(slice));
153154
self.try_sign_digest(digest)
154155
}
155156
}

dsa/src/verifying_key.rs

Lines changed: 4 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -107,8 +107,10 @@ impl VerifyingKey {
107107
}
108108

109109
impl Verifier<Signature> for VerifyingKey {
110-
fn verify(&self, msg: &[u8], signature: &Signature) -> Result<(), signature::Error> {
111-
self.verify_digest(sha2::Sha256::new_with_prefix(msg), signature)
110+
fn verify(&self, msg: &[&[u8]], signature: &Signature) -> Result<(), signature::Error> {
111+
let mut digest = sha2::Sha256::default();
112+
msg.iter().for_each(|slice| digest.update(slice));
113+
self.verify_digest(digest, signature)
112114
}
113115
}
114116

dsa/tests/signature.rs

Lines changed: 5 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -104,9 +104,9 @@ fn signer_verifier_signature() {
104104
// construct signature manually and by `Signer` defaults. Ensure results are identical.
105105
let manual_digest = Sha256::new_with_prefix(message).finalize();
106106
let manual_signature = signing_key.sign_prehash(&manual_digest).unwrap();
107-
let signer_signature = signing_key.sign(message);
108-
verifying_key.verify(message, &manual_signature).unwrap();
109-
verifying_key.verify(message, &signer_signature).unwrap();
107+
let signer_signature = signing_key.sign(&[message]);
108+
verifying_key.verify(&[message], &manual_signature).unwrap();
109+
verifying_key.verify(&[message], &signer_signature).unwrap();
110110
assert_eq!(manual_signature, signer_signature);
111111

112112
// verify signature manually and by `Verifier` defaults. Ensure signatures can be applied interchangeably.
@@ -116,8 +116,8 @@ fn signer_verifier_signature() {
116116
verifying_key
117117
.verify_prehash(&manual_digest, &signer_signature)
118118
.unwrap();
119-
verifying_key.verify(message, &manual_signature).unwrap();
120-
verifying_key.verify(message, &signer_signature).unwrap();
119+
verifying_key.verify(&[message], &manual_signature).unwrap();
120+
verifying_key.verify(&[message], &signer_signature).unwrap();
121121
}
122122

123123
/// This test forces the r and s of the signature to a bit precision different to what would

ecdsa/src/dev.rs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -200,7 +200,7 @@ macro_rules! new_wycheproof_test {
200200
Err(_) => return Some("failed to parse signature ASN.1"),
201201
};
202202

203-
match verifying_key.verify(msg, &sig) {
203+
match verifying_key.verify(&[msg], &sig) {
204204
Ok(_) if pass => None,
205205
Ok(_) => Some("signature verify unexpectedly succeeded"),
206206
Err(_) if !pass => None,

ecdsa/src/recovery.rs

Lines changed: 13 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -96,7 +96,7 @@ impl RecoveryId {
9696
/// otherwise.
9797
pub fn trial_recovery_from_msg<C>(
9898
verifying_key: &VerifyingKey<C>,
99-
msg: &[u8],
99+
msg: &[&[u8]],
100100
signature: &Signature<C>,
101101
) -> Result<Self>
102102
where
@@ -105,7 +105,9 @@ impl RecoveryId {
105105
FieldBytesSize<C>: sec1::ModulusSize,
106106
SignatureSize<C>: ArraySize,
107107
{
108-
Self::trial_recovery_from_digest(verifying_key, C::Digest::new_with_prefix(msg), signature)
108+
let mut digest = C::Digest::new();
109+
msg.iter().for_each(|slice| digest.update(slice));
110+
Self::trial_recovery_from_digest(verifying_key, digest, signature)
109111
}
110112

111113
/// Given a public key, message digest, and signature, use trial recovery
@@ -220,8 +222,10 @@ where
220222

221223
/// Sign the given message, hashing it with the curve's default digest
222224
/// function, and returning a signature and recovery ID.
223-
pub fn sign_recoverable(&self, msg: &[u8]) -> Result<(Signature<C>, RecoveryId)> {
224-
self.sign_digest_recoverable(C::Digest::new_with_prefix(msg))
225+
pub fn sign_recoverable(&self, msg: &[&[u8]]) -> Result<(Signature<C>, RecoveryId)> {
226+
let mut digest = C::Digest::new();
227+
msg.iter().for_each(|slice| digest.update(slice));
228+
self.sign_digest_recoverable(digest)
225229
}
226230
}
227231

@@ -290,7 +294,7 @@ where
290294
Scalar<C>: Invert<Output = CtOption<Scalar<C>>>,
291295
SignatureSize<C>: ArraySize,
292296
{
293-
fn try_sign(&self, msg: &[u8]) -> Result<(Signature<C>, RecoveryId)> {
297+
fn try_sign(&self, msg: &[&[u8]]) -> Result<(Signature<C>, RecoveryId)> {
294298
self.sign_recoverable(msg)
295299
}
296300
}
@@ -308,14 +312,16 @@ where
308312
///
309313
/// The message is first hashed using this curve's [`DigestPrimitive`].
310314
pub fn recover_from_msg(
311-
msg: &[u8],
315+
msg: &[&[u8]],
312316
signature: &Signature<C>,
313317
recovery_id: RecoveryId,
314318
) -> Result<Self>
315319
where
316320
C: DigestPrimitive,
317321
{
318-
Self::recover_from_digest(C::Digest::new_with_prefix(msg), signature, recovery_id)
322+
let mut digest = C::Digest::new();
323+
msg.iter().for_each(|slice| digest.update(slice));
324+
Self::recover_from_digest(digest, signature, recovery_id)
319325
}
320326

321327
/// Recover a [`VerifyingKey`] from the given message [`Digest`],

ecdsa/src/signing.rs

Lines changed: 14 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -175,8 +175,10 @@ where
175175
Scalar<C>: Invert<Output = CtOption<Scalar<C>>>,
176176
SignatureSize<C>: ArraySize,
177177
{
178-
fn try_sign(&self, msg: &[u8]) -> Result<Signature<C>> {
179-
self.try_sign_digest(C::Digest::new_with_prefix(msg))
178+
fn try_sign(&self, msg: &[&[u8]]) -> Result<Signature<C>> {
179+
let mut digest = C::Digest::new();
180+
msg.iter().for_each(|slice| digest.update(slice));
181+
self.try_sign_digest(digest)
180182
}
181183
}
182184

@@ -232,9 +234,11 @@ where
232234
fn try_sign_with_rng<R: TryCryptoRng + ?Sized>(
233235
&self,
234236
rng: &mut R,
235-
msg: &[u8],
237+
msg: &[&[u8]],
236238
) -> Result<Signature<C>> {
237-
self.try_sign_digest_with_rng(rng, C::Digest::new_with_prefix(msg))
239+
let mut digest = C::Digest::new();
240+
msg.iter().for_each(|slice| digest.update(slice));
241+
self.try_sign_digest_with_rng(rng, digest)
238242
}
239243
}
240244

@@ -259,8 +263,10 @@ where
259263
Scalar<C>: Invert<Output = CtOption<Scalar<C>>>,
260264
SignatureSize<C>: ArraySize,
261265
{
262-
fn try_sign(&self, msg: &[u8]) -> Result<SignatureWithOid<C>> {
263-
self.try_sign_digest(C::Digest::new_with_prefix(msg))
266+
fn try_sign(&self, msg: &[&[u8]]) -> Result<SignatureWithOid<C>> {
267+
let mut digest = C::Digest::new();
268+
msg.iter().for_each(|slice| digest.update(slice));
269+
self.try_sign_digest(digest)
264270
}
265271
}
266272

@@ -287,7 +293,7 @@ where
287293
der::MaxSize<C>: ArraySize,
288294
<FieldBytesSize<C> as Add>::Output: Add<der::MaxOverhead> + ArraySize,
289295
{
290-
fn try_sign(&self, msg: &[u8]) -> Result<der::Signature<C>> {
296+
fn try_sign(&self, msg: &[&[u8]]) -> Result<der::Signature<C>> {
291297
Signer::<Signature<C>>::try_sign(self, msg).map(Into::into)
292298
}
293299
}
@@ -358,7 +364,7 @@ where
358364
fn try_sign_with_rng<R: TryCryptoRng + ?Sized>(
359365
&self,
360366
rng: &mut R,
361-
msg: &[u8],
367+
msg: &[&[u8]],
362368
) -> Result<der::Signature<C>> {
363369
RandomizedSigner::<Signature<C>>::try_sign_with_rng(self, rng, msg).map(Into::into)
364370
}

ecdsa/src/verifying.rs

Lines changed: 26 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -177,8 +177,10 @@ where
177177
C: EcdsaCurve + CurveArithmetic + DigestPrimitive,
178178
SignatureSize<C>: ArraySize,
179179
{
180-
fn verify(&self, msg: &[u8], signature: &Signature<C>) -> Result<()> {
181-
self.verify_digest(C::Digest::new_with_prefix(msg), signature)
180+
fn verify(&self, msg: &[&[u8]], signature: &Signature<C>) -> Result<()> {
181+
let mut digest = C::Digest::new();
182+
msg.iter().for_each(|slice| digest.update(slice));
183+
self.verify_digest(digest, signature)
182184
}
183185
}
184186

@@ -188,12 +190,28 @@ where
188190
C: EcdsaCurve + CurveArithmetic + DigestPrimitive,
189191
SignatureSize<C>: ArraySize,
190192
{
191-
fn verify(&self, msg: &[u8], sig: &SignatureWithOid<C>) -> Result<()> {
193+
fn verify(&self, msg: &[&[u8]], sig: &SignatureWithOid<C>) -> Result<()> {
192194
match sig.oid() {
193-
ECDSA_SHA224_OID => self.verify_prehash(&Sha224::digest(msg), sig.signature()),
194-
ECDSA_SHA256_OID => self.verify_prehash(&Sha256::digest(msg), sig.signature()),
195-
ECDSA_SHA384_OID => self.verify_prehash(&Sha384::digest(msg), sig.signature()),
196-
ECDSA_SHA512_OID => self.verify_prehash(&Sha512::digest(msg), sig.signature()),
195+
ECDSA_SHA224_OID => {
196+
let mut digest = Sha224::new();
197+
msg.iter().for_each(|slice| digest.update(slice));
198+
self.verify_prehash(&digest.finalize(), sig.signature())
199+
}
200+
ECDSA_SHA256_OID => {
201+
let mut digest = Sha256::new();
202+
msg.iter().for_each(|slice| digest.update(slice));
203+
self.verify_prehash(&digest.finalize(), sig.signature())
204+
}
205+
ECDSA_SHA384_OID => {
206+
let mut digest = Sha384::new();
207+
msg.iter().for_each(|slice| digest.update(slice));
208+
self.verify_prehash(&digest.finalize(), sig.signature())
209+
}
210+
ECDSA_SHA512_OID => {
211+
let mut digest = Sha512::new();
212+
msg.iter().for_each(|slice| digest.update(slice));
213+
self.verify_prehash(&digest.finalize(), sig.signature())
214+
}
197215
_ => Err(Error::new()),
198216
}
199217
}
@@ -236,7 +254,7 @@ where
236254
der::MaxSize<C>: ArraySize,
237255
<FieldBytesSize<C> as Add>::Output: Add<der::MaxOverhead> + ArraySize,
238256
{
239-
fn verify(&self, msg: &[u8], signature: &der::Signature<C>) -> Result<()> {
257+
fn verify(&self, msg: &[&[u8]], signature: &der::Signature<C>) -> Result<()> {
240258
let signature = Signature::<C>::try_from(signature.clone())?;
241259
Verifier::<Signature<C>>::verify(self, msg, &signature)
242260
}

ed25519/src/lib.rs

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -43,7 +43,7 @@
4343
//! // NOTE: use `try_sign` if you'd like to be able to handle
4444
//! // errors from external signing services/devices (e.g. HSM/KMS)
4545
//! // <https://docs.rs/signature/latest/signature/trait.Signer.html#tymethod.try_sign>
46-
//! self.signing_key.sign(format_message(person).as_bytes())
46+
//! self.signing_key.sign(&[format_message(person).as_bytes()])
4747
//! }
4848
//! }
4949
//!
@@ -60,7 +60,7 @@
6060
//! person: &str,
6161
//! signature: &ed25519::Signature
6262
//! ) -> Result<(), ed25519::Error> {
63-
//! self.verifying_key.verify(format_message(person).as_bytes(), signature)
63+
//! self.verifying_key.verify(&[format_message(person).as_bytes()], signature)
6464
//! }
6565
//! }
6666
//!

ed448/src/lib.rs

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -43,7 +43,7 @@
4343
//! // NOTE: use `try_sign` if you'd like to be able to handle
4444
//! // errors from external signing services/devices (e.g. HSM/KMS)
4545
//! // <https://docs.rs/signature/latest/signature/trait.Signer.html#tymethod.try_sign>
46-
//! self.signing_key.sign(format_message(person).as_bytes())
46+
//! self.signing_key.sign(&[format_message(person).as_bytes()])
4747
//! }
4848
//! }
4949
//!
@@ -60,7 +60,7 @@
6060
//! person: &str,
6161
//! signature: &ed448_signature::Signature
6262
//! ) -> Result<(), ed448_signature::Error> {
63-
//! self.verifying_key.verify(format_message(person).as_bytes(), signature)
63+
//! self.verifying_key.verify(&[format_message(person).as_bytes()], signature)
6464
//! }
6565
//! }
6666
//!

lms/src/lms/mod.rs

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -32,11 +32,11 @@ mod tests {
3232
let msg = "this is a test message".as_bytes();
3333

3434
// Sign the message
35-
let sig = sk.try_sign_with_rng(&mut rng, msg);
35+
let sig = sk.try_sign_with_rng(&mut rng, &[msg]);
3636
let sig = sig.unwrap();
3737

3838
// Verify the signature
39-
assert!(pk.verify(msg, &sig).is_ok());
39+
assert!(pk.verify(&[msg], &sig).is_ok());
4040
}
4141

4242
// TODO: macro-generate these exhaustively

lms/src/lms/private.rs

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -108,7 +108,7 @@ impl<Mode: LmsMode> RandomizedSignerMut<Signature<Mode>> for SigningKey<Mode> {
108108
fn try_sign_with_rng<R: TryCryptoRng + ?Sized>(
109109
&mut self,
110110
rng: &mut R,
111-
msg: &[u8],
111+
msg: &[&[u8]],
112112
) -> Result<Signature<Mode>, Error> {
113113
if self.q >= Mode::LEAVES {
114114
return Err(Error::from_source(LmsOutOfPrivateKeys {}));
@@ -354,7 +354,7 @@ mod tests {
354354

355355
let mut rng = ConstantRng(&c);
356356
let sig = lms_priv
357-
.try_sign_with_rng(&mut rng, msg)
357+
.try_sign_with_rng(&mut rng, &[msg])
358358
.unwrap()
359359
.to_bytes();
360360
assert_eq!(sig.len(), expected_signature.len());

lms/src/lms/public.rs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -56,7 +56,7 @@ impl<Mode: LmsMode> VerifyingKey<Mode> {
5656
}
5757

5858
impl<Mode: LmsMode> Verifier<Signature<Mode>> for VerifyingKey<Mode> {
59-
fn verify(&self, msg: &[u8], signature: &Signature<Mode>) -> Result<(), Error> {
59+
fn verify(&self, msg: &[&[u8]], signature: &Signature<Mode>) -> Result<(), Error> {
6060
// Compute the LMS Public Key Candidate Tc from the signature,
6161
// message, identifier, pubtype, and ots_typecode, using
6262
// Algorithm 6a.

lms/src/lms/signature.rs

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -254,7 +254,7 @@ mod tests {
254254
let pk =
255255
VerifyingKey::<LmsSha256M32H5<LmsOtsSha256N32W8>>::try_from(&pk_bytes[..]).unwrap();
256256
let sig = Signature::<LmsSha256M32H5<LmsOtsSha256N32W8>>::try_from(&sig_bytes[..]).unwrap();
257-
assert!(pk.verify(&msg[..], &sig).is_ok());
257+
assert!(pk.verify(&[&msg[..]], &sig).is_ok());
258258
}
259259

260260
fn test_serialize_deserialize_random<Mode: LmsMode>()
@@ -272,10 +272,10 @@ mod tests {
272272
let mut sk = SigningKey::<Mode>::new(&mut rng);
273273
let pk = sk.public();
274274
let msg = b"Hello, world!";
275-
let sig = sk.sign_with_rng(&mut rng, msg);
275+
let sig = sk.sign_with_rng(&mut rng, &[msg]);
276276
let sig_bytes: Vec<_> = sig.clone().into();
277277
let sig2 = Signature::<Mode>::try_from(&sig_bytes[..]).unwrap();
278-
assert!(pk.verify(msg, &sig2).is_ok());
278+
assert!(pk.verify(&[msg], &sig2).is_ok());
279279
}
280280

281281
#[test]

lms/src/ots/mod.rs

Lines changed: 5 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -47,13 +47,13 @@ pub mod tests {
4747
let msg = "this is a test message".as_bytes();
4848

4949
assert!(sk.is_valid());
50-
let sig = sk.try_sign_with_rng(&mut rng, msg);
50+
let sig = sk.try_sign_with_rng(&mut rng, &[msg]);
5151
assert!(!sk.is_valid());
5252

5353
assert!(sig.is_ok());
5454

5555
let sig = sig.unwrap();
56-
let result = pk.verify(msg, &sig);
56+
let result = pk.verify(&[msg], &sig);
5757

5858
assert!(matches!(result, Ok(())));
5959
}
@@ -71,15 +71,15 @@ pub mod tests {
7171
let msg = "this is a test message".as_bytes();
7272

7373
assert!(sk.is_valid());
74-
let sig = sk.try_sign_with_rng(&mut rng, msg);
74+
let sig = sk.try_sign_with_rng(&mut rng, &[msg]);
7575
assert!(!sk.is_valid());
7676

7777
assert!(sig.is_ok());
7878

7979
let sig = sig.unwrap();
8080
// modify q to get the wrong public key
8181
pk.q = 1;
82-
let result = pk.verify(msg, &sig);
82+
let result = pk.verify(&[msg], &sig);
8383

8484
assert!(result.is_err());
8585
}
@@ -163,7 +163,7 @@ pub mod tests {
163163
let c = hex!("0eb1ed54a2460d512388cad533138d240534e97b1e82d33bd927d201dfc24ebb");
164164
let mut rng = ConstantRng(&c);
165165
let msg = "The enumeration in the Constitution, of certain rights, shall not be construed to deny or disparage others retained by the people.\n".as_bytes();
166-
let sig = sk.try_sign_with_rng(&mut rng, msg).unwrap();
166+
let sig = sk.try_sign_with_rng(&mut rng, &[msg]).unwrap();
167167

168168
assert_eq!(sig.c, Array::from(c));
169169
assert_eq!(sig.y[0], Array::from(y0));

0 commit comments

Comments
 (0)