diff --git a/Cargo.lock b/Cargo.lock index 810143f..ac3335d 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -47,7 +47,7 @@ dependencies = [ "getrandom", "once_cell", "version_check", - "zerocopy 0.7.35", + "zerocopy", ] [[package]] @@ -61,15 +61,15 @@ dependencies = [ [[package]] name = "allocator-api2" -version = "0.2.21" +version = "0.2.18" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "683d7910e743518b0e34f1186f92494becacb047c7b6bf616c96772180fef923" +checksum = "5c6cb57a04249c6480766f7f7cef5467412af1490f8d1e243141daddada3264f" [[package]] name = "anyhow" -version = "1.0.98" +version = "1.0.89" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e16d2d3311acee920a9eb8d33b8cbc1787ce4a264e85f964c2404b969bdcd487" +checksum = "86fdf8605db99b54d3cd748a44c6d04df638eb5dafb219b135d0149bd0db01f6" [[package]] name = "approx" @@ -249,9 +249,9 @@ checksum = "9b34d609dfbaf33d6889b2b7106d3ca345eacad44200913df5ba02bfd31d2ba9" [[package]] name = "async-trait" -version = "0.1.88" +version = "0.1.83" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e539d3fca749fcee5236ab05e93a52867dd549cc157c8cb7f99595f3cedffdb5" +checksum = "721cae7de5c34fbb2acd27e21e6d2cf7b886dce0c27388d46c4e6c47ea4318dd" dependencies = [ "proc-macro2", "quote", @@ -287,15 +287,15 @@ checksum = "4c7f02d4ea65f2c1853089ffd8d2787bdbc63de2f0d29dedbcf8ccdfa0ccd4cf" [[package]] name = "base64" -version = "0.22.1" +version = "0.13.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "72b3254f16251a8381aa12e40e3c4d2f0199f8c6508fbecb9d91f575e0fbb8c6" +checksum = "9e1b586273c5702936fe7b7d6896644d8be71e6314cfe09d3167c95f712589e8" [[package]] name = "base64ct" -version = "1.7.3" +version = "1.6.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "89e25b6adfb930f02d1981565a6e5d9c547ac15a96606256d3b59040e5cd4ca3" +checksum = "8c3c1a368f70d6cf7302d78f8f7093da241fb8e8807c05cc9e51a125895a6d5b" [[package]] name = "bitcoin-internals" @@ -321,9 +321,9 @@ checksum = "bef38d45163c2f1dde094a7dfd33ccf595c92905c8f8f4fdc18d06fb1037718a" [[package]] name = "bitflags" -version = "2.9.0" +version = "2.6.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5c8214115b7bf84099f1309324e63141d4c5d7cc26862f97a0a857dbefe165bd" +checksum = "b048fb63fd8b5923fc5aa7b340d8e156aec7ec02f0c78fa8a6ddc2613f6f71de" [[package]] name = "bitvec" @@ -348,9 +348,9 @@ dependencies = [ [[package]] name = "blake2b_simd" -version = "1.0.3" +version = "1.0.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "06e903a20b159e944f91ec8499fe1e55651480c541ea0a584f5d967c49ad9d99" +checksum = "23285ad32269793932e830392f2fe2f83e26488fd3ec778883a93c8323735780" dependencies = [ "arrayref", "arrayvec", @@ -377,9 +377,9 @@ dependencies = [ [[package]] name = "bounded-collections" -version = "0.2.4" +version = "0.2.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "64ad8a0bed7827f0b07a5d23cec2e58cc02038a99e4ca81616cb2bb2025f804d" +checksum = "db436177db0d505b1507f03aca56a41442ae6efdf8b6eaa855d73e52c5b078dc" dependencies = [ "log", "parity-scale-codec", @@ -398,15 +398,15 @@ dependencies = [ [[package]] name = "byte-slice-cast" -version = "1.2.3" +version = "1.2.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7575182f7272186991736b70173b0ea045398f984bf5ebbb3804736ce1330c9d" +checksum = "c3ac9f8b63eca6fd385229b3675f6cc0dc5c8a5c8a54a59d4f52ffd670d87b0c" [[package]] name = "bytemuck" -version = "1.22.0" +version = "1.19.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b6b1fc10dbac614ebc03540c9dbd60e83887fda27794998c6528f1782047d540" +checksum = "8334215b81e418a0a7bdb8ef0849474f40bb10c8b71f1c4ed315cff49f32494d" [[package]] name = "byteorder" @@ -416,15 +416,15 @@ checksum = "1fd0f2584146f6f2ef48085050886acf353beff7305ebd1ae69500e27c67f64b" [[package]] name = "bytes" -version = "1.10.1" +version = "1.7.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d71b6127be86fdcfddb610f7182ac57211d4b18a3e9c82eb2d17662f2227ad6a" +checksum = "428d9aa8fbc0670b7b8d6030a7fadd0f86151cae55e4dbbece15f3780a3dfaf3" [[package]] name = "cc" -version = "1.2.19" +version = "1.1.30" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8e3a13707ac958681c13b39b458c073d0d9bc8a22cb1b2f4c8e55eb72c13f362" +checksum = "b16803a61b81d9eabb7eae2588776c4c1e584b738ede45fdbb4c972cec1e9945" dependencies = [ "shlex", ] @@ -477,45 +477,31 @@ dependencies = [ ] [[package]] -name = "const_format" -version = "0.2.34" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "126f97965c8ad46d6d9163268ff28432e8f6a1196a55578867832e3049df63dd" -dependencies = [ - "const_format_proc_macros", -] - -[[package]] -name = "const_format_proc_macros" -version = "0.2.34" +name = "constant_time_eq" +version = "0.3.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1d57c2eccfb16dbac1f4e61e206105db5820c9d26c3c472bc17c774259ef7744" -dependencies = [ - "proc-macro2", - "quote", - "unicode-xid", -] +checksum = "7c74b8349d32d297c9134b8c88677813a227df8f779daa29bfc29c183fe3dca6" [[package]] -name = "constant_time_eq" +name = "constcat" version = "0.3.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7c74b8349d32d297c9134b8c88677813a227df8f779daa29bfc29c183fe3dca6" +checksum = "cd7e35aee659887cbfb97aaf227ac12cad1a9d7c71e55ff3376839ed4e282d08" [[package]] name = "cpufeatures" -version = "0.2.17" +version = "0.2.14" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "59ed5838eebb26a2bb2e58f6d5b5316989ae9d08bab10e0e6d103e656d1b0280" +checksum = "608697df725056feaccfa42cffdaeeec3fccc4ffc38358ecd19b243e716a78e0" dependencies = [ "libc", ] [[package]] name = "crunchy" -version = "0.2.3" +version = "0.2.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "43da5946c66ffcc7745f48db692ffbb10a83bfe0afd96235c5c2a4fb23994929" +checksum = "7a81dae078cea95a014a339291cec439d2f232ebe854a9d672b796c6afafa9b7" [[package]] name = "crypto-bigint" @@ -589,9 +575,9 @@ dependencies = [ [[package]] name = "deranged" -version = "0.4.0" +version = "0.3.11" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9c9e6a11ca8224451684bc0d7d5a7adbf8f2fd6887261a1cfc3c0432f9d4068e" +checksum = "b42b6fa04a440b495c8b04d0e71b707c585f83cb9cb28cf8cd0d976c315e31b4" dependencies = [ "powerfmt", ] @@ -661,18 +647,18 @@ dependencies = [ [[package]] name = "docify" -version = "0.2.9" +version = "0.2.8" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a772b62b1837c8f060432ddcc10b17aae1453ef17617a99bc07789252d2a5896" +checksum = "43a2f138ad521dc4a2ced1a4576148a6a610b4c5923933b062a263130a6802ce" dependencies = [ "docify_macros", ] [[package]] name = "docify_macros" -version = "0.2.9" +version = "0.2.8" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "60e6be249b0a462a14784a99b19bf35a667bb5e09de611738bb7362fa4c95ff7" +checksum = "1a081e51fb188742f5a7a1164ad752121abcb22874b21e2c3b0dd040c515fdad" dependencies = [ "common-path", "derive-syn-parse", @@ -688,9 +674,9 @@ dependencies = [ [[package]] name = "dyn-clonable" -version = "0.9.2" +version = "0.9.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a36efbb9bfd58e1723780aa04b61aba95ace6a05d9ffabfdb0b43672552f0805" +checksum = "4e9232f0e607a262ceb9bd5141a3dfb3e4db6994b31989bbfd845878cba59fd4" dependencies = [ "dyn-clonable-impl", "dyn-clone", @@ -698,20 +684,20 @@ dependencies = [ [[package]] name = "dyn-clonable-impl" -version = "0.9.2" +version = "0.9.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7e8671d54058979a37a26f3511fbf8d198ba1aa35ffb202c42587d918d77213a" +checksum = "558e40ea573c374cf53507fd240b7ee2f5477df7cfebdb97323ec61c719399c5" dependencies = [ "proc-macro2", "quote", - "syn 2.0.100", + "syn 1.0.109", ] [[package]] name = "dyn-clone" -version = "1.0.19" +version = "1.0.17" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1c7a8fb8a9fbf66c1f703fe16184d10ca0ee9d23be5b4436400408ba54a95005" +checksum = "0d6ef0072f8a535281e4876be788938b528e9a1d43900b82c2569af7da799125" [[package]] name = "ecdsa" @@ -769,9 +755,9 @@ dependencies = [ [[package]] name = "either" -version = "1.15.0" +version = "1.13.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "48c757948c5ede0e46177b7add2e67155f70e33c07fea8284df6576da70b3719" +checksum = "60b1af1c220855b6ceac025d3f6ecdd2b7c4894bfe9cd9bda4fbb4bc7c0d4cf0" [[package]] name = "elliptic-curve" @@ -795,18 +781,18 @@ dependencies = [ [[package]] name = "enumflags2" -version = "0.7.11" +version = "0.7.10" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ba2f4b465f5318854c6f8dd686ede6c0a9dc67d4b1ac241cf0eb51521a309147" +checksum = "d232db7f5956f3f14313dc2f87985c58bd2c695ce124c8cdd984e08e15ac133d" dependencies = [ "enumflags2_derive", ] [[package]] name = "enumflags2_derive" -version = "0.7.11" +version = "0.7.10" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "fc4caf64a58d7a6d65ab00639b046ff54399a39f5f2554728895ace4b297cd79" +checksum = "de0d48a183585823424a4ce1aa132d174a6a81bd540895822eb4c8373a8e49e8" dependencies = [ "proc-macro2", "quote", @@ -821,9 +807,9 @@ checksum = "e48c92028aaa870e83d51c64e5d4e0b6981b360c522198c23959f219a4e1b15b" [[package]] name = "equivalent" -version = "1.0.2" +version = "1.0.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "877a4ace8713b0bcf2a4e7eec82529c029f1d0619886d18145fea96c3ffe5c0f" +checksum = "5443807d6dff69373d433ab9ef5378ad8df50ca6298caf15de6e52e24aaf54d5" [[package]] name = "expander" @@ -1066,9 +1052,9 @@ dependencies = [ [[package]] name = "ff" -version = "0.13.1" +version = "0.13.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c0b50bfb653653f9ca9095b427bed08ab8d75a137839d9ad64eb11810d5b6393" +checksum = "ded41244b729663b1e574f1b4fb731469f69f79c17667b5d776b16cda0479449" dependencies = [ "rand_core", "subtle", @@ -1443,9 +1429,9 @@ dependencies = [ [[package]] name = "hashbrown" -version = "0.15.2" +version = "0.15.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "bf151400ff0baff5465007dd2f3e717f3fe502074ca563069ce3a6629d07b289" +checksum = "1e087f84d4f86bf4b218b927129862374b72199ae7d8657835f1e89000eea4fb" [[package]] name = "hermit-abi" @@ -1545,12 +1531,12 @@ dependencies = [ [[package]] name = "indexmap" -version = "2.9.0" +version = "2.6.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "cea70ddb795996207ad57735b50c5982d8844f38ba9ee5f1aedcfb708a2aa11e" +checksum = "707907fe3c25f5424cce2cb7e1cbcafee6bdbe735ca90ef77c29e84591e5b9da" dependencies = [ "equivalent", - "hashbrown 0.15.2", + "hashbrown 0.15.0", ] [[package]] @@ -1582,9 +1568,9 @@ dependencies = [ [[package]] name = "itoa" -version = "1.0.15" +version = "1.0.11" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4a5f13b858c8d314ee3e8f639011f7ccefe71f97f96e50151fb991f267928e2c" +checksum = "49f1f14873335454500d59611f1cf4a4b0f786f9ac11f4312a78e4cf2566695b" [[package]] name = "k256" @@ -1617,15 +1603,15 @@ checksum = "bbd2bcb4c963f2ddae06a2efc7e9f3591312473c50c6685e1f298068316e66fe" [[package]] name = "libc" -version = "0.2.172" +version = "0.2.161" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d750af042f7ef4f724306de029d18836c26c1765a54a6a3f094cbd23a7267ffa" +checksum = "8e9489c2807c139ffd9c1794f4af0ebe86a828db53ecdc7fea2111d0fed085d1" [[package]] name = "libsecp256k1" -version = "0.7.2" +version = "0.7.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e79019718125edc905a079a70cfa5f3820bc76139fc91d6f9abc27ea2a887139" +checksum = "95b09eff1b35ed3b33b877ced3a691fc7a481919c7e29c53c906226fcf55e2a1" dependencies = [ "arrayref", "base64", @@ -1790,9 +1776,9 @@ dependencies = [ [[package]] name = "miniz_oxide" -version = "0.8.8" +version = "0.8.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3be647b768db090acb35d5ec5db2b0e1f1de11133ca123b9eacf5137868f892a" +checksum = "e2d80299ef12ff69b16a84bb182e3b9df68b5a91574d3d4fa6e41b65deec4df1" dependencies = [ "adler2", ] @@ -1812,9 +1798,9 @@ dependencies = [ [[package]] name = "nalgebra" -version = "0.33.2" +version = "0.33.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "26aecdf64b707efd1310e3544d709c5c0ac61c13756046aaaba41be5c4f66a3b" +checksum = "3bf139e93ad757869338ad85239cb1d6c067b23b94e5846e637ca6328ee4be60" dependencies = [ "approx", "matrixmultiply", @@ -1917,18 +1903,18 @@ dependencies = [ [[package]] name = "object" -version = "0.36.7" +version = "0.36.5" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "62948e14d923ea95ea2c7c86c71013138b66525b86bdc08d2dcc262bdb497b87" +checksum = "aedf0a2d09c573ed1d8d85b30c119153926a2b36dce0ab28322c09a117a4683e" dependencies = [ "memchr", ] [[package]] name = "once_cell" -version = "1.21.3" +version = "1.20.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "42f5e15c9953c5e4ccceeb2e7382a716482c34515315f7b03532b8b4e8393d2d" +checksum = "1261fe7e33c73b354eab43b1273a57c8f967d0391e80353e51f764ac02cf6775" [[package]] name = "opaque-debug" @@ -2163,31 +2149,29 @@ dependencies = [ [[package]] name = "parity-scale-codec" -version = "3.7.4" +version = "3.6.12" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c9fde3d0718baf5bc92f577d652001da0f8d54cd03a7974e118d04fc888dc23d" +checksum = "306800abfa29c7f16596b5970a588435e3d5b3149683d00c12b699cc19f895ee" dependencies = [ "arrayvec", "bitvec", "byte-slice-cast", "bytes", - "const_format", "impl-trait-for-tuples", "parity-scale-codec-derive", - "rustversion", "serde", ] [[package]] name = "parity-scale-codec-derive" -version = "3.7.4" +version = "3.6.12" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "581c837bb6b9541ce7faa9377c20616e4fb7650f6b0f68bc93c827ee504fb7b3" +checksum = "d830939c76d294956402033aee57a6da7b438f2294eb94864c37b0569053a42c" dependencies = [ "proc-macro-crate", "proc-macro2", "quote", - "syn 2.0.100", + "syn 1.0.109", ] [[package]] @@ -2248,9 +2232,9 @@ dependencies = [ [[package]] name = "pin-project-lite" -version = "0.2.16" +version = "0.2.14" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3b3cff922bd51709b605d9ead9aa71031d81447142d828eb4a6eba76fe619f9b" +checksum = "bda66fc9667c18cb2758a2ac84d1167245054bcf85d5d1aaa6923f45801bdd02" [[package]] name = "pin-utils" @@ -2313,18 +2297,18 @@ checksum = "439ee305def115ba05938db6eb1644ff94165c5ab5e9420d1c1bcedbba909391" [[package]] name = "ppv-lite86" -version = "0.2.21" +version = "0.2.20" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "85eae3c4ed2f50dcfe72643da4befc30deadb458a9b590d720cde2f2b1e97da9" +checksum = "77957b295656769bb8ad2b6a6b09d897d94f05c41b069aede1fcdaa675eaea04" dependencies = [ - "zerocopy 0.8.24", + "zerocopy", ] [[package]] name = "prettyplease" -version = "0.2.32" +version = "0.2.22" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "664ec5419c51e34154eec046ebcba56312d5a2fc3b09a06da188e1ad21afadf6" +checksum = "479cf940fbbb3426c32c5d5176f62ad57549a0bb84773423ba8be9d089f5faba" dependencies = [ "proc-macro2", "syn 2.0.100", @@ -2378,9 +2362,9 @@ dependencies = [ [[package]] name = "proc-macro-warning" -version = "1.84.1" +version = "1.0.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "75eea531cfcd120e0851a3f8aed42c4841f78c889eefafd96339c72677ae42c3" +checksum = "834da187cfe638ae8abb0203f0b33e5ccdb02a28e7199f2f47b3e2754f50edca" dependencies = [ "proc-macro2", "quote", @@ -2449,27 +2433,27 @@ checksum = "60a357793950651c4ed0f3f52338f53b2f809f32d83a07f72909fa13e4c6c1e3" [[package]] name = "redox_syscall" -version = "0.5.11" +version = "0.5.7" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d2f103c6d277498fbceb16e84d317e2a400f160f46904d5f5410848c829511a3" +checksum = "9b6dfecf2c74bce2466cabf93f6664d6998a69eb21e39f4207930065b27b771f" dependencies = [ - "bitflags 2.9.0", + "bitflags 2.6.0", ] [[package]] name = "ref-cast" -version = "1.0.24" +version = "1.0.23" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4a0ae411dbe946a674d89546582cea4ba2bb8defac896622d6496f14c23ba5cf" +checksum = "ccf0a6f84d5f1d581da8b41b47ec8600871962f2a528115b542b362d4b744931" dependencies = [ "ref-cast-impl", ] [[package]] name = "ref-cast-impl" -version = "1.0.24" +version = "1.0.23" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1165225c21bff1f3bbce98f5a1f889949bc902d3575308cc7b0de30b4f6d27c7" +checksum = "bcc303e793d3734489387d205e9b186fac9c6cfacedd98cbb2e8a5943595f3e6" dependencies = [ "proc-macro2", "quote", @@ -2478,13 +2462,13 @@ dependencies = [ [[package]] name = "regex" -version = "1.11.1" +version = "1.11.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b544ef1b4eac5dc2db33ea63606ae9ffcfac26c1416a2806ae0bf5f56b201191" +checksum = "38200e5ee88914975b69f657f0801b6f6dccafd44fd9326302a4aaeecfacb1d8" dependencies = [ "aho-corasick", "memchr", - "regex-automata 0.4.9", + "regex-automata 0.4.8", "regex-syntax 0.8.5", ] @@ -2499,9 +2483,9 @@ dependencies = [ [[package]] name = "regex-automata" -version = "0.4.9" +version = "0.4.8" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "809e8dc61f6de73b46c85f4c96486310fe304c434cfa43669d7b40f711150908" +checksum = "368758f23274712b504848e9d5a6f010445cc8b87a7cdb4d7cbee666c1288da3" dependencies = [ "aho-corasick", "memchr", @@ -2553,21 +2537,21 @@ dependencies = [ [[package]] name = "rustversion" -version = "1.0.20" +version = "1.0.18" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "eded382c5f5f786b989652c49544c4877d9f015cc22e145a5ea8ea66c2921cd2" +checksum = "0e819f2bc632f285be6d7cd36e25940d45b2391dd6d9b939e79de557f7014248" [[package]] name = "ryu" -version = "1.0.20" +version = "1.0.18" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "28d3b2b1366ec20994f1fd18c3c594f05c5dd4bc44d8bb0c1c632c8d6829481f" +checksum = "f3cb5ba0dc43242ce17de99c180e96db90b235b8a9fdc9543c96d2209116bd9f" [[package]] name = "safe_arch" -version = "0.7.4" +version = "0.7.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "96b02de82ddbe1b636e6170c21be622223aea188ef2e139be0a5b219ec215323" +checksum = "c3460605018fdc9612bce72735cba0d27efbcd9904780d44c7e3a9948f96148a" dependencies = [ "bytemuck", ] @@ -2609,9 +2593,9 @@ dependencies = [ [[package]] name = "schnellru" -version = "0.2.4" +version = "0.2.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "356285bbf17bea63d9e52e96bd18f039672ac92b55b8cb997d6162a2a37d1649" +checksum = "c9a8ef13a93c54d20580de1e5c413e624e53121d42fc7e2c11d10ef7f8b02367" dependencies = [ "ahash", "cfg-if", @@ -2687,9 +2671,9 @@ dependencies = [ [[package]] name = "semver" -version = "1.0.26" +version = "1.0.23" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "56e6fa9c48d24d85fb3de5ad847117517440f6beceb7798af16b4a87d616b8d0" +checksum = "61697e0a1c7e512e84a621326239844a24d8207b4669b41bc18b32ea5cbf988b" [[package]] name = "serde" @@ -2702,9 +2686,9 @@ dependencies = [ [[package]] name = "serde_bytes" -version = "0.11.17" +version = "0.11.15" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8437fd221bde2d4ca316d61b90e337e9e702b3820b87d63caa9ba6c02bd06d96" +checksum = "387cc504cb06bb40a96c8e04e951fe01854cf6bc921053c954e4a606d9675c6a" dependencies = [ "serde", ] @@ -2722,9 +2706,9 @@ dependencies = [ [[package]] name = "serde_json" -version = "1.0.140" +version = "1.0.129" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "20068b6e96dc6c9bd23e01df8827e6c7e1f2fddd43c21810382803c136b99373" +checksum = "6dbcf9b78a125ee667ae19388837dd12294b858d101fdd393cb9d5501ef09eb2" dependencies = [ "itoa", "memchr", @@ -2840,9 +2824,9 @@ dependencies = [ [[package]] name = "smallvec" -version = "1.15.0" +version = "1.13.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8917285742e9f3e1683f0a9c4e6b57960b7314d0b08d30d1ecd426713ee2eee9" +checksum = "3c5e1a9a646d36c3599cd173a41282daf47c44583ad367b8e6837255952e5c67" [[package]] name = "sp-api" @@ -3415,18 +3399,18 @@ dependencies = [ [[package]] name = "thiserror" -version = "1.0.69" +version = "1.0.64" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b6aaf5339b578ea85b50e080feb250a3e8ae8cfcdff9a461c9ec2904bc923f52" +checksum = "d50af8abc119fb8bb6dbabcfa89656f46f84aa0ac7688088608076ad2b459a84" dependencies = [ "thiserror-impl", ] [[package]] name = "thiserror-impl" -version = "1.0.69" +version = "1.0.64" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4fee6c4efc90059e10f81e6d42c60a18f76588c3d74cb83a0b242a2b6c7504c1" +checksum = "08904e7672f5eb876eaaf87e0ce17857500934f4981c4a0ab2b4aa98baac7fc3" dependencies = [ "proc-macro2", "quote", @@ -3445,9 +3429,9 @@ dependencies = [ [[package]] name = "time" -version = "0.3.41" +version = "0.3.36" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8a7619e19bc266e0f9c5e6686659d394bc57973859340060a69221e57dbc0c40" +checksum = "5dfd88e563464686c916c7e46e623e520ddc6d79fa6641390f2e3fa86e83e885" dependencies = [ "deranged", "itoa", @@ -3460,15 +3444,15 @@ dependencies = [ [[package]] name = "time-core" -version = "0.1.4" +version = "0.1.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c9e9a38711f559d9e3ce1cdb06dd7c5b8ea546bc90052da6d06bb76da74bb07c" +checksum = "ef927ca75afb808a4d64dd374f00a2adf8d0fcff8e7b184af886c3c87ec4a3f3" [[package]] name = "time-macros" -version = "0.2.22" +version = "0.2.18" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3526739392ec93fd8b359c8e98514cb3e8e021beb4e5f597b00a0221f8ed8a49" +checksum = "3f252a68540fde3a3877aeea552b832b40ab9a69e318efd078774a01ddee1ccf" dependencies = [ "num-conv", "time-core", @@ -3485,9 +3469,9 @@ dependencies = [ [[package]] name = "tinyvec" -version = "1.9.0" +version = "1.8.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "09b3661f17e86524eccd4371ab0429194e0d7c008abb45f7a7495b1719463c71" +checksum = "445e881f4f6d382d5f27c034e25eb92edd7c784ceab92a0937db7f2e9471b938" dependencies = [ "tinyvec_macros", ] @@ -3500,9 +3484,9 @@ checksum = "1f3ccbac311fea05f86f61904b462b55fb3df8837a366dfc601a0161d0532f20" [[package]] name = "toml" -version = "0.8.20" +version = "0.8.19" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "cd87a5cdd6ffab733b2f74bc4fd7ee5fff6634124999ac278c35fc78c6120148" +checksum = "a1ed1f98e3fdc28d6d910e6737ae6ab1a93bf1985935a1193e68f93eeb68d24e" dependencies = [ "serde", "serde_spanned", @@ -3534,9 +3518,9 @@ dependencies = [ [[package]] name = "tracing" -version = "0.1.41" +version = "0.1.40" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "784e0ac535deb450455cbfa28a6f0df145ea1bb7ae51b821cf5e7927fdcfbdd0" +checksum = "c3523ab5a71916ccf420eebdf5521fcef02141234bbc0b8a49f2fdc4544364ef" dependencies = [ "log", "pin-project-lite", @@ -3546,9 +3530,9 @@ dependencies = [ [[package]] name = "tracing-attributes" -version = "0.1.28" +version = "0.1.27" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "395ae124c09f9e6918a2310af6038fba074bcf474ac352496d5910dd59a2226d" +checksum = "34704c8d6ebcbc939824180af020566b01a7c01f80641264eba0999f6c2b6be7" dependencies = [ "proc-macro2", "quote", @@ -3557,9 +3541,9 @@ dependencies = [ [[package]] name = "tracing-core" -version = "0.1.33" +version = "0.1.32" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e672c95779cf947c5311f83787af4fa8fffd12fb27e4993211a84bdfd9610f9c" +checksum = "c06d3da6113f116aaee68e4d601191614c9053067f9ab7f6edbcb161237daa54" dependencies = [ "once_cell", "valuable", @@ -3578,9 +3562,9 @@ dependencies = [ [[package]] name = "tracing-subscriber" -version = "0.3.19" +version = "0.3.18" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e8189decb5ac0fa7bc8b96b7cb9b2701d60d48805aca84a238004d665fcc4008" +checksum = "ad0f048c97dbd9faa9b7df56362b8ebcaa52adb06b498c050d2f4e32f90a7a8b" dependencies = [ "matchers", "nu-ansi-term", @@ -3636,9 +3620,9 @@ dependencies = [ [[package]] name = "typenum" -version = "1.18.0" +version = "1.17.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1dccffe3ce07af9386bfd29e80c0ab1a8205a2fc34e4bcd40364df902cfa8f3f" +checksum = "42ff0bf0c66b8238c6f3b578df37d0b7848e55df8577b3f74f92a69acceeb825" [[package]] name = "uint" @@ -3654,9 +3638,9 @@ dependencies = [ [[package]] name = "unicode-ident" -version = "1.0.18" +version = "1.0.13" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5a5f39404a5da50712a4c1eecf25e90dd62b613502b7e925fd4e4d19b5c96512" +checksum = "e91b56cd4cadaeb79bbf1a5645f6b4f8dc5bde8834ad5894a8db35fda9efa1fe" [[package]] name = "unicode-normalization" @@ -3675,9 +3659,9 @@ checksum = "ebc1c04c71510c7f702b52b7c350734c9ff1295c464a03335b00bb84fc54f853" [[package]] name = "valuable" -version = "0.1.1" +version = "0.1.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ba73ea9cf16a25df0c8caa16c51acb937d5712a8429db78a3ee29d5dcacd3a65" +checksum = "830b7e5d4d90034032940e4ace0d9a9a057e7a45cd94e6c007832e39edb82f6d" [[package]] name = "version_check" @@ -3687,9 +3671,9 @@ checksum = "0b928f33d975fc6ad9f86c8f283853ad26bdd5b10b7f1542aa2fa15e2289105a" [[package]] name = "w3f-bls" -version = "0.1.9" +version = "0.1.6" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e6bfb937b3d12077654a9e43e32a4e9c20177dd9fea0f3aba673e7840bb54f32" +checksum = "6a48c48447120a85b0bdb897ba9426a7aa15b4229498a2e19103e8c9368dd4b2" dependencies = [ "ark-bls12-377", "ark-bls12-381", @@ -3698,12 +3682,14 @@ dependencies = [ "ark-serialize", "ark-serialize-derive", "arrayref", + "constcat", "digest 0.10.7", "rand", "rand_chacha", "rand_core", "sha2 0.10.8", "sha3", + "thiserror", "zeroize", ] @@ -3725,9 +3711,9 @@ checksum = "9c8d87e72b64a3b4db28d11ce29237c246188f4f51057d65a7eab63b7987e423" [[package]] name = "wide" -version = "0.7.32" +version = "0.7.28" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "41b5576b9a81633f3e8df296ce0063042a73507636cbe956c61133dd7034ab22" +checksum = "b828f995bf1e9622031f8009f8481a85406ce1f4d4588ff746d872043e855690" dependencies = [ "bytemuck", "safe_arch", @@ -3766,9 +3752,9 @@ checksum = "712e227841d057c1ee1cd2fb22fa7e5a5461ae8e48fa2ca79ec42cfc1931183f" [[package]] name = "windows-sys" -version = "0.59.0" +version = "0.52.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1e38bc4d79ed67fd075bcc251a1c39b32a1776bbe92e5bef1f0bf1f8c531853b" +checksum = "282be5f36a8ce781fad8c8ae18fa3f9beff57ec1b52cb3de0789201425d9a33d" dependencies = [ "windows-targets", ] @@ -3861,16 +3847,8 @@ version = "0.7.35" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "1b9b4fd18abc82b8136838da5d50bae7bdea537c574d8dc1a34ed098d6c166f0" dependencies = [ - "zerocopy-derive 0.7.35", -] - -[[package]] -name = "zerocopy" -version = "0.8.24" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2586fea28e186957ef732a5f8b3be2da217d65c5969d4b1e17f973ebbe876879" -dependencies = [ - "zerocopy-derive 0.8.24", + "byteorder", + "zerocopy-derive", ] [[package]] @@ -3884,17 +3862,6 @@ dependencies = [ "syn 2.0.100", ] -[[package]] -name = "zerocopy-derive" -version = "0.8.24" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a996a8f63c5c4448cd959ac1bab0aaa3306ccfd060472f85943ee0750f0169be" -dependencies = [ - "proc-macro2", - "quote", - "syn 2.0.100", -] - [[package]] name = "zeroize" version = "1.8.1" diff --git a/pallets/pass/src/lib.rs b/pallets/pass/src/lib.rs index 44ab8bc..66eac14 100644 --- a/pallets/pass/src/lib.rs +++ b/pallets/pass/src/lib.rs @@ -163,8 +163,11 @@ pub mod pallet { } #[pallet::feeless_if( - |_: &OriginFor, device_id: &DeviceId, credential: &CredentialOf, _: &Option>| -> bool { - Pallet::::try_authenticate(device_id, credential).is_ok() + |origin: &OriginFor, device_id: &DeviceId, credential: &CredentialOf, _: &Option>| -> bool { + let Ok(who) = ensure_signed(origin.clone()) else { + return false; + }; + Pallet::::try_authenticate(&who, device_id, credential).is_ok() } )] #[pallet::call_index(3)] @@ -175,7 +178,7 @@ pub mod pallet { duration: Option>, ) -> DispatchResult { let who = ensure_signed(origin)?; - let account_id = Self::try_authenticate(&device_id, &credential)?; + let account_id = Self::try_authenticate(&who, &device_id, &credential)?; Self::try_add_session(&who, &account_id, duration)?; Ok(()) } @@ -200,7 +203,7 @@ pub mod pallet { ) -> DispatchResult { let account_id = if let Some((device_id, credential)) = maybe_credential { let account_id = Self::account_id_for(credential.user_id())?; - Self::do_authenticate(credential, device_id)?; + Self::try_authenticate_for_dispatch(credential, device_id, &call)?; account_id } else { Self::ensure_signer_is_valid_session(origin)? @@ -269,6 +272,7 @@ impl, I: 'static> Pallet { } pub(crate) fn try_authenticate( + session_key: &T::AccountId, device_id: &DeviceId, credential: &CredentialOf, ) -> Result { @@ -280,18 +284,36 @@ impl, I: 'static> Pallet { let device = Devices::::get(&account_id, device_id).ok_or(Error::::DeviceNotFound)?; device - .verify_user(credential) + .verify_user(credential, &session_key.encode()) .ok_or(Error::::CredentialInvalid)?; Ok(account_id) } + pub(crate) fn try_authenticate_for_dispatch( + credential: CredentialOf, + device_id: DeviceId, + call: &RuntimeCallFor, + ) -> Result { + let account_id = Self::account_id_for(credential.user_id())?; + ensure!( + Self::account_exists(&account_id), + Error::::AccountNotFound + ); + let device = + Devices::::get(&account_id, device_id).ok_or(Error::::DeviceNotFound)?; + device + .verify_user(&credential, &call.encode()) + .ok_or(Error::::CredentialInvalid)?; + Ok(account_id) + } + pub(crate) fn do_add_device( who: &T::AccountId, attestation: DeviceAttestationOf, ) -> DispatchResult { let device_id = attestation.device_id(); - let device = T::Authenticator::verify_device(attestation.clone()) + let device = T::Authenticator::verify_device(attestation.clone(), &[]) .ok_or(Error::::DeviceAttestationInvalid)?; Devices::::insert(who, device_id, device); @@ -330,23 +352,6 @@ impl, I: 'static> Pallet { } } - pub(crate) fn do_authenticate( - credential: CredentialOf, - device_id: DeviceId, - ) -> Result { - let account_id = Self::account_id_for(credential.user_id())?; - ensure!( - Self::account_exists(&account_id), - Error::::AccountNotFound - ); - let device = - Devices::::get(&account_id, device_id).ok_or(Error::::DeviceNotFound)?; - device - .verify_user(&credential) - .ok_or(Error::::CredentialInvalid)?; - Ok(account_id) - } - fn do_remove_session(session_key: &T::AccountId) { Self::cancel_scheduled_session_key_removal(session_key); // Decrements the provider reference of this `Session` key account once it's expired. @@ -380,7 +385,7 @@ impl, I: 'static> Pallet { .min(T::MaxSessionDuration::get()); let until = block_number + session_duration; - Sessions::::insert(session_key.clone(), (account_id.clone(), until)); + Sessions::::insert(session_key.clone(), (account_id.clone(), until.clone())); Self::schedule_next_removal(session_key, duration)?; Self::deposit_event(Event::::SessionCreated { diff --git a/pallets/pass/src/mock.rs b/pallets/pass/src/mock.rs index f9dd34a..af41339 100644 --- a/pallets/pass/src/mock.rs +++ b/pallets/pass/src/mock.rs @@ -144,19 +144,19 @@ impl pallet_pass::BenchmarkHelper for BenchmarkHelper { fn device_attestation(device_id: DeviceId) -> DeviceAttestationOf { PassDeviceAttestation::AuthenticatorAAuthenticator(authenticator_a::DeviceAttestation { device_id, - challenge: authenticator_a::Authenticator::generate(&()), + challenge: authenticator_a::Authenticator::generate(&(), &[]), }) } - fn credential(user_id: HashedUserId) -> CredentialOf { + fn credential(user_id: HashedUserId, xtc: &impl ExtrinsicContext) -> CredentialOf { PassCredential::AuthenticatorAAuthenticator(authenticator_a::Credential { user_id, - challenge: authenticator_a::Authenticator::generate(&()), + challenge: authenticator_a::Authenticator::generate(&(), xtc), }) } } -pub fn new_test_ext() -> sp_io::TestExternalities { +pub fn new_test_ext() -> TestExternalities { let mut ext = TestExternalities::new(Default::default()); ext.execute_with(|| { System::set_block_number(1); diff --git a/pallets/pass/src/mock/authenticators.rs b/pallets/pass/src/mock/authenticators.rs index 7fa1c61..4affb6c 100644 --- a/pallets/pass/src/mock/authenticators.rs +++ b/pallets/pass/src/mock/authenticators.rs @@ -59,8 +59,8 @@ pub mod authenticator_a { impl Challenger for Authenticator { type Context = (); - fn generate(_: &Self::Context) -> Challenge { - let (hash, _) = RandomnessFromBlockNumber::random_seed(); + fn generate(_: &Self::Context, xtc: &Xtc) -> Challenge { + let (hash, _) = RandomnessFromBlockNumber::random(xtc.as_ref()); hash.0 } } @@ -178,8 +178,8 @@ pub mod authenticator_b { impl Challenger for AuthenticatorB { type Context = DeviceId; - fn generate(context: &Self::Context) -> Challenge { - let (hash, _) = RandomnessFromBlockNumber::random(context); + fn generate(context: &Self::Context, xtc: &Xtc) -> Challenge { + let (hash, _) = RandomnessFromBlockNumber::random(&[context, xtc.as_ref()].concat()); hash.0 } } diff --git a/pallets/pass/src/tests.rs b/pallets/pass/src/tests.rs index 69396f0..9b9e301 100644 --- a/pallets/pass/src/tests.rs +++ b/pallets/pass/src/tests.rs @@ -39,7 +39,7 @@ mod register { PassDeviceAttestation::AuthenticatorAAuthenticator( authenticator_a::DeviceAttestation { device_id: THE_DEVICE, - challenge: authenticator_a::Authenticator::generate(&()), + challenge: authenticator_a::Authenticator::generate(&(), &[]), } ), ), @@ -57,7 +57,7 @@ mod register { PassDeviceAttestation::AuthenticatorAAuthenticator( authenticator_a::DeviceAttestation { device_id: THE_DEVICE, - challenge: authenticator_a::Authenticator::generate(&()), + challenge: authenticator_a::Authenticator::generate(&(), &[]), } ), )); @@ -71,7 +71,7 @@ mod register { PassDeviceAttestation::AuthenticatorAAuthenticator( authenticator_a::DeviceAttestation { device_id: THE_DEVICE, - challenge: authenticator_a::Authenticator::generate(&()), + challenge: authenticator_a::Authenticator::generate(&(), &[]), } ), ), @@ -91,7 +91,19 @@ mod register { AccountNameB::get(), PassDeviceAttestation::AuthenticatorB(authenticator_b::DeviceAttestation { device_id: THE_DEVICE, - challenge: AuthenticatorB::generate(&OTHER_DEVICE), + challenge: AuthenticatorB::generate(&OTHER_DEVICE, &[]), + }), + ), + Error::::DeviceAttestationInvalid + ); + + assert_noop!( + Pass::register( + RuntimeOrigin::signed(SIGNER), + AccountNameB::get(), + PassDeviceAttestation::AuthenticatorB(authenticator_b::DeviceAttestation { + device_id: THE_DEVICE, + challenge: AuthenticatorB::generate(&THE_DEVICE, &b"any_non_empty_value"), }), ), Error::::DeviceAttestationInvalid @@ -113,7 +125,7 @@ mod register { PassDeviceAttestation::AuthenticatorAAuthenticator( authenticator_a::DeviceAttestation { device_id: THE_DEVICE, - challenge: authenticator_a::Authenticator::generate(&()), + challenge: authenticator_a::Authenticator::generate(&(), &[]), } ), )); @@ -145,7 +157,7 @@ fn prepare(user_id: HashedUserId) -> sp_io::TestExternalities { PassDeviceAttestation::AuthenticatorAAuthenticator( authenticator_a::DeviceAttestation { device_id: THE_DEVICE, - challenge: authenticator_a::Authenticator::generate(&()), + challenge: authenticator_a::Authenticator::generate(&(), &[]), } ), )); @@ -167,7 +179,7 @@ mod authenticate { THE_DEVICE, PassCredential::AuthenticatorAAuthenticator(authenticator_a::Credential { user_id: AccountNameB::get(), - challenge: authenticator_a::Authenticator::generate(&()), + challenge: authenticator_a::Authenticator::generate(&(), &OTHER), }), Some(DURATION), ), @@ -185,7 +197,7 @@ mod authenticate { OTHER_DEVICE, PassCredential::AuthenticatorAAuthenticator(authenticator_a::Credential { user_id: AccountNameA::get(), - challenge: authenticator_a::Authenticator::generate(&()), + challenge: authenticator_a::Authenticator::generate(&(), &OTHER), }), Some(DURATION), ), @@ -204,7 +216,7 @@ mod authenticate { AccountNameA::get(), PassDeviceAttestation::AuthenticatorB(authenticator_b::DeviceAttestation { device_id: THE_DEVICE, - challenge: AuthenticatorB::generate(&THE_DEVICE), + challenge: AuthenticatorB::generate(&THE_DEVICE, &[]), }), )); @@ -214,7 +226,20 @@ mod authenticate { THE_DEVICE, PassCredential::AuthenticatorB(authenticator_b::Credential::new( AccountNameA::get(), - AuthenticatorB::generate(&OTHER_DEVICE) + AuthenticatorB::generate(&OTHER_DEVICE, &OTHER) + )), + Some(DURATION), + ), + Error::::CredentialInvalid + ); + + assert_noop!( + Pass::authenticate( + RuntimeOrigin::signed(OTHER), + THE_DEVICE, + PassCredential::AuthenticatorB(authenticator_b::Credential::new( + AccountNameA::get(), + AuthenticatorB::generate(&THE_DEVICE, &[]) )), Some(DURATION), ), @@ -233,7 +258,7 @@ mod authenticate { AccountNameA::get(), PassDeviceAttestation::AuthenticatorB(authenticator_b::DeviceAttestation { device_id: THE_DEVICE, - challenge: AuthenticatorB::generate(&THE_DEVICE), + challenge: AuthenticatorB::generate(&THE_DEVICE, &[]), }), )); assert_ok!(Pass::authenticate( @@ -242,7 +267,7 @@ mod authenticate { PassCredential::AuthenticatorB( authenticator_b::Credential::new( AccountNameA::get(), - AuthenticatorB::generate(&AccountNameA::get()), + AuthenticatorB::generate(&AccountNameA::get(), &SIGNER), ) .sign(&THE_DEVICE) ), @@ -252,7 +277,7 @@ mod authenticate { RuntimeOrigin::signed(SIGNER), PassDeviceAttestation::AuthenticatorB(authenticator_b::DeviceAttestation { device_id: OTHER_DEVICE, - challenge: AuthenticatorB::generate(&OTHER_DEVICE), + challenge: AuthenticatorB::generate(&OTHER_DEVICE, &[]), }), )); @@ -263,7 +288,7 @@ mod authenticate { PassCredential::AuthenticatorB( authenticator_b::Credential::new( AccountNameA::get(), - AuthenticatorB::generate(&AccountNameA::get()) + AuthenticatorB::generate(&AccountNameA::get(), &OTHER), ) .sign(&OTHER_DEVICE) ), @@ -284,7 +309,7 @@ mod authenticate { AccountNameA::get(), PassDeviceAttestation::AuthenticatorB(authenticator_b::DeviceAttestation { device_id: THE_DEVICE, - challenge: AuthenticatorB::generate(&THE_DEVICE), + challenge: AuthenticatorB::generate(&THE_DEVICE, &[]), }), )); assert_ok!(Pass::register( @@ -292,7 +317,7 @@ mod authenticate { AccountNameB::get(), PassDeviceAttestation::AuthenticatorB(authenticator_b::DeviceAttestation { device_id: OTHER_DEVICE, - challenge: AuthenticatorB::generate(&OTHER_DEVICE), + challenge: AuthenticatorB::generate(&OTHER_DEVICE, &[]), }), )); @@ -303,7 +328,7 @@ mod authenticate { PassCredential::AuthenticatorB( authenticator_b::Credential::new( AccountNameA::get(), - AuthenticatorB::generate(&AccountNameA::get()), + AuthenticatorB::generate(&AccountNameA::get(), &OTHER), ) .sign(&OTHER_DEVICE) ), @@ -324,7 +349,7 @@ mod authenticate { THE_DEVICE, PassCredential::AuthenticatorAAuthenticator(authenticator_a::Credential { user_id: AccountNameA::get(), - challenge: authenticator_a::Authenticator::generate(&()), + challenge: authenticator_a::Authenticator::generate(&(), &OTHER), }), Some(DURATION), )); @@ -349,7 +374,7 @@ mod authenticate { AccountNameA::get(), PassDeviceAttestation::AuthenticatorB(authenticator_b::DeviceAttestation { device_id: THE_DEVICE, - challenge: AuthenticatorB::generate(&THE_DEVICE), + challenge: AuthenticatorB::generate(&THE_DEVICE, &[]), }), )); @@ -359,7 +384,7 @@ mod authenticate { PassCredential::AuthenticatorB( authenticator_b::Credential::new( AccountNameA::get(), - AuthenticatorB::generate(&AccountNameA::get()) + AuthenticatorB::generate(&AccountNameA::get(), &SIGNER) ) .sign(&THE_DEVICE) ), @@ -389,7 +414,7 @@ mod add_device { THE_DEVICE, PassCredential::AuthenticatorAAuthenticator(authenticator_a::Credential { user_id: AccountNameA::get(), - challenge: authenticator_a::Authenticator::generate(&()), + challenge: authenticator_a::Authenticator::generate(&(), &SIGNER), }), Some(DURATION), )); @@ -406,7 +431,7 @@ mod add_device { PassDeviceAttestation::AuthenticatorAAuthenticator( authenticator_a::DeviceAttestation { device_id: OTHER_DEVICE, - challenge: authenticator_a::Authenticator::generate(&()), + challenge: authenticator_a::Authenticator::generate(&(), &[]), } ), ), @@ -425,7 +450,7 @@ mod add_device { PassDeviceAttestation::AuthenticatorAAuthenticator( authenticator_a::DeviceAttestation { device_id: OTHER_DEVICE, - challenge: authenticator_a::Authenticator::generate(&()), + challenge: authenticator_a::Authenticator::generate(&(), &[]), } ), ),); @@ -444,6 +469,7 @@ mod add_device { mod dispatch { use super::*; use crate::Sessions; + use codec::Encode; parameter_types! { pub Call: Box = Box::new(RuntimeCall::System(frame_system::Call::remark_with_event { @@ -463,7 +489,7 @@ mod dispatch { THE_DEVICE, PassCredential::AuthenticatorAAuthenticator(authenticator_a::Credential { user_id: AccountNameA::get(), - challenge: authenticator_a::Authenticator::generate(&()), + challenge: authenticator_a::Authenticator::generate(&(), &SIGNER), }), Some(DURATION), )); @@ -506,7 +532,10 @@ mod dispatch { OTHER_DEVICE, PassCredential::AuthenticatorAAuthenticator(authenticator_a::Credential { user_id: AccountNameB::get(), - challenge: authenticator_a::Authenticator::generate(&()) + challenge: authenticator_a::Authenticator::generate( + &(), + &Call::get().encode() + ), }) )), None @@ -527,7 +556,10 @@ mod dispatch { OTHER_DEVICE, PassCredential::AuthenticatorAAuthenticator(authenticator_a::Credential { user_id: AccountNameA::get(), - challenge: authenticator_a::Authenticator::generate(&()) + challenge: authenticator_a::Authenticator::generate( + &(), + &Call::get().encode() + ) }) )), None @@ -541,7 +573,7 @@ mod dispatch { fn fail_with_credentials_if_credential_invalid() { prepare().execute_with(|| { // On block 1 - let challenge = authenticator_a::Authenticator::generate(&()); + let challenge = authenticator_a::Authenticator::generate(&(), &Call::get().encode()); // On block 3 run_to(3); @@ -562,7 +594,7 @@ mod dispatch { Error::::CredentialInvalid ); - let challenge = authenticator_a::Authenticator::generate(&()); + let challenge = authenticator_a::Authenticator::generate(&(), &Call::get().encode()); assert_ok!(Pass::dispatch( RuntimeOrigin::signed(OTHER), Call::get(), @@ -588,7 +620,10 @@ mod dispatch { THE_DEVICE, PassCredential::AuthenticatorAAuthenticator(authenticator_a::Credential { user_id: AccountNameA::get(), - challenge: authenticator_a::Authenticator::generate(&()) + challenge: authenticator_a::Authenticator::generate( + &(), + &Call::get().encode() + ) }) )), None @@ -610,7 +645,10 @@ mod dispatch { THE_DEVICE, PassCredential::AuthenticatorAAuthenticator(authenticator_a::Credential { user_id: AccountNameA::get(), - challenge: authenticator_a::Authenticator::generate(&()) + challenge: authenticator_a::Authenticator::generate( + &(), + &Call::get().encode() + ) }) )), Some(OTHER) diff --git a/pallets/pass/src/types.rs b/pallets/pass/src/types.rs index 3f137a6..bd3c1c2 100644 --- a/pallets/pass/src/types.rs +++ b/pallets/pass/src/types.rs @@ -4,7 +4,6 @@ use frame_system::EnsureSigned; use sp_core::TypedGet; use sp_runtime::{morph_types, traits::StaticLookup}; -// pub type HashedUserId = ::Hash; type AccountIdOf = ::AccountId; pub type ContextOf = <<>::Authenticator as fc_traits_authn::Authenticator>::Challenger as fc_traits_authn::Challenger>::Context; @@ -36,14 +35,20 @@ pub type EnsureSignedPays = MapSuccess>, PaymentForCreate, Amount, Beneficiary>>; #[cfg(feature = "runtime-benchmarks")] -use ::{fc_traits_authn::HashedUserId, frame_system::pallet_prelude::OriginFor}; +pub use benchmarks::*; #[cfg(feature = "runtime-benchmarks")] -pub trait BenchmarkHelper -where - T: Config, - I: 'static, -{ - fn register_origin() -> OriginFor; - fn device_attestation(device_id: fc_traits_authn::DeviceId) -> DeviceAttestationOf; - fn credential(user_id: HashedUserId) -> CredentialOf; +mod benchmarks { + use super::*; + use fc_traits_authn::{ExtrinsicContext, HashedUserId}; + use frame_system::pallet_prelude::OriginFor; + + pub trait BenchmarkHelper + where + T: Config, + I: 'static, + { + fn register_origin() -> OriginFor; + fn device_attestation(device_id: fc_traits_authn::DeviceId) -> DeviceAttestationOf; + fn credential(user_id: HashedUserId, xtc: &impl ExtrinsicContext) -> CredentialOf; + } } diff --git a/traits/authn/proc/src/lib.rs b/traits/authn/proc/src/lib.rs index ad472e7..a25a1a7 100644 --- a/traits/authn/proc/src/lib.rs +++ b/traits/authn/proc/src/lib.rs @@ -144,7 +144,7 @@ pub fn composite_authenticator(input: TokenStream) -> TokenStream { let match_attestations = authenticators.clone().into_iter().map(|(id, p)| { quote! { #device_attestation::#id(attestation) => { - #device::#id(#p::verify_device(attestation)?) + #device::#id(#p::verify_device(attestation, xtc)?) } } }); @@ -166,7 +166,7 @@ pub fn composite_authenticator(input: TokenStream) -> TokenStream { ( #device::#id(device), #credential::#id(credential), - ) => device.verify_user(credential) + ) => device.verify_user(credential, xtc) } }); @@ -216,7 +216,7 @@ pub fn composite_authenticator(input: TokenStream) -> TokenStream { type DeviceAttestation = #device_attestation; type Device = #device; - fn verify_device(attestation: Self::DeviceAttestation) -> Option { + fn verify_device(attestation: Self::DeviceAttestation, xtc: &impl ExtrinsicContext) -> Option { Some(match attestation { #(#match_attestations),* }) @@ -230,7 +230,7 @@ pub fn composite_authenticator(input: TokenStream) -> TokenStream { impl Challenger for #auth_struct { type Context = (); - fn generate(_: &Self::Context) -> Challenge { + fn generate(_: &Self::Context, xtc: &Xtc) -> Challenge { unimplemented!( "This method should not be called, instead call inner `generate` on each challenger" ) @@ -279,7 +279,7 @@ pub fn composite_authenticator(input: TokenStream) -> TokenStream { type Challenger = #auth_struct; type Credential = #credential; - fn verify_user(&self, credential: &Self::Credential) -> Option<()> { + fn verify_user(&self, credential: &Self::Credential, xtc: &impl ExtrinsicContext) -> Option<()> { match (self, credential) { #(#match_verify_user),*, _ => None, diff --git a/traits/authn/src/lib.rs b/traits/authn/src/lib.rs index b5eae4a..36ff091 100644 --- a/traits/authn/src/lib.rs +++ b/traits/authn/src/lib.rs @@ -13,7 +13,7 @@ const LOG_TARGET: &str = "authn"; pub mod composite_prelude { pub use crate::{ Authenticator, AuthorityId, Challenge, Challenger, DeviceChallengeResponse, DeviceId, - HashedUserId, UserAuthenticator, UserChallengeResponse, + ExtrinsicContext, HashedUserId, UserAuthenticator, UserChallengeResponse, }; pub use codec::{Decode, Encode, MaxEncodedLen}; pub use frame_support::{pallet_prelude::TypeInfo, traits::Get, DebugNoBound, EqNoBound}; @@ -48,15 +48,27 @@ pub type AuthorityId = [u8; 32]; pub const HASHED_USER_ID_LEN: usize = 32; pub type HashedUserId = [u8; HASHED_USER_ID_LEN]; +/// An extrinsic context, provided by the Authenticator verification call. The type cannot be +/// known by the challenger implementation, so the content would be handled as a slice of bytes. +pub trait ExtrinsicContext: AsRef<[u8]> {} + +impl ExtrinsicContext for T where T: AsRef<[u8]> {} + /// Given some context it deterministically generates a "challenge" used by authenticators pub trait Challenger { + /// An intrinsic context, provided by the challenger implementation. Usually, something that + /// comes from the system. type Context; - fn generate(cx: &Self::Context) -> Challenge; + fn generate(cx: &Self::Context, xtc: &Xtc) -> Challenge; /// Ensure that given the context produces the same challenge - fn check_challenge(cx: &Self::Context, challenge: &[u8]) -> Option<()> { - Self::generate(cx).eq(challenge).then_some(()) + fn check_challenge( + cx: &Self::Context, + xtc: &Xtc, + challenge: &[u8], + ) -> Option<()> { + Self::generate(cx, xtc).eq(challenge).then_some(()) } } @@ -67,7 +79,10 @@ pub trait Authenticator { type DeviceAttestation: DeviceChallengeResponse>; type Device: UserAuthenticator; - fn verify_device(attestation: Self::DeviceAttestation) -> Option { + fn verify_device( + attestation: Self::DeviceAttestation, + xtc: &impl ExtrinsicContext, + ) -> Option { log::trace!(target: LOG_TARGET, "Verifying device with attestation: {:?}", attestation); log::trace!(target: LOG_TARGET, "Assert authority {:?}", attestation.authority()); @@ -79,7 +94,7 @@ pub trait Authenticator { let (cx, challenge) = attestation.used_challenge(); log::trace!(target: LOG_TARGET, "Check challenge {:?}", &challenge); - Self::Challenger::check_challenge(&cx, &challenge)?; + Self::Challenger::check_challenge(&cx, xtc, &challenge)?; log::trace!(target: LOG_TARGET, "Challenge checked"); log::trace!(target: LOG_TARGET, "Validate attestation"); @@ -99,7 +114,11 @@ pub trait UserAuthenticator: FullCodec + MaxEncodedLen + TypeInfo { type Challenger: Challenger; type Credential: UserChallengeResponse>; - fn verify_user(&self, credential: &Self::Credential) -> Option<()> { + fn verify_user( + &self, + credential: &Self::Credential, + xtc: &impl ExtrinsicContext, + ) -> Option<()> { log::trace!(target: LOG_TARGET, "Verifying user for credential: {:?}", credential); log::trace!(target: LOG_TARGET, "Assert authority {:?}", credential.authority()); @@ -111,7 +130,7 @@ pub trait UserAuthenticator: FullCodec + MaxEncodedLen + TypeInfo { let (cx, challenge) = credential.used_challenge(); log::trace!(target: LOG_TARGET, "Check challenge {:?}", &challenge); - Self::Challenger::check_challenge(&cx, &challenge)?; + Self::Challenger::check_challenge(&cx, xtc, &challenge)?; log::trace!(target: LOG_TARGET, "Challenge checked"); log::trace!(target: LOG_TARGET, "Credential verified"); diff --git a/traits/authn/src/util.rs b/traits/authn/src/util.rs index 02ed89f..c087e75 100644 --- a/traits/authn/src/util.rs +++ b/traits/authn/src/util.rs @@ -64,13 +64,13 @@ where type Challenger = Ch; type Credential = Cred; - fn device_id(&self) -> &DeviceId { - self.0.as_ref() - } - fn verify_credential(&self, credential: &Self::Credential) -> Option<()> { self.0.verify(credential) } + + fn device_id(&self) -> &DeviceId { + self.0.as_ref() + } } impl MaxEncodedLen for Dev { @@ -136,20 +136,20 @@ mod pass_key { } pub mod dummy { - use core::marker::PhantomData; - + use crate::{ + AuthorityId, Challenger, DeviceChallengeResponse, DeviceId, ExtrinsicContext, HashedUserId, + UserChallengeResponse, + }; use codec::{Decode, Encode, MaxEncodedLen}; + use core::marker::PhantomData; use frame_support::{ - parameter_types, sp_runtime::str_array as s, traits::Get, DebugNoBound, EqNoBound, - PartialEqNoBound, + parameter_types, + sp_runtime::{app_crypto::sp_core::blake2_256, str_array as s}, + traits::Get, + DebugNoBound, EqNoBound, PartialEqNoBound, }; use scale_info::TypeInfo; - use crate::{ - AuthorityId, Challenger, DeviceChallengeResponse, DeviceId, HashedUserId, - UserChallengeResponse, - }; - use super::{Auth, Dev, VerifyCredential}; #[derive( @@ -199,8 +199,8 @@ pub mod dummy { impl Challenger for DummyChallenger { type Context = Self; - fn generate(cx: &Self::Context) -> crate::Challenge { - [*cx; 32] + fn generate(cx: &Self::Context, xtc: &Xtc) -> crate::Challenge { + blake2_256(&[&[*cx; 16], xtc.as_ref()].concat()) } }