1use anyhow::Result;
57use ecdsa::signature::Signer;
58use elliptic_curve::JwkEcKey;
59use elliptic_curve::sec1::ToEncodedPoint;
60
61use crate::errors::KeyError;
62
63#[derive(Debug, Clone, PartialEq)]
65pub enum KeyType {
66 P256Public,
69
70 P256Private,
73
74 P384Public,
77
78 P384Private,
81
82 K256Public,
85
86 K256Private,
89}
90
91#[derive(Debug, Clone)]
103pub struct KeyData(pub KeyType, pub Vec<u8>);
104
105impl KeyData {
106 pub fn new(key_type: KeyType, bytes: Vec<u8>) -> Self {
108 KeyData(key_type, bytes)
109 }
110
111 pub fn key_type(&self) -> &KeyType {
113 &self.0
114 }
115
116 pub fn bytes(&self) -> &[u8] {
118 &self.1
119 }
120
121 pub fn into_parts(self) -> (KeyType, Vec<u8>) {
123 (self.0, self.1)
124 }
125}
126
127impl std::fmt::Display for KeyData {
128 fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
129 let prefix = match self.key_type() {
131 KeyType::P256Private => [0x86, 0x26],
132 KeyType::P256Public => [0x80, 0x24],
133 KeyType::P384Private => [0x13, 0x01],
134 KeyType::P384Public => [0x12, 0x00],
135 KeyType::K256Private => [0x81, 0x26],
136 KeyType::K256Public => [0xe7, 0x01],
137 };
138
139 let mut multicodec_bytes = Vec::with_capacity(2 + self.bytes().len());
141 multicodec_bytes.extend_from_slice(&prefix);
142 multicodec_bytes.extend_from_slice(self.bytes());
143
144 let multibase_encoded = multibase::encode(multibase::Base::Base58Btc, &multicodec_bytes);
146
147 write!(f, "did:key:{}", multibase_encoded)
149 }
150}
151
152#[async_trait::async_trait]
157pub trait KeyProvider: Send + Sync {
158 async fn get_private_key_by_id(&self, key_id: &str) -> Result<Option<KeyData>>;
168}
169
170const DID_METHOD_KEY_PREFIX: &str = "did:key:";
172
173pub fn did_method_key_value(key: &str) -> &str {
177 match key.strip_prefix(DID_METHOD_KEY_PREFIX) {
178 Some(value) => value,
179 None => key,
180 }
181}
182
183pub fn identify_key(key: &str) -> Result<KeyData, KeyError> {
187 let stripped_key = did_method_key_value(key);
188 let (_, decoded_multibase_key) =
189 multibase::decode(stripped_key).map_err(|error| KeyError::DecodeError { error })?;
190
191 if decoded_multibase_key.len() < 3 {
192 return Err(KeyError::UnidentifiedKeyType);
193 }
194
195 match &decoded_multibase_key[..2] {
207 [0x86, 0x26] => Ok(KeyData::new(
209 KeyType::P256Private,
210 decoded_multibase_key[2..].to_vec(),
211 )),
212
213 [0x80, 0x24] => Ok(KeyData::new(
215 KeyType::P256Public,
216 decoded_multibase_key[2..].to_vec(),
217 )),
218
219 [0x13, 0x01] => Ok(KeyData::new(
221 KeyType::P384Private,
222 decoded_multibase_key[2..].to_vec(),
223 )),
224
225 [0x12, 0x00] => Ok(KeyData::new(
227 KeyType::P384Public,
228 decoded_multibase_key[2..].to_vec(),
229 )),
230
231 [0x81, 0x26] => Ok(KeyData::new(
233 KeyType::K256Private,
234 decoded_multibase_key[2..].to_vec(),
235 )),
236
237 [0xe7, 0x01] => Ok(KeyData::new(
239 KeyType::K256Public,
240 decoded_multibase_key[2..].to_vec(),
241 )),
242
243 _ => Err(KeyError::InvalidMultibaseKeyType {
244 prefix: decoded_multibase_key[..2].to_vec(),
245 }),
246 }
247}
248
249pub fn validate(key_data: &KeyData, signature: &[u8], content: &[u8]) -> Result<(), KeyError> {
253 match *key_data.key_type() {
254 KeyType::P256Public => {
255 let signature = ecdsa::Signature::from_slice(signature)
256 .map_err(|error| KeyError::SignatureError { error })?;
257 let verifying_key = p256::ecdsa::VerifyingKey::from_sec1_bytes(key_data.bytes())
258 .map_err(|error| KeyError::P256Error { error })?;
259 ecdsa::signature::Verifier::verify(&verifying_key, content, &signature)
260 .map_err(|error| KeyError::ECDSAError { error })
261 }
262 KeyType::P384Public => {
263 let signature = ecdsa::Signature::from_slice(signature)
264 .map_err(|error| KeyError::SignatureError { error })?;
265 let verifying_key = p384::ecdsa::VerifyingKey::from_sec1_bytes(key_data.bytes())
266 .map_err(|error| KeyError::P384Error { error })?;
267 ecdsa::signature::Verifier::verify(&verifying_key, content, &signature)
268 .map_err(|error| KeyError::ECDSAError { error })
269 }
270 KeyType::K256Public => {
271 let signature = ecdsa::Signature::from_slice(signature)
272 .map_err(|error| KeyError::SignatureError { error })?;
273 let verifying_key = k256::ecdsa::VerifyingKey::from_sec1_bytes(key_data.bytes())
274 .map_err(|error| KeyError::K256Error { error })?;
275 ecdsa::signature::Verifier::verify(&verifying_key, content, &signature)
276 .map_err(|error| KeyError::ECDSAError { error })
277 }
278 KeyType::P256Private => {
279 let signature = ecdsa::Signature::from_slice(signature)
280 .map_err(|error| KeyError::SignatureError { error })?;
281 let secret_key: p256::SecretKey =
282 ecdsa::elliptic_curve::SecretKey::from_slice(key_data.bytes())
283 .map_err(|error| KeyError::SecretKeyError { error })?;
284 let public_key = secret_key.public_key();
285 let verifying_key = p256::ecdsa::VerifyingKey::from(public_key);
286 ecdsa::signature::Verifier::verify(&verifying_key, content, &signature)
287 .map_err(|error| KeyError::ECDSAError { error })
288 }
289 KeyType::P384Private => {
290 let signature = ecdsa::Signature::from_slice(signature)
291 .map_err(|error| KeyError::SignatureError { error })?;
292 let secret_key: p384::SecretKey =
293 ecdsa::elliptic_curve::SecretKey::from_slice(key_data.bytes())
294 .map_err(|error| KeyError::SecretKeyError { error })?;
295 let public_key = secret_key.public_key();
296 let verifying_key = p384::ecdsa::VerifyingKey::from(public_key);
297 ecdsa::signature::Verifier::verify(&verifying_key, content, &signature)
298 .map_err(|error| KeyError::ECDSAError { error })
299 }
300 KeyType::K256Private => {
301 let signature = ecdsa::Signature::from_slice(signature)
302 .map_err(|error| KeyError::SignatureError { error })?;
303 let secret_key: k256::SecretKey =
304 ecdsa::elliptic_curve::SecretKey::from_slice(key_data.bytes())
305 .map_err(|error| KeyError::SecretKeyError { error })?;
306 let public_key = secret_key.public_key();
307 let verifying_key = k256::ecdsa::VerifyingKey::from(public_key);
308 ecdsa::signature::Verifier::verify(&verifying_key, content, &signature)
309 .map_err(|error| KeyError::ECDSAError { error })
310 }
311 }
312}
313
314pub fn sign(key_data: &KeyData, content: &[u8]) -> Result<Vec<u8>, KeyError> {
318 match *key_data.key_type() {
319 KeyType::K256Public | KeyType::P256Public | KeyType::P384Public => {
320 Err(KeyError::PrivateKeyRequiredForSignature)
321 }
322 KeyType::P256Private => {
323 let secret_key: p256::SecretKey =
324 ecdsa::elliptic_curve::SecretKey::from_slice(key_data.bytes())
325 .map_err(|error| KeyError::SecretKeyError { error })?;
326 let signing_key: p256::ecdsa::SigningKey = p256::ecdsa::SigningKey::from(secret_key);
327 let signature: p256::ecdsa::Signature = signing_key
328 .try_sign(content)
329 .map_err(|error| KeyError::ECDSAError { error })?;
330 Ok(signature.to_vec())
331 }
332 KeyType::P384Private => {
333 let secret_key: p384::SecretKey =
334 ecdsa::elliptic_curve::SecretKey::from_slice(key_data.bytes())
335 .map_err(|error| KeyError::SecretKeyError { error })?;
336 let signing_key: p384::ecdsa::SigningKey = p384::ecdsa::SigningKey::from(secret_key);
337 let signature: p384::ecdsa::Signature = signing_key
338 .try_sign(content)
339 .map_err(|error| KeyError::ECDSAError { error })?;
340 Ok(signature.to_vec())
341 }
342 KeyType::K256Private => {
343 let secret_key: k256::SecretKey =
344 ecdsa::elliptic_curve::SecretKey::from_slice(key_data.bytes())
345 .map_err(|error| KeyError::SecretKeyError { error })?;
346 let signing_key: k256::ecdsa::SigningKey = k256::ecdsa::SigningKey::from(secret_key);
347 let signature: k256::ecdsa::Signature = signing_key
348 .try_sign(content)
349 .map_err(|error| KeyError::ECDSAError { error })?;
350 Ok(signature.to_vec())
351 }
352 }
353}
354
355impl TryInto<JwkEcKey> for &KeyData {
356 type Error = KeyError;
357
358 fn try_into(self) -> Result<JwkEcKey, Self::Error> {
359 match *self.key_type() {
360 KeyType::P256Public => {
361 let public_key = p256::PublicKey::from_sec1_bytes(self.bytes()).map_err(|e| {
362 KeyError::JWKConversionFailed {
363 error: format!("Failed to parse P256 public key: {}", e),
364 }
365 })?;
366 Ok(public_key.to_jwk())
367 }
368 KeyType::P256Private => {
369 let secret_key = p256::SecretKey::from_slice(self.bytes())
370 .map_err(|error| KeyError::SecretKeyError { error })?;
371 Ok(secret_key.to_jwk())
372 }
373 KeyType::P384Public => {
374 let public_key = p384::PublicKey::from_sec1_bytes(self.bytes()).map_err(|e| {
375 KeyError::JWKConversionFailed {
376 error: format!("Failed to parse P384 public key: {}", e),
377 }
378 })?;
379 Ok(public_key.to_jwk())
380 }
381 KeyType::P384Private => {
382 let secret_key = p384::SecretKey::from_slice(self.bytes())
383 .map_err(|error| KeyError::SecretKeyError { error })?;
384 Ok(secret_key.to_jwk())
385 }
386 KeyType::K256Public => {
387 let public_key = k256::PublicKey::from_sec1_bytes(self.bytes()).map_err(|e| {
388 KeyError::JWKConversionFailed {
389 error: format!("Failed to parse k256 public key: {}", e),
390 }
391 })?;
392 Ok(public_key.to_jwk())
393 }
394 KeyType::K256Private => {
395 let secret_key = k256::SecretKey::from_slice(self.bytes())
396 .map_err(|error| KeyError::SecretKeyError { error })?;
397 Ok(secret_key.to_jwk())
398 }
399 }
400 }
401}
402
403pub fn generate_key(key_type: KeyType) -> Result<KeyData, KeyError> {
424 match key_type {
425 KeyType::P256Private => {
426 let secret_key = p256::SecretKey::random(&mut rand::thread_rng());
427 Ok(KeyData::new(
428 KeyType::P256Private,
429 secret_key.to_bytes().to_vec(),
430 ))
431 }
432 KeyType::P384Private => {
433 let secret_key = p384::SecretKey::random(&mut rand::thread_rng());
434 Ok(KeyData::new(
435 KeyType::P384Private,
436 secret_key.to_bytes().to_vec(),
437 ))
438 }
439 KeyType::K256Private => {
440 let secret_key = k256::SecretKey::random(&mut rand::thread_rng());
441 Ok(KeyData::new(
442 KeyType::K256Private,
443 secret_key.to_bytes().to_vec(),
444 ))
445 }
446 KeyType::P256Public => Err(KeyError::PublicKeyGenerationNotSupported),
447 KeyType::P384Public => Err(KeyError::PublicKeyGenerationNotSupported),
448 KeyType::K256Public => Err(KeyError::PublicKeyGenerationNotSupported),
449 }
450}
451
452pub fn to_public(key_data: &KeyData) -> Result<KeyData, KeyError> {
477 match key_data.key_type() {
478 KeyType::P256Private => {
479 let secret_key: p256::SecretKey =
480 ecdsa::elliptic_curve::SecretKey::from_slice(key_data.bytes())
481 .map_err(|error| KeyError::SecretKeyError { error })?;
482 let public_key = secret_key.public_key();
483 let compressed = public_key.to_encoded_point(true);
484 let public_key_bytes = compressed.to_bytes();
485 Ok(KeyData::new(KeyType::P256Public, public_key_bytes.to_vec()))
486 }
487 KeyType::P384Private => {
488 let secret_key: p384::SecretKey =
489 ecdsa::elliptic_curve::SecretKey::from_slice(key_data.bytes())
490 .map_err(|error| KeyError::SecretKeyError { error })?;
491 let public_key = secret_key.public_key();
492 let compressed = public_key.to_encoded_point(true);
493 let public_key_bytes = compressed.to_bytes();
494 Ok(KeyData::new(KeyType::P384Public, public_key_bytes.to_vec()))
495 }
496 KeyType::K256Private => {
497 let secret_key: k256::SecretKey =
498 ecdsa::elliptic_curve::SecretKey::from_slice(key_data.bytes())
499 .map_err(|error| KeyError::SecretKeyError { error })?;
500 let public_key = secret_key.public_key();
501 let public_key_bytes = public_key.to_sec1_bytes();
502 Ok(KeyData::new(KeyType::K256Public, public_key_bytes.to_vec()))
503 }
504 KeyType::P256Public | KeyType::P384Public | KeyType::K256Public => {
505 Ok(key_data.clone())
507 }
508 }
509}
510
511#[cfg(test)]
512mod tests {
513 use super::*;
514
515 #[test]
516 fn test_identify_key() {
517 for _ in 0..4 {
519 let result = identify_key("z3vLVqpQveB3w8G6MQsLVseJ1Z2E1JyQzUj6WgRYNNwB9jdE");
520 assert!(result.is_ok());
521 let key_data = result.unwrap();
522 assert_eq!(*key_data.key_type(), KeyType::K256Private);
523 }
524
525 assert!(matches!(
527 identify_key("asdasdasd"),
528 Err(KeyError::DecodeError { .. })
529 ));
530
531 assert!(matches!(
533 identify_key("z4vLVqpQveB3w8G6MQsLVseJ1Z2E1JyQzUj6WgRYNNwB9jdE"),
534 Err(KeyError::InvalidMultibaseKeyType { .. })
535 ));
536 }
537
538 #[test]
539 fn test_sign_p256() -> Result<()> {
540 let private_key = "did:key:z42tnbHmmnhF11nwSnp5kQJbcZQw2Vbw5WF3ABDSxPtDgU2o";
541 let public_key = "did:key:zDnaeXduWbJ1b1Kgjf3uCdCpMDF1LEDizUiyxAxGwerou3Nh2";
542
543 let private_key_data = identify_key(private_key);
544 assert!(private_key_data.is_ok());
545 let private_key_data = private_key_data.unwrap();
546 assert_eq!(*private_key_data.key_type(), KeyType::P256Private);
547
548 let public_key_data = identify_key(public_key);
549 assert!(public_key_data.is_ok());
550 let public_key_data = public_key_data.unwrap();
551 assert_eq!(*public_key_data.key_type(), KeyType::P256Public);
552
553 let content = "hello world".as_bytes();
554
555 let signature = sign(&private_key_data, content);
556 assert!(signature.is_ok());
557 let signature = signature.unwrap();
558
559 {
560 let validation = validate(&public_key_data, &signature, content);
561 assert!(validation.is_ok());
562 }
563 {
564 let validation = validate(&private_key_data, &signature, content);
565 assert!(validation.is_ok());
566 }
567 Ok(())
568 }
569
570 #[test]
571 fn test_sign_k256() -> Result<()> {
572 let private_key = "did:key:z3vLY4nbXy2rV4Qr65gUtfnSF3A8Be7gmYzUiCX6eo2PR1Rt";
573 let public_key = "did:key:zQ3shNzMp4oaaQ1gQRzCxMGXFrSW3NEM1M9T6KCY9eA7HhyEA";
574
575 let private_key_data = identify_key(private_key);
576 assert!(private_key_data.is_ok());
577 let private_key_data = private_key_data.unwrap();
578 assert_eq!(*private_key_data.key_type(), KeyType::K256Private);
579
580 let public_key_data = identify_key(public_key);
581 assert!(public_key_data.is_ok());
582 let public_key_data = public_key_data.unwrap();
583 assert_eq!(*public_key_data.key_type(), KeyType::K256Public);
584
585 let content = "hello world".as_bytes();
586
587 let signature = sign(&private_key_data, content);
588 assert!(signature.is_ok());
589 let signature = signature.unwrap();
590
591 {
592 let validation = validate(&public_key_data, &signature, content);
593 assert!(validation.is_ok());
594 }
595 {
596 let validation = validate(&private_key_data, &signature, content);
597 assert!(validation.is_ok());
598 }
599 Ok(())
600 }
601
602 #[test]
603 fn test_to_jwk_p256() -> Result<()> {
604 let private_key = "did:key:z42tnbHmmnhF11nwSnp5kQJbcZQw2Vbw5WF3ABDSxPtDgU2o";
605 let public_key = "did:key:zDnaeXduWbJ1b1Kgjf3uCdCpMDF1LEDizUiyxAxGwerou3Nh2";
606
607 let private_key_data = identify_key(private_key);
608 assert!(private_key_data.is_ok());
609 let private_key_data = private_key_data.unwrap();
610 assert_eq!(*private_key_data.key_type(), KeyType::P256Private);
611
612 let public_key_data = identify_key(public_key);
613 assert!(public_key_data.is_ok());
614 let public_key_data = public_key_data.unwrap();
615 assert_eq!(*public_key_data.key_type(), KeyType::P256Public);
616
617 let private_jwk: Result<elliptic_curve::JwkEcKey, _> = (&private_key_data).try_into();
619 assert!(private_jwk.is_ok());
620
621 let public_jwk: Result<elliptic_curve::JwkEcKey, _> = (&public_key_data).try_into();
623 assert!(public_jwk.is_ok());
624
625 Ok(())
626 }
627
628 #[test]
629 fn test_to_jwk_k256_supported() -> Result<()> {
630 let private_key = "did:key:z3vLY4nbXy2rV4Qr65gUtfnSF3A8Be7gmYzUiCX6eo2PR1Rt";
631 let public_key = "did:key:zQ3shNzMp4oaaQ1gQRzCxMGXFrSW3NEM1M9T6KCY9eA7HhyEA";
632
633 let private_key_data = identify_key(private_key);
634 assert!(private_key_data.is_ok());
635 let private_key_data = private_key_data.unwrap();
636 assert_eq!(*private_key_data.key_type(), KeyType::K256Private);
637
638 let public_key_data = identify_key(public_key);
639 assert!(public_key_data.is_ok());
640 let public_key_data = public_key_data.unwrap();
641 assert_eq!(*public_key_data.key_type(), KeyType::K256Public);
642
643 let private_jwk: Result<elliptic_curve::JwkEcKey, _> = (&private_key_data).try_into();
645 assert!(private_jwk.is_ok());
646 let private_jwk = private_jwk.unwrap();
647 assert_eq!(private_jwk.crv(), "secp256k1");
648
649 let public_jwk: Result<elliptic_curve::JwkEcKey, _> = (&public_key_data).try_into();
650 assert!(public_jwk.is_ok());
651 let public_jwk = public_jwk.unwrap();
652 assert_eq!(public_jwk.crv(), "secp256k1");
653
654 Ok(())
655 }
656
657 #[test]
658 fn test_try_into_jwk_keydata() -> Result<()> {
659 let private_key = "did:key:z42tnbHmmnhF11nwSnp5kQJbcZQw2Vbw5WF3ABDSxPtDgU2o";
660 let public_key = "did:key:zDnaeXduWbJ1b1Kgjf3uCdCpMDF1LEDizUiyxAxGwerou3Nh2";
661
662 let private_key_data = identify_key(private_key);
663 assert!(private_key_data.is_ok());
664 let private_key_data = private_key_data.unwrap();
665 assert_eq!(*private_key_data.key_type(), KeyType::P256Private);
666
667 let public_key_data = identify_key(public_key);
668 assert!(public_key_data.is_ok());
669 let public_key_data = public_key_data.unwrap();
670 assert_eq!(*public_key_data.key_type(), KeyType::P256Public);
671
672 let private_jwk: Result<JwkEcKey, KeyError> = (&private_key_data).try_into();
674 assert!(private_jwk.is_ok());
675
676 let public_jwk: Result<JwkEcKey, KeyError> = (&public_key_data).try_into();
677 assert!(public_jwk.is_ok());
678
679 Ok(())
680 }
681
682 #[test]
683 fn test_generate_key_p256_private() -> Result<()> {
684 let key_data = generate_key(KeyType::P256Private)?;
685 assert_eq!(*key_data.key_type(), KeyType::P256Private);
686 assert_eq!(key_data.bytes().len(), 32); let content = "test content".as_bytes();
690 let signature = sign(&key_data, content)?;
691 let validation = validate(&key_data, &signature, content);
692 assert!(validation.is_ok());
693
694 Ok(())
695 }
696
697 #[test]
698 fn test_generate_key_k256_private() -> Result<()> {
699 let key_data = generate_key(KeyType::K256Private)?;
700 assert_eq!(*key_data.key_type(), KeyType::K256Private);
701 assert_eq!(key_data.bytes().len(), 32); let content = "test content".as_bytes();
705 let signature = sign(&key_data, content)?;
706 let validation = validate(&key_data, &signature, content);
707 assert!(validation.is_ok());
708
709 Ok(())
710 }
711
712 #[test]
713 fn test_generate_key_public_not_supported() {
714 let result = generate_key(KeyType::P256Public);
715 assert!(matches!(
716 result,
717 Err(KeyError::PublicKeyGenerationNotSupported)
718 ));
719
720 let result = generate_key(KeyType::K256Public);
721 assert!(matches!(
722 result,
723 Err(KeyError::PublicKeyGenerationNotSupported)
724 ));
725 }
726
727 #[test]
728 fn test_generate_key_uniqueness() -> Result<()> {
729 let key1 = generate_key(KeyType::P256Private)?;
731 let key2 = generate_key(KeyType::P256Private)?;
732 assert_ne!(key1.bytes(), key2.bytes());
733
734 let key3 = generate_key(KeyType::K256Private)?;
735 let key4 = generate_key(KeyType::K256Private)?;
736 assert_ne!(key3.bytes(), key4.bytes());
737
738 Ok(())
739 }
740
741 #[test]
742 fn test_keydata_display_p256_private() -> Result<()> {
743 let original_key = generate_key(KeyType::P256Private)?;
745
746 let key_string = format!("{}", original_key);
748
749 assert!(key_string.starts_with("did:key:"));
751
752 let parsed_key = identify_key(&key_string)?;
754
755 assert_eq!(original_key.key_type(), parsed_key.key_type());
757
758 assert_eq!(original_key.bytes(), parsed_key.bytes());
760
761 let content = "test message for p256".as_bytes();
763
764 let signature = sign(&original_key, content)?;
766
767 validate(&original_key, &signature, content)?;
769
770 validate(&parsed_key, &signature, content)?;
772
773 let signature2 = sign(&parsed_key, content)?;
775
776 validate(&original_key, &signature2, content)?;
779 validate(&parsed_key, &signature2, content)?;
780
781 Ok(())
782 }
783
784 #[test]
785 fn test_keydata_display_k256_private() -> Result<()> {
786 let original_key = generate_key(KeyType::K256Private)?;
788
789 let key_string = format!("{}", original_key);
791
792 assert!(key_string.starts_with("did:key:"));
794
795 let parsed_key = identify_key(&key_string)?;
797
798 assert_eq!(original_key.key_type(), parsed_key.key_type());
800
801 assert_eq!(original_key.bytes(), parsed_key.bytes());
803
804 let content = "test message for k256".as_bytes();
806
807 let signature = sign(&original_key, content)?;
809
810 validate(&original_key, &signature, content)?;
812
813 validate(&parsed_key, &signature, content)?;
815
816 let signature2 = sign(&parsed_key, content)?;
818
819 validate(&original_key, &signature2, content)?;
821 validate(&parsed_key, &signature2, content)?;
822
823 Ok(())
824 }
825
826 #[test]
827 fn test_keydata_display_existing_keys() -> Result<()> {
828 let p256_private_key = "did:key:z42tnbHmmnhF11nwSnp5kQJbcZQw2Vbw5WF3ABDSxPtDgU2o";
830 let k256_private_key = "did:key:z3vLY4nbXy2rV4Qr65gUtfnSF3A8Be7gmYzUiCX6eo2PR1Rt";
831
832 let parsed_p256 = identify_key(p256_private_key)?;
834 let reserialized_p256 = format!("{}", parsed_p256);
835 assert_eq!(p256_private_key, reserialized_p256);
836
837 let parsed_k256 = identify_key(k256_private_key)?;
839 let reserialized_k256 = format!("{}", parsed_k256);
840 assert_eq!(k256_private_key, reserialized_k256);
841
842 Ok(())
843 }
844
845 #[test]
846 fn test_keydata_display_cross_verification() -> Result<()> {
847 let p256_key = generate_key(KeyType::P256Private)?;
849 let k256_key = generate_key(KeyType::K256Private)?;
850
851 let p256_string = format!("{}", p256_key);
853 let k256_string = format!("{}", k256_key);
854
855 assert_ne!(p256_string, k256_string);
857
858 let parsed_p256 = identify_key(&p256_string)?;
860 let parsed_k256 = identify_key(&k256_string)?;
861
862 assert_eq!(*parsed_p256.key_type(), KeyType::P256Private);
864 assert_eq!(*parsed_k256.key_type(), KeyType::K256Private);
865
866 let content = "cross verification test".as_bytes();
868
869 let p256_signature = sign(&p256_key, content)?;
871
872 let k256_signature = sign(&k256_key, content)?;
874
875 assert!(validate(&p256_key, &p256_signature, content).is_ok());
877 assert!(validate(&parsed_p256, &p256_signature, content).is_ok());
878
879 assert!(validate(&k256_key, &k256_signature, content).is_ok());
881 assert!(validate(&parsed_k256, &k256_signature, content).is_ok());
882
883 assert!(validate(&p256_key, &k256_signature, content).is_err());
885 assert!(validate(&k256_key, &p256_signature, content).is_err());
886
887 Ok(())
888 }
889
890 #[test]
891 fn test_keydata_display_format_consistency() -> Result<()> {
892 let p256_key = generate_key(KeyType::P256Private)?;
894 let k256_key = generate_key(KeyType::K256Private)?;
895
896 let p256_string = format!("{}", p256_key);
897 let k256_string = format!("{}", k256_key);
898
899 assert!(p256_string.starts_with("did:key:z"));
901 assert!(k256_string.starts_with("did:key:z"));
902
903 let _parsed_p256 = identify_key(&p256_string)?;
905 let _parsed_k256 = identify_key(&k256_string)?;
906
907 assert!(p256_string.len() > 50 && p256_string.len() < 60);
910
911 assert!(k256_string.len() > 50 && k256_string.len() < 60);
913
914 Ok(())
915 }
916
917 #[test]
918 fn test_complete_workflow_demonstration() -> Result<()> {
919 println!("\n=== KeyData Display Implementation Test ===");
920
921 println!("1. Generating keys...");
923 let p256_key = generate_key(KeyType::P256Private)?;
924 let k256_key = generate_key(KeyType::K256Private)?;
925
926 println!("2. Serializing keys to DID format...");
928 let p256_did = format!("{}", p256_key);
929 let k256_did = format!("{}", k256_key);
930 println!(" P-256 DID: {}", p256_did);
931 println!(" K-256 DID: {}", k256_did);
932
933 println!("3. Parsing DIDs back to KeyData...");
935 let parsed_p256 = identify_key(&p256_did)?;
936 let parsed_k256 = identify_key(&k256_did)?;
937 println!(" P-256 parsed successfully: {:?}", parsed_p256.key_type());
938 println!(" K-256 parsed successfully: {:?}", parsed_k256.key_type());
939
940 println!("4. Verifying round-trip integrity...");
942 assert_eq!(p256_key.bytes(), parsed_p256.bytes());
943 assert_eq!(k256_key.bytes(), parsed_k256.bytes());
944 println!(" Round-trip successful for both keys!");
945
946 println!("5. Testing signing and verification...");
948 let test_data = "Hello AT Protocol!".as_bytes();
949
950 let p256_signature = sign(&p256_key, test_data)?;
952 let k256_signature = sign(&k256_key, test_data)?;
953
954 validate(&parsed_p256, &p256_signature, test_data)?;
956 validate(&parsed_k256, &k256_signature, test_data)?;
957 println!(" Signatures verified successfully with parsed keys!");
958
959 println!("6. Testing cross-curve verification (should fail)...");
961 assert!(validate(&parsed_p256, &k256_signature, test_data).is_err());
962 assert!(validate(&parsed_k256, &p256_signature, test_data).is_err());
963 println!(" Cross-curve verification correctly failed!");
964
965 println!("=== All tests completed successfully! ===\n");
966
967 Ok(())
968 }
969
970 #[test]
971 fn test_to_public_p256() -> Result<()> {
972 let private_key = generate_key(KeyType::P256Private)?;
974
975 let public_key = to_public(&private_key)?;
977
978 assert_eq!(*public_key.key_type(), KeyType::P256Public);
980
981 let content = "test message for p256 public key derivation".as_bytes();
983 let signature = sign(&private_key, content)?;
984
985 validate(&public_key, &signature, content)?;
987
988 let public_key_did = format!("{}", public_key);
990 assert!(public_key_did.starts_with("did:key:"));
991
992 let parsed_public_key = identify_key(&public_key_did)?;
994 assert_eq!(*parsed_public_key.key_type(), KeyType::P256Public);
995 assert_eq!(public_key.bytes(), parsed_public_key.bytes());
996
997 Ok(())
998 }
999
1000 #[test]
1001 fn test_to_public_k256() -> Result<()> {
1002 let private_key = generate_key(KeyType::K256Private)?;
1004
1005 let public_key = to_public(&private_key)?;
1007
1008 assert_eq!(*public_key.key_type(), KeyType::K256Public);
1010
1011 let content = "test message for k256 public key derivation".as_bytes();
1013 let signature = sign(&private_key, content)?;
1014
1015 validate(&public_key, &signature, content)?;
1017
1018 let public_key_did = format!("{}", public_key);
1020 assert!(public_key_did.starts_with("did:key:"));
1021
1022 let parsed_public_key = identify_key(&public_key_did)?;
1024 assert_eq!(*parsed_public_key.key_type(), KeyType::K256Public);
1025 assert_eq!(public_key.bytes(), parsed_public_key.bytes());
1026
1027 Ok(())
1028 }
1029
1030 #[test]
1031 fn test_to_public_with_public_keys() -> Result<()> {
1032 let p256_private = generate_key(KeyType::P256Private)?;
1034 let p256_public = to_public(&p256_private)?;
1035
1036 let result = to_public(&p256_public)?;
1038 assert_eq!(*result.key_type(), KeyType::P256Public);
1039 assert_eq!(p256_public.bytes(), result.bytes());
1040
1041 let k256_private = generate_key(KeyType::K256Private)?;
1042 let k256_public = to_public(&k256_private)?;
1043
1044 let result = to_public(&k256_public)?;
1045 assert_eq!(*result.key_type(), KeyType::K256Public);
1046 assert_eq!(k256_public.bytes(), result.bytes());
1047
1048 Ok(())
1049 }
1050
1051 #[test]
1052 fn test_to_public_existing_keys() -> Result<()> {
1053 let p256_private_key = "did:key:z42tj8ZrAza9WkewDELwWMN37TS3coEbGdZh8bp1URfMVnpx";
1055 let k256_private_key = "did:key:z3vLW46Z1UHwnr7vN33MoFt2sBQDQagn9HTvWnsQDHegUixP";
1056
1057 let parsed_p256_private = identify_key(p256_private_key)?;
1059 let parsed_k256_private = identify_key(k256_private_key)?;
1060
1061 let p256_public = to_public(&parsed_p256_private)?;
1063 let k256_public = to_public(&parsed_k256_private)?;
1064
1065 assert_eq!(*p256_public.key_type(), KeyType::P256Public);
1067 assert_eq!(*k256_public.key_type(), KeyType::K256Public);
1068
1069 let content = "test with existing keys".as_bytes();
1071
1072 let p256_signature = sign(&parsed_p256_private, content)?;
1073 let k256_signature = sign(&parsed_k256_private, content)?;
1074
1075 validate(&p256_public, &p256_signature, content)?;
1077 validate(&k256_public, &k256_signature, content)?;
1078
1079 Ok(())
1080 }
1081
1082 #[test]
1083 fn test_to_public_comprehensive_workflow() -> Result<()> {
1084 println!("\n=== Public Key Derivation Test ===");
1085
1086 println!("1. Generating private keys...");
1088 let p256_private = generate_key(KeyType::P256Private)?;
1089 let k256_private = generate_key(KeyType::K256Private)?;
1090
1091 println!("2. Deriving public keys...");
1093 let p256_public = to_public(&p256_private)?;
1094 let k256_public = to_public(&k256_private)?;
1095
1096 println!("3. Serializing keys to DID format...");
1098 let p256_private_did = format!("{}", p256_private);
1099 let p256_public_did = format!("{}", p256_public);
1100 let k256_private_did = format!("{}", k256_private);
1101 let k256_public_did = format!("{}", k256_public);
1102
1103 println!(" P-256 Private: {}", p256_private_did);
1104 println!(" P-256 Public: {}", p256_public_did);
1105 println!(" K-256 Private: {}", k256_private_did);
1106 println!(" K-256 Public: {}", k256_public_did);
1107
1108 assert_ne!(p256_private_did, p256_public_did);
1110 assert_ne!(k256_private_did, k256_public_did);
1111 assert_ne!(p256_public_did, k256_public_did);
1112
1113 println!("4. Testing signature verification...");
1115 let test_data = "Public key derivation test data".as_bytes();
1116
1117 let p256_signature = sign(&p256_private, test_data)?;
1118 let k256_signature = sign(&k256_private, test_data)?;
1119
1120 validate(&p256_public, &p256_signature, test_data)?;
1122 validate(&k256_public, &k256_signature, test_data)?;
1123 println!(" Signatures verified successfully with derived public keys!");
1124
1125 println!("5. Testing DID round-trip with public keys...");
1127 let parsed_p256_public = identify_key(&p256_public_did)?;
1128 let parsed_k256_public = identify_key(&k256_public_did)?;
1129
1130 validate(&parsed_p256_public, &p256_signature, test_data)?;
1131 validate(&parsed_k256_public, &k256_signature, test_data)?;
1132 println!(" Parsed public keys also verify signatures correctly!");
1133
1134 println!("=== Public key derivation workflow completed successfully! ===\n");
1135
1136 Ok(())
1137 }
1138
1139 #[test]
1140 fn test_to_public_key_properties() -> Result<()> {
1141 let p256_private = generate_key(KeyType::P256Private)?;
1143 let k256_private = generate_key(KeyType::K256Private)?;
1144
1145 let p256_public = to_public(&p256_private)?;
1146 let k256_public = to_public(&k256_private)?;
1147
1148 assert!(p256_public.bytes().len() == 65 || p256_public.bytes().len() == 33);
1151
1152 assert!(k256_public.bytes().len() == 65 || k256_public.bytes().len() == 33);
1154
1155 let p256_public2 = to_public(&p256_private)?;
1157 let k256_public2 = to_public(&k256_private)?;
1158
1159 assert_eq!(p256_public.bytes(), p256_public2.bytes());
1160 assert_eq!(k256_public.bytes(), k256_public2.bytes());
1161
1162 Ok(())
1163 }
1164
1165 #[test]
1166 fn test_to_public_with_existing_public_keys() -> Result<()> {
1167 let p256_public_key = "did:key:zDnaeXduWbJ1b1Kgjf3uCdCpMDF1LEDizUiyxAxGwerou3Nh2";
1169 let k256_public_key = "did:key:zQ3shNzMp4oaaQ1gQRzCxMGXFrSW3NEM1M9T6KCY9eA7HhyEA";
1170
1171 let parsed_p256_public = identify_key(p256_public_key)?;
1173 let parsed_k256_public = identify_key(k256_public_key)?;
1174
1175 assert_eq!(*parsed_p256_public.key_type(), KeyType::P256Public);
1177 assert_eq!(*parsed_k256_public.key_type(), KeyType::K256Public);
1178
1179 let same_p256_public = to_public(&parsed_p256_public)?;
1181 let same_k256_public = to_public(&parsed_k256_public)?;
1182
1183 assert_eq!(*same_p256_public.key_type(), KeyType::P256Public);
1185 assert_eq!(*same_k256_public.key_type(), KeyType::K256Public);
1186 assert_eq!(parsed_p256_public.bytes(), same_p256_public.bytes());
1187 assert_eq!(parsed_k256_public.bytes(), same_k256_public.bytes());
1188
1189 assert_eq!(format!("{}", same_p256_public), p256_public_key);
1191 assert_eq!(format!("{}", same_k256_public), k256_public_key);
1192
1193 Ok(())
1194 }
1195
1196 #[test]
1199 fn test_generate_key_p384_private() -> Result<()> {
1200 let key_data = generate_key(KeyType::P384Private)?;
1201 assert_eq!(*key_data.key_type(), KeyType::P384Private);
1202 assert_eq!(key_data.bytes().len(), 48); let content = "test content for p384".as_bytes();
1206 let signature = sign(&key_data, content)?;
1207 let validation = validate(&key_data, &signature, content);
1208 assert!(validation.is_ok());
1209
1210 Ok(())
1211 }
1212
1213 #[test]
1214 fn test_generate_key_p384_public_not_supported() {
1215 let result = generate_key(KeyType::P384Public);
1216 assert!(matches!(
1217 result,
1218 Err(KeyError::PublicKeyGenerationNotSupported)
1219 ));
1220 }
1221
1222 #[test]
1223 fn test_generate_key_p384_uniqueness() -> Result<()> {
1224 let key1 = generate_key(KeyType::P384Private)?;
1226 let key2 = generate_key(KeyType::P384Private)?;
1227 assert_ne!(key1.bytes(), key2.bytes());
1228
1229 Ok(())
1230 }
1231
1232 #[test]
1233 fn test_sign_and_validate_p384() -> Result<()> {
1234 let private_key = generate_key(KeyType::P384Private)?;
1236
1237 let public_key = to_public(&private_key)?;
1239 assert_eq!(*public_key.key_type(), KeyType::P384Public);
1240
1241 let content = "hello world p384 test".as_bytes();
1242
1243 let signature = sign(&private_key, content)?;
1245 assert!(!signature.is_empty());
1246
1247 validate(&public_key, &signature, content)?;
1249
1250 validate(&private_key, &signature, content)?;
1252
1253 let wrong_content = "wrong content".as_bytes();
1255 assert!(validate(&public_key, &signature, wrong_content).is_err());
1256
1257 Ok(())
1258 }
1259
1260 #[test]
1261 fn test_p384_keydata_display_round_trip() -> Result<()> {
1262 let original_key = generate_key(KeyType::P384Private)?;
1264
1265 let key_string = format!("{}", original_key);
1267
1268 assert!(key_string.starts_with("did:key:"));
1270
1271 let parsed_key = identify_key(&key_string)?;
1273
1274 assert_eq!(original_key.key_type(), parsed_key.key_type());
1276
1277 assert_eq!(original_key.bytes(), parsed_key.bytes());
1279
1280 let content = "test message for p384 round trip".as_bytes();
1282
1283 let signature = sign(&original_key, content)?;
1285
1286 validate(&original_key, &signature, content)?;
1288
1289 validate(&parsed_key, &signature, content)?;
1291
1292 let signature2 = sign(&parsed_key, content)?;
1294
1295 validate(&original_key, &signature2, content)?;
1297 validate(&parsed_key, &signature2, content)?;
1298
1299 Ok(())
1300 }
1301
1302 #[test]
1303 fn test_p384_to_public_key_derivation() -> Result<()> {
1304 let private_key = generate_key(KeyType::P384Private)?;
1306
1307 let public_key = to_public(&private_key)?;
1309
1310 assert_eq!(*public_key.key_type(), KeyType::P384Public);
1312
1313 let content = "test message for p384 public key derivation".as_bytes();
1315 let signature = sign(&private_key, content)?;
1316
1317 validate(&public_key, &signature, content)?;
1319
1320 let public_key_did = format!("{}", public_key);
1322 assert!(public_key_did.starts_with("did:key:"));
1323
1324 let parsed_public_key = identify_key(&public_key_did)?;
1326 assert_eq!(*parsed_public_key.key_type(), KeyType::P384Public);
1327 assert_eq!(public_key.bytes(), parsed_public_key.bytes());
1328
1329 let result = to_public(&public_key)?;
1331 assert_eq!(*result.key_type(), KeyType::P384Public);
1332 assert_eq!(public_key.bytes(), result.bytes());
1333
1334 Ok(())
1335 }
1336
1337 #[test]
1338 fn test_p384_jwk_conversion() -> Result<()> {
1339 let private_key = generate_key(KeyType::P384Private)?;
1341 let public_key = to_public(&private_key)?;
1342
1343 let private_jwk: Result<elliptic_curve::JwkEcKey, _> = (&private_key).try_into();
1345 assert!(private_jwk.is_ok());
1346
1347 let public_jwk: Result<elliptic_curve::JwkEcKey, _> = (&public_key).try_into();
1349 assert!(public_jwk.is_ok());
1350
1351 Ok(())
1352 }
1353
1354 #[test]
1355 fn test_p384_key_properties() -> Result<()> {
1356 let private_key = generate_key(KeyType::P384Private)?;
1358 let public_key = to_public(&private_key)?;
1359
1360 assert_eq!(private_key.bytes().len(), 48);
1362
1363 assert!(public_key.bytes().len() == 97 || public_key.bytes().len() == 49);
1367
1368 let public_key2 = to_public(&private_key)?;
1370 assert_eq!(public_key.bytes(), public_key2.bytes());
1371
1372 Ok(())
1373 }
1374
1375 #[test]
1376 fn test_p384_cross_curve_verification_fails() -> Result<()> {
1377 let p256_key = generate_key(KeyType::P256Private)?;
1379 let p384_key = generate_key(KeyType::P384Private)?;
1380 let k256_key = generate_key(KeyType::K256Private)?;
1381
1382 let p256_public = to_public(&p256_key)?;
1384 let p384_public = to_public(&p384_key)?;
1385 let k256_public = to_public(&k256_key)?;
1386
1387 let content = "cross curve verification test".as_bytes();
1388
1389 let p256_signature = sign(&p256_key, content)?;
1391 let p384_signature = sign(&p384_key, content)?;
1392 let k256_signature = sign(&k256_key, content)?;
1393
1394 validate(&p256_public, &p256_signature, content)?;
1396 validate(&p384_public, &p384_signature, content)?;
1397 validate(&k256_public, &k256_signature, content)?;
1398
1399 assert!(validate(&p256_public, &p384_signature, content).is_err());
1401 assert!(validate(&p384_public, &p256_signature, content).is_err());
1402 assert!(validate(&k256_public, &p384_signature, content).is_err());
1403 assert!(validate(&p384_public, &k256_signature, content).is_err());
1404
1405 Ok(())
1406 }
1407
1408 #[test]
1409 fn test_p384_sign_with_public_key_fails() {
1410 let private_key = generate_key(KeyType::P384Private).unwrap();
1411 let public_key = to_public(&private_key).unwrap();
1412
1413 let content = "test content".as_bytes();
1414
1415 let result = sign(&public_key, content);
1417 assert!(matches!(
1418 result,
1419 Err(KeyError::PrivateKeyRequiredForSignature)
1420 ));
1421 }
1422
1423 #[test]
1424 fn test_p384_comprehensive_workflow() -> Result<()> {
1425 println!("\n=== P-384 Comprehensive Workflow Test ===");
1426
1427 println!("1. Generating P-384 private key...");
1429 let private_key = generate_key(KeyType::P384Private)?;
1430 assert_eq!(*private_key.key_type(), KeyType::P384Private);
1431 assert_eq!(private_key.bytes().len(), 48);
1432
1433 println!("2. Deriving P-384 public key...");
1435 let public_key = to_public(&private_key)?;
1436 assert_eq!(*public_key.key_type(), KeyType::P384Public);
1437
1438 println!("3. Serializing keys to DID format...");
1440 let private_did = format!("{}", private_key);
1441 let public_did = format!("{}", public_key);
1442 println!(" P-384 Private: {}", private_did);
1443 println!(" P-384 Public: {}", public_did);
1444
1445 assert!(private_did.starts_with("did:key:"));
1446 assert!(public_did.starts_with("did:key:"));
1447 assert_ne!(private_did, public_did);
1448
1449 println!("4. Parsing DIDs back to KeyData...");
1451 let parsed_private = identify_key(&private_did)?;
1452 let parsed_public = identify_key(&public_did)?;
1453
1454 assert_eq!(*parsed_private.key_type(), KeyType::P384Private);
1455 assert_eq!(*parsed_public.key_type(), KeyType::P384Public);
1456
1457 println!("5. Verifying round-trip integrity...");
1459 assert_eq!(private_key.bytes(), parsed_private.bytes());
1460 assert_eq!(public_key.bytes(), parsed_public.bytes());
1461
1462 println!("6. Testing signing and verification...");
1464 let test_data = "P-384 comprehensive test data".as_bytes();
1465
1466 let signature = sign(&private_key, test_data)?;
1468
1469 validate(&private_key, &signature, test_data)?;
1471 validate(&public_key, &signature, test_data)?;
1472 validate(&parsed_private, &signature, test_data)?;
1473 validate(&parsed_public, &signature, test_data)?;
1474
1475 println!("7. Testing JWK conversion...");
1477 let private_jwk: elliptic_curve::JwkEcKey = (&private_key).try_into()?;
1478 let public_jwk: elliptic_curve::JwkEcKey = (&public_key).try_into()?;
1479
1480 assert_eq!(private_jwk.crv(), "P-384");
1481 assert_eq!(public_jwk.crv(), "P-384");
1482
1483 println!("=== P-384 comprehensive workflow completed successfully! ===\n");
1484
1485 Ok(())
1486 }
1487
1488 #[test]
1489 fn test_p384_multicodec_prefix_identification() -> Result<()> {
1490 let private_key = generate_key(KeyType::P384Private)?;
1492 let public_key = to_public(&private_key)?;
1493
1494 let private_did = format!("{}", private_key);
1496 let public_did = format!("{}", public_key);
1497
1498 let parsed_private = identify_key(&private_did)?;
1500 let parsed_public = identify_key(&public_did)?;
1501
1502 assert_eq!(*parsed_private.key_type(), KeyType::P384Private);
1503 assert_eq!(*parsed_public.key_type(), KeyType::P384Public);
1504
1505 let private_value = did_method_key_value(&private_did);
1507 let public_value = did_method_key_value(&public_did);
1508
1509 let (_, private_decoded) = multibase::decode(private_value)?;
1510 let (_, public_decoded) = multibase::decode(public_value)?;
1511
1512 assert_eq!(&private_decoded[..2], &[0x13, 0x01]); assert_eq!(&public_decoded[..2], &[0x12, 0x00]); Ok(())
1517 }
1518}