feat: parse id_rsa
This commit is contained in:
@@ -1,3 +1,8 @@
|
|||||||
use std::error::Error;
|
use std::error::Error;
|
||||||
|
|
||||||
pub type SshResult<T> = Result<T, Box<dyn Error>>;
|
pub type SshResult<T> = Result<T, Box<dyn Error>>;
|
||||||
|
|
||||||
|
pub fn dump(prefix: &str, value: &[u8]) {
|
||||||
|
println!("> {} > hex > {}", prefix, hex::encode(value));
|
||||||
|
println!("> {} > str > {}", prefix, String::from_utf8_lossy(value));
|
||||||
|
}
|
||||||
109
src/sshrw.rs
109
src/sshrw.rs
@@ -170,6 +170,115 @@ JleMcmz3DhbQ0Sf9jKLhV0ED0yn9Z0PAxa+EvOyczuw6j/K0qFXq2s/gzvVr/ELrjPiJQT\
|
|||||||
tWKWQeY57667wDWS/NG/lbfyQhr9daoW19/lcVXCzeuFKeHpTKSZvh7Ig1iLHdFevkv82C\
|
tWKWQeY57667wDWS/NG/lbfyQhr9daoW19/lcVXCzeuFKeHpTKSZvh7Ig1iLHdFevkv82C\
|
||||||
1B8NRsyMWPwJ4uJjL93OXE+qP32YwURGkjO5HDGqAh6DTi4DtQDKuEGrdzVn256laBQXyS\
|
1B8NRsyMWPwJ4uJjL93OXE+qP32YwURGkjO5HDGqAh6DTi4DtQDKuEGrdzVn256laBQXyS\
|
||||||
zht0jKvhwAbkLdAAAAHWhhdHRlcmppYW5nQEhhdHRlckppYW5nX21hY09TAQIDBAU=";
|
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]
|
#[test]
|
||||||
|
|||||||
Reference in New Issue
Block a user