1cfg_if::cfg_if! {
2 if #[cfg(feature = "std")] {
3 use std::borrow::Cow;
4 } else {
5 use alloc::borrow::Cow;
6 }
7}
8use super::common::{
9 CURVE_NAME, PRIVATE_KEY_LENGTH, PUBLIC_KEY_LENGTH, PrivateKeyInner, PublicKeyInner,
10 impl_private_key_wrapper, impl_public_key_wrapper,
11};
12#[cfg(any(target_arch = "x86_64", target_arch = "aarch64"))]
13use aws_lc_rs::signature::{ECDSA_P256_SHA256_FIXED, UnparsedPublicKey};
14use bytes::BufMut;
15use commonware_codec::{Buf, Error as CodecError, FixedArray, FixedSize, Read, ReadExt, Write};
16use commonware_formatting::Hex;
17use commonware_utils::{Array, Span, union_unique};
18use core::{
19 fmt::{Debug, Display},
20 hash::{Hash, Hasher},
21 ops::Deref,
22};
23#[cfg(not(any(target_arch = "x86_64", target_arch = "aarch64")))]
24use p256::ecdsa::signature::Verifier;
25use p256::{ecdsa::signature::Signer, elliptic_curve::scalar::IsHigh};
26
27const SIGNATURE_LENGTH: usize = 64; #[derive(Clone, Eq, PartialEq)]
31pub struct PrivateKey(PrivateKeyInner);
32
33impl_private_key_wrapper!(PrivateKey);
34
35impl crate::Signer for PrivateKey {
36 type Signature = Signature;
37 type PublicKey = PublicKey;
38
39 fn sign(&self, namespace: &[u8], msg: &[u8]) -> Self::Signature {
40 self.sign_inner(Some(namespace), msg)
41 }
42
43 fn public_key(&self) -> Self::PublicKey {
44 PublicKey(PublicKeyInner::from_private_key(&self.0))
45 }
46}
47
48impl PrivateKey {
49 #[inline(always)]
50 fn sign_inner(&self, namespace: Option<&[u8]>, msg: &[u8]) -> Signature {
51 let payload = namespace.map_or(Cow::Borrowed(msg), |namespace| {
52 Cow::Owned(union_unique(namespace, msg))
53 });
54 let signature: p256::ecdsa::Signature = self.0.key.expose(|key| key.sign(&payload));
55 let signature = signature.normalize_s();
56 Signature::try_from(signature).expect("freshly signed signature is valid")
57 }
58}
59
60impl From<PrivateKey> for PublicKey {
61 fn from(value: PrivateKey) -> Self {
62 Self(PublicKeyInner::from_private_key(&value.0))
63 }
64}
65
66#[derive(Clone, Eq, PartialEq, Ord, PartialOrd, FixedArray)]
68#[cfg_attr(feature = "arbitrary", derive(arbitrary::Arbitrary))]
69pub struct PublicKey(PublicKeyInner);
70
71impl_public_key_wrapper!(PublicKey);
72
73impl crate::Verifier for PublicKey {
74 type Signature = Signature;
75
76 fn verify(&self, namespace: &[u8], msg: &[u8], sig: &Self::Signature) -> bool {
77 self.verify_inner(Some(namespace), msg, sig)
78 }
79}
80
81impl PublicKey {
82 #[cfg(not(any(target_arch = "x86_64", target_arch = "aarch64")))]
83 #[inline(always)]
84 fn verify_inner(&self, namespace: Option<&[u8]>, msg: &[u8], sig: &Signature) -> bool {
85 let payload = namespace.map_or(Cow::Borrowed(msg), |namespace| {
86 Cow::Owned(union_unique(namespace, msg))
87 });
88 self.0.key.verify(&payload, &sig.signature).is_ok()
89 }
90
91 #[cfg(any(target_arch = "x86_64", target_arch = "aarch64"))]
92 #[inline(always)]
93 fn verify_inner(&self, namespace: Option<&[u8]>, msg: &[u8], sig: &Signature) -> bool {
94 let payload = namespace.map_or(Cow::Borrowed(msg), |namespace| {
95 Cow::Owned(union_unique(namespace, msg))
96 });
97 let uncompressed = self.0.to_uncompressed();
98 let public_key = UnparsedPublicKey::new(&ECDSA_P256_SHA256_FIXED, &uncompressed);
99 public_key.verify(&payload, &sig.raw).is_ok()
100 }
101}
102
103#[derive(Clone, Eq, PartialEq, FixedArray)]
105pub struct Signature {
106 raw: [u8; SIGNATURE_LENGTH],
107 signature: p256::ecdsa::Signature,
108}
109
110impl crate::Signature for Signature {}
111
112impl Write for Signature {
113 fn write(&self, buf: &mut impl BufMut) {
114 self.raw.write(buf);
115 }
116}
117
118impl Read for Signature {
119 type Cfg = ();
120
121 fn read_cfg(buf: &mut impl Buf, _: &()) -> Result<Self, CodecError> {
122 let raw = <[u8; Self::SIZE]>::read(buf)?;
123 let result = p256::ecdsa::Signature::from_slice(&raw);
124 #[cfg(feature = "std")]
125 let signature = result.map_err(|e| CodecError::Wrapped(CURVE_NAME, e.into()))?;
126 #[cfg(not(feature = "std"))]
127 let signature = result
128 .map_err(|e| CodecError::Wrapped(CURVE_NAME, alloc::format!("{:?}", e).into()))?;
129 if signature.s().is_high().into() {
131 return Err(CodecError::Invalid(CURVE_NAME, "Signature S is high"));
132 }
133 Ok(Self { raw, signature })
134 }
135}
136
137impl FixedSize for Signature {
138 const SIZE: usize = SIGNATURE_LENGTH;
139}
140
141impl Span for Signature {}
142
143impl Array for Signature {}
144
145impl Hash for Signature {
146 fn hash<H: Hasher>(&self, state: &mut H) {
147 self.raw.hash(state);
148 }
149}
150
151impl Ord for Signature {
152 fn cmp(&self, other: &Self) -> core::cmp::Ordering {
153 self.raw.cmp(&other.raw)
154 }
155}
156
157impl PartialOrd for Signature {
158 fn partial_cmp(&self, other: &Self) -> Option<core::cmp::Ordering> {
159 Some(self.cmp(other))
160 }
161}
162
163impl AsRef<[u8]> for Signature {
164 fn as_ref(&self) -> &[u8] {
165 &self.raw
166 }
167}
168
169impl Deref for Signature {
170 type Target = [u8];
171 fn deref(&self) -> &[u8] {
172 &self.raw
173 }
174}
175
176impl TryFrom<p256::ecdsa::Signature> for Signature {
177 type Error = CodecError;
178
179 fn try_from(value: p256::ecdsa::Signature) -> Result<Self, Self::Error> {
180 let raw: [u8; _] = value.to_bytes().into();
181 Self::try_from(raw)
182 }
183}
184
185impl Debug for Signature {
186 fn fmt(&self, f: &mut core::fmt::Formatter<'_>) -> core::fmt::Result {
187 write!(f, "{}", Hex(&self.raw))
188 }
189}
190
191impl Display for Signature {
192 fn fmt(&self, f: &mut core::fmt::Formatter<'_>) -> core::fmt::Result {
193 write!(f, "{}", Hex(&self.raw))
194 }
195}
196
197#[cfg(feature = "arbitrary")]
198impl arbitrary::Arbitrary<'_> for Signature {
199 fn arbitrary(u: &mut arbitrary::Unstructured<'_>) -> arbitrary::Result<Self> {
200 use crate::Signer;
201 use commonware_math::algebra::Random;
202 use rand::{SeedableRng, rngs::StdRng};
203
204 let mut rand = StdRng::from_seed(u.arbitrary::<[u8; 32]>()?);
205 let private_key = PrivateKey(PrivateKeyInner::random(&mut rand));
206 let len = u.arbitrary::<usize>()? % 256;
207 let message = u
208 .arbitrary_iter()?
209 .take(len)
210 .collect::<Result<Vec<_>, _>>()?;
211
212 Ok(private_key.sign(&[], &message))
213 }
214}
215
216#[cfg(test)]
217mod tests {
218 use super::*;
219 use crate::{Signer as _, Verifier as _, secp256r1::common::tests::*};
220 use commonware_codec::{Copying, DecodeExt, Encode};
221 use p256::elliptic_curve::scalar::IsHigh;
222 use rstest::rstest;
223
224 const NAMESPACE: &[u8] = b"test-namespace";
225
226 #[test]
227 fn test_codec_private_key() {
228 let original = PrivateKey(create_private_key());
229 let encoded = original.encode();
230 assert_eq!(encoded.len(), PRIVATE_KEY_LENGTH);
231
232 let decoded = PrivateKey::decode(encoded).unwrap();
233 assert_eq!(original, decoded);
234 }
235
236 #[test]
237 fn test_codec_public_key() {
238 let private_key = PrivateKey(create_private_key());
239 let original = PublicKey::from(private_key);
240
241 let encoded = original.encode();
242 assert_eq!(encoded.len(), PUBLIC_KEY_LENGTH);
243
244 let decoded = PublicKey::decode(encoded).unwrap();
245 assert_eq!(original, decoded);
246 }
247
248 #[test]
249 fn test_codec_signature() {
250 let private_key = PrivateKey(create_private_key());
251 let original = private_key.sign(NAMESPACE, "Hello World".as_bytes());
252
253 let encoded = original.encode();
254 assert_eq!(encoded.len(), SIGNATURE_LENGTH);
255
256 let decoded = Signature::decode(encoded).unwrap();
257 assert_eq!(original, decoded);
258 }
259
260 #[test]
261 fn test_codec_signature_invalid() {
262 let (_, sig, ..) = vector_sig_verification_5();
263 let result = Signature::decode(sig);
264 assert!(result.is_err());
265 }
266
267 #[test]
268 fn test_scheme_sign() {
269 let private_key: PrivateKey = PrivateKey::decode(
270 commonware_formatting::from_hex(
271 "519b423d715f8b581f4fa8ee59f4771a5b44c8130b4e3eacca54a56dda72b464",
272 )
273 .unwrap(),
274 )
275 .unwrap();
276 let public_key: PublicKey = private_key.clone().into();
277 let message = commonware_formatting::from_hex(
278 "5905238877c77421f73e43ee3da6f2d9e2ccad5fc942dcec0cbd25482935faaf416983fe165b1a045e
279 e2bcd2e6dca3bdf46c4310a7461f9a37960ca672d3feb5473e253605fb1ddfd28065b53cb5858a8ad28175bf
280 9bd386a5e471ea7a65c17cc934a9d791e91491eb3754d03799790fe2d308d16146d5c9b0d0debd97d79ce8",
281 )
282 .unwrap();
283 let signature = private_key.sign(NAMESPACE, &message);
284 assert_eq!(SIGNATURE_LENGTH, signature.len());
285 assert!(public_key.verify(NAMESPACE, &message, &signature));
286 }
287
288 #[test]
289 fn test_decode_zero_signature_fails() {
290 let result = Signature::decode(vec![0u8; SIGNATURE_LENGTH]);
291 assert!(result.is_err());
292 }
293
294 #[test]
295 fn test_decode_high_s_signature_fails() {
296 let (inner, _) = vector_keypair_1();
297 let private_key = PrivateKey(inner);
298 let message = b"edge";
299 let signature = private_key.sign(NAMESPACE, message);
300 let mut bad_signature = signature.to_vec();
301 bad_signature[32] |= 0x80;
302 assert!(Signature::decode(bad_signature).is_err());
303 }
304
305 #[test]
306 fn test_decode_zero_r_signature_fails() {
307 let (inner, _) = vector_keypair_1();
308 let private_key = PrivateKey(inner);
309 let message = b"edge";
310 let signature = private_key.sign(NAMESPACE, message);
311 let mut bad_signature = signature.to_vec();
312 for b in bad_signature.iter_mut().take(32) {
313 *b = 0x00;
314 }
315 bad_signature[32] = 1;
316 assert!(Signature::decode(bad_signature).is_err());
317 }
318
319 #[test]
320 fn test_rfc6979() {
321 let private_key: PrivateKey = PrivateKey::decode(
322 commonware_formatting::from_hex(
323 "c9afa9d845ba75166b5c215767b1d6934e50c3db36e89b127b8a622b120f6721",
324 )
325 .unwrap(),
326 )
327 .unwrap();
328
329 let (message, exp_sig) = (
330 b"sample",
331 p256::ecdsa::Signature::from_slice(
332 &commonware_formatting::from_hex(
333 "efd48b2aacb6a8fd1140dd9cd45e81d69d2c877b56aaf991c34d0ea84eaf3716
334 f7cb1c942d657c41d436c7a1b6e29f65f3e900dbb9aff4064dc4ab2f843acda8",
335 )
336 .unwrap(),
337 )
338 .unwrap(),
339 );
340 let signature = private_key.sign_inner(None, message);
341 assert_eq!(signature.to_vec(), exp_sig.normalize_s().to_vec());
342
343 let (message, exp_sig) = (
344 b"test",
345 p256::ecdsa::Signature::from_slice(
346 &commonware_formatting::from_hex(
347 "f1abb023518351cd71d881567b1ea663ed3efcf6c5132b354f28d3b0b7d38367
348 019f4113742a2b14bd25926b49c649155f267e60d3814b4c0cc84250e46f0083",
349 )
350 .unwrap(),
351 )
352 .unwrap(),
353 );
354
355 let signature = private_key.sign_inner(None, message);
356 assert_eq!(signature.to_vec(), exp_sig.to_vec());
357 }
358
359 #[test]
360 fn test_scheme_validate_public_key_too_long() {
361 let qx_hex = "d0720dc691aa80096ba32fed1cb97c2b620690d06de0317b8618d5ce65eb728f";
362 let qy_hex = "d0720dc691aa80096ba32fed1cb97c2b620690d06de0317b8618d5ce65eb728f";
363
364 let uncompressed_public_key = parse_public_key_as_uncompressed_vector(qx_hex, qy_hex);
365 let public_key = PublicKey::decode(uncompressed_public_key);
366 assert!(matches!(public_key, Err(CodecError::Invalid(_, _))));
367
368 let mut compressed_public_key = parse_public_key_as_compressed_vector(qx_hex, qy_hex);
369 compressed_public_key.push(0u8);
370 let public_key = PublicKey::decode(compressed_public_key);
371 assert!(matches!(public_key, Err(CodecError::ExtraData(1))));
372
373 let compressed_public_key = parse_public_key_as_compressed_vector(qx_hex, qy_hex);
374 let public_key = PublicKey::decode(compressed_public_key);
375 assert!(public_key.is_ok());
376 }
377
378 #[test]
379 fn test_scheme_verify_signature_r0() {
380 let private_key: PrivateKey = PrivateKey::decode(
381 commonware_formatting::from_hex(
382 "c9806898a0334916c860748880a541f093b579a9b1f32934d86c363c39800357",
383 )
384 .unwrap(),
385 )
386 .unwrap();
387 let message = b"sample";
388 let signature = private_key.sign_inner(None, message);
389 let (_, s) = signature.split_at(32);
390 let mut signature: Vec<u8> = vec![0x00; 32];
391 signature.extend_from_slice(s);
392
393 assert!(Signature::decode(signature).is_err());
394 }
395
396 #[test]
397 fn test_scheme_verify_signature_s0() {
398 let private_key: PrivateKey = PrivateKey::decode(
399 commonware_formatting::from_hex(
400 "c9806898a0334916c860748880a541f093b579a9b1f32934d86c363c39800357",
401 )
402 .unwrap(),
403 )
404 .unwrap();
405 let message = b"sample";
406 let signature = private_key.sign_inner(None, message);
407 let (r, _) = signature.split_at(32);
408 let s: Vec<u8> = vec![0x00; 32];
409 let mut signature = r.to_vec();
410 signature.extend(s);
411
412 assert!(Signature::decode(signature).is_err());
413 }
414
415 #[rstest]
416 #[case(vector_keypair_1())]
417 #[case(vector_keypair_2())]
418 #[case(vector_keypair_3())]
419 #[case(vector_keypair_4())]
420 #[case(vector_keypair_5())]
421 #[case(vector_keypair_6())]
422 #[case(vector_keypair_7())]
423 #[case(vector_keypair_8())]
424 #[case(vector_keypair_9())]
425 #[case(vector_keypair_10())]
426 fn test_keypairs(#[case] (inner_priv, inner_pub): (PrivateKeyInner, PublicKeyInner)) {
427 let private_key = PrivateKey(inner_priv);
428 let public_key = PublicKey::from(private_key);
429 let exp_public_key = PublicKey(inner_pub);
430 assert_eq!(exp_public_key, public_key);
431 assert!(public_key.len() == PUBLIC_KEY_LENGTH);
432 }
433
434 #[rstest]
435 #[case(1, vector_public_key_validation_1())]
436 #[case(3, vector_public_key_validation_3())]
437 #[case(4, vector_public_key_validation_4())]
438 #[case(5, vector_public_key_validation_5())]
439 #[case(6, vector_public_key_validation_6())]
440 #[case(7, vector_public_key_validation_7())]
441 #[case(8, vector_public_key_validation_8())]
442 #[case(9, vector_public_key_validation_9())]
443 #[case(10, vector_public_key_validation_10())]
444 #[case(12, vector_public_key_validation_12())]
445 fn test_public_key_validation(
446 #[case] n: usize,
447 #[case] (public_key, exp_valid): (Vec<u8>, bool),
448 ) {
449 let res = PublicKey::decode(public_key);
450 assert_eq!(exp_valid, res.is_ok(), "vector_public_key_validation_{n}");
451 }
452
453 fn vector_sig_verification_1() -> (PublicKey, Vec<u8>, Vec<u8>, bool) {
454 let (public_key, sig, message, expected) = vector_sig_verification_1_raw();
455 (PublicKey(public_key), sig.to_vec(), message, expected)
456 }
457
458 fn vector_sig_verification_2() -> (PublicKey, Vec<u8>, Vec<u8>, bool) {
459 let (public_key, sig, message, expected) = vector_sig_verification_2_raw();
460 (PublicKey(public_key), sig.to_vec(), message, expected)
461 }
462
463 fn vector_sig_verification_3() -> (PublicKey, Vec<u8>, Vec<u8>, bool) {
464 let (public_key, sig, message, expected) = vector_sig_verification_3_raw();
465 (PublicKey(public_key), sig.to_vec(), message, expected)
466 }
467
468 fn vector_sig_verification_4() -> (PublicKey, Vec<u8>, Vec<u8>, bool) {
469 let (public_key, sig, message, expected) = vector_sig_verification_4_raw();
470 (PublicKey(public_key), sig.to_vec(), message, expected)
471 }
472
473 fn vector_sig_verification_5() -> (PublicKey, Vec<u8>, Vec<u8>, bool) {
474 let (public_key, sig, message, expected) = vector_sig_verification_5_raw();
475 (PublicKey(public_key), sig.to_vec(), message, expected)
476 }
477
478 fn vector_sig_verification_6() -> (PublicKey, Vec<u8>, Vec<u8>, bool) {
479 let (public_key, sig, message, expected) = vector_sig_verification_6_raw();
480 (PublicKey(public_key), sig.to_vec(), message, expected)
481 }
482
483 fn vector_sig_verification_7() -> (PublicKey, Vec<u8>, Vec<u8>, bool) {
484 let (public_key, sig, message, expected) = vector_sig_verification_7_raw();
485 (PublicKey(public_key), sig.to_vec(), message, expected)
486 }
487
488 fn vector_sig_verification_8() -> (PublicKey, Vec<u8>, Vec<u8>, bool) {
489 let (public_key, sig, message, expected) = vector_sig_verification_8_raw();
490 (PublicKey(public_key), sig.to_vec(), message, expected)
491 }
492
493 fn vector_sig_verification_9() -> (PublicKey, Vec<u8>, Vec<u8>, bool) {
494 let (public_key, sig, message, expected) = vector_sig_verification_9_raw();
495 (PublicKey(public_key), sig.to_vec(), message, expected)
496 }
497
498 fn vector_sig_verification_10() -> (PublicKey, Vec<u8>, Vec<u8>, bool) {
499 let (public_key, sig, message, expected) = vector_sig_verification_10_raw();
500 (PublicKey(public_key), sig.to_vec(), message, expected)
501 }
502
503 fn vector_sig_verification_11() -> (PublicKey, Vec<u8>, Vec<u8>, bool) {
504 let (public_key, sig, message, expected) = vector_sig_verification_11_raw();
505 (PublicKey(public_key), sig.to_vec(), message, expected)
506 }
507
508 fn vector_sig_verification_12() -> (PublicKey, Vec<u8>, Vec<u8>, bool) {
509 let (public_key, sig, message, expected) = vector_sig_verification_12_raw();
510 (PublicKey(public_key), sig.to_vec(), message, expected)
511 }
512
513 fn vector_sig_verification_13() -> (PublicKey, Vec<u8>, Vec<u8>, bool) {
514 let (public_key, sig, message, expected) = vector_sig_verification_13_raw();
515 (PublicKey(public_key), sig.to_vec(), message, expected)
516 }
517
518 fn vector_sig_verification_14() -> (PublicKey, Vec<u8>, Vec<u8>, bool) {
519 let (public_key, sig, message, expected) = vector_sig_verification_14_raw();
520 (PublicKey(public_key), sig.to_vec(), message, expected)
521 }
522
523 fn vector_sig_verification_15() -> (PublicKey, Vec<u8>, Vec<u8>, bool) {
524 let (public_key, sig, message, expected) = vector_sig_verification_15_raw();
525 (PublicKey(public_key), sig.to_vec(), message, expected)
526 }
527
528 #[rstest]
529 #[case(vector_sig_verification_1())]
530 #[case(vector_sig_verification_2())]
531 #[case(vector_sig_verification_3())]
532 #[case(vector_sig_verification_4())]
533 #[case(vector_sig_verification_5())]
534 #[case(vector_sig_verification_6())]
535 #[case(vector_sig_verification_7())]
536 #[case(vector_sig_verification_8())]
537 #[case(vector_sig_verification_9())]
538 #[case(vector_sig_verification_10())]
539 #[case(vector_sig_verification_11())]
540 #[case(vector_sig_verification_12())]
541 #[case(vector_sig_verification_13())]
542 #[case(vector_sig_verification_14())]
543 #[case(vector_sig_verification_15())]
544 fn test_signature_verification(
545 #[case] (public_key, sig, message, expected): (PublicKey, Vec<u8>, Vec<u8>, bool),
546 ) {
547 let expected = if expected {
548 let mut ecdsa_signature = p256::ecdsa::Signature::from_slice(&sig).unwrap();
549 if ecdsa_signature.s().is_high().into() {
550 assert!(Signature::decode(Copying(&sig)).is_err());
551 assert!(Signature::decode(sig).is_err());
552
553 ecdsa_signature = ecdsa_signature.normalize_s();
554 }
555 let signature = Signature::try_from(ecdsa_signature).unwrap();
556 public_key.verify_inner(None, &message, &signature)
557 } else {
558 let tf_res = Signature::decode(Copying(&sig));
559 let dc_res = Signature::decode(sig);
560 if tf_res.is_err() && dc_res.is_err() {
561 true
562 } else {
563 let f1 = !public_key.verify_inner(None, &message, &tf_res.unwrap());
564 let f2 = !public_key.verify_inner(None, &message, &dc_res.unwrap());
565 f1 && f2
566 }
567 };
568 assert!(expected);
569 }
570
571 #[cfg(feature = "arbitrary")]
572 mod conformance {
573 use super::*;
574 use commonware_codec::conformance::CodecConformance;
575
576 commonware_conformance::conformance_tests! {
577 CodecConformance<Signature> => 1024,
578 }
579 }
580}