1use anyhow::Result;
57use ecdsa::signature::Signer;
58use elliptic_curve::JwkEcKey;
59use elliptic_curve::sec1::ToEncodedPoint;
60
61use crate::errors::KeyError;
62
63#[cfg(feature = "zeroize")]
64use zeroize::{Zeroize, ZeroizeOnDrop};
65
66#[derive(Clone, PartialEq)]
68#[cfg_attr(debug_assertions, derive(Debug))]
69#[cfg_attr(feature = "zeroize", derive(Zeroize, ZeroizeOnDrop))]
70pub enum KeyType {
71 P256Public,
74
75 P256Private,
78
79 P384Public,
82
83 P384Private,
86
87 K256Public,
90
91 K256Private,
94}
95
96impl std::fmt::Display for KeyType {
97 fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
98 match self {
99 KeyType::P256Public => write!(f, "P256Public"),
100 KeyType::P256Private => write!(f, "P256Private"),
101 KeyType::P384Public => write!(f, "P384Public"),
102 KeyType::P384Private => write!(f, "P384Private"),
103 KeyType::K256Public => write!(f, "K256Public"),
104 KeyType::K256Private => write!(f, "K256Private"),
105 }
106 }
107}
108
109#[derive(Clone)]
121#[cfg_attr(feature = "zeroize", derive(zeroize::Zeroize, zeroize::ZeroizeOnDrop))]
122pub struct KeyData(pub KeyType, pub Vec<u8>);
123
124impl KeyData {
125 pub fn new(key_type: KeyType, bytes: Vec<u8>) -> Self {
127 KeyData(key_type, bytes)
128 }
129
130 pub fn key_type(&self) -> &KeyType {
132 &self.0
133 }
134
135 pub fn bytes(&self) -> &[u8] {
137 &self.1
138 }
139
140 pub fn into_parts(self) -> (KeyType, Vec<u8>) {
142 (self.0.clone(), self.1.clone())
143 }
144}
145
146impl std::fmt::Display for KeyData {
147 fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
148 let prefix = match self.key_type() {
150 KeyType::P256Private => [0x86, 0x26],
151 KeyType::P256Public => [0x80, 0x24],
152 KeyType::P384Private => [0x13, 0x01],
153 KeyType::P384Public => [0x12, 0x00],
154 KeyType::K256Private => [0x81, 0x26],
155 KeyType::K256Public => [0xe7, 0x01],
156 };
157
158 let mut multicodec_bytes = Vec::with_capacity(2 + self.bytes().len());
160 multicodec_bytes.extend_from_slice(&prefix);
161 multicodec_bytes.extend_from_slice(self.bytes());
162
163 let multibase_encoded = multibase::encode(multibase::Base::Base58Btc, &multicodec_bytes);
165
166 write!(f, "did:key:{}", multibase_encoded)
168 }
169}
170
171#[async_trait::async_trait]
176pub trait KeyProvider: Send + Sync {
177 async fn get_private_key_by_id(&self, key_id: &str) -> Result<Option<KeyData>>;
187}
188
189const DID_METHOD_KEY_PREFIX: &str = "did:key:";
191
192pub fn did_method_key_value(key: &str) -> &str {
196 match key.strip_prefix(DID_METHOD_KEY_PREFIX) {
197 Some(value) => value,
198 None => key,
199 }
200}
201
202pub fn identify_key(key: &str) -> Result<KeyData, KeyError> {
206 let stripped_key = did_method_key_value(key);
207 let (_, decoded_multibase_key) =
208 multibase::decode(stripped_key).map_err(|error| KeyError::DecodeError { error })?;
209
210 if decoded_multibase_key.len() < 3 {
211 return Err(KeyError::UnidentifiedKeyType);
212 }
213
214 match &decoded_multibase_key[..2] {
226 [0x86, 0x26] => Ok(KeyData::new(
228 KeyType::P256Private,
229 decoded_multibase_key[2..].to_vec(),
230 )),
231
232 [0x80, 0x24] => Ok(KeyData::new(
234 KeyType::P256Public,
235 decoded_multibase_key[2..].to_vec(),
236 )),
237
238 [0x13, 0x01] => Ok(KeyData::new(
240 KeyType::P384Private,
241 decoded_multibase_key[2..].to_vec(),
242 )),
243
244 [0x12, 0x00] => Ok(KeyData::new(
246 KeyType::P384Public,
247 decoded_multibase_key[2..].to_vec(),
248 )),
249
250 [0x81, 0x26] => Ok(KeyData::new(
252 KeyType::K256Private,
253 decoded_multibase_key[2..].to_vec(),
254 )),
255
256 [0xe7, 0x01] => Ok(KeyData::new(
258 KeyType::K256Public,
259 decoded_multibase_key[2..].to_vec(),
260 )),
261
262 _ => Err(KeyError::InvalidMultibaseKeyType {
263 prefix: decoded_multibase_key[..2].to_vec(),
264 }),
265 }
266}
267
268pub fn validate(key_data: &KeyData, signature: &[u8], content: &[u8]) -> Result<(), KeyError> {
272 match *key_data.key_type() {
273 KeyType::P256Public => {
274 let signature = ecdsa::Signature::from_slice(signature)
275 .map_err(|error| KeyError::SignatureError { error })?;
276 let verifying_key = p256::ecdsa::VerifyingKey::from_sec1_bytes(key_data.bytes())
277 .map_err(|error| KeyError::P256Error { error })?;
278 ecdsa::signature::Verifier::verify(&verifying_key, content, &signature)
279 .map_err(|error| KeyError::ECDSAError { error })
280 }
281 KeyType::P384Public => {
282 let signature = ecdsa::Signature::from_slice(signature)
283 .map_err(|error| KeyError::SignatureError { error })?;
284 let verifying_key = p384::ecdsa::VerifyingKey::from_sec1_bytes(key_data.bytes())
285 .map_err(|error| KeyError::P384Error { error })?;
286 ecdsa::signature::Verifier::verify(&verifying_key, content, &signature)
287 .map_err(|error| KeyError::ECDSAError { error })
288 }
289 KeyType::K256Public => {
290 let signature = ecdsa::Signature::from_slice(signature)
291 .map_err(|error| KeyError::SignatureError { error })?;
292 let verifying_key = k256::ecdsa::VerifyingKey::from_sec1_bytes(key_data.bytes())
293 .map_err(|error| KeyError::K256Error { error })?;
294 ecdsa::signature::Verifier::verify(&verifying_key, content, &signature)
295 .map_err(|error| KeyError::ECDSAError { error })
296 }
297 KeyType::P256Private => {
298 let signature = ecdsa::Signature::from_slice(signature)
299 .map_err(|error| KeyError::SignatureError { error })?;
300 let secret_key: p256::SecretKey =
301 ecdsa::elliptic_curve::SecretKey::from_slice(key_data.bytes())
302 .map_err(|error| KeyError::SecretKeyError { error })?;
303 let public_key = secret_key.public_key();
304 let verifying_key = p256::ecdsa::VerifyingKey::from(public_key);
305 ecdsa::signature::Verifier::verify(&verifying_key, content, &signature)
306 .map_err(|error| KeyError::ECDSAError { error })
307 }
308 KeyType::P384Private => {
309 let signature = ecdsa::Signature::from_slice(signature)
310 .map_err(|error| KeyError::SignatureError { error })?;
311 let secret_key: p384::SecretKey =
312 ecdsa::elliptic_curve::SecretKey::from_slice(key_data.bytes())
313 .map_err(|error| KeyError::SecretKeyError { error })?;
314 let public_key = secret_key.public_key();
315 let verifying_key = p384::ecdsa::VerifyingKey::from(public_key);
316 ecdsa::signature::Verifier::verify(&verifying_key, content, &signature)
317 .map_err(|error| KeyError::ECDSAError { error })
318 }
319 KeyType::K256Private => {
320 let signature = ecdsa::Signature::from_slice(signature)
321 .map_err(|error| KeyError::SignatureError { error })?;
322 let secret_key: k256::SecretKey =
323 ecdsa::elliptic_curve::SecretKey::from_slice(key_data.bytes())
324 .map_err(|error| KeyError::SecretKeyError { error })?;
325 let public_key = secret_key.public_key();
326 let verifying_key = k256::ecdsa::VerifyingKey::from(public_key);
327 ecdsa::signature::Verifier::verify(&verifying_key, content, &signature)
328 .map_err(|error| KeyError::ECDSAError { error })
329 }
330 }
331}
332
333pub fn sign(key_data: &KeyData, content: &[u8]) -> Result<Vec<u8>, KeyError> {
337 match *key_data.key_type() {
338 KeyType::K256Public | KeyType::P256Public | KeyType::P384Public => {
339 Err(KeyError::PrivateKeyRequiredForSignature)
340 }
341 KeyType::P256Private => {
342 let secret_key: p256::SecretKey =
343 ecdsa::elliptic_curve::SecretKey::from_slice(key_data.bytes())
344 .map_err(|error| KeyError::SecretKeyError { error })?;
345 let signing_key: p256::ecdsa::SigningKey = p256::ecdsa::SigningKey::from(secret_key);
346 let signature: p256::ecdsa::Signature = signing_key
347 .try_sign(content)
348 .map_err(|error| KeyError::ECDSAError { error })?;
349 Ok(signature.to_vec())
350 }
351 KeyType::P384Private => {
352 let secret_key: p384::SecretKey =
353 ecdsa::elliptic_curve::SecretKey::from_slice(key_data.bytes())
354 .map_err(|error| KeyError::SecretKeyError { error })?;
355 let signing_key: p384::ecdsa::SigningKey = p384::ecdsa::SigningKey::from(secret_key);
356 let signature: p384::ecdsa::Signature = signing_key
357 .try_sign(content)
358 .map_err(|error| KeyError::ECDSAError { error })?;
359 Ok(signature.to_vec())
360 }
361 KeyType::K256Private => {
362 let secret_key: k256::SecretKey =
363 ecdsa::elliptic_curve::SecretKey::from_slice(key_data.bytes())
364 .map_err(|error| KeyError::SecretKeyError { error })?;
365 let signing_key: k256::ecdsa::SigningKey = k256::ecdsa::SigningKey::from(secret_key);
366 let signature: k256::ecdsa::Signature = signing_key
367 .try_sign(content)
368 .map_err(|error| KeyError::ECDSAError { error })?;
369 Ok(signature.to_vec())
370 }
371 }
372}
373
374impl TryInto<JwkEcKey> for &KeyData {
375 type Error = KeyError;
376
377 fn try_into(self) -> Result<JwkEcKey, Self::Error> {
378 match *self.key_type() {
379 KeyType::P256Public => {
380 let public_key = p256::PublicKey::from_sec1_bytes(self.bytes()).map_err(|e| {
381 KeyError::JWKConversionFailed {
382 error: format!("Failed to parse P256 public key: {}", e),
383 }
384 })?;
385 Ok(public_key.to_jwk())
386 }
387 KeyType::P256Private => {
388 let secret_key = p256::SecretKey::from_slice(self.bytes())
389 .map_err(|error| KeyError::SecretKeyError { error })?;
390 Ok(secret_key.to_jwk())
391 }
392 KeyType::P384Public => {
393 let public_key = p384::PublicKey::from_sec1_bytes(self.bytes()).map_err(|e| {
394 KeyError::JWKConversionFailed {
395 error: format!("Failed to parse P384 public key: {}", e),
396 }
397 })?;
398 Ok(public_key.to_jwk())
399 }
400 KeyType::P384Private => {
401 let secret_key = p384::SecretKey::from_slice(self.bytes())
402 .map_err(|error| KeyError::SecretKeyError { error })?;
403 Ok(secret_key.to_jwk())
404 }
405 KeyType::K256Public => {
406 let public_key = k256::PublicKey::from_sec1_bytes(self.bytes()).map_err(|e| {
407 KeyError::JWKConversionFailed {
408 error: format!("Failed to parse k256 public key: {}", e),
409 }
410 })?;
411 Ok(public_key.to_jwk())
412 }
413 KeyType::K256Private => {
414 let secret_key = k256::SecretKey::from_slice(self.bytes())
415 .map_err(|error| KeyError::SecretKeyError { error })?;
416 Ok(secret_key.to_jwk())
417 }
418 }
419 }
420}
421
422pub fn generate_key(key_type: KeyType) -> Result<KeyData, KeyError> {
443 match key_type {
444 KeyType::P256Private => {
445 let secret_key = p256::SecretKey::random(&mut rand::thread_rng());
446 Ok(KeyData::new(
447 KeyType::P256Private,
448 secret_key.to_bytes().to_vec(),
449 ))
450 }
451 KeyType::P384Private => {
452 let secret_key = p384::SecretKey::random(&mut rand::thread_rng());
453 Ok(KeyData::new(
454 KeyType::P384Private,
455 secret_key.to_bytes().to_vec(),
456 ))
457 }
458 KeyType::K256Private => {
459 let secret_key = k256::SecretKey::random(&mut rand::thread_rng());
460 Ok(KeyData::new(
461 KeyType::K256Private,
462 secret_key.to_bytes().to_vec(),
463 ))
464 }
465 KeyType::P256Public => Err(KeyError::PublicKeyGenerationNotSupported),
466 KeyType::P384Public => Err(KeyError::PublicKeyGenerationNotSupported),
467 KeyType::K256Public => Err(KeyError::PublicKeyGenerationNotSupported),
468 }
469}
470
471pub fn to_public(key_data: &KeyData) -> Result<KeyData, KeyError> {
496 match key_data.key_type() {
497 KeyType::P256Private => {
498 let secret_key: p256::SecretKey =
499 ecdsa::elliptic_curve::SecretKey::from_slice(key_data.bytes())
500 .map_err(|error| KeyError::SecretKeyError { error })?;
501 let public_key = secret_key.public_key();
502 let compressed = public_key.to_encoded_point(true);
503 let public_key_bytes = compressed.to_bytes();
504 Ok(KeyData::new(KeyType::P256Public, public_key_bytes.to_vec()))
505 }
506 KeyType::P384Private => {
507 let secret_key: p384::SecretKey =
508 ecdsa::elliptic_curve::SecretKey::from_slice(key_data.bytes())
509 .map_err(|error| KeyError::SecretKeyError { error })?;
510 let public_key = secret_key.public_key();
511 let compressed = public_key.to_encoded_point(true);
512 let public_key_bytes = compressed.to_bytes();
513 Ok(KeyData::new(KeyType::P384Public, public_key_bytes.to_vec()))
514 }
515 KeyType::K256Private => {
516 let secret_key: k256::SecretKey =
517 ecdsa::elliptic_curve::SecretKey::from_slice(key_data.bytes())
518 .map_err(|error| KeyError::SecretKeyError { error })?;
519 let public_key = secret_key.public_key();
520 let public_key_bytes = public_key.to_sec1_bytes();
521 Ok(KeyData::new(KeyType::K256Public, public_key_bytes.to_vec()))
522 }
523 KeyType::P256Public | KeyType::P384Public | KeyType::K256Public => {
524 Ok(key_data.clone())
526 }
527 }
528}
529
530#[cfg(test)]
531mod tests {
532 use super::*;
533
534 #[test]
535 fn test_identify_key() {
536 for _ in 0..4 {
538 let result = identify_key("z3vLVqpQveB3w8G6MQsLVseJ1Z2E1JyQzUj6WgRYNNwB9jdE");
539 assert!(result.is_ok());
540 let key_data = result.unwrap();
541 assert_eq!(*key_data.key_type(), KeyType::K256Private);
542 }
543
544 assert!(matches!(
546 identify_key("asdasdasd"),
547 Err(KeyError::DecodeError { .. })
548 ));
549
550 assert!(matches!(
552 identify_key("z4vLVqpQveB3w8G6MQsLVseJ1Z2E1JyQzUj6WgRYNNwB9jdE"),
553 Err(KeyError::InvalidMultibaseKeyType { .. })
554 ));
555 }
556
557 #[test]
558 fn test_sign_p256() -> Result<()> {
559 let private_key = "did:key:z42tnbHmmnhF11nwSnp5kQJbcZQw2Vbw5WF3ABDSxPtDgU2o";
560 let public_key = "did:key:zDnaeXduWbJ1b1Kgjf3uCdCpMDF1LEDizUiyxAxGwerou3Nh2";
561
562 let private_key_data = identify_key(private_key);
563 assert!(private_key_data.is_ok());
564 let private_key_data = private_key_data.unwrap();
565 assert_eq!(*private_key_data.key_type(), KeyType::P256Private);
566
567 let public_key_data = identify_key(public_key);
568 assert!(public_key_data.is_ok());
569 let public_key_data = public_key_data.unwrap();
570 assert_eq!(*public_key_data.key_type(), KeyType::P256Public);
571
572 let content = "hello world".as_bytes();
573
574 let signature = sign(&private_key_data, content);
575 assert!(signature.is_ok());
576 let signature = signature.unwrap();
577
578 {
579 let validation = validate(&public_key_data, &signature, content);
580 assert!(validation.is_ok());
581 }
582 {
583 let validation = validate(&private_key_data, &signature, content);
584 assert!(validation.is_ok());
585 }
586 Ok(())
587 }
588
589 #[test]
590 fn test_sign_k256() -> Result<()> {
591 let private_key = "did:key:z3vLY4nbXy2rV4Qr65gUtfnSF3A8Be7gmYzUiCX6eo2PR1Rt";
592 let public_key = "did:key:zQ3shNzMp4oaaQ1gQRzCxMGXFrSW3NEM1M9T6KCY9eA7HhyEA";
593
594 let private_key_data = identify_key(private_key);
595 assert!(private_key_data.is_ok());
596 let private_key_data = private_key_data.unwrap();
597 assert_eq!(*private_key_data.key_type(), KeyType::K256Private);
598
599 let public_key_data = identify_key(public_key);
600 assert!(public_key_data.is_ok());
601 let public_key_data = public_key_data.unwrap();
602 assert_eq!(*public_key_data.key_type(), KeyType::K256Public);
603
604 let content = "hello world".as_bytes();
605
606 let signature = sign(&private_key_data, content);
607 assert!(signature.is_ok());
608 let signature = signature.unwrap();
609
610 {
611 let validation = validate(&public_key_data, &signature, content);
612 assert!(validation.is_ok());
613 }
614 {
615 let validation = validate(&private_key_data, &signature, content);
616 assert!(validation.is_ok());
617 }
618 Ok(())
619 }
620
621 #[test]
622 fn test_to_jwk_p256() -> Result<()> {
623 let private_key = "did:key:z42tnbHmmnhF11nwSnp5kQJbcZQw2Vbw5WF3ABDSxPtDgU2o";
624 let public_key = "did:key:zDnaeXduWbJ1b1Kgjf3uCdCpMDF1LEDizUiyxAxGwerou3Nh2";
625
626 let private_key_data = identify_key(private_key);
627 assert!(private_key_data.is_ok());
628 let private_key_data = private_key_data.unwrap();
629 assert_eq!(*private_key_data.key_type(), KeyType::P256Private);
630
631 let public_key_data = identify_key(public_key);
632 assert!(public_key_data.is_ok());
633 let public_key_data = public_key_data.unwrap();
634 assert_eq!(*public_key_data.key_type(), KeyType::P256Public);
635
636 let private_jwk: Result<elliptic_curve::JwkEcKey, _> = (&private_key_data).try_into();
638 assert!(private_jwk.is_ok());
639
640 let public_jwk: Result<elliptic_curve::JwkEcKey, _> = (&public_key_data).try_into();
642 assert!(public_jwk.is_ok());
643
644 Ok(())
645 }
646
647 #[test]
648 fn test_to_jwk_k256_supported() -> Result<()> {
649 let private_key = "did:key:z3vLY4nbXy2rV4Qr65gUtfnSF3A8Be7gmYzUiCX6eo2PR1Rt";
650 let public_key = "did:key:zQ3shNzMp4oaaQ1gQRzCxMGXFrSW3NEM1M9T6KCY9eA7HhyEA";
651
652 let private_key_data = identify_key(private_key);
653 assert!(private_key_data.is_ok());
654 let private_key_data = private_key_data.unwrap();
655 assert_eq!(*private_key_data.key_type(), KeyType::K256Private);
656
657 let public_key_data = identify_key(public_key);
658 assert!(public_key_data.is_ok());
659 let public_key_data = public_key_data.unwrap();
660 assert_eq!(*public_key_data.key_type(), KeyType::K256Public);
661
662 let private_jwk: Result<elliptic_curve::JwkEcKey, _> = (&private_key_data).try_into();
664 assert!(private_jwk.is_ok());
665 let private_jwk = private_jwk.unwrap();
666 assert_eq!(private_jwk.crv(), "secp256k1");
667
668 let public_jwk: Result<elliptic_curve::JwkEcKey, _> = (&public_key_data).try_into();
669 assert!(public_jwk.is_ok());
670 let public_jwk = public_jwk.unwrap();
671 assert_eq!(public_jwk.crv(), "secp256k1");
672
673 Ok(())
674 }
675
676 #[test]
677 fn test_try_into_jwk_keydata() -> Result<()> {
678 let private_key = "did:key:z42tnbHmmnhF11nwSnp5kQJbcZQw2Vbw5WF3ABDSxPtDgU2o";
679 let public_key = "did:key:zDnaeXduWbJ1b1Kgjf3uCdCpMDF1LEDizUiyxAxGwerou3Nh2";
680
681 let private_key_data = identify_key(private_key);
682 assert!(private_key_data.is_ok());
683 let private_key_data = private_key_data.unwrap();
684 assert_eq!(*private_key_data.key_type(), KeyType::P256Private);
685
686 let public_key_data = identify_key(public_key);
687 assert!(public_key_data.is_ok());
688 let public_key_data = public_key_data.unwrap();
689 assert_eq!(*public_key_data.key_type(), KeyType::P256Public);
690
691 let private_jwk: Result<JwkEcKey, KeyError> = (&private_key_data).try_into();
693 assert!(private_jwk.is_ok());
694
695 let public_jwk: Result<JwkEcKey, KeyError> = (&public_key_data).try_into();
696 assert!(public_jwk.is_ok());
697
698 Ok(())
699 }
700
701 #[test]
702 fn test_generate_key_p256_private() -> Result<()> {
703 let key_data = generate_key(KeyType::P256Private)?;
704 assert_eq!(*key_data.key_type(), KeyType::P256Private);
705 assert_eq!(key_data.bytes().len(), 32); let content = "test content".as_bytes();
709 let signature = sign(&key_data, content)?;
710 let validation = validate(&key_data, &signature, content);
711 assert!(validation.is_ok());
712
713 Ok(())
714 }
715
716 #[test]
717 fn test_generate_key_k256_private() -> Result<()> {
718 let key_data = generate_key(KeyType::K256Private)?;
719 assert_eq!(*key_data.key_type(), KeyType::K256Private);
720 assert_eq!(key_data.bytes().len(), 32); let content = "test content".as_bytes();
724 let signature = sign(&key_data, content)?;
725 let validation = validate(&key_data, &signature, content);
726 assert!(validation.is_ok());
727
728 Ok(())
729 }
730
731 #[test]
732 fn test_generate_key_public_not_supported() {
733 let result = generate_key(KeyType::P256Public);
734 assert!(matches!(
735 result,
736 Err(KeyError::PublicKeyGenerationNotSupported)
737 ));
738
739 let result = generate_key(KeyType::K256Public);
740 assert!(matches!(
741 result,
742 Err(KeyError::PublicKeyGenerationNotSupported)
743 ));
744 }
745
746 #[test]
747 fn test_generate_key_uniqueness() -> Result<()> {
748 let key1 = generate_key(KeyType::P256Private)?;
750 let key2 = generate_key(KeyType::P256Private)?;
751 assert_ne!(key1.bytes(), key2.bytes());
752
753 let key3 = generate_key(KeyType::K256Private)?;
754 let key4 = generate_key(KeyType::K256Private)?;
755 assert_ne!(key3.bytes(), key4.bytes());
756
757 Ok(())
758 }
759
760 #[test]
761 fn test_keydata_display_p256_private() -> Result<()> {
762 let original_key = generate_key(KeyType::P256Private)?;
764
765 let key_string = format!("{}", original_key);
767
768 assert!(key_string.starts_with("did:key:"));
770
771 let parsed_key = identify_key(&key_string)?;
773
774 assert_eq!(original_key.key_type(), parsed_key.key_type());
776
777 assert_eq!(original_key.bytes(), parsed_key.bytes());
779
780 let content = "test message for p256".as_bytes();
782
783 let signature = sign(&original_key, content)?;
785
786 validate(&original_key, &signature, content)?;
788
789 validate(&parsed_key, &signature, content)?;
791
792 let signature2 = sign(&parsed_key, content)?;
794
795 validate(&original_key, &signature2, content)?;
798 validate(&parsed_key, &signature2, content)?;
799
800 Ok(())
801 }
802
803 #[test]
804 fn test_keydata_display_k256_private() -> Result<()> {
805 let original_key = generate_key(KeyType::K256Private)?;
807
808 let key_string = format!("{}", original_key);
810
811 assert!(key_string.starts_with("did:key:"));
813
814 let parsed_key = identify_key(&key_string)?;
816
817 assert_eq!(original_key.key_type(), parsed_key.key_type());
819
820 assert_eq!(original_key.bytes(), parsed_key.bytes());
822
823 let content = "test message for k256".as_bytes();
825
826 let signature = sign(&original_key, content)?;
828
829 validate(&original_key, &signature, content)?;
831
832 validate(&parsed_key, &signature, content)?;
834
835 let signature2 = sign(&parsed_key, content)?;
837
838 validate(&original_key, &signature2, content)?;
840 validate(&parsed_key, &signature2, content)?;
841
842 Ok(())
843 }
844
845 #[test]
846 fn test_keydata_display_existing_keys() -> Result<()> {
847 let p256_private_key = "did:key:z42tnbHmmnhF11nwSnp5kQJbcZQw2Vbw5WF3ABDSxPtDgU2o";
849 let k256_private_key = "did:key:z3vLY4nbXy2rV4Qr65gUtfnSF3A8Be7gmYzUiCX6eo2PR1Rt";
850
851 let parsed_p256 = identify_key(p256_private_key)?;
853 let reserialized_p256 = format!("{}", parsed_p256);
854 assert_eq!(p256_private_key, reserialized_p256);
855
856 let parsed_k256 = identify_key(k256_private_key)?;
858 let reserialized_k256 = format!("{}", parsed_k256);
859 assert_eq!(k256_private_key, reserialized_k256);
860
861 Ok(())
862 }
863
864 #[test]
865 fn test_keydata_display_cross_verification() -> Result<()> {
866 let p256_key = generate_key(KeyType::P256Private)?;
868 let k256_key = generate_key(KeyType::K256Private)?;
869
870 let p256_string = format!("{}", p256_key);
872 let k256_string = format!("{}", k256_key);
873
874 assert_ne!(p256_string, k256_string);
876
877 let parsed_p256 = identify_key(&p256_string)?;
879 let parsed_k256 = identify_key(&k256_string)?;
880
881 assert_eq!(*parsed_p256.key_type(), KeyType::P256Private);
883 assert_eq!(*parsed_k256.key_type(), KeyType::K256Private);
884
885 let content = "cross verification test".as_bytes();
887
888 let p256_signature = sign(&p256_key, content)?;
890
891 let k256_signature = sign(&k256_key, content)?;
893
894 assert!(validate(&p256_key, &p256_signature, content).is_ok());
896 assert!(validate(&parsed_p256, &p256_signature, content).is_ok());
897
898 assert!(validate(&k256_key, &k256_signature, content).is_ok());
900 assert!(validate(&parsed_k256, &k256_signature, content).is_ok());
901
902 assert!(validate(&p256_key, &k256_signature, content).is_err());
904 assert!(validate(&k256_key, &p256_signature, content).is_err());
905
906 Ok(())
907 }
908
909 #[test]
910 fn test_keydata_display_format_consistency() -> Result<()> {
911 let p256_key = generate_key(KeyType::P256Private)?;
913 let k256_key = generate_key(KeyType::K256Private)?;
914
915 let p256_string = format!("{}", p256_key);
916 let k256_string = format!("{}", k256_key);
917
918 assert!(p256_string.starts_with("did:key:z"));
920 assert!(k256_string.starts_with("did:key:z"));
921
922 let _parsed_p256 = identify_key(&p256_string)?;
924 let _parsed_k256 = identify_key(&k256_string)?;
925
926 assert!(p256_string.len() > 50 && p256_string.len() < 60);
929
930 assert!(k256_string.len() > 50 && k256_string.len() < 60);
932
933 Ok(())
934 }
935
936 #[test]
937 fn test_complete_workflow_demonstration() -> Result<()> {
938 println!("\n=== KeyData Display Implementation Test ===");
939
940 println!("1. Generating keys...");
942 let p256_key = generate_key(KeyType::P256Private)?;
943 let k256_key = generate_key(KeyType::K256Private)?;
944
945 println!("2. Serializing keys to DID format...");
947 let p256_did = format!("{}", p256_key);
948 let k256_did = format!("{}", k256_key);
949 println!(" P-256 DID: {}", p256_did);
950 println!(" K-256 DID: {}", k256_did);
951
952 println!("3. Parsing DIDs back to KeyData...");
954 let parsed_p256 = identify_key(&p256_did)?;
955 let parsed_k256 = identify_key(&k256_did)?;
956 println!(" P-256 parsed successfully: {:?}", parsed_p256.key_type());
957 println!(" K-256 parsed successfully: {:?}", parsed_k256.key_type());
958
959 println!("4. Verifying round-trip integrity...");
961 assert_eq!(p256_key.bytes(), parsed_p256.bytes());
962 assert_eq!(k256_key.bytes(), parsed_k256.bytes());
963 println!(" Round-trip successful for both keys!");
964
965 println!("5. Testing signing and verification...");
967 let test_data = "Hello AT Protocol!".as_bytes();
968
969 let p256_signature = sign(&p256_key, test_data)?;
971 let k256_signature = sign(&k256_key, test_data)?;
972
973 validate(&parsed_p256, &p256_signature, test_data)?;
975 validate(&parsed_k256, &k256_signature, test_data)?;
976 println!(" Signatures verified successfully with parsed keys!");
977
978 println!("6. Testing cross-curve verification (should fail)...");
980 assert!(validate(&parsed_p256, &k256_signature, test_data).is_err());
981 assert!(validate(&parsed_k256, &p256_signature, test_data).is_err());
982 println!(" Cross-curve verification correctly failed!");
983
984 println!("=== All tests completed successfully! ===\n");
985
986 Ok(())
987 }
988
989 #[test]
990 fn test_to_public_p256() -> Result<()> {
991 let private_key = generate_key(KeyType::P256Private)?;
993
994 let public_key = to_public(&private_key)?;
996
997 assert_eq!(*public_key.key_type(), KeyType::P256Public);
999
1000 let content = "test message for p256 public key derivation".as_bytes();
1002 let signature = sign(&private_key, content)?;
1003
1004 validate(&public_key, &signature, content)?;
1006
1007 let public_key_did = format!("{}", public_key);
1009 assert!(public_key_did.starts_with("did:key:"));
1010
1011 let parsed_public_key = identify_key(&public_key_did)?;
1013 assert_eq!(*parsed_public_key.key_type(), KeyType::P256Public);
1014 assert_eq!(public_key.bytes(), parsed_public_key.bytes());
1015
1016 Ok(())
1017 }
1018
1019 #[test]
1020 fn test_to_public_k256() -> Result<()> {
1021 let private_key = generate_key(KeyType::K256Private)?;
1023
1024 let public_key = to_public(&private_key)?;
1026
1027 assert_eq!(*public_key.key_type(), KeyType::K256Public);
1029
1030 let content = "test message for k256 public key derivation".as_bytes();
1032 let signature = sign(&private_key, content)?;
1033
1034 validate(&public_key, &signature, content)?;
1036
1037 let public_key_did = format!("{}", public_key);
1039 assert!(public_key_did.starts_with("did:key:"));
1040
1041 let parsed_public_key = identify_key(&public_key_did)?;
1043 assert_eq!(*parsed_public_key.key_type(), KeyType::K256Public);
1044 assert_eq!(public_key.bytes(), parsed_public_key.bytes());
1045
1046 Ok(())
1047 }
1048
1049 #[test]
1050 fn test_to_public_with_public_keys() -> Result<()> {
1051 let p256_private = generate_key(KeyType::P256Private)?;
1053 let p256_public = to_public(&p256_private)?;
1054
1055 let result = to_public(&p256_public)?;
1057 assert_eq!(*result.key_type(), KeyType::P256Public);
1058 assert_eq!(p256_public.bytes(), result.bytes());
1059
1060 let k256_private = generate_key(KeyType::K256Private)?;
1061 let k256_public = to_public(&k256_private)?;
1062
1063 let result = to_public(&k256_public)?;
1064 assert_eq!(*result.key_type(), KeyType::K256Public);
1065 assert_eq!(k256_public.bytes(), result.bytes());
1066
1067 Ok(())
1068 }
1069
1070 #[test]
1071 fn test_to_public_existing_keys() -> Result<()> {
1072 let p256_private_key = "did:key:z42tj8ZrAza9WkewDELwWMN37TS3coEbGdZh8bp1URfMVnpx";
1074 let k256_private_key = "did:key:z3vLW46Z1UHwnr7vN33MoFt2sBQDQagn9HTvWnsQDHegUixP";
1075
1076 let parsed_p256_private = identify_key(p256_private_key)?;
1078 let parsed_k256_private = identify_key(k256_private_key)?;
1079
1080 let p256_public = to_public(&parsed_p256_private)?;
1082 let k256_public = to_public(&parsed_k256_private)?;
1083
1084 assert_eq!(*p256_public.key_type(), KeyType::P256Public);
1086 assert_eq!(*k256_public.key_type(), KeyType::K256Public);
1087
1088 let content = "test with existing keys".as_bytes();
1090
1091 let p256_signature = sign(&parsed_p256_private, content)?;
1092 let k256_signature = sign(&parsed_k256_private, content)?;
1093
1094 validate(&p256_public, &p256_signature, content)?;
1096 validate(&k256_public, &k256_signature, content)?;
1097
1098 Ok(())
1099 }
1100
1101 #[test]
1102 fn test_to_public_comprehensive_workflow() -> Result<()> {
1103 println!("\n=== Public Key Derivation Test ===");
1104
1105 println!("1. Generating private keys...");
1107 let p256_private = generate_key(KeyType::P256Private)?;
1108 let k256_private = generate_key(KeyType::K256Private)?;
1109
1110 println!("2. Deriving public keys...");
1112 let p256_public = to_public(&p256_private)?;
1113 let k256_public = to_public(&k256_private)?;
1114
1115 println!("3. Serializing keys to DID format...");
1117 let p256_private_did = format!("{}", p256_private);
1118 let p256_public_did = format!("{}", p256_public);
1119 let k256_private_did = format!("{}", k256_private);
1120 let k256_public_did = format!("{}", k256_public);
1121
1122 println!(" P-256 Private: {}", p256_private_did);
1123 println!(" P-256 Public: {}", p256_public_did);
1124 println!(" K-256 Private: {}", k256_private_did);
1125 println!(" K-256 Public: {}", k256_public_did);
1126
1127 assert_ne!(p256_private_did, p256_public_did);
1129 assert_ne!(k256_private_did, k256_public_did);
1130 assert_ne!(p256_public_did, k256_public_did);
1131
1132 println!("4. Testing signature verification...");
1134 let test_data = "Public key derivation test data".as_bytes();
1135
1136 let p256_signature = sign(&p256_private, test_data)?;
1137 let k256_signature = sign(&k256_private, test_data)?;
1138
1139 validate(&p256_public, &p256_signature, test_data)?;
1141 validate(&k256_public, &k256_signature, test_data)?;
1142 println!(" Signatures verified successfully with derived public keys!");
1143
1144 println!("5. Testing DID round-trip with public keys...");
1146 let parsed_p256_public = identify_key(&p256_public_did)?;
1147 let parsed_k256_public = identify_key(&k256_public_did)?;
1148
1149 validate(&parsed_p256_public, &p256_signature, test_data)?;
1150 validate(&parsed_k256_public, &k256_signature, test_data)?;
1151 println!(" Parsed public keys also verify signatures correctly!");
1152
1153 println!("=== Public key derivation workflow completed successfully! ===\n");
1154
1155 Ok(())
1156 }
1157
1158 #[test]
1159 fn test_to_public_key_properties() -> Result<()> {
1160 let p256_private = generate_key(KeyType::P256Private)?;
1162 let k256_private = generate_key(KeyType::K256Private)?;
1163
1164 let p256_public = to_public(&p256_private)?;
1165 let k256_public = to_public(&k256_private)?;
1166
1167 assert!(p256_public.bytes().len() == 65 || p256_public.bytes().len() == 33);
1170
1171 assert!(k256_public.bytes().len() == 65 || k256_public.bytes().len() == 33);
1173
1174 let p256_public2 = to_public(&p256_private)?;
1176 let k256_public2 = to_public(&k256_private)?;
1177
1178 assert_eq!(p256_public.bytes(), p256_public2.bytes());
1179 assert_eq!(k256_public.bytes(), k256_public2.bytes());
1180
1181 Ok(())
1182 }
1183
1184 #[test]
1185 fn test_to_public_with_existing_public_keys() -> Result<()> {
1186 let p256_public_key = "did:key:zDnaeXduWbJ1b1Kgjf3uCdCpMDF1LEDizUiyxAxGwerou3Nh2";
1188 let k256_public_key = "did:key:zQ3shNzMp4oaaQ1gQRzCxMGXFrSW3NEM1M9T6KCY9eA7HhyEA";
1189
1190 let parsed_p256_public = identify_key(p256_public_key)?;
1192 let parsed_k256_public = identify_key(k256_public_key)?;
1193
1194 assert_eq!(*parsed_p256_public.key_type(), KeyType::P256Public);
1196 assert_eq!(*parsed_k256_public.key_type(), KeyType::K256Public);
1197
1198 let same_p256_public = to_public(&parsed_p256_public)?;
1200 let same_k256_public = to_public(&parsed_k256_public)?;
1201
1202 assert_eq!(*same_p256_public.key_type(), KeyType::P256Public);
1204 assert_eq!(*same_k256_public.key_type(), KeyType::K256Public);
1205 assert_eq!(parsed_p256_public.bytes(), same_p256_public.bytes());
1206 assert_eq!(parsed_k256_public.bytes(), same_k256_public.bytes());
1207
1208 assert_eq!(format!("{}", same_p256_public), p256_public_key);
1210 assert_eq!(format!("{}", same_k256_public), k256_public_key);
1211
1212 Ok(())
1213 }
1214
1215 #[test]
1218 fn test_generate_key_p384_private() -> Result<()> {
1219 let key_data = generate_key(KeyType::P384Private)?;
1220 assert_eq!(*key_data.key_type(), KeyType::P384Private);
1221 assert_eq!(key_data.bytes().len(), 48); let content = "test content for p384".as_bytes();
1225 let signature = sign(&key_data, content)?;
1226 let validation = validate(&key_data, &signature, content);
1227 assert!(validation.is_ok());
1228
1229 Ok(())
1230 }
1231
1232 #[test]
1233 fn test_generate_key_p384_public_not_supported() {
1234 let result = generate_key(KeyType::P384Public);
1235 assert!(matches!(
1236 result,
1237 Err(KeyError::PublicKeyGenerationNotSupported)
1238 ));
1239 }
1240
1241 #[test]
1242 fn test_generate_key_p384_uniqueness() -> Result<()> {
1243 let key1 = generate_key(KeyType::P384Private)?;
1245 let key2 = generate_key(KeyType::P384Private)?;
1246 assert_ne!(key1.bytes(), key2.bytes());
1247
1248 Ok(())
1249 }
1250
1251 #[test]
1252 fn test_sign_and_validate_p384() -> Result<()> {
1253 let private_key = generate_key(KeyType::P384Private)?;
1255
1256 let public_key = to_public(&private_key)?;
1258 assert_eq!(*public_key.key_type(), KeyType::P384Public);
1259
1260 let content = "hello world p384 test".as_bytes();
1261
1262 let signature = sign(&private_key, content)?;
1264 assert!(!signature.is_empty());
1265
1266 validate(&public_key, &signature, content)?;
1268
1269 validate(&private_key, &signature, content)?;
1271
1272 let wrong_content = "wrong content".as_bytes();
1274 assert!(validate(&public_key, &signature, wrong_content).is_err());
1275
1276 Ok(())
1277 }
1278
1279 #[test]
1280 fn test_p384_keydata_display_round_trip() -> Result<()> {
1281 let original_key = generate_key(KeyType::P384Private)?;
1283
1284 let key_string = format!("{}", original_key);
1286
1287 assert!(key_string.starts_with("did:key:"));
1289
1290 let parsed_key = identify_key(&key_string)?;
1292
1293 assert_eq!(original_key.key_type(), parsed_key.key_type());
1295
1296 assert_eq!(original_key.bytes(), parsed_key.bytes());
1298
1299 let content = "test message for p384 round trip".as_bytes();
1301
1302 let signature = sign(&original_key, content)?;
1304
1305 validate(&original_key, &signature, content)?;
1307
1308 validate(&parsed_key, &signature, content)?;
1310
1311 let signature2 = sign(&parsed_key, content)?;
1313
1314 validate(&original_key, &signature2, content)?;
1316 validate(&parsed_key, &signature2, content)?;
1317
1318 Ok(())
1319 }
1320
1321 #[test]
1322 fn test_p384_to_public_key_derivation() -> Result<()> {
1323 let private_key = generate_key(KeyType::P384Private)?;
1325
1326 let public_key = to_public(&private_key)?;
1328
1329 assert_eq!(*public_key.key_type(), KeyType::P384Public);
1331
1332 let content = "test message for p384 public key derivation".as_bytes();
1334 let signature = sign(&private_key, content)?;
1335
1336 validate(&public_key, &signature, content)?;
1338
1339 let public_key_did = format!("{}", public_key);
1341 assert!(public_key_did.starts_with("did:key:"));
1342
1343 let parsed_public_key = identify_key(&public_key_did)?;
1345 assert_eq!(*parsed_public_key.key_type(), KeyType::P384Public);
1346 assert_eq!(public_key.bytes(), parsed_public_key.bytes());
1347
1348 let result = to_public(&public_key)?;
1350 assert_eq!(*result.key_type(), KeyType::P384Public);
1351 assert_eq!(public_key.bytes(), result.bytes());
1352
1353 Ok(())
1354 }
1355
1356 #[test]
1357 fn test_p384_jwk_conversion() -> Result<()> {
1358 let private_key = generate_key(KeyType::P384Private)?;
1360 let public_key = to_public(&private_key)?;
1361
1362 let private_jwk: Result<elliptic_curve::JwkEcKey, _> = (&private_key).try_into();
1364 assert!(private_jwk.is_ok());
1365
1366 let public_jwk: Result<elliptic_curve::JwkEcKey, _> = (&public_key).try_into();
1368 assert!(public_jwk.is_ok());
1369
1370 Ok(())
1371 }
1372
1373 #[test]
1374 fn test_p384_key_properties() -> Result<()> {
1375 let private_key = generate_key(KeyType::P384Private)?;
1377 let public_key = to_public(&private_key)?;
1378
1379 assert_eq!(private_key.bytes().len(), 48);
1381
1382 assert!(public_key.bytes().len() == 97 || public_key.bytes().len() == 49);
1386
1387 let public_key2 = to_public(&private_key)?;
1389 assert_eq!(public_key.bytes(), public_key2.bytes());
1390
1391 Ok(())
1392 }
1393
1394 #[test]
1395 fn test_p384_cross_curve_verification_fails() -> Result<()> {
1396 let p256_key = generate_key(KeyType::P256Private)?;
1398 let p384_key = generate_key(KeyType::P384Private)?;
1399 let k256_key = generate_key(KeyType::K256Private)?;
1400
1401 let p256_public = to_public(&p256_key)?;
1403 let p384_public = to_public(&p384_key)?;
1404 let k256_public = to_public(&k256_key)?;
1405
1406 let content = "cross curve verification test".as_bytes();
1407
1408 let p256_signature = sign(&p256_key, content)?;
1410 let p384_signature = sign(&p384_key, content)?;
1411 let k256_signature = sign(&k256_key, content)?;
1412
1413 validate(&p256_public, &p256_signature, content)?;
1415 validate(&p384_public, &p384_signature, content)?;
1416 validate(&k256_public, &k256_signature, content)?;
1417
1418 assert!(validate(&p256_public, &p384_signature, content).is_err());
1420 assert!(validate(&p384_public, &p256_signature, content).is_err());
1421 assert!(validate(&k256_public, &p384_signature, content).is_err());
1422 assert!(validate(&p384_public, &k256_signature, content).is_err());
1423
1424 Ok(())
1425 }
1426
1427 #[test]
1428 fn test_p384_sign_with_public_key_fails() {
1429 let private_key = generate_key(KeyType::P384Private).unwrap();
1430 let public_key = to_public(&private_key).unwrap();
1431
1432 let content = "test content".as_bytes();
1433
1434 let result = sign(&public_key, content);
1436 assert!(matches!(
1437 result,
1438 Err(KeyError::PrivateKeyRequiredForSignature)
1439 ));
1440 }
1441
1442 #[test]
1443 fn test_p384_comprehensive_workflow() -> Result<()> {
1444 println!("\n=== P-384 Comprehensive Workflow Test ===");
1445
1446 println!("1. Generating P-384 private key...");
1448 let private_key = generate_key(KeyType::P384Private)?;
1449 assert_eq!(*private_key.key_type(), KeyType::P384Private);
1450 assert_eq!(private_key.bytes().len(), 48);
1451
1452 println!("2. Deriving P-384 public key...");
1454 let public_key = to_public(&private_key)?;
1455 assert_eq!(*public_key.key_type(), KeyType::P384Public);
1456
1457 println!("3. Serializing keys to DID format...");
1459 let private_did = format!("{}", private_key);
1460 let public_did = format!("{}", public_key);
1461 println!(" P-384 Private: {}", private_did);
1462 println!(" P-384 Public: {}", public_did);
1463
1464 assert!(private_did.starts_with("did:key:"));
1465 assert!(public_did.starts_with("did:key:"));
1466 assert_ne!(private_did, public_did);
1467
1468 println!("4. Parsing DIDs back to KeyData...");
1470 let parsed_private = identify_key(&private_did)?;
1471 let parsed_public = identify_key(&public_did)?;
1472
1473 assert_eq!(*parsed_private.key_type(), KeyType::P384Private);
1474 assert_eq!(*parsed_public.key_type(), KeyType::P384Public);
1475
1476 println!("5. Verifying round-trip integrity...");
1478 assert_eq!(private_key.bytes(), parsed_private.bytes());
1479 assert_eq!(public_key.bytes(), parsed_public.bytes());
1480
1481 println!("6. Testing signing and verification...");
1483 let test_data = "P-384 comprehensive test data".as_bytes();
1484
1485 let signature = sign(&private_key, test_data)?;
1487
1488 validate(&private_key, &signature, test_data)?;
1490 validate(&public_key, &signature, test_data)?;
1491 validate(&parsed_private, &signature, test_data)?;
1492 validate(&parsed_public, &signature, test_data)?;
1493
1494 println!("7. Testing JWK conversion...");
1496 let private_jwk: elliptic_curve::JwkEcKey = (&private_key).try_into()?;
1497 let public_jwk: elliptic_curve::JwkEcKey = (&public_key).try_into()?;
1498
1499 assert_eq!(private_jwk.crv(), "P-384");
1500 assert_eq!(public_jwk.crv(), "P-384");
1501
1502 println!("=== P-384 comprehensive workflow completed successfully! ===\n");
1503
1504 Ok(())
1505 }
1506
1507 #[test]
1508 fn test_p384_multicodec_prefix_identification() -> Result<()> {
1509 let private_key = generate_key(KeyType::P384Private)?;
1511 let public_key = to_public(&private_key)?;
1512
1513 let private_did = format!("{}", private_key);
1515 let public_did = format!("{}", public_key);
1516
1517 let parsed_private = identify_key(&private_did)?;
1519 let parsed_public = identify_key(&public_did)?;
1520
1521 assert_eq!(*parsed_private.key_type(), KeyType::P384Private);
1522 assert_eq!(*parsed_public.key_type(), KeyType::P384Public);
1523
1524 let private_value = did_method_key_value(&private_did);
1526 let public_value = did_method_key_value(&public_did);
1527
1528 let (_, private_decoded) = multibase::decode(private_value)?;
1529 let (_, public_decoded) = multibase::decode(public_value)?;
1530
1531 assert_eq!(&private_decoded[..2], &[0x13, 0x01]); assert_eq!(&public_decoded[..2], &[0x12, 0x00]); Ok(())
1536 }
1537}