diff --git a/.github/workflows/coverage.yaml b/.github/workflows/coverage.yaml index 55ce03720..43eb6b218 100644 --- a/.github/workflows/coverage.yaml +++ b/.github/workflows/coverage.yaml @@ -6,7 +6,7 @@ on: branches: - main pull_request: - path: + paths: - '**/*.rs' - '**/*.txt' - '**/Cargo.toml' diff --git a/.github/workflows/main.yml b/.github/workflows/main.yml index c263aa9fb..99c85a9bd 100644 --- a/.github/workflows/main.yml +++ b/.github/workflows/main.yml @@ -1,6 +1,7 @@ name: CI on: + workflow_dispatch: push: branches: - main @@ -14,7 +15,7 @@ jobs: runs-on: ubuntu-latest steps: - - uses: actions/checkout@v6.0.2 + - uses: actions/checkout@v7.0.0 - uses: dtolnay/rust-toolchain@beta - run: cargo build @@ -23,27 +24,22 @@ jobs: runs-on: ubuntu-latest steps: - - uses: actions/checkout@v6.0.2 + - uses: actions/checkout@v7.0.0 - uses: dtolnay/rust-toolchain@stable - run: cargo update && cargo build --all-features build_msrv: - name: build with MSRV (1.81) + name: build with MSRV (1.86) runs-on: ubuntu-latest steps: - - uses: actions/checkout@v6.0.2 + - uses: actions/checkout@v7.0.0 # Re-resolve Cargo.lock with minimal versions. - # This only works with nightly. We pin to a specific version because - # newer versions use lock file version 4, but the MSRV cargo does not - # support that. - - uses: dtolnay/rust-toolchain@master - with: - toolchain: nightly-2024-09-20 + - uses: dtolnay/rust-toolchain@nightly - run: cargo update -Z minimal-versions # Now check that `cargo build` works with respect to the oldest possible # deps and the stated MSRV - - uses: dtolnay/rust-toolchain@1.81 + - uses: dtolnay/rust-toolchain@1.86 - run: cargo build --all-features # TODO: this is filling up the disk space in CI. See if there is a way to @@ -54,7 +50,7 @@ jobs: # runs-on: ubuntu-latest # steps: - # - uses: actions/checkout@v6.0.2 + # - uses: actions/checkout@v7.0.0 # - uses: dtolnay/rust-toolchain@stable # - run: cargo install cargo-all-features # # We check and then test because some test dependencies could help @@ -69,12 +65,11 @@ jobs: build_no_std: name: build with no_std runs-on: ubuntu-latest - # Skip ed448 which does not support it. strategy: matrix: - crate: [ristretto255, ed25519, p256, secp256k1, secp256k1-tr, rerandomized] + crate: [ed448, ristretto255, ed25519, p256, secp256k1, secp256k1-tr, rerandomized] steps: - - uses: actions/checkout@v6.0.2 + - uses: actions/checkout@v7.0.0 - uses: dtolnay/rust-toolchain@master with: toolchain: stable @@ -87,7 +82,7 @@ jobs: runs-on: ubuntu-latest steps: - - uses: actions/checkout@v6.0.2 + - uses: actions/checkout@v7.0.0 - uses: dtolnay/rust-toolchain@beta - run: cargo test --release --all-features @@ -96,7 +91,7 @@ jobs: runs-on: ubuntu-latest steps: - - uses: actions/checkout@v6.0.2 + - uses: actions/checkout@v7.0.0 with: persist-credentials: false @@ -113,7 +108,7 @@ jobs: GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} - name: Run clippy action to produce annotations - uses: clechasseur/rs-clippy-check@v5 + uses: clechasseur/rs-clippy-check@v6.0.5 if: ${{ steps.check_permissions.outputs.has-permission }} with: args: --all-features --all-targets -- -D warnings @@ -127,7 +122,7 @@ jobs: runs-on: ubuntu-latest steps: - - uses: actions/checkout@v6.0.2 + - uses: actions/checkout@v7.0.0 with: persist-credentials: false @@ -144,7 +139,7 @@ jobs: runs-on: ubuntu-latest steps: - - uses: actions/checkout@v6.0.2 + - uses: actions/checkout@v7.0.0 with: persist-credentials: false @@ -163,7 +158,7 @@ jobs: RUSTDOCFLAGS: -D warnings steps: - - uses: actions/checkout@v6.0.2 + - uses: actions/checkout@v7.0.0 with: persist-credentials: false @@ -175,7 +170,7 @@ jobs: runs-on: ubuntu-latest continue-on-error: true steps: - - uses: actions/checkout@v6.0.2 + - uses: actions/checkout@v7.0.0 - uses: reviewdog/action-actionlint@v1.72.0 with: level: warning diff --git a/Cargo.lock b/Cargo.lock index 216200ab5..b58992260 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -1,6 +1,6 @@ # This file is automatically @generated by Cargo. # It is not intended for manual editing. -version = 3 +version = 4 [[package]] name = "aho-corasick" @@ -11,6 +11,15 @@ dependencies = [ "memchr", ] +[[package]] +name = "alloca" +version = "0.4.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e5a7d05ea6aea7e9e64d25b9156ba2fee3fdd659e34e41063cd2fc7cd020d7f4" +dependencies = [ + "cc", +] + [[package]] name = "anes" version = "0.1.6" @@ -29,15 +38,6 @@ version = "0.7.6" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "7c02d123df017efcdfbd739ef81735b36c5ba83ec3c59c80a9d7ecc718f92e50" -[[package]] -name = "atomic-polyfill" -version = "1.0.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8cf2bce30dfe09ef0bfaef228b9d414faaf7e563035494d7fe092dba54b300f4" -dependencies = [ - "critical-section", -] - [[package]] name = "autocfg" version = "1.5.0" @@ -51,10 +51,10 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "4c7f02d4ea65f2c1853089ffd8d2787bdbc63de2f0d29dedbcf8ccdfa0ccd4cf" [[package]] -name = "base64ct" -version = "1.8.3" +name = "base16ct" +version = "1.0.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2af50177e190e07a26ab74f8b1efbfe2ef87da2116221318cb1c2e82baf7de06" +checksum = "fd307490d624467aa6f74b0eabb77633d1f758a7b25f12bceb0b22e08d9726f6" [[package]] name = "bit-set" @@ -95,11 +95,11 @@ checksum = "812e12b5285cc515a9c72a5c1d3b6d46a19dac5acfef5265968c166106e31dd3" [[package]] name = "block-buffer" -version = "0.10.4" +version = "0.12.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3078c7629b62d3f0439517fa394996acacc5cbc91c5a20d8c658e77abd503a71" +checksum = "d2f6c7dbe95a6ed67ad9f18e57daf93a2f034c524b99fd2b76d18fdfeb6660aa" dependencies = [ - "generic-array", + "hybrid-array", ] [[package]] @@ -136,6 +136,17 @@ version = "1.0.4" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "9330f8b2ff13f34540b44e946ef35111825727b38d33286ef986142615121801" +[[package]] +name = "chacha20" +version = "0.10.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d524456ba66e72eb8b115ff89e01e497f8e6d11d78b70b1aa13c0fbd97540a81" +dependencies = [ + "cfg-if", + "cpufeatures 0.3.0", + "rand_core 0.10.1", +] + [[package]] name = "ciborium" version = "0.2.2" @@ -188,6 +199,12 @@ version = "0.7.7" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "c3e64b0cc0439b12df2fa678eae89a1c56a529fd067a9115f7827f1fffd22b32" +[[package]] +name = "cmov" +version = "0.5.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0c9ea0ac24bc397ab3c98583a3c9ba74fa56b09a4449bbe172b9b1ddb016027a" + [[package]] name = "cobs" version = "0.3.0" @@ -214,11 +231,29 @@ version = "1.3.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "808ac43170e95b11dd23d78aa9eaac5bea45776a602955552c4e833f3f0f823d" +[[package]] +name = "const-hex" +version = "1.19.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "33e2a781ebdf4467d1428dc4593067825fb646f6871475098d8577421af73558" +dependencies = [ + "cfg-if", + "cpufeatures 0.2.17", + "proptest", + "serde_core", +] + [[package]] name = "const-oid" -version = "0.9.6" +version = "0.10.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a6ef517f0926dd24a1582492c791b6a4818a4d94e789a334894aa15b0d12f55c" + +[[package]] +name = "cpubits" +version = "0.1.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c2459377285ad874054d797f3ccebf984978aa39129f6eafde5cdc8315b612f8" +checksum = "15b85f9c39137c3a891689859392b1bd49812121d0d61c9caf00d46ed5ce06ae" [[package]] name = "cpufeatures" @@ -229,20 +264,31 @@ dependencies = [ "libc", ] +[[package]] +name = "cpufeatures" +version = "0.3.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8b2a41393f66f16b0823bb79094d54ac5fbd34ab292ddafb9a0456ac9f87d201" +dependencies = [ + "libc", +] + [[package]] name = "criterion" -version = "0.6.0" +version = "0.8.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3bf7af66b0989381bd0be551bd7cc91912a655a58c6918420c9527b1fd8b4679" +checksum = "950046b2aa2492f9a536f5f4f9a3de7b9e2476e575e05bd6c333371add4d98f3" dependencies = [ + "alloca", "anes", "cast", "ciborium", "clap", "criterion-plot", - "itertools 0.13.0", + "itertools", "num-traits", "oorandom", + "page_size", "plotters", "rayon", "regex", @@ -254,20 +300,14 @@ dependencies = [ [[package]] name = "criterion-plot" -version = "0.5.0" +version = "0.8.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6b50826342786a51a89e2da3a28f1c32b06e387201bc2d19791f622c673706b1" +checksum = "d8d80a2f4f5b554395e47b5d8305bc3d27813bacb73493eb1001e8f76dae29ea" dependencies = [ "cast", - "itertools 0.10.5", + "itertools", ] -[[package]] -name = "critical-section" -version = "1.2.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "790eea4361631c5e7d22598ecd5723ff611904e3344ce8720784c93e3d83d40b" - [[package]] name = "crossbeam-deque" version = "0.8.6" @@ -301,38 +341,51 @@ checksum = "460fbee9c2c2f33933d720630a6a0bac33ba7053db5344fac858d4b8952d77d5" [[package]] name = "crypto-bigint" -version = "0.5.5" +version = "0.7.5" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0dc92fb57ca44df6db8059111ab3af99a63d5d0f8375d9972e319a379c6bab76" +checksum = "1a52aa3fcda4e6302a9f48734f234d35d4721b96f8fe07d073f07ce9df4f0271" dependencies = [ - "generic-array", - "rand_core 0.6.4", + "cpubits", + "ctutils", + "hybrid-array", + "num-traits", + "rand_core 0.10.1", "subtle", "zeroize", ] [[package]] name = "crypto-common" -version = "0.1.6" +version = "0.2.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1bfb12502f3fc46cca1bb51ac28df9d618d813cdc3d2f25b9fe775a34af26bb3" +checksum = "ce6e4c961d6cd6c9a86db418387425e8bdeaf05b3c8bc1411e6dca4c252f1453" dependencies = [ - "generic-array", - "typenum", + "hybrid-array", + "rand_core 0.10.1", +] + +[[package]] +name = "ctutils" +version = "0.4.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7d5515a3834141de9eafb9717ad39eea8247b5674e6066c404e8c4b365d2a29e" +dependencies = [ + "cmov", + "subtle", ] [[package]] name = "curve25519-dalek" -version = "4.1.3" +version = "5.0.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "97fb8b7c4503de7d6ae7b42ab72a5a59857b4c937ec27a3d4539dba95b5ab2be" +checksum = "b5eed333089e2e1c1ac8c6c0398e5e2497b4c9926ca6d0365ed1e099afa5bc23" dependencies = [ "cfg-if", - "cpufeatures", + "cpufeatures 0.3.0", "curve25519-dalek-derive", "digest", - "fiat-crypto 0.2.9", - "rand_core 0.6.4", + "fiat-crypto", + "rand_core 0.10.1", "rustc_version", "serde", "subtle", @@ -358,9 +411,9 @@ checksum = "b93fdcfc175d53094fca1d23d171685621bb67f1658413514f2053d575b3b38c" [[package]] name = "der" -version = "0.7.10" +version = "0.8.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e7c1832837b905bbfb5101e07cc24c8deddf52f93225eee6ead5f4d63d53ddcb" +checksum = "a69dedd701da44b0536442edf09c81a64b0ab97a7a4a5e3d1971f00027cbc63d" dependencies = [ "const-oid", "zeroize", @@ -379,9 +432,9 @@ dependencies = [ [[package]] name = "digest" -version = "0.10.7" +version = "0.11.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9ed9a281f7bc9b7576e61468ba615a66a5c8cfdff42420a70aa82701a3b1e292" +checksum = "f1dd6dbb5841937940781866fa1281a1ff7bd3bf827091440879f9994983d5c2" dependencies = [ "block-buffer", "crypto-common", @@ -398,23 +451,21 @@ dependencies = [ [[package]] name = "ed25519" -version = "2.2.3" +version = "3.0.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "115531babc129696a58c64a4fef0a8bf9e9698629fb97e9e40767d235cfbcd53" +checksum = "29fcf32e6c73d1079f83ab4d782de2d81620346a5f38c6237a86a22f8368980a" dependencies = [ - "pkcs8", "signature", ] [[package]] name = "ed25519-dalek" -version = "2.2.0" +version = "3.0.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "70e796c081cee67dc755e1a36a0a172b897fab85fc3f6bc48307991f64e4eca9" +checksum = "6ebaa1a2bf1290ab3bfe5a7b771d050ebffab2711c19a81691c683a5144a25de" dependencies = [ "curve25519-dalek", "ed25519", - "serde", "sha2", "subtle", "zeroize", @@ -422,13 +473,14 @@ dependencies = [ [[package]] name = "ed448-goldilocks" -version = "0.9.0" +version = "0.14.0-pre.15" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "88322282bccdc6fa7ab65b0c30cb877fba541547653436d08bb775fa4a4307b4" +checksum = "b805154de2e68f59874ec217ca36790dcffe500cd872c60fe509d28d0814a74d" dependencies = [ - "fiat-crypto 0.1.20", - "hex", - "rand_core 0.6.4", + "elliptic-curve", + "hash2curve", + "rand_core 0.10.1", + "shake", "subtle", ] @@ -440,17 +492,18 @@ checksum = "48c757948c5ede0e46177b7add2e67155f70e33c07fea8284df6576da70b3719" [[package]] name = "elliptic-curve" -version = "0.13.8" +version = "0.14.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b5e6043086bf7973472e0c7dff2142ea0b680d30e18d9cc40f267efbf222bd47" +checksum = "9d65aa39b3a5c1c9c1b745c9a019234bb7a21b77abcb4f4d266d706e2d577d65" dependencies = [ - "base16ct", + "base16ct 1.0.0", "crypto-bigint", - "digest", + "crypto-common", "ff", - "generic-array", "group", - "rand_core 0.6.4", + "hybrid-array", + "pkcs8", + "rand_core 0.10.1", "sec1", "subtle", "zeroize", @@ -492,25 +545,19 @@ checksum = "37909eebbb50d72f9059c3b6d82c0463f2ff062c9e95845c43a6c9c0355411be" [[package]] name = "ff" -version = "0.13.1" +version = "0.14.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c0b50bfb653653f9ca9095b427bed08ab8d75a137839d9ad64eb11810d5b6393" +checksum = "a1f686ab92a9fb0eaf188f6c6c87b89490baa6fdb0db4544ba4dc47f7942489f" dependencies = [ - "rand_core 0.6.4", + "rand_core 0.10.1", "subtle", ] [[package]] name = "fiat-crypto" -version = "0.1.20" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e825f6987101665dea6ec934c09ec6d721de7bc1bf92248e1d5810c8cd636b77" - -[[package]] -name = "fiat-crypto" -version = "0.2.9" +version = "0.3.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "28dea519a9695b9977216879a3ebfddf92f1c08c05d984f8996aecd6ecdc811d" +checksum = "64cd1e32ddd350061ae6edb1b082d7c54915b5c672c389143b9a63403a109f24" [[package]] name = "find-msvc-tools" @@ -530,18 +577,16 @@ version = "3.0.0" dependencies = [ "byteorder", "const-crc32-nostd", + "const-hex", "criterion", "debugless-unwrap", "derive-getters", "document-features", - "hex", - "itertools 0.14.0", - "lazy_static", "postcard", "proptest", - "rand 0.8.5", - "rand_chacha 0.3.1", - "rand_core 0.6.4", + "rand 0.10.2", + "rand_chacha 0.10.0", + "rand_core 0.10.1", "serde", "serde_json", "serdect", @@ -549,26 +594,24 @@ dependencies = [ "tokio", "visibility", "zeroize", - "zeroize_derive", ] [[package]] name = "frost-ed25519" version = "3.0.0" dependencies = [ + "const-hex", "criterion", "curve25519-dalek", "document-features", "ed25519-dalek", "frost-core", "frost-rerandomized", - "hex", "insta", - "lazy_static", "proptest", - "rand 0.8.5", - "rand_chacha 0.3.1", - "rand_core 0.6.4", + "rand 0.10.2", + "rand_chacha 0.10.0", + "rand_core 0.10.1", "serde_json", "sha2", "tokio", @@ -578,20 +621,20 @@ dependencies = [ name = "frost-ed448" version = "3.0.0" dependencies = [ + "const-hex", "criterion", "document-features", "ed448-goldilocks", "frost-core", "frost-rerandomized", - "hex", "insta", - "lazy_static", "proptest", - "rand 0.8.5", - "rand_chacha 0.3.1", - "rand_core 0.6.4", + "rand 0.10.2", + "rand_chacha 0.10.0", + "rand_core 0.10.1", "serde_json", "sha3", + "shake", "tokio", ] @@ -599,18 +642,17 @@ dependencies = [ name = "frost-p256" version = "3.0.0" dependencies = [ + "const-hex", "criterion", "document-features", "frost-core", "frost-rerandomized", - "hex", "insta", - "lazy_static", "p256", "proptest", - "rand 0.8.5", - "rand_chacha 0.3.1", - "rand_core 0.6.4", + "rand 0.10.2", + "rand_chacha 0.10.0", + "rand_core 0.10.1", "serde_json", "sha2", "tokio", @@ -620,30 +662,29 @@ dependencies = [ name = "frost-rerandomized" version = "3.0.0" dependencies = [ + "const-hex", "derive-getters", "document-features", "frost-core", - "hex", - "rand_core 0.6.4", + "rand_core 0.10.1", ] [[package]] name = "frost-ristretto255" version = "3.0.0" dependencies = [ + "const-hex", "criterion", "curve25519-dalek", "document-features", "frost-core", "frost-rerandomized", - "hex", "insta", - "lazy_static", "postcard", "proptest", - "rand 0.8.5", - "rand_chacha 0.3.1", - "rand_core 0.6.4", + "rand 0.10.2", + "rand_chacha 0.10.0", + "rand_core 0.10.1", "serde_json", "sha2", "tokio", @@ -653,18 +694,17 @@ dependencies = [ name = "frost-secp256k1" version = "3.0.0" dependencies = [ + "const-hex", "criterion", "document-features", "frost-core", "frost-rerandomized", - "hex", "insta", "k256", - "lazy_static", "proptest", - "rand 0.8.5", - "rand_chacha 0.3.1", - "rand_core 0.6.4", + "rand 0.10.2", + "rand_chacha 0.10.0", + "rand_core 0.10.1", "serde_json", "sha2", "tokio", @@ -674,18 +714,17 @@ dependencies = [ name = "frost-secp256k1-tr" version = "3.0.0" dependencies = [ + "const-hex", "criterion", "document-features", "frost-core", "frost-rerandomized", - "hex", "insta", "k256", - "lazy_static", "proptest", - "rand 0.8.5", - "rand_chacha 0.3.1", - "rand_core 0.6.4", + "rand 0.10.2", + "rand_chacha 0.10.0", + "rand_core 0.10.1", "secp256k1", "serde_json", "sha2", @@ -694,54 +733,44 @@ dependencies = [ [[package]] name = "gencode" -version = "0.1.0" +version = "3.0.0" dependencies = [ "regex", "serde_json", ] -[[package]] -name = "generic-array" -version = "0.14.9" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4bb6743198531e02858aeaea5398fcc883e71851fcbcb5a2f773e2fb6cb1edf2" -dependencies = [ - "typenum", - "version_check", - "zeroize", -] - [[package]] name = "getrandom" -version = "0.2.17" +version = "0.3.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ff2abc00be7fca6ebc474524697ae276ad847ad0a6b3faa4bcb027e9a4614ad0" +checksum = "899def5c37c4fd7b2664648c28120ecec138e4d395b459e5ca34f9cce2dd77fd" dependencies = [ "cfg-if", "libc", - "wasi", + "r-efi 5.3.0", + "wasip2", ] [[package]] name = "getrandom" -version = "0.3.4" +version = "0.4.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "899def5c37c4fd7b2664648c28120ecec138e4d395b459e5ca34f9cce2dd77fd" +checksum = "300e883d756b2e4ec94e02791f39b04b522276138852cfc41d9fb7e904106099" dependencies = [ "cfg-if", "libc", - "r-efi", - "wasip2", + "r-efi 6.0.0", + "rand_core 0.10.1", ] [[package]] name = "group" -version = "0.13.0" +version = "0.14.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f0f9ef7462f7c099f518d754361858f86d8a07af53ba9af0fe635bbccb151a63" +checksum = "7fd1a1c7a5206c5b7a3f5a0d7ccd3ff85d0c8f5133d62a02680255b0004af5f4" dependencies = [ "ff", - "rand_core 0.6.4", + "rand_core 0.10.1", "subtle", ] @@ -757,48 +786,40 @@ dependencies = [ ] [[package]] -name = "hash32" -version = "0.2.1" +name = "hash2curve" +version = "0.14.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b0c35f58762feb77d74ebe43bdbc3210f09be9fe6742234d573bacc26ed92b67" +checksum = "1eaf40612d7d854743e7189228a6d528f0f6e8502cf6a0cb831d28a218b7f3f6" dependencies = [ - "byteorder", + "digest", + "elliptic-curve", ] [[package]] -name = "heapless" -version = "0.7.17" +name = "hex-conservative" +version = "0.2.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "cdc6457c0eb62c71aac4bc17216026d8410337c4126773b9c5daba343f17964f" +checksum = "fda06d18ac606267c40c04e41b9947729bf8b9efe74bd4e82b61a5f26a510b9f" dependencies = [ - "atomic-polyfill", - "hash32", - "rustc_version", - "serde", - "spin", - "stable_deref_trait", + "arrayvec", ] [[package]] -name = "hex" -version = "0.4.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7f24254aa9a54b5c858eaee2f5bccdb46aaf0e486a595ed5fd8f86ba55232a70" - -[[package]] -name = "hex-conservative" -version = "0.2.2" +name = "hybrid-array" +version = "0.4.13" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "fda06d18ac606267c40c04e41b9947729bf8b9efe74bd4e82b61a5f26a510b9f" +checksum = "818356c5132c1fede50f837ca96afbe78ff42413047f4abb886217845e1b6c8c" dependencies = [ - "arrayvec", + "subtle", + "typenum", + "zeroize", ] [[package]] name = "insta" -version = "1.47.2" +version = "1.48.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7b4a6248eb93a4401ed2f37dfe8ea592d3cf05b7cf4f8efa867b6895af7e094e" +checksum = "86f0f8fee8c926415c58d6ae43a08523a26faccb2323f5e6b644fe7dd4ef6b82" dependencies = [ "console", "once_cell", @@ -807,15 +828,6 @@ dependencies = [ "tempfile", ] -[[package]] -name = "itertools" -version = "0.10.5" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b0fd2260e829bddf4cb6ea802289de2f86d6a7a690192fbe91b3f46e0f2c8473" -dependencies = [ - "either", -] - [[package]] name = "itertools" version = "0.13.0" @@ -825,15 +837,6 @@ dependencies = [ "either", ] -[[package]] -name = "itertools" -version = "0.14.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2b192c782037fadd9cfa75548310488aabdbf3d2da73885b31bd0abd03351285" -dependencies = [ - "either", -] - [[package]] name = "itoa" version = "1.0.17" @@ -852,29 +855,27 @@ dependencies = [ [[package]] name = "k256" -version = "0.13.4" +version = "0.14.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f6e3919bbaa2945715f0bb6d3934a173d1e9a59ac23767fbaaef277265a7411b" +checksum = "93f50113171a713f4a4231ef82eb26703607139b35dcb56241f0ceab2ae1f7d8" dependencies = [ - "cfg-if", + "cpubits", "elliptic-curve", + "hash2curve", + "primeorder", + "wnaf", ] [[package]] name = "keccak" -version = "0.1.6" +version = "0.2.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "cb26cec98cce3a3d96cbb7bced3c4b16e3d13f27ec56dbd62cbc8f39cfb9d653" +checksum = "9e24a010dd405bd7ed803e5253182815b41bf2e6a80cc3bfc066658e03a198aa" dependencies = [ - "cpufeatures", + "cfg-if", + "cpufeatures 0.3.0", ] -[[package]] -name = "lazy_static" -version = "1.5.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "bbd2bcb4c963f2ddae06a2efc7e9f3591312473c50c6685e1f298068316e66fe" - [[package]] name = "libc" version = "0.2.180" @@ -893,15 +894,6 @@ version = "1.0.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "11d3d7f243d5c5a8b9bb5d6dd2b1602c0cb0b9db1621bafc7ed66e35ff9fe092" -[[package]] -name = "lock_api" -version = "0.4.14" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "224399e74b87b5f3557511d98dff8b14089b3dadafcab6bb93eab67d3aace965" -dependencies = [ - "scopeguard", -] - [[package]] name = "memchr" version = "2.7.6" @@ -931,14 +923,26 @@ checksum = "d6790f58c7ff633d8771f42965289203411a5e5c68388703c06e14f24770b41e" [[package]] name = "p256" -version = "0.13.2" +version = "0.14.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c9863ad85fa8f4460f9c48cb909d38a0d689dba1f6f6988a5e3e0d31071bcd4b" +checksum = "d2c9239b2dbc807adbbe147e8cf72ea7450c3a0aabe62cb8e75ff4ec22e1f72a" dependencies = [ "elliptic-curve", + "hash2curve", + "primefield", "primeorder", ] +[[package]] +name = "page_size" +version = "0.6.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "30d5b2194ed13191c1999ae0704b7839fb18384fa22e49b57eeaa97d79ce40da" +dependencies = [ + "libc", + "winapi", +] + [[package]] name = "pin-project-lite" version = "0.2.16" @@ -947,9 +951,9 @@ checksum = "3b3cff922bd51709b605d9ead9aa71031d81447142d828eb4a6eba76fe619f9b" [[package]] name = "pkcs8" -version = "0.10.2" +version = "0.11.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f950b2377845cebe5cf8b5165cb3cc1a5e0fa5cfa3e1f7f55707d8fd82e0a7b7" +checksum = "451913da69c775a56034ea8d9003d27ee8948e12443eae7c038ba100a4f21cb7" dependencies = [ "der", "spki", @@ -992,7 +996,6 @@ dependencies = [ "cobs", "embedded-io 0.4.0", "embedded-io 0.6.1", - "heapless", "serde", ] @@ -1005,13 +1008,29 @@ dependencies = [ "zerocopy", ] +[[package]] +name = "primefield" +version = "0.14.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c555a6e4eb7d4e158fcb028c835c3b8642206ddc279b5c6b202ef9a8bdb592f4" +dependencies = [ + "crypto-bigint", + "crypto-common", + "ff", + "rand_core 0.10.1", + "subtle", + "zeroize", +] + [[package]] name = "primeorder" -version = "0.13.6" +version = "0.14.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "353e1ca18966c16d9deb1c69278edbc5f194139612772bd9537af60ac231e1e6" +checksum = "5c9f42978c78a00e3d68f69fc03e57a234debae69da4020a4fb588fcdcd07b06" dependencies = [ "elliptic-curve", + "primefield", + "wnaf", ] [[package]] @@ -1033,7 +1052,7 @@ dependencies = [ "bit-vec", "bitflags", "num-traits", - "rand 0.9.2", + "rand 0.9.4", "rand_chacha 0.9.0", "rand_xorshift", "regex-syntax", @@ -1064,34 +1083,30 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "69cdb34c158ceb288df11e18b4bd39de994f6657d83847bdffdbd7f346754b0f" [[package]] -name = "rand" -version = "0.8.5" +name = "r-efi" +version = "6.0.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "34af8d1a0e25924bc5b7c43c079c942339d8f0a8b57c39049bef581b46327404" -dependencies = [ - "libc", - "rand_chacha 0.3.1", - "rand_core 0.6.4", -] +checksum = "f8dcc9c7d52a811697d2151c701e0d08956f92b0e24136cf4cf27b57a6a0d9bf" [[package]] name = "rand" -version = "0.9.2" +version = "0.9.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6db2770f06117d490610c7488547d543617b21bfa07796d7a12f6f1bd53850d1" +checksum = "44c5af06bb1b7d3216d91932aed5265164bf384dc89cd6ba05cf59a35f5f76ea" dependencies = [ "rand_chacha 0.9.0", "rand_core 0.9.5", ] [[package]] -name = "rand_chacha" -version = "0.3.1" +name = "rand" +version = "0.10.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e6c10a63a0fa32252be49d21e7709d4d4baf8d231c2dbce1eaa8141b9b127d88" +checksum = "c7f5fa3a058cd35567ef9bfa5e75732bee0f9e4c55fa90477bef2dfcdbc4be80" dependencies = [ - "ppv-lite86", - "rand_core 0.6.4", + "chacha20", + "getrandom 0.4.3", + "rand_core 0.10.1", ] [[package]] @@ -1105,12 +1120,13 @@ dependencies = [ ] [[package]] -name = "rand_core" -version = "0.6.4" +name = "rand_chacha" +version = "0.10.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ec0be4795e2f6a28069bec0b5ff3e2ac9bafc99e6a9a7dc3547996c5c816922c" +checksum = "3e6af7f3e25ded52c41df4e0b1af2d047e45896c2f3281792ed68a1c243daedb" dependencies = [ - "getrandom 0.2.17", + "ppv-lite86", + "rand_core 0.10.1", ] [[package]] @@ -1122,6 +1138,12 @@ dependencies = [ "getrandom 0.3.4", ] +[[package]] +name = "rand_core" +version = "0.10.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "63b8176103e19a2643978565ca18b50549f6101881c443590420e4dc998a3c69" + [[package]] name = "rand_xorshift" version = "0.4.0" @@ -1153,9 +1175,9 @@ dependencies = [ [[package]] name = "regex" -version = "1.12.3" +version = "1.13.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e10754a14b9137dd7b1e3e5b0493cc9171fdd105e0ab477f51b72e7f3ac0e276" +checksum = "2a0e75113e14dc5acb068cd0786884f214f1312650a3d36d269f5c4f3cdee8a2" dependencies = [ "aho-corasick", "memchr", @@ -1176,9 +1198,9 @@ dependencies = [ [[package]] name = "regex-syntax" -version = "0.8.8" +version = "0.8.11" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7a2d987857b319362043e95f5353c0535c1f58eec5336fdfcf626430af7def58" +checksum = "d6f6ff9a378485b298a5286656da665ba74413d36db0979633275d2e708145d4" [[package]] name = "rustc_version" @@ -1229,21 +1251,16 @@ dependencies = [ "winapi-util", ] -[[package]] -name = "scopeguard" -version = "1.2.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "94143f37725109f92c262ed2cf5e59bce7498c01bcc1502d7b9afe439a4e9f49" - [[package]] name = "sec1" -version = "0.7.3" +version = "0.8.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d3e97a565f76233a6003f9f5c54be1d9c5bdfa3eccfb189469f11ec4901c47dc" +checksum = "d56d437c2f19203ce5f7122e507831de96f3d2d4d3be5af44a0b0a09d8a80e4d" dependencies = [ - "base16ct", + "base16ct 1.0.0", + "ctutils", "der", - "generic-array", + "hybrid-array", "subtle", "zeroize", ] @@ -1255,7 +1272,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "2c3c81b43dc2d8877c216a3fccf76677ee1ebccd429566d3e67447290d0c42b2" dependencies = [ "bitcoin_hashes", - "rand 0.9.2", + "rand 0.9.4", "secp256k1-sys", ] @@ -1306,9 +1323,9 @@ dependencies = [ [[package]] name = "serde_json" -version = "1.0.149" +version = "1.0.150" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "83fc039473c5595ace860d8c4fafa220ff474b3fc6bfdb4293327f1a37e94d86" +checksum = "e8014e44b4736ed0538adeecded0fce2a272f22dc9578a7eb6b2d9993c74cfb9" dependencies = [ "itoa", "memchr", @@ -1323,29 +1340,41 @@ version = "0.2.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "a84f14a19e9a014bb9f4512488d9829a68e04ecabffb0f9904cd1ace94598177" dependencies = [ - "base16ct", + "base16ct 0.2.0", "serde", ] [[package]] name = "sha2" -version = "0.10.9" +version = "0.11.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a7507d819769d01a365ab707794a4084392c824f54a7a6a7862f8c3d0892b283" +checksum = "446ba717509524cb3f22f17ecc096f10f4822d76ab5c0b9822c5f9c284e825f4" dependencies = [ "cfg-if", - "cpufeatures", + "cpufeatures 0.3.0", "digest", ] [[package]] name = "sha3" -version = "0.10.8" +version = "0.12.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "bc9bad02c26382724b2d2692c6f179285e4b54eeecd7968f52a50059c3c11759" +dependencies = [ + "digest", + "keccak", + "sponge-cursor", +] + +[[package]] +name = "shake" +version = "0.1.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "75872d278a8f37ef87fa0ddbda7802605cb18344497949862c0d4dcb291eba60" +checksum = "09057cb2149ad4cbd2da1e26b351f9a4c354219421229c69c3063e6f61947c4a" dependencies = [ "digest", "keccak", + "sponge-cursor", ] [[package]] @@ -1356,12 +1385,9 @@ checksum = "0fda2ff0d084019ba4d7c6f371c95d8fd75ce3524c3cb8fb653a3023f6323e64" [[package]] name = "signature" -version = "2.2.0" +version = "3.0.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "77549399552de45a898a580c1b41d445bf730df867cc44e6c0233bbc4b8329de" -dependencies = [ - "rand_core 0.6.4", -] +checksum = "28d567dcbaf0049cb8ac2608a76cd95ff9e4412e1899d389ee400918ca7537f5" [[package]] name = "similar" @@ -1369,30 +1395,20 @@ version = "2.7.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "bbbb5d9659141646ae647b42fe094daf6c6192d1620870b449d9557f748b2daa" -[[package]] -name = "spin" -version = "0.9.8" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6980e8d7511241f8acf4aebddbb1ff938df5eebe98691418c4468d0b72a96a67" -dependencies = [ - "lock_api", -] - [[package]] name = "spki" -version = "0.7.3" +version = "0.8.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d91ed6c858b01f942cd56b37a94b3e0a1798290327d1236e4d9cf4eaca44d29d" +checksum = "1d9efca8738c78ee9484207732f728b1ef517bbb1833d6fc0879ca898a522f6f" dependencies = [ - "base64ct", "der", ] [[package]] -name = "stable_deref_trait" -version = "1.2.1" +name = "sponge-cursor" +version = "0.1.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6ce2be8dc25455e1f91df71bfa12ad37d7af1092ae736f3a6cd0e37bc7810596" +checksum = "3a0219bd7d979d58245a4f41f695e1ac9f8befdffadd7f61f1bae9e39abc6620" [[package]] name = "subtle" @@ -1456,9 +1472,9 @@ dependencies = [ [[package]] name = "tokio" -version = "1.50.0" +version = "1.52.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "27ad5e34374e03cfffefc301becb44e9dc3c17584f414349ebe29ed26661822d" +checksum = "8fc7f01b389ac15039e4dc9531aa973a135d7a4135281b12d7c1bc79fd57fffe" dependencies = [ "pin-project-lite", "tokio-macros", @@ -1466,9 +1482,9 @@ dependencies = [ [[package]] name = "tokio-macros" -version = "2.6.0" +version = "2.7.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "af407857209536a95c8e56f8231ef2c2e2aff839b22e07a1ffcbc617e9db9fa5" +checksum = "385a6cb71ab9ab790c5fe8d67f1645e6c450a7ce006a33de03daa956cf70a496" dependencies = [ "proc-macro2", "quote", @@ -1477,9 +1493,9 @@ dependencies = [ [[package]] name = "typenum" -version = "1.19.0" +version = "1.20.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "562d481066bde0658276a35467c4af00bdc6ee726305698a55b86e61d7ad82bb" +checksum = "b6f5e870be6c3b371b77fe0ee0bafb859fa4964b4404c27de1d380043c4dda20" [[package]] name = "unarray" @@ -1493,12 +1509,6 @@ version = "1.0.22" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "9312f7c4f6ff9069b165498234ce8be658059c6728633667c526e27dc2cf1df5" -[[package]] -name = "version_check" -version = "0.9.5" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0b928f33d975fc6ad9f86c8f283853ad26bdd5b10b7f1542aa2fa15e2289105a" - [[package]] name = "visibility" version = "0.1.1" @@ -1529,12 +1539,6 @@ dependencies = [ "winapi-util", ] -[[package]] -name = "wasi" -version = "0.11.1+wasi-snapshot-preview1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ccf3ec651a847eb01de73ccad15eb7d99f80485de043efb2f370cd654f4ea44b" - [[package]] name = "wasip2" version = "1.0.2+wasi-0.2.9" @@ -1599,6 +1603,22 @@ dependencies = [ "wasm-bindgen", ] +[[package]] +name = "winapi" +version = "0.3.9" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5c839a674fcd7a98952e593242ea400abe93992746761e38641405d28b00f419" +dependencies = [ + "winapi-i686-pc-windows-gnu", + "winapi-x86_64-pc-windows-gnu", +] + +[[package]] +name = "winapi-i686-pc-windows-gnu" +version = "0.4.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ac3b87c63620426dd9b991e5ce0329eff545bccbbb34f3be09ff6fb6ab51b7b6" + [[package]] name = "winapi-util" version = "0.1.11" @@ -1608,6 +1628,12 @@ dependencies = [ "windows-sys", ] +[[package]] +name = "winapi-x86_64-pc-windows-gnu" +version = "0.4.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "712e227841d057c1ee1cd2fb22fa7e5a5461ae8e48fa2ca79ec42cfc1931183f" + [[package]] name = "windows-link" version = "0.2.1" @@ -1629,6 +1655,17 @@ version = "0.51.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "d7249219f66ced02969388cf2bb044a09756a083d0fab1e566056b04d9fbcaa5" +[[package]] +name = "wnaf" +version = "0.14.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ab12e7090f27e2ffd9322651492942d50c2926094af30601e1964337db39daf1" +dependencies = [ + "ff", + "group", + "hybrid-array", +] + [[package]] name = "zerocopy" version = "0.8.35" @@ -1651,18 +1688,18 @@ dependencies = [ [[package]] name = "zeroize" -version = "1.8.2" +version = "1.9.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b97154e67e32c85465826e8bcc1c59429aaaf107c1e4a9e53c8d8ccd5eff88d0" +checksum = "e13c156562582aa81c60cb29407084cdb54c4164760106ab78e6c5b0858cf64e" dependencies = [ "zeroize_derive", ] [[package]] name = "zeroize_derive" -version = "1.4.3" +version = "1.5.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "85a5b4158499876c763cb03bc4e49185d3cccbabb15b33c627f7884f43db852e" +checksum = "3c50655cbb0fe3fc43170059e702f1ce5e19b84cec58dc87b037a09935c2f328" dependencies = [ "proc-macro2", "quote", diff --git a/Cargo.toml b/Cargo.toml index cf479d436..73eecfb70 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -1,22 +1,18 @@ [workspace] -resolver = "2" +resolver = "3" members = [ "frost-core", - "frost-ed25519", "frost-ed448", + "frost-ed25519", "frost-p256", + "frost-rerandomized", "frost-ristretto255", "frost-secp256k1", "frost-secp256k1-tr", - "frost-rerandomized", - "gencode" + "gencode", ] [workspace.package] -# If you update the edition, make sure to also update the argument to rustfmt -# in gencode/src/main.rs. -edition = "2021" -rust-version = "1.81" version = "3.0.0" authors = [ "Deirdre Connolly ", @@ -24,27 +20,61 @@ authors = [ "Conrado Gouvea ", "Natalie Eskinazi " ] -license = "MIT OR Apache-2.0" +# If you update the edition, make sure to also update the argument to rustfmt +# in gencode/src/main.rs. +edition = "2024" +rust-version = "1.86" +description = "ZF FROST (Flexible Round-Optimised Schnorr Threshold signatures)" +documentation = "https://docs.rs/frost-core" +readme = "README.md" +homepage = "https://frost.zfnd.org" repository = "https://github.com/ZcashFoundation/frost" -categories = ["cryptography"] +license = "MIT OR Apache-2.0" +license-file = "LICENSE" +keywords = ["cryptography", "crypto", "threshold", "signature", "schnorr"] +categories = ["cryptography", "algorithms", "mathematics", "security", "no-std"] [workspace.dependencies] -# Currently holding back from updating due to MSRV 1.86 of criterion 0.8 -# (we don't want to raise our MSRV just for this) -criterion = "0.6" -document-features = "0.2.7" -hex = { version = "0.4.3", default-features = false, features = ["alloc"] } -insta = { version = "1.31.0", features = ["yaml"] } -lazy_static = "1.4" -proptest = "1.0" -rand = "0.8" -rand_chacha = "0.3" -rand_core = "0.6" +byteorder = { version = "1.5", default-features = false } +const-crc32 = { version = "1.3", package = "const-crc32-nostd" } +criterion = "0.8" +curve25519-dalek = { version = "5.0", features = ["rand_core"] } +debugless-unwrap = "1.0" +derive-getters = "0.5" +document-features = "0.2.12" +ed448-goldilocks = { version = "0.14.0-pre.15", default-features = false } +ed25519-dalek = "3.0" +hex = { package = "const-hex", version = "1.19", default-features = false, features = ["alloc"] } +insta = { version = "1.48", features = ["yaml"] } +k256 = { version = "0.14", default-features = false, features = ["hash2curve"] } +p256 = { version = "0.14", default-features = false, features = ["hash2curve"] } +postcard = { version = "1.1", default-features = false, features = ["alloc"] } +proptest = "1.11" +rand = "0.10" +rand_chacha = "0.10" +rand_core = "0.10" +regex = "1.13" +secp256k1 = "0.31" +serde = { version = "1.0", default-features = false, features = ["derive"] } +serdect = "0.2" # TODO: https://github.com/ZcashFoundation/frost/issues/830 serde_json = "1.0" +sha2 = { version = "0.11", default-features = false } +sha3 = { version = "0.12", default-features = false } +shake = { version = "0.1", default-features = false, features = ["alloc"] } +thiserror = { version = "2.0", default-features = false } tokio = { version = "1.0", features = ["rt", "time", "macros"] } +visibility = "0.1" +zeroize = { version = "1.9", default-features = false, features = ["derive", "alloc"] } -frost-core = { path = "frost-core", version = "3.0.0", default-features = false } -frost-rerandomized = { path = "frost-rerandomized", version = "3.0.0", default-features = false } +frost-core = { version = "3.0.0", path = "frost-core", default-features = false } +frost-ed448 = { version = "3.0.0", path = "frost-ed448", default-features = false } +frost-ed25519 = { version = "3.0.0", path = "frost-ed25519", default-features = false } +frost-p256 = { version = "3.0.0", path = "frost-p256", default-features = false } +frost-rerandomized = { version = "3.0.0", path = "frost-rerandomized", default-features = false } +frost-ristretto255 = { version = "3.0.0", path = "frost-ristretto255", default-features = false } +frost-secp256k1 = { version = "3.0.0", path = "frost-secp256k1", default-features = false } +frost-secp256k1-tr = { version = "3.0.0", path = "frost-secp256k1-tr", default-features = false } +gencode = { version = "3.0.0", path = "gencode", default-features = false } [profile.test.package."*"] opt-level = 3 diff --git a/frost-core/CHANGELOG.md b/frost-core/CHANGELOG.md index 1fcb73649..24dbc1d93 100644 --- a/frost-core/CHANGELOG.md +++ b/frost-core/CHANGELOG.md @@ -5,6 +5,10 @@ Entries are listed in reverse chronological order. ## Unreleased +* All crates from RustCrypto have been bumped to the latest versions, + version `rand` has been updated to `0.10` +* MSRV has been bumped to Rust 1.86, making all crates no-std. + ## 3.0.0 Refer to the `3.0.0-rc.0` entry below for the main changes if you are upgrading diff --git a/frost-core/Cargo.toml b/frost-core/Cargo.toml index 27642bf41..82f076b26 100644 --- a/frost-core/Cargo.toml +++ b/frost-core/Cargo.toml @@ -1,56 +1,57 @@ [package] name = "frost-core" -edition.workspace = true -rust-version.workspace = true version.workspace = true authors.workspace = true +edition.workspace = true +rust-version.workspace = true +description = "Types and traits to support implementing Flexible Round-Optimized Schnorr Threshold signature schemes (FROST)." +documentation = "https://docs.rs/frost-core" readme = "README.md" -license.workspace = true +homepage.workspace = true repository.workspace = true -categories.workspace = true +license.workspace = true keywords = ["cryptography", "crypto", "threshold", "signature", "schnorr"] -description = "Types and traits to support implementing Flexible Round-Optimized Schnorr Threshold signature schemes (FROST)." +categories.workspace = true [package.metadata.docs.rs] features = ["serde"] rustdoc-args = ["--cfg", "docsrs"] +[lib] +# Disables non-criterion benchmark which is not used; prevents errors +# when using criterion-specific flags +bench = false + [dependencies] -byteorder = { version = "1.4", default-features = false } -const-crc32 = { version = "1.2.0", package = "const-crc32-nostd" } +byteorder.workspace = true +const-crc32.workspace = true +debugless-unwrap = { workspace = true, optional = true } +derive-getters.workspace = true document-features.workspace = true -debugless-unwrap = { version = "1.0.0", optional = true } -derive-getters = "0.5.0" hex.workspace = true -postcard = { version = "1.0.0", features = ["alloc"], optional = true } -rand_core = { version = "0.6", default-features = false } -serde = { version = "1.0.160", default-features = false, features = ["derive"], optional = true } -serdect = { version = "0.2.0", optional = true } -thiserror = { version = "2.0.3", default-features = false } -visibility = "0.1.0" -zeroize = { version = "1.5.4", default-features = false, features = ["derive", "alloc"] } -# We indirectly depend on this via `zeroize` but the minimal version enforced by -# `zeroize` does not work for us, so we specify it here. -zeroize_derive = { version = "1.4.2" } -itertools = { version = "0.14.0", default-features = false } +postcard = { workspace = true, optional = true } +rand_core.workspace = true +serde = { workspace = true, optional = true } +serdect = { workspace = true, optional = true } +thiserror.workspace = true +visibility.workspace = true +zeroize.workspace = true # Test dependencies used with the test-impl feature -proptest = { version = "1.0", optional = true } -serde_json = { version = "1.0", optional = true } criterion = { workspace = true, optional = true } +proptest = { workspace = true, optional = true } +serde_json = { workspace = true, optional = true } tokio = { workspace = true, optional = true } [dev-dependencies] -debugless-unwrap = "1.0.0" criterion.workspace = true -lazy_static.workspace = true +debugless-unwrap.workspace = true proptest.workspace = true rand.workspace = true rand_chacha.workspace = true serde_json.workspace = true tokio.workspace = true - [features] default = ["serialization"] #! ## Features @@ -65,6 +66,3 @@ serde = ["dep:serde", "dep:serdect"] serialization = ["serde", "dep:postcard"] # Exposes ciphersuite-generic tests for other crates to use test-impl = ["dep:proptest", "dep:serde_json", "dep:criterion", "dep:tokio", "dep:debugless-unwrap"] - -[lib] -bench = false diff --git a/frost-core/src/batch.rs b/frost-core/src/batch.rs index a30a109e4..3b1ca4ce8 100644 --- a/frost-core/src/batch.rs +++ b/frost-core/src/batch.rs @@ -7,7 +7,7 @@ //! of caller code (which must assemble a batch of signatures across //! work-items), and loss of the ability to easily pinpoint failing signatures. -use rand_core::{CryptoRng, RngCore}; +use rand_core::CryptoRng; use crate::{scalar_mul::VartimeMultiscalarMul, Ciphersuite, Element, *}; @@ -109,7 +109,7 @@ where /// notation in the [protocol specification §B.1][ps]. /// /// [ps]: https://zips.z.cash/protocol/protocol.pdf#reddsabatchverify - pub fn verify(self, mut rng: R) -> Result<(), Error> { + pub fn verify(self, mut rng: R) -> Result<(), Error> { let n = self.signatures.len(); if n == 0 { diff --git a/frost-core/src/benches.rs b/frost-core/src/benches.rs index fd4ea7313..a66942632 100644 --- a/frost-core/src/benches.rs +++ b/frost-core/src/benches.rs @@ -4,7 +4,7 @@ use core::iter; use alloc::{collections::BTreeMap, format, vec::Vec}; -use rand_core::{CryptoRng, RngCore}; +use rand_core::CryptoRng; use criterion::{BenchmarkId, Criterion, Throughput}; @@ -16,7 +16,7 @@ struct Item { sig: Signature, } -fn sigs_with_distinct_keys( +fn sigs_with_distinct_keys( rng: &mut R, ) -> impl Iterator> { let mut rng = rng.clone(); @@ -30,7 +30,7 @@ fn sigs_with_distinct_keys( } /// Benchmark batched signature verification with the specified ciphersuite. -pub fn bench_batch_verify( +pub fn bench_batch_verify( c: &mut Criterion, name: &str, rng: &mut R, @@ -81,7 +81,7 @@ pub fn bench_batch_verify( } /// Benchmark FROST signing with the specified ciphersuite. -pub fn bench_sign( +pub fn bench_sign( c: &mut Criterion, name: &str, rng: &mut R, @@ -89,9 +89,7 @@ pub fn bench_sign( let mut group = c.benchmark_group(format!("FROST Signing {name}")); for &n in [3u16, 10, 100, 1000].iter() { let max_signers = n; - // div_ceil is in 1.73.0 which is larger than the current MSRV - #[allow(clippy::manual_div_ceil)] - let min_signers = (n * 2 + 2) / 3; + let min_signers = (n * 2).div_ceil(3); group.bench_with_input( BenchmarkId::new("Key Generation with Dealer", max_signers), diff --git a/frost-core/src/keys.rs b/frost-core/src/keys.rs index 5389f5ebc..bda728d9b 100644 --- a/frost-core/src/keys.rs +++ b/frost-core/src/keys.rs @@ -16,7 +16,7 @@ use derive_getters::Getters; #[cfg(any(test, feature = "test-impl"))] use hex::FromHex; -use rand_core::{CryptoRng, RngCore}; +use rand_core::CryptoRng; use zeroize::{DefaultIsZeroes, Zeroize, ZeroizeOnDrop}; use crate::{ @@ -64,7 +64,7 @@ pub(crate) fn sum_commitments( } /// Return a vector of randomly generated polynomial coefficients ([`Scalar`]s). -pub(crate) fn generate_coefficients( +pub(crate) fn generate_coefficients( size: usize, rng: &mut R, ) -> Vec> { @@ -510,7 +510,7 @@ pub enum IdentifierList<'a, C: Ciphersuite> { /// Implements [`trusted_dealer_keygen`] from the spec. /// /// [`trusted_dealer_keygen`]: https://datatracker.ietf.org/doc/html/rfc9591#appendix-C -pub fn generate_with_dealer( +pub fn generate_with_dealer( max_signers: u16, min_signers: u16, identifiers: IdentifierList, @@ -526,7 +526,7 @@ pub fn generate_with_dealer( /// instead of generating a fresh one. This is useful in scenarios where /// the key needs to be generated externally or must be derived from e.g. a /// seed phrase. -pub fn split( +pub fn split( key: &SigningKey, max_signers: u16, min_signers: u16, diff --git a/frost-core/src/keys/dkg.rs b/frost-core/src/keys/dkg.rs index 016490fce..167041887 100644 --- a/frost-core/src/keys/dkg.rs +++ b/frost-core/src/keys/dkg.rs @@ -38,7 +38,7 @@ use core::iter; use alloc::collections::BTreeMap; -use rand_core::{CryptoRng, RngCore}; +use rand_core::CryptoRng; use crate::{ Challenge, Ciphersuite, Element, Error, Field, Group, Header, Identifier, Scalar, Signature, @@ -356,7 +356,7 @@ pub mod round2 { /// It returns the [`round1::SecretPackage`] that must be kept in memory /// by the participant for the other steps, and the [`round1::Package`] that /// must be sent to each other participant in the DKG run. -pub fn part1( +pub fn part1( identifier: Identifier, max_signers: u16, min_signers: u16, @@ -420,7 +420,7 @@ where /// Compute the proof of knowledge of the secret coefficients used to generate /// the public secret sharing commitment. #[cfg_attr(feature = "internals", visibility::make(pub))] -pub(crate) fn compute_proof_of_knowledge( +pub(crate) fn compute_proof_of_knowledge( identifier: Identifier, coefficients: &[Scalar], commitment: &VerifiableSecretSharingCommitment, diff --git a/frost-core/src/keys/refresh.rs b/frost-core/src/keys/refresh.rs index cd80ad042..5fe17bfdd 100644 --- a/frost-core/src/keys/refresh.rs +++ b/frost-core/src/keys/refresh.rs @@ -33,7 +33,7 @@ use crate::{ generate_secret_shares, validate_num_of_signers, CoefficientCommitment, PublicKeyPackage, SigningKey, SigningShare, VerifyingShare, }, - Ciphersuite, CryptoRng, Error, Field, Group, Header, Identifier, RngCore, + Ciphersuite, CryptoRng, Error, Field, Group, Header, Identifier, }; use core::iter; @@ -55,7 +55,7 @@ use super::{dkg::round1::Package, KeyPackage, SecretShare, VerifiableSecretShari /// It returns a vectors of [`SecretShare`] that must be sent to the /// participants in the same order as `identifiers`, and the refreshed /// [`PublicKeyPackage`]. -pub fn compute_refreshing_shares( +pub fn compute_refreshing_shares( pub_key_package: PublicKeyPackage, identifiers: &[Identifier], rng: &mut R, @@ -176,7 +176,7 @@ pub fn refresh_share( /// It returns the [`round1::SecretPackage`] that must be kept in memory /// by the participant for the other steps, and the [`round1::Package`] that /// must be sent to each other participant in the refresh run. -pub fn refresh_dkg_part1( +pub fn refresh_dkg_part1( identifier: Identifier, max_signers: u16, min_signers: u16, diff --git a/frost-core/src/keys/repairable.rs b/frost-core/src/keys/repairable.rs index 0d6263657..8dd67c13b 100644 --- a/frost-core/src/keys/repairable.rs +++ b/frost-core/src/keys/repairable.rs @@ -26,8 +26,7 @@ use alloc::vec::Vec; use crate::keys::{KeyPackage, PublicKeyPackage}; use crate::serialization::SerializableScalar; use crate::{ - compute_lagrange_coefficient, Ciphersuite, CryptoRng, Error, Field, Group, Identifier, RngCore, - Scalar, + compute_lagrange_coefficient, Ciphersuite, CryptoRng, Error, Field, Group, Identifier, Scalar, }; use super::{generate_coefficients, SigningShare}; @@ -111,7 +110,7 @@ where /// `participant` recover their share. /// /// Returns a BTreeMap mapping which value should be sent to which participant. -pub fn repair_share_part1( +pub fn repair_share_part1( helpers: &[Identifier], key_package_i: &KeyPackage, rng: &mut R, diff --git a/frost-core/src/lib.rs b/frost-core/src/lib.rs index 364beabb0..c6171d56e 100644 --- a/frost-core/src/lib.rs +++ b/frost-core/src/lib.rs @@ -2,6 +2,7 @@ #![allow(non_snake_case)] // It's emitting false positives; see https://github.com/rust-lang/rust-clippy/issues/9413 #![allow(clippy::derive_partial_eq_without_eq)] +#![allow(clippy::wrong_self_convention)] #![deny(missing_docs)] #![forbid(unsafe_code)] #![deny(clippy::indexing_slicing)] @@ -25,7 +26,7 @@ use derive_getters::Getters; #[cfg(any(test, feature = "test-impl"))] use hex::FromHex; use keys::PublicKeyPackage; -use rand_core::{CryptoRng, RngCore}; +use rand_core::CryptoRng; use serialization::SerializableScalar; use zeroize::Zeroize; @@ -136,7 +137,7 @@ where /// It assumes that the Scalar Eq/PartialEq implementation is constant-time. #[cfg_attr(feature = "internals", visibility::make(pub))] #[cfg_attr(docsrs, doc(cfg(feature = "internals")))] -pub(crate) fn random_nonzero(rng: &mut R) -> Scalar { +pub(crate) fn random_nonzero(rng: &mut R) -> Scalar { loop { let scalar = <::Field>::random(rng); @@ -269,13 +270,12 @@ where fn from_hex>(hex: T) -> Result { let v: Vec = FromHex::from_hex(hex).map_err(|_| "invalid hex")?; - let ret = match v.as_slice().try_into() { + match v.as_slice().try_into() { Ok(bytes) => <::Field>::deserialize(&bytes) .map(|scalar| Self(scalar)) .map_err(|_| "malformed scalar encoding"), Err(_) => Err("malformed scalar encoding"), - }; - ret + } } } diff --git a/frost-core/src/round1.rs b/frost-core/src/round1.rs index d2468fde6..dfaa83a59 100644 --- a/frost-core/src/round1.rs +++ b/frost-core/src/round1.rs @@ -13,7 +13,7 @@ use derive_getters::Getters; #[cfg(any(test, feature = "test-impl"))] use hex::FromHex; -use rand_core::{CryptoRng, RngCore}; +use rand_core::CryptoRng; use zeroize::{Zeroize, ZeroizeOnDrop}; use crate::{ @@ -48,7 +48,7 @@ where /// [spec]: https://datatracker.ietf.org/doc/html/rfc9591#name-nonce-generation pub fn new(secret: &SigningShare, rng: &mut R) -> Self where - R: CryptoRng + RngCore, + R: CryptoRng, { let mut random_bytes = [0; 32]; rng.fill_bytes(&mut random_bytes[..]); @@ -239,7 +239,7 @@ where /// operation. pub fn new(secret: &SigningShare, rng: &mut R) -> Self where - R: CryptoRng + RngCore, + R: CryptoRng, { let hiding = Nonce::::new(secret, rng); let binding = Nonce::::new(secret, rng); @@ -429,7 +429,7 @@ pub fn preprocess( ) -> (Vec>, Vec>) where C: Ciphersuite, - R: CryptoRng + RngCore, + R: CryptoRng, { let mut signing_nonces: Vec> = Vec::with_capacity(num_nonces as usize); let mut signing_commitments: Vec> = @@ -458,7 +458,7 @@ pub fn commit( ) -> (SigningNonces, SigningCommitments) where C: Ciphersuite, - R: CryptoRng + RngCore, + R: CryptoRng, { let (mut vec_signing_nonces, mut vec_signing_commitments) = preprocess(1, secret, rng); ( diff --git a/frost-core/src/signing_key.rs b/frost-core/src/signing_key.rs index 20aa63408..fd5751d77 100644 --- a/frost-core/src/signing_key.rs +++ b/frost-core/src/signing_key.rs @@ -1,8 +1,7 @@ //! Schnorr signature signing keys use alloc::vec::Vec; - -use rand_core::{CryptoRng, RngCore}; +use rand_core::CryptoRng; use zeroize::ZeroizeOnDrop; use crate::{ @@ -24,7 +23,7 @@ where C: Ciphersuite, { /// Generate a new signing key. - pub fn new(rng: &mut R) -> SigningKey { + pub fn new(rng: &mut R) -> SigningKey { let scalar = random_nonzero::(rng); SigningKey { scalar } @@ -41,18 +40,14 @@ where } /// Create a signature `msg` using this `SigningKey`. - pub fn sign(&self, rng: R, message: &[u8]) -> Signature { + pub fn sign(&self, rng: R, message: &[u8]) -> Signature { ::single_sign(self, rng, message) } /// Create a signature `msg` using this `SigningKey` using the default /// signing. #[cfg_attr(feature = "internals", visibility::make(pub))] - pub(crate) fn default_sign( - &self, - mut rng: R, - message: &[u8], - ) -> Signature { + pub(crate) fn default_sign(&self, mut rng: R, message: &[u8]) -> Signature { let public = VerifyingKey::::from(self.clone()); let (k, R) = ::generate_nonce(&mut rng); diff --git a/frost-core/src/tests/batch.rs b/frost-core/src/tests/batch.rs index 008e0cb78..26aa38342 100644 --- a/frost-core/src/tests/batch.rs +++ b/frost-core/src/tests/batch.rs @@ -2,7 +2,7 @@ use crate::*; /// Test batch verification with a Ciphersuite. -pub fn batch_verify(mut rng: R) { +pub fn batch_verify(mut rng: R) { let mut batch = batch::Verifier::::new(); for _ in 0..1 { let sk = SigningKey::new(&mut rng); @@ -16,7 +16,7 @@ pub fn batch_verify(mut rng: R) { } /// Test failure case of batch verification with a Ciphersuite. -pub fn bad_batch_verify(mut rng: R) { +pub fn bad_batch_verify(mut rng: R) { let bad_index = 4; // must be even let mut batch = batch::Verifier::::new(); let mut items = Vec::new(); @@ -57,7 +57,7 @@ pub fn bad_batch_verify(mut rng: R) { /// Test if the empty batch fails to validate. /// Test case from NCC audit. -pub fn empty_batch_verify(rng: R) { +pub fn empty_batch_verify(rng: R) { let batch = batch::Verifier::::new(); assert!(batch.verify(rng).is_err()); } diff --git a/frost-core/src/tests/ciphersuite_generic.rs b/frost-core/src/tests/ciphersuite_generic.rs index 57349f8f6..1949fe793 100644 --- a/frost-core/src/tests/ciphersuite_generic.rs +++ b/frost-core/src/tests/ciphersuite_generic.rs @@ -3,7 +3,7 @@ #![cfg(feature = "serialization")] use alloc::{borrow::ToOwned, collections::BTreeMap, vec::Vec}; -use rand_core::{CryptoRng, RngCore}; +use rand_core::CryptoRng; use crate as frost; use crate::keys::dkg::{round1, round2}; @@ -26,7 +26,7 @@ pub fn check_zero_key_fails() { } /// Test share generation with a Ciphersuite -pub fn check_share_generation(mut rng: R) { +pub fn check_share_generation(mut rng: R) { let secret = crate::SigningKey::::new(&mut rng); // Simulate serialization / deserialization to ensure it works let secret = SigningKey::deserialize(&secret.serialize()).unwrap(); @@ -81,7 +81,7 @@ pub fn check_share_generation(mut rng: R } /// Test share generation with a Ciphersuite -pub fn check_share_generation_fails_with_invalid_signers( +pub fn check_share_generation_fails_with_invalid_signers( min_signers: u16, max_signers: u16, error: Error, @@ -105,7 +105,7 @@ pub fn check_share_generation_fails_with_invalid_signers( +pub fn check_sign_with_dealer( mut rng: R, ) -> (Vec, Signature, VerifyingKey) { //////////////////////////////////////////////////////////////////////////// @@ -165,7 +165,7 @@ pub fn check_sign_with_dealer( } /// Test FROST signing with trusted dealer fails with invalid numbers of signers. -pub fn check_sign_with_dealer_fails_with_invalid_signers( +pub fn check_sign_with_dealer_fails_with_invalid_signers( min_signers: u16, max_signers: u16, error: Error, @@ -183,7 +183,7 @@ pub fn check_sign_with_dealer_fails_with_invalid_signers( +pub fn check_dkg_part1_fails_with_invalid_signers( min_signers: u16, max_signers: u16, error: Error, @@ -201,7 +201,7 @@ pub fn check_dkg_part1_fails_with_invalid_signers( +pub fn check_sign( min_signers: u16, key_packages: BTreeMap, frost::keys::KeyPackage>, mut rng: R, @@ -442,7 +442,7 @@ fn check_aggregate_invalid_share_identifier_for_verifying_shares( +pub fn check_sign_with_dkg( mut rng: R, ) -> (Vec, Signature, VerifyingKey) where @@ -766,7 +766,7 @@ fn check_part3_corrupted_share( /// Test FROST signing with trusted dealer with a Ciphersuite, using specified /// Identifiers. -pub fn check_sign_with_dealer_and_identifiers( +pub fn check_sign_with_dealer_and_identifiers( mut rng: R, ) -> (Vec, Signature, VerifyingKey) { // Check error cases first @@ -882,7 +882,7 @@ pub fn check_identifier_derivation() { } /// Checks the signer's identifier is included in the package -pub fn check_sign_with_missing_identifier(mut rng: R) { +pub fn check_sign_with_missing_identifier(mut rng: R) { //////////////////////////////////////////////////////////////////////////// // Key generation //////////////////////////////////////////////////////////////////////////// @@ -963,7 +963,7 @@ pub fn check_sign_with_missing_identifier(mut rng: R) { +pub fn check_sign_with_incorrect_commitments(mut rng: R) { //////////////////////////////////////////////////////////////////////////// // Key generation //////////////////////////////////////////////////////////////////////////// @@ -1089,9 +1089,7 @@ fn check_verify_signature_share( /// Test FROST signing in an async context. /// The ultimate goal of the test is to ensure that types are Send + Sync. -pub async fn async_check_sign( - mut rng: R, -) { +pub async fn async_check_sign(mut rng: R) { tokio::spawn(async move { let max_signers = 5; let min_signers = 3; diff --git a/frost-core/src/tests/coefficient_commitment.rs b/frost-core/src/tests/coefficient_commitment.rs index b491108b9..ae03ffb2c 100644 --- a/frost-core/src/tests/coefficient_commitment.rs +++ b/frost-core/src/tests/coefficient_commitment.rs @@ -3,15 +3,13 @@ use crate as frost; use crate::{keys::CoefficientCommitment, tests::helpers::generate_element, Group}; use debugless_unwrap::DebuglessUnwrapExt; -use rand_core::{CryptoRng, RngCore}; +use rand_core::CryptoRng; use serde_json::Value; use crate::Ciphersuite; /// Test retrieving Element from CoefficientCommitment -pub fn check_serialization_of_coefficient_commitment( - mut rng: R, -) { +pub fn check_serialization_of_coefficient_commitment(mut rng: R) { let element = generate_element::(&mut rng); let expected = ::serialize(&element).unwrap(); @@ -24,7 +22,7 @@ pub fn check_serialization_of_coefficient_commitment(mut rng: R) { +pub fn check_create_coefficient_commitment(mut rng: R) { let element = generate_element::(&mut rng); let expected = CoefficientCommitment::::new(element); @@ -55,9 +53,7 @@ pub fn check_create_coefficient_commitment_error( } /// Test retrieve Element from CoefficientCommitment -pub fn check_get_value_of_coefficient_commitment( - mut rng: R, -) { +pub fn check_get_value_of_coefficient_commitment(mut rng: R) { let element = generate_element::(&mut rng); let coeff_commitment = frost::keys::CoefficientCommitment::::new(element); diff --git a/frost-core/src/tests/helpers.rs b/frost-core/src/tests/helpers.rs index b441e7238..3535e555f 100644 --- a/frost-core/src/tests/helpers.rs +++ b/frost-core/src/tests/helpers.rs @@ -1,10 +1,10 @@ //! Helper function for testing use crate::{Ciphersuite, Field, Group}; -use rand_core::{CryptoRng, RngCore}; +use rand_core::CryptoRng; /// Helper function for randomly generating an element -pub fn generate_element( +pub fn generate_element( rng: &mut R, ) -> <::Group as Group>::Element { let scalar = <::Field>::random(rng); diff --git a/frost-core/src/tests/proptests.rs b/frost-core/src/tests/proptests.rs index 9b0fbcb9f..4d4a9120b 100644 --- a/frost-core/src/tests/proptests.rs +++ b/frost-core/src/tests/proptests.rs @@ -2,7 +2,7 @@ use crate::*; use proptest::prelude::*; -use rand_core::{CryptoRng, RngCore}; +use rand_core::CryptoRng; /// A signature test-case, containing signature data and expected validity. #[derive(Clone, Debug)] @@ -40,7 +40,7 @@ where C: Ciphersuite, { /// Create a new SignatureCase. - pub fn new(mut rng: R, msg: Vec) -> Self { + pub fn new(mut rng: R, msg: Vec) -> Self { let sk = SigningKey::::new(&mut rng); let sig = sk.sign(&mut rng, &msg); let vk = VerifyingKey::::from(&sk); diff --git a/frost-core/src/tests/refresh.rs b/frost-core/src/tests/refresh.rs index 8f2d56f6c..cb2e9744f 100644 --- a/frost-core/src/tests/refresh.rs +++ b/frost-core/src/tests/refresh.rs @@ -1,7 +1,7 @@ //! Test for Refreshing shares #![cfg(feature = "serialization")] -use rand_core::{CryptoRng, RngCore}; +use rand_core::CryptoRng; use crate::keys::dkg::{round1, round2}; use crate::keys::generate_with_dealer; @@ -22,7 +22,7 @@ use alloc::vec::Vec; use super::ciphersuite_generic::check_sign; /// We want to test that recovered share matches the original share -pub fn check_refresh_shares_with_dealer(mut rng: R) { +pub fn check_refresh_shares_with_dealer(mut rng: R) { // Compute shares //////////////////////////////////////////////////////////////////////////// @@ -92,10 +92,7 @@ pub fn check_refresh_shares_with_dealer( } /// We want to check that shares are refreshed with valid signers -pub fn check_refresh_shares_with_dealer_fails_with_invalid_signers< - C: Ciphersuite, - R: RngCore + CryptoRng, ->( +pub fn check_refresh_shares_with_dealer_fails_with_invalid_signers( identifiers: &[Identifier], error: Error, mut rng: R, @@ -112,7 +109,7 @@ pub fn check_refresh_shares_with_dealer_fails_with_invalid_signers< /// identifiers in the public key package pub fn check_refresh_shares_with_dealer_fails_with_invalid_public_key_package< C: Ciphersuite, - R: RngCore + CryptoRng, + R: CryptoRng, >( mut rng: R, ) { @@ -162,9 +159,7 @@ pub fn check_refresh_shares_with_dealer_fails_with_invalid_public_key_package< /// Check serialisation #[cfg(feature = "serialization")] -pub fn check_refresh_shares_with_dealer_serialisation( - mut rng: R, -) { +pub fn check_refresh_shares_with_dealer_serialisation(mut rng: R) { //////////////////////////////////////////////////////////////////////////// // Old Key generation //////////////////////////////////////////////////////////////////////////// @@ -225,7 +220,7 @@ pub fn check_refresh_shares_with_dealer_serialisation( +pub fn check_refresh_shares_with_dkg( mut rng: R, ) -> (Vec, Signature, VerifyingKey) where @@ -463,10 +458,7 @@ where /// Test FROST signing with DKG with a Ciphersuite, using a smaller /// threshold than the original one. -pub fn check_refresh_shares_with_dkg_smaller_threshold< - C: Ciphersuite + PartialEq, - R: RngCore + CryptoRng, ->( +pub fn check_refresh_shares_with_dkg_smaller_threshold( mut rng: R, ) where C::Group: core::cmp::PartialEq, diff --git a/frost-core/src/tests/repairable.rs b/frost-core/src/tests/repairable.rs index e4379732e..518d0b216 100644 --- a/frost-core/src/tests/repairable.rs +++ b/frost-core/src/tests/repairable.rs @@ -3,7 +3,7 @@ use alloc::collections::BTreeMap; use debugless_unwrap::DebuglessUnwrapExt; -use rand_core::{CryptoRng, RngCore}; +use rand_core::CryptoRng; use serde_json::Value; use crate as frost; @@ -19,7 +19,7 @@ use crate::{ }; /// We want to test that recovered share matches the original share -pub fn check_rts(mut rng: R) { +pub fn check_rts(mut rng: R) { // Compute shares //////////////////////////////////////////////////////////////////////////// @@ -109,7 +109,7 @@ fn generate_scalar_from_byte_string( } /// Test repair_share_part1 -pub fn check_repair_share_part1(mut rng: R) { +pub fn check_repair_share_part1(mut rng: R) { // Compute shares let max_signers = 5; @@ -184,7 +184,7 @@ pub fn check_repair_share_part2(repair_share_helpers: &Value) { } /// Test repair_share_part3 -pub fn check_repair_share_part3( +pub fn check_repair_share_part3( mut rng: R, repair_share_helpers: &Value, ) { @@ -231,10 +231,7 @@ pub fn check_repair_share_part3( } /// Test repair share part 1 fails with invalid numbers of signers. -pub fn check_repair_share_part1_fails_with_invalid_min_signers< - C: Ciphersuite, - R: RngCore + CryptoRng, ->( +pub fn check_repair_share_part1_fails_with_invalid_min_signers( mut rng: R, ) { // Generate shares diff --git a/frost-core/src/tests/vss_commitment.rs b/frost-core/src/tests/vss_commitment.rs index 62a27556f..64c6054c8 100644 --- a/frost-core/src/tests/vss_commitment.rs +++ b/frost-core/src/tests/vss_commitment.rs @@ -7,14 +7,14 @@ use crate::{ }; use alloc::vec::Vec; use debugless_unwrap::DebuglessUnwrapExt; -use rand_core::{CryptoRng, RngCore}; +use rand_core::CryptoRng; use serde_json::Value; use crate::keys::{generate_with_dealer, IdentifierList, PublicKeyPackage}; use crate::Ciphersuite; /// Test serialize VerifiableSecretSharingCommitment -pub fn check_serialize_vss_commitment(mut rng: R) { +pub fn check_serialize_vss_commitment(mut rng: R) { // Generate test CoefficientCommitments // --- @@ -48,7 +48,7 @@ pub fn check_serialize_vss_commitment(mu } /// Test serialize_whole VerifiableSecretSharingCommitment -pub fn check_serialize_whole_vss_commitment(mut rng: R) { +pub fn check_serialize_whole_vss_commitment(mut rng: R) { // Generate test CoefficientCommitments // --- @@ -82,7 +82,7 @@ pub fn check_serialize_whole_vss_commitment(mut rng: R) { +pub fn check_deserialize_vss_commitment(mut rng: R) { // Generate test CoefficientCommitments // --- @@ -112,7 +112,7 @@ pub fn check_deserialize_vss_commitment( } /// Test deserialize_whole VerifiableSecretSharingCommitment -pub fn check_deserialize_whole_vss_commitment(mut rng: R) { +pub fn check_deserialize_whole_vss_commitment(mut rng: R) { // Generate test CoefficientCommitments // --- @@ -146,7 +146,7 @@ pub fn check_deserialize_whole_vss_commitment( +pub fn check_deserialize_vss_commitment_error( mut rng: R, commitment_helpers: &Value, ) { @@ -179,7 +179,7 @@ pub fn check_deserialize_vss_commitment_error( +pub fn check_deserialize_whole_vss_commitment_error( mut rng: R, commitment_helpers: &Value, ) { @@ -233,7 +233,7 @@ pub fn check_deserialize_whole_vss_commitment_error(mut rng: R) { +pub fn check_compute_public_key_package(mut rng: R) { let max_signers = 3; let min_signers = 2; let (secret_shares, public_key_package) = diff --git a/frost-core/src/traits.rs b/frost-core/src/traits.rs index 9ae94319f..3ed312844 100644 --- a/frost-core/src/traits.rs +++ b/frost-core/src/traits.rs @@ -6,7 +6,7 @@ use core::{ }; use alloc::{borrow::Cow, collections::BTreeMap, vec::Vec}; -use rand_core::{CryptoRng, RngCore}; +use rand_core::CryptoRng; use crate::{ challenge, @@ -54,7 +54,7 @@ pub trait Field: Copy { /// Generate a random scalar from the entire space [0, l-1] /// /// - fn random(rng: &mut R) -> Self::Scalar; + fn random(rng: &mut R) -> Self::Scalar; /// A member function of a [`Field`] that maps a [`Scalar`] to a unique byte array buf of /// fixed length Ne. @@ -237,7 +237,7 @@ pub trait Ciphersuite: Copy + PartialEq + Debug + 'static + Send + Sync { /// if required which is useful if FROST signing has been changed by the /// other Ciphersuite trait methods and regular signing should be changed /// accordingly to match. - fn single_sign( + fn single_sign( signing_key: &SigningKey, rng: R, message: &[u8], @@ -367,7 +367,7 @@ pub trait Ciphersuite: Copy + PartialEq + Debug + 'static + Send + Sync { /// Optional. Generate a nonce and a commitment to it. Used by /// [`SigningKey`] for regular (non-FROST) signing and internally by the DKG /// to generate proof-of-knowledge signatures. - fn generate_nonce( + fn generate_nonce( rng: &mut R, ) -> ( <::Field as Field>::Scalar, diff --git a/frost-ed25519/Cargo.toml b/frost-ed25519/Cargo.toml index 8a073961e..d2ea67e5c 100644 --- a/frost-ed25519/Cargo.toml +++ b/frost-ed25519/Cargo.toml @@ -1,36 +1,46 @@ [package] name = "frost-ed25519" -edition.workspace = true -rust-version.workspace = true version.workspace = true authors.workspace = true +edition.workspace = true +rust-version.workspace = true +description = "A Schnorr signature scheme over Ed25519 that supports FROST." +documentation = "https://docs.rs/frost-ed25519" readme = "README.md" -license.workspace = true +homepage.workspace = true repository.workspace = true -categories.workspace = true +license.workspace = true keywords = ["cryptography", "crypto", "ed25519", "threshold", "signature"] -description = "A Schnorr signature scheme over Ed25519 that supports FROST." +categories.workspace = true [package.metadata.docs.rs] features = ["serde"] rustdoc-args = ["--cfg", "docsrs"] +[lib] +# Disables non-criterion benchmark which is not used; prevents errors +# when using criterion-specific flags +bench = false + +[[bench]] +name = "bench" +harness = false + [dependencies] -curve25519-dalek = { version = "=4.1.3", features = ["rand_core"] } +curve25519-dalek.workspace = true document-features.workspace = true frost-core.workspace = true frost-rerandomized.workspace = true rand_core.workspace = true -sha2 = { version = "0.10.2", default-features = false } +sha2.workspace = true [dev-dependencies] criterion.workspace = true +ed25519-dalek.workspace = true frost-core = { workspace = true, features = ["test-impl"] } frost-rerandomized = { workspace = true, features = ["test-impl"] } -ed25519-dalek = "2.1.0" -insta.workspace = true hex.workspace = true -lazy_static.workspace = true +insta.workspace = true proptest.workspace = true rand.workspace = true rand_chacha.workspace = true @@ -46,12 +56,3 @@ default = ["serialization"] serde = ["frost-core/serde"] ## Enable a default serialization format. Enables `serde`. serialization = ["serde", "frost-core/serialization", "frost-rerandomized/serialization"] - -[lib] -# Disables non-criterion benchmark which is not used; prevents errors -# when using criterion-specific flags -bench = false - -[[bench]] -name = "bench" -harness = false diff --git a/frost-ed25519/README.md b/frost-ed25519/README.md index 500f8f449..535855234 100644 --- a/frost-ed25519/README.md +++ b/frost-ed25519/README.md @@ -20,7 +20,7 @@ scenario in a single thread and it abstracts away any communication between peer use frost_ed25519 as frost; use std::collections::BTreeMap; -let mut rng = rand::rngs::OsRng; +let mut rng = rand_core::UnwrapErr(rand::rngs::SysRng); let max_signers = 5; let min_signers = 3; let (shares, pubkey_package) = frost::keys::generate_with_dealer( diff --git a/frost-ed25519/benches/bench.rs b/frost-ed25519/benches/bench.rs index 4317e05b1..e3286b97c 100644 --- a/frost-ed25519/benches/bench.rs +++ b/frost-ed25519/benches/bench.rs @@ -3,13 +3,13 @@ use criterion::{criterion_group, criterion_main, Criterion}; use frost_ed25519::*; fn bench_ed25519_batch_verify(c: &mut Criterion) { - let mut rng = rand::rngs::OsRng; + let mut rng = rand_core::UnwrapErr(rand::rngs::SysRng); frost_core::benches::bench_batch_verify::(c, "ed25519", &mut rng); } fn bench_ed25519_sign(c: &mut Criterion) { - let mut rng = rand::rngs::OsRng; + let mut rng = rand_core::UnwrapErr(rand::rngs::SysRng); frost_core::benches::bench_sign::(c, "ed25519", &mut rng); } diff --git a/frost-ed25519/dkg.md b/frost-ed25519/dkg.md index 244d9ba3d..3cef012bf 100644 --- a/frost-ed25519/dkg.md +++ b/frost-ed25519/dkg.md @@ -20,11 +20,9 @@ first round of communication to ensure all participants have the same value. ```rust # // ANCHOR: dkg_import use std::collections::BTreeMap; - use frost_ed25519 as frost; -let mut rng = rand::rngs::OsRng; - +let mut rng = rand_core::UnwrapErr(rand::rngs::SysRng); let max_signers = 5; let min_signers = 3; # // ANCHOR_END: dkg_import diff --git a/frost-ed25519/src/keys/dkg.rs b/frost-ed25519/src/keys/dkg.rs index 42407bbd3..9b7646214 100644 --- a/frost-ed25519/src/keys/dkg.rs +++ b/frost-ed25519/src/keys/dkg.rs @@ -46,7 +46,7 @@ pub mod round2 { /// It returns the [`round1::SecretPackage`] that must be kept in memory /// by the participant for the other steps, and the [`round1::Package`] that /// must be sent to each other participant in the DKG run. -pub fn part1( +pub fn part1( identifier: Identifier, max_signers: u16, min_signers: u16, diff --git a/frost-ed25519/src/keys/refresh.rs b/frost-ed25519/src/keys/refresh.rs index bb4b6dd64..2d44f2bdb 100644 --- a/frost-ed25519/src/keys/refresh.rs +++ b/frost-ed25519/src/keys/refresh.rs @@ -5,14 +5,14 @@ use crate::{ frost, keys::dkg::{round1, round2}, - CryptoRng, Error, Identifier, RngCore, + CryptoRng, Error, Identifier, }; use alloc::{collections::btree_map::BTreeMap, vec::Vec}; use super::{KeyPackage, PublicKeyPackage, SecretShare}; /// Refer to [`frost_core::keys::refresh::compute_refreshing_shares`]. -pub fn compute_refreshing_shares( +pub fn compute_refreshing_shares( old_pub_key_package: PublicKeyPackage, identifiers: &[Identifier], mut rng: &mut R, @@ -29,7 +29,7 @@ pub fn refresh_share( } /// Refer to [`frost_core::keys::refresh::refresh_dkg_part1`]. -pub fn refresh_dkg_part1( +pub fn refresh_dkg_part1( identifier: Identifier, max_signers: u16, min_signers: u16, diff --git a/frost-ed25519/src/keys/repairable.rs b/frost-ed25519/src/keys/repairable.rs index 9e809ed30..74d9481cd 100644 --- a/frost-ed25519/src/keys/repairable.rs +++ b/frost-ed25519/src/keys/repairable.rs @@ -10,7 +10,7 @@ use crate::keys::{KeyPackage, PublicKeyPackage}; // This is imported separately to make `gencode` work. // (if it were below, the position of the import would vary between ciphersuites // after `cargo fmt`) -use crate::{frost, Ciphersuite, CryptoRng, Identifier, RngCore}; +use crate::{frost, Ciphersuite, CryptoRng, Identifier}; use crate::{Ed25519Sha512, Error}; /// A delta value which is the output of part 1 of RTS. @@ -26,7 +26,7 @@ pub type Sigma = frost::keys::repairable::Sigma; /// `participant` recover their share. /// /// Returns a BTreeMap mapping which value should be sent to which participant. -pub fn repair_share_part1( +pub fn repair_share_part1( helpers: &[Identifier], key_package_i: &KeyPackage, rng: &mut R, @@ -62,22 +62,17 @@ pub fn repair_share_part3( #[cfg(test)] mod tests { - - use lazy_static::lazy_static; - - use serde_json::Value; - use crate::Ed25519Sha512; + use serde_json::Value; + use std::sync::LazyLock; - lazy_static! { - pub static ref REPAIR_SHARE: Value = - serde_json::from_str(include_str!("../../tests/helpers/repair-share.json").trim()) - .unwrap(); - } + static REPAIR_SHARE: LazyLock = LazyLock::new(|| { + serde_json::from_str(include_str!("../../tests/helpers/repair-share.json").trim()).unwrap() + }); #[test] fn check_repair_share_part1() { - let rng = rand::rngs::OsRng; + let rng = rand_core::UnwrapErr(rand::rngs::SysRng); frost_core::tests::repairable::check_repair_share_part1::(rng); } @@ -89,7 +84,7 @@ mod tests { #[test] fn check_repair_share_part3() { - let rng = rand::rngs::OsRng; + let rng = rand_core::UnwrapErr(rand::rngs::SysRng); frost_core::tests::repairable::check_repair_share_part3::( rng, &REPAIR_SHARE, @@ -98,7 +93,7 @@ mod tests { #[test] fn check_repair_share_part1_fails_with_invalid_min_signers() { - let rng = rand::rngs::OsRng; + let rng = rand_core::UnwrapErr(rand::rngs::SysRng); frost_core::tests::repairable::check_repair_share_part1_fails_with_invalid_min_signers::< Ed25519Sha512, _, diff --git a/frost-ed25519/src/lib.rs b/frost-ed25519/src/lib.rs index cb7a818bf..4e57d5f1a 100644 --- a/frost-ed25519/src/lib.rs +++ b/frost-ed25519/src/lib.rs @@ -5,6 +5,9 @@ #![doc = include_str!("../README.md")] #![doc = document_features::document_features!()] +#[cfg(test)] +extern crate std; + extern crate alloc; use alloc::collections::BTreeMap; @@ -16,7 +19,7 @@ use curve25519_dalek::{ traits::Identity, }; use frost_rerandomized::RandomizedCiphersuite; -use rand_core::{CryptoRng, RngCore}; +use rand_core::CryptoRng; use sha2::{Digest, Sha512}; use frost_core as frost; @@ -60,7 +63,7 @@ impl Field for Ed25519ScalarField { } } - fn random(rng: &mut R) -> Self::Scalar { + fn random(rng: &mut R) -> Self::Scalar { Scalar::random(rng) } @@ -241,7 +244,7 @@ pub mod keys { /// Allows all participants' keys to be generated using a central, trusted /// dealer. - pub fn generate_with_dealer( + pub fn generate_with_dealer( max_signers: u16, min_signers: u16, identifiers: IdentifierList, @@ -256,7 +259,7 @@ pub mod keys { /// instead of generating a fresh one. This is useful in scenarios where /// the key needs to be generated externally or must be derived from e.g. a /// seed phrase. - pub fn split( + pub fn split( secret: &SigningKey, max_signers: u16, min_signers: u16, @@ -357,7 +360,7 @@ pub mod round1 { /// operation. pub fn commit(secret: &SigningShare, rng: &mut RNG) -> (SigningNonces, SigningCommitments) where - RNG: CryptoRng + RngCore, + RNG: CryptoRng, { frost::round1::commit::(secret, rng) } diff --git a/frost-ed25519/src/tests/batch.rs b/frost-ed25519/src/tests/batch.rs index a57301f01..836f4d9d7 100644 --- a/frost-ed25519/src/tests/batch.rs +++ b/frost-ed25519/src/tests/batch.rs @@ -2,21 +2,21 @@ use crate::*; #[test] fn check_batch_verify() { - let rng = rand::rngs::OsRng; + let rng = rand_core::UnwrapErr(rand::rngs::SysRng); frost_core::tests::batch::batch_verify::(rng); } #[test] fn check_bad_batch_verify() { - let rng = rand::rngs::OsRng; + let rng = rand_core::UnwrapErr(rand::rngs::SysRng); frost_core::tests::batch::bad_batch_verify::(rng); } #[test] fn empty_batch_verify() { - let rng = rand::rngs::OsRng; + let rng = rand_core::UnwrapErr(rand::rngs::SysRng); frost_core::tests::batch::empty_batch_verify::(rng); } diff --git a/frost-ed25519/src/tests/coefficient_commitment.rs b/frost-ed25519/src/tests/coefficient_commitment.rs index d45994e83..3614f1e85 100644 --- a/frost-ed25519/src/tests/coefficient_commitment.rs +++ b/frost-ed25519/src/tests/coefficient_commitment.rs @@ -1,18 +1,17 @@ -use lazy_static::lazy_static; use serde_json::Value; +use std::sync::LazyLock; use crate::*; // Tests for serialization and deserialization of CoefficientCommitment -lazy_static! { - pub static ref ELEMENTS: Value = - serde_json::from_str(include_str!("../../tests/helpers/elements.json").trim()).unwrap(); -} +static ELEMENTS: LazyLock = LazyLock::new(|| { + serde_json::from_str(include_str!("../../tests/helpers/elements.json").trim()).unwrap() +}); #[test] fn check_serialization_of_coefficient_commitment() { - let rng = rand::rngs::OsRng; + let rng = rand_core::UnwrapErr(rand::rngs::SysRng); frost_core::tests::coefficient_commitment::check_serialization_of_coefficient_commitment::< Ed25519Sha512, _, @@ -21,7 +20,7 @@ fn check_serialization_of_coefficient_commitment() { #[test] fn check_create_coefficient_commitment() { - let rng = rand::rngs::OsRng; + let rng = rand_core::UnwrapErr(rand::rngs::SysRng); frost_core::tests::coefficient_commitment::check_create_coefficient_commitment::< Ed25519Sha512, _, @@ -36,7 +35,7 @@ fn check_create_coefficient_commitment_error() { #[test] fn check_get_value_of_coefficient_commitment() { - let rng = rand::rngs::OsRng; + let rng = rand_core::UnwrapErr(rand::rngs::SysRng); frost_core::tests::coefficient_commitment::check_get_value_of_coefficient_commitment::< Ed25519Sha512, diff --git a/frost-ed25519/src/tests/vss_commitment.rs b/frost-ed25519/src/tests/vss_commitment.rs index 3e0fcd26e..78864e1d4 100644 --- a/frost-ed25519/src/tests/vss_commitment.rs +++ b/frost-ed25519/src/tests/vss_commitment.rs @@ -1,24 +1,23 @@ -use lazy_static::lazy_static; use serde_json::Value; +use std::sync::LazyLock; use crate::*; // Tests for serialization and deserialization VerifiableSecretSharingCommitment -lazy_static! { - pub static ref ELEMENTS: Value = - serde_json::from_str(include_str!("../../tests/helpers/elements.json").trim()).unwrap(); -} +static ELEMENTS: LazyLock = LazyLock::new(|| { + serde_json::from_str(include_str!("../../tests/helpers/elements.json").trim()).unwrap() +}); #[test] fn check_serialize_vss_commitment() { - let rng = rand::rngs::OsRng; + let rng = rand_core::UnwrapErr(rand::rngs::SysRng); frost_core::tests::vss_commitment::check_serialize_vss_commitment::(rng); } #[test] fn check_serialize_whole_vss_commitment() { - let rng = rand::rngs::OsRng; + let rng = rand_core::UnwrapErr(rand::rngs::SysRng); frost_core::tests::vss_commitment::check_serialize_whole_vss_commitment::( rng, ); @@ -26,13 +25,13 @@ fn check_serialize_whole_vss_commitment() { #[test] fn check_deserialize_vss_commitment() { - let rng = rand::rngs::OsRng; + let rng = rand_core::UnwrapErr(rand::rngs::SysRng); frost_core::tests::vss_commitment::check_deserialize_vss_commitment::(rng); } #[test] fn check_deserialize_whole_vss_commitment() { - let rng = rand::rngs::OsRng; + let rng = rand_core::UnwrapErr(rand::rngs::SysRng); frost_core::tests::vss_commitment::check_deserialize_whole_vss_commitment::( rng, ); @@ -40,7 +39,7 @@ fn check_deserialize_whole_vss_commitment() { #[test] fn check_deserialize_vss_commitment_error() { - let rng = rand::rngs::OsRng; + let rng = rand_core::UnwrapErr(rand::rngs::SysRng); frost_core::tests::vss_commitment::check_deserialize_vss_commitment_error::( rng, &ELEMENTS, ); @@ -48,7 +47,7 @@ fn check_deserialize_vss_commitment_error() { #[test] fn check_deserialize_whole_vss_commitment_error() { - let rng = rand::rngs::OsRng; + let rng = rand_core::UnwrapErr(rand::rngs::SysRng); frost_core::tests::vss_commitment::check_deserialize_whole_vss_commitment_error::< Ed25519Sha512, _, @@ -57,6 +56,6 @@ fn check_deserialize_whole_vss_commitment_error() { #[test] fn check_compute_public_key_package() { - let rng = rand::rngs::OsRng; + let rng = rand_core::UnwrapErr(rand::rngs::SysRng); frost_core::tests::vss_commitment::check_compute_public_key_package::(rng); } diff --git a/frost-ed25519/tests/common_traits_tests.rs b/frost-ed25519/tests/common_traits_tests.rs index db173929b..9d30215cd 100644 --- a/frost-ed25519/tests/common_traits_tests.rs +++ b/frost-ed25519/tests/common_traits_tests.rs @@ -19,7 +19,7 @@ fn check_common_traits_for_type(v: #[test] fn check_signing_key_common_traits() { - let mut rng = rand::rngs::OsRng; + let mut rng = rand_core::UnwrapErr(rand::rngs::SysRng); let signing_key = SigningKey::new(&mut rng); check_common_traits_for_type(signing_key); } diff --git a/frost-ed25519/tests/integration_tests.rs b/frost-ed25519/tests/integration_tests.rs index 2cc6620a6..a2ba70708 100644 --- a/frost-ed25519/tests/integration_tests.rs +++ b/frost-ed25519/tests/integration_tests.rs @@ -1,6 +1,6 @@ use frost_ed25519::*; -use lazy_static::lazy_static; use serde_json::Value; +use std::sync::LazyLock; #[test] fn check_zero_key_fails() { @@ -9,14 +9,14 @@ fn check_zero_key_fails() { #[test] fn check_sign_with_dkg() { - let rng = rand::rngs::OsRng; + let rng = rand_core::UnwrapErr(rand::rngs::SysRng); frost_core::tests::ciphersuite_generic::check_sign_with_dkg::(rng); } #[test] fn check_dkg_part1_fails_with_invalid_signers_min_signers() { - let rng = rand::rngs::OsRng; + let rng = rand_core::UnwrapErr(rand::rngs::SysRng); let min_signers = 1; let max_signers = 3; @@ -30,7 +30,7 @@ fn check_dkg_part1_fails_with_invalid_signers_min_signers() { #[test] fn check_dkg_part1_fails_with_min_signers_greater_than_max() { - let rng = rand::rngs::OsRng; + let rng = rand_core::UnwrapErr(rand::rngs::SysRng); let min_signers = 3; let max_signers = 2; @@ -44,7 +44,7 @@ fn check_dkg_part1_fails_with_min_signers_greater_than_max() { #[test] fn check_dkg_part1_fails_with_invalid_signers_max_signers() { - let rng = rand::rngs::OsRng; + let rng = rand_core::UnwrapErr(rand::rngs::SysRng); let min_signers = 3; let max_signers = 1; @@ -58,21 +58,21 @@ fn check_dkg_part1_fails_with_invalid_signers_max_signers() { #[test] fn check_rts() { - let rng = rand::rngs::OsRng; + let rng = rand_core::UnwrapErr(rand::rngs::SysRng); frost_core::tests::repairable::check_rts::(rng); } #[test] fn check_refresh_shares_with_dealer() { - let rng = rand::rngs::OsRng; + let rng = rand_core::UnwrapErr(rand::rngs::SysRng); frost_core::tests::refresh::check_refresh_shares_with_dealer::(rng); } #[test] fn check_refresh_shares_with_dealer_serialisation() { - let rng = rand::rngs::OsRng; + let rng = rand_core::UnwrapErr(rand::rngs::SysRng); frost_core::tests::refresh::check_refresh_shares_with_dealer_serialisation::( rng, @@ -81,7 +81,7 @@ fn check_refresh_shares_with_dealer_serialisation() { #[test] fn check_refresh_shares_with_dealer_fails_with_invalid_public_key_package() { - let rng = rand::rngs::OsRng; + let rng = rand_core::UnwrapErr(rand::rngs::SysRng); frost_core::tests::refresh::check_refresh_shares_with_dealer_fails_with_invalid_public_key_package::< Ed25519Sha512, @@ -91,7 +91,7 @@ fn check_refresh_shares_with_dealer_fails_with_invalid_public_key_package() { #[test] fn check_refresh_shares_with_dealer_fails_with_invalid_identifier() { - let rng = rand::rngs::OsRng; + let rng = rand_core::UnwrapErr(rand::rngs::SysRng); let identifiers = vec![ Identifier::try_from(8).unwrap(), Identifier::try_from(3).unwrap(), @@ -108,14 +108,14 @@ fn check_refresh_shares_with_dealer_fails_with_invalid_identifier() { #[test] fn check_refresh_shares_with_dkg() { - let rng = rand::rngs::OsRng; + let rng = rand_core::UnwrapErr(rand::rngs::SysRng); frost_core::tests::refresh::check_refresh_shares_with_dkg::(rng); } #[test] fn check_refresh_shares_with_dkg_smaller_threshold() { - let rng = rand::rngs::OsRng; + let rng = rand_core::UnwrapErr(rand::rngs::SysRng); frost_core::tests::refresh::check_refresh_shares_with_dkg_smaller_threshold::( rng, @@ -124,14 +124,14 @@ fn check_refresh_shares_with_dkg_smaller_threshold() { #[test] fn check_sign_with_dealer() { - let rng = rand::rngs::OsRng; + let rng = rand_core::UnwrapErr(rand::rngs::SysRng); frost_core::tests::ciphersuite_generic::check_sign_with_dealer::(rng); } #[test] fn check_sign_with_dealer_fails_with_invalid_min_signers() { - let rng = rand::rngs::OsRng; + let rng = rand_core::UnwrapErr(rand::rngs::SysRng); let min_signers = 1; let max_signers = 3; @@ -145,7 +145,7 @@ fn check_sign_with_dealer_fails_with_invalid_min_signers() { #[test] fn check_sign_with_dealer_fails_with_min_signers_greater_than_max() { - let rng = rand::rngs::OsRng; + let rng = rand_core::UnwrapErr(rand::rngs::SysRng); let min_signers = 3; let max_signers = 2; @@ -159,7 +159,7 @@ fn check_sign_with_dealer_fails_with_min_signers_greater_than_max() { #[test] fn check_sign_with_dealer_fails_with_invalid_max_signers() { - let rng = rand::rngs::OsRng; + let rng = rand_core::UnwrapErr(rand::rngs::SysRng); let min_signers = 3; let max_signers = 1; @@ -175,13 +175,13 @@ fn check_sign_with_dealer_fails_with_invalid_max_signers() { /// value is working. #[test] fn check_share_generation_ed25519_sha512() { - let rng = rand::rngs::OsRng; + let rng = rand_core::UnwrapErr(rand::rngs::SysRng); frost_core::tests::ciphersuite_generic::check_share_generation::(rng); } #[test] fn check_share_generation_fails_with_invalid_min_signers() { - let rng = rand::rngs::OsRng; + let rng = rand_core::UnwrapErr(rand::rngs::SysRng); let min_signers = 0; let max_signers = 3; @@ -195,7 +195,7 @@ fn check_share_generation_fails_with_invalid_min_signers() { #[test] fn check_share_generation_fails_with_min_signers_greater_than_max() { - let rng = rand::rngs::OsRng; + let rng = rand_core::UnwrapErr(rand::rngs::SysRng); let min_signers = 3; let max_signers = 2; @@ -209,7 +209,7 @@ fn check_share_generation_fails_with_min_signers_greater_than_max() { #[test] fn check_share_generation_fails_with_invalid_max_signers() { - let rng = rand::rngs::OsRng; + let rng = rand_core::UnwrapErr(rand::rngs::SysRng); let min_signers = 3; let max_signers = 0; @@ -221,17 +221,18 @@ fn check_share_generation_fails_with_invalid_max_signers() { >(min_signers, max_signers, error, rng); } -lazy_static! { - pub static ref VECTORS: Value = - serde_json::from_str(include_str!("../tests/helpers/vectors.json").trim()) - .expect("Test vector is valid JSON"); - pub static ref VECTORS_BIG_IDENTIFIER: Value = - serde_json::from_str(include_str!("../tests/helpers/vectors-big-identifier.json").trim()) - .expect("Test vector is valid JSON"); - pub static ref VECTORS_DKG: Value = - serde_json::from_str(include_str!("../tests/helpers/vectors_dkg.json").trim()) - .expect("Test vector is valid JSON"); -} +static VECTORS: LazyLock = LazyLock::new(|| { + serde_json::from_str(include_str!("../tests/helpers/vectors.json").trim()) + .expect("Test vector is valid JSON") +}); +static VECTORS_BIG_IDENTIFIER: LazyLock = LazyLock::new(|| { + serde_json::from_str(include_str!("../tests/helpers/vectors-big-identifier.json").trim()) + .expect("Test vector is valid JSON") +}); +static VECTORS_DKG: LazyLock = LazyLock::new(|| { + serde_json::from_str(include_str!("../tests/helpers/vectors_dkg.json").trim()) + .expect("Test vector is valid JSON") +}); #[test] fn check_sign_with_test_vectors() { @@ -273,7 +274,7 @@ fn check_identifier_generation() -> Result<(), Error> { #[test] fn check_sign_with_dealer_and_identifiers() { - let rng = rand::rngs::OsRng; + let rng = rand_core::UnwrapErr(rand::rngs::SysRng); frost_core::tests::ciphersuite_generic::check_sign_with_dealer_and_identifiers::< Ed25519Sha512, @@ -283,7 +284,7 @@ fn check_sign_with_dealer_and_identifiers() { #[test] fn check_sign_with_missing_identifier() { - let rng = rand::rngs::OsRng; + let rng = rand_core::UnwrapErr(rand::rngs::SysRng); frost_core::tests::ciphersuite_generic::check_sign_with_missing_identifier::( rng, ); @@ -291,7 +292,7 @@ fn check_sign_with_missing_identifier() { #[test] fn check_sign_with_incorrect_commitments() { - let rng = rand::rngs::OsRng; + let rng = rand_core::UnwrapErr(rand::rngs::SysRng); frost_core::tests::ciphersuite_generic::check_sign_with_incorrect_commitments::( rng, ); @@ -300,7 +301,7 @@ fn check_sign_with_incorrect_commitments() { #[tokio::test] async fn check_async_sign_with_dealer() { tokio::spawn(async { - let rng = rand::rngs::OsRng; + let rng = rand_core::UnwrapErr(rand::rngs::SysRng); frost_core::tests::ciphersuite_generic::async_check_sign::(rng).await; }) .await diff --git a/frost-ed25519/tests/interoperability_tests.rs b/frost-ed25519/tests/interoperability_tests.rs index e758ee248..16b060ac9 100644 --- a/frost-ed25519/tests/interoperability_tests.rs +++ b/frost-ed25519/tests/interoperability_tests.rs @@ -5,7 +5,7 @@ mod helpers; #[test] fn check_interoperability_in_sign_with_dkg() { - let rng = rand::rngs::OsRng; + let rng = rand_core::UnwrapErr(rand::rngs::SysRng); // Test with multiple keys/signatures to better exercise the key generation // and the interoperability check. A smaller number of iterations is used @@ -20,7 +20,7 @@ fn check_interoperability_in_sign_with_dkg() { #[test] fn check_interoperability_in_sign_with_dealer() { - let rng = rand::rngs::OsRng; + let rng = rand_core::UnwrapErr(rand::rngs::SysRng); // Test with multiple keys/signatures to better exercise the key generation // and the interoperability check. diff --git a/frost-ed25519/tests/rerandomized_tests.rs b/frost-ed25519/tests/rerandomized_tests.rs index 121738744..0038e209c 100644 --- a/frost-ed25519/tests/rerandomized_tests.rs +++ b/frost-ed25519/tests/rerandomized_tests.rs @@ -2,7 +2,7 @@ use frost_ed25519::Ed25519Sha512; #[test] fn check_randomized_sign_with_dealer() { - let rng = rand::rngs::OsRng; + let rng = rand_core::UnwrapErr(rand::rngs::SysRng); let (_msg, _group_signature, _group_pubkey) = frost_rerandomized::tests::check_randomized_sign_with_dealer::(rng); diff --git a/frost-ed25519/tests/serde_tests.rs b/frost-ed25519/tests/serde_tests.rs index a36c278b9..2dabf4f72 100644 --- a/frost-ed25519/tests/serde_tests.rs +++ b/frost-ed25519/tests/serde_tests.rs @@ -19,7 +19,7 @@ fn check_signing_commitments_serialization() { let commitments = samples::signing_commitments(); let json = serde_json::to_string_pretty(&commitments).unwrap(); - println!("{}", json); + println!("{json}"); let decoded_commitments: SigningCommitments = serde_json::from_str(&json).unwrap(); assert!(commitments == decoded_commitments); @@ -89,7 +89,7 @@ fn check_signing_package_serialization() { let signing_package = samples::signing_package(); let json = serde_json::to_string_pretty(&signing_package).unwrap(); - println!("{}", json); + println!("{json}"); let decoded_signing_package: SigningPackage = serde_json::from_str(&json).unwrap(); assert!(signing_package == decoded_signing_package); @@ -204,7 +204,7 @@ fn check_signature_share_serialization() { let signature_share = samples::signature_share(); let json = serde_json::to_string_pretty(&signature_share).unwrap(); - println!("{}", json); + println!("{json}"); let decoded_signature_share: SignatureShare = serde_json::from_str(&json).unwrap(); assert!(signature_share == decoded_signature_share); @@ -258,7 +258,7 @@ fn check_secret_share_serialization() { let secret_share = samples::secret_share(); let json = serde_json::to_string_pretty(&secret_share).unwrap(); - println!("{}", json); + println!("{json}"); let decoded_secret_share: SecretShare = serde_json::from_str(&json).unwrap(); assert!(secret_share == decoded_secret_share); @@ -342,7 +342,7 @@ fn check_key_package_serialization() { let key_package = samples::key_package(); let json = serde_json::to_string_pretty(&key_package).unwrap(); - println!("{}", json); + println!("{json}"); let decoded_key_package: KeyPackage = serde_json::from_str(&json).unwrap(); assert!(key_package == decoded_key_package); @@ -437,7 +437,7 @@ fn check_public_key_package_serialization() { let public_key_package = samples::public_key_package_new(); let json = serde_json::to_string_pretty(&public_key_package).unwrap(); - println!("{}", json); + println!("{json}"); let decoded_public_key_package: PublicKeyPackage = serde_json::from_str(&json).unwrap(); assert!(public_key_package == decoded_public_key_package); @@ -532,7 +532,7 @@ fn check_round1_package_serialization() { let round1_package = samples::round1_package(); let json = serde_json::to_string_pretty(&round1_package).unwrap(); - println!("{}", json); + println!("{json}"); let decoded_round1_package: round1::Package = serde_json::from_str(&json).unwrap(); assert!(round1_package == decoded_round1_package); @@ -598,7 +598,7 @@ fn check_round2_package_serialization() { let round2_package = samples::round2_package(); let json = serde_json::to_string_pretty(&round2_package).unwrap(); - println!("{}", json); + println!("{json}"); let decoded_round2_package: round2::Package = serde_json::from_str(&json).unwrap(); assert!(round2_package == decoded_round2_package); diff --git a/frost-ed448/Cargo.toml b/frost-ed448/Cargo.toml index 5c26e30ee..e151ba184 100644 --- a/frost-ed448/Cargo.toml +++ b/frost-ed448/Cargo.toml @@ -1,35 +1,46 @@ [package] name = "frost-ed448" -edition.workspace = true -rust-version.workspace = true version.workspace = true authors.workspace = true +edition.workspace = true +rust-version.workspace = true +description = "A Schnorr signature scheme over Ed448 that supports FROST." +documentation = "https://docs.rs/frost-ed448" readme = "README.md" -license.workspace = true +homepage.workspace = true repository.workspace = true -categories.workspace = true +license.workspace = true keywords = ["cryptography", "crypto", "ed448", "threshold", "signature"] -description = "A Schnorr signature scheme over Ed448 that supports FROST." +categories.workspace = true [package.metadata.docs.rs] features = ["serde"] rustdoc-args = ["--cfg", "docsrs"] +[lib] +# Disables non-criterion benchmark which is not used; prevents errors +# when using criterion-specific flags +bench = false + +[[bench]] +name = "bench" +harness = false + [dependencies] document-features.workspace = true -ed448-goldilocks = { version = "0.9.0" } +ed448-goldilocks.workspace = true frost-core.workspace = true frost-rerandomized.workspace = true rand_core.workspace = true -sha3 = { version = "0.10.6", default-features = false } +sha3.workspace = true +shake.workspace = true [dev-dependencies] criterion.workspace = true frost-core = { workspace = true, features = ["test-impl"] } frost-rerandomized = { workspace = true, features = ["test-impl"] } -lazy_static.workspace = true -insta.workspace = true hex.workspace = true +insta.workspace = true proptest.workspace = true rand.workspace = true rand_chacha.workspace = true @@ -45,12 +56,3 @@ default = ["serialization"] serde = ["frost-core/serde"] ## Enable a default serialization format. Enables `serde`. serialization = ["serde", "frost-core/serialization", "frost-rerandomized/serialization"] - -[lib] -# Disables non-criterion benchmark which is not used; prevents errors -# when using criterion-specific flags -bench = false - -[[bench]] -name = "bench" -harness = false diff --git a/frost-ed448/README.md b/frost-ed448/README.md index 77f1eb8c7..579552eb4 100644 --- a/frost-ed448/README.md +++ b/frost-ed448/README.md @@ -20,7 +20,7 @@ scenario in a single thread and it abstracts away any communication between peer use frost_ed448 as frost; use std::collections::BTreeMap; -let mut rng = rand::rngs::OsRng; +let mut rng = rand_core::UnwrapErr(rand::rngs::SysRng); let max_signers = 5; let min_signers = 3; let (shares, pubkey_package) = frost::keys::generate_with_dealer( diff --git a/frost-ed448/benches/bench.rs b/frost-ed448/benches/bench.rs index ba40feb33..13f60b26a 100644 --- a/frost-ed448/benches/bench.rs +++ b/frost-ed448/benches/bench.rs @@ -5,13 +5,13 @@ use frost_ed448::*; // bench_ed448_batch_verify not included until batch verification is fixed for Ed448 #[allow(unused)] fn bench_ed448_batch_verify(c: &mut Criterion) { - let mut rng = rand::rngs::OsRng; + let mut rng = rand_core::UnwrapErr(rand::rngs::SysRng); frost_core::benches::bench_batch_verify::(c, "ed448", &mut rng); } fn bench_ed448_sign(c: &mut Criterion) { - let mut rng = rand::rngs::OsRng; + let mut rng = rand_core::UnwrapErr(rand::rngs::SysRng); frost_core::benches::bench_sign::(c, "ed448", &mut rng); } diff --git a/frost-ed448/dkg.md b/frost-ed448/dkg.md index ff304b959..6ffb864d8 100644 --- a/frost-ed448/dkg.md +++ b/frost-ed448/dkg.md @@ -20,11 +20,9 @@ first round of communication to ensure all participants have the same value. ```rust # // ANCHOR: dkg_import use std::collections::BTreeMap; - use frost_ed448 as frost; -let mut rng = rand::rngs::OsRng; - +let mut rng = rand_core::UnwrapErr(rand::rngs::SysRng); let max_signers = 5; let min_signers = 3; # // ANCHOR_END: dkg_import diff --git a/frost-ed448/src/keys/dkg.rs b/frost-ed448/src/keys/dkg.rs index 42407bbd3..9b7646214 100644 --- a/frost-ed448/src/keys/dkg.rs +++ b/frost-ed448/src/keys/dkg.rs @@ -46,7 +46,7 @@ pub mod round2 { /// It returns the [`round1::SecretPackage`] that must be kept in memory /// by the participant for the other steps, and the [`round1::Package`] that /// must be sent to each other participant in the DKG run. -pub fn part1( +pub fn part1( identifier: Identifier, max_signers: u16, min_signers: u16, diff --git a/frost-ed448/src/keys/refresh.rs b/frost-ed448/src/keys/refresh.rs index bb4b6dd64..2d44f2bdb 100644 --- a/frost-ed448/src/keys/refresh.rs +++ b/frost-ed448/src/keys/refresh.rs @@ -5,14 +5,14 @@ use crate::{ frost, keys::dkg::{round1, round2}, - CryptoRng, Error, Identifier, RngCore, + CryptoRng, Error, Identifier, }; use alloc::{collections::btree_map::BTreeMap, vec::Vec}; use super::{KeyPackage, PublicKeyPackage, SecretShare}; /// Refer to [`frost_core::keys::refresh::compute_refreshing_shares`]. -pub fn compute_refreshing_shares( +pub fn compute_refreshing_shares( old_pub_key_package: PublicKeyPackage, identifiers: &[Identifier], mut rng: &mut R, @@ -29,7 +29,7 @@ pub fn refresh_share( } /// Refer to [`frost_core::keys::refresh::refresh_dkg_part1`]. -pub fn refresh_dkg_part1( +pub fn refresh_dkg_part1( identifier: Identifier, max_signers: u16, min_signers: u16, diff --git a/frost-ed448/src/keys/repairable.rs b/frost-ed448/src/keys/repairable.rs index f1e21d479..145bbfd5c 100644 --- a/frost-ed448/src/keys/repairable.rs +++ b/frost-ed448/src/keys/repairable.rs @@ -10,7 +10,7 @@ use crate::keys::{KeyPackage, PublicKeyPackage}; // This is imported separately to make `gencode` work. // (if it were below, the position of the import would vary between ciphersuites // after `cargo fmt`) -use crate::{frost, Ciphersuite, CryptoRng, Identifier, RngCore}; +use crate::{frost, Ciphersuite, CryptoRng, Identifier}; use crate::{Ed448Shake256, Error}; /// A delta value which is the output of part 1 of RTS. @@ -26,7 +26,7 @@ pub type Sigma = frost::keys::repairable::Sigma; /// `participant` recover their share. /// /// Returns a BTreeMap mapping which value should be sent to which participant. -pub fn repair_share_part1( +pub fn repair_share_part1( helpers: &[Identifier], key_package_i: &KeyPackage, rng: &mut R, @@ -62,22 +62,17 @@ pub fn repair_share_part3( #[cfg(test)] mod tests { - - use lazy_static::lazy_static; - - use serde_json::Value; - use crate::Ed448Shake256; + use serde_json::Value; + use std::sync::LazyLock; - lazy_static! { - pub static ref REPAIR_SHARE: Value = - serde_json::from_str(include_str!("../../tests/helpers/repair-share.json").trim()) - .unwrap(); - } + static REPAIR_SHARE: LazyLock = LazyLock::new(|| { + serde_json::from_str(include_str!("../../tests/helpers/repair-share.json").trim()).unwrap() + }); #[test] fn check_repair_share_part1() { - let rng = rand::rngs::OsRng; + let rng = rand_core::UnwrapErr(rand::rngs::SysRng); frost_core::tests::repairable::check_repair_share_part1::(rng); } @@ -89,7 +84,7 @@ mod tests { #[test] fn check_repair_share_part3() { - let rng = rand::rngs::OsRng; + let rng = rand_core::UnwrapErr(rand::rngs::SysRng); frost_core::tests::repairable::check_repair_share_part3::( rng, &REPAIR_SHARE, @@ -98,7 +93,7 @@ mod tests { #[test] fn check_repair_share_part1_fails_with_invalid_min_signers() { - let rng = rand::rngs::OsRng; + let rng = rand_core::UnwrapErr(rand::rngs::SysRng); frost_core::tests::repairable::check_repair_share_part1_fails_with_invalid_min_signers::< Ed448Shake256, _, diff --git a/frost-ed448/src/lib.rs b/frost-ed448/src/lib.rs index 154f445f6..9980e69b2 100644 --- a/frost-ed448/src/lib.rs +++ b/frost-ed448/src/lib.rs @@ -1,23 +1,22 @@ +#![no_std] #![allow(non_snake_case)] #![deny(missing_docs)] #![cfg_attr(docsrs, feature(doc_cfg))] #![doc = include_str!("../README.md")] #![doc = document_features::document_features!()] +#[cfg(test)] +extern crate std; + extern crate alloc; use alloc::collections::BTreeMap; -use ed448_goldilocks::{ - curve::{edwards::CompressedEdwardsY, ExtendedPoint}, - Scalar, -}; +use ed448_goldilocks::{CompressedEdwardsY, EdwardsPoint, EdwardsScalar}; use frost_rerandomized::RandomizedCiphersuite; -use rand_core::{CryptoRng, RngCore}; -use sha3::{ - digest::{ExtendableOutput, Update, XofReader}, - Shake256, -}; +use rand_core::CryptoRng; +use sha3::digest::{ExtendableOutput, Update, XofReader}; +use shake::Shake256; use frost_core as frost; @@ -38,16 +37,16 @@ pub type Error = frost_core::Error; pub struct Ed448ScalarField; impl Field for Ed448ScalarField { - type Scalar = Scalar; + type Scalar = EdwardsScalar; type Serialization = [u8; 57]; fn zero() -> Self::Scalar { - Scalar::zero() + EdwardsScalar::ZERO } fn one() -> Self::Scalar { - Scalar::one() + EdwardsScalar::ONE } fn invert(scalar: &Self::Scalar) -> Result { @@ -58,16 +57,16 @@ impl Field for Ed448ScalarField { } } - fn random(rng: &mut R) -> Self::Scalar { - Scalar::random(rng) + fn random(rng: &mut R) -> Self::Scalar { + EdwardsScalar::random(rng) } fn serialize(scalar: &Self::Scalar) -> Self::Serialization { - scalar.to_bytes_rfc_8032() + scalar.to_bytes_rfc_8032().into() } fn deserialize(buf: &Self::Serialization) -> Result { - match Scalar::from_canonical_bytes(*buf) { + match EdwardsScalar::from_canonical_bytes(buf.into()).into() { Some(s) => Ok(s), None => Err(FieldError::MalformedScalar), } @@ -85,42 +84,42 @@ pub struct Ed448Group; impl Group for Ed448Group { type Field = Ed448ScalarField; - type Element = ExtendedPoint; + type Element = EdwardsPoint; type Serialization = [u8; 57]; fn cofactor() -> ::Scalar { - Scalar::one() + EdwardsScalar::ONE } fn identity() -> Self::Element { - Self::Element::identity() + Self::Element::IDENTITY } fn generator() -> Self::Element { - Self::Element::generator() + Self::Element::GENERATOR } fn serialize(element: &Self::Element) -> Result { if *element == Self::identity() { return Err(GroupError::InvalidIdentityElement); } - Ok(element.compress().0) + Ok(element.to_affine().compress().0) } fn deserialize(buf: &Self::Serialization) -> Result { let compressed = CompressedEdwardsY(*buf); - match compressed.decompress() { + match compressed.decompress_unchecked().into_option() { Some(point) => { - if point == Self::identity() { + if point == Self::identity().to_affine() { Err(GroupError::InvalidIdentityElement) - } else if point.is_torsion_free() { + } else if point.to_edwards().is_torsion_free().into() { // decompress() does not check for canonicality, so we // check by recompressing and comparing if point.compress().0 != compressed.0 { Err(GroupError::MalformedElement) } else { - Ok(point) + Ok(point.to_edwards()) } } else { Err(GroupError::InvalidNonPrimeOrderElement) @@ -142,9 +141,9 @@ fn hash_to_array(inputs: &[&[u8]]) -> [u8; 114] { output } -fn hash_to_scalar(inputs: &[&[u8]]) -> Scalar { - let output = hash_to_array(inputs); - Scalar::from_bytes_mod_order_wide(&output) +fn hash_to_scalar(inputs: &[&[u8]]) -> EdwardsScalar { + let temp = hash_to_array(inputs); + EdwardsScalar::from_bytes_mod_order_wide(&temp.into()) } /// Context string from the ciphersuite in the [spec] @@ -235,7 +234,7 @@ pub mod keys { /// Allows all participants' keys to be generated using a central, trusted /// dealer. - pub fn generate_with_dealer( + pub fn generate_with_dealer( max_signers: u16, min_signers: u16, identifiers: IdentifierList, @@ -250,7 +249,7 @@ pub mod keys { /// instead of generating a fresh one. This is useful in scenarios where /// the key needs to be generated externally or must be derived from e.g. a /// seed phrase. - pub fn split( + pub fn split( secret: &SigningKey, max_signers: u16, min_signers: u16, @@ -351,7 +350,7 @@ pub mod round1 { /// operation. pub fn commit(secret: &SigningShare, rng: &mut RNG) -> (SigningNonces, SigningCommitments) where - RNG: CryptoRng + RngCore, + RNG: CryptoRng, { frost::round1::commit::(secret, rng) } diff --git a/frost-ed448/src/tests/batch.rs b/frost-ed448/src/tests/batch.rs index 5c84b5e50..2e1838af7 100644 --- a/frost-ed448/src/tests/batch.rs +++ b/frost-ed448/src/tests/batch.rs @@ -2,21 +2,21 @@ use crate::*; #[test] fn check_batch_verify() { - let rng = rand::rngs::OsRng; + let rng = rand_core::UnwrapErr(rand::rngs::SysRng); frost_core::tests::batch::batch_verify::(rng); } #[test] fn check_bad_batch_verify() { - let rng = rand::rngs::OsRng; + let rng = rand_core::UnwrapErr(rand::rngs::SysRng); frost_core::tests::batch::bad_batch_verify::(rng); } #[test] fn empty_batch_verify() { - let rng = rand::rngs::OsRng; + let rng = rand_core::UnwrapErr(rand::rngs::SysRng); frost_core::tests::batch::empty_batch_verify::(rng); } diff --git a/frost-ed448/src/tests/coefficient_commitment.rs b/frost-ed448/src/tests/coefficient_commitment.rs index 0d2091aa6..be54d10cd 100644 --- a/frost-ed448/src/tests/coefficient_commitment.rs +++ b/frost-ed448/src/tests/coefficient_commitment.rs @@ -1,18 +1,17 @@ -use lazy_static::lazy_static; use serde_json::Value; +use std::sync::LazyLock; use crate::*; // Tests for serialization and deserialization of CoefficientCommitment -lazy_static! { - pub static ref ELEMENTS: Value = - serde_json::from_str(include_str!("../../tests/helpers/elements.json").trim()).unwrap(); -} +static ELEMENTS: LazyLock = LazyLock::new(|| { + serde_json::from_str(include_str!("../../tests/helpers/elements.json").trim()).unwrap() +}); #[test] fn check_serialization_of_coefficient_commitment() { - let rng = rand::rngs::OsRng; + let rng = rand_core::UnwrapErr(rand::rngs::SysRng); frost_core::tests::coefficient_commitment::check_serialization_of_coefficient_commitment::< Ed448Shake256, _, @@ -21,7 +20,7 @@ fn check_serialization_of_coefficient_commitment() { #[test] fn check_create_coefficient_commitment() { - let rng = rand::rngs::OsRng; + let rng = rand_core::UnwrapErr(rand::rngs::SysRng); frost_core::tests::coefficient_commitment::check_create_coefficient_commitment::< Ed448Shake256, _, @@ -36,7 +35,7 @@ fn check_create_coefficient_commitment_error() { #[test] fn check_get_value_of_coefficient_commitment() { - let rng = rand::rngs::OsRng; + let rng = rand_core::UnwrapErr(rand::rngs::SysRng); frost_core::tests::coefficient_commitment::check_get_value_of_coefficient_commitment::< Ed448Shake256, diff --git a/frost-ed448/src/tests/deserialize.rs b/frost-ed448/src/tests/deserialize.rs index 6c86b77f6..d5294e291 100644 --- a/frost-ed448/src/tests/deserialize.rs +++ b/frost-ed448/src/tests/deserialize.rs @@ -1,10 +1,10 @@ use crate::*; -use ed448_goldilocks::curve::ExtendedPoint; +use ed448_goldilocks::EdwardsPoint; use frost_core::Ciphersuite; #[test] fn check_deserialize_non_canonical() { - let mut encoded_generator = ExtendedPoint::generator().compress().0; + let mut encoded_generator = EdwardsPoint::GENERATOR.to_affine().compress().0; let r = ::Group::deserialize(&encoded_generator); assert!(r.is_ok()); @@ -35,7 +35,7 @@ fn check_deserialize_non_prime_order() { #[test] fn check_deserialize_identity() { - let encoded_identity = ExtendedPoint::identity().compress().0; + let encoded_identity = EdwardsPoint::IDENTITY.to_affine().compress().0; let r = ::Group::deserialize(&encoded_identity); assert_eq!(r, Err(GroupError::InvalidIdentityElement)); diff --git a/frost-ed448/src/tests/vss_commitment.rs b/frost-ed448/src/tests/vss_commitment.rs index 7e1f83441..b2ac27df4 100644 --- a/frost-ed448/src/tests/vss_commitment.rs +++ b/frost-ed448/src/tests/vss_commitment.rs @@ -1,24 +1,23 @@ -use lazy_static::lazy_static; use serde_json::Value; +use std::sync::LazyLock; use crate::*; // Tests for serialization and deserialization VerifiableSecretSharingCommitment -lazy_static! { - pub static ref ELEMENTS: Value = - serde_json::from_str(include_str!("../../tests/helpers/elements.json").trim()).unwrap(); -} +static ELEMENTS: LazyLock = LazyLock::new(|| { + serde_json::from_str(include_str!("../../tests/helpers/elements.json").trim()).unwrap() +}); #[test] fn check_serialize_vss_commitment() { - let rng = rand::rngs::OsRng; + let rng = rand_core::UnwrapErr(rand::rngs::SysRng); frost_core::tests::vss_commitment::check_serialize_vss_commitment::(rng); } #[test] fn check_serialize_whole_vss_commitment() { - let rng = rand::rngs::OsRng; + let rng = rand_core::UnwrapErr(rand::rngs::SysRng); frost_core::tests::vss_commitment::check_serialize_whole_vss_commitment::( rng, ); @@ -26,13 +25,13 @@ fn check_serialize_whole_vss_commitment() { #[test] fn check_deserialize_vss_commitment() { - let rng = rand::rngs::OsRng; + let rng = rand_core::UnwrapErr(rand::rngs::SysRng); frost_core::tests::vss_commitment::check_deserialize_vss_commitment::(rng); } #[test] fn check_deserialize_whole_vss_commitment() { - let rng = rand::rngs::OsRng; + let rng = rand_core::UnwrapErr(rand::rngs::SysRng); frost_core::tests::vss_commitment::check_deserialize_whole_vss_commitment::( rng, ); @@ -40,7 +39,7 @@ fn check_deserialize_whole_vss_commitment() { #[test] fn check_deserialize_vss_commitment_error() { - let rng = rand::rngs::OsRng; + let rng = rand_core::UnwrapErr(rand::rngs::SysRng); frost_core::tests::vss_commitment::check_deserialize_vss_commitment_error::( rng, &ELEMENTS, ); @@ -48,7 +47,7 @@ fn check_deserialize_vss_commitment_error() { #[test] fn check_deserialize_whole_vss_commitment_error() { - let rng = rand::rngs::OsRng; + let rng = rand_core::UnwrapErr(rand::rngs::SysRng); frost_core::tests::vss_commitment::check_deserialize_whole_vss_commitment_error::< Ed448Shake256, _, @@ -57,6 +56,6 @@ fn check_deserialize_whole_vss_commitment_error() { #[test] fn check_compute_public_key_package() { - let rng = rand::rngs::OsRng; + let rng = rand_core::UnwrapErr(rand::rngs::SysRng); frost_core::tests::vss_commitment::check_compute_public_key_package::(rng); } diff --git a/frost-ed448/tests/common_traits_tests.rs b/frost-ed448/tests/common_traits_tests.rs index 749cc7033..022954d42 100644 --- a/frost-ed448/tests/common_traits_tests.rs +++ b/frost-ed448/tests/common_traits_tests.rs @@ -19,7 +19,7 @@ fn check_common_traits_for_type(v: #[test] fn check_signing_key_common_traits() { - let mut rng = rand::rngs::OsRng; + let mut rng = rand_core::UnwrapErr(rand::rngs::SysRng); let signing_key = SigningKey::new(&mut rng); check_common_traits_for_type(signing_key); } diff --git a/frost-ed448/tests/integration_tests.rs b/frost-ed448/tests/integration_tests.rs index 28bd22ad2..8d62303d6 100644 --- a/frost-ed448/tests/integration_tests.rs +++ b/frost-ed448/tests/integration_tests.rs @@ -1,6 +1,6 @@ use frost_ed448::*; -use lazy_static::lazy_static; use serde_json::Value; +use std::sync::LazyLock; #[test] fn check_zero_key_fails() { @@ -9,14 +9,14 @@ fn check_zero_key_fails() { #[test] fn check_sign_with_dkg() { - let rng = rand::rngs::OsRng; + let rng = rand_core::UnwrapErr(rand::rngs::SysRng); frost_core::tests::ciphersuite_generic::check_sign_with_dkg::(rng); } #[test] fn check_dkg_part1_fails_with_invalid_signers_min_signers() { - let rng = rand::rngs::OsRng; + let rng = rand_core::UnwrapErr(rand::rngs::SysRng); let min_signers = 1; let max_signers = 3; @@ -30,7 +30,7 @@ fn check_dkg_part1_fails_with_invalid_signers_min_signers() { #[test] fn check_dkg_part1_fails_with_min_signers_greater_than_max() { - let rng = rand::rngs::OsRng; + let rng = rand_core::UnwrapErr(rand::rngs::SysRng); let min_signers = 3; let max_signers = 2; @@ -44,7 +44,7 @@ fn check_dkg_part1_fails_with_min_signers_greater_than_max() { #[test] fn check_dkg_part1_fails_with_invalid_signers_max_signers() { - let rng = rand::rngs::OsRng; + let rng = rand_core::UnwrapErr(rand::rngs::SysRng); let min_signers = 3; let max_signers = 1; @@ -58,21 +58,21 @@ fn check_dkg_part1_fails_with_invalid_signers_max_signers() { #[test] fn check_rts() { - let rng = rand::rngs::OsRng; + let rng = rand_core::UnwrapErr(rand::rngs::SysRng); frost_core::tests::repairable::check_rts::(rng); } #[test] fn check_refresh_shares_with_dealer() { - let rng = rand::rngs::OsRng; + let rng = rand_core::UnwrapErr(rand::rngs::SysRng); frost_core::tests::refresh::check_refresh_shares_with_dealer::(rng); } #[test] fn check_refresh_shares_with_dealer_serialisation() { - let rng = rand::rngs::OsRng; + let rng = rand_core::UnwrapErr(rand::rngs::SysRng); frost_core::tests::refresh::check_refresh_shares_with_dealer_serialisation::( rng, @@ -81,7 +81,7 @@ fn check_refresh_shares_with_dealer_serialisation() { #[test] fn check_refresh_shares_with_dealer_fails_with_invalid_public_key_package() { - let rng = rand::rngs::OsRng; + let rng = rand_core::UnwrapErr(rand::rngs::SysRng); frost_core::tests::refresh::check_refresh_shares_with_dealer_fails_with_invalid_public_key_package::< Ed448Shake256, @@ -91,7 +91,7 @@ fn check_refresh_shares_with_dealer_fails_with_invalid_public_key_package() { #[test] fn check_refresh_shares_with_dealer_fails_with_invalid_identifier() { - let rng = rand::rngs::OsRng; + let rng = rand_core::UnwrapErr(rand::rngs::SysRng); let identifiers = vec![ Identifier::try_from(8).unwrap(), Identifier::try_from(3).unwrap(), @@ -108,14 +108,14 @@ fn check_refresh_shares_with_dealer_fails_with_invalid_identifier() { #[test] fn check_refresh_shares_with_dkg() { - let rng = rand::rngs::OsRng; + let rng = rand_core::UnwrapErr(rand::rngs::SysRng); frost_core::tests::refresh::check_refresh_shares_with_dkg::(rng); } #[test] fn check_refresh_shares_with_dkg_smaller_threshold() { - let rng = rand::rngs::OsRng; + let rng = rand_core::UnwrapErr(rand::rngs::SysRng); frost_core::tests::refresh::check_refresh_shares_with_dkg_smaller_threshold::( rng, @@ -124,14 +124,14 @@ fn check_refresh_shares_with_dkg_smaller_threshold() { #[test] fn check_sign_with_dealer() { - let rng = rand::rngs::OsRng; + let rng = rand_core::UnwrapErr(rand::rngs::SysRng); frost_core::tests::ciphersuite_generic::check_sign_with_dealer::(rng); } #[test] fn check_sign_with_dealer_fails_with_invalid_min_signers() { - let rng = rand::rngs::OsRng; + let rng = rand_core::UnwrapErr(rand::rngs::SysRng); let min_signers = 1; let max_signers = 3; @@ -145,7 +145,7 @@ fn check_sign_with_dealer_fails_with_invalid_min_signers() { #[test] fn check_sign_with_dealer_fails_with_min_signers_greater_than_max() { - let rng = rand::rngs::OsRng; + let rng = rand_core::UnwrapErr(rand::rngs::SysRng); let min_signers = 3; let max_signers = 2; @@ -159,7 +159,7 @@ fn check_sign_with_dealer_fails_with_min_signers_greater_than_max() { #[test] fn check_sign_with_dealer_fails_with_invalid_max_signers() { - let rng = rand::rngs::OsRng; + let rng = rand_core::UnwrapErr(rand::rngs::SysRng); let min_signers = 3; let max_signers = 1; @@ -175,13 +175,13 @@ fn check_sign_with_dealer_fails_with_invalid_max_signers() { /// value is working. #[test] fn check_share_generation_ed448_shake256() { - let rng = rand::rngs::OsRng; + let rng = rand_core::UnwrapErr(rand::rngs::SysRng); frost_core::tests::ciphersuite_generic::check_share_generation::(rng); } #[test] fn check_share_generation_fails_with_invalid_min_signers() { - let rng = rand::rngs::OsRng; + let rng = rand_core::UnwrapErr(rand::rngs::SysRng); let min_signers = 0; let max_signers = 3; @@ -195,7 +195,7 @@ fn check_share_generation_fails_with_invalid_min_signers() { #[test] fn check_share_generation_fails_with_min_signers_greater_than_max() { - let rng = rand::rngs::OsRng; + let rng = rand_core::UnwrapErr(rand::rngs::SysRng); let min_signers = 3; let max_signers = 2; @@ -209,7 +209,7 @@ fn check_share_generation_fails_with_min_signers_greater_than_max() { #[test] fn check_share_generation_fails_with_invalid_max_signers() { - let rng = rand::rngs::OsRng; + let rng = rand_core::UnwrapErr(rand::rngs::SysRng); let min_signers = 3; let max_signers = 0; @@ -221,17 +221,18 @@ fn check_share_generation_fails_with_invalid_max_signers() { >(min_signers, max_signers, error, rng); } -lazy_static! { - pub static ref VECTORS: Value = - serde_json::from_str(include_str!("../tests/helpers/vectors.json").trim()) - .expect("Test vector is valid JSON"); - pub static ref VECTORS_BIG_IDENTIFIER: Value = - serde_json::from_str(include_str!("../tests/helpers/vectors-big-identifier.json").trim()) - .expect("Test vector is valid JSON"); - pub static ref VECTORS_DKG: Value = - serde_json::from_str(include_str!("../tests/helpers/vectors_dkg.json").trim()) - .expect("Test vector is valid JSON"); -} +static VECTORS: LazyLock = LazyLock::new(|| { + serde_json::from_str(include_str!("../tests/helpers/vectors.json").trim()) + .expect("Test vector is valid JSON") +}); +static VECTORS_BIG_IDENTIFIER: LazyLock = LazyLock::new(|| { + serde_json::from_str(include_str!("../tests/helpers/vectors-big-identifier.json").trim()) + .expect("Test vector is valid JSON") +}); +static VECTORS_DKG: LazyLock = LazyLock::new(|| { + serde_json::from_str(include_str!("../tests/helpers/vectors_dkg.json").trim()) + .expect("Test vector is valid JSON") +}); #[test] fn check_sign_with_test_vectors() { @@ -273,7 +274,7 @@ fn check_identifier_generation() -> Result<(), Error> { #[test] fn check_sign_with_dealer_and_identifiers() { - let rng = rand::rngs::OsRng; + let rng = rand_core::UnwrapErr(rand::rngs::SysRng); frost_core::tests::ciphersuite_generic::check_sign_with_dealer_and_identifiers::< Ed448Shake256, @@ -283,7 +284,7 @@ fn check_sign_with_dealer_and_identifiers() { #[test] fn check_sign_with_missing_identifier() { - let rng = rand::rngs::OsRng; + let rng = rand_core::UnwrapErr(rand::rngs::SysRng); frost_core::tests::ciphersuite_generic::check_sign_with_missing_identifier::( rng, ); @@ -291,7 +292,7 @@ fn check_sign_with_missing_identifier() { #[test] fn check_sign_with_incorrect_commitments() { - let rng = rand::rngs::OsRng; + let rng = rand_core::UnwrapErr(rand::rngs::SysRng); frost_core::tests::ciphersuite_generic::check_sign_with_incorrect_commitments::( rng, ); @@ -300,7 +301,7 @@ fn check_sign_with_incorrect_commitments() { #[tokio::test] async fn check_async_sign_with_dealer() { tokio::spawn(async { - let rng = rand::rngs::OsRng; + let rng = rand_core::UnwrapErr(rand::rngs::SysRng); frost_core::tests::ciphersuite_generic::async_check_sign::(rng).await; }) .await diff --git a/frost-ed448/tests/rerandomized_tests.rs b/frost-ed448/tests/rerandomized_tests.rs index e16d906ce..fd1783c0d 100644 --- a/frost-ed448/tests/rerandomized_tests.rs +++ b/frost-ed448/tests/rerandomized_tests.rs @@ -2,7 +2,7 @@ use frost_ed448::Ed448Shake256; #[test] fn check_randomized_sign_with_dealer() { - let rng = rand::rngs::OsRng; + let rng = rand_core::UnwrapErr(rand::rngs::SysRng); let (_msg, _group_signature, _group_pubkey) = frost_rerandomized::tests::check_randomized_sign_with_dealer::(rng); diff --git a/frost-ed448/tests/serde_tests.rs b/frost-ed448/tests/serde_tests.rs index db380eed1..3d5720322 100644 --- a/frost-ed448/tests/serde_tests.rs +++ b/frost-ed448/tests/serde_tests.rs @@ -19,7 +19,7 @@ fn check_signing_commitments_serialization() { let commitments = samples::signing_commitments(); let json = serde_json::to_string_pretty(&commitments).unwrap(); - println!("{}", json); + println!("{json}"); let decoded_commitments: SigningCommitments = serde_json::from_str(&json).unwrap(); assert!(commitments == decoded_commitments); @@ -89,7 +89,7 @@ fn check_signing_package_serialization() { let signing_package = samples::signing_package(); let json = serde_json::to_string_pretty(&signing_package).unwrap(); - println!("{}", json); + println!("{json}"); let decoded_signing_package: SigningPackage = serde_json::from_str(&json).unwrap(); assert!(signing_package == decoded_signing_package); @@ -204,7 +204,7 @@ fn check_signature_share_serialization() { let signature_share = samples::signature_share(); let json = serde_json::to_string_pretty(&signature_share).unwrap(); - println!("{}", json); + println!("{json}"); let decoded_signature_share: SignatureShare = serde_json::from_str(&json).unwrap(); assert!(signature_share == decoded_signature_share); @@ -258,7 +258,7 @@ fn check_secret_share_serialization() { let secret_share = samples::secret_share(); let json = serde_json::to_string_pretty(&secret_share).unwrap(); - println!("{}", json); + println!("{json}"); let decoded_secret_share: SecretShare = serde_json::from_str(&json).unwrap(); assert!(secret_share == decoded_secret_share); @@ -342,7 +342,7 @@ fn check_key_package_serialization() { let key_package = samples::key_package(); let json = serde_json::to_string_pretty(&key_package).unwrap(); - println!("{}", json); + println!("{json}"); let decoded_key_package: KeyPackage = serde_json::from_str(&json).unwrap(); assert!(key_package == decoded_key_package); @@ -437,7 +437,7 @@ fn check_public_key_package_serialization() { let public_key_package = samples::public_key_package_new(); let json = serde_json::to_string_pretty(&public_key_package).unwrap(); - println!("{}", json); + println!("{json}"); let decoded_public_key_package: PublicKeyPackage = serde_json::from_str(&json).unwrap(); assert!(public_key_package == decoded_public_key_package); @@ -532,7 +532,7 @@ fn check_round1_package_serialization() { let round1_package = samples::round1_package(); let json = serde_json::to_string_pretty(&round1_package).unwrap(); - println!("{}", json); + println!("{json}"); let decoded_round1_package: round1::Package = serde_json::from_str(&json).unwrap(); assert!(round1_package == decoded_round1_package); @@ -598,7 +598,7 @@ fn check_round2_package_serialization() { let round2_package = samples::round2_package(); let json = serde_json::to_string_pretty(&round2_package).unwrap(); - println!("{}", json); + println!("{json}"); let decoded_round2_package: round2::Package = serde_json::from_str(&json).unwrap(); assert!(round2_package == decoded_round2_package); diff --git a/frost-p256/Cargo.toml b/frost-p256/Cargo.toml index 68e63b3cf..d6de547ee 100644 --- a/frost-p256/Cargo.toml +++ b/frost-p256/Cargo.toml @@ -1,35 +1,45 @@ [package] name = "frost-p256" -edition.workspace = true -rust-version.workspace = true version.workspace = true authors.workspace = true +edition.workspace = true +rust-version.workspace = true +description = "A Schnorr signature scheme over the NIST P-256 curve that supports FROST." +documentation = "https://docs.rs/frost-p256" readme = "README.md" -license.workspace = true +homepage.workspace = true repository.workspace = true -categories.workspace = true +license.workspace = true keywords = ["cryptography", "crypto", "p256", "threshold", "signature"] -description = "A Schnorr signature scheme over the NIST P-256 curve that supports FROST." +categories.workspace = true [package.metadata.docs.rs] features = ["serde"] rustdoc-args = ["--cfg", "docsrs"] +[lib] +# Disables non-criterion benchmark which is not used; prevents errors +# when using criterion-specific flags +bench = false + +[[bench]] +name = "bench" +harness = false + [dependencies] document-features.workspace = true -p256 = { version = "0.13.0", features = ["hash2curve"], default-features = false } frost-core.workspace = true frost-rerandomized.workspace = true +p256.workspace = true rand_core.workspace = true -sha2 = { version = "0.10.2", default-features = false } +sha2.workspace = true [dev-dependencies] criterion.workspace = true frost-core = { workspace = true, features = ["test-impl"] } frost-rerandomized = { workspace = true, features = ["test-impl"] } -insta.workspace = true hex.workspace = true -lazy_static.workspace = true +insta.workspace = true proptest.workspace = true rand.workspace = true rand_chacha.workspace = true @@ -45,12 +55,3 @@ default = ["serialization"] serde = ["frost-core/serde"] ## Enable a default serialization format. Enables `serde`. serialization = ["serde", "frost-core/serialization", "frost-rerandomized/serialization"] - -[lib] -# Disables non-criterion benchmark which is not used; prevents errors -# when using criterion-specific flags -bench = false - -[[bench]] -name = "bench" -harness = false diff --git a/frost-p256/README.md b/frost-p256/README.md index 47f391fb2..3e6fc4e2c 100644 --- a/frost-p256/README.md +++ b/frost-p256/README.md @@ -20,7 +20,7 @@ scenario in a single thread and it abstracts away any communication between peer use frost_p256 as frost; use std::collections::BTreeMap; -let mut rng = rand::rngs::OsRng; +let mut rng = rand_core::UnwrapErr(rand::rngs::SysRng); let max_signers = 5; let min_signers = 3; let (shares, pubkey_package) = frost::keys::generate_with_dealer( diff --git a/frost-p256/benches/bench.rs b/frost-p256/benches/bench.rs index 8ae524f5c..d2aed996b 100644 --- a/frost-p256/benches/bench.rs +++ b/frost-p256/benches/bench.rs @@ -3,13 +3,13 @@ use criterion::{criterion_group, criterion_main, Criterion}; use frost_p256::*; fn bench_p256_batch_verify(c: &mut Criterion) { - let mut rng = rand::rngs::OsRng; + let mut rng = rand_core::UnwrapErr(rand::rngs::SysRng); frost_core::benches::bench_batch_verify::(c, "p256", &mut rng); } fn bench_p256_sign(c: &mut Criterion) { - let mut rng = rand::rngs::OsRng; + let mut rng = rand_core::UnwrapErr(rand::rngs::SysRng); frost_core::benches::bench_sign::(c, "p256", &mut rng); } diff --git a/frost-p256/dkg.md b/frost-p256/dkg.md index cd64fd941..4e06a6d25 100644 --- a/frost-p256/dkg.md +++ b/frost-p256/dkg.md @@ -20,11 +20,9 @@ first round of communication to ensure all participants have the same value. ```rust # // ANCHOR: dkg_import use std::collections::BTreeMap; - use frost_p256 as frost; -let mut rng = rand::rngs::OsRng; - +let mut rng = rand_core::UnwrapErr(rand::rngs::SysRng); let max_signers = 5; let min_signers = 3; # // ANCHOR_END: dkg_import diff --git a/frost-p256/src/keys/dkg.rs b/frost-p256/src/keys/dkg.rs index dfd95384a..ed2d5bdef 100644 --- a/frost-p256/src/keys/dkg.rs +++ b/frost-p256/src/keys/dkg.rs @@ -46,7 +46,7 @@ pub mod round2 { /// It returns the [`round1::SecretPackage`] that must be kept in memory /// by the participant for the other steps, and the [`round1::Package`] that /// must be sent to each other participant in the DKG run. -pub fn part1( +pub fn part1( identifier: Identifier, max_signers: u16, min_signers: u16, diff --git a/frost-p256/src/keys/refresh.rs b/frost-p256/src/keys/refresh.rs index bb4b6dd64..2d44f2bdb 100644 --- a/frost-p256/src/keys/refresh.rs +++ b/frost-p256/src/keys/refresh.rs @@ -5,14 +5,14 @@ use crate::{ frost, keys::dkg::{round1, round2}, - CryptoRng, Error, Identifier, RngCore, + CryptoRng, Error, Identifier, }; use alloc::{collections::btree_map::BTreeMap, vec::Vec}; use super::{KeyPackage, PublicKeyPackage, SecretShare}; /// Refer to [`frost_core::keys::refresh::compute_refreshing_shares`]. -pub fn compute_refreshing_shares( +pub fn compute_refreshing_shares( old_pub_key_package: PublicKeyPackage, identifiers: &[Identifier], mut rng: &mut R, @@ -29,7 +29,7 @@ pub fn refresh_share( } /// Refer to [`frost_core::keys::refresh::refresh_dkg_part1`]. -pub fn refresh_dkg_part1( +pub fn refresh_dkg_part1( identifier: Identifier, max_signers: u16, min_signers: u16, diff --git a/frost-p256/src/keys/repairable.rs b/frost-p256/src/keys/repairable.rs index 98db9d1aa..0682db99a 100644 --- a/frost-p256/src/keys/repairable.rs +++ b/frost-p256/src/keys/repairable.rs @@ -10,7 +10,7 @@ use crate::keys::{KeyPackage, PublicKeyPackage}; // This is imported separately to make `gencode` work. // (if it were below, the position of the import would vary between ciphersuites // after `cargo fmt`) -use crate::{frost, Ciphersuite, CryptoRng, Identifier, RngCore}; +use crate::{frost, Ciphersuite, CryptoRng, Identifier}; use crate::{Error, P256Sha256}; /// A delta value which is the output of part 1 of RTS. @@ -26,7 +26,7 @@ pub type Sigma = frost::keys::repairable::Sigma; /// `participant` recover their share. /// /// Returns a BTreeMap mapping which value should be sent to which participant. -pub fn repair_share_part1( +pub fn repair_share_part1( helpers: &[Identifier], key_package_i: &KeyPackage, rng: &mut R, @@ -62,22 +62,17 @@ pub fn repair_share_part3( #[cfg(test)] mod tests { - - use lazy_static::lazy_static; - - use serde_json::Value; - use crate::P256Sha256; + use serde_json::Value; + use std::sync::LazyLock; - lazy_static! { - pub static ref REPAIR_SHARE: Value = - serde_json::from_str(include_str!("../../tests/helpers/repair-share.json").trim()) - .unwrap(); - } + static REPAIR_SHARE: LazyLock = LazyLock::new(|| { + serde_json::from_str(include_str!("../../tests/helpers/repair-share.json").trim()).unwrap() + }); #[test] fn check_repair_share_part1() { - let rng = rand::rngs::OsRng; + let rng = rand_core::UnwrapErr(rand::rngs::SysRng); frost_core::tests::repairable::check_repair_share_part1::(rng); } @@ -89,7 +84,7 @@ mod tests { #[test] fn check_repair_share_part3() { - let rng = rand::rngs::OsRng; + let rng = rand_core::UnwrapErr(rand::rngs::SysRng); frost_core::tests::repairable::check_repair_share_part3::( rng, &REPAIR_SHARE, @@ -98,7 +93,7 @@ mod tests { #[test] fn check_repair_share_part1_fails_with_invalid_min_signers() { - let rng = rand::rngs::OsRng; + let rng = rand_core::UnwrapErr(rand::rngs::SysRng); frost_core::tests::repairable::check_repair_share_part1_fails_with_invalid_min_signers::< P256Sha256, _, diff --git a/frost-p256/src/lib.rs b/frost-p256/src/lib.rs index 42aa94f1b..6495251a3 100644 --- a/frost-p256/src/lib.rs +++ b/frost-p256/src/lib.rs @@ -5,6 +5,9 @@ #![doc = include_str!("../README.md")] #![doc = document_features::document_features!()] +#[cfg(test)] +extern crate std; + extern crate alloc; use alloc::collections::BTreeMap; @@ -12,13 +15,13 @@ use alloc::collections::BTreeMap; use frost_rerandomized::RandomizedCiphersuite; use p256::{ elliptic_curve::{ - hash2curve::{hash_to_field, ExpandMsgXmd}, - sec1::{FromEncodedPoint, ToEncodedPoint}, + sec1::{FromSec1Point, ToSec1Point}, Field as FFField, PrimeField, }, - AffinePoint, ProjectivePoint, Scalar, + hash2curve::{hash_to_field, ExpandMsgXmd, MapToCurve}, + AffinePoint, NistP256, ProjectivePoint, Scalar, }; -use rand_core::{CryptoRng, RngCore}; +use rand_core::CryptoRng; use sha2::{Digest, Sha256}; use frost_core as frost; @@ -62,7 +65,7 @@ impl Field for P256ScalarField { } } - fn random(rng: &mut R) -> Self::Scalar { + fn random(rng: &mut R) -> Self::Scalar { Scalar::random(rng) } @@ -121,7 +124,7 @@ impl Group for P256Group { return Err(GroupError::InvalidIdentityElement); } let mut fixed_serialized = [0; 33]; - let serialized_point = element.to_encoded_point(true); + let serialized_point = element.to_sec1_point(true); let serialized = serialized_point.as_bytes(); fixed_serialized.copy_from_slice(serialized); Ok(fixed_serialized) @@ -129,9 +132,9 @@ impl Group for P256Group { fn deserialize(buf: &Self::Serialization) -> Result { let encoded_point = - p256::EncodedPoint::from_bytes(buf).map_err(|_| GroupError::MalformedElement)?; + p256::Sec1Point::from_bytes(buf).map_err(|_| GroupError::MalformedElement)?; - match Option::::from(AffinePoint::from_encoded_point(&encoded_point)) { + match Option::::from(AffinePoint::from_sec1_point(&encoded_point)) { Some(point) => { if point.is_identity().into() { // This is actually impossible since the identity is encoded in a single byte @@ -158,9 +161,14 @@ fn hash_to_array(inputs: &[&[u8]]) -> [u8; 32] { } fn hash_to_scalar(domain: &[&[u8]], msg: &[u8]) -> Scalar { - let mut u = [P256ScalarField::zero()]; - hash_to_field::, Scalar>(&[msg], domain, &mut u) - .expect("should never return error according to error cases described in ExpandMsgXmd"); + let u = hash_to_field::< + 1, + ExpandMsgXmd, + ::SecurityLevel, + Scalar, + ::Length, + >(&[msg], domain) + .expect("should never return error according to error cases described in ExpandMsgXmd"); u[0] } @@ -251,7 +259,7 @@ pub mod keys { /// Allows all participants' keys to be generated using a central, trusted /// dealer. - pub fn generate_with_dealer( + pub fn generate_with_dealer( max_signers: u16, min_signers: u16, identifiers: IdentifierList, @@ -266,7 +274,7 @@ pub mod keys { /// instead of generating a fresh one. This is useful in scenarios where /// the key needs to be generated externally or must be derived from e.g. a /// seed phrase. - pub fn split( + pub fn split( secret: &SigningKey, max_signers: u16, min_signers: u16, @@ -367,7 +375,7 @@ pub mod round1 { /// operation. pub fn commit(secret: &SigningShare, rng: &mut RNG) -> (SigningNonces, SigningCommitments) where - RNG: CryptoRng + RngCore, + RNG: CryptoRng, { frost::round1::commit::(secret, rng) } diff --git a/frost-p256/src/tests/batch.rs b/frost-p256/src/tests/batch.rs index 3a46bfdd3..47f01b01b 100644 --- a/frost-p256/src/tests/batch.rs +++ b/frost-p256/src/tests/batch.rs @@ -2,21 +2,21 @@ use crate::*; #[test] fn check_batch_verify() { - let rng = rand::rngs::OsRng; + let rng = rand_core::UnwrapErr(rand::rngs::SysRng); frost_core::tests::batch::batch_verify::(rng); } #[test] fn check_bad_batch_verify() { - let rng = rand::rngs::OsRng; + let rng = rand_core::UnwrapErr(rand::rngs::SysRng); frost_core::tests::batch::bad_batch_verify::(rng); } #[test] fn empty_batch_verify() { - let rng = rand::rngs::OsRng; + let rng = rand_core::UnwrapErr(rand::rngs::SysRng); frost_core::tests::batch::empty_batch_verify::(rng); } diff --git a/frost-p256/src/tests/coefficient_commitment.rs b/frost-p256/src/tests/coefficient_commitment.rs index e52f8398f..4edbe2035 100644 --- a/frost-p256/src/tests/coefficient_commitment.rs +++ b/frost-p256/src/tests/coefficient_commitment.rs @@ -1,18 +1,17 @@ -use lazy_static::lazy_static; use serde_json::Value; +use std::sync::LazyLock; use crate::*; // Tests for serialization and deserialization of CoefficientCommitment -lazy_static! { - pub static ref ELEMENTS: Value = - serde_json::from_str(include_str!("../../tests/helpers/elements.json").trim()).unwrap(); -} +static ELEMENTS: LazyLock = LazyLock::new(|| { + serde_json::from_str(include_str!("../../tests/helpers/elements.json").trim()).unwrap() +}); #[test] fn check_serialization_of_coefficient_commitment() { - let rng = rand::rngs::OsRng; + let rng = rand_core::UnwrapErr(rand::rngs::SysRng); frost_core::tests::coefficient_commitment::check_serialization_of_coefficient_commitment::< P256Sha256, _, @@ -21,7 +20,7 @@ fn check_serialization_of_coefficient_commitment() { #[test] fn check_create_coefficient_commitment() { - let rng = rand::rngs::OsRng; + let rng = rand_core::UnwrapErr(rand::rngs::SysRng); frost_core::tests::coefficient_commitment::check_create_coefficient_commitment::( rng, ); @@ -35,7 +34,7 @@ fn check_create_coefficient_commitment_error() { #[test] fn check_get_value_of_coefficient_commitment() { - let rng = rand::rngs::OsRng; + let rng = rand_core::UnwrapErr(rand::rngs::SysRng); frost_core::tests::coefficient_commitment::check_get_value_of_coefficient_commitment::< P256Sha256, diff --git a/frost-p256/src/tests/vss_commitment.rs b/frost-p256/src/tests/vss_commitment.rs index 44c08c5be..ab15190ca 100644 --- a/frost-p256/src/tests/vss_commitment.rs +++ b/frost-p256/src/tests/vss_commitment.rs @@ -1,42 +1,41 @@ -use lazy_static::lazy_static; use serde_json::Value; +use std::sync::LazyLock; use crate::*; // Tests for serialization and deserialization VerifiableSecretSharingCommitment -lazy_static! { - pub static ref ELEMENTS: Value = - serde_json::from_str(include_str!("../../tests/helpers/elements.json").trim()).unwrap(); -} +static ELEMENTS: LazyLock = LazyLock::new(|| { + serde_json::from_str(include_str!("../../tests/helpers/elements.json").trim()).unwrap() +}); #[test] fn check_serialize_vss_commitment() { - let rng = rand::rngs::OsRng; + let rng = rand_core::UnwrapErr(rand::rngs::SysRng); frost_core::tests::vss_commitment::check_serialize_vss_commitment::(rng); } #[test] fn check_serialize_whole_vss_commitment() { - let rng = rand::rngs::OsRng; + let rng = rand_core::UnwrapErr(rand::rngs::SysRng); frost_core::tests::vss_commitment::check_serialize_whole_vss_commitment::(rng); } #[test] fn check_deserialize_vss_commitment() { - let rng = rand::rngs::OsRng; + let rng = rand_core::UnwrapErr(rand::rngs::SysRng); frost_core::tests::vss_commitment::check_deserialize_vss_commitment::(rng); } #[test] fn check_deserialize_whole_vss_commitment() { - let rng = rand::rngs::OsRng; + let rng = rand_core::UnwrapErr(rand::rngs::SysRng); frost_core::tests::vss_commitment::check_deserialize_whole_vss_commitment::(rng); } #[test] fn check_deserialize_vss_commitment_error() { - let rng = rand::rngs::OsRng; + let rng = rand_core::UnwrapErr(rand::rngs::SysRng); frost_core::tests::vss_commitment::check_deserialize_vss_commitment_error::( rng, &ELEMENTS, ); @@ -44,7 +43,7 @@ fn check_deserialize_vss_commitment_error() { #[test] fn check_deserialize_whole_vss_commitment_error() { - let rng = rand::rngs::OsRng; + let rng = rand_core::UnwrapErr(rand::rngs::SysRng); frost_core::tests::vss_commitment::check_deserialize_whole_vss_commitment_error::( rng, &ELEMENTS, ); @@ -52,6 +51,6 @@ fn check_deserialize_whole_vss_commitment_error() { #[test] fn check_compute_public_key_package() { - let rng = rand::rngs::OsRng; + let rng = rand_core::UnwrapErr(rand::rngs::SysRng); frost_core::tests::vss_commitment::check_compute_public_key_package::(rng); } diff --git a/frost-p256/tests/common_traits_tests.rs b/frost-p256/tests/common_traits_tests.rs index 8dc2d739d..574f5259e 100644 --- a/frost-p256/tests/common_traits_tests.rs +++ b/frost-p256/tests/common_traits_tests.rs @@ -19,7 +19,7 @@ fn check_common_traits_for_type(v: #[test] fn check_signing_key_common_traits() { - let mut rng = rand::rngs::OsRng; + let mut rng = rand_core::UnwrapErr(rand::rngs::SysRng); let signing_key = SigningKey::new(&mut rng); check_common_traits_for_type(signing_key); } diff --git a/frost-p256/tests/integration_tests.rs b/frost-p256/tests/integration_tests.rs index d1d27f440..1902f4a62 100644 --- a/frost-p256/tests/integration_tests.rs +++ b/frost-p256/tests/integration_tests.rs @@ -1,6 +1,6 @@ use frost_p256::*; -use lazy_static::lazy_static; use serde_json::Value; +use std::sync::LazyLock; #[test] fn check_zero_key_fails() { @@ -9,14 +9,14 @@ fn check_zero_key_fails() { #[test] fn check_sign_with_dkg() { - let rng = rand::rngs::OsRng; + let rng = rand_core::UnwrapErr(rand::rngs::SysRng); frost_core::tests::ciphersuite_generic::check_sign_with_dkg::(rng); } #[test] fn check_dkg_part1_fails_with_invalid_signers_min_signers() { - let rng = rand::rngs::OsRng; + let rng = rand_core::UnwrapErr(rand::rngs::SysRng); let min_signers = 1; let max_signers = 3; @@ -30,7 +30,7 @@ fn check_dkg_part1_fails_with_invalid_signers_min_signers() { #[test] fn check_dkg_part1_fails_with_min_signers_greater_than_max() { - let rng = rand::rngs::OsRng; + let rng = rand_core::UnwrapErr(rand::rngs::SysRng); let min_signers = 3; let max_signers = 2; @@ -44,7 +44,7 @@ fn check_dkg_part1_fails_with_min_signers_greater_than_max() { #[test] fn check_dkg_part1_fails_with_invalid_signers_max_signers() { - let rng = rand::rngs::OsRng; + let rng = rand_core::UnwrapErr(rand::rngs::SysRng); let min_signers = 3; let max_signers = 1; @@ -58,21 +58,21 @@ fn check_dkg_part1_fails_with_invalid_signers_max_signers() { #[test] fn check_rts() { - let rng = rand::rngs::OsRng; + let rng = rand_core::UnwrapErr(rand::rngs::SysRng); frost_core::tests::repairable::check_rts::(rng); } #[test] fn check_refresh_shares_with_dealer() { - let rng = rand::rngs::OsRng; + let rng = rand_core::UnwrapErr(rand::rngs::SysRng); frost_core::tests::refresh::check_refresh_shares_with_dealer::(rng); } #[test] fn check_refresh_shares_with_dealer_serialisation() { - let rng = rand::rngs::OsRng; + let rng = rand_core::UnwrapErr(rand::rngs::SysRng); frost_core::tests::refresh::check_refresh_shares_with_dealer_serialisation::( rng, @@ -81,7 +81,7 @@ fn check_refresh_shares_with_dealer_serialisation() { #[test] fn check_refresh_shares_with_dealer_fails_with_invalid_public_key_package() { - let rng = rand::rngs::OsRng; + let rng = rand_core::UnwrapErr(rand::rngs::SysRng); frost_core::tests::refresh::check_refresh_shares_with_dealer_fails_with_invalid_public_key_package::< P256Sha256, @@ -91,7 +91,7 @@ fn check_refresh_shares_with_dealer_fails_with_invalid_public_key_package() { #[test] fn check_refresh_shares_with_dealer_fails_with_invalid_identifier() { - let rng = rand::rngs::OsRng; + let rng = rand_core::UnwrapErr(rand::rngs::SysRng); let identifiers = vec![ Identifier::try_from(8).unwrap(), Identifier::try_from(3).unwrap(), @@ -108,14 +108,14 @@ fn check_refresh_shares_with_dealer_fails_with_invalid_identifier() { #[test] fn check_refresh_shares_with_dkg() { - let rng = rand::rngs::OsRng; + let rng = rand_core::UnwrapErr(rand::rngs::SysRng); frost_core::tests::refresh::check_refresh_shares_with_dkg::(rng); } #[test] fn check_refresh_shares_with_dkg_smaller_threshold() { - let rng = rand::rngs::OsRng; + let rng = rand_core::UnwrapErr(rand::rngs::SysRng); frost_core::tests::refresh::check_refresh_shares_with_dkg_smaller_threshold::( rng, @@ -124,14 +124,14 @@ fn check_refresh_shares_with_dkg_smaller_threshold() { #[test] fn check_sign_with_dealer() { - let rng = rand::rngs::OsRng; + let rng = rand_core::UnwrapErr(rand::rngs::SysRng); frost_core::tests::ciphersuite_generic::check_sign_with_dealer::(rng); } #[test] fn check_sign_with_dealer_fails_with_invalid_min_signers() { - let rng = rand::rngs::OsRng; + let rng = rand_core::UnwrapErr(rand::rngs::SysRng); let min_signers = 1; let max_signers = 3; @@ -145,7 +145,7 @@ fn check_sign_with_dealer_fails_with_invalid_min_signers() { #[test] fn check_sign_with_dealer_fails_with_min_signers_greater_than_max() { - let rng = rand::rngs::OsRng; + let rng = rand_core::UnwrapErr(rand::rngs::SysRng); let min_signers = 3; let max_signers = 2; @@ -159,7 +159,7 @@ fn check_sign_with_dealer_fails_with_min_signers_greater_than_max() { #[test] fn check_sign_with_dealer_fails_with_invalid_max_signers() { - let rng = rand::rngs::OsRng; + let rng = rand_core::UnwrapErr(rand::rngs::SysRng); let min_signers = 3; let max_signers = 1; @@ -175,13 +175,13 @@ fn check_sign_with_dealer_fails_with_invalid_max_signers() { /// value is working. #[test] fn check_share_generation_p256_sha256() { - let rng = rand::rngs::OsRng; + let rng = rand_core::UnwrapErr(rand::rngs::SysRng); frost_core::tests::ciphersuite_generic::check_share_generation::(rng); } #[test] fn check_share_generation_fails_with_invalid_min_signers() { - let rng = rand::rngs::OsRng; + let rng = rand_core::UnwrapErr(rand::rngs::SysRng); let min_signers = 0; let max_signers = 3; @@ -195,7 +195,7 @@ fn check_share_generation_fails_with_invalid_min_signers() { #[test] fn check_share_generation_fails_with_min_signers_greater_than_max() { - let rng = rand::rngs::OsRng; + let rng = rand_core::UnwrapErr(rand::rngs::SysRng); let min_signers = 3; let max_signers = 2; @@ -209,7 +209,7 @@ fn check_share_generation_fails_with_min_signers_greater_than_max() { #[test] fn check_share_generation_fails_with_invalid_max_signers() { - let rng = rand::rngs::OsRng; + let rng = rand_core::UnwrapErr(rand::rngs::SysRng); let min_signers = 3; let max_signers = 0; @@ -221,17 +221,18 @@ fn check_share_generation_fails_with_invalid_max_signers() { >(min_signers, max_signers, error, rng); } -lazy_static! { - pub static ref VECTORS: Value = - serde_json::from_str(include_str!("../tests/helpers/vectors.json").trim()) - .expect("Test vector is valid JSON"); - pub static ref VECTORS_BIG_IDENTIFIER: Value = - serde_json::from_str(include_str!("../tests/helpers/vectors-big-identifier.json").trim()) - .expect("Test vector is valid JSON"); - pub static ref VECTORS_DKG: Value = - serde_json::from_str(include_str!("../tests/helpers/vectors_dkg.json").trim()) - .expect("Test vector is valid JSON"); -} +static VECTORS: LazyLock = LazyLock::new(|| { + serde_json::from_str(include_str!("../tests/helpers/vectors.json").trim()) + .expect("Test vector is valid JSON") +}); +static VECTORS_BIG_IDENTIFIER: LazyLock = LazyLock::new(|| { + serde_json::from_str(include_str!("../tests/helpers/vectors-big-identifier.json").trim()) + .expect("Test vector is valid JSON") +}); +static VECTORS_DKG: LazyLock = LazyLock::new(|| { + serde_json::from_str(include_str!("../tests/helpers/vectors_dkg.json").trim()) + .expect("Test vector is valid JSON") +}); #[test] fn check_sign_with_test_vectors() { @@ -271,7 +272,7 @@ fn check_identifier_generation() -> Result<(), Error> { #[test] fn check_sign_with_dealer_and_identifiers() { - let rng = rand::rngs::OsRng; + let rng = rand_core::UnwrapErr(rand::rngs::SysRng); frost_core::tests::ciphersuite_generic::check_sign_with_dealer_and_identifiers::( rng, @@ -280,7 +281,7 @@ fn check_sign_with_dealer_and_identifiers() { #[test] fn check_sign_with_missing_identifier() { - let rng = rand::rngs::OsRng; + let rng = rand_core::UnwrapErr(rand::rngs::SysRng); frost_core::tests::ciphersuite_generic::check_sign_with_missing_identifier::( rng, ); @@ -288,7 +289,7 @@ fn check_sign_with_missing_identifier() { #[test] fn check_sign_with_incorrect_commitments() { - let rng = rand::rngs::OsRng; + let rng = rand_core::UnwrapErr(rand::rngs::SysRng); frost_core::tests::ciphersuite_generic::check_sign_with_incorrect_commitments::( rng, ); @@ -297,7 +298,7 @@ fn check_sign_with_incorrect_commitments() { #[tokio::test] async fn check_async_sign_with_dealer() { tokio::spawn(async { - let rng = rand::rngs::OsRng; + let rng = rand_core::UnwrapErr(rand::rngs::SysRng); frost_core::tests::ciphersuite_generic::async_check_sign::(rng).await; }) .await diff --git a/frost-p256/tests/rerandomized_tests.rs b/frost-p256/tests/rerandomized_tests.rs index 6dc482ce6..f03618b82 100644 --- a/frost-p256/tests/rerandomized_tests.rs +++ b/frost-p256/tests/rerandomized_tests.rs @@ -2,7 +2,7 @@ use frost_p256::P256Sha256; #[test] fn check_randomized_sign_with_dealer() { - let rng = rand::rngs::OsRng; + let rng = rand_core::UnwrapErr(rand::rngs::SysRng); let (_msg, _group_signature, _group_pubkey) = frost_rerandomized::tests::check_randomized_sign_with_dealer::(rng); diff --git a/frost-p256/tests/serde_tests.rs b/frost-p256/tests/serde_tests.rs index 7091bd7b3..08844489b 100644 --- a/frost-p256/tests/serde_tests.rs +++ b/frost-p256/tests/serde_tests.rs @@ -19,7 +19,7 @@ fn check_signing_commitments_serialization() { let commitments = samples::signing_commitments(); let json = serde_json::to_string_pretty(&commitments).unwrap(); - println!("{}", json); + println!("{json}"); let decoded_commitments: SigningCommitments = serde_json::from_str(&json).unwrap(); assert!(commitments == decoded_commitments); @@ -89,7 +89,7 @@ fn check_signing_package_serialization() { let signing_package = samples::signing_package(); let json = serde_json::to_string_pretty(&signing_package).unwrap(); - println!("{}", json); + println!("{json}"); let decoded_signing_package: SigningPackage = serde_json::from_str(&json).unwrap(); assert!(signing_package == decoded_signing_package); @@ -204,7 +204,7 @@ fn check_signature_share_serialization() { let signature_share = samples::signature_share(); let json = serde_json::to_string_pretty(&signature_share).unwrap(); - println!("{}", json); + println!("{json}"); let decoded_signature_share: SignatureShare = serde_json::from_str(&json).unwrap(); assert!(signature_share == decoded_signature_share); @@ -258,7 +258,7 @@ fn check_secret_share_serialization() { let secret_share = samples::secret_share(); let json = serde_json::to_string_pretty(&secret_share).unwrap(); - println!("{}", json); + println!("{json}"); let decoded_secret_share: SecretShare = serde_json::from_str(&json).unwrap(); assert!(secret_share == decoded_secret_share); @@ -342,7 +342,7 @@ fn check_key_package_serialization() { let key_package = samples::key_package(); let json = serde_json::to_string_pretty(&key_package).unwrap(); - println!("{}", json); + println!("{json}"); let decoded_key_package: KeyPackage = serde_json::from_str(&json).unwrap(); assert!(key_package == decoded_key_package); @@ -437,7 +437,7 @@ fn check_public_key_package_serialization() { let public_key_package = samples::public_key_package_new(); let json = serde_json::to_string_pretty(&public_key_package).unwrap(); - println!("{}", json); + println!("{json}"); let decoded_public_key_package: PublicKeyPackage = serde_json::from_str(&json).unwrap(); assert!(public_key_package == decoded_public_key_package); @@ -532,7 +532,7 @@ fn check_round1_package_serialization() { let round1_package = samples::round1_package(); let json = serde_json::to_string_pretty(&round1_package).unwrap(); - println!("{}", json); + println!("{json}"); let decoded_round1_package: round1::Package = serde_json::from_str(&json).unwrap(); assert!(round1_package == decoded_round1_package); @@ -598,7 +598,7 @@ fn check_round2_package_serialization() { let round2_package = samples::round2_package(); let json = serde_json::to_string_pretty(&round2_package).unwrap(); - println!("{}", json); + println!("{json}"); let decoded_round2_package: round2::Package = serde_json::from_str(&json).unwrap(); assert!(round2_package == decoded_round2_package); diff --git a/frost-rerandomized/Cargo.toml b/frost-rerandomized/Cargo.toml index 2579900e9..e526d5d29 100644 --- a/frost-rerandomized/Cargo.toml +++ b/frost-rerandomized/Cargo.toml @@ -1,29 +1,29 @@ [package] name = "frost-rerandomized" -edition.workspace = true -rust-version.workspace = true version.workspace = true authors.workspace = true +edition.workspace = true +rust-version.workspace = true +description = "Types and traits to support implementing a re-randomized variant of Flexible Round-Optimized Schnorr Threshold signature schemes (FROST)." +documentation = "https://docs.rs/frost-rerandomized" readme = "README.md" -license.workspace = true +homepage.workspace = true repository.workspace = true -categories.workspace = true +license.workspace = true keywords = ["cryptography", "threshold", "signature", "schnorr", "randomized"] -description = "Types and traits to support implementing a re-randomized variant of Flexible Round-Optimized Schnorr Threshold signature schemes (FROST)." +categories.workspace = true [package.metadata.docs.rs] features = ["serde"] rustdoc-args = ["--cfg", "docsrs"] [dependencies] -derive-getters = "0.5.0" +derive-getters.workspace = true document-features.workspace = true frost-core = { workspace = true, features = ["internals"] } hex.workspace = true rand_core.workspace = true -[dev-dependencies] - [features] default = ["serialization"] #! ## Features diff --git a/frost-rerandomized/src/lib.rs b/frost-rerandomized/src/lib.rs index 0b5e05715..95c2c228c 100644 --- a/frost-rerandomized/src/lib.rs +++ b/frost-rerandomized/src/lib.rs @@ -40,7 +40,7 @@ use frost_core::serde; // When pulled into `reddsa`, that has its own sibling `rand_core` import. // For the time being, we do not re-export this `rand_core`. -use rand_core::{CryptoRng, RngCore}; +use rand_core::CryptoRng; /// Randomize the given key type for usage in a FROST signing with re-randomized keys, /// using the given [`RandomizedParams`]. @@ -234,7 +234,7 @@ where #[deprecated( note = "switch to new_from_commitments(), passing the commitments from SigningPackage" )] - pub fn new( + pub fn new( mut rng: R, signing_package: &SigningPackage, ) -> Result> { @@ -273,7 +273,7 @@ where /// Returns the Randomizer and the generate randomizer seed. Both can be /// used to regenerate the Randomizer with /// [`Self::regenerate_from_seed_and_commitments()`]. - pub fn new_from_commitments( + pub fn new_from_commitments( mut rng: R, signing_commitments: &BTreeMap, SigningCommitments>, ) -> Result<(Self, Vec), Error> { @@ -381,7 +381,7 @@ where #[deprecated( note = "switch to new_from_commitments(), passing the commitments from SigningPackage" )] - pub fn new( + pub fn new( group_verifying_key: &VerifyingKey, signing_package: &SigningPackage, rng: R, @@ -404,7 +404,7 @@ where /// Returns the generated [`RandomizedParams`] and a randomizer seed. Both /// can be used to regenerate the [`RandomizedParams`] with /// [`Self::regenerate_from_seed_and_commitments()`]. - pub fn new_from_commitments( + pub fn new_from_commitments( group_verifying_key: &VerifyingKey, signing_commitments: &BTreeMap, SigningCommitments>, rng: R, diff --git a/frost-rerandomized/src/tests.rs b/frost-rerandomized/src/tests.rs index 0b5264988..de51a5b4c 100644 --- a/frost-rerandomized/src/tests.rs +++ b/frost-rerandomized/src/tests.rs @@ -9,12 +9,12 @@ use crate::{frost_core as frost, RandomizedCiphersuite, RandomizedParams, Random use frost_core::{ round1::SigningCommitments, Field, Group, Identifier, Signature, SigningPackage, VerifyingKey, }; -use rand_core::{CryptoRng, RngCore}; +use rand_core::CryptoRng; /// Test re-randomized FROST signing with trusted dealer with a Ciphersuite. /// Returns the signed message, generated signature, and the randomized public key /// so that the caller can verify the signature with their own implementation. -pub fn check_randomized_sign_with_dealer( +pub fn check_randomized_sign_with_dealer( mut rng: R, ) -> (Vec, Signature, VerifyingKey) { //////////////////////////////////////////////////////////////////////////// @@ -133,7 +133,7 @@ pub fn check_randomized_sign_with_dealer( +fn check_randomizer( pubkeys: &frost::keys::PublicKeyPackage, signing_package: &frost::SigningPackage, mut rng: &mut R, @@ -145,7 +145,7 @@ fn check_randomizer( check_from_seed_and_signing_commitments(&mut rng, signing_package.signing_commitments()); } -fn check_from_randomizer( +fn check_from_randomizer( rng: &mut R, signing_package: &SigningPackage, pubkeys: &frost::keys::PublicKeyPackage, @@ -158,7 +158,7 @@ fn check_from_randomizer( assert!(*randomizer_params.randomizer() == randomizer); } -fn check_from_randomizer_and_signing_package( +fn check_from_randomizer_and_signing_package( mut rng: &mut R, signing_package: &SigningPackage, ) { @@ -190,7 +190,7 @@ fn check_from_randomizer_and_signing_package( +fn check_from_seed_and_signing_commitments( mut rng: &mut R, signing_commitments: &BTreeMap, SigningCommitments>, ) { diff --git a/frost-ristretto255/Cargo.toml b/frost-ristretto255/Cargo.toml index 3233dc451..fea6d615b 100644 --- a/frost-ristretto255/Cargo.toml +++ b/frost-ristretto255/Cargo.toml @@ -1,36 +1,46 @@ [package] name = "frost-ristretto255" -edition.workspace = true -rust-version.workspace = true version.workspace = true authors.workspace = true +edition.workspace = true +rust-version.workspace = true +description = "A Schnorr signature scheme over the prime-order Ristretto group that supports FROST." +documentation = "https://docs.rs/frost-ristretto255" readme = "README.md" -license.workspace = true +homepage.workspace = true repository.workspace = true -categories.workspace = true +license.workspace = true keywords = ["cryptography", "crypto", "ristretto", "threshold", "signature"] -description = "A Schnorr signature scheme over the prime-order Ristretto group that supports FROST." +categories.workspace = true [package.metadata.docs.rs] features = ["serde"] rustdoc-args = ["--cfg", "docsrs"] +[lib] +# Disables non-criterion benchmark which is not used; prevents errors +# when using criterion-specific flags +bench = false + +[[bench]] +name = "bench" +harness = false + [dependencies] -curve25519-dalek = { version = "=4.1.3", features = ["rand_core"] } +curve25519-dalek.workspace = true document-features.workspace = true frost-core.workspace = true frost-rerandomized.workspace = true rand_core.workspace = true -sha2 = { version = "0.10.2", default-features = false } +sha2.workspace = true [dev-dependencies] criterion = { workspace = true, features = ["html_reports"] } frost-core = { workspace = true, features = ["test-impl"] } frost-rerandomized = { workspace = true, features = ["test-impl"] } -insta.workspace = true hex.workspace = true -lazy_static.workspace = true -postcard = { version = "1.0.0", features = ["use-std"] } +insta.workspace = true +postcard = { workspace = true, features = ["use-std"] } proptest.workspace = true rand.workspace = true rand_chacha.workspace = true @@ -46,12 +56,3 @@ default = ["serialization"] serde = ["frost-core/serde", "curve25519-dalek/serde"] ## Enable a default serialization format. Enables `serde`. serialization = ["serde", "frost-core/serialization", "frost-rerandomized/serialization"] - -[lib] -# Disables non-criterion benchmark which is not used; prevents errors -# when using criterion-specific flags -bench = false - -[[bench]] -name = "bench" -harness = false diff --git a/frost-ristretto255/README.md b/frost-ristretto255/README.md index 0f061bd95..30397b7a2 100644 --- a/frost-ristretto255/README.md +++ b/frost-ristretto255/README.md @@ -20,7 +20,7 @@ scenario in a single thread and it abstracts away any communication between peer use frost_ristretto255 as frost; use std::collections::BTreeMap; -let mut rng = rand::rngs::OsRng; +let mut rng = rand_core::UnwrapErr(rand::rngs::SysRng); let max_signers = 5; let min_signers = 3; let (shares, pubkey_package) = frost::keys::generate_with_dealer( diff --git a/frost-ristretto255/benches/bench.rs b/frost-ristretto255/benches/bench.rs index b7e9af3bd..b864c73b8 100644 --- a/frost-ristretto255/benches/bench.rs +++ b/frost-ristretto255/benches/bench.rs @@ -3,13 +3,13 @@ use criterion::{criterion_group, criterion_main, Criterion}; use frost_ristretto255::*; fn bench_ristretto255_batch_verify(c: &mut Criterion) { - let mut rng = rand::rngs::OsRng; + let mut rng = rand_core::UnwrapErr(rand::rngs::SysRng); frost_core::benches::bench_batch_verify::(c, "ristretto255", &mut rng); } fn bench_ristretto255_sign(c: &mut Criterion) { - let mut rng = rand::rngs::OsRng; + let mut rng = rand_core::UnwrapErr(rand::rngs::SysRng); frost_core::benches::bench_sign::(c, "ristretto255", &mut rng); } diff --git a/frost-ristretto255/dkg.md b/frost-ristretto255/dkg.md index fcba23beb..21e446374 100644 --- a/frost-ristretto255/dkg.md +++ b/frost-ristretto255/dkg.md @@ -20,11 +20,9 @@ first round of communication to ensure all participants have the same value. ```rust # // ANCHOR: dkg_import use std::collections::BTreeMap; - use frost_ristretto255 as frost; -let mut rng = rand::rngs::OsRng; - +let mut rng = rand_core::UnwrapErr(rand::rngs::SysRng); let max_signers = 5; let min_signers = 3; # // ANCHOR_END: dkg_import diff --git a/frost-ristretto255/src/keys/dkg.rs b/frost-ristretto255/src/keys/dkg.rs index 2d13265bb..65914810f 100644 --- a/frost-ristretto255/src/keys/dkg.rs +++ b/frost-ristretto255/src/keys/dkg.rs @@ -46,7 +46,7 @@ pub mod round2 { /// It returns the [`round1::SecretPackage`] that must be kept in memory /// by the participant for the other steps, and the [`round1::Package`] that /// must be sent to each other participant in the DKG run. -pub fn part1( +pub fn part1( identifier: Identifier, max_signers: u16, min_signers: u16, diff --git a/frost-ristretto255/src/keys/refresh.rs b/frost-ristretto255/src/keys/refresh.rs index bb4b6dd64..2d44f2bdb 100644 --- a/frost-ristretto255/src/keys/refresh.rs +++ b/frost-ristretto255/src/keys/refresh.rs @@ -5,14 +5,14 @@ use crate::{ frost, keys::dkg::{round1, round2}, - CryptoRng, Error, Identifier, RngCore, + CryptoRng, Error, Identifier, }; use alloc::{collections::btree_map::BTreeMap, vec::Vec}; use super::{KeyPackage, PublicKeyPackage, SecretShare}; /// Refer to [`frost_core::keys::refresh::compute_refreshing_shares`]. -pub fn compute_refreshing_shares( +pub fn compute_refreshing_shares( old_pub_key_package: PublicKeyPackage, identifiers: &[Identifier], mut rng: &mut R, @@ -29,7 +29,7 @@ pub fn refresh_share( } /// Refer to [`frost_core::keys::refresh::refresh_dkg_part1`]. -pub fn refresh_dkg_part1( +pub fn refresh_dkg_part1( identifier: Identifier, max_signers: u16, min_signers: u16, diff --git a/frost-ristretto255/src/keys/repairable.rs b/frost-ristretto255/src/keys/repairable.rs index 3c316bcc3..cd8f94bd0 100644 --- a/frost-ristretto255/src/keys/repairable.rs +++ b/frost-ristretto255/src/keys/repairable.rs @@ -10,7 +10,7 @@ use crate::keys::{KeyPackage, PublicKeyPackage}; // This is imported separately to make `gencode` work. // (if it were below, the position of the import would vary between ciphersuites // after `cargo fmt`) -use crate::{frost, Ciphersuite, CryptoRng, Identifier, RngCore}; +use crate::{frost, Ciphersuite, CryptoRng, Identifier}; use crate::{Error, Ristretto255Sha512}; /// A delta value which is the output of part 1 of RTS. @@ -26,7 +26,7 @@ pub type Sigma = frost::keys::repairable::Sigma; /// `participant` recover their share. /// /// Returns a BTreeMap mapping which value should be sent to which participant. -pub fn repair_share_part1( +pub fn repair_share_part1( helpers: &[Identifier], key_package_i: &KeyPackage, rng: &mut R, @@ -62,22 +62,17 @@ pub fn repair_share_part3( #[cfg(test)] mod tests { - - use lazy_static::lazy_static; - - use serde_json::Value; - use crate::Ristretto255Sha512; + use serde_json::Value; + use std::sync::LazyLock; - lazy_static! { - pub static ref REPAIR_SHARE: Value = - serde_json::from_str(include_str!("../../tests/helpers/repair-share.json").trim()) - .unwrap(); - } + static REPAIR_SHARE: LazyLock = LazyLock::new(|| { + serde_json::from_str(include_str!("../../tests/helpers/repair-share.json").trim()).unwrap() + }); #[test] fn check_repair_share_part1() { - let rng = rand::rngs::OsRng; + let rng = rand_core::UnwrapErr(rand::rngs::SysRng); frost_core::tests::repairable::check_repair_share_part1::(rng); } @@ -91,7 +86,7 @@ mod tests { #[test] fn check_repair_share_part3() { - let rng = rand::rngs::OsRng; + let rng = rand_core::UnwrapErr(rand::rngs::SysRng); frost_core::tests::repairable::check_repair_share_part3::( rng, &REPAIR_SHARE, @@ -100,7 +95,7 @@ mod tests { #[test] fn check_repair_share_part1_fails_with_invalid_min_signers() { - let rng = rand::rngs::OsRng; + let rng = rand_core::UnwrapErr(rand::rngs::SysRng); frost_core::tests::repairable::check_repair_share_part1_fails_with_invalid_min_signers::< Ristretto255Sha512, _, diff --git a/frost-ristretto255/src/lib.rs b/frost-ristretto255/src/lib.rs index 490e34c87..064e8ff3a 100644 --- a/frost-ristretto255/src/lib.rs +++ b/frost-ristretto255/src/lib.rs @@ -3,6 +3,9 @@ #![deny(missing_docs)] #![doc = include_str!("../README.md")] +#[cfg(test)] +extern crate std; + extern crate alloc; use alloc::collections::BTreeMap; @@ -14,7 +17,7 @@ use curve25519_dalek::{ traits::Identity, }; use frost_rerandomized::RandomizedCiphersuite; -use rand_core::{CryptoRng, RngCore}; +use rand_core::CryptoRng; use sha2::{Digest, Sha512}; use frost_core as frost; @@ -60,7 +63,7 @@ impl Field for RistrettoScalarField { } } - fn random(rng: &mut R) -> Self::Scalar { + fn random(rng: &mut R) -> Self::Scalar { Scalar::random(rng) } @@ -230,7 +233,7 @@ pub mod keys { /// Allows all participants' keys to be generated using a central, trusted /// dealer. - pub fn generate_with_dealer( + pub fn generate_with_dealer( max_signers: u16, min_signers: u16, identifiers: IdentifierList, @@ -245,7 +248,7 @@ pub mod keys { /// instead of generating a fresh one. This is useful in scenarios where /// the key needs to be generated externally or must be derived from e.g. a /// seed phrase. - pub fn split( + pub fn split( secret: &SigningKey, max_signers: u16, min_signers: u16, @@ -346,7 +349,7 @@ pub mod round1 { /// operation. pub fn commit(secret: &SigningShare, rng: &mut RNG) -> (SigningNonces, SigningCommitments) where - RNG: CryptoRng + RngCore, + RNG: CryptoRng, { frost::round1::commit::(secret, rng) } diff --git a/frost-ristretto255/src/tests/batch.rs b/frost-ristretto255/src/tests/batch.rs index b26d033cf..826a32dc2 100644 --- a/frost-ristretto255/src/tests/batch.rs +++ b/frost-ristretto255/src/tests/batch.rs @@ -2,21 +2,21 @@ use crate::*; #[test] fn check_batch_verify() { - let rng = rand::rngs::OsRng; + let rng = rand_core::UnwrapErr(rand::rngs::SysRng); frost_core::tests::batch::batch_verify::(rng); } #[test] fn check_bad_batch_verify() { - let rng = rand::rngs::OsRng; + let rng = rand_core::UnwrapErr(rand::rngs::SysRng); frost_core::tests::batch::bad_batch_verify::(rng); } #[test] fn empty_batch_verify() { - let rng = rand::rngs::OsRng; + let rng = rand_core::UnwrapErr(rand::rngs::SysRng); frost_core::tests::batch::empty_batch_verify::(rng); } diff --git a/frost-ristretto255/src/tests/coefficient_commitment.rs b/frost-ristretto255/src/tests/coefficient_commitment.rs index a031d4c46..710bef7d4 100644 --- a/frost-ristretto255/src/tests/coefficient_commitment.rs +++ b/frost-ristretto255/src/tests/coefficient_commitment.rs @@ -1,18 +1,17 @@ -use lazy_static::lazy_static; use serde_json::Value; +use std::sync::LazyLock; use crate::*; // Tests for serialization and deserialization of CoefficientCommitment -lazy_static! { - pub static ref ELEMENTS: Value = - serde_json::from_str(include_str!("../../tests/helpers/elements.json").trim()).unwrap(); -} +static ELEMENTS: LazyLock = LazyLock::new(|| { + serde_json::from_str(include_str!("../../tests/helpers/elements.json").trim()).unwrap() +}); #[test] fn check_serialization_of_coefficient_commitment() { - let rng = rand::rngs::OsRng; + let rng = rand_core::UnwrapErr(rand::rngs::SysRng); frost_core::tests::coefficient_commitment::check_serialization_of_coefficient_commitment::< Ristretto255Sha512, _, @@ -21,7 +20,7 @@ fn check_serialization_of_coefficient_commitment() { #[test] fn check_create_coefficient_commitment() { - let rng = rand::rngs::OsRng; + let rng = rand_core::UnwrapErr(rand::rngs::SysRng); frost_core::tests::coefficient_commitment::check_create_coefficient_commitment::< Ristretto255Sha512, _, @@ -36,7 +35,7 @@ fn check_create_coefficient_commitment_error() { #[test] fn check_get_value_of_coefficient_commitment() { - let rng = rand::rngs::OsRng; + let rng = rand_core::UnwrapErr(rand::rngs::SysRng); frost_core::tests::coefficient_commitment::check_get_value_of_coefficient_commitment::< Ristretto255Sha512, diff --git a/frost-ristretto255/src/tests/vss_commitment.rs b/frost-ristretto255/src/tests/vss_commitment.rs index 06b16e422..f2b691072 100644 --- a/frost-ristretto255/src/tests/vss_commitment.rs +++ b/frost-ristretto255/src/tests/vss_commitment.rs @@ -1,24 +1,23 @@ -use lazy_static::lazy_static; use serde_json::Value; +use std::sync::LazyLock; use crate::*; // Tests for serialization and deserialization VerifiableSecretSharingCommitment -lazy_static! { - pub static ref ELEMENTS: Value = - serde_json::from_str(include_str!("../../tests/helpers/elements.json").trim()).unwrap(); -} +static ELEMENTS: LazyLock = LazyLock::new(|| { + serde_json::from_str(include_str!("../../tests/helpers/elements.json").trim()).unwrap() +}); #[test] fn check_serialize_vss_commitment() { - let rng = rand::rngs::OsRng; + let rng = rand_core::UnwrapErr(rand::rngs::SysRng); frost_core::tests::vss_commitment::check_serialize_vss_commitment::(rng); } #[test] fn check_serialize_whole_vss_commitment() { - let rng = rand::rngs::OsRng; + let rng = rand_core::UnwrapErr(rand::rngs::SysRng); frost_core::tests::vss_commitment::check_serialize_whole_vss_commitment::( rng, ); @@ -26,7 +25,7 @@ fn check_serialize_whole_vss_commitment() { #[test] fn check_deserialize_vss_commitment() { - let rng = rand::rngs::OsRng; + let rng = rand_core::UnwrapErr(rand::rngs::SysRng); frost_core::tests::vss_commitment::check_deserialize_vss_commitment::( rng, ); @@ -34,7 +33,7 @@ fn check_deserialize_vss_commitment() { #[test] fn check_deserialize_whole_vss_commitment() { - let rng = rand::rngs::OsRng; + let rng = rand_core::UnwrapErr(rand::rngs::SysRng); frost_core::tests::vss_commitment::check_deserialize_whole_vss_commitment::< Ristretto255Sha512, _, @@ -43,7 +42,7 @@ fn check_deserialize_whole_vss_commitment() { #[test] fn check_deserialize_vss_commitment_error() { - let rng = rand::rngs::OsRng; + let rng = rand_core::UnwrapErr(rand::rngs::SysRng); frost_core::tests::vss_commitment::check_deserialize_vss_commitment_error::< Ristretto255Sha512, _, @@ -52,7 +51,7 @@ fn check_deserialize_vss_commitment_error() { #[test] fn check_deserialize_whole_vss_commitment_error() { - let rng = rand::rngs::OsRng; + let rng = rand_core::UnwrapErr(rand::rngs::SysRng); frost_core::tests::vss_commitment::check_deserialize_whole_vss_commitment_error::< Ristretto255Sha512, _, @@ -61,7 +60,7 @@ fn check_deserialize_whole_vss_commitment_error() { #[test] fn check_compute_public_key_package() { - let rng = rand::rngs::OsRng; + let rng = rand_core::UnwrapErr(rand::rngs::SysRng); frost_core::tests::vss_commitment::check_compute_public_key_package::( rng, ); diff --git a/frost-ristretto255/tests/common_traits_tests.rs b/frost-ristretto255/tests/common_traits_tests.rs index 8d1fcf2b1..4ec4849d3 100644 --- a/frost-ristretto255/tests/common_traits_tests.rs +++ b/frost-ristretto255/tests/common_traits_tests.rs @@ -19,7 +19,7 @@ fn check_common_traits_for_type(v: #[test] fn check_signing_key_common_traits() { - let mut rng = rand::rngs::OsRng; + let mut rng = rand_core::UnwrapErr(rand::rngs::SysRng); let signing_key = SigningKey::new(&mut rng); check_common_traits_for_type(signing_key); } diff --git a/frost-ristretto255/tests/integration_tests.rs b/frost-ristretto255/tests/integration_tests.rs index c4ef3be0e..50b19970f 100644 --- a/frost-ristretto255/tests/integration_tests.rs +++ b/frost-ristretto255/tests/integration_tests.rs @@ -1,6 +1,6 @@ use frost_ristretto255::*; -use lazy_static::lazy_static; use serde_json::Value; +use std::sync::LazyLock; #[test] fn check_zero_key_fails() { @@ -9,14 +9,14 @@ fn check_zero_key_fails() { #[test] fn check_sign_with_dkg() { - let rng = rand::rngs::OsRng; + let rng = rand_core::UnwrapErr(rand::rngs::SysRng); frost_core::tests::ciphersuite_generic::check_sign_with_dkg::(rng); } #[test] fn check_dkg_part1_fails_with_invalid_signers_min_signers() { - let rng = rand::rngs::OsRng; + let rng = rand_core::UnwrapErr(rand::rngs::SysRng); let min_signers = 1; let max_signers = 3; @@ -30,7 +30,7 @@ fn check_dkg_part1_fails_with_invalid_signers_min_signers() { #[test] fn check_dkg_part1_fails_with_min_signers_greater_than_max() { - let rng = rand::rngs::OsRng; + let rng = rand_core::UnwrapErr(rand::rngs::SysRng); let min_signers = 3; let max_signers = 2; @@ -44,7 +44,7 @@ fn check_dkg_part1_fails_with_min_signers_greater_than_max() { #[test] fn check_dkg_part1_fails_with_invalid_signers_max_signers() { - let rng = rand::rngs::OsRng; + let rng = rand_core::UnwrapErr(rand::rngs::SysRng); let min_signers = 3; let max_signers = 1; @@ -58,21 +58,21 @@ fn check_dkg_part1_fails_with_invalid_signers_max_signers() { #[test] fn check_rts() { - let rng = rand::rngs::OsRng; + let rng = rand_core::UnwrapErr(rand::rngs::SysRng); frost_core::tests::repairable::check_rts::(rng); } #[test] fn check_refresh_shares_with_dealer() { - let rng = rand::rngs::OsRng; + let rng = rand_core::UnwrapErr(rand::rngs::SysRng); frost_core::tests::refresh::check_refresh_shares_with_dealer::(rng); } #[test] fn check_refresh_shares_with_dealer_serialisation() { - let rng = rand::rngs::OsRng; + let rng = rand_core::UnwrapErr(rand::rngs::SysRng); frost_core::tests::refresh::check_refresh_shares_with_dealer_serialisation::< Ristretto255Sha512, @@ -82,7 +82,7 @@ fn check_refresh_shares_with_dealer_serialisation() { #[test] fn check_refresh_shares_with_dealer_fails_with_invalid_public_key_package() { - let rng = rand::rngs::OsRng; + let rng = rand_core::UnwrapErr(rand::rngs::SysRng); frost_core::tests::refresh::check_refresh_shares_with_dealer_fails_with_invalid_public_key_package::< Ristretto255Sha512, @@ -92,7 +92,7 @@ fn check_refresh_shares_with_dealer_fails_with_invalid_public_key_package() { #[test] fn check_refresh_shares_with_dealer_fails_with_invalid_identifier() { - let rng = rand::rngs::OsRng; + let rng = rand_core::UnwrapErr(rand::rngs::SysRng); let identifiers = vec![ Identifier::try_from(8).unwrap(), Identifier::try_from(3).unwrap(), @@ -109,14 +109,14 @@ fn check_refresh_shares_with_dealer_fails_with_invalid_identifier() { #[test] fn check_refresh_shares_with_dkg() { - let rng = rand::rngs::OsRng; + let rng = rand_core::UnwrapErr(rand::rngs::SysRng); frost_core::tests::refresh::check_refresh_shares_with_dkg::(rng); } #[test] fn check_refresh_shares_with_dkg_smaller_threshold() { - let rng = rand::rngs::OsRng; + let rng = rand_core::UnwrapErr(rand::rngs::SysRng); frost_core::tests::refresh::check_refresh_shares_with_dkg_smaller_threshold::< Ristretto255Sha512, @@ -126,14 +126,14 @@ fn check_refresh_shares_with_dkg_smaller_threshold() { #[test] fn check_sign_with_dealer() { - let rng = rand::rngs::OsRng; + let rng = rand_core::UnwrapErr(rand::rngs::SysRng); frost_core::tests::ciphersuite_generic::check_sign_with_dealer::(rng); } #[test] fn check_sign_with_dealer_fails_with_invalid_min_signers() { - let rng = rand::rngs::OsRng; + let rng = rand_core::UnwrapErr(rand::rngs::SysRng); let min_signers = 1; let max_signers = 3; @@ -147,7 +147,7 @@ fn check_sign_with_dealer_fails_with_invalid_min_signers() { #[test] fn check_sign_with_dealer_fails_with_min_signers_greater_than_max() { - let rng = rand::rngs::OsRng; + let rng = rand_core::UnwrapErr(rand::rngs::SysRng); let min_signers = 3; let max_signers = 2; @@ -161,7 +161,7 @@ fn check_sign_with_dealer_fails_with_min_signers_greater_than_max() { #[test] fn check_sign_with_dealer_fails_with_invalid_max_signers() { - let rng = rand::rngs::OsRng; + let rng = rand_core::UnwrapErr(rand::rngs::SysRng); let min_signers = 3; let max_signers = 1; @@ -177,13 +177,13 @@ fn check_sign_with_dealer_fails_with_invalid_max_signers() { /// value is working. #[test] fn check_share_generation_ristretto255_sha512() { - let rng = rand::rngs::OsRng; + let rng = rand_core::UnwrapErr(rand::rngs::SysRng); frost_core::tests::ciphersuite_generic::check_share_generation::(rng); } #[test] fn check_share_generation_fails_with_invalid_min_signers() { - let rng = rand::rngs::OsRng; + let rng = rand_core::UnwrapErr(rand::rngs::SysRng); let min_signers = 0; let max_signers = 3; @@ -197,7 +197,7 @@ fn check_share_generation_fails_with_invalid_min_signers() { #[test] fn check_share_generation_fails_with_min_signers_greater_than_max() { - let rng = rand::rngs::OsRng; + let rng = rand_core::UnwrapErr(rand::rngs::SysRng); let min_signers = 3; let max_signers = 2; @@ -211,7 +211,7 @@ fn check_share_generation_fails_with_min_signers_greater_than_max() { #[test] fn check_share_generation_fails_with_invalid_max_signers() { - let rng = rand::rngs::OsRng; + let rng = rand_core::UnwrapErr(rand::rngs::SysRng); let min_signers = 3; let max_signers = 0; @@ -223,17 +223,18 @@ fn check_share_generation_fails_with_invalid_max_signers() { >(min_signers, max_signers, error, rng); } -lazy_static! { - pub static ref VECTORS: Value = - serde_json::from_str(include_str!("../tests/helpers/vectors.json").trim()) - .expect("Test vector is valid JSON"); - pub static ref VECTORS_BIG_IDENTIFIER: Value = - serde_json::from_str(include_str!("../tests/helpers/vectors-big-identifier.json").trim()) - .expect("Test vector is valid JSON"); - pub static ref VECTORS_DKG: Value = - serde_json::from_str(include_str!("../tests/helpers/vectors_dkg.json").trim()) - .expect("Test vector is valid JSON"); -} +static VECTORS: LazyLock = LazyLock::new(|| { + serde_json::from_str(include_str!("../tests/helpers/vectors.json").trim()) + .expect("Test vector is valid JSON") +}); +static VECTORS_BIG_IDENTIFIER: LazyLock = LazyLock::new(|| { + serde_json::from_str(include_str!("../tests/helpers/vectors-big-identifier.json").trim()) + .expect("Test vector is valid JSON") +}); +static VECTORS_DKG: LazyLock = LazyLock::new(|| { + serde_json::from_str(include_str!("../tests/helpers/vectors_dkg.json").trim()) + .expect("Test vector is valid JSON") +}); #[test] fn check_sign_with_test_vectors() { @@ -275,7 +276,7 @@ fn check_identifier_generation() -> Result<(), Error> { #[test] fn check_sign_with_dealer_and_identifiers() { - let rng = rand::rngs::OsRng; + let rng = rand_core::UnwrapErr(rand::rngs::SysRng); frost_core::tests::ciphersuite_generic::check_sign_with_dealer_and_identifiers::< Ristretto255Sha512, @@ -285,7 +286,7 @@ fn check_sign_with_dealer_and_identifiers() { #[test] fn check_sign_with_missing_identifier() { - let rng = rand::rngs::OsRng; + let rng = rand_core::UnwrapErr(rand::rngs::SysRng); frost_core::tests::ciphersuite_generic::check_sign_with_missing_identifier::< Ristretto255Sha512, _, @@ -294,7 +295,7 @@ fn check_sign_with_missing_identifier() { #[test] fn check_sign_with_incorrect_commitments() { - let rng = rand::rngs::OsRng; + let rng = rand_core::UnwrapErr(rand::rngs::SysRng); frost_core::tests::ciphersuite_generic::check_sign_with_incorrect_commitments::< Ristretto255Sha512, _, @@ -304,7 +305,7 @@ fn check_sign_with_incorrect_commitments() { #[tokio::test] async fn check_async_sign_with_dealer() { tokio::spawn(async { - let rng = rand::rngs::OsRng; + let rng = rand_core::UnwrapErr(rand::rngs::SysRng); frost_core::tests::ciphersuite_generic::async_check_sign::(rng) .await; }) diff --git a/frost-ristretto255/tests/rerandomized_tests.rs b/frost-ristretto255/tests/rerandomized_tests.rs index 23277d0a9..b95d100b0 100644 --- a/frost-ristretto255/tests/rerandomized_tests.rs +++ b/frost-ristretto255/tests/rerandomized_tests.rs @@ -2,7 +2,7 @@ use frost_ristretto255::Ristretto255Sha512; #[test] fn check_randomized_sign_with_dealer() { - let rng = rand::rngs::OsRng; + let rng = rand_core::UnwrapErr(rand::rngs::SysRng); let (_msg, _group_signature, _group_pubkey) = frost_rerandomized::tests::check_randomized_sign_with_dealer::(rng); diff --git a/frost-ristretto255/tests/serde_tests.rs b/frost-ristretto255/tests/serde_tests.rs index d73e846ef..531fcf65f 100644 --- a/frost-ristretto255/tests/serde_tests.rs +++ b/frost-ristretto255/tests/serde_tests.rs @@ -19,7 +19,7 @@ fn check_signing_commitments_serialization() { let commitments = samples::signing_commitments(); let json = serde_json::to_string_pretty(&commitments).unwrap(); - println!("{}", json); + println!("{json}"); let decoded_commitments: SigningCommitments = serde_json::from_str(&json).unwrap(); assert!(commitments == decoded_commitments); @@ -89,7 +89,7 @@ fn check_signing_package_serialization() { let signing_package = samples::signing_package(); let json = serde_json::to_string_pretty(&signing_package).unwrap(); - println!("{}", json); + println!("{json}"); let decoded_signing_package: SigningPackage = serde_json::from_str(&json).unwrap(); assert!(signing_package == decoded_signing_package); @@ -204,7 +204,7 @@ fn check_signature_share_serialization() { let signature_share = samples::signature_share(); let json = serde_json::to_string_pretty(&signature_share).unwrap(); - println!("{}", json); + println!("{json}"); let decoded_signature_share: SignatureShare = serde_json::from_str(&json).unwrap(); assert!(signature_share == decoded_signature_share); @@ -258,7 +258,7 @@ fn check_secret_share_serialization() { let secret_share = samples::secret_share(); let json = serde_json::to_string_pretty(&secret_share).unwrap(); - println!("{}", json); + println!("{json}"); let decoded_secret_share: SecretShare = serde_json::from_str(&json).unwrap(); assert!(secret_share == decoded_secret_share); @@ -342,7 +342,7 @@ fn check_key_package_serialization() { let key_package = samples::key_package(); let json = serde_json::to_string_pretty(&key_package).unwrap(); - println!("{}", json); + println!("{json}"); let decoded_key_package: KeyPackage = serde_json::from_str(&json).unwrap(); assert!(key_package == decoded_key_package); @@ -437,7 +437,7 @@ fn check_public_key_package_serialization() { let public_key_package = samples::public_key_package_new(); let json = serde_json::to_string_pretty(&public_key_package).unwrap(); - println!("{}", json); + println!("{json}"); let decoded_public_key_package: PublicKeyPackage = serde_json::from_str(&json).unwrap(); assert!(public_key_package == decoded_public_key_package); @@ -532,7 +532,7 @@ fn check_round1_package_serialization() { let round1_package = samples::round1_package(); let json = serde_json::to_string_pretty(&round1_package).unwrap(); - println!("{}", json); + println!("{json}"); let decoded_round1_package: round1::Package = serde_json::from_str(&json).unwrap(); assert!(round1_package == decoded_round1_package); @@ -598,7 +598,7 @@ fn check_round2_package_serialization() { let round2_package = samples::round2_package(); let json = serde_json::to_string_pretty(&round2_package).unwrap(); - println!("{}", json); + println!("{json}"); let decoded_round2_package: round2::Package = serde_json::from_str(&json).unwrap(); assert!(round2_package == decoded_round2_package); diff --git a/frost-secp256k1-tr/Cargo.toml b/frost-secp256k1-tr/Cargo.toml index ad45c8fb9..0d6f7ed6b 100644 --- a/frost-secp256k1-tr/Cargo.toml +++ b/frost-secp256k1-tr/Cargo.toml @@ -1,39 +1,49 @@ [package] name = "frost-secp256k1-tr" -edition.workspace = true -rust-version.workspace = true version.workspace = true authors.workspace = true +edition.workspace = true +rust-version.workspace = true +description = "A Schnorr signature scheme over the secp256k1 curve that supports FROST and Taproot." +documentation = "https://docs.rs/frost-secp256k1-tr" readme = "README.md" -license.workspace = true +homepage.workspace = true repository.workspace = true -categories.workspace = true +license.workspace = true keywords = ["cryptography", "crypto", "secp256k1", "threshold", "signature"] -description = "A Schnorr signature scheme over the secp256k1 curve that supports FROST and Taproot." +categories.workspace = true [package.metadata.docs.rs] features = ["serde"] rustdoc-args = ["--cfg", "docsrs"] +[lib] +# Disables non-criterion benchmark which is not used; prevents errors +# when using criterion-specific flags +bench = false + +[[bench]] +name = "bench" +harness = false + [dependencies] document-features.workspace = true frost-core.workspace = true frost-rerandomized.workspace = true -k256 = { version = "0.13.0", features = ["arithmetic", "expose-field", "hash2curve"], default-features = false } +k256.workspace = true rand_core.workspace = true -sha2 = { version = "0.10.2", default-features = false } +sha2.workspace = true [dev-dependencies] criterion.workspace = true frost-core = { workspace = true, features = ["test-impl"] } frost-rerandomized = { workspace = true, features = ["test-impl"] } -insta.workspace = true hex.workspace = true -lazy_static.workspace = true +insta.workspace = true proptest.workspace = true rand.workspace = true rand_chacha.workspace = true -secp256k1 = "0.31.0" +secp256k1.workspace = true serde_json.workspace = true tokio.workspace = true @@ -46,12 +56,3 @@ default = ["serialization"] serde = ["frost-core/serde"] ## Enable a default serialization format. Enables `serde`. serialization = ["serde", "frost-core/serialization", "frost-rerandomized/serialization"] - -[lib] -# Disables non-criterion benchmark which is not used; prevents errors -# when using criterion-specific flags -bench = false - -[[bench]] -name = "bench" -harness = false diff --git a/frost-secp256k1-tr/README.md b/frost-secp256k1-tr/README.md index bc74f3ef2..64fd8b814 100644 --- a/frost-secp256k1-tr/README.md +++ b/frost-secp256k1-tr/README.md @@ -20,7 +20,7 @@ scenario in a single thread and it abstracts away any communication between peer use frost_secp256k1_tr as frost; use std::collections::BTreeMap; -let mut rng = rand::rngs::OsRng; +let mut rng = rand_core::UnwrapErr(rand::rngs::SysRng); let max_signers = 5; let min_signers = 3; let (shares, pubkey_package) = frost::keys::generate_with_dealer( diff --git a/frost-secp256k1-tr/benches/bench.rs b/frost-secp256k1-tr/benches/bench.rs index d2ce56f2a..4e78e64df 100644 --- a/frost-secp256k1-tr/benches/bench.rs +++ b/frost-secp256k1-tr/benches/bench.rs @@ -3,13 +3,13 @@ use criterion::{criterion_group, criterion_main, Criterion}; use frost_secp256k1_tr::*; fn bench_secp256k1_batch_verify(c: &mut Criterion) { - let mut rng = rand::rngs::OsRng; + let mut rng = rand_core::UnwrapErr(rand::rngs::SysRng); frost_core::benches::bench_batch_verify::(c, "secp256k1", &mut rng); } fn bench_secp256k1_sign(c: &mut Criterion) { - let mut rng = rand::rngs::OsRng; + let mut rng = rand_core::UnwrapErr(rand::rngs::SysRng); frost_core::benches::bench_sign::(c, "secp256k1", &mut rng); } diff --git a/frost-secp256k1-tr/dkg.md b/frost-secp256k1-tr/dkg.md index e0be3936c..9c9015c87 100644 --- a/frost-secp256k1-tr/dkg.md +++ b/frost-secp256k1-tr/dkg.md @@ -20,11 +20,9 @@ first round of communication to ensure all participants have the same value. ```rust # // ANCHOR: dkg_import use std::collections::BTreeMap; - use frost_secp256k1_tr as frost; -let mut rng = rand::rngs::OsRng; - +let mut rng = rand_core::UnwrapErr(rand::rngs::SysRng); let max_signers = 5; let min_signers = 3; # // ANCHOR_END: dkg_import diff --git a/frost-secp256k1-tr/src/keys/dkg.rs b/frost-secp256k1-tr/src/keys/dkg.rs index 9ea40b263..c5b0c231a 100644 --- a/frost-secp256k1-tr/src/keys/dkg.rs +++ b/frost-secp256k1-tr/src/keys/dkg.rs @@ -46,7 +46,7 @@ pub mod round2 { /// It returns the [`round1::SecretPackage`] that must be kept in memory /// by the participant for the other steps, and the [`round1::Package`] that /// must be sent to each other participant in the DKG run. -pub fn part1( +pub fn part1( identifier: Identifier, max_signers: u16, min_signers: u16, diff --git a/frost-secp256k1-tr/src/keys/refresh.rs b/frost-secp256k1-tr/src/keys/refresh.rs index bb4b6dd64..2d44f2bdb 100644 --- a/frost-secp256k1-tr/src/keys/refresh.rs +++ b/frost-secp256k1-tr/src/keys/refresh.rs @@ -5,14 +5,14 @@ use crate::{ frost, keys::dkg::{round1, round2}, - CryptoRng, Error, Identifier, RngCore, + CryptoRng, Error, Identifier, }; use alloc::{collections::btree_map::BTreeMap, vec::Vec}; use super::{KeyPackage, PublicKeyPackage, SecretShare}; /// Refer to [`frost_core::keys::refresh::compute_refreshing_shares`]. -pub fn compute_refreshing_shares( +pub fn compute_refreshing_shares( old_pub_key_package: PublicKeyPackage, identifiers: &[Identifier], mut rng: &mut R, @@ -29,7 +29,7 @@ pub fn refresh_share( } /// Refer to [`frost_core::keys::refresh::refresh_dkg_part1`]. -pub fn refresh_dkg_part1( +pub fn refresh_dkg_part1( identifier: Identifier, max_signers: u16, min_signers: u16, diff --git a/frost-secp256k1-tr/src/keys/repairable.rs b/frost-secp256k1-tr/src/keys/repairable.rs index 3ae930d49..47bd0c7fe 100644 --- a/frost-secp256k1-tr/src/keys/repairable.rs +++ b/frost-secp256k1-tr/src/keys/repairable.rs @@ -10,7 +10,7 @@ use crate::keys::{KeyPackage, PublicKeyPackage}; // This is imported separately to make `gencode` work. // (if it were below, the position of the import would vary between ciphersuites // after `cargo fmt`) -use crate::{frost, Ciphersuite, CryptoRng, Identifier, RngCore}; +use crate::{frost, Ciphersuite, CryptoRng, Identifier}; use crate::{Error, Secp256K1Sha256TR}; /// A delta value which is the output of part 1 of RTS. @@ -26,7 +26,7 @@ pub type Sigma = frost::keys::repairable::Sigma; /// `participant` recover their share. /// /// Returns a BTreeMap mapping which value should be sent to which participant. -pub fn repair_share_part1( +pub fn repair_share_part1( helpers: &[Identifier], key_package_i: &KeyPackage, rng: &mut R, @@ -62,22 +62,17 @@ pub fn repair_share_part3( #[cfg(test)] mod tests { - - use lazy_static::lazy_static; - - use serde_json::Value; - use crate::Secp256K1Sha256TR; + use serde_json::Value; + use std::sync::LazyLock; - lazy_static! { - pub static ref REPAIR_SHARE: Value = - serde_json::from_str(include_str!("../../tests/helpers/repair-share.json").trim()) - .unwrap(); - } + static REPAIR_SHARE: LazyLock = LazyLock::new(|| { + serde_json::from_str(include_str!("../../tests/helpers/repair-share.json").trim()).unwrap() + }); #[test] fn check_repair_share_part1() { - let rng = rand::rngs::OsRng; + let rng = rand_core::UnwrapErr(rand::rngs::SysRng); frost_core::tests::repairable::check_repair_share_part1::(rng); } @@ -89,7 +84,7 @@ mod tests { #[test] fn check_repair_share_part3() { - let rng = rand::rngs::OsRng; + let rng = rand_core::UnwrapErr(rand::rngs::SysRng); frost_core::tests::repairable::check_repair_share_part3::( rng, &REPAIR_SHARE, @@ -98,7 +93,7 @@ mod tests { #[test] fn check_repair_share_part1_fails_with_invalid_min_signers() { - let rng = rand::rngs::OsRng; + let rng = rand_core::UnwrapErr(rand::rngs::SysRng); frost_core::tests::repairable::check_repair_share_part1_fails_with_invalid_min_signers::< Secp256K1Sha256TR, _, diff --git a/frost-secp256k1-tr/src/lib.rs b/frost-secp256k1-tr/src/lib.rs index daa19608e..07ec0f60d 100644 --- a/frost-secp256k1-tr/src/lib.rs +++ b/frost-secp256k1-tr/src/lib.rs @@ -5,25 +5,26 @@ #![doc = include_str!("../README.md")] #![doc = document_features::document_features!()] +#[cfg(test)] +extern crate std; + extern crate alloc; use alloc::vec; use alloc::{borrow::Cow, collections::BTreeMap, vec::Vec}; use frost_rerandomized::RandomizedCiphersuite; -use k256::elliptic_curve::ops::Reduce; use k256::{ elliptic_curve::{ - bigint::U256, - group::prime::PrimeCurveAffine, - hash2curve::{hash_to_field, ExpandMsgXmd}, + ops::Reduce, point::AffineCoordinates, - sec1::{FromEncodedPoint, ToEncodedPoint}, - Field as FFField, PrimeField, + sec1::{FromSec1Point, ToSec1Point}, + CurveAffine, Field as FFField, PrimeField, }, - AffinePoint, ProjectivePoint, Scalar, + hash2curve::{hash_to_field, ExpandMsgXmd, MapToCurve}, + AffinePoint, ProjectivePoint, Scalar, Secp256k1, U256, }; -use rand_core::{CryptoRng, RngCore}; +use rand_core::CryptoRng; use sha2::{Digest, Sha256}; use frost_core::{self as frost, random_nonzero}; @@ -71,7 +72,7 @@ impl Field for Secp256K1ScalarField { } } - fn random(rng: &mut R) -> Self::Scalar { + fn random(rng: &mut R) -> Self::Scalar { Scalar::random(rng) } @@ -130,7 +131,7 @@ impl Group for Secp256K1Group { return Err(GroupError::InvalidIdentityElement); } let mut fixed_serialized = [0; 33]; - let serialized_point = element.to_affine().to_encoded_point(true); + let serialized_point = element.to_affine().to_sec1_point(true); let serialized = serialized_point.as_bytes(); fixed_serialized.copy_from_slice(serialized); Ok(fixed_serialized) @@ -138,9 +139,9 @@ impl Group for Secp256K1Group { fn deserialize(buf: &Self::Serialization) -> Result { let encoded_point = - k256::EncodedPoint::from_bytes(buf).map_err(|_| GroupError::MalformedElement)?; + k256::Sec1Point::from_bytes(buf).map_err(|_| GroupError::MalformedElement)?; - match Option::::from(AffinePoint::from_encoded_point(&encoded_point)) { + match Option::::from(AffinePoint::from_sec1_point(&encoded_point)) { Some(point) => { if point.is_identity().into() { // This is actually impossible since the identity is encoded a a single byte @@ -167,9 +168,14 @@ fn hash_to_array(inputs: &[&[u8]]) -> [u8; 32] { } fn hash_to_scalar(domain: &[&[u8]], msg: &[u8]) -> Scalar { - let mut u = [Secp256K1ScalarField::zero()]; - hash_to_field::, Scalar>(&[msg], domain, &mut u) - .expect("should never return error according to error cases described in ExpandMsgXmd"); + let u = hash_to_field::< + 1, + ExpandMsgXmd, + ::SecurityLevel, + Scalar, + ::Length, + >(&[msg], domain) + .expect("should never return error according to error cases described in ExpandMsgXmd"); u[0] } @@ -187,7 +193,7 @@ fn hasher_to_scalar(hasher: Sha256) -> Scalar { // This is acceptable because secp256k1 curve order is close to 2^256, // and the input is uniformly random since it is a hash output, therefore // the bias is negligibly small. - Scalar::reduce(U256::from_be_slice(&hasher.finalize())) + Scalar::reduce(&U256::from_be_slice(&hasher.finalize())) } /// Create a BIP340 compliant tagged hash @@ -294,11 +300,7 @@ impl Ciphersuite for Secp256K1Sha256TR { } // Sign, negating the key if required by BIP-340. - fn single_sign( - signing_key: &SigningKey, - rng: R, - message: &[u8], - ) -> Signature { + fn single_sign(signing_key: &SigningKey, rng: R, message: &[u8]) -> Signature { let signing_key = signing_key.clone().into_even_y(None); signing_key.default_sign(rng, message) } @@ -362,7 +364,7 @@ impl Ciphersuite for Secp256K1Sha256TR { } // Generate a nonce, negating it if required by BIP-340. - fn generate_nonce( + fn generate_nonce( rng: &mut R, ) -> ( <::Field as Field>::Scalar, @@ -514,7 +516,7 @@ pub mod keys { /// Allows all participants' keys to be generated using a central, trusted /// dealer. - pub fn generate_with_dealer( + pub fn generate_with_dealer( max_signers: u16, min_signers: u16, identifiers: IdentifierList, @@ -529,7 +531,7 @@ pub mod keys { /// instead of generating a fresh one. This is useful in scenarios where /// the key needs to be generated externally or must be derived from e.g. a /// seed phrase. - pub fn split( + pub fn split( secret: &SigningKey, max_signers: u16, min_signers: u16, @@ -825,7 +827,7 @@ pub mod round1 { /// operation. pub fn commit(secret: &SigningShare, rng: &mut RNG) -> (SigningNonces, SigningCommitments) where - RNG: CryptoRng + RngCore, + RNG: CryptoRng, { frost::round1::commit::(secret, rng) } diff --git a/frost-secp256k1-tr/src/tests/batch.rs b/frost-secp256k1-tr/src/tests/batch.rs index d22efdf5d..60f6ed923 100644 --- a/frost-secp256k1-tr/src/tests/batch.rs +++ b/frost-secp256k1-tr/src/tests/batch.rs @@ -2,21 +2,21 @@ use crate::*; #[test] fn check_batch_verify() { - let rng = rand::rngs::OsRng; + let rng = rand_core::UnwrapErr(rand::rngs::SysRng); frost_core::tests::batch::batch_verify::(rng); } #[test] fn check_bad_batch_verify() { - let rng = rand::rngs::OsRng; + let rng = rand_core::UnwrapErr(rand::rngs::SysRng); frost_core::tests::batch::bad_batch_verify::(rng); } #[test] fn empty_batch_verify() { - let rng = rand::rngs::OsRng; + let rng = rand_core::UnwrapErr(rand::rngs::SysRng); frost_core::tests::batch::empty_batch_verify::(rng); } diff --git a/frost-secp256k1-tr/src/tests/coefficient_commitment.rs b/frost-secp256k1-tr/src/tests/coefficient_commitment.rs index 71706ea62..636982b30 100644 --- a/frost-secp256k1-tr/src/tests/coefficient_commitment.rs +++ b/frost-secp256k1-tr/src/tests/coefficient_commitment.rs @@ -1,18 +1,17 @@ -use lazy_static::lazy_static; use serde_json::Value; +use std::sync::LazyLock; use crate::*; // Tests for serialization and deserialization of CoefficientCommitment -lazy_static! { - pub static ref ELEMENTS: Value = - serde_json::from_str(include_str!("../../tests/helpers/elements.json").trim()).unwrap(); -} +static ELEMENTS: LazyLock = LazyLock::new(|| { + serde_json::from_str(include_str!("../../tests/helpers/elements.json").trim()).unwrap() +}); #[test] fn check_serialization_of_coefficient_commitment() { - let rng = rand::rngs::OsRng; + let rng = rand_core::UnwrapErr(rand::rngs::SysRng); frost_core::tests::coefficient_commitment::check_serialization_of_coefficient_commitment::< Secp256K1Sha256TR, _, @@ -21,7 +20,7 @@ fn check_serialization_of_coefficient_commitment() { #[test] fn check_create_coefficient_commitment() { - let rng = rand::rngs::OsRng; + let rng = rand_core::UnwrapErr(rand::rngs::SysRng); frost_core::tests::coefficient_commitment::check_create_coefficient_commitment::< Secp256K1Sha256TR, _, @@ -36,7 +35,7 @@ fn check_create_coefficient_commitment_error() { #[test] fn check_get_value_of_coefficient_commitment() { - let rng = rand::rngs::OsRng; + let rng = rand_core::UnwrapErr(rand::rngs::SysRng); frost_core::tests::coefficient_commitment::check_get_value_of_coefficient_commitment::< Secp256K1Sha256TR, diff --git a/frost-secp256k1-tr/src/tests/vss_commitment.rs b/frost-secp256k1-tr/src/tests/vss_commitment.rs index f264c3328..5ef7566f3 100644 --- a/frost-secp256k1-tr/src/tests/vss_commitment.rs +++ b/frost-secp256k1-tr/src/tests/vss_commitment.rs @@ -1,24 +1,23 @@ -use lazy_static::lazy_static; use serde_json::Value; +use std::sync::LazyLock; use crate::*; // Tests for serialization and deserialization VerifiableSecretSharingCommitment -lazy_static! { - pub static ref ELEMENTS: Value = - serde_json::from_str(include_str!("../../tests/helpers/elements.json").trim()).unwrap(); -} +static ELEMENTS: LazyLock = LazyLock::new(|| { + serde_json::from_str(include_str!("../../tests/helpers/elements.json").trim()).unwrap() +}); #[test] fn check_serialize_vss_commitment() { - let rng = rand::rngs::OsRng; + let rng = rand_core::UnwrapErr(rand::rngs::SysRng); frost_core::tests::vss_commitment::check_serialize_vss_commitment::(rng); } #[test] fn check_serialize_whole_vss_commitment() { - let rng = rand::rngs::OsRng; + let rng = rand_core::UnwrapErr(rand::rngs::SysRng); frost_core::tests::vss_commitment::check_serialize_whole_vss_commitment::( rng, ); @@ -26,7 +25,7 @@ fn check_serialize_whole_vss_commitment() { #[test] fn check_deserialize_vss_commitment() { - let rng = rand::rngs::OsRng; + let rng = rand_core::UnwrapErr(rand::rngs::SysRng); frost_core::tests::vss_commitment::check_deserialize_vss_commitment::( rng, ); @@ -34,7 +33,7 @@ fn check_deserialize_vss_commitment() { #[test] fn check_deserialize_whole_vss_commitment() { - let rng = rand::rngs::OsRng; + let rng = rand_core::UnwrapErr(rand::rngs::SysRng); frost_core::tests::vss_commitment::check_deserialize_whole_vss_commitment::( rng, ); @@ -42,7 +41,7 @@ fn check_deserialize_whole_vss_commitment() { #[test] fn check_deserialize_vss_commitment_error() { - let rng = rand::rngs::OsRng; + let rng = rand_core::UnwrapErr(rand::rngs::SysRng); frost_core::tests::vss_commitment::check_deserialize_vss_commitment_error::( rng, &ELEMENTS, ); @@ -50,7 +49,7 @@ fn check_deserialize_vss_commitment_error() { #[test] fn check_deserialize_whole_vss_commitment_error() { - let rng = rand::rngs::OsRng; + let rng = rand_core::UnwrapErr(rand::rngs::SysRng); frost_core::tests::vss_commitment::check_deserialize_whole_vss_commitment_error::< Secp256K1Sha256TR, _, @@ -59,7 +58,7 @@ fn check_deserialize_whole_vss_commitment_error() { #[test] fn check_compute_public_key_package() { - let rng = rand::rngs::OsRng; + let rng = rand_core::UnwrapErr(rand::rngs::SysRng); frost_core::tests::vss_commitment::check_compute_public_key_package::( rng, ); diff --git a/frost-secp256k1-tr/tests/common_traits_tests.rs b/frost-secp256k1-tr/tests/common_traits_tests.rs index 93265b7a8..91ef3e09e 100644 --- a/frost-secp256k1-tr/tests/common_traits_tests.rs +++ b/frost-secp256k1-tr/tests/common_traits_tests.rs @@ -19,7 +19,7 @@ fn check_common_traits_for_type(v: #[test] fn check_signing_key_common_traits() { - let mut rng = rand::rngs::OsRng; + let mut rng = rand_core::UnwrapErr(rand::rngs::SysRng); let signing_key = SigningKey::new(&mut rng); check_common_traits_for_type(signing_key); } diff --git a/frost-secp256k1-tr/tests/integration_tests.rs b/frost-secp256k1-tr/tests/integration_tests.rs index 682db377d..33a4248b8 100644 --- a/frost-secp256k1-tr/tests/integration_tests.rs +++ b/frost-secp256k1-tr/tests/integration_tests.rs @@ -1,6 +1,6 @@ use frost_secp256k1_tr::*; -use lazy_static::lazy_static; use serde_json::Value; +use std::sync::LazyLock; #[test] fn check_zero_key_fails() { @@ -9,14 +9,14 @@ fn check_zero_key_fails() { #[test] fn check_sign_with_dkg() { - let rng = rand::rngs::OsRng; + let rng = rand_core::UnwrapErr(rand::rngs::SysRng); frost_core::tests::ciphersuite_generic::check_sign_with_dkg::(rng); } #[test] fn check_dkg_part1_fails_with_invalid_signers_min_signers() { - let rng = rand::rngs::OsRng; + let rng = rand_core::UnwrapErr(rand::rngs::SysRng); let min_signers = 1; let max_signers = 3; @@ -30,7 +30,7 @@ fn check_dkg_part1_fails_with_invalid_signers_min_signers() { #[test] fn check_dkg_part1_fails_with_min_signers_greater_than_max() { - let rng = rand::rngs::OsRng; + let rng = rand_core::UnwrapErr(rand::rngs::SysRng); let min_signers = 3; let max_signers = 2; @@ -44,7 +44,7 @@ fn check_dkg_part1_fails_with_min_signers_greater_than_max() { #[test] fn check_dkg_part1_fails_with_invalid_signers_max_signers() { - let rng = rand::rngs::OsRng; + let rng = rand_core::UnwrapErr(rand::rngs::SysRng); let min_signers = 3; let max_signers = 1; @@ -58,21 +58,21 @@ fn check_dkg_part1_fails_with_invalid_signers_max_signers() { #[test] fn check_rts() { - let rng = rand::rngs::OsRng; + let rng = rand_core::UnwrapErr(rand::rngs::SysRng); frost_core::tests::repairable::check_rts::(rng); } #[test] fn check_refresh_shares_with_dealer() { - let rng = rand::rngs::OsRng; + let rng = rand_core::UnwrapErr(rand::rngs::SysRng); frost_core::tests::refresh::check_refresh_shares_with_dealer::(rng); } #[test] fn check_refresh_shares_with_dealer_serialisation() { - let rng = rand::rngs::OsRng; + let rng = rand_core::UnwrapErr(rand::rngs::SysRng); frost_core::tests::refresh::check_refresh_shares_with_dealer_serialisation::< Secp256K1Sha256TR, @@ -82,7 +82,7 @@ fn check_refresh_shares_with_dealer_serialisation() { #[test] fn check_refresh_shares_with_dealer_fails_with_invalid_public_key_package() { - let rng = rand::rngs::OsRng; + let rng = rand_core::UnwrapErr(rand::rngs::SysRng); frost_core::tests::refresh::check_refresh_shares_with_dealer_fails_with_invalid_public_key_package::< Secp256K1Sha256TR, @@ -92,7 +92,7 @@ fn check_refresh_shares_with_dealer_fails_with_invalid_public_key_package() { #[test] fn check_refresh_shares_with_dealer_fails_with_invalid_identifier() { - let rng = rand::rngs::OsRng; + let rng = rand_core::UnwrapErr(rand::rngs::SysRng); let identifiers = vec![ Identifier::try_from(8).unwrap(), Identifier::try_from(3).unwrap(), @@ -109,14 +109,14 @@ fn check_refresh_shares_with_dealer_fails_with_invalid_identifier() { #[test] fn check_refresh_shares_with_dkg() { - let rng = rand::rngs::OsRng; + let rng = rand_core::UnwrapErr(rand::rngs::SysRng); frost_core::tests::refresh::check_refresh_shares_with_dkg::(rng); } #[test] fn check_refresh_shares_with_dkg_smaller_threshold() { - let rng = rand::rngs::OsRng; + let rng = rand_core::UnwrapErr(rand::rngs::SysRng); frost_core::tests::refresh::check_refresh_shares_with_dkg_smaller_threshold::< Secp256K1Sha256TR, @@ -126,14 +126,14 @@ fn check_refresh_shares_with_dkg_smaller_threshold() { #[test] fn check_sign_with_dealer() { - let rng = rand::rngs::OsRng; + let rng = rand_core::UnwrapErr(rand::rngs::SysRng); frost_core::tests::ciphersuite_generic::check_sign_with_dealer::(rng); } #[test] fn check_sign_with_dealer_fails_with_invalid_min_signers() { - let rng = rand::rngs::OsRng; + let rng = rand_core::UnwrapErr(rand::rngs::SysRng); let min_signers = 1; let max_signers = 3; @@ -147,7 +147,7 @@ fn check_sign_with_dealer_fails_with_invalid_min_signers() { #[test] fn check_sign_with_dealer_fails_with_min_signers_greater_than_max() { - let rng = rand::rngs::OsRng; + let rng = rand_core::UnwrapErr(rand::rngs::SysRng); let min_signers = 3; let max_signers = 2; @@ -161,7 +161,7 @@ fn check_sign_with_dealer_fails_with_min_signers_greater_than_max() { #[test] fn check_sign_with_dealer_fails_with_invalid_max_signers() { - let rng = rand::rngs::OsRng; + let rng = rand_core::UnwrapErr(rand::rngs::SysRng); let min_signers = 3; let max_signers = 1; @@ -177,13 +177,13 @@ fn check_sign_with_dealer_fails_with_invalid_max_signers() { /// value is working. #[test] fn check_share_generation_secp256k1_tr_sha256() { - let rng = rand::rngs::OsRng; + let rng = rand_core::UnwrapErr(rand::rngs::SysRng); frost_core::tests::ciphersuite_generic::check_share_generation::(rng); } #[test] fn check_share_generation_fails_with_invalid_min_signers() { - let rng = rand::rngs::OsRng; + let rng = rand_core::UnwrapErr(rand::rngs::SysRng); let min_signers = 0; let max_signers = 3; @@ -197,7 +197,7 @@ fn check_share_generation_fails_with_invalid_min_signers() { #[test] fn check_share_generation_fails_with_min_signers_greater_than_max() { - let rng = rand::rngs::OsRng; + let rng = rand_core::UnwrapErr(rand::rngs::SysRng); let min_signers = 3; let max_signers = 2; @@ -211,7 +211,7 @@ fn check_share_generation_fails_with_min_signers_greater_than_max() { #[test] fn check_share_generation_fails_with_invalid_max_signers() { - let rng = rand::rngs::OsRng; + let rng = rand_core::UnwrapErr(rand::rngs::SysRng); let min_signers = 3; let max_signers = 0; @@ -223,17 +223,18 @@ fn check_share_generation_fails_with_invalid_max_signers() { >(min_signers, max_signers, error, rng); } -lazy_static! { - pub static ref VECTORS: Value = - serde_json::from_str(include_str!("../tests/helpers/vectors.json").trim()) - .expect("Test vector is valid JSON"); - pub static ref VECTORS_BIG_IDENTIFIER: Value = - serde_json::from_str(include_str!("../tests/helpers/vectors-big-identifier.json").trim()) - .expect("Test vector is valid JSON"); - pub static ref VECTORS_DKG: Value = - serde_json::from_str(include_str!("../tests/helpers/vectors_dkg.json").trim()) - .expect("Test vector is valid JSON"); -} +static VECTORS: LazyLock = LazyLock::new(|| { + serde_json::from_str(include_str!("../tests/helpers/vectors.json").trim()) + .expect("Test vector is valid JSON") +}); +static VECTORS_BIG_IDENTIFIER: LazyLock = LazyLock::new(|| { + serde_json::from_str(include_str!("../tests/helpers/vectors-big-identifier.json").trim()) + .expect("Test vector is valid JSON") +}); +static VECTORS_DKG: LazyLock = LazyLock::new(|| { + serde_json::from_str(include_str!("../tests/helpers/vectors_dkg.json").trim()) + .expect("Test vector is valid JSON") +}); #[test] fn check_sign_with_test_vectors() { @@ -275,7 +276,7 @@ fn check_identifier_generation() -> Result<(), Error> { #[test] fn check_sign_with_dealer_and_identifiers() { - let rng = rand::rngs::OsRng; + let rng = rand_core::UnwrapErr(rand::rngs::SysRng); frost_core::tests::ciphersuite_generic::check_sign_with_dealer_and_identifiers::< Secp256K1Sha256TR, @@ -285,7 +286,7 @@ fn check_sign_with_dealer_and_identifiers() { #[test] fn check_sign_with_missing_identifier() { - let rng = rand::rngs::OsRng; + let rng = rand_core::UnwrapErr(rand::rngs::SysRng); frost_core::tests::ciphersuite_generic::check_sign_with_missing_identifier::< Secp256K1Sha256TR, _, @@ -294,7 +295,7 @@ fn check_sign_with_missing_identifier() { #[test] fn check_sign_with_incorrect_commitments() { - let rng = rand::rngs::OsRng; + let rng = rand_core::UnwrapErr(rand::rngs::SysRng); frost_core::tests::ciphersuite_generic::check_sign_with_incorrect_commitments::< Secp256K1Sha256TR, _, @@ -304,7 +305,7 @@ fn check_sign_with_incorrect_commitments() { #[tokio::test] async fn check_async_sign_with_dealer() { tokio::spawn(async { - let rng = rand::rngs::OsRng; + let rng = rand_core::UnwrapErr(rand::rngs::SysRng); frost_core::tests::ciphersuite_generic::async_check_sign::(rng).await; }) .await diff --git a/frost-secp256k1-tr/tests/interoperability_tests.rs b/frost-secp256k1-tr/tests/interoperability_tests.rs index 3cf68f217..7dc5db7b8 100644 --- a/frost-secp256k1-tr/tests/interoperability_tests.rs +++ b/frost-secp256k1-tr/tests/interoperability_tests.rs @@ -6,7 +6,7 @@ mod helpers; #[test] fn check_interoperability_in_regular_sign() { - let mut rng = rand::rngs::OsRng; + let mut rng = rand_core::UnwrapErr(rand::rngs::SysRng); for _ in 0..256 { let signing_key = SigningKey::new(&mut rng); @@ -18,7 +18,7 @@ fn check_interoperability_in_regular_sign() { #[test] fn check_interoperability_in_sign_with_dkg() { - let rng = rand::rngs::OsRng; + let rng = rand_core::UnwrapErr(rand::rngs::SysRng); // Test with multiple keys/signatures to better exercise the key generation // and the interoperability check. A smaller number of iterations is used @@ -35,7 +35,7 @@ fn check_interoperability_in_sign_with_dkg() { #[test] fn check_interoperability_in_sign_with_dealer() { - let rng = rand::rngs::OsRng; + let rng = rand_core::UnwrapErr(rand::rngs::SysRng); // Test with multiple keys/signatures to better exercise the key generation // and the interoperability check. diff --git a/frost-secp256k1-tr/tests/rerandomized_tests.rs b/frost-secp256k1-tr/tests/rerandomized_tests.rs index 7b4144c9b..fb6176991 100644 --- a/frost-secp256k1-tr/tests/rerandomized_tests.rs +++ b/frost-secp256k1-tr/tests/rerandomized_tests.rs @@ -2,7 +2,7 @@ use frost_secp256k1_tr::Secp256K1Sha256TR; #[test] fn check_randomized_sign_with_dealer() { - let rng = rand::rngs::OsRng; + let rng = rand_core::UnwrapErr(rand::rngs::SysRng); let (_msg, _group_signature, _group_pubkey) = frost_rerandomized::tests::check_randomized_sign_with_dealer::(rng); diff --git a/frost-secp256k1-tr/tests/serde_tests.rs b/frost-secp256k1-tr/tests/serde_tests.rs index e13cf1d9a..f460f371e 100644 --- a/frost-secp256k1-tr/tests/serde_tests.rs +++ b/frost-secp256k1-tr/tests/serde_tests.rs @@ -19,7 +19,7 @@ fn check_signing_commitments_serialization() { let commitments = samples::signing_commitments(); let json = serde_json::to_string_pretty(&commitments).unwrap(); - println!("{}", json); + println!("{json}"); let decoded_commitments: SigningCommitments = serde_json::from_str(&json).unwrap(); assert!(commitments == decoded_commitments); @@ -89,7 +89,7 @@ fn check_signing_package_serialization() { let signing_package = samples::signing_package(); let json = serde_json::to_string_pretty(&signing_package).unwrap(); - println!("{}", json); + println!("{json}"); let decoded_signing_package: SigningPackage = serde_json::from_str(&json).unwrap(); assert!(signing_package == decoded_signing_package); @@ -204,7 +204,7 @@ fn check_signature_share_serialization() { let signature_share = samples::signature_share(); let json = serde_json::to_string_pretty(&signature_share).unwrap(); - println!("{}", json); + println!("{json}"); let decoded_signature_share: SignatureShare = serde_json::from_str(&json).unwrap(); assert!(signature_share == decoded_signature_share); @@ -258,7 +258,7 @@ fn check_secret_share_serialization() { let secret_share = samples::secret_share(); let json = serde_json::to_string_pretty(&secret_share).unwrap(); - println!("{}", json); + println!("{json}"); let decoded_secret_share: SecretShare = serde_json::from_str(&json).unwrap(); assert!(secret_share == decoded_secret_share); @@ -342,7 +342,7 @@ fn check_key_package_serialization() { let key_package = samples::key_package(); let json = serde_json::to_string_pretty(&key_package).unwrap(); - println!("{}", json); + println!("{json}"); let decoded_key_package: KeyPackage = serde_json::from_str(&json).unwrap(); assert!(key_package == decoded_key_package); @@ -437,7 +437,7 @@ fn check_public_key_package_serialization() { let public_key_package = samples::public_key_package_new(); let json = serde_json::to_string_pretty(&public_key_package).unwrap(); - println!("{}", json); + println!("{json}"); let decoded_public_key_package: PublicKeyPackage = serde_json::from_str(&json).unwrap(); assert!(public_key_package == decoded_public_key_package); @@ -532,7 +532,7 @@ fn check_round1_package_serialization() { let round1_package = samples::round1_package(); let json = serde_json::to_string_pretty(&round1_package).unwrap(); - println!("{}", json); + println!("{json}"); let decoded_round1_package: round1::Package = serde_json::from_str(&json).unwrap(); assert!(round1_package == decoded_round1_package); @@ -598,7 +598,7 @@ fn check_round2_package_serialization() { let round2_package = samples::round2_package(); let json = serde_json::to_string_pretty(&round2_package).unwrap(); - println!("{}", json); + println!("{json}"); let decoded_round2_package: round2::Package = serde_json::from_str(&json).unwrap(); assert!(round2_package == decoded_round2_package); diff --git a/frost-secp256k1-tr/tests/tweaking_tests.rs b/frost-secp256k1-tr/tests/tweaking_tests.rs index dddbed12b..f5ee5bb11 100644 --- a/frost-secp256k1-tr/tests/tweaking_tests.rs +++ b/frost-secp256k1-tr/tests/tweaking_tests.rs @@ -17,7 +17,7 @@ fn check_tweaked_sign_with_dealer() -> Result<(), Box> { let merkle_root: Vec = vec![12; 32]; - let mut rng = rand::rngs::OsRng; + let mut rng = rand_core::UnwrapErr(rand::rngs::SysRng); let max_signers = 5; let min_signers = 3; let (shares, pubkey_package) = frost::keys::generate_with_dealer( @@ -137,7 +137,7 @@ fn taproot_tweak_pubkey(pubkey: [u8; 32], merkle_root: &[u8]) -> (bool, [u8; 32] .chain_update(merkle_root) .finalize(); let t = k256::Scalar::from( - k256::elliptic_curve::ScalarPrimitive::new(k256::U256::from_be_slice(&tweak_hash)).unwrap(), + k256::elliptic_curve::ScalarValue::new(k256::U256::from_be_slice(&tweak_hash)).unwrap(), ); let mut pubkey_even_bytes = [0x02; 33]; diff --git a/frost-secp256k1/Cargo.toml b/frost-secp256k1/Cargo.toml index 8d942718e..9d0a0e382 100644 --- a/frost-secp256k1/Cargo.toml +++ b/frost-secp256k1/Cargo.toml @@ -1,35 +1,45 @@ [package] name = "frost-secp256k1" -edition.workspace = true -rust-version.workspace = true version.workspace = true authors.workspace = true +edition.workspace = true +rust-version.workspace = true +description = "A Schnorr signature scheme over the secp256k1 curve that supports FROST." +documentation = "https://docs.rs/frost-secp256k1" readme = "README.md" -license.workspace = true +homepage.workspace = true repository.workspace = true -categories.workspace = true +license.workspace = true keywords = ["cryptography", "crypto", "secp256k1", "threshold", "signature"] -description = "A Schnorr signature scheme over the secp256k1 curve that supports FROST." +categories.workspace = true [package.metadata.docs.rs] features = ["serde"] rustdoc-args = ["--cfg", "docsrs"] +[lib] +# Disables non-criterion benchmark which is not used; prevents errors +# when using criterion-specific flags +bench = false + +[[bench]] +name = "bench" +harness = false + [dependencies] document-features.workspace = true frost-core.workspace = true frost-rerandomized.workspace = true -k256 = { version = "0.13.0", features = ["arithmetic", "expose-field", "hash2curve"], default-features = false } +k256.workspace = true rand_core.workspace = true -sha2 = { version = "0.10.2", default-features = false } +sha2.workspace = true [dev-dependencies] criterion.workspace = true frost-core = { workspace = true, features = ["test-impl"] } frost-rerandomized = { workspace = true, features = ["test-impl"] } -insta.workspace = true hex.workspace = true -lazy_static.workspace = true +insta.workspace = true proptest.workspace = true rand.workspace = true rand_chacha.workspace = true @@ -45,12 +55,3 @@ default = ["serialization"] serde = ["frost-core/serde"] ## Enable a default serialization format. Enables `serde`. serialization = ["serde", "frost-core/serialization", "frost-rerandomized/serialization"] - -[lib] -# Disables non-criterion benchmark which is not used; prevents errors -# when using criterion-specific flags -bench = false - -[[bench]] -name = "bench" -harness = false diff --git a/frost-secp256k1/README.md b/frost-secp256k1/README.md index c65e5789d..ab56c7c49 100644 --- a/frost-secp256k1/README.md +++ b/frost-secp256k1/README.md @@ -20,7 +20,7 @@ scenario in a single thread and it abstracts away any communication between peer use frost_secp256k1 as frost; use std::collections::BTreeMap; -let mut rng = rand::rngs::OsRng; +let mut rng = rand_core::UnwrapErr(rand::rngs::SysRng); let max_signers = 5; let min_signers = 3; let (shares, pubkey_package) = frost::keys::generate_with_dealer( diff --git a/frost-secp256k1/benches/bench.rs b/frost-secp256k1/benches/bench.rs index cd89e8e2d..e7c2a7464 100644 --- a/frost-secp256k1/benches/bench.rs +++ b/frost-secp256k1/benches/bench.rs @@ -3,13 +3,13 @@ use criterion::{criterion_group, criterion_main, Criterion}; use frost_secp256k1::*; fn bench_secp256k1_batch_verify(c: &mut Criterion) { - let mut rng = rand::rngs::OsRng; + let mut rng = rand_core::UnwrapErr(rand::rngs::SysRng); frost_core::benches::bench_batch_verify::(c, "secp256k1", &mut rng); } fn bench_secp256k1_sign(c: &mut Criterion) { - let mut rng = rand::rngs::OsRng; + let mut rng = rand_core::UnwrapErr(rand::rngs::SysRng); frost_core::benches::bench_sign::(c, "secp256k1", &mut rng); } diff --git a/frost-secp256k1/dkg.md b/frost-secp256k1/dkg.md index 48d76819f..c8de33983 100644 --- a/frost-secp256k1/dkg.md +++ b/frost-secp256k1/dkg.md @@ -20,11 +20,9 @@ first round of communication to ensure all participants have the same value. ```rust # // ANCHOR: dkg_import use std::collections::BTreeMap; - use frost_secp256k1 as frost; -let mut rng = rand::rngs::OsRng; - +let mut rng = rand_core::UnwrapErr(rand::rngs::SysRng); let max_signers = 5; let min_signers = 3; # // ANCHOR_END: dkg_import diff --git a/frost-secp256k1/src/keys/dkg.rs b/frost-secp256k1/src/keys/dkg.rs index 9ea40b263..c5b0c231a 100644 --- a/frost-secp256k1/src/keys/dkg.rs +++ b/frost-secp256k1/src/keys/dkg.rs @@ -46,7 +46,7 @@ pub mod round2 { /// It returns the [`round1::SecretPackage`] that must be kept in memory /// by the participant for the other steps, and the [`round1::Package`] that /// must be sent to each other participant in the DKG run. -pub fn part1( +pub fn part1( identifier: Identifier, max_signers: u16, min_signers: u16, diff --git a/frost-secp256k1/src/keys/refresh.rs b/frost-secp256k1/src/keys/refresh.rs index bb4b6dd64..2d44f2bdb 100644 --- a/frost-secp256k1/src/keys/refresh.rs +++ b/frost-secp256k1/src/keys/refresh.rs @@ -5,14 +5,14 @@ use crate::{ frost, keys::dkg::{round1, round2}, - CryptoRng, Error, Identifier, RngCore, + CryptoRng, Error, Identifier, }; use alloc::{collections::btree_map::BTreeMap, vec::Vec}; use super::{KeyPackage, PublicKeyPackage, SecretShare}; /// Refer to [`frost_core::keys::refresh::compute_refreshing_shares`]. -pub fn compute_refreshing_shares( +pub fn compute_refreshing_shares( old_pub_key_package: PublicKeyPackage, identifiers: &[Identifier], mut rng: &mut R, @@ -29,7 +29,7 @@ pub fn refresh_share( } /// Refer to [`frost_core::keys::refresh::refresh_dkg_part1`]. -pub fn refresh_dkg_part1( +pub fn refresh_dkg_part1( identifier: Identifier, max_signers: u16, min_signers: u16, diff --git a/frost-secp256k1/src/keys/repairable.rs b/frost-secp256k1/src/keys/repairable.rs index 48b1506aa..70315d060 100644 --- a/frost-secp256k1/src/keys/repairable.rs +++ b/frost-secp256k1/src/keys/repairable.rs @@ -10,7 +10,7 @@ use crate::keys::{KeyPackage, PublicKeyPackage}; // This is imported separately to make `gencode` work. // (if it were below, the position of the import would vary between ciphersuites // after `cargo fmt`) -use crate::{frost, Ciphersuite, CryptoRng, Identifier, RngCore}; +use crate::{frost, Ciphersuite, CryptoRng, Identifier}; use crate::{Error, Secp256K1Sha256}; /// A delta value which is the output of part 1 of RTS. @@ -26,7 +26,7 @@ pub type Sigma = frost::keys::repairable::Sigma; /// `participant` recover their share. /// /// Returns a BTreeMap mapping which value should be sent to which participant. -pub fn repair_share_part1( +pub fn repair_share_part1( helpers: &[Identifier], key_package_i: &KeyPackage, rng: &mut R, @@ -62,22 +62,17 @@ pub fn repair_share_part3( #[cfg(test)] mod tests { - - use lazy_static::lazy_static; - - use serde_json::Value; - use crate::Secp256K1Sha256; + use serde_json::Value; + use std::sync::LazyLock; - lazy_static! { - pub static ref REPAIR_SHARE: Value = - serde_json::from_str(include_str!("../../tests/helpers/repair-share.json").trim()) - .unwrap(); - } + static REPAIR_SHARE: LazyLock = LazyLock::new(|| { + serde_json::from_str(include_str!("../../tests/helpers/repair-share.json").trim()).unwrap() + }); #[test] fn check_repair_share_part1() { - let rng = rand::rngs::OsRng; + let rng = rand_core::UnwrapErr(rand::rngs::SysRng); frost_core::tests::repairable::check_repair_share_part1::(rng); } @@ -89,7 +84,7 @@ mod tests { #[test] fn check_repair_share_part3() { - let rng = rand::rngs::OsRng; + let rng = rand_core::UnwrapErr(rand::rngs::SysRng); frost_core::tests::repairable::check_repair_share_part3::( rng, &REPAIR_SHARE, @@ -98,7 +93,7 @@ mod tests { #[test] fn check_repair_share_part1_fails_with_invalid_min_signers() { - let rng = rand::rngs::OsRng; + let rng = rand_core::UnwrapErr(rand::rngs::SysRng); frost_core::tests::repairable::check_repair_share_part1_fails_with_invalid_min_signers::< Secp256K1Sha256, _, diff --git a/frost-secp256k1/src/lib.rs b/frost-secp256k1/src/lib.rs index bebcd1f5d..b18eb5685 100644 --- a/frost-secp256k1/src/lib.rs +++ b/frost-secp256k1/src/lib.rs @@ -5,6 +5,9 @@ #![doc = include_str!("../README.md")] #![doc = document_features::document_features!()] +#[cfg(test)] +extern crate std; + extern crate alloc; use alloc::collections::BTreeMap; @@ -12,14 +15,13 @@ use alloc::collections::BTreeMap; use frost_rerandomized::RandomizedCiphersuite; use k256::{ elliptic_curve::{ - group::prime::PrimeCurveAffine, - hash2curve::{hash_to_field, ExpandMsgXmd}, - sec1::{FromEncodedPoint, ToEncodedPoint}, - Field as FFField, PrimeField, + sec1::{FromSec1Point, ToSec1Point}, + CurveAffine, Field as FFField, PrimeField, }, - AffinePoint, ProjectivePoint, Scalar, + hash2curve::{hash_to_field, ExpandMsgXmd, MapToCurve}, + AffinePoint, ProjectivePoint, Scalar, Secp256k1, }; -use rand_core::{CryptoRng, RngCore}; +use rand_core::CryptoRng; use sha2::{Digest, Sha256}; use frost_core as frost; @@ -62,7 +64,7 @@ impl Field for Secp256K1ScalarField { } } - fn random(rng: &mut R) -> Self::Scalar { + fn random(rng: &mut R) -> Self::Scalar { Scalar::random(rng) } @@ -121,7 +123,7 @@ impl Group for Secp256K1Group { return Err(GroupError::InvalidIdentityElement); } let mut fixed_serialized = [0; 33]; - let serialized_point = element.to_affine().to_encoded_point(true); + let serialized_point = element.to_affine().to_sec1_point(true); let serialized = serialized_point.as_bytes(); fixed_serialized.copy_from_slice(serialized); Ok(fixed_serialized) @@ -129,9 +131,9 @@ impl Group for Secp256K1Group { fn deserialize(buf: &Self::Serialization) -> Result { let encoded_point = - k256::EncodedPoint::from_bytes(buf).map_err(|_| GroupError::MalformedElement)?; + k256::Sec1Point::from_bytes(buf).map_err(|_| GroupError::MalformedElement)?; - match Option::::from(AffinePoint::from_encoded_point(&encoded_point)) { + match Option::::from(AffinePoint::from_sec1_point(&encoded_point)) { Some(point) => { if point.is_identity().into() { // This is actually impossible since the identity is encoded a a single byte @@ -158,9 +160,14 @@ fn hash_to_array(inputs: &[&[u8]]) -> [u8; 32] { } fn hash_to_scalar(domain: &[&[u8]], msg: &[u8]) -> Scalar { - let mut u = [Secp256K1ScalarField::zero()]; - hash_to_field::, Scalar>(&[msg], domain, &mut u) - .expect("should never return error according to error cases described in ExpandMsgXmd"); + let u = hash_to_field::< + 1, + ExpandMsgXmd, + ::SecurityLevel, + Scalar, + ::Length, + >(&[msg], domain) + .expect("should never return error according to error cases described in ExpandMsgXmd"); u[0] } @@ -251,7 +258,7 @@ pub mod keys { /// Allows all participants' keys to be generated using a central, trusted /// dealer. - pub fn generate_with_dealer( + pub fn generate_with_dealer( max_signers: u16, min_signers: u16, identifiers: IdentifierList, @@ -266,7 +273,7 @@ pub mod keys { /// instead of generating a fresh one. This is useful in scenarios where /// the key needs to be generated externally or must be derived from e.g. a /// seed phrase. - pub fn split( + pub fn split( secret: &SigningKey, max_signers: u16, min_signers: u16, @@ -367,7 +374,7 @@ pub mod round1 { /// operation. pub fn commit(secret: &SigningShare, rng: &mut RNG) -> (SigningNonces, SigningCommitments) where - RNG: CryptoRng + RngCore, + RNG: CryptoRng, { frost::round1::commit::(secret, rng) } diff --git a/frost-secp256k1/src/tests/batch.rs b/frost-secp256k1/src/tests/batch.rs index d3b1c6800..8dcfb7bff 100644 --- a/frost-secp256k1/src/tests/batch.rs +++ b/frost-secp256k1/src/tests/batch.rs @@ -2,21 +2,21 @@ use crate::*; #[test] fn check_batch_verify() { - let rng = rand::rngs::OsRng; + let rng = rand_core::UnwrapErr(rand::rngs::SysRng); frost_core::tests::batch::batch_verify::(rng); } #[test] fn check_bad_batch_verify() { - let rng = rand::rngs::OsRng; + let rng = rand_core::UnwrapErr(rand::rngs::SysRng); frost_core::tests::batch::bad_batch_verify::(rng); } #[test] fn empty_batch_verify() { - let rng = rand::rngs::OsRng; + let rng = rand_core::UnwrapErr(rand::rngs::SysRng); frost_core::tests::batch::empty_batch_verify::(rng); } diff --git a/frost-secp256k1/src/tests/coefficient_commitment.rs b/frost-secp256k1/src/tests/coefficient_commitment.rs index 7be35ead6..a564d6a9b 100644 --- a/frost-secp256k1/src/tests/coefficient_commitment.rs +++ b/frost-secp256k1/src/tests/coefficient_commitment.rs @@ -1,18 +1,17 @@ -use lazy_static::lazy_static; use serde_json::Value; +use std::sync::LazyLock; use crate::*; // Tests for serialization and deserialization of CoefficientCommitment -lazy_static! { - pub static ref ELEMENTS: Value = - serde_json::from_str(include_str!("../../tests/helpers/elements.json").trim()).unwrap(); -} +static ELEMENTS: LazyLock = LazyLock::new(|| { + serde_json::from_str(include_str!("../../tests/helpers/elements.json").trim()).unwrap() +}); #[test] fn check_serialization_of_coefficient_commitment() { - let rng = rand::rngs::OsRng; + let rng = rand_core::UnwrapErr(rand::rngs::SysRng); frost_core::tests::coefficient_commitment::check_serialization_of_coefficient_commitment::< Secp256K1Sha256, _, @@ -21,7 +20,7 @@ fn check_serialization_of_coefficient_commitment() { #[test] fn check_create_coefficient_commitment() { - let rng = rand::rngs::OsRng; + let rng = rand_core::UnwrapErr(rand::rngs::SysRng); frost_core::tests::coefficient_commitment::check_create_coefficient_commitment::< Secp256K1Sha256, _, @@ -36,7 +35,7 @@ fn check_create_coefficient_commitment_error() { #[test] fn check_get_value_of_coefficient_commitment() { - let rng = rand::rngs::OsRng; + let rng = rand_core::UnwrapErr(rand::rngs::SysRng); frost_core::tests::coefficient_commitment::check_get_value_of_coefficient_commitment::< Secp256K1Sha256, diff --git a/frost-secp256k1/src/tests/vss_commitment.rs b/frost-secp256k1/src/tests/vss_commitment.rs index 79aa89a65..dac14a9f1 100644 --- a/frost-secp256k1/src/tests/vss_commitment.rs +++ b/frost-secp256k1/src/tests/vss_commitment.rs @@ -1,24 +1,23 @@ -use lazy_static::lazy_static; use serde_json::Value; +use std::sync::LazyLock; use crate::*; // Tests for serialization and deserialization VerifiableSecretSharingCommitment -lazy_static! { - pub static ref ELEMENTS: Value = - serde_json::from_str(include_str!("../../tests/helpers/elements.json").trim()).unwrap(); -} +static ELEMENTS: LazyLock = LazyLock::new(|| { + serde_json::from_str(include_str!("../../tests/helpers/elements.json").trim()).unwrap() +}); #[test] fn check_serialize_vss_commitment() { - let rng = rand::rngs::OsRng; + let rng = rand_core::UnwrapErr(rand::rngs::SysRng); frost_core::tests::vss_commitment::check_serialize_vss_commitment::(rng); } #[test] fn check_serialize_whole_vss_commitment() { - let rng = rand::rngs::OsRng; + let rng = rand_core::UnwrapErr(rand::rngs::SysRng); frost_core::tests::vss_commitment::check_serialize_whole_vss_commitment::( rng, ); @@ -26,13 +25,13 @@ fn check_serialize_whole_vss_commitment() { #[test] fn check_deserialize_vss_commitment() { - let rng = rand::rngs::OsRng; + let rng = rand_core::UnwrapErr(rand::rngs::SysRng); frost_core::tests::vss_commitment::check_deserialize_vss_commitment::(rng); } #[test] fn check_deserialize_whole_vss_commitment() { - let rng = rand::rngs::OsRng; + let rng = rand_core::UnwrapErr(rand::rngs::SysRng); frost_core::tests::vss_commitment::check_deserialize_whole_vss_commitment::( rng, ); @@ -40,7 +39,7 @@ fn check_deserialize_whole_vss_commitment() { #[test] fn check_deserialize_vss_commitment_error() { - let rng = rand::rngs::OsRng; + let rng = rand_core::UnwrapErr(rand::rngs::SysRng); frost_core::tests::vss_commitment::check_deserialize_vss_commitment_error::( rng, &ELEMENTS, ); @@ -48,7 +47,7 @@ fn check_deserialize_vss_commitment_error() { #[test] fn check_deserialize_whole_vss_commitment_error() { - let rng = rand::rngs::OsRng; + let rng = rand_core::UnwrapErr(rand::rngs::SysRng); frost_core::tests::vss_commitment::check_deserialize_whole_vss_commitment_error::< Secp256K1Sha256, _, @@ -57,6 +56,6 @@ fn check_deserialize_whole_vss_commitment_error() { #[test] fn check_compute_public_key_package() { - let rng = rand::rngs::OsRng; + let rng = rand_core::UnwrapErr(rand::rngs::SysRng); frost_core::tests::vss_commitment::check_compute_public_key_package::(rng); } diff --git a/frost-secp256k1/tests/common_traits_tests.rs b/frost-secp256k1/tests/common_traits_tests.rs index e9f788eb1..38ab3df49 100644 --- a/frost-secp256k1/tests/common_traits_tests.rs +++ b/frost-secp256k1/tests/common_traits_tests.rs @@ -19,7 +19,7 @@ fn check_common_traits_for_type(v: #[test] fn check_signing_key_common_traits() { - let mut rng = rand::rngs::OsRng; + let mut rng = rand_core::UnwrapErr(rand::rngs::SysRng); let signing_key = SigningKey::new(&mut rng); check_common_traits_for_type(signing_key); } diff --git a/frost-secp256k1/tests/integration_tests.rs b/frost-secp256k1/tests/integration_tests.rs index 343214e1b..cae6c762e 100644 --- a/frost-secp256k1/tests/integration_tests.rs +++ b/frost-secp256k1/tests/integration_tests.rs @@ -1,6 +1,6 @@ use frost_secp256k1::*; -use lazy_static::lazy_static; use serde_json::Value; +use std::sync::LazyLock; #[test] fn check_zero_key_fails() { @@ -9,14 +9,14 @@ fn check_zero_key_fails() { #[test] fn check_sign_with_dkg() { - let rng = rand::rngs::OsRng; + let rng = rand_core::UnwrapErr(rand::rngs::SysRng); frost_core::tests::ciphersuite_generic::check_sign_with_dkg::(rng); } #[test] fn check_dkg_part1_fails_with_invalid_signers_min_signers() { - let rng = rand::rngs::OsRng; + let rng = rand_core::UnwrapErr(rand::rngs::SysRng); let min_signers = 1; let max_signers = 3; @@ -30,7 +30,7 @@ fn check_dkg_part1_fails_with_invalid_signers_min_signers() { #[test] fn check_dkg_part1_fails_with_min_signers_greater_than_max() { - let rng = rand::rngs::OsRng; + let rng = rand_core::UnwrapErr(rand::rngs::SysRng); let min_signers = 3; let max_signers = 2; @@ -44,7 +44,7 @@ fn check_dkg_part1_fails_with_min_signers_greater_than_max() { #[test] fn check_dkg_part1_fails_with_invalid_signers_max_signers() { - let rng = rand::rngs::OsRng; + let rng = rand_core::UnwrapErr(rand::rngs::SysRng); let min_signers = 3; let max_signers = 1; @@ -58,21 +58,21 @@ fn check_dkg_part1_fails_with_invalid_signers_max_signers() { #[test] fn check_rts() { - let rng = rand::rngs::OsRng; + let rng = rand_core::UnwrapErr(rand::rngs::SysRng); frost_core::tests::repairable::check_rts::(rng); } #[test] fn check_refresh_shares_with_dealer() { - let rng = rand::rngs::OsRng; + let rng = rand_core::UnwrapErr(rand::rngs::SysRng); frost_core::tests::refresh::check_refresh_shares_with_dealer::(rng); } #[test] fn check_refresh_shares_with_dealer_serialisation() { - let rng = rand::rngs::OsRng; + let rng = rand_core::UnwrapErr(rand::rngs::SysRng); frost_core::tests::refresh::check_refresh_shares_with_dealer_serialisation::( rng, @@ -81,7 +81,7 @@ fn check_refresh_shares_with_dealer_serialisation() { #[test] fn check_refresh_shares_with_dealer_fails_with_invalid_public_key_package() { - let rng = rand::rngs::OsRng; + let rng = rand_core::UnwrapErr(rand::rngs::SysRng); frost_core::tests::refresh::check_refresh_shares_with_dealer_fails_with_invalid_public_key_package::< Secp256K1Sha256, @@ -91,7 +91,7 @@ fn check_refresh_shares_with_dealer_fails_with_invalid_public_key_package() { #[test] fn check_refresh_shares_with_dealer_fails_with_invalid_identifier() { - let rng = rand::rngs::OsRng; + let rng = rand_core::UnwrapErr(rand::rngs::SysRng); let identifiers = vec![ Identifier::try_from(8).unwrap(), Identifier::try_from(3).unwrap(), @@ -108,14 +108,14 @@ fn check_refresh_shares_with_dealer_fails_with_invalid_identifier() { #[test] fn check_refresh_shares_with_dkg() { - let rng = rand::rngs::OsRng; + let rng = rand_core::UnwrapErr(rand::rngs::SysRng); frost_core::tests::refresh::check_refresh_shares_with_dkg::(rng); } #[test] fn check_refresh_shares_with_dkg_smaller_threshold() { - let rng = rand::rngs::OsRng; + let rng = rand_core::UnwrapErr(rand::rngs::SysRng); frost_core::tests::refresh::check_refresh_shares_with_dkg_smaller_threshold::( rng, @@ -124,14 +124,14 @@ fn check_refresh_shares_with_dkg_smaller_threshold() { #[test] fn check_sign_with_dealer() { - let rng = rand::rngs::OsRng; + let rng = rand_core::UnwrapErr(rand::rngs::SysRng); frost_core::tests::ciphersuite_generic::check_sign_with_dealer::(rng); } #[test] fn check_sign_with_dealer_fails_with_invalid_min_signers() { - let rng = rand::rngs::OsRng; + let rng = rand_core::UnwrapErr(rand::rngs::SysRng); let min_signers = 1; let max_signers = 3; @@ -145,7 +145,7 @@ fn check_sign_with_dealer_fails_with_invalid_min_signers() { #[test] fn check_sign_with_dealer_fails_with_min_signers_greater_than_max() { - let rng = rand::rngs::OsRng; + let rng = rand_core::UnwrapErr(rand::rngs::SysRng); let min_signers = 3; let max_signers = 2; @@ -159,7 +159,7 @@ fn check_sign_with_dealer_fails_with_min_signers_greater_than_max() { #[test] fn check_sign_with_dealer_fails_with_invalid_max_signers() { - let rng = rand::rngs::OsRng; + let rng = rand_core::UnwrapErr(rand::rngs::SysRng); let min_signers = 3; let max_signers = 1; @@ -175,13 +175,13 @@ fn check_sign_with_dealer_fails_with_invalid_max_signers() { /// value is working. #[test] fn check_share_generation_secp256k1_sha256() { - let rng = rand::rngs::OsRng; + let rng = rand_core::UnwrapErr(rand::rngs::SysRng); frost_core::tests::ciphersuite_generic::check_share_generation::(rng); } #[test] fn check_share_generation_fails_with_invalid_min_signers() { - let rng = rand::rngs::OsRng; + let rng = rand_core::UnwrapErr(rand::rngs::SysRng); let min_signers = 0; let max_signers = 3; @@ -195,7 +195,7 @@ fn check_share_generation_fails_with_invalid_min_signers() { #[test] fn check_share_generation_fails_with_min_signers_greater_than_max() { - let rng = rand::rngs::OsRng; + let rng = rand_core::UnwrapErr(rand::rngs::SysRng); let min_signers = 3; let max_signers = 2; @@ -209,7 +209,7 @@ fn check_share_generation_fails_with_min_signers_greater_than_max() { #[test] fn check_share_generation_fails_with_invalid_max_signers() { - let rng = rand::rngs::OsRng; + let rng = rand_core::UnwrapErr(rand::rngs::SysRng); let min_signers = 3; let max_signers = 0; @@ -221,17 +221,18 @@ fn check_share_generation_fails_with_invalid_max_signers() { >(min_signers, max_signers, error, rng); } -lazy_static! { - pub static ref VECTORS: Value = - serde_json::from_str(include_str!("../tests/helpers/vectors.json").trim()) - .expect("Test vector is valid JSON"); - pub static ref VECTORS_BIG_IDENTIFIER: Value = - serde_json::from_str(include_str!("../tests/helpers/vectors-big-identifier.json").trim()) - .expect("Test vector is valid JSON"); - pub static ref VECTORS_DKG: Value = - serde_json::from_str(include_str!("../tests/helpers/vectors_dkg.json").trim()) - .expect("Test vector is valid JSON"); -} +static VECTORS: LazyLock = LazyLock::new(|| { + serde_json::from_str(include_str!("../tests/helpers/vectors.json").trim()) + .expect("Test vector is valid JSON") +}); +static VECTORS_BIG_IDENTIFIER: LazyLock = LazyLock::new(|| { + serde_json::from_str(include_str!("../tests/helpers/vectors-big-identifier.json").trim()) + .expect("Test vector is valid JSON") +}); +static VECTORS_DKG: LazyLock = LazyLock::new(|| { + serde_json::from_str(include_str!("../tests/helpers/vectors_dkg.json").trim()) + .expect("Test vector is valid JSON") +}); #[test] fn check_sign_with_test_vectors() { @@ -273,7 +274,7 @@ fn check_identifier_generation() -> Result<(), Error> { #[test] fn check_sign_with_dealer_and_identifiers() { - let rng = rand::rngs::OsRng; + let rng = rand_core::UnwrapErr(rand::rngs::SysRng); frost_core::tests::ciphersuite_generic::check_sign_with_dealer_and_identifiers::< Secp256K1Sha256, @@ -283,7 +284,7 @@ fn check_sign_with_dealer_and_identifiers() { #[test] fn check_sign_with_missing_identifier() { - let rng = rand::rngs::OsRng; + let rng = rand_core::UnwrapErr(rand::rngs::SysRng); frost_core::tests::ciphersuite_generic::check_sign_with_missing_identifier::( rng, ); @@ -291,7 +292,7 @@ fn check_sign_with_missing_identifier() { #[test] fn check_sign_with_incorrect_commitments() { - let rng = rand::rngs::OsRng; + let rng = rand_core::UnwrapErr(rand::rngs::SysRng); frost_core::tests::ciphersuite_generic::check_sign_with_incorrect_commitments::< Secp256K1Sha256, _, @@ -301,7 +302,7 @@ fn check_sign_with_incorrect_commitments() { #[tokio::test] async fn check_async_sign_with_dealer() { tokio::spawn(async { - let rng = rand::rngs::OsRng; + let rng = rand_core::UnwrapErr(rand::rngs::SysRng); frost_core::tests::ciphersuite_generic::async_check_sign::(rng).await; }) .await diff --git a/frost-secp256k1/tests/rerandomized_tests.rs b/frost-secp256k1/tests/rerandomized_tests.rs index c7845f170..c1a6f60bb 100644 --- a/frost-secp256k1/tests/rerandomized_tests.rs +++ b/frost-secp256k1/tests/rerandomized_tests.rs @@ -2,7 +2,7 @@ use frost_secp256k1::Secp256K1Sha256; #[test] fn check_randomized_sign_with_dealer() { - let rng = rand::rngs::OsRng; + let rng = rand_core::UnwrapErr(rand::rngs::SysRng); let (_msg, _group_signature, _group_pubkey) = frost_rerandomized::tests::check_randomized_sign_with_dealer::(rng); diff --git a/frost-secp256k1/tests/serde_tests.rs b/frost-secp256k1/tests/serde_tests.rs index 5b02fdaeb..5b0314966 100644 --- a/frost-secp256k1/tests/serde_tests.rs +++ b/frost-secp256k1/tests/serde_tests.rs @@ -19,7 +19,7 @@ fn check_signing_commitments_serialization() { let commitments = samples::signing_commitments(); let json = serde_json::to_string_pretty(&commitments).unwrap(); - println!("{}", json); + println!("{json}"); let decoded_commitments: SigningCommitments = serde_json::from_str(&json).unwrap(); assert!(commitments == decoded_commitments); @@ -89,7 +89,7 @@ fn check_signing_package_serialization() { let signing_package = samples::signing_package(); let json = serde_json::to_string_pretty(&signing_package).unwrap(); - println!("{}", json); + println!("{json}"); let decoded_signing_package: SigningPackage = serde_json::from_str(&json).unwrap(); assert!(signing_package == decoded_signing_package); @@ -204,7 +204,7 @@ fn check_signature_share_serialization() { let signature_share = samples::signature_share(); let json = serde_json::to_string_pretty(&signature_share).unwrap(); - println!("{}", json); + println!("{json}"); let decoded_signature_share: SignatureShare = serde_json::from_str(&json).unwrap(); assert!(signature_share == decoded_signature_share); @@ -258,7 +258,7 @@ fn check_secret_share_serialization() { let secret_share = samples::secret_share(); let json = serde_json::to_string_pretty(&secret_share).unwrap(); - println!("{}", json); + println!("{json}"); let decoded_secret_share: SecretShare = serde_json::from_str(&json).unwrap(); assert!(secret_share == decoded_secret_share); @@ -342,7 +342,7 @@ fn check_key_package_serialization() { let key_package = samples::key_package(); let json = serde_json::to_string_pretty(&key_package).unwrap(); - println!("{}", json); + println!("{json}"); let decoded_key_package: KeyPackage = serde_json::from_str(&json).unwrap(); assert!(key_package == decoded_key_package); @@ -437,7 +437,7 @@ fn check_public_key_package_serialization() { let public_key_package = samples::public_key_package_new(); let json = serde_json::to_string_pretty(&public_key_package).unwrap(); - println!("{}", json); + println!("{json}"); let decoded_public_key_package: PublicKeyPackage = serde_json::from_str(&json).unwrap(); assert!(public_key_package == decoded_public_key_package); @@ -532,7 +532,7 @@ fn check_round1_package_serialization() { let round1_package = samples::round1_package(); let json = serde_json::to_string_pretty(&round1_package).unwrap(); - println!("{}", json); + println!("{json}"); let decoded_round1_package: round1::Package = serde_json::from_str(&json).unwrap(); assert!(round1_package == decoded_round1_package); @@ -598,7 +598,7 @@ fn check_round2_package_serialization() { let round2_package = samples::round2_package(); let json = serde_json::to_string_pretty(&round2_package).unwrap(); - println!("{}", json); + println!("{json}"); let decoded_round2_package: round2::Package = serde_json::from_str(&json).unwrap(); assert!(round2_package == decoded_round2_package); diff --git a/gencode/Cargo.toml b/gencode/Cargo.toml index 44dead9ba..8dba8000f 100644 --- a/gencode/Cargo.toml +++ b/gencode/Cargo.toml @@ -1,16 +1,25 @@ [package] name = "gencode" -version = "0.1.0" +version.workspace = true +authors.workspace = true edition.workspace = true +rust-version.workspace = true +description = "Internal tool for generating FROST ciphersuite documentation and source files." +documentation = "https://github.com/ZcashFoundation/frost/tree/main/gencode" +homepage.workspace = true +repository.workspace = true +license.workspace = true +keywords = ["cryptography", "frost", "code-generation", "documentation", "development-tools"] +categories = ["development-tools::build-utils", "command-line-utilities", "cryptography"] publish = false -[dependencies] -regex = "1.6.0" -serde_json.workspace = true - [[bin]] name = "gencode" path = "src/main.rs" # Disables non-criterion benchmark which is not used; prevents errors # when using criterion-specific flags bench = false + +[dependencies] +regex.workspace = true +serde_json.workspace = true diff --git a/gencode/src/main.rs b/gencode/src/main.rs index 9dee2d5da..6451533f7 100644 --- a/gencode/src/main.rs +++ b/gencode/src/main.rs @@ -124,8 +124,7 @@ fn write_docs( let new_doc = docs.get(old_name).map(|v| v.1.clone()); let Some(new_doc) = new_doc else { eprintln!( - "WARNING: documentation for {} is not available in base file. This can mean it's a specific type for the ciphersuite, or that there is a bug in gencode", - old_name + "WARNING: documentation for {old_name} is not available in base file. This can mean it's a specific type for the ciphersuite, or that there is a bug in gencode" ); continue; }; @@ -168,7 +167,7 @@ fn copy_and_replace( pub fn rustfmt(source: String) -> String { let mut child = Command::new("rustfmt") .arg("--edition") - .arg("2021") + .arg("2021") // TODO: remove this file once PR in merged (this is used to reduce diff) .stdin(Stdio::piped()) .stderr(Stdio::piped()) .stdout(Stdio::piped()) diff --git a/rustfmt.toml b/rustfmt.toml new file mode 100644 index 000000000..23b8245b6 --- /dev/null +++ b/rustfmt.toml @@ -0,0 +1,2 @@ +# TODO: remove this file once PR in merged (this is used to reduce diff) +style_edition = "2021"