From c2557d37e026cc3bc7ffe3d6a84a5aa470d12574 Mon Sep 17 00:00:00 2001 From: Hatter Jiang Date: Fri, 30 Aug 2024 00:18:27 +0800 Subject: [PATCH] feat: parse id_rsa --- src/sshbase.rs | 5 +++ src/sshrw.rs | 109 +++++++++++++++++++++++++++++++++++++++++++++++++ 2 files changed, 114 insertions(+) diff --git a/src/sshbase.rs b/src/sshbase.rs index 071d5f9..fbbec0b 100644 --- a/src/sshbase.rs +++ b/src/sshbase.rs @@ -1,3 +1,8 @@ use std::error::Error; pub type SshResult = Result>; + +pub fn dump(prefix: &str, value: &[u8]) { + println!("> {} > hex > {}", prefix, hex::encode(value)); + println!("> {} > str > {}", prefix, String::from_utf8_lossy(value)); +} \ No newline at end of file diff --git a/src/sshrw.rs b/src/sshrw.rs index 49f0e84..0e559ee 100644 --- a/src/sshrw.rs +++ b/src/sshrw.rs @@ -170,6 +170,115 @@ JleMcmz3DhbQ0Sf9jKLhV0ED0yn9Z0PAxa+EvOyczuw6j/K0qFXq2s/gzvVr/ELrjPiJQT\ tWKWQeY57667wDWS/NG/lbfyQhr9daoW19/lcVXCzeuFKeHpTKSZvh7Ig1iLHdFevkv82C\ 1B8NRsyMWPwJ4uJjL93OXE+qP32YwURGkjO5HDGqAh6DTi4DtQDKuEGrdzVn256laBQXyS\ zht0jKvhwAbkLdAAAAHWhhdHRlcmppYW5nQEhhdHRlckppYW5nX21hY09TAQIDBAU="; + + let mut ssh_reader = SshReader::new(STANDARD.decode(id_rsa).unwrap()); + + let auth_magic = ssh_reader.read_bytes(15).unwrap(); + // why has '\x00' ? + assert_eq!(b"openssh-key-v1\x00", auth_magic.as_slice()); + + let ciphername = ssh_reader.read_string().unwrap(); + assert_eq!(b"none", ciphername.as_slice()); + + let kdfname = ssh_reader.read_string().unwrap(); + assert_eq!(b"none", kdfname.as_slice()); + + let kdfoptions = ssh_reader.read_string().unwrap(); + assert_eq!(b"", kdfoptions.as_slice()); + + let number_of_keys = ssh_reader.read_u32().unwrap(); + assert_eq!(1, number_of_keys); + + let public_key1 = ssh_reader.read_string().unwrap(); + let mut public_key1_reader = SshReader::new(public_key1); + let public_key1_algorithm = public_key1_reader.read_string().unwrap(); + assert_eq!(b"ssh-rsa", public_key1_algorithm.as_slice()); + + let public_key1_public_key_e = public_key1_reader.read_big_num().unwrap(); + let public_key1_public_key_n = public_key1_reader.read_big_num().unwrap(); + + assert_eq!("010001", hex::encode(&public_key1_public_key_e)); + assert_eq!("bcda85520bae21bb91f76e9772646352f70ee227f9c5f2207a0187e99577403126690ea1ec18\ +b7e38fcf2794981bea6242474bf536130d0d101c67854eff02e72df646dfce2d8296c4bae049b1adb56186af71d\ +3c858a9e5865b8d47434f1aa3246bac8512b27dee23c469325974ad11d6270e63918d93bd672860d03f4ebc97f1\ +a11f4091c33644da002c7c0de496775bd4dd3048568d506ad56da45f19bfca5d02c918950fe859f426700044d32\ +88e16288093987c5ea3caa9dfca7e4d67113dccbff29021d908a5d9cdf44accd64c27935c0c386a91fa13eda8ad\ +af24cfdf5042417ca7964986df48052fa7fde791ff84130e554d49817478f1dcc6670944a09c5e6f7e51181cc1a\ +ee084485914e05cca8c5710c586ed8170bfe7398dd39bdba666776503bd0b04771110e990336f31e971771179db\ +d1308b78a81e5fb77c954c8e7675f0150690e9f46df547228bd7f7e269ea6870a24fd042667636edbd398496213\ +6d67287accec0be026a456bdce117f4c6fa2c264452a59a87720965", hex::encode(&public_key1_public_key_n)); + + assert_eq!(0, public_key1_reader.left_bytes()); + + let encrypted = ssh_reader.read_string().unwrap(); + + let mut encrypted_reader = SshReader::new(encrypted); + // check1 always equals check2, is generated by random + let check1 = encrypted_reader.read_u32().unwrap(); + let check2 = encrypted_reader.read_u32().unwrap(); + println!("check1 {}", hex::encode(&check1.to_be_bytes())); + println!("check2 {}", hex::encode(&check2.to_be_bytes())); + assert_eq!(check1, check2); + + let private_key1_algorithm = encrypted_reader.read_string().unwrap(); + assert_eq!(b"ssh-rsa", private_key1_algorithm.as_slice()); + + let public_key1_public_key_n = encrypted_reader.read_big_num().unwrap(); + let public_key1_public_key_e = encrypted_reader.read_big_num().unwrap(); + assert_eq!("010001", hex::encode(&public_key1_public_key_e)); + assert_eq!("bcda85520bae21bb91f76e9772646352f70ee227f9c5f2207a0187e99577403126690ea1ec18\ +b7e38fcf2794981bea6242474bf536130d0d101c67854eff02e72df646dfce2d8296c4bae049b1adb56186af71d\ +3c858a9e5865b8d47434f1aa3246bac8512b27dee23c469325974ad11d6270e63918d93bd672860d03f4ebc97f1\ +a11f4091c33644da002c7c0de496775bd4dd3048568d506ad56da45f19bfca5d02c918950fe859f426700044d32\ +88e16288093987c5ea3caa9dfca7e4d67113dccbff29021d908a5d9cdf44accd64c27935c0c386a91fa13eda8ad\ +af24cfdf5042417ca7964986df48052fa7fde791ff84130e554d49817478f1dcc6670944a09c5e6f7e51181cc1a\ +ee084485914e05cca8c5710c586ed8170bfe7398dd39bdba666776503bd0b04771110e990336f31e971771179db\ +d1308b78a81e5fb77c954c8e7675f0150690e9f46df547228bd7f7e269ea6870a24fd042667636edbd398496213\ +6d67287accec0be026a456bdce117f4c6fa2c264452a59a87720965", hex::encode(&public_key1_public_key_n)); + + let private_key1_d = encrypted_reader.read_big_num().unwrap(); + let private_key1_iqmp = encrypted_reader.read_big_num().unwrap(); + let private_key1_p = encrypted_reader.read_big_num().unwrap(); + let private_key1_q = encrypted_reader.read_big_num().unwrap(); + + assert_eq!("411ad0353da3952b75a1a8357b911210aaed2d97fc6a7a132a1c56ff76b07aa7b70726ad399837\ +e4b25206e21a221d862c352a0169d7dd7af05fea6c3194862aae54a5904822b64f4598eaf35cd6769e1d71643b\ +4f690980fff595d9c8617fdc5814ea8fa1a778f45cce3c39c84f09cf0955c3871dc981f21c9af5ed34b5ef1c2e\ +878e1f936089d7e89380c26f83ab3f909fec74d5ab48e23d42409f16cde8a959b1392449570791e332511036a9\ +d8e44acd41ae203657e5fd5adcb491201bf46505efb7dd4a57730302f5fd9cdf07fb7e2a58b878cfb0f47ca60b\ +b43e0a6cdbae488be174f40021fff0a2840c72757ed6d054ed3312444a297be680d3887c4b62f840841fc63d8d\ +c5b23949d027d6b22167e00bc485eb3b518e44d49b9a7ffb0fc770eaa9f1778bee0781eb02c3ef3a6eb0cc8a00\ +018091267c48cc5825373d94c62cc8d28f158d0488cf9b6c4747b85b6737a48db883c6c4afc48fbc4c8b086428\ +5e88681de0cff77e55e0eaf2fd671647bec9958dff32e2e158974164fa61", + hex::encode(&private_key1_d)); + assert_eq!("80dbfeb903034edd41564cdedf0bef7f64114fdf1ca16e4ed68284fc5a8c757ac5473ee5c69966\ +f37938a89a52c1aa570686e2477b76ce048473d8fe4a10b1ffde359c3b648200916b75fc1a984efa942fad5f23\ +b78f101a03c6717ed94ea29d262821efcb7468e4b3dfe0c70a751d4827736ae870b88f9f4313def20b9de580bd\ +7d29fce9e0ef825d3d1e18d4cde986f451e7a4e0150140b46cc49d9b8f748da589b87d802844775bbd0f9268ba\ +1eea58ea961cc6b39d1acfc7d423ce9708d8", + hex::encode(&private_key1_iqmp)); + assert_eq!("e10c82aaee47572d2e727833cc6957e2f0a4aad99ae7455c51ad89e68185c1145875f56e19732f\ +5f6665cc3d675849504c86402f64bac64a9a6a429fce483c05c57f17d15ca59b7bcb6fbfcfe6979561c03879fe\ +08e507f7a8e17dd8e676b54e69eb57d1e691e2dafc38a88b4a8826fb3985249575d50b835f73a327db5f7f3730\ +cb792d9d0ccd832b3a3d1376c67d803fccf14546777201ceed63b8b4f2befd5811f6b5ad3acadb945061084a3a\ +8ddb16e0203b7139413908f77c6ec4276429", + hex::encode(&private_key1_p)); + assert_eq!("d6d3a6f73d35b39e68facbbc0ace44557f3f8ffa39fae38226578c726cf70e16d0d127fd8ca2e1\ +574103d329fd6743c0c5af84bcec9cceec3a8ff2b4a855eadacfe0cef56bfc42eb8cf889413b5629641e639efa\ +ebbc03592fcd1bf95b7f2421afd75aa16d7dfe57155c2cdeb8529e1e94ca499be1ec883588b1dd15ebe4bfcd82\ +d41f0d46cc8c58fc09e2e2632fddce5c4faa3f7d98c144469233b91c31aa021e834e2e03b500cab841ab773567\ +db9ea5681417c92ce1b748cabe1c006e42dd", + hex::encode(&private_key1_q)); + + let comment = encrypted_reader.read_string().unwrap(); + assert_eq!(b"hatterjiang@HatterJiang_macOS", comment.as_slice()); + + let left = encrypted_reader.read_left().unwrap(); + assert_eq!("0102030405", hex::encode(&left)); + + assert_eq!(0, encrypted_reader.left_bytes()); + + assert_eq!(0, ssh_reader.left_bytes()); } #[test]