1use anyhow::Result;
57use ecdsa::signature::Signer;
58use elliptic_curve::JwkEcKey;
59use elliptic_curve::sec1::ToEncodedPoint;
60
61use crate::errors::KeyError;
62
63#[cfg_attr(debug_assertions, derive(Debug))]
65#[derive(Clone, PartialEq)]
66pub enum KeyType {
67 P256Public,
70
71 P256Private,
74
75 P384Public,
78
79 P384Private,
82
83 K256Public,
86
87 K256Private,
90}
91
92impl std::fmt::Display for KeyType {
93 fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
94 match self {
95 KeyType::P256Public => write!(f, "P256Public"),
96 KeyType::P256Private => write!(f, "P256Private"),
97 KeyType::P384Public => write!(f, "P384Public"),
98 KeyType::P384Private => write!(f, "P384Private"),
99 KeyType::K256Public => write!(f, "K256Public"),
100 KeyType::K256Private => write!(f, "K256Private"),
101 }
102 }
103}
104
105#[derive(Clone)]
117pub struct KeyData(pub KeyType, pub Vec<u8>);
118
119impl KeyData {
120 pub fn new(key_type: KeyType, bytes: Vec<u8>) -> Self {
122 KeyData(key_type, bytes)
123 }
124
125 pub fn key_type(&self) -> &KeyType {
127 &self.0
128 }
129
130 pub fn bytes(&self) -> &[u8] {
132 &self.1
133 }
134
135 pub fn into_parts(self) -> (KeyType, Vec<u8>) {
137 (self.0, self.1)
138 }
139}
140
141impl std::fmt::Display for KeyData {
142 fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
143 let prefix = match self.key_type() {
145 KeyType::P256Private => [0x86, 0x26],
146 KeyType::P256Public => [0x80, 0x24],
147 KeyType::P384Private => [0x13, 0x01],
148 KeyType::P384Public => [0x12, 0x00],
149 KeyType::K256Private => [0x81, 0x26],
150 KeyType::K256Public => [0xe7, 0x01],
151 };
152
153 let mut multicodec_bytes = Vec::with_capacity(2 + self.bytes().len());
155 multicodec_bytes.extend_from_slice(&prefix);
156 multicodec_bytes.extend_from_slice(self.bytes());
157
158 let multibase_encoded = multibase::encode(multibase::Base::Base58Btc, &multicodec_bytes);
160
161 write!(f, "did:key:{}", multibase_encoded)
163 }
164}
165
166#[async_trait::async_trait]
171pub trait KeyProvider: Send + Sync {
172 async fn get_private_key_by_id(&self, key_id: &str) -> Result<Option<KeyData>>;
182}
183
184const DID_METHOD_KEY_PREFIX: &str = "did:key:";
186
187pub fn did_method_key_value(key: &str) -> &str {
191 match key.strip_prefix(DID_METHOD_KEY_PREFIX) {
192 Some(value) => value,
193 None => key,
194 }
195}
196
197pub fn identify_key(key: &str) -> Result<KeyData, KeyError> {
201 let stripped_key = did_method_key_value(key);
202 let (_, decoded_multibase_key) =
203 multibase::decode(stripped_key).map_err(|error| KeyError::DecodeError { error })?;
204
205 if decoded_multibase_key.len() < 3 {
206 return Err(KeyError::UnidentifiedKeyType);
207 }
208
209 match &decoded_multibase_key[..2] {
221 [0x86, 0x26] => Ok(KeyData::new(
223 KeyType::P256Private,
224 decoded_multibase_key[2..].to_vec(),
225 )),
226
227 [0x80, 0x24] => Ok(KeyData::new(
229 KeyType::P256Public,
230 decoded_multibase_key[2..].to_vec(),
231 )),
232
233 [0x13, 0x01] => Ok(KeyData::new(
235 KeyType::P384Private,
236 decoded_multibase_key[2..].to_vec(),
237 )),
238
239 [0x12, 0x00] => Ok(KeyData::new(
241 KeyType::P384Public,
242 decoded_multibase_key[2..].to_vec(),
243 )),
244
245 [0x81, 0x26] => Ok(KeyData::new(
247 KeyType::K256Private,
248 decoded_multibase_key[2..].to_vec(),
249 )),
250
251 [0xe7, 0x01] => Ok(KeyData::new(
253 KeyType::K256Public,
254 decoded_multibase_key[2..].to_vec(),
255 )),
256
257 _ => Err(KeyError::InvalidMultibaseKeyType {
258 prefix: decoded_multibase_key[..2].to_vec(),
259 }),
260 }
261}
262
263pub fn validate(key_data: &KeyData, signature: &[u8], content: &[u8]) -> Result<(), KeyError> {
267 match *key_data.key_type() {
268 KeyType::P256Public => {
269 let signature = ecdsa::Signature::from_slice(signature)
270 .map_err(|error| KeyError::SignatureError { error })?;
271 let verifying_key = p256::ecdsa::VerifyingKey::from_sec1_bytes(key_data.bytes())
272 .map_err(|error| KeyError::P256Error { error })?;
273 ecdsa::signature::Verifier::verify(&verifying_key, content, &signature)
274 .map_err(|error| KeyError::ECDSAError { error })
275 }
276 KeyType::P384Public => {
277 let signature = ecdsa::Signature::from_slice(signature)
278 .map_err(|error| KeyError::SignatureError { error })?;
279 let verifying_key = p384::ecdsa::VerifyingKey::from_sec1_bytes(key_data.bytes())
280 .map_err(|error| KeyError::P384Error { error })?;
281 ecdsa::signature::Verifier::verify(&verifying_key, content, &signature)
282 .map_err(|error| KeyError::ECDSAError { error })
283 }
284 KeyType::K256Public => {
285 let signature = ecdsa::Signature::from_slice(signature)
286 .map_err(|error| KeyError::SignatureError { error })?;
287 let verifying_key = k256::ecdsa::VerifyingKey::from_sec1_bytes(key_data.bytes())
288 .map_err(|error| KeyError::K256Error { error })?;
289 ecdsa::signature::Verifier::verify(&verifying_key, content, &signature)
290 .map_err(|error| KeyError::ECDSAError { error })
291 }
292 KeyType::P256Private => {
293 let signature = ecdsa::Signature::from_slice(signature)
294 .map_err(|error| KeyError::SignatureError { error })?;
295 let secret_key: p256::SecretKey =
296 ecdsa::elliptic_curve::SecretKey::from_slice(key_data.bytes())
297 .map_err(|error| KeyError::SecretKeyError { error })?;
298 let public_key = secret_key.public_key();
299 let verifying_key = p256::ecdsa::VerifyingKey::from(public_key);
300 ecdsa::signature::Verifier::verify(&verifying_key, content, &signature)
301 .map_err(|error| KeyError::ECDSAError { error })
302 }
303 KeyType::P384Private => {
304 let signature = ecdsa::Signature::from_slice(signature)
305 .map_err(|error| KeyError::SignatureError { error })?;
306 let secret_key: p384::SecretKey =
307 ecdsa::elliptic_curve::SecretKey::from_slice(key_data.bytes())
308 .map_err(|error| KeyError::SecretKeyError { error })?;
309 let public_key = secret_key.public_key();
310 let verifying_key = p384::ecdsa::VerifyingKey::from(public_key);
311 ecdsa::signature::Verifier::verify(&verifying_key, content, &signature)
312 .map_err(|error| KeyError::ECDSAError { error })
313 }
314 KeyType::K256Private => {
315 let signature = ecdsa::Signature::from_slice(signature)
316 .map_err(|error| KeyError::SignatureError { error })?;
317 let secret_key: k256::SecretKey =
318 ecdsa::elliptic_curve::SecretKey::from_slice(key_data.bytes())
319 .map_err(|error| KeyError::SecretKeyError { error })?;
320 let public_key = secret_key.public_key();
321 let verifying_key = k256::ecdsa::VerifyingKey::from(public_key);
322 ecdsa::signature::Verifier::verify(&verifying_key, content, &signature)
323 .map_err(|error| KeyError::ECDSAError { error })
324 }
325 }
326}
327
328pub fn sign(key_data: &KeyData, content: &[u8]) -> Result<Vec<u8>, KeyError> {
332 match *key_data.key_type() {
333 KeyType::K256Public | KeyType::P256Public | KeyType::P384Public => {
334 Err(KeyError::PrivateKeyRequiredForSignature)
335 }
336 KeyType::P256Private => {
337 let secret_key: p256::SecretKey =
338 ecdsa::elliptic_curve::SecretKey::from_slice(key_data.bytes())
339 .map_err(|error| KeyError::SecretKeyError { error })?;
340 let signing_key: p256::ecdsa::SigningKey = p256::ecdsa::SigningKey::from(secret_key);
341 let signature: p256::ecdsa::Signature = signing_key
342 .try_sign(content)
343 .map_err(|error| KeyError::ECDSAError { error })?;
344 Ok(signature.to_vec())
345 }
346 KeyType::P384Private => {
347 let secret_key: p384::SecretKey =
348 ecdsa::elliptic_curve::SecretKey::from_slice(key_data.bytes())
349 .map_err(|error| KeyError::SecretKeyError { error })?;
350 let signing_key: p384::ecdsa::SigningKey = p384::ecdsa::SigningKey::from(secret_key);
351 let signature: p384::ecdsa::Signature = signing_key
352 .try_sign(content)
353 .map_err(|error| KeyError::ECDSAError { error })?;
354 Ok(signature.to_vec())
355 }
356 KeyType::K256Private => {
357 let secret_key: k256::SecretKey =
358 ecdsa::elliptic_curve::SecretKey::from_slice(key_data.bytes())
359 .map_err(|error| KeyError::SecretKeyError { error })?;
360 let signing_key: k256::ecdsa::SigningKey = k256::ecdsa::SigningKey::from(secret_key);
361 let signature: k256::ecdsa::Signature = signing_key
362 .try_sign(content)
363 .map_err(|error| KeyError::ECDSAError { error })?;
364 Ok(signature.to_vec())
365 }
366 }
367}
368
369impl TryInto<JwkEcKey> for &KeyData {
370 type Error = KeyError;
371
372 fn try_into(self) -> Result<JwkEcKey, Self::Error> {
373 match *self.key_type() {
374 KeyType::P256Public => {
375 let public_key = p256::PublicKey::from_sec1_bytes(self.bytes()).map_err(|e| {
376 KeyError::JWKConversionFailed {
377 error: format!("Failed to parse P256 public key: {}", e),
378 }
379 })?;
380 Ok(public_key.to_jwk())
381 }
382 KeyType::P256Private => {
383 let secret_key = p256::SecretKey::from_slice(self.bytes())
384 .map_err(|error| KeyError::SecretKeyError { error })?;
385 Ok(secret_key.to_jwk())
386 }
387 KeyType::P384Public => {
388 let public_key = p384::PublicKey::from_sec1_bytes(self.bytes()).map_err(|e| {
389 KeyError::JWKConversionFailed {
390 error: format!("Failed to parse P384 public key: {}", e),
391 }
392 })?;
393 Ok(public_key.to_jwk())
394 }
395 KeyType::P384Private => {
396 let secret_key = p384::SecretKey::from_slice(self.bytes())
397 .map_err(|error| KeyError::SecretKeyError { error })?;
398 Ok(secret_key.to_jwk())
399 }
400 KeyType::K256Public => {
401 let public_key = k256::PublicKey::from_sec1_bytes(self.bytes()).map_err(|e| {
402 KeyError::JWKConversionFailed {
403 error: format!("Failed to parse k256 public key: {}", e),
404 }
405 })?;
406 Ok(public_key.to_jwk())
407 }
408 KeyType::K256Private => {
409 let secret_key = k256::SecretKey::from_slice(self.bytes())
410 .map_err(|error| KeyError::SecretKeyError { error })?;
411 Ok(secret_key.to_jwk())
412 }
413 }
414 }
415}
416
417pub fn generate_key(key_type: KeyType) -> Result<KeyData, KeyError> {
438 match key_type {
439 KeyType::P256Private => {
440 let secret_key = p256::SecretKey::random(&mut rand::thread_rng());
441 Ok(KeyData::new(
442 KeyType::P256Private,
443 secret_key.to_bytes().to_vec(),
444 ))
445 }
446 KeyType::P384Private => {
447 let secret_key = p384::SecretKey::random(&mut rand::thread_rng());
448 Ok(KeyData::new(
449 KeyType::P384Private,
450 secret_key.to_bytes().to_vec(),
451 ))
452 }
453 KeyType::K256Private => {
454 let secret_key = k256::SecretKey::random(&mut rand::thread_rng());
455 Ok(KeyData::new(
456 KeyType::K256Private,
457 secret_key.to_bytes().to_vec(),
458 ))
459 }
460 KeyType::P256Public => Err(KeyError::PublicKeyGenerationNotSupported),
461 KeyType::P384Public => Err(KeyError::PublicKeyGenerationNotSupported),
462 KeyType::K256Public => Err(KeyError::PublicKeyGenerationNotSupported),
463 }
464}
465
466pub fn to_public(key_data: &KeyData) -> Result<KeyData, KeyError> {
491 match key_data.key_type() {
492 KeyType::P256Private => {
493 let secret_key: p256::SecretKey =
494 ecdsa::elliptic_curve::SecretKey::from_slice(key_data.bytes())
495 .map_err(|error| KeyError::SecretKeyError { error })?;
496 let public_key = secret_key.public_key();
497 let compressed = public_key.to_encoded_point(true);
498 let public_key_bytes = compressed.to_bytes();
499 Ok(KeyData::new(KeyType::P256Public, public_key_bytes.to_vec()))
500 }
501 KeyType::P384Private => {
502 let secret_key: p384::SecretKey =
503 ecdsa::elliptic_curve::SecretKey::from_slice(key_data.bytes())
504 .map_err(|error| KeyError::SecretKeyError { error })?;
505 let public_key = secret_key.public_key();
506 let compressed = public_key.to_encoded_point(true);
507 let public_key_bytes = compressed.to_bytes();
508 Ok(KeyData::new(KeyType::P384Public, public_key_bytes.to_vec()))
509 }
510 KeyType::K256Private => {
511 let secret_key: k256::SecretKey =
512 ecdsa::elliptic_curve::SecretKey::from_slice(key_data.bytes())
513 .map_err(|error| KeyError::SecretKeyError { error })?;
514 let public_key = secret_key.public_key();
515 let public_key_bytes = public_key.to_sec1_bytes();
516 Ok(KeyData::new(KeyType::K256Public, public_key_bytes.to_vec()))
517 }
518 KeyType::P256Public | KeyType::P384Public | KeyType::K256Public => {
519 Ok(key_data.clone())
521 }
522 }
523}
524
525#[cfg(test)]
526mod tests {
527 use super::*;
528
529 #[test]
530 fn test_identify_key() {
531 for _ in 0..4 {
533 let result = identify_key("z3vLVqpQveB3w8G6MQsLVseJ1Z2E1JyQzUj6WgRYNNwB9jdE");
534 assert!(result.is_ok());
535 let key_data = result.unwrap();
536 assert_eq!(*key_data.key_type(), KeyType::K256Private);
537 }
538
539 assert!(matches!(
541 identify_key("asdasdasd"),
542 Err(KeyError::DecodeError { .. })
543 ));
544
545 assert!(matches!(
547 identify_key("z4vLVqpQveB3w8G6MQsLVseJ1Z2E1JyQzUj6WgRYNNwB9jdE"),
548 Err(KeyError::InvalidMultibaseKeyType { .. })
549 ));
550 }
551
552 #[test]
553 fn test_sign_p256() -> Result<()> {
554 let private_key = "did:key:z42tnbHmmnhF11nwSnp5kQJbcZQw2Vbw5WF3ABDSxPtDgU2o";
555 let public_key = "did:key:zDnaeXduWbJ1b1Kgjf3uCdCpMDF1LEDizUiyxAxGwerou3Nh2";
556
557 let private_key_data = identify_key(private_key);
558 assert!(private_key_data.is_ok());
559 let private_key_data = private_key_data.unwrap();
560 assert_eq!(*private_key_data.key_type(), KeyType::P256Private);
561
562 let public_key_data = identify_key(public_key);
563 assert!(public_key_data.is_ok());
564 let public_key_data = public_key_data.unwrap();
565 assert_eq!(*public_key_data.key_type(), KeyType::P256Public);
566
567 let content = "hello world".as_bytes();
568
569 let signature = sign(&private_key_data, content);
570 assert!(signature.is_ok());
571 let signature = signature.unwrap();
572
573 {
574 let validation = validate(&public_key_data, &signature, content);
575 assert!(validation.is_ok());
576 }
577 {
578 let validation = validate(&private_key_data, &signature, content);
579 assert!(validation.is_ok());
580 }
581 Ok(())
582 }
583
584 #[test]
585 fn test_sign_k256() -> Result<()> {
586 let private_key = "did:key:z3vLY4nbXy2rV4Qr65gUtfnSF3A8Be7gmYzUiCX6eo2PR1Rt";
587 let public_key = "did:key:zQ3shNzMp4oaaQ1gQRzCxMGXFrSW3NEM1M9T6KCY9eA7HhyEA";
588
589 let private_key_data = identify_key(private_key);
590 assert!(private_key_data.is_ok());
591 let private_key_data = private_key_data.unwrap();
592 assert_eq!(*private_key_data.key_type(), KeyType::K256Private);
593
594 let public_key_data = identify_key(public_key);
595 assert!(public_key_data.is_ok());
596 let public_key_data = public_key_data.unwrap();
597 assert_eq!(*public_key_data.key_type(), KeyType::K256Public);
598
599 let content = "hello world".as_bytes();
600
601 let signature = sign(&private_key_data, content);
602 assert!(signature.is_ok());
603 let signature = signature.unwrap();
604
605 {
606 let validation = validate(&public_key_data, &signature, content);
607 assert!(validation.is_ok());
608 }
609 {
610 let validation = validate(&private_key_data, &signature, content);
611 assert!(validation.is_ok());
612 }
613 Ok(())
614 }
615
616 #[test]
617 fn test_to_jwk_p256() -> Result<()> {
618 let private_key = "did:key:z42tnbHmmnhF11nwSnp5kQJbcZQw2Vbw5WF3ABDSxPtDgU2o";
619 let public_key = "did:key:zDnaeXduWbJ1b1Kgjf3uCdCpMDF1LEDizUiyxAxGwerou3Nh2";
620
621 let private_key_data = identify_key(private_key);
622 assert!(private_key_data.is_ok());
623 let private_key_data = private_key_data.unwrap();
624 assert_eq!(*private_key_data.key_type(), KeyType::P256Private);
625
626 let public_key_data = identify_key(public_key);
627 assert!(public_key_data.is_ok());
628 let public_key_data = public_key_data.unwrap();
629 assert_eq!(*public_key_data.key_type(), KeyType::P256Public);
630
631 let private_jwk: Result<elliptic_curve::JwkEcKey, _> = (&private_key_data).try_into();
633 assert!(private_jwk.is_ok());
634
635 let public_jwk: Result<elliptic_curve::JwkEcKey, _> = (&public_key_data).try_into();
637 assert!(public_jwk.is_ok());
638
639 Ok(())
640 }
641
642 #[test]
643 fn test_to_jwk_k256_supported() -> Result<()> {
644 let private_key = "did:key:z3vLY4nbXy2rV4Qr65gUtfnSF3A8Be7gmYzUiCX6eo2PR1Rt";
645 let public_key = "did:key:zQ3shNzMp4oaaQ1gQRzCxMGXFrSW3NEM1M9T6KCY9eA7HhyEA";
646
647 let private_key_data = identify_key(private_key);
648 assert!(private_key_data.is_ok());
649 let private_key_data = private_key_data.unwrap();
650 assert_eq!(*private_key_data.key_type(), KeyType::K256Private);
651
652 let public_key_data = identify_key(public_key);
653 assert!(public_key_data.is_ok());
654 let public_key_data = public_key_data.unwrap();
655 assert_eq!(*public_key_data.key_type(), KeyType::K256Public);
656
657 let private_jwk: Result<elliptic_curve::JwkEcKey, _> = (&private_key_data).try_into();
659 assert!(private_jwk.is_ok());
660 let private_jwk = private_jwk.unwrap();
661 assert_eq!(private_jwk.crv(), "secp256k1");
662
663 let public_jwk: Result<elliptic_curve::JwkEcKey, _> = (&public_key_data).try_into();
664 assert!(public_jwk.is_ok());
665 let public_jwk = public_jwk.unwrap();
666 assert_eq!(public_jwk.crv(), "secp256k1");
667
668 Ok(())
669 }
670
671 #[test]
672 fn test_try_into_jwk_keydata() -> Result<()> {
673 let private_key = "did:key:z42tnbHmmnhF11nwSnp5kQJbcZQw2Vbw5WF3ABDSxPtDgU2o";
674 let public_key = "did:key:zDnaeXduWbJ1b1Kgjf3uCdCpMDF1LEDizUiyxAxGwerou3Nh2";
675
676 let private_key_data = identify_key(private_key);
677 assert!(private_key_data.is_ok());
678 let private_key_data = private_key_data.unwrap();
679 assert_eq!(*private_key_data.key_type(), KeyType::P256Private);
680
681 let public_key_data = identify_key(public_key);
682 assert!(public_key_data.is_ok());
683 let public_key_data = public_key_data.unwrap();
684 assert_eq!(*public_key_data.key_type(), KeyType::P256Public);
685
686 let private_jwk: Result<JwkEcKey, KeyError> = (&private_key_data).try_into();
688 assert!(private_jwk.is_ok());
689
690 let public_jwk: Result<JwkEcKey, KeyError> = (&public_key_data).try_into();
691 assert!(public_jwk.is_ok());
692
693 Ok(())
694 }
695
696 #[test]
697 fn test_generate_key_p256_private() -> Result<()> {
698 let key_data = generate_key(KeyType::P256Private)?;
699 assert_eq!(*key_data.key_type(), KeyType::P256Private);
700 assert_eq!(key_data.bytes().len(), 32); let content = "test content".as_bytes();
704 let signature = sign(&key_data, content)?;
705 let validation = validate(&key_data, &signature, content);
706 assert!(validation.is_ok());
707
708 Ok(())
709 }
710
711 #[test]
712 fn test_generate_key_k256_private() -> Result<()> {
713 let key_data = generate_key(KeyType::K256Private)?;
714 assert_eq!(*key_data.key_type(), KeyType::K256Private);
715 assert_eq!(key_data.bytes().len(), 32); let content = "test content".as_bytes();
719 let signature = sign(&key_data, content)?;
720 let validation = validate(&key_data, &signature, content);
721 assert!(validation.is_ok());
722
723 Ok(())
724 }
725
726 #[test]
727 fn test_generate_key_public_not_supported() {
728 let result = generate_key(KeyType::P256Public);
729 assert!(matches!(
730 result,
731 Err(KeyError::PublicKeyGenerationNotSupported)
732 ));
733
734 let result = generate_key(KeyType::K256Public);
735 assert!(matches!(
736 result,
737 Err(KeyError::PublicKeyGenerationNotSupported)
738 ));
739 }
740
741 #[test]
742 fn test_generate_key_uniqueness() -> Result<()> {
743 let key1 = generate_key(KeyType::P256Private)?;
745 let key2 = generate_key(KeyType::P256Private)?;
746 assert_ne!(key1.bytes(), key2.bytes());
747
748 let key3 = generate_key(KeyType::K256Private)?;
749 let key4 = generate_key(KeyType::K256Private)?;
750 assert_ne!(key3.bytes(), key4.bytes());
751
752 Ok(())
753 }
754
755 #[test]
756 fn test_keydata_display_p256_private() -> Result<()> {
757 let original_key = generate_key(KeyType::P256Private)?;
759
760 let key_string = format!("{}", original_key);
762
763 assert!(key_string.starts_with("did:key:"));
765
766 let parsed_key = identify_key(&key_string)?;
768
769 assert_eq!(original_key.key_type(), parsed_key.key_type());
771
772 assert_eq!(original_key.bytes(), parsed_key.bytes());
774
775 let content = "test message for p256".as_bytes();
777
778 let signature = sign(&original_key, content)?;
780
781 validate(&original_key, &signature, content)?;
783
784 validate(&parsed_key, &signature, content)?;
786
787 let signature2 = sign(&parsed_key, content)?;
789
790 validate(&original_key, &signature2, content)?;
793 validate(&parsed_key, &signature2, content)?;
794
795 Ok(())
796 }
797
798 #[test]
799 fn test_keydata_display_k256_private() -> Result<()> {
800 let original_key = generate_key(KeyType::K256Private)?;
802
803 let key_string = format!("{}", original_key);
805
806 assert!(key_string.starts_with("did:key:"));
808
809 let parsed_key = identify_key(&key_string)?;
811
812 assert_eq!(original_key.key_type(), parsed_key.key_type());
814
815 assert_eq!(original_key.bytes(), parsed_key.bytes());
817
818 let content = "test message for k256".as_bytes();
820
821 let signature = sign(&original_key, content)?;
823
824 validate(&original_key, &signature, content)?;
826
827 validate(&parsed_key, &signature, content)?;
829
830 let signature2 = sign(&parsed_key, content)?;
832
833 validate(&original_key, &signature2, content)?;
835 validate(&parsed_key, &signature2, content)?;
836
837 Ok(())
838 }
839
840 #[test]
841 fn test_keydata_display_existing_keys() -> Result<()> {
842 let p256_private_key = "did:key:z42tnbHmmnhF11nwSnp5kQJbcZQw2Vbw5WF3ABDSxPtDgU2o";
844 let k256_private_key = "did:key:z3vLY4nbXy2rV4Qr65gUtfnSF3A8Be7gmYzUiCX6eo2PR1Rt";
845
846 let parsed_p256 = identify_key(p256_private_key)?;
848 let reserialized_p256 = format!("{}", parsed_p256);
849 assert_eq!(p256_private_key, reserialized_p256);
850
851 let parsed_k256 = identify_key(k256_private_key)?;
853 let reserialized_k256 = format!("{}", parsed_k256);
854 assert_eq!(k256_private_key, reserialized_k256);
855
856 Ok(())
857 }
858
859 #[test]
860 fn test_keydata_display_cross_verification() -> Result<()> {
861 let p256_key = generate_key(KeyType::P256Private)?;
863 let k256_key = generate_key(KeyType::K256Private)?;
864
865 let p256_string = format!("{}", p256_key);
867 let k256_string = format!("{}", k256_key);
868
869 assert_ne!(p256_string, k256_string);
871
872 let parsed_p256 = identify_key(&p256_string)?;
874 let parsed_k256 = identify_key(&k256_string)?;
875
876 assert_eq!(*parsed_p256.key_type(), KeyType::P256Private);
878 assert_eq!(*parsed_k256.key_type(), KeyType::K256Private);
879
880 let content = "cross verification test".as_bytes();
882
883 let p256_signature = sign(&p256_key, content)?;
885
886 let k256_signature = sign(&k256_key, content)?;
888
889 assert!(validate(&p256_key, &p256_signature, content).is_ok());
891 assert!(validate(&parsed_p256, &p256_signature, content).is_ok());
892
893 assert!(validate(&k256_key, &k256_signature, content).is_ok());
895 assert!(validate(&parsed_k256, &k256_signature, content).is_ok());
896
897 assert!(validate(&p256_key, &k256_signature, content).is_err());
899 assert!(validate(&k256_key, &p256_signature, content).is_err());
900
901 Ok(())
902 }
903
904 #[test]
905 fn test_keydata_display_format_consistency() -> Result<()> {
906 let p256_key = generate_key(KeyType::P256Private)?;
908 let k256_key = generate_key(KeyType::K256Private)?;
909
910 let p256_string = format!("{}", p256_key);
911 let k256_string = format!("{}", k256_key);
912
913 assert!(p256_string.starts_with("did:key:z"));
915 assert!(k256_string.starts_with("did:key:z"));
916
917 let _parsed_p256 = identify_key(&p256_string)?;
919 let _parsed_k256 = identify_key(&k256_string)?;
920
921 assert!(p256_string.len() > 50 && p256_string.len() < 60);
924
925 assert!(k256_string.len() > 50 && k256_string.len() < 60);
927
928 Ok(())
929 }
930
931 #[test]
932 fn test_complete_workflow_demonstration() -> Result<()> {
933 println!("\n=== KeyData Display Implementation Test ===");
934
935 println!("1. Generating keys...");
937 let p256_key = generate_key(KeyType::P256Private)?;
938 let k256_key = generate_key(KeyType::K256Private)?;
939
940 println!("2. Serializing keys to DID format...");
942 let p256_did = format!("{}", p256_key);
943 let k256_did = format!("{}", k256_key);
944 println!(" P-256 DID: {}", p256_did);
945 println!(" K-256 DID: {}", k256_did);
946
947 println!("3. Parsing DIDs back to KeyData...");
949 let parsed_p256 = identify_key(&p256_did)?;
950 let parsed_k256 = identify_key(&k256_did)?;
951 println!(" P-256 parsed successfully: {:?}", parsed_p256.key_type());
952 println!(" K-256 parsed successfully: {:?}", parsed_k256.key_type());
953
954 println!("4. Verifying round-trip integrity...");
956 assert_eq!(p256_key.bytes(), parsed_p256.bytes());
957 assert_eq!(k256_key.bytes(), parsed_k256.bytes());
958 println!(" Round-trip successful for both keys!");
959
960 println!("5. Testing signing and verification...");
962 let test_data = "Hello AT Protocol!".as_bytes();
963
964 let p256_signature = sign(&p256_key, test_data)?;
966 let k256_signature = sign(&k256_key, test_data)?;
967
968 validate(&parsed_p256, &p256_signature, test_data)?;
970 validate(&parsed_k256, &k256_signature, test_data)?;
971 println!(" Signatures verified successfully with parsed keys!");
972
973 println!("6. Testing cross-curve verification (should fail)...");
975 assert!(validate(&parsed_p256, &k256_signature, test_data).is_err());
976 assert!(validate(&parsed_k256, &p256_signature, test_data).is_err());
977 println!(" Cross-curve verification correctly failed!");
978
979 println!("=== All tests completed successfully! ===\n");
980
981 Ok(())
982 }
983
984 #[test]
985 fn test_to_public_p256() -> Result<()> {
986 let private_key = generate_key(KeyType::P256Private)?;
988
989 let public_key = to_public(&private_key)?;
991
992 assert_eq!(*public_key.key_type(), KeyType::P256Public);
994
995 let content = "test message for p256 public key derivation".as_bytes();
997 let signature = sign(&private_key, content)?;
998
999 validate(&public_key, &signature, content)?;
1001
1002 let public_key_did = format!("{}", public_key);
1004 assert!(public_key_did.starts_with("did:key:"));
1005
1006 let parsed_public_key = identify_key(&public_key_did)?;
1008 assert_eq!(*parsed_public_key.key_type(), KeyType::P256Public);
1009 assert_eq!(public_key.bytes(), parsed_public_key.bytes());
1010
1011 Ok(())
1012 }
1013
1014 #[test]
1015 fn test_to_public_k256() -> Result<()> {
1016 let private_key = generate_key(KeyType::K256Private)?;
1018
1019 let public_key = to_public(&private_key)?;
1021
1022 assert_eq!(*public_key.key_type(), KeyType::K256Public);
1024
1025 let content = "test message for k256 public key derivation".as_bytes();
1027 let signature = sign(&private_key, content)?;
1028
1029 validate(&public_key, &signature, content)?;
1031
1032 let public_key_did = format!("{}", public_key);
1034 assert!(public_key_did.starts_with("did:key:"));
1035
1036 let parsed_public_key = identify_key(&public_key_did)?;
1038 assert_eq!(*parsed_public_key.key_type(), KeyType::K256Public);
1039 assert_eq!(public_key.bytes(), parsed_public_key.bytes());
1040
1041 Ok(())
1042 }
1043
1044 #[test]
1045 fn test_to_public_with_public_keys() -> Result<()> {
1046 let p256_private = generate_key(KeyType::P256Private)?;
1048 let p256_public = to_public(&p256_private)?;
1049
1050 let result = to_public(&p256_public)?;
1052 assert_eq!(*result.key_type(), KeyType::P256Public);
1053 assert_eq!(p256_public.bytes(), result.bytes());
1054
1055 let k256_private = generate_key(KeyType::K256Private)?;
1056 let k256_public = to_public(&k256_private)?;
1057
1058 let result = to_public(&k256_public)?;
1059 assert_eq!(*result.key_type(), KeyType::K256Public);
1060 assert_eq!(k256_public.bytes(), result.bytes());
1061
1062 Ok(())
1063 }
1064
1065 #[test]
1066 fn test_to_public_existing_keys() -> Result<()> {
1067 let p256_private_key = "did:key:z42tj8ZrAza9WkewDELwWMN37TS3coEbGdZh8bp1URfMVnpx";
1069 let k256_private_key = "did:key:z3vLW46Z1UHwnr7vN33MoFt2sBQDQagn9HTvWnsQDHegUixP";
1070
1071 let parsed_p256_private = identify_key(p256_private_key)?;
1073 let parsed_k256_private = identify_key(k256_private_key)?;
1074
1075 let p256_public = to_public(&parsed_p256_private)?;
1077 let k256_public = to_public(&parsed_k256_private)?;
1078
1079 assert_eq!(*p256_public.key_type(), KeyType::P256Public);
1081 assert_eq!(*k256_public.key_type(), KeyType::K256Public);
1082
1083 let content = "test with existing keys".as_bytes();
1085
1086 let p256_signature = sign(&parsed_p256_private, content)?;
1087 let k256_signature = sign(&parsed_k256_private, content)?;
1088
1089 validate(&p256_public, &p256_signature, content)?;
1091 validate(&k256_public, &k256_signature, content)?;
1092
1093 Ok(())
1094 }
1095
1096 #[test]
1097 fn test_to_public_comprehensive_workflow() -> Result<()> {
1098 println!("\n=== Public Key Derivation Test ===");
1099
1100 println!("1. Generating private keys...");
1102 let p256_private = generate_key(KeyType::P256Private)?;
1103 let k256_private = generate_key(KeyType::K256Private)?;
1104
1105 println!("2. Deriving public keys...");
1107 let p256_public = to_public(&p256_private)?;
1108 let k256_public = to_public(&k256_private)?;
1109
1110 println!("3. Serializing keys to DID format...");
1112 let p256_private_did = format!("{}", p256_private);
1113 let p256_public_did = format!("{}", p256_public);
1114 let k256_private_did = format!("{}", k256_private);
1115 let k256_public_did = format!("{}", k256_public);
1116
1117 println!(" P-256 Private: {}", p256_private_did);
1118 println!(" P-256 Public: {}", p256_public_did);
1119 println!(" K-256 Private: {}", k256_private_did);
1120 println!(" K-256 Public: {}", k256_public_did);
1121
1122 assert_ne!(p256_private_did, p256_public_did);
1124 assert_ne!(k256_private_did, k256_public_did);
1125 assert_ne!(p256_public_did, k256_public_did);
1126
1127 println!("4. Testing signature verification...");
1129 let test_data = "Public key derivation test data".as_bytes();
1130
1131 let p256_signature = sign(&p256_private, test_data)?;
1132 let k256_signature = sign(&k256_private, test_data)?;
1133
1134 validate(&p256_public, &p256_signature, test_data)?;
1136 validate(&k256_public, &k256_signature, test_data)?;
1137 println!(" Signatures verified successfully with derived public keys!");
1138
1139 println!("5. Testing DID round-trip with public keys...");
1141 let parsed_p256_public = identify_key(&p256_public_did)?;
1142 let parsed_k256_public = identify_key(&k256_public_did)?;
1143
1144 validate(&parsed_p256_public, &p256_signature, test_data)?;
1145 validate(&parsed_k256_public, &k256_signature, test_data)?;
1146 println!(" Parsed public keys also verify signatures correctly!");
1147
1148 println!("=== Public key derivation workflow completed successfully! ===\n");
1149
1150 Ok(())
1151 }
1152
1153 #[test]
1154 fn test_to_public_key_properties() -> Result<()> {
1155 let p256_private = generate_key(KeyType::P256Private)?;
1157 let k256_private = generate_key(KeyType::K256Private)?;
1158
1159 let p256_public = to_public(&p256_private)?;
1160 let k256_public = to_public(&k256_private)?;
1161
1162 assert!(p256_public.bytes().len() == 65 || p256_public.bytes().len() == 33);
1165
1166 assert!(k256_public.bytes().len() == 65 || k256_public.bytes().len() == 33);
1168
1169 let p256_public2 = to_public(&p256_private)?;
1171 let k256_public2 = to_public(&k256_private)?;
1172
1173 assert_eq!(p256_public.bytes(), p256_public2.bytes());
1174 assert_eq!(k256_public.bytes(), k256_public2.bytes());
1175
1176 Ok(())
1177 }
1178
1179 #[test]
1180 fn test_to_public_with_existing_public_keys() -> Result<()> {
1181 let p256_public_key = "did:key:zDnaeXduWbJ1b1Kgjf3uCdCpMDF1LEDizUiyxAxGwerou3Nh2";
1183 let k256_public_key = "did:key:zQ3shNzMp4oaaQ1gQRzCxMGXFrSW3NEM1M9T6KCY9eA7HhyEA";
1184
1185 let parsed_p256_public = identify_key(p256_public_key)?;
1187 let parsed_k256_public = identify_key(k256_public_key)?;
1188
1189 assert_eq!(*parsed_p256_public.key_type(), KeyType::P256Public);
1191 assert_eq!(*parsed_k256_public.key_type(), KeyType::K256Public);
1192
1193 let same_p256_public = to_public(&parsed_p256_public)?;
1195 let same_k256_public = to_public(&parsed_k256_public)?;
1196
1197 assert_eq!(*same_p256_public.key_type(), KeyType::P256Public);
1199 assert_eq!(*same_k256_public.key_type(), KeyType::K256Public);
1200 assert_eq!(parsed_p256_public.bytes(), same_p256_public.bytes());
1201 assert_eq!(parsed_k256_public.bytes(), same_k256_public.bytes());
1202
1203 assert_eq!(format!("{}", same_p256_public), p256_public_key);
1205 assert_eq!(format!("{}", same_k256_public), k256_public_key);
1206
1207 Ok(())
1208 }
1209
1210 #[test]
1213 fn test_generate_key_p384_private() -> Result<()> {
1214 let key_data = generate_key(KeyType::P384Private)?;
1215 assert_eq!(*key_data.key_type(), KeyType::P384Private);
1216 assert_eq!(key_data.bytes().len(), 48); let content = "test content for p384".as_bytes();
1220 let signature = sign(&key_data, content)?;
1221 let validation = validate(&key_data, &signature, content);
1222 assert!(validation.is_ok());
1223
1224 Ok(())
1225 }
1226
1227 #[test]
1228 fn test_generate_key_p384_public_not_supported() {
1229 let result = generate_key(KeyType::P384Public);
1230 assert!(matches!(
1231 result,
1232 Err(KeyError::PublicKeyGenerationNotSupported)
1233 ));
1234 }
1235
1236 #[test]
1237 fn test_generate_key_p384_uniqueness() -> Result<()> {
1238 let key1 = generate_key(KeyType::P384Private)?;
1240 let key2 = generate_key(KeyType::P384Private)?;
1241 assert_ne!(key1.bytes(), key2.bytes());
1242
1243 Ok(())
1244 }
1245
1246 #[test]
1247 fn test_sign_and_validate_p384() -> Result<()> {
1248 let private_key = generate_key(KeyType::P384Private)?;
1250
1251 let public_key = to_public(&private_key)?;
1253 assert_eq!(*public_key.key_type(), KeyType::P384Public);
1254
1255 let content = "hello world p384 test".as_bytes();
1256
1257 let signature = sign(&private_key, content)?;
1259 assert!(!signature.is_empty());
1260
1261 validate(&public_key, &signature, content)?;
1263
1264 validate(&private_key, &signature, content)?;
1266
1267 let wrong_content = "wrong content".as_bytes();
1269 assert!(validate(&public_key, &signature, wrong_content).is_err());
1270
1271 Ok(())
1272 }
1273
1274 #[test]
1275 fn test_p384_keydata_display_round_trip() -> Result<()> {
1276 let original_key = generate_key(KeyType::P384Private)?;
1278
1279 let key_string = format!("{}", original_key);
1281
1282 assert!(key_string.starts_with("did:key:"));
1284
1285 let parsed_key = identify_key(&key_string)?;
1287
1288 assert_eq!(original_key.key_type(), parsed_key.key_type());
1290
1291 assert_eq!(original_key.bytes(), parsed_key.bytes());
1293
1294 let content = "test message for p384 round trip".as_bytes();
1296
1297 let signature = sign(&original_key, content)?;
1299
1300 validate(&original_key, &signature, content)?;
1302
1303 validate(&parsed_key, &signature, content)?;
1305
1306 let signature2 = sign(&parsed_key, content)?;
1308
1309 validate(&original_key, &signature2, content)?;
1311 validate(&parsed_key, &signature2, content)?;
1312
1313 Ok(())
1314 }
1315
1316 #[test]
1317 fn test_p384_to_public_key_derivation() -> Result<()> {
1318 let private_key = generate_key(KeyType::P384Private)?;
1320
1321 let public_key = to_public(&private_key)?;
1323
1324 assert_eq!(*public_key.key_type(), KeyType::P384Public);
1326
1327 let content = "test message for p384 public key derivation".as_bytes();
1329 let signature = sign(&private_key, content)?;
1330
1331 validate(&public_key, &signature, content)?;
1333
1334 let public_key_did = format!("{}", public_key);
1336 assert!(public_key_did.starts_with("did:key:"));
1337
1338 let parsed_public_key = identify_key(&public_key_did)?;
1340 assert_eq!(*parsed_public_key.key_type(), KeyType::P384Public);
1341 assert_eq!(public_key.bytes(), parsed_public_key.bytes());
1342
1343 let result = to_public(&public_key)?;
1345 assert_eq!(*result.key_type(), KeyType::P384Public);
1346 assert_eq!(public_key.bytes(), result.bytes());
1347
1348 Ok(())
1349 }
1350
1351 #[test]
1352 fn test_p384_jwk_conversion() -> Result<()> {
1353 let private_key = generate_key(KeyType::P384Private)?;
1355 let public_key = to_public(&private_key)?;
1356
1357 let private_jwk: Result<elliptic_curve::JwkEcKey, _> = (&private_key).try_into();
1359 assert!(private_jwk.is_ok());
1360
1361 let public_jwk: Result<elliptic_curve::JwkEcKey, _> = (&public_key).try_into();
1363 assert!(public_jwk.is_ok());
1364
1365 Ok(())
1366 }
1367
1368 #[test]
1369 fn test_p384_key_properties() -> Result<()> {
1370 let private_key = generate_key(KeyType::P384Private)?;
1372 let public_key = to_public(&private_key)?;
1373
1374 assert_eq!(private_key.bytes().len(), 48);
1376
1377 assert!(public_key.bytes().len() == 97 || public_key.bytes().len() == 49);
1381
1382 let public_key2 = to_public(&private_key)?;
1384 assert_eq!(public_key.bytes(), public_key2.bytes());
1385
1386 Ok(())
1387 }
1388
1389 #[test]
1390 fn test_p384_cross_curve_verification_fails() -> Result<()> {
1391 let p256_key = generate_key(KeyType::P256Private)?;
1393 let p384_key = generate_key(KeyType::P384Private)?;
1394 let k256_key = generate_key(KeyType::K256Private)?;
1395
1396 let p256_public = to_public(&p256_key)?;
1398 let p384_public = to_public(&p384_key)?;
1399 let k256_public = to_public(&k256_key)?;
1400
1401 let content = "cross curve verification test".as_bytes();
1402
1403 let p256_signature = sign(&p256_key, content)?;
1405 let p384_signature = sign(&p384_key, content)?;
1406 let k256_signature = sign(&k256_key, content)?;
1407
1408 validate(&p256_public, &p256_signature, content)?;
1410 validate(&p384_public, &p384_signature, content)?;
1411 validate(&k256_public, &k256_signature, content)?;
1412
1413 assert!(validate(&p256_public, &p384_signature, content).is_err());
1415 assert!(validate(&p384_public, &p256_signature, content).is_err());
1416 assert!(validate(&k256_public, &p384_signature, content).is_err());
1417 assert!(validate(&p384_public, &k256_signature, content).is_err());
1418
1419 Ok(())
1420 }
1421
1422 #[test]
1423 fn test_p384_sign_with_public_key_fails() {
1424 let private_key = generate_key(KeyType::P384Private).unwrap();
1425 let public_key = to_public(&private_key).unwrap();
1426
1427 let content = "test content".as_bytes();
1428
1429 let result = sign(&public_key, content);
1431 assert!(matches!(
1432 result,
1433 Err(KeyError::PrivateKeyRequiredForSignature)
1434 ));
1435 }
1436
1437 #[test]
1438 fn test_p384_comprehensive_workflow() -> Result<()> {
1439 println!("\n=== P-384 Comprehensive Workflow Test ===");
1440
1441 println!("1. Generating P-384 private key...");
1443 let private_key = generate_key(KeyType::P384Private)?;
1444 assert_eq!(*private_key.key_type(), KeyType::P384Private);
1445 assert_eq!(private_key.bytes().len(), 48);
1446
1447 println!("2. Deriving P-384 public key...");
1449 let public_key = to_public(&private_key)?;
1450 assert_eq!(*public_key.key_type(), KeyType::P384Public);
1451
1452 println!("3. Serializing keys to DID format...");
1454 let private_did = format!("{}", private_key);
1455 let public_did = format!("{}", public_key);
1456 println!(" P-384 Private: {}", private_did);
1457 println!(" P-384 Public: {}", public_did);
1458
1459 assert!(private_did.starts_with("did:key:"));
1460 assert!(public_did.starts_with("did:key:"));
1461 assert_ne!(private_did, public_did);
1462
1463 println!("4. Parsing DIDs back to KeyData...");
1465 let parsed_private = identify_key(&private_did)?;
1466 let parsed_public = identify_key(&public_did)?;
1467
1468 assert_eq!(*parsed_private.key_type(), KeyType::P384Private);
1469 assert_eq!(*parsed_public.key_type(), KeyType::P384Public);
1470
1471 println!("5. Verifying round-trip integrity...");
1473 assert_eq!(private_key.bytes(), parsed_private.bytes());
1474 assert_eq!(public_key.bytes(), parsed_public.bytes());
1475
1476 println!("6. Testing signing and verification...");
1478 let test_data = "P-384 comprehensive test data".as_bytes();
1479
1480 let signature = sign(&private_key, test_data)?;
1482
1483 validate(&private_key, &signature, test_data)?;
1485 validate(&public_key, &signature, test_data)?;
1486 validate(&parsed_private, &signature, test_data)?;
1487 validate(&parsed_public, &signature, test_data)?;
1488
1489 println!("7. Testing JWK conversion...");
1491 let private_jwk: elliptic_curve::JwkEcKey = (&private_key).try_into()?;
1492 let public_jwk: elliptic_curve::JwkEcKey = (&public_key).try_into()?;
1493
1494 assert_eq!(private_jwk.crv(), "P-384");
1495 assert_eq!(public_jwk.crv(), "P-384");
1496
1497 println!("=== P-384 comprehensive workflow completed successfully! ===\n");
1498
1499 Ok(())
1500 }
1501
1502 #[test]
1503 fn test_p384_multicodec_prefix_identification() -> Result<()> {
1504 let private_key = generate_key(KeyType::P384Private)?;
1506 let public_key = to_public(&private_key)?;
1507
1508 let private_did = format!("{}", private_key);
1510 let public_did = format!("{}", public_key);
1511
1512 let parsed_private = identify_key(&private_did)?;
1514 let parsed_public = identify_key(&public_did)?;
1515
1516 assert_eq!(*parsed_private.key_type(), KeyType::P384Private);
1517 assert_eq!(*parsed_public.key_type(), KeyType::P384Public);
1518
1519 let private_value = did_method_key_value(&private_did);
1521 let public_value = did_method_key_value(&public_did);
1522
1523 let (_, private_decoded) = multibase::decode(private_value)?;
1524 let (_, public_decoded) = multibase::decode(public_value)?;
1525
1526 assert_eq!(&private_decoded[..2], &[0x13, 0x01]); assert_eq!(&public_decoded[..2], &[0x12, 0x00]); Ok(())
1531 }
1532}