From 1923d0333f27298681e7107bcdaaa69e5ff7b5a5 Mon Sep 17 00:00:00 2001 From: Simon Warta Date: Thu, 21 Mar 2024 17:38:48 +0100 Subject: [PATCH 01/79] Add bls12_318_aggregate_g1/bls12_318_aggregate_g2 --- Cargo.lock | 125 ++++- packages/crypto/Cargo.toml | 6 + packages/crypto/src/bls12_318/aggregate.rs | 227 ++++++++ packages/crypto/src/bls12_318/mod.rs | 4 + packages/crypto/src/bls12_318/points.rs | 312 +++++++++++ packages/crypto/src/lib.rs | 2 + ...0000000000000000000000000000000000000.json | 8 + ...6565656565656565656565656565656565656.json | 8 + ...babababababababababababababababababab.json | 8 + .../aggregate_infinity_signature.json | 6 + .../aggregate/aggregate_na_signatures.json | 1 + .../aggregate/aggregate_single_signature.json | 6 + .../aggregate_verify_infinity_pubkey.json | 18 + ...ify_na_pubkeys_and_infinity_signature.json | 8 + ...te_verify_na_pubkeys_and_na_signature.json | 8 + .../aggregate_verify_tampered_signature.json | 16 + .../aggregate_verify_valid.json | 16 + ...h_verify_invalid_forged_signature_set.json | 17 + ...verify_invalid_infinity_signature_set.json | 17 + ...h_verify_valid_multiple_signature_set.json | 17 + ...tch_verify_valid_simple_signature_set.json | 20 + ...tion_fails_infinity_with_false_b_flag.json | 6 + ...ation_fails_infinity_with_true_b_flag.json | 6 + .../deserialization_fails_not_in_G1.json | 6 + .../deserialization_fails_not_in_curve.json | 6 + .../deserialization_fails_too_few_bytes.json | 6 + .../deserialization_fails_too_many_bytes.json | 6 + ...ion_fails_with_b_flag_and_a_flag_true.json | 6 + ...ation_fails_with_b_flag_and_x_nonzero.json | 6 + ...serialization_fails_with_wrong_c_flag.json | 6 + ...erialization_fails_x_equal_to_modulus.json | 6 + ...lization_fails_x_greater_than_modulus.json | 6 + ...eserialization_succeeds_correct_point.json | 6 + ...on_succeeds_infinity_with_true_b_flag.json | 6 + ...tion_fails_infinity_with_false_b_flag.json | 6 + ...ation_fails_infinity_with_true_b_flag.json | 6 + .../deserialization_fails_not_in_G2.json | 6 + .../deserialization_fails_not_in_curve.json | 6 + .../deserialization_fails_too_few_bytes.json | 6 + .../deserialization_fails_too_many_bytes.json | 6 + ...ion_fails_with_b_flag_and_a_flag_true.json | 6 + ...ation_fails_with_b_flag_and_x_nonzero.json | 6 + ...serialization_fails_with_wrong_c_flag.json | 6 + ...ialization_fails_xim_equal_to_modulus.json | 6 + ...zation_fails_xim_greater_than_modulus.json | 6 + ...ialization_fails_xre_equal_to_modulus.json | 6 + ...zation_fails_xre_greater_than_modulus.json | 6 + ...eserialization_succeeds_correct_point.json | 6 + ...on_succeeds_infinity_with_true_b_flag.json | 6 + ..._verify_extra_pubkey_4f079f946446fabf.json | 12 + ..._verify_extra_pubkey_5a38e6b4017fe4dd.json | 13 + ..._verify_extra_pubkey_a698ea45b109f303.json | 11 + ...fast_aggregate_verify_infinity_pubkey.json | 13 + ...ify_na_pubkeys_and_infinity_signature.json | 8 + ...te_verify_na_pubkeys_and_na_signature.json | 8 + ...y_tampered_signature_3d7576f3c0e3570a.json | 12 + ...y_tampered_signature_5e745ad0c6199a6c.json | 10 + ...y_tampered_signature_652ce62f09290811.json | 11 + ...gregate_verify_valid_3d7576f3c0e3570a.json | 12 + ...gregate_verify_valid_5e745ad0c6199a6c.json | 10 + ...gregate_verify_valid_652ce62f09290811.json | 11 + .../hash_to_G2__2782afaa8406d038.json | 9 + .../hash_to_G2__7590bd067999bbfb.json | 7 + .../hash_to_G2__a54942c8e365f378.json | 7 + .../hash_to_G2__c938b486cf69e8f7.json | 7 + .../sign/sign_case_11b8c7cad5238946.json | 7 + .../sign/sign_case_142f678a8d05fcd1.json | 7 + .../sign/sign_case_37286e1a6d1f6eb3.json | 7 + .../sign/sign_case_7055381f640f2c1d.json | 7 + .../sign/sign_case_84d45c9c7cca6b92.json | 7 + .../sign/sign_case_8cd3d4d0d9a5b265.json | 7 + .../sign/sign_case_c82df61aa3ee60fb.json | 7 + .../sign/sign_case_d0e28d7e76eb6e9c.json | 7 + .../sign/sign_case_f2ae1097e7d0e18b.json | 7 + .../sign/sign_case_zero_privkey.json | 7 + ...nfinity_pubkey_and_infinity_signature.json | 8 + ...pered_signature_case_195246ee3bd3b6ec.json | 8 + ...pered_signature_case_2ea479adf8c40300.json | 8 + ...pered_signature_case_2f09d443ab8a3ac2.json | 8 + ...pered_signature_case_3208262581c8fc09.json | 8 + ...pered_signature_case_6b3b17f6962a490c.json | 8 + ...pered_signature_case_6eeb7c52dfd9baf0.json | 8 + ...pered_signature_case_8761a0b7e920c323.json | 8 + ...pered_signature_case_d34885d766d5f705.json | 8 + ...pered_signature_case_e8a50c445c855360.json | 8 + .../verify_valid_case_195246ee3bd3b6ec.json | 8 + .../verify_valid_case_2ea479adf8c40300.json | 8 + .../verify_valid_case_2f09d443ab8a3ac2.json | 8 + .../verify_valid_case_3208262581c8fc09.json | 8 + .../verify_valid_case_6b3b17f6962a490c.json | 8 + .../verify_valid_case_6eeb7c52dfd9baf0.json | 8 + .../verify_valid_case_8761a0b7e920c323.json | 8 + .../verify_valid_case_d34885d766d5f705.json | 8 + .../verify_valid_case_e8a50c445c855360.json | 8 + ...fy_wrong_pubkey_case_195246ee3bd3b6ec.json | 8 + ...fy_wrong_pubkey_case_2ea479adf8c40300.json | 8 + ...fy_wrong_pubkey_case_2f09d443ab8a3ac2.json | 8 + ...fy_wrong_pubkey_case_3208262581c8fc09.json | 8 + ...fy_wrong_pubkey_case_6b3b17f6962a490c.json | 8 + ...fy_wrong_pubkey_case_6eeb7c52dfd9baf0.json | 8 + ...fy_wrong_pubkey_case_8761a0b7e920c323.json | 8 + ...fy_wrong_pubkey_case_d34885d766d5f705.json | 8 + ...fy_wrong_pubkey_case_e8a50c445c855360.json | 8 + ...rifycase_one_privkey_47117849458281be.json | 8 + .../eth-headers/1699693797.394876721s.json | 503 ++++++++++++++++++ packages/crypto/tests/bls12_381.rs | 103 ++++ 106 files changed, 2066 insertions(+), 21 deletions(-) create mode 100644 packages/crypto/src/bls12_318/aggregate.rs create mode 100644 packages/crypto/src/bls12_318/mod.rs create mode 100644 packages/crypto/src/bls12_318/points.rs create mode 100644 packages/crypto/testdata/bls-tests/aggregate/aggregate_0x0000000000000000000000000000000000000000000000000000000000000000.json create mode 100644 packages/crypto/testdata/bls-tests/aggregate/aggregate_0x5656565656565656565656565656565656565656565656565656565656565656.json create mode 100644 packages/crypto/testdata/bls-tests/aggregate/aggregate_0xabababababababababababababababababababababababababababababababab.json create mode 100644 packages/crypto/testdata/bls-tests/aggregate/aggregate_infinity_signature.json create mode 100644 packages/crypto/testdata/bls-tests/aggregate/aggregate_na_signatures.json create mode 100644 packages/crypto/testdata/bls-tests/aggregate/aggregate_single_signature.json create mode 100644 packages/crypto/testdata/bls-tests/aggregate_verify/aggregate_verify_infinity_pubkey.json create mode 100644 packages/crypto/testdata/bls-tests/aggregate_verify/aggregate_verify_na_pubkeys_and_infinity_signature.json create mode 100644 packages/crypto/testdata/bls-tests/aggregate_verify/aggregate_verify_na_pubkeys_and_na_signature.json create mode 100644 packages/crypto/testdata/bls-tests/aggregate_verify/aggregate_verify_tampered_signature.json create mode 100644 packages/crypto/testdata/bls-tests/aggregate_verify/aggregate_verify_valid.json create mode 100644 packages/crypto/testdata/bls-tests/batch_verify/batch_verify_invalid_forged_signature_set.json create mode 100644 packages/crypto/testdata/bls-tests/batch_verify/batch_verify_invalid_infinity_signature_set.json create mode 100644 packages/crypto/testdata/bls-tests/batch_verify/batch_verify_valid_multiple_signature_set.json create mode 100644 packages/crypto/testdata/bls-tests/batch_verify/batch_verify_valid_simple_signature_set.json create mode 100644 packages/crypto/testdata/bls-tests/deserialization_G1/deserialization_fails_infinity_with_false_b_flag.json create mode 100644 packages/crypto/testdata/bls-tests/deserialization_G1/deserialization_fails_infinity_with_true_b_flag.json create mode 100644 packages/crypto/testdata/bls-tests/deserialization_G1/deserialization_fails_not_in_G1.json create mode 100644 packages/crypto/testdata/bls-tests/deserialization_G1/deserialization_fails_not_in_curve.json create mode 100644 packages/crypto/testdata/bls-tests/deserialization_G1/deserialization_fails_too_few_bytes.json create mode 100644 packages/crypto/testdata/bls-tests/deserialization_G1/deserialization_fails_too_many_bytes.json create mode 100644 packages/crypto/testdata/bls-tests/deserialization_G1/deserialization_fails_with_b_flag_and_a_flag_true.json create mode 100644 packages/crypto/testdata/bls-tests/deserialization_G1/deserialization_fails_with_b_flag_and_x_nonzero.json create mode 100644 packages/crypto/testdata/bls-tests/deserialization_G1/deserialization_fails_with_wrong_c_flag.json create mode 100644 packages/crypto/testdata/bls-tests/deserialization_G1/deserialization_fails_x_equal_to_modulus.json create mode 100644 packages/crypto/testdata/bls-tests/deserialization_G1/deserialization_fails_x_greater_than_modulus.json create mode 100644 packages/crypto/testdata/bls-tests/deserialization_G1/deserialization_succeeds_correct_point.json create mode 100644 packages/crypto/testdata/bls-tests/deserialization_G1/deserialization_succeeds_infinity_with_true_b_flag.json create mode 100644 packages/crypto/testdata/bls-tests/deserialization_G2/deserialization_fails_infinity_with_false_b_flag.json create mode 100644 packages/crypto/testdata/bls-tests/deserialization_G2/deserialization_fails_infinity_with_true_b_flag.json create mode 100644 packages/crypto/testdata/bls-tests/deserialization_G2/deserialization_fails_not_in_G2.json create mode 100644 packages/crypto/testdata/bls-tests/deserialization_G2/deserialization_fails_not_in_curve.json create mode 100644 packages/crypto/testdata/bls-tests/deserialization_G2/deserialization_fails_too_few_bytes.json create mode 100644 packages/crypto/testdata/bls-tests/deserialization_G2/deserialization_fails_too_many_bytes.json create mode 100644 packages/crypto/testdata/bls-tests/deserialization_G2/deserialization_fails_with_b_flag_and_a_flag_true.json create mode 100644 packages/crypto/testdata/bls-tests/deserialization_G2/deserialization_fails_with_b_flag_and_x_nonzero.json create mode 100644 packages/crypto/testdata/bls-tests/deserialization_G2/deserialization_fails_with_wrong_c_flag.json create mode 100644 packages/crypto/testdata/bls-tests/deserialization_G2/deserialization_fails_xim_equal_to_modulus.json create mode 100644 packages/crypto/testdata/bls-tests/deserialization_G2/deserialization_fails_xim_greater_than_modulus.json create mode 100644 packages/crypto/testdata/bls-tests/deserialization_G2/deserialization_fails_xre_equal_to_modulus.json create mode 100644 packages/crypto/testdata/bls-tests/deserialization_G2/deserialization_fails_xre_greater_than_modulus.json create mode 100644 packages/crypto/testdata/bls-tests/deserialization_G2/deserialization_succeeds_correct_point.json create mode 100644 packages/crypto/testdata/bls-tests/deserialization_G2/deserialization_succeeds_infinity_with_true_b_flag.json create mode 100644 packages/crypto/testdata/bls-tests/fast_aggregate_verify/fast_aggregate_verify_extra_pubkey_4f079f946446fabf.json create mode 100644 packages/crypto/testdata/bls-tests/fast_aggregate_verify/fast_aggregate_verify_extra_pubkey_5a38e6b4017fe4dd.json create mode 100644 packages/crypto/testdata/bls-tests/fast_aggregate_verify/fast_aggregate_verify_extra_pubkey_a698ea45b109f303.json create mode 100644 packages/crypto/testdata/bls-tests/fast_aggregate_verify/fast_aggregate_verify_infinity_pubkey.json create mode 100644 packages/crypto/testdata/bls-tests/fast_aggregate_verify/fast_aggregate_verify_na_pubkeys_and_infinity_signature.json create mode 100644 packages/crypto/testdata/bls-tests/fast_aggregate_verify/fast_aggregate_verify_na_pubkeys_and_na_signature.json create mode 100644 packages/crypto/testdata/bls-tests/fast_aggregate_verify/fast_aggregate_verify_tampered_signature_3d7576f3c0e3570a.json create mode 100644 packages/crypto/testdata/bls-tests/fast_aggregate_verify/fast_aggregate_verify_tampered_signature_5e745ad0c6199a6c.json create mode 100644 packages/crypto/testdata/bls-tests/fast_aggregate_verify/fast_aggregate_verify_tampered_signature_652ce62f09290811.json create mode 100644 packages/crypto/testdata/bls-tests/fast_aggregate_verify/fast_aggregate_verify_valid_3d7576f3c0e3570a.json create mode 100644 packages/crypto/testdata/bls-tests/fast_aggregate_verify/fast_aggregate_verify_valid_5e745ad0c6199a6c.json create mode 100644 packages/crypto/testdata/bls-tests/fast_aggregate_verify/fast_aggregate_verify_valid_652ce62f09290811.json create mode 100644 packages/crypto/testdata/bls-tests/hash_to_G2/hash_to_G2__2782afaa8406d038.json create mode 100644 packages/crypto/testdata/bls-tests/hash_to_G2/hash_to_G2__7590bd067999bbfb.json create mode 100644 packages/crypto/testdata/bls-tests/hash_to_G2/hash_to_G2__a54942c8e365f378.json create mode 100644 packages/crypto/testdata/bls-tests/hash_to_G2/hash_to_G2__c938b486cf69e8f7.json create mode 100644 packages/crypto/testdata/bls-tests/sign/sign_case_11b8c7cad5238946.json create mode 100644 packages/crypto/testdata/bls-tests/sign/sign_case_142f678a8d05fcd1.json create mode 100644 packages/crypto/testdata/bls-tests/sign/sign_case_37286e1a6d1f6eb3.json create mode 100644 packages/crypto/testdata/bls-tests/sign/sign_case_7055381f640f2c1d.json create mode 100644 packages/crypto/testdata/bls-tests/sign/sign_case_84d45c9c7cca6b92.json create mode 100644 packages/crypto/testdata/bls-tests/sign/sign_case_8cd3d4d0d9a5b265.json create mode 100644 packages/crypto/testdata/bls-tests/sign/sign_case_c82df61aa3ee60fb.json create mode 100644 packages/crypto/testdata/bls-tests/sign/sign_case_d0e28d7e76eb6e9c.json create mode 100644 packages/crypto/testdata/bls-tests/sign/sign_case_f2ae1097e7d0e18b.json create mode 100644 packages/crypto/testdata/bls-tests/sign/sign_case_zero_privkey.json create mode 100644 packages/crypto/testdata/bls-tests/verify/verify_infinity_pubkey_and_infinity_signature.json create mode 100644 packages/crypto/testdata/bls-tests/verify/verify_tampered_signature_case_195246ee3bd3b6ec.json create mode 100644 packages/crypto/testdata/bls-tests/verify/verify_tampered_signature_case_2ea479adf8c40300.json create mode 100644 packages/crypto/testdata/bls-tests/verify/verify_tampered_signature_case_2f09d443ab8a3ac2.json create mode 100644 packages/crypto/testdata/bls-tests/verify/verify_tampered_signature_case_3208262581c8fc09.json create mode 100644 packages/crypto/testdata/bls-tests/verify/verify_tampered_signature_case_6b3b17f6962a490c.json create mode 100644 packages/crypto/testdata/bls-tests/verify/verify_tampered_signature_case_6eeb7c52dfd9baf0.json create mode 100644 packages/crypto/testdata/bls-tests/verify/verify_tampered_signature_case_8761a0b7e920c323.json create mode 100644 packages/crypto/testdata/bls-tests/verify/verify_tampered_signature_case_d34885d766d5f705.json create mode 100644 packages/crypto/testdata/bls-tests/verify/verify_tampered_signature_case_e8a50c445c855360.json create mode 100644 packages/crypto/testdata/bls-tests/verify/verify_valid_case_195246ee3bd3b6ec.json create mode 100644 packages/crypto/testdata/bls-tests/verify/verify_valid_case_2ea479adf8c40300.json create mode 100644 packages/crypto/testdata/bls-tests/verify/verify_valid_case_2f09d443ab8a3ac2.json create mode 100644 packages/crypto/testdata/bls-tests/verify/verify_valid_case_3208262581c8fc09.json create mode 100644 packages/crypto/testdata/bls-tests/verify/verify_valid_case_6b3b17f6962a490c.json create mode 100644 packages/crypto/testdata/bls-tests/verify/verify_valid_case_6eeb7c52dfd9baf0.json create mode 100644 packages/crypto/testdata/bls-tests/verify/verify_valid_case_8761a0b7e920c323.json create mode 100644 packages/crypto/testdata/bls-tests/verify/verify_valid_case_d34885d766d5f705.json create mode 100644 packages/crypto/testdata/bls-tests/verify/verify_valid_case_e8a50c445c855360.json create mode 100644 packages/crypto/testdata/bls-tests/verify/verify_wrong_pubkey_case_195246ee3bd3b6ec.json create mode 100644 packages/crypto/testdata/bls-tests/verify/verify_wrong_pubkey_case_2ea479adf8c40300.json create mode 100644 packages/crypto/testdata/bls-tests/verify/verify_wrong_pubkey_case_2f09d443ab8a3ac2.json create mode 100644 packages/crypto/testdata/bls-tests/verify/verify_wrong_pubkey_case_3208262581c8fc09.json create mode 100644 packages/crypto/testdata/bls-tests/verify/verify_wrong_pubkey_case_6b3b17f6962a490c.json create mode 100644 packages/crypto/testdata/bls-tests/verify/verify_wrong_pubkey_case_6eeb7c52dfd9baf0.json create mode 100644 packages/crypto/testdata/bls-tests/verify/verify_wrong_pubkey_case_8761a0b7e920c323.json create mode 100644 packages/crypto/testdata/bls-tests/verify/verify_wrong_pubkey_case_d34885d766d5f705.json create mode 100644 packages/crypto/testdata/bls-tests/verify/verify_wrong_pubkey_case_e8a50c445c855360.json create mode 100644 packages/crypto/testdata/bls-tests/verify/verifycase_one_privkey_47117849458281be.json create mode 100644 packages/crypto/testdata/eth-headers/1699693797.394876721s.json create mode 100644 packages/crypto/tests/bls12_381.rs diff --git a/Cargo.lock b/Cargo.lock index 532e697215..abc1d8ff25 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -174,12 +174,28 @@ version = "0.2.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "4c7f02d4ea65f2c1853089ffd8d2787bdbc63de2f0d29dedbcf8ccdfa0ccd4cf" +[[package]] +name = "base64" +version = "0.21.7" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9d297deb1925b89f2ccc13d7635fa0714f12c87adce1c75356b39ca9b7178567" + [[package]] name = "base64" version = "0.22.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "9475866fec1451be56a3c2400fd081ff546538961565ccb5b7142cbd22bc7a51" +[[package]] +name = "base64-serde" +version = "0.7.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ba368df5de76a5bea49aaf0cf1b39ccfbbef176924d1ba5db3e4135216cbe3c7" +dependencies = [ + "base64 0.21.7", + "serde", +] + [[package]] name = "bech32" version = "0.11.0" @@ -194,9 +210,9 @@ checksum = "bef38d45163c2f1dde094a7dfd33ccf595c92905c8f8f4fdc18d06fb1037718a" [[package]] name = "bitflags" -version = "2.4.2" +version = "2.5.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ed570934406eb16438a4e976b1b4500774099c13b8cb96eec99f620f05090ddf" +checksum = "cf4b9d6a944f767f8e5e0db018570623c85f3d925ac718db4e06d0187adb21c1" [[package]] name = "bitvec" @@ -210,6 +226,15 @@ dependencies = [ "wyz", ] +[[package]] +name = "block-buffer" +version = "0.9.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4152116fd6e9dadb291ae18fc1ec3575ed6d84c29642d97890f4b4a3417297e4" +dependencies = [ + "generic-array", +] + [[package]] name = "block-buffer" version = "0.10.4" @@ -219,6 +244,20 @@ dependencies = [ "generic-array", ] +[[package]] +name = "bls12_381" +version = "0.8.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d7bc6d6292be3a19e6379786dac800f551e5865a5bb51ebbe3064ab80433f403" +dependencies = [ + "digest 0.9.0", + "ff", + "group", + "pairing", + "rand_core", + "subtle", +] + [[package]] name = "bnum" version = "0.11.0" @@ -418,7 +457,7 @@ dependencies = [ name = "cosmwasm-core" version = "2.0.1" dependencies = [ - "base64", + "base64 0.22.0", "bnum", "cosmwasm-crypto", "cosmwasm-std", @@ -429,7 +468,7 @@ dependencies = [ "schemars", "serde", "serde_json", - "sha2", + "sha2 0.10.8", "static_assertions", "thiserror", ] @@ -438,9 +477,12 @@ dependencies = [ name = "cosmwasm-crypto" version = "2.0.1" dependencies = [ + "base64 0.21.7", + "base64-serde", + "bls12_381", "criterion", "derive_more", - "digest", + "digest 0.10.7", "ecdsa", "ed25519-zebra", "english-numbers", @@ -448,10 +490,13 @@ dependencies = [ "hex-literal", "k256", "p256", + "pairing", "rand_core", + "rayon", "serde", "serde_json", - "sha2", + "sha2 0.10.8", + "sha2 0.9.9", "sha3", "thiserror", ] @@ -494,7 +539,7 @@ dependencies = [ name = "cosmwasm-std" version = "2.0.1" dependencies = [ - "base64", + "base64 0.22.0", "bech32", "chrono", "cosmwasm-core", @@ -510,7 +555,7 @@ dependencies = [ "serde", "serde-json-wasm", "serde_json", - "sha2", + "sha2 0.10.8", "thiserror", ] @@ -537,7 +582,7 @@ dependencies = [ "schemars", "serde", "serde_json", - "sha2", + "sha2 0.10.8", "strum", "target-lexicon", "tempfile", @@ -761,7 +806,7 @@ dependencies = [ "cfg-if", "cpufeatures", "curve25519-dalek-derive", - "digest", + "digest 0.10.7", "fiat-crypto", "platforms", "rustc_version", @@ -900,13 +945,22 @@ version = "0.4.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "6184e33543162437515c2e2b48714794e37845ec9851711914eec9d308f6ebe8" +[[package]] +name = "digest" +version = "0.9.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d3dd60d1080a57a05ab032377049e0591415d2b31afd7028356dbf3cc6dcb066" +dependencies = [ + "generic-array", +] + [[package]] name = "digest" version = "0.10.7" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "9ed9a281f7bc9b7576e61468ba615a66a5c8cfdff42420a70aa82701a3b1e292" dependencies = [ - "block-buffer", + "block-buffer 0.10.4", "const-oid", "crypto-common", "subtle", @@ -957,7 +1011,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "ee27f32b5c5292967d2d4a9d7f1e0b0aed2c15daded5a60300e4abb9d8020bca" dependencies = [ "der", - "digest", + "digest 0.10.7", "elliptic-curve", "rfc6979", "signature", @@ -983,7 +1037,7 @@ dependencies = [ "hashbrown 0.14.3", "hex", "rand_core", - "sha2", + "sha2 0.10.8", "zeroize", ] @@ -1001,7 +1055,7 @@ checksum = "b5e6043086bf7973472e0c7dff2142ea0b680d30e18d9cc40f267efbf222bd47" dependencies = [ "base16ct", "crypto-bigint", - "digest", + "digest 0.10.7", "ff", "generic-array", "group", @@ -1106,6 +1160,7 @@ version = "0.13.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "ded41244b729663b1e574f1b4fb731469f69f79c17667b5d776b16cda0479449" dependencies = [ + "bitvec", "rand_core", "subtle", ] @@ -1272,7 +1327,7 @@ version = "0.12.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "6c49c37c09c17a53d937dfbb742eb3a961d65a994e6bcdcf37e7399d0cc8ab5e" dependencies = [ - "digest", + "digest 0.10.7", ] [[package]] @@ -1372,7 +1427,7 @@ dependencies = [ "cfg-if", "ecdsa", "elliptic-curve", - "sha2", + "sha2 0.10.8", ] [[package]] @@ -1549,6 +1604,12 @@ version = "11.1.3" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "0ab1bc2a289d34bd04a330323ac98a1b4bc82c9d9fcb1e66b63caa84da26b575" +[[package]] +name = "opaque-debug" +version = "0.3.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c08d65885ee38876c4f86fa503fb49d7b507c2b62552df7c70b2fce627e06381" + [[package]] name = "p256" version = "0.13.2" @@ -1558,7 +1619,16 @@ dependencies = [ "ecdsa", "elliptic-curve", "primeorder", - "sha2", + "sha2 0.10.8", +] + +[[package]] +name = "pairing" +version = "0.23.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "81fec4625e73cf41ef4bb6846cafa6d44736525f442ba45e407c4a000a13996f" +dependencies = [ + "group", ] [[package]] @@ -2086,6 +2156,19 @@ dependencies = [ "serde", ] +[[package]] +name = "sha2" +version = "0.9.9" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4d58a1e1bf39749807d89cf2d98ac2dfa0ff1cb3faa38fbb64dd88ac8013d800" +dependencies = [ + "block-buffer 0.9.0", + "cfg-if", + "cpufeatures", + "digest 0.9.0", + "opaque-debug", +] + [[package]] name = "sha2" version = "0.10.8" @@ -2094,7 +2177,7 @@ checksum = "793db75ad2bcafc3ffa7c68b215fee268f537982cd901d132f89c6343f3a3dc8" dependencies = [ "cfg-if", "cpufeatures", - "digest", + "digest 0.10.7", ] [[package]] @@ -2103,7 +2186,7 @@ version = "0.10.8" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "75872d278a8f37ef87fa0ddbda7802605cb18344497949862c0d4dcb291eba60" dependencies = [ - "digest", + "digest 0.10.7", "keccak", ] @@ -2123,7 +2206,7 @@ version = "2.1.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "5e1788eed21689f9cf370582dfc467ef36ed9c707f073528ddafa8d83e3b8500" dependencies = [ - "digest", + "digest 0.10.7", "rand_core", ] @@ -2671,7 +2754,7 @@ version = "0.121.2" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "9dbe55c8f9d0dbd25d9447a5a889ff90c0cc3feaa7395310d3d826b2c703eaab" dependencies = [ - "bitflags 2.4.2", + "bitflags 2.5.0", "indexmap 2.2.5", "semver", ] diff --git a/packages/crypto/Cargo.toml b/packages/crypto/Cargo.toml index a7f480a89e..74507969d8 100644 --- a/packages/crypto/Cargo.toml +++ b/packages/crypto/Cargo.toml @@ -24,9 +24,15 @@ rand_core = "0.6" # Not used directly, but needed to bump transitive dependency, see: https://github.com/CosmWasm/cosmwasm/pull/1899 for details. ecdsa = "0.16.2" p256 = { version = "0.13.2", default-features = false, features = ["ecdsa"] } +pairing = "0.23.0" +bls12_381 = { version = "0.8.0", features = ["experimental"] } +rayon = "1.9.0" +sha2_v9 = { package = "sha2", version = "0.9.1" } # Must be compatible with bls12_381, see https://github.com/zkcrypto/bls12_381/issues/102 thiserror = { version = "1.0.26", optional = true } [dev-dependencies] +base64 = "0.21.0" +base64-serde = "0.7.0" criterion = "0.5.1" rand_core = { version = "0.6", features = ["getrandom"] } serde = { version = "1.0.103", default-features = false, features = ["derive", "alloc"] } diff --git a/packages/crypto/src/bls12_318/aggregate.rs b/packages/crypto/src/bls12_318/aggregate.rs new file mode 100644 index 0000000000..0ebedef840 --- /dev/null +++ b/packages/crypto/src/bls12_318/aggregate.rs @@ -0,0 +1,227 @@ +use super::points::{g1_from_fixed, g2_from_fixed, InvalidPoint, G1, G2}; + +const G1_POINT_SIZE: usize = 48; +const G2_POINT_SIZE: usize = 96; + +/// Takes a list of points in G1 (48 bytes each) and aggregates them. +/// +/// This is like Aggregate from +/// but works for signatures as well as public keys. +pub fn bls12_318_aggregate_g1(points: &[u8]) -> Result<[u8; 48], InvalidPoint> { + if points.len() % G1_POINT_SIZE != 0 { + return Err(InvalidPoint::DecodingError {}); + } + + let points_count = points.len() / G1_POINT_SIZE; + + use rayon::prelude::*; + + let points: Vec<[u8; 48]> = points + .chunks_exact(G1_POINT_SIZE) + .map(|data| { + let mut buf = [0u8; 48]; + buf[..].clone_from_slice(data); + buf + }) + .collect(); + + let mut decoded_points = Vec::with_capacity(points_count); + points + .par_iter() + .map(g1_from_fixed) + .collect_into_vec(&mut decoded_points); + + let out: Result, InvalidPoint> = decoded_points.into_iter().collect(); + let out = out?; + + let out = g1_sum(&out); + + Ok(out.to_compressed()) +} + +/// Takes a list of points in G2 (96 bytes each) and aggregates them. +/// +/// This is like Aggregate from +/// but works for signatures as well as public keys. +pub fn bls12_318_aggregate_g2(points: &[u8]) -> Result<[u8; 96], InvalidPoint> { + if points.len() % G2_POINT_SIZE != 0 { + return Err(InvalidPoint::DecodingError {}); + } + + let points_count = points.len() / G2_POINT_SIZE; + + use rayon::prelude::*; + + let points: Vec<[u8; 96]> = points + .chunks_exact(G2_POINT_SIZE) + .map(|data| { + let mut buf = [0u8; 96]; + buf[..].clone_from_slice(data); + buf + }) + .collect(); + + let mut decoded_points = Vec::with_capacity(points_count); + points + .par_iter() + .map(g2_from_fixed) + .collect_into_vec(&mut decoded_points); + + let out: Result, InvalidPoint> = decoded_points.into_iter().collect(); + let out = out?; + + let out = g2_sum(&out); + + Ok(out.to_compressed()) +} + +/// Creates a sum of points in G1. +/// +/// This is fast since math is done on projective points. Parallelization does not help here +/// for ~500 elements. +#[inline] +pub fn g1_sum(elements: &[G1]) -> G1 { + elements.iter().sum() +} + +/// Creates a sum of points in G2. +/// +/// This is fast since math is done on projective points. Parallelization does not help here +/// for ~500 elements. +#[inline] +pub fn g2_sum(elements: &[G2]) -> G2 { + elements.iter().sum() +} + +#[cfg(test)] +mod tests { + use super::super::points::{g1_from_fixed, g1_from_variable, g1s_from_variable, g2_from_fixed}; + use super::*; + use base64::engine::general_purpose::STANDARD; + use base64_serde::base64_serde_type; + use hex_literal::hex; + + base64_serde_type!(Base64Standard, STANDARD); + + #[derive(Debug, PartialEq, serde::Serialize, serde::Deserialize)] + struct EthPubkey(#[serde(with = "Base64Standard")] Vec); + + #[derive(Debug, PartialEq, serde::Serialize, serde::Deserialize)] + struct EthHeaders { + public_keys: Vec, + #[serde(with = "Base64Standard")] + message: Vec, + #[serde(with = "Base64Standard")] + signature: Vec, + #[serde(with = "Base64Standard")] + aggregate_pubkey: Vec, + } + + const ETH_HEADER_FILE: &str = + include_str!("../../testdata/eth-headers/1699693797.394876721s.json"); + + fn read_eth_header_file() -> EthHeaders { + serde_json::from_str(ETH_HEADER_FILE).unwrap() + } + + /// Arbitrary point in G1 + fn p1() -> G1 { + // Public key of classic League of Entropy Mainnet (curl -sS https://drand.cloudflare.com/info) + g1_from_fixed(&hex!("868f005eb8e6e4ca0a47c8a77ceaa5309a47978a7c71bc5cce96366b5d7a569937c529eeda66c7293784a9402801af31")).unwrap() + } + + /// Arbitrary point in G2 + fn p2() -> G2 { + g2_from_fixed(&hex!("b6ed936746e01f8ecf281f020953fbf1f01debd5657c4a383940b020b26507f6076334f91e2366c96e9ab279fb5158090352ea1c5b0c9274504f4f0e7053af24802e51e4568d164fe986834f41e55c8e850ce1f98458c0cfc9ab380b55285a55")).unwrap() + } + + #[test] + fn bls12_318_aggregate_g1_works() { + let sum = bls12_318_aggregate_g1(b"").unwrap(); + assert_eq!(sum, G1::identity().to_compressed()); + } + + #[test] + fn bls12_318_aggregate_g2_works() { + let sum = bls12_318_aggregate_g2(b"").unwrap(); + assert_eq!(sum, G2::identity().to_compressed()); + } + + #[test] + fn g1_sum_works() { + // no elements + let sum = g1_sum(&[]); + assert_eq!(sum, G1::identity()); + + // one element + let sum = g1_sum(&[G1::identity()]); + assert_eq!(sum, G1::identity()); + let sum = g1_sum(&[p1()]); + assert_eq!(sum, p1()); + + { + let file = read_eth_header_file(); + + let pubkeys: Vec<&[u8]> = file.public_keys.iter().map(|m| m.0.as_slice()).collect(); + let points: Vec = g1s_from_variable(&pubkeys) + .into_iter() + .map(|res| res.unwrap()) + .collect(); + let expected_sum = g1_from_variable(&file.aggregate_pubkey).unwrap(); + let sum = g1_sum(&points); + assert_eq!(sum, expected_sum); + } + } + + #[test] + fn g2_sum_works() { + // no elements + let sum = g2_sum(&[]); + assert_eq!(sum, G2::identity()); + + // single + let sum = g2_sum(&[p2()]); + assert_eq!(sum, p2()); + + // multiple 1 + let a = g2_from_fixed(&hex!("b6ed936746e01f8ecf281f020953fbf1f01debd5657c4a383940b020b26507f6076334f91e2366c96e9ab279fb5158090352ea1c5b0c9274504f4f0e7053af24802e51e4568d164fe986834f41e55c8e850ce1f98458c0cfc9ab380b55285a55")).unwrap(); + let b = g2_from_fixed(&hex!("b23c46be3a001c63ca711f87a005c200cc550b9429d5f4eb38d74322144f1b63926da3388979e5321012fb1a0526bcd100b5ef5fe72628ce4cd5e904aeaa3279527843fae5ca9ca675f4f51ed8f83bbf7155da9ecc9663100a885d5dc6df96d9")).unwrap(); + let c = g2_from_fixed(&hex!("948a7cb99f76d616c2c564ce9bf4a519f1bea6b0a624a02276443c245854219fabb8d4ce061d255af5330b078d5380681751aa7053da2c98bae898edc218c75f07e24d8802a17cd1f6833b71e58f5eb5b94208b4d0bb3848cecb075ea21be115")).unwrap(); + let expected = g2_from_fixed(&hex!("9683b3e6701f9a4b706709577963110043af78a5b41991b998475a3d3fd62abf35ce03b33908418efc95a058494a8ae504354b9f626231f6b3f3c849dfdeaf5017c4780e2aee1850ceaf4b4d9ce70971a3d2cfcd97b7e5ecf6759f8da5f76d31")).unwrap(); + let sum = g2_sum(&[a.clone(), b.clone(), c.clone()]); + assert_eq!(sum, expected); + let sum = g2_sum(&[b.clone(), a.clone(), c.clone()]); + assert_eq!(sum, expected); + let sum = g2_sum(&[c.clone(), b.clone(), a.clone()]); + assert_eq!(sum, expected); + + // multiple 2 + let a = g2_from_fixed(&hex!("882730e5d03f6b42c3abc26d3372625034e1d871b65a8a6b900a56dae22da98abbe1b68f85e49fe7652a55ec3d0591c20767677e33e5cbb1207315c41a9ac03be39c2e7668edc043d6cb1d9fd93033caa8a1c5b0e84bedaeb6c64972503a43eb")).unwrap(); + let b = g2_from_fixed(&hex!("af1390c3c47acdb37131a51216da683c509fce0e954328a59f93aebda7e4ff974ba208d9a4a2a2389f892a9d418d618418dd7f7a6bc7aa0da999a9d3a5b815bc085e14fd001f6a1948768a3f4afefc8b8240dda329f984cb345c6363272ba4fe")).unwrap(); + let c = g2_from_fixed(&hex!("a4efa926610b8bd1c8330c918b7a5e9bf374e53435ef8b7ec186abf62e1b1f65aeaaeb365677ac1d1172a1f5b44b4e6d022c252c58486c0a759fbdc7de15a756acc4d343064035667a594b4c2a6f0b0b421975977f297dba63ee2f63ffe47bb6")).unwrap(); + let expected = g2_from_fixed(&hex!("ad38fc73846583b08d110d16ab1d026c6ea77ac2071e8ae832f56ac0cbcdeb9f5678ba5ce42bd8dce334cc47b5abcba40a58f7f1f80ab304193eb98836cc14d8183ec14cc77de0f80c4ffd49e168927a968b5cdaa4cf46b9805be84ad7efa77b")).unwrap(); + let sum = g2_sum(&[a.clone(), b.clone(), c.clone()]); + assert_eq!(sum, expected); + let sum = g2_sum(&[b.clone(), a.clone(), c.clone()]); + assert_eq!(sum, expected); + let sum = g2_sum(&[c.clone(), b.clone(), a.clone()]); + assert_eq!(sum, expected); + + // multiple 3 + let a = g2_from_fixed(&hex!("91347bccf740d859038fcdcaf233eeceb2a436bcaaee9b2aa3bfb70efe29dfb2677562ccbea1c8e061fb9971b0753c240622fab78489ce96768259fc01360346da5b9f579e5da0d941e4c6ba18a0e64906082375394f337fa1af2b7127b0d121")).unwrap(); + let b = g2_from_fixed(&hex!("9674e2228034527f4c083206032b020310face156d4a4685e2fcaec2f6f3665aa635d90347b6ce124eb879266b1e801d185de36a0a289b85e9039662634f2eea1e02e670bc7ab849d006a70b2f93b84597558a05b879c8d445f387a5d5b653df")).unwrap(); + let c = g2_from_fixed(&hex!("ae82747ddeefe4fd64cf9cedb9b04ae3e8a43420cd255e3c7cd06a8d88b7c7f8638543719981c5d16fa3527c468c25f0026704a6951bde891360c7e8d12ddee0559004ccdbe6046b55bae1b257ee97f7cdb955773d7cf29adf3ccbb9975e4eb9")).unwrap(); + let expected = g2_from_fixed(&hex!("9712c3edd73a209c742b8250759db12549b3eaf43b5ca61376d9f30e2747dbcf842d8b2ac0901d2a093713e20284a7670fcf6954e9ab93de991bb9b313e664785a075fc285806fa5224c82bde146561b446ccfc706a64b8579513cfc4ff1d930")).unwrap(); + let sum = g2_sum(&[a.clone(), b.clone(), c.clone()]); + assert_eq!(sum, expected); + let sum = g2_sum(&[b.clone(), a.clone(), c.clone()]); + assert_eq!(sum, expected); + let sum = g2_sum(&[c.clone(), b.clone(), a.clone()]); + assert_eq!(sum, expected); + + // infinity + let inf = g2_from_fixed(&hex!("c00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000")).unwrap(); + let sum = g2_sum(&[inf.clone()]); + assert_eq!(sum, inf); + } +} diff --git a/packages/crypto/src/bls12_318/mod.rs b/packages/crypto/src/bls12_318/mod.rs new file mode 100644 index 0000000000..b4f8403934 --- /dev/null +++ b/packages/crypto/src/bls12_318/mod.rs @@ -0,0 +1,4 @@ +mod aggregate; +mod points; + +pub use aggregate::{bls12_318_aggregate_g1, bls12_318_aggregate_g2}; diff --git a/packages/crypto/src/bls12_318/points.rs b/packages/crypto/src/bls12_318/points.rs new file mode 100644 index 0000000000..b77b1ee9a3 --- /dev/null +++ b/packages/crypto/src/bls12_318/points.rs @@ -0,0 +1,312 @@ +#![allow(unused)] + +use std::fmt; +use std::ops::Add; + +use bls12_381::{G1Affine, G1Projective, G2Affine, G2Projective}; + +/// Point on G1 +#[derive(Debug, PartialEq, Clone)] +pub struct G1(pub(crate) G1Affine); + +impl G1 { + /// Creates the generaor in G1 + #[inline] + pub fn generator() -> Self { + Self(G1Affine::generator()) + } + + /// Creates the identity element in G1 (point at infinity) + #[inline] + pub fn identity() -> Self { + Self(G1Affine::identity()) + } + + #[inline] + pub fn from_uncompressed(data: &[u8; 96]) -> Option { + G1Affine::from_uncompressed(data).map(Self).into() + } + + #[inline] + pub fn to_uncompressed(&self) -> [u8; 96] { + self.0.to_uncompressed() + } + + #[inline] + pub fn to_compressed(&self) -> [u8; 48] { + self.0.to_compressed() + } +} + +impl Add for G1 { + type Output = G1; + + fn add(self, rhs: Self) -> Self { + let sum = self.0 + G1Projective::from(rhs.0); + Self(sum.into()) + } +} + +impl Add<&G1> for G1 { + type Output = G1; + + fn add(self, rhs: &G1) -> G1 { + let sum = self.0 + G1Projective::from(rhs.0); + G1(sum.into()) + } +} + +impl Add<&G1> for &G1 { + type Output = G1; + + fn add(self, rhs: &G1) -> G1 { + let sum = self.0 + G1Projective::from(rhs.0); + G1(sum.into()) + } +} + +impl core::iter::Sum for G1 { + fn sum>(iter: I) -> Self { + let zero = G1Projective::identity(); + let sum = iter.fold(zero, |acc, next| acc + G1Projective::from(next.0)); + G1(sum.into()) + } +} + +impl<'a> core::iter::Sum<&'a G1> for G1 { + fn sum>(iter: I) -> Self { + let zero = G1Projective::identity(); + let sum = iter.fold(zero, |acc, next| acc + G1Projective::from(next.0)); + G1(sum.into()) + } +} + +/// Point on G2 +#[derive(Debug, PartialEq, Clone)] +pub struct G2(pub(crate) G2Affine); + +impl G2 { + /// Creates the generaor in G2 + #[inline] + pub fn generator() -> Self { + Self(G2Affine::generator()) + } + + /// Creates the identity element in G2 (point at infinity) + #[inline] + pub fn identity() -> Self { + Self(G2Affine::identity()) + } + + #[inline] + pub fn from_uncompressed(data: &[u8; 192]) -> Option { + G2Affine::from_uncompressed(data).map(Self).into() + } + + #[inline] + pub fn to_uncompressed(&self) -> [u8; 192] { + self.0.to_uncompressed() + } + + #[inline] + pub fn to_compressed(&self) -> [u8; 96] { + self.0.to_compressed() + } +} + +impl core::iter::Sum for G2 { + fn sum>(iter: I) -> Self { + let zero = G2Projective::identity(); + let sum = iter.fold(zero, |acc, next| acc + G2Projective::from(next.0)); + G2(sum.into()) + } +} + +impl<'a> core::iter::Sum<&'a G2> for G2 { + fn sum>(iter: I) -> Self { + let zero = G2Projective::identity(); + let sum = iter.fold(zero, |acc, next| acc + G2Projective::from(next.0)); + G2(sum.into()) + } +} + +#[derive(Debug)] +pub enum InvalidPoint { + InvalidLength { expected: usize, actual: usize }, + DecodingError {}, +} + +impl fmt::Display for InvalidPoint { + fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result { + match self { + InvalidPoint::InvalidLength { expected, actual } => { + write!(f, "Invalid input length for point (must be in compressed format): Expected {}, actual: {}", expected, actual) + } + InvalidPoint::DecodingError {} => { + write!(f, "Invalid point") + } + } + } +} + +pub fn g1_from_variable(data: &[u8]) -> Result { + if data.len() != 48 { + return Err(InvalidPoint::InvalidLength { + expected: 48, + actual: data.len(), + }); + } + + let mut buf = [0u8; 48]; + buf[..].clone_from_slice(data); + g1_from_fixed(&buf) +} + +pub fn g1s_from_variable(data_list: &[&[u8]]) -> Vec> { + use rayon::prelude::*; + let mut out = Vec::with_capacity(data_list.len()); + data_list + .par_iter() + .map(|&data| g1_from_variable(data)) + .collect_into_vec(&mut out); + out +} + +pub fn g2_from_variable(data: &[u8]) -> Result { + if data.len() != 96 { + return Err(InvalidPoint::InvalidLength { + expected: 96, + actual: data.len(), + }); + } + + let mut buf = [0u8; 96]; + buf[..].clone_from_slice(data); + g2_from_fixed(&buf) +} + +pub fn g1_from_fixed(data: &[u8; 48]) -> Result { + Option::from(G1Affine::from_compressed(data)) + .map(G1) + .ok_or(InvalidPoint::DecodingError {}) +} + +/// Like [`g1_from_fixed`] without guaranteeing that the encoding represents a valid element. +/// Only use this when you know for sure the encoding is correct. +pub fn g1_from_fixed_unchecked(data: [u8; 48]) -> Result { + Option::from(G1Affine::from_compressed_unchecked(&data)) + .map(G1) + .ok_or(InvalidPoint::DecodingError {}) +} + +pub fn g2_from_fixed(data: &[u8; 96]) -> Result { + Option::from(G2Affine::from_compressed(data)) + .map(G2) + .ok_or(InvalidPoint::DecodingError {}) +} + +/// Like [`g2_from_fixed`] without guaranteeing that the encoding represents a valid element. +/// Only use this when you know for sure the encoding is correct. +pub fn g2_from_fixed_unchecked(data: [u8; 96]) -> Result { + Option::from(G2Affine::from_compressed_unchecked(&data)) + .map(G2) + .ok_or(InvalidPoint::DecodingError {}) +} + +#[cfg(test)] +mod tests { + use super::*; + use hex_literal::hex; + + #[test] + fn g1_generator_works() { + let _gen = G1::generator(); + } + + #[test] + fn g2_generator_works() { + let _gen = G2::generator(); + } + + #[test] + fn g1_from_variable_works() { + let result = g1_from_variable(&hex::decode("868f005eb8e6e4ca0a47c8a77ceaa5309a47978a7c71bc5cce96366b5d7a569937c529eeda66c7293784a9402801af31").unwrap()); + assert!(result.is_ok()); + + let result = g1_from_variable(&hex::decode("868f005eb8e6e4ca0a47c8a77ceaa5309a47978a7c71bc5cce96366b5d7a569937c529eeda66c7293784a9402801af").unwrap()); + match result.unwrap_err() { + InvalidPoint::InvalidLength { expected, actual } => { + assert_eq!(expected, 48); + assert_eq!(actual, 47); + } + err => panic!("Unexpected error: {:?}", err), + } + } + + #[test] + fn g2_from_variable_works() { + let result = g2_from_variable(&hex::decode("82f5d3d2de4db19d40a6980e8aa37842a0e55d1df06bd68bddc8d60002e8e959eb9cfa368b3c1b77d18f02a54fe047b80f0989315f83b12a74fd8679c4f12aae86eaf6ab5690b34f1fddd50ee3cc6f6cdf59e95526d5a5d82aaa84fa6f181e42").unwrap()); + assert!(result.is_ok()); + + let result = g2_from_variable(&hex::decode("82f5d3d2de4db19d40a6980e8aa37842a0e55d1df06bd68bddc8d60002e8e959eb9cfa368b3c1b77d18f02a54fe047b80f0989315f83b12a74fd8679c4f12aae86eaf6ab5690b34f1fddd50ee3cc6f6cdf59e95526d5a5d82aaa84fa6f181e").unwrap()); + match result.unwrap_err() { + InvalidPoint::InvalidLength { expected, actual } => { + assert_eq!(expected, 96); + assert_eq!(actual, 95); + } + err => panic!("Unexpected error: {:?}", err), + } + } + + #[test] + fn g1_from_fixed_works() { + let result = g1_from_fixed(&hex_literal::hex!("868f005eb8e6e4ca0a47c8a77ceaa5309a47978a7c71bc5cce96366b5d7a569937c529eeda66c7293784a9402801af31")); + assert!(result.is_ok()); + + let result = g1_from_fixed(&hex_literal::hex!("118f005eb8e6e4ca0a47c8a77ceaa5309a47978a7c71bc5cce96366b5d7a569937c529eeda66c7293784a9402801af31")); + match result.unwrap_err() { + InvalidPoint::DecodingError {} => {} + err => panic!("Unexpected error: {:?}", err), + } + + let result = g1_from_fixed(&hex_literal::hex!("868f005eb8e6e4ca0a47c8a77ceaa5309a47978a7c71bc5cce96366b5d7a569937c529eeda66c7293784a9402801af22")); + match result.unwrap_err() { + InvalidPoint::DecodingError {} => {} + err => panic!("Unexpected error: {:?}", err), + } + } + + #[test] + fn g1_from_fixed_unchecked_works() { + let data = hex!("868f005eb8e6e4ca0a47c8a77ceaa5309a47978a7c71bc5cce96366b5d7a569937c529eeda66c7293784a9402801af31"); + let a = g1_from_fixed_unchecked(data).unwrap(); + let b = g1_from_fixed(&data).unwrap(); + assert_eq!(a, b); + } + + #[test] + fn g2_from_fixed_works() { + let result = g2_from_fixed(&hex_literal::hex!("82f5d3d2de4db19d40a6980e8aa37842a0e55d1df06bd68bddc8d60002e8e959eb9cfa368b3c1b77d18f02a54fe047b80f0989315f83b12a74fd8679c4f12aae86eaf6ab5690b34f1fddd50ee3cc6f6cdf59e95526d5a5d82aaa84fa6f181e42")); + assert!(result.is_ok()); + + let result = g2_from_fixed(&hex_literal::hex!("11f5d3d2de4db19d40a6980e8aa37842a0e55d1df06bd68bddc8d60002e8e959eb9cfa368b3c1b77d18f02a54fe047b80f0989315f83b12a74fd8679c4f12aae86eaf6ab5690b34f1fddd50ee3cc6f6cdf59e95526d5a5d82aaa84fa6f181e42")); + match result.unwrap_err() { + InvalidPoint::DecodingError {} => {} + err => panic!("Unexpected error: {:?}", err), + } + + let result = g2_from_fixed(&hex_literal::hex!("82f5d3d2de4db19d40a6980e8aa37842a0e55d1df06bd68bddc8d60002e8e959eb9cfa368b3c1b77d18f02a54fe047b80f0989315f83b12a74fd8679c4f12aae86eaf6ab5690b34f1fddd50ee3cc6f6cdf59e95526d5a5d82aaa84fa6f181e44")); + match result.unwrap_err() { + InvalidPoint::DecodingError {} => {} + err => panic!("Unexpected error: {:?}", err), + } + } + + #[test] + fn g2_from_fixed_unchecked_works() { + let data = hex!("82f5d3d2de4db19d40a6980e8aa37842a0e55d1df06bd68bddc8d60002e8e959eb9cfa368b3c1b77d18f02a54fe047b80f0989315f83b12a74fd8679c4f12aae86eaf6ab5690b34f1fddd50ee3cc6f6cdf59e95526d5a5d82aaa84fa6f181e42"); + let a = g2_from_fixed_unchecked(data).unwrap(); + let b = g2_from_fixed(&data).unwrap(); + assert_eq!(a, b); + } +} diff --git a/packages/crypto/src/lib.rs b/packages/crypto/src/lib.rs index 04667b7320..3b7f63a872 100644 --- a/packages/crypto/src/lib.rs +++ b/packages/crypto/src/lib.rs @@ -11,6 +11,7 @@ extern crate alloc; extern crate std; // allow for file I/O during tests mod backtrace; +mod bls12_318; mod ecdsa; mod ed25519; mod errors; @@ -18,6 +19,7 @@ mod identity_digest; mod secp256k1; mod secp256r1; +pub use crate::bls12_318::{bls12_318_aggregate_g1, bls12_318_aggregate_g2}; #[doc(hidden)] pub use crate::ecdsa::{ECDSA_PUBKEY_MAX_LEN, ECDSA_SIGNATURE_LEN, MESSAGE_HASH_MAX_LEN}; #[doc(hidden)] diff --git a/packages/crypto/testdata/bls-tests/aggregate/aggregate_0x0000000000000000000000000000000000000000000000000000000000000000.json b/packages/crypto/testdata/bls-tests/aggregate/aggregate_0x0000000000000000000000000000000000000000000000000000000000000000.json new file mode 100644 index 0000000000..0da8111bb5 --- /dev/null +++ b/packages/crypto/testdata/bls-tests/aggregate/aggregate_0x0000000000000000000000000000000000000000000000000000000000000000.json @@ -0,0 +1,8 @@ +{ + "input": [ + "0xb6ed936746e01f8ecf281f020953fbf1f01debd5657c4a383940b020b26507f6076334f91e2366c96e9ab279fb5158090352ea1c5b0c9274504f4f0e7053af24802e51e4568d164fe986834f41e55c8e850ce1f98458c0cfc9ab380b55285a55", + "0xb23c46be3a001c63ca711f87a005c200cc550b9429d5f4eb38d74322144f1b63926da3388979e5321012fb1a0526bcd100b5ef5fe72628ce4cd5e904aeaa3279527843fae5ca9ca675f4f51ed8f83bbf7155da9ecc9663100a885d5dc6df96d9", + "0x948a7cb99f76d616c2c564ce9bf4a519f1bea6b0a624a02276443c245854219fabb8d4ce061d255af5330b078d5380681751aa7053da2c98bae898edc218c75f07e24d8802a17cd1f6833b71e58f5eb5b94208b4d0bb3848cecb075ea21be115" + ], + "output": "0x9683b3e6701f9a4b706709577963110043af78a5b41991b998475a3d3fd62abf35ce03b33908418efc95a058494a8ae504354b9f626231f6b3f3c849dfdeaf5017c4780e2aee1850ceaf4b4d9ce70971a3d2cfcd97b7e5ecf6759f8da5f76d31" +} diff --git a/packages/crypto/testdata/bls-tests/aggregate/aggregate_0x5656565656565656565656565656565656565656565656565656565656565656.json b/packages/crypto/testdata/bls-tests/aggregate/aggregate_0x5656565656565656565656565656565656565656565656565656565656565656.json new file mode 100644 index 0000000000..c4e082946b --- /dev/null +++ b/packages/crypto/testdata/bls-tests/aggregate/aggregate_0x5656565656565656565656565656565656565656565656565656565656565656.json @@ -0,0 +1,8 @@ +{ + "input": [ + "0x882730e5d03f6b42c3abc26d3372625034e1d871b65a8a6b900a56dae22da98abbe1b68f85e49fe7652a55ec3d0591c20767677e33e5cbb1207315c41a9ac03be39c2e7668edc043d6cb1d9fd93033caa8a1c5b0e84bedaeb6c64972503a43eb", + "0xaf1390c3c47acdb37131a51216da683c509fce0e954328a59f93aebda7e4ff974ba208d9a4a2a2389f892a9d418d618418dd7f7a6bc7aa0da999a9d3a5b815bc085e14fd001f6a1948768a3f4afefc8b8240dda329f984cb345c6363272ba4fe", + "0xa4efa926610b8bd1c8330c918b7a5e9bf374e53435ef8b7ec186abf62e1b1f65aeaaeb365677ac1d1172a1f5b44b4e6d022c252c58486c0a759fbdc7de15a756acc4d343064035667a594b4c2a6f0b0b421975977f297dba63ee2f63ffe47bb6" + ], + "output": "0xad38fc73846583b08d110d16ab1d026c6ea77ac2071e8ae832f56ac0cbcdeb9f5678ba5ce42bd8dce334cc47b5abcba40a58f7f1f80ab304193eb98836cc14d8183ec14cc77de0f80c4ffd49e168927a968b5cdaa4cf46b9805be84ad7efa77b" +} diff --git a/packages/crypto/testdata/bls-tests/aggregate/aggregate_0xabababababababababababababababababababababababababababababababab.json b/packages/crypto/testdata/bls-tests/aggregate/aggregate_0xabababababababababababababababababababababababababababababababab.json new file mode 100644 index 0000000000..115215719d --- /dev/null +++ b/packages/crypto/testdata/bls-tests/aggregate/aggregate_0xabababababababababababababababababababababababababababababababab.json @@ -0,0 +1,8 @@ +{ + "input": [ + "0x91347bccf740d859038fcdcaf233eeceb2a436bcaaee9b2aa3bfb70efe29dfb2677562ccbea1c8e061fb9971b0753c240622fab78489ce96768259fc01360346da5b9f579e5da0d941e4c6ba18a0e64906082375394f337fa1af2b7127b0d121", + "0x9674e2228034527f4c083206032b020310face156d4a4685e2fcaec2f6f3665aa635d90347b6ce124eb879266b1e801d185de36a0a289b85e9039662634f2eea1e02e670bc7ab849d006a70b2f93b84597558a05b879c8d445f387a5d5b653df", + "0xae82747ddeefe4fd64cf9cedb9b04ae3e8a43420cd255e3c7cd06a8d88b7c7f8638543719981c5d16fa3527c468c25f0026704a6951bde891360c7e8d12ddee0559004ccdbe6046b55bae1b257ee97f7cdb955773d7cf29adf3ccbb9975e4eb9" + ], + "output": "0x9712c3edd73a209c742b8250759db12549b3eaf43b5ca61376d9f30e2747dbcf842d8b2ac0901d2a093713e20284a7670fcf6954e9ab93de991bb9b313e664785a075fc285806fa5224c82bde146561b446ccfc706a64b8579513cfc4ff1d930" +} diff --git a/packages/crypto/testdata/bls-tests/aggregate/aggregate_infinity_signature.json b/packages/crypto/testdata/bls-tests/aggregate/aggregate_infinity_signature.json new file mode 100644 index 0000000000..b547ebcfcf --- /dev/null +++ b/packages/crypto/testdata/bls-tests/aggregate/aggregate_infinity_signature.json @@ -0,0 +1,6 @@ +{ + "input": [ + "0xc00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000" + ], + "output": "0xc00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000" +} diff --git a/packages/crypto/testdata/bls-tests/aggregate/aggregate_na_signatures.json b/packages/crypto/testdata/bls-tests/aggregate/aggregate_na_signatures.json new file mode 100644 index 0000000000..8f12bef2bb --- /dev/null +++ b/packages/crypto/testdata/bls-tests/aggregate/aggregate_na_signatures.json @@ -0,0 +1 @@ +{ "input": [], "output": null } diff --git a/packages/crypto/testdata/bls-tests/aggregate/aggregate_single_signature.json b/packages/crypto/testdata/bls-tests/aggregate/aggregate_single_signature.json new file mode 100644 index 0000000000..5aa2f05334 --- /dev/null +++ b/packages/crypto/testdata/bls-tests/aggregate/aggregate_single_signature.json @@ -0,0 +1,6 @@ +{ + "input": [ + "0xb6ed936746e01f8ecf281f020953fbf1f01debd5657c4a383940b020b26507f6076334f91e2366c96e9ab279fb5158090352ea1c5b0c9274504f4f0e7053af24802e51e4568d164fe986834f41e55c8e850ce1f98458c0cfc9ab380b55285a55" + ], + "output": "0xb6ed936746e01f8ecf281f020953fbf1f01debd5657c4a383940b020b26507f6076334f91e2366c96e9ab279fb5158090352ea1c5b0c9274504f4f0e7053af24802e51e4568d164fe986834f41e55c8e850ce1f98458c0cfc9ab380b55285a55" +} diff --git a/packages/crypto/testdata/bls-tests/aggregate_verify/aggregate_verify_infinity_pubkey.json b/packages/crypto/testdata/bls-tests/aggregate_verify/aggregate_verify_infinity_pubkey.json new file mode 100644 index 0000000000..032a76da90 --- /dev/null +++ b/packages/crypto/testdata/bls-tests/aggregate_verify/aggregate_verify_infinity_pubkey.json @@ -0,0 +1,18 @@ +{ + "input": { + "pubkeys": [ + "0xa491d1b0ecd9bb917989f0e74f0dea0422eac4a873e5e2644f368dffb9a6e20fd6e10c1b77654d067c0618f6e5a7f79a", + "0xb301803f8b5ac4a1133581fc676dfedc60d891dd5fa99028805e5ea5b08d3491af75d0707adab3b70c6a6a580217bf81", + "0xb53d21a4cfd562c469cc81514d4ce5a6b577d8403d32a394dc265dd190b47fa9f829fdd7963afdf972e5e77854051f6f", + "0xc00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000" + ], + "messages": [ + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x5656565656565656565656565656565656565656565656565656565656565656", + "0xabababababababababababababababababababababababababababababababab", + "0x1212121212121212121212121212121212121212121212121212121212121212" + ], + "signature": "0x9104e74b9dfd3ad502f25d6a5ef57db0ed7d9a0e00f3500586d8ce44231212542fcfaf87840539b398bf07626705cf1105d246ca1062c6c2e1a53029a0f790ed5e3cb1f52f8234dc5144c45fc847c0cd37a92d68e7c5ba7c648a8a339f171244" + }, + "output": false +} diff --git a/packages/crypto/testdata/bls-tests/aggregate_verify/aggregate_verify_na_pubkeys_and_infinity_signature.json b/packages/crypto/testdata/bls-tests/aggregate_verify/aggregate_verify_na_pubkeys_and_infinity_signature.json new file mode 100644 index 0000000000..85315bb99f --- /dev/null +++ b/packages/crypto/testdata/bls-tests/aggregate_verify/aggregate_verify_na_pubkeys_and_infinity_signature.json @@ -0,0 +1,8 @@ +{ + "input": { + "pubkeys": [], + "messages": [], + "signature": "0xc00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000" + }, + "output": false +} diff --git a/packages/crypto/testdata/bls-tests/aggregate_verify/aggregate_verify_na_pubkeys_and_na_signature.json b/packages/crypto/testdata/bls-tests/aggregate_verify/aggregate_verify_na_pubkeys_and_na_signature.json new file mode 100644 index 0000000000..eba62099a5 --- /dev/null +++ b/packages/crypto/testdata/bls-tests/aggregate_verify/aggregate_verify_na_pubkeys_and_na_signature.json @@ -0,0 +1,8 @@ +{ + "input": { + "pubkeys": [], + "messages": [], + "signature": "0x000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000" + }, + "output": false +} diff --git a/packages/crypto/testdata/bls-tests/aggregate_verify/aggregate_verify_tampered_signature.json b/packages/crypto/testdata/bls-tests/aggregate_verify/aggregate_verify_tampered_signature.json new file mode 100644 index 0000000000..6c8cdd587c --- /dev/null +++ b/packages/crypto/testdata/bls-tests/aggregate_verify/aggregate_verify_tampered_signature.json @@ -0,0 +1,16 @@ +{ + "input": { + "pubkeys": [ + "0xa491d1b0ecd9bb917989f0e74f0dea0422eac4a873e5e2644f368dffb9a6e20fd6e10c1b77654d067c0618f6e5a7f79a", + "0xb301803f8b5ac4a1133581fc676dfedc60d891dd5fa99028805e5ea5b08d3491af75d0707adab3b70c6a6a580217bf81", + "0xb53d21a4cfd562c469cc81514d4ce5a6b577d8403d32a394dc265dd190b47fa9f829fdd7963afdf972e5e77854051f6f" + ], + "messages": [ + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x5656565656565656565656565656565656565656565656565656565656565656", + "0xabababababababababababababababababababababababababababababababab" + ], + "signature": "0x9104e74bffffffff" + }, + "output": false +} diff --git a/packages/crypto/testdata/bls-tests/aggregate_verify/aggregate_verify_valid.json b/packages/crypto/testdata/bls-tests/aggregate_verify/aggregate_verify_valid.json new file mode 100644 index 0000000000..5439474964 --- /dev/null +++ b/packages/crypto/testdata/bls-tests/aggregate_verify/aggregate_verify_valid.json @@ -0,0 +1,16 @@ +{ + "input": { + "pubkeys": [ + "0xa491d1b0ecd9bb917989f0e74f0dea0422eac4a873e5e2644f368dffb9a6e20fd6e10c1b77654d067c0618f6e5a7f79a", + "0xb301803f8b5ac4a1133581fc676dfedc60d891dd5fa99028805e5ea5b08d3491af75d0707adab3b70c6a6a580217bf81", + "0xb53d21a4cfd562c469cc81514d4ce5a6b577d8403d32a394dc265dd190b47fa9f829fdd7963afdf972e5e77854051f6f" + ], + "messages": [ + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x5656565656565656565656565656565656565656565656565656565656565656", + "0xabababababababababababababababababababababababababababababababab" + ], + "signature": "0x9104e74b9dfd3ad502f25d6a5ef57db0ed7d9a0e00f3500586d8ce44231212542fcfaf87840539b398bf07626705cf1105d246ca1062c6c2e1a53029a0f790ed5e3cb1f52f8234dc5144c45fc847c0cd37a92d68e7c5ba7c648a8a339f171244" + }, + "output": true +} diff --git a/packages/crypto/testdata/bls-tests/batch_verify/batch_verify_invalid_forged_signature_set.json b/packages/crypto/testdata/bls-tests/batch_verify/batch_verify_invalid_forged_signature_set.json new file mode 100644 index 0000000000..b4fc984f7e --- /dev/null +++ b/packages/crypto/testdata/bls-tests/batch_verify/batch_verify_invalid_forged_signature_set.json @@ -0,0 +1,17 @@ +{ + "input": { + "pubkeys": [ + "0xa491d1b0ecd9bb917989f0e74f0dea0422eac4a873e5e2644f368dffb9a6e20fd6e10c1b77654d067c0618f6e5a7f79a", + "0xb301803f8b5ac4a1133581fc676dfedc60d891dd5fa99028805e5ea5b08d3491af75d0707adab3b70c6a6a580217bf81" + ], + "messages": [ + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x5656565656565656565656565656565656565656565656565656565656565656" + ], + "signatures": [ + "0xa70f1f1b4bd97d182ebb55d08be3f90b1dc232bb50b44e259381a642ef0bad3629ad3542f3e8ff6a84e451fc0b595e090fc4f0e860cfc5584715ef1b6cd717b9994378f7a51b815bbf5a0d95bc3402583ad2e95a229731e539906249a5e4355c", + "0xb758eb7e15c101f53be2214d2a6b65e8fe7053146dbe3c73c9fe9b5efecdf63ca06a4d5d938dbf18fe6600529c0011a7013f45ae012b02904d5c7c33316e935a0e084abead4f43f84383c52cd3b3f14024437e251a2a7c0d5147954022873a58" + ] + }, + "output": false +} diff --git a/packages/crypto/testdata/bls-tests/batch_verify/batch_verify_invalid_infinity_signature_set.json b/packages/crypto/testdata/bls-tests/batch_verify/batch_verify_invalid_infinity_signature_set.json new file mode 100644 index 0000000000..81afb7ddfb --- /dev/null +++ b/packages/crypto/testdata/bls-tests/batch_verify/batch_verify_invalid_infinity_signature_set.json @@ -0,0 +1,17 @@ +{ + "input": { + "pubkeys": [ + "0xa491d1b0ecd9bb917989f0e74f0dea0422eac4a873e5e2644f368dffb9a6e20fd6e10c1b77654d067c0618f6e5a7f79a", + "0xc00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000" + ], + "messages": [ + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x5656565656565656565656565656565656565656565656565656565656565656" + ], + "signatures": [ + "0xb6ed936746e01f8ecf281f020953fbf1f01debd5657c4a383940b020b26507f6076334f91e2366c96e9ab279fb5158090352ea1c5b0c9274504f4f0e7053af24802e51e4568d164fe986834f41e55c8e850ce1f98458c0cfc9ab380b55285a55", + "0xc00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000" + ] + }, + "output": false +} diff --git a/packages/crypto/testdata/bls-tests/batch_verify/batch_verify_valid_multiple_signature_set.json b/packages/crypto/testdata/bls-tests/batch_verify/batch_verify_valid_multiple_signature_set.json new file mode 100644 index 0000000000..6fd7766d8e --- /dev/null +++ b/packages/crypto/testdata/bls-tests/batch_verify/batch_verify_valid_multiple_signature_set.json @@ -0,0 +1,17 @@ +{ + "input": { + "pubkeys": [ + "0xa491d1b0ecd9bb917989f0e74f0dea0422eac4a873e5e2644f368dffb9a6e20fd6e10c1b77654d067c0618f6e5a7f79a", + "0xb301803f8b5ac4a1133581fc676dfedc60d891dd5fa99028805e5ea5b08d3491af75d0707adab3b70c6a6a580217bf81" + ], + "messages": [ + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x5656565656565656565656565656565656565656565656565656565656565656" + ], + "signatures": [ + "0xb6ed936746e01f8ecf281f020953fbf1f01debd5657c4a383940b020b26507f6076334f91e2366c96e9ab279fb5158090352ea1c5b0c9274504f4f0e7053af24802e51e4568d164fe986834f41e55c8e850ce1f98458c0cfc9ab380b55285a55", + "0xaf1390c3c47acdb37131a51216da683c509fce0e954328a59f93aebda7e4ff974ba208d9a4a2a2389f892a9d418d618418dd7f7a6bc7aa0da999a9d3a5b815bc085e14fd001f6a1948768a3f4afefc8b8240dda329f984cb345c6363272ba4fe" + ] + }, + "output": true +} diff --git a/packages/crypto/testdata/bls-tests/batch_verify/batch_verify_valid_simple_signature_set.json b/packages/crypto/testdata/bls-tests/batch_verify/batch_verify_valid_simple_signature_set.json new file mode 100644 index 0000000000..71856ee767 --- /dev/null +++ b/packages/crypto/testdata/bls-tests/batch_verify/batch_verify_valid_simple_signature_set.json @@ -0,0 +1,20 @@ +{ + "input": { + "pubkeys": [ + "0xa491d1b0ecd9bb917989f0e74f0dea0422eac4a873e5e2644f368dffb9a6e20fd6e10c1b77654d067c0618f6e5a7f79a", + "0xb301803f8b5ac4a1133581fc676dfedc60d891dd5fa99028805e5ea5b08d3491af75d0707adab3b70c6a6a580217bf81", + "0xb53d21a4cfd562c469cc81514d4ce5a6b577d8403d32a394dc265dd190b47fa9f829fdd7963afdf972e5e77854051f6f" + ], + "messages": [ + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x5656565656565656565656565656565656565656565656565656565656565656", + "0xabababababababababababababababababababababababababababababababab" + ], + "signatures": [ + "0xb6ed936746e01f8ecf281f020953fbf1f01debd5657c4a383940b020b26507f6076334f91e2366c96e9ab279fb5158090352ea1c5b0c9274504f4f0e7053af24802e51e4568d164fe986834f41e55c8e850ce1f98458c0cfc9ab380b55285a55", + "0xaf1390c3c47acdb37131a51216da683c509fce0e954328a59f93aebda7e4ff974ba208d9a4a2a2389f892a9d418d618418dd7f7a6bc7aa0da999a9d3a5b815bc085e14fd001f6a1948768a3f4afefc8b8240dda329f984cb345c6363272ba4fe", + "0xae82747ddeefe4fd64cf9cedb9b04ae3e8a43420cd255e3c7cd06a8d88b7c7f8638543719981c5d16fa3527c468c25f0026704a6951bde891360c7e8d12ddee0559004ccdbe6046b55bae1b257ee97f7cdb955773d7cf29adf3ccbb9975e4eb9" + ] + }, + "output": true +} diff --git a/packages/crypto/testdata/bls-tests/deserialization_G1/deserialization_fails_infinity_with_false_b_flag.json b/packages/crypto/testdata/bls-tests/deserialization_G1/deserialization_fails_infinity_with_false_b_flag.json new file mode 100644 index 0000000000..506c207740 --- /dev/null +++ b/packages/crypto/testdata/bls-tests/deserialization_G1/deserialization_fails_infinity_with_false_b_flag.json @@ -0,0 +1,6 @@ +{ + "input": { + "pubkey": "800000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000" + }, + "output": false +} diff --git a/packages/crypto/testdata/bls-tests/deserialization_G1/deserialization_fails_infinity_with_true_b_flag.json b/packages/crypto/testdata/bls-tests/deserialization_G1/deserialization_fails_infinity_with_true_b_flag.json new file mode 100644 index 0000000000..0e2290859b --- /dev/null +++ b/packages/crypto/testdata/bls-tests/deserialization_G1/deserialization_fails_infinity_with_true_b_flag.json @@ -0,0 +1,6 @@ +{ + "input": { + "pubkey": "c01000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000" + }, + "output": false +} diff --git a/packages/crypto/testdata/bls-tests/deserialization_G1/deserialization_fails_not_in_G1.json b/packages/crypto/testdata/bls-tests/deserialization_G1/deserialization_fails_not_in_G1.json new file mode 100644 index 0000000000..76f51aae8f --- /dev/null +++ b/packages/crypto/testdata/bls-tests/deserialization_G1/deserialization_fails_not_in_G1.json @@ -0,0 +1,6 @@ +{ + "input": { + "pubkey": "8123456789abcdef0123456789abcdef0123456789abcdef0123456789abcdef0123456789abcdef0123456789abcdef" + }, + "output": false +} diff --git a/packages/crypto/testdata/bls-tests/deserialization_G1/deserialization_fails_not_in_curve.json b/packages/crypto/testdata/bls-tests/deserialization_G1/deserialization_fails_not_in_curve.json new file mode 100644 index 0000000000..956124eb66 --- /dev/null +++ b/packages/crypto/testdata/bls-tests/deserialization_G1/deserialization_fails_not_in_curve.json @@ -0,0 +1,6 @@ +{ + "input": { + "pubkey": "8123456789abcdef0123456789abcdef0123456789abcdef0123456789abcdef0123456789abcdef0123456789abcde0" + }, + "output": false +} diff --git a/packages/crypto/testdata/bls-tests/deserialization_G1/deserialization_fails_too_few_bytes.json b/packages/crypto/testdata/bls-tests/deserialization_G1/deserialization_fails_too_few_bytes.json new file mode 100644 index 0000000000..12a65563f1 --- /dev/null +++ b/packages/crypto/testdata/bls-tests/deserialization_G1/deserialization_fails_too_few_bytes.json @@ -0,0 +1,6 @@ +{ + "input": { + "pubkey": "9a0111ea397fe69a4b1ba7b6434bacd764774b84f38512bf6730d2a0f6b0f6241eabfffeb153ffffb9feffffffffaa" + }, + "output": false +} diff --git a/packages/crypto/testdata/bls-tests/deserialization_G1/deserialization_fails_too_many_bytes.json b/packages/crypto/testdata/bls-tests/deserialization_G1/deserialization_fails_too_many_bytes.json new file mode 100644 index 0000000000..190a890549 --- /dev/null +++ b/packages/crypto/testdata/bls-tests/deserialization_G1/deserialization_fails_too_many_bytes.json @@ -0,0 +1,6 @@ +{ + "input": { + "pubkey": "9a0111ea397fe69a4b1ba7b6434bacd764774b84f38512bf6730d2a0f6b0f6241eabfffeb153ffffb9feffffffffaaa900" + }, + "output": false +} diff --git a/packages/crypto/testdata/bls-tests/deserialization_G1/deserialization_fails_with_b_flag_and_a_flag_true.json b/packages/crypto/testdata/bls-tests/deserialization_G1/deserialization_fails_with_b_flag_and_a_flag_true.json new file mode 100644 index 0000000000..6553aba4b2 --- /dev/null +++ b/packages/crypto/testdata/bls-tests/deserialization_G1/deserialization_fails_with_b_flag_and_a_flag_true.json @@ -0,0 +1,6 @@ +{ + "input": { + "pubkey": "e00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000" + }, + "output": false +} diff --git a/packages/crypto/testdata/bls-tests/deserialization_G1/deserialization_fails_with_b_flag_and_x_nonzero.json b/packages/crypto/testdata/bls-tests/deserialization_G1/deserialization_fails_with_b_flag_and_x_nonzero.json new file mode 100644 index 0000000000..baa64d596c --- /dev/null +++ b/packages/crypto/testdata/bls-tests/deserialization_G1/deserialization_fails_with_b_flag_and_x_nonzero.json @@ -0,0 +1,6 @@ +{ + "input": { + "pubkey": "c123456789abcdef0123456789abcdef0123456789abcdef0123456789abcdef0123456789abcdef0123456789abcdef" + }, + "output": false +} diff --git a/packages/crypto/testdata/bls-tests/deserialization_G1/deserialization_fails_with_wrong_c_flag.json b/packages/crypto/testdata/bls-tests/deserialization_G1/deserialization_fails_with_wrong_c_flag.json new file mode 100644 index 0000000000..0e15859ff7 --- /dev/null +++ b/packages/crypto/testdata/bls-tests/deserialization_G1/deserialization_fails_with_wrong_c_flag.json @@ -0,0 +1,6 @@ +{ + "input": { + "pubkey": "0123456789abcdef0123456789abcdef0123456789abcdef0123456789abcdef0123456789abcdef0123456789abcdef" + }, + "output": false +} diff --git a/packages/crypto/testdata/bls-tests/deserialization_G1/deserialization_fails_x_equal_to_modulus.json b/packages/crypto/testdata/bls-tests/deserialization_G1/deserialization_fails_x_equal_to_modulus.json new file mode 100644 index 0000000000..f3e1640dbd --- /dev/null +++ b/packages/crypto/testdata/bls-tests/deserialization_G1/deserialization_fails_x_equal_to_modulus.json @@ -0,0 +1,6 @@ +{ + "input": { + "pubkey": "9a0111ea397fe69a4b1ba7b6434bacd764774b84f38512bf6730d2a0f6b0f6241eabfffeb153ffffb9feffffffffaaab" + }, + "output": false +} diff --git a/packages/crypto/testdata/bls-tests/deserialization_G1/deserialization_fails_x_greater_than_modulus.json b/packages/crypto/testdata/bls-tests/deserialization_G1/deserialization_fails_x_greater_than_modulus.json new file mode 100644 index 0000000000..67981234eb --- /dev/null +++ b/packages/crypto/testdata/bls-tests/deserialization_G1/deserialization_fails_x_greater_than_modulus.json @@ -0,0 +1,6 @@ +{ + "input": { + "pubkey": "9a0111ea397fe69a4b1ba7b6434bacd764774b84f38512bf6730d2a0f6b0f6241eabfffeb153ffffb9feffffffffaaac" + }, + "output": false +} diff --git a/packages/crypto/testdata/bls-tests/deserialization_G1/deserialization_succeeds_correct_point.json b/packages/crypto/testdata/bls-tests/deserialization_G1/deserialization_succeeds_correct_point.json new file mode 100644 index 0000000000..45cda6b339 --- /dev/null +++ b/packages/crypto/testdata/bls-tests/deserialization_G1/deserialization_succeeds_correct_point.json @@ -0,0 +1,6 @@ +{ + "input": { + "pubkey": "a491d1b0ecd9bb917989f0e74f0dea0422eac4a873e5e2644f368dffb9a6e20fd6e10c1b77654d067c0618f6e5a7f79a" + }, + "output": true +} diff --git a/packages/crypto/testdata/bls-tests/deserialization_G1/deserialization_succeeds_infinity_with_true_b_flag.json b/packages/crypto/testdata/bls-tests/deserialization_G1/deserialization_succeeds_infinity_with_true_b_flag.json new file mode 100644 index 0000000000..ddb1fdb2f8 --- /dev/null +++ b/packages/crypto/testdata/bls-tests/deserialization_G1/deserialization_succeeds_infinity_with_true_b_flag.json @@ -0,0 +1,6 @@ +{ + "input": { + "pubkey": "c00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000" + }, + "output": true +} diff --git a/packages/crypto/testdata/bls-tests/deserialization_G2/deserialization_fails_infinity_with_false_b_flag.json b/packages/crypto/testdata/bls-tests/deserialization_G2/deserialization_fails_infinity_with_false_b_flag.json new file mode 100644 index 0000000000..e50f48ad5c --- /dev/null +++ b/packages/crypto/testdata/bls-tests/deserialization_G2/deserialization_fails_infinity_with_false_b_flag.json @@ -0,0 +1,6 @@ +{ + "input": { + "signature": "800000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000" + }, + "output": false +} diff --git a/packages/crypto/testdata/bls-tests/deserialization_G2/deserialization_fails_infinity_with_true_b_flag.json b/packages/crypto/testdata/bls-tests/deserialization_G2/deserialization_fails_infinity_with_true_b_flag.json new file mode 100644 index 0000000000..bb32b7cdd9 --- /dev/null +++ b/packages/crypto/testdata/bls-tests/deserialization_G2/deserialization_fails_infinity_with_true_b_flag.json @@ -0,0 +1,6 @@ +{ + "input": { + "signature": "c01000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000" + }, + "output": false +} diff --git a/packages/crypto/testdata/bls-tests/deserialization_G2/deserialization_fails_not_in_G2.json b/packages/crypto/testdata/bls-tests/deserialization_G2/deserialization_fails_not_in_G2.json new file mode 100644 index 0000000000..0e5fb4094e --- /dev/null +++ b/packages/crypto/testdata/bls-tests/deserialization_G2/deserialization_fails_not_in_G2.json @@ -0,0 +1,6 @@ +{ + "input": { + "signature": "8123456789abcdef0123456789abcdef0123456789abcdef0123456789abcdef0123456789abcdef0123456789abcdef0123456789abcdef0123456789abcdef0123456789abcdef0123456789abcdef0123456789abcdef0123456789abcdef" + }, + "output": false +} diff --git a/packages/crypto/testdata/bls-tests/deserialization_G2/deserialization_fails_not_in_curve.json b/packages/crypto/testdata/bls-tests/deserialization_G2/deserialization_fails_not_in_curve.json new file mode 100644 index 0000000000..e645a87a43 --- /dev/null +++ b/packages/crypto/testdata/bls-tests/deserialization_G2/deserialization_fails_not_in_curve.json @@ -0,0 +1,6 @@ +{ + "input": { + "signature": "8123456789abcdef0123456789abcdef0123456789abcdef0123456789abcdef0123456789abcdef0123456789abcdef0123456789abcdef0123456789abcdef0123456789abcdef0123456789abcdef0123456789abcdef0123456789abcde0" + }, + "output": false +} diff --git a/packages/crypto/testdata/bls-tests/deserialization_G2/deserialization_fails_too_few_bytes.json b/packages/crypto/testdata/bls-tests/deserialization_G2/deserialization_fails_too_few_bytes.json new file mode 100644 index 0000000000..46a78bec87 --- /dev/null +++ b/packages/crypto/testdata/bls-tests/deserialization_G2/deserialization_fails_too_few_bytes.json @@ -0,0 +1,6 @@ +{ + "input": { + "signature": "8123456789abcdef0123456789abcdef0123456789abcdef0123456789abcdef0123456789abcdef0123456789abcdef0123456789abcdef0123456789abcdef0123456789abcdef0123456789abcdef0123456789abcdef0123456789abcd" + }, + "output": false +} diff --git a/packages/crypto/testdata/bls-tests/deserialization_G2/deserialization_fails_too_many_bytes.json b/packages/crypto/testdata/bls-tests/deserialization_G2/deserialization_fails_too_many_bytes.json new file mode 100644 index 0000000000..8763465a6a --- /dev/null +++ b/packages/crypto/testdata/bls-tests/deserialization_G2/deserialization_fails_too_many_bytes.json @@ -0,0 +1,6 @@ +{ + "input": { + "signature": "8123456789abcdef0123456789abcdef0123456789abcdef0123456789abcdef0123456789abcdef0123456789abcdef0123456789abcdef0123456789abcdef0123456789abcdef0123456789abcdef0123456789abcdef0123456789abcdefff" + }, + "output": false +} diff --git a/packages/crypto/testdata/bls-tests/deserialization_G2/deserialization_fails_with_b_flag_and_a_flag_true.json b/packages/crypto/testdata/bls-tests/deserialization_G2/deserialization_fails_with_b_flag_and_a_flag_true.json new file mode 100644 index 0000000000..b96535439b --- /dev/null +++ b/packages/crypto/testdata/bls-tests/deserialization_G2/deserialization_fails_with_b_flag_and_a_flag_true.json @@ -0,0 +1,6 @@ +{ + "input": { + "signature": "e00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000" + }, + "output": false +} diff --git a/packages/crypto/testdata/bls-tests/deserialization_G2/deserialization_fails_with_b_flag_and_x_nonzero.json b/packages/crypto/testdata/bls-tests/deserialization_G2/deserialization_fails_with_b_flag_and_x_nonzero.json new file mode 100644 index 0000000000..de700882b3 --- /dev/null +++ b/packages/crypto/testdata/bls-tests/deserialization_G2/deserialization_fails_with_b_flag_and_x_nonzero.json @@ -0,0 +1,6 @@ +{ + "input": { + "signature": "c123456789abcdef0123456789abcdef0123456789abcdef0123456789abcdef0123456789abcdef0123456789abcdef0123456789abcdef0123456789abcdef0123456789abcdef0123456789abcdef0123456789abcdef0123456789abcdef" + }, + "output": false +} diff --git a/packages/crypto/testdata/bls-tests/deserialization_G2/deserialization_fails_with_wrong_c_flag.json b/packages/crypto/testdata/bls-tests/deserialization_G2/deserialization_fails_with_wrong_c_flag.json new file mode 100644 index 0000000000..da4859d39f --- /dev/null +++ b/packages/crypto/testdata/bls-tests/deserialization_G2/deserialization_fails_with_wrong_c_flag.json @@ -0,0 +1,6 @@ +{ + "input": { + "signature": "0123456789abcdef0123456789abcdef0123456789abcdef0123456789abcdef0123456789abcdef0123456789abcdef0123456789abcdef0123456789abcdef0123456789abcdef0123456789abcdef0123456789abcdef0123456789abcdef" + }, + "output": false +} diff --git a/packages/crypto/testdata/bls-tests/deserialization_G2/deserialization_fails_xim_equal_to_modulus.json b/packages/crypto/testdata/bls-tests/deserialization_G2/deserialization_fails_xim_equal_to_modulus.json new file mode 100644 index 0000000000..be05d530f6 --- /dev/null +++ b/packages/crypto/testdata/bls-tests/deserialization_G2/deserialization_fails_xim_equal_to_modulus.json @@ -0,0 +1,6 @@ +{ + "input": { + "signature": "9a0111ea397fe69a4b1ba7b6434bacd764774b84f38512bf6730d2a0f6b0f6241eabfffeb153ffffb9feffffffffaaab000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000" + }, + "output": false +} diff --git a/packages/crypto/testdata/bls-tests/deserialization_G2/deserialization_fails_xim_greater_than_modulus.json b/packages/crypto/testdata/bls-tests/deserialization_G2/deserialization_fails_xim_greater_than_modulus.json new file mode 100644 index 0000000000..875c9631ec --- /dev/null +++ b/packages/crypto/testdata/bls-tests/deserialization_G2/deserialization_fails_xim_greater_than_modulus.json @@ -0,0 +1,6 @@ +{ + "input": { + "signature": "9a0111ea397fe69a4b1ba7b6434bacd764774b84f38512bf6730d2a0f6b0f6241eabfffeb153ffffb9feffffffffaaac000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000" + }, + "output": false +} diff --git a/packages/crypto/testdata/bls-tests/deserialization_G2/deserialization_fails_xre_equal_to_modulus.json b/packages/crypto/testdata/bls-tests/deserialization_G2/deserialization_fails_xre_equal_to_modulus.json new file mode 100644 index 0000000000..9fb0046aac --- /dev/null +++ b/packages/crypto/testdata/bls-tests/deserialization_G2/deserialization_fails_xre_equal_to_modulus.json @@ -0,0 +1,6 @@ +{ + "input": { + "signature": "8000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000001a0111ea397fe69a4b1ba7b6434bacd764774b84f38512bf6730d2a0f6b0f6241eabfffeb153ffffb9feffffffffaaab" + }, + "output": false +} diff --git a/packages/crypto/testdata/bls-tests/deserialization_G2/deserialization_fails_xre_greater_than_modulus.json b/packages/crypto/testdata/bls-tests/deserialization_G2/deserialization_fails_xre_greater_than_modulus.json new file mode 100644 index 0000000000..0ee3ad4743 --- /dev/null +++ b/packages/crypto/testdata/bls-tests/deserialization_G2/deserialization_fails_xre_greater_than_modulus.json @@ -0,0 +1,6 @@ +{ + "input": { + "signature": "8000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000001a0111ea397fe69a4b1ba7b6434bacd764774b84f38512bf6730d2a0f6b0f6241eabfffeb153ffffb9feffffffffaaac" + }, + "output": false +} diff --git a/packages/crypto/testdata/bls-tests/deserialization_G2/deserialization_succeeds_correct_point.json b/packages/crypto/testdata/bls-tests/deserialization_G2/deserialization_succeeds_correct_point.json new file mode 100644 index 0000000000..94df5ec77d --- /dev/null +++ b/packages/crypto/testdata/bls-tests/deserialization_G2/deserialization_succeeds_correct_point.json @@ -0,0 +1,6 @@ +{ + "input": { + "signature": "b2cc74bc9f089ed9764bbceac5edba416bef5e73701288977b9cac1ccb6964269d4ebf78b4e8aa7792ba09d3e49c8e6a1351bdf582971f796bbaf6320e81251c9d28f674d720cca07ed14596b96697cf18238e0e03ebd7fc1353d885a39407e0" + }, + "output": true +} diff --git a/packages/crypto/testdata/bls-tests/deserialization_G2/deserialization_succeeds_infinity_with_true_b_flag.json b/packages/crypto/testdata/bls-tests/deserialization_G2/deserialization_succeeds_infinity_with_true_b_flag.json new file mode 100644 index 0000000000..4448a0b216 --- /dev/null +++ b/packages/crypto/testdata/bls-tests/deserialization_G2/deserialization_succeeds_infinity_with_true_b_flag.json @@ -0,0 +1,6 @@ +{ + "input": { + "signature": "c00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000" + }, + "output": true +} diff --git a/packages/crypto/testdata/bls-tests/fast_aggregate_verify/fast_aggregate_verify_extra_pubkey_4f079f946446fabf.json b/packages/crypto/testdata/bls-tests/fast_aggregate_verify/fast_aggregate_verify_extra_pubkey_4f079f946446fabf.json new file mode 100644 index 0000000000..828d1d6288 --- /dev/null +++ b/packages/crypto/testdata/bls-tests/fast_aggregate_verify/fast_aggregate_verify_extra_pubkey_4f079f946446fabf.json @@ -0,0 +1,12 @@ +{ + "input": { + "pubkeys": [ + "0xa491d1b0ecd9bb917989f0e74f0dea0422eac4a873e5e2644f368dffb9a6e20fd6e10c1b77654d067c0618f6e5a7f79a", + "0xb301803f8b5ac4a1133581fc676dfedc60d891dd5fa99028805e5ea5b08d3491af75d0707adab3b70c6a6a580217bf81", + "0xb53d21a4cfd562c469cc81514d4ce5a6b577d8403d32a394dc265dd190b47fa9f829fdd7963afdf972e5e77854051f6f" + ], + "message": "0x5656565656565656565656565656565656565656565656565656565656565656", + "signature": "0x912c3615f69575407db9392eb21fee18fff797eeb2fbe1816366ca2a08ae574d8824dbfafb4c9eaa1cf61b63c6f9b69911f269b664c42947dd1b53ef1081926c1e82bb2a465f927124b08391a5249036146d6f3f1e17ff5f162f779746d830d1" + }, + "output": false +} diff --git a/packages/crypto/testdata/bls-tests/fast_aggregate_verify/fast_aggregate_verify_extra_pubkey_5a38e6b4017fe4dd.json b/packages/crypto/testdata/bls-tests/fast_aggregate_verify/fast_aggregate_verify_extra_pubkey_5a38e6b4017fe4dd.json new file mode 100644 index 0000000000..ae601d41cf --- /dev/null +++ b/packages/crypto/testdata/bls-tests/fast_aggregate_verify/fast_aggregate_verify_extra_pubkey_5a38e6b4017fe4dd.json @@ -0,0 +1,13 @@ +{ + "input": { + "pubkeys": [ + "0xa491d1b0ecd9bb917989f0e74f0dea0422eac4a873e5e2644f368dffb9a6e20fd6e10c1b77654d067c0618f6e5a7f79a", + "0xb301803f8b5ac4a1133581fc676dfedc60d891dd5fa99028805e5ea5b08d3491af75d0707adab3b70c6a6a580217bf81", + "0xb53d21a4cfd562c469cc81514d4ce5a6b577d8403d32a394dc265dd190b47fa9f829fdd7963afdf972e5e77854051f6f", + "0xb53d21a4cfd562c469cc81514d4ce5a6b577d8403d32a394dc265dd190b47fa9f829fdd7963afdf972e5e77854051f6f" + ], + "message": "0xabababababababababababababababababababababababababababababababab", + "signature": "0x9712c3edd73a209c742b8250759db12549b3eaf43b5ca61376d9f30e2747dbcf842d8b2ac0901d2a093713e20284a7670fcf6954e9ab93de991bb9b313e664785a075fc285806fa5224c82bde146561b446ccfc706a64b8579513cfc4ff1d930" + }, + "output": false +} diff --git a/packages/crypto/testdata/bls-tests/fast_aggregate_verify/fast_aggregate_verify_extra_pubkey_a698ea45b109f303.json b/packages/crypto/testdata/bls-tests/fast_aggregate_verify/fast_aggregate_verify_extra_pubkey_a698ea45b109f303.json new file mode 100644 index 0000000000..263fde852b --- /dev/null +++ b/packages/crypto/testdata/bls-tests/fast_aggregate_verify/fast_aggregate_verify_extra_pubkey_a698ea45b109f303.json @@ -0,0 +1,11 @@ +{ + "input": { + "pubkeys": [ + "0xa491d1b0ecd9bb917989f0e74f0dea0422eac4a873e5e2644f368dffb9a6e20fd6e10c1b77654d067c0618f6e5a7f79a", + "0xb53d21a4cfd562c469cc81514d4ce5a6b577d8403d32a394dc265dd190b47fa9f829fdd7963afdf972e5e77854051f6f" + ], + "message": "0x0000000000000000000000000000000000000000000000000000000000000000", + "signature": "0xb6ed936746e01f8ecf281f020953fbf1f01debd5657c4a383940b020b26507f6076334f91e2366c96e9ab279fb5158090352ea1c5b0c9274504f4f0e7053af24802e51e4568d164fe986834f41e55c8e850ce1f98458c0cfc9ab380b55285a55" + }, + "output": false +} diff --git a/packages/crypto/testdata/bls-tests/fast_aggregate_verify/fast_aggregate_verify_infinity_pubkey.json b/packages/crypto/testdata/bls-tests/fast_aggregate_verify/fast_aggregate_verify_infinity_pubkey.json new file mode 100644 index 0000000000..e07310d7f2 --- /dev/null +++ b/packages/crypto/testdata/bls-tests/fast_aggregate_verify/fast_aggregate_verify_infinity_pubkey.json @@ -0,0 +1,13 @@ +{ + "input": { + "pubkeys": [ + "0xa491d1b0ecd9bb917989f0e74f0dea0422eac4a873e5e2644f368dffb9a6e20fd6e10c1b77654d067c0618f6e5a7f79a", + "0xb301803f8b5ac4a1133581fc676dfedc60d891dd5fa99028805e5ea5b08d3491af75d0707adab3b70c6a6a580217bf81", + "0xb53d21a4cfd562c469cc81514d4ce5a6b577d8403d32a394dc265dd190b47fa9f829fdd7963afdf972e5e77854051f6f", + "0xc00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000" + ], + "message": "0x1212121212121212121212121212121212121212121212121212121212121212", + "signature": "0xafcb4d980f079265caa61aee3e26bf48bebc5dc3e7f2d7346834d76cbc812f636c937b6b44a9323d8bc4b1cdf71d6811035ddc2634017faab2845308f568f2b9a0356140727356eae9eded8b87fd8cb8024b440c57aee06076128bb32921f584" + }, + "output": false +} diff --git a/packages/crypto/testdata/bls-tests/fast_aggregate_verify/fast_aggregate_verify_na_pubkeys_and_infinity_signature.json b/packages/crypto/testdata/bls-tests/fast_aggregate_verify/fast_aggregate_verify_na_pubkeys_and_infinity_signature.json new file mode 100644 index 0000000000..f44a27a974 --- /dev/null +++ b/packages/crypto/testdata/bls-tests/fast_aggregate_verify/fast_aggregate_verify_na_pubkeys_and_infinity_signature.json @@ -0,0 +1,8 @@ +{ + "input": { + "pubkeys": [], + "message": "0xabababababababababababababababababababababababababababababababab", + "signature": "0xc00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000" + }, + "output": false +} diff --git a/packages/crypto/testdata/bls-tests/fast_aggregate_verify/fast_aggregate_verify_na_pubkeys_and_na_signature.json b/packages/crypto/testdata/bls-tests/fast_aggregate_verify/fast_aggregate_verify_na_pubkeys_and_na_signature.json new file mode 100644 index 0000000000..4a2b63fdf2 --- /dev/null +++ b/packages/crypto/testdata/bls-tests/fast_aggregate_verify/fast_aggregate_verify_na_pubkeys_and_na_signature.json @@ -0,0 +1,8 @@ +{ + "input": { + "pubkeys": [], + "message": "0xabababababababababababababababababababababababababababababababab", + "signature": "0x000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000" + }, + "output": false +} diff --git a/packages/crypto/testdata/bls-tests/fast_aggregate_verify/fast_aggregate_verify_tampered_signature_3d7576f3c0e3570a.json b/packages/crypto/testdata/bls-tests/fast_aggregate_verify/fast_aggregate_verify_tampered_signature_3d7576f3c0e3570a.json new file mode 100644 index 0000000000..67d20772bd --- /dev/null +++ b/packages/crypto/testdata/bls-tests/fast_aggregate_verify/fast_aggregate_verify_tampered_signature_3d7576f3c0e3570a.json @@ -0,0 +1,12 @@ +{ + "input": { + "pubkeys": [ + "0xa491d1b0ecd9bb917989f0e74f0dea0422eac4a873e5e2644f368dffb9a6e20fd6e10c1b77654d067c0618f6e5a7f79a", + "0xb301803f8b5ac4a1133581fc676dfedc60d891dd5fa99028805e5ea5b08d3491af75d0707adab3b70c6a6a580217bf81", + "0xb53d21a4cfd562c469cc81514d4ce5a6b577d8403d32a394dc265dd190b47fa9f829fdd7963afdf972e5e77854051f6f" + ], + "message": "0xabababababababababababababababababababababababababababababababab", + "signature": "0x9712c3edd73a209c742b8250759db12549b3eaf43b5ca61376d9f30e2747dbcf842d8b2ac0901d2a093713e20284a7670fcf6954e9ab93de991bb9b313e664785a075fc285806fa5224c82bde146561b446ccfc706a64b8579513cfcffffffff" + }, + "output": false +} diff --git a/packages/crypto/testdata/bls-tests/fast_aggregate_verify/fast_aggregate_verify_tampered_signature_5e745ad0c6199a6c.json b/packages/crypto/testdata/bls-tests/fast_aggregate_verify/fast_aggregate_verify_tampered_signature_5e745ad0c6199a6c.json new file mode 100644 index 0000000000..e9d43c306f --- /dev/null +++ b/packages/crypto/testdata/bls-tests/fast_aggregate_verify/fast_aggregate_verify_tampered_signature_5e745ad0c6199a6c.json @@ -0,0 +1,10 @@ +{ + "input": { + "pubkeys": [ + "0xa491d1b0ecd9bb917989f0e74f0dea0422eac4a873e5e2644f368dffb9a6e20fd6e10c1b77654d067c0618f6e5a7f79a" + ], + "message": "0x0000000000000000000000000000000000000000000000000000000000000000", + "signature": "0xb6ed936746e01f8ecf281f020953fbf1f01debd5657c4a383940b020b26507f6076334f91e2366c96e9ab279fb5158090352ea1c5b0c9274504f4f0e7053af24802e51e4568d164fe986834f41e55c8e850ce1f98458c0cfc9ab380bffffffff" + }, + "output": false +} diff --git a/packages/crypto/testdata/bls-tests/fast_aggregate_verify/fast_aggregate_verify_tampered_signature_652ce62f09290811.json b/packages/crypto/testdata/bls-tests/fast_aggregate_verify/fast_aggregate_verify_tampered_signature_652ce62f09290811.json new file mode 100644 index 0000000000..6a8b5396ae --- /dev/null +++ b/packages/crypto/testdata/bls-tests/fast_aggregate_verify/fast_aggregate_verify_tampered_signature_652ce62f09290811.json @@ -0,0 +1,11 @@ +{ + "input": { + "pubkeys": [ + "0xa491d1b0ecd9bb917989f0e74f0dea0422eac4a873e5e2644f368dffb9a6e20fd6e10c1b77654d067c0618f6e5a7f79a", + "0xb301803f8b5ac4a1133581fc676dfedc60d891dd5fa99028805e5ea5b08d3491af75d0707adab3b70c6a6a580217bf81" + ], + "message": "0x5656565656565656565656565656565656565656565656565656565656565656", + "signature": "0x912c3615f69575407db9392eb21fee18fff797eeb2fbe1816366ca2a08ae574d8824dbfafb4c9eaa1cf61b63c6f9b69911f269b664c42947dd1b53ef1081926c1e82bb2a465f927124b08391a5249036146d6f3f1e17ff5f162f7797ffffffff" + }, + "output": false +} diff --git a/packages/crypto/testdata/bls-tests/fast_aggregate_verify/fast_aggregate_verify_valid_3d7576f3c0e3570a.json b/packages/crypto/testdata/bls-tests/fast_aggregate_verify/fast_aggregate_verify_valid_3d7576f3c0e3570a.json new file mode 100644 index 0000000000..d2a946f857 --- /dev/null +++ b/packages/crypto/testdata/bls-tests/fast_aggregate_verify/fast_aggregate_verify_valid_3d7576f3c0e3570a.json @@ -0,0 +1,12 @@ +{ + "input": { + "pubkeys": [ + "0xa491d1b0ecd9bb917989f0e74f0dea0422eac4a873e5e2644f368dffb9a6e20fd6e10c1b77654d067c0618f6e5a7f79a", + "0xb301803f8b5ac4a1133581fc676dfedc60d891dd5fa99028805e5ea5b08d3491af75d0707adab3b70c6a6a580217bf81", + "0xb53d21a4cfd562c469cc81514d4ce5a6b577d8403d32a394dc265dd190b47fa9f829fdd7963afdf972e5e77854051f6f" + ], + "message": "0xabababababababababababababababababababababababababababababababab", + "signature": "0x9712c3edd73a209c742b8250759db12549b3eaf43b5ca61376d9f30e2747dbcf842d8b2ac0901d2a093713e20284a7670fcf6954e9ab93de991bb9b313e664785a075fc285806fa5224c82bde146561b446ccfc706a64b8579513cfc4ff1d930" + }, + "output": true +} diff --git a/packages/crypto/testdata/bls-tests/fast_aggregate_verify/fast_aggregate_verify_valid_5e745ad0c6199a6c.json b/packages/crypto/testdata/bls-tests/fast_aggregate_verify/fast_aggregate_verify_valid_5e745ad0c6199a6c.json new file mode 100644 index 0000000000..d40529925d --- /dev/null +++ b/packages/crypto/testdata/bls-tests/fast_aggregate_verify/fast_aggregate_verify_valid_5e745ad0c6199a6c.json @@ -0,0 +1,10 @@ +{ + "input": { + "pubkeys": [ + "0xa491d1b0ecd9bb917989f0e74f0dea0422eac4a873e5e2644f368dffb9a6e20fd6e10c1b77654d067c0618f6e5a7f79a" + ], + "message": "0x0000000000000000000000000000000000000000000000000000000000000000", + "signature": "0xb6ed936746e01f8ecf281f020953fbf1f01debd5657c4a383940b020b26507f6076334f91e2366c96e9ab279fb5158090352ea1c5b0c9274504f4f0e7053af24802e51e4568d164fe986834f41e55c8e850ce1f98458c0cfc9ab380b55285a55" + }, + "output": true +} diff --git a/packages/crypto/testdata/bls-tests/fast_aggregate_verify/fast_aggregate_verify_valid_652ce62f09290811.json b/packages/crypto/testdata/bls-tests/fast_aggregate_verify/fast_aggregate_verify_valid_652ce62f09290811.json new file mode 100644 index 0000000000..0cb8f24123 --- /dev/null +++ b/packages/crypto/testdata/bls-tests/fast_aggregate_verify/fast_aggregate_verify_valid_652ce62f09290811.json @@ -0,0 +1,11 @@ +{ + "input": { + "pubkeys": [ + "0xa491d1b0ecd9bb917989f0e74f0dea0422eac4a873e5e2644f368dffb9a6e20fd6e10c1b77654d067c0618f6e5a7f79a", + "0xb301803f8b5ac4a1133581fc676dfedc60d891dd5fa99028805e5ea5b08d3491af75d0707adab3b70c6a6a580217bf81" + ], + "message": "0x5656565656565656565656565656565656565656565656565656565656565656", + "signature": "0x912c3615f69575407db9392eb21fee18fff797eeb2fbe1816366ca2a08ae574d8824dbfafb4c9eaa1cf61b63c6f9b69911f269b664c42947dd1b53ef1081926c1e82bb2a465f927124b08391a5249036146d6f3f1e17ff5f162f779746d830d1" + }, + "output": true +} diff --git a/packages/crypto/testdata/bls-tests/hash_to_G2/hash_to_G2__2782afaa8406d038.json b/packages/crypto/testdata/bls-tests/hash_to_G2/hash_to_G2__2782afaa8406d038.json new file mode 100644 index 0000000000..468ae9a728 --- /dev/null +++ b/packages/crypto/testdata/bls-tests/hash_to_G2/hash_to_G2__2782afaa8406d038.json @@ -0,0 +1,9 @@ +{ + "input": { + "msg": "a512_aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa" + }, + "output": { + "x": "0x01a6ba2f9a11fa5598b2d8ace0fbe0a0eacb65deceb476fbbcb64fd24557c2f4b18ecfc5663e54ae16a84f5ab7f62534,0x11fca2ff525572795a801eed17eb12785887c7b63fb77a42be46ce4a34131d71f7a73e95fee3f812aea3de78b4d01569", + "y": "0x0b6798718c8aed24bc19cb27f866f1c9effcdbf92397ad6448b5c9db90d2b9da6cbabf48adc1adf59a1a28344e79d57e,0x03a47f8e6d1763ba0cad63d6114c0accbef65707825a511b251a660a9b3994249ae4e63fac38b23da0c398689ee2ab52" + } +} diff --git a/packages/crypto/testdata/bls-tests/hash_to_G2/hash_to_G2__7590bd067999bbfb.json b/packages/crypto/testdata/bls-tests/hash_to_G2/hash_to_G2__7590bd067999bbfb.json new file mode 100644 index 0000000000..6c33fd8c53 --- /dev/null +++ b/packages/crypto/testdata/bls-tests/hash_to_G2/hash_to_G2__7590bd067999bbfb.json @@ -0,0 +1,7 @@ +{ + "input": { "msg": "abc" }, + "output": { + "x": "0x02c2d18e033b960562aae3cab37a27ce00d80ccd5ba4b7fe0e7a210245129dbec7780ccc7954725f4168aff2787776e6,0x139cddbccdc5e91b9623efd38c49f81a6f83f175e80b06fc374de9eb4b41dfe4ca3a230ed250fbe3a2acf73a41177fd8", + "y": "0x1787327b68159716a37440985269cf584bcb1e621d3a7202be6ea05c4cfe244aeb197642555a0645fb87bf7466b2ba48,0x00aa65dae3c8d732d10ecd2c50f8a1baf3001578f71c694e03866e9f3d49ac1e1ce70dd94a733534f106d4cec0eddd16" + } +} diff --git a/packages/crypto/testdata/bls-tests/hash_to_G2/hash_to_G2__a54942c8e365f378.json b/packages/crypto/testdata/bls-tests/hash_to_G2/hash_to_G2__a54942c8e365f378.json new file mode 100644 index 0000000000..55f4176742 --- /dev/null +++ b/packages/crypto/testdata/bls-tests/hash_to_G2/hash_to_G2__a54942c8e365f378.json @@ -0,0 +1,7 @@ +{ + "input": { "msg": "" }, + "output": { + "x": "0x0141ebfbdca40eb85b87142e130ab689c673cf60f1a3e98d69335266f30d9b8d4ac44c1038e9dcdd5393faf5c41fb78a,0x05cb8437535e20ecffaef7752baddf98034139c38452458baeefab379ba13dff5bf5dd71b72418717047f5b0f37da03d", + "y": "0x0503921d7f6a12805e72940b963c0cf3471c7b2a524950ca195d11062ee75ec076daf2d4bc358c4b190c0c98064fdd92,0x12424ac32561493f3fe3c260708a12b7c620e7be00099a974e259ddc7d1f6395c3c811cdd19f1e8dbf3e9ecfdcbab8d6" + } +} diff --git a/packages/crypto/testdata/bls-tests/hash_to_G2/hash_to_G2__c938b486cf69e8f7.json b/packages/crypto/testdata/bls-tests/hash_to_G2/hash_to_G2__c938b486cf69e8f7.json new file mode 100644 index 0000000000..65c926bfcc --- /dev/null +++ b/packages/crypto/testdata/bls-tests/hash_to_G2/hash_to_G2__c938b486cf69e8f7.json @@ -0,0 +1,7 @@ +{ + "input": { "msg": "abcdef0123456789" }, + "output": { + "x": "0x121982811d2491fde9ba7ed31ef9ca474f0e1501297f68c298e9f4c0028add35aea8bb83d53c08cfc007c1e005723cd0,0x190d119345b94fbd15497bcba94ecf7db2cbfd1e1fe7da034d26cbba169fb3968288b3fafb265f9ebd380512a71c3f2c", + "y": "0x05571a0f8d3c08d094576981f4a3b8eda0a8e771fcdcc8ecceaf1356a6acf17574518acb506e435b639353c2e14827c8,0x0bb5e7572275c567462d91807de765611490205a941a5a6af3b1691bfe596c31225d3aabdf15faff860cb4ef17c7c3be" + } +} diff --git a/packages/crypto/testdata/bls-tests/sign/sign_case_11b8c7cad5238946.json b/packages/crypto/testdata/bls-tests/sign/sign_case_11b8c7cad5238946.json new file mode 100644 index 0000000000..5692f8e3b8 --- /dev/null +++ b/packages/crypto/testdata/bls-tests/sign/sign_case_11b8c7cad5238946.json @@ -0,0 +1,7 @@ +{ + "input": { + "privkey": "0x47b8192d77bf871b62e87859d653922725724a5c031afeabc60bcef5ff665138", + "message": "0x0000000000000000000000000000000000000000000000000000000000000000" + }, + "output": "0xb23c46be3a001c63ca711f87a005c200cc550b9429d5f4eb38d74322144f1b63926da3388979e5321012fb1a0526bcd100b5ef5fe72628ce4cd5e904aeaa3279527843fae5ca9ca675f4f51ed8f83bbf7155da9ecc9663100a885d5dc6df96d9" +} diff --git a/packages/crypto/testdata/bls-tests/sign/sign_case_142f678a8d05fcd1.json b/packages/crypto/testdata/bls-tests/sign/sign_case_142f678a8d05fcd1.json new file mode 100644 index 0000000000..4606b4ee78 --- /dev/null +++ b/packages/crypto/testdata/bls-tests/sign/sign_case_142f678a8d05fcd1.json @@ -0,0 +1,7 @@ +{ + "input": { + "privkey": "0x47b8192d77bf871b62e87859d653922725724a5c031afeabc60bcef5ff665138", + "message": "0x5656565656565656565656565656565656565656565656565656565656565656" + }, + "output": "0xaf1390c3c47acdb37131a51216da683c509fce0e954328a59f93aebda7e4ff974ba208d9a4a2a2389f892a9d418d618418dd7f7a6bc7aa0da999a9d3a5b815bc085e14fd001f6a1948768a3f4afefc8b8240dda329f984cb345c6363272ba4fe" +} diff --git a/packages/crypto/testdata/bls-tests/sign/sign_case_37286e1a6d1f6eb3.json b/packages/crypto/testdata/bls-tests/sign/sign_case_37286e1a6d1f6eb3.json new file mode 100644 index 0000000000..210ab9938f --- /dev/null +++ b/packages/crypto/testdata/bls-tests/sign/sign_case_37286e1a6d1f6eb3.json @@ -0,0 +1,7 @@ +{ + "input": { + "privkey": "0x47b8192d77bf871b62e87859d653922725724a5c031afeabc60bcef5ff665138", + "message": "0xabababababababababababababababababababababababababababababababab" + }, + "output": "0x9674e2228034527f4c083206032b020310face156d4a4685e2fcaec2f6f3665aa635d90347b6ce124eb879266b1e801d185de36a0a289b85e9039662634f2eea1e02e670bc7ab849d006a70b2f93b84597558a05b879c8d445f387a5d5b653df" +} diff --git a/packages/crypto/testdata/bls-tests/sign/sign_case_7055381f640f2c1d.json b/packages/crypto/testdata/bls-tests/sign/sign_case_7055381f640f2c1d.json new file mode 100644 index 0000000000..5333ebab54 --- /dev/null +++ b/packages/crypto/testdata/bls-tests/sign/sign_case_7055381f640f2c1d.json @@ -0,0 +1,7 @@ +{ + "input": { + "privkey": "0x328388aff0d4a5b7dc9205abd374e7e98f3cd9f3418edb4eafda5fb16473d216", + "message": "0x0000000000000000000000000000000000000000000000000000000000000000" + }, + "output": "0x948a7cb99f76d616c2c564ce9bf4a519f1bea6b0a624a02276443c245854219fabb8d4ce061d255af5330b078d5380681751aa7053da2c98bae898edc218c75f07e24d8802a17cd1f6833b71e58f5eb5b94208b4d0bb3848cecb075ea21be115" +} diff --git a/packages/crypto/testdata/bls-tests/sign/sign_case_84d45c9c7cca6b92.json b/packages/crypto/testdata/bls-tests/sign/sign_case_84d45c9c7cca6b92.json new file mode 100644 index 0000000000..6002cd3e41 --- /dev/null +++ b/packages/crypto/testdata/bls-tests/sign/sign_case_84d45c9c7cca6b92.json @@ -0,0 +1,7 @@ +{ + "input": { + "privkey": "0x328388aff0d4a5b7dc9205abd374e7e98f3cd9f3418edb4eafda5fb16473d216", + "message": "0xabababababababababababababababababababababababababababababababab" + }, + "output": "0xae82747ddeefe4fd64cf9cedb9b04ae3e8a43420cd255e3c7cd06a8d88b7c7f8638543719981c5d16fa3527c468c25f0026704a6951bde891360c7e8d12ddee0559004ccdbe6046b55bae1b257ee97f7cdb955773d7cf29adf3ccbb9975e4eb9" +} diff --git a/packages/crypto/testdata/bls-tests/sign/sign_case_8cd3d4d0d9a5b265.json b/packages/crypto/testdata/bls-tests/sign/sign_case_8cd3d4d0d9a5b265.json new file mode 100644 index 0000000000..12bf565de1 --- /dev/null +++ b/packages/crypto/testdata/bls-tests/sign/sign_case_8cd3d4d0d9a5b265.json @@ -0,0 +1,7 @@ +{ + "input": { + "privkey": "0x328388aff0d4a5b7dc9205abd374e7e98f3cd9f3418edb4eafda5fb16473d216", + "message": "0x5656565656565656565656565656565656565656565656565656565656565656" + }, + "output": "0xa4efa926610b8bd1c8330c918b7a5e9bf374e53435ef8b7ec186abf62e1b1f65aeaaeb365677ac1d1172a1f5b44b4e6d022c252c58486c0a759fbdc7de15a756acc4d343064035667a594b4c2a6f0b0b421975977f297dba63ee2f63ffe47bb6" +} diff --git a/packages/crypto/testdata/bls-tests/sign/sign_case_c82df61aa3ee60fb.json b/packages/crypto/testdata/bls-tests/sign/sign_case_c82df61aa3ee60fb.json new file mode 100644 index 0000000000..94458ef7b5 --- /dev/null +++ b/packages/crypto/testdata/bls-tests/sign/sign_case_c82df61aa3ee60fb.json @@ -0,0 +1,7 @@ +{ + "input": { + "privkey": "0x263dbd792f5b1be47ed85f8938c0f29586af0d3ac7b977f21c278fe1462040e3", + "message": "0x0000000000000000000000000000000000000000000000000000000000000000" + }, + "output": "0xb6ed936746e01f8ecf281f020953fbf1f01debd5657c4a383940b020b26507f6076334f91e2366c96e9ab279fb5158090352ea1c5b0c9274504f4f0e7053af24802e51e4568d164fe986834f41e55c8e850ce1f98458c0cfc9ab380b55285a55" +} diff --git a/packages/crypto/testdata/bls-tests/sign/sign_case_d0e28d7e76eb6e9c.json b/packages/crypto/testdata/bls-tests/sign/sign_case_d0e28d7e76eb6e9c.json new file mode 100644 index 0000000000..f357607ce9 --- /dev/null +++ b/packages/crypto/testdata/bls-tests/sign/sign_case_d0e28d7e76eb6e9c.json @@ -0,0 +1,7 @@ +{ + "input": { + "privkey": "0x263dbd792f5b1be47ed85f8938c0f29586af0d3ac7b977f21c278fe1462040e3", + "message": "0x5656565656565656565656565656565656565656565656565656565656565656" + }, + "output": "0x882730e5d03f6b42c3abc26d3372625034e1d871b65a8a6b900a56dae22da98abbe1b68f85e49fe7652a55ec3d0591c20767677e33e5cbb1207315c41a9ac03be39c2e7668edc043d6cb1d9fd93033caa8a1c5b0e84bedaeb6c64972503a43eb" +} diff --git a/packages/crypto/testdata/bls-tests/sign/sign_case_f2ae1097e7d0e18b.json b/packages/crypto/testdata/bls-tests/sign/sign_case_f2ae1097e7d0e18b.json new file mode 100644 index 0000000000..155cb19bcc --- /dev/null +++ b/packages/crypto/testdata/bls-tests/sign/sign_case_f2ae1097e7d0e18b.json @@ -0,0 +1,7 @@ +{ + "input": { + "privkey": "0x263dbd792f5b1be47ed85f8938c0f29586af0d3ac7b977f21c278fe1462040e3", + "message": "0xabababababababababababababababababababababababababababababababab" + }, + "output": "0x91347bccf740d859038fcdcaf233eeceb2a436bcaaee9b2aa3bfb70efe29dfb2677562ccbea1c8e061fb9971b0753c240622fab78489ce96768259fc01360346da5b9f579e5da0d941e4c6ba18a0e64906082375394f337fa1af2b7127b0d121" +} diff --git a/packages/crypto/testdata/bls-tests/sign/sign_case_zero_privkey.json b/packages/crypto/testdata/bls-tests/sign/sign_case_zero_privkey.json new file mode 100644 index 0000000000..c30577121a --- /dev/null +++ b/packages/crypto/testdata/bls-tests/sign/sign_case_zero_privkey.json @@ -0,0 +1,7 @@ +{ + "input": { + "privkey": "0x0000000000000000000000000000000000000000000000000000000000000000", + "message": "0xabababababababababababababababababababababababababababababababab" + }, + "output": null +} diff --git a/packages/crypto/testdata/bls-tests/verify/verify_infinity_pubkey_and_infinity_signature.json b/packages/crypto/testdata/bls-tests/verify/verify_infinity_pubkey_and_infinity_signature.json new file mode 100644 index 0000000000..51ba76e875 --- /dev/null +++ b/packages/crypto/testdata/bls-tests/verify/verify_infinity_pubkey_and_infinity_signature.json @@ -0,0 +1,8 @@ +{ + "input": { + "pubkey": "0xc00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", + "message": "0x1212121212121212121212121212121212121212121212121212121212121212", + "signature": "0xc00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000" + }, + "output": false +} diff --git a/packages/crypto/testdata/bls-tests/verify/verify_tampered_signature_case_195246ee3bd3b6ec.json b/packages/crypto/testdata/bls-tests/verify/verify_tampered_signature_case_195246ee3bd3b6ec.json new file mode 100644 index 0000000000..96f61efaf6 --- /dev/null +++ b/packages/crypto/testdata/bls-tests/verify/verify_tampered_signature_case_195246ee3bd3b6ec.json @@ -0,0 +1,8 @@ +{ + "input": { + "pubkey": "0xb53d21a4cfd562c469cc81514d4ce5a6b577d8403d32a394dc265dd190b47fa9f829fdd7963afdf972e5e77854051f6f", + "message": "0xabababababababababababababababababababababababababababababababab", + "signature": "0xae82747ddeefe4fd64cf9cedb9b04ae3e8a43420cd255e3c7cd06a8d88b7c7f8638543719981c5d16fa3527c468c25f0026704a6951bde891360c7e8d12ddee0559004ccdbe6046b55bae1b257ee97f7cdb955773d7cf29adf3ccbb9ffffffff" + }, + "output": false +} diff --git a/packages/crypto/testdata/bls-tests/verify/verify_tampered_signature_case_2ea479adf8c40300.json b/packages/crypto/testdata/bls-tests/verify/verify_tampered_signature_case_2ea479adf8c40300.json new file mode 100644 index 0000000000..8d024cd8b9 --- /dev/null +++ b/packages/crypto/testdata/bls-tests/verify/verify_tampered_signature_case_2ea479adf8c40300.json @@ -0,0 +1,8 @@ +{ + "input": { + "pubkey": "0xa491d1b0ecd9bb917989f0e74f0dea0422eac4a873e5e2644f368dffb9a6e20fd6e10c1b77654d067c0618f6e5a7f79a", + "message": "0x5656565656565656565656565656565656565656565656565656565656565656", + "signature": "0x882730e5d03f6b42c3abc26d3372625034e1d871b65a8a6b900a56dae22da98abbe1b68f85e49fe7652a55ec3d0591c20767677e33e5cbb1207315c41a9ac03be39c2e7668edc043d6cb1d9fd93033caa8a1c5b0e84bedaeb6c64972ffffffff" + }, + "output": false +} diff --git a/packages/crypto/testdata/bls-tests/verify/verify_tampered_signature_case_2f09d443ab8a3ac2.json b/packages/crypto/testdata/bls-tests/verify/verify_tampered_signature_case_2f09d443ab8a3ac2.json new file mode 100644 index 0000000000..328d2d2320 --- /dev/null +++ b/packages/crypto/testdata/bls-tests/verify/verify_tampered_signature_case_2f09d443ab8a3ac2.json @@ -0,0 +1,8 @@ +{ + "input": { + "pubkey": "0xb301803f8b5ac4a1133581fc676dfedc60d891dd5fa99028805e5ea5b08d3491af75d0707adab3b70c6a6a580217bf81", + "message": "0x0000000000000000000000000000000000000000000000000000000000000000", + "signature": "0xb23c46be3a001c63ca711f87a005c200cc550b9429d5f4eb38d74322144f1b63926da3388979e5321012fb1a0526bcd100b5ef5fe72628ce4cd5e904aeaa3279527843fae5ca9ca675f4f51ed8f83bbf7155da9ecc9663100a885d5dffffffff" + }, + "output": false +} diff --git a/packages/crypto/testdata/bls-tests/verify/verify_tampered_signature_case_3208262581c8fc09.json b/packages/crypto/testdata/bls-tests/verify/verify_tampered_signature_case_3208262581c8fc09.json new file mode 100644 index 0000000000..65d3e865c8 --- /dev/null +++ b/packages/crypto/testdata/bls-tests/verify/verify_tampered_signature_case_3208262581c8fc09.json @@ -0,0 +1,8 @@ +{ + "input": { + "pubkey": "0xb301803f8b5ac4a1133581fc676dfedc60d891dd5fa99028805e5ea5b08d3491af75d0707adab3b70c6a6a580217bf81", + "message": "0x5656565656565656565656565656565656565656565656565656565656565656", + "signature": "0xaf1390c3c47acdb37131a51216da683c509fce0e954328a59f93aebda7e4ff974ba208d9a4a2a2389f892a9d418d618418dd7f7a6bc7aa0da999a9d3a5b815bc085e14fd001f6a1948768a3f4afefc8b8240dda329f984cb345c6363ffffffff" + }, + "output": false +} diff --git a/packages/crypto/testdata/bls-tests/verify/verify_tampered_signature_case_6b3b17f6962a490c.json b/packages/crypto/testdata/bls-tests/verify/verify_tampered_signature_case_6b3b17f6962a490c.json new file mode 100644 index 0000000000..1d278a1a18 --- /dev/null +++ b/packages/crypto/testdata/bls-tests/verify/verify_tampered_signature_case_6b3b17f6962a490c.json @@ -0,0 +1,8 @@ +{ + "input": { + "pubkey": "0xb53d21a4cfd562c469cc81514d4ce5a6b577d8403d32a394dc265dd190b47fa9f829fdd7963afdf972e5e77854051f6f", + "message": "0x5656565656565656565656565656565656565656565656565656565656565656", + "signature": "0xa4efa926610b8bd1c8330c918b7a5e9bf374e53435ef8b7ec186abf62e1b1f65aeaaeb365677ac1d1172a1f5b44b4e6d022c252c58486c0a759fbdc7de15a756acc4d343064035667a594b4c2a6f0b0b421975977f297dba63ee2f63ffffffff" + }, + "output": false +} diff --git a/packages/crypto/testdata/bls-tests/verify/verify_tampered_signature_case_6eeb7c52dfd9baf0.json b/packages/crypto/testdata/bls-tests/verify/verify_tampered_signature_case_6eeb7c52dfd9baf0.json new file mode 100644 index 0000000000..5d90c78597 --- /dev/null +++ b/packages/crypto/testdata/bls-tests/verify/verify_tampered_signature_case_6eeb7c52dfd9baf0.json @@ -0,0 +1,8 @@ +{ + "input": { + "pubkey": "0xb301803f8b5ac4a1133581fc676dfedc60d891dd5fa99028805e5ea5b08d3491af75d0707adab3b70c6a6a580217bf81", + "message": "0xabababababababababababababababababababababababababababababababab", + "signature": "0x9674e2228034527f4c083206032b020310face156d4a4685e2fcaec2f6f3665aa635d90347b6ce124eb879266b1e801d185de36a0a289b85e9039662634f2eea1e02e670bc7ab849d006a70b2f93b84597558a05b879c8d445f387a5ffffffff" + }, + "output": false +} diff --git a/packages/crypto/testdata/bls-tests/verify/verify_tampered_signature_case_8761a0b7e920c323.json b/packages/crypto/testdata/bls-tests/verify/verify_tampered_signature_case_8761a0b7e920c323.json new file mode 100644 index 0000000000..1472779132 --- /dev/null +++ b/packages/crypto/testdata/bls-tests/verify/verify_tampered_signature_case_8761a0b7e920c323.json @@ -0,0 +1,8 @@ +{ + "input": { + "pubkey": "0xa491d1b0ecd9bb917989f0e74f0dea0422eac4a873e5e2644f368dffb9a6e20fd6e10c1b77654d067c0618f6e5a7f79a", + "message": "0xabababababababababababababababababababababababababababababababab", + "signature": "0x91347bccf740d859038fcdcaf233eeceb2a436bcaaee9b2aa3bfb70efe29dfb2677562ccbea1c8e061fb9971b0753c240622fab78489ce96768259fc01360346da5b9f579e5da0d941e4c6ba18a0e64906082375394f337fa1af2b71ffffffff" + }, + "output": false +} diff --git a/packages/crypto/testdata/bls-tests/verify/verify_tampered_signature_case_d34885d766d5f705.json b/packages/crypto/testdata/bls-tests/verify/verify_tampered_signature_case_d34885d766d5f705.json new file mode 100644 index 0000000000..c7d8d37525 --- /dev/null +++ b/packages/crypto/testdata/bls-tests/verify/verify_tampered_signature_case_d34885d766d5f705.json @@ -0,0 +1,8 @@ +{ + "input": { + "pubkey": "0xb53d21a4cfd562c469cc81514d4ce5a6b577d8403d32a394dc265dd190b47fa9f829fdd7963afdf972e5e77854051f6f", + "message": "0x0000000000000000000000000000000000000000000000000000000000000000", + "signature": "0x948a7cb99f76d616c2c564ce9bf4a519f1bea6b0a624a02276443c245854219fabb8d4ce061d255af5330b078d5380681751aa7053da2c98bae898edc218c75f07e24d8802a17cd1f6833b71e58f5eb5b94208b4d0bb3848cecb075effffffff" + }, + "output": false +} diff --git a/packages/crypto/testdata/bls-tests/verify/verify_tampered_signature_case_e8a50c445c855360.json b/packages/crypto/testdata/bls-tests/verify/verify_tampered_signature_case_e8a50c445c855360.json new file mode 100644 index 0000000000..af9428ed95 --- /dev/null +++ b/packages/crypto/testdata/bls-tests/verify/verify_tampered_signature_case_e8a50c445c855360.json @@ -0,0 +1,8 @@ +{ + "input": { + "pubkey": "0xa491d1b0ecd9bb917989f0e74f0dea0422eac4a873e5e2644f368dffb9a6e20fd6e10c1b77654d067c0618f6e5a7f79a", + "message": "0x0000000000000000000000000000000000000000000000000000000000000000", + "signature": "0xb6ed936746e01f8ecf281f020953fbf1f01debd5657c4a383940b020b26507f6076334f91e2366c96e9ab279fb5158090352ea1c5b0c9274504f4f0e7053af24802e51e4568d164fe986834f41e55c8e850ce1f98458c0cfc9ab380bffffffff" + }, + "output": false +} diff --git a/packages/crypto/testdata/bls-tests/verify/verify_valid_case_195246ee3bd3b6ec.json b/packages/crypto/testdata/bls-tests/verify/verify_valid_case_195246ee3bd3b6ec.json new file mode 100644 index 0000000000..bc8030a178 --- /dev/null +++ b/packages/crypto/testdata/bls-tests/verify/verify_valid_case_195246ee3bd3b6ec.json @@ -0,0 +1,8 @@ +{ + "input": { + "pubkey": "0xb53d21a4cfd562c469cc81514d4ce5a6b577d8403d32a394dc265dd190b47fa9f829fdd7963afdf972e5e77854051f6f", + "message": "0xabababababababababababababababababababababababababababababababab", + "signature": "0xae82747ddeefe4fd64cf9cedb9b04ae3e8a43420cd255e3c7cd06a8d88b7c7f8638543719981c5d16fa3527c468c25f0026704a6951bde891360c7e8d12ddee0559004ccdbe6046b55bae1b257ee97f7cdb955773d7cf29adf3ccbb9975e4eb9" + }, + "output": true +} diff --git a/packages/crypto/testdata/bls-tests/verify/verify_valid_case_2ea479adf8c40300.json b/packages/crypto/testdata/bls-tests/verify/verify_valid_case_2ea479adf8c40300.json new file mode 100644 index 0000000000..2f2f7a65d7 --- /dev/null +++ b/packages/crypto/testdata/bls-tests/verify/verify_valid_case_2ea479adf8c40300.json @@ -0,0 +1,8 @@ +{ + "input": { + "pubkey": "0xa491d1b0ecd9bb917989f0e74f0dea0422eac4a873e5e2644f368dffb9a6e20fd6e10c1b77654d067c0618f6e5a7f79a", + "message": "0x5656565656565656565656565656565656565656565656565656565656565656", + "signature": "0x882730e5d03f6b42c3abc26d3372625034e1d871b65a8a6b900a56dae22da98abbe1b68f85e49fe7652a55ec3d0591c20767677e33e5cbb1207315c41a9ac03be39c2e7668edc043d6cb1d9fd93033caa8a1c5b0e84bedaeb6c64972503a43eb" + }, + "output": true +} diff --git a/packages/crypto/testdata/bls-tests/verify/verify_valid_case_2f09d443ab8a3ac2.json b/packages/crypto/testdata/bls-tests/verify/verify_valid_case_2f09d443ab8a3ac2.json new file mode 100644 index 0000000000..46b8e4f9b1 --- /dev/null +++ b/packages/crypto/testdata/bls-tests/verify/verify_valid_case_2f09d443ab8a3ac2.json @@ -0,0 +1,8 @@ +{ + "input": { + "pubkey": "0xb301803f8b5ac4a1133581fc676dfedc60d891dd5fa99028805e5ea5b08d3491af75d0707adab3b70c6a6a580217bf81", + "message": "0x0000000000000000000000000000000000000000000000000000000000000000", + "signature": "0xb23c46be3a001c63ca711f87a005c200cc550b9429d5f4eb38d74322144f1b63926da3388979e5321012fb1a0526bcd100b5ef5fe72628ce4cd5e904aeaa3279527843fae5ca9ca675f4f51ed8f83bbf7155da9ecc9663100a885d5dc6df96d9" + }, + "output": true +} diff --git a/packages/crypto/testdata/bls-tests/verify/verify_valid_case_3208262581c8fc09.json b/packages/crypto/testdata/bls-tests/verify/verify_valid_case_3208262581c8fc09.json new file mode 100644 index 0000000000..15e948e0cf --- /dev/null +++ b/packages/crypto/testdata/bls-tests/verify/verify_valid_case_3208262581c8fc09.json @@ -0,0 +1,8 @@ +{ + "input": { + "pubkey": "0xb301803f8b5ac4a1133581fc676dfedc60d891dd5fa99028805e5ea5b08d3491af75d0707adab3b70c6a6a580217bf81", + "message": "0x5656565656565656565656565656565656565656565656565656565656565656", + "signature": "0xaf1390c3c47acdb37131a51216da683c509fce0e954328a59f93aebda7e4ff974ba208d9a4a2a2389f892a9d418d618418dd7f7a6bc7aa0da999a9d3a5b815bc085e14fd001f6a1948768a3f4afefc8b8240dda329f984cb345c6363272ba4fe" + }, + "output": true +} diff --git a/packages/crypto/testdata/bls-tests/verify/verify_valid_case_6b3b17f6962a490c.json b/packages/crypto/testdata/bls-tests/verify/verify_valid_case_6b3b17f6962a490c.json new file mode 100644 index 0000000000..ce1816c87d --- /dev/null +++ b/packages/crypto/testdata/bls-tests/verify/verify_valid_case_6b3b17f6962a490c.json @@ -0,0 +1,8 @@ +{ + "input": { + "pubkey": "0xb53d21a4cfd562c469cc81514d4ce5a6b577d8403d32a394dc265dd190b47fa9f829fdd7963afdf972e5e77854051f6f", + "message": "0x5656565656565656565656565656565656565656565656565656565656565656", + "signature": "0xa4efa926610b8bd1c8330c918b7a5e9bf374e53435ef8b7ec186abf62e1b1f65aeaaeb365677ac1d1172a1f5b44b4e6d022c252c58486c0a759fbdc7de15a756acc4d343064035667a594b4c2a6f0b0b421975977f297dba63ee2f63ffe47bb6" + }, + "output": true +} diff --git a/packages/crypto/testdata/bls-tests/verify/verify_valid_case_6eeb7c52dfd9baf0.json b/packages/crypto/testdata/bls-tests/verify/verify_valid_case_6eeb7c52dfd9baf0.json new file mode 100644 index 0000000000..c81da01e85 --- /dev/null +++ b/packages/crypto/testdata/bls-tests/verify/verify_valid_case_6eeb7c52dfd9baf0.json @@ -0,0 +1,8 @@ +{ + "input": { + "pubkey": "0xb301803f8b5ac4a1133581fc676dfedc60d891dd5fa99028805e5ea5b08d3491af75d0707adab3b70c6a6a580217bf81", + "message": "0xabababababababababababababababababababababababababababababababab", + "signature": "0x9674e2228034527f4c083206032b020310face156d4a4685e2fcaec2f6f3665aa635d90347b6ce124eb879266b1e801d185de36a0a289b85e9039662634f2eea1e02e670bc7ab849d006a70b2f93b84597558a05b879c8d445f387a5d5b653df" + }, + "output": true +} diff --git a/packages/crypto/testdata/bls-tests/verify/verify_valid_case_8761a0b7e920c323.json b/packages/crypto/testdata/bls-tests/verify/verify_valid_case_8761a0b7e920c323.json new file mode 100644 index 0000000000..b922c21542 --- /dev/null +++ b/packages/crypto/testdata/bls-tests/verify/verify_valid_case_8761a0b7e920c323.json @@ -0,0 +1,8 @@ +{ + "input": { + "pubkey": "0xa491d1b0ecd9bb917989f0e74f0dea0422eac4a873e5e2644f368dffb9a6e20fd6e10c1b77654d067c0618f6e5a7f79a", + "message": "0xabababababababababababababababababababababababababababababababab", + "signature": "0x91347bccf740d859038fcdcaf233eeceb2a436bcaaee9b2aa3bfb70efe29dfb2677562ccbea1c8e061fb9971b0753c240622fab78489ce96768259fc01360346da5b9f579e5da0d941e4c6ba18a0e64906082375394f337fa1af2b7127b0d121" + }, + "output": true +} diff --git a/packages/crypto/testdata/bls-tests/verify/verify_valid_case_d34885d766d5f705.json b/packages/crypto/testdata/bls-tests/verify/verify_valid_case_d34885d766d5f705.json new file mode 100644 index 0000000000..876f7351ad --- /dev/null +++ b/packages/crypto/testdata/bls-tests/verify/verify_valid_case_d34885d766d5f705.json @@ -0,0 +1,8 @@ +{ + "input": { + "pubkey": "0xb53d21a4cfd562c469cc81514d4ce5a6b577d8403d32a394dc265dd190b47fa9f829fdd7963afdf972e5e77854051f6f", + "message": "0x0000000000000000000000000000000000000000000000000000000000000000", + "signature": "0x948a7cb99f76d616c2c564ce9bf4a519f1bea6b0a624a02276443c245854219fabb8d4ce061d255af5330b078d5380681751aa7053da2c98bae898edc218c75f07e24d8802a17cd1f6833b71e58f5eb5b94208b4d0bb3848cecb075ea21be115" + }, + "output": true +} diff --git a/packages/crypto/testdata/bls-tests/verify/verify_valid_case_e8a50c445c855360.json b/packages/crypto/testdata/bls-tests/verify/verify_valid_case_e8a50c445c855360.json new file mode 100644 index 0000000000..cc4cd014b2 --- /dev/null +++ b/packages/crypto/testdata/bls-tests/verify/verify_valid_case_e8a50c445c855360.json @@ -0,0 +1,8 @@ +{ + "input": { + "pubkey": "0xa491d1b0ecd9bb917989f0e74f0dea0422eac4a873e5e2644f368dffb9a6e20fd6e10c1b77654d067c0618f6e5a7f79a", + "message": "0x0000000000000000000000000000000000000000000000000000000000000000", + "signature": "0xb6ed936746e01f8ecf281f020953fbf1f01debd5657c4a383940b020b26507f6076334f91e2366c96e9ab279fb5158090352ea1c5b0c9274504f4f0e7053af24802e51e4568d164fe986834f41e55c8e850ce1f98458c0cfc9ab380b55285a55" + }, + "output": true +} diff --git a/packages/crypto/testdata/bls-tests/verify/verify_wrong_pubkey_case_195246ee3bd3b6ec.json b/packages/crypto/testdata/bls-tests/verify/verify_wrong_pubkey_case_195246ee3bd3b6ec.json new file mode 100644 index 0000000000..5a5ed2b2d7 --- /dev/null +++ b/packages/crypto/testdata/bls-tests/verify/verify_wrong_pubkey_case_195246ee3bd3b6ec.json @@ -0,0 +1,8 @@ +{ + "input": { + "pubkey": "0xb53d21a4cfd562c469cc81514d4ce5a6b577d8403d32a394dc265dd190b47fa9f829fdd7963afdf972e5e77854051f6f", + "message": "0xabababababababababababababababababababababababababababababababab", + "signature": "0x9674e2228034527f4c083206032b020310face156d4a4685e2fcaec2f6f3665aa635d90347b6ce124eb879266b1e801d185de36a0a289b85e9039662634f2eea1e02e670bc7ab849d006a70b2f93b84597558a05b879c8d445f387a5d5b653df" + }, + "output": false +} diff --git a/packages/crypto/testdata/bls-tests/verify/verify_wrong_pubkey_case_2ea479adf8c40300.json b/packages/crypto/testdata/bls-tests/verify/verify_wrong_pubkey_case_2ea479adf8c40300.json new file mode 100644 index 0000000000..92285b7465 --- /dev/null +++ b/packages/crypto/testdata/bls-tests/verify/verify_wrong_pubkey_case_2ea479adf8c40300.json @@ -0,0 +1,8 @@ +{ + "input": { + "pubkey": "0xa491d1b0ecd9bb917989f0e74f0dea0422eac4a873e5e2644f368dffb9a6e20fd6e10c1b77654d067c0618f6e5a7f79a", + "message": "0x5656565656565656565656565656565656565656565656565656565656565656", + "signature": "0xa4efa926610b8bd1c8330c918b7a5e9bf374e53435ef8b7ec186abf62e1b1f65aeaaeb365677ac1d1172a1f5b44b4e6d022c252c58486c0a759fbdc7de15a756acc4d343064035667a594b4c2a6f0b0b421975977f297dba63ee2f63ffe47bb6" + }, + "output": false +} diff --git a/packages/crypto/testdata/bls-tests/verify/verify_wrong_pubkey_case_2f09d443ab8a3ac2.json b/packages/crypto/testdata/bls-tests/verify/verify_wrong_pubkey_case_2f09d443ab8a3ac2.json new file mode 100644 index 0000000000..1c51e235b3 --- /dev/null +++ b/packages/crypto/testdata/bls-tests/verify/verify_wrong_pubkey_case_2f09d443ab8a3ac2.json @@ -0,0 +1,8 @@ +{ + "input": { + "pubkey": "0xb301803f8b5ac4a1133581fc676dfedc60d891dd5fa99028805e5ea5b08d3491af75d0707adab3b70c6a6a580217bf81", + "message": "0x0000000000000000000000000000000000000000000000000000000000000000", + "signature": "0xb6ed936746e01f8ecf281f020953fbf1f01debd5657c4a383940b020b26507f6076334f91e2366c96e9ab279fb5158090352ea1c5b0c9274504f4f0e7053af24802e51e4568d164fe986834f41e55c8e850ce1f98458c0cfc9ab380b55285a55" + }, + "output": false +} diff --git a/packages/crypto/testdata/bls-tests/verify/verify_wrong_pubkey_case_3208262581c8fc09.json b/packages/crypto/testdata/bls-tests/verify/verify_wrong_pubkey_case_3208262581c8fc09.json new file mode 100644 index 0000000000..4c356ca42a --- /dev/null +++ b/packages/crypto/testdata/bls-tests/verify/verify_wrong_pubkey_case_3208262581c8fc09.json @@ -0,0 +1,8 @@ +{ + "input": { + "pubkey": "0xb301803f8b5ac4a1133581fc676dfedc60d891dd5fa99028805e5ea5b08d3491af75d0707adab3b70c6a6a580217bf81", + "message": "0x5656565656565656565656565656565656565656565656565656565656565656", + "signature": "0x882730e5d03f6b42c3abc26d3372625034e1d871b65a8a6b900a56dae22da98abbe1b68f85e49fe7652a55ec3d0591c20767677e33e5cbb1207315c41a9ac03be39c2e7668edc043d6cb1d9fd93033caa8a1c5b0e84bedaeb6c64972503a43eb" + }, + "output": false +} diff --git a/packages/crypto/testdata/bls-tests/verify/verify_wrong_pubkey_case_6b3b17f6962a490c.json b/packages/crypto/testdata/bls-tests/verify/verify_wrong_pubkey_case_6b3b17f6962a490c.json new file mode 100644 index 0000000000..f75ed36e69 --- /dev/null +++ b/packages/crypto/testdata/bls-tests/verify/verify_wrong_pubkey_case_6b3b17f6962a490c.json @@ -0,0 +1,8 @@ +{ + "input": { + "pubkey": "0xb53d21a4cfd562c469cc81514d4ce5a6b577d8403d32a394dc265dd190b47fa9f829fdd7963afdf972e5e77854051f6f", + "message": "0x5656565656565656565656565656565656565656565656565656565656565656", + "signature": "0xaf1390c3c47acdb37131a51216da683c509fce0e954328a59f93aebda7e4ff974ba208d9a4a2a2389f892a9d418d618418dd7f7a6bc7aa0da999a9d3a5b815bc085e14fd001f6a1948768a3f4afefc8b8240dda329f984cb345c6363272ba4fe" + }, + "output": false +} diff --git a/packages/crypto/testdata/bls-tests/verify/verify_wrong_pubkey_case_6eeb7c52dfd9baf0.json b/packages/crypto/testdata/bls-tests/verify/verify_wrong_pubkey_case_6eeb7c52dfd9baf0.json new file mode 100644 index 0000000000..4737cdbb5b --- /dev/null +++ b/packages/crypto/testdata/bls-tests/verify/verify_wrong_pubkey_case_6eeb7c52dfd9baf0.json @@ -0,0 +1,8 @@ +{ + "input": { + "pubkey": "0xb301803f8b5ac4a1133581fc676dfedc60d891dd5fa99028805e5ea5b08d3491af75d0707adab3b70c6a6a580217bf81", + "message": "0xabababababababababababababababababababababababababababababababab", + "signature": "0x91347bccf740d859038fcdcaf233eeceb2a436bcaaee9b2aa3bfb70efe29dfb2677562ccbea1c8e061fb9971b0753c240622fab78489ce96768259fc01360346da5b9f579e5da0d941e4c6ba18a0e64906082375394f337fa1af2b7127b0d121" + }, + "output": false +} diff --git a/packages/crypto/testdata/bls-tests/verify/verify_wrong_pubkey_case_8761a0b7e920c323.json b/packages/crypto/testdata/bls-tests/verify/verify_wrong_pubkey_case_8761a0b7e920c323.json new file mode 100644 index 0000000000..a84115ab26 --- /dev/null +++ b/packages/crypto/testdata/bls-tests/verify/verify_wrong_pubkey_case_8761a0b7e920c323.json @@ -0,0 +1,8 @@ +{ + "input": { + "pubkey": "0xa491d1b0ecd9bb917989f0e74f0dea0422eac4a873e5e2644f368dffb9a6e20fd6e10c1b77654d067c0618f6e5a7f79a", + "message": "0xabababababababababababababababababababababababababababababababab", + "signature": "0xae82747ddeefe4fd64cf9cedb9b04ae3e8a43420cd255e3c7cd06a8d88b7c7f8638543719981c5d16fa3527c468c25f0026704a6951bde891360c7e8d12ddee0559004ccdbe6046b55bae1b257ee97f7cdb955773d7cf29adf3ccbb9975e4eb9" + }, + "output": false +} diff --git a/packages/crypto/testdata/bls-tests/verify/verify_wrong_pubkey_case_d34885d766d5f705.json b/packages/crypto/testdata/bls-tests/verify/verify_wrong_pubkey_case_d34885d766d5f705.json new file mode 100644 index 0000000000..7f0cb1af49 --- /dev/null +++ b/packages/crypto/testdata/bls-tests/verify/verify_wrong_pubkey_case_d34885d766d5f705.json @@ -0,0 +1,8 @@ +{ + "input": { + "pubkey": "0xb53d21a4cfd562c469cc81514d4ce5a6b577d8403d32a394dc265dd190b47fa9f829fdd7963afdf972e5e77854051f6f", + "message": "0x0000000000000000000000000000000000000000000000000000000000000000", + "signature": "0xb23c46be3a001c63ca711f87a005c200cc550b9429d5f4eb38d74322144f1b63926da3388979e5321012fb1a0526bcd100b5ef5fe72628ce4cd5e904aeaa3279527843fae5ca9ca675f4f51ed8f83bbf7155da9ecc9663100a885d5dc6df96d9" + }, + "output": false +} diff --git a/packages/crypto/testdata/bls-tests/verify/verify_wrong_pubkey_case_e8a50c445c855360.json b/packages/crypto/testdata/bls-tests/verify/verify_wrong_pubkey_case_e8a50c445c855360.json new file mode 100644 index 0000000000..24c8e2f584 --- /dev/null +++ b/packages/crypto/testdata/bls-tests/verify/verify_wrong_pubkey_case_e8a50c445c855360.json @@ -0,0 +1,8 @@ +{ + "input": { + "pubkey": "0xa491d1b0ecd9bb917989f0e74f0dea0422eac4a873e5e2644f368dffb9a6e20fd6e10c1b77654d067c0618f6e5a7f79a", + "message": "0x0000000000000000000000000000000000000000000000000000000000000000", + "signature": "0x948a7cb99f76d616c2c564ce9bf4a519f1bea6b0a624a02276443c245854219fabb8d4ce061d255af5330b078d5380681751aa7053da2c98bae898edc218c75f07e24d8802a17cd1f6833b71e58f5eb5b94208b4d0bb3848cecb075ea21be115" + }, + "output": false +} diff --git a/packages/crypto/testdata/bls-tests/verify/verifycase_one_privkey_47117849458281be.json b/packages/crypto/testdata/bls-tests/verify/verifycase_one_privkey_47117849458281be.json new file mode 100644 index 0000000000..826afd43c2 --- /dev/null +++ b/packages/crypto/testdata/bls-tests/verify/verifycase_one_privkey_47117849458281be.json @@ -0,0 +1,8 @@ +{ + "input": { + "pubkey": "0x97f1d3a73197d7942695638c4fa9ac0fc3688c4f9774b905a14e3a3f171bac586c55e83ff97a1aeffb3af00adb22c6bb", + "message": "0x1212121212121212121212121212121212121212121212121212121212121212", + "signature": "0xa42ae16f1c2a5fa69c04cb5998d2add790764ce8dd45bf25b29b4700829232052b52352dcff1cf255b3a7810ad7269601810f03b2bc8b68cf289cf295b206770605a190b6842583e47c3d1c0f73c54907bfb2a602157d46a4353a20283018763" + }, + "output": true +} diff --git a/packages/crypto/testdata/eth-headers/1699693797.394876721s.json b/packages/crypto/testdata/eth-headers/1699693797.394876721s.json new file mode 100644 index 0000000000..e203c3b07d --- /dev/null +++ b/packages/crypto/testdata/eth-headers/1699693797.394876721s.json @@ -0,0 +1,503 @@ +{ + "public_keys": [ + "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" + ], + "message": "ZOUaZJZMirvzYYwSTf3ZGcHH0QjxpkkkDHYqWWwZzZQ=", + "signature": "hvW2G4MSoCl6NfJAykQgoZNchj12ptXkrOYBeKlInOr0LkYMix3wkswqcZtZrOYkCH49XENcdVTzTFI22mzr6obbF/4nnoXIXPcferxUhLpBD25V354oUbNk3zFZnpoH", + "aggregate_pubkey": "gJo644kMo1WhhRi+FtFBB/4Gmw9hGjPq9ts2JKz06MmXrYqVBM2xphZ7oIUvQ4UU" +} diff --git a/packages/crypto/tests/bls12_381.rs b/packages/crypto/tests/bls12_381.rs new file mode 100644 index 0000000000..12ad02c4f9 --- /dev/null +++ b/packages/crypto/tests/bls12_381.rs @@ -0,0 +1,103 @@ +use base64::engine::general_purpose::STANDARD; +use base64_serde::base64_serde_type; +use cosmwasm_crypto::{bls12_318_aggregate_g1, bls12_318_aggregate_g2}; + +base64_serde_type!(Base64Standard, STANDARD); + +#[derive(Debug, PartialEq, serde::Serialize, serde::Deserialize)] +struct EthPubkey(#[serde(with = "Base64Standard")] Vec); + +#[derive(Debug, PartialEq, serde::Serialize, serde::Deserialize)] +struct EthHeaders { + public_keys: Vec, + #[serde(with = "Base64Standard")] + message: Vec, + #[serde(with = "Base64Standard")] + signature: Vec, + #[serde(with = "Base64Standard")] + aggregate_pubkey: Vec, +} + +#[derive(Debug, PartialEq, serde::Serialize, serde::Deserialize)] +struct AggregateTestFile { + input: Vec, + output: Option, +} + +struct AggregateTest { + input: Vec>, + output: Option>, +} + +const ETH_HEADER_FILE: &str = include_str!("../testdata/eth-headers/1699693797.394876721s.json"); +const AGGREGATE_1: &str = include_str!("../testdata/bls-tests/aggregate/aggregate_0x0000000000000000000000000000000000000000000000000000000000000000.json"); +const AGGREGATE_2: &str = include_str!("../testdata/bls-tests/aggregate/aggregate_0x5656565656565656565656565656565656565656565656565656565656565656.json"); +const AGGREGATE_3: &str = include_str!("../testdata/bls-tests/aggregate/aggregate_0xabababababababababababababababababababababababababababababababab.json"); +const AGGREGATE_4: &str = + include_str!("../testdata/bls-tests/aggregate/aggregate_infinity_signature.json"); +const AGGREGATE_5: &str = + include_str!("../testdata/bls-tests/aggregate/aggregate_na_signatures.json"); +const AGGREGATE_6: &str = + include_str!("../testdata/bls-tests/aggregate/aggregate_single_signature.json"); + +fn read_eth_header_file() -> EthHeaders { + serde_json::from_str(ETH_HEADER_FILE).unwrap() +} + +fn read_aggregate_test(json: &str) -> AggregateTest { + let file: AggregateTestFile = serde_json::from_str(json).unwrap(); + AggregateTest { + input: file + .input + .into_iter() + .map(|entry| hex::decode(&entry[2..]).unwrap()) + .collect(), + output: file.output.map(|entry| hex::decode(&entry[2..]).unwrap()), + } +} + +// Test for https://eth2book.info/capella/part2/building_blocks/signatures/#aggregating-public-keys +#[test] +fn bls12_318_aggregate_g1_works() { + let file = read_eth_header_file(); + + let pubkeys: Vec<&[u8]> = file.public_keys.iter().map(|m| m.0.as_slice()).collect(); + let pubkeys_combined: Vec = pubkeys.concat(); + + let sum = bls12_318_aggregate_g1(&pubkeys_combined).unwrap(); + assert_eq!(sum.as_slice(), file.aggregate_pubkey); +} + +// Test for https://eth2book.info/capella/part2/building_blocks/signatures/#aggregating-signatures +#[test] +fn bls12_318_aggregate_g2_works() { + for json in [ + AGGREGATE_1, + AGGREGATE_2, + AGGREGATE_3, + AGGREGATE_4, + AGGREGATE_5, + AGGREGATE_6, + ] { + let test = read_aggregate_test(json); + let signatures: Vec<&[u8]> = test.input.iter().map(|m| m.as_slice()).collect(); + let signatures_combined: Vec = signatures.concat(); + let sum = bls12_318_aggregate_g2(&signatures_combined).unwrap(); + match test.output { + Some(expected) => assert_eq!(sum.as_slice(), expected), + None => assert_eq!( + sum.as_slice(), + // point at infinity – is this what we want here? + [ + // C_bit set (compression) + // I_bit set (point at infinity) + // S_bit unset (sign) + 0b11000000, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 + ] + ), + } + } +} From 1e267969be062204b560fd9d51ab60d3945af828 Mon Sep 17 00:00:00 2001 From: Aumetra Weisman Date: Tue, 2 Apr 2024 12:29:11 +0200 Subject: [PATCH 02/79] Regenerate lockfiles --- Cargo.lock | 2 +- contracts/burner/Cargo.lock | 132 ++++++++++++++++++++++--- contracts/crypto-verify/Cargo.lock | 136 +++++++++++++++++++++++--- contracts/cyberpunk/Cargo.lock | 132 ++++++++++++++++++++++--- contracts/empty/Cargo.lock | 132 ++++++++++++++++++++++--- contracts/floaty/Cargo.lock | 132 ++++++++++++++++++++++--- contracts/hackatom/Cargo.lock | 134 ++++++++++++++++++++++--- contracts/ibc-reflect-send/Cargo.lock | 132 ++++++++++++++++++++++--- contracts/ibc-reflect/Cargo.lock | 132 ++++++++++++++++++++++--- contracts/queue/Cargo.lock | 132 ++++++++++++++++++++++--- contracts/reflect/Cargo.lock | 132 ++++++++++++++++++++++--- contracts/staking/Cargo.lock | 132 ++++++++++++++++++++++--- contracts/virus/Cargo.lock | 132 ++++++++++++++++++++++--- packages/crypto/Cargo.toml | 2 +- 14 files changed, 1421 insertions(+), 173 deletions(-) diff --git a/Cargo.lock b/Cargo.lock index abc1d8ff25..39119f91bf 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -477,7 +477,7 @@ dependencies = [ name = "cosmwasm-crypto" version = "2.0.1" dependencies = [ - "base64 0.21.7", + "base64 0.22.0", "base64-serde", "bls12_381", "criterion", diff --git a/contracts/burner/Cargo.lock b/contracts/burner/Cargo.lock index bf40b531fd..179649e993 100644 --- a/contracts/burner/Cargo.lock +++ b/contracts/burner/Cargo.lock @@ -103,6 +103,27 @@ version = "2.4.2" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "ed570934406eb16438a4e976b1b4500774099c13b8cb96eec99f620f05090ddf" +[[package]] +name = "bitvec" +version = "1.0.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1bc2832c24239b0141d5674bb9174f9d68a8b5b3f2753311927c172ca46f7e9c" +dependencies = [ + "funty", + "radium", + "tap", + "wyz", +] + +[[package]] +name = "block-buffer" +version = "0.9.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4152116fd6e9dadb291ae18fc1ec3575ed6d84c29642d97890f4b4a3417297e4" +dependencies = [ + "generic-array", +] + [[package]] name = "block-buffer" version = "0.10.2" @@ -112,6 +133,20 @@ dependencies = [ "generic-array", ] +[[package]] +name = "bls12_381" +version = "0.8.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d7bc6d6292be3a19e6379786dac800f551e5865a5bb51ebbe3064ab80433f403" +dependencies = [ + "digest 0.9.0", + "ff", + "group", + "pairing", + "rand_core", + "subtle", +] + [[package]] name = "bnum" version = "0.11.0" @@ -217,7 +252,7 @@ dependencies = [ "hex", "schemars", "serde", - "sha2", + "sha2 0.10.8", "static_assertions", "thiserror", ] @@ -226,13 +261,17 @@ dependencies = [ name = "cosmwasm-crypto" version = "2.0.1" dependencies = [ + "bls12_381", "derive_more", - "digest", + "digest 0.10.7", "ecdsa", "ed25519-zebra", "k256", "p256", + "pairing", "rand_core", + "rayon", + "sha2 0.9.9", "thiserror", ] @@ -280,7 +319,7 @@ dependencies = [ "schemars", "serde", "serde-json-wasm", - "sha2", + "sha2 0.10.8", "thiserror", ] @@ -300,7 +339,7 @@ dependencies = [ "schemars", "serde", "serde_json", - "sha2", + "sha2 0.10.8", "strum", "thiserror", "tracing", @@ -484,7 +523,7 @@ dependencies = [ "cfg-if", "cpufeatures", "curve25519-dalek-derive", - "digest", + "digest 0.10.7", "fiat-crypto", "platforms", "rustc_version", @@ -592,13 +631,22 @@ dependencies = [ "unicode-xid", ] +[[package]] +name = "digest" +version = "0.9.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d3dd60d1080a57a05ab032377049e0591415d2b31afd7028356dbf3cc6dcb066" +dependencies = [ + "generic-array", +] + [[package]] name = "digest" version = "0.10.7" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "9ed9a281f7bc9b7576e61468ba615a66a5c8cfdff42420a70aa82701a3b1e292" dependencies = [ - "block-buffer", + "block-buffer 0.10.2", "const-oid", "crypto-common", "subtle", @@ -643,7 +691,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "a4b1e0c257a9e9f25f90ff76d7a68360ed497ee519c8e428d1825ef0000799d4" dependencies = [ "der", - "digest", + "digest 0.10.7", "elliptic-curve", "rfc6979", "signature", @@ -669,7 +717,7 @@ dependencies = [ "hashbrown 0.14.3", "hex", "rand_core", - "sha2", + "sha2 0.10.8", "zeroize", ] @@ -687,7 +735,7 @@ checksum = "b5e6043086bf7973472e0c7dff2142ea0b680d30e18d9cc40f267efbf222bd47" dependencies = [ "base16ct", "crypto-bigint", - "digest", + "digest 0.10.7", "ff", "generic-array", "group", @@ -756,6 +804,7 @@ version = "0.13.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "ded41244b729663b1e574f1b4fb731469f69f79c17667b5d776b16cda0479449" dependencies = [ + "bitvec", "rand_core", "subtle", ] @@ -772,6 +821,12 @@ version = "1.0.7" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "3f9eec918d3f24069decb9af1554cad7c880e2da24a9afd88aca000531ab82c1" +[[package]] +name = "funty" +version = "2.0.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e6d5a32815ae3f33302d95fdcb2ce17862f8c65363dcfd29360480ba1001fc9c" + [[package]] name = "fxhash" version = "0.2.1" @@ -868,7 +923,7 @@ version = "0.12.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "6c49c37c09c17a53d937dfbb742eb3a961d65a994e6bcdcf37e7399d0cc8ab5e" dependencies = [ - "digest", + "digest 0.10.7", ] [[package]] @@ -921,7 +976,7 @@ dependencies = [ "cfg-if", "ecdsa", "elliptic-curve", - "sha2", + "sha2 0.10.8", ] [[package]] @@ -1043,6 +1098,12 @@ version = "1.19.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "3fdb12b2476b595f9358c5161aa467c2438859caa136dec86c26fdd2efe17b92" +[[package]] +name = "opaque-debug" +version = "0.3.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c08d65885ee38876c4f86fa503fb49d7b507c2b62552df7c70b2fce627e06381" + [[package]] name = "p256" version = "0.13.2" @@ -1052,7 +1113,16 @@ dependencies = [ "ecdsa", "elliptic-curve", "primeorder", - "sha2", + "sha2 0.10.8", +] + +[[package]] +name = "pairing" +version = "0.23.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "81fec4625e73cf41ef4bb6846cafa6d44736525f442ba45e407c4a000a13996f" +dependencies = [ + "group", ] [[package]] @@ -1151,6 +1221,12 @@ dependencies = [ "proc-macro2", ] +[[package]] +name = "radium" +version = "0.7.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "dc33ff2d4973d518d823d61aa239014831e521c75da58e3df4840d3f47749d09" + [[package]] name = "rand_core" version = "0.6.4" @@ -1408,6 +1484,19 @@ dependencies = [ "serde", ] +[[package]] +name = "sha2" +version = "0.9.9" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4d58a1e1bf39749807d89cf2d98ac2dfa0ff1cb3faa38fbb64dd88ac8013d800" +dependencies = [ + "block-buffer 0.9.0", + "cfg-if", + "cpufeatures", + "digest 0.9.0", + "opaque-debug", +] + [[package]] name = "sha2" version = "0.10.8" @@ -1416,7 +1505,7 @@ checksum = "793db75ad2bcafc3ffa7c68b215fee268f537982cd901d132f89c6343f3a3dc8" dependencies = [ "cfg-if", "cpufeatures", - "digest", + "digest 0.10.7", ] [[package]] @@ -1435,7 +1524,7 @@ version = "2.1.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "5e1788eed21689f9cf370582dfc467ef36ed9c707f073528ddafa8d83e3b8500" dependencies = [ - "digest", + "digest 0.10.7", "rand_core", ] @@ -1519,6 +1608,12 @@ dependencies = [ "unicode-ident", ] +[[package]] +name = "tap" +version = "1.0.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "55937e1799185b12863d447f42597ed69d9928686b8d88a1df17376a097d8369" + [[package]] name = "target-lexicon" version = "0.12.7" @@ -1954,6 +2049,15 @@ version = "0.48.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "1a515f5799fe4961cb532f983ce2b23082366b898e52ffbce459c86f67c8378a" +[[package]] +name = "wyz" +version = "0.5.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "05f360fc0b24296329c78fda852a1e9ae82de9cf7b27dae4b7f62f118f77b9ed" +dependencies = [ + "tap", +] + [[package]] name = "zerocopy" version = "0.7.32" diff --git a/contracts/crypto-verify/Cargo.lock b/contracts/crypto-verify/Cargo.lock index c949e716bc..3189d7797f 100644 --- a/contracts/crypto-verify/Cargo.lock +++ b/contracts/crypto-verify/Cargo.lock @@ -109,6 +109,27 @@ version = "2.4.2" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "ed570934406eb16438a4e976b1b4500774099c13b8cb96eec99f620f05090ddf" +[[package]] +name = "bitvec" +version = "1.0.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1bc2832c24239b0141d5674bb9174f9d68a8b5b3f2753311927c172ca46f7e9c" +dependencies = [ + "funty", + "radium", + "tap", + "wyz", +] + +[[package]] +name = "block-buffer" +version = "0.9.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4152116fd6e9dadb291ae18fc1ec3575ed6d84c29642d97890f4b4a3417297e4" +dependencies = [ + "generic-array", +] + [[package]] name = "block-buffer" version = "0.10.2" @@ -118,6 +139,20 @@ dependencies = [ "generic-array", ] +[[package]] +name = "bls12_381" +version = "0.8.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d7bc6d6292be3a19e6379786dac800f551e5865a5bb51ebbe3064ab80433f403" +dependencies = [ + "digest 0.9.0", + "ff", + "group", + "pairing", + "rand_core", + "subtle", +] + [[package]] name = "bnum" version = "0.11.0" @@ -212,7 +247,7 @@ dependencies = [ "hex", "schemars", "serde", - "sha2", + "sha2 0.10.8", "static_assertions", "thiserror", ] @@ -221,13 +256,17 @@ dependencies = [ name = "cosmwasm-crypto" version = "2.0.1" dependencies = [ + "bls12_381", "derive_more", - "digest", + "digest 0.10.7", "ecdsa", "ed25519-zebra", "k256", "p256", + "pairing", "rand_core", + "rayon", + "sha2 0.9.9", "thiserror", ] @@ -275,7 +314,7 @@ dependencies = [ "schemars", "serde", "serde-json-wasm", - "sha2", + "sha2 0.10.8", "thiserror", ] @@ -295,7 +334,7 @@ dependencies = [ "schemars", "serde", "serde_json", - "sha2", + "sha2 0.10.8", "strum", "thiserror", "tracing", @@ -484,7 +523,7 @@ dependencies = [ "rlp", "schemars", "serde", - "sha2", + "sha2 0.10.8", "sha3", ] @@ -497,7 +536,7 @@ dependencies = [ "cfg-if", "cpufeatures", "curve25519-dalek-derive", - "digest", + "digest 0.10.7", "fiat-crypto", "platforms", "rustc_version", @@ -605,13 +644,22 @@ dependencies = [ "unicode-xid", ] +[[package]] +name = "digest" +version = "0.9.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d3dd60d1080a57a05ab032377049e0591415d2b31afd7028356dbf3cc6dcb066" +dependencies = [ + "generic-array", +] + [[package]] name = "digest" version = "0.10.7" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "9ed9a281f7bc9b7576e61468ba615a66a5c8cfdff42420a70aa82701a3b1e292" dependencies = [ - "block-buffer", + "block-buffer 0.10.2", "const-oid", "crypto-common", "subtle", @@ -656,7 +704,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "a4b1e0c257a9e9f25f90ff76d7a68360ed497ee519c8e428d1825ef0000799d4" dependencies = [ "der", - "digest", + "digest 0.10.7", "elliptic-curve", "rfc6979", "signature", @@ -683,7 +731,7 @@ dependencies = [ "hashbrown 0.14.3", "hex", "rand_core", - "sha2", + "sha2 0.10.8", "zeroize", ] @@ -701,7 +749,7 @@ checksum = "b5e6043086bf7973472e0c7dff2142ea0b680d30e18d9cc40f267efbf222bd47" dependencies = [ "base16ct", "crypto-bigint", - "digest", + "digest 0.10.7", "ff", "generic-array", "group", @@ -771,6 +819,7 @@ version = "0.13.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "ded41244b729663b1e574f1b4fb731469f69f79c17667b5d776b16cda0479449" dependencies = [ + "bitvec", "rand_core", "subtle", ] @@ -787,6 +836,12 @@ version = "1.0.7" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "3f9eec918d3f24069decb9af1554cad7c880e2da24a9afd88aca000531ab82c1" +[[package]] +name = "funty" +version = "2.0.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e6d5a32815ae3f33302d95fdcb2ce17862f8c65363dcfd29360480ba1001fc9c" + [[package]] name = "fxhash" version = "0.2.1" @@ -889,7 +944,7 @@ version = "0.12.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "6c49c37c09c17a53d937dfbb742eb3a961d65a994e6bcdcf37e7399d0cc8ab5e" dependencies = [ - "digest", + "digest 0.10.7", ] [[package]] @@ -942,7 +997,7 @@ dependencies = [ "cfg-if", "ecdsa", "elliptic-curve", - "sha2", + "sha2 0.10.8", ] [[package]] @@ -1070,6 +1125,12 @@ version = "1.19.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "3fdb12b2476b595f9358c5161aa467c2438859caa136dec86c26fdd2efe17b92" +[[package]] +name = "opaque-debug" +version = "0.3.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c08d65885ee38876c4f86fa503fb49d7b507c2b62552df7c70b2fce627e06381" + [[package]] name = "p256" version = "0.13.2" @@ -1079,7 +1140,16 @@ dependencies = [ "ecdsa", "elliptic-curve", "primeorder", - "sha2", + "sha2 0.10.8", +] + +[[package]] +name = "pairing" +version = "0.23.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "81fec4625e73cf41ef4bb6846cafa6d44736525f442ba45e407c4a000a13996f" +dependencies = [ + "group", ] [[package]] @@ -1188,6 +1258,12 @@ dependencies = [ "proc-macro2", ] +[[package]] +name = "radium" +version = "0.7.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "dc33ff2d4973d518d823d61aa239014831e521c75da58e3df4840d3f47749d09" + [[package]] name = "rand_core" version = "0.6.4" @@ -1462,6 +1538,19 @@ dependencies = [ "serde", ] +[[package]] +name = "sha2" +version = "0.9.9" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4d58a1e1bf39749807d89cf2d98ac2dfa0ff1cb3faa38fbb64dd88ac8013d800" +dependencies = [ + "block-buffer 0.9.0", + "cfg-if", + "cpufeatures", + "digest 0.9.0", + "opaque-debug", +] + [[package]] name = "sha2" version = "0.10.8" @@ -1470,7 +1559,7 @@ checksum = "793db75ad2bcafc3ffa7c68b215fee268f537982cd901d132f89c6343f3a3dc8" dependencies = [ "cfg-if", "cpufeatures", - "digest", + "digest 0.10.7", ] [[package]] @@ -1479,7 +1568,7 @@ version = "0.10.2" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "0a31480366ec990f395a61b7c08122d99bd40544fdb5abcfc1b06bb29994312c" dependencies = [ - "digest", + "digest 0.10.7", "keccak", ] @@ -1499,7 +1588,7 @@ version = "2.1.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "5e1788eed21689f9cf370582dfc467ef36ed9c707f073528ddafa8d83e3b8500" dependencies = [ - "digest", + "digest 0.10.7", "rand_core", ] @@ -1593,6 +1682,12 @@ dependencies = [ "unicode-ident", ] +[[package]] +name = "tap" +version = "1.0.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "55937e1799185b12863d447f42597ed69d9928686b8d88a1df17376a097d8369" + [[package]] name = "target-lexicon" version = "0.12.7" @@ -2028,6 +2123,15 @@ version = "0.48.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "1a515f5799fe4961cb532f983ce2b23082366b898e52ffbce459c86f67c8378a" +[[package]] +name = "wyz" +version = "0.5.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "05f360fc0b24296329c78fda852a1e9ae82de9cf7b27dae4b7f62f118f77b9ed" +dependencies = [ + "tap", +] + [[package]] name = "zerocopy" version = "0.7.32" diff --git a/contracts/cyberpunk/Cargo.lock b/contracts/cyberpunk/Cargo.lock index 1508ee0e12..32ea329475 100644 --- a/contracts/cyberpunk/Cargo.lock +++ b/contracts/cyberpunk/Cargo.lock @@ -115,6 +115,18 @@ version = "2.4.2" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "ed570934406eb16438a4e976b1b4500774099c13b8cb96eec99f620f05090ddf" +[[package]] +name = "bitvec" +version = "1.0.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1bc2832c24239b0141d5674bb9174f9d68a8b5b3f2753311927c172ca46f7e9c" +dependencies = [ + "funty", + "radium", + "tap", + "wyz", +] + [[package]] name = "blake2b_simd" version = "1.0.2" @@ -126,6 +138,15 @@ dependencies = [ "constant_time_eq", ] +[[package]] +name = "block-buffer" +version = "0.9.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4152116fd6e9dadb291ae18fc1ec3575ed6d84c29642d97890f4b4a3417297e4" +dependencies = [ + "generic-array", +] + [[package]] name = "block-buffer" version = "0.10.2" @@ -135,6 +156,20 @@ dependencies = [ "generic-array", ] +[[package]] +name = "bls12_381" +version = "0.8.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d7bc6d6292be3a19e6379786dac800f551e5865a5bb51ebbe3064ab80433f403" +dependencies = [ + "digest 0.9.0", + "ff", + "group", + "pairing", + "rand_core", + "subtle", +] + [[package]] name = "bnum" version = "0.11.0" @@ -235,7 +270,7 @@ dependencies = [ "hex", "schemars", "serde", - "sha2", + "sha2 0.10.8", "static_assertions", "thiserror", ] @@ -244,13 +279,17 @@ dependencies = [ name = "cosmwasm-crypto" version = "2.0.1" dependencies = [ + "bls12_381", "derive_more", - "digest", + "digest 0.10.7", "ecdsa", "ed25519-zebra", "k256", "p256", + "pairing", "rand_core", + "rayon", + "sha2 0.9.9", "thiserror", ] @@ -298,7 +337,7 @@ dependencies = [ "schemars", "serde", "serde-json-wasm", - "sha2", + "sha2 0.10.8", "thiserror", ] @@ -318,7 +357,7 @@ dependencies = [ "schemars", "serde", "serde_json", - "sha2", + "sha2 0.10.8", "strum", "thiserror", "tracing", @@ -502,7 +541,7 @@ dependencies = [ "cfg-if", "cpufeatures", "curve25519-dalek-derive", - "digest", + "digest 0.10.7", "fiat-crypto", "platforms", "rustc_version", @@ -622,13 +661,22 @@ dependencies = [ "unicode-xid", ] +[[package]] +name = "digest" +version = "0.9.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d3dd60d1080a57a05ab032377049e0591415d2b31afd7028356dbf3cc6dcb066" +dependencies = [ + "generic-array", +] + [[package]] name = "digest" version = "0.10.7" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "9ed9a281f7bc9b7576e61468ba615a66a5c8cfdff42420a70aa82701a3b1e292" dependencies = [ - "block-buffer", + "block-buffer 0.10.2", "const-oid", "crypto-common", "subtle", @@ -673,7 +721,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "a4b1e0c257a9e9f25f90ff76d7a68360ed497ee519c8e428d1825ef0000799d4" dependencies = [ "der", - "digest", + "digest 0.10.7", "elliptic-curve", "rfc6979", "signature", @@ -699,7 +747,7 @@ dependencies = [ "hashbrown 0.14.3", "hex", "rand_core", - "sha2", + "sha2 0.10.8", "zeroize", ] @@ -717,7 +765,7 @@ checksum = "b5e6043086bf7973472e0c7dff2142ea0b680d30e18d9cc40f267efbf222bd47" dependencies = [ "base16ct", "crypto-bigint", - "digest", + "digest 0.10.7", "ff", "generic-array", "group", @@ -816,6 +864,7 @@ version = "0.13.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "ded41244b729663b1e574f1b4fb731469f69f79c17667b5d776b16cda0479449" dependencies = [ + "bitvec", "rand_core", "subtle", ] @@ -832,6 +881,12 @@ version = "1.0.7" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "3f9eec918d3f24069decb9af1554cad7c880e2da24a9afd88aca000531ab82c1" +[[package]] +name = "funty" +version = "2.0.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e6d5a32815ae3f33302d95fdcb2ce17862f8c65363dcfd29360480ba1001fc9c" + [[package]] name = "fxhash" version = "0.2.1" @@ -934,7 +989,7 @@ version = "0.12.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "6c49c37c09c17a53d937dfbb742eb3a961d65a994e6bcdcf37e7399d0cc8ab5e" dependencies = [ - "digest", + "digest 0.10.7", ] [[package]] @@ -1007,7 +1062,7 @@ dependencies = [ "cfg-if", "ecdsa", "elliptic-curve", - "sha2", + "sha2 0.10.8", ] [[package]] @@ -1135,6 +1190,12 @@ version = "1.19.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "3fdb12b2476b595f9358c5161aa467c2438859caa136dec86c26fdd2efe17b92" +[[package]] +name = "opaque-debug" +version = "0.3.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c08d65885ee38876c4f86fa503fb49d7b507c2b62552df7c70b2fce627e06381" + [[package]] name = "p256" version = "0.13.2" @@ -1144,7 +1205,16 @@ dependencies = [ "ecdsa", "elliptic-curve", "primeorder", - "sha2", + "sha2 0.10.8", +] + +[[package]] +name = "pairing" +version = "0.23.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "81fec4625e73cf41ef4bb6846cafa6d44736525f442ba45e407c4a000a13996f" +dependencies = [ + "group", ] [[package]] @@ -1243,6 +1313,12 @@ dependencies = [ "proc-macro2", ] +[[package]] +name = "radium" +version = "0.7.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "dc33ff2d4973d518d823d61aa239014831e521c75da58e3df4840d3f47749d09" + [[package]] name = "rand_core" version = "0.6.4" @@ -1525,6 +1601,19 @@ dependencies = [ "serde", ] +[[package]] +name = "sha2" +version = "0.9.9" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4d58a1e1bf39749807d89cf2d98ac2dfa0ff1cb3faa38fbb64dd88ac8013d800" +dependencies = [ + "block-buffer 0.9.0", + "cfg-if", + "cpufeatures", + "digest 0.9.0", + "opaque-debug", +] + [[package]] name = "sha2" version = "0.10.8" @@ -1533,7 +1622,7 @@ checksum = "793db75ad2bcafc3ffa7c68b215fee268f537982cd901d132f89c6343f3a3dc8" dependencies = [ "cfg-if", "cpufeatures", - "digest", + "digest 0.10.7", ] [[package]] @@ -1552,7 +1641,7 @@ version = "2.1.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "5e1788eed21689f9cf370582dfc467ef36ed9c707f073528ddafa8d83e3b8500" dependencies = [ - "digest", + "digest 0.10.7", "rand_core", ] @@ -1636,6 +1725,12 @@ dependencies = [ "unicode-ident", ] +[[package]] +name = "tap" +version = "1.0.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "55937e1799185b12863d447f42597ed69d9928686b8d88a1df17376a097d8369" + [[package]] name = "target-lexicon" version = "0.12.7" @@ -2159,6 +2254,15 @@ version = "0.48.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "1a515f5799fe4961cb532f983ce2b23082366b898e52ffbce459c86f67c8378a" +[[package]] +name = "wyz" +version = "0.5.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "05f360fc0b24296329c78fda852a1e9ae82de9cf7b27dae4b7f62f118f77b9ed" +dependencies = [ + "tap", +] + [[package]] name = "zerocopy" version = "0.7.32" diff --git a/contracts/empty/Cargo.lock b/contracts/empty/Cargo.lock index 7f256a5b85..5d2e495e8b 100644 --- a/contracts/empty/Cargo.lock +++ b/contracts/empty/Cargo.lock @@ -103,6 +103,27 @@ version = "2.4.2" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "ed570934406eb16438a4e976b1b4500774099c13b8cb96eec99f620f05090ddf" +[[package]] +name = "bitvec" +version = "1.0.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1bc2832c24239b0141d5674bb9174f9d68a8b5b3f2753311927c172ca46f7e9c" +dependencies = [ + "funty", + "radium", + "tap", + "wyz", +] + +[[package]] +name = "block-buffer" +version = "0.9.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4152116fd6e9dadb291ae18fc1ec3575ed6d84c29642d97890f4b4a3417297e4" +dependencies = [ + "generic-array", +] + [[package]] name = "block-buffer" version = "0.10.2" @@ -112,6 +133,20 @@ dependencies = [ "generic-array", ] +[[package]] +name = "bls12_381" +version = "0.8.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d7bc6d6292be3a19e6379786dac800f551e5865a5bb51ebbe3064ab80433f403" +dependencies = [ + "digest 0.9.0", + "ff", + "group", + "pairing", + "rand_core", + "subtle", +] + [[package]] name = "bnum" version = "0.11.0" @@ -206,7 +241,7 @@ dependencies = [ "hex", "schemars", "serde", - "sha2", + "sha2 0.10.8", "static_assertions", "thiserror", ] @@ -215,13 +250,17 @@ dependencies = [ name = "cosmwasm-crypto" version = "2.0.1" dependencies = [ + "bls12_381", "derive_more", - "digest", + "digest 0.10.7", "ecdsa", "ed25519-zebra", "k256", "p256", + "pairing", "rand_core", + "rayon", + "sha2 0.9.9", "thiserror", ] @@ -269,7 +308,7 @@ dependencies = [ "schemars", "serde", "serde-json-wasm", - "sha2", + "sha2 0.10.8", "thiserror", ] @@ -289,7 +328,7 @@ dependencies = [ "schemars", "serde", "serde_json", - "sha2", + "sha2 0.10.8", "strum", "thiserror", "tracing", @@ -473,7 +512,7 @@ dependencies = [ "cfg-if", "cpufeatures", "curve25519-dalek-derive", - "digest", + "digest 0.10.7", "fiat-crypto", "platforms", "rustc_version", @@ -581,13 +620,22 @@ dependencies = [ "unicode-xid", ] +[[package]] +name = "digest" +version = "0.9.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d3dd60d1080a57a05ab032377049e0591415d2b31afd7028356dbf3cc6dcb066" +dependencies = [ + "generic-array", +] + [[package]] name = "digest" version = "0.10.7" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "9ed9a281f7bc9b7576e61468ba615a66a5c8cfdff42420a70aa82701a3b1e292" dependencies = [ - "block-buffer", + "block-buffer 0.10.2", "const-oid", "crypto-common", "subtle", @@ -632,7 +680,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "a4b1e0c257a9e9f25f90ff76d7a68360ed497ee519c8e428d1825ef0000799d4" dependencies = [ "der", - "digest", + "digest 0.10.7", "elliptic-curve", "rfc6979", "signature", @@ -658,7 +706,7 @@ dependencies = [ "hashbrown 0.14.3", "hex", "rand_core", - "sha2", + "sha2 0.10.8", "zeroize", ] @@ -676,7 +724,7 @@ checksum = "b5e6043086bf7973472e0c7dff2142ea0b680d30e18d9cc40f267efbf222bd47" dependencies = [ "base16ct", "crypto-bigint", - "digest", + "digest 0.10.7", "ff", "generic-array", "group", @@ -755,6 +803,7 @@ version = "0.13.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "ded41244b729663b1e574f1b4fb731469f69f79c17667b5d776b16cda0479449" dependencies = [ + "bitvec", "rand_core", "subtle", ] @@ -771,6 +820,12 @@ version = "1.0.7" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "3f9eec918d3f24069decb9af1554cad7c880e2da24a9afd88aca000531ab82c1" +[[package]] +name = "funty" +version = "2.0.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e6d5a32815ae3f33302d95fdcb2ce17862f8c65363dcfd29360480ba1001fc9c" + [[package]] name = "fxhash" version = "0.2.1" @@ -867,7 +922,7 @@ version = "0.12.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "6c49c37c09c17a53d937dfbb742eb3a961d65a994e6bcdcf37e7399d0cc8ab5e" dependencies = [ - "digest", + "digest 0.10.7", ] [[package]] @@ -920,7 +975,7 @@ dependencies = [ "cfg-if", "ecdsa", "elliptic-curve", - "sha2", + "sha2 0.10.8", ] [[package]] @@ -1042,6 +1097,12 @@ version = "1.19.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "3fdb12b2476b595f9358c5161aa467c2438859caa136dec86c26fdd2efe17b92" +[[package]] +name = "opaque-debug" +version = "0.3.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c08d65885ee38876c4f86fa503fb49d7b507c2b62552df7c70b2fce627e06381" + [[package]] name = "p256" version = "0.13.2" @@ -1051,7 +1112,16 @@ dependencies = [ "ecdsa", "elliptic-curve", "primeorder", - "sha2", + "sha2 0.10.8", +] + +[[package]] +name = "pairing" +version = "0.23.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "81fec4625e73cf41ef4bb6846cafa6d44736525f442ba45e407c4a000a13996f" +dependencies = [ + "group", ] [[package]] @@ -1150,6 +1220,12 @@ dependencies = [ "proc-macro2", ] +[[package]] +name = "radium" +version = "0.7.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "dc33ff2d4973d518d823d61aa239014831e521c75da58e3df4840d3f47749d09" + [[package]] name = "rand_core" version = "0.6.4" @@ -1407,6 +1483,19 @@ dependencies = [ "serde", ] +[[package]] +name = "sha2" +version = "0.9.9" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4d58a1e1bf39749807d89cf2d98ac2dfa0ff1cb3faa38fbb64dd88ac8013d800" +dependencies = [ + "block-buffer 0.9.0", + "cfg-if", + "cpufeatures", + "digest 0.9.0", + "opaque-debug", +] + [[package]] name = "sha2" version = "0.10.8" @@ -1415,7 +1504,7 @@ checksum = "793db75ad2bcafc3ffa7c68b215fee268f537982cd901d132f89c6343f3a3dc8" dependencies = [ "cfg-if", "cpufeatures", - "digest", + "digest 0.10.7", ] [[package]] @@ -1434,7 +1523,7 @@ version = "2.1.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "5e1788eed21689f9cf370582dfc467ef36ed9c707f073528ddafa8d83e3b8500" dependencies = [ - "digest", + "digest 0.10.7", "rand_core", ] @@ -1518,6 +1607,12 @@ dependencies = [ "unicode-ident", ] +[[package]] +name = "tap" +version = "1.0.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "55937e1799185b12863d447f42597ed69d9928686b8d88a1df17376a097d8369" + [[package]] name = "target-lexicon" version = "0.12.7" @@ -1953,6 +2048,15 @@ version = "0.48.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "1a515f5799fe4961cb532f983ce2b23082366b898e52ffbce459c86f67c8378a" +[[package]] +name = "wyz" +version = "0.5.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "05f360fc0b24296329c78fda852a1e9ae82de9cf7b27dae4b7f62f118f77b9ed" +dependencies = [ + "tap", +] + [[package]] name = "zerocopy" version = "0.7.32" diff --git a/contracts/floaty/Cargo.lock b/contracts/floaty/Cargo.lock index 4ade5373ba..5bda65ffef 100644 --- a/contracts/floaty/Cargo.lock +++ b/contracts/floaty/Cargo.lock @@ -103,6 +103,27 @@ version = "2.4.2" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "ed570934406eb16438a4e976b1b4500774099c13b8cb96eec99f620f05090ddf" +[[package]] +name = "bitvec" +version = "1.0.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1bc2832c24239b0141d5674bb9174f9d68a8b5b3f2753311927c172ca46f7e9c" +dependencies = [ + "funty", + "radium", + "tap", + "wyz", +] + +[[package]] +name = "block-buffer" +version = "0.9.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4152116fd6e9dadb291ae18fc1ec3575ed6d84c29642d97890f4b4a3417297e4" +dependencies = [ + "generic-array", +] + [[package]] name = "block-buffer" version = "0.10.2" @@ -112,6 +133,20 @@ dependencies = [ "generic-array", ] +[[package]] +name = "bls12_381" +version = "0.8.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d7bc6d6292be3a19e6379786dac800f551e5865a5bb51ebbe3064ab80433f403" +dependencies = [ + "digest 0.9.0", + "ff", + "group", + "pairing", + "rand_core", + "subtle", +] + [[package]] name = "bnum" version = "0.11.0" @@ -206,7 +241,7 @@ dependencies = [ "hex", "schemars", "serde", - "sha2", + "sha2 0.10.8", "static_assertions", "thiserror", ] @@ -215,13 +250,17 @@ dependencies = [ name = "cosmwasm-crypto" version = "2.0.1" dependencies = [ + "bls12_381", "derive_more", - "digest", + "digest 0.10.7", "ecdsa", "ed25519-zebra", "k256", "p256", + "pairing", "rand_core", + "rayon", + "sha2 0.9.9", "thiserror", ] @@ -269,7 +308,7 @@ dependencies = [ "schemars", "serde", "serde-json-wasm", - "sha2", + "sha2 0.10.8", "thiserror", ] @@ -289,7 +328,7 @@ dependencies = [ "schemars", "serde", "serde_json", - "sha2", + "sha2 0.10.8", "strum", "thiserror", "tracing", @@ -473,7 +512,7 @@ dependencies = [ "cfg-if", "cpufeatures", "curve25519-dalek-derive", - "digest", + "digest 0.10.7", "fiat-crypto", "platforms", "rustc_version", @@ -581,13 +620,22 @@ dependencies = [ "unicode-xid", ] +[[package]] +name = "digest" +version = "0.9.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d3dd60d1080a57a05ab032377049e0591415d2b31afd7028356dbf3cc6dcb066" +dependencies = [ + "generic-array", +] + [[package]] name = "digest" version = "0.10.7" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "9ed9a281f7bc9b7576e61468ba615a66a5c8cfdff42420a70aa82701a3b1e292" dependencies = [ - "block-buffer", + "block-buffer 0.10.2", "const-oid", "crypto-common", "subtle", @@ -632,7 +680,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "a4b1e0c257a9e9f25f90ff76d7a68360ed497ee519c8e428d1825ef0000799d4" dependencies = [ "der", - "digest", + "digest 0.10.7", "elliptic-curve", "rfc6979", "signature", @@ -658,7 +706,7 @@ dependencies = [ "hashbrown 0.14.3", "hex", "rand_core", - "sha2", + "sha2 0.10.8", "zeroize", ] @@ -676,7 +724,7 @@ checksum = "b5e6043086bf7973472e0c7dff2142ea0b680d30e18d9cc40f267efbf222bd47" dependencies = [ "base16ct", "crypto-bigint", - "digest", + "digest 0.10.7", "ff", "generic-array", "group", @@ -745,6 +793,7 @@ version = "0.13.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "ded41244b729663b1e574f1b4fb731469f69f79c17667b5d776b16cda0479449" dependencies = [ + "bitvec", "rand_core", "subtle", ] @@ -773,6 +822,12 @@ version = "1.0.7" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "3f9eec918d3f24069decb9af1554cad7c880e2da24a9afd88aca000531ab82c1" +[[package]] +name = "funty" +version = "2.0.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e6d5a32815ae3f33302d95fdcb2ce17862f8c65363dcfd29360480ba1001fc9c" + [[package]] name = "fxhash" version = "0.2.1" @@ -869,7 +924,7 @@ version = "0.12.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "6c49c37c09c17a53d937dfbb742eb3a961d65a994e6bcdcf37e7399d0cc8ab5e" dependencies = [ - "digest", + "digest 0.10.7", ] [[package]] @@ -922,7 +977,7 @@ dependencies = [ "cfg-if", "ecdsa", "elliptic-curve", - "sha2", + "sha2 0.10.8", ] [[package]] @@ -1044,6 +1099,12 @@ version = "1.19.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "3fdb12b2476b595f9358c5161aa467c2438859caa136dec86c26fdd2efe17b92" +[[package]] +name = "opaque-debug" +version = "0.3.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c08d65885ee38876c4f86fa503fb49d7b507c2b62552df7c70b2fce627e06381" + [[package]] name = "p256" version = "0.13.2" @@ -1053,7 +1114,16 @@ dependencies = [ "ecdsa", "elliptic-curve", "primeorder", - "sha2", + "sha2 0.10.8", +] + +[[package]] +name = "pairing" +version = "0.23.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "81fec4625e73cf41ef4bb6846cafa6d44736525f442ba45e407c4a000a13996f" +dependencies = [ + "group", ] [[package]] @@ -1158,6 +1228,12 @@ dependencies = [ "proc-macro2", ] +[[package]] +name = "radium" +version = "0.7.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "dc33ff2d4973d518d823d61aa239014831e521c75da58e3df4840d3f47749d09" + [[package]] name = "rand_chacha" version = "0.3.1" @@ -1425,6 +1501,19 @@ dependencies = [ "serde", ] +[[package]] +name = "sha2" +version = "0.9.9" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4d58a1e1bf39749807d89cf2d98ac2dfa0ff1cb3faa38fbb64dd88ac8013d800" +dependencies = [ + "block-buffer 0.9.0", + "cfg-if", + "cpufeatures", + "digest 0.9.0", + "opaque-debug", +] + [[package]] name = "sha2" version = "0.10.8" @@ -1433,7 +1522,7 @@ checksum = "793db75ad2bcafc3ffa7c68b215fee268f537982cd901d132f89c6343f3a3dc8" dependencies = [ "cfg-if", "cpufeatures", - "digest", + "digest 0.10.7", ] [[package]] @@ -1452,7 +1541,7 @@ version = "2.1.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "5e1788eed21689f9cf370582dfc467ef36ed9c707f073528ddafa8d83e3b8500" dependencies = [ - "digest", + "digest 0.10.7", "rand_core", ] @@ -1536,6 +1625,12 @@ dependencies = [ "unicode-ident", ] +[[package]] +name = "tap" +version = "1.0.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "55937e1799185b12863d447f42597ed69d9928686b8d88a1df17376a097d8369" + [[package]] name = "target-lexicon" version = "0.12.7" @@ -1971,6 +2066,15 @@ version = "0.48.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "1a515f5799fe4961cb532f983ce2b23082366b898e52ffbce459c86f67c8378a" +[[package]] +name = "wyz" +version = "0.5.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "05f360fc0b24296329c78fda852a1e9ae82de9cf7b27dae4b7f62f118f77b9ed" +dependencies = [ + "tap", +] + [[package]] name = "zerocopy" version = "0.7.32" diff --git a/contracts/hackatom/Cargo.lock b/contracts/hackatom/Cargo.lock index 936911c156..2eb79c7b66 100644 --- a/contracts/hackatom/Cargo.lock +++ b/contracts/hackatom/Cargo.lock @@ -103,6 +103,27 @@ version = "2.4.2" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "ed570934406eb16438a4e976b1b4500774099c13b8cb96eec99f620f05090ddf" +[[package]] +name = "bitvec" +version = "1.0.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1bc2832c24239b0141d5674bb9174f9d68a8b5b3f2753311927c172ca46f7e9c" +dependencies = [ + "funty", + "radium", + "tap", + "wyz", +] + +[[package]] +name = "block-buffer" +version = "0.9.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4152116fd6e9dadb291ae18fc1ec3575ed6d84c29642d97890f4b4a3417297e4" +dependencies = [ + "generic-array", +] + [[package]] name = "block-buffer" version = "0.10.2" @@ -112,6 +133,20 @@ dependencies = [ "generic-array", ] +[[package]] +name = "bls12_381" +version = "0.8.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d7bc6d6292be3a19e6379786dac800f551e5865a5bb51ebbe3064ab80433f403" +dependencies = [ + "digest 0.9.0", + "ff", + "group", + "pairing", + "rand_core", + "subtle", +] + [[package]] name = "bnum" version = "0.11.0" @@ -206,7 +241,7 @@ dependencies = [ "hex", "schemars", "serde", - "sha2", + "sha2 0.10.8", "static_assertions", "thiserror", ] @@ -215,13 +250,17 @@ dependencies = [ name = "cosmwasm-crypto" version = "2.0.1" dependencies = [ + "bls12_381", "derive_more", - "digest", + "digest 0.10.7", "ecdsa", "ed25519-zebra", "k256", "p256", + "pairing", "rand_core", + "rayon", + "sha2 0.9.9", "thiserror", ] @@ -269,7 +308,7 @@ dependencies = [ "schemars", "serde", "serde-json-wasm", - "sha2", + "sha2 0.10.8", "thiserror", ] @@ -289,7 +328,7 @@ dependencies = [ "schemars", "serde", "serde_json", - "sha2", + "sha2 0.10.8", "strum", "thiserror", "tracing", @@ -473,7 +512,7 @@ dependencies = [ "cfg-if", "cpufeatures", "curve25519-dalek-derive", - "digest", + "digest 0.10.7", "fiat-crypto", "platforms", "rustc_version", @@ -581,13 +620,22 @@ dependencies = [ "unicode-xid", ] +[[package]] +name = "digest" +version = "0.9.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d3dd60d1080a57a05ab032377049e0591415d2b31afd7028356dbf3cc6dcb066" +dependencies = [ + "generic-array", +] + [[package]] name = "digest" version = "0.10.7" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "9ed9a281f7bc9b7576e61468ba615a66a5c8cfdff42420a70aa82701a3b1e292" dependencies = [ - "block-buffer", + "block-buffer 0.10.2", "const-oid", "crypto-common", "subtle", @@ -632,7 +680,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "a4b1e0c257a9e9f25f90ff76d7a68360ed497ee519c8e428d1825ef0000799d4" dependencies = [ "der", - "digest", + "digest 0.10.7", "elliptic-curve", "rfc6979", "signature", @@ -658,7 +706,7 @@ dependencies = [ "hashbrown 0.14.3", "hex", "rand_core", - "sha2", + "sha2 0.10.8", "zeroize", ] @@ -676,7 +724,7 @@ checksum = "b5e6043086bf7973472e0c7dff2142ea0b680d30e18d9cc40f267efbf222bd47" dependencies = [ "base16ct", "crypto-bigint", - "digest", + "digest 0.10.7", "ff", "generic-array", "group", @@ -745,6 +793,7 @@ version = "0.13.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "ded41244b729663b1e574f1b4fb731469f69f79c17667b5d776b16cda0479449" dependencies = [ + "bitvec", "rand_core", "subtle", ] @@ -761,6 +810,12 @@ version = "1.0.7" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "3f9eec918d3f24069decb9af1554cad7c880e2da24a9afd88aca000531ab82c1" +[[package]] +name = "funty" +version = "2.0.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e6d5a32815ae3f33302d95fdcb2ce17862f8c65363dcfd29360480ba1001fc9c" + [[package]] name = "fxhash" version = "0.2.1" @@ -829,7 +884,7 @@ dependencies = [ "cosmwasm-vm", "schemars", "serde", - "sha2", + "sha2 0.10.8", "thiserror", ] @@ -870,7 +925,7 @@ version = "0.12.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "6c49c37c09c17a53d937dfbb742eb3a961d65a994e6bcdcf37e7399d0cc8ab5e" dependencies = [ - "digest", + "digest 0.10.7", ] [[package]] @@ -923,7 +978,7 @@ dependencies = [ "cfg-if", "ecdsa", "elliptic-curve", - "sha2", + "sha2 0.10.8", ] [[package]] @@ -1045,6 +1100,12 @@ version = "1.19.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "3fdb12b2476b595f9358c5161aa467c2438859caa136dec86c26fdd2efe17b92" +[[package]] +name = "opaque-debug" +version = "0.3.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c08d65885ee38876c4f86fa503fb49d7b507c2b62552df7c70b2fce627e06381" + [[package]] name = "p256" version = "0.13.2" @@ -1054,7 +1115,16 @@ dependencies = [ "ecdsa", "elliptic-curve", "primeorder", - "sha2", + "sha2 0.10.8", +] + +[[package]] +name = "pairing" +version = "0.23.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "81fec4625e73cf41ef4bb6846cafa6d44736525f442ba45e407c4a000a13996f" +dependencies = [ + "group", ] [[package]] @@ -1153,6 +1223,12 @@ dependencies = [ "proc-macro2", ] +[[package]] +name = "radium" +version = "0.7.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "dc33ff2d4973d518d823d61aa239014831e521c75da58e3df4840d3f47749d09" + [[package]] name = "rand_core" version = "0.6.4" @@ -1410,6 +1486,19 @@ dependencies = [ "serde", ] +[[package]] +name = "sha2" +version = "0.9.9" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4d58a1e1bf39749807d89cf2d98ac2dfa0ff1cb3faa38fbb64dd88ac8013d800" +dependencies = [ + "block-buffer 0.9.0", + "cfg-if", + "cpufeatures", + "digest 0.9.0", + "opaque-debug", +] + [[package]] name = "sha2" version = "0.10.8" @@ -1418,7 +1507,7 @@ checksum = "793db75ad2bcafc3ffa7c68b215fee268f537982cd901d132f89c6343f3a3dc8" dependencies = [ "cfg-if", "cpufeatures", - "digest", + "digest 0.10.7", ] [[package]] @@ -1437,7 +1526,7 @@ version = "2.1.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "5e1788eed21689f9cf370582dfc467ef36ed9c707f073528ddafa8d83e3b8500" dependencies = [ - "digest", + "digest 0.10.7", "rand_core", ] @@ -1521,6 +1610,12 @@ dependencies = [ "unicode-ident", ] +[[package]] +name = "tap" +version = "1.0.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "55937e1799185b12863d447f42597ed69d9928686b8d88a1df17376a097d8369" + [[package]] name = "target-lexicon" version = "0.12.7" @@ -1956,6 +2051,15 @@ version = "0.48.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "1a515f5799fe4961cb532f983ce2b23082366b898e52ffbce459c86f67c8378a" +[[package]] +name = "wyz" +version = "0.5.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "05f360fc0b24296329c78fda852a1e9ae82de9cf7b27dae4b7f62f118f77b9ed" +dependencies = [ + "tap", +] + [[package]] name = "zerocopy" version = "0.7.32" diff --git a/contracts/ibc-reflect-send/Cargo.lock b/contracts/ibc-reflect-send/Cargo.lock index 1a26458f65..42124f39e8 100644 --- a/contracts/ibc-reflect-send/Cargo.lock +++ b/contracts/ibc-reflect-send/Cargo.lock @@ -103,6 +103,27 @@ version = "2.4.2" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "ed570934406eb16438a4e976b1b4500774099c13b8cb96eec99f620f05090ddf" +[[package]] +name = "bitvec" +version = "1.0.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1bc2832c24239b0141d5674bb9174f9d68a8b5b3f2753311927c172ca46f7e9c" +dependencies = [ + "funty", + "radium", + "tap", + "wyz", +] + +[[package]] +name = "block-buffer" +version = "0.9.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4152116fd6e9dadb291ae18fc1ec3575ed6d84c29642d97890f4b4a3417297e4" +dependencies = [ + "generic-array", +] + [[package]] name = "block-buffer" version = "0.10.2" @@ -112,6 +133,20 @@ dependencies = [ "generic-array", ] +[[package]] +name = "bls12_381" +version = "0.8.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d7bc6d6292be3a19e6379786dac800f551e5865a5bb51ebbe3064ab80433f403" +dependencies = [ + "digest 0.9.0", + "ff", + "group", + "pairing", + "rand_core", + "subtle", +] + [[package]] name = "bnum" version = "0.11.0" @@ -206,7 +241,7 @@ dependencies = [ "hex", "schemars", "serde", - "sha2", + "sha2 0.10.8", "static_assertions", "thiserror", ] @@ -215,13 +250,17 @@ dependencies = [ name = "cosmwasm-crypto" version = "2.0.1" dependencies = [ + "bls12_381", "derive_more", - "digest", + "digest 0.10.7", "ecdsa", "ed25519-zebra", "k256", "p256", + "pairing", "rand_core", + "rayon", + "sha2 0.9.9", "thiserror", ] @@ -269,7 +308,7 @@ dependencies = [ "schemars", "serde", "serde-json-wasm", - "sha2", + "sha2 0.10.8", "thiserror", ] @@ -289,7 +328,7 @@ dependencies = [ "schemars", "serde", "serde_json", - "sha2", + "sha2 0.10.8", "strum", "thiserror", "tracing", @@ -473,7 +512,7 @@ dependencies = [ "cfg-if", "cpufeatures", "curve25519-dalek-derive", - "digest", + "digest 0.10.7", "fiat-crypto", "platforms", "rustc_version", @@ -581,13 +620,22 @@ dependencies = [ "unicode-xid", ] +[[package]] +name = "digest" +version = "0.9.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d3dd60d1080a57a05ab032377049e0591415d2b31afd7028356dbf3cc6dcb066" +dependencies = [ + "generic-array", +] + [[package]] name = "digest" version = "0.10.7" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "9ed9a281f7bc9b7576e61468ba615a66a5c8cfdff42420a70aa82701a3b1e292" dependencies = [ - "block-buffer", + "block-buffer 0.10.2", "const-oid", "crypto-common", "subtle", @@ -632,7 +680,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "a4b1e0c257a9e9f25f90ff76d7a68360ed497ee519c8e428d1825ef0000799d4" dependencies = [ "der", - "digest", + "digest 0.10.7", "elliptic-curve", "rfc6979", "signature", @@ -658,7 +706,7 @@ dependencies = [ "hashbrown 0.14.3", "hex", "rand_core", - "sha2", + "sha2 0.10.8", "zeroize", ] @@ -676,7 +724,7 @@ checksum = "b5e6043086bf7973472e0c7dff2142ea0b680d30e18d9cc40f267efbf222bd47" dependencies = [ "base16ct", "crypto-bigint", - "digest", + "digest 0.10.7", "ff", "generic-array", "group", @@ -745,6 +793,7 @@ version = "0.13.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "ded41244b729663b1e574f1b4fb731469f69f79c17667b5d776b16cda0479449" dependencies = [ + "bitvec", "rand_core", "subtle", ] @@ -761,6 +810,12 @@ version = "1.0.7" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "3f9eec918d3f24069decb9af1554cad7c880e2da24a9afd88aca000531ab82c1" +[[package]] +name = "funty" +version = "2.0.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e6d5a32815ae3f33302d95fdcb2ce17862f8c65363dcfd29360480ba1001fc9c" + [[package]] name = "fxhash" version = "0.2.1" @@ -857,7 +912,7 @@ version = "0.12.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "6c49c37c09c17a53d937dfbb742eb3a961d65a994e6bcdcf37e7399d0cc8ab5e" dependencies = [ - "digest", + "digest 0.10.7", ] [[package]] @@ -921,7 +976,7 @@ dependencies = [ "cfg-if", "ecdsa", "elliptic-curve", - "sha2", + "sha2 0.10.8", ] [[package]] @@ -1043,6 +1098,12 @@ version = "1.19.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "3fdb12b2476b595f9358c5161aa467c2438859caa136dec86c26fdd2efe17b92" +[[package]] +name = "opaque-debug" +version = "0.3.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c08d65885ee38876c4f86fa503fb49d7b507c2b62552df7c70b2fce627e06381" + [[package]] name = "p256" version = "0.13.2" @@ -1052,7 +1113,16 @@ dependencies = [ "ecdsa", "elliptic-curve", "primeorder", - "sha2", + "sha2 0.10.8", +] + +[[package]] +name = "pairing" +version = "0.23.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "81fec4625e73cf41ef4bb6846cafa6d44736525f442ba45e407c4a000a13996f" +dependencies = [ + "group", ] [[package]] @@ -1151,6 +1221,12 @@ dependencies = [ "proc-macro2", ] +[[package]] +name = "radium" +version = "0.7.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "dc33ff2d4973d518d823d61aa239014831e521c75da58e3df4840d3f47749d09" + [[package]] name = "rand_core" version = "0.6.4" @@ -1408,6 +1484,19 @@ dependencies = [ "serde", ] +[[package]] +name = "sha2" +version = "0.9.9" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4d58a1e1bf39749807d89cf2d98ac2dfa0ff1cb3faa38fbb64dd88ac8013d800" +dependencies = [ + "block-buffer 0.9.0", + "cfg-if", + "cpufeatures", + "digest 0.9.0", + "opaque-debug", +] + [[package]] name = "sha2" version = "0.10.8" @@ -1416,7 +1505,7 @@ checksum = "793db75ad2bcafc3ffa7c68b215fee268f537982cd901d132f89c6343f3a3dc8" dependencies = [ "cfg-if", "cpufeatures", - "digest", + "digest 0.10.7", ] [[package]] @@ -1435,7 +1524,7 @@ version = "2.1.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "5e1788eed21689f9cf370582dfc467ef36ed9c707f073528ddafa8d83e3b8500" dependencies = [ - "digest", + "digest 0.10.7", "rand_core", ] @@ -1519,6 +1608,12 @@ dependencies = [ "unicode-ident", ] +[[package]] +name = "tap" +version = "1.0.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "55937e1799185b12863d447f42597ed69d9928686b8d88a1df17376a097d8369" + [[package]] name = "target-lexicon" version = "0.12.7" @@ -1954,6 +2049,15 @@ version = "0.48.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "1a515f5799fe4961cb532f983ce2b23082366b898e52ffbce459c86f67c8378a" +[[package]] +name = "wyz" +version = "0.5.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "05f360fc0b24296329c78fda852a1e9ae82de9cf7b27dae4b7f62f118f77b9ed" +dependencies = [ + "tap", +] + [[package]] name = "zerocopy" version = "0.7.32" diff --git a/contracts/ibc-reflect/Cargo.lock b/contracts/ibc-reflect/Cargo.lock index 1149e062ad..251973cfd4 100644 --- a/contracts/ibc-reflect/Cargo.lock +++ b/contracts/ibc-reflect/Cargo.lock @@ -103,6 +103,27 @@ version = "2.4.2" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "ed570934406eb16438a4e976b1b4500774099c13b8cb96eec99f620f05090ddf" +[[package]] +name = "bitvec" +version = "1.0.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1bc2832c24239b0141d5674bb9174f9d68a8b5b3f2753311927c172ca46f7e9c" +dependencies = [ + "funty", + "radium", + "tap", + "wyz", +] + +[[package]] +name = "block-buffer" +version = "0.9.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4152116fd6e9dadb291ae18fc1ec3575ed6d84c29642d97890f4b4a3417297e4" +dependencies = [ + "generic-array", +] + [[package]] name = "block-buffer" version = "0.10.2" @@ -112,6 +133,20 @@ dependencies = [ "generic-array", ] +[[package]] +name = "bls12_381" +version = "0.8.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d7bc6d6292be3a19e6379786dac800f551e5865a5bb51ebbe3064ab80433f403" +dependencies = [ + "digest 0.9.0", + "ff", + "group", + "pairing", + "rand_core", + "subtle", +] + [[package]] name = "bnum" version = "0.11.0" @@ -206,7 +241,7 @@ dependencies = [ "hex", "schemars", "serde", - "sha2", + "sha2 0.10.8", "static_assertions", "thiserror", ] @@ -215,13 +250,17 @@ dependencies = [ name = "cosmwasm-crypto" version = "2.0.1" dependencies = [ + "bls12_381", "derive_more", - "digest", + "digest 0.10.7", "ecdsa", "ed25519-zebra", "k256", "p256", + "pairing", "rand_core", + "rayon", + "sha2 0.9.9", "thiserror", ] @@ -269,7 +308,7 @@ dependencies = [ "schemars", "serde", "serde-json-wasm", - "sha2", + "sha2 0.10.8", "thiserror", ] @@ -289,7 +328,7 @@ dependencies = [ "schemars", "serde", "serde_json", - "sha2", + "sha2 0.10.8", "strum", "thiserror", "tracing", @@ -473,7 +512,7 @@ dependencies = [ "cfg-if", "cpufeatures", "curve25519-dalek-derive", - "digest", + "digest 0.10.7", "fiat-crypto", "platforms", "rustc_version", @@ -581,13 +620,22 @@ dependencies = [ "unicode-xid", ] +[[package]] +name = "digest" +version = "0.9.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d3dd60d1080a57a05ab032377049e0591415d2b31afd7028356dbf3cc6dcb066" +dependencies = [ + "generic-array", +] + [[package]] name = "digest" version = "0.10.7" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "9ed9a281f7bc9b7576e61468ba615a66a5c8cfdff42420a70aa82701a3b1e292" dependencies = [ - "block-buffer", + "block-buffer 0.10.2", "const-oid", "crypto-common", "subtle", @@ -632,7 +680,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "a4b1e0c257a9e9f25f90ff76d7a68360ed497ee519c8e428d1825ef0000799d4" dependencies = [ "der", - "digest", + "digest 0.10.7", "elliptic-curve", "rfc6979", "signature", @@ -658,7 +706,7 @@ dependencies = [ "hashbrown 0.14.3", "hex", "rand_core", - "sha2", + "sha2 0.10.8", "zeroize", ] @@ -676,7 +724,7 @@ checksum = "b5e6043086bf7973472e0c7dff2142ea0b680d30e18d9cc40f267efbf222bd47" dependencies = [ "base16ct", "crypto-bigint", - "digest", + "digest 0.10.7", "ff", "generic-array", "group", @@ -745,6 +793,7 @@ version = "0.13.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "ded41244b729663b1e574f1b4fb731469f69f79c17667b5d776b16cda0479449" dependencies = [ + "bitvec", "rand_core", "subtle", ] @@ -761,6 +810,12 @@ version = "1.0.7" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "3f9eec918d3f24069decb9af1554cad7c880e2da24a9afd88aca000531ab82c1" +[[package]] +name = "funty" +version = "2.0.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e6d5a32815ae3f33302d95fdcb2ce17862f8c65363dcfd29360480ba1001fc9c" + [[package]] name = "fxhash" version = "0.2.1" @@ -857,7 +912,7 @@ version = "0.12.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "6c49c37c09c17a53d937dfbb742eb3a961d65a994e6bcdcf37e7399d0cc8ab5e" dependencies = [ - "digest", + "digest 0.10.7", ] [[package]] @@ -921,7 +976,7 @@ dependencies = [ "cfg-if", "ecdsa", "elliptic-curve", - "sha2", + "sha2 0.10.8", ] [[package]] @@ -1043,6 +1098,12 @@ version = "1.19.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "3fdb12b2476b595f9358c5161aa467c2438859caa136dec86c26fdd2efe17b92" +[[package]] +name = "opaque-debug" +version = "0.3.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c08d65885ee38876c4f86fa503fb49d7b507c2b62552df7c70b2fce627e06381" + [[package]] name = "p256" version = "0.13.2" @@ -1052,7 +1113,16 @@ dependencies = [ "ecdsa", "elliptic-curve", "primeorder", - "sha2", + "sha2 0.10.8", +] + +[[package]] +name = "pairing" +version = "0.23.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "81fec4625e73cf41ef4bb6846cafa6d44736525f442ba45e407c4a000a13996f" +dependencies = [ + "group", ] [[package]] @@ -1151,6 +1221,12 @@ dependencies = [ "proc-macro2", ] +[[package]] +name = "radium" +version = "0.7.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "dc33ff2d4973d518d823d61aa239014831e521c75da58e3df4840d3f47749d09" + [[package]] name = "rand_core" version = "0.6.4" @@ -1408,6 +1484,19 @@ dependencies = [ "serde", ] +[[package]] +name = "sha2" +version = "0.9.9" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4d58a1e1bf39749807d89cf2d98ac2dfa0ff1cb3faa38fbb64dd88ac8013d800" +dependencies = [ + "block-buffer 0.9.0", + "cfg-if", + "cpufeatures", + "digest 0.9.0", + "opaque-debug", +] + [[package]] name = "sha2" version = "0.10.8" @@ -1416,7 +1505,7 @@ checksum = "793db75ad2bcafc3ffa7c68b215fee268f537982cd901d132f89c6343f3a3dc8" dependencies = [ "cfg-if", "cpufeatures", - "digest", + "digest 0.10.7", ] [[package]] @@ -1435,7 +1524,7 @@ version = "2.1.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "5e1788eed21689f9cf370582dfc467ef36ed9c707f073528ddafa8d83e3b8500" dependencies = [ - "digest", + "digest 0.10.7", "rand_core", ] @@ -1519,6 +1608,12 @@ dependencies = [ "unicode-ident", ] +[[package]] +name = "tap" +version = "1.0.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "55937e1799185b12863d447f42597ed69d9928686b8d88a1df17376a097d8369" + [[package]] name = "target-lexicon" version = "0.12.7" @@ -1954,6 +2049,15 @@ version = "0.48.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "1a515f5799fe4961cb532f983ce2b23082366b898e52ffbce459c86f67c8378a" +[[package]] +name = "wyz" +version = "0.5.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "05f360fc0b24296329c78fda852a1e9ae82de9cf7b27dae4b7f62f118f77b9ed" +dependencies = [ + "tap", +] + [[package]] name = "zerocopy" version = "0.7.32" diff --git a/contracts/queue/Cargo.lock b/contracts/queue/Cargo.lock index 2e30b080d8..e606554fcb 100644 --- a/contracts/queue/Cargo.lock +++ b/contracts/queue/Cargo.lock @@ -103,6 +103,27 @@ version = "2.4.2" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "ed570934406eb16438a4e976b1b4500774099c13b8cb96eec99f620f05090ddf" +[[package]] +name = "bitvec" +version = "1.0.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1bc2832c24239b0141d5674bb9174f9d68a8b5b3f2753311927c172ca46f7e9c" +dependencies = [ + "funty", + "radium", + "tap", + "wyz", +] + +[[package]] +name = "block-buffer" +version = "0.9.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4152116fd6e9dadb291ae18fc1ec3575ed6d84c29642d97890f4b4a3417297e4" +dependencies = [ + "generic-array", +] + [[package]] name = "block-buffer" version = "0.10.2" @@ -112,6 +133,20 @@ dependencies = [ "generic-array", ] +[[package]] +name = "bls12_381" +version = "0.8.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d7bc6d6292be3a19e6379786dac800f551e5865a5bb51ebbe3064ab80433f403" +dependencies = [ + "digest 0.9.0", + "ff", + "group", + "pairing", + "rand_core", + "subtle", +] + [[package]] name = "bnum" version = "0.11.0" @@ -206,7 +241,7 @@ dependencies = [ "hex", "schemars", "serde", - "sha2", + "sha2 0.10.8", "static_assertions", "thiserror", ] @@ -215,13 +250,17 @@ dependencies = [ name = "cosmwasm-crypto" version = "2.0.1" dependencies = [ + "bls12_381", "derive_more", - "digest", + "digest 0.10.7", "ecdsa", "ed25519-zebra", "k256", "p256", + "pairing", "rand_core", + "rayon", + "sha2 0.9.9", "thiserror", ] @@ -269,7 +308,7 @@ dependencies = [ "schemars", "serde", "serde-json-wasm", - "sha2", + "sha2 0.10.8", "thiserror", ] @@ -289,7 +328,7 @@ dependencies = [ "schemars", "serde", "serde_json", - "sha2", + "sha2 0.10.8", "strum", "thiserror", "tracing", @@ -473,7 +512,7 @@ dependencies = [ "cfg-if", "cpufeatures", "curve25519-dalek-derive", - "digest", + "digest 0.10.7", "fiat-crypto", "platforms", "rustc_version", @@ -581,13 +620,22 @@ dependencies = [ "unicode-xid", ] +[[package]] +name = "digest" +version = "0.9.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d3dd60d1080a57a05ab032377049e0591415d2b31afd7028356dbf3cc6dcb066" +dependencies = [ + "generic-array", +] + [[package]] name = "digest" version = "0.10.7" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "9ed9a281f7bc9b7576e61468ba615a66a5c8cfdff42420a70aa82701a3b1e292" dependencies = [ - "block-buffer", + "block-buffer 0.10.2", "const-oid", "crypto-common", "subtle", @@ -632,7 +680,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "a4b1e0c257a9e9f25f90ff76d7a68360ed497ee519c8e428d1825ef0000799d4" dependencies = [ "der", - "digest", + "digest 0.10.7", "elliptic-curve", "rfc6979", "signature", @@ -658,7 +706,7 @@ dependencies = [ "hashbrown 0.14.3", "hex", "rand_core", - "sha2", + "sha2 0.10.8", "zeroize", ] @@ -676,7 +724,7 @@ checksum = "b5e6043086bf7973472e0c7dff2142ea0b680d30e18d9cc40f267efbf222bd47" dependencies = [ "base16ct", "crypto-bigint", - "digest", + "digest 0.10.7", "ff", "generic-array", "group", @@ -745,6 +793,7 @@ version = "0.13.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "ded41244b729663b1e574f1b4fb731469f69f79c17667b5d776b16cda0479449" dependencies = [ + "bitvec", "rand_core", "subtle", ] @@ -761,6 +810,12 @@ version = "1.0.7" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "3f9eec918d3f24069decb9af1554cad7c880e2da24a9afd88aca000531ab82c1" +[[package]] +name = "funty" +version = "2.0.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e6d5a32815ae3f33302d95fdcb2ce17862f8c65363dcfd29360480ba1001fc9c" + [[package]] name = "fxhash" version = "0.2.1" @@ -857,7 +912,7 @@ version = "0.12.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "6c49c37c09c17a53d937dfbb742eb3a961d65a994e6bcdcf37e7399d0cc8ab5e" dependencies = [ - "digest", + "digest 0.10.7", ] [[package]] @@ -910,7 +965,7 @@ dependencies = [ "cfg-if", "ecdsa", "elliptic-curve", - "sha2", + "sha2 0.10.8", ] [[package]] @@ -1032,6 +1087,12 @@ version = "1.19.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "3fdb12b2476b595f9358c5161aa467c2438859caa136dec86c26fdd2efe17b92" +[[package]] +name = "opaque-debug" +version = "0.3.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c08d65885ee38876c4f86fa503fb49d7b507c2b62552df7c70b2fce627e06381" + [[package]] name = "p256" version = "0.13.2" @@ -1041,7 +1102,16 @@ dependencies = [ "ecdsa", "elliptic-curve", "primeorder", - "sha2", + "sha2 0.10.8", +] + +[[package]] +name = "pairing" +version = "0.23.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "81fec4625e73cf41ef4bb6846cafa6d44736525f442ba45e407c4a000a13996f" +dependencies = [ + "group", ] [[package]] @@ -1151,6 +1221,12 @@ dependencies = [ "proc-macro2", ] +[[package]] +name = "radium" +version = "0.7.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "dc33ff2d4973d518d823d61aa239014831e521c75da58e3df4840d3f47749d09" + [[package]] name = "rand_core" version = "0.6.4" @@ -1408,6 +1484,19 @@ dependencies = [ "serde", ] +[[package]] +name = "sha2" +version = "0.9.9" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4d58a1e1bf39749807d89cf2d98ac2dfa0ff1cb3faa38fbb64dd88ac8013d800" +dependencies = [ + "block-buffer 0.9.0", + "cfg-if", + "cpufeatures", + "digest 0.9.0", + "opaque-debug", +] + [[package]] name = "sha2" version = "0.10.8" @@ -1416,7 +1505,7 @@ checksum = "793db75ad2bcafc3ffa7c68b215fee268f537982cd901d132f89c6343f3a3dc8" dependencies = [ "cfg-if", "cpufeatures", - "digest", + "digest 0.10.7", ] [[package]] @@ -1435,7 +1524,7 @@ version = "2.1.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "5e1788eed21689f9cf370582dfc467ef36ed9c707f073528ddafa8d83e3b8500" dependencies = [ - "digest", + "digest 0.10.7", "rand_core", ] @@ -1519,6 +1608,12 @@ dependencies = [ "unicode-ident", ] +[[package]] +name = "tap" +version = "1.0.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "55937e1799185b12863d447f42597ed69d9928686b8d88a1df17376a097d8369" + [[package]] name = "target-lexicon" version = "0.12.7" @@ -1954,6 +2049,15 @@ version = "0.48.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "1a515f5799fe4961cb532f983ce2b23082366b898e52ffbce459c86f67c8378a" +[[package]] +name = "wyz" +version = "0.5.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "05f360fc0b24296329c78fda852a1e9ae82de9cf7b27dae4b7f62f118f77b9ed" +dependencies = [ + "tap", +] + [[package]] name = "zerocopy" version = "0.7.32" diff --git a/contracts/reflect/Cargo.lock b/contracts/reflect/Cargo.lock index 6ae7c92024..151e602861 100644 --- a/contracts/reflect/Cargo.lock +++ b/contracts/reflect/Cargo.lock @@ -103,6 +103,27 @@ version = "2.4.2" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "ed570934406eb16438a4e976b1b4500774099c13b8cb96eec99f620f05090ddf" +[[package]] +name = "bitvec" +version = "1.0.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1bc2832c24239b0141d5674bb9174f9d68a8b5b3f2753311927c172ca46f7e9c" +dependencies = [ + "funty", + "radium", + "tap", + "wyz", +] + +[[package]] +name = "block-buffer" +version = "0.9.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4152116fd6e9dadb291ae18fc1ec3575ed6d84c29642d97890f4b4a3417297e4" +dependencies = [ + "generic-array", +] + [[package]] name = "block-buffer" version = "0.10.2" @@ -112,6 +133,20 @@ dependencies = [ "generic-array", ] +[[package]] +name = "bls12_381" +version = "0.8.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d7bc6d6292be3a19e6379786dac800f551e5865a5bb51ebbe3064ab80433f403" +dependencies = [ + "digest 0.9.0", + "ff", + "group", + "pairing", + "rand_core", + "subtle", +] + [[package]] name = "bnum" version = "0.11.0" @@ -206,7 +241,7 @@ dependencies = [ "hex", "schemars", "serde", - "sha2", + "sha2 0.10.8", "static_assertions", "thiserror", ] @@ -215,13 +250,17 @@ dependencies = [ name = "cosmwasm-crypto" version = "2.0.1" dependencies = [ + "bls12_381", "derive_more", - "digest", + "digest 0.10.7", "ecdsa", "ed25519-zebra", "k256", "p256", + "pairing", "rand_core", + "rayon", + "sha2 0.9.9", "thiserror", ] @@ -269,7 +308,7 @@ dependencies = [ "schemars", "serde", "serde-json-wasm", - "sha2", + "sha2 0.10.8", "thiserror", ] @@ -289,7 +328,7 @@ dependencies = [ "schemars", "serde", "serde_json", - "sha2", + "sha2 0.10.8", "strum", "thiserror", "tracing", @@ -473,7 +512,7 @@ dependencies = [ "cfg-if", "cpufeatures", "curve25519-dalek-derive", - "digest", + "digest 0.10.7", "fiat-crypto", "platforms", "rustc_version", @@ -581,13 +620,22 @@ dependencies = [ "unicode-xid", ] +[[package]] +name = "digest" +version = "0.9.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d3dd60d1080a57a05ab032377049e0591415d2b31afd7028356dbf3cc6dcb066" +dependencies = [ + "generic-array", +] + [[package]] name = "digest" version = "0.10.7" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "9ed9a281f7bc9b7576e61468ba615a66a5c8cfdff42420a70aa82701a3b1e292" dependencies = [ - "block-buffer", + "block-buffer 0.10.2", "const-oid", "crypto-common", "subtle", @@ -632,7 +680,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "a4b1e0c257a9e9f25f90ff76d7a68360ed497ee519c8e428d1825ef0000799d4" dependencies = [ "der", - "digest", + "digest 0.10.7", "elliptic-curve", "rfc6979", "signature", @@ -658,7 +706,7 @@ dependencies = [ "hashbrown 0.14.3", "hex", "rand_core", - "sha2", + "sha2 0.10.8", "zeroize", ] @@ -676,7 +724,7 @@ checksum = "b5e6043086bf7973472e0c7dff2142ea0b680d30e18d9cc40f267efbf222bd47" dependencies = [ "base16ct", "crypto-bigint", - "digest", + "digest 0.10.7", "ff", "generic-array", "group", @@ -745,6 +793,7 @@ version = "0.13.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "ded41244b729663b1e574f1b4fb731469f69f79c17667b5d776b16cda0479449" dependencies = [ + "bitvec", "rand_core", "subtle", ] @@ -761,6 +810,12 @@ version = "1.0.7" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "3f9eec918d3f24069decb9af1554cad7c880e2da24a9afd88aca000531ab82c1" +[[package]] +name = "funty" +version = "2.0.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e6d5a32815ae3f33302d95fdcb2ce17862f8c65363dcfd29360480ba1001fc9c" + [[package]] name = "fxhash" version = "0.2.1" @@ -857,7 +912,7 @@ version = "0.12.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "6c49c37c09c17a53d937dfbb742eb3a961d65a994e6bcdcf37e7399d0cc8ab5e" dependencies = [ - "digest", + "digest 0.10.7", ] [[package]] @@ -910,7 +965,7 @@ dependencies = [ "cfg-if", "ecdsa", "elliptic-curve", - "sha2", + "sha2 0.10.8", ] [[package]] @@ -1032,6 +1087,12 @@ version = "1.19.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "3fdb12b2476b595f9358c5161aa467c2438859caa136dec86c26fdd2efe17b92" +[[package]] +name = "opaque-debug" +version = "0.3.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c08d65885ee38876c4f86fa503fb49d7b507c2b62552df7c70b2fce627e06381" + [[package]] name = "p256" version = "0.13.2" @@ -1041,7 +1102,16 @@ dependencies = [ "ecdsa", "elliptic-curve", "primeorder", - "sha2", + "sha2 0.10.8", +] + +[[package]] +name = "pairing" +version = "0.23.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "81fec4625e73cf41ef4bb6846cafa6d44736525f442ba45e407c4a000a13996f" +dependencies = [ + "group", ] [[package]] @@ -1140,6 +1210,12 @@ dependencies = [ "proc-macro2", ] +[[package]] +name = "radium" +version = "0.7.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "dc33ff2d4973d518d823d61aa239014831e521c75da58e3df4840d3f47749d09" + [[package]] name = "rand_core" version = "0.6.4" @@ -1409,6 +1485,19 @@ dependencies = [ "serde", ] +[[package]] +name = "sha2" +version = "0.9.9" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4d58a1e1bf39749807d89cf2d98ac2dfa0ff1cb3faa38fbb64dd88ac8013d800" +dependencies = [ + "block-buffer 0.9.0", + "cfg-if", + "cpufeatures", + "digest 0.9.0", + "opaque-debug", +] + [[package]] name = "sha2" version = "0.10.8" @@ -1417,7 +1506,7 @@ checksum = "793db75ad2bcafc3ffa7c68b215fee268f537982cd901d132f89c6343f3a3dc8" dependencies = [ "cfg-if", "cpufeatures", - "digest", + "digest 0.10.7", ] [[package]] @@ -1436,7 +1525,7 @@ version = "2.1.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "5e1788eed21689f9cf370582dfc467ef36ed9c707f073528ddafa8d83e3b8500" dependencies = [ - "digest", + "digest 0.10.7", "rand_core", ] @@ -1520,6 +1609,12 @@ dependencies = [ "unicode-ident", ] +[[package]] +name = "tap" +version = "1.0.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "55937e1799185b12863d447f42597ed69d9928686b8d88a1df17376a097d8369" + [[package]] name = "target-lexicon" version = "0.12.7" @@ -1955,6 +2050,15 @@ version = "0.48.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "1a515f5799fe4961cb532f983ce2b23082366b898e52ffbce459c86f67c8378a" +[[package]] +name = "wyz" +version = "0.5.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "05f360fc0b24296329c78fda852a1e9ae82de9cf7b27dae4b7f62f118f77b9ed" +dependencies = [ + "tap", +] + [[package]] name = "zerocopy" version = "0.7.32" diff --git a/contracts/staking/Cargo.lock b/contracts/staking/Cargo.lock index b3c391445c..ece5af7f5a 100644 --- a/contracts/staking/Cargo.lock +++ b/contracts/staking/Cargo.lock @@ -103,6 +103,27 @@ version = "2.4.2" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "ed570934406eb16438a4e976b1b4500774099c13b8cb96eec99f620f05090ddf" +[[package]] +name = "bitvec" +version = "1.0.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1bc2832c24239b0141d5674bb9174f9d68a8b5b3f2753311927c172ca46f7e9c" +dependencies = [ + "funty", + "radium", + "tap", + "wyz", +] + +[[package]] +name = "block-buffer" +version = "0.9.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4152116fd6e9dadb291ae18fc1ec3575ed6d84c29642d97890f4b4a3417297e4" +dependencies = [ + "generic-array", +] + [[package]] name = "block-buffer" version = "0.10.2" @@ -112,6 +133,20 @@ dependencies = [ "generic-array", ] +[[package]] +name = "bls12_381" +version = "0.8.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d7bc6d6292be3a19e6379786dac800f551e5865a5bb51ebbe3064ab80433f403" +dependencies = [ + "digest 0.9.0", + "ff", + "group", + "pairing", + "rand_core", + "subtle", +] + [[package]] name = "bnum" version = "0.11.0" @@ -206,7 +241,7 @@ dependencies = [ "hex", "schemars", "serde", - "sha2", + "sha2 0.10.8", "static_assertions", "thiserror", ] @@ -215,13 +250,17 @@ dependencies = [ name = "cosmwasm-crypto" version = "2.0.1" dependencies = [ + "bls12_381", "derive_more", - "digest", + "digest 0.10.7", "ecdsa", "ed25519-zebra", "k256", "p256", + "pairing", "rand_core", + "rayon", + "sha2 0.9.9", "thiserror", ] @@ -269,7 +308,7 @@ dependencies = [ "schemars", "serde", "serde-json-wasm", - "sha2", + "sha2 0.10.8", "thiserror", ] @@ -289,7 +328,7 @@ dependencies = [ "schemars", "serde", "serde_json", - "sha2", + "sha2 0.10.8", "strum", "thiserror", "tracing", @@ -473,7 +512,7 @@ dependencies = [ "cfg-if", "cpufeatures", "curve25519-dalek-derive", - "digest", + "digest 0.10.7", "fiat-crypto", "platforms", "rustc_version", @@ -581,13 +620,22 @@ dependencies = [ "unicode-xid", ] +[[package]] +name = "digest" +version = "0.9.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d3dd60d1080a57a05ab032377049e0591415d2b31afd7028356dbf3cc6dcb066" +dependencies = [ + "generic-array", +] + [[package]] name = "digest" version = "0.10.7" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "9ed9a281f7bc9b7576e61468ba615a66a5c8cfdff42420a70aa82701a3b1e292" dependencies = [ - "block-buffer", + "block-buffer 0.10.2", "const-oid", "crypto-common", "subtle", @@ -632,7 +680,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "a4b1e0c257a9e9f25f90ff76d7a68360ed497ee519c8e428d1825ef0000799d4" dependencies = [ "der", - "digest", + "digest 0.10.7", "elliptic-curve", "rfc6979", "signature", @@ -658,7 +706,7 @@ dependencies = [ "hashbrown 0.14.3", "hex", "rand_core", - "sha2", + "sha2 0.10.8", "zeroize", ] @@ -676,7 +724,7 @@ checksum = "b5e6043086bf7973472e0c7dff2142ea0b680d30e18d9cc40f267efbf222bd47" dependencies = [ "base16ct", "crypto-bigint", - "digest", + "digest 0.10.7", "ff", "generic-array", "group", @@ -745,6 +793,7 @@ version = "0.13.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "ded41244b729663b1e574f1b4fb731469f69f79c17667b5d776b16cda0479449" dependencies = [ + "bitvec", "rand_core", "subtle", ] @@ -761,6 +810,12 @@ version = "1.0.7" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "3f9eec918d3f24069decb9af1554cad7c880e2da24a9afd88aca000531ab82c1" +[[package]] +name = "funty" +version = "2.0.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e6d5a32815ae3f33302d95fdcb2ce17862f8c65363dcfd29360480ba1001fc9c" + [[package]] name = "fxhash" version = "0.2.1" @@ -857,7 +912,7 @@ version = "0.12.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "6c49c37c09c17a53d937dfbb742eb3a961d65a994e6bcdcf37e7399d0cc8ab5e" dependencies = [ - "digest", + "digest 0.10.7", ] [[package]] @@ -910,7 +965,7 @@ dependencies = [ "cfg-if", "ecdsa", "elliptic-curve", - "sha2", + "sha2 0.10.8", ] [[package]] @@ -1032,6 +1087,12 @@ version = "1.19.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "3fdb12b2476b595f9358c5161aa467c2438859caa136dec86c26fdd2efe17b92" +[[package]] +name = "opaque-debug" +version = "0.3.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c08d65885ee38876c4f86fa503fb49d7b507c2b62552df7c70b2fce627e06381" + [[package]] name = "p256" version = "0.13.2" @@ -1041,7 +1102,16 @@ dependencies = [ "ecdsa", "elliptic-curve", "primeorder", - "sha2", + "sha2 0.10.8", +] + +[[package]] +name = "pairing" +version = "0.23.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "81fec4625e73cf41ef4bb6846cafa6d44736525f442ba45e407c4a000a13996f" +dependencies = [ + "group", ] [[package]] @@ -1140,6 +1210,12 @@ dependencies = [ "proc-macro2", ] +[[package]] +name = "radium" +version = "0.7.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "dc33ff2d4973d518d823d61aa239014831e521c75da58e3df4840d3f47749d09" + [[package]] name = "rand_core" version = "0.6.4" @@ -1397,6 +1473,19 @@ dependencies = [ "serde", ] +[[package]] +name = "sha2" +version = "0.9.9" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4d58a1e1bf39749807d89cf2d98ac2dfa0ff1cb3faa38fbb64dd88ac8013d800" +dependencies = [ + "block-buffer 0.9.0", + "cfg-if", + "cpufeatures", + "digest 0.9.0", + "opaque-debug", +] + [[package]] name = "sha2" version = "0.10.8" @@ -1405,7 +1494,7 @@ checksum = "793db75ad2bcafc3ffa7c68b215fee268f537982cd901d132f89c6343f3a3dc8" dependencies = [ "cfg-if", "cpufeatures", - "digest", + "digest 0.10.7", ] [[package]] @@ -1424,7 +1513,7 @@ version = "2.1.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "5e1788eed21689f9cf370582dfc467ef36ed9c707f073528ddafa8d83e3b8500" dependencies = [ - "digest", + "digest 0.10.7", "rand_core", ] @@ -1541,6 +1630,12 @@ dependencies = [ "unicode-ident", ] +[[package]] +name = "tap" +version = "1.0.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "55937e1799185b12863d447f42597ed69d9928686b8d88a1df17376a097d8369" + [[package]] name = "target-lexicon" version = "0.12.7" @@ -1976,6 +2071,15 @@ version = "0.48.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "1a515f5799fe4961cb532f983ce2b23082366b898e52ffbce459c86f67c8378a" +[[package]] +name = "wyz" +version = "0.5.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "05f360fc0b24296329c78fda852a1e9ae82de9cf7b27dae4b7f62f118f77b9ed" +dependencies = [ + "tap", +] + [[package]] name = "zerocopy" version = "0.7.32" diff --git a/contracts/virus/Cargo.lock b/contracts/virus/Cargo.lock index 770cbced79..8a7c70234c 100644 --- a/contracts/virus/Cargo.lock +++ b/contracts/virus/Cargo.lock @@ -103,6 +103,27 @@ version = "2.4.2" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "ed570934406eb16438a4e976b1b4500774099c13b8cb96eec99f620f05090ddf" +[[package]] +name = "bitvec" +version = "1.0.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1bc2832c24239b0141d5674bb9174f9d68a8b5b3f2753311927c172ca46f7e9c" +dependencies = [ + "funty", + "radium", + "tap", + "wyz", +] + +[[package]] +name = "block-buffer" +version = "0.9.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4152116fd6e9dadb291ae18fc1ec3575ed6d84c29642d97890f4b4a3417297e4" +dependencies = [ + "generic-array", +] + [[package]] name = "block-buffer" version = "0.10.2" @@ -112,6 +133,20 @@ dependencies = [ "generic-array", ] +[[package]] +name = "bls12_381" +version = "0.8.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d7bc6d6292be3a19e6379786dac800f551e5865a5bb51ebbe3064ab80433f403" +dependencies = [ + "digest 0.9.0", + "ff", + "group", + "pairing", + "rand_core", + "subtle", +] + [[package]] name = "bnum" version = "0.11.0" @@ -206,7 +241,7 @@ dependencies = [ "hex", "schemars", "serde", - "sha2", + "sha2 0.10.8", "static_assertions", "thiserror", ] @@ -215,13 +250,17 @@ dependencies = [ name = "cosmwasm-crypto" version = "2.0.1" dependencies = [ + "bls12_381", "derive_more", - "digest", + "digest 0.10.7", "ecdsa", "ed25519-zebra", "k256", "p256", + "pairing", "rand_core", + "rayon", + "sha2 0.9.9", "thiserror", ] @@ -269,7 +308,7 @@ dependencies = [ "schemars", "serde", "serde-json-wasm", - "sha2", + "sha2 0.10.8", "thiserror", ] @@ -289,7 +328,7 @@ dependencies = [ "schemars", "serde", "serde_json", - "sha2", + "sha2 0.10.8", "strum", "thiserror", "tracing", @@ -473,7 +512,7 @@ dependencies = [ "cfg-if", "cpufeatures", "curve25519-dalek-derive", - "digest", + "digest 0.10.7", "fiat-crypto", "platforms", "rustc_version", @@ -581,13 +620,22 @@ dependencies = [ "unicode-xid", ] +[[package]] +name = "digest" +version = "0.9.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d3dd60d1080a57a05ab032377049e0591415d2b31afd7028356dbf3cc6dcb066" +dependencies = [ + "generic-array", +] + [[package]] name = "digest" version = "0.10.7" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "9ed9a281f7bc9b7576e61468ba615a66a5c8cfdff42420a70aa82701a3b1e292" dependencies = [ - "block-buffer", + "block-buffer 0.10.2", "const-oid", "crypto-common", "subtle", @@ -632,7 +680,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "a4b1e0c257a9e9f25f90ff76d7a68360ed497ee519c8e428d1825ef0000799d4" dependencies = [ "der", - "digest", + "digest 0.10.7", "elliptic-curve", "rfc6979", "signature", @@ -658,7 +706,7 @@ dependencies = [ "hashbrown 0.14.3", "hex", "rand_core", - "sha2", + "sha2 0.10.8", "zeroize", ] @@ -676,7 +724,7 @@ checksum = "b5e6043086bf7973472e0c7dff2142ea0b680d30e18d9cc40f267efbf222bd47" dependencies = [ "base16ct", "crypto-bigint", - "digest", + "digest 0.10.7", "ff", "generic-array", "group", @@ -745,6 +793,7 @@ version = "0.13.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "ded41244b729663b1e574f1b4fb731469f69f79c17667b5d776b16cda0479449" dependencies = [ + "bitvec", "rand_core", "subtle", ] @@ -761,6 +810,12 @@ version = "1.0.7" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "3f9eec918d3f24069decb9af1554cad7c880e2da24a9afd88aca000531ab82c1" +[[package]] +name = "funty" +version = "2.0.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e6d5a32815ae3f33302d95fdcb2ce17862f8c65363dcfd29360480ba1001fc9c" + [[package]] name = "fxhash" version = "0.2.1" @@ -857,7 +912,7 @@ version = "0.12.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "6c49c37c09c17a53d937dfbb742eb3a961d65a994e6bcdcf37e7399d0cc8ab5e" dependencies = [ - "digest", + "digest 0.10.7", ] [[package]] @@ -910,7 +965,7 @@ dependencies = [ "cfg-if", "ecdsa", "elliptic-curve", - "sha2", + "sha2 0.10.8", ] [[package]] @@ -1032,6 +1087,12 @@ version = "1.19.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "3fdb12b2476b595f9358c5161aa467c2438859caa136dec86c26fdd2efe17b92" +[[package]] +name = "opaque-debug" +version = "0.3.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c08d65885ee38876c4f86fa503fb49d7b507c2b62552df7c70b2fce627e06381" + [[package]] name = "p256" version = "0.13.2" @@ -1041,7 +1102,16 @@ dependencies = [ "ecdsa", "elliptic-curve", "primeorder", - "sha2", + "sha2 0.10.8", +] + +[[package]] +name = "pairing" +version = "0.23.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "81fec4625e73cf41ef4bb6846cafa6d44736525f442ba45e407c4a000a13996f" +dependencies = [ + "group", ] [[package]] @@ -1140,6 +1210,12 @@ dependencies = [ "proc-macro2", ] +[[package]] +name = "radium" +version = "0.7.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "dc33ff2d4973d518d823d61aa239014831e521c75da58e3df4840d3f47749d09" + [[package]] name = "rand_core" version = "0.6.4" @@ -1397,6 +1473,19 @@ dependencies = [ "serde", ] +[[package]] +name = "sha2" +version = "0.9.9" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4d58a1e1bf39749807d89cf2d98ac2dfa0ff1cb3faa38fbb64dd88ac8013d800" +dependencies = [ + "block-buffer 0.9.0", + "cfg-if", + "cpufeatures", + "digest 0.9.0", + "opaque-debug", +] + [[package]] name = "sha2" version = "0.10.8" @@ -1405,7 +1494,7 @@ checksum = "793db75ad2bcafc3ffa7c68b215fee268f537982cd901d132f89c6343f3a3dc8" dependencies = [ "cfg-if", "cpufeatures", - "digest", + "digest 0.10.7", ] [[package]] @@ -1424,7 +1513,7 @@ version = "2.1.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "5e1788eed21689f9cf370582dfc467ef36ed9c707f073528ddafa8d83e3b8500" dependencies = [ - "digest", + "digest 0.10.7", "rand_core", ] @@ -1508,6 +1597,12 @@ dependencies = [ "unicode-ident", ] +[[package]] +name = "tap" +version = "1.0.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "55937e1799185b12863d447f42597ed69d9928686b8d88a1df17376a097d8369" + [[package]] name = "target-lexicon" version = "0.12.7" @@ -1955,6 +2050,15 @@ version = "0.48.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "1a515f5799fe4961cb532f983ce2b23082366b898e52ffbce459c86f67c8378a" +[[package]] +name = "wyz" +version = "0.5.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "05f360fc0b24296329c78fda852a1e9ae82de9cf7b27dae4b7f62f118f77b9ed" +dependencies = [ + "tap", +] + [[package]] name = "zerocopy" version = "0.7.32" diff --git a/packages/crypto/Cargo.toml b/packages/crypto/Cargo.toml index 74507969d8..53efabdd50 100644 --- a/packages/crypto/Cargo.toml +++ b/packages/crypto/Cargo.toml @@ -31,7 +31,7 @@ sha2_v9 = { package = "sha2", version = "0.9.1" } # Must be compatible with bls1 thiserror = { version = "1.0.26", optional = true } [dev-dependencies] -base64 = "0.21.0" +base64 = "0.22.0" base64-serde = "0.7.0" criterion = "0.5.1" rand_core = { version = "0.6", features = ["getrandom"] } From 1a13179263ed468e90bea116613862bb26bf6d31 Mon Sep 17 00:00:00 2001 From: Aumetra Weisman Date: Tue, 2 Apr 2024 13:23:01 +0200 Subject: [PATCH 03/79] Implement pairing functions, and a fast pairing equality function --- Cargo.lock | 4 +- packages/crypto/src/bls12_318/aggregate.rs | 2 +- packages/crypto/src/bls12_318/mod.rs | 2 + packages/crypto/src/bls12_318/pairing.rs | 37 +++++++++++++ packages/crypto/src/bls12_318/points.rs | 62 +++++++++++++++++++++- packages/crypto/src/lib.rs | 6 ++- 6 files changed, 107 insertions(+), 6 deletions(-) create mode 100644 packages/crypto/src/bls12_318/pairing.rs diff --git a/Cargo.lock b/Cargo.lock index 39119f91bf..9e3373976d 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -2270,9 +2270,9 @@ dependencies = [ [[package]] name = "subtle" -version = "2.4.1" +version = "2.5.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6bdef32e8150c2a081110b42772ffe7d7c9032b606bc226c8260fd97e0976601" +checksum = "81cdd64d312baedb58e21336b31bc043b77e01cc99033ce76ef539f78e965ebc" [[package]] name = "syn" diff --git a/packages/crypto/src/bls12_318/aggregate.rs b/packages/crypto/src/bls12_318/aggregate.rs index 0ebedef840..9c5bdb6a08 100644 --- a/packages/crypto/src/bls12_318/aggregate.rs +++ b/packages/crypto/src/bls12_318/aggregate.rs @@ -95,7 +95,7 @@ pub fn g2_sum(elements: &[G2]) -> G2 { #[cfg(test)] mod tests { - use super::super::points::{g1_from_fixed, g1_from_variable, g1s_from_variable, g2_from_fixed}; + use super::super::points::{g1_from_variable, g1s_from_variable}; use super::*; use base64::engine::general_purpose::STANDARD; use base64_serde::base64_serde_type; diff --git a/packages/crypto/src/bls12_318/mod.rs b/packages/crypto/src/bls12_318/mod.rs index b4f8403934..13816fb5e3 100644 --- a/packages/crypto/src/bls12_318/mod.rs +++ b/packages/crypto/src/bls12_318/mod.rs @@ -1,4 +1,6 @@ mod aggregate; +mod pairing; mod points; pub use aggregate::{bls12_318_aggregate_g1, bls12_318_aggregate_g2}; +pub use pairing::{bls12_381_pairing_equality, bls12_381_pairing, bls12_381_multi_miller_loop}; diff --git a/packages/crypto/src/bls12_318/pairing.rs b/packages/crypto/src/bls12_318/pairing.rs new file mode 100644 index 0000000000..42988627d8 --- /dev/null +++ b/packages/crypto/src/bls12_318/pairing.rs @@ -0,0 +1,37 @@ +use super::points::{Gt, G1, G2}; +use bls12_381::G2Prepared; +use rayon::iter::{IndexedParallelIterator, IntoParallelRefIterator, ParallelIterator}; + +/// Invoke the pairing function over the pair +pub fn bls12_381_pairing(p: &G1, q: &G2) -> Gt { + Gt(bls12_381::pairing(&p.0, &q.0)) +} + +/// Compute the sums of the miller loop invocations over a series of point pairs +/// and execute the final exponentiation. +pub fn bls12_381_multi_miller_loop(points: &[(&G1, &G2)]) -> Gt { + let mut prepared_g2 = Vec::with_capacity(points.len()); + points + .par_iter() + .map(|(_g1, g2)| G2Prepared::from(g2.0)) + .collect_into_vec(&mut prepared_g2); + + let terms: Vec<_> = points + .iter() + .map(|(g1, _g2)| &g1.0) + .zip(prepared_g2.iter()) + .collect(); + + Gt(bls12_381::multi_miller_loop(&terms).final_exponentiation()) +} + +/// Check whether the following condition holds true: +/// +/// $$ +/// e(p, q) = e(r, s) +/// $$ +pub fn bls12_381_pairing_equality(p: &G1, q: &G2, r: &G1, s: &G2) -> bool { + let p_neg = -p; + let terms = [(&p_neg, q), (r, s)]; + bls12_381_multi_miller_loop(&terms).is_identity() +} diff --git a/packages/crypto/src/bls12_318/points.rs b/packages/crypto/src/bls12_318/points.rs index b77b1ee9a3..90562c9073 100644 --- a/packages/crypto/src/bls12_318/points.rs +++ b/packages/crypto/src/bls12_318/points.rs @@ -1,9 +1,37 @@ #![allow(unused)] -use std::fmt; use std::ops::Add; +use std::{fmt, ops::Neg}; -use bls12_381::{G1Affine, G1Projective, G2Affine, G2Projective}; +use bls12_381::{ + hash_to_curve::{ExpandMessage, HashToCurve}, + G1Affine, G1Projective, G2Affine, G2Projective, +}; +use pairing::group::Group; + +/// Element of Gt +#[derive(Debug, PartialEq, Clone)] +pub struct Gt(pub(crate) bls12_381::Gt); + +impl Gt { + /// Creates the identity element of Gt (which is 1) + #[inline] + pub fn identity() -> Self { + Self(bls12_381::Gt::identity()) + } + + /// Double this element + #[inline] + pub fn double(&self) -> Self { + Self(self.0.double()) + } + + /// Check whether this element is the identity + #[inline] + pub fn is_identity(&self) -> bool { + self.0.is_identity().into() + } +} /// Point on G1 #[derive(Debug, PartialEq, Clone)] @@ -65,6 +93,22 @@ impl Add<&G1> for &G1 { } } +impl Neg for G1 { + type Output = G1; + + fn neg(self) -> Self::Output { + G1(-self.0) + } +} + +impl Neg for &G1 { + type Output = G1; + + fn neg(self) -> Self::Output { + G1(-self.0) + } +} + impl core::iter::Sum for G1 { fn sum>(iter: I) -> Self { let zero = G1Projective::identity(); @@ -149,6 +193,13 @@ impl fmt::Display for InvalidPoint { } } +pub fn g1_from_hash(msg: &[u8], dst: &[u8]) -> G1 +where + X: ExpandMessage, +{ + G1(>::hash_to_curve(msg, dst).into()) +} + pub fn g1_from_variable(data: &[u8]) -> Result { if data.len() != 48 { return Err(InvalidPoint::InvalidLength { @@ -172,6 +223,13 @@ pub fn g1s_from_variable(data_list: &[&[u8]]) -> Vec> { out } +pub fn g2_from_hash(msg: &[u8], dst: &[u8]) -> G2 +where + X: ExpandMessage, +{ + G2(>::hash_to_curve(msg, dst).into()) +} + pub fn g2_from_variable(data: &[u8]) -> Result { if data.len() != 96 { return Err(InvalidPoint::InvalidLength { diff --git a/packages/crypto/src/lib.rs b/packages/crypto/src/lib.rs index 3b7f63a872..fe6ef4d53a 100644 --- a/packages/crypto/src/lib.rs +++ b/packages/crypto/src/lib.rs @@ -19,7 +19,11 @@ mod identity_digest; mod secp256k1; mod secp256r1; -pub use crate::bls12_318::{bls12_318_aggregate_g1, bls12_318_aggregate_g2}; +#[doc(hidden)] +pub use crate::bls12_318::{ + bls12_318_aggregate_g1, bls12_318_aggregate_g2, bls12_381_pairing_equality, bls12_381_pairing, + bls12_381_multi_miller_loop, +}; #[doc(hidden)] pub use crate::ecdsa::{ECDSA_PUBKEY_MAX_LEN, ECDSA_SIGNATURE_LEN, MESSAGE_HASH_MAX_LEN}; #[doc(hidden)] From 685af5517d86eaa8e61a1ccdf7c28e11c909bbe7 Mon Sep 17 00:00:00 2001 From: Aumetra Weisman Date: Tue, 2 Apr 2024 13:26:51 +0200 Subject: [PATCH 04/79] Pre-allocate storage for terms --- packages/crypto/src/bls12_318/mod.rs | 2 +- packages/crypto/src/bls12_318/pairing.rs | 8 +++----- packages/crypto/src/lib.rs | 4 ++-- 3 files changed, 6 insertions(+), 8 deletions(-) diff --git a/packages/crypto/src/bls12_318/mod.rs b/packages/crypto/src/bls12_318/mod.rs index 13816fb5e3..2d28e18e02 100644 --- a/packages/crypto/src/bls12_318/mod.rs +++ b/packages/crypto/src/bls12_318/mod.rs @@ -3,4 +3,4 @@ mod pairing; mod points; pub use aggregate::{bls12_318_aggregate_g1, bls12_318_aggregate_g2}; -pub use pairing::{bls12_381_pairing_equality, bls12_381_pairing, bls12_381_multi_miller_loop}; +pub use pairing::{bls12_381_multi_miller_loop, bls12_381_pairing, bls12_381_pairing_equality}; diff --git a/packages/crypto/src/bls12_318/pairing.rs b/packages/crypto/src/bls12_318/pairing.rs index 42988627d8..81276cd61b 100644 --- a/packages/crypto/src/bls12_318/pairing.rs +++ b/packages/crypto/src/bls12_318/pairing.rs @@ -16,11 +16,9 @@ pub fn bls12_381_multi_miller_loop(points: &[(&G1, &G2)]) -> Gt { .map(|(_g1, g2)| G2Prepared::from(g2.0)) .collect_into_vec(&mut prepared_g2); - let terms: Vec<_> = points - .iter() - .map(|(g1, _g2)| &g1.0) - .zip(prepared_g2.iter()) - .collect(); + let mut terms = Vec::with_capacity(points.len()); + let term_iter = points.iter().map(|(g1, _g2)| &g1.0).zip(prepared_g2.iter()); + terms.extend(term_iter); Gt(bls12_381::multi_miller_loop(&terms).final_exponentiation()) } diff --git a/packages/crypto/src/lib.rs b/packages/crypto/src/lib.rs index fe6ef4d53a..0d53dcff2c 100644 --- a/packages/crypto/src/lib.rs +++ b/packages/crypto/src/lib.rs @@ -21,8 +21,8 @@ mod secp256r1; #[doc(hidden)] pub use crate::bls12_318::{ - bls12_318_aggregate_g1, bls12_318_aggregate_g2, bls12_381_pairing_equality, bls12_381_pairing, - bls12_381_multi_miller_loop, + bls12_318_aggregate_g1, bls12_318_aggregate_g2, bls12_381_multi_miller_loop, bls12_381_pairing, + bls12_381_pairing_equality, }; #[doc(hidden)] pub use crate::ecdsa::{ECDSA_PUBKEY_MAX_LEN, ECDSA_SIGNATURE_LEN, MESSAGE_HASH_MAX_LEN}; From 239a6b6aac4316ffd8b4daa58f98ee204683749d Mon Sep 17 00:00:00 2001 From: Aumetra Weisman Date: Tue, 2 Apr 2024 13:48:26 +0200 Subject: [PATCH 05/79] Add pairing equality tests --- packages/crypto/src/bls12_318/pairing.rs | 55 ++++++++++++++++++++++++ packages/crypto/src/bls12_318/points.rs | 11 +++-- 2 files changed, 60 insertions(+), 6 deletions(-) diff --git a/packages/crypto/src/bls12_318/pairing.rs b/packages/crypto/src/bls12_318/pairing.rs index 81276cd61b..6fe5cbcb23 100644 --- a/packages/crypto/src/bls12_318/pairing.rs +++ b/packages/crypto/src/bls12_318/pairing.rs @@ -33,3 +33,58 @@ pub fn bls12_381_pairing_equality(p: &G1, q: &G2, r: &G1, s: &G2) -> bool { let terms = [(&p_neg, q), (r, s)]; bls12_381_multi_miller_loop(&terms).is_identity() } + +#[cfg(test)] +mod test { + use bls12_381::hash_to_curve::ExpandMsgXmd; + use digest::generic_array::GenericArray; + use hex_literal::hex; + use sha2_v9::{Digest, Sha256}; + + use crate::{ + bls12_318::points::{g1_from_fixed, g2_from_hash, g2_from_variable, G1}, + bls12_381_pairing_equality, + }; + + // Let's directly go for something really cool and advanced: + // dRand compatibility of this API + + // See https://github.com/drand/kyber-bls12381/issues/22 and + // https://github.com/drand/drand/pull/1249 + const DOMAIN_HASH_TO_G2: &[u8] = b"BLS_SIG_BLS12381G2_XMD:SHA-256_SSWU_RO_NUL_"; + + /// Public key League of Entropy Mainnet (curl -sS https://drand.cloudflare.com/info) + const PK_LEO_MAINNET: [u8; 48] = hex!("868f005eb8e6e4ca0a47c8a77ceaa5309a47978a7c71bc5cce96366b5d7a569937c529eeda66c7293784a9402801af31"); + + fn build_message( + round: u64, + previous_signature: &[u8], + ) -> GenericArray::OutputSize> { + Sha256::new() + .chain(previous_signature) + .chain(round.to_be_bytes()) + .finalize() + } + + #[test] + fn pairing_equality_works() { + let previous_signature = hex::decode("a609e19a03c2fcc559e8dae14900aaefe517cb55c840f6e69bc8e4f66c8d18e8a609685d9917efbfb0c37f058c2de88f13d297c7e19e0ab24813079efe57a182554ff054c7638153f9b26a60e7111f71a0ff63d9571704905d3ca6df0b031747").unwrap(); + let signature = hex::decode("82f5d3d2de4db19d40a6980e8aa37842a0e55d1df06bd68bddc8d60002e8e959eb9cfa368b3c1b77d18f02a54fe047b80f0989315f83b12a74fd8679c4f12aae86eaf6ab5690b34f1fddd50ee3cc6f6cdf59e95526d5a5d82aaa84fa6f181e42").unwrap(); + let round: u64 = 72785; + + let key = g1_from_fixed(&PK_LEO_MAINNET).unwrap(); + let sigma = g2_from_variable(&signature).unwrap(); + let g1 = G1::generator(); + let msg = build_message(round, &previous_signature); + let g2_msg = g2_from_hash::>(msg.as_slice(), DOMAIN_HASH_TO_G2); + + assert!(bls12_381_pairing_equality(&g1, &sigma, &key, &g2_msg)); + + // Wrong round -> Therefore wrong hashed G2 point + #[allow(clippy::unusual_byte_groupings)] + let msg = build_message(0xDEAD_2_BAD, &previous_signature); + let g2_msg = g2_from_hash::>(msg.as_slice(), DOMAIN_HASH_TO_G2); + + assert!(!bls12_381_pairing_equality(&g1, &sigma, &key, &g2_msg)); + } +} diff --git a/packages/crypto/src/bls12_318/points.rs b/packages/crypto/src/bls12_318/points.rs index 90562c9073..ab4ef0eff9 100644 --- a/packages/crypto/src/bls12_318/points.rs +++ b/packages/crypto/src/bls12_318/points.rs @@ -20,12 +20,6 @@ impl Gt { Self(bls12_381::Gt::identity()) } - /// Double this element - #[inline] - pub fn double(&self) -> Self { - Self(self.0.double()) - } - /// Check whether this element is the identity #[inline] pub fn is_identity(&self) -> bool { @@ -367,4 +361,9 @@ mod tests { let b = g2_from_fixed(&data).unwrap(); assert_eq!(a, b); } + + #[test] + fn gt_is_identity_works() { + assert!(Gt::identity().is_identity()); + } } From 034cd0bc545d60895f28372e86e6cf2575de1efa Mon Sep 17 00:00:00 2001 From: Aumetra Weisman Date: Tue, 2 Apr 2024 15:15:55 +0200 Subject: [PATCH 06/79] Test aggregated validation --- packages/crypto/src/bls12_318/pairing.rs | 39 ++++++++++++++++++++---- packages/crypto/src/bls12_318/points.rs | 8 +++++ 2 files changed, 41 insertions(+), 6 deletions(-) diff --git a/packages/crypto/src/bls12_318/pairing.rs b/packages/crypto/src/bls12_318/pairing.rs index 6fe5cbcb23..0b9c4e5bda 100644 --- a/packages/crypto/src/bls12_318/pairing.rs +++ b/packages/crypto/src/bls12_318/pairing.rs @@ -80,11 +80,38 @@ mod test { assert!(bls12_381_pairing_equality(&g1, &sigma, &key, &g2_msg)); - // Wrong round -> Therefore wrong hashed G2 point - #[allow(clippy::unusual_byte_groupings)] - let msg = build_message(0xDEAD_2_BAD, &previous_signature); - let g2_msg = g2_from_hash::>(msg.as_slice(), DOMAIN_HASH_TO_G2); - - assert!(!bls12_381_pairing_equality(&g1, &sigma, &key, &g2_msg)); + // Do this in a separate scope to not shadow with wrong values + { + // Wrong round -> Therefore wrong hashed G2 point + #[allow(clippy::unusual_byte_groupings)] + let msg = build_message(0xDEAD_2_BAD, &previous_signature); + let g2_msg = g2_from_hash::>(msg.as_slice(), DOMAIN_HASH_TO_G2); + + assert!(!bls12_381_pairing_equality(&g1, &sigma, &key, &g2_msg)); + } + + // curl -sS https://drand.cloudflare.com/public/1 + let previous_signature = + hex::decode("176f93498eac9ca337150b46d21dd58673ea4e3581185f869672e59fa4cb390a") + .unwrap(); + let signature = hex::decode("8d61d9100567de44682506aea1a7a6fa6e5491cd27a0a0ed349ef6910ac5ac20ff7bc3e09d7c046566c9f7f3c6f3b10104990e7cb424998203d8f7de586fb7fa5f60045417a432684f85093b06ca91c769f0e7ca19268375e659c2a2352b4655").unwrap(); + let round: u64 = 1; + + // Aggregate things down + let aggregated_key = &key + &key; + let aggregated_sigma = &sigma + &g2_from_variable(&signature).unwrap(); + let aggregated_g1 = &g1 + &g1; + let aggregated_msg = &g2_msg + + &g2_from_hash::>( + build_message(round, &previous_signature).as_slice(), + DOMAIN_HASH_TO_G2, + ); + + assert!(bls12_381_pairing_equality( + &aggregated_g1, + &aggregated_sigma, + &aggregated_key, + &aggregated_msg + )); } } diff --git a/packages/crypto/src/bls12_318/points.rs b/packages/crypto/src/bls12_318/points.rs index ab4ef0eff9..8d94d0fa00 100644 --- a/packages/crypto/src/bls12_318/points.rs +++ b/packages/crypto/src/bls12_318/points.rs @@ -152,6 +152,14 @@ impl G2 { } } +impl Add<&G2> for &G2 { + type Output = G2; + + fn add(self, rhs: &G2) -> Self::Output { + [self, rhs].into_iter().sum() + } +} + impl core::iter::Sum for G2 { fn sum>(iter: I) -> Self { let zero = G2Projective::identity(); From de533a1e5461365ac23c7d145c324cfdc94b07ee Mon Sep 17 00:00:00 2001 From: Aumetra Weisman Date: Wed, 3 Apr 2024 11:44:13 +0200 Subject: [PATCH 07/79] Remove generic parameters from hashing to the subgroups --- packages/crypto/src/bls12_318/pairing.rs | 10 ++--- packages/crypto/src/bls12_318/points.rs | 51 +++++++++++++++++++----- 2 files changed, 46 insertions(+), 15 deletions(-) diff --git a/packages/crypto/src/bls12_318/pairing.rs b/packages/crypto/src/bls12_318/pairing.rs index 0b9c4e5bda..dce56fff0a 100644 --- a/packages/crypto/src/bls12_318/pairing.rs +++ b/packages/crypto/src/bls12_318/pairing.rs @@ -36,13 +36,12 @@ pub fn bls12_381_pairing_equality(p: &G1, q: &G2, r: &G1, s: &G2) -> bool { #[cfg(test)] mod test { - use bls12_381::hash_to_curve::ExpandMsgXmd; use digest::generic_array::GenericArray; use hex_literal::hex; use sha2_v9::{Digest, Sha256}; use crate::{ - bls12_318::points::{g1_from_fixed, g2_from_hash, g2_from_variable, G1}, + bls12_318::points::{g1_from_fixed, g2_from_hash, g2_from_variable, HashFunction, G1}, bls12_381_pairing_equality, }; @@ -76,7 +75,7 @@ mod test { let sigma = g2_from_variable(&signature).unwrap(); let g1 = G1::generator(); let msg = build_message(round, &previous_signature); - let g2_msg = g2_from_hash::>(msg.as_slice(), DOMAIN_HASH_TO_G2); + let g2_msg = g2_from_hash(HashFunction::Sha256, msg.as_slice(), DOMAIN_HASH_TO_G2); assert!(bls12_381_pairing_equality(&g1, &sigma, &key, &g2_msg)); @@ -85,7 +84,7 @@ mod test { // Wrong round -> Therefore wrong hashed G2 point #[allow(clippy::unusual_byte_groupings)] let msg = build_message(0xDEAD_2_BAD, &previous_signature); - let g2_msg = g2_from_hash::>(msg.as_slice(), DOMAIN_HASH_TO_G2); + let g2_msg = g2_from_hash(HashFunction::Sha256, msg.as_slice(), DOMAIN_HASH_TO_G2); assert!(!bls12_381_pairing_equality(&g1, &sigma, &key, &g2_msg)); } @@ -102,7 +101,8 @@ mod test { let aggregated_sigma = &sigma + &g2_from_variable(&signature).unwrap(); let aggregated_g1 = &g1 + &g1; let aggregated_msg = &g2_msg - + &g2_from_hash::>( + + &g2_from_hash( + HashFunction::Sha256, build_message(round, &previous_signature).as_slice(), DOMAIN_HASH_TO_G2, ); diff --git a/packages/crypto/src/bls12_318/points.rs b/packages/crypto/src/bls12_318/points.rs index 8d94d0fa00..905724497b 100644 --- a/packages/crypto/src/bls12_318/points.rs +++ b/packages/crypto/src/bls12_318/points.rs @@ -3,11 +3,13 @@ use std::ops::Add; use std::{fmt, ops::Neg}; +use bls12_381::hash_to_curve::ExpandMsgXmd; use bls12_381::{ hash_to_curve::{ExpandMessage, HashToCurve}, G1Affine, G1Projective, G2Affine, G2Projective, }; use pairing::group::Group; +use sha2_v9::Sha256; /// Element of Gt #[derive(Debug, PartialEq, Clone)] @@ -195,11 +197,37 @@ impl fmt::Display for InvalidPoint { } } -pub fn g1_from_hash(msg: &[u8], dst: &[u8]) -> G1 -where - X: ExpandMessage, -{ - G1(>::hash_to_curve(msg, dst).into()) +#[derive(Clone, Copy, Debug, PartialEq)] +#[non_exhaustive] +pub enum HashFunction { + Sha256, +} + +impl HashFunction { + pub fn from_usize(idx: usize) -> Option { + let hash = match idx { + 0 => Self::Sha256, + _ => return None, + }; + + Some(hash) + } + + pub fn to_usize(self) -> usize { + match self { + Self::Sha256 => 0, + } + } +} + +pub fn g1_from_hash(hash: HashFunction, msg: &[u8], dst: &[u8]) -> G1 { + let g1 = match hash { + HashFunction::Sha256 => { + >>::hash_to_curve(msg, dst) + } + }; + + G1(g1.into()) } pub fn g1_from_variable(data: &[u8]) -> Result { @@ -225,11 +253,14 @@ pub fn g1s_from_variable(data_list: &[&[u8]]) -> Vec> { out } -pub fn g2_from_hash(msg: &[u8], dst: &[u8]) -> G2 -where - X: ExpandMessage, -{ - G2(>::hash_to_curve(msg, dst).into()) +pub fn g2_from_hash(hash: HashFunction, msg: &[u8], dst: &[u8]) -> G2 { + let g2 = match hash { + HashFunction::Sha256 => { + >>::hash_to_curve(msg, dst) + } + }; + + G2(g2.into()) } pub fn g2_from_variable(data: &[u8]) -> Result { From bd4eead5eec7155c9807e89a78fbd8aebc52a756 Mon Sep 17 00:00:00 2001 From: Aumetra Weisman Date: Thu, 4 Apr 2024 12:59:11 +0200 Subject: [PATCH 08/79] Convert to byte-based API --- packages/crypto/src/bls12_318/aggregate.rs | 8 +- packages/crypto/src/bls12_318/constants.rs | 9 ++ packages/crypto/src/bls12_318/hash.rs | 48 +++++++++++ packages/crypto/src/bls12_318/mod.rs | 8 +- packages/crypto/src/bls12_318/pairing.rs | 95 ++++++++++++---------- packages/crypto/src/bls12_318/points.rs | 43 ---------- packages/crypto/src/lib.rs | 4 +- 7 files changed, 123 insertions(+), 92 deletions(-) create mode 100644 packages/crypto/src/bls12_318/constants.rs create mode 100644 packages/crypto/src/bls12_318/hash.rs diff --git a/packages/crypto/src/bls12_318/aggregate.rs b/packages/crypto/src/bls12_318/aggregate.rs index 9c5bdb6a08..f352aa5d34 100644 --- a/packages/crypto/src/bls12_318/aggregate.rs +++ b/packages/crypto/src/bls12_318/aggregate.rs @@ -7,7 +7,7 @@ const G2_POINT_SIZE: usize = 96; /// /// This is like Aggregate from /// but works for signatures as well as public keys. -pub fn bls12_318_aggregate_g1(points: &[u8]) -> Result<[u8; 48], InvalidPoint> { +pub fn bls12_381_aggregate_g1(points: &[u8]) -> Result<[u8; 48], InvalidPoint> { if points.len() % G1_POINT_SIZE != 0 { return Err(InvalidPoint::DecodingError {}); } @@ -43,7 +43,7 @@ pub fn bls12_318_aggregate_g1(points: &[u8]) -> Result<[u8; 48], InvalidPoint> { /// /// This is like Aggregate from /// but works for signatures as well as public keys. -pub fn bls12_318_aggregate_g2(points: &[u8]) -> Result<[u8; 96], InvalidPoint> { +pub fn bls12_381_aggregate_g2(points: &[u8]) -> Result<[u8; 96], InvalidPoint> { if points.len() % G2_POINT_SIZE != 0 { return Err(InvalidPoint::DecodingError {}); } @@ -137,13 +137,13 @@ mod tests { #[test] fn bls12_318_aggregate_g1_works() { - let sum = bls12_318_aggregate_g1(b"").unwrap(); + let sum = bls12_381_aggregate_g1(b"").unwrap(); assert_eq!(sum, G1::identity().to_compressed()); } #[test] fn bls12_318_aggregate_g2_works() { - let sum = bls12_318_aggregate_g2(b"").unwrap(); + let sum = bls12_381_aggregate_g2(b"").unwrap(); assert_eq!(sum, G2::identity().to_compressed()); } diff --git a/packages/crypto/src/bls12_318/constants.rs b/packages/crypto/src/bls12_318/constants.rs new file mode 100644 index 0000000000..a39d050fe3 --- /dev/null +++ b/packages/crypto/src/bls12_318/constants.rs @@ -0,0 +1,9 @@ +use bls12_381::{G1Affine, G2Affine}; + +pub fn bls12_381_g1_generator() -> [u8; 48] { + G1Affine::generator().to_compressed() +} + +pub fn bls12_381_g2_generator() -> [u8; 96] { + G2Affine::generator().to_compressed() +} diff --git a/packages/crypto/src/bls12_318/hash.rs b/packages/crypto/src/bls12_318/hash.rs new file mode 100644 index 0000000000..fa13b09c65 --- /dev/null +++ b/packages/crypto/src/bls12_318/hash.rs @@ -0,0 +1,48 @@ +use bls12_381::{ + hash_to_curve::{ExpandMsgXmd, HashToCurve}, + G1Affine, G1Projective, G2Affine, G2Projective, +}; +use sha2_v9::Sha256; + +#[derive(Clone, Copy, Debug, PartialEq)] +#[non_exhaustive] +pub enum HashFunction { + Sha256, +} + +impl HashFunction { + pub fn from_usize(idx: usize) -> Option { + let hash = match idx { + 0 => Self::Sha256, + _ => return None, + }; + + Some(hash) + } + + pub fn to_usize(self) -> usize { + match self { + Self::Sha256 => 0, + } + } +} + +pub fn bls12_381_hash_to_g1(hash: HashFunction, msg: &[u8], dst: &[u8]) -> [u8; 48] { + let g1 = match hash { + HashFunction::Sha256 => { + >>::hash_to_curve(msg, dst) + } + }; + + G1Affine::from(g1).to_compressed() +} + +pub fn bls12_381_hash_to_g2(hash: HashFunction, msg: &[u8], dst: &[u8]) -> [u8; 96] { + let g2 = match hash { + HashFunction::Sha256 => { + >>::hash_to_curve(msg, dst) + } + }; + + G2Affine::from(g2).to_compressed() +} diff --git a/packages/crypto/src/bls12_318/mod.rs b/packages/crypto/src/bls12_318/mod.rs index 2d28e18e02..b43516ae69 100644 --- a/packages/crypto/src/bls12_318/mod.rs +++ b/packages/crypto/src/bls12_318/mod.rs @@ -1,6 +1,10 @@ mod aggregate; +mod constants; +mod hash; mod pairing; mod points; -pub use aggregate::{bls12_318_aggregate_g1, bls12_318_aggregate_g2}; -pub use pairing::{bls12_381_multi_miller_loop, bls12_381_pairing, bls12_381_pairing_equality}; +pub use aggregate::{bls12_381_aggregate_g1, bls12_381_aggregate_g2}; +pub use constants::{bls12_381_g1_generator, bls12_381_g2_generator}; +pub use hash::{bls12_381_hash_to_g1, bls12_381_hash_to_g2, HashFunction}; +pub use pairing::bls12_381_pairing_equality; diff --git a/packages/crypto/src/bls12_318/pairing.rs b/packages/crypto/src/bls12_318/pairing.rs index dce56fff0a..1b314eaf2d 100644 --- a/packages/crypto/src/bls12_318/pairing.rs +++ b/packages/crypto/src/bls12_318/pairing.rs @@ -1,37 +1,35 @@ -use super::points::{Gt, G1, G2}; +use super::points::{g1_from_fixed, g2_from_fixed, InvalidPoint}; use bls12_381::G2Prepared; -use rayon::iter::{IndexedParallelIterator, IntoParallelRefIterator, ParallelIterator}; - -/// Invoke the pairing function over the pair -pub fn bls12_381_pairing(p: &G1, q: &G2) -> Gt { - Gt(bls12_381::pairing(&p.0, &q.0)) -} - -/// Compute the sums of the miller loop invocations over a series of point pairs -/// and execute the final exponentiation. -pub fn bls12_381_multi_miller_loop(points: &[(&G1, &G2)]) -> Gt { - let mut prepared_g2 = Vec::with_capacity(points.len()); - points - .par_iter() - .map(|(_g1, g2)| G2Prepared::from(g2.0)) - .collect_into_vec(&mut prepared_g2); - - let mut terms = Vec::with_capacity(points.len()); - let term_iter = points.iter().map(|(g1, _g2)| &g1.0).zip(prepared_g2.iter()); - terms.extend(term_iter); - - Gt(bls12_381::multi_miller_loop(&terms).final_exponentiation()) -} +use pairing::group::Group; /// Check whether the following condition holds true: /// /// $$ /// e(p, q) = e(r, s) /// $$ -pub fn bls12_381_pairing_equality(p: &G1, q: &G2, r: &G1, s: &G2) -> bool { +pub fn bls12_381_pairing_equality( + p: &[u8; 48], + q: &[u8; 96], + r: &[u8; 48], + s: &[u8; 96], +) -> Result { + let (p, q, r, s) = ( + g1_from_fixed(p)?, + g2_from_fixed(q)?, + g1_from_fixed(r)?, + g2_from_fixed(s)?, + ); + let p_neg = -p; - let terms = [(&p_neg, q), (r, s)]; - bls12_381_multi_miller_loop(&terms).is_identity() + let terms = [ + (&p_neg.0, &G2Prepared::from(q.0)), + (&r.0, &G2Prepared::from(s.0)), + ]; + + Ok(bls12_381::multi_miller_loop(&terms) + .final_exponentiation() + .is_identity() + .into()) } #[cfg(test)] @@ -41,8 +39,8 @@ mod test { use sha2_v9::{Digest, Sha256}; use crate::{ - bls12_318::points::{g1_from_fixed, g2_from_hash, g2_from_variable, HashFunction, G1}, - bls12_381_pairing_equality, + bls12_318::points::{g1_from_fixed, g2_from_fixed, g2_from_variable, G1}, + bls12_381_hash_to_g2, bls12_381_pairing_equality, HashFunction, }; // Let's directly go for something really cool and advanced: @@ -75,18 +73,31 @@ mod test { let sigma = g2_from_variable(&signature).unwrap(); let g1 = G1::generator(); let msg = build_message(round, &previous_signature); - let g2_msg = g2_from_hash(HashFunction::Sha256, msg.as_slice(), DOMAIN_HASH_TO_G2); + let g2_msg = bls12_381_hash_to_g2(HashFunction::Sha256, msg.as_slice(), DOMAIN_HASH_TO_G2); - assert!(bls12_381_pairing_equality(&g1, &sigma, &key, &g2_msg)); + assert!(bls12_381_pairing_equality( + &g1.to_compressed(), + &sigma.to_compressed(), + &PK_LEO_MAINNET, + &g2_msg + ) + .unwrap()); // Do this in a separate scope to not shadow with wrong values { // Wrong round -> Therefore wrong hashed G2 point #[allow(clippy::unusual_byte_groupings)] let msg = build_message(0xDEAD_2_BAD, &previous_signature); - let g2_msg = g2_from_hash(HashFunction::Sha256, msg.as_slice(), DOMAIN_HASH_TO_G2); - - assert!(!bls12_381_pairing_equality(&g1, &sigma, &key, &g2_msg)); + let g2_msg = + bls12_381_hash_to_g2(HashFunction::Sha256, msg.as_slice(), DOMAIN_HASH_TO_G2); + + assert!(!bls12_381_pairing_equality( + &g1.to_compressed(), + &sigma.to_compressed(), + &PK_LEO_MAINNET, + &g2_msg + ) + .unwrap()); } // curl -sS https://drand.cloudflare.com/public/1 @@ -100,18 +111,20 @@ mod test { let aggregated_key = &key + &key; let aggregated_sigma = &sigma + &g2_from_variable(&signature).unwrap(); let aggregated_g1 = &g1 + &g1; - let aggregated_msg = &g2_msg - + &g2_from_hash( + let aggregated_msg = &g2_from_fixed(&g2_msg).unwrap() + + &g2_from_fixed(&bls12_381_hash_to_g2( HashFunction::Sha256, build_message(round, &previous_signature).as_slice(), DOMAIN_HASH_TO_G2, - ); + )) + .unwrap(); assert!(bls12_381_pairing_equality( - &aggregated_g1, - &aggregated_sigma, - &aggregated_key, - &aggregated_msg - )); + &aggregated_g1.to_compressed(), + &aggregated_sigma.to_compressed(), + &aggregated_key.to_compressed(), + &aggregated_msg.to_compressed() + ) + .unwrap()); } } diff --git a/packages/crypto/src/bls12_318/points.rs b/packages/crypto/src/bls12_318/points.rs index 905724497b..d6bd8d11ca 100644 --- a/packages/crypto/src/bls12_318/points.rs +++ b/packages/crypto/src/bls12_318/points.rs @@ -197,39 +197,6 @@ impl fmt::Display for InvalidPoint { } } -#[derive(Clone, Copy, Debug, PartialEq)] -#[non_exhaustive] -pub enum HashFunction { - Sha256, -} - -impl HashFunction { - pub fn from_usize(idx: usize) -> Option { - let hash = match idx { - 0 => Self::Sha256, - _ => return None, - }; - - Some(hash) - } - - pub fn to_usize(self) -> usize { - match self { - Self::Sha256 => 0, - } - } -} - -pub fn g1_from_hash(hash: HashFunction, msg: &[u8], dst: &[u8]) -> G1 { - let g1 = match hash { - HashFunction::Sha256 => { - >>::hash_to_curve(msg, dst) - } - }; - - G1(g1.into()) -} - pub fn g1_from_variable(data: &[u8]) -> Result { if data.len() != 48 { return Err(InvalidPoint::InvalidLength { @@ -253,16 +220,6 @@ pub fn g1s_from_variable(data_list: &[&[u8]]) -> Vec> { out } -pub fn g2_from_hash(hash: HashFunction, msg: &[u8], dst: &[u8]) -> G2 { - let g2 = match hash { - HashFunction::Sha256 => { - >>::hash_to_curve(msg, dst) - } - }; - - G2(g2.into()) -} - pub fn g2_from_variable(data: &[u8]) -> Result { if data.len() != 96 { return Err(InvalidPoint::InvalidLength { diff --git a/packages/crypto/src/lib.rs b/packages/crypto/src/lib.rs index 0d53dcff2c..fa726b5c32 100644 --- a/packages/crypto/src/lib.rs +++ b/packages/crypto/src/lib.rs @@ -21,8 +21,8 @@ mod secp256r1; #[doc(hidden)] pub use crate::bls12_318::{ - bls12_318_aggregate_g1, bls12_318_aggregate_g2, bls12_381_multi_miller_loop, bls12_381_pairing, - bls12_381_pairing_equality, + bls12_381_aggregate_g1, bls12_381_aggregate_g2, bls12_381_g1_generator, bls12_381_g2_generator, + bls12_381_hash_to_g1, bls12_381_hash_to_g2, bls12_381_pairing_equality, HashFunction, }; #[doc(hidden)] pub use crate::ecdsa::{ECDSA_PUBKEY_MAX_LEN, ECDSA_SIGNATURE_LEN, MESSAGE_HASH_MAX_LEN}; From 2c742ebda8904e0f0cb0b22b430fbc285dcbdf06 Mon Sep 17 00:00:00 2001 From: Aumetra Weisman Date: Wed, 10 Apr 2024 11:06:06 +0200 Subject: [PATCH 09/79] Fix compile errors --- packages/crypto/Cargo.toml | 8 ++++---- packages/crypto/src/bls12_318/points.rs | 5 +++-- packages/crypto/src/ed25519.rs | 4 +++- packages/crypto/src/lib.rs | 2 ++ packages/crypto/src/secp256r1.rs | 1 - packages/crypto/tests/bls12_381.rs | 8 +++++--- 6 files changed, 17 insertions(+), 11 deletions(-) diff --git a/packages/crypto/Cargo.toml b/packages/crypto/Cargo.toml index 53efabdd50..a9b50dbf11 100644 --- a/packages/crypto/Cargo.toml +++ b/packages/crypto/Cargo.toml @@ -9,7 +9,7 @@ license = "Apache-2.0" [features] default = [] -std = ["dep:thiserror"] +std = ["dep:bls12_381", "dep:rayon", "dep:sha2_v9", "dep:thiserror"] [lib] # See https://bheisler.github.io/criterion.rs/book/faq.html#cargo-bench-gives-unrecognized-option-errors-for-valid-command-line-options @@ -25,9 +25,9 @@ rand_core = "0.6" ecdsa = "0.16.2" p256 = { version = "0.13.2", default-features = false, features = ["ecdsa"] } pairing = "0.23.0" -bls12_381 = { version = "0.8.0", features = ["experimental"] } -rayon = "1.9.0" -sha2_v9 = { package = "sha2", version = "0.9.1" } # Must be compatible with bls12_381, see https://github.com/zkcrypto/bls12_381/issues/102 +bls12_381 = { version = "0.8.0", features = ["experimental"], optional = true } +rayon = { version = "1.9.0", optional = true } +sha2_v9 = { package = "sha2", version = "0.9.1", optional = true } # Must be compatible with bls12_381, see https://github.com/zkcrypto/bls12_381/issues/102 thiserror = { version = "1.0.26", optional = true } [dev-dependencies] diff --git a/packages/crypto/src/bls12_318/points.rs b/packages/crypto/src/bls12_318/points.rs index d6bd8d11ca..bd1a484b24 100644 --- a/packages/crypto/src/bls12_318/points.rs +++ b/packages/crypto/src/bls12_318/points.rs @@ -1,7 +1,8 @@ #![allow(unused)] -use std::ops::Add; -use std::{fmt, ops::Neg}; +use alloc::vec::Vec; +use core::ops::Add; +use core::{fmt, ops::Neg}; use bls12_381::hash_to_curve::ExpandMsgXmd; use bls12_381::{ diff --git a/packages/crypto/src/ed25519.rs b/packages/crypto/src/ed25519.rs index 31e2bc1aa2..d8ceea31f2 100644 --- a/packages/crypto/src/ed25519.rs +++ b/packages/crypto/src/ed25519.rs @@ -1,3 +1,5 @@ +use alloc::{string::String, vec::Vec}; + use ed25519_zebra::{batch, Signature, VerificationKey}; use rand_core::CryptoRngCore; @@ -142,7 +144,7 @@ fn read_pubkey(data: &[u8]) -> Result<[u8; 32], InvalidEd25519PubkeyFormat> { #[cfg(test)] mod tests { use super::*; - use alloc::{string::String, vec, vec::Vec}; + use alloc::vec; use ed25519_zebra::SigningKey; use rand_core::OsRng; use serde::Deserialize; diff --git a/packages/crypto/src/lib.rs b/packages/crypto/src/lib.rs index fa726b5c32..992633e6de 100644 --- a/packages/crypto/src/lib.rs +++ b/packages/crypto/src/lib.rs @@ -11,6 +11,7 @@ extern crate alloc; extern crate std; // allow for file I/O during tests mod backtrace; +#[cfg(feature = "std")] mod bls12_318; mod ecdsa; mod ed25519; @@ -19,6 +20,7 @@ mod identity_digest; mod secp256k1; mod secp256r1; +#[cfg(feature = "std")] #[doc(hidden)] pub use crate::bls12_318::{ bls12_381_aggregate_g1, bls12_381_aggregate_g2, bls12_381_g1_generator, bls12_381_g2_generator, diff --git a/packages/crypto/src/secp256r1.rs b/packages/crypto/src/secp256r1.rs index 574f625500..8778569f64 100644 --- a/packages/crypto/src/secp256r1.rs +++ b/packages/crypto/src/secp256r1.rs @@ -1,5 +1,4 @@ use alloc::{string::ToString, vec::Vec}; -use core::convert::TryInto; use digest::{Digest, Update}; // trait use ecdsa::RecoveryId; use p256::{ diff --git a/packages/crypto/tests/bls12_381.rs b/packages/crypto/tests/bls12_381.rs index 12ad02c4f9..26d5153917 100644 --- a/packages/crypto/tests/bls12_381.rs +++ b/packages/crypto/tests/bls12_381.rs @@ -1,6 +1,8 @@ +#![cfg(feature = "std")] + use base64::engine::general_purpose::STANDARD; use base64_serde::base64_serde_type; -use cosmwasm_crypto::{bls12_318_aggregate_g1, bls12_318_aggregate_g2}; +use cosmwasm_crypto::{bls12_381_aggregate_g1, bls12_381_aggregate_g2}; base64_serde_type!(Base64Standard, STANDARD); @@ -64,7 +66,7 @@ fn bls12_318_aggregate_g1_works() { let pubkeys: Vec<&[u8]> = file.public_keys.iter().map(|m| m.0.as_slice()).collect(); let pubkeys_combined: Vec = pubkeys.concat(); - let sum = bls12_318_aggregate_g1(&pubkeys_combined).unwrap(); + let sum = bls12_381_aggregate_g1(&pubkeys_combined).unwrap(); assert_eq!(sum.as_slice(), file.aggregate_pubkey); } @@ -82,7 +84,7 @@ fn bls12_318_aggregate_g2_works() { let test = read_aggregate_test(json); let signatures: Vec<&[u8]> = test.input.iter().map(|m| m.as_slice()).collect(); let signatures_combined: Vec = signatures.concat(); - let sum = bls12_318_aggregate_g2(&signatures_combined).unwrap(); + let sum = bls12_381_aggregate_g2(&signatures_combined).unwrap(); match test.output { Some(expected) => assert_eq!(sum.as_slice(), expected), None => assert_eq!( From 7cf304332999672bc144676085732ca74ca17c0f Mon Sep 17 00:00:00 2001 From: Aumetra Weisman Date: Wed, 10 Apr 2024 11:07:24 +0200 Subject: [PATCH 10/79] Add CI step for crypto without default features --- .circleci/config.yml | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/.circleci/config.yml b/.circleci/config.yml index 9ed8c89b58..f0d299b80e 100644 --- a/.circleci/config.yml +++ b/.circleci/config.yml @@ -247,6 +247,10 @@ jobs: - restore_cache: keys: - cargocache-v2-package_crypto-rust:1.73-{{ checksum "Cargo.lock" }} + - run: + name: Build (no features) + working_directory: ~/project/packages/crypto + command: cargo build --locked --no-default-features - run: name: Build working_directory: ~/project/packages/crypto From a915beb70bbaba9b043a6592eac3129d2d10fbd7 Mon Sep 17 00:00:00 2001 From: Aumetra Weisman Date: Wed, 10 Apr 2024 12:59:04 +0200 Subject: [PATCH 11/79] Add BLS verify tests --- .circleci/config.yml | 6 +- Cargo.lock | 1 + packages/crypto/Cargo.toml | 1 + packages/crypto/src/bls12_318/mod.rs | 1 + packages/crypto/src/bls12_318/points.rs | 45 ++++++------- packages/crypto/src/lib.rs | 3 +- packages/crypto/tests/bls12_381.rs | 89 ++++++++++++++++++++++++- 7 files changed, 115 insertions(+), 31 deletions(-) diff --git a/.circleci/config.yml b/.circleci/config.yml index f0d299b80e..b25802f14b 100644 --- a/.circleci/config.yml +++ b/.circleci/config.yml @@ -252,13 +252,13 @@ jobs: working_directory: ~/project/packages/crypto command: cargo build --locked --no-default-features - run: - name: Build + name: Build (all features) working_directory: ~/project/packages/crypto - command: cargo build --locked + command: cargo build --locked --features std - run: name: Run tests working_directory: ~/project/packages/crypto - command: cargo test --locked + command: cargo test --locked --features std - save_cache: paths: - /usr/local/cargo/registry diff --git a/Cargo.lock b/Cargo.lock index 9e3373976d..b0c7e450c9 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -486,6 +486,7 @@ dependencies = [ "ecdsa", "ed25519-zebra", "english-numbers", + "glob", "hex", "hex-literal", "k256", diff --git a/packages/crypto/Cargo.toml b/packages/crypto/Cargo.toml index a9b50dbf11..1039983251 100644 --- a/packages/crypto/Cargo.toml +++ b/packages/crypto/Cargo.toml @@ -42,6 +42,7 @@ sha3 = "0.10" hex = { version = "0.4", features = ["serde"] } hex-literal = "0.4.1" english-numbers = "0.3" +glob = "0.3.1" [[bench]] name = "main" diff --git a/packages/crypto/src/bls12_318/mod.rs b/packages/crypto/src/bls12_318/mod.rs index b43516ae69..4dedc5b765 100644 --- a/packages/crypto/src/bls12_318/mod.rs +++ b/packages/crypto/src/bls12_318/mod.rs @@ -8,3 +8,4 @@ pub use aggregate::{bls12_381_aggregate_g1, bls12_381_aggregate_g2}; pub use constants::{bls12_381_g1_generator, bls12_381_g2_generator}; pub use hash::{bls12_381_hash_to_g1, bls12_381_hash_to_g2, HashFunction}; pub use pairing::bls12_381_pairing_equality; +pub use points::{bls12_381_g1_is_identity, bls12_381_g2_is_identity}; diff --git a/packages/crypto/src/bls12_318/points.rs b/packages/crypto/src/bls12_318/points.rs index bd1a484b24..153cdebc4c 100644 --- a/packages/crypto/src/bls12_318/points.rs +++ b/packages/crypto/src/bls12_318/points.rs @@ -12,24 +12,6 @@ use bls12_381::{ use pairing::group::Group; use sha2_v9::Sha256; -/// Element of Gt -#[derive(Debug, PartialEq, Clone)] -pub struct Gt(pub(crate) bls12_381::Gt); - -impl Gt { - /// Creates the identity element of Gt (which is 1) - #[inline] - pub fn identity() -> Self { - Self(bls12_381::Gt::identity()) - } - - /// Check whether this element is the identity - #[inline] - pub fn is_identity(&self) -> bool { - self.0.is_identity().into() - } -} - /// Point on G1 #[derive(Debug, PartialEq, Clone)] pub struct G1(pub(crate) G1Affine); @@ -47,6 +29,12 @@ impl G1 { Self(G1Affine::identity()) } + /// Check if the point is the identity element + #[inline] + pub fn is_identity(&self) -> bool { + self.0.is_identity().into() + } + #[inline] pub fn from_uncompressed(data: &[u8; 96]) -> Option { G1Affine::from_uncompressed(data).map(Self).into() @@ -139,6 +127,12 @@ impl G2 { Self(G2Affine::identity()) } + /// Check if the point is the identity element + #[inline] + pub fn is_identity(&self) -> bool { + self.0.is_identity().into() + } + #[inline] pub fn from_uncompressed(data: &[u8; 192]) -> Option { G2Affine::from_uncompressed(data).map(Self).into() @@ -179,7 +173,7 @@ impl<'a> core::iter::Sum<&'a G2> for G2 { } } -#[derive(Debug)] +#[derive(Debug, thiserror::Error)] pub enum InvalidPoint { InvalidLength { expected: usize, actual: usize }, DecodingError {}, @@ -262,6 +256,14 @@ pub fn g2_from_fixed_unchecked(data: [u8; 96]) -> Result { .ok_or(InvalidPoint::DecodingError {}) } +pub fn bls12_381_g1_is_identity(g1: &[u8; 48]) -> Result { + g1_from_fixed(g1).map(|point| point.is_identity()) +} + +pub fn bls12_381_g2_is_identity(g2: &[u8; 96]) -> Result { + g2_from_fixed(g2).map(|point| point.is_identity()) +} + #[cfg(test)] mod tests { use super::*; @@ -358,9 +360,4 @@ mod tests { let b = g2_from_fixed(&data).unwrap(); assert_eq!(a, b); } - - #[test] - fn gt_is_identity_works() { - assert!(Gt::identity().is_identity()); - } } diff --git a/packages/crypto/src/lib.rs b/packages/crypto/src/lib.rs index 992633e6de..657f32ddaf 100644 --- a/packages/crypto/src/lib.rs +++ b/packages/crypto/src/lib.rs @@ -23,7 +23,8 @@ mod secp256r1; #[cfg(feature = "std")] #[doc(hidden)] pub use crate::bls12_318::{ - bls12_381_aggregate_g1, bls12_381_aggregate_g2, bls12_381_g1_generator, bls12_381_g2_generator, + bls12_381_aggregate_g1, bls12_381_aggregate_g2, bls12_381_g1_generator, + bls12_381_g1_is_identity, bls12_381_g2_generator, bls12_381_g2_is_identity, bls12_381_hash_to_g1, bls12_381_hash_to_g2, bls12_381_pairing_equality, HashFunction, }; #[doc(hidden)] diff --git a/packages/crypto/tests/bls12_381.rs b/packages/crypto/tests/bls12_381.rs index 26d5153917..f6f55cea27 100644 --- a/packages/crypto/tests/bls12_381.rs +++ b/packages/crypto/tests/bls12_381.rs @@ -1,8 +1,14 @@ #![cfg(feature = "std")] +use std::{error::Error, fs}; + use base64::engine::general_purpose::STANDARD; use base64_serde::base64_serde_type; -use cosmwasm_crypto::{bls12_381_aggregate_g1, bls12_381_aggregate_g2}; +use cosmwasm_crypto::{ + bls12_381_aggregate_g1, bls12_381_aggregate_g2, bls12_381_g1_generator, + bls12_381_g1_is_identity, bls12_381_g2_is_identity, bls12_381_hash_to_g2, + bls12_381_pairing_equality, HashFunction, +}; base64_serde_type!(Base64Standard, STANDARD); @@ -31,6 +37,19 @@ struct AggregateTest { output: Option>, } +#[derive(serde::Deserialize, serde::Serialize)] +struct VerifyTestInput { + pubkey: String, + message: String, + signature: String, +} + +#[derive(serde::Deserialize, serde::Serialize)] +struct VerifyTestFile { + input: VerifyTestInput, + output: bool, +} + const ETH_HEADER_FILE: &str = include_str!("../testdata/eth-headers/1699693797.394876721s.json"); const AGGREGATE_1: &str = include_str!("../testdata/bls-tests/aggregate/aggregate_0x0000000000000000000000000000000000000000000000000000000000000000.json"); const AGGREGATE_2: &str = include_str!("../testdata/bls-tests/aggregate/aggregate_0x5656565656565656565656565656565656565656565656565656565656565656.json"); @@ -60,7 +79,7 @@ fn read_aggregate_test(json: &str) -> AggregateTest { // Test for https://eth2book.info/capella/part2/building_blocks/signatures/#aggregating-public-keys #[test] -fn bls12_318_aggregate_g1_works() { +fn bls12_381_aggregate_g1_works() { let file = read_eth_header_file(); let pubkeys: Vec<&[u8]> = file.public_keys.iter().map(|m| m.0.as_slice()).collect(); @@ -72,7 +91,7 @@ fn bls12_318_aggregate_g1_works() { // Test for https://eth2book.info/capella/part2/building_blocks/signatures/#aggregating-signatures #[test] -fn bls12_318_aggregate_g2_works() { +fn bls12_381_aggregate_g2_works() { for json in [ AGGREGATE_1, AGGREGATE_2, @@ -103,3 +122,67 @@ fn bls12_318_aggregate_g2_works() { } } } + +#[test] +fn bls12_381_verify_works() { + let paths = glob::glob("testdata/bls-tests/verify/*.json") + .unwrap() + .flatten(); + + for path in paths { + let test_data = fs::read(&path).unwrap(); + let test_data: VerifyTestFile = serde_json::from_slice(&test_data).unwrap(); + + let pubkey = hex::decode(&test_data.input.pubkey[2..]).unwrap(); + let message = hex::decode(&test_data.input.message[2..]).unwrap(); + let signature = hex::decode(&test_data.input.signature[2..]).unwrap(); + + let message_point = bls12_381_hash_to_g2( + HashFunction::Sha256, + &message, + b"BLS_SIG_BLS12381G2_XMD:SHA-256_SSWU_RO_POP_", + ); + + let pubkey = pubkey.try_into().unwrap(); + let signature = signature.try_into().unwrap(); + + let verify_result = (|| { + if bls12_381_g1_is_identity(&pubkey)? { + println!("pubkey is identity"); + return Ok(false); + } + + if bls12_381_g2_is_identity(&signature)? { + println!("signature is identity"); + return Ok(false); + } + + let bool_result = bls12_381_pairing_equality( + &pubkey, + &message_point, + &bls12_381_g1_generator(), + &signature, + )?; + + if !bool_result { + println!("pairing is not equal"); + } + + Ok::<_, Box>(bool_result) + })(); + + let verify_result = verify_result + .inspect_err(|err| eprintln!("error: {err}")) + .unwrap_or(false); + + assert_eq!( + verify_result, + test_data.output, + "Failed with test vector {}", + path.display() + ); + + println!("Finished case {}", path.display()); + println!("========================"); + } +} From 1a23904691a76042b7fa265244684a5d36e5a789 Mon Sep 17 00:00:00 2001 From: Aumetra Weisman Date: Wed, 10 Apr 2024 15:20:06 +0200 Subject: [PATCH 12/79] test hash to g2 --- .../sign/sign_case_11b8c7cad5238946.json | 7 --- .../sign/sign_case_142f678a8d05fcd1.json | 7 --- .../sign/sign_case_37286e1a6d1f6eb3.json | 7 --- .../sign/sign_case_7055381f640f2c1d.json | 7 --- .../sign/sign_case_84d45c9c7cca6b92.json | 7 --- .../sign/sign_case_8cd3d4d0d9a5b265.json | 7 --- .../sign/sign_case_c82df61aa3ee60fb.json | 7 --- .../sign/sign_case_d0e28d7e76eb6e9c.json | 7 --- .../sign/sign_case_f2ae1097e7d0e18b.json | 7 --- .../sign/sign_case_zero_privkey.json | 7 --- packages/crypto/tests/bls12_381.rs | 61 +++++++++++++++++-- 11 files changed, 56 insertions(+), 75 deletions(-) delete mode 100644 packages/crypto/testdata/bls-tests/sign/sign_case_11b8c7cad5238946.json delete mode 100644 packages/crypto/testdata/bls-tests/sign/sign_case_142f678a8d05fcd1.json delete mode 100644 packages/crypto/testdata/bls-tests/sign/sign_case_37286e1a6d1f6eb3.json delete mode 100644 packages/crypto/testdata/bls-tests/sign/sign_case_7055381f640f2c1d.json delete mode 100644 packages/crypto/testdata/bls-tests/sign/sign_case_84d45c9c7cca6b92.json delete mode 100644 packages/crypto/testdata/bls-tests/sign/sign_case_8cd3d4d0d9a5b265.json delete mode 100644 packages/crypto/testdata/bls-tests/sign/sign_case_c82df61aa3ee60fb.json delete mode 100644 packages/crypto/testdata/bls-tests/sign/sign_case_d0e28d7e76eb6e9c.json delete mode 100644 packages/crypto/testdata/bls-tests/sign/sign_case_f2ae1097e7d0e18b.json delete mode 100644 packages/crypto/testdata/bls-tests/sign/sign_case_zero_privkey.json diff --git a/packages/crypto/testdata/bls-tests/sign/sign_case_11b8c7cad5238946.json b/packages/crypto/testdata/bls-tests/sign/sign_case_11b8c7cad5238946.json deleted file mode 100644 index 5692f8e3b8..0000000000 --- a/packages/crypto/testdata/bls-tests/sign/sign_case_11b8c7cad5238946.json +++ /dev/null @@ -1,7 +0,0 @@ -{ - "input": { - "privkey": "0x47b8192d77bf871b62e87859d653922725724a5c031afeabc60bcef5ff665138", - "message": "0x0000000000000000000000000000000000000000000000000000000000000000" - }, - "output": "0xb23c46be3a001c63ca711f87a005c200cc550b9429d5f4eb38d74322144f1b63926da3388979e5321012fb1a0526bcd100b5ef5fe72628ce4cd5e904aeaa3279527843fae5ca9ca675f4f51ed8f83bbf7155da9ecc9663100a885d5dc6df96d9" -} diff --git a/packages/crypto/testdata/bls-tests/sign/sign_case_142f678a8d05fcd1.json b/packages/crypto/testdata/bls-tests/sign/sign_case_142f678a8d05fcd1.json deleted file mode 100644 index 4606b4ee78..0000000000 --- a/packages/crypto/testdata/bls-tests/sign/sign_case_142f678a8d05fcd1.json +++ /dev/null @@ -1,7 +0,0 @@ -{ - "input": { - "privkey": "0x47b8192d77bf871b62e87859d653922725724a5c031afeabc60bcef5ff665138", - "message": "0x5656565656565656565656565656565656565656565656565656565656565656" - }, - "output": "0xaf1390c3c47acdb37131a51216da683c509fce0e954328a59f93aebda7e4ff974ba208d9a4a2a2389f892a9d418d618418dd7f7a6bc7aa0da999a9d3a5b815bc085e14fd001f6a1948768a3f4afefc8b8240dda329f984cb345c6363272ba4fe" -} diff --git a/packages/crypto/testdata/bls-tests/sign/sign_case_37286e1a6d1f6eb3.json b/packages/crypto/testdata/bls-tests/sign/sign_case_37286e1a6d1f6eb3.json deleted file mode 100644 index 210ab9938f..0000000000 --- a/packages/crypto/testdata/bls-tests/sign/sign_case_37286e1a6d1f6eb3.json +++ /dev/null @@ -1,7 +0,0 @@ -{ - "input": { - "privkey": "0x47b8192d77bf871b62e87859d653922725724a5c031afeabc60bcef5ff665138", - "message": "0xabababababababababababababababababababababababababababababababab" - }, - "output": "0x9674e2228034527f4c083206032b020310face156d4a4685e2fcaec2f6f3665aa635d90347b6ce124eb879266b1e801d185de36a0a289b85e9039662634f2eea1e02e670bc7ab849d006a70b2f93b84597558a05b879c8d445f387a5d5b653df" -} diff --git a/packages/crypto/testdata/bls-tests/sign/sign_case_7055381f640f2c1d.json b/packages/crypto/testdata/bls-tests/sign/sign_case_7055381f640f2c1d.json deleted file mode 100644 index 5333ebab54..0000000000 --- a/packages/crypto/testdata/bls-tests/sign/sign_case_7055381f640f2c1d.json +++ /dev/null @@ -1,7 +0,0 @@ -{ - "input": { - "privkey": "0x328388aff0d4a5b7dc9205abd374e7e98f3cd9f3418edb4eafda5fb16473d216", - "message": "0x0000000000000000000000000000000000000000000000000000000000000000" - }, - "output": "0x948a7cb99f76d616c2c564ce9bf4a519f1bea6b0a624a02276443c245854219fabb8d4ce061d255af5330b078d5380681751aa7053da2c98bae898edc218c75f07e24d8802a17cd1f6833b71e58f5eb5b94208b4d0bb3848cecb075ea21be115" -} diff --git a/packages/crypto/testdata/bls-tests/sign/sign_case_84d45c9c7cca6b92.json b/packages/crypto/testdata/bls-tests/sign/sign_case_84d45c9c7cca6b92.json deleted file mode 100644 index 6002cd3e41..0000000000 --- a/packages/crypto/testdata/bls-tests/sign/sign_case_84d45c9c7cca6b92.json +++ /dev/null @@ -1,7 +0,0 @@ -{ - "input": { - "privkey": "0x328388aff0d4a5b7dc9205abd374e7e98f3cd9f3418edb4eafda5fb16473d216", - "message": "0xabababababababababababababababababababababababababababababababab" - }, - "output": "0xae82747ddeefe4fd64cf9cedb9b04ae3e8a43420cd255e3c7cd06a8d88b7c7f8638543719981c5d16fa3527c468c25f0026704a6951bde891360c7e8d12ddee0559004ccdbe6046b55bae1b257ee97f7cdb955773d7cf29adf3ccbb9975e4eb9" -} diff --git a/packages/crypto/testdata/bls-tests/sign/sign_case_8cd3d4d0d9a5b265.json b/packages/crypto/testdata/bls-tests/sign/sign_case_8cd3d4d0d9a5b265.json deleted file mode 100644 index 12bf565de1..0000000000 --- a/packages/crypto/testdata/bls-tests/sign/sign_case_8cd3d4d0d9a5b265.json +++ /dev/null @@ -1,7 +0,0 @@ -{ - "input": { - "privkey": "0x328388aff0d4a5b7dc9205abd374e7e98f3cd9f3418edb4eafda5fb16473d216", - "message": "0x5656565656565656565656565656565656565656565656565656565656565656" - }, - "output": "0xa4efa926610b8bd1c8330c918b7a5e9bf374e53435ef8b7ec186abf62e1b1f65aeaaeb365677ac1d1172a1f5b44b4e6d022c252c58486c0a759fbdc7de15a756acc4d343064035667a594b4c2a6f0b0b421975977f297dba63ee2f63ffe47bb6" -} diff --git a/packages/crypto/testdata/bls-tests/sign/sign_case_c82df61aa3ee60fb.json b/packages/crypto/testdata/bls-tests/sign/sign_case_c82df61aa3ee60fb.json deleted file mode 100644 index 94458ef7b5..0000000000 --- a/packages/crypto/testdata/bls-tests/sign/sign_case_c82df61aa3ee60fb.json +++ /dev/null @@ -1,7 +0,0 @@ -{ - "input": { - "privkey": "0x263dbd792f5b1be47ed85f8938c0f29586af0d3ac7b977f21c278fe1462040e3", - "message": "0x0000000000000000000000000000000000000000000000000000000000000000" - }, - "output": "0xb6ed936746e01f8ecf281f020953fbf1f01debd5657c4a383940b020b26507f6076334f91e2366c96e9ab279fb5158090352ea1c5b0c9274504f4f0e7053af24802e51e4568d164fe986834f41e55c8e850ce1f98458c0cfc9ab380b55285a55" -} diff --git a/packages/crypto/testdata/bls-tests/sign/sign_case_d0e28d7e76eb6e9c.json b/packages/crypto/testdata/bls-tests/sign/sign_case_d0e28d7e76eb6e9c.json deleted file mode 100644 index f357607ce9..0000000000 --- a/packages/crypto/testdata/bls-tests/sign/sign_case_d0e28d7e76eb6e9c.json +++ /dev/null @@ -1,7 +0,0 @@ -{ - "input": { - "privkey": "0x263dbd792f5b1be47ed85f8938c0f29586af0d3ac7b977f21c278fe1462040e3", - "message": "0x5656565656565656565656565656565656565656565656565656565656565656" - }, - "output": "0x882730e5d03f6b42c3abc26d3372625034e1d871b65a8a6b900a56dae22da98abbe1b68f85e49fe7652a55ec3d0591c20767677e33e5cbb1207315c41a9ac03be39c2e7668edc043d6cb1d9fd93033caa8a1c5b0e84bedaeb6c64972503a43eb" -} diff --git a/packages/crypto/testdata/bls-tests/sign/sign_case_f2ae1097e7d0e18b.json b/packages/crypto/testdata/bls-tests/sign/sign_case_f2ae1097e7d0e18b.json deleted file mode 100644 index 155cb19bcc..0000000000 --- a/packages/crypto/testdata/bls-tests/sign/sign_case_f2ae1097e7d0e18b.json +++ /dev/null @@ -1,7 +0,0 @@ -{ - "input": { - "privkey": "0x263dbd792f5b1be47ed85f8938c0f29586af0d3ac7b977f21c278fe1462040e3", - "message": "0xabababababababababababababababababababababababababababababababab" - }, - "output": "0x91347bccf740d859038fcdcaf233eeceb2a436bcaaee9b2aa3bfb70efe29dfb2677562ccbea1c8e061fb9971b0753c240622fab78489ce96768259fc01360346da5b9f579e5da0d941e4c6ba18a0e64906082375394f337fa1af2b7127b0d121" -} diff --git a/packages/crypto/testdata/bls-tests/sign/sign_case_zero_privkey.json b/packages/crypto/testdata/bls-tests/sign/sign_case_zero_privkey.json deleted file mode 100644 index c30577121a..0000000000 --- a/packages/crypto/testdata/bls-tests/sign/sign_case_zero_privkey.json +++ /dev/null @@ -1,7 +0,0 @@ -{ - "input": { - "privkey": "0x0000000000000000000000000000000000000000000000000000000000000000", - "message": "0xabababababababababababababababababababababababababababababababab" - }, - "output": null -} diff --git a/packages/crypto/tests/bls12_381.rs b/packages/crypto/tests/bls12_381.rs index f6f55cea27..108f262df7 100644 --- a/packages/crypto/tests/bls12_381.rs +++ b/packages/crypto/tests/bls12_381.rs @@ -10,6 +10,8 @@ use cosmwasm_crypto::{ bls12_381_pairing_equality, HashFunction, }; +const ETHEREUM_DST: &[u8] = b"BLS_SIG_BLS12381G2_XMD:SHA-256_SSWU_RO_POP_"; + base64_serde_type!(Base64Standard, STANDARD); #[derive(Debug, PartialEq, serde::Serialize, serde::Deserialize)] @@ -37,6 +39,23 @@ struct AggregateTest { output: Option>, } +#[derive(serde::Deserialize, serde::Serialize)] +struct HashTestInput { + msg: String, +} + +#[derive(serde::Deserialize, serde::Serialize)] +struct HashTestOutput { + x: String, + y: String, +} + +#[derive(serde::Deserialize, serde::Serialize)] +struct HashTestFile { + input: HashTestInput, + output: HashTestOutput, +} + #[derive(serde::Deserialize, serde::Serialize)] struct VerifyTestInput { pubkey: String, @@ -123,6 +142,42 @@ fn bls12_381_aggregate_g2_works() { } } +#[test] +fn bls12_381_hash_to_g2_works() { + let paths = glob::glob("testdata/bls-tests/hash_to_G2/*.json") + .unwrap() + .flatten(); + + for path in paths { + let test_data = fs::read(&path).unwrap(); + let test_data: HashTestFile = serde_json::from_slice(&test_data).unwrap(); + let g2_point = bls12_381_hash_to_g2( + HashFunction::Sha256, + test_data.input.msg.as_bytes(), + b"QUUX-V01-CS02-with-BLS12381G2_XMD:SHA-256_SSWU_RO_", + ); + + let prepared_x = test_data.output.x.replace("0x", ""); + let (x1, x2) = prepared_x.split_once(',').unwrap(); + let decoded_x = hex::decode(format!("{x2}{x1}")).unwrap(); + + let prepared_y = test_data.output.y.replace("0x", ""); + let (y1, y2) = prepared_y.split_once(',').unwrap(); + let decoded_y = hex::decode(format!("{y2}{y1}")).unwrap(); + let uncompressed = [decoded_x.as_slice(), &decoded_y].concat(); + + let affine = + bls12_381::G2Affine::from_uncompressed(&uncompressed.try_into().unwrap()).unwrap(); + + assert_eq!( + g2_point, + affine.to_compressed(), + "Failed with test vector {}", + path.display() + ); + } +} + #[test] fn bls12_381_verify_works() { let paths = glob::glob("testdata/bls-tests/verify/*.json") @@ -137,11 +192,7 @@ fn bls12_381_verify_works() { let message = hex::decode(&test_data.input.message[2..]).unwrap(); let signature = hex::decode(&test_data.input.signature[2..]).unwrap(); - let message_point = bls12_381_hash_to_g2( - HashFunction::Sha256, - &message, - b"BLS_SIG_BLS12381G2_XMD:SHA-256_SSWU_RO_POP_", - ); + let message_point = bls12_381_hash_to_g2(HashFunction::Sha256, &message, ETHEREUM_DST); let pubkey = pubkey.try_into().unwrap(); let signature = signature.try_into().unwrap(); From a69e76926ce49c1b5e39eff6711d3b1910881e9a Mon Sep 17 00:00:00 2001 From: Aumetra Weisman Date: Wed, 10 Apr 2024 17:29:08 +0200 Subject: [PATCH 13/79] Add fast aggregate verify --- packages/crypto/tests/bls12_381.rs | 79 ++++++++++++++++++++++++++++++ 1 file changed, 79 insertions(+) diff --git a/packages/crypto/tests/bls12_381.rs b/packages/crypto/tests/bls12_381.rs index 108f262df7..998182e850 100644 --- a/packages/crypto/tests/bls12_381.rs +++ b/packages/crypto/tests/bls12_381.rs @@ -69,6 +69,19 @@ struct VerifyTestFile { output: bool, } +#[derive(serde::Deserialize, serde::Serialize)] +struct FastAggregateVerifyInput { + pubkeys: Vec, + message: String, + signature: String, +} + +#[derive(serde::Deserialize, serde::Serialize)] +struct FastAggregateVerifyFile { + input: FastAggregateVerifyInput, + output: bool, +} + const ETH_HEADER_FILE: &str = include_str!("../testdata/eth-headers/1699693797.394876721s.json"); const AGGREGATE_1: &str = include_str!("../testdata/bls-tests/aggregate/aggregate_0x0000000000000000000000000000000000000000000000000000000000000000.json"); const AGGREGATE_2: &str = include_str!("../testdata/bls-tests/aggregate/aggregate_0x5656565656565656565656565656565656565656565656565656565656565656.json"); @@ -237,3 +250,69 @@ fn bls12_381_verify_works() { println!("========================"); } } + +#[test] +fn bls12_381_fast_aggregate_verify() { + let paths = glob::glob("testdata/bls-tests/fast_aggregate_verify/*.json") + .unwrap() + .flatten(); + + for path in paths { + let test_data = fs::read(&path).unwrap(); + let test_data: FastAggregateVerifyFile = serde_json::from_slice(&test_data).unwrap(); + + let message = hex::decode(&test_data.input.message[2..]).unwrap(); + let signature = hex::decode(&test_data.input.signature[2..]).unwrap(); + + let message_point = bls12_381_hash_to_g2(HashFunction::Sha256, &message, ETHEREUM_DST); + let signature = signature.try_into().unwrap(); + + let verify_result = (|| { + let mut pubkeys: Vec = Vec::with_capacity(test_data.input.pubkeys.len() * 48); + for pubkey in test_data.input.pubkeys { + let pubkey = hex::decode(&pubkey[2..]).unwrap(); + + if bls12_381_g1_is_identity(&pubkey.as_slice().try_into()?)? { + println!("pubkey is identity"); + return Ok(false); + } + + pubkeys.extend(pubkey); + } + + let pubkey = bls12_381_aggregate_g1(&pubkeys).unwrap(); + + if bls12_381_g2_is_identity(&signature)? { + println!("signature is identity"); + return Ok(false); + } + + let bool_result = bls12_381_pairing_equality( + &pubkey, + &message_point, + &bls12_381_g1_generator(), + &signature, + )?; + + if !bool_result { + println!("pairing is not equal"); + } + + Ok::<_, Box>(bool_result) + })(); + + let verify_result = verify_result + .inspect_err(|err| eprintln!("error: {err}")) + .unwrap_or(false); + + assert_eq!( + verify_result, + test_data.output, + "Failed with test vector {}", + path.display() + ); + + println!("Finished case {}", path.display()); + println!("========================"); + } +} From ede9b65591a05aeedece0054d36334cc01dba2f8 Mon Sep 17 00:00:00 2001 From: Aumetra Weisman Date: Wed, 10 Apr 2024 17:37:40 +0200 Subject: [PATCH 14/79] Add aggregate verify tests --- packages/crypto/tests/bls12_381.rs | 89 +++++++++++++++++++++++++++++- 1 file changed, 88 insertions(+), 1 deletion(-) diff --git a/packages/crypto/tests/bls12_381.rs b/packages/crypto/tests/bls12_381.rs index 998182e850..7a0e32a535 100644 --- a/packages/crypto/tests/bls12_381.rs +++ b/packages/crypto/tests/bls12_381.rs @@ -69,6 +69,19 @@ struct VerifyTestFile { output: bool, } +#[derive(serde::Deserialize, serde::Serialize)] +struct AggregateVerifyInput { + pubkeys: Vec, + messages: Vec, + signature: String, +} + +#[derive(serde::Deserialize, serde::Serialize)] +struct AggregateVerifyFile { + input: AggregateVerifyInput, + output: bool, +} + #[derive(serde::Deserialize, serde::Serialize)] struct FastAggregateVerifyInput { pubkeys: Vec, @@ -252,7 +265,81 @@ fn bls12_381_verify_works() { } #[test] -fn bls12_381_fast_aggregate_verify() { +fn bls12_381_aggregate_verify_works() { + let paths = glob::glob("testdata/bls-tests/aggregate_verify/*.json") + .unwrap() + .flatten(); + + for path in paths { + let test_data = fs::read(&path).unwrap(); + let test_data: AggregateVerifyFile = serde_json::from_slice(&test_data).unwrap(); + + let signature = hex::decode(&test_data.input.signature[2..]).unwrap(); + + let messages: Vec = test_data + .input + .messages + .iter() + .flat_map(|message| { + let msg = hex::decode(&message[2..]).unwrap(); + bls12_381_hash_to_g2(HashFunction::Sha256, &msg, ETHEREUM_DST) + }) + .collect(); + let message_point = bls12_381_aggregate_g2(&messages).unwrap(); + let signature = signature.try_into().unwrap(); + + let verify_result = (|| { + let mut pubkeys: Vec = Vec::with_capacity(test_data.input.pubkeys.len() * 48); + for pubkey in test_data.input.pubkeys { + let pubkey = hex::decode(&pubkey[2..]).unwrap(); + + if bls12_381_g1_is_identity(&pubkey.as_slice().try_into()?)? { + println!("pubkey is identity"); + return Ok(false); + } + + pubkeys.extend(pubkey); + } + + let pubkey = bls12_381_aggregate_g1(&pubkeys).unwrap(); + + if bls12_381_g2_is_identity(&signature)? { + println!("signature is identity"); + return Ok(false); + } + + let bool_result = bls12_381_pairing_equality( + &pubkey, + &message_point, + &bls12_381_g1_generator(), + &signature, + )?; + + if !bool_result { + println!("pairing is not equal"); + } + + Ok::<_, Box>(bool_result) + })(); + + let verify_result = verify_result + .inspect_err(|err| eprintln!("error: {err}")) + .unwrap_or(false); + + assert_eq!( + verify_result, + test_data.output, + "Failed with test vector {}", + path.display() + ); + + println!("Finished case {}", path.display()); + println!("========================"); + } +} + +#[test] +fn bls12_381_fast_aggregate_verify_works() { let paths = glob::glob("testdata/bls-tests/fast_aggregate_verify/*.json") .unwrap() .flatten(); From 756b149a2350bf7d27fb28ecb3d0657a032496bf Mon Sep 17 00:00:00 2001 From: Aumetra Weisman Date: Wed, 10 Apr 2024 17:43:41 +0200 Subject: [PATCH 15/79] Add batch verify test --- packages/crypto/tests/bls12_381.rs | 93 ++++++++++++++++++++++++++++++ 1 file changed, 93 insertions(+) diff --git a/packages/crypto/tests/bls12_381.rs b/packages/crypto/tests/bls12_381.rs index 7a0e32a535..6c9c66ddfe 100644 --- a/packages/crypto/tests/bls12_381.rs +++ b/packages/crypto/tests/bls12_381.rs @@ -82,6 +82,19 @@ struct AggregateVerifyFile { output: bool, } +#[derive(serde::Deserialize, serde::Serialize)] +struct BatchVerifyInput { + pubkeys: Vec, + messages: Vec, + signatures: Vec, +} + +#[derive(serde::Deserialize, serde::Serialize)] +struct BatchVerifyFile { + input: BatchVerifyInput, + output: bool, +} + #[derive(serde::Deserialize, serde::Serialize)] struct FastAggregateVerifyInput { pubkeys: Vec, @@ -403,3 +416,83 @@ fn bls12_381_fast_aggregate_verify_works() { println!("========================"); } } + +#[test] +fn bls12_381_batch_verify_works() { + let paths = glob::glob("testdata/bls-tests/batch_verify/*.json") + .unwrap() + .flatten(); + + for path in paths { + let test_data = fs::read(&path).unwrap(); + let test_data: BatchVerifyFile = serde_json::from_slice(&test_data).unwrap(); + + let messages: Vec = test_data + .input + .messages + .iter() + .flat_map(|message| { + let msg = hex::decode(&message[2..]).unwrap(); + bls12_381_hash_to_g2(HashFunction::Sha256, &msg, ETHEREUM_DST) + }) + .collect(); + let message_point = bls12_381_aggregate_g2(&messages).unwrap(); + + let verify_result = (|| { + let mut pubkeys: Vec = Vec::with_capacity(test_data.input.pubkeys.len() * 48); + for pubkey in test_data.input.pubkeys { + let pubkey = hex::decode(&pubkey[2..]).unwrap(); + + if bls12_381_g1_is_identity(&pubkey[..].try_into()?)? { + println!("pubkey is identity"); + return Ok(false); + } + + pubkeys.extend(pubkey); + } + + let pubkey = bls12_381_aggregate_g1(&pubkeys).unwrap(); + + let mut signatures: Vec = Vec::with_capacity(test_data.input.signatures.len() * 96); + for signature in test_data.input.signatures { + let signature = hex::decode(&signature[2..]).unwrap(); + + if bls12_381_g2_is_identity(&signature[..].try_into()?)? { + println!("signature is identity"); + return Ok(false); + } + + signatures.extend(signature); + } + + let signature = bls12_381_aggregate_g2(&signatures).unwrap(); + + let bool_result = bls12_381_pairing_equality( + &pubkey, + &message_point, + &bls12_381_g1_generator(), + &signature, + )?; + + if !bool_result { + println!("pairing is not equal"); + } + + Ok::<_, Box>(bool_result) + })(); + + let verify_result = verify_result + .inspect_err(|err| eprintln!("error: {err}")) + .unwrap_or(false); + + assert_eq!( + verify_result, + test_data.output, + "Failed with test vector {}", + path.display() + ); + + println!("Finished case {}", path.display()); + println!("========================"); + } +} From 323a8c4dc8b34bae353b3950e47bed59c75aab87 Mon Sep 17 00:00:00 2001 From: Aumetra Weisman Date: Wed, 10 Apr 2024 17:46:39 +0200 Subject: [PATCH 16/79] Fix import warnings --- packages/crypto/src/ed25519.rs | 4 +--- 1 file changed, 1 insertion(+), 3 deletions(-) diff --git a/packages/crypto/src/ed25519.rs b/packages/crypto/src/ed25519.rs index d8ceea31f2..31e2bc1aa2 100644 --- a/packages/crypto/src/ed25519.rs +++ b/packages/crypto/src/ed25519.rs @@ -1,5 +1,3 @@ -use alloc::{string::String, vec::Vec}; - use ed25519_zebra::{batch, Signature, VerificationKey}; use rand_core::CryptoRngCore; @@ -144,7 +142,7 @@ fn read_pubkey(data: &[u8]) -> Result<[u8; 32], InvalidEd25519PubkeyFormat> { #[cfg(test)] mod tests { use super::*; - use alloc::vec; + use alloc::{string::String, vec, vec::Vec}; use ed25519_zebra::SigningKey; use rand_core::OsRng; use serde::Deserialize; From 83312c01f042b1f4b7cc55a9ac4b2544ba22e735 Mon Sep 17 00:00:00 2001 From: Aumetra Weisman Date: Wed, 10 Apr 2024 17:54:04 +0200 Subject: [PATCH 17/79] Replace `.inspect_err` with `.map_err` --- packages/crypto/tests/bls12_381.rs | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/packages/crypto/tests/bls12_381.rs b/packages/crypto/tests/bls12_381.rs index 6c9c66ddfe..dd032f2540 100644 --- a/packages/crypto/tests/bls12_381.rs +++ b/packages/crypto/tests/bls12_381.rs @@ -262,7 +262,7 @@ fn bls12_381_verify_works() { })(); let verify_result = verify_result - .inspect_err(|err| eprintln!("error: {err}")) + .map_err(|err| eprintln!("error: {err}")) .unwrap_or(false); assert_eq!( @@ -336,7 +336,7 @@ fn bls12_381_aggregate_verify_works() { })(); let verify_result = verify_result - .inspect_err(|err| eprintln!("error: {err}")) + .map_err(|err| eprintln!("error: {err}")) .unwrap_or(false); assert_eq!( @@ -402,7 +402,7 @@ fn bls12_381_fast_aggregate_verify_works() { })(); let verify_result = verify_result - .inspect_err(|err| eprintln!("error: {err}")) + .map_err(|err| eprintln!("error: {err}")) .unwrap_or(false); assert_eq!( @@ -482,7 +482,7 @@ fn bls12_381_batch_verify_works() { })(); let verify_result = verify_result - .inspect_err(|err| eprintln!("error: {err}")) + .map_err(|err| eprintln!("error: {err}")) .unwrap_or(false); assert_eq!( From 5d676c2c5842374addbb64f37a676dbba7215f2d Mon Sep 17 00:00:00 2001 From: Aumetra Weisman Date: Fri, 12 Apr 2024 14:10:44 +0200 Subject: [PATCH 18/79] Fix aggregate verify --- packages/crypto/src/bls12_318/mod.rs | 2 +- packages/crypto/src/bls12_318/pairing.rs | 43 +++++++++++++++++++- packages/crypto/src/lib.rs | 7 ++-- packages/crypto/tests/bls12_381.rs | 51 ++++++++++++------------ 4 files changed, 73 insertions(+), 30 deletions(-) diff --git a/packages/crypto/src/bls12_318/mod.rs b/packages/crypto/src/bls12_318/mod.rs index 4dedc5b765..c6ace5de1e 100644 --- a/packages/crypto/src/bls12_318/mod.rs +++ b/packages/crypto/src/bls12_318/mod.rs @@ -7,5 +7,5 @@ mod points; pub use aggregate::{bls12_381_aggregate_g1, bls12_381_aggregate_g2}; pub use constants::{bls12_381_g1_generator, bls12_381_g2_generator}; pub use hash::{bls12_381_hash_to_g1, bls12_381_hash_to_g2, HashFunction}; -pub use pairing::bls12_381_pairing_equality; +pub use pairing::{bls12_381_aggregate_pairing_equality, bls12_381_pairing_equality}; pub use points::{bls12_381_g1_is_identity, bls12_381_g2_is_identity}; diff --git a/packages/crypto/src/bls12_318/pairing.rs b/packages/crypto/src/bls12_318/pairing.rs index 1b314eaf2d..69bda0c778 100644 --- a/packages/crypto/src/bls12_318/pairing.rs +++ b/packages/crypto/src/bls12_318/pairing.rs @@ -1,6 +1,47 @@ -use super::points::{g1_from_fixed, g2_from_fixed, InvalidPoint}; +use super::points::{ + g1_from_fixed, g1_from_variable, g2_from_fixed, g2_from_variable, InvalidPoint, +}; use bls12_381::G2Prepared; use pairing::group::Group; +use rayon::iter::{ParallelBridge, ParallelIterator}; + +pub fn bls12_381_aggregate_pairing_equality( + ps: &[u8], + qs: &[u8], + r: &[u8; 48], + s: &[u8; 96], +) -> Result { + let pq_pairs: Vec<_> = ps + .chunks_exact(48) + .zip(qs.chunks_exact(96)) + // From here on parallelism is fine since the miller loop runs over + // a sum of the pairings and is therefore a commutative operation + .par_bridge() + .map(|(p, q)| { + let g1 = g1_from_variable(p)?; + let g2 = g2_from_variable(q)?; + + Ok((g1.0, G2Prepared::from(g2.0))) + }) + .collect::>()?; + + let r = g1_from_fixed(r)?; + let s = g2_from_fixed(s)?; + + let r_neg = -r.0; + let s_prepared = G2Prepared::from(s.0); + + let ref_pq: Vec<_> = pq_pairs + .iter() + .map(|(g1, g2)| (g1, g2)) + .chain([(&r_neg, &s_prepared)]) + .collect(); + + Ok(bls12_381::multi_miller_loop(&ref_pq) + .final_exponentiation() + .is_identity() + .into()) +} /// Check whether the following condition holds true: /// diff --git a/packages/crypto/src/lib.rs b/packages/crypto/src/lib.rs index 657f32ddaf..5b503b5b62 100644 --- a/packages/crypto/src/lib.rs +++ b/packages/crypto/src/lib.rs @@ -23,9 +23,10 @@ mod secp256r1; #[cfg(feature = "std")] #[doc(hidden)] pub use crate::bls12_318::{ - bls12_381_aggregate_g1, bls12_381_aggregate_g2, bls12_381_g1_generator, - bls12_381_g1_is_identity, bls12_381_g2_generator, bls12_381_g2_is_identity, - bls12_381_hash_to_g1, bls12_381_hash_to_g2, bls12_381_pairing_equality, HashFunction, + bls12_381_aggregate_g1, bls12_381_aggregate_g2, bls12_381_aggregate_pairing_equality, + bls12_381_g1_generator, bls12_381_g1_is_identity, bls12_381_g2_generator, + bls12_381_g2_is_identity, bls12_381_hash_to_g1, bls12_381_hash_to_g2, + bls12_381_pairing_equality, HashFunction, }; #[doc(hidden)] pub use crate::ecdsa::{ECDSA_PUBKEY_MAX_LEN, ECDSA_SIGNATURE_LEN, MESSAGE_HASH_MAX_LEN}; diff --git a/packages/crypto/tests/bls12_381.rs b/packages/crypto/tests/bls12_381.rs index dd032f2540..4e9cd7d74b 100644 --- a/packages/crypto/tests/bls12_381.rs +++ b/packages/crypto/tests/bls12_381.rs @@ -5,12 +5,12 @@ use std::{error::Error, fs}; use base64::engine::general_purpose::STANDARD; use base64_serde::base64_serde_type; use cosmwasm_crypto::{ - bls12_381_aggregate_g1, bls12_381_aggregate_g2, bls12_381_g1_generator, - bls12_381_g1_is_identity, bls12_381_g2_is_identity, bls12_381_hash_to_g2, - bls12_381_pairing_equality, HashFunction, + bls12_381_aggregate_g1, bls12_381_aggregate_g2, bls12_381_aggregate_pairing_equality, + bls12_381_g1_generator, bls12_381_g1_is_identity, bls12_381_g2_is_identity, + bls12_381_hash_to_g2, bls12_381_pairing_equality, HashFunction, }; -const ETHEREUM_DST: &[u8] = b"BLS_SIG_BLS12381G2_XMD:SHA-256_SSWU_RO_POP_"; +const PROOF_OF_POSSESSION_DST: &[u8] = b"BLS_SIG_BLS12381G2_XMD:SHA-256_SSWU_RO_POP_"; base64_serde_type!(Base64Standard, STANDARD); @@ -231,7 +231,8 @@ fn bls12_381_verify_works() { let message = hex::decode(&test_data.input.message[2..]).unwrap(); let signature = hex::decode(&test_data.input.signature[2..]).unwrap(); - let message_point = bls12_381_hash_to_g2(HashFunction::Sha256, &message, ETHEREUM_DST); + let message_point = + bls12_381_hash_to_g2(HashFunction::Sha256, &message, PROOF_OF_POSSESSION_DST); let pubkey = pubkey.try_into().unwrap(); let signature = signature.try_into().unwrap(); @@ -295,13 +296,17 @@ fn bls12_381_aggregate_verify_works() { .iter() .flat_map(|message| { let msg = hex::decode(&message[2..]).unwrap(); - bls12_381_hash_to_g2(HashFunction::Sha256, &msg, ETHEREUM_DST) + bls12_381_hash_to_g2(HashFunction::Sha256, &msg, PROOF_OF_POSSESSION_DST) }) .collect(); - let message_point = bls12_381_aggregate_g2(&messages).unwrap(); - let signature = signature.try_into().unwrap(); let verify_result = (|| { + let signature = signature.as_slice().try_into()?; + if bls12_381_g2_is_identity(&signature)? { + println!("signature is identity"); + return Ok(false); + } + let mut pubkeys: Vec = Vec::with_capacity(test_data.input.pubkeys.len() * 48); for pubkey in test_data.input.pubkeys { let pubkey = hex::decode(&pubkey[2..]).unwrap(); @@ -314,16 +319,14 @@ fn bls12_381_aggregate_verify_works() { pubkeys.extend(pubkey); } - let pubkey = bls12_381_aggregate_g1(&pubkeys).unwrap(); - - if bls12_381_g2_is_identity(&signature)? { - println!("signature is identity"); + if pubkeys.is_empty() || messages.is_empty() { + println!("no keys or no signatures"); return Ok(false); } - let bool_result = bls12_381_pairing_equality( - &pubkey, - &message_point, + let bool_result = bls12_381_aggregate_pairing_equality( + &pubkeys, + &messages, &bls12_381_g1_generator(), &signature, )?; @@ -336,7 +339,7 @@ fn bls12_381_aggregate_verify_works() { })(); let verify_result = verify_result - .map_err(|err| eprintln!("error: {err}")) + .map_err(|err| eprintln!("error: {err:?}")) .unwrap_or(false); assert_eq!( @@ -364,7 +367,8 @@ fn bls12_381_fast_aggregate_verify_works() { let message = hex::decode(&test_data.input.message[2..]).unwrap(); let signature = hex::decode(&test_data.input.signature[2..]).unwrap(); - let message_point = bls12_381_hash_to_g2(HashFunction::Sha256, &message, ETHEREUM_DST); + let message_point = + bls12_381_hash_to_g2(HashFunction::Sha256, &message, PROOF_OF_POSSESSION_DST); let signature = signature.try_into().unwrap(); let verify_result = (|| { @@ -433,7 +437,7 @@ fn bls12_381_batch_verify_works() { .iter() .flat_map(|message| { let msg = hex::decode(&message[2..]).unwrap(); - bls12_381_hash_to_g2(HashFunction::Sha256, &msg, ETHEREUM_DST) + bls12_381_hash_to_g2(HashFunction::Sha256, &msg, PROOF_OF_POSSESSION_DST) }) .collect(); let message_point = bls12_381_aggregate_g2(&messages).unwrap(); @@ -454,7 +458,7 @@ fn bls12_381_batch_verify_works() { let pubkey = bls12_381_aggregate_g1(&pubkeys).unwrap(); let mut signatures: Vec = Vec::with_capacity(test_data.input.signatures.len() * 96); - for signature in test_data.input.signatures { + for signature in &test_data.input.signatures { let signature = hex::decode(&signature[2..]).unwrap(); if bls12_381_g2_is_identity(&signature[..].try_into()?)? { @@ -466,13 +470,10 @@ fn bls12_381_batch_verify_works() { } let signature = bls12_381_aggregate_g2(&signatures).unwrap(); + let generator = bls12_381_g1_generator(); - let bool_result = bls12_381_pairing_equality( - &pubkey, - &message_point, - &bls12_381_g1_generator(), - &signature, - )?; + let bool_result = + bls12_381_pairing_equality(&pubkey, &message_point, &generator, &signature)?; if !bool_result { println!("pairing is not equal"); From 316f60deaa2a374d1c112509bac14e3463481a50 Mon Sep 17 00:00:00 2001 From: Aumetra Weisman Date: Fri, 12 Apr 2024 14:15:16 +0200 Subject: [PATCH 19/79] Remove batch verify test for now --- packages/crypto/tests/bls12_381.rs | 77 ------------------------------ 1 file changed, 77 deletions(-) diff --git a/packages/crypto/tests/bls12_381.rs b/packages/crypto/tests/bls12_381.rs index 4e9cd7d74b..48fde219b6 100644 --- a/packages/crypto/tests/bls12_381.rs +++ b/packages/crypto/tests/bls12_381.rs @@ -420,80 +420,3 @@ fn bls12_381_fast_aggregate_verify_works() { println!("========================"); } } - -#[test] -fn bls12_381_batch_verify_works() { - let paths = glob::glob("testdata/bls-tests/batch_verify/*.json") - .unwrap() - .flatten(); - - for path in paths { - let test_data = fs::read(&path).unwrap(); - let test_data: BatchVerifyFile = serde_json::from_slice(&test_data).unwrap(); - - let messages: Vec = test_data - .input - .messages - .iter() - .flat_map(|message| { - let msg = hex::decode(&message[2..]).unwrap(); - bls12_381_hash_to_g2(HashFunction::Sha256, &msg, PROOF_OF_POSSESSION_DST) - }) - .collect(); - let message_point = bls12_381_aggregate_g2(&messages).unwrap(); - - let verify_result = (|| { - let mut pubkeys: Vec = Vec::with_capacity(test_data.input.pubkeys.len() * 48); - for pubkey in test_data.input.pubkeys { - let pubkey = hex::decode(&pubkey[2..]).unwrap(); - - if bls12_381_g1_is_identity(&pubkey[..].try_into()?)? { - println!("pubkey is identity"); - return Ok(false); - } - - pubkeys.extend(pubkey); - } - - let pubkey = bls12_381_aggregate_g1(&pubkeys).unwrap(); - - let mut signatures: Vec = Vec::with_capacity(test_data.input.signatures.len() * 96); - for signature in &test_data.input.signatures { - let signature = hex::decode(&signature[2..]).unwrap(); - - if bls12_381_g2_is_identity(&signature[..].try_into()?)? { - println!("signature is identity"); - return Ok(false); - } - - signatures.extend(signature); - } - - let signature = bls12_381_aggregate_g2(&signatures).unwrap(); - let generator = bls12_381_g1_generator(); - - let bool_result = - bls12_381_pairing_equality(&pubkey, &message_point, &generator, &signature)?; - - if !bool_result { - println!("pairing is not equal"); - } - - Ok::<_, Box>(bool_result) - })(); - - let verify_result = verify_result - .map_err(|err| eprintln!("error: {err}")) - .unwrap_or(false); - - assert_eq!( - verify_result, - test_data.output, - "Failed with test vector {}", - path.display() - ); - - println!("Finished case {}", path.display()); - println!("========================"); - } -} From d6faff77a8d8c09677eed859f281787d79274810 Mon Sep 17 00:00:00 2001 From: Aumetra Weisman Date: Mon, 15 Apr 2024 13:51:25 +0200 Subject: [PATCH 20/79] Attach functions to the VM --- .../core/src/errors/recover_pubkey_error.rs | 6 +- .../core/src/errors/verification_error.rs | 10 + packages/crypto/Cargo.toml | 1 + packages/crypto/benches/main.rs | 32 ++- packages/crypto/src/bls12_318/aggregate.rs | 16 +- packages/crypto/src/bls12_318/hash.rs | 10 +- packages/crypto/src/bls12_318/mod.rs | 3 + packages/crypto/src/bls12_318/pairing.rs | 36 +-- packages/crypto/src/bls12_318/points.rs | 84 +++--- packages/crypto/src/errors.rs | 44 ++- packages/crypto/src/lib.rs | 2 +- packages/std/src/traits.rs | 30 ++ packages/vm/src/environment.rs | 4 + packages/vm/src/imports.rs | 257 +++++++++++++++++- packages/vm/src/instance.rs | 57 +++- 15 files changed, 506 insertions(+), 86 deletions(-) diff --git a/packages/core/src/errors/recover_pubkey_error.rs b/packages/core/src/errors/recover_pubkey_error.rs index d9b432120d..00edb1732b 100644 --- a/packages/core/src/errors/recover_pubkey_error.rs +++ b/packages/core/src/errors/recover_pubkey_error.rs @@ -60,13 +60,15 @@ impl From for RecoverPubkeyError { fn from(original: CryptoError) -> Self { match original { CryptoError::InvalidHashFormat { .. } => RecoverPubkeyError::InvalidHashFormat, - CryptoError::InvalidPubkeyFormat { .. } => panic!("Conversion not supported"), CryptoError::InvalidSignatureFormat { .. } => { RecoverPubkeyError::InvalidSignatureFormat } CryptoError::GenericErr { .. } => RecoverPubkeyError::unknown_err(original.code()), CryptoError::InvalidRecoveryParam { .. } => RecoverPubkeyError::InvalidRecoveryParam, - CryptoError::BatchErr { .. } => panic!("Conversion not supported"), + CryptoError::BatchErr { .. } + | CryptoError::InvalidPubkeyFormat { .. } + | CryptoError::InvalidPoint { .. } + | CryptoError::UnknownHashFunction { .. } => panic!("Conversion not supported"), } } } diff --git a/packages/core/src/errors/verification_error.rs b/packages/core/src/errors/verification_error.rs index c13139a980..49a9abb9da 100644 --- a/packages/core/src/errors/verification_error.rs +++ b/packages/core/src/errors/verification_error.rs @@ -21,6 +21,10 @@ pub enum VerificationError { InvalidPubkeyFormat, #[display("Invalid recovery parameter. Supported values: 0 and 1.")] InvalidRecoveryParam, + #[display("Invalid point")] + InvalidPoint, + #[display("Unknown hash function")] + UnknownHashFunction, #[display("Unknown error: {error_code}")] UnknownErr { error_code: u32, backtrace: BT }, } @@ -52,6 +56,10 @@ impl PartialEq for VerificationError { VerificationError::InvalidRecoveryParam => { matches!(rhs, VerificationError::InvalidRecoveryParam) } + VerificationError::InvalidPoint => matches!(rhs, VerificationError::InvalidPoint), + VerificationError::UnknownHashFunction => { + matches!(rhs, VerificationError::UnknownHashFunction) + } VerificationError::UnknownErr { error_code, .. } => { if let VerificationError::UnknownErr { error_code: rhs_error_code, @@ -76,7 +84,9 @@ impl From for VerificationError { CryptoError::InvalidSignatureFormat { .. } => VerificationError::InvalidSignatureFormat, CryptoError::GenericErr { .. } => VerificationError::GenericErr, CryptoError::InvalidRecoveryParam { .. } => VerificationError::InvalidRecoveryParam, + CryptoError::InvalidPoint { .. } => VerificationError::InvalidPoint, CryptoError::BatchErr { .. } => VerificationError::BatchErr, + CryptoError::UnknownHashFunction { .. } => VerificationError::UnknownHashFunction, } } } diff --git a/packages/crypto/Cargo.toml b/packages/crypto/Cargo.toml index 1039983251..0905ea74e2 100644 --- a/packages/crypto/Cargo.toml +++ b/packages/crypto/Cargo.toml @@ -47,3 +47,4 @@ glob = "0.3.1" [[bench]] name = "main" harness = false +required-features = ["std"] diff --git a/packages/crypto/benches/main.rs b/packages/crypto/benches/main.rs index ca1ba3077e..9fa79ccfec 100644 --- a/packages/crypto/benches/main.rs +++ b/packages/crypto/benches/main.rs @@ -1,6 +1,6 @@ use criterion::{criterion_group, criterion_main, Criterion, PlottingBackend}; use rand_core::OsRng; -use std::time::Duration; +use std::{hint::black_box, time::Duration}; use english_numbers::convert_no_fmt; use hex_literal::hex; @@ -12,8 +12,9 @@ use k256::ecdsa::SigningKey; // type alias use sha2::Sha256; use cosmwasm_crypto::{ - ed25519_batch_verify, ed25519_verify, secp256k1_recover_pubkey, secp256k1_verify, - secp256r1_recover_pubkey, secp256r1_verify, + bls12_381_g1_generator, bls12_381_hash_to_g2, bls12_381_pairing_equality, ed25519_batch_verify, + ed25519_verify, secp256k1_recover_pubkey, secp256k1_verify, secp256r1_recover_pubkey, + secp256r1_verify, HashFunction, }; use std::cmp::min; @@ -35,6 +36,14 @@ const COSMOS_ED25519_PUBLIC_KEY_HEX: &str = // Test data from https://tools.ietf.org/html/rfc8032#section-7.1 const COSMOS_ED25519_TESTS_JSON: &str = "./testdata/ed25519_tests.json"; +// BLS test vector +// Path: "packages/crypto/testdata/bls-tests/verify/verify_valid_case_2ea479adf8c40300.json" +const BLS_PUBKEY: [u8; 48] = hex!("a491d1b0ecd9bb917989f0e74f0dea0422eac4a873e5e2644f368dffb9a6e20fd6e10c1b77654d067c0618f6e5a7f79a"); +const BLS_MESSAGE: [u8; 32] = + hex!("5656565656565656565656565656565656565656565656565656565656565656"); +const BLS_DST: &[u8] = b"BLS_SIG_BLS12381G2_XMD:SHA-256_SSWU_RO_POP_"; +const BLS_SIGNATURE: [u8; 96] = hex!("882730e5d03f6b42c3abc26d3372625034e1d871b65a8a6b900a56dae22da98abbe1b68f85e49fe7652a55ec3d0591c20767677e33e5cbb1207315c41a9ac03be39c2e7668edc043d6cb1d9fd93033caa8a1c5b0e84bedaeb6c64972503a43eb"); + #[derive(Deserialize, Debug)] struct Encoded { #[serde(rename = "privkey")] @@ -137,6 +146,23 @@ fn bench_crypto(c: &mut Criterion) { }); }); + group.bench_function("bls12_381_verify", |b| { + let generator = bls12_381_g1_generator(); + let message = bls12_381_hash_to_g2(HashFunction::Sha256, &BLS_MESSAGE, BLS_DST); + + b.iter(|| { + let is_equal = bls12_381_pairing_equality( + black_box(&BLS_PUBKEY), + &message, + &generator, + black_box(&BLS_SIGNATURE), + ) + .unwrap(); + + assert!(is_equal); + }); + }); + group.bench_function("ed25519_verify", |b| { let message = hex::decode(COSMOS_ED25519_MSG_HEX).unwrap(); let signature = hex::decode(COSMOS_ED25519_SIGNATURE_HEX).unwrap(); diff --git a/packages/crypto/src/bls12_318/aggregate.rs b/packages/crypto/src/bls12_318/aggregate.rs index f352aa5d34..021c11bbc5 100644 --- a/packages/crypto/src/bls12_318/aggregate.rs +++ b/packages/crypto/src/bls12_318/aggregate.rs @@ -1,4 +1,6 @@ -use super::points::{g1_from_fixed, g2_from_fixed, InvalidPoint, G1, G2}; +use crate::{errors::InvalidPoint, CryptoError}; + +use super::points::{g1_from_fixed, g2_from_fixed, G1, G2}; const G1_POINT_SIZE: usize = 48; const G2_POINT_SIZE: usize = 96; @@ -7,9 +9,9 @@ const G2_POINT_SIZE: usize = 96; /// /// This is like Aggregate from /// but works for signatures as well as public keys. -pub fn bls12_381_aggregate_g1(points: &[u8]) -> Result<[u8; 48], InvalidPoint> { +pub fn bls12_381_aggregate_g1(points: &[u8]) -> Result<[u8; 48], CryptoError> { if points.len() % G1_POINT_SIZE != 0 { - return Err(InvalidPoint::DecodingError {}); + return Err(InvalidPoint::DecodingError {}.into()); } let points_count = points.len() / G1_POINT_SIZE; @@ -31,7 +33,7 @@ pub fn bls12_381_aggregate_g1(points: &[u8]) -> Result<[u8; 48], InvalidPoint> { .map(g1_from_fixed) .collect_into_vec(&mut decoded_points); - let out: Result, InvalidPoint> = decoded_points.into_iter().collect(); + let out: Result, CryptoError> = decoded_points.into_iter().collect(); let out = out?; let out = g1_sum(&out); @@ -43,9 +45,9 @@ pub fn bls12_381_aggregate_g1(points: &[u8]) -> Result<[u8; 48], InvalidPoint> { /// /// This is like Aggregate from /// but works for signatures as well as public keys. -pub fn bls12_381_aggregate_g2(points: &[u8]) -> Result<[u8; 96], InvalidPoint> { +pub fn bls12_381_aggregate_g2(points: &[u8]) -> Result<[u8; 96], CryptoError> { if points.len() % G2_POINT_SIZE != 0 { - return Err(InvalidPoint::DecodingError {}); + return Err(InvalidPoint::DecodingError {}.into()); } let points_count = points.len() / G2_POINT_SIZE; @@ -67,7 +69,7 @@ pub fn bls12_381_aggregate_g2(points: &[u8]) -> Result<[u8; 96], InvalidPoint> { .map(g2_from_fixed) .collect_into_vec(&mut decoded_points); - let out: Result, InvalidPoint> = decoded_points.into_iter().collect(); + let out: Result, CryptoError> = decoded_points.into_iter().collect(); let out = out?; let out = g2_sum(&out); diff --git a/packages/crypto/src/bls12_318/hash.rs b/packages/crypto/src/bls12_318/hash.rs index fa13b09c65..e05ea85f5e 100644 --- a/packages/crypto/src/bls12_318/hash.rs +++ b/packages/crypto/src/bls12_318/hash.rs @@ -4,6 +4,8 @@ use bls12_381::{ }; use sha2_v9::Sha256; +use crate::CryptoError; + #[derive(Clone, Copy, Debug, PartialEq)] #[non_exhaustive] pub enum HashFunction { @@ -11,16 +13,16 @@ pub enum HashFunction { } impl HashFunction { - pub fn from_usize(idx: usize) -> Option { + pub fn from_u32(idx: u32) -> Result { let hash = match idx { 0 => Self::Sha256, - _ => return None, + _ => return Err(CryptoError::unknown_hash_function()), }; - Some(hash) + Ok(hash) } - pub fn to_usize(self) -> usize { + pub fn to_u32(self) -> u32 { match self { Self::Sha256 => 0, } diff --git a/packages/crypto/src/bls12_318/mod.rs b/packages/crypto/src/bls12_318/mod.rs index c6ace5de1e..33b9c778e1 100644 --- a/packages/crypto/src/bls12_318/mod.rs +++ b/packages/crypto/src/bls12_318/mod.rs @@ -9,3 +9,6 @@ pub use constants::{bls12_381_g1_generator, bls12_381_g2_generator}; pub use hash::{bls12_381_hash_to_g1, bls12_381_hash_to_g2, HashFunction}; pub use pairing::{bls12_381_aggregate_pairing_equality, bls12_381_pairing_equality}; pub use points::{bls12_381_g1_is_identity, bls12_381_g2_is_identity}; + +pub const BLS12_381_G1_POINT_LEN: usize = 48; +pub const BLS12_381_G2_POINT_LEN: usize = 96; diff --git a/packages/crypto/src/bls12_318/pairing.rs b/packages/crypto/src/bls12_318/pairing.rs index 69bda0c778..1727a83bc8 100644 --- a/packages/crypto/src/bls12_318/pairing.rs +++ b/packages/crypto/src/bls12_318/pairing.rs @@ -1,6 +1,6 @@ -use super::points::{ - g1_from_fixed, g1_from_variable, g2_from_fixed, g2_from_variable, InvalidPoint, -}; +use crate::CryptoError; + +use super::points::{g1_from_variable, g2_from_variable}; use bls12_381::G2Prepared; use pairing::group::Group; use rayon::iter::{ParallelBridge, ParallelIterator}; @@ -8,9 +8,9 @@ use rayon::iter::{ParallelBridge, ParallelIterator}; pub fn bls12_381_aggregate_pairing_equality( ps: &[u8], qs: &[u8], - r: &[u8; 48], - s: &[u8; 96], -) -> Result { + r: &[u8], + s: &[u8], +) -> Result { let pq_pairs: Vec<_> = ps .chunks_exact(48) .zip(qs.chunks_exact(96)) @@ -23,10 +23,10 @@ pub fn bls12_381_aggregate_pairing_equality( Ok((g1.0, G2Prepared::from(g2.0))) }) - .collect::>()?; + .collect::>()?; - let r = g1_from_fixed(r)?; - let s = g2_from_fixed(s)?; + let r = g1_from_variable(r)?; + let s = g2_from_variable(s)?; let r_neg = -r.0; let s_prepared = G2Prepared::from(s.0); @@ -49,16 +49,16 @@ pub fn bls12_381_aggregate_pairing_equality( /// e(p, q) = e(r, s) /// $$ pub fn bls12_381_pairing_equality( - p: &[u8; 48], - q: &[u8; 96], - r: &[u8; 48], - s: &[u8; 96], -) -> Result { + p: &[u8], + q: &[u8], + r: &[u8], + s: &[u8], +) -> Result { let (p, q, r, s) = ( - g1_from_fixed(p)?, - g2_from_fixed(q)?, - g1_from_fixed(r)?, - g2_from_fixed(s)?, + g1_from_variable(p)?, + g2_from_variable(q)?, + g1_from_variable(r)?, + g2_from_variable(s)?, ); let p_neg = -p; diff --git a/packages/crypto/src/bls12_318/points.rs b/packages/crypto/src/bls12_318/points.rs index 153cdebc4c..5531db2c8c 100644 --- a/packages/crypto/src/bls12_318/points.rs +++ b/packages/crypto/src/bls12_318/points.rs @@ -12,6 +12,9 @@ use bls12_381::{ use pairing::group::Group; use sha2_v9::Sha256; +use crate::errors::InvalidPoint; +use crate::CryptoError; + /// Point on G1 #[derive(Debug, PartialEq, Clone)] pub struct G1(pub(crate) G1Affine); @@ -173,31 +176,13 @@ impl<'a> core::iter::Sum<&'a G2> for G2 { } } -#[derive(Debug, thiserror::Error)] -pub enum InvalidPoint { - InvalidLength { expected: usize, actual: usize }, - DecodingError {}, -} - -impl fmt::Display for InvalidPoint { - fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result { - match self { - InvalidPoint::InvalidLength { expected, actual } => { - write!(f, "Invalid input length for point (must be in compressed format): Expected {}, actual: {}", expected, actual) - } - InvalidPoint::DecodingError {} => { - write!(f, "Invalid point") - } - } - } -} - -pub fn g1_from_variable(data: &[u8]) -> Result { +pub fn g1_from_variable(data: &[u8]) -> Result { if data.len() != 48 { return Err(InvalidPoint::InvalidLength { expected: 48, actual: data.len(), - }); + } + .into()); } let mut buf = [0u8; 48]; @@ -205,7 +190,7 @@ pub fn g1_from_variable(data: &[u8]) -> Result { g1_from_fixed(&buf) } -pub fn g1s_from_variable(data_list: &[&[u8]]) -> Vec> { +pub fn g1s_from_variable(data_list: &[&[u8]]) -> Vec> { use rayon::prelude::*; let mut out = Vec::with_capacity(data_list.len()); data_list @@ -215,12 +200,13 @@ pub fn g1s_from_variable(data_list: &[&[u8]]) -> Vec> { out } -pub fn g2_from_variable(data: &[u8]) -> Result { +pub fn g2_from_variable(data: &[u8]) -> Result { if data.len() != 96 { return Err(InvalidPoint::InvalidLength { expected: 96, actual: data.len(), - }); + } + .into()); } let mut buf = [0u8; 96]; @@ -228,39 +214,39 @@ pub fn g2_from_variable(data: &[u8]) -> Result { g2_from_fixed(&buf) } -pub fn g1_from_fixed(data: &[u8; 48]) -> Result { +pub fn g1_from_fixed(data: &[u8; 48]) -> Result { Option::from(G1Affine::from_compressed(data)) .map(G1) - .ok_or(InvalidPoint::DecodingError {}) + .ok_or_else(|| InvalidPoint::DecodingError {}.into()) } /// Like [`g1_from_fixed`] without guaranteeing that the encoding represents a valid element. /// Only use this when you know for sure the encoding is correct. -pub fn g1_from_fixed_unchecked(data: [u8; 48]) -> Result { +pub fn g1_from_fixed_unchecked(data: [u8; 48]) -> Result { Option::from(G1Affine::from_compressed_unchecked(&data)) .map(G1) - .ok_or(InvalidPoint::DecodingError {}) + .ok_or_else(|| InvalidPoint::DecodingError {}.into()) } -pub fn g2_from_fixed(data: &[u8; 96]) -> Result { +pub fn g2_from_fixed(data: &[u8; 96]) -> Result { Option::from(G2Affine::from_compressed(data)) .map(G2) - .ok_or(InvalidPoint::DecodingError {}) + .ok_or_else(|| InvalidPoint::DecodingError {}.into()) } /// Like [`g2_from_fixed`] without guaranteeing that the encoding represents a valid element. /// Only use this when you know for sure the encoding is correct. -pub fn g2_from_fixed_unchecked(data: [u8; 96]) -> Result { +pub fn g2_from_fixed_unchecked(data: [u8; 96]) -> Result { Option::from(G2Affine::from_compressed_unchecked(&data)) .map(G2) - .ok_or(InvalidPoint::DecodingError {}) + .ok_or_else(|| InvalidPoint::DecodingError {}.into()) } -pub fn bls12_381_g1_is_identity(g1: &[u8; 48]) -> Result { +pub fn bls12_381_g1_is_identity(g1: &[u8; 48]) -> Result { g1_from_fixed(g1).map(|point| point.is_identity()) } -pub fn bls12_381_g2_is_identity(g2: &[u8; 96]) -> Result { +pub fn bls12_381_g2_is_identity(g2: &[u8; 96]) -> Result { g2_from_fixed(g2).map(|point| point.is_identity()) } @@ -286,7 +272,10 @@ mod tests { let result = g1_from_variable(&hex::decode("868f005eb8e6e4ca0a47c8a77ceaa5309a47978a7c71bc5cce96366b5d7a569937c529eeda66c7293784a9402801af").unwrap()); match result.unwrap_err() { - InvalidPoint::InvalidLength { expected, actual } => { + CryptoError::InvalidPoint { + source: InvalidPoint::InvalidLength { expected, actual }, + .. + } => { assert_eq!(expected, 48); assert_eq!(actual, 47); } @@ -301,7 +290,10 @@ mod tests { let result = g2_from_variable(&hex::decode("82f5d3d2de4db19d40a6980e8aa37842a0e55d1df06bd68bddc8d60002e8e959eb9cfa368b3c1b77d18f02a54fe047b80f0989315f83b12a74fd8679c4f12aae86eaf6ab5690b34f1fddd50ee3cc6f6cdf59e95526d5a5d82aaa84fa6f181e").unwrap()); match result.unwrap_err() { - InvalidPoint::InvalidLength { expected, actual } => { + CryptoError::InvalidPoint { + source: InvalidPoint::InvalidLength { expected, actual }, + .. + } => { assert_eq!(expected, 96); assert_eq!(actual, 95); } @@ -316,13 +308,19 @@ mod tests { let result = g1_from_fixed(&hex_literal::hex!("118f005eb8e6e4ca0a47c8a77ceaa5309a47978a7c71bc5cce96366b5d7a569937c529eeda66c7293784a9402801af31")); match result.unwrap_err() { - InvalidPoint::DecodingError {} => {} + CryptoError::InvalidPoint { + source: InvalidPoint::DecodingError {}, + .. + } => {} err => panic!("Unexpected error: {:?}", err), } let result = g1_from_fixed(&hex_literal::hex!("868f005eb8e6e4ca0a47c8a77ceaa5309a47978a7c71bc5cce96366b5d7a569937c529eeda66c7293784a9402801af22")); match result.unwrap_err() { - InvalidPoint::DecodingError {} => {} + CryptoError::InvalidPoint { + source: InvalidPoint::DecodingError {}, + .. + } => {} err => panic!("Unexpected error: {:?}", err), } } @@ -342,13 +340,19 @@ mod tests { let result = g2_from_fixed(&hex_literal::hex!("11f5d3d2de4db19d40a6980e8aa37842a0e55d1df06bd68bddc8d60002e8e959eb9cfa368b3c1b77d18f02a54fe047b80f0989315f83b12a74fd8679c4f12aae86eaf6ab5690b34f1fddd50ee3cc6f6cdf59e95526d5a5d82aaa84fa6f181e42")); match result.unwrap_err() { - InvalidPoint::DecodingError {} => {} + CryptoError::InvalidPoint { + source: InvalidPoint::DecodingError {}, + .. + } => {} err => panic!("Unexpected error: {:?}", err), } let result = g2_from_fixed(&hex_literal::hex!("82f5d3d2de4db19d40a6980e8aa37842a0e55d1df06bd68bddc8d60002e8e959eb9cfa368b3c1b77d18f02a54fe047b80f0989315f83b12a74fd8679c4f12aae86eaf6ab5690b34f1fddd50ee3cc6f6cdf59e95526d5a5d82aaa84fa6f181e44")); match result.unwrap_err() { - InvalidPoint::DecodingError {} => {} + CryptoError::InvalidPoint { + source: InvalidPoint::DecodingError {}, + .. + } => {} err => panic!("Unexpected error: {:?}", err), } } diff --git a/packages/crypto/src/errors.rs b/packages/crypto/src/errors.rs index 989427fba7..a202a7ddae 100644 --- a/packages/crypto/src/errors.rs +++ b/packages/crypto/src/errors.rs @@ -1,11 +1,31 @@ use alloc::string::String; -use core::fmt::Debug; +use core::fmt::{self, Debug}; use derive_more::Display; use crate::BT; pub type CryptoResult = core::result::Result; +#[derive(Debug)] +#[cfg_attr(feature = "std", derive(thiserror::Error))] +pub enum InvalidPoint { + InvalidLength { expected: usize, actual: usize }, + DecodingError {}, +} + +impl fmt::Display for InvalidPoint { + fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result { + match self { + InvalidPoint::InvalidLength { expected, actual } => { + write!(f, "Invalid input length for point (must be in compressed format): Expected {}, actual: {}", expected, actual) + } + InvalidPoint::DecodingError {} => { + write!(f, "Invalid point") + } + } + } +} + #[derive(Display, Debug)] #[cfg_attr(feature = "std", derive(thiserror::Error))] pub enum CryptoError { @@ -21,6 +41,10 @@ pub enum CryptoError { InvalidSignatureFormat { backtrace: BT }, #[display("Invalid recovery parameter. Supported values: 0 and 1.")] InvalidRecoveryParam { backtrace: BT }, + #[display("Invalid point: {source}")] + InvalidPoint { source: InvalidPoint, backtrace: BT }, + #[display("Unknown hash function")] + UnknownHashFunction { backtrace: BT }, } impl CryptoError { @@ -62,6 +86,12 @@ impl CryptoError { } } + pub fn unknown_hash_function() -> Self { + CryptoError::UnknownHashFunction { + backtrace: BT::capture(), + } + } + /// Numeric error code that can easily be passed over the /// contract VM boundary. pub fn code(&self) -> u32 { @@ -71,11 +101,23 @@ impl CryptoError { CryptoError::InvalidPubkeyFormat { .. } => 5, CryptoError::InvalidRecoveryParam { .. } => 6, CryptoError::BatchErr { .. } => 7, + CryptoError::InvalidPoint { .. } => 8, + CryptoError::UnknownHashFunction { .. } => 9, CryptoError::GenericErr { .. } => 10, } } } +impl From for CryptoError { + #[track_caller] + fn from(value: InvalidPoint) -> Self { + Self::InvalidPoint { + source: value, + backtrace: BT::capture(), + } + } +} + #[cfg(test)] mod tests { use super::*; diff --git a/packages/crypto/src/lib.rs b/packages/crypto/src/lib.rs index 5b503b5b62..a37cd4abe4 100644 --- a/packages/crypto/src/lib.rs +++ b/packages/crypto/src/lib.rs @@ -26,7 +26,7 @@ pub use crate::bls12_318::{ bls12_381_aggregate_g1, bls12_381_aggregate_g2, bls12_381_aggregate_pairing_equality, bls12_381_g1_generator, bls12_381_g1_is_identity, bls12_381_g2_generator, bls12_381_g2_is_identity, bls12_381_hash_to_g1, bls12_381_hash_to_g2, - bls12_381_pairing_equality, HashFunction, + bls12_381_pairing_equality, HashFunction, BLS12_381_G1_POINT_LEN, BLS12_381_G2_POINT_LEN, }; #[doc(hidden)] pub use crate::ecdsa::{ECDSA_PUBKEY_MAX_LEN, ECDSA_SIGNATURE_LEN, MESSAGE_HASH_MAX_LEN}; diff --git a/packages/std/src/traits.rs b/packages/std/src/traits.rs index 8a4eda0832..56b5baead5 100644 --- a/packages/std/src/traits.rs +++ b/packages/std/src/traits.rs @@ -164,6 +164,36 @@ pub trait Api { recovery_param: u8, ) -> Result, RecoverPubkeyError>; + #[allow(unused_variables)] + fn bls12_381_pairing_equality( + &self, + p: &[u8], + q: &[u8], + r: &[u8], + s: &[u8], + ) -> Result { + // Support for BLS12-381 is added in 2.1, i.e. we can't add a compile time requirement for new function. + // Any implementation of the Api trait which does not implement this function but tries to call it will + // panic at runtime. We don't assume such cases exist. + // See also https://doc.rust-lang.org/cargo/reference/semver.html#trait-new-default-item + unimplemented!() + } + + #[allow(unused_variables)] + fn bls12_381_aggregate_pairing_equality( + &self, + ps: &[u8], + qs: &[u8], + r: &[u8], + s: &[u8], + ) -> Result { + // Support for BLS12-381 is added in 2.1, i.e. we can't add a compile time requirement for new function. + // Any implementation of the Api trait which does not implement this function but tries to call it will + // panic at runtime. We don't assume such cases exist. + // See also https://doc.rust-lang.org/cargo/reference/semver.html#trait-new-default-item + unimplemented!() + } + #[allow(unused_variables)] fn secp256r1_verify( &self, diff --git a/packages/vm/src/environment.rs b/packages/vm/src/environment.rs index dbf10e436b..3ba678e4ae 100644 --- a/packages/vm/src/environment.rs +++ b/packages/vm/src/environment.rs @@ -45,6 +45,8 @@ pub struct GasConfig { pub ed25519_batch_verify_cost: u64, /// ed25519 batch signature verification cost (single public key) pub ed25519_batch_verify_one_pubkey_cost: u64, + /// bls12-381 pairing equality check cost + pub bls12_381_pairing_equality_cost: u64, } impl Default for GasConfig { @@ -66,6 +68,8 @@ impl Default for GasConfig { // From https://docs.rs/ed25519-zebra/2.2.0/ed25519_zebra/batch/index.html ed25519_batch_verify_cost: 63 * GAS_PER_US / 2, ed25519_batch_verify_one_pubkey_cost: 63 * GAS_PER_US / 4, + // god i wish i was lying + bls12_381_pairing_equality_cost: 1733 * GAS_PER_US, } } } diff --git a/packages/vm/src/imports.rs b/packages/vm/src/imports.rs index b0324f16f5..25e6c63dee 100644 --- a/packages/vm/src/imports.rs +++ b/packages/vm/src/imports.rs @@ -4,8 +4,10 @@ use std::cmp::max; use std::marker::PhantomData; use cosmwasm_crypto::{ - ed25519_batch_verify, ed25519_verify, secp256k1_recover_pubkey, secp256k1_verify, - secp256r1_recover_pubkey, secp256r1_verify, CryptoError, + bls12_381_aggregate_g1, bls12_381_aggregate_g2, bls12_381_aggregate_pairing_equality, + bls12_381_hash_to_g1, bls12_381_hash_to_g2, bls12_381_pairing_equality, ed25519_batch_verify, + ed25519_verify, secp256k1_recover_pubkey, secp256k1_verify, secp256r1_recover_pubkey, + secp256r1_verify, CryptoError, HashFunction, BLS12_381_G1_POINT_LEN, BLS12_381_G2_POINT_LEN, }; use cosmwasm_crypto::{ ECDSA_PUBKEY_MAX_LEN, ECDSA_SIGNATURE_LEN, EDDSA_PUBKEY_LEN, MESSAGE_HASH_MAX_LEN, @@ -239,6 +241,228 @@ const SECP256K1_VERIFY_CODE_VALID: u32 = 0; /// Return code (error code) for an invalid signature const SECP256K1_VERIFY_CODE_INVALID: u32 = 1; +/// Return code (error code) for a valid pairing +const BLS12_381_VALID_PAIRING: u32 = 0; + +/// Return code (error code) for an invalid pairing +const BLS12_381_INVALID_PAIRING: u32 = 1; + +/// Maximum size of continous points passed to aggregate functions +const BLS12_381_MAX_AGGREGATE_SIZE: usize = 2 * MI; + +/// Maximum size of the message passed to the hash-to-curve functions +const BLS12_381_MAX_MESSAGE_SIZE: usize = 5 * MI; + +/// Maximum size of the destination passed to the hash-to-curve functions +const BLS12_381_MAX_DST_SIZE: usize = 5 * KI; + +pub fn do_bls12_381_aggregate_g1< + A: BackendApi + 'static, + S: Storage + 'static, + Q: Querier + 'static, +>( + mut env: FunctionEnvMut>, + g1s_ptr: u32, +) -> VmResult { + let (data, mut store) = env.data_and_store_mut(); + let memory = data.memory(&store); + + let g1s = read_region(&memory, g1s_ptr, BLS12_381_MAX_AGGREGATE_SIZE)?; + + // TODO: Add gas consumption metering + + let code = match bls12_381_aggregate_g1(&g1s) { + Ok(point) => to_low_half(write_to_contract(data, &mut store, &point)?), + Err(err) => match err { + CryptoError::InvalidPoint { .. } => to_high_half(err.code()), + CryptoError::BatchErr { .. } + | CryptoError::GenericErr { .. } + | CryptoError::InvalidHashFormat { .. } + | CryptoError::InvalidPubkeyFormat { .. } + | CryptoError::InvalidRecoveryParam { .. } + | CryptoError::InvalidSignatureFormat { .. } + | CryptoError::UnknownHashFunction { .. } => { + panic!("Error must not happen for this call") + } + }, + }; + + Ok(code) +} + +pub fn do_bls12_381_aggregate_g2< + A: BackendApi + 'static, + S: Storage + 'static, + Q: Querier + 'static, +>( + mut env: FunctionEnvMut>, + g2s_ptr: u32, +) -> VmResult { + let (data, mut store) = env.data_and_store_mut(); + let memory = data.memory(&store); + + let g2s = read_region(&memory, g2s_ptr, BLS12_381_MAX_AGGREGATE_SIZE)?; + + // TODO: Add gas consumption metering + + let code = match bls12_381_aggregate_g2(&g2s) { + Ok(point) => to_low_half(write_to_contract(data, &mut store, &point)?), + Err(err) => match err { + CryptoError::InvalidPoint { .. } => to_high_half(err.code()), + CryptoError::BatchErr { .. } + | CryptoError::GenericErr { .. } + | CryptoError::InvalidHashFormat { .. } + | CryptoError::InvalidPubkeyFormat { .. } + | CryptoError::InvalidRecoveryParam { .. } + | CryptoError::InvalidSignatureFormat { .. } + | CryptoError::UnknownHashFunction { .. } => { + panic!("Error must not happen for this call") + } + }, + }; + + Ok(code) +} + +pub fn do_bls12_381_aggregate_pairing_equality< + A: BackendApi + 'static, + S: Storage + 'static, + Q: Querier + 'static, +>( + mut env: FunctionEnvMut>, + ps_ptr: u32, + qs_ptr: u32, + r_ptr: u32, + s_ptr: u32, +) -> VmResult { + let (data, mut store) = env.data_and_store_mut(); + let memory = data.memory(&store); + + let ps = read_region(&memory, ps_ptr, BLS12_381_MAX_AGGREGATE_SIZE)?; + let qs = read_region(&memory, qs_ptr, BLS12_381_MAX_AGGREGATE_SIZE)?; + let r = read_region(&memory, r_ptr, BLS12_381_G1_POINT_LEN)?; + let s = read_region(&memory, s_ptr, BLS12_381_G2_POINT_LEN)?; + + // TODO: Adjust gas consumption metering to aggregated cost + let gas_info = GasInfo::with_cost(data.gas_config.bls12_381_pairing_equality_cost); + process_gas_info(data, &mut store, gas_info)?; + + let code = match bls12_381_aggregate_pairing_equality(&ps, &qs, &r, &s) { + Ok(true) => BLS12_381_VALID_PAIRING, + Ok(false) => BLS12_381_INVALID_PAIRING, + Err(err) => match err { + CryptoError::InvalidPoint { .. } => err.code(), + CryptoError::BatchErr { .. } + | CryptoError::GenericErr { .. } + | CryptoError::InvalidHashFormat { .. } + | CryptoError::InvalidPubkeyFormat { .. } + | CryptoError::InvalidRecoveryParam { .. } + | CryptoError::InvalidSignatureFormat { .. } + | CryptoError::UnknownHashFunction { .. } => { + panic!("Error must not happen for this call") + } + }, + }; + + Ok(code) +} + +pub fn do_bls12_381_hash_to_g1< + A: BackendApi + 'static, + S: Storage + 'static, + Q: Querier + 'static, +>( + mut env: FunctionEnvMut>, + hash_function: u32, + msg_ptr: u32, + dst_ptr: u32, +) -> VmResult { + let (data, mut store) = env.data_and_store_mut(); + let memory = data.memory(&store); + + let msg = read_region(&memory, msg_ptr, BLS12_381_MAX_MESSAGE_SIZE)?; + let dst = read_region(&memory, dst_ptr, BLS12_381_MAX_DST_SIZE)?; + + // TODO: Add gas consumption metering + + let hash_function = match HashFunction::from_u32(hash_function) { + Ok(func) => func, + Err(error) => return Ok(to_high_half(error.code())), + }; + let point = bls12_381_hash_to_g1(hash_function, &msg, &dst); + + Ok(to_low_half(write_to_contract(data, &mut store, &point)?)) +} + +pub fn do_bls12_381_hash_to_g2< + A: BackendApi + 'static, + S: Storage + 'static, + Q: Querier + 'static, +>( + mut env: FunctionEnvMut>, + hash_function: u32, + msg_ptr: u32, + dst_ptr: u32, +) -> VmResult { + let (data, mut store) = env.data_and_store_mut(); + let memory = data.memory(&store); + + let msg = read_region(&memory, msg_ptr, BLS12_381_MAX_MESSAGE_SIZE)?; + let dst = read_region(&memory, dst_ptr, BLS12_381_MAX_DST_SIZE)?; + + // TODO: Add gas consumption metering + + let hash_function = match HashFunction::from_u32(hash_function) { + Ok(func) => func, + Err(error) => return Ok(to_high_half(error.code())), + }; + let point = bls12_381_hash_to_g2(hash_function, &msg, &dst); + + Ok(to_low_half(write_to_contract(data, &mut store, &point)?)) +} + +pub fn do_bls12_381_pairing_equality< + A: BackendApi + 'static, + S: Storage + 'static, + Q: Querier + 'static, +>( + mut env: FunctionEnvMut>, + p_ptr: u32, + q_ptr: u32, + r_ptr: u32, + s_ptr: u32, +) -> VmResult { + let (data, mut store) = env.data_and_store_mut(); + let memory = data.memory(&store); + + let p = read_region(&memory, p_ptr, BLS12_381_G1_POINT_LEN)?; + let q = read_region(&memory, q_ptr, BLS12_381_G2_POINT_LEN)?; + let r = read_region(&memory, r_ptr, BLS12_381_G1_POINT_LEN)?; + let s = read_region(&memory, s_ptr, BLS12_381_G2_POINT_LEN)?; + + let gas_info = GasInfo::with_cost(data.gas_config.bls12_381_pairing_equality_cost); + process_gas_info(data, &mut store, gas_info)?; + + let code = match bls12_381_pairing_equality(&p, &q, &r, &s) { + Ok(true) => BLS12_381_VALID_PAIRING, + Ok(false) => BLS12_381_INVALID_PAIRING, + Err(err) => match err { + CryptoError::InvalidPoint { .. } => err.code(), + CryptoError::BatchErr { .. } + | CryptoError::GenericErr { .. } + | CryptoError::InvalidHashFormat { .. } + | CryptoError::InvalidPubkeyFormat { .. } + | CryptoError::InvalidRecoveryParam { .. } + | CryptoError::InvalidSignatureFormat { .. } + | CryptoError::UnknownHashFunction { .. } => { + panic!("Error must not happen for this call") + } + }, + }; + + Ok(code) +} + pub fn do_secp256k1_verify( mut env: FunctionEnvMut>, hash_ptr: u32, @@ -267,7 +491,10 @@ pub fn do_secp256k1_verify err.code(), - CryptoError::BatchErr { .. } | CryptoError::InvalidRecoveryParam { .. } => { + CryptoError::BatchErr { .. } + | CryptoError::InvalidPoint { .. } + | CryptoError::InvalidRecoveryParam { .. } + | CryptoError::UnknownHashFunction { .. } => { panic!("Error must not happen for this call") } }, @@ -307,7 +534,10 @@ pub fn do_secp256k1_recover_pubkey< | CryptoError::InvalidSignatureFormat { .. } | CryptoError::InvalidRecoveryParam { .. } | CryptoError::GenericErr { .. } => Ok(to_high_half(err.code())), - CryptoError::BatchErr { .. } | CryptoError::InvalidPubkeyFormat { .. } => { + CryptoError::BatchErr { .. } + | CryptoError::InvalidPoint { .. } + | CryptoError::InvalidPubkeyFormat { .. } + | CryptoError::UnknownHashFunction { .. } => { panic!("Error must not happen for this call") } }, @@ -348,7 +578,10 @@ pub fn do_secp256r1_verify err.code(), - CryptoError::BatchErr { .. } | CryptoError::InvalidRecoveryParam { .. } => { + CryptoError::BatchErr { .. } + | CryptoError::InvalidPoint { .. } + | CryptoError::InvalidRecoveryParam { .. } + | CryptoError::UnknownHashFunction { .. } => { panic!("Error must not happen for this call") } }, @@ -388,7 +621,10 @@ pub fn do_secp256r1_recover_pubkey< | CryptoError::InvalidSignatureFormat { .. } | CryptoError::InvalidRecoveryParam { .. } | CryptoError::GenericErr { .. } => Ok(to_high_half(err.code())), - CryptoError::BatchErr { .. } | CryptoError::InvalidPubkeyFormat { .. } => { + CryptoError::BatchErr { .. } + | CryptoError::InvalidPoint { .. } + | CryptoError::InvalidPubkeyFormat { .. } + | CryptoError::UnknownHashFunction { .. } => { panic!("Error must not happen for this call") } }, @@ -437,8 +673,10 @@ pub fn do_ed25519_verify err.code(), CryptoError::BatchErr { .. } + | CryptoError::InvalidPoint { .. } | CryptoError::InvalidHashFormat { .. } - | CryptoError::InvalidRecoveryParam { .. } => { + | CryptoError::InvalidRecoveryParam { .. } + | CryptoError::UnknownHashFunction { .. } => { panic!("Error must not happen for this call") } }, @@ -499,7 +737,10 @@ pub fn do_ed25519_batch_verify< | CryptoError::InvalidPubkeyFormat { .. } | CryptoError::InvalidSignatureFormat { .. } | CryptoError::GenericErr { .. } => err.code(), - CryptoError::InvalidHashFormat { .. } | CryptoError::InvalidRecoveryParam { .. } => { + CryptoError::InvalidHashFormat { .. } + | CryptoError::InvalidPoint { .. } + | CryptoError::InvalidRecoveryParam { .. } + | CryptoError::UnknownHashFunction { .. } => { panic!("Error must not happen for this call") } }, diff --git a/packages/vm/src/instance.rs b/packages/vm/src/instance.rs index eb6c3a9283..84ff7c11ca 100644 --- a/packages/vm/src/instance.rs +++ b/packages/vm/src/instance.rs @@ -14,8 +14,10 @@ use crate::conversion::{ref_to_u32, to_u32}; use crate::environment::Environment; use crate::errors::{CommunicationError, VmError, VmResult}; use crate::imports::{ - do_abort, do_addr_canonicalize, do_addr_humanize, do_addr_validate, do_db_read, do_db_remove, - do_db_write, do_debug, do_ed25519_batch_verify, do_ed25519_verify, do_query_chain, + do_abort, do_addr_canonicalize, do_addr_humanize, do_addr_validate, do_bls12_381_aggregate_g1, + do_bls12_381_aggregate_g2, do_bls12_381_aggregate_pairing_equality, do_bls12_381_hash_to_g1, + do_bls12_381_hash_to_g2, do_bls12_381_pairing_equality, do_db_read, do_db_remove, do_db_write, + do_debug, do_ed25519_batch_verify, do_ed25519_verify, do_query_chain, do_secp256k1_recover_pubkey, do_secp256k1_verify, do_secp256r1_recover_pubkey, do_secp256r1_verify, }; @@ -142,6 +144,57 @@ where Function::new_typed_with_env(&mut store, &fe, do_addr_humanize), ); + // Reads a list of points on of the subgroup G1 on the BLS12-381 curve and aggregates them down to a single element. + // Returns a u64 as a result, the top half represents the error code. 0 signifies success, anything else may be converted into a `CryptoError`. + // The lower half is a pointer to a new memory region containing the new point. + env_imports.insert( + "bls12_381_aggregate_g1", + Function::new_typed_with_env(&mut store, &fe, do_bls12_381_aggregate_g1), + ); + + // Reads a list of points on of the subgroup G2 on the BLS12-381 curve and aggregates them down to a single element. + // Returns a u64 as a result, the top half represents the error code. 0 signifies success, anything else may be converted into a `CryptoError`. + // The lower half is a pointer to a new memory region containing the new point. + env_imports.insert( + "bls12_381_aggregate_g2", + Function::new_typed_with_env(&mut store, &fe, do_bls12_381_aggregate_g2), + ); + + // Four parameters, "ps", "qs", "r", "s", which all represent elements on the BLS12-381 curve (where "ps" and "r" are elements of the G1 subgroup, and "qs" and "s" elements of G2). + // The "ps" and "qs" are interpreted as a continous list of points in the subgroups G1 and G2 respectively. + // Returns a single u32 which signifies the validity of the pairing equality. + // Returns 0 if the pairing equality exists, 1 if it doesnt, and any other code may be interpreted as a `CryptoError`. + env_imports.insert( + "bls12_381_aggregate_pairing_equality", + Function::new_typed_with_env(&mut store, &fe, do_bls12_381_aggregate_pairing_equality), + ); + + // Three parameters, "hash_function" and "msg" and "dst", are passed down which are both arbitrary octet strings. + // The "hash_function" parameter is interpreted as a case of the "HashFunction" enum. + // Returns a u64 as a result, the top half represents the error code. 0 signifies success, anything else may be converted into a `CryptoError`. + // The lower half is a pointer to a new memory region containing the newly generated point. + env_imports.insert( + "bls12_381_hash_to_g1", + Function::new_typed_with_env(&mut store, &fe, do_bls12_381_hash_to_g1), + ); + + // Three parameters, "hash_function" and "msg" and "dst", are passed down which are both arbitrary octet strings. + // The "hash_function" parameter is interpreted as a case of the "HashFunction" enum. + // Returns a u64 as a result, the top half represents the error code. 0 signifies success, anything else may be converted into a `CryptoError`. + // The lower half is a pointer to a new memory region containing the newly generated point. + env_imports.insert( + "bls12_381_hash_to_g2", + Function::new_typed_with_env(&mut store, &fe, do_bls12_381_hash_to_g2), + ); + + // Four parameters, "p", "q", "r", "s", which all represent elements on the BLS12-381 curve (where "p" and "r" are elements of the G1 subgroup, and "q" and "s" elements of G2). + // Returns a single u32 which signifies the validity of the pairing equality. + // Returns 0 if the pairing equality exists, 1 if it doesnt, and any other code may be interpreted as a `CryptoError`. + env_imports.insert( + "bls12_381_pairing_equality", + Function::new_typed_with_env(&mut store, &fe, do_bls12_381_pairing_equality), + ); + // Verifies message hashes against a signature with a public key, using the secp256k1 ECDSA parametrization. // Returns 0 on verification success, 1 on verification failure, and values greater than 1 in case of error. // Ownership of input pointers is not transferred to the host. From e3b63de6b35deadbf9f487af695a44c25971ede2 Mon Sep 17 00:00:00 2001 From: Aumetra Weisman Date: Mon, 15 Apr 2024 16:17:04 +0200 Subject: [PATCH 21/79] Write up API functions --- packages/crypto/src/bls12_318/hash.rs | 3 +- packages/std/Cargo.toml | 1 + packages/std/src/imports.rs | 169 +++++++++++++++++++++++++- packages/std/src/lib.rs | 2 + packages/std/src/testing/mock.rs | 55 +++++++++ packages/std/src/traits.rs | 59 ++++++++- packages/vm/src/imports.rs | 42 ++++--- packages/vm/src/instance.rs | 16 +-- 8 files changed, 317 insertions(+), 30 deletions(-) diff --git a/packages/crypto/src/bls12_318/hash.rs b/packages/crypto/src/bls12_318/hash.rs index e05ea85f5e..bd09dc30b1 100644 --- a/packages/crypto/src/bls12_318/hash.rs +++ b/packages/crypto/src/bls12_318/hash.rs @@ -6,12 +6,13 @@ use sha2_v9::Sha256; use crate::CryptoError; -#[derive(Clone, Copy, Debug, PartialEq)] +#[derive(Clone, Copy, Debug)] #[non_exhaustive] pub enum HashFunction { Sha256, } +#[doc(hidden)] impl HashFunction { pub fn from_u32(idx: u32) -> Result { let hash = match idx { diff --git a/packages/std/Cargo.toml b/packages/std/Cargo.toml index 32d3573214..fdc056147b 100644 --- a/packages/std/Cargo.toml +++ b/packages/std/Cargo.toml @@ -59,6 +59,7 @@ cosmwasm_2_1 = ["cosmwasm_2_0"] base64 = "0.22.0" cosmwasm-derive = { version = "2.0.1", path = "../derive" } cosmwasm-core = { path = "../core", version = "2.0.1", features = ["std"] } +cosmwasm-crypto = { path = "../crypto", version = "2.0.1", features = ["std"] } derive_more = { version = "1.0.0-beta.6", default-features = false, features = ["debug"] } hex = "0.4" schemars = { workspace = true } diff --git a/packages/std/src/imports.rs b/packages/std/src/imports.rs index e1a7b500ca..33700ecaa0 100644 --- a/packages/std/src/imports.rs +++ b/packages/std/src/imports.rs @@ -14,7 +14,9 @@ use crate::{ iterator::{Order, Record}, memory::get_optional_region_address, }; -use crate::{RecoverPubkeyError, StdError, StdResult, SystemError, VerificationError}; +use crate::{ + HashFunction, RecoverPubkeyError, StdError, StdResult, SystemError, VerificationError, +}; /// An upper bound for typical canonical address lengths (e.g. 20 in Cosmos SDK/Ethereum or 32 in Nano/Substrate) const CANONICAL_ADDRESS_BUFFER_LENGTH: usize = 64; @@ -46,6 +48,29 @@ extern "C" { fn addr_canonicalize(source_ptr: u32, destination_ptr: u32) -> u32; fn addr_humanize(source_ptr: u32, destination_ptr: u32) -> u32; + #[cfg(feature = "cosmwasm_2_1")] + fn bls12_381_aggregate_g1(g1s_ptr: u32) -> u64; + + #[cfg(feature = "cosmwasm_2_1")] + fn bls12_381_aggregate_g2(g2s_ptr: u32) -> u64; + + #[cfg(feature = "cosmwasm_2_1")] + fn bls12_381_aggregate_pairing_equality( + ps_ptr: u32, + qs_ptr: u32, + r_ptr: u32, + s_ptr: u32, + ) -> u32; + + #[cfg(feature = "cosmwasm_2_1")] + fn bls12_381_hash_to_g1(hash_function: u32, msg_ptr: u32, dst_ptr: u32) -> u64; + + #[cfg(feature = "cosmwasm_2_1")] + fn bls12_381_hash_to_g2(hash_function: u32, msg_ptr: u32, dst_ptr: u32) -> u64; + + #[cfg(feature = "cosmwasm_2_1")] + fn bls12_381_pairing_equality(p_ptr: u32, q_ptr: u32, r_ptr: u32, s_ptr: u32) -> u32; + /// Verifies message hashes against a signature with a public key, using the /// secp256k1 ECDSA parametrization. /// Returns 0 on verification success, 1 on verification failure, and values @@ -375,6 +400,148 @@ impl Api for ExternalApi { Ok(Addr::unchecked(address)) } + fn bls12_381_aggregate_g1(&self, g1s: &[u8]) -> Result<[u8; 48], VerificationError> { + let mut point = [0; 48]; + + let send = build_region(g1s); + let send_ptr = &*send as *const Region as u32; + + let out = build_region(&point); + let out_ptr = &*send as *const Region as u32; + let result = unsafe { bls12_381_aggregate_g1(send_ptr, out_ptr) }; + match result { + 0 => Ok(point), + 8 => Err(VerificationError::InvalidPoint), + error_code => Err(VerificationError::unknown_err(error_code)), + } + } + + fn bls12_381_aggregate_g2(&self, g2s: &[u8]) -> Result<[u8; 96], VerificationError> { + let mut point = [0; 96]; + + let send = build_region(g2s); + let send_ptr = &*send as *const Region as u32; + + let out = build_region(&point); + let out_ptr = &*send as *const Region as u32; + let result = unsafe { bls12_381_aggregate_g1(send_ptr, out_ptr) }; + match result { + 0 => Ok(point), + 8 => Err(VerificationError::InvalidPoint), + error_code => Err(VerificationError::unknown_err(error_code)), + } + } + + fn bls12_381_aggregate_pairing_equality( + &self, + ps: &[u8], + qs: &[u8], + r: &[u8], + s: &[u8], + ) -> Result { + let send_ps = build_region(ps); + let send_qs = build_region(qs); + let send_r = build_region(r); + let send_s = build_region(s); + + let send_ps_ptr = &*send_ps as *const Region as u32; + let send_qs_ptr = &*send_qs as *const Region as u32; + let send_r_ptr = &*send_r as *const Region as u32; + let send_s_ptr = &*send_s as *const Region as u32; + + let result = unsafe { + bls12_381_aggregate_pairing_equality(send_ps_ptr, send_qs_ptr, send_r_ptr, send_s_ptr) + }; + match result { + 0 => Ok(true), + 1 => Ok(false), + 8 => Err(VerificationError::InvalidPoint), + error_code => Err(VerificationError::unknown_err(error_code)), + } + } + + fn bls12_381_hash_to_g1( + &self, + hash_function: HashFunction, + msg: &[u8], + dst: &[u8], + ) -> Result<[u8; 48], VerificationError> { + let mut point = [0; 48]; + + let send_msg = build_region(msg); + let send_msg_ptr = &*send_msg as *const Region as u32; + + let send_dst = build_region(dst); + let send_dst_ptr = &*send_dst as *const Region as u32; + + let out = build_region(&point); + let out_ptr = &*send as *const Region as u32; + let result = unsafe { + bls12_381_hash_to_g1(hash_function.to_u32(), send_msg_ptr, send_dst_ptr, out_ptr) + }; + + match result { + 0 => Ok(point), + 9 => Err(VerificationError::InvalidHashFunction), + error_code => Err(VerificationError::unknown_err(error_code)), + } + } + + fn bls12_381_hash_to_g2( + &self, + hash_function: HashFunction, + msg: &[u8], + dst: &[u8], + ) -> Result<[u8; 96], VerificationError> { + let mut point = [0; 96]; + + let send_msg = build_region(msg); + let send_msg_ptr = &*send_msg as *const Region as u32; + + let send_dst = build_region(dst); + let send_dst_ptr = &*send_dst as *const Region as u32; + + let out = build_region(&point); + let out_ptr = &*send as *const Region as u32; + let result = unsafe { + bls12_381_hash_to_g2(hash_function.to_u32(), send_msg_ptr, send_dst_ptr, out_ptr) + }; + + match result { + 0 => Ok(point), + 9 => Err(VerificationError::InvalidHashFunction), + error_code => Err(VerificationError::unknown_err(error_code)), + } + } + + fn bls12_381_pairing_equality( + &self, + p: &[u8], + q: &[u8], + r: &[u8], + s: &[u8], + ) -> Result { + let send_p = build_region(p); + let send_q = build_region(q); + let send_r = build_region(r); + let send_s = build_region(s); + + let send_p_ptr = &*send_p as *const Region as u32; + let send_q_ptr = &*send_q as *const Region as u32; + let send_r_ptr = &*send_r as *const Region as u32; + let send_s_ptr = &*send_s as *const Region as u32; + + let result = + unsafe { bls12_381_pairing_equality(send_p_ptr, send_q_ptr, send_r_ptr, send_s_ptr) }; + match result { + 0 => Ok(true), + 1 => Ok(false), + 2 => panic!("MessageTooLong must not happen. This is a bug in the VM."), + 8 => Err(VerificationError::InvalidPoint), + error_code => Err(VerificationError::unknown_err(error_code)), + } + } + fn secp256k1_verify( &self, message_hash: &[u8], diff --git a/packages/std/src/lib.rs b/packages/std/src/lib.rs index 6860b9bc09..a7b8781b5e 100644 --- a/packages/std/src/lib.rs +++ b/packages/std/src/lib.rs @@ -122,4 +122,6 @@ pub use cosmwasm_core::{ #[cfg(not(target_arch = "wasm32"))] pub use cosmwasm_core::assert_approx_eq; +pub use cosmwasm_crypto::HashFunction; + pub use cosmwasm_derive::entry_point; diff --git a/packages/std/src/testing/mock.rs b/packages/std/src/testing/mock.rs index bf83a3a6bb..774228e7bd 100644 --- a/packages/std/src/testing/mock.rs +++ b/packages/std/src/testing/mock.rs @@ -1,4 +1,5 @@ use crate::prelude::*; +use crate::HashFunction; use alloc::collections::BTreeMap; #[cfg(feature = "cosmwasm_1_3")] use alloc::collections::BTreeSet; @@ -151,6 +152,60 @@ impl Api for MockApi { .map_err(|_| StdError::generic_err("Bech32 encoding error")) } + fn bls12_381_aggregate_g1(&self, g1s: &[u8]) -> Result<[u8; 48], VerificationError> { + cosmwasm_crypto::bls12_381_aggregate_g1(g1s).map_err(Into::into) + } + + fn bls12_381_aggregate_g2(&self, g2s: &[u8]) -> Result<[u8; 96], VerificationError> { + cosmwasm_crypto::bls12_381_aggregate_g2(g2s).map_err(Into::into) + } + + fn bls12_381_aggregate_pairing_equality( + &self, + ps: &[u8], + qs: &[u8], + r: &[u8], + s: &[u8], + ) -> Result { + cosmwasm_crypto::bls12_381_aggregate_pairing_equality(ps, qs, r, s).map_err(Into::into) + } + + fn bls12_381_hash_to_g1( + &self, + hash_function: HashFunction, + msg: &[u8], + dst: &[u8], + ) -> Result<[u8; 48], VerificationError> { + Ok(cosmwasm_crypto::bls12_381_hash_to_g1( + hash_function, + msg, + dst, + )) + } + + fn bls12_381_hash_to_g2( + &self, + hash_function: HashFunction, + msg: &[u8], + dst: &[u8], + ) -> Result<[u8; 96], VerificationError> { + Ok(cosmwasm_crypto::bls12_381_hash_to_g2( + hash_function, + msg, + dst, + )) + } + + fn bls12_381_pairing_equality( + &self, + p: &[u8], + q: &[u8], + r: &[u8], + s: &[u8], + ) -> Result { + cosmwasm_crypto::bls12_381_pairing_equality(p, q, r, s).map_err(Into::into) + } + fn secp256k1_verify( &self, message_hash: &[u8], diff --git a/packages/std/src/traits.rs b/packages/std/src/traits.rs index 56b5baead5..0c8c4191ed 100644 --- a/packages/std/src/traits.rs +++ b/packages/std/src/traits.rs @@ -26,6 +26,7 @@ use crate::query::{ }; use crate::results::{ContractResult, Empty, SystemResult}; use crate::ContractInfoResponse; +use crate::HashFunction; use crate::{from_json, to_json_binary, to_json_vec, Binary}; #[cfg(feature = "cosmwasm_1_3")] use crate::{DenomMetadata, PageRequest}; @@ -165,10 +166,28 @@ pub trait Api { ) -> Result, RecoverPubkeyError>; #[allow(unused_variables)] - fn bls12_381_pairing_equality( + fn bls12_381_aggregate_g1(&self, g1s: &[u8]) -> Result<[u8; 48], VerificationError> { + // Support for BLS12-381 is added in 2.1, i.e. we can't add a compile time requirement for new function. + // Any implementation of the Api trait which does not implement this function but tries to call it will + // panic at runtime. We don't assume such cases exist. + // See also https://doc.rust-lang.org/cargo/reference/semver.html#trait-new-default-item + unimplemented!() + } + + #[allow(unused_variables)] + fn bls12_381_aggregate_g2(&self, g2s: &[u8]) -> Result<[u8; 96], VerificationError> { + // Support for BLS12-381 is added in 2.1, i.e. we can't add a compile time requirement for new function. + // Any implementation of the Api trait which does not implement this function but tries to call it will + // panic at runtime. We don't assume such cases exist. + // See also https://doc.rust-lang.org/cargo/reference/semver.html#trait-new-default-item + unimplemented!() + } + + #[allow(unused_variables)] + fn bls12_381_aggregate_pairing_equality( &self, - p: &[u8], - q: &[u8], + ps: &[u8], + qs: &[u8], r: &[u8], s: &[u8], ) -> Result { @@ -180,10 +199,38 @@ pub trait Api { } #[allow(unused_variables)] - fn bls12_381_aggregate_pairing_equality( + fn bls12_381_hash_to_g1( &self, - ps: &[u8], - qs: &[u8], + hash_function: HashFunction, + msg: &[u8], + dst: &[u8], + ) -> Result<[u8; 48], VerificationError> { + // Support for BLS12-381 is added in 2.1, i.e. we can't add a compile time requirement for new function. + // Any implementation of the Api trait which does not implement this function but tries to call it will + // panic at runtime. We don't assume such cases exist. + // See also https://doc.rust-lang.org/cargo/reference/semver.html#trait-new-default-item + unimplemented!() + } + + #[allow(unused_variables)] + fn bls12_381_hash_to_g2( + &self, + hash_function: HashFunction, + msg: &[u8], + dst: &[u8], + ) -> Result<[u8; 96], VerificationError> { + // Support for BLS12-381 is added in 2.1, i.e. we can't add a compile time requirement for new function. + // Any implementation of the Api trait which does not implement this function but tries to call it will + // panic at runtime. We don't assume such cases exist. + // See also https://doc.rust-lang.org/cargo/reference/semver.html#trait-new-default-item + unimplemented!() + } + + #[allow(unused_variables)] + fn bls12_381_pairing_equality( + &self, + p: &[u8], + q: &[u8], r: &[u8], s: &[u8], ) -> Result { diff --git a/packages/vm/src/imports.rs b/packages/vm/src/imports.rs index 25e6c63dee..e19c85504b 100644 --- a/packages/vm/src/imports.rs +++ b/packages/vm/src/imports.rs @@ -263,8 +263,9 @@ pub fn do_bls12_381_aggregate_g1< >( mut env: FunctionEnvMut>, g1s_ptr: u32, -) -> VmResult { - let (data, mut store) = env.data_and_store_mut(); + out_ptr: u32, +) -> VmResult { + let (data, store) = env.data_and_store_mut(); let memory = data.memory(&store); let g1s = read_region(&memory, g1s_ptr, BLS12_381_MAX_AGGREGATE_SIZE)?; @@ -272,9 +273,12 @@ pub fn do_bls12_381_aggregate_g1< // TODO: Add gas consumption metering let code = match bls12_381_aggregate_g1(&g1s) { - Ok(point) => to_low_half(write_to_contract(data, &mut store, &point)?), + Ok(point) => { + write_region(&memory, out_ptr, &point)?; + 0 + } Err(err) => match err { - CryptoError::InvalidPoint { .. } => to_high_half(err.code()), + CryptoError::InvalidPoint { .. } => err.code(), CryptoError::BatchErr { .. } | CryptoError::GenericErr { .. } | CryptoError::InvalidHashFormat { .. } @@ -297,8 +301,9 @@ pub fn do_bls12_381_aggregate_g2< >( mut env: FunctionEnvMut>, g2s_ptr: u32, -) -> VmResult { - let (data, mut store) = env.data_and_store_mut(); + out_ptr: u32, +) -> VmResult { + let (data, store) = env.data_and_store_mut(); let memory = data.memory(&store); let g2s = read_region(&memory, g2s_ptr, BLS12_381_MAX_AGGREGATE_SIZE)?; @@ -306,9 +311,12 @@ pub fn do_bls12_381_aggregate_g2< // TODO: Add gas consumption metering let code = match bls12_381_aggregate_g2(&g2s) { - Ok(point) => to_low_half(write_to_contract(data, &mut store, &point)?), + Ok(point) => { + write_region(&memory, out_ptr, &point)?; + 0 + } Err(err) => match err { - CryptoError::InvalidPoint { .. } => to_high_half(err.code()), + CryptoError::InvalidPoint { .. } => err.code(), CryptoError::BatchErr { .. } | CryptoError::GenericErr { .. } | CryptoError::InvalidHashFormat { .. } @@ -376,8 +384,9 @@ pub fn do_bls12_381_hash_to_g1< hash_function: u32, msg_ptr: u32, dst_ptr: u32, -) -> VmResult { - let (data, mut store) = env.data_and_store_mut(); + out_ptr: u32, +) -> VmResult { + let (data, store) = env.data_and_store_mut(); let memory = data.memory(&store); let msg = read_region(&memory, msg_ptr, BLS12_381_MAX_MESSAGE_SIZE)?; @@ -387,11 +396,13 @@ pub fn do_bls12_381_hash_to_g1< let hash_function = match HashFunction::from_u32(hash_function) { Ok(func) => func, - Err(error) => return Ok(to_high_half(error.code())), + Err(error) => return Ok(error.code()), }; let point = bls12_381_hash_to_g1(hash_function, &msg, &dst); - Ok(to_low_half(write_to_contract(data, &mut store, &point)?)) + write_region(&memory, out_ptr, &point)?; + + Ok(0) } pub fn do_bls12_381_hash_to_g2< @@ -403,8 +414,9 @@ pub fn do_bls12_381_hash_to_g2< hash_function: u32, msg_ptr: u32, dst_ptr: u32, + out_ptr: u32, ) -> VmResult { - let (data, mut store) = env.data_and_store_mut(); + let (data, store) = env.data_and_store_mut(); let memory = data.memory(&store); let msg = read_region(&memory, msg_ptr, BLS12_381_MAX_MESSAGE_SIZE)?; @@ -418,7 +430,9 @@ pub fn do_bls12_381_hash_to_g2< }; let point = bls12_381_hash_to_g2(hash_function, &msg, &dst); - Ok(to_low_half(write_to_contract(data, &mut store, &point)?)) + write_region(&memory, out_ptr, &point)?; + + Ok(0) } pub fn do_bls12_381_pairing_equality< diff --git a/packages/vm/src/instance.rs b/packages/vm/src/instance.rs index 84ff7c11ca..498fcc9b4c 100644 --- a/packages/vm/src/instance.rs +++ b/packages/vm/src/instance.rs @@ -145,16 +145,16 @@ where ); // Reads a list of points on of the subgroup G1 on the BLS12-381 curve and aggregates them down to a single element. - // Returns a u64 as a result, the top half represents the error code. 0 signifies success, anything else may be converted into a `CryptoError`. - // The lower half is a pointer to a new memory region containing the new point. + // The "out_ptr" parameter has to be a pointer to a region with the sufficient size to fit an element of G1 (48 bytes). + // Returns a u32 as a result. 0 signifies success, anything else may be converted into a `CryptoError`. env_imports.insert( "bls12_381_aggregate_g1", Function::new_typed_with_env(&mut store, &fe, do_bls12_381_aggregate_g1), ); // Reads a list of points on of the subgroup G2 on the BLS12-381 curve and aggregates them down to a single element. - // Returns a u64 as a result, the top half represents the error code. 0 signifies success, anything else may be converted into a `CryptoError`. - // The lower half is a pointer to a new memory region containing the new point. + // The "out_ptr" parameter has to be a pointer to a region with the sufficient size to fit an element of G2 (96 bytes). + // Returns a u32 as a result. 0 signifies success, anything else may be converted into a `CryptoError`. env_imports.insert( "bls12_381_aggregate_g2", Function::new_typed_with_env(&mut store, &fe, do_bls12_381_aggregate_g2), @@ -171,8 +171,8 @@ where // Three parameters, "hash_function" and "msg" and "dst", are passed down which are both arbitrary octet strings. // The "hash_function" parameter is interpreted as a case of the "HashFunction" enum. - // Returns a u64 as a result, the top half represents the error code. 0 signifies success, anything else may be converted into a `CryptoError`. - // The lower half is a pointer to a new memory region containing the newly generated point. + // The "out_ptr" parameter has to be a pointer to a region with the sufficient size to fit an element of G1 (48 bytes). + // Returns a u32 as a result. 0 signifies success, anything else may be converted into a `CryptoError`. env_imports.insert( "bls12_381_hash_to_g1", Function::new_typed_with_env(&mut store, &fe, do_bls12_381_hash_to_g1), @@ -180,8 +180,8 @@ where // Three parameters, "hash_function" and "msg" and "dst", are passed down which are both arbitrary octet strings. // The "hash_function" parameter is interpreted as a case of the "HashFunction" enum. - // Returns a u64 as a result, the top half represents the error code. 0 signifies success, anything else may be converted into a `CryptoError`. - // The lower half is a pointer to a new memory region containing the newly generated point. + // The "out_ptr" parameter has to be a pointer to a region with the sufficient size to fit an element of G2 (96 bytes). + // Returns a u32 as a result. 0 signifies success, anything else may be converted into a `CryptoError`. env_imports.insert( "bls12_381_hash_to_g2", Function::new_typed_with_env(&mut store, &fe, do_bls12_381_hash_to_g2), From 9c86f93700f75a1110b03b4374f4f308afdc8ff4 Mon Sep 17 00:00:00 2001 From: Aumetra Weisman Date: Mon, 15 Apr 2024 16:23:29 +0200 Subject: [PATCH 22/79] Fix imports errors --- packages/std/src/imports.rs | 48 +++++++++++++++++++++---------------- 1 file changed, 27 insertions(+), 21 deletions(-) diff --git a/packages/std/src/imports.rs b/packages/std/src/imports.rs index 33700ecaa0..e53a781f91 100644 --- a/packages/std/src/imports.rs +++ b/packages/std/src/imports.rs @@ -9,14 +9,14 @@ use crate::sections::decode_sections2; use crate::sections::encode_sections; use crate::serde::from_json; use crate::traits::{Api, Querier, QuerierResult, Storage}; +#[cfg(feature = "cosmwasm_2_1")] +use crate::HashFunction; #[cfg(feature = "iterator")] use crate::{ iterator::{Order, Record}, memory::get_optional_region_address, }; -use crate::{ - HashFunction, RecoverPubkeyError, StdError, StdResult, SystemError, VerificationError, -}; +use crate::{RecoverPubkeyError, StdError, StdResult, SystemError, VerificationError}; /// An upper bound for typical canonical address lengths (e.g. 20 in Cosmos SDK/Ethereum or 32 in Nano/Substrate) const CANONICAL_ADDRESS_BUFFER_LENGTH: usize = 64; @@ -49,10 +49,10 @@ extern "C" { fn addr_humanize(source_ptr: u32, destination_ptr: u32) -> u32; #[cfg(feature = "cosmwasm_2_1")] - fn bls12_381_aggregate_g1(g1s_ptr: u32) -> u64; + fn bls12_381_aggregate_g1(g1s_ptr: u32, out_ptr: u32) -> u32; #[cfg(feature = "cosmwasm_2_1")] - fn bls12_381_aggregate_g2(g2s_ptr: u32) -> u64; + fn bls12_381_aggregate_g2(g2s_ptr: u32, out_ptr: u32) -> u32; #[cfg(feature = "cosmwasm_2_1")] fn bls12_381_aggregate_pairing_equality( @@ -63,10 +63,10 @@ extern "C" { ) -> u32; #[cfg(feature = "cosmwasm_2_1")] - fn bls12_381_hash_to_g1(hash_function: u32, msg_ptr: u32, dst_ptr: u32) -> u64; + fn bls12_381_hash_to_g1(hash_function: u32, msg_ptr: u32, dst_ptr: u32, out_ptr: u32) -> u32; #[cfg(feature = "cosmwasm_2_1")] - fn bls12_381_hash_to_g2(hash_function: u32, msg_ptr: u32, dst_ptr: u32) -> u64; + fn bls12_381_hash_to_g2(hash_function: u32, msg_ptr: u32, dst_ptr: u32, out_ptr: u32) -> u32; #[cfg(feature = "cosmwasm_2_1")] fn bls12_381_pairing_equality(p_ptr: u32, q_ptr: u32, r_ptr: u32, s_ptr: u32) -> u32; @@ -400,14 +400,15 @@ impl Api for ExternalApi { Ok(Addr::unchecked(address)) } + #[cfg(feature = "cosmwasm_2_1")] fn bls12_381_aggregate_g1(&self, g1s: &[u8]) -> Result<[u8; 48], VerificationError> { - let mut point = [0; 48]; + let mut point = [0_u8; 48]; let send = build_region(g1s); let send_ptr = &*send as *const Region as u32; - let out = build_region(&point); - let out_ptr = &*send as *const Region as u32; + let out = build_region(&point[..]); + let out_ptr = &*out as *const Region as u32; let result = unsafe { bls12_381_aggregate_g1(send_ptr, out_ptr) }; match result { 0 => Ok(point), @@ -416,14 +417,15 @@ impl Api for ExternalApi { } } + #[cfg(feature = "cosmwasm_2_1")] fn bls12_381_aggregate_g2(&self, g2s: &[u8]) -> Result<[u8; 96], VerificationError> { - let mut point = [0; 96]; + let mut point = [0_u8; 96]; let send = build_region(g2s); let send_ptr = &*send as *const Region as u32; - let out = build_region(&point); - let out_ptr = &*send as *const Region as u32; + let out = build_region(&point[..]); + let out_ptr = &*out as *const Region as u32; let result = unsafe { bls12_381_aggregate_g1(send_ptr, out_ptr) }; match result { 0 => Ok(point), @@ -432,6 +434,7 @@ impl Api for ExternalApi { } } + #[cfg(feature = "cosmwasm_2_1")] fn bls12_381_aggregate_pairing_equality( &self, ps: &[u8], @@ -460,13 +463,14 @@ impl Api for ExternalApi { } } + #[cfg(feature = "cosmwasm_2_1")] fn bls12_381_hash_to_g1( &self, hash_function: HashFunction, msg: &[u8], dst: &[u8], ) -> Result<[u8; 48], VerificationError> { - let mut point = [0; 48]; + let mut point = [0_u8; 48]; let send_msg = build_region(msg); let send_msg_ptr = &*send_msg as *const Region as u32; @@ -474,26 +478,27 @@ impl Api for ExternalApi { let send_dst = build_region(dst); let send_dst_ptr = &*send_dst as *const Region as u32; - let out = build_region(&point); - let out_ptr = &*send as *const Region as u32; + let out = build_region(&point[..]); + let out_ptr = &*out as *const Region as u32; let result = unsafe { bls12_381_hash_to_g1(hash_function.to_u32(), send_msg_ptr, send_dst_ptr, out_ptr) }; match result { 0 => Ok(point), - 9 => Err(VerificationError::InvalidHashFunction), + 9 => Err(VerificationError::UnknownHashFunction), error_code => Err(VerificationError::unknown_err(error_code)), } } + #[cfg(feature = "cosmwasm_2_1")] fn bls12_381_hash_to_g2( &self, hash_function: HashFunction, msg: &[u8], dst: &[u8], ) -> Result<[u8; 96], VerificationError> { - let mut point = [0; 96]; + let mut point = [0_u8; 96]; let send_msg = build_region(msg); let send_msg_ptr = &*send_msg as *const Region as u32; @@ -501,19 +506,20 @@ impl Api for ExternalApi { let send_dst = build_region(dst); let send_dst_ptr = &*send_dst as *const Region as u32; - let out = build_region(&point); - let out_ptr = &*send as *const Region as u32; + let out = build_region(&point[..]); + let out_ptr = &*out as *const Region as u32; let result = unsafe { bls12_381_hash_to_g2(hash_function.to_u32(), send_msg_ptr, send_dst_ptr, out_ptr) }; match result { 0 => Ok(point), - 9 => Err(VerificationError::InvalidHashFunction), + 9 => Err(VerificationError::UnknownHashFunction), error_code => Err(VerificationError::unknown_err(error_code)), } } + #[cfg(feature = "cosmwasm_2_1")] fn bls12_381_pairing_equality( &self, p: &[u8], From 7ec4d306e8955d6514c60e90a3cc9c74ef42261a Mon Sep 17 00:00:00 2001 From: Aumetra Weisman Date: Mon, 15 Apr 2024 17:00:48 +0200 Subject: [PATCH 23/79] Add supported imports --- packages/vm/src/compatibility.rs | 6 ++++++ packages/vm/src/imports.rs | 4 ++-- 2 files changed, 8 insertions(+), 2 deletions(-) diff --git a/packages/vm/src/compatibility.rs b/packages/vm/src/compatibility.rs index 7a0ecb4ebc..e5ec27ae18 100644 --- a/packages/vm/src/compatibility.rs +++ b/packages/vm/src/compatibility.rs @@ -20,6 +20,12 @@ const SUPPORTED_IMPORTS: &[&str] = &[ "env.addr_validate", "env.addr_canonicalize", "env.addr_humanize", + "env.bls12_381_aggregate_g1", + "env.bls12_381_aggregate_g2", + "env.bls12_381_aggregate_pairing_equality", + "env.bls12_381_hash_to_g1", + "env.bls12_381_hash_to_g2", + "env.bls12_381_pairing_equality", "env.secp256k1_verify", "env.secp256k1_recover_pubkey", "env.secp256r1_verify", diff --git a/packages/vm/src/imports.rs b/packages/vm/src/imports.rs index e19c85504b..db1ae80102 100644 --- a/packages/vm/src/imports.rs +++ b/packages/vm/src/imports.rs @@ -415,7 +415,7 @@ pub fn do_bls12_381_hash_to_g2< msg_ptr: u32, dst_ptr: u32, out_ptr: u32, -) -> VmResult { +) -> VmResult { let (data, store) = env.data_and_store_mut(); let memory = data.memory(&store); @@ -426,7 +426,7 @@ pub fn do_bls12_381_hash_to_g2< let hash_function = match HashFunction::from_u32(hash_function) { Ok(func) => func, - Err(error) => return Ok(to_high_half(error.code())), + Err(error) => return Ok(error.code()), }; let point = bls12_381_hash_to_g2(hash_function, &msg, &dst); From 2e3fc32fcf7c5550a2db473fde72acd498e7680e Mon Sep 17 00:00:00 2001 From: Aumetra Weisman Date: Mon, 15 Apr 2024 17:13:05 +0200 Subject: [PATCH 24/79] Vendor own version of `HashFunction` --- packages/crypto/src/bls12_318/hash.rs | 6 ------ packages/std/Cargo.toml | 3 +-- packages/std/src/lib.rs | 4 +--- packages/std/src/testing/mock.rs | 4 ++-- packages/std/src/traits.rs | 25 ++++++++++++++++++++++++- 5 files changed, 28 insertions(+), 14 deletions(-) diff --git a/packages/crypto/src/bls12_318/hash.rs b/packages/crypto/src/bls12_318/hash.rs index bd09dc30b1..2f6518d73b 100644 --- a/packages/crypto/src/bls12_318/hash.rs +++ b/packages/crypto/src/bls12_318/hash.rs @@ -22,12 +22,6 @@ impl HashFunction { Ok(hash) } - - pub fn to_u32(self) -> u32 { - match self { - Self::Sha256 => 0, - } - } } pub fn bls12_381_hash_to_g1(hash: HashFunction, msg: &[u8], dst: &[u8]) -> [u8; 48] { diff --git a/packages/std/Cargo.toml b/packages/std/Cargo.toml index fdc056147b..3ade83c0a4 100644 --- a/packages/std/Cargo.toml +++ b/packages/std/Cargo.toml @@ -59,7 +59,6 @@ cosmwasm_2_1 = ["cosmwasm_2_0"] base64 = "0.22.0" cosmwasm-derive = { version = "2.0.1", path = "../derive" } cosmwasm-core = { path = "../core", version = "2.0.1", features = ["std"] } -cosmwasm-crypto = { path = "../crypto", version = "2.0.1", features = ["std"] } derive_more = { version = "1.0.0-beta.6", default-features = false, features = ["debug"] } hex = "0.4" schemars = { workspace = true } @@ -70,7 +69,7 @@ thiserror = "1.0.26" [target.'cfg(not(target_arch = "wasm32"))'.dependencies] bech32 = "0.11.0" -cosmwasm-crypto = { version = "2.0.1", path = "../crypto" } +cosmwasm-crypto = { version = "2.0.1", path = "../crypto", features = ["std"] } rand_core = { version = "0.6.4", features = ["getrandom"] } [dev-dependencies] diff --git a/packages/std/src/lib.rs b/packages/std/src/lib.rs index a7b8781b5e..b78520d205 100644 --- a/packages/std/src/lib.rs +++ b/packages/std/src/lib.rs @@ -77,7 +77,7 @@ pub use crate::serde::{ }; pub use crate::stdack::StdAck; pub use crate::storage::MemoryStorage; -pub use crate::traits::{Api, Querier, QuerierResult, QuerierWrapper, Storage}; +pub use crate::traits::{Api, HashFunction, Querier, QuerierResult, QuerierWrapper, Storage}; pub use crate::types::{BlockInfo, ContractInfo, Env, MessageInfo, TransactionInfo}; // Exposed in wasm build only @@ -122,6 +122,4 @@ pub use cosmwasm_core::{ #[cfg(not(target_arch = "wasm32"))] pub use cosmwasm_core::assert_approx_eq; -pub use cosmwasm_crypto::HashFunction; - pub use cosmwasm_derive::entry_point; diff --git a/packages/std/src/testing/mock.rs b/packages/std/src/testing/mock.rs index 774228e7bd..298067fa67 100644 --- a/packages/std/src/testing/mock.rs +++ b/packages/std/src/testing/mock.rs @@ -177,7 +177,7 @@ impl Api for MockApi { dst: &[u8], ) -> Result<[u8; 48], VerificationError> { Ok(cosmwasm_crypto::bls12_381_hash_to_g1( - hash_function, + hash_function.into(), msg, dst, )) @@ -190,7 +190,7 @@ impl Api for MockApi { dst: &[u8], ) -> Result<[u8; 96], VerificationError> { Ok(cosmwasm_crypto::bls12_381_hash_to_g2( - hash_function, + hash_function.into(), msg, dst, )) diff --git a/packages/std/src/traits.rs b/packages/std/src/traits.rs index 0c8c4191ed..0e884f26d1 100644 --- a/packages/std/src/traits.rs +++ b/packages/std/src/traits.rs @@ -26,12 +26,35 @@ use crate::query::{ }; use crate::results::{ContractResult, Empty, SystemResult}; use crate::ContractInfoResponse; -use crate::HashFunction; use crate::{from_json, to_json_binary, to_json_vec, Binary}; #[cfg(feature = "cosmwasm_1_3")] use crate::{DenomMetadata, PageRequest}; use crate::{RecoverPubkeyError, StdError, StdResult, VerificationError}; +#[derive(Clone, Copy, Debug)] +#[non_exhaustive] +pub enum HashFunction { + Sha256, +} + +#[doc(hidden)] +impl HashFunction { + pub fn to_u32(self) -> u32 { + match self { + Self::Sha256 => 0, + } + } +} + +#[cfg(not(target_arch = "wasm32"))] +impl From for cosmwasm_crypto::HashFunction { + fn from(value: HashFunction) -> Self { + match value { + HashFunction::Sha256 => cosmwasm_crypto::HashFunction::Sha256, + } + } +} + /// Storage provides read and write access to a persistent storage. /// If you only want to provide read access, provide `&Storage` pub trait Storage { From d57682e44b7fa8ac4654b2a3a73bef6232f62679 Mon Sep 17 00:00:00 2001 From: Aumetra Weisman Date: Mon, 15 Apr 2024 17:18:21 +0200 Subject: [PATCH 25/79] Use primitive casts --- packages/std/src/imports.rs | 4 ++-- packages/std/src/traits.rs | 11 +---------- 2 files changed, 3 insertions(+), 12 deletions(-) diff --git a/packages/std/src/imports.rs b/packages/std/src/imports.rs index e53a781f91..d34f51ee9a 100644 --- a/packages/std/src/imports.rs +++ b/packages/std/src/imports.rs @@ -481,7 +481,7 @@ impl Api for ExternalApi { let out = build_region(&point[..]); let out_ptr = &*out as *const Region as u32; let result = unsafe { - bls12_381_hash_to_g1(hash_function.to_u32(), send_msg_ptr, send_dst_ptr, out_ptr) + bls12_381_hash_to_g1(hash_function as u32, send_msg_ptr, send_dst_ptr, out_ptr) }; match result { @@ -509,7 +509,7 @@ impl Api for ExternalApi { let out = build_region(&point[..]); let out_ptr = &*out as *const Region as u32; let result = unsafe { - bls12_381_hash_to_g2(hash_function.to_u32(), send_msg_ptr, send_dst_ptr, out_ptr) + bls12_381_hash_to_g2(hash_function as u32, send_msg_ptr, send_dst_ptr, out_ptr) }; match result { diff --git a/packages/std/src/traits.rs b/packages/std/src/traits.rs index 0e884f26d1..64ce562c41 100644 --- a/packages/std/src/traits.rs +++ b/packages/std/src/traits.rs @@ -34,16 +34,7 @@ use crate::{RecoverPubkeyError, StdError, StdResult, VerificationError}; #[derive(Clone, Copy, Debug)] #[non_exhaustive] pub enum HashFunction { - Sha256, -} - -#[doc(hidden)] -impl HashFunction { - pub fn to_u32(self) -> u32 { - match self { - Self::Sha256 => 0, - } - } + Sha256 = 0, } #[cfg(not(target_arch = "wasm32"))] From a948c895981d4ebe928d69bf3248d7e1d3035ecf Mon Sep 17 00:00:00 2001 From: Aumetra Weisman Date: Tue, 16 Apr 2024 10:52:39 +0200 Subject: [PATCH 26/79] Implement more fine-grained errors for aggregation pairing equality --- packages/core/src/errors/mod.rs | 2 +- .../core/src/errors/recover_pubkey_error.rs | 3 +- .../core/src/errors/verification_error.rs | 36 ++++++++++++ packages/core/src/lib.rs | 9 +-- packages/crypto/src/bls12_318/constants.rs | 6 +- packages/crypto/src/bls12_318/hash.rs | 14 ++++- packages/crypto/src/bls12_318/pairing.rs | 26 ++++++++- packages/crypto/src/bls12_318/points.rs | 38 ++++++------- packages/crypto/src/errors.rs | 57 ++++++++++++++----- packages/crypto/src/lib.rs | 4 +- packages/std/src/imports.rs | 14 ++++- packages/std/src/lib.rs | 16 +++--- packages/vm/src/imports.rs | 31 ++++++---- 13 files changed, 188 insertions(+), 68 deletions(-) diff --git a/packages/core/src/errors/mod.rs b/packages/core/src/errors/mod.rs index 60533e027d..b6787f0dd4 100644 --- a/packages/core/src/errors/mod.rs +++ b/packages/core/src/errors/mod.rs @@ -13,4 +13,4 @@ pub use core_error::{ }; pub use recover_pubkey_error::RecoverPubkeyError; pub use system_error::SystemError; -pub use verification_error::VerificationError; +pub use verification_error::{AggregationPairingEqualityError, VerificationError}; diff --git a/packages/core/src/errors/recover_pubkey_error.rs b/packages/core/src/errors/recover_pubkey_error.rs index 00edb1732b..b63dc89a39 100644 --- a/packages/core/src/errors/recover_pubkey_error.rs +++ b/packages/core/src/errors/recover_pubkey_error.rs @@ -65,7 +65,8 @@ impl From for RecoverPubkeyError { } CryptoError::GenericErr { .. } => RecoverPubkeyError::unknown_err(original.code()), CryptoError::InvalidRecoveryParam { .. } => RecoverPubkeyError::InvalidRecoveryParam, - CryptoError::BatchErr { .. } + CryptoError::AggregationPairingEquality { .. } + | CryptoError::BatchErr { .. } | CryptoError::InvalidPubkeyFormat { .. } | CryptoError::InvalidPoint { .. } | CryptoError::UnknownHashFunction { .. } => panic!("Conversion not supported"), diff --git a/packages/core/src/errors/verification_error.rs b/packages/core/src/errors/verification_error.rs index 49a9abb9da..eacddceb96 100644 --- a/packages/core/src/errors/verification_error.rs +++ b/packages/core/src/errors/verification_error.rs @@ -6,9 +6,24 @@ use super::BT; #[cfg(not(target_arch = "wasm32"))] use cosmwasm_crypto::CryptoError; +#[derive(Display, Debug, PartialEq)] +#[cfg_attr(feature = "std", derive(thiserror::Error))] +pub enum AggregationPairingEqualityError { + #[display("List is not a multiple of 48")] + NotMultipleG1, + #[display("List is not a multiple of 96")] + NotMultipleG2, + #[display("Not the same amount of points passed")] + UnequalPointAmount, +} + #[derive(Display, Debug)] #[cfg_attr(feature = "std", derive(thiserror::Error))] pub enum VerificationError { + #[display("Aggregation pairing equality error: {source}")] + AggregationPairingEquality { + source: AggregationPairingEqualityError, + }, #[display("Batch error")] BatchErr, #[display("Generic error")] @@ -42,6 +57,9 @@ impl VerificationError { impl PartialEq for VerificationError { fn eq(&self, rhs: &VerificationError) -> bool { match self { + VerificationError::AggregationPairingEquality { source: lhs_source } => { + matches!(rhs, VerificationError::AggregationPairingEquality { source: rhs_source } if rhs_source == lhs_source) + } VerificationError::BatchErr => matches!(rhs, VerificationError::BatchErr), VerificationError::GenericErr => matches!(rhs, VerificationError::GenericErr), VerificationError::InvalidHashFormat => { @@ -79,6 +97,24 @@ impl PartialEq for VerificationError { impl From for VerificationError { fn from(original: CryptoError) -> Self { match original { + CryptoError::AggregationPairingEquality { + source: cosmwasm_crypto::AggregationPairingEqualityError::NotMultipleG1 { .. }, + .. + } => VerificationError::AggregationPairingEquality { + source: AggregationPairingEqualityError::NotMultipleG1, + }, + CryptoError::AggregationPairingEquality { + source: cosmwasm_crypto::AggregationPairingEqualityError::NotMultipleG2 { .. }, + .. + } => VerificationError::AggregationPairingEquality { + source: AggregationPairingEqualityError::NotMultipleG2, + }, + CryptoError::AggregationPairingEquality { + source: cosmwasm_crypto::AggregationPairingEqualityError::UnequalPointAmount { .. }, + .. + } => VerificationError::AggregationPairingEquality { + source: AggregationPairingEqualityError::UnequalPointAmount, + }, CryptoError::InvalidHashFormat { .. } => VerificationError::InvalidHashFormat, CryptoError::InvalidPubkeyFormat { .. } => VerificationError::InvalidPubkeyFormat, CryptoError::InvalidSignatureFormat { .. } => VerificationError::InvalidSignatureFormat, diff --git a/packages/core/src/lib.rs b/packages/core/src/lib.rs index d538a87799..b9cd390ba7 100644 --- a/packages/core/src/lib.rs +++ b/packages/core/src/lib.rs @@ -28,10 +28,11 @@ pub use crate::addresses::{instantiate2_address, Addr, CanonicalAddr, Instantiat pub use crate::binary::Binary; pub use crate::encoding::{from_base64, from_hex, to_base64, to_hex}; pub use crate::errors::{ - CheckedFromRatioError, CheckedMultiplyFractionError, CheckedMultiplyRatioError, - CoinFromStrError, CoinsError, ConversionOverflowError, CoreError, CoreResult, - DivideByZeroError, DivisionError, OverflowError, OverflowOperation, RecoverPubkeyError, - RoundDownOverflowError, RoundUpOverflowError, SystemError, VerificationError, + AggregationPairingEqualityError, CheckedFromRatioError, CheckedMultiplyFractionError, + CheckedMultiplyRatioError, CoinFromStrError, CoinsError, ConversionOverflowError, CoreError, + CoreResult, DivideByZeroError, DivisionError, OverflowError, OverflowOperation, + RecoverPubkeyError, RoundDownOverflowError, RoundUpOverflowError, SystemError, + VerificationError, }; pub use crate::hex_binary::HexBinary; pub use crate::math::{ diff --git a/packages/crypto/src/bls12_318/constants.rs b/packages/crypto/src/bls12_318/constants.rs index a39d050fe3..1cf3e759ec 100644 --- a/packages/crypto/src/bls12_318/constants.rs +++ b/packages/crypto/src/bls12_318/constants.rs @@ -1,9 +1,11 @@ use bls12_381::{G1Affine, G2Affine}; -pub fn bls12_381_g1_generator() -> [u8; 48] { +use crate::{BLS12_381_G1_POINT_LEN, BLS12_381_G2_POINT_LEN}; + +pub fn bls12_381_g1_generator() -> [u8; BLS12_381_G1_POINT_LEN] { G1Affine::generator().to_compressed() } -pub fn bls12_381_g2_generator() -> [u8; 96] { +pub fn bls12_381_g2_generator() -> [u8; BLS12_381_G2_POINT_LEN] { G2Affine::generator().to_compressed() } diff --git a/packages/crypto/src/bls12_318/hash.rs b/packages/crypto/src/bls12_318/hash.rs index 2f6518d73b..ca13b8bdc2 100644 --- a/packages/crypto/src/bls12_318/hash.rs +++ b/packages/crypto/src/bls12_318/hash.rs @@ -4,7 +4,7 @@ use bls12_381::{ }; use sha2_v9::Sha256; -use crate::CryptoError; +use crate::{CryptoError, BLS12_381_G1_POINT_LEN, BLS12_381_G2_POINT_LEN}; #[derive(Clone, Copy, Debug)] #[non_exhaustive] @@ -24,7 +24,11 @@ impl HashFunction { } } -pub fn bls12_381_hash_to_g1(hash: HashFunction, msg: &[u8], dst: &[u8]) -> [u8; 48] { +pub fn bls12_381_hash_to_g1( + hash: HashFunction, + msg: &[u8], + dst: &[u8], +) -> [u8; BLS12_381_G1_POINT_LEN] { let g1 = match hash { HashFunction::Sha256 => { >>::hash_to_curve(msg, dst) @@ -34,7 +38,11 @@ pub fn bls12_381_hash_to_g1(hash: HashFunction, msg: &[u8], dst: &[u8]) -> [u8; G1Affine::from(g1).to_compressed() } -pub fn bls12_381_hash_to_g2(hash: HashFunction, msg: &[u8], dst: &[u8]) -> [u8; 96] { +pub fn bls12_381_hash_to_g2( + hash: HashFunction, + msg: &[u8], + dst: &[u8], +) -> [u8; BLS12_381_G2_POINT_LEN] { let g2 = match hash { HashFunction::Sha256 => { >>::hash_to_curve(msg, dst) diff --git a/packages/crypto/src/bls12_318/pairing.rs b/packages/crypto/src/bls12_318/pairing.rs index 1727a83bc8..df74f97669 100644 --- a/packages/crypto/src/bls12_318/pairing.rs +++ b/packages/crypto/src/bls12_318/pairing.rs @@ -1,4 +1,6 @@ -use crate::CryptoError; +use crate::{ + errors::AggregationPairingEquality, CryptoError, BLS12_381_G1_POINT_LEN, BLS12_381_G2_POINT_LEN, +}; use super::points::{g1_from_variable, g2_from_variable}; use bls12_381::G2Prepared; @@ -11,9 +13,27 @@ pub fn bls12_381_aggregate_pairing_equality( r: &[u8], s: &[u8], ) -> Result { + if ps.len() % BLS12_381_G1_POINT_LEN != 0 { + return Err(AggregationPairingEquality::NotMultipleG1 { + remainder: ps.len() % BLS12_381_G1_POINT_LEN, + } + .into()); + } else if qs.len() % BLS12_381_G2_POINT_LEN != 0 { + return Err(AggregationPairingEquality::NotMultipleG2 { + remainder: qs.len() % BLS12_381_G2_POINT_LEN, + } + .into()); + } else if ps.len() % BLS12_381_G1_POINT_LEN != qs.len() % BLS12_381_G2_POINT_LEN { + return Err(AggregationPairingEquality::UnequalPointAmount { + left: ps.len() % BLS12_381_G1_POINT_LEN, + right: qs.len() % BLS12_381_G2_POINT_LEN, + } + .into()); + } + let pq_pairs: Vec<_> = ps - .chunks_exact(48) - .zip(qs.chunks_exact(96)) + .chunks_exact(BLS12_381_G1_POINT_LEN) + .zip(qs.chunks_exact(BLS12_381_G2_POINT_LEN)) // From here on parallelism is fine since the miller loop runs over // a sum of the pairings and is therefore a commutative operation .par_bridge() diff --git a/packages/crypto/src/bls12_318/points.rs b/packages/crypto/src/bls12_318/points.rs index 5531db2c8c..3036ca1ea4 100644 --- a/packages/crypto/src/bls12_318/points.rs +++ b/packages/crypto/src/bls12_318/points.rs @@ -13,7 +13,7 @@ use pairing::group::Group; use sha2_v9::Sha256; use crate::errors::InvalidPoint; -use crate::CryptoError; +use crate::{CryptoError, BLS12_381_G1_POINT_LEN, BLS12_381_G2_POINT_LEN}; /// Point on G1 #[derive(Debug, PartialEq, Clone)] @@ -39,17 +39,17 @@ impl G1 { } #[inline] - pub fn from_uncompressed(data: &[u8; 96]) -> Option { + pub fn from_uncompressed(data: &[u8; { BLS12_381_G1_POINT_LEN * 2 }]) -> Option { G1Affine::from_uncompressed(data).map(Self).into() } #[inline] - pub fn to_uncompressed(&self) -> [u8; 96] { + pub fn to_uncompressed(&self) -> [u8; { BLS12_381_G1_POINT_LEN * 2 }] { self.0.to_uncompressed() } #[inline] - pub fn to_compressed(&self) -> [u8; 48] { + pub fn to_compressed(&self) -> [u8; BLS12_381_G1_POINT_LEN] { self.0.to_compressed() } } @@ -137,17 +137,17 @@ impl G2 { } #[inline] - pub fn from_uncompressed(data: &[u8; 192]) -> Option { + pub fn from_uncompressed(data: &[u8; { BLS12_381_G2_POINT_LEN * 2 }]) -> Option { G2Affine::from_uncompressed(data).map(Self).into() } #[inline] - pub fn to_uncompressed(&self) -> [u8; 192] { + pub fn to_uncompressed(&self) -> [u8; { BLS12_381_G2_POINT_LEN * 2 }] { self.0.to_uncompressed() } #[inline] - pub fn to_compressed(&self) -> [u8; 96] { + pub fn to_compressed(&self) -> [u8; BLS12_381_G2_POINT_LEN] { self.0.to_compressed() } } @@ -177,15 +177,15 @@ impl<'a> core::iter::Sum<&'a G2> for G2 { } pub fn g1_from_variable(data: &[u8]) -> Result { - if data.len() != 48 { + if data.len() != BLS12_381_G1_POINT_LEN { return Err(InvalidPoint::InvalidLength { - expected: 48, + expected: BLS12_381_G1_POINT_LEN, actual: data.len(), } .into()); } - let mut buf = [0u8; 48]; + let mut buf = [0u8; BLS12_381_G1_POINT_LEN]; buf[..].clone_from_slice(data); g1_from_fixed(&buf) } @@ -201,20 +201,20 @@ pub fn g1s_from_variable(data_list: &[&[u8]]) -> Vec> { } pub fn g2_from_variable(data: &[u8]) -> Result { - if data.len() != 96 { + if data.len() != BLS12_381_G2_POINT_LEN { return Err(InvalidPoint::InvalidLength { - expected: 96, + expected: BLS12_381_G2_POINT_LEN, actual: data.len(), } .into()); } - let mut buf = [0u8; 96]; + let mut buf = [0u8; BLS12_381_G2_POINT_LEN]; buf[..].clone_from_slice(data); g2_from_fixed(&buf) } -pub fn g1_from_fixed(data: &[u8; 48]) -> Result { +pub fn g1_from_fixed(data: &[u8; BLS12_381_G1_POINT_LEN]) -> Result { Option::from(G1Affine::from_compressed(data)) .map(G1) .ok_or_else(|| InvalidPoint::DecodingError {}.into()) @@ -222,13 +222,13 @@ pub fn g1_from_fixed(data: &[u8; 48]) -> Result { /// Like [`g1_from_fixed`] without guaranteeing that the encoding represents a valid element. /// Only use this when you know for sure the encoding is correct. -pub fn g1_from_fixed_unchecked(data: [u8; 48]) -> Result { +pub fn g1_from_fixed_unchecked(data: [u8; BLS12_381_G1_POINT_LEN]) -> Result { Option::from(G1Affine::from_compressed_unchecked(&data)) .map(G1) .ok_or_else(|| InvalidPoint::DecodingError {}.into()) } -pub fn g2_from_fixed(data: &[u8; 96]) -> Result { +pub fn g2_from_fixed(data: &[u8; BLS12_381_G2_POINT_LEN]) -> Result { Option::from(G2Affine::from_compressed(data)) .map(G2) .ok_or_else(|| InvalidPoint::DecodingError {}.into()) @@ -236,17 +236,17 @@ pub fn g2_from_fixed(data: &[u8; 96]) -> Result { /// Like [`g2_from_fixed`] without guaranteeing that the encoding represents a valid element. /// Only use this when you know for sure the encoding is correct. -pub fn g2_from_fixed_unchecked(data: [u8; 96]) -> Result { +pub fn g2_from_fixed_unchecked(data: [u8; BLS12_381_G2_POINT_LEN]) -> Result { Option::from(G2Affine::from_compressed_unchecked(&data)) .map(G2) .ok_or_else(|| InvalidPoint::DecodingError {}.into()) } -pub fn bls12_381_g1_is_identity(g1: &[u8; 48]) -> Result { +pub fn bls12_381_g1_is_identity(g1: &[u8; BLS12_381_G1_POINT_LEN]) -> Result { g1_from_fixed(g1).map(|point| point.is_identity()) } -pub fn bls12_381_g2_is_identity(g2: &[u8; 96]) -> Result { +pub fn bls12_381_g2_is_identity(g2: &[u8; BLS12_381_G2_POINT_LEN]) -> Result { g2_from_fixed(g2).map(|point| point.is_identity()) } diff --git a/packages/crypto/src/errors.rs b/packages/crypto/src/errors.rs index a202a7ddae..423911c0b8 100644 --- a/packages/crypto/src/errors.rs +++ b/packages/crypto/src/errors.rs @@ -1,34 +1,39 @@ use alloc::string::String; -use core::fmt::{self, Debug}; +use core::fmt::Debug; use derive_more::Display; use crate::BT; pub type CryptoResult = core::result::Result; -#[derive(Debug)] +#[derive(Debug, Display)] +#[cfg_attr(feature = "std", derive(thiserror::Error))] +pub enum AggregationPairingEquality { + #[display("List is not a multiple of 48. Remainder: {remainder}")] + NotMultipleG1 { remainder: usize }, + #[display("List is not a multiple of 96. Remainder: {remainder}")] + NotMultipleG2 { remainder: usize }, + #[display("Not the same amount of points passed. Left: {left}, Right: {right}")] + UnequalPointAmount { left: usize, right: usize }, +} + +#[derive(Debug, Display)] #[cfg_attr(feature = "std", derive(thiserror::Error))] pub enum InvalidPoint { + #[display("Invalid input length for point (must be in compressed format): Expected {expected}, actual: {actual}")] InvalidLength { expected: usize, actual: usize }, + #[display("Invalid point")] DecodingError {}, } -impl fmt::Display for InvalidPoint { - fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result { - match self { - InvalidPoint::InvalidLength { expected, actual } => { - write!(f, "Invalid input length for point (must be in compressed format): Expected {}, actual: {}", expected, actual) - } - InvalidPoint::DecodingError {} => { - write!(f, "Invalid point") - } - } - } -} - #[derive(Display, Debug)] #[cfg_attr(feature = "std", derive(thiserror::Error))] pub enum CryptoError { + #[display("Aggregation pairing equality error: {source}")] + AggregationPairingEquality { + source: AggregationPairingEquality, + backtrace: BT, + }, #[display("Batch verify error: {msg}")] BatchErr { msg: String, backtrace: BT }, #[display("Crypto error: {msg}")] @@ -104,6 +109,28 @@ impl CryptoError { CryptoError::InvalidPoint { .. } => 8, CryptoError::UnknownHashFunction { .. } => 9, CryptoError::GenericErr { .. } => 10, + CryptoError::AggregationPairingEquality { + source: AggregationPairingEquality::NotMultipleG1 { .. }, + .. + } => 11, + CryptoError::AggregationPairingEquality { + source: AggregationPairingEquality::NotMultipleG2 { .. }, + .. + } => 12, + CryptoError::AggregationPairingEquality { + source: AggregationPairingEquality::UnequalPointAmount { .. }, + .. + } => 13, + } + } +} + +impl From for CryptoError { + #[track_caller] + fn from(value: AggregationPairingEquality) -> Self { + Self::AggregationPairingEquality { + source: value, + backtrace: BT::capture(), } } } diff --git a/packages/crypto/src/lib.rs b/packages/crypto/src/lib.rs index a37cd4abe4..1d93e33c8e 100644 --- a/packages/crypto/src/lib.rs +++ b/packages/crypto/src/lib.rs @@ -35,7 +35,9 @@ pub use crate::ed25519::EDDSA_PUBKEY_LEN; #[doc(hidden)] pub use crate::ed25519::{ed25519_batch_verify, ed25519_verify}; #[doc(hidden)] -pub use crate::errors::{CryptoError, CryptoResult}; +pub use crate::errors::{ + AggregationPairingEquality as AggregationPairingEqualityError, CryptoError, CryptoResult, +}; #[doc(hidden)] pub use crate::secp256k1::{secp256k1_recover_pubkey, secp256k1_verify}; #[doc(hidden)] diff --git a/packages/std/src/imports.rs b/packages/std/src/imports.rs index d34f51ee9a..e46858df88 100644 --- a/packages/std/src/imports.rs +++ b/packages/std/src/imports.rs @@ -16,7 +16,10 @@ use crate::{ iterator::{Order, Record}, memory::get_optional_region_address, }; -use crate::{RecoverPubkeyError, StdError, StdResult, SystemError, VerificationError}; +use crate::{ + AggregationPairingEqualityError, RecoverPubkeyError, StdError, StdResult, SystemError, + VerificationError, +}; /// An upper bound for typical canonical address lengths (e.g. 20 in Cosmos SDK/Ethereum or 32 in Nano/Substrate) const CANONICAL_ADDRESS_BUFFER_LENGTH: usize = 64; @@ -459,6 +462,15 @@ impl Api for ExternalApi { 0 => Ok(true), 1 => Ok(false), 8 => Err(VerificationError::InvalidPoint), + 11 => Err(VerificationError::AggregationPairingEquality { + source: AggregationPairingEqualityError::NotMultipleG1, + }), + 12 => Err(VerificationError::AggregationPairingEquality { + source: AggregationPairingEqualityError::NotMultipleG2, + }), + 13 => Err(VerificationError::AggregationPairingEquality { + source: AggregationPairingEqualityError::UnequalPointAmount, + }), error_code => Err(VerificationError::unknown_err(error_code)), } } diff --git a/packages/std/src/lib.rs b/packages/std/src/lib.rs index b78520d205..e128a4a1ab 100644 --- a/packages/std/src/lib.rs +++ b/packages/std/src/lib.rs @@ -109,14 +109,14 @@ pub mod testing; pub use cosmwasm_core::CoreError as StdError; pub use cosmwasm_core::CoreResult as StdResult; pub use cosmwasm_core::{ - from_base64, from_hex, instantiate2_address, to_base64, to_hex, Addr, Binary, CanonicalAddr, - CheckedFromRatioError, CheckedMultiplyFractionError, CheckedMultiplyRatioError, - CoinFromStrError, CoinsError, ConversionOverflowError, Decimal, Decimal256, - Decimal256RangeExceeded, DecimalRangeExceeded, DivideByZeroError, DivisionError, Fraction, - HexBinary, Instantiate2AddressError, Int128, Int256, Int512, Int64, Isqrt, OverflowError, - OverflowOperation, RecoverPubkeyError, SignedDecimal, SignedDecimal256, - SignedDecimal256RangeExceeded, SignedDecimalRangeExceeded, SystemError, Timestamp, Uint128, - Uint256, Uint512, Uint64, VerificationError, + from_base64, from_hex, instantiate2_address, to_base64, to_hex, Addr, + AggregationPairingEqualityError, Binary, CanonicalAddr, CheckedFromRatioError, + CheckedMultiplyFractionError, CheckedMultiplyRatioError, CoinFromStrError, CoinsError, + ConversionOverflowError, Decimal, Decimal256, Decimal256RangeExceeded, DecimalRangeExceeded, + DivideByZeroError, DivisionError, Fraction, HexBinary, Instantiate2AddressError, Int128, + Int256, Int512, Int64, Isqrt, OverflowError, OverflowOperation, RecoverPubkeyError, + SignedDecimal, SignedDecimal256, SignedDecimal256RangeExceeded, SignedDecimalRangeExceeded, + SystemError, Timestamp, Uint128, Uint256, Uint512, Uint64, VerificationError, }; #[cfg(not(target_arch = "wasm32"))] diff --git a/packages/vm/src/imports.rs b/packages/vm/src/imports.rs index db1ae80102..3fe272711e 100644 --- a/packages/vm/src/imports.rs +++ b/packages/vm/src/imports.rs @@ -279,7 +279,8 @@ pub fn do_bls12_381_aggregate_g1< } Err(err) => match err { CryptoError::InvalidPoint { .. } => err.code(), - CryptoError::BatchErr { .. } + CryptoError::AggregationPairingEquality { .. } + | CryptoError::BatchErr { .. } | CryptoError::GenericErr { .. } | CryptoError::InvalidHashFormat { .. } | CryptoError::InvalidPubkeyFormat { .. } @@ -317,7 +318,8 @@ pub fn do_bls12_381_aggregate_g2< } Err(err) => match err { CryptoError::InvalidPoint { .. } => err.code(), - CryptoError::BatchErr { .. } + CryptoError::AggregationPairingEquality { .. } + | CryptoError::BatchErr { .. } | CryptoError::GenericErr { .. } | CryptoError::InvalidHashFormat { .. } | CryptoError::InvalidPubkeyFormat { .. } @@ -359,7 +361,9 @@ pub fn do_bls12_381_aggregate_pairing_equality< Ok(true) => BLS12_381_VALID_PAIRING, Ok(false) => BLS12_381_INVALID_PAIRING, Err(err) => match err { - CryptoError::InvalidPoint { .. } => err.code(), + CryptoError::AggregationPairingEquality { .. } | CryptoError::InvalidPoint { .. } => { + err.code() + } CryptoError::BatchErr { .. } | CryptoError::GenericErr { .. } | CryptoError::InvalidHashFormat { .. } @@ -462,7 +466,8 @@ pub fn do_bls12_381_pairing_equality< Ok(false) => BLS12_381_INVALID_PAIRING, Err(err) => match err { CryptoError::InvalidPoint { .. } => err.code(), - CryptoError::BatchErr { .. } + CryptoError::AggregationPairingEquality { .. } + | CryptoError::BatchErr { .. } | CryptoError::GenericErr { .. } | CryptoError::InvalidHashFormat { .. } | CryptoError::InvalidPubkeyFormat { .. } @@ -505,7 +510,8 @@ pub fn do_secp256k1_verify err.code(), - CryptoError::BatchErr { .. } + CryptoError::AggregationPairingEquality { .. } + | CryptoError::BatchErr { .. } | CryptoError::InvalidPoint { .. } | CryptoError::InvalidRecoveryParam { .. } | CryptoError::UnknownHashFunction { .. } => { @@ -548,7 +554,8 @@ pub fn do_secp256k1_recover_pubkey< | CryptoError::InvalidSignatureFormat { .. } | CryptoError::InvalidRecoveryParam { .. } | CryptoError::GenericErr { .. } => Ok(to_high_half(err.code())), - CryptoError::BatchErr { .. } + CryptoError::AggregationPairingEquality { .. } + | CryptoError::BatchErr { .. } | CryptoError::InvalidPoint { .. } | CryptoError::InvalidPubkeyFormat { .. } | CryptoError::UnknownHashFunction { .. } => { @@ -592,7 +599,8 @@ pub fn do_secp256r1_verify err.code(), - CryptoError::BatchErr { .. } + CryptoError::AggregationPairingEquality { .. } + | CryptoError::BatchErr { .. } | CryptoError::InvalidPoint { .. } | CryptoError::InvalidRecoveryParam { .. } | CryptoError::UnknownHashFunction { .. } => { @@ -635,7 +643,8 @@ pub fn do_secp256r1_recover_pubkey< | CryptoError::InvalidSignatureFormat { .. } | CryptoError::InvalidRecoveryParam { .. } | CryptoError::GenericErr { .. } => Ok(to_high_half(err.code())), - CryptoError::BatchErr { .. } + CryptoError::AggregationPairingEquality { .. } + | CryptoError::BatchErr { .. } | CryptoError::InvalidPoint { .. } | CryptoError::InvalidPubkeyFormat { .. } | CryptoError::UnknownHashFunction { .. } => { @@ -686,7 +695,8 @@ pub fn do_ed25519_verify err.code(), - CryptoError::BatchErr { .. } + CryptoError::AggregationPairingEquality { .. } + | CryptoError::BatchErr { .. } | CryptoError::InvalidPoint { .. } | CryptoError::InvalidHashFormat { .. } | CryptoError::InvalidRecoveryParam { .. } @@ -751,7 +761,8 @@ pub fn do_ed25519_batch_verify< | CryptoError::InvalidPubkeyFormat { .. } | CryptoError::InvalidSignatureFormat { .. } | CryptoError::GenericErr { .. } => err.code(), - CryptoError::InvalidHashFormat { .. } + CryptoError::AggregationPairingEquality { .. } + | CryptoError::InvalidHashFormat { .. } | CryptoError::InvalidPoint { .. } | CryptoError::InvalidRecoveryParam { .. } | CryptoError::UnknownHashFunction { .. } => { From eccdd4bae55ce2743dbd0f030708bebb349aeef3 Mon Sep 17 00:00:00 2001 From: Aumetra Weisman Date: Tue, 16 Apr 2024 11:06:53 +0200 Subject: [PATCH 27/79] Add cases for empty lists --- packages/core/src/errors/verification_error.rs | 16 ++++++++++++++++ packages/crypto/src/bls12_318/pairing.rs | 6 +++++- packages/crypto/src/errors.rs | 12 ++++++++++++ packages/std/src/imports.rs | 6 ++++++ 4 files changed, 39 insertions(+), 1 deletion(-) diff --git a/packages/core/src/errors/verification_error.rs b/packages/core/src/errors/verification_error.rs index eacddceb96..b7dc48e6d5 100644 --- a/packages/core/src/errors/verification_error.rs +++ b/packages/core/src/errors/verification_error.rs @@ -9,6 +9,10 @@ use cosmwasm_crypto::CryptoError; #[derive(Display, Debug, PartialEq)] #[cfg_attr(feature = "std", derive(thiserror::Error))] pub enum AggregationPairingEqualityError { + #[display("List of G1 points is empty")] + EmptyG1, + #[display("List of G2 points is empty")] + EmptyG2, #[display("List is not a multiple of 48")] NotMultipleG1, #[display("List is not a multiple of 96")] @@ -97,6 +101,18 @@ impl PartialEq for VerificationError { impl From for VerificationError { fn from(original: CryptoError) -> Self { match original { + CryptoError::AggregationPairingEquality { + source: cosmwasm_crypto::AggregationPairingEqualityError::EmptyG1, + .. + } => VerificationError::AggregationPairingEquality { + source: AggregationPairingEqualityError::EmptyG1, + }, + CryptoError::AggregationPairingEquality { + source: cosmwasm_crypto::AggregationPairingEqualityError::EmptyG2, + .. + } => VerificationError::AggregationPairingEquality { + source: AggregationPairingEqualityError::EmptyG2, + }, CryptoError::AggregationPairingEquality { source: cosmwasm_crypto::AggregationPairingEqualityError::NotMultipleG1 { .. }, .. diff --git a/packages/crypto/src/bls12_318/pairing.rs b/packages/crypto/src/bls12_318/pairing.rs index df74f97669..8b606bfa1a 100644 --- a/packages/crypto/src/bls12_318/pairing.rs +++ b/packages/crypto/src/bls12_318/pairing.rs @@ -13,7 +13,11 @@ pub fn bls12_381_aggregate_pairing_equality( r: &[u8], s: &[u8], ) -> Result { - if ps.len() % BLS12_381_G1_POINT_LEN != 0 { + if ps.is_empty() { + return Err(AggregationPairingEquality::EmptyG1.into()); + } else if qs.is_empty() { + return Err(AggregationPairingEquality::EmptyG2.into()); + } else if ps.len() % BLS12_381_G1_POINT_LEN != 0 { return Err(AggregationPairingEquality::NotMultipleG1 { remainder: ps.len() % BLS12_381_G1_POINT_LEN, } diff --git a/packages/crypto/src/errors.rs b/packages/crypto/src/errors.rs index 423911c0b8..8a6a38b790 100644 --- a/packages/crypto/src/errors.rs +++ b/packages/crypto/src/errors.rs @@ -9,6 +9,10 @@ pub type CryptoResult = core::result::Result; #[derive(Debug, Display)] #[cfg_attr(feature = "std", derive(thiserror::Error))] pub enum AggregationPairingEquality { + #[display("List of G1 points is empty")] + EmptyG1, + #[display("List of G2 points is empty")] + EmptyG2, #[display("List is not a multiple of 48. Remainder: {remainder}")] NotMultipleG1 { remainder: usize }, #[display("List is not a multiple of 96. Remainder: {remainder}")] @@ -121,6 +125,14 @@ impl CryptoError { source: AggregationPairingEquality::UnequalPointAmount { .. }, .. } => 13, + CryptoError::AggregationPairingEquality { + source: AggregationPairingEquality::EmptyG1 { .. }, + .. + } => 14, + CryptoError::AggregationPairingEquality { + source: AggregationPairingEquality::EmptyG2 { .. }, + .. + } => 15, } } } diff --git a/packages/std/src/imports.rs b/packages/std/src/imports.rs index e46858df88..a0df710374 100644 --- a/packages/std/src/imports.rs +++ b/packages/std/src/imports.rs @@ -471,6 +471,12 @@ impl Api for ExternalApi { 13 => Err(VerificationError::AggregationPairingEquality { source: AggregationPairingEqualityError::UnequalPointAmount, }), + 14 => Err(VerificationError::AggregationPairingEquality { + source: AggregationPairingEqualityError::EmptyG1, + }), + 15 => Err(VerificationError::AggregationPairingEquality { + source: AggregationPairingEqualityError::EmptyG2, + }), error_code => Err(VerificationError::unknown_err(error_code)), } } From 890158958de5abb7ce320d23ed43d9cbef2b2ee0 Mon Sep 17 00:00:00 2001 From: Aumetra Weisman Date: Tue, 16 Apr 2024 11:40:42 +0200 Subject: [PATCH 28/79] Bench hash-to-curve and meter gas usage --- packages/crypto/benches/main.rs | 26 +++++++++++++++++++++++--- packages/vm/src/environment.rs | 6 ++++++ packages/vm/src/imports.rs | 12 ++++++++---- 3 files changed, 37 insertions(+), 7 deletions(-) diff --git a/packages/crypto/benches/main.rs b/packages/crypto/benches/main.rs index 9fa79ccfec..60be978553 100644 --- a/packages/crypto/benches/main.rs +++ b/packages/crypto/benches/main.rs @@ -12,9 +12,9 @@ use k256::ecdsa::SigningKey; // type alias use sha2::Sha256; use cosmwasm_crypto::{ - bls12_381_g1_generator, bls12_381_hash_to_g2, bls12_381_pairing_equality, ed25519_batch_verify, - ed25519_verify, secp256k1_recover_pubkey, secp256k1_verify, secp256r1_recover_pubkey, - secp256r1_verify, HashFunction, + bls12_381_g1_generator, bls12_381_hash_to_g1, bls12_381_hash_to_g2, bls12_381_pairing_equality, + ed25519_batch_verify, ed25519_verify, secp256k1_recover_pubkey, secp256k1_verify, + secp256r1_recover_pubkey, secp256r1_verify, HashFunction, }; use std::cmp::min; @@ -146,6 +146,26 @@ fn bench_crypto(c: &mut Criterion) { }); }); + group.bench_function("bls12_381_hash_to_g1", |b| { + b.iter(|| { + bls12_381_hash_to_g1( + black_box(HashFunction::Sha256), + black_box(&BLS_MESSAGE), + black_box(BLS_DST), + ) + }); + }); + + group.bench_function("bls12_381_hash_to_g2", |b| { + b.iter(|| { + bls12_381_hash_to_g2( + black_box(HashFunction::Sha256), + black_box(&BLS_MESSAGE), + black_box(BLS_DST), + ) + }); + }); + group.bench_function("bls12_381_verify", |b| { let generator = bls12_381_g1_generator(); let message = bls12_381_hash_to_g2(HashFunction::Sha256, &BLS_MESSAGE, BLS_DST); diff --git a/packages/vm/src/environment.rs b/packages/vm/src/environment.rs index 3ba678e4ae..b36426ce18 100644 --- a/packages/vm/src/environment.rs +++ b/packages/vm/src/environment.rs @@ -45,6 +45,10 @@ pub struct GasConfig { pub ed25519_batch_verify_cost: u64, /// ed25519 batch signature verification cost (single public key) pub ed25519_batch_verify_one_pubkey_cost: u64, + /// bls12-381 hash to g1 cost + pub bls12_381_hash_to_g1_cost: u64, + /// bls12-381 hash to g2 cost + pub bls12_381_hash_to_g2_cost: u64, /// bls12-381 pairing equality check cost pub bls12_381_pairing_equality_cost: u64, } @@ -68,6 +72,8 @@ impl Default for GasConfig { // From https://docs.rs/ed25519-zebra/2.2.0/ed25519_zebra/batch/index.html ed25519_batch_verify_cost: 63 * GAS_PER_US / 2, ed25519_batch_verify_one_pubkey_cost: 63 * GAS_PER_US / 4, + bls12_381_hash_to_g1_cost: 95 * GAS_PER_US, + bls12_381_hash_to_g2_cost: 392 * GAS_PER_US, // god i wish i was lying bls12_381_pairing_equality_cost: 1733 * GAS_PER_US, } diff --git a/packages/vm/src/imports.rs b/packages/vm/src/imports.rs index 3fe272711e..2fcf847288 100644 --- a/packages/vm/src/imports.rs +++ b/packages/vm/src/imports.rs @@ -390,13 +390,14 @@ pub fn do_bls12_381_hash_to_g1< dst_ptr: u32, out_ptr: u32, ) -> VmResult { - let (data, store) = env.data_and_store_mut(); + let (data, mut store) = env.data_and_store_mut(); let memory = data.memory(&store); let msg = read_region(&memory, msg_ptr, BLS12_381_MAX_MESSAGE_SIZE)?; let dst = read_region(&memory, dst_ptr, BLS12_381_MAX_DST_SIZE)?; - // TODO: Add gas consumption metering + let gas_info = GasInfo::with_cost(data.gas_config.bls12_381_hash_to_g1_cost); + process_gas_info(data, &mut store, gas_info)?; let hash_function = match HashFunction::from_u32(hash_function) { Ok(func) => func, @@ -404,6 +405,7 @@ pub fn do_bls12_381_hash_to_g1< }; let point = bls12_381_hash_to_g1(hash_function, &msg, &dst); + let memory = data.memory(&store); write_region(&memory, out_ptr, &point)?; Ok(0) @@ -420,13 +422,14 @@ pub fn do_bls12_381_hash_to_g2< dst_ptr: u32, out_ptr: u32, ) -> VmResult { - let (data, store) = env.data_and_store_mut(); + let (data, mut store) = env.data_and_store_mut(); let memory = data.memory(&store); let msg = read_region(&memory, msg_ptr, BLS12_381_MAX_MESSAGE_SIZE)?; let dst = read_region(&memory, dst_ptr, BLS12_381_MAX_DST_SIZE)?; - // TODO: Add gas consumption metering + let gas_info = GasInfo::with_cost(data.gas_config.bls12_381_hash_to_g2_cost); + process_gas_info(data, &mut store, gas_info)?; let hash_function = match HashFunction::from_u32(hash_function) { Ok(func) => func, @@ -434,6 +437,7 @@ pub fn do_bls12_381_hash_to_g2< }; let point = bls12_381_hash_to_g2(hash_function, &msg, &dst); + let memory = data.memory(&store); write_region(&memory, out_ptr, &point)?; Ok(0) From ae268f262bd34e218aa45b363b58afc8d26b0ec9 Mon Sep 17 00:00:00 2001 From: Aumetra Weisman Date: Tue, 16 Apr 2024 12:14:28 +0200 Subject: [PATCH 29/79] Add pairing equality test to crypto-verify contract --- contracts/crypto-verify/Cargo.lock | 1 + contracts/crypto-verify/Cargo.toml | 1 + .../crypto-verify/schema/crypto-verify.json | 77 +++++++++++++++++++ contracts/crypto-verify/schema/raw/query.json | 63 +++++++++++++++ ...onse_to_verify_bls12_pairing_equality.json | 14 ++++ contracts/crypto-verify/src/bls12_381.rs | 14 ++++ contracts/crypto-verify/src/contract.rs | 15 ++++ contracts/crypto-verify/src/lib.rs | 1 + contracts/crypto-verify/src/msg.rs | 14 ++++ contracts/crypto-verify/tests/integration.rs | 67 ++++++++++++++++ packages/std/src/imports.rs | 10 +-- packages/vm/src/testing/instance.rs | 3 +- 12 files changed, 274 insertions(+), 6 deletions(-) create mode 100644 contracts/crypto-verify/schema/raw/response_to_verify_bls12_pairing_equality.json create mode 100644 contracts/crypto-verify/src/bls12_381.rs diff --git a/contracts/crypto-verify/Cargo.lock b/contracts/crypto-verify/Cargo.lock index 3189d7797f..3260bb3645 100644 --- a/contracts/crypto-verify/Cargo.lock +++ b/contracts/crypto-verify/Cargo.lock @@ -514,6 +514,7 @@ name = "crypto-verify" version = "0.0.0" dependencies = [ "base64", + "bls12_381", "cosmwasm-schema", "cosmwasm-std", "cosmwasm-vm", diff --git a/contracts/crypto-verify/Cargo.toml b/contracts/crypto-verify/Cargo.toml index d19b2bfc02..0ee67b2acf 100644 --- a/contracts/crypto-verify/Cargo.toml +++ b/contracts/crypto-verify/Cargo.toml @@ -30,6 +30,7 @@ cranelift = ["cosmwasm-vm/cranelift"] [dependencies] base64 = "0.22.0" +bls12_381 = { version = "0.8.0", default-features = false } cosmwasm-schema = { path = "../../packages/schema" } cosmwasm-std = { path = "../../packages/std", features = ["cosmwasm_2_1", "iterator"] } hex = "0.4" diff --git a/contracts/crypto-verify/schema/crypto-verify.json b/contracts/crypto-verify/schema/crypto-verify.json index 56eba68e5d..99aec94e80 100644 --- a/contracts/crypto-verify/schema/crypto-verify.json +++ b/contracts/crypto-verify/schema/crypto-verify.json @@ -386,6 +386,69 @@ } }, "additionalProperties": false + }, + { + "description": "BLS12-381 pairing equality verification", + "type": "object", + "required": [ + "verify_bls12_pairing_equality" + ], + "properties": { + "verify_bls12_pairing_equality": { + "type": "object", + "required": [ + "dst", + "msg", + "p", + "q", + "r" + ], + "properties": { + "dst": { + "description": "The `dst` component used to hash the message to the curve", + "allOf": [ + { + "$ref": "#/definitions/Binary" + } + ] + }, + "msg": { + "description": "The message that should be verified", + "allOf": [ + { + "$ref": "#/definitions/Binary" + } + ] + }, + "p": { + "description": "The point $p$ in its compressed format (element of G1)", + "allOf": [ + { + "$ref": "#/definitions/Binary" + } + ] + }, + "q": { + "description": "The point $q$ in its compressed format (element of G2)", + "allOf": [ + { + "$ref": "#/definitions/Binary" + } + ] + }, + "r": { + "description": "The point $r$ in its compressed format (element of G1)", + "allOf": [ + { + "$ref": "#/definitions/Binary" + } + ] + } + }, + "additionalProperties": false + } + }, + "additionalProperties": false } ], "definitions": { @@ -419,6 +482,20 @@ }, "additionalProperties": false }, + "verify_bls12_pairing_equality": { + "$schema": "http://json-schema.org/draft-07/schema#", + "title": "VerifyResponse", + "type": "object", + "required": [ + "verifies" + ], + "properties": { + "verifies": { + "type": "boolean" + } + }, + "additionalProperties": false + }, "verify_cosmos_signature": { "$schema": "http://json-schema.org/draft-07/schema#", "title": "VerifyResponse", diff --git a/contracts/crypto-verify/schema/raw/query.json b/contracts/crypto-verify/schema/raw/query.json index 76aa8b0ef7..dc20550f7e 100644 --- a/contracts/crypto-verify/schema/raw/query.json +++ b/contracts/crypto-verify/schema/raw/query.json @@ -375,6 +375,69 @@ } }, "additionalProperties": false + }, + { + "description": "BLS12-381 pairing equality verification", + "type": "object", + "required": [ + "verify_bls12_pairing_equality" + ], + "properties": { + "verify_bls12_pairing_equality": { + "type": "object", + "required": [ + "dst", + "msg", + "p", + "q", + "r" + ], + "properties": { + "dst": { + "description": "The `dst` component used to hash the message to the curve", + "allOf": [ + { + "$ref": "#/definitions/Binary" + } + ] + }, + "msg": { + "description": "The message that should be verified", + "allOf": [ + { + "$ref": "#/definitions/Binary" + } + ] + }, + "p": { + "description": "The point $p$ in its compressed format (element of G1)", + "allOf": [ + { + "$ref": "#/definitions/Binary" + } + ] + }, + "q": { + "description": "The point $q$ in its compressed format (element of G2)", + "allOf": [ + { + "$ref": "#/definitions/Binary" + } + ] + }, + "r": { + "description": "The point $r$ in its compressed format (element of G1)", + "allOf": [ + { + "$ref": "#/definitions/Binary" + } + ] + } + }, + "additionalProperties": false + } + }, + "additionalProperties": false } ], "definitions": { diff --git a/contracts/crypto-verify/schema/raw/response_to_verify_bls12_pairing_equality.json b/contracts/crypto-verify/schema/raw/response_to_verify_bls12_pairing_equality.json new file mode 100644 index 0000000000..a2cdc3461c --- /dev/null +++ b/contracts/crypto-verify/schema/raw/response_to_verify_bls12_pairing_equality.json @@ -0,0 +1,14 @@ +{ + "$schema": "http://json-schema.org/draft-07/schema#", + "title": "VerifyResponse", + "type": "object", + "required": [ + "verifies" + ], + "properties": { + "verifies": { + "type": "boolean" + } + }, + "additionalProperties": false +} diff --git a/contracts/crypto-verify/src/bls12_381.rs b/contracts/crypto-verify/src/bls12_381.rs new file mode 100644 index 0000000000..f531897717 --- /dev/null +++ b/contracts/crypto-verify/src/bls12_381.rs @@ -0,0 +1,14 @@ +use cosmwasm_std::{Api, HashFunction, StdResult}; + +pub fn verify( + api: &dyn Api, + p: &[u8], + q: &[u8], + r: &[u8], + msg: &[u8], + dst: &[u8], +) -> StdResult { + let s = api.bls12_381_hash_to_g2(HashFunction::Sha256, msg, dst)?; + api.bls12_381_pairing_equality(p, q, r, &s) + .map_err(Into::into) +} diff --git a/contracts/crypto-verify/src/contract.rs b/contracts/crypto-verify/src/contract.rs index 90e141452d..9153dafc41 100644 --- a/contracts/crypto-verify/src/contract.rs +++ b/contracts/crypto-verify/src/contract.rs @@ -112,6 +112,9 @@ pub fn query(deps: Deps, _env: Env, msg: QueryMsg) -> StdResult { &r, &s, )?), + QueryMsg::VerifyBls12PairingEquality { p, q, r, msg, dst } => { + to_json_binary(&query_verify_bls12_pairing(deps, &p, &q, &r, &msg, &dst)?) + } } } @@ -282,6 +285,18 @@ pub fn query_list_verifications(deps: Deps) -> StdResult StdResult { + let verifies = crate::bls12_381::verify(deps.api, p, q, r, msg, dst)?; + Ok(VerifyResponse { verifies }) +} + #[cfg(test)] mod tests { use super::*; diff --git a/contracts/crypto-verify/src/lib.rs b/contracts/crypto-verify/src/lib.rs index 07f5a57850..c06473adb2 100644 --- a/contracts/crypto-verify/src/lib.rs +++ b/contracts/crypto-verify/src/lib.rs @@ -1,3 +1,4 @@ +mod bls12_381; pub mod contract; mod ethereum; pub mod msg; diff --git a/contracts/crypto-verify/src/msg.rs b/contracts/crypto-verify/src/msg.rs index 0f0b2556fb..4be0934491 100644 --- a/contracts/crypto-verify/src/msg.rs +++ b/contracts/crypto-verify/src/msg.rs @@ -108,6 +108,20 @@ pub enum QueryMsg { /// The representation of this component is a big-endian encoded 256bit integer s: Binary, }, + /// BLS12-381 pairing equality verification + #[returns(VerifyResponse)] + VerifyBls12PairingEquality { + /// The point $p$ in its compressed format (element of G1) + p: Binary, + /// The point $q$ in its compressed format (element of G2) + q: Binary, + /// The point $r$ in its compressed format (element of G1) + r: Binary, + /// The message that should be verified + msg: Binary, + /// The `dst` component used to hash the message to the curve + dst: Binary, + }, } #[cw_serde] diff --git a/contracts/crypto-verify/tests/integration.rs b/contracts/crypto-verify/tests/integration.rs index 8aac729095..b21ddbd0ef 100644 --- a/contracts/crypto-verify/tests/integration.rs +++ b/contracts/crypto-verify/tests/integration.rs @@ -19,12 +19,14 @@ //! 5. Anywhere you see query(deps.as_ref(), ...) you must replace it with query(&mut deps, ...) //! (Use cosmwasm_vm::testing::{init, execute, query}, instead of the contract variants). +use bls12_381::G1Affine; use cosmwasm_std::{Binary, Response, Uint128}; use cosmwasm_vm::testing::{ instantiate, mock_env, mock_info, mock_instance, query, MockApi, MockQuerier, MockStorage, }; use cosmwasm_vm::{from_slice, Instance}; use hex_literal::hex; +use sha2::{Digest, Sha256}; use crypto_verify::msg::{InstantiateMsg, ListVerificationsResponse, QueryMsg, VerifyResponse}; @@ -73,6 +75,21 @@ const WEBAUTHN_SIGNATURE_R: &[u8] = const WEBAUTHN_SIGNATURE_S: &[u8] = &hex!("7a4fef4d0b11187f95f69eefbb428df8ac799bbd9305066b1e9c9fe9a5bcf8c4"); +// See https://github.com/drand/kyber-bls12381/issues/22 and +// https://github.com/drand/drand/pull/1249 +const DOMAIN_HASH_TO_G2: &[u8] = b"BLS_SIG_BLS12381G2_XMD:SHA-256_SSWU_RO_NUL_"; + +/// Public key League of Entropy Mainnet (curl -sS https://drand.cloudflare.com/info) +const PK_LEO_MAINNET: [u8; 48] = hex!("868f005eb8e6e4ca0a47c8a77ceaa5309a47978a7c71bc5cce96366b5d7a569937c529eeda66c7293784a9402801af31"); + +fn build_bls_message(round: u64, previous_signature: &[u8]) -> Vec { + Sha256::new() + .chain_update(previous_signature) + .chain_update(round.to_be_bytes()) + .finalize() + .to_vec() +} + const DESERIALIZATION_LIMIT: usize = 20_000; fn setup() -> Instance { @@ -89,6 +106,56 @@ fn instantiate_works() { setup(); } +#[test] +fn bls12_381_verifies() { + let mut deps = setup(); + + let previous_signature = hex::decode("a609e19a03c2fcc559e8dae14900aaefe517cb55c840f6e69bc8e4f66c8d18e8a609685d9917efbfb0c37f058c2de88f13d297c7e19e0ab24813079efe57a182554ff054c7638153f9b26a60e7111f71a0ff63d9571704905d3ca6df0b031747").unwrap(); + let signature = hex::decode("82f5d3d2de4db19d40a6980e8aa37842a0e55d1df06bd68bddc8d60002e8e959eb9cfa368b3c1b77d18f02a54fe047b80f0989315f83b12a74fd8679c4f12aae86eaf6ab5690b34f1fddd50ee3cc6f6cdf59e95526d5a5d82aaa84fa6f181e42").unwrap(); + let round: u64 = 72785; + + let msg = build_bls_message(round, &previous_signature); + + let verify_msg = QueryMsg::VerifyBls12PairingEquality { + p: G1Affine::generator().to_compressed().into(), + q: signature.into(), + r: PK_LEO_MAINNET.into(), + msg: msg.into(), + dst: DOMAIN_HASH_TO_G2.into(), + }; + + let raw = query(&mut deps, mock_env(), verify_msg).unwrap(); + let res: VerifyResponse = from_slice(&raw, DESERIALIZATION_LIMIT).unwrap(); + + assert_eq!(res, VerifyResponse { verifies: true }); +} + +#[test] +fn bls12_381_errors() { + let mut deps = setup(); + + let mut previous_signature = hex::decode("a609e19a03c2fcc559e8dae14900aaefe517cb55c840f6e69bc8e4f66c8d18e8a609685d9917efbfb0c37f058c2de88f13d297c7e19e0ab24813079efe57a182554ff054c7638153f9b26a60e7111f71a0ff63d9571704905d3ca6df0b031747").unwrap(); + let signature = hex::decode("82f5d3d2de4db19d40a6980e8aa37842a0e55d1df06bd68bddc8d60002e8e959eb9cfa368b3c1b77d18f02a54fe047b80f0989315f83b12a74fd8679c4f12aae86eaf6ab5690b34f1fddd50ee3cc6f6cdf59e95526d5a5d82aaa84fa6f181e42").unwrap(); + let round: u64 = 72785; + + previous_signature[0] ^= 0x3; + + let msg = build_bls_message(round, &previous_signature); + + let verify_msg = QueryMsg::VerifyBls12PairingEquality { + p: G1Affine::generator().to_compressed().into(), + q: signature.into(), + r: PK_LEO_MAINNET.into(), + msg: msg.into(), + dst: DOMAIN_HASH_TO_G2.into(), + }; + + let raw = query(&mut deps, mock_env(), verify_msg).unwrap(); + let res: VerifyResponse = from_slice(&raw, DESERIALIZATION_LIMIT).unwrap(); + + assert_eq!(res, VerifyResponse { verifies: false }); +} + #[test] fn cosmos_signature_verify_works() { let mut deps = setup(); diff --git a/packages/std/src/imports.rs b/packages/std/src/imports.rs index a0df710374..865028de39 100644 --- a/packages/std/src/imports.rs +++ b/packages/std/src/imports.rs @@ -405,7 +405,7 @@ impl Api for ExternalApi { #[cfg(feature = "cosmwasm_2_1")] fn bls12_381_aggregate_g1(&self, g1s: &[u8]) -> Result<[u8; 48], VerificationError> { - let mut point = [0_u8; 48]; + let point = [0_u8; 48]; let send = build_region(g1s); let send_ptr = &*send as *const Region as u32; @@ -422,14 +422,14 @@ impl Api for ExternalApi { #[cfg(feature = "cosmwasm_2_1")] fn bls12_381_aggregate_g2(&self, g2s: &[u8]) -> Result<[u8; 96], VerificationError> { - let mut point = [0_u8; 96]; + let point = [0_u8; 96]; let send = build_region(g2s); let send_ptr = &*send as *const Region as u32; let out = build_region(&point[..]); let out_ptr = &*out as *const Region as u32; - let result = unsafe { bls12_381_aggregate_g1(send_ptr, out_ptr) }; + let result = unsafe { bls12_381_aggregate_g2(send_ptr, out_ptr) }; match result { 0 => Ok(point), 8 => Err(VerificationError::InvalidPoint), @@ -488,7 +488,7 @@ impl Api for ExternalApi { msg: &[u8], dst: &[u8], ) -> Result<[u8; 48], VerificationError> { - let mut point = [0_u8; 48]; + let point = [0_u8; 48]; let send_msg = build_region(msg); let send_msg_ptr = &*send_msg as *const Region as u32; @@ -516,7 +516,7 @@ impl Api for ExternalApi { msg: &[u8], dst: &[u8], ) -> Result<[u8; 96], VerificationError> { - let mut point = [0_u8; 96]; + let point = [0_u8; 96]; let send_msg = build_region(msg); let send_msg_ptr = &*send_msg as *const Region as u32; diff --git a/packages/vm/src/testing/instance.rs b/packages/vm/src/testing/instance.rs index 9373401d88..c4da5f1a1f 100644 --- a/packages/vm/src/testing/instance.rs +++ b/packages/vm/src/testing/instance.rs @@ -17,7 +17,8 @@ use super::storage::MockStorage; /// This gas limit is used in integration tests and should be high enough to allow a reasonable /// number of contract executions and queries on one instance. For this reason it is significatly /// higher than the limit for a single execution that we have in the production setup. -const DEFAULT_GAS_LIMIT: u64 = 500_000_000; // ~0.5ms +//const DEFAULT_GAS_LIMIT: u64 = 500_000_000; // ~0.5ms +const DEFAULT_GAS_LIMIT: u64 = 2_150_000_000; // ~2.15ms const DEFAULT_MEMORY_LIMIT: Option = Some(Size::mebi(16)); pub fn mock_instance( From 4489610fcfacff0141d786621baf25f09f92762d Mon Sep 17 00:00:00 2001 From: Aumetra Weisman Date: Tue, 16 Apr 2024 13:37:14 +0200 Subject: [PATCH 30/79] Move to arkworks BLS implementation --- Cargo.lock | 252 +++++++++----- contracts/burner/Cargo.lock | 331 +++++++++++------- contracts/crypto-verify/Cargo.lock | 339 ++++++++++++------- contracts/crypto-verify/Cargo.toml | 4 +- contracts/crypto-verify/tests/integration.rs | 18 +- contracts/cyberpunk/Cargo.lock | 331 +++++++++++------- contracts/empty/Cargo.lock | 331 +++++++++++------- contracts/floaty/Cargo.lock | 315 ++++++++++------- contracts/hackatom/Cargo.lock | 333 +++++++++++------- contracts/ibc-reflect-send/Cargo.lock | 331 +++++++++++------- contracts/ibc-reflect/Cargo.lock | 331 +++++++++++------- contracts/queue/Cargo.lock | 331 +++++++++++------- contracts/reflect/Cargo.lock | 331 +++++++++++------- contracts/staking/Cargo.lock | 331 +++++++++++------- contracts/virus/Cargo.lock | 331 +++++++++++------- packages/crypto/Cargo.toml | 29 +- packages/crypto/src/bls12_318/constants.rs | 18 +- packages/crypto/src/bls12_318/hash.rs | 42 ++- packages/crypto/src/bls12_318/pairing.rs | 50 ++- packages/crypto/src/bls12_318/points.rs | 55 +-- packages/crypto/tests/bls12_381.rs | 12 +- packages/vm/src/environment.rs | 6 +- packages/vm/src/testing/instance.rs | 3 +- 23 files changed, 2909 insertions(+), 1546 deletions(-) diff --git a/Cargo.lock b/Cargo.lock index b0c7e450c9..b7a23df2f4 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -126,6 +126,127 @@ version = "1.0.71" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "9c7d0618f0e0b7e8ff11427422b64564d5fb0be1940354bfe2e0529b18a9d9b8" +[[package]] +name = "ark-bls12-381" +version = "0.4.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c775f0d12169cba7aae4caeb547bb6a50781c7449a8aa53793827c9ec4abf488" +dependencies = [ + "ark-ec", + "ark-ff", + "ark-serialize", + "ark-std", +] + +[[package]] +name = "ark-ec" +version = "0.4.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "defd9a439d56ac24968cca0571f598a61bc8c55f71d50a89cda591cb750670ba" +dependencies = [ + "ark-ff", + "ark-poly", + "ark-serialize", + "ark-std", + "derivative", + "hashbrown 0.13.2", + "itertools", + "num-traits", + "rayon", + "zeroize", +] + +[[package]] +name = "ark-ff" +version = "0.4.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ec847af850f44ad29048935519032c33da8aa03340876d351dfab5660d2966ba" +dependencies = [ + "ark-ff-asm", + "ark-ff-macros", + "ark-serialize", + "ark-std", + "derivative", + "digest", + "itertools", + "num-bigint", + "num-traits", + "paste", + "rayon", + "rustc_version", + "zeroize", +] + +[[package]] +name = "ark-ff-asm" +version = "0.4.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3ed4aa4fe255d0bc6d79373f7e31d2ea147bcf486cba1be5ba7ea85abdb92348" +dependencies = [ + "quote", + "syn 1.0.109", +] + +[[package]] +name = "ark-ff-macros" +version = "0.4.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7abe79b0e4288889c4574159ab790824d0033b9fdcb2a112a3182fac2e514565" +dependencies = [ + "num-bigint", + "num-traits", + "proc-macro2", + "quote", + "syn 1.0.109", +] + +[[package]] +name = "ark-poly" +version = "0.4.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d320bfc44ee185d899ccbadfa8bc31aab923ce1558716e1997a1e74057fe86bf" +dependencies = [ + "ark-ff", + "ark-serialize", + "ark-std", + "derivative", + "hashbrown 0.13.2", +] + +[[package]] +name = "ark-serialize" +version = "0.4.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "adb7b85a02b83d2f22f89bd5cac66c9c89474240cb6207cb1efc16d098e822a5" +dependencies = [ + "ark-serialize-derive", + "ark-std", + "digest", + "num-bigint", +] + +[[package]] +name = "ark-serialize-derive" +version = "0.4.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ae3281bc6d0fd7e549af32b52511e1302185bd688fd3359fa36423346ff682ea" +dependencies = [ + "proc-macro2", + "quote", + "syn 1.0.109", +] + +[[package]] +name = "ark-std" +version = "0.4.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "94893f1e0c6eeab764ade8dc4c0db24caf4fe7cbbaafc0eba0a9030f447b5185" +dependencies = [ + "num-traits", + "rand", + "rayon", +] + [[package]] name = "arrayvec" version = "0.7.2" @@ -226,15 +347,6 @@ dependencies = [ "wyz", ] -[[package]] -name = "block-buffer" -version = "0.9.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4152116fd6e9dadb291ae18fc1ec3575ed6d84c29642d97890f4b4a3417297e4" -dependencies = [ - "generic-array", -] - [[package]] name = "block-buffer" version = "0.10.4" @@ -244,20 +356,6 @@ dependencies = [ "generic-array", ] -[[package]] -name = "bls12_381" -version = "0.8.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d7bc6d6292be3a19e6379786dac800f551e5865a5bb51ebbe3064ab80433f403" -dependencies = [ - "digest 0.9.0", - "ff", - "group", - "pairing", - "rand_core", - "subtle", -] - [[package]] name = "bnum" version = "0.11.0" @@ -468,7 +566,7 @@ dependencies = [ "schemars", "serde", "serde_json", - "sha2 0.10.8", + "sha2", "static_assertions", "thiserror", ] @@ -477,12 +575,15 @@ dependencies = [ name = "cosmwasm-crypto" version = "2.0.1" dependencies = [ + "ark-bls12-381", + "ark-ec", + "ark-ff", + "ark-serialize", "base64 0.22.0", "base64-serde", - "bls12_381", "criterion", "derive_more", - "digest 0.10.7", + "digest", "ecdsa", "ed25519-zebra", "english-numbers", @@ -490,14 +591,13 @@ dependencies = [ "hex", "hex-literal", "k256", + "num-traits", "p256", - "pairing", "rand_core", "rayon", "serde", "serde_json", - "sha2 0.10.8", - "sha2 0.9.9", + "sha2", "sha3", "thiserror", ] @@ -556,7 +656,7 @@ dependencies = [ "serde", "serde-json-wasm", "serde_json", - "sha2 0.10.8", + "sha2", "thiserror", ] @@ -583,7 +683,7 @@ dependencies = [ "schemars", "serde", "serde_json", - "sha2 0.10.8", + "sha2", "strum", "target-lexicon", "tempfile", @@ -807,7 +907,7 @@ dependencies = [ "cfg-if", "cpufeatures", "curve25519-dalek-derive", - "digest 0.10.7", + "digest", "fiat-crypto", "platforms", "rustc_version", @@ -946,22 +1046,13 @@ version = "0.4.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "6184e33543162437515c2e2b48714794e37845ec9851711914eec9d308f6ebe8" -[[package]] -name = "digest" -version = "0.9.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d3dd60d1080a57a05ab032377049e0591415d2b31afd7028356dbf3cc6dcb066" -dependencies = [ - "generic-array", -] - [[package]] name = "digest" version = "0.10.7" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "9ed9a281f7bc9b7576e61468ba615a66a5c8cfdff42420a70aa82701a3b1e292" dependencies = [ - "block-buffer 0.10.4", + "block-buffer", "const-oid", "crypto-common", "subtle", @@ -1012,7 +1103,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "ee27f32b5c5292967d2d4a9d7f1e0b0aed2c15daded5a60300e4abb9d8020bca" dependencies = [ "der", - "digest 0.10.7", + "digest", "elliptic-curve", "rfc6979", "signature", @@ -1038,7 +1129,7 @@ dependencies = [ "hashbrown 0.14.3", "hex", "rand_core", - "sha2 0.10.8", + "sha2", "zeroize", ] @@ -1056,7 +1147,7 @@ checksum = "b5e6043086bf7973472e0c7dff2142ea0b680d30e18d9cc40f267efbf222bd47" dependencies = [ "base16ct", "crypto-bigint", - "digest 0.10.7", + "digest", "ff", "generic-array", "group", @@ -1161,7 +1252,6 @@ version = "0.13.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "ded41244b729663b1e574f1b4fb731469f69f79c17667b5d776b16cda0479449" dependencies = [ - "bitvec", "rand_core", "subtle", ] @@ -1285,6 +1375,15 @@ dependencies = [ "ahash 0.7.8", ] +[[package]] +name = "hashbrown" +version = "0.13.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "43a3c133739dddd0d2990f9a4bdf8eb4b21ef50e4851ca85ab661199821d510e" +dependencies = [ + "ahash 0.8.11", +] + [[package]] name = "hashbrown" version = "0.14.3" @@ -1328,7 +1427,7 @@ version = "0.12.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "6c49c37c09c17a53d937dfbb742eb3a961d65a994e6bcdcf37e7399d0cc8ab5e" dependencies = [ - "digest 0.10.7", + "digest", ] [[package]] @@ -1428,7 +1527,7 @@ dependencies = [ "cfg-if", "ecdsa", "elliptic-curve", - "sha2 0.10.8", + "sha2", ] [[package]] @@ -1565,6 +1664,17 @@ version = "0.3.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "61807f77802ff30975e01f4f071c8ba10c022052f98b3294119f3e615d13e5be" +[[package]] +name = "num-bigint" +version = "0.4.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "608e7659b5c3d7cba262d894801b9ec9d00de989e8a82bd4bef91d08da45cdc0" +dependencies = [ + "autocfg", + "num-integer", + "num-traits", +] + [[package]] name = "num-integer" version = "0.1.45" @@ -1577,9 +1687,9 @@ dependencies = [ [[package]] name = "num-traits" -version = "0.2.15" +version = "0.2.18" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "578ede34cf02f8924ab9447f50c28075b4d3e5b269972345e7e0372b38c6cdcd" +checksum = "da0df0e5185db44f69b44f26786fe401b6c293d1907744beaa7fa62b2e5a517a" dependencies = [ "autocfg", ] @@ -1605,12 +1715,6 @@ version = "11.1.3" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "0ab1bc2a289d34bd04a330323ac98a1b4bc82c9d9fcb1e66b63caa84da26b575" -[[package]] -name = "opaque-debug" -version = "0.3.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c08d65885ee38876c4f86fa503fb49d7b507c2b62552df7c70b2fce627e06381" - [[package]] name = "p256" version = "0.13.2" @@ -1620,16 +1724,7 @@ dependencies = [ "ecdsa", "elliptic-curve", "primeorder", - "sha2 0.10.8", -] - -[[package]] -name = "pairing" -version = "0.23.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "81fec4625e73cf41ef4bb6846cafa6d44736525f442ba45e407c4a000a13996f" -dependencies = [ - "group", + "sha2", ] [[package]] @@ -1655,6 +1750,12 @@ dependencies = [ "windows-sys 0.45.0", ] +[[package]] +name = "paste" +version = "1.0.14" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "de3145af08024dea9fa9914f381a17b8fc6034dfb00f3a84013f7ff43f29ed4c" + [[package]] name = "pin-project-lite" version = "0.2.9" @@ -2157,19 +2258,6 @@ dependencies = [ "serde", ] -[[package]] -name = "sha2" -version = "0.9.9" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4d58a1e1bf39749807d89cf2d98ac2dfa0ff1cb3faa38fbb64dd88ac8013d800" -dependencies = [ - "block-buffer 0.9.0", - "cfg-if", - "cpufeatures", - "digest 0.9.0", - "opaque-debug", -] - [[package]] name = "sha2" version = "0.10.8" @@ -2178,7 +2266,7 @@ checksum = "793db75ad2bcafc3ffa7c68b215fee268f537982cd901d132f89c6343f3a3dc8" dependencies = [ "cfg-if", "cpufeatures", - "digest 0.10.7", + "digest", ] [[package]] @@ -2187,7 +2275,7 @@ version = "0.10.8" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "75872d278a8f37ef87fa0ddbda7802605cb18344497949862c0d4dcb291eba60" dependencies = [ - "digest 0.10.7", + "digest", "keccak", ] @@ -2207,7 +2295,7 @@ version = "2.1.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "5e1788eed21689f9cf370582dfc467ef36ed9c707f073528ddafa8d83e3b8500" dependencies = [ - "digest 0.10.7", + "digest", "rand_core", ] diff --git a/contracts/burner/Cargo.lock b/contracts/burner/Cargo.lock index 179649e993..c0f8aeb4a2 100644 --- a/contracts/burner/Cargo.lock +++ b/contracts/burner/Cargo.lock @@ -46,6 +46,127 @@ version = "0.2.16" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "0942ffc6dcaadf03badf6e6a2d0228460359d5e34b57ccdc720b7382dfbd5ec5" +[[package]] +name = "ark-bls12-381" +version = "0.4.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c775f0d12169cba7aae4caeb547bb6a50781c7449a8aa53793827c9ec4abf488" +dependencies = [ + "ark-ec", + "ark-ff", + "ark-serialize", + "ark-std", +] + +[[package]] +name = "ark-ec" +version = "0.4.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "defd9a439d56ac24968cca0571f598a61bc8c55f71d50a89cda591cb750670ba" +dependencies = [ + "ark-ff", + "ark-poly", + "ark-serialize", + "ark-std", + "derivative", + "hashbrown 0.13.2", + "itertools", + "num-traits", + "rayon", + "zeroize", +] + +[[package]] +name = "ark-ff" +version = "0.4.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ec847af850f44ad29048935519032c33da8aa03340876d351dfab5660d2966ba" +dependencies = [ + "ark-ff-asm", + "ark-ff-macros", + "ark-serialize", + "ark-std", + "derivative", + "digest", + "itertools", + "num-bigint", + "num-traits", + "paste", + "rayon", + "rustc_version", + "zeroize", +] + +[[package]] +name = "ark-ff-asm" +version = "0.4.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3ed4aa4fe255d0bc6d79373f7e31d2ea147bcf486cba1be5ba7ea85abdb92348" +dependencies = [ + "quote", + "syn 1.0.109", +] + +[[package]] +name = "ark-ff-macros" +version = "0.4.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7abe79b0e4288889c4574159ab790824d0033b9fdcb2a112a3182fac2e514565" +dependencies = [ + "num-bigint", + "num-traits", + "proc-macro2", + "quote", + "syn 1.0.109", +] + +[[package]] +name = "ark-poly" +version = "0.4.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d320bfc44ee185d899ccbadfa8bc31aab923ce1558716e1997a1e74057fe86bf" +dependencies = [ + "ark-ff", + "ark-serialize", + "ark-std", + "derivative", + "hashbrown 0.13.2", +] + +[[package]] +name = "ark-serialize" +version = "0.4.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "adb7b85a02b83d2f22f89bd5cac66c9c89474240cb6207cb1efc16d098e822a5" +dependencies = [ + "ark-serialize-derive", + "ark-std", + "digest", + "num-bigint", +] + +[[package]] +name = "ark-serialize-derive" +version = "0.4.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ae3281bc6d0fd7e549af32b52511e1302185bd688fd3359fa36423346ff682ea" +dependencies = [ + "proc-macro2", + "quote", + "syn 1.0.109", +] + +[[package]] +name = "ark-std" +version = "0.4.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "94893f1e0c6eeab764ade8dc4c0db24caf4fe7cbbaafc0eba0a9030f447b5185" +dependencies = [ + "num-traits", + "rand", + "rayon", +] + [[package]] name = "arrayvec" version = "0.7.2" @@ -103,27 +224,6 @@ version = "2.4.2" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "ed570934406eb16438a4e976b1b4500774099c13b8cb96eec99f620f05090ddf" -[[package]] -name = "bitvec" -version = "1.0.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1bc2832c24239b0141d5674bb9174f9d68a8b5b3f2753311927c172ca46f7e9c" -dependencies = [ - "funty", - "radium", - "tap", - "wyz", -] - -[[package]] -name = "block-buffer" -version = "0.9.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4152116fd6e9dadb291ae18fc1ec3575ed6d84c29642d97890f4b4a3417297e4" -dependencies = [ - "generic-array", -] - [[package]] name = "block-buffer" version = "0.10.2" @@ -133,20 +233,6 @@ dependencies = [ "generic-array", ] -[[package]] -name = "bls12_381" -version = "0.8.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d7bc6d6292be3a19e6379786dac800f551e5865a5bb51ebbe3064ab80433f403" -dependencies = [ - "digest 0.9.0", - "ff", - "group", - "pairing", - "rand_core", - "subtle", -] - [[package]] name = "bnum" version = "0.11.0" @@ -252,7 +338,7 @@ dependencies = [ "hex", "schemars", "serde", - "sha2 0.10.8", + "sha2", "static_assertions", "thiserror", ] @@ -261,17 +347,20 @@ dependencies = [ name = "cosmwasm-crypto" version = "2.0.1" dependencies = [ - "bls12_381", + "ark-bls12-381", + "ark-ec", + "ark-ff", + "ark-serialize", "derive_more", - "digest 0.10.7", + "digest", "ecdsa", "ed25519-zebra", "k256", + "num-traits", "p256", - "pairing", "rand_core", "rayon", - "sha2 0.9.9", + "sha2", "thiserror", ] @@ -319,7 +408,7 @@ dependencies = [ "schemars", "serde", "serde-json-wasm", - "sha2 0.10.8", + "sha2", "thiserror", ] @@ -339,7 +428,7 @@ dependencies = [ "schemars", "serde", "serde_json", - "sha2 0.10.8", + "sha2", "strum", "thiserror", "tracing", @@ -523,7 +612,7 @@ dependencies = [ "cfg-if", "cpufeatures", "curve25519-dalek-derive", - "digest 0.10.7", + "digest", "fiat-crypto", "platforms", "rustc_version", @@ -631,22 +720,13 @@ dependencies = [ "unicode-xid", ] -[[package]] -name = "digest" -version = "0.9.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d3dd60d1080a57a05ab032377049e0591415d2b31afd7028356dbf3cc6dcb066" -dependencies = [ - "generic-array", -] - [[package]] name = "digest" version = "0.10.7" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "9ed9a281f7bc9b7576e61468ba615a66a5c8cfdff42420a70aa82701a3b1e292" dependencies = [ - "block-buffer 0.10.2", + "block-buffer", "const-oid", "crypto-common", "subtle", @@ -691,7 +771,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "a4b1e0c257a9e9f25f90ff76d7a68360ed497ee519c8e428d1825ef0000799d4" dependencies = [ "der", - "digest 0.10.7", + "digest", "elliptic-curve", "rfc6979", "signature", @@ -717,7 +797,7 @@ dependencies = [ "hashbrown 0.14.3", "hex", "rand_core", - "sha2 0.10.8", + "sha2", "zeroize", ] @@ -735,7 +815,7 @@ checksum = "b5e6043086bf7973472e0c7dff2142ea0b680d30e18d9cc40f267efbf222bd47" dependencies = [ "base16ct", "crypto-bigint", - "digest 0.10.7", + "digest", "ff", "generic-array", "group", @@ -804,7 +884,6 @@ version = "0.13.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "ded41244b729663b1e574f1b4fb731469f69f79c17667b5d776b16cda0479449" dependencies = [ - "bitvec", "rand_core", "subtle", ] @@ -821,12 +900,6 @@ version = "1.0.7" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "3f9eec918d3f24069decb9af1554cad7c880e2da24a9afd88aca000531ab82c1" -[[package]] -name = "funty" -version = "2.0.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e6d5a32815ae3f33302d95fdcb2ce17862f8c65363dcfd29360480ba1001fc9c" - [[package]] name = "fxhash" version = "0.2.1" @@ -895,6 +968,15 @@ dependencies = [ "ahash 0.7.8", ] +[[package]] +name = "hashbrown" +version = "0.13.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "43a3c133739dddd0d2990f9a4bdf8eb4b21ef50e4851ca85ab661199821d510e" +dependencies = [ + "ahash 0.8.11", +] + [[package]] name = "hashbrown" version = "0.14.3" @@ -923,7 +1005,7 @@ version = "0.12.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "6c49c37c09c17a53d937dfbb742eb3a961d65a994e6bcdcf37e7399d0cc8ab5e" dependencies = [ - "digest 0.10.7", + "digest", ] [[package]] @@ -952,6 +1034,15 @@ dependencies = [ "hashbrown 0.14.3", ] +[[package]] +name = "itertools" +version = "0.10.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b0fd2260e829bddf4cb6ea802289de2f86d6a7a690192fbe91b3f46e0f2c8473" +dependencies = [ + "either", +] + [[package]] name = "itoa" version = "0.4.7" @@ -976,7 +1067,7 @@ dependencies = [ "cfg-if", "ecdsa", "elliptic-curve", - "sha2 0.10.8", + "sha2", ] [[package]] @@ -1083,6 +1174,35 @@ version = "0.2.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "0debeb9fcf88823ea64d64e4a815ab1643f33127d995978e099942ce38f25238" +[[package]] +name = "num-bigint" +version = "0.4.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "608e7659b5c3d7cba262d894801b9ec9d00de989e8a82bd4bef91d08da45cdc0" +dependencies = [ + "autocfg", + "num-integer", + "num-traits", +] + +[[package]] +name = "num-integer" +version = "0.1.46" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7969661fd2958a5cb096e56c8e1ad0444ac2bbcd0061bd28660485a44879858f" +dependencies = [ + "num-traits", +] + +[[package]] +name = "num-traits" +version = "0.2.18" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "da0df0e5185db44f69b44f26786fe401b6c293d1907744beaa7fa62b2e5a517a" +dependencies = [ + "autocfg", +] + [[package]] name = "object" version = "0.25.3" @@ -1098,12 +1218,6 @@ version = "1.19.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "3fdb12b2476b595f9358c5161aa467c2438859caa136dec86c26fdd2efe17b92" -[[package]] -name = "opaque-debug" -version = "0.3.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c08d65885ee38876c4f86fa503fb49d7b507c2b62552df7c70b2fce627e06381" - [[package]] name = "p256" version = "0.13.2" @@ -1113,16 +1227,7 @@ dependencies = [ "ecdsa", "elliptic-curve", "primeorder", - "sha2 0.10.8", -] - -[[package]] -name = "pairing" -version = "0.23.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "81fec4625e73cf41ef4bb6846cafa6d44736525f442ba45e407c4a000a13996f" -dependencies = [ - "group", + "sha2", ] [[package]] @@ -1138,6 +1243,12 @@ dependencies = [ "windows-targets", ] +[[package]] +name = "paste" +version = "1.0.14" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "de3145af08024dea9fa9914f381a17b8fc6034dfb00f3a84013f7ff43f29ed4c" + [[package]] name = "pin-project-lite" version = "0.2.13" @@ -1150,6 +1261,12 @@ version = "3.4.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "db23d408679286588f4d4644f965003d056e3dd5abcaaa938116871d7ce2fee7" +[[package]] +name = "ppv-lite86" +version = "0.2.17" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5b40af805b3121feab8a3c29f04d8ad262fa8e0561883e7653e024ae4479e6de" + [[package]] name = "primeorder" version = "0.13.6" @@ -1222,10 +1339,24 @@ dependencies = [ ] [[package]] -name = "radium" -version = "0.7.0" +name = "rand" +version = "0.8.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "34af8d1a0e25924bc5b7c43c079c942339d8f0a8b57c39049bef581b46327404" +dependencies = [ + "rand_chacha", + "rand_core", +] + +[[package]] +name = "rand_chacha" +version = "0.3.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "dc33ff2d4973d518d823d61aa239014831e521c75da58e3df4840d3f47749d09" +checksum = "e6c10a63a0fa32252be49d21e7709d4d4baf8d231c2dbce1eaa8141b9b127d88" +dependencies = [ + "ppv-lite86", + "rand_core", +] [[package]] name = "rand_core" @@ -1484,19 +1615,6 @@ dependencies = [ "serde", ] -[[package]] -name = "sha2" -version = "0.9.9" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4d58a1e1bf39749807d89cf2d98ac2dfa0ff1cb3faa38fbb64dd88ac8013d800" -dependencies = [ - "block-buffer 0.9.0", - "cfg-if", - "cpufeatures", - "digest 0.9.0", - "opaque-debug", -] - [[package]] name = "sha2" version = "0.10.8" @@ -1505,7 +1623,7 @@ checksum = "793db75ad2bcafc3ffa7c68b215fee268f537982cd901d132f89c6343f3a3dc8" dependencies = [ "cfg-if", "cpufeatures", - "digest 0.10.7", + "digest", ] [[package]] @@ -1524,7 +1642,7 @@ version = "2.1.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "5e1788eed21689f9cf370582dfc467ef36ed9c707f073528ddafa8d83e3b8500" dependencies = [ - "digest 0.10.7", + "digest", "rand_core", ] @@ -1608,12 +1726,6 @@ dependencies = [ "unicode-ident", ] -[[package]] -name = "tap" -version = "1.0.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "55937e1799185b12863d447f42597ed69d9928686b8d88a1df17376a097d8369" - [[package]] name = "target-lexicon" version = "0.12.7" @@ -2049,15 +2161,6 @@ version = "0.48.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "1a515f5799fe4961cb532f983ce2b23082366b898e52ffbce459c86f67c8378a" -[[package]] -name = "wyz" -version = "0.5.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "05f360fc0b24296329c78fda852a1e9ae82de9cf7b27dae4b7f62f118f77b9ed" -dependencies = [ - "tap", -] - [[package]] name = "zerocopy" version = "0.7.32" diff --git a/contracts/crypto-verify/Cargo.lock b/contracts/crypto-verify/Cargo.lock index 3260bb3645..96c230504c 100644 --- a/contracts/crypto-verify/Cargo.lock +++ b/contracts/crypto-verify/Cargo.lock @@ -46,6 +46,127 @@ version = "0.2.16" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "0942ffc6dcaadf03badf6e6a2d0228460359d5e34b57ccdc720b7382dfbd5ec5" +[[package]] +name = "ark-bls12-381" +version = "0.4.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c775f0d12169cba7aae4caeb547bb6a50781c7449a8aa53793827c9ec4abf488" +dependencies = [ + "ark-ec", + "ark-ff", + "ark-serialize", + "ark-std", +] + +[[package]] +name = "ark-ec" +version = "0.4.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "defd9a439d56ac24968cca0571f598a61bc8c55f71d50a89cda591cb750670ba" +dependencies = [ + "ark-ff", + "ark-poly", + "ark-serialize", + "ark-std", + "derivative", + "hashbrown 0.13.2", + "itertools", + "num-traits", + "rayon", + "zeroize", +] + +[[package]] +name = "ark-ff" +version = "0.4.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ec847af850f44ad29048935519032c33da8aa03340876d351dfab5660d2966ba" +dependencies = [ + "ark-ff-asm", + "ark-ff-macros", + "ark-serialize", + "ark-std", + "derivative", + "digest", + "itertools", + "num-bigint", + "num-traits", + "paste", + "rayon", + "rustc_version", + "zeroize", +] + +[[package]] +name = "ark-ff-asm" +version = "0.4.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3ed4aa4fe255d0bc6d79373f7e31d2ea147bcf486cba1be5ba7ea85abdb92348" +dependencies = [ + "quote", + "syn 1.0.109", +] + +[[package]] +name = "ark-ff-macros" +version = "0.4.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7abe79b0e4288889c4574159ab790824d0033b9fdcb2a112a3182fac2e514565" +dependencies = [ + "num-bigint", + "num-traits", + "proc-macro2", + "quote", + "syn 1.0.109", +] + +[[package]] +name = "ark-poly" +version = "0.4.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d320bfc44ee185d899ccbadfa8bc31aab923ce1558716e1997a1e74057fe86bf" +dependencies = [ + "ark-ff", + "ark-serialize", + "ark-std", + "derivative", + "hashbrown 0.13.2", +] + +[[package]] +name = "ark-serialize" +version = "0.4.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "adb7b85a02b83d2f22f89bd5cac66c9c89474240cb6207cb1efc16d098e822a5" +dependencies = [ + "ark-serialize-derive", + "ark-std", + "digest", + "num-bigint", +] + +[[package]] +name = "ark-serialize-derive" +version = "0.4.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ae3281bc6d0fd7e549af32b52511e1302185bd688fd3359fa36423346ff682ea" +dependencies = [ + "proc-macro2", + "quote", + "syn 1.0.109", +] + +[[package]] +name = "ark-std" +version = "0.4.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "94893f1e0c6eeab764ade8dc4c0db24caf4fe7cbbaafc0eba0a9030f447b5185" +dependencies = [ + "num-traits", + "rand", + "rayon", +] + [[package]] name = "arrayvec" version = "0.7.2" @@ -109,27 +230,6 @@ version = "2.4.2" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "ed570934406eb16438a4e976b1b4500774099c13b8cb96eec99f620f05090ddf" -[[package]] -name = "bitvec" -version = "1.0.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1bc2832c24239b0141d5674bb9174f9d68a8b5b3f2753311927c172ca46f7e9c" -dependencies = [ - "funty", - "radium", - "tap", - "wyz", -] - -[[package]] -name = "block-buffer" -version = "0.9.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4152116fd6e9dadb291ae18fc1ec3575ed6d84c29642d97890f4b4a3417297e4" -dependencies = [ - "generic-array", -] - [[package]] name = "block-buffer" version = "0.10.2" @@ -139,20 +239,6 @@ dependencies = [ "generic-array", ] -[[package]] -name = "bls12_381" -version = "0.8.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d7bc6d6292be3a19e6379786dac800f551e5865a5bb51ebbe3064ab80433f403" -dependencies = [ - "digest 0.9.0", - "ff", - "group", - "pairing", - "rand_core", - "subtle", -] - [[package]] name = "bnum" version = "0.11.0" @@ -247,7 +333,7 @@ dependencies = [ "hex", "schemars", "serde", - "sha2 0.10.8", + "sha2", "static_assertions", "thiserror", ] @@ -256,17 +342,20 @@ dependencies = [ name = "cosmwasm-crypto" version = "2.0.1" dependencies = [ - "bls12_381", + "ark-bls12-381", + "ark-ec", + "ark-ff", + "ark-serialize", "derive_more", - "digest 0.10.7", + "digest", "ecdsa", "ed25519-zebra", "k256", + "num-traits", "p256", - "pairing", "rand_core", "rayon", - "sha2 0.9.9", + "sha2", "thiserror", ] @@ -314,7 +403,7 @@ dependencies = [ "schemars", "serde", "serde-json-wasm", - "sha2 0.10.8", + "sha2", "thiserror", ] @@ -334,7 +423,7 @@ dependencies = [ "schemars", "serde", "serde_json", - "sha2 0.10.8", + "sha2", "strum", "thiserror", "tracing", @@ -513,8 +602,10 @@ dependencies = [ name = "crypto-verify" version = "0.0.0" dependencies = [ + "ark-bls12-381", + "ark-ec", + "ark-serialize", "base64", - "bls12_381", "cosmwasm-schema", "cosmwasm-std", "cosmwasm-vm", @@ -524,7 +615,7 @@ dependencies = [ "rlp", "schemars", "serde", - "sha2 0.10.8", + "sha2", "sha3", ] @@ -537,7 +628,7 @@ dependencies = [ "cfg-if", "cpufeatures", "curve25519-dalek-derive", - "digest 0.10.7", + "digest", "fiat-crypto", "platforms", "rustc_version", @@ -645,22 +736,13 @@ dependencies = [ "unicode-xid", ] -[[package]] -name = "digest" -version = "0.9.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d3dd60d1080a57a05ab032377049e0591415d2b31afd7028356dbf3cc6dcb066" -dependencies = [ - "generic-array", -] - [[package]] name = "digest" version = "0.10.7" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "9ed9a281f7bc9b7576e61468ba615a66a5c8cfdff42420a70aa82701a3b1e292" dependencies = [ - "block-buffer 0.10.2", + "block-buffer", "const-oid", "crypto-common", "subtle", @@ -705,7 +787,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "a4b1e0c257a9e9f25f90ff76d7a68360ed497ee519c8e428d1825ef0000799d4" dependencies = [ "der", - "digest 0.10.7", + "digest", "elliptic-curve", "rfc6979", "signature", @@ -732,7 +814,7 @@ dependencies = [ "hashbrown 0.14.3", "hex", "rand_core", - "sha2 0.10.8", + "sha2", "zeroize", ] @@ -750,7 +832,7 @@ checksum = "b5e6043086bf7973472e0c7dff2142ea0b680d30e18d9cc40f267efbf222bd47" dependencies = [ "base16ct", "crypto-bigint", - "digest 0.10.7", + "digest", "ff", "generic-array", "group", @@ -820,7 +902,6 @@ version = "0.13.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "ded41244b729663b1e574f1b4fb731469f69f79c17667b5d776b16cda0479449" dependencies = [ - "bitvec", "rand_core", "subtle", ] @@ -837,12 +918,6 @@ version = "1.0.7" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "3f9eec918d3f24069decb9af1554cad7c880e2da24a9afd88aca000531ab82c1" -[[package]] -name = "funty" -version = "2.0.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e6d5a32815ae3f33302d95fdcb2ce17862f8c65363dcfd29360480ba1001fc9c" - [[package]] name = "fxhash" version = "0.2.1" @@ -911,6 +986,15 @@ dependencies = [ "ahash 0.7.8", ] +[[package]] +name = "hashbrown" +version = "0.13.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "43a3c133739dddd0d2990f9a4bdf8eb4b21ef50e4851ca85ab661199821d510e" +dependencies = [ + "ahash 0.8.11", +] + [[package]] name = "hashbrown" version = "0.14.3" @@ -945,7 +1029,7 @@ version = "0.12.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "6c49c37c09c17a53d937dfbb742eb3a961d65a994e6bcdcf37e7399d0cc8ab5e" dependencies = [ - "digest 0.10.7", + "digest", ] [[package]] @@ -974,6 +1058,15 @@ dependencies = [ "hashbrown 0.14.3", ] +[[package]] +name = "itertools" +version = "0.10.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b0fd2260e829bddf4cb6ea802289de2f86d6a7a690192fbe91b3f46e0f2c8473" +dependencies = [ + "either", +] + [[package]] name = "itoa" version = "0.4.7" @@ -998,7 +1091,7 @@ dependencies = [ "cfg-if", "ecdsa", "elliptic-curve", - "sha2 0.10.8", + "sha2", ] [[package]] @@ -1111,6 +1204,35 @@ version = "0.2.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "0debeb9fcf88823ea64d64e4a815ab1643f33127d995978e099942ce38f25238" +[[package]] +name = "num-bigint" +version = "0.4.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "608e7659b5c3d7cba262d894801b9ec9d00de989e8a82bd4bef91d08da45cdc0" +dependencies = [ + "autocfg", + "num-integer", + "num-traits", +] + +[[package]] +name = "num-integer" +version = "0.1.46" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7969661fd2958a5cb096e56c8e1ad0444ac2bbcd0061bd28660485a44879858f" +dependencies = [ + "num-traits", +] + +[[package]] +name = "num-traits" +version = "0.2.18" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "da0df0e5185db44f69b44f26786fe401b6c293d1907744beaa7fa62b2e5a517a" +dependencies = [ + "autocfg", +] + [[package]] name = "object" version = "0.25.3" @@ -1126,12 +1248,6 @@ version = "1.19.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "3fdb12b2476b595f9358c5161aa467c2438859caa136dec86c26fdd2efe17b92" -[[package]] -name = "opaque-debug" -version = "0.3.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c08d65885ee38876c4f86fa503fb49d7b507c2b62552df7c70b2fce627e06381" - [[package]] name = "p256" version = "0.13.2" @@ -1141,16 +1257,7 @@ dependencies = [ "ecdsa", "elliptic-curve", "primeorder", - "sha2 0.10.8", -] - -[[package]] -name = "pairing" -version = "0.23.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "81fec4625e73cf41ef4bb6846cafa6d44736525f442ba45e407c4a000a13996f" -dependencies = [ - "group", + "sha2", ] [[package]] @@ -1166,6 +1273,12 @@ dependencies = [ "windows-targets", ] +[[package]] +name = "paste" +version = "1.0.14" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "de3145af08024dea9fa9914f381a17b8fc6034dfb00f3a84013f7ff43f29ed4c" + [[package]] name = "pin-project-lite" version = "0.2.13" @@ -1188,6 +1301,12 @@ version = "3.4.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "db23d408679286588f4d4644f965003d056e3dd5abcaaa938116871d7ce2fee7" +[[package]] +name = "ppv-lite86" +version = "0.2.17" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5b40af805b3121feab8a3c29f04d8ad262fa8e0561883e7653e024ae4479e6de" + [[package]] name = "primeorder" version = "0.13.6" @@ -1260,10 +1379,24 @@ dependencies = [ ] [[package]] -name = "radium" -version = "0.7.0" +name = "rand" +version = "0.8.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "34af8d1a0e25924bc5b7c43c079c942339d8f0a8b57c39049bef581b46327404" +dependencies = [ + "rand_chacha", + "rand_core", +] + +[[package]] +name = "rand_chacha" +version = "0.3.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "dc33ff2d4973d518d823d61aa239014831e521c75da58e3df4840d3f47749d09" +checksum = "e6c10a63a0fa32252be49d21e7709d4d4baf8d231c2dbce1eaa8141b9b127d88" +dependencies = [ + "ppv-lite86", + "rand_core", +] [[package]] name = "rand_core" @@ -1539,19 +1672,6 @@ dependencies = [ "serde", ] -[[package]] -name = "sha2" -version = "0.9.9" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4d58a1e1bf39749807d89cf2d98ac2dfa0ff1cb3faa38fbb64dd88ac8013d800" -dependencies = [ - "block-buffer 0.9.0", - "cfg-if", - "cpufeatures", - "digest 0.9.0", - "opaque-debug", -] - [[package]] name = "sha2" version = "0.10.8" @@ -1560,7 +1680,7 @@ checksum = "793db75ad2bcafc3ffa7c68b215fee268f537982cd901d132f89c6343f3a3dc8" dependencies = [ "cfg-if", "cpufeatures", - "digest 0.10.7", + "digest", ] [[package]] @@ -1569,7 +1689,7 @@ version = "0.10.2" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "0a31480366ec990f395a61b7c08122d99bd40544fdb5abcfc1b06bb29994312c" dependencies = [ - "digest 0.10.7", + "digest", "keccak", ] @@ -1589,7 +1709,7 @@ version = "2.1.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "5e1788eed21689f9cf370582dfc467ef36ed9c707f073528ddafa8d83e3b8500" dependencies = [ - "digest 0.10.7", + "digest", "rand_core", ] @@ -1683,12 +1803,6 @@ dependencies = [ "unicode-ident", ] -[[package]] -name = "tap" -version = "1.0.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "55937e1799185b12863d447f42597ed69d9928686b8d88a1df17376a097d8369" - [[package]] name = "target-lexicon" version = "0.12.7" @@ -2124,15 +2238,6 @@ version = "0.48.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "1a515f5799fe4961cb532f983ce2b23082366b898e52ffbce459c86f67c8378a" -[[package]] -name = "wyz" -version = "0.5.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "05f360fc0b24296329c78fda852a1e9ae82de9cf7b27dae4b7f62f118f77b9ed" -dependencies = [ - "tap", -] - [[package]] name = "zerocopy" version = "0.7.32" diff --git a/contracts/crypto-verify/Cargo.toml b/contracts/crypto-verify/Cargo.toml index 0ee67b2acf..fb590694ea 100644 --- a/contracts/crypto-verify/Cargo.toml +++ b/contracts/crypto-verify/Cargo.toml @@ -30,7 +30,7 @@ cranelift = ["cosmwasm-vm/cranelift"] [dependencies] base64 = "0.22.0" -bls12_381 = { version = "0.8.0", default-features = false } +ark-bls12-381 = { version = "0.4.0", default-features = false } cosmwasm-schema = { path = "../../packages/schema" } cosmwasm-std = { path = "../../packages/std", features = ["cosmwasm_2_1", "iterator"] } hex = "0.4" @@ -42,5 +42,7 @@ sha2 = "0.10" sha3 = "0.10" [dev-dependencies] +ark-ec = "0.4.2" +ark-serialize = { version = "0.4.2", default-features = false } cosmwasm-vm = { path = "../../packages/vm", default-features = false, features = ["iterator"] } hex-literal = "0.4.1" diff --git a/contracts/crypto-verify/tests/integration.rs b/contracts/crypto-verify/tests/integration.rs index b21ddbd0ef..21987fafe7 100644 --- a/contracts/crypto-verify/tests/integration.rs +++ b/contracts/crypto-verify/tests/integration.rs @@ -19,7 +19,9 @@ //! 5. Anywhere you see query(deps.as_ref(), ...) you must replace it with query(&mut deps, ...) //! (Use cosmwasm_vm::testing::{init, execute, query}, instead of the contract variants). -use bls12_381::G1Affine; +use ark_bls12_381::G1Affine; +use ark_ec::AffineRepr; +use ark_serialize::CanonicalSerialize; use cosmwasm_std::{Binary, Response, Uint128}; use cosmwasm_vm::testing::{ instantiate, mock_env, mock_info, mock_instance, query, MockApi, MockQuerier, MockStorage, @@ -116,8 +118,13 @@ fn bls12_381_verifies() { let msg = build_bls_message(round, &previous_signature); + let mut serialized = [0; 48]; + G1Affine::generator() + .serialize_compressed(&mut serialized[..]) + .unwrap(); + let verify_msg = QueryMsg::VerifyBls12PairingEquality { - p: G1Affine::generator().to_compressed().into(), + p: serialized.into(), q: signature.into(), r: PK_LEO_MAINNET.into(), msg: msg.into(), @@ -142,8 +149,13 @@ fn bls12_381_errors() { let msg = build_bls_message(round, &previous_signature); + let mut serialized = [0; 48]; + G1Affine::generator() + .serialize_compressed(&mut serialized[..]) + .unwrap(); + let verify_msg = QueryMsg::VerifyBls12PairingEquality { - p: G1Affine::generator().to_compressed().into(), + p: serialized.into(), q: signature.into(), r: PK_LEO_MAINNET.into(), msg: msg.into(), diff --git a/contracts/cyberpunk/Cargo.lock b/contracts/cyberpunk/Cargo.lock index 32ea329475..c255c19a22 100644 --- a/contracts/cyberpunk/Cargo.lock +++ b/contracts/cyberpunk/Cargo.lock @@ -46,6 +46,127 @@ version = "0.2.16" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "0942ffc6dcaadf03badf6e6a2d0228460359d5e34b57ccdc720b7382dfbd5ec5" +[[package]] +name = "ark-bls12-381" +version = "0.4.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c775f0d12169cba7aae4caeb547bb6a50781c7449a8aa53793827c9ec4abf488" +dependencies = [ + "ark-ec", + "ark-ff", + "ark-serialize", + "ark-std", +] + +[[package]] +name = "ark-ec" +version = "0.4.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "defd9a439d56ac24968cca0571f598a61bc8c55f71d50a89cda591cb750670ba" +dependencies = [ + "ark-ff", + "ark-poly", + "ark-serialize", + "ark-std", + "derivative", + "hashbrown 0.13.2", + "itertools", + "num-traits", + "rayon", + "zeroize", +] + +[[package]] +name = "ark-ff" +version = "0.4.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ec847af850f44ad29048935519032c33da8aa03340876d351dfab5660d2966ba" +dependencies = [ + "ark-ff-asm", + "ark-ff-macros", + "ark-serialize", + "ark-std", + "derivative", + "digest", + "itertools", + "num-bigint", + "num-traits", + "paste", + "rayon", + "rustc_version", + "zeroize", +] + +[[package]] +name = "ark-ff-asm" +version = "0.4.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3ed4aa4fe255d0bc6d79373f7e31d2ea147bcf486cba1be5ba7ea85abdb92348" +dependencies = [ + "quote", + "syn 1.0.109", +] + +[[package]] +name = "ark-ff-macros" +version = "0.4.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7abe79b0e4288889c4574159ab790824d0033b9fdcb2a112a3182fac2e514565" +dependencies = [ + "num-bigint", + "num-traits", + "proc-macro2", + "quote", + "syn 1.0.109", +] + +[[package]] +name = "ark-poly" +version = "0.4.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d320bfc44ee185d899ccbadfa8bc31aab923ce1558716e1997a1e74057fe86bf" +dependencies = [ + "ark-ff", + "ark-serialize", + "ark-std", + "derivative", + "hashbrown 0.13.2", +] + +[[package]] +name = "ark-serialize" +version = "0.4.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "adb7b85a02b83d2f22f89bd5cac66c9c89474240cb6207cb1efc16d098e822a5" +dependencies = [ + "ark-serialize-derive", + "ark-std", + "digest", + "num-bigint", +] + +[[package]] +name = "ark-serialize-derive" +version = "0.4.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ae3281bc6d0fd7e549af32b52511e1302185bd688fd3359fa36423346ff682ea" +dependencies = [ + "proc-macro2", + "quote", + "syn 1.0.109", +] + +[[package]] +name = "ark-std" +version = "0.4.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "94893f1e0c6eeab764ade8dc4c0db24caf4fe7cbbaafc0eba0a9030f447b5185" +dependencies = [ + "num-traits", + "rand", + "rayon", +] + [[package]] name = "arrayref" version = "0.3.6" @@ -115,18 +236,6 @@ version = "2.4.2" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "ed570934406eb16438a4e976b1b4500774099c13b8cb96eec99f620f05090ddf" -[[package]] -name = "bitvec" -version = "1.0.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1bc2832c24239b0141d5674bb9174f9d68a8b5b3f2753311927c172ca46f7e9c" -dependencies = [ - "funty", - "radium", - "tap", - "wyz", -] - [[package]] name = "blake2b_simd" version = "1.0.2" @@ -138,15 +247,6 @@ dependencies = [ "constant_time_eq", ] -[[package]] -name = "block-buffer" -version = "0.9.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4152116fd6e9dadb291ae18fc1ec3575ed6d84c29642d97890f4b4a3417297e4" -dependencies = [ - "generic-array", -] - [[package]] name = "block-buffer" version = "0.10.2" @@ -156,20 +256,6 @@ dependencies = [ "generic-array", ] -[[package]] -name = "bls12_381" -version = "0.8.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d7bc6d6292be3a19e6379786dac800f551e5865a5bb51ebbe3064ab80433f403" -dependencies = [ - "digest 0.9.0", - "ff", - "group", - "pairing", - "rand_core", - "subtle", -] - [[package]] name = "bnum" version = "0.11.0" @@ -270,7 +356,7 @@ dependencies = [ "hex", "schemars", "serde", - "sha2 0.10.8", + "sha2", "static_assertions", "thiserror", ] @@ -279,17 +365,20 @@ dependencies = [ name = "cosmwasm-crypto" version = "2.0.1" dependencies = [ - "bls12_381", + "ark-bls12-381", + "ark-ec", + "ark-ff", + "ark-serialize", "derive_more", - "digest 0.10.7", + "digest", "ecdsa", "ed25519-zebra", "k256", + "num-traits", "p256", - "pairing", "rand_core", "rayon", - "sha2 0.9.9", + "sha2", "thiserror", ] @@ -337,7 +426,7 @@ dependencies = [ "schemars", "serde", "serde-json-wasm", - "sha2 0.10.8", + "sha2", "thiserror", ] @@ -357,7 +446,7 @@ dependencies = [ "schemars", "serde", "serde_json", - "sha2 0.10.8", + "sha2", "strum", "thiserror", "tracing", @@ -541,7 +630,7 @@ dependencies = [ "cfg-if", "cpufeatures", "curve25519-dalek-derive", - "digest 0.10.7", + "digest", "fiat-crypto", "platforms", "rustc_version", @@ -661,22 +750,13 @@ dependencies = [ "unicode-xid", ] -[[package]] -name = "digest" -version = "0.9.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d3dd60d1080a57a05ab032377049e0591415d2b31afd7028356dbf3cc6dcb066" -dependencies = [ - "generic-array", -] - [[package]] name = "digest" version = "0.10.7" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "9ed9a281f7bc9b7576e61468ba615a66a5c8cfdff42420a70aa82701a3b1e292" dependencies = [ - "block-buffer 0.10.2", + "block-buffer", "const-oid", "crypto-common", "subtle", @@ -721,7 +801,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "a4b1e0c257a9e9f25f90ff76d7a68360ed497ee519c8e428d1825ef0000799d4" dependencies = [ "der", - "digest 0.10.7", + "digest", "elliptic-curve", "rfc6979", "signature", @@ -747,7 +827,7 @@ dependencies = [ "hashbrown 0.14.3", "hex", "rand_core", - "sha2 0.10.8", + "sha2", "zeroize", ] @@ -765,7 +845,7 @@ checksum = "b5e6043086bf7973472e0c7dff2142ea0b680d30e18d9cc40f267efbf222bd47" dependencies = [ "base16ct", "crypto-bigint", - "digest 0.10.7", + "digest", "ff", "generic-array", "group", @@ -864,7 +944,6 @@ version = "0.13.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "ded41244b729663b1e574f1b4fb731469f69f79c17667b5d776b16cda0479449" dependencies = [ - "bitvec", "rand_core", "subtle", ] @@ -881,12 +960,6 @@ version = "1.0.7" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "3f9eec918d3f24069decb9af1554cad7c880e2da24a9afd88aca000531ab82c1" -[[package]] -name = "funty" -version = "2.0.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e6d5a32815ae3f33302d95fdcb2ce17862f8c65363dcfd29360480ba1001fc9c" - [[package]] name = "fxhash" version = "0.2.1" @@ -955,6 +1028,15 @@ dependencies = [ "ahash 0.7.8", ] +[[package]] +name = "hashbrown" +version = "0.13.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "43a3c133739dddd0d2990f9a4bdf8eb4b21ef50e4851ca85ab661199821d510e" +dependencies = [ + "ahash 0.8.11", +] + [[package]] name = "hashbrown" version = "0.14.3" @@ -989,7 +1071,7 @@ version = "0.12.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "6c49c37c09c17a53d937dfbb742eb3a961d65a994e6bcdcf37e7399d0cc8ab5e" dependencies = [ - "digest 0.10.7", + "digest", ] [[package]] @@ -1038,6 +1120,15 @@ dependencies = [ "windows-sys 0.48.0", ] +[[package]] +name = "itertools" +version = "0.10.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b0fd2260e829bddf4cb6ea802289de2f86d6a7a690192fbe91b3f46e0f2c8473" +dependencies = [ + "either", +] + [[package]] name = "itoa" version = "0.4.7" @@ -1062,7 +1153,7 @@ dependencies = [ "cfg-if", "ecdsa", "elliptic-curve", - "sha2 0.10.8", + "sha2", ] [[package]] @@ -1175,6 +1266,35 @@ version = "0.2.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "0debeb9fcf88823ea64d64e4a815ab1643f33127d995978e099942ce38f25238" +[[package]] +name = "num-bigint" +version = "0.4.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "608e7659b5c3d7cba262d894801b9ec9d00de989e8a82bd4bef91d08da45cdc0" +dependencies = [ + "autocfg", + "num-integer", + "num-traits", +] + +[[package]] +name = "num-integer" +version = "0.1.46" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7969661fd2958a5cb096e56c8e1ad0444ac2bbcd0061bd28660485a44879858f" +dependencies = [ + "num-traits", +] + +[[package]] +name = "num-traits" +version = "0.2.18" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "da0df0e5185db44f69b44f26786fe401b6c293d1907744beaa7fa62b2e5a517a" +dependencies = [ + "autocfg", +] + [[package]] name = "object" version = "0.25.3" @@ -1190,12 +1310,6 @@ version = "1.19.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "3fdb12b2476b595f9358c5161aa467c2438859caa136dec86c26fdd2efe17b92" -[[package]] -name = "opaque-debug" -version = "0.3.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c08d65885ee38876c4f86fa503fb49d7b507c2b62552df7c70b2fce627e06381" - [[package]] name = "p256" version = "0.13.2" @@ -1205,16 +1319,7 @@ dependencies = [ "ecdsa", "elliptic-curve", "primeorder", - "sha2 0.10.8", -] - -[[package]] -name = "pairing" -version = "0.23.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "81fec4625e73cf41ef4bb6846cafa6d44736525f442ba45e407c4a000a13996f" -dependencies = [ - "group", + "sha2", ] [[package]] @@ -1230,6 +1335,12 @@ dependencies = [ "windows-targets 0.48.0", ] +[[package]] +name = "paste" +version = "1.0.14" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "de3145af08024dea9fa9914f381a17b8fc6034dfb00f3a84013f7ff43f29ed4c" + [[package]] name = "pin-project-lite" version = "0.2.13" @@ -1242,6 +1353,12 @@ version = "3.4.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "db23d408679286588f4d4644f965003d056e3dd5abcaaa938116871d7ce2fee7" +[[package]] +name = "ppv-lite86" +version = "0.2.17" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5b40af805b3121feab8a3c29f04d8ad262fa8e0561883e7653e024ae4479e6de" + [[package]] name = "primeorder" version = "0.13.6" @@ -1314,10 +1431,24 @@ dependencies = [ ] [[package]] -name = "radium" -version = "0.7.0" +name = "rand" +version = "0.8.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "34af8d1a0e25924bc5b7c43c079c942339d8f0a8b57c39049bef581b46327404" +dependencies = [ + "rand_chacha", + "rand_core", +] + +[[package]] +name = "rand_chacha" +version = "0.3.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "dc33ff2d4973d518d823d61aa239014831e521c75da58e3df4840d3f47749d09" +checksum = "e6c10a63a0fa32252be49d21e7709d4d4baf8d231c2dbce1eaa8141b9b127d88" +dependencies = [ + "ppv-lite86", + "rand_core", +] [[package]] name = "rand_core" @@ -1601,19 +1732,6 @@ dependencies = [ "serde", ] -[[package]] -name = "sha2" -version = "0.9.9" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4d58a1e1bf39749807d89cf2d98ac2dfa0ff1cb3faa38fbb64dd88ac8013d800" -dependencies = [ - "block-buffer 0.9.0", - "cfg-if", - "cpufeatures", - "digest 0.9.0", - "opaque-debug", -] - [[package]] name = "sha2" version = "0.10.8" @@ -1622,7 +1740,7 @@ checksum = "793db75ad2bcafc3ffa7c68b215fee268f537982cd901d132f89c6343f3a3dc8" dependencies = [ "cfg-if", "cpufeatures", - "digest 0.10.7", + "digest", ] [[package]] @@ -1641,7 +1759,7 @@ version = "2.1.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "5e1788eed21689f9cf370582dfc467ef36ed9c707f073528ddafa8d83e3b8500" dependencies = [ - "digest 0.10.7", + "digest", "rand_core", ] @@ -1725,12 +1843,6 @@ dependencies = [ "unicode-ident", ] -[[package]] -name = "tap" -version = "1.0.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "55937e1799185b12863d447f42597ed69d9928686b8d88a1df17376a097d8369" - [[package]] name = "target-lexicon" version = "0.12.7" @@ -2254,15 +2366,6 @@ version = "0.48.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "1a515f5799fe4961cb532f983ce2b23082366b898e52ffbce459c86f67c8378a" -[[package]] -name = "wyz" -version = "0.5.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "05f360fc0b24296329c78fda852a1e9ae82de9cf7b27dae4b7f62f118f77b9ed" -dependencies = [ - "tap", -] - [[package]] name = "zerocopy" version = "0.7.32" diff --git a/contracts/empty/Cargo.lock b/contracts/empty/Cargo.lock index 5d2e495e8b..025932dd23 100644 --- a/contracts/empty/Cargo.lock +++ b/contracts/empty/Cargo.lock @@ -46,6 +46,127 @@ version = "0.2.16" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "0942ffc6dcaadf03badf6e6a2d0228460359d5e34b57ccdc720b7382dfbd5ec5" +[[package]] +name = "ark-bls12-381" +version = "0.4.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c775f0d12169cba7aae4caeb547bb6a50781c7449a8aa53793827c9ec4abf488" +dependencies = [ + "ark-ec", + "ark-ff", + "ark-serialize", + "ark-std", +] + +[[package]] +name = "ark-ec" +version = "0.4.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "defd9a439d56ac24968cca0571f598a61bc8c55f71d50a89cda591cb750670ba" +dependencies = [ + "ark-ff", + "ark-poly", + "ark-serialize", + "ark-std", + "derivative", + "hashbrown 0.13.2", + "itertools", + "num-traits", + "rayon", + "zeroize", +] + +[[package]] +name = "ark-ff" +version = "0.4.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ec847af850f44ad29048935519032c33da8aa03340876d351dfab5660d2966ba" +dependencies = [ + "ark-ff-asm", + "ark-ff-macros", + "ark-serialize", + "ark-std", + "derivative", + "digest", + "itertools", + "num-bigint", + "num-traits", + "paste", + "rayon", + "rustc_version", + "zeroize", +] + +[[package]] +name = "ark-ff-asm" +version = "0.4.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3ed4aa4fe255d0bc6d79373f7e31d2ea147bcf486cba1be5ba7ea85abdb92348" +dependencies = [ + "quote", + "syn 1.0.109", +] + +[[package]] +name = "ark-ff-macros" +version = "0.4.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7abe79b0e4288889c4574159ab790824d0033b9fdcb2a112a3182fac2e514565" +dependencies = [ + "num-bigint", + "num-traits", + "proc-macro2", + "quote", + "syn 1.0.109", +] + +[[package]] +name = "ark-poly" +version = "0.4.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d320bfc44ee185d899ccbadfa8bc31aab923ce1558716e1997a1e74057fe86bf" +dependencies = [ + "ark-ff", + "ark-serialize", + "ark-std", + "derivative", + "hashbrown 0.13.2", +] + +[[package]] +name = "ark-serialize" +version = "0.4.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "adb7b85a02b83d2f22f89bd5cac66c9c89474240cb6207cb1efc16d098e822a5" +dependencies = [ + "ark-serialize-derive", + "ark-std", + "digest", + "num-bigint", +] + +[[package]] +name = "ark-serialize-derive" +version = "0.4.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ae3281bc6d0fd7e549af32b52511e1302185bd688fd3359fa36423346ff682ea" +dependencies = [ + "proc-macro2", + "quote", + "syn 1.0.109", +] + +[[package]] +name = "ark-std" +version = "0.4.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "94893f1e0c6eeab764ade8dc4c0db24caf4fe7cbbaafc0eba0a9030f447b5185" +dependencies = [ + "num-traits", + "rand", + "rayon", +] + [[package]] name = "arrayvec" version = "0.7.2" @@ -103,27 +224,6 @@ version = "2.4.2" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "ed570934406eb16438a4e976b1b4500774099c13b8cb96eec99f620f05090ddf" -[[package]] -name = "bitvec" -version = "1.0.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1bc2832c24239b0141d5674bb9174f9d68a8b5b3f2753311927c172ca46f7e9c" -dependencies = [ - "funty", - "radium", - "tap", - "wyz", -] - -[[package]] -name = "block-buffer" -version = "0.9.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4152116fd6e9dadb291ae18fc1ec3575ed6d84c29642d97890f4b4a3417297e4" -dependencies = [ - "generic-array", -] - [[package]] name = "block-buffer" version = "0.10.2" @@ -133,20 +233,6 @@ dependencies = [ "generic-array", ] -[[package]] -name = "bls12_381" -version = "0.8.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d7bc6d6292be3a19e6379786dac800f551e5865a5bb51ebbe3064ab80433f403" -dependencies = [ - "digest 0.9.0", - "ff", - "group", - "pairing", - "rand_core", - "subtle", -] - [[package]] name = "bnum" version = "0.11.0" @@ -241,7 +327,7 @@ dependencies = [ "hex", "schemars", "serde", - "sha2 0.10.8", + "sha2", "static_assertions", "thiserror", ] @@ -250,17 +336,20 @@ dependencies = [ name = "cosmwasm-crypto" version = "2.0.1" dependencies = [ - "bls12_381", + "ark-bls12-381", + "ark-ec", + "ark-ff", + "ark-serialize", "derive_more", - "digest 0.10.7", + "digest", "ecdsa", "ed25519-zebra", "k256", + "num-traits", "p256", - "pairing", "rand_core", "rayon", - "sha2 0.9.9", + "sha2", "thiserror", ] @@ -308,7 +397,7 @@ dependencies = [ "schemars", "serde", "serde-json-wasm", - "sha2 0.10.8", + "sha2", "thiserror", ] @@ -328,7 +417,7 @@ dependencies = [ "schemars", "serde", "serde_json", - "sha2 0.10.8", + "sha2", "strum", "thiserror", "tracing", @@ -512,7 +601,7 @@ dependencies = [ "cfg-if", "cpufeatures", "curve25519-dalek-derive", - "digest 0.10.7", + "digest", "fiat-crypto", "platforms", "rustc_version", @@ -620,22 +709,13 @@ dependencies = [ "unicode-xid", ] -[[package]] -name = "digest" -version = "0.9.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d3dd60d1080a57a05ab032377049e0591415d2b31afd7028356dbf3cc6dcb066" -dependencies = [ - "generic-array", -] - [[package]] name = "digest" version = "0.10.7" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "9ed9a281f7bc9b7576e61468ba615a66a5c8cfdff42420a70aa82701a3b1e292" dependencies = [ - "block-buffer 0.10.2", + "block-buffer", "const-oid", "crypto-common", "subtle", @@ -680,7 +760,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "a4b1e0c257a9e9f25f90ff76d7a68360ed497ee519c8e428d1825ef0000799d4" dependencies = [ "der", - "digest 0.10.7", + "digest", "elliptic-curve", "rfc6979", "signature", @@ -706,7 +786,7 @@ dependencies = [ "hashbrown 0.14.3", "hex", "rand_core", - "sha2 0.10.8", + "sha2", "zeroize", ] @@ -724,7 +804,7 @@ checksum = "b5e6043086bf7973472e0c7dff2142ea0b680d30e18d9cc40f267efbf222bd47" dependencies = [ "base16ct", "crypto-bigint", - "digest 0.10.7", + "digest", "ff", "generic-array", "group", @@ -803,7 +883,6 @@ version = "0.13.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "ded41244b729663b1e574f1b4fb731469f69f79c17667b5d776b16cda0479449" dependencies = [ - "bitvec", "rand_core", "subtle", ] @@ -820,12 +899,6 @@ version = "1.0.7" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "3f9eec918d3f24069decb9af1554cad7c880e2da24a9afd88aca000531ab82c1" -[[package]] -name = "funty" -version = "2.0.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e6d5a32815ae3f33302d95fdcb2ce17862f8c65363dcfd29360480ba1001fc9c" - [[package]] name = "fxhash" version = "0.2.1" @@ -894,6 +967,15 @@ dependencies = [ "ahash 0.7.8", ] +[[package]] +name = "hashbrown" +version = "0.13.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "43a3c133739dddd0d2990f9a4bdf8eb4b21ef50e4851ca85ab661199821d510e" +dependencies = [ + "ahash 0.8.11", +] + [[package]] name = "hashbrown" version = "0.14.3" @@ -922,7 +1004,7 @@ version = "0.12.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "6c49c37c09c17a53d937dfbb742eb3a961d65a994e6bcdcf37e7399d0cc8ab5e" dependencies = [ - "digest 0.10.7", + "digest", ] [[package]] @@ -951,6 +1033,15 @@ dependencies = [ "hashbrown 0.14.3", ] +[[package]] +name = "itertools" +version = "0.10.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b0fd2260e829bddf4cb6ea802289de2f86d6a7a690192fbe91b3f46e0f2c8473" +dependencies = [ + "either", +] + [[package]] name = "itoa" version = "0.4.7" @@ -975,7 +1066,7 @@ dependencies = [ "cfg-if", "ecdsa", "elliptic-curve", - "sha2 0.10.8", + "sha2", ] [[package]] @@ -1082,6 +1173,35 @@ version = "0.2.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "0debeb9fcf88823ea64d64e4a815ab1643f33127d995978e099942ce38f25238" +[[package]] +name = "num-bigint" +version = "0.4.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "608e7659b5c3d7cba262d894801b9ec9d00de989e8a82bd4bef91d08da45cdc0" +dependencies = [ + "autocfg", + "num-integer", + "num-traits", +] + +[[package]] +name = "num-integer" +version = "0.1.46" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7969661fd2958a5cb096e56c8e1ad0444ac2bbcd0061bd28660485a44879858f" +dependencies = [ + "num-traits", +] + +[[package]] +name = "num-traits" +version = "0.2.18" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "da0df0e5185db44f69b44f26786fe401b6c293d1907744beaa7fa62b2e5a517a" +dependencies = [ + "autocfg", +] + [[package]] name = "object" version = "0.25.3" @@ -1097,12 +1217,6 @@ version = "1.19.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "3fdb12b2476b595f9358c5161aa467c2438859caa136dec86c26fdd2efe17b92" -[[package]] -name = "opaque-debug" -version = "0.3.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c08d65885ee38876c4f86fa503fb49d7b507c2b62552df7c70b2fce627e06381" - [[package]] name = "p256" version = "0.13.2" @@ -1112,16 +1226,7 @@ dependencies = [ "ecdsa", "elliptic-curve", "primeorder", - "sha2 0.10.8", -] - -[[package]] -name = "pairing" -version = "0.23.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "81fec4625e73cf41ef4bb6846cafa6d44736525f442ba45e407c4a000a13996f" -dependencies = [ - "group", + "sha2", ] [[package]] @@ -1137,6 +1242,12 @@ dependencies = [ "windows-targets", ] +[[package]] +name = "paste" +version = "1.0.14" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "de3145af08024dea9fa9914f381a17b8fc6034dfb00f3a84013f7ff43f29ed4c" + [[package]] name = "pin-project-lite" version = "0.2.13" @@ -1149,6 +1260,12 @@ version = "3.4.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "db23d408679286588f4d4644f965003d056e3dd5abcaaa938116871d7ce2fee7" +[[package]] +name = "ppv-lite86" +version = "0.2.17" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5b40af805b3121feab8a3c29f04d8ad262fa8e0561883e7653e024ae4479e6de" + [[package]] name = "primeorder" version = "0.13.6" @@ -1221,10 +1338,24 @@ dependencies = [ ] [[package]] -name = "radium" -version = "0.7.0" +name = "rand" +version = "0.8.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "34af8d1a0e25924bc5b7c43c079c942339d8f0a8b57c39049bef581b46327404" +dependencies = [ + "rand_chacha", + "rand_core", +] + +[[package]] +name = "rand_chacha" +version = "0.3.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "dc33ff2d4973d518d823d61aa239014831e521c75da58e3df4840d3f47749d09" +checksum = "e6c10a63a0fa32252be49d21e7709d4d4baf8d231c2dbce1eaa8141b9b127d88" +dependencies = [ + "ppv-lite86", + "rand_core", +] [[package]] name = "rand_core" @@ -1483,19 +1614,6 @@ dependencies = [ "serde", ] -[[package]] -name = "sha2" -version = "0.9.9" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4d58a1e1bf39749807d89cf2d98ac2dfa0ff1cb3faa38fbb64dd88ac8013d800" -dependencies = [ - "block-buffer 0.9.0", - "cfg-if", - "cpufeatures", - "digest 0.9.0", - "opaque-debug", -] - [[package]] name = "sha2" version = "0.10.8" @@ -1504,7 +1622,7 @@ checksum = "793db75ad2bcafc3ffa7c68b215fee268f537982cd901d132f89c6343f3a3dc8" dependencies = [ "cfg-if", "cpufeatures", - "digest 0.10.7", + "digest", ] [[package]] @@ -1523,7 +1641,7 @@ version = "2.1.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "5e1788eed21689f9cf370582dfc467ef36ed9c707f073528ddafa8d83e3b8500" dependencies = [ - "digest 0.10.7", + "digest", "rand_core", ] @@ -1607,12 +1725,6 @@ dependencies = [ "unicode-ident", ] -[[package]] -name = "tap" -version = "1.0.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "55937e1799185b12863d447f42597ed69d9928686b8d88a1df17376a097d8369" - [[package]] name = "target-lexicon" version = "0.12.7" @@ -2048,15 +2160,6 @@ version = "0.48.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "1a515f5799fe4961cb532f983ce2b23082366b898e52ffbce459c86f67c8378a" -[[package]] -name = "wyz" -version = "0.5.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "05f360fc0b24296329c78fda852a1e9ae82de9cf7b27dae4b7f62f118f77b9ed" -dependencies = [ - "tap", -] - [[package]] name = "zerocopy" version = "0.7.32" diff --git a/contracts/floaty/Cargo.lock b/contracts/floaty/Cargo.lock index 5bda65ffef..549f88a7a4 100644 --- a/contracts/floaty/Cargo.lock +++ b/contracts/floaty/Cargo.lock @@ -46,6 +46,127 @@ version = "0.2.16" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "0942ffc6dcaadf03badf6e6a2d0228460359d5e34b57ccdc720b7382dfbd5ec5" +[[package]] +name = "ark-bls12-381" +version = "0.4.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c775f0d12169cba7aae4caeb547bb6a50781c7449a8aa53793827c9ec4abf488" +dependencies = [ + "ark-ec", + "ark-ff", + "ark-serialize", + "ark-std", +] + +[[package]] +name = "ark-ec" +version = "0.4.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "defd9a439d56ac24968cca0571f598a61bc8c55f71d50a89cda591cb750670ba" +dependencies = [ + "ark-ff", + "ark-poly", + "ark-serialize", + "ark-std", + "derivative", + "hashbrown 0.13.2", + "itertools", + "num-traits", + "rayon", + "zeroize", +] + +[[package]] +name = "ark-ff" +version = "0.4.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ec847af850f44ad29048935519032c33da8aa03340876d351dfab5660d2966ba" +dependencies = [ + "ark-ff-asm", + "ark-ff-macros", + "ark-serialize", + "ark-std", + "derivative", + "digest", + "itertools", + "num-bigint", + "num-traits", + "paste", + "rayon", + "rustc_version", + "zeroize", +] + +[[package]] +name = "ark-ff-asm" +version = "0.4.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3ed4aa4fe255d0bc6d79373f7e31d2ea147bcf486cba1be5ba7ea85abdb92348" +dependencies = [ + "quote", + "syn 1.0.109", +] + +[[package]] +name = "ark-ff-macros" +version = "0.4.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7abe79b0e4288889c4574159ab790824d0033b9fdcb2a112a3182fac2e514565" +dependencies = [ + "num-bigint", + "num-traits", + "proc-macro2", + "quote", + "syn 1.0.109", +] + +[[package]] +name = "ark-poly" +version = "0.4.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d320bfc44ee185d899ccbadfa8bc31aab923ce1558716e1997a1e74057fe86bf" +dependencies = [ + "ark-ff", + "ark-serialize", + "ark-std", + "derivative", + "hashbrown 0.13.2", +] + +[[package]] +name = "ark-serialize" +version = "0.4.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "adb7b85a02b83d2f22f89bd5cac66c9c89474240cb6207cb1efc16d098e822a5" +dependencies = [ + "ark-serialize-derive", + "ark-std", + "digest", + "num-bigint", +] + +[[package]] +name = "ark-serialize-derive" +version = "0.4.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ae3281bc6d0fd7e549af32b52511e1302185bd688fd3359fa36423346ff682ea" +dependencies = [ + "proc-macro2", + "quote", + "syn 1.0.109", +] + +[[package]] +name = "ark-std" +version = "0.4.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "94893f1e0c6eeab764ade8dc4c0db24caf4fe7cbbaafc0eba0a9030f447b5185" +dependencies = [ + "num-traits", + "rand", + "rayon", +] + [[package]] name = "arrayvec" version = "0.7.2" @@ -103,27 +224,6 @@ version = "2.4.2" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "ed570934406eb16438a4e976b1b4500774099c13b8cb96eec99f620f05090ddf" -[[package]] -name = "bitvec" -version = "1.0.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1bc2832c24239b0141d5674bb9174f9d68a8b5b3f2753311927c172ca46f7e9c" -dependencies = [ - "funty", - "radium", - "tap", - "wyz", -] - -[[package]] -name = "block-buffer" -version = "0.9.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4152116fd6e9dadb291ae18fc1ec3575ed6d84c29642d97890f4b4a3417297e4" -dependencies = [ - "generic-array", -] - [[package]] name = "block-buffer" version = "0.10.2" @@ -133,20 +233,6 @@ dependencies = [ "generic-array", ] -[[package]] -name = "bls12_381" -version = "0.8.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d7bc6d6292be3a19e6379786dac800f551e5865a5bb51ebbe3064ab80433f403" -dependencies = [ - "digest 0.9.0", - "ff", - "group", - "pairing", - "rand_core", - "subtle", -] - [[package]] name = "bnum" version = "0.11.0" @@ -241,7 +327,7 @@ dependencies = [ "hex", "schemars", "serde", - "sha2 0.10.8", + "sha2", "static_assertions", "thiserror", ] @@ -250,17 +336,20 @@ dependencies = [ name = "cosmwasm-crypto" version = "2.0.1" dependencies = [ - "bls12_381", + "ark-bls12-381", + "ark-ec", + "ark-ff", + "ark-serialize", "derive_more", - "digest 0.10.7", + "digest", "ecdsa", "ed25519-zebra", "k256", + "num-traits", "p256", - "pairing", "rand_core", "rayon", - "sha2 0.9.9", + "sha2", "thiserror", ] @@ -308,7 +397,7 @@ dependencies = [ "schemars", "serde", "serde-json-wasm", - "sha2 0.10.8", + "sha2", "thiserror", ] @@ -328,7 +417,7 @@ dependencies = [ "schemars", "serde", "serde_json", - "sha2 0.10.8", + "sha2", "strum", "thiserror", "tracing", @@ -512,7 +601,7 @@ dependencies = [ "cfg-if", "cpufeatures", "curve25519-dalek-derive", - "digest 0.10.7", + "digest", "fiat-crypto", "platforms", "rustc_version", @@ -620,22 +709,13 @@ dependencies = [ "unicode-xid", ] -[[package]] -name = "digest" -version = "0.9.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d3dd60d1080a57a05ab032377049e0591415d2b31afd7028356dbf3cc6dcb066" -dependencies = [ - "generic-array", -] - [[package]] name = "digest" version = "0.10.7" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "9ed9a281f7bc9b7576e61468ba615a66a5c8cfdff42420a70aa82701a3b1e292" dependencies = [ - "block-buffer 0.10.2", + "block-buffer", "const-oid", "crypto-common", "subtle", @@ -680,7 +760,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "a4b1e0c257a9e9f25f90ff76d7a68360ed497ee519c8e428d1825ef0000799d4" dependencies = [ "der", - "digest 0.10.7", + "digest", "elliptic-curve", "rfc6979", "signature", @@ -706,7 +786,7 @@ dependencies = [ "hashbrown 0.14.3", "hex", "rand_core", - "sha2 0.10.8", + "sha2", "zeroize", ] @@ -724,7 +804,7 @@ checksum = "b5e6043086bf7973472e0c7dff2142ea0b680d30e18d9cc40f267efbf222bd47" dependencies = [ "base16ct", "crypto-bigint", - "digest 0.10.7", + "digest", "ff", "generic-array", "group", @@ -793,7 +873,6 @@ version = "0.13.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "ded41244b729663b1e574f1b4fb731469f69f79c17667b5d776b16cda0479449" dependencies = [ - "bitvec", "rand_core", "subtle", ] @@ -822,12 +901,6 @@ version = "1.0.7" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "3f9eec918d3f24069decb9af1554cad7c880e2da24a9afd88aca000531ab82c1" -[[package]] -name = "funty" -version = "2.0.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e6d5a32815ae3f33302d95fdcb2ce17862f8c65363dcfd29360480ba1001fc9c" - [[package]] name = "fxhash" version = "0.2.1" @@ -896,6 +969,15 @@ dependencies = [ "ahash 0.7.8", ] +[[package]] +name = "hashbrown" +version = "0.13.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "43a3c133739dddd0d2990f9a4bdf8eb4b21ef50e4851ca85ab661199821d510e" +dependencies = [ + "ahash 0.8.11", +] + [[package]] name = "hashbrown" version = "0.14.3" @@ -924,7 +1006,7 @@ version = "0.12.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "6c49c37c09c17a53d937dfbb742eb3a961d65a994e6bcdcf37e7399d0cc8ab5e" dependencies = [ - "digest 0.10.7", + "digest", ] [[package]] @@ -953,6 +1035,15 @@ dependencies = [ "hashbrown 0.14.3", ] +[[package]] +name = "itertools" +version = "0.10.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b0fd2260e829bddf4cb6ea802289de2f86d6a7a690192fbe91b3f46e0f2c8473" +dependencies = [ + "either", +] + [[package]] name = "itoa" version = "0.4.7" @@ -977,7 +1068,7 @@ dependencies = [ "cfg-if", "ecdsa", "elliptic-curve", - "sha2 0.10.8", + "sha2", ] [[package]] @@ -1084,6 +1175,35 @@ version = "0.2.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "0debeb9fcf88823ea64d64e4a815ab1643f33127d995978e099942ce38f25238" +[[package]] +name = "num-bigint" +version = "0.4.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "608e7659b5c3d7cba262d894801b9ec9d00de989e8a82bd4bef91d08da45cdc0" +dependencies = [ + "autocfg", + "num-integer", + "num-traits", +] + +[[package]] +name = "num-integer" +version = "0.1.46" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7969661fd2958a5cb096e56c8e1ad0444ac2bbcd0061bd28660485a44879858f" +dependencies = [ + "num-traits", +] + +[[package]] +name = "num-traits" +version = "0.2.18" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "da0df0e5185db44f69b44f26786fe401b6c293d1907744beaa7fa62b2e5a517a" +dependencies = [ + "autocfg", +] + [[package]] name = "object" version = "0.25.3" @@ -1099,12 +1219,6 @@ version = "1.19.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "3fdb12b2476b595f9358c5161aa467c2438859caa136dec86c26fdd2efe17b92" -[[package]] -name = "opaque-debug" -version = "0.3.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c08d65885ee38876c4f86fa503fb49d7b507c2b62552df7c70b2fce627e06381" - [[package]] name = "p256" version = "0.13.2" @@ -1114,16 +1228,7 @@ dependencies = [ "ecdsa", "elliptic-curve", "primeorder", - "sha2 0.10.8", -] - -[[package]] -name = "pairing" -version = "0.23.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "81fec4625e73cf41ef4bb6846cafa6d44736525f442ba45e407c4a000a13996f" -dependencies = [ - "group", + "sha2", ] [[package]] @@ -1139,6 +1244,12 @@ dependencies = [ "windows-targets", ] +[[package]] +name = "paste" +version = "1.0.14" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "de3145af08024dea9fa9914f381a17b8fc6034dfb00f3a84013f7ff43f29ed4c" + [[package]] name = "pin-project-lite" version = "0.2.13" @@ -1229,10 +1340,14 @@ dependencies = [ ] [[package]] -name = "radium" -version = "0.7.0" +name = "rand" +version = "0.8.5" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "dc33ff2d4973d518d823d61aa239014831e521c75da58e3df4840d3f47749d09" +checksum = "34af8d1a0e25924bc5b7c43c079c942339d8f0a8b57c39049bef581b46327404" +dependencies = [ + "rand_chacha", + "rand_core", +] [[package]] name = "rand_chacha" @@ -1501,19 +1616,6 @@ dependencies = [ "serde", ] -[[package]] -name = "sha2" -version = "0.9.9" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4d58a1e1bf39749807d89cf2d98ac2dfa0ff1cb3faa38fbb64dd88ac8013d800" -dependencies = [ - "block-buffer 0.9.0", - "cfg-if", - "cpufeatures", - "digest 0.9.0", - "opaque-debug", -] - [[package]] name = "sha2" version = "0.10.8" @@ -1522,7 +1624,7 @@ checksum = "793db75ad2bcafc3ffa7c68b215fee268f537982cd901d132f89c6343f3a3dc8" dependencies = [ "cfg-if", "cpufeatures", - "digest 0.10.7", + "digest", ] [[package]] @@ -1541,7 +1643,7 @@ version = "2.1.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "5e1788eed21689f9cf370582dfc467ef36ed9c707f073528ddafa8d83e3b8500" dependencies = [ - "digest 0.10.7", + "digest", "rand_core", ] @@ -1625,12 +1727,6 @@ dependencies = [ "unicode-ident", ] -[[package]] -name = "tap" -version = "1.0.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "55937e1799185b12863d447f42597ed69d9928686b8d88a1df17376a097d8369" - [[package]] name = "target-lexicon" version = "0.12.7" @@ -2066,15 +2162,6 @@ version = "0.48.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "1a515f5799fe4961cb532f983ce2b23082366b898e52ffbce459c86f67c8378a" -[[package]] -name = "wyz" -version = "0.5.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "05f360fc0b24296329c78fda852a1e9ae82de9cf7b27dae4b7f62f118f77b9ed" -dependencies = [ - "tap", -] - [[package]] name = "zerocopy" version = "0.7.32" diff --git a/contracts/hackatom/Cargo.lock b/contracts/hackatom/Cargo.lock index 2eb79c7b66..cceb6c7b35 100644 --- a/contracts/hackatom/Cargo.lock +++ b/contracts/hackatom/Cargo.lock @@ -46,6 +46,127 @@ version = "0.2.16" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "0942ffc6dcaadf03badf6e6a2d0228460359d5e34b57ccdc720b7382dfbd5ec5" +[[package]] +name = "ark-bls12-381" +version = "0.4.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c775f0d12169cba7aae4caeb547bb6a50781c7449a8aa53793827c9ec4abf488" +dependencies = [ + "ark-ec", + "ark-ff", + "ark-serialize", + "ark-std", +] + +[[package]] +name = "ark-ec" +version = "0.4.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "defd9a439d56ac24968cca0571f598a61bc8c55f71d50a89cda591cb750670ba" +dependencies = [ + "ark-ff", + "ark-poly", + "ark-serialize", + "ark-std", + "derivative", + "hashbrown 0.13.2", + "itertools", + "num-traits", + "rayon", + "zeroize", +] + +[[package]] +name = "ark-ff" +version = "0.4.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ec847af850f44ad29048935519032c33da8aa03340876d351dfab5660d2966ba" +dependencies = [ + "ark-ff-asm", + "ark-ff-macros", + "ark-serialize", + "ark-std", + "derivative", + "digest", + "itertools", + "num-bigint", + "num-traits", + "paste", + "rayon", + "rustc_version", + "zeroize", +] + +[[package]] +name = "ark-ff-asm" +version = "0.4.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3ed4aa4fe255d0bc6d79373f7e31d2ea147bcf486cba1be5ba7ea85abdb92348" +dependencies = [ + "quote", + "syn 1.0.109", +] + +[[package]] +name = "ark-ff-macros" +version = "0.4.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7abe79b0e4288889c4574159ab790824d0033b9fdcb2a112a3182fac2e514565" +dependencies = [ + "num-bigint", + "num-traits", + "proc-macro2", + "quote", + "syn 1.0.109", +] + +[[package]] +name = "ark-poly" +version = "0.4.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d320bfc44ee185d899ccbadfa8bc31aab923ce1558716e1997a1e74057fe86bf" +dependencies = [ + "ark-ff", + "ark-serialize", + "ark-std", + "derivative", + "hashbrown 0.13.2", +] + +[[package]] +name = "ark-serialize" +version = "0.4.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "adb7b85a02b83d2f22f89bd5cac66c9c89474240cb6207cb1efc16d098e822a5" +dependencies = [ + "ark-serialize-derive", + "ark-std", + "digest", + "num-bigint", +] + +[[package]] +name = "ark-serialize-derive" +version = "0.4.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ae3281bc6d0fd7e549af32b52511e1302185bd688fd3359fa36423346ff682ea" +dependencies = [ + "proc-macro2", + "quote", + "syn 1.0.109", +] + +[[package]] +name = "ark-std" +version = "0.4.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "94893f1e0c6eeab764ade8dc4c0db24caf4fe7cbbaafc0eba0a9030f447b5185" +dependencies = [ + "num-traits", + "rand", + "rayon", +] + [[package]] name = "arrayvec" version = "0.7.2" @@ -103,27 +224,6 @@ version = "2.4.2" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "ed570934406eb16438a4e976b1b4500774099c13b8cb96eec99f620f05090ddf" -[[package]] -name = "bitvec" -version = "1.0.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1bc2832c24239b0141d5674bb9174f9d68a8b5b3f2753311927c172ca46f7e9c" -dependencies = [ - "funty", - "radium", - "tap", - "wyz", -] - -[[package]] -name = "block-buffer" -version = "0.9.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4152116fd6e9dadb291ae18fc1ec3575ed6d84c29642d97890f4b4a3417297e4" -dependencies = [ - "generic-array", -] - [[package]] name = "block-buffer" version = "0.10.2" @@ -133,20 +233,6 @@ dependencies = [ "generic-array", ] -[[package]] -name = "bls12_381" -version = "0.8.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d7bc6d6292be3a19e6379786dac800f551e5865a5bb51ebbe3064ab80433f403" -dependencies = [ - "digest 0.9.0", - "ff", - "group", - "pairing", - "rand_core", - "subtle", -] - [[package]] name = "bnum" version = "0.11.0" @@ -241,7 +327,7 @@ dependencies = [ "hex", "schemars", "serde", - "sha2 0.10.8", + "sha2", "static_assertions", "thiserror", ] @@ -250,17 +336,20 @@ dependencies = [ name = "cosmwasm-crypto" version = "2.0.1" dependencies = [ - "bls12_381", + "ark-bls12-381", + "ark-ec", + "ark-ff", + "ark-serialize", "derive_more", - "digest 0.10.7", + "digest", "ecdsa", "ed25519-zebra", "k256", + "num-traits", "p256", - "pairing", "rand_core", "rayon", - "sha2 0.9.9", + "sha2", "thiserror", ] @@ -308,7 +397,7 @@ dependencies = [ "schemars", "serde", "serde-json-wasm", - "sha2 0.10.8", + "sha2", "thiserror", ] @@ -328,7 +417,7 @@ dependencies = [ "schemars", "serde", "serde_json", - "sha2 0.10.8", + "sha2", "strum", "thiserror", "tracing", @@ -512,7 +601,7 @@ dependencies = [ "cfg-if", "cpufeatures", "curve25519-dalek-derive", - "digest 0.10.7", + "digest", "fiat-crypto", "platforms", "rustc_version", @@ -620,22 +709,13 @@ dependencies = [ "unicode-xid", ] -[[package]] -name = "digest" -version = "0.9.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d3dd60d1080a57a05ab032377049e0591415d2b31afd7028356dbf3cc6dcb066" -dependencies = [ - "generic-array", -] - [[package]] name = "digest" version = "0.10.7" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "9ed9a281f7bc9b7576e61468ba615a66a5c8cfdff42420a70aa82701a3b1e292" dependencies = [ - "block-buffer 0.10.2", + "block-buffer", "const-oid", "crypto-common", "subtle", @@ -680,7 +760,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "a4b1e0c257a9e9f25f90ff76d7a68360ed497ee519c8e428d1825ef0000799d4" dependencies = [ "der", - "digest 0.10.7", + "digest", "elliptic-curve", "rfc6979", "signature", @@ -706,7 +786,7 @@ dependencies = [ "hashbrown 0.14.3", "hex", "rand_core", - "sha2 0.10.8", + "sha2", "zeroize", ] @@ -724,7 +804,7 @@ checksum = "b5e6043086bf7973472e0c7dff2142ea0b680d30e18d9cc40f267efbf222bd47" dependencies = [ "base16ct", "crypto-bigint", - "digest 0.10.7", + "digest", "ff", "generic-array", "group", @@ -793,7 +873,6 @@ version = "0.13.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "ded41244b729663b1e574f1b4fb731469f69f79c17667b5d776b16cda0479449" dependencies = [ - "bitvec", "rand_core", "subtle", ] @@ -810,12 +889,6 @@ version = "1.0.7" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "3f9eec918d3f24069decb9af1554cad7c880e2da24a9afd88aca000531ab82c1" -[[package]] -name = "funty" -version = "2.0.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e6d5a32815ae3f33302d95fdcb2ce17862f8c65363dcfd29360480ba1001fc9c" - [[package]] name = "fxhash" version = "0.2.1" @@ -884,7 +957,7 @@ dependencies = [ "cosmwasm-vm", "schemars", "serde", - "sha2 0.10.8", + "sha2", "thiserror", ] @@ -897,6 +970,15 @@ dependencies = [ "ahash 0.7.8", ] +[[package]] +name = "hashbrown" +version = "0.13.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "43a3c133739dddd0d2990f9a4bdf8eb4b21ef50e4851ca85ab661199821d510e" +dependencies = [ + "ahash 0.8.11", +] + [[package]] name = "hashbrown" version = "0.14.3" @@ -925,7 +1007,7 @@ version = "0.12.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "6c49c37c09c17a53d937dfbb742eb3a961d65a994e6bcdcf37e7399d0cc8ab5e" dependencies = [ - "digest 0.10.7", + "digest", ] [[package]] @@ -954,6 +1036,15 @@ dependencies = [ "hashbrown 0.14.3", ] +[[package]] +name = "itertools" +version = "0.10.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b0fd2260e829bddf4cb6ea802289de2f86d6a7a690192fbe91b3f46e0f2c8473" +dependencies = [ + "either", +] + [[package]] name = "itoa" version = "0.4.7" @@ -978,7 +1069,7 @@ dependencies = [ "cfg-if", "ecdsa", "elliptic-curve", - "sha2 0.10.8", + "sha2", ] [[package]] @@ -1085,6 +1176,35 @@ version = "0.2.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "0debeb9fcf88823ea64d64e4a815ab1643f33127d995978e099942ce38f25238" +[[package]] +name = "num-bigint" +version = "0.4.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "608e7659b5c3d7cba262d894801b9ec9d00de989e8a82bd4bef91d08da45cdc0" +dependencies = [ + "autocfg", + "num-integer", + "num-traits", +] + +[[package]] +name = "num-integer" +version = "0.1.46" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7969661fd2958a5cb096e56c8e1ad0444ac2bbcd0061bd28660485a44879858f" +dependencies = [ + "num-traits", +] + +[[package]] +name = "num-traits" +version = "0.2.18" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "da0df0e5185db44f69b44f26786fe401b6c293d1907744beaa7fa62b2e5a517a" +dependencies = [ + "autocfg", +] + [[package]] name = "object" version = "0.25.3" @@ -1100,12 +1220,6 @@ version = "1.19.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "3fdb12b2476b595f9358c5161aa467c2438859caa136dec86c26fdd2efe17b92" -[[package]] -name = "opaque-debug" -version = "0.3.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c08d65885ee38876c4f86fa503fb49d7b507c2b62552df7c70b2fce627e06381" - [[package]] name = "p256" version = "0.13.2" @@ -1115,16 +1229,7 @@ dependencies = [ "ecdsa", "elliptic-curve", "primeorder", - "sha2 0.10.8", -] - -[[package]] -name = "pairing" -version = "0.23.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "81fec4625e73cf41ef4bb6846cafa6d44736525f442ba45e407c4a000a13996f" -dependencies = [ - "group", + "sha2", ] [[package]] @@ -1140,6 +1245,12 @@ dependencies = [ "windows-targets", ] +[[package]] +name = "paste" +version = "1.0.14" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "de3145af08024dea9fa9914f381a17b8fc6034dfb00f3a84013f7ff43f29ed4c" + [[package]] name = "pin-project-lite" version = "0.2.13" @@ -1152,6 +1263,12 @@ version = "3.4.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "db23d408679286588f4d4644f965003d056e3dd5abcaaa938116871d7ce2fee7" +[[package]] +name = "ppv-lite86" +version = "0.2.17" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5b40af805b3121feab8a3c29f04d8ad262fa8e0561883e7653e024ae4479e6de" + [[package]] name = "primeorder" version = "0.13.6" @@ -1224,10 +1341,24 @@ dependencies = [ ] [[package]] -name = "radium" -version = "0.7.0" +name = "rand" +version = "0.8.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "34af8d1a0e25924bc5b7c43c079c942339d8f0a8b57c39049bef581b46327404" +dependencies = [ + "rand_chacha", + "rand_core", +] + +[[package]] +name = "rand_chacha" +version = "0.3.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "dc33ff2d4973d518d823d61aa239014831e521c75da58e3df4840d3f47749d09" +checksum = "e6c10a63a0fa32252be49d21e7709d4d4baf8d231c2dbce1eaa8141b9b127d88" +dependencies = [ + "ppv-lite86", + "rand_core", +] [[package]] name = "rand_core" @@ -1486,19 +1617,6 @@ dependencies = [ "serde", ] -[[package]] -name = "sha2" -version = "0.9.9" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4d58a1e1bf39749807d89cf2d98ac2dfa0ff1cb3faa38fbb64dd88ac8013d800" -dependencies = [ - "block-buffer 0.9.0", - "cfg-if", - "cpufeatures", - "digest 0.9.0", - "opaque-debug", -] - [[package]] name = "sha2" version = "0.10.8" @@ -1507,7 +1625,7 @@ checksum = "793db75ad2bcafc3ffa7c68b215fee268f537982cd901d132f89c6343f3a3dc8" dependencies = [ "cfg-if", "cpufeatures", - "digest 0.10.7", + "digest", ] [[package]] @@ -1526,7 +1644,7 @@ version = "2.1.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "5e1788eed21689f9cf370582dfc467ef36ed9c707f073528ddafa8d83e3b8500" dependencies = [ - "digest 0.10.7", + "digest", "rand_core", ] @@ -1610,12 +1728,6 @@ dependencies = [ "unicode-ident", ] -[[package]] -name = "tap" -version = "1.0.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "55937e1799185b12863d447f42597ed69d9928686b8d88a1df17376a097d8369" - [[package]] name = "target-lexicon" version = "0.12.7" @@ -2051,15 +2163,6 @@ version = "0.48.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "1a515f5799fe4961cb532f983ce2b23082366b898e52ffbce459c86f67c8378a" -[[package]] -name = "wyz" -version = "0.5.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "05f360fc0b24296329c78fda852a1e9ae82de9cf7b27dae4b7f62f118f77b9ed" -dependencies = [ - "tap", -] - [[package]] name = "zerocopy" version = "0.7.32" diff --git a/contracts/ibc-reflect-send/Cargo.lock b/contracts/ibc-reflect-send/Cargo.lock index 42124f39e8..6cc18ef2f0 100644 --- a/contracts/ibc-reflect-send/Cargo.lock +++ b/contracts/ibc-reflect-send/Cargo.lock @@ -46,6 +46,127 @@ version = "0.2.16" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "0942ffc6dcaadf03badf6e6a2d0228460359d5e34b57ccdc720b7382dfbd5ec5" +[[package]] +name = "ark-bls12-381" +version = "0.4.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c775f0d12169cba7aae4caeb547bb6a50781c7449a8aa53793827c9ec4abf488" +dependencies = [ + "ark-ec", + "ark-ff", + "ark-serialize", + "ark-std", +] + +[[package]] +name = "ark-ec" +version = "0.4.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "defd9a439d56ac24968cca0571f598a61bc8c55f71d50a89cda591cb750670ba" +dependencies = [ + "ark-ff", + "ark-poly", + "ark-serialize", + "ark-std", + "derivative", + "hashbrown 0.13.2", + "itertools", + "num-traits", + "rayon", + "zeroize", +] + +[[package]] +name = "ark-ff" +version = "0.4.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ec847af850f44ad29048935519032c33da8aa03340876d351dfab5660d2966ba" +dependencies = [ + "ark-ff-asm", + "ark-ff-macros", + "ark-serialize", + "ark-std", + "derivative", + "digest", + "itertools", + "num-bigint", + "num-traits", + "paste", + "rayon", + "rustc_version", + "zeroize", +] + +[[package]] +name = "ark-ff-asm" +version = "0.4.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3ed4aa4fe255d0bc6d79373f7e31d2ea147bcf486cba1be5ba7ea85abdb92348" +dependencies = [ + "quote", + "syn 1.0.109", +] + +[[package]] +name = "ark-ff-macros" +version = "0.4.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7abe79b0e4288889c4574159ab790824d0033b9fdcb2a112a3182fac2e514565" +dependencies = [ + "num-bigint", + "num-traits", + "proc-macro2", + "quote", + "syn 1.0.109", +] + +[[package]] +name = "ark-poly" +version = "0.4.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d320bfc44ee185d899ccbadfa8bc31aab923ce1558716e1997a1e74057fe86bf" +dependencies = [ + "ark-ff", + "ark-serialize", + "ark-std", + "derivative", + "hashbrown 0.13.2", +] + +[[package]] +name = "ark-serialize" +version = "0.4.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "adb7b85a02b83d2f22f89bd5cac66c9c89474240cb6207cb1efc16d098e822a5" +dependencies = [ + "ark-serialize-derive", + "ark-std", + "digest", + "num-bigint", +] + +[[package]] +name = "ark-serialize-derive" +version = "0.4.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ae3281bc6d0fd7e549af32b52511e1302185bd688fd3359fa36423346ff682ea" +dependencies = [ + "proc-macro2", + "quote", + "syn 1.0.109", +] + +[[package]] +name = "ark-std" +version = "0.4.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "94893f1e0c6eeab764ade8dc4c0db24caf4fe7cbbaafc0eba0a9030f447b5185" +dependencies = [ + "num-traits", + "rand", + "rayon", +] + [[package]] name = "arrayvec" version = "0.7.2" @@ -103,27 +224,6 @@ version = "2.4.2" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "ed570934406eb16438a4e976b1b4500774099c13b8cb96eec99f620f05090ddf" -[[package]] -name = "bitvec" -version = "1.0.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1bc2832c24239b0141d5674bb9174f9d68a8b5b3f2753311927c172ca46f7e9c" -dependencies = [ - "funty", - "radium", - "tap", - "wyz", -] - -[[package]] -name = "block-buffer" -version = "0.9.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4152116fd6e9dadb291ae18fc1ec3575ed6d84c29642d97890f4b4a3417297e4" -dependencies = [ - "generic-array", -] - [[package]] name = "block-buffer" version = "0.10.2" @@ -133,20 +233,6 @@ dependencies = [ "generic-array", ] -[[package]] -name = "bls12_381" -version = "0.8.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d7bc6d6292be3a19e6379786dac800f551e5865a5bb51ebbe3064ab80433f403" -dependencies = [ - "digest 0.9.0", - "ff", - "group", - "pairing", - "rand_core", - "subtle", -] - [[package]] name = "bnum" version = "0.11.0" @@ -241,7 +327,7 @@ dependencies = [ "hex", "schemars", "serde", - "sha2 0.10.8", + "sha2", "static_assertions", "thiserror", ] @@ -250,17 +336,20 @@ dependencies = [ name = "cosmwasm-crypto" version = "2.0.1" dependencies = [ - "bls12_381", + "ark-bls12-381", + "ark-ec", + "ark-ff", + "ark-serialize", "derive_more", - "digest 0.10.7", + "digest", "ecdsa", "ed25519-zebra", "k256", + "num-traits", "p256", - "pairing", "rand_core", "rayon", - "sha2 0.9.9", + "sha2", "thiserror", ] @@ -308,7 +397,7 @@ dependencies = [ "schemars", "serde", "serde-json-wasm", - "sha2 0.10.8", + "sha2", "thiserror", ] @@ -328,7 +417,7 @@ dependencies = [ "schemars", "serde", "serde_json", - "sha2 0.10.8", + "sha2", "strum", "thiserror", "tracing", @@ -512,7 +601,7 @@ dependencies = [ "cfg-if", "cpufeatures", "curve25519-dalek-derive", - "digest 0.10.7", + "digest", "fiat-crypto", "platforms", "rustc_version", @@ -620,22 +709,13 @@ dependencies = [ "unicode-xid", ] -[[package]] -name = "digest" -version = "0.9.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d3dd60d1080a57a05ab032377049e0591415d2b31afd7028356dbf3cc6dcb066" -dependencies = [ - "generic-array", -] - [[package]] name = "digest" version = "0.10.7" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "9ed9a281f7bc9b7576e61468ba615a66a5c8cfdff42420a70aa82701a3b1e292" dependencies = [ - "block-buffer 0.10.2", + "block-buffer", "const-oid", "crypto-common", "subtle", @@ -680,7 +760,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "a4b1e0c257a9e9f25f90ff76d7a68360ed497ee519c8e428d1825ef0000799d4" dependencies = [ "der", - "digest 0.10.7", + "digest", "elliptic-curve", "rfc6979", "signature", @@ -706,7 +786,7 @@ dependencies = [ "hashbrown 0.14.3", "hex", "rand_core", - "sha2 0.10.8", + "sha2", "zeroize", ] @@ -724,7 +804,7 @@ checksum = "b5e6043086bf7973472e0c7dff2142ea0b680d30e18d9cc40f267efbf222bd47" dependencies = [ "base16ct", "crypto-bigint", - "digest 0.10.7", + "digest", "ff", "generic-array", "group", @@ -793,7 +873,6 @@ version = "0.13.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "ded41244b729663b1e574f1b4fb731469f69f79c17667b5d776b16cda0479449" dependencies = [ - "bitvec", "rand_core", "subtle", ] @@ -810,12 +889,6 @@ version = "1.0.7" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "3f9eec918d3f24069decb9af1554cad7c880e2da24a9afd88aca000531ab82c1" -[[package]] -name = "funty" -version = "2.0.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e6d5a32815ae3f33302d95fdcb2ce17862f8c65363dcfd29360480ba1001fc9c" - [[package]] name = "fxhash" version = "0.2.1" @@ -884,6 +957,15 @@ dependencies = [ "ahash 0.7.8", ] +[[package]] +name = "hashbrown" +version = "0.13.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "43a3c133739dddd0d2990f9a4bdf8eb4b21ef50e4851ca85ab661199821d510e" +dependencies = [ + "ahash 0.8.11", +] + [[package]] name = "hashbrown" version = "0.14.3" @@ -912,7 +994,7 @@ version = "0.12.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "6c49c37c09c17a53d937dfbb742eb3a961d65a994e6bcdcf37e7399d0cc8ab5e" dependencies = [ - "digest 0.10.7", + "digest", ] [[package]] @@ -952,6 +1034,15 @@ dependencies = [ "hashbrown 0.14.3", ] +[[package]] +name = "itertools" +version = "0.10.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b0fd2260e829bddf4cb6ea802289de2f86d6a7a690192fbe91b3f46e0f2c8473" +dependencies = [ + "either", +] + [[package]] name = "itoa" version = "0.4.7" @@ -976,7 +1067,7 @@ dependencies = [ "cfg-if", "ecdsa", "elliptic-curve", - "sha2 0.10.8", + "sha2", ] [[package]] @@ -1083,6 +1174,35 @@ version = "0.2.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "0debeb9fcf88823ea64d64e4a815ab1643f33127d995978e099942ce38f25238" +[[package]] +name = "num-bigint" +version = "0.4.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "608e7659b5c3d7cba262d894801b9ec9d00de989e8a82bd4bef91d08da45cdc0" +dependencies = [ + "autocfg", + "num-integer", + "num-traits", +] + +[[package]] +name = "num-integer" +version = "0.1.46" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7969661fd2958a5cb096e56c8e1ad0444ac2bbcd0061bd28660485a44879858f" +dependencies = [ + "num-traits", +] + +[[package]] +name = "num-traits" +version = "0.2.18" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "da0df0e5185db44f69b44f26786fe401b6c293d1907744beaa7fa62b2e5a517a" +dependencies = [ + "autocfg", +] + [[package]] name = "object" version = "0.25.3" @@ -1098,12 +1218,6 @@ version = "1.19.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "3fdb12b2476b595f9358c5161aa467c2438859caa136dec86c26fdd2efe17b92" -[[package]] -name = "opaque-debug" -version = "0.3.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c08d65885ee38876c4f86fa503fb49d7b507c2b62552df7c70b2fce627e06381" - [[package]] name = "p256" version = "0.13.2" @@ -1113,16 +1227,7 @@ dependencies = [ "ecdsa", "elliptic-curve", "primeorder", - "sha2 0.10.8", -] - -[[package]] -name = "pairing" -version = "0.23.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "81fec4625e73cf41ef4bb6846cafa6d44736525f442ba45e407c4a000a13996f" -dependencies = [ - "group", + "sha2", ] [[package]] @@ -1138,6 +1243,12 @@ dependencies = [ "windows-targets", ] +[[package]] +name = "paste" +version = "1.0.14" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "de3145af08024dea9fa9914f381a17b8fc6034dfb00f3a84013f7ff43f29ed4c" + [[package]] name = "pin-project-lite" version = "0.2.13" @@ -1150,6 +1261,12 @@ version = "3.4.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "db23d408679286588f4d4644f965003d056e3dd5abcaaa938116871d7ce2fee7" +[[package]] +name = "ppv-lite86" +version = "0.2.17" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5b40af805b3121feab8a3c29f04d8ad262fa8e0561883e7653e024ae4479e6de" + [[package]] name = "primeorder" version = "0.13.6" @@ -1222,10 +1339,24 @@ dependencies = [ ] [[package]] -name = "radium" -version = "0.7.0" +name = "rand" +version = "0.8.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "34af8d1a0e25924bc5b7c43c079c942339d8f0a8b57c39049bef581b46327404" +dependencies = [ + "rand_chacha", + "rand_core", +] + +[[package]] +name = "rand_chacha" +version = "0.3.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "dc33ff2d4973d518d823d61aa239014831e521c75da58e3df4840d3f47749d09" +checksum = "e6c10a63a0fa32252be49d21e7709d4d4baf8d231c2dbce1eaa8141b9b127d88" +dependencies = [ + "ppv-lite86", + "rand_core", +] [[package]] name = "rand_core" @@ -1484,19 +1615,6 @@ dependencies = [ "serde", ] -[[package]] -name = "sha2" -version = "0.9.9" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4d58a1e1bf39749807d89cf2d98ac2dfa0ff1cb3faa38fbb64dd88ac8013d800" -dependencies = [ - "block-buffer 0.9.0", - "cfg-if", - "cpufeatures", - "digest 0.9.0", - "opaque-debug", -] - [[package]] name = "sha2" version = "0.10.8" @@ -1505,7 +1623,7 @@ checksum = "793db75ad2bcafc3ffa7c68b215fee268f537982cd901d132f89c6343f3a3dc8" dependencies = [ "cfg-if", "cpufeatures", - "digest 0.10.7", + "digest", ] [[package]] @@ -1524,7 +1642,7 @@ version = "2.1.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "5e1788eed21689f9cf370582dfc467ef36ed9c707f073528ddafa8d83e3b8500" dependencies = [ - "digest 0.10.7", + "digest", "rand_core", ] @@ -1608,12 +1726,6 @@ dependencies = [ "unicode-ident", ] -[[package]] -name = "tap" -version = "1.0.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "55937e1799185b12863d447f42597ed69d9928686b8d88a1df17376a097d8369" - [[package]] name = "target-lexicon" version = "0.12.7" @@ -2049,15 +2161,6 @@ version = "0.48.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "1a515f5799fe4961cb532f983ce2b23082366b898e52ffbce459c86f67c8378a" -[[package]] -name = "wyz" -version = "0.5.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "05f360fc0b24296329c78fda852a1e9ae82de9cf7b27dae4b7f62f118f77b9ed" -dependencies = [ - "tap", -] - [[package]] name = "zerocopy" version = "0.7.32" diff --git a/contracts/ibc-reflect/Cargo.lock b/contracts/ibc-reflect/Cargo.lock index 251973cfd4..8e973b6452 100644 --- a/contracts/ibc-reflect/Cargo.lock +++ b/contracts/ibc-reflect/Cargo.lock @@ -46,6 +46,127 @@ version = "0.2.16" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "0942ffc6dcaadf03badf6e6a2d0228460359d5e34b57ccdc720b7382dfbd5ec5" +[[package]] +name = "ark-bls12-381" +version = "0.4.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c775f0d12169cba7aae4caeb547bb6a50781c7449a8aa53793827c9ec4abf488" +dependencies = [ + "ark-ec", + "ark-ff", + "ark-serialize", + "ark-std", +] + +[[package]] +name = "ark-ec" +version = "0.4.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "defd9a439d56ac24968cca0571f598a61bc8c55f71d50a89cda591cb750670ba" +dependencies = [ + "ark-ff", + "ark-poly", + "ark-serialize", + "ark-std", + "derivative", + "hashbrown 0.13.2", + "itertools", + "num-traits", + "rayon", + "zeroize", +] + +[[package]] +name = "ark-ff" +version = "0.4.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ec847af850f44ad29048935519032c33da8aa03340876d351dfab5660d2966ba" +dependencies = [ + "ark-ff-asm", + "ark-ff-macros", + "ark-serialize", + "ark-std", + "derivative", + "digest", + "itertools", + "num-bigint", + "num-traits", + "paste", + "rayon", + "rustc_version", + "zeroize", +] + +[[package]] +name = "ark-ff-asm" +version = "0.4.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3ed4aa4fe255d0bc6d79373f7e31d2ea147bcf486cba1be5ba7ea85abdb92348" +dependencies = [ + "quote", + "syn 1.0.109", +] + +[[package]] +name = "ark-ff-macros" +version = "0.4.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7abe79b0e4288889c4574159ab790824d0033b9fdcb2a112a3182fac2e514565" +dependencies = [ + "num-bigint", + "num-traits", + "proc-macro2", + "quote", + "syn 1.0.109", +] + +[[package]] +name = "ark-poly" +version = "0.4.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d320bfc44ee185d899ccbadfa8bc31aab923ce1558716e1997a1e74057fe86bf" +dependencies = [ + "ark-ff", + "ark-serialize", + "ark-std", + "derivative", + "hashbrown 0.13.2", +] + +[[package]] +name = "ark-serialize" +version = "0.4.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "adb7b85a02b83d2f22f89bd5cac66c9c89474240cb6207cb1efc16d098e822a5" +dependencies = [ + "ark-serialize-derive", + "ark-std", + "digest", + "num-bigint", +] + +[[package]] +name = "ark-serialize-derive" +version = "0.4.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ae3281bc6d0fd7e549af32b52511e1302185bd688fd3359fa36423346ff682ea" +dependencies = [ + "proc-macro2", + "quote", + "syn 1.0.109", +] + +[[package]] +name = "ark-std" +version = "0.4.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "94893f1e0c6eeab764ade8dc4c0db24caf4fe7cbbaafc0eba0a9030f447b5185" +dependencies = [ + "num-traits", + "rand", + "rayon", +] + [[package]] name = "arrayvec" version = "0.7.2" @@ -103,27 +224,6 @@ version = "2.4.2" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "ed570934406eb16438a4e976b1b4500774099c13b8cb96eec99f620f05090ddf" -[[package]] -name = "bitvec" -version = "1.0.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1bc2832c24239b0141d5674bb9174f9d68a8b5b3f2753311927c172ca46f7e9c" -dependencies = [ - "funty", - "radium", - "tap", - "wyz", -] - -[[package]] -name = "block-buffer" -version = "0.9.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4152116fd6e9dadb291ae18fc1ec3575ed6d84c29642d97890f4b4a3417297e4" -dependencies = [ - "generic-array", -] - [[package]] name = "block-buffer" version = "0.10.2" @@ -133,20 +233,6 @@ dependencies = [ "generic-array", ] -[[package]] -name = "bls12_381" -version = "0.8.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d7bc6d6292be3a19e6379786dac800f551e5865a5bb51ebbe3064ab80433f403" -dependencies = [ - "digest 0.9.0", - "ff", - "group", - "pairing", - "rand_core", - "subtle", -] - [[package]] name = "bnum" version = "0.11.0" @@ -241,7 +327,7 @@ dependencies = [ "hex", "schemars", "serde", - "sha2 0.10.8", + "sha2", "static_assertions", "thiserror", ] @@ -250,17 +336,20 @@ dependencies = [ name = "cosmwasm-crypto" version = "2.0.1" dependencies = [ - "bls12_381", + "ark-bls12-381", + "ark-ec", + "ark-ff", + "ark-serialize", "derive_more", - "digest 0.10.7", + "digest", "ecdsa", "ed25519-zebra", "k256", + "num-traits", "p256", - "pairing", "rand_core", "rayon", - "sha2 0.9.9", + "sha2", "thiserror", ] @@ -308,7 +397,7 @@ dependencies = [ "schemars", "serde", "serde-json-wasm", - "sha2 0.10.8", + "sha2", "thiserror", ] @@ -328,7 +417,7 @@ dependencies = [ "schemars", "serde", "serde_json", - "sha2 0.10.8", + "sha2", "strum", "thiserror", "tracing", @@ -512,7 +601,7 @@ dependencies = [ "cfg-if", "cpufeatures", "curve25519-dalek-derive", - "digest 0.10.7", + "digest", "fiat-crypto", "platforms", "rustc_version", @@ -620,22 +709,13 @@ dependencies = [ "unicode-xid", ] -[[package]] -name = "digest" -version = "0.9.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d3dd60d1080a57a05ab032377049e0591415d2b31afd7028356dbf3cc6dcb066" -dependencies = [ - "generic-array", -] - [[package]] name = "digest" version = "0.10.7" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "9ed9a281f7bc9b7576e61468ba615a66a5c8cfdff42420a70aa82701a3b1e292" dependencies = [ - "block-buffer 0.10.2", + "block-buffer", "const-oid", "crypto-common", "subtle", @@ -680,7 +760,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "a4b1e0c257a9e9f25f90ff76d7a68360ed497ee519c8e428d1825ef0000799d4" dependencies = [ "der", - "digest 0.10.7", + "digest", "elliptic-curve", "rfc6979", "signature", @@ -706,7 +786,7 @@ dependencies = [ "hashbrown 0.14.3", "hex", "rand_core", - "sha2 0.10.8", + "sha2", "zeroize", ] @@ -724,7 +804,7 @@ checksum = "b5e6043086bf7973472e0c7dff2142ea0b680d30e18d9cc40f267efbf222bd47" dependencies = [ "base16ct", "crypto-bigint", - "digest 0.10.7", + "digest", "ff", "generic-array", "group", @@ -793,7 +873,6 @@ version = "0.13.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "ded41244b729663b1e574f1b4fb731469f69f79c17667b5d776b16cda0479449" dependencies = [ - "bitvec", "rand_core", "subtle", ] @@ -810,12 +889,6 @@ version = "1.0.7" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "3f9eec918d3f24069decb9af1554cad7c880e2da24a9afd88aca000531ab82c1" -[[package]] -name = "funty" -version = "2.0.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e6d5a32815ae3f33302d95fdcb2ce17862f8c65363dcfd29360480ba1001fc9c" - [[package]] name = "fxhash" version = "0.2.1" @@ -884,6 +957,15 @@ dependencies = [ "ahash 0.7.8", ] +[[package]] +name = "hashbrown" +version = "0.13.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "43a3c133739dddd0d2990f9a4bdf8eb4b21ef50e4851ca85ab661199821d510e" +dependencies = [ + "ahash 0.8.11", +] + [[package]] name = "hashbrown" version = "0.14.3" @@ -912,7 +994,7 @@ version = "0.12.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "6c49c37c09c17a53d937dfbb742eb3a961d65a994e6bcdcf37e7399d0cc8ab5e" dependencies = [ - "digest 0.10.7", + "digest", ] [[package]] @@ -952,6 +1034,15 @@ dependencies = [ "hashbrown 0.14.3", ] +[[package]] +name = "itertools" +version = "0.10.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b0fd2260e829bddf4cb6ea802289de2f86d6a7a690192fbe91b3f46e0f2c8473" +dependencies = [ + "either", +] + [[package]] name = "itoa" version = "0.4.7" @@ -976,7 +1067,7 @@ dependencies = [ "cfg-if", "ecdsa", "elliptic-curve", - "sha2 0.10.8", + "sha2", ] [[package]] @@ -1083,6 +1174,35 @@ version = "0.2.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "0debeb9fcf88823ea64d64e4a815ab1643f33127d995978e099942ce38f25238" +[[package]] +name = "num-bigint" +version = "0.4.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "608e7659b5c3d7cba262d894801b9ec9d00de989e8a82bd4bef91d08da45cdc0" +dependencies = [ + "autocfg", + "num-integer", + "num-traits", +] + +[[package]] +name = "num-integer" +version = "0.1.46" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7969661fd2958a5cb096e56c8e1ad0444ac2bbcd0061bd28660485a44879858f" +dependencies = [ + "num-traits", +] + +[[package]] +name = "num-traits" +version = "0.2.18" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "da0df0e5185db44f69b44f26786fe401b6c293d1907744beaa7fa62b2e5a517a" +dependencies = [ + "autocfg", +] + [[package]] name = "object" version = "0.25.3" @@ -1098,12 +1218,6 @@ version = "1.19.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "3fdb12b2476b595f9358c5161aa467c2438859caa136dec86c26fdd2efe17b92" -[[package]] -name = "opaque-debug" -version = "0.3.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c08d65885ee38876c4f86fa503fb49d7b507c2b62552df7c70b2fce627e06381" - [[package]] name = "p256" version = "0.13.2" @@ -1113,16 +1227,7 @@ dependencies = [ "ecdsa", "elliptic-curve", "primeorder", - "sha2 0.10.8", -] - -[[package]] -name = "pairing" -version = "0.23.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "81fec4625e73cf41ef4bb6846cafa6d44736525f442ba45e407c4a000a13996f" -dependencies = [ - "group", + "sha2", ] [[package]] @@ -1138,6 +1243,12 @@ dependencies = [ "windows-targets", ] +[[package]] +name = "paste" +version = "1.0.14" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "de3145af08024dea9fa9914f381a17b8fc6034dfb00f3a84013f7ff43f29ed4c" + [[package]] name = "pin-project-lite" version = "0.2.13" @@ -1150,6 +1261,12 @@ version = "3.4.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "db23d408679286588f4d4644f965003d056e3dd5abcaaa938116871d7ce2fee7" +[[package]] +name = "ppv-lite86" +version = "0.2.17" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5b40af805b3121feab8a3c29f04d8ad262fa8e0561883e7653e024ae4479e6de" + [[package]] name = "primeorder" version = "0.13.6" @@ -1222,10 +1339,24 @@ dependencies = [ ] [[package]] -name = "radium" -version = "0.7.0" +name = "rand" +version = "0.8.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "34af8d1a0e25924bc5b7c43c079c942339d8f0a8b57c39049bef581b46327404" +dependencies = [ + "rand_chacha", + "rand_core", +] + +[[package]] +name = "rand_chacha" +version = "0.3.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "dc33ff2d4973d518d823d61aa239014831e521c75da58e3df4840d3f47749d09" +checksum = "e6c10a63a0fa32252be49d21e7709d4d4baf8d231c2dbce1eaa8141b9b127d88" +dependencies = [ + "ppv-lite86", + "rand_core", +] [[package]] name = "rand_core" @@ -1484,19 +1615,6 @@ dependencies = [ "serde", ] -[[package]] -name = "sha2" -version = "0.9.9" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4d58a1e1bf39749807d89cf2d98ac2dfa0ff1cb3faa38fbb64dd88ac8013d800" -dependencies = [ - "block-buffer 0.9.0", - "cfg-if", - "cpufeatures", - "digest 0.9.0", - "opaque-debug", -] - [[package]] name = "sha2" version = "0.10.8" @@ -1505,7 +1623,7 @@ checksum = "793db75ad2bcafc3ffa7c68b215fee268f537982cd901d132f89c6343f3a3dc8" dependencies = [ "cfg-if", "cpufeatures", - "digest 0.10.7", + "digest", ] [[package]] @@ -1524,7 +1642,7 @@ version = "2.1.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "5e1788eed21689f9cf370582dfc467ef36ed9c707f073528ddafa8d83e3b8500" dependencies = [ - "digest 0.10.7", + "digest", "rand_core", ] @@ -1608,12 +1726,6 @@ dependencies = [ "unicode-ident", ] -[[package]] -name = "tap" -version = "1.0.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "55937e1799185b12863d447f42597ed69d9928686b8d88a1df17376a097d8369" - [[package]] name = "target-lexicon" version = "0.12.7" @@ -2049,15 +2161,6 @@ version = "0.48.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "1a515f5799fe4961cb532f983ce2b23082366b898e52ffbce459c86f67c8378a" -[[package]] -name = "wyz" -version = "0.5.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "05f360fc0b24296329c78fda852a1e9ae82de9cf7b27dae4b7f62f118f77b9ed" -dependencies = [ - "tap", -] - [[package]] name = "zerocopy" version = "0.7.32" diff --git a/contracts/queue/Cargo.lock b/contracts/queue/Cargo.lock index e606554fcb..b3a7f92cda 100644 --- a/contracts/queue/Cargo.lock +++ b/contracts/queue/Cargo.lock @@ -46,6 +46,127 @@ version = "0.2.16" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "0942ffc6dcaadf03badf6e6a2d0228460359d5e34b57ccdc720b7382dfbd5ec5" +[[package]] +name = "ark-bls12-381" +version = "0.4.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c775f0d12169cba7aae4caeb547bb6a50781c7449a8aa53793827c9ec4abf488" +dependencies = [ + "ark-ec", + "ark-ff", + "ark-serialize", + "ark-std", +] + +[[package]] +name = "ark-ec" +version = "0.4.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "defd9a439d56ac24968cca0571f598a61bc8c55f71d50a89cda591cb750670ba" +dependencies = [ + "ark-ff", + "ark-poly", + "ark-serialize", + "ark-std", + "derivative", + "hashbrown 0.13.2", + "itertools", + "num-traits", + "rayon", + "zeroize", +] + +[[package]] +name = "ark-ff" +version = "0.4.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ec847af850f44ad29048935519032c33da8aa03340876d351dfab5660d2966ba" +dependencies = [ + "ark-ff-asm", + "ark-ff-macros", + "ark-serialize", + "ark-std", + "derivative", + "digest", + "itertools", + "num-bigint", + "num-traits", + "paste", + "rayon", + "rustc_version", + "zeroize", +] + +[[package]] +name = "ark-ff-asm" +version = "0.4.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3ed4aa4fe255d0bc6d79373f7e31d2ea147bcf486cba1be5ba7ea85abdb92348" +dependencies = [ + "quote", + "syn 1.0.109", +] + +[[package]] +name = "ark-ff-macros" +version = "0.4.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7abe79b0e4288889c4574159ab790824d0033b9fdcb2a112a3182fac2e514565" +dependencies = [ + "num-bigint", + "num-traits", + "proc-macro2", + "quote", + "syn 1.0.109", +] + +[[package]] +name = "ark-poly" +version = "0.4.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d320bfc44ee185d899ccbadfa8bc31aab923ce1558716e1997a1e74057fe86bf" +dependencies = [ + "ark-ff", + "ark-serialize", + "ark-std", + "derivative", + "hashbrown 0.13.2", +] + +[[package]] +name = "ark-serialize" +version = "0.4.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "adb7b85a02b83d2f22f89bd5cac66c9c89474240cb6207cb1efc16d098e822a5" +dependencies = [ + "ark-serialize-derive", + "ark-std", + "digest", + "num-bigint", +] + +[[package]] +name = "ark-serialize-derive" +version = "0.4.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ae3281bc6d0fd7e549af32b52511e1302185bd688fd3359fa36423346ff682ea" +dependencies = [ + "proc-macro2", + "quote", + "syn 1.0.109", +] + +[[package]] +name = "ark-std" +version = "0.4.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "94893f1e0c6eeab764ade8dc4c0db24caf4fe7cbbaafc0eba0a9030f447b5185" +dependencies = [ + "num-traits", + "rand", + "rayon", +] + [[package]] name = "arrayvec" version = "0.7.2" @@ -103,27 +224,6 @@ version = "2.4.2" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "ed570934406eb16438a4e976b1b4500774099c13b8cb96eec99f620f05090ddf" -[[package]] -name = "bitvec" -version = "1.0.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1bc2832c24239b0141d5674bb9174f9d68a8b5b3f2753311927c172ca46f7e9c" -dependencies = [ - "funty", - "radium", - "tap", - "wyz", -] - -[[package]] -name = "block-buffer" -version = "0.9.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4152116fd6e9dadb291ae18fc1ec3575ed6d84c29642d97890f4b4a3417297e4" -dependencies = [ - "generic-array", -] - [[package]] name = "block-buffer" version = "0.10.2" @@ -133,20 +233,6 @@ dependencies = [ "generic-array", ] -[[package]] -name = "bls12_381" -version = "0.8.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d7bc6d6292be3a19e6379786dac800f551e5865a5bb51ebbe3064ab80433f403" -dependencies = [ - "digest 0.9.0", - "ff", - "group", - "pairing", - "rand_core", - "subtle", -] - [[package]] name = "bnum" version = "0.11.0" @@ -241,7 +327,7 @@ dependencies = [ "hex", "schemars", "serde", - "sha2 0.10.8", + "sha2", "static_assertions", "thiserror", ] @@ -250,17 +336,20 @@ dependencies = [ name = "cosmwasm-crypto" version = "2.0.1" dependencies = [ - "bls12_381", + "ark-bls12-381", + "ark-ec", + "ark-ff", + "ark-serialize", "derive_more", - "digest 0.10.7", + "digest", "ecdsa", "ed25519-zebra", "k256", + "num-traits", "p256", - "pairing", "rand_core", "rayon", - "sha2 0.9.9", + "sha2", "thiserror", ] @@ -308,7 +397,7 @@ dependencies = [ "schemars", "serde", "serde-json-wasm", - "sha2 0.10.8", + "sha2", "thiserror", ] @@ -328,7 +417,7 @@ dependencies = [ "schemars", "serde", "serde_json", - "sha2 0.10.8", + "sha2", "strum", "thiserror", "tracing", @@ -512,7 +601,7 @@ dependencies = [ "cfg-if", "cpufeatures", "curve25519-dalek-derive", - "digest 0.10.7", + "digest", "fiat-crypto", "platforms", "rustc_version", @@ -620,22 +709,13 @@ dependencies = [ "unicode-xid", ] -[[package]] -name = "digest" -version = "0.9.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d3dd60d1080a57a05ab032377049e0591415d2b31afd7028356dbf3cc6dcb066" -dependencies = [ - "generic-array", -] - [[package]] name = "digest" version = "0.10.7" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "9ed9a281f7bc9b7576e61468ba615a66a5c8cfdff42420a70aa82701a3b1e292" dependencies = [ - "block-buffer 0.10.2", + "block-buffer", "const-oid", "crypto-common", "subtle", @@ -680,7 +760,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "a4b1e0c257a9e9f25f90ff76d7a68360ed497ee519c8e428d1825ef0000799d4" dependencies = [ "der", - "digest 0.10.7", + "digest", "elliptic-curve", "rfc6979", "signature", @@ -706,7 +786,7 @@ dependencies = [ "hashbrown 0.14.3", "hex", "rand_core", - "sha2 0.10.8", + "sha2", "zeroize", ] @@ -724,7 +804,7 @@ checksum = "b5e6043086bf7973472e0c7dff2142ea0b680d30e18d9cc40f267efbf222bd47" dependencies = [ "base16ct", "crypto-bigint", - "digest 0.10.7", + "digest", "ff", "generic-array", "group", @@ -793,7 +873,6 @@ version = "0.13.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "ded41244b729663b1e574f1b4fb731469f69f79c17667b5d776b16cda0479449" dependencies = [ - "bitvec", "rand_core", "subtle", ] @@ -810,12 +889,6 @@ version = "1.0.7" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "3f9eec918d3f24069decb9af1554cad7c880e2da24a9afd88aca000531ab82c1" -[[package]] -name = "funty" -version = "2.0.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e6d5a32815ae3f33302d95fdcb2ce17862f8c65363dcfd29360480ba1001fc9c" - [[package]] name = "fxhash" version = "0.2.1" @@ -884,6 +957,15 @@ dependencies = [ "ahash 0.7.8", ] +[[package]] +name = "hashbrown" +version = "0.13.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "43a3c133739dddd0d2990f9a4bdf8eb4b21ef50e4851ca85ab661199821d510e" +dependencies = [ + "ahash 0.8.11", +] + [[package]] name = "hashbrown" version = "0.14.3" @@ -912,7 +994,7 @@ version = "0.12.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "6c49c37c09c17a53d937dfbb742eb3a961d65a994e6bcdcf37e7399d0cc8ab5e" dependencies = [ - "digest 0.10.7", + "digest", ] [[package]] @@ -941,6 +1023,15 @@ dependencies = [ "hashbrown 0.14.3", ] +[[package]] +name = "itertools" +version = "0.10.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b0fd2260e829bddf4cb6ea802289de2f86d6a7a690192fbe91b3f46e0f2c8473" +dependencies = [ + "either", +] + [[package]] name = "itoa" version = "0.4.7" @@ -965,7 +1056,7 @@ dependencies = [ "cfg-if", "ecdsa", "elliptic-curve", - "sha2 0.10.8", + "sha2", ] [[package]] @@ -1072,6 +1163,35 @@ version = "0.2.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "0debeb9fcf88823ea64d64e4a815ab1643f33127d995978e099942ce38f25238" +[[package]] +name = "num-bigint" +version = "0.4.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "608e7659b5c3d7cba262d894801b9ec9d00de989e8a82bd4bef91d08da45cdc0" +dependencies = [ + "autocfg", + "num-integer", + "num-traits", +] + +[[package]] +name = "num-integer" +version = "0.1.46" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7969661fd2958a5cb096e56c8e1ad0444ac2bbcd0061bd28660485a44879858f" +dependencies = [ + "num-traits", +] + +[[package]] +name = "num-traits" +version = "0.2.18" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "da0df0e5185db44f69b44f26786fe401b6c293d1907744beaa7fa62b2e5a517a" +dependencies = [ + "autocfg", +] + [[package]] name = "object" version = "0.25.3" @@ -1087,12 +1207,6 @@ version = "1.19.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "3fdb12b2476b595f9358c5161aa467c2438859caa136dec86c26fdd2efe17b92" -[[package]] -name = "opaque-debug" -version = "0.3.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c08d65885ee38876c4f86fa503fb49d7b507c2b62552df7c70b2fce627e06381" - [[package]] name = "p256" version = "0.13.2" @@ -1102,16 +1216,7 @@ dependencies = [ "ecdsa", "elliptic-curve", "primeorder", - "sha2 0.10.8", -] - -[[package]] -name = "pairing" -version = "0.23.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "81fec4625e73cf41ef4bb6846cafa6d44736525f442ba45e407c4a000a13996f" -dependencies = [ - "group", + "sha2", ] [[package]] @@ -1127,6 +1232,12 @@ dependencies = [ "windows-targets", ] +[[package]] +name = "paste" +version = "1.0.14" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "de3145af08024dea9fa9914f381a17b8fc6034dfb00f3a84013f7ff43f29ed4c" + [[package]] name = "pin-project-lite" version = "0.2.13" @@ -1139,6 +1250,12 @@ version = "3.4.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "db23d408679286588f4d4644f965003d056e3dd5abcaaa938116871d7ce2fee7" +[[package]] +name = "ppv-lite86" +version = "0.2.17" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5b40af805b3121feab8a3c29f04d8ad262fa8e0561883e7653e024ae4479e6de" + [[package]] name = "primeorder" version = "0.13.6" @@ -1222,10 +1339,24 @@ dependencies = [ ] [[package]] -name = "radium" -version = "0.7.0" +name = "rand" +version = "0.8.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "34af8d1a0e25924bc5b7c43c079c942339d8f0a8b57c39049bef581b46327404" +dependencies = [ + "rand_chacha", + "rand_core", +] + +[[package]] +name = "rand_chacha" +version = "0.3.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "dc33ff2d4973d518d823d61aa239014831e521c75da58e3df4840d3f47749d09" +checksum = "e6c10a63a0fa32252be49d21e7709d4d4baf8d231c2dbce1eaa8141b9b127d88" +dependencies = [ + "ppv-lite86", + "rand_core", +] [[package]] name = "rand_core" @@ -1484,19 +1615,6 @@ dependencies = [ "serde", ] -[[package]] -name = "sha2" -version = "0.9.9" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4d58a1e1bf39749807d89cf2d98ac2dfa0ff1cb3faa38fbb64dd88ac8013d800" -dependencies = [ - "block-buffer 0.9.0", - "cfg-if", - "cpufeatures", - "digest 0.9.0", - "opaque-debug", -] - [[package]] name = "sha2" version = "0.10.8" @@ -1505,7 +1623,7 @@ checksum = "793db75ad2bcafc3ffa7c68b215fee268f537982cd901d132f89c6343f3a3dc8" dependencies = [ "cfg-if", "cpufeatures", - "digest 0.10.7", + "digest", ] [[package]] @@ -1524,7 +1642,7 @@ version = "2.1.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "5e1788eed21689f9cf370582dfc467ef36ed9c707f073528ddafa8d83e3b8500" dependencies = [ - "digest 0.10.7", + "digest", "rand_core", ] @@ -1608,12 +1726,6 @@ dependencies = [ "unicode-ident", ] -[[package]] -name = "tap" -version = "1.0.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "55937e1799185b12863d447f42597ed69d9928686b8d88a1df17376a097d8369" - [[package]] name = "target-lexicon" version = "0.12.7" @@ -2049,15 +2161,6 @@ version = "0.48.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "1a515f5799fe4961cb532f983ce2b23082366b898e52ffbce459c86f67c8378a" -[[package]] -name = "wyz" -version = "0.5.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "05f360fc0b24296329c78fda852a1e9ae82de9cf7b27dae4b7f62f118f77b9ed" -dependencies = [ - "tap", -] - [[package]] name = "zerocopy" version = "0.7.32" diff --git a/contracts/reflect/Cargo.lock b/contracts/reflect/Cargo.lock index 151e602861..84c68e6f5a 100644 --- a/contracts/reflect/Cargo.lock +++ b/contracts/reflect/Cargo.lock @@ -46,6 +46,127 @@ version = "0.2.16" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "0942ffc6dcaadf03badf6e6a2d0228460359d5e34b57ccdc720b7382dfbd5ec5" +[[package]] +name = "ark-bls12-381" +version = "0.4.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c775f0d12169cba7aae4caeb547bb6a50781c7449a8aa53793827c9ec4abf488" +dependencies = [ + "ark-ec", + "ark-ff", + "ark-serialize", + "ark-std", +] + +[[package]] +name = "ark-ec" +version = "0.4.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "defd9a439d56ac24968cca0571f598a61bc8c55f71d50a89cda591cb750670ba" +dependencies = [ + "ark-ff", + "ark-poly", + "ark-serialize", + "ark-std", + "derivative", + "hashbrown 0.13.2", + "itertools", + "num-traits", + "rayon", + "zeroize", +] + +[[package]] +name = "ark-ff" +version = "0.4.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ec847af850f44ad29048935519032c33da8aa03340876d351dfab5660d2966ba" +dependencies = [ + "ark-ff-asm", + "ark-ff-macros", + "ark-serialize", + "ark-std", + "derivative", + "digest", + "itertools", + "num-bigint", + "num-traits", + "paste", + "rayon", + "rustc_version", + "zeroize", +] + +[[package]] +name = "ark-ff-asm" +version = "0.4.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3ed4aa4fe255d0bc6d79373f7e31d2ea147bcf486cba1be5ba7ea85abdb92348" +dependencies = [ + "quote", + "syn 1.0.109", +] + +[[package]] +name = "ark-ff-macros" +version = "0.4.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7abe79b0e4288889c4574159ab790824d0033b9fdcb2a112a3182fac2e514565" +dependencies = [ + "num-bigint", + "num-traits", + "proc-macro2", + "quote", + "syn 1.0.109", +] + +[[package]] +name = "ark-poly" +version = "0.4.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d320bfc44ee185d899ccbadfa8bc31aab923ce1558716e1997a1e74057fe86bf" +dependencies = [ + "ark-ff", + "ark-serialize", + "ark-std", + "derivative", + "hashbrown 0.13.2", +] + +[[package]] +name = "ark-serialize" +version = "0.4.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "adb7b85a02b83d2f22f89bd5cac66c9c89474240cb6207cb1efc16d098e822a5" +dependencies = [ + "ark-serialize-derive", + "ark-std", + "digest", + "num-bigint", +] + +[[package]] +name = "ark-serialize-derive" +version = "0.4.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ae3281bc6d0fd7e549af32b52511e1302185bd688fd3359fa36423346ff682ea" +dependencies = [ + "proc-macro2", + "quote", + "syn 1.0.109", +] + +[[package]] +name = "ark-std" +version = "0.4.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "94893f1e0c6eeab764ade8dc4c0db24caf4fe7cbbaafc0eba0a9030f447b5185" +dependencies = [ + "num-traits", + "rand", + "rayon", +] + [[package]] name = "arrayvec" version = "0.7.2" @@ -103,27 +224,6 @@ version = "2.4.2" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "ed570934406eb16438a4e976b1b4500774099c13b8cb96eec99f620f05090ddf" -[[package]] -name = "bitvec" -version = "1.0.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1bc2832c24239b0141d5674bb9174f9d68a8b5b3f2753311927c172ca46f7e9c" -dependencies = [ - "funty", - "radium", - "tap", - "wyz", -] - -[[package]] -name = "block-buffer" -version = "0.9.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4152116fd6e9dadb291ae18fc1ec3575ed6d84c29642d97890f4b4a3417297e4" -dependencies = [ - "generic-array", -] - [[package]] name = "block-buffer" version = "0.10.2" @@ -133,20 +233,6 @@ dependencies = [ "generic-array", ] -[[package]] -name = "bls12_381" -version = "0.8.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d7bc6d6292be3a19e6379786dac800f551e5865a5bb51ebbe3064ab80433f403" -dependencies = [ - "digest 0.9.0", - "ff", - "group", - "pairing", - "rand_core", - "subtle", -] - [[package]] name = "bnum" version = "0.11.0" @@ -241,7 +327,7 @@ dependencies = [ "hex", "schemars", "serde", - "sha2 0.10.8", + "sha2", "static_assertions", "thiserror", ] @@ -250,17 +336,20 @@ dependencies = [ name = "cosmwasm-crypto" version = "2.0.1" dependencies = [ - "bls12_381", + "ark-bls12-381", + "ark-ec", + "ark-ff", + "ark-serialize", "derive_more", - "digest 0.10.7", + "digest", "ecdsa", "ed25519-zebra", "k256", + "num-traits", "p256", - "pairing", "rand_core", "rayon", - "sha2 0.9.9", + "sha2", "thiserror", ] @@ -308,7 +397,7 @@ dependencies = [ "schemars", "serde", "serde-json-wasm", - "sha2 0.10.8", + "sha2", "thiserror", ] @@ -328,7 +417,7 @@ dependencies = [ "schemars", "serde", "serde_json", - "sha2 0.10.8", + "sha2", "strum", "thiserror", "tracing", @@ -512,7 +601,7 @@ dependencies = [ "cfg-if", "cpufeatures", "curve25519-dalek-derive", - "digest 0.10.7", + "digest", "fiat-crypto", "platforms", "rustc_version", @@ -620,22 +709,13 @@ dependencies = [ "unicode-xid", ] -[[package]] -name = "digest" -version = "0.9.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d3dd60d1080a57a05ab032377049e0591415d2b31afd7028356dbf3cc6dcb066" -dependencies = [ - "generic-array", -] - [[package]] name = "digest" version = "0.10.7" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "9ed9a281f7bc9b7576e61468ba615a66a5c8cfdff42420a70aa82701a3b1e292" dependencies = [ - "block-buffer 0.10.2", + "block-buffer", "const-oid", "crypto-common", "subtle", @@ -680,7 +760,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "a4b1e0c257a9e9f25f90ff76d7a68360ed497ee519c8e428d1825ef0000799d4" dependencies = [ "der", - "digest 0.10.7", + "digest", "elliptic-curve", "rfc6979", "signature", @@ -706,7 +786,7 @@ dependencies = [ "hashbrown 0.14.3", "hex", "rand_core", - "sha2 0.10.8", + "sha2", "zeroize", ] @@ -724,7 +804,7 @@ checksum = "b5e6043086bf7973472e0c7dff2142ea0b680d30e18d9cc40f267efbf222bd47" dependencies = [ "base16ct", "crypto-bigint", - "digest 0.10.7", + "digest", "ff", "generic-array", "group", @@ -793,7 +873,6 @@ version = "0.13.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "ded41244b729663b1e574f1b4fb731469f69f79c17667b5d776b16cda0479449" dependencies = [ - "bitvec", "rand_core", "subtle", ] @@ -810,12 +889,6 @@ version = "1.0.7" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "3f9eec918d3f24069decb9af1554cad7c880e2da24a9afd88aca000531ab82c1" -[[package]] -name = "funty" -version = "2.0.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e6d5a32815ae3f33302d95fdcb2ce17862f8c65363dcfd29360480ba1001fc9c" - [[package]] name = "fxhash" version = "0.2.1" @@ -884,6 +957,15 @@ dependencies = [ "ahash 0.7.8", ] +[[package]] +name = "hashbrown" +version = "0.13.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "43a3c133739dddd0d2990f9a4bdf8eb4b21ef50e4851ca85ab661199821d510e" +dependencies = [ + "ahash 0.8.11", +] + [[package]] name = "hashbrown" version = "0.14.3" @@ -912,7 +994,7 @@ version = "0.12.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "6c49c37c09c17a53d937dfbb742eb3a961d65a994e6bcdcf37e7399d0cc8ab5e" dependencies = [ - "digest 0.10.7", + "digest", ] [[package]] @@ -941,6 +1023,15 @@ dependencies = [ "hashbrown 0.14.3", ] +[[package]] +name = "itertools" +version = "0.10.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b0fd2260e829bddf4cb6ea802289de2f86d6a7a690192fbe91b3f46e0f2c8473" +dependencies = [ + "either", +] + [[package]] name = "itoa" version = "0.4.7" @@ -965,7 +1056,7 @@ dependencies = [ "cfg-if", "ecdsa", "elliptic-curve", - "sha2 0.10.8", + "sha2", ] [[package]] @@ -1072,6 +1163,35 @@ version = "0.2.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "0debeb9fcf88823ea64d64e4a815ab1643f33127d995978e099942ce38f25238" +[[package]] +name = "num-bigint" +version = "0.4.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "608e7659b5c3d7cba262d894801b9ec9d00de989e8a82bd4bef91d08da45cdc0" +dependencies = [ + "autocfg", + "num-integer", + "num-traits", +] + +[[package]] +name = "num-integer" +version = "0.1.46" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7969661fd2958a5cb096e56c8e1ad0444ac2bbcd0061bd28660485a44879858f" +dependencies = [ + "num-traits", +] + +[[package]] +name = "num-traits" +version = "0.2.18" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "da0df0e5185db44f69b44f26786fe401b6c293d1907744beaa7fa62b2e5a517a" +dependencies = [ + "autocfg", +] + [[package]] name = "object" version = "0.25.3" @@ -1087,12 +1207,6 @@ version = "1.19.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "3fdb12b2476b595f9358c5161aa467c2438859caa136dec86c26fdd2efe17b92" -[[package]] -name = "opaque-debug" -version = "0.3.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c08d65885ee38876c4f86fa503fb49d7b507c2b62552df7c70b2fce627e06381" - [[package]] name = "p256" version = "0.13.2" @@ -1102,16 +1216,7 @@ dependencies = [ "ecdsa", "elliptic-curve", "primeorder", - "sha2 0.10.8", -] - -[[package]] -name = "pairing" -version = "0.23.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "81fec4625e73cf41ef4bb6846cafa6d44736525f442ba45e407c4a000a13996f" -dependencies = [ - "group", + "sha2", ] [[package]] @@ -1127,6 +1232,12 @@ dependencies = [ "windows-targets", ] +[[package]] +name = "paste" +version = "1.0.14" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "de3145af08024dea9fa9914f381a17b8fc6034dfb00f3a84013f7ff43f29ed4c" + [[package]] name = "pin-project-lite" version = "0.2.13" @@ -1139,6 +1250,12 @@ version = "3.4.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "db23d408679286588f4d4644f965003d056e3dd5abcaaa938116871d7ce2fee7" +[[package]] +name = "ppv-lite86" +version = "0.2.17" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5b40af805b3121feab8a3c29f04d8ad262fa8e0561883e7653e024ae4479e6de" + [[package]] name = "primeorder" version = "0.13.6" @@ -1211,10 +1328,24 @@ dependencies = [ ] [[package]] -name = "radium" -version = "0.7.0" +name = "rand" +version = "0.8.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "34af8d1a0e25924bc5b7c43c079c942339d8f0a8b57c39049bef581b46327404" +dependencies = [ + "rand_chacha", + "rand_core", +] + +[[package]] +name = "rand_chacha" +version = "0.3.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "dc33ff2d4973d518d823d61aa239014831e521c75da58e3df4840d3f47749d09" +checksum = "e6c10a63a0fa32252be49d21e7709d4d4baf8d231c2dbce1eaa8141b9b127d88" +dependencies = [ + "ppv-lite86", + "rand_core", +] [[package]] name = "rand_core" @@ -1485,19 +1616,6 @@ dependencies = [ "serde", ] -[[package]] -name = "sha2" -version = "0.9.9" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4d58a1e1bf39749807d89cf2d98ac2dfa0ff1cb3faa38fbb64dd88ac8013d800" -dependencies = [ - "block-buffer 0.9.0", - "cfg-if", - "cpufeatures", - "digest 0.9.0", - "opaque-debug", -] - [[package]] name = "sha2" version = "0.10.8" @@ -1506,7 +1624,7 @@ checksum = "793db75ad2bcafc3ffa7c68b215fee268f537982cd901d132f89c6343f3a3dc8" dependencies = [ "cfg-if", "cpufeatures", - "digest 0.10.7", + "digest", ] [[package]] @@ -1525,7 +1643,7 @@ version = "2.1.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "5e1788eed21689f9cf370582dfc467ef36ed9c707f073528ddafa8d83e3b8500" dependencies = [ - "digest 0.10.7", + "digest", "rand_core", ] @@ -1609,12 +1727,6 @@ dependencies = [ "unicode-ident", ] -[[package]] -name = "tap" -version = "1.0.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "55937e1799185b12863d447f42597ed69d9928686b8d88a1df17376a097d8369" - [[package]] name = "target-lexicon" version = "0.12.7" @@ -2050,15 +2162,6 @@ version = "0.48.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "1a515f5799fe4961cb532f983ce2b23082366b898e52ffbce459c86f67c8378a" -[[package]] -name = "wyz" -version = "0.5.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "05f360fc0b24296329c78fda852a1e9ae82de9cf7b27dae4b7f62f118f77b9ed" -dependencies = [ - "tap", -] - [[package]] name = "zerocopy" version = "0.7.32" diff --git a/contracts/staking/Cargo.lock b/contracts/staking/Cargo.lock index ece5af7f5a..9e6b449e63 100644 --- a/contracts/staking/Cargo.lock +++ b/contracts/staking/Cargo.lock @@ -46,6 +46,127 @@ version = "0.2.16" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "0942ffc6dcaadf03badf6e6a2d0228460359d5e34b57ccdc720b7382dfbd5ec5" +[[package]] +name = "ark-bls12-381" +version = "0.4.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c775f0d12169cba7aae4caeb547bb6a50781c7449a8aa53793827c9ec4abf488" +dependencies = [ + "ark-ec", + "ark-ff", + "ark-serialize", + "ark-std", +] + +[[package]] +name = "ark-ec" +version = "0.4.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "defd9a439d56ac24968cca0571f598a61bc8c55f71d50a89cda591cb750670ba" +dependencies = [ + "ark-ff", + "ark-poly", + "ark-serialize", + "ark-std", + "derivative", + "hashbrown 0.13.2", + "itertools", + "num-traits", + "rayon", + "zeroize", +] + +[[package]] +name = "ark-ff" +version = "0.4.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ec847af850f44ad29048935519032c33da8aa03340876d351dfab5660d2966ba" +dependencies = [ + "ark-ff-asm", + "ark-ff-macros", + "ark-serialize", + "ark-std", + "derivative", + "digest", + "itertools", + "num-bigint", + "num-traits", + "paste", + "rayon", + "rustc_version", + "zeroize", +] + +[[package]] +name = "ark-ff-asm" +version = "0.4.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3ed4aa4fe255d0bc6d79373f7e31d2ea147bcf486cba1be5ba7ea85abdb92348" +dependencies = [ + "quote", + "syn 1.0.109", +] + +[[package]] +name = "ark-ff-macros" +version = "0.4.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7abe79b0e4288889c4574159ab790824d0033b9fdcb2a112a3182fac2e514565" +dependencies = [ + "num-bigint", + "num-traits", + "proc-macro2", + "quote", + "syn 1.0.109", +] + +[[package]] +name = "ark-poly" +version = "0.4.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d320bfc44ee185d899ccbadfa8bc31aab923ce1558716e1997a1e74057fe86bf" +dependencies = [ + "ark-ff", + "ark-serialize", + "ark-std", + "derivative", + "hashbrown 0.13.2", +] + +[[package]] +name = "ark-serialize" +version = "0.4.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "adb7b85a02b83d2f22f89bd5cac66c9c89474240cb6207cb1efc16d098e822a5" +dependencies = [ + "ark-serialize-derive", + "ark-std", + "digest", + "num-bigint", +] + +[[package]] +name = "ark-serialize-derive" +version = "0.4.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ae3281bc6d0fd7e549af32b52511e1302185bd688fd3359fa36423346ff682ea" +dependencies = [ + "proc-macro2", + "quote", + "syn 1.0.109", +] + +[[package]] +name = "ark-std" +version = "0.4.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "94893f1e0c6eeab764ade8dc4c0db24caf4fe7cbbaafc0eba0a9030f447b5185" +dependencies = [ + "num-traits", + "rand", + "rayon", +] + [[package]] name = "arrayvec" version = "0.7.2" @@ -103,27 +224,6 @@ version = "2.4.2" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "ed570934406eb16438a4e976b1b4500774099c13b8cb96eec99f620f05090ddf" -[[package]] -name = "bitvec" -version = "1.0.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1bc2832c24239b0141d5674bb9174f9d68a8b5b3f2753311927c172ca46f7e9c" -dependencies = [ - "funty", - "radium", - "tap", - "wyz", -] - -[[package]] -name = "block-buffer" -version = "0.9.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4152116fd6e9dadb291ae18fc1ec3575ed6d84c29642d97890f4b4a3417297e4" -dependencies = [ - "generic-array", -] - [[package]] name = "block-buffer" version = "0.10.2" @@ -133,20 +233,6 @@ dependencies = [ "generic-array", ] -[[package]] -name = "bls12_381" -version = "0.8.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d7bc6d6292be3a19e6379786dac800f551e5865a5bb51ebbe3064ab80433f403" -dependencies = [ - "digest 0.9.0", - "ff", - "group", - "pairing", - "rand_core", - "subtle", -] - [[package]] name = "bnum" version = "0.11.0" @@ -241,7 +327,7 @@ dependencies = [ "hex", "schemars", "serde", - "sha2 0.10.8", + "sha2", "static_assertions", "thiserror", ] @@ -250,17 +336,20 @@ dependencies = [ name = "cosmwasm-crypto" version = "2.0.1" dependencies = [ - "bls12_381", + "ark-bls12-381", + "ark-ec", + "ark-ff", + "ark-serialize", "derive_more", - "digest 0.10.7", + "digest", "ecdsa", "ed25519-zebra", "k256", + "num-traits", "p256", - "pairing", "rand_core", "rayon", - "sha2 0.9.9", + "sha2", "thiserror", ] @@ -308,7 +397,7 @@ dependencies = [ "schemars", "serde", "serde-json-wasm", - "sha2 0.10.8", + "sha2", "thiserror", ] @@ -328,7 +417,7 @@ dependencies = [ "schemars", "serde", "serde_json", - "sha2 0.10.8", + "sha2", "strum", "thiserror", "tracing", @@ -512,7 +601,7 @@ dependencies = [ "cfg-if", "cpufeatures", "curve25519-dalek-derive", - "digest 0.10.7", + "digest", "fiat-crypto", "platforms", "rustc_version", @@ -620,22 +709,13 @@ dependencies = [ "unicode-xid", ] -[[package]] -name = "digest" -version = "0.9.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d3dd60d1080a57a05ab032377049e0591415d2b31afd7028356dbf3cc6dcb066" -dependencies = [ - "generic-array", -] - [[package]] name = "digest" version = "0.10.7" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "9ed9a281f7bc9b7576e61468ba615a66a5c8cfdff42420a70aa82701a3b1e292" dependencies = [ - "block-buffer 0.10.2", + "block-buffer", "const-oid", "crypto-common", "subtle", @@ -680,7 +760,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "a4b1e0c257a9e9f25f90ff76d7a68360ed497ee519c8e428d1825ef0000799d4" dependencies = [ "der", - "digest 0.10.7", + "digest", "elliptic-curve", "rfc6979", "signature", @@ -706,7 +786,7 @@ dependencies = [ "hashbrown 0.14.3", "hex", "rand_core", - "sha2 0.10.8", + "sha2", "zeroize", ] @@ -724,7 +804,7 @@ checksum = "b5e6043086bf7973472e0c7dff2142ea0b680d30e18d9cc40f267efbf222bd47" dependencies = [ "base16ct", "crypto-bigint", - "digest 0.10.7", + "digest", "ff", "generic-array", "group", @@ -793,7 +873,6 @@ version = "0.13.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "ded41244b729663b1e574f1b4fb731469f69f79c17667b5d776b16cda0479449" dependencies = [ - "bitvec", "rand_core", "subtle", ] @@ -810,12 +889,6 @@ version = "1.0.7" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "3f9eec918d3f24069decb9af1554cad7c880e2da24a9afd88aca000531ab82c1" -[[package]] -name = "funty" -version = "2.0.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e6d5a32815ae3f33302d95fdcb2ce17862f8c65363dcfd29360480ba1001fc9c" - [[package]] name = "fxhash" version = "0.2.1" @@ -884,6 +957,15 @@ dependencies = [ "ahash 0.7.8", ] +[[package]] +name = "hashbrown" +version = "0.13.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "43a3c133739dddd0d2990f9a4bdf8eb4b21ef50e4851ca85ab661199821d510e" +dependencies = [ + "ahash 0.8.11", +] + [[package]] name = "hashbrown" version = "0.14.3" @@ -912,7 +994,7 @@ version = "0.12.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "6c49c37c09c17a53d937dfbb742eb3a961d65a994e6bcdcf37e7399d0cc8ab5e" dependencies = [ - "digest 0.10.7", + "digest", ] [[package]] @@ -941,6 +1023,15 @@ dependencies = [ "hashbrown 0.14.3", ] +[[package]] +name = "itertools" +version = "0.10.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b0fd2260e829bddf4cb6ea802289de2f86d6a7a690192fbe91b3f46e0f2c8473" +dependencies = [ + "either", +] + [[package]] name = "itoa" version = "1.0.9" @@ -965,7 +1056,7 @@ dependencies = [ "cfg-if", "ecdsa", "elliptic-curve", - "sha2 0.10.8", + "sha2", ] [[package]] @@ -1072,6 +1163,35 @@ version = "0.2.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "0debeb9fcf88823ea64d64e4a815ab1643f33127d995978e099942ce38f25238" +[[package]] +name = "num-bigint" +version = "0.4.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "608e7659b5c3d7cba262d894801b9ec9d00de989e8a82bd4bef91d08da45cdc0" +dependencies = [ + "autocfg", + "num-integer", + "num-traits", +] + +[[package]] +name = "num-integer" +version = "0.1.46" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7969661fd2958a5cb096e56c8e1ad0444ac2bbcd0061bd28660485a44879858f" +dependencies = [ + "num-traits", +] + +[[package]] +name = "num-traits" +version = "0.2.18" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "da0df0e5185db44f69b44f26786fe401b6c293d1907744beaa7fa62b2e5a517a" +dependencies = [ + "autocfg", +] + [[package]] name = "object" version = "0.25.3" @@ -1087,12 +1207,6 @@ version = "1.19.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "3fdb12b2476b595f9358c5161aa467c2438859caa136dec86c26fdd2efe17b92" -[[package]] -name = "opaque-debug" -version = "0.3.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c08d65885ee38876c4f86fa503fb49d7b507c2b62552df7c70b2fce627e06381" - [[package]] name = "p256" version = "0.13.2" @@ -1102,16 +1216,7 @@ dependencies = [ "ecdsa", "elliptic-curve", "primeorder", - "sha2 0.10.8", -] - -[[package]] -name = "pairing" -version = "0.23.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "81fec4625e73cf41ef4bb6846cafa6d44736525f442ba45e407c4a000a13996f" -dependencies = [ - "group", + "sha2", ] [[package]] @@ -1127,6 +1232,12 @@ dependencies = [ "windows-targets", ] +[[package]] +name = "paste" +version = "1.0.14" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "de3145af08024dea9fa9914f381a17b8fc6034dfb00f3a84013f7ff43f29ed4c" + [[package]] name = "pin-project-lite" version = "0.2.13" @@ -1139,6 +1250,12 @@ version = "3.4.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "db23d408679286588f4d4644f965003d056e3dd5abcaaa938116871d7ce2fee7" +[[package]] +name = "ppv-lite86" +version = "0.2.17" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5b40af805b3121feab8a3c29f04d8ad262fa8e0561883e7653e024ae4479e6de" + [[package]] name = "primeorder" version = "0.13.6" @@ -1211,10 +1328,24 @@ dependencies = [ ] [[package]] -name = "radium" -version = "0.7.0" +name = "rand" +version = "0.8.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "34af8d1a0e25924bc5b7c43c079c942339d8f0a8b57c39049bef581b46327404" +dependencies = [ + "rand_chacha", + "rand_core", +] + +[[package]] +name = "rand_chacha" +version = "0.3.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "dc33ff2d4973d518d823d61aa239014831e521c75da58e3df4840d3f47749d09" +checksum = "e6c10a63a0fa32252be49d21e7709d4d4baf8d231c2dbce1eaa8141b9b127d88" +dependencies = [ + "ppv-lite86", + "rand_core", +] [[package]] name = "rand_core" @@ -1473,19 +1604,6 @@ dependencies = [ "serde", ] -[[package]] -name = "sha2" -version = "0.9.9" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4d58a1e1bf39749807d89cf2d98ac2dfa0ff1cb3faa38fbb64dd88ac8013d800" -dependencies = [ - "block-buffer 0.9.0", - "cfg-if", - "cpufeatures", - "digest 0.9.0", - "opaque-debug", -] - [[package]] name = "sha2" version = "0.10.8" @@ -1494,7 +1612,7 @@ checksum = "793db75ad2bcafc3ffa7c68b215fee268f537982cd901d132f89c6343f3a3dc8" dependencies = [ "cfg-if", "cpufeatures", - "digest 0.10.7", + "digest", ] [[package]] @@ -1513,7 +1631,7 @@ version = "2.1.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "5e1788eed21689f9cf370582dfc467ef36ed9c707f073528ddafa8d83e3b8500" dependencies = [ - "digest 0.10.7", + "digest", "rand_core", ] @@ -1630,12 +1748,6 @@ dependencies = [ "unicode-ident", ] -[[package]] -name = "tap" -version = "1.0.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "55937e1799185b12863d447f42597ed69d9928686b8d88a1df17376a097d8369" - [[package]] name = "target-lexicon" version = "0.12.7" @@ -2071,15 +2183,6 @@ version = "0.48.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "1a515f5799fe4961cb532f983ce2b23082366b898e52ffbce459c86f67c8378a" -[[package]] -name = "wyz" -version = "0.5.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "05f360fc0b24296329c78fda852a1e9ae82de9cf7b27dae4b7f62f118f77b9ed" -dependencies = [ - "tap", -] - [[package]] name = "zerocopy" version = "0.7.32" diff --git a/contracts/virus/Cargo.lock b/contracts/virus/Cargo.lock index 8a7c70234c..025cc3de5e 100644 --- a/contracts/virus/Cargo.lock +++ b/contracts/virus/Cargo.lock @@ -46,6 +46,127 @@ version = "0.2.16" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "0942ffc6dcaadf03badf6e6a2d0228460359d5e34b57ccdc720b7382dfbd5ec5" +[[package]] +name = "ark-bls12-381" +version = "0.4.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c775f0d12169cba7aae4caeb547bb6a50781c7449a8aa53793827c9ec4abf488" +dependencies = [ + "ark-ec", + "ark-ff", + "ark-serialize", + "ark-std", +] + +[[package]] +name = "ark-ec" +version = "0.4.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "defd9a439d56ac24968cca0571f598a61bc8c55f71d50a89cda591cb750670ba" +dependencies = [ + "ark-ff", + "ark-poly", + "ark-serialize", + "ark-std", + "derivative", + "hashbrown 0.13.2", + "itertools", + "num-traits", + "rayon", + "zeroize", +] + +[[package]] +name = "ark-ff" +version = "0.4.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ec847af850f44ad29048935519032c33da8aa03340876d351dfab5660d2966ba" +dependencies = [ + "ark-ff-asm", + "ark-ff-macros", + "ark-serialize", + "ark-std", + "derivative", + "digest", + "itertools", + "num-bigint", + "num-traits", + "paste", + "rayon", + "rustc_version", + "zeroize", +] + +[[package]] +name = "ark-ff-asm" +version = "0.4.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3ed4aa4fe255d0bc6d79373f7e31d2ea147bcf486cba1be5ba7ea85abdb92348" +dependencies = [ + "quote", + "syn 1.0.109", +] + +[[package]] +name = "ark-ff-macros" +version = "0.4.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7abe79b0e4288889c4574159ab790824d0033b9fdcb2a112a3182fac2e514565" +dependencies = [ + "num-bigint", + "num-traits", + "proc-macro2", + "quote", + "syn 1.0.109", +] + +[[package]] +name = "ark-poly" +version = "0.4.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d320bfc44ee185d899ccbadfa8bc31aab923ce1558716e1997a1e74057fe86bf" +dependencies = [ + "ark-ff", + "ark-serialize", + "ark-std", + "derivative", + "hashbrown 0.13.2", +] + +[[package]] +name = "ark-serialize" +version = "0.4.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "adb7b85a02b83d2f22f89bd5cac66c9c89474240cb6207cb1efc16d098e822a5" +dependencies = [ + "ark-serialize-derive", + "ark-std", + "digest", + "num-bigint", +] + +[[package]] +name = "ark-serialize-derive" +version = "0.4.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ae3281bc6d0fd7e549af32b52511e1302185bd688fd3359fa36423346ff682ea" +dependencies = [ + "proc-macro2", + "quote", + "syn 1.0.109", +] + +[[package]] +name = "ark-std" +version = "0.4.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "94893f1e0c6eeab764ade8dc4c0db24caf4fe7cbbaafc0eba0a9030f447b5185" +dependencies = [ + "num-traits", + "rand", + "rayon", +] + [[package]] name = "arrayvec" version = "0.7.2" @@ -103,27 +224,6 @@ version = "2.4.2" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "ed570934406eb16438a4e976b1b4500774099c13b8cb96eec99f620f05090ddf" -[[package]] -name = "bitvec" -version = "1.0.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1bc2832c24239b0141d5674bb9174f9d68a8b5b3f2753311927c172ca46f7e9c" -dependencies = [ - "funty", - "radium", - "tap", - "wyz", -] - -[[package]] -name = "block-buffer" -version = "0.9.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4152116fd6e9dadb291ae18fc1ec3575ed6d84c29642d97890f4b4a3417297e4" -dependencies = [ - "generic-array", -] - [[package]] name = "block-buffer" version = "0.10.2" @@ -133,20 +233,6 @@ dependencies = [ "generic-array", ] -[[package]] -name = "bls12_381" -version = "0.8.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d7bc6d6292be3a19e6379786dac800f551e5865a5bb51ebbe3064ab80433f403" -dependencies = [ - "digest 0.9.0", - "ff", - "group", - "pairing", - "rand_core", - "subtle", -] - [[package]] name = "bnum" version = "0.11.0" @@ -241,7 +327,7 @@ dependencies = [ "hex", "schemars", "serde", - "sha2 0.10.8", + "sha2", "static_assertions", "thiserror", ] @@ -250,17 +336,20 @@ dependencies = [ name = "cosmwasm-crypto" version = "2.0.1" dependencies = [ - "bls12_381", + "ark-bls12-381", + "ark-ec", + "ark-ff", + "ark-serialize", "derive_more", - "digest 0.10.7", + "digest", "ecdsa", "ed25519-zebra", "k256", + "num-traits", "p256", - "pairing", "rand_core", "rayon", - "sha2 0.9.9", + "sha2", "thiserror", ] @@ -308,7 +397,7 @@ dependencies = [ "schemars", "serde", "serde-json-wasm", - "sha2 0.10.8", + "sha2", "thiserror", ] @@ -328,7 +417,7 @@ dependencies = [ "schemars", "serde", "serde_json", - "sha2 0.10.8", + "sha2", "strum", "thiserror", "tracing", @@ -512,7 +601,7 @@ dependencies = [ "cfg-if", "cpufeatures", "curve25519-dalek-derive", - "digest 0.10.7", + "digest", "fiat-crypto", "platforms", "rustc_version", @@ -620,22 +709,13 @@ dependencies = [ "unicode-xid", ] -[[package]] -name = "digest" -version = "0.9.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d3dd60d1080a57a05ab032377049e0591415d2b31afd7028356dbf3cc6dcb066" -dependencies = [ - "generic-array", -] - [[package]] name = "digest" version = "0.10.7" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "9ed9a281f7bc9b7576e61468ba615a66a5c8cfdff42420a70aa82701a3b1e292" dependencies = [ - "block-buffer 0.10.2", + "block-buffer", "const-oid", "crypto-common", "subtle", @@ -680,7 +760,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "a4b1e0c257a9e9f25f90ff76d7a68360ed497ee519c8e428d1825ef0000799d4" dependencies = [ "der", - "digest 0.10.7", + "digest", "elliptic-curve", "rfc6979", "signature", @@ -706,7 +786,7 @@ dependencies = [ "hashbrown 0.14.3", "hex", "rand_core", - "sha2 0.10.8", + "sha2", "zeroize", ] @@ -724,7 +804,7 @@ checksum = "b5e6043086bf7973472e0c7dff2142ea0b680d30e18d9cc40f267efbf222bd47" dependencies = [ "base16ct", "crypto-bigint", - "digest 0.10.7", + "digest", "ff", "generic-array", "group", @@ -793,7 +873,6 @@ version = "0.13.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "ded41244b729663b1e574f1b4fb731469f69f79c17667b5d776b16cda0479449" dependencies = [ - "bitvec", "rand_core", "subtle", ] @@ -810,12 +889,6 @@ version = "1.0.7" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "3f9eec918d3f24069decb9af1554cad7c880e2da24a9afd88aca000531ab82c1" -[[package]] -name = "funty" -version = "2.0.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e6d5a32815ae3f33302d95fdcb2ce17862f8c65363dcfd29360480ba1001fc9c" - [[package]] name = "fxhash" version = "0.2.1" @@ -884,6 +957,15 @@ dependencies = [ "ahash 0.7.8", ] +[[package]] +name = "hashbrown" +version = "0.13.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "43a3c133739dddd0d2990f9a4bdf8eb4b21ef50e4851ca85ab661199821d510e" +dependencies = [ + "ahash 0.8.11", +] + [[package]] name = "hashbrown" version = "0.14.3" @@ -912,7 +994,7 @@ version = "0.12.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "6c49c37c09c17a53d937dfbb742eb3a961d65a994e6bcdcf37e7399d0cc8ab5e" dependencies = [ - "digest 0.10.7", + "digest", ] [[package]] @@ -941,6 +1023,15 @@ dependencies = [ "hashbrown 0.14.3", ] +[[package]] +name = "itertools" +version = "0.10.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b0fd2260e829bddf4cb6ea802289de2f86d6a7a690192fbe91b3f46e0f2c8473" +dependencies = [ + "either", +] + [[package]] name = "itoa" version = "0.4.7" @@ -965,7 +1056,7 @@ dependencies = [ "cfg-if", "ecdsa", "elliptic-curve", - "sha2 0.10.8", + "sha2", ] [[package]] @@ -1072,6 +1163,35 @@ version = "0.2.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "0debeb9fcf88823ea64d64e4a815ab1643f33127d995978e099942ce38f25238" +[[package]] +name = "num-bigint" +version = "0.4.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "608e7659b5c3d7cba262d894801b9ec9d00de989e8a82bd4bef91d08da45cdc0" +dependencies = [ + "autocfg", + "num-integer", + "num-traits", +] + +[[package]] +name = "num-integer" +version = "0.1.46" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7969661fd2958a5cb096e56c8e1ad0444ac2bbcd0061bd28660485a44879858f" +dependencies = [ + "num-traits", +] + +[[package]] +name = "num-traits" +version = "0.2.18" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "da0df0e5185db44f69b44f26786fe401b6c293d1907744beaa7fa62b2e5a517a" +dependencies = [ + "autocfg", +] + [[package]] name = "object" version = "0.25.3" @@ -1087,12 +1207,6 @@ version = "1.19.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "3fdb12b2476b595f9358c5161aa467c2438859caa136dec86c26fdd2efe17b92" -[[package]] -name = "opaque-debug" -version = "0.3.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c08d65885ee38876c4f86fa503fb49d7b507c2b62552df7c70b2fce627e06381" - [[package]] name = "p256" version = "0.13.2" @@ -1102,16 +1216,7 @@ dependencies = [ "ecdsa", "elliptic-curve", "primeorder", - "sha2 0.10.8", -] - -[[package]] -name = "pairing" -version = "0.23.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "81fec4625e73cf41ef4bb6846cafa6d44736525f442ba45e407c4a000a13996f" -dependencies = [ - "group", + "sha2", ] [[package]] @@ -1127,6 +1232,12 @@ dependencies = [ "windows-targets", ] +[[package]] +name = "paste" +version = "1.0.14" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "de3145af08024dea9fa9914f381a17b8fc6034dfb00f3a84013f7ff43f29ed4c" + [[package]] name = "pin-project-lite" version = "0.2.13" @@ -1139,6 +1250,12 @@ version = "3.4.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "db23d408679286588f4d4644f965003d056e3dd5abcaaa938116871d7ce2fee7" +[[package]] +name = "ppv-lite86" +version = "0.2.17" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5b40af805b3121feab8a3c29f04d8ad262fa8e0561883e7653e024ae4479e6de" + [[package]] name = "primeorder" version = "0.13.6" @@ -1211,10 +1328,24 @@ dependencies = [ ] [[package]] -name = "radium" -version = "0.7.0" +name = "rand" +version = "0.8.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "34af8d1a0e25924bc5b7c43c079c942339d8f0a8b57c39049bef581b46327404" +dependencies = [ + "rand_chacha", + "rand_core", +] + +[[package]] +name = "rand_chacha" +version = "0.3.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "dc33ff2d4973d518d823d61aa239014831e521c75da58e3df4840d3f47749d09" +checksum = "e6c10a63a0fa32252be49d21e7709d4d4baf8d231c2dbce1eaa8141b9b127d88" +dependencies = [ + "ppv-lite86", + "rand_core", +] [[package]] name = "rand_core" @@ -1473,19 +1604,6 @@ dependencies = [ "serde", ] -[[package]] -name = "sha2" -version = "0.9.9" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4d58a1e1bf39749807d89cf2d98ac2dfa0ff1cb3faa38fbb64dd88ac8013d800" -dependencies = [ - "block-buffer 0.9.0", - "cfg-if", - "cpufeatures", - "digest 0.9.0", - "opaque-debug", -] - [[package]] name = "sha2" version = "0.10.8" @@ -1494,7 +1612,7 @@ checksum = "793db75ad2bcafc3ffa7c68b215fee268f537982cd901d132f89c6343f3a3dc8" dependencies = [ "cfg-if", "cpufeatures", - "digest 0.10.7", + "digest", ] [[package]] @@ -1513,7 +1631,7 @@ version = "2.1.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "5e1788eed21689f9cf370582dfc467ef36ed9c707f073528ddafa8d83e3b8500" dependencies = [ - "digest 0.10.7", + "digest", "rand_core", ] @@ -1597,12 +1715,6 @@ dependencies = [ "unicode-ident", ] -[[package]] -name = "tap" -version = "1.0.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "55937e1799185b12863d447f42597ed69d9928686b8d88a1df17376a097d8369" - [[package]] name = "target-lexicon" version = "0.12.7" @@ -2050,15 +2162,6 @@ version = "0.48.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "1a515f5799fe4961cb532f983ce2b23082366b898e52ffbce459c86f67c8378a" -[[package]] -name = "wyz" -version = "0.5.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "05f360fc0b24296329c78fda852a1e9ae82de9cf7b27dae4b7f62f118f77b9ed" -dependencies = [ - "tap", -] - [[package]] name = "zerocopy" version = "0.7.32" diff --git a/packages/crypto/Cargo.toml b/packages/crypto/Cargo.toml index 0905ea74e2..7574a6751a 100644 --- a/packages/crypto/Cargo.toml +++ b/packages/crypto/Cargo.toml @@ -9,25 +9,36 @@ license = "Apache-2.0" [features] default = [] -std = ["dep:bls12_381", "dep:rayon", "dep:sha2_v9", "dep:thiserror"] +std = [ + "dep:ark-bls12-381", + "dep:ark-ec", + "dep:ark-ff", + "dep:ark-serialize", + "dep:num-traits", + "dep:rayon", + "dep:sha2", + "dep:thiserror" +] [lib] # See https://bheisler.github.io/criterion.rs/book/faq.html#cargo-bench-gives-unrecognized-option-errors-for-valid-command-line-options bench = false [dependencies] +ark-bls12-381 = { version = "0.4.0", optional = true } +ark-ec = { version = "0.4.2", features = ["parallel"], optional = true } +ark-ff = { version = "0.4.2", features = ["parallel"], optional = true } +ark-serialize = { version = "0.4.2", optional = true } derive_more = { version = "1.0.0-beta.6", default-features = false, features = ["display", "from"] } -k256 = { version = "0.13.3", default-features = false, features = ["ecdsa"] } -ed25519-zebra = { version = "4.0.3", default-features = false } digest = "0.10" -rand_core = "0.6" -# Not used directly, but needed to bump transitive dependency, see: https://github.com/CosmWasm/cosmwasm/pull/1899 for details. -ecdsa = "0.16.2" +ecdsa = "0.16.2" # Not used directly, but needed to bump transitive dependency, see: https://github.com/CosmWasm/cosmwasm/pull/1899 for details. +ed25519-zebra = { version = "4.0.3", default-features = false } +k256 = { version = "0.13.3", default-features = false, features = ["ecdsa"] } +num-traits = { version = "0.2.18", optional = true } p256 = { version = "0.13.2", default-features = false, features = ["ecdsa"] } -pairing = "0.23.0" -bls12_381 = { version = "0.8.0", features = ["experimental"], optional = true } +rand_core = "0.6" rayon = { version = "1.9.0", optional = true } -sha2_v9 = { package = "sha2", version = "0.9.1", optional = true } # Must be compatible with bls12_381, see https://github.com/zkcrypto/bls12_381/issues/102 +sha2 = { version = "0.10", optional = true } thiserror = { version = "1.0.26", optional = true } [dev-dependencies] diff --git a/packages/crypto/src/bls12_318/constants.rs b/packages/crypto/src/bls12_318/constants.rs index 1cf3e759ec..3667d6617b 100644 --- a/packages/crypto/src/bls12_318/constants.rs +++ b/packages/crypto/src/bls12_318/constants.rs @@ -1,11 +1,23 @@ -use bls12_381::{G1Affine, G2Affine}; +use ark_bls12_381::{G1Affine, G2Affine}; +use ark_ec::AffineRepr; +use ark_serialize::CanonicalSerialize; use crate::{BLS12_381_G1_POINT_LEN, BLS12_381_G2_POINT_LEN}; pub fn bls12_381_g1_generator() -> [u8; BLS12_381_G1_POINT_LEN] { - G1Affine::generator().to_compressed() + let mut point = [0_u8; BLS12_381_G1_POINT_LEN]; + G1Affine::generator() + .serialize_compressed(&mut point[..]) + .unwrap(); + + point } pub fn bls12_381_g2_generator() -> [u8; BLS12_381_G2_POINT_LEN] { - G2Affine::generator().to_compressed() + let mut point = [0_u8; BLS12_381_G2_POINT_LEN]; + G2Affine::generator() + .serialize_compressed(&mut point[..]) + .unwrap(); + + point } diff --git a/packages/crypto/src/bls12_318/hash.rs b/packages/crypto/src/bls12_318/hash.rs index ca13b8bdc2..7dbc2d51a8 100644 --- a/packages/crypto/src/bls12_318/hash.rs +++ b/packages/crypto/src/bls12_318/hash.rs @@ -1,11 +1,19 @@ -use bls12_381::{ - hash_to_curve::{ExpandMsgXmd, HashToCurve}, - G1Affine, G1Projective, G2Affine, G2Projective, +use ark_bls12_381::{g1, g2}; +use ark_ec::{ + hashing::{ + curve_maps::wb::WBMap, map_to_curve_hasher::MapToCurveBasedHasher, HashToCurve as _, + }, + short_weierstrass::Projective, }; -use sha2_v9::Sha256; +use ark_ff::field_hashers::DefaultFieldHasher; +use ark_serialize::CanonicalSerialize; +use sha2::Sha256; use crate::{CryptoError, BLS12_381_G1_POINT_LEN, BLS12_381_G2_POINT_LEN}; +type HashToCurve = + MapToCurveBasedHasher, DefaultFieldHasher, WBMap>; + #[derive(Clone, Copy, Debug)] #[non_exhaustive] pub enum HashFunction { @@ -29,13 +37,16 @@ pub fn bls12_381_hash_to_g1( msg: &[u8], dst: &[u8], ) -> [u8; BLS12_381_G1_POINT_LEN] { - let g1 = match hash { - HashFunction::Sha256 => { - >>::hash_to_curve(msg, dst) - } + let point = match hash { + HashFunction::Sha256 => HashToCurve::::new(dst) + .unwrap() + .hash(msg) + .unwrap(), }; - G1Affine::from(g1).to_compressed() + let mut serialized = [0; BLS12_381_G1_POINT_LEN]; + point.serialize_compressed(&mut serialized[..]).unwrap(); + serialized } pub fn bls12_381_hash_to_g2( @@ -43,11 +54,14 @@ pub fn bls12_381_hash_to_g2( msg: &[u8], dst: &[u8], ) -> [u8; BLS12_381_G2_POINT_LEN] { - let g2 = match hash { - HashFunction::Sha256 => { - >>::hash_to_curve(msg, dst) - } + let point = match hash { + HashFunction::Sha256 => HashToCurve::::new(dst) + .unwrap() + .hash(msg) + .unwrap(), }; - G2Affine::from(g2).to_compressed() + let mut serialized = [0; BLS12_381_G2_POINT_LEN]; + point.serialize_compressed(&mut serialized[..]).unwrap(); + serialized } diff --git a/packages/crypto/src/bls12_318/pairing.rs b/packages/crypto/src/bls12_318/pairing.rs index 8b606bfa1a..a690f303bc 100644 --- a/packages/crypto/src/bls12_318/pairing.rs +++ b/packages/crypto/src/bls12_318/pairing.rs @@ -3,8 +3,12 @@ use crate::{ }; use super::points::{g1_from_variable, g2_from_variable}; -use bls12_381::G2Prepared; -use pairing::group::Group; +use ark_bls12_381::Bls12_381; +use ark_ec::{ + bls12::{G1Prepared, G2Prepared}, + pairing::Pairing, +}; +use num_traits::Zero; use rayon::iter::{ParallelBridge, ParallelIterator}; pub fn bls12_381_aggregate_pairing_equality( @@ -45,26 +49,19 @@ pub fn bls12_381_aggregate_pairing_equality( let g1 = g1_from_variable(p)?; let g2 = g2_from_variable(q)?; - Ok((g1.0, G2Prepared::from(g2.0))) + Ok((G1Prepared::from(g1.0), G2Prepared::from(g2.0))) }) .collect::>()?; let r = g1_from_variable(r)?; let s = g2_from_variable(s)?; - let r_neg = -r.0; + let r_neg = G1Prepared::from(-r.0); let s_prepared = G2Prepared::from(s.0); - let ref_pq: Vec<_> = pq_pairs - .iter() - .map(|(g1, g2)| (g1, g2)) - .chain([(&r_neg, &s_prepared)]) - .collect(); + let (ps, qs): (Vec<_>, Vec<_>) = pq_pairs.into_iter().chain([(r_neg, s_prepared)]).unzip(); - Ok(bls12_381::multi_miller_loop(&ref_pq) - .final_exponentiation() - .is_identity() - .into()) + Ok(Bls12_381::multi_pairing(ps, qs).is_zero()) } /// Check whether the following condition holds true: @@ -86,22 +83,18 @@ pub fn bls12_381_pairing_equality( ); let p_neg = -p; - let terms = [ - (&p_neg.0, &G2Prepared::from(q.0)), - (&r.0, &G2Prepared::from(s.0)), - ]; - - Ok(bls12_381::multi_miller_loop(&terms) - .final_exponentiation() - .is_identity() - .into()) + + Ok(Bls12_381::multi_pairing( + [G1Prepared::from(p_neg.0), G1Prepared::from(r.0)], + [G2Prepared::from(q.0), G2Prepared::from(s.0)], + ) + .is_zero()) } #[cfg(test)] mod test { - use digest::generic_array::GenericArray; use hex_literal::hex; - use sha2_v9::{Digest, Sha256}; + use sha2::{Digest, Sha256}; use crate::{ bls12_318::points::{g1_from_fixed, g2_from_fixed, g2_from_variable, G1}, @@ -118,13 +111,10 @@ mod test { /// Public key League of Entropy Mainnet (curl -sS https://drand.cloudflare.com/info) const PK_LEO_MAINNET: [u8; 48] = hex!("868f005eb8e6e4ca0a47c8a77ceaa5309a47978a7c71bc5cce96366b5d7a569937c529eeda66c7293784a9402801af31"); - fn build_message( - round: u64, - previous_signature: &[u8], - ) -> GenericArray::OutputSize> { + fn build_message(round: u64, previous_signature: &[u8]) -> digest::Output { Sha256::new() - .chain(previous_signature) - .chain(round.to_be_bytes()) + .chain_update(previous_signature) + .chain_update(round.to_be_bytes()) .finalize() } diff --git a/packages/crypto/src/bls12_318/points.rs b/packages/crypto/src/bls12_318/points.rs index 3036ca1ea4..3a0da98ed9 100644 --- a/packages/crypto/src/bls12_318/points.rs +++ b/packages/crypto/src/bls12_318/points.rs @@ -1,16 +1,13 @@ #![allow(unused)] use alloc::vec::Vec; +use ark_serialize::{CanonicalDeserialize, CanonicalSerialize}; use core::ops::Add; use core::{fmt, ops::Neg}; -use bls12_381::hash_to_curve::ExpandMsgXmd; -use bls12_381::{ - hash_to_curve::{ExpandMessage, HashToCurve}, - G1Affine, G1Projective, G2Affine, G2Projective, -}; -use pairing::group::Group; -use sha2_v9::Sha256; +use ark_bls12_381::{G1Affine, G1Projective, G2Affine, G2Projective}; +use ark_ec::AffineRepr; +use num_traits::Zero; use crate::errors::InvalidPoint; use crate::{CryptoError, BLS12_381_G1_POINT_LEN, BLS12_381_G2_POINT_LEN}; @@ -35,22 +32,26 @@ impl G1 { /// Check if the point is the identity element #[inline] pub fn is_identity(&self) -> bool { - self.0.is_identity().into() + self.0.is_zero() } #[inline] pub fn from_uncompressed(data: &[u8; { BLS12_381_G1_POINT_LEN * 2 }]) -> Option { - G1Affine::from_uncompressed(data).map(Self).into() + G1Affine::deserialize_uncompressed(&data[..]).map(Self).ok() } #[inline] pub fn to_uncompressed(&self) -> [u8; { BLS12_381_G1_POINT_LEN * 2 }] { - self.0.to_uncompressed() + let mut serialized = [0; { BLS12_381_G1_POINT_LEN * 2 }]; + self.0.serialize_uncompressed(&mut serialized[..]).unwrap(); + serialized } #[inline] pub fn to_compressed(&self) -> [u8; BLS12_381_G1_POINT_LEN] { - self.0.to_compressed() + let mut serialized = [0; BLS12_381_G1_POINT_LEN]; + self.0.serialize_compressed(&mut serialized[..]).unwrap(); + serialized } } @@ -99,7 +100,7 @@ impl Neg for &G1 { impl core::iter::Sum for G1 { fn sum>(iter: I) -> Self { - let zero = G1Projective::identity(); + let zero = G1Projective::zero(); let sum = iter.fold(zero, |acc, next| acc + G1Projective::from(next.0)); G1(sum.into()) } @@ -107,7 +108,7 @@ impl core::iter::Sum for G1 { impl<'a> core::iter::Sum<&'a G1> for G1 { fn sum>(iter: I) -> Self { - let zero = G1Projective::identity(); + let zero = G1Projective::zero(); let sum = iter.fold(zero, |acc, next| acc + G1Projective::from(next.0)); G1(sum.into()) } @@ -133,22 +134,26 @@ impl G2 { /// Check if the point is the identity element #[inline] pub fn is_identity(&self) -> bool { - self.0.is_identity().into() + self.0.is_zero() } #[inline] pub fn from_uncompressed(data: &[u8; { BLS12_381_G2_POINT_LEN * 2 }]) -> Option { - G2Affine::from_uncompressed(data).map(Self).into() + G2Affine::deserialize_uncompressed(&data[..]).map(Self).ok() } #[inline] pub fn to_uncompressed(&self) -> [u8; { BLS12_381_G2_POINT_LEN * 2 }] { - self.0.to_uncompressed() + let mut serialized = [0; { BLS12_381_G2_POINT_LEN * 2 }]; + self.0.serialize_uncompressed(&mut serialized[..]).unwrap(); + serialized } #[inline] pub fn to_compressed(&self) -> [u8; BLS12_381_G2_POINT_LEN] { - self.0.to_compressed() + let mut serialized = [0; BLS12_381_G2_POINT_LEN]; + self.0.serialize_compressed(&mut serialized[..]).unwrap(); + serialized } } @@ -162,7 +167,7 @@ impl Add<&G2> for &G2 { impl core::iter::Sum for G2 { fn sum>(iter: I) -> Self { - let zero = G2Projective::identity(); + let zero = G2Projective::zero(); let sum = iter.fold(zero, |acc, next| acc + G2Projective::from(next.0)); G2(sum.into()) } @@ -170,7 +175,7 @@ impl core::iter::Sum for G2 { impl<'a> core::iter::Sum<&'a G2> for G2 { fn sum>(iter: I) -> Self { - let zero = G2Projective::identity(); + let zero = G2Projective::zero(); let sum = iter.fold(zero, |acc, next| acc + G2Projective::from(next.0)); G2(sum.into()) } @@ -215,7 +220,8 @@ pub fn g2_from_variable(data: &[u8]) -> Result { } pub fn g1_from_fixed(data: &[u8; BLS12_381_G1_POINT_LEN]) -> Result { - Option::from(G1Affine::from_compressed(data)) + G1Affine::deserialize_compressed(&data[..]) + .ok() .map(G1) .ok_or_else(|| InvalidPoint::DecodingError {}.into()) } @@ -223,13 +229,15 @@ pub fn g1_from_fixed(data: &[u8; BLS12_381_G1_POINT_LEN]) -> Result Result { - Option::from(G1Affine::from_compressed_unchecked(&data)) + G1Affine::deserialize_compressed_unchecked(&data[..]) + .ok() .map(G1) .ok_or_else(|| InvalidPoint::DecodingError {}.into()) } pub fn g2_from_fixed(data: &[u8; BLS12_381_G2_POINT_LEN]) -> Result { - Option::from(G2Affine::from_compressed(data)) + G2Affine::deserialize_compressed(&data[..]) + .ok() .map(G2) .ok_or_else(|| InvalidPoint::DecodingError {}.into()) } @@ -237,7 +245,8 @@ pub fn g2_from_fixed(data: &[u8; BLS12_381_G2_POINT_LEN]) -> Result Result { - Option::from(G2Affine::from_compressed_unchecked(&data)) + G2Affine::deserialize_compressed_unchecked(&data[..]) + .ok() .map(G2) .ok_or_else(|| InvalidPoint::DecodingError {}.into()) } diff --git a/packages/crypto/tests/bls12_381.rs b/packages/crypto/tests/bls12_381.rs index 48fde219b6..0a78c9e2f2 100644 --- a/packages/crypto/tests/bls12_381.rs +++ b/packages/crypto/tests/bls12_381.rs @@ -2,12 +2,13 @@ use std::{error::Error, fs}; +use ark_serialize::{CanonicalDeserialize, CanonicalSerialize}; use base64::engine::general_purpose::STANDARD; use base64_serde::base64_serde_type; use cosmwasm_crypto::{ bls12_381_aggregate_g1, bls12_381_aggregate_g2, bls12_381_aggregate_pairing_equality, bls12_381_g1_generator, bls12_381_g1_is_identity, bls12_381_g2_is_identity, - bls12_381_hash_to_g2, bls12_381_pairing_equality, HashFunction, + bls12_381_hash_to_g2, bls12_381_pairing_equality, HashFunction, BLS12_381_G2_POINT_LEN, }; const PROOF_OF_POSSESSION_DST: &[u8] = b"BLS_SIG_BLS12381G2_XMD:SHA-256_SSWU_RO_POP_"; @@ -205,12 +206,15 @@ fn bls12_381_hash_to_g2_works() { let decoded_y = hex::decode(format!("{y2}{y1}")).unwrap(); let uncompressed = [decoded_x.as_slice(), &decoded_y].concat(); - let affine = - bls12_381::G2Affine::from_uncompressed(&uncompressed.try_into().unwrap()).unwrap(); + let affine = ark_bls12_381::G2Affine::deserialize_uncompressed(&uncompressed[..]).unwrap(); + let mut compressed_affine = [0; BLS12_381_G2_POINT_LEN]; + affine + .serialize_compressed(&mut compressed_affine[..]) + .unwrap(); assert_eq!( g2_point, - affine.to_compressed(), + compressed_affine, "Failed with test vector {}", path.display() ); diff --git a/packages/vm/src/environment.rs b/packages/vm/src/environment.rs index b36426ce18..a962949f03 100644 --- a/packages/vm/src/environment.rs +++ b/packages/vm/src/environment.rs @@ -72,10 +72,10 @@ impl Default for GasConfig { // From https://docs.rs/ed25519-zebra/2.2.0/ed25519_zebra/batch/index.html ed25519_batch_verify_cost: 63 * GAS_PER_US / 2, ed25519_batch_verify_one_pubkey_cost: 63 * GAS_PER_US / 4, - bls12_381_hash_to_g1_cost: 95 * GAS_PER_US, - bls12_381_hash_to_g2_cost: 392 * GAS_PER_US, + bls12_381_hash_to_g1_cost: 337 * GAS_PER_US, + bls12_381_hash_to_g2_cost: 543 * GAS_PER_US, // god i wish i was lying - bls12_381_pairing_equality_cost: 1733 * GAS_PER_US, + bls12_381_pairing_equality_cost: 1409 * GAS_PER_US, } } } diff --git a/packages/vm/src/testing/instance.rs b/packages/vm/src/testing/instance.rs index c4da5f1a1f..b3f3e15692 100644 --- a/packages/vm/src/testing/instance.rs +++ b/packages/vm/src/testing/instance.rs @@ -17,8 +17,7 @@ use super::storage::MockStorage; /// This gas limit is used in integration tests and should be high enough to allow a reasonable /// number of contract executions and queries on one instance. For this reason it is significatly /// higher than the limit for a single execution that we have in the production setup. -//const DEFAULT_GAS_LIMIT: u64 = 500_000_000; // ~0.5ms -const DEFAULT_GAS_LIMIT: u64 = 2_150_000_000; // ~2.15ms +const DEFAULT_GAS_LIMIT: u64 = 1_966_000_000; // ~1.966ms const DEFAULT_MEMORY_LIMIT: Option = Some(Size::mebi(16)); pub fn mock_instance( From 1d7eb3ae87e10bf28207b96e925282d55dcbf2c4 Mon Sep 17 00:00:00 2001 From: Aumetra Weisman Date: Tue, 16 Apr 2024 13:42:39 +0200 Subject: [PATCH 31/79] Use assembly feature --- packages/crypto/Cargo.toml | 2 +- packages/vm/src/environment.rs | 2 +- packages/vm/src/testing/instance.rs | 2 +- 3 files changed, 3 insertions(+), 3 deletions(-) diff --git a/packages/crypto/Cargo.toml b/packages/crypto/Cargo.toml index 7574a6751a..a8ae36b5ad 100644 --- a/packages/crypto/Cargo.toml +++ b/packages/crypto/Cargo.toml @@ -27,7 +27,7 @@ bench = false [dependencies] ark-bls12-381 = { version = "0.4.0", optional = true } ark-ec = { version = "0.4.2", features = ["parallel"], optional = true } -ark-ff = { version = "0.4.2", features = ["parallel"], optional = true } +ark-ff = { version = "0.4.2", features = ["asm", "parallel"], optional = true } ark-serialize = { version = "0.4.2", optional = true } derive_more = { version = "1.0.0-beta.6", default-features = false, features = ["display", "from"] } digest = "0.10" diff --git a/packages/vm/src/environment.rs b/packages/vm/src/environment.rs index a962949f03..7ac5c52ad9 100644 --- a/packages/vm/src/environment.rs +++ b/packages/vm/src/environment.rs @@ -75,7 +75,7 @@ impl Default for GasConfig { bls12_381_hash_to_g1_cost: 337 * GAS_PER_US, bls12_381_hash_to_g2_cost: 543 * GAS_PER_US, // god i wish i was lying - bls12_381_pairing_equality_cost: 1409 * GAS_PER_US, + bls12_381_pairing_equality_cost: 1318 * GAS_PER_US, } } } diff --git a/packages/vm/src/testing/instance.rs b/packages/vm/src/testing/instance.rs index b3f3e15692..046802a1de 100644 --- a/packages/vm/src/testing/instance.rs +++ b/packages/vm/src/testing/instance.rs @@ -17,7 +17,7 @@ use super::storage::MockStorage; /// This gas limit is used in integration tests and should be high enough to allow a reasonable /// number of contract executions and queries on one instance. For this reason it is significatly /// higher than the limit for a single execution that we have in the production setup. -const DEFAULT_GAS_LIMIT: u64 = 1_966_000_000; // ~1.966ms +const DEFAULT_GAS_LIMIT: u64 = 1_875_000_000; // ~1.875ms const DEFAULT_MEMORY_LIMIT: Option = Some(Size::mebi(16)); pub fn mock_instance( From 2a89b9e83bd03c7f75170b3d98a07f3c8017f4d3 Mon Sep 17 00:00:00 2001 From: Aumetra Weisman Date: Tue, 16 Apr 2024 13:49:18 +0200 Subject: [PATCH 32/79] Readjust gas values --- packages/vm/src/environment.rs | 4 ++-- packages/vm/src/testing/instance.rs | 2 +- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/packages/vm/src/environment.rs b/packages/vm/src/environment.rs index 7ac5c52ad9..a0ed3a4393 100644 --- a/packages/vm/src/environment.rs +++ b/packages/vm/src/environment.rs @@ -72,8 +72,8 @@ impl Default for GasConfig { // From https://docs.rs/ed25519-zebra/2.2.0/ed25519_zebra/batch/index.html ed25519_batch_verify_cost: 63 * GAS_PER_US / 2, ed25519_batch_verify_one_pubkey_cost: 63 * GAS_PER_US / 4, - bls12_381_hash_to_g1_cost: 337 * GAS_PER_US, - bls12_381_hash_to_g2_cost: 543 * GAS_PER_US, + bls12_381_hash_to_g1_cost: 324 * GAS_PER_US, + bls12_381_hash_to_g2_cost: 528 * GAS_PER_US, // god i wish i was lying bls12_381_pairing_equality_cost: 1318 * GAS_PER_US, } diff --git a/packages/vm/src/testing/instance.rs b/packages/vm/src/testing/instance.rs index 046802a1de..7ea8933840 100644 --- a/packages/vm/src/testing/instance.rs +++ b/packages/vm/src/testing/instance.rs @@ -17,7 +17,7 @@ use super::storage::MockStorage; /// This gas limit is used in integration tests and should be high enough to allow a reasonable /// number of contract executions and queries on one instance. For this reason it is significatly /// higher than the limit for a single execution that we have in the production setup. -const DEFAULT_GAS_LIMIT: u64 = 1_875_000_000; // ~1.875ms +const DEFAULT_GAS_LIMIT: u64 = 1_860_000_000; // ~1.86ms const DEFAULT_MEMORY_LIMIT: Option = Some(Size::mebi(16)); pub fn mock_instance( From 388e9eb9463f466e2f71871a5c6ebe3a13335c2c Mon Sep 17 00:00:00 2001 From: Aumetra Weisman Date: Tue, 16 Apr 2024 14:01:01 +0200 Subject: [PATCH 33/79] Remove unused impls --- packages/crypto/src/bls12_318/points.rs | 66 ------------------------- 1 file changed, 66 deletions(-) diff --git a/packages/crypto/src/bls12_318/points.rs b/packages/crypto/src/bls12_318/points.rs index 3a0da98ed9..996d0b8fda 100644 --- a/packages/crypto/src/bls12_318/points.rs +++ b/packages/crypto/src/bls12_318/points.rs @@ -35,18 +35,6 @@ impl G1 { self.0.is_zero() } - #[inline] - pub fn from_uncompressed(data: &[u8; { BLS12_381_G1_POINT_LEN * 2 }]) -> Option { - G1Affine::deserialize_uncompressed(&data[..]).map(Self).ok() - } - - #[inline] - pub fn to_uncompressed(&self) -> [u8; { BLS12_381_G1_POINT_LEN * 2 }] { - let mut serialized = [0; { BLS12_381_G1_POINT_LEN * 2 }]; - self.0.serialize_uncompressed(&mut serialized[..]).unwrap(); - serialized - } - #[inline] pub fn to_compressed(&self) -> [u8; BLS12_381_G1_POINT_LEN] { let mut serialized = [0; BLS12_381_G1_POINT_LEN]; @@ -55,24 +43,6 @@ impl G1 { } } -impl Add for G1 { - type Output = G1; - - fn add(self, rhs: Self) -> Self { - let sum = self.0 + G1Projective::from(rhs.0); - Self(sum.into()) - } -} - -impl Add<&G1> for G1 { - type Output = G1; - - fn add(self, rhs: &G1) -> G1 { - let sum = self.0 + G1Projective::from(rhs.0); - G1(sum.into()) - } -} - impl Add<&G1> for &G1 { type Output = G1; @@ -90,22 +60,6 @@ impl Neg for G1 { } } -impl Neg for &G1 { - type Output = G1; - - fn neg(self) -> Self::Output { - G1(-self.0) - } -} - -impl core::iter::Sum for G1 { - fn sum>(iter: I) -> Self { - let zero = G1Projective::zero(); - let sum = iter.fold(zero, |acc, next| acc + G1Projective::from(next.0)); - G1(sum.into()) - } -} - impl<'a> core::iter::Sum<&'a G1> for G1 { fn sum>(iter: I) -> Self { let zero = G1Projective::zero(); @@ -137,18 +91,6 @@ impl G2 { self.0.is_zero() } - #[inline] - pub fn from_uncompressed(data: &[u8; { BLS12_381_G2_POINT_LEN * 2 }]) -> Option { - G2Affine::deserialize_uncompressed(&data[..]).map(Self).ok() - } - - #[inline] - pub fn to_uncompressed(&self) -> [u8; { BLS12_381_G2_POINT_LEN * 2 }] { - let mut serialized = [0; { BLS12_381_G2_POINT_LEN * 2 }]; - self.0.serialize_uncompressed(&mut serialized[..]).unwrap(); - serialized - } - #[inline] pub fn to_compressed(&self) -> [u8; BLS12_381_G2_POINT_LEN] { let mut serialized = [0; BLS12_381_G2_POINT_LEN]; @@ -165,14 +107,6 @@ impl Add<&G2> for &G2 { } } -impl core::iter::Sum for G2 { - fn sum>(iter: I) -> Self { - let zero = G2Projective::zero(); - let sum = iter.fold(zero, |acc, next| acc + G2Projective::from(next.0)); - G2(sum.into()) - } -} - impl<'a> core::iter::Sum<&'a G2> for G2 { fn sum>(iter: I) -> Self { let zero = G2Projective::zero(); From 81ddc81880ea107cca2a72af3088d560b79a5df1 Mon Sep 17 00:00:00 2001 From: Aumetra Weisman Date: Tue, 16 Apr 2024 15:18:49 +0200 Subject: [PATCH 34/79] Add benches for aggregation --- packages/crypto/benches/main.rs | 49 ++++++++++++++++++++++++++++++--- 1 file changed, 45 insertions(+), 4 deletions(-) diff --git a/packages/crypto/benches/main.rs b/packages/crypto/benches/main.rs index 60be978553..34b3b39f2a 100644 --- a/packages/crypto/benches/main.rs +++ b/packages/crypto/benches/main.rs @@ -1,6 +1,9 @@ +use ark_bls12_381::{G1Affine, G2Affine}; +use ark_ff::UniformRand; +use ark_serialize::CanonicalSerialize; use criterion::{criterion_group, criterion_main, Criterion, PlottingBackend}; use rand_core::OsRng; -use std::{hint::black_box, time::Duration}; +use std::{hint::black_box, io, time::Duration}; use english_numbers::convert_no_fmt; use hex_literal::hex; @@ -12,9 +15,10 @@ use k256::ecdsa::SigningKey; // type alias use sha2::Sha256; use cosmwasm_crypto::{ - bls12_381_g1_generator, bls12_381_hash_to_g1, bls12_381_hash_to_g2, bls12_381_pairing_equality, - ed25519_batch_verify, ed25519_verify, secp256k1_recover_pubkey, secp256k1_verify, - secp256r1_recover_pubkey, secp256r1_verify, HashFunction, + bls12_381_aggregate_g1, bls12_381_aggregate_g2, bls12_381_g1_generator, bls12_381_hash_to_g1, + bls12_381_hash_to_g2, bls12_381_pairing_equality, ed25519_batch_verify, ed25519_verify, + secp256k1_recover_pubkey, secp256k1_verify, secp256r1_recover_pubkey, secp256r1_verify, + HashFunction, BLS12_381_G1_POINT_LEN, BLS12_381_G2_POINT_LEN, }; use std::cmp::min; @@ -146,6 +150,43 @@ fn bench_crypto(c: &mut Criterion) { }); }); + let two_pow_max = 8; + let num_random_points = 2_usize.pow(two_pow_max); + + let random_points_g1: Vec = (0..num_random_points) + .map(|_| G1Affine::rand(&mut OsRng)) + .collect(); + let mut g1_serialized = io::Cursor::new(Vec::new()); + random_points_g1 + .serialize_compressed(&mut g1_serialized) + .unwrap(); + let g1_serialized = &g1_serialized.into_inner()[8..]; + + let random_points_g2: Vec = (0..num_random_points) + .map(|_| G2Affine::rand(&mut OsRng)) + .collect(); + let mut g2_serialized = io::Cursor::new(Vec::new()); + random_points_g2 + .serialize_compressed(&mut g2_serialized) + .unwrap(); + let g2_serialized = &g2_serialized.into_inner()[8..]; + + for i in 1..=two_pow_max { + let num_points = 2_usize.pow(i); + let points_to_aggregate_g1 = &g1_serialized[..num_points * BLS12_381_G1_POINT_LEN]; + group.bench_function(format!("bls12_381_aggregate_g1_{num_points}"), |b| { + b.iter(|| bls12_381_aggregate_g1(points_to_aggregate_g1).unwrap()); + }); + } + + for i in 1..=two_pow_max { + let num_points = 2_usize.pow(i); + let points_to_aggregate_g2 = &g2_serialized[..num_points * BLS12_381_G2_POINT_LEN]; + group.bench_function(format!("bls12_381_aggregate_g2_{num_points}"), |b| { + b.iter(|| bls12_381_aggregate_g2(points_to_aggregate_g2).unwrap()); + }); + } + group.bench_function("bls12_381_hash_to_g1", |b| { b.iter(|| { bls12_381_hash_to_g1( From 737b2ee3d34309eeff3d0ea3be9dd11ad1611ffe Mon Sep 17 00:00:00 2001 From: Aumetra Weisman Date: Wed, 17 Apr 2024 11:52:24 +0200 Subject: [PATCH 35/79] Add hash-to-curve tests --- packages/crypto/src/bls12_318/hash.rs | 35 +++++++++++++++++++++++++++ packages/crypto/tests/bls12_381.rs | 19 ++++----------- 2 files changed, 40 insertions(+), 14 deletions(-) diff --git a/packages/crypto/src/bls12_318/hash.rs b/packages/crypto/src/bls12_318/hash.rs index 7dbc2d51a8..32f09f2a76 100644 --- a/packages/crypto/src/bls12_318/hash.rs +++ b/packages/crypto/src/bls12_318/hash.rs @@ -65,3 +65,38 @@ pub fn bls12_381_hash_to_g2( point.serialize_compressed(&mut serialized[..]).unwrap(); serialized } + +#[cfg(test)] +mod test { + use hex_literal::hex; + + use crate::{bls12_381_hash_to_g1, bls12_381_hash_to_g2, HashFunction}; + + #[test] + fn hash_to_g1_works() { + // See: ; Section J.9.1 + + let msg = b"abc"; + let dst = b"QUUX-V01-CS02-with-BLS12381G1_XMD:SHA-256_SSWU_RO_"; + + let hashed_point = bls12_381_hash_to_g1(HashFunction::Sha256, msg, dst); + let mut serialized_expected_compressed = hex!("03567bc5ef9c690c2ab2ecdf6a96ef1c139cc0b2f284dca0a9a7943388a49a3aee664ba5379a7655d3c68900be2f6903"); + // Set the compression tag + serialized_expected_compressed[0] |= 0b1000_0000; + + assert_eq!(hashed_point, serialized_expected_compressed); + } + + #[test] + fn hash_to_g2_works() { + let msg = b"abc"; + let dst = b"QUUX-V01-CS02-with-BLS12381G2_XMD:SHA-256_SSWU_RO_"; + + let hashed_point = bls12_381_hash_to_g2(HashFunction::Sha256, msg, dst); + let mut serialized_expected_compressed = hex!("139cddbccdc5e91b9623efd38c49f81a6f83f175e80b06fc374de9eb4b41dfe4ca3a230ed250fbe3a2acf73a41177fd802c2d18e033b960562aae3cab37a27ce00d80ccd5ba4b7fe0e7a210245129dbec7780ccc7954725f4168aff2787776e6"); + // Set the compression tag + serialized_expected_compressed[0] |= 0b1000_0000; + + assert_eq!(hashed_point, serialized_expected_compressed); + } +} diff --git a/packages/crypto/tests/bls12_381.rs b/packages/crypto/tests/bls12_381.rs index 0a78c9e2f2..a8b94281f3 100644 --- a/packages/crypto/tests/bls12_381.rs +++ b/packages/crypto/tests/bls12_381.rs @@ -199,22 +199,13 @@ fn bls12_381_hash_to_g2_works() { let prepared_x = test_data.output.x.replace("0x", ""); let (x1, x2) = prepared_x.split_once(',').unwrap(); - let decoded_x = hex::decode(format!("{x2}{x1}")).unwrap(); - - let prepared_y = test_data.output.y.replace("0x", ""); - let (y1, y2) = prepared_y.split_once(',').unwrap(); - let decoded_y = hex::decode(format!("{y2}{y1}")).unwrap(); - let uncompressed = [decoded_x.as_slice(), &decoded_y].concat(); - - let affine = ark_bls12_381::G2Affine::deserialize_uncompressed(&uncompressed[..]).unwrap(); - let mut compressed_affine = [0; BLS12_381_G2_POINT_LEN]; - affine - .serialize_compressed(&mut compressed_affine[..]) - .unwrap(); + let mut decoded_x = hex::decode(format!("{x2}{x1}")).unwrap(); + // Set the compression tag + decoded_x[0] |= 0b1000_0000; assert_eq!( - g2_point, - compressed_affine, + g2_point.as_slice(), + decoded_x.as_slice(), "Failed with test vector {}", path.display() ); From 7c6e8d957f357bda0658cbe96ced6eaca34950cc Mon Sep 17 00:00:00 2001 From: Aumetra Weisman Date: Wed, 17 Apr 2024 12:03:38 +0200 Subject: [PATCH 36/79] Add generator tests --- packages/crypto/src/bls12_318/constants.rs | 21 +++++++++++++++++++++ 1 file changed, 21 insertions(+) diff --git a/packages/crypto/src/bls12_318/constants.rs b/packages/crypto/src/bls12_318/constants.rs index 3667d6617b..224e9d530a 100644 --- a/packages/crypto/src/bls12_318/constants.rs +++ b/packages/crypto/src/bls12_318/constants.rs @@ -21,3 +21,24 @@ pub fn bls12_381_g2_generator() -> [u8; BLS12_381_G2_POINT_LEN] { point } + +#[cfg(test)] +mod test { + use hex_literal::hex; + + use crate::{bls12_381_g1_generator, bls12_381_g2_generator}; + + #[test] + fn g1_generator_correct() { + let mut generator = hex!("17f1d3a73197d7942695638c4fa9ac0fc3688c4f9774b905a14e3a3f171bac586c55e83ff97a1aeffb3af00adb22c6bb"); + generator[0] |= 0b1000_0000; + assert_eq!(generator, bls12_381_g1_generator()); + } + + #[test] + fn g2_generator_correct() { + let mut generator = hex!("13e02b6052719f607dacd3a088274f65596bd0d09920b61ab5da61bbdc7f5049334cf11213945d57e5ac7d055d042b7e024aa2b2f08f0a91260805272dc51051c6e47ad4fa403b02b4510b647ae3d1770bac0326a805bbefd48056c8c121bdb8"); + generator[0] |= 0b1000_0000; + assert_eq!(generator, bls12_381_g2_generator()); + } +} From d8bfc224e6a479e69c4bda6e925415d34a972731 Mon Sep 17 00:00:00 2001 From: Aumetra Weisman Date: Wed, 17 Apr 2024 12:06:36 +0200 Subject: [PATCH 37/79] Revert test change --- packages/crypto/tests/bls12_381.rs | 19 ++++++++++++++----- 1 file changed, 14 insertions(+), 5 deletions(-) diff --git a/packages/crypto/tests/bls12_381.rs b/packages/crypto/tests/bls12_381.rs index a8b94281f3..0a78c9e2f2 100644 --- a/packages/crypto/tests/bls12_381.rs +++ b/packages/crypto/tests/bls12_381.rs @@ -199,13 +199,22 @@ fn bls12_381_hash_to_g2_works() { let prepared_x = test_data.output.x.replace("0x", ""); let (x1, x2) = prepared_x.split_once(',').unwrap(); - let mut decoded_x = hex::decode(format!("{x2}{x1}")).unwrap(); - // Set the compression tag - decoded_x[0] |= 0b1000_0000; + let decoded_x = hex::decode(format!("{x2}{x1}")).unwrap(); + + let prepared_y = test_data.output.y.replace("0x", ""); + let (y1, y2) = prepared_y.split_once(',').unwrap(); + let decoded_y = hex::decode(format!("{y2}{y1}")).unwrap(); + let uncompressed = [decoded_x.as_slice(), &decoded_y].concat(); + + let affine = ark_bls12_381::G2Affine::deserialize_uncompressed(&uncompressed[..]).unwrap(); + let mut compressed_affine = [0; BLS12_381_G2_POINT_LEN]; + affine + .serialize_compressed(&mut compressed_affine[..]) + .unwrap(); assert_eq!( - g2_point.as_slice(), - decoded_x.as_slice(), + g2_point, + compressed_affine, "Failed with test vector {}", path.display() ); From 305f8ae23551a2a3c67b485bfc993c1cf0a5fd35 Mon Sep 17 00:00:00 2001 From: Aumetra Weisman Date: Wed, 17 Apr 2024 12:35:10 +0200 Subject: [PATCH 38/79] Add error tests --- packages/crypto/src/bls12_318/pairing.rs | 57 ++++++++++++++++++++++-- 1 file changed, 53 insertions(+), 4 deletions(-) diff --git a/packages/crypto/src/bls12_318/pairing.rs b/packages/crypto/src/bls12_318/pairing.rs index a690f303bc..0de4f08de0 100644 --- a/packages/crypto/src/bls12_318/pairing.rs +++ b/packages/crypto/src/bls12_318/pairing.rs @@ -31,10 +31,10 @@ pub fn bls12_381_aggregate_pairing_equality( remainder: qs.len() % BLS12_381_G2_POINT_LEN, } .into()); - } else if ps.len() % BLS12_381_G1_POINT_LEN != qs.len() % BLS12_381_G2_POINT_LEN { + } else if (ps.len() / BLS12_381_G1_POINT_LEN) != (qs.len() / BLS12_381_G2_POINT_LEN) { return Err(AggregationPairingEquality::UnequalPointAmount { - left: ps.len() % BLS12_381_G1_POINT_LEN, - right: qs.len() % BLS12_381_G2_POINT_LEN, + left: ps.len() / BLS12_381_G1_POINT_LEN, + right: qs.len() / BLS12_381_G2_POINT_LEN, } .into()); } @@ -98,7 +98,8 @@ mod test { use crate::{ bls12_318::points::{g1_from_fixed, g2_from_fixed, g2_from_variable, G1}, - bls12_381_hash_to_g2, bls12_381_pairing_equality, HashFunction, + bls12_381_aggregate_pairing_equality, bls12_381_hash_to_g2, bls12_381_pairing_equality, + AggregationPairingEqualityError, CryptoError, HashFunction, }; // Let's directly go for something really cool and advanced: @@ -182,4 +183,52 @@ mod test { ) .unwrap()); } + + #[test] + fn aggregate_pairing_equality_error_cases_work() { + let result = bls12_381_aggregate_pairing_equality(&[], &[12], &[12], &[12]); + assert!(matches!( + result, + Err(CryptoError::AggregationPairingEquality { + source: AggregationPairingEqualityError::EmptyG1, + .. + }) + )); + + let result = bls12_381_aggregate_pairing_equality(&[12], &[], &[12], &[12]); + assert!(matches!( + result, + Err(CryptoError::AggregationPairingEquality { + source: AggregationPairingEqualityError::EmptyG2, + .. + }) + )); + + let result = bls12_381_aggregate_pairing_equality(&[12], &[0; 96], &[12], &[12]); + assert!(matches!( + result, + Err(CryptoError::AggregationPairingEquality { + source: AggregationPairingEqualityError::NotMultipleG1 { remainder: 1 }, + .. + }) + )); + + let result = bls12_381_aggregate_pairing_equality(&[0; 48], &[12], &[12], &[12]); + assert!(matches!( + result, + Err(CryptoError::AggregationPairingEquality { + source: AggregationPairingEqualityError::NotMultipleG2 { remainder: 1 }, + .. + }) + )); + + let result = bls12_381_aggregate_pairing_equality(&[0; 96], &[0; 96], &[12], &[12]); + assert!(matches!( + result, + Err(CryptoError::AggregationPairingEquality { + source: AggregationPairingEqualityError::UnequalPointAmount { left: 2, right: 1 }, + .. + }) + )); + } } From 3c8c7be96d356aca42c1a349e059c105d1e7e811 Mon Sep 17 00:00:00 2001 From: Aumetra Weisman Date: Wed, 17 Apr 2024 14:53:36 +0200 Subject: [PATCH 39/79] Add some mock testing --- packages/std/src/testing/mock.rs | 70 ++++++++++++++++++++++++++++++++ 1 file changed, 70 insertions(+) diff --git a/packages/std/src/testing/mock.rs b/packages/std/src/testing/mock.rs index 298067fa67..2c58f26f4f 100644 --- a/packages/std/src/testing/mock.rs +++ b/packages/std/src/testing/mock.rs @@ -1195,6 +1195,13 @@ mod tests { const ED25519_PUBKEY_HEX: &str = "3d4017c3e843895a92b70aa74d1b7ebc9c982ccf2ec4968cc0cd55f12af4660c"; + // See https://github.com/drand/kyber-bls12381/issues/22 and + // https://github.com/drand/drand/pull/1249 + const DOMAIN_HASH_TO_G2: &[u8] = b"BLS_SIG_BLS12381G2_XMD:SHA-256_SSWU_RO_NUL_"; + + /// Public key League of Entropy Mainnet (curl -sS https://drand.cloudflare.com/info) + const PK_LEO_MAINNET: [u8; 48] = hex!("868f005eb8e6e4ca0a47c8a77ceaa5309a47978a7c71bc5cce96366b5d7a569937c529eeda66c7293784a9402801af31"); + #[test] fn mock_info_works() { let info = mock_info("my name", &coins(100, "atom")); @@ -1312,6 +1319,69 @@ mod tests { ); } + #[test] + fn bls12_381_hash_to_g1_works() { + // See: ; Section J.9.1 + + let api = MockApi::default(); + let msg = b"abc"; + let dst = b"QUUX-V01-CS02-with-BLS12381G1_XMD:SHA-256_SSWU_RO_"; + + let hashed_point = api + .bls12_381_hash_to_g1(HashFunction::Sha256, msg, dst) + .unwrap(); + let mut serialized_expected_compressed = hex!("03567bc5ef9c690c2ab2ecdf6a96ef1c139cc0b2f284dca0a9a7943388a49a3aee664ba5379a7655d3c68900be2f6903"); + // Set the compression tag + serialized_expected_compressed[0] |= 0b1000_0000; + + assert_eq!(hashed_point, serialized_expected_compressed); + } + + #[test] + fn bls12_381_hash_to_g2_works() { + let api = MockApi::default(); + let msg = b"abc"; + let dst = b"QUUX-V01-CS02-with-BLS12381G2_XMD:SHA-256_SSWU_RO_"; + + let hashed_point = api + .bls12_381_hash_to_g2(HashFunction::Sha256, msg, dst) + .unwrap(); + let mut serialized_expected_compressed = hex!("139cddbccdc5e91b9623efd38c49f81a6f83f175e80b06fc374de9eb4b41dfe4ca3a230ed250fbe3a2acf73a41177fd802c2d18e033b960562aae3cab37a27ce00d80ccd5ba4b7fe0e7a210245129dbec7780ccc7954725f4168aff2787776e6"); + // Set the compression tag + serialized_expected_compressed[0] |= 0b1000_0000; + + assert_eq!(hashed_point, serialized_expected_compressed); + } + + #[test] + fn bls12_318_pairing_equality_works() { + fn build_bls_message(round: u64, previous_signature: &[u8]) -> Vec { + Sha256::new() + .chain_update(previous_signature) + .chain_update(round.to_be_bytes()) + .finalize() + .to_vec() + } + + let api = MockApi::default(); + + let previous_signature = hex::decode("a609e19a03c2fcc559e8dae14900aaefe517cb55c840f6e69bc8e4f66c8d18e8a609685d9917efbfb0c37f058c2de88f13d297c7e19e0ab24813079efe57a182554ff054c7638153f9b26a60e7111f71a0ff63d9571704905d3ca6df0b031747").unwrap(); + let signature = hex::decode("82f5d3d2de4db19d40a6980e8aa37842a0e55d1df06bd68bddc8d60002e8e959eb9cfa368b3c1b77d18f02a54fe047b80f0989315f83b12a74fd8679c4f12aae86eaf6ab5690b34f1fddd50ee3cc6f6cdf59e95526d5a5d82aaa84fa6f181e42").unwrap(); + let round: u64 = 72785; + + let msg = build_bls_message(round, &previous_signature); + let msg_point = api + .bls12_381_hash_to_g2(HashFunction::Sha256, &msg, DOMAIN_HASH_TO_G2) + .unwrap(); + + let g1_generator = cosmwasm_crypto::bls12_381_g1_generator(); + let is_valid = api + .bls12_381_pairing_equality(&g1_generator, &signature, &PK_LEO_MAINNET, &msg_point) + .unwrap(); + + assert!(is_valid); + } + // Basic "works" test. Exhaustive tests on VM's side (packages/vm/src/imports.rs) #[test] fn secp256k1_verify_works() { From 9f04d53fbbcc84d4458c52b000b10a2996035442 Mon Sep 17 00:00:00 2001 From: Aumetra Weisman Date: Wed, 17 Apr 2024 15:33:07 +0200 Subject: [PATCH 40/79] Add aggregate pairing equality test --- packages/std/src/testing/mock.rs | 26 ++++++++++++++++++++++++++ 1 file changed, 26 insertions(+) diff --git a/packages/std/src/testing/mock.rs b/packages/std/src/testing/mock.rs index 2c58f26f4f..ec03807add 100644 --- a/packages/std/src/testing/mock.rs +++ b/packages/std/src/testing/mock.rs @@ -1319,6 +1319,32 @@ mod tests { ); } + #[test] + fn bls12_381_aggregate_pairing_equality_works() { + let api = MockApi::default(); + + let dst = b"BLS_SIG_BLS12381G2_XMD:SHA-256_SSWU_RO_POP_"; + let g1_generator = cosmwasm_crypto::bls12_381_g1_generator(); + let ps = hex!("a491d1b0ecd9bb917989f0e74f0dea0422eac4a873e5e2644f368dffb9a6e20fd6e10c1b77654d067c0618f6e5a7f79ab301803f8b5ac4a1133581fc676dfedc60d891dd5fa99028805e5ea5b08d3491af75d0707adab3b70c6a6a580217bf81b53d21a4cfd562c469cc81514d4ce5a6b577d8403d32a394dc265dd190b47fa9f829fdd7963afdf972e5e77854051f6f"); + let qs: Vec = [ + hex!("0000000000000000000000000000000000000000000000000000000000000000"), + hex!("5656565656565656565656565656565656565656565656565656565656565656"), + hex!("abababababababababababababababababababababababababababababababab"), + ] + .into_iter() + .flat_map(|msg| { + api.bls12_381_hash_to_g2(HashFunction::Sha256, &msg, dst) + .unwrap() + }) + .collect(); + let s = hex!("9104e74b9dfd3ad502f25d6a5ef57db0ed7d9a0e00f3500586d8ce44231212542fcfaf87840539b398bf07626705cf1105d246ca1062c6c2e1a53029a0f790ed5e3cb1f52f8234dc5144c45fc847c0cd37a92d68e7c5ba7c648a8a339f171244"); + + let is_valid = api + .bls12_381_aggregate_pairing_equality(&ps, &qs, &g1_generator, &s) + .unwrap(); + assert!(is_valid); + } + #[test] fn bls12_381_hash_to_g1_works() { // See: ; Section J.9.1 From 317e770a58af9aec67735c4751d1f7d717b54a17 Mon Sep 17 00:00:00 2001 From: Aumetra Weisman Date: Wed, 17 Apr 2024 15:48:10 +0200 Subject: [PATCH 41/79] Add metered cost for aggregation --- packages/vm/src/environment.rs | 7 +++++++ packages/vm/src/imports.rs | 18 ++++++++++++++---- 2 files changed, 21 insertions(+), 4 deletions(-) diff --git a/packages/vm/src/environment.rs b/packages/vm/src/environment.rs index a0ed3a4393..f351d474b2 100644 --- a/packages/vm/src/environment.rs +++ b/packages/vm/src/environment.rs @@ -45,6 +45,10 @@ pub struct GasConfig { pub ed25519_batch_verify_cost: u64, /// ed25519 batch signature verification cost (single public key) pub ed25519_batch_verify_one_pubkey_cost: u64, + /// bls12-381 aggregate cost per point (g1) + pub bls12_381_aggregate_g1_per_point: u64, + /// bls12-381 aggregate cost per point (g2) + pub bls12_381_aggregate_g2_per_point: u64, /// bls12-381 hash to g1 cost pub bls12_381_hash_to_g1_cost: u64, /// bls12-381 hash to g2 cost @@ -72,6 +76,9 @@ impl Default for GasConfig { // From https://docs.rs/ed25519-zebra/2.2.0/ed25519_zebra/batch/index.html ed25519_batch_verify_cost: 63 * GAS_PER_US / 2, ed25519_batch_verify_one_pubkey_cost: 63 * GAS_PER_US / 4, + // just assume the production machines have more than 4 cores, so we can half that + bls12_381_aggregate_g1_per_point: 16 * GAS_PER_US / 2, + bls12_381_aggregate_g2_per_point: 33 * GAS_PER_US / 2, bls12_381_hash_to_g1_cost: 324 * GAS_PER_US, bls12_381_hash_to_g2_cost: 528 * GAS_PER_US, // god i wish i was lying diff --git a/packages/vm/src/imports.rs b/packages/vm/src/imports.rs index 2fcf847288..b0cf8369a5 100644 --- a/packages/vm/src/imports.rs +++ b/packages/vm/src/imports.rs @@ -265,15 +265,20 @@ pub fn do_bls12_381_aggregate_g1< g1s_ptr: u32, out_ptr: u32, ) -> VmResult { - let (data, store) = env.data_and_store_mut(); + let (data, mut store) = env.data_and_store_mut(); let memory = data.memory(&store); let g1s = read_region(&memory, g1s_ptr, BLS12_381_MAX_AGGREGATE_SIZE)?; - // TODO: Add gas consumption metering + let gas_info = GasInfo::with_cost( + data.gas_config.bls12_381_aggregate_g1_per_point + * (g1s.len() / BLS12_381_G1_POINT_LEN) as u64, + ); + process_gas_info(data, &mut store, gas_info)?; let code = match bls12_381_aggregate_g1(&g1s) { Ok(point) => { + let memory = data.memory(&store); write_region(&memory, out_ptr, &point)?; 0 } @@ -304,15 +309,20 @@ pub fn do_bls12_381_aggregate_g2< g2s_ptr: u32, out_ptr: u32, ) -> VmResult { - let (data, store) = env.data_and_store_mut(); + let (data, mut store) = env.data_and_store_mut(); let memory = data.memory(&store); let g2s = read_region(&memory, g2s_ptr, BLS12_381_MAX_AGGREGATE_SIZE)?; - // TODO: Add gas consumption metering + let gas_info = GasInfo::with_cost( + data.gas_config.bls12_381_aggregate_g2_per_point + * (g2s.len() / BLS12_381_G2_POINT_LEN) as u64, + ); + process_gas_info(data, &mut store, gas_info)?; let code = match bls12_381_aggregate_g2(&g2s) { Ok(point) => { + let memory = data.memory(&store); write_region(&memory, out_ptr, &point)?; 0 } From 70e33a970fef7c68573055fc4d0fffb4b95e3a54 Mon Sep 17 00:00:00 2001 From: Aumetra Weisman Date: Wed, 17 Apr 2024 15:50:51 +0200 Subject: [PATCH 42/79] Adjust gas metering for aggregated pairing equality --- packages/vm/src/imports.rs | 10 ++++++++-- 1 file changed, 8 insertions(+), 2 deletions(-) diff --git a/packages/vm/src/imports.rs b/packages/vm/src/imports.rs index b0cf8369a5..875897b463 100644 --- a/packages/vm/src/imports.rs +++ b/packages/vm/src/imports.rs @@ -363,8 +363,14 @@ pub fn do_bls12_381_aggregate_pairing_equality< let r = read_region(&memory, r_ptr, BLS12_381_G1_POINT_LEN)?; let s = read_region(&memory, s_ptr, BLS12_381_G2_POINT_LEN)?; - // TODO: Adjust gas consumption metering to aggregated cost - let gas_info = GasInfo::with_cost(data.gas_config.bls12_381_pairing_equality_cost); + // TODO: We should really meter this by the actual cost of aggregated signatures instead of adding up aggregation costs of points + let gas_info = GasInfo::with_cost( + data.gas_config.bls12_381_pairing_equality_cost + + (data.gas_config.bls12_381_aggregate_g1_per_point + * (ps.len() / BLS12_381_G1_POINT_LEN) as u64) + + (data.gas_config.bls12_381_aggregate_g2_per_point + * (qs.len() / BLS12_381_G2_POINT_LEN) as u64), + ); process_gas_info(data, &mut store, gas_info)?; let code = match bls12_381_aggregate_pairing_equality(&ps, &qs, &r, &s) { From 8c3cbec93009977605baefaa45130c86e9d35299 Mon Sep 17 00:00:00 2001 From: Aumetra Weisman Date: Wed, 17 Apr 2024 16:14:02 +0200 Subject: [PATCH 43/79] Add aggregation test for G1 elements --- packages/std/src/testing/mock.rs | 47 ++++++++++++++++++++++++++++++++ 1 file changed, 47 insertions(+) diff --git a/packages/std/src/testing/mock.rs b/packages/std/src/testing/mock.rs index ec03807add..fd671bbb30 100644 --- a/packages/std/src/testing/mock.rs +++ b/packages/std/src/testing/mock.rs @@ -1177,6 +1177,7 @@ mod tests { use crate::{coin, coins, instantiate2_address, ContractInfoResponse, HexBinary, Response}; #[cfg(feature = "staking")] use crate::{Decimal, Delegation}; + use base64::{engine::general_purpose, Engine}; use hex_literal::hex; use serde::Deserialize; @@ -1202,6 +1203,9 @@ mod tests { /// Public key League of Entropy Mainnet (curl -sS https://drand.cloudflare.com/info) const PK_LEO_MAINNET: [u8; 48] = hex!("868f005eb8e6e4ca0a47c8a77ceaa5309a47978a7c71bc5cce96366b5d7a569937c529eeda66c7293784a9402801af31"); + const ETH_BLOCK_HEADER: &[u8] = + include_bytes!("../../../crypto/testdata/eth-headers/1699693797.394876721s.json"); + #[test] fn mock_info_works() { let info = mock_info("my name", &coins(100, "atom")); @@ -1319,6 +1323,49 @@ mod tests { ); } + #[test] + fn bls12_381_aggregate_g1_works() { + #[derive(serde::Deserialize)] + struct EthHeader { + public_keys: Vec, + aggregate_pubkey: String, + } + + let api = MockApi::default(); + let header: EthHeader = serde_json::from_slice(ETH_BLOCK_HEADER).unwrap(); + let expected = general_purpose::STANDARD + .decode(header.aggregate_pubkey) + .unwrap(); + + let pubkeys: Vec = header + .public_keys + .into_iter() + .flat_map(|key| general_purpose::STANDARD.decode(key).unwrap()) + .collect(); + let sum = api.bls12_381_aggregate_g1(&pubkeys).unwrap(); + + assert_eq!(expected, sum); + } + + #[test] + fn bls12_381_aggregate_g2_works() { + let api = MockApi::default(); + + let points: Vec = [ + hex!("b6ed936746e01f8ecf281f020953fbf1f01debd5657c4a383940b020b26507f6076334f91e2366c96e9ab279fb5158090352ea1c5b0c9274504f4f0e7053af24802e51e4568d164fe986834f41e55c8e850ce1f98458c0cfc9ab380b55285a55"), + hex!("b23c46be3a001c63ca711f87a005c200cc550b9429d5f4eb38d74322144f1b63926da3388979e5321012fb1a0526bcd100b5ef5fe72628ce4cd5e904aeaa3279527843fae5ca9ca675f4f51ed8f83bbf7155da9ecc9663100a885d5dc6df96d9"), + hex!("948a7cb99f76d616c2c564ce9bf4a519f1bea6b0a624a02276443c245854219fabb8d4ce061d255af5330b078d5380681751aa7053da2c98bae898edc218c75f07e24d8802a17cd1f6833b71e58f5eb5b94208b4d0bb3848cecb075ea21be115"), + ] + .into_iter() + .flatten() + .collect(); + + let expected = hex!("9683b3e6701f9a4b706709577963110043af78a5b41991b998475a3d3fd62abf35ce03b33908418efc95a058494a8ae504354b9f626231f6b3f3c849dfdeaf5017c4780e2aee1850ceaf4b4d9ce70971a3d2cfcd97b7e5ecf6759f8da5f76d31"); + let sum = api.bls12_381_aggregate_g2(&points).unwrap(); + + assert_eq!(sum, expected); + } + #[test] fn bls12_381_aggregate_pairing_equality_works() { let api = MockApi::default(); From 6cb09514353227314a9940244c9b0872547c4258 Mon Sep 17 00:00:00 2001 From: Aumetra Weisman Date: Fri, 19 Apr 2024 12:31:21 +0200 Subject: [PATCH 44/79] Add Changelog entry --- CHANGELOG.md | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/CHANGELOG.md b/CHANGELOG.md index 8f0982dfec..a41b5b238b 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -37,6 +37,10 @@ and this project adheres to ([#2124]) - cosmwasm-vm: Read the state version from Wasm modules and return them as part of `AnalyzeReport` ([#2129]) +- cosmwasm-vm: Add `bls12_381_aggregate_g1`, `bls12_381_aggregate_g2`, + `bls12_381_aggregate_pairing_equality`, `bls12_381_hash_to_g1`, + `bls12_381_hash_to_g1`, and `bls12_381_pairing_equality` to enable BLS12-381 + curve operations, such as verifying pairing equalities ([#2106]) [#1983]: https://github.com/CosmWasm/cosmwasm/pull/1983 [#2057]: https://github.com/CosmWasm/cosmwasm/pull/2057 @@ -46,6 +50,7 @@ and this project adheres to [#2092]: https://github.com/CosmWasm/cosmwasm/pull/2092 [#2098]: https://github.com/CosmWasm/cosmwasm/pull/2098 [#2099]: https://github.com/CosmWasm/cosmwasm/pull/2099 +[#2106]: https://github.com/CosmWasm/cosmwasm/pull/2106 [#2107]: https://github.com/CosmWasm/cosmwasm/pull/2107 [#2120]: https://github.com/CosmWasm/cosmwasm/pull/2120 [#2124]: https://github.com/CosmWasm/cosmwasm/pull/2124 From a32aab9212c3655753f9103b66b03f3d1709d53a Mon Sep 17 00:00:00 2001 From: Aumetra Weisman Date: Mon, 22 Apr 2024 13:21:11 +0200 Subject: [PATCH 45/79] Add benchmark for aggregated pairing equality --- packages/crypto/benches/main.rs | 239 +++++++++++++++++++++----------- 1 file changed, 160 insertions(+), 79 deletions(-) diff --git a/packages/crypto/benches/main.rs b/packages/crypto/benches/main.rs index 34b3b39f2a..faa12315e5 100644 --- a/packages/crypto/benches/main.rs +++ b/packages/crypto/benches/main.rs @@ -1,6 +1,7 @@ -use ark_bls12_381::{G1Affine, G2Affine}; +use ark_bls12_381::{G1Affine, G2Affine, G2Projective}; +use ark_ec::AffineRepr; use ark_ff::UniformRand; -use ark_serialize::CanonicalSerialize; +use ark_serialize::{CanonicalDeserialize, CanonicalSerialize}; use criterion::{criterion_group, criterion_main, Criterion, PlottingBackend}; use rand_core::OsRng; use std::{hint::black_box, io, time::Duration}; @@ -15,10 +16,11 @@ use k256::ecdsa::SigningKey; // type alias use sha2::Sha256; use cosmwasm_crypto::{ - bls12_381_aggregate_g1, bls12_381_aggregate_g2, bls12_381_g1_generator, bls12_381_hash_to_g1, - bls12_381_hash_to_g2, bls12_381_pairing_equality, ed25519_batch_verify, ed25519_verify, - secp256k1_recover_pubkey, secp256k1_verify, secp256r1_recover_pubkey, secp256r1_verify, - HashFunction, BLS12_381_G1_POINT_LEN, BLS12_381_G2_POINT_LEN, + bls12_381_aggregate_g1, bls12_381_aggregate_g2, bls12_381_aggregate_pairing_equality, + bls12_381_g1_generator, bls12_381_hash_to_g1, bls12_381_hash_to_g2, bls12_381_pairing_equality, + ed25519_batch_verify, ed25519_verify, secp256k1_recover_pubkey, secp256k1_verify, + secp256r1_recover_pubkey, secp256r1_verify, HashFunction, BLS12_381_G1_POINT_LEN, + BLS12_381_G2_POINT_LEN, }; use std::cmp::min; @@ -92,6 +94,157 @@ fn read_decode_cosmos_sigs() -> (Vec>, Vec>, Vec>) { (messages, signatures, public_keys) } +fn bench_bls(group: &mut criterion::BenchmarkGroup<'_, M>) +where + M: criterion::measurement::Measurement, +{ + let two_pow_max = 8; + let num_random_points = 2_usize.pow(two_pow_max); + + { + let random_points_g1: Vec = (0..num_random_points) + .map(|_| G1Affine::rand(&mut OsRng)) + .collect(); + let mut g1_serialized = io::Cursor::new(Vec::new()); + random_points_g1 + .serialize_compressed(&mut g1_serialized) + .unwrap(); + let g1_serialized = &g1_serialized.into_inner()[8..]; + + let random_points_g2: Vec = (0..num_random_points) + .map(|_| G2Affine::rand(&mut OsRng)) + .collect(); + let mut g2_serialized = io::Cursor::new(Vec::new()); + random_points_g2 + .serialize_compressed(&mut g2_serialized) + .unwrap(); + let g2_serialized = &g2_serialized.into_inner()[8..]; + + for i in 1..=two_pow_max { + let num_points = 2_usize.pow(i); + let points_to_aggregate_g1 = &g1_serialized[..num_points * BLS12_381_G1_POINT_LEN]; + group.bench_function(format!("bls12_381_aggregate_g1_{num_points}"), |b| { + b.iter(|| bls12_381_aggregate_g1(points_to_aggregate_g1).unwrap()); + }); + } + + for i in 1..=two_pow_max { + let num_points = 2_usize.pow(i); + let points_to_aggregate_g2 = &g2_serialized[..num_points * BLS12_381_G2_POINT_LEN]; + group.bench_function(format!("bls12_381_aggregate_g2_{num_points}"), |b| { + b.iter(|| bls12_381_aggregate_g2(points_to_aggregate_g2).unwrap()); + }); + } + } + + { + const MESSAGE: &[u8] = b"message"; + const DST: &[u8] = b"dst"; + let secret_keys: Vec = (0..num_random_points) + .map(|_| ark_bls12_381::Fr::rand(&mut OsRng)) + .collect(); + let public_keys: Vec = secret_keys + .iter() + .map(|secret_key| G1Affine::generator() * secret_key) + .map(Into::into) + .collect(); + let messages: Vec = (0..num_random_points) + .map(|_| bls12_381_hash_to_g2(HashFunction::Sha256, MESSAGE, DST)) + .map(|bytes| G2Affine::deserialize_compressed(&bytes[..]).unwrap()) + .collect(); + let signatures: Vec = secret_keys + .iter() + .zip(messages.iter()) + .map(|(secret_key, message)| *message * secret_key) + .collect(); + + for i in 1..=two_pow_max { + let num_points = 2_usize.pow(i); + let messages = &messages[..num_points]; + let keys = &public_keys[..num_points]; + let aggregated_signature: G2Affine = + signatures[..num_points].iter().sum::().into(); + + let serialized_pubkeys: Vec = keys + .iter() + .flat_map(|key| { + let mut serialized = [0_u8; 48]; + key.serialize_compressed(&mut serialized[..]).unwrap(); + serialized + }) + .collect(); + + let serialized_messages: Vec = messages + .iter() + .flat_map(|message| { + let mut serialized = [0_u8; 96]; + message.serialize_compressed(&mut serialized[..]).unwrap(); + serialized + }) + .collect(); + + let mut serialized_signature = [0_u8; 96]; + aggregated_signature + .serialize_compressed(&mut serialized_signature[..]) + .unwrap(); + + group.bench_function( + format!("bls12_381_aggregate_pairing_equality_{num_points}"), + |b| { + b.iter(|| { + let is_valid = black_box(bls12_381_aggregate_pairing_equality( + &serialized_pubkeys, + &serialized_messages, + &bls12_381_g1_generator(), + &serialized_signature, + )) + .unwrap(); + + assert!(is_valid); + }); + }, + ); + } + } + + group.bench_function("bls12_381_hash_to_g1", |b| { + b.iter(|| { + bls12_381_hash_to_g1( + black_box(HashFunction::Sha256), + black_box(&BLS_MESSAGE), + black_box(BLS_DST), + ) + }); + }); + + group.bench_function("bls12_381_hash_to_g2", |b| { + b.iter(|| { + bls12_381_hash_to_g2( + black_box(HashFunction::Sha256), + black_box(&BLS_MESSAGE), + black_box(BLS_DST), + ) + }); + }); + + group.bench_function("bls12_381_verify", |b| { + let generator = bls12_381_g1_generator(); + let message = bls12_381_hash_to_g2(HashFunction::Sha256, &BLS_MESSAGE, BLS_DST); + + b.iter(|| { + let is_equal = bls12_381_pairing_equality( + black_box(&BLS_PUBKEY), + &message, + &generator, + black_box(&BLS_SIGNATURE), + ) + .unwrap(); + + assert!(is_equal); + }); + }); +} + fn bench_crypto(c: &mut Criterion) { let mut group = c.benchmark_group("Crypto"); @@ -150,79 +303,7 @@ fn bench_crypto(c: &mut Criterion) { }); }); - let two_pow_max = 8; - let num_random_points = 2_usize.pow(two_pow_max); - - let random_points_g1: Vec = (0..num_random_points) - .map(|_| G1Affine::rand(&mut OsRng)) - .collect(); - let mut g1_serialized = io::Cursor::new(Vec::new()); - random_points_g1 - .serialize_compressed(&mut g1_serialized) - .unwrap(); - let g1_serialized = &g1_serialized.into_inner()[8..]; - - let random_points_g2: Vec = (0..num_random_points) - .map(|_| G2Affine::rand(&mut OsRng)) - .collect(); - let mut g2_serialized = io::Cursor::new(Vec::new()); - random_points_g2 - .serialize_compressed(&mut g2_serialized) - .unwrap(); - let g2_serialized = &g2_serialized.into_inner()[8..]; - - for i in 1..=two_pow_max { - let num_points = 2_usize.pow(i); - let points_to_aggregate_g1 = &g1_serialized[..num_points * BLS12_381_G1_POINT_LEN]; - group.bench_function(format!("bls12_381_aggregate_g1_{num_points}"), |b| { - b.iter(|| bls12_381_aggregate_g1(points_to_aggregate_g1).unwrap()); - }); - } - - for i in 1..=two_pow_max { - let num_points = 2_usize.pow(i); - let points_to_aggregate_g2 = &g2_serialized[..num_points * BLS12_381_G2_POINT_LEN]; - group.bench_function(format!("bls12_381_aggregate_g2_{num_points}"), |b| { - b.iter(|| bls12_381_aggregate_g2(points_to_aggregate_g2).unwrap()); - }); - } - - group.bench_function("bls12_381_hash_to_g1", |b| { - b.iter(|| { - bls12_381_hash_to_g1( - black_box(HashFunction::Sha256), - black_box(&BLS_MESSAGE), - black_box(BLS_DST), - ) - }); - }); - - group.bench_function("bls12_381_hash_to_g2", |b| { - b.iter(|| { - bls12_381_hash_to_g2( - black_box(HashFunction::Sha256), - black_box(&BLS_MESSAGE), - black_box(BLS_DST), - ) - }); - }); - - group.bench_function("bls12_381_verify", |b| { - let generator = bls12_381_g1_generator(); - let message = bls12_381_hash_to_g2(HashFunction::Sha256, &BLS_MESSAGE, BLS_DST); - - b.iter(|| { - let is_equal = bls12_381_pairing_equality( - black_box(&BLS_PUBKEY), - &message, - &generator, - black_box(&BLS_SIGNATURE), - ) - .unwrap(); - - assert!(is_equal); - }); - }); + bench_bls(&mut group); group.bench_function("ed25519_verify", |b| { let message = hex::decode(COSMOS_ED25519_MSG_HEX).unwrap(); From 5101142a4978ce337153047cd9408dc9b545420c Mon Sep 17 00:00:00 2001 From: Aumetra Weisman Date: Mon, 22 Apr 2024 13:30:53 +0200 Subject: [PATCH 46/79] Adjust gas values to represent it more accurately --- packages/vm/src/environment.rs | 4 ++++ packages/vm/src/imports.rs | 5 +---- 2 files changed, 5 insertions(+), 4 deletions(-) diff --git a/packages/vm/src/environment.rs b/packages/vm/src/environment.rs index f351d474b2..a224f8c1a4 100644 --- a/packages/vm/src/environment.rs +++ b/packages/vm/src/environment.rs @@ -55,6 +55,9 @@ pub struct GasConfig { pub bls12_381_hash_to_g2_cost: u64, /// bls12-381 pairing equality check cost pub bls12_381_pairing_equality_cost: u64, + /// bls12-381 aggregated pairing equality check cost per point + /// (added on top of the base pairing equality check cost) + pub bls12_381_aggregated_pairing_equality_cost_per_point: u64, } impl Default for GasConfig { @@ -83,6 +86,7 @@ impl Default for GasConfig { bls12_381_hash_to_g2_cost: 528 * GAS_PER_US, // god i wish i was lying bls12_381_pairing_equality_cost: 1318 * GAS_PER_US, + bls12_381_aggregated_pairing_equality_cost_per_point: 109 * GAS_PER_US, } } } diff --git a/packages/vm/src/imports.rs b/packages/vm/src/imports.rs index 875897b463..16d27d9762 100644 --- a/packages/vm/src/imports.rs +++ b/packages/vm/src/imports.rs @@ -363,13 +363,10 @@ pub fn do_bls12_381_aggregate_pairing_equality< let r = read_region(&memory, r_ptr, BLS12_381_G1_POINT_LEN)?; let s = read_region(&memory, s_ptr, BLS12_381_G2_POINT_LEN)?; - // TODO: We should really meter this by the actual cost of aggregated signatures instead of adding up aggregation costs of points let gas_info = GasInfo::with_cost( data.gas_config.bls12_381_pairing_equality_cost - + (data.gas_config.bls12_381_aggregate_g1_per_point + + (data.gas_config.bls12_381_aggregated_pairing_equality_cost_per_point * (ps.len() / BLS12_381_G1_POINT_LEN) as u64) - + (data.gas_config.bls12_381_aggregate_g2_per_point - * (qs.len() / BLS12_381_G2_POINT_LEN) as u64), ); process_gas_info(data, &mut store, gas_info)?; From 8ce5ad9cdcc58681b38c24c7c2acd78e77f59284 Mon Sep 17 00:00:00 2001 From: Aumetra Weisman Date: Mon, 22 Apr 2024 13:32:04 +0200 Subject: [PATCH 47/79] Add BLS branch to benchmarking filter --- .circleci/config.yml | 1 + packages/vm/src/imports.rs | 6 ++++-- 2 files changed, 5 insertions(+), 2 deletions(-) diff --git a/.circleci/config.yml b/.circleci/config.yml index b25802f14b..5a5b259791 100644 --- a/.circleci/config.yml +++ b/.circleci/config.yml @@ -101,6 +101,7 @@ workflows: - main - /^[0-9]+\.[0-9]+$/ # Add your branch here if benchmarking matters to your work + - bls12_381 - secp256r1-support - coverage deploy: diff --git a/packages/vm/src/imports.rs b/packages/vm/src/imports.rs index 16d27d9762..3d108b52ae 100644 --- a/packages/vm/src/imports.rs +++ b/packages/vm/src/imports.rs @@ -365,8 +365,10 @@ pub fn do_bls12_381_aggregate_pairing_equality< let gas_info = GasInfo::with_cost( data.gas_config.bls12_381_pairing_equality_cost - + (data.gas_config.bls12_381_aggregated_pairing_equality_cost_per_point - * (ps.len() / BLS12_381_G1_POINT_LEN) as u64) + + (data + .gas_config + .bls12_381_aggregated_pairing_equality_cost_per_point + * (ps.len() / BLS12_381_G1_POINT_LEN) as u64), ); process_gas_info(data, &mut store, gas_info)?; From 7ff01ec6c9f661b040f4e5187eaadb6061d3b563 Mon Sep 17 00:00:00 2001 From: Aumetra Weisman Date: Mon, 22 Apr 2024 13:51:08 +0200 Subject: [PATCH 48/79] Run crypto benchmarks with std feature --- .circleci/config.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.circleci/config.yml b/.circleci/config.yml index 5a5b259791..a21a30f6a5 100644 --- a/.circleci/config.yml +++ b/.circleci/config.yml @@ -1044,7 +1044,7 @@ jobs: - run: name: Run crypto benchmarks working_directory: ~/project/packages/crypto - command: cargo bench -- --color never --save-baseline crypto + command: cargo bench --features std -- --color never --save-baseline crypto - save_cache: paths: - /usr/local/cargo/registry From f343af0adeb288daea6cc956e0c1a308fe24a62d Mon Sep 17 00:00:00 2001 From: Aumetra Weisman Date: Mon, 29 Apr 2024 17:51:25 +0200 Subject: [PATCH 49/79] Remove raw `pairing_equality` function --- CHANGELOG.md | 6 +-- contracts/crypto-verify/src/bls12_381.rs | 2 +- packages/crypto/benches/main.rs | 9 ++--- packages/crypto/src/bls12_318/mod.rs | 2 +- packages/crypto/src/bls12_318/pairing.rs | 35 ++--------------- packages/crypto/src/lib.rs | 4 +- packages/crypto/tests/bls12_381.rs | 6 +-- packages/std/src/imports.rs | 32 ---------------- packages/std/src/testing/mock.rs | 17 +++----- packages/std/src/traits.rs | 15 -------- packages/vm/src/compatibility.rs | 1 - packages/vm/src/imports.rs | 49 ++---------------------- packages/vm/src/instance.rs | 15 ++------ 13 files changed, 30 insertions(+), 163 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index a41b5b238b..b6d61a9592 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -38,9 +38,9 @@ and this project adheres to - cosmwasm-vm: Read the state version from Wasm modules and return them as part of `AnalyzeReport` ([#2129]) - cosmwasm-vm: Add `bls12_381_aggregate_g1`, `bls12_381_aggregate_g2`, - `bls12_381_aggregate_pairing_equality`, `bls12_381_hash_to_g1`, - `bls12_381_hash_to_g1`, and `bls12_381_pairing_equality` to enable BLS12-381 - curve operations, such as verifying pairing equalities ([#2106]) + `bls12_381_aggregate_pairing_equality`, `bls12_381_hash_to_g1`, and + `bls12_381_hash_to_g1` to enable BLS12-381 curve operations, such as verifying + pairing equalities ([#2106]) [#1983]: https://github.com/CosmWasm/cosmwasm/pull/1983 [#2057]: https://github.com/CosmWasm/cosmwasm/pull/2057 diff --git a/contracts/crypto-verify/src/bls12_381.rs b/contracts/crypto-verify/src/bls12_381.rs index f531897717..a67f4be14f 100644 --- a/contracts/crypto-verify/src/bls12_381.rs +++ b/contracts/crypto-verify/src/bls12_381.rs @@ -9,6 +9,6 @@ pub fn verify( dst: &[u8], ) -> StdResult { let s = api.bls12_381_hash_to_g2(HashFunction::Sha256, msg, dst)?; - api.bls12_381_pairing_equality(p, q, r, &s) + api.bls12_381_aggregate_pairing_equality(p, q, r, &s) .map_err(Into::into) } diff --git a/packages/crypto/benches/main.rs b/packages/crypto/benches/main.rs index faa12315e5..4cf6a27b54 100644 --- a/packages/crypto/benches/main.rs +++ b/packages/crypto/benches/main.rs @@ -17,10 +17,9 @@ use sha2::Sha256; use cosmwasm_crypto::{ bls12_381_aggregate_g1, bls12_381_aggregate_g2, bls12_381_aggregate_pairing_equality, - bls12_381_g1_generator, bls12_381_hash_to_g1, bls12_381_hash_to_g2, bls12_381_pairing_equality, - ed25519_batch_verify, ed25519_verify, secp256k1_recover_pubkey, secp256k1_verify, - secp256r1_recover_pubkey, secp256r1_verify, HashFunction, BLS12_381_G1_POINT_LEN, - BLS12_381_G2_POINT_LEN, + bls12_381_g1_generator, bls12_381_hash_to_g1, bls12_381_hash_to_g2, ed25519_batch_verify, + ed25519_verify, secp256k1_recover_pubkey, secp256k1_verify, secp256r1_recover_pubkey, + secp256r1_verify, HashFunction, BLS12_381_G1_POINT_LEN, BLS12_381_G2_POINT_LEN, }; use std::cmp::min; @@ -232,7 +231,7 @@ where let message = bls12_381_hash_to_g2(HashFunction::Sha256, &BLS_MESSAGE, BLS_DST); b.iter(|| { - let is_equal = bls12_381_pairing_equality( + let is_equal = bls12_381_aggregate_pairing_equality( black_box(&BLS_PUBKEY), &message, &generator, diff --git a/packages/crypto/src/bls12_318/mod.rs b/packages/crypto/src/bls12_318/mod.rs index 33b9c778e1..a2fab9aade 100644 --- a/packages/crypto/src/bls12_318/mod.rs +++ b/packages/crypto/src/bls12_318/mod.rs @@ -7,7 +7,7 @@ mod points; pub use aggregate::{bls12_381_aggregate_g1, bls12_381_aggregate_g2}; pub use constants::{bls12_381_g1_generator, bls12_381_g2_generator}; pub use hash::{bls12_381_hash_to_g1, bls12_381_hash_to_g2, HashFunction}; -pub use pairing::{bls12_381_aggregate_pairing_equality, bls12_381_pairing_equality}; +pub use pairing::bls12_381_aggregate_pairing_equality; pub use points::{bls12_381_g1_is_identity, bls12_381_g2_is_identity}; pub const BLS12_381_G1_POINT_LEN: usize = 48; diff --git a/packages/crypto/src/bls12_318/pairing.rs b/packages/crypto/src/bls12_318/pairing.rs index 0de4f08de0..3ef6b2ac40 100644 --- a/packages/crypto/src/bls12_318/pairing.rs +++ b/packages/crypto/src/bls12_318/pairing.rs @@ -64,33 +64,6 @@ pub fn bls12_381_aggregate_pairing_equality( Ok(Bls12_381::multi_pairing(ps, qs).is_zero()) } -/// Check whether the following condition holds true: -/// -/// $$ -/// e(p, q) = e(r, s) -/// $$ -pub fn bls12_381_pairing_equality( - p: &[u8], - q: &[u8], - r: &[u8], - s: &[u8], -) -> Result { - let (p, q, r, s) = ( - g1_from_variable(p)?, - g2_from_variable(q)?, - g1_from_variable(r)?, - g2_from_variable(s)?, - ); - - let p_neg = -p; - - Ok(Bls12_381::multi_pairing( - [G1Prepared::from(p_neg.0), G1Prepared::from(r.0)], - [G2Prepared::from(q.0), G2Prepared::from(s.0)], - ) - .is_zero()) -} - #[cfg(test)] mod test { use hex_literal::hex; @@ -98,7 +71,7 @@ mod test { use crate::{ bls12_318::points::{g1_from_fixed, g2_from_fixed, g2_from_variable, G1}, - bls12_381_aggregate_pairing_equality, bls12_381_hash_to_g2, bls12_381_pairing_equality, + bls12_381_aggregate_pairing_equality, bls12_381_hash_to_g2, AggregationPairingEqualityError, CryptoError, HashFunction, }; @@ -131,7 +104,7 @@ mod test { let msg = build_message(round, &previous_signature); let g2_msg = bls12_381_hash_to_g2(HashFunction::Sha256, msg.as_slice(), DOMAIN_HASH_TO_G2); - assert!(bls12_381_pairing_equality( + assert!(bls12_381_aggregate_pairing_equality( &g1.to_compressed(), &sigma.to_compressed(), &PK_LEO_MAINNET, @@ -147,7 +120,7 @@ mod test { let g2_msg = bls12_381_hash_to_g2(HashFunction::Sha256, msg.as_slice(), DOMAIN_HASH_TO_G2); - assert!(!bls12_381_pairing_equality( + assert!(!bls12_381_aggregate_pairing_equality( &g1.to_compressed(), &sigma.to_compressed(), &PK_LEO_MAINNET, @@ -175,7 +148,7 @@ mod test { )) .unwrap(); - assert!(bls12_381_pairing_equality( + assert!(bls12_381_aggregate_pairing_equality( &aggregated_g1.to_compressed(), &aggregated_sigma.to_compressed(), &aggregated_key.to_compressed(), diff --git a/packages/crypto/src/lib.rs b/packages/crypto/src/lib.rs index 1d93e33c8e..366a407189 100644 --- a/packages/crypto/src/lib.rs +++ b/packages/crypto/src/lib.rs @@ -25,8 +25,8 @@ mod secp256r1; pub use crate::bls12_318::{ bls12_381_aggregate_g1, bls12_381_aggregate_g2, bls12_381_aggregate_pairing_equality, bls12_381_g1_generator, bls12_381_g1_is_identity, bls12_381_g2_generator, - bls12_381_g2_is_identity, bls12_381_hash_to_g1, bls12_381_hash_to_g2, - bls12_381_pairing_equality, HashFunction, BLS12_381_G1_POINT_LEN, BLS12_381_G2_POINT_LEN, + bls12_381_g2_is_identity, bls12_381_hash_to_g1, bls12_381_hash_to_g2, HashFunction, + BLS12_381_G1_POINT_LEN, BLS12_381_G2_POINT_LEN, }; #[doc(hidden)] pub use crate::ecdsa::{ECDSA_PUBKEY_MAX_LEN, ECDSA_SIGNATURE_LEN, MESSAGE_HASH_MAX_LEN}; diff --git a/packages/crypto/tests/bls12_381.rs b/packages/crypto/tests/bls12_381.rs index 0a78c9e2f2..5dc87dc06c 100644 --- a/packages/crypto/tests/bls12_381.rs +++ b/packages/crypto/tests/bls12_381.rs @@ -8,7 +8,7 @@ use base64_serde::base64_serde_type; use cosmwasm_crypto::{ bls12_381_aggregate_g1, bls12_381_aggregate_g2, bls12_381_aggregate_pairing_equality, bls12_381_g1_generator, bls12_381_g1_is_identity, bls12_381_g2_is_identity, - bls12_381_hash_to_g2, bls12_381_pairing_equality, HashFunction, BLS12_381_G2_POINT_LEN, + bls12_381_hash_to_g2, HashFunction, BLS12_381_G2_POINT_LEN, }; const PROOF_OF_POSSESSION_DST: &[u8] = b"BLS_SIG_BLS12381G2_XMD:SHA-256_SSWU_RO_POP_"; @@ -252,7 +252,7 @@ fn bls12_381_verify_works() { return Ok(false); } - let bool_result = bls12_381_pairing_equality( + let bool_result = bls12_381_aggregate_pairing_equality( &pubkey, &message_point, &bls12_381_g1_generator(), @@ -395,7 +395,7 @@ fn bls12_381_fast_aggregate_verify_works() { return Ok(false); } - let bool_result = bls12_381_pairing_equality( + let bool_result = bls12_381_aggregate_pairing_equality( &pubkey, &message_point, &bls12_381_g1_generator(), diff --git a/packages/std/src/imports.rs b/packages/std/src/imports.rs index 865028de39..730c93f9b6 100644 --- a/packages/std/src/imports.rs +++ b/packages/std/src/imports.rs @@ -71,9 +71,6 @@ extern "C" { #[cfg(feature = "cosmwasm_2_1")] fn bls12_381_hash_to_g2(hash_function: u32, msg_ptr: u32, dst_ptr: u32, out_ptr: u32) -> u32; - #[cfg(feature = "cosmwasm_2_1")] - fn bls12_381_pairing_equality(p_ptr: u32, q_ptr: u32, r_ptr: u32, s_ptr: u32) -> u32; - /// Verifies message hashes against a signature with a public key, using the /// secp256k1 ECDSA parametrization. /// Returns 0 on verification success, 1 on verification failure, and values @@ -537,35 +534,6 @@ impl Api for ExternalApi { } } - #[cfg(feature = "cosmwasm_2_1")] - fn bls12_381_pairing_equality( - &self, - p: &[u8], - q: &[u8], - r: &[u8], - s: &[u8], - ) -> Result { - let send_p = build_region(p); - let send_q = build_region(q); - let send_r = build_region(r); - let send_s = build_region(s); - - let send_p_ptr = &*send_p as *const Region as u32; - let send_q_ptr = &*send_q as *const Region as u32; - let send_r_ptr = &*send_r as *const Region as u32; - let send_s_ptr = &*send_s as *const Region as u32; - - let result = - unsafe { bls12_381_pairing_equality(send_p_ptr, send_q_ptr, send_r_ptr, send_s_ptr) }; - match result { - 0 => Ok(true), - 1 => Ok(false), - 2 => panic!("MessageTooLong must not happen. This is a bug in the VM."), - 8 => Err(VerificationError::InvalidPoint), - error_code => Err(VerificationError::unknown_err(error_code)), - } - } - fn secp256k1_verify( &self, message_hash: &[u8], diff --git a/packages/std/src/testing/mock.rs b/packages/std/src/testing/mock.rs index fd671bbb30..c087b76a5a 100644 --- a/packages/std/src/testing/mock.rs +++ b/packages/std/src/testing/mock.rs @@ -196,16 +196,6 @@ impl Api for MockApi { )) } - fn bls12_381_pairing_equality( - &self, - p: &[u8], - q: &[u8], - r: &[u8], - s: &[u8], - ) -> Result { - cosmwasm_crypto::bls12_381_pairing_equality(p, q, r, s).map_err(Into::into) - } - fn secp256k1_verify( &self, message_hash: &[u8], @@ -1449,7 +1439,12 @@ mod tests { let g1_generator = cosmwasm_crypto::bls12_381_g1_generator(); let is_valid = api - .bls12_381_pairing_equality(&g1_generator, &signature, &PK_LEO_MAINNET, &msg_point) + .bls12_381_aggregate_pairing_equality( + &g1_generator, + &signature, + &PK_LEO_MAINNET, + &msg_point, + ) .unwrap(); assert!(is_valid); diff --git a/packages/std/src/traits.rs b/packages/std/src/traits.rs index 64ce562c41..52f488e368 100644 --- a/packages/std/src/traits.rs +++ b/packages/std/src/traits.rs @@ -240,21 +240,6 @@ pub trait Api { unimplemented!() } - #[allow(unused_variables)] - fn bls12_381_pairing_equality( - &self, - p: &[u8], - q: &[u8], - r: &[u8], - s: &[u8], - ) -> Result { - // Support for BLS12-381 is added in 2.1, i.e. we can't add a compile time requirement for new function. - // Any implementation of the Api trait which does not implement this function but tries to call it will - // panic at runtime. We don't assume such cases exist. - // See also https://doc.rust-lang.org/cargo/reference/semver.html#trait-new-default-item - unimplemented!() - } - #[allow(unused_variables)] fn secp256r1_verify( &self, diff --git a/packages/vm/src/compatibility.rs b/packages/vm/src/compatibility.rs index e5ec27ae18..a160bdc819 100644 --- a/packages/vm/src/compatibility.rs +++ b/packages/vm/src/compatibility.rs @@ -25,7 +25,6 @@ const SUPPORTED_IMPORTS: &[&str] = &[ "env.bls12_381_aggregate_pairing_equality", "env.bls12_381_hash_to_g1", "env.bls12_381_hash_to_g2", - "env.bls12_381_pairing_equality", "env.secp256k1_verify", "env.secp256k1_recover_pubkey", "env.secp256r1_verify", diff --git a/packages/vm/src/imports.rs b/packages/vm/src/imports.rs index 3d108b52ae..91f18eb694 100644 --- a/packages/vm/src/imports.rs +++ b/packages/vm/src/imports.rs @@ -5,9 +5,9 @@ use std::marker::PhantomData; use cosmwasm_crypto::{ bls12_381_aggregate_g1, bls12_381_aggregate_g2, bls12_381_aggregate_pairing_equality, - bls12_381_hash_to_g1, bls12_381_hash_to_g2, bls12_381_pairing_equality, ed25519_batch_verify, - ed25519_verify, secp256k1_recover_pubkey, secp256k1_verify, secp256r1_recover_pubkey, - secp256r1_verify, CryptoError, HashFunction, BLS12_381_G1_POINT_LEN, BLS12_381_G2_POINT_LEN, + bls12_381_hash_to_g1, bls12_381_hash_to_g2, ed25519_batch_verify, ed25519_verify, + secp256k1_recover_pubkey, secp256k1_verify, secp256r1_recover_pubkey, secp256r1_verify, + CryptoError, HashFunction, BLS12_381_G1_POINT_LEN, BLS12_381_G2_POINT_LEN, }; use cosmwasm_crypto::{ ECDSA_PUBKEY_MAX_LEN, ECDSA_SIGNATURE_LEN, EDDSA_PUBKEY_LEN, MESSAGE_HASH_MAX_LEN, @@ -458,49 +458,6 @@ pub fn do_bls12_381_hash_to_g2< Ok(0) } -pub fn do_bls12_381_pairing_equality< - A: BackendApi + 'static, - S: Storage + 'static, - Q: Querier + 'static, ->( - mut env: FunctionEnvMut>, - p_ptr: u32, - q_ptr: u32, - r_ptr: u32, - s_ptr: u32, -) -> VmResult { - let (data, mut store) = env.data_and_store_mut(); - let memory = data.memory(&store); - - let p = read_region(&memory, p_ptr, BLS12_381_G1_POINT_LEN)?; - let q = read_region(&memory, q_ptr, BLS12_381_G2_POINT_LEN)?; - let r = read_region(&memory, r_ptr, BLS12_381_G1_POINT_LEN)?; - let s = read_region(&memory, s_ptr, BLS12_381_G2_POINT_LEN)?; - - let gas_info = GasInfo::with_cost(data.gas_config.bls12_381_pairing_equality_cost); - process_gas_info(data, &mut store, gas_info)?; - - let code = match bls12_381_pairing_equality(&p, &q, &r, &s) { - Ok(true) => BLS12_381_VALID_PAIRING, - Ok(false) => BLS12_381_INVALID_PAIRING, - Err(err) => match err { - CryptoError::InvalidPoint { .. } => err.code(), - CryptoError::AggregationPairingEquality { .. } - | CryptoError::BatchErr { .. } - | CryptoError::GenericErr { .. } - | CryptoError::InvalidHashFormat { .. } - | CryptoError::InvalidPubkeyFormat { .. } - | CryptoError::InvalidRecoveryParam { .. } - | CryptoError::InvalidSignatureFormat { .. } - | CryptoError::UnknownHashFunction { .. } => { - panic!("Error must not happen for this call") - } - }, - }; - - Ok(code) -} - pub fn do_secp256k1_verify( mut env: FunctionEnvMut>, hash_ptr: u32, diff --git a/packages/vm/src/instance.rs b/packages/vm/src/instance.rs index 498fcc9b4c..77bf0887c4 100644 --- a/packages/vm/src/instance.rs +++ b/packages/vm/src/instance.rs @@ -16,10 +16,9 @@ use crate::errors::{CommunicationError, VmError, VmResult}; use crate::imports::{ do_abort, do_addr_canonicalize, do_addr_humanize, do_addr_validate, do_bls12_381_aggregate_g1, do_bls12_381_aggregate_g2, do_bls12_381_aggregate_pairing_equality, do_bls12_381_hash_to_g1, - do_bls12_381_hash_to_g2, do_bls12_381_pairing_equality, do_db_read, do_db_remove, do_db_write, - do_debug, do_ed25519_batch_verify, do_ed25519_verify, do_query_chain, - do_secp256k1_recover_pubkey, do_secp256k1_verify, do_secp256r1_recover_pubkey, - do_secp256r1_verify, + do_bls12_381_hash_to_g2, do_db_read, do_db_remove, do_db_write, do_debug, + do_ed25519_batch_verify, do_ed25519_verify, do_query_chain, do_secp256k1_recover_pubkey, + do_secp256k1_verify, do_secp256r1_recover_pubkey, do_secp256r1_verify, }; #[cfg(feature = "iterator")] use crate::imports::{do_db_next, do_db_next_key, do_db_next_value, do_db_scan}; @@ -187,14 +186,6 @@ where Function::new_typed_with_env(&mut store, &fe, do_bls12_381_hash_to_g2), ); - // Four parameters, "p", "q", "r", "s", which all represent elements on the BLS12-381 curve (where "p" and "r" are elements of the G1 subgroup, and "q" and "s" elements of G2). - // Returns a single u32 which signifies the validity of the pairing equality. - // Returns 0 if the pairing equality exists, 1 if it doesnt, and any other code may be interpreted as a `CryptoError`. - env_imports.insert( - "bls12_381_pairing_equality", - Function::new_typed_with_env(&mut store, &fe, do_bls12_381_pairing_equality), - ); - // Verifies message hashes against a signature with a public key, using the secp256k1 ECDSA parametrization. // Returns 0 on verification success, 1 on verification failure, and values greater than 1 in case of error. // Ownership of input pointers is not transferred to the host. From bee44356a9b10614df212263e5b834510a860e8e Mon Sep 17 00:00:00 2001 From: Aumetra Weisman Date: Tue, 30 Apr 2024 12:41:34 +0200 Subject: [PATCH 50/79] Remove par_bridge usage --- packages/crypto/src/bls12_318/pairing.rs | 42 +++++++++++++----------- 1 file changed, 22 insertions(+), 20 deletions(-) diff --git a/packages/crypto/src/bls12_318/pairing.rs b/packages/crypto/src/bls12_318/pairing.rs index 3ef6b2ac40..e5eb79dfdd 100644 --- a/packages/crypto/src/bls12_318/pairing.rs +++ b/packages/crypto/src/bls12_318/pairing.rs @@ -1,3 +1,5 @@ +use core::ops::Neg; + use crate::{ errors::AggregationPairingEquality, CryptoError, BLS12_381_G1_POINT_LEN, BLS12_381_G2_POINT_LEN, }; @@ -9,7 +11,10 @@ use ark_ec::{ pairing::Pairing, }; use num_traits::Zero; -use rayon::iter::{ParallelBridge, ParallelIterator}; +use rayon::{ + iter::{IndexedParallelIterator, ParallelIterator}, + slice::ParallelSlice, +}; pub fn bls12_381_aggregate_pairing_equality( ps: &[u8], @@ -39,27 +44,24 @@ pub fn bls12_381_aggregate_pairing_equality( .into()); } - let pq_pairs: Vec<_> = ps - .chunks_exact(BLS12_381_G1_POINT_LEN) - .zip(qs.chunks_exact(BLS12_381_G2_POINT_LEN)) - // From here on parallelism is fine since the miller loop runs over - // a sum of the pairings and is therefore a commutative operation - .par_bridge() - .map(|(p, q)| { - let g1 = g1_from_variable(p)?; - let g2 = g2_from_variable(q)?; - - Ok((G1Prepared::from(g1.0), G2Prepared::from(g2.0))) - }) + let p_iter = ps + .par_chunks_exact(BLS12_381_G1_POINT_LEN) + .map(g1_from_variable) + .chain([g1_from_variable(r).map(Neg::neg)]) + .map(|g1_res| g1_res.map(|g1| G1Prepared::from(g1.0))); + + let q_iter = qs + .par_chunks_exact(BLS12_381_G2_POINT_LEN) + .map(g2_from_variable) + .chain([g2_from_variable(s)]) + .map(|g2_res| g2_res.map(|g2| G2Prepared::from(g2.0))); + + let pq_pairs: Vec<_> = p_iter + .zip_eq(q_iter) + .map(|(p_res, q_res)| Ok((p_res?, q_res?))) .collect::>()?; - let r = g1_from_variable(r)?; - let s = g2_from_variable(s)?; - - let r_neg = G1Prepared::from(-r.0); - let s_prepared = G2Prepared::from(s.0); - - let (ps, qs): (Vec<_>, Vec<_>) = pq_pairs.into_iter().chain([(r_neg, s_prepared)]).unzip(); + let (ps, qs): (Vec<_>, Vec<_>) = pq_pairs.into_iter().unzip(); Ok(Bls12_381::multi_pairing(ps, qs).is_zero()) } From 4552450252406c17e1b9defa9763eda4e305103b Mon Sep 17 00:00:00 2001 From: Aumetra Weisman Date: Tue, 30 Apr 2024 13:04:08 +0200 Subject: [PATCH 51/79] Adjust gas values --- packages/vm/src/environment.rs | 6 +++--- packages/vm/src/imports.rs | 5 +++-- packages/vm/src/testing/instance.rs | 2 +- 3 files changed, 7 insertions(+), 6 deletions(-) diff --git a/packages/vm/src/environment.rs b/packages/vm/src/environment.rs index a224f8c1a4..98641dac70 100644 --- a/packages/vm/src/environment.rs +++ b/packages/vm/src/environment.rs @@ -57,7 +57,7 @@ pub struct GasConfig { pub bls12_381_pairing_equality_cost: u64, /// bls12-381 aggregated pairing equality check cost per point /// (added on top of the base pairing equality check cost) - pub bls12_381_aggregated_pairing_equality_cost_per_point: u64, + pub bls12_381_aggregated_pairing_equality_cost_per_pair: u64, } impl Default for GasConfig { @@ -85,8 +85,8 @@ impl Default for GasConfig { bls12_381_hash_to_g1_cost: 324 * GAS_PER_US, bls12_381_hash_to_g2_cost: 528 * GAS_PER_US, // god i wish i was lying - bls12_381_pairing_equality_cost: 1318 * GAS_PER_US, - bls12_381_aggregated_pairing_equality_cost_per_point: 109 * GAS_PER_US, + bls12_381_pairing_equality_cost: 1254 * GAS_PER_US, + bls12_381_aggregated_pairing_equality_cost_per_pair: 108 * GAS_PER_US, } } } diff --git a/packages/vm/src/imports.rs b/packages/vm/src/imports.rs index 91f18eb694..93de338333 100644 --- a/packages/vm/src/imports.rs +++ b/packages/vm/src/imports.rs @@ -365,10 +365,11 @@ pub fn do_bls12_381_aggregate_pairing_equality< let gas_info = GasInfo::with_cost( data.gas_config.bls12_381_pairing_equality_cost + // Subtract one since the base benchmark of the pairing equality cost includes a single pair already + (data .gas_config - .bls12_381_aggregated_pairing_equality_cost_per_point - * (ps.len() / BLS12_381_G1_POINT_LEN) as u64), + .bls12_381_aggregated_pairing_equality_cost_per_pair + * (ps.len() / BLS12_381_G1_POINT_LEN) as u64).saturating_sub(1), ); process_gas_info(data, &mut store, gas_info)?; diff --git a/packages/vm/src/testing/instance.rs b/packages/vm/src/testing/instance.rs index 7ea8933840..fc6565ffaf 100644 --- a/packages/vm/src/testing/instance.rs +++ b/packages/vm/src/testing/instance.rs @@ -17,7 +17,7 @@ use super::storage::MockStorage; /// This gas limit is used in integration tests and should be high enough to allow a reasonable /// number of contract executions and queries on one instance. For this reason it is significatly /// higher than the limit for a single execution that we have in the production setup. -const DEFAULT_GAS_LIMIT: u64 = 1_860_000_000; // ~1.86ms +const DEFAULT_GAS_LIMIT: u64 = 2_000_000_000; // ~2.0ms const DEFAULT_MEMORY_LIMIT: Option = Some(Size::mebi(16)); pub fn mock_instance( From edf41e3d2775ff99a7c7d73fd76575f5a1e2ec2f Mon Sep 17 00:00:00 2001 From: Aumetra Weisman Date: Tue, 30 Apr 2024 16:42:03 +0200 Subject: [PATCH 52/79] Specific error cases on point aggregation --- packages/core/src/errors/mod.rs | 4 +- .../core/src/errors/recover_pubkey_error.rs | 3 +- .../core/src/errors/verification_error.rs | 26 +++++++++++++ packages/core/src/lib.rs | 10 ++--- packages/crypto/src/bls12_318/aggregate.rs | 37 +++++++++++++------ packages/crypto/src/errors.rs | 32 ++++++++++++++++ packages/crypto/src/lib.rs | 3 +- packages/crypto/tests/bls12_381.rs | 14 +++++++ packages/std/src/imports.rs | 16 +++++++- packages/vm/src/imports.rs | 25 ++++++++----- 10 files changed, 140 insertions(+), 30 deletions(-) diff --git a/packages/core/src/errors/mod.rs b/packages/core/src/errors/mod.rs index b6787f0dd4..2b4c616786 100644 --- a/packages/core/src/errors/mod.rs +++ b/packages/core/src/errors/mod.rs @@ -13,4 +13,6 @@ pub use core_error::{ }; pub use recover_pubkey_error::RecoverPubkeyError; pub use system_error::SystemError; -pub use verification_error::{AggregationPairingEqualityError, VerificationError}; +pub use verification_error::{ + AggregationError, AggregationPairingEqualityError, VerificationError, +}; diff --git a/packages/core/src/errors/recover_pubkey_error.rs b/packages/core/src/errors/recover_pubkey_error.rs index b63dc89a39..8867994211 100644 --- a/packages/core/src/errors/recover_pubkey_error.rs +++ b/packages/core/src/errors/recover_pubkey_error.rs @@ -65,7 +65,8 @@ impl From for RecoverPubkeyError { } CryptoError::GenericErr { .. } => RecoverPubkeyError::unknown_err(original.code()), CryptoError::InvalidRecoveryParam { .. } => RecoverPubkeyError::InvalidRecoveryParam, - CryptoError::AggregationPairingEquality { .. } + CryptoError::Aggregation { .. } + | CryptoError::AggregationPairingEquality { .. } | CryptoError::BatchErr { .. } | CryptoError::InvalidPubkeyFormat { .. } | CryptoError::InvalidPoint { .. } diff --git a/packages/core/src/errors/verification_error.rs b/packages/core/src/errors/verification_error.rs index b7dc48e6d5..000455c6ce 100644 --- a/packages/core/src/errors/verification_error.rs +++ b/packages/core/src/errors/verification_error.rs @@ -6,6 +6,15 @@ use super::BT; #[cfg(not(target_arch = "wasm32"))] use cosmwasm_crypto::CryptoError; +#[derive(Display, Debug, PartialEq)] +#[cfg_attr(feature = "std", derive(thiserror::Error))] +pub enum AggregationError { + #[display("List of points is empty")] + Empty, + #[display("List is not an expected multiple")] + NotMultiple, +} + #[derive(Display, Debug, PartialEq)] #[cfg_attr(feature = "std", derive(thiserror::Error))] pub enum AggregationPairingEqualityError { @@ -24,6 +33,8 @@ pub enum AggregationPairingEqualityError { #[derive(Display, Debug)] #[cfg_attr(feature = "std", derive(thiserror::Error))] pub enum VerificationError { + #[display("Aggregation error: {source}")] + Aggregation { source: AggregationError }, #[display("Aggregation pairing equality error: {source}")] AggregationPairingEquality { source: AggregationPairingEqualityError, @@ -61,6 +72,9 @@ impl VerificationError { impl PartialEq for VerificationError { fn eq(&self, rhs: &VerificationError) -> bool { match self { + VerificationError::Aggregation { source: lhs_source } => { + matches!(rhs, VerificationError::Aggregation { source: rhs_source } if rhs_source == lhs_source) + } VerificationError::AggregationPairingEquality { source: lhs_source } => { matches!(rhs, VerificationError::AggregationPairingEquality { source: rhs_source } if rhs_source == lhs_source) } @@ -101,6 +115,18 @@ impl PartialEq for VerificationError { impl From for VerificationError { fn from(original: CryptoError) -> Self { match original { + CryptoError::Aggregation { + source: cosmwasm_crypto::AggregationError::Empty, + .. + } => VerificationError::Aggregation { + source: AggregationError::Empty, + }, + CryptoError::Aggregation { + source: cosmwasm_crypto::AggregationError::NotMultiple { .. }, + .. + } => VerificationError::Aggregation { + source: AggregationError::NotMultiple, + }, CryptoError::AggregationPairingEquality { source: cosmwasm_crypto::AggregationPairingEqualityError::EmptyG1, .. diff --git a/packages/core/src/lib.rs b/packages/core/src/lib.rs index b9cd390ba7..d59ffdfa21 100644 --- a/packages/core/src/lib.rs +++ b/packages/core/src/lib.rs @@ -28,11 +28,11 @@ pub use crate::addresses::{instantiate2_address, Addr, CanonicalAddr, Instantiat pub use crate::binary::Binary; pub use crate::encoding::{from_base64, from_hex, to_base64, to_hex}; pub use crate::errors::{ - AggregationPairingEqualityError, CheckedFromRatioError, CheckedMultiplyFractionError, - CheckedMultiplyRatioError, CoinFromStrError, CoinsError, ConversionOverflowError, CoreError, - CoreResult, DivideByZeroError, DivisionError, OverflowError, OverflowOperation, - RecoverPubkeyError, RoundDownOverflowError, RoundUpOverflowError, SystemError, - VerificationError, + AggregationError, AggregationPairingEqualityError, CheckedFromRatioError, + CheckedMultiplyFractionError, CheckedMultiplyRatioError, CoinFromStrError, CoinsError, + ConversionOverflowError, CoreError, CoreResult, DivideByZeroError, DivisionError, + OverflowError, OverflowOperation, RecoverPubkeyError, RoundDownOverflowError, + RoundUpOverflowError, SystemError, VerificationError, }; pub use crate::hex_binary::HexBinary; pub use crate::math::{ diff --git a/packages/crypto/src/bls12_318/aggregate.rs b/packages/crypto/src/bls12_318/aggregate.rs index 021c11bbc5..b3d8295125 100644 --- a/packages/crypto/src/bls12_318/aggregate.rs +++ b/packages/crypto/src/bls12_318/aggregate.rs @@ -1,4 +1,7 @@ -use crate::{errors::InvalidPoint, CryptoError}; +use crate::{ + errors::{Aggregation, InvalidPoint}, + CryptoError, +}; use super::points::{g1_from_fixed, g2_from_fixed, G1, G2}; @@ -10,8 +13,14 @@ const G2_POINT_SIZE: usize = 96; /// This is like Aggregate from /// but works for signatures as well as public keys. pub fn bls12_381_aggregate_g1(points: &[u8]) -> Result<[u8; 48], CryptoError> { - if points.len() % G1_POINT_SIZE != 0 { - return Err(InvalidPoint::DecodingError {}.into()); + if points.is_empty() { + return Err(Aggregation::Empty.into()); + } else if points.len() % G1_POINT_SIZE != 0 { + return Err(Aggregation::NotMultiple { + expected_multiple: G1_POINT_SIZE, + remainder: points.len() % G1_POINT_SIZE, + } + .into()); } let points_count = points.len() / G1_POINT_SIZE; @@ -46,8 +55,14 @@ pub fn bls12_381_aggregate_g1(points: &[u8]) -> Result<[u8; 48], CryptoError> { /// This is like Aggregate from /// but works for signatures as well as public keys. pub fn bls12_381_aggregate_g2(points: &[u8]) -> Result<[u8; 96], CryptoError> { - if points.len() % G2_POINT_SIZE != 0 { - return Err(InvalidPoint::DecodingError {}.into()); + if points.is_empty() { + return Err(Aggregation::Empty.into()); + } else if points.len() % G2_POINT_SIZE != 0 { + return Err(Aggregation::NotMultiple { + expected_multiple: G2_POINT_SIZE, + remainder: points.len() % G2_POINT_SIZE, + } + .into()); } let points_count = points.len() / G2_POINT_SIZE; @@ -138,15 +153,15 @@ mod tests { } #[test] - fn bls12_318_aggregate_g1_works() { - let sum = bls12_381_aggregate_g1(b"").unwrap(); - assert_eq!(sum, G1::identity().to_compressed()); + fn bls12_318_aggregate_g1_empty_err() { + let res = bls12_381_aggregate_g1(b""); + assert!(res.is_err()); } #[test] - fn bls12_318_aggregate_g2_works() { - let sum = bls12_381_aggregate_g2(b"").unwrap(); - assert_eq!(sum, G2::identity().to_compressed()); + fn bls12_318_aggregate_g2_empty_err() { + let res = bls12_381_aggregate_g2(b""); + assert!(res.is_err()); } #[test] diff --git a/packages/crypto/src/errors.rs b/packages/crypto/src/errors.rs index 8a6a38b790..9c8f992693 100644 --- a/packages/crypto/src/errors.rs +++ b/packages/crypto/src/errors.rs @@ -6,6 +6,18 @@ use crate::BT; pub type CryptoResult = core::result::Result; +#[derive(Debug, Display)] +#[cfg_attr(feature = "std", derive(thiserror::Error))] +pub enum Aggregation { + #[display("List of points is empty")] + Empty, + #[display("List is not a multiple of {expected_multiple}. Remainder: {remainder}")] + NotMultiple { + expected_multiple: usize, + remainder: usize, + }, +} + #[derive(Debug, Display)] #[cfg_attr(feature = "std", derive(thiserror::Error))] pub enum AggregationPairingEquality { @@ -33,6 +45,8 @@ pub enum InvalidPoint { #[derive(Display, Debug)] #[cfg_attr(feature = "std", derive(thiserror::Error))] pub enum CryptoError { + #[display("Point aggregation error: {source}")] + Aggregation { source: Aggregation, backtrace: BT }, #[display("Aggregation pairing equality error: {source}")] AggregationPairingEquality { source: AggregationPairingEquality, @@ -133,6 +147,24 @@ impl CryptoError { source: AggregationPairingEquality::EmptyG2 { .. }, .. } => 15, + CryptoError::Aggregation { + source: Aggregation::Empty, + .. + } => 16, + CryptoError::Aggregation { + source: Aggregation::NotMultiple { .. }, + .. + } => 17, + } + } +} + +impl From for CryptoError { + #[track_caller] + fn from(value: Aggregation) -> Self { + Self::Aggregation { + source: value, + backtrace: BT::capture(), } } } diff --git a/packages/crypto/src/lib.rs b/packages/crypto/src/lib.rs index 366a407189..bfa2dfb691 100644 --- a/packages/crypto/src/lib.rs +++ b/packages/crypto/src/lib.rs @@ -36,7 +36,8 @@ pub use crate::ed25519::EDDSA_PUBKEY_LEN; pub use crate::ed25519::{ed25519_batch_verify, ed25519_verify}; #[doc(hidden)] pub use crate::errors::{ - AggregationPairingEquality as AggregationPairingEqualityError, CryptoError, CryptoResult, + Aggregation as AggregationError, AggregationPairingEquality as AggregationPairingEqualityError, + CryptoError, CryptoResult, }; #[doc(hidden)] pub use crate::secp256k1::{secp256k1_recover_pubkey, secp256k1_verify}; diff --git a/packages/crypto/tests/bls12_381.rs b/packages/crypto/tests/bls12_381.rs index 5dc87dc06c..4501774be0 100644 --- a/packages/crypto/tests/bls12_381.rs +++ b/packages/crypto/tests/bls12_381.rs @@ -162,6 +162,12 @@ fn bls12_381_aggregate_g2_works() { let test = read_aggregate_test(json); let signatures: Vec<&[u8]> = test.input.iter().map(|m| m.as_slice()).collect(); let signatures_combined: Vec = signatures.concat(); + + // Skip empty signatures since we explicitly error on empty inputs + if signatures_combined.is_empty() { + continue; + } + let sum = bls12_381_aggregate_g2(&signatures_combined).unwrap(); match test.output { Some(expected) => assert_eq!(sum.as_slice(), expected), @@ -388,6 +394,14 @@ fn bls12_381_fast_aggregate_verify_works() { pubkeys.extend(pubkey); } + // Reject cases with empty public keys since the aggregation will: + // + // 1. error out with our implementation specifically + // 2. if it wouldn't error out, it would return the identity element of G1, making the + // signature validation return invalid anyway + if pubkeys.is_empty() { + return Ok(false); + } let pubkey = bls12_381_aggregate_g1(&pubkeys).unwrap(); if bls12_381_g2_is_identity(&signature)? { diff --git a/packages/std/src/imports.rs b/packages/std/src/imports.rs index 730c93f9b6..242d42a8e8 100644 --- a/packages/std/src/imports.rs +++ b/packages/std/src/imports.rs @@ -17,8 +17,8 @@ use crate::{ memory::get_optional_region_address, }; use crate::{ - AggregationPairingEqualityError, RecoverPubkeyError, StdError, StdResult, SystemError, - VerificationError, + AggregationError, AggregationPairingEqualityError, RecoverPubkeyError, StdError, StdResult, + SystemError, VerificationError, }; /// An upper bound for typical canonical address lengths (e.g. 20 in Cosmos SDK/Ethereum or 32 in Nano/Substrate) @@ -413,6 +413,12 @@ impl Api for ExternalApi { match result { 0 => Ok(point), 8 => Err(VerificationError::InvalidPoint), + 16 => Err(VerificationError::Aggregation { + source: AggregationError::Empty, + }), + 17 => Err(VerificationError::Aggregation { + source: AggregationError::NotMultiple, + }), error_code => Err(VerificationError::unknown_err(error_code)), } } @@ -430,6 +436,12 @@ impl Api for ExternalApi { match result { 0 => Ok(point), 8 => Err(VerificationError::InvalidPoint), + 16 => Err(VerificationError::Aggregation { + source: AggregationError::Empty, + }), + 17 => Err(VerificationError::Aggregation { + source: AggregationError::NotMultiple, + }), error_code => Err(VerificationError::unknown_err(error_code)), } } diff --git a/packages/vm/src/imports.rs b/packages/vm/src/imports.rs index 93de338333..d218c43cbc 100644 --- a/packages/vm/src/imports.rs +++ b/packages/vm/src/imports.rs @@ -283,7 +283,7 @@ pub fn do_bls12_381_aggregate_g1< 0 } Err(err) => match err { - CryptoError::InvalidPoint { .. } => err.code(), + CryptoError::InvalidPoint { .. } | CryptoError::Aggregation { .. } => err.code(), CryptoError::AggregationPairingEquality { .. } | CryptoError::BatchErr { .. } | CryptoError::GenericErr { .. } @@ -327,7 +327,7 @@ pub fn do_bls12_381_aggregate_g2< 0 } Err(err) => match err { - CryptoError::InvalidPoint { .. } => err.code(), + CryptoError::InvalidPoint { .. } | CryptoError::Aggregation { .. } => err.code(), CryptoError::AggregationPairingEquality { .. } | CryptoError::BatchErr { .. } | CryptoError::GenericErr { .. } @@ -380,7 +380,8 @@ pub fn do_bls12_381_aggregate_pairing_equality< CryptoError::AggregationPairingEquality { .. } | CryptoError::InvalidPoint { .. } => { err.code() } - CryptoError::BatchErr { .. } + CryptoError::Aggregation { .. } + | CryptoError::BatchErr { .. } | CryptoError::GenericErr { .. } | CryptoError::InvalidHashFormat { .. } | CryptoError::InvalidPubkeyFormat { .. } @@ -487,7 +488,8 @@ pub fn do_secp256k1_verify err.code(), - CryptoError::AggregationPairingEquality { .. } + CryptoError::Aggregation { .. } + | CryptoError::AggregationPairingEquality { .. } | CryptoError::BatchErr { .. } | CryptoError::InvalidPoint { .. } | CryptoError::InvalidRecoveryParam { .. } @@ -531,7 +533,8 @@ pub fn do_secp256k1_recover_pubkey< | CryptoError::InvalidSignatureFormat { .. } | CryptoError::InvalidRecoveryParam { .. } | CryptoError::GenericErr { .. } => Ok(to_high_half(err.code())), - CryptoError::AggregationPairingEquality { .. } + CryptoError::Aggregation { .. } + | CryptoError::AggregationPairingEquality { .. } | CryptoError::BatchErr { .. } | CryptoError::InvalidPoint { .. } | CryptoError::InvalidPubkeyFormat { .. } @@ -576,7 +579,8 @@ pub fn do_secp256r1_verify err.code(), - CryptoError::AggregationPairingEquality { .. } + CryptoError::Aggregation { .. } + | CryptoError::AggregationPairingEquality { .. } | CryptoError::BatchErr { .. } | CryptoError::InvalidPoint { .. } | CryptoError::InvalidRecoveryParam { .. } @@ -620,7 +624,8 @@ pub fn do_secp256r1_recover_pubkey< | CryptoError::InvalidSignatureFormat { .. } | CryptoError::InvalidRecoveryParam { .. } | CryptoError::GenericErr { .. } => Ok(to_high_half(err.code())), - CryptoError::AggregationPairingEquality { .. } + CryptoError::Aggregation { .. } + | CryptoError::AggregationPairingEquality { .. } | CryptoError::BatchErr { .. } | CryptoError::InvalidPoint { .. } | CryptoError::InvalidPubkeyFormat { .. } @@ -672,7 +677,8 @@ pub fn do_ed25519_verify err.code(), - CryptoError::AggregationPairingEquality { .. } + CryptoError::Aggregation { .. } + | CryptoError::AggregationPairingEquality { .. } | CryptoError::BatchErr { .. } | CryptoError::InvalidPoint { .. } | CryptoError::InvalidHashFormat { .. } @@ -738,7 +744,8 @@ pub fn do_ed25519_batch_verify< | CryptoError::InvalidPubkeyFormat { .. } | CryptoError::InvalidSignatureFormat { .. } | CryptoError::GenericErr { .. } => err.code(), - CryptoError::AggregationPairingEquality { .. } + CryptoError::Aggregation { .. } + | CryptoError::AggregationPairingEquality { .. } | CryptoError::InvalidHashFormat { .. } | CryptoError::InvalidPoint { .. } | CryptoError::InvalidRecoveryParam { .. } From 554c4ebd519c60403725ad46dd239d3c46ec4fc4 Mon Sep 17 00:00:00 2001 From: Aumetra Weisman Date: Tue, 30 Apr 2024 16:45:21 +0200 Subject: [PATCH 53/79] Re-export error type --- packages/crypto/src/bls12_318/aggregate.rs | 5 +---- packages/std/src/lib.rs | 2 +- 2 files changed, 2 insertions(+), 5 deletions(-) diff --git a/packages/crypto/src/bls12_318/aggregate.rs b/packages/crypto/src/bls12_318/aggregate.rs index b3d8295125..c94f85c326 100644 --- a/packages/crypto/src/bls12_318/aggregate.rs +++ b/packages/crypto/src/bls12_318/aggregate.rs @@ -1,7 +1,4 @@ -use crate::{ - errors::{Aggregation, InvalidPoint}, - CryptoError, -}; +use crate::{errors::Aggregation, CryptoError}; use super::points::{g1_from_fixed, g2_from_fixed, G1, G2}; diff --git a/packages/std/src/lib.rs b/packages/std/src/lib.rs index e128a4a1ab..d6b1f97841 100644 --- a/packages/std/src/lib.rs +++ b/packages/std/src/lib.rs @@ -109,7 +109,7 @@ pub mod testing; pub use cosmwasm_core::CoreError as StdError; pub use cosmwasm_core::CoreResult as StdResult; pub use cosmwasm_core::{ - from_base64, from_hex, instantiate2_address, to_base64, to_hex, Addr, + from_base64, from_hex, instantiate2_address, to_base64, to_hex, Addr, AggregationError, AggregationPairingEqualityError, Binary, CanonicalAddr, CheckedFromRatioError, CheckedMultiplyFractionError, CheckedMultiplyRatioError, CoinFromStrError, CoinsError, ConversionOverflowError, Decimal, Decimal256, Decimal256RangeExceeded, DecimalRangeExceeded, From 19e088b6ee408626a0da4d1888c0020142dd4cd9 Mon Sep 17 00:00:00 2001 From: Aumetra Weisman Date: Tue, 30 Apr 2024 16:54:26 +0200 Subject: [PATCH 54/79] Make `g1/g2_sum` private --- packages/crypto/src/bls12_318/aggregate.rs | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/packages/crypto/src/bls12_318/aggregate.rs b/packages/crypto/src/bls12_318/aggregate.rs index c94f85c326..6b889b4a60 100644 --- a/packages/crypto/src/bls12_318/aggregate.rs +++ b/packages/crypto/src/bls12_318/aggregate.rs @@ -94,7 +94,7 @@ pub fn bls12_381_aggregate_g2(points: &[u8]) -> Result<[u8; 96], CryptoError> { /// This is fast since math is done on projective points. Parallelization does not help here /// for ~500 elements. #[inline] -pub fn g1_sum(elements: &[G1]) -> G1 { +fn g1_sum(elements: &[G1]) -> G1 { elements.iter().sum() } @@ -103,7 +103,7 @@ pub fn g1_sum(elements: &[G1]) -> G1 { /// This is fast since math is done on projective points. Parallelization does not help here /// for ~500 elements. #[inline] -pub fn g2_sum(elements: &[G2]) -> G2 { +fn g2_sum(elements: &[G2]) -> G2 { elements.iter().sum() } From bd7018a481f0d4070e6b5202caaf2ca07872a6b1 Mon Sep 17 00:00:00 2001 From: Aumetra Weisman Date: Thu, 2 May 2024 09:54:05 +0200 Subject: [PATCH 55/79] Update contracts/crypto-verify/tests/integration.rs Co-authored-by: Simon Warta <2603011+webmaster128@users.noreply.github.com> --- contracts/crypto-verify/tests/integration.rs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/contracts/crypto-verify/tests/integration.rs b/contracts/crypto-verify/tests/integration.rs index 21987fafe7..e57770be47 100644 --- a/contracts/crypto-verify/tests/integration.rs +++ b/contracts/crypto-verify/tests/integration.rs @@ -84,7 +84,7 @@ const DOMAIN_HASH_TO_G2: &[u8] = b"BLS_SIG_BLS12381G2_XMD:SHA-256_SSWU_RO_NUL_"; /// Public key League of Entropy Mainnet (curl -sS https://drand.cloudflare.com/info) const PK_LEO_MAINNET: [u8; 48] = hex!("868f005eb8e6e4ca0a47c8a77ceaa5309a47978a7c71bc5cce96366b5d7a569937c529eeda66c7293784a9402801af31"); -fn build_bls_message(round: u64, previous_signature: &[u8]) -> Vec { +fn build_drand_message(round: u64, previous_signature: &[u8]) -> Vec { Sha256::new() .chain_update(previous_signature) .chain_update(round.to_be_bytes()) From 020e2f788e97712cbd8f6d4a8e7ebcf997f21f42 Mon Sep 17 00:00:00 2001 From: Simon Warta Date: Thu, 2 May 2024 08:58:50 +0200 Subject: [PATCH 56/79] Rename aggregate_pairing_equality -> pairing_equality --- CHANGELOG.md | 2 +- contracts/crypto-verify/src/bls12_381.rs | 2 +- packages/core/src/errors/mod.rs | 4 +- .../core/src/errors/recover_pubkey_error.rs | 2 +- .../core/src/errors/verification_error.rs | 52 ++++++++--------- packages/core/src/lib.rs | 10 ++-- packages/crypto/benches/main.rs | 39 ++++++------- packages/crypto/src/bls12_318/mod.rs | 2 +- packages/crypto/src/bls12_318/pairing.rs | 58 +++++++++---------- packages/crypto/src/errors.rs | 38 ++++++------ packages/crypto/src/lib.rs | 10 ++-- packages/crypto/tests/bls12_381.rs | 12 ++-- packages/std/src/imports.rs | 38 +++++------- packages/std/src/lib.rs | 16 ++--- packages/std/src/testing/mock.rs | 15 ++--- packages/std/src/traits.rs | 2 +- packages/vm/src/compatibility.rs | 2 +- packages/vm/src/imports.rs | 32 +++++----- packages/vm/src/instance.rs | 8 +-- 19 files changed, 161 insertions(+), 183 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index b6d61a9592..336a88d700 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -38,7 +38,7 @@ and this project adheres to - cosmwasm-vm: Read the state version from Wasm modules and return them as part of `AnalyzeReport` ([#2129]) - cosmwasm-vm: Add `bls12_381_aggregate_g1`, `bls12_381_aggregate_g2`, - `bls12_381_aggregate_pairing_equality`, `bls12_381_hash_to_g1`, and + `bls12_381_pairing_equality`, `bls12_381_hash_to_g1`, and `bls12_381_hash_to_g1` to enable BLS12-381 curve operations, such as verifying pairing equalities ([#2106]) diff --git a/contracts/crypto-verify/src/bls12_381.rs b/contracts/crypto-verify/src/bls12_381.rs index a67f4be14f..f531897717 100644 --- a/contracts/crypto-verify/src/bls12_381.rs +++ b/contracts/crypto-verify/src/bls12_381.rs @@ -9,6 +9,6 @@ pub fn verify( dst: &[u8], ) -> StdResult { let s = api.bls12_381_hash_to_g2(HashFunction::Sha256, msg, dst)?; - api.bls12_381_aggregate_pairing_equality(p, q, r, &s) + api.bls12_381_pairing_equality(p, q, r, &s) .map_err(Into::into) } diff --git a/packages/core/src/errors/mod.rs b/packages/core/src/errors/mod.rs index 2b4c616786..6c10d5f80a 100644 --- a/packages/core/src/errors/mod.rs +++ b/packages/core/src/errors/mod.rs @@ -13,6 +13,4 @@ pub use core_error::{ }; pub use recover_pubkey_error::RecoverPubkeyError; pub use system_error::SystemError; -pub use verification_error::{ - AggregationError, AggregationPairingEqualityError, VerificationError, -}; +pub use verification_error::{AggregationError, PairingEqualityError, VerificationError}; diff --git a/packages/core/src/errors/recover_pubkey_error.rs b/packages/core/src/errors/recover_pubkey_error.rs index 8867994211..6bf97e6d95 100644 --- a/packages/core/src/errors/recover_pubkey_error.rs +++ b/packages/core/src/errors/recover_pubkey_error.rs @@ -66,7 +66,7 @@ impl From for RecoverPubkeyError { CryptoError::GenericErr { .. } => RecoverPubkeyError::unknown_err(original.code()), CryptoError::InvalidRecoveryParam { .. } => RecoverPubkeyError::InvalidRecoveryParam, CryptoError::Aggregation { .. } - | CryptoError::AggregationPairingEquality { .. } + | CryptoError::PairingEquality { .. } | CryptoError::BatchErr { .. } | CryptoError::InvalidPubkeyFormat { .. } | CryptoError::InvalidPoint { .. } diff --git a/packages/core/src/errors/verification_error.rs b/packages/core/src/errors/verification_error.rs index 000455c6ce..bfc3d36c55 100644 --- a/packages/core/src/errors/verification_error.rs +++ b/packages/core/src/errors/verification_error.rs @@ -17,7 +17,7 @@ pub enum AggregationError { #[derive(Display, Debug, PartialEq)] #[cfg_attr(feature = "std", derive(thiserror::Error))] -pub enum AggregationPairingEqualityError { +pub enum PairingEqualityError { #[display("List of G1 points is empty")] EmptyG1, #[display("List of G2 points is empty")] @@ -35,10 +35,6 @@ pub enum AggregationPairingEqualityError { pub enum VerificationError { #[display("Aggregation error: {source}")] Aggregation { source: AggregationError }, - #[display("Aggregation pairing equality error: {source}")] - AggregationPairingEquality { - source: AggregationPairingEqualityError, - }, #[display("Batch error")] BatchErr, #[display("Generic error")] @@ -55,6 +51,8 @@ pub enum VerificationError { InvalidPoint, #[display("Unknown hash function")] UnknownHashFunction, + #[display("Aggregation pairing equality error: {source}")] + PairingEquality { source: PairingEqualityError }, #[display("Unknown error: {error_code}")] UnknownErr { error_code: u32, backtrace: BT }, } @@ -75,8 +73,8 @@ impl PartialEq for VerificationError { VerificationError::Aggregation { source: lhs_source } => { matches!(rhs, VerificationError::Aggregation { source: rhs_source } if rhs_source == lhs_source) } - VerificationError::AggregationPairingEquality { source: lhs_source } => { - matches!(rhs, VerificationError::AggregationPairingEquality { source: rhs_source } if rhs_source == lhs_source) + VerificationError::PairingEquality { source: lhs_source } => { + matches!(rhs, VerificationError::PairingEquality { source: rhs_source } if rhs_source == lhs_source) } VerificationError::BatchErr => matches!(rhs, VerificationError::BatchErr), VerificationError::GenericErr => matches!(rhs, VerificationError::GenericErr), @@ -127,35 +125,35 @@ impl From for VerificationError { } => VerificationError::Aggregation { source: AggregationError::NotMultiple, }, - CryptoError::AggregationPairingEquality { - source: cosmwasm_crypto::AggregationPairingEqualityError::EmptyG1, + CryptoError::PairingEquality { + source: cosmwasm_crypto::PairingEqualityError::EmptyG1, .. - } => VerificationError::AggregationPairingEquality { - source: AggregationPairingEqualityError::EmptyG1, + } => VerificationError::PairingEquality { + source: PairingEqualityError::EmptyG1, }, - CryptoError::AggregationPairingEquality { - source: cosmwasm_crypto::AggregationPairingEqualityError::EmptyG2, + CryptoError::PairingEquality { + source: cosmwasm_crypto::PairingEqualityError::EmptyG2, .. - } => VerificationError::AggregationPairingEquality { - source: AggregationPairingEqualityError::EmptyG2, + } => VerificationError::PairingEquality { + source: PairingEqualityError::EmptyG2, }, - CryptoError::AggregationPairingEquality { - source: cosmwasm_crypto::AggregationPairingEqualityError::NotMultipleG1 { .. }, + CryptoError::PairingEquality { + source: cosmwasm_crypto::PairingEqualityError::NotMultipleG1 { .. }, .. - } => VerificationError::AggregationPairingEquality { - source: AggregationPairingEqualityError::NotMultipleG1, + } => VerificationError::PairingEquality { + source: PairingEqualityError::NotMultipleG1, }, - CryptoError::AggregationPairingEquality { - source: cosmwasm_crypto::AggregationPairingEqualityError::NotMultipleG2 { .. }, + CryptoError::PairingEquality { + source: cosmwasm_crypto::PairingEqualityError::NotMultipleG2 { .. }, .. - } => VerificationError::AggregationPairingEquality { - source: AggregationPairingEqualityError::NotMultipleG2, + } => VerificationError::PairingEquality { + source: PairingEqualityError::NotMultipleG2, }, - CryptoError::AggregationPairingEquality { - source: cosmwasm_crypto::AggregationPairingEqualityError::UnequalPointAmount { .. }, + CryptoError::PairingEquality { + source: cosmwasm_crypto::PairingEqualityError::UnequalPointAmount { .. }, .. - } => VerificationError::AggregationPairingEquality { - source: AggregationPairingEqualityError::UnequalPointAmount, + } => VerificationError::PairingEquality { + source: PairingEqualityError::UnequalPointAmount, }, CryptoError::InvalidHashFormat { .. } => VerificationError::InvalidHashFormat, CryptoError::InvalidPubkeyFormat { .. } => VerificationError::InvalidPubkeyFormat, diff --git a/packages/core/src/lib.rs b/packages/core/src/lib.rs index d59ffdfa21..0537a84028 100644 --- a/packages/core/src/lib.rs +++ b/packages/core/src/lib.rs @@ -28,11 +28,11 @@ pub use crate::addresses::{instantiate2_address, Addr, CanonicalAddr, Instantiat pub use crate::binary::Binary; pub use crate::encoding::{from_base64, from_hex, to_base64, to_hex}; pub use crate::errors::{ - AggregationError, AggregationPairingEqualityError, CheckedFromRatioError, - CheckedMultiplyFractionError, CheckedMultiplyRatioError, CoinFromStrError, CoinsError, - ConversionOverflowError, CoreError, CoreResult, DivideByZeroError, DivisionError, - OverflowError, OverflowOperation, RecoverPubkeyError, RoundDownOverflowError, - RoundUpOverflowError, SystemError, VerificationError, + AggregationError, CheckedFromRatioError, CheckedMultiplyFractionError, + CheckedMultiplyRatioError, CoinFromStrError, CoinsError, ConversionOverflowError, CoreError, + CoreResult, DivideByZeroError, DivisionError, OverflowError, OverflowOperation, + PairingEqualityError, RecoverPubkeyError, RoundDownOverflowError, RoundUpOverflowError, + SystemError, VerificationError, }; pub use crate::hex_binary::HexBinary; pub use crate::math::{ diff --git a/packages/crypto/benches/main.rs b/packages/crypto/benches/main.rs index 4cf6a27b54..2e78e05b0a 100644 --- a/packages/crypto/benches/main.rs +++ b/packages/crypto/benches/main.rs @@ -16,10 +16,10 @@ use k256::ecdsa::SigningKey; // type alias use sha2::Sha256; use cosmwasm_crypto::{ - bls12_381_aggregate_g1, bls12_381_aggregate_g2, bls12_381_aggregate_pairing_equality, - bls12_381_g1_generator, bls12_381_hash_to_g1, bls12_381_hash_to_g2, ed25519_batch_verify, - ed25519_verify, secp256k1_recover_pubkey, secp256k1_verify, secp256r1_recover_pubkey, - secp256r1_verify, HashFunction, BLS12_381_G1_POINT_LEN, BLS12_381_G2_POINT_LEN, + bls12_381_aggregate_g1, bls12_381_aggregate_g2, bls12_381_g1_generator, bls12_381_hash_to_g1, + bls12_381_hash_to_g2, bls12_381_pairing_equality, ed25519_batch_verify, ed25519_verify, + secp256k1_recover_pubkey, secp256k1_verify, secp256r1_recover_pubkey, secp256r1_verify, + HashFunction, BLS12_381_G1_POINT_LEN, BLS12_381_G2_POINT_LEN, }; use std::cmp::min; @@ -187,22 +187,19 @@ where .serialize_compressed(&mut serialized_signature[..]) .unwrap(); - group.bench_function( - format!("bls12_381_aggregate_pairing_equality_{num_points}"), - |b| { - b.iter(|| { - let is_valid = black_box(bls12_381_aggregate_pairing_equality( - &serialized_pubkeys, - &serialized_messages, - &bls12_381_g1_generator(), - &serialized_signature, - )) - .unwrap(); - - assert!(is_valid); - }); - }, - ); + group.bench_function(format!("bls12_381_pairing_equality_{num_points}"), |b| { + b.iter(|| { + let is_valid = black_box(bls12_381_pairing_equality( + &serialized_pubkeys, + &serialized_messages, + &bls12_381_g1_generator(), + &serialized_signature, + )) + .unwrap(); + + assert!(is_valid); + }); + }); } } @@ -231,7 +228,7 @@ where let message = bls12_381_hash_to_g2(HashFunction::Sha256, &BLS_MESSAGE, BLS_DST); b.iter(|| { - let is_equal = bls12_381_aggregate_pairing_equality( + let is_equal = bls12_381_pairing_equality( black_box(&BLS_PUBKEY), &message, &generator, diff --git a/packages/crypto/src/bls12_318/mod.rs b/packages/crypto/src/bls12_318/mod.rs index a2fab9aade..9a171d84e3 100644 --- a/packages/crypto/src/bls12_318/mod.rs +++ b/packages/crypto/src/bls12_318/mod.rs @@ -7,7 +7,7 @@ mod points; pub use aggregate::{bls12_381_aggregate_g1, bls12_381_aggregate_g2}; pub use constants::{bls12_381_g1_generator, bls12_381_g2_generator}; pub use hash::{bls12_381_hash_to_g1, bls12_381_hash_to_g2, HashFunction}; -pub use pairing::bls12_381_aggregate_pairing_equality; +pub use pairing::bls12_381_pairing_equality; pub use points::{bls12_381_g1_is_identity, bls12_381_g2_is_identity}; pub const BLS12_381_G1_POINT_LEN: usize = 48; diff --git a/packages/crypto/src/bls12_318/pairing.rs b/packages/crypto/src/bls12_318/pairing.rs index e5eb79dfdd..63ae1b7ff3 100644 --- a/packages/crypto/src/bls12_318/pairing.rs +++ b/packages/crypto/src/bls12_318/pairing.rs @@ -1,8 +1,6 @@ use core::ops::Neg; -use crate::{ - errors::AggregationPairingEquality, CryptoError, BLS12_381_G1_POINT_LEN, BLS12_381_G2_POINT_LEN, -}; +use crate::{errors::PairingEquality, CryptoError, BLS12_381_G1_POINT_LEN, BLS12_381_G2_POINT_LEN}; use super::points::{g1_from_variable, g2_from_variable}; use ark_bls12_381::Bls12_381; @@ -16,28 +14,28 @@ use rayon::{ slice::ParallelSlice, }; -pub fn bls12_381_aggregate_pairing_equality( +pub fn bls12_381_pairing_equality( ps: &[u8], qs: &[u8], r: &[u8], s: &[u8], ) -> Result { if ps.is_empty() { - return Err(AggregationPairingEquality::EmptyG1.into()); + return Err(PairingEquality::EmptyG1.into()); } else if qs.is_empty() { - return Err(AggregationPairingEquality::EmptyG2.into()); + return Err(PairingEquality::EmptyG2.into()); } else if ps.len() % BLS12_381_G1_POINT_LEN != 0 { - return Err(AggregationPairingEquality::NotMultipleG1 { + return Err(PairingEquality::NotMultipleG1 { remainder: ps.len() % BLS12_381_G1_POINT_LEN, } .into()); } else if qs.len() % BLS12_381_G2_POINT_LEN != 0 { - return Err(AggregationPairingEquality::NotMultipleG2 { + return Err(PairingEquality::NotMultipleG2 { remainder: qs.len() % BLS12_381_G2_POINT_LEN, } .into()); } else if (ps.len() / BLS12_381_G1_POINT_LEN) != (qs.len() / BLS12_381_G2_POINT_LEN) { - return Err(AggregationPairingEquality::UnequalPointAmount { + return Err(PairingEquality::UnequalPointAmount { left: ps.len() / BLS12_381_G1_POINT_LEN, right: qs.len() / BLS12_381_G2_POINT_LEN, } @@ -73,8 +71,8 @@ mod test { use crate::{ bls12_318::points::{g1_from_fixed, g2_from_fixed, g2_from_variable, G1}, - bls12_381_aggregate_pairing_equality, bls12_381_hash_to_g2, - AggregationPairingEqualityError, CryptoError, HashFunction, + bls12_381_hash_to_g2, bls12_381_pairing_equality, CryptoError, HashFunction, + PairingEqualityError, }; // Let's directly go for something really cool and advanced: @@ -106,7 +104,7 @@ mod test { let msg = build_message(round, &previous_signature); let g2_msg = bls12_381_hash_to_g2(HashFunction::Sha256, msg.as_slice(), DOMAIN_HASH_TO_G2); - assert!(bls12_381_aggregate_pairing_equality( + assert!(bls12_381_pairing_equality( &g1.to_compressed(), &sigma.to_compressed(), &PK_LEO_MAINNET, @@ -122,7 +120,7 @@ mod test { let g2_msg = bls12_381_hash_to_g2(HashFunction::Sha256, msg.as_slice(), DOMAIN_HASH_TO_G2); - assert!(!bls12_381_aggregate_pairing_equality( + assert!(!bls12_381_pairing_equality( &g1.to_compressed(), &sigma.to_compressed(), &PK_LEO_MAINNET, @@ -150,7 +148,7 @@ mod test { )) .unwrap(); - assert!(bls12_381_aggregate_pairing_equality( + assert!(bls12_381_pairing_equality( &aggregated_g1.to_compressed(), &aggregated_sigma.to_compressed(), &aggregated_key.to_compressed(), @@ -160,48 +158,48 @@ mod test { } #[test] - fn aggregate_pairing_equality_error_cases_work() { - let result = bls12_381_aggregate_pairing_equality(&[], &[12], &[12], &[12]); + fn pairing_equality_error_cases_work() { + let result = bls12_381_pairing_equality(&[], &[12], &[12], &[12]); assert!(matches!( result, - Err(CryptoError::AggregationPairingEquality { - source: AggregationPairingEqualityError::EmptyG1, + Err(CryptoError::PairingEquality { + source: PairingEqualityError::EmptyG1, .. }) )); - let result = bls12_381_aggregate_pairing_equality(&[12], &[], &[12], &[12]); + let result = bls12_381_pairing_equality(&[12], &[], &[12], &[12]); assert!(matches!( result, - Err(CryptoError::AggregationPairingEquality { - source: AggregationPairingEqualityError::EmptyG2, + Err(CryptoError::PairingEquality { + source: PairingEqualityError::EmptyG2, .. }) )); - let result = bls12_381_aggregate_pairing_equality(&[12], &[0; 96], &[12], &[12]); + let result = bls12_381_pairing_equality(&[12], &[0; 96], &[12], &[12]); assert!(matches!( result, - Err(CryptoError::AggregationPairingEquality { - source: AggregationPairingEqualityError::NotMultipleG1 { remainder: 1 }, + Err(CryptoError::PairingEquality { + source: PairingEqualityError::NotMultipleG1 { remainder: 1 }, .. }) )); - let result = bls12_381_aggregate_pairing_equality(&[0; 48], &[12], &[12], &[12]); + let result = bls12_381_pairing_equality(&[0; 48], &[12], &[12], &[12]); assert!(matches!( result, - Err(CryptoError::AggregationPairingEquality { - source: AggregationPairingEqualityError::NotMultipleG2 { remainder: 1 }, + Err(CryptoError::PairingEquality { + source: PairingEqualityError::NotMultipleG2 { remainder: 1 }, .. }) )); - let result = bls12_381_aggregate_pairing_equality(&[0; 96], &[0; 96], &[12], &[12]); + let result = bls12_381_pairing_equality(&[0; 96], &[0; 96], &[12], &[12]); assert!(matches!( result, - Err(CryptoError::AggregationPairingEquality { - source: AggregationPairingEqualityError::UnequalPointAmount { left: 2, right: 1 }, + Err(CryptoError::PairingEquality { + source: PairingEqualityError::UnequalPointAmount { left: 2, right: 1 }, .. }) )); diff --git a/packages/crypto/src/errors.rs b/packages/crypto/src/errors.rs index 9c8f992693..067b583e80 100644 --- a/packages/crypto/src/errors.rs +++ b/packages/crypto/src/errors.rs @@ -20,7 +20,7 @@ pub enum Aggregation { #[derive(Debug, Display)] #[cfg_attr(feature = "std", derive(thiserror::Error))] -pub enum AggregationPairingEquality { +pub enum PairingEquality { #[display("List of G1 points is empty")] EmptyG1, #[display("List of G2 points is empty")] @@ -47,11 +47,6 @@ pub enum InvalidPoint { pub enum CryptoError { #[display("Point aggregation error: {source}")] Aggregation { source: Aggregation, backtrace: BT }, - #[display("Aggregation pairing equality error: {source}")] - AggregationPairingEquality { - source: AggregationPairingEquality, - backtrace: BT, - }, #[display("Batch verify error: {msg}")] BatchErr { msg: String, backtrace: BT }, #[display("Crypto error: {msg}")] @@ -66,6 +61,11 @@ pub enum CryptoError { InvalidRecoveryParam { backtrace: BT }, #[display("Invalid point: {source}")] InvalidPoint { source: InvalidPoint, backtrace: BT }, + #[display("Pairing equality error: {source}")] + PairingEquality { + source: PairingEquality, + backtrace: BT, + }, #[display("Unknown hash function")] UnknownHashFunction { backtrace: BT }, } @@ -127,24 +127,24 @@ impl CryptoError { CryptoError::InvalidPoint { .. } => 8, CryptoError::UnknownHashFunction { .. } => 9, CryptoError::GenericErr { .. } => 10, - CryptoError::AggregationPairingEquality { - source: AggregationPairingEquality::NotMultipleG1 { .. }, + CryptoError::PairingEquality { + source: PairingEquality::NotMultipleG1 { .. }, .. } => 11, - CryptoError::AggregationPairingEquality { - source: AggregationPairingEquality::NotMultipleG2 { .. }, + CryptoError::PairingEquality { + source: PairingEquality::NotMultipleG2 { .. }, .. } => 12, - CryptoError::AggregationPairingEquality { - source: AggregationPairingEquality::UnequalPointAmount { .. }, + CryptoError::PairingEquality { + source: PairingEquality::UnequalPointAmount { .. }, .. } => 13, - CryptoError::AggregationPairingEquality { - source: AggregationPairingEquality::EmptyG1 { .. }, + CryptoError::PairingEquality { + source: PairingEquality::EmptyG1 { .. }, .. } => 14, - CryptoError::AggregationPairingEquality { - source: AggregationPairingEquality::EmptyG2 { .. }, + CryptoError::PairingEquality { + source: PairingEquality::EmptyG2 { .. }, .. } => 15, CryptoError::Aggregation { @@ -169,10 +169,10 @@ impl From for CryptoError { } } -impl From for CryptoError { +impl From for CryptoError { #[track_caller] - fn from(value: AggregationPairingEquality) -> Self { - Self::AggregationPairingEquality { + fn from(value: PairingEquality) -> Self { + Self::PairingEquality { source: value, backtrace: BT::capture(), } diff --git a/packages/crypto/src/lib.rs b/packages/crypto/src/lib.rs index bfa2dfb691..af83f14e39 100644 --- a/packages/crypto/src/lib.rs +++ b/packages/crypto/src/lib.rs @@ -23,9 +23,9 @@ mod secp256r1; #[cfg(feature = "std")] #[doc(hidden)] pub use crate::bls12_318::{ - bls12_381_aggregate_g1, bls12_381_aggregate_g2, bls12_381_aggregate_pairing_equality, - bls12_381_g1_generator, bls12_381_g1_is_identity, bls12_381_g2_generator, - bls12_381_g2_is_identity, bls12_381_hash_to_g1, bls12_381_hash_to_g2, HashFunction, + bls12_381_aggregate_g1, bls12_381_aggregate_g2, bls12_381_g1_generator, + bls12_381_g1_is_identity, bls12_381_g2_generator, bls12_381_g2_is_identity, + bls12_381_hash_to_g1, bls12_381_hash_to_g2, bls12_381_pairing_equality, HashFunction, BLS12_381_G1_POINT_LEN, BLS12_381_G2_POINT_LEN, }; #[doc(hidden)] @@ -36,8 +36,8 @@ pub use crate::ed25519::EDDSA_PUBKEY_LEN; pub use crate::ed25519::{ed25519_batch_verify, ed25519_verify}; #[doc(hidden)] pub use crate::errors::{ - Aggregation as AggregationError, AggregationPairingEquality as AggregationPairingEqualityError, - CryptoError, CryptoResult, + Aggregation as AggregationError, CryptoError, CryptoResult, + PairingEquality as PairingEqualityError, }; #[doc(hidden)] pub use crate::secp256k1::{secp256k1_recover_pubkey, secp256k1_verify}; diff --git a/packages/crypto/tests/bls12_381.rs b/packages/crypto/tests/bls12_381.rs index 4501774be0..8950782ef2 100644 --- a/packages/crypto/tests/bls12_381.rs +++ b/packages/crypto/tests/bls12_381.rs @@ -6,9 +6,9 @@ use ark_serialize::{CanonicalDeserialize, CanonicalSerialize}; use base64::engine::general_purpose::STANDARD; use base64_serde::base64_serde_type; use cosmwasm_crypto::{ - bls12_381_aggregate_g1, bls12_381_aggregate_g2, bls12_381_aggregate_pairing_equality, - bls12_381_g1_generator, bls12_381_g1_is_identity, bls12_381_g2_is_identity, - bls12_381_hash_to_g2, HashFunction, BLS12_381_G2_POINT_LEN, + bls12_381_aggregate_g1, bls12_381_aggregate_g2, bls12_381_g1_generator, + bls12_381_g1_is_identity, bls12_381_g2_is_identity, bls12_381_hash_to_g2, + bls12_381_pairing_equality, HashFunction, BLS12_381_G2_POINT_LEN, }; const PROOF_OF_POSSESSION_DST: &[u8] = b"BLS_SIG_BLS12381G2_XMD:SHA-256_SSWU_RO_POP_"; @@ -258,7 +258,7 @@ fn bls12_381_verify_works() { return Ok(false); } - let bool_result = bls12_381_aggregate_pairing_equality( + let bool_result = bls12_381_pairing_equality( &pubkey, &message_point, &bls12_381_g1_generator(), @@ -334,7 +334,7 @@ fn bls12_381_aggregate_verify_works() { return Ok(false); } - let bool_result = bls12_381_aggregate_pairing_equality( + let bool_result = bls12_381_pairing_equality( &pubkeys, &messages, &bls12_381_g1_generator(), @@ -409,7 +409,7 @@ fn bls12_381_fast_aggregate_verify_works() { return Ok(false); } - let bool_result = bls12_381_aggregate_pairing_equality( + let bool_result = bls12_381_pairing_equality( &pubkey, &message_point, &bls12_381_g1_generator(), diff --git a/packages/std/src/imports.rs b/packages/std/src/imports.rs index 242d42a8e8..1cb1219bac 100644 --- a/packages/std/src/imports.rs +++ b/packages/std/src/imports.rs @@ -17,8 +17,8 @@ use crate::{ memory::get_optional_region_address, }; use crate::{ - AggregationError, AggregationPairingEqualityError, RecoverPubkeyError, StdError, StdResult, - SystemError, VerificationError, + AggregationError, PairingEqualityError, RecoverPubkeyError, StdError, StdResult, SystemError, + VerificationError, }; /// An upper bound for typical canonical address lengths (e.g. 20 in Cosmos SDK/Ethereum or 32 in Nano/Substrate) @@ -58,12 +58,7 @@ extern "C" { fn bls12_381_aggregate_g2(g2s_ptr: u32, out_ptr: u32) -> u32; #[cfg(feature = "cosmwasm_2_1")] - fn bls12_381_aggregate_pairing_equality( - ps_ptr: u32, - qs_ptr: u32, - r_ptr: u32, - s_ptr: u32, - ) -> u32; + fn bls12_381_pairing_equality(ps_ptr: u32, qs_ptr: u32, r_ptr: u32, s_ptr: u32) -> u32; #[cfg(feature = "cosmwasm_2_1")] fn bls12_381_hash_to_g1(hash_function: u32, msg_ptr: u32, dst_ptr: u32, out_ptr: u32) -> u32; @@ -447,7 +442,7 @@ impl Api for ExternalApi { } #[cfg(feature = "cosmwasm_2_1")] - fn bls12_381_aggregate_pairing_equality( + fn bls12_381_pairing_equality( &self, ps: &[u8], qs: &[u8], @@ -464,27 +459,26 @@ impl Api for ExternalApi { let send_r_ptr = &*send_r as *const Region as u32; let send_s_ptr = &*send_s as *const Region as u32; - let result = unsafe { - bls12_381_aggregate_pairing_equality(send_ps_ptr, send_qs_ptr, send_r_ptr, send_s_ptr) - }; + let result = + unsafe { bls12_381_pairing_equality(send_ps_ptr, send_qs_ptr, send_r_ptr, send_s_ptr) }; match result { 0 => Ok(true), 1 => Ok(false), 8 => Err(VerificationError::InvalidPoint), - 11 => Err(VerificationError::AggregationPairingEquality { - source: AggregationPairingEqualityError::NotMultipleG1, + 11 => Err(VerificationError::PairingEquality { + source: PairingEqualityError::NotMultipleG1, }), - 12 => Err(VerificationError::AggregationPairingEquality { - source: AggregationPairingEqualityError::NotMultipleG2, + 12 => Err(VerificationError::PairingEquality { + source: PairingEqualityError::NotMultipleG2, }), - 13 => Err(VerificationError::AggregationPairingEquality { - source: AggregationPairingEqualityError::UnequalPointAmount, + 13 => Err(VerificationError::PairingEquality { + source: PairingEqualityError::UnequalPointAmount, }), - 14 => Err(VerificationError::AggregationPairingEquality { - source: AggregationPairingEqualityError::EmptyG1, + 14 => Err(VerificationError::PairingEquality { + source: PairingEqualityError::EmptyG1, }), - 15 => Err(VerificationError::AggregationPairingEquality { - source: AggregationPairingEqualityError::EmptyG2, + 15 => Err(VerificationError::PairingEquality { + source: PairingEqualityError::EmptyG2, }), error_code => Err(VerificationError::unknown_err(error_code)), } diff --git a/packages/std/src/lib.rs b/packages/std/src/lib.rs index d6b1f97841..b671c60474 100644 --- a/packages/std/src/lib.rs +++ b/packages/std/src/lib.rs @@ -109,14 +109,14 @@ pub mod testing; pub use cosmwasm_core::CoreError as StdError; pub use cosmwasm_core::CoreResult as StdResult; pub use cosmwasm_core::{ - from_base64, from_hex, instantiate2_address, to_base64, to_hex, Addr, AggregationError, - AggregationPairingEqualityError, Binary, CanonicalAddr, CheckedFromRatioError, - CheckedMultiplyFractionError, CheckedMultiplyRatioError, CoinFromStrError, CoinsError, - ConversionOverflowError, Decimal, Decimal256, Decimal256RangeExceeded, DecimalRangeExceeded, - DivideByZeroError, DivisionError, Fraction, HexBinary, Instantiate2AddressError, Int128, - Int256, Int512, Int64, Isqrt, OverflowError, OverflowOperation, RecoverPubkeyError, - SignedDecimal, SignedDecimal256, SignedDecimal256RangeExceeded, SignedDecimalRangeExceeded, - SystemError, Timestamp, Uint128, Uint256, Uint512, Uint64, VerificationError, + from_base64, from_hex, instantiate2_address, to_base64, to_hex, Addr, AggregationError, Binary, + CanonicalAddr, CheckedFromRatioError, CheckedMultiplyFractionError, CheckedMultiplyRatioError, + CoinFromStrError, CoinsError, ConversionOverflowError, Decimal, Decimal256, + Decimal256RangeExceeded, DecimalRangeExceeded, DivideByZeroError, DivisionError, Fraction, + HexBinary, Instantiate2AddressError, Int128, Int256, Int512, Int64, Isqrt, OverflowError, + OverflowOperation, PairingEqualityError, RecoverPubkeyError, SignedDecimal, SignedDecimal256, + SignedDecimal256RangeExceeded, SignedDecimalRangeExceeded, SystemError, Timestamp, Uint128, + Uint256, Uint512, Uint64, VerificationError, }; #[cfg(not(target_arch = "wasm32"))] diff --git a/packages/std/src/testing/mock.rs b/packages/std/src/testing/mock.rs index c087b76a5a..8784a8e8da 100644 --- a/packages/std/src/testing/mock.rs +++ b/packages/std/src/testing/mock.rs @@ -160,14 +160,14 @@ impl Api for MockApi { cosmwasm_crypto::bls12_381_aggregate_g2(g2s).map_err(Into::into) } - fn bls12_381_aggregate_pairing_equality( + fn bls12_381_pairing_equality( &self, ps: &[u8], qs: &[u8], r: &[u8], s: &[u8], ) -> Result { - cosmwasm_crypto::bls12_381_aggregate_pairing_equality(ps, qs, r, s).map_err(Into::into) + cosmwasm_crypto::bls12_381_pairing_equality(ps, qs, r, s).map_err(Into::into) } fn bls12_381_hash_to_g1( @@ -1357,7 +1357,7 @@ mod tests { } #[test] - fn bls12_381_aggregate_pairing_equality_works() { + fn bls12_381_pairing_equality_works() { let api = MockApi::default(); let dst = b"BLS_SIG_BLS12381G2_XMD:SHA-256_SSWU_RO_POP_"; @@ -1377,7 +1377,7 @@ mod tests { let s = hex!("9104e74b9dfd3ad502f25d6a5ef57db0ed7d9a0e00f3500586d8ce44231212542fcfaf87840539b398bf07626705cf1105d246ca1062c6c2e1a53029a0f790ed5e3cb1f52f8234dc5144c45fc847c0cd37a92d68e7c5ba7c648a8a339f171244"); let is_valid = api - .bls12_381_aggregate_pairing_equality(&ps, &qs, &g1_generator, &s) + .bls12_381_pairing_equality(&ps, &qs, &g1_generator, &s) .unwrap(); assert!(is_valid); } @@ -1439,12 +1439,7 @@ mod tests { let g1_generator = cosmwasm_crypto::bls12_381_g1_generator(); let is_valid = api - .bls12_381_aggregate_pairing_equality( - &g1_generator, - &signature, - &PK_LEO_MAINNET, - &msg_point, - ) + .bls12_381_pairing_equality(&g1_generator, &signature, &PK_LEO_MAINNET, &msg_point) .unwrap(); assert!(is_valid); diff --git a/packages/std/src/traits.rs b/packages/std/src/traits.rs index 52f488e368..16661251cf 100644 --- a/packages/std/src/traits.rs +++ b/packages/std/src/traits.rs @@ -198,7 +198,7 @@ pub trait Api { } #[allow(unused_variables)] - fn bls12_381_aggregate_pairing_equality( + fn bls12_381_pairing_equality( &self, ps: &[u8], qs: &[u8], diff --git a/packages/vm/src/compatibility.rs b/packages/vm/src/compatibility.rs index a160bdc819..e354a10731 100644 --- a/packages/vm/src/compatibility.rs +++ b/packages/vm/src/compatibility.rs @@ -22,7 +22,7 @@ const SUPPORTED_IMPORTS: &[&str] = &[ "env.addr_humanize", "env.bls12_381_aggregate_g1", "env.bls12_381_aggregate_g2", - "env.bls12_381_aggregate_pairing_equality", + "env.bls12_381_pairing_equality", "env.bls12_381_hash_to_g1", "env.bls12_381_hash_to_g2", "env.secp256k1_verify", diff --git a/packages/vm/src/imports.rs b/packages/vm/src/imports.rs index d218c43cbc..fa29a72cde 100644 --- a/packages/vm/src/imports.rs +++ b/packages/vm/src/imports.rs @@ -4,10 +4,10 @@ use std::cmp::max; use std::marker::PhantomData; use cosmwasm_crypto::{ - bls12_381_aggregate_g1, bls12_381_aggregate_g2, bls12_381_aggregate_pairing_equality, - bls12_381_hash_to_g1, bls12_381_hash_to_g2, ed25519_batch_verify, ed25519_verify, - secp256k1_recover_pubkey, secp256k1_verify, secp256r1_recover_pubkey, secp256r1_verify, - CryptoError, HashFunction, BLS12_381_G1_POINT_LEN, BLS12_381_G2_POINT_LEN, + bls12_381_aggregate_g1, bls12_381_aggregate_g2, bls12_381_hash_to_g1, bls12_381_hash_to_g2, + bls12_381_pairing_equality, ed25519_batch_verify, ed25519_verify, secp256k1_recover_pubkey, + secp256k1_verify, secp256r1_recover_pubkey, secp256r1_verify, CryptoError, HashFunction, + BLS12_381_G1_POINT_LEN, BLS12_381_G2_POINT_LEN, }; use cosmwasm_crypto::{ ECDSA_PUBKEY_MAX_LEN, ECDSA_SIGNATURE_LEN, EDDSA_PUBKEY_LEN, MESSAGE_HASH_MAX_LEN, @@ -284,7 +284,7 @@ pub fn do_bls12_381_aggregate_g1< } Err(err) => match err { CryptoError::InvalidPoint { .. } | CryptoError::Aggregation { .. } => err.code(), - CryptoError::AggregationPairingEquality { .. } + CryptoError::PairingEquality { .. } | CryptoError::BatchErr { .. } | CryptoError::GenericErr { .. } | CryptoError::InvalidHashFormat { .. } @@ -328,7 +328,7 @@ pub fn do_bls12_381_aggregate_g2< } Err(err) => match err { CryptoError::InvalidPoint { .. } | CryptoError::Aggregation { .. } => err.code(), - CryptoError::AggregationPairingEquality { .. } + CryptoError::PairingEquality { .. } | CryptoError::BatchErr { .. } | CryptoError::GenericErr { .. } | CryptoError::InvalidHashFormat { .. } @@ -344,7 +344,7 @@ pub fn do_bls12_381_aggregate_g2< Ok(code) } -pub fn do_bls12_381_aggregate_pairing_equality< +pub fn do_bls12_381_pairing_equality< A: BackendApi + 'static, S: Storage + 'static, Q: Querier + 'static, @@ -373,13 +373,11 @@ pub fn do_bls12_381_aggregate_pairing_equality< ); process_gas_info(data, &mut store, gas_info)?; - let code = match bls12_381_aggregate_pairing_equality(&ps, &qs, &r, &s) { + let code = match bls12_381_pairing_equality(&ps, &qs, &r, &s) { Ok(true) => BLS12_381_VALID_PAIRING, Ok(false) => BLS12_381_INVALID_PAIRING, Err(err) => match err { - CryptoError::AggregationPairingEquality { .. } | CryptoError::InvalidPoint { .. } => { - err.code() - } + CryptoError::PairingEquality { .. } | CryptoError::InvalidPoint { .. } => err.code(), CryptoError::Aggregation { .. } | CryptoError::BatchErr { .. } | CryptoError::GenericErr { .. } @@ -489,7 +487,7 @@ pub fn do_secp256k1_verify err.code(), CryptoError::Aggregation { .. } - | CryptoError::AggregationPairingEquality { .. } + | CryptoError::PairingEquality { .. } | CryptoError::BatchErr { .. } | CryptoError::InvalidPoint { .. } | CryptoError::InvalidRecoveryParam { .. } @@ -534,7 +532,7 @@ pub fn do_secp256k1_recover_pubkey< | CryptoError::InvalidRecoveryParam { .. } | CryptoError::GenericErr { .. } => Ok(to_high_half(err.code())), CryptoError::Aggregation { .. } - | CryptoError::AggregationPairingEquality { .. } + | CryptoError::PairingEquality { .. } | CryptoError::BatchErr { .. } | CryptoError::InvalidPoint { .. } | CryptoError::InvalidPubkeyFormat { .. } @@ -580,7 +578,7 @@ pub fn do_secp256r1_verify err.code(), CryptoError::Aggregation { .. } - | CryptoError::AggregationPairingEquality { .. } + | CryptoError::PairingEquality { .. } | CryptoError::BatchErr { .. } | CryptoError::InvalidPoint { .. } | CryptoError::InvalidRecoveryParam { .. } @@ -625,7 +623,7 @@ pub fn do_secp256r1_recover_pubkey< | CryptoError::InvalidRecoveryParam { .. } | CryptoError::GenericErr { .. } => Ok(to_high_half(err.code())), CryptoError::Aggregation { .. } - | CryptoError::AggregationPairingEquality { .. } + | CryptoError::PairingEquality { .. } | CryptoError::BatchErr { .. } | CryptoError::InvalidPoint { .. } | CryptoError::InvalidPubkeyFormat { .. } @@ -678,7 +676,7 @@ pub fn do_ed25519_verify err.code(), CryptoError::Aggregation { .. } - | CryptoError::AggregationPairingEquality { .. } + | CryptoError::PairingEquality { .. } | CryptoError::BatchErr { .. } | CryptoError::InvalidPoint { .. } | CryptoError::InvalidHashFormat { .. } @@ -745,7 +743,7 @@ pub fn do_ed25519_batch_verify< | CryptoError::InvalidSignatureFormat { .. } | CryptoError::GenericErr { .. } => err.code(), CryptoError::Aggregation { .. } - | CryptoError::AggregationPairingEquality { .. } + | CryptoError::PairingEquality { .. } | CryptoError::InvalidHashFormat { .. } | CryptoError::InvalidPoint { .. } | CryptoError::InvalidRecoveryParam { .. } diff --git a/packages/vm/src/instance.rs b/packages/vm/src/instance.rs index 77bf0887c4..08082d7ee8 100644 --- a/packages/vm/src/instance.rs +++ b/packages/vm/src/instance.rs @@ -15,8 +15,8 @@ use crate::environment::Environment; use crate::errors::{CommunicationError, VmError, VmResult}; use crate::imports::{ do_abort, do_addr_canonicalize, do_addr_humanize, do_addr_validate, do_bls12_381_aggregate_g1, - do_bls12_381_aggregate_g2, do_bls12_381_aggregate_pairing_equality, do_bls12_381_hash_to_g1, - do_bls12_381_hash_to_g2, do_db_read, do_db_remove, do_db_write, do_debug, + do_bls12_381_aggregate_g2, do_bls12_381_hash_to_g1, do_bls12_381_hash_to_g2, + do_bls12_381_pairing_equality, do_db_read, do_db_remove, do_db_write, do_debug, do_ed25519_batch_verify, do_ed25519_verify, do_query_chain, do_secp256k1_recover_pubkey, do_secp256k1_verify, do_secp256r1_recover_pubkey, do_secp256r1_verify, }; @@ -164,8 +164,8 @@ where // Returns a single u32 which signifies the validity of the pairing equality. // Returns 0 if the pairing equality exists, 1 if it doesnt, and any other code may be interpreted as a `CryptoError`. env_imports.insert( - "bls12_381_aggregate_pairing_equality", - Function::new_typed_with_env(&mut store, &fe, do_bls12_381_aggregate_pairing_equality), + "bls12_381_pairing_equality", + Function::new_typed_with_env(&mut store, &fe, do_bls12_381_pairing_equality), ); // Three parameters, "hash_function" and "msg" and "dst", are passed down which are both arbitrary octet strings. From 3597b1456e50a8c3d72613d57813279f16e3faed Mon Sep 17 00:00:00 2001 From: Simon Warta Date: Thu, 2 May 2024 08:59:59 +0200 Subject: [PATCH 57/79] Feature-gate imports --- packages/std/src/imports.rs | 9 +++------ 1 file changed, 3 insertions(+), 6 deletions(-) diff --git a/packages/std/src/imports.rs b/packages/std/src/imports.rs index 1cb1219bac..0c19a8bf35 100644 --- a/packages/std/src/imports.rs +++ b/packages/std/src/imports.rs @@ -9,17 +9,14 @@ use crate::sections::decode_sections2; use crate::sections::encode_sections; use crate::serde::from_json; use crate::traits::{Api, Querier, QuerierResult, Storage}; -#[cfg(feature = "cosmwasm_2_1")] -use crate::HashFunction; #[cfg(feature = "iterator")] use crate::{ iterator::{Order, Record}, memory::get_optional_region_address, }; -use crate::{ - AggregationError, PairingEqualityError, RecoverPubkeyError, StdError, StdResult, SystemError, - VerificationError, -}; +#[cfg(feature = "cosmwasm_2_1")] +use crate::{AggregationError, HashFunction, PairingEqualityError}; +use crate::{RecoverPubkeyError, StdError, StdResult, SystemError, VerificationError}; /// An upper bound for typical canonical address lengths (e.g. 20 in Cosmos SDK/Ethereum or 32 in Nano/Substrate) const CANONICAL_ADDRESS_BUFFER_LENGTH: usize = 64; From 120c83b15798516e48999754981bef634c02ec69 Mon Sep 17 00:00:00 2001 From: Simon Warta Date: Thu, 2 May 2024 09:26:45 +0200 Subject: [PATCH 58/79] Add bls12_381_pairing_equality docs --- packages/std/src/traits.rs | 26 ++++++++++++++++++++++++++ 1 file changed, 26 insertions(+) diff --git a/packages/std/src/traits.rs b/packages/std/src/traits.rs index 16661251cf..038f17f994 100644 --- a/packages/std/src/traits.rs +++ b/packages/std/src/traits.rs @@ -197,6 +197,32 @@ pub trait Api { unimplemented!() } + /// Checks the following pairing equality: + /// + /// e(p_1, q_1) × e(p_2, q_2) × … × e(p_n, q_n) = e(s, q) + /// + /// The argument `ps` contain the points p_1, ..., p_n ∈ G1 as a concatenation of 48 byte elements. + /// The argument `qs` contain the points q_1, ..., q_n ∈ G2 as a concatenation of 96 byte elements. + /// + /// ## Examples + /// + /// A simple signature check with one pairing on the left hand side (e(p, q) = e(s, q)): + /// + /// ``` + /// # use cosmwasm_std::{Api, HashFunction, StdResult}; + /// pub fn verify( + /// api: &dyn Api, + /// g1_generator: &[u8], + /// signature: &[u8], + /// pubkey: &[u8], + /// msg: &[u8], + /// dst: &[u8], + /// ) -> StdResult { + /// let msg_hashed = api.bls12_381_hash_to_g2(HashFunction::Sha256, msg, dst)?; + /// api.bls12_381_pairing_equality(g1_generator, signature, pubkey, &msg_hashed) + /// .map_err(Into::into) + /// } + /// ``` #[allow(unused_variables)] fn bls12_381_pairing_equality( &self, From ceb3aa70c073b3379d3d3e58af38f9955d5e5508 Mon Sep 17 00:00:00 2001 From: Aumetra Weisman Date: Thu, 2 May 2024 11:45:52 +0200 Subject: [PATCH 59/79] Fix contract tests --- contracts/crypto-verify/tests/integration.rs | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/contracts/crypto-verify/tests/integration.rs b/contracts/crypto-verify/tests/integration.rs index e57770be47..db3a2dfd93 100644 --- a/contracts/crypto-verify/tests/integration.rs +++ b/contracts/crypto-verify/tests/integration.rs @@ -116,7 +116,7 @@ fn bls12_381_verifies() { let signature = hex::decode("82f5d3d2de4db19d40a6980e8aa37842a0e55d1df06bd68bddc8d60002e8e959eb9cfa368b3c1b77d18f02a54fe047b80f0989315f83b12a74fd8679c4f12aae86eaf6ab5690b34f1fddd50ee3cc6f6cdf59e95526d5a5d82aaa84fa6f181e42").unwrap(); let round: u64 = 72785; - let msg = build_bls_message(round, &previous_signature); + let msg = build_drand_message(round, &previous_signature); let mut serialized = [0; 48]; G1Affine::generator() @@ -147,7 +147,7 @@ fn bls12_381_errors() { previous_signature[0] ^= 0x3; - let msg = build_bls_message(round, &previous_signature); + let msg = build_drand_message(round, &previous_signature); let mut serialized = [0; 48]; G1Affine::generator() From d044e830dd818f8028d2e1442e0854a0b8eb67ec Mon Sep 17 00:00:00 2001 From: Aumetra Weisman Date: Thu, 2 May 2024 12:01:21 +0200 Subject: [PATCH 60/79] Export constants --- contracts/crypto-verify/Cargo.lock | 2 - contracts/crypto-verify/Cargo.toml | 2 - contracts/crypto-verify/tests/integration.rs | 19 ++------ packages/crypto/benches/main.rs | 12 ++--- packages/crypto/src/bls12_318/constants.rs | 50 ++++++++++---------- packages/crypto/src/bls12_318/mod.rs | 14 +++++- packages/crypto/src/lib.rs | 8 ++-- packages/crypto/tests/bls12_381.rs | 12 ++--- packages/std/src/lib.rs | 2 + packages/std/src/testing/mock.rs | 12 +++-- 10 files changed, 68 insertions(+), 65 deletions(-) diff --git a/contracts/crypto-verify/Cargo.lock b/contracts/crypto-verify/Cargo.lock index 96c230504c..3d067dd11a 100644 --- a/contracts/crypto-verify/Cargo.lock +++ b/contracts/crypto-verify/Cargo.lock @@ -603,8 +603,6 @@ name = "crypto-verify" version = "0.0.0" dependencies = [ "ark-bls12-381", - "ark-ec", - "ark-serialize", "base64", "cosmwasm-schema", "cosmwasm-std", diff --git a/contracts/crypto-verify/Cargo.toml b/contracts/crypto-verify/Cargo.toml index fb590694ea..191c02327d 100644 --- a/contracts/crypto-verify/Cargo.toml +++ b/contracts/crypto-verify/Cargo.toml @@ -42,7 +42,5 @@ sha2 = "0.10" sha3 = "0.10" [dev-dependencies] -ark-ec = "0.4.2" -ark-serialize = { version = "0.4.2", default-features = false } cosmwasm-vm = { path = "../../packages/vm", default-features = false, features = ["iterator"] } hex-literal = "0.4.1" diff --git a/contracts/crypto-verify/tests/integration.rs b/contracts/crypto-verify/tests/integration.rs index db3a2dfd93..711bd89800 100644 --- a/contracts/crypto-verify/tests/integration.rs +++ b/contracts/crypto-verify/tests/integration.rs @@ -19,10 +19,7 @@ //! 5. Anywhere you see query(deps.as_ref(), ...) you must replace it with query(&mut deps, ...) //! (Use cosmwasm_vm::testing::{init, execute, query}, instead of the contract variants). -use ark_bls12_381::G1Affine; -use ark_ec::AffineRepr; -use ark_serialize::CanonicalSerialize; -use cosmwasm_std::{Binary, Response, Uint128}; +use cosmwasm_std::{Binary, Response, Uint128, BLS12_381_G1_GENERATOR_COMPRESSED}; use cosmwasm_vm::testing::{ instantiate, mock_env, mock_info, mock_instance, query, MockApi, MockQuerier, MockStorage, }; @@ -118,13 +115,8 @@ fn bls12_381_verifies() { let msg = build_drand_message(round, &previous_signature); - let mut serialized = [0; 48]; - G1Affine::generator() - .serialize_compressed(&mut serialized[..]) - .unwrap(); - let verify_msg = QueryMsg::VerifyBls12PairingEquality { - p: serialized.into(), + p: BLS12_381_G1_GENERATOR_COMPRESSED.into(), q: signature.into(), r: PK_LEO_MAINNET.into(), msg: msg.into(), @@ -149,13 +141,8 @@ fn bls12_381_errors() { let msg = build_drand_message(round, &previous_signature); - let mut serialized = [0; 48]; - G1Affine::generator() - .serialize_compressed(&mut serialized[..]) - .unwrap(); - let verify_msg = QueryMsg::VerifyBls12PairingEquality { - p: serialized.into(), + p: BLS12_381_G1_GENERATOR_COMPRESSED.into(), q: signature.into(), r: PK_LEO_MAINNET.into(), msg: msg.into(), diff --git a/packages/crypto/benches/main.rs b/packages/crypto/benches/main.rs index 2e78e05b0a..40c04b5705 100644 --- a/packages/crypto/benches/main.rs +++ b/packages/crypto/benches/main.rs @@ -16,10 +16,10 @@ use k256::ecdsa::SigningKey; // type alias use sha2::Sha256; use cosmwasm_crypto::{ - bls12_381_aggregate_g1, bls12_381_aggregate_g2, bls12_381_g1_generator, bls12_381_hash_to_g1, - bls12_381_hash_to_g2, bls12_381_pairing_equality, ed25519_batch_verify, ed25519_verify, - secp256k1_recover_pubkey, secp256k1_verify, secp256r1_recover_pubkey, secp256r1_verify, - HashFunction, BLS12_381_G1_POINT_LEN, BLS12_381_G2_POINT_LEN, + bls12_381_aggregate_g1, bls12_381_aggregate_g2, bls12_381_hash_to_g1, bls12_381_hash_to_g2, + bls12_381_pairing_equality, ed25519_batch_verify, ed25519_verify, secp256k1_recover_pubkey, + secp256k1_verify, secp256r1_recover_pubkey, secp256r1_verify, HashFunction, + BLS12_381_G1_GENERATOR_COMPRESSED, BLS12_381_G1_POINT_LEN, BLS12_381_G2_POINT_LEN, }; use std::cmp::min; @@ -192,7 +192,7 @@ where let is_valid = black_box(bls12_381_pairing_equality( &serialized_pubkeys, &serialized_messages, - &bls12_381_g1_generator(), + &BLS12_381_G1_GENERATOR_COMPRESSED, &serialized_signature, )) .unwrap(); @@ -224,7 +224,7 @@ where }); group.bench_function("bls12_381_verify", |b| { - let generator = bls12_381_g1_generator(); + let generator = BLS12_381_G1_GENERATOR_COMPRESSED; let message = bls12_381_hash_to_g2(HashFunction::Sha256, &BLS_MESSAGE, BLS_DST); b.iter(|| { diff --git a/packages/crypto/src/bls12_318/constants.rs b/packages/crypto/src/bls12_318/constants.rs index 224e9d530a..382187384f 100644 --- a/packages/crypto/src/bls12_318/constants.rs +++ b/packages/crypto/src/bls12_318/constants.rs @@ -1,38 +1,39 @@ -use ark_bls12_381::{G1Affine, G2Affine}; -use ark_ec::AffineRepr; -use ark_serialize::CanonicalSerialize; - -use crate::{BLS12_381_G1_POINT_LEN, BLS12_381_G2_POINT_LEN}; - -pub fn bls12_381_g1_generator() -> [u8; BLS12_381_G1_POINT_LEN] { - let mut point = [0_u8; BLS12_381_G1_POINT_LEN]; - G1Affine::generator() - .serialize_compressed(&mut point[..]) - .unwrap(); +#[cfg(test)] +mod test { + use ark_bls12_381::{G1Affine, G2Affine}; + use ark_ec::AffineRepr; + use ark_serialize::CanonicalSerialize; + use hex_literal::hex; - point -} + use crate::{ + bls12_318::{BLS12_381_G1_GENERATOR_COMPRESSED, BLS12_381_G2_GENERATOR_COMPRESSED}, + BLS12_381_G1_POINT_LEN, BLS12_381_G2_POINT_LEN, + }; -pub fn bls12_381_g2_generator() -> [u8; BLS12_381_G2_POINT_LEN] { - let mut point = [0_u8; BLS12_381_G2_POINT_LEN]; - G2Affine::generator() - .serialize_compressed(&mut point[..]) - .unwrap(); + fn bls12_381_g1_generator() -> [u8; BLS12_381_G1_POINT_LEN] { + let mut point = [0_u8; BLS12_381_G1_POINT_LEN]; + G1Affine::generator() + .serialize_compressed(&mut point[..]) + .unwrap(); - point -} + point + } -#[cfg(test)] -mod test { - use hex_literal::hex; + fn bls12_381_g2_generator() -> [u8; BLS12_381_G2_POINT_LEN] { + let mut point = [0_u8; BLS12_381_G2_POINT_LEN]; + G2Affine::generator() + .serialize_compressed(&mut point[..]) + .unwrap(); - use crate::{bls12_381_g1_generator, bls12_381_g2_generator}; + point + } #[test] fn g1_generator_correct() { let mut generator = hex!("17f1d3a73197d7942695638c4fa9ac0fc3688c4f9774b905a14e3a3f171bac586c55e83ff97a1aeffb3af00adb22c6bb"); generator[0] |= 0b1000_0000; assert_eq!(generator, bls12_381_g1_generator()); + assert_eq!(bls12_381_g1_generator(), BLS12_381_G1_GENERATOR_COMPRESSED); } #[test] @@ -40,5 +41,6 @@ mod test { let mut generator = hex!("13e02b6052719f607dacd3a088274f65596bd0d09920b61ab5da61bbdc7f5049334cf11213945d57e5ac7d055d042b7e024aa2b2f08f0a91260805272dc51051c6e47ad4fa403b02b4510b647ae3d1770bac0326a805bbefd48056c8c121bdb8"); generator[0] |= 0b1000_0000; assert_eq!(generator, bls12_381_g2_generator()); + assert_eq!(bls12_381_g2_generator(), BLS12_381_G2_GENERATOR_COMPRESSED); } } diff --git a/packages/crypto/src/bls12_318/mod.rs b/packages/crypto/src/bls12_318/mod.rs index 9a171d84e3..f9abfa2068 100644 --- a/packages/crypto/src/bls12_318/mod.rs +++ b/packages/crypto/src/bls12_318/mod.rs @@ -5,10 +5,22 @@ mod pairing; mod points; pub use aggregate::{bls12_381_aggregate_g1, bls12_381_aggregate_g2}; -pub use constants::{bls12_381_g1_generator, bls12_381_g2_generator}; pub use hash::{bls12_381_hash_to_g1, bls12_381_hash_to_g2, HashFunction}; pub use pairing::bls12_381_pairing_equality; pub use points::{bls12_381_g1_is_identity, bls12_381_g2_is_identity}; pub const BLS12_381_G1_POINT_LEN: usize = 48; pub const BLS12_381_G2_POINT_LEN: usize = 96; + +pub const BLS12_381_G1_GENERATOR_COMPRESSED: [u8; BLS12_381_G1_POINT_LEN] = [ + 151, 241, 211, 167, 49, 151, 215, 148, 38, 149, 99, 140, 79, 169, 172, 15, 195, 104, 140, 79, + 151, 116, 185, 5, 161, 78, 58, 63, 23, 27, 172, 88, 108, 85, 232, 63, 249, 122, 26, 239, 251, + 58, 240, 10, 219, 34, 198, 187, +]; +pub const BLS12_381_G2_GENERATOR_COMPRESSED: [u8; BLS12_381_G2_POINT_LEN] = [ + 147, 224, 43, 96, 82, 113, 159, 96, 125, 172, 211, 160, 136, 39, 79, 101, 89, 107, 208, 208, + 153, 32, 182, 26, 181, 218, 97, 187, 220, 127, 80, 73, 51, 76, 241, 18, 19, 148, 93, 87, 229, + 172, 125, 5, 93, 4, 43, 126, 2, 74, 162, 178, 240, 143, 10, 145, 38, 8, 5, 39, 45, 197, 16, 81, + 198, 228, 122, 212, 250, 64, 59, 2, 180, 81, 11, 100, 122, 227, 209, 119, 11, 172, 3, 38, 168, + 5, 187, 239, 212, 128, 86, 200, 193, 33, 189, 184, +]; diff --git a/packages/crypto/src/lib.rs b/packages/crypto/src/lib.rs index af83f14e39..55b241bde9 100644 --- a/packages/crypto/src/lib.rs +++ b/packages/crypto/src/lib.rs @@ -23,10 +23,10 @@ mod secp256r1; #[cfg(feature = "std")] #[doc(hidden)] pub use crate::bls12_318::{ - bls12_381_aggregate_g1, bls12_381_aggregate_g2, bls12_381_g1_generator, - bls12_381_g1_is_identity, bls12_381_g2_generator, bls12_381_g2_is_identity, - bls12_381_hash_to_g1, bls12_381_hash_to_g2, bls12_381_pairing_equality, HashFunction, - BLS12_381_G1_POINT_LEN, BLS12_381_G2_POINT_LEN, + bls12_381_aggregate_g1, bls12_381_aggregate_g2, bls12_381_g1_is_identity, + bls12_381_g2_is_identity, bls12_381_hash_to_g1, bls12_381_hash_to_g2, + bls12_381_pairing_equality, HashFunction, BLS12_381_G1_GENERATOR_COMPRESSED, + BLS12_381_G1_POINT_LEN, BLS12_381_G2_GENERATOR_COMPRESSED, BLS12_381_G2_POINT_LEN, }; #[doc(hidden)] pub use crate::ecdsa::{ECDSA_PUBKEY_MAX_LEN, ECDSA_SIGNATURE_LEN, MESSAGE_HASH_MAX_LEN}; diff --git a/packages/crypto/tests/bls12_381.rs b/packages/crypto/tests/bls12_381.rs index 8950782ef2..dce3382eae 100644 --- a/packages/crypto/tests/bls12_381.rs +++ b/packages/crypto/tests/bls12_381.rs @@ -6,9 +6,9 @@ use ark_serialize::{CanonicalDeserialize, CanonicalSerialize}; use base64::engine::general_purpose::STANDARD; use base64_serde::base64_serde_type; use cosmwasm_crypto::{ - bls12_381_aggregate_g1, bls12_381_aggregate_g2, bls12_381_g1_generator, - bls12_381_g1_is_identity, bls12_381_g2_is_identity, bls12_381_hash_to_g2, - bls12_381_pairing_equality, HashFunction, BLS12_381_G2_POINT_LEN, + bls12_381_aggregate_g1, bls12_381_aggregate_g2, bls12_381_g1_is_identity, + bls12_381_g2_is_identity, bls12_381_hash_to_g2, bls12_381_pairing_equality, HashFunction, + BLS12_381_G1_GENERATOR_COMPRESSED, BLS12_381_G2_POINT_LEN, }; const PROOF_OF_POSSESSION_DST: &[u8] = b"BLS_SIG_BLS12381G2_XMD:SHA-256_SSWU_RO_POP_"; @@ -261,7 +261,7 @@ fn bls12_381_verify_works() { let bool_result = bls12_381_pairing_equality( &pubkey, &message_point, - &bls12_381_g1_generator(), + &BLS12_381_G1_GENERATOR_COMPRESSED, &signature, )?; @@ -337,7 +337,7 @@ fn bls12_381_aggregate_verify_works() { let bool_result = bls12_381_pairing_equality( &pubkeys, &messages, - &bls12_381_g1_generator(), + &BLS12_381_G1_GENERATOR_COMPRESSED, &signature, )?; @@ -412,7 +412,7 @@ fn bls12_381_fast_aggregate_verify_works() { let bool_result = bls12_381_pairing_equality( &pubkey, &message_point, - &bls12_381_g1_generator(), + &BLS12_381_G1_GENERATOR_COMPRESSED, &signature, )?; diff --git a/packages/std/src/lib.rs b/packages/std/src/lib.rs index b671c60474..c71843dc97 100644 --- a/packages/std/src/lib.rs +++ b/packages/std/src/lib.rs @@ -122,4 +122,6 @@ pub use cosmwasm_core::{ #[cfg(not(target_arch = "wasm32"))] pub use cosmwasm_core::assert_approx_eq; +pub use cosmwasm_crypto::{BLS12_381_G1_GENERATOR_COMPRESSED, BLS12_381_G2_GENERATOR_COMPRESSED}; + pub use cosmwasm_derive::entry_point; diff --git a/packages/std/src/testing/mock.rs b/packages/std/src/testing/mock.rs index 8784a8e8da..3bebd24bb5 100644 --- a/packages/std/src/testing/mock.rs +++ b/packages/std/src/testing/mock.rs @@ -1168,6 +1168,7 @@ mod tests { #[cfg(feature = "staking")] use crate::{Decimal, Delegation}; use base64::{engine::general_purpose, Engine}; + use cosmwasm_crypto::BLS12_381_G1_GENERATOR_COMPRESSED; use hex_literal::hex; use serde::Deserialize; @@ -1361,7 +1362,6 @@ mod tests { let api = MockApi::default(); let dst = b"BLS_SIG_BLS12381G2_XMD:SHA-256_SSWU_RO_POP_"; - let g1_generator = cosmwasm_crypto::bls12_381_g1_generator(); let ps = hex!("a491d1b0ecd9bb917989f0e74f0dea0422eac4a873e5e2644f368dffb9a6e20fd6e10c1b77654d067c0618f6e5a7f79ab301803f8b5ac4a1133581fc676dfedc60d891dd5fa99028805e5ea5b08d3491af75d0707adab3b70c6a6a580217bf81b53d21a4cfd562c469cc81514d4ce5a6b577d8403d32a394dc265dd190b47fa9f829fdd7963afdf972e5e77854051f6f"); let qs: Vec = [ hex!("0000000000000000000000000000000000000000000000000000000000000000"), @@ -1377,7 +1377,7 @@ mod tests { let s = hex!("9104e74b9dfd3ad502f25d6a5ef57db0ed7d9a0e00f3500586d8ce44231212542fcfaf87840539b398bf07626705cf1105d246ca1062c6c2e1a53029a0f790ed5e3cb1f52f8234dc5144c45fc847c0cd37a92d68e7c5ba7c648a8a339f171244"); let is_valid = api - .bls12_381_pairing_equality(&ps, &qs, &g1_generator, &s) + .bls12_381_pairing_equality(&ps, &qs, &BLS12_381_G1_GENERATOR_COMPRESSED, &s) .unwrap(); assert!(is_valid); } @@ -1437,9 +1437,13 @@ mod tests { .bls12_381_hash_to_g2(HashFunction::Sha256, &msg, DOMAIN_HASH_TO_G2) .unwrap(); - let g1_generator = cosmwasm_crypto::bls12_381_g1_generator(); let is_valid = api - .bls12_381_pairing_equality(&g1_generator, &signature, &PK_LEO_MAINNET, &msg_point) + .bls12_381_pairing_equality( + &BLS12_381_G1_GENERATOR_COMPRESSED, + &signature, + &PK_LEO_MAINNET, + &msg_point, + ) .unwrap(); assert!(is_valid); From 04fa77ebe712524c4003f49b22f2406d6e6c8286 Mon Sep 17 00:00:00 2001 From: Aumetra Weisman Date: Thu, 2 May 2024 12:43:17 +0200 Subject: [PATCH 61/79] Add `.unwrap()` disclaimer --- packages/crypto/src/bls12_318/hash.rs | 20 ++++++++++++++++++++ packages/std/Cargo.toml | 1 + 2 files changed, 21 insertions(+) diff --git a/packages/crypto/src/bls12_318/hash.rs b/packages/crypto/src/bls12_318/hash.rs index 32f09f2a76..eb1d228121 100644 --- a/packages/crypto/src/bls12_318/hash.rs +++ b/packages/crypto/src/bls12_318/hash.rs @@ -1,3 +1,23 @@ +//! +//! Note about the usage of `.unwrap()` here: +//! +//! Since the underlying curve implementation, when implemented sanely, should never request 255 curve elements at the same time, +//! the expansion will always finish without exiting with an error (since that is the only "ABORT" condition). +//! +//! Therefore we can conclude, if the implementation is done as defined in the IETF publication, won't ever error out. +//! +//! IETF doc in question: +//! +//! In addition to that I (@aumetra) skimmed through the tree of traits making up our hash-to-curve configuration, +//! and I have not found a condition where an error is returned. +//! +//! ark crate versions that I looked at: +//! +//! - ark-bls12-381 v0.4.0 +//! - ark-ec v0.4.2 +//! - ark-ff v0.4.2 +//! + use ark_bls12_381::{g1, g2}; use ark_ec::{ hashing::{ diff --git a/packages/std/Cargo.toml b/packages/std/Cargo.toml index 3ade83c0a4..2e5704a371 100644 --- a/packages/std/Cargo.toml +++ b/packages/std/Cargo.toml @@ -59,6 +59,7 @@ cosmwasm_2_1 = ["cosmwasm_2_0"] base64 = "0.22.0" cosmwasm-derive = { version = "2.0.1", path = "../derive" } cosmwasm-core = { path = "../core", version = "2.0.1", features = ["std"] } +cosmwasm-crypto = { version = "2.0.1", path = "../crypto" } derive_more = { version = "1.0.0-beta.6", default-features = false, features = ["debug"] } hex = "0.4" schemars = { workspace = true } From 5b3cd75ee33119845731e8f81c571649ac58acd1 Mon Sep 17 00:00:00 2001 From: Aumetra Weisman Date: Thu, 2 May 2024 12:50:59 +0200 Subject: [PATCH 62/79] Fix compile-error on WASM --- Cargo.lock | 1 + packages/crypto/Cargo.toml | 1 + packages/crypto/src/bls12_318/hash.rs | 12 ++++++------ packages/crypto/src/bls12_318/mod.rs | 22 +++++++++++++--------- packages/crypto/src/lib.rs | 10 +++++++--- 5 files changed, 28 insertions(+), 18 deletions(-) diff --git a/Cargo.lock b/Cargo.lock index b7a23df2f4..364bb2a743 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -581,6 +581,7 @@ dependencies = [ "ark-serialize", "base64 0.22.0", "base64-serde", + "cfg-if", "criterion", "derive_more", "digest", diff --git a/packages/crypto/Cargo.toml b/packages/crypto/Cargo.toml index a8ae36b5ad..1edfbb072e 100644 --- a/packages/crypto/Cargo.toml +++ b/packages/crypto/Cargo.toml @@ -29,6 +29,7 @@ ark-bls12-381 = { version = "0.4.0", optional = true } ark-ec = { version = "0.4.2", features = ["parallel"], optional = true } ark-ff = { version = "0.4.2", features = ["asm", "parallel"], optional = true } ark-serialize = { version = "0.4.2", optional = true } +cfg-if = "1.0.0" derive_more = { version = "1.0.0-beta.6", default-features = false, features = ["display", "from"] } digest = "0.10" ecdsa = "0.16.2" # Not used directly, but needed to bump transitive dependency, see: https://github.com/CosmWasm/cosmwasm/pull/1899 for details. diff --git a/packages/crypto/src/bls12_318/hash.rs b/packages/crypto/src/bls12_318/hash.rs index eb1d228121..04e9fafee2 100644 --- a/packages/crypto/src/bls12_318/hash.rs +++ b/packages/crypto/src/bls12_318/hash.rs @@ -1,22 +1,22 @@ //! //! Note about the usage of `.unwrap()` here: -//! +//! //! Since the underlying curve implementation, when implemented sanely, should never request 255 curve elements at the same time, //! the expansion will always finish without exiting with an error (since that is the only "ABORT" condition). //! //! Therefore we can conclude, if the implementation is done as defined in the IETF publication, won't ever error out. -//! +//! //! IETF doc in question: -//! +//! //! In addition to that I (@aumetra) skimmed through the tree of traits making up our hash-to-curve configuration, //! and I have not found a condition where an error is returned. -//! +//! //! ark crate versions that I looked at: -//! +//! //! - ark-bls12-381 v0.4.0 //! - ark-ec v0.4.2 //! - ark-ff v0.4.2 -//! +//! use ark_bls12_381::{g1, g2}; use ark_ec::{ diff --git a/packages/crypto/src/bls12_318/mod.rs b/packages/crypto/src/bls12_318/mod.rs index f9abfa2068..e74bb38cbf 100644 --- a/packages/crypto/src/bls12_318/mod.rs +++ b/packages/crypto/src/bls12_318/mod.rs @@ -1,13 +1,17 @@ -mod aggregate; -mod constants; -mod hash; -mod pairing; -mod points; +cfg_if::cfg_if! { + if #[cfg(feature = "std")] { + mod aggregate; + mod constants; + mod hash; + mod pairing; + mod points; -pub use aggregate::{bls12_381_aggregate_g1, bls12_381_aggregate_g2}; -pub use hash::{bls12_381_hash_to_g1, bls12_381_hash_to_g2, HashFunction}; -pub use pairing::bls12_381_pairing_equality; -pub use points::{bls12_381_g1_is_identity, bls12_381_g2_is_identity}; + pub use self::aggregate::{bls12_381_aggregate_g1, bls12_381_aggregate_g2}; + pub use self::hash::{bls12_381_hash_to_g1, bls12_381_hash_to_g2, HashFunction}; + pub use self::pairing::bls12_381_pairing_equality; + pub use self::points::{bls12_381_g1_is_identity, bls12_381_g2_is_identity}; + } +} pub const BLS12_381_G1_POINT_LEN: usize = 48; pub const BLS12_381_G2_POINT_LEN: usize = 96; diff --git a/packages/crypto/src/lib.rs b/packages/crypto/src/lib.rs index 55b241bde9..b1a5489229 100644 --- a/packages/crypto/src/lib.rs +++ b/packages/crypto/src/lib.rs @@ -11,7 +11,6 @@ extern crate alloc; extern crate std; // allow for file I/O during tests mod backtrace; -#[cfg(feature = "std")] mod bls12_318; mod ecdsa; mod ed25519; @@ -25,8 +24,13 @@ mod secp256r1; pub use crate::bls12_318::{ bls12_381_aggregate_g1, bls12_381_aggregate_g2, bls12_381_g1_is_identity, bls12_381_g2_is_identity, bls12_381_hash_to_g1, bls12_381_hash_to_g2, - bls12_381_pairing_equality, HashFunction, BLS12_381_G1_GENERATOR_COMPRESSED, - BLS12_381_G1_POINT_LEN, BLS12_381_G2_GENERATOR_COMPRESSED, BLS12_381_G2_POINT_LEN, + bls12_381_pairing_equality, HashFunction, +}; + +#[doc(hidden)] +pub use crate::bls12_318::{ + BLS12_381_G1_GENERATOR_COMPRESSED, BLS12_381_G1_POINT_LEN, BLS12_381_G2_GENERATOR_COMPRESSED, + BLS12_381_G2_POINT_LEN, }; #[doc(hidden)] pub use crate::ecdsa::{ECDSA_PUBKEY_MAX_LEN, ECDSA_SIGNATURE_LEN, MESSAGE_HASH_MAX_LEN}; From 902f399fa88981be29b15fb744d24ad88bb16bd9 Mon Sep 17 00:00:00 2001 From: Aumetra Weisman Date: Thu, 2 May 2024 13:10:54 +0200 Subject: [PATCH 63/79] Update lockfiles --- contracts/burner/Cargo.lock | 1 + contracts/crypto-verify/Cargo.lock | 1 + contracts/cyberpunk/Cargo.lock | 1 + contracts/empty/Cargo.lock | 1 + contracts/floaty/Cargo.lock | 1 + contracts/hackatom/Cargo.lock | 1 + contracts/ibc-reflect-send/Cargo.lock | 1 + contracts/ibc-reflect/Cargo.lock | 1 + contracts/queue/Cargo.lock | 1 + contracts/reflect/Cargo.lock | 1 + contracts/staking/Cargo.lock | 1 + contracts/virus/Cargo.lock | 1 + 12 files changed, 12 insertions(+) diff --git a/contracts/burner/Cargo.lock b/contracts/burner/Cargo.lock index c0f8aeb4a2..6cc04a7fc0 100644 --- a/contracts/burner/Cargo.lock +++ b/contracts/burner/Cargo.lock @@ -351,6 +351,7 @@ dependencies = [ "ark-ec", "ark-ff", "ark-serialize", + "cfg-if", "derive_more", "digest", "ecdsa", diff --git a/contracts/crypto-verify/Cargo.lock b/contracts/crypto-verify/Cargo.lock index 3d067dd11a..e6d0650abb 100644 --- a/contracts/crypto-verify/Cargo.lock +++ b/contracts/crypto-verify/Cargo.lock @@ -346,6 +346,7 @@ dependencies = [ "ark-ec", "ark-ff", "ark-serialize", + "cfg-if", "derive_more", "digest", "ecdsa", diff --git a/contracts/cyberpunk/Cargo.lock b/contracts/cyberpunk/Cargo.lock index c255c19a22..9a0da287bc 100644 --- a/contracts/cyberpunk/Cargo.lock +++ b/contracts/cyberpunk/Cargo.lock @@ -369,6 +369,7 @@ dependencies = [ "ark-ec", "ark-ff", "ark-serialize", + "cfg-if", "derive_more", "digest", "ecdsa", diff --git a/contracts/empty/Cargo.lock b/contracts/empty/Cargo.lock index 025932dd23..359bc8fb7c 100644 --- a/contracts/empty/Cargo.lock +++ b/contracts/empty/Cargo.lock @@ -340,6 +340,7 @@ dependencies = [ "ark-ec", "ark-ff", "ark-serialize", + "cfg-if", "derive_more", "digest", "ecdsa", diff --git a/contracts/floaty/Cargo.lock b/contracts/floaty/Cargo.lock index 549f88a7a4..6ad92b1e4f 100644 --- a/contracts/floaty/Cargo.lock +++ b/contracts/floaty/Cargo.lock @@ -340,6 +340,7 @@ dependencies = [ "ark-ec", "ark-ff", "ark-serialize", + "cfg-if", "derive_more", "digest", "ecdsa", diff --git a/contracts/hackatom/Cargo.lock b/contracts/hackatom/Cargo.lock index cceb6c7b35..b39d508281 100644 --- a/contracts/hackatom/Cargo.lock +++ b/contracts/hackatom/Cargo.lock @@ -340,6 +340,7 @@ dependencies = [ "ark-ec", "ark-ff", "ark-serialize", + "cfg-if", "derive_more", "digest", "ecdsa", diff --git a/contracts/ibc-reflect-send/Cargo.lock b/contracts/ibc-reflect-send/Cargo.lock index 6cc18ef2f0..5c24b52a23 100644 --- a/contracts/ibc-reflect-send/Cargo.lock +++ b/contracts/ibc-reflect-send/Cargo.lock @@ -340,6 +340,7 @@ dependencies = [ "ark-ec", "ark-ff", "ark-serialize", + "cfg-if", "derive_more", "digest", "ecdsa", diff --git a/contracts/ibc-reflect/Cargo.lock b/contracts/ibc-reflect/Cargo.lock index 8e973b6452..a272c6a4fd 100644 --- a/contracts/ibc-reflect/Cargo.lock +++ b/contracts/ibc-reflect/Cargo.lock @@ -340,6 +340,7 @@ dependencies = [ "ark-ec", "ark-ff", "ark-serialize", + "cfg-if", "derive_more", "digest", "ecdsa", diff --git a/contracts/queue/Cargo.lock b/contracts/queue/Cargo.lock index b3a7f92cda..57fabaa518 100644 --- a/contracts/queue/Cargo.lock +++ b/contracts/queue/Cargo.lock @@ -340,6 +340,7 @@ dependencies = [ "ark-ec", "ark-ff", "ark-serialize", + "cfg-if", "derive_more", "digest", "ecdsa", diff --git a/contracts/reflect/Cargo.lock b/contracts/reflect/Cargo.lock index 84c68e6f5a..0764b4cd14 100644 --- a/contracts/reflect/Cargo.lock +++ b/contracts/reflect/Cargo.lock @@ -340,6 +340,7 @@ dependencies = [ "ark-ec", "ark-ff", "ark-serialize", + "cfg-if", "derive_more", "digest", "ecdsa", diff --git a/contracts/staking/Cargo.lock b/contracts/staking/Cargo.lock index 9e6b449e63..15c5d6a243 100644 --- a/contracts/staking/Cargo.lock +++ b/contracts/staking/Cargo.lock @@ -340,6 +340,7 @@ dependencies = [ "ark-ec", "ark-ff", "ark-serialize", + "cfg-if", "derive_more", "digest", "ecdsa", diff --git a/contracts/virus/Cargo.lock b/contracts/virus/Cargo.lock index 025cc3de5e..9a60df1cd5 100644 --- a/contracts/virus/Cargo.lock +++ b/contracts/virus/Cargo.lock @@ -340,6 +340,7 @@ dependencies = [ "ark-ec", "ark-ff", "ark-serialize", + "cfg-if", "derive_more", "digest", "ecdsa", From 97cfbbbaf5800d90078a94f30e45e6a83e070eeb Mon Sep 17 00:00:00 2001 From: Aumetra Weisman Date: Thu, 2 May 2024 13:44:19 +0200 Subject: [PATCH 64/79] Refactor contract tests --- .../crypto-verify/schema/crypto-verify.json | 85 ++++++++++++++++--- contracts/crypto-verify/schema/raw/query.json | 69 ++++++++++++--- ...e_to_verify_bls12_pairing_equality_g1.json | 14 +++ ...e_to_verify_bls12_pairing_equality_g2.json | 14 +++ contracts/crypto-verify/src/bls12_381.rs | 26 ++++-- contracts/crypto-verify/src/contract.rs | 39 +++++++-- contracts/crypto-verify/src/msg.rs | 26 ++++-- contracts/crypto-verify/tests/integration.rs | 44 +++++++--- 8 files changed, 260 insertions(+), 57 deletions(-) create mode 100644 contracts/crypto-verify/schema/raw/response_to_verify_bls12_pairing_equality_g1.json create mode 100644 contracts/crypto-verify/schema/raw/response_to_verify_bls12_pairing_equality_g2.json diff --git a/contracts/crypto-verify/schema/crypto-verify.json b/contracts/crypto-verify/schema/crypto-verify.json index 99aec94e80..728ed09898 100644 --- a/contracts/crypto-verify/schema/crypto-verify.json +++ b/contracts/crypto-verify/schema/crypto-verify.json @@ -388,20 +388,19 @@ "additionalProperties": false }, { - "description": "BLS12-381 pairing equality verification", + "description": "BLS12-381 pairing equality verification (where the key is an element of G1)", "type": "object", "required": [ - "verify_bls12_pairing_equality" + "verify_bls12_pairing_equality_g1" ], "properties": { - "verify_bls12_pairing_equality": { + "verify_bls12_pairing_equality_g1": { "type": "object", "required": [ "dst", "msg", - "p", - "q", - "r" + "pubkey", + "signature" ], "properties": { "dst": { @@ -420,24 +419,70 @@ } ] }, - "p": { - "description": "The point $p$ in its compressed format (element of G1)", + "pubkey": { + "description": "The public key point in its compressed format (element of G1)", "allOf": [ { "$ref": "#/definitions/Binary" } ] }, - "q": { - "description": "The point $q$ in its compressed format (element of G2)", + "signature": { + "description": "The signature point in its compressed format (element of G2)", + "allOf": [ + { + "$ref": "#/definitions/Binary" + } + ] + } + }, + "additionalProperties": false + } + }, + "additionalProperties": false + }, + { + "description": "BLS12-381 pairing equality verification (where the key is an element of G2)", + "type": "object", + "required": [ + "verify_bls12_pairing_equality_g2" + ], + "properties": { + "verify_bls12_pairing_equality_g2": { + "type": "object", + "required": [ + "dst", + "msg", + "pubkey", + "signature" + ], + "properties": { + "dst": { + "description": "The `dst` component used to hash the message to the curve", "allOf": [ { "$ref": "#/definitions/Binary" } ] }, - "r": { - "description": "The point $r$ in its compressed format (element of G1)", + "msg": { + "description": "The message that should be verified", + "allOf": [ + { + "$ref": "#/definitions/Binary" + } + ] + }, + "pubkey": { + "description": "The public key point in its compressed format (element of G2)", + "allOf": [ + { + "$ref": "#/definitions/Binary" + } + ] + }, + "signature": { + "description": "The signature point in its compressed format (element of G1)", "allOf": [ { "$ref": "#/definitions/Binary" @@ -482,7 +527,21 @@ }, "additionalProperties": false }, - "verify_bls12_pairing_equality": { + "verify_bls12_pairing_equality_g1": { + "$schema": "http://json-schema.org/draft-07/schema#", + "title": "VerifyResponse", + "type": "object", + "required": [ + "verifies" + ], + "properties": { + "verifies": { + "type": "boolean" + } + }, + "additionalProperties": false + }, + "verify_bls12_pairing_equality_g2": { "$schema": "http://json-schema.org/draft-07/schema#", "title": "VerifyResponse", "type": "object", diff --git a/contracts/crypto-verify/schema/raw/query.json b/contracts/crypto-verify/schema/raw/query.json index dc20550f7e..f71e68a751 100644 --- a/contracts/crypto-verify/schema/raw/query.json +++ b/contracts/crypto-verify/schema/raw/query.json @@ -377,20 +377,19 @@ "additionalProperties": false }, { - "description": "BLS12-381 pairing equality verification", + "description": "BLS12-381 pairing equality verification (where the key is an element of G1)", "type": "object", "required": [ - "verify_bls12_pairing_equality" + "verify_bls12_pairing_equality_g1" ], "properties": { - "verify_bls12_pairing_equality": { + "verify_bls12_pairing_equality_g1": { "type": "object", "required": [ "dst", "msg", - "p", - "q", - "r" + "pubkey", + "signature" ], "properties": { "dst": { @@ -409,24 +408,70 @@ } ] }, - "p": { - "description": "The point $p$ in its compressed format (element of G1)", + "pubkey": { + "description": "The public key point in its compressed format (element of G1)", + "allOf": [ + { + "$ref": "#/definitions/Binary" + } + ] + }, + "signature": { + "description": "The signature point in its compressed format (element of G2)", + "allOf": [ + { + "$ref": "#/definitions/Binary" + } + ] + } + }, + "additionalProperties": false + } + }, + "additionalProperties": false + }, + { + "description": "BLS12-381 pairing equality verification (where the key is an element of G2)", + "type": "object", + "required": [ + "verify_bls12_pairing_equality_g2" + ], + "properties": { + "verify_bls12_pairing_equality_g2": { + "type": "object", + "required": [ + "dst", + "msg", + "pubkey", + "signature" + ], + "properties": { + "dst": { + "description": "The `dst` component used to hash the message to the curve", + "allOf": [ + { + "$ref": "#/definitions/Binary" + } + ] + }, + "msg": { + "description": "The message that should be verified", "allOf": [ { "$ref": "#/definitions/Binary" } ] }, - "q": { - "description": "The point $q$ in its compressed format (element of G2)", + "pubkey": { + "description": "The public key point in its compressed format (element of G2)", "allOf": [ { "$ref": "#/definitions/Binary" } ] }, - "r": { - "description": "The point $r$ in its compressed format (element of G1)", + "signature": { + "description": "The signature point in its compressed format (element of G1)", "allOf": [ { "$ref": "#/definitions/Binary" diff --git a/contracts/crypto-verify/schema/raw/response_to_verify_bls12_pairing_equality_g1.json b/contracts/crypto-verify/schema/raw/response_to_verify_bls12_pairing_equality_g1.json new file mode 100644 index 0000000000..a2cdc3461c --- /dev/null +++ b/contracts/crypto-verify/schema/raw/response_to_verify_bls12_pairing_equality_g1.json @@ -0,0 +1,14 @@ +{ + "$schema": "http://json-schema.org/draft-07/schema#", + "title": "VerifyResponse", + "type": "object", + "required": [ + "verifies" + ], + "properties": { + "verifies": { + "type": "boolean" + } + }, + "additionalProperties": false +} diff --git a/contracts/crypto-verify/schema/raw/response_to_verify_bls12_pairing_equality_g2.json b/contracts/crypto-verify/schema/raw/response_to_verify_bls12_pairing_equality_g2.json new file mode 100644 index 0000000000..a2cdc3461c --- /dev/null +++ b/contracts/crypto-verify/schema/raw/response_to_verify_bls12_pairing_equality_g2.json @@ -0,0 +1,14 @@ +{ + "$schema": "http://json-schema.org/draft-07/schema#", + "title": "VerifyResponse", + "type": "object", + "required": [ + "verifies" + ], + "properties": { + "verifies": { + "type": "boolean" + } + }, + "additionalProperties": false +} diff --git a/contracts/crypto-verify/src/bls12_381.rs b/contracts/crypto-verify/src/bls12_381.rs index f531897717..c12fe98f94 100644 --- a/contracts/crypto-verify/src/bls12_381.rs +++ b/contracts/crypto-verify/src/bls12_381.rs @@ -1,14 +1,28 @@ -use cosmwasm_std::{Api, HashFunction, StdResult}; +use cosmwasm_std::{ + Api, HashFunction, StdResult, BLS12_381_G1_GENERATOR_COMPRESSED, + BLS12_381_G2_GENERATOR_COMPRESSED, +}; -pub fn verify( +pub fn verify_g1( api: &dyn Api, - p: &[u8], - q: &[u8], - r: &[u8], + signature: &[u8], + pubkey: &[u8], msg: &[u8], dst: &[u8], ) -> StdResult { let s = api.bls12_381_hash_to_g2(HashFunction::Sha256, msg, dst)?; - api.bls12_381_pairing_equality(p, q, r, &s) + api.bls12_381_pairing_equality(&BLS12_381_G1_GENERATOR_COMPRESSED, signature, pubkey, &s) + .map_err(Into::into) +} + +pub fn verify_g2( + api: &dyn Api, + signature: &[u8], + pubkey: &[u8], + msg: &[u8], + dst: &[u8], +) -> StdResult { + let s = api.bls12_381_hash_to_g1(HashFunction::Sha256, msg, dst)?; + api.bls12_381_pairing_equality(signature, &BLS12_381_G2_GENERATOR_COMPRESSED, &s, pubkey) .map_err(Into::into) } diff --git a/contracts/crypto-verify/src/contract.rs b/contracts/crypto-verify/src/contract.rs index 9153dafc41..e31654e127 100644 --- a/contracts/crypto-verify/src/contract.rs +++ b/contracts/crypto-verify/src/contract.rs @@ -112,9 +112,22 @@ pub fn query(deps: Deps, _env: Env, msg: QueryMsg) -> StdResult { &r, &s, )?), - QueryMsg::VerifyBls12PairingEquality { p, q, r, msg, dst } => { - to_json_binary(&query_verify_bls12_pairing(deps, &p, &q, &r, &msg, &dst)?) - } + QueryMsg::VerifyBls12PairingEqualityG1 { + signature, + pubkey, + msg, + dst, + } => to_json_binary(&query_verify_bls12_pairing_g1( + deps, &signature, &pubkey, &msg, &dst, + )?), + QueryMsg::VerifyBls12PairingEqualityG2 { + signature, + pubkey, + msg, + dst, + } => to_json_binary(&query_verify_bls12_pairing_g2( + deps, &signature, &pubkey, &msg, &dst, + )?), } } @@ -285,15 +298,25 @@ pub fn query_list_verifications(deps: Deps) -> StdResult StdResult { + let verifies = crate::bls12_381::verify_g1(deps.api, signature, pubkey, msg, dst)?; + Ok(VerifyResponse { verifies }) +} + +pub fn query_verify_bls12_pairing_g2( + deps: Deps, + signature: &[u8], + pubkey: &[u8], msg: &[u8], dst: &[u8], ) -> StdResult { - let verifies = crate::bls12_381::verify(deps.api, p, q, r, msg, dst)?; + let verifies = crate::bls12_381::verify_g2(deps.api, signature, pubkey, msg, dst)?; Ok(VerifyResponse { verifies }) } diff --git a/contracts/crypto-verify/src/msg.rs b/contracts/crypto-verify/src/msg.rs index 4be0934491..1ddb2b94ab 100644 --- a/contracts/crypto-verify/src/msg.rs +++ b/contracts/crypto-verify/src/msg.rs @@ -108,15 +108,25 @@ pub enum QueryMsg { /// The representation of this component is a big-endian encoded 256bit integer s: Binary, }, - /// BLS12-381 pairing equality verification + /// BLS12-381 pairing equality verification (where the key is an element of G1) #[returns(VerifyResponse)] - VerifyBls12PairingEquality { - /// The point $p$ in its compressed format (element of G1) - p: Binary, - /// The point $q$ in its compressed format (element of G2) - q: Binary, - /// The point $r$ in its compressed format (element of G1) - r: Binary, + VerifyBls12PairingEqualityG1 { + /// The signature point in its compressed format (element of G2) + signature: Binary, + /// The public key point in its compressed format (element of G1) + pubkey: Binary, + /// The message that should be verified + msg: Binary, + /// The `dst` component used to hash the message to the curve + dst: Binary, + }, + /// BLS12-381 pairing equality verification (where the key is an element of G2) + #[returns(VerifyResponse)] + VerifyBls12PairingEqualityG2 { + /// The signature point in its compressed format (element of G1) + signature: Binary, + /// The public key point in its compressed format (element of G2) + pubkey: Binary, /// The message that should be verified msg: Binary, /// The `dst` component used to hash the message to the curve diff --git a/contracts/crypto-verify/tests/integration.rs b/contracts/crypto-verify/tests/integration.rs index 711bd89800..0c9c380b72 100644 --- a/contracts/crypto-verify/tests/integration.rs +++ b/contracts/crypto-verify/tests/integration.rs @@ -19,7 +19,7 @@ //! 5. Anywhere you see query(deps.as_ref(), ...) you must replace it with query(&mut deps, ...) //! (Use cosmwasm_vm::testing::{init, execute, query}, instead of the contract variants). -use cosmwasm_std::{Binary, Response, Uint128, BLS12_381_G1_GENERATOR_COMPRESSED}; +use cosmwasm_std::{Binary, Response, Uint128}; use cosmwasm_vm::testing::{ instantiate, mock_env, mock_info, mock_instance, query, MockApi, MockQuerier, MockStorage, }; @@ -76,11 +76,15 @@ const WEBAUTHN_SIGNATURE_S: &[u8] = // See https://github.com/drand/kyber-bls12381/issues/22 and // https://github.com/drand/drand/pull/1249 +const DOMAIN_HASH_TO_G1: &[u8] = b"BLS_SIG_BLS12381G1_XMD:SHA-256_SSWU_RO_NUL_"; const DOMAIN_HASH_TO_G2: &[u8] = b"BLS_SIG_BLS12381G2_XMD:SHA-256_SSWU_RO_NUL_"; /// Public key League of Entropy Mainnet (curl -sS https://drand.cloudflare.com/info) const PK_LEO_MAINNET: [u8; 48] = hex!("868f005eb8e6e4ca0a47c8a77ceaa5309a47978a7c71bc5cce96366b5d7a569937c529eeda66c7293784a9402801af31"); +// Tests from quicknet (https://api.drand.sh/52db9ba70e0cc0f6eaf7803dd07447a1f5477735fd3f661792ba94600c84e971/info) +const PK_QUICKNET: [u8; 96] = hex!("83cf0f2896adee7eb8b5f01fcad3912212c437e0073e911fb90022d3e760183c8c4b450b6a0a6c3ac6a5776a2d1064510d1fec758c921cc22b0e17e63aaf4bcb5ed66304de9cf809bd274ca73bab4af5a6e9c76a4bc09e76eae8991ef5ece45a"); + fn build_drand_message(round: u64, previous_signature: &[u8]) -> Vec { Sha256::new() .chain_update(previous_signature) @@ -106,7 +110,7 @@ fn instantiate_works() { } #[test] -fn bls12_381_verifies() { +fn bls12_381_verifies_g1() { let mut deps = setup(); let previous_signature = hex::decode("a609e19a03c2fcc559e8dae14900aaefe517cb55c840f6e69bc8e4f66c8d18e8a609685d9917efbfb0c37f058c2de88f13d297c7e19e0ab24813079efe57a182554ff054c7638153f9b26a60e7111f71a0ff63d9571704905d3ca6df0b031747").unwrap(); @@ -115,10 +119,9 @@ fn bls12_381_verifies() { let msg = build_drand_message(round, &previous_signature); - let verify_msg = QueryMsg::VerifyBls12PairingEquality { - p: BLS12_381_G1_GENERATOR_COMPRESSED.into(), - q: signature.into(), - r: PK_LEO_MAINNET.into(), + let verify_msg = QueryMsg::VerifyBls12PairingEqualityG1 { + signature: signature.into(), + pubkey: PK_LEO_MAINNET.into(), msg: msg.into(), dst: DOMAIN_HASH_TO_G2.into(), }; @@ -129,6 +132,28 @@ fn bls12_381_verifies() { assert_eq!(res, VerifyResponse { verifies: true }); } +#[test] +fn bls12_381_verifies_g2() { + let mut deps = setup(); + + let signature = hex::decode("b75c69d0b72a5d906e854e808ba7e2accb1542ac355ae486d591aa9d43765482e26cd02df835d3546d23c4b13e0dfc92").unwrap(); + let round: u64 = 123; + + let msg = build_drand_message(round, b""); + + let verify_msg = QueryMsg::VerifyBls12PairingEqualityG2 { + signature: signature.into(), + pubkey: PK_QUICKNET.into(), + msg: msg.into(), + dst: DOMAIN_HASH_TO_G1.into(), + }; + + let raw = query(&mut deps, mock_env(), verify_msg).unwrap(); + let res: VerifyResponse = from_slice(&raw, DESERIALIZATION_LIMIT).unwrap(); + + assert_eq!(res, VerifyResponse { verifies: true }); +} + #[test] fn bls12_381_errors() { let mut deps = setup(); @@ -141,10 +166,9 @@ fn bls12_381_errors() { let msg = build_drand_message(round, &previous_signature); - let verify_msg = QueryMsg::VerifyBls12PairingEquality { - p: BLS12_381_G1_GENERATOR_COMPRESSED.into(), - q: signature.into(), - r: PK_LEO_MAINNET.into(), + let verify_msg = QueryMsg::VerifyBls12PairingEqualityG1 { + signature: signature.into(), + pubkey: PK_LEO_MAINNET.into(), msg: msg.into(), dst: DOMAIN_HASH_TO_G2.into(), }; From 57aaf8c62041f9d89d75aaceff42cacea127e483 Mon Sep 17 00:00:00 2001 From: Aumetra Weisman Date: Tue, 7 May 2024 13:18:49 +0200 Subject: [PATCH 65/79] Update CHANGELOG.md Co-authored-by: Simon Warta <2603011+webmaster128@users.noreply.github.com> --- CHANGELOG.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 336a88d700..01c5b3fcb5 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -39,7 +39,7 @@ and this project adheres to of `AnalyzeReport` ([#2129]) - cosmwasm-vm: Add `bls12_381_aggregate_g1`, `bls12_381_aggregate_g2`, `bls12_381_pairing_equality`, `bls12_381_hash_to_g1`, and - `bls12_381_hash_to_g1` to enable BLS12-381 curve operations, such as verifying + `bls12_381_hash_to_g2` to enable BLS12-381 curve operations, such as verifying pairing equalities ([#2106]) [#1983]: https://github.com/CosmWasm/cosmwasm/pull/1983 From 6784a00211676d614a9fb5fe6e0a0e35785a5c2a Mon Sep 17 00:00:00 2001 From: Aumetra Weisman Date: Tue, 7 May 2024 13:27:29 +0200 Subject: [PATCH 66/79] Replace `.clone_from_slice` with `.copy_from_slice` --- packages/crypto/src/bls12_318/aggregate.rs | 4 ++-- packages/crypto/src/bls12_318/points.rs | 4 ++-- 2 files changed, 4 insertions(+), 4 deletions(-) diff --git a/packages/crypto/src/bls12_318/aggregate.rs b/packages/crypto/src/bls12_318/aggregate.rs index 6b889b4a60..dfaa97990f 100644 --- a/packages/crypto/src/bls12_318/aggregate.rs +++ b/packages/crypto/src/bls12_318/aggregate.rs @@ -28,7 +28,7 @@ pub fn bls12_381_aggregate_g1(points: &[u8]) -> Result<[u8; 48], CryptoError> { .chunks_exact(G1_POINT_SIZE) .map(|data| { let mut buf = [0u8; 48]; - buf[..].clone_from_slice(data); + buf[..].copy_from_slice(data); buf }) .collect(); @@ -70,7 +70,7 @@ pub fn bls12_381_aggregate_g2(points: &[u8]) -> Result<[u8; 96], CryptoError> { .chunks_exact(G2_POINT_SIZE) .map(|data| { let mut buf = [0u8; 96]; - buf[..].clone_from_slice(data); + buf[..].copy_from_slice(data); buf }) .collect(); diff --git a/packages/crypto/src/bls12_318/points.rs b/packages/crypto/src/bls12_318/points.rs index 996d0b8fda..e3ccaae6ed 100644 --- a/packages/crypto/src/bls12_318/points.rs +++ b/packages/crypto/src/bls12_318/points.rs @@ -125,7 +125,7 @@ pub fn g1_from_variable(data: &[u8]) -> Result { } let mut buf = [0u8; BLS12_381_G1_POINT_LEN]; - buf[..].clone_from_slice(data); + buf[..].copy_from_slice(data); g1_from_fixed(&buf) } @@ -149,7 +149,7 @@ pub fn g2_from_variable(data: &[u8]) -> Result { } let mut buf = [0u8; BLS12_381_G2_POINT_LEN]; - buf[..].clone_from_slice(data); + buf[..].copy_from_slice(data); g2_from_fixed(&buf) } From f7814dd04d3872f1c3c1221aec4176ec2bf63df2 Mon Sep 17 00:00:00 2001 From: Aumetra Weisman Date: Tue, 7 May 2024 13:29:52 +0200 Subject: [PATCH 67/79] Update packages/crypto/src/bls12_318/hash.rs Co-authored-by: Simon Warta <2603011+webmaster128@users.noreply.github.com> --- packages/crypto/src/bls12_318/hash.rs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/packages/crypto/src/bls12_318/hash.rs b/packages/crypto/src/bls12_318/hash.rs index 04e9fafee2..2d26e4aa81 100644 --- a/packages/crypto/src/bls12_318/hash.rs +++ b/packages/crypto/src/bls12_318/hash.rs @@ -37,7 +37,7 @@ type HashToCurve = #[derive(Clone, Copy, Debug)] #[non_exhaustive] pub enum HashFunction { - Sha256, + Sha256 = 0, } #[doc(hidden)] From 68bea24f818c07058014a8b291bfbbc5fce91a15 Mon Sep 17 00:00:00 2001 From: Aumetra Weisman Date: Tue, 7 May 2024 13:51:15 +0200 Subject: [PATCH 68/79] Move constants, add sources --- packages/crypto/src/bls12_318/constants.rs | 31 +++++++++++++++++++--- packages/crypto/src/bls12_318/mod.rs | 24 +++++------------ 2 files changed, 34 insertions(+), 21 deletions(-) diff --git a/packages/crypto/src/bls12_318/constants.rs b/packages/crypto/src/bls12_318/constants.rs index 382187384f..c5c2bfe25d 100644 --- a/packages/crypto/src/bls12_318/constants.rs +++ b/packages/crypto/src/bls12_318/constants.rs @@ -1,3 +1,19 @@ +pub const BLS12_381_G1_POINT_LEN: usize = 48; +pub const BLS12_381_G2_POINT_LEN: usize = 96; + +pub const BLS12_381_G1_GENERATOR_COMPRESSED: [u8; BLS12_381_G1_POINT_LEN] = [ + 151, 241, 211, 167, 49, 151, 215, 148, 38, 149, 99, 140, 79, 169, 172, 15, 195, 104, 140, 79, + 151, 116, 185, 5, 161, 78, 58, 63, 23, 27, 172, 88, 108, 85, 232, 63, 249, 122, 26, 239, 251, + 58, 240, 10, 219, 34, 198, 187, +]; +pub const BLS12_381_G2_GENERATOR_COMPRESSED: [u8; BLS12_381_G2_POINT_LEN] = [ + 147, 224, 43, 96, 82, 113, 159, 96, 125, 172, 211, 160, 136, 39, 79, 101, 89, 107, 208, 208, + 153, 32, 182, 26, 181, 218, 97, 187, 220, 127, 80, 73, 51, 76, 241, 18, 19, 148, 93, 87, 229, + 172, 125, 5, 93, 4, 43, 126, 2, 74, 162, 178, 240, 143, 10, 145, 38, 8, 5, 39, 45, 197, 16, 81, + 198, 228, 122, 212, 250, 64, 59, 2, 180, 81, 11, 100, 122, 227, 209, 119, 11, 172, 3, 38, 168, + 5, 187, 239, 212, 128, 86, 200, 193, 33, 189, 184, +]; + #[cfg(test)] mod test { use ark_bls12_381::{G1Affine, G2Affine}; @@ -5,10 +21,9 @@ mod test { use ark_serialize::CanonicalSerialize; use hex_literal::hex; - use crate::{ - bls12_318::{BLS12_381_G1_GENERATOR_COMPRESSED, BLS12_381_G2_GENERATOR_COMPRESSED}, - BLS12_381_G1_POINT_LEN, BLS12_381_G2_POINT_LEN, - }; + use super::{BLS12_381_G1_GENERATOR_COMPRESSED, BLS12_381_G2_GENERATOR_COMPRESSED}; + + use crate::{BLS12_381_G1_POINT_LEN, BLS12_381_G2_POINT_LEN}; fn bls12_381_g1_generator() -> [u8; BLS12_381_G1_POINT_LEN] { let mut point = [0_u8; BLS12_381_G1_POINT_LEN]; @@ -30,6 +45,9 @@ mod test { #[test] fn g1_generator_correct() { + // Source: + // + // See the `x` coordinate let mut generator = hex!("17f1d3a73197d7942695638c4fa9ac0fc3688c4f9774b905a14e3a3f171bac586c55e83ff97a1aeffb3af00adb22c6bb"); generator[0] |= 0b1000_0000; assert_eq!(generator, bls12_381_g1_generator()); @@ -38,6 +56,11 @@ mod test { #[test] fn g2_generator_correct() { + // Source: + // + // $$ + // G2_{raw} = x'_1 || x'_0 + // $$ let mut generator = hex!("13e02b6052719f607dacd3a088274f65596bd0d09920b61ab5da61bbdc7f5049334cf11213945d57e5ac7d055d042b7e024aa2b2f08f0a91260805272dc51051c6e47ad4fa403b02b4510b647ae3d1770bac0326a805bbefd48056c8c121bdb8"); generator[0] |= 0b1000_0000; assert_eq!(generator, bls12_381_g2_generator()); diff --git a/packages/crypto/src/bls12_318/mod.rs b/packages/crypto/src/bls12_318/mod.rs index e74bb38cbf..aea33d10d2 100644 --- a/packages/crypto/src/bls12_318/mod.rs +++ b/packages/crypto/src/bls12_318/mod.rs @@ -1,7 +1,13 @@ +mod constants; + +pub use self::constants::{ + BLS12_381_G1_GENERATOR_COMPRESSED, BLS12_381_G1_POINT_LEN, BLS12_381_G2_GENERATOR_COMPRESSED, + BLS12_381_G2_POINT_LEN, +}; + cfg_if::cfg_if! { if #[cfg(feature = "std")] { mod aggregate; - mod constants; mod hash; mod pairing; mod points; @@ -12,19 +18,3 @@ cfg_if::cfg_if! { pub use self::points::{bls12_381_g1_is_identity, bls12_381_g2_is_identity}; } } - -pub const BLS12_381_G1_POINT_LEN: usize = 48; -pub const BLS12_381_G2_POINT_LEN: usize = 96; - -pub const BLS12_381_G1_GENERATOR_COMPRESSED: [u8; BLS12_381_G1_POINT_LEN] = [ - 151, 241, 211, 167, 49, 151, 215, 148, 38, 149, 99, 140, 79, 169, 172, 15, 195, 104, 140, 79, - 151, 116, 185, 5, 161, 78, 58, 63, 23, 27, 172, 88, 108, 85, 232, 63, 249, 122, 26, 239, 251, - 58, 240, 10, 219, 34, 198, 187, -]; -pub const BLS12_381_G2_GENERATOR_COMPRESSED: [u8; BLS12_381_G2_POINT_LEN] = [ - 147, 224, 43, 96, 82, 113, 159, 96, 125, 172, 211, 160, 136, 39, 79, 101, 89, 107, 208, 208, - 153, 32, 182, 26, 181, 218, 97, 187, 220, 127, 80, 73, 51, 76, 241, 18, 19, 148, 93, 87, 229, - 172, 125, 5, 93, 4, 43, 126, 2, 74, 162, 178, 240, 143, 10, 145, 38, 8, 5, 39, 45, 197, 16, 81, - 198, 228, 122, 212, 250, 64, 59, 2, 180, 81, 11, 100, 122, 227, 209, 119, 11, 172, 3, 38, 168, - 5, 187, 239, 212, 128, 86, 200, 193, 33, 189, 184, -]; From 177c9c39839fd1ca8f6068460fc1307781d24a00 Mon Sep 17 00:00:00 2001 From: Aumetra Weisman Date: Tue, 7 May 2024 13:57:23 +0200 Subject: [PATCH 69/79] Add generator tests --- packages/crypto/src/bls12_318/points.rs | 8 ++++++-- 1 file changed, 6 insertions(+), 2 deletions(-) diff --git a/packages/crypto/src/bls12_318/points.rs b/packages/crypto/src/bls12_318/points.rs index e3ccaae6ed..748f68461b 100644 --- a/packages/crypto/src/bls12_318/points.rs +++ b/packages/crypto/src/bls12_318/points.rs @@ -195,17 +195,21 @@ pub fn bls12_381_g2_is_identity(g2: &[u8; BLS12_381_G2_POINT_LEN]) -> Result Date: Tue, 7 May 2024 12:33:43 +0200 Subject: [PATCH 70/79] Remove _COMPRESSED from BLS points --- contracts/crypto-verify/src/bls12_381.rs | 9 +++----- packages/crypto/benches/main.rs | 6 +++--- packages/crypto/src/bls12_318/constants.rs | 24 +++++++++++++++------- packages/crypto/src/bls12_318/mod.rs | 3 +-- packages/crypto/src/bls12_318/points.rs | 6 +++--- packages/crypto/src/lib.rs | 3 +-- packages/crypto/tests/bls12_381.rs | 8 ++++---- packages/std/src/lib.rs | 2 +- packages/std/src/testing/mock.rs | 6 +++--- 9 files changed, 36 insertions(+), 31 deletions(-) diff --git a/contracts/crypto-verify/src/bls12_381.rs b/contracts/crypto-verify/src/bls12_381.rs index c12fe98f94..4063f553d4 100644 --- a/contracts/crypto-verify/src/bls12_381.rs +++ b/contracts/crypto-verify/src/bls12_381.rs @@ -1,7 +1,4 @@ -use cosmwasm_std::{ - Api, HashFunction, StdResult, BLS12_381_G1_GENERATOR_COMPRESSED, - BLS12_381_G2_GENERATOR_COMPRESSED, -}; +use cosmwasm_std::{Api, HashFunction, StdResult, BLS12_381_G1_GENERATOR, BLS12_381_G2_GENERATOR}; pub fn verify_g1( api: &dyn Api, @@ -11,7 +8,7 @@ pub fn verify_g1( dst: &[u8], ) -> StdResult { let s = api.bls12_381_hash_to_g2(HashFunction::Sha256, msg, dst)?; - api.bls12_381_pairing_equality(&BLS12_381_G1_GENERATOR_COMPRESSED, signature, pubkey, &s) + api.bls12_381_pairing_equality(&BLS12_381_G1_GENERATOR, signature, pubkey, &s) .map_err(Into::into) } @@ -23,6 +20,6 @@ pub fn verify_g2( dst: &[u8], ) -> StdResult { let s = api.bls12_381_hash_to_g1(HashFunction::Sha256, msg, dst)?; - api.bls12_381_pairing_equality(signature, &BLS12_381_G2_GENERATOR_COMPRESSED, &s, pubkey) + api.bls12_381_pairing_equality(signature, &BLS12_381_G2_GENERATOR, &s, pubkey) .map_err(Into::into) } diff --git a/packages/crypto/benches/main.rs b/packages/crypto/benches/main.rs index 40c04b5705..a3af20d839 100644 --- a/packages/crypto/benches/main.rs +++ b/packages/crypto/benches/main.rs @@ -19,7 +19,7 @@ use cosmwasm_crypto::{ bls12_381_aggregate_g1, bls12_381_aggregate_g2, bls12_381_hash_to_g1, bls12_381_hash_to_g2, bls12_381_pairing_equality, ed25519_batch_verify, ed25519_verify, secp256k1_recover_pubkey, secp256k1_verify, secp256r1_recover_pubkey, secp256r1_verify, HashFunction, - BLS12_381_G1_GENERATOR_COMPRESSED, BLS12_381_G1_POINT_LEN, BLS12_381_G2_POINT_LEN, + BLS12_381_G1_GENERATOR, BLS12_381_G1_POINT_LEN, BLS12_381_G2_POINT_LEN, }; use std::cmp::min; @@ -192,7 +192,7 @@ where let is_valid = black_box(bls12_381_pairing_equality( &serialized_pubkeys, &serialized_messages, - &BLS12_381_G1_GENERATOR_COMPRESSED, + &BLS12_381_G1_GENERATOR, &serialized_signature, )) .unwrap(); @@ -224,7 +224,7 @@ where }); group.bench_function("bls12_381_verify", |b| { - let generator = BLS12_381_G1_GENERATOR_COMPRESSED; + let generator = BLS12_381_G1_GENERATOR; let message = bls12_381_hash_to_g2(HashFunction::Sha256, &BLS_MESSAGE, BLS_DST); b.iter(|| { diff --git a/packages/crypto/src/bls12_318/constants.rs b/packages/crypto/src/bls12_318/constants.rs index c5c2bfe25d..62dad87cf9 100644 --- a/packages/crypto/src/bls12_318/constants.rs +++ b/packages/crypto/src/bls12_318/constants.rs @@ -1,12 +1,21 @@ pub const BLS12_381_G1_POINT_LEN: usize = 48; pub const BLS12_381_G2_POINT_LEN: usize = 96; -pub const BLS12_381_G1_GENERATOR_COMPRESSED: [u8; BLS12_381_G1_POINT_LEN] = [ +/// A generator in G1 (in compressed serialization). +/// +/// This can be used directly for signature verification +/// (see e.g. https://twitter.com/simon_warta/status/1786342207106019765) +pub const BLS12_381_G1_GENERATOR: [u8; BLS12_381_G1_POINT_LEN] = [ 151, 241, 211, 167, 49, 151, 215, 148, 38, 149, 99, 140, 79, 169, 172, 15, 195, 104, 140, 79, 151, 116, 185, 5, 161, 78, 58, 63, 23, 27, 172, 88, 108, 85, 232, 63, 249, 122, 26, 239, 251, 58, 240, 10, 219, 34, 198, 187, ]; -pub const BLS12_381_G2_GENERATOR_COMPRESSED: [u8; BLS12_381_G2_POINT_LEN] = [ + +/// A generator in G2 (in compressed serialization). +/// +/// This can be used directly for signature verification +/// (see e.g. https://twitter.com/simon_warta/status/1786342207106019765) +pub const BLS12_381_G2_GENERATOR: [u8; BLS12_381_G2_POINT_LEN] = [ 147, 224, 43, 96, 82, 113, 159, 96, 125, 172, 211, 160, 136, 39, 79, 101, 89, 107, 208, 208, 153, 32, 182, 26, 181, 218, 97, 187, 220, 127, 80, 73, 51, 76, 241, 18, 19, 148, 93, 87, 229, 172, 125, 5, 93, 4, 43, 126, 2, 74, 162, 178, 240, 143, 10, 145, 38, 8, 5, 39, 45, 197, 16, 81, @@ -21,9 +30,10 @@ mod test { use ark_serialize::CanonicalSerialize; use hex_literal::hex; - use super::{BLS12_381_G1_GENERATOR_COMPRESSED, BLS12_381_G2_GENERATOR_COMPRESSED}; - - use crate::{BLS12_381_G1_POINT_LEN, BLS12_381_G2_POINT_LEN}; + use super::{ + BLS12_381_G1_GENERATOR, BLS12_381_G1_POINT_LEN, BLS12_381_G2_GENERATOR, + BLS12_381_G2_POINT_LEN, + }; fn bls12_381_g1_generator() -> [u8; BLS12_381_G1_POINT_LEN] { let mut point = [0_u8; BLS12_381_G1_POINT_LEN]; @@ -51,7 +61,7 @@ mod test { let mut generator = hex!("17f1d3a73197d7942695638c4fa9ac0fc3688c4f9774b905a14e3a3f171bac586c55e83ff97a1aeffb3af00adb22c6bb"); generator[0] |= 0b1000_0000; assert_eq!(generator, bls12_381_g1_generator()); - assert_eq!(bls12_381_g1_generator(), BLS12_381_G1_GENERATOR_COMPRESSED); + assert_eq!(bls12_381_g1_generator(), BLS12_381_G1_GENERATOR); } #[test] @@ -64,6 +74,6 @@ mod test { let mut generator = hex!("13e02b6052719f607dacd3a088274f65596bd0d09920b61ab5da61bbdc7f5049334cf11213945d57e5ac7d055d042b7e024aa2b2f08f0a91260805272dc51051c6e47ad4fa403b02b4510b647ae3d1770bac0326a805bbefd48056c8c121bdb8"); generator[0] |= 0b1000_0000; assert_eq!(generator, bls12_381_g2_generator()); - assert_eq!(bls12_381_g2_generator(), BLS12_381_G2_GENERATOR_COMPRESSED); + assert_eq!(bls12_381_g2_generator(), BLS12_381_G2_GENERATOR); } } diff --git a/packages/crypto/src/bls12_318/mod.rs b/packages/crypto/src/bls12_318/mod.rs index aea33d10d2..719b0b59c1 100644 --- a/packages/crypto/src/bls12_318/mod.rs +++ b/packages/crypto/src/bls12_318/mod.rs @@ -1,8 +1,7 @@ mod constants; pub use self::constants::{ - BLS12_381_G1_GENERATOR_COMPRESSED, BLS12_381_G1_POINT_LEN, BLS12_381_G2_GENERATOR_COMPRESSED, - BLS12_381_G2_POINT_LEN, + BLS12_381_G1_GENERATOR, BLS12_381_G1_POINT_LEN, BLS12_381_G2_GENERATOR, BLS12_381_G2_POINT_LEN, }; cfg_if::cfg_if! { diff --git a/packages/crypto/src/bls12_318/points.rs b/packages/crypto/src/bls12_318/points.rs index 748f68461b..a6e4b7c3e5 100644 --- a/packages/crypto/src/bls12_318/points.rs +++ b/packages/crypto/src/bls12_318/points.rs @@ -195,7 +195,7 @@ pub fn bls12_381_g2_is_identity(g2: &[u8; BLS12_381_G2_POINT_LEN]) -> Result Date: Tue, 7 May 2024 12:34:06 +0200 Subject: [PATCH 71/79] Add docs and clarifications to verify_g1/verify_g2 --- contracts/crypto-verify/src/bls12_381.rs | 17 +++++++++++++---- 1 file changed, 13 insertions(+), 4 deletions(-) diff --git a/contracts/crypto-verify/src/bls12_381.rs b/contracts/crypto-verify/src/bls12_381.rs index 4063f553d4..93d7120ffe 100644 --- a/contracts/crypto-verify/src/bls12_381.rs +++ b/contracts/crypto-verify/src/bls12_381.rs @@ -1,5 +1,8 @@ use cosmwasm_std::{Api, HashFunction, StdResult, BLS12_381_G1_GENERATOR, BLS12_381_G2_GENERATOR}; +/// Signature verification with public key in G1 (e.g. drand classic mainnet, ETH2 block headers). +/// +/// See https://hackmd.io/@benjaminion/bls12-381#Verification. pub fn verify_g1( api: &dyn Api, signature: &[u8], @@ -7,11 +10,16 @@ pub fn verify_g1( msg: &[u8], dst: &[u8], ) -> StdResult { - let s = api.bls12_381_hash_to_g2(HashFunction::Sha256, msg, dst)?; - api.bls12_381_pairing_equality(&BLS12_381_G1_GENERATOR, signature, pubkey, &s) + // The H(m) from the docs + let msg_hash = api.bls12_381_hash_to_g2(HashFunction::Sha256, msg, dst)?; + api.bls12_381_pairing_equality(&BLS12_381_G1_GENERATOR, signature, pubkey, &msg_hash) .map_err(Into::into) } +/// Signature verification with public key in G2 (e.g. drand Quicknet) +/// +/// See https://hackmd.io/@benjaminion/bls12-381#Verification in combination with +/// https://hackmd.io/@benjaminion/bls12-381#Swapping-G1-and-G2. pub fn verify_g2( api: &dyn Api, signature: &[u8], @@ -19,7 +27,8 @@ pub fn verify_g2( msg: &[u8], dst: &[u8], ) -> StdResult { - let s = api.bls12_381_hash_to_g1(HashFunction::Sha256, msg, dst)?; - api.bls12_381_pairing_equality(signature, &BLS12_381_G2_GENERATOR, &s, pubkey) + // The H(m) from the docs + let msg_hash = api.bls12_381_hash_to_g1(HashFunction::Sha256, msg, dst)?; + api.bls12_381_pairing_equality(signature, &BLS12_381_G2_GENERATOR, &msg_hash, pubkey) .map_err(Into::into) } From 2b0a7e3e7c140816cf800cb4cdd73fb00093b64a Mon Sep 17 00:00:00 2001 From: Simon Warta Date: Tue, 7 May 2024 12:38:36 +0200 Subject: [PATCH 72/79] Remove ark-bls12-381 from crypto-verify contract --- contracts/crypto-verify/Cargo.lock | 1 - contracts/crypto-verify/Cargo.toml | 1 - 2 files changed, 2 deletions(-) diff --git a/contracts/crypto-verify/Cargo.lock b/contracts/crypto-verify/Cargo.lock index e6d0650abb..03d070ef4a 100644 --- a/contracts/crypto-verify/Cargo.lock +++ b/contracts/crypto-verify/Cargo.lock @@ -603,7 +603,6 @@ dependencies = [ name = "crypto-verify" version = "0.0.0" dependencies = [ - "ark-bls12-381", "base64", "cosmwasm-schema", "cosmwasm-std", diff --git a/contracts/crypto-verify/Cargo.toml b/contracts/crypto-verify/Cargo.toml index 191c02327d..d19b2bfc02 100644 --- a/contracts/crypto-verify/Cargo.toml +++ b/contracts/crypto-verify/Cargo.toml @@ -30,7 +30,6 @@ cranelift = ["cosmwasm-vm/cranelift"] [dependencies] base64 = "0.22.0" -ark-bls12-381 = { version = "0.4.0", default-features = false } cosmwasm-schema = { path = "../../packages/schema" } cosmwasm-std = { path = "../../packages/std", features = ["cosmwasm_2_1", "iterator"] } hex = "0.4" From 871c63fd021faeb24a49f6ad2fd8a68126911afa Mon Sep 17 00:00:00 2001 From: Aumetra Weisman Date: Tue, 7 May 2024 14:03:02 +0200 Subject: [PATCH 73/79] Gate tests behind `std` feature --- packages/crypto/src/bls12_318/constants.rs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/packages/crypto/src/bls12_318/constants.rs b/packages/crypto/src/bls12_318/constants.rs index 62dad87cf9..9ee0f4ad68 100644 --- a/packages/crypto/src/bls12_318/constants.rs +++ b/packages/crypto/src/bls12_318/constants.rs @@ -23,7 +23,7 @@ pub const BLS12_381_G2_GENERATOR: [u8; BLS12_381_G2_POINT_LEN] = [ 5, 187, 239, 212, 128, 86, 200, 193, 33, 189, 184, ]; -#[cfg(test)] +#[cfg(all(test, feature = "std"))] mod test { use ark_bls12_381::{G1Affine, G2Affine}; use ark_ec::AffineRepr; From 246ce0245fbfcec56c0ac92938c90840790877af Mon Sep 17 00:00:00 2001 From: Aumetra Weisman Date: Tue, 7 May 2024 14:33:55 +0200 Subject: [PATCH 74/79] Constants for success --- packages/vm/src/imports.rs | 14 ++++++++++---- 1 file changed, 10 insertions(+), 4 deletions(-) diff --git a/packages/vm/src/imports.rs b/packages/vm/src/imports.rs index fa29a72cde..33469d9cb0 100644 --- a/packages/vm/src/imports.rs +++ b/packages/vm/src/imports.rs @@ -247,6 +247,12 @@ const BLS12_381_VALID_PAIRING: u32 = 0; /// Return code (error code) for an invalid pairing const BLS12_381_INVALID_PAIRING: u32 = 1; +/// Return code (error code) if the aggregating the points on curve was successful +const BLS12_381_AGGREGATE_SUCCESS: u32 = 0; + +/// Return code (error code) for success when hashing to the curve +const BLS12_381_HASH_TO_CURVE_SUCCESS: u32 = 0; + /// Maximum size of continous points passed to aggregate functions const BLS12_381_MAX_AGGREGATE_SIZE: usize = 2 * MI; @@ -280,7 +286,7 @@ pub fn do_bls12_381_aggregate_g1< Ok(point) => { let memory = data.memory(&store); write_region(&memory, out_ptr, &point)?; - 0 + BLS12_381_AGGREGATE_SUCCESS } Err(err) => match err { CryptoError::InvalidPoint { .. } | CryptoError::Aggregation { .. } => err.code(), @@ -324,7 +330,7 @@ pub fn do_bls12_381_aggregate_g2< Ok(point) => { let memory = data.memory(&store); write_region(&memory, out_ptr, &point)?; - 0 + BLS12_381_AGGREGATE_SUCCESS } Err(err) => match err { CryptoError::InvalidPoint { .. } | CryptoError::Aggregation { .. } => err.code(), @@ -423,7 +429,7 @@ pub fn do_bls12_381_hash_to_g1< let memory = data.memory(&store); write_region(&memory, out_ptr, &point)?; - Ok(0) + Ok(BLS12_381_HASH_TO_CURVE_SUCCESS) } pub fn do_bls12_381_hash_to_g2< @@ -455,7 +461,7 @@ pub fn do_bls12_381_hash_to_g2< let memory = data.memory(&store); write_region(&memory, out_ptr, &point)?; - Ok(0) + Ok(BLS12_381_HASH_TO_CURVE_SUCCESS) } pub fn do_secp256k1_verify( From fc70c3e89eae3aea45dc395668c5d1af7b87971f Mon Sep 17 00:00:00 2001 From: Aumetra Weisman Date: Tue, 7 May 2024 15:25:15 +0200 Subject: [PATCH 75/79] Remove error checks about empty pairing equality --- .../core/src/errors/verification_error.rs | 16 ------------- packages/crypto/src/bls12_318/pairing.rs | 24 +------------------ packages/crypto/src/errors.rs | 16 ++----------- packages/std/src/imports.rs | 10 ++------ 4 files changed, 5 insertions(+), 61 deletions(-) diff --git a/packages/core/src/errors/verification_error.rs b/packages/core/src/errors/verification_error.rs index bfc3d36c55..3d9120ddd1 100644 --- a/packages/core/src/errors/verification_error.rs +++ b/packages/core/src/errors/verification_error.rs @@ -18,10 +18,6 @@ pub enum AggregationError { #[derive(Display, Debug, PartialEq)] #[cfg_attr(feature = "std", derive(thiserror::Error))] pub enum PairingEqualityError { - #[display("List of G1 points is empty")] - EmptyG1, - #[display("List of G2 points is empty")] - EmptyG2, #[display("List is not a multiple of 48")] NotMultipleG1, #[display("List is not a multiple of 96")] @@ -125,18 +121,6 @@ impl From for VerificationError { } => VerificationError::Aggregation { source: AggregationError::NotMultiple, }, - CryptoError::PairingEquality { - source: cosmwasm_crypto::PairingEqualityError::EmptyG1, - .. - } => VerificationError::PairingEquality { - source: PairingEqualityError::EmptyG1, - }, - CryptoError::PairingEquality { - source: cosmwasm_crypto::PairingEqualityError::EmptyG2, - .. - } => VerificationError::PairingEquality { - source: PairingEqualityError::EmptyG2, - }, CryptoError::PairingEquality { source: cosmwasm_crypto::PairingEqualityError::NotMultipleG1 { .. }, .. diff --git a/packages/crypto/src/bls12_318/pairing.rs b/packages/crypto/src/bls12_318/pairing.rs index 63ae1b7ff3..d3821db0b0 100644 --- a/packages/crypto/src/bls12_318/pairing.rs +++ b/packages/crypto/src/bls12_318/pairing.rs @@ -20,11 +20,7 @@ pub fn bls12_381_pairing_equality( r: &[u8], s: &[u8], ) -> Result { - if ps.is_empty() { - return Err(PairingEquality::EmptyG1.into()); - } else if qs.is_empty() { - return Err(PairingEquality::EmptyG2.into()); - } else if ps.len() % BLS12_381_G1_POINT_LEN != 0 { + if ps.len() % BLS12_381_G1_POINT_LEN != 0 { return Err(PairingEquality::NotMultipleG1 { remainder: ps.len() % BLS12_381_G1_POINT_LEN, } @@ -159,24 +155,6 @@ mod test { #[test] fn pairing_equality_error_cases_work() { - let result = bls12_381_pairing_equality(&[], &[12], &[12], &[12]); - assert!(matches!( - result, - Err(CryptoError::PairingEquality { - source: PairingEqualityError::EmptyG1, - .. - }) - )); - - let result = bls12_381_pairing_equality(&[12], &[], &[12], &[12]); - assert!(matches!( - result, - Err(CryptoError::PairingEquality { - source: PairingEqualityError::EmptyG2, - .. - }) - )); - let result = bls12_381_pairing_equality(&[12], &[0; 96], &[12], &[12]); assert!(matches!( result, diff --git a/packages/crypto/src/errors.rs b/packages/crypto/src/errors.rs index 067b583e80..bd3a6ccc41 100644 --- a/packages/crypto/src/errors.rs +++ b/packages/crypto/src/errors.rs @@ -21,10 +21,6 @@ pub enum Aggregation { #[derive(Debug, Display)] #[cfg_attr(feature = "std", derive(thiserror::Error))] pub enum PairingEquality { - #[display("List of G1 points is empty")] - EmptyG1, - #[display("List of G2 points is empty")] - EmptyG2, #[display("List is not a multiple of 48. Remainder: {remainder}")] NotMultipleG1 { remainder: usize }, #[display("List is not a multiple of 96. Remainder: {remainder}")] @@ -139,22 +135,14 @@ impl CryptoError { source: PairingEquality::UnequalPointAmount { .. }, .. } => 13, - CryptoError::PairingEquality { - source: PairingEquality::EmptyG1 { .. }, - .. - } => 14, - CryptoError::PairingEquality { - source: PairingEquality::EmptyG2 { .. }, - .. - } => 15, CryptoError::Aggregation { source: Aggregation::Empty, .. - } => 16, + } => 14, CryptoError::Aggregation { source: Aggregation::NotMultiple { .. }, .. - } => 17, + } => 15, } } } diff --git a/packages/std/src/imports.rs b/packages/std/src/imports.rs index 0c19a8bf35..4bdeffcc19 100644 --- a/packages/std/src/imports.rs +++ b/packages/std/src/imports.rs @@ -428,10 +428,10 @@ impl Api for ExternalApi { match result { 0 => Ok(point), 8 => Err(VerificationError::InvalidPoint), - 16 => Err(VerificationError::Aggregation { + 14 => Err(VerificationError::Aggregation { source: AggregationError::Empty, }), - 17 => Err(VerificationError::Aggregation { + 15 => Err(VerificationError::Aggregation { source: AggregationError::NotMultiple, }), error_code => Err(VerificationError::unknown_err(error_code)), @@ -471,12 +471,6 @@ impl Api for ExternalApi { 13 => Err(VerificationError::PairingEquality { source: PairingEqualityError::UnequalPointAmount, }), - 14 => Err(VerificationError::PairingEquality { - source: PairingEqualityError::EmptyG1, - }), - 15 => Err(VerificationError::PairingEquality { - source: PairingEqualityError::EmptyG2, - }), error_code => Err(VerificationError::unknown_err(error_code)), } } From 1bcf5b01b5e2d26c129eca10897fa07e9ef4d413 Mon Sep 17 00:00:00 2001 From: Aumetra Weisman Date: Fri, 10 May 2024 13:30:02 +0200 Subject: [PATCH 76/79] Document bitwise OR operation --- packages/crypto/src/bls12_318/constants.rs | 8 ++++++++ 1 file changed, 8 insertions(+) diff --git a/packages/crypto/src/bls12_318/constants.rs b/packages/crypto/src/bls12_318/constants.rs index 9ee0f4ad68..8281719cf5 100644 --- a/packages/crypto/src/bls12_318/constants.rs +++ b/packages/crypto/src/bls12_318/constants.rs @@ -53,6 +53,14 @@ mod test { point } + // Note about the bitwise OR operation on the X coordinates: + // + // The first bit of the x-coordinate sets the "compression" flag. The most significant three bits of a G1/G2 coordinate are used for storing some information. + // If we didn't do that to the output, the constants wouldn't check out due to the constants being constructed by a standard adhereing BLS library, + // where it set the compression flag since it's the standard way of serializing the points. + // + // Ref: https://github.com/zcash/librustzcash/blob/6e0364cd42a2b3d2b958a54771ef51a8db79dd29/pairing/src/bls12_381/README.md#serialization + #[test] fn g1_generator_correct() { // Source: From 2eb1b923bfd86faf1c6c1246cd8328ffe025de65 Mon Sep 17 00:00:00 2001 From: Aumetra Weisman Date: Fri, 10 May 2024 14:56:00 +0200 Subject: [PATCH 77/79] Adjust gas values, move out variables --- packages/vm/src/environment.rs | 2 +- packages/vm/src/imports.rs | 25 +++++++++++++------------ 2 files changed, 14 insertions(+), 13 deletions(-) diff --git a/packages/vm/src/environment.rs b/packages/vm/src/environment.rs index 98641dac70..e30a0877e2 100644 --- a/packages/vm/src/environment.rs +++ b/packages/vm/src/environment.rs @@ -85,7 +85,7 @@ impl Default for GasConfig { bls12_381_hash_to_g1_cost: 324 * GAS_PER_US, bls12_381_hash_to_g2_cost: 528 * GAS_PER_US, // god i wish i was lying - bls12_381_pairing_equality_cost: 1254 * GAS_PER_US, + bls12_381_pairing_equality_cost: 1038 * GAS_PER_US, bls12_381_aggregated_pairing_equality_cost_per_pair: 108 * GAS_PER_US, } } diff --git a/packages/vm/src/imports.rs b/packages/vm/src/imports.rs index 33469d9cb0..ef86c276db 100644 --- a/packages/vm/src/imports.rs +++ b/packages/vm/src/imports.rs @@ -276,9 +276,9 @@ pub fn do_bls12_381_aggregate_g1< let g1s = read_region(&memory, g1s_ptr, BLS12_381_MAX_AGGREGATE_SIZE)?; + let estimated_point_count = (g1s.len() / BLS12_381_G1_POINT_LEN) as u64; let gas_info = GasInfo::with_cost( - data.gas_config.bls12_381_aggregate_g1_per_point - * (g1s.len() / BLS12_381_G1_POINT_LEN) as u64, + data.gas_config.bls12_381_aggregate_g1_per_point * estimated_point_count, ); process_gas_info(data, &mut store, gas_info)?; @@ -320,9 +320,9 @@ pub fn do_bls12_381_aggregate_g2< let g2s = read_region(&memory, g2s_ptr, BLS12_381_MAX_AGGREGATE_SIZE)?; + let estimated_point_count = (g2s.len() / BLS12_381_G2_POINT_LEN) as u64; let gas_info = GasInfo::with_cost( - data.gas_config.bls12_381_aggregate_g2_per_point - * (g2s.len() / BLS12_381_G2_POINT_LEN) as u64, + data.gas_config.bls12_381_aggregate_g2_per_point * estimated_point_count, ); process_gas_info(data, &mut store, gas_info)?; @@ -369,14 +369,15 @@ pub fn do_bls12_381_pairing_equality< let r = read_region(&memory, r_ptr, BLS12_381_G1_POINT_LEN)?; let s = read_region(&memory, s_ptr, BLS12_381_G2_POINT_LEN)?; - let gas_info = GasInfo::with_cost( - data.gas_config.bls12_381_pairing_equality_cost - // Subtract one since the base benchmark of the pairing equality cost includes a single pair already - + (data - .gas_config - .bls12_381_aggregated_pairing_equality_cost_per_pair - * (ps.len() / BLS12_381_G1_POINT_LEN) as u64).saturating_sub(1), - ); + let estimated_point_count = (ps.len() / BLS12_381_G1_POINT_LEN) as u64; + let additional_cost = data + .gas_config + .bls12_381_aggregated_pairing_equality_cost_per_pair + // Add one since we do not include any pairs in the base benchmark, and we always need to add one for the `r` and `s` pair. + * (estimated_point_count + 1); + + let gas_info = + GasInfo::with_cost(data.gas_config.bls12_381_pairing_equality_cost + additional_cost); process_gas_info(data, &mut store, gas_info)?; let code = match bls12_381_pairing_equality(&ps, &qs, &r, &s) { From e326ea867c02ed564e8c1905eefbf672aa2e9b34 Mon Sep 17 00:00:00 2001 From: Aumetra Weisman Date: Fri, 10 May 2024 15:12:11 +0200 Subject: [PATCH 78/79] Port to new region system --- packages/std/src/imports.rs | 56 ++++++++++++++++++------------------- 1 file changed, 28 insertions(+), 28 deletions(-) diff --git a/packages/std/src/imports.rs b/packages/std/src/imports.rs index 4bdeffcc19..6647585945 100644 --- a/packages/std/src/imports.rs +++ b/packages/std/src/imports.rs @@ -396,11 +396,11 @@ impl Api for ExternalApi { fn bls12_381_aggregate_g1(&self, g1s: &[u8]) -> Result<[u8; 48], VerificationError> { let point = [0_u8; 48]; - let send = build_region(g1s); - let send_ptr = &*send as *const Region as u32; + let send = Region::from_slice(g1s); + let send_ptr = send.as_ptr() as u32; - let out = build_region(&point[..]); - let out_ptr = &*out as *const Region as u32; + let out = Region::from_slice(&point); + let out_ptr = out.as_ptr() as u32; let result = unsafe { bls12_381_aggregate_g1(send_ptr, out_ptr) }; match result { 0 => Ok(point), @@ -419,11 +419,11 @@ impl Api for ExternalApi { fn bls12_381_aggregate_g2(&self, g2s: &[u8]) -> Result<[u8; 96], VerificationError> { let point = [0_u8; 96]; - let send = build_region(g2s); - let send_ptr = &*send as *const Region as u32; + let send = Region::from_slice(g2s); + let send_ptr = send.as_ptr() as u32; - let out = build_region(&point[..]); - let out_ptr = &*out as *const Region as u32; + let out = Region::from_slice(&point); + let out_ptr = out.as_ptr() as u32; let result = unsafe { bls12_381_aggregate_g2(send_ptr, out_ptr) }; match result { 0 => Ok(point), @@ -446,15 +446,15 @@ impl Api for ExternalApi { r: &[u8], s: &[u8], ) -> Result { - let send_ps = build_region(ps); - let send_qs = build_region(qs); - let send_r = build_region(r); - let send_s = build_region(s); + let send_ps = Region::from_slice(ps); + let send_qs = Region::from_slice(qs); + let send_r = Region::from_slice(r); + let send_s = Region::from_slice(s); - let send_ps_ptr = &*send_ps as *const Region as u32; - let send_qs_ptr = &*send_qs as *const Region as u32; - let send_r_ptr = &*send_r as *const Region as u32; - let send_s_ptr = &*send_s as *const Region as u32; + let send_ps_ptr = send_ps.as_ptr() as u32; + let send_qs_ptr = send_qs.as_ptr() as u32; + let send_r_ptr = send_r.as_ptr() as u32; + let send_s_ptr = send_s.as_ptr() as u32; let result = unsafe { bls12_381_pairing_equality(send_ps_ptr, send_qs_ptr, send_r_ptr, send_s_ptr) }; @@ -484,14 +484,14 @@ impl Api for ExternalApi { ) -> Result<[u8; 48], VerificationError> { let point = [0_u8; 48]; - let send_msg = build_region(msg); - let send_msg_ptr = &*send_msg as *const Region as u32; + let send_msg = Region::from_slice(msg); + let send_msg_ptr = send_msg.as_ptr() as u32; - let send_dst = build_region(dst); - let send_dst_ptr = &*send_dst as *const Region as u32; + let send_dst = Region::from_slice(dst); + let send_dst_ptr = send_dst.as_ptr() as u32; - let out = build_region(&point[..]); - let out_ptr = &*out as *const Region as u32; + let out = Region::from_slice(&point); + let out_ptr = out.as_ptr() as u32; let result = unsafe { bls12_381_hash_to_g1(hash_function as u32, send_msg_ptr, send_dst_ptr, out_ptr) }; @@ -512,14 +512,14 @@ impl Api for ExternalApi { ) -> Result<[u8; 96], VerificationError> { let point = [0_u8; 96]; - let send_msg = build_region(msg); - let send_msg_ptr = &*send_msg as *const Region as u32; + let send_msg = Region::from_slice(msg); + let send_msg_ptr = send_msg.as_ptr() as u32; - let send_dst = build_region(dst); - let send_dst_ptr = &*send_dst as *const Region as u32; + let send_dst = Region::from_slice(dst); + let send_dst_ptr = send_dst.as_ptr() as u32; - let out = build_region(&point[..]); - let out_ptr = &*out as *const Region as u32; + let out = Region::from_slice(&point); + let out_ptr = out.as_ptr() as u32; let result = unsafe { bls12_381_hash_to_g2(hash_function as u32, send_msg_ptr, send_dst_ptr, out_ptr) }; From 62df0e2b3aad3267a7c32369437ada92333f0cf2 Mon Sep 17 00:00:00 2001 From: Simon Warta Date: Fri, 10 May 2024 22:31:10 +0200 Subject: [PATCH 79/79] Add test pairing_equality_works_for_empty_lhs --- packages/crypto/src/bls12_318/pairing.rs | 48 ++++++++++++++++++++++++ 1 file changed, 48 insertions(+) diff --git a/packages/crypto/src/bls12_318/pairing.rs b/packages/crypto/src/bls12_318/pairing.rs index d3821db0b0..6e630722cc 100644 --- a/packages/crypto/src/bls12_318/pairing.rs +++ b/packages/crypto/src/bls12_318/pairing.rs @@ -81,6 +81,24 @@ mod test { /// Public key League of Entropy Mainnet (curl -sS https://drand.cloudflare.com/info) const PK_LEO_MAINNET: [u8; 48] = hex!("868f005eb8e6e4ca0a47c8a77ceaa5309a47978a7c71bc5cce96366b5d7a569937c529eeda66c7293784a9402801af31"); + /// The identity of G1 (the point at infinity). + /// + /// See https://docs.rs/bls12_381/latest/bls12_381/notes/serialization/index.html for encoding info. + const G1_IDENTITY: [u8; 48] = [ + 0b11000000, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + ]; + + /// The identity of G2 (the point at infinity). + /// + /// See https://docs.rs/bls12_381/latest/bls12_381/notes/serialization/index.html for encoding info. + const G2_IDENTITY: [u8; 96] = [ + 0b11000000, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, + ]; + fn build_message(round: u64, previous_signature: &[u8]) -> digest::Output { Sha256::new() .chain_update(previous_signature) @@ -153,6 +171,36 @@ mod test { .unwrap()); } + /// This tests 1 == e(a, b) as there is no term on the left-hand side. + /// This is true for `a` or `b` being the point at infinity. See + /// https://eips.ethereum.org/EIPS/eip-2537#test-cases + #[test] + fn pairing_equality_works_for_empty_lhs() { + // a and b not point at infinity (Non-degeneracy) + let a = PK_LEO_MAINNET; + let b = bls12_381_hash_to_g2(HashFunction::Sha256, b"blub", DOMAIN_HASH_TO_G2); + let equal = bls12_381_pairing_equality(&[], &[], &a, &b).unwrap(); + assert!(!equal); + + // a point at infinity + let a = G1_IDENTITY; + let b = bls12_381_hash_to_g2(HashFunction::Sha256, b"blub", DOMAIN_HASH_TO_G2); + let equal = bls12_381_pairing_equality(&[], &[], &a, &b).unwrap(); + assert!(equal); + + // b point at infinity + let a = PK_LEO_MAINNET; + let b = G2_IDENTITY; + let equal = bls12_381_pairing_equality(&[], &[], &a, &b).unwrap(); + assert!(equal); + + // a and b point at infinity + let a = G1_IDENTITY; + let b = G2_IDENTITY; + let equal = bls12_381_pairing_equality(&[], &[], &a, &b).unwrap(); + assert!(equal); + } + #[test] fn pairing_equality_error_cases_work() { let result = bls12_381_pairing_equality(&[12], &[0; 96], &[12], &[12]);