Skip to content

Commit f858173

Browse files
authored
Implement MultipartSigner/Verifier (#1221)
1 parent 81adc27 commit f858173

9 files changed

Lines changed: 84 additions & 18 deletions

File tree

bign256/Cargo.toml

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -33,7 +33,7 @@ pkcs8 = { version = "0.11.0-rc.3", optional = true }
3333
primefield = { version = "=0.14.0-pre.2", optional = true }
3434
primeorder = { version = "=0.14.0-pre.3", optional = true }
3535
sec1 = { version = "0.8.0-rc.1", optional = true }
36-
signature = { version = "3.0.0-pre.0", optional = true }
36+
signature = { version = "3.0.0-pre.1", optional = true }
3737

3838
[dev-dependencies]
3939
criterion = "0.6"

bign256/src/ecdsa/signing.rs

Lines changed: 7 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -25,7 +25,7 @@ use elliptic_curve::{
2525
point::AffineCoordinates,
2626
subtle::{Choice, ConstantTimeEq},
2727
};
28-
use signature::{Error, KeypairRef, Result, Signer, hazmat::PrehashSigner};
28+
use signature::{Error, KeypairRef, MultipartSigner, Result, Signer, hazmat::PrehashSigner};
2929

3030
/// BignP256 secret key used for signing messages and producing signatures.
3131
///
@@ -151,6 +151,12 @@ impl PrehashSigner<Signature> for SigningKey {
151151

152152
impl Signer<Signature> for SigningKey {
153153
fn try_sign(&self, msg: &[u8]) -> Result<Signature> {
154+
self.try_multipart_sign(&[msg])
155+
}
156+
}
157+
158+
impl MultipartSigner<Signature> for SigningKey {
159+
fn try_multipart_sign(&self, msg: &[&[u8]]) -> Result<Signature> {
154160
// 1. Set 𝐻 ← ℎ(𝑋).
155161
let hash = self.verifying_key.hash_msg(msg);
156162
self.sign_prehash(&hash)

bign256/src/ecdsa/verifying.rs

Lines changed: 9 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -31,7 +31,7 @@ use elliptic_curve::{
3131
group::GroupEncoding,
3232
ops::{LinearCombination, Reduce},
3333
};
34-
use signature::{Error, Result, Verifier, hazmat::PrehashVerifier};
34+
use signature::{Error, MultipartVerifier, Result, Verifier, hazmat::PrehashVerifier};
3535

3636
use elliptic_curve::sec1::ToEncodedPoint;
3737

@@ -84,9 +84,9 @@ impl VerifyingKey {
8484
/// Compute message hash `e` according to [STB 34.101.31-2020 § 7.8]
8585
///
8686
/// [STB 34.101.31-2020 § 7.8]: https://apmi.bsu.by/assets/files/std/belt-spec371.pdf
87-
pub(crate) fn hash_msg(&self, msg: &[u8]) -> Hash {
87+
pub(crate) fn hash_msg(&self, msg: &[&[u8]]) -> Hash {
8888
let mut hasher = BeltHash::new();
89-
hasher.update(msg);
89+
msg.iter().for_each(|slice| hasher.update(slice));
9090
hasher.finalize_fixed()
9191
}
9292

@@ -163,6 +163,12 @@ impl PrehashVerifier<Signature> for VerifyingKey {
163163

164164
impl Verifier<Signature> for VerifyingKey {
165165
fn verify(&self, msg: &[u8], signature: &Signature) -> Result<()> {
166+
self.multipart_verify(&[msg], signature)
167+
}
168+
}
169+
170+
impl MultipartVerifier<Signature> for VerifyingKey {
171+
fn multipart_verify(&self, msg: &[&[u8]], signature: &Signature) -> Result<()> {
166172
// 4. Set 𝐻 ← ℎ(𝑋).
167173
let hash = self.hash_msg(msg);
168174
self.verify_prehash(&hash, signature)

k256/Cargo.toml

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -28,7 +28,7 @@ ecdsa-core = { version = "0.17.0-rc.0", package = "ecdsa", optional = true, defa
2828
hex-literal = { version = "1", optional = true }
2929
serdect = { version = "0.3", optional = true, default-features = false }
3030
sha2 = { version = "0.11.0-rc.0", optional = true, default-features = false }
31-
signature = { version = "3.0.0-rc.0", optional = true }
31+
signature = { version = "3.0.0-rc.1", optional = true }
3232

3333
[dev-dependencies]
3434
blobby = "0.3"

k256/src/schnorr/signing.rs

Lines changed: 24 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -13,7 +13,8 @@ use elliptic_curve::{
1313
};
1414
use sha2::{Digest, Sha256};
1515
use signature::{
16-
DigestSigner, Error, KeypairRef, RandomizedDigestSigner, RandomizedSigner, Result, Signer,
16+
DigestSigner, Error, KeypairRef, MultipartSigner, RandomizedDigestSigner,
17+
RandomizedMultipartSigner, RandomizedSigner, Result, Signer,
1718
digest::{FixedOutput, consts::U32},
1819
hazmat::{PrehashSigner, RandomizedPrehashSigner},
1920
};
@@ -201,7 +202,19 @@ impl RandomizedSigner<Signature> for SigningKey {
201202
rng: &mut R,
202203
msg: &[u8],
203204
) -> Result<Signature> {
204-
self.try_sign_digest_with_rng(rng, Sha256::new_with_prefix(msg))
205+
self.try_multipart_sign_with_rng(rng, &[msg])
206+
}
207+
}
208+
209+
impl RandomizedMultipartSigner<Signature> for SigningKey {
210+
fn try_multipart_sign_with_rng<R: TryCryptoRng + ?Sized>(
211+
&self,
212+
rng: &mut R,
213+
msg: &[&[u8]],
214+
) -> Result<Signature> {
215+
let mut digest = Sha256::new();
216+
msg.iter().for_each(|slice| digest.update(slice));
217+
self.try_sign_digest_with_rng(rng, digest)
205218
}
206219
}
207220

@@ -221,7 +234,15 @@ impl RandomizedPrehashSigner<Signature> for SigningKey {
221234

222235
impl Signer<Signature> for SigningKey {
223236
fn try_sign(&self, msg: &[u8]) -> Result<Signature> {
224-
self.try_sign_digest(Sha256::new_with_prefix(msg))
237+
self.try_multipart_sign(&[msg])
238+
}
239+
}
240+
241+
impl MultipartSigner<Signature> for SigningKey {
242+
fn try_multipart_sign(&self, msg: &[&[u8]]) -> Result<Signature> {
243+
let mut digest = Sha256::new();
244+
msg.iter().for_each(|slice| digest.update(slice));
245+
self.try_sign_digest(digest)
225246
}
226247
}
227248

k256/src/schnorr/verifying.rs

Lines changed: 12 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -12,7 +12,9 @@ use sha2::{
1212
Digest, Sha256,
1313
digest::{FixedOutput, consts::U32},
1414
};
15-
use signature::{DigestVerifier, Error, Result, Verifier, hazmat::PrehashVerifier};
15+
use signature::{
16+
DigestVerifier, Error, MultipartVerifier, Result, Verifier, hazmat::PrehashVerifier,
17+
};
1618

1719
#[cfg(feature = "serde")]
1820
use serdect::serde::{Deserialize, Serialize, de, ser};
@@ -109,7 +111,15 @@ impl PrehashVerifier<Signature> for VerifyingKey {
109111

110112
impl Verifier<Signature> for VerifyingKey {
111113
fn verify(&self, msg: &[u8], signature: &Signature) -> Result<()> {
112-
self.verify_digest(Sha256::new_with_prefix(msg), signature)
114+
self.multipart_verify(&[msg], signature)
115+
}
116+
}
117+
118+
impl MultipartVerifier<Signature> for VerifyingKey {
119+
fn multipart_verify(&self, msg: &[&[u8]], signature: &Signature) -> Result<()> {
120+
let mut digest = Sha256::new();
121+
msg.iter().for_each(|slice| digest.update(slice));
122+
self.verify_digest(digest, signature)
113123
}
114124
}
115125

sm2/Cargo.toml

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -26,7 +26,7 @@ primefield = { version = "=0.14.0-pre.2", optional = true }
2626
primeorder = { version = "=0.14.0-pre.3", optional = true }
2727
rfc6979 = { version = "0.5.0-rc.0", optional = true }
2828
serdect = { version = "0.3", optional = true, default-features = false }
29-
signature = { version = "3.0.0-rc.0", optional = true, features = ["rand_core"] }
29+
signature = { version = "3.0.0-rc.1", optional = true, features = ["rand_core"] }
3030
sm3 = { version = "0.5.0-rc.0", optional = true, default-features = false }
3131

3232
[dev-dependencies]

sm2/src/dsa/signing.rs

Lines changed: 18 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -27,7 +27,8 @@ use elliptic_curve::{
2727
subtle::{Choice, ConstantTimeEq},
2828
};
2929
use signature::{
30-
Error, KeypairRef, RandomizedSigner, Result, Signer,
30+
Error, KeypairRef, MultipartSigner, RandomizedMultipartSigner, RandomizedSigner, Result,
31+
Signer,
3132
hazmat::{PrehashSigner, RandomizedPrehashSigner},
3233
rand_core::TryCryptoRng,
3334
};
@@ -141,6 +142,16 @@ impl RandomizedSigner<Signature> for SigningKey {
141142
&self,
142143
rng: &mut R,
143144
msg: &[u8],
145+
) -> Result<Signature> {
146+
self.try_multipart_sign_with_rng(rng, &[msg])
147+
}
148+
}
149+
150+
impl RandomizedMultipartSigner<Signature> for SigningKey {
151+
fn try_multipart_sign_with_rng<R: TryCryptoRng + ?Sized>(
152+
&self,
153+
rng: &mut R,
154+
msg: &[&[u8]],
144155
) -> Result<Signature> {
145156
// A1: set M~=ZA || M
146157
let hash = self.verifying_key.hash_msg(msg);
@@ -150,6 +161,12 @@ impl RandomizedSigner<Signature> for SigningKey {
150161

151162
impl Signer<Signature> for SigningKey {
152163
fn try_sign(&self, msg: &[u8]) -> Result<Signature> {
164+
self.try_multipart_sign(&[msg])
165+
}
166+
}
167+
168+
impl MultipartSigner<Signature> for SigningKey {
169+
fn try_multipart_sign(&self, msg: &[&[u8]]) -> Result<Signature> {
153170
// A1: set M~=ZA || M
154171
let hash = self.verifying_key.hash_msg(msg);
155172
self.sign_prehash(&hash)

sm2/src/dsa/verifying.rs

Lines changed: 11 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -24,7 +24,7 @@ use elliptic_curve::{
2424
point::AffineCoordinates,
2525
sec1::ToEncodedPoint,
2626
};
27-
use signature::{Error, Result, Verifier, hazmat::PrehashVerifier};
27+
use signature::{Error, MultipartVerifier, Result, Verifier, hazmat::PrehashVerifier};
2828
use sm3::{Sm3, digest::Digest};
2929

3030
#[cfg(feature = "alloc")]
@@ -124,10 +124,10 @@ impl VerifyingKey {
124124
/// Compute message hash `e` according to [draft-shen-sm2-ecdsa § 5.2.1]
125125
///
126126
/// [draft-shen-sm2-ecdsa § 5.2.1]: https://datatracker.ietf.org/doc/html/draft-shen-sm2-ecdsa-02#section-5.2.1
127-
pub(crate) fn hash_msg(&self, msg: &[u8]) -> Hash {
128-
Sm3::new_with_prefix(self.identity_hash)
129-
.chain_update(msg)
130-
.finalize()
127+
pub(crate) fn hash_msg(&self, msg: &[&[u8]]) -> Hash {
128+
let mut hasher = Sm3::new_with_prefix(self.identity_hash);
129+
msg.iter().for_each(|slice| hasher.update(slice));
130+
hasher.finalize()
131131
}
132132
}
133133

@@ -176,6 +176,12 @@ impl PrehashVerifier<Signature> for VerifyingKey {
176176

177177
impl Verifier<Signature> for VerifyingKey {
178178
fn verify(&self, msg: &[u8], signature: &Signature) -> Result<()> {
179+
self.multipart_verify(&[msg], signature)
180+
}
181+
}
182+
183+
impl MultipartVerifier<Signature> for VerifyingKey {
184+
fn multipart_verify(&self, msg: &[&[u8]], signature: &Signature) -> Result<()> {
179185
// B3: set M'~=ZA || M'
180186
let hash = self.hash_msg(msg);
181187
self.verify_prehash(&hash, signature)

0 commit comments

Comments
 (0)