chore: bump crypto deps (#2260)

* chore(core): bump k256

* fix: use correct recovery api

* fix(signers): use correct apis

* chore(signers): bump elliptic curve

* feat: use PreHashSigner

* feat: bump yubihsm and adjust for breakages

* chore: clippy
This commit is contained in:
Georgios Konstantopoulos 2023-03-14 23:13:46 -07:00 committed by GitHub
parent 516dfcfd2a
commit 18a049b4c4
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
13 changed files with 217 additions and 309 deletions

283
Cargo.lock generated
View File

@ -247,6 +247,12 @@ version = "1.3.2"
source = "registry+https://github.com/rust-lang/crates.io-index" source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "bef38d45163c2f1dde094a7dfd33ccf595c92905c8f8f4fdc18d06fb1037718a" checksum = "bef38d45163c2f1dde094a7dfd33ccf595c92905c8f8f4fdc18d06fb1037718a"
[[package]]
name = "bitflags"
version = "2.0.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "f4f6e5df9abedba5099a01a6567c6086a6fbcff57af07c360d356737f9e0c644"
[[package]] [[package]]
name = "bitvec" name = "bitvec"
version = "0.17.4" version = "0.17.4"
@ -549,7 +555,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "71655c45cb9845d3270c9d6df84ebe72b4dad3c2ba3f7023ad47c144e4e473a5" checksum = "71655c45cb9845d3270c9d6df84ebe72b4dad3c2ba3f7023ad47c144e4e473a5"
dependencies = [ dependencies = [
"atty", "atty",
"bitflags", "bitflags 1.3.2",
"clap_derive", "clap_derive",
"clap_lex", "clap_lex",
"indexmap", "indexmap",
@ -612,7 +618,7 @@ dependencies = [
"bs58", "bs58",
"coins-core", "coins-core",
"digest 0.10.6", "digest 0.10.6",
"getrandom 0.2.8", "getrandom",
"hmac 0.12.1", "hmac 0.12.1",
"k256 0.11.6", "k256 0.11.6",
"lazy_static", "lazy_static",
@ -629,12 +635,12 @@ checksum = "a05ceda6ab4876de899fe23e8a171b200be9a346289bce12d41311e4bce2f104"
dependencies = [ dependencies = [
"bitvec 0.17.4", "bitvec 0.17.4",
"coins-bip32", "coins-bip32",
"getrandom 0.2.8", "getrandom",
"hex", "hex",
"hmac 0.12.1", "hmac 0.12.1",
"once_cell", "once_cell",
"pbkdf2", "pbkdf2 0.11.0",
"rand 0.8.5", "rand",
"sha2 0.10.6", "sha2 0.10.6",
"thiserror", "thiserror",
"tracing", "tracing",
@ -874,7 +880,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "ef2b4b23cddf68b89b8f8069890e8c270d54e2d5fe1b143820234805e4cb17ef" checksum = "ef2b4b23cddf68b89b8f8069890e8c270d54e2d5fe1b143820234805e4cb17ef"
dependencies = [ dependencies = [
"generic-array 0.14.6", "generic-array 0.14.6",
"rand_core 0.6.4", "rand_core",
"subtle", "subtle",
"zeroize", "zeroize",
] ]
@ -886,7 +892,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "071c0f5945634bc9ba7a452f492377dd6b1993665ddb58f28704119b32f07a9a" checksum = "071c0f5945634bc9ba7a452f492377dd6b1993665ddb58f28704119b32f07a9a"
dependencies = [ dependencies = [
"generic-array 0.14.6", "generic-array 0.14.6",
"rand_core 0.6.4", "rand_core",
"subtle", "subtle",
"zeroize", "zeroize",
] ]
@ -898,7 +904,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "1bfb12502f3fc46cca1bb51ac28df9d618d813cdc3d2f25b9fe775a34af26bb3" checksum = "1bfb12502f3fc46cca1bb51ac28df9d618d813cdc3d2f25b9fe775a34af26bb3"
dependencies = [ dependencies = [
"generic-array 0.14.6", "generic-array 0.14.6",
"rand_core 0.6.4", "rand_core",
"typenum", "typenum",
] ]
@ -933,13 +939,15 @@ dependencies = [
[[package]] [[package]]
name = "curve25519-dalek" name = "curve25519-dalek"
version = "3.2.0" version = "4.0.0-rc.1"
source = "registry+https://github.com/rust-lang/crates.io-index" source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "0b9fdf9972b2bd6af2d913799d9ebc165ea4d2e65878e329d9c6b372c4491b61" checksum = "8d4ba9852b42210c7538b75484f9daa0655e9a3ac04f693747bb0f02cf3cfe16"
dependencies = [ dependencies = [
"byteorder", "cfg-if 1.0.0",
"digest 0.9.0", "digest 0.10.6",
"rand_core 0.5.1", "fiat-crypto",
"packed_simd_2",
"platforms",
"subtle", "subtle",
"zeroize", "zeroize",
] ]
@ -1141,24 +1149,25 @@ dependencies = [
[[package]] [[package]]
name = "ed25519" name = "ed25519"
version = "1.5.2" version = "2.2.0"
source = "registry+https://github.com/rust-lang/crates.io-index" source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "1e9c280362032ea4203659fc489832d0204ef09f247a0506f170dafcac08c369" checksum = "be522bee13fa6d8059f4903a4084aa3bd50725e18150202f0238deb615cd6371"
dependencies = [ dependencies = [
"signature 1.6.4", "pkcs8 0.10.1",
"signature 2.0.0",
] ]
[[package]] [[package]]
name = "ed25519-dalek" name = "ed25519-dalek"
version = "1.0.1" version = "2.0.0-pre.0"
source = "registry+https://github.com/rust-lang/crates.io-index" source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "c762bae6dcaf24c4c84667b8579785430908723d5c889f469d76a41d59cc7a9d" checksum = "7bd577ba9d4bcab443cac60003d8fd32c638e7024a3ec92c200d7af5d2c397ed"
dependencies = [ dependencies = [
"curve25519-dalek", "curve25519-dalek",
"ed25519", "ed25519",
"rand 0.7.3", "rand_core",
"serde", "serde",
"sha2 0.9.9", "sha2 0.10.6",
"zeroize", "zeroize",
] ]
@ -1182,7 +1191,7 @@ dependencies = [
"generic-array 0.14.6", "generic-array 0.14.6",
"group 0.12.1", "group 0.12.1",
"pkcs8 0.9.0", "pkcs8 0.9.0",
"rand_core 0.6.4", "rand_core",
"sec1 0.3.0", "sec1 0.3.0",
"subtle", "subtle",
"zeroize", "zeroize",
@ -1201,7 +1210,7 @@ dependencies = [
"generic-array 0.14.6", "generic-array 0.14.6",
"group 0.13.0", "group 0.13.0",
"pkcs8 0.10.1", "pkcs8 0.10.1",
"rand_core 0.6.4", "rand_core",
"sec1 0.7.1", "sec1 0.7.1",
"subtle", "subtle",
"zeroize", "zeroize",
@ -1242,7 +1251,7 @@ dependencies = [
"hex", "hex",
"k256 0.13.0", "k256 0.13.0",
"log", "log",
"rand 0.8.5", "rand",
"rlp", "rlp",
"serde", "serde",
"sha3", "sha3",
@ -1294,8 +1303,8 @@ dependencies = [
"digest 0.10.6", "digest 0.10.6",
"hex", "hex",
"hmac 0.12.1", "hmac 0.12.1",
"pbkdf2", "pbkdf2 0.11.0",
"rand 0.8.5", "rand",
"scrypt", "scrypt",
"serde", "serde",
"serde_json", "serde_json",
@ -1368,7 +1377,7 @@ dependencies = [
"ethers-solc", "ethers-solc",
"eyre", "eyre",
"hex", "hex",
"rand 0.8.5", "rand",
"serde", "serde",
"serde_json", "serde_json",
"tempfile", "tempfile",
@ -1417,7 +1426,7 @@ dependencies = [
"ethers-etherscan", "ethers-etherscan",
"ethers-solc", "ethers-solc",
"eyre", "eyre",
"getrandom 0.2.8", "getrandom",
"hex", "hex",
"prettyplease", "prettyplease",
"proc-macro2", "proc-macro2",
@ -1456,18 +1465,18 @@ dependencies = [
"cargo_metadata", "cargo_metadata",
"chrono", "chrono",
"convert_case", "convert_case",
"elliptic-curve 0.12.3", "elliptic-curve 0.13.2",
"ethabi", "ethabi",
"generic-array 0.14.6", "generic-array 0.14.6",
"getrandom 0.2.8", "getrandom",
"hex", "hex",
"hex-literal", "hex-literal",
"k256 0.11.6", "k256 0.13.0",
"num_enum", "num_enum",
"once_cell", "once_cell",
"open-fastrlp", "open-fastrlp",
"proc-macro2", "proc-macro2",
"rand 0.8.5", "rand",
"rlp", "rlp",
"rlp-derive", "rlp-derive",
"serde", "serde",
@ -1498,7 +1507,7 @@ version = "2.0.0"
dependencies = [ dependencies = [
"ethers-core", "ethers-core",
"ethers-solc", "ethers-solc",
"getrandom 0.2.8", "getrandom",
"reqwest", "reqwest",
"semver", "semver",
"serde", "serde",
@ -1529,7 +1538,7 @@ dependencies = [
"hex", "hex",
"instant", "instant",
"once_cell", "once_cell",
"rand 0.8.5", "rand",
"reqwest", "reqwest",
"serde", "serde",
"serde_json", "serde_json",
@ -1554,7 +1563,7 @@ dependencies = [
"futures-core", "futures-core",
"futures-timer", "futures-timer",
"futures-util", "futures-util",
"getrandom 0.2.8", "getrandom",
"hashers", "hashers",
"hex", "hex",
"http", "http",
@ -1588,7 +1597,7 @@ dependencies = [
"coins-bip32", "coins-bip32",
"coins-bip39", "coins-bip39",
"coins-ledger", "coins-ledger",
"elliptic-curve 0.12.3", "elliptic-curve 0.13.2",
"eth-keystore", "eth-keystore",
"ethers-contract-derive", "ethers-contract-derive",
"ethers-core", "ethers-core",
@ -1597,7 +1606,7 @@ dependencies = [
"futures-util", "futures-util",
"hex", "hex",
"home", "home",
"rand 0.8.5", "rand",
"rusoto_core", "rusoto_core",
"rusoto_kms", "rusoto_kms",
"semver", "semver",
@ -1624,7 +1633,7 @@ dependencies = [
"ethers-core", "ethers-core",
"fs_extra", "fs_extra",
"futures-util", "futures-util",
"getrandom 0.2.8", "getrandom",
"glob", "glob",
"hex", "hex",
"home", "home",
@ -1633,7 +1642,7 @@ dependencies = [
"once_cell", "once_cell",
"path-slash", "path-slash",
"pretty_assertions", "pretty_assertions",
"rand 0.8.5", "rand",
"rayon", "rayon",
"regex", "regex",
"semver", "semver",
@ -1811,7 +1820,7 @@ version = "0.12.1"
source = "registry+https://github.com/rust-lang/crates.io-index" source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "d013fc25338cc558c5c2cfbad646908fb23591e2404481826742b651c9af7160" checksum = "d013fc25338cc558c5c2cfbad646908fb23591e2404481826742b651c9af7160"
dependencies = [ dependencies = [
"rand_core 0.6.4", "rand_core",
"subtle", "subtle",
] ]
@ -1821,10 +1830,16 @@ version = "0.13.0"
source = "registry+https://github.com/rust-lang/crates.io-index" source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "ded41244b729663b1e574f1b4fb731469f69f79c17667b5d776b16cda0479449" checksum = "ded41244b729663b1e574f1b4fb731469f69f79c17667b5d776b16cda0479449"
dependencies = [ dependencies = [
"rand_core 0.6.4", "rand_core",
"subtle", "subtle",
] ]
[[package]]
name = "fiat-crypto"
version = "0.1.19"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "93ace6ec7cc19c8ed33a32eaa9ea692d7faea05006b5356b9e2b668ec4bc3955"
[[package]] [[package]]
name = "fixed-hash" name = "fixed-hash"
version = "0.8.0" version = "0.8.0"
@ -1832,7 +1847,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "835c052cb0c08c1acf6ffd71c022172e18723949c8282f2b9f27efbc51e64534" checksum = "835c052cb0c08c1acf6ffd71c022172e18723949c8282f2b9f27efbc51e64534"
dependencies = [ dependencies = [
"byteorder", "byteorder",
"rand 0.8.5", "rand",
"rustc-hex", "rustc-hex",
"static_assertions", "static_assertions",
] ]
@ -2039,17 +2054,6 @@ dependencies = [
"zeroize", "zeroize",
] ]
[[package]]
name = "getrandom"
version = "0.1.16"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "8fc3cb4d91f53b50155bdcfd23f6a4c39ae1969c2ae85982b135750cccaf5fce"
dependencies = [
"cfg-if 1.0.0",
"libc",
"wasi 0.9.0+wasi-snapshot-preview1",
]
[[package]] [[package]]
name = "getrandom" name = "getrandom"
version = "0.2.8" version = "0.2.8"
@ -2059,7 +2063,7 @@ dependencies = [
"cfg-if 1.0.0", "cfg-if 1.0.0",
"js-sys", "js-sys",
"libc", "libc",
"wasi 0.11.0+wasi-snapshot-preview1", "wasi",
"wasm-bindgen", "wasm-bindgen",
] ]
@ -2076,7 +2080,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "5dfbfb3a6cfbd390d5c9564ab283a0349b9b9fcd46a706c1eb10e0db70bfbac7" checksum = "5dfbfb3a6cfbd390d5c9564ab283a0349b9b9fcd46a706c1eb10e0db70bfbac7"
dependencies = [ dependencies = [
"ff 0.12.1", "ff 0.12.1",
"rand_core 0.6.4", "rand_core",
"subtle", "subtle",
] ]
@ -2087,7 +2091,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "f0f9ef7462f7c099f518d754361858f86d8a07af53ba9af0fe635bbccb151a63" checksum = "f0f9ef7462f7c099f518d754361858f86d8a07af53ba9af0fe635bbccb151a63"
dependencies = [ dependencies = [
"ff 0.13.0", "ff 0.13.0",
"rand_core 0.6.4", "rand_core",
"subtle", "subtle",
] ]
@ -2492,7 +2496,6 @@ dependencies = [
"ecdsa 0.14.8", "ecdsa 0.14.8",
"elliptic-curve 0.12.3", "elliptic-curve 0.12.3",
"sha2 0.10.6", "sha2 0.10.6",
"sha3",
] ]
[[package]] [[package]]
@ -2562,6 +2565,12 @@ version = "0.2.139"
source = "registry+https://github.com/rust-lang/crates.io-index" source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "201de327520df007757c1f0adce6e827fe8562fbc28bfd9c15571c66ca1f5f79" checksum = "201de327520df007757c1f0adce6e827fe8562fbc28bfd9c15571c66ca1f5f79"
[[package]]
name = "libm"
version = "0.1.4"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "7fc7aa29613bd6a620df431842069224d8bc9011086b1db4c0e0cd47fa03ec9a"
[[package]] [[package]]
name = "libusb1-sys" name = "libusb1-sys"
version = "0.6.4" version = "0.6.4"
@ -2687,7 +2696,7 @@ checksum = "e5d732bc30207a6423068df043e3d02e0735b155ad7ce1a6f76fe2baa5b158de"
dependencies = [ dependencies = [
"libc", "libc",
"log", "log",
"wasi 0.11.0+wasi-snapshot-preview1", "wasi",
"windows-sys", "windows-sys",
] ]
@ -2721,7 +2730,7 @@ version = "0.26.2"
source = "registry+https://github.com/rust-lang/crates.io-index" source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "bfdda3d196821d6af13126e40375cdf7da646a96114af134d5f417a9a1dc8e1a" checksum = "bfdda3d196821d6af13126e40375cdf7da646a96114af134d5f417a9a1dc8e1a"
dependencies = [ dependencies = [
"bitflags", "bitflags 1.3.2",
"cfg-if 1.0.0", "cfg-if 1.0.0",
"libc", "libc",
"memoffset", "memoffset",
@ -2850,7 +2859,7 @@ version = "0.10.45"
source = "registry+https://github.com/rust-lang/crates.io-index" source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "b102428fd03bc5edf97f62620f7298614c45cedf287c271e7ed450bbaf83f2e1" checksum = "b102428fd03bc5edf97f62620f7298614c45cedf287c271e7ed450bbaf83f2e1"
dependencies = [ dependencies = [
"bitflags", "bitflags 1.3.2",
"cfg-if 1.0.0", "cfg-if 1.0.0",
"foreign-types", "foreign-types",
"libc", "libc",
@ -2912,26 +2921,38 @@ checksum = "b15813163c1d831bf4a13c3610c05c0d03b39feb07f7e09fa234dac9b15aaf39"
[[package]] [[package]]
name = "p256" name = "p256"
version = "0.11.1" version = "0.13.0"
source = "registry+https://github.com/rust-lang/crates.io-index" source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "51f44edd08f51e2ade572f141051021c5af22677e42b7dd28a88155151c33594" checksum = "7270da3e5caa82afd3deb054cc237905853813aea3859544bc082c3fe55b8d47"
dependencies = [ dependencies = [
"ecdsa 0.14.8", "ecdsa 0.16.1",
"elliptic-curve 0.12.3", "elliptic-curve 0.13.2",
"primeorder",
"sha2 0.10.6", "sha2 0.10.6",
] ]
[[package]] [[package]]
name = "p384" name = "p384"
version = "0.11.2" version = "0.13.0"
source = "registry+https://github.com/rust-lang/crates.io-index" source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "dfc8c5bf642dde52bb9e87c0ecd8ca5a76faac2eeed98dedb7c717997e1080aa" checksum = "70786f51bcc69f6a4c0360e063a4cac5419ef7c5cd5b3c99ad70f3be5ba79209"
dependencies = [ dependencies = [
"ecdsa 0.14.8", "ecdsa 0.16.1",
"elliptic-curve 0.12.3", "elliptic-curve 0.13.2",
"primeorder",
"sha2 0.10.6", "sha2 0.10.6",
] ]
[[package]]
name = "packed_simd_2"
version = "0.3.8"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "a1914cd452d8fccd6f9db48147b29fd4ae05bea9dc5d9ad578509f72415de282"
dependencies = [
"cfg-if 1.0.0",
"libm",
]
[[package]] [[package]]
name = "parity-scale-codec" name = "parity-scale-codec"
version = "3.2.1" version = "3.2.1"
@ -3013,7 +3034,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "7676374caaee8a325c9e7a2ae557f216c5563a171d6997b0ef8a65af35147700" checksum = "7676374caaee8a325c9e7a2ae557f216c5563a171d6997b0ef8a65af35147700"
dependencies = [ dependencies = [
"base64ct", "base64ct",
"rand_core 0.6.4", "rand_core",
"subtle", "subtle",
] ]
@ -3035,6 +3056,16 @@ dependencies = [
"sha2 0.10.6", "sha2 0.10.6",
] ]
[[package]]
name = "pbkdf2"
version = "0.12.1"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "f0ca0b5a68607598bf3bad68f32227a8164f6254833f84eafaac409cd6746c31"
dependencies = [
"digest 0.10.6",
"hmac 0.12.1",
]
[[package]] [[package]]
name = "percent-encoding" name = "percent-encoding"
version = "2.2.0" version = "2.2.0"
@ -3078,7 +3109,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "b1181c94580fa345f50f19d738aaa39c0ed30a600d95cb2d3e23f94266f14fbf" checksum = "b1181c94580fa345f50f19d738aaa39c0ed30a600d95cb2d3e23f94266f14fbf"
dependencies = [ dependencies = [
"phf_shared 0.11.1", "phf_shared 0.11.1",
"rand 0.8.5", "rand",
] ]
[[package]] [[package]]
@ -3176,6 +3207,12 @@ version = "0.3.26"
source = "registry+https://github.com/rust-lang/crates.io-index" source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "6ac9a59f73473f1b8d852421e59e64809f025994837ef743615c6d0c5b305160" checksum = "6ac9a59f73473f1b8d852421e59e64809f025994837ef743615c6d0c5b305160"
[[package]]
name = "platforms"
version = "3.0.2"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "e3d7ddaed09e0eb771a79ab0fd64609ba0afb0a8366421957936ad14cbd13630"
[[package]] [[package]]
name = "plotters" name = "plotters"
version = "0.3.4" version = "0.3.4"
@ -3238,6 +3275,15 @@ dependencies = [
"syn", "syn",
] ]
[[package]]
name = "primeorder"
version = "0.13.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "7613fdcc0831c10060fa69833ea8fa2caa94b6456f51e25356a885b530a2e3d0"
dependencies = [
"elliptic-curve 0.13.2",
]
[[package]] [[package]]
name = "primitive-types" name = "primitive-types"
version = "0.12.1" version = "0.12.1"
@ -3323,19 +3369,6 @@ version = "0.7.0"
source = "registry+https://github.com/rust-lang/crates.io-index" source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "dc33ff2d4973d518d823d61aa239014831e521c75da58e3df4840d3f47749d09" checksum = "dc33ff2d4973d518d823d61aa239014831e521c75da58e3df4840d3f47749d09"
[[package]]
name = "rand"
version = "0.7.3"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "6a6b1679d49b24bbfe0c803429aa1874472f50d9b363131f0e89fc356b544d03"
dependencies = [
"getrandom 0.1.16",
"libc",
"rand_chacha 0.2.2",
"rand_core 0.5.1",
"rand_hc",
]
[[package]] [[package]]
name = "rand" name = "rand"
version = "0.8.5" version = "0.8.5"
@ -3343,18 +3376,8 @@ source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "34af8d1a0e25924bc5b7c43c079c942339d8f0a8b57c39049bef581b46327404" checksum = "34af8d1a0e25924bc5b7c43c079c942339d8f0a8b57c39049bef581b46327404"
dependencies = [ dependencies = [
"libc", "libc",
"rand_chacha 0.3.1", "rand_chacha",
"rand_core 0.6.4", "rand_core",
]
[[package]]
name = "rand_chacha"
version = "0.2.2"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "f4c8ed856279c9737206bf725bf36935d8666ead7aa69b52be55af369d193402"
dependencies = [
"ppv-lite86",
"rand_core 0.5.1",
] ]
[[package]] [[package]]
@ -3364,16 +3387,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "e6c10a63a0fa32252be49d21e7709d4d4baf8d231c2dbce1eaa8141b9b127d88" checksum = "e6c10a63a0fa32252be49d21e7709d4d4baf8d231c2dbce1eaa8141b9b127d88"
dependencies = [ dependencies = [
"ppv-lite86", "ppv-lite86",
"rand_core 0.6.4", "rand_core",
]
[[package]]
name = "rand_core"
version = "0.5.1"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "90bde5296fc891b0cef12a6d03ddccc162ce7b2aff54160af9338f8d40df6d19"
dependencies = [
"getrandom 0.1.16",
] ]
[[package]] [[package]]
@ -3382,16 +3396,7 @@ version = "0.6.4"
source = "registry+https://github.com/rust-lang/crates.io-index" source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "ec0be4795e2f6a28069bec0b5ff3e2ac9bafc99e6a9a7dc3547996c5c816922c" checksum = "ec0be4795e2f6a28069bec0b5ff3e2ac9bafc99e6a9a7dc3547996c5c816922c"
dependencies = [ dependencies = [
"getrandom 0.2.8", "getrandom",
]
[[package]]
name = "rand_hc"
version = "0.2.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "ca3129af7b92a17112d59ad498c6f81eaf463253766b90396d39ea7a39d6613c"
dependencies = [
"rand_core 0.5.1",
] ]
[[package]] [[package]]
@ -3422,7 +3427,7 @@ version = "0.2.16"
source = "registry+https://github.com/rust-lang/crates.io-index" source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "fb5a58c1855b4b6819d59012155603f0b22ad30cad752600aadfcb695265519a" checksum = "fb5a58c1855b4b6819d59012155603f0b22ad30cad752600aadfcb695265519a"
dependencies = [ dependencies = [
"bitflags", "bitflags 1.3.2",
] ]
[[package]] [[package]]
@ -3431,7 +3436,7 @@ version = "0.4.3"
source = "registry+https://github.com/rust-lang/crates.io-index" source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "b033d837a7cf162d7993aded9304e30a83213c648b6e389db233191f891e5c2b" checksum = "b033d837a7cf162d7993aded9304e30a83213c648b6e389db233191f891e5c2b"
dependencies = [ dependencies = [
"getrandom 0.2.8", "getrandom",
"redox_syscall", "redox_syscall",
"thiserror", "thiserror",
] ]
@ -3684,7 +3689,7 @@ version = "0.36.6"
source = "registry+https://github.com/rust-lang/crates.io-index" source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "4feacf7db682c6c329c4ede12649cd36ecab0f3be5b7d74e6a20304725db4549" checksum = "4feacf7db682c6c329c4ede12649cd36ecab0f3be5b7d74e6a20304725db4549"
dependencies = [ dependencies = [
"bitflags", "bitflags 1.3.2",
"errno", "errno",
"io-lifetimes", "io-lifetimes",
"libc", "libc",
@ -3813,7 +3818,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "9f9e24d2b632954ded8ab2ef9fea0a0c769ea56ea98bddbafbad22caeeadf45d" checksum = "9f9e24d2b632954ded8ab2ef9fea0a0c769ea56ea98bddbafbad22caeeadf45d"
dependencies = [ dependencies = [
"hmac 0.12.1", "hmac 0.12.1",
"pbkdf2", "pbkdf2 0.11.0",
"salsa20", "salsa20",
"sha2 0.10.6", "sha2 0.10.6",
] ]
@ -3862,7 +3867,7 @@ version = "2.7.0"
source = "registry+https://github.com/rust-lang/crates.io-index" source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "2bc1bb97804af6631813c55739f771071e0f2ed33ee20b68c86ec505d906356c" checksum = "2bc1bb97804af6631813c55739f771071e0f2ed33ee20b68c86ec505d906356c"
dependencies = [ dependencies = [
"bitflags", "bitflags 1.3.2",
"core-foundation", "core-foundation",
"core-foundation-sys", "core-foundation-sys",
"libc", "libc",
@ -4091,8 +4096,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "74233d3b3b2f6d4b006dc19dee745e73e2a6bfb6f93607cd3b02bd5b00797d7c" checksum = "74233d3b3b2f6d4b006dc19dee745e73e2a6bfb6f93607cd3b02bd5b00797d7c"
dependencies = [ dependencies = [
"digest 0.10.6", "digest 0.10.6",
"rand_core 0.6.4", "rand_core",
"signature_derive",
] ]
[[package]] [[package]]
@ -4102,14 +4106,15 @@ source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "8fe458c98333f9c8152221191a77e2a44e8325d0193484af2e9421a53019e57d" checksum = "8fe458c98333f9c8152221191a77e2a44e8325d0193484af2e9421a53019e57d"
dependencies = [ dependencies = [
"digest 0.10.6", "digest 0.10.6",
"rand_core 0.6.4", "rand_core",
"signature_derive",
] ]
[[package]] [[package]]
name = "signature_derive" name = "signature_derive"
version = "1.0.0-pre.7" version = "2.0.0"
source = "registry+https://github.com/rust-lang/crates.io-index" source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "96e6310f022b5c02b3bba689166e833f6b96994a6ce1f138b653d2fd0519920f" checksum = "ede930749cca4e3a3df7e37b5f0934a55693e01d028d7a4e506b44cbc059d95a"
dependencies = [ dependencies = [
"proc-macro2", "proc-macro2",
"quote", "quote",
@ -4256,7 +4261,7 @@ dependencies = [
"indicatif", "indicatif",
"itertools", "itertools",
"once_cell", "once_cell",
"rand 0.8.5", "rand",
"reqwest", "reqwest",
"semver", "semver",
"serde", "serde",
@ -4679,7 +4684,7 @@ dependencies = [
"httparse", "httparse",
"log", "log",
"native-tls", "native-tls",
"rand 0.8.5", "rand",
"rustls", "rustls",
"sha1", "sha1",
"thiserror", "thiserror",
@ -4774,7 +4779,7 @@ version = "0.8.2"
source = "registry+https://github.com/rust-lang/crates.io-index" source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "bc5cf98d8186244414c848017f0e2676b3fcb46807f6668a97dfe67359a3c4b7" checksum = "bc5cf98d8186244414c848017f0e2676b3fcb46807f6668a97dfe67359a3c4b7"
dependencies = [ dependencies = [
"getrandom 0.2.8", "getrandom",
"serde", "serde",
] ]
@ -4826,12 +4831,6 @@ dependencies = [
"try-lock", "try-lock",
] ]
[[package]]
name = "wasi"
version = "0.9.0+wasi-snapshot-preview1"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "cccddf32554fecc6acb585f82a32a72e28b48f8c4c1883ddfeeeaa96f7d8e519"
[[package]] [[package]]
name = "wasi" name = "wasi"
version = "0.11.0+wasi-snapshot-preview1" version = "0.11.0+wasi-snapshot-preview1"
@ -5125,31 +5124,31 @@ checksum = "09041cd90cf85f7f8b2df60c646f853b7f535ce68f85244eb6731cf89fa498ec"
[[package]] [[package]]
name = "yubihsm" name = "yubihsm"
version = "0.41.0" version = "0.42.0-pre.0"
source = "registry+https://github.com/rust-lang/crates.io-index" source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "d479bdaa16917b3ff94bd09e72536369cdb2e167126ec908dae4cf934c19eb01" checksum = "f6a89568917376ff46a3de7bd0abdac47e9cc8ded4e1018e4a36d071d43a54ad"
dependencies = [ dependencies = [
"aes 0.8.2", "aes 0.8.2",
"bitflags", "bitflags 2.0.0",
"cbc", "cbc",
"ccm", "ccm",
"cmac", "cmac",
"digest 0.10.6", "digest 0.10.6",
"ecdsa 0.14.8", "ecdsa 0.16.1",
"ed25519", "ed25519",
"ed25519-dalek", "ed25519-dalek",
"hmac 0.12.1", "hmac 0.12.1",
"k256 0.11.6", "k256 0.13.0",
"log", "log",
"p256", "p256",
"p384", "p384",
"pbkdf2", "pbkdf2 0.12.1",
"rand_core 0.6.4", "rand_core",
"rusb", "rusb",
"serde", "serde",
"serde_json", "serde_json",
"sha2 0.10.6", "sha2 0.10.6",
"signature 1.6.4", "signature 2.0.0",
"subtle", "subtle",
"thiserror", "thiserror",
"time", "time",
@ -5192,7 +5191,7 @@ dependencies = [
"crossbeam-utils", "crossbeam-utils",
"flate2", "flate2",
"hmac 0.12.1", "hmac 0.12.1",
"pbkdf2", "pbkdf2 0.11.0",
"sha1", "sha1",
"time", "time",
"zstd", "zstd",

View File

@ -18,9 +18,9 @@ arrayvec = { version = "0.7.2", default-features = false }
rlp-derive = { version = "0.1.0", default-features = false } rlp-derive = { version = "0.1.0", default-features = false }
# crypto # crypto
elliptic-curve = { version = "0.12.3", default-features = false } elliptic-curve = { version = "0.13.2", default-features = false }
generic-array = { version = "0.14.6", default-features = false } generic-array = { version = "0.14.6", default-features = false }
k256 = { version = "0.11", default-features = false, features = ["keccak256", "ecdsa", "std"] } k256 = { version = "0.13.0", default-features = false, features = ["ecdsa", "std"] }
rand = { version = "0.8.5", default-features = false } rand = { version = "0.8.5", default-features = false }
tiny-keccak = { version = "2.0.2", default-features = false } tiny-keccak = { version = "2.0.2", default-features = false }

View File

@ -7,8 +7,8 @@ use elliptic_curve::{consts::U32, sec1::ToEncodedPoint};
use generic_array::GenericArray; use generic_array::GenericArray;
use k256::{ use k256::{
ecdsa::{ ecdsa::{
recoverable::{Id as RecoveryId, Signature as RecoverableSignature}, Error as K256SignatureError, RecoveryId, Signature as RecoverableSignature,
Error as K256SignatureError, Signature as K256Signature, Signature as K256Signature, VerifyingKey,
}, },
PublicKey as K256PublicKey, PublicKey as K256PublicKey,
}; };
@ -115,9 +115,12 @@ impl Signature {
RecoveryMessage::Hash(hash) => hash, RecoveryMessage::Hash(hash) => hash,
}; };
let (recoverable_sig, _recovery_id) = self.as_signature()?; let (recoverable_sig, recovery_id) = self.as_signature()?;
let verify_key = recoverable_sig let verify_key = VerifyingKey::recover_from_prehash(
.recover_verifying_key_from_digest_bytes(message_hash.as_ref().into())?; message_hash.as_ref(),
&recoverable_sig,
recovery_id,
)?;
let public_key = K256PublicKey::from(&verify_key); let public_key = K256PublicKey::from(&verify_key);
let public_key = public_key.to_encoded_point(/* compress = */ false); let public_key = public_key.to_encoded_point(/* compress = */ false);
@ -137,8 +140,7 @@ impl Signature {
self.s.to_big_endian(&mut s_bytes); self.s.to_big_endian(&mut s_bytes);
let gar: &GenericArray<u8, U32> = GenericArray::from_slice(&r_bytes); let gar: &GenericArray<u8, U32> = GenericArray::from_slice(&r_bytes);
let gas: &GenericArray<u8, U32> = GenericArray::from_slice(&s_bytes); let gas: &GenericArray<u8, U32> = GenericArray::from_slice(&s_bytes);
let sig = K256Signature::from_scalars(*gar, *gas)?; K256Signature::from_scalars(*gar, *gas)?
RecoverableSignature::new(&sig, recovery_id)?
}; };
Ok((signature, recovery_id)) Ok((signature, recovery_id))
@ -147,7 +149,7 @@ impl Signature {
/// Retrieve the recovery ID. /// Retrieve the recovery ID.
pub fn recovery_id(&self) -> Result<RecoveryId, SignatureError> { pub fn recovery_id(&self) -> Result<RecoveryId, SignatureError> {
let standard_v = normalize_recovery_id(self.v); let standard_v = normalize_recovery_id(self.v);
Ok(RecoveryId::new(standard_v)?) Ok(RecoveryId::from_byte(standard_v).expect("normalized recovery id always valid"))
} }
/// Copies and serializes `self` into a new `Vec` with the recovery id included /// Copies and serializes `self` into a new `Vec` with the recovery id included

View File

@ -2,6 +2,7 @@ use crate::{
types::{Address, Chain}, types::{Address, Chain},
utils::{secret_key_to_address, unused_ports}, utils::{secret_key_to_address, unused_ports},
}; };
use generic_array::GenericArray;
use k256::{ecdsa::SigningKey, SecretKey as K256SecretKey}; use k256::{ecdsa::SigningKey, SecretKey as K256SecretKey};
use std::{ use std::{
io::{BufRead, BufReader}, io::{BufRead, BufReader},
@ -278,7 +279,8 @@ impl Anvil {
if is_private_key && line.starts_with('(') { if is_private_key && line.starts_with('(') {
let key_str = &line[6..line.len() - 1]; let key_str = &line[6..line.len() - 1];
let key_hex = hex::decode(key_str).expect("could not parse as hex"); let key_hex = hex::decode(key_str).expect("could not parse as hex");
let key = K256SecretKey::from_be_bytes(&key_hex).expect("did not get private key"); let key = K256SecretKey::from_bytes(&GenericArray::clone_from_slice(&key_hex))
.expect("did not get private key");
addresses.push(secret_key_to_address(&SigningKey::from(&key))); addresses.push(secret_key_to_address(&SigningKey::from(&key)));
private_keys.push(key); private_keys.push(key);
} }

View File

@ -2,6 +2,7 @@ use crate::{
types::Address, types::Address,
utils::{secret_key_to_address, unused_ports}, utils::{secret_key_to_address, unused_ports},
}; };
use generic_array::GenericArray;
use k256::{ecdsa::SigningKey, SecretKey as K256SecretKey}; use k256::{ecdsa::SigningKey, SecretKey as K256SecretKey};
use std::{ use std::{
io::{BufRead, BufReader}, io::{BufRead, BufReader},
@ -205,7 +206,8 @@ impl Ganache {
if is_private_key && line.starts_with('(') { if is_private_key && line.starts_with('(') {
let key_str = &line[6..line.len() - 1]; let key_str = &line[6..line.len() - 1];
let key_hex = hex::decode(key_str).expect("could not parse as hex"); let key_hex = hex::decode(key_str).expect("could not parse as hex");
let key = K256SecretKey::from_be_bytes(&key_hex).expect("did not get private key"); let key = K256SecretKey::from_bytes(&GenericArray::clone_from_slice(&key_hex))
.expect("did not get private key");
addresses.push(secret_key_to_address(&SigningKey::from(&key))); addresses.push(secret_key_to_address(&SigningKey::from(&key)));
private_keys.push(key); private_keys.push(key);
} }

View File

@ -37,9 +37,8 @@ pub use rlp;
pub use hex; pub use hex;
use crate::types::{Address, Bytes, ParseI256Error, H256, I256, U256, U64}; use crate::types::{Address, Bytes, ParseI256Error, H256, I256, U256, U64};
use elliptic_curve::sec1::ToEncodedPoint;
use ethabi::ethereum_types::FromDecStrErr; use ethabi::ethereum_types::FromDecStrErr;
use k256::{ecdsa::SigningKey, PublicKey as K256PublicKey}; use k256::ecdsa::SigningKey;
use std::{ use std::{
collections::HashMap, collections::HashMap,
convert::{TryFrom, TryInto}, convert::{TryFrom, TryInto},
@ -385,7 +384,7 @@ pub fn get_create2_address_from_hash(
/// Converts a K256 SigningKey to an Ethereum Address /// Converts a K256 SigningKey to an Ethereum Address
pub fn secret_key_to_address(secret_key: &SigningKey) -> Address { pub fn secret_key_to_address(secret_key: &SigningKey) -> Address {
let public_key = K256PublicKey::from(&secret_key.verifying_key()); let public_key = secret_key.verifying_key();
let public_key = public_key.to_encoded_point(/* compress = */ false); let public_key = public_key.to_encoded_point(/* compress = */ false);
let public_key = public_key.as_bytes(); let public_key = public_key.as_bytes();
debug_assert_eq!(public_key[0], 0x04); debug_assert_eq!(public_key[0], 0x04);

View File

@ -2,6 +2,7 @@
use std::collections::BTreeMap; use std::collections::BTreeMap;
use generic_array::GenericArray;
use k256::SecretKey; use k256::SecretKey;
/// Returns the private developer keys <https://docs.moonbeam.network/builders/get-started/networks/moonbeam-dev/#pre-funded-development-accounts> /// Returns the private developer keys <https://docs.moonbeam.network/builders/get-started/networks/moonbeam-dev/#pre-funded-development-accounts>
@ -47,7 +48,7 @@ impl MoonbeamDev {
} }
fn to_secret_key(s: &str) -> SecretKey { fn to_secret_key(s: &str) -> SecretKey {
SecretKey::from_be_bytes(&hex::decode(s).unwrap()).unwrap() SecretKey::from_bytes(&GenericArray::clone_from_slice(&hex::decode(s).unwrap())).unwrap()
} }
impl Default for MoonbeamDev { impl Default for MoonbeamDev {

View File

@ -23,10 +23,10 @@ coins-bip39 = "0.8.1"
coins-ledger = { version = "0.7.1", default-features = false, optional = true } coins-ledger = { version = "0.7.1", default-features = false, optional = true }
hex = { version = "0.4.3", default-features = false, features = ["std"] } hex = { version = "0.4.3", default-features = false, features = ["std"] }
async-trait = { version = "0.1.50", default-features = false } async-trait = { version = "0.1.50", default-features = false }
elliptic-curve = { version = "0.12.3", default-features = false } elliptic-curve = { version = "0.13.2", default-features = false }
sha2 = { version = "0.10.6", default-features = false } sha2 = { version = "0.10.6", default-features = false }
rand = { version = "0.8.5", default-features = false } rand = { version = "0.8.5", default-features = false }
yubihsm = { version = "0.41.0", features = ["secp256k1", "http", "usb"], optional = true } yubihsm = { version = "0.42.0-pre.0", features = ["secp256k1", "http", "usb"], optional = true }
futures-util = { version = "^0.3", optional = true } futures-util = { version = "^0.3", optional = true }
futures-executor = { version = "^0.3", optional = true } futures-executor = { version = "^0.3", optional = true }
semver = { version = "1.0.17", optional = true } semver = { version = "1.0.17", optional = true }
@ -49,7 +49,7 @@ ethers-contract-derive = { version = "^2.0.0", path = "../ethers-contract/ethers
ethers-derive-eip712 = { version = "^2.0.0", path = "../ethers-core/ethers-derive-eip712" } ethers-derive-eip712 = { version = "^2.0.0", path = "../ethers-core/ethers-derive-eip712" }
serde_json = { version = "1.0.64" } serde_json = { version = "1.0.64" }
yubihsm = { version = "0.41.0", features = ["secp256k1", "usb", "mockhsm"] } yubihsm = { version = "0.42.0-pre.0", features = ["secp256k1", "usb", "mockhsm"] }
tokio = { version = "1.18", default-features = false, features = ["macros", "rt"] } tokio = { version = "1.18", default-features = false, features = ["macros", "rt"] }
tempfile = "3.4.0" tempfile = "3.4.0"
tracing-subscriber = "0.3.16" tracing-subscriber = "0.3.16"

View File

@ -15,7 +15,7 @@ use rusoto_kms::{
use tracing::{debug, instrument, trace}; use tracing::{debug, instrument, trace};
mod utils; mod utils;
use utils::{apply_eip155, rsig_to_ethsig, verifying_key_to_address}; use utils::{apply_eip155, verifying_key_to_address};
/// An ethers Signer that uses keys held in Amazon AWS KMS. /// An ethers Signer that uses keys held in Amazon AWS KMS.
/// ///
@ -57,7 +57,7 @@ impl std::fmt::Debug for AwsSigner {
f.debug_struct("AwsSigner") f.debug_struct("AwsSigner")
.field("key_id", &self.key_id) .field("key_id", &self.key_id)
.field("chain_id", &self.chain_id) .field("chain_id", &self.chain_id)
.field("pubkey", &hex::encode(self.pubkey.to_bytes())) .field("pubkey", &hex::encode(self.pubkey.to_sec1_bytes()))
.field("address", &self.address) .field("address", &self.address)
.finish() .finish()
} }
@ -165,7 +165,7 @@ impl AwsSigner {
debug!( debug!(
"Instantiated AWS signer with pubkey 0x{} and address 0x{}", "Instantiated AWS signer with pubkey 0x{} and address 0x{}",
hex::encode(pubkey.to_bytes()), hex::encode(pubkey.to_sec1_bytes()),
hex::encode(address) hex::encode(address)
); );
@ -211,10 +211,8 @@ impl AwsSigner {
chain_id: u64, chain_id: u64,
) -> Result<EthSig, AwsSignerError> { ) -> Result<EthSig, AwsSignerError> {
let sig = self.sign_digest(digest.into()).await?; let sig = self.sign_digest(digest.into()).await?;
let mut sig =
let sig = utils::rsig_from_digest_bytes_trial_recovery(&sig, digest.into(), &self.pubkey); utils::sig_from_digest_bytes_trial_recovery(&sig, digest.into(), &self.pubkey);
let mut sig = rsig_to_ethsig(&sig);
apply_eip155(&mut sig, chain_id); apply_eip155(&mut sig, chain_id);
Ok(sig) Ok(sig)
} }
@ -255,8 +253,7 @@ impl super::Signer for AwsSigner {
payload.encode_eip712().map_err(|e| Self::Error::Eip712Error(e.to_string()))?; payload.encode_eip712().map_err(|e| Self::Error::Eip712Error(e.to_string()))?;
let sig = self.sign_digest(digest).await?; let sig = self.sign_digest(digest).await?;
let sig = utils::rsig_from_digest_bytes_trial_recovery(&sig, digest, &self.pubkey); let sig = utils::sig_from_digest_bytes_trial_recovery(&sig, digest.into(), &self.pubkey);
let sig = rsig_to_ethsig(&sig);
Ok(sig) Ok(sig)
} }

View File

@ -6,11 +6,7 @@ use std::convert::TryFrom;
use ethers_core::{ use ethers_core::{
k256::{ k256::{
ecdsa::{ ecdsa::{RecoveryId, Signature as RSig, Signature as KSig, VerifyingKey},
recoverable::{Id, Signature as RSig},
Signature as KSig, VerifyingKey,
},
elliptic_curve::sec1::ToEncodedPoint,
FieldBytes, FieldBytes,
}, },
types::{Address, Signature as EthSig, U256}, types::{Address, Signature as EthSig, U256},
@ -20,40 +16,34 @@ use rusoto_kms::{GetPublicKeyResponse, SignResponse};
use crate::aws::AwsSignerError; use crate::aws::AwsSignerError;
/// Converts a recoverable signature to an ethers signature /// Makes a trial recovery to check whether an RSig corresponds to a known
pub(super) fn rsig_to_ethsig(sig: &RSig) -> EthSig { /// `VerifyingKey`
let v: u8 = sig.recovery_id().into(); fn check_candidate(
let v = (v + 27) as u64; sig: &RSig,
recovery_id: RecoveryId,
digest: [u8; 32],
vk: &VerifyingKey,
) -> bool {
VerifyingKey::recover_from_prehash(digest.as_slice(), sig, recovery_id)
.map(|key| key == *vk)
.unwrap_or(false)
}
/// Recover an rsig from a signature under a known key by trial/error
pub(super) fn sig_from_digest_bytes_trial_recovery(
sig: &KSig,
digest: [u8; 32],
vk: &VerifyingKey,
) -> EthSig {
let r_bytes: FieldBytes = sig.r().into(); let r_bytes: FieldBytes = sig.r().into();
let s_bytes: FieldBytes = sig.s().into(); let s_bytes: FieldBytes = sig.s().into();
let r = U256::from_big_endian(r_bytes.as_slice()); let r = U256::from_big_endian(r_bytes.as_slice());
let s = U256::from_big_endian(s_bytes.as_slice()); let s = U256::from_big_endian(s_bytes.as_slice());
EthSig { r, s, v }
}
/// Makes a trial recovery to check whether an RSig corresponds to a known if check_candidate(&sig, RecoveryId::from_byte(0).unwrap(), digest, vk) {
/// `VerifyingKey` EthSig { r, s, v: 0 }
fn check_candidate(sig: &RSig, digest: [u8; 32], vk: &VerifyingKey) -> bool { } else if check_candidate(&sig, RecoveryId::from_byte(1).unwrap(), digest, vk) {
if let Ok(key) = sig.recover_verifying_key_from_digest_bytes(digest.as_ref().into()) { EthSig { r, s, v: 1 }
key == *vk
} else {
false
}
}
/// Recover an rsig from a signature under a known key by trial/error
pub(super) fn rsig_from_digest_bytes_trial_recovery(
sig: &KSig,
digest: [u8; 32],
vk: &VerifyingKey,
) -> RSig {
let sig_0 = RSig::new(sig, Id::new(0).unwrap()).unwrap();
let sig_1 = RSig::new(sig, Id::new(1).unwrap()).unwrap();
if check_candidate(&sig_0, digest, vk) {
sig_0
} else if check_candidate(&sig_1, digest, vk) {
sig_1
} else { } else {
panic!("bad sig"); panic!("bad sig");
} }

View File

@ -1,80 +0,0 @@
//! This is a helper module used to pass the pre-hashed message for signing to the
//! `sign_digest` methods of K256.
use ethers_core::{
k256::ecdsa::signature::digest::{
generic_array::GenericArray, Digest, FixedOutput, FixedOutputReset, HashMarker, Output,
OutputSizeUser, Reset, Update,
},
types::H256,
};
pub type Sha256Proxy = ProxyDigest<sha2::Sha256>;
#[derive(Clone)]
pub enum ProxyDigest<D: Digest> {
Proxy(Output<D>),
Digest(D),
}
impl<D: Digest + Clone> From<H256> for ProxyDigest<D>
where
GenericArray<u8, <D as OutputSizeUser>::OutputSize>: Copy,
{
fn from(src: H256) -> Self {
ProxyDigest::Proxy(*GenericArray::from_slice(src.as_bytes()))
}
}
impl<D: Digest> Default for ProxyDigest<D> {
fn default() -> Self {
ProxyDigest::Digest(D::new())
}
}
impl<D: Digest> Update for ProxyDigest<D> {
// we update only if we are digest
fn update(&mut self, data: &[u8]) {
match self {
ProxyDigest::Digest(ref mut d) => {
d.update(data);
}
ProxyDigest::Proxy(..) => {
unreachable!("can not update if we are proxy");
}
}
}
}
impl<D: Digest> HashMarker for ProxyDigest<D> {}
impl<D: Digest> Reset for ProxyDigest<D> {
// make new one
fn reset(&mut self) {
*self = Self::default();
}
}
impl<D: Digest> OutputSizeUser for ProxyDigest<D> {
// we default to the output of the original digest
type OutputSize = <D as OutputSizeUser>::OutputSize;
}
impl<D: Digest> FixedOutput for ProxyDigest<D> {
fn finalize_into(self, out: &mut GenericArray<u8, Self::OutputSize>) {
match self {
ProxyDigest::Digest(d) => {
*out = d.finalize();
}
ProxyDigest::Proxy(p) => {
*out = p;
}
}
}
}
impl<D: Digest> FixedOutputReset for ProxyDigest<D> {
fn finalize_into_reset(&mut self, out: &mut Output<Self>) {
let s = std::mem::take(self);
Digest::finalize_into(s, out)
}
}

View File

@ -1,5 +1,3 @@
mod hash;
mod mnemonic; mod mnemonic;
pub use mnemonic::{MnemonicBuilder, MnemonicBuilderError}; pub use mnemonic::{MnemonicBuilder, MnemonicBuilderError};
@ -12,7 +10,7 @@ mod yubi;
use crate::{to_eip155_v, Signer}; use crate::{to_eip155_v, Signer};
use ethers_core::{ use ethers_core::{
k256::{ k256::{
ecdsa::{recoverable::Signature as RecoverableSignature, signature::DigestSigner}, ecdsa::{signature::hazmat::PrehashSigner, RecoveryId, Signature as RecoverableSignature},
elliptic_curve::FieldBytes, elliptic_curve::FieldBytes,
Secp256k1, Secp256k1,
}, },
@ -22,7 +20,6 @@ use ethers_core::{
}, },
utils::hash_message, utils::hash_message,
}; };
use hash::Sha256Proxy;
use async_trait::async_trait; use async_trait::async_trait;
use std::fmt; use std::fmt;
@ -64,7 +61,7 @@ use std::fmt;
/// [`Signature`]: ethers_core::types::Signature /// [`Signature`]: ethers_core::types::Signature
/// [`hash_message`]: fn@ethers_core::utils::hash_message /// [`hash_message`]: fn@ethers_core::utils::hash_message
#[derive(Clone)] #[derive(Clone)]
pub struct Wallet<D: DigestSigner<Sha256Proxy, RecoverableSignature>> { pub struct Wallet<D: PrehashSigner<(RecoverableSignature, RecoveryId)>> {
/// The Wallet's private Key /// The Wallet's private Key
pub(crate) signer: D, pub(crate) signer: D,
/// The wallet's address /// The wallet's address
@ -73,7 +70,7 @@ pub struct Wallet<D: DigestSigner<Sha256Proxy, RecoverableSignature>> {
pub(crate) chain_id: u64, pub(crate) chain_id: u64,
} }
impl<D: DigestSigner<Sha256Proxy, RecoverableSignature>> Wallet<D> { impl<D: PrehashSigner<(RecoverableSignature, RecoveryId)>> Wallet<D> {
/// Construct a new wallet with an external Signer /// Construct a new wallet with an external Signer
pub fn new_with_signer(signer: D, address: Address, chain_id: u64) -> Self { pub fn new_with_signer(signer: D, address: Address, chain_id: u64) -> Self {
Wallet { signer, address, chain_id } Wallet { signer, address, chain_id }
@ -82,7 +79,7 @@ impl<D: DigestSigner<Sha256Proxy, RecoverableSignature>> Wallet<D> {
#[cfg_attr(target_arch = "wasm32", async_trait(?Send))] #[cfg_attr(target_arch = "wasm32", async_trait(?Send))]
#[cfg_attr(not(target_arch = "wasm32"), async_trait)] #[cfg_attr(not(target_arch = "wasm32"), async_trait)]
impl<D: Sync + Send + DigestSigner<Sha256Proxy, RecoverableSignature>> Signer for Wallet<D> { impl<D: Sync + Send + PrehashSigner<(RecoverableSignature, RecoveryId)>> Signer for Wallet<D> {
type Error = WalletError; type Error = WalletError;
async fn sign_message<S: Send + Sync + AsRef<[u8]>>( async fn sign_message<S: Send + Sync + AsRef<[u8]>>(
@ -92,7 +89,7 @@ impl<D: Sync + Send + DigestSigner<Sha256Proxy, RecoverableSignature>> Signer fo
let message = message.as_ref(); let message = message.as_ref();
let message_hash = hash_message(message); let message_hash = hash_message(message);
Ok(self.sign_hash(message_hash)) self.sign_hash(message_hash)
} }
async fn sign_transaction(&self, tx: &TypedTransaction) -> Result<Signature, Self::Error> { async fn sign_transaction(&self, tx: &TypedTransaction) -> Result<Signature, Self::Error> {
@ -101,7 +98,7 @@ impl<D: Sync + Send + DigestSigner<Sha256Proxy, RecoverableSignature>> Signer fo
// in the case we don't have a chain_id, let's use the signer chain id instead // in the case we don't have a chain_id, let's use the signer chain id instead
tx_with_chain.set_chain_id(self.chain_id); tx_with_chain.set_chain_id(self.chain_id);
} }
Ok(self.sign_transaction_sync(&tx_with_chain)) self.sign_transaction_sync(&tx_with_chain)
} }
async fn sign_typed_data<T: Eip712 + Send + Sync>( async fn sign_typed_data<T: Eip712 + Send + Sync>(
@ -111,7 +108,7 @@ impl<D: Sync + Send + DigestSigner<Sha256Proxy, RecoverableSignature>> Signer fo
let encoded = let encoded =
payload.encode_eip712().map_err(|e| Self::Error::Eip712Error(e.to_string()))?; payload.encode_eip712().map_err(|e| Self::Error::Eip712Error(e.to_string()))?;
Ok(self.sign_hash(H256::from(encoded))) self.sign_hash(H256::from(encoded))
} }
fn address(&self) -> Address { fn address(&self) -> Address {
@ -130,37 +127,36 @@ impl<D: Sync + Send + DigestSigner<Sha256Proxy, RecoverableSignature>> Signer fo
} }
} }
impl<D: DigestSigner<Sha256Proxy, RecoverableSignature>> Wallet<D> { impl<D: PrehashSigner<(RecoverableSignature, RecoveryId)>> Wallet<D> {
/// Synchronously signs the provided transaction, normalizing the signature `v` value with /// Synchronously signs the provided transaction, normalizing the signature `v` value with
/// EIP-155 using the transaction's `chain_id`, or the signer's `chain_id` if the transaction /// EIP-155 using the transaction's `chain_id`, or the signer's `chain_id` if the transaction
/// does not specify one. /// does not specify one.
pub fn sign_transaction_sync(&self, tx: &TypedTransaction) -> Signature { pub fn sign_transaction_sync(&self, tx: &TypedTransaction) -> Result<Signature, WalletError> {
// rlp (for sighash) must have the same chain id as v in the signature // rlp (for sighash) must have the same chain id as v in the signature
let chain_id = tx.chain_id().map(|id| id.as_u64()).unwrap_or(self.chain_id); let chain_id = tx.chain_id().map(|id| id.as_u64()).unwrap_or(self.chain_id);
let mut tx = tx.clone(); let mut tx = tx.clone();
tx.set_chain_id(chain_id); tx.set_chain_id(chain_id);
let sighash = tx.sighash(); let sighash = tx.sighash();
let mut sig = self.sign_hash(sighash); let mut sig = self.sign_hash(sighash)?;
// sign_hash sets `v` to recid + 27, so we need to subtract 27 before normalizing // sign_hash sets `v` to recid + 27, so we need to subtract 27 before normalizing
sig.v = to_eip155_v(sig.v as u8 - 27, chain_id); sig.v = to_eip155_v(sig.v as u8 - 27, chain_id);
sig Ok(sig)
} }
/// Signs the provided hash. /// Signs the provided hash.
pub fn sign_hash(&self, hash: H256) -> Signature { pub fn sign_hash(&self, hash: H256) -> Result<Signature, WalletError> {
let recoverable_sig: RecoverableSignature = let (recoverable_sig, recovery_id) = self.signer.sign_prehash(hash.as_ref())?;
self.signer.sign_digest(Sha256Proxy::from(hash));
let v = u8::from(recoverable_sig.recovery_id()) as u64 + 27; let v = u8::from(recovery_id) as u64 + 27;
let r_bytes: FieldBytes<Secp256k1> = recoverable_sig.r().into(); let r_bytes: FieldBytes<Secp256k1> = recoverable_sig.r().into();
let s_bytes: FieldBytes<Secp256k1> = recoverable_sig.s().into(); let s_bytes: FieldBytes<Secp256k1> = recoverable_sig.s().into();
let r = U256::from_big_endian(r_bytes.as_slice()); let r = U256::from_big_endian(r_bytes.as_slice());
let s = U256::from_big_endian(s_bytes.as_slice()); let s = U256::from_big_endian(s_bytes.as_slice());
Signature { r, s, v } Ok(Signature { r, s, v })
} }
/// Gets the wallet's signer /// Gets the wallet's signer
@ -170,7 +166,7 @@ impl<D: DigestSigner<Sha256Proxy, RecoverableSignature>> Wallet<D> {
} }
// do not log the signer // do not log the signer
impl<D: DigestSigner<Sha256Proxy, RecoverableSignature>> fmt::Debug for Wallet<D> { impl<D: PrehashSigner<(RecoverableSignature, RecoveryId)>> fmt::Debug for Wallet<D> {
fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result { fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
f.debug_struct("Wallet") f.debug_struct("Wallet")
.field("address", &self.address) .field("address", &self.address)

View File

@ -66,7 +66,7 @@ impl Wallet<SigningKey> {
S: AsRef<[u8]>, S: AsRef<[u8]>,
{ {
let (secret, uuid) = eth_keystore::new(dir, rng, password, name)?; let (secret, uuid) = eth_keystore::new(dir, rng, password, name)?;
let signer = SigningKey::from_bytes(secret.as_slice())?; let signer = SigningKey::from_bytes(secret.as_slice().into())?;
let address = secret_key_to_address(&signer); let address = secret_key_to_address(&signer);
Ok((Self { signer, address, chain_id: 1 }, uuid)) Ok((Self { signer, address, chain_id: 1 }, uuid))
} }
@ -79,7 +79,7 @@ impl Wallet<SigningKey> {
S: AsRef<[u8]>, S: AsRef<[u8]>,
{ {
let secret = eth_keystore::decrypt_key(keypath, password)?; let secret = eth_keystore::decrypt_key(keypath, password)?;
let signer = SigningKey::from_bytes(secret.as_slice())?; let signer = SigningKey::from_bytes(secret.as_slice().into())?;
let address = secret_key_to_address(&signer); let address = secret_key_to_address(&signer);
Ok(Self { signer, address, chain_id: 1 }) Ok(Self { signer, address, chain_id: 1 })
} }
@ -93,7 +93,7 @@ impl Wallet<SigningKey> {
/// Creates a new Wallet instance from a raw scalar value (big endian). /// Creates a new Wallet instance from a raw scalar value (big endian).
pub fn from_bytes(bytes: &[u8]) -> Result<Self, WalletError> { pub fn from_bytes(bytes: &[u8]) -> Result<Self, WalletError> {
let signer = SigningKey::from_bytes(bytes)?; let signer = SigningKey::from_bytes(bytes.into())?;
let address = secret_key_to_address(&signer); let address = secret_key_to_address(&signer);
Ok(Self { signer, address, chain_id: 1 }) Ok(Self { signer, address, chain_id: 1 })
} }
@ -132,7 +132,7 @@ impl FromStr for Wallet<SigningKey> {
fn from_str(src: &str) -> Result<Self, Self::Err> { fn from_str(src: &str) -> Result<Self, Self::Err> {
let src = src.strip_prefix("0x").or_else(|| src.strip_prefix("0X")).unwrap_or(src); let src = src.strip_prefix("0x").or_else(|| src.strip_prefix("0X")).unwrap_or(src);
let src = hex::decode(src)?; let src = hex::decode(src)?;
let sk = SigningKey::from_bytes(&src)?; let sk = SigningKey::from_bytes(src.as_slice().into())?;
Ok(sk.into()) Ok(sk.into())
} }
} }
@ -297,7 +297,7 @@ mod tests {
// this should populate the tx chain_id as the signer's chain_id (1337) before signing and // this should populate the tx chain_id as the signer's chain_id (1337) before signing and
// normalize the v // normalize the v
let sig = wallet.sign_transaction_sync(&tx); let sig = wallet.sign_transaction_sync(&tx).unwrap();
// ensure correct v given the chain - first extract recid // ensure correct v given the chain - first extract recid
let recid = (sig.v - 35) % 2; let recid = (sig.v - 35) % 2;