diff --git a/CHANGELOG.md b/CHANGELOG.md index 091bd2a3..4612b0c9 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,3 +1,9 @@ +## 0.10.0 (2024-08-06) + +* Added more `RpoDigest` and `RpxDigest` conversions (#311). +* [BREAKING] Migrated to Winterfell v0.9 (#315). +* Fixed encoding of Falcon secret key (#319). + ## 0.9.3 (2024-04-24) * Added `RpxRandomCoin` struct (#307). diff --git a/Cargo.lock b/Cargo.lock index 03b6600d..e10bdb20 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -19,57 +19,58 @@ checksum = "4b46cbb362ab8752921c97e041f5e366ee6297bd428a31275b9fcf1e380f7299" [[package]] name = "anstream" -version = "0.6.13" +version = "0.6.15" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d96bd03f33fe50a863e394ee9718a706f988b9079b20c3784fb726e7678b62fb" +checksum = "64e15c1ab1f89faffbf04a634d5e1962e9074f2741eef6d97f3c4e322426d526" dependencies = [ "anstyle", "anstyle-parse", "anstyle-query", "anstyle-wincon", "colorchoice", + "is_terminal_polyfill", "utf8parse", ] [[package]] name = "anstyle" -version = "1.0.6" +version = "1.0.8" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8901269c6307e8d93993578286ac0edf7f195079ffff5ebdeea6a59ffb7e36bc" +checksum = "1bec1de6f59aedf83baf9ff929c98f2ad654b97c9510f4e70cf6f661d49fd5b1" [[package]] name = "anstyle-parse" -version = "0.2.3" +version = "0.2.5" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c75ac65da39e5fe5ab759307499ddad880d724eed2f6ce5b5e8a26f4f387928c" +checksum = "eb47de1e80c2b463c735db5b217a0ddc39d612e7ac9e2e96a5aed1f57616c1cb" dependencies = [ "utf8parse", ] [[package]] name = "anstyle-query" -version = "1.0.2" +version = "1.1.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e28923312444cdd728e4738b3f9c9cac739500909bb3d3c94b43551b16517648" +checksum = "6d36fc52c7f6c869915e99412912f22093507da8d9e942ceaf66fe4b7c14422a" dependencies = [ - "windows-sys", + "windows-sys 0.52.0", ] [[package]] name = "anstyle-wincon" -version = "3.0.2" +version = "3.0.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1cd54b81ec8d6180e24654d0b371ad22fc3dd083b6ff8ba325b72e00c87660a7" +checksum = "5bf74e1b6e971609db8ca7a9ce79fd5768ab6ae46441c572e46cf596f59e57f8" dependencies = [ "anstyle", - "windows-sys", + "windows-sys 0.52.0", ] [[package]] name = "arrayref" -version = "0.3.7" +version = "0.3.8" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6b4930d2cb77ce62f89ee5d5289b4ac049559b1c45539271f5ed4fdc7db34545" +checksum = "9d151e35f61089500b617991b791fc8bfd237ae50cd5950803758a179b41e67a" [[package]] name = "arrayvec" @@ -79,9 +80,9 @@ checksum = "96d30a06541fbafbc7f82ed10c06164cfbd2c401138f6addd8404629c4b16711" [[package]] name = "autocfg" -version = "1.2.0" +version = "1.3.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f1fdabc7756949593fe60f30ec81974b613357de856987752631dea1e3394c80" +checksum = "0c4b4d0bd25bd0b74681c0ad21497610ce1b7c91b1022cd21c80c6fbdd9476b0" [[package]] name = "bit-set" @@ -100,15 +101,15 @@ checksum = "349f9b6a179ed607305526ca489b34ad0a41aed5f7980fa90eb03160b69598fb" [[package]] name = "bitflags" -version = "2.5.0" +version = "2.6.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "cf4b9d6a944f767f8e5e0db018570623c85f3d925ac718db4e06d0187adb21c1" +checksum = "b048fb63fd8b5923fc5aa7b340d8e156aec7ec02f0c78fa8a6ddc2613f6f71de" [[package]] name = "blake3" -version = "1.5.1" +version = "1.5.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "30cca6d3674597c30ddf2c587bf8d9d65c9a84d2326d941cc79c9842dfe0ef52" +checksum = "e9ec96fe9a81b5e365f9db71fe00edc4fe4ca2cc7dcb7861f0603012a7caa210" dependencies = [ "arrayref", "arrayvec", @@ -132,6 +133,12 @@ version = "3.16.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "79296716171880943b8470b5f8d03aa55eb2e645a4874bdbb28adb49162e012c" +[[package]] +name = "byteorder" +version = "1.5.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1fd0f2584146f6f2ef48085050886acf353beff7305ebd1ae69500e27c67f64b" + [[package]] name = "cast" version = "0.3.0" @@ -140,13 +147,12 @@ checksum = "37b2a672a2cb129a2e41c10b1224bb368f9f37a2b16b612598138befd7b37eb5" [[package]] name = "cc" -version = "1.0.95" +version = "1.1.7" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d32a725bc159af97c3e629873bb9f88fb8cf8a4867175f76dc987815ea07c83b" +checksum = "26a5c3fd7bfa1ce3897a3a3501d362b2d87b7f2583ebcb4a949ec25911025cbc" dependencies = [ "jobserver", "libc", - "once_cell", ] [[package]] @@ -184,9 +190,9 @@ dependencies = [ [[package]] name = "clap" -version = "4.5.4" +version = "4.5.13" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "90bc066a67923782aa8515dbaea16946c5bcc5addbd668bb80af688e53e548a0" +checksum = "0fbb260a053428790f3de475e304ff84cdbc4face759ea7a3e64c1edd938a7fc" dependencies = [ "clap_builder", "clap_derive", @@ -194,9 +200,9 @@ dependencies = [ [[package]] name = "clap_builder" -version = "4.5.2" +version = "4.5.13" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ae129e2e766ae0ec03484e609954119f123cc1fe650337e155d03b022f24f7b4" +checksum = "64b17d7ea74e9f833c7dbf2cbe4fb12ff26783eda4782a8975b72f895c9b4d99" dependencies = [ "anstream", "anstyle", @@ -206,9 +212,9 @@ dependencies = [ [[package]] name = "clap_derive" -version = "4.5.4" +version = "4.5.13" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "528131438037fd55894f62d6e9f068b8f45ac57ffa77517819645d10aed04f64" +checksum = "501d359d5f3dcaf6ecdeee48833ae73ec6e42723a1e52419c79abf9507eec0a0" dependencies = [ "heck", "proc-macro2", @@ -218,15 +224,15 @@ dependencies = [ [[package]] name = "clap_lex" -version = "0.7.0" +version = "0.7.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "98cc8fbded0c607b7ba9dd60cd98df59af97e84d24e49c8557331cfc26d301ce" +checksum = "1462739cb27611015575c0c11df5df7601141071f07518d56fcc1be504cbec97" [[package]] name = "colorchoice" -version = "1.0.0" +version = "1.0.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "acbf1af155f9b9ef647e42cdc158db4b64a1b61f743629225fde6f3e0be2a7c7" +checksum = "d3fd119d74b830634cea2a0f58bbd0d54540518a14397557951e79340abc28c0" [[package]] name = "constant_time_eq" @@ -300,9 +306,9 @@ dependencies = [ [[package]] name = "crossbeam-utils" -version = "0.8.19" +version = "0.8.20" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "248e3bacc7dc6baa3b21e405ee045c3047101a49145e7e9eca583ab4c2ca5345" +checksum = "22ec99545bb0ed0ea7bb9b8e1e9122ea386ff8a48c0922e43f36d45ab09e0e80" [[package]] name = "crunchy" @@ -332,25 +338,25 @@ dependencies = [ [[package]] name = "either" -version = "1.11.0" +version = "1.13.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a47c1c47d2f5964e29c61246e81db715514cd532db6b5116a25ea3c03d6780a2" +checksum = "60b1af1c220855b6ceac025d3f6ecdd2b7c4894bfe9cd9bda4fbb4bc7c0d4cf0" [[package]] name = "errno" -version = "0.3.8" +version = "0.3.9" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a258e46cdc063eb8519c00b9fc845fc47bcfca4130e2f08e88665ceda8474245" +checksum = "534c5cf6194dfab3db3242765c03bbe257cf92f22b38f6bc0c58d59108a820ba" dependencies = [ "libc", - "windows-sys", + "windows-sys 0.52.0", ] [[package]] name = "fastrand" -version = "2.0.2" +version = "2.1.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "658bd65b1cf4c852a3cc96f18a8ce7b5640f6b703f905c7d74532294c2a63984" +checksum = "9fc0510504f03c51ada170672ac806f1f105a88aa97a5281117e1ddc3368e51a" [[package]] name = "fnv" @@ -370,9 +376,9 @@ dependencies = [ [[package]] name = "getrandom" -version = "0.2.14" +version = "0.2.15" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "94b22e06ecb0110981051723910cbf0b5f5e09a2062dd7663334ee79a9d1286c" +checksum = "c4567c8db10ae91089c99af84c68c38da3ec2f087c3f82960bcdbf3656b6f4d7" dependencies = [ "cfg-if", "js-sys", @@ -423,9 +429,15 @@ checksum = "f23ff5ef2b80d608d61efee834934d862cd92461afc0560dedf493e4c033738b" dependencies = [ "hermit-abi", "libc", - "windows-sys", + "windows-sys 0.52.0", ] +[[package]] +name = "is_terminal_polyfill" +version = "1.70.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7943c866cc5cd64cbc25b2e01621d07fa8eb2a1a23160ee81ce38704e97b8ecf" + [[package]] name = "itertools" version = "0.10.5" @@ -443,9 +455,9 @@ checksum = "49f1f14873335454500d59611f1cf4a4b0f786f9ac11f4312a78e4cf2566695b" [[package]] name = "jobserver" -version = "0.1.31" +version = "0.1.32" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d2b099aaa34a9751c5bf0878add70444e1ed2dd73f347be99003d4577277de6e" +checksum = "48d1dbcbbeb6a7fec7e059840aa538bd62aaccf972c7346c4d9d2059312853d0" dependencies = [ "libc", ] @@ -470,15 +482,15 @@ dependencies = [ [[package]] name = "lazy_static" -version = "1.4.0" +version = "1.5.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e2abad23fbc42b3700f2f279844dc832adb2b2eb069b2df918f455c4e18cc646" +checksum = "bbd2bcb4c963f2ddae06a2efc7e9f3591312473c50c6685e1f298068316e66fe" [[package]] name = "libc" -version = "0.2.153" +version = "0.2.155" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9c198f91728a82281a64e1f4f9eeb25d82cb32a5de251c6bd1b5154d63a8e7bd" +checksum = "97b3888a4aecf77e811145cadf6eef5901f4782c53886191b2f693f24761847c" [[package]] name = "libm" @@ -488,25 +500,25 @@ checksum = "4ec2a862134d2a7d32d7983ddcdd1c4923530833c9f2ea1a44fc5fa473989058" [[package]] name = "linux-raw-sys" -version = "0.4.13" +version = "0.4.14" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "01cda141df6706de531b6c46c3a33ecca755538219bd484262fa09410c13539c" +checksum = "78b3ae25bc7c8c38cec158d1f2757ee79e9b3740fbc7ccf0e59e4b08d793fa89" [[package]] name = "log" -version = "0.4.21" +version = "0.4.22" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "90ed8c1e510134f979dbc4f070f87d4313098b704861a105fe34231c70a3901c" +checksum = "a7a70ba024b9dc04c27ea2f0c0548feb474ec5c54bba33a7f72f873a39d07b24" [[package]] name = "memchr" -version = "2.7.2" +version = "2.7.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6c8640c5d730cb13ebd907d8d04b52f55ac9a2eec55b440c8892f40d56c76c1d" +checksum = "78ca9ab1a0babb1e7d5695e3530886289c18cf2f87ec19a575a0abdce112e3a3" [[package]] name = "miden-crypto" -version = "0.9.3" +version = "0.10.0" dependencies = [ "blake3", "cc", @@ -532,9 +544,9 @@ dependencies = [ [[package]] name = "num" -version = "0.4.2" +version = "0.4.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3135b08af27d103b0a51f2ae0f8632117b7b185ccf931445affa8df530576a41" +checksum = "35bd024e8b2ff75562e5f34e7f4905839deb4b22955ef5e73d2fea1b9813cb23" dependencies = [ "num-bigint", "num-complex", @@ -546,20 +558,19 @@ dependencies = [ [[package]] name = "num-bigint" -version = "0.4.4" +version = "0.4.6" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "608e7659b5c3d7cba262d894801b9ec9d00de989e8a82bd4bef91d08da45cdc0" +checksum = "a5e44f723f1133c9deac646763579fdb3ac745e418f2a7af9cd0c431da1f20b9" dependencies = [ - "autocfg", "num-integer", "num-traits", ] [[package]] name = "num-complex" -version = "0.4.5" +version = "0.4.6" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "23c6602fda94a57c990fe0df199a035d83576b496aa29f4e634a8ac6004e68a6" +checksum = "73f88a1307638156682bada9d7604135552957b7818057dcef22705b4d509495" dependencies = [ "num-traits", ] @@ -575,9 +586,9 @@ dependencies = [ [[package]] name = "num-iter" -version = "0.1.44" +version = "0.1.45" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d869c01cc0c455284163fd0092f1f93835385ccab5a98a0dcc497b2f8bf055a9" +checksum = "1429034a0490724d0075ebb2bc9e875d6503c3cf69e235a8941aa757d83ef5bf" dependencies = [ "autocfg", "num-integer", @@ -586,11 +597,10 @@ dependencies = [ [[package]] name = "num-rational" -version = "0.4.1" +version = "0.4.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0638a1c9d0a3c0914158145bc76cff373a75a627e6ecbfb71cbe6f453a5a19b0" +checksum = "f83d14da390562dca69fc84082e73e548e1ad308d24accdedd2720017cb37824" dependencies = [ - "autocfg", "num-bigint", "num-integer", "num-traits", @@ -598,9 +608,9 @@ dependencies = [ [[package]] name = "num-traits" -version = "0.2.18" +version = "0.2.19" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "da0df0e5185db44f69b44f26786fe401b6c293d1907744beaa7fa62b2e5a517a" +checksum = "071dfc062690e90b734c0b2273ce72ad0ffa95f0c74596bc250dcfd960262841" dependencies = [ "autocfg", "libm", @@ -614,15 +624,15 @@ checksum = "3fdb12b2476b595f9358c5161aa467c2438859caa136dec86c26fdd2efe17b92" [[package]] name = "oorandom" -version = "11.1.3" +version = "11.1.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0ab1bc2a289d34bd04a330323ac98a1b4bc82c9d9fcb1e66b63caa84da26b575" +checksum = "b410bbe7e14ab526a0e86877eb47c6996a2bd7746f027ba551028c925390e4e9" [[package]] name = "plotters" -version = "0.3.5" +version = "0.3.6" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d2c224ba00d7cadd4d5c660deaf2098e5e80e07846537c51f9cfa4be50c1fd45" +checksum = "a15b6eccb8484002195a3e44fe65a4ce8e93a625797a063735536fd59cb01cf3" dependencies = [ "num-traits", "plotters-backend", @@ -633,39 +643,42 @@ dependencies = [ [[package]] name = "plotters-backend" -version = "0.3.5" +version = "0.3.6" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9e76628b4d3a7581389a35d5b6e2139607ad7c75b17aed325f210aa91f4a9609" +checksum = "414cec62c6634ae900ea1c56128dfe87cf63e7caece0852ec76aba307cebadb7" [[package]] name = "plotters-svg" -version = "0.3.5" +version = "0.3.6" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "38f6d39893cca0701371e3c27294f09797214b86f1fb951b89ade8ec04e2abab" +checksum = "81b30686a7d9c3e010b84284bdd26a29f2138574f52f5eb6f794fc0ad924e705" dependencies = [ "plotters-backend", ] [[package]] name = "ppv-lite86" -version = "0.2.17" +version = "0.2.20" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5b40af805b3121feab8a3c29f04d8ad262fa8e0561883e7653e024ae4479e6de" +checksum = "77957b295656769bb8ad2b6a6b09d897d94f05c41b069aede1fcdaa675eaea04" +dependencies = [ + "zerocopy", +] [[package]] name = "proc-macro2" -version = "1.0.81" +version = "1.0.86" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3d1597b0c024618f09a9c3b8655b7e430397a36d23fdafec26d6965e9eec3eba" +checksum = "5e719e8df665df0d1c8fbfd238015744736151d4445ec0836b8e628aae103b77" dependencies = [ "unicode-ident", ] [[package]] name = "proptest" -version = "1.4.0" +version = "1.5.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "31b476131c3c86cb68032fdc5cb6d5a1045e3e42d96b69fa599fd77701e1f5bf" +checksum = "b4c2511913b88df1637da85cc8d96ec8e43a3f8bb8ccb71ee1ac240d6f3df58d" dependencies = [ "bit-set", "bit-vec", @@ -757,9 +770,9 @@ dependencies = [ [[package]] name = "regex" -version = "1.10.4" +version = "1.10.6" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c117dbdfde9c8308975b6a18d71f3f385c89461f7b3fb054288ecf2a2058ba4c" +checksum = "4219d74c6b67a3654a9fbebc4b419e22126d13d2f3c4a07ee0cb61ff79a79619" dependencies = [ "aho-corasick", "memchr", @@ -769,9 +782,9 @@ dependencies = [ [[package]] name = "regex-automata" -version = "0.4.6" +version = "0.4.7" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "86b83b8b9847f9bf95ef68afb0b8e6cdb80f498442f5179a29fad448fcc1eaea" +checksum = "38caf58cc5ef2fed281f89292ef23f6365465ed9a41b7a7754eb4e26496c92df" dependencies = [ "aho-corasick", "memchr", @@ -780,9 +793,9 @@ dependencies = [ [[package]] name = "regex-syntax" -version = "0.8.3" +version = "0.8.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "adad44e29e4c806119491a7f06f03de4d1af22c3a680dd47f1e6e179439d1f56" +checksum = "7a66a03ae7c801facd77a29370b4faec201768915ac14a721ba36f20bc9c209b" [[package]] name = "rustix" @@ -794,7 +807,7 @@ dependencies = [ "errno", "libc", "linux-raw-sys", - "windows-sys", + "windows-sys 0.52.0", ] [[package]] @@ -811,9 +824,9 @@ dependencies = [ [[package]] name = "ryu" -version = "1.0.17" +version = "1.0.18" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e86697c916019a8588c99b5fac3cead74ec0b4b819707a682fd4d23fa0ce1ba1" +checksum = "f3cb5ba0dc43242ce17de99c180e96db90b235b8a9fdc9543c96d2209116bd9f" [[package]] name = "same-file" @@ -832,18 +845,18 @@ checksum = "a3f0bf26fd526d2a95683cd0f87bf103b8539e2ca1ef48ce002d67aad59aa0b4" [[package]] name = "serde" -version = "1.0.198" +version = "1.0.204" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9846a40c979031340571da2545a4e5b7c4163bdae79b301d5f86d03979451fcc" +checksum = "bc76f558e0cbb2a839d37354c575f1dc3fdc6546b5be373ba43d95f231bf7c12" dependencies = [ "serde_derive", ] [[package]] name = "serde_derive" -version = "1.0.198" +version = "1.0.204" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e88edab869b01783ba905e7d0153f9fc1a6505a96e4ad3018011eedb838566d9" +checksum = "e0cd7e117be63d3c3678776753929474f3b04a43a080c744d6b0ae2a8c28e222" dependencies = [ "proc-macro2", "quote", @@ -852,11 +865,12 @@ dependencies = [ [[package]] name = "serde_json" -version = "1.0.116" +version = "1.0.122" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3e17db7126d17feb94eb3fad46bf1a96b034e8aacbc2e775fe81505f8b0b2813" +checksum = "784b6203951c57ff748476b126ccb5e8e2959a5c19e5c617ab1956be3dbc68da" dependencies = [ "itoa", + "memchr", "ryu", "serde", ] @@ -879,9 +893,9 @@ checksum = "7da8b5736845d9f2fcb837ea5d9e2628564b3b043a70948a3f0b778838c5fb4f" [[package]] name = "syn" -version = "2.0.60" +version = "2.0.72" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "909518bc7b1c9b779f1bbf07f2929d35af9f0f37e47c6e9ef7f9dddc1e1821f3" +checksum = "dc4b9b9bf2add8093d3f2c0204471e951b2285580335de42f9d2534f3ae7a8af" dependencies = [ "proc-macro2", "quote", @@ -890,14 +904,15 @@ dependencies = [ [[package]] name = "tempfile" -version = "3.10.1" +version = "3.12.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "85b77fafb263dd9d05cbeac119526425676db3784113aa9295c88498cbf8bff1" +checksum = "04cbcdd0c794ebb0d4cf35e88edd2f7d2c4c3e9a5a6dab322839b321c6a87a64" dependencies = [ "cfg-if", "fastrand", + "once_cell", "rustix", - "windows-sys", + "windows-sys 0.59.0", ] [[package]] @@ -930,15 +945,15 @@ checksum = "3354b9ac3fae1ff6755cb6db53683adb661634f67557942dea4facebec0fee4b" [[package]] name = "utf8parse" -version = "0.2.1" +version = "0.2.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "711b9620af191e0cdc7468a8d14e709c3dcdb115b36f838e601583af800a370a" +checksum = "06abde3611657adf66d383f00b093d7faecc7fa57071cce2578660c9f1010821" [[package]] name = "version_check" -version = "0.9.4" +version = "0.9.5" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "49874b5167b65d7193b8aba1567f5c7d93d001cafc34600cee003eda787e483f" +checksum = "0b928f33d975fc6ad9f86c8f283853ad26bdd5b10b7f1542aa2fa15e2289105a" [[package]] name = "wait-timeout" @@ -1031,11 +1046,11 @@ dependencies = [ [[package]] name = "winapi-util" -version = "0.1.7" +version = "0.1.9" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "134306a13c5647ad6453e8deaec55d3a44d6021970129e6188735e74bf546697" +checksum = "cf221c93e13a30d793f7645a0e7762c55d169dbb0a49671918a2319d289b10bb" dependencies = [ - "windows-sys", + "windows-sys 0.59.0", ] [[package]] @@ -1047,11 +1062,20 @@ dependencies = [ "windows-targets", ] +[[package]] +name = "windows-sys" +version = "0.59.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1e38bc4d79ed67fd075bcc251a1c39b32a1776bbe92e5bef1f0bf1f8c531853b" +dependencies = [ + "windows-targets", +] + [[package]] name = "windows-targets" -version = "0.52.5" +version = "0.52.6" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6f0713a46559409d202e70e28227288446bf7841d3211583a4b53e3f6d96e7eb" +checksum = "9b724f72796e036ab90c1021d4780d4d3d648aca59e491e6b98e725b84e99973" dependencies = [ "windows_aarch64_gnullvm", "windows_aarch64_msvc", @@ -1065,57 +1089,57 @@ dependencies = [ [[package]] name = "windows_aarch64_gnullvm" -version = "0.52.5" +version = "0.52.6" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7088eed71e8b8dda258ecc8bac5fb1153c5cffaf2578fc8ff5d61e23578d3263" +checksum = "32a4622180e7a0ec044bb555404c800bc9fd9ec262ec147edd5989ccd0c02cd3" [[package]] name = "windows_aarch64_msvc" -version = "0.52.5" +version = "0.52.6" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9985fd1504e250c615ca5f281c3f7a6da76213ebd5ccc9561496568a2752afb6" +checksum = "09ec2a7bb152e2252b53fa7803150007879548bc709c039df7627cabbd05d469" [[package]] name = "windows_i686_gnu" -version = "0.52.5" +version = "0.52.6" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "88ba073cf16d5372720ec942a8ccbf61626074c6d4dd2e745299726ce8b89670" +checksum = "8e9b5ad5ab802e97eb8e295ac6720e509ee4c243f69d781394014ebfe8bbfa0b" [[package]] name = "windows_i686_gnullvm" -version = "0.52.5" +version = "0.52.6" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "87f4261229030a858f36b459e748ae97545d6f1ec60e5e0d6a3d32e0dc232ee9" +checksum = "0eee52d38c090b3caa76c563b86c3a4bd71ef1a819287c19d586d7334ae8ed66" [[package]] name = "windows_i686_msvc" -version = "0.52.5" +version = "0.52.6" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "db3c2bf3d13d5b658be73463284eaf12830ac9a26a90c717b7f771dfe97487bf" +checksum = "240948bc05c5e7c6dabba28bf89d89ffce3e303022809e73deaefe4f6ec56c66" [[package]] name = "windows_x86_64_gnu" -version = "0.52.5" +version = "0.52.6" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4e4246f76bdeff09eb48875a0fd3e2af6aada79d409d33011886d3e1581517d9" +checksum = "147a5c80aabfbf0c7d901cb5895d1de30ef2907eb21fbbab29ca94c5b08b1a78" [[package]] name = "windows_x86_64_gnullvm" -version = "0.52.5" +version = "0.52.6" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "852298e482cd67c356ddd9570386e2862b5673c85bd5f88df9ab6802b334c596" +checksum = "24d5b23dc417412679681396f2b49f3de8c1473deb516bd34410872eff51ed0d" [[package]] name = "windows_x86_64_msvc" -version = "0.52.5" +version = "0.52.6" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "bec47e5bfd1bff0eeaf6d8b485cc1074891a197ab4225d504cb7a1ab88b02bf0" +checksum = "589f6da84c646204747d1270a2a5661ea66ed1cced2631d546fdfb155959f9ec" [[package]] name = "winter-crypto" -version = "0.8.3" +version = "0.9.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6aea508aa819e934c837f24bb706e69d890b9be2db82da39cde887e6f0a37246" +checksum = "00fbb724d2d9fbfd3aa16ea27f5e461d4fe1d74b0c9e0ed1bf79e9e2a955f4d5" dependencies = [ "blake3", "sha3", @@ -1125,9 +1149,9 @@ dependencies = [ [[package]] name = "winter-math" -version = "0.8.4" +version = "0.9.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9c36d2a04b4f79f2c8c6945aab6545b7310a0cd6ae47b9210750400df6775a04" +checksum = "004f85bb051ce986ec0b9a2bd90aaf81b83e3c67464becfdf7db31f14c1019ba" dependencies = [ "serde", "winter-utils", @@ -1135,9 +1159,9 @@ dependencies = [ [[package]] name = "winter-rand-utils" -version = "0.8.3" +version = "0.9.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8b19ce50e688442052e957a69d72b8057d72ae8f03a7aea7c2538e11c76b2583" +checksum = "f2b827c901ab0c316d89812858ff451d60855c0a5c7ae734b098c62a28624181" dependencies = [ "rand", "winter-utils", @@ -1145,6 +1169,27 @@ dependencies = [ [[package]] name = "winter-utils" -version = "0.8.4" +version = "0.9.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ab6efccf6efa6fd0a80784f3894bc372ada67cc30d9c017fc907d4c0cdce86e7" +checksum = "0568612a95bcae3c94fb14da2686f8279ca77723dbdf1e97cf3673798faf6485" + +[[package]] +name = "zerocopy" +version = "0.7.35" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1b9b4fd18abc82b8136838da5d50bae7bdea537c574d8dc1a34ed098d6c166f0" +dependencies = [ + "byteorder", + "zerocopy-derive", +] + +[[package]] +name = "zerocopy-derive" +version = "0.7.35" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "fa4f8080344d4671fb4e831a13ad1e68092748387dfc4f55e356242fae12ce3e" +dependencies = [ + "proc-macro2", + "quote", + "syn", +] diff --git a/Cargo.toml b/Cargo.toml index e0c86526..2616341c 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -1,16 +1,16 @@ [package] name = "miden-crypto" -version = "0.9.3" +version = "0.10.0" description = "Miden Cryptographic primitives" authors = ["miden contributors"] readme = "README.md" license = "MIT" repository = "https://github.com/0xPolygonMiden/crypto" -documentation = "https://docs.rs/miden-crypto/0.9.3" +documentation = "https://docs.rs/miden-crypto/0.10.0" categories = ["cryptography", "no-std"] keywords = ["miden", "crypto", "hash", "merkle"] edition = "2021" -rust-version = "1.75" +rust-version = "1.80" [[bin]] name = "miden-crypto" @@ -52,12 +52,12 @@ num = { version = "0.4", default-features = false, features = ["alloc", "libm"] num-complex = { version = "0.4", default-features = false } rand = { version = "0.8", default-features = false } rand_core = { version = "0.6", default-features = false } -rand-utils = { version = "0.8", package = "winter-rand-utils", optional = true } +rand-utils = { version = "0.9", package = "winter-rand-utils", optional = true } serde = { version = "1.0", default-features = false, optional = true, features = ["derive"] } sha3 = { version = "0.10", default-features = false } -winter-crypto = { version = "0.8", default-features = false } -winter-math = { version = "0.8", default-features = false } -winter-utils = { version = "0.8", default-features = false } +winter-crypto = { version = "0.9", default-features = false } +winter-math = { version = "0.9", default-features = false } +winter-utils = { version = "0.9", default-features = false } [dev-dependencies] criterion = { version = "0.5", features = ["html_reports"] } @@ -65,7 +65,7 @@ getrandom = { version = "0.2", features = ["js"] } hex = { version = "0.4", default-features = false, features = ["alloc"] } proptest = "1.4" rand_chacha = { version = "0.3", default-features = false } -rand-utils = { version = "0.8", package = "winter-rand-utils" } +rand-utils = { version = "0.9", package = "winter-rand-utils" } seq-macro = { version = "0.3" } [build-dependencies] diff --git a/rust-toolchain b/rust-toolchain index 07cde984..d456f745 100644 --- a/rust-toolchain +++ b/rust-toolchain @@ -1 +1 @@ -1.75 +1.80 diff --git a/src/dsa/rpo_falcon512/keys/secret_key.rs b/src/dsa/rpo_falcon512/keys/secret_key.rs index d3ca339c..ca57f2a0 100644 --- a/src/dsa/rpo_falcon512/keys/secret_key.rs +++ b/src/dsa/rpo_falcon512/keys/secret_key.rs @@ -217,15 +217,27 @@ impl Serializable for SecretKey { let mut buffer = Vec::with_capacity(1281); buffer.push(header); - let f_i8: Vec = neg_f.coefficients.iter().map(|&a| -a as i8).collect(); + let f_i8: Vec = neg_f + .coefficients + .iter() + .map(|&a| FalconFelt::new(-a).balanced_value() as i8) + .collect(); let f_i8_encoded = encode_i8(&f_i8, WIDTH_SMALL_POLY_COEFFICIENT).unwrap(); buffer.extend_from_slice(&f_i8_encoded); - let g_i8: Vec = g.coefficients.iter().map(|&a| a as i8).collect(); + let g_i8: Vec = g + .coefficients + .iter() + .map(|&a| FalconFelt::new(a).balanced_value() as i8) + .collect(); let g_i8_encoded = encode_i8(&g_i8, WIDTH_SMALL_POLY_COEFFICIENT).unwrap(); buffer.extend_from_slice(&g_i8_encoded); - let big_f_i8: Vec = neg_big_f.coefficients.iter().map(|&a| -a as i8).collect(); + let big_f_i8: Vec = neg_big_f + .coefficients + .iter() + .map(|&a| FalconFelt::new(-a).balanced_value() as i8) + .collect(); let big_f_i8_encoded = encode_i8(&big_f_i8, WIDTH_BIG_POLY_COEFFICIENT).unwrap(); buffer.extend_from_slice(&big_f_i8_encoded); target.write_bytes(&buffer); diff --git a/src/hash/mod.rs b/src/hash/mod.rs index ea068339..630a6f57 100644 --- a/src/hash/mod.rs +++ b/src/hash/mod.rs @@ -6,11 +6,11 @@ pub mod blake; mod rescue; pub mod rpo { - pub use super::rescue::{Rpo256, RpoDigest}; + pub use super::rescue::{Rpo256, RpoDigest, RpoDigestError}; } pub mod rpx { - pub use super::rescue::{Rpx256, RpxDigest}; + pub use super::rescue::{Rpx256, RpxDigest, RpxDigestError}; } // RE-EXPORTS diff --git a/src/hash/rescue/mod.rs b/src/hash/rescue/mod.rs index 448fe899..b22c111b 100644 --- a/src/hash/rescue/mod.rs +++ b/src/hash/rescue/mod.rs @@ -11,10 +11,10 @@ mod mds; use mds::{apply_mds, MDS}; mod rpo; -pub use rpo::{Rpo256, RpoDigest}; +pub use rpo::{Rpo256, RpoDigest, RpoDigestError}; mod rpx; -pub use rpx::{Rpx256, RpxDigest}; +pub use rpx::{Rpx256, RpxDigest, RpxDigestError}; #[cfg(test)] mod tests; diff --git a/src/hash/rescue/rpo/digest.rs b/src/hash/rescue/rpo/digest.rs index 6feb9f68..545b68dc 100644 --- a/src/hash/rescue/rpo/digest.rs +++ b/src/hash/rescue/rpo/digest.rs @@ -118,26 +118,106 @@ impl Randomizable for RpoDigest { // CONVERSIONS: FROM RPO DIGEST // ================================================================================================ -impl From<&RpoDigest> for [Felt; DIGEST_SIZE] { - fn from(value: &RpoDigest) -> Self { - value.0 +#[derive(Copy, Clone, Debug)] +pub enum RpoDigestError { + InvalidInteger, +} + +impl TryFrom<&RpoDigest> for [bool; DIGEST_SIZE] { + type Error = RpoDigestError; + + fn try_from(value: &RpoDigest) -> Result { + (*value).try_into() } } -impl From for [Felt; DIGEST_SIZE] { - fn from(value: RpoDigest) -> Self { - value.0 +impl TryFrom for [bool; DIGEST_SIZE] { + type Error = RpoDigestError; + + fn try_from(value: RpoDigest) -> Result { + fn to_bool(v: u64) -> Option { + if v <= 1 { + Some(v == 1) + } else { + None + } + } + + Ok([ + to_bool(value.0[0].as_int()).ok_or(RpoDigestError::InvalidInteger)?, + to_bool(value.0[1].as_int()).ok_or(RpoDigestError::InvalidInteger)?, + to_bool(value.0[2].as_int()).ok_or(RpoDigestError::InvalidInteger)?, + to_bool(value.0[3].as_int()).ok_or(RpoDigestError::InvalidInteger)?, + ]) + } +} + +impl TryFrom<&RpoDigest> for [u8; DIGEST_SIZE] { + type Error = RpoDigestError; + + fn try_from(value: &RpoDigest) -> Result { + (*value).try_into() + } +} + +impl TryFrom for [u8; DIGEST_SIZE] { + type Error = RpoDigestError; + + fn try_from(value: RpoDigest) -> Result { + Ok([ + value.0[0].as_int().try_into().map_err(|_| RpoDigestError::InvalidInteger)?, + value.0[1].as_int().try_into().map_err(|_| RpoDigestError::InvalidInteger)?, + value.0[2].as_int().try_into().map_err(|_| RpoDigestError::InvalidInteger)?, + value.0[3].as_int().try_into().map_err(|_| RpoDigestError::InvalidInteger)?, + ]) + } +} + +impl TryFrom<&RpoDigest> for [u16; DIGEST_SIZE] { + type Error = RpoDigestError; + + fn try_from(value: &RpoDigest) -> Result { + (*value).try_into() + } +} + +impl TryFrom for [u16; DIGEST_SIZE] { + type Error = RpoDigestError; + + fn try_from(value: RpoDigest) -> Result { + Ok([ + value.0[0].as_int().try_into().map_err(|_| RpoDigestError::InvalidInteger)?, + value.0[1].as_int().try_into().map_err(|_| RpoDigestError::InvalidInteger)?, + value.0[2].as_int().try_into().map_err(|_| RpoDigestError::InvalidInteger)?, + value.0[3].as_int().try_into().map_err(|_| RpoDigestError::InvalidInteger)?, + ]) + } +} + +impl TryFrom<&RpoDigest> for [u32; DIGEST_SIZE] { + type Error = RpoDigestError; + + fn try_from(value: &RpoDigest) -> Result { + (*value).try_into() + } +} + +impl TryFrom for [u32; DIGEST_SIZE] { + type Error = RpoDigestError; + + fn try_from(value: RpoDigest) -> Result { + Ok([ + value.0[0].as_int().try_into().map_err(|_| RpoDigestError::InvalidInteger)?, + value.0[1].as_int().try_into().map_err(|_| RpoDigestError::InvalidInteger)?, + value.0[2].as_int().try_into().map_err(|_| RpoDigestError::InvalidInteger)?, + value.0[3].as_int().try_into().map_err(|_| RpoDigestError::InvalidInteger)?, + ]) } } impl From<&RpoDigest> for [u64; DIGEST_SIZE] { fn from(value: &RpoDigest) -> Self { - [ - value.0[0].as_int(), - value.0[1].as_int(), - value.0[2].as_int(), - value.0[3].as_int(), - ] + (*value).into() } } @@ -152,9 +232,21 @@ impl From for [u64; DIGEST_SIZE] { } } +impl From<&RpoDigest> for [Felt; DIGEST_SIZE] { + fn from(value: &RpoDigest) -> Self { + (*value).into() + } +} + +impl From for [Felt; DIGEST_SIZE] { + fn from(value: RpoDigest) -> Self { + value.0 + } +} + impl From<&RpoDigest> for [u8; DIGEST_BYTES] { fn from(value: &RpoDigest) -> Self { - value.as_bytes() + (*value).into() } } @@ -164,6 +256,13 @@ impl From for [u8; DIGEST_BYTES] { } } +impl From<&RpoDigest> for String { + /// The returned string starts with `0x`. + fn from(value: &RpoDigest) -> Self { + (*value).into() + } +} + impl From for String { /// The returned string starts with `0x`. fn from(value: RpoDigest) -> Self { @@ -171,20 +270,76 @@ impl From for String { } } -impl From<&RpoDigest> for String { - /// The returned string starts with `0x`. - fn from(value: &RpoDigest) -> Self { +// CONVERSIONS: TO RPO DIGEST +// ================================================================================================ + +impl From<&[bool; DIGEST_SIZE]> for RpoDigest { + fn from(value: &[bool; DIGEST_SIZE]) -> Self { (*value).into() } } -// CONVERSIONS: TO RPO DIGEST -// ================================================================================================ +impl From<[bool; DIGEST_SIZE]> for RpoDigest { + fn from(value: [bool; DIGEST_SIZE]) -> Self { + [value[0] as u32, value[1] as u32, value[2] as u32, value[3] as u32].into() + } +} -#[derive(Copy, Clone, Debug)] -pub enum RpoDigestError { - /// The provided u64 integer does not fit in the field's moduli. - InvalidInteger, +impl From<&[u8; DIGEST_SIZE]> for RpoDigest { + fn from(value: &[u8; DIGEST_SIZE]) -> Self { + (*value).into() + } +} + +impl From<[u8; DIGEST_SIZE]> for RpoDigest { + fn from(value: [u8; DIGEST_SIZE]) -> Self { + Self([value[0].into(), value[1].into(), value[2].into(), value[3].into()]) + } +} + +impl From<&[u16; DIGEST_SIZE]> for RpoDigest { + fn from(value: &[u16; DIGEST_SIZE]) -> Self { + (*value).into() + } +} + +impl From<[u16; DIGEST_SIZE]> for RpoDigest { + fn from(value: [u16; DIGEST_SIZE]) -> Self { + Self([value[0].into(), value[1].into(), value[2].into(), value[3].into()]) + } +} + +impl From<&[u32; DIGEST_SIZE]> for RpoDigest { + fn from(value: &[u32; DIGEST_SIZE]) -> Self { + (*value).into() + } +} + +impl From<[u32; DIGEST_SIZE]> for RpoDigest { + fn from(value: [u32; DIGEST_SIZE]) -> Self { + Self([value[0].into(), value[1].into(), value[2].into(), value[3].into()]) + } +} + +impl TryFrom<&[u64; DIGEST_SIZE]> for RpoDigest { + type Error = RpoDigestError; + + fn try_from(value: &[u64; DIGEST_SIZE]) -> Result { + (*value).try_into() + } +} + +impl TryFrom<[u64; DIGEST_SIZE]> for RpoDigest { + type Error = RpoDigestError; + + fn try_from(value: [u64; DIGEST_SIZE]) -> Result { + Ok(Self([ + value[0].try_into().map_err(|_| RpoDigestError::InvalidInteger)?, + value[1].try_into().map_err(|_| RpoDigestError::InvalidInteger)?, + value[2].try_into().map_err(|_| RpoDigestError::InvalidInteger)?, + value[3].try_into().map_err(|_| RpoDigestError::InvalidInteger)?, + ])) + } } impl From<&[Felt; DIGEST_SIZE]> for RpoDigest { @@ -199,6 +354,14 @@ impl From<[Felt; DIGEST_SIZE]> for RpoDigest { } } +impl TryFrom<&[u8; DIGEST_BYTES]> for RpoDigest { + type Error = HexParseError; + + fn try_from(value: &[u8; DIGEST_BYTES]) -> Result { + (*value).try_into() + } +} + impl TryFrom<[u8; DIGEST_BYTES]> for RpoDigest { type Error = HexParseError; @@ -218,14 +381,6 @@ impl TryFrom<[u8; DIGEST_BYTES]> for RpoDigest { } } -impl TryFrom<&[u8; DIGEST_BYTES]> for RpoDigest { - type Error = HexParseError; - - fn try_from(value: &[u8; DIGEST_BYTES]) -> Result { - (*value).try_into() - } -} - impl TryFrom<&[u8]> for RpoDigest { type Error = HexParseError; @@ -234,33 +389,12 @@ impl TryFrom<&[u8]> for RpoDigest { } } -impl TryFrom<[u64; DIGEST_SIZE]> for RpoDigest { - type Error = RpoDigestError; - - fn try_from(value: [u64; DIGEST_SIZE]) -> Result { - Ok(Self([ - value[0].try_into().map_err(|_| RpoDigestError::InvalidInteger)?, - value[1].try_into().map_err(|_| RpoDigestError::InvalidInteger)?, - value[2].try_into().map_err(|_| RpoDigestError::InvalidInteger)?, - value[3].try_into().map_err(|_| RpoDigestError::InvalidInteger)?, - ])) - } -} - -impl TryFrom<&[u64; DIGEST_SIZE]> for RpoDigest { - type Error = RpoDigestError; - - fn try_from(value: &[u64; DIGEST_SIZE]) -> Result { - (*value).try_into() - } -} - impl TryFrom<&str> for RpoDigest { type Error = HexParseError; /// Expects the string to start with `0x`. fn try_from(value: &str) -> Result { - hex_to_bytes(value).and_then(|v| v.try_into()) + hex_to_bytes::(value).and_then(RpoDigest::try_from) } } @@ -373,43 +507,71 @@ mod tests { Felt::new(rand_value()), ]); - let v: [Felt; DIGEST_SIZE] = digest.into(); + // BY VALUE + // ---------------------------------------------------------------------------------------- + let v: [bool; DIGEST_SIZE] = [true, false, true, true]; let v2: RpoDigest = v.into(); - assert_eq!(digest, v2); + assert_eq!(v, <[bool; DIGEST_SIZE]>::try_from(v2).unwrap()); - let v: [Felt; DIGEST_SIZE] = (&digest).into(); + let v: [u8; DIGEST_SIZE] = [0_u8, 1_u8, 2_u8, 3_u8]; let v2: RpoDigest = v.into(); - assert_eq!(digest, v2); + assert_eq!(v, <[u8; DIGEST_SIZE]>::try_from(v2).unwrap()); + + let v: [u16; DIGEST_SIZE] = [0_u16, 1_u16, 2_u16, 3_u16]; + let v2: RpoDigest = v.into(); + assert_eq!(v, <[u16; DIGEST_SIZE]>::try_from(v2).unwrap()); + + let v: [u32; DIGEST_SIZE] = [0_u32, 1_u32, 2_u32, 3_u32]; + let v2: RpoDigest = v.into(); + assert_eq!(v, <[u32; DIGEST_SIZE]>::try_from(v2).unwrap()); let v: [u64; DIGEST_SIZE] = digest.into(); let v2: RpoDigest = v.try_into().unwrap(); assert_eq!(digest, v2); - let v: [u64; DIGEST_SIZE] = (&digest).into(); - let v2: RpoDigest = v.try_into().unwrap(); + let v: [Felt; DIGEST_SIZE] = digest.into(); + let v2: RpoDigest = v.into(); assert_eq!(digest, v2); let v: [u8; DIGEST_BYTES] = digest.into(); let v2: RpoDigest = v.try_into().unwrap(); assert_eq!(digest, v2); - let v: [u8; DIGEST_BYTES] = (&digest).into(); + let v: String = digest.into(); let v2: RpoDigest = v.try_into().unwrap(); assert_eq!(digest, v2); - let v: String = digest.into(); - let v2: RpoDigest = v.try_into().unwrap(); + // BY REF + // ---------------------------------------------------------------------------------------- + let v: [bool; DIGEST_SIZE] = [true, false, true, true]; + let v2: RpoDigest = (&v).into(); + assert_eq!(v, <[bool; DIGEST_SIZE]>::try_from(&v2).unwrap()); + + let v: [u8; DIGEST_SIZE] = [0_u8, 1_u8, 2_u8, 3_u8]; + let v2: RpoDigest = (&v).into(); + assert_eq!(v, <[u8; DIGEST_SIZE]>::try_from(&v2).unwrap()); + + let v: [u16; DIGEST_SIZE] = [0_u16, 1_u16, 2_u16, 3_u16]; + let v2: RpoDigest = (&v).into(); + assert_eq!(v, <[u16; DIGEST_SIZE]>::try_from(&v2).unwrap()); + + let v: [u32; DIGEST_SIZE] = [0_u32, 1_u32, 2_u32, 3_u32]; + let v2: RpoDigest = (&v).into(); + assert_eq!(v, <[u32; DIGEST_SIZE]>::try_from(&v2).unwrap()); + + let v: [u64; DIGEST_SIZE] = (&digest).into(); + let v2: RpoDigest = (&v).try_into().unwrap(); assert_eq!(digest, v2); - let v: String = (&digest).into(); - let v2: RpoDigest = v.try_into().unwrap(); + let v: [Felt; DIGEST_SIZE] = (&digest).into(); + let v2: RpoDigest = (&v).into(); assert_eq!(digest, v2); - let v: [u8; DIGEST_BYTES] = digest.into(); + let v: [u8; DIGEST_BYTES] = (&digest).into(); let v2: RpoDigest = (&v).try_into().unwrap(); assert_eq!(digest, v2); - let v: [u8; DIGEST_BYTES] = (&digest).into(); + let v: String = (&digest).into(); let v2: RpoDigest = (&v).try_into().unwrap(); assert_eq!(digest, v2); } diff --git a/src/hash/rescue/rpo/mod.rs b/src/hash/rescue/rpo/mod.rs index 8d71467c..82be3dc1 100644 --- a/src/hash/rescue/rpo/mod.rs +++ b/src/hash/rescue/rpo/mod.rs @@ -8,7 +8,7 @@ use super::{ }; mod digest; -pub use digest::RpoDigest; +pub use digest::{RpoDigest, RpoDigestError}; #[cfg(test)] mod tests; @@ -22,9 +22,10 @@ mod tests; /// [specifications](https://eprint.iacr.org/2022/1577) /// /// The parameters used to instantiate the function are: -/// * Field: 64-bit prime field with modulus 2^64 - 2^32 + 1. +/// * Field: 64-bit prime field with modulus p = 2^64 - 2^32 + 1. /// * State width: 12 field elements. -/// * Capacity size: 4 field elements. +/// * Rate size: r = 8 field elements. +/// * Capacity size: c = 4 field elements. /// * Number of founds: 7. /// * S-Box degree: 7. /// @@ -52,6 +53,17 @@ mod tests; /// to deserialize them into field elements and then hash them using /// [hash_elements()](Rpo256::hash_elements) function rather then hashing the serialized bytes /// using [hash()](Rpo256::hash) function. +/// +/// ## Domain separation +/// [merge_in_domain()](Rpo256::merge_in_domain) hashes two digests into one digest with some domain +/// identifier and the current implementation sets the second capacity element to the value of +/// this domain identifier. Using a similar argument to the one formulated for domain separation of +/// the RPX hash function in Appendix C of its [specification](https://eprint.iacr.org/2023/1045), +/// one sees that doing so degrades only pre-image resistance, from its initial bound of c.log_2(p), +/// by as much as the log_2 of the size of the domain identifier space. Since pre-image resistance +/// becomes the bottleneck for the security bound of the sponge in overwrite-mode only when it is +/// lower than 2^128, we see that the target 128-bit security level is maintained as long as +/// the size of the domain identifier space, including for padding, is less than 2^128. #[derive(Debug, Copy, Clone, Eq, PartialEq)] pub struct Rpo256(); diff --git a/src/hash/rescue/rpx/digest.rs b/src/hash/rescue/rpx/digest.rs index 7d5fcb8e..d104d4f9 100644 --- a/src/hash/rescue/rpx/digest.rs +++ b/src/hash/rescue/rpx/digest.rs @@ -118,26 +118,106 @@ impl Randomizable for RpxDigest { // CONVERSIONS: FROM RPX DIGEST // ================================================================================================ -impl From<&RpxDigest> for [Felt; DIGEST_SIZE] { - fn from(value: &RpxDigest) -> Self { - value.0 +#[derive(Copy, Clone, Debug)] +pub enum RpxDigestError { + InvalidInteger, +} + +impl TryFrom<&RpxDigest> for [bool; DIGEST_SIZE] { + type Error = RpxDigestError; + + fn try_from(value: &RpxDigest) -> Result { + (*value).try_into() } } -impl From for [Felt; DIGEST_SIZE] { - fn from(value: RpxDigest) -> Self { - value.0 +impl TryFrom for [bool; DIGEST_SIZE] { + type Error = RpxDigestError; + + fn try_from(value: RpxDigest) -> Result { + fn to_bool(v: u64) -> Option { + if v <= 1 { + Some(v == 1) + } else { + None + } + } + + Ok([ + to_bool(value.0[0].as_int()).ok_or(RpxDigestError::InvalidInteger)?, + to_bool(value.0[1].as_int()).ok_or(RpxDigestError::InvalidInteger)?, + to_bool(value.0[2].as_int()).ok_or(RpxDigestError::InvalidInteger)?, + to_bool(value.0[3].as_int()).ok_or(RpxDigestError::InvalidInteger)?, + ]) + } +} + +impl TryFrom<&RpxDigest> for [u8; DIGEST_SIZE] { + type Error = RpxDigestError; + + fn try_from(value: &RpxDigest) -> Result { + (*value).try_into() + } +} + +impl TryFrom for [u8; DIGEST_SIZE] { + type Error = RpxDigestError; + + fn try_from(value: RpxDigest) -> Result { + Ok([ + value.0[0].as_int().try_into().map_err(|_| RpxDigestError::InvalidInteger)?, + value.0[1].as_int().try_into().map_err(|_| RpxDigestError::InvalidInteger)?, + value.0[2].as_int().try_into().map_err(|_| RpxDigestError::InvalidInteger)?, + value.0[3].as_int().try_into().map_err(|_| RpxDigestError::InvalidInteger)?, + ]) + } +} + +impl TryFrom<&RpxDigest> for [u16; DIGEST_SIZE] { + type Error = RpxDigestError; + + fn try_from(value: &RpxDigest) -> Result { + (*value).try_into() + } +} + +impl TryFrom for [u16; DIGEST_SIZE] { + type Error = RpxDigestError; + + fn try_from(value: RpxDigest) -> Result { + Ok([ + value.0[0].as_int().try_into().map_err(|_| RpxDigestError::InvalidInteger)?, + value.0[1].as_int().try_into().map_err(|_| RpxDigestError::InvalidInteger)?, + value.0[2].as_int().try_into().map_err(|_| RpxDigestError::InvalidInteger)?, + value.0[3].as_int().try_into().map_err(|_| RpxDigestError::InvalidInteger)?, + ]) + } +} + +impl TryFrom<&RpxDigest> for [u32; DIGEST_SIZE] { + type Error = RpxDigestError; + + fn try_from(value: &RpxDigest) -> Result { + (*value).try_into() + } +} + +impl TryFrom for [u32; DIGEST_SIZE] { + type Error = RpxDigestError; + + fn try_from(value: RpxDigest) -> Result { + Ok([ + value.0[0].as_int().try_into().map_err(|_| RpxDigestError::InvalidInteger)?, + value.0[1].as_int().try_into().map_err(|_| RpxDigestError::InvalidInteger)?, + value.0[2].as_int().try_into().map_err(|_| RpxDigestError::InvalidInteger)?, + value.0[3].as_int().try_into().map_err(|_| RpxDigestError::InvalidInteger)?, + ]) } } impl From<&RpxDigest> for [u64; DIGEST_SIZE] { fn from(value: &RpxDigest) -> Self { - [ - value.0[0].as_int(), - value.0[1].as_int(), - value.0[2].as_int(), - value.0[3].as_int(), - ] + (*value).into() } } @@ -152,6 +232,18 @@ impl From for [u64; DIGEST_SIZE] { } } +impl From<&RpxDigest> for [Felt; DIGEST_SIZE] { + fn from(value: &RpxDigest) -> Self { + value.0 + } +} + +impl From for [Felt; DIGEST_SIZE] { + fn from(value: RpxDigest) -> Self { + value.0 + } +} + impl From<&RpxDigest> for [u8; DIGEST_BYTES] { fn from(value: &RpxDigest) -> Self { value.as_bytes() @@ -164,6 +256,13 @@ impl From for [u8; DIGEST_BYTES] { } } +impl From<&RpxDigest> for String { + /// The returned string starts with `0x`. + fn from(value: &RpxDigest) -> Self { + (*value).into() + } +} + impl From for String { /// The returned string starts with `0x`. fn from(value: RpxDigest) -> Self { @@ -171,20 +270,76 @@ impl From for String { } } -impl From<&RpxDigest> for String { - /// The returned string starts with `0x`. - fn from(value: &RpxDigest) -> Self { +// CONVERSIONS: TO RPX DIGEST +// ================================================================================================ + +impl From<&[bool; DIGEST_SIZE]> for RpxDigest { + fn from(value: &[bool; DIGEST_SIZE]) -> Self { (*value).into() } } -// CONVERSIONS: TO RPX DIGEST -// ================================================================================================ +impl From<[bool; DIGEST_SIZE]> for RpxDigest { + fn from(value: [bool; DIGEST_SIZE]) -> Self { + [value[0] as u32, value[1] as u32, value[2] as u32, value[3] as u32].into() + } +} -#[derive(Copy, Clone, Debug)] -pub enum RpxDigestError { - /// The provided u64 integer does not fit in the field's moduli. - InvalidInteger, +impl From<&[u8; DIGEST_SIZE]> for RpxDigest { + fn from(value: &[u8; DIGEST_SIZE]) -> Self { + (*value).into() + } +} + +impl From<[u8; DIGEST_SIZE]> for RpxDigest { + fn from(value: [u8; DIGEST_SIZE]) -> Self { + Self([value[0].into(), value[1].into(), value[2].into(), value[3].into()]) + } +} + +impl From<&[u16; DIGEST_SIZE]> for RpxDigest { + fn from(value: &[u16; DIGEST_SIZE]) -> Self { + (*value).into() + } +} + +impl From<[u16; DIGEST_SIZE]> for RpxDigest { + fn from(value: [u16; DIGEST_SIZE]) -> Self { + Self([value[0].into(), value[1].into(), value[2].into(), value[3].into()]) + } +} + +impl From<&[u32; DIGEST_SIZE]> for RpxDigest { + fn from(value: &[u32; DIGEST_SIZE]) -> Self { + (*value).into() + } +} + +impl From<[u32; DIGEST_SIZE]> for RpxDigest { + fn from(value: [u32; DIGEST_SIZE]) -> Self { + Self([value[0].into(), value[1].into(), value[2].into(), value[3].into()]) + } +} + +impl TryFrom<&[u64; DIGEST_SIZE]> for RpxDigest { + type Error = RpxDigestError; + + fn try_from(value: &[u64; DIGEST_SIZE]) -> Result { + (*value).try_into() + } +} + +impl TryFrom<[u64; DIGEST_SIZE]> for RpxDigest { + type Error = RpxDigestError; + + fn try_from(value: [u64; DIGEST_SIZE]) -> Result { + Ok(Self([ + value[0].try_into().map_err(|_| RpxDigestError::InvalidInteger)?, + value[1].try_into().map_err(|_| RpxDigestError::InvalidInteger)?, + value[2].try_into().map_err(|_| RpxDigestError::InvalidInteger)?, + value[3].try_into().map_err(|_| RpxDigestError::InvalidInteger)?, + ])) + } } impl From<&[Felt; DIGEST_SIZE]> for RpxDigest { @@ -199,6 +354,14 @@ impl From<[Felt; DIGEST_SIZE]> for RpxDigest { } } +impl TryFrom<&[u8; DIGEST_BYTES]> for RpxDigest { + type Error = HexParseError; + + fn try_from(value: &[u8; DIGEST_BYTES]) -> Result { + (*value).try_into() + } +} + impl TryFrom<[u8; DIGEST_BYTES]> for RpxDigest { type Error = HexParseError; @@ -218,14 +381,6 @@ impl TryFrom<[u8; DIGEST_BYTES]> for RpxDigest { } } -impl TryFrom<&[u8; DIGEST_BYTES]> for RpxDigest { - type Error = HexParseError; - - fn try_from(value: &[u8; DIGEST_BYTES]) -> Result { - (*value).try_into() - } -} - impl TryFrom<&[u8]> for RpxDigest { type Error = HexParseError; @@ -234,50 +389,29 @@ impl TryFrom<&[u8]> for RpxDigest { } } -impl TryFrom<[u64; DIGEST_SIZE]> for RpxDigest { - type Error = RpxDigestError; - - fn try_from(value: [u64; DIGEST_SIZE]) -> Result { - Ok(Self([ - value[0].try_into().map_err(|_| RpxDigestError::InvalidInteger)?, - value[1].try_into().map_err(|_| RpxDigestError::InvalidInteger)?, - value[2].try_into().map_err(|_| RpxDigestError::InvalidInteger)?, - value[3].try_into().map_err(|_| RpxDigestError::InvalidInteger)?, - ])) - } -} - -impl TryFrom<&[u64; DIGEST_SIZE]> for RpxDigest { - type Error = RpxDigestError; - - fn try_from(value: &[u64; DIGEST_SIZE]) -> Result { - (*value).try_into() - } -} - impl TryFrom<&str> for RpxDigest { type Error = HexParseError; /// Expects the string to start with `0x`. fn try_from(value: &str) -> Result { - hex_to_bytes(value).and_then(|v| v.try_into()) + hex_to_bytes::(value).and_then(RpxDigest::try_from) } } -impl TryFrom for RpxDigest { +impl TryFrom<&String> for RpxDigest { type Error = HexParseError; /// Expects the string to start with `0x`. - fn try_from(value: String) -> Result { + fn try_from(value: &String) -> Result { value.as_str().try_into() } } -impl TryFrom<&String> for RpxDigest { +impl TryFrom for RpxDigest { type Error = HexParseError; /// Expects the string to start with `0x`. - fn try_from(value: &String) -> Result { + fn try_from(value: String) -> Result { value.as_str().try_into() } } @@ -308,6 +442,17 @@ impl Deserializable for RpxDigest { } } +// ITERATORS +// ================================================================================================ +impl IntoIterator for RpxDigest { + type Item = Felt; + type IntoIter = <[Felt; 4] as IntoIterator>::IntoIter; + + fn into_iter(self) -> Self::IntoIter { + self.0.into_iter() + } +} + // TESTS // ================================================================================================ @@ -338,7 +483,6 @@ mod tests { assert_eq!(d1, d2); } - #[cfg(feature = "std")] #[test] fn digest_encoding() { let digest = RpxDigest([ @@ -363,43 +507,71 @@ mod tests { Felt::new(rand_value()), ]); - let v: [Felt; DIGEST_SIZE] = digest.into(); + // BY VALUE + // ---------------------------------------------------------------------------------------- + let v: [bool; DIGEST_SIZE] = [true, false, true, true]; let v2: RpxDigest = v.into(); - assert_eq!(digest, v2); + assert_eq!(v, <[bool; DIGEST_SIZE]>::try_from(v2).unwrap()); - let v: [Felt; DIGEST_SIZE] = (&digest).into(); + let v: [u8; DIGEST_SIZE] = [0_u8, 1_u8, 2_u8, 3_u8]; let v2: RpxDigest = v.into(); - assert_eq!(digest, v2); + assert_eq!(v, <[u8; DIGEST_SIZE]>::try_from(v2).unwrap()); + + let v: [u16; DIGEST_SIZE] = [0_u16, 1_u16, 2_u16, 3_u16]; + let v2: RpxDigest = v.into(); + assert_eq!(v, <[u16; DIGEST_SIZE]>::try_from(v2).unwrap()); + + let v: [u32; DIGEST_SIZE] = [0_u32, 1_u32, 2_u32, 3_u32]; + let v2: RpxDigest = v.into(); + assert_eq!(v, <[u32; DIGEST_SIZE]>::try_from(v2).unwrap()); let v: [u64; DIGEST_SIZE] = digest.into(); let v2: RpxDigest = v.try_into().unwrap(); assert_eq!(digest, v2); - let v: [u64; DIGEST_SIZE] = (&digest).into(); - let v2: RpxDigest = v.try_into().unwrap(); + let v: [Felt; DIGEST_SIZE] = digest.into(); + let v2: RpxDigest = v.into(); assert_eq!(digest, v2); let v: [u8; DIGEST_BYTES] = digest.into(); let v2: RpxDigest = v.try_into().unwrap(); assert_eq!(digest, v2); - let v: [u8; DIGEST_BYTES] = (&digest).into(); + let v: String = digest.into(); let v2: RpxDigest = v.try_into().unwrap(); assert_eq!(digest, v2); - let v: String = digest.into(); - let v2: RpxDigest = v.try_into().unwrap(); + // BY REF + // ---------------------------------------------------------------------------------------- + let v: [bool; DIGEST_SIZE] = [true, false, true, true]; + let v2: RpxDigest = (&v).into(); + assert_eq!(v, <[bool; DIGEST_SIZE]>::try_from(&v2).unwrap()); + + let v: [u8; DIGEST_SIZE] = [0_u8, 1_u8, 2_u8, 3_u8]; + let v2: RpxDigest = (&v).into(); + assert_eq!(v, <[u8; DIGEST_SIZE]>::try_from(&v2).unwrap()); + + let v: [u16; DIGEST_SIZE] = [0_u16, 1_u16, 2_u16, 3_u16]; + let v2: RpxDigest = (&v).into(); + assert_eq!(v, <[u16; DIGEST_SIZE]>::try_from(&v2).unwrap()); + + let v: [u32; DIGEST_SIZE] = [0_u32, 1_u32, 2_u32, 3_u32]; + let v2: RpxDigest = (&v).into(); + assert_eq!(v, <[u32; DIGEST_SIZE]>::try_from(&v2).unwrap()); + + let v: [u64; DIGEST_SIZE] = (&digest).into(); + let v2: RpxDigest = (&v).try_into().unwrap(); assert_eq!(digest, v2); - let v: String = (&digest).into(); - let v2: RpxDigest = v.try_into().unwrap(); + let v: [Felt; DIGEST_SIZE] = (&digest).into(); + let v2: RpxDigest = (&v).into(); assert_eq!(digest, v2); - let v: [u8; DIGEST_BYTES] = digest.into(); + let v: [u8; DIGEST_BYTES] = (&digest).into(); let v2: RpxDigest = (&v).try_into().unwrap(); assert_eq!(digest, v2); - let v: [u8; DIGEST_BYTES] = (&digest).into(); + let v: String = (&digest).into(); let v2: RpxDigest = (&v).try_into().unwrap(); assert_eq!(digest, v2); } diff --git a/src/hash/rescue/rpx/mod.rs b/src/hash/rescue/rpx/mod.rs index aa2e8d14..c3aca3cd 100644 --- a/src/hash/rescue/rpx/mod.rs +++ b/src/hash/rescue/rpx/mod.rs @@ -9,7 +9,7 @@ use super::{ }; mod digest; -pub use digest::RpxDigest; +pub use digest::{RpxDigest, RpxDigestError}; pub type CubicExtElement = CubeExtension; @@ -55,6 +55,17 @@ pub type CubicExtElement = CubeExtension; /// to deserialize them into field elements and then hash them using /// [hash_elements()](Rpx256::hash_elements) function rather then hashing the serialized bytes /// using [hash()](Rpx256::hash) function. +/// +/// ## Domain separation +/// [merge_in_domain()](Rpx256::merge_in_domain) hashes two digests into one digest with some domain +/// identifier and the current implementation sets the second capacity element to the value of +/// this domain identifier. Using a similar argument to the one formulated for domain separation +/// in Appendix C of the [specifications](https://eprint.iacr.org/2023/1045), one sees that doing +/// so degrades only pre-image resistance, from its initial bound of c.log_2(p), by as much as +/// the log_2 of the size of the domain identifier space. Since pre-image resistance becomes +/// the bottleneck for the security bound of the sponge in overwrite-mode only when it is +/// lower than 2^128, we see that the target 128-bit security level is maintained as long as +/// the size of the domain identifier space, including for padding, is less than 2^128. #[derive(Debug, Copy, Clone, Eq, PartialEq)] pub struct Rpx256(); diff --git a/src/merkle/merkle_tree.rs b/src/merkle/merkle_tree.rs index ad7079ed..12b514a0 100644 --- a/src/merkle/merkle_tree.rs +++ b/src/merkle/merkle_tree.rs @@ -1,8 +1,6 @@ use alloc::{string::String, vec::Vec}; use core::{fmt, ops::Deref, slice}; -use winter_math::log2; - use super::{InnerNodeInfo, MerkleError, MerklePath, NodeIndex, Rpo256, RpoDigest, Word}; use crate::utils::{uninit_vector, word_to_hex}; @@ -70,7 +68,7 @@ impl MerkleTree { /// /// Merkle tree of depth 1 has two leaves, depth 2 has four leaves etc. pub fn depth(&self) -> u8 { - log2(self.nodes.len() / 2) as u8 + (self.nodes.len() / 2).ilog2() as u8 } /// Returns a node at the specified depth and index value. diff --git a/src/merkle/partial_mt/mod.rs b/src/merkle/partial_mt/mod.rs index 1f9e2d5e..ef464327 100644 --- a/src/merkle/partial_mt/mod.rs +++ b/src/merkle/partial_mt/mod.rs @@ -214,7 +214,7 @@ impl PartialMerkleTree { /// # Errors /// Returns an error if: /// - the specified index has depth set to 0 or the depth is greater than the depth of this - /// Merkle tree. + /// Merkle tree. /// - the specified index is not contained in the nodes map. pub fn get_path(&self, mut index: NodeIndex) -> Result { if index.is_root() { diff --git a/src/merkle/smt/full/tests.rs b/src/merkle/smt/full/tests.rs index 1c066bd7..e852811c 100644 --- a/src/merkle/smt/full/tests.rs +++ b/src/merkle/smt/full/tests.rs @@ -287,8 +287,7 @@ fn test_empty_leaf_hash() { #[test] fn test_smt_get_value() { let key_1: RpoDigest = RpoDigest::from([ONE, ONE, ONE, ONE]); - let key_2: RpoDigest = - RpoDigest::from([2_u32.into(), 2_u32.into(), 2_u32.into(), 2_u32.into()]); + let key_2: RpoDigest = RpoDigest::from([2_u32, 2_u32, 2_u32, 2_u32]); let value_1 = [ONE; WORD_SIZE]; let value_2 = [2_u32.into(); WORD_SIZE]; @@ -302,8 +301,7 @@ fn test_smt_get_value() { assert_eq!(value_2, returned_value_2); // Check that a key with no inserted value returns the empty word - let key_no_value = - RpoDigest::from([42_u32.into(), 42_u32.into(), 42_u32.into(), 42_u32.into()]); + let key_no_value = RpoDigest::from([42_u32, 42_u32, 42_u32, 42_u32]); assert_eq!(EMPTY_WORD, smt.get_value(&key_no_value)); } @@ -312,8 +310,7 @@ fn test_smt_get_value() { #[test] fn test_smt_entries() { let key_1: RpoDigest = RpoDigest::from([ONE, ONE, ONE, ONE]); - let key_2: RpoDigest = - RpoDigest::from([2_u32.into(), 2_u32.into(), 2_u32.into(), 2_u32.into()]); + let key_2: RpoDigest = RpoDigest::from([2_u32, 2_u32, 2_u32, 2_u32]); let value_1 = [ONE; WORD_SIZE]; let value_2 = [2_u32.into(); WORD_SIZE]; @@ -347,7 +344,7 @@ fn test_empty_smt_leaf_serialization() { #[test] fn test_single_smt_leaf_serialization() { let single_leaf = SmtLeaf::new_single( - RpoDigest::from([10_u32.into(), 11_u32.into(), 12_u32.into(), 13_u32.into()]), + RpoDigest::from([10_u32, 11_u32, 12_u32, 13_u32]), [1_u32.into(), 2_u32.into(), 3_u32.into(), 4_u32.into()], ); @@ -363,11 +360,11 @@ fn test_single_smt_leaf_serialization() { fn test_multiple_smt_leaf_serialization_success() { let multiple_leaf = SmtLeaf::new_multiple(vec![ ( - RpoDigest::from([10_u32.into(), 11_u32.into(), 12_u32.into(), 13_u32.into()]), + RpoDigest::from([10_u32, 11_u32, 12_u32, 13_u32]), [1_u32.into(), 2_u32.into(), 3_u32.into(), 4_u32.into()], ), ( - RpoDigest::from([100_u32.into(), 101_u32.into(), 102_u32.into(), 13_u32.into()]), + RpoDigest::from([100_u32, 101_u32, 102_u32, 13_u32]), [11_u32.into(), 12_u32.into(), 13_u32.into(), 14_u32.into()], ), ]) diff --git a/src/utils/kv_map.rs b/src/utils/kv_map.rs index e68c26c5..c9e6cf06 100644 --- a/src/utils/kv_map.rs +++ b/src/utils/kv_map.rs @@ -126,11 +126,10 @@ impl KvMap for RecordingMap { /// /// If the key is part of the initial data set, the key access is recorded. fn get(&self, key: &K) -> Option<&V> { - self.data.get(key).map(|value| { + self.data.get(key).inspect(|&value| { if !self.updates.contains(key) { self.trace.borrow_mut().insert(key.clone(), value.clone()); } - value }) } @@ -155,11 +154,10 @@ impl KvMap for RecordingMap { /// returned. fn insert(&mut self, key: K, value: V) -> Option { let new_update = self.updates.insert(key.clone()); - self.data.insert(key.clone(), value).map(|old_value| { + self.data.insert(key.clone(), value).inspect(|old_value| { if new_update { self.trace.borrow_mut().insert(key, old_value.clone()); } - old_value }) } @@ -167,12 +165,11 @@ impl KvMap for RecordingMap { /// /// If the key exists in the data set, the old value is returned. fn remove(&mut self, key: &K) -> Option { - self.data.remove(key).map(|old_value| { + self.data.remove(key).inspect(|old_value| { let new_update = self.updates.insert(key.clone()); if new_update { self.trace.borrow_mut().insert(key.clone(), old_value.clone()); } - old_value }) } diff --git a/src/utils/mod.rs b/src/utils/mod.rs index 14e55645..dea4ffdd 100644 --- a/src/utils/mod.rs +++ b/src/utils/mod.rs @@ -58,13 +58,13 @@ impl Display for HexParseError { fn fmt(&self, f: &mut core::fmt::Formatter<'_>) -> core::fmt::Result { match self { HexParseError::InvalidLength { expected, actual } => { - write!(f, "Hex encoded RpoDigest must have length 66, including the 0x prefix. expected {expected} got {actual}") + write!(f, "Expected hex data to have length {expected}, including the 0x prefix. Got {actual}") } HexParseError::MissingPrefix => { - write!(f, "Hex encoded RpoDigest must start with 0x prefix") + write!(f, "Hex encoded data must start with 0x prefix") } HexParseError::InvalidChar => { - write!(f, "Hex encoded RpoDigest must contain characters [a-zA-Z0-9]") + write!(f, "Hex encoded data must contain characters [a-zA-Z0-9]") } HexParseError::OutOfRange => { write!(f, "Hex encoded values of an RpoDigest must be inside the field modulus")