diff --git a/__crypto/asn1-der-test/Cargo.lock b/__crypto/asn1-der-test/Cargo.lock new file mode 100644 index 0000000..8c66a04 --- /dev/null +++ b/__crypto/asn1-der-test/Cargo.lock @@ -0,0 +1,185 @@ +# This file is automatically @generated by Cargo. +# It is not intended for manual editing. +version = 3 + +[[package]] +name = "asn1-der-test" +version = "0.1.0" +dependencies = [ + "asn1-rs", + "base64", + "hex", +] + +[[package]] +name = "asn1-rs" +version = "0.6.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "22ad1373757efa0f70ec53939aabc7152e1591cb485208052993070ac8d2429d" +dependencies = [ + "asn1-rs-derive", + "asn1-rs-impl", + "displaydoc", + "nom", + "num-traits", + "rusticata-macros", + "thiserror", +] + +[[package]] +name = "asn1-rs-derive" +version = "0.5.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7378575ff571966e99a744addeff0bff98b8ada0dedf1956d59e634db95eaac1" +dependencies = [ + "proc-macro2", + "quote", + "syn", + "synstructure", +] + +[[package]] +name = "asn1-rs-impl" +version = "0.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7b18050c2cd6fe86c3a76584ef5e0baf286d038cda203eb6223df2cc413565f7" +dependencies = [ + "proc-macro2", + "quote", + "syn", +] + +[[package]] +name = "autocfg" +version = "1.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f1fdabc7756949593fe60f30ec81974b613357de856987752631dea1e3394c80" + +[[package]] +name = "base64" +version = "0.22.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9475866fec1451be56a3c2400fd081ff546538961565ccb5b7142cbd22bc7a51" + +[[package]] +name = "displaydoc" +version = "0.2.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "487585f4d0c6655fe74905e2504d8ad6908e4db67f744eb140876906c2f3175d" +dependencies = [ + "proc-macro2", + "quote", + "syn", +] + +[[package]] +name = "hex" +version = "0.4.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7f24254aa9a54b5c858eaee2f5bccdb46aaf0e486a595ed5fd8f86ba55232a70" + +[[package]] +name = "memchr" +version = "2.7.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "523dc4f511e55ab87b694dc30d0f820d60906ef06413f93d4d7a1385599cc149" + +[[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.18" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "da0df0e5185db44f69b44f26786fe401b6c293d1907744beaa7fa62b2e5a517a" +dependencies = [ + "autocfg", +] + +[[package]] +name = "proc-macro2" +version = "1.0.79" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e835ff2298f5721608eb1a980ecaee1aef2c132bf95ecc026a11b7bf3c01c02e" +dependencies = [ + "unicode-ident", +] + +[[package]] +name = "quote" +version = "1.0.35" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "291ec9ab5efd934aaf503a6466c5d5251535d108ee747472c3977cc5acc868ef" +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 = "2.0.55" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "002a1b3dbf967edfafc32655d0f377ab0bb7b994aa1d32c8cc7e9b8bf3ebb8f0" +dependencies = [ + "proc-macro2", + "quote", + "unicode-ident", +] + +[[package]] +name = "synstructure" +version = "0.13.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c8af7666ab7b6390ab78131fb5b0fce11d6b7a6951602017c35fa82800708971" +dependencies = [ + "proc-macro2", + "quote", + "syn", +] + +[[package]] +name = "thiserror" +version = "1.0.58" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "03468839009160513471e86a034bb2c5c0e4baae3b43f79ffc55c4a5427b3297" +dependencies = [ + "thiserror-impl", +] + +[[package]] +name = "thiserror-impl" +version = "1.0.58" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c61f3ba182994efc43764a46c018c347bc492c79f024e705f46567b418f6d4f7" +dependencies = [ + "proc-macro2", + "quote", + "syn", +] + +[[package]] +name = "unicode-ident" +version = "1.0.12" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3354b9ac3fae1ff6755cb6db53683adb661634f67557942dea4facebec0fee4b" diff --git a/__crypto/asn1-der-test/Cargo.toml b/__crypto/asn1-der-test/Cargo.toml new file mode 100644 index 0000000..dd81528 --- /dev/null +++ b/__crypto/asn1-der-test/Cargo.toml @@ -0,0 +1,11 @@ +[package] +name = "asn1-der-test" +version = "0.1.0" +edition = "2021" + +# See more keys and their definitions at https://doc.rust-lang.org/cargo/reference/manifest.html + +[dependencies] +asn1-rs = "0.6.1" +base64 = "0.22.0" +hex = "0.4.3" diff --git a/__crypto/asn1-der-test/src/bin/test1.rs b/__crypto/asn1-der-test/src/bin/test1.rs new file mode 100644 index 0000000..f9673e4 --- /dev/null +++ b/__crypto/asn1-der-test/src/bin/test1.rs @@ -0,0 +1,86 @@ +use std::str::FromStr; + +use asn1_rs::{ + BitString, Class, Error, Explicit, Integer, + OctetString, Oid, Sequence, TaggedValue, ToDer, +}; +use base64::{Engine, engine::GeneralPurpose}; + +const BASE64: GeneralPurpose = base64::engine::general_purpose::STANDARD; + +// -----BEGIN PRIVATE KEY----- +// MIG2AgEAMBAGByqGSM49AgEGBSuBBAAiBIGeMIGbAgEBBDB0n4af3g3zaB67WD+/ +// Xe+FNOkwvuoDd/YUPh0y5ZfoBlkqG1WGNkZN2/d4EYqrNrahZANiAAR2vgKLjiAd +// I6l4EAyxGKwGBJ6pAdYZvNlBi8X9kKlCj6aYi5kSKqUfAMaQAX9+0WPoQ6Cy/gzi +// bPPmlPRMa4SdTKgZvvw5nuyNXZQU/wN69Opz/hCqxZHKYx5zSznj4/g= +// -----END PRIVATE KEY----- +// 0 182: SEQUENCE { +// 3 1: INTEGER 0 +// 6 16: SEQUENCE { +// 8 7: OBJECT IDENTIFIER ecPublicKey (1 2 840 10045 2 1) +// 17 5: OBJECT IDENTIFIER secp384r1 (1 3 132 0 34) +// : } +// 24 158: OCTET STRING, encapsulates { +// 27 155: SEQUENCE { +// 30 1: INTEGER 1 +// 33 48: OCTET STRING +// : 74 9F 86 9F DE 0D F3 68 1E BB 58 3F BF 5D EF 85 +// : 34 E9 30 BE EA 03 77 F6 14 3E 1D 32 E5 97 E8 06 +// : 59 2A 1B 55 86 36 46 4D DB F7 78 11 8A AB 36 B6 +// 83 100: [1] { +// 85 98: BIT STRING +// : 04 76 BE 02 8B 8E 20 1D 23 A9 78 10 0C B1 18 AC +// : 06 04 9E A9 01 D6 19 BC D9 41 8B C5 FD 90 A9 42 +// : 8F A6 98 8B 99 12 2A A5 1F 00 C6 90 01 7F 7E D1 +// : 63 E8 43 A0 B2 FE 0C E2 6C F3 E6 94 F4 4C 6B 84 +// : 9D 4C A8 19 BE FC 39 9E EC 8D 5D 94 14 FF 03 7A +// : F4 EA 73 FE 10 AA C5 91 CA 63 1E 73 4B 39 E3 E3 +// : F8 +// : } +// : } +// : } +// : } +fn main() { + let ec_public_key = Oid::from_str("1.2.840.10045.2.1").unwrap(); + let secp_384_r1 = Oid::from_str("1.3.132.0.34").unwrap(); + let mut v = Vec::new(); + ec_public_key.write_der(&mut v).unwrap(); + secp_384_r1.write_der(&mut v).unwrap(); + let seq = Sequence::new(v.into()); + + let hex1 = hex::decode("749F869FDE0DF3681EBB583FBF5DEF8534E930BEEA0377F6143E1D32E597E806592A1B558636464DDBF778118AAB36B6").unwrap(); + let hex2 = hex::decode("0476BE028B8E201D23A978100CB118AC06049EA901D619BCD9418BC5FD90A9428FA6988B99122AA51F00C690017F7ED163E843A0B2FE0CE26CF3E694F44C6B849D4CA819BEFC399EEC8D5D9414FF037AF4EA73FE10AAC591CA631E734B39E3E3F8").unwrap(); + let seq3 = { + let i1 = Integer::from_i8(1); + let oct = OctetString::new(&hex1); + + let bit = BitString::new(0, &hex2); + // let mut vb = Vec::new(); + // bit.write_der(&mut vb).unwrap(); + // let set = Set::new(vb.into()); + + let mut vv = Vec::new(); + i1.write_der(&mut vv).unwrap(); + oct.write_der(&mut vv).unwrap(); + + type TaggedValueContextSpecific<'a> = TaggedValue, Error, Explicit, { Class::CONTEXT_SPECIFIC }, 1>; + let tag = TaggedValueContextSpecific::explicit(bit); + tag.write_der(&mut vv).unwrap(); + + Sequence::new(vv.into()) + }; + let btss = seq3.to_der_vec().unwrap(); + let bts = OctetString::new(&btss); + + let mut vp = Vec::new(); + let i0 = Integer::from_i8(0); + i0.write_der(&mut vp).unwrap(); + seq.write_der(&mut vp).unwrap(); + bts.write_der(&mut vp).unwrap(); + + let seqlast = Sequence::new(vp.into()); + + + println!("BASED64:\n{}", BASE64.encode(seqlast.to_der_vec().unwrap())); + println!("HEX:\n{}", hex::encode(seqlast.to_der_vec().unwrap())); +} diff --git a/__crypto/asn1-der-test/src/bin/test2.rs b/__crypto/asn1-der-test/src/bin/test2.rs new file mode 100644 index 0000000..0aa7930 --- /dev/null +++ b/__crypto/asn1-der-test/src/bin/test2.rs @@ -0,0 +1,52 @@ +use asn1_rs::{BitString, Class, Error, Explicit, Integer, OctetString, Oid, ParseResult, Sequence, TaggedValue}; +use asn1_rs::FromDer; +use base64::Engine; +use base64::engine::GeneralPurpose; + +const BASE64: GeneralPurpose = base64::engine::general_purpose::STANDARD; + +fn main() { + let private_key = "MIGHAgEAMBMGByqGSM49AgEGCCqGSM49AwEHBG0wawIBAQQgakRmuDPA8pr1kqmY\ + PxjoMJSJzMeWllw0qbKWzrbEfzehRANCAAQs2XCluo7NF7Y0tL6Pp2GWz2fw5llF\ + dRvIpq0j8kVQjNOIYZqlBG6OOMQql3U95HsJJY0YzkoXEcdcJmoIV0zn"; + + let private_key_der = BASE64.decode(private_key).unwrap(); + + let r: ParseResult<()> = Sequence::from_der_and_then(&private_key_der, |i| { + let (i, i0) = Integer::from_der(i)?; + println!("INTEGER0: {}", i0.as_i8().unwrap()); + let r: ParseResult<()> = Sequence::from_der_and_then(i, |i| { + let (i, oid1) = Oid::from_der(i)?; + let (i, oid2) = Oid::from_der(i)?; + + println!("OID1: {}", oid1); + println!("OID2: {}", oid2); + Ok((i, ())) + }); + + let (i, _) = r.unwrap(); + + let (i, octet) = OctetString::from_der(i).unwrap(); + let octet = octet.as_ref(); + + let r: ParseResult<()> = Sequence::from_der_and_then(octet, |i| { + let (i, i1) = Integer::from_der(i).unwrap(); + println!("INTEGER1: {}", i1.as_i8().unwrap()); + let (i, oct) = OctetString::from_der(i)?; + println!("PRIVATE KEY: {}", hex::encode(oct.as_ref())); + + type TaggedValueContextSpecific<'a> = TaggedValue, Error, Explicit, { Class::CONTEXT_SPECIFIC }, 1>; + let tagged_value = TaggedValueContextSpecific::from_der(i); + let _ = tagged_value.map(|(_i, tagged_value)| { + println!("Tagged value [{}]", tagged_value.tag().0); + let tagged_value_inner = tagged_value.into_inner(); + println!("Tagged value: {}, unused: {}", hex::encode(tagged_value_inner.as_ref()), tagged_value_inner.unused_bits); + }); + + Ok((i, ())) + }); + r.unwrap(); + Ok((i, ())) + }); + r.unwrap(); +} \ No newline at end of file