diff --git a/Cargo.lock b/Cargo.lock index be29e5d..f579414 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -4,1038 +4,1037 @@ name = "atty" version = "0.2.14" source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d9b39be18770d11421cdb1b9947a45dd3f37e93092cbf377614828a319d5fee8" dependencies = [ - "hermit-abi 0.1.15 (registry+https://github.com/rust-lang/crates.io-index)", - "libc 0.2.71 (registry+https://github.com/rust-lang/crates.io-index)", - "winapi 0.3.8 (registry+https://github.com/rust-lang/crates.io-index)", + "hermit-abi", + "libc", + "winapi", ] [[package]] name = "autocfg" version = "1.0.0" source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f8aac770f1885fd7e387acedd76065302551364496e46b3dd00860b2f8359b9d" [[package]] name = "base64" version = "0.12.3" source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3441f0f7b02788e948e47f457ca01f1d7e6d92c693bc132c22b087d3141c03ff" [[package]] name = "bit-set" version = "0.5.2" source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6e11e16035ea35e4e5997b393eacbf6f63983188f7a2ad25bfb13465f5ad59de" dependencies = [ - "bit-vec 0.6.2 (registry+https://github.com/rust-lang/crates.io-index)", + "bit-vec", ] [[package]] name = "bit-vec" version = "0.6.2" source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5f0dc55f2d8a1a85650ac47858bb001b4c0dd73d79e3c455a842925e68d29cd3" [[package]] name = "bitflags" version = "1.2.1" source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "cf1de2fe8c75bc145a2f577add951f8134889b4795d47466a54a5c846d691693" [[package]] name = "block-buffer" version = "0.9.0" source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4152116fd6e9dadb291ae18fc1ec3575ed6d84c29642d97890f4b4a3417297e4" dependencies = [ - "generic-array 0.14.3 (registry+https://github.com/rust-lang/crates.io-index)", + "generic-array 0.14.3", ] [[package]] name = "bstr" version = "0.2.13" source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "31accafdb70df7871592c058eca3985b71104e15ac32f64706022c58867da931" dependencies = [ - "lazy_static 1.4.0 (registry+https://github.com/rust-lang/crates.io-index)", - "memchr 2.3.3 (registry+https://github.com/rust-lang/crates.io-index)", - "regex-automata 0.1.9 (registry+https://github.com/rust-lang/crates.io-index)", - "serde 1.0.111 (registry+https://github.com/rust-lang/crates.io-index)", + "lazy_static", + "memchr", + "regex-automata", + "serde", ] [[package]] name = "bumpalo" version = "3.4.0" source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2e8c087f005730276d1096a652e92a8bacee2e2472bcc9715a74d2bec38b5820" [[package]] name = "byteorder" version = "1.3.4" source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "08c48aae112d48ed9f069b33538ea9e3e90aa263cfa3d1c24309612b1f7472de" [[package]] name = "cast" version = "0.2.3" source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4b9434b9a5aa1450faa3f9cb14ea0e8c53bb5d2b3c1bfd1ab4fc03e9f33fbfb0" dependencies = [ - "rustc_version 0.2.3 (registry+https://github.com/rust-lang/crates.io-index)", + "rustc_version", ] [[package]] name = "cfg-if" version = "0.1.10" source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4785bdd1c96b2a846b2bd7cc02e86b6b3dbf14e7e53446c4f54c92a361040822" [[package]] name = "clap" version = "2.33.1" source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "bdfa80d47f954d53a35a64987ca1422f495b8d6483c0fe9f7117b36c2a792129" dependencies = [ - "bitflags 1.2.1 (registry+https://github.com/rust-lang/crates.io-index)", - "textwrap 0.11.0 (registry+https://github.com/rust-lang/crates.io-index)", - "unicode-width 0.1.8 (registry+https://github.com/rust-lang/crates.io-index)", + "bitflags", + "textwrap", + "unicode-width", ] [[package]] name = "cpuid-bool" version = "0.1.2" source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8aebca1129a03dc6dc2b127edd729435bbc4a37e1d5f4d7513165089ceb02634" [[package]] name = "criterion" version = "0.3.3" source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "70daa7ceec6cf143990669a04c7df13391d55fb27bd4079d252fca774ba244d8" dependencies = [ - "atty 0.2.14 (registry+https://github.com/rust-lang/crates.io-index)", - "cast 0.2.3 (registry+https://github.com/rust-lang/crates.io-index)", - "clap 2.33.1 (registry+https://github.com/rust-lang/crates.io-index)", - "criterion-plot 0.4.3 (registry+https://github.com/rust-lang/crates.io-index)", - "csv 1.1.3 (registry+https://github.com/rust-lang/crates.io-index)", - "itertools 0.9.0 (registry+https://github.com/rust-lang/crates.io-index)", - "lazy_static 1.4.0 (registry+https://github.com/rust-lang/crates.io-index)", - "num-traits 0.2.12 (registry+https://github.com/rust-lang/crates.io-index)", - "oorandom 11.1.2 (registry+https://github.com/rust-lang/crates.io-index)", - "plotters 0.2.15 (registry+https://github.com/rust-lang/crates.io-index)", - "rayon 1.3.1 (registry+https://github.com/rust-lang/crates.io-index)", - "regex 1.3.9 (registry+https://github.com/rust-lang/crates.io-index)", - "serde 1.0.111 (registry+https://github.com/rust-lang/crates.io-index)", - "serde_cbor 0.11.1 (registry+https://github.com/rust-lang/crates.io-index)", - "serde_derive 1.0.113 (registry+https://github.com/rust-lang/crates.io-index)", - "serde_json 1.0.56 (registry+https://github.com/rust-lang/crates.io-index)", - "tinytemplate 1.1.0 (registry+https://github.com/rust-lang/crates.io-index)", - "walkdir 2.3.1 (registry+https://github.com/rust-lang/crates.io-index)", + "atty", + "cast", + "clap", + "criterion-plot", + "csv", + "itertools", + "lazy_static", + "num-traits", + "oorandom", + "plotters", + "rayon", + "regex", + "serde", + "serde_cbor", + "serde_derive", + "serde_json", + "tinytemplate", + "walkdir", ] [[package]] name = "criterion-plot" version = "0.4.3" source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e022feadec601fba1649cfa83586381a4ad31c6bf3a9ab7d408118b05dd9889d" dependencies = [ - "cast 0.2.3 (registry+https://github.com/rust-lang/crates.io-index)", - "itertools 0.9.0 (registry+https://github.com/rust-lang/crates.io-index)", + "cast", + "itertools", ] [[package]] name = "crossbeam-deque" version = "0.7.3" source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9f02af974daeee82218205558e51ec8768b48cf524bd01d550abe5573a608285" dependencies = [ - "crossbeam-epoch 0.8.2 (registry+https://github.com/rust-lang/crates.io-index)", - "crossbeam-utils 0.7.2 (registry+https://github.com/rust-lang/crates.io-index)", - "maybe-uninit 2.0.0 (registry+https://github.com/rust-lang/crates.io-index)", + "crossbeam-epoch", + "crossbeam-utils", + "maybe-uninit", ] [[package]] name = "crossbeam-epoch" version = "0.8.2" source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "058ed274caafc1f60c4997b5fc07bf7dc7cca454af7c6e81edffe5f33f70dace" dependencies = [ - "autocfg 1.0.0 (registry+https://github.com/rust-lang/crates.io-index)", - "cfg-if 0.1.10 (registry+https://github.com/rust-lang/crates.io-index)", - "crossbeam-utils 0.7.2 (registry+https://github.com/rust-lang/crates.io-index)", - "lazy_static 1.4.0 (registry+https://github.com/rust-lang/crates.io-index)", - "maybe-uninit 2.0.0 (registry+https://github.com/rust-lang/crates.io-index)", - "memoffset 0.5.5 (registry+https://github.com/rust-lang/crates.io-index)", - "scopeguard 1.1.0 (registry+https://github.com/rust-lang/crates.io-index)", + "autocfg", + "cfg-if", + "crossbeam-utils", + "lazy_static", + "maybe-uninit", + "memoffset", + "scopeguard", ] [[package]] name = "crossbeam-queue" version = "0.2.3" source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "774ba60a54c213d409d5353bda12d49cd68d14e45036a285234c8d6f91f92570" dependencies = [ - "cfg-if 0.1.10 (registry+https://github.com/rust-lang/crates.io-index)", - "crossbeam-utils 0.7.2 (registry+https://github.com/rust-lang/crates.io-index)", - "maybe-uninit 2.0.0 (registry+https://github.com/rust-lang/crates.io-index)", + "cfg-if", + "crossbeam-utils", + "maybe-uninit", ] [[package]] name = "crossbeam-utils" version = "0.7.2" source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c3c7c73a2d1e9fc0886a08b93e98eb643461230d5f1925e4036204d5f2e261a8" dependencies = [ - "autocfg 1.0.0 (registry+https://github.com/rust-lang/crates.io-index)", - "cfg-if 0.1.10 (registry+https://github.com/rust-lang/crates.io-index)", - "lazy_static 1.4.0 (registry+https://github.com/rust-lang/crates.io-index)", + "autocfg", + "cfg-if", + "lazy_static", ] [[package]] name = "crypto-mac" version = "0.8.0" source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b584a330336237c1eecd3e94266efb216c56ed91225d634cb2991c5f3fd1aeab" dependencies = [ - "generic-array 0.14.3 (registry+https://github.com/rust-lang/crates.io-index)", - "subtle 2.2.2 (registry+https://github.com/rust-lang/crates.io-index)", + "generic-array 0.14.3", + "subtle", ] [[package]] name = "csv" version = "1.1.3" source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "00affe7f6ab566df61b4be3ce8cf16bc2576bca0963ceb0955e45d514bf9a279" dependencies = [ - "bstr 0.2.13 (registry+https://github.com/rust-lang/crates.io-index)", - "csv-core 0.1.10 (registry+https://github.com/rust-lang/crates.io-index)", - "itoa 0.4.5 (registry+https://github.com/rust-lang/crates.io-index)", - "ryu 1.0.5 (registry+https://github.com/rust-lang/crates.io-index)", - "serde 1.0.111 (registry+https://github.com/rust-lang/crates.io-index)", + "bstr", + "csv-core", + "itoa", + "ryu", + "serde", ] [[package]] name = "csv-core" version = "0.1.10" source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2b2466559f260f48ad25fe6317b3c8dac77b5bdb5763ac7d9d6103530663bc90" dependencies = [ - "memchr 2.3.3 (registry+https://github.com/rust-lang/crates.io-index)", + "memchr", ] [[package]] name = "curve25519-dalek" version = "2.1.0" source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5d85653f070353a16313d0046f173f70d1aadd5b42600a14de626f0dfb3473a5" dependencies = [ - "byteorder 1.3.4 (registry+https://github.com/rust-lang/crates.io-index)", - "digest 0.8.1 (registry+https://github.com/rust-lang/crates.io-index)", - "rand_core 0.5.1 (registry+https://github.com/rust-lang/crates.io-index)", - "subtle 2.2.2 (registry+https://github.com/rust-lang/crates.io-index)", - "zeroize 1.1.0 (registry+https://github.com/rust-lang/crates.io-index)", + "byteorder", + "digest 0.8.1", + "rand_core", + "subtle", + "zeroize", ] [[package]] name = "digest" version = "0.8.1" source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f3d0c8c8752312f9713efd397ff63acb9f85585afbf179282e720e7704954dd5" dependencies = [ - "generic-array 0.12.3 (registry+https://github.com/rust-lang/crates.io-index)", + "generic-array 0.12.3", ] [[package]] name = "digest" version = "0.9.0" source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d3dd60d1080a57a05ab032377049e0591415d2b31afd7028356dbf3cc6dcb066" dependencies = [ - "generic-array 0.14.3 (registry+https://github.com/rust-lang/crates.io-index)", + "generic-array 0.14.3", ] [[package]] name = "displaydoc" version = "0.1.7" source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "adc2ab4d5a16117f9029e9a6b5e4e79f4c67f6519bc134210d4d4a04ba31f41b" dependencies = [ - "proc-macro2 1.0.18 (registry+https://github.com/rust-lang/crates.io-index)", - "quote 1.0.7 (registry+https://github.com/rust-lang/crates.io-index)", - "syn 1.0.31 (registry+https://github.com/rust-lang/crates.io-index)", + "proc-macro2", + "quote", + "syn", ] [[package]] name = "either" version = "1.5.3" source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "bb1f6b1ce1c140482ea30ddd3335fc0024ac7ee112895426e0a629a6c20adfe3" [[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.12.3" source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c68f0274ae0e023facc3c97b2e00f076be70e254bc851d972503b328db79b2ec" dependencies = [ - "typenum 1.12.0 (registry+https://github.com/rust-lang/crates.io-index)", + "typenum", ] [[package]] name = "generic-array" version = "0.14.3" source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "60fb4bb6bba52f78a471264d9a3b7d026cc0af47b22cd2cffbc0b787ca003e63" dependencies = [ - "typenum 1.12.0 (registry+https://github.com/rust-lang/crates.io-index)", - "version_check 0.9.2 (registry+https://github.com/rust-lang/crates.io-index)", + "typenum", + "version_check", ] [[package]] name = "getrandom" version = "0.1.14" source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7abc8dd8451921606d809ba32e95b6111925cd2906060d2dcc29c070220503eb" dependencies = [ - "cfg-if 0.1.10 (registry+https://github.com/rust-lang/crates.io-index)", - "libc 0.2.71 (registry+https://github.com/rust-lang/crates.io-index)", - "wasi 0.9.0+wasi-snapshot-preview1 (registry+https://github.com/rust-lang/crates.io-index)", + "cfg-if", + "libc", + "wasi", ] [[package]] name = "half" version = "1.6.0" source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d36fab90f82edc3c747f9d438e06cf0a491055896f2a279638bb5beed6c40177" [[package]] name = "hermit-abi" version = "0.1.15" source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3deed196b6e7f9e44a2ae8d94225d80302d81208b1bb673fd21fe634645c85a9" dependencies = [ - "libc 0.2.71 (registry+https://github.com/rust-lang/crates.io-index)", + "libc", ] [[package]] name = "hex" version = "0.4.2" source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "644f9158b2f133fd50f5fb3242878846d9eb792e445c893805ff0e3824006e35" [[package]] name = "hkdf" version = "0.9.0" source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "fe1149865383e4526a43aee8495f9a325f0b806c63ce6427d06336a590abbbc9" dependencies = [ - "digest 0.9.0 (registry+https://github.com/rust-lang/crates.io-index)", - "hmac 0.8.1 (registry+https://github.com/rust-lang/crates.io-index)", + "digest 0.9.0", + "hmac", ] [[package]] name = "hmac" version = "0.8.1" source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "126888268dcc288495a26bf004b38c5fdbb31682f992c84ceb046a1f0fe38840" dependencies = [ - "crypto-mac 0.8.0 (registry+https://github.com/rust-lang/crates.io-index)", - "digest 0.9.0 (registry+https://github.com/rust-lang/crates.io-index)", + "crypto-mac", + "digest 0.9.0", ] [[package]] name = "itertools" version = "0.9.0" source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "284f18f85651fe11e8a991b2adb42cb078325c996ed026d994719efcfca1d54b" dependencies = [ - "either 1.5.3 (registry+https://github.com/rust-lang/crates.io-index)", + "either", ] [[package]] name = "itoa" -version = "0.4.5" +version = "0.4.6" source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "dc6f3ad7b9d11a0c00842ff8de1b60ee58661048eb8049ed33c73594f359d7e6" [[package]] name = "js-sys" version = "0.3.42" source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "52732a3d3ad72c58ad2dc70624f9c17b46ecd0943b9a4f1ee37c4c18c5d983e2" dependencies = [ - "wasm-bindgen 0.2.65 (registry+https://github.com/rust-lang/crates.io-index)", + "wasm-bindgen", ] [[package]] name = "lazy_static" version = "1.4.0" source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e2abad23fbc42b3700f2f279844dc832adb2b2eb069b2df918f455c4e18cc646" [[package]] name = "libc" -version = "0.2.71" +version = "0.2.73" source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "bd7d4bd64732af4bf3a67f367c27df8520ad7e230c5817b8ff485864d80242b9" [[package]] name = "log" version = "0.4.11" source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4fabed175da42fed1fa0746b0ea71f412aa9d35e76e95e59b192c64b9dc2bf8b" dependencies = [ - "cfg-if 0.1.10 (registry+https://github.com/rust-lang/crates.io-index)", + "cfg-if", ] [[package]] name = "maybe-uninit" version = "2.0.0" source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "60302e4db3a61da70c0cb7991976248362f30319e88850c487b9b95bbf059e00" [[package]] name = "memchr" version = "2.3.3" source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3728d817d99e5ac407411fa471ff9800a778d88a24685968b36824eaf4bee400" [[package]] name = "memoffset" version = "0.5.5" source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c198b026e1bbf08a937e94c6c60f9ec4a2267f5b0d2eec9c1b21b061ce2be55f" dependencies = [ - "autocfg 1.0.0 (registry+https://github.com/rust-lang/crates.io-index)", + "autocfg", ] [[package]] name = "num-traits" version = "0.2.12" source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ac267bcc07f48ee5f8935ab0d24f316fb722d7a1292e2913f0cc196b29ffd611" dependencies = [ - "autocfg 1.0.0 (registry+https://github.com/rust-lang/crates.io-index)", + "autocfg", ] [[package]] name = "num_cpus" version = "1.13.0" source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "05499f3756671c15885fee9034446956fff3f243d6077b91e5767df161f766b3" dependencies = [ - "hermit-abi 0.1.15 (registry+https://github.com/rust-lang/crates.io-index)", - "libc 0.2.71 (registry+https://github.com/rust-lang/crates.io-index)", + "hermit-abi", + "libc", ] [[package]] name = "oorandom" version = "11.1.2" source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a170cebd8021a008ea92e4db85a72f80b35df514ec664b296fdcbb654eac0b2c" [[package]] name = "opaque-debug" version = "0.3.0" source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "624a8340c38c1b80fd549087862da4ba43e08858af025b236e509b6649fc13d5" [[package]] name = "opaque-ke" version = "0.1.0" dependencies = [ - "base64 0.12.3 (registry+https://github.com/rust-lang/crates.io-index)", - "criterion 0.3.3 (registry+https://github.com/rust-lang/crates.io-index)", - "curve25519-dalek 2.1.0 (registry+https://github.com/rust-lang/crates.io-index)", - "displaydoc 0.1.7 (registry+https://github.com/rust-lang/crates.io-index)", - "generic-array 0.14.3 (registry+https://github.com/rust-lang/crates.io-index)", - "hex 0.4.2 (registry+https://github.com/rust-lang/crates.io-index)", - "hkdf 0.9.0 (registry+https://github.com/rust-lang/crates.io-index)", - "hmac 0.8.1 (registry+https://github.com/rust-lang/crates.io-index)", - "lazy_static 1.4.0 (registry+https://github.com/rust-lang/crates.io-index)", - "proptest 0.10.0 (registry+https://github.com/rust-lang/crates.io-index)", - "rand 0.7.3 (registry+https://github.com/rust-lang/crates.io-index)", - "rand_core 0.5.1 (registry+https://github.com/rust-lang/crates.io-index)", - "scrypt 0.3.1 (registry+https://github.com/rust-lang/crates.io-index)", - "serde_json 1.0.56 (registry+https://github.com/rust-lang/crates.io-index)", - "sha2 0.9.1 (registry+https://github.com/rust-lang/crates.io-index)", - "thiserror 1.0.20 (registry+https://github.com/rust-lang/crates.io-index)", - "x25519-dalek 0.6.0 (registry+https://github.com/rust-lang/crates.io-index)", - "zeroize 1.1.0 (registry+https://github.com/rust-lang/crates.io-index)", + "base64", + "criterion", + "curve25519-dalek", + "digest 0.9.0", + "displaydoc", + "generic-array 0.14.3", + "hex", + "hkdf", + "hmac", + "lazy_static", + "proptest", + "rand", + "rand_core", + "scrypt", + "serde_json", + "sha2", + "thiserror", + "x25519-dalek", + "zeroize", ] [[package]] name = "pbkdf2" version = "0.4.0" source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "216eaa586a190f0a738f2f918511eecfa90f13295abec0e457cdebcceda80cbd" dependencies = [ - "crypto-mac 0.8.0 (registry+https://github.com/rust-lang/crates.io-index)", + "crypto-mac", ] [[package]] name = "plotters" version = "0.2.15" source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0d1685fbe7beba33de0330629da9d955ac75bd54f33d7b79f9a895590124f6bb" dependencies = [ - "js-sys 0.3.42 (registry+https://github.com/rust-lang/crates.io-index)", - "num-traits 0.2.12 (registry+https://github.com/rust-lang/crates.io-index)", - "wasm-bindgen 0.2.65 (registry+https://github.com/rust-lang/crates.io-index)", - "web-sys 0.3.42 (registry+https://github.com/rust-lang/crates.io-index)", + "js-sys", + "num-traits", + "wasm-bindgen", + "web-sys", ] [[package]] name = "ppv-lite86" version = "0.2.8" source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "237a5ed80e274dbc66f86bd59c1e25edc039660be53194b5fe0a482e0f2612ea" [[package]] name = "proc-macro2" -version = "1.0.18" +version = "1.0.19" source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "04f5f085b5d71e2188cb8271e5da0161ad52c3f227a661a3c135fdf28e258b12" dependencies = [ - "unicode-xid 0.2.0 (registry+https://github.com/rust-lang/crates.io-index)", + "unicode-xid", ] [[package]] name = "proptest" version = "0.10.0" source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2520fe6373cf6a3a61e2d200e987c183778ade8d9248ac3e6614ab0edfe4a0c1" dependencies = [ - "bit-set 0.5.2 (registry+https://github.com/rust-lang/crates.io-index)", - "bitflags 1.2.1 (registry+https://github.com/rust-lang/crates.io-index)", - "byteorder 1.3.4 (registry+https://github.com/rust-lang/crates.io-index)", - "lazy_static 1.4.0 (registry+https://github.com/rust-lang/crates.io-index)", - "num-traits 0.2.12 (registry+https://github.com/rust-lang/crates.io-index)", - "quick-error 1.2.3 (registry+https://github.com/rust-lang/crates.io-index)", - "rand 0.7.3 (registry+https://github.com/rust-lang/crates.io-index)", - "rand_chacha 0.2.2 (registry+https://github.com/rust-lang/crates.io-index)", - "rand_xorshift 0.2.0 (registry+https://github.com/rust-lang/crates.io-index)", - "regex-syntax 0.6.18 (registry+https://github.com/rust-lang/crates.io-index)", - "rusty-fork 0.3.0 (registry+https://github.com/rust-lang/crates.io-index)", - "tempfile 3.1.0 (registry+https://github.com/rust-lang/crates.io-index)", + "bit-set", + "bitflags", + "byteorder", + "lazy_static", + "num-traits", + "quick-error", + "rand", + "rand_chacha", + "rand_xorshift", + "regex-syntax", + "rusty-fork", + "tempfile", ] [[package]] name = "quick-error" version = "1.2.3" source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a1d01941d82fa2ab50be1e79e6714289dd7cde78eba4c074bc5a4374f650dfe0" [[package]] name = "quote" version = "1.0.7" source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "aa563d17ecb180e500da1cfd2b028310ac758de548efdd203e18f283af693f37" dependencies = [ - "proc-macro2 1.0.18 (registry+https://github.com/rust-lang/crates.io-index)", + "proc-macro2", ] [[package]] name = "rand" version = "0.7.3" source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6a6b1679d49b24bbfe0c803429aa1874472f50d9b363131f0e89fc356b544d03" dependencies = [ - "getrandom 0.1.14 (registry+https://github.com/rust-lang/crates.io-index)", - "libc 0.2.71 (registry+https://github.com/rust-lang/crates.io-index)", - "rand_chacha 0.2.2 (registry+https://github.com/rust-lang/crates.io-index)", - "rand_core 0.5.1 (registry+https://github.com/rust-lang/crates.io-index)", - "rand_hc 0.2.0 (registry+https://github.com/rust-lang/crates.io-index)", + "getrandom", + "libc", + "rand_chacha", + "rand_core", + "rand_hc", ] [[package]] name = "rand_chacha" version = "0.2.2" source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f4c8ed856279c9737206bf725bf36935d8666ead7aa69b52be55af369d193402" dependencies = [ - "ppv-lite86 0.2.8 (registry+https://github.com/rust-lang/crates.io-index)", - "rand_core 0.5.1 (registry+https://github.com/rust-lang/crates.io-index)", + "ppv-lite86", + "rand_core", ] [[package]] name = "rand_core" version = "0.5.1" source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "90bde5296fc891b0cef12a6d03ddccc162ce7b2aff54160af9338f8d40df6d19" dependencies = [ - "getrandom 0.1.14 (registry+https://github.com/rust-lang/crates.io-index)", + "getrandom", ] [[package]] name = "rand_hc" version = "0.2.0" source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ca3129af7b92a17112d59ad498c6f81eaf463253766b90396d39ea7a39d6613c" dependencies = [ - "rand_core 0.5.1 (registry+https://github.com/rust-lang/crates.io-index)", + "rand_core", ] [[package]] name = "rand_xorshift" version = "0.2.0" source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "77d416b86801d23dde1aa643023b775c3a462efc0ed96443add11546cdf1dca8" dependencies = [ - "rand_core 0.5.1 (registry+https://github.com/rust-lang/crates.io-index)", + "rand_core", ] [[package]] name = "rayon" version = "1.3.1" source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "62f02856753d04e03e26929f820d0a0a337ebe71f849801eea335d464b349080" dependencies = [ - "autocfg 1.0.0 (registry+https://github.com/rust-lang/crates.io-index)", - "crossbeam-deque 0.7.3 (registry+https://github.com/rust-lang/crates.io-index)", - "either 1.5.3 (registry+https://github.com/rust-lang/crates.io-index)", - "rayon-core 1.7.1 (registry+https://github.com/rust-lang/crates.io-index)", + "autocfg", + "crossbeam-deque", + "either", + "rayon-core", ] [[package]] name = "rayon-core" version = "1.7.1" source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e92e15d89083484e11353891f1af602cc661426deb9564c298b270c726973280" dependencies = [ - "crossbeam-deque 0.7.3 (registry+https://github.com/rust-lang/crates.io-index)", - "crossbeam-queue 0.2.3 (registry+https://github.com/rust-lang/crates.io-index)", - "crossbeam-utils 0.7.2 (registry+https://github.com/rust-lang/crates.io-index)", - "lazy_static 1.4.0 (registry+https://github.com/rust-lang/crates.io-index)", - "num_cpus 1.13.0 (registry+https://github.com/rust-lang/crates.io-index)", + "crossbeam-deque", + "crossbeam-queue", + "crossbeam-utils", + "lazy_static", + "num_cpus", ] [[package]] name = "redox_syscall" -version = "0.1.56" +version = "0.1.57" source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "41cc0f7e4d5d4544e8861606a285bb08d3e70712ccc7d2b84d7c0ccfaf4b05ce" [[package]] name = "regex" version = "1.3.9" source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9c3780fcf44b193bc4d09f36d2a3c87b251da4a046c87795a0d35f4f927ad8e6" dependencies = [ - "regex-syntax 0.6.18 (registry+https://github.com/rust-lang/crates.io-index)", + "regex-syntax", ] [[package]] name = "regex-automata" version = "0.1.9" source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ae1ded71d66a4a97f5e961fd0cb25a5f366a42a41570d16a763a69c092c26ae4" dependencies = [ - "byteorder 1.3.4 (registry+https://github.com/rust-lang/crates.io-index)", + "byteorder", ] [[package]] name = "regex-syntax" version = "0.6.18" source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "26412eb97c6b088a6997e05f69403a802a92d520de2f8e63c2b65f9e0f47c4e8" [[package]] name = "remove_dir_all" version = "0.5.3" source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3acd125665422973a33ac9d3dd2df85edad0f4ae9b00dafb1a05e43a9f5ef8e7" dependencies = [ - "winapi 0.3.8 (registry+https://github.com/rust-lang/crates.io-index)", + "winapi", ] [[package]] name = "rustc_version" version = "0.2.3" source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "138e3e0acb6c9fb258b19b67cb8abd63c00679d2851805ea151465464fe9030a" dependencies = [ - "semver 0.9.0 (registry+https://github.com/rust-lang/crates.io-index)", + "semver", ] [[package]] name = "rusty-fork" version = "0.3.0" source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "cb3dcc6e454c328bb824492db107ab7c0ae8fcffe4ad210136ef014458c1bc4f" dependencies = [ - "fnv 1.0.7 (registry+https://github.com/rust-lang/crates.io-index)", - "quick-error 1.2.3 (registry+https://github.com/rust-lang/crates.io-index)", - "tempfile 3.1.0 (registry+https://github.com/rust-lang/crates.io-index)", - "wait-timeout 0.2.0 (registry+https://github.com/rust-lang/crates.io-index)", + "fnv", + "quick-error", + "tempfile", + "wait-timeout", ] [[package]] name = "ryu" version = "1.0.5" source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "71d301d4193d031abdd79ff7e3dd721168a9572ef3fe51a1517aba235bd8f86e" [[package]] name = "same-file" version = "1.0.6" source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "93fc1dc3aaa9bfed95e02e6eadabb4baf7e3078b0bd1b4d7b6b0b68378900502" dependencies = [ - "winapi-util 0.1.5 (registry+https://github.com/rust-lang/crates.io-index)", + "winapi-util", ] [[package]] name = "scopeguard" version = "1.1.0" source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d29ab0c6d3fc0ee92fe66e2d99f700eab17a8d57d1c1d3b748380fb20baa78cd" [[package]] name = "scrypt" version = "0.3.1" source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "10e7e75e27e8cd47e4be027d4b9fdc0b696116f981c22de21ca7bad63a9cb33a" dependencies = [ - "base64 0.12.3 (registry+https://github.com/rust-lang/crates.io-index)", - "hmac 0.8.1 (registry+https://github.com/rust-lang/crates.io-index)", - "pbkdf2 0.4.0 (registry+https://github.com/rust-lang/crates.io-index)", - "rand 0.7.3 (registry+https://github.com/rust-lang/crates.io-index)", - "rand_core 0.5.1 (registry+https://github.com/rust-lang/crates.io-index)", - "sha2 0.9.1 (registry+https://github.com/rust-lang/crates.io-index)", - "subtle 2.2.2 (registry+https://github.com/rust-lang/crates.io-index)", + "base64", + "hmac", + "pbkdf2", + "rand", + "rand_core", + "sha2", + "subtle", ] [[package]] name = "semver" version = "0.9.0" source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1d7eb9ef2c18661902cc47e535f9bc51b78acd254da71d375c2f6720d9a40403" dependencies = [ - "semver-parser 0.7.0 (registry+https://github.com/rust-lang/crates.io-index)", + "semver-parser", ] [[package]] name = "semver-parser" version = "0.7.0" source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "388a1df253eca08550bef6c72392cfe7c30914bf41df5269b68cbd6ff8f570a3" [[package]] name = "serde" -version = "1.0.111" +version = "1.0.114" source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5317f7588f0a5078ee60ef675ef96735a1442132dc645eb1d12c018620ed8cd3" [[package]] name = "serde_cbor" version = "0.11.1" source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1e18acfa2f90e8b735b2836ab8d538de304cbb6729a7360729ea5a895d15a622" dependencies = [ - "half 1.6.0 (registry+https://github.com/rust-lang/crates.io-index)", - "serde 1.0.111 (registry+https://github.com/rust-lang/crates.io-index)", + "half", + "serde", ] [[package]] name = "serde_derive" -version = "1.0.113" +version = "1.0.114" source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2a0be94b04690fbaed37cddffc5c134bf537c8e3329d53e982fe04c374978f8e" dependencies = [ - "proc-macro2 1.0.18 (registry+https://github.com/rust-lang/crates.io-index)", - "quote 1.0.7 (registry+https://github.com/rust-lang/crates.io-index)", - "syn 1.0.31 (registry+https://github.com/rust-lang/crates.io-index)", + "proc-macro2", + "quote", + "syn", ] [[package]] name = "serde_json" version = "1.0.56" source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3433e879a558dde8b5e8feb2a04899cf34fdde1fafb894687e52105fc1162ac3" dependencies = [ - "itoa 0.4.5 (registry+https://github.com/rust-lang/crates.io-index)", - "ryu 1.0.5 (registry+https://github.com/rust-lang/crates.io-index)", - "serde 1.0.111 (registry+https://github.com/rust-lang/crates.io-index)", + "itoa", + "ryu", + "serde", ] [[package]] name = "sha2" version = "0.9.1" source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2933378ddfeda7ea26f48c555bdad8bb446bf8a3d17832dc83e380d444cfb8c1" dependencies = [ - "block-buffer 0.9.0 (registry+https://github.com/rust-lang/crates.io-index)", - "cfg-if 0.1.10 (registry+https://github.com/rust-lang/crates.io-index)", - "cpuid-bool 0.1.2 (registry+https://github.com/rust-lang/crates.io-index)", - "digest 0.9.0 (registry+https://github.com/rust-lang/crates.io-index)", - "opaque-debug 0.3.0 (registry+https://github.com/rust-lang/crates.io-index)", + "block-buffer", + "cfg-if", + "cpuid-bool", + "digest 0.9.0", + "opaque-debug", ] [[package]] name = "subtle" -version = "2.2.2" +version = "2.2.3" source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "502d53007c02d7605a05df1c1a73ee436952781653da5d0bf57ad608f66932c1" [[package]] name = "syn" -version = "1.0.31" +version = "1.0.35" source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "fb7f4c519df8c117855e19dd8cc851e89eb746fe7a73f0157e0d95fdec5369b0" dependencies = [ - "proc-macro2 1.0.18 (registry+https://github.com/rust-lang/crates.io-index)", - "quote 1.0.7 (registry+https://github.com/rust-lang/crates.io-index)", - "unicode-xid 0.2.0 (registry+https://github.com/rust-lang/crates.io-index)", + "proc-macro2", + "quote", + "unicode-xid", ] [[package]] name = "synstructure" version = "0.12.4" source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b834f2d66f734cb897113e34aaff2f1ab4719ca946f9a7358dba8f8064148701" dependencies = [ - "proc-macro2 1.0.18 (registry+https://github.com/rust-lang/crates.io-index)", - "quote 1.0.7 (registry+https://github.com/rust-lang/crates.io-index)", - "syn 1.0.31 (registry+https://github.com/rust-lang/crates.io-index)", - "unicode-xid 0.2.0 (registry+https://github.com/rust-lang/crates.io-index)", + "proc-macro2", + "quote", + "syn", + "unicode-xid", ] [[package]] name = "tempfile" version = "3.1.0" source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7a6e24d9338a0a5be79593e2fa15a648add6138caa803e2d5bc782c371732ca9" dependencies = [ - "cfg-if 0.1.10 (registry+https://github.com/rust-lang/crates.io-index)", - "libc 0.2.71 (registry+https://github.com/rust-lang/crates.io-index)", - "rand 0.7.3 (registry+https://github.com/rust-lang/crates.io-index)", - "redox_syscall 0.1.56 (registry+https://github.com/rust-lang/crates.io-index)", - "remove_dir_all 0.5.3 (registry+https://github.com/rust-lang/crates.io-index)", - "winapi 0.3.8 (registry+https://github.com/rust-lang/crates.io-index)", + "cfg-if", + "libc", + "rand", + "redox_syscall", + "remove_dir_all", + "winapi", ] [[package]] name = "textwrap" version = "0.11.0" source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d326610f408c7a4eb6f51c37c330e496b08506c9457c9d34287ecc38809fb060" dependencies = [ - "unicode-width 0.1.8 (registry+https://github.com/rust-lang/crates.io-index)", + "unicode-width", ] [[package]] name = "thiserror" version = "1.0.20" source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7dfdd070ccd8ccb78f4ad66bf1982dc37f620ef696c6b5028fe2ed83dd3d0d08" dependencies = [ - "thiserror-impl 1.0.20 (registry+https://github.com/rust-lang/crates.io-index)", + "thiserror-impl", ] [[package]] name = "thiserror-impl" version = "1.0.20" source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "bd80fc12f73063ac132ac92aceea36734f04a1d93c1240c6944e23a3b8841793" dependencies = [ - "proc-macro2 1.0.18 (registry+https://github.com/rust-lang/crates.io-index)", - "quote 1.0.7 (registry+https://github.com/rust-lang/crates.io-index)", - "syn 1.0.31 (registry+https://github.com/rust-lang/crates.io-index)", + "proc-macro2", + "quote", + "syn", ] [[package]] name = "tinytemplate" version = "1.1.0" source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6d3dc76004a03cec1c5932bca4cdc2e39aaa798e3f82363dd94f9adf6098c12f" dependencies = [ - "serde 1.0.111 (registry+https://github.com/rust-lang/crates.io-index)", - "serde_json 1.0.56 (registry+https://github.com/rust-lang/crates.io-index)", + "serde", + "serde_json", ] [[package]] name = "typenum" version = "1.12.0" source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "373c8a200f9e67a0c95e62a4f52fbf80c23b4381c05a17845531982fa99e6b33" [[package]] name = "unicode-width" version = "0.1.8" source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9337591893a19b88d8d87f2cec1e73fad5cdfd10e5a6f349f498ad6ea2ffb1e3" [[package]] name = "unicode-xid" -version = "0.2.0" +version = "0.2.1" source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f7fe0bb3479651439c9112f72b6c505038574c9fbb575ed1bf3b797fa39dd564" [[package]] name = "version_check" version = "0.9.2" source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b5a972e5669d67ba988ce3dc826706fb0a8b01471c088cb0b6110b805cc36aed" [[package]] name = "wait-timeout" version = "0.2.0" source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9f200f5b12eb75f8c1ed65abd4b2db8a6e1b138a20de009dacee265a2498f3f6" dependencies = [ - "libc 0.2.71 (registry+https://github.com/rust-lang/crates.io-index)", + "libc", ] [[package]] name = "walkdir" version = "2.3.1" source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "777182bc735b6424e1a57516d35ed72cb8019d85c8c9bf536dccb3445c1a2f7d" dependencies = [ - "same-file 1.0.6 (registry+https://github.com/rust-lang/crates.io-index)", - "winapi 0.3.8 (registry+https://github.com/rust-lang/crates.io-index)", - "winapi-util 0.1.5 (registry+https://github.com/rust-lang/crates.io-index)", + "same-file", + "winapi", + "winapi-util", ] [[package]] name = "wasi" version = "0.9.0+wasi-snapshot-preview1" source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "cccddf32554fecc6acb585f82a32a72e28b48f8c4c1883ddfeeeaa96f7d8e519" [[package]] name = "wasm-bindgen" version = "0.2.65" source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f3edbcc9536ab7eababcc6d2374a0b7bfe13a2b6d562c5e07f370456b1a8f33d" dependencies = [ - "cfg-if 0.1.10 (registry+https://github.com/rust-lang/crates.io-index)", - "wasm-bindgen-macro 0.2.65 (registry+https://github.com/rust-lang/crates.io-index)", + "cfg-if", + "wasm-bindgen-macro", ] [[package]] name = "wasm-bindgen-backend" version = "0.2.65" source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "89ed2fb8c84bfad20ea66b26a3743f3e7ba8735a69fe7d95118c33ec8fc1244d" dependencies = [ - "bumpalo 3.4.0 (registry+https://github.com/rust-lang/crates.io-index)", - "lazy_static 1.4.0 (registry+https://github.com/rust-lang/crates.io-index)", - "log 0.4.11 (registry+https://github.com/rust-lang/crates.io-index)", - "proc-macro2 1.0.18 (registry+https://github.com/rust-lang/crates.io-index)", - "quote 1.0.7 (registry+https://github.com/rust-lang/crates.io-index)", - "syn 1.0.31 (registry+https://github.com/rust-lang/crates.io-index)", - "wasm-bindgen-shared 0.2.65 (registry+https://github.com/rust-lang/crates.io-index)", + "bumpalo", + "lazy_static", + "log", + "proc-macro2", + "quote", + "syn", + "wasm-bindgen-shared", ] [[package]] name = "wasm-bindgen-macro" version = "0.2.65" source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "eb071268b031a64d92fc6cf691715ca5a40950694d8f683c5bb43db7c730929e" dependencies = [ - "quote 1.0.7 (registry+https://github.com/rust-lang/crates.io-index)", - "wasm-bindgen-macro-support 0.2.65 (registry+https://github.com/rust-lang/crates.io-index)", + "quote", + "wasm-bindgen-macro-support", ] [[package]] name = "wasm-bindgen-macro-support" version = "0.2.65" source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "cf592c807080719d1ff2f245a687cbadb3ed28b2077ed7084b47aba8b691f2c6" dependencies = [ - "proc-macro2 1.0.18 (registry+https://github.com/rust-lang/crates.io-index)", - "quote 1.0.7 (registry+https://github.com/rust-lang/crates.io-index)", - "syn 1.0.31 (registry+https://github.com/rust-lang/crates.io-index)", - "wasm-bindgen-backend 0.2.65 (registry+https://github.com/rust-lang/crates.io-index)", - "wasm-bindgen-shared 0.2.65 (registry+https://github.com/rust-lang/crates.io-index)", + "proc-macro2", + "quote", + "syn", + "wasm-bindgen-backend", + "wasm-bindgen-shared", ] [[package]] name = "wasm-bindgen-shared" version = "0.2.65" source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "72b6c0220ded549d63860c78c38f3bcc558d1ca3f4efa74942c536ddbbb55e87" [[package]] name = "web-sys" version = "0.3.42" source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8be2398f326b7ba09815d0b403095f34dd708579220d099caae89be0b32137b2" dependencies = [ - "js-sys 0.3.42 (registry+https://github.com/rust-lang/crates.io-index)", - "wasm-bindgen 0.2.65 (registry+https://github.com/rust-lang/crates.io-index)", + "js-sys", + "wasm-bindgen", ] [[package]] name = "winapi" -version = "0.3.8" +version = "0.3.9" source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5c839a674fcd7a98952e593242ea400abe93992746761e38641405d28b00f419" dependencies = [ - "winapi-i686-pc-windows-gnu 0.4.0 (registry+https://github.com/rust-lang/crates.io-index)", - "winapi-x86_64-pc-windows-gnu 0.4.0 (registry+https://github.com/rust-lang/crates.io-index)", + "winapi-i686-pc-windows-gnu", + "winapi-x86_64-pc-windows-gnu", ] [[package]] name = "winapi-i686-pc-windows-gnu" version = "0.4.0" source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ac3b87c63620426dd9b991e5ce0329eff545bccbbb34f3be09ff6fb6ab51b7b6" [[package]] name = "winapi-util" version = "0.1.5" source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "70ec6ce85bb158151cae5e5c87f95a8e97d2c0c4b001223f33a334e3ce5de178" dependencies = [ - "winapi 0.3.8 (registry+https://github.com/rust-lang/crates.io-index)", + "winapi", ] [[package]] name = "winapi-x86_64-pc-windows-gnu" version = "0.4.0" source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "712e227841d057c1ee1cd2fb22fa7e5a5461ae8e48fa2ca79ec42cfc1931183f" [[package]] name = "x25519-dalek" version = "0.6.0" source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "637ff90c9540fa3073bb577e65033069e4bae7c79d49d74aa3ffdf5342a53217" dependencies = [ - "curve25519-dalek 2.1.0 (registry+https://github.com/rust-lang/crates.io-index)", - "rand_core 0.5.1 (registry+https://github.com/rust-lang/crates.io-index)", - "zeroize 1.1.0 (registry+https://github.com/rust-lang/crates.io-index)", + "curve25519-dalek", + "rand_core", + "zeroize", ] [[package]] name = "zeroize" version = "1.1.0" source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3cbac2ed2ba24cc90f5e06485ac8c7c1e5449fe8911aef4d8877218af021a5b8" dependencies = [ - "zeroize_derive 1.0.0 (registry+https://github.com/rust-lang/crates.io-index)", + "zeroize_derive", ] [[package]] name = "zeroize_derive" version = "1.0.0" source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "de251eec69fc7c1bc3923403d18ececb929380e016afe103da75f396704f8ca2" dependencies = [ - "proc-macro2 1.0.18 (registry+https://github.com/rust-lang/crates.io-index)", - "quote 1.0.7 (registry+https://github.com/rust-lang/crates.io-index)", - "syn 1.0.31 (registry+https://github.com/rust-lang/crates.io-index)", - "synstructure 0.12.4 (registry+https://github.com/rust-lang/crates.io-index)", + "proc-macro2", + "quote", + "syn", + "synstructure", ] - -[metadata] -"checksum atty 0.2.14 (registry+https://github.com/rust-lang/crates.io-index)" = "d9b39be18770d11421cdb1b9947a45dd3f37e93092cbf377614828a319d5fee8" -"checksum autocfg 1.0.0 (registry+https://github.com/rust-lang/crates.io-index)" = "f8aac770f1885fd7e387acedd76065302551364496e46b3dd00860b2f8359b9d" -"checksum base64 0.12.3 (registry+https://github.com/rust-lang/crates.io-index)" = "3441f0f7b02788e948e47f457ca01f1d7e6d92c693bc132c22b087d3141c03ff" -"checksum bit-set 0.5.2 (registry+https://github.com/rust-lang/crates.io-index)" = "6e11e16035ea35e4e5997b393eacbf6f63983188f7a2ad25bfb13465f5ad59de" -"checksum bit-vec 0.6.2 (registry+https://github.com/rust-lang/crates.io-index)" = "5f0dc55f2d8a1a85650ac47858bb001b4c0dd73d79e3c455a842925e68d29cd3" -"checksum bitflags 1.2.1 (registry+https://github.com/rust-lang/crates.io-index)" = "cf1de2fe8c75bc145a2f577add951f8134889b4795d47466a54a5c846d691693" -"checksum block-buffer 0.9.0 (registry+https://github.com/rust-lang/crates.io-index)" = "4152116fd6e9dadb291ae18fc1ec3575ed6d84c29642d97890f4b4a3417297e4" -"checksum bstr 0.2.13 (registry+https://github.com/rust-lang/crates.io-index)" = "31accafdb70df7871592c058eca3985b71104e15ac32f64706022c58867da931" -"checksum bumpalo 3.4.0 (registry+https://github.com/rust-lang/crates.io-index)" = "2e8c087f005730276d1096a652e92a8bacee2e2472bcc9715a74d2bec38b5820" -"checksum byteorder 1.3.4 (registry+https://github.com/rust-lang/crates.io-index)" = "08c48aae112d48ed9f069b33538ea9e3e90aa263cfa3d1c24309612b1f7472de" -"checksum cast 0.2.3 (registry+https://github.com/rust-lang/crates.io-index)" = "4b9434b9a5aa1450faa3f9cb14ea0e8c53bb5d2b3c1bfd1ab4fc03e9f33fbfb0" -"checksum cfg-if 0.1.10 (registry+https://github.com/rust-lang/crates.io-index)" = "4785bdd1c96b2a846b2bd7cc02e86b6b3dbf14e7e53446c4f54c92a361040822" -"checksum clap 2.33.1 (registry+https://github.com/rust-lang/crates.io-index)" = "bdfa80d47f954d53a35a64987ca1422f495b8d6483c0fe9f7117b36c2a792129" -"checksum cpuid-bool 0.1.2 (registry+https://github.com/rust-lang/crates.io-index)" = "8aebca1129a03dc6dc2b127edd729435bbc4a37e1d5f4d7513165089ceb02634" -"checksum criterion 0.3.3 (registry+https://github.com/rust-lang/crates.io-index)" = "70daa7ceec6cf143990669a04c7df13391d55fb27bd4079d252fca774ba244d8" -"checksum criterion-plot 0.4.3 (registry+https://github.com/rust-lang/crates.io-index)" = "e022feadec601fba1649cfa83586381a4ad31c6bf3a9ab7d408118b05dd9889d" -"checksum crossbeam-deque 0.7.3 (registry+https://github.com/rust-lang/crates.io-index)" = "9f02af974daeee82218205558e51ec8768b48cf524bd01d550abe5573a608285" -"checksum crossbeam-epoch 0.8.2 (registry+https://github.com/rust-lang/crates.io-index)" = "058ed274caafc1f60c4997b5fc07bf7dc7cca454af7c6e81edffe5f33f70dace" -"checksum crossbeam-queue 0.2.3 (registry+https://github.com/rust-lang/crates.io-index)" = "774ba60a54c213d409d5353bda12d49cd68d14e45036a285234c8d6f91f92570" -"checksum crossbeam-utils 0.7.2 (registry+https://github.com/rust-lang/crates.io-index)" = "c3c7c73a2d1e9fc0886a08b93e98eb643461230d5f1925e4036204d5f2e261a8" -"checksum crypto-mac 0.8.0 (registry+https://github.com/rust-lang/crates.io-index)" = "b584a330336237c1eecd3e94266efb216c56ed91225d634cb2991c5f3fd1aeab" -"checksum csv 1.1.3 (registry+https://github.com/rust-lang/crates.io-index)" = "00affe7f6ab566df61b4be3ce8cf16bc2576bca0963ceb0955e45d514bf9a279" -"checksum csv-core 0.1.10 (registry+https://github.com/rust-lang/crates.io-index)" = "2b2466559f260f48ad25fe6317b3c8dac77b5bdb5763ac7d9d6103530663bc90" -"checksum curve25519-dalek 2.1.0 (registry+https://github.com/rust-lang/crates.io-index)" = "5d85653f070353a16313d0046f173f70d1aadd5b42600a14de626f0dfb3473a5" -"checksum digest 0.8.1 (registry+https://github.com/rust-lang/crates.io-index)" = "f3d0c8c8752312f9713efd397ff63acb9f85585afbf179282e720e7704954dd5" -"checksum digest 0.9.0 (registry+https://github.com/rust-lang/crates.io-index)" = "d3dd60d1080a57a05ab032377049e0591415d2b31afd7028356dbf3cc6dcb066" -"checksum displaydoc 0.1.7 (registry+https://github.com/rust-lang/crates.io-index)" = "adc2ab4d5a16117f9029e9a6b5e4e79f4c67f6519bc134210d4d4a04ba31f41b" -"checksum either 1.5.3 (registry+https://github.com/rust-lang/crates.io-index)" = "bb1f6b1ce1c140482ea30ddd3335fc0024ac7ee112895426e0a629a6c20adfe3" -"checksum fnv 1.0.7 (registry+https://github.com/rust-lang/crates.io-index)" = "3f9eec918d3f24069decb9af1554cad7c880e2da24a9afd88aca000531ab82c1" -"checksum generic-array 0.12.3 (registry+https://github.com/rust-lang/crates.io-index)" = "c68f0274ae0e023facc3c97b2e00f076be70e254bc851d972503b328db79b2ec" -"checksum generic-array 0.14.3 (registry+https://github.com/rust-lang/crates.io-index)" = "60fb4bb6bba52f78a471264d9a3b7d026cc0af47b22cd2cffbc0b787ca003e63" -"checksum getrandom 0.1.14 (registry+https://github.com/rust-lang/crates.io-index)" = "7abc8dd8451921606d809ba32e95b6111925cd2906060d2dcc29c070220503eb" -"checksum half 1.6.0 (registry+https://github.com/rust-lang/crates.io-index)" = "d36fab90f82edc3c747f9d438e06cf0a491055896f2a279638bb5beed6c40177" -"checksum hermit-abi 0.1.15 (registry+https://github.com/rust-lang/crates.io-index)" = "3deed196b6e7f9e44a2ae8d94225d80302d81208b1bb673fd21fe634645c85a9" -"checksum hex 0.4.2 (registry+https://github.com/rust-lang/crates.io-index)" = "644f9158b2f133fd50f5fb3242878846d9eb792e445c893805ff0e3824006e35" -"checksum hkdf 0.9.0 (registry+https://github.com/rust-lang/crates.io-index)" = "fe1149865383e4526a43aee8495f9a325f0b806c63ce6427d06336a590abbbc9" -"checksum hmac 0.8.1 (registry+https://github.com/rust-lang/crates.io-index)" = "126888268dcc288495a26bf004b38c5fdbb31682f992c84ceb046a1f0fe38840" -"checksum itertools 0.9.0 (registry+https://github.com/rust-lang/crates.io-index)" = "284f18f85651fe11e8a991b2adb42cb078325c996ed026d994719efcfca1d54b" -"checksum itoa 0.4.5 (registry+https://github.com/rust-lang/crates.io-index)" = "b8b7a7c0c47db5545ed3fef7468ee7bb5b74691498139e4b3f6a20685dc6dd8e" -"checksum js-sys 0.3.42 (registry+https://github.com/rust-lang/crates.io-index)" = "52732a3d3ad72c58ad2dc70624f9c17b46ecd0943b9a4f1ee37c4c18c5d983e2" -"checksum lazy_static 1.4.0 (registry+https://github.com/rust-lang/crates.io-index)" = "e2abad23fbc42b3700f2f279844dc832adb2b2eb069b2df918f455c4e18cc646" -"checksum libc 0.2.71 (registry+https://github.com/rust-lang/crates.io-index)" = "9457b06509d27052635f90d6466700c65095fdf75409b3fbdd903e988b886f49" -"checksum log 0.4.11 (registry+https://github.com/rust-lang/crates.io-index)" = "4fabed175da42fed1fa0746b0ea71f412aa9d35e76e95e59b192c64b9dc2bf8b" -"checksum maybe-uninit 2.0.0 (registry+https://github.com/rust-lang/crates.io-index)" = "60302e4db3a61da70c0cb7991976248362f30319e88850c487b9b95bbf059e00" -"checksum memchr 2.3.3 (registry+https://github.com/rust-lang/crates.io-index)" = "3728d817d99e5ac407411fa471ff9800a778d88a24685968b36824eaf4bee400" -"checksum memoffset 0.5.5 (registry+https://github.com/rust-lang/crates.io-index)" = "c198b026e1bbf08a937e94c6c60f9ec4a2267f5b0d2eec9c1b21b061ce2be55f" -"checksum num-traits 0.2.12 (registry+https://github.com/rust-lang/crates.io-index)" = "ac267bcc07f48ee5f8935ab0d24f316fb722d7a1292e2913f0cc196b29ffd611" -"checksum num_cpus 1.13.0 (registry+https://github.com/rust-lang/crates.io-index)" = "05499f3756671c15885fee9034446956fff3f243d6077b91e5767df161f766b3" -"checksum oorandom 11.1.2 (registry+https://github.com/rust-lang/crates.io-index)" = "a170cebd8021a008ea92e4db85a72f80b35df514ec664b296fdcbb654eac0b2c" -"checksum opaque-debug 0.3.0 (registry+https://github.com/rust-lang/crates.io-index)" = "624a8340c38c1b80fd549087862da4ba43e08858af025b236e509b6649fc13d5" -"checksum pbkdf2 0.4.0 (registry+https://github.com/rust-lang/crates.io-index)" = "216eaa586a190f0a738f2f918511eecfa90f13295abec0e457cdebcceda80cbd" -"checksum plotters 0.2.15 (registry+https://github.com/rust-lang/crates.io-index)" = "0d1685fbe7beba33de0330629da9d955ac75bd54f33d7b79f9a895590124f6bb" -"checksum ppv-lite86 0.2.8 (registry+https://github.com/rust-lang/crates.io-index)" = "237a5ed80e274dbc66f86bd59c1e25edc039660be53194b5fe0a482e0f2612ea" -"checksum proc-macro2 1.0.18 (registry+https://github.com/rust-lang/crates.io-index)" = "beae6331a816b1f65d04c45b078fd8e6c93e8071771f41b8163255bbd8d7c8fa" -"checksum proptest 0.10.0 (registry+https://github.com/rust-lang/crates.io-index)" = "2520fe6373cf6a3a61e2d200e987c183778ade8d9248ac3e6614ab0edfe4a0c1" -"checksum quick-error 1.2.3 (registry+https://github.com/rust-lang/crates.io-index)" = "a1d01941d82fa2ab50be1e79e6714289dd7cde78eba4c074bc5a4374f650dfe0" -"checksum quote 1.0.7 (registry+https://github.com/rust-lang/crates.io-index)" = "aa563d17ecb180e500da1cfd2b028310ac758de548efdd203e18f283af693f37" -"checksum rand 0.7.3 (registry+https://github.com/rust-lang/crates.io-index)" = "6a6b1679d49b24bbfe0c803429aa1874472f50d9b363131f0e89fc356b544d03" -"checksum rand_chacha 0.2.2 (registry+https://github.com/rust-lang/crates.io-index)" = "f4c8ed856279c9737206bf725bf36935d8666ead7aa69b52be55af369d193402" -"checksum rand_core 0.5.1 (registry+https://github.com/rust-lang/crates.io-index)" = "90bde5296fc891b0cef12a6d03ddccc162ce7b2aff54160af9338f8d40df6d19" -"checksum rand_hc 0.2.0 (registry+https://github.com/rust-lang/crates.io-index)" = "ca3129af7b92a17112d59ad498c6f81eaf463253766b90396d39ea7a39d6613c" -"checksum rand_xorshift 0.2.0 (registry+https://github.com/rust-lang/crates.io-index)" = "77d416b86801d23dde1aa643023b775c3a462efc0ed96443add11546cdf1dca8" -"checksum rayon 1.3.1 (registry+https://github.com/rust-lang/crates.io-index)" = "62f02856753d04e03e26929f820d0a0a337ebe71f849801eea335d464b349080" -"checksum rayon-core 1.7.1 (registry+https://github.com/rust-lang/crates.io-index)" = "e92e15d89083484e11353891f1af602cc661426deb9564c298b270c726973280" -"checksum redox_syscall 0.1.56 (registry+https://github.com/rust-lang/crates.io-index)" = "2439c63f3f6139d1b57529d16bc3b8bb855230c8efcc5d3a896c8bea7c3b1e84" -"checksum regex 1.3.9 (registry+https://github.com/rust-lang/crates.io-index)" = "9c3780fcf44b193bc4d09f36d2a3c87b251da4a046c87795a0d35f4f927ad8e6" -"checksum regex-automata 0.1.9 (registry+https://github.com/rust-lang/crates.io-index)" = "ae1ded71d66a4a97f5e961fd0cb25a5f366a42a41570d16a763a69c092c26ae4" -"checksum regex-syntax 0.6.18 (registry+https://github.com/rust-lang/crates.io-index)" = "26412eb97c6b088a6997e05f69403a802a92d520de2f8e63c2b65f9e0f47c4e8" -"checksum remove_dir_all 0.5.3 (registry+https://github.com/rust-lang/crates.io-index)" = "3acd125665422973a33ac9d3dd2df85edad0f4ae9b00dafb1a05e43a9f5ef8e7" -"checksum rustc_version 0.2.3 (registry+https://github.com/rust-lang/crates.io-index)" = "138e3e0acb6c9fb258b19b67cb8abd63c00679d2851805ea151465464fe9030a" -"checksum rusty-fork 0.3.0 (registry+https://github.com/rust-lang/crates.io-index)" = "cb3dcc6e454c328bb824492db107ab7c0ae8fcffe4ad210136ef014458c1bc4f" -"checksum ryu 1.0.5 (registry+https://github.com/rust-lang/crates.io-index)" = "71d301d4193d031abdd79ff7e3dd721168a9572ef3fe51a1517aba235bd8f86e" -"checksum same-file 1.0.6 (registry+https://github.com/rust-lang/crates.io-index)" = "93fc1dc3aaa9bfed95e02e6eadabb4baf7e3078b0bd1b4d7b6b0b68378900502" -"checksum scopeguard 1.1.0 (registry+https://github.com/rust-lang/crates.io-index)" = "d29ab0c6d3fc0ee92fe66e2d99f700eab17a8d57d1c1d3b748380fb20baa78cd" -"checksum scrypt 0.3.1 (registry+https://github.com/rust-lang/crates.io-index)" = "10e7e75e27e8cd47e4be027d4b9fdc0b696116f981c22de21ca7bad63a9cb33a" -"checksum semver 0.9.0 (registry+https://github.com/rust-lang/crates.io-index)" = "1d7eb9ef2c18661902cc47e535f9bc51b78acd254da71d375c2f6720d9a40403" -"checksum semver-parser 0.7.0 (registry+https://github.com/rust-lang/crates.io-index)" = "388a1df253eca08550bef6c72392cfe7c30914bf41df5269b68cbd6ff8f570a3" -"checksum serde 1.0.111 (registry+https://github.com/rust-lang/crates.io-index)" = "c9124df5b40cbd380080b2cc6ab894c040a3070d995f5c9dc77e18c34a8ae37d" -"checksum serde_cbor 0.11.1 (registry+https://github.com/rust-lang/crates.io-index)" = "1e18acfa2f90e8b735b2836ab8d538de304cbb6729a7360729ea5a895d15a622" -"checksum serde_derive 1.0.113 (registry+https://github.com/rust-lang/crates.io-index)" = "93c5eaa17d0954cb481cdcfffe9d84fcfa7a1a9f2349271e678677be4c26ae31" -"checksum serde_json 1.0.56 (registry+https://github.com/rust-lang/crates.io-index)" = "3433e879a558dde8b5e8feb2a04899cf34fdde1fafb894687e52105fc1162ac3" -"checksum sha2 0.9.1 (registry+https://github.com/rust-lang/crates.io-index)" = "2933378ddfeda7ea26f48c555bdad8bb446bf8a3d17832dc83e380d444cfb8c1" -"checksum subtle 2.2.2 (registry+https://github.com/rust-lang/crates.io-index)" = "7c65d530b10ccaeac294f349038a597e435b18fb456aadd0840a623f83b9e941" -"checksum syn 1.0.31 (registry+https://github.com/rust-lang/crates.io-index)" = "b5304cfdf27365b7585c25d4af91b35016ed21ef88f17ced89c7093b43dba8b6" -"checksum synstructure 0.12.4 (registry+https://github.com/rust-lang/crates.io-index)" = "b834f2d66f734cb897113e34aaff2f1ab4719ca946f9a7358dba8f8064148701" -"checksum tempfile 3.1.0 (registry+https://github.com/rust-lang/crates.io-index)" = "7a6e24d9338a0a5be79593e2fa15a648add6138caa803e2d5bc782c371732ca9" -"checksum textwrap 0.11.0 (registry+https://github.com/rust-lang/crates.io-index)" = "d326610f408c7a4eb6f51c37c330e496b08506c9457c9d34287ecc38809fb060" -"checksum thiserror 1.0.20 (registry+https://github.com/rust-lang/crates.io-index)" = "7dfdd070ccd8ccb78f4ad66bf1982dc37f620ef696c6b5028fe2ed83dd3d0d08" -"checksum thiserror-impl 1.0.20 (registry+https://github.com/rust-lang/crates.io-index)" = "bd80fc12f73063ac132ac92aceea36734f04a1d93c1240c6944e23a3b8841793" -"checksum tinytemplate 1.1.0 (registry+https://github.com/rust-lang/crates.io-index)" = "6d3dc76004a03cec1c5932bca4cdc2e39aaa798e3f82363dd94f9adf6098c12f" -"checksum typenum 1.12.0 (registry+https://github.com/rust-lang/crates.io-index)" = "373c8a200f9e67a0c95e62a4f52fbf80c23b4381c05a17845531982fa99e6b33" -"checksum unicode-width 0.1.8 (registry+https://github.com/rust-lang/crates.io-index)" = "9337591893a19b88d8d87f2cec1e73fad5cdfd10e5a6f349f498ad6ea2ffb1e3" -"checksum unicode-xid 0.2.0 (registry+https://github.com/rust-lang/crates.io-index)" = "826e7639553986605ec5979c7dd957c7895e93eabed50ab2ffa7f6128a75097c" -"checksum version_check 0.9.2 (registry+https://github.com/rust-lang/crates.io-index)" = "b5a972e5669d67ba988ce3dc826706fb0a8b01471c088cb0b6110b805cc36aed" -"checksum wait-timeout 0.2.0 (registry+https://github.com/rust-lang/crates.io-index)" = "9f200f5b12eb75f8c1ed65abd4b2db8a6e1b138a20de009dacee265a2498f3f6" -"checksum walkdir 2.3.1 (registry+https://github.com/rust-lang/crates.io-index)" = "777182bc735b6424e1a57516d35ed72cb8019d85c8c9bf536dccb3445c1a2f7d" -"checksum wasi 0.9.0+wasi-snapshot-preview1 (registry+https://github.com/rust-lang/crates.io-index)" = "cccddf32554fecc6acb585f82a32a72e28b48f8c4c1883ddfeeeaa96f7d8e519" -"checksum wasm-bindgen 0.2.65 (registry+https://github.com/rust-lang/crates.io-index)" = "f3edbcc9536ab7eababcc6d2374a0b7bfe13a2b6d562c5e07f370456b1a8f33d" -"checksum wasm-bindgen-backend 0.2.65 (registry+https://github.com/rust-lang/crates.io-index)" = "89ed2fb8c84bfad20ea66b26a3743f3e7ba8735a69fe7d95118c33ec8fc1244d" -"checksum wasm-bindgen-macro 0.2.65 (registry+https://github.com/rust-lang/crates.io-index)" = "eb071268b031a64d92fc6cf691715ca5a40950694d8f683c5bb43db7c730929e" -"checksum wasm-bindgen-macro-support 0.2.65 (registry+https://github.com/rust-lang/crates.io-index)" = "cf592c807080719d1ff2f245a687cbadb3ed28b2077ed7084b47aba8b691f2c6" -"checksum wasm-bindgen-shared 0.2.65 (registry+https://github.com/rust-lang/crates.io-index)" = "72b6c0220ded549d63860c78c38f3bcc558d1ca3f4efa74942c536ddbbb55e87" -"checksum web-sys 0.3.42 (registry+https://github.com/rust-lang/crates.io-index)" = "8be2398f326b7ba09815d0b403095f34dd708579220d099caae89be0b32137b2" -"checksum winapi 0.3.8 (registry+https://github.com/rust-lang/crates.io-index)" = "8093091eeb260906a183e6ae1abdba2ef5ef2257a21801128899c3fc699229c6" -"checksum winapi-i686-pc-windows-gnu 0.4.0 (registry+https://github.com/rust-lang/crates.io-index)" = "ac3b87c63620426dd9b991e5ce0329eff545bccbbb34f3be09ff6fb6ab51b7b6" -"checksum winapi-util 0.1.5 (registry+https://github.com/rust-lang/crates.io-index)" = "70ec6ce85bb158151cae5e5c87f95a8e97d2c0c4b001223f33a334e3ce5de178" -"checksum winapi-x86_64-pc-windows-gnu 0.4.0 (registry+https://github.com/rust-lang/crates.io-index)" = "712e227841d057c1ee1cd2fb22fa7e5a5461ae8e48fa2ca79ec42cfc1931183f" -"checksum x25519-dalek 0.6.0 (registry+https://github.com/rust-lang/crates.io-index)" = "637ff90c9540fa3073bb577e65033069e4bae7c79d49d74aa3ffdf5342a53217" -"checksum zeroize 1.1.0 (registry+https://github.com/rust-lang/crates.io-index)" = "3cbac2ed2ba24cc90f5e06485ac8c7c1e5449fe8911aef4d8877218af021a5b8" -"checksum zeroize_derive 1.0.0 (registry+https://github.com/rust-lang/crates.io-index)" = "de251eec69fc7c1bc3923403d18ececb929380e016afe103da75f396704f8ca2" diff --git a/Cargo.toml b/Cargo.toml index 421c506..7b7e9be 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -18,6 +18,7 @@ u32_backend = ["curve25519-dalek/u32_backend", "x25519-dalek/u32_backend"] [dependencies] curve25519-dalek = { version = "2.1.0", default-features = false, features = ["std"]} +digest = "0.9.0" displaydoc = "0.1.7" generic-array = "0.14.3" hkdf = "0.9.0" diff --git a/src/ciphersuite.rs b/src/ciphersuite.rs index ad7f256..ad7b1ac 100644 --- a/src/ciphersuite.rs +++ b/src/ciphersuite.rs @@ -7,6 +7,7 @@ use crate::{ errors::InternalPakeError, + hash::Hash, key_exchange::traits::KeyExchange, keypair::{Key, KeyPair}, map_to_curve::GroupWithMapToCurve, @@ -22,7 +23,8 @@ use rand_core::{CryptoRng, RngCore}; /// `map_to_curve::GroupWithMapToCurve`. /// * `KeyFormat`: a keypair type composed of public and private components /// * `KeyExchange`: The key exchange protocol to use in the login step -/// * `SlowHash`: a slow hashing function, typically used for password hashing +/// * `Hash`: The main hashing function to use +/// * `SlowHash`: A slow hashing function, typically used for password hashing pub trait CipherSuite { /// A finite cyclic group along with a point representation along with /// an extension trait PasswordToCurve that allows some customization on @@ -32,10 +34,11 @@ pub trait CipherSuite { /// A keypair type composed of public and private components type KeyFormat: KeyPair + PartialEq; /// A key exchange protocol - type KeyExchange: KeyExchange; + type KeyExchange: KeyExchange; + /// The main hash function use (for HKDF computations and hashing transcripts) + type Hash: Hash; /// A slow hashing function, typically used for password hashing - type SlowHash: SlowHash; - + type SlowHash: SlowHash; /// Generating a random key pair given a cryptographic rng fn generate_random_keypair( rng: &mut R, diff --git a/src/envelope.rs b/src/envelope.rs index 4199aed..9463394 100644 --- a/src/envelope.rs +++ b/src/envelope.rs @@ -4,6 +4,8 @@ // LICENSE file in the root directory of this source tree. use crate::errors::InternalPakeError; +use crate::hash::Hash; +use digest::Digest; use generic_array::{ typenum::{Unsigned, U32}, GenericArray, @@ -11,7 +13,6 @@ use generic_array::{ use hkdf::Hkdf; use hmac::{Hmac, Mac, NewMac}; use rand_core::{CryptoRng, RngCore}; -use sha2::Sha256; // Constant string used as salt for HKDF computation const STR_ENVU: &[u8] = b"EnvU"; @@ -32,31 +33,40 @@ const NONCE_LEN: usize = 32; /// The specification update has simplified this assumption by taking /// an XOR-based approach without compromising on security, and to avoid /// the confusion around the implementation of an RKR-secure encryption. -pub(crate) struct Envelope { +pub(crate) struct Envelope { nonce: Vec, ciphertext: Vec, - hmac: GenericArray, + hmac: GenericArray::OutputSize>, } -impl Envelope { +pub(crate) struct OpenedEnvelope { + pub(crate) plaintext: Vec, + pub(crate) export_key: GenericArray, +} + +impl Envelope { /// The additional number of bytes added to the plaintext pub(crate) fn additional_size() -> usize { - NONCE_LEN + U32::to_usize() + NONCE_LEN + ::OutputSize::to_usize() } fn hmac_key_size() -> usize { - U32::to_usize() + ::OutputSize::to_usize() } fn hmac_size() -> usize { - U32::to_usize() + ::OutputSize::to_usize() } fn export_key_size() -> usize { ExportKeySize::to_usize() } - pub(crate) fn new(nonce: Vec, ciphertext: Vec, hmac: GenericArray) -> Self { + pub(crate) fn new( + nonce: Vec, + ciphertext: Vec, + hmac: GenericArray::OutputSize>, + ) -> Self { Self { nonce, ciphertext, @@ -93,7 +103,7 @@ impl Envelope { let mut nonce = vec![0u8; NONCE_LEN]; rng.fill_bytes(&mut nonce); - let h = Hkdf::::new(Some(&nonce), &key); + let h = Hkdf::::new(Some(&nonce), &key); let mut okm = vec![0u8; plaintext.len() + Self::hmac_key_size() + Self::export_key_size()]; h.expand(STR_ENVU, &mut okm) .map_err(|_| InternalPakeError::HkdfError)?; @@ -108,7 +118,7 @@ impl Envelope { .collect(); let mut hmac = - Hmac::::new_varkey(&hmac_key).map_err(|_| InternalPakeError::HmacError)?; + Hmac::::new_varkey(&hmac_key).map_err(|_| InternalPakeError::HmacError)?; hmac.update(&ciphertext); hmac.update(&aad); @@ -120,12 +130,8 @@ impl Envelope { /// Attempts to decrypt the envelope using a key, which is successful only if the key and /// aad used to construct the envelope are the same. - pub(crate) fn open( - &self, - key: &[u8], - aad: &[u8], - ) -> Result<(Vec, GenericArray), InternalPakeError> { - let h = Hkdf::::new(Some(&self.nonce), &key); + pub(crate) fn open(&self, key: &[u8], aad: &[u8]) -> Result { + let h = Hkdf::::new(Some(&self.nonce), &key); let mut okm = vec![0u8; self.ciphertext.len() + Self::hmac_key_size() + Self::export_key_size()]; h.expand(STR_ENVU, &mut okm) @@ -135,7 +141,7 @@ impl Envelope { let export_key = &okm[self.ciphertext.len() + Self::hmac_key_size()..]; let mut hmac = - Hmac::::new_varkey(&hmac_key).map_err(|_| InternalPakeError::HmacError)?; + Hmac::::new_varkey(&hmac_key).map_err(|_| InternalPakeError::HmacError)?; hmac.update(&self.ciphertext); hmac.update(aad); if hmac.verify(&self.hmac).is_err() { @@ -147,7 +153,10 @@ impl Envelope { .zip(self.ciphertext.iter()) .map(|(&x1, &x2)| x1 ^ x2) .collect(); - Ok((plaintext, *GenericArray::from_slice(&export_key))) + Ok(OpenedEnvelope { + plaintext, + export_key: *GenericArray::from_slice(&export_key), + }) } } @@ -165,9 +174,10 @@ mod tests { let mut msg = [0u8; 100]; rng.fill_bytes(&mut msg); - let (ciphertext, export_key_1) = Envelope::seal(&key, &msg, b"aad", &mut rng).unwrap(); - let (plaintext, export_key_2) = ciphertext.open(&key, b"aad").unwrap(); - assert_eq!(&msg.to_vec(), &plaintext); - assert_eq!(&export_key_1.to_vec(), &export_key_2.to_vec()); + let (envelope, export_key_1) = + Envelope::::seal(&key, &msg, b"aad", &mut rng).unwrap(); + let opened_envelope = envelope.open(&key, b"aad").unwrap(); + assert_eq!(&msg.to_vec(), &opened_envelope.plaintext); + assert_eq!(&export_key_1.to_vec(), &opened_envelope.export_key.to_vec()); } } diff --git a/src/group.rs b/src/group.rs index 8a297f9..4a96549 100644 --- a/src/group.rs +++ b/src/group.rs @@ -13,14 +13,13 @@ use curve25519_dalek::{ ristretto::{CompressedRistretto, RistrettoPoint}, scalar::Scalar, }; +use digest::Digest; use generic_array::{ typenum::{U32, U64}, ArrayLength, GenericArray, }; use rand_core::{CryptoRng, RngCore}; - -use sha2::{Digest, Sha256}; - +use sha2::Sha256; use std::ops::Mul; use zeroize::Zeroize; @@ -56,6 +55,7 @@ pub trait Group: Sized + for<'a> Mul<&'a ::Scalar, Output = Self> /// may not be necessary as this function is going to be called with the /// output of a kdf. type UniformBytesLen: ArrayLength; + /// Hashes a slice of pseudo-random bytes of the correct length to a curve point fn hash_to_curve(uniform_bytes: &GenericArray) -> Self; } @@ -98,11 +98,8 @@ impl Group for RistrettoPoint { type UniformBytesLen = U64; fn hash_to_curve(uniform_bytes: &GenericArray) -> Self { - // This is because RistrettoPoint is on an obsolete sha2 version, see https://github.com/dalek-cryptography/curve25519-dalek/pull/327 let mut bits = [0u8; 64]; - let mut hasher = sha2::Sha512::new(); - hasher.update(uniform_bytes); - bits.copy_from_slice(&hasher.finalize()); + bits.copy_from_slice(&uniform_bytes); RistrettoPoint::from_uniform_bytes(&bits) } @@ -146,16 +143,17 @@ impl Group for EdwardsPoint { type UniformBytesLen = U32; fn hash_to_curve(uniform_bytes: &GenericArray) -> Self { - let mut result = [0u8; 32]; + const HASH_SIZE: usize = 32; + let mut result = [0u8; HASH_SIZE]; let mut counter = 0; let mut wrapped_point: Option = None; while wrapped_point.is_none() { result.copy_from_slice( &Sha256::new() - .chain(&uniform_bytes[..32]) + .chain(&uniform_bytes[..HASH_SIZE]) .chain(&[counter]) - .finalize()[..32], + .finalize()[..HASH_SIZE], ); wrapped_point = CompressedEdwardsY::from_slice(&result).decompress(); counter += 1; diff --git a/src/hash.rs b/src/hash.rs new file mode 100644 index 0000000..dfe6f9e --- /dev/null +++ b/src/hash.rs @@ -0,0 +1,22 @@ +// Copyright (c) Facebook, Inc. and its affiliates. +// +// This source code is licensed under the MIT license found in the +// LICENSE file in the root directory of this source tree. + +use digest::{BlockInput, FixedOutput, Reset, Update}; +use generic_array::ArrayLength; + +/// Trait inheriting the requirements from digest::Digest for compatibility with HKDF and HMAC +// Associated types could be simplified when they are made as defaults: +// https://github.com/rust-lang/rust/issues/29661 +pub trait Hash: Update + BlockInput + FixedOutput + Reset + Default + Clone { + /// The block size for the hash function + type BlockSize: ArrayLength; + /// The output size of the hash function + type OutputSize: ArrayLength; +} + +impl Hash for T { + type BlockSize = T::BlockSize; + type OutputSize = T::OutputSize; +} diff --git a/src/key_exchange/traits.rs b/src/key_exchange/traits.rs index 771a31b..543df0f 100644 --- a/src/key_exchange/traits.rs +++ b/src/key_exchange/traits.rs @@ -5,13 +5,14 @@ use crate::{ errors::{InternalPakeError, ProtocolError}, + hash::Hash, keypair::{Key, KeyPair}, }; use rand_core::{CryptoRng, RngCore}; use std::convert::TryFrom; -pub trait KeyExchange { +pub trait KeyExchange { type KE1State: TryFrom, Error = InternalPakeError> + ToBytes; type KE2State: TryFrom, Error = ProtocolError> + ToBytes; type KE1Message: TryFrom, Error = InternalPakeError> + ToBytes; diff --git a/src/key_exchange/tripledh.rs b/src/key_exchange/tripledh.rs index a22cd0b..138c69f 100644 --- a/src/key_exchange/tripledh.rs +++ b/src/key_exchange/tripledh.rs @@ -6,10 +6,12 @@ //! An implementation of the Triple Diffie-Hellman key exchange protocol use crate::{ errors::{utils::check_slice_size, InternalPakeError, PakeError, ProtocolError}, + hash::Hash, key_exchange::traits::{KeyExchange, ToBytes}, keypair::{Key, KeyPair, SizedBytes}, sized_bytes_using_constant_and_try_from, }; +use digest::Digest; use generic_array::{ typenum::{U64, U96}, GenericArray, @@ -18,7 +20,6 @@ use hkdf::Hkdf; use hmac::{Hmac, Mac, NewMac}; use rand_core::{CryptoRng, RngCore}; -use sha2::{Digest, Sha256}; use std::convert::TryFrom; const KEY_LEN: usize = 32; @@ -29,9 +30,9 @@ const KE2_MESSAGE_LEN: usize = NONCE_LEN + 2 * KEY_LEN; static STR_3DH: &[u8] = b"3DH keys"; /// The Triple Diffie-Hellman key exchange implementation -pub struct TripleDH {} +pub struct TripleDH; -impl KeyExchange for TripleDH { +impl KeyExchange for TripleDH { type KE1State = KE1State; type KE2State = KE2State; type KE1Message = KE1Message; @@ -52,7 +53,7 @@ impl KeyExchange for TripleDH { }; let l1_data: Vec = [&l1_component[..], &ke1_message.to_bytes()].concat(); - let mut hasher = Sha256::new(); + let mut hasher = D::new(); hasher.update(&l1_data); let hashed_l1 = hasher.finalize(); @@ -78,7 +79,7 @@ impl KeyExchange for TripleDH { let mut server_nonce = [0u8; NONCE_LEN]; rng.fill_bytes(&mut server_nonce); - let (shared_secret, km2, km3) = derive_3dh_keys::( + let (shared_secret, km2, km3) = derive_3dh_keys::( TripleDHComponents { pk1: ke1_message.client_e_pk.clone(), sk1: server_e_kp.private().clone(), @@ -93,7 +94,7 @@ impl KeyExchange for TripleDH { KeyFormat::public_from_private(&server_s_sk), )?; - let mut hasher = Sha256::new(); + let mut hasher = D::new(); hasher.update(&l1_bytes); let hashed_l1 = hasher.finalize(); @@ -105,11 +106,11 @@ impl KeyExchange for TripleDH { ] .concat(); - let mut hasher2 = Sha256::new(); + let mut hasher2 = D::new(); hasher2.update(&transcript2); let hashed_transcript = hasher2.finalize(); - let mut mac = Hmac::::new_varkey(&km2).map_err(|_| InternalPakeError::HmacError)?; + let mut mac = Hmac::::new_varkey(&km2).map_err(|_| InternalPakeError::HmacError)?; mac.update(&hashed_transcript); Ok(( @@ -133,7 +134,7 @@ impl KeyExchange for TripleDH { server_s_pk: KeyFormat::Repr, client_s_sk: KeyFormat::Repr, ) -> Result<(Vec, Self::KE3Message), ProtocolError> { - let (shared_secret, km2, km3) = derive_3dh_keys::( + let (shared_secret, km2, km3) = derive_3dh_keys::( TripleDHComponents { pk1: ke2_message.server_e_pk.clone(), sk1: ke1_state.client_e_sk.clone(), @@ -156,12 +157,12 @@ impl KeyExchange for TripleDH { ] .concat(); - let mut hasher = Sha256::new(); + let mut hasher = D::new(); hasher.update(&transcript); let hashed_transcript = hasher.finalize(); let mut server_mac = - Hmac::::new_varkey(&km2).map_err(|_| InternalPakeError::HmacError)?; + Hmac::::new_varkey(&km2).map_err(|_| InternalPakeError::HmacError)?; server_mac.update(&hashed_transcript); if ke2_message.mac != server_mac.finalize().into_bytes().to_vec() { @@ -171,7 +172,7 @@ impl KeyExchange for TripleDH { } let mut client_mac = - Hmac::::new_varkey(&km3).map_err(|_| InternalPakeError::HmacError)?; + Hmac::::new_varkey(&km3).map_err(|_| InternalPakeError::HmacError)?; client_mac.update(&hashed_transcript); Ok(( @@ -187,7 +188,7 @@ impl KeyExchange for TripleDH { ke2_state: &Self::KE2State, ) -> Result, ProtocolError> { let mut client_mac = - Hmac::::new_varkey(&ke2_state.km3).map_err(|_| InternalPakeError::HmacError)?; + Hmac::::new_varkey(&ke2_state.km3).map_err(|_| InternalPakeError::HmacError)?; client_mac.update(&ke2_state.hashed_transcript); if ke3_message.mac != client_mac.finalize().into_bytes().to_vec() { @@ -350,21 +351,21 @@ struct TripleDHComponents { } // Consists of a shared secret, followed by two mac keys -type TripleDHDerivationResult = ( - GenericArray::OutputSize>, - GenericArray::OutputSize>, - GenericArray::OutputSize>, +type TripleDHDerivationResult = ( + GenericArray::OutputSize>, + GenericArray::OutputSize>, + GenericArray::OutputSize>, ); // Internal function which takes the public and private components of the client and server keypairs, along // with some auxiliary metadata, to produce the shared secret and two MAC keys -fn derive_3dh_keys>( +fn derive_3dh_keys, D: Hash>( dh: TripleDHComponents, client_nonce: &[u8], server_nonce: &[u8], client_s_pk: KeyFormat::Repr, server_s_pk: KeyFormat::Repr, -) -> Result { +) -> Result, ProtocolError> { let ikm: Vec = [ &KeyFormat::diffie_hellman(dh.pk1, dh.sk1)[..], &KeyFormat::diffie_hellman(dh.pk2, dh.sk2)[..], @@ -383,13 +384,13 @@ fn derive_3dh_keys>( const OUTPUT_SIZE: usize = 32; let mut okm = [0u8; 3 * OUTPUT_SIZE]; - let h = Hkdf::::new(None, &ikm); + let h = Hkdf::::new(None, &ikm); h.expand(&info, &mut okm) .map_err(|_| InternalPakeError::HkdfError)?; Ok(( - *GenericArray::from_slice(&okm[..OUTPUT_SIZE]), - *GenericArray::from_slice(&okm[OUTPUT_SIZE..2 * OUTPUT_SIZE]), - *GenericArray::from_slice(&okm[2 * OUTPUT_SIZE..]), + GenericArray::clone_from_slice(&okm[..OUTPUT_SIZE]), + GenericArray::clone_from_slice(&okm[OUTPUT_SIZE..2 * OUTPUT_SIZE]), + GenericArray::clone_from_slice(&okm[2 * OUTPUT_SIZE..]), )) } diff --git a/src/lib.rs b/src/lib.rs index db283d2..9bd0657 100644 --- a/src/lib.rs +++ b/src/lib.rs @@ -14,7 +14,8 @@ //! to be kept consistent throughout protocol execution. These include: //! * a finite cyclic group along with a point representation, //! * a keypair type, -//! * a key exchange protocol, and +//! * a key exchange protocol, +//! * a hashing function, and //! * a slow hashing function. //! //! We will use the following choices in this example: @@ -25,6 +26,7 @@ //! type Group = curve25519_dalek::ristretto::RistrettoPoint; //! type KeyFormat = opaque_ke::keypair::X25519KeyPair; //! type KeyExchange = opaque_ke::key_exchange::tripledh::TripleDH; +//! type Hash = sha2::Sha256; //! type SlowHash = opaque_ke::slow_hash::NoOpHash; //! } //! ``` @@ -46,6 +48,7 @@ //! # type Group = curve25519_dalek::ristretto::RistrettoPoint; //! # type KeyFormat = opaque_ke::keypair::X25519KeyPair; //! # type KeyExchange = opaque_ke::key_exchange::tripledh::TripleDH; +//! # type Hash = sha2::Sha256; //! # type SlowHash = opaque_ke::slow_hash::NoOpHash; //! # } //! use rand_core::{OsRng, RngCore}; @@ -78,6 +81,7 @@ //! # type Group = curve25519_dalek::ristretto::RistrettoPoint; //! # type KeyFormat = opaque_ke::keypair::X25519KeyPair; //! # type KeyExchange = opaque_ke::key_exchange::tripledh::TripleDH; +//! # type Hash = sha2::Sha256; //! # type SlowHash = opaque_ke::slow_hash::NoOpHash; //! # } //! use rand_core::{OsRng, RngCore}; @@ -107,6 +111,7 @@ //! # type Group = curve25519_dalek::ristretto::RistrettoPoint; //! # type KeyFormat = opaque_ke::keypair::X25519KeyPair; //! # type KeyExchange = opaque_ke::key_exchange::tripledh::TripleDH; +//! # type Hash = sha2::Sha256; //! # type SlowHash = opaque_ke::slow_hash::NoOpHash; //! # } //! # use rand_core::{OsRng, RngCore}; @@ -139,6 +144,7 @@ //! # type Group = curve25519_dalek::ristretto::RistrettoPoint; //! # type KeyFormat = opaque_ke::keypair::X25519KeyPair; //! # type KeyExchange = opaque_ke::key_exchange::tripledh::TripleDH; +//! # type Hash = sha2::Sha256; //! # type SlowHash = opaque_ke::slow_hash::NoOpHash; //! # } //! # use rand_core::{OsRng, RngCore}; @@ -173,6 +179,7 @@ //! # type Group = curve25519_dalek::ristretto::RistrettoPoint; //! # type KeyFormat = opaque_ke::keypair::X25519KeyPair; //! # type KeyExchange = opaque_ke::key_exchange::tripledh::TripleDH; +//! # type Hash = sha2::Sha256; //! # type SlowHash = opaque_ke::slow_hash::NoOpHash; //! # } //! # use rand_core::{OsRng, RngCore}; @@ -215,6 +222,7 @@ //! # type Group = curve25519_dalek::ristretto::RistrettoPoint; //! # type KeyFormat = opaque_ke::keypair::X25519KeyPair; //! # type KeyExchange = opaque_ke::key_exchange::tripledh::TripleDH; +//! # type Hash = sha2::Sha256; //! # type SlowHash = opaque_ke::slow_hash::NoOpHash; //! # } //! # use rand_core::{OsRng, RngCore}; @@ -244,6 +252,7 @@ //! # type Group = curve25519_dalek::ristretto::RistrettoPoint; //! # type KeyFormat = opaque_ke::keypair::X25519KeyPair; //! # type KeyExchange = opaque_ke::key_exchange::tripledh::TripleDH; +//! # type Hash = sha2::Sha256; //! # type SlowHash = opaque_ke::slow_hash::NoOpHash; //! # } //! # use rand_core::{OsRng, RngCore}; @@ -288,6 +297,7 @@ //! # type Group = curve25519_dalek::ristretto::RistrettoPoint; //! # type KeyFormat = opaque_ke::keypair::X25519KeyPair; //! # type KeyExchange = opaque_ke::key_exchange::tripledh::TripleDH; +//! # type Hash = sha2::Sha256; //! # type SlowHash = opaque_ke::slow_hash::NoOpHash; //! # } //! # use rand_core::{OsRng, RngCore}; @@ -344,6 +354,7 @@ //! # type Group = curve25519_dalek::ristretto::RistrettoPoint; //! # type KeyFormat = opaque_ke::keypair::X25519KeyPair; //! # type KeyExchange = opaque_ke::key_exchange::tripledh::TripleDH; +//! # type Hash = sha2::Sha256; //! # type SlowHash = opaque_ke::slow_hash::NoOpHash; //! # } //! # use rand_core::{OsRng, RngCore}; @@ -400,6 +411,7 @@ pub mod opaque; pub mod ciphersuite; mod envelope; +mod hash; pub mod group; pub mod map_to_curve; diff --git a/src/map_to_curve.rs b/src/map_to_curve.rs index 57123b1..3d8819c 100644 --- a/src/map_to_curve.rs +++ b/src/map_to_curve.rs @@ -11,8 +11,9 @@ use curve25519_dalek::{edwards::EdwardsPoint, ristretto::RistrettoPoint}; use generic_array::GenericArray; use hkdf::Hkdf; +use sha2::{Sha256, Sha512}; -/// A subtrait of Group specifying how to has a password into a point +/// A subtrait of Group specifying how to hash a password into a point pub trait GroupWithMapToCurve: Group { /// transforms a password and optional pepper into a curve point fn map_to_curve(password: &[u8], pepper: Option<&[u8]>) -> Self; @@ -20,14 +21,14 @@ pub trait GroupWithMapToCurve: Group { impl GroupWithMapToCurve for RistrettoPoint { fn map_to_curve(password: &[u8], pepper: Option<&[u8]>) -> Self { - let (hashed_input, _) = Hkdf::::extract(pepper, password); + let (hashed_input, _) = Hkdf::::extract(pepper, password); ::hash_to_curve(GenericArray::from_slice(&hashed_input)) } } impl GroupWithMapToCurve for EdwardsPoint { fn map_to_curve(password: &[u8], pepper: Option<&[u8]>) -> Self { - let (hashed_input, _) = Hkdf::::extract(pepper, password); + let (hashed_input, _) = Hkdf::::extract(pepper, password); ::hash_to_curve(GenericArray::from_slice(&hashed_input)) } } diff --git a/src/opaque.rs b/src/opaque.rs index e36e312..436199c 100644 --- a/src/opaque.rs +++ b/src/opaque.rs @@ -10,6 +10,7 @@ use crate::{ envelope::{Envelope, ExportKeySize}, errors::{utils::check_slice_size, InternalPakeError, PakeError, ProtocolError}, group::Group, + hash::Hash, key_exchange::traits::{KeyExchange, ToBytes}, keypair::{Key, KeyPair, SizedBytes}, oprf, @@ -87,17 +88,18 @@ where /// The final message from the client, containing sealed cryptographic /// identifiers -pub struct RegisterThirdMessage { +pub struct RegisterThirdMessage { /// The "envelope" generated by the user, containing sealed /// cryptographic identifiers - envelope: Envelope, + envelope: Envelope, /// The user's public key client_s_pk: KeyFormat::Repr, } -impl RegisterThirdMessage +impl RegisterThirdMessage where KeyFormat: KeyPair, + D: Hash, { /// byte representation for the registration upload message pub fn to_bytes(&self) -> Vec { @@ -105,15 +107,16 @@ where } } -impl TryFrom<&[u8]> for RegisterThirdMessage +impl TryFrom<&[u8]> for RegisterThirdMessage where KeyFormat: KeyPair, + D: Hash, { type Error = ProtocolError; fn try_from(third_message_bytes: &[u8]) -> Result { let key_len = ::Len::to_usize(); - let envelope_size = key_len + Envelope::additional_size(); + let envelope_size = key_len + Envelope::::additional_size(); let checked_bytes = check_slice_size( third_message_bytes, envelope_size + key_len, @@ -123,7 +126,7 @@ where let client_s_pk = KeyFormat::check_public_key(unchecked_client_s_pk)?; Ok(Self { - envelope: Envelope::from_bytes(&checked_bytes[..envelope_size])?, + envelope: Envelope::::from_bytes(&checked_bytes[..envelope_size])?, client_s_pk, }) } @@ -133,7 +136,7 @@ where pub struct LoginFirstMessage { /// blinded password information alpha: CS::Group, - ke1_message: ::KE1Message, + ke1_message: >::KE1Message, } impl TryFrom<&[u8]> for LoginFirstMessage { @@ -145,7 +148,7 @@ impl TryFrom<&[u8]> for LoginFirstMessage { let arr = GenericArray::from_slice(&first_message_bytes[..elem_len]); let alpha = CS::Group::from_element_slice(arr)?; - let ke1_message = ::KE1Message::try_from( + let ke1_message = >::KE1Message::try_from( first_message_bytes[elem_len..].to_vec(), )?; Ok(Self { alpha, ke1_message }) @@ -161,25 +164,27 @@ impl LoginFirstMessage { /// The answer sent by the server to the user, upon reception of the /// login attempt. -pub struct LoginSecondMessage +pub struct LoginSecondMessage where KeyFormat: KeyPair, - KE: KeyExchange, + KE: KeyExchange, + D: Hash, { _key_format: PhantomData, _key_exchange: PhantomData, /// the server's oprf output beta: Grp, /// the user's sealed information, - envelope: Envelope, + envelope: Envelope, ke2_message: KE::KE2Message, } -impl LoginSecondMessage +impl LoginSecondMessage where Grp: Group, KeyFormat: KeyPair, - KE: KeyExchange, + KE: KeyExchange, + D: Hash, { /// byte representation for the login response pub fn to_bytes(&self) -> Vec { @@ -192,16 +197,17 @@ where } } -impl TryFrom<&[u8]> for LoginSecondMessage +impl TryFrom<&[u8]> for LoginSecondMessage where Grp: Group, KeyFormat: KeyPair, - KE: KeyExchange, + KE: KeyExchange, + D: Hash, { type Error = ProtocolError; fn try_from(second_message_bytes: &[u8]) -> Result { let key_len = ::Len::to_usize(); - let envelope_size = key_len + Envelope::additional_size(); + let envelope_size = key_len + Envelope::::additional_size(); let elem_len = Grp::ElemLen::to_usize(); let ke2_message_size = KE::ke2_message_size(); let checked_slice = check_slice_size( @@ -216,7 +222,8 @@ where let arr = GenericArray::from_slice(beta_bytes); let beta = Grp::from_element_slice(arr)?; - let envelope = Envelope::from_bytes(&checked_slice[elem_len..elem_len + envelope_size])?; + let envelope = + Envelope::::from_bytes(&checked_slice[elem_len..elem_len + envelope_size])?; let ke2_message = KE::KE2Message::try_from(checked_slice[elem_len + envelope_size..].to_vec())?; @@ -234,14 +241,15 @@ where /// The answer sent by the client to the server, upon reception of the /// sealed envelope pub struct LoginThirdMessage { - ke3_message: ::KE3Message, + ke3_message: >::KE3Message, } impl TryFrom<&[u8]> for LoginThirdMessage { type Error = ProtocolError; fn try_from(bytes: &[u8]) -> Result { - let ke3_message = ::KE3Message::try_from(bytes.to_vec())?; + let ke3_message = + >::KE3Message::try_from(bytes.to_vec())?; Ok(Self { ke3_message }) } } @@ -310,6 +318,7 @@ impl ClientRegistration { /// type Group = curve25519_dalek::ristretto::RistrettoPoint; /// type KeyFormat = opaque_ke::keypair::X25519KeyPair; /// type KeyExchange = opaque_ke::key_exchange::tripledh::TripleDH; + /// type Hash = sha2::Sha256; /// type SlowHash = opaque_ke::slow_hash::NoOpHash; /// } /// let mut rng = OsRng; @@ -336,8 +345,8 @@ impl ClientRegistration { } } -type ClientRegistrationFinishResult = ( - RegisterThirdMessage, +type ClientRegistrationFinishResult = ( + RegisterThirdMessage, GenericArray, ); @@ -361,6 +370,7 @@ impl ClientRegistration { /// type Group = curve25519_dalek::ristretto::RistrettoPoint; /// type KeyFormat = opaque_ke::keypair::X25519KeyPair; /// type KeyExchange = opaque_ke::key_exchange::tripledh::TripleDH; + /// type Hash = sha2::Sha256; /// type SlowHash = opaque_ke::slow_hash::NoOpHash; /// } /// let mut client_rng = OsRng; @@ -378,16 +388,16 @@ impl ClientRegistration { r2: RegisterSecondMessage, server_s_pk: &::Repr, rng: &mut R, - ) -> Result, ProtocolError> { + ) -> Result, ProtocolError> { let client_static_keypair = CS::KeyFormat::generate_random(rng)?; - let password_derived_key = get_password_derived_key::( + let password_derived_key = get_password_derived_key::( self.password.clone(), r2.beta, &self.blinding_factor, )?; - let (envelope, export_key) = Envelope::seal( + let (envelope, export_key) = Envelope::::seal( &password_derived_key, &client_static_keypair.private().to_arr(), &server_s_pk.to_arr(), @@ -434,7 +444,7 @@ impl Drop for ClientLogin { /// The state elements the server holds to record a registration pub struct ServerRegistration { - envelope: Option, + envelope: Option>, client_s_pk: Option<::Repr>, pub(crate) oprf_key: ::Scalar, } @@ -452,7 +462,7 @@ where fn try_from(server_registration_bytes: &[u8]) -> Result { let key_len = <::Repr as SizedBytes>::Len::to_usize(); let scalar_len = ::ScalarLen::to_usize(); - let envelope_size = key_len + Envelope::additional_size(); + let envelope_size = key_len + Envelope::::additional_size(); if server_registration_bytes.len() == scalar_len { return Ok(Self { @@ -476,7 +486,7 @@ where )?; let client_s_pk = CS::KeyFormat::check_public_key(unchecked_client_s_pk)?; Ok(Self { - envelope: Some(Envelope::from_bytes( + envelope: Some(Envelope::::from_bytes( &checked_bytes[checked_bytes.len() - envelope_size..], )?), client_s_pk: Some(client_s_pk), @@ -526,6 +536,7 @@ where /// type Group = curve25519_dalek::ristretto::RistrettoPoint; /// type KeyFormat = opaque_ke::keypair::X25519KeyPair; /// type KeyExchange = opaque_ke::key_exchange::tripledh::TripleDH; + /// type Hash = sha2::Sha256; /// type SlowHash = opaque_ke::slow_hash::NoOpHash; /// } /// let mut client_rng = OsRng; @@ -573,6 +584,7 @@ where /// type Group = curve25519_dalek::ristretto::RistrettoPoint; /// type KeyFormat = opaque_ke::keypair::X25519KeyPair; /// type KeyExchange = opaque_ke::key_exchange::tripledh::TripleDH; + /// type Hash = sha2::Sha256; /// type SlowHash = opaque_ke::slow_hash::NoOpHash; /// } /// let mut client_rng = OsRng; @@ -588,7 +600,7 @@ where /// ``` pub fn finish( self, - message: RegisterThirdMessage, + message: RegisterThirdMessage, ) -> Result { Ok(Self { envelope: Some(message.envelope), @@ -610,7 +622,7 @@ pub struct ClientLogin { blinding_factor: ::Scalar, /// The user's password password: Vec, - ke1_state: ::KE1State, + ke1_state: >::KE1State, } impl TryFrom<&[u8]> for ClientLogin { @@ -619,8 +631,8 @@ impl TryFrom<&[u8]> for ClientLogin { let scalar_len = ::ScalarLen::to_usize(); let blinding_factor_bytes = GenericArray::from_slice(&bytes[..scalar_len]); let blinding_factor = CS::Group::from_scalar_slice(blinding_factor_bytes)?; - let ke1_state_size = ::ke1_state_size(); - let ke1_state = ::KE1State::try_from( + let ke1_state_size = >::ke1_state_size(); + let ke1_state = >::KE1State::try_from( bytes[scalar_len..scalar_len + ke1_state_size].to_vec(), )?; let password = bytes[scalar_len + ke1_state_size..].to_vec(); @@ -670,6 +682,7 @@ impl ClientLogin { /// type Group = curve25519_dalek::ristretto::RistrettoPoint; /// type KeyFormat = opaque_ke::keypair::X25519KeyPair; /// type KeyExchange = opaque_ke::key_exchange::tripledh::TripleDH; + /// type Hash = sha2::Sha256; /// type SlowHash = opaque_ke::slow_hash::NoOpHash; /// } /// let mut client_rng = OsRng; @@ -722,6 +735,7 @@ impl ClientLogin { /// type Group = curve25519_dalek::ristretto::RistrettoPoint; /// type KeyFormat = opaque_ke::keypair::X25519KeyPair; /// type KeyExchange = opaque_ke::key_exchange::tripledh::TripleDH; + /// type Hash = sha2::Sha256; /// type SlowHash = opaque_ke::slow_hash::NoOpHash; /// } /// let mut client_rng = OsRng; @@ -738,19 +752,19 @@ impl ClientLogin { /// ``` pub fn finish( self, - l2: LoginSecondMessage, + l2: LoginSecondMessage, server_s_pk: &<::KeyFormat as KeyPair>::Repr, _client_e_sk_rng: &mut R, ) -> Result, ProtocolError> { let l2_bytes: Vec = [&l2.beta.to_arr()[..], &l2.envelope.to_bytes()].concat(); - let password_derived_key = get_password_derived_key::( + let password_derived_key = get_password_derived_key::( self.password.clone(), l2.beta, &self.blinding_factor, )?; - let (client_s_sk, export_key) = &l2 + let opened_envelope = &l2 .envelope .open(&password_derived_key, &server_s_pk.to_arr()) .map_err(|e| match e { @@ -763,20 +777,20 @@ impl ClientLogin { l2.ke2_message, &self.ke1_state, server_s_pk.clone(), - Key::from_bytes(client_s_sk)?, + Key::from_bytes(&opened_envelope.plaintext)?, )?; Ok(( LoginThirdMessage { ke3_message }, shared_secret, - *export_key, + opened_envelope.export_key, )) } } /// The state elements the server holds to record a login pub struct ServerLogin { - ke2_state: ::KE2State, + ke2_state: >::KE2State, _cs: PhantomData, } @@ -785,7 +799,9 @@ impl TryFrom<&[u8]> for ServerLogin { fn try_from(bytes: &[u8]) -> Result { Ok(Self { _cs: PhantomData, - ke2_state: ::KE2State::try_from(bytes.to_vec())?, + ke2_state: >::KE2State::try_from( + bytes.to_vec(), + )?, }) } } @@ -795,6 +811,7 @@ type ServerLoginStartResult = ( ::Group, ::KeyFormat, ::KeyExchange, + ::Hash, >, ServerLogin, ); @@ -825,6 +842,7 @@ impl ServerLogin { /// type Group = curve25519_dalek::ristretto::RistrettoPoint; /// type KeyFormat = opaque_ke::keypair::X25519KeyPair; /// type KeyExchange = opaque_ke::key_exchange::tripledh::TripleDH; + /// type Hash = sha2::Sha256; /// type SlowHash = opaque_ke::slow_hash::NoOpHash; /// } /// let mut client_rng = OsRng; @@ -901,6 +919,7 @@ impl ServerLogin { /// type Group = curve25519_dalek::ristretto::RistrettoPoint; /// type KeyFormat = opaque_ke::keypair::X25519KeyPair; /// type KeyExchange = opaque_ke::key_exchange::tripledh::TripleDH; + /// type Hash = sha2::Sha256; /// type SlowHash = opaque_ke::slow_hash::NoOpHash; /// } /// let mut client_rng = OsRng; @@ -918,24 +937,23 @@ impl ServerLogin { /// # Ok::<(), ProtocolError>(()) /// ``` pub fn finish(&self, message: LoginThirdMessage) -> Result, ProtocolError> { - ::finish_ke(message.ke3_message, &self.ke2_state).map_err( - |e| match e { + >::finish_ke(message.ke3_message, &self.ke2_state) + .map_err(|e| match e { ProtocolError::VerificationError(PakeError::KeyExchangeMacValidationError) => { ProtocolError::VerificationError(PakeError::InvalidLoginError) } err => err, - }, - ) + }) } } // Helper functions -fn get_password_derived_key( +fn get_password_derived_key, D: Hash>( password: Vec, beta: G, blinding_factor: &G::Scalar, ) -> Result, InternalPakeError> { - let oprf_output = oprf::generate_oprf3::(&password, beta, blinding_factor)?; + let oprf_output = oprf::generate_oprf3::(&password, beta, blinding_factor)?; SH::hash(oprf_output) } diff --git a/src/oprf.rs b/src/oprf.rs index cc8346b..e3a4541 100644 --- a/src/oprf.rs +++ b/src/oprf.rs @@ -3,8 +3,11 @@ // This source code is licensed under the MIT license found in the // LICENSE file in the root directory of this source tree. -use crate::{errors::InternalPakeError, group::Group, map_to_curve::GroupWithMapToCurve}; -use generic_array::{typenum::U32, GenericArray}; +use crate::{ + errors::InternalPakeError, group::Group, hash::Hash, map_to_curve::GroupWithMapToCurve, +}; +use digest::Digest; +use generic_array::GenericArray; use hkdf::Hkdf; use rand_core::{CryptoRng, RngCore}; @@ -42,14 +45,14 @@ pub(crate) fn generate_oprf2( /// Computes the third step for the multiplicative blinding version of DH-OPRF, in which /// the client unblinds the server's message. -pub(crate) fn generate_oprf3( +pub(crate) fn generate_oprf3( input: &[u8], point: G, blinding_factor: &G::Scalar, -) -> Result, InternalPakeError> { +) -> Result::OutputSize>, InternalPakeError> { let unblinded = point * &G::scalar_invert(&blinding_factor); let ikm: Vec = [&unblinded.to_arr()[..], input].concat(); - let (prk, _) = Hkdf::::extract(None, &ikm); + let (prk, _) = Hkdf::::extract(None, &ikm); Ok(prk) } @@ -94,7 +97,7 @@ mod tests { use generic_array::{arr, GenericArray}; use hkdf::Hkdf; use rand_core::OsRng; - use sha2::{Digest, Sha256, Sha512}; + use sha2::{Sha256, Sha512}; fn prf( input: &[u8], @@ -125,7 +128,7 @@ mod tests { ]; let salt = RistrettoPoint::from_scalar_slice(&salt_bytes)?; let beta = generate_oprf2::(alpha, &salt)?; - let res = generate_oprf3::(input, beta, &blinding_factor)?; + let res = generate_oprf3::(input, beta, &blinding_factor)?; let res2 = prf(&input[..], &salt.as_bytes()); assert_eq!(res, res2); Ok(()) @@ -140,15 +143,12 @@ mod tests { alpha, blinding_factor, } = generate_oprf1::<_, RistrettoPoint>(&input, None, &mut rng).unwrap(); - let res = generate_oprf3::(&input, alpha, &blinding_factor).unwrap(); + let res = generate_oprf3::(&input, alpha, &blinding_factor) + .unwrap(); let (hashed_input, _) = Hkdf::::extract(None, &input); - - // This is because RistrettoPoint is on an obsolete sha2 version let mut bits = [0u8; 64]; - let mut hasher = sha2::Sha512::new(); - Digest::update(&mut hasher, &hashed_input[..]); - bits.copy_from_slice(&hasher.finalize()); + bits.copy_from_slice(&hashed_input); let point = RistrettoPoint::from_uniform_bytes(&bits); let mut ikm: Vec = Vec::new(); diff --git a/src/slow_hash.rs b/src/slow_hash.rs index 537d521..129fafc 100644 --- a/src/slow_hash.rs +++ b/src/slow_hash.rs @@ -6,29 +6,36 @@ //! Trait specifying a slow hashing function use crate::errors::InternalPakeError; - -use generic_array::{typenum::U32, GenericArray}; +use crate::hash::Hash; +use digest::Digest; +use generic_array::GenericArray; /// Used for the slow hashing function in OPAQUE -pub trait SlowHash { +pub trait SlowHash { /// Computes the slow hashing function - fn hash(input: GenericArray) -> Result, InternalPakeError>; + fn hash( + input: GenericArray::OutputSize>, + ) -> Result, InternalPakeError>; } /// A no-op hash which simply returns its input pub struct NoOpHash; -impl SlowHash for NoOpHash { - fn hash(input: GenericArray) -> Result, InternalPakeError> { +impl SlowHash for NoOpHash { + fn hash( + input: GenericArray::OutputSize>, + ) -> Result, InternalPakeError> { Ok(input.to_vec()) } } #[cfg(feature = "slow-hash")] -impl SlowHash for scrypt::ScryptParams { - fn hash(input: GenericArray) -> Result, InternalPakeError> { +impl SlowHash for scrypt::ScryptParams { + fn hash( + input: GenericArray::OutputSize>, + ) -> Result, InternalPakeError> { let params = scrypt::ScryptParams::new(15, 8, 1).unwrap(); - let mut output = [0u8; 32]; + let mut output = [0u8; ::OutputSize::to_usize()]; scrypt::scrypt(&input, &[], ¶ms, &mut output) .map_err(|_| InternalPakeError::SlowHashError)?; Ok(output.to_vec()) diff --git a/src/tests/opaque_ke_test.rs b/src/tests/opaque_ke_test.rs index bd7726c..ef94d63 100644 --- a/src/tests/opaque_ke_test.rs +++ b/src/tests/opaque_ke_test.rs @@ -26,6 +26,7 @@ impl CipherSuite for X255193dhNoSlowHash { type Group = EdwardsPoint; type KeyFormat = X25519KeyPair; type KeyExchange = TripleDH; + type Hash = sha2::Sha256; type SlowHash = NoOpHash; } @@ -470,18 +471,19 @@ fn test_l3() -> Result<(), PakeError> { let parameters = populate_test_vectors(&serde_json::from_str(TEST_VECTOR).unwrap()); let mut client_e_sk_rng = CycleRng::new(parameters.client_e_sk.to_vec()); - let (l3, shared_secret, opaque_key_login) = - ClientLogin::::try_from(¶meters.client_login_state[..]) - .unwrap() - .finish( - LoginSecondMessage::::try_from( - ¶meters.l2[..], - ) - .unwrap(), - &Key::try_from(¶meters.server_s_pk[..])?, - &mut client_e_sk_rng, - ) - .unwrap(); + let (l3, shared_secret, opaque_key_login) = ClientLogin::::try_from( + ¶meters.client_login_state[..], + ) + .unwrap() + .finish( + LoginSecondMessage::::try_from( + ¶meters.l2[..], + ) + .unwrap(), + &Key::try_from(¶meters.server_s_pk[..])?, + &mut client_e_sk_rng, + ) + .unwrap(); assert_eq!( hex::encode(¶meters.shared_secret), diff --git a/src/tests/serialization.rs b/src/tests/serialization.rs index 3034337..fad8057 100644 --- a/src/tests/serialization.rs +++ b/src/tests/serialization.rs @@ -27,6 +27,7 @@ impl CipherSuite for Default { type Group = RistrettoPoint; type KeyFormat = crate::keypair::X25519KeyPair; type KeyExchange = TripleDH; + type Hash = sha2::Sha256; type SlowHash = crate::slow_hash::NoOpHash; } @@ -71,7 +72,7 @@ fn server_registration_roundtrip() { // the whole kit let key_len = <<::KeyFormat as KeyPair>::Repr as SizedBytes>::Len::to_usize(); - let envelope_size = key_len + Envelope::additional_size(); + let envelope_size = key_len + Envelope::::additional_size(); let mut mock_envelope_bytes = vec![0u8; envelope_size]; rng.fill_bytes(&mut mock_envelope_bytes); println!("{}", mock_envelope_bytes.len()); @@ -118,10 +119,11 @@ fn register_third_message_roundtrip() { let mut msg = [0u8; 32]; rng.fill_bytes(&mut msg); - let (ciphertext, _) = Envelope::seal(&key, &msg, &pubkey_bytes, &mut rng).unwrap(); + let (ciphertext, _) = + Envelope::::seal(&key, &msg, &pubkey_bytes, &mut rng).unwrap(); let message: Vec = [&ciphertext.to_bytes(), &pubkey_bytes[..]].concat(); - let r3 = RegisterThirdMessage::::try_from(&message[..]).unwrap(); + let r3 = RegisterThirdMessage::::try_from(&message[..]).unwrap(); let r3_bytes = r3.to_bytes(); assert_eq!(message, r3_bytes); } @@ -164,7 +166,8 @@ fn login_first_message_roundtrip() { rng.fill_bytes(&mut client_nonce); let ke1m: Vec = [&client_nonce[..], &client_e_kp.public()].concat(); - let reg = ::KE1Message::try_from(ke1m[..].to_vec()).unwrap(); + let reg = + >::KE1Message::try_from(ke1m[..].to_vec()).unwrap(); let reg_bytes = reg.to_bytes(); assert_eq!(reg_bytes, ke1m); }