diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml index f1a2eee..09804fc 100644 --- a/.github/workflows/ci.yml +++ b/.github/workflows/ci.yml @@ -36,13 +36,13 @@ jobs: toolchain: stable deps: true - platform: ubuntu-latest - toolchain: 1.81.0 # MSRV + toolchain: 1.85.0 # MSRV deps: sudo apt-get install libpcsclite-dev - platform: windows-latest - toolchain: 1.81.0 # MSRV + toolchain: 1.85.0 # MSRV deps: true - platform: macos-latest - toolchain: 1.81.0 # MSRV + toolchain: 1.85.0 # MSRV deps: true runs-on: ${{ matrix.platform }} steps: @@ -82,7 +82,7 @@ jobs: - uses: actions-rs/toolchain@v1 with: profile: minimal - toolchain: 1.81.0 # MSRV + toolchain: 1.85.0 # MSRV components: clippy override: true - run: sudo apt-get install libpcsclite-dev diff --git a/Cargo.lock b/Cargo.lock index 0c1521d..dd996de 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -60,15 +60,6 @@ dependencies = [ "windows-sys 0.59.0", ] -[[package]] -name = "async-signature" -version = "0.6.0-pre.4" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f9bdb5df8dde2bd1ec515a0981636508bb37d55984d0bae3678d4ac859125431" -dependencies = [ - "signature", -] - [[package]] name = "autocfg" version = "1.1.0" @@ -101,19 +92,13 @@ checksum = "cf4b9d6a944f767f8e5e0db018570623c85f3d925ac718db4e06d0187adb21c1" [[package]] name = "block-buffer" -version = "0.11.0-rc.3" +version = "0.11.0-rc.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3fd016a0ddc7cb13661bf5576073ce07330a693f8608a1320b4e20561cc12cdc" +checksum = "a229bfd78e4827c91b9b95784f69492c1b77c1ab75a45a8a037b139215086f94" dependencies = [ "hybrid-array", ] -[[package]] -name = "byteorder" -version = "1.5.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1fd0f2584146f6f2ef48085050886acf353beff7305ebd1ae69500e27c67f64b" - [[package]] name = "cfg-if" version = "1.0.0" @@ -122,9 +107,9 @@ checksum = "baf1de4339761588bc0619e3cbc0120ee582ebb74b53b4efbf79117bd2da40fd" [[package]] name = "cipher" -version = "0.5.0-pre.7" +version = "0.5.0-rc.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5b1425e6ce000f05a73096556cabcfb6a10a3ffe3bb4d75416ca8f00819c0b6a" +checksum = "bd4ef774202f1749465fc7cf88d70fc30620e8cacd5429268f4bff7d003bd976" dependencies = [ "crypto-common", "inout", @@ -178,9 +163,9 @@ checksum = "acbf1af155f9b9ef647e42cdc158db4b64a1b61f743629225fde6f3e0be2a7c7" [[package]] name = "const-oid" -version = "0.10.0-rc.3" +version = "0.10.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "68ff6be19477a1bd5441f382916a89bc2a0b2c35db6d41e0f6e8538bf6d6463f" +checksum = "0dabb6555f92fb9ee4140454eb5dcd14c7960e1225c6d1a6cc361f032947713e" [[package]] name = "cpufeatures" @@ -193,33 +178,43 @@ dependencies = [ [[package]] name = "crypto-bigint" -version = "0.6.0-rc.6" +version = "0.7.0-pre.6" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d748d1f5b807ee6d0df5a548d0130417295c3aaed1dcbbb3d6a2e7106e11fcca" +checksum = "98dc20cae677f0af161d98f18463804b680f9af060f6dbe6d4249bd7e838bca1" dependencies = [ "hybrid-array", "num-traits", "rand_core", + "serdect", "subtle", "zeroize", ] [[package]] name = "crypto-common" -version = "0.2.0-rc.1" +version = "0.2.0-rc.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b0b8ce8218c97789f16356e7896b3714f26c2ee1079b79c0b7ae7064bb9089fa" +checksum = "8a23fa214dea9efd4dacee5a5614646b30216ae0f05d4bb51bafb50e9da1c5be" dependencies = [ - "getrandom", "hybrid-array", +] + +[[package]] +name = "crypto-primes" +version = "0.7.0-pre.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ae744b9f528151f8c440cf67498f24d2d1ac0ab536b5ce7b1f87a7a5961bd1c1" +dependencies = [ + "crypto-bigint", + "libm", "rand_core", ] [[package]] name = "der" -version = "0.8.0-rc.1" +version = "0.8.0-rc.7" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "82db698b33305f0134faf590b9d1259dc171b5481ac41d5c8146c3b3ee7d4319" +checksum = "e2fe0a4fafae25053c19a03fefe040607bda956b4941d692ed9fb9d3c18a3193" dependencies = [ "const-oid", "der_derive", @@ -230,9 +225,9 @@ dependencies = [ [[package]] name = "der_derive" -version = "0.8.0-rc.1" +version = "0.8.0-rc.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "211bea8bb45f5f61bc857104606913ef8ac8b5ec698143aa2aa96a7ffdc94991" +checksum = "d184a65ac0a9db9e66e0d629bea86d0402198b2a5cc01c9c16de7a6537f0ac4f" dependencies = [ "proc-macro2", "quote", @@ -241,18 +236,18 @@ dependencies = [ [[package]] name = "des" -version = "0.9.0-pre.2" +version = "0.9.0-rc.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "76239c731adb4b5204cfeec47bd06ec1071d9477a0d32bbb83dc7d8c599efe63" +checksum = "8025983b9f9f242e94d459a57b81c571e92e4e1717ca57d092d8a69fc539efa1" dependencies = [ "cipher", ] [[package]] name = "digest" -version = "0.11.0-pre.9" +version = "0.11.0-rc.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "cf2e3d6615d99707295a9673e889bf363a04b2a466bd320c65a72536f7577379" +checksum = "460dd7f37e4950526b54a5a6b1f41b6c8e763c58eb9a8fc8fc05ba5c2f44ca7b" dependencies = [ "block-buffer", "const-oid", @@ -262,9 +257,9 @@ dependencies = [ [[package]] name = "ecdsa" -version = "0.17.0-pre.9" +version = "0.17.0-rc.5" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7e62f2041a28c40b8884b79fbd19bc7457d76c6397767831e9ff4029fc0473a9" +checksum = "112839e868b3376c2066506d42331023165d687a7ed38b2ed77f28763d9a7742" dependencies = [ "der", "digest", @@ -272,20 +267,20 @@ dependencies = [ "rfc6979", "signature", "spki", + "zeroize", ] [[package]] name = "elliptic-curve" -version = "0.14.0-rc.1" +version = "0.14.0-rc.10" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "cc43715037532dc2d061e5c97e81b684c28993d52a4fa4eb7d2ce2826d78f2f2" +checksum = "c28ecec37eea07ab976cea93c7ce8b36d561cf161f6767925c1edc51024b0ad3" dependencies = [ "base16ct", "crypto-bigint", "digest", "ff", "group", - "hkdf", "hybrid-array", "pem-rfc7468", "pkcs8", @@ -320,9 +315,9 @@ dependencies = [ [[package]] name = "ff" -version = "0.13.0" +version = "0.14.0-pre.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ded41244b729663b1e574f1b4fb731469f69f79c17667b5d776b16cda0479449" +checksum = "d42dd26f5790eda47c1a2158ea4120e32c35ddc9a7743c98a292accc01b54ef3" dependencies = [ "rand_core", "subtle", @@ -330,9 +325,9 @@ dependencies = [ [[package]] name = "flagset" -version = "0.4.6" +version = "0.4.7" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b3ea1ec5f8307826a5b71094dd91fc04d4ae75d5709b20ad351c7fb4815c86ec" +checksum = "b7ac824320a75a52197e8f2d787f6a38b6718bb6897a35142d749af3c0e8f4fe" [[package]] name = "getrandom" @@ -342,14 +337,26 @@ checksum = "fe9006bed769170c11f845cf00c7c1e9092aeb3f268e007c3e760ac68008070f" dependencies = [ "cfg-if", "libc", - "wasi", + "wasi 0.11.0+wasi-snapshot-preview1", +] + +[[package]] +name = "getrandom" +version = "0.3.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "26145e563e54f2cadc477553f1ec5ee650b00862f0a58bcd12cbdc5f0ea2d2f4" +dependencies = [ + "cfg-if", + "libc", + "r-efi", + "wasi 0.14.2+wasi-0.2.4", ] [[package]] name = "group" -version = "0.13.0" +version = "0.14.0-pre.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f0f9ef7462f7c099f518d754361858f86d8a07af53ba9af0fe635bbccb151a63" +checksum = "1ff6a0b2dd4b981b1ae9e3e6830ab146771f3660d31d57bafd9018805a91b0f1" dependencies = [ "ff", "rand_core", @@ -362,20 +369,11 @@ version = "0.5.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "2304e00983f87ffb38b55b444b5e3b60a884b5d30c0fca7d82fe33449bbe55ea" -[[package]] -name = "hkdf" -version = "0.13.0-pre.4" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "00176ff81091018d42ff82e8324f8e5adb0b7e0468d1358f653972562dbff031" -dependencies = [ - "hmac", -] - [[package]] name = "hmac" -version = "0.13.0-pre.4" +version = "0.13.0-rc.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e4b1fb14e4df79f9406b434b60acef9f45c26c50062cccf1346c6103b8c47d58" +checksum = "8dc6a2fcc35ab09136c6df2cdf9ca49790701420a3a6b5db0987dddbabc79b21" dependencies = [ "digest", ] @@ -388,9 +386,9 @@ checksum = "9a3a5bfb195931eeb336b2a7b4d761daec841b97f947d34394601737a7bba5e4" [[package]] name = "hybrid-array" -version = "0.2.1" +version = "0.3.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "45a9a965bb102c1c891fb017c09a05c965186b1265a207640f323ddd009f9deb" +checksum = "891d15931895091dea5c47afa5b3c9a01ba634b311919fd4d41388fa0e3d76af" dependencies = [ "typenum", "zeroize", @@ -398,9 +396,9 @@ dependencies = [ [[package]] name = "inout" -version = "0.2.0-rc.2" +version = "0.2.0-rc.5" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "14db49369b2c3f15deb5806de446e05c7f07a2d778b54b278c994fcd1d686f31" +checksum = "c774c86bce20ea04abe1c37cf0051c5690079a3a28ef5fdac2a5a0412b3d7d74" dependencies = [ "hybrid-array", ] @@ -411,26 +409,17 @@ version = "1.70.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "7943c866cc5cd64cbc25b2e01621d07fa8eb2a1a23160ee81ce38704e97b8ecf" -[[package]] -name = "lazy_static" -version = "1.4.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e2abad23fbc42b3700f2f279844dc832adb2b2eb069b2df918f455c4e18cc646" -dependencies = [ - "spin", -] - [[package]] name = "libc" -version = "0.2.150" +version = "0.2.172" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "89d92a4743f9a61002fae18374ed11e7973f530cb3a3255fb354818118b2203c" +checksum = "d750af042f7ef4f724306de029d18836c26c1765a54a6a3f094cbd23a7267ffa" [[package]] name = "libm" -version = "0.2.8" +version = "0.2.15" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4ec2a862134d2a7d32d7983ddcdd1c4923530833c9f2ea1a44fc5fa473989058" +checksum = "f9fbbcab51052fe104eb5e5d351cf728d30a5be1fe14d9be8a3b097481fb97de" [[package]] name = "log" @@ -460,45 +449,6 @@ dependencies = [ "minimal-lexical", ] -[[package]] -name = "num-bigint-dig" -version = "0.8.4" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "dc84195820f291c7697304f3cbdadd1cb7199c0efc917ff5eafd71225c136151" -dependencies = [ - "byteorder", - "lazy_static", - "libm", - "num-integer", - "num-iter", - "num-traits", - "rand", - "serde", - "smallvec", - "zeroize", -] - -[[package]] -name = "num-integer" -version = "0.1.45" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "225d3389fb3509a24c93f5c29eb6bde2586b98d9f016636dff58d7c6f7569cd9" -dependencies = [ - "autocfg", - "num-traits", -] - -[[package]] -name = "num-iter" -version = "0.1.43" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7d03e6c028c5dc5cac6e2dec0efda81fc887605bb3d884578bb6d6bf7514e252" -dependencies = [ - "autocfg", - "num-integer", - "num-traits", -] - [[package]] name = "num-traits" version = "0.2.19" @@ -506,7 +456,6 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "071dfc062690e90b734c0b2273ce72ad0ffa95f0c74596bc250dcfd960262841" dependencies = [ "autocfg", - "libm", ] [[package]] @@ -517,33 +466,35 @@ checksum = "3fdb12b2476b595f9358c5161aa467c2438859caa136dec86c26fdd2efe17b92" [[package]] name = "p256" -version = "0.14.0-pre.2" +version = "0.14.0-pre.9" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "71f3fd64a9cad9c26ed7f734b152196d5e56376b9957c832bcca0de48a708080" +checksum = "1be97a30a85c829fdac914cebb89ef05e109f9e5eb6510f46f623be91bc39ded" dependencies = [ "ecdsa", "elliptic-curve", + "primefield", "primeorder", "sha2", ] [[package]] name = "p384" -version = "0.14.0-pre.2" +version = "0.14.0-pre.9" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1e19554fe6ee269c860a0f231cbba714e5cbef26a927c75d8e30ac9040a4b32e" +checksum = "ea9626bce3d0bf768a28778618e5095131cd32bfca5297b51bbcb4abe7fae62a" dependencies = [ "ecdsa", "elliptic-curve", + "primefield", "primeorder", "sha2", ] [[package]] name = "pbkdf2" -version = "0.13.0-pre.1" +version = "0.13.0-rc.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "85e11753d5193f26dc27ae698e0b536b5e511b7799c5ac475ec10783f26d164a" +checksum = "c2efb182a4d7d26aa7442a4ef2f91c5021c6abb61f9fdd251fcc2e327f5faaf6" dependencies = [ "digest", "hmac", @@ -570,29 +521,28 @@ dependencies = [ [[package]] name = "pem-rfc7468" -version = "1.0.0-rc.2" +version = "1.0.0-rc.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c2dfbfa5c6f0906884269722c5478e72fd4d6c0e24fe600332c6d62359567ce1" +checksum = "a8e58fab693c712c0d4e88f8eb3087b6521d060bcaf76aeb20cb192d809115ba" dependencies = [ "base64ct", ] [[package]] name = "pkcs1" -version = "0.8.0-rc.1" +version = "0.8.0-rc.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "226eb25e2c46c166ce498ac0f606ac623142d640064879ff445938accddff1e2" +checksum = "b2345503b65d9be13aac96ddbec3eed60def8bc83869f9a519789afbcf3c2bea" dependencies = [ "der", - "pkcs8", "spki", ] [[package]] name = "pkcs8" -version = "0.11.0-rc.1" +version = "0.11.0-rc.6" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "eacd2c7141f32aef1cfd1ad0defb5287a3d94592d7ab57c1ae20e3f9f1f0db1f" +checksum = "c53e5d0804fa4070b1b2a5b320102f2c1c094920a7533d5d87c2630609bcbd34" dependencies = [ "der", "spki", @@ -606,53 +556,74 @@ checksum = "26072860ba924cbfa98ea39c8c19b4dd6a4a25423dbdf219c1eca91aa0cf6964" [[package]] name = "ppv-lite86" -version = "0.2.17" +version = "0.2.21" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5b40af805b3121feab8a3c29f04d8ad262fa8e0561883e7653e024ae4479e6de" +checksum = "85eae3c4ed2f50dcfe72643da4befc30deadb458a9b590d720cde2f2b1e97da9" +dependencies = [ + "zerocopy", +] + +[[package]] +name = "primefield" +version = "0.14.0-pre.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "adc85f9f75dc05486f61bc61858535c0501a0ca81ca3117ab17befbead13c110" +dependencies = [ + "crypto-bigint", + "ff", + "rand_core", + "subtle", + "zeroize", +] [[package]] name = "primeorder" -version = "0.14.0-pre.2" +version = "0.14.0-pre.7" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b794117b388378d55629f78f61e64e182baa200bf59c1a8205e0c46508ce5873" +checksum = "af12dd34fc62d04416de85af032f4595369437fb7b0143d36ae60cecaf5cdddf" dependencies = [ "elliptic-curve", ] [[package]] name = "proc-macro2" -version = "1.0.69" +version = "1.0.95" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "134c189feb4956b20f6f547d2cf727d4c0fe06722b20a0eec87ed445a97f92da" +checksum = "02b3e5e68a3a1a02aad3ec490a98007cbc13c37cbe84a3cd7b8e406d76e7f778" dependencies = [ "unicode-ident", ] [[package]] name = "quote" -version = "1.0.33" +version = "1.0.40" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5267fca4496028628a95160fc423a33e8b2e6af8a5302579e322e4b520293cae" +checksum = "1885c039570dc00dcb4ff087a89e185fd56bae234ddc7f056a945bf36467248d" dependencies = [ "proc-macro2", ] [[package]] -name = "rand" -version = "0.8.5" +name = "r-efi" +version = "5.2.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "34af8d1a0e25924bc5b7c43c079c942339d8f0a8b57c39049bef581b46327404" +checksum = "74765f6d916ee2faa39bc8e68e4f3ed8949b48cccdac59983d287a7cb71ce9c5" + +[[package]] +name = "rand" +version = "0.9.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9fbfd9d094a40bf3ae768db9361049ace4c0e04a4fd6b359518bd7b73a73dd97" dependencies = [ - "libc", "rand_chacha", "rand_core", ] [[package]] name = "rand_chacha" -version = "0.3.1" +version = "0.9.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e6c10a63a0fa32252be49d21e7709d4d4baf8d231c2dbce1eaa8141b9b127d88" +checksum = "d3022b5f1df60f26e1ffddd6c66e8aa15de382ae63b3a0c1bfc0e4d3e3f325cb" dependencies = [ "ppv-lite86", "rand_core", @@ -660,11 +631,11 @@ dependencies = [ [[package]] name = "rand_core" -version = "0.6.4" +version = "0.9.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ec0be4795e2f6a28069bec0b5ff3e2ac9bafc99e6a9a7dc3547996c5c816922c" +checksum = "99d9a13982dcf210057a8a78572b2217b667c3beacbf3a0d8b454f6f82837d38" dependencies = [ - "getrandom", + "getrandom 0.3.3", ] [[package]] @@ -698,9 +669,9 @@ checksum = "c08c74e62047bb2de4ff487b251e4a92e24f48745648451635cec7d591162d9f" [[package]] name = "rfc6979" -version = "0.5.0-pre.4" +version = "0.5.0-rc.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "871ee76a3eee98b0f805e5d1caf26929f4565073c580c053a55f886fc15dea49" +checksum = "f53f124bf3ec90be84ae97d7f52175ba938898525554c13c9017eb8f0a604146" dependencies = [ "hmac", "subtle", @@ -708,15 +679,14 @@ dependencies = [ [[package]] name = "rsa" -version = "0.10.0-pre.3" +version = "0.10.0-rc.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "07058e83b684989ab0559f9e22322f4e3f7e49147834ed0bae40486b9e70473c" +checksum = "7e8cb237ca3624409eda7d73de0d423815c9d91175ed5a62a8dd6549d2408cc2" dependencies = [ "const-oid", + "crypto-bigint", + "crypto-primes", "digest", - "num-bigint-dig", - "num-integer", - "num-traits", "pkcs1", "pkcs8", "rand_core", @@ -729,14 +699,13 @@ dependencies = [ [[package]] name = "sec1" -version = "0.8.0-rc.3" +version = "0.8.0-rc.8" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d1988446eff153796413a73669dfaa4caa3f5ce8b25fac89e3821a39c611772e" +checksum = "c54dee398d74b1d03d78ddc09c90e456bf906b5b7aa790ba4f48b025b2179e5d" dependencies = [ "base16ct", "der", "hybrid-array", - "pkcs8", "subtle", "zeroize", ] @@ -771,10 +740,20 @@ dependencies = [ ] [[package]] -name = "sha1" -version = "0.11.0-pre.4" +name = "serdect" +version = "0.3.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9540978cef7a8498211c1b1c14e5ce920fe5bd524ea84f4a3d72d4602515ae93" +checksum = "f42f67da2385b51a5f9652db9c93d78aeaf7610bf5ec366080b6de810604af53" +dependencies = [ + "base16ct", + "serde", +] + +[[package]] +name = "sha1" +version = "0.11.0-rc.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6f9318facddf9ac32a33527066936837e189b3f23ced6edc1603720ead5e2b3d" dependencies = [ "cfg-if", "cpufeatures", @@ -783,9 +762,9 @@ dependencies = [ [[package]] name = "sha2" -version = "0.11.0-pre.4" +version = "0.11.0-rc.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "540c0893cce56cdbcfebcec191ec8e0f470dd1889b6e7a0b503e310a94a168f5" +checksum = "aa1d2e6b3cc4e43a8258a9a3b17aa5dfd2cc5186c7024bba8a64aa65b2c71a59" dependencies = [ "cfg-if", "cpufeatures", @@ -794,31 +773,19 @@ dependencies = [ [[package]] name = "signature" -version = "2.3.0-pre.4" +version = "3.0.0-rc.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "054d71959c7051b9042c26af337f05cc930575ed2604d7d3ced3158383e59734" +checksum = "4835c3b5ecb10171941a4998a95a3a76ecac1c5ae8e6954f2ad030acd1c7e8ab" dependencies = [ "digest", "rand_core", ] -[[package]] -name = "smallvec" -version = "1.11.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4dccd0940a2dcdf68d092b8cbab7dc0ad8fa938bf95787e1b916b0e3d0e8e970" - -[[package]] -name = "spin" -version = "0.5.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6e63cff320ae2c57904679ba7cb63280a3dc4613885beafb148ee7bf9aa9042d" - [[package]] name = "spki" -version = "0.8.0-rc.1" +version = "0.8.0-rc.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "37ac66481418fd7afdc584adcf3be9aa572cf6c2858814494dc2a01755f050bc" +checksum = "8baeff88f34ed0691978ec34440140e1572b68c7dd4a495fd14a3dc1944daa80" dependencies = [ "base64ct", "der", @@ -838,9 +805,9 @@ checksum = "13c2bddecc57b384dee18652358fb23172facb8a2c51ccc10d74c157bdea3292" [[package]] name = "syn" -version = "2.0.39" +version = "2.0.101" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "23e78b90f2fcf45d3e842032ce32e3f2d1545ba6636271dcbf24fa306d87be7a" +checksum = "8ce2b7fc941b3a24138a0a7cf8e858bfc6a992e7978a068a5c760deb0ed43caf" dependencies = [ "proc-macro2", "quote", @@ -858,9 +825,9 @@ dependencies = [ [[package]] name = "tls_codec" -version = "0.4.1" +version = "0.4.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b5e78c9c330f8c85b2bae7c8368f2739157db9991235123aa1b15ef9502bfb6a" +checksum = "0de2e01245e2bb89d6f05801c564fa27624dbd7b1846859876c7dad82e90bf6b" dependencies = [ "tls_codec_derive", "zeroize", @@ -868,9 +835,9 @@ dependencies = [ [[package]] name = "tls_codec_derive" -version = "0.4.1" +version = "0.4.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8d9ef545650e79f30233c0003bcc2504d7efac6dad25fca40744de773fe2049c" +checksum = "2d2e76690929402faae40aebdda620a2c0e25dd6d3b9afe48867dfd95991f4bd" dependencies = [ "proc-macro2", "quote", @@ -901,7 +868,7 @@ version = "1.6.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "5e395fcf16a7a3d8127ec99782007af141946b4795001f876d54fb0d55978560" dependencies = [ - "getrandom", + "getrandom 0.2.11", ] [[package]] @@ -910,6 +877,15 @@ version = "0.11.0+wasi-snapshot-preview1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "9c8d87e72b64a3b4db28d11ce29237c246188f4f51057d65a7eab63b7987e423" +[[package]] +name = "wasi" +version = "0.14.2+wasi-0.2.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9683f9a5a998d873c0d21fcbe3c083009670149a8fab228644b8bd36b2c48cb3" +dependencies = [ + "wit-bindgen-rt", +] + [[package]] name = "winapi" version = "0.3.9" @@ -1081,12 +1057,20 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "589f6da84c646204747d1270a2a5661ea66ed1cced2631d546fdfb155959f9ec" [[package]] -name = "x509-cert" -version = "0.3.0-pre.0" +name = "wit-bindgen-rt" +version = "0.39.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2db382aa43c1fb5c419a960f72c3847ab0f383f635fc2e25f0bd6c5fb94371d1" +checksum = "6f42320e61fe2cfd34354ecb597f86f413484a798ba44a8ca1165c58d42da6c1" +dependencies = [ + "bitflags 2.5.0", +] + +[[package]] +name = "x509-cert" +version = "0.3.0-rc.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "015655a524ab1db259a56aaaec614cf84952299f4081c2602881d556e2ed2838" dependencies = [ - "async-signature", "const-oid", "der", "sha1", @@ -1108,14 +1092,12 @@ dependencies = [ "env_logger", "log", "nom", - "num-bigint-dig", - "num-integer", - "num-traits", "once_cell", "p256", "p384", "pbkdf2", "pcsc", + "rand", "rand_core", "rsa", "secrecy", @@ -1143,6 +1125,26 @@ dependencies = [ "yubikey", ] +[[package]] +name = "zerocopy" +version = "0.8.25" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a1702d9583232ddb9174e01bb7c15a2ab8fb1bc6f227aa1233858c351a3ba0cb" +dependencies = [ + "zerocopy-derive", +] + +[[package]] +name = "zerocopy-derive" +version = "0.8.25" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "28a6e20d751156648aa063f3800b706ee209a32c0b4d9f24be3d980b01be55ef" +dependencies = [ + "proc-macro2", + "quote", + "syn", +] + [[package]] name = "zeroize" version = "1.8.1" diff --git a/Cargo.toml b/Cargo.toml index 179cc33..805f757 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -14,37 +14,35 @@ readme = "README.md" categories = ["api-bindings", "authentication", "cryptography", "hardware-support"] keywords = ["ecdsa", "encryption", "rsa", "piv", "signature"] edition = "2021" -rust-version = "1.81" +rust-version = "1.85" [workspace] members = [".", "cli"] [workspace.dependencies] -sha2 = "=0.11.0-pre.4" -x509-cert = { version = "=0.3.0-pre.0", features = [ "builder", "hazmat" ] } +sha2 = "0.11.0-rc.0" +x509-cert = { version = "0.3.0-rc.1", features = [ "builder", "hazmat" ] } [dependencies] bitflags = "2.5.0" -der = "=0.8.0-rc.1" -des = "=0.9.0-pre.2" -elliptic-curve = "=0.14.0-rc.1" +der = "0.8.0-rc.7" +des = "0.9.0-rc.0" +elliptic-curve = "0.14.0-rc.7" hex = { package = "base16ct", version = "0.2", features = ["alloc"] } log = "0.4" nom = "7" -num-bigint-dig = { version = "0.8", features = ["rand"] } -num-traits = "0.2" -num-integer = "0.1" -ecdsa = { version = "=0.17.0-pre.9", features = ["digest", "pem"] } -p256 = "=0.14.0-pre.2" -p384 = "=0.14.0-pre.2" -pbkdf2 = { version = "=0.13.0-pre.1", default-features = false, features = ["hmac"] } +ecdsa = { version = "0.17.0-rc.2", features = ["digest", "pem"] } +p256 = "=0.14.0-pre.9" +p384 = "=0.14.0-pre.9" +pbkdf2 = { version = "0.13.0-rc.0", default-features = false, features = ["hmac"] } pcsc = "2.3.1" -rand_core = { version = "0.6", features = ["std"] } -rsa = { version = "=0.10.0-pre.3", features = ["sha2"] } +rand = "0.9" +rand_core = { version = "0.9", features = ["os_rng"] } +rsa = { version = "0.10.0-rc.3", features = ["sha2"] } secrecy = "0.8" -sha1 = { version = "=0.11.0-pre.4", features = ["oid"] } +sha1 = { version = "0.11.0-rc.0", features = ["oid"] } sha2 = { workspace = true, features = ["oid"] } -signature = "=2.3.0-pre.4" +signature = "3.0.0-rc.0" subtle = "2" uuid = { version = "1.2", features = ["v4"] } x509-cert.workspace = true diff --git a/src/apdu.rs b/src/apdu.rs index 93f8385..28267e8 100644 --- a/src/apdu.rs +++ b/src/apdu.rs @@ -344,7 +344,7 @@ impl From> for Response { } let sw = StatusWords::from( - (bytes[bytes.len() - 2] as u16) << 8 | (bytes[bytes.len() - 1] as u16), + ((bytes[bytes.len() - 2] as u16) << 8) | (bytes[bytes.len() - 1] as u16), ); let len = bytes.len() - 2; diff --git a/src/cccid.rs b/src/cccid.rs index b95a244..10dabf1 100644 --- a/src/cccid.rs +++ b/src/cccid.rs @@ -31,7 +31,7 @@ // OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. use crate::{Result, YubiKey}; -use rand_core::{OsRng, RngCore}; +use rand_core::{OsRng, RngCore, TryRngCore}; use std::fmt::{self, Debug, Display}; /// CCCID offset @@ -66,8 +66,14 @@ impl CardId { /// Generate a random CCC Card ID pub fn generate() -> Self { + let mut rng = OsRng.unwrap_err(); + Self::generate_from_rng(&mut rng) + } + + /// Generate a random CCC Card ID from an [`RngCore`] + pub fn generate_from_rng(rng: &mut R) -> Self { let mut id = [0u8; Self::BYTE_SIZE]; - OsRng.fill_bytes(&mut id); + rng.fill_bytes(&mut id); Self(id) } } diff --git a/src/error.rs b/src/error.rs index 83c5069..d0206ad 100644 --- a/src/error.rs +++ b/src/error.rs @@ -135,7 +135,7 @@ impl Error { Error::AlgorithmError => f.write_str("algorithm error"), Error::AppletError => f.write_str("applet error"), Error::AppletNotFound { applet_name } => { - f.write_str(&format!("{} applet not found", applet_name)) + f.write_str(&format!("{applet_name} applet not found")) } Error::ArgumentError => f.write_str("argument error"), Error::AuthenticationError => f.write_str("authentication error"), @@ -150,7 +150,7 @@ impl Error { Error::PcscError { inner: Some(pcsc_error), - } => f.write_fmt(format_args!("PC/SC error: {}", pcsc_error)), + } => f.write_fmt(format_args!("PC/SC error: {pcsc_error}")), Error::PcscError { .. } => f.write_str("PC/SC error"), diff --git a/src/metadata.rs b/src/metadata.rs index 10ae9ab..fdf9c97 100644 --- a/src/metadata.rs +++ b/src/metadata.rs @@ -157,8 +157,10 @@ impl Metadata { // We did not find an existing tag, append assert_eq!(offset, self.inner.len()); - self.inner - .extend(iter::repeat(0).take(1 + get_length_size(item.len()) + item.len())); + self.inner.extend(iter::repeat_n( + 0, + 1 + get_length_size(item.len()) + item.len(), + )); Tlv::write(&mut self.inner[offset..], tag, item)?; return Ok(()); @@ -193,7 +195,7 @@ impl Metadata { // Move remaining data let orig_len = self.inner.len(); if cb_moved > 0 { - self.inner.extend(iter::repeat(0).take(cb_moved as usize)); + self.inner.extend(iter::repeat_n(0, cb_moved as usize)); } self.inner.copy_within( next_offset..orig_len, diff --git a/src/mgm.rs b/src/mgm.rs index b3ef0f3..faeb6ee 100644 --- a/src/mgm.rs +++ b/src/mgm.rs @@ -32,7 +32,7 @@ use crate::{Error, Result}; use log::error; -use rand_core::{OsRng, RngCore}; +use rand_core::{OsRng, RngCore, TryRngCore}; use zeroize::Zeroize; use des::{ @@ -156,7 +156,8 @@ impl MgmKey { /// Generate a random MGM key pub fn generate() -> Self { let mut key_bytes = [0u8; DES_LEN_3DES]; - OsRng.fill_bytes(&mut key_bytes); + let mut rng = OsRng.unwrap_err(); + rng.fill_bytes(&mut key_bytes); Self(key_bytes) } diff --git a/src/piv.rs b/src/piv.rs index 99a83aa..1541456 100644 --- a/src/piv.rs +++ b/src/piv.rs @@ -57,26 +57,22 @@ use elliptic_curve::{sec1::EncodedPoint as EcPublicKey, PublicKey}; use log::{debug, error, warn}; use p256::NistP256; use p384::NistP384; -use rsa::{pkcs8::EncodePublicKey, BigUint, RsaPublicKey}; +use rsa::{pkcs8::EncodePublicKey, BoxedUint, RsaPublicKey}; use std::{ fmt::{Display, Formatter}, str::FromStr, }; use x509_cert::{der::Decode, spki::SubjectPublicKeyInfoOwned}; -#[cfg(feature = "untested")] -use { - num_bigint_dig::traits::ModInverse, - num_integer::Integer, - num_traits::{FromPrimitive, One}, -}; - #[cfg(feature = "untested")] use zeroize::Zeroizing; #[cfg(feature = "untested")] use crate::consts::CB_OBJ_MAX; +#[cfg(feature = "untested")] +use rsa::{traits::PrivateKeyParts, RsaPrivateKey}; + /// PIV Applet Name pub(crate) const APPLET_NAME: &str = "PIV"; @@ -175,9 +171,9 @@ impl From for u8 { impl Display for SlotId { fn fmt(&self, f: &mut Formatter<'_>) -> std::fmt::Result { match self { - SlotId::Management(r) => write!(f, "{:?}", r), - SlotId::Retired(r) => write!(f, "{:?}", r), - _ => write!(f, "{:?}", self), + SlotId::Management(r) => write!(f, "{r:?}"), + SlotId::Retired(r) => write!(f, "{r:?}"), + _ => write!(f, "{self:?}"), } } } @@ -330,7 +326,7 @@ impl From for u8 { impl Display for RetiredSlotId { fn fmt(&self, f: &mut Formatter<'_>) -> std::fmt::Result { - write!(f, "{:?}", self) + write!(f, "{self:?}") } } @@ -413,7 +409,7 @@ impl From for u8 { impl Display for ManagementSlotId { fn fmt(&self, f: &mut Formatter<'_>) -> std::fmt::Result { - write!(f, "{:?}", self) + write!(f, "{self:?}") } } @@ -791,36 +787,44 @@ impl RsaKeyData { /// - `Ok(key_data)` if `secret_p` and `secret_q` are valid primes. /// - `Err(Error::AlgorithmError)` if `secret_p`/`secret_q` are invalid primes. pub fn new(secret_p: &[u8], secret_q: &[u8]) -> Result { - let p = BigUint::from_bytes_be(secret_p); - let q = BigUint::from_bytes_be(secret_q); + let p = BoxedUint::from_be_slice_vartime(secret_p); + let q = BoxedUint::from_be_slice_vartime(secret_q); + let exp = BoxedUint::from(KEYDATA_RSA_EXP); - let totient = { - let p_t = &p - BigUint::one(); - let q_t = &p - BigUint::one(); - - p_t.lcm(&q_t) - }; - - let exp = BigUint::from_u64(KEYDATA_RSA_EXP).ok_or(Error::AlgorithmError)?; - - let d = exp.mod_inverse(&totient).ok_or(Error::AlgorithmError)?; - let d = d.to_biguint().ok_or(Error::AlgorithmError)?; - - // We calculate the optimization values ahead of time, instead of making the user - // do so. - - let dp = &d % (&p - BigUint::one()); - let dq = &d % (&q - BigUint::one()); - - let qinv = q.clone().mod_inverse(&p).ok_or(Error::AlgorithmError)?; - let (_, qinv) = qinv.to_bytes_be(); + let mut private_key = RsaPrivateKey::from_p_q(p.clone(), q.clone(), exp) + .map_err(|_| Error::AlgorithmError)?; + private_key + .precompute() + .map_err(|_| Error::AlgorithmError)?; Ok(RsaKeyData { - p: Zeroizing::new(p.to_bytes_be()), - q: Zeroizing::new(q.to_bytes_be()), - dp: Zeroizing::new(dp.to_bytes_be()), - dq: Zeroizing::new(dq.to_bytes_be()), - qinv: Zeroizing::new(qinv), + p: Zeroizing::new(p.to_be_bytes().to_vec()), + q: Zeroizing::new(q.to_be_bytes().to_vec()), + dp: Zeroizing::new( + private_key + .dp() + .expect("invariant violation: precompute should fill the field") + .clone() + .to_be_bytes() + .to_vec(), + ), + dq: Zeroizing::new( + private_key + .dq() + .expect("invariant violation: precompute should fill the field") + .clone() + .to_be_bytes() + .to_vec(), + ), + qinv: Zeroizing::new( + private_key + .qinv() + .expect("invariant violation: precompute should fill the field") + .clone() + .retrieve() + .to_be_bytes() + .to_vec(), + ), }) } @@ -1170,8 +1174,8 @@ fn read_public_key( let exp = exp_tlv.value.to_vec(); let pubkey = RsaPublicKey::new( - BigUint::from_bytes_be(&modulus), - BigUint::from_bytes_be(&exp), + BoxedUint::from_be_slice_vartime(&modulus), + BoxedUint::from_be_slice_vartime(&exp), ) .map_err(|_| Error::InvalidObject)?; Ok(SubjectPublicKeyInfoOwned::from_der( diff --git a/src/setting.rs b/src/setting.rs index 7ac94a7..4ba31b6 100644 --- a/src/setting.rs +++ b/src/setting.rs @@ -122,7 +122,7 @@ impl Setting { /// Get a setting boolean from an environment variable fn from_env(key: &str) -> Option { - env::var(format!("YUBIKEY_PIV_{}", key)) + env::var(format!("YUBIKEY_PIV_{key}")) .ok() .map(|value| Setting { source: SettingSource::User, diff --git a/src/yubikey.rs b/src/yubikey.rs index 6cbaf87..c7dabd2 100644 --- a/src/yubikey.rs +++ b/src/yubikey.rs @@ -43,7 +43,7 @@ use crate::{ }; use log::{error, info}; use pcsc::Card; -use rand_core::{OsRng, RngCore}; +use rand_core::{OsRng, RngCore, TryRngCore}; use std::{ cmp::{Ord, Ordering}, fmt::{self, Display}, @@ -434,7 +434,8 @@ impl YubiKey { data[4..12].copy_from_slice(&response); data[12] = 0x81; data[13] = 8; - OsRng.fill_bytes(&mut data[14..22]); + let mut rng = OsRng.unwrap_err(); + rng.fill_bytes(&mut data[14..22]); let mut challenge = [0u8; 8]; challenge.copy_from_slice(&data[14..22]); diff --git a/tests/integration.rs b/tests/integration.rs index 4194964..ebbab60 100644 --- a/tests/integration.rs +++ b/tests/integration.rs @@ -5,7 +5,7 @@ use log::trace; use once_cell::sync::Lazy; -use rand_core::{OsRng, RngCore}; +use rand_core::{OsRng, RngCore, TryRngCore}; use rsa::{pkcs1v15, RsaPublicKey}; use sha2::{Digest, Sha256}; use signature::hazmat::PrehashVerifier; @@ -48,7 +48,7 @@ fn test_get_cccid() { match yubikey.cccid() { Ok(cccid) => trace!("CCCID: {:?}", cccid), Err(Error::NotFound) => trace!("CCCID not found"), - Err(err) => panic!("error getting CCCID: {:?}", err), + Err(err) => panic!("error getting CCCID: {err:?}"), } } @@ -64,7 +64,7 @@ fn test_get_chuid() { match yubikey.chuid() { Ok(chuid) => trace!("CHUID: {:?}", chuid), Err(Error::NotFound) => trace!("CHUID not found"), - Err(err) => panic!("error getting CHUID: {:?}", err), + Err(err) => panic!("error getting CHUID: {err:?}"), } } @@ -167,7 +167,8 @@ fn generate_self_signed_cert() -> Certificate { // 0x80 0x00 ... (20bytes) is invalid because of high MSB (serial will keep the sign) // we'll limit ourselves to 19 bytes serial. let mut serial = [0u8; 19]; - OsRng.fill_bytes(&mut serial); + let mut rng = OsRng.unwrap_err(); + rng.fill_bytes(&mut serial); let serial = SerialNumber::new(&serial[..]).expect("serial can't be more than 20 bytes long"); let validity = Validity::from_now(Duration::new(500000, 0)).unwrap();