diff --git a/.gitignore b/.gitignore index 0ee5cf2..920d176 100644 --- a/.gitignore +++ b/.gitignore @@ -1,3 +1,4 @@ +.idea/ # ---> macOS # General .DS_Store diff --git a/Cargo.lock b/Cargo.lock index a5ddccc..6f72853 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -2,6 +2,41 @@ # It is not intended for manual editing. version = 3 +[[package]] +name = "aead" +version = "0.4.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0b613b8e1e3cf911a086f53f03bf286f52fd7a7258e4fa606f0ef220d39d8877" +dependencies = [ + "generic-array", +] + +[[package]] +name = "aes" +version = "0.7.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9e8b47f52ea9bae42228d07ec09eb676433d7c4ed1ebdf0f1d1c29ed446f1ab8" +dependencies = [ + "cfg-if", + "cipher 0.3.0", + "cpufeatures", + "opaque-debug", +] + +[[package]] +name = "aes-gcm" +version = "0.9.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "df5f85a83a7d8b0442b6aa7b504b8212c1733da07b98aae43d4bc21b2cb3cdf6" +dependencies = [ + "aead", + "aes", + "cipher 0.3.0", + "ctr", + "ghash", + "subtle", +] + [[package]] name = "android_system_properties" version = "0.1.5" @@ -50,6 +85,15 @@ dependencies = [ "syn 1.0.109", ] +[[package]] +name = "autocfg" +version = "0.1.8" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0dde43e75fd43e8a1bf86103336bc699aa8d17ad1be60c76c0bdfd4828e19b78" +dependencies = [ + "autocfg 1.1.0", +] + [[package]] name = "autocfg" version = "1.1.0" @@ -80,6 +124,16 @@ version = "1.3.2" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "bef38d45163c2f1dde094a7dfd33ccf595c92905c8f8f4fdc18d06fb1037718a" +[[package]] +name = "block-buffer" +version = "0.9.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4152116fd6e9dadb291ae18fc1ec3575ed6d84c29642d97890f4b4a3417297e4" +dependencies = [ + "block-padding", + "generic-array", +] + [[package]] name = "block-buffer" version = "0.10.4" @@ -89,6 +143,12 @@ dependencies = [ "generic-array", ] +[[package]] +name = "block-padding" +version = "0.2.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8d696c370c750c948ada61c69a0ee2cbbb9c50b1019ddb86d9317157a99c2cae" + [[package]] name = "bumpalo" version = "3.12.2" @@ -101,6 +161,12 @@ version = "1.4.3" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "14c189c53d098945499cdfa7ecc63567cf3886b3332b312a5b4585d8d3a6a610" +[[package]] +name = "bytes" +version = "1.4.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "89b2fd2a0dcf38d7971e2194b6b6eebab45ae01067456a7fd93d5547a61b70be" + [[package]] name = "cc" version = "1.0.79" @@ -128,6 +194,15 @@ dependencies = [ "winapi", ] +[[package]] +name = "cipher" +version = "0.3.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7ee52072ec15386f770805afd189a01c8841be8696bed250fa2f13c4c0d6dfb7" +dependencies = [ + "generic-array", +] + [[package]] name = "cipher" version = "0.4.4" @@ -187,6 +262,15 @@ dependencies = [ "typenum", ] +[[package]] +name = "ctr" +version = "0.8.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "049bb91fb4aaf0e3c7efa6cd5ef877dbbbd15b39dad06d9948de4ec8a75761ea" +dependencies = [ + "cipher 0.3.0", +] + [[package]] name = "data-encoding" version = "2.3.3" @@ -224,7 +308,16 @@ version = "0.8.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "ffdd80ce8ce993de27e9f063a444a4d53ce8e8db4c1f00cc03af5ad5a9867a1e" dependencies = [ - "cipher", + "cipher 0.4.4", +] + +[[package]] +name = "digest" +version = "0.9.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d3dd60d1080a57a05ab032377049e0591415d2b31afd7028356dbf3cc6dcb066" +dependencies = [ + "generic-array", ] [[package]] @@ -233,12 +326,33 @@ version = "0.10.6" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "8168378f4e5023e7218c89c891c0fd8ecdb5e5e4f18cb78f38cf245dd021e76f" dependencies = [ - "block-buffer", + "block-buffer 0.10.4", "const-oid", "crypto-common", "subtle", ] +[[package]] +name = "dirs-next" +version = "2.0.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b98cf8ebf19c3d1b223e151f99a4f9f0690dca41414773390fc824184ac833e1" +dependencies = [ + "cfg-if", + "dirs-sys-next", +] + +[[package]] +name = "dirs-sys-next" +version = "0.1.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4ebda144c4fe02d1f7ea1a7d9641b6fc6b580adcfa024ae48797ecdeb6825b4d" +dependencies = [ + "libc", + "redox_users", + "winapi", +] + [[package]] name = "displaydoc" version = "0.2.4" @@ -271,7 +385,7 @@ dependencies = [ "base16ct", "crypto-bigint", "der", - "digest", + "digest 0.10.6", "ff", "generic-array", "group", @@ -294,6 +408,12 @@ dependencies = [ "subtle", ] +[[package]] +name = "fnv" +version = "1.0.7" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3f9eec918d3f24069decb9af1554cad7c880e2da24a9afd88aca000531ab82c1" + [[package]] name = "generic-array" version = "0.14.7" @@ -315,6 +435,16 @@ dependencies = [ "wasi 0.11.0+wasi-snapshot-preview1", ] +[[package]] +name = "ghash" +version = "0.4.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1583cc1656d7839fd3732b80cf4f38850336cdb9b8ded1cd399ca62958de3c99" +dependencies = [ + "opaque-debug", + "polyval", +] + [[package]] name = "group" version = "0.12.1" @@ -341,7 +471,18 @@ version = "0.12.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "6c49c37c09c17a53d937dfbb742eb3a961d65a994e6bcdcf37e7399d0cc8ab5e" dependencies = [ - "digest", + "digest 0.10.6", +] + +[[package]] +name = "http" +version = "0.2.9" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "bd6effc99afb63425aff9b05836f029929e345a6148a14b7ecd5ab67af944482" +dependencies = [ + "bytes", + "fnv", + "itoa", ] [[package]] @@ -391,6 +532,15 @@ dependencies = [ "wasm-bindgen", ] +[[package]] +name = "keccak" +version = "0.1.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8f6d5ed8676d904364de097082f4e7d240b571b67989ced0240f08b7f966f940" +dependencies = [ + "cpufeatures", +] + [[package]] name = "lazy_static" version = "1.4.0" @@ -449,11 +599,30 @@ version = "0.4.3" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "f93ab6289c7b344a8a9f60f88d80aa20032336fe78da341afc91c8a2341fc75f" dependencies = [ - "autocfg", + "autocfg 1.1.0", "num-integer", "num-traits", ] +[[package]] +name = "num-bigint-dig" +version = "0.7.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4547ee5541c18742396ae2c895d0717d0f886d8823b8399cdaf7b07d63ad0480" +dependencies = [ + "autocfg 0.1.8", + "byteorder", + "lazy_static", + "libm", + "num-integer", + "num-iter", + "num-traits", + "rand", + "serde", + "smallvec", + "zeroize", +] + [[package]] name = "num-bigint-dig" version = "0.8.2" @@ -478,7 +647,7 @@ version = "0.1.45" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "225d3389fb3509a24c93f5c29eb6bde2586b98d9f016636dff58d7c6f7569cd9" dependencies = [ - "autocfg", + "autocfg 1.1.0", "num-traits", ] @@ -488,7 +657,7 @@ version = "0.1.43" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "7d03e6c028c5dc5cac6e2dec0efda81fc887605bb3d884578bb6d6bf7514e252" dependencies = [ - "autocfg", + "autocfg 1.1.0", "num-integer", "num-traits", ] @@ -499,10 +668,19 @@ version = "0.2.15" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "578ede34cf02f8924ab9447f50c28075b4d3e5b269972345e7e0372b38c6cdcd" dependencies = [ - "autocfg", + "autocfg 1.1.0", "libm", ] +[[package]] +name = "oid" +version = "0.2.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9c19903c598813dba001b53beeae59bb77ad4892c5c1b9b3500ce4293a0d06c2" +dependencies = [ + "serde", +] + [[package]] name = "oid-registry" version = "0.6.1" @@ -518,6 +696,12 @@ version = "1.17.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "b7e5500299e16ebb147ae15a00a942af264cf3688f47923b8fc2cd5858f23ad3" +[[package]] +name = "opaque-debug" +version = "0.3.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "624a8340c38c1b80fd549087862da4ba43e08858af025b236e509b6649fc13d5" + [[package]] name = "p256" version = "0.11.1" @@ -526,7 +710,7 @@ checksum = "51f44edd08f51e2ade572f141051021c5af22677e42b7dd28a88155151c33594" dependencies = [ "ecdsa", "elliptic-curve", - "sha2", + "sha2 0.10.6", ] [[package]] @@ -537,7 +721,7 @@ checksum = "dfc8c5bf642dde52bb9e87c0ecd8ca5a76faac2eeed98dedb7c717997e1080aa" dependencies = [ "ecdsa", "elliptic-curve", - "sha2", + "sha2 0.10.6", ] [[package]] @@ -546,7 +730,7 @@ version = "0.11.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "83a0692ec44e4cf1ef28ca317f14f8f07da2d95ec3fa01f86e4467b725e60917" dependencies = [ - "digest", + "digest 0.10.6", ] [[package]] @@ -568,6 +752,17 @@ dependencies = [ "pkg-config", ] +[[package]] +name = "pem" +version = "0.8.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "fd56cbd21fea48d0c440b41cd69c589faacade08c992d9a54e471b79d0fd13eb" +dependencies = [ + "base64", + "once_cell", + "regex", +] + [[package]] name = "pem-rfc7468" version = "0.6.0" @@ -577,6 +772,67 @@ dependencies = [ "base64ct", ] +[[package]] +name = "picky" +version = "6.3.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "fd6b25b296bb2a45678748f61c51f5a548ea56b25b0ad4966183709b386eaecf" +dependencies = [ + "aes-gcm", + "base64", + "digest 0.9.0", + "http", + "num-bigint-dig 0.7.0", + "oid", + "picky-asn1", + "picky-asn1-der", + "picky-asn1-x509", + "rand", + "rsa 0.4.0", + "serde", + "serde_json", + "sha-1", + "sha2 0.9.9", + "sha3", + "thiserror", +] + +[[package]] +name = "picky-asn1" +version = "0.3.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "889bbb26c80acf919e89980dfc8e04eb19df272d8a9893ec9b748d3a1675abde" +dependencies = [ + "oid", + "serde", + "serde_bytes", +] + +[[package]] +name = "picky-asn1-der" +version = "0.2.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "acbbd5390ab967396cc7473e6e0848684aec7166e657c6088604e07b54a73dbe" +dependencies = [ + "picky-asn1", + "serde", + "serde_bytes", +] + +[[package]] +name = "picky-asn1-x509" +version = "0.6.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f3033675030de806aba1d5470949701b7c9f1dbf77e3bb17bd12e5f945e560ba" +dependencies = [ + "base64", + "num-bigint-dig 0.7.0", + "oid", + "picky-asn1", + "picky-asn1-der", + "serde", +] + [[package]] name = "pkcs1" version = "0.4.1" @@ -605,6 +861,18 @@ version = "0.3.27" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "26072860ba924cbfa98ea39c8c19b4dd6a4a25423dbdf219c1eca91aa0cf6964" +[[package]] +name = "polyval" +version = "0.5.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8419d2b623c7c0896ff2d5d96e2cb4ede590fed28fcc34934f4c33c036e620a1" +dependencies = [ + "cfg-if", + "cpufeatures", + "opaque-debug", + "universal-hash", +] + [[package]] name = "ppv-lite86" version = "0.2.17" @@ -659,6 +927,41 @@ dependencies = [ "getrandom", ] +[[package]] +name = "redox_syscall" +version = "0.2.16" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "fb5a58c1855b4b6819d59012155603f0b22ad30cad752600aadfcb695265519a" +dependencies = [ + "bitflags", +] + +[[package]] +name = "redox_users" +version = "0.4.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b033d837a7cf162d7993aded9304e30a83213c648b6e389db233191f891e5c2b" +dependencies = [ + "getrandom", + "redox_syscall", + "thiserror", +] + +[[package]] +name = "regex" +version = "1.8.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "af83e617f331cc6ae2da5443c602dfa5af81e517212d9d611a5b3ba1777b5370" +dependencies = [ + "regex-syntax", +] + +[[package]] +name = "regex-syntax" +version = "0.7.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a5996294f19bd3aae0453a862ad728f60e6600695733dd5df01da90c54363a3c" + [[package]] name = "rfc6979" version = "0.3.1" @@ -670,6 +973,26 @@ dependencies = [ "zeroize", ] +[[package]] +name = "rsa" +version = "0.4.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "68ef841a26fc5d040ced0417c6c6a64ee851f42489df11cdf0218e545b6f8d28" +dependencies = [ + "byteorder", + "digest 0.9.0", + "lazy_static", + "num-bigint-dig 0.7.0", + "num-integer", + "num-iter", + "num-traits", + "pem", + "rand", + "simple_asn1", + "subtle", + "zeroize", +] + [[package]] name = "rsa" version = "0.7.2" @@ -677,8 +1000,8 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "094052d5470cbcef561cb848a7209968c9f12dfa6d668f4bca048ac5de51099c" dependencies = [ "byteorder", - "digest", - "num-bigint-dig", + "digest 0.10.6", + "num-bigint-dig 0.8.2", "num-integer", "num-iter", "num-traits", @@ -691,6 +1014,18 @@ dependencies = [ "zeroize", ] +[[package]] +name = "rust_util" +version = "0.6.41" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "df24005feacce81f4ae340464b39c380f7e01e7225bfdef62d40cb44cb1c11d7" +dependencies = [ + "lazy_static", + "libc", + "term", + "term_size", +] + [[package]] name = "rusticata-macros" version = "4.1.0" @@ -700,6 +1035,18 @@ dependencies = [ "nom", ] +[[package]] +name = "rustversion" +version = "1.0.12" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4f3208ce4d8448b3f3e7d168a73f5e0c43a61e32930de3bceeccedb388b6bf06" + +[[package]] +name = "ryu" +version = "1.0.13" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f91339c0467de62360649f8d3e185ca8de4224ff281f66000de5eb2a77a79041" + [[package]] name = "sec1" version = "0.3.0" @@ -728,6 +1075,53 @@ name = "serde" version = "1.0.163" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "2113ab51b87a539ae008b5c6c02dc020ffa39afd2d83cffcb3f4eb2722cebec2" +dependencies = [ + "serde_derive", +] + +[[package]] +name = "serde_bytes" +version = "0.11.9" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "416bda436f9aab92e02c8e10d49a15ddd339cea90b6e340fe51ed97abb548294" +dependencies = [ + "serde", +] + +[[package]] +name = "serde_derive" +version = "1.0.163" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8c805777e3930c8883389c602315a24224bcc738b63905ef87cd1420353ea93e" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.15", +] + +[[package]] +name = "serde_json" +version = "1.0.96" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "057d394a50403bcac12672b2b18fb387ab6d289d957dab67dd201875391e52f1" +dependencies = [ + "itoa", + "ryu", + "serde", +] + +[[package]] +name = "sha-1" +version = "0.9.8" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "99cd6713db3cf16b6c84e06321e049a9b9f699826e16096d23bbcc44d15d51a6" +dependencies = [ + "block-buffer 0.9.0", + "cfg-if", + "cpufeatures", + "digest 0.9.0", + "opaque-debug", +] [[package]] name = "sha1" @@ -737,7 +1131,20 @@ checksum = "f04293dc80c3993519f2d7f6f511707ee7094fe0c6d3406feb330cdb3540eba3" dependencies = [ "cfg-if", "cpufeatures", - "digest", + "digest 0.10.6", +] + +[[package]] +name = "sha2" +version = "0.9.9" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4d58a1e1bf39749807d89cf2d98ac2dfa0ff1cb3faa38fbb64dd88ac8013d800" +dependencies = [ + "block-buffer 0.9.0", + "cfg-if", + "cpufeatures", + "digest 0.9.0", + "opaque-debug", ] [[package]] @@ -748,7 +1155,19 @@ checksum = "82e6b795fe2e3b1e845bafcb27aa35405c4d47cdfc92af5fc8d3002f76cebdc0" dependencies = [ "cfg-if", "cpufeatures", - "digest", + "digest 0.10.6", +] + +[[package]] +name = "sha3" +version = "0.9.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f81199417d4e5de3f04b1e871023acea7389672c4135918f05aa9cbf2f2fa809" +dependencies = [ + "block-buffer 0.9.0", + "digest 0.9.0", + "keccak", + "opaque-debug", ] [[package]] @@ -757,10 +1176,22 @@ version = "1.6.4" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "74233d3b3b2f6d4b006dc19dee745e73e2a6bfb6f93607cd3b02bd5b00797d7c" dependencies = [ - "digest", + "digest 0.10.6", "rand_core", ] +[[package]] +name = "simple_asn1" +version = "0.5.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8eb4ea60fb301dc81dfc113df680571045d375ab7345d171c5dc7d7e13107a80" +dependencies = [ + "chrono", + "num-bigint", + "num-traits", + "thiserror", +] + [[package]] name = "smallvec" version = "1.10.0" @@ -823,6 +1254,27 @@ dependencies = [ "unicode-xid", ] +[[package]] +name = "term" +version = "0.7.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c59df8ac95d96ff9bede18eb7300b0fda5e5d8d90960e76f8e14ae765eedbf1f" +dependencies = [ + "dirs-next", + "rustversion", + "winapi", +] + +[[package]] +name = "term_size" +version = "0.3.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1e4129646ca0ed8f45d09b929036bafad5377103edd06e50bf574b353d2b08d9" +dependencies = [ + "libc", + "winapi", +] + [[package]] name = "thiserror" version = "1.0.40" @@ -899,6 +1351,16 @@ version = "0.2.4" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "f962df74c8c05a667b5ee8bcf162993134c104e96440b663c8daa176dc772d8c" +[[package]] +name = "universal-hash" +version = "0.4.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9f214e8f697e925001e66ec2c6e37a4ef93f0f78c2eed7814394e10c62025b05" +dependencies = [ + "generic-array", + "subtle", +] + [[package]] name = "uuid" version = "1.3.2" @@ -1111,7 +1573,7 @@ dependencies = [ "hmac", "log", "nom", - "num-bigint-dig", + "num-bigint-dig 0.8.2", "num-integer", "num-traits", "p256", @@ -1119,10 +1581,10 @@ dependencies = [ "pbkdf2", "pcsc", "rand_core", - "rsa", + "rsa 0.7.2", "secrecy", "sha1", - "sha2", + "sha2 0.10.6", "subtle", "uuid", "x509", @@ -1134,7 +1596,10 @@ dependencies = [ name = "yubikey-ca" version = "0.1.0" dependencies = [ + "picky", + "rust_util", "yubikey", + "zeroize", ] [[package]] @@ -1142,3 +1607,17 @@ name = "zeroize" version = "1.6.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "2a0956f1ba7c7909bfb66c2e9e4124ab6f6482560f6628b5aaeba39207c9aad9" +dependencies = [ + "zeroize_derive", +] + +[[package]] +name = "zeroize_derive" +version = "1.4.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ce36e65b0d2999d2aafac989fb249189a141aee1f53c612c1f37d72631959f69" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.15", +] diff --git a/Cargo.toml b/Cargo.toml index c02fe86..b6b4290 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -6,4 +6,7 @@ edition = "2021" # See more keys and their definitions at https://doc.rust-lang.org/cargo/reference/manifest.html [dependencies] +picky = "6.3" +rust_util = "0.6.41" yubikey = { version = "0.7", features = ["untested"] } +zeroize = "1.6" diff --git a/src/main.rs b/src/main.rs index e7a11a9..6feeef5 100644 --- a/src/main.rs +++ b/src/main.rs @@ -1,3 +1,95 @@ -fn main() { - println!("Hello, world!"); +use picky::hash::HashAlgorithm; +use picky::key::PrivateKey; +use picky::signature::SignatureAlgorithm; +use picky::x509::certificate::{CertificateBuilder, CertType}; +use picky::x509::date::UTCDate; +use picky::x509::{Csr, KeyIdGenMethod}; +use picky::x509::name::DirectoryName; +use rust_util::XResult; + +const root_key_pem_str: &'static str = "-----BEGIN PRIVATE KEY----- +MIIEvAIBADANBgkqhkiG9w0BAQEFAASCBKYwggSiAgEAAoIBAQCkd2pFHVhY1jUE +jWx1umIYStJSzeyippNiV0Igzi6eh7sKjzors/GJKG2MI8NOpKkavZ5qkJOj6sNL +bFNBtNgif96k6qTmUI5JbUlbu1mrroku+ZM4oPoQ2gGiGdLkUjGIys/0Yt+OmauQ +9Eno6uX8oZ9o2x9dNx6MZAKsFKbssyF0mMG6xDpHnoEuLYN5zlmooR9Cktjx0Il3 +5NchEs5RRGwixlvyKq2J3qRhalEKhkCNqbtQJ3n4/Eiia2v7Byt1c5dCoaVyxIl4 +AIpF/hY+or9O9E2LRLxeqh/0t2rCQm8JANYA+48+38UZGrQhAwp48ZWML4LuE3By +7+yIj1MpAgMBAAECggEAErQV3MhKjMfHfb4LkJPipfqUUqBigdjJuAxOU+a+vH6Z +EclaBzBOjpePZbmHc4EcThM0WdAZSjHfhctK6JUFY18BVeXtXNfaZpVMG2eB+hk+ +Np5hVLZR2erA9stTBW4nffP6lENOQyxMq45sfVWBVCqZM1aACZzEF5kkCKfMl+xU +fEpK9w/LOZVWtA3PIqKvoj+S8x16iupFpikMJvcat1gYhpbaLt2S9rDPlSgIlpxF +HJpzPqbQV7yJSYjtwAqx3LqgUbSEpXhRKEgckiNdtCzYVEcNipMGtEBwHZhSExnN +5jGnhiqH+HVvSTJ/Qq3sFe1jEnwvj4ChQ4GpjTw9NQKBgQDPlPDUQPNJ+zVv/9dp +/DTuV+Ne/HaqGOEsjADFTjlDGgDUx1M4cLsNf9o5JqmvHHLK4LFGX16F51ArIJ8f +lcGWKTIARuwbQhs5u2wbze2AuZHjypYqsYIGglSS+UUGTnbrPatKryANupxQiOnd +Uv7IsFQqg/iCaofO8dQhluDu8wKBgQDK0/wtCvtH1w5pTlTkEDSHNW1MxS9lRsD5 +FvCqMYo+bm8vHr4p8EC+xaMQynIe1WspQSGK/SYA/+JIO/W/U7RTikXhtuFSeiJe +YgcXl8VMIfOKcz++bZybtjyZ3J8Fxe019d9/cPmxkheRDQVfVZWPPrBpsmc50Wg5 +u4m9lgMUcwKBgHNIp3tp2vPyZNofv1XoMMlR3D/LfGe5S4z+8AqkB99BWMbTMF+/ +E9NKdzqYQ1KyPPp5UVrg6lD5hyd8hYL4G7w2gsNun///dblZYpAKjOWZqfFVeJKb +ZLgSt7+sWm5HM3owFKp0mhul0NxVPXSifEeezg+SnXhoi6Yd3g8NiTyLAoGAMr/j +4ylSQmFu+65b00yyt/oIRSM5fq+7bRfuU8ddfc2ICFQ65Kd2q8UrzfG5qDliPMpN +KEe7EJj193j5PkwlXJnGbnmh208v9km02JRjC2+bTlMT6gPnIZbxhtYK/BjQB6Zj +q7GK6IFTYDnP1FDHwTXAUlIPPgpFd9yS1FsKnj0CgYABMsHhjwTH2WNmG8EcrfMJ +4bs1RvJK0UM4k7EVFXoZb9PqTKTdXeiPkIqX9FBqs5FLRKKFTA9VkI/m/5FbP1pu +kSvHNwF67xzFi/QC4/oKNdZ2TPuiskxY0hSr9LKPIj0x4vhpbLEqmmPnnoE1gBdU +/LCUqlcJNNtk6/sN/IShpw== +-----END PRIVATE KEY-----"; + +const intermediate_key_pem_str: &'static str = root_key_pem_str; +const leaf_key_pem_str: &'static str = root_key_pem_str; + +fn main() -> XResult<()> { + let root_key = PrivateKey::from_pem_str(root_key_pem_str)?; + + let root = CertificateBuilder::new() + .validity(UTCDate::ymd(2020, 9, 28).unwrap(), + UTCDate::ymd(2023, 9, 28).unwrap()) + .self_signed(DirectoryName::new_common_name("My Root CA"), &root_key) + .ca(true) + .signature_hash_type(SignatureAlgorithm::RsaPkcs1v15(HashAlgorithm::SHA2_512)) + .key_id_gen_method(KeyIdGenMethod::SPKFullDER(HashAlgorithm::SHA2_384)) + .build()?; + assert_eq!(root.ty(), CertType::Root); + println!("{}", root.to_pem().unwrap()); + + + let intermediate_key = PrivateKey::from_pem_str(intermediate_key_pem_str)?; + + let intermediate = CertificateBuilder::new() + .validity(UTCDate::ymd(2020, 10, 15).unwrap(), + UTCDate::ymd(2021, 10, 15).unwrap()) + .subject(DirectoryName::new_common_name("My Authority"), + intermediate_key.to_public_key()) + .issuer_cert(&root, &root_key) + .signature_hash_type(SignatureAlgorithm::RsaPkcs1v15(HashAlgorithm::SHA2_224)) + .key_id_gen_method(KeyIdGenMethod::SPKValueHashedLeftmost160(HashAlgorithm::SHA1)) + .ca(true) + .pathlen(0) + .build()?; + assert_eq!(intermediate.ty(), CertType::Intermediate); + println!("{}", intermediate.to_pem().unwrap()); + + + let leaf_key = PrivateKey::from_pem_str(leaf_key_pem_str)?; + + let csr = Csr::generate( + DirectoryName::new_common_name("My Leaf"), + &leaf_key, + SignatureAlgorithm::RsaPkcs1v15(HashAlgorithm::SHA1), + )?; + + let signed_leaf = CertificateBuilder::new() + .validity(UTCDate::ymd(2020, 11, 1).unwrap(), + UTCDate::ymd(2021, 1, 1).unwrap()) + .subject_from_csr(csr) + .issuer_cert(&intermediate, &intermediate_key) + .signature_hash_type(SignatureAlgorithm::RsaPkcs1v15(HashAlgorithm::SHA2_384)) + .key_id_gen_method(KeyIdGenMethod::SPKFullDER(HashAlgorithm::SHA2_512)) + .build()?; + + assert_eq!(signed_leaf.ty(), CertType::Leaf); + println!("{}", signed_leaf.to_pem().unwrap()); + + Ok(()) }