feat: add der_parser_test

This commit is contained in:
2023-11-25 23:40:00 +08:00
parent 11278926bf
commit 526dd4172b
4 changed files with 415 additions and 1 deletions

View File

@@ -22,6 +22,7 @@ Project or files:
├── __cpu ├── __cpu
│   └── x86 │   └── x86
├── __crypto ├── __crypto
│   ├── aegis-test
│   ├── aes_gcm_crypto │   ├── aes_gcm_crypto
│   ├── btc-address │   ├── btc-address
│   ├── crypto │   ├── crypto
@@ -39,6 +40,7 @@ Project or files:
│   ├── rpgp-demo │   ├── rpgp-demo
│   ├── rsa │   ├── rsa
│   ├── secp256k1 │   ├── secp256k1
│   ├── secretshare
│   ├── shamir-demo │   ├── shamir-demo
│   ├── simple_contract │   ├── simple_contract
│   ├── ssh-keys │   ├── ssh-keys
@@ -143,9 +145,11 @@ Project or files:
│   ├── async-speed-limit │   ├── async-speed-limit
│   ├── dingo │   ├── dingo
│   ├── fetch-rs │   ├── fetch-rs
│   ├── fuso-socks5-test
│   ├── ip │   ├── ip
│   ├── ipnet-demo │   ├── ipnet-demo
│   ├── iptables │   ├── iptables
│   ├── kcp-test
│   ├── mailsend │   ├── mailsend
│   ├── message_io │   ├── message_io
│   ├── n_pcap │   ├── n_pcap
@@ -183,6 +187,7 @@ Project or files:
│   ├── cbor │   ├── cbor
│   ├── configrs │   ├── configrs
│   ├── csv │   ├── csv
│   ├── der_parser_test
│   ├── encoding │   ├── encoding
│   ├── flatbuffers │   ├── flatbuffers
│   ├── gob │   ├── gob
@@ -275,6 +280,6 @@ Project or files:
├── vec.rs ├── vec.rs
└── while.rs └── while.rs
244 directories, 40 files 249 directories, 40 files
``` ```

226
__serialization/der_parser_test/Cargo.lock generated Normal file
View File

@@ -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"

View File

@@ -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"] }

View File

@@ -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
}