From 568d9c8697bf6ba4944543a21c9456c0c11f0caf Mon Sep 17 00:00:00 2001 From: Georgios Konstantopoulos Date: Tue, 21 Dec 2021 00:41:57 +0200 Subject: [PATCH] Update Cryptography crates (#617) * fix(core): use new k256 for pubkey calculation * fix(core): deserialize moonbeam keys with new fn * chore(signers): update crypto crates * chore: update cargo lock * ci: remove libudev req * chore: cargo fmt * chore: fix outstanding yubihsm errors --- .github/workflows/ci.yml | 4 - Cargo.lock | 275 ++++++++--------------- ethers-core/Cargo.toml | 4 +- ethers-core/src/types/signature.rs | 19 +- ethers-core/src/utils/ganache.rs | 2 +- ethers-core/src/utils/mod.rs | 9 +- ethers-core/src/utils/moonbeam.rs | 94 +++----- ethers-signers/Cargo.toml | 18 +- ethers-signers/src/aws/mod.rs | 6 +- ethers-signers/src/aws/utils.rs | 5 +- ethers-signers/src/wallet/mnemonic.rs | 2 +- ethers-signers/src/wallet/private_key.rs | 3 +- ethers-signers/src/wallet/yubi.rs | 12 +- 13 files changed, 172 insertions(+), 281 deletions(-) diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml index 0d454097..89cde164 100644 --- a/.github/workflows/ci.yml +++ b/.github/workflows/ci.yml @@ -90,8 +90,6 @@ jobs: export PATH=$HOME/bin:$PATH geth version - - name: Install libusb (for Ledger) - run: sudo apt update && sudo apt install pkg-config libudev-dev - name: Install stable toolchain uses: actions-rs/toolchain@v1 with: @@ -121,8 +119,6 @@ jobs: profile: minimal components: rustfmt, clippy override: true - - name: Install Dependencies - run: sudo apt-get install libudev-dev - uses: Swatinem/rust-cache@v1 with: cache-on-failure: true diff --git a/Cargo.lock b/Cargo.lock index 133417eb..947ddc14 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -12,21 +12,6 @@ dependencies = [ "regex", ] -[[package]] -name = "addr2line" -version = "0.17.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b9ecd88a8c8378ca913a680cd98f0f13ac67383d35993f86c90a70e3f137816b" -dependencies = [ - "gimli", -] - -[[package]] -name = "adler" -version = "1.0.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f26201604c87b1e01bd3d98f8d5d9a8fcbb815e8cedb41ffccbeb4bf593a35fe" - [[package]] name = "aead" version = "0.4.3" @@ -58,15 +43,6 @@ dependencies = [ "memchr", ] -[[package]] -name = "anomaly" -version = "0.2.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "550632e31568ae1a5f47998c3aa48563030fc49b9ec91913ca337cf64fbc5ccb" -dependencies = [ - "backtrace", -] - [[package]] name = "ansi_term" version = "0.12.1" @@ -151,21 +127,6 @@ version = "1.0.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "cdb031dd78e28731d87d56cc8ffef4a8f36ca26c38fe2de700543e627f8a464a" -[[package]] -name = "backtrace" -version = "0.3.63" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "321629d8ba6513061f26707241fa9bc89524ff1cd7a915a97ef0c62c666ce1b6" -dependencies = [ - "addr2line", - "cc", - "cfg-if 1.0.0", - "libc", - "miniz_oxide", - "object", - "rustc-demangle", -] - [[package]] name = "base58" version = "0.1.0" @@ -452,7 +413,6 @@ dependencies = [ "num-integer", "num-traits", "serde", - "time", "winapi", ] @@ -488,14 +448,15 @@ dependencies = [ [[package]] name = "coins-bip32" -version = "0.3.0" +version = "0.6.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "01b669993c632e5fec4a297085ec57381f53e4646c123cb77a7ca754e005c921" +checksum = "471b39eadc9323de375dce5eff149a5a1ebd21c67f1da34a56f87ee62191d4ea" dependencies = [ "bincode", "bs58", "coins-core", "digest 0.9.0", + "getrandom 0.2.3", "hmac", "k256", "lazy_static", @@ -506,16 +467,16 @@ dependencies = [ [[package]] name = "coins-bip39" -version = "0.3.0" +version = "0.6.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "38426029442f91bd49973d6f59f28e3dbb14e633e3019ac4ec6bce402c44f81c" +checksum = "8f473ea37dfc9d2cb94fdde50c3d41f28c3f384b367573d66386fea38d76d466" dependencies = [ "bitvec 0.17.4", "coins-bip32", "getrandom 0.2.3", "hex", "hmac", - "pbkdf2", + "pbkdf2 0.8.0", "rand 0.8.4", "sha2 0.9.8", "thiserror", @@ -544,16 +505,16 @@ dependencies = [ [[package]] name = "coins-ledger" -version = "0.4.2" +version = "0.6.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c2943c8f53555b1f2ab5c047520b9fd73e5b0b22d216375b5b0112a7d2ae2a1c" +checksum = "498841803f751d49bb08fe4a88b514087c52e5df885575ed4757f14ab151e239" dependencies = [ "async-trait", "blake2b_simd", "byteorder", "cfg-if 0.1.10", "futures", - "hidapi", + "hidapi-rusb", "js-sys", "lazy_static", "libc", @@ -615,12 +576,6 @@ dependencies = [ "wasm-bindgen", ] -[[package]] -name = "const-oid" -version = "0.6.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9d6f2aa4d0537bcc1c74df8755072bd31c1ef1a3a1b85a68e8404a8c353b7b8b" - [[package]] name = "const-oid" version = "0.7.1" @@ -761,18 +716,6 @@ version = "0.2.2" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "7a81dae078cea95a014a339291cec439d2f232ebe854a9d672b796c6afafa9b7" -[[package]] -name = "crypto-bigint" -version = "0.2.11" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f83bd3bb4314701c568e340cd8cf78c975aa0ca79e03d3f6d1677d5b0c9c0c03" -dependencies = [ - "generic-array 0.14.4", - "rand_core 0.6.3", - "subtle", - "zeroize", -] - [[package]] name = "crypto-bigint" version = "0.3.2" @@ -887,22 +830,13 @@ dependencies = [ "generic-array 0.14.4", ] -[[package]] -name = "der" -version = "0.4.5" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "79b71cca7d95d7681a4b3b9cdf63c8dbc3730d0584c2c74e31416d64a90493f4" -dependencies = [ - "const-oid 0.6.2", -] - [[package]] name = "der" version = "0.5.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "6919815d73839e7ad218de758883aae3a257ba6759ce7a9992501efbb53d705c" dependencies = [ - "const-oid 0.7.1", + "const-oid", ] [[package]] @@ -981,13 +915,13 @@ checksum = "453440c271cf5577fd2a40e4942540cb7d0d2f85e27c8d07dd0023c925a67541" [[package]] name = "ecdsa" -version = "0.12.4" +version = "0.13.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "43ee23aa5b4f68c7a092b5c3beb25f50c406adc75e2363634f242f28ab255372" +checksum = "e91ae02c7618ee05108cd86a0be2f5586d1f0d965bede7ecfd46815f1b860227" dependencies = [ - "der 0.4.5", - "elliptic-curve 0.10.6", - "hmac", + "der", + "elliptic-curve", + "rfc6979", "signature", ] @@ -1022,30 +956,17 @@ checksum = "e78d4f1cc4ae33bbfc157ed5d5a5ef3bc29227303d595861deb238fcec4e9457" [[package]] name = "elliptic-curve" -version = "0.10.6" +version = "0.11.6" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "beca177dcb8eb540133e7680baff45e7cc4d93bf22002676cec549f82343721b" +checksum = "decb3a27ea454a5f23f96eb182af0671c12694d64ecc33dada74edd1301f6cfc" dependencies = [ - "crypto-bigint 0.2.11", + "crypto-bigint", + "der", "ff", "generic-array 0.14.4", "group", - "pkcs8", - "rand_core 0.6.3", - "subtle", - "zeroize", -] - -[[package]] -name = "elliptic-curve" -version = "0.11.5" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1f01ff20862362c34074072c8be2de97399633d6b1d2114afa56bf77a8b7f0a4" -dependencies = [ - "crypto-bigint 0.3.2", - "der 0.5.1", - "generic-array 0.14.4", "rand_core 0.6.3", + "sec1", "subtle", "zeroize", ] @@ -1076,7 +997,7 @@ dependencies = [ "digest 0.9.0", "hex", "hmac", - "pbkdf2", + "pbkdf2 0.8.0", "rand 0.8.4", "scrypt", "serde", @@ -1214,7 +1135,7 @@ dependencies = [ "cargo_metadata", "convert_case", "ecdsa", - "elliptic-curve 0.11.5", + "elliptic-curve", "ethabi", "futures-util", "generic-array 0.14.4", @@ -1333,7 +1254,7 @@ dependencies = [ "coins-bip32", "coins-bip39", "coins-ledger", - "elliptic-curve 0.11.5", + "elliptic-curve", "eth-keystore", "ethers-contract", "ethers-core", @@ -1415,9 +1336,9 @@ checksum = "e88a8acf291dafb59c2d96e8f59828f3838bb1a70398823ade51a84de6a6deed" [[package]] name = "ff" -version = "0.10.1" +version = "0.11.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d0f40b2dcd8bc322217a5f6559ae5f9e9d1de202a2ecee2e9eafcbece7562a4f" +checksum = "b2958d04124b9f27f175eaeb9a9f383d026098aa837eadd8ba22c11f13a05b9e" dependencies = [ "rand_core 0.6.3", "subtle", @@ -1622,12 +1543,6 @@ dependencies = [ "wasm-bindgen", ] -[[package]] -name = "gimli" -version = "0.26.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "78cc372d058dcf6d5ecd98510e7fbc9e5aec4d21de70f65fea8fecebcd881bd4" - [[package]] name = "glob" version = "0.3.0" @@ -1636,9 +1551,9 @@ checksum = "9b919933a397b79c37e33b77bb2aa3dc8eb6e165ad809e58ff75bc7db2e34574" [[package]] name = "group" -version = "0.10.0" +version = "0.11.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1c363a5301b8f153d80747126a04b3c82073b9fe3130571a9d170cacdeaf7912" +checksum = "bc5ac374b108929de78460075f3dc439fa66df9d8fc77e8f12caa5165fcf0c89" dependencies = [ "ff", "rand_core 0.6.3", @@ -1670,12 +1585,6 @@ version = "1.8.2" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "eabb4a44450da02c90444cf74558da904edde8fb4e9035a9a6a4e15445af0bd7" -[[package]] -name = "harp" -version = "0.1.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "60bf12c625ed5e96f81609ae4377c34e9fa3e4d1fada392404322daeace511ab" - [[package]] name = "hashbrown" version = "0.11.2" @@ -1713,14 +1622,15 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "7ebdb29d2ea9ed0083cd8cece49bbd968021bd99b0849edb4a9a7ee0fdf6a4e0" [[package]] -name = "hidapi" +name = "hidapi-rusb" version = "1.3.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8d6f5e247bc66f3255d755e96d9d43f6b191f4e182072b811d55584ff58c510f" +checksum = "99e0b15c35f9c35cbadd0c388197364e8ff3feffd23b69cd45524a014932f5f1" dependencies = [ "cc", "libc", "pkg-config", + "rusb", ] [[package]] @@ -1947,13 +1857,14 @@ dependencies = [ [[package]] name = "k256" -version = "0.9.6" +version = "0.10.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "903ae2481bcdfdb7b68e0a9baa4b7c9aff600b9ae2e8e5bb5833b8c91ab851ea" +checksum = "58e786b08b1c90389266b21e238894b88c03296b44db6c6a797484c6fb3e6e5a" dependencies = [ "cfg-if 1.0.0", "ecdsa", - "elliptic-curve 0.10.6", + "elliptic-curve", + "sec1", "sha2 0.9.8", "sha3", ] @@ -1978,9 +1889,9 @@ checksum = "1b03d17f364a3a042d5e5d46b053bbbf82c92c9430c592dd4c064dc6ee997125" [[package]] name = "libusb1-sys" -version = "0.5.0" +version = "0.6.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e22e89d08bbe6816c6c5d446203b859eba35b8fa94bf1b7edb2f6d25d43f023f" +checksum = "b8772b7e8d4d988e19684aec5a3f5e470ecaf5c705cf0303da3973508e873027" dependencies = [ "cc", "libc", @@ -2059,16 +1970,6 @@ version = "0.3.16" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "2a60c7ce501c71e03a9c9c0d35b861413ae925bd979cc7a4e30d060069aaac8d" -[[package]] -name = "miniz_oxide" -version = "0.4.4" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a92518e98c078586bc6c934028adcca4c92a53d6a958196de835170a01d84e4b" -dependencies = [ - "adler", - "autocfg", -] - [[package]] name = "mio" version = "0.7.14" @@ -2166,15 +2067,6 @@ version = "0.4.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "830b246a0e5f20af87141b25c173cd1b609bd7779a4617d6ec582abaf90870f3" -[[package]] -name = "object" -version = "0.27.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "67ac1d3f9a1d3616fd9a60c8d74296f22406a238b6a72f5cc1e6f314df4ffbf9" -dependencies = [ - "memchr", -] - [[package]] name = "once_cell" version = "1.9.0" @@ -2243,23 +2135,25 @@ dependencies = [ [[package]] name = "p256" -version = "0.9.0" +version = "0.10.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d053368e1bae4c8a672953397bd1bd7183dde1c72b0b7612a15719173148d186" +checksum = "d0e0c5310031b5d4528ac6534bccc1446c289ac45c47b277d5aa91089c5f74fa" dependencies = [ "ecdsa", - "elliptic-curve 0.10.6", + "elliptic-curve", + "sec1", "sha2 0.9.8", ] [[package]] name = "p384" -version = "0.8.0" +version = "0.9.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f23bc88c404ccc881c8a1ad62ba5cd7d336a64ecbf46de4874f2ad955f67b157" +checksum = "755d8266e41f57bd8562ed9b6e93cdcf73ead050e1e8c3a27ea3871b6643a20c" dependencies = [ "ecdsa", - "elliptic-curve 0.10.6", + "elliptic-curve", + "sec1", ] [[package]] @@ -2337,6 +2231,15 @@ dependencies = [ "sha2 0.9.8", ] +[[package]] +name = "pbkdf2" +version = "0.9.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f05894bce6a1ba4be299d0c5f29563e08af2bc18bb7d48313113bed71e904739" +dependencies = [ + "crypto-mac 0.11.1", +] + [[package]] name = "percent-encoding" version = "2.1.0" @@ -2387,12 +2290,13 @@ checksum = "8b870d8c151b6f2fb93e84a13146138f05d02ed11c7e7c54f8826aaaf7c9f184" [[package]] name = "pkcs8" -version = "0.7.6" +version = "0.8.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ee3ef9b64d26bad0536099c816c6734379e45bbd5f14798def6809e5cc350447" +checksum = "7cabda3fb821068a9a4fab19a683eac3af12edf0f34b94a8be53c4972b8149d0" dependencies = [ - "der 0.4.5", + "der", "spki", + "zeroize", ] [[package]] @@ -2764,6 +2668,17 @@ dependencies = [ "winreg", ] +[[package]] +name = "rfc6979" +version = "0.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "96ef608575f6392792f9ecf7890c00086591d29a83910939d430753f7c050525" +dependencies = [ + "crypto-bigint", + "hmac", + "zeroize", +] + [[package]] name = "ring" version = "0.16.20" @@ -2813,9 +2728,9 @@ dependencies = [ [[package]] name = "rusb" -version = "0.8.1" +version = "0.9.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d9a5084628cc5be77b1c750b3e5ee0cc519d2f2491b3f06b78b3aac3328b00ad" +checksum = "83b454219aa5007af92a042ec13b2035325318a21d3c6be18bf592f841430794" dependencies = [ "libc", "libusb1-sys", @@ -2904,12 +2819,6 @@ dependencies = [ "tokio", ] -[[package]] -name = "rustc-demangle" -version = "0.1.21" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7ef03e0a2b150c7a90d01faf6254c9c48a41e95fb2a8c2ac1c6f0d2b9aefc342" - [[package]] name = "rustc-hex" version = "2.1.0" @@ -3001,7 +2910,7 @@ dependencies = [ "base64ct", "hmac", "password-hash", - "pbkdf2", + "pbkdf2 0.8.0", "salsa20", "sha2 0.9.8", ] @@ -3016,6 +2925,19 @@ dependencies = [ "untrusted", ] +[[package]] +name = "sec1" +version = "0.2.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "08da66b8b0965a5555b6bd6639e68ccba85e1e2506f5fbb089e93f8a04e1a2d1" +dependencies = [ + "der", + "generic-array 0.14.4", + "pkcs8", + "subtle", + "zeroize", +] + [[package]] name = "security-framework" version = "2.4.2" @@ -3276,11 +3198,12 @@ checksum = "6e63cff320ae2c57904679ba7cb63280a3dc4613885beafb148ee7bf9aa9042d" [[package]] name = "spki" -version = "0.4.1" +version = "0.5.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5c01a0c15da1b0b0e1494112e7af814a678fec9bd157881b49beac661e9b6f32" +checksum = "964d3a6f8b7ef6d6d20887f4c30c4848f4ffa05f600c87277d30a5b4fe32cb4b" dependencies = [ - "der 0.4.5", + "base64ct", + "der", ] [[package]] @@ -3449,12 +3372,12 @@ dependencies = [ [[package]] name = "time" -version = "0.1.43" +version = "0.3.5" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ca8a50ef2360fbd1eeb0ecd46795a87a19024eb4b53c5dc916ca1fd95fe62438" +checksum = "41effe7cfa8af36f439fac33861b66b049edc6f9a32331e2312660529c1c24ad" dependencies = [ "libc", - "winapi", + "serde", ] [[package]] @@ -3659,13 +3582,13 @@ dependencies = [ [[package]] name = "trezor-client" -version = "0.0.3" +version = "0.0.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ff94fab279e0d429d762c289f9727f37a0f1b8207ea4795f09c11caad009046f" +checksum = "7f18d3fc60e99a85219fcd5a95311e20fb05805aab70719992b09853d47cae09" dependencies = [ "byteorder", "hex", - "hidapi", + "hidapi-rusb", "log", "primitive-types", "protobuf", @@ -4056,28 +3979,25 @@ checksum = "d2d7d3948613f75c98fd9328cfdcc45acc4d360655289d0a7d4ec931392200a3" [[package]] name = "yubihsm" -version = "0.39.0" +version = "0.40.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0c32cd8146a6966df8137f5dbb77010ae5253e6937b21d1fd6ed55213478b4d0" +checksum = "6c7ba281142fd52beba6ed6e67752bdb93242dd7520908a1d93054bfb4dcc02d" dependencies = [ "aes", - "anomaly", "bitflags", "block-modes", "ccm", - "chrono", "cmac", "digest 0.9.0", "ecdsa", "ed25519", "ed25519-dalek", - "harp", "hmac", "k256", "log", "p256", "p384", - "pbkdf2", + "pbkdf2 0.9.0", "rand_core 0.6.3", "rusb", "serde", @@ -4086,6 +4006,7 @@ dependencies = [ "signature", "subtle", "thiserror", + "time", "uuid", "zeroize", ] diff --git a/ethers-core/Cargo.toml b/ethers-core/Cargo.toml index efc31bf2..5e1582e7 100644 --- a/ethers-core/Cargo.toml +++ b/ethers-core/Cargo.toml @@ -16,10 +16,10 @@ arrayvec = { version = "0.7.2", default-features = false } rlp-derive = { version = "0.1.0", default-features = false } # crypto -ecdsa = { version = "0.12.3", default-features = false, features = ["std"] } +ecdsa = { version = "0.13.3", default-features = false, features = ["std"] } elliptic-curve = { version = "0.11.5", default-features = false } generic-array = { version = "0.14.4", default-features = false } -k256 = { version = "0.9.5", default-features = false, features = ["keccak256", "ecdsa", "zeroize"] } +k256 = { version = "0.10.0", default-features = false, features = ["keccak256", "ecdsa"] } rand = { version = "0.8.4", default-features = false } tiny-keccak = { version = "2.0.2", default-features = false } diff --git a/ethers-core/src/types/signature.rs b/ethers-core/src/types/signature.rs index 5eb1e31a..b3369bd6 100644 --- a/ethers-core/src/types/signature.rs +++ b/ethers-core/src/types/signature.rs @@ -9,14 +9,14 @@ use std::{convert::TryFrom, fmt, str::FromStr}; use thiserror::Error; -use elliptic_curve::consts::U32; +use elliptic_curve::{consts::U32, sec1::ToEncodedPoint}; use generic_array::GenericArray; use k256::{ ecdsa::{ recoverable::{Id as RecoveryId, Signature as RecoverableSignature}, Error as K256SignatureError, Signature as K256Signature, }, - EncodedPoint as K256PublicKey, + PublicKey as K256PublicKey, }; /// An error involving a signature. @@ -105,15 +105,12 @@ impl Signature { let verify_key = recoverable_sig.recover_verify_key_from_digest_bytes(message_hash.as_ref().into())?; - let uncompressed_pub_key = K256PublicKey::from(&verify_key).decompress(); - if let Some(public_key) = uncompressed_pub_key { - let public_key = public_key.to_bytes(); - debug_assert_eq!(public_key[0], 0x04); - let hash = crate::utils::keccak256(&public_key[1..]); - Ok(Address::from_slice(&hash[12..])) - } else { - Err(SignatureError::RecoveryError) - } + let public_key = K256PublicKey::from(&verify_key); + let public_key = public_key.to_encoded_point(/* compress = */ false); + let public_key = public_key.as_bytes(); + debug_assert_eq!(public_key[0], 0x04); + let hash = crate::utils::keccak256(&public_key[1..]); + Ok(Address::from_slice(&hash[12..])) } /// Retrieves the recovery signature. diff --git a/ethers-core/src/utils/ganache.rs b/ethers-core/src/utils/ganache.rs index c173a742..3c4fb1d1 100644 --- a/ethers-core/src/utils/ganache.rs +++ b/ethers-core/src/utils/ganache.rs @@ -194,7 +194,7 @@ impl Ganache { if is_private_key && line.starts_with('(') { let key_str = &line[6..line.len() - 1]; let key_hex = hex::decode(key_str).expect("could not parse as hex"); - let key = K256SecretKey::from_bytes(&key_hex).expect("did not get private key"); + let key = K256SecretKey::from_be_bytes(&key_hex).expect("did not get private key"); addresses.push(secret_key_to_address(&SigningKey::from(&key))); private_keys.push(key); } diff --git a/ethers-core/src/utils/mod.rs b/ethers-core/src/utils/mod.rs index 84fc6f0f..c5db9d48 100644 --- a/ethers-core/src/utils/mod.rs +++ b/ethers-core/src/utils/mod.rs @@ -26,8 +26,9 @@ pub use rlp; pub use hex; use crate::types::{Address, Bytes, U256}; +use elliptic_curve::sec1::ToEncodedPoint; use ethabi::ethereum_types::FromDecStrErr; -use k256::{ecdsa::SigningKey, EncodedPoint as K256PublicKey}; +use k256::{ecdsa::SigningKey, PublicKey as K256PublicKey}; use std::{convert::TryInto, ops::Neg}; use thiserror::Error; @@ -242,9 +243,9 @@ pub fn get_create2_address_from_hash( /// Converts a K256 SigningKey to an Ethereum Address pub fn secret_key_to_address(secret_key: &SigningKey) -> Address { - // TODO: Can we do this in a better way? - let uncompressed_pub_key = K256PublicKey::from(&secret_key.verifying_key()).decompress(); - let public_key = uncompressed_pub_key.unwrap().to_bytes(); + let public_key = K256PublicKey::from(&secret_key.verifying_key()); + let public_key = public_key.to_encoded_point(/* compress = */ false); + let public_key = public_key.as_bytes(); debug_assert_eq!(public_key[0], 0x04); let hash = keccak256(&public_key[1..]); Address::from_slice(&hash[12..]) diff --git a/ethers-core/src/utils/moonbeam.rs b/ethers-core/src/utils/moonbeam.rs index d054d8e7..33136305 100644 --- a/ethers-core/src/utils/moonbeam.rs +++ b/ethers-core/src/utils/moonbeam.rs @@ -46,99 +46,67 @@ impl MoonbeamDev { } } +fn to_secret_key(s: &str) -> SecretKey { + SecretKey::from_be_bytes(&hex::decode(s).unwrap()).unwrap() +} + impl Default for MoonbeamDev { fn default() -> Self { Self { keys: BTreeMap::from([ ( "Alith", - SecretKey::from_bytes( - hex::decode( - "5fb92d6e98884f76de468fa3f6278f8807c48bebc13595d45af5bdc4da702133", - ) - .unwrap(), - ) - .unwrap(), + to_secret_key( + "5fb92d6e98884f76de468fa3f6278f8807c48bebc13595d45af5bdc4da702133", + ), ), ( "Baltathar", - SecretKey::from_bytes( - hex::decode( - "8075991ce870b93a8870eca0c0f91913d12f47948ca0fd25b49c6fa7cdbeee8b", - ) - .unwrap(), - ) - .unwrap(), + to_secret_key( + "8075991ce870b93a8870eca0c0f91913d12f47948ca0fd25b49c6fa7cdbeee8b", + ), ), ( "Charleth", - SecretKey::from_bytes( - hex::decode( - "0b6e18cafb6ed99687ec547bd28139cafdd2bffe70e6b688025de6b445aa5c5b", - ) - .unwrap(), - ) - .unwrap(), + to_secret_key( + "0b6e18cafb6ed99687ec547bd28139cafdd2bffe70e6b688025de6b445aa5c5b", + ), ), ( "Dorothy", - SecretKey::from_bytes( - hex::decode( - "39539ab1876910bbf3a223d84a29e28f1cb4e2e456503e7e91ed39b2e7223d68", - ) - .unwrap(), - ) - .unwrap(), + to_secret_key( + "39539ab1876910bbf3a223d84a29e28f1cb4e2e456503e7e91ed39b2e7223d68", + ), ), ( "Faith", - SecretKey::from_bytes( - hex::decode( - "b9d2ea9a615f3165812e8d44de0d24da9bbd164b65c4f0573e1ce2c8dbd9c8df", - ) - .unwrap(), - ) - .unwrap(), + to_secret_key( + "b9d2ea9a615f3165812e8d44de0d24da9bbd164b65c4f0573e1ce2c8dbd9c8df", + ), ), ( "Goliath", - SecretKey::from_bytes( - hex::decode( - "96b8a38e12e1a31dee1eab2fffdf9d9990045f5b37e44d8cc27766ef294acf18", - ) - .unwrap(), - ) - .unwrap(), + to_secret_key( + "96b8a38e12e1a31dee1eab2fffdf9d9990045f5b37e44d8cc27766ef294acf18", + ), ), ( "Heath", - SecretKey::from_bytes( - hex::decode( - "0d6dcaaef49272a5411896be8ad16c01c35d6f8c18873387b71fbc734759b0ab", - ) - .unwrap(), - ) - .unwrap(), + to_secret_key( + "0d6dcaaef49272a5411896be8ad16c01c35d6f8c18873387b71fbc734759b0ab", + ), ), ( "Ida", - SecretKey::from_bytes( - hex::decode( - "4c42532034540267bf568198ccec4cb822a025da542861fcb146a5fab6433ff8", - ) - .unwrap(), - ) - .unwrap(), + to_secret_key( + "4c42532034540267bf568198ccec4cb822a025da542861fcb146a5fab6433ff8", + ), ), ( "Judith", - SecretKey::from_bytes( - hex::decode( - "94c49300a58d576011096bcb006aa06f5a91b34b4383891e8029c21dc39fbb8b", - ) - .unwrap(), - ) - .unwrap(), + to_secret_key( + "94c49300a58d576011096bcb006aa06f5a91b34b4383891e8029c21dc39fbb8b", + ), ), ]), } diff --git a/ethers-signers/Cargo.toml b/ethers-signers/Cargo.toml index 8285829f..f6bbacf4 100644 --- a/ethers-signers/Cargo.toml +++ b/ethers-signers/Cargo.toml @@ -16,26 +16,26 @@ rustdoc-args = ["--cfg", "docsrs"] [dependencies] ethers-core = { version = "^0.6.0", path = "../ethers-core", features = ["eip712"]} thiserror = { version = "1.0.30", default-features = false } -coins-bip32 = "0.3.0" -coins-bip39 = "0.3.0" -coins-ledger = { version = "0.4.2", default-features = false, optional = true } +coins-bip32 = "0.6.0" +coins-bip39 = "0.6.0" +coins-ledger = { version = "0.6.0", default-features = false, optional = true } hex = { version = "0.4.3", default-features = false, features = ["std"] } async-trait = { version = "0.1.50", default-features = false } -elliptic-curve = { version = "0.11.5", default-features = false } +elliptic-curve = { version = "0.11.6", default-features = false } sha2 = { version = "0.9.8", default-features = false } rand = { version = "0.8.4", default-features = false } -yubihsm = { version = "0.39.0", features = ["secp256k1", "http", "usb"], optional = true } +yubihsm = { version = "0.40.0", features = ["secp256k1", "http", "usb"], optional = true } futures-util = "^0.3" futures-executor = "^0.3" semver = "1.0.4" -trezor-client = { version = "0.0.3", optional = true, default-features = false, features = ["f_ethereum"] } +trezor-client = { version = "0.0.4", optional = true, default-features = false, features = ["f_ethereum"] } # aws rusoto_core = { version = "0.47.0", optional = true } rusoto_kms = { version = "0.47.0", optional = true } tracing = { version = "0.1.29", optional = true } tracing-futures = { version = "0.2.5", optional = true } -spki = { version = "0.4.1", optional = true } +spki = { version = "0.5.2", optional = true } [target.'cfg(not(target_arch = "wasm32"))'.dependencies] eth-keystore = { version = "0.3.0" } @@ -45,10 +45,10 @@ ethers-contract = { version = "^0.6.0", path = "../ethers-contract", features = ethers-derive-eip712 = { version = "0.2.0", path = "../ethers-core/ethers-derive-eip712" } serde_json = { version = "1.0.64" } tracing-subscriber = "0.3.3" -yubihsm = { version = "0.39.0", features = ["secp256k1", "usb", "mockhsm"] } +yubihsm = { version = "0.40.0", features = ["secp256k1", "usb", "mockhsm"] } [target.'cfg(not(target_arch = "wasm32"))'.dev-dependencies] -yubihsm = { version = "0.39.0", features = ["secp256k1", "usb", "mockhsm"] } +yubihsm = { version = "0.40.0", features = ["secp256k1", "usb", "mockhsm"] } tokio = { version = "1.5", default-features = false, features = ["macros", "rt"] } tempfile = "3.2.0" diff --git a/ethers-signers/src/aws/mod.rs b/ethers-signers/src/aws/mod.rs index cf81f6b2..abf33a70 100644 --- a/ethers-signers/src/aws/mod.rs +++ b/ethers-signers/src/aws/mod.rs @@ -83,7 +83,7 @@ pub enum AwsSignerError { #[error("{0}")] K256(#[from] K256Error), #[error("{0}")] - Spki(spki::der::Error), + Spki(spki::Error), #[error("{0}")] Other(String), #[error(transparent)] @@ -100,8 +100,8 @@ impl From for AwsSignerError { } } -impl From for AwsSignerError { - fn from(e: spki::der::Error) -> Self { +impl From for AwsSignerError { + fn from(e: spki::Error) -> Self { Self::Spki(e) } } diff --git a/ethers-signers/src/aws/utils.rs b/ethers-signers/src/aws/utils.rs index 2cd79a00..4e2cb6d6 100644 --- a/ethers-signers/src/aws/utils.rs +++ b/ethers-signers/src/aws/utils.rs @@ -93,7 +93,8 @@ pub(super) fn decode_signature(resp: SignResponse) -> Result MnemonicBuilder { ) -> Result, WalletError> { let derived_priv_key = mnemonic.derive_key(&self.derivation_path, self.password.as_deref())?; - let key: &SigningKey = derived_priv_key.as_ref(); + let key: &coins_bip32::prelude::SigningKey = derived_priv_key.as_ref(); let signer = SigningKey::from_bytes(&key.to_bytes())?; let address = secret_key_to_address(&signer); diff --git a/ethers-signers/src/wallet/private_key.rs b/ethers-signers/src/wallet/private_key.rs index 08a0da93..a8b2e936 100644 --- a/ethers-signers/src/wallet/private_key.rs +++ b/ethers-signers/src/wallet/private_key.rs @@ -121,8 +121,7 @@ use ethers_core::k256::SecretKey as K256SecretKey; impl From for Wallet { fn from(key: K256SecretKey) -> Self { - let signer = SigningKey::from_bytes(&*key.to_bytes()) - .expect("private key should always be convertible to signing key"); + let signer = key.into(); let address = secret_key_to_address(&signer); Self { signer, address, chain_id: 1 } diff --git a/ethers-signers/src/wallet/yubi.rs b/ethers-signers/src/wallet/yubi.rs index 906d193b..a69e0a21 100644 --- a/ethers-signers/src/wallet/yubi.rs +++ b/ethers-signers/src/wallet/yubi.rs @@ -1,6 +1,11 @@ //! Helpers for creating wallets for YubiHSM2 use super::Wallet; -use ethers_core::{k256::Secp256k1, types::Address, utils::keccak256}; +use elliptic_curve::sec1::{FromEncodedPoint, ToEncodedPoint}; +use ethers_core::{ + k256::{PublicKey, Secp256k1}, + types::Address, + utils::keccak256, +}; use yubihsm::{ asymmetric::Algorithm::EcK256, ecdsa::Signer as YubiSigner, object, object::Label, Capability, Client, Connector, Credentials, Domain, @@ -50,7 +55,10 @@ impl Wallet> { impl From> for Wallet> { fn from(signer: YubiSigner) -> Self { - let public_key = signer.public_key().decompress().unwrap().to_bytes(); + // this will never fail + let public_key = PublicKey::from_encoded_point(signer.public_key()).unwrap(); + let public_key = public_key.to_encoded_point(/* compress = */ false); + let public_key = public_key.as_bytes(); debug_assert_eq!(public_key[0], 0x04); let hash = keccak256(&public_key[1..]); let address = Address::from_slice(&hash[12..]);