diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml index 70f19a4e..06d89ff0 100644 --- a/.github/workflows/ci.yml +++ b/.github/workflows/ci.yml @@ -16,7 +16,7 @@ jobs: strategy: matrix: rust: - - 1.83.0 # MSRV + - 1.85.0 # MSRV - stable target: - thumbv7em-none-eabi @@ -35,7 +35,7 @@ jobs: strategy: matrix: rust: - - 1.83.0 # MSRV + - 1.85.0 # MSRV - stable steps: - uses: actions/checkout@v4 @@ -51,6 +51,7 @@ jobs: - run: cargo test --release --features serde minimal-versions: + if: false # disabled until we remove pre-releases dependencies runs-on: ubuntu-latest steps: - uses: actions/checkout@v4 @@ -71,5 +72,5 @@ jobs: - uses: RustCrypto/actions/cargo-cache@master - uses: dtolnay/rust-toolchain@master with: - toolchain: nightly-2024-10-06 + toolchain: nightly-2025-02-22 - run: cargo build --benches diff --git a/.github/workflows/workspace.yml b/.github/workflows/workspace.yml index 58b19e42..67b3ecc8 100644 --- a/.github/workflows/workspace.yml +++ b/.github/workflows/workspace.yml @@ -17,7 +17,7 @@ jobs: - uses: RustCrypto/actions/cargo-cache@master - uses: dtolnay/rust-toolchain@master with: - toolchain: 1.83.0 + toolchain: 1.85.0 components: clippy - run: cargo clippy --all -- -D warnings @@ -40,7 +40,7 @@ jobs: - uses: dtolnay/rust-toolchain@master with: # We need Nightly for doc_auto_cfg - toolchain: nightly-2024-11-30 + toolchain: nightly-2025-02-22 - uses: Swatinem/rust-cache@v2 - env: RUSTDOCFLAGS: "-Dwarnings --cfg docsrs" diff --git a/Cargo.lock b/Cargo.lock index 81d2f1c0..3cf4b43d 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -77,18 +77,18 @@ checksum = "8f68f53c83ab957f72c32642f3868eec03eb974d1fb82e453128456482613d36" [[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 = "block-padding" -version = "0.4.0-rc.2" +version = "0.4.0-rc.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6868e23cd7a5b2e18fb2e9a583910b88b8d645dd21017aafc5d0439cf16ae6d6" +checksum = "ee88d14c41bbae2e333f574a27fc73d96fe1039e5a356c20d06a7f2a34cd8e5a" dependencies = [ "hybrid-array", ] @@ -126,9 +126,9 @@ dependencies = [ [[package]] name = "const-oid" -version = "0.10.0-rc.3" +version = "0.10.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "68ff6be19477a1bd5441f382916a89bc2a0b2c35db6d41e0f6e8538bf6d6463f" +checksum = "1cb3c4a0d3776f7535c32793be81d6d5fec0d48ac70955d9834e643aa249a52f" [[package]] name = "cpufeatures" @@ -141,12 +141,11 @@ dependencies = [ [[package]] name = "crypto-bigint" -version = "0.6.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4919aa33c410cb537c1b2a8458a896f9e47ed4349a2002e5b240f358f7bf6ffc" +version = "0.7.0-pre.0" +source = "git+https://github.com/RustCrypto/crypto-bigint.git#2734f1852d9a713dc92183bb6e2d4b987f1e38f1" dependencies = [ "num-traits", - "rand_core", + "rand_core 0.9.3", "serdect", "subtle", "zeroize", @@ -154,23 +153,20 @@ dependencies = [ [[package]] name = "crypto-common" -version = "0.2.0-rc.1" +version = "0.2.0-rc.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b0b8ce8218c97789f16356e7896b3714f26c2ee1079b79c0b7ae7064bb9089fa" +checksum = "170d71b5b14dec99db7739f6fc7d6ec2db80b78c3acb77db48392ccc3d8a9ea0" dependencies = [ - "getrandom 0.2.15", "hybrid-array", - "rand_core", ] [[package]] name = "crypto-primes" -version = "0.6.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d8cafc054d42839b05a3d87df450ca9c5437c06aa68b3ef70d4e7e98b9346961" +version = "0.7.0-dev" +source = "git+https://github.com/entropyxyz/crypto-primes.git#dfc396609a8fdaab895976933edad36c06de8a19" dependencies = [ "crypto-bigint", - "rand_core", + "rand_core 0.9.3", ] [[package]] @@ -185,8 +181,7 @@ dependencies = [ [[package]] name = "der" version = "0.8.0-rc.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "82db698b33305f0134faf590b9d1259dc171b5481ac41d5c8146c3b3ee7d4319" +source = "git+https://github.com/RustCrypto/formats.git#8ccef60fb797c0e48dbfe642f39095713de92a72" dependencies = [ "const-oid", "pem-rfc7468", @@ -195,9 +190,9 @@ dependencies = [ [[package]] name = "digest" -version = "0.11.0-pre.9" +version = "0.11.0-pre.10" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "cf2e3d6615d99707295a9673e889bf363a04b2a466bd320c65a72536f7577379" +checksum = "6c478574b20020306f98d61c8ca3322d762e1ff08117422ac6106438605ea516" dependencies = [ "block-buffer", "const-oid", @@ -277,27 +272,27 @@ checksum = "6fe2267d4ed49bc07b63801559be28c718ea06c4738b7a03c94df7386d2cde46" [[package]] name = "hmac" -version = "0.13.0-pre.4" +version = "0.13.0-pre.5" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e4b1fb14e4df79f9406b434b60acef9f45c26c50062cccf1346c6103b8c47d58" +checksum = "62c11fc82c6b89c906b4d26b7b5a305d0b3aebd4b458dd1bd0a7ed98c548a28e" dependencies = [ "digest", ] [[package]] name = "hybrid-array" -version = "0.2.3" +version = "0.3.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f2d35805454dc9f8662a98d6d61886ffe26bd465f5960e0e55345c70d5c0d2a9" +checksum = "4dab50e193aebe510fe0e40230145820e02f48dae0cf339ea4204e6e708ff7bd" dependencies = [ "typenum", ] [[package]] name = "inout" -version = "0.2.0-rc.3" +version = "0.2.0-rc.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "de49db00f5add6dad75a57946b75de0f26287a6fc95f4f277d48419200422beb" +checksum = "ac5e145e8ade9f74c0a5efc60ccb4e714b0144f7e2220b7ca64254feee71c57f" dependencies = [ "block-padding", "hybrid-array", @@ -366,8 +361,7 @@ checksum = "c08d65885ee38876c4f86fa503fb49d7b507c2b62552df7c70b2fce627e06381" [[package]] name = "pbkdf2" version = "0.13.0-pre.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "85e11753d5193f26dc27ae698e0b536b5e511b7799c5ac475ec10783f26d164a" +source = "git+https://github.com/baloo/password-hashes.git?branch=baloo%2Fhmac-0.13.0-pre.5#5fcba783b95daf9a2dba4b938c77e2904a261750" dependencies = [ "digest", "hmac", @@ -385,8 +379,7 @@ dependencies = [ [[package]] name = "pkcs1" version = "0.8.0-rc.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "226eb25e2c46c166ce498ac0f606ac623142d640064879ff445938accddff1e2" +source = "git+https://github.com/RustCrypto/formats.git#8ccef60fb797c0e48dbfe642f39095713de92a72" dependencies = [ "der", "pkcs8", @@ -395,16 +388,15 @@ dependencies = [ [[package]] name = "pkcs5" -version = "0.8.0-rc.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f8f82982d2266bdb473aad8f0f5deb02405ada818775769f3c71f12e349d1212" +version = "0.8.0-rc.3" +source = "git+https://github.com/RustCrypto/formats.git#8ccef60fb797c0e48dbfe642f39095713de92a72" dependencies = [ "aes", "aes-gcm", "cbc", "der", "pbkdf2", - "rand_core", + "rand_core 0.9.3", "scrypt", "sha2", "spki", @@ -412,13 +404,12 @@ dependencies = [ [[package]] name = "pkcs8" -version = "0.11.0-rc.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "eacd2c7141f32aef1cfd1ad0defb5287a3d94592d7ab57c1ae20e3f9f1f0db1f" +version = "0.11.0-rc.2" +source = "git+https://github.com/RustCrypto/formats.git#8ccef60fb797c0e48dbfe642f39095713de92a72" dependencies = [ "der", "pkcs5", - "rand_core", + "rand_core 0.9.3", "spki", ] @@ -440,7 +431,7 @@ version = "0.2.20" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "77957b295656769bb8ad2b6a6b09d897d94f05c41b069aede1fcdaa675eaea04" dependencies = [ - "zerocopy", + "zerocopy 0.7.35", ] [[package]] @@ -463,9 +454,9 @@ dependencies = [ "bitflags", "lazy_static", "num-traits", - "rand", - "rand_chacha", - "rand_xorshift", + "rand 0.8.5", + "rand_chacha 0.3.1", + "rand_xorshift 0.3.0", "regex-syntax", "rusty-fork", "tempfile", @@ -494,8 +485,19 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "34af8d1a0e25924bc5b7c43c079c942339d8f0a8b57c39049bef581b46327404" dependencies = [ "libc", - "rand_chacha", - "rand_core", + "rand_chacha 0.3.1", + "rand_core 0.6.4", +] + +[[package]] +name = "rand" +version = "0.9.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3779b94aeb87e8bd4e834cee3650289ee9e0d5677f976ecdb6d219e5f4f6cd94" +dependencies = [ + "rand_chacha 0.9.0", + "rand_core 0.9.3", + "zerocopy 0.8.17", ] [[package]] @@ -505,7 +507,17 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "e6c10a63a0fa32252be49d21e7709d4d4baf8d231c2dbce1eaa8141b9b127d88" dependencies = [ "ppv-lite86", - "rand_core", + "rand_core 0.6.4", +] + +[[package]] +name = "rand_chacha" +version = "0.9.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d3022b5f1df60f26e1ffddd6c66e8aa15de382ae63b3a0c1bfc0e4d3e3f325cb" +dependencies = [ + "ppv-lite86", + "rand_core 0.9.3", ] [[package]] @@ -517,13 +529,31 @@ dependencies = [ "getrandom 0.2.15", ] +[[package]] +name = "rand_core" +version = "0.9.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "99d9a13982dcf210057a8a78572b2217b667c3beacbf3a0d8b454f6f82837d38" +dependencies = [ + "getrandom 0.3.1", +] + [[package]] name = "rand_xorshift" version = "0.3.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "d25bf25ec5ae4a3f1b92f929810509a2f53d7dca2f50b794ff57e3face536c8f" dependencies = [ - "rand_core", + "rand_core 0.6.4", +] + +[[package]] +name = "rand_xorshift" +version = "0.4.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "513962919efc330f829edb2535844d1b912b0fbe2ca165d613e4e8788bb05a5a" +dependencies = [ + "rand_core 0.9.3", ] [[package]] @@ -546,10 +576,10 @@ dependencies = [ "pkcs1", "pkcs8", "proptest", - "rand", - "rand_chacha", - "rand_core", - "rand_xorshift", + "rand 0.9.0", + "rand_chacha 0.9.0", + "rand_core 0.9.3", + "rand_xorshift 0.4.0", "serde", "serde_json", "serde_test", @@ -607,8 +637,7 @@ dependencies = [ [[package]] name = "scrypt" version = "0.12.0-pre.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8a91394d9fa36fde88b8b976973db9fe6a0e4b32eea79f0ca13ba1b818daa3b2" +source = "git+https://github.com/baloo/password-hashes.git?branch=baloo%2Fhmac-0.13.0-pre.5#5fcba783b95daf9a2dba4b938c77e2904a261750" dependencies = [ "pbkdf2", "salsa20", @@ -668,9 +697,9 @@ dependencies = [ [[package]] name = "sha1" -version = "0.11.0-pre.4" +version = "0.11.0-pre.5" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9540978cef7a8498211c1b1c14e5ce920fe5bd524ea84f4a3d72d4602515ae93" +checksum = "55f44e40722caefdd99383c25d3ae52a1094a1951215ae76f68837ece4e7f566" dependencies = [ "cfg-if", "cpufeatures", @@ -679,9 +708,9 @@ dependencies = [ [[package]] name = "sha2" -version = "0.11.0-pre.4" +version = "0.11.0-pre.5" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "540c0893cce56cdbcfebcec191ec8e0f470dd1889b6e7a0b503e310a94a168f5" +checksum = "19b4241d1a56954dce82cecda5c8e9c794eef6f53abe5e5216bac0a0ea71ffa7" dependencies = [ "cfg-if", "cpufeatures", @@ -690,9 +719,9 @@ dependencies = [ [[package]] name = "sha3" -version = "0.11.0-pre.4" +version = "0.11.0-pre.5" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e485881f388c2818d709796dc883c1ffcadde9d1f0e054f3a5c14974185261a6" +checksum = "f1bc997d7a5fa67cc1e352b2001124d28edb948b4e7a16567f9b3c1e51952524" dependencies = [ "digest", "keccak", @@ -700,12 +729,11 @@ dependencies = [ [[package]] name = "signature" -version = "2.3.0-pre.4" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "054d71959c7051b9042c26af337f05cc930575ed2604d7d3ced3158383e59734" +version = "2.3.0-pre.6" +source = "git+https://github.com/RustCrypto/traits.git#1548d2a7d7ce71a278a783d19d94b59b0103ab15" dependencies = [ "digest", - "rand_core", + "rand_core 0.9.3", ] [[package]] @@ -890,7 +918,16 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "1b9b4fd18abc82b8136838da5d50bae7bdea537c574d8dc1a34ed098d6c166f0" dependencies = [ "byteorder", - "zerocopy-derive", + "zerocopy-derive 0.7.35", +] + +[[package]] +name = "zerocopy" +version = "0.8.17" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "aa91407dacce3a68c56de03abe2760159582b846c6a4acd2f456618087f12713" +dependencies = [ + "zerocopy-derive 0.8.17", ] [[package]] @@ -904,6 +941,17 @@ dependencies = [ "syn", ] +[[package]] +name = "zerocopy-derive" +version = "0.8.17" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "06718a168365cad3d5ff0bb133aad346959a2074bd4a85c121255a11304a8626" +dependencies = [ + "proc-macro2", + "quote", + "syn", +] + [[package]] name = "zeroize" version = "1.8.1" diff --git a/Cargo.toml b/Cargo.toml index 009b4c60..2bf739a2 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -13,37 +13,36 @@ readme = "README.md" rust-version = "1.83" [dependencies] -rand_core = { version = "0.6.4", default-features = false } -const-oid = { version = "0.10.0-rc.3", default-features = false } +rand_core = { version = "0.9.0", default-features = false } +const-oid = { version = "0.10.0", default-features = false } subtle = { version = "2.6.1", default-features = false } -digest = { version = "=0.11.0-pre.9", default-features = false, features = ["alloc", "oid"] } +digest = { version = "=0.11.0-pre.10", default-features = false, features = ["alloc", "oid"] } pkcs1 = { version = "0.8.0-rc.1", default-features = false, features = ["alloc", "pkcs8"] } -pkcs8 = { version = "0.11.0-rc.1", default-features = false, features = ["alloc"] } -signature = { version = "=2.3.0-pre.4", default-features = false, features = ["alloc", "digest", "rand_core"] } +pkcs8 = { version = "0.11.0-rc.2", default-features = false, features = ["alloc"] } +signature = { version = "=2.3.0-pre.6", default-features = false, features = ["alloc", "digest", "rand_core"] } spki = { version = "0.8.0-rc.1", default-features = false, features = ["alloc"] } zeroize = { version = "1.5", features = ["alloc"] } -crypto-bigint = { version = "0.6.0", default-features = false, features = ["zeroize", "alloc"] } -crypto-primes = { version = "0.6.0", default-features = false } +crypto-bigint = { version = "0.7.0-pre", default-features = false, features = ["zeroize", "alloc"] } +crypto-primes = { version = "0.7.0-dev", default-features = false } # optional dependencies -sha1 = { version = "=0.11.0-pre.4", optional = true, default-features = false, features = ["oid"] } +sha1 = { version = "=0.11.0-pre.5", optional = true, default-features = false, features = ["oid"] } serdect = { version = "0.3.0", optional = true } -sha2 = { version = "=0.11.0-pre.4", optional = true, default-features = false, features = ["oid"] } +sha2 = { version = "=0.11.0-pre.5", optional = true, default-features = false, features = ["oid"] } serde = { version = "1.0.184", optional = true, default-features = false, features = ["derive"] } - [dev-dependencies] base64ct = { version = "1", features = ["alloc"] } hex-literal = "0.4.1" proptest = "1" serde_test = "1.0.89" -rand_xorshift = "0.3" -rand_chacha = "0.3" -rand = "0.8" -rand_core = { version = "0.6", default-features = false } -sha1 = { version = "=0.11.0-pre.4", default-features = false, features = ["oid"] } -sha2 = { version = "=0.11.0-pre.4", default-features = false, features = ["oid"] } -sha3 = { version = "=0.11.0-pre.4", default-features = false, features = ["oid"] } +rand_xorshift = "0.4" +rand_chacha = "0.9" +rand = "0.9" +rand_core = { version = "0.9.1", default-features = false } +sha1 = { version = "=0.11.0-pre.5", default-features = false, features = ["oid"] } +sha2 = { version = "=0.11.0-pre.5", default-features = false, features = ["oid"] } +sha3 = { version = "=0.11.0-pre.5", default-features = false, features = ["oid"] } hex = { version = "0.4.3", features = ["serde"] } serde_json = "1.0.138" serde = { version = "1.0.184", features = ["derive"] } @@ -54,7 +53,7 @@ name = "key" [features] default = ["std", "pem"] hazmat = [] -getrandom = ["rand_core/getrandom", "crypto-bigint/rand_core"] +getrandom = ["rand_core/os_rng", "crypto-bigint/rand_core"] serde = ["dep:serde", "dep:serdect", "crypto-bigint/serde"] pem = ["pkcs1/pem", "pkcs8/pem"] pkcs5 = ["pkcs8/encryption"] @@ -70,3 +69,23 @@ opt-level = 2 [profile.bench] debug = true + +[patch.crates-io] +# https://github.com/RustCrypto/crypto-bigint/pull/762 +# https://github.com/RustCrypto/crypto-bigint/pull/765 +crypto-bigint = { git = "https://github.com/RustCrypto/crypto-bigint.git" } + +# https://github.com/entropyxyz/crypto-primes/pull/74 +crypto-primes = { git = "https://github.com/entropyxyz/crypto-primes.git" } + +signature = { git = "https://github.com/RustCrypto/traits.git" } + +der = { git = "https://github.com/RustCrypto/formats.git" } +pkcs1 = { git = "https://github.com/RustCrypto/formats.git" } +pkcs5 = { git = "https://github.com/RustCrypto/formats.git" } +pkcs8 = { git = "https://github.com/RustCrypto/formats.git" } + +# https://github.com/RustCrypto/password-hashes/pull/577 +# https://github.com/RustCrypto/password-hashes/pull/578 +pbkdf2 = { git = "https://github.com/baloo/password-hashes.git", branch = "baloo/hmac-0.13.0-pre.5" } +scrypt = { git = "https://github.com/baloo/password-hashes.git", branch = "baloo/hmac-0.13.0-pre.5" } diff --git a/benches/key.rs b/benches/key.rs index f08df76f..ab4e4b4e 100644 --- a/benches/key.rs +++ b/benches/key.rs @@ -21,12 +21,46 @@ const DECRYPT_VAL: &str = "\ fn get_key() -> RsaPrivateKey { // 2048 bits - let n = hex!("7163c842b2190a8970942b2764aed42d4124647b6f30e09a2da1c0e256aa2ee24e790c40c96a4bd66d75c371a915e0703c476b4e1a06f1bd38c5a3c10ae3bd30f4ef62a5aa4f512ad145a06c48e96469a22ce8e621e052f0669a8c34155512d82e55447f0b7e18da94bd911ac7b3aabe706843668964593ee71b2e5e484bcf0c7834101ab5d61bba1e63e6237af40489ce36a260dab70add4fbec24d659db0f7cac099b0a3aa4549acde7fc858a793a975e6cf65ca276b743525f0883980f6ad069bec346d787797386d50fe0c9734be967c7d84ae5b8f349b094079457c0c0c6fee34c42a0b832603804f71e49f3320081637512c6cbf2bb81b6f6be239846d"); - let d = hex!("4b97dad7216607064b0d721a431f381e2b6d98524a2095bc1e6bd5ec39c6c9ec3450b2d5db9c328ef3a3d7a11b63eaf57d84f2341159f67e25d917d607427e20a34a41c3c6df8b71e0d9159d85f0ed9bc17345eec140374aef11b2cd638e0c901ee382ff5cfebb3c63290b672fcd1c7ef59ad799b0ed90d49a121ee98587df5cc161c584bc5887ae2a15e787e86ab1e803366150561e0b3b3ae28ebdcf32cd46dff317ed3e1b7590cc300d1d57c9288462d06d9fbe097e52b70dc4fca313ae09906e5fab0c24729b54fe35cc38fe1496419a902f35f08460952bd4783e0e930ba8b520f83eafe6fa6589bbab6e4f4bc5c285672c99f5055eec6a2a30b06e786b"); + let n = hex!( + "7163c842b2190a8970942b2764aed42d4124647b6f30e09a2da1c0e2" + "56aa2ee24e790c40c96a4bd66d75c371a915e0703c476b4e1a06f1bd" + "38c5a3c10ae3bd30f4ef62a5aa4f512ad145a06c48e96469a22ce8e6" + "21e052f0669a8c34155512d82e55447f0b7e18da94bd911ac7b3aabe" + "706843668964593ee71b2e5e484bcf0c7834101ab5d61bba1e63e623" + "7af40489ce36a260dab70add4fbec24d659db0f7cac099b0a3aa4549" + "acde7fc858a793a975e6cf65ca276b743525f0883980f6ad069bec34" + "6d787797386d50fe0c9734be967c7d84ae5b8f349b094079457c0c0c" + "6fee34c42a0b832603804f71e49f3320081637512c6cbf2bb81b6f6b" + "e239846d" + ); + let d = hex!( + "4b97dad7216607064b0d721a431f381e2b6d98524a2095bc1e6bd5ec" + "39c6c9ec3450b2d5db9c328ef3a3d7a11b63eaf57d84f2341159f67e" + "25d917d607427e20a34a41c3c6df8b71e0d9159d85f0ed9bc17345ee" + "c140374aef11b2cd638e0c901ee382ff5cfebb3c63290b672fcd1c7e" + "f59ad799b0ed90d49a121ee98587df5cc161c584bc5887ae2a15e787" + "e86ab1e803366150561e0b3b3ae28ebdcf32cd46dff317ed3e1b7590" + "cc300d1d57c9288462d06d9fbe097e52b70dc4fca313ae09906e5fab" + "0c24729b54fe35cc38fe1496419a902f35f08460952bd4783e0e930b" + "a8b520f83eafe6fa6589bbab6e4f4bc5c285672c99f5055eec6a2a30" + "b06e786b" + ); let primes = [ - hex!("ba69948f830c296242da6bf9ae3fddb76a63dbf0761ed3f644bca96a2e1eb75fd1bbd9cd93c72330bcc2a97cfafd12ee27bfde0fb6ac152df2ec4ab12b11265b41bcb531e39f347fdf09e9562a6e5a7c020c6534df61c955dd772cc7b9d461fdeea2f3b83663302cfe5656c235d4ac94c81658ad179919cded8ab1be1e9aa369"), - hex!("9bb7d344184526d29c689eddf0141bf65f013477e36b260e32ae42c680b2c5ada9181bff32b9f1bfbdd3c29f59fcc3f4b9ee4ce6766d18ca2fa4fe5c19d24b436c39a781f7a2972e59e616f58cabbb6132084008fe10ff4dddd054fd2e91cd7d043b8f9795a078816cdb5f2e895394e29c37c3e12de41d4f67f17e64baf92c65"), + hex!( + "ba69948f830c296242da6bf9ae3fddb76a63dbf0761ed3f644bc" + "a96a2e1eb75fd1bbd9cd93c72330bcc2a97cfafd12ee27bfde0f" + "b6ac152df2ec4ab12b11265b41bcb531e39f347fdf09e9562a6e" + "5a7c020c6534df61c955dd772cc7b9d461fdeea2f3b83663302c" + "fe5656c235d4ac94c81658ad179919cded8ab1be1e9aa369" + ), + hex!( + "9bb7d344184526d29c689eddf0141bf65f013477e36b260e32ae" + "42c680b2c5ada9181bff32b9f1bfbdd3c29f59fcc3f4b9ee4ce6" + "766d18ca2fa4fe5c19d24b436c39a781f7a2972e59e616f58cab" + "bb6132084008fe10ff4dddd054fd2e91cd7d043b8f9795a07881" + "6cdb5f2e895394e29c37c3e12de41d4f67f17e64baf92c65" + ), ]; RsaPrivateKey::from_components( diff --git a/src/algorithms/generate.rs b/src/algorithms/generate.rs index cc2d2935..b17c5f57 100644 --- a/src/algorithms/generate.rs +++ b/src/algorithms/generate.rs @@ -4,9 +4,9 @@ use alloc::vec::Vec; use crypto_bigint::{BoxedUint, Odd}; use crypto_primes::{ hazmat::{SetBits, SmallPrimesSieveFactory}, - is_prime_with_rng, sieve_and_find, + is_prime, sieve_and_find, }; -use rand_core::CryptoRngCore; +use rand_core::CryptoRng; use crate::{ algorithms::rsa::{compute_modulus, compute_private_exponent_euler_totient}, @@ -31,7 +31,7 @@ pub struct RsaPrivateKeyComponents { /// /// [1]: https://patents.google.com/patent/US4405829A/en /// [2]: http://www.cacr.math.uwaterloo.ca/techreports/2006/cacr2006-16.pdf -pub(crate) fn generate_multi_prime_key_with_exp( +pub(crate) fn generate_multi_prime_key_with_exp( rng: &mut R, nprimes: usize, bit_size: usize, @@ -120,11 +120,11 @@ pub(crate) fn generate_multi_prime_key_with_exp( }) } -fn generate_prime_with_rng(rng: &mut R, bit_length: u32) -> BoxedUint { +fn generate_prime_with_rng(rng: &mut R, bit_length: u32) -> BoxedUint { sieve_and_find( rng, SmallPrimesSieveFactory::new(bit_length, SetBits::TwoMsb), - is_prime_with_rng, + |_rng, candidate| is_prime(candidate), ) .expect("will produce a result eventually") } diff --git a/src/algorithms/oaep.rs b/src/algorithms/oaep.rs index b2a5102d..da069bba 100644 --- a/src/algorithms/oaep.rs +++ b/src/algorithms/oaep.rs @@ -4,7 +4,7 @@ use alloc::boxed::Box; use alloc::vec::Vec; use digest::{Digest, DynDigest, FixedOutputReset}; -use rand_core::CryptoRngCore; +use rand_core::TryCryptoRng; use subtle::{Choice, ConditionallySelectable, ConstantTimeEq, CtOption}; use zeroize::Zeroizing; @@ -19,7 +19,7 @@ use crate::errors::{Error, Result}; const MAX_LABEL_LEN: u64 = 1 << 61; #[inline] -fn encrypt_internal( +fn encrypt_internal( rng: &mut R, msg: &[u8], p_hash: &[u8], @@ -35,7 +35,7 @@ fn encrypt_internal let (_, payload) = em.split_at_mut(1); let (seed, db) = payload.split_at_mut(h_size); - rng.fill_bytes(seed); + rng.try_fill_bytes(seed).map_err(|_| Error::Rng)?; // Data block DB = pHash || PS || 01 || M let db_len = k - h_size - 1; @@ -57,7 +57,7 @@ fn encrypt_internal /// /// [PKCS#1 OAEP]: https://datatracker.ietf.org/doc/html/rfc8017#section-7.1 #[inline] -pub(crate) fn oaep_encrypt( +pub(crate) fn oaep_encrypt( rng: &mut R, msg: &[u8], digest: &mut dyn DynDigest, @@ -90,7 +90,7 @@ pub(crate) fn oaep_encrypt( /// [PKCS#1 OAEP]: https://datatracker.ietf.org/doc/html/rfc8017#section-7.1 #[inline] pub(crate) fn oaep_encrypt_digest< - R: CryptoRngCore + ?Sized, + R: TryCryptoRng + ?Sized, D: Digest, MGD: Digest + FixedOutputReset, >( diff --git a/src/algorithms/pkcs1v15.rs b/src/algorithms/pkcs1v15.rs index e813de11..77d6001a 100644 --- a/src/algorithms/pkcs1v15.rs +++ b/src/algorithms/pkcs1v15.rs @@ -9,7 +9,7 @@ use alloc::vec::Vec; use digest::Digest; use pkcs8::AssociatedOid; -use rand_core::CryptoRngCore; +use rand_core::TryCryptoRng; use subtle::{Choice, ConditionallySelectable, ConstantTimeEq}; use zeroize::Zeroizing; @@ -18,17 +18,22 @@ use crate::errors::{Error, Result}; /// Fills the provided slice with random values, which are guaranteed /// to not be zero. #[inline] -fn non_zero_random_bytes(rng: &mut R, data: &mut [u8]) { - rng.fill_bytes(data); +fn non_zero_random_bytes( + rng: &mut R, + data: &mut [u8], +) -> core::result::Result<(), R::Error> { + rng.try_fill_bytes(data)?; for el in data { if *el == 0u8 { // TODO: break after a certain amount of time while *el == 0u8 { - rng.fill_bytes(core::slice::from_mut(el)); + rng.try_fill_bytes(core::slice::from_mut(el))?; } } } + + Ok(()) } /// Applied the padding scheme from PKCS#1 v1.5 for encryption. The message must be no longer than @@ -39,7 +44,7 @@ pub(crate) fn pkcs1v15_encrypt_pad( k: usize, ) -> Result>> where - R: CryptoRngCore + ?Sized, + R: TryCryptoRng + ?Sized, { if msg.len() + 11 > k { return Err(Error::MessageTooLong); @@ -48,7 +53,7 @@ where // EM = 0x00 || 0x02 || PS || 0x00 || M let mut em = Zeroizing::new(vec![0u8; k]); em[1] = 2; - non_zero_random_bytes(rng, &mut em[2..k - msg.len() - 1]); + non_zero_random_bytes(rng, &mut em[2..k - msg.len() - 1]).map_err(|_: R::Error| Error::Rng)?; em[k - msg.len() - 1] = 0; em[k - msg.len()..].copy_from_slice(msg); Ok(em) @@ -189,7 +194,7 @@ mod tests { for _ in 0..10 { let mut rng = ChaCha8Rng::from_seed([42; 32]); let mut b = vec![0u8; 512]; - non_zero_random_bytes(&mut rng, &mut b); + non_zero_random_bytes(&mut rng, &mut b).unwrap(); for el in &b { assert_ne!(*el, 0u8); } diff --git a/src/algorithms/rsa.rs b/src/algorithms/rsa.rs index 1dca90c1..5bea4db2 100644 --- a/src/algorithms/rsa.rs +++ b/src/algorithms/rsa.rs @@ -4,7 +4,7 @@ use core::cmp::Ordering; use crypto_bigint::modular::{BoxedMontyForm, BoxedMontyParams}; use crypto_bigint::{BoxedUint, Gcd, NonZero, Odd, RandomMod, Wrapping}; -use rand_core::CryptoRngCore; +use rand_core::TryCryptoRng; use zeroize::Zeroize; use crate::errors::{Error, Result}; @@ -31,8 +31,8 @@ pub fn rsa_encrypt(key: &K, m: &BoxedUint) -> Result( - mut rng: Option<&mut R>, +pub fn rsa_decrypt( + rng: Option<&mut R>, priv_key: &impl PrivateKeyParts, c: &BoxedUint, ) -> Result { @@ -48,8 +48,8 @@ pub fn rsa_decrypt( let n_params = priv_key.n_params(); let bits = d.bits_precision(); - let c = if let Some(ref mut rng) = rng { - let (blinded, unblinder) = blind(rng, priv_key, c, n_params); + let c = if let Some(rng) = rng { + let (blinded, unblinder) = blind(rng, priv_key, c, n_params)?; ir = Some(unblinder); blinded.widen(bits) } else { @@ -123,7 +123,7 @@ pub fn rsa_decrypt( /// Use this function with great care! Raw RSA should never be used without an appropriate padding /// or signature scheme. See the [module-level documentation][crate::hazmat] for more information. #[inline] -pub fn rsa_decrypt_and_check( +pub fn rsa_decrypt_and_check( priv_key: &impl PrivateKeyParts, rng: Option<&mut R>, c: &BoxedUint, @@ -142,12 +142,12 @@ pub fn rsa_decrypt_and_check( } /// Returns the blinded c, along with the unblinding factor. -fn blind( +fn blind( rng: &mut R, key: &K, c: &BoxedUint, n_params: &BoxedMontyParams, -) -> (BoxedUint, BoxedUint) { +) -> Result<(BoxedUint, BoxedUint)> { // Blinding involves multiplying c by r^e. // Then the decryption operation performs (m^e * r^e)^d mod n // which equals mr mod n. The factor of r can then be removed @@ -158,7 +158,7 @@ fn blind( let mut r: BoxedUint = BoxedUint::one_with_precision(bits); let mut ir: Option = None; while ir.is_none() { - r = BoxedUint::random_mod(rng, key.n()); + r = BoxedUint::try_random_mod(rng, key.n()).map_err(|_| Error::Rng)?; if r.is_zero().into() { r = BoxedUint::one_with_precision(bits); } @@ -181,7 +181,7 @@ fn blind( debug_assert_eq!(blinded.bits_precision(), bits); debug_assert_eq!(ir.bits_precision(), bits); - (blinded, ir) + Ok((blinded, ir)) } /// Given an m and and unblinding factor, unblind the m. diff --git a/src/dummy_rng.rs b/src/dummy_rng.rs index 87beaa94..8d8a703c 100644 --- a/src/dummy_rng.rs +++ b/src/dummy_rng.rs @@ -17,10 +17,6 @@ impl RngCore for DummyRng { fn fill_bytes(&mut self, _: &mut [u8]) { unimplemented!(); } - - fn try_fill_bytes(&mut self, _: &mut [u8]) -> core::result::Result<(), rand_core::Error> { - unimplemented!(); - } } impl CryptoRng for DummyRng {} diff --git a/src/errors.rs b/src/errors.rs index 50ea15ed..d90c48eb 100644 --- a/src/errors.rs +++ b/src/errors.rs @@ -69,6 +69,9 @@ pub enum Error { /// Decoding error. Decode(crypto_bigint::DecodeError), + + /// Random number generator error. + Rng, } #[cfg(feature = "std")] @@ -99,6 +102,7 @@ impl core::fmt::Display for Error { Error::InvalidPadLen => write!(f, "invalid padding length"), Error::InvalidArguments => write!(f, "invalid arguments"), Error::Decode(err) => write!(f, "{:?}", err), + Error::Rng => write!(f, "rng error"), } } } diff --git a/src/key.rs b/src/key.rs index 790fe4a5..641b9a08 100644 --- a/src/key.rs +++ b/src/key.rs @@ -2,7 +2,7 @@ use alloc::vec::Vec; use core::hash::{Hash, Hasher}; use crypto_bigint::modular::{BoxedMontyForm, BoxedMontyParams}; use crypto_bigint::{BoxedUint, Integer, NonZero, Odd}; -use rand_core::CryptoRngCore; +use rand_core::CryptoRng; use zeroize::{Zeroize, ZeroizeOnDrop}; #[cfg(feature = "serde")] use { @@ -169,7 +169,7 @@ impl PublicKeyParts for RsaPublicKey { impl RsaPublicKey { /// Encrypt the given message. - pub fn encrypt( + pub fn encrypt( &self, rng: &mut R, padding: P, @@ -254,7 +254,7 @@ impl RsaPrivateKey { const EXP: u64 = 65537; /// Generate a new Rsa key pair of the given bit size using the passed in `rng`. - pub fn new(rng: &mut R, bit_size: usize) -> Result { + pub fn new(rng: &mut R, bit_size: usize) -> Result { Self::new_with_exp(rng, bit_size, BoxedUint::from(Self::EXP)) } @@ -262,7 +262,7 @@ impl RsaPrivateKey { /// using the passed in `rng`. /// /// Unless you have specific needs, you should use `RsaPrivateKey::new` instead. - pub fn new_with_exp( + pub fn new_with_exp( rng: &mut R, bit_size: usize, exp: BoxedUint, @@ -493,7 +493,7 @@ impl RsaPrivateKey { /// Decrypt the given message. /// /// Uses `rng` to blind the decryption process. - pub fn decrypt_blinded( + pub fn decrypt_blinded( &self, rng: &mut R, padding: P, @@ -517,7 +517,7 @@ impl RsaPrivateKey { /// [`Pss::new`][`crate::Pss::new`] for a standard RSASSA-PSS signature, or /// [`Pss::new_blinded`][`crate::Pss::new_blinded`] for RSA-BSSA blind /// signatures. - pub fn sign_with_rng( + pub fn sign_with_rng( &self, rng: &mut R, padding: S, @@ -770,13 +770,15 @@ mod tests { let mut rng = ChaCha8Rng::from_seed([42; 32]); let priv_key = RsaPrivateKey::new(&mut rng, 64).expect("failed to generate key"); - let priv_tokens = [Token::Str( - "3054020100300d06092a864886f70d01010105000440303e020100020900c9269f2f225eb38d020301000102086ecdc49f528812a1020500d2aaa725020500f46fc249020500887e253902046b4851e1020423806864", - )]; + let priv_tokens = [Token::Str(concat!( + "3054020100300d06092a864886f70d01010105000440303e020100020900a", + "ecdb5fae1b092570203010001020869bf9ae9d6712899020500d2aaa72502", + "0500d46b68cb020500887e253902047b4e3a4f02040991164c" + ))]; assert_tokens(&priv_key.clone().readable(), &priv_tokens); let priv_tokens = [Token::Str( - "3024300d06092a864886f70d01010105000313003010020900c9269f2f225eb38d0203010001", + "3024300d06092a864886f70d01010105000313003010020900aecdb5fae1b092570203010001", )]; assert_tokens( &RsaPublicKey::from(priv_key.clone()).readable(), diff --git a/src/oaep.rs b/src/oaep.rs index 13ac8d7b..3d8906e6 100644 --- a/src/oaep.rs +++ b/src/oaep.rs @@ -15,7 +15,7 @@ use core::fmt; use crypto_bigint::BoxedUint; use digest::{Digest, DynDigest, FixedOutputReset}; -use rand_core::CryptoRngCore; +use rand_core::TryCryptoRng; use crate::algorithms::oaep::*; use crate::algorithms::pad::{uint_to_be_pad, uint_to_zeroizing_be_pad}; @@ -135,7 +135,7 @@ impl Oaep { } impl PaddingScheme for Oaep { - fn decrypt( + fn decrypt( mut self, rng: Option<&mut Rng>, priv_key: &RsaPrivateKey, @@ -151,7 +151,7 @@ impl PaddingScheme for Oaep { ) } - fn encrypt( + fn encrypt( mut self, rng: &mut Rng, pub_key: &RsaPublicKey, @@ -186,7 +186,7 @@ impl fmt::Debug for Oaep { /// /// [PKCS#1 OAEP]: https://datatracker.ietf.org/doc/html/rfc8017#section-7.1 #[inline] -fn encrypt( +fn encrypt( rng: &mut R, pub_key: &RsaPublicKey, msg: &[u8], @@ -209,7 +209,7 @@ fn encrypt( /// `2 + (2 * hash.size())`. /// /// [PKCS#1 OAEP]: https://datatracker.ietf.org/doc/html/rfc8017#section-7.1 -fn encrypt_digest( +fn encrypt_digest( rng: &mut R, pub_key: &RsaPublicKey, msg: &[u8], @@ -236,7 +236,7 @@ fn encrypt_digest( +fn decrypt( rng: Option<&mut R>, priv_key: &RsaPrivateKey, ciphertext: &[u8], @@ -269,7 +269,7 @@ fn decrypt( /// /// [PKCS#1 OAEP]: https://datatracker.ietf.org/doc/html/rfc8017#section-7.1 #[inline] -fn decrypt_digest( +fn decrypt_digest( rng: Option<&mut R>, priv_key: &RsaPrivateKey, ciphertext: &[u8], diff --git a/src/oaep/decrypting_key.rs b/src/oaep/decrypting_key.rs index 459ff424..4009734b 100644 --- a/src/oaep/decrypting_key.rs +++ b/src/oaep/decrypting_key.rs @@ -7,7 +7,7 @@ use crate::{ use alloc::{boxed::Box, vec::Vec}; use core::marker::PhantomData; use digest::{Digest, FixedOutputReset}; -use rand_core::CryptoRngCore; +use rand_core::CryptoRng; #[cfg(feature = "serde")] use serde::{Deserialize, Serialize}; use zeroize::ZeroizeOnDrop; @@ -69,7 +69,7 @@ where D: Digest, MGD: Digest + FixedOutputReset, { - fn decrypt_with_rng( + fn decrypt_with_rng( &self, rng: &mut R, ciphertext: &[u8], @@ -111,15 +111,26 @@ mod tests { ); let tokens = [ - Token::Struct { name: "DecryptingKey", len: 4 }, + Token::Struct { + name: "DecryptingKey", + len: 4, + }, Token::Str("inner"), - Token::Str("3054020100300d06092a864886f70d01010105000440303e020100020900c9269f2f225eb38d020301000102086ecdc49f528812a1020500d2aaa725020500f46fc249020500887e253902046b4851e1020423806864"), + Token::Str(concat!( + "3054020100300d06092a864886f70d01010105000440303e020100020900ae", + "cdb5fae1b092570203010001020869bf9ae9d6712899020500d2aaa7250205", + "00d46b68cb020500887e253902047b4e3a4f02040991164c", + )), Token::Str("label"), Token::None, Token::Str("phantom"), - Token::UnitStruct { name: "PhantomData", }, + Token::UnitStruct { + name: "PhantomData", + }, Token::Str("mg_phantom"), - Token::UnitStruct { name: "PhantomData", }, + Token::UnitStruct { + name: "PhantomData", + }, Token::StructEnd, ]; assert_tokens(&decrypting_key.readable(), &tokens); diff --git a/src/oaep/encrypting_key.rs b/src/oaep/encrypting_key.rs index 717d0acf..4a0cbd71 100644 --- a/src/oaep/encrypting_key.rs +++ b/src/oaep/encrypting_key.rs @@ -3,7 +3,7 @@ use crate::{traits::RandomizedEncryptor, Result, RsaPublicKey}; use alloc::{boxed::Box, vec::Vec}; use core::marker::PhantomData; use digest::{Digest, FixedOutputReset}; -use rand_core::CryptoRngCore; +use rand_core::CryptoRng; #[cfg(feature = "serde")] use serde::{Deserialize, Serialize}; @@ -54,11 +54,7 @@ where D: Digest, MGD: Digest + FixedOutputReset, { - fn encrypt_with_rng( - &self, - rng: &mut R, - msg: &[u8], - ) -> Result> { + fn encrypt_with_rng(&self, rng: &mut R, msg: &[u8]) -> Result> { encrypt_digest::<_, D, MGD>(rng, &self.inner, msg, self.label.clone()) } } @@ -94,7 +90,7 @@ mod tests { }, Token::Str("inner"), Token::Str( - "3024300d06092a864886f70d01010105000313003010020900c9269f2f225eb38d0203010001", + "3024300d06092a864886f70d01010105000313003010020900aecdb5fae1b092570203010001", ), Token::Str("label"), Token::None, diff --git a/src/pkcs1v15.rs b/src/pkcs1v15.rs index 638ff895..35751e3b 100644 --- a/src/pkcs1v15.rs +++ b/src/pkcs1v15.rs @@ -22,7 +22,7 @@ use core::fmt::Debug; use crypto_bigint::BoxedUint; use digest::Digest; use pkcs8::AssociatedOid; -use rand_core::CryptoRngCore; +use rand_core::TryCryptoRng; use crate::algorithms::pad::{uint_to_be_pad, uint_to_zeroizing_be_pad}; use crate::algorithms::pkcs1v15::*; @@ -36,7 +36,7 @@ use crate::traits::{PaddingScheme, PublicKeyParts, SignatureScheme}; pub struct Pkcs1v15Encrypt; impl PaddingScheme for Pkcs1v15Encrypt { - fn decrypt( + fn decrypt( self, rng: Option<&mut Rng>, priv_key: &RsaPrivateKey, @@ -45,7 +45,7 @@ impl PaddingScheme for Pkcs1v15Encrypt { decrypt(rng, priv_key, ciphertext) } - fn encrypt( + fn encrypt( self, rng: &mut Rng, pub_key: &RsaPublicKey, @@ -100,7 +100,7 @@ impl Pkcs1v15Sign { } impl SignatureScheme for Pkcs1v15Sign { - fn sign( + fn sign( self, rng: Option<&mut Rng>, priv_key: &RsaPrivateKey, @@ -135,7 +135,7 @@ impl SignatureScheme for Pkcs1v15Sign { /// scheme from PKCS#1 v1.5. The message must be no longer than the /// length of the public modulus minus 11 bytes. #[inline] -fn encrypt( +fn encrypt( rng: &mut R, pub_key: &RsaPublicKey, msg: &[u8], @@ -157,7 +157,7 @@ fn encrypt( /// forge signatures as if they had the private key. See /// `decrypt_session_key` for a way of solving this problem. #[inline] -fn decrypt( +fn decrypt( rng: Option<&mut R>, priv_key: &RsaPrivateKey, ciphertext: &[u8], @@ -185,7 +185,7 @@ fn decrypt( /// messages to signatures and identify the signed messages. As ever, /// signatures provide authenticity, not confidentiality. #[inline] -fn sign( +fn sign( rng: Option<&mut R>, priv_key: &RsaPrivateKey, prefix: &[u8], @@ -303,19 +303,24 @@ mod tests { fn test_decrypt_pkcs1v15() { let priv_key = get_private_key(); - let tests = [[ - "gIcUIoVkD6ATMBk/u/nlCZCCWRKdkfjCgFdo35VpRXLduiKXhNz1XupLLzTXAybEq15juc+EgY5o0DHv/nt3yg==", - "x", - ], [ - "Y7TOCSqofGhkRb+jaVRLzK8xw2cSo1IVES19utzv6hwvx+M8kFsoWQm5DzBeJCZTCVDPkTpavUuEbgp8hnUGDw==", - "testing.", - ], [ - "arReP9DJtEVyV2Dg3dDp4c/PSk1O6lxkoJ8HcFupoRorBZG+7+1fDAwT1olNddFnQMjmkb8vxwmNMoTAT/BFjQ==", - "testing.\n", - ], [ - "WtaBXIoGC54+vH0NH0CHHE+dRDOsMc/6BrfFu2lEqcKL9+uDuWaf+Xj9mrbQCjjZcpQuX733zyok/jsnqe/Ftw==", - "01234567890123456789012345678901234567890123456789012", - ]]; + let tests = [ + [ + "gIcUIoVkD6ATMBk/u/nlCZCCWRKdkfjCgFdo35VpRXLduiKXhNz1XupLLzTXAybEq15juc+EgY5o0DHv/nt3yg==", + "x", + ], + [ + "Y7TOCSqofGhkRb+jaVRLzK8xw2cSo1IVES19utzv6hwvx+M8kFsoWQm5DzBeJCZTCVDPkTpavUuEbgp8hnUGDw==", + "testing.", + ], + [ + "arReP9DJtEVyV2Dg3dDp4c/PSk1O6lxkoJ8HcFupoRorBZG+7+1fDAwT1olNddFnQMjmkb8vxwmNMoTAT/BFjQ==", + "testing.\n", + ], + [ + "WtaBXIoGC54+vH0NH0CHHE+dRDOsMc/6BrfFu2lEqcKL9+uDuWaf+Xj9mrbQCjjZcpQuX733zyok/jsnqe/Ftw==", + "01234567890123456789012345678901234567890123456789012", + ], + ]; for test in &tests { let out = priv_key @@ -354,19 +359,24 @@ mod tests { let priv_key = get_private_key(); let decrypting_key = DecryptingKey::new(priv_key); - let tests = [[ - "gIcUIoVkD6ATMBk/u/nlCZCCWRKdkfjCgFdo35VpRXLduiKXhNz1XupLLzTXAybEq15juc+EgY5o0DHv/nt3yg==", - "x", - ], [ - "Y7TOCSqofGhkRb+jaVRLzK8xw2cSo1IVES19utzv6hwvx+M8kFsoWQm5DzBeJCZTCVDPkTpavUuEbgp8hnUGDw==", - "testing.", - ], [ - "arReP9DJtEVyV2Dg3dDp4c/PSk1O6lxkoJ8HcFupoRorBZG+7+1fDAwT1olNddFnQMjmkb8vxwmNMoTAT/BFjQ==", - "testing.\n", - ], [ - "WtaBXIoGC54+vH0NH0CHHE+dRDOsMc/6BrfFu2lEqcKL9+uDuWaf+Xj9mrbQCjjZcpQuX733zyok/jsnqe/Ftw==", - "01234567890123456789012345678901234567890123456789012", - ]]; + let tests = [ + [ + "gIcUIoVkD6ATMBk/u/nlCZCCWRKdkfjCgFdo35VpRXLduiKXhNz1XupLLzTXAybEq15juc+EgY5o0DHv/nt3yg==", + "x", + ], + [ + "Y7TOCSqofGhkRb+jaVRLzK8xw2cSo1IVES19utzv6hwvx+M8kFsoWQm5DzBeJCZTCVDPkTpavUuEbgp8hnUGDw==", + "testing.", + ], + [ + "arReP9DJtEVyV2Dg3dDp4c/PSk1O6lxkoJ8HcFupoRorBZG+7+1fDAwT1olNddFnQMjmkb8vxwmNMoTAT/BFjQ==", + "testing.\n", + ], + [ + "WtaBXIoGC54+vH0NH0CHHE+dRDOsMc/6BrfFu2lEqcKL9+uDuWaf+Xj9mrbQCjjZcpQuX733zyok/jsnqe/Ftw==", + "01234567890123456789012345678901234567890123456789012", + ], + ]; for test in &tests { let out = decrypting_key diff --git a/src/pkcs1v15/decrypting_key.rs b/src/pkcs1v15/decrypting_key.rs index 02af68b5..c641f787 100644 --- a/src/pkcs1v15/decrypting_key.rs +++ b/src/pkcs1v15/decrypting_key.rs @@ -5,7 +5,7 @@ use crate::{ Result, RsaPrivateKey, }; use alloc::vec::Vec; -use rand_core::CryptoRngCore; +use rand_core::CryptoRng; #[cfg(feature = "serde")] use serde::{Deserialize, Serialize}; use zeroize::ZeroizeOnDrop; @@ -33,7 +33,7 @@ impl Decryptor for DecryptingKey { } impl RandomizedDecryptor for DecryptingKey { - fn decrypt_with_rng( + fn decrypt_with_rng( &self, rng: &mut R, ciphertext: &[u8], @@ -67,9 +67,16 @@ mod tests { DecryptingKey::new(RsaPrivateKey::new(&mut rng, 64).expect("failed to generate key")); let tokens = [ - Token::Struct { name: "DecryptingKey", len: 1 }, + Token::Struct { + name: "DecryptingKey", + len: 1, + }, Token::Str("inner"), - Token::Str("3054020100300d06092a864886f70d01010105000440303e020100020900c9269f2f225eb38d020301000102086ecdc49f528812a1020500d2aaa725020500f46fc249020500887e253902046b4851e1020423806864"), + Token::Str(concat!( + "3054020100300d06092a864886f70d01010105000440303e020100020900ae", + "cdb5fae1b092570203010001020869bf9ae9d6712899020500d2aaa7250205", + "00d46b68cb020500887e253902047b4e3a4f02040991164c" + )), Token::StructEnd, ]; assert_tokens(&decrypting_key.readable(), &tokens); diff --git a/src/pkcs1v15/encrypting_key.rs b/src/pkcs1v15/encrypting_key.rs index 3738a78a..aaefbafb 100644 --- a/src/pkcs1v15/encrypting_key.rs +++ b/src/pkcs1v15/encrypting_key.rs @@ -1,7 +1,7 @@ use super::encrypt; use crate::{traits::RandomizedEncryptor, Result, RsaPublicKey}; use alloc::vec::Vec; -use rand_core::CryptoRngCore; +use rand_core::CryptoRng; #[cfg(feature = "serde")] use serde::{Deserialize, Serialize}; @@ -22,11 +22,7 @@ impl EncryptingKey { } impl RandomizedEncryptor for EncryptingKey { - fn encrypt_with_rng( - &self, - rng: &mut R, - msg: &[u8], - ) -> Result> { + fn encrypt_with_rng(&self, rng: &mut R, msg: &[u8]) -> Result> { encrypt(rng, &self.inner, msg) } } @@ -51,7 +47,7 @@ mod tests { }, Token::Str("inner"), Token::Str( - "3024300d06092a864886f70d01010105000313003010020900c9269f2f225eb38d0203010001", + "3024300d06092a864886f70d01010105000313003010020900aecdb5fae1b092570203010001", ), Token::StructEnd, ]; diff --git a/src/pkcs1v15/signing_key.rs b/src/pkcs1v15/signing_key.rs index 29c4e8a8..a354acc4 100644 --- a/src/pkcs1v15/signing_key.rs +++ b/src/pkcs1v15/signing_key.rs @@ -10,7 +10,7 @@ use pkcs8::{ }, AssociatedOid, EncodePrivateKey, SecretDocument, }; -use rand_core::CryptoRngCore; +use rand_core::{CryptoRng, TryCryptoRng}; #[cfg(feature = "serde")] use { pkcs8::DecodePrivateKey, @@ -49,7 +49,7 @@ where } /// Generate a new signing key with a prefix for the digest `D`. - pub fn random(rng: &mut R, bit_size: usize) -> Result { + pub fn random(rng: &mut R, bit_size: usize) -> Result { Ok(Self { inner: RsaPrivateKey::new(rng, bit_size)?, prefix: pkcs1v15_generate_prefix::(), @@ -65,7 +65,7 @@ where /// Generate a new signing key with a prefix for the digest `D`. #[deprecated(since = "0.9.0", note = "use SigningKey::random instead")] - pub fn random_with_prefix(rng: &mut R, bit_size: usize) -> Result { + pub fn random_with_prefix(rng: &mut R, bit_size: usize) -> Result { Self::random(rng, bit_size) } } @@ -88,7 +88,7 @@ where } /// Generate a new signing key with an empty prefix. - pub fn random_unprefixed(rng: &mut R, bit_size: usize) -> Result { + pub fn random_unprefixed(rng: &mut R, bit_size: usize) -> Result { Ok(Self { inner: RsaPrivateKey::new(rng, bit_size)?, prefix: Vec::new(), @@ -127,9 +127,9 @@ impl RandomizedDigestSigner for SigningKey where D: Digest, { - fn try_sign_digest_with_rng( + fn try_sign_digest_with_rng( &self, - rng: &mut impl CryptoRngCore, + rng: &mut R, digest: D, ) -> signature::Result { sign(Some(rng), &self.inner, &self.prefix, &digest.finalize())? @@ -142,9 +142,9 @@ impl RandomizedSigner for SigningKey where D: Digest, { - fn try_sign_with_rng( + fn try_sign_with_rng( &self, - rng: &mut impl CryptoRngCore, + rng: &mut R, msg: &[u8], ) -> signature::Result { sign(Some(rng), &self.inner, &self.prefix, &D::digest(msg))? @@ -308,9 +308,11 @@ mod tests { let priv_key = crate::RsaPrivateKey::new(&mut rng, 64).expect("failed to generate key"); let signing_key = SigningKey::::new(priv_key); - let tokens = [ - Token::Str("3054020100300d06092a864886f70d01010105000440303e020100020900c9269f2f225eb38d020301000102086ecdc49f528812a1020500d2aaa725020500f46fc249020500887e253902046b4851e1020423806864") - ]; + let tokens = [Token::Str(concat!( + "3054020100300d06092a864886f70d01010105000440303e020100020900aecdb5", + "fae1b092570203010001020869bf9ae9d6712899020500d2aaa725020500d46b68", + "cb020500887e253902047b4e3a4f02040991164c" + ))]; assert_tokens(&signing_key.readable(), &tokens); } diff --git a/src/pkcs1v15/verifying_key.rs b/src/pkcs1v15/verifying_key.rs index 5c860b25..ed58fa6e 100644 --- a/src/pkcs1v15/verifying_key.rs +++ b/src/pkcs1v15/verifying_key.rs @@ -256,7 +256,7 @@ mod tests { let verifying_key = VerifyingKey::::new(pub_key); let tokens = [Token::Str( - "3024300d06092a864886f70d01010105000313003010020900c9269f2f225eb38d0203010001", + "3024300d06092a864886f70d01010105000313003010020900aecdb5fae1b092570203010001", )]; assert_tokens(&verifying_key.readable(), &tokens); diff --git a/src/pss.rs b/src/pss.rs index 22351a6c..d1843cab 100644 --- a/src/pss.rs +++ b/src/pss.rs @@ -27,7 +27,7 @@ use const_oid::AssociatedOid; use digest::{Digest, DynDigest, FixedOutputReset}; use pkcs1::RsaPssParams; use pkcs8::spki::{der::Any, AlgorithmIdentifierOwned}; -use rand_core::CryptoRngCore; +use rand_core::TryCryptoRng; use crate::algorithms::pad::{uint_to_be_pad, uint_to_zeroizing_be_pad}; use crate::algorithms::pss::*; @@ -86,7 +86,7 @@ impl Pss { } impl SignatureScheme for Pss { - fn sign( + fn sign( mut self, rng: Option<&mut Rng>, priv_key: &RsaPrivateKey, @@ -165,7 +165,7 @@ where /// Note that hashed must be the result of hashing the input message using the /// given hash function. The opts argument may be nil, in which case sensible /// defaults are used. -pub(crate) fn sign( +pub(crate) fn sign( rng: &mut T, blind: bool, priv_key: &RsaPrivateKey, @@ -174,12 +174,12 @@ pub(crate) fn sign( digest: &mut dyn DynDigest, ) -> Result> { let mut salt = vec![0; salt_len]; - rng.fill_bytes(&mut salt[..]); + rng.try_fill_bytes(&mut salt[..]).map_err(|_| Error::Rng)?; sign_pss_with_salt(blind.then_some(rng), priv_key, hashed, &salt, digest) } -pub(crate) fn sign_digest( +pub(crate) fn sign_digest( rng: &mut T, blind: bool, priv_key: &RsaPrivateKey, @@ -187,7 +187,7 @@ pub(crate) fn sign_digest Result> { let mut salt = vec![0; salt_len]; - rng.fill_bytes(&mut salt[..]); + rng.try_fill_bytes(&mut salt[..]).map_err(|_| Error::Rng)?; sign_pss_with_salt_digest::<_, D>(blind.then_some(rng), priv_key, hashed, &salt) } @@ -197,7 +197,7 @@ pub(crate) fn sign_digest( +fn sign_pss_with_salt( blind_rng: Option<&mut T>, priv_key: &RsaPrivateKey, hashed: &[u8], @@ -213,7 +213,7 @@ fn sign_pss_with_salt( uint_to_zeroizing_be_pad(raw, priv_key.size()) } -fn sign_pss_with_salt_digest( +fn sign_pss_with_salt_digest( blind_rng: Option<&mut T>, priv_key: &RsaPrivateKey, hashed: &[u8], diff --git a/src/pss/blinded_signing_key.rs b/src/pss/blinded_signing_key.rs index 97ca1bf6..bf498a61 100644 --- a/src/pss/blinded_signing_key.rs +++ b/src/pss/blinded_signing_key.rs @@ -10,7 +10,7 @@ use pkcs8::{ }, EncodePrivateKey, SecretDocument, }; -use rand_core::CryptoRngCore; +use rand_core::{CryptoRng, TryCryptoRng}; use signature::{ hazmat::RandomizedPrehashSigner, Keypair, RandomizedDigestSigner, RandomizedSigner, }; @@ -56,13 +56,13 @@ where /// Create a new random RSASSA-PSS signing key which produces "blinded" /// signatures. /// Digest output size is used as a salt length. - pub fn random(rng: &mut R, bit_size: usize) -> Result { + pub fn random(rng: &mut R, bit_size: usize) -> Result { Self::random_with_salt_len(rng, bit_size, ::output_size()) } /// Create a new random RSASSA-PSS signing key which produces "blinded" /// signatures with a salt of the given length. - pub fn random_with_salt_len( + pub fn random_with_salt_len( rng: &mut R, bit_size: usize, salt_len: usize, @@ -88,9 +88,9 @@ impl RandomizedSigner for BlindedSigningKey where D: Digest + FixedOutputReset, { - fn try_sign_with_rng( + fn try_sign_with_rng( &self, - rng: &mut impl CryptoRngCore, + rng: &mut R, msg: &[u8], ) -> signature::Result { sign_digest::<_, D>(rng, true, &self.inner, &D::digest(msg), self.salt_len)? @@ -103,9 +103,9 @@ impl RandomizedDigestSigner for BlindedSigningKey where D: Digest + FixedOutputReset, { - fn try_sign_digest_with_rng( + fn try_sign_digest_with_rng( &self, - rng: &mut impl CryptoRngCore, + rng: &mut R, digest: D, ) -> signature::Result { sign_digest::<_, D>(rng, true, &self.inner, &digest.finalize(), self.salt_len)? @@ -118,9 +118,9 @@ impl RandomizedPrehashSigner for BlindedSigningKey where D: Digest + FixedOutputReset, { - fn sign_prehash_with_rng( + fn sign_prehash_with_rng( &self, - rng: &mut impl CryptoRngCore, + rng: &mut R, prehash: &[u8], ) -> signature::Result { sign_digest::<_, D>(rng, true, &self.inner, prehash, self.salt_len)? @@ -266,9 +266,11 @@ mod tests { RsaPrivateKey::new(&mut rng, 64).expect("failed to generate key"), ); - let tokens = [ - Token::Str("3054020100300d06092a864886f70d01010105000440303e020100020900c9269f2f225eb38d020301000102086ecdc49f528812a1020500d2aaa725020500f46fc249020500887e253902046b4851e1020423806864") - ]; + let tokens = [Token::Str(concat!( + "3054020100300d06092a864886f70d01010105000440303e020100020900aecdb5", + "fae1b092570203010001020869bf9ae9d6712899020500d2aaa725020500d46b68", + "cb020500887e253902047b4e3a4f02040991164c", + ))]; assert_tokens(&signing_key.readable(), &tokens); } } diff --git a/src/pss/signing_key.rs b/src/pss/signing_key.rs index 875ef866..d90345d7 100644 --- a/src/pss/signing_key.rs +++ b/src/pss/signing_key.rs @@ -11,7 +11,7 @@ use pkcs8::{ }, EncodePrivateKey, SecretDocument, }; -use rand_core::CryptoRngCore; +use rand_core::{CryptoRng, TryCryptoRng}; use signature::{ hazmat::RandomizedPrehashSigner, Keypair, RandomizedDigestSigner, RandomizedSigner, }; @@ -63,12 +63,12 @@ where /// Generate a new random RSASSA-PSS signing key. /// Digest output size is used as a salt length. - pub fn random(rng: &mut R, bit_size: usize) -> Result { + pub fn random(rng: &mut R, bit_size: usize) -> Result { Self::random_with_salt_len(rng, bit_size, ::output_size()) } /// Generate a new random RSASSA-PSS signing key with a salt of the given length. - pub fn random_with_salt_len( + pub fn random_with_salt_len( rng: &mut R, bit_size: usize, salt_len: usize, @@ -94,9 +94,9 @@ impl RandomizedDigestSigner for SigningKey where D: Digest + FixedOutputReset, { - fn try_sign_digest_with_rng( + fn try_sign_digest_with_rng( &self, - rng: &mut impl CryptoRngCore, + rng: &mut R, digest: D, ) -> signature::Result { sign_digest::<_, D>(rng, false, &self.inner, &digest.finalize(), self.salt_len)? @@ -109,9 +109,9 @@ impl RandomizedSigner for SigningKey where D: Digest + FixedOutputReset, { - fn try_sign_with_rng( + fn try_sign_with_rng( &self, - rng: &mut impl CryptoRngCore, + rng: &mut R, msg: &[u8], ) -> signature::Result { self.try_sign_digest_with_rng(rng, D::new_with_prefix(msg)) @@ -122,9 +122,9 @@ impl RandomizedPrehashSigner for SigningKey where D: Digest + FixedOutputReset, { - fn sign_prehash_with_rng( + fn sign_prehash_with_rng( &self, - rng: &mut impl CryptoRngCore, + rng: &mut R, prehash: &[u8], ) -> signature::Result { sign_digest::<_, D>(rng, false, &self.inner, prehash, self.salt_len)? @@ -290,9 +290,11 @@ mod tests { let priv_key = crate::RsaPrivateKey::new(&mut rng, 64).expect("failed to generate key"); let signing_key = SigningKey::::new(priv_key); - let tokens = [ - Token::Str("3054020100300d06092a864886f70d01010105000440303e020100020900c9269f2f225eb38d020301000102086ecdc49f528812a1020500d2aaa725020500f46fc249020500887e253902046b4851e1020423806864") - ]; + let tokens = [Token::Str(concat!( + "3054020100300d06092a864886f70d01010105000440303e020100020900aecdb5", + "fae1b092570203010001020869bf9ae9d6712899020500d2aaa725020500d46b68", + "cb020500887e253902047b4e3a4f02040991164c", + ))]; assert_tokens(&signing_key.readable(), &tokens); } diff --git a/src/pss/verifying_key.rs b/src/pss/verifying_key.rs index ec9fea0f..75bb6809 100644 --- a/src/pss/verifying_key.rs +++ b/src/pss/verifying_key.rs @@ -233,7 +233,7 @@ mod tests { let verifying_key = VerifyingKey::::new(pub_key); let tokens = [Token::Str( - "3024300d06092a864886f70d01010105000313003010020900c9269f2f225eb38d0203010001", + "3024300d06092a864886f70d01010105000313003010020900aecdb5fae1b092570203010001", )]; assert_tokens(&verifying_key.readable(), &tokens); diff --git a/src/traits/encryption.rs b/src/traits/encryption.rs index e57caed4..cb605419 100644 --- a/src/traits/encryption.rs +++ b/src/traits/encryption.rs @@ -1,18 +1,14 @@ //! Encryption-related traits. use alloc::vec::Vec; -use rand_core::CryptoRngCore; +use rand_core::CryptoRng; use crate::errors::Result; /// Encrypt the message using provided random source pub trait RandomizedEncryptor { /// Encrypt the given message. - fn encrypt_with_rng( - &self, - rng: &mut R, - msg: &[u8], - ) -> Result>; + fn encrypt_with_rng(&self, rng: &mut R, msg: &[u8]) -> Result>; } /// Decrypt the given message @@ -24,7 +20,7 @@ pub trait Decryptor { /// Decrypt the given message using provided random source pub trait RandomizedDecryptor { /// Decrypt the given message. - fn decrypt_with_rng( + fn decrypt_with_rng( &self, rng: &mut R, ciphertext: &[u8], diff --git a/src/traits/padding.rs b/src/traits/padding.rs index ce198fc3..568c76da 100644 --- a/src/traits/padding.rs +++ b/src/traits/padding.rs @@ -2,7 +2,7 @@ use alloc::vec::Vec; -use rand_core::CryptoRngCore; +use rand_core::TryCryptoRng; use crate::errors::Result; use crate::key::{RsaPrivateKey, RsaPublicKey}; @@ -13,7 +13,7 @@ pub trait PaddingScheme { /// /// If an `rng` is passed, it uses RSA blinding to help mitigate timing /// side-channel attacks. - fn decrypt( + fn decrypt( self, rng: Option<&mut Rng>, priv_key: &RsaPrivateKey, @@ -21,7 +21,7 @@ pub trait PaddingScheme { ) -> Result>; /// Encrypt the given message using the given public key. - fn encrypt( + fn encrypt( self, rng: &mut Rng, pub_key: &RsaPublicKey, @@ -32,7 +32,7 @@ pub trait PaddingScheme { /// Digital signature scheme. pub trait SignatureScheme { /// Sign the given digest. - fn sign( + fn sign( self, rng: Option<&mut Rng>, priv_key: &RsaPrivateKey,