diff --git a/openpgp-card-sequoia/Cargo.toml b/openpgp-card-sequoia/Cargo.toml index 4c52bb1..21d008a 100644 --- a/openpgp-card-sequoia/Cargo.toml +++ b/openpgp-card-sequoia/Cargo.toml @@ -24,6 +24,7 @@ log = "0.4" openpgp-card-pcsc = { path = "../pcsc", version = "0.3" } #openpgp-card-scdc = { path = "../scdc", version = "0.3" } env_logger = "0.9" +testresult = "0.3.0" [[example]] name = "test" diff --git a/openpgp-card-sequoia/src/privkey.rs b/openpgp-card-sequoia/src/privkey.rs index c537609..7f39324 100644 --- a/openpgp-card-sequoia/src/privkey.rs +++ b/openpgp-card-sequoia/src/privkey.rs @@ -210,3 +210,97 @@ impl EccKey for SqEccKey { self.ecc_type } } + +#[cfg(test)] +mod tests { + use openpgp::cert::Cert; + use openpgp::crypto::mpi::PublicKey; + use openpgp::packet::key::SecretKeyMaterial; + use openpgp::parse::Parse; + use sequoia_openpgp as openpgp; + use testresult::TestResult; + + use super::*; + + #[test] + fn parsing_rsa_key() -> TestResult { + let cert = Cert::from_bytes( + r#"-----BEGIN PGP PRIVATE KEY BLOCK----- + +lQHYBGPmItUBBADp/S0sPqOQF6oBEQf558E5HeVtRP0qyWaVT0/fl7gj2jMSu6kF +de1jbr7AdeQxa7RiOo7m/ob8ZzKIzFNMLVfKsfo4mn5QjYulnadl+dyl87Jj1TlN +iEmeVvKbJUzXf7p4B4zFBFwIoCWtGZMTuUOgvi11Gbt00QwNUZdB10VjNwARAQAB +AAP/dH22pR3kSWL2oMRNX8XZJSn0pENh9RDCsRgE0HDU3IiPv8ZMviq5TjT+44tt +2YrhCbxUk7zpEDUCbCepWrYCS7Q7pMCJul2AdymJBDkNwzrPjNdzPwx1mOIudDFp +uosokjzx/bDNb9c8rdQpB5Oz9f9qZ9WhmfittQvBFPmBjyUCAPHWyhSVt86Wc3Dd +/1nQRLwMHVJK6VszIMO0EYgGvaFN9WXh6VUue9DXnAkHejUDNpsOlJfiAHMDU0fS +PnBX4D0CAPewtqGyIyluZ+S/+MJQBOUqLPzqHHr6smGmbOYFG52RFv17LhQH/02h +sLkd6qXXNUFSOF02XiYV9RywhnSadIMCALP4oM2YGCQL+B5bj3bT1uwoF8O0gwuW +FAc6Sz3ESpaI11ABLOv2wPNS3OcUyyIUe/DPVbekaKswvO57Ddzw5iait7QFQUJD +REWIzgQTAQgAOBYhBBCVR7AQd8pmtyaMetgkYA0A8AOABQJj5iLVAhsBBQsJCAcC +BhUKCQgLAgQWAgMBAh4BAheAAAoJENgkYA0A8AOA5W4EAMGuqrRLFjonYYS97Ypx +zo7HUpOALrLVgfwKoxX2/DdC4FWOQ61cog63KKOiM/DjF/TimLD7R4wls6pbELyD +T038FOlGoWtmtQuf3iUsBKdAYPPiqInaDU9XCy/hm1f7xOz70kpUXVG8K6c6my+b +/fGkli/zcEWR55dOMPeoZ6zF +=QZJ9 +-----END PGP PRIVATE KEY BLOCK-----"#, + )?; + if let Key::V4(key) = cert.primary_key().key().clone().parts_into_secret()? { + let (e, n) = if let PublicKey::RSA { e, n } = key.mpis() { + (e, n) + } else { + unreachable!(); + }; + if let Some(SecretKeyMaterial::Unencrypted(secret)) = key.optional_secret() { + assert!(secret.map(|secret| { + if let openpgp::crypto::mpi::SecretKeyMaterial::RSA { d, p, q, .. } = secret { + let rsa = SqRSA::new(e.clone(), d.clone(), n.clone(), p.clone(), q.clone()) + .unwrap(); + assert_eq!( + rsa.pq(), + vec![ + 66, 30, 140, 169, 99, 220, 224, 43, 7, 176, 133, 35, 251, 25, 162, + 178, 14, 200, 188, 60, 82, 126, 134, 117, 184, 10, 186, 28, 162, + 177, 225, 3, 147, 218, 96, 195, 182, 159, 32, 48, 87, 141, 182, 73, + 232, 37, 154, 152, 123, 11, 1, 86, 188, 224, 157, 35, 125, 4, 210, + 229, 233, 121, 207, 14 + ] + .into() + ); + assert_eq!( + rsa.dp1(), + vec![ + 19, 67, 44, 109, 95, 79, 120, 160, 251, 40, 238, 69, 188, 125, 158, + 59, 236, 43, 25, 182, 229, 199, 97, 215, 38, 63, 93, 118, 28, 51, + 86, 121, 195, 38, 14, 76, 107, 128, 124, 84, 50, 24, 55, 143, 228, + 231, 252, 13, 137, 100, 43, 233, 189, 18, 148, 22, 155, 183, 136, + 195, 120, 103, 71, 113 + ] + .into() + ); + assert_eq!( + rsa.dq1(), + vec![ + 29, 192, 92, 47, 143, 246, 41, 67, 217, 182, 224, 88, 64, 254, 219, + 151, 171, 57, 60, 39, 226, 195, 226, 217, 10, 97, 179, 50, 237, + 234, 35, 67, 10, 63, 232, 75, 224, 156, 21, 78, 125, 221, 124, 94, + 219, 144, 144, 9, 21, 143, 138, 181, 167, 146, 39, 128, 251, 176, + 54, 131, 239, 253, 157, 129 + ] + .into() + ); + true + } else { + false + } + })) + } else { + unreachable!(); + } + } else { + unreachable!(); + } + + Ok(()) + } +}