diff --git a/Cargo.lock b/Cargo.lock index 103bdda48d..2d5d5942e6 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -1,6 +1,13 @@ # This file is automatically @generated by Cargo. # It is not intended for manual editing. -version = 3 +[[package]] +name = "addr2line" +version = "0.14.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a55f82cfe485775d02112886f4169bde0c5894d75e79ead7eafe7e40a25e45f7" +dependencies = [ + "gimli", +] [[package]] name = "adler" @@ -8,35 +15,43 @@ version = "1.0.2" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "f26201604c87b1e01bd3d98f8d5d9a8fcbb815e8cedb41ffccbeb4bf593a35fe" +[[package]] +name = "aead" +version = "0.3.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7fc95d1bdb8e6666b2b217308eeeb09f2d6728d104be3e31916cc74d15420331" +dependencies = [ + "generic-array", +] + [[package]] name = "aes" -version = "0.5.0" +version = "0.6.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "dd2bc6d3f370b5666245ff421e231cba4353df936e26986d2918e61a8fd6aef6" +checksum = "884391ef1066acaa41e766ba8f596341b96e93ce34f9a43e7d24bf0a0eaf0561" dependencies = [ "aes-soft", "aesni", - "block-cipher", + "cipher", ] [[package]] name = "aes-soft" -version = "0.5.0" +version = "0.6.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "63dd91889c49327ad7ef3b500fd1109dbd3c509a03db0d4a9ce413b79f575cb6" +checksum = "be14c7498ea50828a38d0e24a765ed2effe92a705885b57d029cd67d45744072" dependencies = [ - "block-cipher", - "byteorder", + "cipher", "opaque-debug", ] [[package]] name = "aesni" -version = "0.8.0" +version = "0.10.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0a6fe808308bb07d393e2ea47780043ec47683fcf19cf5efc8ca51c50cc8c68a" +checksum = "ea2e11f5e94c2f7d386164cc2aa1f97823fed6f259e486940a71c174dd01b0ce" dependencies = [ - "block-cipher", + "cipher", "opaque-debug", ] @@ -64,6 +79,15 @@ version = "1.0.40" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "28b2cd92db5cbd74e8e5028f7e27dd7aa3090e89e4f2a197cc7c8dfb69c7063b" +[[package]] +name = "ascii-canvas" +version = "3.0.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8824ecca2e851cec16968d54a01dd372ef8f95b244fb84b84e70128be347c3c6" +dependencies = [ + "term 0.7.0", +] + [[package]] name = "async-compression" version = "0.3.7" @@ -101,10 +125,18 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "cdb031dd78e28731d87d56cc8ffef4a8f36ca26c38fe2de700543e627f8a464a" [[package]] -name = "base64" -version = "0.12.3" +name = "backtrace" +version = "0.3.57" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3441f0f7b02788e948e47f457ca01f1d7e6d92c693bc132c22b087d3141c03ff" +checksum = "78ed203b9ba68b242c62b3fb7480f589dd49829be1edb3fe8fc8b4ffda2dcb8d" +dependencies = [ + "addr2line", + "cfg-if 1.0.0", + "libc", + "miniz_oxide", + "object", + "rustc-demangle", +] [[package]] name = "base64" @@ -113,10 +145,19 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "904dfeac50f3cdaba28fc6f57fdcddb75f49ed61346676a78c4ffe55877802fd" [[package]] -name = "bitfield" -version = "0.13.2" +name = "bit-set" +version = "0.5.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6e11e16035ea35e4e5997b393eacbf6f63983188f7a2ad25bfb13465f5ad59de" +dependencies = [ + "bit-vec", +] + +[[package]] +name = "bit-vec" +version = "0.6.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "46afbd2983a5d5a7bd740ccb198caf5b82f45c40c09c0eed36052d91cb92e719" +checksum = "349f9b6a179ed607305526ca489b34ad0a41aed5f7980fa90eb03160b69598fb" [[package]] name = "bitflags" @@ -125,32 +166,34 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "cf1de2fe8c75bc145a2f577add951f8134889b4795d47466a54a5c846d691693" [[package]] -name = "block-buffer" -version = "0.9.0" +name = "bitvec" +version = "0.20.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4152116fd6e9dadb291ae18fc1ec3575ed6d84c29642d97890f4b4a3417297e4" +checksum = "7774144344a4faa177370406a7ff5f1da24303817368584c6206c8303eb07848" dependencies = [ - "block-padding", - "generic-array", + "funty", + "radium", + "tap", + "wyz", ] [[package]] -name = "block-cipher" -version = "0.8.0" +name = "block-buffer" +version = "0.9.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f337a3e6da609650eb74e02bc9fac7b735049f7623ab12f2e4c719316fcc7e80" +checksum = "4152116fd6e9dadb291ae18fc1ec3575ed6d84c29642d97890f4b4a3417297e4" dependencies = [ "generic-array", ] [[package]] name = "block-modes" -version = "0.6.1" +version = "0.7.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0c9b14fd8a4739e6548d4b6018696cf991dcf8c6effd9ef9eb33b29b8a650972" +checksum = "57a0e8073e8baa88212fb5823574c02ebccb395136ba9a164ab89379ec6072f0" dependencies = [ - "block-cipher", "block-padding", + "cipher", ] [[package]] @@ -161,12 +204,12 @@ checksum = "8d696c370c750c948ada61c69a0ee2cbbb9c50b1019ddb86d9317157a99c2cae" [[package]] name = "blowfish" -version = "0.6.0" +version = "0.7.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0f06850ba969bc59388b2cc0a4f186fc6d9d37208863b15b84ae3866ac90ac06" +checksum = "32fa6a061124e37baba002e496d203e23ba3d7b73750be82dbfbc92913048a5b" dependencies = [ - "block-cipher", "byteorder", + "cipher", "opaque-debug", ] @@ -182,13 +225,12 @@ dependencies = [ ] [[package]] -name = "buf_redux" -version = "0.8.4" +name = "buffered-reader" +version = "1.0.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b953a6887648bb07a535631f2bc00fbdb2a2216f135552cb3f534ed136b9c07f" +checksum = "5f76f15096822ca97dcc626a98ce3eb93c8afc795f33994a63e8d4ed767007e4" dependencies = [ - "memchr", - "safemem", + "libc", ] [[package]] @@ -211,12 +253,12 @@ checksum = "b700ce4376041dcd0a327fd0097c41095743c4c8af8887265942faf1100bd040" [[package]] name = "cast5" -version = "0.8.0" +version = "0.9.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e3ed1e6b53a3de8bafcce4b88867893c234e57f91686a4726d8e803771f0b55b" +checksum = "1285caf81ea1f1ece6b24414c521e625ad0ec94d880625c20f2e65d8d3f78823" dependencies = [ - "block-cipher", "byteorder", + "cipher", "opaque-debug", ] @@ -229,15 +271,6 @@ dependencies = [ "jobserver", ] -[[package]] -name = "cfb-mode" -version = "0.5.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8fa76b7293f89734378d27057d169dc68077ad34b21dbcabf1c0a646a9462592" -dependencies = [ - "stream-cipher", -] - [[package]] name = "cfg-if" version = "0.1.10" @@ -264,10 +297,13 @@ dependencies = [ ] [[package]] -name = "circular" -version = "0.3.0" +name = "cipher" +version = "0.2.5" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b0fc239e0f6cb375d2402d48afb92f76f5404fd1df208a41930ec81eda078bea" +checksum = "12f8e7987cbd042a63249497f41aed09f8e65add917ea6566effbc56578d6801" +dependencies = [ + "generic-array", +] [[package]] name = "clap" @@ -285,14 +321,21 @@ dependencies = [ ] [[package]] -name = "clear_on_drop" -version = "0.2.4" +name = "cmac" +version = "0.5.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c9cc5db465b294c3fa986d5bbb0f3017cd850bff6dd6c52f9ccff8b4d21b7b08" +checksum = "73d4de4f7724e5fe70addfb2bd37c2abd2f95084a429d7773b0b9645499b4272" dependencies = [ - "cc", + "crypto-mac 0.10.1", + "dbl", ] +[[package]] +name = "const-oid" +version = "0.5.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "279bc8fc53f788a75c7804af68237d1fce02cde1e275a886a4b320604dc2aeda" + [[package]] name = "core-foundation" version = "0.9.1" @@ -310,16 +353,19 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "ea221b5284a47e40033bf9b66f35f984ec0ea2931eb03505246cd27a963f981b" [[package]] -name = "cpuid-bool" -version = "0.1.2" +name = "cpufeatures" +version = "0.1.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8aebca1129a03dc6dc2b127edd729435bbc4a37e1d5f4d7513165089ceb02634" +checksum = "ed00c67cb5d0a7d64a44f6ad2668db7e7530311dd53ea79bcd4fb022c64911c8" +dependencies = [ + "libc", +] [[package]] -name = "crc24" -version = "0.1.6" +name = "cpuid-bool" +version = "0.1.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "fd121741cf3eb82c08dd3023eb55bf2665e5f60ec20f89760cf836ae4562e6a0" +checksum = "8aebca1129a03dc6dc2b127edd729435bbc4a37e1d5f4d7513165089ceb02634" [[package]] name = "crc32fast" @@ -375,6 +421,42 @@ dependencies = [ "lazy_static", ] +[[package]] +name = "crunchy" +version = "0.2.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7a81dae078cea95a014a339291cec439d2f232ebe854a9d672b796c6afafa9b7" + +[[package]] +name = "crypto-mac" +version = "0.10.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "bff07008ec701e8028e2ceb8f83f0e4274ee62bd2dbdc4fefff2e9a91824081a" +dependencies = [ + "cipher", + "generic-array", + "subtle", +] + +[[package]] +name = "crypto-mac" +version = "0.11.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b1d1a86f49236c215f271d40892d5fc950490551400b02ef360692c29815c714" +dependencies = [ + "generic-array", + "subtle", +] + +[[package]] +name = "ctr" +version = "0.6.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "fb4a30d54f7443bf3d6191dcd486aca19e67cb3c49fa7a06a319966346707e7f" +dependencies = [ + "cipher", +] + [[package]] name = "curl" version = "0.4.35" @@ -407,9 +489,9 @@ dependencies = [ [[package]] name = "curve25519-dalek" -version = "3.0.2" +version = "3.2.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f627126b946c25a4638eec0ea634fc52506dea98db118aae985118ce7c3d723f" +checksum = "0b9fdf9972b2bd6af2d913799d9ebc165ea4d2e65878e329d9c6b372c4491b61" dependencies = [ "byteorder", "digest", @@ -419,83 +501,69 @@ dependencies = [ ] [[package]] -name = "darling" -version = "0.10.2" +name = "dbl" +version = "0.3.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0d706e75d87e35569db781a9b5e2416cff1236a47ed380831f959382ccd5f858" +checksum = "37e797687b5f09528a48fcb63b6914d0255b8a6c760699a919af37042f09d9b3" dependencies = [ - "darling_core", - "darling_macro", + "generic-array", ] [[package]] -name = "darling_core" -version = "0.10.2" +name = "der" +version = "0.3.5" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f0c960ae2da4de88a91b2d920c2a7233b400bc33cb28453a2987822d8392519b" +checksum = "2eeb9d92785d1facb50567852ce75d0858630630e7eabea59cf7eb7474051087" dependencies = [ - "fnv", - "ident_case", - "proc-macro2", - "quote", - "strsim 0.9.3", - "syn", + "const-oid", + "typenum", ] [[package]] -name = "darling_macro" -version = "0.10.2" +name = "des" +version = "0.6.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d9b5a2f4ac4969822c62224815d069952656cadc7084fdca9751e6d959189b72" +checksum = "b24e7c748888aa2fa8bce21d8c64a52efc810663285315ac7476f7197a982fae" dependencies = [ - "darling_core", - "quote", - "syn", + "byteorder", + "cipher", + "opaque-debug", ] [[package]] -name = "derive_builder" -version = "0.9.0" +name = "diff" +version = "0.1.12" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a2658621297f2cf68762a6f7dc0bb7e1ff2cfd6583daef8ee0fed6f7ec468ec0" -dependencies = [ - "darling", - "derive_builder_core", - "proc-macro2", - "quote", - "syn", -] +checksum = "0e25ea47919b1560c4e3b7fe0aaab9becf5b84a10325ddf7db0f0ba5e1026499" [[package]] -name = "derive_builder_core" +name = "digest" version = "0.9.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2791ea3e372c8495c0bc2033991d76b512cd799d07491fbd6890124db9458bef" +checksum = "d3dd60d1080a57a05ab032377049e0591415d2b31afd7028356dbf3cc6dcb066" dependencies = [ - "darling", - "proc-macro2", - "quote", - "syn", + "generic-array", ] [[package]] -name = "des" -version = "0.5.0" +name = "dirs-next" +version = "2.0.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e084b5048dec677e6c9f27d7abc551dde7d127cf4127fea82323c98a30d7fa0d" +checksum = "b98cf8ebf19c3d1b223e151f99a4f9f0690dca41414773390fc824184ac833e1" dependencies = [ - "block-cipher", - "byteorder", - "opaque-debug", + "cfg-if 1.0.0", + "dirs-sys-next", ] [[package]] -name = "digest" -version = "0.9.0" +name = "dirs-sys-next" +version = "0.1.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d3dd60d1080a57a05ab032377049e0591415d2b31afd7028356dbf3cc6dcb066" +checksum = "4ebda144c4fe02d1f7ea1a7d9641b6fc6b580adcfa024ae48797ecdeb6825b4d" dependencies = [ - "generic-array", + "libc", + "redox_users", + "winapi", ] [[package]] @@ -514,11 +582,42 @@ dependencies = [ "url", ] +[[package]] +name = "dyn-clone" +version = "1.0.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ee2626afccd7561a06cf1367e2950c4718ea04565e20fb5029b6c7d8ad09abcf" + +[[package]] +name = "eax" +version = "0.3.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e1f76e7a5e594b299a0fa9a99de627530725e341df41376aa342aecb2c5eb76e" +dependencies = [ + "aead", + "cipher", + "cmac", + "ctr", + "subtle", +] + +[[package]] +name = "ecdsa" +version = "0.11.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "34d33b390ab82f2e1481e331dbd0530895640179d2128ef9a79cc690b78d1eba" +dependencies = [ + "der", + "elliptic-curve", + "hmac", + "signature", +] + [[package]] name = "ed25519" -version = "1.0.3" +version = "1.2.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "37c66a534cbb46ab4ea03477eae19d5c22c01da8258030280b7bd9d8433fb6ef" +checksum = "4620d40f6d2601794401d6dd95a5cf69b6c157852539470eeda433a99b3c0efc" dependencies = [ "signature", ] @@ -532,7 +631,6 @@ dependencies = [ "curve25519-dalek", "ed25519", "rand 0.7.3", - "serde", "sha2", "zeroize", ] @@ -556,6 +654,31 @@ version = "1.6.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "e78d4f1cc4ae33bbfc157ed5d5a5ef3bc29227303d595861deb238fcec4e9457" +[[package]] +name = "elliptic-curve" +version = "0.9.12" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c13e9b0c3c4170dcc2a12783746c4205d98e18957f57854251eea3f9750fe005" +dependencies = [ + "bitvec", + "ff", + "generic-array", + "group", + "pkcs8", + "rand_core 0.6.2", + "subtle", + "zeroize", +] + +[[package]] +name = "ena" +version = "0.14.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d7402b94a93c24e742487327a7cd839dc9d36fec9de9fb25b09f2dae459f36c3" +dependencies = [ + "log", +] + [[package]] name = "encoding_rs" version = "0.8.28" @@ -595,6 +718,17 @@ dependencies = [ "url", ] +[[package]] +name = "ff" +version = "0.9.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "72a4d941a5b7c2a75222e2d44fcdf634a67133d9db31e177ae5ff6ecda852bfe" +dependencies = [ + "bitvec", + "rand_core 0.6.2", + "subtle", +] + [[package]] name = "filetime" version = "0.2.14" @@ -607,6 +741,12 @@ dependencies = [ "winapi", ] +[[package]] +name = "fixedbitset" +version = "0.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "37ab347416e802de484e4d03c7316c48f1ecb56574dfd4a46a80f173ce1de04d" + [[package]] name = "flate2" version = "1.0.20" @@ -650,6 +790,12 @@ dependencies = [ "percent-encoding", ] +[[package]] +name = "funty" +version = "1.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "fed34cd105917e91daa4da6b3728c47b068749d6a62c59811f06ed2ac71d9da7" + [[package]] name = "futures-channel" version = "0.3.13" @@ -720,7 +866,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "501466ecc8a30d1d3b7fc9229b122b2ce8ed6e9d9223f1138d4babb253e51817" dependencies = [ "typenum", - "version_check 0.9.3", + "version_check", ] [[package]] @@ -745,6 +891,12 @@ dependencies = [ "wasi 0.10.2+wasi-snapshot-preview1", ] +[[package]] +name = "gimli" +version = "0.23.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f6503fe142514ca4799d4c26297c4248239fe8838d827db6bd6065c6ed29a6ce" + [[package]] name = "git-testament" version = "0.1.9" @@ -767,6 +919,17 @@ dependencies = [ "syn", ] +[[package]] +name = "group" +version = "0.9.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "61b3c1e8b4f1ca07e6605ea1be903a5f6956aec5c8a67fd44d56076631675ed8" +dependencies = [ + "ff", + "rand_core 0.6.2", + "subtle", +] + [[package]] name = "h2" version = "0.3.2" @@ -802,10 +965,14 @@ dependencies = [ ] [[package]] -name = "hex" -version = "0.4.3" +name = "hmac" +version = "0.11.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7f24254aa9a54b5c858eaee2f5bccdb46aaf0e486a595ed5fd8f86ba55232a70" +checksum = "2a2a2320eb7ec0ebe8da8f744d7812d9fc4cb4d09344ac01898dbcb6a20ae69b" +dependencies = [ + "crypto-mac 0.11.1", + "digest", +] [[package]] name = "home" @@ -902,10 +1069,14 @@ dependencies = [ ] [[package]] -name = "ident_case" -version = "1.0.1" +name = "idea" +version = "0.3.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b9e0384b61958566e926dc50660321d12159025e767c18e043daf26b70104c39" +checksum = "fcdd4b114cf2265123bbdc5d32a39f96a343fbdf141267d2b5232b7e14caacb3" +dependencies = [ + "cipher", + "opaque-debug", +] [[package]] name = "idna" @@ -934,6 +1105,15 @@ version = "2.3.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "47be2f14c678be2fdcab04ab1171db51b2762ce6f0a8ee87c8dd4a04ed216135" +[[package]] +name = "itertools" +version = "0.10.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "69ddb889f9d0d08a67338271fa9b62996bc788c7796a5c18cf057420aaed5eaf" +dependencies = [ + "either", +] + [[package]] name = "itoa" version = "0.4.7" @@ -959,10 +1139,36 @@ dependencies = [ ] [[package]] -name = "keccak" -version = "0.1.0" +name = "lalrpop" +version = "0.19.6" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "67c21572b4949434e4fc1e1978b99c5f77064153c59d998bf13ecd96fb5ecba7" +checksum = "b15174f1c529af5bf1283c3bc0058266b483a67156f79589fab2a25e23cf8988" +dependencies = [ + "ascii-canvas", + "atty", + "bit-set", + "diff", + "ena", + "itertools", + "lalrpop-util", + "petgraph", + "pico-args", + "regex", + "regex-syntax", + "string_cache", + "term 0.7.0", + "tiny-keccak", + "unicode-xid", +] + +[[package]] +name = "lalrpop-util" +version = "0.19.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d3e58cce361efcc90ba8a0a5f982c741ff86b603495bb15a998412e957dcd278" +dependencies = [ + "regex", +] [[package]] name = "lazy_static" @@ -1049,6 +1255,12 @@ dependencies = [ "autocfg 1.0.1", ] +[[package]] +name = "memsec" +version = "0.6.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2af4f95d8737f4ffafbd1fb3c703cdc898868a244a59786793cba0520ebdcbdd" + [[package]] name = "mime" version = "0.3.16" @@ -1106,14 +1318,10 @@ dependencies = [ ] [[package]] -name = "nom" -version = "4.2.3" +name = "new_debug_unreachable" +version = "1.0.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2ad2a91a8e869eeb30b9cb3119ae87773a8f4ae617f41b1eb9c154b2905f7bd6" -dependencies = [ - "memchr", - "version_check 0.1.5", -] +checksum = "e4a24736216ec316047a1fc4252e27dabb04218aa4a3f37c6e7ddbf1f9782b54" [[package]] name = "ntapi" @@ -1154,17 +1362,6 @@ dependencies = [ "zeroize", ] -[[package]] -name = "num-derive" -version = "0.3.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "876a53fff98e03a936a674b29568b0e605f06b29372c2489ff4de23f1949743d" -dependencies = [ - "proc-macro2", - "quote", - "syn", -] - [[package]] name = "num-integer" version = "0.1.44" @@ -1205,6 +1402,12 @@ dependencies = [ "libc", ] +[[package]] +name = "object" +version = "0.23.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a9a7ab5d64814df0fe4a4b5ead45ed6c5f181ee3ff04ba344313a6c80446c5d4" + [[package]] name = "once_cell" version = "1.7.2" @@ -1270,13 +1473,24 @@ dependencies = [ "vcpkg", ] +[[package]] +name = "p256" +version = "0.8.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2f05f5287453297c4c16af5e2b04df8fd2a3008d70f252729650bc6d7ace5844" +dependencies = [ + "ecdsa", + "elliptic-curve", + "sha2", +] + [[package]] name = "pem" version = "0.8.3" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "fd56cbd21fea48d0c440b41cd69c589faacade08c992d9a54e471b79d0fd13eb" dependencies = [ - "base64 0.13.0", + "base64", "once_cell", "regex", ] @@ -1297,54 +1511,30 @@ dependencies = [ ] [[package]] -name = "pgp" -version = "0.7.1" +name = "petgraph" +version = "0.5.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "501f8c2834bc16a23ae40932b9f924c6c5fc1d7cd1cc3536a532f37e81f603ed" +checksum = "467d164a6de56270bd7c4d070df81d07beace25012d5103ced4e9ff08d6afdb7" dependencies = [ - "aes", - "base64 0.12.3", - "bitfield", - "block-modes", - "block-padding", - "blowfish", - "buf_redux", - "byteorder", - "cast5", - "cfb-mode", - "chrono", - "circular", - "clear_on_drop", - "crc24", - "derive_builder", - "des", - "digest", - "ed25519-dalek", - "flate2", - "generic-array", - "hex", - "lazy_static", - "log", - "md-5", - "nom", - "num-bigint-dig", - "num-derive", - "num-traits", - "rand 0.7.3", - "ripemd160", - "rsa", - "sha-1", - "sha2", - "sha3", - "signature", - "smallvec", - "thiserror", - "try_from", - "twofish", - "x25519-dalek", - "zeroize", + "fixedbitset", + "indexmap", +] + +[[package]] +name = "phf_shared" +version = "0.8.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c00cf8b9eafe68dde5e9eaa2cef8ee84a9336a47d566ec55ca16589633b65af7" +dependencies = [ + "siphasher", ] +[[package]] +name = "pico-args" +version = "0.4.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "db8bcd96cb740d03149cbad5518db9fd87126a10ab519c011893b1754134c468" + [[package]] name = "pin-project" version = "1.0.6" @@ -1377,6 +1567,16 @@ version = "0.1.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "8b870d8c151b6f2fb93e84a13146138f05d02ed11c7e7c54f8826aaaf7c9f184" +[[package]] +name = "pkcs8" +version = "0.6.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c9c2f795bc591cb3384cb64082a578b89207ac92bb89c9d98c1ea2ace7cd8110" +dependencies = [ + "der", + "spki", +] + [[package]] name = "pkg-config" version = "0.3.19" @@ -1389,6 +1589,12 @@ version = "0.2.10" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "ac74c624d6b2d21f425f752262f42188365d7b8ff1aff74c82e45136510a4857" +[[package]] +name = "precomputed-hash" +version = "0.1.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "925383efa346730478fb4838dbe9137d2a47675ad789c546d150a6e1dd4ab31c" + [[package]] name = "proc-macro-hack" version = "0.5.19" @@ -1430,6 +1636,12 @@ dependencies = [ "proc-macro2", ] +[[package]] +name = "radium" +version = "0.6.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "643f8f41a8ebc4c5dc4515c82bb8abd397b527fc20fd681b7c011c2aee5d44fb" + [[package]] name = "rand" version = "0.7.3" @@ -1545,6 +1757,16 @@ dependencies = [ "bitflags", ] +[[package]] +name = "redox_users" +version = "0.4.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "528532f3d801c87aec9def2add9ca802fe569e44a544afe633765267840abe64" +dependencies = [ + "getrandom 0.2.2", + "redox_syscall", +] + [[package]] name = "regex" version = "1.4.5" @@ -1597,7 +1819,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "bf12057f289428dbf5c591c74bf10392e4a8003f993405a902f20117019022d4" dependencies = [ "async-compression", - "base64 0.13.0", + "base64", "bytes", "encoding_rs", "futures-core", @@ -1699,13 +1921,19 @@ dependencies = [ "zeroize", ] +[[package]] +name = "rustc-demangle" +version = "0.1.21" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7ef03e0a2b150c7a90d01faf6254c9c48a41e95fb2a8c2ac1c6f0d2b9aefc342" + [[package]] name = "rustls" version = "0.19.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "064fd21ff87c6e87ed4506e68beb42459caa4a0e2eb144932e6776768556980b" dependencies = [ - "base64 0.13.0", + "base64", "log", "ring", "sct", @@ -1744,7 +1972,6 @@ dependencies = [ "num_cpus", "opener", "openssl", - "pgp", "pulldown-cmark", "rand 0.8.3", "regex", @@ -1754,13 +1981,14 @@ dependencies = [ "same-file", "scopeguard", "semver", + "sequoia-openpgp", "serde", "sha2", "sharded-slab", "strsim 0.10.0", "tar", "tempfile", - "term", + "term 0.5.1", "thiserror", "threadpool", "toml", @@ -1774,16 +2002,16 @@ dependencies = [ ] [[package]] -name = "ryu" +name = "rustversion" version = "1.0.5" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "71d301d4193d031abdd79ff7e3dd721168a9572ef3fe51a1517aba235bd8f86e" +checksum = "61b3909d758bb75c79f23d4736fac9433868679d3ad2ea7a61e3c25cfda9a088" [[package]] -name = "safemem" -version = "0.3.3" +name = "ryu" +version = "1.0.5" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ef703b7cb59335eae2eb93ceb664c0eb7ea6bf567079d843e09420219668e072" +checksum = "71d301d4193d031abdd79ff7e3dd721168a9572ef3fe51a1517aba235bd8f86e" [[package]] name = "same-file" @@ -1861,6 +2089,55 @@ dependencies = [ "pest", ] +[[package]] +name = "sequoia-openpgp" +version = "1.5.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d99023a5010403956bae568a28dc7574a447665477509edd35ddd547cff1e6ec" +dependencies = [ + "aes", + "anyhow", + "backtrace", + "base64", + "block-modes", + "block-padding", + "blowfish", + "buffered-reader", + "cast5", + "chrono", + "cipher", + "des", + "digest", + "dyn-clone", + "eax", + "ecdsa", + "ed25519-dalek", + "generic-array", + "idea", + "idna", + "lalrpop", + "lalrpop-util", + "lazy_static", + "libc", + "md-5", + "memsec", + "num-bigint-dig", + "p256", + "rand 0.7.3", + "rand_core 0.6.2", + "regex", + "regex-syntax", + "ripemd160", + "rsa", + "sha-1", + "sha1collisiondetection", + "sha2", + "thiserror", + "twofish", + "typenum", + "x25519-dalek", +] + [[package]] name = "serde" version = "1.0.125" @@ -1906,39 +2183,37 @@ dependencies = [ [[package]] name = "sha-1" -version = "0.9.4" +version = "0.9.6" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "dfebf75d25bd900fd1e7d11501efab59bc846dbc76196839663e6637bba9f25f" +checksum = "8c4cfa741c5832d0ef7fab46cabed29c2aae926db0b11bb2069edd8db5e64e16" dependencies = [ "block-buffer", "cfg-if 1.0.0", - "cpuid-bool", + "cpufeatures", "digest", "opaque-debug", ] [[package]] -name = "sha2" -version = "0.9.3" +name = "sha1collisiondetection" +version = "0.2.5" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "fa827a14b29ab7f44778d14a88d3cb76e949c45083f7dbfa507d0cb699dc12de" +checksum = "f31bf4e9fe5cd8cea8e0887e2e4eb1b4d736ff11b776c8537bf0912a4b381285" dependencies = [ - "block-buffer", - "cfg-if 1.0.0", - "cpuid-bool", "digest", - "opaque-debug", + "generic-array", ] [[package]] -name = "sha3" -version = "0.9.1" +name = "sha2" +version = "0.9.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f81199417d4e5de3f04b1e871023acea7389672c4135918f05aa9cbf2f2fa809" +checksum = "fa827a14b29ab7f44778d14a88d3cb76e949c45083f7dbfa507d0cb699dc12de" dependencies = [ "block-buffer", + "cfg-if 1.0.0", + "cpuid-bool", "digest", - "keccak", "opaque-debug", ] @@ -1953,9 +2228,13 @@ dependencies = [ [[package]] name = "signature" -version = "1.3.0" +version = "1.3.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0f0242b8e50dd9accdd56170e94ca1ebd223b098eb9c83539a6e367d0f36ae68" +checksum = "c19772be3c4dd2ceaacf03cb41d5885f2a02c4d8804884918e3a258480803335" +dependencies = [ + "digest", + "rand_core 0.6.2", +] [[package]] name = "simple_asn1" @@ -1968,6 +2247,12 @@ dependencies = [ "num-traits", ] +[[package]] +name = "siphasher" +version = "0.3.7" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "533494a8f9b724d33625ab53c6c4800f7cc445895924a8ef649222dcb76e938b" + [[package]] name = "slab" version = "0.4.2" @@ -2008,26 +2293,31 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "6e63cff320ae2c57904679ba7cb63280a3dc4613885beafb148ee7bf9aa9042d" [[package]] -name = "stream-cipher" -version = "0.7.1" +name = "spki" +version = "0.3.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c80e15f898d8d8f25db24c253ea615cc14acf418ff307822995814e7d42cfa89" +checksum = "9dae7e047abc519c96350e9484a96c6bf1492348af912fd3446dd2dc323f6268" dependencies = [ - "block-cipher", - "generic-array", + "der", ] [[package]] -name = "strsim" -version = "0.8.0" +name = "string_cache" +version = "0.8.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8ea5119cdb4c55b55d432abb513a0429384878c15dde60cc77b1c99de1a95a6a" +checksum = "8ddb1139b5353f96e429e1a5e19fbaf663bddedaa06d1dbd49f82e352601209a" +dependencies = [ + "lazy_static", + "new_debug_unreachable", + "phf_shared", + "precomputed-hash", +] [[package]] name = "strsim" -version = "0.9.3" +version = "0.8.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6446ced80d6c486436db5c078dde11a9f73d42b57fb273121e160b84f63d894c" +checksum = "8ea5119cdb4c55b55d432abb513a0429384878c15dde60cc77b1c99de1a95a6a" [[package]] name = "strsim" @@ -2054,9 +2344,9 @@ dependencies = [ [[package]] name = "synstructure" -version = "0.12.4" +version = "0.12.5" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b834f2d66f734cb897113e34aaff2f1ab4719ca946f9a7358dba8f8064148701" +checksum = "474aaa926faa1603c40b7885a9eaea29b444d1cb2850cb7c0e37bb1a4182f4fa" dependencies = [ "proc-macro2", "quote", @@ -2074,6 +2364,12 @@ dependencies = [ "libc", ] +[[package]] +name = "tap" +version = "1.0.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "55937e1799185b12863d447f42597ed69d9928686b8d88a1df17376a097d8369" + [[package]] name = "tar" version = "0.4.33" @@ -2109,6 +2405,17 @@ dependencies = [ "winapi", ] +[[package]] +name = "term" +version = "0.7.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c59df8ac95d96ff9bede18eb7300b0fda5e5d8d90960e76f8e14ae765eedbf1f" +dependencies = [ + "dirs-next", + "rustversion", + "winapi", +] + [[package]] name = "textwrap" version = "0.11.0" @@ -2157,6 +2464,15 @@ dependencies = [ "winapi", ] +[[package]] +name = "tiny-keccak" +version = "2.0.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2c9d3793400a45f954c52e73d068316d76b6f4e36977e3fcebb13a2721e80237" +dependencies = [ + "crunchy", +] + [[package]] name = "tinyvec" version = "1.2.0" @@ -2275,23 +2591,14 @@ version = "0.2.3" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "59547bce71d9c38b83d9c0e92b6066c4253371f15005def0c30d9657f50c7642" -[[package]] -name = "try_from" -version = "0.3.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "283d3b89e1368717881a9d51dad843cc435380d8109c9e47d38780a324698d8b" -dependencies = [ - "cfg-if 0.1.10", -] - [[package]] name = "twofish" -version = "0.4.0" +version = "0.5.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e7a30db256d7388f6e08efa0a8e9e62ee34dd1af59706c76c9e8c97c2a500f12" +checksum = "0028f5982f23ecc9a1bc3008ead4c664f843ed5d78acd3d213b99ff50c441bc2" dependencies = [ - "block-cipher", "byteorder", + "cipher", "opaque-debug", ] @@ -2313,7 +2620,7 @@ version = "2.6.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "50f37be617794602aabbeee0be4f259dc1778fabe05e2d67ee8f79326d5cb4f6" dependencies = [ - "version_check 0.9.3", + "version_check", ] [[package]] @@ -2376,12 +2683,6 @@ version = "0.8.2" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "f1bddf1187be692e79c5ffeab891132dfb0f236ed36a43c7ed39f1165ee20191" -[[package]] -name = "version_check" -version = "0.1.5" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "914b1a6776c4c929a602fafd8bc742e06365d4bcbe48c30f9cca5824f70dc9dd" - [[package]] name = "version_check" version = "0.9.3" @@ -2567,11 +2868,17 @@ dependencies = [ "winapi", ] +[[package]] +name = "wyz" +version = "0.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "85e60b0d1b5f99db2556934e21937020776a5d31520bf169e851ac44e6420214" + [[package]] name = "x25519-dalek" -version = "1.1.0" +version = "1.2.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "bc614d95359fd7afc321b66d2107ede58b246b844cf5d8a0adcca413e439f088" +checksum = "2392b6b94a576b4e2bf3c5b2757d63f10ada8020a2e4d08ac849ebcf6ea8e077" dependencies = [ "curve25519-dalek", "rand_core 0.5.1", @@ -2598,18 +2905,18 @@ dependencies = [ [[package]] name = "zeroize" -version = "1.2.0" +version = "1.3.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "81a974bcdd357f0dca4d41677db03436324d45a4c9ed2d0b873a5a360ce41c36" +checksum = "4756f7db3f7b5574938c3eb1c117038b8e07f95ee6718c0efad4ac21508f1efd" dependencies = [ "zeroize_derive", ] [[package]] name = "zeroize_derive" -version = "1.0.1" +version = "1.1.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c3f369ddb18862aba61aa49bf31e74d29f0f162dec753063200e1dc084345d16" +checksum = "a2c1e130bebaeab2f23886bf9acbaca14b092408c452543c857f66399cd6dab1" dependencies = [ "proc-macro2", "quote", diff --git a/Cargo.toml b/Cargo.toml index ccb4328b10..1b5701193a 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -43,7 +43,6 @@ opener = "0.5.0" # Used by `curl` or `reqwest` backend although it isn't imported # by our rustup. openssl = {version = "0.10", optional = true} -pgp = {version = "0.7", default-features = false} pulldown-cmark = {version = "0.8", default-features = false} rand = "0.8" regex = "1" @@ -52,6 +51,7 @@ same-file = "1" scopeguard = "1" semver = "0.11" serde = {version = "1.0", features = ["derive"]} +sequoia-openpgp = { version = "1.5", default-features = false, features = ["crypto-rust", "allow-experimental-crypto", "allow-variable-time-crypto"] } sha2 = "0.9" sharded-slab = "0.1.1" strsim = "0.10" diff --git a/src/config.rs b/src/config.rs index 76df22becc..1944c2caa3 100644 --- a/src/config.rs +++ b/src/config.rs @@ -7,7 +7,7 @@ use std::str::FromStr; use std::sync::Arc; use anyhow::{anyhow, bail, Context, Result}; -use pgp::{Deserializable, SignedPublicKey}; +use sequoia_openpgp::{parse::Parse, policy, Cert}; use serde::Deserialize; use thiserror::Error as ThisError; @@ -155,22 +155,21 @@ impl<'a> OverrideCfg<'a> { } lazy_static::lazy_static! { - static ref BUILTIN_PGP_KEY: SignedPublicKey = pgp::SignedPublicKey::from_armor_single( - io::Cursor::new(&include_bytes!("rust-key.pgp.ascii")[..]) - ).unwrap().0; + static ref BUILTIN_PGP_KEY: Cert = + Cert::from_bytes(&include_bytes!("rust-key.pgp.ascii")[..]).unwrap(); } #[allow(clippy::large_enum_variant)] // Builtin is tiny, the rest are sane #[derive(Debug)] pub enum PgpPublicKey { Builtin, - FromEnvironment(PathBuf, SignedPublicKey), - FromConfiguration(PathBuf, SignedPublicKey), + FromEnvironment(PathBuf, Cert), + FromConfiguration(PathBuf, Cert), } impl PgpPublicKey { /// Retrieve the key. - pub(crate) fn key(&self) -> &SignedPublicKey { + pub(crate) fn cert(&self) -> &Cert { match self { Self::Builtin => &*BUILTIN_PGP_KEY, Self::FromEnvironment(_, k) => k, @@ -194,18 +193,17 @@ impl PgpPublicKey { } Ok(ret) } - use pgp::types::KeyTrait; let mut ret = vec![format!("from {}", self)]; - let key = self.key(); - let keyid = format_hex(&key.key_id().to_vec(), "-", 4)?; - let algo = key.algorithm(); - let fpr = format_hex(&key.fingerprint(), " ", 2)?; - let uid0 = key - .details - .users - .get(0) - .map(|u| u.id.id()) - .unwrap_or(""); + let cert = self.cert(); + let keyid = format_hex(cert.keyid().as_bytes(), "-", 4)?; + let algo = cert.primary_key().pk_algo(); + let fpr = format_hex(cert.fingerprint().as_bytes(), " ", 2)?; + let p = policy::StandardPolicy::new(); + let uid0 = cert + .with_policy(&p, None)? + .primary_userid() + .map(|u| u.userid().to_string()) + .unwrap_or("".into()); ret.push(format!(" {:?}/{} - {}", algo, keyid, uid0)); ret.push(format!(" Fingerprint: {}", fpr)); Ok(ret) @@ -277,11 +275,9 @@ impl Cfg { if let Some(ref s_path) = process().var_os("RUSTUP_PGP_KEY") { let path = PathBuf::from(s_path); let file = utils::open_file("RUSTUP_PGP_KEY", &path)?; - let (key, _) = SignedPublicKey::from_armor_single(file).map_err(|error| { - RustupError::InvalidPgpKey { - path: s_path.into(), - source: error, - } + let key = Cert::from_reader(file).map_err(|error| RustupError::InvalidPgpKey { + path: s_path.into(), + source: error, })?; pgp_keys.push(PgpPublicKey::FromEnvironment(path, key)); @@ -290,7 +286,7 @@ impl Cfg { if let Some(s) = &s.pgp_keys { let path = PathBuf::from(s); let file = utils::open_file("PGP Key from config", &path)?; - let (key, _) = SignedPublicKey::from_armor_single(file).map_err(|error| { + let key = Cert::from_reader(file).map_err(|error| { anyhow!(RustupError::InvalidPgpKey { path: s.into(), source: error, diff --git a/src/dist/signatures.rs b/src/dist/signatures.rs index 909dc801f4..9ddfc327b6 100644 --- a/src/dist/signatures.rs +++ b/src/dist/signatures.rs @@ -4,38 +4,83 @@ use std::io::Read; -use anyhow::{Context, Result}; -use pgp::types::KeyTrait; -use pgp::{Deserializable, StandaloneSignature}; +use anyhow::Result; + +use sequoia_openpgp::{ + parse::{stream::*, Parse}, + policy, Cert, KeyHandle, +}; use crate::config::PgpPublicKey; -pub(crate) fn verify_signature( - mut content: T, +/// Returns the index of the cert in `certs` that verifies a +/// signature. +/// +/// Ignores any signatures that are bad for any reason. If no +/// signature could be verified, returns `None`. +// XXX: This is a bit of an odd policy. Shouldn't we fail if we +// encounter a single bad signature (bad as in checksum doesn't check +// out, not bad as in we don't have the key)? +pub(crate) fn verify_signature( + content: T, signature: &str, - keys: &[PgpPublicKey], + certs: &[PgpPublicKey], ) -> Result> { - let mut content_buf = Vec::new(); - content.read_to_end(&mut content_buf)?; - let (signatures, _) = - StandaloneSignature::from_string_many(signature).context("error verifying signature")?; - - for signature in signatures { - let signature = signature.context("error verifying signature")?; - - for (idx, key) in keys.iter().enumerate() { - let actual_key = key.key(); - if actual_key.is_signing_key() && signature.verify(actual_key, &content_buf).is_ok() { - return Ok(Some(idx)); - } + let p = policy::StandardPolicy::new(); + let helper = Helper::new(certs); + let mut v = DetachedVerifierBuilder::from_reader(signature.as_bytes())? + .with_policy(&p, None, helper)?; + v.verify_reader(content)?; + Ok(v.into_helper().index) +} + +struct Helper<'a> { + certs: &'a [PgpPublicKey], + // The index of the cert in certs that successfully verified a + // signature. + index: Option, +} + +impl<'a> Helper<'a> { + fn new(certs: &'a [PgpPublicKey]) -> Self { + Helper { certs, index: None } + } +} + +impl VerificationHelper for Helper<'_> { + fn get_certs(&mut self, _: &[KeyHandle]) -> anyhow::Result> { + Ok(self.certs.iter().map(|c| c.cert().clone()).collect()) + } - for sub_key in &actual_key.public_subkeys { - if sub_key.is_signing_key() && signature.verify(sub_key, &content_buf).is_ok() { - return Ok(Some(idx)); + fn check(&mut self, structure: MessageStructure<'_>) -> anyhow::Result<()> { + for layer in structure.into_iter() { + match layer { + MessageLayer::SignatureGroup { results } => { + for result in results { + match result { + Ok(GoodChecksum { ka, .. }) => { + // A good signature! Find the index + // of the singer key and return + // success. + self.index = self.certs.iter().position(|c| c.cert() == ka.cert()); + assert!(self.index.is_some()); + return Ok(()); + } + _ => { + // We ignore any errors. + } + } + } + } + MessageLayer::Compression { .. } => { + unreachable!("we're verifying detached signatures") + } + MessageLayer::Encryption { .. } => { + unreachable!("we're verifying detached signatures") } } } - } - Ok(None) + Ok(()) + } } diff --git a/src/errors.rs b/src/errors.rs index 3e190ff2b2..8420fc3218 100644 --- a/src/errors.rs +++ b/src/errors.rs @@ -38,7 +38,7 @@ pub enum RustupError { #[error("unable to read the PGP key '{}'", .path.display())] InvalidPgpKey { path: PathBuf, - source: pgp::errors::Error, + source: anyhow::Error, }, #[error("invalid toolchain name: '{0}'")] InvalidToolchainName(String), diff --git a/tests/mock/dist.rs b/tests/mock/dist.rs index 155af1a750..d0dcc1772b 100644 --- a/tests/mock/dist.rs +++ b/tests/mock/dist.rs @@ -3,6 +3,7 @@ use crate::mock::MockInstallerBuilder; use lazy_static::lazy_static; +use sequoia_openpgp::{parse::Parse, Cert}; use sha2::{Digest, Sha256}; use std::collections::HashMap; use std::fs::{self, File}; @@ -532,29 +533,39 @@ pub fn write_file(dst: &Path, contents: &str) { const SIGNING_KEY_BYTES: &[u8] = include_bytes!("signing-key.asc"); const PUB_SIGNING_KEY_BYTES: &[u8] = include_bytes!("signing-key.pub.asc"); -fn get_secret_key() -> pgp::SignedSecretKey { - use pgp::Deserializable; - let (key, _) = - pgp::SignedSecretKey::from_armor_single(std::io::Cursor::new(SIGNING_KEY_BYTES)).unwrap(); - key +fn get_secret_key() -> Cert { + Cert::from_bytes(SIGNING_KEY_BYTES).unwrap() } -pub fn get_public_key() -> pgp::SignedPublicKey { - use pgp::Deserializable; - let (key, _) = - pgp::SignedPublicKey::from_armor_single(std::io::Cursor::new(PUB_SIGNING_KEY_BYTES)) - .unwrap(); - key +pub fn get_public_key() -> Cert { + Cert::from_bytes(PUB_SIGNING_KEY_BYTES).unwrap() } -pub fn create_signature(data: &[u8]) -> std::result::Result { +pub fn create_signature(data: &[u8]) -> anyhow::Result { + use sequoia_openpgp::serialize::stream::*; let key = get_secret_key(); - let msg = pgp::Message::new_literal_bytes("message", data); - let signed_message = msg.sign(&key, || "".into(), pgp::crypto::HashAlgorithm::SHA2_256)?; - let sig = signed_message.into_signature(); + let p = sequoia_openpgp::policy::StandardPolicy::new(); + let signing_keypair = key + .with_policy(&p, None)? + .keys() + .secret() + .supported() + .alive() + .revoked(false) + .for_signing() + .nth(0) + .unwrap() + .key() + .clone() + .into_keypair()?; - sig.verify(&key, data).expect("invalid sig created"); + let mut buf = Vec::new(); + let message = Message::new(&mut buf); + let message = Armorer::new(message).build()?; + let mut message = Signer::new(message, signing_keypair).detached().build()?; + message.write_all(data)?; + message.finalize()?; - sig.to_armored_string(None) + Ok(String::from_utf8(buf)?) }