From 526dd4172b2c7f4637ce9a2123c242ca4c6604c7 Mon Sep 17 00:00:00 2001 From: Hatter Jiang Date: Sat, 25 Nov 2023 23:40:00 +0800 Subject: [PATCH] feat: add der_parser_test --- README.md | 7 +- __serialization/der_parser_test/Cargo.lock | 226 ++++++++++++++++++++ __serialization/der_parser_test/Cargo.toml | 12 ++ __serialization/der_parser_test/src/main.rs | 171 +++++++++++++++ 4 files changed, 415 insertions(+), 1 deletion(-) create mode 100644 __serialization/der_parser_test/Cargo.lock create mode 100644 __serialization/der_parser_test/Cargo.toml create mode 100644 __serialization/der_parser_test/src/main.rs diff --git a/README.md b/README.md index 7e8c16a..346b009 100644 --- a/README.md +++ b/README.md @@ -22,6 +22,7 @@ Project or files: ├── __cpu │   └── x86 ├── __crypto +│   ├── aegis-test │   ├── aes_gcm_crypto │   ├── btc-address │   ├── crypto @@ -39,6 +40,7 @@ Project or files: │   ├── rpgp-demo │   ├── rsa │   ├── secp256k1 +│   ├── secretshare │   ├── shamir-demo │   ├── simple_contract │   ├── ssh-keys @@ -143,9 +145,11 @@ Project or files: │   ├── async-speed-limit │   ├── dingo │   ├── fetch-rs +│   ├── fuso-socks5-test │   ├── ip │   ├── ipnet-demo │   ├── iptables +│   ├── kcp-test │   ├── mailsend │   ├── message_io │   ├── n_pcap @@ -183,6 +187,7 @@ Project or files: │   ├── cbor │   ├── configrs │   ├── csv +│   ├── der_parser_test │   ├── encoding │   ├── flatbuffers │   ├── gob @@ -275,6 +280,6 @@ Project or files: ├── vec.rs └── while.rs -244 directories, 40 files +249 directories, 40 files ``` diff --git a/__serialization/der_parser_test/Cargo.lock b/__serialization/der_parser_test/Cargo.lock new file mode 100644 index 0000000..3e6c088 --- /dev/null +++ b/__serialization/der_parser_test/Cargo.lock @@ -0,0 +1,226 @@ +# This file is automatically @generated by Cargo. +# It is not intended for manual editing. +version = 3 + +[[package]] +name = "asn1-rs" +version = "0.5.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7f6fd5ddaf0351dff5b8da21b2fb4ff8e08ddd02857f0bf69c47639106c0fff0" +dependencies = [ + "asn1-rs-derive", + "asn1-rs-impl", + "displaydoc", + "nom", + "num-traits", + "rusticata-macros", + "thiserror", +] + +[[package]] +name = "asn1-rs-derive" +version = "0.4.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "726535892e8eae7e70657b4c8ea93d26b8553afb1ce617caee529ef96d7dee6c" +dependencies = [ + "proc-macro2", + "quote", + "syn 1.0.109", + "synstructure", +] + +[[package]] +name = "asn1-rs-impl" +version = "0.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2777730b2039ac0f95f093556e61b6d26cebed5393ca6f152717777cec3a42ed" +dependencies = [ + "proc-macro2", + "quote", + "syn 1.0.109", +] + +[[package]] +name = "autocfg" +version = "1.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d468802bab17cbc0cc575e9b053f41e72aa36bfa6b7f55e3529ffa43161b97fa" + +[[package]] +name = "base64" +version = "0.21.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "35636a1494ede3b646cc98f74f8e62c773a38a659ebc777a2cf26b9b74171df9" + +[[package]] +name = "der-parser" +version = "8.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "dbd676fbbab537128ef0278adb5576cf363cff6aa22a7b24effe97347cfab61e" +dependencies = [ + "asn1-rs", + "displaydoc", + "nom", + "num-traits", + "rusticata-macros", +] + +[[package]] +name = "der_parser_test" +version = "0.1.0" +dependencies = [ + "base64", + "der-parser", + "hex", + "oid-registry", +] + +[[package]] +name = "displaydoc" +version = "0.2.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "487585f4d0c6655fe74905e2504d8ad6908e4db67f744eb140876906c2f3175d" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.39", +] + +[[package]] +name = "hex" +version = "0.4.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7f24254aa9a54b5c858eaee2f5bccdb46aaf0e486a595ed5fd8f86ba55232a70" + +[[package]] +name = "memchr" +version = "2.6.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f665ee40bc4a3c5590afb1e9677db74a508659dfd71e126420da8274909a0167" + +[[package]] +name = "minimal-lexical" +version = "0.2.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "68354c5c6bd36d73ff3feceb05efa59b6acb7626617f4962be322a825e61f79a" + +[[package]] +name = "nom" +version = "7.1.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d273983c5a657a70a3e8f2a01329822f3b8c8172b73826411a55751e404a0a4a" +dependencies = [ + "memchr", + "minimal-lexical", +] + +[[package]] +name = "num-traits" +version = "0.2.17" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "39e3200413f237f41ab11ad6d161bc7239c84dcb631773ccd7de3dfe4b5c267c" +dependencies = [ + "autocfg", +] + +[[package]] +name = "oid-registry" +version = "0.6.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9bedf36ffb6ba96c2eb7144ef6270557b52e54b20c0a8e1eb2ff99a6c6959bff" +dependencies = [ + "asn1-rs", +] + +[[package]] +name = "proc-macro2" +version = "1.0.69" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "134c189feb4956b20f6f547d2cf727d4c0fe06722b20a0eec87ed445a97f92da" +dependencies = [ + "unicode-ident", +] + +[[package]] +name = "quote" +version = "1.0.33" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5267fca4496028628a95160fc423a33e8b2e6af8a5302579e322e4b520293cae" +dependencies = [ + "proc-macro2", +] + +[[package]] +name = "rusticata-macros" +version = "4.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "faf0c4a6ece9950b9abdb62b1cfcf2a68b3b67a10ba445b3bb85be2a293d0632" +dependencies = [ + "nom", +] + +[[package]] +name = "syn" +version = "1.0.109" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "72b64191b275b66ffe2469e8af2c1cfe3bafa67b529ead792a6d0160888b4237" +dependencies = [ + "proc-macro2", + "quote", + "unicode-ident", +] + +[[package]] +name = "syn" +version = "2.0.39" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "23e78b90f2fcf45d3e842032ce32e3f2d1545ba6636271dcbf24fa306d87be7a" +dependencies = [ + "proc-macro2", + "quote", + "unicode-ident", +] + +[[package]] +name = "synstructure" +version = "0.12.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f36bdaa60a83aca3921b5259d5400cbf5e90fc51931376a9bd4a0eb79aa7210f" +dependencies = [ + "proc-macro2", + "quote", + "syn 1.0.109", + "unicode-xid", +] + +[[package]] +name = "thiserror" +version = "1.0.50" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f9a7210f5c9a7156bb50aa36aed4c95afb51df0df00713949448cf9e97d382d2" +dependencies = [ + "thiserror-impl", +] + +[[package]] +name = "thiserror-impl" +version = "1.0.50" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "266b2e40bc00e5a6c09c3584011e08b06f123c00362c92b975ba9843aaaa14b8" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.39", +] + +[[package]] +name = "unicode-ident" +version = "1.0.12" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3354b9ac3fae1ff6755cb6db53683adb661634f67557942dea4facebec0fee4b" + +[[package]] +name = "unicode-xid" +version = "0.2.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f962df74c8c05a667b5ee8bcf162993134c104e96440b663c8daa176dc772d8c" diff --git a/__serialization/der_parser_test/Cargo.toml b/__serialization/der_parser_test/Cargo.toml new file mode 100644 index 0000000..5dbeb12 --- /dev/null +++ b/__serialization/der_parser_test/Cargo.toml @@ -0,0 +1,12 @@ +[package] +name = "der_parser_test" +version = "0.1.0" +edition = "2021" + +# See more keys and their definitions at https://doc.rust-lang.org/cargo/reference/manifest.html + +[dependencies] +base64 = "0.21.5" +der-parser = "8.2.0" +hex = "0.4.3" +oid-registry = { version = "0.6.1", features = ["x962", "x509", "crypto", "pkcs1", "pkcs12", "pkcs7", "pkcs9", "kdf", "ms_spc", "nist_algs"] } diff --git a/__serialization/der_parser_test/src/main.rs b/__serialization/der_parser_test/src/main.rs new file mode 100644 index 0000000..d0fd0f1 --- /dev/null +++ b/__serialization/der_parser_test/src/main.rs @@ -0,0 +1,171 @@ +use base64::Engine; +use der_parser::ber::{BerObject, BerObjectContent}; +use der_parser::Oid; +use oid_registry::{OidEntry, OidRegistry}; +use oid_registry::asn1_rs::oid; + +fn main() { + let b = "MIIB3DCCAWKgAwIBAgIUBmlMvQ8s4PNWa2dFxhZH6gpVEpUwCgYIKoZIzj0EAwIw +HDEaMBgGA1UEAwwRSGF0dGVyIEVDIFJvb3QgQ0EwIBcNMjMxMDI5MDAwMDAwWhgP +MjA2MzEwMjkwMDAwMDBaMBwxGjAYBgNVBAMMEUhhdHRlciBFQyBSb290IENBMHYw +EAYHKoZIzj0CAQYFK4EEACIDYgAE3hLba+pjLyUPUiXO6DcSM0326f4yuziZiKNU +rBKfgJ7GZ6Yydlh2Ke33vyhoBcvTQlHP4ocWGwm0RdJ0Wz+99tkxegv8VskEqIEo +CU/U78w6DbcWvzQAAKfXUfGjjNpBo2MwYTAOBgNVHQ8BAf8EBAMCAQYwDwYDVR0T +AQH/BAUwAwEB/zAdBgNVHQ4EFgQUeYIe16r9vuTceUDXG0CAbI9Pp+owHwYDVR0j +BBgwFoAUeYIe16r9vuTceUDXG0CAbI9Pp+owCgYIKoZIzj0EAwIDaAAwZQIxANym +CiIqwtBXwcvn887Z9dnrdWXDEpJanID2nvwqa57ACIhTTu3d/UzFdOM6GWDR8AIw +bC9qIy+izBeFPfbggsz6U9nF5++LbtRHBFQ2InWoI4GZd074SGPcYRalMV3AUZ5m"; + let dd = base64::engine::general_purpose::STANDARD.decode(b.replace("\n", "")).unwrap(); + let ber_obj = der_parser::parse_ber(&dd).unwrap().1; + + // println!("{:#?}", ber_obj); + + let oid_reg = build_oid_register(); + print(&oid_reg, 0, &ber_obj); +} + +fn print(oid_reg: &OidRegistry, depth: usize, ber_obj: &BerObject) { + let prefix = " ".repeat(depth); + match &ber_obj.content { + BerObjectContent::EndOfContent => { + println!("{}END OF CONTENT", prefix); + } + BerObjectContent::Boolean(b) => { + println!("{}BOOLEAN: {}", prefix, b); + } + BerObjectContent::Integer(i) => { + println!("{}INTEGER: {}", prefix, hex::encode(i)); + } + BerObjectContent::BitString(u, b) => { + if let Ok(ber_obj) = der_parser::parse_ber(&b.data) { + println!("{}BIT STRING[{}]", prefix, u); + print(&oid_reg, depth + 1, &ber_obj.1); + } else { + println!("{}BIT STRING[{}] - {}", prefix, u, hex::encode(b.data)); + } + } + BerObjectContent::OctetString(s) => { + if let Ok(ber_obj) = der_parser::parse_ber(s) { + println!("{}OCTET STRING", prefix); + print(&oid_reg, depth + 1, &ber_obj.1); + } else { + println!("{}OCTET STRING: {}", prefix, hex::encode(s)); + } + } + BerObjectContent::Null => { + println!("{}NULL", prefix); + } + BerObjectContent::Enum(e) => { + println!("{}ENUM: {}", prefix, e); + } + BerObjectContent::OID(oid) => { + println!("{}OID: {}{}", prefix, oid, format_oid(oid_reg, oid)); + } + BerObjectContent::RelativeOID(oid) => { + println!("{}RELATIVE OID: {}{}", prefix, oid, format_oid(oid_reg, oid)); + } + BerObjectContent::NumericString(s) => { + println!("{}NUMERIC STRING: {}", prefix, s); + } + BerObjectContent::VisibleString(s) => { + println!("{}VISIBLE STRING: {}", prefix, s); + } + BerObjectContent::PrintableString(s) => { + println!("{}PRINTABLE STRING: {}", prefix, s); + } + BerObjectContent::IA5String(s) => { + println!("{}IA5 STRING: {}", prefix, s); + } + BerObjectContent::UTF8String(s) => { + println!("{}UTF8 STRING: {}", prefix, s); + } + BerObjectContent::T61String(s) => { + println!("{}T61 STRING: {}", prefix, s); + } + BerObjectContent::VideotexString(s) => { + println!("{}VIDEOTEX STRING: {}", prefix, s); + } + BerObjectContent::BmpString(s) => { + println!("{}BMP STRING: {}", prefix, s); + } + BerObjectContent::UniversalString(s) => { + println!("{}UNIVERSAL STRING: {}", prefix, hex::encode(s)); + } + BerObjectContent::GraphicString(s) => { + println!("{}GRAPHIC STRING: {}", prefix, s); + } + BerObjectContent::GeneralString(s) => { + println!("{}GENERAL STRING: {}", prefix, s); + } + BerObjectContent::ObjectDescriptor(d) => { + println!("{}OBJECT DESCRIPTOR: {}", prefix, d); + } + BerObjectContent::Sequence(ber_objects) => { + println!("{}SEQUENCE {{", prefix); + for b in ber_objects { + print(oid_reg, depth + 1, b); + } + println!("{}}}", prefix); + } + BerObjectContent::Set(ber_objects) => { + println!("{}SET {{", prefix); + for b in ber_objects { + print(oid_reg, depth + 1, b); + } + println!("{}}}", prefix); + } + BerObjectContent::UTCTime(t) => { + println!("{}UTC TIME: {}", prefix, t); + } + BerObjectContent::GeneralizedTime(t) => { + println!("{}GENERALIZED TIME: {}", prefix, t); + } + BerObjectContent::Optional(o) => { + println!("{}OPTIONAL {{", prefix); + match o { + None => { println!("{} NONE", prefix) } + Some(o) => { + print(oid_reg, depth + 1, o); + } + } + println!("{}}}", prefix); + } + BerObjectContent::Tagged(c, t, o) => { + println!("{}TAGGED class={} tag={} {{", prefix, c, t); + print(oid_reg, depth + 1, o); + println!("{}}}", prefix); + } + BerObjectContent::Unknown(u) => { + let tag = u.header.tag().0; + if let Ok(ber_obj) = der_parser::parse_ber(&u.data) { + println!("{}[{}]", prefix, tag); + print(&oid_reg, depth + 1, &ber_obj.1); + } else { + println!("{}[{}] {}", prefix, tag, hex::encode(&u.data)); + } + } + } +} + +fn format_oid(oid_reg: &OidRegistry, oid: &Oid) -> String { + match oid_reg.get(oid) { + None => "".to_string(), + Some(e) => format!(" // {} ({})", e.sn(), e.description()) + } +} + +fn build_oid_register() -> OidRegistry<'static> { + let mut oid_reg = OidRegistry::default() + .with_pkcs1() + .with_pkcs7() + .with_pkcs9() + .with_pkcs12() + .with_x509() + .with_x962() + .with_kdf() + .with_ms_spc() + .with_nist_algs(); + // more OIDs, https://site.hatter.ink/asn1js/oids.js + oid_reg.insert(oid!(1.2.156.10197.1.301), OidEntry::new("sm2ECC", "China GM Standards Committee")); + oid_reg +}