testvec_certs.rs
1 use tor_cert::rsa::RsaCrosscert; 2 use tor_cert::{Ed25519Cert, KeyType}; 3 use tor_checkable::{ExternallySigned, SelfSigned, Timebound}; 4 5 use hex_literal::hex; 6 7 #[test] 8 fn test_valid_ed() { 9 use humantime::parse_rfc3339; 10 use tor_llcrypto::pk::ed25519::Ed25519Identity; 11 // These are taken from a CERTS cell in a chutney network. 12 let signing_key = hex!("F82294B866A31F01FC5D0DA8572850A9B929545C3266558D7D2316E3B74172B0"); 13 let identity_key = hex!("DCB604DB2034B00FD16986D4ADB9D16B21CB4E4457A33DEC0F538903683E96E9"); 14 let signing_key = Ed25519Identity::from_bytes(&signing_key[..]).unwrap(); 15 let identity_key = Ed25519Identity::from_bytes(&identity_key[..]).unwrap(); 16 17 let notional_time = parse_rfc3339("2020-09-25T02:13:20Z").unwrap(); 18 19 // signing cert signed with signing key, type 4, one extension. 20 let c = hex!( 21 "01 04 0006CC2A 01 22 F82294B866A31F01FC5D0DA8572850A9B929545C3266558D7D2316E3B74172B0 23 01 0020 04 00 24 DCB604DB2034B00FD16986D4ADB9D16B21CB4E4457A33DEC0F538903683E96E9 25 FF1A5203FA27F86EF7528D89A0845D2520166E340754FFEA2AAE0F612B7CE5DA 26 094A0236CDAC45034B0B6842C18E7F6B51B93A3CF7E60663B8AD061C30A62602" 27 ); 28 let cert = Ed25519Cert::decode(&c[..]).unwrap(); 29 assert_eq!(cert.peek_cert_type(), 4.into()); 30 assert_eq!(cert.peek_subject_key().as_ed25519(), Some(&signing_key)); 31 let cert = cert 32 .should_have_signing_key() 33 .unwrap() 34 .check_signature() 35 .unwrap() 36 .check_valid_at(¬ional_time) 37 .unwrap(); 38 39 assert_eq!(cert.subject_key().key_type(), KeyType::ED25519_KEY); 40 assert_eq!(cert.subject_key().as_ed25519(), Some(&signing_key)); 41 assert_eq!(cert.signing_key().unwrap(), &identity_key); 42 assert_eq!(cert.cert_type(), 4.into()); 43 assert_eq!( 44 cert.expiry(), 45 parse_rfc3339("2020-10-26T18:00:00Z").unwrap() 46 ); 47 48 // link cert signed with signing key, type 5, no extensions. 49 let c = hex!( 50 "01 05 0006C98A 03 51 B4FD606B64E4CBD466B8D76CB131069BAE6F3AA1878857C9F624E31D77A799B8 52 00 53 7173E5F8068431D0D3F5EE16B4C9FFD59DF373E152A87281BAE744AA5FCF7217 54 1BF4B27C4E8FC1C6A9FC5CA11058BC49647063D7903CFD9F512F89099B27BC0C" 55 ); 56 let tls_cert_digest = hex!("B4FD606B64E4CBD466B8D76CB131069BAE6F3AA1878857C9F624E31D77A799B8"); 57 let cert = Ed25519Cert::decode(&c[..]).unwrap(); 58 assert_eq!(cert.peek_cert_type(), 5.into()); 59 assert_eq!(cert.peek_subject_key().as_bytes(), &tls_cert_digest[..]); 60 let cert = cert 61 .should_be_signed_with(&signing_key) 62 .unwrap() 63 .check_signature() 64 .unwrap() 65 .check_valid_at(¬ional_time) 66 .unwrap(); 67 assert_eq!(cert.subject_key().key_type(), KeyType::SHA256_OF_X509); 68 assert_eq!(cert.subject_key().as_bytes(), &tls_cert_digest[..]); 69 assert_eq!(cert.subject_key().as_ed25519(), None); 70 assert_eq!(cert.signing_key().unwrap(), &signing_key); 71 assert_eq!(cert.cert_type(), 5.into()); 72 assert_eq!( 73 cert.expiry(), 74 parse_rfc3339("2020-09-28T18:00:00Z").unwrap() 75 ); 76 } 77 78 #[test] 79 fn test_valid_rsa_cc() { 80 let notional_time = humantime::parse_rfc3339("2020-09-25T02:13:20Z").unwrap(); 81 82 let pk = hex!("30818902818100d38b1e6ceb946e0db0751f4cbace3dcb9688b6c25304227b4710c35afb73627e50500f5913e158b621802612d1c75827003703338375237552eb3cd3c12f6ab3604e60c1a2d26bb1fbad206ff023969a90909d6a65a5458a5312c26ebd3a3dad30302d4515cdcd264146ac18e6fc60a04bd3ec327f04294d96ba5aa25b464c3f0203010001"); 83 let pk = tor_llcrypto::pk::rsa::PublicKey::from_der(&pk[..]).unwrap(); 84 85 let wrong_pk = hex!("30818902818100d38b1e6ceb946e0db0751f4cbace3dcb9688b6c25304227b4710c35afb73627e50500f5913e158b621802612d1c75827003703338375237552eb3cd3c12f6ab3604e60c1a2d26bb1fbad206ff023969a90909d6a65a5458a5312c26ebd6a3dad30302d4515cdcd264146ac18e6fc60a04bd3ec327f04294d96ba5aa25b464c3f0203010001"); 86 let wrong_pk = tor_llcrypto::pk::rsa::PublicKey::from_der(&wrong_pk[..]).unwrap(); 87 88 let ed_identity = hex!("DCB604DB2034B00FD16986D4ADB9D16B21CB4E4457A33DEC0F538903683E96E9"); 89 let ed_identity = tor_llcrypto::pk::ed25519::PublicKey::from_bytes(&ed_identity).unwrap(); 90 91 let c = hex!( 92 "DCB604DB2034B00FD16986D4ADB9D16B21CB4E4457A33DEC0F538903683E96E9 93 0006DA3A 80 94 5CF6006F9179066534DE6B45AD47A5C469063EE462762723396DC9F25452A0A5 95 2DA3F5087DD239F2A311F6B0D4DFEFF4ABD089DC3D0237A0ABAB19EB2045B91C 96 DCAF04BE0A72D548A27BF2E77BD876ECFE5E1BE622350DA6BF31F6E306ED8964 97 88DD5B39409B23FC3EB7B2C9F7328EB18DA36D54D80575899EA6507CCBFCDF1F" 98 ); 99 let cert = RsaCrosscert::decode(&c[..]).unwrap(); 100 101 // This returns correct for all keys. 102 assert!(cert.key_is_correct(&pk).is_ok()); 103 assert!(cert.key_is_correct(&wrong_pk).is_ok()); 104 105 // But it isn't well-signed with the wrong pk. 106 assert!(cert.is_well_signed(&wrong_pk).is_err()); 107 108 let cert = cert 109 .check_signature(&pk) 110 .unwrap() 111 .check_valid_at(¬ional_time) 112 .unwrap(); 113 assert!(cert.subject_key_matches(&ed_identity.into())); 114 }