Rust and WASM did-method-plc tools and structures
1//! Tests for cryptographic operations 2 3use atproto_plc::crypto::{SigningKey, VerifyingKey}; 4 5#[test] 6fn test_p256_key_generation() { 7 let key = SigningKey::generate_p256(); 8 let did_key = key.to_did_key(); 9 10 assert!(did_key.starts_with("did:key:z")); 11 12 // Verify key can be parsed back 13 let verifying_key = VerifyingKey::from_did_key(&did_key).unwrap(); 14 assert_eq!(verifying_key, key.verifying_key()); 15} 16 17#[test] 18fn test_k256_key_generation() { 19 let key = SigningKey::generate_k256(); 20 let did_key = key.to_did_key(); 21 22 assert!(did_key.starts_with("did:key:z")); 23 24 // Verify key can be parsed back 25 let verifying_key = VerifyingKey::from_did_key(&did_key).unwrap(); 26 assert_eq!(verifying_key, key.verifying_key()); 27} 28 29#[test] 30fn test_p256_signing_and_verification() { 31 let key = SigningKey::generate_p256(); 32 let data = b"The quick brown fox jumps over the lazy dog"; 33 34 // Sign the data 35 let signature = key.sign(data).unwrap(); 36 assert!(!signature.is_empty()); 37 38 // Verify with correct key 39 let verifying_key = key.verifying_key(); 40 assert!(verifying_key.verify(data, &signature).is_ok()); 41 42 // Verify with wrong data should fail 43 let wrong_data = b"The quick brown fox jumps over the lazy cat"; 44 assert!(verifying_key.verify(wrong_data, &signature).is_err()); 45 46 // Verify with wrong key should fail 47 let wrong_key = SigningKey::generate_p256(); 48 let wrong_verifying_key = wrong_key.verifying_key(); 49 assert!(wrong_verifying_key.verify(data, &signature).is_err()); 50} 51 52#[test] 53fn test_k256_signing_and_verification() { 54 let key = SigningKey::generate_k256(); 55 let data = b"Hello, world!"; 56 57 // Sign the data 58 let signature = key.sign(data).unwrap(); 59 60 // Verify with correct key 61 let verifying_key = key.verifying_key(); 62 assert!(verifying_key.verify(data, &signature).is_ok()); 63 64 // Wrong key should fail 65 let wrong_key = SigningKey::generate_k256(); 66 assert!(wrong_key.verifying_key().verify(data, &signature).is_err()); 67} 68 69#[test] 70fn test_base64url_signing() { 71 let key = SigningKey::generate_p256(); 72 let data = b"test data"; 73 74 // Sign as base64url 75 let signature_b64 = key.sign_base64url(data).unwrap(); 76 assert!(!signature_b64.contains('=')); 77 assert!(!signature_b64.contains('+')); 78 assert!(!signature_b64.contains('/')); 79 80 // Verify base64url signature 81 let verifying_key = key.verifying_key(); 82 assert!(verifying_key.verify_base64url(data, &signature_b64).is_ok()); 83} 84 85#[test] 86fn test_signature_non_deterministic() { 87 let key = SigningKey::generate_p256(); 88 let data = b"same data"; 89 90 // Sign the same data twice 91 let sig1 = key.sign(data).unwrap(); 92 let sig2 = key.sign(data).unwrap(); 93 94 // Signatures should be different (ECDSA is non-deterministic) 95 // Note: This might occasionally fail due to randomness, but is very unlikely 96 // The important thing is both signatures verify correctly 97 let verifying_key = key.verifying_key(); 98 assert!(verifying_key.verify(data, &sig1).is_ok()); 99 assert!(verifying_key.verify(data, &sig2).is_ok()); 100} 101 102#[test] 103fn test_invalid_did_key_parsing() { 104 // Invalid prefix 105 assert!(VerifyingKey::from_did_key("not:a:did:key").is_err()); 106 107 // Wrong DID method 108 assert!(VerifyingKey::from_did_key("did:web:example.com").is_err()); 109 110 // Invalid base58 111 assert!(VerifyingKey::from_did_key("did:key:z!!!INVALID!!!").is_err()); 112} 113 114#[test] 115fn test_did_key_roundtrip_multiple_keys() { 116 // Test with multiple different keys 117 let keys = vec![ 118 SigningKey::generate_p256(), 119 SigningKey::generate_k256(), 120 SigningKey::generate_p256(), 121 SigningKey::generate_k256(), 122 ]; 123 124 for key in keys { 125 let did_key = key.to_did_key(); 126 let parsed = VerifyingKey::from_did_key(&did_key).unwrap(); 127 assert_eq!(parsed, key.verifying_key()); 128 } 129} 130 131// Note: VerifyingKey doesn't implement Serialize/Deserialize directly 132// because the underlying ECDSA types don't support it. 133// Keys are serialized as did:key strings instead. 134 135#[test] 136fn test_cross_curve_verification_fails() { 137 // Sign with P-256 138 let p256_key = SigningKey::generate_p256(); 139 let data = b"test"; 140 let signature = p256_key.sign(data).unwrap(); 141 142 // Try to verify with K-256 should fail 143 let k256_key = SigningKey::generate_k256(); 144 assert!(k256_key.verifying_key().verify(data, &signature).is_err()); 145}