diff --git a/Cargo.lock b/Cargo.lock index 3da111fd..8872bc2a 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -160,7 +160,7 @@ checksum = "648ed8c8d2ce5409ccd57453d9d1b214b342a0d69376a6feda1fd6cae3299308" dependencies = [ "proc-macro2", "quote", - "syn", + "syn 1.0.80", ] [[package]] @@ -183,7 +183,7 @@ checksum = "44318e776df68115a881de9a8fd1b9e53368d7a4a5ce4cc48517da3393233a5e" dependencies = [ "proc-macro2", "quote", - "syn", + "syn 1.0.80", ] [[package]] @@ -261,6 +261,15 @@ dependencies = [ "generic-array", ] +[[package]] +name = "block-buffer" +version = "0.10.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3078c7629b62d3f0439517fa394996acacc5cbc91c5a20d8c658e77abd503a71" +dependencies = [ + "generic-array", +] + [[package]] name = "block-padding" version = "0.2.1" @@ -339,25 +348,25 @@ checksum = "baf1de4339761588bc0619e3cbc0120ee582ebb74b53b4efbf79117bd2da40fd" [[package]] name = "chacha20" -version = "0.8.1" +version = "0.8.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "01b72a433d0cf2aef113ba70f62634c56fddb0f244e6377185c56a7cadbd8f91" +checksum = "5c80e5460aa66fe3b91d40bcbdab953a597b60053e34d684ac6903f863b680a6" dependencies = [ "cfg-if 1.0.0", - "cipher", + "cipher 0.3.0", "cpufeatures", "zeroize", ] [[package]] name = "chacha20poly1305" -version = "0.9.0" +version = "0.9.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3b84ed6d1d5f7aa9bdde921a5090e0ca4d934d250ea3b402a5fab3a994e28a2a" +checksum = "a18446b09be63d457bbec447509e85f662f32952b035ce892290396bc0b0cff5" dependencies = [ "aead", "chacha20", - "cipher", + "cipher 0.3.0", "poly1305", "zeroize", ] @@ -371,6 +380,16 @@ dependencies = [ "generic-array", ] +[[package]] +name = "cipher" +version = "0.4.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "773f3b9af64447d2ce9850330c473515014aa235e6a783b02db81ff39e4a3dad" +dependencies = [ + "crypto-common", + "inout", +] + [[package]] name = "clap" version = "3.0.5" @@ -393,6 +412,12 @@ dependencies = [ "cache-padded", ] +[[package]] +name = "const-oid" +version = "0.9.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "28c122c3980598d243d63d9a704629a2d748d101f278052ff068be5a4423ab6f" + [[package]] name = "core-foundation" version = "0.9.2" @@ -411,9 +436,9 @@ checksum = "5827cebf4670468b8772dd191856768aedcb1b0278a04f989f7766351917b9dc" [[package]] name = "cpufeatures" -version = "0.2.1" +version = "0.2.9" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "95059428f66df56b63431fdb4e1947ed2190586af5c5a8a8b71122bdf5a7f469" +checksum = "a17b76ff3a4162b0b27f354a0c87015ddad39d35f9c0c36607a3bdd175dde1f1" dependencies = [ "libc", ] @@ -452,16 +477,26 @@ dependencies = [ [[package]] name = "crypto-bigint" -version = "0.2.11" +version = "0.2.5" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f83bd3bb4314701c568e340cd8cf78c975aa0ca79e03d3f6d1677d5b0c9c0c03" +checksum = "8658c15c5d921ddf980f7fe25b1e82f4b7a4083b2c4985fea4922edb8e43e07d" dependencies = [ "generic-array", - "rand_core 0.6.3", + "rand_core 0.6.4", "subtle", "zeroize", ] +[[package]] +name = "crypto-common" +version = "0.1.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1bfb12502f3fc46cca1bb51ac28df9d618d813cdc3d2f25b9fe775a34af26bb3" +dependencies = [ + "generic-array", + "typenum", +] + [[package]] name = "crypto-mac" version = "0.8.0" @@ -482,6 +517,34 @@ dependencies = [ "subtle", ] +[[package]] +name = "curve25519-dalek" +version = "4.0.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f711ade317dd348950a9910f81c5947e3d8907ebd2b83f76203ff1807e6a2bc2" +dependencies = [ + "cfg-if 1.0.0", + "cpufeatures", + "curve25519-dalek-derive", + "digest 0.10.7", + "fiat-crypto", + "platforms 3.0.2", + "rustc_version", + "subtle", + "zeroize", +] + +[[package]] +name = "curve25519-dalek-derive" +version = "0.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "83fdaf97f4804dcebfa5862639bc9ce4121e82140bec2a987ac5140294865b5b" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.28", +] + [[package]] name = "darwin-libproc" version = "0.1.2" @@ -508,6 +571,28 @@ version = "0.4.4" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "28e98c534e9c8a0483aa01d6f6913bc063de254311bd267c9cf535e9b70e15b2" +[[package]] +name = "der" +version = "0.7.8" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "fffa369a668c8af7dbf8b5e56c9f744fbd399949ed171606040001947de40b1c" +dependencies = [ + "const-oid", + "der_derive", + "zeroize", +] + +[[package]] +name = "der_derive" +version = "0.7.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5fe87ce4529967e0ba1dcf8450bab64d97dfd5010a6256187ffe2e43e6f0e049" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.28", +] + [[package]] name = "digest" version = "0.9.0" @@ -517,6 +602,17 @@ dependencies = [ "generic-array", ] +[[package]] +name = "digest" +version = "0.10.7" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9ed9a281f7bc9b7576e61468ba615a66a5c8cfdff42420a70aa82701a3b1e292" +dependencies = [ + "block-buffer 0.10.4", + "crypto-common", + "subtle", +] + [[package]] name = "dirs" version = "4.0.0" @@ -543,10 +639,35 @@ version = "0.12.4" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "43ee23aa5b4f68c7a092b5c3beb25f50c406adc75e2363634f242f28ab255372" dependencies = [ - "der", + "der 0.4.4", "elliptic-curve", "hmac 0.11.0", - "signature", + "signature 1.3.2", +] + +[[package]] +name = "ed25519" +version = "2.2.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5fb04eee5d9d907f29e80ee6b0e78f7e2c82342c63e3580d8c4f69d9d5aad963" +dependencies = [ + "pkcs8", + "signature 2.0.0", +] + +[[package]] +name = "ed25519-dalek" +version = "2.0.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7277392b266383ef8396db7fdeb1e77b6c52fed775f5df15bb24f35b72156980" +dependencies = [ + "curve25519-dalek", + "ed25519", + "rand_core 0.6.4", + "serde", + "sha2 0.10.7", + "signature 2.0.0", + "zeroize", ] [[package]] @@ -557,15 +678,15 @@ checksum = "e78d4f1cc4ae33bbfc157ed5d5a5ef3bc29227303d595861deb238fcec4e9457" [[package]] name = "elliptic-curve" -version = "0.10.6" +version = "0.10.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "beca177dcb8eb540133e7680baff45e7cc4d93bf22002676cec549f82343721b" +checksum = "83e5c176479da93a0983f0a6fdc3c1b8e7d5be0d7fe3fe05a99f15b96582b9a8" dependencies = [ "crypto-bigint", "ff", "generic-array", "group", - "rand_core 0.6.3", + "rand_core 0.6.4", "subtle", "zeroize", ] @@ -591,10 +712,16 @@ version = "0.10.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "d0f40b2dcd8bc322217a5f6559ae5f9e9d1de202a2ecee2e9eafcbece7562a4f" dependencies = [ - "rand_core 0.6.3", + "rand_core 0.6.4", "subtle", ] +[[package]] +name = "fiat-crypto" +version = "0.1.20" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e825f6987101665dea6ec934c09ec6d721de7bc1bf92248e1d5810c8cd636b77" + [[package]] name = "fixedbitset" version = "0.4.1" @@ -791,7 +918,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "1c363a5301b8f153d80747126a04b3c82073b9fe3130571a9d170cacdeaf7912" dependencies = [ "ff", - "rand_core 0.6.3", + "rand_core 0.6.4", "subtle", ] @@ -892,7 +1019,7 @@ dependencies = [ "log", "mach", "ntapi", - "platforms", + "platforms 0.2.1", "winapi", ] @@ -970,7 +1097,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "126888268dcc288495a26bf004b38c5fdbb31682f992c84ceb046a1f0fe38840" dependencies = [ "crypto-mac 0.8.0", - "digest", + "digest 0.9.0", ] [[package]] @@ -980,7 +1107,16 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "2a2a2320eb7ec0ebe8da8f744d7812d9fc4cb4d09344ac01898dbcb6a20ae69b" dependencies = [ "crypto-mac 0.11.1", - "digest", + "digest 0.9.0", +] + +[[package]] +name = "hmac" +version = "0.12.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6c49c37c09c17a53d937dfbb742eb3a961d65a994e6bcdcf37e7399d0cc8ab5e" +dependencies = [ + "digest 0.10.7", ] [[package]] @@ -1074,6 +1210,15 @@ dependencies = [ "hashbrown", ] +[[package]] +name = "inout" +version = "0.1.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a0c10553d664a4d0bcff9f4215d0aac67a639cc68ef660840afe309b807bc9f5" +dependencies = [ + "generic-array", +] + [[package]] name = "instant" version = "0.1.12" @@ -1109,9 +1254,9 @@ dependencies = [ [[package]] name = "k256" -version = "0.9.6" +version = "0.9.5" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "903ae2481bcdfdb7b68e0a9baa4b7c9aff600b9ae2e8e5bb5833b8c91ab851ea" +checksum = "008b0281ca8032567c9711cd48631781c15228301860a39b32deb28d63125e46" dependencies = [ "cfg-if 1.0.0", "ecdsa", @@ -1141,7 +1286,7 @@ name = "libpaillier" version = "0.2.1" source = "git+https://github.com/axelarnetwork/paillier-rs#2d965b16d89de6f5d15b054fd5874d0c017c4747" dependencies = [ - "digest", + "digest 0.9.0", "rand 0.8.4", "serde", "serde_bare", @@ -1411,12 +1556,12 @@ dependencies = [ [[package]] name = "password-hash" -version = "0.3.2" +version = "0.5.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1d791538a6dcc1e7cb7fe6f6b58aca40e7f79403c45b2bc274008b5e647af1d8" +checksum = "346f04948ba92c43e8469c1ee6736c7563d71012b17d40745260fe106aac2166" dependencies = [ "base64ct", - "rand_core 0.6.3", + "rand_core 0.6.4", "subtle", ] @@ -1431,11 +1576,12 @@ dependencies = [ [[package]] name = "pbkdf2" -version = "0.9.0" +version = "0.12.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f05894bce6a1ba4be299d0c5f29563e08af2bc18bb7d48313113bed71e904739" +checksum = "f8ed6a7761f76e3b9f92dfb0a60a6a6477c61024b775147ff0973a02653abaf2" dependencies = [ - "crypto-mac 0.11.1", + "digest 0.10.7", + "hmac 0.12.1", ] [[package]] @@ -1471,7 +1617,7 @@ checksum = "6e8fe8163d14ce7f0cdac2e040116f22eac817edabff0be91e8aff7e9accf389" dependencies = [ "proc-macro2", "quote", - "syn", + "syn 1.0.80", ] [[package]] @@ -1492,12 +1638,28 @@ version = "0.1.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "8b870d8c151b6f2fb93e84a13146138f05d02ed11c7e7c54f8826aaaf7c9f184" +[[package]] +name = "pkcs8" +version = "0.10.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f950b2377845cebe5cf8b5165cb3cc1a5e0fa5cfa3e1f7f55707d8fd82e0a7b7" +dependencies = [ + "der 0.7.8", + "spki", +] + [[package]] name = "platforms" version = "0.2.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "feb3b2b1033b8a60b4da6ee470325f887758c95d5320f52f9ce0df055a55940e" +[[package]] +name = "platforms" +version = "3.0.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e3d7ddaed09e0eb771a79ab0fd64609ba0afb0a8366421957936ad14cbd13630" + [[package]] name = "polling" version = "2.1.0" @@ -1530,11 +1692,11 @@ checksum = "ed0cfbc8191465bed66e1718596ee0b0b35d5ee1f41c5df2189d0fe8bde535ba" [[package]] name = "proc-macro2" -version = "1.0.30" +version = "1.0.66" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "edc3358ebc67bc8b7fa0c007f945b0b18226f78437d61bec735a9eb96b61ee70" +checksum = "18fb31db3f9bddb2ea821cde30a9f70117e3f119938b5ee630b7403aa6e2ead9" dependencies = [ - "unicode-xid", + "unicode-ident", ] [[package]] @@ -1577,7 +1739,7 @@ dependencies = [ "itertools", "proc-macro2", "quote", - "syn", + "syn 1.0.80", ] [[package]] @@ -1603,9 +1765,9 @@ dependencies = [ [[package]] name = "quote" -version = "1.0.10" +version = "1.0.32" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "38bc8cc6a5f2e3655e0899c1b848643b2562f853f114bfec7be120678e3ace05" +checksum = "50f3b39ccfb720540debaa0164757101c08ecb8d326b15358ce76a62c7e85965" dependencies = [ "proc-macro2", ] @@ -1631,7 +1793,7 @@ checksum = "2e7573632e6454cf6b99d7aac4ccca54be06da05aca2ef7423d22d27d4d4bcd8" dependencies = [ "libc", "rand_chacha 0.3.1", - "rand_core 0.6.3", + "rand_core 0.6.4", "rand_hc 0.3.1", ] @@ -1652,7 +1814,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "e6c10a63a0fa32252be49d21e7709d4d4baf8d231c2dbce1eaa8141b9b127d88" dependencies = [ "ppv-lite86", - "rand_core 0.6.3", + "rand_core 0.6.4", ] [[package]] @@ -1666,9 +1828,9 @@ dependencies = [ [[package]] name = "rand_core" -version = "0.6.3" +version = "0.6.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d34f1408f55294453790c48b2f1ebbb1c5b4b7563eb1f418bcfcfdbb06ebb4e7" +checksum = "ec0be4795e2f6a28069bec0b5ff3e2ac9bafc99e6a9a7dc3547996c5c816922c" dependencies = [ "getrandom 0.2.3", ] @@ -1688,7 +1850,7 @@ version = "0.3.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "d51e9f596de227fda2ea6c84607f5558e196eeaf43c986b724ba4fb8fdf497e7" dependencies = [ - "rand_core 0.6.3", + "rand_core 0.6.4", ] [[package]] @@ -1777,6 +1939,15 @@ version = "1.1.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "08d43f7aa6b08d49f382cde6a7982047c3426db949b1424bc4b7ec9ae12c6ce2" +[[package]] +name = "rustc_version" +version = "0.4.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "bfa0f585226d2e68097d4f95d113b15b83a82e819ab25717ec0590d9584ef366" +dependencies = [ + "semver", +] + [[package]] name = "ryu" version = "1.0.5" @@ -1785,11 +1956,11 @@ checksum = "71d301d4193d031abdd79ff7e3dd721168a9572ef3fe51a1517aba235bd8f86e" [[package]] name = "salsa20" -version = "0.8.1" +version = "0.10.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ecbd2eb639fd7cab5804a0837fe373cc2172d15437e804c054a9fb885cb923b0" +checksum = "97a22f5af31f73a954c10289c93e8a50cc23d971e80ee446f1f6f7137a088213" dependencies = [ - "cipher", + "cipher 0.4.4", ] [[package]] @@ -1806,17 +1977,22 @@ checksum = "d29ab0c6d3fc0ee92fe66e2d99f700eab17a8d57d1c1d3b748380fb20baa78cd" [[package]] name = "scrypt" -version = "0.8.0" +version = "0.11.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9f2cc535b6997b0c755bf9344e71ca0e1be070d07ff792f1fcd31e7b90e07d5f" +checksum = "0516a385866c09368f0b5bcd1caff3366aace790fcd46e2bb032697bb172fd1f" dependencies = [ - "hmac 0.11.0", "password-hash", - "pbkdf2 0.9.0", + "pbkdf2 0.12.2", "salsa20", - "sha2", + "sha2 0.10.7", ] +[[package]] +name = "semver" +version = "1.0.18" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b0293b4b29daaf487284529cc2f5675b8e57c61f70167ba415a463651fd6a918" + [[package]] name = "semver-parser" version = "0.9.0" @@ -1849,7 +2025,7 @@ checksum = "d7bc1a1ab1961464eae040d96713baa5a724a8152c1222492465b54322ec508b" dependencies = [ "proc-macro2", "quote", - "syn", + "syn 1.0.80", ] [[package]] @@ -1869,14 +2045,25 @@ version = "0.9.8" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "b69f9a4c9740d74c5baa3fd2e547f9525fa8088a8a958e0ca2409a514e33f5fa" dependencies = [ - "block-buffer", + "block-buffer 0.9.0", "cfg-if 1.0.0", "cpufeatures", - "digest", + "digest 0.9.0", "opaque-debug", "sha2-asm", ] +[[package]] +name = "sha2" +version = "0.10.7" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "479fb9d862239e610720565ca91403019f2f00410f1864c5aa7479b950a76ed8" +dependencies = [ + "cfg-if 1.0.0", + "cpufeatures", + "digest 0.10.7", +] + [[package]] name = "sha2-asm" version = "0.6.2" @@ -1892,8 +2079,8 @@ version = "0.9.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "f81199417d4e5de3f04b1e871023acea7389672c4135918f05aa9cbf2f2fa809" dependencies = [ - "block-buffer", - "digest", + "block-buffer 0.9.0", + "digest 0.9.0", "keccak", "opaque-debug", ] @@ -1932,8 +2119,17 @@ version = "1.3.2" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "f2807892cfa58e081aa1f1111391c7a0649d4fa127a4ffbe34bcbfb35a1171a4" dependencies = [ - "digest", - "rand_core 0.6.3", + "digest 0.9.0", + "rand_core 0.6.4", +] + +[[package]] +name = "signature" +version = "2.0.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8fe458c98333f9c8152221191a77e2a44e8325d0193484af2e9421a53019e57d" +dependencies = [ + "digest 0.10.7", ] [[package]] @@ -2024,6 +2220,16 @@ dependencies = [ "winapi", ] +[[package]] +name = "spki" +version = "0.7.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9d1e996ef02c474957d681f1b05213dfb0abab947b446a62d37770b23500184a" +dependencies = [ + "base64ct", + "der 0.7.8", +] + [[package]] name = "subtle" version = "2.4.1" @@ -2042,15 +2248,14 @@ dependencies = [ ] [[package]] -name = "synstructure" -version = "0.12.6" +name = "syn" +version = "2.0.28" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f36bdaa60a83aca3921b5259d5400cbf5e90fc51931376a9bd4a0eb79aa7210f" +checksum = "04361975b3f5e348b2189d8dc55bc942f278b2d482a6a0365de5bdd62d351567" dependencies = [ "proc-macro2", "quote", - "syn", - "unicode-xid", + "unicode-ident", ] [[package]] @@ -2104,7 +2309,7 @@ checksum = "aa32fd3f627f367fe16f893e2597ae3c05020f8bba2666a4e6ea73d377e5714b" dependencies = [ "proc-macro2", "quote", - "syn", + "syn 1.0.80", ] [[package]] @@ -2128,7 +2333,7 @@ dependencies = [ "pbkdf2 0.4.0", "rand 0.7.3", "rustc-hash", - "sha2", + "sha2 0.9.8", "thiserror", "unicode-normalization", "wasm-bindgen", @@ -2153,17 +2358,20 @@ checksum = "cda74da7e1a664f795bb1f8a87ec406fb89a02522cf6e50620d016add6dbbf5c" [[package]] name = "tofn" version = "0.1.0" -source = "git+https://github.com/axelarnetwork/tofn?branch=main#702a8b03a22c10470ae18b880808175a9c39d5b3" +source = "git+https://github.com/axelarnetwork/tofn?branch=main#18dc9c3449b6af4fd50c29971d3cd095cd126e41" dependencies = [ "bincode", + "der 0.7.8", "ecdsa", + "ed25519", + "ed25519-dalek", "hmac 0.11.0", "k256", "libpaillier", "rand 0.8.4", "rand_chacha 0.3.1", "serde", - "sha2", + "sha2 0.9.8", "sha3", "tracing", "zeroize", @@ -2238,7 +2446,7 @@ checksum = "b2dd85aeaba7b68df939bd357c6afb36c87951be9e80bf9c859f2fc3e9fca0fd" dependencies = [ "proc-macro2", "quote", - "syn", + "syn 1.0.80", ] [[package]] @@ -2315,7 +2523,7 @@ dependencies = [ "proc-macro2", "prost-build", "quote", - "syn", + "syn 1.0.80", ] [[package]] @@ -2372,7 +2580,7 @@ checksum = "f4f480b8f81512e825f337ad51e94c1eb5d3bbdf2b363dcd01e2b19a9ffe3f8e" dependencies = [ "proc-macro2", "quote", - "syn", + "syn 1.0.80", ] [[package]] @@ -2456,7 +2664,7 @@ checksum = "4801dca35e4e2cee957c469bd4a1c370fadb7894c0d50721a40eba3523e6e91c" dependencies = [ "lazy_static", "quote", - "syn", + "syn 1.0.80", ] [[package]] @@ -2486,6 +2694,12 @@ version = "0.3.7" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "1a01404663e3db436ed2746d9fefef640d868edae3cceb81c3b8d5732fda678f" +[[package]] +name = "unicode-ident" +version = "1.0.11" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "301abaae475aa91687eb82514b328ab47a211a533026cb25fc3e519b86adfc3c" + [[package]] name = "unicode-normalization" version = "0.1.19" @@ -2522,7 +2736,7 @@ name = "unknown_order" version = "0.2.3" source = "git+https://github.com/axelarnetwork/unknown_order#0f841f810f8bfe440d7768501da186b2426b7afa" dependencies = [ - "digest", + "digest 0.9.0", "hex", "rand 0.8.4", "rust-gmp", @@ -2563,7 +2777,7 @@ dependencies = [ "pulldown-cmark", "regex", "semver-parser", - "syn", + "syn 1.0.80", "toml", "url", ] @@ -2629,7 +2843,7 @@ dependencies = [ "log", "proc-macro2", "quote", - "syn", + "syn 1.0.80", "wasm-bindgen-shared", ] @@ -2651,7 +2865,7 @@ checksum = "7803e0eea25835f8abdc585cd3021b3deb11543c6fe226dcd30b228857c5c5ab" dependencies = [ "proc-macro2", "quote", - "syn", + "syn 1.0.80", "wasm-bindgen-backend", "wasm-bindgen-shared", ] @@ -2735,21 +2949,20 @@ checksum = "712e227841d057c1ee1cd2fb22fa7e5a5461ae8e48fa2ca79ec42cfc1931183f" [[package]] name = "zeroize" -version = "1.4.2" +version = "1.6.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "bf68b08513768deaa790264a7fac27a58cbf2705cfcdc9448362229217d7e970" +checksum = "2a0956f1ba7c7909bfb66c2e9e4124ab6f6482560f6628b5aaeba39207c9aad9" dependencies = [ "zeroize_derive", ] [[package]] name = "zeroize_derive" -version = "1.2.0" +version = "1.4.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "bdff2024a851a322b08f179173ae2ba620445aef1e838f0c196820eade4ae0c7" +checksum = "ce36e65b0d2999d2aafac989fb249189a141aee1f53c612c1f37d72631959f69" dependencies = [ "proc-macro2", "quote", - "syn", - "synstructure", + "syn 2.0.28", ] diff --git a/Cargo.toml b/Cargo.toml index 140ade42..89a5d566 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -27,7 +27,7 @@ chacha20poly1305 = { version = "0.9", features = ["alloc"], default-features = f rand = {version = "0.8", default-features = false } rpassword = { version = "5.0", default-features = false } -scrypt = { version = "0.8", default-features = false, features = ["std"] } +scrypt = { version = "0.11", default-features = false, features = ["std"] } # tonic dependencies prost = {version = "0.9", default-features = false} diff --git a/proto b/proto index df933575..5fa83fe0 160000 --- a/proto +++ b/proto @@ -1 +1 @@ -Subproject commit df9335757c3a96d7f18d21b532f76553135b16d1 +Subproject commit 5fa83fe0dbe1463f756348fa48116c7b69564a2f diff --git a/src/multisig/key_presence.rs b/src/multisig/key_presence.rs index 9bdf6e4c..36ae1635 100644 --- a/src/multisig/key_presence.rs +++ b/src/multisig/key_presence.rs @@ -7,7 +7,11 @@ use super::service::MultisigService; use tracing::debug; // error handling -use crate::{proto, TofndResult}; +use crate::{ + proto::{self, Algorithm}, + TofndResult, +}; +use anyhow::anyhow; impl MultisigService { pub(super) async fn handle_key_presence( @@ -15,8 +19,11 @@ impl MultisigService { request: proto::KeyPresenceRequest, ) -> TofndResult { // check if mnemonic is available + let algorithm = Algorithm::from_i32(request.algorithm) + .ok_or(anyhow!("Invalid algorithm: {}", request.algorithm))?; + let _ = self - .find_matching_seed(&request.key_uid, &request.pub_key) + .find_matching_seed(&request.key_uid, &request.pub_key, algorithm) .await?; // key presence for multisig always returns `Present`. diff --git a/src/multisig/keygen.rs b/src/multisig/keygen.rs index ea7042bd..a5a470f6 100644 --- a/src/multisig/keygen.rs +++ b/src/multisig/keygen.rs @@ -1,16 +1,19 @@ -use super::service::MultisigService; -use crate::{proto::KeygenRequest, TofndResult}; -use tofn::ecdsa::keygen; - +use super::{keypair::KeyPair, service::MultisigService}; +use crate::{ + proto::{Algorithm, KeygenRequest}, + TofndResult, +}; use anyhow::anyhow; impl MultisigService { pub(super) async fn handle_keygen(&self, request: &KeygenRequest) -> TofndResult> { + let algorithm = Algorithm::from_i32(request.algorithm) + .ok_or(anyhow!("Invalid algorithm: {}", request.algorithm))?; let secret_recovery_key = self.kv_manager.seed().await?; - let key_pair = keygen(&secret_recovery_key, request.key_uid.as_bytes()) - .map_err(|_| anyhow!("Cannot generate keypair"))?; - - Ok(key_pair.encoded_verifying_key().to_vec()) + Ok( + KeyPair::generate(&secret_recovery_key, request.key_uid.as_bytes(), algorithm)? + .encoded_verifying_key(), + ) } } diff --git a/src/multisig/keypair.rs b/src/multisig/keypair.rs new file mode 100644 index 00000000..836df969 --- /dev/null +++ b/src/multisig/keypair.rs @@ -0,0 +1,52 @@ +use crate::{proto::Algorithm, TofndResult}; +use anyhow::anyhow; +use tofn::{ + ecdsa, ed25519, + multisig::{keygen::SecretRecoveryKey, sign::MessageDigest}, +}; + +pub enum KeyPair { + Ecdsa(ecdsa::KeyPair), + Ed25519(ed25519::KeyPair), +} + +impl KeyPair { + pub fn generate( + secret_recovery_key: &SecretRecoveryKey, + session_nonce: &[u8], + algorithm: Algorithm, + ) -> TofndResult { + Ok(match algorithm { + Algorithm::Ecdsa => { + let key_pair = ecdsa::keygen(&secret_recovery_key, session_nonce) + .map_err(|_| anyhow!("Cannot generate keypair"))?; + + Self::Ecdsa(key_pair) + } + + Algorithm::Ed25519 => { + let key_pair = ed25519::keygen(&secret_recovery_key, session_nonce) + .map_err(|_| anyhow!("Cannot generate keypair"))?; + + Self::Ed25519(key_pair) + } + }) + } + + pub fn encoded_verifying_key(&self) -> Vec { + match self { + Self::Ecdsa(key_pair) => key_pair.encoded_verifying_key().to_vec(), + Self::Ed25519(key_pair) => key_pair.encoded_verifying_key().to_vec(), + } + } + + pub fn sign(&self, msg_to_sign: &MessageDigest) -> TofndResult> { + match self { + Self::Ecdsa(key_pair) => ecdsa::sign(key_pair.signing_key(), msg_to_sign) + .map_err(|_| anyhow!("signing failed")), + Self::Ed25519(key_pair) => { + ed25519::sign(key_pair, msg_to_sign).map_err(|_| anyhow!("signing failed")) + } + } + } +} diff --git a/src/multisig/mod.rs b/src/multisig/mod.rs index 3de7ecf3..4a9aa569 100644 --- a/src/multisig/mod.rs +++ b/src/multisig/mod.rs @@ -1,5 +1,6 @@ mod key_presence; mod keygen; +mod keypair; pub mod service; mod sign; diff --git a/src/multisig/sign.rs b/src/multisig/sign.rs index aea060f3..d56d39a8 100644 --- a/src/multisig/sign.rs +++ b/src/multisig/sign.rs @@ -1,28 +1,29 @@ -use super::service::MultisigService; -use crate::{proto::SignRequest, TofndResult}; -use std::convert::TryInto; - -use anyhow::anyhow; -use tofn::{ - ecdsa::{keygen, sign}, - multisig::keygen::SecretRecoveryKey, +use super::{keypair::KeyPair, service::MultisigService}; +use crate::{ + proto::{Algorithm, SignRequest}, + TofndResult, }; +use anyhow::anyhow; +use std::convert::TryInto; +use tofn::multisig::keygen::SecretRecoveryKey; impl MultisigService { pub(super) async fn handle_sign(&self, request: &SignRequest) -> TofndResult> { // re-generate secret key from seed, then sign + let algorithm = Algorithm::from_i32(request.algorithm) + .ok_or(anyhow!("Invalid algorithm: {}", request.algorithm))?; + let secret_recovery_key = self - .find_matching_seed(&request.key_uid, &request.pub_key) + .find_matching_seed(&request.key_uid, &request.pub_key, algorithm) .await?; - let key_pair = keygen(&secret_recovery_key, request.key_uid.as_bytes()) - .map_err(|_| anyhow!("key re-generation failed"))?; + let key_pair = + KeyPair::generate(&secret_recovery_key, request.key_uid.as_bytes(), algorithm) + .map_err(|_| anyhow!("key re-generation failed"))?; - let signature = sign( - key_pair.signing_key(), - &request.msg_to_sign.as_slice().try_into()?, - ) - .map_err(|_| anyhow!("sign failed"))?; + let signature = key_pair + .sign(&request.msg_to_sign.as_slice().try_into()?) + .map_err(|_| anyhow!("sign failed"))?; Ok(signature) } @@ -33,6 +34,7 @@ impl MultisigService { &self, key_uid: &str, pub_key: &[u8], + algorithm: Algorithm, ) -> TofndResult { if pub_key.is_empty() { return self @@ -51,7 +53,7 @@ impl MultisigService { for seed_key in seed_key_iter { let secret_recovery_key = self.kv_manager.get_seed(&seed_key).await?; - let key_pair = keygen(&secret_recovery_key, key_uid.as_bytes()) + let key_pair = KeyPair::generate(&secret_recovery_key, key_uid.as_bytes(), algorithm) .map_err(|_| anyhow!("key re-generation failed"))?; if pub_key == key_pair.encoded_verifying_key() { diff --git a/src/multisig/tests.rs b/src/multisig/tests.rs index 2b606eb9..675ed66e 100644 --- a/src/multisig/tests.rs +++ b/src/multisig/tests.rs @@ -2,6 +2,7 @@ use crate::{ addr, encrypted_sled::get_test_password, kv_manager::KvManager, + proto::Algorithm, tests::{DEFAULT_TEST_IP, DEFAULT_TEST_PORT}, }; use tokio::{ @@ -75,22 +76,24 @@ async fn spin_test_service_and_client() -> (MultisigClient, Sender<()>) // dummy ctor for KeygenResult impl KeygenRequest { - fn new(key_uid: &str) -> KeygenRequest { + fn new(key_uid: &str, algorithm: Algorithm) -> KeygenRequest { KeygenRequest { key_uid: key_uid.to_string(), party_uid: String::default(), + algorithm: algorithm as i32, } } } // dummy ctor for KeygenResult impl SignRequest { - fn new(key_uid: &str) -> SignRequest { + fn new(key_uid: &str, algorithm: Algorithm) -> SignRequest { SignRequest { key_uid: key_uid.to_string(), msg_to_sign: vec![32; 32], party_uid: String::default(), pub_key: vec![], + algorithm: algorithm as i32, } } } @@ -103,11 +106,11 @@ fn to_array(v: Vec) -> [T; N] { #[traced_test] #[tokio::test] -async fn test_multisig_keygen_sign() { +async fn test_multisig_ecdsa_keygen_sign() { let key = "multisig key"; let (mut client, shutdown_sender) = spin_test_service_and_client().await; - let request = KeygenRequest::new(key); + let request = KeygenRequest::new(key, Algorithm::Ecdsa); let response = client.keygen(request).await.unwrap().into_inner(); let pub_key = match response.keygen_response.unwrap() { @@ -117,7 +120,7 @@ async fn test_multisig_keygen_sign() { } }; - let request = SignRequest::new(key); + let request = SignRequest::new(key, Algorithm::Ecdsa); let msg_digest = request.msg_to_sign.as_slice().try_into().unwrap(); let response = client.sign(request).await.unwrap().into_inner(); let signature = match response.sign_response.unwrap() { @@ -134,13 +137,24 @@ async fn test_multisig_keygen_sign() { #[traced_test] #[tokio::test] -async fn test_multisig_only_sign() { +async fn test_multisig_ed25519_keygen_sign() { let key = "multisig key"; let (mut client, shutdown_sender) = spin_test_service_and_client().await; - let request = SignRequest::new(key); + let request = KeygenRequest::new(key, Algorithm::Ed25519); + + let response = client.keygen(request).await.unwrap().into_inner(); + let pub_key = match response.keygen_response.unwrap() { + KeygenResponse::PubKey(pub_key) => pub_key, + KeygenResponse::Error(err) => { + panic!("Got error from keygen: {}", err); + } + }; + + let request = SignRequest::new(key, Algorithm::Ed25519); + let msg_digest = request.msg_to_sign.as_slice().try_into().unwrap(); let response = client.sign(request).await.unwrap().into_inner(); - let _ = match response.sign_response.unwrap() { + let signature = match response.sign_response.unwrap() { SignResponse::Signature(signature) => signature, SignResponse::Error(err) => { panic!("Got error from sign: {}", err) @@ -148,6 +162,63 @@ async fn test_multisig_only_sign() { }; shutdown_sender.send(()).unwrap(); + + assert!(tofn::ed25519::verify(&to_array(pub_key), &msg_digest, &signature,).unwrap()); +} + +#[traced_test] +#[tokio::test] +async fn test_multisig_keygen_deterministic_and_unique_keys() { + let key = "multisig key"; + let (mut client, shutdown_sender) = spin_test_service_and_client().await; + + let mut seen_pub_keys = std::collections::HashSet::new(); + + for algorithm in [Algorithm::Ecdsa, Algorithm::Ed25519] { + let request = KeygenRequest::new(key, algorithm); + + let response = client.keygen(request.clone()).await.unwrap().into_inner(); + let pub_key1 = match response.keygen_response.unwrap() { + KeygenResponse::PubKey(pub_key) => pub_key, + KeygenResponse::Error(err) => { + panic!("Got error from keygen: {}", err); + } + }; + + let response = client.keygen(request).await.unwrap().into_inner(); + let pub_key2 = match response.keygen_response.unwrap() { + KeygenResponse::PubKey(pub_key) => pub_key, + KeygenResponse::Error(err) => { + panic!("Got error from keygen: {}", err); + } + }; + + assert_eq!(pub_key1, pub_key2); + + assert!(seen_pub_keys.insert(pub_key1)); + } + + shutdown_sender.send(()).unwrap(); +} + +#[traced_test] +#[tokio::test] +async fn test_multisig_only_sign() { + let key = "multisig key"; + let (mut client, shutdown_sender) = spin_test_service_and_client().await; + + for algorithm in [Algorithm::Ecdsa, Algorithm::Ed25519] { + let request = SignRequest::new(key, algorithm); + let response = client.sign(request).await.unwrap().into_inner(); + let _ = match response.sign_response.unwrap() { + SignResponse::Signature(signature) => signature, + SignResponse::Error(err) => { + panic!("Got error from sign: {}", err) + } + }; + } + + shutdown_sender.send(()).unwrap(); } #[traced_test] @@ -156,27 +227,29 @@ async fn test_multisig_short_key_fail() { let key = "k"; // too short key let (mut client, shutdown_sender) = spin_test_service_and_client().await; - let keygen_request = KeygenRequest::new(key); - let keygen_response = client.keygen(keygen_request).await.unwrap().into_inner(); + for algorithm in [Algorithm::Ecdsa, Algorithm::Ed25519] { + let keygen_request = KeygenRequest::new(key, algorithm); + let keygen_response = client.keygen(keygen_request).await.unwrap().into_inner(); - if let KeygenResponse::Error(err) = keygen_response.clone().keygen_response.unwrap() { - error!("{}", err); - } - assert!(matches!( - keygen_response.keygen_response.unwrap(), - KeygenResponse::Error(_) - )); + if let KeygenResponse::Error(err) = keygen_response.clone().keygen_response.unwrap() { + error!("{}", err); + } + assert!(matches!( + keygen_response.keygen_response.unwrap(), + KeygenResponse::Error(_) + )); - let sign_request = SignRequest::new(key); - let sign_response = client.sign(sign_request).await.unwrap().into_inner(); + let sign_request = SignRequest::new(key, algorithm); + let sign_response = client.sign(sign_request).await.unwrap().into_inner(); - if let SignResponse::Error(err) = sign_response.clone().sign_response.unwrap() { - error!("{}", err); + if let SignResponse::Error(err) = sign_response.clone().sign_response.unwrap() { + error!("{}", err); + } + assert!(matches!( + sign_response.sign_response.unwrap(), + SignResponse::Error(_) + )); } - assert!(matches!( - sign_response.sign_response.unwrap(), - SignResponse::Error(_) - )); shutdown_sender.send(()).unwrap(); } @@ -187,17 +260,19 @@ async fn test_multisig_truncated_msg_fail() { let key = "key-uid"; let (mut client, shutdown_sender) = spin_test_service_and_client().await; - // attempt sign with truncated msg digest - let mut request = SignRequest::new(key); - request.msg_to_sign = vec![32; 31]; - let response = client.sign(request.clone()).await.unwrap().into_inner(); - if let SignResponse::Error(err) = response.clone().sign_response.unwrap() { - error!("{}", err); + for algorithm in [Algorithm::Ecdsa, Algorithm::Ed25519] { + // attempt sign with truncated msg digest + let mut request = SignRequest::new(key, algorithm); + request.msg_to_sign = vec![32; 31]; + let response = client.sign(request.clone()).await.unwrap().into_inner(); + if let SignResponse::Error(err) = response.clone().sign_response.unwrap() { + error!("{}", err); + } + assert!(matches!( + response.sign_response.unwrap(), + SignResponse::Error(_) + )); } - assert!(matches!( - response.sign_response.unwrap(), - SignResponse::Error(_) - )); shutdown_sender.send(()).unwrap(); } @@ -207,17 +282,20 @@ async fn test_multisig_truncated_msg_fail() { async fn test_key_presence() { let (mut client, shutdown_sender) = spin_test_service_and_client().await; - let presence_request = KeyPresenceRequest { - key_uid: "key_uid".to_string(), - pub_key: vec![], - }; + for algorithm in [Algorithm::Ecdsa, Algorithm::Ed25519] { + let presence_request = KeyPresenceRequest { + key_uid: "key_uid".to_string(), + pub_key: vec![], + algorithm: algorithm as i32, + }; - let response = client - .key_presence(presence_request) - .await - .unwrap() - .into_inner(); - assert_eq!(response.response, Present as i32); + let response = client + .key_presence(presence_request) + .await + .unwrap() + .into_inner(); + assert_eq!(response.response, Present as i32); + } shutdown_sender.send(()).unwrap(); } diff --git a/src/tests/tofnd_party.rs b/src/tests/tofnd_party.rs index e9a49651..ee37ea6d 100644 --- a/src/tests/tofnd_party.rs +++ b/src/tests/tofnd_party.rs @@ -14,7 +14,7 @@ use crate::{ gg20, kv_manager::KvManager, mnemonic::Cmd, - proto, + proto::{self, Algorithm}, tests::SLEEP_TIME, }; @@ -380,6 +380,7 @@ impl Party for TofndParty { let key_presence_request = proto::KeyPresenceRequest { key_uid, pub_key: vec![], + algorithm: Algorithm::Ecdsa as i32, }; let response = self