From 65119cb4a427fa70f2012f159f2c2c5dc90e4685 Mon Sep 17 00:00:00 2001 From: Oleksandr Tkachenko Date: Wed, 5 Jun 2024 14:29:06 +0000 Subject: [PATCH] use custom k256 for BIP340 --- Cargo.lock | 462 ++++++++++++++++++++++++++----------------------- Cargo.toml | 10 +- src/lib.rs | 65 +++---- tests/tests.rs | 42 ++--- 4 files changed, 299 insertions(+), 280 deletions(-) diff --git a/Cargo.lock b/Cargo.lock index fbab260..657ca18 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -76,6 +76,12 @@ dependencies = [ "syn 2.0.55", ] +[[package]] +name = "atomic-waker" +version = "1.1.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1505bd5d3d116872e7271a6d4e16d81d0c8570876c8de68093a09ac269d8aac0" + [[package]] name = "autocfg" version = "1.2.0" @@ -111,9 +117,9 @@ checksum = "9e1b586273c5702936fe7b7d6896644d8be71e6314cfe09d3167c95f712589e8" [[package]] name = "base64" -version = "0.21.7" +version = "0.22.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9d297deb1925b89f2ccc13d7635fa0714f12c87adce1c75356b39ca9b7178567" +checksum = "72b3254f16251a8381aa12e40e3c4d2f0199f8c6508fbecb9d91f575e0fbb8c6" [[package]] name = "base64ct" @@ -121,12 +127,6 @@ version = "1.6.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "8c3c1a368f70d6cf7302d78f8f7093da241fb8e8807c05cc9e51a125895a6d5b" -[[package]] -name = "bech32" -version = "0.10.0-beta" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "98f7eed2b2781a6f0b5c903471d48e15f56fb4e1165df8a9a2337fd1a59d45ea" - [[package]] name = "bincode" version = "1.3.3" @@ -167,7 +167,7 @@ checksum = "7e141fb0f8be1c7b45887af94c88b182472b57c96b56773250ae00cd6a14a164" dependencies = [ "bs58", "hmac", - "k256", + "k256 0.13.3 (registry+https://github.com/rust-lang/crates.io-index)", "once_cell", "pbkdf2", "rand_core", @@ -177,47 +177,12 @@ dependencies = [ "zeroize", ] -[[package]] -name = "bitcoin" -version = "0.31.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6c85783c2fe40083ea54a33aa2f0ba58831d90fcd190f5bdc47e74e84d2a96ae" -dependencies = [ - "bech32", - "bitcoin-internals", - "bitcoin_hashes 0.13.0", - "hex-conservative 0.1.1", - "hex_lit", - "secp256k1 0.28.2", - "serde", -] - -[[package]] -name = "bitcoin-internals" -version = "0.2.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9425c3bf7089c983facbae04de54513cce73b41c7f9ff8c845b54e7bc64ebbfb" -dependencies = [ - "serde", -] - [[package]] name = "bitcoin-io" version = "0.1.2" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "340e09e8399c7bd8912f495af6aa58bea0c9214773417ffaa8f6460f93aaee56" -[[package]] -name = "bitcoin_hashes" -version = "0.13.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1930a4dabfebb8d7d9992db18ebe3ae2876f0a305fab206fd168df931ede293b" -dependencies = [ - "bitcoin-internals", - "hex-conservative 0.1.1", - "serde", -] - [[package]] name = "bitcoin_hashes" version = "0.14.0" @@ -225,14 +190,14 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "bb18c03d0db0247e147a21a6faafd5a7eb851c743db062de72018b6b7e8e4d16" dependencies = [ "bitcoin-io", - "hex-conservative 0.2.0", + "hex-conservative", ] [[package]] name = "bitflags" -version = "1.3.2" +version = "2.5.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "bef38d45163c2f1dde094a7dfd33ccf595c92905c8f8f4fdc18d06fb1037718a" +checksum = "cf4b9d6a944f767f8e5e0db018570623c85f3d925ac718db4e06d0187adb21c1" [[package]] name = "block-buffer" @@ -655,15 +620,6 @@ dependencies = [ "zeroize", ] -[[package]] -name = "encoding_rs" -version = "0.8.33" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7268b386296a025e474d5140678f75d6de9493ae55a5d709eeb9dd08149945e1" -dependencies = [ - "cfg-if", -] - [[package]] name = "equivalent" version = "1.0.1" @@ -708,6 +664,16 @@ version = "0.2.7" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "c007b1ae3abe1cb6f85a16305acd418b7ca6343b953633fee2b76d8f108b830f" +[[package]] +name = "flate2" +version = "1.0.30" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5f54427cfd1c7829e2a139fcefea601bf088ebca651d2bf53ebc600eac295dae" +dependencies = [ + "crc32fast", + "miniz_oxide", +] + [[package]] name = "fnv" version = "1.0.7" @@ -853,15 +819,15 @@ dependencies = [ [[package]] name = "h2" -version = "0.3.25" +version = "0.4.5" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4fbd2820c5e49886948654ab546d0688ff24530286bdcf8fca3cefb16d4618eb" +checksum = "fa82e28a107a8cc405f0839610bdc9b15f1e25ec7d696aa5cf173edbcb1486ab" dependencies = [ + "atomic-waker", "bytes", "fnv", "futures-core", "futures-sink", - "futures-util", "http", "indexmap", "slab", @@ -888,6 +854,12 @@ version = "0.4.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "95505c38b4572b2d910cecb0281560f54b440a19336cbbcb27bf6ce6adc6f5a8" +[[package]] +name = "hermit-abi" +version = "0.3.9" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d231dfb89cfffdbc30e7fc41579ed6066ad03abda9e567ccafae602b97ec5024" + [[package]] name = "hex" version = "0.4.3" @@ -897,12 +869,6 @@ dependencies = [ "serde", ] -[[package]] -name = "hex-conservative" -version = "0.1.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "30ed443af458ccb6d81c1e7e661545f94d3176752fb1df2f543b902a1e0f51e2" - [[package]] name = "hex-conservative" version = "0.2.0" @@ -918,12 +884,6 @@ version = "0.4.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "6fe2267d4ed49bc07b63801559be28c718ea06c4738b7a03c94df7386d2cde46" -[[package]] -name = "hex_lit" -version = "0.1.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3011d1213f159867b13cfd6ac92d2cd5f1345762c63be3554e84092d85a50bbd" - [[package]] name = "hmac" version = "0.12.1" @@ -941,9 +901,9 @@ checksum = "e4ce1f4656bae589a3fab938f9f09bf58645b7ed01a2c5f8a3c238e01a4ef78a" [[package]] name = "http" -version = "0.2.12" +version = "1.1.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "601cbb57e577e2f5ef5be8e7b83f0f63994f25aa94d673e54a92d5c516d101f1" +checksum = "21b9ddb458710bc376481b842f5da65cdf31522de232c1ca8146abce2a358258" dependencies = [ "bytes", "fnv", @@ -952,12 +912,24 @@ dependencies = [ [[package]] name = "http-body" -version = "0.4.6" +version = "1.0.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1cac85db508abc24a2e48553ba12a996e87244a0395ce011e62b37158745d643" +dependencies = [ + "bytes", + "http", +] + +[[package]] +name = "http-body-util" +version = "0.1.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7ceab25649e9960c0311ea418d17bee82c0dcec1bd053b5f9a66e265a693bed2" +checksum = "0475f8b2ac86659c21b64320d5d653f9efe42acd2a4e560073ec61a155a34f1d" dependencies = [ "bytes", + "futures-core", "http", + "http-body", "pin-project-lite", ] @@ -967,48 +939,61 @@ version = "1.8.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "d897f394bad6a705d5f4104762e116a75639e470d80901eed05a860a95cb1904" -[[package]] -name = "httpdate" -version = "1.0.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "df3b46402a9d5adb4c86a0cf463f42e19994e3ee891101b1841f30a545cb49a9" - [[package]] name = "hyper" -version = "0.14.28" +version = "1.3.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "bf96e135eb83a2a8ddf766e426a841d8ddd7449d5f00d34ea02b41d2f19eef80" +checksum = "fe575dd17d0862a9a33781c8c4696a55c320909004a67a00fb286ba8b1bc496d" dependencies = [ "bytes", "futures-channel", - "futures-core", "futures-util", "h2", "http", "http-body", "httparse", - "httpdate", "itoa", "pin-project-lite", - "socket2", + "smallvec", "tokio", - "tower-service", - "tracing", "want", ] [[package]] name = "hyper-rustls" -version = "0.24.2" +version = "0.26.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ec3efd23720e2049821a693cbc7e65ea87c72f1c58ff2f9522ff332b1491e590" +checksum = "a0bea761b46ae2b24eb4aef630d8d1c398157b6fc29e6350ecf090a0b70c952c" dependencies = [ "futures-util", "http", "hyper", + "hyper-util", "rustls", + "rustls-pki-types", "tokio", "tokio-rustls", + "tower-service", +] + +[[package]] +name = "hyper-util" +version = "0.1.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7b875924a60b96e5d7b9ae7b066540b1dd1cbd90d1828f54c92e02a283351c56" +dependencies = [ + "bytes", + "futures-channel", + "futures-util", + "http", + "http-body", + "hyper", + "pin-project-lite", + "socket2", + "tokio", + "tower", + "tower-service", + "tracing", ] [[package]] @@ -1073,19 +1058,6 @@ dependencies = [ "serde_bytes", ] -[[package]] -name = "ic-cdk" -version = "0.12.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e4ec8231f413b8a4d74b99d7df26d6e917d6528a6245abde27f251210dcf9b72" -dependencies = [ - "candid", - "ic-cdk-macros 0.8.4", - "ic0", - "serde", - "serde_bytes", -] - [[package]] name = "ic-cdk" version = "0.13.2" @@ -1093,26 +1065,12 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "f8859bc2b863a77750acf199e1fb7e3fc403e1b475855ba13f59cb4e4036d238" dependencies = [ "candid", - "ic-cdk-macros 0.13.2", + "ic-cdk-macros", "ic0", "serde", "serde_bytes", ] -[[package]] -name = "ic-cdk-macros" -version = "0.8.4" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a5a618e4020cea88e933d8d2f8c7f86d570ec06213506a80d4f2c520a9bba512" -dependencies = [ - "candid", - "proc-macro2", - "quote", - "serde", - "serde_tokenstream", - "syn 1.0.109", -] - [[package]] name = "ic-cdk-macros" version = "0.13.2" @@ -1134,7 +1092,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "054727a3a1c486528b96349817d54290ff70df6addf417def456ea708a16f7fb" dependencies = [ "futures", - "ic-cdk 0.13.2", + "ic-cdk", "ic0", "serde", "serde_bytes", @@ -1197,7 +1155,7 @@ dependencies = [ "ic-crypto-secrets-containers", "ic-crypto-sha2", "ic-types", - "k256", + "k256 0.13.3 (registry+https://github.com/rust-lang/crates.io-index)", "lazy_static", "p256", "paste", @@ -1449,6 +1407,19 @@ dependencies = [ "signature", ] +[[package]] +name = "k256" +version = "0.13.3" +source = "git+https://github.com/altkdf/elliptic-curves?branch=schnorr_canister#01d6e705afb663487cf61226e087c6874fac72a0" +dependencies = [ + "cfg-if", + "ecdsa", + "elliptic-curve", + "once_cell", + "sha2", + "signature", +] + [[package]] name = "lazy_static" version = "1.4.0" @@ -1509,16 +1480,6 @@ version = "0.3.17" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "6877bb514081ee2a7ff5ef9de3281f14a4dd4bceac4c09388074a6b5df8a139a" -[[package]] -name = "mime_guess" -version = "2.0.4" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4192263c238a5f0d0c6bfd21f336a313a4ce1c450542449ca191bb657b4642ef" -dependencies = [ - "mime", - "unicase", -] - [[package]] name = "miniz_oxide" version = "0.7.2" @@ -1614,6 +1575,16 @@ dependencies = [ "libm", ] +[[package]] +name = "num_cpus" +version = "1.16.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4161fcb6d602d4d2081af7c3a45852d875a03dd337a6bfdd6e06407b61342a43" +dependencies = [ + "hermit-abi", + "libc", +] + [[package]] name = "object" version = "0.32.2" @@ -1629,6 +1600,12 @@ version = "1.19.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "3fdb12b2476b595f9358c5161aa467c2438859caa136dec86c26fdd2efe17b92" +[[package]] +name = "openssl-probe" +version = "0.1.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ff011a302c396a5197692431fc1948019154afc178baf7d8e37367442a4601cf" + [[package]] name = "overload" version = "0.1.1" @@ -1688,6 +1665,26 @@ dependencies = [ "slog", ] +[[package]] +name = "pin-project" +version = "1.1.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b6bf43b791c5b9e34c3d182969b4abb522f9343702850a2e57f460d00d09b4b3" +dependencies = [ + "pin-project-internal", +] + +[[package]] +name = "pin-project-internal" +version = "1.1.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2f38a4412a78282e09a2cf38d195ea5420d15ba0602cb375210efbc877243965" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.55", +] + [[package]] name = "pin-project-lite" version = "0.2.13" @@ -1718,15 +1715,15 @@ checksum = "db23d408679286588f4d4644f965003d056e3dd5abcaaa938116871d7ce2fee7" [[package]] name = "pocket-ic" -version = "2.2.0" +version = "3.1.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "07c030c06d9d1b3fb0055f41b4b12ecaa5c8e1c60818d2541c3d3e64a9f55ea3" +checksum = "f9765eeff77b8750cf6258eaeea237b96607cd770aa3d4003f021924192b7e4e" dependencies = [ "async-trait", "base64 0.13.1", "candid", "hex", - "ic-cdk 0.12.0", + "ic-cdk", "reqwest", "schemars", "serde", @@ -1905,37 +1902,40 @@ checksum = "adad44e29e4c806119491a7f06f03de4d1af22c3a680dd47f1e6e179439d1f56" [[package]] name = "reqwest" -version = "0.11.27" +version = "0.12.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "dd67538700a17451e7cba03ac727fb961abb7607553461627b97de0b89cf4a62" +checksum = "566cafdd92868e0939d3fb961bd0dc25fcfaaed179291093b3d43e6b3150ea10" dependencies = [ - "base64 0.21.7", + "base64 0.22.1", "bytes", - "encoding_rs", + "futures-channel", "futures-core", "futures-util", "h2", "http", "http-body", + "http-body-util", "hyper", "hyper-rustls", + "hyper-util", "ipnet", "js-sys", "log", "mime", - "mime_guess", "once_cell", "percent-encoding", "pin-project-lite", "rustls", + "rustls-native-certs", "rustls-pemfile", + "rustls-pki-types", "serde", "serde_json", "serde_urlencoded", "sync_wrapper", - "system-configuration", "tokio", "tokio-rustls", + "tokio-socks", "tokio-util", "tower-service", "url", @@ -1998,32 +1998,55 @@ dependencies = [ [[package]] name = "rustls" -version = "0.21.10" +version = "0.22.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f9d5a6813c0759e4609cd494e8e725babae6a2ca7b62a5536a13daaec6fcb7ba" +checksum = "bf4ef73721ac7bcd79b2b315da7779d8fc09718c6b3d2d1b2d94850eb8c18432" dependencies = [ "log", "ring", + "rustls-pki-types", "rustls-webpki", - "sct", + "subtle", + "zeroize", +] + +[[package]] +name = "rustls-native-certs" +version = "0.7.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8f1fb85efa936c42c6d5fc28d2629bb51e4b2f4b8a5211e297d599cc5a093792" +dependencies = [ + "openssl-probe", + "rustls-pemfile", + "rustls-pki-types", + "schannel", + "security-framework", ] [[package]] name = "rustls-pemfile" -version = "1.0.4" +version = "2.1.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1c74cae0a4cf6ccbbf5f359f08efdf8ee7e1dc532573bf0db71968cb56b1448c" +checksum = "29993a25686778eb88d4189742cd713c9bce943bc54251a33509dc63cbacf73d" dependencies = [ - "base64 0.21.7", + "base64 0.22.1", + "rustls-pki-types", ] +[[package]] +name = "rustls-pki-types" +version = "1.7.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "976295e77ce332211c0d24d92c0e83e50f5c5f046d11082cea19f3df13a3562d" + [[package]] name = "rustls-webpki" -version = "0.101.7" +version = "0.102.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8b6275d1ee7a1cd780b64aca7726599a1dbc893b1e64144529e55c3c2f745765" +checksum = "ff448f7e92e913c4b7d4c6d8e4540a1724b319b4152b8aef6d4cf8339712b33e" dependencies = [ "ring", + "rustls-pki-types", "untrusted", ] @@ -2039,6 +2062,15 @@ version = "1.0.17" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "e86697c916019a8588c99b5fac3cead74ec0b4b819707a682fd4d23fa0ce1ba1" +[[package]] +name = "schannel" +version = "0.1.23" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "fbc91545643bcf3a0bbb6569265615222618bdf33ce4ffbbd13c4bbd4c093534" +dependencies = [ + "windows-sys 0.52.0", +] + [[package]] name = "schemars" version = "0.8.16" @@ -2068,18 +2100,19 @@ name = "schnorr_canister" version = "0.1.0" dependencies = [ "bip32", - "bitcoin", - "bitcoin_hashes 0.14.0", + "bitcoin_hashes", "candid", "ed25519-dalek", + "flate2", "getrandom", "hmac-sha512", - "ic-cdk 0.13.2", + "ic-cdk", "ic-cdk-timers", "ic-crypto-extended-bip32", "ic-stable-structures", + "k256 0.13.3 (git+https://github.com/altkdf/elliptic-curves?branch=schnorr_canister)", "pocket-ic", - "secp256k1 0.29.0", + "secp256k1", "serde", "serde_bytes", "serde_json", @@ -2091,16 +2124,6 @@ version = "0.1.9" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "1d51f5df5af43ab3f1360b429fa5e0152ac5ce8c0bd6485cae490332e96846a8" -[[package]] -name = "sct" -version = "0.7.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "da046153aa2352493d6cb7da4b6e5c0c057d8a1d0a9aa8560baffdd945acd414" -dependencies = [ - "ring", - "untrusted", -] - [[package]] name = "sec1" version = "0.7.3" @@ -2117,40 +2140,43 @@ dependencies = [ [[package]] name = "secp256k1" -version = "0.28.2" +version = "0.29.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d24b59d129cdadea20aea4fb2352fa053712e5d713eee47d700cd4b2bc002f10" +checksum = "0e0cc0f1cf93f4969faf3ea1c7d8a9faed25918d96affa959720823dfe86d4f3" dependencies = [ - "bitcoin_hashes 0.13.0", - "secp256k1-sys 0.9.2", - "serde", + "secp256k1-sys", ] [[package]] -name = "secp256k1" -version = "0.29.0" +name = "secp256k1-sys" +version = "0.10.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0e0cc0f1cf93f4969faf3ea1c7d8a9faed25918d96affa959720823dfe86d4f3" +checksum = "1433bd67156263443f14d603720b082dd3121779323fce20cba2aa07b874bc1b" dependencies = [ - "secp256k1-sys 0.10.0", + "cc", ] [[package]] -name = "secp256k1-sys" -version = "0.9.2" +name = "security-framework" +version = "2.11.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e5d1746aae42c19d583c3c1a8c646bfad910498e2051c551a7f2e3c0c9fbb7eb" +checksum = "c627723fd09706bacdb5cf41499e95098555af3c3c29d014dc3c458ef6be11c0" dependencies = [ - "cc", + "bitflags", + "core-foundation", + "core-foundation-sys", + "libc", + "security-framework-sys", ] [[package]] -name = "secp256k1-sys" -version = "0.10.0" +name = "security-framework-sys" +version = "2.11.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1433bd67156263443f14d603720b082dd3121779323fce20cba2aa07b874bc1b" +checksum = "317936bbbd05227752583946b9e66d7ce3b489f84e11a94a510b4437fef407d7" dependencies = [ - "cc", + "core-foundation-sys", + "libc", ] [[package]] @@ -2435,27 +2461,6 @@ version = "0.1.2" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "2047c6ded9c721764247e62cd3b03c09ffc529b2ba5b10ec482ae507a4a70160" -[[package]] -name = "system-configuration" -version = "0.5.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ba3a3adc5c275d719af8cb4272ea1c4a6d668a777f37e115f6d11ddbc1c8e0e7" -dependencies = [ - "bitflags", - "core-foundation", - "system-configuration-sys", -] - -[[package]] -name = "system-configuration-sys" -version = "0.5.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a75fb188eb626b924683e3b95e3a48e63551fcfb51949de2f06a9d91dbee93c9" -dependencies = [ - "core-foundation-sys", - "libc", -] - [[package]] name = "thiserror" version = "1.0.58" @@ -2548,6 +2553,7 @@ dependencies = [ "bytes", "libc", "mio", + "num_cpus", "pin-project-lite", "socket2", "windows-sys 0.48.0", @@ -2555,11 +2561,24 @@ dependencies = [ [[package]] name = "tokio-rustls" -version = "0.24.1" +version = "0.25.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c28327cf380ac148141087fbfb9de9d7bd4e84ab5d2c28fbc911d753de8a7081" +checksum = "775e0c0f0adb3a2f22a00c4745d728b479985fc15ee7ca6a2608388c5569860f" dependencies = [ "rustls", + "rustls-pki-types", + "tokio", +] + +[[package]] +name = "tokio-socks" +version = "0.5.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "51165dfa029d2a65969413a6cc96f354b86b464498702f174a4efa13608fd8c0" +dependencies = [ + "either", + "futures-util", + "thiserror", "tokio", ] @@ -2577,6 +2596,27 @@ dependencies = [ "tracing", ] +[[package]] +name = "tower" +version = "0.4.13" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b8fa9be0de6cf49e536ce1851f987bd21a43b771b09473c3549a6c853db37c1c" +dependencies = [ + "futures-core", + "futures-util", + "pin-project", + "pin-project-lite", + "tokio", + "tower-layer", + "tower-service", +] + +[[package]] +name = "tower-layer" +version = "0.3.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c20c8dbed6283a09604c3e69b4b7eeb54e298b8a600d4d5ecb5ad39de609f1d0" + [[package]] name = "tower-service" version = "0.3.2" @@ -2687,15 +2727,6 @@ version = "1.17.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "42ff0bf0c66b8238c6f3b578df37d0b7848e55df8577b3f74f92a69acceeb825" -[[package]] -name = "unicase" -version = "2.7.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f7d2d4dafb69621809a81864c9c1b864479e1235c0dd4e199924b9742439ed89" -dependencies = [ - "version_check", -] - [[package]] name = "unicode-bidi" version = "0.3.15" @@ -2870,9 +2901,12 @@ dependencies = [ [[package]] name = "webpki-roots" -version = "0.25.4" +version = "0.26.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5f20c57d8d7db6d3b86154206ae5d8fba62dd39573114de97c2cb0578251f8e1" +checksum = "3c452ad30530b54a4d8e71952716a212b08efd0f3562baa66c29a618b07da7c3" +dependencies = [ + "rustls-pki-types", +] [[package]] name = "winapi" @@ -3039,9 +3073,9 @@ checksum = "32b752e52a2da0ddfbdbcc6fceadfeede4c939ed16d13e648833a61dfb611ed8" [[package]] name = "winreg" -version = "0.50.0" +version = "0.52.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "524e57b2c537c0f9b1e69f1965311ec12182b4122e45035b1508cd24d2adadb1" +checksum = "a277a57398d4bfa075df44f501a17cfdf8542d224f0d36095a2adc7aee4ef0a5" dependencies = [ "cfg-if", "windows-sys 0.48.0", diff --git a/Cargo.toml b/Cargo.toml index 6cd0ae8..185fc66 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -8,17 +8,17 @@ resolver = "2" [lib] name = "schnorr_canister" -crate-type = ["lib", "cdylib"] +crate-type = ["lib"] [dependencies] bip32 = { version = "0.5.1", features = ["k256"] } -bitcoin = { version = "0.31.2", features = ["serde"] } candid = "0.10.6" ic-cdk = "0.13.1" ic-cdk-timers = "0.7.0" ic-crypto-extended-bip32 = { git = "https://github.com/dfinity/ic/", tag = "release-2024-03-27_23-01-p2p-ecdsa-fix" } ic-stable-structures = "0.6" getrandom = { version = "0.2.12", features = ["custom"] } +k256 = { git = "https://github.com/altkdf/elliptic-curves", branch = "schnorr_canister", features = ["schnorr"] } serde = "1" serde_bytes = "0.11.14" serde_json = "1.0.115" @@ -28,4 +28,8 @@ bitcoin_hashes = "0.14.0" [dev-dependencies] secp256k1 = { version = "0.29.0", features = ["global-context"] } -pocket-ic = "2.2.0" +pocket-ic = "3.1.0" +flate2 = "1.0" + +[profile.release] +opt-level = "s" diff --git a/src/lib.rs b/src/lib.rs index 4af0f95..09d448f 100644 --- a/src/lib.rs +++ b/src/lib.rs @@ -1,11 +1,5 @@ use bip32::{Seed, XPrv}; -use bitcoin::{ - key::{Secp256k1, UntweakedKeypair}, - secp256k1::Message, -}; -use bitcoin_hashes::{sha256, Hash}; use candid::{CandidType, Decode, Deserialize, Encode, Principal}; -use ed25519_dalek::{Signer, SigningKey, VerifyingKey}; use getrandom::{register_custom_getrandom, Error}; use ic_crypto_extended_bip32::{DerivationIndex, DerivationPath}; use ic_stable_structures::{storable::Bound, StableBTreeMap, StableCell, Storable}; @@ -234,17 +228,12 @@ fn schnorr_public_key_secp256k1( seed: Seed, indexes: Vec, ) -> SchnorrPublicKeyResult { - let secp256k1: Secp256k1 = Secp256k1::new(); let root_xprv = XPrv::new(&seed).unwrap(); - let key_bytes = root_xprv.private_key().to_bytes(); - - let key_pair = UntweakedKeypair::from_seckey_slice(&secp256k1, &key_bytes) - .expect("Should generate key pair"); + let public_key_bytes = root_xprv.public_key().to_bytes(); let master_chain_code = [0u8; 32]; - let public_key_sec1 = key_pair.public_key().serialize(); let res = DerivationPath::new(indexes) - .public_key_derivation(&public_key_sec1, &master_chain_code) + .public_key_derivation(&public_key_bytes, &master_chain_code) .expect("Should derive key"); SchnorrPublicKeyResult { @@ -254,6 +243,8 @@ fn schnorr_public_key_secp256k1( } fn schnorr_public_key_ed25519(seed: Seed, indexes: Vec) -> SchnorrPublicKeyResult { + use ed25519_dalek::{SigningKey, VerifyingKey}; + let (secret, chain_code) = derive_ed25519_private_key(seed.as_bytes(), indexes); let key = SigningKey::from_bytes(&secret); let public_key = VerifyingKey::from(&key); @@ -264,11 +255,13 @@ fn schnorr_public_key_ed25519(seed: Seed, indexes: Vec) -> Schn } } -fn sign_with_schnorr_secp256k1( +pub fn sign_with_schnorr_secp256k1( seed: Seed, indexes: Vec, message: ByteBuf, ) -> SignWithSchnorrResult { + use k256::schnorr::SigningKey; + let root_xprv = XPrv::new(&seed).unwrap(); let private_key_bytes = root_xprv.private_key().to_bytes(); @@ -277,18 +270,13 @@ fn sign_with_schnorr_secp256k1( .private_key_derivation(&private_key_bytes, &master_chain_code) .expect("Should derive key"); - let secp256k1: Secp256k1 = Secp256k1::new(); - let key_pair = UntweakedKeypair::from_seckey_slice(&secp256k1, &res.derived_private_key) - .expect("Should generate key pair"); - - let digest = sha256::Hash::hash(&message).to_byte_array(); - let sig = secp256k1.sign_schnorr_no_aux_rand( - &Message::from_digest_slice(&digest).expect("should be cryptographically secure hash"), - &key_pair, - ); + let sk = SigningKey::from_bytes(&res.derived_private_key).expect("Should parse secret key"); + let sig = sk + .sign_raw(&message, &Default::default()) + .expect("should sign message"); SignWithSchnorrResult { - signature: ByteBuf::from(sig.serialize().to_vec()), + signature: ByteBuf::from(sig.to_bytes().to_vec()), } } @@ -297,6 +285,8 @@ fn sign_with_schnorr_ed25519( indexes: Vec, message: ByteBuf, ) -> SignWithSchnorrResult { + use ed25519_dalek::{Signer, SigningKey}; + let (secret, _) = derive_ed25519_private_key(seed.as_bytes(), indexes); let key = SigningKey::from_bytes(&secret); SignWithSchnorrResult { @@ -363,10 +353,7 @@ mod tests { #[test] fn test_sign_and_verify_schnorr_secp256k1() { - use bitcoin::{ - secp256k1::{schnorr::Signature, Secp256k1}, - PublicKey, - }; + use k256::schnorr::{Signature, VerifyingKey}; // Setup for signing let test_seed = [1u8; 64]; @@ -378,7 +365,6 @@ mod tests { let indexes = to_derivation_indexes(&Principal::anonymous(), &derivation_path); let message = b"Test message"; - let digest = sha256::Hash::hash(message).to_byte_array(); // Call the sign function let sign_reply = sign_with_schnorr_secp256k1( @@ -387,25 +373,18 @@ mod tests { ByteBuf::from(message.to_vec()), ); - // Setup for verification - let secp = Secp256k1::verification_only(); - let signature = - Signature::from_slice(&sign_reply.signature).expect("Invalid signature format"); - let public_key_reply = schnorr_public_key_secp256k1(Seed::new(test_seed), indexes.clone()); - let raw_public_key = public_key_reply.public_key; + let raw_sec1_public_key = public_key_reply.public_key; + let raw_bip340_public_key = &raw_sec1_public_key[1..]; + + let verifying_key = VerifyingKey::from_bytes(raw_bip340_public_key).unwrap(); - let public_key = PublicKey::from_slice(&raw_public_key).unwrap().into(); + let signature = Signature::try_from(sign_reply.signature.as_ref()) + .expect("should parse signature bytes"); // Verify the signature - assert!(secp - .verify_schnorr( - &signature, - &Message::from_digest_slice(&digest).unwrap(), - &public_key - ) - .is_ok()); + assert!(verifying_key.verify_raw(message, &signature).is_ok()); } #[test] diff --git a/tests/tests.rs b/tests/tests.rs index 9e4bd12..7392eea 100644 --- a/tests/tests.rs +++ b/tests/tests.rs @@ -1,12 +1,5 @@ extern crate schnorr_canister; -use bitcoin::{ - key::Secp256k1, - secp256k1::{schnorr::Signature, Message, PublicKey}, -}; - -use bitcoin_hashes::{sha256, Hash}; - use candid::{decode_one, encode_one, CandidType, Principal}; use pocket_ic::{PocketIc, WasmResult}; use schnorr_canister::{ @@ -19,13 +12,17 @@ use std::path::Path; #[test] fn test_sign_with_schnorr_secp256k1() { + use k256::schnorr::{Signature, VerifyingKey}; let pic = PocketIc::new(); let my_principal = Principal::anonymous(); + + println!("adding cycles"); // Create an empty canister as the anonymous principal and add cycles. let canister_id = pic.create_canister(); pic.add_cycles(canister_id, 2_000_000_000_000); + println!("installing canister"); let wasm_bytes = load_schnorr_canister_wasm(); pic.install_canister(canister_id, wasm_bytes, vec![], None); @@ -40,15 +37,14 @@ fn test_sign_with_schnorr_secp256k1() { let key_id = SchnorrKeyIds::TestKey1.to_key_id(); let message = b"Test message"; - let digest = sha256::Hash::hash(message).to_byte_array(); - let payload: SignWithSchnorrArgs = SignWithSchnorrArgs { message: ByteBuf::from(message.to_vec()), derivation_path: derivation_path.clone(), key_id: key_id.clone(), }; - let res: Result = update( + println!("submitting signing request"); + let sig_res: Result = update( &pic, my_principal, canister_id, @@ -56,14 +52,13 @@ fn test_sign_with_schnorr_secp256k1() { encode_one(payload).unwrap(), ); - let sig = res.unwrap().signature; - let payload = SchnorrPublicKeyArgs { canister_id: None, derivation_path: derivation_path.clone(), key_id: key_id.clone(), }; + println!("getting public key"); let res: Result = update( &pic, my_principal, @@ -73,15 +68,13 @@ fn test_sign_with_schnorr_secp256k1() { ); let pub_key_sec1 = res.unwrap().public_key; + let pub_key_bip340 = &pub_key_sec1[1..]; + let verifying_key = VerifyingKey::from_bytes(pub_key_bip340).unwrap(); - let pub_key = PublicKey::from_slice(&pub_key_sec1).unwrap().into(); - - let sig = Signature::from_slice(&sig).unwrap(); - - let msg = Message::from_digest_slice(&digest).unwrap(); + let raw_sig = sig_res.unwrap().signature; + let sig = Signature::try_from(raw_sig.as_ref()).expect("should parse signature bytes"); - let secp = Secp256k1::verification_only(); - assert!(secp.verify_schnorr(&sig, &msg, &pub_key).is_ok()); + assert!(verifying_key.verify_raw(message, &sig).is_ok()); } #[test] @@ -150,9 +143,18 @@ fn test_sign_with_schnorr_ed25519() { } fn load_schnorr_canister_wasm() -> Vec { + use flate2::write::GzEncoder; + use flate2::Compression; + use std::io::prelude::*; + let wasm_path = Path::new("./target/wasm32-unknown-unknown/release/schnorr_canister.wasm"); + let wasm_bytes = std::fs::read(wasm_path).expect("wasm does not exist"); + + let mut e = GzEncoder::new(Vec::new(), Compression::default()); + e.write_all(wasm_bytes.as_slice()).unwrap(); + let zipped_bytes = e.finish().unwrap(); - std::fs::read(wasm_path).unwrap() + zipped_bytes } pub fn update Deserialize<'de>>(