diff --git a/.circleci/config.yml b/.circleci/config.yml new file mode 100644 index 000000000..d95cffad9 --- /dev/null +++ b/.circleci/config.yml @@ -0,0 +1,40 @@ +# Use the latest 2.1 version of CircleCI pipeline process engine. +# See: https://circleci.com/docs/2.0/configuration-reference +version: 2.1 + +orbs: + slack: circleci/slack@4.1 + +# Define a job to be invoked later in a workflow. +# See: https://circleci.com/docs/2.0/configuration-reference/#jobs +jobs: + cargo-test: + # Specify the execution environment. You can specify an image from Dockerhub or use one of our Convenience Images from CircleCI's Developer Hub. + # See: https://circleci.com/docs/2.0/configuration-reference/#docker-machine-macos-windows-executor + docker: + - image: cimg/rust:1.65.0 + # Add steps to the job + # See: https://circleci.com/docs/2.0/configuration-reference/#steps + steps: + - checkout + - run: + name: "cargo test" + command: | + sudo apt update && sudo apt-get install libfontconfig libfontconfig1-dev libfreetype6-dev; + cargo version; + cargo test --all --all-features; + - slack/notify: + event: fail + template: basic_fail_1 + - slack/notify: + event: pass + template: basic_success_1 + + +# Invoke jobs via workflows +# See: https://circleci.com/docs/2.0/configuration-reference/#workflows +workflows: + build-and-test: + jobs: + - cargo-test: + context: CI-Orchard-slack diff --git a/.gitignore b/.gitignore index b4e2dad25..874a5ed83 100644 --- a/.gitignore +++ b/.gitignore @@ -1,4 +1,5 @@ /target **/*.rs.bk .vscode +.idea action-circuit-layout.png diff --git a/Cargo.lock b/Cargo.lock index b525d0ada..e2e8971ed 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -29,9 +29,9 @@ dependencies = [ [[package]] name = "aes" -version = "0.8.3" +version = "0.8.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ac1f845298e95f983ff1944b728ae08b8cebab80d684f0a832ed0fc74dfa27e2" +checksum = "b169f7a6d4742236a0a00c541b845991d0ac43e546831af1249753ab4c3aa3a0" dependencies = [ "cfg-if", "cipher", @@ -40,21 +40,22 @@ dependencies = [ [[package]] name = "ahash" -version = "0.8.3" +version = "0.8.6" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2c99f64d1e06488f620f932677e24bc6e2897582980441ae90a671415bd7ec2f" +checksum = "91429305e9f0a25f6205c5b8e0d2db09e0708a7a6df0f42212bb56c32c8ac97a" dependencies = [ "cfg-if", "getrandom", "once_cell", "version_check", + "zerocopy", ] [[package]] name = "aho-corasick" -version = "1.0.5" +version = "1.1.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0c378d78423fdad8089616f827526ee33c19f2fddbd5de1629152c9593ba4783" +checksum = "8e60d3430d3a69478ad0993f19238d2df97c507009a52b3c10addcd7f6bcb916" dependencies = [ "memchr", ] @@ -82,9 +83,9 @@ checksum = "4b46cbb362ab8752921c97e041f5e366ee6297bd428a31275b9fcf1e380f7299" [[package]] name = "anyhow" -version = "1.0.75" +version = "1.0.82" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a4668cab20f66d8d020e1fbc0ebe47217433c1b6c8f2040faf858554e394ace6" +checksum = "f538837af36e6f6a9be0faa67f9a314f8119e4e4b5867c6ab40ed60360142519" [[package]] name = "arrayref" @@ -111,15 +112,15 @@ dependencies = [ [[package]] name = "autocfg" -version = "1.1.0" +version = "1.2.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d468802bab17cbc0cc575e9b053f41e72aa36bfa6b7f55e3529ffa43161b97fa" +checksum = "f1fdabc7756949593fe60f30ec81974b613357de856987752631dea1e3394c80" [[package]] name = "backtrace" -version = "0.3.69" +version = "0.3.71" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2089b7e3f35b9dd2d0ed921ead4f6d318c27680d4a5bd167b3ee120edb105837" +checksum = "26b05800d2e817c8b3b4b54abd461726265fa9789ae34330622f2db9ee696f9d" dependencies = [ "addr2line", "cc", @@ -130,6 +131,18 @@ dependencies = [ "rustc-demangle", ] +[[package]] +name = "base16ct" +version = "0.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4c7f02d4ea65f2c1853089ffd8d2787bdbc63de2f0d29dedbcf8ccdfa0ccd4cf" + +[[package]] +name = "base64ct" +version = "1.6.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8c3c1a368f70d6cf7302d78f8f7093da241fb8e8807c05cc9e51a125895a6d5b" + [[package]] name = "bit-set" version = "0.5.3" @@ -159,9 +172,9 @@ checksum = "bef38d45163c2f1dde094a7dfd33ccf595c92905c8f8f4fdc18d06fb1037718a" [[package]] name = "bitflags" -version = "2.4.0" +version = "2.5.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b4682ae6287fcf752ecaabbfcc7b6f9b72aa33933dc23a554d853aea8eea8635" +checksum = "cf4b9d6a944f767f8e5e0db018570623c85f3d925ac718db4e06d0187adb21c1" [[package]] name = "bitvec" @@ -186,6 +199,15 @@ dependencies = [ "constant_time_eq", ] +[[package]] +name = "block-buffer" +version = "0.10.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3078c7629b62d3f0439517fa394996acacc5cbc91c5a20d8c658e77abd503a71" +dependencies = [ + "generic-array", +] + [[package]] name = "bls12_381" version = "0.8.0" @@ -208,21 +230,21 @@ dependencies = [ [[package]] name = "bumpalo" -version = "3.13.0" +version = "3.16.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a3e2c3daef883ecc1b5d58c15adae93470a91d425f3532ba1695849656af3fc1" +checksum = "79296716171880943b8470b5f8d03aa55eb2e645a4874bdbb28adb49162e012c" [[package]] name = "bytemuck" -version = "1.14.0" +version = "1.15.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "374d28ec25809ee0e23827c2ab573d729e293f281dfe393500e7ad618baa61c6" +checksum = "5d6d68c57235a3a081186990eca2867354726650f42f7516ca50c28d6281fd15" [[package]] name = "byteorder" -version = "1.4.3" +version = "1.5.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "14c189c53d098945499cdfa7ecc63567cf3886b3332b312a5b4585d8d3a6a610" +checksum = "1fd0f2584146f6f2ef48085050886acf353beff7305ebd1ae69500e27c67f64b" [[package]] name = "cast" @@ -241,12 +263,9 @@ dependencies = [ [[package]] name = "cc" -version = "1.0.83" +version = "1.0.95" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f1174fb0b6ec23863f8b971027804a42614e347eafb0a95bf0b12cdae21fc4d0" -dependencies = [ - "libc", -] +checksum = "d32a725bc159af97c3e629873bb9f88fb8cf8a4867175f76dc987815ea07c83b" [[package]] name = "cfg-if" @@ -280,23 +299,23 @@ dependencies = [ [[package]] name = "chrono" -version = "0.4.30" +version = "0.4.38" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "defd4e7873dbddba6c7c91e199c7fcb946abc4a6a4ac3195400bcfb01b5de877" +checksum = "a21f936df1771bf62b77f047b726c4625ff2e8aa607c01ec06e5a05bd8463401" dependencies = [ "android-tzdata", "iana-time-zone", "js-sys", "num-traits", "wasm-bindgen", - "windows-targets", + "windows-targets 0.52.5", ] [[package]] name = "ciborium" -version = "0.2.1" +version = "0.2.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "effd91f6c78e5a4ace8a5d3c0b6bfaec9e2baaef55f3efc00e45fb2e477ee926" +checksum = "42e69ffd6f0917f5c029256a24d0161db17cea3997d185db0d35926308770f0e" dependencies = [ "ciborium-io", "ciborium-ll", @@ -305,18 +324,18 @@ dependencies = [ [[package]] name = "ciborium-io" -version = "0.2.1" +version = "0.2.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "cdf919175532b369853f5d5e20b26b43112613fd6fe7aee757e35f7a44642656" +checksum = "05afea1e0a06c9be33d539b876f1ce3692f4afea2cb41f740e7743225ed1c757" [[package]] name = "ciborium-ll" -version = "0.2.1" +version = "0.2.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "defaa24ecc093c77630e6c15e17c51f5e187bf35ee514f4e2d67baaa96dae22b" +checksum = "57663b653d948a338bfb3eeba9bb2fd5fcfaecb9e199e87e1eda4d9e8b240fd9" dependencies = [ "ciborium-io", - "half 1.8.2", + "half", ] [[package]] @@ -338,7 +357,7 @@ checksum = "4ea181bf566f71cb9a5d17a59e1871af638180a18fb0035c92ae62b705207123" dependencies = [ "bitflags 1.3.2", "clap_lex", - "indexmap", + "indexmap 1.9.3", "textwrap", ] @@ -351,15 +370,6 @@ dependencies = [ "os_str_bytes", ] -[[package]] -name = "cmake" -version = "0.1.50" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a31c789563b815f77f4250caee12365734369f942439b7defd71e18a48197130" -dependencies = [ - "cc", -] - [[package]] name = "color_quant" version = "1.1.0" @@ -372,6 +382,12 @@ version = "0.3.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "ed3d0b5ff30645a68f35ece8cea4556ca14ef8a1651455f789a099a0513532a6" +[[package]] +name = "const-oid" +version = "0.9.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c2459377285ad874054d797f3ccebf984978aa39129f6eafde5cdc8315b612f8" + [[package]] name = "constant_time_eq" version = "0.2.6" @@ -380,9 +396,9 @@ checksum = "21a53c0a4d288377e7415b53dcfc3c04da5cdc2cc95c8d5ac178b58f0b861ad6" [[package]] name = "core-foundation" -version = "0.9.3" +version = "0.9.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "194a7a9e6de53fa55116934067c844d9d749312f75c6f6d0980e8c252f8c2146" +checksum = "91e195e091a93c46f7102ec7818a2aa394e1e1771c3ab4825963fa03e45afb8f" dependencies = [ "core-foundation-sys", "libc", @@ -390,9 +406,9 @@ dependencies = [ [[package]] name = "core-foundation-sys" -version = "0.8.4" +version = "0.8.6" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e496a50fda8aacccc86d7529e2c1e0892dbd0f898a6b5645b5561b89c3210efa" +checksum = "06ea2b9bc92be3c2baa9334a323ebca2d6f074ff852cd1d7b11064035cd3868f" [[package]] name = "core-graphics" @@ -409,9 +425,9 @@ dependencies = [ [[package]] name = "core-graphics-types" -version = "0.1.2" +version = "0.1.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2bb142d41022986c1d8ff29103a1411c8a3dfad3552f87a4f8dc50d61d4f4e33" +checksum = "45390e6114f68f718cc7a830514a96f903cccd70d02a8f6d9f643ac4ba45afaf" dependencies = [ "bitflags 1.3.2", "core-foundation", @@ -441,18 +457,18 @@ dependencies = [ [[package]] name = "cpufeatures" -version = "0.2.9" +version = "0.2.12" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a17b76ff3a4162b0b27f354a0c87015ddad39d35f9c0c36607a3bdd175dde1f1" +checksum = "53fe5e26ff1b7aef8bca9c6080520cfb8d9333c7568e1829cef191a9723e5504" dependencies = [ "libc", ] [[package]] name = "crc32fast" -version = "1.3.2" +version = "1.4.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b540bd8bc810d3885c6ea91e2018302f68baba2129ab3e88f32389ee9370880d" +checksum = "b3855a8a784b474f333699ef2bbca9db2c4a1f6d9088a90a2d25b1eb53111eaa" dependencies = [ "cfg-if", ] @@ -495,46 +511,37 @@ dependencies = [ [[package]] name = "crossbeam-channel" -version = "0.5.8" +version = "0.5.12" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a33c2bf77f2df06183c3aa30d1e96c0695a313d4f9c453cc3762a6db39f99200" +checksum = "ab3db02a9c5b5121e1e42fbdb1aeb65f5e02624cc58c43f2884c6ccac0b82f95" dependencies = [ - "cfg-if", "crossbeam-utils", ] [[package]] name = "crossbeam-deque" -version = "0.8.3" +version = "0.8.5" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ce6fd6f855243022dcecf8702fef0c297d4338e226845fe067f6341ad9fa0cef" +checksum = "613f8cc01fe9cf1a3eb3d7f488fd2fa8388403e97039e2f73692932e291a770d" dependencies = [ - "cfg-if", "crossbeam-epoch", "crossbeam-utils", ] [[package]] name = "crossbeam-epoch" -version = "0.9.15" +version = "0.9.18" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ae211234986c545741a7dc064309f67ee1e5ad243d0e48335adc0484d960bcc7" +checksum = "5b82ac4a3c2ca9c3460964f020e1402edd5753411d7737aa39c3714ad1b5420e" dependencies = [ - "autocfg", - "cfg-if", "crossbeam-utils", - "memoffset", - "scopeguard", ] [[package]] name = "crossbeam-utils" -version = "0.8.16" +version = "0.8.19" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5a22b2d63d4d1dc0b7f1b6b2747dd0088008a9be28b6ddf0b1e7d335e3037294" -dependencies = [ - "cfg-if", -] +checksum = "248e3bacc7dc6baa3b21e405ee045c3047101a49145e7e9eca583ab4c2ca5345" [[package]] name = "crunchy" @@ -542,6 +549,18 @@ version = "0.2.2" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "7a81dae078cea95a014a339291cec439d2f232ebe854a9d672b796c6afafa9b7" +[[package]] +name = "crypto-bigint" +version = "0.5.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0dc92fb57ca44df6db8059111ab3af99a63d5d0f8375d9972e319a379c6bab76" +dependencies = [ + "generic-array", + "rand_core", + "subtle", + "zeroize", +] + [[package]] name = "crypto-common" version = "0.1.6" @@ -594,7 +613,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "978747c1d849a7d2ee5e8adc0159961c48fb7e5db2f06af6723b80123bb53856" dependencies = [ "cfg-if", - "hashbrown 0.14.0", + "hashbrown 0.14.3", "lock_api", "once_cell", "parking_lot_core", @@ -609,6 +628,16 @@ dependencies = [ "uuid", ] +[[package]] +name = "der" +version = "0.7.9" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f55bf8e7b65898637379c1b74eb1551107c8294ed26d855ceb9fd1a09cfc9bc0" +dependencies = [ + "const-oid", + "zeroize", +] + [[package]] name = "derive_builder" version = "0.9.0" @@ -634,6 +663,18 @@ dependencies = [ "syn 1.0.109", ] +[[package]] +name = "digest" +version = "0.10.7" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9ed9a281f7bc9b7576e61468ba615a66a5c8cfdff42420a70aa82701a3b1e292" +dependencies = [ + "block-buffer", + "const-oid", + "crypto-common", + "subtle", +] + [[package]] name = "dirs-next" version = "2.0.0" @@ -676,42 +717,70 @@ dependencies = [ "wio", ] +[[package]] +name = "ecdsa" +version = "0.16.9" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ee27f32b5c5292967d2d4a9d7f1e0b0aed2c15daded5a60300e4abb9d8020bca" +dependencies = [ + "der", + "digest", + "elliptic-curve", + "rfc6979", + "signature", + "spki", +] + [[package]] name = "either" -version = "1.9.0" +version = "1.11.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a26ae43d7bcc3b814de94796a5e736d4029efb0ee900c12e2d54c993ad1a1e07" +checksum = "a47c1c47d2f5964e29c61246e81db715514cd532db6b5116a25ea3c03d6780a2" [[package]] -name = "errno" -version = "0.3.3" +name = "elliptic-curve" +version = "0.13.8" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "136526188508e25c6fef639d7927dfb3e0e3084488bf202267829cf7fc23dbdd" +checksum = "b5e6043086bf7973472e0c7dff2142ea0b680d30e18d9cc40f267efbf222bd47" dependencies = [ - "errno-dragonfly", - "libc", - "windows-sys", + "base16ct", + "crypto-bigint", + "digest", + "ff", + "generic-array", + "group", + "pkcs8", + "rand_core", + "sec1", + "subtle", + "zeroize", ] [[package]] -name = "errno-dragonfly" -version = "0.1.2" +name = "equivalent" +version = "1.0.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5443807d6dff69373d433ab9ef5378ad8df50ca6298caf15de6e52e24aaf54d5" + +[[package]] +name = "errno" +version = "0.3.8" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "aa68f1b12764fab894d2755d2518754e71b4fd80ecfb822714a1206c2aab39bf" +checksum = "a258e46cdc063eb8519c00b9fc845fc47bcfca4130e2f08e88665ceda8474245" dependencies = [ - "cc", "libc", + "windows-sys", ] [[package]] name = "exr" -version = "1.7.0" +version = "1.72.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d1e481eb11a482815d3e9d618db8c42a93207134662873809335a92327440c18" +checksum = "887d93f60543e9a9362ef8a21beedd0a833c5d9610e18c67abe15a5963dcb1a4" dependencies = [ "bit_field", "flume", - "half 2.2.1", + "half", "lebe", "miniz_oxide", "rayon-core", @@ -721,15 +790,15 @@ dependencies = [ [[package]] name = "fastrand" -version = "2.0.0" +version = "2.0.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6999dc1837253364c2ebb0704ba97994bd874e8f195d665c50b7548f6ea92764" +checksum = "658bd65b1cf4c852a3cc96f18a8ce7b5640f6b703f905c7d74532294c2a63984" [[package]] name = "fdeflate" -version = "0.3.0" +version = "0.3.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d329bdeac514ee06249dabc27877490f17f5d371ec693360768b838e19f3ae10" +checksum = "4f9bfee30e4dedf0ab8b422f03af778d9612b63f502710fc500a334ebe2de645" dependencies = [ "simd-adler32", ] @@ -759,9 +828,9 @@ dependencies = [ [[package]] name = "flate2" -version = "1.0.27" +version = "1.0.28" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c6c98ee8095e9d1dcbf2fcc6d95acccb90d1c81db1e44725c6a984b1dbdfb010" +checksum = "46303f565772937ffe1d394a4fac6f411c6013172fadde9dcdb1e147a086940e" dependencies = [ "crc32fast", "miniz_oxide", @@ -775,14 +844,10 @@ checksum = "7bad48618fdb549078c333a7a8528acb57af271d0433bdecd523eb620628364e" [[package]] name = "flume" -version = "0.10.14" +version = "0.11.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1657b4441c3403d9f7b3409e47575237dac27b1b5726df654a6ecbf92f0f7577" +checksum = "55ac459de2512911e4b674ce33cf20befaba382d05b62b008afc1c8b57cbf181" dependencies = [ - "futures-core", - "futures-sink", - "nanorand", - "pin-project", "spin 0.9.8", ] @@ -848,9 +913,9 @@ dependencies = [ [[package]] name = "freetype" -version = "0.7.0" +version = "0.7.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "bee38378a9e3db1cc693b4f88d166ae375338a0ff75cb8263e1c601d51f35dc6" +checksum = "efc8599a3078adf8edeb86c71e9f8fa7d88af5ca31e806a867756081f90f5d83" dependencies = [ "freetype-sys", "libc", @@ -858,11 +923,11 @@ dependencies = [ [[package]] name = "freetype-sys" -version = "0.13.1" +version = "0.19.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a37d4011c0cc628dfa766fcc195454f4b068d7afdc2adfd28861191d866e731a" +checksum = "66ee28c39a43d89fbed8b4798fb4ba56722cfd2b5af81f9326c27614ba88ecd5" dependencies = [ - "cmake", + "cc", "libc", "pkg-config", ] @@ -873,18 +938,6 @@ version = "2.0.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "e6d5a32815ae3f33302d95fdcb2ce17862f8c65363dcfd29360480ba1001fc9c" -[[package]] -name = "futures-core" -version = "0.3.28" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4bca583b7e26f571124fe5b7561d49cb2868d79116cfa0eefce955557c6fee8c" - -[[package]] -name = "futures-sink" -version = "0.3.28" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f43be4fe21a13b9781a69afa4985b0f6ee0e1afab2c6f454a8cf30e2b2237b6e" - [[package]] name = "generic-array" version = "0.14.7" @@ -893,26 +946,25 @@ checksum = "85649ca51fd72272d7821adaf274ad91c288277713d9c18820d8499a7ff69e9a" dependencies = [ "typenum", "version_check", + "zeroize", ] [[package]] name = "getrandom" -version = "0.2.10" +version = "0.2.14" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "be4136b2a15dd319360be1c07d9933517ccf0be8f16bf62a3bee4f0d618df427" +checksum = "94b22e06ecb0110981051723910cbf0b5f5e09a2062dd7663334ee79a9d1286c" dependencies = [ "cfg-if", - "js-sys", "libc", "wasi", - "wasm-bindgen", ] [[package]] name = "gif" -version = "0.11.4" +version = "0.12.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3edd93c6756b4dfaf2709eafcc345ba2636565295c198a9cfbf75fa5e3e00b06" +checksum = "80792593675e051cf94a4b111980da2ba60d4a83e43e0048c5693baab3977045" dependencies = [ "color_quant", "weezl", @@ -920,9 +972,9 @@ dependencies = [ [[package]] name = "gif" -version = "0.12.0" +version = "0.13.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "80792593675e051cf94a4b111980da2ba60d4a83e43e0048c5693baab3977045" +checksum = "3fb2d69b19215e18bb912fa30f7ce15846e301408695e44e0ef719f1da9e19f2" dependencies = [ "color_quant", "weezl", @@ -930,9 +982,9 @@ dependencies = [ [[package]] name = "gimli" -version = "0.28.0" +version = "0.28.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6fb8d784f27acf97159b40fc4db5ecd8aa23b9ad5ef69cdd136d3bc80665f0c0" +checksum = "4271d37baee1b8c7e4b708028c57d816cf9d2434acb33a549475f78c181f6253" [[package]] name = "group" @@ -946,12 +998,6 @@ dependencies = [ "subtle", ] -[[package]] -name = "half" -version = "1.8.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "eabb4a44450da02c90444cf74558da904edde8fb4e9035a9a6a4e15445af0bd7" - [[package]] name = "half" version = "2.2.1" @@ -964,8 +1010,7 @@ dependencies = [ [[package]] name = "halo2_gadgets" version = "0.3.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "126a150072b0c38c7b573fe3eaf0af944a7fed09e154071bf2436d3f016f7230" +source = "git+https://github.com/QED-it/halo2?branch=zsa1#5f436dc3387665fe3201d381791a62a8233b2171" dependencies = [ "arrayvec", "bitvec", @@ -989,8 +1034,7 @@ checksum = "47716fe1ae67969c5e0b2ef826f32db8c3be72be325e1aa3c1951d06b5575ec5" [[package]] name = "halo2_proofs" version = "0.3.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7b867a8d9bbb85fca76fff60652b5cd19b853a1c4d0665cb89bee68b18d2caf0" +source = "git+https://github.com/QED-it/halo2?branch=zsa1#5f436dc3387665fe3201d381791a62a8233b2171" dependencies = [ "blake2b_simd", "ff", @@ -1012,9 +1056,9 @@ checksum = "8a9ee70c43aaf417c914396645a0fa852624801b24ebb7ae78fe8272889ac888" [[package]] name = "hashbrown" -version = "0.14.0" +version = "0.14.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2c6201b9ff9fd90a5a3bac2e56a830d0caa509576f0e503818ee82c181b3437a" +checksum = "290f1a1d9242c78d09ce40a5e87e7554ee637af1351968159f4952f028f75604" [[package]] name = "hermit-abi" @@ -1027,9 +1071,9 @@ dependencies = [ [[package]] name = "hermit-abi" -version = "0.3.2" +version = "0.3.9" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "443144c8cdadd93ebf52ddb4056d257f5b52c04d3c804e657d19eb73fc33668b" +checksum = "d231dfb89cfffdbc30e7fc41579ed6066ad03abda9e567ccafae602b97ec5024" [[package]] name = "hex" @@ -1037,18 +1081,27 @@ version = "0.4.3" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "7f24254aa9a54b5c858eaee2f5bccdb46aaf0e486a595ed5fd8f86ba55232a70" +[[package]] +name = "hmac" +version = "0.12.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6c49c37c09c17a53d937dfbb742eb3a961d65a994e6bcdcf37e7399d0cc8ab5e" +dependencies = [ + "digest", +] + [[package]] name = "iana-time-zone" -version = "0.1.57" +version = "0.1.60" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2fad5b825842d2b38bd206f3e81d6957625fd7f0a361e345c30e01a0ae2dd613" +checksum = "e7ffbb5a1b541ea2561f8c41c087286cc091e21e556a4f09a8f6cbf17b69b141" dependencies = [ "android_system_properties", "core-foundation-sys", "iana-time-zone-haiku", "js-sys", "wasm-bindgen", - "windows", + "windows-core", ] [[package]] @@ -1068,31 +1121,32 @@ checksum = "b9e0384b61958566e926dc50660321d12159025e767c18e043daf26b70104c39" [[package]] name = "image" -version = "0.24.4" +version = "0.24.9" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "bd8e4fb07cf672b1642304e731ef8a6a4c7891d67bb4fd4f5ce58cd6ed86803c" +checksum = "5690139d2f55868e080017335e4b94cb7414274c74f1669c84fb5feba2c9f69d" dependencies = [ "bytemuck", "byteorder", "color_quant", "exr", - "gif 0.11.4", + "gif 0.13.1", "jpeg-decoder", - "num-rational", "num-traits", "png", - "scoped_threadpool", + "qoi", "tiff", ] [[package]] name = "incrementalmerkletree" -version = "0.5.0" +version = "0.5.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "361c467824d4d9d4f284be4b2608800839419dccc4d4608f28345237fe354623" +checksum = "eb1872810fb725b06b8c153dde9e86f3ec26747b9b60096da7a869883b549cbe" dependencies = [ "either", "proptest", + "rand", + "rand_core", ] [[package]] @@ -1105,22 +1159,31 @@ dependencies = [ "hashbrown 0.12.3", ] +[[package]] +name = "indexmap" +version = "2.2.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "168fb715dda47215e360912c096649d23d58bf392ac62f73919e831745e40f26" +dependencies = [ + "equivalent", + "hashbrown 0.14.3", +] + [[package]] name = "inferno" -version = "0.11.14" +version = "0.11.19" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d6e66fa9bb3c52f40d05c11b78919ff2f18993c2305bd8a62556d20cb3e9606f" +checksum = "321f0f839cd44a4686e9504b0a62b4d69a50b62072144c71c68f5873c167b8d9" dependencies = [ "ahash", - "atty", "crossbeam-channel", "crossbeam-utils", "dashmap", - "indexmap", + "indexmap 2.2.6", + "is-terminal", "itoa", "log", "num-format", - "num_cpus", "once_cell", "quick-xml", "rgb", @@ -1136,6 +1199,17 @@ dependencies = [ "generic-array", ] +[[package]] +name = "is-terminal" +version = "0.4.12" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f23ff5ef2b80d608d61efee834934d862cd92461afc0560dedf493e4c033738b" +dependencies = [ + "hermit-abi 0.3.9", + "libc", + "windows-sys", +] + [[package]] name = "itertools" version = "0.10.5" @@ -1147,24 +1221,24 @@ dependencies = [ [[package]] name = "itoa" -version = "1.0.9" +version = "1.0.11" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "af150ab688ff2122fcef229be89cb50dd66af9e01a4ff320cc137eecc9bacc38" +checksum = "49f1f14873335454500d59611f1cf4a4b0f786f9ac11f4312a78e4cf2566695b" [[package]] name = "jpeg-decoder" -version = "0.2.6" +version = "0.3.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9478aa10f73e7528198d75109c8be5cd7d15fb530238040148d5f9a22d4c5b3b" +checksum = "f5d4a7da358eff58addd2877a45865158f0d78c911d43a5784ceb7bbf52833b0" dependencies = [ "rayon", ] [[package]] name = "js-sys" -version = "0.3.64" +version = "0.3.69" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c5f195fe497f702db0f318b07fdd68edb16955aed830df8363d837542f8f935a" +checksum = "29c15563dc2726973df627357ce0c9ddddbea194836909d655df6a75d2cf296d" dependencies = [ "wasm-bindgen", ] @@ -1183,6 +1257,20 @@ dependencies = [ "subtle", ] +[[package]] +name = "k256" +version = "0.13.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "956ff9b67e26e1a6a866cb758f12c6f8746208489e3e4a4b5580802f2f0a587b" +dependencies = [ + "cfg-if", + "ecdsa", + "elliptic-curve", + "once_cell", + "sha2", + "signature", +] + [[package]] name = "lazy_static" version = "1.4.0" @@ -1200,37 +1288,47 @@ checksum = "03087c2bad5e1034e8cace5926dec053fb3790248370865f5117a7d0213354c8" [[package]] name = "libc" -version = "0.2.147" +version = "0.2.153" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b4668fb0ea861c1df094127ac5f1da3409a82116a4ba74fca2e58ef927159bb3" +checksum = "9c198f91728a82281a64e1f4f9eeb25d82cb32a5de251c6bd1b5154d63a8e7bd" [[package]] name = "libloading" -version = "0.8.0" +version = "0.8.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d580318f95776505201b28cf98eb1fa5e4be3b689633ba6a3e6cd880ff22d8cb" +checksum = "0c2a198fb6b0eada2a8df47933734e6d35d350665a33a3593d7164fa52c75c19" dependencies = [ "cfg-if", - "windows-sys", + "windows-targets 0.52.5", ] [[package]] name = "libm" -version = "0.2.7" +version = "0.2.8" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f7012b1bbb0719e1097c47611d3898568c546d597c2e74d66f6087edd5233ff4" +checksum = "4ec2a862134d2a7d32d7983ddcdd1c4923530833c9f2ea1a44fc5fa473989058" + +[[package]] +name = "libredox" +version = "0.1.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c0ff37bd590ca25063e35af745c343cb7a0271906fb7b37e4813e8f79f00268d" +dependencies = [ + "bitflags 2.5.0", + "libc", +] [[package]] name = "linux-raw-sys" -version = "0.4.5" +version = "0.4.13" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "57bcfdad1b858c2db7c38303a6d2ad4dfaf5eb53dfeb0910128b2c26d6158503" +checksum = "01cda141df6706de531b6c46c3a33ecca755538219bd484262fa09410c13539c" [[package]] name = "lock_api" -version = "0.4.10" +version = "0.4.11" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c1cc9717a20b1bb222f333e6a92fd32f7d8a18ddc5a3191a11af45dcbf4dcd16" +checksum = "3c168f8615b12bc01f9c17e2eb0cc07dcae1940121185446edc3744920e8ef45" dependencies = [ "autocfg", "scopeguard", @@ -1238,9 +1336,9 @@ dependencies = [ [[package]] name = "log" -version = "0.4.20" +version = "0.4.21" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b5e6163cb8c49088c2c36f57875e58ccd8c87c7427f7fbd50ea6710b2f3f2e8f" +checksum = "90ed8c1e510134f979dbc4f070f87d4313098b704861a105fe34231c70a3901c" [[package]] name = "maybe-rayon" @@ -1254,9 +1352,9 @@ dependencies = [ [[package]] name = "memchr" -version = "2.6.3" +version = "2.7.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8f232d6ef707e1956a43342693d2a31e72989554d58299d7a88738cc95b0d35c" +checksum = "6c8640c5d730cb13ebd907d8d04b52f55ac9a2eec55b440c8892f40d56c76c1d" [[package]] name = "memmap2" @@ -1267,15 +1365,6 @@ dependencies = [ "libc", ] -[[package]] -name = "memoffset" -version = "0.9.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5a634b1c61a95585bd15607c6ab0c4e5b226e695ff2800ba0cdccddf208c406c" -dependencies = [ - "autocfg", -] - [[package]] name = "memuse" version = "0.2.1" @@ -1287,23 +1376,14 @@ dependencies = [ [[package]] name = "miniz_oxide" -version = "0.7.1" +version = "0.7.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e7810e0be55b428ada41041c41f32c9f1a42817901b4ccf45fa3d4b6561e74c7" +checksum = "9d811f3e15f28568be3407c8e7fdb6514c1cda3cb30683f15b6a1a1dc4ea14a7" dependencies = [ "adler", "simd-adler32", ] -[[package]] -name = "nanorand" -version = "0.7.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6a51313c5820b0b02bd422f4b44776fbf47961755c74ce64afc73bfad10226c3" -dependencies = [ - "getrandom", -] - [[package]] name = "nix" version = "0.26.4" @@ -1344,59 +1424,37 @@ dependencies = [ [[package]] name = "num-integer" -version = "0.1.45" +version = "0.1.46" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "225d3389fb3509a24c93f5c29eb6bde2586b98d9f016636dff58d7c6f7569cd9" +checksum = "7969661fd2958a5cb096e56c8e1ad0444ac2bbcd0061bd28660485a44879858f" dependencies = [ - "autocfg", - "num-traits", -] - -[[package]] -name = "num-rational" -version = "0.4.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0638a1c9d0a3c0914158145bc76cff373a75a627e6ecbfb71cbe6f453a5a19b0" -dependencies = [ - "autocfg", - "num-integer", "num-traits", ] [[package]] name = "num-traits" -version = "0.2.16" +version = "0.2.18" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f30b0abd723be7e2ffca1272140fac1a2f084c77ec3e123c192b66af1ee9e6c2" +checksum = "da0df0e5185db44f69b44f26786fe401b6c293d1907744beaa7fa62b2e5a517a" dependencies = [ "autocfg", "libm", ] -[[package]] -name = "num_cpus" -version = "1.16.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4161fcb6d602d4d2081af7c3a45852d875a03dd337a6bfdd6e06407b61342a43" -dependencies = [ - "hermit-abi 0.3.2", - "libc", -] - [[package]] name = "object" -version = "0.32.1" +version = "0.32.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9cf5f9dd3933bd50a9e1f149ec995f39ae2c496d31fd772c1fd45ebc27e902b0" +checksum = "a6a622008b6e321afc04970976f62ee297fdbaa6f95318ca343e3eebb9648441" dependencies = [ "memchr", ] [[package]] name = "once_cell" -version = "1.18.0" +version = "1.19.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "dd8b5dd2ae5ed71462c540258bedcb51965123ad7e7ccf4b9a8cafaa4a63576d" +checksum = "3fdb12b2476b595f9358c5161aa467c2438859caa136dec86c26fdd2efe17b92" [[package]] name = "oorandom" @@ -1406,9 +1464,9 @@ checksum = "0ab1bc2a289d34bd04a330323ac98a1b4bc82c9d9fcb1e66b63caa84da26b575" [[package]] name = "opaque-debug" -version = "0.3.0" +version = "0.3.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "624a8340c38c1b80fd549087862da4ba43e08858af025b236e509b6649fc13d5" +checksum = "c08d65885ee38876c4f86fa503fb49d7b507c2b62552df7c70b2fce627e06381" [[package]] name = "orchard" @@ -1428,6 +1486,7 @@ dependencies = [ "image", "incrementalmerkletree", "inferno", + "k256", "lazy_static", "memuse", "nonempty", @@ -1447,9 +1506,9 @@ dependencies = [ [[package]] name = "os_str_bytes" -version = "6.5.1" +version = "6.6.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4d5d9eb14b174ee9aa2ef96dc2b94637a2d4b6e7cb873c7e171f0c20c6cf3eac" +checksum = "e2355d85b9a3786f481747ced0e0ff2ba35213a1f9bd406ed906554d7af805a1" [[package]] name = "parking_lot" @@ -1463,15 +1522,15 @@ dependencies = [ [[package]] name = "parking_lot_core" -version = "0.9.8" +version = "0.9.9" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "93f00c865fe7cabf650081affecd3871070f26767e7b2070a3ffae14c654b447" +checksum = "4c42a9226546d68acdd9c0a280d17ce19bfe27a46bf68784e4066115788d008e" dependencies = [ "cfg-if", "libc", - "redox_syscall 0.3.5", + "redox_syscall", "smallvec", - "windows-targets", + "windows-targets 0.48.5", ] [[package]] @@ -1501,55 +1560,34 @@ dependencies = [ [[package]] name = "pathfinder_simd" -version = "0.5.1" +version = "0.5.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "39fe46acc5503595e5949c17b818714d26fdf9b4920eacf3b2947f0199f4a6ff" +checksum = "ebf45976c56919841273f2a0fc684c28437e2f304e264557d9c72be5d5a718be" dependencies = [ "rustc_version", ] [[package]] -name = "pest" -version = "2.7.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d7a4d085fd991ac8d5b05a147b437791b4260b76326baf0fc60cf7c9c27ecd33" -dependencies = [ - "memchr", - "thiserror", - "ucd-trie", -] - -[[package]] -name = "pin-project" -version = "1.1.3" +name = "pin-project-lite" +version = "0.2.14" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "fda4ed1c6c173e3fc7a83629421152e01d7b1f9b7f65fb301e490e8cfc656422" -dependencies = [ - "pin-project-internal", -] +checksum = "bda66fc9667c18cb2758a2ac84d1167245054bcf85d5d1aaa6923f45801bdd02" [[package]] -name = "pin-project-internal" -version = "1.1.3" +name = "pkcs8" +version = "0.10.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4359fd9c9171ec6e8c62926d6faaf553a8dc3f64e1507e76da7911b4f6a04405" +checksum = "f950b2377845cebe5cf8b5165cb3cc1a5e0fa5cfa3e1f7f55707d8fd82e0a7b7" dependencies = [ - "proc-macro2", - "quote", - "syn 2.0.31", + "der", + "spki", ] -[[package]] -name = "pin-project-lite" -version = "0.2.13" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8afb450f006bf6385ca15ef45d71d2288452bc3683ce2e2cacc0d18e4be60b58" - [[package]] name = "pkg-config" -version = "0.3.27" +version = "0.3.30" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "26072860ba924cbfa98ea39c8c19b4dd6a4a25423dbdf219c1eca91aa0cf6964" +checksum = "d231b230927b5e4ad203db57bbcbee2802f6bce620b1e4a9024a07d94e2907ec" [[package]] name = "plotters" @@ -1599,9 +1637,9 @@ dependencies = [ [[package]] name = "png" -version = "0.17.10" +version = "0.17.13" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "dd75bf2d8dd3702b9707cdbc56a5b9ef42cec752eb8b3bafc01234558442aa64" +checksum = "06e4b0d3d1312775e782c86c91a111aa1f910cbb65e1337f9975b5f9a554b5e1" dependencies = [ "bitflags 1.3.2", "crc32fast", @@ -1651,33 +1689,42 @@ checksum = "5b40af805b3121feab8a3c29f04d8ad262fa8e0561883e7653e024ae4479e6de" [[package]] name = "proc-macro2" -version = "1.0.66" +version = "1.0.81" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "18fb31db3f9bddb2ea821cde30a9f70117e3f119938b5ee630b7403aa6e2ead9" +checksum = "3d1597b0c024618f09a9c3b8655b7e430397a36d23fdafec26d6965e9eec3eba" dependencies = [ "unicode-ident", ] [[package]] name = "proptest" -version = "1.2.0" +version = "1.4.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4e35c06b98bf36aba164cc17cb25f7e232f5c4aeea73baa14b8a9f0d92dbfa65" +checksum = "31b476131c3c86cb68032fdc5cb6d5a1045e3e42d96b69fa599fd77701e1f5bf" dependencies = [ "bit-set", - "bitflags 1.3.2", - "byteorder", + "bit-vec", + "bitflags 2.5.0", "lazy_static", "num-traits", "rand", "rand_chacha", "rand_xorshift", - "regex-syntax 0.6.29", + "regex-syntax", "rusty-fork", "tempfile", "unarray", ] +[[package]] +name = "qoi" +version = "0.4.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7f6d64c71eb498fe9eae14ce4ec935c555749aef511cca85b5568910d6e48001" +dependencies = [ + "bytemuck", +] + [[package]] name = "quick-error" version = "1.2.3" @@ -1695,9 +1742,9 @@ dependencies = [ [[package]] name = "quote" -version = "1.0.33" +version = "1.0.36" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5267fca4496028628a95160fc423a33e8b2e6af8a5302579e322e4b520293cae" +checksum = "0fa76aaf39101c457836aec0ce2316dbdc3ab723cdda1c6bd4e6ad4208acaca7" dependencies = [ "proc-macro2", ] @@ -1749,9 +1796,9 @@ dependencies = [ [[package]] name = "rayon" -version = "1.7.0" +version = "1.10.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1d2df5196e37bcc87abebc0053e20787d73847bb33134a69841207dd0a47f03b" +checksum = "b418a60154510ca1a002a752ca9714984e21e4241e804d32555251faf8b78ffa" dependencies = [ "either", "rayon-core", @@ -1759,14 +1806,12 @@ dependencies = [ [[package]] name = "rayon-core" -version = "1.11.0" +version = "1.12.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4b8f95bd6966f5c87776639160a66bd8ab9895d9d4ab01ddba9fc60661aebe8d" +checksum = "1465873a3dfdaa8ae7cb14b4383657caab0b3e8a0aa9ae8e04b044854c8dfce2" dependencies = [ - "crossbeam-channel", "crossbeam-deque", "crossbeam-utils", - "num_cpus", ] [[package]] @@ -1789,73 +1834,68 @@ dependencies = [ [[package]] name = "redox_syscall" -version = "0.2.16" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "fb5a58c1855b4b6819d59012155603f0b22ad30cad752600aadfcb695265519a" -dependencies = [ - "bitflags 1.3.2", -] - -[[package]] -name = "redox_syscall" -version = "0.3.5" +version = "0.4.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "567664f262709473930a4bf9e51bf2ebf3348f2e748ccc50dea20646858f8f29" +checksum = "4722d768eff46b75989dd134e5c353f0d6296e5aaa3132e776cbdb56be7731aa" dependencies = [ "bitflags 1.3.2", ] [[package]] name = "redox_users" -version = "0.4.3" +version = "0.4.5" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b033d837a7cf162d7993aded9304e30a83213c648b6e389db233191f891e5c2b" +checksum = "bd283d9651eeda4b2a83a43c1c91b266c40fd76ecd39a50a8c630ae69dc72891" dependencies = [ "getrandom", - "redox_syscall 0.2.16", + "libredox", "thiserror", ] [[package]] name = "regex" -version = "1.9.5" +version = "1.10.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "697061221ea1b4a94a624f67d0ae2bfe4e22b8a17b6a192afb11046542cc8c47" +checksum = "c117dbdfde9c8308975b6a18d71f3f385c89461f7b3fb054288ecf2a2058ba4c" dependencies = [ "aho-corasick", "memchr", "regex-automata", - "regex-syntax 0.7.5", + "regex-syntax", ] [[package]] name = "regex-automata" -version = "0.3.8" +version = "0.4.6" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c2f401f4955220693b56f8ec66ee9c78abffd8d1c4f23dc41a23839eb88f0795" +checksum = "86b83b8b9847f9bf95ef68afb0b8e6cdb80f498442f5179a29fad448fcc1eaea" dependencies = [ "aho-corasick", "memchr", - "regex-syntax 0.7.5", + "regex-syntax", ] [[package]] name = "regex-syntax" -version = "0.6.29" +version = "0.8.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f162c6dd7b008981e4d40210aca20b4bd0f9b60ca9271061b07f78537722f2e1" +checksum = "adad44e29e4c806119491a7f06f03de4d1af22c3a680dd47f1e6e179439d1f56" [[package]] -name = "regex-syntax" -version = "0.7.5" +name = "rfc6979" +version = "0.4.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "dbb5fb1acd8a1a18b3dd5be62d25485eb770e05afb408a9627d14d451bae12da" +checksum = "f8dd2a808d456c4a54e300a23e9f5a67e122c3024119acbfd73e3bf664491cb2" +dependencies = [ + "hmac", + "subtle", +] [[package]] name = "rgb" -version = "0.8.36" +version = "0.8.37" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "20ec2d3e3fc7a92ced357df9cebd5a10b6fb2aa1ee797bf7e9ce2f17dffc8f59" +checksum = "05aaa8004b64fd573fc9d002f4e632d51ad4f026c2b5ba95fcb6c2f32c2c47d8" dependencies = [ "bytemuck", ] @@ -1868,20 +1908,20 @@ checksum = "d626bb9dae77e28219937af045c257c28bfd3f69333c512553507f5f9798cb76" [[package]] name = "rustc_version" -version = "0.3.3" +version = "0.4.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f0dfe2087c51c460008730de8b57e6a320782fbfb312e1f4d520e6c6fae155ee" +checksum = "bfa0f585226d2e68097d4f95d113b15b83a82e819ab25717ec0590d9584ef366" dependencies = [ "semver", ] [[package]] name = "rustix" -version = "0.38.11" +version = "0.38.33" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c0c3dde1fc030af041adc40e79c0e7fbcf431dd24870053d187d7c66e4b87453" +checksum = "e3cc72858054fcff6d7dea32df2aeaee6a7c24227366d7ea429aada2f26b16ad" dependencies = [ - "bitflags 2.4.0", + "bitflags 2.5.0", "errno", "libc", "linux-raw-sys", @@ -1902,9 +1942,9 @@ dependencies = [ [[package]] name = "ryu" -version = "1.0.15" +version = "1.0.17" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1ad4cc8da4ef723ed60bced201181d83791ad433213d8c24efffda1eec85d741" +checksum = "e86697c916019a8588c99b5fac3cead74ec0b4b819707a682fd4d23fa0ce1ba1" [[package]] name = "same-file" @@ -1915,12 +1955,6 @@ dependencies = [ "winapi-util", ] -[[package]] -name = "scoped_threadpool" -version = "0.1.9" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1d51f5df5af43ab3f1360b429fa5e0152ac5ce8c0bd6485cae490332e96846a8" - [[package]] name = "scopeguard" version = "1.2.0" @@ -1928,54 +1962,77 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "94143f37725109f92c262ed2cf5e59bce7498c01bcc1502d7b9afe439a4e9f49" [[package]] -name = "semver" -version = "0.11.0" +name = "sec1" +version = "0.7.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f301af10236f6df4160f7c3f04eec6dbc70ace82d23326abad5edee88801c6b6" +checksum = "d3e97a565f76233a6003f9f5c54be1d9c5bdfa3eccfb189469f11ec4901c47dc" dependencies = [ - "semver-parser", + "base16ct", + "der", + "generic-array", + "pkcs8", + "subtle", + "zeroize", ] [[package]] -name = "semver-parser" -version = "0.10.2" +name = "semver" +version = "1.0.22" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "00b0bef5b7f9e0df16536d3961cfb6e84331c065b4066afb39768d0e319411f7" -dependencies = [ - "pest", -] +checksum = "92d43fe69e652f3df9bdc2b85b2854a0825b86e4fb76bc44d945137d053639ca" [[package]] name = "serde" -version = "1.0.188" +version = "1.0.198" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "cf9e0fcba69a370eed61bcf2b728575f726b50b55cba78064753d708ddc7549e" +checksum = "9846a40c979031340571da2545a4e5b7c4163bdae79b301d5f86d03979451fcc" dependencies = [ "serde_derive", ] [[package]] name = "serde_derive" -version = "1.0.188" +version = "1.0.198" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4eca7ac642d82aa35b60049a6eccb4be6be75e599bd2e9adb5f875a737654af2" +checksum = "e88edab869b01783ba905e7d0153f9fc1a6505a96e4ad3018011eedb838566d9" dependencies = [ "proc-macro2", "quote", - "syn 2.0.31", + "syn 2.0.60", ] [[package]] name = "serde_json" -version = "1.0.105" +version = "1.0.116" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "693151e1ac27563d6dbcec9dee9fbd5da8539b20fa14ad3752b2e6d363ace360" +checksum = "3e17db7126d17feb94eb3fad46bf1a96b034e8aacbc2e775fe81505f8b0b2813" dependencies = [ "itoa", "ryu", "serde", ] +[[package]] +name = "sha2" +version = "0.10.8" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "793db75ad2bcafc3ffa7c68b215fee268f537982cd901d132f89c6343f3a3dc8" +dependencies = [ + "cfg-if", + "cpufeatures", + "digest", +] + +[[package]] +name = "signature" +version = "2.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "77549399552de45a898a580c1b41d445bf730df867cc44e6c0233bbc4b8329de" +dependencies = [ + "digest", + "rand_core", +] + [[package]] name = "simd-adler32" version = "0.3.7" @@ -1984,9 +2041,9 @@ checksum = "d66dc143e6b11c1eddc06d5c423cfc97062865baf299914ab64caa38182078fe" [[package]] name = "smallvec" -version = "1.11.0" +version = "1.13.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "62bb4feee49fdd9f707ef802e22365a35de4b7b299de4763d44bfea899442ff9" +checksum = "3c5e1a9a646d36c3599cd173a41282daf47c44583ad367b8e6837255952e5c67" [[package]] name = "spin" @@ -2003,6 +2060,16 @@ dependencies = [ "lock_api", ] +[[package]] +name = "spki" +version = "0.7.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d91ed6c858b01f942cd56b37a94b3e0a1798290327d1236e4d9cf4eaca44d29d" +dependencies = [ + "base64ct", + "der", +] + [[package]] name = "stable_deref_trait" version = "1.2.0" @@ -2069,9 +2136,9 @@ dependencies = [ [[package]] name = "syn" -version = "2.0.31" +version = "2.0.60" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "718fa2415bcb8d8bd775917a1bf12a7931b6dfa890753378538118181e0cb398" +checksum = "909518bc7b1c9b779f1bbf07f2929d35af9f0f37e47c6e9ef7f9dddc1e1821f3" dependencies = [ "proc-macro2", "quote", @@ -2097,48 +2164,47 @@ checksum = "55937e1799185b12863d447f42597ed69d9928686b8d88a1df17376a097d8369" [[package]] name = "tempfile" -version = "3.8.0" +version = "3.10.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "cb94d2f3cc536af71caac6b6fcebf65860b347e7ce0cc9ebe8f70d3e521054ef" +checksum = "85b77fafb263dd9d05cbeac119526425676db3784113aa9295c88498cbf8bff1" dependencies = [ "cfg-if", "fastrand", - "redox_syscall 0.3.5", "rustix", "windows-sys", ] [[package]] name = "textwrap" -version = "0.16.0" +version = "0.16.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "222a222a5bfe1bba4a77b45ec488a741b3cb8872e5e499451fd7d0129c9c7c3d" +checksum = "23d434d3f8967a09480fb04132ebe0a3e088c173e6d0ee7897abbdf4eab0f8b9" [[package]] name = "thiserror" -version = "1.0.48" +version = "1.0.59" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9d6d7a740b8a666a7e828dd00da9c0dc290dff53154ea77ac109281de90589b7" +checksum = "f0126ad08bff79f29fc3ae6a55cc72352056dfff61e3ff8bb7129476d44b23aa" dependencies = [ "thiserror-impl", ] [[package]] name = "thiserror-impl" -version = "1.0.48" +version = "1.0.59" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "49922ecae66cc8a249b77e68d1d0623c1b2c514f0060c27cdc68bd62a1219d35" +checksum = "d1cd413b5d558b4c5bf3680e324a6fa5014e7b7c067a51e69dbdf47eb7148b66" dependencies = [ "proc-macro2", "quote", - "syn 2.0.31", + "syn 2.0.60", ] [[package]] name = "tiff" -version = "0.7.4" +version = "0.9.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9f71e422515e83e3ab8a03d4781d05ebf864fc61f4546e6ecffa58cbd34181a0" +checksum = "ba1310fcea54c6a9a4fd1aad794ecc02c31682f6bfbecdf460bf19533eed1e3e" dependencies = [ "flate2", "jpeg-decoder", @@ -2157,11 +2223,10 @@ dependencies = [ [[package]] name = "tracing" -version = "0.1.37" +version = "0.1.40" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8ce8c33a8d48bd45d624a6e523445fd21ec13d3653cd51f681abf67418f54eb8" +checksum = "c3523ab5a71916ccf420eebdf5521fcef02141234bbc0b8a49f2fdc4544364ef" dependencies = [ - "cfg-if", "pin-project-lite", "tracing-attributes", "tracing-core", @@ -2169,20 +2234,20 @@ dependencies = [ [[package]] name = "tracing-attributes" -version = "0.1.26" +version = "0.1.27" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5f4f31f56159e98206da9efd823404b79b6ef3143b4a7ab76e67b1751b25a4ab" +checksum = "34704c8d6ebcbc939824180af020566b01a7c01f80641264eba0999f6c2b6be7" dependencies = [ "proc-macro2", "quote", - "syn 2.0.31", + "syn 2.0.60", ] [[package]] name = "tracing-core" -version = "0.1.31" +version = "0.1.32" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0955b8137a1df6f1a2e9a37d8a6656291ff0297c1a97c24e0d8425fe2312f79a" +checksum = "c06d3da6113f116aaee68e4d601191614c9053067f9ab7f6edbcb161237daa54" dependencies = [ "once_cell", ] @@ -2195,15 +2260,9 @@ checksum = "375812fa44dab6df41c195cd2f7fecb488f6c09fbaafb62807488cefab642bff" [[package]] name = "typenum" -version = "1.16.0" +version = "1.17.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "497961ef93d974e23eb6f433eb5fe1b7930b659f06d12dec6fc44a8f554c0bba" - -[[package]] -name = "ucd-trie" -version = "0.1.6" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ed646292ffc8188ef8ea4d1e0e0150fb15a5c2e12ad9b8fc191ae7a8a7f3c4b9" +checksum = "42ff0bf0c66b8238c6f3b578df37d0b7848e55df8577b3f74f92a69acceeb825" [[package]] name = "uint" @@ -2225,9 +2284,9 @@ checksum = "eaea85b334db583fe3274d12b4cd1880032beab409c0d774be044d4480ab9a94" [[package]] name = "unicode-ident" -version = "1.0.11" +version = "1.0.12" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "301abaae475aa91687eb82514b328ab47a211a533026cb25fc3e519b86adfc3c" +checksum = "3354b9ac3fae1ff6755cb6db53683adb661634f67557942dea4facebec0fee4b" [[package]] name = "universal-hash" @@ -2241,9 +2300,9 @@ dependencies = [ [[package]] name = "uuid" -version = "1.4.1" +version = "1.8.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "79daa5ed5740825c40b389c5e50312b9c86df53fccd33f281df655642b43869d" +checksum = "a183cf7feeba97b4dd1c0d46788634f6221d87fa961b305bed08c851829efcc0" [[package]] name = "version_check" @@ -2262,9 +2321,9 @@ dependencies = [ [[package]] name = "walkdir" -version = "2.4.0" +version = "2.5.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d71d857dc86794ca4c280d616f7da00d2dbfd8cd788846559a6813e6aa4b54ee" +checksum = "29790946404f91d9c5d06f9874efddea1dc06c5efe94541a7d6863108e3a5e4b" dependencies = [ "same-file", "winapi-util", @@ -2278,9 +2337,9 @@ checksum = "9c8d87e72b64a3b4db28d11ce29237c246188f4f51057d65a7eab63b7987e423" [[package]] name = "wasm-bindgen" -version = "0.2.87" +version = "0.2.92" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7706a72ab36d8cb1f80ffbf0e071533974a60d0a308d01a5d0375bf60499a342" +checksum = "4be2531df63900aeb2bca0daaaddec08491ee64ceecbee5076636a3b026795a8" dependencies = [ "cfg-if", "wasm-bindgen-macro", @@ -2288,24 +2347,24 @@ dependencies = [ [[package]] name = "wasm-bindgen-backend" -version = "0.2.87" +version = "0.2.92" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5ef2b6d3c510e9625e5fe6f509ab07d66a760f0885d858736483c32ed7809abd" +checksum = "614d787b966d3989fa7bb98a654e369c762374fd3213d212cfc0251257e747da" dependencies = [ "bumpalo", "log", "once_cell", "proc-macro2", "quote", - "syn 2.0.31", + "syn 2.0.60", "wasm-bindgen-shared", ] [[package]] name = "wasm-bindgen-macro" -version = "0.2.87" +version = "0.2.92" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "dee495e55982a3bd48105a7b947fd2a9b4a8ae3010041b9e0faab3f9cd028f1d" +checksum = "a1f8823de937b71b9460c0c34e25f3da88250760bec0ebac694b49997550d726" dependencies = [ "quote", "wasm-bindgen-macro-support", @@ -2313,28 +2372,28 @@ dependencies = [ [[package]] name = "wasm-bindgen-macro-support" -version = "0.2.87" +version = "0.2.92" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "54681b18a46765f095758388f2d0cf16eb8d4169b639ab575a8f5693af210c7b" +checksum = "e94f17b526d0a461a191c78ea52bbce64071ed5c04c9ffe424dcb38f74171bb7" dependencies = [ "proc-macro2", "quote", - "syn 2.0.31", + "syn 2.0.60", "wasm-bindgen-backend", "wasm-bindgen-shared", ] [[package]] name = "wasm-bindgen-shared" -version = "0.2.87" +version = "0.2.92" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ca6ad05a4870b2bf5fe995117d3728437bd27d7cd5f06f13c17443ef369775a1" +checksum = "af190c94f2773fdb3729c55b007a722abb5384da03bc0986df4c289bf5567e96" [[package]] name = "web-sys" -version = "0.3.64" +version = "0.3.69" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9b85cbef8c220a6abc02aefd892dfc0fc23afb1c6a426316ec33253a3877249b" +checksum = "77afa9a11836342370f4817622a2f0f418b134426d91a82dfb48f532d2ec13ef" dependencies = [ "js-sys", "wasm-bindgen", @@ -2342,9 +2401,9 @@ dependencies = [ [[package]] name = "weezl" -version = "0.1.7" +version = "0.1.8" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9193164d4de03a926d909d3bc7c30543cecb35400c02114792c2cae20d5e2dbb" +checksum = "53a85b86a771b1c87058196170769dd264f66c0782acf1ae6cc51bfd64b39082" [[package]] name = "winapi" @@ -2364,9 +2423,9 @@ checksum = "ac3b87c63620426dd9b991e5ce0329eff545bccbbb34f3be09ff6fb6ab51b7b6" [[package]] name = "winapi-util" -version = "0.1.5" +version = "0.1.6" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "70ec6ce85bb158151cae5e5c87f95a8e97d2c0c4b001223f33a334e3ce5de178" +checksum = "f29e6f9198ba0d26b4c9f07dbe6f9ed633e1f3d5b8b414090084349e46a52596" dependencies = [ "winapi", ] @@ -2378,21 +2437,21 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "712e227841d057c1ee1cd2fb22fa7e5a5461ae8e48fa2ca79ec42cfc1931183f" [[package]] -name = "windows" -version = "0.48.0" +name = "windows-core" +version = "0.52.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e686886bc078bc1b0b600cac0147aadb815089b6e4da64016cbd754b6342700f" +checksum = "33ab640c8d7e35bf8ba19b884ba838ceb4fba93a4e8c65a9059d08afcfc683d9" dependencies = [ - "windows-targets", + "windows-targets 0.52.5", ] [[package]] name = "windows-sys" -version = "0.48.0" +version = "0.52.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "677d2418bec65e3338edb076e806bc1ec15693c5d0104683f2efe857f61056a9" +checksum = "282be5f36a8ce781fad8c8ae18fa3f9beff57ec1b52cb3de0789201425d9a33d" dependencies = [ - "windows-targets", + "windows-targets 0.52.5", ] [[package]] @@ -2401,13 +2460,29 @@ version = "0.48.5" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "9a2fa6e2155d7247be68c096456083145c183cbbbc2764150dda45a87197940c" dependencies = [ - "windows_aarch64_gnullvm", - "windows_aarch64_msvc", - "windows_i686_gnu", - "windows_i686_msvc", - "windows_x86_64_gnu", - "windows_x86_64_gnullvm", - "windows_x86_64_msvc", + "windows_aarch64_gnullvm 0.48.5", + "windows_aarch64_msvc 0.48.5", + "windows_i686_gnu 0.48.5", + "windows_i686_msvc 0.48.5", + "windows_x86_64_gnu 0.48.5", + "windows_x86_64_gnullvm 0.48.5", + "windows_x86_64_msvc 0.48.5", +] + +[[package]] +name = "windows-targets" +version = "0.52.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6f0713a46559409d202e70e28227288446bf7841d3211583a4b53e3f6d96e7eb" +dependencies = [ + "windows_aarch64_gnullvm 0.52.5", + "windows_aarch64_msvc 0.52.5", + "windows_i686_gnu 0.52.5", + "windows_i686_gnullvm", + "windows_i686_msvc 0.52.5", + "windows_x86_64_gnu 0.52.5", + "windows_x86_64_gnullvm 0.52.5", + "windows_x86_64_msvc 0.52.5", ] [[package]] @@ -2416,42 +2491,90 @@ version = "0.48.5" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "2b38e32f0abccf9987a4e3079dfb67dcd799fb61361e53e2882c3cbaf0d905d8" +[[package]] +name = "windows_aarch64_gnullvm" +version = "0.52.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7088eed71e8b8dda258ecc8bac5fb1153c5cffaf2578fc8ff5d61e23578d3263" + [[package]] name = "windows_aarch64_msvc" version = "0.48.5" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "dc35310971f3b2dbbf3f0690a219f40e2d9afcf64f9ab7cc1be722937c26b4bc" +[[package]] +name = "windows_aarch64_msvc" +version = "0.52.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9985fd1504e250c615ca5f281c3f7a6da76213ebd5ccc9561496568a2752afb6" + [[package]] name = "windows_i686_gnu" version = "0.48.5" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "a75915e7def60c94dcef72200b9a8e58e5091744960da64ec734a6c6e9b3743e" +[[package]] +name = "windows_i686_gnu" +version = "0.52.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "88ba073cf16d5372720ec942a8ccbf61626074c6d4dd2e745299726ce8b89670" + +[[package]] +name = "windows_i686_gnullvm" +version = "0.52.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "87f4261229030a858f36b459e748ae97545d6f1ec60e5e0d6a3d32e0dc232ee9" + [[package]] name = "windows_i686_msvc" version = "0.48.5" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "8f55c233f70c4b27f66c523580f78f1004e8b5a8b659e05a4eb49d4166cca406" +[[package]] +name = "windows_i686_msvc" +version = "0.52.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "db3c2bf3d13d5b658be73463284eaf12830ac9a26a90c717b7f771dfe97487bf" + [[package]] name = "windows_x86_64_gnu" version = "0.48.5" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "53d40abd2583d23e4718fddf1ebec84dbff8381c07cae67ff7768bbf19c6718e" +[[package]] +name = "windows_x86_64_gnu" +version = "0.52.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4e4246f76bdeff09eb48875a0fd3e2af6aada79d409d33011886d3e1581517d9" + [[package]] name = "windows_x86_64_gnullvm" version = "0.48.5" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "0b7b52767868a23d5bab768e390dc5f5c55825b6d30b86c844ff2dc7414044cc" +[[package]] +name = "windows_x86_64_gnullvm" +version = "0.52.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "852298e482cd67c356ddd9570386e2862b5673c85bd5f88df9ab6802b334c596" + [[package]] name = "windows_x86_64_msvc" version = "0.48.5" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "ed94fce61571a4006852b7389a063ab983c02eb1bb37b47f8272ce92d06d9538" +[[package]] +name = "windows_x86_64_msvc" +version = "0.52.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "bec47e5bfd1bff0eeaf6d8b485cc1074891a197ab4225d504cb7a1ab88b02bf0" + [[package]] name = "wio" version = "0.2.2" @@ -2485,8 +2608,7 @@ dependencies = [ [[package]] name = "zcash_note_encryption" version = "0.4.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5b4580cd6cee12e44421dac43169be8d23791650816bdb34e6ddfa70ac89c1c5" +source = "git+https://github.com/QED-it/zcash_note_encryption?branch=zsa1#8b6b31dcea4a883a606425c4b644fca213e78b3b" dependencies = [ "chacha20", "chacha20poly1305", @@ -2504,11 +2626,31 @@ dependencies = [ "blake2b_simd", ] +[[package]] +name = "zerocopy" +version = "0.7.32" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "74d4d3961e53fa4c9a25a8637fc2bfaf2595b3d3ae34875568a5cf64787716be" +dependencies = [ + "zerocopy-derive", +] + +[[package]] +name = "zerocopy-derive" +version = "0.7.32" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9ce1b18ccd8e73a9321186f97e46f9f04b778851177567b1975109d26a08d2a6" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.60", +] + [[package]] name = "zeroize" -version = "1.6.0" +version = "1.7.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2a0956f1ba7c7909bfb66c2e9e4124ab6f6482560f6628b5aaeba39207c9aad9" +checksum = "525b4ec142c6b68a2d10f01f7bbf6755599ca3f81ea53b8431b7dd348f5fdb2d" dependencies = [ "zeroize_derive", ] @@ -2521,14 +2663,14 @@ checksum = "ce36e65b0d2999d2aafac989fb249189a141aee1f53c612c1f37d72631959f69" dependencies = [ "proc-macro2", "quote", - "syn 2.0.31", + "syn 2.0.60", ] [[package]] name = "zip32" -version = "0.1.0" +version = "0.1.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d724a63be4dfb50b7f3617e542984e22e4b4a5b8ca5de91f55613152885e6b22" +checksum = "4226d0aee9c9407c27064dfeec9d7b281c917de3374e1e5a2e2cfad9e09de19e" dependencies = [ "blake2b_simd", "memuse", diff --git a/Cargo.toml b/Cargo.toml index 0ea1d289d..378fb872d 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -25,13 +25,14 @@ rustdoc-args = ["--cfg", "docsrs", "--html-in-header", "katex-header.html"] [dependencies] aes = "0.8" bitvec = "1" -blake2b_simd = "1" +blake2b_simd = "=1.0.1" # Last version required rust 1.66 ff = "0.13" fpe = "0.6" group = { version = "0.13", features = ["wnaf-memuse"] } -halo2_gadgets = "0.3" -halo2_proofs = { version = "0.3", default-features = false, features = ["batch", "floor-planner-v1-legacy-pdqsort"] } +halo2_gadgets = { git = "https://github.com/QED-it/halo2", branch = "zsa1" } +halo2_proofs = { git = "https://github.com/QED-it/halo2", branch = "zsa1", default-features = false, features = ["batch", "floor-planner-v1-legacy-pdqsort"] } hex = "0.4" +k256 = { version = "0.13.0", features = ["arithmetic", "schnorr"] } lazy_static = "1" memuse = { version = "0.2.1", features = ["nonempty"] } pasta_curves = "0.5" @@ -41,7 +42,7 @@ reddsa = "0.5" nonempty = "0.7" serde = { version = "1.0", features = ["derive"] } subtle = "2.3" -zcash_note_encryption = "0.4" +zcash_note_encryption_zsa = { package = "zcash_note_encryption", version = "0.4", git = "https://github.com/QED-it/zcash_note_encryption", branch = "zsa1" } incrementalmerkletree = "0.5" zcash_spec = "0.1" zip32 = "0.1" @@ -55,15 +56,18 @@ plotters = { version = "0.3.0", optional = true } [dev-dependencies] bridgetree = "0.4" -criterion = "0.4" # 0.5 depends on clap 4 which has MSRV 1.70 -halo2_gadgets = { version = "0.3", features = ["test-dependencies"] } +criterion = "0.4" #Pinned: 0.5 depends on clap 4 which has MSRV 1.70 +halo2_gadgets = { git = "https://github.com/QED-it/halo2", branch = "zsa1", features = ["test-dependencies"] } hex = "0.4" proptest = "1.0.0" -zcash_note_encryption = { version = "0.4", features = ["pre-zip-212"] } +zcash_note_encryption_zsa = { package = "zcash_note_encryption", version = "0.4", git = "https://github.com/QED-it/zcash_note_encryption", branch = "zsa1", features = ["pre-zip-212"] } incrementalmerkletree = { version = "0.5", features = ["test-dependencies"] } +#ahash = "=0.8.6" #Pinned: 0.8.7 depends on Rust 1.72 +#half = "=2.2.1" #Pinned: 2.3.1 requires Rust 1.70 [target.'cfg(unix)'.dev-dependencies] inferno = { version = "0.11", default-features = false, features = ["multithreaded", "nameattr"] } +#clap = "=4.2.0" #Pinned: Used by inferno. Later version requires Rust 1.70 pprof = { version = "0.11", features = ["criterion", "flamegraph"] } [lib] diff --git a/README.md b/README.md index c2138a11f..8e610ad66 100644 --- a/README.md +++ b/README.md @@ -1,4 +1,5 @@ -# orchard [![Crates.io](https://img.shields.io/crates/v/orchard.svg)](https://crates.io/crates/orchard) # +# orchard [![Crates.io](https://img.shields.io/crates/v/orchard.svg)](https://crates.io/crates/orchard) [![CI checks](https://github.com/QED-it/orchard/actions/workflows/ci.yml/badge.svg?branch=zsa1)](https://github.com/QED-it/orchard/actions/workflows/ci.yml) +# Requires Rust 1.65+. diff --git a/benches/circuit.rs b/benches/circuit.rs index 5d66f1421..080411607 100644 --- a/benches/circuit.rs +++ b/benches/circuit.rs @@ -6,6 +6,7 @@ use criterion::{BenchmarkId, Criterion}; #[cfg(unix)] use pprof::criterion::{Output, PProfProfiler}; +use orchard::note::AssetBase; use orchard::{ builder::{Builder, BundleType}, circuit::{ProvingKey, VerifyingKey}, @@ -25,10 +26,19 @@ fn criterion_benchmark(c: &mut Criterion) { let pk = ProvingKey::build(); let create_bundle = |num_recipients| { - let mut builder = Builder::new(BundleType::DEFAULT, Anchor::from_bytes([0; 32]).unwrap()); + let mut builder = Builder::new( + BundleType::DEFAULT_VANILLA, + Anchor::from_bytes([0; 32]).unwrap(), + ); for _ in 0..num_recipients { builder - .add_output(None, recipient, NoteValue::from_raw(10), None) + .add_output( + None, + recipient, + NoteValue::from_raw(10), + AssetBase::native(), + None, + ) .unwrap(); } let bundle: Bundle<_, i64> = builder.build(rng).unwrap().unwrap().0; diff --git a/benches/note_decryption.rs b/benches/note_decryption.rs index 2cd177e80..577cc20a0 100644 --- a/benches/note_decryption.rs +++ b/benches/note_decryption.rs @@ -3,12 +3,13 @@ use orchard::{ builder::{Builder, BundleType}, circuit::ProvingKey, keys::{FullViewingKey, PreparedIncomingViewingKey, Scope, SpendingKey}, - note_encryption::{CompactAction, OrchardDomain}, + note::AssetBase, + note_encryption_v3::{CompactAction, OrchardDomainV3}, value::NoteValue, Anchor, Bundle, }; use rand::rngs::OsRng; -use zcash_note_encryption::{batch, try_compact_note_decryption, try_note_decryption}; +use zcash_note_encryption_zsa::{batch, try_compact_note_decryption, try_note_decryption}; #[cfg(unix)] use pprof::criterion::{Output, PProfProfiler}; @@ -44,14 +45,29 @@ fn bench_note_decryption(c: &mut Criterion) { .collect(); let bundle = { - let mut builder = Builder::new(BundleType::DEFAULT, Anchor::from_bytes([0; 32]).unwrap()); + let mut builder = Builder::new( + BundleType::DEFAULT_VANILLA, + Anchor::from_bytes([0; 32]).unwrap(), + ); // The builder pads to two actions, and shuffles their order. Add two recipients // so the first action is always decryptable. builder - .add_output(None, recipient, NoteValue::from_raw(10), None) + .add_output( + None, + recipient, + NoteValue::from_raw(10), + AssetBase::native(), + None, + ) .unwrap(); builder - .add_output(None, recipient, NoteValue::from_raw(10), None) + .add_output( + None, + recipient, + NoteValue::from_raw(10), + AssetBase::native(), + None, + ) .unwrap(); let bundle: Bundle<_, i64> = builder.build(rng).unwrap().unwrap().0; bundle @@ -62,7 +78,7 @@ fn bench_note_decryption(c: &mut Criterion) { }; let action = bundle.actions().first(); - let domain = OrchardDomain::for_action(action); + let domain = OrchardDomainV3::for_action(action); let compact = { let mut group = c.benchmark_group("note-decryption"); @@ -103,12 +119,12 @@ fn bench_note_decryption(c: &mut Criterion) { let ivks = 2; let valid_ivks = vec![valid_ivk; ivks]; let actions: Vec<_> = (0..100) - .map(|_| (OrchardDomain::for_action(action), action.clone())) + .map(|_| (OrchardDomainV3::for_action(action), action.clone())) .collect(); let compact: Vec<_> = (0..100) .map(|_| { ( - OrchardDomain::for_action(action), + OrchardDomainV3::for_action(action), CompactAction::from(action), ) }) diff --git a/src/action.rs b/src/action.rs index 04bcc2089..5f3c9f9ac 100644 --- a/src/action.rs +++ b/src/action.rs @@ -127,6 +127,7 @@ pub(crate) mod testing { use proptest::prelude::*; + use crate::note::asset_base::testing::arb_asset_base; use crate::{ note::{ commitment::ExtractedNoteCommitment, nullifier::testing::arb_nullifier, @@ -147,16 +148,18 @@ pub(crate) mod testing { nf in arb_nullifier(), rk in arb_spendauth_verification_key(), note in arb_note(output_value), + asset in arb_asset_base() ) -> Action<()> { let cmx = ExtractedNoteCommitment::from(note.commitment()); let cv_net = ValueCommitment::derive( spend_value - output_value, - ValueCommitTrapdoor::zero() + ValueCommitTrapdoor::zero(), + asset ); // FIXME: make a real one from the note. let encrypted_note = TransmittedNoteCiphertext { epk_bytes: [0u8; 32], - enc_ciphertext: [0u8; 580], + enc_ciphertext: [0u8; 612], out_ciphertext: [0u8; 80] }; Action { @@ -178,17 +181,19 @@ pub(crate) mod testing { note in arb_note(output_value), rng_seed in prop::array::uniform32(prop::num::u8::ANY), fake_sighash in prop::array::uniform32(prop::num::u8::ANY), + asset in arb_asset_base() ) -> Action> { let cmx = ExtractedNoteCommitment::from(note.commitment()); let cv_net = ValueCommitment::derive( spend_value - output_value, - ValueCommitTrapdoor::zero() + ValueCommitTrapdoor::zero(), + asset ); // FIXME: make a real one from the note. let encrypted_note = TransmittedNoteCiphertext { epk_bytes: [0u8; 32], - enc_ciphertext: [0u8; 580], + enc_ciphertext: [0u8; 612], out_ciphertext: [0u8; 80] }; diff --git a/src/builder.rs b/src/builder.rs index 37bdc3883..ff3459012 100644 --- a/src/builder.rs +++ b/src/builder.rs @@ -2,6 +2,7 @@ use core::fmt; use core::iter; +use std::collections::HashMap; use std::fmt::Display; use ff::Field; @@ -12,14 +13,14 @@ use rand::{prelude::SliceRandom, CryptoRng, RngCore}; use crate::{ action::Action, address::Address, - bundle::{Authorization, Authorized, Bundle, Flags}, + bundle::{derive_bvk, Authorization, Authorized, Bundle, Flags}, circuit::{Circuit, Instance, Proof, ProvingKey}, keys::{ FullViewingKey, OutgoingViewingKey, Scope, SpendAuthorizingKey, SpendValidatingKey, SpendingKey, }, - note::{Note, Rho, TransmittedNoteCiphertext}, - note_encryption::OrchardNoteEncryption, + note::{AssetBase, Note, Rho, TransmittedNoteCiphertext}, + note_encryption_v3::OrchardNoteEncryption, primitives::redpallas::{self, Binding, SpendAuth}, tree::{Anchor, MerklePath}, value::{self, NoteValue, OverflowError, ValueCommitTrapdoor, ValueCommitment, ValueSum}, @@ -45,17 +46,23 @@ pub enum BundleType { } impl BundleType { - /// The default bundle type has all flags enabled, and does not require a bundle to be produced - /// if no spends or outputs have been added to the bundle. - pub const DEFAULT: BundleType = BundleType::Transactional { - flags: Flags::ENABLED, + /// The default bundle type has all flags enabled, ZSA disabled, and does not require a bundle + /// to be produced. + pub const DEFAULT_VANILLA: BundleType = BundleType::Transactional { + flags: Flags::ENABLED_WITHOUT_ZSA, + bundle_required: false, + }; + + /// The default bundle with all flags enabled, including ZSA. + pub const DEFAULT_ZSA: BundleType = BundleType::Transactional { + flags: Flags::ENABLED_WITH_ZSA, bundle_required: false, }; /// The DISABLED bundle type does not permit any bundle to be produced, and when used in the /// builder will prevent any spends or outputs from being added. pub const DISABLED: BundleType = BundleType::Transactional { - flags: Flags::from_parts(false, false), + flags: Flags::from_parts(false, false, false), bundle_required: false, }; @@ -204,13 +211,15 @@ impl Display for OutputError { impl std::error::Error for OutputError {} /// Information about a specific note to be spent in an [`Action`]. -#[derive(Debug)] +#[derive(Debug, Clone)] pub struct SpendInfo { pub(crate) dummy_sk: Option, pub(crate) fvk: FullViewingKey, pub(crate) scope: Scope, pub(crate) note: Note, pub(crate) merkle_path: MerklePath, + // a flag to indicate whether the value of the note will be counted in the `ValueSum` of the action. + pub(crate) split_flag: bool, } impl SpendInfo { @@ -223,7 +232,12 @@ impl SpendInfo { /// Returns `None` if the `fvk` does not own the `note`. /// /// [`Builder::add_spend`]: Builder::add_spend - pub fn new(fvk: FullViewingKey, note: Note, merkle_path: MerklePath) -> Option { + pub fn new( + fvk: FullViewingKey, + note: Note, + merkle_path: MerklePath, + split_flag: bool, + ) -> Option { let scope = fvk.scope_for_address(¬e.recipient())?; Some(SpendInfo { dummy_sk: None, @@ -231,14 +245,15 @@ impl SpendInfo { scope, note, merkle_path, + split_flag, }) } /// Defined in [Zcash Protocol Spec § 4.8.3: Dummy Notes (Orchard)][orcharddummynotes]. /// /// [orcharddummynotes]: https://zips.z.cash/protocol/nu5.pdf#orcharddummynotes - fn dummy(rng: &mut impl RngCore) -> Self { - let (sk, fvk, note) = Note::dummy(rng, None); + fn dummy(asset: AssetBase, rng: &mut impl RngCore) -> Self { + let (sk, fvk, note) = Note::dummy(rng, None, asset); let merkle_path = MerklePath::dummy(rng); SpendInfo { @@ -249,6 +264,25 @@ impl SpendInfo { scope: Scope::External, note, merkle_path, + split_flag: false, + } + } + + /// Creates a split spend, which is identical to origin normal spend except that + /// `rseed_split_note` contains a random seed. In addition, the split_flag is raised. + /// + /// Defined in [Transfer and Burn of Zcash Shielded Assets ZIP-0226 § Split Notes (DRAFT PR)][TransferZSA]. + /// + /// [TransferZSA]: https://qed-it.github.io/zips/zip-0226.html#split-notes + fn create_split_spend(&self, rng: &mut impl RngCore) -> Self { + SpendInfo { + dummy_sk: None, + fvk: self.fvk.clone(), + // We use external scope to avoid unnecessary derivations + scope: Scope::External, + note: self.note.create_split_note(rng), + merkle_path: self.merkle_path.clone(), + split_flag: true, } } @@ -264,11 +298,12 @@ impl SpendInfo { } /// Information about a specific output to receive funds in an [`Action`]. -#[derive(Debug)] +#[derive(Debug, Clone)] pub struct OutputInfo { ovk: Option, recipient: Address, value: NoteValue, + asset: AssetBase, memo: [u8; 512], } @@ -278,12 +313,14 @@ impl OutputInfo { ovk: Option, recipient: Address, value: NoteValue, + asset: AssetBase, memo: Option<[u8; 512]>, ) -> Self { Self { ovk, recipient, value, + asset, memo: memo.unwrap_or_else(|| { let mut memo = [0; 512]; memo[0] = 0xf6; @@ -295,11 +332,11 @@ impl OutputInfo { /// Defined in [Zcash Protocol Spec § 4.8.3: Dummy Notes (Orchard)][orcharddummynotes]. /// /// [orcharddummynotes]: https://zips.z.cash/protocol/nu5.pdf#orcharddummynotes - pub fn dummy(rng: &mut impl RngCore) -> Self { + pub fn dummy(rng: &mut impl RngCore, asset: AssetBase) -> Self { let fvk: FullViewingKey = (&SpendingKey::random(rng)).into(); let recipient = fvk.address_at(0u32, Scope::External); - Self::new(None, recipient, NoteValue::zero(), None) + Self::new(None, recipient, NoteValue::zero(), asset, None) } } @@ -321,8 +358,15 @@ impl ActionInfo { } /// Returns the value sum for this action. + /// Split notes do not contribute to the value sum. fn value_sum(&self) -> ValueSum { - self.spend.note.value() - self.output.value + let spent_value = if self.spend.split_flag { + NoteValue::zero() + } else { + self.spend.note.value() + }; + + spent_value - self.output.value } /// Builds the action. @@ -330,9 +374,20 @@ impl ActionInfo { /// Defined in [Zcash Protocol Spec § 4.7.3: Sending Notes (Orchard)][orchardsend]. /// /// [orchardsend]: https://zips.z.cash/protocol/nu5.pdf#orchardsend + /// + /// # Panics + /// + /// Panics if the asset types of the spent and output notes do not match. fn build(self, mut rng: impl RngCore) -> (Action, Circuit) { + assert_eq!( + self.spend.note.asset(), + self.output.asset, + "spend and recipient note types must be equal" + ); + let v_net = self.value_sum(); - let cv_net = ValueCommitment::derive(v_net, self.rcv.clone()); + let asset = self.output.asset; + let cv_net = ValueCommitment::derive(v_net, self.rcv, asset); let nf_old = self.spend.note.nullifier(&self.spend.fvk); let rho = Rho::from_nf_old(nf_old); @@ -340,7 +395,13 @@ impl ActionInfo { let alpha = pallas::Scalar::random(&mut rng); let rk = ak.randomize(&alpha); - let note = Note::new(self.output.recipient, self.output.value, rho, &mut rng); + let note = Note::new( + self.output.recipient, + self.output.value, + self.output.asset, + rho, + &mut rng, + ); let cm_new = note.commitment(); let cmx = cm_new.into(); @@ -348,7 +409,7 @@ impl ActionInfo { let encrypted_note = TransmittedNoteCiphertext { epk_bytes: encryptor.epk().to_bytes().0, - enc_ciphertext: encryptor.encrypt_note_plaintext(), + enc_ciphertext: encryptor.encrypt_note_plaintext().0, out_ciphertext: encryptor.encrypt_outgoing_plaintext(&cv_net, &cmx, &mut rng), }; @@ -430,6 +491,7 @@ impl BundleMetadata { pub struct Builder { spends: Vec, outputs: Vec, + burn: HashMap, bundle_type: BundleType, anchor: Anchor, } @@ -440,6 +502,7 @@ impl Builder { Builder { spends: vec![], outputs: vec![], + burn: HashMap::new(), bundle_type, anchor, } @@ -448,14 +511,14 @@ impl Builder { /// Adds a note to be spent in this transaction. /// /// - `note` is a spendable note, obtained by trial-decrypting an [`Action`] using the - /// [`zcash_note_encryption`] crate instantiated with [`OrchardDomain`]. + /// [`zcash_note_encryption_zsa`] crate instantiated with [`OrchardDomain`]. /// - `merkle_path` can be obtained using the [`incrementalmerkletree`] crate /// instantiated with [`MerkleHashOrchard`]. /// /// Returns an error if the given Merkle path does not have the required anchor for /// the given note. /// - /// [`OrchardDomain`]: crate::note_encryption::OrchardDomain + /// [`OrchardDomain`]: crate::note_encryption_v3::OrchardDomainV3 /// [`MerkleHashOrchard`]: crate::tree::MerkleHashOrchard pub fn add_spend( &mut self, @@ -468,7 +531,7 @@ impl Builder { return Err(SpendError::SpendsDisabled); } - let spend = SpendInfo::new(fvk, note, merkle_path).ok_or(SpendError::FvkMismatch)?; + let spend = SpendInfo::new(fvk, note, merkle_path, false).ok_or(SpendError::FvkMismatch)?; // Consistency check: all anchors must be equal. if !spend.has_matching_anchor(&self.anchor) { @@ -486,6 +549,7 @@ impl Builder { ovk: Option, recipient: Address, value: NoteValue, + asset: AssetBase, memo: Option<[u8; 512]>, ) -> Result<(), OutputError> { let flags = self.bundle_type.flags(); @@ -494,11 +558,27 @@ impl Builder { } self.outputs - .push(OutputInfo::new(ovk, recipient, value, memo)); + .push(OutputInfo::new(ovk, recipient, value, asset, memo)); Ok(()) } + /// Add an instruction to burn a given amount of a specific asset. + pub fn add_burn(&mut self, asset: AssetBase, value: NoteValue) -> Result<(), &'static str> { + if asset.is_native().into() { + return Err("Burning is only possible for non-native assets"); + } + + if value.inner() == 0 { + return Err("Burning is not possible for zero values"); + } + + let cur = *self.burn.get(&asset).unwrap_or(&ValueSum::zero()); + let sum = (cur + value).ok_or("Orchard ValueSum operation overflowed")?; + self.burn.insert(asset, sum); + Ok(()) + } + /// Returns the action spend components that will be produced by the /// transaction being constructed pub fn spends(&self) -> &Vec> { @@ -550,10 +630,72 @@ impl Builder { self.bundle_type, self.spends, self.outputs, + self.burn, ) } } +/// The index of the attached spend or output in the bundle. +/// None indicates a dummy note. +/// The index is used to track the position of the note in the bundle. +type MetadataIdx = Option; + +/// Partition a list of spends and recipients by note types. +/// Method creates single dummy ZEC note if spends and recipients are both empty. +#[allow(clippy::type_complexity)] +fn partition_by_asset( + spends: &[SpendInfo], + outputs: &[OutputInfo], + rng: &mut impl RngCore, +) -> HashMap< + AssetBase, + ( + Vec<(SpendInfo, MetadataIdx)>, + Vec<(OutputInfo, MetadataIdx)>, + ), +> { + let mut hm = HashMap::new(); + + for (i, s) in spends.iter().enumerate() { + hm.entry(s.note.asset()) + .or_insert((vec![], vec![])) + .0 + .push((s.clone(), Some(i))); + } + + for (i, o) in outputs.iter().enumerate() { + hm.entry(o.asset) + .or_insert((vec![], vec![])) + .1 + .push((o.clone(), Some(i))); + } + + if hm.is_empty() { + let dummy_spend = pad_spend(None, AssetBase::native(), rng); + // dummy_spend should not be included in the indexing and marked as None. + hm.insert( + dummy_spend.note.asset(), + (vec![(dummy_spend, None)], vec![]), + ); + } + + hm +} + +/// Returns the appropriate SpendInfo for padding. +fn pad_spend(spend: Option<&SpendInfo>, asset: AssetBase, mut rng: impl RngCore) -> SpendInfo { + if asset.is_native().into() { + // For native asset, extends with dummy notes + SpendInfo::dummy(asset, &mut rng) + } else { + // For ZSA asset, extends with + // - dummy note if SpendInfo is None + // - split notes otherwise. + let dummy = SpendInfo::dummy(asset, &mut rng); + spend.map_or_else(|| dummy, |s| s.create_split_spend(&mut rng)) + } +} + /// Builds a bundle containing the given spent notes and outputs. /// /// The returned bundle will have no proof or signatures; these can be applied with @@ -564,6 +706,7 @@ pub fn bundle>( bundle_type: BundleType, spends: Vec, outputs: Vec, + burn: HashMap, ) -> Result, BundleMetadata)>, BuildError> { let flags = bundle_type.flags(); @@ -583,45 +726,71 @@ pub fn bundle>( return Err(BuildError::OutputsDisabled); } - let num_actions = bundle_type - .num_actions(num_requested_spends, num_requested_outputs) - .map_err(|_| BuildError::BundleTypeNotSatisfiable)?; - // Pair up the spends and outputs, extending with dummy values as necessary. let (pre_actions, bundle_meta) = { - let mut indexed_spends = spends - .into_iter() - .chain(iter::repeat_with(|| SpendInfo::dummy(&mut rng))) - .enumerate() - .take(num_actions) - .collect::>(); - - let mut indexed_outputs = outputs - .into_iter() - .chain(iter::repeat_with(|| OutputInfo::dummy(&mut rng))) - .enumerate() - .take(num_actions) - .collect::>(); + // Use Vec::with_capacity().extend(...) instead of .collect() to avoid reallocations, + // as we can estimate the vector size beforehand. + let mut indexed_spends_outputs = + Vec::with_capacity(spends.len().max(outputs.len()).max(MIN_ACTIONS)); + + indexed_spends_outputs.extend( + partition_by_asset(&spends, &outputs, &mut rng) + .into_iter() + .flat_map(|(asset, (spends, outputs))| { + let num_asset_pre_actions = spends.len().max(outputs.len()); + + let first_spend = spends.first().map(|(s, _)| s.clone()); + + let mut indexed_spends = spends + .into_iter() + .chain(iter::repeat_with(|| { + (pad_spend(first_spend.as_ref(), asset, &mut rng), None) + })) + .take(num_asset_pre_actions) + .collect::>(); + + let mut indexed_outputs = outputs + .into_iter() + .chain(iter::repeat_with(|| { + (OutputInfo::dummy(&mut rng, asset), None) + })) + .take(num_asset_pre_actions) + .collect::>(); + + // Shuffle the spends and outputs, so that learning the position of a + // specific spent note or output note doesn't reveal anything on its own about + // the meaning of that note in the transaction context. + indexed_spends.shuffle(&mut rng); + indexed_outputs.shuffle(&mut rng); + + assert_eq!(indexed_spends.len(), indexed_outputs.len()); + + indexed_spends.into_iter().zip(indexed_outputs) + }), + ); - // Shuffle the spends and outputs, so that learning the position of a - // specific spent note or output note doesn't reveal anything on its own about - // the meaning of that note in the transaction context. - indexed_spends.shuffle(&mut rng); - indexed_outputs.shuffle(&mut rng); + indexed_spends_outputs.extend( + iter::repeat_with(|| { + ( + (pad_spend(None, AssetBase::native(), &mut rng), None), + (OutputInfo::dummy(&mut rng, AssetBase::native()), None), + ) + }) + .take(MIN_ACTIONS.saturating_sub(indexed_spends_outputs.len())), + ); let mut bundle_meta = BundleMetadata::new(num_requested_spends, num_requested_outputs); - let pre_actions = indexed_spends + let pre_actions = indexed_spends_outputs .into_iter() - .zip(indexed_outputs.into_iter()) .enumerate() - .map(|(action_idx, ((spend_idx, spend), (out_idx, output)))| { + .map(|(action_idx, ((spend, spend_idx), (output, out_idx)))| { // Record the post-randomization spend location - if spend_idx < num_requested_spends { + if let Some(spend_idx) = spend_idx { bundle_meta.spend_indices[spend_idx] = action_idx; } // Record the post-randomization output location - if out_idx < num_requested_outputs { + if let Some(out_idx) = out_idx { bundle_meta.output_indices[out_idx] = action_idx; } @@ -633,16 +802,17 @@ pub fn bundle>( }; // Determine the value balance for this bundle, ensuring it is valid. - let value_balance = pre_actions + let native_value_balance: i64 = pre_actions .iter() + .filter(|action| action.spend.note.asset().is_native().into()) .fold(Some(ValueSum::zero()), |acc, action| { acc? + action.value_sum() }) - .ok_or(OverflowError)?; + .ok_or(OverflowError)? + .into()?; - let result_value_balance: V = i64::try_from(value_balance) - .map_err(BuildError::ValueSum) - .and_then(|i| V::try_from(i).map_err(|_| BuildError::ValueSum(value::OverflowError)))?; + let result_value_balance = V::try_from(native_value_balance) + .map_err(|_| BuildError::ValueSum(value::OverflowError))?; // Compute the transaction binding signing key. let bsk = pre_actions @@ -656,17 +826,26 @@ pub fn bundle>( pre_actions.into_iter().map(|a| a.build(&mut rng)).unzip(); // Verify that bsk and bvk are consistent. - let bvk = (actions.iter().map(|a| a.cv_net()).sum::() - - ValueCommitment::derive(value_balance, ValueCommitTrapdoor::zero())) - .into_bvk(); + let bvk = derive_bvk( + &actions, + native_value_balance, + burn.iter() + .flat_map(|(asset, value)| -> Result<_, BuildError> { Ok((*asset, (*value).into()?)) }), + ); assert_eq!(redpallas::VerificationKey::from(&bsk), bvk); + let burn = burn + .into_iter() + .map(|(asset, value)| Ok((asset, value.into()?))) + .collect::, BuildError>>()?; + Ok(NonEmpty::from_vec(actions).map(|actions| { ( Bundle::from_parts( actions, flags, result_value_balance, + burn, anchor, InProgress { proof: Unproven { circuits }, @@ -978,6 +1157,7 @@ pub mod testing { use proptest::collection::vec; use proptest::prelude::*; + use crate::note::AssetBase; use crate::{ address::testing::arb_address, bundle::{Authorized, Bundle}, @@ -1005,25 +1185,25 @@ pub mod testing { sk: SpendingKey, anchor: Anchor, notes: Vec<(Note, MerklePath)>, - output_amounts: Vec<(Address, NoteValue)>, + output_amounts: Vec<(Address, NoteValue, AssetBase)>, } impl ArbitraryBundleInputs { /// Create a bundle from the set of arbitrary bundle inputs. - fn into_bundle>(mut self) -> Bundle { + fn into_bundle + Copy + Into>(mut self) -> Bundle { let fvk = FullViewingKey::from(&self.sk); - let mut builder = Builder::new(BundleType::DEFAULT, self.anchor); + let mut builder = Builder::new(BundleType::DEFAULT_ZSA, self.anchor); for (note, path) in self.notes.into_iter() { builder.add_spend(fvk.clone(), note, path).unwrap(); } - for (addr, value) in self.output_amounts.into_iter() { + for (addr, value, asset) in self.output_amounts.into_iter() { let scope = fvk.scope_for_address(&addr).unwrap(); let ovk = fvk.to_ovk(scope); builder - .add_output(Some(ovk.clone()), addr, value, None) + .add_output(Some(ovk.clone()), addr, value, asset, None) .unwrap(); } @@ -1059,9 +1239,11 @@ pub mod testing { output_amounts in vec( arb_address().prop_flat_map(move |a| { arb_positive_note_value(MAX_NOTE_VALUE / n_outputs as u64) - .prop_map(move |v| (a, v)) + .prop_map(move |v| { + (a,v, AssetBase::native()) + }) }), - n_outputs as usize + n_outputs as usize, ), rng_seed in prop::array::uniform32(prop::num::u8::ANY) ) -> ArbitraryBundleInputs { @@ -1092,14 +1274,15 @@ pub mod testing { } /// Produce an arbitrary valid Orchard bundle using a random spending key. - pub fn arb_bundle + Debug>() -> impl Strategy> { + pub fn arb_bundle + Debug + Copy + Into>( + ) -> impl Strategy> { arb_spending_key() .prop_flat_map(arb_bundle_inputs) .prop_map(|inputs| inputs.into_bundle::()) } /// Produce an arbitrary valid Orchard bundle using a specified spending key. - pub fn arb_bundle_with_key + Debug>( + pub fn arb_bundle_with_key + Debug + Copy + Into>( k: SpendingKey, ) -> impl Strategy> { arb_bundle_inputs(k).prop_map(|inputs| inputs.into_bundle::()) @@ -1111,6 +1294,7 @@ mod tests { use rand::rngs::OsRng; use super::Builder; + use crate::note::AssetBase; use crate::{ builder::BundleType, bundle::{Authorized, Bundle}, @@ -1131,12 +1315,18 @@ mod tests { let recipient = fvk.address_at(0u32, Scope::External); let mut builder = Builder::new( - BundleType::DEFAULT, + BundleType::DEFAULT_VANILLA, EMPTY_ROOTS[MERKLE_DEPTH_ORCHARD].into(), ); builder - .add_output(None, recipient, NoteValue::from_raw(5000), None) + .add_output( + None, + recipient, + NoteValue::from_raw(5000), + AssetBase::native(), + None, + ) .unwrap(); let balance: i64 = builder.value_balance().unwrap(); assert_eq!(balance, -5000); diff --git a/src/bundle.rs b/src/bundle.rs index 02cd697eb..385e5fec1 100644 --- a/src/bundle.rs +++ b/src/bundle.rs @@ -1,6 +1,7 @@ //! Structs related to bundles of Orchard actions. mod batch; +pub mod burn_validation; pub mod commitments; pub use batch::BatchValidator; @@ -10,8 +11,9 @@ use core::fmt; use blake2b_simd::Hash as Blake2bHash; use memuse::DynamicUsage; use nonempty::NonEmpty; -use zcash_note_encryption::{try_note_decryption, try_output_recovery_with_ovk}; +use zcash_note_encryption_zsa::{try_note_decryption, try_output_recovery_with_ovk}; +use crate::note::AssetBase; use crate::{ action::Action, address::Address, @@ -19,7 +21,7 @@ use crate::{ circuit::{Instance, Proof, VerifyingKey}, keys::{IncomingViewingKey, OutgoingViewingKey, PreparedIncomingViewingKey}, note::Note, - note_encryption::OrchardDomain, + note_encryption_v3::OrchardDomainV3, primitives::redpallas::{self, Binding, SpendAuth}, tree::Anchor, value::{ValueCommitTrapdoor, ValueCommitment, ValueSum}, @@ -37,6 +39,7 @@ impl Action { cmx: *self.cmx(), enable_spend: flags.spends_enabled, enable_output: flags.outputs_enabled, + enable_zsa: flags.zsa_enabled, } } } @@ -56,37 +59,58 @@ pub struct Flags { /// guaranteed to be dummy notes. If `true`, the created notes may be either real or /// dummy notes. outputs_enabled: bool, + /// Flag denoting whether ZSA transaction is enabled. + /// + /// If `false`, all notes within [`Action`]s in the transaction's [`Bundle`] are + /// guaranteed to be notes with native asset. + zsa_enabled: bool, } const FLAG_SPENDS_ENABLED: u8 = 0b0000_0001; const FLAG_OUTPUTS_ENABLED: u8 = 0b0000_0010; -const FLAGS_EXPECTED_UNSET: u8 = !(FLAG_SPENDS_ENABLED | FLAG_OUTPUTS_ENABLED); +const FLAG_ZSA_ENABLED: u8 = 0b0000_0100; +const FLAGS_EXPECTED_UNSET: u8 = !(FLAG_SPENDS_ENABLED | FLAG_OUTPUTS_ENABLED | FLAG_ZSA_ENABLED); impl Flags { /// Construct a set of flags from its constituent parts - pub(crate) const fn from_parts(spends_enabled: bool, outputs_enabled: bool) -> Self { + pub(crate) const fn from_parts( + spends_enabled: bool, + outputs_enabled: bool, + zsa_enabled: bool, + ) -> Self { Flags { spends_enabled, outputs_enabled, + zsa_enabled, } } - /// The flag set with both spends and outputs enabled. - pub const ENABLED: Flags = Flags { + /// The flag set with both spends and outputs enabled and ZSA disabled. + pub const ENABLED_WITHOUT_ZSA: Flags = Flags { + spends_enabled: true, + outputs_enabled: true, + zsa_enabled: false, + }; + + /// The flags set with spends, outputs and ZSA enabled. + pub const ENABLED_WITH_ZSA: Flags = Flags { spends_enabled: true, outputs_enabled: true, + zsa_enabled: true, }; /// The flag set with spends disabled. pub const SPENDS_DISABLED: Flags = Flags { spends_enabled: false, outputs_enabled: true, + zsa_enabled: false, }; /// The flag set with outputs disabled. pub const OUTPUTS_DISABLED: Flags = Flags { spends_enabled: true, outputs_enabled: false, + zsa_enabled: false, }; /// Flag denoting whether Orchard spends are enabled in the transaction. @@ -107,6 +131,14 @@ impl Flags { self.outputs_enabled } + /// Flag denoting whether ZSA transaction is enabled. + /// + /// If `false`, all notes within [`Action`]s in the transaction's [`Bundle`] are + /// guaranteed to be notes with native asset. + pub fn zsa_enabled(&self) -> bool { + self.zsa_enabled + } + /// Serialize flags to a byte as defined in [Zcash Protocol Spec § 7.1: Transaction /// Encoding And Consensus][txencoding]. /// @@ -119,6 +151,9 @@ impl Flags { if self.outputs_enabled { value |= FLAG_OUTPUTS_ENABLED; } + if self.zsa_enabled { + value |= FLAG_ZSA_ENABLED; + } value } @@ -134,6 +169,7 @@ impl Flags { Some(Self { spends_enabled: value & FLAG_SPENDS_ENABLED != 0, outputs_enabled: value & FLAG_OUTPUTS_ENABLED != 0, + zsa_enabled: value & FLAG_ZSA_ENABLED != 0, }) } else { None @@ -158,6 +194,8 @@ pub struct Bundle { /// /// This is the sum of Orchard spends minus the sum of Orchard outputs. value_balance: V, + /// Assets intended for burning + burn: Vec<(AssetBase, V)>, /// The root of the Orchard commitment tree that this bundle commits to. anchor: Anchor, /// The authorization for this bundle. @@ -190,6 +228,7 @@ impl Bundle { actions: NonEmpty>, flags: Flags, value_balance: V, + burn: Vec<(AssetBase, V)>, anchor: Anchor, authorization: T, ) -> Self { @@ -197,6 +236,7 @@ impl Bundle { actions, flags, value_balance, + burn, anchor, authorization, } @@ -219,6 +259,11 @@ impl Bundle { &self.value_balance } + /// Returns assets intended for burning + pub fn burn(&self) -> &Vec<(AssetBase, V)> { + &self.burn + } + /// Returns the root of the Orchard commitment tree that this bundle commits to. pub fn anchor(&self) -> &Anchor { &self.anchor @@ -232,8 +277,8 @@ impl Bundle { } /// Construct a new bundle by applying a transformation that might fail - /// to the value balance. - pub fn try_map_value_balance Result>( + /// to the value balance and balances of assets to burn. + pub fn try_map_value_balance Result>( self, f: F, ) -> Result, E> { @@ -241,6 +286,11 @@ impl Bundle { actions: self.actions, flags: self.flags, value_balance: f(self.value_balance)?, + burn: self + .burn + .into_iter() + .map(|(asset, value)| Ok((asset, f(value)?))) + .collect::, E>>()?, anchor: self.anchor, authorization: self.authorization, }) @@ -262,6 +312,7 @@ impl Bundle { value_balance: self.value_balance, anchor: self.anchor, authorization: step(context, authorization), + burn: self.burn, } } @@ -285,6 +336,7 @@ impl Bundle { value_balance: self.value_balance, anchor: self.anchor, authorization: step(context, authorization)?, + burn: self.burn, }) } @@ -311,7 +363,7 @@ impl Bundle { .iter() .enumerate() .filter_map(|(idx, action)| { - let domain = OrchardDomain::for_action(action); + let domain = OrchardDomainV3::for_action(action); prepared_keys.iter().find_map(|(ivk, prepared_ivk)| { try_note_decryption(&domain, prepared_ivk, action) .map(|(n, a, m)| (idx, (*ivk).clone(), n, a, m)) @@ -330,7 +382,7 @@ impl Bundle { ) -> Option<(Note, Address, [u8; 512])> { let prepared_ivk = PreparedIncomingViewingKey::new(key); self.actions.get(action_idx).and_then(move |action| { - let domain = OrchardDomain::for_action(action); + let domain = OrchardDomainV3::for_action(action); try_note_decryption(&domain, &prepared_ivk, action) }) } @@ -347,7 +399,7 @@ impl Bundle { .iter() .enumerate() .filter_map(|(idx, action)| { - let domain = OrchardDomain::for_action(action); + let domain = OrchardDomainV3::for_action(action); keys.iter().find_map(move |key| { try_output_recovery_with_ovk( &domain, @@ -371,7 +423,7 @@ impl Bundle { key: &OutgoingViewingKey, ) -> Option<(Note, Address, [u8; 512])> { self.actions.get(action_idx).and_then(move |action| { - let domain = OrchardDomain::for_action(action); + let domain = OrchardDomainV3::for_action(action); try_output_recovery_with_ovk( &domain, key, @@ -383,6 +435,33 @@ impl Bundle { } } +pub(crate) fn derive_bvk<'a, A: 'a, V: Clone + Into>( + actions: impl IntoIterator>, + value_balance: V, + burn: impl Iterator, +) -> redpallas::VerificationKey { + // https://p.z.cash/TCR:bad-txns-orchard-binding-signature-invalid?partial + (actions + .into_iter() + .map(|a| a.cv_net()) + .sum::() + - ValueCommitment::derive( + ValueSum::from_raw(value_balance.into()), + ValueCommitTrapdoor::zero(), + AssetBase::native(), + ) + - burn + .map(|(asset, value)| { + ValueCommitment::derive( + ValueSum::from_raw(value.into()), + ValueCommitTrapdoor::zero(), + asset, + ) + }) + .sum::()) + .into_bvk() +} + impl> Bundle { /// Computes a commitment to the effects of this bundle, suitable for inclusion within /// a transaction ID. @@ -395,17 +474,7 @@ impl> Bundle { /// This can be used to validate the [`Authorized::binding_signature`] returned from /// [`Bundle::authorization`]. pub fn binding_validating_key(&self) -> redpallas::VerificationKey { - // https://p.z.cash/TCR:bad-txns-orchard-binding-signature-invalid?partial - (self - .actions - .iter() - .map(|a| a.cv_net()) - .sum::() - - ValueCommitment::derive( - ValueSum::from_raw(self.value_balance.into()), - ValueCommitTrapdoor::zero(), - )) - .into_bvk() + derive_bvk(&self.actions, self.value_balance, self.burn.iter().cloned()) } } @@ -522,6 +591,9 @@ pub mod testing { use super::{Action, Authorization, Authorized, Bundle, Flags}; pub use crate::action::testing::{arb_action, arb_unauthorized_action}; + use crate::note::asset_base::testing::arb_zsa_asset_base; + use crate::note::AssetBase; + use crate::value::testing::arb_value_sum; /// Marker for an unauthorized bundle with no proofs or signatures. #[derive(Debug)] @@ -581,10 +653,21 @@ pub mod testing { }) } + prop_compose! { + /// Create an arbitrary vector of assets to burn. + pub fn arb_asset_to_burn() + ( + asset_base in arb_zsa_asset_base(), + value in arb_value_sum() + ) -> (AssetBase, ValueSum) { + (asset_base, value) + } + } + prop_compose! { /// Create an arbitrary set of flags. - pub fn arb_flags()(spends_enabled in prop::bool::ANY, outputs_enabled in prop::bool::ANY) -> Flags { - Flags::from_parts(spends_enabled, outputs_enabled) + pub fn arb_flags()(spends_enabled in prop::bool::ANY, outputs_enabled in prop::bool::ANY, zsa_enabled in prop::bool::ANY) -> Flags { + Flags::from_parts(spends_enabled, outputs_enabled, zsa_enabled) } } @@ -608,7 +691,8 @@ pub mod testing { ( acts in vec(arb_unauthorized_action_n(n_actions, flags), n_actions), anchor in arb_base().prop_map(Anchor::from), - flags in Just(flags) + flags in Just(flags), + burn in vec(arb_asset_to_burn(), 1usize..10) ) -> Bundle { let (balances, actions): (Vec, Vec>) = acts.into_iter().unzip(); @@ -616,8 +700,9 @@ pub mod testing { NonEmpty::from_vec(actions).unwrap(), flags, balances.into_iter().sum::>().unwrap(), + burn, anchor, - Unauthorized + Unauthorized, ) } } @@ -637,7 +722,8 @@ pub mod testing { rng_seed in prop::array::uniform32(prop::num::u8::ANY), fake_proof in vec(prop::num::u8::ANY, 1973), fake_sighash in prop::array::uniform32(prop::num::u8::ANY), - flags in Just(flags) + flags in Just(flags), + burn in vec(arb_asset_to_burn(), 1usize..10) ) -> Bundle { let (balances, actions): (Vec, Vec>) = acts.into_iter().unzip(); let rng = StdRng::from_seed(rng_seed); @@ -646,11 +732,12 @@ pub mod testing { NonEmpty::from_vec(actions).unwrap(), flags, balances.into_iter().sum::>().unwrap(), + burn, anchor, Authorized { proof: Proof::new(fake_proof), binding_signature: sk.sign(rng, &fake_sighash), - } + }, ) } } diff --git a/src/bundle/burn_validation.rs b/src/bundle/burn_validation.rs new file mode 100644 index 000000000..d8ef0ce81 --- /dev/null +++ b/src/bundle/burn_validation.rs @@ -0,0 +1,145 @@ +//! Validating burn operations on asset bundles. +//! +//! The module provides a function `validate_bundle_burn` that can be used to validate the burn values for the bundle. +//! +use std::fmt; + +use crate::note::AssetBase; + +/// Possible errors that can occur during bundle burn validation. +#[derive(Debug)] +#[cfg_attr(test, derive(PartialEq, Eq))] +pub enum BurnError { + /// Encountered a duplicate asset to burn. + DuplicateAsset, + /// Cannot burn a native asset. + NativeAsset, + /// Cannot burn an asset with a non-positive value. + NonPositiveAmount, +} + +/// Validates burn for a bundle by ensuring each asset is unique, non-native, and has a positive value. +/// +/// Each burn element is represented as a tuple of `AssetBase` and `i64` (value for the burn). +/// +/// # Arguments +/// +/// * `burn` - A vector of assets, where each asset is represented as a tuple of `AssetBase` and `i64` (value the burn). +/// +/// # Errors +/// +/// Returns a `BurnError` if: +/// * Any asset in the `burn` vector is not unique (`BurnError::DuplicateAsset`). +/// * Any asset in the `burn` vector is native (`BurnError::NativeAsset`). +/// * Any asset in the `burn` vector has a non-positive value (`BurnError::NonPositiveAmount`). +pub fn validate_bundle_burn(bundle_burn: &Vec<(AssetBase, i64)>) -> Result<(), BurnError> { + let mut asset_set = std::collections::HashSet::<&AssetBase>::new(); + + for (asset, value) in bundle_burn { + if !asset_set.insert(asset) { + return Err(BurnError::DuplicateAsset); + } + if asset.is_native().into() { + return Err(BurnError::NativeAsset); + } + if *value <= 0 { + return Err(BurnError::NonPositiveAmount); + } + } + + Ok(()) +} + +impl fmt::Display for BurnError { + fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result { + match *self { + BurnError::DuplicateAsset => write!(f, "Encountered a duplicate asset to burn."), + BurnError::NativeAsset => write!(f, "Cannot burn a native asset."), + BurnError::NonPositiveAmount => { + write!(f, "Cannot burn an asset with a non-positive value.") + } + } + } +} + +#[cfg(test)] +mod tests { + use super::*; + + /// Creates an item of bundle burn list for a given asset description and value. + /// + /// This function is deterministic and guarantees that each call with the same parameters + /// will return the same result. It achieves determinism by using a static `IssuanceAuthorizingKey`. + /// + /// # Arguments + /// + /// * `asset_desc` - The asset description string. + /// * `value` - The value for the burn. + /// + /// # Returns + /// + /// A tuple `(AssetBase, Amount)` representing the burn list item. + /// + pub fn get_burn_tuple(asset_desc: &str, value: i64) -> (AssetBase, i64) { + use crate::keys::{IssuanceAuthorizingKey, IssuanceValidatingKey}; + + let isk = IssuanceAuthorizingKey::from_bytes([1u8; 32]).unwrap(); + + ( + AssetBase::derive(&IssuanceValidatingKey::from(&isk), asset_desc), + value, + ) + } + + #[test] + fn validate_bundle_burn_success() { + let bundle_burn = vec![ + get_burn_tuple("Asset 1", 10), + get_burn_tuple("Asset 2", 20), + get_burn_tuple("Asset 3", 10), + ]; + + let result = validate_bundle_burn(&bundle_burn); + + assert!(result.is_ok()); + } + + #[test] + fn validate_bundle_burn_duplicate_asset() { + let bundle_burn = vec![ + get_burn_tuple("Asset 1", 10), + get_burn_tuple("Asset 1", 20), + get_burn_tuple("Asset 3", 10), + ]; + + let result = validate_bundle_burn(&bundle_burn); + + assert_eq!(result, Err(BurnError::DuplicateAsset)); + } + + #[test] + fn validate_bundle_burn_native_asset() { + let bundle_burn = vec![ + get_burn_tuple("Asset 1", 10), + (AssetBase::native(), 20), + get_burn_tuple("Asset 3", 10), + ]; + + let result = validate_bundle_burn(&bundle_burn); + + assert_eq!(result, Err(BurnError::NativeAsset)); + } + + #[test] + fn validate_bundle_burn_zero_value() { + let bundle_burn = vec![ + get_burn_tuple("Asset 1", 10), + get_burn_tuple("Asset 2", 0), + get_burn_tuple("Asset 3", 10), + ]; + + let result = validate_bundle_burn(&bundle_burn); + + assert_eq!(result, Err(BurnError::NonPositiveAmount)); + } +} diff --git a/src/bundle/commitments.rs b/src/bundle/commitments.rs index ef440a272..f67b6b75a 100644 --- a/src/bundle/commitments.rs +++ b/src/bundle/commitments.rs @@ -3,12 +3,17 @@ use blake2b_simd::{Hash as Blake2bHash, Params, State}; use crate::bundle::{Authorization, Authorized, Bundle}; +use crate::issuance::{IssueAuth, IssueBundle, Signed}; const ZCASH_ORCHARD_HASH_PERSONALIZATION: &[u8; 16] = b"ZTxIdOrchardHash"; const ZCASH_ORCHARD_ACTIONS_COMPACT_HASH_PERSONALIZATION: &[u8; 16] = b"ZTxIdOrcActCHash"; const ZCASH_ORCHARD_ACTIONS_MEMOS_HASH_PERSONALIZATION: &[u8; 16] = b"ZTxIdOrcActMHash"; const ZCASH_ORCHARD_ACTIONS_NONCOMPACT_HASH_PERSONALIZATION: &[u8; 16] = b"ZTxIdOrcActNHash"; const ZCASH_ORCHARD_SIGS_HASH_PERSONALIZATION: &[u8; 16] = b"ZTxAuthOrchaHash"; +const ZCASH_ORCHARD_ZSA_ISSUE_PERSONALIZATION: &[u8; 16] = b"ZTxIdSAIssueHash"; +const ZCASH_ORCHARD_ZSA_ISSUE_ACTION_PERSONALIZATION: &[u8; 16] = b"ZTxIdIssuActHash"; +const ZCASH_ORCHARD_ZSA_ISSUE_NOTE_PERSONALIZATION: &[u8; 16] = b"ZTxIdIAcNoteHash"; +const ZCASH_ORCHARD_ZSA_ISSUE_SIG_PERSONALIZATION: &[u8; 16] = b"ZTxAuthZSAOrHash"; fn hasher(personal: &[u8; 16]) -> State { Params::new().hash_length(32).personal(personal).to_state() @@ -39,13 +44,13 @@ pub(crate) fn hash_bundle_txid_data>( ch.update(&action.nullifier().to_bytes()); ch.update(&action.cmx().to_bytes()); ch.update(&action.encrypted_note().epk_bytes); - ch.update(&action.encrypted_note().enc_ciphertext[..52]); + ch.update(&action.encrypted_note().enc_ciphertext[..84]); // TODO: make sure it is backward compatible with Orchard [..52] - mh.update(&action.encrypted_note().enc_ciphertext[52..564]); + mh.update(&action.encrypted_note().enc_ciphertext[84..596]); nh.update(&action.cv_net().to_bytes()); nh.update(&<[u8; 32]>::from(action.rk())); - nh.update(&action.encrypted_note().enc_ciphertext[564..]); + nh.update(&action.encrypted_note().enc_ciphertext[596..]); nh.update(&action.encrypted_note().out_ciphertext); } @@ -90,3 +95,50 @@ pub(crate) fn hash_bundle_auth_data(bundle: &Bundle) -> Blake2 pub fn hash_bundle_auth_empty() -> Blake2bHash { hasher(ZCASH_ORCHARD_SIGS_HASH_PERSONALIZATION).finalize() } + +/// Construct the commitment for an absent issue bundle as defined in +/// [ZIP-227: Issuance of Zcash Shielded Assets][zip227] +/// +/// [zip227]: https://qed-it.github.io/zips/zip-0227 +pub fn hash_issue_bundle_auth_empty() -> Blake2bHash { + hasher(ZCASH_ORCHARD_ZSA_ISSUE_PERSONALIZATION).finalize() +} + +/// Construct the commitment for an absent issue bundle as defined in +/// [ZIP-227: Issuance of Zcash Shielded Assets][zip227] +/// +/// [zip227]: https://qed-it.github.io/zips/zip-0227 +pub fn hash_issue_bundle_txid_empty() -> Blake2bHash { + hasher(ZCASH_ORCHARD_ZSA_ISSUE_PERSONALIZATION).finalize() +} + +/// Construct the commitment for the issue bundle +pub(crate) fn hash_issue_bundle_txid_data(bundle: &IssueBundle) -> Blake2bHash { + let mut h = hasher(ZCASH_ORCHARD_ZSA_ISSUE_PERSONALIZATION); + let mut ia = hasher(ZCASH_ORCHARD_ZSA_ISSUE_ACTION_PERSONALIZATION); + let mut ind = hasher(ZCASH_ORCHARD_ZSA_ISSUE_NOTE_PERSONALIZATION); + + for action in bundle.actions().iter() { + for note in action.notes().iter() { + ind.update(¬e.recipient().to_raw_address_bytes()); + ind.update(¬e.value().to_bytes()); + ind.update(¬e.asset().to_bytes()); + ind.update(¬e.rho().to_bytes()); + ind.update(note.rseed().as_bytes()); + } + ia.update(ind.finalize().as_bytes()); + ia.update(action.asset_desc().as_bytes()); + ia.update(&[u8::from(action.is_finalized())]); + } + h.update(ia.finalize().as_bytes()); + h.update(&bundle.ik().to_bytes()); + h.finalize() +} + +/// Construct the commitment to the authorizing data of an +/// authorized issue bundle +pub(crate) fn hash_issue_bundle_auth_data(bundle: &IssueBundle) -> Blake2bHash { + let mut h = hasher(ZCASH_ORCHARD_ZSA_ISSUE_SIG_PERSONALIZATION); + h.update(&<[u8; 64]>::from(bundle.authorization().signature())); + h.finalize() +} diff --git a/src/circuit.rs b/src/circuit.rs index 567b60658..bfa78dce9 100644 --- a/src/circuit.rs +++ b/src/circuit.rs @@ -2,6 +2,7 @@ use core::fmt; +use ff::Field; use group::{Curve, GroupEncoding}; use halo2_proofs::{ circuit::{floor_planner, Layouter, Value}, @@ -20,12 +21,13 @@ use self::{ commit_ivk::{CommitIvkChip, CommitIvkConfig}, gadget::{ add_chip::{AddChip, AddConfig}, - assign_free_advice, + assign_free_advice, assign_is_native_asset, assign_split_flag, }, note_commit::{NoteCommitChip, NoteCommitConfig}, }; use crate::{ builder::SpendInfo, + bundle::Flags, constants::{ OrchardCommitDomains, OrchardFixedBases, OrchardFixedBasesFull, OrchardHashDomains, MERKLE_DEPTH_ORCHARD, @@ -36,7 +38,7 @@ use crate::{ note::{ commitment::{NoteCommitTrapdoor, NoteCommitment}, nullifier::Nullifier, - ExtractedNoteCommitment, Note, Rho, + AssetBase, ExtractedNoteCommitment, Note, Rho, }, primitives::redpallas::{SpendAuth, VerificationKey}, spec::NonIdentityPallasPoint, @@ -46,7 +48,7 @@ use crate::{ use halo2_gadgets::{ ecc::{ chip::{EccChip, EccConfig}, - FixedPoint, NonIdentityPoint, Point, ScalarFixed, ScalarFixedShort, ScalarVar, + FixedPoint, NonIdentityPoint, Point, ScalarFixed, ScalarVar, }, poseidon::{primitives as poseidon, Pow5Chip as PoseidonChip, Pow5Config as PoseidonConfig}, sinsemilla::{ @@ -56,12 +58,17 @@ use halo2_gadgets::{ MerklePath, }, }, - utilities::lookup_range_check::LookupRangeCheckConfig, + utilities::{ + bool_check, + cond_swap::{CondSwapChip, CondSwapConfig}, + lookup_range_check::LookupRangeCheckConfig, + }, }; mod commit_ivk; pub mod gadget; mod note_commit; +mod value_commit_orchard; /// Size of the Orchard circuit. const K: u32 = 11; @@ -76,6 +83,7 @@ const RK_Y: usize = 5; const CMX: usize = 6; const ENABLE_SPEND: usize = 7; const ENABLE_OUTPUT: usize = 8; +const ENABLE_ZSA: usize = 9; /// Configuration needed to use the Orchard Action circuit. #[derive(Clone, Debug)] @@ -95,6 +103,7 @@ pub struct Config { commit_ivk_config: CommitIvkConfig, old_note_commit_config: NoteCommitConfig, new_note_commit_config: NoteCommitConfig, + cond_swap_config: CondSwapConfig, } /// The Orchard Action circuit. @@ -109,6 +118,7 @@ pub struct Circuit { pub(crate) psi_old: Value, pub(crate) rcm_old: Value, pub(crate) cm_old: Value, + pub(crate) psi_nf: Value, pub(crate) alpha: Value, pub(crate) ak: Value, pub(crate) nk: Value, @@ -119,6 +129,8 @@ pub struct Circuit { pub(crate) psi_new: Value, pub(crate) rcm_new: Value, pub(crate) rcv: Value, + pub(crate) asset: Value, + pub(crate) split_flag: Value, } impl Circuit { @@ -158,6 +170,9 @@ impl Circuit { let psi_old = spend.note.rseed().psi(&rho_old); let rcm_old = spend.note.rseed().rcm(&rho_old); + let nf_rseed = spend.note.rseed_split_note().unwrap_or(*spend.note.rseed()); + let psi_nf = nf_rseed.psi(&rho_old); + let rho_new = output_note.rho(); let psi_new = output_note.rseed().psi(&rho_new); let rcm_new = output_note.rseed().rcm(&rho_new); @@ -172,6 +187,7 @@ impl Circuit { psi_old: Value::known(psi_old), rcm_old: Value::known(rcm_old), cm_old: Value::known(spend.note.commitment()), + psi_nf: Value::known(psi_nf), alpha: Value::known(alpha), ak: Value::known(spend.fvk.clone().into()), nk: Value::known(*spend.fvk.nk()), @@ -182,6 +198,8 @@ impl Circuit { psi_new: Value::known(psi_new), rcm_new: Value::known(rcm_new), rcv: Value::known(rcv), + asset: Value::known(spend.note.asset()), + split_flag: Value::known(spend.split_flag), } } } @@ -209,10 +227,16 @@ impl plonk::Circuit for Circuit { meta.advice_column(), ]; - // Constrain v_old - v_new = magnitude * sign (https://p.z.cash/ZKS:action-cv-net-integrity?partial). - // Either v_old = 0, or calculated root = anchor (https://p.z.cash/ZKS:action-merkle-path-validity?partial). + // Constrain split_flag to be boolean + // Constrain v_old * (1 - split_flag) - v_new = magnitude * sign (https://p.z.cash/ZKS:action-cv-net-integrity?partial). + // Constrain (v_old = 0 and is_native_asset = 1) or (calculated root = anchor) (https://p.z.cash/ZKS:action-merkle-path-validity?partial). // Constrain v_old = 0 or enable_spends = 1 (https://p.z.cash/ZKS:action-enable-spend). // Constrain v_new = 0 or enable_outputs = 1 (https://p.z.cash/ZKS:action-enable-output). + // Constrain is_native_asset to be boolean + // Constraint if is_native_asset = 1 then asset = native_asset else asset != native_asset + // Constraint if split_flag = 0 then psi_old = psi_nf + // Constraint if split_flag = 1, then is_native_asset = 0 + // Constraint if enable_zsa = 0, then is_native_asset = 1 let q_orchard = meta.selector(); meta.create_gate("Orchard circuit checks", |meta| { let q_orchard = meta.query_selector(q_orchard); @@ -227,18 +251,47 @@ impl plonk::Circuit for Circuit { let enable_spends = meta.query_advice(advices[6], Rotation::cur()); let enable_outputs = meta.query_advice(advices[7], Rotation::cur()); + let split_flag = meta.query_advice(advices[8], Rotation::cur()); + + let is_native_asset = meta.query_advice(advices[9], Rotation::cur()); + let asset_x = meta.query_advice(advices[0], Rotation::next()); + let asset_y = meta.query_advice(advices[1], Rotation::next()); + let diff_asset_x_inv = meta.query_advice(advices[2], Rotation::next()); + let diff_asset_y_inv = meta.query_advice(advices[3], Rotation::next()); + let one = Expression::Constant(pallas::Base::one()); + let native_asset = AssetBase::native() + .cv_base() + .to_affine() + .coordinates() + .unwrap(); + + let diff_asset_x = asset_x - Expression::Constant(*native_asset.x()); + let diff_asset_y = asset_y - Expression::Constant(*native_asset.y()); + + let psi_old = meta.query_advice(advices[4], Rotation::next()); + let psi_nf = meta.query_advice(advices[5], Rotation::next()); + + let enable_zsa = meta.query_advice(advices[6], Rotation::next()); + Constraints::with_selector( q_orchard, [ + ("bool_check split_flag", bool_check(split_flag.clone())), ( - "v_old - v_new = magnitude * sign", - v_old.clone() - v_new.clone() - magnitude * sign, + "v_old * (1 - split_flag) - v_new = magnitude * sign", + v_old.clone() * (one.clone() - split_flag.clone()) + - v_new.clone() + - magnitude * sign, ), + // We already checked that + // * is_native_asset is boolean (just below), and + // * v_old is a 64 bit unsigned integer (in the note commitment evaluation). + // So, 1 - is_native_asset + v_old = 0 only when (is_native_asset = 1 and v_old = 0), no overflow can occur. ( - "Either v_old = 0, or root = anchor", - v_old.clone() * (root - anchor), + "(v_old = 0 and is_native_asset = 1) or (root = anchor)", + (v_old.clone() + one.clone() - is_native_asset.clone()) * (root - anchor), ), ( "v_old = 0 or enable_spends = 1", @@ -246,7 +299,42 @@ impl plonk::Circuit for Circuit { ), ( "v_new = 0 or enable_outputs = 1", - v_new * (one - enable_outputs), + v_new * (one.clone() - enable_outputs), + ), + ( + "bool_check is_native_asset", + bool_check(is_native_asset.clone()), + ), + ( + "(is_native_asset = 1) => (asset_x = native_asset_x)", + is_native_asset.clone() * diff_asset_x.clone(), + ), + ( + "(is_native_asset = 1) => (asset_y = native_asset_y)", + is_native_asset.clone() * diff_asset_y.clone(), + ), + // To prove that `asset` is not equal to `native_asset`, we will prove that at + // least one of `x(asset) - x(native_asset)` or `y(asset) - y(native_asset)` is + // not equal to zero. + // To prove that `x(asset) - x(native_asset)` (resp `y(asset) - y(native_asset)`) + // is not equal to zero, we will prove that it is invertible. + ( + "(is_native_asset = 0) => (asset != native_asset)", + (one.clone() - is_native_asset.clone()) + * (diff_asset_x * diff_asset_x_inv - one.clone()) + * (diff_asset_y * diff_asset_y_inv - one.clone()), + ), + ( + "(split_flag = 0) => (psi_old = psi_nf)", + (one.clone() - split_flag.clone()) * (psi_old - psi_nf), + ), + ( + "(split_flag = 1) => (is_native_asset = 0)", + split_flag * is_native_asset.clone(), + ), + ( + "(enable_zsa = 0) => (is_native_asset = 1)", + (one.clone() - enable_zsa) * (one - is_native_asset), ), ], ) @@ -257,10 +345,12 @@ impl plonk::Circuit for Circuit { // Fixed columns for the Sinsemilla generator lookup table let table_idx = meta.lookup_table_column(); + let table_range_check_tag = meta.lookup_table_column(); let lookup = ( table_idx, meta.lookup_table_column(), meta.lookup_table_column(), + table_range_check_tag, ); // Instance column used for public inputs @@ -296,7 +386,8 @@ impl plonk::Circuit for Circuit { // We have a lot of free space in the right-most advice columns; use one of them // for all of our range checks. - let range_check = LookupRangeCheckConfig::configure(meta, advices[9], table_idx); + let range_check = + LookupRangeCheckConfig::configure(meta, advices[9], table_idx, table_range_check_tag); // Configuration for curve point operations. // This uses 10 advice columns and spans the whole circuit. @@ -364,6 +455,8 @@ impl plonk::Circuit for Circuit { let new_note_commit_config = NoteCommitChip::configure(meta, advices, sinsemilla_config_2.clone()); + let cond_swap_config = CondSwapChip::configure(meta, advices[0..5].try_into().unwrap()); + Config { primary, q_orchard, @@ -378,6 +471,7 @@ impl plonk::Circuit for Circuit { commit_ivk_config, old_note_commit_config, new_note_commit_config, + cond_swap_config, } } @@ -394,7 +488,14 @@ impl plonk::Circuit for Circuit { let ecc_chip = config.ecc_chip(); // Witness private inputs that are used across multiple checks. - let (psi_old, rho_old, cm_old, g_d_old, ak_P, nk, v_old, v_new) = { + let (psi_nf, psi_old, rho_old, cm_old, g_d_old, ak_P, nk, v_old, v_new, asset) = { + // Witness psi_nf + let psi_nf = assign_free_advice( + layouter.namespace(|| "witness psi_nf"), + config.advices[0], + self.psi_nf, + )?; + // Witness psi_old let psi_old = assign_free_advice( layouter.namespace(|| "witness psi_old"), @@ -452,9 +553,34 @@ impl plonk::Circuit for Circuit { self.v_new, )?; - (psi_old, rho_old, cm_old, g_d_old, ak_P, nk, v_old, v_new) + // Witness asset + let asset = NonIdentityPoint::new( + ecc_chip.clone(), + layouter.namespace(|| "witness asset"), + self.asset.map(|asset| asset.cv_base().to_affine()), + )?; + + ( + psi_nf, psi_old, rho_old, cm_old, g_d_old, ak_P, nk, v_old, v_new, asset, + ) }; + // Witness split_flag + let split_flag = assign_split_flag( + layouter.namespace(|| "witness split_flag"), + config.advices[0], + self.split_flag, + )?; + + // Witness is_native_asset which is equal to + // 1 if asset is equal to native asset, and + // 0 if asset is not equal to native asset. + let is_native_asset = assign_is_native_asset( + layouter.namespace(|| "witness is_native_asset"), + config.advices[0], + self.asset, + )?; + // Merkle path validity check (https://p.z.cash/ZKS:action-merkle-path-validity?partial). let root = { let path = self @@ -474,7 +600,17 @@ impl plonk::Circuit for Circuit { let v_net_magnitude_sign = { // Witness the magnitude and sign of v_net = v_old - v_new let v_net_magnitude_sign = { - let v_net = self.v_old - self.v_new; + // v_net is equal to + // (-v_new) if split_flag = true + // v_old - v_new if split_flag = false + let v_net = self.split_flag.and_then(|split_flag| { + if split_flag { + Value::known(crate::value::NoteValue::zero()) - self.v_new + } else { + self.v_old - self.v_new + } + }); + let magnitude_sign = v_net.map(|v_net| { let (magnitude, sign) = v_net.magnitude_sign(); @@ -502,11 +638,6 @@ impl plonk::Circuit for Circuit { (magnitude, sign) }; - let v_net = ScalarFixedShort::new( - ecc_chip.clone(), - layouter.namespace(|| "v_net"), - v_net_magnitude_sign.clone(), - )?; let rcv = ScalarFixed::new( ecc_chip.clone(), layouter.namespace(|| "rcv"), @@ -514,10 +645,12 @@ impl plonk::Circuit for Circuit { )?; let cv_net = gadget::value_commit_orchard( - layouter.namespace(|| "cv_net = ValueCommit^Orchard_rcv(v_net)"), + layouter.namespace(|| "cv_net = ValueCommit^Orchard_rcv(v_net_magnitude_sign)"), + config.sinsemilla_chip_1(), ecc_chip.clone(), - v_net, + v_net_magnitude_sign.clone(), rcv, + asset.clone(), )?; // Constrain cv_net to equal public input @@ -531,14 +664,16 @@ impl plonk::Circuit for Circuit { // Nullifier integrity (https://p.z.cash/ZKS:action-nullifier-integrity). let nf_old = { let nf_old = gadget::derive_nullifier( - layouter.namespace(|| "nf_old = DeriveNullifier_nk(rho_old, psi_old, cm_old)"), + layouter.namespace(|| "nf_old = DeriveNullifier_nk(rho_old, psi_nf, cm_old)"), config.poseidon_chip(), config.add_chip(), ecc_chip.clone(), + config.cond_swap_chip(), rho_old.clone(), - &psi_old, + &psi_nf, &cm_old, nk.clone(), + split_flag.clone(), )?; // Constrain nf_old to equal public input @@ -629,12 +764,15 @@ impl plonk::Circuit for Circuit { config.sinsemilla_chip_1(), config.ecc_chip(), config.note_commit_chip_old(), + config.cond_swap_chip(), g_d_old.inner(), pk_d_old.inner(), v_old.clone(), rho_old, - psi_old, + psi_old.clone(), + asset.inner(), rcm_old, + is_native_asset.clone(), )?; // Constrain derived cm_old to equal witnessed cm_old @@ -687,12 +825,15 @@ impl plonk::Circuit for Circuit { config.sinsemilla_chip_2(), config.ecc_chip(), config.note_commit_chip_new(), + config.cond_swap_chip(), g_d_new.inner(), pk_d_new.inner(), v_new.clone(), rho_new, psi_new, + asset.inner(), rcm_new, + is_native_asset.clone(), )?; let cmx = cm_new.extract_p(); @@ -745,6 +886,85 @@ impl plonk::Circuit for Circuit { 0, )?; + split_flag.copy_advice(|| "split_flag", &mut region, config.advices[8], 0)?; + + is_native_asset.copy_advice( + || "is_native_asset", + &mut region, + config.advices[9], + 0, + )?; + asset + .inner() + .x() + .copy_advice(|| "asset_x", &mut region, config.advices[0], 1)?; + asset + .inner() + .y() + .copy_advice(|| "asset_y", &mut region, config.advices[1], 1)?; + + // `diff_asset_x_inv` and `diff_asset_y_inv` will be used to prove that + // if is_native_asset = 0, then asset != native_asset. + region.assign_advice( + || "diff_asset_x_inv", + config.advices[2], + 1, + || { + self.asset.map(|asset| { + let asset_x = *asset.cv_base().to_affine().coordinates().unwrap().x(); + let native_asset_x = *AssetBase::native() + .cv_base() + .to_affine() + .coordinates() + .unwrap() + .x(); + + let diff_asset_x = asset_x - native_asset_x; + + if diff_asset_x == pallas::Base::zero() { + pallas::Base::zero() + } else { + diff_asset_x.invert().unwrap() + } + }) + }, + )?; + region.assign_advice( + || "diff_asset_y_inv", + config.advices[3], + 1, + || { + self.asset.map(|asset| { + let asset_y = *asset.cv_base().to_affine().coordinates().unwrap().y(); + let native_asset_y = *AssetBase::native() + .cv_base() + .to_affine() + .coordinates() + .unwrap() + .y(); + + let diff_asset_y = asset_y - native_asset_y; + + if diff_asset_y == pallas::Base::zero() { + pallas::Base::zero() + } else { + diff_asset_y.invert().unwrap() + } + }) + }, + )?; + + psi_old.copy_advice(|| "psi_old", &mut region, config.advices[4], 1)?; + psi_nf.copy_advice(|| "psi_nf", &mut region, config.advices[5], 1)?; + + region.assign_advice_from_instance( + || "enable zsa", + config.primary, + ENABLE_ZSA, + config.advices[6], + 1, + )?; + config.q_orchard.enable(&mut region, 0) }, )?; @@ -802,6 +1022,7 @@ pub struct Instance { pub(crate) cmx: ExtractedNoteCommitment, pub(crate) enable_spend: bool, pub(crate) enable_output: bool, + pub(crate) enable_zsa: bool, } impl Instance { @@ -818,8 +1039,7 @@ impl Instance { nf_old: Nullifier, rk: VerificationKey, cmx: ExtractedNoteCommitment, - enable_spend: bool, - enable_output: bool, + flags: Flags, ) -> Self { Instance { anchor, @@ -827,13 +1047,14 @@ impl Instance { nf_old, rk, cmx, - enable_spend, - enable_output, + enable_spend: flags.spends_enabled(), + enable_output: flags.outputs_enabled(), + enable_zsa: flags.zsa_enabled(), } } - fn to_halo2_instance(&self) -> [[vesta::Scalar; 9]; 1] { - let mut instance = [vesta::Scalar::zero(); 9]; + fn to_halo2_instance(&self) -> [[vesta::Scalar; 10]; 1] { + let mut instance = [vesta::Scalar::zero(); 10]; instance[ANCHOR] = self.anchor.inner(); instance[CV_NET_X] = self.cv_net.x(); @@ -851,6 +1072,7 @@ impl Instance { instance[CMX] = self.cmx.inner(); instance[ENABLE_SPEND] = vesta::Scalar::from(u64::from(self.enable_spend)); instance[ENABLE_OUTPUT] = vesta::Scalar::from(u64::from(self.enable_output)); + instance[ENABLE_ZSA] = vesta::Scalar::from(u64::from(self.enable_zsa)); [instance] } @@ -963,40 +1185,51 @@ mod tests { use core::iter; use ff::Field; + use group::{Curve, Group, GroupEncoding}; use halo2_proofs::{circuit::Value, dev::MockProver}; use pasta_curves::pallas; use rand::{rngs::OsRng, RngCore}; use super::{Circuit, Instance, Proof, ProvingKey, VerifyingKey, K}; + use crate::builder::SpendInfo; + use crate::bundle::Flags; + use crate::note::commitment::NoteCommitTrapdoor; + use crate::note::{AssetBase, Nullifier}; + use crate::primitives::redpallas::VerificationKey; use crate::{ - keys::SpendValidatingKey, - note::{Note, Rho}, + keys::{FullViewingKey, Scope, SpendValidatingKey, SpendingKey}, + note::{Note, NoteCommitment, Rho}, tree::MerklePath, - value::{ValueCommitTrapdoor, ValueCommitment}, + value::{NoteValue, ValueCommitTrapdoor, ValueCommitment}, }; - fn generate_circuit_instance(mut rng: R) -> (Circuit, Instance) { - let (_, fvk, spent_note) = Note::dummy(&mut rng, None); + fn generate_dummy_circuit_instance(mut rng: R) -> (Circuit, Instance) { + let (_, fvk, spent_note) = Note::dummy(&mut rng, None, AssetBase::native()); let sender_address = spent_note.recipient(); let nk = *fvk.nk(); let rivk = fvk.rivk(fvk.scope_for_address(&spent_note.recipient()).unwrap()); let nf_old = spent_note.nullifier(&fvk); - let rho = Rho::from_nf_old(nf_old); let ak: SpendValidatingKey = fvk.into(); let alpha = pallas::Scalar::random(&mut rng); let rk = ak.randomize(&alpha); - let (_, _, output_note) = Note::dummy(&mut rng, Some(rho)); + let (_, _, output_note) = Note::dummy( + &mut rng, + Some(Rho::from_nf_old(nf_old)), + AssetBase::native(), + ); let cmx = output_note.commitment().into(); let value = spent_note.value() - output_note.value(); let rcv = ValueCommitTrapdoor::random(&mut rng); - let cv_net = ValueCommitment::derive(value, rcv.clone()); + let cv_net = ValueCommitment::derive(value, rcv, AssetBase::native()); let path = MerklePath::dummy(&mut rng); let anchor = path.root(spent_note.commitment().into()); + let psi_old = spent_note.rseed().psi(&spent_note.rho()); + ( Circuit { path: Value::known(path.auth_path()), @@ -1005,9 +1238,11 @@ mod tests { pk_d_old: Value::known(*sender_address.pk_d()), v_old: Value::known(spent_note.value()), rho_old: Value::known(spent_note.rho()), - psi_old: Value::known(spent_note.rseed().psi(&spent_note.rho())), + psi_old: Value::known(psi_old), rcm_old: Value::known(spent_note.rseed().rcm(&spent_note.rho())), cm_old: Value::known(spent_note.commitment()), + // For non split note, psi_nf is equal to psi_old + psi_nf: Value::known(psi_old), alpha: Value::known(alpha), ak: Value::known(ak), nk: Value::known(nk), @@ -1018,6 +1253,8 @@ mod tests { psi_new: Value::known(output_note.rseed().psi(&output_note.rho())), rcm_new: Value::known(output_note.rseed().rcm(&output_note.rho())), rcv: Value::known(rcv), + asset: Value::known(spent_note.asset()), + split_flag: Value::known(false), }, Instance { anchor, @@ -1027,6 +1264,7 @@ mod tests { cmx, enable_spend: true, enable_output: true, + enable_zsa: false, }, ) } @@ -1037,7 +1275,7 @@ mod tests { let mut rng = OsRng; let (circuits, instances): (Vec<_>, Vec<_>) = iter::once(()) - .map(|()| generate_circuit_instance(&mut rng)) + .map(|()| generate_dummy_circuit_instance(&mut rng)) .unzip(); let vk = VerifyingKey::build(); @@ -1059,8 +1297,8 @@ mod tests { K, &circuits[0], ); - assert_eq!(usize::from(circuit_cost.proof_size(1)), 4992); - assert_eq!(usize::from(circuit_cost.proof_size(2)), 7264); + assert_eq!(usize::from(circuit_cost.proof_size(1)), 5120); + assert_eq!(usize::from(circuit_cost.proof_size(2)), 7392); usize::from(circuit_cost.proof_size(instances.len())) }; @@ -1089,6 +1327,7 @@ mod tests { #[test] fn serialized_proof_test_case() { + use std::fs; use std::io::{Read, Write}; let vk = VerifyingKey::build(); @@ -1106,6 +1345,7 @@ mod tests { w.write_all(&[ u8::from(instance.enable_spend), u8::from(instance.enable_output), + u8::from(instance.enable_zsa), ])?; w.write_all(proof.as_ref())?; @@ -1136,8 +1376,15 @@ mod tests { crate::note::ExtractedNoteCommitment::from_bytes(&read_32_bytes(&mut r)).unwrap(); let enable_spend = read_bool(&mut r); let enable_output = read_bool(&mut r); - let instance = - Instance::from_parts(anchor, cv_net, nf_old, rk, cmx, enable_spend, enable_output); + let enable_zsa = read_bool(&mut r); + let instance = Instance::from_parts( + anchor, + cv_net, + nf_old, + rk, + cmx, + Flags::from_parts(enable_spend, enable_output, enable_zsa), + ); let mut proof_bytes = vec![]; r.read_to_end(&mut proof_bytes)?; @@ -1150,14 +1397,14 @@ mod tests { let create_proof = || -> std::io::Result<()> { let mut rng = OsRng; - let (circuit, instance) = generate_circuit_instance(OsRng); + let (circuit, instance) = generate_dummy_circuit_instance(OsRng); let instances = &[instance.clone()]; let pk = ProvingKey::build(); let proof = Proof::create(&pk, &[circuit], instances, &mut rng).unwrap(); assert!(proof.verify(&vk, instances).is_ok()); - let file = std::fs::File::create("circuit_proof_test_case.bin")?; + let file = std::fs::File::create("src/circuit_proof_test_case.bin")?; write_test_case(file, &instance, &proof) }; create_proof().expect("should be able to write new proof"); @@ -1165,10 +1412,10 @@ mod tests { // Parse the hardcoded proof test case. let (instance, proof) = { - let test_case_bytes = include_bytes!("circuit_proof_test_case.bin"); + let test_case_bytes = fs::read("src/circuit_proof_test_case.bin").unwrap(); read_test_case(&test_case_bytes[..]).expect("proof must be valid") }; - assert_eq!(proof.0.len(), 4992); + assert_eq!(proof.0.len(), 5120); assert!(proof.verify(&vk, &[instance]).is_ok()); } @@ -1194,6 +1441,7 @@ mod tests { psi_old: Value::unknown(), rcm_old: Value::unknown(), cm_old: Value::unknown(), + psi_nf: Value::unknown(), alpha: Value::unknown(), ak: Value::unknown(), nk: Value::unknown(), @@ -1204,6 +1452,8 @@ mod tests { psi_new: Value::unknown(), rcm_new: Value::unknown(), rcv: Value::unknown(), + asset: Value::unknown(), + split_flag: Value::unknown(), }; halo2_proofs::dev::CircuitLayout::default() .show_labels(false) @@ -1211,4 +1461,284 @@ mod tests { .render(K, &circuit, &root) .unwrap(); } + + fn check_proof_of_orchard_circuit(circuit: &Circuit, instance: &Instance, should_pass: bool) { + let proof_verify = MockProver::run( + K, + circuit, + instance + .to_halo2_instance() + .iter() + .map(|p| p.to_vec()) + .collect(), + ) + .unwrap() + .verify(); + if should_pass { + assert!(proof_verify.is_ok()); + } else { + assert!(proof_verify.is_err()); + } + } + + fn generate_circuit_instance( + is_native_asset: bool, + split_flag: bool, + mut rng: R, + ) -> (Circuit, Instance) { + // Create asset + let asset_base = if is_native_asset { + AssetBase::native() + } else { + AssetBase::random() + }; + + // Create spent_note + let (spent_note_fvk, spent_note) = { + let sk = SpendingKey::random(&mut rng); + let fvk: FullViewingKey = (&sk).into(); + let sender_address = fvk.address_at(0u32, Scope::External); + let rho_old = Rho::from_nf_old(Nullifier::dummy(&mut rng)); + let note = Note::new( + sender_address, + NoteValue::from_raw(40), + asset_base, + rho_old, + &mut rng, + ); + let spent_note = if split_flag { + note.create_split_note(&mut rng) + } else { + note + }; + (fvk, spent_note) + }; + + let output_value = NoteValue::from_raw(10); + + let (scope, v_net) = if split_flag { + ( + Scope::External, + // Split notes do not contribute to v_net. + // Therefore, if split_flag is true, v_net = - output_value + NoteValue::zero() - output_value, + ) + } else { + ( + spent_note_fvk + .scope_for_address(&spent_note.recipient()) + .unwrap(), + spent_note.value() - output_value, + ) + }; + + let nf_old = spent_note.nullifier(&spent_note_fvk); + let ak: SpendValidatingKey = spent_note_fvk.clone().into(); + let alpha = pallas::Scalar::random(&mut rng); + let rk = ak.randomize(&alpha); + + let output_note = { + let sk = SpendingKey::random(&mut rng); + let fvk: FullViewingKey = (&sk).into(); + let sender_address = fvk.address_at(0u32, Scope::External); + + Note::new( + sender_address, + output_value, + asset_base, + Rho::from_nf_old(nf_old), + &mut rng, + ) + }; + + let cmx = output_note.commitment().into(); + + let rcv = ValueCommitTrapdoor::random(&mut rng); + let cv_net = ValueCommitment::derive(v_net, rcv, asset_base); + + let path = MerklePath::dummy(&mut rng); + let anchor = path.root(spent_note.commitment().into()); + + let spend_info = SpendInfo { + dummy_sk: None, + fvk: spent_note_fvk, + scope, + note: spent_note, + merkle_path: path, + split_flag, + }; + + ( + Circuit::from_action_context_unchecked(spend_info, output_note, alpha, rcv), + Instance { + anchor, + cv_net, + nf_old, + rk, + cmx, + enable_spend: true, + enable_output: true, + enable_zsa: true, + }, + ) + } + + fn random_note_commitment(mut rng: impl RngCore) -> NoteCommitment { + NoteCommitment::derive( + pallas::Point::random(&mut rng).to_affine().to_bytes(), + pallas::Point::random(&mut rng).to_affine().to_bytes(), + NoteValue::from_raw(rng.next_u64()), + AssetBase::random(), + pallas::Base::random(&mut rng), + pallas::Base::random(&mut rng), + NoteCommitTrapdoor(pallas::Scalar::random(&mut rng)), + ) + .unwrap() + } + + #[test] + fn orchard_circuit_negative_test() { + let mut rng = OsRng; + + for is_native_asset in [true, false] { + for split_flag in [true, false] { + let (circuit, instance) = + generate_circuit_instance(is_native_asset, split_flag, &mut rng); + + let should_pass = !(matches!((is_native_asset, split_flag), (true, true))); + + check_proof_of_orchard_circuit(&circuit, &instance, should_pass); + + // Set cv_net to be zero + // The proof should fail + let instance_wrong_cv_net = Instance { + anchor: instance.anchor, + cv_net: ValueCommitment::from_bytes(&[0u8; 32]).unwrap(), + nf_old: instance.nf_old, + rk: instance.rk.clone(), + cmx: instance.cmx, + enable_spend: instance.enable_spend, + enable_output: instance.enable_output, + enable_zsa: instance.enable_zsa, + }; + check_proof_of_orchard_circuit(&circuit, &instance_wrong_cv_net, false); + + // Set rk_pub to be a dummy VerificationKey + // The proof should fail + let instance_wrong_rk = Instance { + anchor: instance.anchor, + cv_net: instance.cv_net.clone(), + nf_old: instance.nf_old, + rk: VerificationKey::dummy(), + cmx: instance.cmx, + enable_spend: instance.enable_spend, + enable_output: instance.enable_output, + enable_zsa: instance.enable_zsa, + }; + check_proof_of_orchard_circuit(&circuit, &instance_wrong_rk, false); + + // Set cm_old to be a random NoteCommitment + // The proof should fail + let circuit_wrong_cm_old = Circuit { + path: circuit.path, + pos: circuit.pos, + g_d_old: circuit.g_d_old, + pk_d_old: circuit.pk_d_old, + v_old: circuit.v_old, + rho_old: circuit.rho_old, + psi_old: circuit.psi_old, + rcm_old: circuit.rcm_old.clone(), + cm_old: Value::known(random_note_commitment(&mut rng)), + psi_nf: circuit.psi_nf, + alpha: circuit.alpha, + ak: circuit.ak.clone(), + nk: circuit.nk, + rivk: circuit.rivk, + g_d_new: circuit.g_d_new, + pk_d_new: circuit.pk_d_new, + v_new: circuit.v_new, + psi_new: circuit.psi_new, + rcm_new: circuit.rcm_new.clone(), + rcv: circuit.rcv, + asset: circuit.asset, + split_flag: circuit.split_flag, + }; + check_proof_of_orchard_circuit(&circuit_wrong_cm_old, &instance, false); + + // Set cmx_pub to be a random NoteCommitment + // The proof should fail + let instance_wrong_cmx_pub = Instance { + anchor: instance.anchor, + cv_net: instance.cv_net.clone(), + nf_old: instance.nf_old, + rk: instance.rk.clone(), + cmx: random_note_commitment(&mut rng).into(), + enable_spend: instance.enable_spend, + enable_output: instance.enable_output, + enable_zsa: instance.enable_zsa, + }; + check_proof_of_orchard_circuit(&circuit, &instance_wrong_cmx_pub, false); + + // Set nf_old_pub to be a random Nullifier + // The proof should fail + let instance_wrong_nf_old_pub = Instance { + anchor: instance.anchor, + cv_net: instance.cv_net.clone(), + nf_old: Nullifier::dummy(&mut rng), + rk: instance.rk.clone(), + cmx: instance.cmx, + enable_spend: instance.enable_spend, + enable_output: instance.enable_output, + enable_zsa: instance.enable_zsa, + }; + check_proof_of_orchard_circuit(&circuit, &instance_wrong_nf_old_pub, false); + + // If split_flag = 0 , set psi_nf to be a random Pallas base element + // The proof should fail + if !split_flag { + let circuit_wrong_psi_nf = Circuit { + path: circuit.path, + pos: circuit.pos, + g_d_old: circuit.g_d_old, + pk_d_old: circuit.pk_d_old, + v_old: circuit.v_old, + rho_old: circuit.rho_old, + psi_old: circuit.psi_old, + rcm_old: circuit.rcm_old.clone(), + cm_old: circuit.cm_old.clone(), + psi_nf: Value::known(pallas::Base::random(&mut rng)), + alpha: circuit.alpha, + ak: circuit.ak.clone(), + nk: circuit.nk, + rivk: circuit.rivk, + g_d_new: circuit.g_d_new, + pk_d_new: circuit.pk_d_new, + v_new: circuit.v_new, + psi_new: circuit.psi_new, + rcm_new: circuit.rcm_new.clone(), + rcv: circuit.rcv, + asset: circuit.asset, + split_flag: circuit.split_flag, + }; + check_proof_of_orchard_circuit(&circuit_wrong_psi_nf, &instance, false); + } + + // If asset is not equal to the native asset, set enable_zsa = 0 + // The proof should fail + if !is_native_asset { + let instance_wrong_enable_zsa = Instance { + anchor: instance.anchor, + cv_net: instance.cv_net.clone(), + nf_old: instance.nf_old, + rk: instance.rk.clone(), + cmx: instance.cmx, + enable_spend: instance.enable_spend, + enable_output: instance.enable_output, + enable_zsa: false, + }; + check_proof_of_orchard_circuit(&circuit, &instance_wrong_enable_zsa, false); + } + } + } + } } diff --git a/src/circuit/commit_ivk.rs b/src/circuit/commit_ivk.rs index 33692a4a8..73c24a91f 100644 --- a/src/circuit/commit_ivk.rs +++ b/src/circuit/commit_ivk.rs @@ -734,10 +734,12 @@ mod tests { } let table_idx = meta.lookup_table_column(); + let table_range_check_tag = meta.lookup_table_column(); let lookup = ( table_idx, meta.lookup_table_column(), meta.lookup_table_column(), + table_range_check_tag, ); let lagrange_coeffs = [ meta.fixed_column(), @@ -750,7 +752,12 @@ mod tests { meta.fixed_column(), ]; - let range_check = LookupRangeCheckConfig::configure(meta, advices[9], table_idx); + let range_check = LookupRangeCheckConfig::configure( + meta, + advices[9], + table_idx, + table_range_check_tag, + ); let sinsemilla_config = SinsemillaChip::< OrchardHashDomains, OrchardCommitDomains, diff --git a/src/circuit/gadget.rs b/src/circuit/gadget.rs index 12c3c90e6..dff412b72 100644 --- a/src/circuit/gadget.rs +++ b/src/circuit/gadget.rs @@ -1,23 +1,21 @@ //! Gadgets used in the Orchard circuit. use ff::Field; +use group::Curve; +use pasta_curves::arithmetic::CurveExt; use pasta_curves::pallas; use super::{commit_ivk::CommitIvkChip, note_commit::NoteCommitChip}; -use crate::constants::{ - NullifierK, OrchardCommitDomains, OrchardFixedBases, OrchardFixedBasesFull, OrchardHashDomains, - ValueCommitV, -}; +use crate::constants::{NullifierK, OrchardCommitDomains, OrchardFixedBases, OrchardHashDomains}; +use crate::note::AssetBase; use halo2_gadgets::{ - ecc::{ - chip::EccChip, EccInstructions, FixedPoint, FixedPointBaseField, FixedPointShort, Point, - ScalarFixed, ScalarFixedShort, X, - }, + ecc::{chip::EccChip, chip::EccPoint, EccInstructions, FixedPointBaseField, Point, X}, poseidon::{ primitives::{self as poseidon, ConstantLength}, Hash as PoseidonHash, PoseidonSpongeInstructions, Pow5Chip as PoseidonChip, }, sinsemilla::{chip::SinsemillaChip, merkle::chip::MerkleChip}, + utilities::cond_swap::CondSwapChip, }; use halo2_proofs::{ circuit::{AssignedCell, Chip, Layouter, Value}, @@ -74,6 +72,10 @@ impl super::Config { pub(super) fn note_commit_chip_old(&self) -> NoteCommitChip { NoteCommitChip::construct(self.old_note_commit_config.clone()) } + + pub(super) fn cond_swap_chip(&self) -> CondSwapChip { + CondSwapChip::construct(self.cond_swap_config.clone()) + } } /// An instruction set for adding two circuit words (field elements). @@ -106,39 +108,48 @@ where ) } -/// `ValueCommit^Orchard` from [Section 5.4.8.3 Homomorphic Pedersen commitments (Sapling and Orchard)]. -/// -/// [Section 5.4.8.3 Homomorphic Pedersen commitments (Sapling and Orchard)]: https://zips.z.cash/protocol/protocol.pdf#concretehomomorphiccommit -pub(in crate::circuit) fn value_commit_orchard< - EccChip: EccInstructions< - pallas::Affine, - FixedPoints = OrchardFixedBases, - Var = AssignedCell, - >, ->( - mut layouter: impl Layouter, - ecc_chip: EccChip, - v: ScalarFixedShort, - rcv: ScalarFixed, -) -> Result, plonk::Error> { - // commitment = [v] ValueCommitV - let (commitment, _) = { - let value_commit_v = ValueCommitV; - let value_commit_v = FixedPointShort::from_inner(ecc_chip.clone(), value_commit_v); - value_commit_v.mul(layouter.namespace(|| "[v] ValueCommitV"), v)? - }; - - // blind = [rcv] ValueCommitR - let (blind, _rcv) = { - let value_commit_r = OrchardFixedBasesFull::ValueCommitR; - let value_commit_r = FixedPoint::from_inner(ecc_chip, value_commit_r); - - // [rcv] ValueCommitR - value_commit_r.mul(layouter.namespace(|| "[rcv] ValueCommitR"), rcv)? - }; +/// Witnesses is_native_asset. +pub(in crate::circuit) fn assign_is_native_asset( + layouter: impl Layouter, + column: Column, + asset: Value, +) -> Result, plonk::Error> +where + Assigned: for<'v> From<&'v pasta_curves::Fp>, +{ + assign_free_advice( + layouter, + column, + asset.map(|asset| { + if bool::from(asset.is_native()) { + pallas::Base::one() + } else { + pallas::Base::zero() + } + }), + ) +} - // [v] ValueCommitV + [rcv] ValueCommitR - commitment.add(layouter.namespace(|| "cv"), &blind) +/// Witnesses split_flag. +pub(in crate::circuit) fn assign_split_flag( + layouter: impl Layouter, + column: Column, + split_flag: Value, +) -> Result, plonk::Error> +where + Assigned: for<'v> From<&'v pasta_curves::Fp>, +{ + assign_free_advice( + layouter, + column, + split_flag.map(|split_flag| { + if split_flag { + pallas::Base::one() + } else { + pallas::Base::zero() + } + }), + ) } /// `DeriveNullifier` from [Section 4.16: Note Commitments and Nullifiers]. @@ -151,6 +162,7 @@ pub(in crate::circuit) fn derive_nullifier< EccChip: EccInstructions< pallas::Affine, FixedPoints = OrchardFixedBases, + Point = EccPoint, Var = AssignedCell, >, >( @@ -158,10 +170,12 @@ pub(in crate::circuit) fn derive_nullifier< poseidon_chip: PoseidonChip, add_chip: AddChip, ecc_chip: EccChip, + cond_swap_chip: CondSwapChip, rho: AssignedCell, psi: &AssignedCell, cm: &Point, nk: AssignedCell, + split_flag: AssignedCell, ) -> Result, plonk::Error> { // hash = poseidon_hash(nk, rho) let hash = { @@ -186,18 +200,39 @@ pub(in crate::circuit) fn derive_nullifier< // `product` = [poseidon_hash(nk, rho) + psi] NullifierK. // let product = { - let nullifier_k = FixedPointBaseField::from_inner(ecc_chip, NullifierK); + let nullifier_k = FixedPointBaseField::from_inner(ecc_chip.clone(), NullifierK); nullifier_k.mul( layouter.namespace(|| "[poseidon_output + psi] NullifierK"), scalar, )? }; - // Add cm to multiplied fixed base to get nf - // cm + [poseidon_output + psi] NullifierK - cm.add(layouter.namespace(|| "nf"), &product) - .map(|res| res.extract_p()) + // Add cm to multiplied fixed base + // nf = cm + [poseidon_output + psi] NullifierK + let nf = cm.add(layouter.namespace(|| "nf"), &product)?; + + // Add NullifierL to nf + // split_note_nf = NullifierL + nf + let nullifier_l = Point::new_from_constant( + ecc_chip.clone(), + layouter.namespace(|| "witness NullifierL constant"), + pallas::Point::hash_to_curve("z.cash:Orchard")(b"L").to_affine(), + )?; + let split_note_nf = nullifier_l.add(layouter.namespace(|| "split_note_nf"), &nf)?; + + // Select the desired nullifier according to split_flag + Ok(Point::from_inner( + ecc_chip, + cond_swap_chip.mux_on_points( + layouter.namespace(|| "mux on nf"), + &split_flag, + nf.inner(), + split_note_nf.inner(), + )?, + ) + .extract_p()) } pub(in crate::circuit) use crate::circuit::commit_ivk::gadgets::commit_ivk; pub(in crate::circuit) use crate::circuit::note_commit::gadgets::note_commit; +pub(in crate::circuit) use crate::circuit::value_commit_orchard::gadgets::value_commit_orchard; diff --git a/src/circuit/note_commit.rs b/src/circuit/note_commit.rs index 9daa685f2..47d928fc0 100644 --- a/src/circuit/note_commit.rs +++ b/src/circuit/note_commit.rs @@ -15,14 +15,15 @@ use crate::{ use halo2_gadgets::{ ecc::{ chip::{EccChip, NonIdentityEccPoint}, - Point, ScalarFixed, + NonIdentityPoint, Point, ScalarFixed, }, sinsemilla::{ chip::{SinsemillaChip, SinsemillaConfig}, CommitDomain, Message, MessagePiece, }, utilities::{ - bool_check, lookup_range_check::LookupRangeCheckConfig, FieldValue, RangeConstrained, + bool_check, cond_swap::CondSwapChip, lookup_range_check::LookupRangeCheckConfig, + FieldValue, RangeConstrained, }, }; @@ -575,13 +576,16 @@ impl DecomposeG { ) } } - -/// h = h_0 || h_1 || h_2 -/// = (bits 249..=253 of psi) || (bit 254 of psi) || 4 zero bits +/// h_zec = h_0 || h_1 || h_2_zec +/// = (bits 249..=253 of psi) || (bit 254 of psi) || 4 zero bits /// -/// | A_6 | A_7 | A_8 | q_notecommit_h | -/// ------------------------------------ -/// | h | h_0 | h_1 | 1 | +/// h_zsa = h_0 || h_1 || h_2_zsa +/// = (bits 249..=253 of psi) || (bit 254 of psi) || (bits 0..=3 of x(asset)) +/// +/// | A_6 | A_7 | A_8 | q_notecommit_h | +/// -------------------------------------------- +/// | h_zec | h_0 | h_1 | 1 | +/// | h_zsa | h_2_zsa | | 0 | /// /// #[derive(Clone, Debug)] @@ -599,27 +603,38 @@ impl DecomposeH { col_m: Column, col_r: Column, two_pow_5: pallas::Base, + two_pow_6: pallas::Base, ) -> Self { let q_notecommit_h = meta.selector(); meta.create_gate("NoteCommit MessagePiece h", |meta| { let q_notecommit_h = meta.query_selector(q_notecommit_h); - // h has been constrained to 10 bits by the Sinsemilla hash. - let h = meta.query_advice(col_l, Rotation::cur()); + // h_zec has been constrained to 10 bits by the Sinsemilla hash. + let h_zec = meta.query_advice(col_l, Rotation::cur()); // h_0 has been constrained to be 5 bits outside this gate. let h_0 = meta.query_advice(col_m, Rotation::cur()); // This gate constrains h_1 to be boolean. let h_1 = meta.query_advice(col_r, Rotation::cur()); - // h = h_0 + (2^5) h_1 - let decomposition_check = h - (h_0 + h_1.clone() * two_pow_5); + // h_zsa has been constrained to 10 bits by the Sinsemilla hash. + let h_zsa = meta.query_advice(col_l, Rotation::next()); + // h_2_zsa has been constrained to be 4 bits outside this gate. + let h_2_zsa = meta.query_advice(col_m, Rotation::next()); + + // h_zec = h_0 + (2^5) h_1 + let zec_decomposition_check = h_zec - (h_0.clone() + h_1.clone() * two_pow_5); + + // h_zsa = h_0 + (2^5) h_1 + (2^6) h_2_zsa + let zsa_decomposition_check = + h_zsa - (h_0 + h_1.clone() * two_pow_5 + h_2_zsa * two_pow_6); Constraints::with_selector( q_notecommit_h, [ ("bool_check h_1", bool_check(h_1)), - ("decomposition", decomposition_check), + ("zec_decomposition", zec_decomposition_check), + ("zsa_decomposition", zsa_decomposition_check), ], ) }); @@ -638,11 +653,14 @@ impl DecomposeH { chip: SinsemillaChip, layouter: &mut impl Layouter, psi: &AssignedCell, + asset: &NonIdentityEccPoint, ) -> Result< ( + NoteCommitPiece, NoteCommitPiece, RangeConstrained>, RangeConstrained>, + RangeConstrained>, ), Error, > { @@ -657,9 +675,17 @@ impl DecomposeH { // h_1 will be boolean-constrained in the gate. let h_1 = RangeConstrained::bitrange_of(psi.value(), 254..255); - let h = MessagePiece::from_subpieces( - chip, - layouter.namespace(|| "h"), + // Constrain h_2_zsa to be 4 bits. + let h_2_zsa = RangeConstrained::witness_short( + lookup_config, + layouter.namespace(|| "h_2_zsa"), + asset.x().value(), + 0..4, + )?; + + let h_zec = MessagePiece::from_subpieces( + chip.clone(), + layouter.namespace(|| "h_zec"), [ h_0.value(), h_1, @@ -667,34 +693,164 @@ impl DecomposeH { ], )?; - Ok((h, h_0, h_1)) + let h_zsa = MessagePiece::from_subpieces( + chip, + layouter.namespace(|| "h_zsa"), + [h_0.value(), h_1, h_2_zsa.value()], + )?; + + Ok((h_zec, h_zsa, h_0, h_1, h_2_zsa)) } fn assign( &self, layouter: &mut impl Layouter, - h: NoteCommitPiece, + h_zec: NoteCommitPiece, + h_zsa: NoteCommitPiece, h_0: RangeConstrained>, h_1: RangeConstrained>, + h_2_zsa: RangeConstrained>, ) -> Result, Error> { layouter.assign_region( || "NoteCommit MessagePiece h", |mut region| { self.q_notecommit_h.enable(&mut region, 0)?; - h.inner() + h_zec + .inner() .cell_value() - .copy_advice(|| "h", &mut region, self.col_l, 0)?; + .copy_advice(|| "h_zec", &mut region, self.col_l, 0)?; h_0.inner() .copy_advice(|| "h_0", &mut region, self.col_m, 0)?; let h_1 = region.assign_advice(|| "h_1", self.col_r, 0, || *h_1.inner())?; + h_zsa + .inner() + .cell_value() + .copy_advice(|| "h_zsa", &mut region, self.col_l, 1)?; + + h_2_zsa + .inner() + .copy_advice(|| "h_2_zsa", &mut region, self.col_m, 1)?; + Ok(h_1) }, ) } } +/// j = j_0 || j_1 +/// = (bit 254 of x(asset)) || (ỹ bit of asset) +/// +/// | A_6 | A_7 | A_8 | q_notecommit_j | +/// ------------------------------------ +/// | j | j_0 | j_1 | 1 | +/// +/// https://p.z.cash/orchard-0.1:note-commit-decomposition-j?partial +#[derive(Clone, Debug)] +struct DecomposeJ { + q_notecommit_j: Selector, + col_l: Column, + col_m: Column, + col_r: Column, +} + +impl DecomposeJ { + fn configure( + meta: &mut ConstraintSystem, + col_l: Column, + col_m: Column, + col_r: Column, + two: pallas::Base, + ) -> Self { + let q_notecommit_j = meta.selector(); + + meta.create_gate("NoteCommit MessagePiece j", |meta| { + let q_notecommit_j = meta.query_selector(q_notecommit_j); + + // j has been constrained to 10 bits by the Sinsemilla hash. + let j = meta.query_advice(col_l, Rotation::cur()); + // This gate constrains j_0 to be boolean. + let j_0 = meta.query_advice(col_m, Rotation::cur()); + // This gate constrains j_1 to be boolean. + let j_1 = meta.query_advice(col_r, Rotation::cur()); + + // j = j_0 + (2) j_1 + let decomposition_check = j - (j_0.clone() + j_1.clone() * two); + + Constraints::with_selector( + q_notecommit_j, + [ + ("bool_check j_0", bool_check(j_0)), + ("bool_check j_1", bool_check(j_1)), + ("decomposition", decomposition_check), + ], + ) + }); + + Self { + q_notecommit_j, + col_l, + col_m, + col_r, + } + } + + #[allow(clippy::type_complexity)] + fn decompose( + chip: SinsemillaChip, + layouter: &mut impl Layouter, + asset: &NonIdentityEccPoint, + ) -> Result< + ( + NoteCommitPiece, + RangeConstrained>, + RangeConstrained>, + ), + Error, + > { + // j_0, j_1 will be boolean-constrained in the gate. + let j_0 = RangeConstrained::bitrange_of(asset.x().value(), 254..255); + let j_1 = RangeConstrained::bitrange_of(asset.y().value(), 0..1); + + let j = MessagePiece::from_subpieces( + chip, + layouter.namespace(|| "j"), + [ + j_0, + j_1, + RangeConstrained::bitrange_of(Value::known(&pallas::Base::zero()), 0..8), + ], + )?; + + Ok((j, j_0, j_1)) + } + + fn assign( + &self, + layouter: &mut impl Layouter, + j: NoteCommitPiece, + j_0: RangeConstrained>, + j_1: RangeConstrained>, + ) -> Result, Error> { + layouter.assign_region( + || "NoteCommit MessagePiece j", + |mut region| { + self.q_notecommit_j.enable(&mut region, 0)?; + + j.inner() + .cell_value() + .copy_advice(|| "j", &mut region, self.col_l, 0)?; + let j_0 = region.assign_advice(|| "j_0", self.col_m, 0, || *j_0.inner())?; + j_1.inner() + .copy_advice(|| "j_1", &mut region, self.col_r, 0)?; + + Ok(j_0) + }, + ) + } +} + /// | A_6 | A_7 | A_8 | A_9 | q_notecommit_g_d | /// ----------------------------------------------------------- /// | x(g_d) | b_0 | a | z13_a | 1 | @@ -811,23 +967,29 @@ impl GdCanonicity { ) } } - -/// | A_6 | A_7 | A_8 | A_9 | q_notecommit_pk_d | -/// ------------------------------------------------------------------- -/// | x(pk_d) | b_3 | c | z13_c | 1 | -/// | | d_0 | b3_c_prime | z14_b3_c_prime | 0 | +/// For pk_d +/// | A_6 | A_7 | A_8 | A_9 | q_notecommit_pk_d_asset | +/// ------------------------------------------------------------------------- +/// | x(pk_d) | b_3 | c | z13_c | 1 | +/// | | d_0 | b3_c_prime | z14_b3_c_prime | 0 | +/// +/// For asset +/// | A_6 | A_7 | A_8 | A_9 | q_notecommit_pk_d_asset | +/// ------------------------------------------------------------------------------ +/// | x(asset) | h_2_zsa | i | z13_i | 1 | +/// | | j_0 | h2_i_prime | z14_h2_i_prime | 0 | /// /// #[derive(Clone, Debug)] -struct PkdCanonicity { - q_notecommit_pk_d: Selector, +struct PkdAssetCanonicity { + q_notecommit_pk_d_asset: Selector, col_l: Column, col_m: Column, col_r: Column, col_z: Column, } -impl PkdCanonicity { +impl PkdAssetCanonicity { #[allow(clippy::too_many_arguments)] fn configure( meta: &mut ConstraintSystem, @@ -840,10 +1002,13 @@ impl PkdCanonicity { two_pow_254: pallas::Base, t_p: Expression, ) -> Self { - let q_notecommit_pk_d = meta.selector(); + let q_notecommit_pk_d_asset = meta.selector(); - meta.create_gate("NoteCommit input pk_d", |meta| { - let q_notecommit_pk_d = meta.query_selector(q_notecommit_pk_d); + meta.create_gate("NoteCommit input pk_d or asset", |meta| { + // The comments and variable names are for `pk_d` + // This gate is also used with `asset`. + // We have just to replace `pk_d`, `b_3`, `c`, `d_0` by `asset`, `h_2_zsa`, `i`, `j_0` + let q_notecommit_pk_d_asset = meta.query_selector(q_notecommit_pk_d_asset); let pkd_x = meta.query_advice(col_l, Rotation::cur()); @@ -876,7 +1041,7 @@ impl PkdCanonicity { .map(move |(name, poly)| (name, d_0.clone() * poly)); Constraints::with_selector( - q_notecommit_pk_d, + q_notecommit_pk_d_asset, iter::empty() .chain(Some(("decomposition", decomposition_check))) .chain(Some(("b3_c_prime_check", b3_c_prime_check))) @@ -885,7 +1050,7 @@ impl PkdCanonicity { }); Self { - q_notecommit_pk_d, + q_notecommit_pk_d_asset, col_l, col_m, col_r, @@ -895,6 +1060,9 @@ impl PkdCanonicity { #[allow(clippy::too_many_arguments)] fn assign( + // This function is used for `pk_d` and `asset`. + // For `pk_d`, inputs are `pk_d`, `b_3`, `c`, `d_0`, `b3_c_prime`, `z13_c`, `z14_b3_c_prime` + // For `asset`, inputs are `asset`, `h_2_zsa`, `i`, `j_0`, `h2_i_prime`, `z13_i`, `z14_h2_i_prime` &self, layouter: &mut impl Layouter, pk_d: &NonIdentityEccPoint, @@ -906,7 +1074,7 @@ impl PkdCanonicity { z14_b3_c_prime: AssignedCell, ) -> Result<(), Error> { layouter.assign_region( - || "NoteCommit input pk_d", + || "NoteCommit input pk_d or asset", |mut region| { pk_d.x() .copy_advice(|| "pkd_x", &mut region, self.col_l, 0)?; @@ -923,7 +1091,7 @@ impl PkdCanonicity { z13_c.copy_advice(|| "z13_c", &mut region, self.col_z, 0)?; z14_b3_c_prime.copy_advice(|| "z14_b3_c_prime", &mut region, self.col_z, 1)?; - self.q_notecommit_pk_d.enable(&mut region, 0) + self.q_notecommit_pk_d_asset.enable(&mut region, 0) }, ) } @@ -1418,8 +1586,9 @@ pub struct NoteCommitConfig { e: DecomposeE, g: DecomposeG, h: DecomposeH, + j: DecomposeJ, g_d: GdCanonicity, - pk_d: PkdCanonicity, + pk_d_asset: PkdAssetCanonicity, value: ValueCanonicity, rho: RhoCanonicity, psi: PsiCanonicity, @@ -1474,7 +1643,8 @@ impl NoteCommitChip { let d = DecomposeD::configure(meta, col_l, col_m, col_r, two, two_pow_2, two_pow_10); let e = DecomposeE::configure(meta, col_l, col_m, col_r, two_pow_6); let g = DecomposeG::configure(meta, col_l, col_m, two, two_pow_10); - let h = DecomposeH::configure(meta, col_l, col_m, col_r, two_pow_5); + let h = DecomposeH::configure(meta, col_l, col_m, col_r, two_pow_5, two_pow_6); + let j = DecomposeJ::configure(meta, col_l, col_m, col_r, two); let g_d = GdCanonicity::configure( meta, @@ -1488,7 +1658,7 @@ impl NoteCommitChip { t_p.clone(), ); - let pk_d = PkdCanonicity::configure( + let pk_d_asset = PkdAssetCanonicity::configure( meta, col_l, col_m, @@ -1545,8 +1715,9 @@ impl NoteCommitChip { e, g, h, + j, g_d, - pk_d, + pk_d_asset, value, rho, psi, @@ -1574,12 +1745,15 @@ pub(in crate::circuit) mod gadgets { chip: SinsemillaChip, ecc_chip: EccChip, note_commit_chip: NoteCommitChip, + cond_swap_chip: CondSwapChip, g_d: &NonIdentityEccPoint, pk_d: &NonIdentityEccPoint, value: AssignedCell, rho: AssignedCell, psi: AssignedCell, + asset: &NonIdentityEccPoint, rcm: ScalarFixed>, + is_native_asset: AssignedCell, ) -> Result>, Error> { let lookup_config = chip.config().lookup_config(); @@ -1623,10 +1797,22 @@ pub(in crate::circuit) mod gadgets { let (g, g_0, g_1) = DecomposeG::decompose(&lookup_config, chip.clone(), &mut layouter, &rho, &psi)?; - // h = h_0 || h_1 || h_2 + // h_zec = h_0 || h_1 || h_2_zec // = (bits 249..=253 of psi) || (bit 254 of psi) || 4 zero bits - let (h, h_0, h_1) = - DecomposeH::decompose(&lookup_config, chip.clone(), &mut layouter, &psi)?; + // h_zsa = h_0 || h_1 || h_2_zsa + // = (bits 249..=253 of psi) || (bit 254 of psi) || (bits 0..=3 of x(asset)) + let (h_zec, h_zsa, h_0, h_1, h_2_zsa) = + DecomposeH::decompose(&lookup_config, chip.clone(), &mut layouter, &psi, asset)?; + + // i = bits 4..=253 of asset + let i = MessagePiece::from_subpieces( + chip.clone(), + layouter.namespace(|| "i"), + [RangeConstrained::bitrange_of(asset.x().value(), 4..254)], + )?; + + // j = j_0 || j_1 || j_2 = (bit 254 of x(asset)) || (ỹ bit of asset) || 8 zero bits + let (j, j_0, j_1) = DecomposeJ::decompose(chip.clone(), &mut layouter, asset)?; // Check decomposition of `y(g_d)`. let b_2 = y_canonicity( @@ -1644,6 +1830,14 @@ pub(in crate::circuit) mod gadgets { pk_d.y(), d_1, )?; + // Check decomposition of `y(asset)`. + let j_1 = y_canonicity( + &lookup_config, + ¬e_commit_chip.config.y_canon, + layouter.namespace(|| "y(asset) decomposition"), + asset.y(), + j_1, + )?; // cm = NoteCommit^Orchard_rcm(g★_d || pk★_d || i2lebsp_{64}(v) || rho || psi) // @@ -1653,8 +1847,8 @@ pub(in crate::circuit) mod gadgets { // // https://p.z.cash/ZKS:action-cm-old-integrity?partial // https://p.z.cash/ZKS:action-cmx-new-integrity?partial - let (cm, zs) = { - let message = Message::from_pieces( + let (cm, zs_common, zs_zsa_suffix) = { + let message_common_prefix = Message::from_pieces( chip.clone(), vec![ a.clone(), @@ -1664,26 +1858,113 @@ pub(in crate::circuit) mod gadgets { e.clone(), f.clone(), g.clone(), - h.clone(), ], ); - let domain = CommitDomain::new(chip, ecc_chip, &OrchardCommitDomains::NoteCommit); - domain.commit( - layouter.namespace(|| "Process NoteCommit inputs"), - message, - rcm, - )? + + let message_suffix_zec = Message::from_pieces(chip.clone(), vec![h_zec.clone()]); + + let message_suffix_zsa = + Message::from_pieces(chip.clone(), vec![h_zsa.clone(), i.clone(), j.clone()]); + + // We will evaluate + // - `hash_point_zec = hash(Q_ZEC, message_common_prefix || message_suffix_zec)`, and + // - `hash_point_zsa = hash(Q_ZSA, message_common_prefix || message_suffix_zsa)`. + // by sharing a portion of the hash evaluation process between `hash_point_zec` and + // `hash_point_zsa`: + // 1. Q = if (is_native_asset == 0) {Q_ZSA} else {Q_ZEC} + // 2. common_hash = hash(Q, message_common_prefix) // this part is shared + // 3. hash_point_zec = hash(common_hash, message_suffix_zec) + // 4. hash_point_zsa = hash(common_hash, message_suffix_zsa) + // 5. hash_point = if (is_native_asset == 0) {hash_point_zsa} else {hash_point_zec} + let zec_domain = CommitDomain::new( + chip.clone(), + ecc_chip.clone(), + &OrchardCommitDomains::NoteCommit, + ); + let zsa_domain = + CommitDomain::new(chip, ecc_chip.clone(), &OrchardCommitDomains::NoteZsaCommit); + + // Perform a MUX to select the desired initial Q point + // q_init = q_init_zec if is_native_asset is true + // q_init = q_init_zsa if is_native_asset is false + let q_init = { + let q_init_zec = NonIdentityPoint::new( + ecc_chip.clone(), + layouter.namespace(|| "q_init_zec"), + Value::known(zec_domain.q_init()), + )?; + + let q_init_zsa = NonIdentityPoint::new( + ecc_chip.clone(), + layouter.namespace(|| "q_init_zsa"), + Value::known(zsa_domain.q_init()), + )?; + + cond_swap_chip.mux_on_non_identity_points( + layouter.namespace(|| "mux on hash point"), + &is_native_asset, + q_init_zsa.inner(), + q_init_zec.inner(), + )? + }; + + // common_hash = hash(q_init, message_common_prefix) + // + // To evaluate the different hash, we could use either zec_domain or zsa_domain + // because we use a private initial point. + let (common_hash, zs_common) = zec_domain.hash_with_private_init( + layouter.namespace(|| "hash common prefix note"), + &q_init, + message_common_prefix, + )?; + + // hash_point_zec = hash(common_hash, message_suffix_zec) = hash(q_init, message_zec) + let (hash_point_zec, _zs_zec) = zec_domain.hash_with_private_init( + layouter.namespace(|| "hash suffix ZEC note"), + common_hash.inner(), + message_suffix_zec, + )?; + + // hash_point_zsa = hash(common_hash, message_suffix_zsa) = hash(q_init, message_zsa) + let (hash_point_zsa, zs_zsa) = zec_domain.hash_with_private_init( + layouter.namespace(|| "hash suffix ZSA note"), + common_hash.inner(), + message_suffix_zsa, + )?; + + // Perform a MUX to select the desired hash point + // hash_point = hash_zec if is_native_asset is true + // hash_point = hash_zsa if is_native_asset is false + let hash_point = Point::from_inner( + ecc_chip, + cond_swap_chip.mux_on_points( + layouter.namespace(|| "mux on hash point"), + &is_native_asset, + &(hash_point_zsa.inner().clone().into()), + &(hash_point_zec.inner().clone().into()), + )?, + ); + + // To evaluate the blinding factor, we could use either zec_domain or zsa_domain + // because they have both the same `R` constant. + let blinding_factor = + zec_domain.blinding_factor(layouter.namespace(|| "[r] R"), rcm)?; + let commitment = + hash_point.add(layouter.namespace(|| "M + [r] R"), &blinding_factor)?; + + (commitment, zs_common, zs_zsa) }; - // `CommitDomain::commit` returns the running sum for each `MessagePiece`. Grab + // `CommitDomain::hash` returns the running sum for each `MessagePiece`. Grab // the outputs that we will need for canonicity checks. - let z13_a = zs[0][13].clone(); - let z13_c = zs[2][13].clone(); - let z1_d = zs[3][1].clone(); - let z13_f = zs[5][13].clone(); - let z1_g = zs[6][1].clone(); + let z13_a = zs_common[0][13].clone(); + let z13_c = zs_common[2][13].clone(); + let z1_d = zs_common[3][1].clone(); + let z13_f = zs_common[5][13].clone(); + let z1_g = zs_common[6][1].clone(); let g_2 = z1_g.clone(); - let z13_g = zs[6][13].clone(); + let z13_g = zs_common[6][13].clone(); + let z13_i = zs_zsa_suffix[1][13].clone(); // Witness and constrain the bounds we need to ensure canonicity. let (a_prime, z13_a_prime) = canon_bitshift_130( @@ -1692,13 +1973,20 @@ pub(in crate::circuit) mod gadgets { a.inner().cell_value(), )?; - let (b3_c_prime, z14_b3_c_prime) = pkd_x_canonicity( + let (b3_c_prime, z14_b3_c_prime) = pkd_asset_x_canonicity( &lookup_config, layouter.namespace(|| "x(pk_d) canonicity"), b_3.clone(), c.inner().cell_value(), )?; + let (h2_i_prime, z14_h2_i_prime) = pkd_asset_x_canonicity( + &lookup_config, + layouter.namespace(|| "x(asset) canonicity"), + h_2_zsa.clone(), + i.inner().cell_value(), + )?; + let (e1_f_prime, z14_e1_f_prime) = rho_canonicity( &lookup_config, layouter.namespace(|| "rho canonicity"), @@ -1730,12 +2018,21 @@ pub(in crate::circuit) mod gadgets { .g .assign(&mut layouter, g, g_0, g_1.clone(), z1_g.clone())?; - let h_1 = cfg.h.assign(&mut layouter, h, h_0.clone(), h_1)?; + let h_1 = cfg.h.assign( + &mut layouter, + h_zec, + h_zsa, + h_0.clone(), + h_1, + h_2_zsa.clone(), + )?; + + let j_0 = cfg.j.assign(&mut layouter, j, j_0, j_1)?; cfg.g_d .assign(&mut layouter, g_d, a, b_0, b_1, a_prime, z13_a, z13_a_prime)?; - cfg.pk_d.assign( + cfg.pk_d_asset.assign( &mut layouter, pk_d, b_3, @@ -1746,6 +2043,17 @@ pub(in crate::circuit) mod gadgets { z14_b3_c_prime, )?; + cfg.pk_d_asset.assign( + &mut layouter, + asset, + h_2_zsa, + i, + j_0, + h2_i_prime, + z13_i, + z14_h2_i_prime, + )?; + cfg.value.assign(&mut layouter, value, d_2, z1_d, e_0)?; cfg.rho.assign( @@ -1810,15 +2118,16 @@ pub(in crate::circuit) mod gadgets { Ok((a_prime, zs[13].clone())) } - /// Check canonicity of `x(pk_d)` encoding. + /// Check canonicity of `x(pk_d)` and `x(asset)` encoding. /// /// [Specification](https://p.z.cash/orchard-0.1:note-commit-canonicity-pk_d?partial). - fn pkd_x_canonicity( + fn pkd_asset_x_canonicity( lookup_config: &LookupRangeCheckConfig, mut layouter: impl Layouter, b_3: RangeConstrained>, c: AssignedCell, ) -> Result { + // Example for `x(pk_d)`: // `x(pk_d)` = `b_3 (4 bits) || c (250 bits) || d_0 (1 bit)` // - d_0 = 1 => b_3 + 2^4 c < t_P // - 0 ≤ b_3 + 2^4 c < 2^134 @@ -1828,6 +2137,7 @@ pub(in crate::circuit) mod gadgets { // - z_13 of SinsemillaHash(c) == 0 constrains bits 4..=253 of pkd_x // to 130 bits. z13_c is directly checked in the gate. // - 0 ≤ b_3 + 2^4 c + 2^140 - t_P < 2^140 (14 ten-bit lookups) + // For `x(asset)`, we have to replace `pk_d`, `b_3`, `c`, `d_0` by `asset`, `h_2_zsa`, `i`, `j_0` // Decompose the low 140 bits of b3_c_prime = b_3 + 2^4 c + 2^140 - t_P, // and output the running sum at the end of it. @@ -2013,18 +2323,14 @@ pub(in crate::circuit) mod gadgets { #[cfg(test)] mod tests { - use core::iter; - use super::NoteCommitConfig; use crate::{ circuit::{ - gadget::assign_free_advice, + gadget::{assign_free_advice, assign_is_native_asset}, note_commit::{gadgets, NoteCommitChip}, }, - constants::{ - fixed_bases::NOTE_COMMITMENT_PERSONALIZATION, OrchardCommitDomains, OrchardFixedBases, - OrchardHashDomains, L_ORCHARD_BASE, L_VALUE, T_Q, - }, + constants::{OrchardCommitDomains, OrchardFixedBases, OrchardHashDomains, T_Q}, + note::{commitment::NoteCommitTrapdoor, AssetBase, NoteCommitment}, value::NoteValue, }; use halo2_gadgets::{ @@ -2033,18 +2339,20 @@ mod tests { NonIdentityPoint, ScalarFixed, }, sinsemilla::chip::SinsemillaChip, - sinsemilla::primitives::CommitDomain, - utilities::lookup_range_check::LookupRangeCheckConfig, + utilities::{ + cond_swap::{CondSwapChip, CondSwapConfig}, + lookup_range_check::LookupRangeCheckConfig, + }, }; - use ff::{Field, PrimeField, PrimeFieldBits}; - use group::Curve; + use ff::{Field, PrimeField}; + use group::{Curve, Group, GroupEncoding}; use halo2_proofs::{ circuit::{Layouter, SimpleFloorPlanner, Value}, dev::MockProver, plonk::{Circuit, ConstraintSystem, Error}, }; - use pasta_curves::{arithmetic::CurveAffine, pallas}; + use pasta_curves::{arithmetic::CurveAffine, pallas, EpAffine}; use rand::{rngs::OsRng, RngCore}; @@ -2052,16 +2360,19 @@ mod tests { fn note_commit() { #[derive(Default)] struct MyCircuit { - gd_x: Value, - gd_y_lsb: Value, - pkd_x: Value, - pkd_y_lsb: Value, + g_d: Value, + pk_d: Value, rho: Value, psi: Value, + asset: Value, } impl Circuit for MyCircuit { - type Config = (NoteCommitConfig, EccConfig); + type Config = ( + NoteCommitConfig, + EccConfig, + CondSwapConfig, + ); type FloorPlanner = SimpleFloorPlanner; fn without_witnesses(&self) -> Self { @@ -2091,10 +2402,12 @@ mod tests { } let table_idx = meta.lookup_table_column(); + let table_range_check_tag = meta.lookup_table_column(); let lookup = ( table_idx, meta.lookup_table_column(), meta.lookup_table_column(), + table_range_check_tag, ); let lagrange_coeffs = [ meta.fixed_column(), @@ -2107,7 +2420,12 @@ mod tests { meta.fixed_column(), ]; - let range_check = LookupRangeCheckConfig::configure(meta, advices[9], table_idx); + let range_check = LookupRangeCheckConfig::configure( + meta, + advices[9], + table_idx, + table_range_check_tag, + ); let sinsemilla_config = SinsemillaChip::< OrchardHashDomains, OrchardCommitDomains, @@ -2130,7 +2448,10 @@ mod tests { range_check, ); - (note_commit_config, ecc_config) + let cond_swap_config = + CondSwapChip::configure(meta, advices[0..5].try_into().unwrap()); + + (note_commit_config, ecc_config, cond_swap_config) } fn synthesize( @@ -2138,7 +2459,7 @@ mod tests { config: Self::Config, mut layouter: impl Layouter, ) -> Result<(), Error> { - let (note_commit_config, ecc_config) = config; + let (note_commit_config, ecc_config, cond_swap_config) = config; // Load the Sinsemilla generator lookup table used by the whole circuit. SinsemillaChip::< @@ -2157,41 +2478,22 @@ mod tests { // Construct a NoteCommit chip let note_commit_chip = NoteCommitChip::construct(note_commit_config.clone()); + // Construct a CondSwap chip + let cond_swap_chip = CondSwapChip::construct(cond_swap_config); + // Witness g_d - let g_d = { - let g_d = self.gd_x.zip(self.gd_y_lsb).map(|(x, y_lsb)| { - // Calculate y = (x^3 + 5).sqrt() - let mut y = (x.square() * x + pallas::Affine::b()).sqrt().unwrap(); - if bool::from(y.is_odd() ^ y_lsb.is_odd()) { - y = -y; - } - pallas::Affine::from_xy(x, y).unwrap() - }); - - NonIdentityPoint::new( - ecc_chip.clone(), - layouter.namespace(|| "witness g_d"), - g_d, - )? - }; + let g_d = NonIdentityPoint::new( + ecc_chip.clone(), + layouter.namespace(|| "witness g_d"), + self.g_d, + )?; // Witness pk_d - let pk_d = { - let pk_d = self.pkd_x.zip(self.pkd_y_lsb).map(|(x, y_lsb)| { - // Calculate y = (x^3 + 5).sqrt() - let mut y = (x.square() * x + pallas::Affine::b()).sqrt().unwrap(); - if bool::from(y.is_odd() ^ y_lsb.is_odd()) { - y = -y; - } - pallas::Affine::from_xy(x, y).unwrap() - }); - - NonIdentityPoint::new( - ecc_chip.clone(), - layouter.namespace(|| "witness pk_d"), - pk_d, - )? - }; + let pk_d = NonIdentityPoint::new( + ecc_chip.clone(), + layouter.namespace(|| "witness pk_d"), + self.pk_d, + )?; // Witness a random non-negative u64 note value // A note value cannot be negative. @@ -2228,54 +2530,52 @@ mod tests { Value::known(rcm), )?; + let asset = NonIdentityPoint::new( + ecc_chip.clone(), + layouter.namespace(|| "witness asset"), + self.asset.map(|asset| asset.cv_base().to_affine()), + )?; + + let is_native_asset = assign_is_native_asset( + layouter.namespace(|| "witness is_native_asset"), + note_commit_config.advices[0], + self.asset, + )?; let cm = gadgets::note_commit( layouter.namespace(|| "Hash NoteCommit pieces"), sinsemilla_chip, ecc_chip.clone(), note_commit_chip, + cond_swap_chip, g_d.inner(), pk_d.inner(), value_var, rho, psi, + asset.inner(), rcm_gadget, + is_native_asset, )?; let expected_cm = { - let domain = CommitDomain::new(NOTE_COMMITMENT_PERSONALIZATION); // Hash g★_d || pk★_d || i2lebsp_{64}(v) || rho || psi - let lsb = |y_lsb: pallas::Base| y_lsb == pallas::Base::one(); let point = self - .gd_x - .zip(self.gd_y_lsb) - .zip(self.pkd_x.zip(self.pkd_y_lsb)) + .g_d + .zip(self.pk_d) .zip(self.rho.zip(self.psi)) - .map(|(((gd_x, gd_y_lsb), (pkd_x, pkd_y_lsb)), (rho, psi))| { - domain - .commit( - iter::empty() - .chain( - gd_x.to_le_bits().iter().by_vals().take(L_ORCHARD_BASE), - ) - .chain(Some(lsb(gd_y_lsb))) - .chain( - pkd_x - .to_le_bits() - .iter() - .by_vals() - .take(L_ORCHARD_BASE), - ) - .chain(Some(lsb(pkd_y_lsb))) - .chain(value.to_le_bits().iter().by_vals().take(L_VALUE)) - .chain( - rho.to_le_bits().iter().by_vals().take(L_ORCHARD_BASE), - ) - .chain( - psi.to_le_bits().iter().by_vals().take(L_ORCHARD_BASE), - ), - &rcm, - ) - .unwrap() - .to_affine() + .zip(self.asset) + .map(|(((g_d, pk_d), (rho, psi)), asset)| { + NoteCommitment::derive( + g_d.to_bytes(), + pk_d.to_bytes(), + value, + asset, + rho, + psi, + NoteCommitTrapdoor(rcm), + ) + .unwrap() + .inner() + .to_affine() }); NonIdentityPoint::new(ecc_chip, layouter.namespace(|| "witness cm"), point)? }; @@ -2283,74 +2583,132 @@ mod tests { } } + fn affine_point_from_coordinates(x_coord: pallas::Base, y_lsb: pallas::Base) -> EpAffine { + // Calculate y = (x^3 + 5).sqrt() + let mut y = (x_coord.square() * x_coord + pallas::Affine::b()) + .sqrt() + .unwrap(); + if bool::from(y.is_odd() ^ y_lsb.is_odd()) { + y = -y; + } + pallas::Affine::from_xy(x_coord, y).unwrap() + } + let two_pow_254 = pallas::Base::from_u128(1 << 127).square(); + let mut rng = OsRng; + let random_asset = AssetBase::random(); + // Test different values of `ak`, `nk` - let circuits = [ + let mut circuits = vec![]; + for asset in [random_asset, AssetBase::native()] { // `gd_x` = -1, `pkd_x` = -1 (these have to be x-coordinates of curve points) // `rho` = 0, `psi` = 0 - MyCircuit { - gd_x: Value::known(-pallas::Base::one()), - gd_y_lsb: Value::known(pallas::Base::one()), - pkd_x: Value::known(-pallas::Base::one()), - pkd_y_lsb: Value::known(pallas::Base::one()), + circuits.push(MyCircuit { + g_d: Value::known(affine_point_from_coordinates( + -pallas::Base::one(), + pallas::Base::one(), + )), + pk_d: Value::known(affine_point_from_coordinates( + -pallas::Base::one(), + pallas::Base::one(), + )), rho: Value::known(pallas::Base::zero()), psi: Value::known(pallas::Base::zero()), - }, + asset: Value::known(asset), + }); // `rho` = T_Q - 1, `psi` = T_Q - 1 - MyCircuit { - gd_x: Value::known(-pallas::Base::one()), - gd_y_lsb: Value::known(pallas::Base::zero()), - pkd_x: Value::known(-pallas::Base::one()), - pkd_y_lsb: Value::known(pallas::Base::zero()), + circuits.push(MyCircuit { + g_d: Value::known(affine_point_from_coordinates( + -pallas::Base::one(), + pallas::Base::zero(), + )), + pk_d: Value::known(affine_point_from_coordinates( + -pallas::Base::one(), + pallas::Base::zero(), + )), rho: Value::known(pallas::Base::from_u128(T_Q - 1)), psi: Value::known(pallas::Base::from_u128(T_Q - 1)), - }, + asset: Value::known(asset), + }); // `rho` = T_Q, `psi` = T_Q - MyCircuit { - gd_x: Value::known(-pallas::Base::one()), - gd_y_lsb: Value::known(pallas::Base::one()), - pkd_x: Value::known(-pallas::Base::one()), - pkd_y_lsb: Value::known(pallas::Base::zero()), + circuits.push(MyCircuit { + g_d: Value::known(affine_point_from_coordinates( + -pallas::Base::one(), + pallas::Base::one(), + )), + pk_d: Value::known(affine_point_from_coordinates( + -pallas::Base::one(), + pallas::Base::zero(), + )), rho: Value::known(pallas::Base::from_u128(T_Q)), psi: Value::known(pallas::Base::from_u128(T_Q)), - }, + asset: Value::known(asset), + }); // `rho` = 2^127 - 1, `psi` = 2^127 - 1 - MyCircuit { - gd_x: Value::known(-pallas::Base::one()), - gd_y_lsb: Value::known(pallas::Base::zero()), - pkd_x: Value::known(-pallas::Base::one()), - pkd_y_lsb: Value::known(pallas::Base::one()), + circuits.push(MyCircuit { + g_d: Value::known(affine_point_from_coordinates( + -pallas::Base::one(), + pallas::Base::zero(), + )), + pk_d: Value::known(affine_point_from_coordinates( + -pallas::Base::one(), + pallas::Base::one(), + )), rho: Value::known(pallas::Base::from_u128((1 << 127) - 1)), psi: Value::known(pallas::Base::from_u128((1 << 127) - 1)), - }, + asset: Value::known(asset), + }); // `rho` = 2^127, `psi` = 2^127 - MyCircuit { - gd_x: Value::known(-pallas::Base::one()), - gd_y_lsb: Value::known(pallas::Base::zero()), - pkd_x: Value::known(-pallas::Base::one()), - pkd_y_lsb: Value::known(pallas::Base::zero()), + circuits.push(MyCircuit { + g_d: Value::known(affine_point_from_coordinates( + -pallas::Base::one(), + pallas::Base::zero(), + )), + pk_d: Value::known(affine_point_from_coordinates( + -pallas::Base::one(), + pallas::Base::zero(), + )), rho: Value::known(pallas::Base::from_u128(1 << 127)), psi: Value::known(pallas::Base::from_u128(1 << 127)), - }, + asset: Value::known(asset), + }); // `rho` = 2^254 - 1, `psi` = 2^254 - 1 - MyCircuit { - gd_x: Value::known(-pallas::Base::one()), - gd_y_lsb: Value::known(pallas::Base::one()), - pkd_x: Value::known(-pallas::Base::one()), - pkd_y_lsb: Value::known(pallas::Base::one()), + circuits.push(MyCircuit { + g_d: Value::known(affine_point_from_coordinates( + -pallas::Base::one(), + pallas::Base::one(), + )), + pk_d: Value::known(affine_point_from_coordinates( + -pallas::Base::one(), + pallas::Base::one(), + )), rho: Value::known(two_pow_254 - pallas::Base::one()), psi: Value::known(two_pow_254 - pallas::Base::one()), - }, + asset: Value::known(asset), + }); // `rho` = 2^254, `psi` = 2^254 - MyCircuit { - gd_x: Value::known(-pallas::Base::one()), - gd_y_lsb: Value::known(pallas::Base::one()), - pkd_x: Value::known(-pallas::Base::one()), - pkd_y_lsb: Value::known(pallas::Base::zero()), + circuits.push(MyCircuit { + g_d: Value::known(affine_point_from_coordinates( + -pallas::Base::one(), + pallas::Base::one(), + )), + pk_d: Value::known(affine_point_from_coordinates( + -pallas::Base::one(), + pallas::Base::zero(), + )), rho: Value::known(two_pow_254), psi: Value::known(two_pow_254), - }, - ]; + asset: Value::known(asset), + }); + // Random values + circuits.push(MyCircuit { + g_d: Value::known(pallas::Point::random(rng).to_affine()), + pk_d: Value::known(pallas::Point::random(rng).to_affine()), + rho: Value::known(pallas::Base::random(&mut rng)), + psi: Value::known(pallas::Base::random(&mut rng)), + asset: Value::known(asset), + }); + } for circuit in circuits.iter() { let prover = MockProver::::run(11, circuit, vec![]).unwrap(); diff --git a/src/circuit/value_commit_orchard.rs b/src/circuit/value_commit_orchard.rs new file mode 100644 index 000000000..d9871a5bc --- /dev/null +++ b/src/circuit/value_commit_orchard.rs @@ -0,0 +1,341 @@ +pub(in crate::circuit) mod gadgets { + use pasta_curves::pallas; + + use crate::constants::{ + OrchardCommitDomains, OrchardFixedBases, OrchardFixedBasesFull, OrchardHashDomains, + }; + use halo2_gadgets::{ + ecc::{chip::EccChip, FixedPoint, NonIdentityPoint, Point, ScalarFixed, ScalarVar}, + sinsemilla::{self, chip::SinsemillaChip}, + }; + use halo2_proofs::{ + circuit::{AssignedCell, Chip, Layouter}, + plonk, + }; + + /// `ValueCommit^Orchard` from [Section 5.4.8.3 Homomorphic Pedersen commitments (Sapling and Orchard)]. + /// + /// [Section 5.4.8.3 Homomorphic Pedersen commitments (Sapling and Orchard)]: https://zips.z.cash/protocol/protocol.pdf#concretehomomorphiccommit + pub(in crate::circuit) fn value_commit_orchard( + mut layouter: impl Layouter, + sinsemilla_chip: SinsemillaChip< + OrchardHashDomains, + OrchardCommitDomains, + OrchardFixedBases, + >, + ecc_chip: EccChip, + v_net_magnitude_sign: ( + AssignedCell, + AssignedCell, + ), + rcv: ScalarFixed>, + asset: NonIdentityPoint>, + ) -> Result>, plonk::Error> { + // Check that magnitude is 64 bits. + { + let lookup_config = sinsemilla_chip.config().lookup_config(); + let (magnitude_words, magnitude_extra_bits) = (6, 4); + assert_eq!( + magnitude_words * sinsemilla::primitives::K + magnitude_extra_bits, + 64 + ); + let magnitude_zs = lookup_config.copy_check( + layouter.namespace(|| "magnitude lowest 60 bits"), + v_net_magnitude_sign.0.clone(), + magnitude_words, // 6 windows of 10 bits. + false, // Do not constrain the result here. + )?; + assert_eq!(magnitude_zs.len(), magnitude_words + 1); + lookup_config.copy_short_check( + layouter.namespace(|| "magnitude highest 4 bits"), + magnitude_zs[magnitude_words].clone(), + magnitude_extra_bits, // The 7th window must be a 4 bits value. + )?; + } + + // Multiply asset by magnitude, using the long scalar mul. + // TODO: implement a new variable base multiplication which is optimized for 64-bit scalar + // (the long scalar mul is optimized for pallas::Base scalar (~255-bits)) + // + // commitment = [magnitude] asset + let commitment = { + let magnitude_scalar = ScalarVar::from_base( + ecc_chip.clone(), + layouter.namespace(|| "magnitude"), + &v_net_magnitude_sign.0, + )?; + let (commitment, _) = + asset.mul(layouter.namespace(|| "[magnitude] asset"), magnitude_scalar)?; + commitment + }; + + // signed_commitment = [sign] commitment = [v_net_magnitude_sign] asset + let signed_commitment = commitment.mul_sign( + layouter.namespace(|| "[sign] commitment"), + &v_net_magnitude_sign.1, + )?; + + // blind = [rcv] ValueCommitR + let (blind, _rcv) = { + let value_commit_r = OrchardFixedBasesFull::ValueCommitR; + let value_commit_r = FixedPoint::from_inner(ecc_chip, value_commit_r); + + // [rcv] ValueCommitR + value_commit_r.mul(layouter.namespace(|| "[rcv] ValueCommitR"), rcv)? + }; + + // [v] ValueCommitV + [rcv] ValueCommitR + signed_commitment.add(layouter.namespace(|| "cv"), &blind) + } +} + +#[cfg(test)] +mod tests { + use crate::{ + circuit::gadget::{assign_free_advice, value_commit_orchard}, + circuit::K, + constants::{OrchardCommitDomains, OrchardFixedBases, OrchardHashDomains}, + note::AssetBase, + value::{NoteValue, ValueCommitTrapdoor, ValueCommitment}, + }; + use halo2_gadgets::{ + ecc::{ + chip::{EccChip, EccConfig}, + NonIdentityPoint, ScalarFixed, + }, + sinsemilla::chip::{SinsemillaChip, SinsemillaConfig}, + utilities::lookup_range_check::LookupRangeCheckConfig, + }; + + use group::Curve; + use halo2_proofs::{ + circuit::{Layouter, SimpleFloorPlanner, Value}, + dev::MockProver, + plonk::{Advice, Circuit, Column, ConstraintSystem, Error, Instance}, + }; + use pasta_curves::pallas; + + use rand::{rngs::OsRng, RngCore}; + + #[test] + fn test_value_commit_orchard() { + #[derive(Clone, Debug)] + pub struct MyConfig { + primary: Column, + advices: [Column; 10], + ecc_config: EccConfig, + // Sinsemilla config is only used to initialize the table_idx lookup table in the same + // way as in the Orchard circuit + sinsemilla_config: + SinsemillaConfig, + } + #[derive(Default)] + struct MyCircuit { + v_old: Value, + v_new: Value, + rcv: Value, + asset: Value, + split_flag: Value, + } + + impl Circuit for MyCircuit { + type Config = MyConfig; + type FloorPlanner = SimpleFloorPlanner; + + fn without_witnesses(&self) -> Self { + Self::default() + } + + fn configure(meta: &mut ConstraintSystem) -> Self::Config { + let advices = [ + meta.advice_column(), + meta.advice_column(), + meta.advice_column(), + meta.advice_column(), + meta.advice_column(), + meta.advice_column(), + meta.advice_column(), + meta.advice_column(), + meta.advice_column(), + meta.advice_column(), + ]; + + for advice in advices.iter() { + meta.enable_equality(*advice); + } + + // Instance column used for public inputs + let primary = meta.instance_column(); + meta.enable_equality(primary); + + let table_idx = meta.lookup_table_column(); + let table_range_check_tag = meta.lookup_table_column(); + let lookup = ( + table_idx, + meta.lookup_table_column(), + meta.lookup_table_column(), + table_range_check_tag, + ); + + let lagrange_coeffs = [ + meta.fixed_column(), + meta.fixed_column(), + meta.fixed_column(), + meta.fixed_column(), + meta.fixed_column(), + meta.fixed_column(), + meta.fixed_column(), + meta.fixed_column(), + ]; + meta.enable_constant(lagrange_coeffs[0]); + + let range_check = LookupRangeCheckConfig::configure( + meta, + advices[9], + table_idx, + table_range_check_tag, + ); + + let sinsemilla_config = SinsemillaChip::configure( + meta, + advices[..5].try_into().unwrap(), + advices[6], + lagrange_coeffs[0], + lookup, + range_check, + ); + + MyConfig { + primary, + advices, + ecc_config: EccChip::::configure( + meta, + advices, + lagrange_coeffs, + range_check, + ), + sinsemilla_config, + } + } + + fn synthesize( + &self, + config: Self::Config, + mut layouter: impl Layouter, + ) -> Result<(), Error> { + // Load the Sinsemilla generator lookup table. + SinsemillaChip::load(config.sinsemilla_config.clone(), &mut layouter)?; + + // Construct an ECC chip + let ecc_chip = EccChip::construct(config.ecc_config); + + let sinsemilla_chip = SinsemillaChip::construct(config.sinsemilla_config.clone()); + + // Witness the magnitude and sign of v_net = v_old - v_new + let v_net_magnitude_sign = { + // v_net is equal to + // (-v_new) if split_flag = true + // v_old - v_new if split_flag = false + let v_net = self.split_flag.and_then(|split_flag| { + if split_flag { + Value::known(crate::value::NoteValue::zero()) - self.v_new + } else { + self.v_old - self.v_new + } + }); + + let magnitude_sign = v_net.map(|v_net| { + let (magnitude, sign) = v_net.magnitude_sign(); + ( + // magnitude is guaranteed to be an unsigned 64-bit value. + // Therefore, we can move it into the base field. + pallas::Base::from(magnitude), + match sign { + crate::value::Sign::Positive => pallas::Base::one(), + crate::value::Sign::Negative => -pallas::Base::one(), + }, + ) + }); + + let magnitude = assign_free_advice( + layouter.namespace(|| "v_net magnitude"), + config.advices[9], + magnitude_sign.map(|m_s| m_s.0), + )?; + let sign = assign_free_advice( + layouter.namespace(|| "v_net sign"), + config.advices[9], + magnitude_sign.map(|m_s| m_s.1), + )?; + (magnitude, sign) + }; + + // Witness rcv + let rcv = ScalarFixed::new( + ecc_chip.clone(), + layouter.namespace(|| "rcv"), + self.rcv.as_ref().map(|rcv| rcv.inner()), + )?; + + // Witness asset + let asset = NonIdentityPoint::new( + ecc_chip.clone(), + layouter.namespace(|| "witness asset"), + self.asset.map(|asset| asset.cv_base().to_affine()), + )?; + + // Evaluate cv_net with value_commit_orchard + let cv_net = value_commit_orchard( + layouter.namespace(|| "cv_net = ValueCommit^Orchard_rcv(v_net)"), + sinsemilla_chip, + ecc_chip, + v_net_magnitude_sign, + rcv, + asset, + )?; + + // Constrain cv_net to equal public input + layouter.constrain_instance(cv_net.inner().x().cell(), config.primary, 0)?; + layouter.constrain_instance(cv_net.inner().y().cell(), config.primary, 1) + } + } + + // Test different circuits + let mut rng = OsRng; + let mut circuits = vec![]; + let mut instances = vec![]; + let native_asset = AssetBase::native(); + let random_asset = AssetBase::random(); + for split_flag in [false, true] { + for asset in [native_asset, random_asset] { + let v_old = NoteValue::from_raw(rng.next_u64()); + let v_new = NoteValue::from_raw(rng.next_u64()); + let rcv = ValueCommitTrapdoor::random(&mut rng); + let v_net = if split_flag { + NoteValue::zero() - v_new + } else { + v_old - v_new + }; + circuits.push(MyCircuit { + v_old: Value::known(v_old), + v_new: Value::known(v_new), + rcv: Value::known(rcv), + asset: Value::known(asset), + split_flag: Value::known(split_flag), + }); + let expected_cv_net = ValueCommitment::derive(v_net, rcv, asset); + instances.push([[expected_cv_net.x(), expected_cv_net.y()]]); + } + } + + for (circuit, instance) in circuits.iter().zip(instances.iter()) { + let prover = MockProver::::run( + K, + circuit, + instance.iter().map(|p| p.to_vec()).collect(), + ) + .unwrap(); + assert_eq!(prover.verify(), Ok(())); + } + } +} diff --git a/src/circuit_description b/src/circuit_description index 8bb3759ed..6513b720e 100644 --- a/src/circuit_description +++ b/src/circuit_description @@ -7,62 +7,110 @@ PinnedVerificationKey { omega: 0x181b50ad5f32119e31cbd395426d600b7a9b88bcaaa1c24eef28545aada17813, }, cs: PinnedConstraintSystem { - num_fixed_columns: 29, + num_fixed_columns: 33, num_advice_columns: 10, num_instance_columns: 1, - num_selectors: 56, + num_selectors: 61, gates: [ Product( Product( Product( Product( - Product( - Product( + Fixed { + query_index: 21, + column_index: 21, + rotation: Rotation( + 0, + ), + }, + Sum( + Constant( + 0x0000000000000000000000000000000000000000000000000000000000000002, + ), + Negated( Fixed { - query_index: 18, - column_index: 18, + query_index: 21, + column_index: 21, rotation: Rotation( 0, ), }, - Sum( - Constant( - 0x0000000000000000000000000000000000000000000000000000000000000002, - ), - Negated( - Fixed { - query_index: 18, - column_index: 18, - rotation: Rotation( - 0, - ), - }, - ), - ), ), - Sum( - Constant( - 0x0000000000000000000000000000000000000000000000000000000000000003, - ), - Negated( - Fixed { - query_index: 18, - column_index: 18, - rotation: Rotation( - 0, - ), - }, + ), + ), + Sum( + Constant( + 0x0000000000000000000000000000000000000000000000000000000000000003, + ), + Negated( + Fixed { + query_index: 21, + column_index: 21, + rotation: Rotation( + 0, ), - ), + }, ), + ), + ), + Sum( + Constant( + 0x0000000000000000000000000000000000000000000000000000000000000004, + ), + Negated( + Fixed { + query_index: 21, + column_index: 21, + rotation: Rotation( + 0, + ), + }, + ), + ), + ), + Product( + Advice { + query_index: 8, + column_index: 8, + rotation: Rotation( + 0, + ), + }, + Sum( + Constant( + 0x0000000000000000000000000000000000000000000000000000000000000001, + ), + Negated( + Advice { + query_index: 8, + column_index: 8, + rotation: Rotation( + 0, + ), + }, + ), + ), + ), + ), + Product( + Product( + Product( + Product( + Fixed { + query_index: 21, + column_index: 21, + rotation: Rotation( + 0, + ), + }, Sum( Constant( - 0x0000000000000000000000000000000000000000000000000000000000000004, + 0x0000000000000000000000000000000000000000000000000000000000000002, ), Negated( Fixed { - query_index: 18, - column_index: 18, + query_index: 21, + column_index: 21, rotation: Rotation( 0, ), @@ -72,12 +120,12 @@ PinnedVerificationKey { ), Sum( Constant( - 0x0000000000000000000000000000000000000000000000000000000000000005, + 0x0000000000000000000000000000000000000000000000000000000000000003, ), Negated( Fixed { - query_index: 18, - column_index: 18, + query_index: 21, + column_index: 21, rotation: Rotation( 0, ), @@ -87,12 +135,12 @@ PinnedVerificationKey { ), Sum( Constant( - 0x0000000000000000000000000000000000000000000000000000000000000006, + 0x0000000000000000000000000000000000000000000000000000000000000004, ), Negated( Fixed { - query_index: 18, - column_index: 18, + query_index: 21, + column_index: 21, rotation: Rotation( 0, ), @@ -102,13 +150,29 @@ PinnedVerificationKey { ), Sum( Sum( - Advice { - query_index: 0, - column_index: 0, - rotation: Rotation( - 0, + Product( + Advice { + query_index: 0, + column_index: 0, + rotation: Rotation( + 0, + ), + }, + Sum( + Constant( + 0x0000000000000000000000000000000000000000000000000000000000000001, + ), + Negated( + Advice { + query_index: 8, + column_index: 8, + rotation: Rotation( + 0, + ), + }, + ), ), - }, + ), Negated( Advice { query_index: 1, @@ -143,53 +207,21 @@ PinnedVerificationKey { Product( Product( Product( - Product( - Product( - Fixed { - query_index: 18, - column_index: 18, - rotation: Rotation( - 0, - ), - }, - Sum( - Constant( - 0x0000000000000000000000000000000000000000000000000000000000000002, - ), - Negated( - Fixed { - query_index: 18, - column_index: 18, - rotation: Rotation( - 0, - ), - }, - ), - ), - ), - Sum( - Constant( - 0x0000000000000000000000000000000000000000000000000000000000000003, - ), - Negated( - Fixed { - query_index: 18, - column_index: 18, - rotation: Rotation( - 0, - ), - }, - ), + Fixed { + query_index: 21, + column_index: 21, + rotation: Rotation( + 0, ), - ), + }, Sum( Constant( - 0x0000000000000000000000000000000000000000000000000000000000000004, + 0x0000000000000000000000000000000000000000000000000000000000000002, ), Negated( Fixed { - query_index: 18, - column_index: 18, + query_index: 21, + column_index: 21, rotation: Rotation( 0, ), @@ -199,12 +231,12 @@ PinnedVerificationKey { ), Sum( Constant( - 0x0000000000000000000000000000000000000000000000000000000000000005, + 0x0000000000000000000000000000000000000000000000000000000000000003, ), Negated( Fixed { - query_index: 18, - column_index: 18, + query_index: 21, + column_index: 21, rotation: Rotation( 0, ), @@ -214,12 +246,12 @@ PinnedVerificationKey { ), Sum( Constant( - 0x0000000000000000000000000000000000000000000000000000000000000006, + 0x0000000000000000000000000000000000000000000000000000000000000004, ), Negated( Fixed { - query_index: 18, - column_index: 18, + query_index: 21, + column_index: 21, rotation: Rotation( 0, ), @@ -228,13 +260,29 @@ PinnedVerificationKey { ), ), Product( - Advice { - query_index: 0, - column_index: 0, - rotation: Rotation( - 0, + Sum( + Sum( + Advice { + query_index: 0, + column_index: 0, + rotation: Rotation( + 0, + ), + }, + Constant( + 0x0000000000000000000000000000000000000000000000000000000000000001, + ), ), - }, + Negated( + Advice { + query_index: 9, + column_index: 9, + rotation: Rotation( + 0, + ), + }, + ), + ), Sum( Advice { query_index: 4, @@ -259,53 +307,21 @@ PinnedVerificationKey { Product( Product( Product( - Product( - Product( + Fixed { + query_index: 21, + column_index: 21, + rotation: Rotation( + 0, + ), + }, + Sum( + Constant( + 0x0000000000000000000000000000000000000000000000000000000000000002, + ), + Negated( Fixed { - query_index: 18, - column_index: 18, - rotation: Rotation( - 0, - ), - }, - Sum( - Constant( - 0x0000000000000000000000000000000000000000000000000000000000000002, - ), - Negated( - Fixed { - query_index: 18, - column_index: 18, - rotation: Rotation( - 0, - ), - }, - ), - ), - ), - Sum( - Constant( - 0x0000000000000000000000000000000000000000000000000000000000000003, - ), - Negated( - Fixed { - query_index: 18, - column_index: 18, - rotation: Rotation( - 0, - ), - }, - ), - ), - ), - Sum( - Constant( - 0x0000000000000000000000000000000000000000000000000000000000000004, - ), - Negated( - Fixed { - query_index: 18, - column_index: 18, + query_index: 21, + column_index: 21, rotation: Rotation( 0, ), @@ -315,12 +331,12 @@ PinnedVerificationKey { ), Sum( Constant( - 0x0000000000000000000000000000000000000000000000000000000000000005, + 0x0000000000000000000000000000000000000000000000000000000000000003, ), Negated( Fixed { - query_index: 18, - column_index: 18, + query_index: 21, + column_index: 21, rotation: Rotation( 0, ), @@ -330,12 +346,12 @@ PinnedVerificationKey { ), Sum( Constant( - 0x0000000000000000000000000000000000000000000000000000000000000006, + 0x0000000000000000000000000000000000000000000000000000000000000004, ), Negated( Fixed { - query_index: 18, - column_index: 18, + query_index: 21, + column_index: 21, rotation: Rotation( 0, ), @@ -371,53 +387,21 @@ PinnedVerificationKey { Product( Product( Product( - Product( - Product( - Fixed { - query_index: 18, - column_index: 18, - rotation: Rotation( - 0, - ), - }, - Sum( - Constant( - 0x0000000000000000000000000000000000000000000000000000000000000002, - ), - Negated( - Fixed { - query_index: 18, - column_index: 18, - rotation: Rotation( - 0, - ), - }, - ), - ), - ), - Sum( - Constant( - 0x0000000000000000000000000000000000000000000000000000000000000003, - ), - Negated( - Fixed { - query_index: 18, - column_index: 18, - rotation: Rotation( - 0, - ), - }, - ), + Fixed { + query_index: 21, + column_index: 21, + rotation: Rotation( + 0, ), - ), + }, Sum( Constant( - 0x0000000000000000000000000000000000000000000000000000000000000004, + 0x0000000000000000000000000000000000000000000000000000000000000002, ), Negated( Fixed { - query_index: 18, - column_index: 18, + query_index: 21, + column_index: 21, rotation: Rotation( 0, ), @@ -427,12 +411,12 @@ PinnedVerificationKey { ), Sum( Constant( - 0x0000000000000000000000000000000000000000000000000000000000000005, + 0x0000000000000000000000000000000000000000000000000000000000000003, ), Negated( Fixed { - query_index: 18, - column_index: 18, + query_index: 21, + column_index: 21, rotation: Rotation( 0, ), @@ -442,12 +426,12 @@ PinnedVerificationKey { ), Sum( Constant( - 0x0000000000000000000000000000000000000000000000000000000000000006, + 0x0000000000000000000000000000000000000000000000000000000000000004, ), Negated( Fixed { - query_index: 18, - column_index: 18, + query_index: 21, + column_index: 21, rotation: Rotation( 0, ), @@ -483,53 +467,21 @@ PinnedVerificationKey { Product( Product( Product( - Product( - Product( - Fixed { - query_index: 18, - column_index: 18, - rotation: Rotation( - 0, - ), - }, - Sum( - Constant( - 0x0000000000000000000000000000000000000000000000000000000000000001, - ), - Negated( - Fixed { - query_index: 18, - column_index: 18, - rotation: Rotation( - 0, - ), - }, - ), - ), - ), - Sum( - Constant( - 0x0000000000000000000000000000000000000000000000000000000000000003, - ), - Negated( - Fixed { - query_index: 18, - column_index: 18, - rotation: Rotation( - 0, - ), - }, - ), + Fixed { + query_index: 21, + column_index: 21, + rotation: Rotation( + 0, ), - ), + }, Sum( Constant( - 0x0000000000000000000000000000000000000000000000000000000000000004, + 0x0000000000000000000000000000000000000000000000000000000000000002, ), Negated( Fixed { - query_index: 18, - column_index: 18, + query_index: 21, + column_index: 21, rotation: Rotation( 0, ), @@ -539,12 +491,12 @@ PinnedVerificationKey { ), Sum( Constant( - 0x0000000000000000000000000000000000000000000000000000000000000005, + 0x0000000000000000000000000000000000000000000000000000000000000003, ), Negated( Fixed { - query_index: 18, - column_index: 18, + query_index: 21, + column_index: 21, rotation: Rotation( 0, ), @@ -554,12 +506,12 @@ PinnedVerificationKey { ), Sum( Constant( - 0x0000000000000000000000000000000000000000000000000000000000000006, + 0x0000000000000000000000000000000000000000000000000000000000000004, ), Negated( Fixed { - query_index: 18, - column_index: 18, + query_index: 21, + column_index: 21, rotation: Rotation( 0, ), @@ -567,31 +519,27 @@ PinnedVerificationKey { ), ), ), - Sum( + Product( + Advice { + query_index: 9, + column_index: 9, + rotation: Rotation( + 0, + ), + }, Sum( - Advice { - query_index: 7, - column_index: 7, - rotation: Rotation( - 0, - ), - }, - Advice { - query_index: 8, - column_index: 8, - rotation: Rotation( - 0, - ), - }, - ), - Negated( - Advice { - query_index: 6, - column_index: 6, - rotation: Rotation( - 0, - ), - }, + Constant( + 0x0000000000000000000000000000000000000000000000000000000000000001, + ), + Negated( + Advice { + query_index: 9, + column_index: 9, + rotation: Rotation( + 0, + ), + }, + ), ), ), ), @@ -599,53 +547,21 @@ PinnedVerificationKey { Product( Product( Product( - Product( - Product( + Fixed { + query_index: 21, + column_index: 21, + rotation: Rotation( + 0, + ), + }, + Sum( + Constant( + 0x0000000000000000000000000000000000000000000000000000000000000002, + ), + Negated( Fixed { - query_index: 18, - column_index: 18, - rotation: Rotation( - 0, - ), - }, - Sum( - Constant( - 0x0000000000000000000000000000000000000000000000000000000000000001, - ), - Negated( - Fixed { - query_index: 18, - column_index: 18, - rotation: Rotation( - 0, - ), - }, - ), - ), - ), - Sum( - Constant( - 0x0000000000000000000000000000000000000000000000000000000000000002, - ), - Negated( - Fixed { - query_index: 18, - column_index: 18, - rotation: Rotation( - 0, - ), - }, - ), - ), - ), - Sum( - Constant( - 0x0000000000000000000000000000000000000000000000000000000000000004, - ), - Negated( - Fixed { - query_index: 18, - column_index: 18, + query_index: 21, + column_index: 21, rotation: Rotation( 0, ), @@ -655,12 +571,12 @@ PinnedVerificationKey { ), Sum( Constant( - 0x0000000000000000000000000000000000000000000000000000000000000005, + 0x0000000000000000000000000000000000000000000000000000000000000003, ), Negated( Fixed { - query_index: 18, - column_index: 18, + query_index: 21, + column_index: 21, rotation: Rotation( 0, ), @@ -670,12 +586,12 @@ PinnedVerificationKey { ), Sum( Constant( - 0x0000000000000000000000000000000000000000000000000000000000000006, + 0x0000000000000000000000000000000000000000000000000000000000000004, ), Negated( Fixed { - query_index: 18, - column_index: 18, + query_index: 21, + column_index: 21, rotation: Rotation( 0, ), @@ -683,34 +599,27 @@ PinnedVerificationKey { ), ), ), - Sum( - Product( - Scaled( - Advice { - query_index: 11, - column_index: 9, - rotation: Rotation( - -1, - ), - }, - 0x0000000000000000000000000000000000000000000000000000000000000400, + Product( + Advice { + query_index: 9, + column_index: 9, + rotation: Rotation( + 0, ), + }, + Sum( Advice { query_index: 10, - column_index: 9, + column_index: 0, rotation: Rotation( 1, ), }, - ), - Negated( - Advice { - query_index: 9, - column_index: 9, - rotation: Rotation( - 0, + Negated( + Constant( + 0x2f70597a8e3d0f42f7a86a704f9bb232fe04a37f2b5a7c8c2aa7bd6e3af94367, ), - }, + ), ), ), ), @@ -718,37 +627,21 @@ PinnedVerificationKey { Product( Product( Product( - Product( - Fixed { - query_index: 19, - column_index: 19, - rotation: Rotation( - 0, - ), - }, - Sum( - Constant( - 0x0000000000000000000000000000000000000000000000000000000000000002, - ), - Negated( - Fixed { - query_index: 19, - column_index: 19, - rotation: Rotation( - 0, - ), - }, - ), + Fixed { + query_index: 21, + column_index: 21, + rotation: Rotation( + 0, ), - ), + }, Sum( Constant( - 0x0000000000000000000000000000000000000000000000000000000000000003, + 0x0000000000000000000000000000000000000000000000000000000000000002, ), Negated( Fixed { - query_index: 19, - column_index: 19, + query_index: 21, + column_index: 21, rotation: Rotation( 0, ), @@ -758,12 +651,12 @@ PinnedVerificationKey { ), Sum( Constant( - 0x0000000000000000000000000000000000000000000000000000000000000004, + 0x0000000000000000000000000000000000000000000000000000000000000003, ), Negated( Fixed { - query_index: 19, - column_index: 19, + query_index: 21, + column_index: 21, rotation: Rotation( 0, ), @@ -771,102 +664,64 @@ PinnedVerificationKey { ), ), ), - Advice { - query_index: 0, - column_index: 0, - rotation: Rotation( - 0, - ), - }, - ), - Sum( Sum( - Product( - Advice { - query_index: 1, - column_index: 1, - rotation: Rotation( - 0, - ), - }, - Advice { - query_index: 1, - column_index: 1, + Constant( + 0x0000000000000000000000000000000000000000000000000000000000000004, + ), + Negated( + Fixed { + query_index: 21, + column_index: 21, rotation: Rotation( 0, ), }, ), + ), + ), + Product( + Advice { + query_index: 9, + column_index: 9, + rotation: Rotation( + 0, + ), + }, + Sum( + Advice { + query_index: 11, + column_index: 1, + rotation: Rotation( + 1, + ), + }, Negated( - Product( - Product( - Advice { - query_index: 0, - column_index: 0, - rotation: Rotation( - 0, - ), - }, - Advice { - query_index: 0, - column_index: 0, - rotation: Rotation( - 0, - ), - }, - ), - Advice { - query_index: 0, - column_index: 0, - rotation: Rotation( - 0, - ), - }, + Constant( + 0x2d0e5169311919af1e917f63136d6c421d9ea766a7ffe3dba413c47eaf5af28e, ), ), ), - Negated( - Constant( - 0x0000000000000000000000000000000000000000000000000000000000000005, - ), - ), ), ), Product( Product( Product( Product( - Product( - Fixed { - query_index: 19, - column_index: 19, - rotation: Rotation( - 0, - ), - }, - Sum( - Constant( - 0x0000000000000000000000000000000000000000000000000000000000000002, - ), - Negated( - Fixed { - query_index: 19, - column_index: 19, - rotation: Rotation( - 0, - ), - }, - ), + Fixed { + query_index: 21, + column_index: 21, + rotation: Rotation( + 0, ), - ), + }, Sum( Constant( - 0x0000000000000000000000000000000000000000000000000000000000000003, + 0x0000000000000000000000000000000000000000000000000000000000000002, ), Negated( Fixed { - query_index: 19, - column_index: 19, + query_index: 21, + column_index: 21, rotation: Rotation( 0, ), @@ -876,12 +731,12 @@ PinnedVerificationKey { ), Sum( Constant( - 0x0000000000000000000000000000000000000000000000000000000000000004, + 0x0000000000000000000000000000000000000000000000000000000000000003, ), Negated( Fixed { - query_index: 19, - column_index: 19, + query_index: 21, + column_index: 21, rotation: Rotation( 0, ), @@ -889,63 +744,96 @@ PinnedVerificationKey { ), ), ), - Advice { - query_index: 1, - column_index: 1, - rotation: Rotation( - 0, - ), - }, - ), - Sum( Sum( - Product( - Advice { - query_index: 1, - column_index: 1, - rotation: Rotation( - 0, - ), - }, - Advice { - query_index: 1, - column_index: 1, + Constant( + 0x0000000000000000000000000000000000000000000000000000000000000004, + ), + Negated( + Fixed { + query_index: 21, + column_index: 21, rotation: Rotation( 0, ), }, ), - Negated( + ), + ), + Product( + Product( + Sum( + Constant( + 0x0000000000000000000000000000000000000000000000000000000000000001, + ), + Negated( + Advice { + query_index: 9, + column_index: 9, + rotation: Rotation( + 0, + ), + }, + ), + ), + Sum( Product( - Product( + Sum( Advice { - query_index: 0, + query_index: 10, column_index: 0, rotation: Rotation( - 0, + 1, ), }, - Advice { - query_index: 0, - column_index: 0, - rotation: Rotation( - 0, + Negated( + Constant( + 0x2f70597a8e3d0f42f7a86a704f9bb232fe04a37f2b5a7c8c2aa7bd6e3af94367, ), - }, + ), ), Advice { - query_index: 0, - column_index: 0, + query_index: 12, + column_index: 2, rotation: Rotation( - 0, + 1, ), }, ), + Negated( + Constant( + 0x0000000000000000000000000000000000000000000000000000000000000001, + ), + ), ), ), - Negated( - Constant( - 0x0000000000000000000000000000000000000000000000000000000000000005, + Sum( + Product( + Sum( + Advice { + query_index: 11, + column_index: 1, + rotation: Rotation( + 1, + ), + }, + Negated( + Constant( + 0x2d0e5169311919af1e917f63136d6c421d9ea766a7ffe3dba413c47eaf5af28e, + ), + ), + ), + Advice { + query_index: 13, + column_index: 3, + rotation: Rotation( + 1, + ), + }, + ), + Negated( + Constant( + 0x0000000000000000000000000000000000000000000000000000000000000001, + ), ), ), ), @@ -955,20 +843,20 @@ PinnedVerificationKey { Product( Product( Fixed { - query_index: 19, - column_index: 19, + query_index: 21, + column_index: 21, rotation: Rotation( 0, ), }, Sum( Constant( - 0x0000000000000000000000000000000000000000000000000000000000000001, + 0x0000000000000000000000000000000000000000000000000000000000000002, ), Negated( Fixed { - query_index: 19, - column_index: 19, + query_index: 21, + column_index: 21, rotation: Rotation( 0, ), @@ -982,8 +870,8 @@ PinnedVerificationKey { ), Negated( Fixed { - query_index: 19, - column_index: 19, + query_index: 21, + column_index: 21, rotation: Rotation( 0, ), @@ -997,8 +885,8 @@ PinnedVerificationKey { ), Negated( Fixed { - query_index: 19, - column_index: 19, + query_index: 21, + column_index: 21, rotation: Rotation( 0, ), @@ -1006,45 +894,75 @@ PinnedVerificationKey { ), ), ), - Sum( + Product( Sum( - Product( + Constant( + 0x0000000000000000000000000000000000000000000000000000000000000001, + ), + Negated( Advice { - query_index: 1, - column_index: 1, + query_index: 8, + column_index: 8, rotation: Rotation( 0, ), }, + ), + ), + Sum( + Advice { + query_index: 14, + column_index: 4, + rotation: Rotation( + 1, + ), + }, + Negated( Advice { - query_index: 1, - column_index: 1, + query_index: 15, + column_index: 5, rotation: Rotation( - 0, + 1, ), }, ), - Negated( - Product( - Product( - Advice { - query_index: 0, - column_index: 0, - rotation: Rotation( - 0, - ), - }, - Advice { - query_index: 0, - column_index: 0, + ), + ), + ), + Product( + Product( + Product( + Product( + Fixed { + query_index: 21, + column_index: 21, + rotation: Rotation( + 0, + ), + }, + Sum( + Constant( + 0x0000000000000000000000000000000000000000000000000000000000000002, + ), + Negated( + Fixed { + query_index: 21, + column_index: 21, rotation: Rotation( 0, ), }, ), - Advice { - query_index: 0, - column_index: 0, + ), + ), + Sum( + Constant( + 0x0000000000000000000000000000000000000000000000000000000000000003, + ), + Negated( + Fixed { + query_index: 21, + column_index: 21, rotation: Rotation( 0, ), @@ -1052,32 +970,57 @@ PinnedVerificationKey { ), ), ), - Negated( + Sum( Constant( - 0x0000000000000000000000000000000000000000000000000000000000000005, + 0x0000000000000000000000000000000000000000000000000000000000000004, + ), + Negated( + Fixed { + query_index: 21, + column_index: 21, + rotation: Rotation( + 0, + ), + }, ), ), ), + Product( + Advice { + query_index: 8, + column_index: 8, + rotation: Rotation( + 0, + ), + }, + Advice { + query_index: 9, + column_index: 9, + rotation: Rotation( + 0, + ), + }, + ), ), Product( Product( Product( Product( Fixed { - query_index: 19, - column_index: 19, + query_index: 21, + column_index: 21, rotation: Rotation( 0, ), }, Sum( Constant( - 0x0000000000000000000000000000000000000000000000000000000000000001, + 0x0000000000000000000000000000000000000000000000000000000000000002, ), Negated( Fixed { - query_index: 19, - column_index: 19, + query_index: 21, + column_index: 21, rotation: Rotation( 0, ), @@ -1087,12 +1030,12 @@ PinnedVerificationKey { ), Sum( Constant( - 0x0000000000000000000000000000000000000000000000000000000000000002, + 0x0000000000000000000000000000000000000000000000000000000000000003, ), Negated( Fixed { - query_index: 19, - column_index: 19, + query_index: 21, + column_index: 21, rotation: Rotation( 0, ), @@ -1106,8 +1049,8 @@ PinnedVerificationKey { ), Negated( Fixed { - query_index: 19, - column_index: 19, + query_index: 21, + column_index: 21, rotation: Rotation( 0, ), @@ -1115,111 +1058,118 @@ PinnedVerificationKey { ), ), ), - Sum( + Product( + Sum( + Constant( + 0x0000000000000000000000000000000000000000000000000000000000000001, + ), + Negated( + Advice { + query_index: 16, + column_index: 6, + rotation: Rotation( + 1, + ), + }, + ), + ), + Sum( + Constant( + 0x0000000000000000000000000000000000000000000000000000000000000001, + ), + Negated( + Advice { + query_index: 9, + column_index: 9, + rotation: Rotation( + 0, + ), + }, + ), + ), + ), + ), + Product( + Product( Product( Product( + Fixed { + query_index: 21, + column_index: 21, + rotation: Rotation( + 0, + ), + }, Sum( - Sum( - Advice { - query_index: 12, - column_index: 2, - rotation: Rotation( - 1, - ), - }, - Advice { - query_index: 2, - column_index: 2, + Constant( + 0x0000000000000000000000000000000000000000000000000000000000000001, + ), + Negated( + Fixed { + query_index: 21, + column_index: 21, rotation: Rotation( 0, ), }, ), - Advice { - query_index: 0, - column_index: 0, - rotation: Rotation( - 0, - ), - }, ), - Sum( - Advice { - query_index: 0, - column_index: 0, + ), + Sum( + Constant( + 0x0000000000000000000000000000000000000000000000000000000000000003, + ), + Negated( + Fixed { + query_index: 21, + column_index: 21, rotation: Rotation( 0, ), }, - Negated( - Advice { - query_index: 2, - column_index: 2, - rotation: Rotation( - 0, - ), - }, - ), ), ), - Sum( - Advice { - query_index: 0, - column_index: 0, + ), + Sum( + Constant( + 0x0000000000000000000000000000000000000000000000000000000000000004, + ), + Negated( + Fixed { + query_index: 21, + column_index: 21, rotation: Rotation( 0, ), }, - Negated( - Advice { - query_index: 2, - column_index: 2, - rotation: Rotation( - 0, - ), - }, - ), ), ), - Negated( - Product( - Sum( - Advice { - query_index: 1, - column_index: 1, - rotation: Rotation( - 0, - ), - }, - Negated( - Advice { - query_index: 3, - column_index: 3, - rotation: Rotation( - 0, - ), - }, - ), + ), + Sum( + Sum( + Advice { + query_index: 7, + column_index: 7, + rotation: Rotation( + 0, ), - Sum( - Advice { - query_index: 1, - column_index: 1, - rotation: Rotation( - 0, - ), - }, - Negated( - Advice { - query_index: 3, - column_index: 3, - rotation: Rotation( - 0, - ), - }, - ), + }, + Advice { + query_index: 8, + column_index: 8, + rotation: Rotation( + 0, ), - ), + }, + ), + Negated( + Advice { + query_index: 6, + column_index: 6, + rotation: Rotation( + 0, + ), + }, ), ), ), @@ -1228,8 +1178,8 @@ PinnedVerificationKey { Product( Product( Fixed { - query_index: 19, - column_index: 19, + query_index: 21, + column_index: 21, rotation: Rotation( 0, ), @@ -1240,8 +1190,8 @@ PinnedVerificationKey { ), Negated( Fixed { - query_index: 19, - column_index: 19, + query_index: 21, + column_index: 21, rotation: Rotation( 0, ), @@ -1255,8 +1205,8 @@ PinnedVerificationKey { ), Negated( Fixed { - query_index: 19, - column_index: 19, + query_index: 21, + column_index: 21, rotation: Rotation( 0, ), @@ -1270,8 +1220,8 @@ PinnedVerificationKey { ), Negated( Fixed { - query_index: 19, - column_index: 19, + query_index: 21, + column_index: 21, rotation: Rotation( 0, ), @@ -1281,80 +1231,32 @@ PinnedVerificationKey { ), Sum( Product( - Sum( - Advice { - query_index: 13, - column_index: 3, - rotation: Rotation( - 1, - ), - }, + Scaled( Advice { - query_index: 3, - column_index: 3, + query_index: 18, + column_index: 9, rotation: Rotation( - 0, + -1, ), }, + 0x0000000000000000000000000000000000000000000000000000000000000400, ), - Sum( - Advice { - query_index: 0, - column_index: 0, - rotation: Rotation( - 0, - ), - }, - Negated( - Advice { - query_index: 2, - column_index: 2, - rotation: Rotation( - 0, - ), - }, + Advice { + query_index: 17, + column_index: 9, + rotation: Rotation( + 1, ), - ), + }, ), Negated( - Product( - Sum( - Advice { - query_index: 1, - column_index: 1, - rotation: Rotation( - 0, - ), - }, - Negated( - Advice { - query_index: 3, - column_index: 3, - rotation: Rotation( - 0, - ), - }, - ), - ), - Sum( - Advice { - query_index: 2, - column_index: 2, - rotation: Rotation( - 0, - ), - }, - Negated( - Advice { - query_index: 12, - column_index: 2, - rotation: Rotation( - 1, - ), - }, - ), + Advice { + query_index: 9, + column_index: 9, + rotation: Rotation( + 0, ), - ), + }, ), ), ), @@ -1362,21 +1264,37 @@ PinnedVerificationKey { Product( Product( Product( - Fixed { - query_index: 19, - column_index: 19, - rotation: Rotation( - 0, + Product( + Fixed { + query_index: 21, + column_index: 21, + rotation: Rotation( + 0, + ), + }, + Sum( + Constant( + 0x0000000000000000000000000000000000000000000000000000000000000001, + ), + Negated( + Fixed { + query_index: 21, + column_index: 21, + rotation: Rotation( + 0, + ), + }, + ), ), - }, + ), Sum( Constant( - 0x0000000000000000000000000000000000000000000000000000000000000001, + 0x0000000000000000000000000000000000000000000000000000000000000002, ), Negated( Fixed { - query_index: 19, - column_index: 19, + query_index: 21, + column_index: 21, rotation: Rotation( 0, ), @@ -1386,12 +1304,12 @@ PinnedVerificationKey { ), Sum( Constant( - 0x0000000000000000000000000000000000000000000000000000000000000002, + 0x0000000000000000000000000000000000000000000000000000000000000003, ), Negated( Fixed { - query_index: 19, - column_index: 19, + query_index: 21, + column_index: 21, rotation: Rotation( 0, ), @@ -1399,51 +1317,35 @@ PinnedVerificationKey { ), ), ), - Sum( - Constant( - 0x0000000000000000000000000000000000000000000000000000000000000003, - ), - Negated( - Fixed { - query_index: 19, - column_index: 19, - rotation: Rotation( - 0, - ), - }, + Advice { + query_index: 0, + column_index: 0, + rotation: Rotation( + 0, ), - ), + }, ), - Product( + Sum( Sum( - Advice { - query_index: 2, - column_index: 2, - rotation: Rotation( - 0, - ), - }, - Negated( + Product( Advice { - query_index: 0, - column_index: 0, + query_index: 1, + column_index: 1, + rotation: Rotation( + 0, + ), + }, + Advice { + query_index: 1, + column_index: 1, rotation: Rotation( 0, ), }, ), - ), - Sum( - Product( - Sum( - Advice { - query_index: 2, - column_index: 2, - rotation: Rotation( - 0, - ), - }, - Negated( + Negated( + Product( + Product( Advice { query_index: 0, column_index: 0, @@ -1451,58 +1353,66 @@ PinnedVerificationKey { 0, ), }, - ), - ), - Advice { - query_index: 4, - column_index: 4, - rotation: Rotation( - 0, - ), - }, - ), - Negated( - Sum( - Advice { - query_index: 3, - column_index: 3, - rotation: Rotation( - 0, - ), - }, - Negated( Advice { - query_index: 1, - column_index: 1, + query_index: 0, + column_index: 0, rotation: Rotation( 0, ), }, ), + Advice { + query_index: 0, + column_index: 0, + rotation: Rotation( + 0, + ), + }, ), ), ), + Negated( + Constant( + 0x0000000000000000000000000000000000000000000000000000000000000005, + ), + ), ), ), Product( Product( Product( Product( - Fixed { - query_index: 19, - column_index: 19, - rotation: Rotation( - 0, + Product( + Fixed { + query_index: 21, + column_index: 21, + rotation: Rotation( + 0, + ), + }, + Sum( + Constant( + 0x0000000000000000000000000000000000000000000000000000000000000001, + ), + Negated( + Fixed { + query_index: 21, + column_index: 21, + rotation: Rotation( + 0, + ), + }, + ), ), - }, + ), Sum( Constant( - 0x0000000000000000000000000000000000000000000000000000000000000001, + 0x0000000000000000000000000000000000000000000000000000000000000002, ), Negated( Fixed { - query_index: 19, - column_index: 19, + query_index: 21, + column_index: 21, rotation: Rotation( 0, ), @@ -1512,12 +1422,12 @@ PinnedVerificationKey { ), Sum( Constant( - 0x0000000000000000000000000000000000000000000000000000000000000002, + 0x0000000000000000000000000000000000000000000000000000000000000003, ), Negated( Fixed { - query_index: 19, - column_index: 19, + query_index: 21, + column_index: 21, rotation: Rotation( 0, ), @@ -1525,73 +1435,27 @@ PinnedVerificationKey { ), ), ), - Sum( - Constant( - 0x0000000000000000000000000000000000000000000000000000000000000003, - ), - Negated( - Fixed { - query_index: 19, - column_index: 19, - rotation: Rotation( - 0, - ), - }, + Advice { + query_index: 1, + column_index: 1, + rotation: Rotation( + 0, ), - ), + }, ), - Product( - Sum( - Constant( - 0x0000000000000000000000000000000000000000000000000000000000000001, - ), - Negated( - Product( - Sum( - Advice { - query_index: 2, - column_index: 2, - rotation: Rotation( - 0, - ), - }, - Negated( - Advice { - query_index: 0, - column_index: 0, - rotation: Rotation( - 0, - ), - }, - ), - ), - Advice { - query_index: 5, - column_index: 5, - rotation: Rotation( - 0, - ), - }, - ), - ), - ), + Sum( Sum( Product( - Product( - Constant( - 0x0000000000000000000000000000000000000000000000000000000000000002, + Advice { + query_index: 1, + column_index: 1, + rotation: Rotation( + 0, ), - Advice { - query_index: 1, - column_index: 1, - rotation: Rotation( - 0, - ), - }, - ), + }, Advice { - query_index: 4, - column_index: 4, + query_index: 1, + column_index: 1, rotation: Rotation( 0, ), @@ -1599,9 +1463,6 @@ PinnedVerificationKey { ), Negated( Product( - Constant( - 0x0000000000000000000000000000000000000000000000000000000000000003, - ), Product( Advice { query_index: 0, @@ -1618,9 +1479,21 @@ PinnedVerificationKey { ), }, ), + Advice { + query_index: 0, + column_index: 0, + rotation: Rotation( + 0, + ), + }, ), ), ), + Negated( + Constant( + 0x0000000000000000000000000000000000000000000000000000000000000005, + ), + ), ), ), Product( @@ -1628,20 +1501,20 @@ PinnedVerificationKey { Product( Product( Fixed { - query_index: 19, - column_index: 19, + query_index: 22, + column_index: 22, rotation: Rotation( 0, ), }, Sum( Constant( - 0x0000000000000000000000000000000000000000000000000000000000000001, + 0x0000000000000000000000000000000000000000000000000000000000000002, ), Negated( Fixed { - query_index: 19, - column_index: 19, + query_index: 22, + column_index: 22, rotation: Rotation( 0, ), @@ -1651,12 +1524,12 @@ PinnedVerificationKey { ), Sum( Constant( - 0x0000000000000000000000000000000000000000000000000000000000000002, + 0x0000000000000000000000000000000000000000000000000000000000000003, ), Negated( Fixed { - query_index: 19, - column_index: 19, + query_index: 22, + column_index: 22, rotation: Rotation( 0, ), @@ -1666,12 +1539,12 @@ PinnedVerificationKey { ), Sum( Constant( - 0x0000000000000000000000000000000000000000000000000000000000000003, + 0x0000000000000000000000000000000000000000000000000000000000000004, ), Negated( Fixed { - query_index: 19, - column_index: 19, + query_index: 22, + column_index: 22, rotation: Rotation( 0, ), @@ -1679,33 +1552,42 @@ PinnedVerificationKey { ), ), ), - Product( - Product( + Sum( + Sum( Product( Advice { - query_index: 0, - column_index: 0, + query_index: 1, + column_index: 1, rotation: Rotation( 0, ), }, Advice { - query_index: 2, - column_index: 2, + query_index: 1, + column_index: 1, rotation: Rotation( 0, ), }, ), - Sum( - Advice { - query_index: 2, - column_index: 2, - rotation: Rotation( - 0, + Negated( + Product( + Product( + Advice { + query_index: 0, + column_index: 0, + rotation: Rotation( + 0, + ), + }, + Advice { + query_index: 0, + column_index: 0, + rotation: Rotation( + 0, + ), + }, ), - }, - Negated( Advice { query_index: 0, column_index: 0, @@ -1716,35 +1598,124 @@ PinnedVerificationKey { ), ), ), - Sum( - Sum( + Negated( + Constant( + 0x0000000000000000000000000000000000000000000000000000000000000005, + ), + ), + ), + ), + Product( + Product( + Product( + Product( + Fixed { + query_index: 22, + column_index: 22, + rotation: Rotation( + 0, + ), + }, Sum( - Product( - Advice { - query_index: 4, - column_index: 4, + Constant( + 0x0000000000000000000000000000000000000000000000000000000000000001, + ), + Negated( + Fixed { + query_index: 22, + column_index: 22, rotation: Rotation( 0, ), }, + ), + ), + ), + Sum( + Constant( + 0x0000000000000000000000000000000000000000000000000000000000000003, + ), + Negated( + Fixed { + query_index: 22, + column_index: 22, + rotation: Rotation( + 0, + ), + }, + ), + ), + ), + Sum( + Constant( + 0x0000000000000000000000000000000000000000000000000000000000000004, + ), + Negated( + Fixed { + query_index: 22, + column_index: 22, + rotation: Rotation( + 0, + ), + }, + ), + ), + ), + Sum( + Product( + Product( + Sum( + Sum( Advice { - query_index: 4, - column_index: 4, + query_index: 12, + column_index: 2, + rotation: Rotation( + 1, + ), + }, + Advice { + query_index: 2, + column_index: 2, rotation: Rotation( 0, ), }, ), + Advice { + query_index: 0, + column_index: 0, + rotation: Rotation( + 0, + ), + }, + ), + Sum( + Advice { + query_index: 0, + column_index: 0, + rotation: Rotation( + 0, + ), + }, Negated( Advice { - query_index: 0, - column_index: 0, + query_index: 2, + column_index: 2, rotation: Rotation( 0, ), }, ), ), + ), + Sum( + Advice { + query_index: 0, + column_index: 0, + rotation: Rotation( + 0, + ), + }, Negated( Advice { query_index: 2, @@ -1755,14 +1726,45 @@ PinnedVerificationKey { }, ), ), - Negated( - Advice { - query_index: 12, - column_index: 2, - rotation: Rotation( - 1, + ), + Negated( + Product( + Sum( + Advice { + query_index: 1, + column_index: 1, + rotation: Rotation( + 0, + ), + }, + Negated( + Advice { + query_index: 3, + column_index: 3, + rotation: Rotation( + 0, + ), + }, ), - }, + ), + Sum( + Advice { + query_index: 1, + column_index: 1, + rotation: Rotation( + 0, + ), + }, + Negated( + Advice { + query_index: 3, + column_index: 3, + rotation: Rotation( + 0, + ), + }, + ), + ), ), ), ), @@ -1772,8 +1774,8 @@ PinnedVerificationKey { Product( Product( Fixed { - query_index: 19, - column_index: 19, + query_index: 22, + column_index: 22, rotation: Rotation( 0, ), @@ -1784,8 +1786,8 @@ PinnedVerificationKey { ), Negated( Fixed { - query_index: 19, - column_index: 19, + query_index: 22, + column_index: 22, rotation: Rotation( 0, ), @@ -1795,12 +1797,12 @@ PinnedVerificationKey { ), Sum( Constant( - 0x0000000000000000000000000000000000000000000000000000000000000002, + 0x0000000000000000000000000000000000000000000000000000000000000003, ), Negated( Fixed { - query_index: 19, - column_index: 19, + query_index: 22, + column_index: 22, rotation: Rotation( 0, ), @@ -1810,12 +1812,12 @@ PinnedVerificationKey { ), Sum( Constant( - 0x0000000000000000000000000000000000000000000000000000000000000003, + 0x0000000000000000000000000000000000000000000000000000000000000004, ), Negated( Fixed { - query_index: 19, - column_index: 19, + query_index: 22, + column_index: 22, rotation: Rotation( 0, ), @@ -1823,19 +1825,19 @@ PinnedVerificationKey { ), ), ), - Product( + Sum( Product( - Product( + Sum( Advice { - query_index: 0, - column_index: 0, + query_index: 13, + column_index: 3, rotation: Rotation( - 0, + 1, ), }, Advice { - query_index: 2, - column_index: 2, + query_index: 3, + column_index: 3, rotation: Rotation( 0, ), @@ -1843,16 +1845,16 @@ PinnedVerificationKey { ), Sum( Advice { - query_index: 2, - column_index: 2, + query_index: 0, + column_index: 0, rotation: Rotation( 0, ), }, Negated( Advice { - query_index: 0, - column_index: 0, + query_index: 2, + column_index: 2, rotation: Rotation( 0, ), @@ -1860,53 +1862,44 @@ PinnedVerificationKey { ), ), ), - Sum( - Sum( - Product( + Negated( + Product( + Sum( Advice { - query_index: 4, - column_index: 4, + query_index: 1, + column_index: 1, rotation: Rotation( 0, ), }, - Sum( + Negated( Advice { - query_index: 0, - column_index: 0, + query_index: 3, + column_index: 3, rotation: Rotation( 0, ), }, - Negated( - Advice { - query_index: 12, - column_index: 2, - rotation: Rotation( - 1, - ), - }, - ), ), ), - Negated( + Sum( Advice { - query_index: 1, - column_index: 1, + query_index: 2, + column_index: 2, rotation: Rotation( 0, ), }, - ), - ), - Negated( - Advice { - query_index: 13, - column_index: 3, - rotation: Rotation( - 1, + Negated( + Advice { + query_index: 12, + column_index: 2, + rotation: Rotation( + 1, + ), + }, ), - }, + ), ), ), ), @@ -1916,8 +1909,8 @@ PinnedVerificationKey { Product( Product( Fixed { - query_index: 19, - column_index: 19, + query_index: 22, + column_index: 22, rotation: Rotation( 0, ), @@ -1928,8 +1921,8 @@ PinnedVerificationKey { ), Negated( Fixed { - query_index: 19, - column_index: 19, + query_index: 22, + column_index: 22, rotation: Rotation( 0, ), @@ -1943,8 +1936,8 @@ PinnedVerificationKey { ), Negated( Fixed { - query_index: 19, - column_index: 19, + query_index: 22, + column_index: 22, rotation: Rotation( 0, ), @@ -1954,12 +1947,12 @@ PinnedVerificationKey { ), Sum( Constant( - 0x0000000000000000000000000000000000000000000000000000000000000003, + 0x0000000000000000000000000000000000000000000000000000000000000004, ), Negated( Fixed { - query_index: 19, - column_index: 19, + query_index: 22, + column_index: 22, rotation: Rotation( 0, ), @@ -1968,8 +1961,15 @@ PinnedVerificationKey { ), ), Product( - Product( - Product( + Sum( + Advice { + query_index: 2, + column_index: 2, + rotation: Rotation( + 0, + ), + }, + Negated( Advice { query_index: 0, column_index: 0, @@ -1977,79 +1977,195 @@ PinnedVerificationKey { 0, ), }, - Advice { - query_index: 2, - column_index: 2, - rotation: Rotation( - 0, - ), - }, ), - Sum( - Advice { - query_index: 3, - column_index: 3, - rotation: Rotation( - 0, + ), + Sum( + Product( + Sum( + Advice { + query_index: 2, + column_index: 2, + rotation: Rotation( + 0, + ), + }, + Negated( + Advice { + query_index: 0, + column_index: 0, + rotation: Rotation( + 0, + ), + }, ), - }, + ), Advice { - query_index: 1, - column_index: 1, + query_index: 4, + column_index: 4, rotation: Rotation( 0, ), }, ), - ), - Sum( - Sum( + Negated( Sum( - Product( + Advice { + query_index: 3, + column_index: 3, + rotation: Rotation( + 0, + ), + }, + Negated( Advice { - query_index: 4, - column_index: 4, + query_index: 1, + column_index: 1, rotation: Rotation( 0, ), }, - Advice { - query_index: 4, - column_index: 4, + ), + ), + ), + ), + ), + ), + Product( + Product( + Product( + Product( + Fixed { + query_index: 22, + column_index: 22, + rotation: Rotation( + 0, + ), + }, + Sum( + Constant( + 0x0000000000000000000000000000000000000000000000000000000000000001, + ), + Negated( + Fixed { + query_index: 22, + column_index: 22, rotation: Rotation( 0, ), }, ), - Negated( + ), + ), + Sum( + Constant( + 0x0000000000000000000000000000000000000000000000000000000000000002, + ), + Negated( + Fixed { + query_index: 22, + column_index: 22, + rotation: Rotation( + 0, + ), + }, + ), + ), + ), + Sum( + Constant( + 0x0000000000000000000000000000000000000000000000000000000000000004, + ), + Negated( + Fixed { + query_index: 22, + column_index: 22, + rotation: Rotation( + 0, + ), + }, + ), + ), + ), + Product( + Sum( + Constant( + 0x0000000000000000000000000000000000000000000000000000000000000001, + ), + Negated( + Product( + Sum( Advice { - query_index: 0, - column_index: 0, + query_index: 2, + column_index: 2, rotation: Rotation( 0, ), }, + Negated( + Advice { + query_index: 0, + column_index: 0, + rotation: Rotation( + 0, + ), + }, + ), ), - ), - Negated( Advice { - query_index: 2, - column_index: 2, + query_index: 5, + column_index: 5, rotation: Rotation( 0, ), }, ), ), - Negated( + ), + Sum( + Product( + Product( + Constant( + 0x0000000000000000000000000000000000000000000000000000000000000002, + ), + Advice { + query_index: 1, + column_index: 1, + rotation: Rotation( + 0, + ), + }, + ), Advice { - query_index: 12, - column_index: 2, + query_index: 4, + column_index: 4, rotation: Rotation( - 1, + 0, ), }, ), + Negated( + Product( + Constant( + 0x0000000000000000000000000000000000000000000000000000000000000003, + ), + Product( + Advice { + query_index: 0, + column_index: 0, + rotation: Rotation( + 0, + ), + }, + Advice { + query_index: 0, + column_index: 0, + rotation: Rotation( + 0, + ), + }, + ), + ), + ), ), ), ), @@ -2058,8 +2174,8 @@ PinnedVerificationKey { Product( Product( Fixed { - query_index: 19, - column_index: 19, + query_index: 22, + column_index: 22, rotation: Rotation( 0, ), @@ -2070,8 +2186,8 @@ PinnedVerificationKey { ), Negated( Fixed { - query_index: 19, - column_index: 19, + query_index: 22, + column_index: 22, rotation: Rotation( 0, ), @@ -2085,8 +2201,8 @@ PinnedVerificationKey { ), Negated( Fixed { - query_index: 19, - column_index: 19, + query_index: 22, + column_index: 22, rotation: Rotation( 0, ), @@ -2096,12 +2212,12 @@ PinnedVerificationKey { ), Sum( Constant( - 0x0000000000000000000000000000000000000000000000000000000000000003, + 0x0000000000000000000000000000000000000000000000000000000000000004, ), Negated( Fixed { - query_index: 19, - column_index: 19, + query_index: 22, + column_index: 22, rotation: Rotation( 0, ), @@ -2129,32 +2245,43 @@ PinnedVerificationKey { ), Sum( Advice { - query_index: 3, - column_index: 3, - rotation: Rotation( - 0, - ), - }, - Advice { - query_index: 1, - column_index: 1, + query_index: 2, + column_index: 2, rotation: Rotation( 0, ), }, - ), - ), - Sum( - Sum( - Product( + Negated( Advice { - query_index: 4, - column_index: 4, + query_index: 0, + column_index: 0, rotation: Rotation( 0, ), }, - Sum( + ), + ), + ), + Sum( + Sum( + Sum( + Product( + Advice { + query_index: 4, + column_index: 4, + rotation: Rotation( + 0, + ), + }, + Advice { + query_index: 4, + column_index: 4, + rotation: Rotation( + 0, + ), + }, + ), + Negated( Advice { query_index: 0, column_index: 0, @@ -2162,21 +2289,12 @@ PinnedVerificationKey { 0, ), }, - Negated( - Advice { - query_index: 12, - column_index: 2, - rotation: Rotation( - 1, - ), - }, - ), ), ), Negated( Advice { - query_index: 1, - column_index: 1, + query_index: 2, + column_index: 2, rotation: Rotation( 0, ), @@ -2185,8 +2303,8 @@ PinnedVerificationKey { ), Negated( Advice { - query_index: 13, - column_index: 3, + query_index: 12, + column_index: 2, rotation: Rotation( 1, ), @@ -2200,8 +2318,8 @@ PinnedVerificationKey { Product( Product( Fixed { - query_index: 19, - column_index: 19, + query_index: 22, + column_index: 22, rotation: Rotation( 0, ), @@ -2212,8 +2330,8 @@ PinnedVerificationKey { ), Negated( Fixed { - query_index: 19, - column_index: 19, + query_index: 22, + column_index: 22, rotation: Rotation( 0, ), @@ -2227,8 +2345,8 @@ PinnedVerificationKey { ), Negated( Fixed { - query_index: 19, - column_index: 19, + query_index: 22, + column_index: 22, rotation: Rotation( 0, ), @@ -2238,12 +2356,12 @@ PinnedVerificationKey { ), Sum( Constant( - 0x0000000000000000000000000000000000000000000000000000000000000003, + 0x0000000000000000000000000000000000000000000000000000000000000004, ), Negated( Fixed { - query_index: 19, - column_index: 19, + query_index: 22, + column_index: 22, rotation: Rotation( 0, ), @@ -2252,12 +2370,32 @@ PinnedVerificationKey { ), ), Product( - Sum( - Constant( - 0x0000000000000000000000000000000000000000000000000000000000000001, + Product( + Product( + Advice { + query_index: 0, + column_index: 0, + rotation: Rotation( + 0, + ), + }, + Advice { + query_index: 2, + column_index: 2, + rotation: Rotation( + 0, + ), + }, ), - Negated( - Product( + Sum( + Advice { + query_index: 2, + column_index: 2, + rotation: Rotation( + 0, + ), + }, + Negated( Advice { query_index: 0, column_index: 0, @@ -2265,30 +2403,54 @@ PinnedVerificationKey { 0, ), }, + ), + ), + ), + Sum( + Sum( + Product( Advice { - query_index: 6, - column_index: 6, + query_index: 4, + column_index: 4, + rotation: Rotation( + 0, + ), + }, + Sum( + Advice { + query_index: 0, + column_index: 0, + rotation: Rotation( + 0, + ), + }, + Negated( + Advice { + query_index: 12, + column_index: 2, + rotation: Rotation( + 1, + ), + }, + ), + ), + ), + Negated( + Advice { + query_index: 1, + column_index: 1, rotation: Rotation( 0, ), }, ), ), - ), - Sum( - Advice { - query_index: 12, - column_index: 2, - rotation: Rotation( - 1, - ), - }, Negated( Advice { - query_index: 2, - column_index: 2, + query_index: 13, + column_index: 3, rotation: Rotation( - 0, + 1, ), }, ), @@ -2300,8 +2462,8 @@ PinnedVerificationKey { Product( Product( Fixed { - query_index: 19, - column_index: 19, + query_index: 22, + column_index: 22, rotation: Rotation( 0, ), @@ -2312,8 +2474,8 @@ PinnedVerificationKey { ), Negated( Fixed { - query_index: 19, - column_index: 19, + query_index: 22, + column_index: 22, rotation: Rotation( 0, ), @@ -2327,8 +2489,8 @@ PinnedVerificationKey { ), Negated( Fixed { - query_index: 19, - column_index: 19, + query_index: 22, + column_index: 22, rotation: Rotation( 0, ), @@ -2338,12 +2500,12 @@ PinnedVerificationKey { ), Sum( Constant( - 0x0000000000000000000000000000000000000000000000000000000000000003, + 0x0000000000000000000000000000000000000000000000000000000000000004, ), Negated( Fixed { - query_index: 19, - column_index: 19, + query_index: 22, + column_index: 22, rotation: Rotation( 0, ), @@ -2352,38 +2514,24 @@ PinnedVerificationKey { ), ), Product( - Sum( - Constant( - 0x0000000000000000000000000000000000000000000000000000000000000001, - ), - Negated( - Product( - Advice { - query_index: 0, - column_index: 0, - rotation: Rotation( - 0, - ), - }, - Advice { - query_index: 6, - column_index: 6, - rotation: Rotation( - 0, - ), - }, - ), + Product( + Product( + Advice { + query_index: 0, + column_index: 0, + rotation: Rotation( + 0, + ), + }, + Advice { + query_index: 2, + column_index: 2, + rotation: Rotation( + 0, + ), + }, ), - ), - Sum( - Advice { - query_index: 13, - column_index: 3, - rotation: Rotation( - 1, - ), - }, - Negated( + Sum( Advice { query_index: 3, column_index: 3, @@ -2391,73 +2539,45 @@ PinnedVerificationKey { 0, ), }, - ), - ), - ), - ), - Product( - Product( - Product( - Product( - Fixed { - query_index: 19, - column_index: 19, + Advice { + query_index: 1, + column_index: 1, rotation: Rotation( 0, ), }, + ), + ), + Sum( + Sum( Sum( - Constant( - 0x0000000000000000000000000000000000000000000000000000000000000001, + Product( + Advice { + query_index: 4, + column_index: 4, + rotation: Rotation( + 0, + ), + }, + Advice { + query_index: 4, + column_index: 4, + rotation: Rotation( + 0, + ), + }, ), Negated( - Fixed { - query_index: 19, - column_index: 19, + Advice { + query_index: 0, + column_index: 0, rotation: Rotation( 0, ), }, ), ), - ), - Sum( - Constant( - 0x0000000000000000000000000000000000000000000000000000000000000002, - ), Negated( - Fixed { - query_index: 19, - column_index: 19, - rotation: Rotation( - 0, - ), - }, - ), - ), - ), - Sum( - Constant( - 0x0000000000000000000000000000000000000000000000000000000000000003, - ), - Negated( - Fixed { - query_index: 19, - column_index: 19, - rotation: Rotation( - 0, - ), - }, - ), - ), - ), - Product( - Sum( - Constant( - 0x0000000000000000000000000000000000000000000000000000000000000001, - ), - Negated( - Product( Advice { query_index: 2, column_index: 2, @@ -2465,30 +2585,14 @@ PinnedVerificationKey { 0, ), }, - Advice { - query_index: 7, - column_index: 7, - rotation: Rotation( - 0, - ), - }, ), ), - ), - Sum( - Advice { - query_index: 12, - column_index: 2, - rotation: Rotation( - 1, - ), - }, Negated( Advice { - query_index: 0, - column_index: 0, + query_index: 12, + column_index: 2, rotation: Rotation( - 0, + 1, ), }, ), @@ -2500,8 +2604,8 @@ PinnedVerificationKey { Product( Product( Fixed { - query_index: 19, - column_index: 19, + query_index: 22, + column_index: 22, rotation: Rotation( 0, ), @@ -2512,8 +2616,8 @@ PinnedVerificationKey { ), Negated( Fixed { - query_index: 19, - column_index: 19, + query_index: 22, + column_index: 22, rotation: Rotation( 0, ), @@ -2527,8 +2631,8 @@ PinnedVerificationKey { ), Negated( Fixed { - query_index: 19, - column_index: 19, + query_index: 22, + column_index: 22, rotation: Rotation( 0, ), @@ -2538,12 +2642,12 @@ PinnedVerificationKey { ), Sum( Constant( - 0x0000000000000000000000000000000000000000000000000000000000000003, + 0x0000000000000000000000000000000000000000000000000000000000000004, ), Negated( Fixed { - query_index: 19, - column_index: 19, + query_index: 22, + column_index: 22, rotation: Rotation( 0, ), @@ -2552,43 +2656,85 @@ PinnedVerificationKey { ), ), Product( - Sum( - Constant( - 0x0000000000000000000000000000000000000000000000000000000000000001, + Product( + Product( + Advice { + query_index: 0, + column_index: 0, + rotation: Rotation( + 0, + ), + }, + Advice { + query_index: 2, + column_index: 2, + rotation: Rotation( + 0, + ), + }, ), - Negated( + Sum( + Advice { + query_index: 3, + column_index: 3, + rotation: Rotation( + 0, + ), + }, + Advice { + query_index: 1, + column_index: 1, + rotation: Rotation( + 0, + ), + }, + ), + ), + Sum( + Sum( Product( Advice { - query_index: 2, - column_index: 2, + query_index: 4, + column_index: 4, rotation: Rotation( 0, ), }, + Sum( + Advice { + query_index: 0, + column_index: 0, + rotation: Rotation( + 0, + ), + }, + Negated( + Advice { + query_index: 12, + column_index: 2, + rotation: Rotation( + 1, + ), + }, + ), + ), + ), + Negated( Advice { - query_index: 7, - column_index: 7, + query_index: 1, + column_index: 1, rotation: Rotation( 0, ), }, ), ), - ), - Sum( - Advice { - query_index: 13, - column_index: 3, - rotation: Rotation( - 1, - ), - }, Negated( Advice { - query_index: 1, - column_index: 1, + query_index: 13, + column_index: 3, rotation: Rotation( - 0, + 1, ), }, ), @@ -2600,8 +2746,8 @@ PinnedVerificationKey { Product( Product( Fixed { - query_index: 19, - column_index: 19, + query_index: 22, + column_index: 22, rotation: Rotation( 0, ), @@ -2612,8 +2758,8 @@ PinnedVerificationKey { ), Negated( Fixed { - query_index: 19, - column_index: 19, + query_index: 22, + column_index: 22, rotation: Rotation( 0, ), @@ -2627,8 +2773,8 @@ PinnedVerificationKey { ), Negated( Fixed { - query_index: 19, - column_index: 19, + query_index: 22, + column_index: 22, rotation: Rotation( 0, ), @@ -2638,12 +2784,12 @@ PinnedVerificationKey { ), Sum( Constant( - 0x0000000000000000000000000000000000000000000000000000000000000003, + 0x0000000000000000000000000000000000000000000000000000000000000004, ), Negated( Fixed { - query_index: 19, - column_index: 19, + query_index: 22, + column_index: 22, rotation: Rotation( 0, ), @@ -2653,61 +2799,21 @@ PinnedVerificationKey { ), Product( Sum( - Sum( - Constant( - 0x0000000000000000000000000000000000000000000000000000000000000001, - ), - Negated( - Product( - Sum( - Advice { - query_index: 2, - column_index: 2, - rotation: Rotation( - 0, - ), - }, - Negated( - Advice { - query_index: 0, - column_index: 0, - rotation: Rotation( - 0, - ), - }, - ), - ), - Advice { - query_index: 5, - column_index: 5, - rotation: Rotation( - 0, - ), - }, - ), - ), + Constant( + 0x0000000000000000000000000000000000000000000000000000000000000001, ), Negated( Product( - Sum( - Advice { - query_index: 3, - column_index: 3, - rotation: Rotation( - 0, - ), - }, - Advice { - query_index: 1, - column_index: 1, - rotation: Rotation( - 0, - ), - }, - ), Advice { - query_index: 8, - column_index: 8, + query_index: 0, + column_index: 0, + rotation: Rotation( + 0, + ), + }, + Advice { + query_index: 6, + column_index: 6, rotation: Rotation( 0, ), @@ -2715,13 +2821,24 @@ PinnedVerificationKey { ), ), ), - Advice { - query_index: 12, - column_index: 2, - rotation: Rotation( - 1, + Sum( + Advice { + query_index: 12, + column_index: 2, + rotation: Rotation( + 1, + ), + }, + Negated( + Advice { + query_index: 2, + column_index: 2, + rotation: Rotation( + 0, + ), + }, ), - }, + ), ), ), Product( @@ -2729,8 +2846,8 @@ PinnedVerificationKey { Product( Product( Fixed { - query_index: 19, - column_index: 19, + query_index: 22, + column_index: 22, rotation: Rotation( 0, ), @@ -2741,8 +2858,8 @@ PinnedVerificationKey { ), Negated( Fixed { - query_index: 19, - column_index: 19, + query_index: 22, + column_index: 22, rotation: Rotation( 0, ), @@ -2756,8 +2873,8 @@ PinnedVerificationKey { ), Negated( Fixed { - query_index: 19, - column_index: 19, + query_index: 22, + column_index: 22, rotation: Rotation( 0, ), @@ -2767,12 +2884,12 @@ PinnedVerificationKey { ), Sum( Constant( - 0x0000000000000000000000000000000000000000000000000000000000000003, + 0x0000000000000000000000000000000000000000000000000000000000000004, ), Negated( Fixed { - query_index: 19, - column_index: 19, + query_index: 22, + column_index: 22, rotation: Rotation( 0, ), @@ -2782,61 +2899,21 @@ PinnedVerificationKey { ), Product( Sum( - Sum( - Constant( - 0x0000000000000000000000000000000000000000000000000000000000000001, - ), - Negated( - Product( - Sum( - Advice { - query_index: 2, - column_index: 2, - rotation: Rotation( - 0, - ), - }, - Negated( - Advice { - query_index: 0, - column_index: 0, - rotation: Rotation( - 0, - ), - }, - ), - ), - Advice { - query_index: 5, - column_index: 5, - rotation: Rotation( - 0, - ), - }, - ), - ), + Constant( + 0x0000000000000000000000000000000000000000000000000000000000000001, ), Negated( Product( - Sum( - Advice { - query_index: 3, - column_index: 3, - rotation: Rotation( - 0, - ), - }, - Advice { - query_index: 1, - column_index: 1, - rotation: Rotation( - 0, - ), - }, - ), Advice { - query_index: 8, - column_index: 8, + query_index: 0, + column_index: 0, + rotation: Rotation( + 0, + ), + }, + Advice { + query_index: 6, + column_index: 6, rotation: Rotation( 0, ), @@ -2844,66 +2921,45 @@ PinnedVerificationKey { ), ), ), - Advice { - query_index: 13, - column_index: 3, - rotation: Rotation( - 1, + Sum( + Advice { + query_index: 13, + column_index: 3, + rotation: Rotation( + 1, + ), + }, + Negated( + Advice { + query_index: 3, + column_index: 3, + rotation: Rotation( + 0, + ), + }, ), - }, + ), ), ), Product( Product( Product( Product( - Product( - Product( - Fixed { - query_index: 18, - column_index: 18, - rotation: Rotation( - 0, - ), - }, - Sum( - Constant( - 0x0000000000000000000000000000000000000000000000000000000000000001, - ), - Negated( - Fixed { - query_index: 18, - column_index: 18, - rotation: Rotation( - 0, - ), - }, - ), - ), - ), - Sum( - Constant( - 0x0000000000000000000000000000000000000000000000000000000000000002, - ), - Negated( - Fixed { - query_index: 18, - column_index: 18, - rotation: Rotation( - 0, - ), - }, - ), + Fixed { + query_index: 22, + column_index: 22, + rotation: Rotation( + 0, ), - ), + }, Sum( Constant( - 0x0000000000000000000000000000000000000000000000000000000000000003, + 0x0000000000000000000000000000000000000000000000000000000000000001, ), Negated( Fixed { - query_index: 18, - column_index: 18, + query_index: 22, + column_index: 22, rotation: Rotation( 0, ), @@ -2913,12 +2969,12 @@ PinnedVerificationKey { ), Sum( Constant( - 0x0000000000000000000000000000000000000000000000000000000000000005, + 0x0000000000000000000000000000000000000000000000000000000000000002, ), Negated( Fixed { - query_index: 18, - column_index: 18, + query_index: 22, + column_index: 22, rotation: Rotation( 0, ), @@ -2928,12 +2984,12 @@ PinnedVerificationKey { ), Sum( Constant( - 0x0000000000000000000000000000000000000000000000000000000000000006, + 0x0000000000000000000000000000000000000000000000000000000000000004, ), Negated( Fixed { - query_index: 18, - column_index: 18, + query_index: 22, + column_index: 22, rotation: Rotation( 0, ), @@ -2941,84 +2997,46 @@ PinnedVerificationKey { ), ), ), - Sum( - Advice { - query_index: 4, - column_index: 4, - rotation: Rotation( - 0, + Product( + Sum( + Constant( + 0x0000000000000000000000000000000000000000000000000000000000000001, ), - }, - Negated( - Scaled( + Negated( Product( - Sum( - Advice { - query_index: 14, - column_index: 4, - rotation: Rotation( - 1, - ), - }, - Advice { - query_index: 15, - column_index: 5, - rotation: Rotation( - 1, - ), - }, - ), - Sum( - Advice { - query_index: 13, - column_index: 3, - rotation: Rotation( - 1, - ), - }, - Negated( - Sum( - Sum( - Product( - Advice { - query_index: 14, - column_index: 4, - rotation: Rotation( - 1, - ), - }, - Advice { - query_index: 14, - column_index: 4, - rotation: Rotation( - 1, - ), - }, - ), - Negated( - Advice { - query_index: 13, - column_index: 3, - rotation: Rotation( - 1, - ), - }, - ), - ), - Negated( - Advice { - query_index: 16, - column_index: 0, - rotation: Rotation( - 1, - ), - }, - ), - ), + Advice { + query_index: 2, + column_index: 2, + rotation: Rotation( + 0, ), - ), + }, + Advice { + query_index: 7, + column_index: 7, + rotation: Rotation( + 0, + ), + }, ), - 0x2000000000000000000000000000000011234c7e04a67c8dcc96987680000001, + ), + ), + Sum( + Advice { + query_index: 12, + column_index: 2, + rotation: Rotation( + 1, + ), + }, + Negated( + Advice { + query_index: 0, + column_index: 0, + rotation: Rotation( + 0, + ), + }, ), ), ), @@ -3027,53 +3045,21 @@ PinnedVerificationKey { Product( Product( Product( - Product( - Product( - Fixed { - query_index: 18, - column_index: 18, - rotation: Rotation( - 0, - ), - }, - Sum( - Constant( - 0x0000000000000000000000000000000000000000000000000000000000000001, - ), - Negated( - Fixed { - query_index: 18, - column_index: 18, - rotation: Rotation( - 0, - ), - }, - ), - ), - ), - Sum( - Constant( - 0x0000000000000000000000000000000000000000000000000000000000000002, - ), - Negated( - Fixed { - query_index: 18, - column_index: 18, - rotation: Rotation( - 0, - ), - }, - ), + Fixed { + query_index: 22, + column_index: 22, + rotation: Rotation( + 0, ), - ), + }, Sum( Constant( - 0x0000000000000000000000000000000000000000000000000000000000000003, + 0x0000000000000000000000000000000000000000000000000000000000000001, ), Negated( Fixed { - query_index: 18, - column_index: 18, + query_index: 22, + column_index: 22, rotation: Rotation( 0, ), @@ -3083,12 +3069,12 @@ PinnedVerificationKey { ), Sum( Constant( - 0x0000000000000000000000000000000000000000000000000000000000000004, + 0x0000000000000000000000000000000000000000000000000000000000000002, ), Negated( Fixed { - query_index: 18, - column_index: 18, + query_index: 22, + column_index: 22, rotation: Rotation( 0, ), @@ -3098,12 +3084,12 @@ PinnedVerificationKey { ), Sum( Constant( - 0x0000000000000000000000000000000000000000000000000000000000000006, + 0x0000000000000000000000000000000000000000000000000000000000000004, ), Negated( Fixed { - query_index: 18, - column_index: 18, + query_index: 22, + column_index: 22, rotation: Rotation( 0, ), @@ -3111,76 +3097,69 @@ PinnedVerificationKey { ), ), ), - Sum( - Advice { - query_index: 0, - column_index: 0, - rotation: Rotation( - 0, - ), - }, - Negated( - Advice { - query_index: 16, - column_index: 0, - rotation: Rotation( - 1, - ), - }, - ), - ), - ), - Product( Product( - Product( - Product( - Product( - Product( - Fixed { - query_index: 18, - column_index: 18, - rotation: Rotation( - 0, - ), - }, - Sum( - Constant( - 0x0000000000000000000000000000000000000000000000000000000000000001, - ), - Negated( - Fixed { - query_index: 18, - column_index: 18, - rotation: Rotation( - 0, - ), - }, - ), - ), - ), - Sum( - Constant( - 0x0000000000000000000000000000000000000000000000000000000000000002, + Sum( + Constant( + 0x0000000000000000000000000000000000000000000000000000000000000001, + ), + Negated( + Product( + Advice { + query_index: 2, + column_index: 2, + rotation: Rotation( + 0, ), - Negated( - Fixed { - query_index: 18, - column_index: 18, - rotation: Rotation( - 0, - ), - }, + }, + Advice { + query_index: 7, + column_index: 7, + rotation: Rotation( + 0, ), - ), + }, + ), + ), + ), + Sum( + Advice { + query_index: 13, + column_index: 3, + rotation: Rotation( + 1, ), + }, + Negated( + Advice { + query_index: 1, + column_index: 1, + rotation: Rotation( + 0, + ), + }, + ), + ), + ), + ), + Product( + Product( + Product( + Product( + Fixed { + query_index: 22, + column_index: 22, + rotation: Rotation( + 0, + ), + }, Sum( Constant( - 0x0000000000000000000000000000000000000000000000000000000000000003, + 0x0000000000000000000000000000000000000000000000000000000000000001, ), Negated( Fixed { - query_index: 18, - column_index: 18, + query_index: 22, + column_index: 22, rotation: Rotation( 0, ), @@ -3190,12 +3169,12 @@ PinnedVerificationKey { ), Sum( Constant( - 0x0000000000000000000000000000000000000000000000000000000000000004, + 0x0000000000000000000000000000000000000000000000000000000000000002, ), Negated( Fixed { - query_index: 18, - column_index: 18, + query_index: 22, + column_index: 22, rotation: Rotation( 0, ), @@ -3205,12 +3184,12 @@ PinnedVerificationKey { ), Sum( Constant( - 0x0000000000000000000000000000000000000000000000000000000000000006, + 0x0000000000000000000000000000000000000000000000000000000000000004, ), Negated( Fixed { - query_index: 18, - column_index: 18, + query_index: 22, + column_index: 22, rotation: Rotation( 0, ), @@ -3218,76 +3197,98 @@ PinnedVerificationKey { ), ), ), - Sum( - Advice { - query_index: 1, - column_index: 1, - rotation: Rotation( - 0, - ), - }, - Negated( - Advice { - query_index: 17, - column_index: 1, - rotation: Rotation( - 1, - ), - }, - ), - ), - ), - Product( Product( - Product( - Product( - Product( + Sum( + Sum( + Constant( + 0x0000000000000000000000000000000000000000000000000000000000000001, + ), + Negated( Product( - Fixed { - query_index: 18, - column_index: 18, - rotation: Rotation( - 0, - ), - }, Sum( - Constant( - 0x0000000000000000000000000000000000000000000000000000000000000001, - ), + Advice { + query_index: 2, + column_index: 2, + rotation: Rotation( + 0, + ), + }, Negated( - Fixed { - query_index: 18, - column_index: 18, + Advice { + query_index: 0, + column_index: 0, rotation: Rotation( 0, ), }, ), ), + Advice { + query_index: 5, + column_index: 5, + rotation: Rotation( + 0, + ), + }, ), + ), + ), + Negated( + Product( Sum( - Constant( - 0x0000000000000000000000000000000000000000000000000000000000000002, - ), - Negated( - Fixed { - query_index: 18, - column_index: 18, - rotation: Rotation( - 0, - ), - }, - ), + Advice { + query_index: 3, + column_index: 3, + rotation: Rotation( + 0, + ), + }, + Advice { + query_index: 1, + column_index: 1, + rotation: Rotation( + 0, + ), + }, ), + Advice { + query_index: 8, + column_index: 8, + rotation: Rotation( + 0, + ), + }, ), + ), + ), + Advice { + query_index: 12, + column_index: 2, + rotation: Rotation( + 1, + ), + }, + ), + ), + Product( + Product( + Product( + Product( + Fixed { + query_index: 22, + column_index: 22, + rotation: Rotation( + 0, + ), + }, Sum( Constant( - 0x0000000000000000000000000000000000000000000000000000000000000003, + 0x0000000000000000000000000000000000000000000000000000000000000001, ), Negated( Fixed { - query_index: 18, - column_index: 18, + query_index: 22, + column_index: 22, rotation: Rotation( 0, ), @@ -3297,12 +3298,12 @@ PinnedVerificationKey { ), Sum( Constant( - 0x0000000000000000000000000000000000000000000000000000000000000004, + 0x0000000000000000000000000000000000000000000000000000000000000002, ), Negated( Fixed { - query_index: 18, - column_index: 18, + query_index: 22, + column_index: 22, rotation: Rotation( 0, ), @@ -3312,12 +3313,12 @@ PinnedVerificationKey { ), Sum( Constant( - 0x0000000000000000000000000000000000000000000000000000000000000006, + 0x0000000000000000000000000000000000000000000000000000000000000004, ), Negated( Fixed { - query_index: 18, - column_index: 18, + query_index: 22, + column_index: 22, rotation: Rotation( 0, ), @@ -3327,52 +3328,211 @@ PinnedVerificationKey { ), Product( Sum( - Advice { - query_index: 9, - column_index: 9, - rotation: Rotation( - 0, + Sum( + Constant( + 0x0000000000000000000000000000000000000000000000000000000000000001, ), - }, - Negated( - Scaled( - Advice { - query_index: 11, - column_index: 9, - rotation: Rotation( - -1, + Negated( + Product( + Sum( + Advice { + query_index: 2, + column_index: 2, + rotation: Rotation( + 0, + ), + }, + Negated( + Advice { + query_index: 0, + column_index: 0, + rotation: Rotation( + 0, + ), + }, + ), ), - }, - 0x0000000000000000000000000000000000000000000000000000000000000002, + Advice { + query_index: 5, + column_index: 5, + rotation: Rotation( + 0, + ), + }, + ), ), ), - ), - Sum( - Constant( - 0x0000000000000000000000000000000000000000000000000000000000000001, - ), Negated( - Sum( + Product( + Sum( + Advice { + query_index: 3, + column_index: 3, + rotation: Rotation( + 0, + ), + }, + Advice { + query_index: 1, + column_index: 1, + rotation: Rotation( + 0, + ), + }, + ), Advice { - query_index: 9, - column_index: 9, + query_index: 8, + column_index: 8, rotation: Rotation( 0, ), }, + ), + ), + ), + Advice { + query_index: 13, + column_index: 3, + rotation: Rotation( + 1, + ), + }, + ), + ), + Product( + Product( + Product( + Product( + Fixed { + query_index: 22, + column_index: 22, + rotation: Rotation( + 0, + ), + }, + Sum( + Constant( + 0x0000000000000000000000000000000000000000000000000000000000000001, + ), Negated( - Scaled( - Advice { - query_index: 11, - column_index: 9, - rotation: Rotation( - -1, + Fixed { + query_index: 22, + column_index: 22, + rotation: Rotation( + 0, + ), + }, + ), + ), + ), + Sum( + Constant( + 0x0000000000000000000000000000000000000000000000000000000000000002, + ), + Negated( + Fixed { + query_index: 22, + column_index: 22, + rotation: Rotation( + 0, + ), + }, + ), + ), + ), + Sum( + Constant( + 0x0000000000000000000000000000000000000000000000000000000000000003, + ), + Negated( + Fixed { + query_index: 22, + column_index: 22, + rotation: Rotation( + 0, + ), + }, + ), + ), + ), + Sum( + Advice { + query_index: 4, + column_index: 4, + rotation: Rotation( + 0, + ), + }, + Negated( + Scaled( + Product( + Sum( + Advice { + query_index: 14, + column_index: 4, + rotation: Rotation( + 1, + ), + }, + Advice { + query_index: 15, + column_index: 5, + rotation: Rotation( + 1, + ), + }, + ), + Sum( + Advice { + query_index: 13, + column_index: 3, + rotation: Rotation( + 1, + ), + }, + Negated( + Sum( + Sum( + Product( + Advice { + query_index: 14, + column_index: 4, + rotation: Rotation( + 1, + ), + }, + Advice { + query_index: 14, + column_index: 4, + rotation: Rotation( + 1, + ), + }, + ), + Negated( + Advice { + query_index: 13, + column_index: 3, + rotation: Rotation( + 1, + ), + }, + ), ), - }, - 0x0000000000000000000000000000000000000000000000000000000000000002, + Negated( + Advice { + query_index: 10, + column_index: 0, + rotation: Rotation( + 1, + ), + }, + ), + ), ), ), ), + 0x2000000000000000000000000000000011234c7e04a67c8dcc96987680000001, ), ), ), @@ -3384,20 +3544,20 @@ PinnedVerificationKey { Product( Product( Fixed { - query_index: 18, - column_index: 18, + query_index: 23, + column_index: 23, rotation: Rotation( 0, ), }, Sum( Constant( - 0x0000000000000000000000000000000000000000000000000000000000000001, + 0x0000000000000000000000000000000000000000000000000000000000000002, ), Negated( Fixed { - query_index: 18, - column_index: 18, + query_index: 23, + column_index: 23, rotation: Rotation( 0, ), @@ -3407,12 +3567,12 @@ PinnedVerificationKey { ), Sum( Constant( - 0x0000000000000000000000000000000000000000000000000000000000000002, + 0x0000000000000000000000000000000000000000000000000000000000000003, ), Negated( Fixed { - query_index: 18, - column_index: 18, + query_index: 23, + column_index: 23, rotation: Rotation( 0, ), @@ -3422,12 +3582,12 @@ PinnedVerificationKey { ), Sum( Constant( - 0x0000000000000000000000000000000000000000000000000000000000000003, + 0x0000000000000000000000000000000000000000000000000000000000000004, ), Negated( Fixed { - query_index: 18, - column_index: 18, + query_index: 23, + column_index: 23, rotation: Rotation( 0, ), @@ -3437,12 +3597,12 @@ PinnedVerificationKey { ), Sum( Constant( - 0x0000000000000000000000000000000000000000000000000000000000000004, + 0x0000000000000000000000000000000000000000000000000000000000000005, ), Negated( Fixed { - query_index: 18, - column_index: 18, + query_index: 23, + column_index: 23, rotation: Rotation( 0, ), @@ -3456,8 +3616,8 @@ PinnedVerificationKey { ), Negated( Fixed { - query_index: 18, - column_index: 18, + query_index: 23, + column_index: 23, rotation: Rotation( 0, ), @@ -3466,144 +3626,126 @@ PinnedVerificationKey { ), ), Sum( - Sum( + Advice { + query_index: 0, + column_index: 0, + rotation: Rotation( + 0, + ), + }, + Negated( + Advice { + query_index: 10, + column_index: 0, + rotation: Rotation( + 1, + ), + }, + ), + ), + ), + Product( + Product( + Product( Product( - Advice { - query_index: 4, - column_index: 4, - rotation: Rotation( - 0, - ), - }, - Sum( - Advice { - query_index: 3, - column_index: 3, - rotation: Rotation( - 0, - ), - }, - Negated( - Advice { - query_index: 0, - column_index: 0, + Product( + Product( + Fixed { + query_index: 23, + column_index: 23, rotation: Rotation( 0, ), }, - ), - ), - ), - Negated( - Scaled( - Product( Sum( - Advice { - query_index: 4, - column_index: 4, - rotation: Rotation( - 0, - ), - }, - Advice { - query_index: 5, - column_index: 5, - rotation: Rotation( - 0, - ), - }, + Constant( + 0x0000000000000000000000000000000000000000000000000000000000000002, + ), + Negated( + Fixed { + query_index: 23, + column_index: 23, + rotation: Rotation( + 0, + ), + }, + ), ), - Sum( - Advice { - query_index: 3, - column_index: 3, + ), + Sum( + Constant( + 0x0000000000000000000000000000000000000000000000000000000000000003, + ), + Negated( + Fixed { + query_index: 23, + column_index: 23, rotation: Rotation( 0, ), }, - Negated( - Sum( - Sum( - Product( - Advice { - query_index: 4, - column_index: 4, - rotation: Rotation( - 0, - ), - }, - Advice { - query_index: 4, - column_index: 4, - rotation: Rotation( - 0, - ), - }, - ), - Negated( - Advice { - query_index: 3, - column_index: 3, - rotation: Rotation( - 0, - ), - }, - ), - ), - Negated( - Advice { - query_index: 0, - column_index: 0, - rotation: Rotation( - 0, - ), - }, - ), - ), - ), ), ), - 0x2000000000000000000000000000000011234c7e04a67c8dcc96987680000001, ), - ), - ), - Product( - Sum( - Scaled( - Sum( - Advice { - query_index: 9, - column_index: 9, + Sum( + Constant( + 0x0000000000000000000000000000000000000000000000000000000000000004, + ), + Negated( + Fixed { + query_index: 23, + column_index: 23, rotation: Rotation( 0, ), }, - Negated( - Scaled( - Advice { - query_index: 11, - column_index: 9, - rotation: Rotation( - -1, - ), - }, - 0x0000000000000000000000000000000000000000000000000000000000000002, - ), - ), ), - 0x0000000000000000000000000000000000000000000000000000000000000002, + ), + ), + Sum( + Constant( + 0x0000000000000000000000000000000000000000000000000000000000000005, ), Negated( - Constant( - 0x0000000000000000000000000000000000000000000000000000000000000001, - ), + Fixed { + query_index: 23, + column_index: 23, + rotation: Rotation( + 0, + ), + }, ), ), + ), + Sum( + Constant( + 0x0000000000000000000000000000000000000000000000000000000000000006, + ), + Negated( + Fixed { + query_index: 23, + column_index: 23, + rotation: Rotation( + 0, + ), + }, + ), + ), + ), + Sum( + Advice { + query_index: 1, + column_index: 1, + rotation: Rotation( + 0, + ), + }, + Negated( Advice { - query_index: 1, + query_index: 11, column_index: 1, rotation: Rotation( - 0, + 1, ), }, ), @@ -3616,20 +3758,20 @@ PinnedVerificationKey { Product( Product( Fixed { - query_index: 18, - column_index: 18, + query_index: 23, + column_index: 23, rotation: Rotation( 0, ), }, Sum( Constant( - 0x0000000000000000000000000000000000000000000000000000000000000001, + 0x0000000000000000000000000000000000000000000000000000000000000002, ), Negated( Fixed { - query_index: 18, - column_index: 18, + query_index: 23, + column_index: 23, rotation: Rotation( 0, ), @@ -3639,12 +3781,12 @@ PinnedVerificationKey { ), Sum( Constant( - 0x0000000000000000000000000000000000000000000000000000000000000002, + 0x0000000000000000000000000000000000000000000000000000000000000003, ), Negated( Fixed { - query_index: 18, - column_index: 18, + query_index: 23, + column_index: 23, rotation: Rotation( 0, ), @@ -3654,12 +3796,12 @@ PinnedVerificationKey { ), Sum( Constant( - 0x0000000000000000000000000000000000000000000000000000000000000003, + 0x0000000000000000000000000000000000000000000000000000000000000004, ), Negated( Fixed { - query_index: 18, - column_index: 18, + query_index: 23, + column_index: 23, rotation: Rotation( 0, ), @@ -3669,12 +3811,12 @@ PinnedVerificationKey { ), Sum( Constant( - 0x0000000000000000000000000000000000000000000000000000000000000004, + 0x0000000000000000000000000000000000000000000000000000000000000005, ), Negated( Fixed { - query_index: 18, - column_index: 18, + query_index: 23, + column_index: 23, rotation: Rotation( 0, ), @@ -3688,8 +3830,8 @@ PinnedVerificationKey { ), Negated( Fixed { - query_index: 18, - column_index: 18, + query_index: 23, + column_index: 23, rotation: Rotation( 0, ), @@ -3697,85 +3839,56 @@ PinnedVerificationKey { ), ), ), - Sum( + Product( Sum( - Sum( - Product( - Advice { - query_index: 5, - column_index: 5, - rotation: Rotation( - 0, - ), - }, - Advice { - query_index: 5, - column_index: 5, - rotation: Rotation( - 0, - ), - }, + Advice { + query_index: 9, + column_index: 9, + rotation: Rotation( + 0, ), - Negated( + }, + Negated( + Scaled( Advice { - query_index: 13, - column_index: 3, + query_index: 18, + column_index: 9, rotation: Rotation( - 1, + -1, ), }, + 0x0000000000000000000000000000000000000000000000000000000000000002, ), ), + ), + Sum( + Constant( + 0x0000000000000000000000000000000000000000000000000000000000000001, + ), Negated( Sum( - Sum( - Product( - Advice { - query_index: 4, - column_index: 4, - rotation: Rotation( - 0, - ), - }, - Advice { - query_index: 4, - column_index: 4, - rotation: Rotation( - 0, - ), - }, + Advice { + query_index: 9, + column_index: 9, + rotation: Rotation( + 0, ), - Negated( + }, + Negated( + Scaled( Advice { - query_index: 3, - column_index: 3, + query_index: 18, + column_index: 9, rotation: Rotation( - 0, + -1, ), }, + 0x0000000000000000000000000000000000000000000000000000000000000002, ), ), - Negated( - Advice { - query_index: 0, - column_index: 0, - rotation: Rotation( - 0, - ), - }, - ), ), ), ), - Negated( - Advice { - query_index: 3, - column_index: 3, - rotation: Rotation( - 0, - ), - }, - ), ), ), Product( @@ -3785,20 +3898,20 @@ PinnedVerificationKey { Product( Product( Fixed { - query_index: 18, - column_index: 18, + query_index: 23, + column_index: 23, rotation: Rotation( 0, ), }, Sum( Constant( - 0x0000000000000000000000000000000000000000000000000000000000000001, + 0x0000000000000000000000000000000000000000000000000000000000000002, ), Negated( Fixed { - query_index: 18, - column_index: 18, + query_index: 23, + column_index: 23, rotation: Rotation( 0, ), @@ -3808,12 +3921,12 @@ PinnedVerificationKey { ), Sum( Constant( - 0x0000000000000000000000000000000000000000000000000000000000000002, + 0x0000000000000000000000000000000000000000000000000000000000000003, ), Negated( Fixed { - query_index: 18, - column_index: 18, + query_index: 23, + column_index: 23, rotation: Rotation( 0, ), @@ -3823,12 +3936,12 @@ PinnedVerificationKey { ), Sum( Constant( - 0x0000000000000000000000000000000000000000000000000000000000000003, + 0x0000000000000000000000000000000000000000000000000000000000000004, ), Negated( Fixed { - query_index: 18, - column_index: 18, + query_index: 23, + column_index: 23, rotation: Rotation( 0, ), @@ -3838,12 +3951,12 @@ PinnedVerificationKey { ), Sum( Constant( - 0x0000000000000000000000000000000000000000000000000000000000000004, + 0x0000000000000000000000000000000000000000000000000000000000000005, ), Negated( Fixed { - query_index: 18, - column_index: 18, + query_index: 23, + column_index: 23, rotation: Rotation( 0, ), @@ -3857,8 +3970,8 @@ PinnedVerificationKey { ), Negated( Fixed { - query_index: 18, - column_index: 18, + query_index: 23, + column_index: 23, rotation: Rotation( 0, ), @@ -3870,8 +3983,8 @@ PinnedVerificationKey { Sum( Product( Advice { - query_index: 5, - column_index: 5, + query_index: 4, + column_index: 4, rotation: Rotation( 0, ), @@ -3886,10 +3999,10 @@ PinnedVerificationKey { }, Negated( Advice { - query_index: 13, - column_index: 3, + query_index: 0, + column_index: 0, rotation: Rotation( - 1, + 0, ), }, ), @@ -3968,77 +4081,45 @@ PinnedVerificationKey { ), ), ), - Negated( - Scaled( - Product( - Sum( - Advice { - query_index: 14, - column_index: 4, - rotation: Rotation( - 1, - ), - }, - Advice { - query_index: 15, - column_index: 5, - rotation: Rotation( - 1, - ), - }, - ), + Product( + Sum( + Scaled( Sum( Advice { - query_index: 13, - column_index: 3, + query_index: 9, + column_index: 9, rotation: Rotation( - 1, + 0, ), }, Negated( - Sum( - Sum( - Product( - Advice { - query_index: 14, - column_index: 4, - rotation: Rotation( - 1, - ), - }, - Advice { - query_index: 14, - column_index: 4, - rotation: Rotation( - 1, - ), - }, - ), - Negated( - Advice { - query_index: 13, - column_index: 3, - rotation: Rotation( - 1, - ), - }, + Scaled( + Advice { + query_index: 18, + column_index: 9, + rotation: Rotation( + -1, ), - ), - Negated( - Advice { - query_index: 16, - column_index: 0, - rotation: Rotation( - 1, - ), - }, - ), + }, + 0x0000000000000000000000000000000000000000000000000000000000000002, ), ), ), + 0x0000000000000000000000000000000000000000000000000000000000000002, + ), + Negated( + Constant( + 0x0000000000000000000000000000000000000000000000000000000000000001, + ), ), - 0x2000000000000000000000000000000011234c7e04a67c8dcc96987680000001, ), + Advice { + query_index: 1, + column_index: 1, + rotation: Rotation( + 0, + ), + }, ), ), ), @@ -4049,20 +4130,20 @@ PinnedVerificationKey { Product( Product( Fixed { - query_index: 18, - column_index: 18, + query_index: 23, + column_index: 23, rotation: Rotation( 0, ), }, Sum( Constant( - 0x0000000000000000000000000000000000000000000000000000000000000001, + 0x0000000000000000000000000000000000000000000000000000000000000002, ), Negated( Fixed { - query_index: 18, - column_index: 18, + query_index: 23, + column_index: 23, rotation: Rotation( 0, ), @@ -4072,12 +4153,12 @@ PinnedVerificationKey { ), Sum( Constant( - 0x0000000000000000000000000000000000000000000000000000000000000002, + 0x0000000000000000000000000000000000000000000000000000000000000003, ), Negated( Fixed { - query_index: 18, - column_index: 18, + query_index: 23, + column_index: 23, rotation: Rotation( 0, ), @@ -4087,12 +4168,12 @@ PinnedVerificationKey { ), Sum( Constant( - 0x0000000000000000000000000000000000000000000000000000000000000003, + 0x0000000000000000000000000000000000000000000000000000000000000004, ), Negated( Fixed { - query_index: 18, - column_index: 18, + query_index: 23, + column_index: 23, rotation: Rotation( 0, ), @@ -4102,12 +4183,12 @@ PinnedVerificationKey { ), Sum( Constant( - 0x0000000000000000000000000000000000000000000000000000000000000004, + 0x0000000000000000000000000000000000000000000000000000000000000005, ), Negated( Fixed { - query_index: 18, - column_index: 18, + query_index: 23, + column_index: 23, rotation: Rotation( 0, ), @@ -4117,12 +4198,12 @@ PinnedVerificationKey { ), Sum( Constant( - 0x0000000000000000000000000000000000000000000000000000000000000005, + 0x0000000000000000000000000000000000000000000000000000000000000006, ), Negated( Fixed { - query_index: 18, - column_index: 18, + query_index: 23, + column_index: 23, rotation: Rotation( 0, ), @@ -4130,56 +4211,85 @@ PinnedVerificationKey { ), ), ), - Product( + Sum( Sum( - Advice { - query_index: 9, - column_index: 9, - rotation: Rotation( - 0, + Sum( + Product( + Advice { + query_index: 5, + column_index: 5, + rotation: Rotation( + 0, + ), + }, + Advice { + query_index: 5, + column_index: 5, + rotation: Rotation( + 0, + ), + }, ), - }, - Negated( - Scaled( + Negated( Advice { - query_index: 11, - column_index: 9, + query_index: 13, + column_index: 3, rotation: Rotation( - -1, + 1, ), }, - 0x0000000000000000000000000000000000000000000000000000000000000002, ), ), - ), - Sum( - Constant( - 0x0000000000000000000000000000000000000000000000000000000000000001, - ), Negated( Sum( - Advice { - query_index: 9, - column_index: 9, - rotation: Rotation( - 0, + Sum( + Product( + Advice { + query_index: 4, + column_index: 4, + rotation: Rotation( + 0, + ), + }, + Advice { + query_index: 4, + column_index: 4, + rotation: Rotation( + 0, + ), + }, ), - }, - Negated( - Scaled( + Negated( Advice { - query_index: 11, - column_index: 9, + query_index: 3, + column_index: 3, rotation: Rotation( - -1, + 0, ), }, - 0x0000000000000000000000000000000000000000000000000000000000000002, ), ), + Negated( + Advice { + query_index: 0, + column_index: 0, + rotation: Rotation( + 0, + ), + }, + ), ), ), ), + Negated( + Advice { + query_index: 3, + column_index: 3, + rotation: Rotation( + 0, + ), + }, + ), ), ), Product( @@ -4189,20 +4299,20 @@ PinnedVerificationKey { Product( Product( Fixed { - query_index: 18, - column_index: 18, + query_index: 23, + column_index: 23, rotation: Rotation( 0, ), }, Sum( Constant( - 0x0000000000000000000000000000000000000000000000000000000000000001, + 0x0000000000000000000000000000000000000000000000000000000000000002, ), Negated( Fixed { - query_index: 18, - column_index: 18, + query_index: 23, + column_index: 23, rotation: Rotation( 0, ), @@ -4212,12 +4322,12 @@ PinnedVerificationKey { ), Sum( Constant( - 0x0000000000000000000000000000000000000000000000000000000000000002, + 0x0000000000000000000000000000000000000000000000000000000000000003, ), Negated( Fixed { - query_index: 18, - column_index: 18, + query_index: 23, + column_index: 23, rotation: Rotation( 0, ), @@ -4227,12 +4337,12 @@ PinnedVerificationKey { ), Sum( Constant( - 0x0000000000000000000000000000000000000000000000000000000000000003, + 0x0000000000000000000000000000000000000000000000000000000000000004, ), Negated( Fixed { - query_index: 18, - column_index: 18, + query_index: 23, + column_index: 23, rotation: Rotation( 0, ), @@ -4242,12 +4352,12 @@ PinnedVerificationKey { ), Sum( Constant( - 0x0000000000000000000000000000000000000000000000000000000000000004, + 0x0000000000000000000000000000000000000000000000000000000000000005, ), Negated( Fixed { - query_index: 18, - column_index: 18, + query_index: 23, + column_index: 23, rotation: Rotation( 0, ), @@ -4257,12 +4367,12 @@ PinnedVerificationKey { ), Sum( Constant( - 0x0000000000000000000000000000000000000000000000000000000000000005, + 0x0000000000000000000000000000000000000000000000000000000000000006, ), Negated( Fixed { - query_index: 18, - column_index: 18, + query_index: 23, + column_index: 23, rotation: Rotation( 0, ), @@ -4274,8 +4384,8 @@ PinnedVerificationKey { Sum( Product( Advice { - query_index: 4, - column_index: 4, + query_index: 5, + column_index: 5, rotation: Rotation( 0, ), @@ -4290,10 +4400,10 @@ PinnedVerificationKey { }, Negated( Advice { - query_index: 0, - column_index: 0, + query_index: 13, + column_index: 3, rotation: Rotation( - 0, + 1, ), }, ), @@ -4372,45 +4482,77 @@ PinnedVerificationKey { ), ), ), - Product( - Sum( - Scaled( + Negated( + Scaled( + Product( Sum( Advice { - query_index: 9, - column_index: 9, + query_index: 14, + column_index: 4, rotation: Rotation( - 0, + 1, ), }, - Negated( - Scaled( - Advice { - query_index: 11, - column_index: 9, - rotation: Rotation( - -1, - ), - }, - 0x0000000000000000000000000000000000000000000000000000000000000002, + Advice { + query_index: 15, + column_index: 5, + rotation: Rotation( + 1, ), - ), + }, ), - 0x0000000000000000000000000000000000000000000000000000000000000002, - ), - Negated( - Constant( - 0x0000000000000000000000000000000000000000000000000000000000000001, + Sum( + Advice { + query_index: 13, + column_index: 3, + rotation: Rotation( + 1, + ), + }, + Negated( + Sum( + Sum( + Product( + Advice { + query_index: 14, + column_index: 4, + rotation: Rotation( + 1, + ), + }, + Advice { + query_index: 14, + column_index: 4, + rotation: Rotation( + 1, + ), + }, + ), + Negated( + Advice { + query_index: 13, + column_index: 3, + rotation: Rotation( + 1, + ), + }, + ), + ), + Negated( + Advice { + query_index: 10, + column_index: 0, + rotation: Rotation( + 1, + ), + }, + ), + ), + ), ), ), + 0x2000000000000000000000000000000011234c7e04a67c8dcc96987680000001, ), - Advice { - query_index: 1, - column_index: 1, - rotation: Rotation( - 0, - ), - }, ), ), ), @@ -4421,8 +4563,8 @@ PinnedVerificationKey { Product( Product( Fixed { - query_index: 18, - column_index: 18, + query_index: 23, + column_index: 23, rotation: Rotation( 0, ), @@ -4433,8 +4575,8 @@ PinnedVerificationKey { ), Negated( Fixed { - query_index: 18, - column_index: 18, + query_index: 23, + column_index: 23, rotation: Rotation( 0, ), @@ -4444,12 +4586,12 @@ PinnedVerificationKey { ), Sum( Constant( - 0x0000000000000000000000000000000000000000000000000000000000000002, + 0x0000000000000000000000000000000000000000000000000000000000000003, ), Negated( Fixed { - query_index: 18, - column_index: 18, + query_index: 23, + column_index: 23, rotation: Rotation( 0, ), @@ -4459,12 +4601,12 @@ PinnedVerificationKey { ), Sum( Constant( - 0x0000000000000000000000000000000000000000000000000000000000000003, + 0x0000000000000000000000000000000000000000000000000000000000000004, ), Negated( Fixed { - query_index: 18, - column_index: 18, + query_index: 23, + column_index: 23, rotation: Rotation( 0, ), @@ -4474,12 +4616,12 @@ PinnedVerificationKey { ), Sum( Constant( - 0x0000000000000000000000000000000000000000000000000000000000000004, + 0x0000000000000000000000000000000000000000000000000000000000000005, ), Negated( Fixed { - query_index: 18, - column_index: 18, + query_index: 23, + column_index: 23, rotation: Rotation( 0, ), @@ -4489,12 +4631,12 @@ PinnedVerificationKey { ), Sum( Constant( - 0x0000000000000000000000000000000000000000000000000000000000000005, + 0x0000000000000000000000000000000000000000000000000000000000000006, ), Negated( Fixed { - query_index: 18, - column_index: 18, + query_index: 23, + column_index: 23, rotation: Rotation( 0, ), @@ -4502,85 +4644,56 @@ PinnedVerificationKey { ), ), ), - Sum( + Product( Sum( - Sum( - Product( - Advice { - query_index: 5, - column_index: 5, - rotation: Rotation( - 0, - ), - }, - Advice { - query_index: 5, - column_index: 5, - rotation: Rotation( - 0, - ), - }, + Advice { + query_index: 9, + column_index: 9, + rotation: Rotation( + 0, ), - Negated( + }, + Negated( + Scaled( Advice { - query_index: 13, - column_index: 3, + query_index: 18, + column_index: 9, rotation: Rotation( - 1, + -1, ), }, + 0x0000000000000000000000000000000000000000000000000000000000000002, ), ), + ), + Sum( + Constant( + 0x0000000000000000000000000000000000000000000000000000000000000001, + ), Negated( Sum( - Sum( - Product( - Advice { - query_index: 4, - column_index: 4, - rotation: Rotation( - 0, - ), - }, - Advice { - query_index: 4, - column_index: 4, - rotation: Rotation( - 0, - ), - }, + Advice { + query_index: 9, + column_index: 9, + rotation: Rotation( + 0, ), - Negated( + }, + Negated( + Scaled( Advice { - query_index: 3, - column_index: 3, + query_index: 18, + column_index: 9, rotation: Rotation( - 0, + -1, ), }, + 0x0000000000000000000000000000000000000000000000000000000000000002, ), ), - Negated( - Advice { - query_index: 0, - column_index: 0, - rotation: Rotation( - 0, - ), - }, - ), ), ), ), - Negated( - Advice { - query_index: 3, - column_index: 3, - rotation: Rotation( - 0, - ), - }, - ), ), ), Product( @@ -4590,8 +4703,8 @@ PinnedVerificationKey { Product( Product( Fixed { - query_index: 18, - column_index: 18, + query_index: 23, + column_index: 23, rotation: Rotation( 0, ), @@ -4602,8 +4715,8 @@ PinnedVerificationKey { ), Negated( Fixed { - query_index: 18, - column_index: 18, + query_index: 23, + column_index: 23, rotation: Rotation( 0, ), @@ -4613,12 +4726,12 @@ PinnedVerificationKey { ), Sum( Constant( - 0x0000000000000000000000000000000000000000000000000000000000000002, + 0x0000000000000000000000000000000000000000000000000000000000000003, ), Negated( Fixed { - query_index: 18, - column_index: 18, + query_index: 23, + column_index: 23, rotation: Rotation( 0, ), @@ -4628,12 +4741,12 @@ PinnedVerificationKey { ), Sum( Constant( - 0x0000000000000000000000000000000000000000000000000000000000000003, + 0x0000000000000000000000000000000000000000000000000000000000000004, ), Negated( Fixed { - query_index: 18, - column_index: 18, + query_index: 23, + column_index: 23, rotation: Rotation( 0, ), @@ -4643,12 +4756,12 @@ PinnedVerificationKey { ), Sum( Constant( - 0x0000000000000000000000000000000000000000000000000000000000000004, + 0x0000000000000000000000000000000000000000000000000000000000000005, ), Negated( Fixed { - query_index: 18, - column_index: 18, + query_index: 23, + column_index: 23, rotation: Rotation( 0, ), @@ -4658,12 +4771,12 @@ PinnedVerificationKey { ), Sum( Constant( - 0x0000000000000000000000000000000000000000000000000000000000000005, + 0x0000000000000000000000000000000000000000000000000000000000000006, ), Negated( Fixed { - query_index: 18, - column_index: 18, + query_index: 23, + column_index: 23, rotation: Rotation( 0, ), @@ -4675,8 +4788,8 @@ PinnedVerificationKey { Sum( Product( Advice { - query_index: 5, - column_index: 5, + query_index: 4, + column_index: 4, rotation: Rotation( 0, ), @@ -4691,10 +4804,10 @@ PinnedVerificationKey { }, Negated( Advice { - query_index: 13, - column_index: 3, + query_index: 0, + column_index: 0, rotation: Rotation( - 1, + 0, ), }, ), @@ -4773,12 +4886,43 @@ PinnedVerificationKey { ), ), ), - Negated( + Product( + Sum( + Scaled( + Sum( + Advice { + query_index: 9, + column_index: 9, + rotation: Rotation( + 0, + ), + }, + Negated( + Scaled( + Advice { + query_index: 18, + column_index: 9, + rotation: Rotation( + -1, + ), + }, + 0x0000000000000000000000000000000000000000000000000000000000000002, + ), + ), + ), + 0x0000000000000000000000000000000000000000000000000000000000000002, + ), + Negated( + Constant( + 0x0000000000000000000000000000000000000000000000000000000000000001, + ), + ), + ), Advice { - query_index: 14, - column_index: 4, + query_index: 1, + column_index: 1, rotation: Rotation( - 1, + 0, ), }, ), @@ -4789,36 +4933,52 @@ PinnedVerificationKey { Product( Product( Product( - Fixed { - query_index: 20, - column_index: 20, - rotation: Rotation( - 0, - ), - }, - Sum( - Constant( - 0x0000000000000000000000000000000000000000000000000000000000000002, - ), - Negated( - Fixed { - query_index: 20, - column_index: 20, - rotation: Rotation( - 0, - ), - }, + Product( + Fixed { + query_index: 23, + column_index: 23, + rotation: Rotation( + 0, + ), + }, + Sum( + Constant( + 0x0000000000000000000000000000000000000000000000000000000000000001, + ), + Negated( + Fixed { + query_index: 23, + column_index: 23, + rotation: Rotation( + 0, + ), + }, + ), + ), + ), + Sum( + Constant( + 0x0000000000000000000000000000000000000000000000000000000000000003, + ), + Negated( + Fixed { + query_index: 23, + column_index: 23, + rotation: Rotation( + 0, + ), + }, ), ), ), Sum( Constant( - 0x0000000000000000000000000000000000000000000000000000000000000003, + 0x0000000000000000000000000000000000000000000000000000000000000004, ), Negated( Fixed { - query_index: 20, - column_index: 20, + query_index: 23, + column_index: 23, rotation: Rotation( 0, ), @@ -4828,12 +4988,12 @@ PinnedVerificationKey { ), Sum( Constant( - 0x0000000000000000000000000000000000000000000000000000000000000004, + 0x0000000000000000000000000000000000000000000000000000000000000005, ), Negated( Fixed { - query_index: 20, - column_index: 20, + query_index: 23, + column_index: 23, rotation: Rotation( 0, ), @@ -4843,12 +5003,12 @@ PinnedVerificationKey { ), Sum( Constant( - 0x0000000000000000000000000000000000000000000000000000000000000005, + 0x0000000000000000000000000000000000000000000000000000000000000006, ), Negated( Fixed { - query_index: 20, - column_index: 20, + query_index: 23, + column_index: 23, rotation: Rotation( 0, ), @@ -4857,85 +5017,84 @@ PinnedVerificationKey { ), ), Sum( - Advice { - query_index: 8, - column_index: 8, - rotation: Rotation( - 0, - ), - }, - Negated( - Scaled( + Sum( + Sum( Product( + Advice { + query_index: 5, + column_index: 5, + rotation: Rotation( + 0, + ), + }, + Advice { + query_index: 5, + column_index: 5, + rotation: Rotation( + 0, + ), + }, + ), + Negated( + Advice { + query_index: 13, + column_index: 3, + rotation: Rotation( + 1, + ), + }, + ), + ), + Negated( + Sum( Sum( - Advice { - query_index: 19, - column_index: 8, - rotation: Rotation( - 1, - ), - }, - Advice { - query_index: 12, - column_index: 2, - rotation: Rotation( - 1, - ), - }, + Product( + Advice { + query_index: 4, + column_index: 4, + rotation: Rotation( + 0, + ), + }, + Advice { + query_index: 4, + column_index: 4, + rotation: Rotation( + 0, + ), + }, + ), + Negated( + Advice { + query_index: 3, + column_index: 3, + rotation: Rotation( + 0, + ), + }, + ), ), - Sum( + Negated( Advice { - query_index: 18, - column_index: 7, + query_index: 0, + column_index: 0, rotation: Rotation( - 1, + 0, ), }, - Negated( - Sum( - Sum( - Product( - Advice { - query_index: 19, - column_index: 8, - rotation: Rotation( - 1, - ), - }, - Advice { - query_index: 19, - column_index: 8, - rotation: Rotation( - 1, - ), - }, - ), - Negated( - Advice { - query_index: 18, - column_index: 7, - rotation: Rotation( - 1, - ), - }, - ), - ), - Negated( - Advice { - query_index: 16, - column_index: 0, - rotation: Rotation( - 1, - ), - }, - ), - ), - ), ), ), - 0x2000000000000000000000000000000011234c7e04a67c8dcc96987680000001, ), ), + Negated( + Advice { + query_index: 3, + column_index: 3, + rotation: Rotation( + 0, + ), + }, + ), ), ), Product( @@ -4943,21 +5102,37 @@ PinnedVerificationKey { Product( Product( Product( - Fixed { - query_index: 20, - column_index: 20, - rotation: Rotation( - 0, + Product( + Fixed { + query_index: 23, + column_index: 23, + rotation: Rotation( + 0, + ), + }, + Sum( + Constant( + 0x0000000000000000000000000000000000000000000000000000000000000001, + ), + Negated( + Fixed { + query_index: 23, + column_index: 23, + rotation: Rotation( + 0, + ), + }, + ), ), - }, + ), Sum( Constant( - 0x0000000000000000000000000000000000000000000000000000000000000001, + 0x0000000000000000000000000000000000000000000000000000000000000003, ), Negated( Fixed { - query_index: 20, - column_index: 20, + query_index: 23, + column_index: 23, rotation: Rotation( 0, ), @@ -4967,12 +5142,12 @@ PinnedVerificationKey { ), Sum( Constant( - 0x0000000000000000000000000000000000000000000000000000000000000003, + 0x0000000000000000000000000000000000000000000000000000000000000004, ), Negated( Fixed { - query_index: 20, - column_index: 20, + query_index: 23, + column_index: 23, rotation: Rotation( 0, ), @@ -4982,12 +5157,12 @@ PinnedVerificationKey { ), Sum( Constant( - 0x0000000000000000000000000000000000000000000000000000000000000004, + 0x0000000000000000000000000000000000000000000000000000000000000005, ), Negated( Fixed { - query_index: 20, - column_index: 20, + query_index: 23, + column_index: 23, rotation: Rotation( 0, ), @@ -4997,12 +5172,12 @@ PinnedVerificationKey { ), Sum( Constant( - 0x0000000000000000000000000000000000000000000000000000000000000005, + 0x0000000000000000000000000000000000000000000000000000000000000006, ), Negated( Fixed { - query_index: 20, - column_index: 20, + query_index: 23, + column_index: 23, rotation: Rotation( 0, ), @@ -5011,45 +5186,155 @@ PinnedVerificationKey { ), ), Sum( - Advice { - query_index: 0, - column_index: 0, - rotation: Rotation( - 0, - ), - }, - Negated( - Advice { - query_index: 16, - column_index: 0, - rotation: Rotation( - 1, - ), - }, - ), - ), - ), - Product( - Product( - Product( + Sum( Product( - Product( - Fixed { - query_index: 20, - column_index: 20, + Advice { + query_index: 5, + column_index: 5, + rotation: Rotation( + 0, + ), + }, + Sum( + Advice { + query_index: 3, + column_index: 3, rotation: Rotation( 0, ), }, - Sum( - Constant( - 0x0000000000000000000000000000000000000000000000000000000000000001, - ), - Negated( - Fixed { - query_index: 20, - column_index: 20, - rotation: Rotation( + Negated( + Advice { + query_index: 13, + column_index: 3, + rotation: Rotation( + 1, + ), + }, + ), + ), + ), + Negated( + Scaled( + Product( + Sum( + Advice { + query_index: 4, + column_index: 4, + rotation: Rotation( + 0, + ), + }, + Advice { + query_index: 5, + column_index: 5, + rotation: Rotation( + 0, + ), + }, + ), + Sum( + Advice { + query_index: 3, + column_index: 3, + rotation: Rotation( + 0, + ), + }, + Negated( + Sum( + Sum( + Product( + Advice { + query_index: 4, + column_index: 4, + rotation: Rotation( + 0, + ), + }, + Advice { + query_index: 4, + column_index: 4, + rotation: Rotation( + 0, + ), + }, + ), + Negated( + Advice { + query_index: 3, + column_index: 3, + rotation: Rotation( + 0, + ), + }, + ), + ), + Negated( + Advice { + query_index: 0, + column_index: 0, + rotation: Rotation( + 0, + ), + }, + ), + ), + ), + ), + ), + 0x2000000000000000000000000000000011234c7e04a67c8dcc96987680000001, + ), + ), + ), + Negated( + Advice { + query_index: 14, + column_index: 4, + rotation: Rotation( + 1, + ), + }, + ), + ), + ), + Product( + Product( + Product( + Product( + Product( + Product( + Fixed { + query_index: 23, + column_index: 23, + rotation: Rotation( + 0, + ), + }, + Sum( + Constant( + 0x0000000000000000000000000000000000000000000000000000000000000001, + ), + Negated( + Fixed { + query_index: 23, + column_index: 23, + rotation: Rotation( + 0, + ), + }, + ), + ), + ), + Sum( + Constant( + 0x0000000000000000000000000000000000000000000000000000000000000002, + ), + Negated( + Fixed { + query_index: 23, + column_index: 23, + rotation: Rotation( 0, ), }, @@ -5058,12 +5343,12 @@ PinnedVerificationKey { ), Sum( Constant( - 0x0000000000000000000000000000000000000000000000000000000000000003, + 0x0000000000000000000000000000000000000000000000000000000000000004, ), Negated( Fixed { - query_index: 20, - column_index: 20, + query_index: 23, + column_index: 23, rotation: Rotation( 0, ), @@ -5073,12 +5358,12 @@ PinnedVerificationKey { ), Sum( Constant( - 0x0000000000000000000000000000000000000000000000000000000000000004, + 0x0000000000000000000000000000000000000000000000000000000000000005, ), Negated( Fixed { - query_index: 20, - column_index: 20, + query_index: 23, + column_index: 23, rotation: Rotation( 0, ), @@ -5088,12 +5373,12 @@ PinnedVerificationKey { ), Sum( Constant( - 0x0000000000000000000000000000000000000000000000000000000000000005, + 0x0000000000000000000000000000000000000000000000000000000000000006, ), Negated( Fixed { - query_index: 20, - column_index: 20, + query_index: 23, + column_index: 23, rotation: Rotation( 0, ), @@ -5103,20 +5388,83 @@ PinnedVerificationKey { ), Sum( Advice { - query_index: 1, - column_index: 1, + query_index: 8, + column_index: 8, rotation: Rotation( 0, ), }, Negated( - Advice { - query_index: 17, - column_index: 1, - rotation: Rotation( - 1, + Scaled( + Product( + Sum( + Advice { + query_index: 20, + column_index: 8, + rotation: Rotation( + 1, + ), + }, + Advice { + query_index: 12, + column_index: 2, + rotation: Rotation( + 1, + ), + }, + ), + Sum( + Advice { + query_index: 19, + column_index: 7, + rotation: Rotation( + 1, + ), + }, + Negated( + Sum( + Sum( + Product( + Advice { + query_index: 20, + column_index: 8, + rotation: Rotation( + 1, + ), + }, + Advice { + query_index: 20, + column_index: 8, + rotation: Rotation( + 1, + ), + }, + ), + Negated( + Advice { + query_index: 19, + column_index: 7, + rotation: Rotation( + 1, + ), + }, + ), + ), + Negated( + Advice { + query_index: 10, + column_index: 0, + rotation: Rotation( + 1, + ), + }, + ), + ), + ), + ), ), - }, + 0x2000000000000000000000000000000011234c7e04a67c8dcc96987680000001, + ), ), ), ), @@ -5126,20 +5474,20 @@ PinnedVerificationKey { Product( Product( Fixed { - query_index: 20, - column_index: 20, + query_index: 24, + column_index: 24, rotation: Rotation( 0, ), }, Sum( Constant( - 0x0000000000000000000000000000000000000000000000000000000000000001, + 0x0000000000000000000000000000000000000000000000000000000000000002, ), Negated( Fixed { - query_index: 20, - column_index: 20, + query_index: 24, + column_index: 24, rotation: Rotation( 0, ), @@ -5153,8 +5501,8 @@ PinnedVerificationKey { ), Negated( Fixed { - query_index: 20, - column_index: 20, + query_index: 24, + column_index: 24, rotation: Rotation( 0, ), @@ -5168,8 +5516,8 @@ PinnedVerificationKey { ), Negated( Fixed { - query_index: 20, - column_index: 20, + query_index: 24, + column_index: 24, rotation: Rotation( 0, ), @@ -5183,8 +5531,8 @@ PinnedVerificationKey { ), Negated( Fixed { - query_index: 20, - column_index: 20, + query_index: 24, + column_index: 24, rotation: Rotation( 0, ), @@ -5192,23 +5540,205 @@ PinnedVerificationKey { ), ), ), - Product( - Sum( + Sum( + Advice { + query_index: 0, + column_index: 0, + rotation: Rotation( + 0, + ), + }, + Negated( Advice { - query_index: 6, - column_index: 6, + query_index: 10, + column_index: 0, rotation: Rotation( - 0, + 1, ), }, - Negated( - Scaled( - Advice { - query_index: 20, - column_index: 6, - rotation: Rotation( - -1, - ), + ), + ), + ), + Product( + Product( + Product( + Product( + Product( + Fixed { + query_index: 24, + column_index: 24, + rotation: Rotation( + 0, + ), + }, + Sum( + Constant( + 0x0000000000000000000000000000000000000000000000000000000000000002, + ), + Negated( + Fixed { + query_index: 24, + column_index: 24, + rotation: Rotation( + 0, + ), + }, + ), + ), + ), + Sum( + Constant( + 0x0000000000000000000000000000000000000000000000000000000000000003, + ), + Negated( + Fixed { + query_index: 24, + column_index: 24, + rotation: Rotation( + 0, + ), + }, + ), + ), + ), + Sum( + Constant( + 0x0000000000000000000000000000000000000000000000000000000000000004, + ), + Negated( + Fixed { + query_index: 24, + column_index: 24, + rotation: Rotation( + 0, + ), + }, + ), + ), + ), + Sum( + Constant( + 0x0000000000000000000000000000000000000000000000000000000000000005, + ), + Negated( + Fixed { + query_index: 24, + column_index: 24, + rotation: Rotation( + 0, + ), + }, + ), + ), + ), + Sum( + Advice { + query_index: 1, + column_index: 1, + rotation: Rotation( + 0, + ), + }, + Negated( + Advice { + query_index: 11, + column_index: 1, + rotation: Rotation( + 1, + ), + }, + ), + ), + ), + Product( + Product( + Product( + Product( + Product( + Fixed { + query_index: 24, + column_index: 24, + rotation: Rotation( + 0, + ), + }, + Sum( + Constant( + 0x0000000000000000000000000000000000000000000000000000000000000002, + ), + Negated( + Fixed { + query_index: 24, + column_index: 24, + rotation: Rotation( + 0, + ), + }, + ), + ), + ), + Sum( + Constant( + 0x0000000000000000000000000000000000000000000000000000000000000003, + ), + Negated( + Fixed { + query_index: 24, + column_index: 24, + rotation: Rotation( + 0, + ), + }, + ), + ), + ), + Sum( + Constant( + 0x0000000000000000000000000000000000000000000000000000000000000004, + ), + Negated( + Fixed { + query_index: 24, + column_index: 24, + rotation: Rotation( + 0, + ), + }, + ), + ), + ), + Sum( + Constant( + 0x0000000000000000000000000000000000000000000000000000000000000005, + ), + Negated( + Fixed { + query_index: 24, + column_index: 24, + rotation: Rotation( + 0, + ), + }, + ), + ), + ), + Product( + Sum( + Advice { + query_index: 6, + column_index: 6, + rotation: Rotation( + 0, + ), + }, + Negated( + Scaled( + Advice { + query_index: 21, + column_index: 6, + rotation: Rotation( + -1, + ), }, 0x0000000000000000000000000000000000000000000000000000000000000002, ), @@ -5230,7 +5760,7 @@ PinnedVerificationKey { Negated( Scaled( Advice { - query_index: 20, + query_index: 21, column_index: 6, rotation: Rotation( -1, @@ -5250,20 +5780,20 @@ PinnedVerificationKey { Product( Product( Fixed { - query_index: 20, - column_index: 20, + query_index: 24, + column_index: 24, rotation: Rotation( 0, ), }, Sum( Constant( - 0x0000000000000000000000000000000000000000000000000000000000000001, + 0x0000000000000000000000000000000000000000000000000000000000000002, ), Negated( Fixed { - query_index: 20, - column_index: 20, + query_index: 24, + column_index: 24, rotation: Rotation( 0, ), @@ -5277,8 +5807,8 @@ PinnedVerificationKey { ), Negated( Fixed { - query_index: 20, - column_index: 20, + query_index: 24, + column_index: 24, rotation: Rotation( 0, ), @@ -5292,8 +5822,8 @@ PinnedVerificationKey { ), Negated( Fixed { - query_index: 20, - column_index: 20, + query_index: 24, + column_index: 24, rotation: Rotation( 0, ), @@ -5307,8 +5837,8 @@ PinnedVerificationKey { ), Negated( Fixed { - query_index: 20, - column_index: 20, + query_index: 24, + column_index: 24, rotation: Rotation( 0, ), @@ -5432,7 +5962,7 @@ PinnedVerificationKey { Negated( Scaled( Advice { - query_index: 20, + query_index: 21, column_index: 6, rotation: Rotation( -1, @@ -5466,20 +5996,20 @@ PinnedVerificationKey { Product( Product( Fixed { - query_index: 20, - column_index: 20, + query_index: 24, + column_index: 24, rotation: Rotation( 0, ), }, Sum( Constant( - 0x0000000000000000000000000000000000000000000000000000000000000001, + 0x0000000000000000000000000000000000000000000000000000000000000002, ), Negated( Fixed { - query_index: 20, - column_index: 20, + query_index: 24, + column_index: 24, rotation: Rotation( 0, ), @@ -5493,8 +6023,8 @@ PinnedVerificationKey { ), Negated( Fixed { - query_index: 20, - column_index: 20, + query_index: 24, + column_index: 24, rotation: Rotation( 0, ), @@ -5508,8 +6038,8 @@ PinnedVerificationKey { ), Negated( Fixed { - query_index: 20, - column_index: 20, + query_index: 24, + column_index: 24, rotation: Rotation( 0, ), @@ -5523,8 +6053,8 @@ PinnedVerificationKey { ), Negated( Fixed { - query_index: 20, - column_index: 20, + query_index: 24, + column_index: 24, rotation: Rotation( 0, ), @@ -5553,7 +6083,7 @@ PinnedVerificationKey { ), Negated( Advice { - query_index: 18, + query_index: 19, column_index: 7, rotation: Rotation( 1, @@ -5619,20 +6149,20 @@ PinnedVerificationKey { Product( Product( Fixed { - query_index: 20, - column_index: 20, + query_index: 24, + column_index: 24, rotation: Rotation( 0, ), }, Sum( Constant( - 0x0000000000000000000000000000000000000000000000000000000000000001, + 0x0000000000000000000000000000000000000000000000000000000000000002, ), Negated( Fixed { - query_index: 20, - column_index: 20, + query_index: 24, + column_index: 24, rotation: Rotation( 0, ), @@ -5646,8 +6176,8 @@ PinnedVerificationKey { ), Negated( Fixed { - query_index: 20, - column_index: 20, + query_index: 24, + column_index: 24, rotation: Rotation( 0, ), @@ -5661,8 +6191,8 @@ PinnedVerificationKey { ), Negated( Fixed { - query_index: 20, - column_index: 20, + query_index: 24, + column_index: 24, rotation: Rotation( 0, ), @@ -5676,8 +6206,8 @@ PinnedVerificationKey { ), Negated( Fixed { - query_index: 20, - column_index: 20, + query_index: 24, + column_index: 24, rotation: Rotation( 0, ), @@ -5705,7 +6235,7 @@ PinnedVerificationKey { }, Negated( Advice { - query_index: 18, + query_index: 19, column_index: 7, rotation: Rotation( 1, @@ -5792,7 +6322,7 @@ PinnedVerificationKey { Product( Sum( Advice { - query_index: 19, + query_index: 20, column_index: 8, rotation: Rotation( 1, @@ -5808,7 +6338,7 @@ PinnedVerificationKey { ), Sum( Advice { - query_index: 18, + query_index: 19, column_index: 7, rotation: Rotation( 1, @@ -5819,14 +6349,14 @@ PinnedVerificationKey { Sum( Product( Advice { - query_index: 19, + query_index: 20, column_index: 8, rotation: Rotation( 1, ), }, Advice { - query_index: 19, + query_index: 20, column_index: 8, rotation: Rotation( 1, @@ -5835,7 +6365,7 @@ PinnedVerificationKey { ), Negated( Advice { - query_index: 18, + query_index: 19, column_index: 7, rotation: Rotation( 1, @@ -5845,7 +6375,7 @@ PinnedVerificationKey { ), Negated( Advice { - query_index: 16, + query_index: 10, column_index: 0, rotation: Rotation( 1, @@ -5866,36 +6396,52 @@ PinnedVerificationKey { Product( Product( Product( - Fixed { - query_index: 20, - column_index: 20, - rotation: Rotation( - 0, - ), - }, - Sum( - Constant( - 0x0000000000000000000000000000000000000000000000000000000000000001, - ), - Negated( - Fixed { - query_index: 20, - column_index: 20, - rotation: Rotation( - 0, - ), + Product( + Fixed { + query_index: 23, + column_index: 23, + rotation: Rotation( + 0, + ), + }, + Sum( + Constant( + 0x0000000000000000000000000000000000000000000000000000000000000001, + ), + Negated( + Fixed { + query_index: 23, + column_index: 23, + rotation: Rotation( + 0, + ), + }, + ), + ), + ), + Sum( + Constant( + 0x0000000000000000000000000000000000000000000000000000000000000002, + ), + Negated( + Fixed { + query_index: 23, + column_index: 23, + rotation: Rotation( + 0, + ), }, ), ), ), Sum( Constant( - 0x0000000000000000000000000000000000000000000000000000000000000002, + 0x0000000000000000000000000000000000000000000000000000000000000003, ), Negated( Fixed { - query_index: 20, - column_index: 20, + query_index: 23, + column_index: 23, rotation: Rotation( 0, ), @@ -5905,12 +6451,12 @@ PinnedVerificationKey { ), Sum( Constant( - 0x0000000000000000000000000000000000000000000000000000000000000004, + 0x0000000000000000000000000000000000000000000000000000000000000005, ), Negated( Fixed { - query_index: 20, - column_index: 20, + query_index: 23, + column_index: 23, rotation: Rotation( 0, ), @@ -5920,12 +6466,12 @@ PinnedVerificationKey { ), Sum( Constant( - 0x0000000000000000000000000000000000000000000000000000000000000005, + 0x0000000000000000000000000000000000000000000000000000000000000006, ), Negated( Fixed { - query_index: 20, - column_index: 20, + query_index: 23, + column_index: 23, rotation: Rotation( 0, ), @@ -5945,7 +6491,7 @@ PinnedVerificationKey { Negated( Scaled( Advice { - query_index: 20, + query_index: 21, column_index: 6, rotation: Rotation( -1, @@ -5971,7 +6517,7 @@ PinnedVerificationKey { Negated( Scaled( Advice { - query_index: 20, + query_index: 21, column_index: 6, rotation: Rotation( -1, @@ -5990,21 +6536,37 @@ PinnedVerificationKey { Product( Product( Product( - Fixed { - query_index: 20, - column_index: 20, - rotation: Rotation( - 0, + Product( + Fixed { + query_index: 23, + column_index: 23, + rotation: Rotation( + 0, + ), + }, + Sum( + Constant( + 0x0000000000000000000000000000000000000000000000000000000000000001, + ), + Negated( + Fixed { + query_index: 23, + column_index: 23, + rotation: Rotation( + 0, + ), + }, + ), ), - }, + ), Sum( Constant( - 0x0000000000000000000000000000000000000000000000000000000000000001, + 0x0000000000000000000000000000000000000000000000000000000000000002, ), Negated( Fixed { - query_index: 20, - column_index: 20, + query_index: 23, + column_index: 23, rotation: Rotation( 0, ), @@ -6014,12 +6576,12 @@ PinnedVerificationKey { ), Sum( Constant( - 0x0000000000000000000000000000000000000000000000000000000000000002, + 0x0000000000000000000000000000000000000000000000000000000000000003, ), Negated( Fixed { - query_index: 20, - column_index: 20, + query_index: 23, + column_index: 23, rotation: Rotation( 0, ), @@ -6029,12 +6591,12 @@ PinnedVerificationKey { ), Sum( Constant( - 0x0000000000000000000000000000000000000000000000000000000000000004, + 0x0000000000000000000000000000000000000000000000000000000000000005, ), Negated( Fixed { - query_index: 20, - column_index: 20, + query_index: 23, + column_index: 23, rotation: Rotation( 0, ), @@ -6044,12 +6606,12 @@ PinnedVerificationKey { ), Sum( Constant( - 0x0000000000000000000000000000000000000000000000000000000000000005, + 0x0000000000000000000000000000000000000000000000000000000000000006, ), Negated( Fixed { - query_index: 20, - column_index: 20, + query_index: 23, + column_index: 23, rotation: Rotation( 0, ), @@ -6173,7 +6735,7 @@ PinnedVerificationKey { Negated( Scaled( Advice { - query_index: 20, + query_index: 21, column_index: 6, rotation: Rotation( -1, @@ -6206,21 +6768,37 @@ PinnedVerificationKey { Product( Product( Product( - Fixed { - query_index: 20, - column_index: 20, - rotation: Rotation( - 0, + Product( + Fixed { + query_index: 23, + column_index: 23, + rotation: Rotation( + 0, + ), + }, + Sum( + Constant( + 0x0000000000000000000000000000000000000000000000000000000000000001, + ), + Negated( + Fixed { + query_index: 23, + column_index: 23, + rotation: Rotation( + 0, + ), + }, + ), ), - }, + ), Sum( Constant( - 0x0000000000000000000000000000000000000000000000000000000000000001, + 0x0000000000000000000000000000000000000000000000000000000000000002, ), Negated( Fixed { - query_index: 20, - column_index: 20, + query_index: 23, + column_index: 23, rotation: Rotation( 0, ), @@ -6230,12 +6808,12 @@ PinnedVerificationKey { ), Sum( Constant( - 0x0000000000000000000000000000000000000000000000000000000000000002, + 0x0000000000000000000000000000000000000000000000000000000000000003, ), Negated( Fixed { - query_index: 20, - column_index: 20, + query_index: 23, + column_index: 23, rotation: Rotation( 0, ), @@ -6245,12 +6823,12 @@ PinnedVerificationKey { ), Sum( Constant( - 0x0000000000000000000000000000000000000000000000000000000000000004, + 0x0000000000000000000000000000000000000000000000000000000000000005, ), Negated( Fixed { - query_index: 20, - column_index: 20, + query_index: 23, + column_index: 23, rotation: Rotation( 0, ), @@ -6260,12 +6838,12 @@ PinnedVerificationKey { ), Sum( Constant( - 0x0000000000000000000000000000000000000000000000000000000000000005, + 0x0000000000000000000000000000000000000000000000000000000000000006, ), Negated( Fixed { - query_index: 20, - column_index: 20, + query_index: 23, + column_index: 23, rotation: Rotation( 0, ), @@ -6294,7 +6872,7 @@ PinnedVerificationKey { ), Negated( Advice { - query_index: 18, + query_index: 19, column_index: 7, rotation: Rotation( 1, @@ -6359,21 +6937,37 @@ PinnedVerificationKey { Product( Product( Product( - Fixed { - query_index: 20, - column_index: 20, - rotation: Rotation( - 0, + Product( + Fixed { + query_index: 23, + column_index: 23, + rotation: Rotation( + 0, + ), + }, + Sum( + Constant( + 0x0000000000000000000000000000000000000000000000000000000000000001, + ), + Negated( + Fixed { + query_index: 23, + column_index: 23, + rotation: Rotation( + 0, + ), + }, + ), ), - }, + ), Sum( Constant( - 0x0000000000000000000000000000000000000000000000000000000000000001, + 0x0000000000000000000000000000000000000000000000000000000000000002, ), Negated( Fixed { - query_index: 20, - column_index: 20, + query_index: 23, + column_index: 23, rotation: Rotation( 0, ), @@ -6383,12 +6977,12 @@ PinnedVerificationKey { ), Sum( Constant( - 0x0000000000000000000000000000000000000000000000000000000000000002, + 0x0000000000000000000000000000000000000000000000000000000000000003, ), Negated( Fixed { - query_index: 20, - column_index: 20, + query_index: 23, + column_index: 23, rotation: Rotation( 0, ), @@ -6398,12 +6992,12 @@ PinnedVerificationKey { ), Sum( Constant( - 0x0000000000000000000000000000000000000000000000000000000000000004, + 0x0000000000000000000000000000000000000000000000000000000000000005, ), Negated( Fixed { - query_index: 20, - column_index: 20, + query_index: 23, + column_index: 23, rotation: Rotation( 0, ), @@ -6413,12 +7007,12 @@ PinnedVerificationKey { ), Sum( Constant( - 0x0000000000000000000000000000000000000000000000000000000000000005, + 0x0000000000000000000000000000000000000000000000000000000000000006, ), Negated( Fixed { - query_index: 20, - column_index: 20, + query_index: 23, + column_index: 23, rotation: Rotation( 0, ), @@ -6446,7 +7040,7 @@ PinnedVerificationKey { }, Negated( Advice { - query_index: 18, + query_index: 19, column_index: 7, rotation: Rotation( 1, @@ -6530,7 +7124,7 @@ PinnedVerificationKey { ), Negated( Advice { - query_index: 19, + query_index: 20, column_index: 8, rotation: Rotation( 1, @@ -6544,21 +7138,37 @@ PinnedVerificationKey { Product( Product( Product( - Fixed { - query_index: 20, - column_index: 20, - rotation: Rotation( - 0, + Product( + Fixed { + query_index: 23, + column_index: 23, + rotation: Rotation( + 0, + ), + }, + Sum( + Constant( + 0x0000000000000000000000000000000000000000000000000000000000000001, + ), + Negated( + Fixed { + query_index: 23, + column_index: 23, + rotation: Rotation( + 0, + ), + }, + ), ), - }, + ), Sum( Constant( - 0x0000000000000000000000000000000000000000000000000000000000000001, + 0x0000000000000000000000000000000000000000000000000000000000000002, ), Negated( Fixed { - query_index: 20, - column_index: 20, + query_index: 23, + column_index: 23, rotation: Rotation( 0, ), @@ -6568,12 +7178,12 @@ PinnedVerificationKey { ), Sum( Constant( - 0x0000000000000000000000000000000000000000000000000000000000000002, + 0x0000000000000000000000000000000000000000000000000000000000000003, ), Negated( Fixed { - query_index: 20, - column_index: 20, + query_index: 23, + column_index: 23, rotation: Rotation( 0, ), @@ -6583,12 +7193,12 @@ PinnedVerificationKey { ), Sum( Constant( - 0x0000000000000000000000000000000000000000000000000000000000000003, + 0x0000000000000000000000000000000000000000000000000000000000000004, ), Negated( Fixed { - query_index: 20, - column_index: 20, + query_index: 23, + column_index: 23, rotation: Rotation( 0, ), @@ -6598,12 +7208,12 @@ PinnedVerificationKey { ), Sum( Constant( - 0x0000000000000000000000000000000000000000000000000000000000000005, + 0x0000000000000000000000000000000000000000000000000000000000000006, ), Negated( Fixed { - query_index: 20, - column_index: 20, + query_index: 23, + column_index: 23, rotation: Rotation( 0, ), @@ -6614,7 +7224,7 @@ PinnedVerificationKey { Product( Sum( Advice { - query_index: 10, + query_index: 17, column_index: 9, rotation: Rotation( 1, @@ -6626,7 +7236,7 @@ PinnedVerificationKey { 0x0000000000000000000000000000000000000000000000000000000000000002, ), Advice { - query_index: 11, + query_index: 18, column_index: 9, rotation: Rotation( -1, @@ -6642,7 +7252,7 @@ PinnedVerificationKey { Negated( Sum( Advice { - query_index: 10, + query_index: 17, column_index: 9, rotation: Rotation( 1, @@ -6654,7 +7264,7 @@ PinnedVerificationKey { 0x0000000000000000000000000000000000000000000000000000000000000002, ), Advice { - query_index: 11, + query_index: 18, column_index: 9, rotation: Rotation( -1, @@ -6672,21 +7282,37 @@ PinnedVerificationKey { Product( Product( Product( - Fixed { - query_index: 20, - column_index: 20, - rotation: Rotation( - 0, + Product( + Fixed { + query_index: 23, + column_index: 23, + rotation: Rotation( + 0, + ), + }, + Sum( + Constant( + 0x0000000000000000000000000000000000000000000000000000000000000001, + ), + Negated( + Fixed { + query_index: 23, + column_index: 23, + rotation: Rotation( + 0, + ), + }, + ), ), - }, + ), Sum( Constant( - 0x0000000000000000000000000000000000000000000000000000000000000001, + 0x0000000000000000000000000000000000000000000000000000000000000002, ), Negated( Fixed { - query_index: 20, - column_index: 20, + query_index: 23, + column_index: 23, rotation: Rotation( 0, ), @@ -6696,12 +7322,12 @@ PinnedVerificationKey { ), Sum( Constant( - 0x0000000000000000000000000000000000000000000000000000000000000002, + 0x0000000000000000000000000000000000000000000000000000000000000003, ), Negated( Fixed { - query_index: 20, - column_index: 20, + query_index: 23, + column_index: 23, rotation: Rotation( 0, ), @@ -6711,12 +7337,12 @@ PinnedVerificationKey { ), Sum( Constant( - 0x0000000000000000000000000000000000000000000000000000000000000003, + 0x0000000000000000000000000000000000000000000000000000000000000004, ), Negated( Fixed { - query_index: 20, - column_index: 20, + query_index: 23, + column_index: 23, rotation: Rotation( 0, ), @@ -6726,12 +7352,12 @@ PinnedVerificationKey { ), Sum( Constant( - 0x0000000000000000000000000000000000000000000000000000000000000005, + 0x0000000000000000000000000000000000000000000000000000000000000006, ), Negated( Fixed { - query_index: 20, - column_index: 20, + query_index: 23, + column_index: 23, rotation: Rotation( 0, ), @@ -6743,7 +7369,7 @@ PinnedVerificationKey { Product( Sum( Advice { - query_index: 10, + query_index: 17, column_index: 9, rotation: Rotation( 1, @@ -6755,7 +7381,7 @@ PinnedVerificationKey { 0x0000000000000000000000000000000000000000000000000000000000000002, ), Advice { - query_index: 11, + query_index: 18, column_index: 9, rotation: Rotation( -1, @@ -6774,7 +7400,7 @@ PinnedVerificationKey { }, Negated( Advice { - query_index: 21, + query_index: 22, column_index: 1, rotation: Rotation( -1, @@ -6791,7 +7417,7 @@ PinnedVerificationKey { Negated( Sum( Advice { - query_index: 10, + query_index: 17, column_index: 9, rotation: Rotation( 1, @@ -6803,7 +7429,7 @@ PinnedVerificationKey { 0x0000000000000000000000000000000000000000000000000000000000000002, ), Advice { - query_index: 11, + query_index: 18, column_index: 9, rotation: Rotation( -1, @@ -6823,7 +7449,7 @@ PinnedVerificationKey { ), }, Advice { - query_index: 21, + query_index: 22, column_index: 1, rotation: Rotation( -1, @@ -6839,8 +7465,8 @@ PinnedVerificationKey { Product( Product( Fixed { - query_index: 20, - column_index: 20, + query_index: 24, + column_index: 24, rotation: Rotation( 0, ), @@ -6851,8 +7477,8 @@ PinnedVerificationKey { ), Negated( Fixed { - query_index: 20, - column_index: 20, + query_index: 24, + column_index: 24, rotation: Rotation( 0, ), @@ -6862,12 +7488,12 @@ PinnedVerificationKey { ), Sum( Constant( - 0x0000000000000000000000000000000000000000000000000000000000000002, + 0x0000000000000000000000000000000000000000000000000000000000000003, ), Negated( Fixed { - query_index: 20, - column_index: 20, + query_index: 24, + column_index: 24, rotation: Rotation( 0, ), @@ -6877,12 +7503,12 @@ PinnedVerificationKey { ), Sum( Constant( - 0x0000000000000000000000000000000000000000000000000000000000000003, + 0x0000000000000000000000000000000000000000000000000000000000000004, ), Negated( Fixed { - query_index: 20, - column_index: 20, + query_index: 24, + column_index: 24, rotation: Rotation( 0, ), @@ -6892,12 +7518,12 @@ PinnedVerificationKey { ), Sum( Constant( - 0x0000000000000000000000000000000000000000000000000000000000000004, + 0x0000000000000000000000000000000000000000000000000000000000000005, ), Negated( Fixed { - query_index: 20, - column_index: 20, + query_index: 24, + column_index: 24, rotation: Rotation( 0, ), @@ -6949,8 +7575,8 @@ PinnedVerificationKey { Product( Product( Fixed { - query_index: 20, - column_index: 20, + query_index: 24, + column_index: 24, rotation: Rotation( 0, ), @@ -6961,8 +7587,8 @@ PinnedVerificationKey { ), Negated( Fixed { - query_index: 20, - column_index: 20, + query_index: 24, + column_index: 24, rotation: Rotation( 0, ), @@ -6972,12 +7598,12 @@ PinnedVerificationKey { ), Sum( Constant( - 0x0000000000000000000000000000000000000000000000000000000000000002, + 0x0000000000000000000000000000000000000000000000000000000000000003, ), Negated( Fixed { - query_index: 20, - column_index: 20, + query_index: 24, + column_index: 24, rotation: Rotation( 0, ), @@ -6987,12 +7613,12 @@ PinnedVerificationKey { ), Sum( Constant( - 0x0000000000000000000000000000000000000000000000000000000000000003, + 0x0000000000000000000000000000000000000000000000000000000000000004, ), Negated( Fixed { - query_index: 20, - column_index: 20, + query_index: 24, + column_index: 24, rotation: Rotation( 0, ), @@ -7002,12 +7628,12 @@ PinnedVerificationKey { ), Sum( Constant( - 0x0000000000000000000000000000000000000000000000000000000000000004, + 0x0000000000000000000000000000000000000000000000000000000000000005, ), Negated( Fixed { - query_index: 20, - column_index: 20, + query_index: 24, + column_index: 24, rotation: Rotation( 0, ), @@ -7018,7 +7644,7 @@ PinnedVerificationKey { Sum( Sum( Advice { - query_index: 20, + query_index: 21, column_index: 6, rotation: Rotation( -1, @@ -7047,8 +7673,8 @@ PinnedVerificationKey { Product( Product( Fixed { - query_index: 20, - column_index: 20, + query_index: 24, + column_index: 24, rotation: Rotation( 0, ), @@ -7059,8 +7685,8 @@ PinnedVerificationKey { ), Negated( Fixed { - query_index: 20, - column_index: 20, + query_index: 24, + column_index: 24, rotation: Rotation( 0, ), @@ -7070,12 +7696,12 @@ PinnedVerificationKey { ), Sum( Constant( - 0x0000000000000000000000000000000000000000000000000000000000000002, + 0x0000000000000000000000000000000000000000000000000000000000000003, ), Negated( Fixed { - query_index: 20, - column_index: 20, + query_index: 24, + column_index: 24, rotation: Rotation( 0, ), @@ -7085,12 +7711,12 @@ PinnedVerificationKey { ), Sum( Constant( - 0x0000000000000000000000000000000000000000000000000000000000000003, + 0x0000000000000000000000000000000000000000000000000000000000000004, ), Negated( Fixed { - query_index: 20, - column_index: 20, + query_index: 24, + column_index: 24, rotation: Rotation( 0, ), @@ -7100,12 +7726,12 @@ PinnedVerificationKey { ), Sum( Constant( - 0x0000000000000000000000000000000000000000000000000000000000000004, + 0x0000000000000000000000000000000000000000000000000000000000000005, ), Negated( Fixed { - query_index: 20, - column_index: 20, + query_index: 24, + column_index: 24, rotation: Rotation( 0, ), @@ -7143,8 +7769,8 @@ PinnedVerificationKey { Product( Product( Fixed { - query_index: 20, - column_index: 20, + query_index: 24, + column_index: 24, rotation: Rotation( 0, ), @@ -7155,8 +7781,8 @@ PinnedVerificationKey { ), Negated( Fixed { - query_index: 20, - column_index: 20, + query_index: 24, + column_index: 24, rotation: Rotation( 0, ), @@ -7166,12 +7792,12 @@ PinnedVerificationKey { ), Sum( Constant( - 0x0000000000000000000000000000000000000000000000000000000000000002, + 0x0000000000000000000000000000000000000000000000000000000000000003, ), Negated( Fixed { - query_index: 20, - column_index: 20, + query_index: 24, + column_index: 24, rotation: Rotation( 0, ), @@ -7181,12 +7807,12 @@ PinnedVerificationKey { ), Sum( Constant( - 0x0000000000000000000000000000000000000000000000000000000000000003, + 0x0000000000000000000000000000000000000000000000000000000000000004, ), Negated( Fixed { - query_index: 20, - column_index: 20, + query_index: 24, + column_index: 24, rotation: Rotation( 0, ), @@ -7196,12 +7822,12 @@ PinnedVerificationKey { ), Sum( Constant( - 0x0000000000000000000000000000000000000000000000000000000000000004, + 0x0000000000000000000000000000000000000000000000000000000000000005, ), Negated( Fixed { - query_index: 20, - column_index: 20, + query_index: 24, + column_index: 24, rotation: Rotation( 0, ), @@ -7218,7 +7844,7 @@ PinnedVerificationKey { ), }, Advice { - query_index: 18, + query_index: 19, column_index: 7, rotation: Rotation( 1, @@ -7232,8 +7858,8 @@ PinnedVerificationKey { Product( Product( Fixed { - query_index: 20, - column_index: 20, + query_index: 24, + column_index: 24, rotation: Rotation( 0, ), @@ -7244,8 +7870,8 @@ PinnedVerificationKey { ), Negated( Fixed { - query_index: 20, - column_index: 20, + query_index: 24, + column_index: 24, rotation: Rotation( 0, ), @@ -7255,12 +7881,12 @@ PinnedVerificationKey { ), Sum( Constant( - 0x0000000000000000000000000000000000000000000000000000000000000002, + 0x0000000000000000000000000000000000000000000000000000000000000003, ), Negated( Fixed { - query_index: 20, - column_index: 20, + query_index: 24, + column_index: 24, rotation: Rotation( 0, ), @@ -7270,12 +7896,12 @@ PinnedVerificationKey { ), Sum( Constant( - 0x0000000000000000000000000000000000000000000000000000000000000003, + 0x0000000000000000000000000000000000000000000000000000000000000004, ), Negated( Fixed { - query_index: 20, - column_index: 20, + query_index: 24, + column_index: 24, rotation: Rotation( 0, ), @@ -7285,12 +7911,12 @@ PinnedVerificationKey { ), Sum( Constant( - 0x0000000000000000000000000000000000000000000000000000000000000004, + 0x0000000000000000000000000000000000000000000000000000000000000005, ), Negated( Fixed { - query_index: 20, - column_index: 20, + query_index: 24, + column_index: 24, rotation: Rotation( 0, ), @@ -7328,7 +7954,7 @@ PinnedVerificationKey { ), }, Advice { - query_index: 22, + query_index: 16, column_index: 6, rotation: Rotation( 1, @@ -7339,7 +7965,7 @@ PinnedVerificationKey { ), ), Advice { - query_index: 18, + query_index: 19, column_index: 7, rotation: Rotation( 1, @@ -7351,21 +7977,53 @@ PinnedVerificationKey { Product( Product( Product( - Fixed { - query_index: 21, - column_index: 21, - rotation: Rotation( - 0, + Product( + Product( + Fixed { + query_index: 23, + column_index: 23, + rotation: Rotation( + 0, + ), + }, + Sum( + Constant( + 0x0000000000000000000000000000000000000000000000000000000000000001, + ), + Negated( + Fixed { + query_index: 23, + column_index: 23, + rotation: Rotation( + 0, + ), + }, + ), + ), ), - }, + Sum( + Constant( + 0x0000000000000000000000000000000000000000000000000000000000000002, + ), + Negated( + Fixed { + query_index: 23, + column_index: 23, + rotation: Rotation( + 0, + ), + }, + ), + ), + ), Sum( Constant( - 0x0000000000000000000000000000000000000000000000000000000000000002, + 0x0000000000000000000000000000000000000000000000000000000000000003, ), Negated( Fixed { - query_index: 21, - column_index: 21, + query_index: 23, + column_index: 23, rotation: Rotation( 0, ), @@ -7375,12 +8033,12 @@ PinnedVerificationKey { ), Sum( Constant( - 0x0000000000000000000000000000000000000000000000000000000000000003, + 0x0000000000000000000000000000000000000000000000000000000000000004, ), Negated( Fixed { - query_index: 21, - column_index: 21, + query_index: 23, + column_index: 23, rotation: Rotation( 0, ), @@ -7390,12 +8048,12 @@ PinnedVerificationKey { ), Sum( Constant( - 0x0000000000000000000000000000000000000000000000000000000000000004, + 0x0000000000000000000000000000000000000000000000000000000000000005, ), Negated( Fixed { - query_index: 21, - column_index: 21, + query_index: 23, + column_index: 23, rotation: Rotation( 0, ), @@ -7406,7 +8064,7 @@ PinnedVerificationKey { Product( Sum( Advice { - query_index: 10, + query_index: 17, column_index: 9, rotation: Rotation( 1, @@ -7432,7 +8090,7 @@ PinnedVerificationKey { Negated( Sum( Advice { - query_index: 10, + query_index: 17, column_index: 9, rotation: Rotation( 1, @@ -7459,21 +8117,53 @@ PinnedVerificationKey { Product( Product( Product( - Fixed { - query_index: 21, - column_index: 21, - rotation: Rotation( - 0, + Product( + Product( + Fixed { + query_index: 23, + column_index: 23, + rotation: Rotation( + 0, + ), + }, + Sum( + Constant( + 0x0000000000000000000000000000000000000000000000000000000000000001, + ), + Negated( + Fixed { + query_index: 23, + column_index: 23, + rotation: Rotation( + 0, + ), + }, + ), + ), ), - }, + Sum( + Constant( + 0x0000000000000000000000000000000000000000000000000000000000000002, + ), + Negated( + Fixed { + query_index: 23, + column_index: 23, + rotation: Rotation( + 0, + ), + }, + ), + ), + ), Sum( Constant( - 0x0000000000000000000000000000000000000000000000000000000000000002, + 0x0000000000000000000000000000000000000000000000000000000000000003, ), Negated( Fixed { - query_index: 21, - column_index: 21, + query_index: 23, + column_index: 23, rotation: Rotation( 0, ), @@ -7483,12 +8173,12 @@ PinnedVerificationKey { ), Sum( Constant( - 0x0000000000000000000000000000000000000000000000000000000000000003, + 0x0000000000000000000000000000000000000000000000000000000000000004, ), Negated( Fixed { - query_index: 21, - column_index: 21, + query_index: 23, + column_index: 23, rotation: Rotation( 0, ), @@ -7498,12 +8188,12 @@ PinnedVerificationKey { ), Sum( Constant( - 0x0000000000000000000000000000000000000000000000000000000000000004, + 0x0000000000000000000000000000000000000000000000000000000000000005, ), Negated( Fixed { - query_index: 21, - column_index: 21, + query_index: 23, + column_index: 23, rotation: Rotation( 0, ), @@ -7515,7 +8205,7 @@ PinnedVerificationKey { Product( Sum( Advice { - query_index: 10, + query_index: 17, column_index: 9, rotation: Rotation( 1, @@ -7550,7 +8240,7 @@ PinnedVerificationKey { Negated( Sum( Advice { - query_index: 10, + query_index: 17, column_index: 9, rotation: Rotation( 1, @@ -7581,7 +8271,7 @@ PinnedVerificationKey { }, Negated( Advice { - query_index: 16, + query_index: 10, column_index: 0, rotation: Rotation( 1, @@ -7596,21 +8286,53 @@ PinnedVerificationKey { Product( Product( Product( - Fixed { - query_index: 21, - column_index: 21, - rotation: Rotation( - 0, + Product( + Product( + Fixed { + query_index: 23, + column_index: 23, + rotation: Rotation( + 0, + ), + }, + Sum( + Constant( + 0x0000000000000000000000000000000000000000000000000000000000000001, + ), + Negated( + Fixed { + query_index: 23, + column_index: 23, + rotation: Rotation( + 0, + ), + }, + ), + ), ), - }, + Sum( + Constant( + 0x0000000000000000000000000000000000000000000000000000000000000002, + ), + Negated( + Fixed { + query_index: 23, + column_index: 23, + rotation: Rotation( + 0, + ), + }, + ), + ), + ), Sum( Constant( - 0x0000000000000000000000000000000000000000000000000000000000000002, + 0x0000000000000000000000000000000000000000000000000000000000000003, ), Negated( Fixed { - query_index: 21, - column_index: 21, + query_index: 23, + column_index: 23, rotation: Rotation( 0, ), @@ -7620,12 +8342,12 @@ PinnedVerificationKey { ), Sum( Constant( - 0x0000000000000000000000000000000000000000000000000000000000000003, + 0x0000000000000000000000000000000000000000000000000000000000000004, ), Negated( Fixed { - query_index: 21, - column_index: 21, + query_index: 23, + column_index: 23, rotation: Rotation( 0, ), @@ -7635,12 +8357,12 @@ PinnedVerificationKey { ), Sum( Constant( - 0x0000000000000000000000000000000000000000000000000000000000000004, + 0x0000000000000000000000000000000000000000000000000000000000000005, ), Negated( Fixed { - query_index: 21, - column_index: 21, + query_index: 23, + column_index: 23, rotation: Rotation( 0, ), @@ -7652,7 +8374,7 @@ PinnedVerificationKey { Product( Sum( Advice { - query_index: 10, + query_index: 17, column_index: 9, rotation: Rotation( 1, @@ -7687,7 +8409,7 @@ PinnedVerificationKey { Negated( Sum( Advice { - query_index: 10, + query_index: 17, column_index: 9, rotation: Rotation( 1, @@ -7717,7 +8439,7 @@ PinnedVerificationKey { ), }, Advice { - query_index: 17, + query_index: 11, column_index: 1, rotation: Rotation( 1, @@ -7729,8 +8451,8 @@ PinnedVerificationKey { ), Product( Fixed { - query_index: 22, - column_index: 22, + query_index: 25, + column_index: 25, rotation: Rotation( 0, ), @@ -7969,8 +8691,8 @@ PinnedVerificationKey { ), Product( Fixed { - query_index: 22, - column_index: 22, + query_index: 25, + column_index: 25, rotation: Rotation( 0, ), @@ -7993,7 +8715,7 @@ PinnedVerificationKey { ), Fixed { query_index: 0, - column_index: 3, + column_index: 4, rotation: Rotation( 0, ), @@ -8028,8 +8750,8 @@ PinnedVerificationKey { ), ), Fixed { - query_index: 3, - column_index: 4, + query_index: 4, + column_index: 5, rotation: Rotation( 0, ), @@ -8087,8 +8809,8 @@ PinnedVerificationKey { ), ), Fixed { - query_index: 4, - column_index: 5, + query_index: 5, + column_index: 6, rotation: Rotation( 0, ), @@ -8169,8 +8891,8 @@ PinnedVerificationKey { ), ), Fixed { - query_index: 5, - column_index: 6, + query_index: 6, + column_index: 7, rotation: Rotation( 0, ), @@ -8274,8 +8996,8 @@ PinnedVerificationKey { ), ), Fixed { - query_index: 6, - column_index: 7, + query_index: 7, + column_index: 8, rotation: Rotation( 0, ), @@ -8402,8 +9124,8 @@ PinnedVerificationKey { ), ), Fixed { - query_index: 7, - column_index: 8, + query_index: 8, + column_index: 9, rotation: Rotation( 0, ), @@ -8553,8 +9275,8 @@ PinnedVerificationKey { ), ), Fixed { - query_index: 8, - column_index: 9, + query_index: 9, + column_index: 10, rotation: Rotation( 0, ), @@ -8727,8 +9449,8 @@ PinnedVerificationKey { ), ), Fixed { - query_index: 9, - column_index: 10, + query_index: 10, + column_index: 11, rotation: Rotation( 0, ), @@ -8748,8 +9470,8 @@ PinnedVerificationKey { ), Product( Fixed { - query_index: 22, - column_index: 22, + query_index: 25, + column_index: 25, rotation: Rotation( 0, ), @@ -8784,8 +9506,8 @@ PinnedVerificationKey { ), Negated( Fixed { - query_index: 2, - column_index: 11, + query_index: 3, + column_index: 12, rotation: Rotation( 0, ), @@ -8795,8 +9517,8 @@ PinnedVerificationKey { ), Product( Fixed { - query_index: 22, - column_index: 22, + query_index: 25, + column_index: 25, rotation: Rotation( 0, ), @@ -8856,8 +9578,8 @@ PinnedVerificationKey { ), Product( Fixed { - query_index: 23, - column_index: 23, + query_index: 26, + column_index: 26, rotation: Rotation( 0, ), @@ -8880,7 +9602,7 @@ PinnedVerificationKey { ), Fixed { query_index: 0, - column_index: 3, + column_index: 4, rotation: Rotation( 0, ), @@ -8901,8 +9623,8 @@ PinnedVerificationKey { }, ), Fixed { - query_index: 3, - column_index: 4, + query_index: 4, + column_index: 5, rotation: Rotation( 0, ), @@ -8932,8 +9654,8 @@ PinnedVerificationKey { }, ), Fixed { - query_index: 4, - column_index: 5, + query_index: 5, + column_index: 6, rotation: Rotation( 0, ), @@ -8972,8 +9694,8 @@ PinnedVerificationKey { }, ), Fixed { - query_index: 5, - column_index: 6, + query_index: 6, + column_index: 7, rotation: Rotation( 0, ), @@ -9021,8 +9743,8 @@ PinnedVerificationKey { }, ), Fixed { - query_index: 6, - column_index: 7, + query_index: 7, + column_index: 8, rotation: Rotation( 0, ), @@ -9079,8 +9801,8 @@ PinnedVerificationKey { }, ), Fixed { - query_index: 7, - column_index: 8, + query_index: 8, + column_index: 9, rotation: Rotation( 0, ), @@ -9146,8 +9868,8 @@ PinnedVerificationKey { }, ), Fixed { - query_index: 8, - column_index: 9, + query_index: 9, + column_index: 10, rotation: Rotation( 0, ), @@ -9222,8 +9944,8 @@ PinnedVerificationKey { }, ), Fixed { - query_index: 9, - column_index: 10, + query_index: 10, + column_index: 11, rotation: Rotation( 0, ), @@ -9243,8 +9965,8 @@ PinnedVerificationKey { ), Product( Fixed { - query_index: 23, - column_index: 23, + query_index: 26, + column_index: 26, rotation: Rotation( 0, ), @@ -9279,8 +10001,8 @@ PinnedVerificationKey { ), Negated( Fixed { - query_index: 2, - column_index: 11, + query_index: 3, + column_index: 12, rotation: Rotation( 0, ), @@ -9290,8 +10012,8 @@ PinnedVerificationKey { ), Product( Fixed { - query_index: 23, - column_index: 23, + query_index: 26, + column_index: 26, rotation: Rotation( 0, ), @@ -9351,8 +10073,8 @@ PinnedVerificationKey { ), Product( Fixed { - query_index: 23, - column_index: 23, + query_index: 26, + column_index: 26, rotation: Rotation( 0, ), @@ -9481,21 +10203,37 @@ PinnedVerificationKey { Product( Product( Product( - Fixed { - query_index: 21, - column_index: 21, - rotation: Rotation( - 0, + Product( + Fixed { + query_index: 24, + column_index: 24, + rotation: Rotation( + 0, + ), + }, + Sum( + Constant( + 0x0000000000000000000000000000000000000000000000000000000000000001, + ), + Negated( + Fixed { + query_index: 24, + column_index: 24, + rotation: Rotation( + 0, + ), + }, + ), ), - }, + ), Sum( Constant( - 0x0000000000000000000000000000000000000000000000000000000000000001, + 0x0000000000000000000000000000000000000000000000000000000000000002, ), Negated( Fixed { - query_index: 21, - column_index: 21, + query_index: 24, + column_index: 24, rotation: Rotation( 0, ), @@ -9505,12 +10243,12 @@ PinnedVerificationKey { ), Sum( Constant( - 0x0000000000000000000000000000000000000000000000000000000000000003, + 0x0000000000000000000000000000000000000000000000000000000000000004, ), Negated( Fixed { - query_index: 21, - column_index: 21, + query_index: 24, + column_index: 24, rotation: Rotation( 0, ), @@ -9520,12 +10258,12 @@ PinnedVerificationKey { ), Sum( Constant( - 0x0000000000000000000000000000000000000000000000000000000000000004, + 0x0000000000000000000000000000000000000000000000000000000000000005, ), Negated( Fixed { - query_index: 21, - column_index: 21, + query_index: 24, + column_index: 24, rotation: Rotation( 0, ), @@ -9561,21 +10299,37 @@ PinnedVerificationKey { Product( Product( Product( - Fixed { - query_index: 21, - column_index: 21, - rotation: Rotation( - 0, + Product( + Fixed { + query_index: 24, + column_index: 24, + rotation: Rotation( + 0, + ), + }, + Sum( + Constant( + 0x0000000000000000000000000000000000000000000000000000000000000001, + ), + Negated( + Fixed { + query_index: 24, + column_index: 24, + rotation: Rotation( + 0, + ), + }, + ), ), - }, + ), Sum( Constant( - 0x0000000000000000000000000000000000000000000000000000000000000001, + 0x0000000000000000000000000000000000000000000000000000000000000002, ), Negated( Fixed { - query_index: 21, - column_index: 21, + query_index: 24, + column_index: 24, rotation: Rotation( 0, ), @@ -9585,12 +10339,12 @@ PinnedVerificationKey { ), Sum( Constant( - 0x0000000000000000000000000000000000000000000000000000000000000003, + 0x0000000000000000000000000000000000000000000000000000000000000004, ), Negated( Fixed { - query_index: 21, - column_index: 21, + query_index: 24, + column_index: 24, rotation: Rotation( 0, ), @@ -9600,12 +10354,12 @@ PinnedVerificationKey { ), Sum( Constant( - 0x0000000000000000000000000000000000000000000000000000000000000004, + 0x0000000000000000000000000000000000000000000000000000000000000005, ), Negated( Fixed { - query_index: 21, - column_index: 21, + query_index: 24, + column_index: 24, rotation: Rotation( 0, ), @@ -9641,21 +10395,37 @@ PinnedVerificationKey { Product( Product( Product( - Fixed { - query_index: 21, - column_index: 21, - rotation: Rotation( - 0, + Product( + Fixed { + query_index: 24, + column_index: 24, + rotation: Rotation( + 0, + ), + }, + Sum( + Constant( + 0x0000000000000000000000000000000000000000000000000000000000000001, + ), + Negated( + Fixed { + query_index: 24, + column_index: 24, + rotation: Rotation( + 0, + ), + }, + ), ), - }, + ), Sum( Constant( - 0x0000000000000000000000000000000000000000000000000000000000000001, + 0x0000000000000000000000000000000000000000000000000000000000000002, ), Negated( Fixed { - query_index: 21, - column_index: 21, + query_index: 24, + column_index: 24, rotation: Rotation( 0, ), @@ -9665,12 +10435,12 @@ PinnedVerificationKey { ), Sum( Constant( - 0x0000000000000000000000000000000000000000000000000000000000000003, + 0x0000000000000000000000000000000000000000000000000000000000000004, ), Negated( Fixed { - query_index: 21, - column_index: 21, + query_index: 24, + column_index: 24, rotation: Rotation( 0, ), @@ -9680,12 +10450,12 @@ PinnedVerificationKey { ), Sum( Constant( - 0x0000000000000000000000000000000000000000000000000000000000000004, + 0x0000000000000000000000000000000000000000000000000000000000000005, ), Negated( Fixed { - query_index: 21, - column_index: 21, + query_index: 24, + column_index: 24, rotation: Rotation( 0, ), @@ -9734,21 +10504,37 @@ PinnedVerificationKey { Product( Product( Product( - Fixed { - query_index: 21, - column_index: 21, - rotation: Rotation( - 0, + Product( + Fixed { + query_index: 24, + column_index: 24, + rotation: Rotation( + 0, + ), + }, + Sum( + Constant( + 0x0000000000000000000000000000000000000000000000000000000000000001, + ), + Negated( + Fixed { + query_index: 24, + column_index: 24, + rotation: Rotation( + 0, + ), + }, + ), ), - }, + ), Sum( Constant( - 0x0000000000000000000000000000000000000000000000000000000000000001, + 0x0000000000000000000000000000000000000000000000000000000000000002, ), Negated( Fixed { - query_index: 21, - column_index: 21, + query_index: 24, + column_index: 24, rotation: Rotation( 0, ), @@ -9758,12 +10544,12 @@ PinnedVerificationKey { ), Sum( Constant( - 0x0000000000000000000000000000000000000000000000000000000000000003, + 0x0000000000000000000000000000000000000000000000000000000000000004, ), Negated( Fixed { - query_index: 21, - column_index: 21, + query_index: 24, + column_index: 24, rotation: Rotation( 0, ), @@ -9773,12 +10559,12 @@ PinnedVerificationKey { ), Sum( Constant( - 0x0000000000000000000000000000000000000000000000000000000000000004, + 0x0000000000000000000000000000000000000000000000000000000000000005, ), Negated( Fixed { - query_index: 21, - column_index: 21, + query_index: 24, + column_index: 24, rotation: Rotation( 0, ), @@ -9818,21 +10604,37 @@ PinnedVerificationKey { Product( Product( Product( - Fixed { - query_index: 21, - column_index: 21, - rotation: Rotation( - 0, - ), - }, - Sum( - Constant( - 0x0000000000000000000000000000000000000000000000000000000000000001, - ), + Product( + Fixed { + query_index: 24, + column_index: 24, + rotation: Rotation( + 0, + ), + }, + Sum( + Constant( + 0x0000000000000000000000000000000000000000000000000000000000000001, + ), + Negated( + Fixed { + query_index: 24, + column_index: 24, + rotation: Rotation( + 0, + ), + }, + ), + ), + ), + Sum( + Constant( + 0x0000000000000000000000000000000000000000000000000000000000000002, + ), Negated( Fixed { - query_index: 21, - column_index: 21, + query_index: 24, + column_index: 24, rotation: Rotation( 0, ), @@ -9842,12 +10644,12 @@ PinnedVerificationKey { ), Sum( Constant( - 0x0000000000000000000000000000000000000000000000000000000000000002, + 0x0000000000000000000000000000000000000000000000000000000000000003, ), Negated( Fixed { - query_index: 21, - column_index: 21, + query_index: 24, + column_index: 24, rotation: Rotation( 0, ), @@ -9857,12 +10659,12 @@ PinnedVerificationKey { ), Sum( Constant( - 0x0000000000000000000000000000000000000000000000000000000000000004, + 0x0000000000000000000000000000000000000000000000000000000000000005, ), Negated( Fixed { - query_index: 21, - column_index: 21, + query_index: 24, + column_index: 24, rotation: Rotation( 0, ), @@ -9891,21 +10693,37 @@ PinnedVerificationKey { Product( Product( Product( - Fixed { - query_index: 21, - column_index: 21, - rotation: Rotation( - 0, + Product( + Fixed { + query_index: 24, + column_index: 24, + rotation: Rotation( + 0, + ), + }, + Sum( + Constant( + 0x0000000000000000000000000000000000000000000000000000000000000001, + ), + Negated( + Fixed { + query_index: 24, + column_index: 24, + rotation: Rotation( + 0, + ), + }, + ), ), - }, + ), Sum( Constant( - 0x0000000000000000000000000000000000000000000000000000000000000001, + 0x0000000000000000000000000000000000000000000000000000000000000002, ), Negated( Fixed { - query_index: 21, - column_index: 21, + query_index: 24, + column_index: 24, rotation: Rotation( 0, ), @@ -9915,12 +10733,12 @@ PinnedVerificationKey { ), Sum( Constant( - 0x0000000000000000000000000000000000000000000000000000000000000002, + 0x0000000000000000000000000000000000000000000000000000000000000003, ), Negated( Fixed { - query_index: 21, - column_index: 21, + query_index: 24, + column_index: 24, rotation: Rotation( 0, ), @@ -9930,12 +10748,12 @@ PinnedVerificationKey { ), Sum( Constant( - 0x0000000000000000000000000000000000000000000000000000000000000004, + 0x0000000000000000000000000000000000000000000000000000000000000005, ), Negated( Fixed { - query_index: 21, - column_index: 21, + query_index: 24, + column_index: 24, rotation: Rotation( 0, ), @@ -9953,7 +10771,7 @@ PinnedVerificationKey { }, Sum( Advice { - query_index: 18, + query_index: 19, column_index: 7, rotation: Rotation( 1, @@ -9980,21 +10798,37 @@ PinnedVerificationKey { Product( Product( Product( - Fixed { - query_index: 21, - column_index: 21, - rotation: Rotation( - 0, + Product( + Fixed { + query_index: 24, + column_index: 24, + rotation: Rotation( + 0, + ), + }, + Sum( + Constant( + 0x0000000000000000000000000000000000000000000000000000000000000001, + ), + Negated( + Fixed { + query_index: 24, + column_index: 24, + rotation: Rotation( + 0, + ), + }, + ), ), - }, + ), Sum( Constant( - 0x0000000000000000000000000000000000000000000000000000000000000001, + 0x0000000000000000000000000000000000000000000000000000000000000002, ), Negated( Fixed { - query_index: 21, - column_index: 21, + query_index: 24, + column_index: 24, rotation: Rotation( 0, ), @@ -10004,12 +10838,12 @@ PinnedVerificationKey { ), Sum( Constant( - 0x0000000000000000000000000000000000000000000000000000000000000002, + 0x0000000000000000000000000000000000000000000000000000000000000003, ), Negated( Fixed { - query_index: 21, - column_index: 21, + query_index: 24, + column_index: 24, rotation: Rotation( 0, ), @@ -10019,12 +10853,12 @@ PinnedVerificationKey { ), Sum( Constant( - 0x0000000000000000000000000000000000000000000000000000000000000004, + 0x0000000000000000000000000000000000000000000000000000000000000005, ), Negated( Fixed { - query_index: 21, - column_index: 21, + query_index: 24, + column_index: 24, rotation: Rotation( 0, ), @@ -10043,7 +10877,7 @@ PinnedVerificationKey { Product( Sum( Advice { - query_index: 19, + query_index: 20, column_index: 8, rotation: Rotation( 1, @@ -10052,7 +10886,7 @@ PinnedVerificationKey { Negated( Scaled( Advice { - query_index: 18, + query_index: 19, column_index: 7, rotation: Rotation( 1, @@ -10069,7 +10903,7 @@ PinnedVerificationKey { Negated( Sum( Advice { - query_index: 19, + query_index: 20, column_index: 8, rotation: Rotation( 1, @@ -10078,7 +10912,7 @@ PinnedVerificationKey { Negated( Scaled( Advice { - query_index: 18, + query_index: 19, column_index: 7, rotation: Rotation( 1, @@ -10097,21 +10931,37 @@ PinnedVerificationKey { Product( Product( Product( - Fixed { - query_index: 21, - column_index: 21, - rotation: Rotation( - 0, + Product( + Fixed { + query_index: 24, + column_index: 24, + rotation: Rotation( + 0, + ), + }, + Sum( + Constant( + 0x0000000000000000000000000000000000000000000000000000000000000001, + ), + Negated( + Fixed { + query_index: 24, + column_index: 24, + rotation: Rotation( + 0, + ), + }, + ), ), - }, + ), Sum( Constant( - 0x0000000000000000000000000000000000000000000000000000000000000001, + 0x0000000000000000000000000000000000000000000000000000000000000002, ), Negated( Fixed { - query_index: 21, - column_index: 21, + query_index: 24, + column_index: 24, rotation: Rotation( 0, ), @@ -10121,12 +10971,12 @@ PinnedVerificationKey { ), Sum( Constant( - 0x0000000000000000000000000000000000000000000000000000000000000002, + 0x0000000000000000000000000000000000000000000000000000000000000003, ), Negated( Fixed { - query_index: 21, - column_index: 21, + query_index: 24, + column_index: 24, rotation: Rotation( 0, ), @@ -10136,12 +10986,12 @@ PinnedVerificationKey { ), Sum( Constant( - 0x0000000000000000000000000000000000000000000000000000000000000004, + 0x0000000000000000000000000000000000000000000000000000000000000005, ), Negated( Fixed { - query_index: 21, - column_index: 21, + query_index: 24, + column_index: 24, rotation: Rotation( 0, ), @@ -10158,7 +11008,7 @@ PinnedVerificationKey { ), }, Advice { - query_index: 22, + query_index: 16, column_index: 6, rotation: Rotation( 1, @@ -10170,21 +11020,37 @@ PinnedVerificationKey { Product( Product( Product( - Fixed { - query_index: 21, - column_index: 21, - rotation: Rotation( - 0, + Product( + Fixed { + query_index: 24, + column_index: 24, + rotation: Rotation( + 0, + ), + }, + Sum( + Constant( + 0x0000000000000000000000000000000000000000000000000000000000000001, + ), + Negated( + Fixed { + query_index: 24, + column_index: 24, + rotation: Rotation( + 0, + ), + }, + ), ), - }, + ), Sum( Constant( - 0x0000000000000000000000000000000000000000000000000000000000000001, + 0x0000000000000000000000000000000000000000000000000000000000000002, ), Negated( Fixed { - query_index: 21, - column_index: 21, + query_index: 24, + column_index: 24, rotation: Rotation( 0, ), @@ -10194,12 +11060,12 @@ PinnedVerificationKey { ), Sum( Constant( - 0x0000000000000000000000000000000000000000000000000000000000000002, + 0x0000000000000000000000000000000000000000000000000000000000000003, ), Negated( Fixed { - query_index: 21, - column_index: 21, + query_index: 24, + column_index: 24, rotation: Rotation( 0, ), @@ -10209,12 +11075,12 @@ PinnedVerificationKey { ), Sum( Constant( - 0x0000000000000000000000000000000000000000000000000000000000000004, + 0x0000000000000000000000000000000000000000000000000000000000000005, ), Negated( Fixed { - query_index: 21, - column_index: 21, + query_index: 24, + column_index: 24, rotation: Rotation( 0, ), @@ -10282,21 +11148,37 @@ PinnedVerificationKey { Product( Product( Product( - Fixed { - query_index: 21, - column_index: 21, - rotation: Rotation( - 0, + Product( + Fixed { + query_index: 24, + column_index: 24, + rotation: Rotation( + 0, + ), + }, + Sum( + Constant( + 0x0000000000000000000000000000000000000000000000000000000000000001, + ), + Negated( + Fixed { + query_index: 24, + column_index: 24, + rotation: Rotation( + 0, + ), + }, + ), ), - }, + ), Sum( Constant( - 0x0000000000000000000000000000000000000000000000000000000000000001, + 0x0000000000000000000000000000000000000000000000000000000000000002, ), Negated( Fixed { - query_index: 21, - column_index: 21, + query_index: 24, + column_index: 24, rotation: Rotation( 0, ), @@ -10306,12 +11188,12 @@ PinnedVerificationKey { ), Sum( Constant( - 0x0000000000000000000000000000000000000000000000000000000000000002, + 0x0000000000000000000000000000000000000000000000000000000000000003, ), Negated( Fixed { - query_index: 21, - column_index: 21, + query_index: 24, + column_index: 24, rotation: Rotation( 0, ), @@ -10321,12 +11203,12 @@ PinnedVerificationKey { ), Sum( Constant( - 0x0000000000000000000000000000000000000000000000000000000000000004, + 0x0000000000000000000000000000000000000000000000000000000000000005, ), Negated( Fixed { - query_index: 21, - column_index: 21, + query_index: 24, + column_index: 24, rotation: Rotation( 0, ), @@ -10362,21 +11244,37 @@ PinnedVerificationKey { Product( Product( Product( - Fixed { - query_index: 21, - column_index: 21, - rotation: Rotation( - 0, + Product( + Fixed { + query_index: 24, + column_index: 24, + rotation: Rotation( + 0, + ), + }, + Sum( + Constant( + 0x0000000000000000000000000000000000000000000000000000000000000001, + ), + Negated( + Fixed { + query_index: 24, + column_index: 24, + rotation: Rotation( + 0, + ), + }, + ), ), - }, + ), Sum( Constant( - 0x0000000000000000000000000000000000000000000000000000000000000001, + 0x0000000000000000000000000000000000000000000000000000000000000002, ), Negated( Fixed { - query_index: 21, - column_index: 21, + query_index: 24, + column_index: 24, rotation: Rotation( 0, ), @@ -10386,12 +11284,12 @@ PinnedVerificationKey { ), Sum( Constant( - 0x0000000000000000000000000000000000000000000000000000000000000002, + 0x0000000000000000000000000000000000000000000000000000000000000003, ), Negated( Fixed { - query_index: 21, - column_index: 21, + query_index: 24, + column_index: 24, rotation: Rotation( 0, ), @@ -10401,12 +11299,12 @@ PinnedVerificationKey { ), Sum( Constant( - 0x0000000000000000000000000000000000000000000000000000000000000004, + 0x0000000000000000000000000000000000000000000000000000000000000005, ), Negated( Fixed { - query_index: 21, - column_index: 21, + query_index: 24, + column_index: 24, rotation: Rotation( 0, ), @@ -10449,21 +11347,37 @@ PinnedVerificationKey { Product( Product( Product( - Fixed { - query_index: 21, - column_index: 21, - rotation: Rotation( - 0, + Product( + Fixed { + query_index: 24, + column_index: 24, + rotation: Rotation( + 0, + ), + }, + Sum( + Constant( + 0x0000000000000000000000000000000000000000000000000000000000000001, + ), + Negated( + Fixed { + query_index: 24, + column_index: 24, + rotation: Rotation( + 0, + ), + }, + ), ), - }, + ), Sum( Constant( - 0x0000000000000000000000000000000000000000000000000000000000000001, + 0x0000000000000000000000000000000000000000000000000000000000000002, ), Negated( Fixed { - query_index: 21, - column_index: 21, + query_index: 24, + column_index: 24, rotation: Rotation( 0, ), @@ -10473,12 +11387,12 @@ PinnedVerificationKey { ), Sum( Constant( - 0x0000000000000000000000000000000000000000000000000000000000000002, + 0x0000000000000000000000000000000000000000000000000000000000000003, ), Negated( Fixed { - query_index: 21, - column_index: 21, + query_index: 24, + column_index: 24, rotation: Rotation( 0, ), @@ -10488,12 +11402,12 @@ PinnedVerificationKey { ), Sum( Constant( - 0x0000000000000000000000000000000000000000000000000000000000000004, + 0x0000000000000000000000000000000000000000000000000000000000000005, ), Negated( Fixed { - query_index: 21, - column_index: 21, + query_index: 24, + column_index: 24, rotation: Rotation( 0, ), @@ -10514,7 +11428,7 @@ PinnedVerificationKey { Sum( Sum( Advice { - query_index: 20, + query_index: 21, column_index: 6, rotation: Rotation( -1, @@ -10551,20 +11465,20 @@ PinnedVerificationKey { Product( Product( Fixed { - query_index: 21, - column_index: 21, + query_index: 27, + column_index: 27, rotation: Rotation( 0, ), }, Sum( Constant( - 0x0000000000000000000000000000000000000000000000000000000000000001, + 0x0000000000000000000000000000000000000000000000000000000000000002, ), Negated( Fixed { - query_index: 21, - column_index: 21, + query_index: 27, + column_index: 27, rotation: Rotation( 0, ), @@ -10574,12 +11488,12 @@ PinnedVerificationKey { ), Sum( Constant( - 0x0000000000000000000000000000000000000000000000000000000000000002, + 0x0000000000000000000000000000000000000000000000000000000000000003, ), Negated( Fixed { - query_index: 21, - column_index: 21, + query_index: 27, + column_index: 27, rotation: Rotation( 0, ), @@ -10589,12 +11503,12 @@ PinnedVerificationKey { ), Sum( Constant( - 0x0000000000000000000000000000000000000000000000000000000000000003, + 0x0000000000000000000000000000000000000000000000000000000000000004, ), Negated( Fixed { - query_index: 21, - column_index: 21, + query_index: 27, + column_index: 27, rotation: Rotation( 0, ), @@ -10618,8 +11532,8 @@ PinnedVerificationKey { ), }, Fixed { - query_index: 4, - column_index: 5, + query_index: 5, + column_index: 6, rotation: Rotation( 0, ), @@ -10634,8 +11548,8 @@ PinnedVerificationKey { ), }, Fixed { - query_index: 4, - column_index: 5, + query_index: 5, + column_index: 6, rotation: Rotation( 0, ), @@ -10652,8 +11566,8 @@ PinnedVerificationKey { ), }, Fixed { - query_index: 4, - column_index: 5, + query_index: 5, + column_index: 6, rotation: Rotation( 0, ), @@ -10668,8 +11582,8 @@ PinnedVerificationKey { ), }, Fixed { - query_index: 4, - column_index: 5, + query_index: 5, + column_index: 6, rotation: Rotation( 0, ), @@ -10686,8 +11600,8 @@ PinnedVerificationKey { ), }, Fixed { - query_index: 4, - column_index: 5, + query_index: 5, + column_index: 6, rotation: Rotation( 0, ), @@ -10709,8 +11623,8 @@ PinnedVerificationKey { ), }, Fixed { - query_index: 5, - column_index: 6, + query_index: 6, + column_index: 7, rotation: Rotation( 0, ), @@ -10725,8 +11639,8 @@ PinnedVerificationKey { ), }, Fixed { - query_index: 5, - column_index: 6, + query_index: 6, + column_index: 7, rotation: Rotation( 0, ), @@ -10743,8 +11657,8 @@ PinnedVerificationKey { ), }, Fixed { - query_index: 5, - column_index: 6, + query_index: 6, + column_index: 7, rotation: Rotation( 0, ), @@ -10759,8 +11673,8 @@ PinnedVerificationKey { ), }, Fixed { - query_index: 5, - column_index: 6, + query_index: 6, + column_index: 7, rotation: Rotation( 0, ), @@ -10777,8 +11691,8 @@ PinnedVerificationKey { ), }, Fixed { - query_index: 5, - column_index: 6, + query_index: 6, + column_index: 7, rotation: Rotation( 0, ), @@ -10801,8 +11715,8 @@ PinnedVerificationKey { ), }, Fixed { - query_index: 6, - column_index: 7, + query_index: 7, + column_index: 8, rotation: Rotation( 0, ), @@ -10817,8 +11731,8 @@ PinnedVerificationKey { ), }, Fixed { - query_index: 6, - column_index: 7, + query_index: 7, + column_index: 8, rotation: Rotation( 0, ), @@ -10835,8 +11749,8 @@ PinnedVerificationKey { ), }, Fixed { - query_index: 6, - column_index: 7, + query_index: 7, + column_index: 8, rotation: Rotation( 0, ), @@ -10851,8 +11765,8 @@ PinnedVerificationKey { ), }, Fixed { - query_index: 6, - column_index: 7, + query_index: 7, + column_index: 8, rotation: Rotation( 0, ), @@ -10869,8 +11783,8 @@ PinnedVerificationKey { ), }, Fixed { - query_index: 6, - column_index: 7, + query_index: 7, + column_index: 8, rotation: Rotation( 0, ), @@ -10882,7 +11796,7 @@ PinnedVerificationKey { ), Negated( Advice { - query_index: 22, + query_index: 16, column_index: 6, rotation: Rotation( 1, @@ -10896,20 +11810,20 @@ PinnedVerificationKey { Product( Product( Fixed { - query_index: 21, - column_index: 21, + query_index: 27, + column_index: 27, rotation: Rotation( 0, ), }, Sum( Constant( - 0x0000000000000000000000000000000000000000000000000000000000000001, + 0x0000000000000000000000000000000000000000000000000000000000000002, ), Negated( Fixed { - query_index: 21, - column_index: 21, + query_index: 27, + column_index: 27, rotation: Rotation( 0, ), @@ -10919,12 +11833,12 @@ PinnedVerificationKey { ), Sum( Constant( - 0x0000000000000000000000000000000000000000000000000000000000000002, + 0x0000000000000000000000000000000000000000000000000000000000000003, ), Negated( Fixed { - query_index: 21, - column_index: 21, + query_index: 27, + column_index: 27, rotation: Rotation( 0, ), @@ -10934,12 +11848,12 @@ PinnedVerificationKey { ), Sum( Constant( - 0x0000000000000000000000000000000000000000000000000000000000000003, + 0x0000000000000000000000000000000000000000000000000000000000000004, ), Negated( Fixed { - query_index: 21, - column_index: 21, + query_index: 27, + column_index: 27, rotation: Rotation( 0, ), @@ -10963,8 +11877,8 @@ PinnedVerificationKey { ), }, Fixed { - query_index: 4, - column_index: 5, + query_index: 5, + column_index: 6, rotation: Rotation( 0, ), @@ -10979,8 +11893,8 @@ PinnedVerificationKey { ), }, Fixed { - query_index: 4, - column_index: 5, + query_index: 5, + column_index: 6, rotation: Rotation( 0, ), @@ -10997,8 +11911,8 @@ PinnedVerificationKey { ), }, Fixed { - query_index: 4, - column_index: 5, + query_index: 5, + column_index: 6, rotation: Rotation( 0, ), @@ -11013,8 +11927,8 @@ PinnedVerificationKey { ), }, Fixed { - query_index: 4, - column_index: 5, + query_index: 5, + column_index: 6, rotation: Rotation( 0, ), @@ -11031,8 +11945,8 @@ PinnedVerificationKey { ), }, Fixed { - query_index: 4, - column_index: 5, + query_index: 5, + column_index: 6, rotation: Rotation( 0, ), @@ -11054,8 +11968,8 @@ PinnedVerificationKey { ), }, Fixed { - query_index: 5, - column_index: 6, + query_index: 6, + column_index: 7, rotation: Rotation( 0, ), @@ -11070,8 +11984,8 @@ PinnedVerificationKey { ), }, Fixed { - query_index: 5, - column_index: 6, + query_index: 6, + column_index: 7, rotation: Rotation( 0, ), @@ -11088,8 +12002,8 @@ PinnedVerificationKey { ), }, Fixed { - query_index: 5, - column_index: 6, + query_index: 6, + column_index: 7, rotation: Rotation( 0, ), @@ -11104,8 +12018,8 @@ PinnedVerificationKey { ), }, Fixed { - query_index: 5, - column_index: 6, + query_index: 6, + column_index: 7, rotation: Rotation( 0, ), @@ -11122,8 +12036,8 @@ PinnedVerificationKey { ), }, Fixed { - query_index: 5, - column_index: 6, + query_index: 6, + column_index: 7, rotation: Rotation( 0, ), @@ -11146,8 +12060,8 @@ PinnedVerificationKey { ), }, Fixed { - query_index: 6, - column_index: 7, + query_index: 7, + column_index: 8, rotation: Rotation( 0, ), @@ -11162,8 +12076,8 @@ PinnedVerificationKey { ), }, Fixed { - query_index: 6, - column_index: 7, + query_index: 7, + column_index: 8, rotation: Rotation( 0, ), @@ -11180,8 +12094,8 @@ PinnedVerificationKey { ), }, Fixed { - query_index: 6, - column_index: 7, + query_index: 7, + column_index: 8, rotation: Rotation( 0, ), @@ -11196,8 +12110,8 @@ PinnedVerificationKey { ), }, Fixed { - query_index: 6, - column_index: 7, + query_index: 7, + column_index: 8, rotation: Rotation( 0, ), @@ -11214,8 +12128,8 @@ PinnedVerificationKey { ), }, Fixed { - query_index: 6, - column_index: 7, + query_index: 7, + column_index: 8, rotation: Rotation( 0, ), @@ -11227,7 +12141,7 @@ PinnedVerificationKey { ), Negated( Advice { - query_index: 18, + query_index: 19, column_index: 7, rotation: Rotation( 1, @@ -11241,20 +12155,20 @@ PinnedVerificationKey { Product( Product( Fixed { - query_index: 21, - column_index: 21, + query_index: 27, + column_index: 27, rotation: Rotation( 0, ), }, Sum( Constant( - 0x0000000000000000000000000000000000000000000000000000000000000001, + 0x0000000000000000000000000000000000000000000000000000000000000002, ), Negated( Fixed { - query_index: 21, - column_index: 21, + query_index: 27, + column_index: 27, rotation: Rotation( 0, ), @@ -11264,12 +12178,12 @@ PinnedVerificationKey { ), Sum( Constant( - 0x0000000000000000000000000000000000000000000000000000000000000002, + 0x0000000000000000000000000000000000000000000000000000000000000003, ), Negated( Fixed { - query_index: 21, - column_index: 21, + query_index: 27, + column_index: 27, rotation: Rotation( 0, ), @@ -11279,12 +12193,12 @@ PinnedVerificationKey { ), Sum( Constant( - 0x0000000000000000000000000000000000000000000000000000000000000003, + 0x0000000000000000000000000000000000000000000000000000000000000004, ), Negated( Fixed { - query_index: 21, - column_index: 21, + query_index: 27, + column_index: 27, rotation: Rotation( 0, ), @@ -11308,8 +12222,8 @@ PinnedVerificationKey { ), }, Fixed { - query_index: 4, - column_index: 5, + query_index: 5, + column_index: 6, rotation: Rotation( 0, ), @@ -11324,8 +12238,8 @@ PinnedVerificationKey { ), }, Fixed { - query_index: 4, - column_index: 5, + query_index: 5, + column_index: 6, rotation: Rotation( 0, ), @@ -11342,8 +12256,8 @@ PinnedVerificationKey { ), }, Fixed { - query_index: 4, - column_index: 5, + query_index: 5, + column_index: 6, rotation: Rotation( 0, ), @@ -11358,8 +12272,8 @@ PinnedVerificationKey { ), }, Fixed { - query_index: 4, - column_index: 5, + query_index: 5, + column_index: 6, rotation: Rotation( 0, ), @@ -11376,8 +12290,8 @@ PinnedVerificationKey { ), }, Fixed { - query_index: 4, - column_index: 5, + query_index: 5, + column_index: 6, rotation: Rotation( 0, ), @@ -11399,8 +12313,8 @@ PinnedVerificationKey { ), }, Fixed { - query_index: 5, - column_index: 6, + query_index: 6, + column_index: 7, rotation: Rotation( 0, ), @@ -11415,8 +12329,8 @@ PinnedVerificationKey { ), }, Fixed { - query_index: 5, - column_index: 6, + query_index: 6, + column_index: 7, rotation: Rotation( 0, ), @@ -11433,8 +12347,8 @@ PinnedVerificationKey { ), }, Fixed { - query_index: 5, - column_index: 6, + query_index: 6, + column_index: 7, rotation: Rotation( 0, ), @@ -11449,8 +12363,8 @@ PinnedVerificationKey { ), }, Fixed { - query_index: 5, - column_index: 6, + query_index: 6, + column_index: 7, rotation: Rotation( 0, ), @@ -11467,8 +12381,8 @@ PinnedVerificationKey { ), }, Fixed { - query_index: 5, - column_index: 6, + query_index: 6, + column_index: 7, rotation: Rotation( 0, ), @@ -11491,8 +12405,8 @@ PinnedVerificationKey { ), }, Fixed { - query_index: 6, - column_index: 7, + query_index: 7, + column_index: 8, rotation: Rotation( 0, ), @@ -11507,8 +12421,8 @@ PinnedVerificationKey { ), }, Fixed { - query_index: 6, - column_index: 7, + query_index: 7, + column_index: 8, rotation: Rotation( 0, ), @@ -11525,8 +12439,8 @@ PinnedVerificationKey { ), }, Fixed { - query_index: 6, - column_index: 7, + query_index: 7, + column_index: 8, rotation: Rotation( 0, ), @@ -11541,8 +12455,8 @@ PinnedVerificationKey { ), }, Fixed { - query_index: 6, - column_index: 7, + query_index: 7, + column_index: 8, rotation: Rotation( 0, ), @@ -11559,8 +12473,8 @@ PinnedVerificationKey { ), }, Fixed { - query_index: 6, - column_index: 7, + query_index: 7, + column_index: 8, rotation: Rotation( 0, ), @@ -11572,7 +12486,7 @@ PinnedVerificationKey { ), Negated( Advice { - query_index: 19, + query_index: 20, column_index: 8, rotation: Rotation( 1, @@ -11586,20 +12500,20 @@ PinnedVerificationKey { Product( Product( Fixed { - query_index: 24, - column_index: 24, + query_index: 27, + column_index: 27, rotation: Rotation( 0, ), }, Sum( Constant( - 0x0000000000000000000000000000000000000000000000000000000000000002, + 0x0000000000000000000000000000000000000000000000000000000000000001, ), Negated( Fixed { - query_index: 24, - column_index: 24, + query_index: 27, + column_index: 27, rotation: Rotation( 0, ), @@ -11613,8 +12527,8 @@ PinnedVerificationKey { ), Negated( Fixed { - query_index: 24, - column_index: 24, + query_index: 27, + column_index: 27, rotation: Rotation( 0, ), @@ -11628,8 +12542,8 @@ PinnedVerificationKey { ), Negated( Fixed { - query_index: 24, - column_index: 24, + query_index: 27, + column_index: 27, rotation: Rotation( 0, ), @@ -11650,8 +12564,8 @@ PinnedVerificationKey { ), }, Fixed { - query_index: 4, - column_index: 5, + query_index: 5, + column_index: 6, rotation: Rotation( 0, ), @@ -11666,8 +12580,8 @@ PinnedVerificationKey { ), }, Fixed { - query_index: 4, - column_index: 5, + query_index: 5, + column_index: 6, rotation: Rotation( 0, ), @@ -11684,8 +12598,8 @@ PinnedVerificationKey { ), }, Fixed { - query_index: 4, - column_index: 5, + query_index: 5, + column_index: 6, rotation: Rotation( 0, ), @@ -11700,8 +12614,8 @@ PinnedVerificationKey { ), }, Fixed { - query_index: 4, - column_index: 5, + query_index: 5, + column_index: 6, rotation: Rotation( 0, ), @@ -11718,8 +12632,8 @@ PinnedVerificationKey { ), }, Fixed { - query_index: 4, - column_index: 5, + query_index: 5, + column_index: 6, rotation: Rotation( 0, ), @@ -11742,20 +12656,20 @@ PinnedVerificationKey { Product( Product( Fixed { - query_index: 24, - column_index: 24, + query_index: 27, + column_index: 27, rotation: Rotation( 0, ), }, Sum( Constant( - 0x0000000000000000000000000000000000000000000000000000000000000002, + 0x0000000000000000000000000000000000000000000000000000000000000001, ), Negated( Fixed { - query_index: 24, - column_index: 24, + query_index: 27, + column_index: 27, rotation: Rotation( 0, ), @@ -11769,8 +12683,8 @@ PinnedVerificationKey { ), Negated( Fixed { - query_index: 24, - column_index: 24, + query_index: 27, + column_index: 27, rotation: Rotation( 0, ), @@ -11784,8 +12698,8 @@ PinnedVerificationKey { ), Negated( Fixed { - query_index: 24, - column_index: 24, + query_index: 27, + column_index: 27, rotation: Rotation( 0, ), @@ -11820,8 +12734,8 @@ PinnedVerificationKey { ), }, Fixed { - query_index: 5, - column_index: 6, + query_index: 6, + column_index: 7, rotation: Rotation( 0, ), @@ -11840,8 +12754,8 @@ PinnedVerificationKey { ), }, Fixed { - query_index: 6, - column_index: 7, + query_index: 7, + column_index: 8, rotation: Rotation( 0, ), @@ -11851,8 +12765,8 @@ PinnedVerificationKey { ), ), Fixed { - query_index: 7, - column_index: 8, + query_index: 8, + column_index: 9, rotation: Rotation( 0, ), @@ -11881,8 +12795,8 @@ PinnedVerificationKey { ), }, Fixed { - query_index: 5, - column_index: 6, + query_index: 6, + column_index: 7, rotation: Rotation( 0, ), @@ -11901,8 +12815,8 @@ PinnedVerificationKey { ), }, Fixed { - query_index: 6, - column_index: 7, + query_index: 7, + column_index: 8, rotation: Rotation( 0, ), @@ -11912,8 +12826,8 @@ PinnedVerificationKey { ), ), Fixed { - query_index: 7, - column_index: 8, + query_index: 8, + column_index: 9, rotation: Rotation( 0, ), @@ -11944,8 +12858,8 @@ PinnedVerificationKey { ), }, Fixed { - query_index: 5, - column_index: 6, + query_index: 6, + column_index: 7, rotation: Rotation( 0, ), @@ -11964,8 +12878,8 @@ PinnedVerificationKey { ), }, Fixed { - query_index: 6, - column_index: 7, + query_index: 7, + column_index: 8, rotation: Rotation( 0, ), @@ -11975,8 +12889,8 @@ PinnedVerificationKey { ), ), Fixed { - query_index: 7, - column_index: 8, + query_index: 8, + column_index: 9, rotation: Rotation( 0, ), @@ -12005,8 +12919,8 @@ PinnedVerificationKey { ), }, Fixed { - query_index: 5, - column_index: 6, + query_index: 6, + column_index: 7, rotation: Rotation( 0, ), @@ -12025,8 +12939,8 @@ PinnedVerificationKey { ), }, Fixed { - query_index: 6, - column_index: 7, + query_index: 7, + column_index: 8, rotation: Rotation( 0, ), @@ -12036,8 +12950,8 @@ PinnedVerificationKey { ), ), Fixed { - query_index: 7, - column_index: 8, + query_index: 8, + column_index: 9, rotation: Rotation( 0, ), @@ -12068,8 +12982,8 @@ PinnedVerificationKey { ), }, Fixed { - query_index: 5, - column_index: 6, + query_index: 6, + column_index: 7, rotation: Rotation( 0, ), @@ -12088,8 +13002,8 @@ PinnedVerificationKey { ), }, Fixed { - query_index: 6, - column_index: 7, + query_index: 7, + column_index: 8, rotation: Rotation( 0, ), @@ -12099,8 +13013,8 @@ PinnedVerificationKey { ), ), Fixed { - query_index: 7, - column_index: 8, + query_index: 8, + column_index: 9, rotation: Rotation( 0, ), @@ -12112,7 +13026,7 @@ PinnedVerificationKey { Sum( Scaled( Advice { - query_index: 22, + query_index: 16, column_index: 6, rotation: Rotation( 1, @@ -12122,7 +13036,7 @@ PinnedVerificationKey { ), Scaled( Advice { - query_index: 18, + query_index: 19, column_index: 7, rotation: Rotation( 1, @@ -12133,7 +13047,7 @@ PinnedVerificationKey { ), Scaled( Advice { - query_index: 19, + query_index: 20, column_index: 8, rotation: Rotation( 1, @@ -12150,20 +13064,20 @@ PinnedVerificationKey { Product( Product( Fixed { - query_index: 24, - column_index: 24, + query_index: 27, + column_index: 27, rotation: Rotation( 0, ), }, Sum( Constant( - 0x0000000000000000000000000000000000000000000000000000000000000002, + 0x0000000000000000000000000000000000000000000000000000000000000001, ), Negated( Fixed { - query_index: 24, - column_index: 24, + query_index: 27, + column_index: 27, rotation: Rotation( 0, ), @@ -12177,8 +13091,8 @@ PinnedVerificationKey { ), Negated( Fixed { - query_index: 24, - column_index: 24, + query_index: 27, + column_index: 27, rotation: Rotation( 0, ), @@ -12192,8 +13106,8 @@ PinnedVerificationKey { ), Negated( Fixed { - query_index: 24, - column_index: 24, + query_index: 27, + column_index: 27, rotation: Rotation( 0, ), @@ -12225,8 +13139,8 @@ PinnedVerificationKey { ), }, Fixed { - query_index: 5, - column_index: 6, + query_index: 6, + column_index: 7, rotation: Rotation( 0, ), @@ -12245,8 +13159,8 @@ PinnedVerificationKey { ), }, Fixed { - query_index: 6, - column_index: 7, + query_index: 7, + column_index: 8, rotation: Rotation( 0, ), @@ -12256,8 +13170,8 @@ PinnedVerificationKey { ), ), Fixed { - query_index: 8, - column_index: 9, + query_index: 9, + column_index: 10, rotation: Rotation( 0, ), @@ -12268,7 +13182,7 @@ PinnedVerificationKey { Sum( Scaled( Advice { - query_index: 22, + query_index: 16, column_index: 6, rotation: Rotation( 1, @@ -12278,7 +13192,7 @@ PinnedVerificationKey { ), Scaled( Advice { - query_index: 18, + query_index: 19, column_index: 7, rotation: Rotation( 1, @@ -12289,7 +13203,7 @@ PinnedVerificationKey { ), Scaled( Advice { - query_index: 19, + query_index: 20, column_index: 8, rotation: Rotation( 1, @@ -12306,20 +13220,20 @@ PinnedVerificationKey { Product( Product( Fixed { - query_index: 24, - column_index: 24, + query_index: 27, + column_index: 27, rotation: Rotation( 0, ), }, Sum( Constant( - 0x0000000000000000000000000000000000000000000000000000000000000002, + 0x0000000000000000000000000000000000000000000000000000000000000001, ), Negated( Fixed { - query_index: 24, - column_index: 24, + query_index: 27, + column_index: 27, rotation: Rotation( 0, ), @@ -12333,8 +13247,8 @@ PinnedVerificationKey { ), Negated( Fixed { - query_index: 24, - column_index: 24, + query_index: 27, + column_index: 27, rotation: Rotation( 0, ), @@ -12348,8 +13262,8 @@ PinnedVerificationKey { ), Negated( Fixed { - query_index: 24, - column_index: 24, + query_index: 27, + column_index: 27, rotation: Rotation( 0, ), @@ -12381,8 +13295,8 @@ PinnedVerificationKey { ), }, Fixed { - query_index: 5, - column_index: 6, + query_index: 6, + column_index: 7, rotation: Rotation( 0, ), @@ -12401,8 +13315,8 @@ PinnedVerificationKey { ), }, Fixed { - query_index: 6, - column_index: 7, + query_index: 7, + column_index: 8, rotation: Rotation( 0, ), @@ -12412,8 +13326,8 @@ PinnedVerificationKey { ), ), Fixed { - query_index: 9, - column_index: 10, + query_index: 10, + column_index: 11, rotation: Rotation( 0, ), @@ -12424,7 +13338,7 @@ PinnedVerificationKey { Sum( Scaled( Advice { - query_index: 22, + query_index: 16, column_index: 6, rotation: Rotation( 1, @@ -12434,7 +13348,7 @@ PinnedVerificationKey { ), Scaled( Advice { - query_index: 18, + query_index: 19, column_index: 7, rotation: Rotation( 1, @@ -12445,7 +13359,7 @@ PinnedVerificationKey { ), Scaled( Advice { - query_index: 19, + query_index: 20, column_index: 8, rotation: Rotation( 1, @@ -12461,16 +13375,32 @@ PinnedVerificationKey { Product( Product( Product( - Fixed { - query_index: 24, - column_index: 24, - rotation: Rotation( - 0, + Product( + Fixed { + query_index: 24, + column_index: 24, + rotation: Rotation( + 0, + ), + }, + Sum( + Constant( + 0x0000000000000000000000000000000000000000000000000000000000000001, + ), + Negated( + Fixed { + query_index: 24, + column_index: 24, + rotation: Rotation( + 0, + ), + }, + ), ), - }, + ), Sum( Constant( - 0x0000000000000000000000000000000000000000000000000000000000000001, + 0x0000000000000000000000000000000000000000000000000000000000000002, ), Negated( Fixed { @@ -12516,7 +13446,7 @@ PinnedVerificationKey { Sum( Sum( Advice { - query_index: 20, + query_index: 21, column_index: 6, rotation: Rotation( -1, @@ -12532,7 +13462,7 @@ PinnedVerificationKey { ), Negated( Advice { - query_index: 22, + query_index: 16, column_index: 6, rotation: Rotation( 1, @@ -12545,16 +13475,32 @@ PinnedVerificationKey { Product( Product( Product( - Fixed { - query_index: 24, - column_index: 24, - rotation: Rotation( - 0, + Product( + Fixed { + query_index: 24, + column_index: 24, + rotation: Rotation( + 0, + ), + }, + Sum( + Constant( + 0x0000000000000000000000000000000000000000000000000000000000000001, + ), + Negated( + Fixed { + query_index: 24, + column_index: 24, + rotation: Rotation( + 0, + ), + }, + ), ), - }, + ), Sum( Constant( - 0x0000000000000000000000000000000000000000000000000000000000000001, + 0x0000000000000000000000000000000000000000000000000000000000000002, ), Negated( Fixed { @@ -12616,7 +13562,7 @@ PinnedVerificationKey { ), Negated( Advice { - query_index: 18, + query_index: 19, column_index: 7, rotation: Rotation( 1, @@ -12629,16 +13575,32 @@ PinnedVerificationKey { Product( Product( Product( - Fixed { - query_index: 24, - column_index: 24, - rotation: Rotation( - 0, + Product( + Fixed { + query_index: 24, + column_index: 24, + rotation: Rotation( + 0, + ), + }, + Sum( + Constant( + 0x0000000000000000000000000000000000000000000000000000000000000001, + ), + Negated( + Fixed { + query_index: 24, + column_index: 24, + rotation: Rotation( + 0, + ), + }, + ), ), - }, + ), Sum( Constant( - 0x0000000000000000000000000000000000000000000000000000000000000001, + 0x0000000000000000000000000000000000000000000000000000000000000002, ), Negated( Fixed { @@ -12691,7 +13653,7 @@ PinnedVerificationKey { }, Negated( Advice { - query_index: 19, + query_index: 20, column_index: 8, rotation: Rotation( 1, @@ -12704,21 +13666,53 @@ PinnedVerificationKey { Product( Product( Product( - Fixed { - query_index: 24, - column_index: 24, - rotation: Rotation( - 0, + Product( + Product( + Fixed { + query_index: 28, + column_index: 28, + rotation: Rotation( + 0, + ), + }, + Sum( + Constant( + 0x0000000000000000000000000000000000000000000000000000000000000002, + ), + Negated( + Fixed { + query_index: 28, + column_index: 28, + rotation: Rotation( + 0, + ), + }, + ), + ), ), - }, + Sum( + Constant( + 0x0000000000000000000000000000000000000000000000000000000000000003, + ), + Negated( + Fixed { + query_index: 28, + column_index: 28, + rotation: Rotation( + 0, + ), + }, + ), + ), + ), Sum( Constant( - 0x0000000000000000000000000000000000000000000000000000000000000001, + 0x0000000000000000000000000000000000000000000000000000000000000004, ), Negated( Fixed { - query_index: 24, - column_index: 24, + query_index: 28, + column_index: 28, rotation: Rotation( 0, ), @@ -12728,12 +13722,12 @@ PinnedVerificationKey { ), Sum( Constant( - 0x0000000000000000000000000000000000000000000000000000000000000002, + 0x0000000000000000000000000000000000000000000000000000000000000005, ), Negated( Fixed { - query_index: 24, - column_index: 24, + query_index: 28, + column_index: 28, rotation: Rotation( 0, ), @@ -12743,12 +13737,12 @@ PinnedVerificationKey { ), Sum( Constant( - 0x0000000000000000000000000000000000000000000000000000000000000004, + 0x0000000000000000000000000000000000000000000000000000000000000006, ), Negated( Fixed { - query_index: 24, - column_index: 24, + query_index: 28, + column_index: 28, rotation: Rotation( 0, ), @@ -12758,11 +13752,11 @@ PinnedVerificationKey { ), Sum( Scaled( - Fixed { - query_index: 0, - column_index: 3, + Advice { + query_index: 22, + column_index: 1, rotation: Rotation( - 0, + -1, ), }, 0x0000000000000000000000000000000000000000000000000000000000000002, @@ -12840,8 +13834,8 @@ PinnedVerificationKey { ), Product( Fixed { - query_index: 16, - column_index: 16, + query_index: 19, + column_index: 19, rotation: Rotation( 0, ), @@ -12867,7 +13861,7 @@ PinnedVerificationKey { Sum( Sum( Advice { - query_index: 16, + query_index: 10, column_index: 0, rotation: Rotation( 1, @@ -12925,8 +13919,8 @@ PinnedVerificationKey { ), Product( Fixed { - query_index: 16, - column_index: 16, + query_index: 19, + column_index: 19, rotation: Rotation( 0, ), @@ -12953,7 +13947,7 @@ PinnedVerificationKey { }, Negated( Advice { - query_index: 16, + query_index: 10, column_index: 0, rotation: Rotation( 1, @@ -13043,16 +14037,16 @@ PinnedVerificationKey { Negated( Product( Fixed { - query_index: 10, - column_index: 12, + query_index: 11, + column_index: 13, rotation: Rotation( 0, ), }, Sum( Fixed { - query_index: 10, - column_index: 12, + query_index: 11, + column_index: 13, rotation: Rotation( 0, ), @@ -13085,7 +14079,7 @@ PinnedVerificationKey { ), Sum( Advice { - query_index: 16, + query_index: 10, column_index: 0, rotation: Rotation( 1, @@ -13112,7 +14106,7 @@ PinnedVerificationKey { ), Negated( Advice { - query_index: 16, + query_index: 10, column_index: 0, rotation: Rotation( 1, @@ -13122,7 +14116,7 @@ PinnedVerificationKey { ), Negated( Advice { - query_index: 17, + query_index: 11, column_index: 1, rotation: Rotation( 1, @@ -13139,16 +14133,16 @@ PinnedVerificationKey { Scaled( Product( Fixed { - query_index: 10, - column_index: 12, + query_index: 11, + column_index: 13, rotation: Rotation( 0, ), }, Sum( Fixed { - query_index: 10, - column_index: 12, + query_index: 11, + column_index: 13, rotation: Rotation( 0, ), @@ -13179,8 +14173,8 @@ PinnedVerificationKey { Product( Product( Fixed { - query_index: 24, - column_index: 24, + query_index: 27, + column_index: 27, rotation: Rotation( 0, ), @@ -13191,8 +14185,8 @@ PinnedVerificationKey { ), Negated( Fixed { - query_index: 24, - column_index: 24, + query_index: 27, + column_index: 27, rotation: Rotation( 0, ), @@ -13206,8 +14200,8 @@ PinnedVerificationKey { ), Negated( Fixed { - query_index: 24, - column_index: 24, + query_index: 27, + column_index: 27, rotation: Rotation( 0, ), @@ -13217,12 +14211,12 @@ PinnedVerificationKey { ), Sum( Constant( - 0x0000000000000000000000000000000000000000000000000000000000000003, + 0x0000000000000000000000000000000000000000000000000000000000000004, ), Negated( Fixed { - query_index: 24, - column_index: 24, + query_index: 27, + column_index: 27, rotation: Rotation( 0, ), @@ -13288,8 +14282,8 @@ PinnedVerificationKey { Product( Product( Fixed { - query_index: 24, - column_index: 24, + query_index: 27, + column_index: 27, rotation: Rotation( 0, ), @@ -13300,8 +14294,8 @@ PinnedVerificationKey { ), Negated( Fixed { - query_index: 24, - column_index: 24, + query_index: 27, + column_index: 27, rotation: Rotation( 0, ), @@ -13315,8 +14309,8 @@ PinnedVerificationKey { ), Negated( Fixed { - query_index: 24, - column_index: 24, + query_index: 27, + column_index: 27, rotation: Rotation( 0, ), @@ -13326,12 +14320,12 @@ PinnedVerificationKey { ), Sum( Constant( - 0x0000000000000000000000000000000000000000000000000000000000000003, + 0x0000000000000000000000000000000000000000000000000000000000000004, ), Negated( Fixed { - query_index: 24, - column_index: 24, + query_index: 27, + column_index: 27, rotation: Rotation( 0, ), @@ -13397,8 +14391,8 @@ PinnedVerificationKey { Product( Product( Fixed { - query_index: 24, - column_index: 24, + query_index: 27, + column_index: 27, rotation: Rotation( 0, ), @@ -13409,8 +14403,8 @@ PinnedVerificationKey { ), Negated( Fixed { - query_index: 24, - column_index: 24, + query_index: 27, + column_index: 27, rotation: Rotation( 0, ), @@ -13424,8 +14418,8 @@ PinnedVerificationKey { ), Negated( Fixed { - query_index: 24, - column_index: 24, + query_index: 27, + column_index: 27, rotation: Rotation( 0, ), @@ -13435,12 +14429,12 @@ PinnedVerificationKey { ), Sum( Constant( - 0x0000000000000000000000000000000000000000000000000000000000000003, + 0x0000000000000000000000000000000000000000000000000000000000000004, ), Negated( Fixed { - query_index: 24, - column_index: 24, + query_index: 27, + column_index: 27, rotation: Rotation( 0, ), @@ -13476,53 +14470,21 @@ PinnedVerificationKey { Product( Product( Product( - Product( - Product( - Fixed { - query_index: 25, - column_index: 25, - rotation: Rotation( - 0, - ), - }, - Sum( - Constant( - 0x0000000000000000000000000000000000000000000000000000000000000002, - ), - Negated( - Fixed { - query_index: 25, - column_index: 25, - rotation: Rotation( - 0, - ), - }, - ), - ), - ), - Sum( - Constant( - 0x0000000000000000000000000000000000000000000000000000000000000003, - ), - Negated( - Fixed { - query_index: 25, - column_index: 25, - rotation: Rotation( - 0, - ), - }, - ), + Fixed { + query_index: 27, + column_index: 27, + rotation: Rotation( + 0, ), - ), + }, Sum( Constant( - 0x0000000000000000000000000000000000000000000000000000000000000004, + 0x0000000000000000000000000000000000000000000000000000000000000001, ), Negated( Fixed { - query_index: 25, - column_index: 25, + query_index: 27, + column_index: 27, rotation: Rotation( 0, ), @@ -13532,12 +14494,12 @@ PinnedVerificationKey { ), Sum( Constant( - 0x0000000000000000000000000000000000000000000000000000000000000005, + 0x0000000000000000000000000000000000000000000000000000000000000002, ), Negated( Fixed { - query_index: 25, - column_index: 25, + query_index: 27, + column_index: 27, rotation: Rotation( 0, ), @@ -13547,12 +14509,12 @@ PinnedVerificationKey { ), Sum( Constant( - 0x0000000000000000000000000000000000000000000000000000000000000006, + 0x0000000000000000000000000000000000000000000000000000000000000003, ), Negated( Fixed { - query_index: 25, - column_index: 25, + query_index: 27, + column_index: 27, rotation: Rotation( 0, ), @@ -13572,7 +14534,7 @@ PinnedVerificationKey { Negated( Scaled( Advice { - query_index: 16, + query_index: 10, column_index: 0, rotation: Rotation( 1, @@ -13597,53 +14559,21 @@ PinnedVerificationKey { Product( Product( Product( - Product( - Product( - Fixed { - query_index: 25, - column_index: 25, - rotation: Rotation( - 0, - ), - }, - Sum( - Constant( - 0x0000000000000000000000000000000000000000000000000000000000000002, - ), - Negated( - Fixed { - query_index: 25, - column_index: 25, - rotation: Rotation( - 0, - ), - }, - ), - ), - ), - Sum( - Constant( - 0x0000000000000000000000000000000000000000000000000000000000000003, - ), - Negated( - Fixed { - query_index: 25, - column_index: 25, - rotation: Rotation( - 0, - ), - }, - ), + Fixed { + query_index: 27, + column_index: 27, + rotation: Rotation( + 0, ), - ), + }, Sum( Constant( - 0x0000000000000000000000000000000000000000000000000000000000000004, + 0x0000000000000000000000000000000000000000000000000000000000000001, ), Negated( Fixed { - query_index: 25, - column_index: 25, + query_index: 27, + column_index: 27, rotation: Rotation( 0, ), @@ -13653,12 +14583,12 @@ PinnedVerificationKey { ), Sum( Constant( - 0x0000000000000000000000000000000000000000000000000000000000000005, + 0x0000000000000000000000000000000000000000000000000000000000000002, ), Negated( Fixed { - query_index: 25, - column_index: 25, + query_index: 27, + column_index: 27, rotation: Rotation( 0, ), @@ -13668,12 +14598,12 @@ PinnedVerificationKey { ), Sum( Constant( - 0x0000000000000000000000000000000000000000000000000000000000000006, + 0x0000000000000000000000000000000000000000000000000000000000000003, ), Negated( Fixed { - query_index: 25, - column_index: 25, + query_index: 27, + column_index: 27, rotation: Rotation( 0, ), @@ -13684,7 +14614,7 @@ PinnedVerificationKey { Sum( Sum( Advice { - query_index: 16, + query_index: 10, column_index: 0, rotation: Rotation( 1, @@ -13703,7 +14633,7 @@ PinnedVerificationKey { Negated( Scaled( Advice { - query_index: 17, + query_index: 11, column_index: 1, rotation: Rotation( 1, @@ -13742,53 +14672,21 @@ PinnedVerificationKey { Product( Product( Product( - Product( - Product( - Fixed { - query_index: 25, - column_index: 25, - rotation: Rotation( - 0, - ), - }, - Sum( - Constant( - 0x0000000000000000000000000000000000000000000000000000000000000002, - ), - Negated( - Fixed { - query_index: 25, - column_index: 25, - rotation: Rotation( - 0, - ), - }, - ), - ), - ), - Sum( - Constant( - 0x0000000000000000000000000000000000000000000000000000000000000003, - ), - Negated( - Fixed { - query_index: 25, - column_index: 25, - rotation: Rotation( - 0, - ), - }, - ), + Fixed { + query_index: 27, + column_index: 27, + rotation: Rotation( + 0, ), - ), + }, Sum( Constant( - 0x0000000000000000000000000000000000000000000000000000000000000004, + 0x0000000000000000000000000000000000000000000000000000000000000001, ), Negated( Fixed { - query_index: 25, - column_index: 25, + query_index: 27, + column_index: 27, rotation: Rotation( 0, ), @@ -13798,12 +14696,12 @@ PinnedVerificationKey { ), Sum( Constant( - 0x0000000000000000000000000000000000000000000000000000000000000005, + 0x0000000000000000000000000000000000000000000000000000000000000002, ), Negated( Fixed { - query_index: 25, - column_index: 25, + query_index: 27, + column_index: 27, rotation: Rotation( 0, ), @@ -13813,12 +14711,12 @@ PinnedVerificationKey { ), Sum( Constant( - 0x0000000000000000000000000000000000000000000000000000000000000006, + 0x0000000000000000000000000000000000000000000000000000000000000003, ), Negated( Fixed { - query_index: 25, - column_index: 25, + query_index: 27, + column_index: 27, rotation: Rotation( 0, ), @@ -13861,53 +14759,21 @@ PinnedVerificationKey { Product( Product( Product( - Product( - Product( - Fixed { - query_index: 25, - column_index: 25, - rotation: Rotation( - 0, - ), - }, - Sum( - Constant( - 0x0000000000000000000000000000000000000000000000000000000000000002, - ), - Negated( - Fixed { - query_index: 25, - column_index: 25, - rotation: Rotation( - 0, - ), - }, - ), - ), - ), - Sum( - Constant( - 0x0000000000000000000000000000000000000000000000000000000000000003, - ), - Negated( - Fixed { - query_index: 25, - column_index: 25, - rotation: Rotation( - 0, - ), - }, - ), + Fixed { + query_index: 27, + column_index: 27, + rotation: Rotation( + 0, ), - ), + }, Sum( Constant( - 0x0000000000000000000000000000000000000000000000000000000000000004, + 0x0000000000000000000000000000000000000000000000000000000000000001, ), Negated( Fixed { - query_index: 25, - column_index: 25, + query_index: 27, + column_index: 27, rotation: Rotation( 0, ), @@ -13917,12 +14783,12 @@ PinnedVerificationKey { ), Sum( Constant( - 0x0000000000000000000000000000000000000000000000000000000000000005, + 0x0000000000000000000000000000000000000000000000000000000000000002, ), Negated( Fixed { - query_index: 25, - column_index: 25, + query_index: 27, + column_index: 27, rotation: Rotation( 0, ), @@ -13932,12 +14798,12 @@ PinnedVerificationKey { ), Sum( Constant( - 0x0000000000000000000000000000000000000000000000000000000000000006, + 0x0000000000000000000000000000000000000000000000000000000000000003, ), Negated( Fixed { - query_index: 25, - column_index: 25, + query_index: 27, + column_index: 27, rotation: Rotation( 0, ), @@ -13947,7 +14813,7 @@ PinnedVerificationKey { ), Sum( Advice { - query_index: 17, + query_index: 11, column_index: 1, rotation: Rotation( 1, @@ -13983,20 +14849,20 @@ PinnedVerificationKey { Product( Product( Fixed { - query_index: 25, - column_index: 25, + query_index: 29, + column_index: 29, rotation: Rotation( 0, ), }, Sum( Constant( - 0x0000000000000000000000000000000000000000000000000000000000000001, + 0x0000000000000000000000000000000000000000000000000000000000000002, ), Negated( Fixed { - query_index: 25, - column_index: 25, + query_index: 29, + column_index: 29, rotation: Rotation( 0, ), @@ -14010,8 +14876,8 @@ PinnedVerificationKey { ), Negated( Fixed { - query_index: 25, - column_index: 25, + query_index: 29, + column_index: 29, rotation: Rotation( 0, ), @@ -14025,8 +14891,8 @@ PinnedVerificationKey { ), Negated( Fixed { - query_index: 25, - column_index: 25, + query_index: 29, + column_index: 29, rotation: Rotation( 0, ), @@ -14040,8 +14906,8 @@ PinnedVerificationKey { ), Negated( Fixed { - query_index: 25, - column_index: 25, + query_index: 29, + column_index: 29, rotation: Rotation( 0, ), @@ -14055,8 +14921,8 @@ PinnedVerificationKey { ), Negated( Fixed { - query_index: 25, - column_index: 25, + query_index: 29, + column_index: 29, rotation: Rotation( 0, ), @@ -14066,11 +14932,11 @@ PinnedVerificationKey { ), Sum( Scaled( - Fixed { - query_index: 3, - column_index: 4, + Advice { + query_index: 21, + column_index: 6, rotation: Rotation( - 0, + -1, ), }, 0x0000000000000000000000000000000000000000000000000000000000000002, @@ -14148,8 +15014,8 @@ PinnedVerificationKey { ), Product( Fixed { - query_index: 17, - column_index: 17, + query_index: 20, + column_index: 20, rotation: Rotation( 0, ), @@ -14233,8 +15099,8 @@ PinnedVerificationKey { ), Product( Fixed { - query_index: 17, - column_index: 17, + query_index: 20, + column_index: 20, rotation: Rotation( 0, ), @@ -14351,16 +15217,16 @@ PinnedVerificationKey { Negated( Product( Fixed { - query_index: 13, - column_index: 13, + query_index: 14, + column_index: 14, rotation: Rotation( 0, ), }, Sum( Fixed { - query_index: 13, - column_index: 13, + query_index: 14, + column_index: 14, rotation: Rotation( 0, ), @@ -14377,14 +15243,14 @@ PinnedVerificationKey { Product( Sum( Advice { - query_index: 19, + query_index: 20, column_index: 8, rotation: Rotation( 1, ), }, Advice { - query_index: 10, + query_index: 17, column_index: 9, rotation: Rotation( 1, @@ -14404,14 +15270,14 @@ PinnedVerificationKey { Sum( Product( Advice { - query_index: 19, + query_index: 20, column_index: 8, rotation: Rotation( 1, ), }, Advice { - query_index: 19, + query_index: 20, column_index: 8, rotation: Rotation( 1, @@ -14430,7 +15296,7 @@ PinnedVerificationKey { ), Negated( Advice { - query_index: 22, + query_index: 16, column_index: 6, rotation: Rotation( 1, @@ -14447,16 +15313,16 @@ PinnedVerificationKey { Scaled( Product( Fixed { - query_index: 13, - column_index: 13, + query_index: 14, + column_index: 14, rotation: Rotation( 0, ), }, Sum( Fixed { - query_index: 13, - column_index: 13, + query_index: 14, + column_index: 14, rotation: Rotation( 0, ), @@ -14471,7 +15337,7 @@ PinnedVerificationKey { 0x0000000000000000000000000000000000000000000000000000000000000002, ), Advice { - query_index: 19, + query_index: 20, column_index: 8, rotation: Rotation( 1, @@ -14488,37 +15354,1031 @@ PinnedVerificationKey { Product( Product( Product( - Product( - Fixed { - query_index: 26, - column_index: 26, - rotation: Rotation( - 0, - ), - }, - Sum( - Constant( - 0x0000000000000000000000000000000000000000000000000000000000000002, - ), - Negated( - Fixed { - query_index: 26, - column_index: 26, - rotation: Rotation( - 0, - ), - }, - ), + Fixed { + query_index: 28, + column_index: 28, + rotation: Rotation( + 0, ), - ), + }, Sum( Constant( - 0x0000000000000000000000000000000000000000000000000000000000000003, + 0x0000000000000000000000000000000000000000000000000000000000000001, ), Negated( Fixed { - query_index: 26, - column_index: 26, + query_index: 28, + column_index: 28, + rotation: Rotation( + 0, + ), + }, + ), + ), + ), + Sum( + Constant( + 0x0000000000000000000000000000000000000000000000000000000000000003, + ), + Negated( + Fixed { + query_index: 28, + column_index: 28, + rotation: Rotation( + 0, + ), + }, + ), + ), + ), + Sum( + Constant( + 0x0000000000000000000000000000000000000000000000000000000000000004, + ), + Negated( + Fixed { + query_index: 28, + column_index: 28, + rotation: Rotation( + 0, + ), + }, + ), + ), + ), + Sum( + Constant( + 0x0000000000000000000000000000000000000000000000000000000000000005, + ), + Negated( + Fixed { + query_index: 28, + column_index: 28, + rotation: Rotation( + 0, + ), + }, + ), + ), + ), + Sum( + Constant( + 0x0000000000000000000000000000000000000000000000000000000000000006, + ), + Negated( + Fixed { + query_index: 28, + column_index: 28, + rotation: Rotation( + 0, + ), + }, + ), + ), + ), + Sum( + Advice { + query_index: 7, + column_index: 7, + rotation: Rotation( + 0, + ), + }, + Negated( + Sum( + Product( + Advice { + query_index: 9, + column_index: 9, + rotation: Rotation( + 0, + ), + }, + Advice { + query_index: 6, + column_index: 6, + rotation: Rotation( + 0, + ), + }, + ), + Product( + Sum( + Constant( + 0x0000000000000000000000000000000000000000000000000000000000000001, + ), + Negated( + Advice { + query_index: 9, + column_index: 9, + rotation: Rotation( + 0, + ), + }, + ), + ), + Advice { + query_index: 5, + column_index: 5, + rotation: Rotation( + 0, + ), + }, + ), + ), + ), + ), + ), + Product( + Product( + Product( + Product( + Product( + Product( + Fixed { + query_index: 28, + column_index: 28, + rotation: Rotation( + 0, + ), + }, + Sum( + Constant( + 0x0000000000000000000000000000000000000000000000000000000000000001, + ), + Negated( + Fixed { + query_index: 28, + column_index: 28, + rotation: Rotation( + 0, + ), + }, + ), + ), + ), + Sum( + Constant( + 0x0000000000000000000000000000000000000000000000000000000000000003, + ), + Negated( + Fixed { + query_index: 28, + column_index: 28, + rotation: Rotation( + 0, + ), + }, + ), + ), + ), + Sum( + Constant( + 0x0000000000000000000000000000000000000000000000000000000000000004, + ), + Negated( + Fixed { + query_index: 28, + column_index: 28, + rotation: Rotation( + 0, + ), + }, + ), + ), + ), + Sum( + Constant( + 0x0000000000000000000000000000000000000000000000000000000000000005, + ), + Negated( + Fixed { + query_index: 28, + column_index: 28, + rotation: Rotation( + 0, + ), + }, + ), + ), + ), + Sum( + Constant( + 0x0000000000000000000000000000000000000000000000000000000000000006, + ), + Negated( + Fixed { + query_index: 28, + column_index: 28, + rotation: Rotation( + 0, + ), + }, + ), + ), + ), + Sum( + Advice { + query_index: 8, + column_index: 8, + rotation: Rotation( + 0, + ), + }, + Negated( + Sum( + Product( + Advice { + query_index: 9, + column_index: 9, + rotation: Rotation( + 0, + ), + }, + Advice { + query_index: 5, + column_index: 5, + rotation: Rotation( + 0, + ), + }, + ), + Product( + Sum( + Constant( + 0x0000000000000000000000000000000000000000000000000000000000000001, + ), + Negated( + Advice { + query_index: 9, + column_index: 9, + rotation: Rotation( + 0, + ), + }, + ), + ), + Advice { + query_index: 6, + column_index: 6, + rotation: Rotation( + 0, + ), + }, + ), + ), + ), + ), + ), + Product( + Product( + Product( + Product( + Product( + Product( + Fixed { + query_index: 28, + column_index: 28, + rotation: Rotation( + 0, + ), + }, + Sum( + Constant( + 0x0000000000000000000000000000000000000000000000000000000000000001, + ), + Negated( + Fixed { + query_index: 28, + column_index: 28, + rotation: Rotation( + 0, + ), + }, + ), + ), + ), + Sum( + Constant( + 0x0000000000000000000000000000000000000000000000000000000000000003, + ), + Negated( + Fixed { + query_index: 28, + column_index: 28, + rotation: Rotation( + 0, + ), + }, + ), + ), + ), + Sum( + Constant( + 0x0000000000000000000000000000000000000000000000000000000000000004, + ), + Negated( + Fixed { + query_index: 28, + column_index: 28, + rotation: Rotation( + 0, + ), + }, + ), + ), + ), + Sum( + Constant( + 0x0000000000000000000000000000000000000000000000000000000000000005, + ), + Negated( + Fixed { + query_index: 28, + column_index: 28, + rotation: Rotation( + 0, + ), + }, + ), + ), + ), + Sum( + Constant( + 0x0000000000000000000000000000000000000000000000000000000000000006, + ), + Negated( + Fixed { + query_index: 28, + column_index: 28, + rotation: Rotation( + 0, + ), + }, + ), + ), + ), + Product( + Advice { + query_index: 9, + column_index: 9, + rotation: Rotation( + 0, + ), + }, + Sum( + Constant( + 0x0000000000000000000000000000000000000000000000000000000000000001, + ), + Negated( + Advice { + query_index: 9, + column_index: 9, + rotation: Rotation( + 0, + ), + }, + ), + ), + ), + ), + Product( + Product( + Product( + Product( + Product( + Product( + Fixed { + query_index: 28, + column_index: 28, + rotation: Rotation( + 0, + ), + }, + Sum( + Constant( + 0x0000000000000000000000000000000000000000000000000000000000000001, + ), + Negated( + Fixed { + query_index: 28, + column_index: 28, + rotation: Rotation( + 0, + ), + }, + ), + ), + ), + Sum( + Constant( + 0x0000000000000000000000000000000000000000000000000000000000000002, + ), + Negated( + Fixed { + query_index: 28, + column_index: 28, + rotation: Rotation( + 0, + ), + }, + ), + ), + ), + Sum( + Constant( + 0x0000000000000000000000000000000000000000000000000000000000000004, + ), + Negated( + Fixed { + query_index: 28, + column_index: 28, + rotation: Rotation( + 0, + ), + }, + ), + ), + ), + Sum( + Constant( + 0x0000000000000000000000000000000000000000000000000000000000000005, + ), + Negated( + Fixed { + query_index: 28, + column_index: 28, + rotation: Rotation( + 0, + ), + }, + ), + ), + ), + Sum( + Constant( + 0x0000000000000000000000000000000000000000000000000000000000000006, + ), + Negated( + Fixed { + query_index: 28, + column_index: 28, + rotation: Rotation( + 0, + ), + }, + ), + ), + ), + Sum( + Sum( + Advice { + query_index: 5, + column_index: 5, + rotation: Rotation( + 0, + ), + }, + Negated( + Scaled( + Advice { + query_index: 15, + column_index: 5, + rotation: Rotation( + 1, + ), + }, + 0x0000000000000000000000000000000000000000000000000000000000000400, + ), + ), + ), + Negated( + Advice { + query_index: 17, + column_index: 9, + rotation: Rotation( + 1, + ), + }, + ), + ), + ), + Product( + Product( + Product( + Product( + Product( + Product( + Fixed { + query_index: 28, + column_index: 28, + rotation: Rotation( + 0, + ), + }, + Sum( + Constant( + 0x0000000000000000000000000000000000000000000000000000000000000001, + ), + Negated( + Fixed { + query_index: 28, + column_index: 28, + rotation: Rotation( + 0, + ), + }, + ), + ), + ), + Sum( + Constant( + 0x0000000000000000000000000000000000000000000000000000000000000002, + ), + Negated( + Fixed { + query_index: 28, + column_index: 28, + rotation: Rotation( + 0, + ), + }, + ), + ), + ), + Sum( + Constant( + 0x0000000000000000000000000000000000000000000000000000000000000004, + ), + Negated( + Fixed { + query_index: 28, + column_index: 28, + rotation: Rotation( + 0, + ), + }, + ), + ), + ), + Sum( + Constant( + 0x0000000000000000000000000000000000000000000000000000000000000005, + ), + Negated( + Fixed { + query_index: 28, + column_index: 28, + rotation: Rotation( + 0, + ), + }, + ), + ), + ), + Sum( + Constant( + 0x0000000000000000000000000000000000000000000000000000000000000006, + ), + Negated( + Fixed { + query_index: 28, + column_index: 28, + rotation: Rotation( + 0, + ), + }, + ), + ), + ), + Sum( + Sum( + Advice { + query_index: 15, + column_index: 5, + rotation: Rotation( + 1, + ), + }, + Scaled( + Sum( + Sum( + Advice { + query_index: 6, + column_index: 6, + rotation: Rotation( + 0, + ), + }, + Negated( + Scaled( + Advice { + query_index: 16, + column_index: 6, + rotation: Rotation( + 1, + ), + }, + 0x0000000000000000000000000000000000000000000000000000000000000400, + ), + ), + ), + Scaled( + Advice { + query_index: 19, + column_index: 7, + rotation: Rotation( + 1, + ), + }, + 0x0000000000000000000000000000000000000000000000000000000000000400, + ), + ), + 0x0001000000000000000000000000000000000000000000000000000000000000, + ), + ), + Negated( + Advice { + query_index: 8, + column_index: 8, + rotation: Rotation( + 0, + ), + }, + ), + ), + ), + Product( + Product( + Product( + Product( + Product( + Product( + Fixed { + query_index: 28, + column_index: 28, + rotation: Rotation( + 0, + ), + }, + Sum( + Constant( + 0x0000000000000000000000000000000000000000000000000000000000000001, + ), + Negated( + Fixed { + query_index: 28, + column_index: 28, + rotation: Rotation( + 0, + ), + }, + ), + ), + ), + Sum( + Constant( + 0x0000000000000000000000000000000000000000000000000000000000000002, + ), + Negated( + Fixed { + query_index: 28, + column_index: 28, + rotation: Rotation( + 0, + ), + }, + ), + ), + ), + Sum( + Constant( + 0x0000000000000000000000000000000000000000000000000000000000000004, + ), + Negated( + Fixed { + query_index: 28, + column_index: 28, + rotation: Rotation( + 0, + ), + }, + ), + ), + ), + Sum( + Constant( + 0x0000000000000000000000000000000000000000000000000000000000000005, + ), + Negated( + Fixed { + query_index: 28, + column_index: 28, + rotation: Rotation( + 0, + ), + }, + ), + ), + ), + Sum( + Constant( + 0x0000000000000000000000000000000000000000000000000000000000000006, + ), + Negated( + Fixed { + query_index: 28, + column_index: 28, + rotation: Rotation( + 0, + ), + }, + ), + ), + ), + Sum( + Sum( + Advice { + query_index: 20, + column_index: 8, + rotation: Rotation( + 1, + ), + }, + Scaled( + Advice { + query_index: 7, + column_index: 7, + rotation: Rotation( + 0, + ), + }, + 0x0000000000000000000000000000000000000000000000000000000000000020, + ), + ), + Negated( + Advice { + query_index: 9, + column_index: 9, + rotation: Rotation( + 0, + ), + }, + ), + ), + ), + Product( + Product( + Product( + Product( + Product( + Product( + Fixed { + query_index: 28, + column_index: 28, + rotation: Rotation( + 0, + ), + }, + Sum( + Constant( + 0x0000000000000000000000000000000000000000000000000000000000000001, + ), + Negated( + Fixed { + query_index: 28, + column_index: 28, + rotation: Rotation( + 0, + ), + }, + ), + ), + ), + Sum( + Constant( + 0x0000000000000000000000000000000000000000000000000000000000000002, + ), + Negated( + Fixed { + query_index: 28, + column_index: 28, + rotation: Rotation( + 0, + ), + }, + ), + ), + ), + Sum( + Constant( + 0x0000000000000000000000000000000000000000000000000000000000000004, + ), + Negated( + Fixed { + query_index: 28, + column_index: 28, + rotation: Rotation( + 0, + ), + }, + ), + ), + ), + Sum( + Constant( + 0x0000000000000000000000000000000000000000000000000000000000000005, + ), + Negated( + Fixed { + query_index: 28, + column_index: 28, + rotation: Rotation( + 0, + ), + }, + ), + ), + ), + Sum( + Constant( + 0x0000000000000000000000000000000000000000000000000000000000000006, + ), + Negated( + Fixed { + query_index: 28, + column_index: 28, + rotation: Rotation( + 0, + ), + }, + ), + ), + ), + Sum( + Advice { + query_index: 16, + column_index: 6, + rotation: Rotation( + 1, + ), + }, + Negated( + Sum( + Advice { + query_index: 19, + column_index: 7, + rotation: Rotation( + 1, + ), + }, + Scaled( + Advice { + query_index: 20, + column_index: 8, + rotation: Rotation( + 1, + ), + }, + 0x0000000000000000000000000000000000000000000000000000000000000020, + ), + ), + ), + ), + ), + Product( + Product( + Product( + Product( + Product( + Product( + Fixed { + query_index: 28, + column_index: 28, + rotation: Rotation( + 0, + ), + }, + Sum( + Constant( + 0x0000000000000000000000000000000000000000000000000000000000000001, + ), + Negated( + Fixed { + query_index: 28, + column_index: 28, + rotation: Rotation( + 0, + ), + }, + ), + ), + ), + Sum( + Constant( + 0x0000000000000000000000000000000000000000000000000000000000000002, + ), + Negated( + Fixed { + query_index: 28, + column_index: 28, + rotation: Rotation( + 0, + ), + }, + ), + ), + ), + Sum( + Constant( + 0x0000000000000000000000000000000000000000000000000000000000000003, + ), + Negated( + Fixed { + query_index: 28, + column_index: 28, + rotation: Rotation( + 0, + ), + }, + ), + ), + ), + Sum( + Constant( + 0x0000000000000000000000000000000000000000000000000000000000000005, + ), + Negated( + Fixed { + query_index: 28, + column_index: 28, + rotation: Rotation( + 0, + ), + }, + ), + ), + ), + Sum( + Constant( + 0x0000000000000000000000000000000000000000000000000000000000000006, + ), + Negated( + Fixed { + query_index: 28, + column_index: 28, + rotation: Rotation( + 0, + ), + }, + ), + ), + ), + Product( + Advice { + query_index: 4, + column_index: 4, + rotation: Rotation( + 0, + ), + }, + Sum( + Constant( + 0x0000000000000000000000000000000000000000000000000000000000000001, + ), + Negated( + Advice { + query_index: 4, + column_index: 4, + rotation: Rotation( + 0, + ), + }, + ), + ), + ), + ), + Product( + Product( + Product( + Product( + Product( + Product( + Fixed { + query_index: 28, + column_index: 28, + rotation: Rotation( + 0, + ), + }, + Sum( + Constant( + 0x0000000000000000000000000000000000000000000000000000000000000001, + ), + Negated( + Fixed { + query_index: 28, + column_index: 28, rotation: Rotation( 0, ), @@ -14528,12 +16388,12 @@ PinnedVerificationKey { ), Sum( Constant( - 0x0000000000000000000000000000000000000000000000000000000000000004, + 0x0000000000000000000000000000000000000000000000000000000000000002, ), Negated( Fixed { - query_index: 26, - column_index: 26, + query_index: 28, + column_index: 28, rotation: Rotation( 0, ), @@ -14543,12 +16403,255 @@ PinnedVerificationKey { ), Sum( Constant( - 0x0000000000000000000000000000000000000000000000000000000000000005, + 0x0000000000000000000000000000000000000000000000000000000000000003, + ), + Negated( + Fixed { + query_index: 28, + column_index: 28, + rotation: Rotation( + 0, + ), + }, + ), + ), + ), + Sum( + Constant( + 0x0000000000000000000000000000000000000000000000000000000000000005, + ), + Negated( + Fixed { + query_index: 28, + column_index: 28, + rotation: Rotation( + 0, + ), + }, + ), + ), + ), + Sum( + Constant( + 0x0000000000000000000000000000000000000000000000000000000000000006, + ), + Negated( + Fixed { + query_index: 28, + column_index: 28, + rotation: Rotation( + 0, + ), + }, + ), + ), + ), + Product( + Advice { + query_index: 14, + column_index: 4, + rotation: Rotation( + 1, + ), + }, + Sum( + Constant( + 0x0000000000000000000000000000000000000000000000000000000000000001, + ), + Negated( + Advice { + query_index: 14, + column_index: 4, + rotation: Rotation( + 1, + ), + }, + ), + ), + ), + ), + Product( + Product( + Product( + Product( + Product( + Product( + Fixed { + query_index: 28, + column_index: 28, + rotation: Rotation( + 0, + ), + }, + Sum( + Constant( + 0x0000000000000000000000000000000000000000000000000000000000000001, + ), + Negated( + Fixed { + query_index: 28, + column_index: 28, + rotation: Rotation( + 0, + ), + }, + ), + ), + ), + Sum( + Constant( + 0x0000000000000000000000000000000000000000000000000000000000000002, + ), + Negated( + Fixed { + query_index: 28, + column_index: 28, + rotation: Rotation( + 0, + ), + }, + ), + ), + ), + Sum( + Constant( + 0x0000000000000000000000000000000000000000000000000000000000000003, + ), + Negated( + Fixed { + query_index: 28, + column_index: 28, + rotation: Rotation( + 0, + ), + }, + ), + ), + ), + Sum( + Constant( + 0x0000000000000000000000000000000000000000000000000000000000000005, + ), + Negated( + Fixed { + query_index: 28, + column_index: 28, + rotation: Rotation( + 0, + ), + }, + ), + ), + ), + Sum( + Constant( + 0x0000000000000000000000000000000000000000000000000000000000000006, + ), + Negated( + Fixed { + query_index: 28, + column_index: 28, + rotation: Rotation( + 0, + ), + }, + ), + ), + ), + Sum( + Advice { + query_index: 2, + column_index: 2, + rotation: Rotation( + 0, + ), + }, + Negated( + Sum( + Sum( + Advice { + query_index: 3, + column_index: 3, + rotation: Rotation( + 0, + ), + }, + Scaled( + Advice { + query_index: 4, + column_index: 4, + rotation: Rotation( + 0, + ), + }, + 0x0000000000000000000000000000000000000000000000000000000000000010, + ), + ), + Scaled( + Advice { + query_index: 5, + column_index: 5, + rotation: Rotation( + 0, + ), + }, + 0x0000000000000000000000000000000000000000000000000000000000000020, + ), + ), + ), + ), + ), + Product( + Product( + Product( + Product( + Product( + Product( + Fixed { + query_index: 28, + column_index: 28, + rotation: Rotation( + 0, + ), + }, + Sum( + Constant( + 0x0000000000000000000000000000000000000000000000000000000000000001, + ), + Negated( + Fixed { + query_index: 28, + column_index: 28, + rotation: Rotation( + 0, + ), + }, + ), + ), + ), + Sum( + Constant( + 0x0000000000000000000000000000000000000000000000000000000000000002, + ), + Negated( + Fixed { + query_index: 28, + column_index: 28, + rotation: Rotation( + 0, + ), + }, + ), + ), + ), + Sum( + Constant( + 0x0000000000000000000000000000000000000000000000000000000000000003, ), Negated( Fixed { - query_index: 26, - column_index: 26, + query_index: 28, + column_index: 28, rotation: Rotation( 0, ), @@ -14558,12 +16661,12 @@ PinnedVerificationKey { ), Sum( Constant( - 0x0000000000000000000000000000000000000000000000000000000000000006, + 0x0000000000000000000000000000000000000000000000000000000000000005, ), Negated( Fixed { - query_index: 26, - column_index: 26, + query_index: 28, + column_index: 28, rotation: Rotation( 0, ), @@ -14573,12 +16676,12 @@ PinnedVerificationKey { ), Sum( Constant( - 0x0000000000000000000000000000000000000000000000000000000000000007, + 0x0000000000000000000000000000000000000000000000000000000000000006, ), Negated( Fixed { - query_index: 26, - column_index: 26, + query_index: 28, + column_index: 28, rotation: Rotation( 0, ), @@ -14588,52 +16691,30 @@ PinnedVerificationKey { ), Sum( Advice { - query_index: 7, - column_index: 7, + query_index: 12, + column_index: 2, rotation: Rotation( - 0, + 1, ), }, Negated( Sum( - Product( - Advice { - query_index: 9, - column_index: 9, - rotation: Rotation( - 0, - ), - }, - Advice { - query_index: 6, - column_index: 6, - rotation: Rotation( - 0, - ), - }, - ), - Product( - Sum( - Constant( - 0x0000000000000000000000000000000000000000000000000000000000000001, - ), - Negated( - Advice { - query_index: 9, - column_index: 9, - rotation: Rotation( - 0, - ), - }, - ), + Advice { + query_index: 13, + column_index: 3, + rotation: Rotation( + 1, ), + }, + Scaled( Advice { - query_index: 5, - column_index: 5, + query_index: 14, + column_index: 4, rotation: Rotation( - 0, + 1, ), }, + 0x0000000000000000000000000000000000000000000000000000000000000200, ), ), ), @@ -14645,37 +16726,21 @@ PinnedVerificationKey { Product( Product( Product( - Product( - Fixed { - query_index: 26, - column_index: 26, - rotation: Rotation( - 0, - ), - }, - Sum( - Constant( - 0x0000000000000000000000000000000000000000000000000000000000000002, - ), - Negated( - Fixed { - query_index: 26, - column_index: 26, - rotation: Rotation( - 0, - ), - }, - ), + Fixed { + query_index: 28, + column_index: 28, + rotation: Rotation( + 0, ), - ), + }, Sum( Constant( - 0x0000000000000000000000000000000000000000000000000000000000000003, + 0x0000000000000000000000000000000000000000000000000000000000000001, ), Negated( Fixed { - query_index: 26, - column_index: 26, + query_index: 28, + column_index: 28, rotation: Rotation( 0, ), @@ -14685,12 +16750,12 @@ PinnedVerificationKey { ), Sum( Constant( - 0x0000000000000000000000000000000000000000000000000000000000000004, + 0x0000000000000000000000000000000000000000000000000000000000000002, ), Negated( Fixed { - query_index: 26, - column_index: 26, + query_index: 28, + column_index: 28, rotation: Rotation( 0, ), @@ -14700,12 +16765,12 @@ PinnedVerificationKey { ), Sum( Constant( - 0x0000000000000000000000000000000000000000000000000000000000000005, + 0x0000000000000000000000000000000000000000000000000000000000000003, ), Negated( Fixed { - query_index: 26, - column_index: 26, + query_index: 28, + column_index: 28, rotation: Rotation( 0, ), @@ -14715,12 +16780,12 @@ PinnedVerificationKey { ), Sum( Constant( - 0x0000000000000000000000000000000000000000000000000000000000000006, + 0x0000000000000000000000000000000000000000000000000000000000000005, ), Negated( Fixed { - query_index: 26, - column_index: 26, + query_index: 28, + column_index: 28, rotation: Rotation( 0, ), @@ -14730,12 +16795,12 @@ PinnedVerificationKey { ), Sum( Constant( - 0x0000000000000000000000000000000000000000000000000000000000000007, + 0x0000000000000000000000000000000000000000000000000000000000000006, ), Negated( Fixed { - query_index: 26, - column_index: 26, + query_index: 28, + column_index: 28, rotation: Rotation( 0, ), @@ -14744,55 +16809,45 @@ PinnedVerificationKey { ), ), Sum( - Advice { - query_index: 8, - column_index: 8, - rotation: Rotation( - 0, - ), - }, - Negated( + Sum( Sum( - Product( - Advice { - query_index: 9, - column_index: 9, - rotation: Rotation( - 0, - ), - }, - Advice { - query_index: 5, - column_index: 5, - rotation: Rotation( - 0, - ), - }, - ), - Product( - Sum( - Constant( - 0x0000000000000000000000000000000000000000000000000000000000000001, - ), - Negated( - Advice { - query_index: 9, - column_index: 9, - rotation: Rotation( - 0, - ), - }, - ), + Advice { + query_index: 1, + column_index: 1, + rotation: Rotation( + 0, ), + }, + Scaled( Advice { - query_index: 6, - column_index: 6, + query_index: 3, + column_index: 3, rotation: Rotation( 0, ), }, + 0x0400000000000000000000000000000000000000000000000000000000000000, ), ), + Scaled( + Advice { + query_index: 4, + column_index: 4, + rotation: Rotation( + 0, + ), + }, + 0x4000000000000000000000000000000000000000000000000000000000000000, + ), + ), + Negated( + Advice { + query_index: 0, + column_index: 0, + rotation: Rotation( + 0, + ), + }, ), ), ), @@ -14802,37 +16857,21 @@ PinnedVerificationKey { Product( Product( Product( - Product( - Fixed { - query_index: 26, - column_index: 26, - rotation: Rotation( - 0, - ), - }, - Sum( - Constant( - 0x0000000000000000000000000000000000000000000000000000000000000002, - ), - Negated( - Fixed { - query_index: 26, - column_index: 26, - rotation: Rotation( - 0, - ), - }, - ), + Fixed { + query_index: 28, + column_index: 28, + rotation: Rotation( + 0, ), - ), + }, Sum( Constant( - 0x0000000000000000000000000000000000000000000000000000000000000003, + 0x0000000000000000000000000000000000000000000000000000000000000001, ), Negated( Fixed { - query_index: 26, - column_index: 26, + query_index: 28, + column_index: 28, rotation: Rotation( 0, ), @@ -14842,12 +16881,12 @@ PinnedVerificationKey { ), Sum( Constant( - 0x0000000000000000000000000000000000000000000000000000000000000004, + 0x0000000000000000000000000000000000000000000000000000000000000002, ), Negated( Fixed { - query_index: 26, - column_index: 26, + query_index: 28, + column_index: 28, rotation: Rotation( 0, ), @@ -14857,12 +16896,12 @@ PinnedVerificationKey { ), Sum( Constant( - 0x0000000000000000000000000000000000000000000000000000000000000005, + 0x0000000000000000000000000000000000000000000000000000000000000003, ), Negated( Fixed { - query_index: 26, - column_index: 26, + query_index: 28, + column_index: 28, rotation: Rotation( 0, ), @@ -14872,12 +16911,12 @@ PinnedVerificationKey { ), Sum( Constant( - 0x0000000000000000000000000000000000000000000000000000000000000006, + 0x0000000000000000000000000000000000000000000000000000000000000005, ), Negated( Fixed { - query_index: 26, - column_index: 26, + query_index: 28, + column_index: 28, rotation: Rotation( 0, ), @@ -14887,12 +16926,12 @@ PinnedVerificationKey { ), Sum( Constant( - 0x0000000000000000000000000000000000000000000000000000000000000007, + 0x0000000000000000000000000000000000000000000000000000000000000006, ), Negated( Fixed { - query_index: 26, - column_index: 26, + query_index: 28, + column_index: 28, rotation: Rotation( 0, ), @@ -14900,28 +16939,59 @@ PinnedVerificationKey { ), ), ), - Product( - Advice { - query_index: 9, - column_index: 9, - rotation: Rotation( - 0, - ), - }, + Sum( Sum( - Constant( - 0x0000000000000000000000000000000000000000000000000000000000000001, + Sum( + Sum( + Advice { + query_index: 5, + column_index: 5, + rotation: Rotation( + 0, + ), + }, + Scaled( + Advice { + query_index: 11, + column_index: 1, + rotation: Rotation( + 1, + ), + }, + 0x0000000000000000000000000000000000000000000000000000000000000020, + ), + ), + Scaled( + Advice { + query_index: 13, + column_index: 3, + rotation: Rotation( + 1, + ), + }, + 0x0020000000000000000000000000000000000000000000000000000000000000, + ), ), - Negated( + Scaled( Advice { - query_index: 9, - column_index: 9, + query_index: 14, + column_index: 4, rotation: Rotation( - 0, + 1, ), }, + 0x4000000000000000000000000000000000000000000000000000000000000000, ), ), + Negated( + Advice { + query_index: 10, + column_index: 0, + rotation: Rotation( + 1, + ), + }, + ), ), ), Product( @@ -14930,37 +17000,21 @@ PinnedVerificationKey { Product( Product( Product( - Product( - Fixed { - query_index: 26, - column_index: 26, - rotation: Rotation( - 0, - ), - }, - Sum( - Constant( - 0x0000000000000000000000000000000000000000000000000000000000000001, - ), - Negated( - Fixed { - query_index: 26, - column_index: 26, - rotation: Rotation( - 0, - ), - }, - ), + Fixed { + query_index: 28, + column_index: 28, + rotation: Rotation( + 0, ), - ), + }, Sum( Constant( - 0x0000000000000000000000000000000000000000000000000000000000000003, + 0x0000000000000000000000000000000000000000000000000000000000000001, ), Negated( Fixed { - query_index: 26, - column_index: 26, + query_index: 28, + column_index: 28, rotation: Rotation( 0, ), @@ -14970,12 +17024,12 @@ PinnedVerificationKey { ), Sum( Constant( - 0x0000000000000000000000000000000000000000000000000000000000000004, + 0x0000000000000000000000000000000000000000000000000000000000000002, ), Negated( Fixed { - query_index: 26, - column_index: 26, + query_index: 28, + column_index: 28, rotation: Rotation( 0, ), @@ -14985,12 +17039,12 @@ PinnedVerificationKey { ), Sum( Constant( - 0x0000000000000000000000000000000000000000000000000000000000000005, + 0x0000000000000000000000000000000000000000000000000000000000000003, ), Negated( Fixed { - query_index: 26, - column_index: 26, + query_index: 28, + column_index: 28, rotation: Rotation( 0, ), @@ -15000,12 +17054,12 @@ PinnedVerificationKey { ), Sum( Constant( - 0x0000000000000000000000000000000000000000000000000000000000000006, + 0x0000000000000000000000000000000000000000000000000000000000000005, ), Negated( Fixed { - query_index: 26, - column_index: 26, + query_index: 28, + column_index: 28, rotation: Rotation( 0, ), @@ -15015,12 +17069,12 @@ PinnedVerificationKey { ), Sum( Constant( - 0x0000000000000000000000000000000000000000000000000000000000000007, + 0x0000000000000000000000000000000000000000000000000000000000000006, ), Negated( Fixed { - query_index: 26, - column_index: 26, + query_index: 28, + column_index: 28, rotation: Rotation( 0, ), @@ -15028,37 +17082,21 @@ PinnedVerificationKey { ), ), ), - Sum( - Sum( - Advice { - query_index: 5, - column_index: 5, - rotation: Rotation( - 0, - ), - }, - Negated( - Scaled( - Advice { - query_index: 15, - column_index: 5, - rotation: Rotation( - 1, - ), - }, - 0x0000000000000000000000000000000000000000000000000000000000000400, - ), + Product( + Advice { + query_index: 4, + column_index: 4, + rotation: Rotation( + 0, ), - ), - Negated( - Advice { - query_index: 10, - column_index: 9, - rotation: Rotation( - 1, - ), - }, - ), + }, + Advice { + query_index: 3, + column_index: 3, + rotation: Rotation( + 0, + ), + }, ), ), Product( @@ -15067,37 +17105,21 @@ PinnedVerificationKey { Product( Product( Product( - Product( - Fixed { - query_index: 26, - column_index: 26, - rotation: Rotation( - 0, - ), - }, - Sum( - Constant( - 0x0000000000000000000000000000000000000000000000000000000000000001, - ), - Negated( - Fixed { - query_index: 26, - column_index: 26, - rotation: Rotation( - 0, - ), - }, - ), + Fixed { + query_index: 28, + column_index: 28, + rotation: Rotation( + 0, ), - ), + }, Sum( Constant( - 0x0000000000000000000000000000000000000000000000000000000000000003, + 0x0000000000000000000000000000000000000000000000000000000000000001, ), Negated( Fixed { - query_index: 26, - column_index: 26, + query_index: 28, + column_index: 28, rotation: Rotation( 0, ), @@ -15107,12 +17129,12 @@ PinnedVerificationKey { ), Sum( Constant( - 0x0000000000000000000000000000000000000000000000000000000000000004, + 0x0000000000000000000000000000000000000000000000000000000000000002, ), Negated( Fixed { - query_index: 26, - column_index: 26, + query_index: 28, + column_index: 28, rotation: Rotation( 0, ), @@ -15122,12 +17144,12 @@ PinnedVerificationKey { ), Sum( Constant( - 0x0000000000000000000000000000000000000000000000000000000000000005, + 0x0000000000000000000000000000000000000000000000000000000000000003, ), Negated( Fixed { - query_index: 26, - column_index: 26, + query_index: 28, + column_index: 28, rotation: Rotation( 0, ), @@ -15137,12 +17159,12 @@ PinnedVerificationKey { ), Sum( Constant( - 0x0000000000000000000000000000000000000000000000000000000000000006, + 0x0000000000000000000000000000000000000000000000000000000000000005, ), Negated( Fixed { - query_index: 26, - column_index: 26, + query_index: 28, + column_index: 28, rotation: Rotation( 0, ), @@ -15152,12 +17174,12 @@ PinnedVerificationKey { ), Sum( Constant( - 0x0000000000000000000000000000000000000000000000000000000000000007, + 0x0000000000000000000000000000000000000000000000000000000000000006, ), Negated( Fixed { - query_index: 26, - column_index: 26, + query_index: 28, + column_index: 28, rotation: Rotation( 0, ), @@ -15165,61 +17187,21 @@ PinnedVerificationKey { ), ), ), - Sum( - Sum( - Advice { - query_index: 15, - column_index: 5, - rotation: Rotation( - 1, - ), - }, - Scaled( - Sum( - Sum( - Advice { - query_index: 6, - column_index: 6, - rotation: Rotation( - 0, - ), - }, - Negated( - Scaled( - Advice { - query_index: 22, - column_index: 6, - rotation: Rotation( - 1, - ), - }, - 0x0000000000000000000000000000000000000000000000000000000000000400, - ), - ), - ), - Scaled( - Advice { - query_index: 18, - column_index: 7, - rotation: Rotation( - 1, - ), - }, - 0x0000000000000000000000000000000000000000000000000000000000000400, - ), - ), - 0x0001000000000000000000000000000000000000000000000000000000000000, + Product( + Advice { + query_index: 4, + column_index: 4, + rotation: Rotation( + 0, ), - ), - Negated( - Advice { - query_index: 8, - column_index: 8, - rotation: Rotation( - 0, - ), - }, - ), + }, + Advice { + query_index: 6, + column_index: 6, + rotation: Rotation( + 0, + ), + }, ), ), Product( @@ -15228,37 +17210,21 @@ PinnedVerificationKey { Product( Product( Product( - Product( - Fixed { - query_index: 26, - column_index: 26, - rotation: Rotation( - 0, - ), - }, - Sum( - Constant( - 0x0000000000000000000000000000000000000000000000000000000000000001, - ), - Negated( - Fixed { - query_index: 26, - column_index: 26, - rotation: Rotation( - 0, - ), - }, - ), + Fixed { + query_index: 28, + column_index: 28, + rotation: Rotation( + 0, ), - ), + }, Sum( Constant( - 0x0000000000000000000000000000000000000000000000000000000000000003, + 0x0000000000000000000000000000000000000000000000000000000000000001, ), Negated( Fixed { - query_index: 26, - column_index: 26, + query_index: 28, + column_index: 28, rotation: Rotation( 0, ), @@ -15268,12 +17234,12 @@ PinnedVerificationKey { ), Sum( Constant( - 0x0000000000000000000000000000000000000000000000000000000000000004, + 0x0000000000000000000000000000000000000000000000000000000000000002, ), Negated( Fixed { - query_index: 26, - column_index: 26, + query_index: 28, + column_index: 28, rotation: Rotation( 0, ), @@ -15283,12 +17249,12 @@ PinnedVerificationKey { ), Sum( Constant( - 0x0000000000000000000000000000000000000000000000000000000000000005, + 0x0000000000000000000000000000000000000000000000000000000000000003, ), Negated( Fixed { - query_index: 26, - column_index: 26, + query_index: 28, + column_index: 28, rotation: Rotation( 0, ), @@ -15298,12 +17264,12 @@ PinnedVerificationKey { ), Sum( Constant( - 0x0000000000000000000000000000000000000000000000000000000000000006, + 0x0000000000000000000000000000000000000000000000000000000000000005, ), Negated( Fixed { - query_index: 26, - column_index: 26, + query_index: 28, + column_index: 28, rotation: Rotation( 0, ), @@ -15313,12 +17279,12 @@ PinnedVerificationKey { ), Sum( Constant( - 0x0000000000000000000000000000000000000000000000000000000000000007, + 0x0000000000000000000000000000000000000000000000000000000000000006, ), Negated( Fixed { - query_index: 26, - column_index: 26, + query_index: 28, + column_index: 28, rotation: Rotation( 0, ), @@ -15328,28 +17294,28 @@ PinnedVerificationKey { ), Sum( Sum( - Advice { - query_index: 19, - column_index: 8, - rotation: Rotation( - 1, - ), - }, - Scaled( + Sum( Advice { - query_index: 7, - column_index: 7, + query_index: 1, + column_index: 1, rotation: Rotation( 0, ), }, - 0x0000000000000000000000000000000000000000000000000000000000000020, + Constant( + 0x0000000000000000000000000000000400000000000000000000000000000000, + ), + ), + Negated( + Constant( + 0x00000000000000000000000000000000224698fc094cf91b992d30ed00000001, + ), ), ), Negated( Advice { - query_index: 9, - column_index: 9, + query_index: 7, + column_index: 7, rotation: Rotation( 0, ), @@ -15363,37 +17329,21 @@ PinnedVerificationKey { Product( Product( Product( - Product( - Fixed { - query_index: 26, - column_index: 26, - rotation: Rotation( - 0, - ), - }, - Sum( - Constant( - 0x0000000000000000000000000000000000000000000000000000000000000001, - ), - Negated( - Fixed { - query_index: 26, - column_index: 26, - rotation: Rotation( - 0, - ), - }, - ), + Fixed { + query_index: 28, + column_index: 28, + rotation: Rotation( + 0, ), - ), + }, Sum( Constant( - 0x0000000000000000000000000000000000000000000000000000000000000003, + 0x0000000000000000000000000000000000000000000000000000000000000001, ), Negated( Fixed { - query_index: 26, - column_index: 26, + query_index: 28, + column_index: 28, rotation: Rotation( 0, ), @@ -15403,12 +17353,12 @@ PinnedVerificationKey { ), Sum( Constant( - 0x0000000000000000000000000000000000000000000000000000000000000004, + 0x0000000000000000000000000000000000000000000000000000000000000002, ), Negated( Fixed { - query_index: 26, - column_index: 26, + query_index: 28, + column_index: 28, rotation: Rotation( 0, ), @@ -15418,12 +17368,12 @@ PinnedVerificationKey { ), Sum( Constant( - 0x0000000000000000000000000000000000000000000000000000000000000005, + 0x0000000000000000000000000000000000000000000000000000000000000003, ), Negated( Fixed { - query_index: 26, - column_index: 26, + query_index: 28, + column_index: 28, rotation: Rotation( 0, ), @@ -15433,12 +17383,12 @@ PinnedVerificationKey { ), Sum( Constant( - 0x0000000000000000000000000000000000000000000000000000000000000006, + 0x0000000000000000000000000000000000000000000000000000000000000005, ), Negated( Fixed { - query_index: 26, - column_index: 26, + query_index: 28, + column_index: 28, rotation: Rotation( 0, ), @@ -15448,12 +17398,12 @@ PinnedVerificationKey { ), Sum( Constant( - 0x0000000000000000000000000000000000000000000000000000000000000007, + 0x0000000000000000000000000000000000000000000000000000000000000006, ), Negated( Fixed { - query_index: 26, - column_index: 26, + query_index: 28, + column_index: 28, rotation: Rotation( 0, ), @@ -15461,35 +17411,21 @@ PinnedVerificationKey { ), ), ), - Sum( + Product( Advice { - query_index: 22, - column_index: 6, + query_index: 4, + column_index: 4, rotation: Rotation( - 1, + 0, ), }, - Negated( - Sum( - Advice { - query_index: 18, - column_index: 7, - rotation: Rotation( - 1, - ), - }, - Scaled( - Advice { - query_index: 19, - column_index: 8, - rotation: Rotation( - 1, - ), - }, - 0x0000000000000000000000000000000000000000000000000000000000000020, - ), + Advice { + query_index: 8, + column_index: 8, + rotation: Rotation( + 0, ), - ), + }, ), ), Product( @@ -15499,8 +17435,8 @@ PinnedVerificationKey { Product( Product( Fixed { - query_index: 25, - column_index: 25, + query_index: 28, + column_index: 28, rotation: Rotation( 0, ), @@ -15511,8 +17447,8 @@ PinnedVerificationKey { ), Negated( Fixed { - query_index: 25, - column_index: 25, + query_index: 28, + column_index: 28, rotation: Rotation( 0, ), @@ -15526,8 +17462,8 @@ PinnedVerificationKey { ), Negated( Fixed { - query_index: 25, - column_index: 25, + query_index: 28, + column_index: 28, rotation: Rotation( 0, ), @@ -15537,12 +17473,12 @@ PinnedVerificationKey { ), Sum( Constant( - 0x0000000000000000000000000000000000000000000000000000000000000004, + 0x0000000000000000000000000000000000000000000000000000000000000003, ), Negated( Fixed { - query_index: 25, - column_index: 25, + query_index: 28, + column_index: 28, rotation: Rotation( 0, ), @@ -15556,8 +17492,8 @@ PinnedVerificationKey { ), Negated( Fixed { - query_index: 25, - column_index: 25, + query_index: 28, + column_index: 28, rotation: Rotation( 0, ), @@ -15571,8 +17507,8 @@ PinnedVerificationKey { ), Negated( Fixed { - query_index: 25, - column_index: 25, + query_index: 28, + column_index: 28, rotation: Rotation( 0, ), @@ -15582,26 +17518,19 @@ PinnedVerificationKey { ), Product( Advice { - query_index: 4, + query_index: 14, column_index: 4, rotation: Rotation( - 0, + 1, ), }, - Sum( - Constant( - 0x0000000000000000000000000000000000000000000000000000000000000001, - ), - Negated( - Advice { - query_index: 4, - column_index: 4, - rotation: Rotation( - 0, - ), - }, + Advice { + query_index: 13, + column_index: 3, + rotation: Rotation( + 1, ), - ), + }, ), ), Product( @@ -15611,8 +17540,8 @@ PinnedVerificationKey { Product( Product( Fixed { - query_index: 25, - column_index: 25, + query_index: 28, + column_index: 28, rotation: Rotation( 0, ), @@ -15623,8 +17552,8 @@ PinnedVerificationKey { ), Negated( Fixed { - query_index: 25, - column_index: 25, + query_index: 28, + column_index: 28, rotation: Rotation( 0, ), @@ -15638,8 +17567,8 @@ PinnedVerificationKey { ), Negated( Fixed { - query_index: 25, - column_index: 25, + query_index: 28, + column_index: 28, rotation: Rotation( 0, ), @@ -15649,12 +17578,12 @@ PinnedVerificationKey { ), Sum( Constant( - 0x0000000000000000000000000000000000000000000000000000000000000004, + 0x0000000000000000000000000000000000000000000000000000000000000003, ), Negated( Fixed { - query_index: 25, - column_index: 25, + query_index: 28, + column_index: 28, rotation: Rotation( 0, ), @@ -15668,8 +17597,8 @@ PinnedVerificationKey { ), Negated( Fixed { - query_index: 25, - column_index: 25, + query_index: 28, + column_index: 28, rotation: Rotation( 0, ), @@ -15683,8 +17612,8 @@ PinnedVerificationKey { ), Negated( Fixed { - query_index: 25, - column_index: 25, + query_index: 28, + column_index: 28, rotation: Rotation( 0, ), @@ -15700,20 +17629,13 @@ PinnedVerificationKey { 1, ), }, - Sum( - Constant( - 0x0000000000000000000000000000000000000000000000000000000000000001, - ), - Negated( - Advice { - query_index: 14, - column_index: 4, - rotation: Rotation( - 1, - ), - }, + Advice { + query_index: 16, + column_index: 6, + rotation: Rotation( + 1, ), - ), + }, ), ), Product( @@ -15723,8 +17645,8 @@ PinnedVerificationKey { Product( Product( Fixed { - query_index: 25, - column_index: 25, + query_index: 28, + column_index: 28, rotation: Rotation( 0, ), @@ -15735,8 +17657,8 @@ PinnedVerificationKey { ), Negated( Fixed { - query_index: 25, - column_index: 25, + query_index: 28, + column_index: 28, rotation: Rotation( 0, ), @@ -15750,8 +17672,8 @@ PinnedVerificationKey { ), Negated( Fixed { - query_index: 25, - column_index: 25, + query_index: 28, + column_index: 28, rotation: Rotation( 0, ), @@ -15761,12 +17683,12 @@ PinnedVerificationKey { ), Sum( Constant( - 0x0000000000000000000000000000000000000000000000000000000000000004, + 0x0000000000000000000000000000000000000000000000000000000000000003, ), Negated( Fixed { - query_index: 25, - column_index: 25, + query_index: 28, + column_index: 28, rotation: Rotation( 0, ), @@ -15780,8 +17702,8 @@ PinnedVerificationKey { ), Negated( Fixed { - query_index: 25, - column_index: 25, + query_index: 28, + column_index: 28, rotation: Rotation( 0, ), @@ -15795,8 +17717,8 @@ PinnedVerificationKey { ), Negated( Fixed { - query_index: 25, - column_index: 25, + query_index: 28, + column_index: 28, rotation: Rotation( 0, ), @@ -15805,46 +17727,46 @@ PinnedVerificationKey { ), ), Sum( - Advice { - query_index: 2, - column_index: 2, - rotation: Rotation( - 0, - ), - }, - Negated( + Sum( Sum( Sum( Advice { - query_index: 3, - column_index: 3, + query_index: 5, + column_index: 5, rotation: Rotation( 0, ), }, Scaled( Advice { - query_index: 4, - column_index: 4, + query_index: 11, + column_index: 1, rotation: Rotation( - 0, + 1, ), }, - 0x0000000000000000000000000000000000000000000000000000000000000010, + 0x0000000000000000000000000000000000000000000000000000000000000020, ), ), - Scaled( - Advice { - query_index: 5, - column_index: 5, - rotation: Rotation( - 0, - ), - }, - 0x0000000000000000000000000000000000000000000000000000000000000020, + Constant( + 0x0000000000000000000000000000100000000000000000000000000000000000, + ), + ), + Negated( + Constant( + 0x00000000000000000000000000000000224698fc094cf91b992d30ed00000001, ), ), ), + Negated( + Advice { + query_index: 19, + column_index: 7, + rotation: Rotation( + 1, + ), + }, + ), ), ), Product( @@ -15854,8 +17776,8 @@ PinnedVerificationKey { Product( Product( Fixed { - query_index: 25, - column_index: 25, + query_index: 28, + column_index: 28, rotation: Rotation( 0, ), @@ -15866,8 +17788,8 @@ PinnedVerificationKey { ), Negated( Fixed { - query_index: 25, - column_index: 25, + query_index: 28, + column_index: 28, rotation: Rotation( 0, ), @@ -15881,8 +17803,8 @@ PinnedVerificationKey { ), Negated( Fixed { - query_index: 25, - column_index: 25, + query_index: 28, + column_index: 28, rotation: Rotation( 0, ), @@ -15892,12 +17814,12 @@ PinnedVerificationKey { ), Sum( Constant( - 0x0000000000000000000000000000000000000000000000000000000000000004, + 0x0000000000000000000000000000000000000000000000000000000000000003, ), Negated( Fixed { - query_index: 25, - column_index: 25, + query_index: 28, + column_index: 28, rotation: Rotation( 0, ), @@ -15911,8 +17833,8 @@ PinnedVerificationKey { ), Negated( Fixed { - query_index: 25, - column_index: 25, + query_index: 28, + column_index: 28, rotation: Rotation( 0, ), @@ -15926,8 +17848,8 @@ PinnedVerificationKey { ), Negated( Fixed { - query_index: 25, - column_index: 25, + query_index: 28, + column_index: 28, rotation: Rotation( 0, ), @@ -15935,35 +17857,21 @@ PinnedVerificationKey { ), ), ), - Sum( + Product( Advice { - query_index: 12, - column_index: 2, + query_index: 14, + column_index: 4, rotation: Rotation( 1, ), }, - Negated( - Sum( - Advice { - query_index: 13, - column_index: 3, - rotation: Rotation( - 1, - ), - }, - Scaled( - Advice { - query_index: 14, - column_index: 4, - rotation: Rotation( - 1, - ), - }, - 0x0000000000000000000000000000000000000000000000000000000000000200, - ), + Advice { + query_index: 20, + column_index: 8, + rotation: Rotation( + 1, ), - ), + }, ), ), Product( @@ -15973,8 +17881,8 @@ PinnedVerificationKey { Product( Product( Fixed { - query_index: 25, - column_index: 25, + query_index: 28, + column_index: 28, rotation: Rotation( 0, ), @@ -15985,8 +17893,8 @@ PinnedVerificationKey { ), Negated( Fixed { - query_index: 25, - column_index: 25, + query_index: 28, + column_index: 28, rotation: Rotation( 0, ), @@ -16000,8 +17908,8 @@ PinnedVerificationKey { ), Negated( Fixed { - query_index: 25, - column_index: 25, + query_index: 28, + column_index: 28, rotation: Rotation( 0, ), @@ -16011,12 +17919,12 @@ PinnedVerificationKey { ), Sum( Constant( - 0x0000000000000000000000000000000000000000000000000000000000000004, + 0x0000000000000000000000000000000000000000000000000000000000000003, ), Negated( Fixed { - query_index: 25, - column_index: 25, + query_index: 28, + column_index: 28, rotation: Rotation( 0, ), @@ -16026,12 +17934,12 @@ PinnedVerificationKey { ), Sum( Constant( - 0x0000000000000000000000000000000000000000000000000000000000000005, + 0x0000000000000000000000000000000000000000000000000000000000000004, ), Negated( Fixed { - query_index: 25, - column_index: 25, + query_index: 28, + column_index: 28, rotation: Rotation( 0, ), @@ -16045,8 +17953,8 @@ PinnedVerificationKey { ), Negated( Fixed { - query_index: 25, - column_index: 25, + query_index: 28, + column_index: 28, rotation: Rotation( 0, ), @@ -16054,47 +17962,28 @@ PinnedVerificationKey { ), ), ), - Sum( + Product( + Advice { + query_index: 8, + column_index: 8, + rotation: Rotation( + 0, + ), + }, Sum( - Sum( - Advice { - query_index: 1, - column_index: 1, - rotation: Rotation( - 0, - ), - }, - Scaled( - Advice { - query_index: 3, - column_index: 3, - rotation: Rotation( - 0, - ), - }, - 0x0400000000000000000000000000000000000000000000000000000000000000, - ), + Constant( + 0x0000000000000000000000000000000000000000000000000000000000000001, ), - Scaled( + Negated( Advice { - query_index: 4, - column_index: 4, + query_index: 8, + column_index: 8, rotation: Rotation( 0, ), }, - 0x4000000000000000000000000000000000000000000000000000000000000000, ), ), - Negated( - Advice { - query_index: 0, - column_index: 0, - rotation: Rotation( - 0, - ), - }, - ), ), ), Product( @@ -16104,8 +17993,8 @@ PinnedVerificationKey { Product( Product( Fixed { - query_index: 25, - column_index: 25, + query_index: 28, + column_index: 28, rotation: Rotation( 0, ), @@ -16116,8 +18005,8 @@ PinnedVerificationKey { ), Negated( Fixed { - query_index: 25, - column_index: 25, + query_index: 28, + column_index: 28, rotation: Rotation( 0, ), @@ -16131,8 +18020,8 @@ PinnedVerificationKey { ), Negated( Fixed { - query_index: 25, - column_index: 25, + query_index: 28, + column_index: 28, rotation: Rotation( 0, ), @@ -16142,12 +18031,12 @@ PinnedVerificationKey { ), Sum( Constant( - 0x0000000000000000000000000000000000000000000000000000000000000004, + 0x0000000000000000000000000000000000000000000000000000000000000003, ), Negated( Fixed { - query_index: 25, - column_index: 25, + query_index: 28, + column_index: 28, rotation: Rotation( 0, ), @@ -16157,12 +18046,12 @@ PinnedVerificationKey { ), Sum( Constant( - 0x0000000000000000000000000000000000000000000000000000000000000005, + 0x0000000000000000000000000000000000000000000000000000000000000004, ), Negated( Fixed { - query_index: 25, - column_index: 25, + query_index: 28, + column_index: 28, rotation: Rotation( 0, ), @@ -16176,8 +18065,8 @@ PinnedVerificationKey { ), Negated( Fixed { - query_index: 25, - column_index: 25, + query_index: 28, + column_index: 28, rotation: Rotation( 0, ), @@ -16185,59 +18074,28 @@ PinnedVerificationKey { ), ), ), - Sum( + Product( + Advice { + query_index: 19, + column_index: 7, + rotation: Rotation( + 1, + ), + }, Sum( - Sum( - Sum( - Advice { - query_index: 5, - column_index: 5, - rotation: Rotation( - 0, - ), - }, - Scaled( - Advice { - query_index: 17, - column_index: 1, - rotation: Rotation( - 1, - ), - }, - 0x0000000000000000000000000000000000000000000000000000000000000020, - ), - ), - Scaled( - Advice { - query_index: 13, - column_index: 3, - rotation: Rotation( - 1, - ), - }, - 0x0020000000000000000000000000000000000000000000000000000000000000, - ), + Constant( + 0x0000000000000000000000000000000000000000000000000000000000000001, ), - Scaled( + Negated( Advice { - query_index: 14, - column_index: 4, + query_index: 19, + column_index: 7, rotation: Rotation( 1, ), }, - 0x4000000000000000000000000000000000000000000000000000000000000000, ), ), - Negated( - Advice { - query_index: 16, - column_index: 0, - rotation: Rotation( - 1, - ), - }, - ), ), ), Product( @@ -16247,8 +18105,8 @@ PinnedVerificationKey { Product( Product( Fixed { - query_index: 25, - column_index: 25, + query_index: 28, + column_index: 28, rotation: Rotation( 0, ), @@ -16259,8 +18117,8 @@ PinnedVerificationKey { ), Negated( Fixed { - query_index: 25, - column_index: 25, + query_index: 28, + column_index: 28, rotation: Rotation( 0, ), @@ -16274,8 +18132,8 @@ PinnedVerificationKey { ), Negated( Fixed { - query_index: 25, - column_index: 25, + query_index: 28, + column_index: 28, rotation: Rotation( 0, ), @@ -16285,12 +18143,12 @@ PinnedVerificationKey { ), Sum( Constant( - 0x0000000000000000000000000000000000000000000000000000000000000004, + 0x0000000000000000000000000000000000000000000000000000000000000003, ), Negated( Fixed { - query_index: 25, - column_index: 25, + query_index: 28, + column_index: 28, rotation: Rotation( 0, ), @@ -16300,12 +18158,12 @@ PinnedVerificationKey { ), Sum( Constant( - 0x0000000000000000000000000000000000000000000000000000000000000005, + 0x0000000000000000000000000000000000000000000000000000000000000004, ), Negated( Fixed { - query_index: 25, - column_index: 25, + query_index: 28, + column_index: 28, rotation: Rotation( 0, ), @@ -16319,8 +18177,8 @@ PinnedVerificationKey { ), Negated( Fixed { - query_index: 25, - column_index: 25, + query_index: 28, + column_index: 28, rotation: Rotation( 0, ), @@ -16328,126 +18186,59 @@ PinnedVerificationKey { ), ), ), - Product( - Advice { - query_index: 4, - column_index: 4, - rotation: Rotation( - 0, - ), - }, + Sum( Advice { - query_index: 3, - column_index: 3, + query_index: 6, + column_index: 6, rotation: Rotation( 0, ), }, - ), - ), - Product( - Product( - Product( - Product( - Product( - Product( - Fixed { - query_index: 25, - column_index: 25, + Negated( + Sum( + Sum( + Sum( + Advice { + query_index: 7, + column_index: 7, rotation: Rotation( 0, ), }, - Sum( - Constant( - 0x0000000000000000000000000000000000000000000000000000000000000001, - ), - Negated( - Fixed { - query_index: 25, - column_index: 25, - rotation: Rotation( - 0, - ), - }, - ), - ), - ), - Sum( - Constant( - 0x0000000000000000000000000000000000000000000000000000000000000002, - ), - Negated( - Fixed { - query_index: 25, - column_index: 25, + Scaled( + Advice { + query_index: 8, + column_index: 8, rotation: Rotation( 0, ), }, + 0x0000000000000000000000000000000000000000000000000000000000000010, ), ), - ), - Sum( - Constant( - 0x0000000000000000000000000000000000000000000000000000000000000004, - ), - Negated( - Fixed { - query_index: 25, - column_index: 25, + Scaled( + Advice { + query_index: 19, + column_index: 7, rotation: Rotation( - 0, + 1, ), }, + 0x0000000000000000000000000000000000000000000000000000000000000020, ), ), - ), - Sum( - Constant( - 0x0000000000000000000000000000000000000000000000000000000000000005, - ), - Negated( - Fixed { - query_index: 25, - column_index: 25, + Scaled( + Advice { + query_index: 20, + column_index: 8, rotation: Rotation( - 0, + 1, ), }, + 0x0000000000000000000000000000000000000000000000000000000000000040, ), ), ), - Sum( - Constant( - 0x0000000000000000000000000000000000000000000000000000000000000006, - ), - Negated( - Fixed { - query_index: 25, - column_index: 25, - rotation: Rotation( - 0, - ), - }, - ), - ), - ), - Product( - Advice { - query_index: 4, - column_index: 4, - rotation: Rotation( - 0, - ), - }, - Advice { - query_index: 6, - column_index: 6, - rotation: Rotation( - 0, - ), - }, ), ), Product( @@ -16457,8 +18248,8 @@ PinnedVerificationKey { Product( Product( Fixed { - query_index: 25, - column_index: 25, + query_index: 28, + column_index: 28, rotation: Rotation( 0, ), @@ -16469,8 +18260,8 @@ PinnedVerificationKey { ), Negated( Fixed { - query_index: 25, - column_index: 25, + query_index: 28, + column_index: 28, rotation: Rotation( 0, ), @@ -16484,8 +18275,8 @@ PinnedVerificationKey { ), Negated( Fixed { - query_index: 25, - column_index: 25, + query_index: 28, + column_index: 28, rotation: Rotation( 0, ), @@ -16495,12 +18286,12 @@ PinnedVerificationKey { ), Sum( Constant( - 0x0000000000000000000000000000000000000000000000000000000000000004, + 0x0000000000000000000000000000000000000000000000000000000000000003, ), Negated( Fixed { - query_index: 25, - column_index: 25, + query_index: 28, + column_index: 28, rotation: Rotation( 0, ), @@ -16510,12 +18301,12 @@ PinnedVerificationKey { ), Sum( Constant( - 0x0000000000000000000000000000000000000000000000000000000000000005, + 0x0000000000000000000000000000000000000000000000000000000000000004, ), Negated( Fixed { - query_index: 25, - column_index: 25, + query_index: 28, + column_index: 28, rotation: Rotation( 0, ), @@ -16525,12 +18316,12 @@ PinnedVerificationKey { ), Sum( Constant( - 0x0000000000000000000000000000000000000000000000000000000000000006, + 0x0000000000000000000000000000000000000000000000000000000000000005, ), Negated( Fixed { - query_index: 25, - column_index: 25, + query_index: 28, + column_index: 28, rotation: Rotation( 0, ), @@ -16538,35 +18329,28 @@ PinnedVerificationKey { ), ), ), - Sum( + Product( + Advice { + query_index: 7, + column_index: 7, + rotation: Rotation( + 0, + ), + }, Sum( - Sum( + Constant( + 0x0000000000000000000000000000000000000000000000000000000000000001, + ), + Negated( Advice { - query_index: 1, - column_index: 1, + query_index: 7, + column_index: 7, rotation: Rotation( 0, ), }, - Constant( - 0x0000000000000000000000000000000400000000000000000000000000000000, - ), - ), - Negated( - Constant( - 0x00000000000000000000000000000000224698fc094cf91b992d30ed00000001, - ), ), ), - Negated( - Advice { - query_index: 7, - column_index: 7, - rotation: Rotation( - 0, - ), - }, - ), ), ), Product( @@ -16576,8 +18360,8 @@ PinnedVerificationKey { Product( Product( Fixed { - query_index: 25, - column_index: 25, + query_index: 28, + column_index: 28, rotation: Rotation( 0, ), @@ -16588,8 +18372,8 @@ PinnedVerificationKey { ), Negated( Fixed { - query_index: 25, - column_index: 25, + query_index: 28, + column_index: 28, rotation: Rotation( 0, ), @@ -16603,8 +18387,8 @@ PinnedVerificationKey { ), Negated( Fixed { - query_index: 25, - column_index: 25, + query_index: 28, + column_index: 28, rotation: Rotation( 0, ), @@ -16614,12 +18398,12 @@ PinnedVerificationKey { ), Sum( Constant( - 0x0000000000000000000000000000000000000000000000000000000000000004, + 0x0000000000000000000000000000000000000000000000000000000000000003, ), Negated( Fixed { - query_index: 25, - column_index: 25, + query_index: 28, + column_index: 28, rotation: Rotation( 0, ), @@ -16629,12 +18413,12 @@ PinnedVerificationKey { ), Sum( Constant( - 0x0000000000000000000000000000000000000000000000000000000000000005, + 0x0000000000000000000000000000000000000000000000000000000000000004, ), Negated( Fixed { - query_index: 25, - column_index: 25, + query_index: 28, + column_index: 28, rotation: Rotation( 0, ), @@ -16644,12 +18428,12 @@ PinnedVerificationKey { ), Sum( Constant( - 0x0000000000000000000000000000000000000000000000000000000000000006, + 0x0000000000000000000000000000000000000000000000000000000000000005, ), Negated( Fixed { - query_index: 25, - column_index: 25, + query_index: 28, + column_index: 28, rotation: Rotation( 0, ), @@ -16658,13 +18442,6 @@ PinnedVerificationKey { ), ), Product( - Advice { - query_index: 4, - column_index: 4, - rotation: Rotation( - 0, - ), - }, Advice { query_index: 8, column_index: 8, @@ -16672,6 +18449,20 @@ PinnedVerificationKey { 0, ), }, + Sum( + Constant( + 0x0000000000000000000000000000000000000000000000000000000000000001, + ), + Negated( + Advice { + query_index: 8, + column_index: 8, + rotation: Rotation( + 0, + ), + }, + ), + ), ), ), Product( @@ -16681,8 +18472,8 @@ PinnedVerificationKey { Product( Product( Fixed { - query_index: 25, - column_index: 25, + query_index: 28, + column_index: 28, rotation: Rotation( 0, ), @@ -16693,8 +18484,8 @@ PinnedVerificationKey { ), Negated( Fixed { - query_index: 25, - column_index: 25, + query_index: 28, + column_index: 28, rotation: Rotation( 0, ), @@ -16708,8 +18499,8 @@ PinnedVerificationKey { ), Negated( Fixed { - query_index: 25, - column_index: 25, + query_index: 28, + column_index: 28, rotation: Rotation( 0, ), @@ -16719,12 +18510,12 @@ PinnedVerificationKey { ), Sum( Constant( - 0x0000000000000000000000000000000000000000000000000000000000000004, + 0x0000000000000000000000000000000000000000000000000000000000000003, ), Negated( Fixed { - query_index: 25, - column_index: 25, + query_index: 28, + column_index: 28, rotation: Rotation( 0, ), @@ -16734,12 +18525,12 @@ PinnedVerificationKey { ), Sum( Constant( - 0x0000000000000000000000000000000000000000000000000000000000000005, + 0x0000000000000000000000000000000000000000000000000000000000000004, ), Negated( Fixed { - query_index: 25, - column_index: 25, + query_index: 28, + column_index: 28, rotation: Rotation( 0, ), @@ -16749,12 +18540,12 @@ PinnedVerificationKey { ), Sum( Constant( - 0x0000000000000000000000000000000000000000000000000000000000000006, + 0x0000000000000000000000000000000000000000000000000000000000000005, ), Negated( Fixed { - query_index: 25, - column_index: 25, + query_index: 28, + column_index: 28, rotation: Rotation( 0, ), @@ -16762,21 +18553,59 @@ PinnedVerificationKey { ), ), ), - Product( + Sum( Advice { - query_index: 14, - column_index: 4, + query_index: 6, + column_index: 6, rotation: Rotation( - 1, + 0, ), }, - Advice { - query_index: 13, - column_index: 3, - rotation: Rotation( - 1, + Negated( + Sum( + Sum( + Sum( + Advice { + query_index: 7, + column_index: 7, + rotation: Rotation( + 0, + ), + }, + Scaled( + Advice { + query_index: 8, + column_index: 8, + rotation: Rotation( + 0, + ), + }, + 0x0000000000000000000000000000000000000000000000000000000000000002, + ), + ), + Scaled( + Advice { + query_index: 19, + column_index: 7, + rotation: Rotation( + 1, + ), + }, + 0x0000000000000000000000000000000000000000000000000000000000000004, + ), + ), + Scaled( + Advice { + query_index: 20, + column_index: 8, + rotation: Rotation( + 1, + ), + }, + 0x0000000000000000000000000000000000000000000000000000000000000400, + ), ), - }, + ), ), ), Product( @@ -16786,8 +18615,8 @@ PinnedVerificationKey { Product( Product( Fixed { - query_index: 25, - column_index: 25, + query_index: 29, + column_index: 29, rotation: Rotation( 0, ), @@ -16798,8 +18627,8 @@ PinnedVerificationKey { ), Negated( Fixed { - query_index: 25, - column_index: 25, + query_index: 29, + column_index: 29, rotation: Rotation( 0, ), @@ -16809,12 +18638,12 @@ PinnedVerificationKey { ), Sum( Constant( - 0x0000000000000000000000000000000000000000000000000000000000000002, + 0x0000000000000000000000000000000000000000000000000000000000000003, ), Negated( Fixed { - query_index: 25, - column_index: 25, + query_index: 29, + column_index: 29, rotation: Rotation( 0, ), @@ -16828,8 +18657,8 @@ PinnedVerificationKey { ), Negated( Fixed { - query_index: 25, - column_index: 25, + query_index: 29, + column_index: 29, rotation: Rotation( 0, ), @@ -16843,8 +18672,8 @@ PinnedVerificationKey { ), Negated( Fixed { - query_index: 25, - column_index: 25, + query_index: 29, + column_index: 29, rotation: Rotation( 0, ), @@ -16858,8 +18687,8 @@ PinnedVerificationKey { ), Negated( Fixed { - query_index: 25, - column_index: 25, + query_index: 29, + column_index: 29, rotation: Rotation( 0, ), @@ -16867,21 +18696,35 @@ PinnedVerificationKey { ), ), ), - Product( - Advice { - query_index: 14, - column_index: 4, - rotation: Rotation( - 1, - ), - }, + Sum( Advice { - query_index: 22, + query_index: 6, column_index: 6, rotation: Rotation( - 1, + 0, ), }, + Negated( + Sum( + Advice { + query_index: 7, + column_index: 7, + rotation: Rotation( + 0, + ), + }, + Scaled( + Advice { + query_index: 8, + column_index: 8, + rotation: Rotation( + 0, + ), + }, + 0x0000000000000000000000000000000000000000000000000000000000000040, + ), + ), + ), ), ), Product( @@ -16891,8 +18734,8 @@ PinnedVerificationKey { Product( Product( Fixed { - query_index: 25, - column_index: 25, + query_index: 29, + column_index: 29, rotation: Rotation( 0, ), @@ -16903,8 +18746,8 @@ PinnedVerificationKey { ), Negated( Fixed { - query_index: 25, - column_index: 25, + query_index: 29, + column_index: 29, rotation: Rotation( 0, ), @@ -16918,8 +18761,8 @@ PinnedVerificationKey { ), Negated( Fixed { - query_index: 25, - column_index: 25, + query_index: 29, + column_index: 29, rotation: Rotation( 0, ), @@ -16933,8 +18776,8 @@ PinnedVerificationKey { ), Negated( Fixed { - query_index: 25, - column_index: 25, + query_index: 29, + column_index: 29, rotation: Rotation( 0, ), @@ -16948,23 +18791,46 @@ PinnedVerificationKey { ), Negated( Fixed { - query_index: 25, - column_index: 25, + query_index: 29, + column_index: 29, rotation: Rotation( 0, ), }, ), ), - ), + ), + Sum( + Constant( + 0x0000000000000000000000000000000000000000000000000000000000000006, + ), + Negated( + Fixed { + query_index: 29, + column_index: 29, + rotation: Rotation( + 0, + ), + }, + ), + ), + ), + Product( + Advice { + query_index: 7, + column_index: 7, + rotation: Rotation( + 0, + ), + }, Sum( Constant( - 0x0000000000000000000000000000000000000000000000000000000000000006, + 0x0000000000000000000000000000000000000000000000000000000000000001, ), Negated( - Fixed { - query_index: 25, - column_index: 25, + Advice { + query_index: 7, + column_index: 7, rotation: Rotation( 0, ), @@ -16972,48 +18838,6 @@ PinnedVerificationKey { ), ), ), - Sum( - Sum( - Sum( - Sum( - Advice { - query_index: 5, - column_index: 5, - rotation: Rotation( - 0, - ), - }, - Scaled( - Advice { - query_index: 17, - column_index: 1, - rotation: Rotation( - 1, - ), - }, - 0x0000000000000000000000000000000000000000000000000000000000000020, - ), - ), - Constant( - 0x0000000000000000000000000000100000000000000000000000000000000000, - ), - ), - Negated( - Constant( - 0x00000000000000000000000000000000224698fc094cf91b992d30ed00000001, - ), - ), - ), - Negated( - Advice { - query_index: 18, - column_index: 7, - rotation: Rotation( - 1, - ), - }, - ), - ), ), Product( Product( @@ -17022,8 +18846,8 @@ PinnedVerificationKey { Product( Product( Fixed { - query_index: 25, - column_index: 25, + query_index: 29, + column_index: 29, rotation: Rotation( 0, ), @@ -17034,8 +18858,8 @@ PinnedVerificationKey { ), Negated( Fixed { - query_index: 25, - column_index: 25, + query_index: 29, + column_index: 29, rotation: Rotation( 0, ), @@ -17049,8 +18873,8 @@ PinnedVerificationKey { ), Negated( Fixed { - query_index: 25, - column_index: 25, + query_index: 29, + column_index: 29, rotation: Rotation( 0, ), @@ -17064,8 +18888,8 @@ PinnedVerificationKey { ), Negated( Fixed { - query_index: 25, - column_index: 25, + query_index: 29, + column_index: 29, rotation: Rotation( 0, ), @@ -17079,8 +18903,8 @@ PinnedVerificationKey { ), Negated( Fixed { - query_index: 25, - column_index: 25, + query_index: 29, + column_index: 29, rotation: Rotation( 0, ), @@ -17094,8 +18918,8 @@ PinnedVerificationKey { ), Negated( Fixed { - query_index: 25, - column_index: 25, + query_index: 29, + column_index: 29, rotation: Rotation( 0, ), @@ -17103,21 +18927,47 @@ PinnedVerificationKey { ), ), ), - Product( + Sum( Advice { - query_index: 14, - column_index: 4, + query_index: 6, + column_index: 6, rotation: Rotation( - 1, + 0, ), }, - Advice { - query_index: 19, - column_index: 8, - rotation: Rotation( - 1, + Negated( + Sum( + Sum( + Advice { + query_index: 7, + column_index: 7, + rotation: Rotation( + 0, + ), + }, + Scaled( + Advice { + query_index: 16, + column_index: 6, + rotation: Rotation( + 1, + ), + }, + 0x0000000000000000000000000000000000000000000000000000000000000002, + ), + ), + Scaled( + Advice { + query_index: 19, + column_index: 7, + rotation: Rotation( + 1, + ), + }, + 0x0000000000000000000000000000000000000000000000000000000000000400, + ), ), - }, + ), ), ), Product( @@ -17127,8 +18977,8 @@ PinnedVerificationKey { Product( Product( Fixed { - query_index: 25, - column_index: 25, + query_index: 29, + column_index: 29, rotation: Rotation( 0, ), @@ -17139,8 +18989,8 @@ PinnedVerificationKey { ), Negated( Fixed { - query_index: 25, - column_index: 25, + query_index: 29, + column_index: 29, rotation: Rotation( 0, ), @@ -17154,8 +19004,8 @@ PinnedVerificationKey { ), Negated( Fixed { - query_index: 25, - column_index: 25, + query_index: 29, + column_index: 29, rotation: Rotation( 0, ), @@ -17169,8 +19019,8 @@ PinnedVerificationKey { ), Negated( Fixed { - query_index: 25, - column_index: 25, + query_index: 29, + column_index: 29, rotation: Rotation( 0, ), @@ -17184,8 +19034,8 @@ PinnedVerificationKey { ), Negated( Fixed { - query_index: 25, - column_index: 25, + query_index: 29, + column_index: 29, rotation: Rotation( 0, ), @@ -17199,8 +19049,8 @@ PinnedVerificationKey { ), Negated( Fixed { - query_index: 25, - column_index: 25, + query_index: 29, + column_index: 29, rotation: Rotation( 0, ), @@ -17239,8 +19089,8 @@ PinnedVerificationKey { Product( Product( Fixed { - query_index: 25, - column_index: 25, + query_index: 29, + column_index: 29, rotation: Rotation( 0, ), @@ -17251,8 +19101,8 @@ PinnedVerificationKey { ), Negated( Fixed { - query_index: 25, - column_index: 25, + query_index: 29, + column_index: 29, rotation: Rotation( 0, ), @@ -17266,8 +19116,8 @@ PinnedVerificationKey { ), Negated( Fixed { - query_index: 25, - column_index: 25, + query_index: 29, + column_index: 29, rotation: Rotation( 0, ), @@ -17281,8 +19131,8 @@ PinnedVerificationKey { ), Negated( Fixed { - query_index: 25, - column_index: 25, + query_index: 29, + column_index: 29, rotation: Rotation( 0, ), @@ -17296,8 +19146,8 @@ PinnedVerificationKey { ), Negated( Fixed { - query_index: 25, - column_index: 25, + query_index: 29, + column_index: 29, rotation: Rotation( 0, ), @@ -17311,8 +19161,8 @@ PinnedVerificationKey { ), Negated( Fixed { - query_index: 25, - column_index: 25, + query_index: 29, + column_index: 29, rotation: Rotation( 0, ), @@ -17320,26 +19170,33 @@ PinnedVerificationKey { ), ), ), - Product( + Sum( Advice { - query_index: 18, - column_index: 7, + query_index: 6, + column_index: 6, rotation: Rotation( - 1, + 0, ), }, - Sum( - Constant( - 0x0000000000000000000000000000000000000000000000000000000000000001, - ), - Negated( + Negated( + Sum( Advice { - query_index: 18, + query_index: 7, column_index: 7, rotation: Rotation( - 1, + 0, ), }, + Scaled( + Advice { + query_index: 8, + column_index: 8, + rotation: Rotation( + 0, + ), + }, + 0x0000000000000000000000000000000000000000000000000000000000000020, + ), ), ), ), @@ -17351,8 +19208,8 @@ PinnedVerificationKey { Product( Product( Fixed { - query_index: 25, - column_index: 25, + query_index: 29, + column_index: 29, rotation: Rotation( 0, ), @@ -17363,8 +19220,8 @@ PinnedVerificationKey { ), Negated( Fixed { - query_index: 25, - column_index: 25, + query_index: 29, + column_index: 29, rotation: Rotation( 0, ), @@ -17378,8 +19235,8 @@ PinnedVerificationKey { ), Negated( Fixed { - query_index: 25, - column_index: 25, + query_index: 29, + column_index: 29, rotation: Rotation( 0, ), @@ -17393,8 +19250,8 @@ PinnedVerificationKey { ), Negated( Fixed { - query_index: 25, - column_index: 25, + query_index: 29, + column_index: 29, rotation: Rotation( 0, ), @@ -17408,8 +19265,8 @@ PinnedVerificationKey { ), Negated( Fixed { - query_index: 25, - column_index: 25, + query_index: 29, + column_index: 29, rotation: Rotation( 0, ), @@ -17423,8 +19280,8 @@ PinnedVerificationKey { ), Negated( Fixed { - query_index: 25, - column_index: 25, + query_index: 29, + column_index: 29, rotation: Rotation( 0, ), @@ -17434,40 +19291,28 @@ PinnedVerificationKey { ), Sum( Advice { - query_index: 6, + query_index: 16, column_index: 6, rotation: Rotation( - 0, + 1, ), }, Negated( Sum( Sum( - Sum( - Advice { - query_index: 7, - column_index: 7, - rotation: Rotation( - 0, - ), - }, - Scaled( - Advice { - query_index: 8, - column_index: 8, - rotation: Rotation( - 0, - ), - }, - 0x0000000000000000000000000000000000000000000000000000000000000010, + Advice { + query_index: 7, + column_index: 7, + rotation: Rotation( + 0, ), - ), + }, Scaled( Advice { - query_index: 18, - column_index: 7, + query_index: 8, + column_index: 8, rotation: Rotation( - 1, + 0, ), }, 0x0000000000000000000000000000000000000000000000000000000000000020, @@ -17476,7 +19321,7 @@ PinnedVerificationKey { Scaled( Advice { query_index: 19, - column_index: 8, + column_index: 7, rotation: Rotation( 1, ), @@ -17494,8 +19339,8 @@ PinnedVerificationKey { Product( Product( Fixed { - query_index: 25, - column_index: 25, + query_index: 29, + column_index: 29, rotation: Rotation( 0, ), @@ -17506,8 +19351,8 @@ PinnedVerificationKey { ), Negated( Fixed { - query_index: 25, - column_index: 25, + query_index: 29, + column_index: 29, rotation: Rotation( 0, ), @@ -17521,8 +19366,8 @@ PinnedVerificationKey { ), Negated( Fixed { - query_index: 25, - column_index: 25, + query_index: 29, + column_index: 29, rotation: Rotation( 0, ), @@ -17536,8 +19381,8 @@ PinnedVerificationKey { ), Negated( Fixed { - query_index: 25, - column_index: 25, + query_index: 29, + column_index: 29, rotation: Rotation( 0, ), @@ -17551,8 +19396,8 @@ PinnedVerificationKey { ), Negated( Fixed { - query_index: 25, - column_index: 25, + query_index: 29, + column_index: 29, rotation: Rotation( 0, ), @@ -17566,8 +19411,8 @@ PinnedVerificationKey { ), Negated( Fixed { - query_index: 25, - column_index: 25, + query_index: 29, + column_index: 29, rotation: Rotation( 0, ), @@ -17606,8 +19451,8 @@ PinnedVerificationKey { Product( Product( Fixed { - query_index: 25, - column_index: 25, + query_index: 29, + column_index: 29, rotation: Rotation( 0, ), @@ -17618,8 +19463,8 @@ PinnedVerificationKey { ), Negated( Fixed { - query_index: 25, - column_index: 25, + query_index: 29, + column_index: 29, rotation: Rotation( 0, ), @@ -17633,8 +19478,8 @@ PinnedVerificationKey { ), Negated( Fixed { - query_index: 25, - column_index: 25, + query_index: 29, + column_index: 29, rotation: Rotation( 0, ), @@ -17648,8 +19493,8 @@ PinnedVerificationKey { ), Negated( Fixed { - query_index: 25, - column_index: 25, + query_index: 29, + column_index: 29, rotation: Rotation( 0, ), @@ -17663,8 +19508,8 @@ PinnedVerificationKey { ), Negated( Fixed { - query_index: 25, - column_index: 25, + query_index: 29, + column_index: 29, rotation: Rotation( 0, ), @@ -17678,8 +19523,8 @@ PinnedVerificationKey { ), Negated( Fixed { - query_index: 25, - column_index: 25, + query_index: 29, + column_index: 29, rotation: Rotation( 0, ), @@ -17718,8 +19563,8 @@ PinnedVerificationKey { Product( Product( Fixed { - query_index: 25, - column_index: 25, + query_index: 29, + column_index: 29, rotation: Rotation( 0, ), @@ -17730,8 +19575,8 @@ PinnedVerificationKey { ), Negated( Fixed { - query_index: 25, - column_index: 25, + query_index: 29, + column_index: 29, rotation: Rotation( 0, ), @@ -17745,8 +19590,8 @@ PinnedVerificationKey { ), Negated( Fixed { - query_index: 25, - column_index: 25, + query_index: 29, + column_index: 29, rotation: Rotation( 0, ), @@ -17760,8 +19605,8 @@ PinnedVerificationKey { ), Negated( Fixed { - query_index: 25, - column_index: 25, + query_index: 29, + column_index: 29, rotation: Rotation( 0, ), @@ -17775,8 +19620,8 @@ PinnedVerificationKey { ), Negated( Fixed { - query_index: 25, - column_index: 25, + query_index: 29, + column_index: 29, rotation: Rotation( 0, ), @@ -17790,8 +19635,8 @@ PinnedVerificationKey { ), Negated( Fixed { - query_index: 25, - column_index: 25, + query_index: 29, + column_index: 29, rotation: Rotation( 0, ), @@ -17809,46 +19654,22 @@ PinnedVerificationKey { }, Negated( Sum( - Sum( - Sum( - Advice { - query_index: 7, - column_index: 7, - rotation: Rotation( - 0, - ), - }, - Scaled( - Advice { - query_index: 8, - column_index: 8, - rotation: Rotation( - 0, - ), - }, - 0x0000000000000000000000000000000000000000000000000000000000000002, - ), - ), - Scaled( - Advice { - query_index: 18, - column_index: 7, - rotation: Rotation( - 1, - ), - }, - 0x0000000000000000000000000000000000000000000000000000000000000004, + Advice { + query_index: 7, + column_index: 7, + rotation: Rotation( + 0, ), - ), + }, Scaled( Advice { - query_index: 19, + query_index: 8, column_index: 8, rotation: Rotation( - 1, + 0, ), }, - 0x0000000000000000000000000000000000000000000000000000000000000400, + 0x0000000000000000000000000000000000000000000000000000000000000002, ), ), ), @@ -17861,8 +19682,8 @@ PinnedVerificationKey { Product( Product( Fixed { - query_index: 25, - column_index: 25, + query_index: 29, + column_index: 29, rotation: Rotation( 0, ), @@ -17873,8 +19694,8 @@ PinnedVerificationKey { ), Negated( Fixed { - query_index: 25, - column_index: 25, + query_index: 29, + column_index: 29, rotation: Rotation( 0, ), @@ -17888,8 +19709,8 @@ PinnedVerificationKey { ), Negated( Fixed { - query_index: 25, - column_index: 25, + query_index: 29, + column_index: 29, rotation: Rotation( 0, ), @@ -17903,8 +19724,8 @@ PinnedVerificationKey { ), Negated( Fixed { - query_index: 25, - column_index: 25, + query_index: 29, + column_index: 29, rotation: Rotation( 0, ), @@ -17918,8 +19739,8 @@ PinnedVerificationKey { ), Negated( Fixed { - query_index: 25, - column_index: 25, + query_index: 29, + column_index: 29, rotation: Rotation( 0, ), @@ -17933,8 +19754,8 @@ PinnedVerificationKey { ), Negated( Fixed { - query_index: 25, - column_index: 25, + query_index: 29, + column_index: 29, rotation: Rotation( 0, ), @@ -17943,33 +19764,45 @@ PinnedVerificationKey { ), ), Sum( - Advice { - query_index: 6, - column_index: 6, - rotation: Rotation( - 0, - ), - }, - Negated( + Sum( Sum( Advice { - query_index: 7, - column_index: 7, + query_index: 8, + column_index: 8, rotation: Rotation( 0, ), }, Scaled( Advice { - query_index: 8, - column_index: 8, + query_index: 7, + column_index: 7, rotation: Rotation( 0, ), }, - 0x0000000000000000000000000000000000000000000000000000000000000040, + 0x0400000000000000000000000000000000000000000000000000000000000000, ), ), + Scaled( + Advice { + query_index: 19, + column_index: 7, + rotation: Rotation( + 1, + ), + }, + 0x4000000000000000000000000000000000000000000000000000000000000000, + ), + ), + Negated( + Advice { + query_index: 6, + column_index: 6, + rotation: Rotation( + 0, + ), + }, ), ), ), @@ -17979,37 +19812,21 @@ PinnedVerificationKey { Product( Product( Product( - Product( - Fixed { - query_index: 26, - column_index: 26, - rotation: Rotation( - 0, - ), - }, - Sum( - Constant( - 0x0000000000000000000000000000000000000000000000000000000000000001, - ), - Negated( - Fixed { - query_index: 26, - column_index: 26, - rotation: Rotation( - 0, - ), - }, - ), + Fixed { + query_index: 29, + column_index: 29, + rotation: Rotation( + 0, ), - ), + }, Sum( Constant( - 0x0000000000000000000000000000000000000000000000000000000000000002, + 0x0000000000000000000000000000000000000000000000000000000000000001, ), Negated( Fixed { - query_index: 26, - column_index: 26, + query_index: 29, + column_index: 29, rotation: Rotation( 0, ), @@ -18019,12 +19836,12 @@ PinnedVerificationKey { ), Sum( Constant( - 0x0000000000000000000000000000000000000000000000000000000000000004, + 0x0000000000000000000000000000000000000000000000000000000000000002, ), Negated( Fixed { - query_index: 26, - column_index: 26, + query_index: 29, + column_index: 29, rotation: Rotation( 0, ), @@ -18034,12 +19851,12 @@ PinnedVerificationKey { ), Sum( Constant( - 0x0000000000000000000000000000000000000000000000000000000000000005, + 0x0000000000000000000000000000000000000000000000000000000000000003, ), Negated( Fixed { - query_index: 26, - column_index: 26, + query_index: 29, + column_index: 29, rotation: Rotation( 0, ), @@ -18049,12 +19866,12 @@ PinnedVerificationKey { ), Sum( Constant( - 0x0000000000000000000000000000000000000000000000000000000000000006, + 0x0000000000000000000000000000000000000000000000000000000000000004, ), Negated( Fixed { - query_index: 26, - column_index: 26, + query_index: 29, + column_index: 29, rotation: Rotation( 0, ), @@ -18064,12 +19881,12 @@ PinnedVerificationKey { ), Sum( Constant( - 0x0000000000000000000000000000000000000000000000000000000000000007, + 0x0000000000000000000000000000000000000000000000000000000000000005, ), Negated( Fixed { - query_index: 26, - column_index: 26, + query_index: 29, + column_index: 29, rotation: Rotation( 0, ), @@ -18077,28 +19894,35 @@ PinnedVerificationKey { ), ), ), - Product( - Advice { - query_index: 7, - column_index: 7, - rotation: Rotation( - 0, - ), - }, + Sum( Sum( - Constant( - 0x0000000000000000000000000000000000000000000000000000000000000001, - ), - Negated( + Sum( Advice { - query_index: 7, - column_index: 7, + query_index: 8, + column_index: 8, rotation: Rotation( 0, ), }, + Constant( + 0x0000000000000000000000000000000400000000000000000000000000000000, + ), + ), + Negated( + Constant( + 0x00000000000000000000000000000000224698fc094cf91b992d30ed00000001, + ), ), ), + Negated( + Advice { + query_index: 20, + column_index: 8, + rotation: Rotation( + 1, + ), + }, + ), ), ), Product( @@ -18107,37 +19931,21 @@ PinnedVerificationKey { Product( Product( Product( - Product( - Fixed { - query_index: 26, - column_index: 26, - rotation: Rotation( - 0, - ), - }, - Sum( - Constant( - 0x0000000000000000000000000000000000000000000000000000000000000001, - ), - Negated( - Fixed { - query_index: 26, - column_index: 26, - rotation: Rotation( - 0, - ), - }, - ), + Fixed { + query_index: 29, + column_index: 29, + rotation: Rotation( + 0, ), - ), + }, Sum( Constant( - 0x0000000000000000000000000000000000000000000000000000000000000002, + 0x0000000000000000000000000000000000000000000000000000000000000001, ), Negated( Fixed { - query_index: 26, - column_index: 26, + query_index: 29, + column_index: 29, rotation: Rotation( 0, ), @@ -18147,12 +19955,12 @@ PinnedVerificationKey { ), Sum( Constant( - 0x0000000000000000000000000000000000000000000000000000000000000004, + 0x0000000000000000000000000000000000000000000000000000000000000002, ), Negated( Fixed { - query_index: 26, - column_index: 26, + query_index: 29, + column_index: 29, rotation: Rotation( 0, ), @@ -18162,12 +19970,12 @@ PinnedVerificationKey { ), Sum( Constant( - 0x0000000000000000000000000000000000000000000000000000000000000005, + 0x0000000000000000000000000000000000000000000000000000000000000003, ), Negated( Fixed { - query_index: 26, - column_index: 26, + query_index: 29, + column_index: 29, rotation: Rotation( 0, ), @@ -18177,12 +19985,12 @@ PinnedVerificationKey { ), Sum( Constant( - 0x0000000000000000000000000000000000000000000000000000000000000006, + 0x0000000000000000000000000000000000000000000000000000000000000004, ), Negated( Fixed { - query_index: 26, - column_index: 26, + query_index: 29, + column_index: 29, rotation: Rotation( 0, ), @@ -18192,12 +20000,12 @@ PinnedVerificationKey { ), Sum( Constant( - 0x0000000000000000000000000000000000000000000000000000000000000007, + 0x0000000000000000000000000000000000000000000000000000000000000005, ), Negated( Fixed { - query_index: 26, - column_index: 26, + query_index: 29, + column_index: 29, rotation: Rotation( 0, ), @@ -18205,47 +20013,21 @@ PinnedVerificationKey { ), ), ), - Sum( + Product( Advice { - query_index: 6, - column_index: 6, + query_index: 19, + column_index: 7, rotation: Rotation( - 0, + 1, ), }, - Negated( - Sum( - Sum( - Advice { - query_index: 7, - column_index: 7, - rotation: Rotation( - 0, - ), - }, - Scaled( - Advice { - query_index: 22, - column_index: 6, - rotation: Rotation( - 1, - ), - }, - 0x0000000000000000000000000000000000000000000000000000000000000002, - ), - ), - Scaled( - Advice { - query_index: 18, - column_index: 7, - rotation: Rotation( - 1, - ), - }, - 0x0000000000000000000000000000000000000000000000000000000000000400, - ), + Advice { + query_index: 7, + column_index: 7, + rotation: Rotation( + 0, ), - ), + }, ), ), Product( @@ -18254,37 +20036,21 @@ PinnedVerificationKey { Product( Product( Product( - Product( - Fixed { - query_index: 26, - column_index: 26, - rotation: Rotation( - 0, - ), - }, - Sum( - Constant( - 0x0000000000000000000000000000000000000000000000000000000000000001, - ), - Negated( - Fixed { - query_index: 26, - column_index: 26, - rotation: Rotation( - 0, - ), - }, - ), + Fixed { + query_index: 29, + column_index: 29, + rotation: Rotation( + 0, ), - ), + }, Sum( Constant( - 0x0000000000000000000000000000000000000000000000000000000000000002, + 0x0000000000000000000000000000000000000000000000000000000000000001, ), Negated( Fixed { - query_index: 26, - column_index: 26, + query_index: 29, + column_index: 29, rotation: Rotation( 0, ), @@ -18294,12 +20060,12 @@ PinnedVerificationKey { ), Sum( Constant( - 0x0000000000000000000000000000000000000000000000000000000000000003, + 0x0000000000000000000000000000000000000000000000000000000000000002, ), Negated( Fixed { - query_index: 26, - column_index: 26, + query_index: 29, + column_index: 29, rotation: Rotation( 0, ), @@ -18309,12 +20075,12 @@ PinnedVerificationKey { ), Sum( Constant( - 0x0000000000000000000000000000000000000000000000000000000000000005, + 0x0000000000000000000000000000000000000000000000000000000000000003, ), Negated( Fixed { - query_index: 26, - column_index: 26, + query_index: 29, + column_index: 29, rotation: Rotation( 0, ), @@ -18324,12 +20090,12 @@ PinnedVerificationKey { ), Sum( Constant( - 0x0000000000000000000000000000000000000000000000000000000000000006, + 0x0000000000000000000000000000000000000000000000000000000000000004, ), Negated( Fixed { - query_index: 26, - column_index: 26, + query_index: 29, + column_index: 29, rotation: Rotation( 0, ), @@ -18339,12 +20105,12 @@ PinnedVerificationKey { ), Sum( Constant( - 0x0000000000000000000000000000000000000000000000000000000000000007, + 0x0000000000000000000000000000000000000000000000000000000000000005, ), Negated( Fixed { - query_index: 26, - column_index: 26, + query_index: 29, + column_index: 29, rotation: Rotation( 0, ), @@ -18354,26 +20120,19 @@ PinnedVerificationKey { ), Product( Advice { - query_index: 8, - column_index: 8, + query_index: 19, + column_index: 7, rotation: Rotation( - 0, + 1, ), }, - Sum( - Constant( - 0x0000000000000000000000000000000000000000000000000000000000000001, - ), - Negated( - Advice { - query_index: 8, - column_index: 8, - rotation: Rotation( - 0, - ), - }, + Advice { + query_index: 9, + column_index: 9, + rotation: Rotation( + 0, ), - ), + }, ), ), Product( @@ -18382,37 +20141,21 @@ PinnedVerificationKey { Product( Product( Product( - Product( - Fixed { - query_index: 26, - column_index: 26, - rotation: Rotation( - 0, - ), - }, - Sum( - Constant( - 0x0000000000000000000000000000000000000000000000000000000000000001, - ), - Negated( - Fixed { - query_index: 26, - column_index: 26, - rotation: Rotation( - 0, - ), - }, - ), + Fixed { + query_index: 29, + column_index: 29, + rotation: Rotation( + 0, ), - ), + }, Sum( Constant( - 0x0000000000000000000000000000000000000000000000000000000000000002, + 0x0000000000000000000000000000000000000000000000000000000000000001, ), Negated( Fixed { - query_index: 26, - column_index: 26, + query_index: 29, + column_index: 29, rotation: Rotation( 0, ), @@ -18422,12 +20165,12 @@ PinnedVerificationKey { ), Sum( Constant( - 0x0000000000000000000000000000000000000000000000000000000000000003, + 0x0000000000000000000000000000000000000000000000000000000000000002, ), Negated( Fixed { - query_index: 26, - column_index: 26, + query_index: 29, + column_index: 29, rotation: Rotation( 0, ), @@ -18437,12 +20180,12 @@ PinnedVerificationKey { ), Sum( Constant( - 0x0000000000000000000000000000000000000000000000000000000000000005, + 0x0000000000000000000000000000000000000000000000000000000000000003, ), Negated( Fixed { - query_index: 26, - column_index: 26, + query_index: 29, + column_index: 29, rotation: Rotation( 0, ), @@ -18452,12 +20195,12 @@ PinnedVerificationKey { ), Sum( Constant( - 0x0000000000000000000000000000000000000000000000000000000000000006, + 0x0000000000000000000000000000000000000000000000000000000000000004, ), Negated( Fixed { - query_index: 26, - column_index: 26, + query_index: 29, + column_index: 29, rotation: Rotation( 0, ), @@ -18467,12 +20210,12 @@ PinnedVerificationKey { ), Sum( Constant( - 0x0000000000000000000000000000000000000000000000000000000000000007, + 0x0000000000000000000000000000000000000000000000000000000000000005, ), Negated( Fixed { - query_index: 26, - column_index: 26, + query_index: 29, + column_index: 29, rotation: Rotation( 0, ), @@ -18480,35 +20223,21 @@ PinnedVerificationKey { ), ), ), - Sum( + Product( Advice { - query_index: 6, - column_index: 6, + query_index: 19, + column_index: 7, rotation: Rotation( - 0, + 1, ), }, - Negated( - Sum( - Advice { - query_index: 7, - column_index: 7, - rotation: Rotation( - 0, - ), - }, - Scaled( - Advice { - query_index: 8, - column_index: 8, - rotation: Rotation( - 0, - ), - }, - 0x0000000000000000000000000000000000000000000000000000000000000020, - ), + Advice { + query_index: 17, + column_index: 9, + rotation: Rotation( + 1, ), - ), + }, ), ), Product( @@ -18519,20 +20248,20 @@ PinnedVerificationKey { Product( Product( Fixed { - query_index: 26, - column_index: 26, + query_index: 30, + column_index: 30, rotation: Rotation( 0, ), }, Sum( Constant( - 0x0000000000000000000000000000000000000000000000000000000000000001, + 0x0000000000000000000000000000000000000000000000000000000000000002, ), Negated( Fixed { - query_index: 26, - column_index: 26, + query_index: 30, + column_index: 30, rotation: Rotation( 0, ), @@ -18542,12 +20271,12 @@ PinnedVerificationKey { ), Sum( Constant( - 0x0000000000000000000000000000000000000000000000000000000000000002, + 0x0000000000000000000000000000000000000000000000000000000000000003, ), Negated( Fixed { - query_index: 26, - column_index: 26, + query_index: 30, + column_index: 30, rotation: Rotation( 0, ), @@ -18557,12 +20286,12 @@ PinnedVerificationKey { ), Sum( Constant( - 0x0000000000000000000000000000000000000000000000000000000000000003, + 0x0000000000000000000000000000000000000000000000000000000000000004, ), Negated( Fixed { - query_index: 26, - column_index: 26, + query_index: 30, + column_index: 30, rotation: Rotation( 0, ), @@ -18572,12 +20301,12 @@ PinnedVerificationKey { ), Sum( Constant( - 0x0000000000000000000000000000000000000000000000000000000000000004, + 0x0000000000000000000000000000000000000000000000000000000000000005, ), Negated( Fixed { - query_index: 26, - column_index: 26, + query_index: 30, + column_index: 30, rotation: Rotation( 0, ), @@ -18591,8 +20320,8 @@ PinnedVerificationKey { ), Negated( Fixed { - query_index: 26, - column_index: 26, + query_index: 30, + column_index: 30, rotation: Rotation( 0, ), @@ -18606,8 +20335,8 @@ PinnedVerificationKey { ), Negated( Fixed { - query_index: 26, - column_index: 26, + query_index: 30, + column_index: 30, rotation: Rotation( 0, ), @@ -18619,26 +20348,26 @@ PinnedVerificationKey { Sum( Sum( Advice { - query_index: 8, - column_index: 8, + query_index: 7, + column_index: 7, rotation: Rotation( 0, ), }, Scaled( Advice { - query_index: 7, - column_index: 7, + query_index: 8, + column_index: 8, rotation: Rotation( 0, ), }, - 0x0400000000000000000000000000000000000000000000000000000000000000, + 0x0000000000000000000000000000000000000000000000000000000000000010, ), ), Scaled( Advice { - query_index: 18, + query_index: 19, column_index: 7, rotation: Rotation( 1, @@ -18666,20 +20395,20 @@ PinnedVerificationKey { Product( Product( Fixed { - query_index: 26, - column_index: 26, + query_index: 30, + column_index: 30, rotation: Rotation( 0, ), }, Sum( Constant( - 0x0000000000000000000000000000000000000000000000000000000000000001, + 0x0000000000000000000000000000000000000000000000000000000000000002, ), Negated( Fixed { - query_index: 26, - column_index: 26, + query_index: 30, + column_index: 30, rotation: Rotation( 0, ), @@ -18689,12 +20418,12 @@ PinnedVerificationKey { ), Sum( Constant( - 0x0000000000000000000000000000000000000000000000000000000000000002, + 0x0000000000000000000000000000000000000000000000000000000000000003, ), Negated( Fixed { - query_index: 26, - column_index: 26, + query_index: 30, + column_index: 30, rotation: Rotation( 0, ), @@ -18704,12 +20433,12 @@ PinnedVerificationKey { ), Sum( Constant( - 0x0000000000000000000000000000000000000000000000000000000000000003, + 0x0000000000000000000000000000000000000000000000000000000000000004, ), Negated( Fixed { - query_index: 26, - column_index: 26, + query_index: 30, + column_index: 30, rotation: Rotation( 0, ), @@ -18719,12 +20448,12 @@ PinnedVerificationKey { ), Sum( Constant( - 0x0000000000000000000000000000000000000000000000000000000000000004, + 0x0000000000000000000000000000000000000000000000000000000000000005, ), Negated( Fixed { - query_index: 26, - column_index: 26, + query_index: 30, + column_index: 30, rotation: Rotation( 0, ), @@ -18738,8 +20467,8 @@ PinnedVerificationKey { ), Negated( Fixed { - query_index: 26, - column_index: 26, + query_index: 30, + column_index: 30, rotation: Rotation( 0, ), @@ -18753,8 +20482,8 @@ PinnedVerificationKey { ), Negated( Fixed { - query_index: 26, - column_index: 26, + query_index: 30, + column_index: 30, rotation: Rotation( 0, ), @@ -18765,15 +20494,27 @@ PinnedVerificationKey { Sum( Sum( Sum( - Advice { - query_index: 8, - column_index: 8, - rotation: Rotation( - 0, + Sum( + Advice { + query_index: 7, + column_index: 7, + rotation: Rotation( + 0, + ), + }, + Scaled( + Advice { + query_index: 8, + column_index: 8, + rotation: Rotation( + 0, + ), + }, + 0x0000000000000000000000000000000000000000000000000000000000000010, ), - }, + ), Constant( - 0x0000000000000000000000000000000400000000000000000000000000000000, + 0x0000000000000000000000000000100000000000000000000000000000000000, ), ), Negated( @@ -18784,7 +20525,7 @@ PinnedVerificationKey { ), Negated( Advice { - query_index: 19, + query_index: 20, column_index: 8, rotation: Rotation( 1, @@ -18801,20 +20542,20 @@ PinnedVerificationKey { Product( Product( Fixed { - query_index: 26, - column_index: 26, + query_index: 30, + column_index: 30, rotation: Rotation( 0, ), }, Sum( Constant( - 0x0000000000000000000000000000000000000000000000000000000000000001, + 0x0000000000000000000000000000000000000000000000000000000000000002, ), Negated( Fixed { - query_index: 26, - column_index: 26, + query_index: 30, + column_index: 30, rotation: Rotation( 0, ), @@ -18824,12 +20565,12 @@ PinnedVerificationKey { ), Sum( Constant( - 0x0000000000000000000000000000000000000000000000000000000000000002, + 0x0000000000000000000000000000000000000000000000000000000000000003, ), Negated( Fixed { - query_index: 26, - column_index: 26, + query_index: 30, + column_index: 30, rotation: Rotation( 0, ), @@ -18839,12 +20580,12 @@ PinnedVerificationKey { ), Sum( Constant( - 0x0000000000000000000000000000000000000000000000000000000000000003, + 0x0000000000000000000000000000000000000000000000000000000000000004, ), Negated( Fixed { - query_index: 26, - column_index: 26, + query_index: 30, + column_index: 30, rotation: Rotation( 0, ), @@ -18854,12 +20595,12 @@ PinnedVerificationKey { ), Sum( Constant( - 0x0000000000000000000000000000000000000000000000000000000000000004, + 0x0000000000000000000000000000000000000000000000000000000000000005, ), Negated( Fixed { - query_index: 26, - column_index: 26, + query_index: 30, + column_index: 30, rotation: Rotation( 0, ), @@ -18873,8 +20614,8 @@ PinnedVerificationKey { ), Negated( Fixed { - query_index: 26, - column_index: 26, + query_index: 30, + column_index: 30, rotation: Rotation( 0, ), @@ -18888,8 +20629,8 @@ PinnedVerificationKey { ), Negated( Fixed { - query_index: 26, - column_index: 26, + query_index: 30, + column_index: 30, rotation: Rotation( 0, ), @@ -18899,15 +20640,15 @@ PinnedVerificationKey { ), Product( Advice { - query_index: 18, + query_index: 19, column_index: 7, rotation: Rotation( 1, ), }, Advice { - query_index: 7, - column_index: 7, + query_index: 9, + column_index: 9, rotation: Rotation( 0, ), @@ -18922,20 +20663,20 @@ PinnedVerificationKey { Product( Product( Fixed { - query_index: 26, - column_index: 26, + query_index: 30, + column_index: 30, rotation: Rotation( 0, ), }, Sum( Constant( - 0x0000000000000000000000000000000000000000000000000000000000000001, + 0x0000000000000000000000000000000000000000000000000000000000000002, ), Negated( Fixed { - query_index: 26, - column_index: 26, + query_index: 30, + column_index: 30, rotation: Rotation( 0, ), @@ -18945,12 +20686,12 @@ PinnedVerificationKey { ), Sum( Constant( - 0x0000000000000000000000000000000000000000000000000000000000000002, + 0x0000000000000000000000000000000000000000000000000000000000000003, ), Negated( Fixed { - query_index: 26, - column_index: 26, + query_index: 30, + column_index: 30, rotation: Rotation( 0, ), @@ -18960,12 +20701,12 @@ PinnedVerificationKey { ), Sum( Constant( - 0x0000000000000000000000000000000000000000000000000000000000000003, + 0x0000000000000000000000000000000000000000000000000000000000000004, ), Negated( Fixed { - query_index: 26, - column_index: 26, + query_index: 30, + column_index: 30, rotation: Rotation( 0, ), @@ -18975,12 +20716,12 @@ PinnedVerificationKey { ), Sum( Constant( - 0x0000000000000000000000000000000000000000000000000000000000000004, + 0x0000000000000000000000000000000000000000000000000000000000000005, ), Negated( Fixed { - query_index: 26, - column_index: 26, + query_index: 30, + column_index: 30, rotation: Rotation( 0, ), @@ -18994,8 +20735,8 @@ PinnedVerificationKey { ), Negated( Fixed { - query_index: 26, - column_index: 26, + query_index: 30, + column_index: 30, rotation: Rotation( 0, ), @@ -19009,8 +20750,8 @@ PinnedVerificationKey { ), Negated( Fixed { - query_index: 26, - column_index: 26, + query_index: 30, + column_index: 30, rotation: Rotation( 0, ), @@ -19020,17 +20761,17 @@ PinnedVerificationKey { ), Product( Advice { - query_index: 18, + query_index: 19, column_index: 7, rotation: Rotation( 1, ), }, Advice { - query_index: 9, + query_index: 17, column_index: 9, rotation: Rotation( - 0, + 1, ), }, ), @@ -19043,8 +20784,8 @@ PinnedVerificationKey { Product( Product( Fixed { - query_index: 26, - column_index: 26, + query_index: 30, + column_index: 30, rotation: Rotation( 0, ), @@ -19055,8 +20796,8 @@ PinnedVerificationKey { ), Negated( Fixed { - query_index: 26, - column_index: 26, + query_index: 30, + column_index: 30, rotation: Rotation( 0, ), @@ -19066,12 +20807,12 @@ PinnedVerificationKey { ), Sum( Constant( - 0x0000000000000000000000000000000000000000000000000000000000000002, + 0x0000000000000000000000000000000000000000000000000000000000000003, ), Negated( Fixed { - query_index: 26, - column_index: 26, + query_index: 30, + column_index: 30, rotation: Rotation( 0, ), @@ -19081,12 +20822,12 @@ PinnedVerificationKey { ), Sum( Constant( - 0x0000000000000000000000000000000000000000000000000000000000000003, + 0x0000000000000000000000000000000000000000000000000000000000000004, ), Negated( Fixed { - query_index: 26, - column_index: 26, + query_index: 30, + column_index: 30, rotation: Rotation( 0, ), @@ -19096,12 +20837,12 @@ PinnedVerificationKey { ), Sum( Constant( - 0x0000000000000000000000000000000000000000000000000000000000000004, + 0x0000000000000000000000000000000000000000000000000000000000000005, ), Negated( Fixed { - query_index: 26, - column_index: 26, + query_index: 30, + column_index: 30, rotation: Rotation( 0, ), @@ -19115,8 +20856,8 @@ PinnedVerificationKey { ), Negated( Fixed { - query_index: 26, - column_index: 26, + query_index: 30, + column_index: 30, rotation: Rotation( 0, ), @@ -19130,8 +20871,8 @@ PinnedVerificationKey { ), Negated( Fixed { - query_index: 26, - column_index: 26, + query_index: 30, + column_index: 30, rotation: Rotation( 0, ), @@ -19139,21 +20880,47 @@ PinnedVerificationKey { ), ), ), - Product( - Advice { - query_index: 18, - column_index: 7, - rotation: Rotation( - 1, + Sum( + Sum( + Sum( + Advice { + query_index: 7, + column_index: 7, + rotation: Rotation( + 0, + ), + }, + Scaled( + Advice { + query_index: 8, + column_index: 8, + rotation: Rotation( + 0, + ), + }, + 0x0000000000000000000000000000000000000000000000000000000000000100, + ), ), - }, - Advice { - query_index: 10, - column_index: 9, - rotation: Rotation( - 1, + Scaled( + Advice { + query_index: 9, + column_index: 9, + rotation: Rotation( + 0, + ), + }, + 0x0000000000000000000000000000000000000000000000000400000000000000, ), - }, + ), + Negated( + Advice { + query_index: 6, + column_index: 6, + rotation: Rotation( + 0, + ), + }, + ), ), ), Product( @@ -19164,8 +20931,8 @@ PinnedVerificationKey { Product( Product( Fixed { - query_index: 26, - column_index: 26, + query_index: 30, + column_index: 30, rotation: Rotation( 0, ), @@ -19176,8 +20943,8 @@ PinnedVerificationKey { ), Negated( Fixed { - query_index: 26, - column_index: 26, + query_index: 30, + column_index: 30, rotation: Rotation( 0, ), @@ -19191,8 +20958,8 @@ PinnedVerificationKey { ), Negated( Fixed { - query_index: 26, - column_index: 26, + query_index: 30, + column_index: 30, rotation: Rotation( 0, ), @@ -19202,12 +20969,12 @@ PinnedVerificationKey { ), Sum( Constant( - 0x0000000000000000000000000000000000000000000000000000000000000003, + 0x0000000000000000000000000000000000000000000000000000000000000004, ), Negated( Fixed { - query_index: 26, - column_index: 26, + query_index: 30, + column_index: 30, rotation: Rotation( 0, ), @@ -19217,12 +20984,12 @@ PinnedVerificationKey { ), Sum( Constant( - 0x0000000000000000000000000000000000000000000000000000000000000004, + 0x0000000000000000000000000000000000000000000000000000000000000005, ), Negated( Fixed { - query_index: 26, - column_index: 26, + query_index: 30, + column_index: 30, rotation: Rotation( 0, ), @@ -19232,12 +20999,12 @@ PinnedVerificationKey { ), Sum( Constant( - 0x0000000000000000000000000000000000000000000000000000000000000005, + 0x0000000000000000000000000000000000000000000000000000000000000006, ), Negated( Fixed { - query_index: 26, - column_index: 26, + query_index: 30, + column_index: 30, rotation: Rotation( 0, ), @@ -19251,8 +21018,8 @@ PinnedVerificationKey { ), Negated( Fixed { - query_index: 26, - column_index: 26, + query_index: 30, + column_index: 30, rotation: Rotation( 0, ), @@ -19283,7 +21050,7 @@ PinnedVerificationKey { ), Scaled( Advice { - query_index: 18, + query_index: 19, column_index: 7, rotation: Rotation( 1, @@ -19311,8 +21078,8 @@ PinnedVerificationKey { Product( Product( Fixed { - query_index: 26, - column_index: 26, + query_index: 30, + column_index: 30, rotation: Rotation( 0, ), @@ -19323,8 +21090,8 @@ PinnedVerificationKey { ), Negated( Fixed { - query_index: 26, - column_index: 26, + query_index: 30, + column_index: 30, rotation: Rotation( 0, ), @@ -19338,8 +21105,8 @@ PinnedVerificationKey { ), Negated( Fixed { - query_index: 26, - column_index: 26, + query_index: 30, + column_index: 30, rotation: Rotation( 0, ), @@ -19349,12 +21116,12 @@ PinnedVerificationKey { ), Sum( Constant( - 0x0000000000000000000000000000000000000000000000000000000000000003, + 0x0000000000000000000000000000000000000000000000000000000000000004, ), Negated( Fixed { - query_index: 26, - column_index: 26, + query_index: 30, + column_index: 30, rotation: Rotation( 0, ), @@ -19364,12 +21131,12 @@ PinnedVerificationKey { ), Sum( Constant( - 0x0000000000000000000000000000000000000000000000000000000000000004, + 0x0000000000000000000000000000000000000000000000000000000000000005, ), Negated( Fixed { - query_index: 26, - column_index: 26, + query_index: 30, + column_index: 30, rotation: Rotation( 0, ), @@ -19379,12 +21146,12 @@ PinnedVerificationKey { ), Sum( Constant( - 0x0000000000000000000000000000000000000000000000000000000000000005, + 0x0000000000000000000000000000000000000000000000000000000000000006, ), Negated( Fixed { - query_index: 26, - column_index: 26, + query_index: 30, + column_index: 30, rotation: Rotation( 0, ), @@ -19398,8 +21165,8 @@ PinnedVerificationKey { ), Negated( Fixed { - query_index: 26, - column_index: 26, + query_index: 30, + column_index: 30, rotation: Rotation( 0, ), @@ -19441,134 +21208,13 @@ PinnedVerificationKey { ), Negated( Advice { - query_index: 19, + query_index: 20, column_index: 8, rotation: Rotation( 1, ), - }, - ), - ), - ), - Product( - Product( - Product( - Product( - Product( - Product( - Product( - Fixed { - query_index: 26, - column_index: 26, - rotation: Rotation( - 0, - ), - }, - Sum( - Constant( - 0x0000000000000000000000000000000000000000000000000000000000000001, - ), - Negated( - Fixed { - query_index: 26, - column_index: 26, - rotation: Rotation( - 0, - ), - }, - ), - ), - ), - Sum( - Constant( - 0x0000000000000000000000000000000000000000000000000000000000000002, - ), - Negated( - Fixed { - query_index: 26, - column_index: 26, - rotation: Rotation( - 0, - ), - }, - ), - ), - ), - Sum( - Constant( - 0x0000000000000000000000000000000000000000000000000000000000000003, - ), - Negated( - Fixed { - query_index: 26, - column_index: 26, - rotation: Rotation( - 0, - ), - }, - ), - ), - ), - Sum( - Constant( - 0x0000000000000000000000000000000000000000000000000000000000000004, - ), - Negated( - Fixed { - query_index: 26, - column_index: 26, - rotation: Rotation( - 0, - ), - }, - ), - ), - ), - Sum( - Constant( - 0x0000000000000000000000000000000000000000000000000000000000000005, - ), - Negated( - Fixed { - query_index: 26, - column_index: 26, - rotation: Rotation( - 0, - ), - }, - ), - ), - ), - Sum( - Constant( - 0x0000000000000000000000000000000000000000000000000000000000000007, - ), - Negated( - Fixed { - query_index: 26, - column_index: 26, - rotation: Rotation( - 0, - ), - }, - ), - ), - ), - Product( - Advice { - query_index: 18, - column_index: 7, - rotation: Rotation( - 1, - ), - }, - Advice { - query_index: 9, - column_index: 9, - rotation: Rotation( - 0, - ), - }, + }, + ), ), ), Product( @@ -19579,8 +21225,8 @@ PinnedVerificationKey { Product( Product( Fixed { - query_index: 26, - column_index: 26, + query_index: 30, + column_index: 30, rotation: Rotation( 0, ), @@ -19591,8 +21237,8 @@ PinnedVerificationKey { ), Negated( Fixed { - query_index: 26, - column_index: 26, + query_index: 30, + column_index: 30, rotation: Rotation( 0, ), @@ -19606,8 +21252,8 @@ PinnedVerificationKey { ), Negated( Fixed { - query_index: 26, - column_index: 26, + query_index: 30, + column_index: 30, rotation: Rotation( 0, ), @@ -19617,12 +21263,12 @@ PinnedVerificationKey { ), Sum( Constant( - 0x0000000000000000000000000000000000000000000000000000000000000003, + 0x0000000000000000000000000000000000000000000000000000000000000004, ), Negated( Fixed { - query_index: 26, - column_index: 26, + query_index: 30, + column_index: 30, rotation: Rotation( 0, ), @@ -19632,12 +21278,12 @@ PinnedVerificationKey { ), Sum( Constant( - 0x0000000000000000000000000000000000000000000000000000000000000004, + 0x0000000000000000000000000000000000000000000000000000000000000005, ), Negated( Fixed { - query_index: 26, - column_index: 26, + query_index: 30, + column_index: 30, rotation: Rotation( 0, ), @@ -19647,12 +21293,12 @@ PinnedVerificationKey { ), Sum( Constant( - 0x0000000000000000000000000000000000000000000000000000000000000005, + 0x0000000000000000000000000000000000000000000000000000000000000006, ), Negated( Fixed { - query_index: 26, - column_index: 26, + query_index: 30, + column_index: 30, rotation: Rotation( 0, ), @@ -19666,8 +21312,8 @@ PinnedVerificationKey { ), Negated( Fixed { - query_index: 26, - column_index: 26, + query_index: 30, + column_index: 30, rotation: Rotation( 0, ), @@ -19677,17 +21323,17 @@ PinnedVerificationKey { ), Product( Advice { - query_index: 18, + query_index: 19, column_index: 7, rotation: Rotation( 1, ), }, Advice { - query_index: 10, + query_index: 9, column_index: 9, rotation: Rotation( - 1, + 0, ), }, ), @@ -19700,8 +21346,8 @@ PinnedVerificationKey { Product( Product( Fixed { - query_index: 26, - column_index: 26, + query_index: 30, + column_index: 30, rotation: Rotation( 0, ), @@ -19712,8 +21358,8 @@ PinnedVerificationKey { ), Negated( Fixed { - query_index: 26, - column_index: 26, + query_index: 30, + column_index: 30, rotation: Rotation( 0, ), @@ -19727,8 +21373,8 @@ PinnedVerificationKey { ), Negated( Fixed { - query_index: 26, - column_index: 26, + query_index: 30, + column_index: 30, rotation: Rotation( 0, ), @@ -19738,12 +21384,12 @@ PinnedVerificationKey { ), Sum( Constant( - 0x0000000000000000000000000000000000000000000000000000000000000003, + 0x0000000000000000000000000000000000000000000000000000000000000004, ), Negated( Fixed { - query_index: 26, - column_index: 26, + query_index: 30, + column_index: 30, rotation: Rotation( 0, ), @@ -19753,12 +21399,12 @@ PinnedVerificationKey { ), Sum( Constant( - 0x0000000000000000000000000000000000000000000000000000000000000004, + 0x0000000000000000000000000000000000000000000000000000000000000005, ), Negated( Fixed { - query_index: 26, - column_index: 26, + query_index: 30, + column_index: 30, rotation: Rotation( 0, ), @@ -19768,12 +21414,12 @@ PinnedVerificationKey { ), Sum( Constant( - 0x0000000000000000000000000000000000000000000000000000000000000005, + 0x0000000000000000000000000000000000000000000000000000000000000006, ), Negated( Fixed { - query_index: 26, - column_index: 26, + query_index: 30, + column_index: 30, rotation: Rotation( 0, ), @@ -19783,12 +21429,12 @@ PinnedVerificationKey { ), Sum( Constant( - 0x0000000000000000000000000000000000000000000000000000000000000006, + 0x0000000000000000000000000000000000000000000000000000000000000007, ), Negated( Fixed { - query_index: 26, - column_index: 26, + query_index: 30, + column_index: 30, rotation: Rotation( 0, ), @@ -19796,47 +21442,21 @@ PinnedVerificationKey { ), ), ), - Sum( - Sum( - Sum( - Advice { - query_index: 7, - column_index: 7, - rotation: Rotation( - 0, - ), - }, - Scaled( - Advice { - query_index: 8, - column_index: 8, - rotation: Rotation( - 0, - ), - }, - 0x0000000000000000000000000000000000000000000000000000000000000100, - ), + Product( + Advice { + query_index: 19, + column_index: 7, + rotation: Rotation( + 1, ), - Scaled( - Advice { - query_index: 9, - column_index: 9, - rotation: Rotation( - 0, - ), - }, - 0x0000000000000000000000000000000000000000000000000400000000000000, + }, + Advice { + query_index: 17, + column_index: 9, + rotation: Rotation( + 1, ), - ), - Negated( - Advice { - query_index: 6, - column_index: 6, - rotation: Rotation( - 0, - ), - }, - ), + }, ), ), Product( @@ -19847,20 +21467,20 @@ PinnedVerificationKey { Product( Product( Fixed { - query_index: 27, - column_index: 27, + query_index: 30, + column_index: 30, rotation: Rotation( 0, ), }, Sum( Constant( - 0x0000000000000000000000000000000000000000000000000000000000000002, + 0x0000000000000000000000000000000000000000000000000000000000000001, ), Negated( Fixed { - query_index: 27, - column_index: 27, + query_index: 30, + column_index: 30, rotation: Rotation( 0, ), @@ -19870,12 +21490,12 @@ PinnedVerificationKey { ), Sum( Constant( - 0x0000000000000000000000000000000000000000000000000000000000000003, + 0x0000000000000000000000000000000000000000000000000000000000000002, ), Negated( Fixed { - query_index: 27, - column_index: 27, + query_index: 30, + column_index: 30, rotation: Rotation( 0, ), @@ -19885,12 +21505,12 @@ PinnedVerificationKey { ), Sum( Constant( - 0x0000000000000000000000000000000000000000000000000000000000000004, + 0x0000000000000000000000000000000000000000000000000000000000000003, ), Negated( Fixed { - query_index: 27, - column_index: 27, + query_index: 30, + column_index: 30, rotation: Rotation( 0, ), @@ -19904,8 +21524,8 @@ PinnedVerificationKey { ), Negated( Fixed { - query_index: 27, - column_index: 27, + query_index: 30, + column_index: 30, rotation: Rotation( 0, ), @@ -19919,8 +21539,8 @@ PinnedVerificationKey { ), Negated( Fixed { - query_index: 27, - column_index: 27, + query_index: 30, + column_index: 30, rotation: Rotation( 0, ), @@ -19934,8 +21554,8 @@ PinnedVerificationKey { ), Negated( Fixed { - query_index: 27, - column_index: 27, + query_index: 30, + column_index: 30, rotation: Rotation( 0, ), @@ -19946,27 +21566,39 @@ PinnedVerificationKey { Sum( Sum( Sum( - Advice { - query_index: 7, - column_index: 7, - rotation: Rotation( - 0, + Sum( + Advice { + query_index: 7, + column_index: 7, + rotation: Rotation( + 0, + ), + }, + Scaled( + Advice { + query_index: 8, + column_index: 8, + rotation: Rotation( + 0, + ), + }, + 0x0000000000000000000000000000000000000000000000000000000000000200, ), - }, + ), Scaled( Advice { - query_index: 8, - column_index: 8, + query_index: 16, + column_index: 6, rotation: Rotation( - 0, + 1, ), }, - 0x0000000000000000000000000000000000000000000000000000000000000010, + 0x0200000000000000000000000000000000000000000000000000000000000000, ), ), Scaled( Advice { - query_index: 18, + query_index: 19, column_index: 7, rotation: Rotation( 1, @@ -19994,20 +21626,20 @@ PinnedVerificationKey { Product( Product( Fixed { - query_index: 27, - column_index: 27, + query_index: 30, + column_index: 30, rotation: Rotation( 0, ), }, Sum( Constant( - 0x0000000000000000000000000000000000000000000000000000000000000002, + 0x0000000000000000000000000000000000000000000000000000000000000001, ), Negated( Fixed { - query_index: 27, - column_index: 27, + query_index: 30, + column_index: 30, rotation: Rotation( 0, ), @@ -20017,12 +21649,12 @@ PinnedVerificationKey { ), Sum( Constant( - 0x0000000000000000000000000000000000000000000000000000000000000003, + 0x0000000000000000000000000000000000000000000000000000000000000002, ), Negated( Fixed { - query_index: 27, - column_index: 27, + query_index: 30, + column_index: 30, rotation: Rotation( 0, ), @@ -20032,12 +21664,12 @@ PinnedVerificationKey { ), Sum( Constant( - 0x0000000000000000000000000000000000000000000000000000000000000004, + 0x0000000000000000000000000000000000000000000000000000000000000003, ), Negated( Fixed { - query_index: 27, - column_index: 27, + query_index: 30, + column_index: 30, rotation: Rotation( 0, ), @@ -20051,8 +21683,8 @@ PinnedVerificationKey { ), Negated( Fixed { - query_index: 27, - column_index: 27, + query_index: 30, + column_index: 30, rotation: Rotation( 0, ), @@ -20066,8 +21698,8 @@ PinnedVerificationKey { ), Negated( Fixed { - query_index: 27, - column_index: 27, + query_index: 30, + column_index: 30, rotation: Rotation( 0, ), @@ -20081,8 +21713,8 @@ PinnedVerificationKey { ), Negated( Fixed { - query_index: 27, - column_index: 27, + query_index: 30, + column_index: 30, rotation: Rotation( 0, ), @@ -20109,11 +21741,11 @@ PinnedVerificationKey { 0, ), }, - 0x0000000000000000000000000000000000000000000000000000000000000010, + 0x0000000000000000000000000000000000000000000000000000000000000200, ), ), Constant( - 0x0000000000000000000000000000100000000000000000000000000000000000, + 0x0000000000000000000000000000000400000000000000000000000000000000, ), ), Negated( @@ -20121,137 +21753,16 @@ PinnedVerificationKey { 0x00000000000000000000000000000000224698fc094cf91b992d30ed00000001, ), ), - ), - Negated( - Advice { - query_index: 19, - column_index: 8, - rotation: Rotation( - 1, - ), - }, - ), - ), - ), - Product( - Product( - Product( - Product( - Product( - Product( - Product( - Fixed { - query_index: 27, - column_index: 27, - rotation: Rotation( - 0, - ), - }, - Sum( - Constant( - 0x0000000000000000000000000000000000000000000000000000000000000002, - ), - Negated( - Fixed { - query_index: 27, - column_index: 27, - rotation: Rotation( - 0, - ), - }, - ), - ), - ), - Sum( - Constant( - 0x0000000000000000000000000000000000000000000000000000000000000003, - ), - Negated( - Fixed { - query_index: 27, - column_index: 27, - rotation: Rotation( - 0, - ), - }, - ), - ), - ), - Sum( - Constant( - 0x0000000000000000000000000000000000000000000000000000000000000004, - ), - Negated( - Fixed { - query_index: 27, - column_index: 27, - rotation: Rotation( - 0, - ), - }, - ), - ), - ), - Sum( - Constant( - 0x0000000000000000000000000000000000000000000000000000000000000005, - ), - Negated( - Fixed { - query_index: 27, - column_index: 27, - rotation: Rotation( - 0, - ), - }, - ), - ), - ), - Sum( - Constant( - 0x0000000000000000000000000000000000000000000000000000000000000006, - ), - Negated( - Fixed { - query_index: 27, - column_index: 27, - rotation: Rotation( - 0, - ), - }, - ), - ), - ), - Sum( - Constant( - 0x0000000000000000000000000000000000000000000000000000000000000007, - ), - Negated( - Fixed { - query_index: 27, - column_index: 27, - rotation: Rotation( - 0, - ), - }, - ), - ), - ), - Product( - Advice { - query_index: 18, - column_index: 7, - rotation: Rotation( - 1, - ), - }, - Advice { - query_index: 9, - column_index: 9, - rotation: Rotation( - 0, - ), - }, + ), + Negated( + Advice { + query_index: 20, + column_index: 8, + rotation: Rotation( + 1, + ), + }, + ), ), ), Product( @@ -20262,20 +21773,20 @@ PinnedVerificationKey { Product( Product( Fixed { - query_index: 27, - column_index: 27, + query_index: 30, + column_index: 30, rotation: Rotation( 0, ), }, Sum( Constant( - 0x0000000000000000000000000000000000000000000000000000000000000002, + 0x0000000000000000000000000000000000000000000000000000000000000001, ), Negated( Fixed { - query_index: 27, - column_index: 27, + query_index: 30, + column_index: 30, rotation: Rotation( 0, ), @@ -20285,12 +21796,12 @@ PinnedVerificationKey { ), Sum( Constant( - 0x0000000000000000000000000000000000000000000000000000000000000003, + 0x0000000000000000000000000000000000000000000000000000000000000002, ), Negated( Fixed { - query_index: 27, - column_index: 27, + query_index: 30, + column_index: 30, rotation: Rotation( 0, ), @@ -20300,12 +21811,12 @@ PinnedVerificationKey { ), Sum( Constant( - 0x0000000000000000000000000000000000000000000000000000000000000004, + 0x0000000000000000000000000000000000000000000000000000000000000003, ), Negated( Fixed { - query_index: 27, - column_index: 27, + query_index: 30, + column_index: 30, rotation: Rotation( 0, ), @@ -20319,8 +21830,8 @@ PinnedVerificationKey { ), Negated( Fixed { - query_index: 27, - column_index: 27, + query_index: 30, + column_index: 30, rotation: Rotation( 0, ), @@ -20334,8 +21845,8 @@ PinnedVerificationKey { ), Negated( Fixed { - query_index: 27, - column_index: 27, + query_index: 30, + column_index: 30, rotation: Rotation( 0, ), @@ -20349,8 +21860,8 @@ PinnedVerificationKey { ), Negated( Fixed { - query_index: 27, - column_index: 27, + query_index: 30, + column_index: 30, rotation: Rotation( 0, ), @@ -20360,15 +21871,15 @@ PinnedVerificationKey { ), Product( Advice { - query_index: 18, + query_index: 19, column_index: 7, rotation: Rotation( 1, ), }, Advice { - query_index: 10, - column_index: 9, + query_index: 16, + column_index: 6, rotation: Rotation( 1, ), @@ -20383,8 +21894,8 @@ PinnedVerificationKey { Product( Product( Fixed { - query_index: 27, - column_index: 27, + query_index: 30, + column_index: 30, rotation: Rotation( 0, ), @@ -20395,8 +21906,8 @@ PinnedVerificationKey { ), Negated( Fixed { - query_index: 27, - column_index: 27, + query_index: 30, + column_index: 30, rotation: Rotation( 0, ), @@ -20406,12 +21917,12 @@ PinnedVerificationKey { ), Sum( Constant( - 0x0000000000000000000000000000000000000000000000000000000000000003, + 0x0000000000000000000000000000000000000000000000000000000000000002, ), Negated( Fixed { - query_index: 27, - column_index: 27, + query_index: 30, + column_index: 30, rotation: Rotation( 0, ), @@ -20421,12 +21932,12 @@ PinnedVerificationKey { ), Sum( Constant( - 0x0000000000000000000000000000000000000000000000000000000000000004, + 0x0000000000000000000000000000000000000000000000000000000000000003, ), Negated( Fixed { - query_index: 27, - column_index: 27, + query_index: 30, + column_index: 30, rotation: Rotation( 0, ), @@ -20440,8 +21951,8 @@ PinnedVerificationKey { ), Negated( Fixed { - query_index: 27, - column_index: 27, + query_index: 30, + column_index: 30, rotation: Rotation( 0, ), @@ -20455,8 +21966,8 @@ PinnedVerificationKey { ), Negated( Fixed { - query_index: 27, - column_index: 27, + query_index: 30, + column_index: 30, rotation: Rotation( 0, ), @@ -20470,8 +21981,8 @@ PinnedVerificationKey { ), Negated( Fixed { - query_index: 27, - column_index: 27, + query_index: 30, + column_index: 30, rotation: Rotation( 0, ), @@ -20479,59 +21990,21 @@ PinnedVerificationKey { ), ), ), - Sum( - Sum( - Sum( - Sum( - Advice { - query_index: 7, - column_index: 7, - rotation: Rotation( - 0, - ), - }, - Scaled( - Advice { - query_index: 8, - column_index: 8, - rotation: Rotation( - 0, - ), - }, - 0x0000000000000000000000000000000000000000000000000000000000000200, - ), - ), - Scaled( - Advice { - query_index: 22, - column_index: 6, - rotation: Rotation( - 1, - ), - }, - 0x0200000000000000000000000000000000000000000000000000000000000000, - ), + Product( + Advice { + query_index: 19, + column_index: 7, + rotation: Rotation( + 1, ), - Scaled( - Advice { - query_index: 18, - column_index: 7, - rotation: Rotation( - 1, - ), - }, - 0x4000000000000000000000000000000000000000000000000000000000000000, + }, + Advice { + query_index: 9, + column_index: 9, + rotation: Rotation( + 0, ), - ), - Negated( - Advice { - query_index: 6, - column_index: 6, - rotation: Rotation( - 0, - ), - }, - ), + }, ), ), Product( @@ -20542,8 +22015,8 @@ PinnedVerificationKey { Product( Product( Fixed { - query_index: 27, - column_index: 27, + query_index: 30, + column_index: 30, rotation: Rotation( 0, ), @@ -20554,8 +22027,8 @@ PinnedVerificationKey { ), Negated( Fixed { - query_index: 27, - column_index: 27, + query_index: 30, + column_index: 30, rotation: Rotation( 0, ), @@ -20565,12 +22038,12 @@ PinnedVerificationKey { ), Sum( Constant( - 0x0000000000000000000000000000000000000000000000000000000000000003, + 0x0000000000000000000000000000000000000000000000000000000000000002, ), Negated( Fixed { - query_index: 27, - column_index: 27, + query_index: 30, + column_index: 30, rotation: Rotation( 0, ), @@ -20580,12 +22053,12 @@ PinnedVerificationKey { ), Sum( Constant( - 0x0000000000000000000000000000000000000000000000000000000000000004, + 0x0000000000000000000000000000000000000000000000000000000000000003, ), Negated( Fixed { - query_index: 27, - column_index: 27, + query_index: 30, + column_index: 30, rotation: Rotation( 0, ), @@ -20599,8 +22072,8 @@ PinnedVerificationKey { ), Negated( Fixed { - query_index: 27, - column_index: 27, + query_index: 30, + column_index: 30, rotation: Rotation( 0, ), @@ -20614,8 +22087,8 @@ PinnedVerificationKey { ), Negated( Fixed { - query_index: 27, - column_index: 27, + query_index: 30, + column_index: 30, rotation: Rotation( 0, ), @@ -20629,8 +22102,8 @@ PinnedVerificationKey { ), Negated( Fixed { - query_index: 27, - column_index: 27, + query_index: 30, + column_index: 30, rotation: Rotation( 0, ), @@ -20638,47 +22111,21 @@ PinnedVerificationKey { ), ), ), - Sum( - Sum( - Sum( - Sum( - Advice { - query_index: 7, - column_index: 7, - rotation: Rotation( - 0, - ), - }, - Scaled( - Advice { - query_index: 8, - column_index: 8, - rotation: Rotation( - 0, - ), - }, - 0x0000000000000000000000000000000000000000000000000000000000000200, - ), - ), - Constant( - 0x0000000000000000000000000000000400000000000000000000000000000000, - ), + Product( + Advice { + query_index: 19, + column_index: 7, + rotation: Rotation( + 1, ), - Negated( - Constant( - 0x00000000000000000000000000000000224698fc094cf91b992d30ed00000001, - ), + }, + Advice { + query_index: 17, + column_index: 9, + rotation: Rotation( + 1, ), - ), - Negated( - Advice { - query_index: 19, - column_index: 8, - rotation: Rotation( - 1, - ), - }, - ), + }, ), ), Product( @@ -20689,8 +22136,8 @@ PinnedVerificationKey { Product( Product( Fixed { - query_index: 27, - column_index: 27, + query_index: 30, + column_index: 30, rotation: Rotation( 0, ), @@ -20701,8 +22148,8 @@ PinnedVerificationKey { ), Negated( Fixed { - query_index: 27, - column_index: 27, + query_index: 30, + column_index: 30, rotation: Rotation( 0, ), @@ -20712,12 +22159,12 @@ PinnedVerificationKey { ), Sum( Constant( - 0x0000000000000000000000000000000000000000000000000000000000000003, + 0x0000000000000000000000000000000000000000000000000000000000000002, ), Negated( Fixed { - query_index: 27, - column_index: 27, + query_index: 30, + column_index: 30, rotation: Rotation( 0, ), @@ -20727,12 +22174,12 @@ PinnedVerificationKey { ), Sum( Constant( - 0x0000000000000000000000000000000000000000000000000000000000000004, + 0x0000000000000000000000000000000000000000000000000000000000000003, ), Negated( Fixed { - query_index: 27, - column_index: 27, + query_index: 30, + column_index: 30, rotation: Rotation( 0, ), @@ -20742,12 +22189,12 @@ PinnedVerificationKey { ), Sum( Constant( - 0x0000000000000000000000000000000000000000000000000000000000000005, + 0x0000000000000000000000000000000000000000000000000000000000000004, ), Negated( Fixed { - query_index: 27, - column_index: 27, + query_index: 30, + column_index: 30, rotation: Rotation( 0, ), @@ -20761,8 +22208,8 @@ PinnedVerificationKey { ), Negated( Fixed { - query_index: 27, - column_index: 27, + query_index: 30, + column_index: 30, rotation: Rotation( 0, ), @@ -20776,8 +22223,8 @@ PinnedVerificationKey { ), Negated( Fixed { - query_index: 27, - column_index: 27, + query_index: 30, + column_index: 30, rotation: Rotation( 0, ), @@ -20787,19 +22234,26 @@ PinnedVerificationKey { ), Product( Advice { - query_index: 18, - column_index: 7, + query_index: 9, + column_index: 9, rotation: Rotation( - 1, + 0, ), }, - Advice { - query_index: 22, - column_index: 6, - rotation: Rotation( - 1, + Sum( + Constant( + 0x0000000000000000000000000000000000000000000000000000000000000001, ), - }, + Negated( + Advice { + query_index: 9, + column_index: 9, + rotation: Rotation( + 0, + ), + }, + ), + ), ), ), Product( @@ -20810,8 +22264,8 @@ PinnedVerificationKey { Product( Product( Fixed { - query_index: 27, - column_index: 27, + query_index: 30, + column_index: 30, rotation: Rotation( 0, ), @@ -20822,8 +22276,8 @@ PinnedVerificationKey { ), Negated( Fixed { - query_index: 27, - column_index: 27, + query_index: 30, + column_index: 30, rotation: Rotation( 0, ), @@ -20833,12 +22287,12 @@ PinnedVerificationKey { ), Sum( Constant( - 0x0000000000000000000000000000000000000000000000000000000000000003, + 0x0000000000000000000000000000000000000000000000000000000000000002, ), Negated( Fixed { - query_index: 27, - column_index: 27, + query_index: 30, + column_index: 30, rotation: Rotation( 0, ), @@ -20848,12 +22302,12 @@ PinnedVerificationKey { ), Sum( Constant( - 0x0000000000000000000000000000000000000000000000000000000000000004, + 0x0000000000000000000000000000000000000000000000000000000000000003, ), Negated( Fixed { - query_index: 27, - column_index: 27, + query_index: 30, + column_index: 30, rotation: Rotation( 0, ), @@ -20863,12 +22317,12 @@ PinnedVerificationKey { ), Sum( Constant( - 0x0000000000000000000000000000000000000000000000000000000000000005, + 0x0000000000000000000000000000000000000000000000000000000000000004, ), Negated( Fixed { - query_index: 27, - column_index: 27, + query_index: 30, + column_index: 30, rotation: Rotation( 0, ), @@ -20882,45 +22336,71 @@ PinnedVerificationKey { ), Negated( Fixed { - query_index: 27, - column_index: 27, + query_index: 30, + column_index: 30, + rotation: Rotation( + 0, + ), + }, + ), + ), + ), + Sum( + Constant( + 0x0000000000000000000000000000000000000000000000000000000000000007, + ), + Negated( + Fixed { + query_index: 30, + column_index: 30, + rotation: Rotation( + 0, + ), + }, + ), + ), + ), + Sum( + Advice { + query_index: 15, + column_index: 5, + rotation: Rotation( + 1, + ), + }, + Negated( + Sum( + Sum( + Advice { + query_index: 6, + column_index: 6, + rotation: Rotation( + 0, + ), + }, + Scaled( + Advice { + query_index: 7, + column_index: 7, + rotation: Rotation( + 0, + ), + }, + 0x0000000000000000000000000000000000000000000000000000000000000002, + ), + ), + Scaled( + Advice { + query_index: 16, + column_index: 6, rotation: Rotation( - 0, + 1, ), }, + 0x0000000000000000000000000000000000000000000000000000000000000400, ), ), ), - Sum( - Constant( - 0x0000000000000000000000000000000000000000000000000000000000000007, - ), - Negated( - Fixed { - query_index: 27, - column_index: 27, - rotation: Rotation( - 0, - ), - }, - ), - ), - ), - Product( - Advice { - query_index: 18, - column_index: 7, - rotation: Rotation( - 1, - ), - }, - Advice { - query_index: 9, - column_index: 9, - rotation: Rotation( - 0, - ), - }, ), ), Product( @@ -20931,8 +22411,8 @@ PinnedVerificationKey { Product( Product( Fixed { - query_index: 27, - column_index: 27, + query_index: 30, + column_index: 30, rotation: Rotation( 0, ), @@ -20943,8 +22423,8 @@ PinnedVerificationKey { ), Negated( Fixed { - query_index: 27, - column_index: 27, + query_index: 30, + column_index: 30, rotation: Rotation( 0, ), @@ -20954,12 +22434,12 @@ PinnedVerificationKey { ), Sum( Constant( - 0x0000000000000000000000000000000000000000000000000000000000000003, + 0x0000000000000000000000000000000000000000000000000000000000000002, ), Negated( Fixed { - query_index: 27, - column_index: 27, + query_index: 30, + column_index: 30, rotation: Rotation( 0, ), @@ -20969,12 +22449,12 @@ PinnedVerificationKey { ), Sum( Constant( - 0x0000000000000000000000000000000000000000000000000000000000000004, + 0x0000000000000000000000000000000000000000000000000000000000000003, ), Negated( Fixed { - query_index: 27, - column_index: 27, + query_index: 30, + column_index: 30, rotation: Rotation( 0, ), @@ -20984,12 +22464,12 @@ PinnedVerificationKey { ), Sum( Constant( - 0x0000000000000000000000000000000000000000000000000000000000000005, + 0x0000000000000000000000000000000000000000000000000000000000000004, ), Negated( Fixed { - query_index: 27, - column_index: 27, + query_index: 30, + column_index: 30, rotation: Rotation( 0, ), @@ -21003,8 +22483,8 @@ PinnedVerificationKey { ), Negated( Fixed { - query_index: 27, - column_index: 27, + query_index: 30, + column_index: 30, rotation: Rotation( 0, ), @@ -21018,8 +22498,8 @@ PinnedVerificationKey { ), Negated( Fixed { - query_index: 27, - column_index: 27, + query_index: 30, + column_index: 30, rotation: Rotation( 0, ), @@ -21027,21 +22507,47 @@ PinnedVerificationKey { ), ), ), - Product( + Sum( Advice { - query_index: 18, - column_index: 7, + query_index: 5, + column_index: 5, rotation: Rotation( - 1, + 0, ), }, - Advice { - query_index: 10, - column_index: 9, - rotation: Rotation( - 1, + Negated( + Sum( + Sum( + Advice { + query_index: 15, + column_index: 5, + rotation: Rotation( + 1, + ), + }, + Scaled( + Advice { + query_index: 8, + column_index: 8, + rotation: Rotation( + 0, + ), + }, + 0x0400000000000000000000000000000000000000000000000000000000000000, + ), + ), + Scaled( + Advice { + query_index: 9, + column_index: 9, + rotation: Rotation( + 0, + ), + }, + 0x4000000000000000000000000000000000000000000000000000000000000000, + ), ), - }, + ), ), ), Product( @@ -21052,8 +22558,8 @@ PinnedVerificationKey { Product( Product( Fixed { - query_index: 27, - column_index: 27, + query_index: 30, + column_index: 30, rotation: Rotation( 0, ), @@ -21064,8 +22570,8 @@ PinnedVerificationKey { ), Negated( Fixed { - query_index: 27, - column_index: 27, + query_index: 30, + column_index: 30, rotation: Rotation( 0, ), @@ -21079,8 +22585,8 @@ PinnedVerificationKey { ), Negated( Fixed { - query_index: 27, - column_index: 27, + query_index: 30, + column_index: 30, rotation: Rotation( 0, ), @@ -21090,12 +22596,12 @@ PinnedVerificationKey { ), Sum( Constant( - 0x0000000000000000000000000000000000000000000000000000000000000004, + 0x0000000000000000000000000000000000000000000000000000000000000003, ), Negated( Fixed { - query_index: 27, - column_index: 27, + query_index: 30, + column_index: 30, rotation: Rotation( 0, ), @@ -21105,12 +22611,12 @@ PinnedVerificationKey { ), Sum( Constant( - 0x0000000000000000000000000000000000000000000000000000000000000005, + 0x0000000000000000000000000000000000000000000000000000000000000004, ), Negated( Fixed { - query_index: 27, - column_index: 27, + query_index: 30, + column_index: 30, rotation: Rotation( 0, ), @@ -21124,8 +22630,8 @@ PinnedVerificationKey { ), Negated( Fixed { - query_index: 27, - column_index: 27, + query_index: 30, + column_index: 30, rotation: Rotation( 0, ), @@ -21139,8 +22645,8 @@ PinnedVerificationKey { ), Negated( Fixed { - query_index: 27, - column_index: 27, + query_index: 30, + column_index: 30, rotation: Rotation( 0, ), @@ -21148,28 +22654,35 @@ PinnedVerificationKey { ), ), ), - Product( - Advice { - query_index: 9, - column_index: 9, - rotation: Rotation( - 0, - ), - }, + Sum( Sum( - Constant( - 0x0000000000000000000000000000000000000000000000000000000000000001, - ), - Negated( + Sum( Advice { - query_index: 9, - column_index: 9, + query_index: 15, + column_index: 5, rotation: Rotation( - 0, + 1, ), }, + Constant( + 0x0000000000000000000000000000000400000000000000000000000000000000, + ), + ), + Negated( + Constant( + 0x00000000000000000000000000000000224698fc094cf91b992d30ed00000001, + ), ), ), + Negated( + Advice { + query_index: 20, + column_index: 8, + rotation: Rotation( + 1, + ), + }, + ), ), ), Product( @@ -21180,8 +22693,8 @@ PinnedVerificationKey { Product( Product( Fixed { - query_index: 27, - column_index: 27, + query_index: 30, + column_index: 30, rotation: Rotation( 0, ), @@ -21192,8 +22705,8 @@ PinnedVerificationKey { ), Negated( Fixed { - query_index: 27, - column_index: 27, + query_index: 30, + column_index: 30, rotation: Rotation( 0, ), @@ -21207,8 +22720,8 @@ PinnedVerificationKey { ), Negated( Fixed { - query_index: 27, - column_index: 27, + query_index: 30, + column_index: 30, rotation: Rotation( 0, ), @@ -21218,12 +22731,12 @@ PinnedVerificationKey { ), Sum( Constant( - 0x0000000000000000000000000000000000000000000000000000000000000004, + 0x0000000000000000000000000000000000000000000000000000000000000003, ), Negated( Fixed { - query_index: 27, - column_index: 27, + query_index: 30, + column_index: 30, rotation: Rotation( 0, ), @@ -21233,12 +22746,12 @@ PinnedVerificationKey { ), Sum( Constant( - 0x0000000000000000000000000000000000000000000000000000000000000005, + 0x0000000000000000000000000000000000000000000000000000000000000004, ), Negated( Fixed { - query_index: 27, - column_index: 27, + query_index: 30, + column_index: 30, rotation: Rotation( 0, ), @@ -21252,8 +22765,8 @@ PinnedVerificationKey { ), Negated( Fixed { - query_index: 27, - column_index: 27, + query_index: 30, + column_index: 30, rotation: Rotation( 0, ), @@ -21267,8 +22780,8 @@ PinnedVerificationKey { ), Negated( Fixed { - query_index: 27, - column_index: 27, + query_index: 30, + column_index: 30, rotation: Rotation( 0, ), @@ -21276,47 +22789,21 @@ PinnedVerificationKey { ), ), ), - Sum( + Product( Advice { - query_index: 15, - column_index: 5, + query_index: 9, + column_index: 9, rotation: Rotation( - 1, + 0, ), }, - Negated( - Sum( - Sum( - Advice { - query_index: 6, - column_index: 6, - rotation: Rotation( - 0, - ), - }, - Scaled( - Advice { - query_index: 7, - column_index: 7, - rotation: Rotation( - 0, - ), - }, - 0x0000000000000000000000000000000000000000000000000000000000000002, - ), - ), - Scaled( - Advice { - query_index: 22, - column_index: 6, - rotation: Rotation( - 1, - ), - }, - 0x0000000000000000000000000000000000000000000000000000000000000400, - ), + Advice { + query_index: 8, + column_index: 8, + rotation: Rotation( + 0, ), - ), + }, ), ), Product( @@ -21327,8 +22814,8 @@ PinnedVerificationKey { Product( Product( Fixed { - query_index: 27, - column_index: 27, + query_index: 30, + column_index: 30, rotation: Rotation( 0, ), @@ -21339,8 +22826,8 @@ PinnedVerificationKey { ), Negated( Fixed { - query_index: 27, - column_index: 27, + query_index: 30, + column_index: 30, rotation: Rotation( 0, ), @@ -21354,8 +22841,8 @@ PinnedVerificationKey { ), Negated( Fixed { - query_index: 27, - column_index: 27, + query_index: 30, + column_index: 30, rotation: Rotation( 0, ), @@ -21365,12 +22852,12 @@ PinnedVerificationKey { ), Sum( Constant( - 0x0000000000000000000000000000000000000000000000000000000000000004, + 0x0000000000000000000000000000000000000000000000000000000000000003, ), Negated( Fixed { - query_index: 27, - column_index: 27, + query_index: 30, + column_index: 30, rotation: Rotation( 0, ), @@ -21380,12 +22867,12 @@ PinnedVerificationKey { ), Sum( Constant( - 0x0000000000000000000000000000000000000000000000000000000000000005, + 0x0000000000000000000000000000000000000000000000000000000000000004, ), Negated( Fixed { - query_index: 27, - column_index: 27, + query_index: 30, + column_index: 30, rotation: Rotation( 0, ), @@ -21395,75 +22882,49 @@ PinnedVerificationKey { ), Sum( Constant( - 0x0000000000000000000000000000000000000000000000000000000000000006, - ), - Negated( - Fixed { - query_index: 27, - column_index: 27, - rotation: Rotation( - 0, - ), - }, - ), - ), - ), - Sum( - Constant( - 0x0000000000000000000000000000000000000000000000000000000000000007, - ), - Negated( - Fixed { - query_index: 27, - column_index: 27, - rotation: Rotation( - 0, - ), - }, - ), - ), - ), - Sum( - Advice { - query_index: 5, - column_index: 5, - rotation: Rotation( - 0, - ), - }, - Negated( - Sum( - Sum( - Advice { - query_index: 15, - column_index: 5, - rotation: Rotation( - 1, - ), - }, - Scaled( - Advice { - query_index: 8, - column_index: 8, - rotation: Rotation( - 0, - ), - }, - 0x0400000000000000000000000000000000000000000000000000000000000000, - ), + 0x0000000000000000000000000000000000000000000000000000000000000006, ), - Scaled( - Advice { - query_index: 9, - column_index: 9, + Negated( + Fixed { + query_index: 30, + column_index: 30, rotation: Rotation( 0, ), }, - 0x4000000000000000000000000000000000000000000000000000000000000000, ), ), ), + Sum( + Constant( + 0x0000000000000000000000000000000000000000000000000000000000000007, + ), + Negated( + Fixed { + query_index: 30, + column_index: 30, + rotation: Rotation( + 0, + ), + }, + ), + ), + ), + Product( + Advice { + query_index: 9, + column_index: 9, + rotation: Rotation( + 0, + ), + }, + Advice { + query_index: 19, + column_index: 7, + rotation: Rotation( + 1, + ), + }, ), ), Product( @@ -21474,8 +22935,8 @@ PinnedVerificationKey { Product( Product( Fixed { - query_index: 27, - column_index: 27, + query_index: 30, + column_index: 30, rotation: Rotation( 0, ), @@ -21486,8 +22947,8 @@ PinnedVerificationKey { ), Negated( Fixed { - query_index: 27, - column_index: 27, + query_index: 30, + column_index: 30, rotation: Rotation( 0, ), @@ -21501,8 +22962,8 @@ PinnedVerificationKey { ), Negated( Fixed { - query_index: 27, - column_index: 27, + query_index: 30, + column_index: 30, rotation: Rotation( 0, ), @@ -21512,12 +22973,12 @@ PinnedVerificationKey { ), Sum( Constant( - 0x0000000000000000000000000000000000000000000000000000000000000004, + 0x0000000000000000000000000000000000000000000000000000000000000003, ), Negated( Fixed { - query_index: 27, - column_index: 27, + query_index: 30, + column_index: 30, rotation: Rotation( 0, ), @@ -21527,12 +22988,12 @@ PinnedVerificationKey { ), Sum( Constant( - 0x0000000000000000000000000000000000000000000000000000000000000005, + 0x0000000000000000000000000000000000000000000000000000000000000004, ), Negated( Fixed { - query_index: 27, - column_index: 27, + query_index: 30, + column_index: 30, rotation: Rotation( 0, ), @@ -21546,8 +23007,8 @@ PinnedVerificationKey { ), Negated( Fixed { - query_index: 27, - column_index: 27, + query_index: 30, + column_index: 30, rotation: Rotation( 0, ), @@ -21561,8 +23022,8 @@ PinnedVerificationKey { ), Negated( Fixed { - query_index: 27, - column_index: 27, + query_index: 30, + column_index: 30, rotation: Rotation( 0, ), @@ -21570,35 +23031,21 @@ PinnedVerificationKey { ), ), ), - Sum( - Sum( - Sum( - Advice { - query_index: 15, - column_index: 5, - rotation: Rotation( - 1, - ), - }, - Constant( - 0x0000000000000000000000000000000400000000000000000000000000000000, - ), + Product( + Advice { + query_index: 9, + column_index: 9, + rotation: Rotation( + 0, ), - Negated( - Constant( - 0x00000000000000000000000000000000224698fc094cf91b992d30ed00000001, - ), + }, + Advice { + query_index: 17, + column_index: 9, + rotation: Rotation( + 1, ), - ), - Negated( - Advice { - query_index: 19, - column_index: 8, - rotation: Rotation( - 1, - ), - }, - ), + }, ), ), Product( @@ -21609,8 +23056,8 @@ PinnedVerificationKey { Product( Product( Fixed { - query_index: 27, - column_index: 27, + query_index: 30, + column_index: 30, rotation: Rotation( 0, ), @@ -21621,8 +23068,8 @@ PinnedVerificationKey { ), Negated( Fixed { - query_index: 27, - column_index: 27, + query_index: 30, + column_index: 30, rotation: Rotation( 0, ), @@ -21636,8 +23083,8 @@ PinnedVerificationKey { ), Negated( Fixed { - query_index: 27, - column_index: 27, + query_index: 30, + column_index: 30, rotation: Rotation( 0, ), @@ -21647,12 +23094,12 @@ PinnedVerificationKey { ), Sum( Constant( - 0x0000000000000000000000000000000000000000000000000000000000000004, + 0x0000000000000000000000000000000000000000000000000000000000000003, ), Negated( Fixed { - query_index: 27, - column_index: 27, + query_index: 30, + column_index: 30, rotation: Rotation( 0, ), @@ -21662,12 +23109,12 @@ PinnedVerificationKey { ), Sum( Constant( - 0x0000000000000000000000000000000000000000000000000000000000000005, + 0x0000000000000000000000000000000000000000000000000000000000000004, ), Negated( Fixed { - query_index: 27, - column_index: 27, + query_index: 30, + column_index: 30, rotation: Rotation( 0, ), @@ -21677,12 +23124,12 @@ PinnedVerificationKey { ), Sum( Constant( - 0x0000000000000000000000000000000000000000000000000000000000000006, + 0x0000000000000000000000000000000000000000000000000000000000000005, ), Negated( Fixed { - query_index: 27, - column_index: 27, + query_index: 30, + column_index: 30, rotation: Rotation( 0, ), @@ -21696,8 +23143,8 @@ PinnedVerificationKey { ), Negated( Fixed { - query_index: 27, - column_index: 27, + query_index: 30, + column_index: 30, rotation: Rotation( 0, ), @@ -21706,13 +23153,6 @@ PinnedVerificationKey { ), ), Product( - Advice { - query_index: 9, - column_index: 9, - rotation: Rotation( - 0, - ), - }, Advice { query_index: 8, column_index: 8, @@ -21720,6 +23160,20 @@ PinnedVerificationKey { 0, ), }, + Sum( + Constant( + 0x0000000000000000000000000000000000000000000000000000000000000001, + ), + Negated( + Advice { + query_index: 8, + column_index: 8, + rotation: Rotation( + 0, + ), + }, + ), + ), ), ), Product( @@ -21730,8 +23184,8 @@ PinnedVerificationKey { Product( Product( Fixed { - query_index: 27, - column_index: 27, + query_index: 30, + column_index: 30, rotation: Rotation( 0, ), @@ -21742,8 +23196,8 @@ PinnedVerificationKey { ), Negated( Fixed { - query_index: 27, - column_index: 27, + query_index: 30, + column_index: 30, rotation: Rotation( 0, ), @@ -21757,8 +23211,8 @@ PinnedVerificationKey { ), Negated( Fixed { - query_index: 27, - column_index: 27, + query_index: 30, + column_index: 30, rotation: Rotation( 0, ), @@ -21768,12 +23222,12 @@ PinnedVerificationKey { ), Sum( Constant( - 0x0000000000000000000000000000000000000000000000000000000000000004, + 0x0000000000000000000000000000000000000000000000000000000000000003, ), Negated( Fixed { - query_index: 27, - column_index: 27, + query_index: 30, + column_index: 30, rotation: Rotation( 0, ), @@ -21783,12 +23237,12 @@ PinnedVerificationKey { ), Sum( Constant( - 0x0000000000000000000000000000000000000000000000000000000000000005, + 0x0000000000000000000000000000000000000000000000000000000000000004, ), Negated( Fixed { - query_index: 27, - column_index: 27, + query_index: 30, + column_index: 30, rotation: Rotation( 0, ), @@ -21798,12 +23252,12 @@ PinnedVerificationKey { ), Sum( Constant( - 0x0000000000000000000000000000000000000000000000000000000000000006, + 0x0000000000000000000000000000000000000000000000000000000000000005, ), Negated( Fixed { - query_index: 27, - column_index: 27, + query_index: 30, + column_index: 30, rotation: Rotation( 0, ), @@ -21817,8 +23271,8 @@ PinnedVerificationKey { ), Negated( Fixed { - query_index: 27, - column_index: 27, + query_index: 30, + column_index: 30, rotation: Rotation( 0, ), @@ -21828,19 +23282,26 @@ PinnedVerificationKey { ), Product( Advice { - query_index: 9, - column_index: 9, - rotation: Rotation( - 0, - ), - }, - Advice { - query_index: 18, + query_index: 19, column_index: 7, rotation: Rotation( 1, ), }, + Sum( + Constant( + 0x0000000000000000000000000000000000000000000000000000000000000001, + ), + Negated( + Advice { + query_index: 19, + column_index: 7, + rotation: Rotation( + 1, + ), + }, + ), + ), ), ), Product( @@ -21851,8 +23312,8 @@ PinnedVerificationKey { Product( Product( Fixed { - query_index: 27, - column_index: 27, + query_index: 30, + column_index: 30, rotation: Rotation( 0, ), @@ -21863,8 +23324,8 @@ PinnedVerificationKey { ), Negated( Fixed { - query_index: 27, - column_index: 27, + query_index: 30, + column_index: 30, rotation: Rotation( 0, ), @@ -21878,8 +23339,8 @@ PinnedVerificationKey { ), Negated( Fixed { - query_index: 27, - column_index: 27, + query_index: 30, + column_index: 30, rotation: Rotation( 0, ), @@ -21889,12 +23350,12 @@ PinnedVerificationKey { ), Sum( Constant( - 0x0000000000000000000000000000000000000000000000000000000000000004, + 0x0000000000000000000000000000000000000000000000000000000000000003, ), Negated( Fixed { - query_index: 27, - column_index: 27, + query_index: 30, + column_index: 30, rotation: Rotation( 0, ), @@ -21904,12 +23365,12 @@ PinnedVerificationKey { ), Sum( Constant( - 0x0000000000000000000000000000000000000000000000000000000000000005, + 0x0000000000000000000000000000000000000000000000000000000000000004, ), Negated( Fixed { - query_index: 27, - column_index: 27, + query_index: 30, + column_index: 30, rotation: Rotation( 0, ), @@ -21919,12 +23380,12 @@ PinnedVerificationKey { ), Sum( Constant( - 0x0000000000000000000000000000000000000000000000000000000000000006, + 0x0000000000000000000000000000000000000000000000000000000000000005, ), Negated( Fixed { - query_index: 27, - column_index: 27, + query_index: 30, + column_index: 30, rotation: Rotation( 0, ), @@ -21938,8 +23399,8 @@ PinnedVerificationKey { ), Negated( Fixed { - query_index: 27, - column_index: 27, + query_index: 30, + column_index: 30, rotation: Rotation( 0, ), @@ -21947,21 +23408,59 @@ PinnedVerificationKey { ), ), ), - Product( + Sum( Advice { - query_index: 9, - column_index: 9, + query_index: 6, + column_index: 6, rotation: Rotation( 0, ), }, - Advice { - query_index: 10, - column_index: 9, - rotation: Rotation( - 1, + Negated( + Sum( + Sum( + Sum( + Advice { + query_index: 7, + column_index: 7, + rotation: Rotation( + 0, + ), + }, + Scaled( + Advice { + query_index: 8, + column_index: 8, + rotation: Rotation( + 0, + ), + }, + 0x0000000000000000000000000000000000000000000000000000000000000010, + ), + ), + Scaled( + Advice { + query_index: 19, + column_index: 7, + rotation: Rotation( + 1, + ), + }, + 0x0000000000000000000000000000000000000000000000000000000000000020, + ), + ), + Scaled( + Advice { + query_index: 20, + column_index: 8, + rotation: Rotation( + 1, + ), + }, + 0x0000000000000000000000000000000000000000000000000000000000000040, + ), ), - }, + ), ), ), Product( @@ -21972,8 +23471,8 @@ PinnedVerificationKey { Product( Product( Fixed { - query_index: 27, - column_index: 27, + query_index: 30, + column_index: 30, rotation: Rotation( 0, ), @@ -21984,8 +23483,8 @@ PinnedVerificationKey { ), Negated( Fixed { - query_index: 27, - column_index: 27, + query_index: 30, + column_index: 30, rotation: Rotation( 0, ), @@ -21999,8 +23498,8 @@ PinnedVerificationKey { ), Negated( Fixed { - query_index: 27, - column_index: 27, + query_index: 30, + column_index: 30, rotation: Rotation( 0, ), @@ -22014,8 +23513,8 @@ PinnedVerificationKey { ), Negated( Fixed { - query_index: 27, - column_index: 27, + query_index: 30, + column_index: 30, rotation: Rotation( 0, ), @@ -22025,12 +23524,12 @@ PinnedVerificationKey { ), Sum( Constant( - 0x0000000000000000000000000000000000000000000000000000000000000005, + 0x0000000000000000000000000000000000000000000000000000000000000004, ), Negated( Fixed { - query_index: 27, - column_index: 27, + query_index: 30, + column_index: 30, rotation: Rotation( 0, ), @@ -22040,12 +23539,12 @@ PinnedVerificationKey { ), Sum( Constant( - 0x0000000000000000000000000000000000000000000000000000000000000006, + 0x0000000000000000000000000000000000000000000000000000000000000005, ), Negated( Fixed { - query_index: 27, - column_index: 27, + query_index: 30, + column_index: 30, rotation: Rotation( 0, ), @@ -22055,12 +23554,12 @@ PinnedVerificationKey { ), Sum( Constant( - 0x0000000000000000000000000000000000000000000000000000000000000007, + 0x0000000000000000000000000000000000000000000000000000000000000006, ), Negated( Fixed { - query_index: 27, - column_index: 27, + query_index: 30, + column_index: 30, rotation: Rotation( 0, ), @@ -22070,8 +23569,8 @@ PinnedVerificationKey { ), Product( Advice { - query_index: 8, - column_index: 8, + query_index: 7, + column_index: 7, rotation: Rotation( 0, ), @@ -22082,8 +23581,8 @@ PinnedVerificationKey { ), Negated( Advice { - query_index: 8, - column_index: 8, + query_index: 7, + column_index: 7, rotation: Rotation( 0, ), @@ -22100,8 +23599,8 @@ PinnedVerificationKey { Product( Product( Fixed { - query_index: 27, - column_index: 27, + query_index: 30, + column_index: 30, rotation: Rotation( 0, ), @@ -22112,8 +23611,8 @@ PinnedVerificationKey { ), Negated( Fixed { - query_index: 27, - column_index: 27, + query_index: 30, + column_index: 30, rotation: Rotation( 0, ), @@ -22127,8 +23626,8 @@ PinnedVerificationKey { ), Negated( Fixed { - query_index: 27, - column_index: 27, + query_index: 30, + column_index: 30, rotation: Rotation( 0, ), @@ -22142,8 +23641,8 @@ PinnedVerificationKey { ), Negated( Fixed { - query_index: 27, - column_index: 27, + query_index: 30, + column_index: 30, rotation: Rotation( 0, ), @@ -22153,12 +23652,12 @@ PinnedVerificationKey { ), Sum( Constant( - 0x0000000000000000000000000000000000000000000000000000000000000005, + 0x0000000000000000000000000000000000000000000000000000000000000004, ), Negated( Fixed { - query_index: 27, - column_index: 27, + query_index: 30, + column_index: 30, rotation: Rotation( 0, ), @@ -22168,12 +23667,12 @@ PinnedVerificationKey { ), Sum( Constant( - 0x0000000000000000000000000000000000000000000000000000000000000006, + 0x0000000000000000000000000000000000000000000000000000000000000005, ), Negated( Fixed { - query_index: 27, - column_index: 27, + query_index: 30, + column_index: 30, rotation: Rotation( 0, ), @@ -22183,12 +23682,12 @@ PinnedVerificationKey { ), Sum( Constant( - 0x0000000000000000000000000000000000000000000000000000000000000007, + 0x0000000000000000000000000000000000000000000000000000000000000006, ), Negated( Fixed { - query_index: 27, - column_index: 27, + query_index: 30, + column_index: 30, rotation: Rotation( 0, ), @@ -22198,10 +23697,10 @@ PinnedVerificationKey { ), Product( Advice { - query_index: 18, - column_index: 7, + query_index: 8, + column_index: 8, rotation: Rotation( - 1, + 0, ), }, Sum( @@ -22210,10 +23709,10 @@ PinnedVerificationKey { ), Negated( Advice { - query_index: 18, - column_index: 7, + query_index: 8, + column_index: 8, rotation: Rotation( - 1, + 0, ), }, ), @@ -22228,8 +23727,8 @@ PinnedVerificationKey { Product( Product( Fixed { - query_index: 27, - column_index: 27, + query_index: 30, + column_index: 30, rotation: Rotation( 0, ), @@ -22240,8 +23739,8 @@ PinnedVerificationKey { ), Negated( Fixed { - query_index: 27, - column_index: 27, + query_index: 30, + column_index: 30, rotation: Rotation( 0, ), @@ -22255,8 +23754,8 @@ PinnedVerificationKey { ), Negated( Fixed { - query_index: 27, - column_index: 27, + query_index: 30, + column_index: 30, rotation: Rotation( 0, ), @@ -22270,8 +23769,8 @@ PinnedVerificationKey { ), Negated( Fixed { - query_index: 27, - column_index: 27, + query_index: 30, + column_index: 30, rotation: Rotation( 0, ), @@ -22281,12 +23780,12 @@ PinnedVerificationKey { ), Sum( Constant( - 0x0000000000000000000000000000000000000000000000000000000000000005, + 0x0000000000000000000000000000000000000000000000000000000000000004, ), Negated( Fixed { - query_index: 27, - column_index: 27, + query_index: 30, + column_index: 30, rotation: Rotation( 0, ), @@ -22296,12 +23795,12 @@ PinnedVerificationKey { ), Sum( Constant( - 0x0000000000000000000000000000000000000000000000000000000000000006, + 0x0000000000000000000000000000000000000000000000000000000000000005, ), Negated( Fixed { - query_index: 27, - column_index: 27, + query_index: 30, + column_index: 30, rotation: Rotation( 0, ), @@ -22311,12 +23810,12 @@ PinnedVerificationKey { ), Sum( Constant( - 0x0000000000000000000000000000000000000000000000000000000000000007, + 0x0000000000000000000000000000000000000000000000000000000000000006, ), Negated( Fixed { - query_index: 27, - column_index: 27, + query_index: 30, + column_index: 30, rotation: Rotation( 0, ), @@ -22351,29 +23850,29 @@ PinnedVerificationKey { 0, ), }, - 0x0000000000000000000000000000000000000000000000000000000000000010, + 0x0000000000000000000000000000000000000000000000000000000000000002, ), ), Scaled( Advice { - query_index: 18, + query_index: 19, column_index: 7, rotation: Rotation( 1, ), }, - 0x0000000000000000000000000000000000000000000000000000000000000020, + 0x0000000000000000000000000000000000000000000000000000000000000004, ), ), Scaled( Advice { - query_index: 19, + query_index: 20, column_index: 8, rotation: Rotation( 1, ), }, - 0x0000000000000000000000000000000000000000000000000000000000000040, + 0x0000000000000000000000000000000000000000000000000000000000000400, ), ), ), @@ -22387,20 +23886,20 @@ PinnedVerificationKey { Product( Product( Fixed { - query_index: 27, - column_index: 27, + query_index: 31, + column_index: 31, rotation: Rotation( 0, ), }, Sum( Constant( - 0x0000000000000000000000000000000000000000000000000000000000000001, + 0x0000000000000000000000000000000000000000000000000000000000000002, ), Negated( Fixed { - query_index: 27, - column_index: 27, + query_index: 31, + column_index: 31, rotation: Rotation( 0, ), @@ -22410,12 +23909,12 @@ PinnedVerificationKey { ), Sum( Constant( - 0x0000000000000000000000000000000000000000000000000000000000000002, + 0x0000000000000000000000000000000000000000000000000000000000000003, ), Negated( Fixed { - query_index: 27, - column_index: 27, + query_index: 31, + column_index: 31, rotation: Rotation( 0, ), @@ -22425,12 +23924,12 @@ PinnedVerificationKey { ), Sum( Constant( - 0x0000000000000000000000000000000000000000000000000000000000000003, + 0x0000000000000000000000000000000000000000000000000000000000000004, ), Negated( Fixed { - query_index: 27, - column_index: 27, + query_index: 31, + column_index: 31, rotation: Rotation( 0, ), @@ -22440,12 +23939,12 @@ PinnedVerificationKey { ), Sum( Constant( - 0x0000000000000000000000000000000000000000000000000000000000000004, + 0x0000000000000000000000000000000000000000000000000000000000000005, ), Negated( Fixed { - query_index: 27, - column_index: 27, + query_index: 31, + column_index: 31, rotation: Rotation( 0, ), @@ -22459,8 +23958,8 @@ PinnedVerificationKey { ), Negated( Fixed { - query_index: 27, - column_index: 27, + query_index: 31, + column_index: 31, rotation: Rotation( 0, ), @@ -22474,8 +23973,8 @@ PinnedVerificationKey { ), Negated( Fixed { - query_index: 27, - column_index: 27, + query_index: 31, + column_index: 31, rotation: Rotation( 0, ), @@ -22483,19 +23982,16 @@ PinnedVerificationKey { ), ), ), - Product( + Sum( Advice { - query_index: 7, - column_index: 7, + query_index: 6, + column_index: 6, rotation: Rotation( 0, ), }, - Sum( - Constant( - 0x0000000000000000000000000000000000000000000000000000000000000001, - ), - Negated( + Negated( + Sum( Advice { query_index: 7, column_index: 7, @@ -22503,6 +23999,16 @@ PinnedVerificationKey { 0, ), }, + Scaled( + Advice { + query_index: 8, + column_index: 8, + rotation: Rotation( + 0, + ), + }, + 0x0000000000000000000000000000000000000000000000000000000000000040, + ), ), ), ), @@ -22515,8 +24021,8 @@ PinnedVerificationKey { Product( Product( Fixed { - query_index: 27, - column_index: 27, + query_index: 31, + column_index: 31, rotation: Rotation( 0, ), @@ -22527,8 +24033,8 @@ PinnedVerificationKey { ), Negated( Fixed { - query_index: 27, - column_index: 27, + query_index: 31, + column_index: 31, rotation: Rotation( 0, ), @@ -22538,12 +24044,12 @@ PinnedVerificationKey { ), Sum( Constant( - 0x0000000000000000000000000000000000000000000000000000000000000002, + 0x0000000000000000000000000000000000000000000000000000000000000003, ), Negated( Fixed { - query_index: 27, - column_index: 27, + query_index: 31, + column_index: 31, rotation: Rotation( 0, ), @@ -22553,12 +24059,12 @@ PinnedVerificationKey { ), Sum( Constant( - 0x0000000000000000000000000000000000000000000000000000000000000003, + 0x0000000000000000000000000000000000000000000000000000000000000004, ), Negated( Fixed { - query_index: 27, - column_index: 27, + query_index: 31, + column_index: 31, rotation: Rotation( 0, ), @@ -22568,12 +24074,12 @@ PinnedVerificationKey { ), Sum( Constant( - 0x0000000000000000000000000000000000000000000000000000000000000004, + 0x0000000000000000000000000000000000000000000000000000000000000005, ), Negated( Fixed { - query_index: 27, - column_index: 27, + query_index: 31, + column_index: 31, rotation: Rotation( 0, ), @@ -22587,8 +24093,8 @@ PinnedVerificationKey { ), Negated( Fixed { - query_index: 27, - column_index: 27, + query_index: 31, + column_index: 31, rotation: Rotation( 0, ), @@ -22602,8 +24108,8 @@ PinnedVerificationKey { ), Negated( Fixed { - query_index: 27, - column_index: 27, + query_index: 31, + column_index: 31, rotation: Rotation( 0, ), @@ -22613,8 +24119,8 @@ PinnedVerificationKey { ), Product( Advice { - query_index: 8, - column_index: 8, + query_index: 7, + column_index: 7, rotation: Rotation( 0, ), @@ -22625,8 +24131,8 @@ PinnedVerificationKey { ), Negated( Advice { - query_index: 8, - column_index: 8, + query_index: 7, + column_index: 7, rotation: Rotation( 0, ), @@ -22643,8 +24149,8 @@ PinnedVerificationKey { Product( Product( Fixed { - query_index: 27, - column_index: 27, + query_index: 31, + column_index: 31, rotation: Rotation( 0, ), @@ -22655,8 +24161,8 @@ PinnedVerificationKey { ), Negated( Fixed { - query_index: 27, - column_index: 27, + query_index: 31, + column_index: 31, rotation: Rotation( 0, ), @@ -22666,12 +24172,12 @@ PinnedVerificationKey { ), Sum( Constant( - 0x0000000000000000000000000000000000000000000000000000000000000002, + 0x0000000000000000000000000000000000000000000000000000000000000003, ), Negated( Fixed { - query_index: 27, - column_index: 27, + query_index: 31, + column_index: 31, rotation: Rotation( 0, ), @@ -22681,12 +24187,12 @@ PinnedVerificationKey { ), Sum( Constant( - 0x0000000000000000000000000000000000000000000000000000000000000003, + 0x0000000000000000000000000000000000000000000000000000000000000004, ), Negated( Fixed { - query_index: 27, - column_index: 27, + query_index: 31, + column_index: 31, rotation: Rotation( 0, ), @@ -22696,12 +24202,12 @@ PinnedVerificationKey { ), Sum( Constant( - 0x0000000000000000000000000000000000000000000000000000000000000004, + 0x0000000000000000000000000000000000000000000000000000000000000005, ), Negated( Fixed { - query_index: 27, - column_index: 27, + query_index: 31, + column_index: 31, rotation: Rotation( 0, ), @@ -22715,8 +24221,8 @@ PinnedVerificationKey { ), Negated( Fixed { - query_index: 27, - column_index: 27, + query_index: 31, + column_index: 31, rotation: Rotation( 0, ), @@ -22730,8 +24236,8 @@ PinnedVerificationKey { ), Negated( Fixed { - query_index: 27, - column_index: 27, + query_index: 31, + column_index: 31, rotation: Rotation( 0, ), @@ -22750,48 +24256,164 @@ PinnedVerificationKey { Negated( Sum( Sum( - Sum( + Advice { + query_index: 7, + column_index: 7, + rotation: Rotation( + 0, + ), + }, + Scaled( Advice { - query_index: 7, - column_index: 7, + query_index: 16, + column_index: 6, rotation: Rotation( - 0, + 1, ), }, - Scaled( - Advice { - query_index: 8, - column_index: 8, + 0x0000000000000000000000000000000000000000000000000000000000000002, + ), + ), + Scaled( + Advice { + query_index: 19, + column_index: 7, + rotation: Rotation( + 1, + ), + }, + 0x0000000000000000000000000000000000000000000000000000000000000400, + ), + ), + ), + ), + ), + Product( + Product( + Product( + Product( + Product( + Product( + Product( + Fixed { + query_index: 31, + column_index: 31, rotation: Rotation( 0, ), }, - 0x0000000000000000000000000000000000000000000000000000000000000002, + Sum( + Constant( + 0x0000000000000000000000000000000000000000000000000000000000000001, + ), + Negated( + Fixed { + query_index: 31, + column_index: 31, + rotation: Rotation( + 0, + ), + }, + ), + ), + ), + Sum( + Constant( + 0x0000000000000000000000000000000000000000000000000000000000000002, + ), + Negated( + Fixed { + query_index: 31, + column_index: 31, + rotation: Rotation( + 0, + ), + }, + ), ), ), - Scaled( - Advice { - query_index: 18, - column_index: 7, + Sum( + Constant( + 0x0000000000000000000000000000000000000000000000000000000000000004, + ), + Negated( + Fixed { + query_index: 31, + column_index: 31, + rotation: Rotation( + 0, + ), + }, + ), + ), + ), + Sum( + Constant( + 0x0000000000000000000000000000000000000000000000000000000000000005, + ), + Negated( + Fixed { + query_index: 31, + column_index: 31, rotation: Rotation( - 1, + 0, ), }, - 0x0000000000000000000000000000000000000000000000000000000000000004, ), ), - Scaled( - Advice { - query_index: 19, - column_index: 8, + ), + Sum( + Constant( + 0x0000000000000000000000000000000000000000000000000000000000000006, + ), + Negated( + Fixed { + query_index: 31, + column_index: 31, rotation: Rotation( - 1, + 0, ), }, - 0x0000000000000000000000000000000000000000000000000000000000000400, ), ), ), + Sum( + Constant( + 0x0000000000000000000000000000000000000000000000000000000000000007, + ), + Negated( + Fixed { + query_index: 31, + column_index: 31, + rotation: Rotation( + 0, + ), + }, + ), + ), + ), + Product( + Advice { + query_index: 8, + column_index: 8, + rotation: Rotation( + 0, + ), + }, + Sum( + Constant( + 0x0000000000000000000000000000000000000000000000000000000000000001, + ), + Negated( + Advice { + query_index: 8, + column_index: 8, + rotation: Rotation( + 0, + ), + }, + ), + ), ), ), Product( @@ -22802,8 +24424,8 @@ PinnedVerificationKey { Product( Product( Fixed { - query_index: 27, - column_index: 27, + query_index: 31, + column_index: 31, rotation: Rotation( 0, ), @@ -22814,8 +24436,8 @@ PinnedVerificationKey { ), Negated( Fixed { - query_index: 27, - column_index: 27, + query_index: 31, + column_index: 31, rotation: Rotation( 0, ), @@ -22829,8 +24451,8 @@ PinnedVerificationKey { ), Negated( Fixed { - query_index: 27, - column_index: 27, + query_index: 31, + column_index: 31, rotation: Rotation( 0, ), @@ -22840,12 +24462,12 @@ PinnedVerificationKey { ), Sum( Constant( - 0x0000000000000000000000000000000000000000000000000000000000000003, + 0x0000000000000000000000000000000000000000000000000000000000000004, ), Negated( Fixed { - query_index: 27, - column_index: 27, + query_index: 31, + column_index: 31, rotation: Rotation( 0, ), @@ -22855,12 +24477,12 @@ PinnedVerificationKey { ), Sum( Constant( - 0x0000000000000000000000000000000000000000000000000000000000000004, + 0x0000000000000000000000000000000000000000000000000000000000000005, ), Negated( Fixed { - query_index: 27, - column_index: 27, + query_index: 31, + column_index: 31, rotation: Rotation( 0, ), @@ -22870,12 +24492,12 @@ PinnedVerificationKey { ), Sum( Constant( - 0x0000000000000000000000000000000000000000000000000000000000000005, + 0x0000000000000000000000000000000000000000000000000000000000000006, ), Negated( Fixed { - query_index: 27, - column_index: 27, + query_index: 31, + column_index: 31, rotation: Rotation( 0, ), @@ -22889,8 +24511,8 @@ PinnedVerificationKey { ), Negated( Fixed { - query_index: 27, - column_index: 27, + query_index: 31, + column_index: 31, rotation: Rotation( 0, ), @@ -22923,7 +24545,7 @@ PinnedVerificationKey { 0, ), }, - 0x0000000000000000000000000000000000000000000000000000000000000040, + 0x0000000000000000000000000000000000000000000000000000000000000020, ), ), ), @@ -22937,8 +24559,8 @@ PinnedVerificationKey { Product( Product( Fixed { - query_index: 27, - column_index: 27, + query_index: 31, + column_index: 31, rotation: Rotation( 0, ), @@ -22949,8 +24571,8 @@ PinnedVerificationKey { ), Negated( Fixed { - query_index: 27, - column_index: 27, + query_index: 31, + column_index: 31, rotation: Rotation( 0, ), @@ -22964,8 +24586,8 @@ PinnedVerificationKey { ), Negated( Fixed { - query_index: 27, - column_index: 27, + query_index: 31, + column_index: 31, rotation: Rotation( 0, ), @@ -22975,12 +24597,12 @@ PinnedVerificationKey { ), Sum( Constant( - 0x0000000000000000000000000000000000000000000000000000000000000003, + 0x0000000000000000000000000000000000000000000000000000000000000004, ), Negated( Fixed { - query_index: 27, - column_index: 27, + query_index: 31, + column_index: 31, rotation: Rotation( 0, ), @@ -22990,12 +24612,12 @@ PinnedVerificationKey { ), Sum( Constant( - 0x0000000000000000000000000000000000000000000000000000000000000004, + 0x0000000000000000000000000000000000000000000000000000000000000005, ), Negated( Fixed { - query_index: 27, - column_index: 27, + query_index: 31, + column_index: 31, rotation: Rotation( 0, ), @@ -23005,12 +24627,12 @@ PinnedVerificationKey { ), Sum( Constant( - 0x0000000000000000000000000000000000000000000000000000000000000005, + 0x0000000000000000000000000000000000000000000000000000000000000006, ), Negated( Fixed { - query_index: 27, - column_index: 27, + query_index: 31, + column_index: 31, rotation: Rotation( 0, ), @@ -23020,12 +24642,12 @@ PinnedVerificationKey { ), Sum( Constant( - 0x0000000000000000000000000000000000000000000000000000000000000006, + 0x0000000000000000000000000000000000000000000000000000000000000007, ), Negated( Fixed { - query_index: 27, - column_index: 27, + query_index: 31, + column_index: 31, rotation: Rotation( 0, ), @@ -23033,26 +24655,45 @@ PinnedVerificationKey { ), ), ), - Product( + Sum( Advice { - query_index: 7, - column_index: 7, + query_index: 16, + column_index: 6, rotation: Rotation( - 0, + 1, ), }, - Sum( - Constant( - 0x0000000000000000000000000000000000000000000000000000000000000001, - ), - Negated( - Advice { - query_index: 7, - column_index: 7, - rotation: Rotation( - 0, + Negated( + Sum( + Sum( + Advice { + query_index: 7, + column_index: 7, + rotation: Rotation( + 0, + ), + }, + Scaled( + Advice { + query_index: 8, + column_index: 8, + rotation: Rotation( + 0, + ), + }, + 0x0000000000000000000000000000000000000000000000000000000000000020, ), - }, + ), + Scaled( + Advice { + query_index: 19, + column_index: 7, + rotation: Rotation( + 1, + ), + }, + 0x0000000000000000000000000000000000000000000000000000000000000040, + ), ), ), ), @@ -23065,8 +24706,8 @@ PinnedVerificationKey { Product( Product( Fixed { - query_index: 27, - column_index: 27, + query_index: 31, + column_index: 31, rotation: Rotation( 0, ), @@ -23077,8 +24718,8 @@ PinnedVerificationKey { ), Negated( Fixed { - query_index: 27, - column_index: 27, + query_index: 31, + column_index: 31, rotation: Rotation( 0, ), @@ -23092,8 +24733,8 @@ PinnedVerificationKey { ), Negated( Fixed { - query_index: 27, - column_index: 27, + query_index: 31, + column_index: 31, rotation: Rotation( 0, ), @@ -23107,8 +24748,8 @@ PinnedVerificationKey { ), Negated( Fixed { - query_index: 27, - column_index: 27, + query_index: 31, + column_index: 31, rotation: Rotation( 0, ), @@ -23118,12 +24759,12 @@ PinnedVerificationKey { ), Sum( Constant( - 0x0000000000000000000000000000000000000000000000000000000000000004, + 0x0000000000000000000000000000000000000000000000000000000000000005, ), Negated( Fixed { - query_index: 27, - column_index: 27, + query_index: 31, + column_index: 31, rotation: Rotation( 0, ), @@ -23133,12 +24774,12 @@ PinnedVerificationKey { ), Sum( Constant( - 0x0000000000000000000000000000000000000000000000000000000000000005, + 0x0000000000000000000000000000000000000000000000000000000000000006, ), Negated( Fixed { - query_index: 27, - column_index: 27, + query_index: 31, + column_index: 31, rotation: Rotation( 0, ), @@ -23148,12 +24789,12 @@ PinnedVerificationKey { ), Sum( Constant( - 0x0000000000000000000000000000000000000000000000000000000000000006, + 0x0000000000000000000000000000000000000000000000000000000000000007, ), Negated( Fixed { - query_index: 27, - column_index: 27, + query_index: 31, + column_index: 31, rotation: Rotation( 0, ), @@ -23161,45 +24802,26 @@ PinnedVerificationKey { ), ), ), - Sum( + Product( Advice { - query_index: 6, - column_index: 6, + query_index: 7, + column_index: 7, rotation: Rotation( 0, ), }, - Negated( - Sum( - Sum( - Advice { - query_index: 7, - column_index: 7, - rotation: Rotation( - 0, - ), - }, - Scaled( - Advice { - query_index: 22, - column_index: 6, - rotation: Rotation( - 1, - ), - }, - 0x0000000000000000000000000000000000000000000000000000000000000002, + Sum( + Constant( + 0x0000000000000000000000000000000000000000000000000000000000000001, + ), + Negated( + Advice { + query_index: 7, + column_index: 7, + rotation: Rotation( + 0, ), - ), - Scaled( - Advice { - query_index: 18, - column_index: 7, - rotation: Rotation( - 1, - ), - }, - 0x0000000000000000000000000000000000000000000000000000000000000400, - ), + }, ), ), ), @@ -23212,20 +24834,20 @@ PinnedVerificationKey { Product( Product( Fixed { - query_index: 28, - column_index: 28, + query_index: 31, + column_index: 31, rotation: Rotation( 0, ), }, Sum( Constant( - 0x0000000000000000000000000000000000000000000000000000000000000002, + 0x0000000000000000000000000000000000000000000000000000000000000001, ), Negated( Fixed { - query_index: 28, - column_index: 28, + query_index: 31, + column_index: 31, rotation: Rotation( 0, ), @@ -23235,12 +24857,12 @@ PinnedVerificationKey { ), Sum( Constant( - 0x0000000000000000000000000000000000000000000000000000000000000003, + 0x0000000000000000000000000000000000000000000000000000000000000002, ), Negated( Fixed { - query_index: 28, - column_index: 28, + query_index: 31, + column_index: 31, rotation: Rotation( 0, ), @@ -23250,12 +24872,12 @@ PinnedVerificationKey { ), Sum( Constant( - 0x0000000000000000000000000000000000000000000000000000000000000004, + 0x0000000000000000000000000000000000000000000000000000000000000003, ), Negated( Fixed { - query_index: 28, - column_index: 28, + query_index: 31, + column_index: 31, rotation: Rotation( 0, ), @@ -23269,8 +24891,8 @@ PinnedVerificationKey { ), Negated( Fixed { - query_index: 28, - column_index: 28, + query_index: 31, + column_index: 31, rotation: Rotation( 0, ), @@ -23284,8 +24906,8 @@ PinnedVerificationKey { ), Negated( Fixed { - query_index: 28, - column_index: 28, + query_index: 31, + column_index: 31, rotation: Rotation( 0, ), @@ -23299,8 +24921,8 @@ PinnedVerificationKey { ), Negated( Fixed { - query_index: 28, - column_index: 28, + query_index: 31, + column_index: 31, rotation: Rotation( 0, ), @@ -23340,20 +24962,20 @@ PinnedVerificationKey { Product( Product( Fixed { - query_index: 28, - column_index: 28, + query_index: 31, + column_index: 31, rotation: Rotation( 0, ), }, Sum( Constant( - 0x0000000000000000000000000000000000000000000000000000000000000002, + 0x0000000000000000000000000000000000000000000000000000000000000001, ), Negated( Fixed { - query_index: 28, - column_index: 28, + query_index: 31, + column_index: 31, rotation: Rotation( 0, ), @@ -23363,12 +24985,12 @@ PinnedVerificationKey { ), Sum( Constant( - 0x0000000000000000000000000000000000000000000000000000000000000003, + 0x0000000000000000000000000000000000000000000000000000000000000002, ), Negated( Fixed { - query_index: 28, - column_index: 28, + query_index: 31, + column_index: 31, rotation: Rotation( 0, ), @@ -23378,12 +25000,12 @@ PinnedVerificationKey { ), Sum( Constant( - 0x0000000000000000000000000000000000000000000000000000000000000004, + 0x0000000000000000000000000000000000000000000000000000000000000003, ), Negated( Fixed { - query_index: 28, - column_index: 28, + query_index: 31, + column_index: 31, rotation: Rotation( 0, ), @@ -23397,8 +25019,8 @@ PinnedVerificationKey { ), Negated( Fixed { - query_index: 28, - column_index: 28, + query_index: 31, + column_index: 31, rotation: Rotation( 0, ), @@ -23412,8 +25034,8 @@ PinnedVerificationKey { ), Negated( Fixed { - query_index: 28, - column_index: 28, + query_index: 31, + column_index: 31, rotation: Rotation( 0, ), @@ -23427,8 +25049,8 @@ PinnedVerificationKey { ), Negated( Fixed { - query_index: 28, - column_index: 28, + query_index: 31, + column_index: 31, rotation: Rotation( 0, ), @@ -23461,7 +25083,7 @@ PinnedVerificationKey { 0, ), }, - 0x0000000000000000000000000000000000000000000000000000000000000020, + 0x0000000000000000000000000000000000000000000000000000000000000002, ), ), ), @@ -23475,8 +25097,8 @@ PinnedVerificationKey { Product( Product( Fixed { - query_index: 28, - column_index: 28, + query_index: 31, + column_index: 31, rotation: Rotation( 0, ), @@ -23487,8 +25109,8 @@ PinnedVerificationKey { ), Negated( Fixed { - query_index: 28, - column_index: 28, + query_index: 31, + column_index: 31, rotation: Rotation( 0, ), @@ -23498,12 +25120,12 @@ PinnedVerificationKey { ), Sum( Constant( - 0x0000000000000000000000000000000000000000000000000000000000000003, + 0x0000000000000000000000000000000000000000000000000000000000000002, ), Negated( Fixed { - query_index: 28, - column_index: 28, + query_index: 31, + column_index: 31, rotation: Rotation( 0, ), @@ -23513,12 +25135,12 @@ PinnedVerificationKey { ), Sum( Constant( - 0x0000000000000000000000000000000000000000000000000000000000000004, + 0x0000000000000000000000000000000000000000000000000000000000000003, ), Negated( Fixed { - query_index: 28, - column_index: 28, + query_index: 31, + column_index: 31, rotation: Rotation( 0, ), @@ -23528,12 +25150,12 @@ PinnedVerificationKey { ), Sum( Constant( - 0x0000000000000000000000000000000000000000000000000000000000000005, + 0x0000000000000000000000000000000000000000000000000000000000000004, ), Negated( Fixed { - query_index: 28, - column_index: 28, + query_index: 31, + column_index: 31, rotation: Rotation( 0, ), @@ -23547,8 +25169,8 @@ PinnedVerificationKey { ), Negated( Fixed { - query_index: 28, - column_index: 28, + query_index: 31, + column_index: 31, rotation: Rotation( 0, ), @@ -23562,8 +25184,8 @@ PinnedVerificationKey { ), Negated( Fixed { - query_index: 28, - column_index: 28, + query_index: 31, + column_index: 31, rotation: Rotation( 0, ), @@ -23594,7 +25216,7 @@ PinnedVerificationKey { ), Scaled( Advice { - query_index: 18, + query_index: 19, column_index: 7, rotation: Rotation( 1, @@ -23622,8 +25244,8 @@ PinnedVerificationKey { Product( Product( Fixed { - query_index: 28, - column_index: 28, + query_index: 31, + column_index: 31, rotation: Rotation( 0, ), @@ -23634,8 +25256,8 @@ PinnedVerificationKey { ), Negated( Fixed { - query_index: 28, - column_index: 28, + query_index: 31, + column_index: 31, rotation: Rotation( 0, ), @@ -23645,12 +25267,12 @@ PinnedVerificationKey { ), Sum( Constant( - 0x0000000000000000000000000000000000000000000000000000000000000003, + 0x0000000000000000000000000000000000000000000000000000000000000002, ), Negated( Fixed { - query_index: 28, - column_index: 28, + query_index: 31, + column_index: 31, rotation: Rotation( 0, ), @@ -23660,12 +25282,12 @@ PinnedVerificationKey { ), Sum( Constant( - 0x0000000000000000000000000000000000000000000000000000000000000004, + 0x0000000000000000000000000000000000000000000000000000000000000003, ), Negated( Fixed { - query_index: 28, - column_index: 28, + query_index: 31, + column_index: 31, rotation: Rotation( 0, ), @@ -23675,12 +25297,12 @@ PinnedVerificationKey { ), Sum( Constant( - 0x0000000000000000000000000000000000000000000000000000000000000005, + 0x0000000000000000000000000000000000000000000000000000000000000004, ), Negated( Fixed { - query_index: 28, - column_index: 28, + query_index: 31, + column_index: 31, rotation: Rotation( 0, ), @@ -23694,8 +25316,8 @@ PinnedVerificationKey { ), Negated( Fixed { - query_index: 28, - column_index: 28, + query_index: 31, + column_index: 31, rotation: Rotation( 0, ), @@ -23709,8 +25331,8 @@ PinnedVerificationKey { ), Negated( Fixed { - query_index: 28, - column_index: 28, + query_index: 31, + column_index: 31, rotation: Rotation( 0, ), @@ -23740,7 +25362,7 @@ PinnedVerificationKey { ), Negated( Advice { - query_index: 19, + query_index: 20, column_index: 8, rotation: Rotation( 1, @@ -23757,8 +25379,8 @@ PinnedVerificationKey { Product( Product( Fixed { - query_index: 28, - column_index: 28, + query_index: 31, + column_index: 31, rotation: Rotation( 0, ), @@ -23769,8 +25391,8 @@ PinnedVerificationKey { ), Negated( Fixed { - query_index: 28, - column_index: 28, + query_index: 31, + column_index: 31, rotation: Rotation( 0, ), @@ -23780,12 +25402,12 @@ PinnedVerificationKey { ), Sum( Constant( - 0x0000000000000000000000000000000000000000000000000000000000000003, + 0x0000000000000000000000000000000000000000000000000000000000000002, ), Negated( Fixed { - query_index: 28, - column_index: 28, + query_index: 31, + column_index: 31, rotation: Rotation( 0, ), @@ -23795,12 +25417,12 @@ PinnedVerificationKey { ), Sum( Constant( - 0x0000000000000000000000000000000000000000000000000000000000000004, + 0x0000000000000000000000000000000000000000000000000000000000000003, ), Negated( Fixed { - query_index: 28, - column_index: 28, + query_index: 31, + column_index: 31, rotation: Rotation( 0, ), @@ -23810,12 +25432,12 @@ PinnedVerificationKey { ), Sum( Constant( - 0x0000000000000000000000000000000000000000000000000000000000000005, + 0x0000000000000000000000000000000000000000000000000000000000000004, ), Negated( Fixed { - query_index: 28, - column_index: 28, + query_index: 31, + column_index: 31, rotation: Rotation( 0, ), @@ -23829,8 +25451,8 @@ PinnedVerificationKey { ), Negated( Fixed { - query_index: 28, - column_index: 28, + query_index: 31, + column_index: 31, rotation: Rotation( 0, ), @@ -23844,8 +25466,8 @@ PinnedVerificationKey { ), Negated( Fixed { - query_index: 28, - column_index: 28, + query_index: 31, + column_index: 31, rotation: Rotation( 0, ), @@ -23855,7 +25477,7 @@ PinnedVerificationKey { ), Product( Advice { - query_index: 18, + query_index: 19, column_index: 7, rotation: Rotation( 1, @@ -23878,8 +25500,8 @@ PinnedVerificationKey { Product( Product( Fixed { - query_index: 28, - column_index: 28, + query_index: 31, + column_index: 31, rotation: Rotation( 0, ), @@ -23890,8 +25512,8 @@ PinnedVerificationKey { ), Negated( Fixed { - query_index: 28, - column_index: 28, + query_index: 31, + column_index: 31, rotation: Rotation( 0, ), @@ -23901,12 +25523,12 @@ PinnedVerificationKey { ), Sum( Constant( - 0x0000000000000000000000000000000000000000000000000000000000000003, + 0x0000000000000000000000000000000000000000000000000000000000000002, ), Negated( Fixed { - query_index: 28, - column_index: 28, + query_index: 31, + column_index: 31, rotation: Rotation( 0, ), @@ -23916,12 +25538,12 @@ PinnedVerificationKey { ), Sum( Constant( - 0x0000000000000000000000000000000000000000000000000000000000000004, + 0x0000000000000000000000000000000000000000000000000000000000000003, ), Negated( Fixed { - query_index: 28, - column_index: 28, + query_index: 31, + column_index: 31, rotation: Rotation( 0, ), @@ -23931,12 +25553,12 @@ PinnedVerificationKey { ), Sum( Constant( - 0x0000000000000000000000000000000000000000000000000000000000000005, + 0x0000000000000000000000000000000000000000000000000000000000000004, ), Negated( Fixed { - query_index: 28, - column_index: 28, + query_index: 31, + column_index: 31, rotation: Rotation( 0, ), @@ -23950,8 +25572,8 @@ PinnedVerificationKey { ), Negated( Fixed { - query_index: 28, - column_index: 28, + query_index: 31, + column_index: 31, rotation: Rotation( 0, ), @@ -23965,8 +25587,8 @@ PinnedVerificationKey { ), Negated( Fixed { - query_index: 28, - column_index: 28, + query_index: 31, + column_index: 31, rotation: Rotation( 0, ), @@ -23976,7 +25598,7 @@ PinnedVerificationKey { ), Product( Advice { - query_index: 18, + query_index: 19, column_index: 7, rotation: Rotation( 1, @@ -23999,8 +25621,8 @@ PinnedVerificationKey { Product( Product( Fixed { - query_index: 28, - column_index: 28, + query_index: 31, + column_index: 31, rotation: Rotation( 0, ), @@ -24011,8 +25633,8 @@ PinnedVerificationKey { ), Negated( Fixed { - query_index: 28, - column_index: 28, + query_index: 31, + column_index: 31, rotation: Rotation( 0, ), @@ -24022,12 +25644,12 @@ PinnedVerificationKey { ), Sum( Constant( - 0x0000000000000000000000000000000000000000000000000000000000000003, + 0x0000000000000000000000000000000000000000000000000000000000000002, ), Negated( Fixed { - query_index: 28, - column_index: 28, + query_index: 31, + column_index: 31, rotation: Rotation( 0, ), @@ -24037,12 +25659,12 @@ PinnedVerificationKey { ), Sum( Constant( - 0x0000000000000000000000000000000000000000000000000000000000000004, + 0x0000000000000000000000000000000000000000000000000000000000000003, ), Negated( Fixed { - query_index: 28, - column_index: 28, + query_index: 31, + column_index: 31, rotation: Rotation( 0, ), @@ -24052,12 +25674,12 @@ PinnedVerificationKey { ), Sum( Constant( - 0x0000000000000000000000000000000000000000000000000000000000000005, + 0x0000000000000000000000000000000000000000000000000000000000000004, ), Negated( Fixed { - query_index: 28, - column_index: 28, + query_index: 31, + column_index: 31, rotation: Rotation( 0, ), @@ -24071,8 +25693,8 @@ PinnedVerificationKey { ), Negated( Fixed { - query_index: 28, - column_index: 28, + query_index: 31, + column_index: 31, rotation: Rotation( 0, ), @@ -24086,8 +25708,8 @@ PinnedVerificationKey { ), Negated( Fixed { - query_index: 28, - column_index: 28, + query_index: 31, + column_index: 31, rotation: Rotation( 0, ), @@ -24097,14 +25719,14 @@ PinnedVerificationKey { ), Product( Advice { - query_index: 18, + query_index: 19, column_index: 7, rotation: Rotation( 1, ), }, Advice { - query_index: 10, + query_index: 17, column_index: 9, rotation: Rotation( 1, @@ -24120,8 +25742,8 @@ PinnedVerificationKey { Product( Product( Fixed { - query_index: 28, - column_index: 28, + query_index: 31, + column_index: 31, rotation: Rotation( 0, ), @@ -24132,8 +25754,8 @@ PinnedVerificationKey { ), Negated( Fixed { - query_index: 28, - column_index: 28, + query_index: 31, + column_index: 31, rotation: Rotation( 0, ), @@ -24147,8 +25769,8 @@ PinnedVerificationKey { ), Negated( Fixed { - query_index: 28, - column_index: 28, + query_index: 31, + column_index: 31, rotation: Rotation( 0, ), @@ -24158,12 +25780,12 @@ PinnedVerificationKey { ), Sum( Constant( - 0x0000000000000000000000000000000000000000000000000000000000000004, + 0x0000000000000000000000000000000000000000000000000000000000000003, ), Negated( Fixed { - query_index: 28, - column_index: 28, + query_index: 31, + column_index: 31, rotation: Rotation( 0, ), @@ -24173,12 +25795,12 @@ PinnedVerificationKey { ), Sum( Constant( - 0x0000000000000000000000000000000000000000000000000000000000000005, + 0x0000000000000000000000000000000000000000000000000000000000000004, ), Negated( Fixed { - query_index: 28, - column_index: 28, + query_index: 31, + column_index: 31, rotation: Rotation( 0, ), @@ -24188,12 +25810,12 @@ PinnedVerificationKey { ), Sum( Constant( - 0x0000000000000000000000000000000000000000000000000000000000000006, + 0x0000000000000000000000000000000000000000000000000000000000000005, ), Negated( Fixed { - query_index: 28, - column_index: 28, + query_index: 31, + column_index: 31, rotation: Rotation( 0, ), @@ -24207,8 +25829,8 @@ PinnedVerificationKey { ), Negated( Fixed { - query_index: 28, - column_index: 28, + query_index: 31, + column_index: 31, rotation: Rotation( 0, ), @@ -24239,7 +25861,7 @@ PinnedVerificationKey { ), Scaled( Advice { - query_index: 18, + query_index: 19, column_index: 7, rotation: Rotation( 1, @@ -24267,8 +25889,8 @@ PinnedVerificationKey { Product( Product( Fixed { - query_index: 28, - column_index: 28, + query_index: 31, + column_index: 31, rotation: Rotation( 0, ), @@ -24279,8 +25901,8 @@ PinnedVerificationKey { ), Negated( Fixed { - query_index: 28, - column_index: 28, + query_index: 31, + column_index: 31, rotation: Rotation( 0, ), @@ -24294,8 +25916,8 @@ PinnedVerificationKey { ), Negated( Fixed { - query_index: 28, - column_index: 28, + query_index: 31, + column_index: 31, rotation: Rotation( 0, ), @@ -24305,12 +25927,12 @@ PinnedVerificationKey { ), Sum( Constant( - 0x0000000000000000000000000000000000000000000000000000000000000004, + 0x0000000000000000000000000000000000000000000000000000000000000003, ), Negated( Fixed { - query_index: 28, - column_index: 28, + query_index: 31, + column_index: 31, rotation: Rotation( 0, ), @@ -24320,12 +25942,12 @@ PinnedVerificationKey { ), Sum( Constant( - 0x0000000000000000000000000000000000000000000000000000000000000005, + 0x0000000000000000000000000000000000000000000000000000000000000004, ), Negated( Fixed { - query_index: 28, - column_index: 28, + query_index: 31, + column_index: 31, rotation: Rotation( 0, ), @@ -24335,12 +25957,12 @@ PinnedVerificationKey { ), Sum( Constant( - 0x0000000000000000000000000000000000000000000000000000000000000006, + 0x0000000000000000000000000000000000000000000000000000000000000005, ), Negated( Fixed { - query_index: 28, - column_index: 28, + query_index: 31, + column_index: 31, rotation: Rotation( 0, ), @@ -24354,8 +25976,8 @@ PinnedVerificationKey { ), Negated( Fixed { - query_index: 28, - column_index: 28, + query_index: 31, + column_index: 31, rotation: Rotation( 0, ), @@ -24397,7 +26019,7 @@ PinnedVerificationKey { ), Negated( Advice { - query_index: 19, + query_index: 20, column_index: 8, rotation: Rotation( 1, @@ -24414,8 +26036,8 @@ PinnedVerificationKey { Product( Product( Fixed { - query_index: 28, - column_index: 28, + query_index: 31, + column_index: 31, rotation: Rotation( 0, ), @@ -24426,8 +26048,8 @@ PinnedVerificationKey { ), Negated( Fixed { - query_index: 28, - column_index: 28, + query_index: 31, + column_index: 31, rotation: Rotation( 0, ), @@ -24441,8 +26063,8 @@ PinnedVerificationKey { ), Negated( Fixed { - query_index: 28, - column_index: 28, + query_index: 31, + column_index: 31, rotation: Rotation( 0, ), @@ -24452,12 +26074,12 @@ PinnedVerificationKey { ), Sum( Constant( - 0x0000000000000000000000000000000000000000000000000000000000000004, + 0x0000000000000000000000000000000000000000000000000000000000000003, ), Negated( Fixed { - query_index: 28, - column_index: 28, + query_index: 31, + column_index: 31, rotation: Rotation( 0, ), @@ -24467,12 +26089,12 @@ PinnedVerificationKey { ), Sum( Constant( - 0x0000000000000000000000000000000000000000000000000000000000000005, + 0x0000000000000000000000000000000000000000000000000000000000000004, ), Negated( Fixed { - query_index: 28, - column_index: 28, + query_index: 31, + column_index: 31, rotation: Rotation( 0, ), @@ -24482,12 +26104,12 @@ PinnedVerificationKey { ), Sum( Constant( - 0x0000000000000000000000000000000000000000000000000000000000000006, + 0x0000000000000000000000000000000000000000000000000000000000000005, ), Negated( Fixed { - query_index: 28, - column_index: 28, + query_index: 31, + column_index: 31, rotation: Rotation( 0, ), @@ -24501,8 +26123,8 @@ PinnedVerificationKey { ), Negated( Fixed { - query_index: 28, - column_index: 28, + query_index: 31, + column_index: 31, rotation: Rotation( 0, ), @@ -24512,7 +26134,7 @@ PinnedVerificationKey { ), Product( Advice { - query_index: 18, + query_index: 19, column_index: 7, rotation: Rotation( 1, @@ -24535,8 +26157,8 @@ PinnedVerificationKey { Product( Product( Fixed { - query_index: 28, - column_index: 28, + query_index: 31, + column_index: 31, rotation: Rotation( 0, ), @@ -24547,8 +26169,8 @@ PinnedVerificationKey { ), Negated( Fixed { - query_index: 28, - column_index: 28, + query_index: 31, + column_index: 31, rotation: Rotation( 0, ), @@ -24562,8 +26184,8 @@ PinnedVerificationKey { ), Negated( Fixed { - query_index: 28, - column_index: 28, + query_index: 31, + column_index: 31, rotation: Rotation( 0, ), @@ -24573,12 +26195,12 @@ PinnedVerificationKey { ), Sum( Constant( - 0x0000000000000000000000000000000000000000000000000000000000000004, + 0x0000000000000000000000000000000000000000000000000000000000000003, ), Negated( Fixed { - query_index: 28, - column_index: 28, + query_index: 31, + column_index: 31, rotation: Rotation( 0, ), @@ -24588,12 +26210,12 @@ PinnedVerificationKey { ), Sum( Constant( - 0x0000000000000000000000000000000000000000000000000000000000000005, + 0x0000000000000000000000000000000000000000000000000000000000000004, ), Negated( Fixed { - query_index: 28, - column_index: 28, + query_index: 31, + column_index: 31, rotation: Rotation( 0, ), @@ -24603,12 +26225,12 @@ PinnedVerificationKey { ), Sum( Constant( - 0x0000000000000000000000000000000000000000000000000000000000000006, + 0x0000000000000000000000000000000000000000000000000000000000000005, ), Negated( Fixed { - query_index: 28, - column_index: 28, + query_index: 31, + column_index: 31, rotation: Rotation( 0, ), @@ -24622,8 +26244,8 @@ PinnedVerificationKey { ), Negated( Fixed { - query_index: 28, - column_index: 28, + query_index: 31, + column_index: 31, rotation: Rotation( 0, ), @@ -24633,14 +26255,14 @@ PinnedVerificationKey { ), Product( Advice { - query_index: 18, + query_index: 19, column_index: 7, rotation: Rotation( 1, ), }, Advice { - query_index: 10, + query_index: 17, column_index: 9, rotation: Rotation( 1, @@ -24656,8 +26278,8 @@ PinnedVerificationKey { Product( Product( Fixed { - query_index: 28, - column_index: 28, + query_index: 31, + column_index: 31, rotation: Rotation( 0, ), @@ -24668,8 +26290,8 @@ PinnedVerificationKey { ), Negated( Fixed { - query_index: 28, - column_index: 28, + query_index: 31, + column_index: 31, rotation: Rotation( 0, ), @@ -24683,8 +26305,8 @@ PinnedVerificationKey { ), Negated( Fixed { - query_index: 28, - column_index: 28, + query_index: 31, + column_index: 31, rotation: Rotation( 0, ), @@ -24698,8 +26320,8 @@ PinnedVerificationKey { ), Negated( Fixed { - query_index: 28, - column_index: 28, + query_index: 31, + column_index: 31, rotation: Rotation( 0, ), @@ -24709,12 +26331,12 @@ PinnedVerificationKey { ), Sum( Constant( - 0x0000000000000000000000000000000000000000000000000000000000000005, + 0x0000000000000000000000000000000000000000000000000000000000000004, ), Negated( Fixed { - query_index: 28, - column_index: 28, + query_index: 31, + column_index: 31, rotation: Rotation( 0, ), @@ -24724,12 +26346,12 @@ PinnedVerificationKey { ), Sum( Constant( - 0x0000000000000000000000000000000000000000000000000000000000000006, + 0x0000000000000000000000000000000000000000000000000000000000000005, ), Negated( Fixed { - query_index: 28, - column_index: 28, + query_index: 31, + column_index: 31, rotation: Rotation( 0, ), @@ -24739,12 +26361,12 @@ PinnedVerificationKey { ), Sum( Constant( - 0x0000000000000000000000000000000000000000000000000000000000000007, + 0x0000000000000000000000000000000000000000000000000000000000000006, ), Negated( Fixed { - query_index: 28, - column_index: 28, + query_index: 31, + column_index: 31, rotation: Rotation( 0, ), @@ -24799,69 +26421,21 @@ PinnedVerificationKey { Product( Product( Product( - Product( - Product( - Product( - Fixed { - query_index: 28, - column_index: 28, - rotation: Rotation( - 0, - ), - }, - Sum( - Constant( - 0x0000000000000000000000000000000000000000000000000000000000000001, - ), - Negated( - Fixed { - query_index: 28, - column_index: 28, - rotation: Rotation( - 0, - ), - }, - ), - ), - ), - Sum( - Constant( - 0x0000000000000000000000000000000000000000000000000000000000000002, - ), - Negated( - Fixed { - query_index: 28, - column_index: 28, - rotation: Rotation( - 0, - ), - }, - ), - ), - ), - Sum( - Constant( - 0x0000000000000000000000000000000000000000000000000000000000000003, - ), - Negated( - Fixed { - query_index: 28, - column_index: 28, - rotation: Rotation( - 0, - ), - }, - ), + Fixed { + query_index: 32, + column_index: 32, + rotation: Rotation( + 0, ), - ), + }, Sum( Constant( - 0x0000000000000000000000000000000000000000000000000000000000000004, + 0x0000000000000000000000000000000000000000000000000000000000000002, ), Negated( Fixed { - query_index: 28, - column_index: 28, + query_index: 32, + column_index: 32, rotation: Rotation( 0, ), @@ -24871,12 +26445,12 @@ PinnedVerificationKey { ), Sum( Constant( - 0x0000000000000000000000000000000000000000000000000000000000000006, + 0x0000000000000000000000000000000000000000000000000000000000000003, ), Negated( Fixed { - query_index: 28, - column_index: 28, + query_index: 32, + column_index: 32, rotation: Rotation( 0, ), @@ -24886,12 +26460,12 @@ PinnedVerificationKey { ), Sum( Constant( - 0x0000000000000000000000000000000000000000000000000000000000000007, + 0x0000000000000000000000000000000000000000000000000000000000000004, ), Negated( Fixed { - query_index: 28, - column_index: 28, + query_index: 32, + column_index: 32, rotation: Rotation( 0, ), @@ -24906,109 +26480,61 @@ PinnedVerificationKey { query_index: 7, column_index: 7, rotation: Rotation( - 0, - ), - }, - Scaled( - Advice { - query_index: 8, - column_index: 8, - rotation: Rotation( - 0, - ), - }, - 0x0000000000000000000000000000000000000000000000000000000000000010, - ), - ), - Scaled( - Advice { - query_index: 18, - column_index: 7, - rotation: Rotation( - 1, - ), - }, - 0x4000000000000000000000000000000000000000000000000000000000000000, - ), - ), - Negated( - Advice { - query_index: 6, - column_index: 6, - rotation: Rotation( - 0, - ), - }, - ), - ), - ), - Product( - Product( - Product( - Product( - Product( - Product( - Product( - Fixed { - query_index: 28, - column_index: 28, - rotation: Rotation( - 0, - ), - }, - Sum( - Constant( - 0x0000000000000000000000000000000000000000000000000000000000000001, - ), - Negated( - Fixed { - query_index: 28, - column_index: 28, - rotation: Rotation( - 0, - ), - }, - ), - ), - ), - Sum( - Constant( - 0x0000000000000000000000000000000000000000000000000000000000000002, - ), - Negated( - Fixed { - query_index: 28, - column_index: 28, - rotation: Rotation( - 0, - ), - }, - ), - ), - ), - Sum( - Constant( - 0x0000000000000000000000000000000000000000000000000000000000000003, - ), - Negated( - Fixed { - query_index: 28, - column_index: 28, - rotation: Rotation( - 0, - ), - }, + 0, + ), + }, + Scaled( + Advice { + query_index: 8, + column_index: 8, + rotation: Rotation( + 0, ), + }, + 0x0000000000000000000000000000000000000000000000000000000000000010, + ), + ), + Scaled( + Advice { + query_index: 19, + column_index: 7, + rotation: Rotation( + 1, ), + }, + 0x4000000000000000000000000000000000000000000000000000000000000000, + ), + ), + Negated( + Advice { + query_index: 6, + column_index: 6, + rotation: Rotation( + 0, ), + }, + ), + ), + ), + Product( + Product( + Product( + Product( + Fixed { + query_index: 32, + column_index: 32, + rotation: Rotation( + 0, + ), + }, Sum( Constant( - 0x0000000000000000000000000000000000000000000000000000000000000004, + 0x0000000000000000000000000000000000000000000000000000000000000002, ), Negated( Fixed { - query_index: 28, - column_index: 28, + query_index: 32, + column_index: 32, rotation: Rotation( 0, ), @@ -25018,12 +26544,12 @@ PinnedVerificationKey { ), Sum( Constant( - 0x0000000000000000000000000000000000000000000000000000000000000006, + 0x0000000000000000000000000000000000000000000000000000000000000003, ), Negated( Fixed { - query_index: 28, - column_index: 28, + query_index: 32, + column_index: 32, rotation: Rotation( 0, ), @@ -25033,12 +26559,12 @@ PinnedVerificationKey { ), Sum( Constant( - 0x0000000000000000000000000000000000000000000000000000000000000007, + 0x0000000000000000000000000000000000000000000000000000000000000004, ), Negated( Fixed { - query_index: 28, - column_index: 28, + query_index: 32, + column_index: 32, rotation: Rotation( 0, ), @@ -25080,7 +26606,7 @@ PinnedVerificationKey { ), Negated( Advice { - query_index: 19, + query_index: 20, column_index: 8, rotation: Rotation( 1, @@ -25093,69 +26619,21 @@ PinnedVerificationKey { Product( Product( Product( - Product( - Product( - Product( - Fixed { - query_index: 28, - column_index: 28, - rotation: Rotation( - 0, - ), - }, - Sum( - Constant( - 0x0000000000000000000000000000000000000000000000000000000000000001, - ), - Negated( - Fixed { - query_index: 28, - column_index: 28, - rotation: Rotation( - 0, - ), - }, - ), - ), - ), - Sum( - Constant( - 0x0000000000000000000000000000000000000000000000000000000000000002, - ), - Negated( - Fixed { - query_index: 28, - column_index: 28, - rotation: Rotation( - 0, - ), - }, - ), - ), - ), - Sum( - Constant( - 0x0000000000000000000000000000000000000000000000000000000000000003, - ), - Negated( - Fixed { - query_index: 28, - column_index: 28, - rotation: Rotation( - 0, - ), - }, - ), + Fixed { + query_index: 32, + column_index: 32, + rotation: Rotation( + 0, ), - ), + }, Sum( Constant( - 0x0000000000000000000000000000000000000000000000000000000000000004, + 0x0000000000000000000000000000000000000000000000000000000000000002, ), Negated( Fixed { - query_index: 28, - column_index: 28, + query_index: 32, + column_index: 32, rotation: Rotation( 0, ), @@ -25165,12 +26643,12 @@ PinnedVerificationKey { ), Sum( Constant( - 0x0000000000000000000000000000000000000000000000000000000000000006, + 0x0000000000000000000000000000000000000000000000000000000000000003, ), Negated( Fixed { - query_index: 28, - column_index: 28, + query_index: 32, + column_index: 32, rotation: Rotation( 0, ), @@ -25180,12 +26658,12 @@ PinnedVerificationKey { ), Sum( Constant( - 0x0000000000000000000000000000000000000000000000000000000000000007, + 0x0000000000000000000000000000000000000000000000000000000000000004, ), Negated( Fixed { - query_index: 28, - column_index: 28, + query_index: 32, + column_index: 32, rotation: Rotation( 0, ), @@ -25195,7 +26673,7 @@ PinnedVerificationKey { ), Product( Advice { - query_index: 18, + query_index: 19, column_index: 7, rotation: Rotation( 1, @@ -25214,69 +26692,21 @@ PinnedVerificationKey { Product( Product( Product( - Product( - Product( - Product( - Fixed { - query_index: 28, - column_index: 28, - rotation: Rotation( - 0, - ), - }, - Sum( - Constant( - 0x0000000000000000000000000000000000000000000000000000000000000001, - ), - Negated( - Fixed { - query_index: 28, - column_index: 28, - rotation: Rotation( - 0, - ), - }, - ), - ), - ), - Sum( - Constant( - 0x0000000000000000000000000000000000000000000000000000000000000002, - ), - Negated( - Fixed { - query_index: 28, - column_index: 28, - rotation: Rotation( - 0, - ), - }, - ), - ), - ), - Sum( - Constant( - 0x0000000000000000000000000000000000000000000000000000000000000003, - ), - Negated( - Fixed { - query_index: 28, - column_index: 28, - rotation: Rotation( - 0, - ), - }, - ), + Fixed { + query_index: 32, + column_index: 32, + rotation: Rotation( + 0, ), - ), + }, Sum( Constant( - 0x0000000000000000000000000000000000000000000000000000000000000004, + 0x0000000000000000000000000000000000000000000000000000000000000002, ), Negated( Fixed { - query_index: 28, - column_index: 28, + query_index: 32, + column_index: 32, rotation: Rotation( 0, ), @@ -25286,12 +26716,12 @@ PinnedVerificationKey { ), Sum( Constant( - 0x0000000000000000000000000000000000000000000000000000000000000006, + 0x0000000000000000000000000000000000000000000000000000000000000003, ), Negated( Fixed { - query_index: 28, - column_index: 28, + query_index: 32, + column_index: 32, rotation: Rotation( 0, ), @@ -25301,12 +26731,12 @@ PinnedVerificationKey { ), Sum( Constant( - 0x0000000000000000000000000000000000000000000000000000000000000007, + 0x0000000000000000000000000000000000000000000000000000000000000004, ), Negated( Fixed { - query_index: 28, - column_index: 28, + query_index: 32, + column_index: 32, rotation: Rotation( 0, ), @@ -25316,88 +26746,40 @@ PinnedVerificationKey { ), Product( Advice { - query_index: 18, + query_index: 19, column_index: 7, rotation: Rotation( 1, ), }, Advice { - query_index: 10, - column_index: 9, - rotation: Rotation( - 1, - ), - }, - ), - ), - Product( - Product( - Product( - Product( - Product( - Product( - Product( - Fixed { - query_index: 28, - column_index: 28, - rotation: Rotation( - 0, - ), - }, - Sum( - Constant( - 0x0000000000000000000000000000000000000000000000000000000000000001, - ), - Negated( - Fixed { - query_index: 28, - column_index: 28, - rotation: Rotation( - 0, - ), - }, - ), - ), - ), - Sum( - Constant( - 0x0000000000000000000000000000000000000000000000000000000000000002, - ), - Negated( - Fixed { - query_index: 28, - column_index: 28, - rotation: Rotation( - 0, - ), - }, - ), - ), - ), - Sum( - Constant( - 0x0000000000000000000000000000000000000000000000000000000000000003, - ), - Negated( - Fixed { - query_index: 28, - column_index: 28, - rotation: Rotation( - 0, - ), - }, - ), + query_index: 17, + column_index: 9, + rotation: Rotation( + 1, + ), + }, + ), + ), + Product( + Product( + Product( + Product( + Fixed { + query_index: 32, + column_index: 32, + rotation: Rotation( + 0, ), - ), + }, Sum( Constant( - 0x0000000000000000000000000000000000000000000000000000000000000004, + 0x0000000000000000000000000000000000000000000000000000000000000001, ), Negated( Fixed { - query_index: 28, - column_index: 28, + query_index: 32, + column_index: 32, rotation: Rotation( 0, ), @@ -25407,12 +26789,12 @@ PinnedVerificationKey { ), Sum( Constant( - 0x0000000000000000000000000000000000000000000000000000000000000005, + 0x0000000000000000000000000000000000000000000000000000000000000003, ), Negated( Fixed { - query_index: 28, - column_index: 28, + query_index: 32, + column_index: 32, rotation: Rotation( 0, ), @@ -25422,12 +26804,12 @@ PinnedVerificationKey { ), Sum( Constant( - 0x0000000000000000000000000000000000000000000000000000000000000007, + 0x0000000000000000000000000000000000000000000000000000000000000004, ), Negated( Fixed { - query_index: 28, - column_index: 28, + query_index: 32, + column_index: 32, rotation: Rotation( 0, ), @@ -25459,7 +26841,7 @@ PinnedVerificationKey { ), Scaled( Advice { - query_index: 22, + query_index: 16, column_index: 6, rotation: Rotation( 1, @@ -25470,7 +26852,7 @@ PinnedVerificationKey { ), Scaled( Advice { - query_index: 18, + query_index: 19, column_index: 7, rotation: Rotation( 1, @@ -25494,69 +26876,21 @@ PinnedVerificationKey { Product( Product( Product( - Product( - Product( - Product( - Fixed { - query_index: 28, - column_index: 28, - rotation: Rotation( - 0, - ), - }, - Sum( - Constant( - 0x0000000000000000000000000000000000000000000000000000000000000001, - ), - Negated( - Fixed { - query_index: 28, - column_index: 28, - rotation: Rotation( - 0, - ), - }, - ), - ), - ), - Sum( - Constant( - 0x0000000000000000000000000000000000000000000000000000000000000002, - ), - Negated( - Fixed { - query_index: 28, - column_index: 28, - rotation: Rotation( - 0, - ), - }, - ), - ), - ), - Sum( - Constant( - 0x0000000000000000000000000000000000000000000000000000000000000003, - ), - Negated( - Fixed { - query_index: 28, - column_index: 28, - rotation: Rotation( - 0, - ), - }, - ), + Fixed { + query_index: 32, + column_index: 32, + rotation: Rotation( + 0, ), - ), + }, Sum( Constant( - 0x0000000000000000000000000000000000000000000000000000000000000004, + 0x0000000000000000000000000000000000000000000000000000000000000001, ), Negated( Fixed { - query_index: 28, - column_index: 28, + query_index: 32, + column_index: 32, rotation: Rotation( 0, ), @@ -25566,12 +26900,12 @@ PinnedVerificationKey { ), Sum( Constant( - 0x0000000000000000000000000000000000000000000000000000000000000005, + 0x0000000000000000000000000000000000000000000000000000000000000003, ), Negated( Fixed { - query_index: 28, - column_index: 28, + query_index: 32, + column_index: 32, rotation: Rotation( 0, ), @@ -25581,12 +26915,12 @@ PinnedVerificationKey { ), Sum( Constant( - 0x0000000000000000000000000000000000000000000000000000000000000007, + 0x0000000000000000000000000000000000000000000000000000000000000004, ), Negated( Fixed { - query_index: 28, - column_index: 28, + query_index: 32, + column_index: 32, rotation: Rotation( 0, ), @@ -25628,7 +26962,7 @@ PinnedVerificationKey { ), Negated( Advice { - query_index: 19, + query_index: 20, column_index: 8, rotation: Rotation( 1, @@ -25641,69 +26975,21 @@ PinnedVerificationKey { Product( Product( Product( - Product( - Product( - Product( - Fixed { - query_index: 28, - column_index: 28, - rotation: Rotation( - 0, - ), - }, - Sum( - Constant( - 0x0000000000000000000000000000000000000000000000000000000000000001, - ), - Negated( - Fixed { - query_index: 28, - column_index: 28, - rotation: Rotation( - 0, - ), - }, - ), - ), - ), - Sum( - Constant( - 0x0000000000000000000000000000000000000000000000000000000000000002, - ), - Negated( - Fixed { - query_index: 28, - column_index: 28, - rotation: Rotation( - 0, - ), - }, - ), - ), - ), - Sum( - Constant( - 0x0000000000000000000000000000000000000000000000000000000000000003, - ), - Negated( - Fixed { - query_index: 28, - column_index: 28, - rotation: Rotation( - 0, - ), - }, - ), + Fixed { + query_index: 32, + column_index: 32, + rotation: Rotation( + 0, ), - ), + }, Sum( Constant( - 0x0000000000000000000000000000000000000000000000000000000000000004, + 0x0000000000000000000000000000000000000000000000000000000000000001, ), Negated( Fixed { - query_index: 28, - column_index: 28, + query_index: 32, + column_index: 32, rotation: Rotation( 0, ), @@ -25713,118 +26999,70 @@ PinnedVerificationKey { ), Sum( Constant( - 0x0000000000000000000000000000000000000000000000000000000000000005, + 0x0000000000000000000000000000000000000000000000000000000000000003, ), Negated( Fixed { - query_index: 28, - column_index: 28, + query_index: 32, + column_index: 32, rotation: Rotation( 0, ), }, ), - ), - ), - Sum( - Constant( - 0x0000000000000000000000000000000000000000000000000000000000000007, - ), - Negated( - Fixed { - query_index: 28, - column_index: 28, - rotation: Rotation( - 0, - ), - }, - ), - ), - ), - Product( - Advice { - query_index: 18, - column_index: 7, - rotation: Rotation( - 1, - ), - }, - Advice { - query_index: 22, - column_index: 6, - rotation: Rotation( - 1, - ), - }, - ), - ), - Product( - Product( - Product( - Product( - Product( - Product( - Product( - Fixed { - query_index: 28, - column_index: 28, - rotation: Rotation( - 0, - ), - }, - Sum( - Constant( - 0x0000000000000000000000000000000000000000000000000000000000000001, - ), - Negated( - Fixed { - query_index: 28, - column_index: 28, - rotation: Rotation( - 0, - ), - }, - ), - ), - ), - Sum( - Constant( - 0x0000000000000000000000000000000000000000000000000000000000000002, - ), - Negated( - Fixed { - query_index: 28, - column_index: 28, - rotation: Rotation( - 0, - ), - }, - ), - ), - ), - Sum( - Constant( - 0x0000000000000000000000000000000000000000000000000000000000000003, - ), - Negated( - Fixed { - query_index: 28, - column_index: 28, - rotation: Rotation( - 0, - ), - }, - ), - ), - ), + ), + ), + Sum( + Constant( + 0x0000000000000000000000000000000000000000000000000000000000000004, + ), + Negated( + Fixed { + query_index: 32, + column_index: 32, + rotation: Rotation( + 0, + ), + }, + ), + ), + ), + Product( + Advice { + query_index: 19, + column_index: 7, + rotation: Rotation( + 1, + ), + }, + Advice { + query_index: 16, + column_index: 6, + rotation: Rotation( + 1, + ), + }, + ), + ), + Product( + Product( + Product( + Product( + Fixed { + query_index: 32, + column_index: 32, + rotation: Rotation( + 0, + ), + }, Sum( Constant( - 0x0000000000000000000000000000000000000000000000000000000000000004, + 0x0000000000000000000000000000000000000000000000000000000000000001, ), Negated( Fixed { - query_index: 28, - column_index: 28, + query_index: 32, + column_index: 32, rotation: Rotation( 0, ), @@ -25834,12 +27072,12 @@ PinnedVerificationKey { ), Sum( Constant( - 0x0000000000000000000000000000000000000000000000000000000000000005, + 0x0000000000000000000000000000000000000000000000000000000000000003, ), Negated( Fixed { - query_index: 28, - column_index: 28, + query_index: 32, + column_index: 32, rotation: Rotation( 0, ), @@ -25849,12 +27087,12 @@ PinnedVerificationKey { ), Sum( Constant( - 0x0000000000000000000000000000000000000000000000000000000000000007, + 0x0000000000000000000000000000000000000000000000000000000000000004, ), Negated( Fixed { - query_index: 28, - column_index: 28, + query_index: 32, + column_index: 32, rotation: Rotation( 0, ), @@ -25864,7 +27102,7 @@ PinnedVerificationKey { ), Product( Advice { - query_index: 18, + query_index: 19, column_index: 7, rotation: Rotation( 1, @@ -25883,69 +27121,21 @@ PinnedVerificationKey { Product( Product( Product( - Product( - Product( - Product( - Fixed { - query_index: 28, - column_index: 28, - rotation: Rotation( - 0, - ), - }, - Sum( - Constant( - 0x0000000000000000000000000000000000000000000000000000000000000001, - ), - Negated( - Fixed { - query_index: 28, - column_index: 28, - rotation: Rotation( - 0, - ), - }, - ), - ), - ), - Sum( - Constant( - 0x0000000000000000000000000000000000000000000000000000000000000002, - ), - Negated( - Fixed { - query_index: 28, - column_index: 28, - rotation: Rotation( - 0, - ), - }, - ), - ), - ), - Sum( - Constant( - 0x0000000000000000000000000000000000000000000000000000000000000003, - ), - Negated( - Fixed { - query_index: 28, - column_index: 28, - rotation: Rotation( - 0, - ), - }, - ), + Fixed { + query_index: 32, + column_index: 32, + rotation: Rotation( + 0, ), - ), + }, Sum( Constant( - 0x0000000000000000000000000000000000000000000000000000000000000004, + 0x0000000000000000000000000000000000000000000000000000000000000001, ), Negated( Fixed { - query_index: 28, - column_index: 28, + query_index: 32, + column_index: 32, rotation: Rotation( 0, ), @@ -25955,12 +27145,12 @@ PinnedVerificationKey { ), Sum( Constant( - 0x0000000000000000000000000000000000000000000000000000000000000005, + 0x0000000000000000000000000000000000000000000000000000000000000003, ), Negated( Fixed { - query_index: 28, - column_index: 28, + query_index: 32, + column_index: 32, rotation: Rotation( 0, ), @@ -25970,12 +27160,12 @@ PinnedVerificationKey { ), Sum( Constant( - 0x0000000000000000000000000000000000000000000000000000000000000007, + 0x0000000000000000000000000000000000000000000000000000000000000004, ), Negated( Fixed { - query_index: 28, - column_index: 28, + query_index: 32, + column_index: 32, rotation: Rotation( 0, ), @@ -25985,14 +27175,14 @@ PinnedVerificationKey { ), Product( Advice { - query_index: 18, + query_index: 19, column_index: 7, rotation: Rotation( 1, ), }, Advice { - query_index: 10, + query_index: 17, column_index: 9, rotation: Rotation( 1, @@ -26004,69 +27194,21 @@ PinnedVerificationKey { Product( Product( Product( - Product( - Product( - Product( - Fixed { - query_index: 28, - column_index: 28, - rotation: Rotation( - 0, - ), - }, - Sum( - Constant( - 0x0000000000000000000000000000000000000000000000000000000000000001, - ), - Negated( - Fixed { - query_index: 28, - column_index: 28, - rotation: Rotation( - 0, - ), - }, - ), - ), - ), - Sum( - Constant( - 0x0000000000000000000000000000000000000000000000000000000000000002, - ), - Negated( - Fixed { - query_index: 28, - column_index: 28, - rotation: Rotation( - 0, - ), - }, - ), - ), - ), - Sum( - Constant( - 0x0000000000000000000000000000000000000000000000000000000000000003, - ), - Negated( - Fixed { - query_index: 28, - column_index: 28, - rotation: Rotation( - 0, - ), - }, - ), + Fixed { + query_index: 32, + column_index: 32, + rotation: Rotation( + 0, ), - ), + }, Sum( Constant( - 0x0000000000000000000000000000000000000000000000000000000000000004, + 0x0000000000000000000000000000000000000000000000000000000000000001, ), Negated( Fixed { - query_index: 28, - column_index: 28, + query_index: 32, + column_index: 32, rotation: Rotation( 0, ), @@ -26076,12 +27218,12 @@ PinnedVerificationKey { ), Sum( Constant( - 0x0000000000000000000000000000000000000000000000000000000000000005, + 0x0000000000000000000000000000000000000000000000000000000000000002, ), Negated( Fixed { - query_index: 28, - column_index: 28, + query_index: 32, + column_index: 32, rotation: Rotation( 0, ), @@ -26091,12 +27233,12 @@ PinnedVerificationKey { ), Sum( Constant( - 0x0000000000000000000000000000000000000000000000000000000000000006, + 0x0000000000000000000000000000000000000000000000000000000000000004, ), Negated( Fixed { - query_index: 28, - column_index: 28, + query_index: 32, + column_index: 32, rotation: Rotation( 0, ), @@ -26132,69 +27274,21 @@ PinnedVerificationKey { Product( Product( Product( - Product( - Product( - Product( - Fixed { - query_index: 28, - column_index: 28, - rotation: Rotation( - 0, - ), - }, - Sum( - Constant( - 0x0000000000000000000000000000000000000000000000000000000000000001, - ), - Negated( - Fixed { - query_index: 28, - column_index: 28, - rotation: Rotation( - 0, - ), - }, - ), - ), - ), - Sum( - Constant( - 0x0000000000000000000000000000000000000000000000000000000000000002, - ), - Negated( - Fixed { - query_index: 28, - column_index: 28, - rotation: Rotation( - 0, - ), - }, - ), - ), - ), - Sum( - Constant( - 0x0000000000000000000000000000000000000000000000000000000000000003, - ), - Negated( - Fixed { - query_index: 28, - column_index: 28, - rotation: Rotation( - 0, - ), - }, - ), + Fixed { + query_index: 32, + column_index: 32, + rotation: Rotation( + 0, ), - ), + }, Sum( Constant( - 0x0000000000000000000000000000000000000000000000000000000000000004, + 0x0000000000000000000000000000000000000000000000000000000000000001, ), Negated( Fixed { - query_index: 28, - column_index: 28, + query_index: 32, + column_index: 32, rotation: Rotation( 0, ), @@ -26204,12 +27298,12 @@ PinnedVerificationKey { ), Sum( Constant( - 0x0000000000000000000000000000000000000000000000000000000000000005, + 0x0000000000000000000000000000000000000000000000000000000000000002, ), Negated( - Fixed { - query_index: 28, - column_index: 28, + Fixed { + query_index: 32, + column_index: 32, rotation: Rotation( 0, ), @@ -26219,12 +27313,12 @@ PinnedVerificationKey { ), Sum( Constant( - 0x0000000000000000000000000000000000000000000000000000000000000006, + 0x0000000000000000000000000000000000000000000000000000000000000004, ), Negated( Fixed { - query_index: 28, - column_index: 28, + query_index: 32, + column_index: 32, rotation: Rotation( 0, ), @@ -26263,7 +27357,7 @@ PinnedVerificationKey { ), Scaled( Advice { - query_index: 22, + query_index: 16, column_index: 6, rotation: Rotation( 1, @@ -26279,69 +27373,21 @@ PinnedVerificationKey { Product( Product( Product( - Product( - Product( - Product( - Fixed { - query_index: 28, - column_index: 28, - rotation: Rotation( - 0, - ), - }, - Sum( - Constant( - 0x0000000000000000000000000000000000000000000000000000000000000001, - ), - Negated( - Fixed { - query_index: 28, - column_index: 28, - rotation: Rotation( - 0, - ), - }, - ), - ), - ), - Sum( - Constant( - 0x0000000000000000000000000000000000000000000000000000000000000002, - ), - Negated( - Fixed { - query_index: 28, - column_index: 28, - rotation: Rotation( - 0, - ), - }, - ), - ), - ), - Sum( - Constant( - 0x0000000000000000000000000000000000000000000000000000000000000003, - ), - Negated( - Fixed { - query_index: 28, - column_index: 28, - rotation: Rotation( - 0, - ), - }, - ), + Fixed { + query_index: 32, + column_index: 32, + rotation: Rotation( + 0, ), - ), + }, Sum( Constant( - 0x0000000000000000000000000000000000000000000000000000000000000004, + 0x0000000000000000000000000000000000000000000000000000000000000001, ), Negated( Fixed { - query_index: 28, - column_index: 28, + query_index: 32, + column_index: 32, rotation: Rotation( 0, ), @@ -26351,12 +27397,12 @@ PinnedVerificationKey { ), Sum( Constant( - 0x0000000000000000000000000000000000000000000000000000000000000005, + 0x0000000000000000000000000000000000000000000000000000000000000002, ), Negated( Fixed { - query_index: 28, - column_index: 28, + query_index: 32, + column_index: 32, rotation: Rotation( 0, ), @@ -26366,12 +27412,12 @@ PinnedVerificationKey { ), Sum( Constant( - 0x0000000000000000000000000000000000000000000000000000000000000006, + 0x0000000000000000000000000000000000000000000000000000000000000004, ), Negated( Fixed { - query_index: 28, - column_index: 28, + query_index: 32, + column_index: 32, rotation: Rotation( 0, ), @@ -26426,69 +27472,181 @@ PinnedVerificationKey { Product( Product( Product( - Product( - Product( - Product( - Fixed { - query_index: 28, - column_index: 28, - rotation: Rotation( - 0, - ), - }, - Sum( - Constant( - 0x0000000000000000000000000000000000000000000000000000000000000001, - ), - Negated( - Fixed { - query_index: 28, - column_index: 28, - rotation: Rotation( - 0, - ), - }, - ), + Fixed { + query_index: 32, + column_index: 32, + rotation: Rotation( + 0, + ), + }, + Sum( + Constant( + 0x0000000000000000000000000000000000000000000000000000000000000001, + ), + Negated( + Fixed { + query_index: 32, + column_index: 32, + rotation: Rotation( + 0, ), + }, + ), + ), + ), + Sum( + Constant( + 0x0000000000000000000000000000000000000000000000000000000000000002, + ), + Negated( + Fixed { + query_index: 32, + column_index: 32, + rotation: Rotation( + 0, ), - Sum( - Constant( - 0x0000000000000000000000000000000000000000000000000000000000000002, - ), - Negated( - Fixed { - query_index: 28, - column_index: 28, - rotation: Rotation( - 0, - ), - }, + }, + ), + ), + ), + Sum( + Constant( + 0x0000000000000000000000000000000000000000000000000000000000000004, + ), + Negated( + Fixed { + query_index: 32, + column_index: 32, + rotation: Rotation( + 0, + ), + }, + ), + ), + ), + Sum( + Sum( + Sum( + Advice { + query_index: 15, + column_index: 5, + rotation: Rotation( + 1, + ), + }, + Constant( + 0x0000000000000000000000000000000400000000000000000000000000000000, + ), + ), + Negated( + Constant( + 0x00000000000000000000000000000000224698fc094cf91b992d30ed00000001, + ), + ), + ), + Negated( + Advice { + query_index: 20, + column_index: 8, + rotation: Rotation( + 1, + ), + }, + ), + ), + ), + Product( + Product( + Product( + Product( + Fixed { + query_index: 32, + column_index: 32, + rotation: Rotation( + 0, + ), + }, + Sum( + Constant( + 0x0000000000000000000000000000000000000000000000000000000000000001, + ), + Negated( + Fixed { + query_index: 32, + column_index: 32, + rotation: Rotation( + 0, ), - ), + }, ), - Sum( - Constant( - 0x0000000000000000000000000000000000000000000000000000000000000003, - ), - Negated( - Fixed { - query_index: 28, - column_index: 28, - rotation: Rotation( - 0, - ), - }, + ), + ), + Sum( + Constant( + 0x0000000000000000000000000000000000000000000000000000000000000002, + ), + Negated( + Fixed { + query_index: 32, + column_index: 32, + rotation: Rotation( + 0, ), + }, + ), + ), + ), + Sum( + Constant( + 0x0000000000000000000000000000000000000000000000000000000000000004, + ), + Negated( + Fixed { + query_index: 32, + column_index: 32, + rotation: Rotation( + 0, + ), + }, + ), + ), + ), + Product( + Advice { + query_index: 9, + column_index: 9, + rotation: Rotation( + 0, + ), + }, + Advice { + query_index: 8, + column_index: 8, + rotation: Rotation( + 0, + ), + }, + ), + ), + Product( + Product( + Product( + Product( + Fixed { + query_index: 32, + column_index: 32, + rotation: Rotation( + 0, ), - ), + }, Sum( Constant( - 0x0000000000000000000000000000000000000000000000000000000000000004, + 0x0000000000000000000000000000000000000000000000000000000000000001, ), Negated( Fixed { - query_index: 28, - column_index: 28, + query_index: 32, + column_index: 32, rotation: Rotation( 0, ), @@ -26498,12 +27656,12 @@ PinnedVerificationKey { ), Sum( Constant( - 0x0000000000000000000000000000000000000000000000000000000000000005, + 0x0000000000000000000000000000000000000000000000000000000000000002, ), Negated( Fixed { - query_index: 28, - column_index: 28, + query_index: 32, + column_index: 32, rotation: Rotation( 0, ), @@ -26513,12 +27671,12 @@ PinnedVerificationKey { ), Sum( Constant( - 0x0000000000000000000000000000000000000000000000000000000000000006, + 0x0000000000000000000000000000000000000000000000000000000000000004, ), Negated( Fixed { - query_index: 28, - column_index: 28, + query_index: 32, + column_index: 32, rotation: Rotation( 0, ), @@ -26526,104 +27684,42 @@ PinnedVerificationKey { ), ), ), - Sum( - Sum( - Sum( - Advice { - query_index: 15, - column_index: 5, - rotation: Rotation( - 1, - ), - }, - Constant( - 0x0000000000000000000000000000000400000000000000000000000000000000, - ), + Product( + Advice { + query_index: 9, + column_index: 9, + rotation: Rotation( + 0, ), - Negated( - Constant( - 0x00000000000000000000000000000000224698fc094cf91b992d30ed00000001, - ), + }, + Advice { + query_index: 19, + column_index: 7, + rotation: Rotation( + 1, ), - ), - Negated( - Advice { - query_index: 19, - column_index: 8, - rotation: Rotation( - 1, - ), - }, - ), + }, ), ), Product( Product( Product( Product( - Product( - Product( - Product( - Fixed { - query_index: 28, - column_index: 28, - rotation: Rotation( - 0, - ), - }, - Sum( - Constant( - 0x0000000000000000000000000000000000000000000000000000000000000001, - ), - Negated( - Fixed { - query_index: 28, - column_index: 28, - rotation: Rotation( - 0, - ), - }, - ), - ), - ), - Sum( - Constant( - 0x0000000000000000000000000000000000000000000000000000000000000002, - ), - Negated( - Fixed { - query_index: 28, - column_index: 28, - rotation: Rotation( - 0, - ), - }, - ), - ), - ), - Sum( - Constant( - 0x0000000000000000000000000000000000000000000000000000000000000003, - ), - Negated( - Fixed { - query_index: 28, - column_index: 28, - rotation: Rotation( - 0, - ), - }, - ), + Fixed { + query_index: 32, + column_index: 32, + rotation: Rotation( + 0, ), - ), + }, Sum( Constant( - 0x0000000000000000000000000000000000000000000000000000000000000004, + 0x0000000000000000000000000000000000000000000000000000000000000001, ), Negated( Fixed { - query_index: 28, - column_index: 28, + query_index: 32, + column_index: 32, rotation: Rotation( 0, ), @@ -26633,12 +27729,12 @@ PinnedVerificationKey { ), Sum( Constant( - 0x0000000000000000000000000000000000000000000000000000000000000005, + 0x0000000000000000000000000000000000000000000000000000000000000002, ), Negated( Fixed { - query_index: 28, - column_index: 28, + query_index: 32, + column_index: 32, rotation: Rotation( 0, ), @@ -26648,12 +27744,12 @@ PinnedVerificationKey { ), Sum( Constant( - 0x0000000000000000000000000000000000000000000000000000000000000006, + 0x0000000000000000000000000000000000000000000000000000000000000004, ), Negated( Fixed { - query_index: 28, - column_index: 28, + query_index: 32, + column_index: 32, rotation: Rotation( 0, ), @@ -26670,10 +27766,10 @@ PinnedVerificationKey { ), }, Advice { - query_index: 8, - column_index: 8, + query_index: 17, + column_index: 9, rotation: Rotation( - 0, + 1, ), }, ), @@ -26682,69 +27778,130 @@ PinnedVerificationKey { Product( Product( Product( - Product( - Product( - Product( - Fixed { - query_index: 28, - column_index: 28, - rotation: Rotation( - 0, - ), - }, - Sum( - Constant( - 0x0000000000000000000000000000000000000000000000000000000000000001, - ), - Negated( - Fixed { - query_index: 28, - column_index: 28, - rotation: Rotation( - 0, - ), - }, - ), - ), - ), - Sum( - Constant( - 0x0000000000000000000000000000000000000000000000000000000000000002, - ), - Negated( - Fixed { - query_index: 28, - column_index: 28, - rotation: Rotation( - 0, - ), - }, + Fixed { + query_index: 32, + column_index: 32, + rotation: Rotation( + 0, + ), + }, + Sum( + Constant( + 0x0000000000000000000000000000000000000000000000000000000000000001, + ), + Negated( + Fixed { + query_index: 32, + column_index: 32, + rotation: Rotation( + 0, ), + }, + ), + ), + ), + Sum( + Constant( + 0x0000000000000000000000000000000000000000000000000000000000000002, + ), + Negated( + Fixed { + query_index: 32, + column_index: 32, + rotation: Rotation( + 0, ), + }, + ), + ), + ), + Sum( + Constant( + 0x0000000000000000000000000000000000000000000000000000000000000003, + ), + Negated( + Fixed { + query_index: 32, + column_index: 32, + rotation: Rotation( + 0, ), + }, + ), + ), + ), + Sum( + Advice { + query_index: 2, + column_index: 2, + rotation: Rotation( + 0, + ), + }, + Negated( + Sum( + Product( + Advice { + query_index: 4, + column_index: 4, + rotation: Rotation( + 0, + ), + }, + Advice { + query_index: 1, + column_index: 1, + rotation: Rotation( + 0, + ), + }, + ), + Product( Sum( Constant( - 0x0000000000000000000000000000000000000000000000000000000000000003, + 0x0000000000000000000000000000000000000000000000000000000000000001, ), Negated( - Fixed { - query_index: 28, - column_index: 28, + Advice { + query_index: 4, + column_index: 4, rotation: Rotation( 0, ), }, ), ), - ), + Advice { + query_index: 0, + column_index: 0, + rotation: Rotation( + 0, + ), + }, + ), + ), + ), + ), + ), + Product( + Product( + Product( + Product( + Fixed { + query_index: 32, + column_index: 32, + rotation: Rotation( + 0, + ), + }, Sum( Constant( - 0x0000000000000000000000000000000000000000000000000000000000000004, + 0x0000000000000000000000000000000000000000000000000000000000000001, ), Negated( Fixed { - query_index: 28, - column_index: 28, + query_index: 32, + column_index: 32, rotation: Rotation( 0, ), @@ -26754,12 +27911,12 @@ PinnedVerificationKey { ), Sum( Constant( - 0x0000000000000000000000000000000000000000000000000000000000000005, + 0x0000000000000000000000000000000000000000000000000000000000000002, ), Negated( Fixed { - query_index: 28, - column_index: 28, + query_index: 32, + column_index: 32, rotation: Rotation( 0, ), @@ -26769,12 +27926,12 @@ PinnedVerificationKey { ), Sum( Constant( - 0x0000000000000000000000000000000000000000000000000000000000000006, + 0x0000000000000000000000000000000000000000000000000000000000000003, ), Negated( Fixed { - query_index: 28, - column_index: 28, + query_index: 32, + column_index: 32, rotation: Rotation( 0, ), @@ -26782,90 +27939,78 @@ PinnedVerificationKey { ), ), ), - Product( + Sum( Advice { - query_index: 9, - column_index: 9, + query_index: 3, + column_index: 3, rotation: Rotation( 0, ), }, - Advice { - query_index: 18, - column_index: 7, - rotation: Rotation( - 1, - ), - }, - ), - ), - Product( - Product( - Product( - Product( + Negated( + Sum( Product( - Product( - Product( - Fixed { - query_index: 28, - column_index: 28, - rotation: Rotation( - 0, - ), - }, - Sum( - Constant( - 0x0000000000000000000000000000000000000000000000000000000000000001, - ), - Negated( - Fixed { - query_index: 28, - column_index: 28, - rotation: Rotation( - 0, - ), - }, - ), - ), + Advice { + query_index: 4, + column_index: 4, + rotation: Rotation( + 0, ), - Sum( - Constant( - 0x0000000000000000000000000000000000000000000000000000000000000002, - ), - Negated( - Fixed { - query_index: 28, - column_index: 28, - rotation: Rotation( - 0, - ), - }, - ), + }, + Advice { + query_index: 0, + column_index: 0, + rotation: Rotation( + 0, ), - ), + }, + ), + Product( Sum( Constant( - 0x0000000000000000000000000000000000000000000000000000000000000003, + 0x0000000000000000000000000000000000000000000000000000000000000001, ), Negated( - Fixed { - query_index: 28, - column_index: 28, + Advice { + query_index: 4, + column_index: 4, rotation: Rotation( 0, ), }, ), ), + Advice { + query_index: 1, + column_index: 1, + rotation: Rotation( + 0, + ), + }, ), + ), + ), + ), + ), + Product( + Product( + Product( + Product( + Fixed { + query_index: 32, + column_index: 32, + rotation: Rotation( + 0, + ), + }, Sum( Constant( - 0x0000000000000000000000000000000000000000000000000000000000000004, + 0x0000000000000000000000000000000000000000000000000000000000000001, ), Negated( Fixed { - query_index: 28, - column_index: 28, + query_index: 32, + column_index: 32, rotation: Rotation( 0, ), @@ -26875,12 +28020,12 @@ PinnedVerificationKey { ), Sum( Constant( - 0x0000000000000000000000000000000000000000000000000000000000000005, + 0x0000000000000000000000000000000000000000000000000000000000000002, ), Negated( Fixed { - query_index: 28, - column_index: 28, + query_index: 32, + column_index: 32, rotation: Rotation( 0, ), @@ -26890,12 +28035,12 @@ PinnedVerificationKey { ), Sum( Constant( - 0x0000000000000000000000000000000000000000000000000000000000000006, + 0x0000000000000000000000000000000000000000000000000000000000000003, ), Negated( Fixed { - query_index: 28, - column_index: 28, + query_index: 32, + column_index: 32, rotation: Rotation( 0, ), @@ -26905,19 +28050,26 @@ PinnedVerificationKey { ), Product( Advice { - query_index: 9, - column_index: 9, + query_index: 4, + column_index: 4, rotation: Rotation( 0, ), }, - Advice { - query_index: 10, - column_index: 9, - rotation: Rotation( - 1, + Sum( + Constant( + 0x0000000000000000000000000000000000000000000000000000000000000001, ), - }, + Negated( + Advice { + query_index: 4, + column_index: 4, + rotation: Rotation( + 0, + ), + }, + ), + ), ), ), ], @@ -27014,7 +28166,7 @@ PinnedVerificationKey { ), ( Column { - index: 9, + index: 0, column_type: Advice, }, Rotation( @@ -27023,11 +28175,11 @@ PinnedVerificationKey { ), ( Column { - index: 9, + index: 1, column_type: Advice, }, Rotation( - -1, + 1, ), ), ( @@ -27068,7 +28220,7 @@ PinnedVerificationKey { ), ( Column { - index: 0, + index: 6, column_type: Advice, }, Rotation( @@ -27077,7 +28229,7 @@ PinnedVerificationKey { ), ( Column { - index: 1, + index: 9, column_type: Advice, }, Rotation( @@ -27086,16 +28238,16 @@ PinnedVerificationKey { ), ( Column { - index: 7, + index: 9, column_type: Advice, }, Rotation( - 1, + -1, ), ), ( Column { - index: 8, + index: 7, column_type: Advice, }, Rotation( @@ -27104,16 +28256,16 @@ PinnedVerificationKey { ), ( Column { - index: 6, + index: 8, column_type: Advice, }, Rotation( - -1, + 1, ), ), ( Column { - index: 1, + index: 6, column_type: Advice, }, Rotation( @@ -27122,11 +28274,11 @@ PinnedVerificationKey { ), ( Column { - index: 6, + index: 1, column_type: Advice, }, Rotation( - 1, + -1, ), ), ( @@ -27162,7 +28314,7 @@ PinnedVerificationKey { fixed_queries: [ ( Column { - index: 3, + index: 4, column_type: Fixed, }, Rotation( @@ -27180,7 +28332,7 @@ PinnedVerificationKey { ), ( Column { - index: 11, + index: 1, column_type: Fixed, }, Rotation( @@ -27189,7 +28341,7 @@ PinnedVerificationKey { ), ( Column { - index: 4, + index: 12, column_type: Fixed, }, Rotation( @@ -27252,7 +28404,7 @@ PinnedVerificationKey { ), ( Column { - index: 12, + index: 11, column_type: Fixed, }, Rotation( @@ -27261,7 +28413,7 @@ PinnedVerificationKey { ), ( Column { - index: 1, + index: 13, column_type: Fixed, }, Rotation( @@ -27279,7 +28431,7 @@ PinnedVerificationKey { ), ( Column { - index: 13, + index: 3, column_type: Fixed, }, Rotation( @@ -27421,6 +28573,42 @@ PinnedVerificationKey { 0, ), ), + ( + Column { + index: 29, + column_type: Fixed, + }, + Rotation( + 0, + ), + ), + ( + Column { + index: 30, + column_type: Fixed, + }, + Rotation( + 0, + ), + ), + ( + Column { + index: 31, + column_type: Fixed, + }, + Rotation( + 0, + ), + ), + ( + Column { + index: 32, + column_type: Fixed, + }, + Rotation( + 0, + ), + ), ], permutation: Argument { columns: [ @@ -27469,19 +28657,19 @@ PinnedVerificationKey { column_type: Advice, }, Column { - index: 3, + index: 4, column_type: Fixed, }, Column { - index: 8, + index: 9, column_type: Fixed, }, Column { - index: 9, + index: 10, column_type: Fixed, }, Column { - index: 10, + index: 11, column_type: Fixed, }, ], @@ -27491,40 +28679,111 @@ PinnedVerificationKey { input_expressions: [ Product( Fixed { - query_index: 14, - column_index: 14, + query_index: 15, + column_index: 15, rotation: Rotation( 0, ), }, Sum( Product( - Fixed { - query_index: 15, - column_index: 15, - rotation: Rotation( - 0, + Sum( + Constant( + 0x0000000000000000000000000000000000000000000000000000000000000001, + ), + Negated( + Sum( + Constant( + 0x0000000000000000000000000000000000000000000000000000000000000001, + ), + Negated( + Product( + Sum( + Constant( + 0x0000000000000000000000000000000000000000000000000000000000000001, + ), + Negated( + Fixed { + query_index: 17, + column_index: 17, + rotation: Rotation( + 0, + ), + }, + ), + ), + Sum( + Constant( + 0x0000000000000000000000000000000000000000000000000000000000000001, + ), + Negated( + Fixed { + query_index: 18, + column_index: 18, + rotation: Rotation( + 0, + ), + }, + ), + ), + ), + ), + ), ), - }, + ), Sum( - Advice { - query_index: 9, - column_index: 9, - rotation: Rotation( - 0, - ), - }, - Negated( - Scaled( + Product( + Fixed { + query_index: 16, + column_index: 16, + rotation: Rotation( + 0, + ), + }, + Sum( Advice { - query_index: 10, + query_index: 9, column_index: 9, rotation: Rotation( - 1, + 0, ), }, - 0x0000000000000000000000000000000000000000000000000000000000000400, + Negated( + Scaled( + Advice { + query_index: 17, + column_index: 9, + rotation: Rotation( + 1, + ), + }, + 0x0000000000000000000000000000000000000000000000000000000000000400, + ), + ), + ), + ), + Product( + Sum( + Constant( + 0x0000000000000000000000000000000000000000000000000000000000000001, + ), + Negated( + Fixed { + query_index: 16, + column_index: 16, + rotation: Rotation( + 0, + ), + }, + ), ), + Advice { + query_index: 9, + column_index: 9, + rotation: Rotation( + 0, + ), + }, ), ), ), @@ -27534,13 +28793,36 @@ PinnedVerificationKey { 0x0000000000000000000000000000000000000000000000000000000000000001, ), Negated( - Fixed { - query_index: 15, - column_index: 15, - rotation: Rotation( - 0, + Product( + Sum( + Constant( + 0x0000000000000000000000000000000000000000000000000000000000000001, + ), + Negated( + Fixed { + query_index: 17, + column_index: 17, + rotation: Rotation( + 0, + ), + }, + ), ), - }, + Sum( + Constant( + 0x0000000000000000000000000000000000000000000000000000000000000001, + ), + Negated( + Fixed { + query_index: 18, + column_index: 18, + rotation: Rotation( + 0, + ), + }, + ), + ), + ), ), ), Advice { @@ -27553,6 +28835,96 @@ PinnedVerificationKey { ), ), ), + Product( + Product( + Fixed { + query_index: 15, + column_index: 15, + rotation: Rotation( + 0, + ), + }, + Sum( + Constant( + 0x0000000000000000000000000000000000000000000000000000000000000001, + ), + Negated( + Product( + Sum( + Constant( + 0x0000000000000000000000000000000000000000000000000000000000000001, + ), + Negated( + Fixed { + query_index: 17, + column_index: 17, + rotation: Rotation( + 0, + ), + }, + ), + ), + Sum( + Constant( + 0x0000000000000000000000000000000000000000000000000000000000000001, + ), + Negated( + Fixed { + query_index: 18, + column_index: 18, + rotation: Rotation( + 0, + ), + }, + ), + ), + ), + ), + ), + ), + Sum( + Product( + Fixed { + query_index: 18, + column_index: 18, + rotation: Rotation( + 0, + ), + }, + Constant( + 0x0000000000000000000000000000000000000000000000000000000000000005, + ), + ), + Product( + Product( + Sum( + Constant( + 0x0000000000000000000000000000000000000000000000000000000000000001, + ), + Negated( + Fixed { + query_index: 18, + column_index: 18, + rotation: Rotation( + 0, + ), + }, + ), + ), + Fixed { + query_index: 17, + column_index: 17, + rotation: Rotation( + 0, + ), + }, + ), + Constant( + 0x0000000000000000000000000000000000000000000000000000000000000004, + ), + ), + ), + ), ], table_expressions: [ Fixed { @@ -27562,14 +28934,21 @@ PinnedVerificationKey { 0, ), }, + Fixed { + query_index: 2, + column_index: 1, + rotation: Rotation( + 0, + ), + }, ], }, Argument { input_expressions: [ Product( Fixed { - query_index: 16, - column_index: 16, + query_index: 19, + column_index: 19, rotation: Rotation( 0, ), @@ -27587,8 +28966,8 @@ PinnedVerificationKey { Product( Sum( Fixed { - query_index: 10, - column_index: 12, + query_index: 11, + column_index: 13, rotation: Rotation( 0, ), @@ -27596,16 +28975,16 @@ PinnedVerificationKey { Negated( Product( Fixed { - query_index: 10, - column_index: 12, + query_index: 11, + column_index: 13, rotation: Rotation( 0, ), }, Sum( Fixed { - query_index: 10, - column_index: 12, + query_index: 11, + column_index: 13, rotation: Rotation( 0, ), @@ -27635,8 +29014,8 @@ PinnedVerificationKey { Sum( Product( Fixed { - query_index: 16, - column_index: 16, + query_index: 19, + column_index: 19, rotation: Rotation( 0, ), @@ -27656,8 +29035,8 @@ PinnedVerificationKey { ), Negated( Fixed { - query_index: 16, - column_index: 16, + query_index: 19, + column_index: 19, rotation: Rotation( 0, ), @@ -27670,8 +29049,8 @@ PinnedVerificationKey { Sum( Product( Fixed { - query_index: 16, - column_index: 16, + query_index: 19, + column_index: 19, rotation: Rotation( 0, ), @@ -27785,8 +29164,8 @@ PinnedVerificationKey { ), Negated( Fixed { - query_index: 16, - column_index: 16, + query_index: 19, + column_index: 19, rotation: Rotation( 0, ), @@ -27806,15 +29185,15 @@ PinnedVerificationKey { ), }, Fixed { - query_index: 11, - column_index: 1, + query_index: 12, + column_index: 2, rotation: Rotation( 0, ), }, Fixed { - query_index: 12, - column_index: 2, + query_index: 13, + column_index: 3, rotation: Rotation( 0, ), @@ -27825,8 +29204,8 @@ PinnedVerificationKey { input_expressions: [ Product( Fixed { - query_index: 17, - column_index: 17, + query_index: 20, + column_index: 20, rotation: Rotation( 0, ), @@ -27844,8 +29223,8 @@ PinnedVerificationKey { Product( Sum( Fixed { - query_index: 13, - column_index: 13, + query_index: 14, + column_index: 14, rotation: Rotation( 0, ), @@ -27853,16 +29232,16 @@ PinnedVerificationKey { Negated( Product( Fixed { - query_index: 13, - column_index: 13, + query_index: 14, + column_index: 14, rotation: Rotation( 0, ), }, Sum( Fixed { - query_index: 13, - column_index: 13, + query_index: 14, + column_index: 14, rotation: Rotation( 0, ), @@ -27877,7 +29256,7 @@ PinnedVerificationKey { ), ), Advice { - query_index: 18, + query_index: 19, column_index: 7, rotation: Rotation( 1, @@ -27892,8 +29271,8 @@ PinnedVerificationKey { Sum( Product( Fixed { - query_index: 17, - column_index: 17, + query_index: 20, + column_index: 20, rotation: Rotation( 0, ), @@ -27913,8 +29292,8 @@ PinnedVerificationKey { ), Negated( Fixed { - query_index: 17, - column_index: 17, + query_index: 20, + column_index: 20, rotation: Rotation( 0, ), @@ -27927,8 +29306,8 @@ PinnedVerificationKey { Sum( Product( Fixed { - query_index: 17, - column_index: 17, + query_index: 20, + column_index: 20, rotation: Rotation( 0, ), @@ -28042,8 +29421,8 @@ PinnedVerificationKey { ), Negated( Fixed { - query_index: 17, - column_index: 17, + query_index: 20, + column_index: 20, rotation: Rotation( 0, ), @@ -28063,15 +29442,15 @@ PinnedVerificationKey { ), }, Fixed { - query_index: 11, - column_index: 1, + query_index: 12, + column_index: 2, rotation: Rotation( 0, ), }, Fixed { - query_index: 12, - column_index: 2, + query_index: 13, + column_index: 3, rotation: Rotation( 0, ), @@ -28081,57 +29460,61 @@ PinnedVerificationKey { ], constants: [ Column { - index: 3, + index: 4, column_type: Fixed, }, ], minimum_degree: None, }, fixed_commitments: [ - (0x05f5862cad2888855bc3c1843a9eff57b11b592d9eb0e13354256661387f5231, 0x32236b14df85bf5f532a930232cb23a5c56ef7d67aaeed8bcb8fc10ea132cbd6), - (0x3e727e8554679f98120355d39d958dbd8755d5a7f8b42ea87f258064c4b3eb57, 0x0c0d5c23f3ee62ac1b2d986dd3033bbcab260d590e1393de3a14a4b31ae091bb), - (0x3748680dd6a91c5dec668b30fb6bf9a450aeb884b81cbc344914f265760e7131, 0x18530eaa5c58b61bd3fc38220ea484c0922524a815a8f752be955c229f9c4164), - (0x18cd12d5f4e12bd7247a8fd7cc93ded7a8a9b60935b319b2db578a8fceef9559, 0x16b15af4fcfb9ed75533e7a4c1966cae5621f10dc1dfbba39a491ec37c911b5e), - (0x37e70146801841d95832259e4d8f39aeee8a364ea5007f82aa84a0e387231315, 0x20ef65833381c985722a95e65125a1123cab3357741168a5ed7e92e972dbd30d), - (0x12e3af8e507a2ca30e544568cf319701ecbc29dc5919f0198d541938edecc8f3, 0x3fb1bb2804faaa4c215e93694d5d1e6f87874cb8c34cb9206ff958de14e44275), - (0x334d99f316343f01c8eb67e327c76f743f8de7f957c893c6f30ccd87e5d1af3a, 0x1da64caf127c8eb513653791147a85ed1edcca12935c95b7d615a9377c9406d8), - (0x1430dca15080286939046d3cb9fb7ace4ed1da2fbe7a362e8f3575489bc6e3e1, 0x1ef5f4aff2902f3bc8acb2cc884a2d44334f910a68b2701f1c37943652b46d8f), - (0x02ebdeac7e91b3d15e4b7c0533e42678672ec384d51e51e22342be7edeeb8074, 0x03638952e0489de03ff03236433f5d2617cb4ddd0a72637ed31095deca85a2a6), - (0x31179b7f5b01ad2a55cf9a66f57b696e9b9cb4919cca426d469b270827f3018b, 0x2b231a9a71b674cc546ba9b36916a13411648903cfdcb808926fc47ee745586c), - (0x0673497660cec8a8c391cfb16f5ffdcb710f9e9e194a1a85935cf4bc45b01359, 0x15ce8801c51811f0256a43f762e497fe38c88866c09bb256289d93e0393dc225), - (0x098d2a0cfedae91fe29e21a01b5e43045b9cc8d9a334f1aee3e075f36a16e323, 0x0be47cc41643c9e6d95012428d5b46ae5a44e765392e05152a0181e30689d8b6), - (0x02adb7cbc9ebbbd87d7d6a41fc40cb4cf57585c6243aa204f757c9026ef20fd3, 0x327fc06fee179c6a57ed95336f9fb7854420d80dd191251a40935664ff6c8067), - (0x2d00d4ec8aa5e4b3d035131f559e4a97f896e8dbc39badb92b58a8d46b5e91df, 0x37046fb32ed8eb4ba0b4da8e1c9b56cd3832fa2ed4788f7faf4fee1f76a94c32), - (0x212f5afd70e787e2fd951e0ddc5430d1fa78f988c30740384d18cf9ff276b43b, 0x20c5a150e200caddf9a35a993668fc4742be5d924d1086f05c74ef6a78b5feb2), - (0x02c283cbde85f2ad26daddeabe01b1574ce7de68f0e329ec95a4154dd4713f29, 0x208cf96aa5255b543933ee3e9bdd054d4f15265a7c8921aaee89c192af2fd284), - (0x1f777f0e4263ec4a19f30813739c640335ffa951cc3cc586b6c4095e737f95be, 0x061c07fb12cb19582eefd858a08e689acd970c8cb9ed8f7b928d88e691a2f586), - (0x13d0bd76da4ace22c0e90b098d6073551322b8c734bf37eeca67fbf19687f550, 0x3d996cc9da5a31cefb453390b906eabbcc75797bc6a6b9c9e3af2fe7b6b8beed), - (0x04cad7405b492a30db0a710c842cecc97d02059acf4c02aa79626dce68ac4837, 0x3d6d7b6698b258e61ebe0b25d9cbcd4a016cb0a2ae8d92752532d98cfb27720d), - (0x1b6f5383c5a0ae5bf457e1c8e17a933e892464d33fef9e9262411e01c117d87e, 0x0c552b960e8ce365b5f2302bcc0b7ce5cdf964e6036602cfc859c8769184f619), - (0x3fa4b5cc33e30de3ac7342c84f47f4fffe7ae77dda1689c2f08050d0ab743cb1, 0x327663e39b128ec28c94486b1e5d4429000626f65230ed572c66f80406a42176), - (0x2184a7d65b5000cc5c5f178c2f4ab5b11a67fdc626771c29ade508020c8da032, 0x34c98ee1f6dfa6c1e8cd915d1efeb484206e13e5e32e13118925913568e620b7), - (0x0974ad1a3c0eb4c8d2c59cd820a82b7f28ea2f7a245008d403815131ff30879e, 0x00bb593cdf920cef4965f788d65eba3c3aa07d9718dfb62e3e385849a0d692a8), - (0x1e355d783cffccafc120f462461fb312773442762383ac444009653f3d8d4be6, 0x3c60e17b18492aa2c41798b409d2bcc1857ca57ee9d2fb0001584cedc8e141d6), - (0x0a6fe1cc1ce659681079768ca8ff94d82c7d51ef39cd99b738b144de3a3027f6, 0x30cfc2f4e0ec95f623199970d8b762647ad2d7c3591a20781ee8187702babe5f), - (0x00d87a2c430f1db50a63f18f8cf8807f4f70d3acb940d4130ba6811f8ba2d479, 0x13d5742320e1b2cecda6073b7f2bf5816b9067453deeaa829f356a65ef5621b2), - (0x3118979ade023f3977d034f86eed6506d7e0586ead81f80bc5ca01a7660ee0c9, 0x30f6731193d5c786cf61b05523c05e2664a066c2d39a685588f02883057320ad), - (0x0df51bd411d5f95da66fcc57f5e4d8dbcca3d82b08ceb61e9ff1befa074e08d3, 0x11c9092b6d02c46f173b0108854499ca4922afaf58e0734e77a6088715e84b64), - (0x24289014ede2672df8e8e32eb4e0d71709846041319fb85b1328cdb3b8764565, 0x0833de9c0b76ae816df0e41ae33daece27c63a41f2ba9abbbc7c08724211b50c), + (0x3887a29815d3a28d43c453904169e07def787baca6c9452505d2de78dd44b86f, 0x2f95e59472ab087725d62deea9c3b406ae490eff7c0318269d6f2b025934cc70), + (0x0decb727cf32e573604ae3928a761b450d9460f2a7283c8cf88a2b38b796e575, 0x044c0a88bc6aa468e75fc709f9eb21b6e309dd8a6ca62f7a3da86299141ea3a9), + (0x285e16cead69d5fef9441d4d4ac695fe8880120d209e1e631d8a4bc5f55e90e6, 0x3700fd2dfcfac5b2cb6d33c60ac79dfac3fb95518cd0aa97c75a51d62281f2c1), + (0x2dc11f4f0000da15c59cd395ea5f32b4e79783d958c290c821c89e0bcb50eaf1, 0x2c53e12ce0a2022516ef31f0224b0bc1b119861078358f78d245ba5d2f180099), + (0x17e9ee15383a32a80bd1d4b3ae53c19389748922e9bf4dbc4884e20a472b10ef, 0x1947806a1f43a3f2b675ec6d46d1678d1f18374ef89ec2654152e454346b3add), + (0x365c3f7dfaa40ec708988a9392112df6725a65eb5f70b809025ee47e9dae145b, 0x1661613acd8709d05038f6d5ca5a8508c0dd881d5879d85dcd4ea48aa12875fc), + (0x178d86d072746921f193c4a1f24e0bc252c810e7fb4ca7dbb8258f7dfb45a547, 0x153d91d5ea619d522d5a4dfdbcef80686ed1328980f1dab8aea30357ce57bd0a), + (0x35d8b6e2ebbc57d08dea9e510d450b40b5a3dd4359f9f2a888610aff29ee3c23, 0x360e4b2ce85b08d0a9576207382c26de7ad35ce33f582b6eeedd72d406ff9cef), + (0x309fd7b620087579d276623592c791f36cd3424b2230a8e7d45dcaf586ed288b, 0x0e77ac0389e400aba724c636c13e01de338bbaa8c992a0174be3504204c15a26), + (0x3bd856be3b91aea580396400bc03d30de759946141fd92cda5d975b64b4f48c7, 0x1b8fb47363e53a6235dc03a8d1ee9e81ed13e8affb1ea7fc2228df24d6d795d5), + (0x15e059df5a9a5c7e33e31e5ab4f2629efc513bf6cffca27de6b279632b8f7b06, 0x2e715a322fad2b5bf21dbcb66c26dbffa26c4c00bb2a45ae30c456daa3a75a86), + (0x307aa50de381ca85af5aa98cb4b8f3c74d0e4b49d02929dda1e4f187de911e19, 0x032f3980542054f73b659cb328e7db6cef6ac537fc9cae3b09fb7b164cb542f5), + (0x0d0c4b42b87439e56df6f41f07d93367df6f5a64d273338b0d4c8c242b908849, 0x2ab0f7f461b85408e4d007d0fcb5fa6f70a18b42c373d515f7c1e55bc20c384c), + (0x251b9a858904eb93ea4b89b3a65ceacd637db066f16d1fa896eda84434d72950, 0x2c60a586cb79bcca811be1d1092a23131a6884ccb2d809f92e94c5a4d174b167), + (0x3b09db3011d8047afc6ea9c8f3787f9b1870affc14ab64a9433508050cd41d9f, 0x3903a28dcf729c1132353036fc2819a0d0dce6ceda266a388ae401026274e99a), + (0x244649d7c67dab9df822ad21a4a3e46afcc7e020c31c54563d78b81bc4ec4f18, 0x2d5ba72aca69c6a3d5a2c3fa22c5d0c4b91b340bd757b344caae739cece6efbe), + (0x18b67544d4466429760be2b231418b43d35d79462f8743051c8e437dd710035d, 0x2ca31a6106310316da5633fe4e16e2a0affafc4541b280a9722ae86219127aa0), + (0x1bc437a546b233020c7dfb4a62ec2720348e39160b45d0a6739df91eff962d75, 0x11f3c7e8df45cbd7d0e089000d0af3192b29e31edef31414897229edbf23b9e8), + (0x36579b3969fa8bb60eb3ea82410d5b440f5cadc10bba33c2f952d6e6e0647d2c, 0x332696aaf0ece706b633aeae97764c7b867e4be79c53f1a1ebed9053716d95df), + (0x2c47c46efa6b729a216455d1887eb910e21f50bedb97d48fd76f89e3abf4e5a4, 0x20da2ca8dde7430e2b663c22d10eeb6b511e341b6a29fe9dd094ab249da4f5db), + (0x12da47c8091b8de4fc979e49f7b173d352504f18ccc461ecc5bbe4a798078ba8, 0x2d7eb25b36bb9419d081f457f4424ffc9c3b47d558063bc5c58de550c041cdf9), + (0x33a7a93684fd8f5890cc6df73bfee688ff4c778b237afac6a00807d74750f07e, 0x09ba011a18d53d7cf20a020d179ba3a2dd93c1c5fa1c5906d51c16e78c15b2e1), + (0x00f0d0db9c11b86736183d8ef1c4e621a045ad11e4ece8b32e65cd3937193ff0, 0x173d130f6ce49e3ac2be51d550dc1854fec456c82f6ddaa46bcb4c29c9be3601), + (0x334105dd96996a08df56e88261dcd87c5356cfc0f2b8ae0a9419899d5def147b, 0x09ddf24ae765eda056cf59b16ac14464240c83e253135682c02e6546f89dd396), + (0x04706edf95516db26def46d92def64d6a61cb357ac5ace44a1015c33238778fa, 0x03560c6396e34aac8e541a7811eb0b7fb1b70262af59976f933135f3bf5b21b1), + (0x0b89c282c8f2d54e66c7a11e6b4338a2f06a7c9430f7d3376328f12fa001cac5, 0x098b5c8ee6548183ccb4e60cdfee10b509db34ed136daf3530a426e8f200e89d), + (0x2f7f85b86b6adcf714d0df7878f4604d33fd319f39bd00fd5c34378247a155b5, 0x3a2f025447b83b65d148e99c93fe8bb991a81ef6d2f827f010680467361c47fc), + (0x2f6abda2aac141daa71c4840e9219e8436e17490a00d8515671b680f46ffbfab, 0x2c75aee9bdf500ef2a0168b6fa0f10c842985c5c426815e19e6f6636d6cf398a), + (0x0efdfd083488fd21fd34b09babfcea5e011189a37a52b4dc0afb218d5e604059, 0x397ed924bd171cf27208fe866cc124716d635d44f0cba045700e4136a3185179), + (0x0bb5f4d46d728f99749505115a25d8c8f281f46b5fe187a5ed722a68c1f0d8ac, 0x3e31c0c30fb0b01202f35c9336e40e91791d6b92800b2ab62bc9e0d7736a91b8), + (0x2c129e36dba381b51ffea33bf3a8ee685044217aa05865845e870971284b3d80, 0x0a07fed35f5d06923fcec6487e015d1c591d1be2d0028445227fecf733d765b0), + (0x2341c41103ad0c10434f84c82e13070b4018d325e0340f71a980600bac88dba8, 0x18965a11e1ebaea864ccd67f34faf358b5aa34690213eecda9cd94f3ea0db644), + (0x045ceb3c0119d08391456db1c30335869ee9bd9d90898c4d9f65d6486f2e3a60, 0x138805b0eab5b97ecc613077f5d91c5690f642d1d40801e6ace05a2e4947aa0c), ], permutation: VerifyingKey { commitments: [ - (0x2ad778f0e75a3dcad7c0cc2215e554f3d6fe41eabd612c487ea2708d59fb2e7e, 0x0561e9268230b53ec9cac0fd7654b3edaa3851f624c62bdae39519ae17526c06), - (0x358a21858e7f0da213959badd192b12e7bd40f6b18f5617a7fbad1f142b53c41, 0x1cc665c7a95332ea3ecb79bc35c4d672837809470691ad6a96f2eca081ca9c98), - (0x28d6468db328f1d201b3b7ca36f3affddee9dd0043d8868e34f1839742ac3190, 0x2f38eba3a82748cc28e46c1e20b7d343fdac7ef726ed6de89f6484c6070204f1), - (0x21f27b52cd9a76e1dbbf572fbfc0262007015777b68bda954f3c9db60ebb27f9, 0x0dbbf8f04e8476544a853e54093689d59935de9194eef24a0ee04d6faef9423f), - (0x0253a69e81add6bc1c2fe14bd90dab3e3c2603747dd3760c9dd1e341d96a79ed, 0x15cbe812a45a46512cc8ed493250f75a9dcaaee4be0d3bdaee8b43d74c50481f), - (0x19eb8760e7d0e6ae6d28d65627d958661cdde4e58a0aeb55a6b7017bcf723002, 0x064575794bf9bfdbc50e94b8afbbd2851ae4e12ff2809777d28fe71c235727d9), - (0x0e5c408b5224841cb4f75aec5cdb7bc95c150bbe858dbde8dbac9f72e5392462, 0x01030c69ac5fc7dd63e4e0bb1718d26f51b79dccc81e0b172e98c26e59145414), - (0x12437cb05ecff24131b52b5a55f6f143d8437c28c9d7c31eb06cfa093972a64b, 0x06e1a5e39566b4ce097a6c7dace6dcb827e54dac7d64fa79d994fb1557717614), - (0x34636ff9de412da15f41a8a006abbe8f43a5cffc94e6c3deb02f98af4fb2b8c7, 0x0270f0c3fa8cc7338f20fbcd5ec4e62799e051e0c5938d9e8c41581de8da6165), - (0x218e047b1c0a3b92c59539b3f6d9c23d34ebeeb65ca0be98f5e0e9642bdf1085, 0x20c1117f40b375688a94ff5c5c0b70004e43c7c7cd492fe8055fea081ea5ca78), - (0x2478c8226d4ede1c203fa7455b5fe28f99d5a0cb8ccdb5be4b54d5edcce974c4, 0x1ce69b76f05daeae57cd3d452370439237da89f2ddc84f7b2e35703acbf99655), - (0x08383138ecc6f2fb5459043c7666ae3df7802f1f02392af44db6ba25cd7d2c56, 0x20957d7a3f00a8589f627c5f5e471f45a84fbcbdcde00dfc97b9a97f3f723202), + (0x0a10cdf73732c92a9bfccca2a25375be5b665c4bec263a273de481f9cf0b5295, 0x3a00666c4f8b7e78be743934fcde87d488bed7562c7d9058e6216eb6c02d913f), + (0x3e39086d109bc5cacb5876df02e676d8a45de411fb6060582dfde9935d4c9eb5, 0x23b2462b03a2f4a16fc1a85afb3add387576544976a9a79d6d8fa7b6470e7433), + (0x0113540e4a2c0f5abdd94d0cac1560ae76e123321f2eb00ab54b2af05a342d24, 0x35c1e8432935ea039417295e65156588fc7073b51ff6295c698e6a80a3b54d8f), + (0x365d7cd6bfef5ffe3ad7a119137e07c833648fe14e705cb4a1cf8ee26ea1a20a, 0x18ee51fd1b2a568be36f26daaebcb86cc6938fd2d5e46f072bcc275ad709fded), + (0x39d1e52ce9c0cafc4c1a1626b1e0d8bf6a656cf8766f01f6e56fa9636d751c09, 0x3b5d5f81057a46a881474047ded09537dddb788eec68649b41d115bf97ef2a7a), + (0x2489c689eb055e5b8e7905aba42e69cf32ff72f53413a0aff1a21111b22754c0, 0x05fc261835cd944336ec75d4dd2e763693b68137f79838b7e68a144190c2142a), + (0x0be557c80085a65b612710201b738d5b78966eb79515355dab5a95fbfe486dc6, 0x0b658d0f6f39f59dbd4b422edcf73303176a8d5ff2b4126786cce72c1222bd69), + (0x3b9be0eb6f48b9b85d25517d30e5e97da5a888c9cc0440945dbaa62836a996c2, 0x15f297866cfc657bcd6f0e2214fbcb7443a3d6cf3acba1702220949539ed22bf), + (0x178fe0b2e7f7bf3008b0f2b3cf31c0cb4feee66e1a77ae310d81274e357eca08, 0x396df2ba8eb452acc143f2d240ef7d0f641cc2b9601ef2b25b5258e4107b663f), + (0x3972e2487754d8ccc6cfffa905f883c9c2338334894bd59e379a2be11b367df7, 0x2d64ca17acc3ae2a3948b80c2943a40137806607e979d43a834e66ae6e6913aa), + (0x135852e8c481f1e13f3facb7a11ffb358046ef6463757e69208f430652eda7e1, 0x3eccd189556c08b0cad7659259b7ab3336815134c1c1e26a1a55437d17d7fa93), + (0x3a4d8286e222f01440ecedf6873305351edccac685093cdc42395043a6838ebc, 0x19dace40c3d00ae4a842708359d5c2e4c67d1490676b601a57285297f94d290f), (0x21d210b41675a1eae44cbd0f3fd27d69e30716c71873f6089cee61acacd403ab, 0x2275e97c7e84f68bfaa528a9d8be4e059f7abefd80d03fbfca774e8414a9b7c1), (0x0f9e7de28e0f650d99d99d95c0fcd39c9dac9db5aa1973319f66922d6eb9f7d5, 0x1ba644ecc18ad711ddd33af7f695f6834e9f35c93d47a6a5273dabbe800fc7e6), (0x0aab3ab73afac76277cd94a891de15e42ceb09f3a9865dab5c814bebfbb4453f, 0x27119fec3736d99abeeef1ad7b857db7e754e0c158780ed3dd0cdd4dc2453e10), diff --git a/src/circuit_proof_test_case.bin b/src/circuit_proof_test_case.bin index 9dcabe5b6..e64bc990c 100644 Binary files a/src/circuit_proof_test_case.bin and b/src/circuit_proof_test_case.bin differ diff --git a/src/constants/fixed_bases.rs b/src/constants/fixed_bases.rs index af11e335f..12ab8a47e 100644 --- a/src/constants/fixed_bases.rs +++ b/src/constants/fixed_bases.rs @@ -21,8 +21,11 @@ pub const ORCHARD_PERSONALIZATION: &str = "z.cash:Orchard"; /// SWU hash-to-curve personalization for the value commitment generator pub const VALUE_COMMITMENT_PERSONALIZATION: &str = "z.cash:Orchard-cv"; +/// SWU hash-to-curve personalization for the ZSA asset base generator +pub const ZSA_ASSET_BASE_PERSONALIZATION: &str = "z.cash:OrchardZSA"; + /// SWU hash-to-curve value for the value commitment generator -pub const VALUE_COMMITMENT_V_BYTES: [u8; 1] = *b"v"; +pub const NATIVE_ASSET_BASE_V_BYTES: [u8; 1] = *b"v"; /// SWU hash-to-curve value for the value commitment generator pub const VALUE_COMMITMENT_R_BYTES: [u8; 1] = *b"r"; @@ -30,6 +33,9 @@ pub const VALUE_COMMITMENT_R_BYTES: [u8; 1] = *b"r"; /// SWU hash-to-curve personalization for the note commitment generator pub const NOTE_COMMITMENT_PERSONALIZATION: &str = "z.cash:Orchard-NoteCommit"; +/// SWU hash-to-curve personalization for the ZSA note commitment generator +pub const NOTE_ZSA_COMMITMENT_PERSONALIZATION: &str = "z.cash:ZSA-NoteCommit"; + /// SWU hash-to-curve personalization for the IVK commitment generator pub const COMMIT_IVK_PERSONALIZATION: &str = "z.cash:Orchard-CommitIvk"; diff --git a/src/constants/sinsemilla.rs b/src/constants/sinsemilla.rs index f6c6ffba6..1e43306f4 100644 --- a/src/constants/sinsemilla.rs +++ b/src/constants/sinsemilla.rs @@ -37,6 +37,18 @@ pub const Q_NOTE_COMMITMENT_M_GENERATOR: ([u8; 32], [u8; 32]) = ( ], ); +/// Generator used in SinsemillaHashToPoint for ZSA note commitment +pub const Q_NOTE_ZSA_COMMITMENT_M_GENERATOR: ([u8; 32], [u8; 32]) = ( + [ + 207, 235, 191, 45, 66, 225, 8, 126, 199, 188, 39, 26, 115, 106, 18, 2, 191, 173, 75, 9, 65, + 225, 175, 193, 224, 202, 228, 177, 3, 75, 228, 1, + ], + [ + 220, 251, 80, 86, 182, 182, 99, 67, 254, 97, 241, 22, 79, 111, 161, 176, 79, 97, 208, 98, + 116, 57, 110, 196, 25, 73, 239, 31, 196, 97, 19, 30, + ], +); + /// Generator used in SinsemillaHashToPoint for IVK commitment pub const Q_COMMIT_IVK_M_GENERATOR: ([u8; 32], [u8; 32]) = ( [ @@ -78,6 +90,7 @@ pub(crate) fn i2lebsp_k(int: usize) -> [bool; K] { #[derive(Clone, Debug, Eq, PartialEq)] pub enum OrchardHashDomains { NoteCommit, + NoteZsaCommit, CommitIvk, MerkleCrh, } @@ -96,6 +109,11 @@ impl HashDomains for OrchardHashDomains { pallas::Base::from_repr(Q_NOTE_COMMITMENT_M_GENERATOR.1).unwrap(), ) .unwrap(), + OrchardHashDomains::NoteZsaCommit => pallas::Affine::from_xy( + pallas::Base::from_repr(Q_NOTE_ZSA_COMMITMENT_M_GENERATOR.0).unwrap(), + pallas::Base::from_repr(Q_NOTE_ZSA_COMMITMENT_M_GENERATOR.1).unwrap(), + ) + .unwrap(), OrchardHashDomains::MerkleCrh => pallas::Affine::from_xy( pallas::Base::from_repr(Q_MERKLE_CRH.0).unwrap(), pallas::Base::from_repr(Q_MERKLE_CRH.1).unwrap(), @@ -108,6 +126,7 @@ impl HashDomains for OrchardHashDomains { #[derive(Clone, Debug, Eq, PartialEq)] pub enum OrchardCommitDomains { NoteCommit, + NoteZsaCommit, CommitIvk, } @@ -115,6 +134,8 @@ impl CommitDomains for Or fn r(&self) -> OrchardFixedBasesFull { match self { Self::NoteCommit => OrchardFixedBasesFull::NoteCommitR, + // For ZSA note commitment, we use the same `R` than for ZEC note commitment. + Self::NoteZsaCommit => OrchardFixedBasesFull::NoteCommitR, Self::CommitIvk => OrchardFixedBasesFull::CommitIvkR, } } @@ -122,6 +143,7 @@ impl CommitDomains for Or fn hash_domain(&self) -> OrchardHashDomains { match self { Self::NoteCommit => OrchardHashDomains::NoteCommit, + Self::NoteZsaCommit => OrchardHashDomains::NoteZsaCommit, Self::CommitIvk => OrchardHashDomains::CommitIvk, } } @@ -131,7 +153,10 @@ impl CommitDomains for Or mod tests { use super::*; use crate::constants::{ - fixed_bases::{COMMIT_IVK_PERSONALIZATION, NOTE_COMMITMENT_PERSONALIZATION}, + fixed_bases::{ + COMMIT_IVK_PERSONALIZATION, NOTE_COMMITMENT_PERSONALIZATION, + NOTE_ZSA_COMMITMENT_PERSONALIZATION, + }, sinsemilla::MERKLE_CRH_PERSONALIZATION, }; use group::{ff::PrimeField, Curve}; @@ -192,6 +217,22 @@ mod tests { ); } + #[test] + fn q_note_zsa_commitment_m() { + let domain = CommitDomain::new(NOTE_ZSA_COMMITMENT_PERSONALIZATION); + let point = domain.Q(); + let coords = point.to_affine().coordinates().unwrap(); + + assert_eq!( + *coords.x(), + pallas::Base::from_repr(Q_NOTE_ZSA_COMMITMENT_M_GENERATOR.0).unwrap() + ); + assert_eq!( + *coords.y(), + pallas::Base::from_repr(Q_NOTE_ZSA_COMMITMENT_M_GENERATOR.1).unwrap() + ); + } + #[test] fn q_commit_ivk_m() { let domain = CommitDomain::new(COMMIT_IVK_PERSONALIZATION); diff --git a/src/issuance.rs b/src/issuance.rs new file mode 100644 index 000000000..4fade4b74 --- /dev/null +++ b/src/issuance.rs @@ -0,0 +1,1469 @@ +//! Structs related to issuance bundles and the associated logic. +use blake2b_simd::Hash as Blake2bHash; +use group::Group; +use k256::schnorr; +use nonempty::NonEmpty; +use rand::RngCore; +use std::collections::HashSet; +use std::fmt; + +use crate::bundle::commitments::{hash_issue_bundle_auth_data, hash_issue_bundle_txid_data}; +use crate::issuance::Error::{ + AssetBaseCannotBeIdentityPoint, IssueActionNotFound, IssueActionPreviouslyFinalizedAssetBase, + IssueActionWithoutNoteNotFinalized, IssueBundleIkMismatchAssetBase, + IssueBundleInvalidSignature, ValueSumOverflow, WrongAssetDescSize, +}; +use crate::keys::{IssuanceAuthorizingKey, IssuanceValidatingKey}; +use crate::note::asset_base::is_asset_desc_of_valid_size; +use crate::note::{AssetBase, Nullifier, Rho}; + +use crate::value::{NoteValue, ValueSum}; +use crate::{Address, Note}; + +use crate::supply_info::{AssetSupply, SupplyInfo}; + +/// A bundle of actions to be applied to the ledger. +#[derive(Debug, Clone, PartialEq, Eq)] +pub struct IssueBundle { + /// The issuer key for the note being created. + ik: IssuanceValidatingKey, + /// The list of issue actions that make up this bundle. + actions: NonEmpty, + /// The authorization for this action. + authorization: T, +} + +/// An issue action applied to the global ledger. +/// +/// Externally, this creates new zsa notes (adding a commitment to the global ledger). +#[derive(Debug, Clone, PartialEq, Eq)] +pub struct IssueAction { + /// Asset description for verification. + asset_desc: String, + /// The newly issued notes. + notes: Vec, + /// `finalize` will prevent further issuance of the same asset type. + finalize: bool, +} + +/// The parameters required to add a Note into an IssueAction. +#[derive(Debug)] +pub struct IssueInfo { + /// The recipient of the funds. + pub recipient: Address, + /// The value of this note. + pub value: NoteValue, +} + +impl IssueAction { + /// Constructs a new `IssueAction`. + pub fn new_with_flags(asset_desc: String, notes: Vec, flags: u8) -> Option { + let finalize = match flags { + 0b0000_0000 => false, + 0b0000_0001 => true, + _ => return None, + }; + Some(IssueAction { + asset_desc, + notes, + finalize, + }) + } + + /// Constructs an `IssueAction` from its constituent parts. + pub fn from_parts(asset_desc: String, notes: Vec, finalize: bool) -> Self { + IssueAction { + asset_desc, + notes, + finalize, + } + } + + /// Returns the asset description for the note being created. + pub fn asset_desc(&self) -> &str { + &self.asset_desc + } + + /// Returns the issued notes. + pub fn notes(&self) -> &Vec { + &self.notes + } + + /// Returns whether the asset type was finalized in this action. + pub fn is_finalized(&self) -> bool { + self.finalize + } + + /// Verifies and computes the new asset supply for an `IssueAction`. + /// + /// This function calculates the total value (supply) of the asset by summing the values + /// of all its notes and ensures that all note types are equal. It returns the asset and + /// its supply as a tuple (`AssetBase`, `AssetSupply`) or an error if the asset was not + /// properly derived or an overflow occurred during the supply amount calculation. + /// + /// # Arguments + /// + /// * `ik` - A reference to the `IssuanceValidatingKey` used for deriving the asset. + /// + /// # Returns + /// + /// A `Result` containing a tuple with an `AssetBase` and an `AssetSupply`, or an `Error`. + /// + /// # Errors + /// + /// This function may return an error in any of the following cases: + /// + /// * `ValueSumOverflow`: If the total amount value of all notes in the `IssueAction` overflows. + /// + /// * `IssueBundleIkMismatchAssetBase`: If the provided `ik` is not used to derive the + /// `AssetBase` for **all** internal notes. + /// + /// * `IssueActionWithoutNoteNotFinalized`:If the `IssueAction` contains no note and is not finalized. + fn verify_supply(&self, ik: &IssuanceValidatingKey) -> Result<(AssetBase, AssetSupply), Error> { + if self.notes.is_empty() && !self.is_finalized() { + return Err(IssueActionWithoutNoteNotFinalized); + } + + let issue_asset = AssetBase::derive(ik, &self.asset_desc); + + // Calculate the value of the asset as a sum of values of all its notes + // and ensure all note types are equal the asset derived from asset_desc and ik. + let value_sum = self + .notes + .iter() + .try_fold(ValueSum::zero(), |value_sum, ¬e| { + //The asset base should not be the identity point of the Pallas curve. + if bool::from(note.asset().cv_base().is_identity()) { + return Err(AssetBaseCannotBeIdentityPoint); + } + + // All assets should be derived correctly + note.asset() + .eq(&issue_asset) + .then_some(()) + .ok_or(IssueBundleIkMismatchAssetBase)?; + + // The total amount should not overflow + (value_sum + note.value()).ok_or(ValueSumOverflow) + })?; + + Ok(( + issue_asset, + AssetSupply::new(value_sum, self.is_finalized()), + )) + } + + /// Serialize `finalize` flag to a byte + #[allow(clippy::bool_to_int_with_if)] + pub fn flags(&self) -> u8 { + if self.finalize { + 0b0000_0001 + } else { + 0b0000_0000 + } + } +} + +/// Defines the authorization type of an Issue bundle. +pub trait IssueAuth: fmt::Debug + Clone {} + +/// Marker for an unauthorized bundle with no proofs or signatures. +#[derive(Debug, Clone)] +pub struct Unauthorized; + +/// Marker for an unauthorized bundle with injected sighash. +#[derive(Debug, Clone)] +pub struct Prepared { + sighash: [u8; 32], +} + +/// Marker for an authorized bundle. +#[derive(Debug, Clone, PartialEq, Eq)] +pub struct Signed { + signature: schnorr::Signature, +} + +impl Signed { + /// Returns the signature for this authorization. + pub fn signature(&self) -> &schnorr::Signature { + &self.signature + } +} + +impl IssueAuth for Unauthorized {} +impl IssueAuth for Prepared {} +impl IssueAuth for Signed {} + +impl IssueBundle { + /// Returns the issuer verification key for the bundle. + pub fn ik(&self) -> &IssuanceValidatingKey { + &self.ik + } + /// Return the actions for a given `IssueBundle`. + pub fn actions(&self) -> &NonEmpty { + &self.actions + } + /// Return the notes from all actions for a given `IssueBundle`. + pub fn get_all_notes(&self) -> Vec { + self.actions + .iter() + .flat_map(|action| action.notes.clone().into_iter()) + .collect() + } + + /// Returns the authorization for this action. + pub fn authorization(&self) -> &T { + &self.authorization + } + + /// Find an action by `ik` and `asset_desc` for a given `IssueBundle`. + pub fn get_action(&self, asset_desc: String) -> Option<&IssueAction> { + self.actions.iter().find(|a| a.asset_desc.eq(&asset_desc)) + } + + /// Find an action by `asset` for a given `IssueBundle`. + pub fn get_action_by_type(&self, asset: AssetBase) -> Option<&IssueAction> { + let action = self + .actions + .iter() + .find(|a| AssetBase::derive(&self.ik, &a.asset_desc).eq(&asset)); + action + } + + /// Computes a commitment to the effects of this bundle, suitable for inclusion within + /// a transaction ID. + pub fn commitment(&self) -> IssueBundleCommitment { + IssueBundleCommitment(hash_issue_bundle_txid_data(self)) + } + + /// Constructs an `IssueBundle` from its constituent parts. + pub fn from_parts( + ik: IssuanceValidatingKey, + actions: NonEmpty, + authorization: T, + ) -> Self { + IssueBundle { + ik, + actions, + authorization, + } + } +} + +impl IssueBundle { + /// Constructs a new `IssueBundle`. + /// + /// If issue_info is None, the new `IssueBundle` will contain one `IssueAction` without notes + /// and with `finalize` set to true. + /// Otherwise, the new `IssueBundle` will contain one `IssueAction with one note created from + /// issue_info values and with `finalize` set to false. In this created note, rho will be + /// randomly sampled, similar to dummy note generation. + /// + /// # Errors + /// + /// This function may return an error in any of the following cases: + /// + /// * `WrongAssetDescSize`: If `asset_desc` is empty or longer than 512 bytes. + pub fn new( + ik: IssuanceValidatingKey, + asset_desc: String, + issue_info: Option, + mut rng: impl RngCore, + ) -> Result<(IssueBundle, AssetBase), Error> { + if !is_asset_desc_of_valid_size(&asset_desc) { + return Err(WrongAssetDescSize); + } + + let asset = AssetBase::derive(&ik, &asset_desc); + + let action = match issue_info { + None => IssueAction { + asset_desc, + notes: vec![], + finalize: true, + }, + Some(issue_info) => { + let note = Note::new( + issue_info.recipient, + issue_info.value, + asset, + Rho::from_nf_old(Nullifier::dummy(&mut rng)), + &mut rng, + ); + + IssueAction { + asset_desc, + notes: vec![note], + finalize: false, + } + } + }; + + Ok(( + IssueBundle { + ik, + actions: NonEmpty::new(action), + authorization: Unauthorized, + }, + asset, + )) + } + + /// Add a new note to the `IssueBundle`. + /// + /// Rho will be randomly sampled, similar to dummy note generation. + /// + /// # Errors + /// + /// This function may return an error in any of the following cases: + /// + /// * `WrongAssetDescSize`: If `asset_desc` is empty or longer than 512 bytes. + pub fn add_recipient( + &mut self, + asset_desc: String, + recipient: Address, + value: NoteValue, + mut rng: impl RngCore, + ) -> Result { + if !is_asset_desc_of_valid_size(&asset_desc) { + return Err(WrongAssetDescSize); + } + + let asset = AssetBase::derive(&self.ik, &asset_desc); + + let note = Note::new( + recipient, + value, + asset, + Rho::from_nf_old(Nullifier::dummy(&mut rng)), + &mut rng, + ); + + let action = self + .actions + .iter_mut() + .find(|issue_action| issue_action.asset_desc.eq(&asset_desc)); + + match action { + Some(action) => { + // Append to an existing IssueAction. + action.notes.push(note); + } + None => { + // Insert a new IssueAction. + self.actions.push(IssueAction { + asset_desc, + notes: vec![note], + finalize: false, + }); + } + }; + + Ok(asset) + } + + /// Finalizes a given `IssueAction` + /// + /// # Panics + /// + /// Panics if `asset_desc` is empty or longer than 512 bytes. + pub fn finalize_action(&mut self, asset_desc: String) -> Result<(), Error> { + if !is_asset_desc_of_valid_size(&asset_desc) { + return Err(WrongAssetDescSize); + } + + match self + .actions + .iter_mut() + .find(|issue_action| issue_action.asset_desc.eq(&asset_desc)) + { + Some(issue_action) => { + issue_action.finalize = true; + } + None => { + return Err(IssueActionNotFound); + } + } + + Ok(()) + } + + /// Loads the sighash into the bundle, as preparation for signing. + pub fn prepare(self, sighash: [u8; 32]) -> IssueBundle { + IssueBundle { + ik: self.ik, + actions: self.actions, + authorization: Prepared { sighash }, + } + } +} + +impl IssueBundle { + /// Sign the `IssueBundle`. + /// The call makes sure that the provided `isk` matches the `ik` and the derived `asset` for each note in the bundle. + pub fn sign(self, isk: &IssuanceAuthorizingKey) -> Result, Error> { + let expected_ik: IssuanceValidatingKey = (isk).into(); + + // Make sure the `expected_ik` matches the `asset` for all notes. + self.actions.iter().try_for_each(|action| { + action.verify_supply(&expected_ik)?; + Ok(()) + })?; + + // Make sure the signature can be generated. + let signature = isk + .try_sign(&self.authorization.sighash) + .map_err(|_| IssueBundleInvalidSignature)?; + + Ok(IssueBundle { + ik: self.ik, + actions: self.actions, + authorization: Signed { signature }, + }) + } +} + +/// A commitment to a bundle of actions. +/// +/// This commitment is non-malleable, in the sense that a bundle's commitment will only +/// change if the effects of the bundle are altered. +#[derive(Debug)] +pub struct IssueBundleCommitment(pub Blake2bHash); + +impl From for [u8; 32] { + /// Serializes issue bundle commitment as byte array + fn from(commitment: IssueBundleCommitment) -> Self { + // The commitment uses BLAKE2b-256. + commitment.0.as_bytes().try_into().unwrap() + } +} + +/// A commitment to the authorizing data within a bundle of actions. +#[derive(Debug)] +pub struct IssueBundleAuthorizingCommitment(pub Blake2bHash); + +impl IssueBundle { + /// Computes a commitment to the authorizing data within for this bundle. + /// + /// This together with `IssueBundle::commitment` bind the entire bundle. + pub fn authorizing_commitment(&self) -> IssueBundleAuthorizingCommitment { + IssueBundleAuthorizingCommitment(hash_issue_bundle_auth_data(self)) + } +} + +/// Validation for Orchard IssueBundles +/// +/// A set of previously finalized asset types must be provided in `finalized` argument. +/// +/// The following checks are performed: +/// * For the `IssueBundle`: +/// * the Signature on top of the provided `sighash` verifies correctly. +/// * For each `IssueAction`: +/// * Asset description size is collect. +/// * `AssetBase` for the `IssueAction` has not been previously finalized. +/// * For each `Note` inside an `IssueAction`: +/// * All notes have the same, correct `AssetBase`. +/// +// # Returns +/// +/// A Result containing a SupplyInfo struct, which stores supply information in a HashMap. +/// The HashMap uses AssetBase as the key, and an AssetSupply struct as the value. The +/// AssetSupply contains a ValueSum (representing the total value of all notes for the asset) +/// and a bool indicating whether the asset is finalized. +/// +/// # Errors +/// +/// * `IssueBundleInvalidSignature`: This error occurs if the signature verification +/// for the provided `sighash` fails. +/// * `WrongAssetDescSize`: This error is raised if the asset description size for any +/// asset in the bundle is incorrect. +/// * `IssueActionPreviouslyFinalizedAssetBase`: This error occurs if the asset has already been +/// finalized (inserted into the `finalized` collection). +/// * `ValueSumOverflow`: This error occurs if an overflow happens during the calculation of +/// the value sum for the notes in the asset. +/// * `IssueBundleIkMismatchAssetBase`: This error is raised if the `AssetBase` derived from +/// the `ik` (Issuance Validating Key) and the `asset_desc` (Asset Description) does not match +/// the expected `AssetBase`. +pub fn verify_issue_bundle( + bundle: &IssueBundle, + sighash: [u8; 32], + finalized: &HashSet, // The finalization set. +) -> Result { + bundle + .ik + .verify(&sighash, &bundle.authorization.signature) + .map_err(|_| IssueBundleInvalidSignature)?; + + let supply_info = + bundle + .actions() + .iter() + .try_fold(SupplyInfo::new(), |mut supply_info, action| { + if !is_asset_desc_of_valid_size(action.asset_desc()) { + return Err(WrongAssetDescSize); + } + + let (asset, supply) = action.verify_supply(bundle.ik())?; + + // Fail if the asset was previously finalized. + if finalized.contains(&asset) { + return Err(IssueActionPreviouslyFinalizedAssetBase(asset)); + } + + supply_info.add_supply(asset, supply)?; + + Ok(supply_info) + })?; + + Ok(supply_info) +} + +/// Errors produced during the issuance process +#[derive(Debug, PartialEq, Eq)] +pub enum Error { + /// The requested IssueAction not exists in the bundle. + IssueActionNotFound, + /// The provided `isk` and the derived `ik` does not match at least one note type. + IssueBundleIkMismatchAssetBase, + /// `asset_desc` should be between 1 and 512 bytes. + WrongAssetDescSize, + /// The `IssueAction` is not finalized but contains no notes. + IssueActionWithoutNoteNotFinalized, + /// The `AssetBase` is the Pallas identity point, which is invalid. + AssetBaseCannotBeIdentityPoint, + + /// Verification errors: + /// Invalid signature. + IssueBundleInvalidSignature, + /// The provided `AssetBase` has been previously finalized. + IssueActionPreviouslyFinalizedAssetBase(AssetBase), + + /// Overflow error occurred while calculating the value of the asset + ValueSumOverflow, +} + +impl fmt::Display for Error { + fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result { + match self { + IssueActionNotFound => { + write!(f, "the requested IssueAction not exists in the bundle.") + } + IssueBundleIkMismatchAssetBase => { + write!( + f, + "the provided `isk` and the derived `ik` do not match at least one note type" + ) + } + WrongAssetDescSize => { + write!(f, "`asset_desc` should be between 1 and 512 bytes") + } + IssueActionWithoutNoteNotFinalized => { + write!( + f, + "this `IssueAction` contains no notes but is not finalized" + ) + } + AssetBaseCannotBeIdentityPoint => { + write!( + f, + "the AssetBase is the identity point of the Pallas curve, which is invalid." + ) + } + IssueBundleInvalidSignature => { + write!(f, "invalid signature") + } + IssueActionPreviouslyFinalizedAssetBase(_) => { + write!(f, "the provided `AssetBase` has been previously finalized") + } + ValueSumOverflow => { + write!( + f, + "overflow error occurred while calculating the value of the asset" + ) + } + } + } +} + +#[cfg(test)] +mod tests { + use super::{AssetSupply, IssueBundle, IssueInfo}; + use crate::issuance::Error::{ + AssetBaseCannotBeIdentityPoint, IssueActionNotFound, + IssueActionPreviouslyFinalizedAssetBase, IssueBundleIkMismatchAssetBase, + IssueBundleInvalidSignature, WrongAssetDescSize, + }; + use crate::issuance::{verify_issue_bundle, IssueAction, Signed, Unauthorized}; + use crate::keys::{ + FullViewingKey, IssuanceAuthorizingKey, IssuanceValidatingKey, Scope, SpendingKey, + }; + use crate::note::{AssetBase, Nullifier, Rho}; + use crate::value::{NoteValue, ValueSum}; + use crate::{Address, Note}; + use group::{Group, GroupEncoding}; + use nonempty::NonEmpty; + use pasta_curves::pallas::{Point, Scalar}; + use rand::rngs::OsRng; + use rand::RngCore; + use std::collections::HashSet; + + fn setup_params() -> ( + OsRng, + IssuanceAuthorizingKey, + IssuanceValidatingKey, + Address, + [u8; 32], + ) { + let mut rng = OsRng; + + let isk = IssuanceAuthorizingKey::random(); + let ik: IssuanceValidatingKey = (&isk).into(); + + let fvk = FullViewingKey::from(&SpendingKey::random(&mut rng)); + let recipient = fvk.address_at(0u32, Scope::External); + + let mut sighash = [0u8; 32]; + rng.fill_bytes(&mut sighash); + + (rng, isk, ik, recipient, sighash) + } + + fn setup_verify_supply_test_params( + note1_value: u64, + note2_value: u64, + note1_asset_desc: &str, + note2_asset_desc: Option<&str>, // if None, both notes use the same asset + finalize: bool, + ) -> (IssuanceValidatingKey, AssetBase, IssueAction) { + let (mut rng, _, ik, recipient, _) = setup_params(); + + let asset = AssetBase::derive(&ik, note1_asset_desc); + let note2_asset = note2_asset_desc.map_or(asset, |desc| AssetBase::derive(&ik, desc)); + + let note1 = Note::new( + recipient, + NoteValue::from_raw(note1_value), + asset, + Rho::from_nf_old(Nullifier::dummy(&mut rng)), + &mut rng, + ); + + let note2 = Note::new( + recipient, + NoteValue::from_raw(note2_value), + note2_asset, + Rho::from_nf_old(Nullifier::dummy(&mut rng)), + &mut rng, + ); + + ( + ik, + asset, + IssueAction::from_parts(note1_asset_desc.into(), vec![note1, note2], finalize), + ) + } + + // This function computes the identity point on the Pallas curve and returns an Asset Base with that value. + fn identity_point() -> AssetBase { + let identity_point = (Point::generator() * -Scalar::one()) + Point::generator(); + AssetBase::from_bytes(&identity_point.to_bytes()).unwrap() + } + + fn identity_point_test_params( + note1_value: u64, + note2_value: u64, + ) -> (IssuanceAuthorizingKey, IssueBundle, [u8; 32]) { + let (mut rng, isk, ik, recipient, sighash) = setup_params(); + + let note1 = Note::new( + recipient, + NoteValue::from_raw(note1_value), + identity_point(), + Rho::from_nf_old(Nullifier::dummy(&mut rng)), + &mut rng, + ); + + let note2 = Note::new( + recipient, + NoteValue::from_raw(note2_value), + identity_point(), + Rho::from_nf_old(Nullifier::dummy(&mut rng)), + &mut rng, + ); + + let action = + IssueAction::from_parts("arbitrary asset_desc".into(), vec![note1, note2], false); + + let bundle = IssueBundle::from_parts(ik, NonEmpty::new(action), Unauthorized); + + (isk, bundle, sighash) + } + + #[test] + fn verify_supply_valid() { + let (ik, test_asset, action) = + setup_verify_supply_test_params(10, 20, "Asset 1", None, false); + + let result = action.verify_supply(&ik); + + assert!(result.is_ok()); + + let (asset, supply) = result.unwrap(); + + assert_eq!(asset, test_asset); + assert_eq!(supply.amount, ValueSum::from_raw(30)); + assert!(!supply.is_finalized); + } + + #[test] + fn verify_supply_invalid_for_asset_base_as_identity() { + let (_, bundle, _) = identity_point_test_params(10, 20); + + assert_eq!( + bundle.actions.head.verify_supply(&bundle.ik), + Err(AssetBaseCannotBeIdentityPoint) + ); + } + + #[test] + fn verify_supply_finalized() { + let (ik, test_asset, action) = + setup_verify_supply_test_params(10, 20, "Asset 1", None, true); + + let result = action.verify_supply(&ik); + + assert!(result.is_ok()); + + let (asset, supply) = result.unwrap(); + + assert_eq!(asset, test_asset); + assert_eq!(supply.amount, ValueSum::from_raw(30)); + assert!(supply.is_finalized); + } + + #[test] + fn verify_supply_incorrect_asset_base() { + let (ik, _, action) = + setup_verify_supply_test_params(10, 20, "Asset 1", Some("Asset 2"), false); + + assert_eq!( + action.verify_supply(&ik), + Err(IssueBundleIkMismatchAssetBase) + ); + } + + #[test] + fn verify_supply_ik_mismatch_asset_base() { + let (_, _, action) = setup_verify_supply_test_params(10, 20, "Asset 1", None, false); + let (_, _, ik, _, _) = setup_params(); + + assert_eq!( + action.verify_supply(&ik), + Err(IssueBundleIkMismatchAssetBase) + ); + } + + #[test] + fn issue_bundle_basic() { + let (rng, _, ik, recipient, _) = setup_params(); + + let str = String::from("Halo"); + let str2 = String::from("Halo2"); + + assert_eq!( + IssueBundle::new( + ik.clone(), + String::from_utf8(vec![b'X'; 513]).unwrap(), + Some(IssueInfo { + recipient, + value: NoteValue::unsplittable() + }), + rng, + ) + .unwrap_err(), + WrongAssetDescSize + ); + + assert_eq!( + IssueBundle::new( + ik.clone(), + "".to_string(), + Some(IssueInfo { + recipient, + value: NoteValue::unsplittable() + }), + rng, + ) + .unwrap_err(), + WrongAssetDescSize + ); + + let (mut bundle, asset) = IssueBundle::new( + ik, + str.clone(), + Some(IssueInfo { + recipient, + value: NoteValue::from_raw(5), + }), + rng, + ) + .unwrap(); + + let another_asset = bundle + .add_recipient(str, recipient, NoteValue::from_raw(10), rng) + .unwrap(); + assert_eq!(asset, another_asset); + + let third_asset = bundle + .add_recipient(str2.clone(), recipient, NoteValue::from_raw(15), rng) + .unwrap(); + assert_ne!(asset, third_asset); + + let actions = bundle.actions(); + assert_eq!(actions.len(), 2); + + let action = bundle.get_action_by_type(asset).unwrap(); + assert_eq!(action.notes.len(), 2); + assert_eq!(action.notes.first().unwrap().value().inner(), 5); + assert_eq!(action.notes.first().unwrap().asset(), asset); + assert_eq!(action.notes.first().unwrap().recipient(), recipient); + + assert_eq!(action.notes.get(1).unwrap().value().inner(), 10); + assert_eq!(action.notes.get(1).unwrap().asset(), asset); + assert_eq!(action.notes.get(1).unwrap().recipient(), recipient); + + let action2 = bundle.get_action(str2).unwrap(); + assert_eq!(action2.notes.len(), 1); + assert_eq!(action2.notes().first().unwrap().value().inner(), 15); + assert_eq!(action2.notes().first().unwrap().asset(), third_asset); + } + + #[test] + fn issue_bundle_finalize_asset() { + let (rng, _, ik, recipient, _) = setup_params(); + + let (mut bundle, _) = IssueBundle::new( + ik, + String::from("NFT"), + Some(IssueInfo { + recipient, + value: NoteValue::from_raw(u64::MIN), + }), + rng, + ) + .expect("Should properly add recipient"); + + bundle + .finalize_action(String::from("NFT")) + .expect("Should finalize properly"); + + assert_eq!( + bundle + .finalize_action(String::from("Another NFT")) + .unwrap_err(), + IssueActionNotFound + ); + + assert_eq!( + bundle + .finalize_action(String::from_utf8(vec![b'X'; 513]).unwrap()) + .unwrap_err(), + WrongAssetDescSize + ); + + assert_eq!( + bundle.finalize_action("".to_string()).unwrap_err(), + WrongAssetDescSize + ); + } + + #[test] + fn issue_bundle_prepare() { + let (rng, _, ik, recipient, sighash) = setup_params(); + + let (bundle, _) = IssueBundle::new( + ik, + String::from("Frost"), + Some(IssueInfo { + recipient, + value: NoteValue::from_raw(5), + }), + rng, + ) + .unwrap(); + + let prepared = bundle.prepare(sighash); + assert_eq!(prepared.authorization().sighash, sighash); + } + + #[test] + fn issue_bundle_sign() { + let (rng, isk, ik, recipient, sighash) = setup_params(); + + let (bundle, _) = IssueBundle::new( + ik.clone(), + String::from("Sign"), + Some(IssueInfo { + recipient, + value: NoteValue::from_raw(5), + }), + rng, + ) + .unwrap(); + + let signed = bundle.prepare(sighash).sign(&isk).unwrap(); + + ik.verify(&sighash, &signed.authorization.signature) + .expect("signature should be valid"); + } + + #[test] + fn issue_bundle_invalid_isk_for_signature() { + let (rng, _, ik, recipient, _) = setup_params(); + + let (bundle, _) = IssueBundle::new( + ik, + String::from("IssueBundle"), + Some(IssueInfo { + recipient, + value: NoteValue::from_raw(5), + }), + rng, + ) + .unwrap(); + + let wrong_isk: IssuanceAuthorizingKey = IssuanceAuthorizingKey::random(); + + let err = bundle + .prepare([0; 32]) + .sign(&wrong_isk) + .expect_err("should not be able to sign"); + + assert_eq!(err, IssueBundleIkMismatchAssetBase); + } + + #[test] + fn issue_bundle_incorrect_asset_for_signature() { + let (mut rng, isk, ik, recipient, _) = setup_params(); + + // Create a bundle with "normal" note + let (mut bundle, _) = IssueBundle::new( + ik, + String::from("IssueBundle"), + Some(IssueInfo { + recipient, + value: NoteValue::from_raw(5), + }), + rng, + ) + .unwrap(); + + // Add "bad" note + let note = Note::new( + recipient, + NoteValue::from_raw(5), + AssetBase::derive(bundle.ik(), "zsa_asset"), + Rho::from_nf_old(Nullifier::dummy(&mut rng)), + &mut rng, + ); + bundle.actions.first_mut().notes.push(note); + + let err = bundle + .prepare([0; 32]) + .sign(&isk) + .expect_err("should not be able to sign"); + + assert_eq!(err, IssueBundleIkMismatchAssetBase); + } + + #[test] + fn issue_bundle_verify() { + let (rng, isk, ik, recipient, sighash) = setup_params(); + + let (bundle, _) = IssueBundle::new( + ik, + String::from("Verify"), + Some(IssueInfo { + recipient, + value: NoteValue::from_raw(5), + }), + rng, + ) + .unwrap(); + + let signed = bundle.prepare(sighash).sign(&isk).unwrap(); + let prev_finalized = &mut HashSet::new(); + + let supply_info = verify_issue_bundle(&signed, sighash, prev_finalized).unwrap(); + + supply_info.update_finalization_set(prev_finalized); + + assert!(prev_finalized.is_empty()); + } + + #[test] + fn issue_bundle_verify_with_finalize() { + let (rng, isk, ik, recipient, sighash) = setup_params(); + + let (mut bundle, _) = IssueBundle::new( + ik.clone(), + String::from("Verify with finalize"), + Some(IssueInfo { + recipient, + value: NoteValue::from_raw(7), + }), + rng, + ) + .unwrap(); + + bundle + .finalize_action(String::from("Verify with finalize")) + .unwrap(); + + let signed = bundle.prepare(sighash).sign(&isk).unwrap(); + let prev_finalized = &mut HashSet::new(); + + let supply_info = verify_issue_bundle(&signed, sighash, prev_finalized).unwrap(); + + supply_info.update_finalization_set(prev_finalized); + + assert_eq!(prev_finalized.len(), 1); + assert!(prev_finalized.contains(&AssetBase::derive(&ik, "Verify with finalize"))); + } + + #[test] + fn issue_bundle_verify_with_supply_info() { + let (rng, isk, ik, recipient, sighash) = setup_params(); + + let asset1_desc = "Verify with supply info 1"; + let asset2_desc = "Verify with supply info 2"; + let asset3_desc = "Verify with supply info 3"; + + let asset1_base = AssetBase::derive(&ik, &String::from(asset1_desc)); + let asset2_base = AssetBase::derive(&ik, &String::from(asset2_desc)); + let asset3_base = AssetBase::derive(&ik, &String::from(asset3_desc)); + + let (mut bundle, _) = IssueBundle::new( + ik, + String::from(asset1_desc), + Some(IssueInfo { + recipient, + value: NoteValue::from_raw(7), + }), + rng, + ) + .unwrap(); + + bundle + .add_recipient( + String::from(asset1_desc), + recipient, + NoteValue::from_raw(8), + rng, + ) + .unwrap(); + + bundle.finalize_action(String::from(asset1_desc)).unwrap(); + + bundle + .add_recipient( + String::from(asset2_desc), + recipient, + NoteValue::from_raw(10), + rng, + ) + .unwrap(); + + bundle.finalize_action(String::from(asset2_desc)).unwrap(); + + bundle + .add_recipient( + String::from(asset3_desc), + recipient, + NoteValue::from_raw(5), + rng, + ) + .unwrap(); + + let signed = bundle.prepare(sighash).sign(&isk).unwrap(); + let prev_finalized = &mut HashSet::new(); + + let supply_info = verify_issue_bundle(&signed, sighash, prev_finalized).unwrap(); + + supply_info.update_finalization_set(prev_finalized); + + assert_eq!(prev_finalized.len(), 2); + + assert!(prev_finalized.contains(&asset1_base)); + assert!(prev_finalized.contains(&asset2_base)); + assert!(!prev_finalized.contains(&asset3_base)); + + assert_eq!(supply_info.assets.len(), 3); + + assert_eq!( + supply_info.assets.get(&asset1_base), + Some(&AssetSupply::new(ValueSum::from_raw(15), true)) + ); + assert_eq!( + supply_info.assets.get(&asset2_base), + Some(&AssetSupply::new(ValueSum::from_raw(10), true)) + ); + assert_eq!( + supply_info.assets.get(&asset3_base), + Some(&AssetSupply::new(ValueSum::from_raw(5), false)) + ); + } + + #[test] + fn issue_bundle_verify_fail_previously_finalized() { + let (rng, isk, ik, recipient, sighash) = setup_params(); + + let (bundle, _) = IssueBundle::new( + ik.clone(), + String::from("already final"), + Some(IssueInfo { + recipient, + value: NoteValue::from_raw(5), + }), + rng, + ) + .unwrap(); + + let signed = bundle.prepare(sighash).sign(&isk).unwrap(); + let prev_finalized = &mut HashSet::new(); + + let final_type = AssetBase::derive(&ik, &String::from("already final")); + + prev_finalized.insert(final_type); + + assert_eq!( + verify_issue_bundle(&signed, sighash, prev_finalized).unwrap_err(), + IssueActionPreviouslyFinalizedAssetBase(final_type) + ); + } + + #[test] + fn issue_bundle_verify_fail_bad_signature() { + // we want to inject "bad" signatures for test purposes. + impl IssueBundle { + pub fn set_authorization(&mut self, authorization: Signed) { + self.authorization = authorization; + } + } + + let (rng, isk, ik, recipient, sighash) = setup_params(); + + let (bundle, _) = IssueBundle::new( + ik, + String::from("bad sig"), + Some(IssueInfo { + recipient, + value: NoteValue::from_raw(5), + }), + rng, + ) + .unwrap(); + + let wrong_isk: IssuanceAuthorizingKey = IssuanceAuthorizingKey::random(); + + let mut signed = bundle.prepare(sighash).sign(&isk).unwrap(); + + signed.set_authorization(Signed { + signature: wrong_isk.try_sign(&sighash).unwrap(), + }); + + let prev_finalized = &HashSet::new(); + + assert_eq!( + verify_issue_bundle(&signed, sighash, prev_finalized).unwrap_err(), + IssueBundleInvalidSignature + ); + } + + #[test] + fn issue_bundle_verify_fail_wrong_sighash() { + let (rng, isk, ik, recipient, random_sighash) = setup_params(); + let (bundle, _) = IssueBundle::new( + ik, + String::from("Asset description"), + Some(IssueInfo { + recipient, + value: NoteValue::from_raw(5), + }), + rng, + ) + .unwrap(); + + let sighash: [u8; 32] = bundle.commitment().into(); + let signed = bundle.prepare(sighash).sign(&isk).unwrap(); + let prev_finalized = &HashSet::new(); + + assert_eq!( + verify_issue_bundle(&signed, random_sighash, prev_finalized).unwrap_err(), + IssueBundleInvalidSignature + ); + } + + #[test] + fn issue_bundle_verify_fail_incorrect_asset_description() { + let (mut rng, isk, ik, recipient, sighash) = setup_params(); + + let (bundle, _) = IssueBundle::new( + ik, + String::from("Asset description"), + Some(IssueInfo { + recipient, + value: NoteValue::from_raw(5), + }), + rng, + ) + .unwrap(); + + let mut signed = bundle.prepare(sighash).sign(&isk).unwrap(); + + // Add "bad" note + let note = Note::new( + recipient, + NoteValue::from_raw(5), + AssetBase::derive(signed.ik(), "zsa_asset"), + Rho::from_nf_old(Nullifier::dummy(&mut rng)), + &mut rng, + ); + + signed.actions.first_mut().notes.push(note); + + let prev_finalized = &HashSet::new(); + + assert_eq!( + verify_issue_bundle(&signed, sighash, prev_finalized).unwrap_err(), + IssueBundleIkMismatchAssetBase + ); + } + + #[test] + fn issue_bundle_verify_fail_incorrect_ik() { + let asset_description = "Asset"; + + let (mut rng, isk, ik, recipient, sighash) = setup_params(); + + let (bundle, _) = IssueBundle::new( + ik, + String::from(asset_description), + Some(IssueInfo { + recipient, + value: NoteValue::from_raw(5), + }), + rng, + ) + .unwrap(); + + let mut signed = bundle.prepare(sighash).sign(&isk).unwrap(); + + let incorrect_isk = IssuanceAuthorizingKey::random(); + let incorrect_ik: IssuanceValidatingKey = (&incorrect_isk).into(); + + // Add "bad" note + let note = Note::new( + recipient, + NoteValue::from_raw(55), + AssetBase::derive(&incorrect_ik, asset_description), + Rho::from_nf_old(Nullifier::dummy(&mut rng)), + &mut rng, + ); + + signed.actions.first_mut().notes = vec![note]; + + let prev_finalized = &HashSet::new(); + + assert_eq!( + verify_issue_bundle(&signed, sighash, prev_finalized).unwrap_err(), + IssueBundleIkMismatchAssetBase + ); + } + + #[test] + fn issue_bundle_verify_fail_wrong_asset_descr_size() { + // we want to inject "bad" description for test purposes. + impl IssueAction { + pub fn modify_descr(&mut self, new_descr: String) { + self.asset_desc = new_descr; + } + } + + let (rng, isk, ik, recipient, sighash) = setup_params(); + + let (bundle, _) = IssueBundle::new( + ik, + String::from("Asset description"), + Some(IssueInfo { + recipient, + value: NoteValue::from_raw(5), + }), + rng, + ) + .unwrap(); + + let mut signed = bundle.prepare(sighash).sign(&isk).unwrap(); + let prev_finalized = HashSet::new(); + + // 1. Try too long description + signed + .actions + .first_mut() + .modify_descr(String::from_utf8(vec![b'X'; 513]).unwrap()); + + assert_eq!( + verify_issue_bundle(&signed, sighash, &prev_finalized).unwrap_err(), + WrongAssetDescSize + ); + + // 2. Try empty description + signed.actions.first_mut().modify_descr("".to_string()); + + assert_eq!( + verify_issue_bundle(&signed, sighash, &prev_finalized).unwrap_err(), + WrongAssetDescSize + ); + } + + #[test] + fn issue_bundle_cannot_be_signed_with_asset_base_identity_point() { + let (isk, bundle, sighash) = identity_point_test_params(10, 20); + + assert_eq!( + bundle.prepare(sighash).sign(&isk).unwrap_err(), + AssetBaseCannotBeIdentityPoint + ); + } + + #[test] + fn issue_bundle_verify_fail_asset_base_identity_point() { + let (isk, bundle, sighash) = identity_point_test_params(10, 20); + + let signed = IssueBundle { + ik: bundle.ik, + actions: bundle.actions, + authorization: Signed { + signature: isk.try_sign(&sighash).unwrap(), + }, + }; + + assert_eq!( + verify_issue_bundle(&signed, sighash, &HashSet::new()).unwrap_err(), + AssetBaseCannotBeIdentityPoint + ); + } + + #[test] + fn finalize_flag_serialization() { + let mut rng = OsRng; + let (_, _, note) = Note::dummy(&mut rng, None, AssetBase::native()); + + let action = + IssueAction::new_with_flags(String::from("Asset description"), vec![note], 0u8) + .unwrap(); + assert_eq!(action.flags(), 0b0000_0000); + + let action = + IssueAction::new_with_flags(String::from("Asset description"), vec![note], 1u8) + .unwrap(); + assert_eq!(action.flags(), 0b0000_0001); + + let action = + IssueAction::new_with_flags(String::from("Asset description"), vec![note], 2u8); + assert!(action.is_none()); + } +} + +/// Generators for property testing. +#[cfg(any(test, feature = "test-dependencies"))] +#[cfg_attr(docsrs, doc(cfg(feature = "test-dependencies")))] +pub mod testing { + use crate::issuance::{IssueAction, IssueBundle, Prepared, Signed, Unauthorized}; + use crate::keys::testing::arb_issuance_validating_key; + use crate::note::asset_base::testing::zsa_asset_base; + use crate::note::testing::arb_zsa_note; + use k256::schnorr; + use nonempty::NonEmpty; + use proptest::collection::vec; + use proptest::prelude::*; + use proptest::prop_compose; + + prop_compose! { + /// Generate a uniformly distributed signature + pub(crate) fn arb_signature()( + sig_bytes in vec(prop::num::u8::ANY, 64) + ) -> schnorr::Signature { + schnorr::Signature::try_from(sig_bytes.as_slice()).unwrap() + } + } + + prop_compose! { + /// Generate an issue action + pub fn arb_issue_action(asset_desc: String) + ( + asset in zsa_asset_base(asset_desc.clone()), + ) + ( + note in arb_zsa_note(asset), + )-> IssueAction { + IssueAction{ + asset_desc: asset_desc.clone(), + notes: vec![note], + finalize: false, + } + } + } + + prop_compose! { + /// Generate an arbitrary issue bundle with fake authorization data. + pub fn arb_unathorized_issue_bundle(n_actions: usize) + ( + actions in vec(arb_issue_action("asset_desc".to_string()), n_actions), + ik in arb_issuance_validating_key() + ) -> IssueBundle { + let actions = NonEmpty::from_vec(actions).unwrap(); + IssueBundle { + ik, + actions, + authorization: Unauthorized + } + } + } + + prop_compose! { + /// Generate an arbitrary issue bundle with fake authorization data. This bundle does not + /// necessarily respect consensus rules + pub fn arb_prepared_issue_bundle(n_actions: usize) + ( + actions in vec(arb_issue_action("asset_desc".to_string()), n_actions), + ik in arb_issuance_validating_key(), + fake_sighash in prop::array::uniform32(prop::num::u8::ANY) + ) -> IssueBundle { + let actions = NonEmpty::from_vec(actions).unwrap(); + IssueBundle { + ik, + actions, + authorization: Prepared { sighash: fake_sighash } + } + } + } + + prop_compose! { + /// Generate an arbitrary issue bundle with fake authorization data. This bundle does not + /// necessarily respect consensus rules + pub fn arb_signed_issue_bundle(n_actions: usize) + ( + actions in vec(arb_issue_action("asset_desc".to_string()), n_actions), + ik in arb_issuance_validating_key(), + fake_sig in arb_signature(), + ) -> IssueBundle { + let actions = NonEmpty::from_vec(actions).unwrap(); + IssueBundle { + ik, + actions, + authorization: Signed { signature: fake_sig }, + } + } + } +} diff --git a/src/keys.rs b/src/keys.rs index 8b85bdcec..3c76a73f6 100644 --- a/src/keys.rs +++ b/src/keys.rs @@ -1,8 +1,10 @@ //! Key structures for Orchard. -use std::io::{self, Read, Write}; +use std::{ + fmt::{Debug, Formatter}, + io::{self, Read, Write}, +}; -use ::zip32::{AccountId, ChildIndex}; use aes::Aes256; use blake2b_simd::{Hash as Blake2bHash, Params}; use fpe::ff1::{BinaryNumeralString, FF1}; @@ -11,26 +13,40 @@ use group::{ prime::PrimeCurveAffine, Curve, GroupEncoding, }; -use pasta_curves::pallas; -use rand::RngCore; +use k256::{ + schnorr, + schnorr::{ + signature::hazmat::{PrehashSigner, PrehashVerifier}, + Signature, VerifyingKey, + }, + NonZeroScalar, +}; +use pasta_curves::{pallas, pallas::Scalar}; +use rand::{rngs::OsRng, RngCore}; use subtle::{Choice, ConditionallySelectable, ConstantTimeEq, CtOption}; -use zcash_note_encryption::EphemeralKeyBytes; +use zcash_note_encryption_zsa::EphemeralKeyBytes; use crate::{ address::Address, - primitives::redpallas::{self, SpendAuth}, + primitives::redpallas::{self, SpendAuth, VerificationKey}, spec::{ commit_ivk, diversify_hash, extract_p, ka_orchard, ka_orchard_prepared, prf_nf, to_base, to_scalar, NonIdentityPallasPoint, NonZeroPallasBase, NonZeroPallasScalar, PreparedNonIdentityBase, PreparedNonZeroScalar, PrfExpand, }, - zip32::{self, ExtendedSpendingKey}, + zip32::{ + self, ExtendedSpendingKey, ZIP32_ORCHARD_PERSONALIZATION, + ZIP32_ORCHARD_PERSONALIZATION_FOR_ISSUANCE, + }, }; -pub use ::zip32::{DiversifierIndex, Scope}; +// Preserve '::' which specifies the EXTERNAL 'zip32' crate +#[rustfmt::skip] +pub use ::zip32::{AccountId, ChildIndex, DiversifierIndex, Scope}; const KDF_ORCHARD_PERSONALIZATION: &[u8; 16] = b"Zcash_OrchardKDF"; const ZIP32_PURPOSE: u32 = 32; +const ZIP32_PURPOSE_FOR_ISSUANCE: u32 = 227; /// A spending key, from which all key material is derived. /// @@ -105,7 +121,8 @@ impl SpendingKey { ChildIndex::hardened(coin_type), ChildIndex::hardened(account.into()), ]; - ExtendedSpendingKey::from_path(seed, path).map(|esk| esk.sk()) + ExtendedSpendingKey::from_path(seed, path, ZIP32_ORCHARD_PERSONALIZATION) + .map(|esk| esk.sk()) } } @@ -138,13 +155,17 @@ impl From<&SpendingKey> for SpendAuthorizingKey { // SpendingKey cannot be constructed such that this assertion would fail. assert!(!bool::from(ask.is_zero())); // TODO: Add TryFrom for SpendAuthorizingKey. - let ret = SpendAuthorizingKey(ask.to_repr().try_into().unwrap()); - // If the last bit of repr_P(ak) is 1, negate ask. - if (<[u8; 32]>::from(SpendValidatingKey::from(&ret).0)[31] >> 7) == 1 { - SpendAuthorizingKey((-ask).to_repr().try_into().unwrap()) - } else { - ret - } + SpendAuthorizingKey(conditionally_negate(ask)) + } +} + +// If the last bit of repr_P(ak) is 1, negate ask. +fn conditionally_negate(scalar: Scalar) -> redpallas::SigningKey { + let ret = redpallas::SigningKey::(scalar.to_repr().try_into().unwrap()); + if (<[u8; 32]>::from(redpallas::VerificationKey::::from(&ret).0)[31] >> 7) == 1 { + redpallas::SigningKey::((-scalar).to_repr().try_into().unwrap()) + } else { + ret } } @@ -184,7 +205,7 @@ impl SpendValidatingKey { self.0.randomize(randomizer) } - /// Converts this spend validating key to its serialized form, + /// Converts this spend key to its serialized form, /// I2LEOSP_256(ak). pub(crate) fn to_bytes(&self) -> [u8; 32] { // This is correct because the wrapped point must have ỹ = 0, and @@ -195,21 +216,143 @@ impl SpendValidatingKey { pub(crate) fn from_bytes(bytes: &[u8]) -> Option { <[u8; 32]>::try_from(bytes) .ok() - .and_then(|b| { - // Structural validity checks for ak_P: - // - The point must not be the identity - // (which for Pallas is canonically encoded as all-zeroes). - // - The sign of the y-coordinate must be positive. - if b != [0; 32] && b[31] & 0x80 == 0 { - >::try_from(b).ok() - } else { - None - } - }) + .and_then(check_structural_validity) .map(SpendValidatingKey) } } +/// A function to check structural validity of the validating keys for authorizing transfers and +/// issuing assets +/// Structural validity checks for ak_P or ik_P: +/// - The point must not be the identity (which for Pallas is canonically encoded as all-zeroes). +/// - The compressed y-coordinate bit must be 0. +fn check_structural_validity( + verification_key_bytes: [u8; 32], +) -> Option> { + if verification_key_bytes != [0; 32] && verification_key_bytes[31] & 0x80 == 0 { + >::try_from(verification_key_bytes).ok() + } else { + None + } +} + +/// An issuance key, from which all key material is derived. +/// +/// $\mathsf{isk}$ as defined in [ZIP 227][issuancekeycomponents]. +/// +/// [issuancekeycomponents]: https://qed-it.github.io/zips/zip-0227#issuance-key-derivation +#[derive(Copy, Clone)] +pub struct IssuanceAuthorizingKey(NonZeroScalar); + +impl IssuanceAuthorizingKey { + /// Generates a random issuance key. + /// + /// This is only used when generating a random AssetBase. + /// Real issuance keys should be derived according to [ZIP 32]. + /// + /// [ZIP 32]: https://zips.z.cash/zip-0032 + pub(crate) fn random() -> Self { + IssuanceAuthorizingKey(NonZeroScalar::random(&mut OsRng)) + } + + /// Constructs an Orchard issuance key from uniformly-random bytes. + /// + /// Returns `None` if the bytes do not correspond to a valid Orchard issuance key. + pub fn from_bytes(isk_bytes: [u8; 32]) -> Option { + NonZeroScalar::try_from(&isk_bytes as &[u8]) + .ok() + .map(IssuanceAuthorizingKey) + } + + /// Returns the raw bytes of the issuance key. + /// Unwrap call never fails since the issuance authorizing key is exactly 32 bytes. + pub fn to_bytes(&self) -> [u8; 32] { + self.0.to_bytes().try_into().unwrap() + } + + /// Derives the Orchard-ZSA issuance key for the given seed, coin type, and account. + pub fn from_zip32_seed( + seed: &[u8], + coin_type: u32, + account: u32, + ) -> Result { + // Call zip32 logic + let path = &[ + ChildIndex::hardened(ZIP32_PURPOSE_FOR_ISSUANCE), + ChildIndex::hardened(coin_type), + ChildIndex::hardened(account), + ]; + + // we are reusing zip32 logic for deriving the key, zip32 should be updated as discussed + let &isk_bytes = + ExtendedSpendingKey::from_path(seed, path, ZIP32_ORCHARD_PERSONALIZATION_FOR_ISSUANCE)? + .sk() + .to_bytes(); + + IssuanceAuthorizingKey::from_bytes(isk_bytes).ok_or(zip32::Error::InvalidSpendingKey) + } + + /// Sign the provided message using the `IssuanceAuthorizingKey`. + /// Only supports signing of messages of length 32 bytes, since we will only be using it to sign 32 byte SIGHASH values. + pub fn try_sign(&self, msg: &[u8; 32]) -> Result { + schnorr::SigningKey::from(self.0).sign_prehash(msg) + } +} + +impl Debug for IssuanceAuthorizingKey { + fn fmt(&self, f: &mut Formatter<'_>) -> std::fmt::Result { + f.debug_tuple("IssuanceAuthorizingKey") + .field(&self.0.to_bytes()) + .finish() + } +} + +/// A key used to validate issuance authorization signatures. +/// +/// Defined in [ZIP 227: Issuance of Zcash Shielded Assets § Issuance Key Generation][IssuanceZSA]. +/// +/// [IssuanceZSA]: https://qed-it.github.io/zips/zip-0227#issuance-key-derivation +#[derive(Debug, Clone)] +pub struct IssuanceValidatingKey(schnorr::VerifyingKey); + +impl From<&IssuanceAuthorizingKey> for IssuanceValidatingKey { + fn from(isk: &IssuanceAuthorizingKey) -> Self { + IssuanceValidatingKey(*schnorr::SigningKey::from(isk.0).verifying_key()) + } +} + +impl PartialEq for IssuanceValidatingKey { + fn eq(&self, other: &Self) -> bool { + self.to_bytes().eq(&other.to_bytes()) + } +} + +impl Eq for IssuanceValidatingKey {} + +impl IssuanceValidatingKey { + /// Converts this issuance validating key to its serialized form, + /// in big-endian order as defined in BIP 340. + /// Unwrap call never fails since the issuance validating key is exactly 32 bytes. + pub fn to_bytes(&self) -> [u8; 32] { + self.0.to_bytes().try_into().unwrap() + } + + /// Constructs an Orchard issuance validating key from the provided bytes. + /// The bytes are assumed to be encoded in big-endian order. + /// + /// Returns `None` if the bytes do not correspond to a valid key. + pub fn from_bytes(bytes: &[u8]) -> Option { + VerifyingKey::from_bytes(bytes) + .ok() + .map(IssuanceValidatingKey) + } + + /// Verifies a purported `signature` over `msg` made by this verification key. + pub fn verify(&self, msg: &[u8], signature: &Signature) -> Result<(), schnorr::Error> { + self.0.verify_prehash(msg, signature) + } +} + /// A key used to derive [`Nullifier`]s from [`Note`]s. /// /// $\mathsf{nk}$ as defined in [Zcash Protocol Spec § 4.2.3: Orchard Key Components][orchardkeycomponents]. @@ -900,10 +1043,12 @@ impl SharedSecret { #[cfg(any(test, feature = "test-dependencies"))] #[cfg_attr(docsrs, doc(cfg(feature = "test-dependencies")))] pub mod testing { + use super::{ + DiversifierIndex, DiversifierKey, EphemeralSecretKey, IssuanceAuthorizingKey, + IssuanceValidatingKey, SpendingKey, + }; use proptest::prelude::*; - use super::{DiversifierIndex, DiversifierKey, EphemeralSecretKey, SpendingKey}; - prop_compose! { /// Generate a uniformly distributed Orchard spending key. pub fn arb_spending_key()( @@ -918,6 +1063,20 @@ pub mod testing { } } + prop_compose! { + /// Generate a uniformly distributed Orchard issuance master key. + pub fn arb_issuance_authorizing_key()( + key in prop::array::uniform32(prop::num::u8::ANY) + .prop_map(IssuanceAuthorizingKey::from_bytes) + .prop_filter( + "Values must correspond to valid Orchard-ZSA issuance keys.", + |opt| opt.is_some() + ) + ) -> IssuanceAuthorizingKey { + key.unwrap() + } + } + prop_compose! { /// Generate a uniformly distributed Orchard ephemeral secret key. pub fn arb_esk()( @@ -949,6 +1108,13 @@ pub mod testing { DiversifierIndex::from(d_bytes) } } + + prop_compose! { + /// Generate a uniformly distributed RedDSA issuance validating key. + pub fn arb_issuance_validating_key()(isk in arb_issuance_authorizing_key()) -> IssuanceValidatingKey { + IssuanceValidatingKey::from(&isk) + } + } } #[cfg(test)] @@ -960,6 +1126,7 @@ mod tests { testing::{arb_diversifier_index, arb_diversifier_key, arb_esk, arb_spending_key}, *, }; + use crate::note::AssetBase; use crate::{ note::{ExtractedNoteCommitment, RandomSeed, Rho}, value::NoteValue, @@ -982,6 +1149,21 @@ mod tests { )); } + #[test] + fn issuance_authorizing_key_from_bytes_fail_on_zero() { + // isk must not be the zero scalar. + let isk = IssuanceAuthorizingKey::from_bytes([0; 32]); + assert!(isk.is_none()); + } + + #[test] + fn issuance_authorizing_key_from_bytes_to_bytes_roundtrip() { + let isk = IssuanceAuthorizingKey::random(); + let isk_bytes = isk.to_bytes(); + let isk_roundtrip = IssuanceAuthorizingKey::from_bytes(isk_bytes).unwrap(); + assert_eq!(isk_bytes, isk_roundtrip.to_bytes()); + } + proptest! { #[test] fn key_agreement( @@ -1019,9 +1201,14 @@ mod tests { let ask: SpendAuthorizingKey = (&sk).into(); assert_eq!(<[u8; 32]>::from(&ask.0), tv.ask); + let isk = IssuanceAuthorizingKey::from_bytes(tv.isk).unwrap(); + let ak: SpendValidatingKey = (&ask).into(); assert_eq!(<[u8; 32]>::from(ak.0), tv.ak); + let ik: IssuanceValidatingKey = (&isk).into(); + assert_eq!(ik.to_bytes(), tv.ik); + let nk: NullifierDerivingKey = (&sk).into(); assert_eq!(nk.0.to_repr(), tv.nk); @@ -1045,6 +1232,7 @@ mod tests { let note = Note::from_parts( addr, NoteValue::from_raw(tv.note_v), + AssetBase::from_bytes(&tv.asset).unwrap(), rho, RandomSeed::from_bytes(tv.note_rseed, &rho).unwrap(), ) @@ -1066,4 +1254,22 @@ mod tests { assert_eq!(internal_ovk.0, tv.internal_ovk); } } + + #[test] + fn issuance_auth_sig_test_vectors() { + for tv in crate::test_vectors::issuance_auth_sig::test_vectors() { + let isk = IssuanceAuthorizingKey::from_bytes(tv.isk).unwrap(); + + let ik = IssuanceValidatingKey::from(&isk); + assert_eq!(ik.to_bytes(), tv.ik); + + let message = tv.msg; + + let signature = isk.try_sign(&message).unwrap(); + let sig_bytes: [u8; 64] = signature.to_bytes(); + assert_eq!(sig_bytes, tv.sig); + + assert!(ik.verify(&message, &signature).is_ok()); + } + } } diff --git a/src/lib.rs b/src/lib.rs index 005253e97..65e4a5835 100644 --- a/src/lib.rs +++ b/src/lib.rs @@ -22,9 +22,12 @@ pub mod builder; pub mod bundle; pub mod circuit; mod constants; +pub mod issuance; pub mod keys; pub mod note; -pub mod note_encryption; +pub mod supply_info; +// pub mod note_encryption; // disabled until backward compatability is implemented. +pub mod note_encryption_v3; pub mod primitives; mod spec; pub mod tree; diff --git a/src/note.rs b/src/note.rs index 6a9c70b5a..f5b8d30a0 100644 --- a/src/note.rs +++ b/src/note.rs @@ -6,7 +6,7 @@ use ff::PrimeField; use group::GroupEncoding; use pasta_curves::pallas; use rand::RngCore; -use subtle::CtOption; +use subtle::{Choice, ConditionallySelectable, CtOption}; use crate::{ keys::{EphemeralSecretKey, FullViewingKey, Scope, SpendingKey}, @@ -36,7 +36,7 @@ impl Rho { /// value otherwise. /// /// [`Action::rho`]: crate::action::Action::rho - /// [`CompactAction::rho`]: crate::note_encryption::CompactAction::rho + /// [`CompactAction::rho`]: crate::note_encryption_v3::CompactAction::rho pub fn from_bytes(bytes: &[u8; 32]) -> CtOption { pallas::Base::from_repr(*bytes).map(Rho) } @@ -59,6 +59,9 @@ impl Rho { } } +pub(crate) mod asset_base; +pub use self::asset_base::AssetBase; + /// The ZIP 212 seed randomness for a note. #[derive(Copy, Clone, Debug)] pub struct RandomSeed([u8; 32]); @@ -123,6 +126,17 @@ impl RandomSeed { } } +impl ConditionallySelectable for RandomSeed { + fn conditional_select(a: &Self, b: &Self, choice: Choice) -> Self { + let result: Vec = + a.0.iter() + .zip(b.0.iter()) + .map(|(a_i, b_i)| u8::conditional_select(a_i, b_i, choice)) + .collect(); + RandomSeed(<[u8; 32]>::try_from(result).unwrap()) + } +} + /// A discrete amount of funds received by an address. #[derive(Debug, Copy, Clone)] pub struct Note { @@ -130,6 +144,8 @@ pub struct Note { recipient: Address, /// The value of this note. value: NoteValue, + /// The asset id of this note. + asset: AssetBase, /// A unique creation ID for this note. /// /// This is produced from the nullifier of the note that will be spent in the [`Action`] that @@ -139,6 +155,10 @@ pub struct Note { rho: Rho, /// The seed randomness for various note components. rseed: RandomSeed, + /// The seed randomness for split notes. + /// + /// If it is not a split note, this field is `None`. + rseed_split_note: CtOption, } impl PartialEq for Note { @@ -169,14 +189,17 @@ impl Note { pub fn from_parts( recipient: Address, value: NoteValue, + asset: AssetBase, rho: Rho, rseed: RandomSeed, ) -> CtOption { let note = Note { recipient, value, + asset, rho, rseed, + rseed_split_note: CtOption::new(rseed, 0u8.into()), }; CtOption::new(note, note.commitment_inner().is_some()) } @@ -189,11 +212,18 @@ impl Note { pub(crate) fn new( recipient: Address, value: NoteValue, + asset: AssetBase, rho: Rho, mut rng: impl RngCore, ) -> Self { loop { - let note = Note::from_parts(recipient, value, rho, RandomSeed::random(&mut rng, &rho)); + let note = Note::from_parts( + recipient, + value, + asset, + rho, + RandomSeed::random(&mut rng, &rho), + ); if note.is_some().into() { break note.unwrap(); } @@ -208,6 +238,7 @@ impl Note { pub(crate) fn dummy( rng: &mut impl RngCore, rho: Option, + asset: AssetBase, ) -> (SpendingKey, FullViewingKey, Self) { let sk = SpendingKey::random(rng); let fvk: FullViewingKey = (&sk).into(); @@ -216,6 +247,7 @@ impl Note { let note = Note::new( recipient, NoteValue::zero(), + asset, rho.unwrap_or_else(|| Rho::from_nf_old(Nullifier::dummy(rng))), rng, ); @@ -233,11 +265,21 @@ impl Note { self.value } + /// Returns the note type of this note. + pub fn asset(&self) -> AssetBase { + self.asset + } + /// Returns the rseed value of this note. pub fn rseed(&self) -> &RandomSeed { &self.rseed } + /// Returns the rseed_split_note value of this note. + pub fn rseed_split_note(&self) -> CtOption { + self.rseed_split_note + } + /// Derives the ephemeral secret key for this note. pub(crate) fn esk(&self) -> EphemeralSecretKey { EphemeralSecretKey(self.rseed.esk(&self.rho)) @@ -274,6 +316,7 @@ impl Note { g_d.to_bytes(), self.recipient.pk_d().to_bytes(), self.value, + self.asset, self.rho.0, self.rseed.psi(&self.rho), self.rseed.rcm(&self.rho), @@ -282,13 +325,25 @@ impl Note { /// Derives the nullifier for this note. pub fn nullifier(&self, fvk: &FullViewingKey) -> Nullifier { + let selected_rseed = self.rseed_split_note.unwrap_or(self.rseed); + Nullifier::derive( fvk.nk(), self.rho.0, - self.rseed.psi(&self.rho), + selected_rseed.psi(&self.rho), self.commitment(), + self.rseed_split_note.is_some(), ) } + + /// Create a split note which has the same values than the input note except for + /// `rseed_split_note` which is equal to a random seed. + pub fn create_split_note(self, rng: &mut impl RngCore) -> Self { + Note { + rseed_split_note: CtOption::new(RandomSeed::random(rng, &self.rho), 1u8.into()), + ..self + } + } } /// An encrypted note. @@ -297,7 +352,7 @@ pub struct TransmittedNoteCiphertext { /// The serialization of the ephemeral public key pub epk_bytes: [u8; 32], /// The encrypted note ciphertext - pub enc_ciphertext: [u8; 580], + pub enc_ciphertext: [u8; 612], /// An encrypted value that allows the holder of the outgoing cipher /// key for the note to recover the note plaintext. pub out_ciphertext: [u8; 80], @@ -319,10 +374,15 @@ impl fmt::Debug for TransmittedNoteCiphertext { pub mod testing { use proptest::prelude::*; + use crate::note::asset_base::testing::arb_asset_base; + use crate::note::AssetBase; + use crate::value::testing::arb_note_value; use crate::{ address::testing::arb_address, note::nullifier::testing::arb_nullifier, value::NoteValue, }; + use subtle::CtOption; + use super::{Note, RandomSeed, Rho}; prop_compose! { @@ -333,17 +393,58 @@ pub mod testing { } prop_compose! { - /// Generate an action without authorization data. + /// Generate an arbitrary note pub fn arb_note(value: NoteValue)( recipient in arb_address(), rho in arb_nullifier().prop_map(Rho::from_nf_old), rseed in arb_rseed(), + asset in arb_asset_base(), + ) -> Note { + Note { + recipient, + value, + asset, + rho, + rseed, + rseed_split_note: CtOption::new(rseed, 0u8.into()), + } + } + } + + prop_compose! { + /// Generate an arbitrary native note + pub fn arb_native_note()( + recipient in arb_address(), + value in arb_note_value(), + rho in arb_nullifier().prop_map(Rho::from_nf_old), + rseed in arb_rseed(), + ) -> Note { + Note { + recipient, + value, + asset: AssetBase::native(), + rho, + rseed, + rseed_split_note: CtOption::new(rseed, 0u8.into()) + } + } + } + + prop_compose! { + /// Generate an arbitrary zsa note + pub fn arb_zsa_note(asset: AssetBase)( + recipient in arb_address(), + value in arb_note_value(), + rho in arb_nullifier().prop_map(Rho::from_nf_old), + rseed in arb_rseed(), ) -> Note { Note { recipient, value, + asset, rho, rseed, + rseed_split_note: CtOption::new(rseed, 0u8.into()), } } } diff --git a/src/note/asset_base.rs b/src/note/asset_base.rs new file mode 100644 index 000000000..6856bee74 --- /dev/null +++ b/src/note/asset_base.rs @@ -0,0 +1,198 @@ +use blake2b_simd::{Hash as Blake2bHash, Params}; +use group::{Group, GroupEncoding}; +use halo2_proofs::arithmetic::CurveExt; +use pasta_curves::pallas; +use std::hash::{Hash, Hasher}; + +use subtle::{Choice, ConstantTimeEq, CtOption}; + +use crate::constants::fixed_bases::{ + NATIVE_ASSET_BASE_V_BYTES, VALUE_COMMITMENT_PERSONALIZATION, ZSA_ASSET_BASE_PERSONALIZATION, +}; +use crate::keys::{IssuanceAuthorizingKey, IssuanceValidatingKey}; + +/// Note type identifier. +#[derive(Clone, Copy, Debug, Eq)] +pub struct AssetBase(pallas::Point); + +pub const MAX_ASSET_DESCRIPTION_SIZE: usize = 512; + +/// Personalization for the ZSA asset digest generator +pub const ZSA_ASSET_DIGEST_PERSONALIZATION: &[u8; 16] = b"ZSA-Asset-Digest"; + +/// AssetDigest for the ZSA asset +/// +/// Defined in [Transfer and Burn of Zcash Shielded Assets][AssetDigest]. +/// +/// [assetdigest]: https://qed-it.github.io/zips/zip-0226.html#asset-identifiers +pub fn asset_digest(asset_id: Vec) -> Blake2bHash { + Params::new() + .hash_length(64) + .personal(ZSA_ASSET_DIGEST_PERSONALIZATION) + .to_state() + .update(&asset_id) + .finalize() +} + +impl AssetBase { + /// Deserialize the asset_id from a byte array. + pub fn from_bytes(bytes: &[u8; 32]) -> CtOption { + pallas::Point::from_bytes(bytes).map(AssetBase) + } + + /// Serialize the asset_id to its canonical byte representation. + pub fn to_bytes(self) -> [u8; 32] { + self.0.to_bytes() + } + + /// Note type derivation$. + /// + /// Defined in [Transfer and Burn of Zcash Shielded Assets][AssetBase]. + /// + /// [notetypes]: https://qed-it.github.io/zips/zip-0226.html#asset-identifiers + /// + /// # Panics + /// + /// Panics if `asset_desc` is empty or greater than `MAX_ASSET_DESCRIPTION_SIZE` or if the derived Asset Base is the identity point. + #[allow(non_snake_case)] + pub fn derive(ik: &IssuanceValidatingKey, asset_desc: &str) -> Self { + assert!( + is_asset_desc_of_valid_size(asset_desc), + "The asset_desc string is not of valid size" + ); + + // EncodeAssetId(ik, asset_desc) = version_byte || ik || asset_desc + let version_byte = [0x00]; + let encode_asset_id = [&version_byte[..], &ik.to_bytes(), asset_desc.as_bytes()].concat(); + + let asset_digest = asset_digest(encode_asset_id); + + let asset_base = + pallas::Point::hash_to_curve(ZSA_ASSET_BASE_PERSONALIZATION)(asset_digest.as_bytes()); + + // this will happen with negligible probability. + assert!( + bool::from(!asset_base.is_identity()), + "The Asset Base is the identity point, which is invalid." + ); + + // AssetBase = ZSAValueBase(AssetDigest) + AssetBase(asset_base) + } + + /// Note type for the "native" currency (zec), maintains backward compatibility with Orchard untyped notes. + pub fn native() -> Self { + AssetBase(pallas::Point::hash_to_curve( + VALUE_COMMITMENT_PERSONALIZATION, + )(&NATIVE_ASSET_BASE_V_BYTES[..])) + } + + /// The base point used in value commitments. + pub fn cv_base(&self) -> pallas::Point { + self.0 + } + + /// Whether this note represents a native or ZSA asset. + pub fn is_native(&self) -> Choice { + self.0.ct_eq(&Self::native().0) + } + + /// Generates a ZSA random asset. + /// + /// This is only used in tests. + pub(crate) fn random() -> Self { + let isk = IssuanceAuthorizingKey::random(); + let ik = IssuanceValidatingKey::from(&isk); + let asset_descr = "zsa_asset"; + AssetBase::derive(&ik, asset_descr) + } +} + +impl Hash for AssetBase { + fn hash(&self, h: &mut H) { + h.write(&self.to_bytes()); + h.finish(); + } +} + +/// Check that `asset_desc` is of valid size. +pub fn is_asset_desc_of_valid_size(asset_desc: &str) -> bool { + !asset_desc.is_empty() && asset_desc.bytes().len() <= MAX_ASSET_DESCRIPTION_SIZE +} + +impl PartialEq for AssetBase { + fn eq(&self, other: &Self) -> bool { + bool::from(self.0.ct_eq(&other.0)) + } +} + +/// Generators for property testing. +#[cfg(any(test, feature = "test-dependencies"))] +#[cfg_attr(docsrs, doc(cfg(feature = "test-dependencies")))] +pub mod testing { + use super::AssetBase; + + use proptest::prelude::*; + + use crate::keys::{testing::arb_issuance_authorizing_key, IssuanceValidatingKey}; + + prop_compose! { + /// Generate a uniformly distributed note type + pub fn arb_asset_base()( + is_native in prop::bool::ANY, + isk in arb_issuance_authorizing_key(), + str in "[A-Za-z]{255}", + ) -> AssetBase { + if is_native { + AssetBase::native() + } else { + AssetBase::derive(&IssuanceValidatingKey::from(&isk), &str) + } + } + } + + prop_compose! { + /// Generate the native note type + pub fn native_asset_base()(_i in 0..10) -> AssetBase { + // TODO: remove _i + AssetBase::native() + } + } + + prop_compose! { + /// Generate an asset ID + pub fn arb_zsa_asset_base()( + isk in arb_issuance_authorizing_key(), + str in "[A-Za-z]{255}" + ) -> AssetBase { + AssetBase::derive(&IssuanceValidatingKey::from(&isk), &str) + } + } + + prop_compose! { + /// Generate an asset ID using a specific description + pub fn zsa_asset_base(asset_desc: String)( + isk in arb_issuance_authorizing_key(), + ) -> AssetBase { + assert!(super::is_asset_desc_of_valid_size(&asset_desc)); + AssetBase::derive(&IssuanceValidatingKey::from(&isk), &asset_desc) + } + } + + #[test] + fn test_vectors() { + let test_vectors = crate::test_vectors::asset_base::test_vectors(); + + for tv in test_vectors { + let description = std::str::from_utf8(&tv.description).unwrap(); + + let calculated_asset_base = AssetBase::derive( + &IssuanceValidatingKey::from_bytes(&tv.key).unwrap(), + description, + ); + let test_vector_asset_base = AssetBase::from_bytes(&tv.asset_base).unwrap(); + + assert_eq!(calculated_asset_base, test_vector_asset_base); + } + } +} diff --git a/src/note/commitment.rs b/src/note/commitment.rs index 9de51d28e..09a7d45f4 100644 --- a/src/note/commitment.rs +++ b/src/note/commitment.rs @@ -4,16 +4,20 @@ use bitvec::{array::BitArray, order::Lsb0}; use group::ff::{PrimeField, PrimeFieldBits}; use halo2_gadgets::sinsemilla::primitives as sinsemilla; use pasta_curves::pallas; -use subtle::{ConstantTimeEq, CtOption}; +use subtle::{ConditionallySelectable, ConstantTimeEq, CtOption}; use crate::{ - constants::{fixed_bases::NOTE_COMMITMENT_PERSONALIZATION, L_ORCHARD_BASE}, + constants::{ + fixed_bases::{NOTE_COMMITMENT_PERSONALIZATION, NOTE_ZSA_COMMITMENT_PERSONALIZATION}, + L_ORCHARD_BASE, + }, + note::asset_base::AssetBase, spec::extract_p, value::NoteValue, }; #[derive(Clone, Debug)] -pub(crate) struct NoteCommitTrapdoor(pub(super) pallas::Scalar); +pub(crate) struct NoteCommitTrapdoor(pub(crate) pallas::Scalar); impl NoteCommitTrapdoor { pub(crate) fn inner(&self) -> pallas::Scalar { @@ -37,25 +41,56 @@ impl NoteCommitment { /// Defined in [Zcash Protocol Spec § 5.4.8.4: Sinsemilla commitments][concretesinsemillacommit]. /// /// [concretesinsemillacommit]: https://zips.z.cash/protocol/nu5.pdf#concretesinsemillacommit - pub(super) fn derive( + pub(crate) fn derive( g_d: [u8; 32], pk_d: [u8; 32], v: NoteValue, + asset: AssetBase, rho: pallas::Base, psi: pallas::Base, rcm: NoteCommitTrapdoor, ) -> CtOption { - let domain = sinsemilla::CommitDomain::new(NOTE_COMMITMENT_PERSONALIZATION); - domain - .commit( - iter::empty() - .chain(BitArray::<_, Lsb0>::new(g_d).iter().by_vals()) - .chain(BitArray::<_, Lsb0>::new(pk_d).iter().by_vals()) - .chain(v.to_le_bits().iter().by_vals()) - .chain(rho.to_le_bits().iter().by_vals().take(L_ORCHARD_BASE)) - .chain(psi.to_le_bits().iter().by_vals().take(L_ORCHARD_BASE)), - &rcm.0, - ) + let g_d_bits = BitArray::<_, Lsb0>::new(g_d); + let pk_d_bits = BitArray::<_, Lsb0>::new(pk_d); + let v_bits = v.to_le_bits(); + let rho_bits = rho.to_le_bits(); + let psi_bits = psi.to_le_bits(); + + let common_note_bits = iter::empty() + .chain(g_d_bits.iter().by_vals()) + .chain(pk_d_bits.iter().by_vals()) + .chain(v_bits.iter().by_vals()) + .chain(rho_bits.iter().by_vals().take(L_ORCHARD_BASE)) + .chain(psi_bits.iter().by_vals().take(L_ORCHARD_BASE)) + .collect::>(); + + let zec_note_bits = common_note_bits.clone().into_iter(); + + let type_bits = BitArray::<_, Lsb0>::new(asset.to_bytes()); + let zsa_note_bits = common_note_bits + .into_iter() + .chain(type_bits.iter().by_vals()); + + let zec_domain = sinsemilla::CommitDomain::new(NOTE_COMMITMENT_PERSONALIZATION); + let zsa_domain = sinsemilla::CommitDomain::new_with_personalization( + NOTE_ZSA_COMMITMENT_PERSONALIZATION, + NOTE_COMMITMENT_PERSONALIZATION, + ); + + let zec_hash_point = zec_domain.hash_to_point(zec_note_bits); + let zsa_hash_point = zsa_domain.hash_to_point(zsa_note_bits); + + // Select the desired hash point in constant-time + let hash_point = zsa_hash_point.and_then(|zsa_hash| { + zec_hash_point.map(|zec_hash| { + pallas::Point::conditional_select(&zsa_hash, &zec_hash, asset.is_native()) + }) + }); + + // To evaluate the commitment from the hash_point, we could use either zec_domain or + // zsa_domain because they have both the same `R` constant. + zec_domain + .commit_from_hash_point(hash_point, &rcm.0) .map(NoteCommitment) } } @@ -112,3 +147,40 @@ impl PartialEq for ExtractedNoteCommitment { } impl Eq for ExtractedNoteCommitment {} + +#[cfg(test)] +mod tests { + use crate::constants::fixed_bases::{ + NOTE_COMMITMENT_PERSONALIZATION, NOTE_ZSA_COMMITMENT_PERSONALIZATION, + }; + use crate::note::commitment::NoteCommitTrapdoor; + use ff::Field; + use halo2_gadgets::sinsemilla::primitives as sinsemilla; + use pasta_curves::pallas; + use rand::{rngs::OsRng, Rng}; + + #[test] + fn test_commit_in_several_steps() { + let mut os_rng = OsRng::default(); + let msg: Vec = (0..36).map(|_| os_rng.gen::()).collect(); + + let rcm = NoteCommitTrapdoor(pallas::Scalar::random(&mut os_rng)); + + let domain_zec = sinsemilla::CommitDomain::new(NOTE_COMMITMENT_PERSONALIZATION); + let domain_zsa = sinsemilla::CommitDomain::new_with_personalization( + NOTE_ZSA_COMMITMENT_PERSONALIZATION, + NOTE_COMMITMENT_PERSONALIZATION, + ); + + let expected_commit = domain_zsa.commit(msg.clone().into_iter(), &rcm.0); + + // Evaluating the commitment in one step with `commit` or in two steps with `hash_to_point` + // and `commit_from_hash_point` must give the same commitment. + let hash_point = domain_zsa.hash_to_point(msg.into_iter()); + let commit_r_zsa = domain_zsa.commit_from_hash_point(hash_point, &rcm.0); + assert_eq!(expected_commit.unwrap(), commit_r_zsa.unwrap()); + + // ZEC and ZSA note commitments must use the same R constant + assert_eq!(domain_zec.R(), domain_zsa.R()); + } +} diff --git a/src/note/nullifier.rs b/src/note/nullifier.rs index bde133995..6c41a87a2 100644 --- a/src/note/nullifier.rs +++ b/src/note/nullifier.rs @@ -3,7 +3,7 @@ use halo2_proofs::arithmetic::CurveExt; use memuse::DynamicUsage; use pasta_curves::pallas; use rand::RngCore; -use subtle::{ConstantTimeEq, CtOption}; +use subtle::{Choice, ConditionallySelectable, ConstantTimeEq, CtOption}; use super::NoteCommitment; use crate::{ @@ -55,10 +55,18 @@ impl Nullifier { rho: pallas::Base, psi: pallas::Base, cm: NoteCommitment, + is_split_note: Choice, ) -> Self { let k = pallas::Point::hash_to_curve("z.cash:Orchard")(b"K"); + let l = pallas::Point::hash_to_curve("z.cash:Orchard")(b"L"); - Nullifier(extract_p(&(k * mod_r_p(nk.prf_nf(rho) + psi) + cm.0))) + let nullifier = k * mod_r_p(nk.prf_nf(rho) + psi) + cm.0; + let split_note_nullifier = nullifier + l; + + let selected_nullifier = + pallas::Point::conditional_select(&nullifier, &split_note_nullifier, is_split_note); + + Nullifier(extract_p(&(selected_nullifier))) } } diff --git a/src/note_encryption.rs b/src/note_encryption.rs index 56d5599cf..2ac88014c 100644 --- a/src/note_encryption.rs +++ b/src/note_encryption.rs @@ -1,15 +1,14 @@ //! In-band secret distribution for Orchard bundles. -use core::fmt; - use blake2b_simd::{Hash, Params}; use group::ff::PrimeField; -use zcash_note_encryption::{ - BatchDomain, Domain, EphemeralKeyBytes, NotePlaintextBytes, OutPlaintextBytes, - OutgoingCipherKey, ShieldedOutput, COMPACT_NOTE_SIZE, ENC_CIPHERTEXT_SIZE, NOTE_PLAINTEXT_SIZE, - OUT_PLAINTEXT_SIZE, +use std::fmt; +use zcash_note_encryption_zsa::{ + BatchDomain, Domain, EphemeralKeyBytes, OutPlaintextBytes, OutgoingCipherKey, ShieldedOutput, + AEAD_TAG_SIZE, MEMO_SIZE, OUT_PLAINTEXT_SIZE, }; +use crate::note::AssetBase; use crate::{ action::Action, keys::{ @@ -23,6 +22,83 @@ use crate::{ const PRF_OCK_ORCHARD_PERSONALIZATION: &[u8; 16] = b"Zcash_Orchardock"; +/// The size of a v2 compact note. +pub const COMPACT_NOTE_SIZE_V2: usize = 1 + // version + 11 + // diversifier + 8 + // value + 32; // rseed (or rcm prior to ZIP 212) +/// The size of [`NotePlaintextBytes`] for V2. +pub const NOTE_PLAINTEXT_SIZE_V2: usize = COMPACT_NOTE_SIZE_V2 + MEMO_SIZE; +/// The size of an encrypted note plaintext. +pub const ENC_CIPHERTEXT_SIZE_V2: usize = NOTE_PLAINTEXT_SIZE_V2 + AEAD_TAG_SIZE; + +/// a type to represent the raw bytes of a note plaintext. +#[derive(Clone, Debug)] +pub struct NotePlaintextBytes(pub [u8; NOTE_PLAINTEXT_SIZE_V2]); + +/// a type to represent the raw bytes of an encrypted note plaintext. +#[derive(Clone, Debug)] +pub struct NoteCiphertextBytes(pub [u8; ENC_CIPHERTEXT_SIZE_V2]); + +/// a type to represent the raw bytes of a compact note. +#[derive(Clone, Debug)] +pub struct CompactNotePlaintextBytes(pub [u8; COMPACT_NOTE_SIZE_V2]); + +/// a type to represent the raw bytes of an encrypted compact note. +#[derive(Clone, Debug)] +pub struct CompactNoteCiphertextBytes(pub [u8; COMPACT_NOTE_SIZE_V2]); + +impl AsMut<[u8]> for NotePlaintextBytes { + fn as_mut(&mut self) -> &mut [u8] { + self.0.as_mut() + } +} + +impl From<&[u8]> for NotePlaintextBytes { + fn from(s: &[u8]) -> Self + where + Self: Sized, + { + NotePlaintextBytes(s.try_into().unwrap()) + } +} + +impl AsRef<[u8]> for NoteCiphertextBytes { + fn as_ref(&self) -> &[u8] { + self.0.as_ref() + } +} + +impl From<&[u8]> for NoteCiphertextBytes { + fn from(s: &[u8]) -> Self + where + Self: Sized, + { + NoteCiphertextBytes(s.try_into().unwrap()) + } +} + +impl AsMut<[u8]> for CompactNotePlaintextBytes { + fn as_mut(&mut self) -> &mut [u8] { + self.0.as_mut() + } +} + +impl From<&[u8]> for CompactNotePlaintextBytes { + fn from(s: &[u8]) -> Self + where + Self: Sized, + { + CompactNotePlaintextBytes(s.try_into().unwrap()) + } +} + +impl AsRef<[u8]> for CompactNoteCiphertextBytes { + fn as_ref(&self) -> &[u8] { + self.0.as_ref() + } +} + /// Defined in [Zcash Protocol Spec § 5.4.2: Pseudo Random Functions][concreteprfs]. /// /// [concreteprfs]: https://zips.z.cash/protocol/nu5.pdf#concreteprfs @@ -48,18 +124,27 @@ pub(crate) fn prf_ock_orchard( ) } +/// note_version will return the version of the note plaintext. +pub fn note_version(plaintext: &[u8]) -> Option { + match plaintext[0] { + 0x02 => Some(0x02), + 0x03 => Some(0x03), + _ => None, + } +} + fn orchard_parse_note_plaintext_without_memo( - domain: &OrchardDomain, - plaintext: &[u8], + domain: &OrchardDomainV2, + plaintext: &[u8], // TODO: replace with CompactNotePlaintextBytes get_pk_d: F, ) -> Option<(Note, Address)> where F: FnOnce(&Diversifier) -> DiversifiedTransmissionKey, { - assert!(plaintext.len() >= COMPACT_NOTE_SIZE); + assert!(plaintext.len() >= COMPACT_NOTE_SIZE_V2); // Check note plaintext version - if plaintext[0] != 0x02 { + if note_version(plaintext).unwrap() != 0x02 { return None; } @@ -67,24 +152,30 @@ where let diversifier = Diversifier::from_bytes(plaintext[1..12].try_into().unwrap()); let value = NoteValue::from_bytes(plaintext[12..20].try_into().unwrap()); let rseed = Option::from(RandomSeed::from_bytes( - plaintext[20..COMPACT_NOTE_SIZE].try_into().unwrap(), + plaintext[20..COMPACT_NOTE_SIZE_V2].try_into().unwrap(), &domain.rho, ))?; let pk_d = get_pk_d(&diversifier); let recipient = Address::from_parts(diversifier, pk_d); - let note = Option::from(Note::from_parts(recipient, value, domain.rho, rseed))?; + let note = Option::from(Note::from_parts( + recipient, + value, + AssetBase::native(), //V2 notes are always native. + domain.rho, + rseed, + ))?; Some((note, recipient)) } /// Orchard-specific note encryption logic. #[derive(Debug)] -pub struct OrchardDomain { +pub struct OrchardDomainV2 { rho: Rho, } -impl memuse::DynamicUsage for OrchardDomain { +impl memuse::DynamicUsage for OrchardDomainV2 { fn dynamic_usage(&self) -> usize { self.rho.dynamic_usage() } @@ -94,7 +185,7 @@ impl memuse::DynamicUsage for OrchardDomain { } } -impl OrchardDomain { +impl OrchardDomainV2 { /// Constructs a domain that can be used to trial-decrypt this action's output note. pub fn for_action(act: &Action) -> Self { Self { rho: act.rho() } @@ -106,7 +197,7 @@ impl OrchardDomain { } } -impl Domain for OrchardDomain { +impl Domain for OrchardDomainV2 { type EphemeralSecretKey = EphemeralSecretKey; type EphemeralPublicKey = EphemeralPublicKey; type PreparedEphemeralPublicKey = PreparedEphemeralPublicKey; @@ -120,7 +211,12 @@ impl Domain for OrchardDomain { type ValueCommitment = ValueCommitment; type ExtractedCommitment = ExtractedNoteCommitment; type ExtractedCommitmentBytes = [u8; 32]; - type Memo = [u8; 512]; // TODO use a more interesting type + type Memo = [u8; MEMO_SIZE]; // TODO use a more interesting type + + type NotePlaintextBytes = NotePlaintextBytes; + type NoteCiphertextBytes = NoteCiphertextBytes; + type CompactNotePlaintextBytes = CompactNotePlaintextBytes; + type CompactNoteCiphertextBytes = CompactNoteCiphertextBytes; fn derive_esk(note: &Self::Note) -> Option { Some(note.esk()) @@ -160,7 +256,7 @@ impl Domain for OrchardDomain { } fn note_plaintext_bytes(note: &Self::Note, memo: &Self::Memo) -> NotePlaintextBytes { - let mut np = [0; NOTE_PLAINTEXT_SIZE]; + let mut np = [0; NOTE_PLAINTEXT_SIZE_V2]; np[0] = 0x02; np[1..12].copy_from_slice(note.recipient().diversifier().as_array()); np[12..20].copy_from_slice(¬e.value().to_bytes()); @@ -203,7 +299,7 @@ impl Domain for OrchardDomain { fn parse_note_plaintext_without_memo_ivk( &self, ivk: &Self::IncomingViewingKey, - plaintext: &[u8], + plaintext: &CompactNotePlaintextBytes, ) -> Option<(Self::Note, Self::Recipient)> { orchard_parse_note_plaintext_without_memo(self, plaintext, |diversifier| { DiversifiedTransmissionKey::derive(ivk, diversifier) @@ -218,10 +314,12 @@ impl Domain for OrchardDomain { orchard_parse_note_plaintext_without_memo(self, &plaintext.0, |_| *pk_d) } - fn extract_memo(&self, plaintext: &NotePlaintextBytes) -> Self::Memo { - plaintext.0[COMPACT_NOTE_SIZE..NOTE_PLAINTEXT_SIZE] - .try_into() - .unwrap() + fn extract_memo( + &self, + plaintext: &NotePlaintextBytes, + ) -> (Self::CompactNotePlaintextBytes, Self::Memo) { + let (compact, memo) = plaintext.0.split_at(COMPACT_NOTE_SIZE_V2); + (compact.try_into().unwrap(), memo.try_into().unwrap()) } fn extract_pk_d(out_plaintext: &OutPlaintextBytes) -> Option { @@ -234,7 +332,7 @@ impl Domain for OrchardDomain { } } -impl BatchDomain for OrchardDomain { +impl BatchDomain for OrchardDomainV2 { fn batch_kdf<'a>( items: impl Iterator, &'a EphemeralKeyBytes)>, ) -> Vec> { @@ -250,9 +348,9 @@ impl BatchDomain for OrchardDomain { } /// Implementation of in-band secret distribution for Orchard bundles. -pub type OrchardNoteEncryption = zcash_note_encryption::NoteEncryption; +pub type OrchardNoteEncryption = zcash_note_encryption_zsa::NoteEncryption; -impl ShieldedOutput for Action { +impl ShieldedOutput for Action { fn ephemeral_key(&self) -> EphemeralKeyBytes { EphemeralKeyBytes(self.encrypted_note().epk_bytes) } @@ -261,8 +359,16 @@ impl ShieldedOutput for Action { self.cmx().to_bytes() } - fn enc_ciphertext(&self) -> &[u8; ENC_CIPHERTEXT_SIZE] { - &self.encrypted_note().enc_ciphertext + fn enc_ciphertext(&self) -> Option { + Some(NoteCiphertextBytes(self.encrypted_note().enc_ciphertext)) + } + + fn enc_ciphertext_compact(&self) -> CompactNoteCiphertextBytes { + CompactNoteCiphertextBytes( + self.encrypted_note().enc_ciphertext[..COMPACT_NOTE_SIZE_V2] + .try_into() + .unwrap(), + ) } } @@ -272,7 +378,7 @@ pub struct CompactAction { nullifier: Nullifier, cmx: ExtractedNoteCommitment, ephemeral_key: EphemeralKeyBytes, - enc_ciphertext: [u8; 52], + enc_ciphertext: CompactNoteCiphertextBytes, } impl fmt::Debug for CompactAction { @@ -281,20 +387,25 @@ impl fmt::Debug for CompactAction { } } -impl From<&Action> for CompactAction { +impl From<&Action> for CompactAction +where + Action: ShieldedOutput, +{ fn from(action: &Action) -> Self { CompactAction { nullifier: *action.nullifier(), cmx: *action.cmx(), ephemeral_key: action.ephemeral_key(), - enc_ciphertext: action.encrypted_note().enc_ciphertext[..52] - .try_into() - .unwrap(), + enc_ciphertext: CompactNoteCiphertextBytes( + action.encrypted_note().enc_ciphertext[..COMPACT_NOTE_SIZE_V2] + .try_into() + .unwrap(), + ), } } } -impl ShieldedOutput for CompactAction { +impl ShieldedOutput for CompactAction { fn ephemeral_key(&self) -> EphemeralKeyBytes { EphemeralKeyBytes(self.ephemeral_key.0) } @@ -303,8 +414,12 @@ impl ShieldedOutput for CompactAction { self.cmx.to_bytes() } - fn enc_ciphertext(&self) -> &[u8; COMPACT_NOTE_SIZE] { - &self.enc_ciphertext + fn enc_ciphertext(&self) -> Option { + None + } + + fn enc_ciphertext_compact(&self) -> CompactNoteCiphertextBytes { + self.enc_ciphertext.clone() } } @@ -314,7 +429,7 @@ impl CompactAction { nullifier: Nullifier, cmx: ExtractedNoteCommitment, ephemeral_key: EphemeralKeyBytes, - enc_ciphertext: [u8; 52], + enc_ciphertext: CompactNoteCiphertextBytes, ) -> Self { Self { nullifier, @@ -396,25 +511,63 @@ pub mod testing { #[cfg(test)] mod tests { + use proptest::proptest; use rand::rngs::OsRng; - use zcash_note_encryption::{ - try_compact_note_decryption, try_note_decryption, try_output_recovery_with_ovk, + use zcash_note_encryption_zsa::{ + try_compact_note_decryption, try_note_decryption, try_output_recovery_with_ovk, Domain, EphemeralKeyBytes, }; - use super::{prf_ock_orchard, CompactAction, OrchardDomain, OrchardNoteEncryption}; + use super::{prf_ock_orchard, CompactAction, OrchardDomainV2, OrchardNoteEncryption}; + use crate::note::AssetBase; use crate::{ action::Action, keys::{ DiversifiedTransmissionKey, Diversifier, EphemeralSecretKey, IncomingViewingKey, OutgoingViewingKey, PreparedIncomingViewingKey, }, - note::{ExtractedNoteCommitment, Nullifier, RandomSeed, Rho, TransmittedNoteCiphertext}, + note::{ + testing::arb_native_note, ExtractedNoteCommitment, Nullifier, RandomSeed, Rho, + TransmittedNoteCiphertext, + }, + note_encryption::{ + note_version, orchard_parse_note_plaintext_without_memo, NoteCiphertextBytes, + }, primitives::redpallas, value::{NoteValue, ValueCommitment}, Address, Note, }; + proptest! { + #[test] + fn test_encoding_roundtrip( + note in arb_native_note(), + ) { + let memo = &crate::test_vectors::note_encryption::test_vectors()[0].memo; + + // Encode. + let mut plaintext = OrchardDomainV2::note_plaintext_bytes(¬e, ¬e.recipient(), memo); + + // Decode. + let domain = OrchardDomainV2 { rho: note.rho() }; + let parsed_version = note_version(plaintext.as_mut()).unwrap(); + let (compact,parsed_memo) = domain.extract_memo(&plaintext); + + let (parsed_note, parsed_recipient) = orchard_parse_note_plaintext_without_memo(&domain, &compact.0, + |diversifier| { + assert_eq!(diversifier, ¬e.recipient().diversifier()); + Some(*note.recipient().pk_d()) + } + ).expect("Plaintext parsing failed"); + + // Check. + assert_eq!(parsed_note, note); + assert_eq!(parsed_recipient, note.recipient()); + assert_eq!(&parsed_memo, memo); + assert_eq!(parsed_version, 0x02); + } + } + #[test] fn test_vectors() { let test_vectors = crate::test_vectors::note_encryption::test_vectors(); @@ -459,7 +612,7 @@ mod tests { assert_eq!(ock.as_ref(), tv.ock); let recipient = Address::from_parts(d, pk_d); - let note = Note::from_parts(recipient, value, rho, rseed).unwrap(); + let note = Note::from_parts(recipient, value, AssetBase::native(), rho, rseed).unwrap(); assert_eq!(ExtractedNoteCommitment::from(note.commitment()), cmx); let action = Action::from_parts( @@ -482,7 +635,7 @@ mod tests { // (Tested first because it only requires immutable references.) // - let domain = OrchardDomain { rho }; + let domain = OrchardDomainV2 { rho }; match try_note_decryption(&domain, &ivk, &action) { Some((decrypted_note, decrypted_to, decrypted_memo)) => { diff --git a/src/note_encryption_v2v3.rs b/src/note_encryption_v2v3.rs new file mode 100644 index 000000000..107184ab8 --- /dev/null +++ b/src/note_encryption_v2v3.rs @@ -0,0 +1,716 @@ +//! In-band secret distribution for Orchard bundles. + +use blake2b_simd::{Hash, Params}; +use core::fmt; +use group::ff::PrimeField; +use zcash_note_encryption_zsa::{ + BatchDomain, Domain, EphemeralKeyBytes, OutPlaintextBytes, OutgoingCipherKey, ShieldedOutput, + AEAD_TAG_SIZE, MEMO_SIZE, OUT_PLAINTEXT_SIZE, +}; + +use crate::note::AssetBase; +use crate::{ + action::Action, + keys::{ + DiversifiedTransmissionKey, Diversifier, EphemeralPublicKey, EphemeralSecretKey, + IncomingViewingKey, OutgoingViewingKey, SharedSecret, + }, + note::{ExtractedNoteCommitment, Nullifier, RandomSeed}, + spec::diversify_hash, + value::{NoteValue, ValueCommitment}, + Address, Note, +}; + +const PRF_OCK_ORCHARD_PERSONALIZATION: &[u8; 16] = b"Zcash_Orchardock"; + +/// The size of a v2 compact note. +pub const COMPACT_NOTE_SIZE_V2: usize = 1 + // version + 11 + // diversifier + 8 + // value + 32; // rseed (or rcm prior to ZIP 212) +/// The size of [`NotePlaintextBytes`] for V2. +pub const NOTE_PLAINTEXT_SIZE_V2: usize = COMPACT_NOTE_SIZE_V2 + MEMO_SIZE; +/// The size of an encrypted note plaintext. +pub const ENC_CIPHERTEXT_SIZE_V2: usize = NOTE_PLAINTEXT_SIZE_V2 + AEAD_TAG_SIZE; + +/// The size of the encoding of a ZSA asset id. +const ZSA_ASSET_SIZE: usize = 32; +/// The size of a v3 compact note. +const COMPACT_NOTE_SIZE_V3: usize = COMPACT_NOTE_SIZE_V2 + ZSA_ASSET_SIZE; +/// The size of [`NotePlaintextBytes`] for V3. +const NOTE_PLAINTEXT_SIZE_V3: usize = COMPACT_NOTE_SIZE_V3 + MEMO_SIZE; +/// The size of the encrypted ciphertext of the ZSA variant of a note. +const ENC_CIPHERTEXT_SIZE_V3: usize = NOTE_PLAINTEXT_SIZE_V3 + AEAD_TAG_SIZE; + +/// Defined in [Zcash Protocol Spec § 5.4.2: Pseudo Random Functions][concreteprfs]. +/// +/// [concreteprfs]: https://zips.z.cash/protocol/nu5.pdf#concreteprfs +pub(crate) fn prf_ock_orchard( + ovk: &OutgoingViewingKey, + cv: &ValueCommitment, + cmx_bytes: &[u8; 32], + ephemeral_key: &EphemeralKeyBytes, +) -> OutgoingCipherKey { + OutgoingCipherKey( + Params::new() + .hash_length(32) + .personal(PRF_OCK_ORCHARD_PERSONALIZATION) + .to_state() + .update(ovk.as_ref()) + .update(&cv.to_bytes()) + .update(cmx_bytes) + .update(ephemeral_key.as_ref()) + .finalize() + .as_bytes() + .try_into() + .unwrap(), + ) +} + +// TODO: VA: Needs updating +/// Domain-specific requirements: +/// - If the note version is 3, the `plaintext` must contain a valid encoding of a ZSA asset type. +fn orchard_parse_note_plaintext_without_memo( + domain: &OrchardDomain, + plaintext: &CompactNotePlaintextBytes, + get_validated_pk_d: F, +) -> Option<(Note, Address)> +where + F: FnOnce(&Diversifier) -> Option, +{ + // Check note plaintext version + // and parse the asset type accordingly. + let asset = parse_version_and_asset_type(plaintext)?; + + let mut plaintext_inner = [0u8; COMPACT_NOTE_SIZE_V2]; + match plaintext { + CompactNotePlaintextBytes::V2(x) => { + plaintext_inner.copy_from_slice(&x[..COMPACT_NOTE_SIZE_V2]) + } + CompactNotePlaintextBytes::V3(x) => { + plaintext_inner.copy_from_slice(&x[..COMPACT_NOTE_SIZE_V2]) + } + } + + // The unwraps below are guaranteed to succeed by the assertion above + let diversifier = Diversifier::from_bytes(plaintext_inner[1..12].try_into().unwrap()); + let value = NoteValue::from_bytes(plaintext_inner[12..20].try_into().unwrap()); + let rseed = Option::from(RandomSeed::from_bytes( + plaintext_inner[20..COMPACT_NOTE_SIZE_V2] + .try_into() + .unwrap(), + &domain.rho, + ))?; + + let pk_d = get_validated_pk_d(&diversifier)?; + + let recipient = Address::from_parts(diversifier, pk_d); + let note = Option::from(Note::from_parts(recipient, value, asset, domain.rho, rseed))?; + Some((note, recipient)) +} + +fn parse_version_and_asset_type(plaintext: &CompactNotePlaintextBytes) -> Option { + match plaintext { + CompactNotePlaintextBytes::V2(x) if x[0] == 0x02 => Some(AssetBase::native()), + CompactNotePlaintextBytes::V3(x) if x[0] == 0x03 => { + let bytes = x[COMPACT_NOTE_SIZE_V2..COMPACT_NOTE_SIZE_V3] + .try_into() + .unwrap(); + AssetBase::from_bytes(bytes).into() + } + _ => None, + } +} + +/// Orchard-specific note encryption logic. +#[derive(Debug)] +pub struct OrchardDomain { + rho: Nullifier, +} + +/// Newtype for encoding the note plaintext post ZSA. +// pub struct NotePlaintextZSA (pub [u8; ZSA_NOTE_PLAINTEXT_SIZE]); +#[derive(Clone, Debug)] +pub enum NotePlaintextBytes { + /// Variant for old note plaintexts. + V2([u8; NOTE_PLAINTEXT_SIZE_V2]), + /// Variant for the new note plaintexts post ZSA. + V3([u8; NOTE_PLAINTEXT_SIZE_V3]), +} + +impl AsMut<[u8]> for NotePlaintextBytes { + fn as_mut(&mut self) -> &mut [u8] { + match self { + NotePlaintextBytes::V2(x) => x.as_mut(), + NotePlaintextBytes::V3(x) => x.as_mut(), + } + } +} + +impl From<&[u8]> for NotePlaintextBytes { + fn from(s: &[u8]) -> Self + where + Self: Sized, + { + match s.len() { + NOTE_PLAINTEXT_SIZE_V2 => NotePlaintextBytes::V2(s.try_into().unwrap()), + NOTE_PLAINTEXT_SIZE_V3 => NotePlaintextBytes::V3(s.try_into().unwrap()), + _ => panic!("Invalid note plaintext size"), + } + } +} + +/// Newtype for encoding the encrypted note ciphertext post ZSA. +// pub struct EncNoteCiphertextZSA (pub [u8; ZSA_ENC_CIPHERTEXT_SIZE]); +#[derive(Clone, Debug)] +pub enum NoteCiphertextBytes { + /// Variant for old encrypted note ciphertexts. + V2([u8; ENC_CIPHERTEXT_SIZE_V2]), + /// Variant for new encrypted note ciphertexts post ZSA. + V3([u8; ENC_CIPHERTEXT_SIZE_V3]), +} + +impl AsRef<[u8]> for NoteCiphertextBytes { + fn as_ref(&self) -> &[u8] { + match self { + NoteCiphertextBytes::V2(x) => x, + NoteCiphertextBytes::V3(x) => x, + } + } +} + +/// Panics if the given slice is not `ENC_CIPHERTEXT_SIZE_V2` or `ENC_CIPHERTEXT_SIZE_V3` bytes long. +impl From<&[u8]> for NoteCiphertextBytes { + fn from(s: &[u8]) -> Self + where + Self: Sized, + { + match s.len() { + ENC_CIPHERTEXT_SIZE_V2 => NoteCiphertextBytes::V2(s.try_into().unwrap()), + ENC_CIPHERTEXT_SIZE_V3 => NoteCiphertextBytes::V3(s.try_into().unwrap()), + _ => panic!("Invalid length for compact note plaintext"), + } + } +} + +/// Newtype for encoding a compact note +#[derive(Clone, Debug)] +pub enum CompactNotePlaintextBytes { + /// Variant for old compact notes. + V2([u8; COMPACT_NOTE_SIZE_V2]), + /// Variant for new compact notes post ZSA. + V3([u8; COMPACT_NOTE_SIZE_V3]), +} + +impl AsMut<[u8]> for CompactNotePlaintextBytes { + fn as_mut(&mut self) -> &mut [u8] { + match self { + CompactNotePlaintextBytes::V2(x) => x, + CompactNotePlaintextBytes::V3(x) => x, + } + } +} + +/// Panics if the given slice is not `COMPACT_NOTE_SIZE_V2` or `COMPACT_NOTE_SIZE_V3` bytes long. +impl From<&[u8]> for CompactNotePlaintextBytes { + fn from(s: &[u8]) -> Self + where + Self: Sized, + { + match s.len() { + COMPACT_NOTE_SIZE_V2 => CompactNotePlaintextBytes::V2(s.try_into().unwrap()), + COMPACT_NOTE_SIZE_V3 => CompactNotePlaintextBytes::V3(s.try_into().unwrap()), + _ => panic!("Invalid length for compact note plaintext"), + } + } +} + +/// Newtype for encoding a compact note +#[derive(Clone, Debug)] +pub enum CompactNoteCiphertextBytes { + /// Variant for old compact notes. + V2([u8; COMPACT_NOTE_SIZE_V2]), + /// Variant for new compact notes post ZSA. + V3([u8; COMPACT_NOTE_SIZE_V3]), +} + +impl AsRef<[u8]> for CompactNoteCiphertextBytes { + fn as_ref(&self) -> &[u8] { + match self { + CompactNoteCiphertextBytes::V2(x) => x, + CompactNoteCiphertextBytes::V3(x) => x, + } + } +} + +impl OrchardDomain { + /// Constructs a domain that can be used to trial-decrypt this action's output note. + pub fn for_action(act: &Action) -> Self { + OrchardDomain { + rho: *act.nullifier(), + } + } + + /// Constructs a domain from a nullifier. + pub fn for_nullifier(nullifier: Nullifier) -> Self { + OrchardDomain { rho: nullifier } + } +} + +impl Domain for OrchardDomain { + type EphemeralSecretKey = EphemeralSecretKey; + type EphemeralPublicKey = EphemeralPublicKey; + type PreparedEphemeralPublicKey = EphemeralPublicKey; + type SharedSecret = SharedSecret; + type SymmetricKey = Hash; + type Note = Note; + type Recipient = Address; + type DiversifiedTransmissionKey = DiversifiedTransmissionKey; + type IncomingViewingKey = IncomingViewingKey; + type OutgoingViewingKey = OutgoingViewingKey; + type ValueCommitment = ValueCommitment; + type ExtractedCommitment = ExtractedNoteCommitment; + type ExtractedCommitmentBytes = [u8; 32]; + type Memo = [u8; MEMO_SIZE]; // TODO use a more interesting type + + type NotePlaintextBytes = NotePlaintextBytes; + type NoteCiphertextBytes = NoteCiphertextBytes; + type CompactNotePlaintextBytes = CompactNotePlaintextBytes; + type CompactNoteCiphertextBytes = CompactNoteCiphertextBytes; + + fn derive_esk(note: &Self::Note) -> Option { + Some(note.esk()) + } + + fn get_pk_d(note: &Self::Note) -> Self::DiversifiedTransmissionKey { + *note.recipient().pk_d() + } + + fn prepare_epk(epk: Self::EphemeralPublicKey) -> Self::PreparedEphemeralPublicKey { + epk + } + + fn ka_derive_public( + note: &Self::Note, + esk: &Self::EphemeralSecretKey, + ) -> Self::EphemeralPublicKey { + esk.derive_public(note.recipient().g_d()) + } + + fn ka_agree_enc( + esk: &Self::EphemeralSecretKey, + pk_d: &Self::DiversifiedTransmissionKey, + ) -> Self::SharedSecret { + esk.agree(pk_d) + } + + fn ka_agree_dec( + ivk: &Self::IncomingViewingKey, + epk: &Self::PreparedEphemeralPublicKey, + ) -> Self::SharedSecret { + epk.agree(ivk) + } + + fn kdf(secret: Self::SharedSecret, ephemeral_key: &EphemeralKeyBytes) -> Self::SymmetricKey { + secret.kdf_orchard(ephemeral_key) + } + + fn note_plaintext_bytes( + note: &Self::Note, + _: &Self::Recipient, + memo: &Self::Memo, + ) -> NotePlaintextBytes { + let mut np = [0u8; NOTE_PLAINTEXT_SIZE_V3]; + np[0] = 0x03; + np[1..12].copy_from_slice(note.recipient().diversifier().as_array()); + np[12..20].copy_from_slice(¬e.value().to_bytes()); + np[20..52].copy_from_slice(note.rseed().as_bytes()); + let zsa_type = note.asset().to_bytes(); + np[52..84].copy_from_slice(&zsa_type); + np[84..].copy_from_slice(memo); + NotePlaintextBytes::V3(np) + } + + fn derive_ock( + ovk: &Self::OutgoingViewingKey, + cv: &Self::ValueCommitment, + cmstar_bytes: &Self::ExtractedCommitmentBytes, + ephemeral_key: &EphemeralKeyBytes, + ) -> OutgoingCipherKey { + prf_ock_orchard(ovk, cv, cmstar_bytes, ephemeral_key) + } + + fn outgoing_plaintext_bytes( + note: &Self::Note, + esk: &Self::EphemeralSecretKey, + ) -> OutPlaintextBytes { + let mut op = [0; OUT_PLAINTEXT_SIZE]; + op[..32].copy_from_slice(¬e.recipient().pk_d().to_bytes()); + op[32..].copy_from_slice(&esk.0.to_repr()); + OutPlaintextBytes(op) + } + + fn epk_bytes(epk: &Self::EphemeralPublicKey) -> EphemeralKeyBytes { + epk.to_bytes() + } + + fn epk(ephemeral_key: &EphemeralKeyBytes) -> Option { + EphemeralPublicKey::from_bytes(&ephemeral_key.0).into() + } + + fn cmstar(note: &Self::Note) -> Self::ExtractedCommitment { + note.commitment().into() + } + + fn parse_note_plaintext_without_memo_ivk( + &self, + ivk: &Self::IncomingViewingKey, + plaintext: &CompactNotePlaintextBytes, + ) -> Option<(Self::Note, Self::Recipient)> { + orchard_parse_note_plaintext_without_memo(self, plaintext, |diversifier| { + Some(DiversifiedTransmissionKey::derive(ivk, diversifier)) + }) + } + + fn parse_note_plaintext_without_memo_ovk( + &self, + pk_d: &Self::DiversifiedTransmissionKey, + esk: &Self::EphemeralSecretKey, + ephemeral_key: &EphemeralKeyBytes, + plaintext: &CompactNotePlaintextBytes, + ) -> Option<(Self::Note, Self::Recipient)> { + orchard_parse_note_plaintext_without_memo(self, plaintext, |diversifier| { + if esk + .derive_public(diversify_hash(diversifier.as_array())) + .to_bytes() + .0 + == ephemeral_key.0 + { + Some(*pk_d) + } else { + None + } + }) + } + + fn extract_memo( + &self, + plaintext: &NotePlaintextBytes, + ) -> (Self::CompactNotePlaintextBytes, Self::Memo) { + match plaintext { + NotePlaintextBytes::V2(np) => { + let (compact, memo) = np.split_at(COMPACT_NOTE_SIZE_V2); + ( + CompactNotePlaintextBytes::V2(compact.try_into().unwrap()), + memo.try_into().unwrap(), + ) + } + NotePlaintextBytes::V3(np) => { + let (compact, memo) = np.split_at(COMPACT_NOTE_SIZE_V3); + ( + CompactNotePlaintextBytes::V3(compact.try_into().unwrap()), + memo.try_into().unwrap(), + ) + } + } + } + + fn extract_pk_d(out_plaintext: &OutPlaintextBytes) -> Option { + DiversifiedTransmissionKey::from_bytes(out_plaintext.0[0..32].try_into().unwrap()).into() + } + + fn extract_esk(out_plaintext: &OutPlaintextBytes) -> Option { + EphemeralSecretKey::from_bytes(out_plaintext.0[32..OUT_PLAINTEXT_SIZE].try_into().unwrap()) + .into() + } +} + +impl BatchDomain for OrchardDomain { + fn batch_kdf<'a>( + items: impl Iterator, &'a EphemeralKeyBytes)>, + ) -> Vec> { + let (shared_secrets, ephemeral_keys): (Vec<_>, Vec<_>) = items.unzip(); + + SharedSecret::batch_to_affine(shared_secrets) + .zip(ephemeral_keys.into_iter()) + .map(|(secret, ephemeral_key)| { + secret.map(|dhsecret| SharedSecret::kdf_orchard_inner(dhsecret, ephemeral_key)) + }) + .collect() + } +} + +/// Implementation of in-band secret distribution for Orchard bundles. +pub type OrchardNoteEncryption = zcash_note_encryption_zsa::NoteEncryption; + +impl ShieldedOutput for Action { + fn ephemeral_key(&self) -> EphemeralKeyBytes { + EphemeralKeyBytes(self.encrypted_note().epk_bytes) + } + + fn cmstar_bytes(&self) -> [u8; 32] { + self.cmx().to_bytes() + } + + fn enc_ciphertext(&self) -> Option { + let result = self.encrypted_note().enc_ciphertext.clone(); + Some(result) + } + + fn enc_ciphertext_compact(&self) -> CompactNoteCiphertextBytes { + match self.encrypted_note().enc_ciphertext { + NoteCiphertextBytes::V2(ncx) => { + CompactNoteCiphertextBytes::V2(ncx[..COMPACT_NOTE_SIZE_V2].try_into().unwrap()) + } + NoteCiphertextBytes::V3(ncx) => { + CompactNoteCiphertextBytes::V3(ncx[..COMPACT_NOTE_SIZE_V3].try_into().unwrap()) + } + } + } +} + +/// A compact Action for light clients. +pub struct CompactAction { + nullifier: Nullifier, + cmx: ExtractedNoteCommitment, + ephemeral_key: EphemeralKeyBytes, + enc_ciphertext: CompactNoteCiphertextBytes, +} + +impl fmt::Debug for CompactAction { + fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result { + write!(f, "CompactAction") + } +} + +impl From<&Action> for CompactAction { + fn from(action: &Action) -> Self { + let comp_ciphertext: CompactNoteCiphertextBytes = + match action.encrypted_note().enc_ciphertext { + NoteCiphertextBytes::V2(ncx) => { + CompactNoteCiphertextBytes::V2(ncx[..COMPACT_NOTE_SIZE_V2].try_into().unwrap()) + } + NoteCiphertextBytes::V3(ncx) => { + CompactNoteCiphertextBytes::V3(ncx[..COMPACT_NOTE_SIZE_V3].try_into().unwrap()) + } + }; + CompactAction { + nullifier: *action.nullifier(), + cmx: *action.cmx(), + ephemeral_key: action.ephemeral_key(), + enc_ciphertext: comp_ciphertext, + } + } +} + +impl ShieldedOutput for CompactAction { + fn ephemeral_key(&self) -> EphemeralKeyBytes { + EphemeralKeyBytes(self.ephemeral_key.0) + } + + fn cmstar_bytes(&self) -> [u8; 32] { + self.cmx.to_bytes() + } + + fn enc_ciphertext(&self) -> Option { + None + } + + fn enc_ciphertext_compact(&self) -> CompactNoteCiphertextBytes { + &self.enc_ciphertext + } +} + +impl CompactAction { + /// Create a CompactAction from its constituent parts + pub fn from_parts( + nullifier: Nullifier, + cmx: ExtractedNoteCommitment, + ephemeral_key: EphemeralKeyBytes, + enc_ciphertext: CompactNoteCiphertextBytes, + ) -> Self { + Self { + nullifier, + cmx, + ephemeral_key, + enc_ciphertext, + } + } + + ///Returns the nullifier of the note being spent. + pub fn nullifier(&self) -> Nullifier { + self.nullifier + } +} + +#[cfg(test)] +mod tests { + use proptest::prelude::*; + use rand::rngs::OsRng; + use zcash_note_encryption_zsa::{ + try_compact_note_decryption, try_note_decryption, try_output_recovery_with_ovk, Domain, + EphemeralKeyBytes, + }; + + use super::{prf_ock_orchard, CompactAction, OrchardDomain, OrchardNoteEncryption}; + use crate::note::AssetBase; + use crate::note_encryption::NoteCiphertextBytes; + use crate::{ + action::Action, + keys::{ + DiversifiedTransmissionKey, Diversifier, EphemeralSecretKey, IncomingViewingKey, + OutgoingViewingKey, + }, + note::{ + testing::arb_note, ExtractedNoteCommitment, Nullifier, RandomSeed, + TransmittedNoteCiphertext, + }, + primitives::redpallas, + value::{NoteValue, ValueCommitment}, + Address, Note, + }; + + use super::{orchard_parse_note_plaintext_without_memo, version}; + + proptest! { + #[test] + fn test_encoding_roundtrip( + note in arb_note(NoteValue::from_raw(100)), + ) { + let memo = &crate::test_vectors::note_encryption::test_vectors()[0].memo; + + // Encode. + let mut plaintext = OrchardDomain::note_plaintext_bytes(¬e, ¬e.recipient(), memo); + + // Decode. + let domain = OrchardDomain { rho: note.rho() }; + let parsed_version = version(plaintext.as_mut()).unwrap(); + let (mut compact,parsed_memo) = domain.extract_memo(&plaintext); + + let (parsed_note, parsed_recipient) = orchard_parse_note_plaintext_without_memo(&domain, &compact.as_mut(), + |diversifier| { + assert_eq!(diversifier, ¬e.recipient().diversifier()); + Some(*note.recipient().pk_d()) + } + ).expect("Plaintext parsing failed"); + + // Check. + assert_eq!(parsed_note, note); + assert_eq!(parsed_recipient, note.recipient()); + assert_eq!(&parsed_memo, memo); + assert_eq!(parsed_version, 0x03); + } + } + + #[test] + fn test_vectors() { + let test_vectors = crate::test_vectors::note_encryption::test_vectors(); + + for tv in test_vectors { + // + // Load the test vector components + // + + // Recipient key material + let ivk = IncomingViewingKey::from_bytes(&tv.incoming_viewing_key).unwrap(); + let ovk = OutgoingViewingKey::from(tv.ovk); + let d = Diversifier::from_bytes(tv.default_d); + let pk_d = DiversifiedTransmissionKey::from_bytes(&tv.default_pk_d).unwrap(); + + // Received Action + let cv_net = ValueCommitment::from_bytes(&tv.cv_net).unwrap(); + let rho = Nullifier::from_bytes(&tv.rho).unwrap(); + let cmx = ExtractedNoteCommitment::from_bytes(&tv.cmx).unwrap(); + + let esk = EphemeralSecretKey::from_bytes(&tv.esk).unwrap(); + let ephemeral_key = EphemeralKeyBytes(tv.ephemeral_key); + + // Details about the expected note + let value = NoteValue::from_raw(tv.v); + let rseed = RandomSeed::from_bytes(tv.rseed, &rho).unwrap(); + + // + // Test the individual components + // + + let shared_secret = esk.agree(&pk_d); + assert_eq!(shared_secret.to_bytes(), tv.shared_secret); + + let k_enc = shared_secret.kdf_orchard(&ephemeral_key); + assert_eq!(k_enc.as_bytes(), tv.k_enc); + + let ock = prf_ock_orchard(&ovk, &cv_net, &cmx.to_bytes(), &ephemeral_key); + assert_eq!(ock.as_ref(), tv.ock); + + let recipient = Address::from_parts(d, pk_d); + + let asset = match tv.asset { + None => AssetBase::native(), + Some(type_bytes) => AssetBase::from_bytes(&type_bytes).unwrap(), + }; + + let note = Note::from_parts(recipient, value, asset, rho, rseed).unwrap(); + assert_eq!(ExtractedNoteCommitment::from(note.commitment()), cmx); + + let action = Action::from_parts( + // rho is the nullifier in the receiving Action. + rho, + // We don't need a valid rk for this test. + redpallas::VerificationKey::dummy(), + cmx, + TransmittedNoteCiphertext { + epk_bytes: ephemeral_key.0, + enc_ciphertext: NoteCiphertextBytes::V3(tv.c_enc), // TODO: VA: Would need a mix of V2 and V3 eventually + out_ciphertext: tv.c_out, + }, + cv_net.clone(), + (), + ); + + // + // Test decryption + // (Tested first because it only requires immutable references.) + // + + let domain = OrchardDomain { rho }; + + match try_note_decryption(&domain, &ivk, &action) { + Some((decrypted_note, decrypted_to, decrypted_memo)) => { + assert_eq!(decrypted_note, note); + assert_eq!(decrypted_to, recipient); + assert_eq!(&decrypted_memo[..], &tv.memo[..]); + } + None => panic!("Note decryption failed"), + } + + match try_compact_note_decryption(&domain, &ivk, &CompactAction::from(&action)) { + Some((decrypted_note, decrypted_to)) => { + assert_eq!(decrypted_note, note); + assert_eq!(decrypted_to, recipient); + } + None => panic!("Compact note decryption failed"), + } + + match try_output_recovery_with_ovk(&domain, &ovk, &action, &cv_net, &tv.c_out) { + Some((decrypted_note, decrypted_to, decrypted_memo)) => { + assert_eq!(decrypted_note, note); + assert_eq!(decrypted_to, recipient); + assert_eq!(&decrypted_memo[..], &tv.memo[..]); + } + None => panic!("Output recovery failed"), + } + + // + // Test encryption + // + + let ne = OrchardNoteEncryption::new_with_esk(esk, Some(ovk), note, recipient, tv.memo); + + // assert_eq!(ne.encrypt_note_plaintext().as_ref(), &tv.c_enc[..]); + assert_eq!( + &ne.encrypt_outgoing_plaintext(&cv_net, &cmx, &mut OsRng)[..], + &tv.c_out[..] + ); + } + } +} diff --git a/src/note_encryption_v3.rs b/src/note_encryption_v3.rs new file mode 100644 index 000000000..8fb68dbd0 --- /dev/null +++ b/src/note_encryption_v3.rs @@ -0,0 +1,632 @@ +//! In-band secret distribution for Orchard bundles. + +use blake2b_simd::{Hash, Params}; +use core::fmt; +use group::ff::PrimeField; +use zcash_note_encryption_zsa::{ + BatchDomain, Domain, EphemeralKeyBytes, OutPlaintextBytes, OutgoingCipherKey, ShieldedOutput, + AEAD_TAG_SIZE, MEMO_SIZE, OUT_PLAINTEXT_SIZE, +}; + +use crate::note::AssetBase; +use crate::{ + action::Action, + keys::{ + DiversifiedTransmissionKey, Diversifier, EphemeralPublicKey, EphemeralSecretKey, + OutgoingViewingKey, PreparedEphemeralPublicKey, PreparedIncomingViewingKey, SharedSecret, + }, + note::{ExtractedNoteCommitment, Nullifier, RandomSeed, Rho}, + value::{NoteValue, ValueCommitment}, + Address, Note, +}; + +const PRF_OCK_ORCHARD_PERSONALIZATION: &[u8; 16] = b"Zcash_Orchardock"; + +/// The size of a v2 compact note. +pub const COMPACT_NOTE_SIZE_V2: usize = 1 + // version + 11 + // diversifier + 8 + // value + 32; // rseed (or rcm prior to ZIP 212) +/// The size of [`NotePlaintextBytes`] for V2. + +/// The size of the encoding of a ZSA asset id. +const ZSA_ASSET_SIZE: usize = 32; +/// The size of a v3 compact note. +pub const COMPACT_NOTE_SIZE_V3: usize = COMPACT_NOTE_SIZE_V2 + ZSA_ASSET_SIZE; +/// The size of [`NotePlaintextBytes`] for V3. +pub const NOTE_PLAINTEXT_SIZE_V3: usize = COMPACT_NOTE_SIZE_V3 + MEMO_SIZE; +/// The size of the encrypted ciphertext of the ZSA variant of a note. +pub const ENC_CIPHERTEXT_SIZE_V3: usize = NOTE_PLAINTEXT_SIZE_V3 + AEAD_TAG_SIZE; + +/// a type to represent the raw bytes of a note plaintext. +#[derive(Clone, Debug)] +pub struct NotePlaintextBytes(pub [u8; NOTE_PLAINTEXT_SIZE_V3]); + +/// a type to represent the raw bytes of an encrypted note plaintext. +#[derive(Clone, Debug)] +pub struct NoteCiphertextBytes(pub [u8; ENC_CIPHERTEXT_SIZE_V3]); + +/// a type to represent the raw bytes of a compact note. +#[derive(Clone, Debug)] +pub struct CompactNotePlaintextBytes(pub [u8; COMPACT_NOTE_SIZE_V3]); + +/// a type to represent the raw bytes of an encrypted compact note. +#[derive(Clone, Debug)] +pub struct CompactNoteCiphertextBytes(pub [u8; COMPACT_NOTE_SIZE_V3]); + +impl AsMut<[u8]> for NotePlaintextBytes { + fn as_mut(&mut self) -> &mut [u8] { + self.0.as_mut() + } +} + +impl From<&[u8]> for NotePlaintextBytes { + fn from(s: &[u8]) -> Self + where + Self: Sized, + { + NotePlaintextBytes(s.try_into().unwrap()) + } +} + +impl AsRef<[u8]> for NoteCiphertextBytes { + fn as_ref(&self) -> &[u8] { + self.0.as_ref() + } +} + +impl AsMut<[u8]> for NoteCiphertextBytes { + fn as_mut(&mut self) -> &mut [u8] { + self.0.as_mut() + } +} + +impl From<(&[u8], &[u8])> for NoteCiphertextBytes { + fn from(s: (&[u8], &[u8])) -> Self { + Self([s.0, s.1].concat().try_into().unwrap()) + } +} + +impl From<&[u8]> for NoteCiphertextBytes { + fn from(s: &[u8]) -> Self + where + Self: Sized, + { + NoteCiphertextBytes(s.try_into().unwrap()) + } +} + +impl AsMut<[u8]> for CompactNotePlaintextBytes { + fn as_mut(&mut self) -> &mut [u8] { + self.0.as_mut() + } +} + +impl From<&[u8]> for CompactNotePlaintextBytes { + fn from(s: &[u8]) -> Self + where + Self: Sized, + { + CompactNotePlaintextBytes(s.try_into().unwrap()) + } +} + +impl AsRef<[u8]> for CompactNoteCiphertextBytes { + fn as_ref(&self) -> &[u8] { + self.0.as_ref() + } +} + +/// Defined in [Zcash Protocol Spec § 5.4.2: Pseudo Random Functions][concreteprfs]. +/// +/// [concreteprfs]: https://zips.z.cash/protocol/nu5.pdf#concreteprfs +pub(crate) fn prf_ock_orchard( + ovk: &OutgoingViewingKey, + cv: &ValueCommitment, + cmx_bytes: &[u8; 32], + ephemeral_key: &EphemeralKeyBytes, +) -> OutgoingCipherKey { + OutgoingCipherKey( + Params::new() + .hash_length(32) + .personal(PRF_OCK_ORCHARD_PERSONALIZATION) + .to_state() + .update(ovk.as_ref()) + .update(&cv.to_bytes()) + .update(cmx_bytes) + .update(ephemeral_key.as_ref()) + .finalize() + .as_bytes() + .try_into() + .unwrap(), + ) +} + +/// note_version will return the version of the note plaintext. +pub fn note_version(plaintext: &[u8]) -> Option { + match plaintext[0] { + 0x02 => Some(0x02), + 0x03 => Some(0x03), + _ => None, + } +} + +/// Domain-specific requirements: +/// - If the note version is 3, the `plaintext` must contain a valid encoding of a ZSA asset type. +fn orchard_parse_note_plaintext_without_memo( + domain: &OrchardDomainV3, + plaintext: &CompactNotePlaintextBytes, + get_validated_pk_d: F, +) -> Option<(Note, Address)> +where + F: FnOnce(&Diversifier) -> Option, +{ + // The unwraps below are guaranteed to succeed by the assertion above + let diversifier = Diversifier::from_bytes(plaintext.0[1..12].try_into().unwrap()); + let value = NoteValue::from_bytes(plaintext.0[12..20].try_into().unwrap()); + let rseed = Option::from(RandomSeed::from_bytes( + plaintext.0[20..COMPACT_NOTE_SIZE_V2].try_into().unwrap(), + &domain.rho, + ))?; + let pk_d = get_validated_pk_d(&diversifier)?; + let recipient = Address::from_parts(diversifier, pk_d); + + let asset = match note_version(plaintext.0.as_ref())? { + 0x02 => AssetBase::native(), + 0x03 => { + let bytes = plaintext.0[COMPACT_NOTE_SIZE_V2..COMPACT_NOTE_SIZE_V3] + .try_into() + .unwrap(); + AssetBase::from_bytes(bytes).unwrap() + } + _ => panic!("invalid note version"), + }; + + let note = Option::from(Note::from_parts(recipient, value, asset, domain.rho, rseed))?; + Some((note, recipient)) +} + +/// Orchard-specific note encryption logic. +#[derive(Debug)] +pub struct OrchardDomainV3 { + rho: Rho, +} + +impl OrchardDomainV3 { + /// Constructs a domain that can be used to trial-decrypt this action's output note. + pub fn for_action(act: &Action) -> Self { + Self { rho: act.rho() } + } + + /// Constructs a domain that can be used to trial-decrypt this action's output note. + pub fn for_compact_action(act: &CompactAction) -> Self { + Self { rho: act.rho() } + } +} + +impl Domain for OrchardDomainV3 { + type EphemeralSecretKey = EphemeralSecretKey; + type EphemeralPublicKey = EphemeralPublicKey; + type PreparedEphemeralPublicKey = PreparedEphemeralPublicKey; + type SharedSecret = SharedSecret; + type SymmetricKey = Hash; + type Note = Note; + type Recipient = Address; + type DiversifiedTransmissionKey = DiversifiedTransmissionKey; + type IncomingViewingKey = PreparedIncomingViewingKey; + type OutgoingViewingKey = OutgoingViewingKey; + type ValueCommitment = ValueCommitment; + type ExtractedCommitment = ExtractedNoteCommitment; + type ExtractedCommitmentBytes = [u8; 32]; + type Memo = [u8; MEMO_SIZE]; + + type NotePlaintextBytes = NotePlaintextBytes; + type NoteCiphertextBytes = NoteCiphertextBytes; + type CompactNotePlaintextBytes = CompactNotePlaintextBytes; + type CompactNoteCiphertextBytes = CompactNoteCiphertextBytes; + + fn derive_esk(note: &Self::Note) -> Option { + Some(note.esk()) + } + + fn get_pk_d(note: &Self::Note) -> Self::DiversifiedTransmissionKey { + *note.recipient().pk_d() + } + + fn prepare_epk(epk: Self::EphemeralPublicKey) -> Self::PreparedEphemeralPublicKey { + PreparedEphemeralPublicKey::new(epk) + } + + fn ka_derive_public( + note: &Self::Note, + esk: &Self::EphemeralSecretKey, + ) -> Self::EphemeralPublicKey { + esk.derive_public(note.recipient().g_d()) + } + + fn ka_agree_enc( + esk: &Self::EphemeralSecretKey, + pk_d: &Self::DiversifiedTransmissionKey, + ) -> Self::SharedSecret { + esk.agree(pk_d) + } + + fn ka_agree_dec( + ivk: &Self::IncomingViewingKey, + epk: &Self::PreparedEphemeralPublicKey, + ) -> Self::SharedSecret { + epk.agree(ivk) + } + + fn kdf(secret: Self::SharedSecret, ephemeral_key: &EphemeralKeyBytes) -> Self::SymmetricKey { + secret.kdf_orchard(ephemeral_key) + } + + fn note_plaintext_bytes(note: &Self::Note, memo: &Self::Memo) -> NotePlaintextBytes { + let mut np = [0u8; NOTE_PLAINTEXT_SIZE_V3]; + np[0] = 0x03; + np[1..12].copy_from_slice(note.recipient().diversifier().as_array()); + np[12..20].copy_from_slice(¬e.value().to_bytes()); + np[20..52].copy_from_slice(note.rseed().as_bytes()); + np[52..84].copy_from_slice(¬e.asset().to_bytes()); + np[84..].copy_from_slice(memo); + NotePlaintextBytes(np) + } + + fn derive_ock( + ovk: &Self::OutgoingViewingKey, + cv: &Self::ValueCommitment, + cmstar_bytes: &Self::ExtractedCommitmentBytes, + ephemeral_key: &EphemeralKeyBytes, + ) -> OutgoingCipherKey { + prf_ock_orchard(ovk, cv, cmstar_bytes, ephemeral_key) + } + + fn outgoing_plaintext_bytes( + note: &Self::Note, + esk: &Self::EphemeralSecretKey, + ) -> OutPlaintextBytes { + let mut op = [0; OUT_PLAINTEXT_SIZE]; + op[..32].copy_from_slice(¬e.recipient().pk_d().to_bytes()); + op[32..].copy_from_slice(&esk.0.to_repr()); + OutPlaintextBytes(op) + } + + fn epk_bytes(epk: &Self::EphemeralPublicKey) -> EphemeralKeyBytes { + epk.to_bytes() + } + + fn epk(ephemeral_key: &EphemeralKeyBytes) -> Option { + EphemeralPublicKey::from_bytes(&ephemeral_key.0).into() + } + + fn cmstar(note: &Self::Note) -> Self::ExtractedCommitment { + note.commitment().into() + } + + fn parse_note_plaintext_without_memo_ivk( + &self, + ivk: &Self::IncomingViewingKey, + plaintext: &CompactNotePlaintextBytes, + ) -> Option<(Self::Note, Self::Recipient)> { + orchard_parse_note_plaintext_without_memo(self, plaintext, |diversifier| { + Some(DiversifiedTransmissionKey::derive(ivk, diversifier)) + }) + } + + fn parse_note_plaintext_without_memo_ovk( + &self, + pk_d: &Self::DiversifiedTransmissionKey, + plaintext: &CompactNotePlaintextBytes, + ) -> Option<(Self::Note, Self::Recipient)> { + orchard_parse_note_plaintext_without_memo(self, plaintext, |_| Some(*pk_d)) + } + + fn extract_memo( + &self, + plaintext: &NotePlaintextBytes, + ) -> (Self::CompactNotePlaintextBytes, Self::Memo) { + let (compact, memo) = plaintext.0.split_at(COMPACT_NOTE_SIZE_V3); + ( + CompactNotePlaintextBytes(compact.try_into().unwrap()), + memo.try_into().unwrap(), + ) + } + + fn extract_pk_d(out_plaintext: &OutPlaintextBytes) -> Option { + DiversifiedTransmissionKey::from_bytes(out_plaintext.0[0..32].try_into().unwrap()).into() + } + + fn extract_esk(out_plaintext: &OutPlaintextBytes) -> Option { + EphemeralSecretKey::from_bytes(out_plaintext.0[32..OUT_PLAINTEXT_SIZE].try_into().unwrap()) + .into() + } +} + +impl BatchDomain for OrchardDomainV3 { + fn batch_kdf<'a>( + items: impl Iterator, &'a EphemeralKeyBytes)>, + ) -> Vec> { + let (shared_secrets, ephemeral_keys): (Vec<_>, Vec<_>) = items.unzip(); + + SharedSecret::batch_to_affine(shared_secrets) + .zip(ephemeral_keys.into_iter()) + .map(|(secret, ephemeral_key)| { + secret.map(|dhsecret| SharedSecret::kdf_orchard_inner(dhsecret, ephemeral_key)) + }) + .collect() + } +} + +/// Implementation of in-band secret distribution for Orchard bundles. +pub type OrchardNoteEncryption = zcash_note_encryption_zsa::NoteEncryption; + +impl ShieldedOutput for Action { + fn ephemeral_key(&self) -> EphemeralKeyBytes { + EphemeralKeyBytes(self.encrypted_note().epk_bytes) + } + + fn cmstar_bytes(&self) -> [u8; 32] { + self.cmx().to_bytes() + } + + fn enc_ciphertext(&self) -> Option { + Some(NoteCiphertextBytes(self.encrypted_note().enc_ciphertext)) + } + + fn enc_ciphertext_compact(&self) -> CompactNoteCiphertextBytes { + CompactNoteCiphertextBytes( + self.encrypted_note().enc_ciphertext[..COMPACT_NOTE_SIZE_V3] + .try_into() + .unwrap(), + ) + } +} + +/// A compact Action for light clients. +pub struct CompactAction { + nullifier: Nullifier, + cmx: ExtractedNoteCommitment, + ephemeral_key: EphemeralKeyBytes, + enc_ciphertext: CompactNoteCiphertextBytes, +} + +impl fmt::Debug for CompactAction { + fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result { + write!(f, "CompactAction") + } +} + +impl From<&Action> for CompactAction +where + Action: ShieldedOutput, +{ + fn from(action: &Action) -> Self { + CompactAction { + nullifier: *action.nullifier(), + cmx: *action.cmx(), + ephemeral_key: action.ephemeral_key(), + enc_ciphertext: CompactNoteCiphertextBytes( + action.encrypted_note().enc_ciphertext[..COMPACT_NOTE_SIZE_V3] + .try_into() + .unwrap(), + ), + } + } +} + +impl ShieldedOutput for CompactAction { + fn ephemeral_key(&self) -> EphemeralKeyBytes { + EphemeralKeyBytes(self.ephemeral_key.0) + } + + fn cmstar_bytes(&self) -> [u8; 32] { + self.cmx.to_bytes() + } + + fn enc_ciphertext(&self) -> Option { + None + } + + fn enc_ciphertext_compact(&self) -> CompactNoteCiphertextBytes { + self.enc_ciphertext.clone() + } +} + +impl CompactAction { + /// Create a CompactAction from its constituent parts + pub fn from_parts( + nullifier: Nullifier, + cmx: ExtractedNoteCommitment, + ephemeral_key: EphemeralKeyBytes, + enc_ciphertext: CompactNoteCiphertextBytes, + ) -> Self { + Self { + nullifier, + cmx, + ephemeral_key, + enc_ciphertext, + } + } + + ///Returns the nullifier of the note being spent. + pub fn nullifier(&self) -> Nullifier { + self.nullifier + } + + /// Obtains the [`Rho`] value that was used to construct the new note being created. + pub fn rho(&self) -> Rho { + Rho::from_nf_old(self.nullifier) + } +} + +#[cfg(test)] +mod tests { + use proptest::prelude::*; + use rand::rngs::OsRng; + use zcash_note_encryption_zsa::{ + try_compact_note_decryption, try_note_decryption, try_output_recovery_with_ovk, Domain, + EphemeralKeyBytes, + }; + + use super::{ + note_version, orchard_parse_note_plaintext_without_memo, prf_ock_orchard, CompactAction, + OrchardDomainV3, OrchardNoteEncryption, + }; + use crate::{ + action::Action, + keys::{ + DiversifiedTransmissionKey, Diversifier, EphemeralSecretKey, IncomingViewingKey, + OutgoingViewingKey, PreparedIncomingViewingKey, + }, + note::{ + testing::arb_note, AssetBase, ExtractedNoteCommitment, Nullifier, RandomSeed, Rho, + TransmittedNoteCiphertext, + }, + primitives::redpallas, + value::{NoteValue, ValueCommitment}, + Address, Note, + }; + + proptest! { + #[test] + fn test_encoding_roundtrip( + note in arb_note(NoteValue::from_raw(100)), + ) { + let memo = &crate::test_vectors::note_encryption::test_vectors()[0].memo; + + // Encode. + let mut plaintext = OrchardDomainV3::note_plaintext_bytes(¬e, memo); + + // Decode. + let domain = OrchardDomainV3 { rho: note.rho() }; + let parsed_version = note_version(plaintext.as_mut()).unwrap(); + let (compact,parsed_memo) = domain.extract_memo(&plaintext); + + let (parsed_note, parsed_recipient) = orchard_parse_note_plaintext_without_memo(&domain, &compact, + |diversifier| { + assert_eq!(diversifier, ¬e.recipient().diversifier()); + Some(*note.recipient().pk_d()) + } + ).expect("Plaintext parsing failed"); + + // Check. + assert_eq!(parsed_note, note); + assert_eq!(parsed_recipient, note.recipient()); + assert_eq!(&parsed_memo, memo); + assert_eq!(parsed_version, 0x03); + } + } + + #[test] + fn test_vectors() { + let test_vectors = crate::test_vectors::note_encryption_v3::test_vectors(); + + for tv in test_vectors { + // + // Load the test vector components + // + + // Recipient key material + let ivk = PreparedIncomingViewingKey::new( + &IncomingViewingKey::from_bytes(&tv.incoming_viewing_key).unwrap(), + ); + let ovk = OutgoingViewingKey::from(tv.ovk); + let d = Diversifier::from_bytes(tv.default_d); + let pk_d = DiversifiedTransmissionKey::from_bytes(&tv.default_pk_d).unwrap(); + + // Received Action + let cv_net = ValueCommitment::from_bytes(&tv.cv_net).unwrap(); + let nf_old = Nullifier::from_bytes(&tv.rho).unwrap(); + let rho = Rho::from_nf_old(nf_old); + let cmx = ExtractedNoteCommitment::from_bytes(&tv.cmx).unwrap(); + + let esk = EphemeralSecretKey::from_bytes(&tv.esk).unwrap(); + let ephemeral_key = EphemeralKeyBytes(tv.ephemeral_key); + + // Details about the expected note + let value = NoteValue::from_raw(tv.v); + let rseed = RandomSeed::from_bytes(tv.rseed, &rho).unwrap(); + + // + // Test the individual components + // + + let shared_secret = esk.agree(&pk_d); + assert_eq!(shared_secret.to_bytes(), tv.shared_secret); + + let k_enc = shared_secret.kdf_orchard(&ephemeral_key); + assert_eq!(k_enc.as_bytes(), tv.k_enc); + + let ock = prf_ock_orchard(&ovk, &cv_net, &cmx.to_bytes(), &ephemeral_key); + assert_eq!(ock.as_ref(), tv.ock); + + let recipient = Address::from_parts(d, pk_d); + + let asset = AssetBase::from_bytes(&tv.asset).unwrap(); + + let note = Note::from_parts(recipient, value, asset, rho, rseed).unwrap(); + assert_eq!(ExtractedNoteCommitment::from(note.commitment()), cmx); + + let action = Action::from_parts( + // rho is the nullifier in the receiving Action. + nf_old, + // We don't need a valid rk for this test. + redpallas::VerificationKey::dummy(), + cmx, + TransmittedNoteCiphertext { + epk_bytes: ephemeral_key.0, + enc_ciphertext: tv.c_enc, + out_ciphertext: tv.c_out, + }, + cv_net.clone(), + (), + ); + + // + // Test decryption + // (Tested first because it only requires immutable references.) + // + + let domain = OrchardDomainV3 { rho }; + + match try_note_decryption(&domain, &ivk, &action) { + Some((decrypted_note, decrypted_to, decrypted_memo)) => { + assert_eq!(decrypted_note, note); + assert_eq!(decrypted_to, recipient); + assert_eq!(&decrypted_memo[..], &tv.memo[..]); + } + None => panic!("Note decryption failed"), + } + + match try_compact_note_decryption(&domain, &ivk, &CompactAction::from(&action)) { + Some((decrypted_note, decrypted_to)) => { + assert_eq!(decrypted_note, note); + assert_eq!(decrypted_to, recipient); + } + None => panic!("Compact note decryption failed"), + } + + match try_output_recovery_with_ovk(&domain, &ovk, &action, &cv_net, &tv.c_out) { + Some((decrypted_note, decrypted_to, decrypted_memo)) => { + assert_eq!(decrypted_note, note); + assert_eq!(decrypted_to, recipient); + assert_eq!(&decrypted_memo[..], &tv.memo[..]); + } + None => panic!("Output recovery failed"), + } + + // + // Test encryption + // + + let ne = OrchardNoteEncryption::new_with_esk(esk, Some(ovk), note, tv.memo); + + assert_eq!(ne.encrypt_note_plaintext().as_ref(), &tv.c_enc[..]); + assert_eq!( + &ne.encrypt_outgoing_plaintext(&cv_net, &cmx, &mut OsRng)[..], + &tv.c_out[..] + ); + } + } +} diff --git a/src/primitives/redpallas.rs b/src/primitives/redpallas.rs index d19a05048..f51b9e582 100644 --- a/src/primitives/redpallas.rs +++ b/src/primitives/redpallas.rs @@ -22,8 +22,8 @@ pub type Binding = reddsa::orchard::Binding; impl SigType for Binding {} /// A RedPallas signing key. -#[derive(Clone, Debug)] -pub struct SigningKey(reddsa::SigningKey); +#[derive(Clone, Copy, Debug)] +pub struct SigningKey(pub(crate) reddsa::SigningKey); impl From> for [u8; 32] { fn from(sk: SigningKey) -> [u8; 32] { @@ -63,7 +63,7 @@ impl SigningKey { /// A RedPallas verification key. #[derive(Clone, Debug)] -pub struct VerificationKey(reddsa::VerificationKey); +pub struct VerificationKey(pub(crate) reddsa::VerificationKey); impl From> for [u8; 32] { fn from(vk: VerificationKey) -> [u8; 32] { @@ -101,7 +101,7 @@ impl Eq for VerificationKey {} impl PartialOrd for VerificationKey { fn partial_cmp(&self, other: &Self) -> Option { - <[u8; 32]>::from(self).partial_cmp(&<[u8; 32]>::from(other)) + Some(self.cmp(other)) } } @@ -154,7 +154,7 @@ impl VerificationKey { } /// A RedPallas signature. -#[derive(Debug, Clone)] +#[derive(Debug, Clone, PartialEq, Eq)] pub struct Signature(reddsa::Signature); impl From<[u8; 64]> for Signature { diff --git a/src/spec/prf_expand.rs b/src/spec/prf_expand.rs new file mode 100644 index 000000000..fa7881889 --- /dev/null +++ b/src/spec/prf_expand.rs @@ -0,0 +1,77 @@ +use blake2b_simd::Params; + +const PRF_EXPAND_PERSONALIZATION: &[u8; 16] = b"Zcash_ExpandSeed"; + +/// The set of domains in which $PRF^\mathsf{expand}$ is defined. +pub(crate) enum PrfExpand { + Esk, + Rcm, + OrchardAsk, + OrchardNk, + OrchardRivk, + Psi, + ZsaIsk, + OrchardZip32Child, + OrchardDkOvk, + OrchardRivkInternal, +} + +impl PrfExpand { + fn domain_separator(&self) -> u8 { + match self { + Self::Esk => 0x04, + Self::Rcm => 0x05, + Self::OrchardAsk => 0x06, + Self::OrchardNk => 0x07, + Self::OrchardRivk => 0x08, + Self::Psi => 0x09, + Self::ZsaIsk => 0x0a, + Self::OrchardZip32Child => 0x81, + Self::OrchardDkOvk => 0x82, + Self::OrchardRivkInternal => 0x83, + } + } + + /// Expands the given secret key in this domain, with no additional data. + /// + /// $PRF^\mathsf{expand}(sk, dst) := BLAKE2b-512("Zcash_ExpandSeed", sk || dst)$ + /// + /// Defined in [Zcash Protocol Spec § 5.4.2: Pseudo Random Functions][concreteprfs]. + /// + /// [concreteprfs]: https://zips.z.cash/protocol/nu5.pdf#concreteprfs + pub(crate) fn expand(self, sk: &[u8]) -> [u8; 64] { + self.with_ad_slices(sk, &[]) + } + + /// Expands the given secret key in this domain, with the given additional data. + /// + /// $PRF^\mathsf{expand}(sk, dst, t) := BLAKE2b-512("Zcash_ExpandSeed", sk || dst || t)$ + /// + /// Defined in [Zcash Protocol Spec § 5.4.2: Pseudo Random Functions][concreteprfs]. + /// + /// [concreteprfs]: https://zips.z.cash/protocol/nu5.pdf#concreteprfs + pub(crate) fn with_ad(self, sk: &[u8], t: &[u8]) -> [u8; 64] { + self.with_ad_slices(sk, &[t]) + } + + /// Expands the given secret key in this domain, with additional data concatenated + /// from the given slices. + /// + /// $PRF^\mathsf{expand}(sk, dst, a, b, ...) := BLAKE2b-512("Zcash_ExpandSeed", sk || dst || a || b || ...)$ + /// + /// Defined in [Zcash Protocol Spec § 5.4.2: Pseudo Random Functions][concreteprfs]. + /// + /// [concreteprfs]: https://zips.z.cash/protocol/nu5.pdf#concreteprfs + pub(crate) fn with_ad_slices(self, sk: &[u8], ts: &[&[u8]]) -> [u8; 64] { + let mut h = Params::new() + .hash_length(64) + .personal(PRF_EXPAND_PERSONALIZATION) + .to_state(); + h.update(sk); + h.update(&[self.domain_separator()]); + for t in ts { + h.update(t); + } + *h.finalize().as_array() + } +} diff --git a/src/supply_info.rs b/src/supply_info.rs new file mode 100644 index 000000000..1e3c8d28f --- /dev/null +++ b/src/supply_info.rs @@ -0,0 +1,193 @@ +//! Structs and logic related to supply information management for assets. + +use std::collections::{hash_map, HashMap, HashSet}; + +use crate::{issuance::Error, note::AssetBase, value::ValueSum}; + +/// Represents the amount of an asset and its finalization status. +#[derive(Debug, Clone, Copy)] +#[cfg_attr(test, derive(PartialEq, Eq))] +pub struct AssetSupply { + /// The amount of the asset. + pub amount: ValueSum, + /// Whether or not the asset is finalized. + pub is_finalized: bool, +} + +impl AssetSupply { + /// Creates a new AssetSupply instance with the given amount and finalization status. + pub fn new(amount: ValueSum, is_finalized: bool) -> Self { + Self { + amount, + is_finalized, + } + } +} + +/// Contains information about the supply of assets. +#[derive(Debug, Clone)] +pub struct SupplyInfo { + /// A map of asset bases to their respective supply information. + pub assets: HashMap, +} + +impl SupplyInfo { + /// Creates a new, empty `SupplyInfo` instance. + pub fn new() -> Self { + Self { + assets: HashMap::new(), + } + } + + /// Inserts or updates an asset's supply information in the supply info map. + /// If the asset exists, adds the amounts (unconditionally) and updates the finalization status + /// (only if the new supply is finalized). If the asset is not found, inserts the new supply. + pub fn add_supply(&mut self, asset: AssetBase, new_supply: AssetSupply) -> Result<(), Error> { + match self.assets.entry(asset) { + hash_map::Entry::Occupied(entry) => { + let supply = entry.into_mut(); + supply.amount = + (supply.amount + new_supply.amount).ok_or(Error::ValueSumOverflow)?; + supply.is_finalized |= new_supply.is_finalized; + } + hash_map::Entry::Vacant(entry) => { + entry.insert(new_supply); + } + } + + Ok(()) + } + + /// Updates the set of finalized assets based on the supply information stored in + /// the `SupplyInfo` instance. + pub fn update_finalization_set(&self, finalization_set: &mut HashSet) { + finalization_set.extend( + self.assets + .iter() + .filter_map(|(asset, supply)| supply.is_finalized.then_some(asset)), + ); + } +} + +impl Default for SupplyInfo { + fn default() -> Self { + Self::new() + } +} + +#[cfg(test)] +mod tests { + use super::*; + + fn create_test_asset(asset_desc: &str) -> AssetBase { + use crate::keys::{IssuanceAuthorizingKey, IssuanceValidatingKey}; + + let isk = IssuanceAuthorizingKey::from_bytes([1u8; 32]).unwrap(); + + AssetBase::derive(&IssuanceValidatingKey::from(&isk), asset_desc) + } + + fn sum<'a, T: IntoIterator>(supplies: T) -> Option { + supplies + .into_iter() + .map(|supply| supply.amount) + .try_fold(ValueSum::from_raw(0), |sum, value| sum + value) + } + + #[test] + fn test_add_supply_valid() { + let mut supply_info = SupplyInfo::new(); + + let asset1 = create_test_asset("Asset 1"); + let asset2 = create_test_asset("Asset 2"); + + let supply1 = AssetSupply::new(ValueSum::from_raw(20), false); + let supply2 = AssetSupply::new(ValueSum::from_raw(30), true); + let supply3 = AssetSupply::new(ValueSum::from_raw(10), false); + let supply4 = AssetSupply::new(ValueSum::from_raw(10), true); + let supply5 = AssetSupply::new(ValueSum::from_raw(50), false); + + assert_eq!(supply_info.assets.len(), 0); + + // Add supply1 + assert!(supply_info.add_supply(asset1, supply1).is_ok()); + assert_eq!(supply_info.assets.len(), 1); + assert_eq!( + supply_info.assets.get(&asset1), + Some(&AssetSupply::new(sum([&supply1]).unwrap(), false)) + ); + + // Add supply2 + assert!(supply_info.add_supply(asset1, supply2).is_ok()); + assert_eq!(supply_info.assets.len(), 1); + assert_eq!( + supply_info.assets.get(&asset1), + Some(&AssetSupply::new(sum([&supply1, &supply2]).unwrap(), true)) + ); + + // Add supply3 + assert!(supply_info.add_supply(asset1, supply3).is_ok()); + assert_eq!(supply_info.assets.len(), 1); + assert_eq!( + supply_info.assets.get(&asset1), + Some(&AssetSupply::new( + sum([&supply1, &supply2, &supply3]).unwrap(), + true + )) + ); + + // Add supply4 + assert!(supply_info.add_supply(asset1, supply4).is_ok()); + assert_eq!(supply_info.assets.len(), 1); + assert_eq!( + supply_info.assets.get(&asset1), + Some(&AssetSupply::new( + sum([&supply1, &supply2, &supply3, &supply4]).unwrap(), + true + )) + ); + + // Add supply5 + assert!(supply_info.add_supply(asset2, supply5).is_ok()); + assert_eq!(supply_info.assets.len(), 2); + assert_eq!( + supply_info.assets.get(&asset1), + Some(&AssetSupply::new( + sum([&supply1, &supply2, &supply3, &supply4]).unwrap(), + true + )) + ); + assert_eq!( + supply_info.assets.get(&asset2), + Some(&AssetSupply::new(sum([&supply5]).unwrap(), false)) + ); + } + + #[test] + fn test_update_finalization_set() { + let mut supply_info = SupplyInfo::new(); + + let asset1 = create_test_asset("Asset 1"); + let asset2 = create_test_asset("Asset 2"); + let asset3 = create_test_asset("Asset 3"); + + let supply1 = AssetSupply::new(ValueSum::from_raw(10), false); + let supply2 = AssetSupply::new(ValueSum::from_raw(20), true); + let supply3 = AssetSupply::new(ValueSum::from_raw(40), false); + let supply4 = AssetSupply::new(ValueSum::from_raw(50), true); + + assert!(supply_info.add_supply(asset1, supply1).is_ok()); + assert!(supply_info.add_supply(asset1, supply2).is_ok()); + assert!(supply_info.add_supply(asset2, supply3).is_ok()); + assert!(supply_info.add_supply(asset3, supply4).is_ok()); + + let mut finalization_set = HashSet::new(); + + supply_info.update_finalization_set(&mut finalization_set); + + assert_eq!(finalization_set.len(), 2); + + assert!(finalization_set.contains(&asset1)); + assert!(finalization_set.contains(&asset3)); + } +} diff --git a/src/test_vectors.rs b/src/test_vectors.rs index 042f3b913..3cea120cd 100644 --- a/src/test_vectors.rs +++ b/src/test_vectors.rs @@ -1,4 +1,7 @@ +pub(crate) mod asset_base; pub(crate) mod commitment_tree; +pub(crate) mod issuance_auth_sig; pub(crate) mod keys; pub(crate) mod merkle_path; pub(crate) mod note_encryption; +pub(crate) mod note_encryption_v3; diff --git a/src/test_vectors/asset_base.rs b/src/test_vectors/asset_base.rs new file mode 100644 index 000000000..041d80471 --- /dev/null +++ b/src/test_vectors/asset_base.rs @@ -0,0 +1,1032 @@ +// From https://github.com/zcash-hackworks/zcash-test-vectors/ (orchard_asset_base) + +pub(crate) struct TestVector { + pub(crate) key: [u8; 32], + pub(crate) description: [u8; 512], + pub(crate) asset_base: [u8; 32], +} + +pub(crate) fn test_vectors() -> Vec { + vec![ + TestVector { + key: [ + 0x16, 0x88, 0x4f, 0x1d, 0xbc, 0x92, 0x90, 0x89, 0xa4, 0x17, 0x6e, 0x84, 0x0b, 0xb5, + 0x81, 0xc8, 0x0e, 0x16, 0xe9, 0xb1, 0xab, 0xd6, 0x54, 0xe6, 0x2c, 0x8b, 0x0b, 0x95, + 0x70, 0x20, 0xb7, 0x48, + ], + description: [ + 0x31, 0xc3, 0x85, 0xc7, 0xa7, 0x38, 0xc6, 0x88, 0x66, 0xc7, 0x8d, 0xc6, 0xa9, 0xc7, + 0xae, 0xc5, 0xb7, 0xc3, 0xaf, 0xc6, 0x85, 0xc7, 0x9f, 0xc6, 0x88, 0xe2, 0xb1, 0xbc, + 0xe1, 0x9a, 0xb7, 0xc3, 0x8c, 0xc7, 0x86, 0xc5, 0xbd, 0xc9, 0x80, 0xc3, 0x84, 0x4e, + 0x76, 0xc6, 0xa9, 0xc3, 0x91, 0x32, 0xc4, 0xab, 0xc9, 0x81, 0xce, 0x8c, 0xc4, 0xa7, + 0xc5, 0x97, 0xc6, 0xa6, 0xc4, 0xb3, 0xc5, 0xaa, 0xc7, 0x95, 0xc8, 0x99, 0xe1, 0x9b, + 0x91, 0xe1, 0x9a, 0xb5, 0xc7, 0x83, 0xc2, 0xa9, 0xc7, 0x80, 0xc7, 0xa5, 0xc8, 0x9d, + 0xce, 0x88, 0xc9, 0x8a, 0xc5, 0x92, 0xc7, 0x91, 0x5d, 0xc3, 0x93, 0x43, 0xc4, 0xa9, + 0xc8, 0x82, 0x25, 0xc3, 0xbb, 0xc3, 0x9d, 0xc8, 0xaf, 0xe1, 0x9a, 0xa5, 0xc8, 0xa0, + 0xc8, 0x8c, 0xc6, 0x86, 0xc3, 0xa4, 0xe1, 0x9b, 0x80, 0xc4, 0xbc, 0xc6, 0xb3, 0xc5, + 0x81, 0xe1, 0x9b, 0x97, 0xc5, 0x8e, 0xc8, 0x9d, 0xc6, 0xa1, 0xce, 0x8a, 0xc7, 0x88, + 0xc6, 0xb5, 0xc8, 0x83, 0xc3, 0xa2, 0xc4, 0x92, 0xc5, 0xb0, 0xc3, 0x8f, 0xc7, 0xab, + 0xe1, 0x9a, 0xac, 0xc2, 0xaf, 0xc7, 0x8a, 0x37, 0x72, 0x74, 0xe2, 0xb1, 0xbb, 0xc5, + 0x83, 0xe1, 0x9a, 0xa9, 0xe2, 0xb1, 0xa5, 0x5c, 0xc3, 0xbd, 0xc3, 0x88, 0xc9, 0x86, + 0x77, 0xc2, 0xb1, 0xc5, 0x9d, 0xc7, 0xa4, 0xc8, 0x9b, 0xcd, 0xb4, 0xc7, 0x81, 0xc4, + 0x9c, 0xc2, 0xbe, 0xe2, 0xb1, 0xa9, 0xc8, 0x82, 0xc6, 0xa0, 0xe1, 0x9a, 0xb5, 0xc2, + 0xa8, 0xc5, 0x82, 0xc3, 0x9a, 0xc6, 0xac, 0xc4, 0xa0, 0xc4, 0xb5, 0xc8, 0x93, 0xe2, + 0xb1, 0xa0, 0xc3, 0xbe, 0xc9, 0x84, 0x77, 0xc4, 0xb4, 0xc8, 0xbe, 0x5c, 0xc6, 0xbe, + 0xc3, 0xb0, 0xc9, 0x84, 0x28, 0xc6, 0x8d, 0xc3, 0xb2, 0xc8, 0xaa, 0xc8, 0x8f, 0xc8, + 0xb2, 0xc7, 0x8b, 0xcd, 0xba, 0xc3, 0xb5, 0xc9, 0x8e, 0xc4, 0xb4, 0xe2, 0xb1, 0xaa, + 0xe1, 0x9a, 0xab, 0xc2, 0xbd, 0xc8, 0xac, 0xc7, 0x8e, 0xc8, 0x95, 0xc2, 0xa9, 0xe1, + 0x9a, 0xa2, 0xe1, 0x9b, 0x8b, 0xc7, 0x98, 0xc6, 0x94, 0xe1, 0x9b, 0x9f, 0xc5, 0x98, + 0xc4, 0xbd, 0x39, 0x40, 0xc8, 0xa9, 0xc5, 0x94, 0x53, 0xe1, 0x9b, 0xac, 0xc8, 0xa0, + 0xc5, 0xb3, 0x76, 0x74, 0xc8, 0xa3, 0xc3, 0x81, 0x68, 0xcd, 0xbc, 0xc7, 0xba, 0x6e, + 0x73, 0xc5, 0x8f, 0xce, 0x8c, 0xc7, 0x9d, 0xc5, 0xaf, 0x45, 0xc3, 0xb0, 0xc3, 0x86, + 0xc4, 0x91, 0xc8, 0x94, 0xc5, 0x93, 0xc4, 0x81, 0xe2, 0xb1, 0xa1, 0xc7, 0x92, 0xc4, + 0xb0, 0xc8, 0x87, 0x4e, 0x51, 0xc6, 0xab, 0xc4, 0xb2, 0xe1, 0x9b, 0x8d, 0xc4, 0x8a, + 0xc4, 0xa9, 0xc3, 0xb3, 0xe1, 0x9b, 0x8f, 0xce, 0x8a, 0x3b, 0xc7, 0xa9, 0xc5, 0x9c, + 0x45, 0xe2, 0xb1, 0xab, 0xc6, 0xbc, 0xc2, 0xb5, 0xe1, 0x9b, 0x8d, 0xc4, 0x84, 0xe2, + 0xb1, 0xa8, 0xc7, 0xa9, 0xc6, 0x94, 0xc6, 0xa6, 0xc6, 0xba, 0xe1, 0x9b, 0xab, 0xc2, + 0xac, 0xc4, 0x8e, 0xe2, 0xb1, 0xb9, 0xc2, 0xb0, 0xce, 0x88, 0xc5, 0xb7, 0x70, 0xe2, + 0xb1, 0xac, 0xce, 0x86, 0x54, 0xc9, 0x8d, 0xc4, 0xa6, 0xcd, 0xb7, 0xc4, 0xaf, 0x75, + 0x3b, 0x3f, 0xc6, 0x81, 0xc8, 0xab, 0xc8, 0xa4, 0x78, 0xc8, 0xab, 0xc4, 0xbb, 0x2e, + 0xc8, 0x89, 0xc3, 0xb0, 0xc5, 0x90, 0x74, 0xc2, 0xa8, 0xc4, 0xa4, 0xc5, 0xbf, 0xe1, + 0x9a, 0xb2, 0xc2, 0xbc, 0x4b, 0xc6, 0xbf, 0xc7, 0xbc, 0xc7, 0xa5, 0xc3, 0xba, 0xc3, + 0x86, 0xc4, 0xb4, 0xc8, 0xa4, 0xc3, 0x9c, 0xe2, 0xb1, 0xb0, 0xc5, 0x92, 0xc4, 0x97, + 0xe1, 0x9b, 0xaa, 0xc6, 0xbf, 0xc5, 0x9e, 0xc7, 0x84, 0xc4, 0xaf, 0xc8, 0xaa, 0xc8, + 0x89, 0xc4, 0xb3, 0xc2, 0xbb, 0xc4, 0x97, 0x5a, + ], + asset_base: [ + 0x41, 0xb7, 0x75, 0x0a, 0x66, 0x59, 0xb2, 0xc8, 0x0f, 0x56, 0x7d, 0x67, 0x78, 0xd1, + 0x2d, 0x81, 0xc4, 0x7a, 0x46, 0xef, 0xdf, 0xfb, 0x63, 0x80, 0x6c, 0x01, 0x7c, 0xa5, + 0x61, 0x50, 0xa7, 0xa6, + ], + }, + TestVector { + key: [ + 0x72, 0x73, 0xb6, 0x57, 0xd9, 0x71, 0xa4, 0x5e, 0x72, 0x24, 0x0c, 0x7a, 0xaa, 0xa7, + 0xd0, 0x68, 0x5d, 0x06, 0xd7, 0x99, 0x9b, 0x0a, 0x19, 0xc4, 0xce, 0xa3, 0x27, 0x88, + 0xa6, 0xab, 0x51, 0x3d, + ], + description: [ + 0xc5, 0x96, 0xc6, 0xac, 0xc4, 0xb3, 0x28, 0x5f, 0xc2, 0xa5, 0x66, 0xe1, 0x9b, 0x8c, + 0xc8, 0xa5, 0xc3, 0x95, 0xc4, 0xaa, 0xc3, 0xa9, 0xc2, 0xbd, 0xe2, 0xb1, 0xbb, 0x52, + 0x48, 0xe1, 0x9b, 0x9f, 0xe2, 0xb1, 0xaf, 0xe1, 0x9b, 0x87, 0xc7, 0x9f, 0x2b, 0xe1, + 0x9a, 0xab, 0xc6, 0x97, 0x6b, 0xc8, 0x8e, 0xe1, 0x9a, 0xbb, 0xc6, 0xa0, 0xc7, 0x89, + 0xc2, 0xbd, 0xc8, 0xad, 0xc4, 0xbe, 0xe1, 0x9b, 0x82, 0xc8, 0x9c, 0xe1, 0x9a, 0xac, + 0x3f, 0xe1, 0x9a, 0xa2, 0xc9, 0x8c, 0xe1, 0x9a, 0xa2, 0xe1, 0x9b, 0x86, 0xc5, 0x9d, + 0xc4, 0xb4, 0xc7, 0x80, 0xc3, 0xb5, 0x71, 0x6b, 0x6c, 0xc8, 0x96, 0xc7, 0xbb, 0xc8, + 0x9a, 0xc7, 0x90, 0xc2, 0xb1, 0xc4, 0x89, 0xc3, 0x99, 0xc3, 0xbd, 0xc7, 0xae, 0xc2, + 0xa3, 0xc4, 0xa7, 0x58, 0xc4, 0x80, 0xc4, 0x9f, 0xc7, 0xbb, 0xc4, 0x8b, 0xc6, 0x8d, + 0xc5, 0x98, 0xc2, 0xb4, 0xc5, 0x93, 0xc4, 0x9c, 0xc8, 0x83, 0xc7, 0xbc, 0x30, 0xc4, + 0x87, 0xc3, 0x85, 0xe1, 0x9a, 0xb2, 0xc4, 0xa8, 0xc7, 0xb8, 0xc6, 0xab, 0x36, 0xc4, + 0xa6, 0x3b, 0xc7, 0xa3, 0xc7, 0x82, 0xcd, 0xb2, 0xc7, 0x80, 0xc3, 0xb0, 0xc2, 0xbd, + 0xe2, 0xb1, 0xb4, 0xc6, 0x93, 0xc4, 0x8f, 0x5d, 0xc6, 0x8f, 0x35, 0xc9, 0x85, 0xe1, + 0x9b, 0x95, 0xc7, 0xa4, 0xe2, 0xb1, 0xbf, 0xc4, 0x85, 0xc5, 0xa4, 0xc7, 0x83, 0xc8, + 0x81, 0xc8, 0x89, 0xc8, 0x98, 0xc5, 0xac, 0xe2, 0xb1, 0xb4, 0xc8, 0x8a, 0xc7, 0xa1, + 0xc7, 0x9d, 0xc6, 0xae, 0xc6, 0x9c, 0xc6, 0x98, 0xc3, 0xa3, 0xc4, 0x9b, 0x43, 0xe1, + 0x9b, 0x82, 0xc2, 0xa3, 0xc3, 0xa6, 0xc5, 0x85, 0xc8, 0x89, 0xe1, 0x9b, 0x99, 0x5f, + 0xc4, 0xa9, 0xe1, 0x9b, 0x95, 0xc2, 0xb7, 0xc3, 0x89, 0xe2, 0xb1, 0xb7, 0xc4, 0x96, + 0xe2, 0xb1, 0xa2, 0x5b, 0xc3, 0xac, 0x58, 0xc6, 0xa9, 0xcd, 0xbd, 0xc8, 0xa1, 0xe2, + 0xb1, 0xa6, 0xc8, 0x8e, 0xc5, 0xb3, 0xc7, 0x93, 0xc6, 0xa1, 0xc9, 0x8d, 0xc5, 0xa2, + 0x29, 0xce, 0x8c, 0xe1, 0x9b, 0x99, 0xc5, 0xaf, 0xc8, 0xbd, 0x2b, 0xc7, 0xb2, 0xc7, + 0xba, 0xcd, 0xb7, 0xc2, 0xbc, 0xe1, 0x9b, 0xa4, 0xc7, 0xb9, 0xc3, 0x8d, 0xe2, 0xb1, + 0xa0, 0xc2, 0xa4, 0xc8, 0x98, 0xc8, 0xa4, 0x49, 0xc5, 0xbb, 0xc3, 0x96, 0xc3, 0x94, + 0x5c, 0xc5, 0x8e, 0xe2, 0xb1, 0xae, 0x73, 0x74, 0xc6, 0xab, 0xc7, 0x86, 0xe2, 0xb1, + 0xb3, 0xe1, 0x9b, 0x8f, 0xc8, 0xb3, 0xc4, 0xa6, 0xc6, 0xb2, 0xc8, 0xa4, 0xc7, 0x86, + 0xc7, 0xa8, 0xe1, 0x9b, 0xa2, 0xc8, 0xaa, 0xc4, 0x92, 0xcd, 0xb2, 0x7e, 0xc9, 0x8d, + 0x4e, 0x45, 0xc6, 0x8a, 0xc6, 0xae, 0xc4, 0x8d, 0x3f, 0x59, 0xc5, 0x96, 0xe2, 0xb1, + 0xbd, 0xe1, 0x9a, 0xbc, 0xc3, 0x90, 0xc8, 0x8e, 0xc3, 0xa1, 0xc7, 0xad, 0xe1, 0x9a, + 0xb9, 0xc5, 0x8e, 0xe1, 0x9b, 0xa5, 0xe1, 0x9a, 0xb5, 0xc6, 0x83, 0xc7, 0x8e, 0xc8, + 0xbf, 0xc2, 0xbc, 0xc5, 0x8a, 0xc4, 0x8e, 0xcd, 0xb5, 0xc5, 0x97, 0xc4, 0x8f, 0xc2, + 0xaa, 0xc7, 0xaf, 0xc3, 0xbb, 0xc2, 0xa2, 0x49, 0x32, 0xc7, 0xa9, 0xc2, 0xb4, 0xe1, + 0x9b, 0xa1, 0xe1, 0x9b, 0xa3, 0xe2, 0xb1, 0xbf, 0x53, 0xc8, 0x96, 0xc8, 0xac, 0xc8, + 0xa3, 0xc3, 0xa0, 0x29, 0xe1, 0x9b, 0x89, 0xc5, 0xb3, 0xc6, 0xb2, 0xc3, 0xab, 0xc3, + 0x99, 0xc4, 0x9d, 0xc6, 0xb6, 0xc4, 0xa3, 0x3b, 0xe1, 0x9b, 0xa6, 0xc6, 0x95, 0xe1, + 0x9b, 0xa5, 0xc2, 0xbc, 0xc7, 0xa0, 0xc7, 0xa3, 0xe1, 0x9b, 0x8a, 0xc4, 0xb4, 0xc9, + 0x80, 0x64, 0x6f, 0xc6, 0x9e, 0xc4, 0x94, 0xc8, 0x8c, 0xc6, 0xa4, 0xc7, 0x96, 0xc3, + 0x9b, 0xc7, 0x91, 0xc5, 0x9d, 0x6d, 0xc7, 0x8a, + ], + asset_base: [ + 0xea, 0x1b, 0xf2, 0x91, 0x8d, 0xe2, 0xfb, 0x1a, 0x26, 0x10, 0x83, 0x25, 0x20, 0xbd, + 0x80, 0x71, 0x98, 0xe1, 0x26, 0x73, 0xab, 0xd2, 0x3b, 0x24, 0x1d, 0xba, 0x06, 0x08, + 0x20, 0x2e, 0x56, 0x17, + ], + }, + TestVector { + key: [ + 0xec, 0x05, 0xbb, 0x7f, 0x06, 0x5e, 0x25, 0x6f, 0xf4, 0x54, 0xf8, 0xa8, 0xdf, 0x6f, + 0x2f, 0x9b, 0x8a, 0x8c, 0x95, 0x08, 0xca, 0xac, 0xfe, 0xe9, 0x52, 0x1c, 0xbe, 0x68, + 0x9d, 0xd1, 0x12, 0x0f, + ], + description: [ + 0xc7, 0x82, 0x7e, 0xc5, 0xb9, 0xc6, 0xa6, 0xc5, 0xa3, 0xe1, 0x9a, 0xae, 0xe2, 0xb1, + 0xa6, 0xc8, 0xb2, 0xc8, 0xbc, 0xc5, 0x9f, 0xc8, 0x83, 0xc3, 0x82, 0xc4, 0x9a, 0xe2, + 0xb1, 0xa8, 0xc4, 0x88, 0xe2, 0xb1, 0xad, 0xc8, 0x98, 0xc3, 0xbb, 0xc3, 0x92, 0xc4, + 0xb7, 0xc7, 0xba, 0xc7, 0x8b, 0x72, 0xc6, 0x8d, 0x75, 0xc3, 0x82, 0xc3, 0xad, 0xc5, + 0x8a, 0xc7, 0xb1, 0xc8, 0xbb, 0xc5, 0x9e, 0xe2, 0xb1, 0xb3, 0xc3, 0xa5, 0xe1, 0x9a, + 0xb8, 0xc5, 0x81, 0x63, 0xc5, 0x98, 0xe1, 0x9b, 0x80, 0xc5, 0x86, 0xc4, 0xa9, 0xe1, + 0x9b, 0xa4, 0x60, 0xc8, 0xa0, 0xc3, 0x97, 0xc4, 0xa4, 0xc5, 0x81, 0xc3, 0x95, 0xc4, + 0xb0, 0xc2, 0xb2, 0xe1, 0x9b, 0x94, 0xc7, 0x8c, 0x46, 0x60, 0xe2, 0xb1, 0xa0, 0xc4, + 0xa5, 0xc7, 0xa9, 0xc6, 0xa8, 0xe1, 0x9b, 0x9c, 0xc5, 0xb4, 0xc5, 0x82, 0xc8, 0x80, + 0xc4, 0x9b, 0xe2, 0xb1, 0xa7, 0xc4, 0x95, 0xc5, 0x93, 0xc8, 0x83, 0xc4, 0x9f, 0xc4, + 0xa1, 0xc4, 0xb1, 0xc3, 0xb0, 0xc8, 0xa5, 0xc6, 0x87, 0xc5, 0xb5, 0xe1, 0x9b, 0xaf, + 0xc9, 0x8e, 0xc2, 0xac, 0xe2, 0xb1, 0xba, 0xc7, 0x9f, 0xc5, 0xa1, 0xc6, 0x94, 0xc3, + 0xa5, 0xc8, 0x8b, 0xc8, 0xa5, 0xe2, 0xb1, 0xb2, 0xc7, 0xab, 0xe1, 0x9b, 0x91, 0xc3, + 0xaa, 0xc6, 0xb5, 0xc4, 0xbf, 0xc5, 0x80, 0xc4, 0xb4, 0xc3, 0xb6, 0xe2, 0xb1, 0xb3, + 0x5e, 0xc8, 0xb6, 0xe1, 0x9a, 0xab, 0xe2, 0xb1, 0xa7, 0xc5, 0x98, 0xe1, 0x9b, 0x9e, + 0x69, 0xe1, 0x9b, 0x8b, 0xe2, 0xb1, 0xbf, 0xc9, 0x88, 0xe2, 0xb1, 0xb5, 0x71, 0x29, + 0xc6, 0x85, 0xc7, 0xab, 0xe1, 0x9b, 0xa9, 0x6d, 0xc7, 0x90, 0xc3, 0x9b, 0xc5, 0x8e, + 0xe1, 0x9b, 0x87, 0xc7, 0x9f, 0xc5, 0xa3, 0xc5, 0xb9, 0x74, 0x7d, 0xc4, 0x94, 0xe1, + 0x9b, 0x93, 0xc7, 0xbc, 0xc8, 0x96, 0x58, 0xe2, 0xb1, 0xaf, 0xe2, 0xb1, 0xbc, 0xc2, + 0xb4, 0xc8, 0xbd, 0xc8, 0xab, 0xc4, 0xb7, 0x42, 0xc2, 0xb5, 0xc7, 0xa5, 0xc5, 0x9c, + 0xcd, 0xb3, 0xc9, 0x87, 0xe2, 0xb1, 0xa0, 0xc4, 0xa3, 0xc8, 0xad, 0xc5, 0x90, 0xe1, + 0x9b, 0x81, 0xc5, 0x9a, 0xc4, 0xa8, 0xc4, 0xb0, 0x7e, 0xc5, 0xaf, 0x60, 0xe1, 0x9a, + 0xa1, 0xc3, 0xb3, 0xc6, 0xb2, 0xe1, 0x9b, 0x97, 0x3c, 0xc4, 0xba, 0xc5, 0xbb, 0x42, + 0xc4, 0x97, 0x66, 0xc8, 0x91, 0xc3, 0xb2, 0xc2, 0xa5, 0xe1, 0x9b, 0xa0, 0xc4, 0xaf, + 0xc8, 0xbf, 0xc8, 0x8a, 0xc5, 0xa1, 0xc3, 0x98, 0xc8, 0x8c, 0xc5, 0x82, 0xe1, 0x9b, + 0x89, 0xc5, 0x88, 0xc8, 0xa4, 0xc6, 0xbc, 0x7a, 0xc4, 0xa1, 0xc3, 0xb0, 0xc5, 0x88, + 0x7b, 0xe1, 0x9b, 0xa1, 0xc2, 0xae, 0xc7, 0x88, 0xc5, 0x9b, 0x71, 0xc7, 0xa7, 0xe1, + 0x9a, 0xa2, 0xc3, 0x8d, 0x50, 0xc6, 0x82, 0xc2, 0xb8, 0xc8, 0xab, 0xc6, 0xa5, 0xc7, + 0x9a, 0xe1, 0x9b, 0x81, 0xc6, 0xb8, 0xc8, 0xb8, 0x32, 0xe1, 0x9b, 0x9a, 0xc5, 0x92, + 0x21, 0xc2, 0xb1, 0xe1, 0x9b, 0xa4, 0xe2, 0xb1, 0xab, 0xe2, 0xb1, 0xbc, 0xc3, 0x9d, + 0xc4, 0xad, 0xc5, 0x83, 0xc7, 0x91, 0x7d, 0xc3, 0xb3, 0xc8, 0x9f, 0xc4, 0x94, 0x40, + 0xc4, 0xb2, 0xc8, 0x92, 0xc7, 0xa1, 0xc3, 0xbc, 0xe1, 0x9b, 0x97, 0xc2, 0xbb, 0xc5, + 0x9a, 0xc2, 0xb2, 0x52, 0xe1, 0x9a, 0xa9, 0x4c, 0xc2, 0xa2, 0xe2, 0xb1, 0xa9, 0xe1, + 0x9b, 0x87, 0xc5, 0x9c, 0xc4, 0x81, 0xc7, 0xb9, 0xe2, 0xb1, 0xad, 0xc4, 0xb3, 0xc5, + 0xa1, 0x64, 0xc5, 0x96, 0xc3, 0x9c, 0xc8, 0xaf, 0xc8, 0x91, 0xe2, 0xb1, 0xaf, 0xc4, + 0x9d, 0xc8, 0x98, 0xe1, 0x9b, 0x8c, 0xc6, 0x89, 0xc6, 0xbc, 0xc8, 0xbc, 0xc5, 0x81, + 0x37, 0x45, 0xc7, 0xa3, 0xc5, 0x81, 0x5a, 0x5a, + ], + asset_base: [ + 0x67, 0x0a, 0x16, 0x33, 0xc7, 0xae, 0x83, 0x6f, 0x14, 0x68, 0xb0, 0x6e, 0x24, 0xd0, + 0x8b, 0x84, 0x27, 0x6d, 0xf6, 0x78, 0xe7, 0xe5, 0x0d, 0x6c, 0x35, 0xce, 0x42, 0x98, + 0xbd, 0xc6, 0xb7, 0x92, + ], + }, + TestVector { + key: [ + 0x81, 0x8f, 0x50, 0xce, 0x47, 0x10, 0xf4, 0xeb, 0x11, 0xe7, 0x43, 0xe6, 0x40, 0x85, + 0x44, 0xaa, 0x3c, 0x12, 0x3c, 0x7f, 0x07, 0xe2, 0xaa, 0xbb, 0x91, 0xaf, 0xc4, 0xec, + 0x48, 0x78, 0x8d, 0xe9, + ], + description: [ + 0xc7, 0x98, 0xe1, 0x9a, 0xb2, 0x2a, 0xc2, 0xa5, 0xc7, 0xb7, 0xc8, 0xaa, 0xc4, 0x9b, + 0xc9, 0x84, 0xc5, 0xaf, 0x4d, 0xc3, 0x83, 0xc2, 0xa3, 0xc7, 0xaf, 0xc6, 0x92, 0xe2, + 0xb1, 0xbe, 0xc8, 0xbf, 0xe1, 0x9b, 0x83, 0xc7, 0x80, 0xc2, 0xb8, 0xc7, 0xa1, 0x6c, + 0xe1, 0x9b, 0xad, 0xc3, 0xa3, 0xc7, 0x97, 0x3b, 0xc9, 0x87, 0xce, 0x8a, 0x51, 0xc8, + 0xbc, 0xc7, 0xa4, 0xc2, 0xa4, 0x2d, 0xc3, 0xb6, 0x34, 0xc9, 0x8e, 0xc5, 0x8f, 0xc9, + 0x86, 0xc5, 0xba, 0xe1, 0x9b, 0x99, 0x76, 0xc6, 0x85, 0xc3, 0xa2, 0xc8, 0x99, 0xc3, + 0x91, 0xc4, 0xb3, 0xc5, 0xa1, 0xe2, 0xb1, 0xbb, 0xc7, 0xa0, 0xc6, 0x9d, 0xc3, 0x89, + 0xc9, 0x86, 0xc5, 0xa1, 0xe1, 0x9b, 0x98, 0xc5, 0xb7, 0xc5, 0xae, 0xc5, 0xb6, 0xe1, + 0x9b, 0x89, 0xc8, 0x98, 0x36, 0xc6, 0x95, 0xc4, 0xb5, 0xc8, 0x85, 0x5c, 0xe1, 0x9b, + 0x99, 0xe2, 0xb1, 0xaf, 0xc3, 0x92, 0xc7, 0x89, 0xc7, 0xb5, 0xc5, 0xbd, 0xc3, 0xa5, + 0xc6, 0x93, 0xc4, 0xac, 0xe1, 0x9b, 0x87, 0xc6, 0x9e, 0xc5, 0xa5, 0xcd, 0xbd, 0xe1, + 0x9b, 0x8a, 0xc6, 0x9d, 0xc9, 0x85, 0xc4, 0xa4, 0x5c, 0x6f, 0xc6, 0x93, 0x76, 0xc3, + 0xa6, 0xe1, 0x9a, 0xad, 0xcd, 0xbb, 0xc2, 0xab, 0xc2, 0xa3, 0xe2, 0xb1, 0xaf, 0xc3, + 0xb6, 0xc6, 0x9f, 0xc5, 0xa5, 0x37, 0x34, 0xe1, 0x9b, 0x8c, 0xc5, 0x8e, 0xc2, 0xb9, + 0xe2, 0xb1, 0xba, 0xc9, 0x88, 0xc8, 0xba, 0xc7, 0x95, 0xc3, 0xa2, 0xc5, 0x9a, 0xc7, + 0x83, 0xc6, 0xb5, 0xc9, 0x8a, 0xc7, 0xb0, 0xe2, 0xb1, 0xab, 0xc5, 0xab, 0xc7, 0x8f, + 0xc3, 0xb6, 0xc4, 0xa7, 0xe1, 0x9a, 0xbb, 0x4e, 0xe1, 0x9b, 0x85, 0x5a, 0xc8, 0xb7, + 0x21, 0xe1, 0x9b, 0x87, 0x25, 0xc6, 0xb4, 0xc5, 0x92, 0xc8, 0xba, 0xc2, 0xa3, 0xc2, + 0xae, 0xe1, 0x9b, 0x89, 0xc5, 0xac, 0x67, 0xc5, 0x98, 0xc7, 0x81, 0xce, 0x85, 0xe2, + 0xb1, 0xb5, 0xc3, 0xab, 0xe2, 0xb1, 0xbd, 0xe1, 0x9b, 0x93, 0xc7, 0x91, 0xc8, 0xa0, + 0xc5, 0x83, 0xc6, 0xb4, 0xc8, 0xb6, 0xc8, 0x9a, 0xe1, 0x9b, 0x93, 0xc7, 0xa3, 0xe1, + 0x9a, 0xba, 0xc9, 0x81, 0xc5, 0xa5, 0xc5, 0xb8, 0x33, 0xc5, 0x86, 0xc8, 0x97, 0x77, + 0xe1, 0x9a, 0xb7, 0xc7, 0xa2, 0xc2, 0xaf, 0xce, 0x88, 0xe1, 0x9a, 0xaa, 0x33, 0xc8, + 0x8f, 0xc4, 0xb9, 0xc8, 0xaf, 0xc3, 0x81, 0xc6, 0xbc, 0xc9, 0x80, 0xc7, 0xb6, 0x46, + 0xe1, 0x9a, 0xa3, 0x6a, 0xc4, 0x85, 0xe1, 0x9b, 0x85, 0xc5, 0x8f, 0xcd, 0xbe, 0x71, + 0x2a, 0xc7, 0x95, 0xc6, 0xa1, 0xc3, 0xaf, 0xe1, 0x9b, 0xa6, 0xc3, 0x93, 0xc3, 0xa5, + 0xc7, 0x9a, 0xc5, 0xb4, 0x50, 0xc7, 0x81, 0xc3, 0x88, 0xc7, 0x87, 0x5a, 0xc3, 0x87, + 0xc3, 0xa2, 0xc7, 0x8a, 0xc8, 0xb9, 0xc3, 0xbb, 0xe1, 0x9a, 0xab, 0xc3, 0xaa, 0xc7, + 0x99, 0xc7, 0x89, 0xc3, 0x98, 0x7c, 0xc6, 0x83, 0x2d, 0xe2, 0xb1, 0xa2, 0xc6, 0x96, + 0xe1, 0x9a, 0xb1, 0x46, 0xe2, 0xb1, 0xa9, 0xc6, 0xaf, 0xc3, 0xbe, 0xe1, 0x9b, 0xa2, + 0xe1, 0x9b, 0x91, 0xc2, 0xb1, 0xc8, 0x8c, 0xc4, 0xb2, 0x75, 0xc4, 0xb9, 0xc5, 0xa6, + 0x52, 0xc6, 0xbc, 0xc3, 0xab, 0xe1, 0x9a, 0xb9, 0xc4, 0xb6, 0xc6, 0xb4, 0xc7, 0xa7, + 0xc2, 0xa1, 0x2d, 0x73, 0x6c, 0xc3, 0xae, 0xc3, 0x98, 0xc8, 0x91, 0xe2, 0xb1, 0xa1, + 0xc4, 0x9c, 0xc5, 0xa9, 0xe1, 0x9b, 0x80, 0xc2, 0xba, 0x71, 0xc3, 0x8c, 0x3b, 0xc3, + 0xb6, 0xc7, 0x95, 0xc5, 0xab, 0xc3, 0x81, 0xc6, 0xbf, 0xc5, 0x9a, 0xe1, 0x9b, 0xab, + 0xc8, 0x9c, 0xc8, 0x83, 0xc5, 0x9f, 0xc5, 0x9a, 0xc5, 0xae, 0xe1, 0x9a, 0xb4, 0xc5, + 0x9a, 0xc3, 0xa4, 0xc8, 0xab, 0xc7, 0xba, 0x69, + ], + asset_base: [ + 0x7e, 0x26, 0x94, 0x4d, 0x61, 0xa6, 0xc8, 0xfe, 0x89, 0x5e, 0xda, 0x8d, 0x1c, 0x72, + 0x77, 0x13, 0xe9, 0x65, 0x61, 0xb7, 0x56, 0x56, 0xfd, 0xa2, 0x07, 0x0b, 0x2b, 0x0c, + 0x9d, 0xe1, 0x4d, 0x85, + ], + }, + TestVector { + key: [ + 0xae, 0x36, 0xb6, 0x1a, 0x3d, 0x10, 0xf1, 0xaa, 0x75, 0x2a, 0xb1, 0xdc, 0x16, 0xe3, + 0xe4, 0x9b, 0x6a, 0xc0, 0xd2, 0xae, 0x19, 0x07, 0xd2, 0xe6, 0x94, 0x25, 0xec, 0x12, + 0xc9, 0x3a, 0xae, 0xbc, + ], + description: [ + 0xc4, 0x9e, 0xe2, 0xb1, 0xa6, 0xe1, 0x9a, 0xb3, 0x2e, 0xe2, 0xb1, 0xb4, 0xc7, 0x8a, + 0xe1, 0x9b, 0xaf, 0xc4, 0xa9, 0xe2, 0xb1, 0xb5, 0x26, 0xc5, 0x8a, 0xc3, 0xa9, 0x7b, + 0xc7, 0xac, 0xc8, 0xb4, 0xe1, 0x9a, 0xb1, 0xe1, 0x9b, 0x85, 0xc6, 0x88, 0xc6, 0x80, + 0xe1, 0x9a, 0xb0, 0xc5, 0xa2, 0x23, 0xc4, 0x9f, 0xc2, 0xa1, 0xe1, 0x9b, 0xac, 0xc6, + 0x98, 0x70, 0x5c, 0xc9, 0x89, 0xc4, 0xa0, 0xc4, 0xaa, 0xc5, 0xa3, 0x79, 0xc3, 0xab, + 0xce, 0x89, 0xc9, 0x83, 0xc3, 0xab, 0xe2, 0xb1, 0xa0, 0x3d, 0x6a, 0xc4, 0x93, 0xe1, + 0x9b, 0xab, 0x7a, 0xe1, 0x9b, 0x87, 0xe1, 0x9b, 0x95, 0xc2, 0xa5, 0xc9, 0x86, 0xc7, + 0xb5, 0xc2, 0xaf, 0xe1, 0x9b, 0x9a, 0xc4, 0xa9, 0xc3, 0x8a, 0xc9, 0x80, 0xc3, 0xaf, + 0xc6, 0x8f, 0xc6, 0x89, 0xc4, 0xa9, 0xc4, 0xb4, 0xe1, 0x9b, 0x8d, 0x4b, 0xc8, 0x96, + 0xc6, 0x87, 0x40, 0xc4, 0x8e, 0xc6, 0x81, 0xc3, 0x9b, 0xc8, 0x9b, 0x49, 0xe2, 0xb1, + 0xa0, 0xc4, 0xb4, 0xc6, 0xa8, 0xc6, 0x8c, 0xc3, 0xb7, 0x34, 0xc8, 0x89, 0xc2, 0xb8, + 0xc2, 0xb2, 0xc4, 0xa8, 0xc4, 0xa0, 0xc7, 0xbb, 0xe2, 0xb1, 0xac, 0xe1, 0x9b, 0x97, + 0xc3, 0xa9, 0xc2, 0xbe, 0xc6, 0x85, 0xc2, 0xa9, 0xcd, 0xb5, 0xc3, 0x95, 0xc8, 0x8b, + 0xc5, 0x94, 0xe2, 0xb1, 0xa0, 0xc2, 0xb5, 0xc6, 0x94, 0xc4, 0xba, 0xe2, 0xb1, 0xbb, + 0xe1, 0x9b, 0x88, 0xc4, 0xa2, 0xc5, 0xa2, 0xcd, 0xbc, 0xc6, 0x88, 0xc3, 0x80, 0xc8, + 0x9d, 0xc5, 0x9b, 0xc7, 0xbe, 0xc5, 0x8c, 0xc5, 0xa8, 0xc5, 0xb0, 0xc9, 0x8c, 0xc2, + 0xa5, 0xc7, 0xbd, 0xc8, 0xaf, 0xc3, 0xb2, 0xc7, 0x8b, 0xc2, 0xb8, 0x25, 0xe1, 0x9b, + 0x80, 0xc9, 0x8f, 0xe1, 0x9b, 0xaa, 0xc5, 0xb1, 0xe1, 0x9b, 0x9d, 0xc5, 0xa5, 0xc2, + 0xa3, 0xc8, 0xaf, 0xc8, 0xb1, 0xc6, 0xb3, 0x3f, 0xc6, 0xb9, 0xc7, 0x91, 0xc7, 0x81, + 0xc7, 0xbc, 0x5d, 0x7c, 0x69, 0xc7, 0x96, 0xe1, 0x9b, 0x8c, 0xc7, 0xb7, 0xc6, 0xa3, + 0xe2, 0xb1, 0xb0, 0xc6, 0xb7, 0xce, 0x88, 0xc9, 0x81, 0xc3, 0x80, 0xe1, 0x9b, 0xaf, + 0xc7, 0xae, 0xc5, 0xbc, 0xc4, 0x8c, 0xc4, 0xa7, 0x71, 0x6e, 0xc6, 0x91, 0xc4, 0x96, + 0xc6, 0x88, 0xc6, 0x97, 0xc5, 0xa4, 0xc5, 0xbf, 0xc7, 0x8d, 0xc8, 0xb9, 0xc7, 0xb5, + 0xe1, 0x9a, 0xb0, 0xc4, 0xa8, 0xc7, 0xa3, 0xc6, 0xba, 0xe1, 0x9a, 0xb5, 0xc6, 0x86, + 0xe1, 0x9b, 0x80, 0xc9, 0x82, 0x4a, 0xc7, 0xa3, 0x7e, 0xc3, 0x9f, 0xc8, 0xb9, 0x7a, + 0x3b, 0xc6, 0xa7, 0xc8, 0x97, 0xc6, 0x92, 0xe1, 0x9b, 0xa1, 0xc7, 0x97, 0xc7, 0xa7, + 0xe1, 0x9a, 0xa3, 0xc9, 0x8d, 0xc6, 0xa0, 0xe1, 0x9b, 0xa0, 0xc4, 0x90, 0xc3, 0x9a, + 0xc4, 0x8f, 0xc7, 0xbc, 0xc4, 0x8b, 0xc2, 0xaa, 0x5d, 0xc3, 0xb0, 0xc3, 0x8b, 0xc4, + 0x90, 0xc3, 0xac, 0xc4, 0xad, 0xe1, 0x9a, 0xb8, 0xc5, 0x93, 0xc8, 0x92, 0xc3, 0x81, + 0xe1, 0x9a, 0xbc, 0xc4, 0xb3, 0xc6, 0x83, 0xc8, 0x9b, 0xc8, 0x81, 0x45, 0xe1, 0x9b, + 0x89, 0xc7, 0xbb, 0xc9, 0x87, 0xc6, 0xb6, 0x4c, 0xc6, 0x88, 0x60, 0xe1, 0x9b, 0x8c, + 0xc6, 0xa7, 0xcd, 0xbc, 0xc3, 0xbe, 0xc2, 0xb3, 0xc7, 0xab, 0xcd, 0xb6, 0xc8, 0xa2, + 0xc2, 0xbc, 0xe2, 0xb1, 0xa5, 0xc5, 0x8f, 0xc6, 0xa0, 0xc6, 0xa6, 0xc6, 0x9b, 0xc8, + 0x94, 0xe1, 0x9a, 0xa0, 0xe2, 0xb1, 0xb6, 0x3f, 0xcd, 0xb2, 0xc8, 0x81, 0xc3, 0x88, + 0xc3, 0xb9, 0xe1, 0x9b, 0x81, 0xe2, 0xb1, 0xa8, 0xc5, 0xb8, 0x48, 0x60, 0xc6, 0xb0, + 0xc5, 0xb1, 0xc3, 0x8e, 0x4a, 0xc5, 0x84, 0xc8, 0xaf, 0xc4, 0xb2, 0xc4, 0x97, 0xe2, + 0xb1, 0xbd, 0xc4, 0xb6, 0x3f, 0xc8, 0x89, 0x5a, + ], + asset_base: [ + 0xcc, 0x07, 0x9a, 0xf8, 0x84, 0x69, 0xe9, 0xbd, 0x7e, 0x67, 0x8e, 0xcf, 0x7f, 0x9f, + 0x79, 0xfa, 0x4d, 0x30, 0x89, 0x27, 0x28, 0xad, 0x87, 0x32, 0xe9, 0xcc, 0x99, 0x7d, + 0x3c, 0x7c, 0x64, 0x1f, + ], + }, + TestVector { + key: [ + 0x49, 0x26, 0x53, 0x80, 0xd2, 0xb0, 0x2e, 0x0a, 0x1d, 0x98, 0x8f, 0x3d, 0xe3, 0x45, + 0x8b, 0x6e, 0x00, 0x29, 0x1d, 0xb0, 0xe6, 0x2e, 0x17, 0x47, 0x91, 0xd0, 0x09, 0x29, + 0x9f, 0x61, 0xfe, 0xc4, + ], + description: [ + 0xc7, 0x88, 0xc2, 0xa3, 0xe2, 0xb1, 0xa7, 0xc5, 0x84, 0xc6, 0xac, 0xc8, 0xaa, 0x63, + 0xc6, 0xa7, 0xc5, 0xa7, 0x75, 0xc7, 0x97, 0xe1, 0x9b, 0xaf, 0x71, 0xc8, 0x95, 0xe1, + 0x9a, 0xba, 0x44, 0x45, 0xc3, 0xa1, 0xe1, 0x9b, 0xac, 0xc6, 0xbf, 0xc4, 0xbc, 0xc4, + 0x88, 0xe1, 0x9b, 0x82, 0xe2, 0xb1, 0xb1, 0x5d, 0xc3, 0xa7, 0xe1, 0x9b, 0xa0, 0xc7, + 0xb4, 0x5a, 0xc4, 0xad, 0xe1, 0x9b, 0x8f, 0xc5, 0x88, 0xc9, 0x8c, 0xc8, 0xab, 0xe1, + 0x9a, 0xaf, 0xc7, 0xb6, 0xc2, 0xb8, 0x59, 0xc5, 0xbb, 0xc5, 0xbd, 0x2e, 0xc5, 0x86, + 0xe2, 0xb1, 0xbb, 0xe2, 0xb1, 0xb1, 0xc3, 0xb4, 0xc5, 0xb2, 0xc4, 0x96, 0xc5, 0x99, + 0xc7, 0x8c, 0x71, 0xc6, 0xa2, 0xc3, 0x91, 0xc5, 0xb9, 0xcd, 0xbe, 0x26, 0xe1, 0x9a, + 0xa8, 0xe1, 0x9b, 0x86, 0xc3, 0x99, 0xc8, 0xa7, 0xc4, 0x8b, 0xe2, 0xb1, 0xb4, 0xc5, + 0x8c, 0xc5, 0x9e, 0xc5, 0xa5, 0xc4, 0xbd, 0x3c, 0xc5, 0x89, 0xc4, 0x88, 0x29, 0xc2, + 0xa6, 0x2c, 0xc7, 0xa9, 0xc5, 0xb6, 0xc8, 0x92, 0xc5, 0xb8, 0x3c, 0xc6, 0x8b, 0xc6, + 0x83, 0xe1, 0x9b, 0x9b, 0xc6, 0x88, 0xe2, 0xb1, 0xba, 0x32, 0x63, 0xc7, 0xbe, 0xc6, + 0x8a, 0xc7, 0x8d, 0xc6, 0xa5, 0xc6, 0x9f, 0xc8, 0x98, 0xc4, 0xb0, 0xc8, 0xac, 0xc8, + 0xb1, 0xc5, 0xa3, 0xc2, 0xb1, 0xc9, 0x8f, 0xc4, 0xbf, 0xe1, 0x9b, 0xa3, 0xe2, 0xb1, + 0xad, 0xc4, 0x88, 0xc5, 0x8d, 0xc7, 0x98, 0xc8, 0xb4, 0xc3, 0xab, 0xc3, 0x9b, 0xc6, + 0xa5, 0xe1, 0x9b, 0x89, 0xc2, 0xa8, 0xce, 0x88, 0xe2, 0xb1, 0xb9, 0xe1, 0x9b, 0x83, + 0xc6, 0x83, 0xce, 0x8c, 0xc3, 0xbc, 0x65, 0xe1, 0x9a, 0xaf, 0xc4, 0x88, 0xe1, 0x9a, + 0xa1, 0xc8, 0x87, 0xc8, 0x98, 0xc5, 0x8e, 0xc8, 0xbd, 0x30, 0xc4, 0xb8, 0xc7, 0xa4, + 0x48, 0xc8, 0xa1, 0xe1, 0x9b, 0x93, 0xc4, 0xa8, 0xc5, 0xba, 0x52, 0xc3, 0xbc, 0xc6, + 0xbe, 0xc6, 0x96, 0xc9, 0x8c, 0x3a, 0xc8, 0xa9, 0xc2, 0xac, 0xe1, 0x9b, 0x8c, 0xc3, + 0x9d, 0xe2, 0xb1, 0xb0, 0xc4, 0xaf, 0x34, 0xc5, 0xb2, 0xc7, 0xb3, 0xc6, 0xb2, 0xe1, + 0x9a, 0xb9, 0xc7, 0x98, 0xc8, 0xbe, 0x7a, 0xc2, 0xa7, 0xe1, 0x9b, 0x85, 0xc9, 0x8b, + 0xc5, 0x98, 0xc7, 0xa3, 0xe2, 0xb1, 0xab, 0xc3, 0xbf, 0xc3, 0xb1, 0xc8, 0x88, 0xc4, + 0x9d, 0xc4, 0x80, 0xc7, 0xac, 0xc7, 0xbe, 0xe1, 0x9a, 0xa3, 0xc6, 0x8c, 0xe1, 0x9b, + 0xa5, 0xc8, 0x8f, 0xc4, 0xbf, 0xc4, 0xbf, 0xc8, 0x84, 0xc3, 0x81, 0xc7, 0xa6, 0xe2, + 0xb1, 0xa3, 0xc3, 0xb2, 0x5a, 0xe1, 0x9b, 0xa2, 0xe1, 0x9a, 0xba, 0xc4, 0x92, 0xc8, + 0xaa, 0xe1, 0x9a, 0xaf, 0xc5, 0x8b, 0xc6, 0xa3, 0x73, 0xc6, 0x87, 0xc4, 0x82, 0xc8, + 0xa0, 0xc8, 0xaf, 0x6f, 0xe2, 0xb1, 0xbb, 0xc7, 0x9c, 0x55, 0xe1, 0x9a, 0xbf, 0xc2, + 0xa6, 0xc8, 0xab, 0xc6, 0xa5, 0xc8, 0x8b, 0xc5, 0x90, 0xc5, 0xbf, 0xc8, 0x94, 0xc6, + 0xa3, 0xc4, 0xbe, 0xc4, 0xab, 0xc7, 0xb8, 0xc4, 0x91, 0xc6, 0xa6, 0xc5, 0xb6, 0xc3, + 0x9b, 0xc8, 0xae, 0xc4, 0x8f, 0x62, 0xc2, 0xa4, 0xc8, 0x99, 0xcd, 0xba, 0xc4, 0x96, + 0xc2, 0xb2, 0xc6, 0x92, 0xc5, 0xb5, 0xc5, 0x83, 0xc6, 0x92, 0xc6, 0x8d, 0xe1, 0x9b, + 0xb0, 0xe1, 0x9b, 0x99, 0xc7, 0xae, 0xe1, 0x9a, 0xa7, 0x64, 0x33, 0x3c, 0xc6, 0xab, + 0xc4, 0x95, 0xc3, 0xbd, 0xc8, 0xad, 0xc5, 0xa5, 0x5e, 0xe2, 0xb1, 0xbe, 0xe1, 0x9a, + 0xb6, 0xc8, 0x83, 0x54, 0x25, 0xc8, 0x80, 0xc6, 0xa9, 0xe1, 0x9a, 0xb2, 0xc5, 0x98, + 0xc8, 0xb3, 0xc6, 0x96, 0xc7, 0x87, 0xe1, 0x9a, 0xaa, 0xe1, 0x9b, 0x92, 0xc6, 0xaa, + 0x72, 0x67, 0xe2, 0xb1, 0xb4, 0x4d, 0xc3, 0xb2, + ], + asset_base: [ + 0xaa, 0xb9, 0x9e, 0x01, 0x44, 0xfb, 0xf5, 0x9f, 0x87, 0xd2, 0xe5, 0xf6, 0x32, 0x63, + 0x82, 0xf6, 0x3a, 0x46, 0x83, 0x83, 0xb4, 0x74, 0x40, 0xd7, 0x84, 0xe9, 0x4e, 0x6b, + 0x3a, 0xb6, 0x45, 0x28, + ], + }, + TestVector { + key: [ + 0x9a, 0x0e, 0x46, 0x39, 0xb4, 0x69, 0x1f, 0x02, 0x7c, 0x0d, 0xb7, 0xfe, 0xf1, 0xbb, + 0x5e, 0xf9, 0x0a, 0xcd, 0xb7, 0x08, 0x62, 0x6d, 0x2e, 0x1f, 0x3e, 0x38, 0x3e, 0xe7, + 0x5b, 0x31, 0xcf, 0x57, + ], + description: [ + 0xc3, 0xaa, 0xc3, 0xa0, 0xe2, 0xb1, 0xba, 0xc6, 0x8d, 0x34, 0xc4, 0xb0, 0xc4, 0x8b, + 0xc2, 0xba, 0xc5, 0xa9, 0xe2, 0xb1, 0xa6, 0xc3, 0xa8, 0x6f, 0x2c, 0x45, 0xc5, 0xaf, + 0xc4, 0xbb, 0xc7, 0x8b, 0xc6, 0x8e, 0xc8, 0x94, 0xc3, 0xac, 0xc2, 0xab, 0xc8, 0x8b, + 0xe1, 0x9a, 0xb4, 0xc5, 0x9d, 0xc8, 0xb3, 0xc7, 0xb9, 0xe1, 0x9a, 0xac, 0xc6, 0x9b, + 0xc4, 0x9d, 0xc2, 0xa3, 0xe1, 0x9a, 0xb6, 0xc5, 0x92, 0xc7, 0x87, 0x46, 0xc4, 0x99, + 0xce, 0x88, 0xc5, 0x91, 0xc8, 0x92, 0xc4, 0xa9, 0xc3, 0xab, 0x78, 0xc9, 0x8e, 0xc7, + 0xac, 0xc5, 0xba, 0xc4, 0x88, 0xc5, 0x80, 0xc7, 0x91, 0xc5, 0xb7, 0xc5, 0xaa, 0xe1, + 0x9b, 0x97, 0x30, 0xc8, 0x8d, 0x5c, 0xc2, 0xb3, 0xc4, 0x9f, 0x2a, 0xc3, 0xb8, 0xc7, + 0xae, 0xc7, 0xbd, 0xc4, 0xa0, 0xe1, 0x9a, 0xa1, 0xe1, 0x9a, 0xbf, 0xc7, 0x9e, 0xe1, + 0x9b, 0x84, 0xc8, 0x9c, 0xc5, 0x86, 0x2b, 0xc4, 0x96, 0xcd, 0xb4, 0xc3, 0x82, 0x6a, + 0xc8, 0xa6, 0xc5, 0x8c, 0xc3, 0x8a, 0xc2, 0xbf, 0xc6, 0x9e, 0x32, 0xe2, 0xb1, 0xa0, + 0xc5, 0xa2, 0xc8, 0x8b, 0x3e, 0xc4, 0x91, 0xc6, 0xab, 0xc3, 0x92, 0xc7, 0xa7, 0xc8, + 0xa3, 0xc4, 0xa7, 0xe1, 0x9a, 0xb0, 0xc4, 0x9c, 0xcd, 0xb6, 0xe1, 0x9a, 0xa1, 0xc6, + 0x8b, 0xe1, 0x9b, 0x9e, 0xc2, 0xb5, 0xc6, 0x89, 0x33, 0x46, 0xc6, 0x8d, 0xc4, 0xb3, + 0xc8, 0xac, 0xc5, 0x97, 0xc3, 0xb7, 0xc7, 0xab, 0xe2, 0xb1, 0xa1, 0xe1, 0x9b, 0x9f, + 0xc4, 0x94, 0xe1, 0x9b, 0xb0, 0xc8, 0x8e, 0xc4, 0xa8, 0xc5, 0x8b, 0xc6, 0xbb, 0xc2, + 0xa6, 0xe1, 0x9b, 0xae, 0xc2, 0xac, 0xe1, 0x9b, 0x84, 0xc2, 0xb1, 0x4c, 0xc2, 0xb7, + 0xc5, 0x9c, 0x5d, 0xc9, 0x8c, 0xe1, 0x9b, 0x8b, 0x31, 0xc6, 0xb5, 0x62, 0xc7, 0x9e, + 0xc3, 0xa8, 0xc8, 0x82, 0xc7, 0xb7, 0x69, 0xe1, 0x9a, 0xbf, 0xe1, 0x9a, 0xa3, 0xe1, + 0x9b, 0xb0, 0x6e, 0xc6, 0xb9, 0xc9, 0x89, 0xc8, 0xb1, 0xc6, 0xaf, 0xe1, 0x9b, 0x90, + 0x55, 0xc4, 0xb1, 0xe1, 0x9b, 0xac, 0xe1, 0x9b, 0x8b, 0xc7, 0xaa, 0xe1, 0x9b, 0x88, + 0xc3, 0xbf, 0xe1, 0x9a, 0xa5, 0xc5, 0xa9, 0xc2, 0xb7, 0x62, 0xc3, 0x91, 0xc5, 0x93, + 0xc4, 0xbd, 0xc3, 0x90, 0xe1, 0x9b, 0x86, 0xe1, 0x9b, 0x8e, 0xcd, 0xbc, 0xc8, 0x86, + 0xe2, 0xb1, 0xb2, 0xc2, 0xbe, 0xc6, 0xbd, 0x64, 0xc2, 0xb2, 0xcd, 0xbb, 0xc3, 0x90, + 0xc7, 0x9c, 0xcd, 0xb5, 0xc8, 0x9f, 0xc7, 0xa0, 0x75, 0xc8, 0x9f, 0xe1, 0x9b, 0x99, + 0xc5, 0x9a, 0xe2, 0xb1, 0xae, 0xc6, 0x90, 0xc4, 0xad, 0xc3, 0x89, 0xc2, 0xba, 0xc4, + 0x91, 0xc6, 0x83, 0xe1, 0x9a, 0xa6, 0xc3, 0x93, 0xc3, 0x9b, 0xc7, 0x8f, 0xc4, 0xa3, + 0xc5, 0xae, 0x40, 0xc5, 0xb4, 0xe1, 0x9b, 0x97, 0xe2, 0xb1, 0xbf, 0xc6, 0xb3, 0xe2, + 0xb1, 0xb2, 0xe1, 0x9a, 0xae, 0xc3, 0x95, 0xc4, 0x80, 0xc5, 0x9b, 0xc5, 0xa9, 0xc5, + 0xa8, 0xe1, 0x9b, 0xa7, 0xc8, 0x98, 0x75, 0x53, 0xe2, 0xb1, 0xb4, 0xe1, 0x9a, 0xb4, + 0xc3, 0xa3, 0x4b, 0xc3, 0x86, 0xe1, 0x9a, 0xa9, 0xc3, 0x80, 0xe1, 0x9b, 0xb0, 0xc3, + 0x81, 0xc4, 0x86, 0xc9, 0x83, 0xc8, 0xbb, 0xc3, 0x88, 0xc8, 0x96, 0xc7, 0xac, 0xc4, + 0x9a, 0xc5, 0xb7, 0x7e, 0xc7, 0xbe, 0xc6, 0xba, 0xc2, 0xb6, 0xe1, 0x9a, 0xb5, 0xc7, + 0xbd, 0xc7, 0x80, 0x73, 0xc7, 0xab, 0xc8, 0xbd, 0xc7, 0xb7, 0xc3, 0x89, 0xe1, 0x9b, + 0x92, 0xe1, 0x9b, 0x85, 0xe2, 0xb1, 0xb7, 0xc8, 0x8c, 0xc4, 0xb8, 0xc8, 0xa2, 0xc3, + 0xa6, 0xc4, 0x9c, 0xc5, 0x9b, 0xc2, 0xa3, 0xc8, 0x8b, 0xc2, 0xbd, 0xe2, 0xb1, 0xb0, + 0xc5, 0xa6, 0xce, 0x87, 0xc2, 0xb3, 0xc5, 0xbc, + ], + asset_base: [ + 0x9c, 0x67, 0xc9, 0x2b, 0xeb, 0x8d, 0x82, 0xb5, 0x8a, 0x3d, 0x24, 0xba, 0xaa, 0x0a, + 0xa1, 0x5c, 0x30, 0x64, 0x16, 0xb2, 0x63, 0x72, 0x16, 0xe9, 0xb7, 0x83, 0x05, 0x43, + 0x4c, 0x57, 0x96, 0xb6, + ], + }, + TestVector { + key: [ + 0xbb, 0xf4, 0x49, 0x82, 0xf1, 0xba, 0x3a, 0x2b, 0x9d, 0xd3, 0xc1, 0x77, 0x4d, 0x71, + 0xce, 0x33, 0x60, 0x59, 0x9b, 0x07, 0xf2, 0x11, 0xc8, 0x16, 0xb8, 0xc4, 0x3b, 0x98, + 0x42, 0x23, 0x09, 0x24, + ], + description: [ + 0xc4, 0xa8, 0xc5, 0x96, 0xc2, 0xb6, 0xc6, 0xb1, 0x7c, 0xc7, 0xa0, 0x36, 0xc6, 0x9f, + 0x75, 0xc2, 0xa1, 0xc3, 0xbe, 0xc8, 0x90, 0xc2, 0xa6, 0xc3, 0x86, 0xc9, 0x86, 0xe2, + 0xb1, 0xa7, 0xe1, 0x9b, 0xa8, 0xc5, 0x9c, 0xc7, 0xa6, 0xc7, 0xbd, 0xe1, 0x9b, 0xa2, + 0x37, 0xc2, 0xbd, 0xc3, 0x97, 0xc4, 0x8f, 0xc3, 0x80, 0xc4, 0x8f, 0xc6, 0xa6, 0xc5, + 0x8e, 0xce, 0x89, 0xc4, 0xa6, 0xe1, 0x9a, 0xa7, 0xe1, 0x9b, 0x8f, 0xe2, 0xb1, 0xb7, + 0xc9, 0x84, 0xe1, 0x9a, 0xa1, 0xc6, 0x97, 0xe1, 0x9b, 0x85, 0xc3, 0xaf, 0xc6, 0xbf, + 0x3e, 0xe2, 0xb1, 0xbf, 0xc7, 0xa9, 0x39, 0xc4, 0x80, 0xc3, 0x80, 0xc6, 0x87, 0xc3, + 0xa9, 0x4c, 0x66, 0xc8, 0xa5, 0x3b, 0xc5, 0x83, 0x48, 0xc6, 0xbd, 0xc5, 0xbd, 0xc7, + 0x8f, 0xc8, 0xaf, 0xc7, 0x9c, 0xe1, 0x9a, 0xb5, 0xcd, 0xbc, 0xc5, 0x9a, 0xc2, 0xa1, + 0xe2, 0xb1, 0xbf, 0xe1, 0x9b, 0x91, 0xc4, 0x8d, 0xc5, 0x9b, 0xc3, 0x9d, 0xc5, 0x90, + 0xe1, 0x9b, 0x82, 0x71, 0xc2, 0xb9, 0xc7, 0xa4, 0xcd, 0xbc, 0xc5, 0x80, 0xc8, 0x8e, + 0xc7, 0x83, 0x53, 0xc8, 0xb1, 0xc4, 0x83, 0xe2, 0xb1, 0xa0, 0xc5, 0x86, 0xc5, 0xa7, + 0xc4, 0xb0, 0xc6, 0x9b, 0xc8, 0xa6, 0xc8, 0xb2, 0xc5, 0x89, 0xc8, 0xb7, 0xc9, 0x83, + 0xc5, 0xaa, 0xc3, 0x9a, 0xc4, 0xae, 0xc4, 0xbb, 0xc6, 0x9f, 0xc6, 0xac, 0xc8, 0x8b, + 0xc9, 0x8e, 0x70, 0xc5, 0x88, 0x6e, 0xc6, 0x9e, 0xe1, 0x9a, 0xb7, 0xcd, 0xb5, 0xc3, + 0x9d, 0xe2, 0xb1, 0xb2, 0xc4, 0x90, 0xe1, 0x9b, 0x97, 0xc7, 0xb0, 0xc6, 0xa0, 0xe2, + 0xb1, 0xaa, 0xc7, 0x8e, 0xc5, 0xb4, 0x3c, 0xc7, 0xa8, 0xc9, 0x81, 0xc2, 0xb6, 0xc5, + 0xa8, 0x21, 0x78, 0xe2, 0xb1, 0xab, 0xce, 0x84, 0xc5, 0x85, 0xc6, 0x83, 0xc4, 0x82, + 0xc7, 0x90, 0xc6, 0xb5, 0xc6, 0xb9, 0xc8, 0xac, 0xc7, 0xb9, 0xc3, 0xb1, 0xc5, 0x85, + 0xe1, 0x9a, 0xa5, 0x50, 0x44, 0xc5, 0xb7, 0xe1, 0x9a, 0xac, 0xc4, 0x9c, 0xc7, 0x90, + 0xc5, 0x85, 0xc8, 0xbe, 0xc2, 0xb5, 0xc6, 0xb7, 0xc7, 0xba, 0xc6, 0x98, 0xe1, 0x9b, + 0xa8, 0xe2, 0xb1, 0xb9, 0xc5, 0xae, 0xc7, 0x83, 0xc5, 0xb4, 0xc4, 0x98, 0xc6, 0x9f, + 0xc5, 0x84, 0xc3, 0x92, 0xe1, 0x9b, 0x85, 0xc5, 0x95, 0x31, 0xc3, 0x8e, 0xe1, 0x9a, + 0xa0, 0x66, 0xc8, 0xbf, 0xc6, 0x96, 0xc7, 0xbb, 0xc2, 0xb2, 0xe2, 0xb1, 0xbf, 0xc4, + 0x96, 0xe1, 0x9a, 0xb6, 0xc8, 0xa5, 0xc5, 0xb6, 0xc6, 0xa7, 0xc8, 0x8d, 0xc3, 0xa0, + 0xc7, 0xae, 0xc7, 0xb8, 0xe1, 0x9b, 0x85, 0xc7, 0x8a, 0xc4, 0xa4, 0xc4, 0x9d, 0xc4, + 0xbe, 0xe1, 0x9a, 0xb5, 0xc4, 0x85, 0xc9, 0x83, 0xc3, 0xb5, 0xc3, 0xba, 0xc4, 0x9d, + 0xc6, 0xad, 0x68, 0xe1, 0x9b, 0xb0, 0xc4, 0x86, 0xc7, 0xb6, 0xc6, 0x92, 0xc9, 0x80, + 0xc5, 0x80, 0xcd, 0xb1, 0xc7, 0x85, 0xc4, 0xae, 0xc6, 0x95, 0xe2, 0xb1, 0xb2, 0xc5, + 0x9d, 0xc8, 0x99, 0xc4, 0x91, 0xe1, 0x9b, 0x93, 0xe1, 0x9b, 0x91, 0xc4, 0xbc, 0xc4, + 0x85, 0xe1, 0x9b, 0xa1, 0xc5, 0x86, 0x26, 0xc3, 0xa8, 0xc3, 0x88, 0xc4, 0xb8, 0xe2, + 0xb1, 0xa7, 0xc2, 0xa5, 0xe1, 0x9b, 0x98, 0xc4, 0xb3, 0x7c, 0xc3, 0xb1, 0xe1, 0x9b, + 0x94, 0xc6, 0x9b, 0xcd, 0xbc, 0xcd, 0xb2, 0xc8, 0x8c, 0xc6, 0x8c, 0xe2, 0xb1, 0xb0, + 0x52, 0xc3, 0x9b, 0xc3, 0x8c, 0x5e, 0xc5, 0x90, 0xc3, 0xa4, 0xc3, 0x8a, 0x58, 0xc8, + 0x9e, 0xc5, 0xba, 0xc5, 0xb3, 0x6c, 0xc2, 0xab, 0xc4, 0xa1, 0x38, 0xc6, 0xb6, 0xe1, + 0x9b, 0x9f, 0x71, 0xc9, 0x84, 0xe2, 0xb1, 0xb9, 0xc3, 0x9a, 0xc6, 0x83, 0xe1, 0x9a, + 0xa4, 0xc6, 0x85, 0xc3, 0x8c, 0x25, 0x4e, 0x5a, + ], + asset_base: [ + 0x08, 0x32, 0x00, 0xcc, 0x9c, 0xa5, 0x39, 0xbe, 0xc9, 0x29, 0x51, 0x50, 0x4d, 0xca, + 0xf2, 0xc5, 0xe0, 0xe8, 0xe3, 0x57, 0xd7, 0xea, 0xed, 0x18, 0xb0, 0x15, 0x8b, 0x69, + 0x2c, 0xe4, 0xce, 0x9d, + ], + }, + TestVector { + key: [ + 0xff, 0x63, 0xc7, 0x89, 0x25, 0x1c, 0x10, 0x43, 0xc6, 0xf9, 0x6c, 0x66, 0xbf, 0x5b, + 0x0f, 0x61, 0xc9, 0xd6, 0x5f, 0xef, 0x5a, 0xaf, 0x42, 0x84, 0xa6, 0xa5, 0x69, 0x94, + 0x94, 0x1c, 0x05, 0xfa, + ], + description: [ + 0xc8, 0x8a, 0xc5, 0xb0, 0xe1, 0x9a, 0xb2, 0xc8, 0xbc, 0xc8, 0xbc, 0xc5, 0x9e, 0x63, + 0xcd, 0xb4, 0xc7, 0xbf, 0xc6, 0xbd, 0xc8, 0x99, 0xc3, 0x8c, 0xc8, 0x9c, 0x45, 0xc9, + 0x85, 0xcd, 0xb3, 0xc6, 0xb8, 0xc8, 0x91, 0x4e, 0xc9, 0x82, 0xc5, 0xab, 0xc5, 0x8a, + 0xce, 0x87, 0xe1, 0x9a, 0xbd, 0xc8, 0xa3, 0xc8, 0xa9, 0xc7, 0x90, 0xc6, 0x9c, 0xe1, + 0x9b, 0xa0, 0x41, 0x4c, 0xc2, 0xbb, 0xc7, 0x93, 0xe1, 0x9a, 0xa3, 0xc5, 0xba, 0xc6, + 0x86, 0xcd, 0xbd, 0xc5, 0x8d, 0xc4, 0xa4, 0xc8, 0xb5, 0xc3, 0x9d, 0xc3, 0xae, 0xc5, + 0x98, 0xe1, 0x9b, 0x91, 0x63, 0x66, 0xc3, 0xbc, 0xc8, 0xae, 0x7e, 0x40, 0xc2, 0xa8, + 0xc3, 0x8a, 0xc4, 0xac, 0x35, 0x3d, 0xcd, 0xbd, 0xc6, 0xad, 0xc3, 0x9b, 0xc6, 0x81, + 0xc5, 0xab, 0xc4, 0x8f, 0x28, 0xc4, 0x9d, 0xe1, 0x9b, 0x8e, 0xe1, 0x9b, 0xa4, 0xc5, + 0x86, 0xe1, 0x9a, 0xba, 0x50, 0xc6, 0xbc, 0xc6, 0x9b, 0xc7, 0xac, 0xc4, 0xb4, 0xe1, + 0x9a, 0xa9, 0xe1, 0x9b, 0xae, 0xc3, 0x91, 0xc6, 0x82, 0xc4, 0xa8, 0xc5, 0xa8, 0xc6, + 0xae, 0x2d, 0xe1, 0x9b, 0x9e, 0xc8, 0x8e, 0xe1, 0x9b, 0xa7, 0xc5, 0x8e, 0xc8, 0x8d, + 0xc3, 0x96, 0xc7, 0x9f, 0xc3, 0xb4, 0x3a, 0xcd, 0xb6, 0xc6, 0x8a, 0x6c, 0xc3, 0x9e, + 0xc9, 0x81, 0x65, 0xe1, 0x9b, 0x93, 0xe1, 0x9b, 0xa2, 0xc7, 0x82, 0xe2, 0xb1, 0xad, + 0xe2, 0xb1, 0xa8, 0xc8, 0x96, 0xc8, 0xaa, 0xc6, 0xbc, 0x6b, 0xe1, 0x9a, 0xb4, 0xc5, + 0x9f, 0xc4, 0x92, 0xc6, 0x8e, 0xc3, 0x80, 0xc5, 0xb8, 0xc3, 0xa4, 0x2d, 0x38, 0xc5, + 0xb9, 0xc7, 0xb7, 0xc3, 0x8f, 0xc2, 0xb3, 0x62, 0xc5, 0x87, 0x21, 0xc6, 0x8f, 0xc7, + 0xb7, 0xe1, 0x9a, 0xb4, 0xc4, 0x84, 0x3e, 0xc7, 0x89, 0xc8, 0xaf, 0xc6, 0x98, 0xc6, + 0xb7, 0xc8, 0x9f, 0xc7, 0x9a, 0xc7, 0x96, 0xc3, 0xbb, 0x55, 0xe2, 0xb1, 0xb5, 0xc5, + 0xad, 0x2e, 0xc3, 0x86, 0xe1, 0x9b, 0x95, 0xc8, 0x81, 0xc3, 0x9b, 0xe1, 0x9b, 0xa4, + 0xcd, 0xb6, 0xc8, 0x8d, 0xc3, 0xa4, 0xc3, 0x89, 0xc8, 0x9d, 0xc8, 0xbe, 0x37, 0x25, + 0xc6, 0x99, 0x32, 0xc6, 0x92, 0xe1, 0x9b, 0x8b, 0x3a, 0x5f, 0x36, 0xc8, 0x9a, 0xc7, + 0xb3, 0x73, 0xc7, 0xaf, 0x7a, 0xc4, 0xac, 0xc7, 0x8b, 0xc8, 0x96, 0xc7, 0x82, 0xc8, + 0x8f, 0xc6, 0xb7, 0x37, 0xc3, 0xbc, 0xc5, 0x89, 0x2c, 0xc9, 0x84, 0xc5, 0xb7, 0xc6, + 0xb9, 0xc6, 0x90, 0xc7, 0x9f, 0xe2, 0xb1, 0xa5, 0xc5, 0x89, 0xc8, 0x8e, 0xc6, 0x8e, + 0xe1, 0x9b, 0x8e, 0xc8, 0xa6, 0xe1, 0x9a, 0xa4, 0xc5, 0xac, 0xc3, 0xa2, 0xc5, 0x9a, + 0x50, 0xc6, 0xa3, 0x44, 0xc6, 0x90, 0xc3, 0xae, 0x60, 0xc3, 0x8c, 0xc4, 0xb9, 0xc4, + 0x94, 0xc4, 0x9f, 0xc4, 0xa3, 0xc8, 0xb6, 0xc2, 0xa8, 0xc2, 0xa5, 0xc5, 0xb4, 0xe2, + 0xb1, 0xa2, 0x3a, 0xc7, 0xbd, 0x78, 0x78, 0xc3, 0xa9, 0xc2, 0xbc, 0xc4, 0xba, 0xc7, + 0x84, 0xc5, 0xb8, 0xe1, 0x9a, 0xaa, 0xe1, 0x9b, 0x83, 0xc3, 0x98, 0xc3, 0xb7, 0xc8, + 0x84, 0xcd, 0xbc, 0xcd, 0xba, 0xc4, 0xbe, 0xc2, 0xa9, 0xe1, 0x9a, 0xa0, 0xc5, 0xbd, + 0x5d, 0xc6, 0x92, 0xc8, 0xa0, 0x42, 0xc3, 0xb8, 0xe1, 0x9b, 0x8e, 0xc9, 0x89, 0xc2, + 0xb6, 0xc2, 0xb6, 0xc5, 0xbc, 0xc3, 0x88, 0xc5, 0x9b, 0xc8, 0xae, 0xc6, 0x98, 0xc7, + 0x9a, 0xc4, 0x82, 0xc6, 0x90, 0xc6, 0xa3, 0xc4, 0x98, 0xc9, 0x8f, 0xe1, 0x9a, 0xb1, + 0xe2, 0xb1, 0xbb, 0xc3, 0x97, 0xc8, 0xba, 0xc8, 0xab, 0xc7, 0xad, 0x4a, 0x3f, 0xe2, + 0xb1, 0xbb, 0xce, 0x8a, 0xc3, 0xa6, 0xc7, 0xbe, 0xc5, 0x8b, 0xe2, 0xb1, 0xbe, 0xc2, + 0xac, 0xc8, 0xbb, 0xc6, 0xb8, 0xc4, 0x8d, 0x5a, + ], + asset_base: [ + 0xf1, 0xfb, 0x77, 0xa6, 0xf4, 0x53, 0x77, 0x23, 0x9c, 0x47, 0x57, 0xff, 0xee, 0xe4, + 0xb2, 0x66, 0x42, 0x1b, 0xfc, 0x50, 0x00, 0xe3, 0x27, 0x68, 0x85, 0x5f, 0xa0, 0x6a, + 0x0f, 0x5d, 0xe2, 0x27, + ], + }, + TestVector { + key: [ + 0xbf, 0x39, 0x20, 0xce, 0x2e, 0x9e, 0x95, 0xb0, 0xee, 0xce, 0x13, 0x0a, 0x50, 0xba, + 0x7d, 0xcc, 0x6f, 0x26, 0x51, 0x2a, 0x9f, 0xc7, 0xb8, 0x04, 0xaf, 0xf0, 0x89, 0xf5, + 0x0c, 0xbc, 0xff, 0xf7, + ], + description: [ + 0x2d, 0xc4, 0x8b, 0xc5, 0xa1, 0xc2, 0xa3, 0xc6, 0x99, 0x41, 0xe2, 0xb1, 0xb6, 0x63, + 0x4a, 0xc5, 0xa5, 0xe2, 0xb1, 0xbe, 0xc2, 0xbe, 0xe1, 0x9b, 0x9a, 0xc7, 0xa1, 0xc3, + 0x85, 0xc7, 0xac, 0xc7, 0x99, 0xc3, 0x90, 0xc5, 0x98, 0xc7, 0x9d, 0xc6, 0x8d, 0xc8, + 0xad, 0xc8, 0xbe, 0x61, 0xc3, 0x9d, 0x55, 0x66, 0xc5, 0x89, 0xc6, 0x97, 0xc6, 0xb5, + 0xc3, 0xbe, 0xc4, 0x84, 0xc5, 0x96, 0xc3, 0x8c, 0xc7, 0xa5, 0xe1, 0x9b, 0x94, 0xc2, + 0xab, 0xc3, 0xbd, 0xc6, 0x95, 0x2b, 0xc8, 0x88, 0xc7, 0xa4, 0x68, 0xc8, 0xa5, 0xe1, + 0x9a, 0xbf, 0xc8, 0x84, 0xc4, 0x98, 0xc5, 0xa5, 0xe1, 0x9b, 0x8e, 0xe2, 0xb1, 0xba, + 0x28, 0xc6, 0xab, 0xc8, 0x93, 0xc7, 0xb5, 0xc2, 0xa1, 0xc5, 0x80, 0xc6, 0xb0, 0xc6, + 0x94, 0xc8, 0x84, 0xc2, 0xb7, 0xc5, 0x87, 0xe1, 0x9b, 0x9e, 0xc7, 0x93, 0x6c, 0xe1, + 0x9b, 0xa5, 0x41, 0x62, 0xcd, 0xb1, 0xc7, 0x94, 0xc8, 0xac, 0x3b, 0xc3, 0x95, 0xc4, + 0x83, 0xc6, 0xbb, 0xe2, 0xb1, 0xa2, 0xe1, 0x9a, 0xa6, 0xc9, 0x81, 0xe1, 0x9b, 0x85, + 0xe1, 0x9a, 0xa7, 0xe1, 0x9b, 0x8c, 0xc3, 0xac, 0xc3, 0xa5, 0xc3, 0x80, 0xc3, 0x9d, + 0xc3, 0x9f, 0xc3, 0x96, 0xc3, 0xbb, 0xe2, 0xb1, 0xb4, 0xc8, 0xb1, 0x3b, 0xc5, 0x82, + 0x49, 0xc4, 0x90, 0xc4, 0xbd, 0xc9, 0x81, 0x4e, 0xc5, 0x8e, 0xc4, 0x94, 0xc3, 0xa7, + 0xc9, 0x89, 0xc6, 0x90, 0xc5, 0x8e, 0x3e, 0xe1, 0x9b, 0x99, 0x63, 0xc8, 0xb5, 0xc6, + 0xab, 0x38, 0xc8, 0xaf, 0xc5, 0xad, 0xc8, 0x8e, 0xc5, 0xab, 0xcd, 0xb0, 0xc5, 0xa3, + 0xc3, 0xb7, 0xc7, 0x85, 0xc2, 0xa7, 0x6d, 0xc2, 0xb7, 0x2f, 0xc3, 0xbd, 0xc7, 0x83, + 0xc5, 0xbb, 0xc2, 0xbf, 0xe2, 0xb1, 0xb8, 0xc4, 0xbc, 0xe1, 0x9b, 0xa5, 0xc7, 0x8c, + 0x71, 0x3d, 0xc7, 0xa0, 0xc9, 0x89, 0xc5, 0xb1, 0xc5, 0xa8, 0xc4, 0xa1, 0x5a, 0xe1, + 0x9a, 0xa4, 0xc7, 0xa6, 0xc6, 0x95, 0xc4, 0x90, 0xc7, 0x90, 0xe1, 0x9b, 0x90, 0xc3, + 0x92, 0xe1, 0x9a, 0xbd, 0xc7, 0xb2, 0xc7, 0xa9, 0xc6, 0xbb, 0xc6, 0x83, 0x21, 0xc9, + 0x87, 0xc3, 0x94, 0xc4, 0xac, 0xc2, 0xbf, 0xc4, 0x88, 0xc2, 0xa4, 0xc4, 0xbe, 0xc4, + 0xb2, 0xcd, 0xb6, 0xe2, 0xb1, 0xaa, 0xc9, 0x85, 0xc3, 0x97, 0xc8, 0x80, 0x78, 0xc8, + 0x95, 0xc6, 0x9f, 0xe1, 0x9b, 0xab, 0xc5, 0x8a, 0xc9, 0x82, 0xc8, 0x9a, 0x59, 0xe2, + 0xb1, 0xa7, 0xe1, 0x9b, 0xa2, 0x67, 0xc6, 0xb4, 0xc9, 0x8f, 0xc8, 0xbf, 0xc8, 0x85, + 0xc8, 0xb6, 0xc5, 0x94, 0x68, 0xe1, 0x9a, 0xaf, 0xe2, 0xb1, 0xa6, 0xc8, 0xae, 0xc4, + 0x89, 0xe1, 0x9a, 0xa2, 0xc7, 0xb9, 0xc8, 0xa0, 0xc2, 0xaf, 0xc7, 0x90, 0xc4, 0xb0, + 0xc4, 0xa7, 0xc5, 0xba, 0xc9, 0x82, 0xc3, 0x91, 0xe1, 0x9a, 0xa3, 0xc4, 0x92, 0x54, + 0xe1, 0x9a, 0xaa, 0xe1, 0x9b, 0xa7, 0xe1, 0x9a, 0xac, 0xc4, 0xb5, 0xe1, 0x9b, 0x9c, + 0xc5, 0x91, 0xce, 0x8c, 0xc5, 0xb1, 0x78, 0x66, 0xc5, 0x99, 0xcd, 0xbe, 0xc6, 0xa7, + 0xe1, 0x9b, 0x9e, 0xe2, 0xb1, 0xa4, 0xc3, 0x8e, 0x47, 0xc3, 0xae, 0xce, 0x86, 0x69, + 0xc6, 0x8a, 0xc3, 0x8e, 0xe1, 0x9b, 0xad, 0xc9, 0x88, 0xe1, 0x9b, 0x96, 0x7c, 0xe1, + 0x9b, 0x95, 0xc7, 0xba, 0xc8, 0xab, 0xe1, 0x9b, 0x85, 0xc7, 0x94, 0xc3, 0xa6, 0xe1, + 0x9b, 0xaa, 0x6d, 0xe1, 0x9a, 0xaf, 0xc4, 0x90, 0x79, 0xc3, 0xb5, 0xe2, 0xb1, 0xae, + 0x59, 0xc8, 0xab, 0xc8, 0xb2, 0xc8, 0xad, 0xe2, 0xb1, 0xb5, 0x50, 0xc5, 0xaf, 0x52, + 0xc6, 0xa6, 0xe1, 0x9b, 0x8b, 0xe1, 0x9a, 0xa5, 0x52, 0xcd, 0xbd, 0xc3, 0x86, 0x38, + 0xc4, 0xae, 0xc9, 0x81, 0xc5, 0x96, 0xc6, 0x94, + ], + asset_base: [ + 0x10, 0xc3, 0x37, 0x4c, 0xc5, 0xd2, 0x6d, 0x14, 0xda, 0x3d, 0x1d, 0x41, 0x7e, 0x60, + 0x2c, 0x75, 0x2e, 0xfe, 0x36, 0x4f, 0x6c, 0x2f, 0x9e, 0xf3, 0x93, 0x39, 0x1d, 0x1b, + 0x48, 0xd3, 0x35, 0x2c, + ], + }, + TestVector { + key: [ + 0x2a, 0x15, 0xb5, 0xe8, 0x6e, 0xe7, 0x0e, 0xe6, 0xab, 0xfb, 0xca, 0x6b, 0x2f, 0x15, + 0x6d, 0x43, 0xf1, 0x85, 0x7d, 0xb5, 0xcb, 0x5e, 0x6d, 0xd6, 0xb7, 0x23, 0x17, 0x20, + 0x05, 0xfc, 0x2f, 0x83, + ], + description: [ + 0x2c, 0xc3, 0x8b, 0x50, 0xe1, 0x9a, 0xb0, 0xc8, 0x96, 0xc7, 0xaf, 0x31, 0xc3, 0x9e, + 0xc3, 0x95, 0xc9, 0x87, 0xe1, 0x9b, 0x9f, 0x52, 0xe1, 0x9b, 0x8b, 0xc2, 0xb2, 0xc7, + 0x98, 0xe1, 0x9b, 0x84, 0xc2, 0xa6, 0xc2, 0xaa, 0xc7, 0xaa, 0xc3, 0x80, 0xc7, 0x95, + 0xc3, 0x8e, 0xe2, 0xb1, 0xba, 0x36, 0xc3, 0xa7, 0xc4, 0xa7, 0xe1, 0x9b, 0x8f, 0xe1, + 0x9b, 0x85, 0xc5, 0x87, 0xc7, 0xbb, 0xc5, 0x85, 0xc5, 0x93, 0xc5, 0x9c, 0xc8, 0x92, + 0x6b, 0xe1, 0x9b, 0x96, 0x78, 0xcd, 0xbe, 0xc4, 0x9a, 0xc7, 0x92, 0xc3, 0xb1, 0xc8, + 0xa8, 0xc3, 0x8b, 0x46, 0xc7, 0x94, 0xc5, 0x81, 0xc7, 0xa0, 0xc4, 0xb9, 0x78, 0x49, + 0xc5, 0xbb, 0xc5, 0xb5, 0xc5, 0x86, 0xc5, 0xb7, 0xc7, 0xb9, 0xc4, 0x86, 0xc5, 0xae, + 0xc7, 0xb4, 0x37, 0xc4, 0x89, 0x47, 0xe1, 0x9b, 0x88, 0xc6, 0x9d, 0xc4, 0xa8, 0xe2, + 0xb1, 0xa4, 0xc3, 0x9f, 0x3e, 0xc5, 0xa7, 0xc8, 0xbe, 0x41, 0xc9, 0x8a, 0xe1, 0x9a, + 0xad, 0xc2, 0xba, 0xc3, 0xba, 0xc4, 0x8b, 0xc5, 0x9b, 0xc5, 0xa7, 0x7a, 0xcd, 0xb6, + 0xc8, 0xb5, 0xc7, 0xa0, 0xc4, 0x81, 0xe1, 0x9b, 0x98, 0xc3, 0xb3, 0x72, 0xe1, 0x9a, + 0xad, 0xc6, 0x85, 0xcd, 0xb0, 0xce, 0x89, 0xc8, 0x86, 0xc3, 0x90, 0xc6, 0x83, 0x51, + 0xc7, 0x80, 0xc3, 0x8c, 0xe2, 0xb1, 0xa3, 0xc9, 0x8f, 0xc3, 0x8c, 0xc5, 0xad, 0xc3, + 0x86, 0xe1, 0x9b, 0xa7, 0x54, 0xc3, 0xb0, 0xce, 0x85, 0xc3, 0xbc, 0xe2, 0xb1, 0xa3, + 0xc4, 0x9f, 0x76, 0xc3, 0x91, 0xc5, 0xa0, 0xc4, 0x8f, 0xc5, 0x91, 0xc4, 0xa3, 0x33, + 0xc6, 0x9d, 0xe1, 0x9b, 0x8c, 0xc3, 0xa6, 0xc3, 0xb8, 0xe1, 0x9a, 0xa5, 0xe2, 0xb1, + 0xac, 0xc7, 0x9b, 0xc5, 0xaf, 0xc4, 0xb0, 0xe1, 0x9a, 0xb4, 0x4f, 0xe2, 0xb1, 0xa6, + 0x4e, 0x5f, 0xc8, 0xbf, 0xc3, 0xb3, 0xe1, 0x9b, 0x9a, 0xe1, 0x9a, 0xa4, 0xc7, 0x89, + 0xc6, 0x88, 0xcd, 0xbb, 0xc3, 0xa0, 0xc3, 0xb3, 0xcd, 0xb2, 0xc3, 0xbb, 0xc6, 0xa0, + 0xe1, 0x9b, 0xab, 0xc3, 0xa1, 0xc7, 0x97, 0x32, 0xe1, 0x9b, 0xa5, 0xc7, 0xac, 0xc5, + 0x9c, 0xc8, 0xbf, 0xc4, 0xbc, 0xc4, 0x8a, 0x3a, 0x60, 0xc6, 0x81, 0xe1, 0x9b, 0x80, + 0xc4, 0x82, 0xce, 0x89, 0xe1, 0x9a, 0xa7, 0xe1, 0x9b, 0x9f, 0xc7, 0x92, 0xe2, 0xb1, + 0xa7, 0xe1, 0x9b, 0x82, 0xc7, 0x82, 0xe1, 0x9b, 0x91, 0xc6, 0xb5, 0x5e, 0xc7, 0xb0, + 0x3a, 0xc3, 0xa7, 0xce, 0x89, 0xe1, 0x9a, 0xbf, 0xc4, 0xbe, 0xc5, 0x9e, 0xc5, 0xb0, + 0xe2, 0xb1, 0xb6, 0xc9, 0x8f, 0xc8, 0x94, 0xc3, 0xbd, 0x6b, 0x4c, 0xc3, 0xad, 0xc8, + 0xb3, 0xc4, 0x99, 0xc3, 0xa5, 0xe2, 0xb1, 0xaf, 0xc4, 0x9d, 0x24, 0xc3, 0x91, 0xc5, + 0xa6, 0xc2, 0xaa, 0xe1, 0x9a, 0xb9, 0xc5, 0x9d, 0xc3, 0xab, 0xc5, 0xa3, 0xc6, 0xb6, + 0xe1, 0x9a, 0xac, 0x73, 0x7d, 0x4f, 0xe2, 0xb1, 0xb9, 0xc3, 0x8d, 0xc2, 0xa9, 0x57, + 0x2f, 0xc4, 0x99, 0xc7, 0xa6, 0xc6, 0xbb, 0xe2, 0xb1, 0xa5, 0xc3, 0xb7, 0x70, 0xc6, + 0x8c, 0xc6, 0xa9, 0xc7, 0xbf, 0xc2, 0xa7, 0xc3, 0xa2, 0xc2, 0xb0, 0xc8, 0x81, 0xc3, + 0x81, 0xe1, 0x9a, 0xba, 0xc5, 0x9c, 0xc4, 0x90, 0xc4, 0xa7, 0x71, 0xc8, 0xa9, 0xe1, + 0x9b, 0x9c, 0xe2, 0xb1, 0xab, 0x3e, 0x78, 0xc2, 0xb1, 0xc5, 0x88, 0xc4, 0xb1, 0xc7, + 0x9e, 0x38, 0xc8, 0xac, 0x71, 0xcd, 0xba, 0xc8, 0xba, 0x69, 0xc3, 0x8a, 0xcd, 0xbd, + 0xe1, 0x9b, 0xb0, 0xc8, 0x99, 0xc7, 0xbb, 0xc8, 0xb2, 0xc9, 0x8e, 0xc8, 0xac, 0xc2, + 0xa9, 0xc3, 0xb1, 0x3e, 0xc5, 0xbf, 0xc8, 0x8a, 0xe2, 0xb1, 0xaf, 0xc7, 0xaf, 0xc7, + 0x88, 0x5b, 0x4b, 0xe1, 0x9b, 0x87, 0x5a, 0x5a, + ], + asset_base: [ + 0x66, 0x9e, 0x20, 0x80, 0x8b, 0xa2, 0xa4, 0xd1, 0x31, 0xed, 0xeb, 0x7a, 0x39, 0x11, + 0xb1, 0xe1, 0x24, 0xd3, 0x77, 0x56, 0xd5, 0xb1, 0x3c, 0x61, 0xc6, 0x47, 0x73, 0x41, + 0xd2, 0x47, 0x57, 0xb6, + ], + }, + TestVector { + key: [ + 0x48, 0xbe, 0xf1, 0xc3, 0x4e, 0x8a, 0x86, 0x4c, 0x7e, 0xaa, 0x0c, 0x85, 0x31, 0x63, + 0x83, 0xc3, 0xf1, 0xc9, 0xb1, 0x87, 0xd5, 0x01, 0x74, 0xb4, 0x9a, 0xfe, 0xbd, 0x99, + 0xc3, 0xa1, 0xaf, 0xf9, + ], + description: [ + 0x5d, 0xc7, 0x88, 0xc2, 0xb9, 0x61, 0xc8, 0xb0, 0xc3, 0x98, 0xe2, 0xb1, 0xab, 0xc6, + 0xa9, 0xc8, 0xa7, 0xe2, 0xb1, 0xa9, 0xc5, 0xbb, 0x3a, 0x68, 0xc7, 0x83, 0xc8, 0xa1, + 0xc8, 0xbd, 0xc4, 0x9e, 0x6c, 0xc3, 0xab, 0xe1, 0x9b, 0xaf, 0xe1, 0x9b, 0x83, 0xc6, + 0xb7, 0xc2, 0xa4, 0xc4, 0x81, 0xc7, 0x9c, 0xc5, 0xb2, 0xe1, 0x9a, 0xaf, 0xe1, 0x9a, + 0xab, 0xc5, 0x88, 0xe1, 0x9a, 0xb0, 0xc6, 0xac, 0x63, 0xe1, 0x9b, 0xb0, 0xc7, 0xbe, + 0xc6, 0x8a, 0x3c, 0xc5, 0xb2, 0xc3, 0x89, 0xc2, 0xb0, 0x3d, 0xc2, 0xba, 0xe1, 0x9b, + 0x84, 0xc5, 0x8b, 0xe2, 0xb1, 0xb9, 0xc5, 0x91, 0x39, 0xc6, 0xb6, 0xc7, 0x9e, 0xc8, + 0x81, 0x74, 0xc7, 0xa8, 0xc8, 0xb0, 0xc2, 0xb6, 0xc4, 0x88, 0xc3, 0x9d, 0xc7, 0x89, + 0xc9, 0x8c, 0xc4, 0x85, 0xc3, 0x93, 0xc7, 0xaa, 0xc5, 0xb6, 0xc7, 0x9a, 0xc3, 0xae, + 0xe1, 0x9b, 0x81, 0xc3, 0x96, 0xc5, 0x80, 0xc5, 0x92, 0xc2, 0xa1, 0xc6, 0xa3, 0xe1, + 0x9a, 0xb7, 0xc2, 0xbf, 0xc5, 0xbb, 0xc7, 0xa9, 0xc7, 0x85, 0xc8, 0xbd, 0xc3, 0x8b, + 0xc7, 0xa6, 0xc3, 0xa0, 0xc6, 0x90, 0xe1, 0x9a, 0xb7, 0xc8, 0x88, 0xc4, 0x91, 0xc8, + 0x94, 0xc8, 0x9b, 0x6d, 0xc3, 0xa3, 0xc3, 0xb8, 0xc6, 0x88, 0xc5, 0xb1, 0x6e, 0xc7, + 0x87, 0x40, 0xc6, 0x8f, 0x7a, 0xc8, 0xa8, 0xc3, 0xb4, 0x46, 0xc3, 0xac, 0xc6, 0xa7, + 0xc6, 0x9c, 0xc8, 0x95, 0xc6, 0x87, 0xc6, 0x84, 0xc6, 0xb5, 0xc8, 0x97, 0xc3, 0xb8, + 0x69, 0x48, 0xe1, 0x9a, 0xaf, 0x53, 0xc4, 0xb8, 0xc3, 0x9c, 0xc4, 0xa8, 0xc5, 0xa6, + 0xc2, 0xbd, 0xc4, 0x92, 0xc2, 0xaf, 0xc2, 0xaf, 0xc4, 0xbb, 0xc7, 0x8c, 0xc3, 0xb9, + 0xc6, 0xb5, 0xc8, 0xa2, 0xc5, 0xb1, 0xc3, 0x81, 0xc6, 0x86, 0xc9, 0x8a, 0x4d, 0xc4, + 0xb8, 0xc4, 0xb4, 0xe1, 0x9a, 0xbf, 0xc2, 0xa2, 0xc4, 0x8d, 0xce, 0x87, 0xe2, 0xb1, + 0xbb, 0xe2, 0xb1, 0xa1, 0xc3, 0x87, 0xe1, 0x9a, 0xae, 0xc6, 0xb2, 0xc6, 0xa7, 0xc9, + 0x8d, 0xe1, 0x9b, 0xa8, 0xc4, 0x9a, 0xcd, 0xb1, 0xc5, 0x98, 0xc4, 0xbb, 0xc5, 0x95, + 0xc9, 0x8b, 0x61, 0xe2, 0xb1, 0xbf, 0xc3, 0xa6, 0xc5, 0xbd, 0xc4, 0x9c, 0xce, 0x85, + 0xe2, 0xb1, 0xa0, 0xc5, 0xbf, 0xc5, 0xbf, 0x34, 0xc7, 0x82, 0xcd, 0xb6, 0xe1, 0x9b, + 0x95, 0xc5, 0xaf, 0xc5, 0x98, 0xc8, 0x9f, 0xc2, 0xb8, 0xc4, 0xa5, 0xc5, 0xb8, 0xc4, + 0xad, 0xc8, 0xaf, 0xc6, 0x81, 0x6b, 0xc4, 0x8b, 0x55, 0xc7, 0xbe, 0xc3, 0xb4, 0xc6, + 0xa2, 0x62, 0xc8, 0xa0, 0xc3, 0x8d, 0xc3, 0xa8, 0x75, 0xc5, 0x90, 0xcd, 0xb1, 0x4d, + 0xc7, 0x9a, 0xc5, 0x87, 0xc5, 0xb5, 0xc6, 0x88, 0x25, 0xe2, 0xb1, 0xac, 0xc7, 0xa3, + 0xc9, 0x8d, 0xc8, 0x98, 0x6b, 0xc4, 0x9b, 0xc7, 0x90, 0xc8, 0x8e, 0xc8, 0x86, 0x36, + 0xe1, 0x9a, 0xaa, 0xc4, 0xa8, 0xe1, 0x9a, 0xa9, 0xc2, 0xb9, 0xe1, 0x9a, 0xb6, 0xc2, + 0xa8, 0xc2, 0xa4, 0xc3, 0x9a, 0xc3, 0x86, 0xc4, 0xb4, 0xc7, 0xa1, 0x53, 0xe2, 0xb1, + 0xa5, 0xc5, 0xa1, 0xe1, 0x9b, 0xa2, 0xc5, 0xaa, 0xc8, 0xa1, 0x2d, 0xc8, 0x96, 0x75, + 0xc2, 0xa6, 0xe1, 0x9b, 0x9b, 0xc6, 0xbb, 0xc9, 0x86, 0xc4, 0xa3, 0xc5, 0xb1, 0xe1, + 0x9b, 0x92, 0x39, 0x79, 0x5b, 0xc4, 0xbd, 0xe1, 0x9b, 0xa2, 0xe1, 0x9a, 0xa3, 0xc5, + 0xb6, 0xc8, 0x99, 0xc2, 0xb3, 0xe1, 0x9b, 0x8d, 0xc3, 0xbd, 0xc3, 0x86, 0xc4, 0x89, + 0xe2, 0xb1, 0xb2, 0xe1, 0x9b, 0xb0, 0x73, 0xe1, 0x9b, 0x9a, 0x34, 0xc4, 0x8a, 0x56, + 0xc2, 0xb5, 0xc4, 0xba, 0xe2, 0xb1, 0xa7, 0xc7, 0xa4, 0xcd, 0xbe, 0xe2, 0xb1, 0xb6, + 0xc8, 0xbc, 0xc8, 0x81, 0xc7, 0xac, 0xc8, 0x8e, + ], + asset_base: [ + 0x31, 0x1a, 0x81, 0xd9, 0x40, 0x52, 0x81, 0x50, 0xe5, 0xb4, 0x70, 0x97, 0x96, 0xb6, + 0x03, 0x22, 0x7a, 0xd1, 0xde, 0x1c, 0x15, 0x00, 0xef, 0x44, 0x5c, 0x40, 0xa4, 0xb2, + 0xaa, 0x21, 0xa1, 0x06, + ], + }, + TestVector { + key: [ + 0xff, 0x08, 0xec, 0x66, 0x3e, 0x18, 0x56, 0x51, 0x3f, 0xf6, 0x90, 0x80, 0x0c, 0x56, + 0x49, 0x91, 0xb2, 0x51, 0x67, 0xc2, 0xdd, 0x14, 0x07, 0x98, 0x13, 0x73, 0xc6, 0xd5, + 0x30, 0x65, 0xe3, 0x67, + ], + description: [ + 0xe1, 0x9b, 0x9e, 0xe1, 0x9a, 0xba, 0xc5, 0x9e, 0xe1, 0x9b, 0xa0, 0xc5, 0xbd, 0xe2, + 0xb1, 0xb8, 0xc8, 0x99, 0xc6, 0xb6, 0xc5, 0x9b, 0xc3, 0x83, 0xc2, 0xbd, 0xe1, 0x9a, + 0xbb, 0xe1, 0x9b, 0xa3, 0xc7, 0x8b, 0xc5, 0xb1, 0xc4, 0x9e, 0xe1, 0x9b, 0xa5, 0xe2, + 0xb1, 0xa5, 0xc8, 0xac, 0x58, 0xcd, 0xb2, 0xc6, 0x88, 0xc6, 0x85, 0xc7, 0x90, 0xc6, + 0x81, 0xe2, 0xb1, 0xb7, 0xc3, 0xb7, 0xc8, 0xb8, 0x7b, 0xe1, 0x9a, 0xb8, 0x64, 0xc4, + 0x85, 0x5f, 0xcd, 0xb3, 0xc8, 0xb1, 0xc9, 0x87, 0xc4, 0xbf, 0xc5, 0xbe, 0x2f, 0xe1, + 0x9b, 0x8c, 0xc7, 0xbc, 0xc5, 0xab, 0xe1, 0x9a, 0xb6, 0xe2, 0xb1, 0xa9, 0xc6, 0xb7, + 0xc4, 0x89, 0x63, 0xc3, 0xa5, 0xc2, 0xbf, 0xc6, 0x9b, 0x5c, 0xc5, 0x93, 0xc6, 0xb0, + 0xc4, 0xaa, 0xc8, 0xb3, 0xc8, 0x89, 0xc7, 0xbc, 0xc2, 0xa7, 0xc7, 0xa9, 0xc8, 0xb2, + 0xc7, 0xbd, 0xe1, 0x9b, 0xa5, 0xc5, 0xb5, 0xc4, 0x8e, 0xc9, 0x82, 0xc5, 0x84, 0xc6, + 0x86, 0xc3, 0x8f, 0xc4, 0x85, 0xc6, 0xa0, 0xc8, 0xa3, 0xc6, 0xa6, 0xe1, 0x9a, 0xa9, + 0xc5, 0x99, 0xc2, 0xa8, 0xc7, 0xbc, 0xe2, 0xb1, 0xbb, 0xc4, 0xa4, 0xc6, 0xb9, 0xc7, + 0x90, 0xc9, 0x8c, 0xc3, 0x80, 0xc7, 0x8f, 0xc5, 0x94, 0xc8, 0x88, 0xc9, 0x86, 0xc3, + 0xbd, 0xe2, 0xb1, 0xb1, 0xe2, 0xb1, 0xbe, 0x3c, 0xc6, 0x87, 0x7c, 0x6f, 0xc3, 0xbd, + 0xc6, 0x94, 0xc2, 0xa1, 0x7d, 0xc3, 0x87, 0xc2, 0xac, 0xcd, 0xb3, 0xc8, 0xa3, 0xc2, + 0xbb, 0x61, 0xc4, 0x97, 0xc9, 0x8d, 0x6c, 0xe2, 0xb1, 0xad, 0xc5, 0x8c, 0xc5, 0xa3, + 0xc2, 0xb2, 0xe2, 0xb1, 0xbf, 0xc5, 0xa2, 0xe1, 0x9b, 0x85, 0xc6, 0xb0, 0x78, 0xe1, + 0x9b, 0x80, 0xcd, 0xb6, 0xc5, 0x80, 0xc8, 0x99, 0xc2, 0xba, 0xc3, 0x96, 0xc6, 0x8c, + 0xc7, 0xaf, 0xc4, 0x97, 0xc3, 0x8b, 0xc4, 0xa4, 0xc6, 0xb0, 0xc7, 0x98, 0xc4, 0x8d, + 0x62, 0xc8, 0x8b, 0xc6, 0xaf, 0x4d, 0xc8, 0xb7, 0xc8, 0x8c, 0x5e, 0xc2, 0xab, 0xc4, + 0x86, 0xc5, 0xb1, 0x2c, 0xe2, 0xb1, 0xad, 0xe1, 0x9b, 0xa7, 0xc9, 0x8a, 0xc3, 0xb1, + 0xc3, 0xae, 0xc4, 0x98, 0xc7, 0xbe, 0xc5, 0x94, 0xc3, 0x8a, 0xce, 0x89, 0xcd, 0xbb, + 0xc6, 0xbc, 0xcd, 0xb1, 0xc4, 0x8a, 0xc5, 0x90, 0xc6, 0xa9, 0xe1, 0x9b, 0x85, 0xc9, + 0x8c, 0x63, 0xe1, 0x9a, 0xab, 0x57, 0xc3, 0xb7, 0xc6, 0xb9, 0xce, 0x86, 0xc4, 0xa7, + 0xc3, 0x80, 0xc8, 0xb6, 0xe1, 0x9b, 0x9c, 0xcd, 0xb6, 0xc3, 0xa3, 0xc4, 0x9c, 0xe2, + 0xb1, 0xa7, 0xc7, 0x88, 0xc4, 0xb6, 0xc8, 0x80, 0xe1, 0x9b, 0x95, 0x33, 0xc2, 0xb6, + 0xc6, 0x86, 0xc6, 0xae, 0xc6, 0x97, 0xc7, 0x9b, 0xc7, 0xbf, 0xc6, 0x95, 0xe1, 0x9b, + 0xab, 0xc5, 0x8b, 0x58, 0xc7, 0x9a, 0xc8, 0x81, 0xc2, 0xb2, 0xc3, 0x8a, 0xc9, 0x81, + 0xc6, 0x84, 0xc6, 0xb5, 0xc5, 0xa6, 0xc5, 0xaf, 0xc9, 0x8e, 0xc2, 0xbc, 0xc7, 0xb5, + 0xe1, 0x9b, 0x8b, 0xc8, 0x8c, 0xc9, 0x89, 0xe1, 0x9b, 0x91, 0xe1, 0x9a, 0xb8, 0x3b, + 0xc5, 0x88, 0xc2, 0xa5, 0xc8, 0xa0, 0xc4, 0x97, 0xe1, 0x9b, 0x8d, 0xc2, 0xa4, 0xc3, + 0x83, 0xc3, 0x9a, 0x4c, 0xe1, 0x9b, 0x80, 0xc4, 0xa5, 0xc3, 0xa9, 0xc9, 0x80, 0xc7, + 0xb3, 0xc7, 0xb4, 0xe1, 0x9b, 0x80, 0xe1, 0x9b, 0x8e, 0xc5, 0xb9, 0xc2, 0xb9, 0xc6, + 0xb7, 0xc8, 0xbc, 0xc5, 0xa6, 0xc4, 0x83, 0xe1, 0x9b, 0x80, 0xc8, 0x92, 0xc4, 0x94, + 0xe1, 0x9b, 0x8c, 0xc8, 0xbc, 0xc4, 0x8e, 0xe2, 0xb1, 0xb3, 0x38, 0xc8, 0x8d, 0xc9, + 0x8c, 0xc6, 0xbd, 0xc3, 0x90, 0xc6, 0xa9, 0xc3, 0xb6, 0x66, 0x38, 0xc8, 0x97, 0xe1, + 0x9a, 0xa1, 0xc8, 0xb2, 0xc5, 0xab, 0xc7, 0x99, + ], + asset_base: [ + 0x4f, 0x95, 0x9d, 0x88, 0x63, 0xb8, 0x36, 0x0b, 0x43, 0x30, 0x2b, 0xef, 0x35, 0x13, + 0x1f, 0x69, 0xd4, 0xf4, 0x26, 0xb1, 0x38, 0x3e, 0x54, 0xae, 0x38, 0x96, 0x40, 0x31, + 0xa8, 0xe5, 0xf9, 0x21, + ], + }, + TestVector { + key: [ + 0x39, 0xc4, 0x51, 0xf4, 0xd8, 0xdd, 0xcf, 0x69, 0x05, 0xed, 0xd8, 0x82, 0x5a, 0xd9, + 0x81, 0xb9, 0xe7, 0x3c, 0xa6, 0x83, 0x1c, 0xa2, 0xb3, 0xd7, 0xe8, 0xce, 0xf3, 0xd0, + 0xba, 0xaa, 0x31, 0x1b, + ], + description: [ + 0xc7, 0x94, 0xc5, 0xac, 0xc4, 0x97, 0xc6, 0xba, 0xe1, 0x9b, 0x97, 0xc7, 0x84, 0xc8, + 0xb6, 0xe1, 0x9b, 0x9d, 0xc8, 0x9c, 0xcd, 0xb5, 0xc3, 0x93, 0x7d, 0xc8, 0xa7, 0xc4, + 0x86, 0xc6, 0xab, 0xc4, 0x88, 0xe2, 0xb1, 0xb1, 0x6b, 0xe1, 0x9a, 0xa6, 0x68, 0xc6, + 0x9c, 0xc2, 0xb0, 0xc6, 0xba, 0xc7, 0xa6, 0xc5, 0x8c, 0xc9, 0x89, 0xc8, 0xbe, 0xc3, + 0xbc, 0xc5, 0xb7, 0xc7, 0x95, 0x5c, 0xc3, 0x96, 0xc4, 0x89, 0xc6, 0x84, 0xc3, 0xb2, + 0xc9, 0x87, 0x38, 0x45, 0xc3, 0xa1, 0xe2, 0xb1, 0xb1, 0x41, 0xc5, 0xac, 0xc6, 0xa1, + 0xc2, 0xa4, 0x34, 0xc4, 0xb0, 0xc2, 0xb5, 0xc5, 0xa2, 0xe1, 0x9a, 0xa9, 0xc4, 0xb6, + 0xc5, 0xbd, 0xc2, 0xbd, 0xc4, 0xa2, 0xc6, 0x8c, 0xc2, 0xb4, 0xc8, 0xb1, 0xc3, 0x95, + 0xc2, 0xbf, 0xc7, 0x99, 0xe1, 0x9b, 0x99, 0xc6, 0x8a, 0xc8, 0xaf, 0xc6, 0x9f, 0xc4, + 0x93, 0x38, 0xc7, 0x94, 0xc8, 0xa2, 0xc8, 0x84, 0xc6, 0x8f, 0x3a, 0xc5, 0xbd, 0xe1, + 0x9b, 0x97, 0xc5, 0x88, 0xcd, 0xb6, 0xc5, 0xa1, 0xc6, 0x96, 0xc4, 0x9f, 0xc3, 0x94, + 0xc5, 0xa6, 0xc4, 0xa4, 0xcd, 0xb2, 0xc7, 0xbc, 0xc8, 0x8d, 0x78, 0xc9, 0x86, 0xe2, + 0xb1, 0xab, 0xce, 0x84, 0xcd, 0xbd, 0xc4, 0x95, 0x65, 0xc7, 0x88, 0xc4, 0x84, 0xce, + 0x8c, 0xc3, 0xb1, 0xc2, 0xaf, 0xc6, 0xbf, 0xc4, 0x92, 0x25, 0xc7, 0xbc, 0xe2, 0xb1, + 0xb0, 0xc5, 0x93, 0xc7, 0x8a, 0xc5, 0x92, 0x75, 0xc4, 0xb7, 0xc6, 0x86, 0xc3, 0xbf, + 0xc7, 0xb7, 0xc6, 0xae, 0x67, 0xc2, 0xa9, 0xc6, 0x9e, 0xc5, 0x97, 0xcd, 0xb0, 0xc3, + 0x92, 0xc3, 0xac, 0xc5, 0xbb, 0xc3, 0x9a, 0xc3, 0xa1, 0xc6, 0x87, 0xc3, 0x8e, 0xc3, + 0xb8, 0xc9, 0x80, 0xe1, 0x9a, 0xa7, 0xc7, 0xac, 0x65, 0x24, 0xc6, 0x9c, 0xc3, 0xb2, + 0xc4, 0x82, 0x64, 0xc7, 0x8e, 0xc5, 0x8b, 0xe1, 0x9b, 0x8a, 0xe1, 0x9b, 0x89, 0xc9, + 0x82, 0xc3, 0x97, 0xc2, 0xac, 0xc4, 0x80, 0xc6, 0x83, 0xc4, 0xa6, 0xc4, 0xb6, 0xce, + 0x89, 0x52, 0x59, 0xce, 0x85, 0xc9, 0x85, 0xc6, 0xa9, 0xc4, 0x80, 0xc9, 0x8b, 0xe1, + 0x9a, 0xbe, 0xc9, 0x8e, 0xc2, 0xae, 0xc8, 0x96, 0xc6, 0x95, 0xc8, 0xaa, 0xe1, 0x9b, + 0x9b, 0xe1, 0x9a, 0xac, 0xc2, 0xb1, 0xc2, 0xaf, 0xc8, 0x8e, 0xe1, 0x9a, 0xae, 0xe1, + 0x9a, 0xa7, 0xc4, 0xb7, 0xc8, 0x82, 0xc3, 0xb2, 0xc4, 0xab, 0xc4, 0xbf, 0xc7, 0x91, + 0xe1, 0x9b, 0x9b, 0xc8, 0x90, 0xc7, 0x93, 0xe1, 0x9b, 0xa3, 0xc7, 0xb5, 0xc5, 0xa0, + 0xc8, 0xa2, 0xc8, 0x86, 0xc9, 0x86, 0xc2, 0xaa, 0x3d, 0xc4, 0xbf, 0xc5, 0xbc, 0xc4, + 0x96, 0xc3, 0xa5, 0xc3, 0x90, 0xc5, 0xb9, 0xc3, 0xa8, 0xc7, 0x80, 0xc5, 0x84, 0xce, + 0x89, 0xcd, 0xb7, 0xc3, 0x9b, 0xc2, 0xa1, 0xc7, 0x87, 0xcd, 0xb3, 0xe2, 0xb1, 0xb0, + 0xc8, 0x8b, 0xe1, 0x9a, 0xb1, 0xe1, 0x9a, 0xaf, 0x35, 0xc3, 0xa9, 0xc7, 0x85, 0xc4, + 0x85, 0xcd, 0xb1, 0xc4, 0xa7, 0xc3, 0x83, 0xe1, 0x9b, 0x94, 0xe2, 0xb1, 0xbf, 0xc4, + 0x80, 0x29, 0x2a, 0xc3, 0xa2, 0xe1, 0x9b, 0x88, 0xc3, 0x87, 0xe1, 0x9a, 0xb0, 0xc2, + 0xb8, 0xc7, 0x85, 0xc8, 0xb3, 0xc5, 0x84, 0x63, 0xc5, 0x8d, 0x3b, 0xc8, 0x9f, 0x5e, + 0xe2, 0xb1, 0xa5, 0x5c, 0xc4, 0x9f, 0xc8, 0xb4, 0xe2, 0xb1, 0xa0, 0xc7, 0xa5, 0x37, + 0xc6, 0xa2, 0xc8, 0xad, 0xe1, 0x9b, 0xa3, 0xc8, 0x96, 0xc6, 0xb6, 0xe2, 0xb1, 0xa4, + 0xc2, 0xb7, 0xc3, 0x86, 0xc4, 0xb1, 0xc6, 0x9f, 0xc8, 0x8c, 0xc8, 0xb3, 0xe1, 0x9a, + 0xa6, 0xc7, 0xa2, 0xc3, 0xbd, 0xe1, 0x9b, 0x8e, 0xc3, 0x9d, 0x21, 0xe1, 0x9b, 0xa5, + 0xe1, 0x9b, 0x8a, 0xc8, 0xb2, 0x24, 0xc8, 0x91, + ], + asset_base: [ + 0x2c, 0x25, 0xd3, 0x35, 0xaf, 0xa2, 0xd5, 0x69, 0x72, 0x42, 0xf6, 0x18, 0x5c, 0x00, + 0x69, 0xd7, 0x9b, 0x33, 0xc8, 0x4a, 0x3f, 0x7f, 0x5c, 0x3c, 0x26, 0x5d, 0x3e, 0x88, + 0x45, 0xac, 0xcd, 0x0e, + ], + }, + TestVector { + key: [ + 0xa2, 0x8d, 0x36, 0xc0, 0xa0, 0xe1, 0xd6, 0x54, 0x57, 0x44, 0x64, 0xec, 0x5e, 0x0c, + 0x8d, 0x87, 0x85, 0x6e, 0xb9, 0xdf, 0xd2, 0x1d, 0x4d, 0xa2, 0xb9, 0xea, 0x34, 0xfd, + 0xe7, 0x3b, 0x19, 0x42, + ], + description: [ + 0xc8, 0x96, 0xcd, 0xba, 0xc7, 0x94, 0x32, 0xc5, 0xbf, 0xc7, 0x9c, 0xc3, 0x94, 0xc5, + 0x97, 0xc7, 0x84, 0xc2, 0xb1, 0xc3, 0xa9, 0x25, 0xc2, 0xb6, 0xc7, 0x84, 0xce, 0x84, + 0xc7, 0x8d, 0xc8, 0xb3, 0xe1, 0x9a, 0xa3, 0xc3, 0xb1, 0xe1, 0x9a, 0xa4, 0xc7, 0xa6, + 0xc2, 0xa6, 0xe1, 0x9a, 0xb5, 0xc8, 0x97, 0x3f, 0xc7, 0x90, 0x55, 0xc3, 0x97, 0xc5, + 0xb6, 0xc5, 0xa3, 0xc7, 0x98, 0xc7, 0xba, 0xc7, 0xa7, 0xc8, 0x89, 0xc3, 0x80, 0xe2, + 0xb1, 0xb8, 0xc7, 0x8c, 0xc6, 0xa2, 0xc5, 0xb2, 0xc6, 0x90, 0xc4, 0x8f, 0xc4, 0x84, + 0xc7, 0xa3, 0xc2, 0xbd, 0x48, 0xc3, 0x97, 0xc7, 0x8b, 0xc7, 0x85, 0xc5, 0x83, 0xc7, + 0xb9, 0xe1, 0x9b, 0x96, 0xc8, 0x90, 0xc3, 0xbd, 0xe1, 0x9b, 0x99, 0xc8, 0x9b, 0xcd, + 0xb5, 0x28, 0xe1, 0x9b, 0xaa, 0xc5, 0x9a, 0xc6, 0xb7, 0x39, 0x75, 0x25, 0xc7, 0xb8, + 0xc5, 0xaa, 0xc8, 0xa5, 0xc5, 0xb3, 0xc7, 0x96, 0xc3, 0x8c, 0xc5, 0x87, 0x72, 0xe1, + 0x9a, 0xab, 0x72, 0xc9, 0x8b, 0xc3, 0xb0, 0xc8, 0x96, 0xc3, 0xb2, 0xc3, 0x82, 0x52, + 0x78, 0x68, 0x4d, 0xc5, 0x9e, 0xc5, 0x80, 0xe1, 0x9b, 0x84, 0xe2, 0xb1, 0xa6, 0xc6, + 0x8d, 0x51, 0xc8, 0xbe, 0xe1, 0x9b, 0x8d, 0xc2, 0xbc, 0xc6, 0xa8, 0xc7, 0x93, 0xc8, + 0x90, 0xc5, 0x99, 0x28, 0x6e, 0xc8, 0x95, 0x78, 0xe1, 0x9b, 0x83, 0xc4, 0xbe, 0xc8, + 0xb5, 0xc5, 0x80, 0x67, 0xc3, 0x9b, 0xe1, 0x9b, 0x89, 0xc5, 0x8c, 0x75, 0xc4, 0xb7, + 0xe1, 0x9b, 0x87, 0x47, 0xc3, 0xa9, 0xc5, 0x95, 0xc4, 0x93, 0xc3, 0x9d, 0xe1, 0x9b, + 0x82, 0xc7, 0x95, 0xc5, 0x84, 0xc5, 0x91, 0xe1, 0x9a, 0xa2, 0xc3, 0x95, 0xcd, 0xb6, + 0xe2, 0xb1, 0xbd, 0xc5, 0x91, 0xc4, 0xbb, 0xc7, 0x8a, 0xc7, 0xaa, 0xc8, 0xb3, 0xe1, + 0x9b, 0xa6, 0x5d, 0xcd, 0xb2, 0xc5, 0xab, 0xc4, 0xa0, 0x5b, 0xc2, 0xbe, 0x37, 0x60, + 0xc5, 0x8a, 0xe1, 0x9a, 0xbb, 0xc9, 0x82, 0xc5, 0xbd, 0xe1, 0x9b, 0xa0, 0xc3, 0x80, + 0xc7, 0xb0, 0xc7, 0xa7, 0xe1, 0x9b, 0xaf, 0x70, 0xc5, 0x98, 0xc4, 0x80, 0x5b, 0xc2, + 0xb1, 0xe2, 0xb1, 0xab, 0xc3, 0x8b, 0xc4, 0xa3, 0x2f, 0xc6, 0x9a, 0xc5, 0x84, 0x63, + 0xc3, 0xaf, 0xc3, 0x87, 0xe1, 0x9b, 0xa0, 0xc3, 0x82, 0x73, 0xc4, 0x98, 0xe1, 0x9b, + 0x91, 0xe1, 0x9a, 0xac, 0x76, 0xc9, 0x87, 0xc7, 0xa8, 0xc4, 0x90, 0xc2, 0xb1, 0x2e, + 0x4b, 0xc8, 0x8b, 0x58, 0xc8, 0xb1, 0xe1, 0x9a, 0xbf, 0xc8, 0xa2, 0xc6, 0x9f, 0xc4, + 0xab, 0xc4, 0xbf, 0xe1, 0x9b, 0x86, 0xe1, 0x9b, 0xa8, 0xce, 0x8c, 0xc5, 0xab, 0xc3, + 0x85, 0x75, 0xc3, 0xa7, 0xc7, 0xbc, 0xc7, 0xa5, 0xe2, 0xb1, 0xba, 0xc5, 0xad, 0x6b, + 0xc8, 0xbc, 0xc6, 0xb0, 0xc5, 0xa0, 0xc4, 0x8f, 0xc7, 0xbd, 0xe1, 0x9a, 0xa2, 0xc5, + 0x90, 0xc6, 0xa2, 0xc9, 0x84, 0xc6, 0xab, 0xc7, 0xb2, 0x7c, 0xc5, 0x86, 0x40, 0x3b, + 0xc3, 0x8f, 0xe1, 0x9a, 0xb4, 0xe2, 0xb1, 0xae, 0xc2, 0xb0, 0xc5, 0x90, 0xe2, 0xb1, + 0xad, 0xc3, 0x85, 0xcd, 0xba, 0xc3, 0x9d, 0xe1, 0x9b, 0xab, 0xe1, 0x9a, 0xbd, 0xc6, + 0xb8, 0xc6, 0xab, 0xc3, 0xb0, 0xc9, 0x87, 0xc5, 0xb0, 0xc2, 0xaa, 0xc8, 0x99, 0xc6, + 0x80, 0xc9, 0x84, 0xc4, 0xb6, 0xe1, 0x9b, 0x82, 0xc6, 0xa9, 0xc5, 0xac, 0x76, 0xce, + 0x85, 0xc6, 0xa9, 0xe1, 0x9b, 0xa5, 0xc3, 0xac, 0xc4, 0xa0, 0xe1, 0x9a, 0xa7, 0xc2, + 0xae, 0xc3, 0xb2, 0xc3, 0x83, 0xc6, 0xaa, 0xc5, 0x88, 0xe1, 0x9a, 0xab, 0xc4, 0x81, + 0xc4, 0x98, 0xc4, 0xa3, 0x62, 0x7d, 0xc6, 0x84, 0xc8, 0x85, 0xc5, 0x96, 0xc4, 0xad, + 0xe2, 0xb1, 0xbd, 0x34, 0xc6, 0x9c, 0x5a, 0x5a, + ], + asset_base: [ + 0x19, 0x8f, 0x36, 0xf8, 0x2b, 0xca, 0x02, 0x8c, 0x9f, 0x8d, 0x8d, 0x20, 0x9f, 0x4c, + 0x4a, 0xf6, 0xd1, 0x44, 0x90, 0x5e, 0xbb, 0x17, 0xda, 0xf4, 0x15, 0xd3, 0x1d, 0x4a, + 0xf3, 0x7c, 0x46, 0x2e, + ], + }, + TestVector { + key: [ + 0x28, 0x37, 0xcd, 0x45, 0x6e, 0x33, 0x19, 0x9f, 0x05, 0xb5, 0xd9, 0x0a, 0x42, 0xa7, + 0xb3, 0xd7, 0x13, 0xac, 0xd4, 0xec, 0xe6, 0xfe, 0x32, 0xdf, 0x77, 0xcb, 0x17, 0x00, + 0x43, 0xa2, 0xfa, 0xc6, + ], + description: [ + 0xc2, 0xb0, 0x5d, 0x32, 0xc3, 0x9a, 0xc3, 0x98, 0xc4, 0x88, 0xc5, 0x8f, 0xc4, 0xa4, + 0xc3, 0x81, 0xc7, 0x91, 0xe1, 0x9b, 0x9e, 0xc8, 0x9e, 0xc4, 0x86, 0xe1, 0x9b, 0xa6, + 0xc8, 0x89, 0xc8, 0x84, 0xce, 0x8c, 0xc9, 0x83, 0xe2, 0xb1, 0xac, 0xcd, 0xb2, 0xc3, + 0xb8, 0xc8, 0x81, 0x65, 0xc3, 0x82, 0xc3, 0x93, 0xc4, 0x81, 0x7e, 0xe1, 0x9a, 0xb0, + 0xc5, 0x82, 0xc9, 0x8f, 0xc4, 0xb9, 0xc3, 0xbe, 0xc8, 0x8d, 0xc7, 0xab, 0xce, 0x8c, + 0xe1, 0x9a, 0xb5, 0xc7, 0x8d, 0xc7, 0x87, 0xc7, 0xba, 0xc6, 0xa2, 0xc4, 0xa3, 0xc7, + 0x93, 0xc8, 0xa8, 0xc3, 0x90, 0xc2, 0xaa, 0x5f, 0xc7, 0xbb, 0xc3, 0xad, 0xe1, 0x9a, + 0xa1, 0xc8, 0xa7, 0xc3, 0xaa, 0x7e, 0xc3, 0xaa, 0xe2, 0xb1, 0xa0, 0xcd, 0xb1, 0xc4, + 0xa9, 0xc5, 0x98, 0x75, 0xc8, 0xa3, 0x5b, 0x2c, 0x44, 0xe2, 0xb1, 0xb4, 0xc6, 0x92, + 0xc3, 0x95, 0xc5, 0x8e, 0xc8, 0xa6, 0xc8, 0xb8, 0xc9, 0x82, 0xc7, 0x87, 0xc5, 0xa7, + 0xc8, 0x9f, 0x50, 0xc5, 0x9b, 0xc4, 0x9e, 0x56, 0x7c, 0xc5, 0xba, 0xc3, 0x85, 0xe1, + 0x9b, 0x8d, 0xe1, 0x9a, 0xbf, 0xc7, 0xaf, 0xc4, 0x89, 0xe1, 0x9b, 0x9e, 0xe1, 0x9b, + 0x95, 0xc8, 0xa8, 0xc6, 0xad, 0xe1, 0x9b, 0x80, 0xc7, 0x8d, 0x31, 0xc5, 0x83, 0xcd, + 0xb7, 0xc4, 0x9f, 0xc3, 0xa8, 0xc6, 0xa0, 0xe1, 0x9a, 0xa9, 0xc6, 0x8a, 0xc4, 0x9f, + 0x57, 0xc8, 0xaf, 0xc7, 0xa7, 0xe1, 0x9b, 0x9f, 0xc6, 0x88, 0xc8, 0xa4, 0xe2, 0xb1, + 0xbd, 0x3d, 0xc4, 0x83, 0xe1, 0x9b, 0xa1, 0x59, 0xe1, 0x9b, 0x94, 0x7c, 0x2b, 0xe1, + 0x9b, 0x86, 0xe1, 0x9a, 0xbb, 0xc7, 0xb7, 0xc9, 0x86, 0xc7, 0x9e, 0xc5, 0x82, 0xe2, + 0xb1, 0xb7, 0xc3, 0x98, 0xc5, 0xb9, 0xc3, 0xbe, 0xe1, 0x9b, 0x93, 0xc9, 0x87, 0xc7, + 0x92, 0xc9, 0x83, 0xc8, 0x8e, 0x30, 0xe1, 0x9b, 0x98, 0xc5, 0xba, 0xc6, 0x8a, 0x39, + 0x59, 0xc5, 0x96, 0xc4, 0x9f, 0xc7, 0x82, 0xe1, 0x9a, 0xb4, 0xc9, 0x8b, 0xc5, 0xbc, + 0xc3, 0xa6, 0xc8, 0x95, 0xc6, 0xa1, 0xc4, 0xba, 0xc6, 0xb0, 0xc5, 0xba, 0x7b, 0xc4, + 0x85, 0xc5, 0xb7, 0xc4, 0x85, 0xc7, 0x93, 0xc3, 0x8d, 0xc5, 0x85, 0xc7, 0xad, 0xc5, + 0x9e, 0xc4, 0xbc, 0xc2, 0xa4, 0xe1, 0x9b, 0x87, 0xc2, 0xab, 0xc8, 0xb1, 0xc6, 0x87, + 0x77, 0xc6, 0xb8, 0xc5, 0x85, 0xc4, 0x8c, 0xc7, 0xa3, 0xc3, 0x85, 0xc2, 0xb8, 0x42, + 0xc7, 0xa7, 0xce, 0x88, 0xe1, 0x9a, 0xaa, 0xe2, 0xb1, 0xa3, 0xe1, 0x9b, 0x9d, 0xe1, + 0x9b, 0xa6, 0xc6, 0xa4, 0xc7, 0x87, 0xc6, 0x81, 0xc4, 0x84, 0xc4, 0xae, 0xc9, 0x86, + 0xe2, 0xb1, 0xa8, 0xc2, 0xbc, 0xc4, 0x93, 0xe1, 0x9b, 0x88, 0xc7, 0x81, 0xc2, 0xa3, + 0xc4, 0xbf, 0xc7, 0x9d, 0xe1, 0x9b, 0x93, 0xe1, 0x9b, 0xa1, 0xe1, 0x9a, 0xb1, 0xc8, + 0xb3, 0xc2, 0xb9, 0xe1, 0x9b, 0x9c, 0x37, 0x64, 0xc3, 0xbf, 0xe2, 0xb1, 0xb0, 0x42, + 0xc8, 0xae, 0x7e, 0xc7, 0x92, 0xc4, 0xbd, 0xc6, 0x98, 0xc3, 0xab, 0xc3, 0x9d, 0xc4, + 0xa4, 0xc5, 0x99, 0xc5, 0x84, 0xc3, 0xba, 0xc7, 0xa0, 0xc6, 0x92, 0xc8, 0xad, 0xc5, + 0xb8, 0xc4, 0xb6, 0xc7, 0x90, 0xc6, 0xa3, 0xc3, 0xab, 0xc3, 0x95, 0xc4, 0x91, 0xce, + 0x84, 0x30, 0xc4, 0xb5, 0xc7, 0x9a, 0xc6, 0x92, 0xc2, 0xba, 0xc3, 0x9e, 0xc7, 0x99, + 0xc4, 0x8d, 0xc3, 0x85, 0xc6, 0x87, 0xc7, 0x86, 0xc6, 0x82, 0xc6, 0x8a, 0x26, 0xc4, + 0x8b, 0xc4, 0xbe, 0x7c, 0x58, 0xc8, 0xa6, 0xc4, 0xab, 0xc4, 0xbe, 0xce, 0x8a, 0xc4, + 0xb7, 0xc3, 0xb9, 0xc5, 0x94, 0xe1, 0x9b, 0x9a, 0xc8, 0xbf, 0xc7, 0xa6, 0xc5, 0xbd, + 0xc4, 0xa8, 0xc5, 0x8f, 0xc5, 0xa3, 0xcd, 0xb4, + ], + asset_base: [ + 0x9a, 0xcc, 0xb2, 0xc5, 0xad, 0xae, 0x30, 0xab, 0xdb, 0x76, 0x58, 0x9d, 0xec, 0xdd, + 0x71, 0xe4, 0x65, 0x75, 0x53, 0x8d, 0x80, 0x3c, 0x28, 0xd7, 0xe4, 0xb8, 0x89, 0x6a, + 0xd7, 0xfd, 0xc6, 0x87, + ], + }, + TestVector { + key: [ + 0x0a, 0xbb, 0x5f, 0xa5, 0xab, 0x94, 0x0d, 0x29, 0x57, 0x4b, 0x95, 0x15, 0x9c, 0x40, + 0xbd, 0x79, 0x43, 0x44, 0xea, 0x07, 0xa8, 0x7e, 0x0f, 0x0f, 0x5f, 0xac, 0xa5, 0xb4, + 0x31, 0x81, 0x6d, 0xe2, + ], + description: [ + 0xcd, 0xbd, 0xe1, 0x9a, 0xb4, 0xc8, 0x9c, 0xc8, 0x96, 0xc6, 0xaa, 0xce, 0x88, 0xe1, + 0x9a, 0xb4, 0x2d, 0xc6, 0x81, 0xc7, 0x86, 0xc7, 0x9d, 0xc5, 0x86, 0xc4, 0x84, 0xe1, + 0x9b, 0x9e, 0xc6, 0x91, 0xe1, 0x9b, 0x89, 0x2d, 0xc4, 0x81, 0xc6, 0x88, 0x4c, 0xc2, + 0xbf, 0xc2, 0xaa, 0xc3, 0xb4, 0xc8, 0xae, 0xc7, 0x91, 0xc2, 0xb0, 0xc5, 0xa5, 0xc6, + 0xa3, 0xc4, 0x94, 0x38, 0xe1, 0x9a, 0xa9, 0xc4, 0xbe, 0xc3, 0x81, 0xe2, 0xb1, 0xba, + 0xc5, 0xa7, 0x44, 0xc3, 0xbb, 0xc8, 0x97, 0x5b, 0xc6, 0xbd, 0xc5, 0x9b, 0xe2, 0xb1, + 0xa0, 0xe1, 0x9a, 0xbd, 0xc2, 0xbf, 0xc3, 0x94, 0xc2, 0xb0, 0xc4, 0x9c, 0xc6, 0xa1, + 0xc3, 0xb6, 0xc2, 0xac, 0xe1, 0x9a, 0xa9, 0xc6, 0x90, 0x5c, 0xe2, 0xb1, 0xb2, 0x7c, + 0xc3, 0x86, 0x57, 0xe1, 0x9a, 0xa4, 0x71, 0xc7, 0x91, 0xe2, 0xb1, 0xbc, 0xc7, 0xab, + 0xc4, 0x86, 0xc5, 0xa1, 0xc5, 0x92, 0xc6, 0xa9, 0x78, 0x7a, 0xcd, 0xbd, 0xc4, 0xb2, + 0x75, 0xc8, 0xa4, 0x29, 0xc6, 0x9e, 0xc7, 0xa0, 0xc7, 0xa8, 0xc3, 0xa5, 0xc4, 0xb6, + 0xe1, 0x9b, 0x9d, 0x45, 0xc3, 0xa1, 0xc9, 0x8b, 0xc3, 0xbb, 0xc8, 0x86, 0xc7, 0x83, + 0xe1, 0x9b, 0x93, 0xc8, 0x9c, 0xc5, 0xba, 0xc7, 0xa8, 0xc7, 0x8d, 0xe1, 0x9a, 0xbf, + 0xcd, 0xb7, 0xc5, 0x91, 0xc4, 0x8f, 0x65, 0xc3, 0xa4, 0xc2, 0xb4, 0xe2, 0xb1, 0xb0, + 0xc8, 0xa9, 0xc8, 0xb1, 0xe1, 0x9b, 0x86, 0xc8, 0x85, 0xc4, 0x8d, 0xe1, 0x9a, 0xaf, + 0xe1, 0x9b, 0x81, 0xc3, 0xae, 0xc4, 0x90, 0xc8, 0xbb, 0x2a, 0xe1, 0x9a, 0xae, 0xc6, + 0xa3, 0xc4, 0xae, 0xc4, 0x93, 0x7b, 0xc7, 0x8e, 0xc8, 0x9c, 0xc3, 0xa3, 0xc5, 0xac, + 0xcd, 0xb7, 0x41, 0xc5, 0xb5, 0xc4, 0x95, 0xc3, 0x92, 0xc6, 0xaa, 0xe1, 0x9b, 0x83, + 0xe2, 0xb1, 0xb2, 0xe1, 0x9a, 0xbc, 0xc7, 0x87, 0xc7, 0xb7, 0xc5, 0x97, 0xc2, 0xb9, + 0x55, 0xe1, 0x9b, 0x91, 0x45, 0xc8, 0x8b, 0xe1, 0x9a, 0xa9, 0xe1, 0x9a, 0xad, 0xc6, + 0xab, 0xcd, 0xbd, 0xc8, 0xa2, 0xc3, 0x8c, 0x23, 0xe2, 0xb1, 0xa9, 0xe1, 0x9b, 0x8c, + 0xe1, 0x9a, 0xb7, 0xc6, 0x84, 0xc3, 0xa6, 0xc8, 0xb2, 0xc5, 0xbe, 0xc7, 0xbe, 0xe1, + 0x9a, 0xaa, 0xc3, 0xb1, 0xc6, 0xb3, 0xe1, 0x9a, 0xbe, 0xc4, 0xa0, 0xc2, 0xb9, 0x37, + 0xc5, 0x82, 0xc5, 0xbf, 0xc8, 0xa9, 0x44, 0xe1, 0x9b, 0x8d, 0xe1, 0x9b, 0x9c, 0xe1, + 0x9b, 0xa6, 0xe1, 0x9b, 0x87, 0xe2, 0xb1, 0xaa, 0xc7, 0xab, 0xc7, 0xaf, 0xc7, 0x91, + 0xe2, 0xb1, 0xbf, 0xe1, 0x9a, 0xb9, 0xe1, 0x9b, 0x87, 0xc6, 0xb6, 0xc5, 0xa3, 0xc7, + 0x98, 0xc5, 0x90, 0xc8, 0x9b, 0xcd, 0xb2, 0xc4, 0x97, 0x7b, 0xe1, 0x9b, 0x96, 0xc3, + 0xa2, 0x6e, 0xc8, 0x90, 0x6f, 0xc6, 0x9e, 0xc9, 0x87, 0x6e, 0xc8, 0x82, 0xc4, 0x97, + 0xc3, 0xb0, 0xc4, 0x8d, 0xe2, 0xb1, 0xb6, 0xc7, 0x9b, 0xc3, 0x9a, 0xc8, 0xb5, 0xc6, + 0x95, 0xc3, 0xb6, 0x44, 0xc3, 0xac, 0xc5, 0x90, 0xe1, 0x9b, 0xa0, 0xc8, 0x92, 0x5d, + 0xc5, 0xad, 0xe1, 0x9b, 0xab, 0x7b, 0xc4, 0x97, 0xc7, 0xac, 0xe1, 0x9a, 0xb2, 0x2e, + 0xc3, 0xa8, 0xc6, 0xbc, 0x40, 0x23, 0xc6, 0xbf, 0x55, 0xc6, 0x82, 0xc7, 0x8a, 0x65, + 0xe1, 0x9b, 0x9b, 0xc3, 0xbc, 0xe2, 0xb1, 0xbd, 0x4b, 0xe2, 0xb1, 0xa7, 0xc6, 0x8d, + 0xc7, 0xae, 0xc3, 0x83, 0xc7, 0xb9, 0x64, 0xc6, 0xa6, 0xc8, 0x82, 0xc8, 0x9d, 0xc8, + 0x9f, 0xc8, 0xb2, 0xc6, 0x8c, 0xe2, 0xb1, 0xb8, 0xe1, 0x9b, 0xab, 0xc7, 0x9d, 0xc8, + 0xb5, 0xc5, 0xab, 0xcd, 0xba, 0x45, 0xe1, 0x9a, 0xab, 0xc3, 0x93, 0x37, 0xc2, 0xb8, + 0xc9, 0x8d, 0xc9, 0x88, 0xe1, 0x9b, 0x93, 0x5a, + ], + asset_base: [ + 0x1a, 0x28, 0x12, 0x59, 0x8b, 0xa7, 0x5c, 0x9a, 0x69, 0x2e, 0x69, 0x19, 0x65, 0x7f, + 0x68, 0x3e, 0xa4, 0x52, 0xe1, 0xae, 0x66, 0x33, 0xba, 0xcf, 0xe1, 0xf4, 0x54, 0x55, + 0x04, 0xc2, 0x95, 0xb4, + ], + }, + TestVector { + key: [ + 0x07, 0x82, 0x6a, 0x86, 0xb1, 0x72, 0xc5, 0x5a, 0x66, 0x40, 0x1e, 0x37, 0xfc, 0x69, + 0xf9, 0x2e, 0x6d, 0x62, 0xa0, 0x14, 0x6c, 0x67, 0x06, 0x29, 0xa2, 0xd6, 0x51, 0x34, + 0xdf, 0x3b, 0x22, 0xf6, + ], + description: [ + 0xc6, 0xbe, 0xc3, 0x90, 0xc3, 0x92, 0xc4, 0x97, 0x7e, 0xc6, 0x81, 0x34, 0xe1, 0x9b, + 0x86, 0xc8, 0x8e, 0x7e, 0xcd, 0xb4, 0xc6, 0x90, 0x7b, 0xc4, 0xae, 0xc7, 0x8a, 0xcd, + 0xbd, 0xc5, 0x98, 0xc5, 0xa2, 0xc2, 0xb7, 0x6a, 0xc5, 0x82, 0xc5, 0xac, 0xc2, 0xbf, + 0xc7, 0x83, 0x33, 0xe1, 0x9b, 0x87, 0xc5, 0xb8, 0xc8, 0xb7, 0xc5, 0xaa, 0xc5, 0xb1, + 0xc8, 0xbd, 0x47, 0x58, 0xc5, 0x90, 0xc6, 0x91, 0xc5, 0x89, 0x24, 0xc4, 0xbf, 0xc4, + 0x80, 0xc3, 0xa7, 0xc8, 0xaa, 0x69, 0x6e, 0xe1, 0x9b, 0xa0, 0xc2, 0xa1, 0x42, 0xc6, + 0x96, 0xc3, 0x9b, 0x76, 0x24, 0xcd, 0xbb, 0xc6, 0xaf, 0x52, 0x24, 0xc4, 0xa0, 0xe1, + 0x9b, 0x82, 0xc5, 0x82, 0xe1, 0x9b, 0x90, 0xc8, 0x92, 0xc5, 0xb1, 0xe2, 0xb1, 0xbd, + 0xc2, 0xb7, 0xc4, 0xa6, 0xce, 0x88, 0xe1, 0x9b, 0x91, 0x3e, 0x3b, 0xc8, 0x88, 0xc6, + 0xae, 0xe2, 0xb1, 0xa4, 0xc3, 0xa1, 0xc4, 0x84, 0xe1, 0x9a, 0xbd, 0xc3, 0x9c, 0xc8, + 0xa4, 0xe1, 0x9a, 0xba, 0xc7, 0xb1, 0xc2, 0xac, 0x6f, 0xc4, 0x87, 0xc8, 0xb9, 0xe1, + 0x9a, 0xae, 0xc2, 0xab, 0xc3, 0xad, 0xc3, 0xae, 0xc5, 0x8b, 0xc8, 0x9f, 0xce, 0x8c, + 0x4f, 0xc7, 0xbe, 0xc7, 0x8a, 0xc5, 0xbe, 0xc7, 0x92, 0xe1, 0x9b, 0x9d, 0xc5, 0x95, + 0xe1, 0x9a, 0xab, 0x57, 0xe1, 0x9a, 0xb0, 0xc4, 0x9e, 0x55, 0xc6, 0x96, 0xc4, 0xb2, + 0x29, 0xc9, 0x81, 0xc4, 0xa6, 0xc7, 0xa3, 0xc4, 0x91, 0xc6, 0x96, 0xc7, 0x80, 0xc7, + 0xb6, 0xe1, 0x9b, 0x8c, 0xc3, 0x9f, 0xc5, 0x92, 0xc8, 0x90, 0x72, 0xc6, 0x99, 0xe1, + 0x9a, 0xa3, 0x7e, 0xc3, 0xa6, 0x58, 0xc8, 0xb6, 0x6c, 0xc8, 0xb0, 0xc3, 0xbb, 0xe1, + 0x9a, 0xa4, 0xc2, 0xa5, 0xc3, 0x94, 0xcd, 0xb4, 0xc3, 0xb7, 0xc6, 0xa7, 0xc2, 0xaf, + 0xc4, 0xae, 0xc3, 0xa5, 0xe2, 0xb1, 0xb7, 0xe1, 0x9b, 0x86, 0x5d, 0xc5, 0x80, 0x3f, + 0xc6, 0x92, 0xc8, 0x8e, 0xc6, 0xb4, 0xc7, 0xac, 0xc6, 0xb4, 0xc3, 0xab, 0xc9, 0x8b, + 0xc4, 0x90, 0xe2, 0xb1, 0xa7, 0xc4, 0x96, 0xc4, 0x9a, 0xc8, 0xbd, 0xce, 0x87, 0xc6, + 0xaf, 0xc7, 0x83, 0x3c, 0xe1, 0x9b, 0xa2, 0xc2, 0xb4, 0xc4, 0x9d, 0x4d, 0xc3, 0x8a, + 0xc3, 0xa8, 0xc6, 0x93, 0x28, 0xc7, 0xbc, 0xc6, 0x9f, 0xe1, 0x9a, 0xa4, 0xc7, 0x8a, + 0xc7, 0xbd, 0xc3, 0x87, 0xe2, 0xb1, 0xb7, 0xc6, 0xac, 0xe1, 0x9b, 0x92, 0xc4, 0xa6, + 0xc5, 0x84, 0x3a, 0xc9, 0x8c, 0xc9, 0x8a, 0xc2, 0xa2, 0xc4, 0xae, 0xe1, 0x9a, 0xa8, + 0xc8, 0xa6, 0xc2, 0xbb, 0xe2, 0xb1, 0xa0, 0xc8, 0xab, 0xc7, 0x8a, 0xc7, 0x8a, 0xe1, + 0x9b, 0x97, 0xc4, 0x89, 0xc8, 0x9a, 0xe1, 0x9b, 0x91, 0xe1, 0x9b, 0x8b, 0x5c, 0xe1, + 0x9b, 0xa6, 0xc8, 0xa9, 0xc9, 0x80, 0x71, 0xc5, 0x95, 0xc8, 0xbd, 0xc5, 0x8f, 0xc5, + 0xa4, 0xc3, 0xb7, 0xc6, 0x85, 0xe1, 0x9a, 0xa9, 0xc6, 0xa2, 0xc8, 0xaa, 0xc7, 0x8c, + 0xc6, 0x9a, 0xc7, 0x81, 0xc3, 0xa0, 0xc4, 0xab, 0xc8, 0xa2, 0xc5, 0x9b, 0xc5, 0xbb, + 0xc7, 0x8e, 0xc6, 0x95, 0xc8, 0x9c, 0x6c, 0xc8, 0xbc, 0xe2, 0xb1, 0xaa, 0xc5, 0x85, + 0xc6, 0x83, 0xc4, 0xa1, 0xc4, 0x81, 0x4d, 0xe1, 0x9a, 0xa3, 0x5d, 0xc3, 0xb7, 0xc5, + 0xa4, 0xc6, 0xae, 0xe1, 0x9a, 0xad, 0xc4, 0xa4, 0xc3, 0xb8, 0xc3, 0xa7, 0x44, 0xc6, + 0xaa, 0xc7, 0xa5, 0xc4, 0xa4, 0xc5, 0xba, 0xc9, 0x85, 0xc3, 0xa6, 0xc3, 0x9d, 0xc4, + 0xa3, 0xc5, 0x97, 0xe1, 0x9a, 0xa1, 0x2d, 0x77, 0xc2, 0xa2, 0x3e, 0xc8, 0x8d, 0xc5, + 0xb1, 0xe1, 0x9a, 0xa9, 0xc6, 0xa2, 0xc5, 0xbf, 0xc7, 0xa4, 0xe1, 0x9a, 0xa9, 0xc6, + 0x82, 0xc3, 0xbb, 0xc3, 0xb9, 0xc6, 0x8a, 0x5a, + ], + asset_base: [ + 0x9f, 0x0a, 0x47, 0x16, 0x90, 0xe2, 0x1a, 0x74, 0x79, 0x7a, 0x71, 0x12, 0x36, 0xfa, + 0x58, 0x85, 0x5e, 0x6e, 0xd1, 0xaa, 0xd5, 0x4c, 0x6c, 0xaf, 0xa8, 0xa3, 0x7f, 0xdb, + 0xd1, 0x9e, 0x75, 0x00, + ], + }, + TestVector { + key: [ + 0xe5, 0x21, 0x62, 0x0d, 0x68, 0x53, 0x7c, 0xa3, 0x0b, 0xf3, 0x2f, 0x4e, 0xd2, 0xc3, + 0x3c, 0x0c, 0xf8, 0x25, 0x2a, 0x79, 0xa8, 0xa7, 0x39, 0x7b, 0xf1, 0x1b, 0x67, 0x87, + 0x30, 0x52, 0x44, 0xee, + ], + description: [ + 0xcd, 0xb4, 0xc6, 0x92, 0xc4, 0xa7, 0xc3, 0xb9, 0xc6, 0xb8, 0xcd, 0xba, 0xc4, 0xa4, + 0xc8, 0x9a, 0xc8, 0xb7, 0xe1, 0x9b, 0x92, 0xc5, 0xb2, 0xc7, 0xba, 0xc6, 0x86, 0xc8, + 0x87, 0xc5, 0x88, 0xc5, 0x87, 0xc7, 0xa0, 0xc8, 0x97, 0xc6, 0xad, 0x4e, 0xc4, 0xa4, + 0xc5, 0x9c, 0xc8, 0x89, 0xc5, 0xba, 0xc3, 0xa1, 0xc8, 0xa2, 0xc3, 0x9c, 0xc8, 0x88, + 0xe1, 0x9a, 0xa1, 0xc8, 0x9d, 0xc7, 0x8b, 0xc6, 0xb5, 0xc3, 0x87, 0xc3, 0x93, 0xc4, + 0xa3, 0xe2, 0xb1, 0xa2, 0x7b, 0xc9, 0x85, 0xc3, 0xb9, 0x3a, 0xc6, 0x86, 0xc3, 0x99, + 0xc7, 0xa2, 0xc7, 0x83, 0xce, 0x8a, 0xc7, 0xbd, 0xe1, 0x9b, 0xa7, 0xc8, 0xa9, 0xe2, + 0xb1, 0xb1, 0xc6, 0x9d, 0xc5, 0xbb, 0xc7, 0x98, 0xc6, 0x8a, 0xc6, 0x8d, 0xc5, 0xa2, + 0xc9, 0x89, 0xc3, 0xa3, 0x57, 0xc8, 0xa8, 0x66, 0xc7, 0x95, 0xc6, 0x86, 0xc4, 0xa2, + 0x79, 0xc8, 0x98, 0xc7, 0xa8, 0xc7, 0x86, 0xc6, 0xb4, 0xcd, 0xb6, 0xe1, 0x9a, 0xb2, + 0xc3, 0x9e, 0xc2, 0xb1, 0xc7, 0xbb, 0xc6, 0xa2, 0xc7, 0xb2, 0xc5, 0xa6, 0x48, 0xc2, + 0xbf, 0xc3, 0xac, 0x53, 0xc4, 0x80, 0xc2, 0xba, 0xc2, 0xbc, 0xc7, 0xad, 0xc7, 0xa7, + 0xc6, 0xb3, 0xe1, 0x9a, 0xad, 0xc8, 0x90, 0xe2, 0xb1, 0xaa, 0x31, 0xc5, 0xb9, 0xc5, + 0xbe, 0xe1, 0x9a, 0xb9, 0xc2, 0xb7, 0xc6, 0x91, 0xc3, 0xad, 0x7c, 0xc3, 0xa6, 0xc3, + 0x95, 0xc5, 0x8c, 0xc3, 0xb9, 0xc6, 0xa7, 0xc4, 0x9e, 0x7d, 0xce, 0x8c, 0x2e, 0xc7, + 0x97, 0xc6, 0x9b, 0x26, 0xc6, 0xa8, 0x7c, 0xc7, 0xa2, 0x4d, 0xc8, 0x9d, 0xc5, 0x8c, + 0xe2, 0xb1, 0xa5, 0xc7, 0xae, 0xc4, 0xbe, 0xe1, 0x9b, 0xa6, 0xc2, 0xae, 0xe2, 0xb1, + 0xaf, 0xc5, 0xb9, 0xc7, 0x87, 0x66, 0x5c, 0x53, 0xe2, 0xb1, 0xb1, 0xc8, 0xbf, 0xc5, + 0x8a, 0xc3, 0xa8, 0x21, 0xc3, 0x8c, 0xc4, 0x99, 0xc3, 0xba, 0xcd, 0xbe, 0xc8, 0xa6, + 0xc3, 0xbe, 0xc8, 0x90, 0xc4, 0x9d, 0xc4, 0x94, 0xc3, 0xbf, 0xc3, 0x9a, 0xe1, 0x9b, + 0x83, 0xc4, 0xb9, 0xc2, 0xa6, 0xc8, 0x8d, 0xc6, 0x82, 0xe1, 0x9a, 0xb0, 0xc6, 0x9b, + 0x31, 0xe1, 0x9b, 0x97, 0xc6, 0x91, 0xc3, 0x83, 0xc6, 0x9c, 0x4d, 0xc3, 0xb7, 0xc7, + 0x99, 0xe1, 0x9a, 0xac, 0xc2, 0xa3, 0xc6, 0xad, 0xc4, 0xb4, 0xc3, 0xa6, 0xe2, 0xb1, + 0xb2, 0x26, 0xc4, 0x84, 0xc7, 0x92, 0xc8, 0x8d, 0xc5, 0x93, 0x30, 0xc4, 0x94, 0xc5, + 0x88, 0xc5, 0xa1, 0xc2, 0xa1, 0xc7, 0x9f, 0xc4, 0xbb, 0xc7, 0x99, 0xc6, 0xac, 0xc6, + 0xa7, 0xc9, 0x87, 0x2b, 0xc6, 0x99, 0xce, 0x85, 0xe1, 0x9b, 0x9d, 0xc3, 0x90, 0xe1, + 0x9a, 0xad, 0xe1, 0x9b, 0x94, 0xc3, 0x97, 0xc4, 0x84, 0xc4, 0x9c, 0xc7, 0x84, 0xc3, + 0x8f, 0x79, 0xc5, 0xa1, 0xc8, 0x98, 0xc5, 0xa9, 0x64, 0xc3, 0xa9, 0x4d, 0xc4, 0x9c, + 0xc6, 0xba, 0xe2, 0xb1, 0xb8, 0xc5, 0xbe, 0xe2, 0xb1, 0xbf, 0xc3, 0x88, 0xc5, 0x81, + 0xc3, 0xbc, 0xc9, 0x84, 0xc6, 0xbb, 0xc6, 0xa3, 0xe1, 0x9b, 0x8c, 0x34, 0xc3, 0x85, + 0x78, 0xc8, 0xb8, 0xc2, 0xa4, 0xc5, 0xb2, 0xc6, 0x82, 0x40, 0xc6, 0xa3, 0xc3, 0xb0, + 0xc6, 0xb3, 0x72, 0xc2, 0xa1, 0xc6, 0x92, 0xc7, 0xa2, 0xe2, 0xb1, 0xa5, 0xc9, 0x8a, + 0xe2, 0xb1, 0xbb, 0xc2, 0xb5, 0xe2, 0xb1, 0xb0, 0xc4, 0x88, 0xc3, 0x95, 0xc6, 0xb2, + 0xc7, 0x9d, 0xc7, 0x96, 0xe2, 0xb1, 0xaa, 0x67, 0xc3, 0xa3, 0xc4, 0xbf, 0xc9, 0x8b, + 0xc4, 0xb9, 0xc4, 0xa8, 0xe2, 0xb1, 0xad, 0x41, 0xc3, 0xb4, 0xce, 0x86, 0xc4, 0xbe, + 0xc6, 0xa8, 0xe2, 0xb1, 0xa4, 0xc5, 0xbc, 0xc8, 0x94, 0xe1, 0x9b, 0x8b, 0xc5, 0x81, + 0xe1, 0x9b, 0x94, 0xc4, 0xae, 0xc5, 0x91, 0x5a, + ], + asset_base: [ + 0x6e, 0xa8, 0x83, 0xd2, 0x4d, 0x3d, 0xbc, 0xf6, 0xc7, 0xad, 0x2b, 0xf7, 0xed, 0x87, + 0xc7, 0xb5, 0xaa, 0xd2, 0x13, 0xf0, 0xcf, 0x11, 0x2b, 0xff, 0xa0, 0xc8, 0x84, 0xb1, + 0xd0, 0xe0, 0x56, 0x9a, + ], + }, + TestVector { + key: [ + 0x5e, 0x09, 0x49, 0x46, 0x12, 0x04, 0x4d, 0x6e, 0xf5, 0xb0, 0xbd, 0x0d, 0xc9, 0xb4, + 0xa0, 0xdc, 0x09, 0x47, 0x76, 0x00, 0x9e, 0x1e, 0x94, 0xce, 0x39, 0x1c, 0x27, 0xb8, + 0xb7, 0x51, 0x8f, 0xe0, + ], + description: [ + 0xc7, 0x9b, 0xc7, 0xa3, 0xc3, 0xa4, 0xc4, 0xa7, 0xe1, 0x9a, 0xa4, 0x29, 0xc9, 0x88, + 0xc3, 0xa8, 0xe1, 0x9b, 0x9c, 0x71, 0xc5, 0xaa, 0xe2, 0xb1, 0xba, 0xc8, 0xac, 0xc7, + 0xa5, 0xc8, 0x8b, 0xcd, 0xbc, 0xe1, 0x9b, 0x83, 0xc9, 0x86, 0xe1, 0x9a, 0xad, 0xc6, + 0x87, 0xc8, 0xbc, 0xc8, 0xa0, 0xc3, 0x94, 0xe1, 0x9b, 0xa5, 0xc8, 0x94, 0xc3, 0xac, + 0xc3, 0x88, 0xe1, 0x9a, 0xa8, 0xc7, 0xb9, 0x5b, 0xe2, 0xb1, 0xa0, 0xe1, 0x9b, 0x9f, + 0x63, 0xc6, 0x95, 0xcd, 0xb3, 0xc3, 0x8d, 0xc6, 0x88, 0xc2, 0xaf, 0xc4, 0x93, 0x64, + 0xc6, 0x89, 0xc8, 0xa0, 0x5b, 0xc8, 0x8b, 0xc6, 0xb7, 0xe1, 0x9b, 0xa0, 0x4c, 0x31, + 0x31, 0xc3, 0x82, 0xc7, 0xa5, 0xc9, 0x8e, 0xc9, 0x8f, 0xe1, 0x9b, 0x93, 0xc7, 0x80, + 0xc4, 0x80, 0xc3, 0xb2, 0xc3, 0x88, 0xe2, 0xb1, 0xb9, 0xc8, 0xab, 0xcd, 0xbb, 0xc3, + 0x8c, 0xc9, 0x87, 0xe1, 0x9a, 0xaf, 0xc8, 0xa9, 0xc9, 0x84, 0xc4, 0x8b, 0xe1, 0x9b, + 0x90, 0xc7, 0xb2, 0xc5, 0xaa, 0xc6, 0x9d, 0xc8, 0xb3, 0xe1, 0x9b, 0x9f, 0xc2, 0xa6, + 0xc5, 0xba, 0xe1, 0x9b, 0xa4, 0xc4, 0x8a, 0x4f, 0xc3, 0x85, 0xc5, 0x9d, 0x5f, 0xc8, + 0xbf, 0x6d, 0x41, 0xc7, 0x8b, 0xe1, 0x9a, 0xb3, 0xc7, 0xb3, 0xc4, 0x89, 0xc6, 0xaf, + 0xc6, 0xb7, 0xc3, 0x8f, 0xc5, 0x9d, 0xc8, 0x82, 0xc8, 0x82, 0xc6, 0xb6, 0xc3, 0xbf, + 0xc8, 0xa4, 0xc6, 0xab, 0x5e, 0xc3, 0x9a, 0xc5, 0xa0, 0xe2, 0xb1, 0xb0, 0xc3, 0x90, + 0xc8, 0x99, 0xc5, 0xac, 0xe1, 0x9a, 0xa6, 0xc3, 0x95, 0xcd, 0xb4, 0xcd, 0xb3, 0xc6, + 0x9f, 0xc7, 0x80, 0xc8, 0xaa, 0xe1, 0x9a, 0xb7, 0xc7, 0xa6, 0x2c, 0xc5, 0x83, 0xc8, + 0xbe, 0xc8, 0x93, 0xc4, 0xa0, 0xc3, 0x9f, 0xc5, 0xa1, 0xc5, 0x8d, 0xe1, 0x9b, 0xa5, + 0xc6, 0x99, 0x4b, 0xc4, 0xbe, 0xc8, 0x87, 0xc8, 0x92, 0xe1, 0x9b, 0xae, 0xc8, 0x86, + 0xc7, 0x90, 0xc5, 0x85, 0xc2, 0xb6, 0xc5, 0x84, 0xe1, 0x9a, 0xa5, 0xc8, 0x86, 0xc4, + 0x8d, 0xc6, 0xb9, 0xc8, 0x90, 0x25, 0xc4, 0xa9, 0xc4, 0xbb, 0xc5, 0xb0, 0xe2, 0xb1, + 0xa9, 0xe1, 0x9b, 0xad, 0x60, 0xc4, 0x9b, 0xc8, 0xab, 0xc3, 0xad, 0xc6, 0xa2, 0xc7, + 0x9d, 0xe1, 0x9b, 0x89, 0xe1, 0x9b, 0x97, 0xe1, 0x9b, 0xa6, 0x32, 0xc6, 0x99, 0xc3, + 0x9e, 0xc9, 0x8e, 0x4c, 0xe1, 0x9b, 0x93, 0xc6, 0xa4, 0xc6, 0x8c, 0xe2, 0xb1, 0xb8, + 0xc7, 0x9f, 0x2a, 0xc5, 0xa1, 0xe1, 0x9b, 0x9f, 0xcd, 0xbb, 0xc3, 0x8f, 0xc7, 0x89, + 0xc7, 0xaf, 0x5e, 0xc7, 0x8b, 0xc8, 0xa4, 0xc6, 0x81, 0xcd, 0xb3, 0xc2, 0xa9, 0xc7, + 0xae, 0xc8, 0x83, 0xc6, 0xae, 0xe1, 0x9b, 0xa3, 0xc6, 0xa3, 0xc6, 0xa0, 0xe1, 0x9a, + 0xab, 0xc8, 0xab, 0xc5, 0x9c, 0xc8, 0x94, 0xc5, 0xa8, 0xe2, 0xb1, 0xb6, 0xc4, 0xae, + 0xc6, 0xbe, 0xc7, 0xa4, 0xc7, 0x87, 0xc8, 0x9d, 0xe1, 0x9a, 0xbf, 0xc4, 0xa7, 0xc3, + 0xb3, 0xc5, 0x9e, 0xe1, 0x9a, 0xa2, 0xe1, 0x9b, 0x9e, 0xc7, 0xad, 0x7e, 0xe1, 0x9b, + 0x93, 0xc6, 0xa8, 0xc4, 0xb5, 0xc6, 0xb1, 0xe1, 0x9b, 0xa0, 0xc4, 0xac, 0xc4, 0x91, + 0xc4, 0xbe, 0xc8, 0x89, 0x4f, 0xc6, 0xa2, 0xc5, 0xbb, 0xe1, 0x9b, 0x91, 0xc7, 0x9f, + 0xe1, 0x9b, 0xa4, 0xe1, 0x9b, 0x9a, 0xc7, 0xa9, 0xc4, 0xa6, 0xe1, 0x9b, 0x85, 0xc7, + 0xae, 0xc5, 0x91, 0xc6, 0x94, 0x42, 0x6c, 0xc4, 0xab, 0xc5, 0xa0, 0xc8, 0x89, 0xe1, + 0x9a, 0xb9, 0xc6, 0xac, 0xc6, 0xae, 0xc5, 0xa1, 0xcd, 0xb1, 0xc8, 0xb0, 0xc3, 0x84, + 0xc8, 0xbc, 0xc3, 0x9b, 0xc7, 0xbc, 0xc6, 0xbc, 0xc8, 0x82, 0xc4, 0xbf, 0xe1, 0x9b, + 0xaa, 0xc8, 0xae, 0xce, 0x85, 0xc6, 0x86, 0x4c, + ], + asset_base: [ + 0x86, 0x78, 0x20, 0x68, 0xdc, 0x11, 0xd4, 0x4f, 0xff, 0xfe, 0x8d, 0x44, 0x03, 0xad, + 0x6e, 0xf1, 0xe7, 0x7d, 0x20, 0xd2, 0x10, 0x83, 0x2e, 0x2d, 0xbf, 0x84, 0xdf, 0x09, + 0x7c, 0x87, 0x21, 0x24, + ], + }, + ] +} diff --git a/src/test_vectors/issuance_auth_sig.rs b/src/test_vectors/issuance_auth_sig.rs new file mode 100644 index 000000000..fe71486e2 --- /dev/null +++ b/src/test_vectors/issuance_auth_sig.rs @@ -0,0 +1,277 @@ +// From https://github.com/zcash-hackworks/zcash-test-vectors/ (issuance_auth_sig) + +pub(crate) struct TestVector { + pub(crate) isk: [u8; 32], + pub(crate) ik: [u8; 32], + pub(crate) msg: [u8; 32], + pub(crate) sig: [u8; 64], +} + +pub(crate) fn test_vectors() -> Vec { + vec![ + TestVector { + isk: [ + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x03, + ], + ik: [ + 0xf9, 0x30, 0x8a, 0x01, 0x92, 0x58, 0xc3, 0x10, 0x49, 0x34, 0x4f, 0x85, 0xf8, 0x9d, + 0x52, 0x29, 0xb5, 0x31, 0xc8, 0x45, 0x83, 0x6f, 0x99, 0xb0, 0x86, 0x01, 0xf1, 0x13, + 0xbc, 0xe0, 0x36, 0xf9, + ], + msg: [ + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, + ], + sig: [ + 0xe9, 0x07, 0x83, 0x1f, 0x80, 0x84, 0x8d, 0x10, 0x69, 0xa5, 0x37, 0x1b, 0x40, 0x24, + 0x10, 0x36, 0x4b, 0xdf, 0x1c, 0x5f, 0x83, 0x07, 0xb0, 0x08, 0x4c, 0x55, 0xf1, 0xce, + 0x2d, 0xca, 0x82, 0x15, 0x25, 0xf6, 0x6a, 0x4a, 0x85, 0xea, 0x8b, 0x71, 0xe4, 0x82, + 0xa7, 0x4f, 0x38, 0x2d, 0x2c, 0xe5, 0xeb, 0xee, 0xe8, 0xfd, 0xb2, 0x17, 0x2f, 0x47, + 0x7d, 0xf4, 0x90, 0x0d, 0x31, 0x05, 0x36, 0xc0, + ], + }, + TestVector { + isk: [ + 0x5d, 0x7a, 0x8f, 0x73, 0x9a, 0x2d, 0x9e, 0x94, 0x5b, 0x0c, 0xe1, 0x52, 0xa8, 0x04, + 0x9e, 0x29, 0x4c, 0x4d, 0x6e, 0x66, 0xb1, 0x64, 0x93, 0x9d, 0xaf, 0xfa, 0x2e, 0xf6, + 0xee, 0x69, 0x21, 0x48, + ], + ik: [ + 0x4b, 0xec, 0xe1, 0xff, 0x00, 0xe2, 0xed, 0x77, 0x64, 0xae, 0x6b, 0xe2, 0x0d, 0x2f, + 0x67, 0x22, 0x04, 0xfc, 0x86, 0xcc, 0xed, 0xd6, 0xfc, 0x1f, 0x71, 0xdf, 0x02, 0xc7, + 0x51, 0x6d, 0x9f, 0x31, + ], + msg: [ + 0x1c, 0xdd, 0x86, 0xb3, 0xcc, 0x43, 0x18, 0xd9, 0x61, 0x4f, 0xc8, 0x20, 0x90, 0x5d, + 0x04, 0x2b, 0xb1, 0xef, 0x9c, 0xa3, 0xf2, 0x49, 0x88, 0xc7, 0xb3, 0x53, 0x42, 0x01, + 0xcf, 0xb1, 0xcd, 0x8d, + ], + sig: [ + 0xa5, 0xb5, 0x92, 0x78, 0x1b, 0xeb, 0x55, 0xee, 0xbf, 0x8b, 0xc2, 0xbf, 0xd7, 0x9d, + 0xa9, 0x45, 0x2d, 0xc9, 0x22, 0x39, 0x87, 0x7e, 0xb7, 0xe1, 0xf5, 0x64, 0x65, 0xff, + 0x11, 0x1e, 0x59, 0x08, 0xde, 0xac, 0x15, 0xd5, 0x69, 0x99, 0x9a, 0x2b, 0xd2, 0x2b, + 0x2e, 0xf6, 0x01, 0xc5, 0x81, 0x3b, 0xdb, 0xba, 0x99, 0x3c, 0x08, 0xd4, 0xe8, 0x56, + 0xc9, 0x26, 0xd9, 0xe2, 0xc0, 0x63, 0x93, 0x67, + ], + }, + TestVector { + isk: [ + 0xbf, 0x69, 0xb8, 0x25, 0x0c, 0x18, 0xef, 0x41, 0x29, 0x4c, 0xa9, 0x79, 0x93, 0xdb, + 0x54, 0x6c, 0x1f, 0xe0, 0x1f, 0x7e, 0x9c, 0x8e, 0x36, 0xd6, 0xa5, 0xe2, 0x9d, 0x4e, + 0x30, 0xa7, 0x35, 0x94, + ], + ik: [ + 0xd4, 0x22, 0x9e, 0x19, 0x5e, 0x25, 0xf6, 0x02, 0xa2, 0x18, 0x61, 0x22, 0xcb, 0x4e, + 0x78, 0x76, 0x7b, 0x3c, 0x66, 0xac, 0x39, 0x08, 0x08, 0xd2, 0xd1, 0xb4, 0x04, 0x42, + 0xda, 0x7f, 0x00, 0x66, + ], + msg: [ + 0xbf, 0x50, 0x98, 0x42, 0x1c, 0x69, 0x37, 0x8a, 0xf1, 0xe4, 0x0f, 0x64, 0xe1, 0x25, + 0x94, 0x6f, 0x62, 0xc2, 0xfa, 0x7b, 0x2f, 0xec, 0xbc, 0xb6, 0x4b, 0x69, 0x68, 0x91, + 0x2a, 0x63, 0x81, 0xce, + ], + sig: [ + 0x18, 0x8b, 0x15, 0x57, 0x42, 0x87, 0x83, 0x55, 0x6b, 0x66, 0x80, 0x3b, 0xf9, 0x06, + 0x63, 0xb7, 0xa1, 0x6d, 0x43, 0x76, 0x92, 0x7c, 0x58, 0x35, 0xe0, 0xb7, 0x26, 0x52, + 0x0e, 0xb2, 0x6d, 0x53, 0x24, 0x99, 0x10, 0xc3, 0x9c, 0x5f, 0x05, 0x90, 0xb6, 0xd6, + 0xaa, 0xb3, 0x51, 0xff, 0x8c, 0xd8, 0xe0, 0x63, 0xfa, 0x74, 0x20, 0x42, 0x55, 0xda, + 0xdc, 0x00, 0xd9, 0xe0, 0xdf, 0xf7, 0x7b, 0x09, + ], + }, + TestVector { + isk: [ + 0x3d, 0xc1, 0x66, 0xd5, 0x6a, 0x1d, 0x62, 0xf5, 0xa8, 0xd7, 0x55, 0x1d, 0xb5, 0xfd, + 0x93, 0x13, 0xe8, 0xc7, 0x20, 0x3d, 0x99, 0x6a, 0xf7, 0xd4, 0x77, 0x08, 0x37, 0x56, + 0xd5, 0x9a, 0xf8, 0x0d, + ], + ik: [ + 0xce, 0xb7, 0x5a, 0x43, 0x9f, 0xf0, 0x16, 0x15, 0x80, 0xbf, 0x29, 0x57, 0x24, 0xc6, + 0xd9, 0x2d, 0x31, 0xb7, 0xaa, 0x02, 0x84, 0x03, 0x39, 0x44, 0x49, 0x64, 0x48, 0x6f, + 0xae, 0xa8, 0x90, 0xe5, + ], + msg: [ + 0x06, 0xa7, 0x45, 0xf4, 0x4a, 0xb0, 0x23, 0x75, 0x2c, 0xb5, 0xb4, 0x06, 0xed, 0x89, + 0x85, 0xe1, 0x81, 0x30, 0xab, 0x33, 0x36, 0x26, 0x97, 0xb0, 0xe4, 0xe4, 0xc7, 0x63, + 0xcc, 0xb8, 0xf6, 0x76, + ], + sig: [ + 0x6e, 0x5e, 0xd6, 0x65, 0x6c, 0x32, 0x71, 0x32, 0xb1, 0x65, 0x81, 0x06, 0x2f, 0x1b, + 0x13, 0x8a, 0xcc, 0x6f, 0x1f, 0x83, 0x43, 0xed, 0x9d, 0x89, 0xab, 0x5f, 0xd9, 0x38, + 0xe4, 0xe6, 0xce, 0xf7, 0x99, 0xa2, 0x25, 0x1c, 0xa5, 0x2d, 0x60, 0x82, 0x0e, 0x51, + 0x00, 0x25, 0x06, 0x7d, 0xcd, 0x1b, 0xf7, 0x54, 0xc5, 0xbf, 0xf1, 0x39, 0xb4, 0xcc, + 0x44, 0xb3, 0x7d, 0x27, 0xd1, 0x7c, 0x4a, 0xee, + ], + }, + TestVector { + isk: [ + 0x49, 0x5c, 0x22, 0x2f, 0x7f, 0xba, 0x1e, 0x31, 0xde, 0xfa, 0x3d, 0x5a, 0x57, 0xef, + 0xc2, 0xe1, 0xe9, 0xb0, 0x1a, 0x03, 0x55, 0x87, 0xd5, 0xfb, 0x1a, 0x38, 0xe0, 0x1d, + 0x94, 0x90, 0x3d, 0x3c, + ], + ik: [ + 0xb0, 0xfa, 0x9d, 0x77, 0xfc, 0xbd, 0x96, 0x45, 0x91, 0x32, 0xe3, 0x05, 0xe3, 0x24, + 0xe7, 0x93, 0x6a, 0xe1, 0x3b, 0x15, 0x14, 0x7e, 0x20, 0x5d, 0x7b, 0xae, 0x42, 0xfa, + 0x7f, 0xaf, 0x5d, 0x1e, + ], + msg: [ + 0x3e, 0x0a, 0xd3, 0x36, 0x0c, 0x1d, 0x37, 0x10, 0xac, 0xd2, 0x0b, 0x18, 0x3e, 0x31, + 0xd4, 0x9f, 0x25, 0xc9, 0xa1, 0x38, 0xf4, 0x9b, 0x1a, 0x53, 0x7e, 0xdc, 0xf0, 0x4b, + 0xe3, 0x4a, 0x98, 0x51, + ], + sig: [ + 0x17, 0xc2, 0xe5, 0xdf, 0x2e, 0xa6, 0xa1, 0x2e, 0x8a, 0xb2, 0xb0, 0xd5, 0x04, 0x89, + 0x8f, 0x3f, 0x23, 0x43, 0xe0, 0x98, 0x90, 0x7f, 0x7a, 0xfe, 0x43, 0xac, 0x8a, 0x01, + 0x14, 0x42, 0x35, 0x80, 0x97, 0x53, 0x67, 0xba, 0x4b, 0x6d, 0x16, 0x6c, 0x44, 0x28, + 0x48, 0x57, 0xb7, 0xcd, 0x29, 0xa8, 0x38, 0xb4, 0x9c, 0xc3, 0x41, 0xd2, 0x89, 0x51, + 0xaa, 0x0b, 0x5d, 0x55, 0x6a, 0x20, 0x9e, 0xb6, + ], + }, + TestVector { + isk: [ + 0xa7, 0xaf, 0x9d, 0xb6, 0x99, 0x0e, 0xd8, 0x3d, 0xd6, 0x4a, 0xf3, 0x59, 0x7c, 0x04, + 0x32, 0x3e, 0xa5, 0x1b, 0x00, 0x52, 0xad, 0x80, 0x84, 0xa8, 0xb9, 0xda, 0x94, 0x8d, + 0x32, 0x0d, 0xad, 0xd6, + ], + ik: [ + 0x0b, 0xb4, 0x91, 0x3d, 0xba, 0xf1, 0x4e, 0xf6, 0xd0, 0xad, 0xeb, 0x8b, 0x70, 0x27, + 0xbf, 0x0b, 0x9a, 0x8f, 0x59, 0x0d, 0x3e, 0x2d, 0x95, 0xa1, 0x2d, 0xba, 0xaf, 0x0b, + 0x95, 0x33, 0xdc, 0xa4, + ], + msg: [ + 0x4f, 0x54, 0x31, 0xe6, 0x1d, 0xdf, 0x65, 0x8d, 0x24, 0xae, 0x67, 0xc2, 0x2c, 0x8d, + 0x13, 0x09, 0x13, 0x1f, 0xc0, 0x0f, 0xe7, 0xf2, 0x35, 0x73, 0x42, 0x76, 0xd3, 0x8d, + 0x47, 0xf1, 0xe1, 0x91, + ], + sig: [ + 0x42, 0x1f, 0x5b, 0x07, 0x57, 0x2e, 0x6b, 0x05, 0xe8, 0x0b, 0xa5, 0x85, 0xff, 0x63, + 0x21, 0x42, 0x26, 0x75, 0xcd, 0x19, 0xea, 0x59, 0x15, 0xd6, 0x32, 0xeb, 0x47, 0x64, + 0x6c, 0xe2, 0x20, 0x27, 0x6b, 0xb7, 0x82, 0x42, 0xcc, 0x75, 0x48, 0xd9, 0xa0, 0x57, + 0x2b, 0x89, 0x69, 0x2e, 0x5b, 0x95, 0xdb, 0x14, 0x14, 0xe4, 0xeb, 0xd2, 0x20, 0xcc, + 0xf8, 0x3a, 0xf2, 0x98, 0x2f, 0xdd, 0x3a, 0xec, + ], + }, + TestVector { + isk: [ + 0xe0, 0x0c, 0x7a, 0x1d, 0x48, 0xaf, 0x04, 0x68, 0x27, 0x59, 0x1e, 0x97, 0x33, 0xa9, + 0x7f, 0xa6, 0xb6, 0x79, 0xf3, 0xdc, 0x60, 0x1d, 0x00, 0x82, 0x85, 0xed, 0xcb, 0xda, + 0xe6, 0x9c, 0xe8, 0xfc, + ], + ik: [ + 0x61, 0xbb, 0x33, 0x91, 0x59, 0xdf, 0x98, 0x20, 0xef, 0xae, 0xb6, 0x1d, 0x9a, 0x10, + 0xcd, 0xc1, 0x3b, 0x4c, 0x99, 0xfd, 0xc8, 0x6d, 0x94, 0x85, 0x11, 0x5d, 0xfd, 0x83, + 0x62, 0x36, 0xac, 0xf8, + ], + msg: [ + 0x1b, 0xe4, 0xaa, 0xc0, 0x0f, 0xf2, 0x71, 0x1e, 0xbd, 0x93, 0x1d, 0xe5, 0x18, 0x85, + 0x68, 0x78, 0xf7, 0x34, 0x76, 0xf2, 0x1a, 0x48, 0x2e, 0xc9, 0x37, 0x83, 0x65, 0xc8, + 0xf7, 0x39, 0x3c, 0x94, + ], + sig: [ + 0x5a, 0x11, 0x48, 0xa8, 0x92, 0x8f, 0xbf, 0x43, 0xbb, 0x33, 0xa5, 0x70, 0xf0, 0xdf, + 0xa3, 0x53, 0x32, 0xb7, 0x01, 0x80, 0x21, 0xa0, 0xcb, 0x75, 0xe9, 0x55, 0x4e, 0x86, + 0xec, 0xb2, 0x1d, 0xa3, 0x2e, 0xb5, 0xa2, 0xd8, 0xc5, 0x9e, 0xa3, 0x90, 0x43, 0xb9, + 0x74, 0x78, 0x75, 0x0c, 0x6b, 0xf8, 0x66, 0xeb, 0x3b, 0x01, 0x5e, 0xbb, 0x31, 0x68, + 0xf7, 0x53, 0x76, 0x6a, 0xd1, 0x71, 0xd2, 0x1e, + ], + }, + TestVector { + isk: [ + 0xe2, 0x88, 0x53, 0x15, 0xeb, 0x46, 0x71, 0x09, 0x8b, 0x79, 0x53, 0x5e, 0x79, 0x0f, + 0xe5, 0x3e, 0x29, 0xfe, 0xf2, 0xb3, 0x76, 0x66, 0x97, 0xac, 0x32, 0xb4, 0xf4, 0x73, + 0xf4, 0x68, 0xa0, 0x08, + ], + ik: [ + 0x19, 0x58, 0x53, 0x8b, 0x12, 0x17, 0xa0, 0x3d, 0x89, 0xcd, 0x83, 0xb8, 0x3d, 0x0b, + 0xdd, 0x40, 0xa6, 0x9a, 0xbe, 0x3a, 0xc2, 0x5d, 0x00, 0xc6, 0xd2, 0x69, 0x97, 0xf9, + 0xf2, 0x57, 0x4d, 0x4f, + ], + msg: [ + 0xe7, 0x23, 0x89, 0xfc, 0x03, 0x88, 0x0d, 0x78, 0x0c, 0xb0, 0x7f, 0xcf, 0xaa, 0xbe, + 0x3f, 0x1a, 0x84, 0xb2, 0x7d, 0xb5, 0x9a, 0x4a, 0x15, 0x3d, 0x88, 0x2d, 0x2b, 0x21, + 0x03, 0x59, 0x65, 0x55, + ], + sig: [ + 0x16, 0x90, 0xf5, 0x43, 0xee, 0x67, 0xbb, 0x1c, 0xe0, 0xe4, 0x25, 0x4e, 0xa5, 0xdf, + 0xd0, 0x42, 0xfe, 0x86, 0x3a, 0xb4, 0x6c, 0xd9, 0xa8, 0x90, 0x55, 0x19, 0xff, 0xb1, + 0xb8, 0x40, 0x6b, 0xec, 0xbd, 0x90, 0xda, 0x66, 0xe5, 0xb5, 0x44, 0xbc, 0xd4, 0x3b, + 0xdb, 0x29, 0xbc, 0x5d, 0x2c, 0x02, 0x4d, 0xd2, 0x85, 0xab, 0xcd, 0x77, 0xe4, 0xac, + 0x1f, 0x9d, 0x60, 0x35, 0x22, 0xe4, 0xf1, 0x5b, + ], + }, + TestVector { + isk: [ + 0xed, 0x94, 0x94, 0xc6, 0xac, 0x89, 0x3c, 0x49, 0x72, 0x38, 0x33, 0xec, 0x89, 0x26, + 0xc1, 0x03, 0x95, 0x86, 0xa7, 0xaf, 0xcf, 0x4a, 0x0d, 0x9c, 0x73, 0x1e, 0x98, 0x5d, + 0x99, 0x58, 0x9c, 0x8b, + ], + ik: [ + 0x7d, 0xd6, 0xd7, 0x61, 0xe1, 0x02, 0x01, 0x37, 0xfa, 0x01, 0xb4, 0xdd, 0xd3, 0xb0, + 0xf3, 0x48, 0x04, 0xcc, 0x10, 0xcc, 0x4e, 0x9f, 0x6e, 0x9d, 0xf5, 0xb6, 0x04, 0x69, + 0xf5, 0x79, 0x36, 0x67, + ], + msg: [ + 0xb8, 0x38, 0xe8, 0xaa, 0xf7, 0x45, 0x53, 0x3e, 0xd9, 0xe8, 0xae, 0x3a, 0x1c, 0xd0, + 0x74, 0xa5, 0x1a, 0x20, 0xda, 0x8a, 0xba, 0x18, 0xd1, 0xdb, 0xeb, 0xbc, 0x86, 0x2d, + 0xed, 0x42, 0x43, 0x5e, + ], + sig: [ + 0x59, 0x34, 0x5d, 0x6b, 0x89, 0x4e, 0xd6, 0xd0, 0x3a, 0x56, 0x73, 0xa0, 0x14, 0x63, + 0x07, 0x51, 0x04, 0x3d, 0x11, 0xfa, 0x63, 0x18, 0x7c, 0x92, 0x9c, 0xae, 0x3f, 0xa1, + 0xb0, 0x29, 0x22, 0xf2, 0x7d, 0xc0, 0x16, 0x40, 0x33, 0x95, 0x2c, 0x84, 0x16, 0xe6, + 0xd0, 0x43, 0x81, 0x77, 0xb3, 0xbc, 0xe8, 0x78, 0xfd, 0xec, 0x75, 0x0a, 0x16, 0x64, + 0xd4, 0x89, 0xdf, 0x0a, 0x4e, 0xae, 0xb1, 0x35, + ], + }, + TestVector { + isk: [ + 0x92, 0x47, 0x69, 0x30, 0xd0, 0x69, 0x89, 0x6c, 0xff, 0x30, 0xeb, 0x41, 0x4f, 0x72, + 0x7b, 0x89, 0xe0, 0x01, 0xaf, 0xa2, 0xfb, 0x8d, 0xc3, 0x43, 0x6d, 0x75, 0xa4, 0xa6, + 0xf2, 0x65, 0x72, 0x50, + ], + ik: [ + 0xb5, 0x9c, 0x5f, 0x32, 0x34, 0xd6, 0xca, 0x36, 0xcc, 0x48, 0x3d, 0x67, 0xa8, 0x4f, + 0x37, 0xd6, 0xb2, 0x4b, 0x24, 0x45, 0x48, 0x25, 0xd2, 0xb7, 0xbf, 0xdc, 0x80, 0x2b, + 0x2e, 0x32, 0x8c, 0x43, + ], + msg: [ + 0x4b, 0x19, 0x22, 0x32, 0xec, 0xb9, 0xf0, 0xc0, 0x24, 0x11, 0xe5, 0x25, 0x96, 0xbc, + 0x5e, 0x90, 0x45, 0x7e, 0x74, 0x59, 0x39, 0xff, 0xed, 0xbd, 0x12, 0x86, 0x3c, 0xe7, + 0x1a, 0x02, 0xaf, 0x11, + ], + sig: [ + 0xa4, 0x58, 0x79, 0x33, 0x26, 0x98, 0x37, 0x74, 0x09, 0x6d, 0x36, 0x59, 0xeb, 0x9a, + 0x21, 0xd1, 0x2c, 0x8e, 0xb8, 0x77, 0x56, 0x6b, 0x66, 0xbf, 0x60, 0x33, 0xdb, 0x8f, + 0xde, 0x20, 0xc4, 0x66, 0xa2, 0xe9, 0x54, 0x30, 0xa0, 0x1e, 0xb9, 0xad, 0x28, 0xe0, + 0x76, 0x5b, 0xed, 0x21, 0xdc, 0xd3, 0x03, 0x86, 0xfc, 0xe7, 0xaa, 0xba, 0xde, 0xa6, + 0xda, 0x72, 0x8c, 0x16, 0xbb, 0x80, 0xf1, 0xc2, + ], + }, + TestVector { + isk: [ + 0x7d, 0x41, 0x7a, 0xdb, 0x3d, 0x15, 0xcc, 0x54, 0xdc, 0xb1, 0xfc, 0xe4, 0x67, 0x50, + 0x0c, 0x6b, 0x8f, 0xb8, 0x6b, 0x12, 0xb5, 0x6d, 0xa9, 0xc3, 0x82, 0x85, 0x7d, 0xee, + 0xcc, 0x40, 0xa9, 0x8d, + ], + ik: [ + 0x45, 0x61, 0x9f, 0x20, 0x6c, 0x3b, 0xfc, 0x84, 0xfd, 0x42, 0x4f, 0xfb, 0x5c, 0x81, + 0x6f, 0x65, 0x4b, 0x27, 0xaa, 0x7f, 0x7b, 0x4b, 0xd6, 0x7e, 0xc5, 0xf9, 0xac, 0x6d, + 0x0f, 0x38, 0xdb, 0xb1, + ], + msg: [ + 0x5f, 0x29, 0x35, 0x39, 0x5e, 0xe4, 0x76, 0x2d, 0xd2, 0x1a, 0xfd, 0xbb, 0x5d, 0x47, + 0xfa, 0x9a, 0x6d, 0xd9, 0x84, 0xd5, 0x67, 0xdb, 0x28, 0x57, 0xb9, 0x27, 0xb7, 0xfa, + 0xe2, 0xdb, 0x58, 0x71, + ], + sig: [ + 0xe6, 0x92, 0x4d, 0x53, 0xec, 0x97, 0x80, 0x79, 0xd6, 0x6a, 0x28, 0x4c, 0x00, 0xa8, + 0x68, 0xf9, 0xeb, 0x75, 0x1a, 0xe3, 0xb1, 0x69, 0x0d, 0x15, 0xee, 0x1b, 0x39, 0x68, + 0x0b, 0x83, 0xc4, 0x38, 0xe4, 0x5f, 0x02, 0xa2, 0x3c, 0x65, 0x6e, 0x4e, 0x53, 0xd3, + 0xc7, 0x3e, 0xfa, 0x0d, 0xc5, 0xf7, 0xad, 0x63, 0x28, 0x21, 0x7f, 0xd5, 0x9b, 0x23, + 0xaa, 0xe4, 0xf9, 0x0c, 0x68, 0xbe, 0x76, 0xbc, + ], + }, + ] +} diff --git a/src/test_vectors/keys.rs b/src/test_vectors/keys.rs index 39d7dc00d..4417713eb 100644 --- a/src/test_vectors/keys.rs +++ b/src/test_vectors/keys.rs @@ -1,9 +1,11 @@ -//! Test vectors for Orchard key components. +// From https://github.com/zcash-hackworks/zcash-test-vectors/ (orchard_key_components) pub(crate) struct TestVector { pub(crate) sk: [u8; 32], pub(crate) ask: [u8; 32], pub(crate) ak: [u8; 32], + pub(crate) isk: [u8; 32], + pub(crate) ik: [u8; 32], pub(crate) nk: [u8; 32], pub(crate) rivk: [u8; 32], pub(crate) ivk: [u8; 32], @@ -15,6 +17,7 @@ pub(crate) struct TestVector { pub(crate) internal_ivk: [u8; 32], pub(crate) internal_ovk: [u8; 32], pub(crate) internal_dk: [u8; 32], + pub(crate) asset: [u8; 32], pub(crate) note_v: u64, pub(crate) note_rho: [u8; 32], pub(crate) note_rseed: [u8; 32], @@ -23,7 +26,6 @@ pub(crate) struct TestVector { } pub(crate) fn test_vectors() -> Vec { - // From https://github.com/zcash-hackworks/zcash-test-vectors/blob/master/orchard_key_components.py vec![ TestVector { sk: [ @@ -41,6 +43,16 @@ pub(crate) fn test_vectors() -> Vec { 0x12, 0x8b, 0x9a, 0x14, 0x0d, 0x5e, 0x07, 0xc1, 0x51, 0x72, 0x1d, 0xc1, 0x6d, 0x25, 0xd4, 0xe2, 0x0f, 0x15, ], + isk: [ + 0x1c, 0xdd, 0x86, 0xb3, 0xcc, 0x43, 0x18, 0xd9, 0x61, 0x4f, 0xc8, 0x20, 0x90, 0x5d, + 0x04, 0x2b, 0xb1, 0xef, 0x9c, 0xa3, 0xf2, 0x49, 0x88, 0xc7, 0xb3, 0x53, 0x42, 0x01, + 0xcf, 0xb1, 0xcd, 0x8d, + ], + ik: [ + 0x16, 0x88, 0x4f, 0x1d, 0xbc, 0x92, 0x90, 0x89, 0xa4, 0x17, 0x6e, 0x84, 0x0b, 0xb5, + 0x81, 0xc8, 0x0e, 0x16, 0xe9, 0xb1, 0xab, 0xd6, 0x54, 0xe6, 0x2c, 0x8b, 0x0b, 0x95, + 0x70, 0x20, 0xb7, 0x48, + ], nk: [ 0x9f, 0x2f, 0x82, 0x67, 0x38, 0x94, 0x5a, 0xd0, 0x1f, 0x47, 0xf7, 0x0d, 0xb0, 0xc3, 0x67, 0xc2, 0x46, 0xc2, 0x0c, 0x61, 0xff, 0x55, 0x83, 0x94, 0x8c, 0x39, 0xde, 0xa9, @@ -94,7 +106,12 @@ pub(crate) fn test_vectors() -> Vec { 0xfc, 0x27, 0x59, 0xd4, 0xf4, 0xd6, 0x84, 0xb2, 0xc5, 0x05, 0x6d, 0x5b, 0x17, 0x7a, 0xf0, 0xfa, 0x8a, 0xa9, ], - note_v: 15643327852135767324, + asset: [ + 0x67, 0x43, 0xf9, 0x3a, 0x6e, 0xbd, 0xa7, 0x2a, 0x8c, 0x7c, 0x5a, 0x2b, 0x7f, 0xa3, + 0x04, 0xfe, 0x32, 0xb2, 0x9b, 0x4f, 0x70, 0x6a, 0xa8, 0xf7, 0x42, 0x0f, 0x3d, 0x8e, + 0x7a, 0x59, 0x70, 0x2f, + ], + note_v: 4751042572350679487, note_rho: [ 0x2c, 0xb5, 0xb4, 0x06, 0xed, 0x89, 0x85, 0xe1, 0x81, 0x30, 0xab, 0x33, 0x36, 0x26, 0x97, 0xb0, 0xe4, 0xe4, 0xc7, 0x63, 0xcc, 0xb8, 0xf6, 0x76, 0x49, 0x5c, 0x22, 0x2f, @@ -106,14 +123,14 @@ pub(crate) fn test_vectors() -> Vec { 0x0c, 0x1d, 0x37, 0x10, ], note_cmx: [ - 0x45, 0x02, 0xe3, 0x39, 0x90, 0x1e, 0x39, 0x77, 0x17, 0x83, 0x91, 0x67, 0xcb, 0xb4, - 0x03, 0x7e, 0x0e, 0xcf, 0x68, 0x13, 0xb5, 0x1c, 0x81, 0xfe, 0x08, 0x5a, 0x7b, 0x78, - 0x2f, 0x12, 0x42, 0x28, + 0x6a, 0xcb, 0x59, 0x4e, 0x29, 0x6f, 0xfe, 0x99, 0xa8, 0x5c, 0x17, 0x5a, 0xa4, 0x22, + 0xc8, 0x29, 0x3c, 0xe7, 0xe1, 0x9a, 0x92, 0xdf, 0x7f, 0x80, 0xae, 0x87, 0x66, 0x55, + 0x44, 0x25, 0x83, 0x38, ], note_nf: [ - 0x1b, 0x32, 0xed, 0xbb, 0xe4, 0xd1, 0x8f, 0x28, 0x87, 0x6d, 0xe2, 0x62, 0x51, 0x8a, - 0xd3, 0x11, 0x22, 0x70, 0x1f, 0x8c, 0x0a, 0x52, 0xe9, 0x80, 0x47, 0xa3, 0x37, 0x87, - 0x6e, 0x7e, 0xea, 0x19, + 0x1c, 0x64, 0xc6, 0x82, 0x9a, 0x41, 0x21, 0xe1, 0x38, 0xd9, 0x8a, 0xae, 0xb4, 0xe6, + 0xbd, 0x4f, 0xf4, 0x5a, 0x1d, 0xb8, 0x6d, 0xef, 0x9f, 0x08, 0xd6, 0xaa, 0x60, 0x5a, + 0x97, 0xf3, 0x79, 0x39, ], }, TestVector { @@ -132,6 +149,16 @@ pub(crate) fn test_vectors() -> Vec { 0x2a, 0xd6, 0x43, 0x23, 0x62, 0x9c, 0xfe, 0xd1, 0xe3, 0xaa, 0x24, 0xef, 0x05, 0x2f, 0x56, 0xe4, 0x00, 0x2a, ], + isk: [ + 0xd6, 0x4a, 0xf3, 0x59, 0x7c, 0x04, 0x32, 0x3e, 0xa5, 0x1b, 0x00, 0x52, 0xad, 0x80, + 0x84, 0xa8, 0xb9, 0xda, 0x94, 0x8d, 0x32, 0x0d, 0xad, 0xd6, 0x4f, 0x54, 0x31, 0xe6, + 0x1d, 0xdf, 0x65, 0x8d, + ], + ik: [ + 0x46, 0x2e, 0xe2, 0x38, 0x00, 0xc2, 0x1e, 0x2b, 0xbd, 0x90, 0x2b, 0xf7, 0x2f, 0x60, + 0xe1, 0xab, 0x08, 0x26, 0xd3, 0x68, 0x0c, 0x6f, 0xd0, 0xa2, 0x6f, 0x87, 0xdb, 0xac, + 0xd0, 0xd7, 0x6c, 0xa0, + ], nk: [ 0xa8, 0xb7, 0x3d, 0x97, 0x9b, 0x6e, 0xaa, 0xda, 0x89, 0x24, 0xbc, 0xbd, 0xc6, 0x3a, 0x9e, 0xf4, 0xe8, 0x73, 0x46, 0xf2, 0x30, 0xab, 0xa6, 0xbb, 0xe1, 0xe2, 0xb4, 0x3c, @@ -185,754 +212,879 @@ pub(crate) fn test_vectors() -> Vec { 0x9e, 0xca, 0x3c, 0x00, 0xd3, 0x98, 0xae, 0xde, 0x1f, 0xdc, 0x2a, 0xbf, 0xfc, 0x88, 0x35, 0x38, 0x59, 0xaf, ], - note_v: 4481649511318637270, + asset: [ + 0x67, 0x43, 0xf9, 0x3a, 0x6e, 0xbd, 0xa7, 0x2a, 0x8c, 0x7c, 0x5a, 0x2b, 0x7f, 0xa3, + 0x04, 0xfe, 0x32, 0xb2, 0x9b, 0x4f, 0x70, 0x6a, 0xa8, 0xf7, 0x42, 0x0f, 0x3d, 0x8e, + 0x7a, 0x59, 0x70, 0x2f, + ], + note_v: 654021594278506020, note_rho: [ - 0xa5, 0x1b, 0x00, 0x52, 0xad, 0x80, 0x84, 0xa8, 0xb9, 0xda, 0x94, 0x8d, 0x32, 0x0d, - 0xad, 0xd6, 0x4f, 0x54, 0x31, 0xe6, 0x1d, 0xdf, 0x65, 0x8d, 0x24, 0xae, 0x67, 0xc2, - 0x2c, 0x8d, 0x13, 0x09, + 0xf7, 0x34, 0x76, 0xf2, 0x1a, 0x48, 0x2e, 0xc9, 0x37, 0x83, 0x65, 0xc8, 0xf7, 0x39, + 0x3c, 0x94, 0xe2, 0x88, 0x53, 0x15, 0xeb, 0x46, 0x71, 0x09, 0x8b, 0x79, 0x53, 0x5e, + 0x79, 0x0f, 0xe5, 0x3e, ], note_rseed: [ - 0x13, 0x1f, 0xc0, 0x0f, 0xe7, 0xf2, 0x35, 0x73, 0x42, 0x76, 0xd3, 0x8d, 0x47, 0xf1, - 0xe1, 0x91, 0xe0, 0x0c, 0x7a, 0x1d, 0x48, 0xaf, 0x04, 0x68, 0x27, 0x59, 0x1e, 0x97, - 0x33, 0xa9, 0x7f, 0xa6, + 0x29, 0xfe, 0xf2, 0xb3, 0x76, 0x66, 0x97, 0xac, 0x32, 0xb4, 0xf4, 0x73, 0xf4, 0x68, + 0xa0, 0x08, 0xe7, 0x23, 0x89, 0xfc, 0x03, 0x88, 0x0d, 0x78, 0x0c, 0xb0, 0x7f, 0xcf, + 0xaa, 0xbe, 0x3f, 0x1a, ], note_cmx: [ - 0xc7, 0xad, 0x79, 0x4c, 0x56, 0x3e, 0x32, 0xca, 0xd4, 0x7d, 0x47, 0xdc, 0xda, 0x78, - 0x84, 0x69, 0x28, 0x48, 0xdc, 0xe2, 0x9b, 0xa4, 0xfe, 0xbd, 0x93, 0x20, 0x2b, 0x73, - 0x05, 0xf9, 0x03, 0x00, + 0x3b, 0x7a, 0x77, 0x4e, 0x5a, 0xc0, 0x16, 0xfd, 0x2a, 0x8a, 0x2b, 0xa0, 0x21, 0x2e, + 0x67, 0xfe, 0x16, 0x92, 0x9b, 0xa7, 0x2e, 0x7b, 0x82, 0x70, 0x8b, 0xd5, 0x74, 0x96, + 0xfb, 0xb3, 0x0f, 0x22, ], note_nf: [ - 0x2c, 0xf0, 0x67, 0xbc, 0x21, 0xd6, 0x63, 0x20, 0xe5, 0x1b, 0x9f, 0xbd, 0xc8, 0xae, - 0x03, 0x1c, 0x2c, 0x96, 0x37, 0x3d, 0xb4, 0x3b, 0x7b, 0x1a, 0x45, 0x05, 0x6c, 0x00, - 0xc6, 0x5d, 0x43, 0x20, + 0x6c, 0xba, 0xbc, 0xfe, 0x07, 0x58, 0xc0, 0x61, 0x75, 0x59, 0x3f, 0xcc, 0x89, 0x37, + 0x55, 0x9a, 0xc1, 0xc7, 0xb7, 0x22, 0xd5, 0x65, 0xa1, 0xf3, 0xfc, 0xf0, 0xb8, 0xc5, + 0x90, 0x37, 0x8a, 0x1c, ], }, TestVector { sk: [ - 0xb6, 0x79, 0xf3, 0xdc, 0x60, 0x1d, 0x00, 0x82, 0x85, 0xed, 0xcb, 0xda, 0xe6, 0x9c, - 0xe8, 0xfc, 0x1b, 0xe4, 0xaa, 0xc0, 0x0f, 0xf2, 0x71, 0x1e, 0xbd, 0x93, 0x1d, 0xe5, - 0x18, 0x85, 0x68, 0x78, + 0x84, 0xb2, 0x7d, 0xb5, 0x9a, 0x4a, 0x15, 0x3d, 0x88, 0x2d, 0x2b, 0x21, 0x03, 0x59, + 0x65, 0x55, 0xed, 0x94, 0x94, 0xc6, 0xac, 0x89, 0x3c, 0x49, 0x72, 0x38, 0x33, 0xec, + 0x89, 0x26, 0xc1, 0x03, ], ask: [ - 0xce, 0x8b, 0x65, 0xa7, 0x23, 0x65, 0x11, 0xb2, 0xea, 0xf1, 0x9f, 0x72, 0xa3, 0xd6, - 0xdb, 0x7d, 0x06, 0x2b, 0x66, 0xf5, 0x16, 0x30, 0x7d, 0x19, 0x87, 0x06, 0xe5, 0xf6, - 0x92, 0x8e, 0x16, 0x15, + 0xe0, 0x9b, 0x65, 0x10, 0x87, 0x7d, 0xd4, 0x0e, 0x85, 0x4e, 0xe4, 0xb9, 0xc4, 0xc3, + 0x89, 0x8e, 0xc1, 0xe7, 0x26, 0x60, 0xfe, 0xf5, 0xb0, 0xab, 0xda, 0xdb, 0xa8, 0x08, + 0x10, 0x50, 0xae, 0x38, ], ak: [ - 0xef, 0xa5, 0xf1, 0xde, 0xbe, 0xea, 0xd0, 0x94, 0x0a, 0x61, 0x9c, 0xe0, 0x01, 0x7b, - 0xed, 0xb4, 0x26, 0x65, 0x7b, 0x2d, 0x07, 0x40, 0x66, 0x64, 0xd8, 0x95, 0x31, 0x2e, - 0xa1, 0xc3, 0xb3, 0x34, + 0x53, 0xf7, 0x4b, 0x84, 0x33, 0xe9, 0x4a, 0xae, 0xb8, 0x5f, 0x5e, 0xb4, 0x1a, 0x89, + 0xc1, 0x0f, 0xe2, 0x0a, 0xe0, 0x03, 0xec, 0xf4, 0xbc, 0xe1, 0x63, 0x38, 0xd9, 0x75, + 0x88, 0x65, 0x6b, 0x38, + ], + isk: [ + 0x95, 0x86, 0xa7, 0xaf, 0xcf, 0x4a, 0x0d, 0x9c, 0x73, 0x1e, 0x98, 0x5d, 0x99, 0x58, + 0x9c, 0x8b, 0xb8, 0x38, 0xe8, 0xaa, 0xf7, 0x45, 0x53, 0x3e, 0xd9, 0xe8, 0xae, 0x3a, + 0x1c, 0xd0, 0x74, 0xa5, + ], + ik: [ + 0xcb, 0x48, 0x0d, 0x9b, 0x96, 0x27, 0x3e, 0x89, 0x91, 0x40, 0x89, 0xa1, 0x04, 0xc2, + 0xc9, 0x36, 0xd0, 0x75, 0x95, 0xd4, 0xf8, 0x46, 0xad, 0xa6, 0xca, 0xea, 0x68, 0x5c, + 0x88, 0x0b, 0x8a, 0xf8, ], nk: [ - 0x04, 0x51, 0x4e, 0xa0, 0x48, 0xb9, 0x43, 0x63, 0xde, 0xa7, 0xcb, 0x3b, 0xe8, 0xd6, - 0x25, 0x82, 0xac, 0x52, 0x92, 0x2e, 0x08, 0x65, 0xf6, 0x62, 0x74, 0x3b, 0x05, 0xea, - 0xe8, 0x71, 0x5f, 0x17, + 0x6e, 0x37, 0x10, 0xbc, 0xa6, 0x80, 0x46, 0xc8, 0x3e, 0x54, 0x80, 0xbf, 0xe7, 0x3f, + 0xd7, 0x54, 0x13, 0x5d, 0xc0, 0x7f, 0xa1, 0xd1, 0x1b, 0x86, 0x5f, 0xd1, 0x5e, 0x7c, + 0x4e, 0x63, 0xe2, 0x02, ], rivk: [ - 0x2a, 0x32, 0x8f, 0x99, 0x4f, 0x6e, 0x5a, 0xd2, 0x9c, 0xa8, 0x11, 0xed, 0x34, 0x49, - 0x68, 0xea, 0x2c, 0xfc, 0x3f, 0xd2, 0x31, 0x03, 0x0e, 0x37, 0xbb, 0xd5, 0x6d, 0xb4, - 0x26, 0x40, 0x23, 0x1c, + 0xaa, 0xcc, 0xc8, 0x41, 0xfe, 0x74, 0x89, 0x49, 0xcf, 0x90, 0x59, 0xb5, 0x41, 0x1c, + 0x2c, 0xe8, 0xf0, 0x07, 0x05, 0x00, 0x23, 0x85, 0x2d, 0xd5, 0x8d, 0xb0, 0xb6, 0x9b, + 0x44, 0xfe, 0xf5, 0x33, ], ivk: [ - 0x60, 0x9e, 0xcb, 0xc3, 0xd8, 0xce, 0xe3, 0xbe, 0x2b, 0x2a, 0x23, 0x62, 0x95, 0x1f, - 0x58, 0xb7, 0x44, 0x82, 0xad, 0xfa, 0xee, 0xe1, 0xc4, 0x0f, 0x94, 0x03, 0x04, 0x40, - 0xf5, 0x58, 0xaa, 0x30, + 0xa8, 0x1d, 0xfd, 0x18, 0xbf, 0x1e, 0x5e, 0xad, 0x3d, 0x10, 0x02, 0xf5, 0xfe, 0x4b, + 0xcb, 0x89, 0xde, 0xea, 0xf9, 0xd6, 0x4c, 0xf8, 0x0a, 0xef, 0xdc, 0xb6, 0xcd, 0x0c, + 0xb7, 0xd1, 0x79, 0x02, ], ovk: [ - 0xdf, 0xd3, 0x0f, 0x62, 0xaa, 0x31, 0x9c, 0x6f, 0x53, 0xe2, 0x4c, 0x1f, 0x48, 0xc1, - 0xde, 0x96, 0x1b, 0x90, 0x01, 0xcb, 0x98, 0x8b, 0x80, 0xb3, 0xed, 0xa2, 0x44, 0xfc, - 0xfe, 0xb2, 0x5f, 0x83, + 0x45, 0xcf, 0x1a, 0x1d, 0xf6, 0x62, 0xfe, 0xc0, 0xf7, 0x84, 0x7a, 0x63, 0xa0, 0xd7, + 0x95, 0x51, 0xe1, 0xb0, 0x49, 0xc3, 0xc3, 0x58, 0x7e, 0x68, 0x37, 0xa7, 0x54, 0x45, + 0xa0, 0x04, 0x12, 0xa7, ], dk: [ - 0x23, 0x6b, 0xc3, 0xf3, 0xd0, 0x2f, 0x96, 0x02, 0x80, 0xee, 0xde, 0xde, 0x10, 0x8d, - 0x36, 0x85, 0x04, 0x9f, 0x23, 0x9a, 0xa6, 0x7c, 0x48, 0x55, 0x8f, 0x7c, 0x01, 0xd3, - 0xfd, 0x46, 0x9e, 0xcd, + 0xa8, 0x61, 0xd9, 0xa4, 0x37, 0x61, 0x87, 0xb2, 0xb5, 0xc1, 0x9a, 0x5f, 0x89, 0x6f, + 0xa4, 0x75, 0xaa, 0x0e, 0xd3, 0x8b, 0x99, 0x54, 0xf3, 0x93, 0x8a, 0x04, 0xec, 0x41, + 0xe5, 0x4f, 0xaf, 0x1c, ], default_d: [ - 0x64, 0x24, 0xf7, 0x1a, 0x3a, 0xd1, 0x97, 0x42, 0x64, 0x98, 0xf4, + 0x59, 0x8d, 0x20, 0x0e, 0x50, 0x9e, 0xc2, 0x4b, 0xdc, 0x7f, 0x1c, ], default_pk_d: [ - 0xec, 0xcb, 0x6a, 0x57, 0x80, 0x20, 0x42, 0x37, 0x98, 0x72, 0x32, 0xbc, 0x09, 0x8f, - 0x89, 0xac, 0xc4, 0x75, 0xc3, 0xf7, 0x4b, 0xd6, 0x9e, 0x2f, 0x35, 0xd4, 0x47, 0x36, - 0xf4, 0x8f, 0x3c, 0x14, + 0x68, 0x10, 0x44, 0xee, 0x77, 0xd7, 0xf8, 0x6a, 0x0a, 0x5c, 0x0c, 0xbe, 0x89, 0xa7, + 0xef, 0x3b, 0x3f, 0x5a, 0x6e, 0x85, 0x99, 0x8f, 0x48, 0x48, 0x51, 0xc9, 0x8a, 0x22, + 0x80, 0x18, 0xa0, 0x1e, ], internal_rivk: [ - 0x0a, 0xa9, 0xaa, 0xaa, 0x2c, 0xf1, 0x84, 0x90, 0xdd, 0xf9, 0xa7, 0xe5, 0x21, 0x07, - 0x14, 0x07, 0xea, 0x9b, 0xff, 0xfe, 0x84, 0x34, 0x29, 0xbc, 0x94, 0xa2, 0x88, 0xe8, - 0xa6, 0x06, 0xa7, 0x10, + 0xda, 0x3c, 0xdd, 0x9e, 0x0a, 0x3d, 0x1c, 0x41, 0x3e, 0x51, 0xb5, 0x34, 0x67, 0x7e, + 0x88, 0x3e, 0x85, 0x4b, 0x5f, 0x54, 0xbb, 0xdb, 0xba, 0x05, 0x04, 0xab, 0xb2, 0x2b, + 0x31, 0x5c, 0x4c, 0x1d, ], internal_ivk: [ - 0xa0, 0x6a, 0xbd, 0x29, 0xd5, 0xa1, 0x99, 0xe1, 0xc2, 0x10, 0x25, 0xb0, 0x33, 0x7e, - 0x94, 0x1f, 0x6d, 0x4d, 0x84, 0xeb, 0x7c, 0xc3, 0x5a, 0x39, 0x7f, 0x9e, 0x75, 0x3f, - 0xda, 0xed, 0x81, 0x0d, + 0x29, 0x3f, 0xf5, 0xf5, 0x2b, 0x40, 0xcf, 0x48, 0xeb, 0x4f, 0x21, 0x45, 0x24, 0xad, + 0xed, 0x6b, 0x53, 0x85, 0xf6, 0x09, 0x67, 0x56, 0xec, 0xa3, 0x0d, 0x46, 0xff, 0x47, + 0xa8, 0xc8, 0x6f, 0x0c, ], internal_ovk: [ - 0xf8, 0x2e, 0xb2, 0x49, 0x06, 0xe2, 0x94, 0xff, 0x65, 0x71, 0xac, 0x7d, 0x83, 0x68, - 0xea, 0x82, 0x80, 0xd4, 0x22, 0xf3, 0x47, 0x7c, 0xe7, 0x2a, 0xef, 0x5f, 0x9b, 0x9e, - 0xca, 0x48, 0x46, 0x8f, + 0x0c, 0xfc, 0xe5, 0xec, 0xc4, 0x1f, 0x12, 0x02, 0xcb, 0x61, 0xa4, 0x7f, 0x6d, 0x55, + 0x9a, 0x63, 0x92, 0x25, 0xc5, 0xb4, 0x7a, 0x99, 0x65, 0xc3, 0x02, 0x00, 0xd1, 0xb7, + 0xea, 0x58, 0xc1, 0x30, ], internal_dk: [ - 0x36, 0x56, 0xb5, 0x45, 0xa5, 0x0a, 0x6b, 0x26, 0x28, 0x74, 0x76, 0x64, 0x1b, 0x2b, - 0x68, 0xc6, 0x3c, 0x36, 0xf3, 0x32, 0xe7, 0x45, 0x57, 0xe9, 0x16, 0x05, 0x0f, 0x0b, - 0x91, 0x11, 0x17, 0x9b, + 0x43, 0x81, 0x82, 0x5b, 0x76, 0xeb, 0x8d, 0x47, 0x0a, 0x8b, 0x98, 0xed, 0x53, 0xff, + 0xb4, 0xd1, 0xf2, 0x1e, 0x96, 0x45, 0x0b, 0xe9, 0x4b, 0x15, 0xa8, 0x52, 0x1e, 0xe8, + 0x6f, 0xb6, 0xea, 0xe8, ], - note_v: 14496603531126387959, + asset: [ + 0x67, 0x43, 0xf9, 0x3a, 0x6e, 0xbd, 0xa7, 0x2a, 0x8c, 0x7c, 0x5a, 0x2b, 0x7f, 0xa3, + 0x04, 0xfe, 0x32, 0xb2, 0x9b, 0x4f, 0x70, 0x6a, 0xa8, 0xf7, 0x42, 0x0f, 0x3d, 0x8e, + 0x7a, 0x59, 0x70, 0x2f, + ], + note_v: 15839468553911279642, note_rho: [ - 0x32, 0xb4, 0xf4, 0x73, 0xf4, 0x68, 0xa0, 0x08, 0xe7, 0x23, 0x89, 0xfc, 0x03, 0x88, - 0x0d, 0x78, 0x0c, 0xb0, 0x7f, 0xcf, 0xaa, 0xbe, 0x3f, 0x1a, 0x84, 0xb2, 0x7d, 0xb5, - 0x9a, 0x4a, 0x15, 0x3d, + 0xce, 0xcb, 0x8c, 0xb8, 0xa5, 0xda, 0x01, 0x30, 0x71, 0x52, 0xf1, 0x39, 0x36, 0xa2, + 0x70, 0x57, 0x26, 0x70, 0xdc, 0x82, 0xd3, 0x90, 0x26, 0xc6, 0xcb, 0x4c, 0xd4, 0xb0, + 0xf7, 0xf5, 0xaa, 0x2a, ], note_rseed: [ - 0x88, 0x2d, 0x2b, 0x21, 0x03, 0x59, 0x65, 0x55, 0xed, 0x94, 0x94, 0xc6, 0xac, 0x89, - 0x3c, 0x49, 0x72, 0x38, 0x33, 0xec, 0x89, 0x26, 0xc1, 0x03, 0x95, 0x86, 0xa7, 0xaf, - 0xcf, 0x4a, 0x0d, 0x9c, + 0x4f, 0x5a, 0x53, 0x41, 0xec, 0x5d, 0xd7, 0x15, 0x40, 0x6f, 0x2f, 0xdd, 0x2a, 0xfa, + 0x73, 0x3f, 0x5f, 0x64, 0x1c, 0x8c, 0x21, 0x86, 0x2a, 0x1b, 0xaf, 0xce, 0x26, 0x09, + 0xd9, 0xee, 0xcf, 0xa1, ], note_cmx: [ - 0x03, 0xce, 0x20, 0xce, 0xa1, 0x94, 0xb7, 0x55, 0x9a, 0x8a, 0x90, 0x47, 0x1d, 0x28, - 0xa3, 0xc0, 0x53, 0xc3, 0x72, 0x0a, 0xd4, 0x9f, 0x40, 0xd2, 0x7c, 0x2d, 0xcc, 0xe3, - 0x35, 0x00, 0x56, 0x16, + 0x1b, 0x83, 0x10, 0x6d, 0xf8, 0x12, 0xf5, 0xb3, 0x24, 0xbc, 0x8d, 0xc9, 0x87, 0x02, + 0x52, 0xfd, 0x7a, 0x44, 0xf2, 0xd7, 0x5b, 0xf5, 0x54, 0x41, 0xac, 0x92, 0x5b, 0x45, + 0x82, 0xf9, 0x75, 0x17, ], note_nf: [ - 0x16, 0xfa, 0x2c, 0x34, 0x97, 0xfc, 0x09, 0xad, 0x90, 0xdd, 0x34, 0x92, 0x02, 0xa2, - 0x4b, 0x69, 0x89, 0x2d, 0xc8, 0x06, 0x29, 0xb2, 0xd1, 0xbf, 0xeb, 0xaf, 0x41, 0x70, - 0x8f, 0x0f, 0xb1, 0x0c, + 0x4b, 0xf3, 0xd9, 0x9e, 0x14, 0xdb, 0x5c, 0xa1, 0xb5, 0x81, 0x8d, 0x93, 0x37, 0xe9, + 0x26, 0xb1, 0x3c, 0x55, 0x94, 0x12, 0xd5, 0x61, 0xb6, 0xc7, 0x30, 0x53, 0xe2, 0xc7, + 0xb2, 0x08, 0x5a, 0x2d, ], }, TestVector { sk: [ - 0x73, 0x1e, 0x98, 0x5d, 0x99, 0x58, 0x9c, 0x8b, 0xb8, 0x38, 0xe8, 0xaa, 0xf7, 0x45, - 0x53, 0x3e, 0xd9, 0xe8, 0xae, 0x3a, 0x1c, 0xd0, 0x74, 0xa5, 0x1a, 0x20, 0xda, 0x8a, - 0xba, 0x18, 0xd1, 0xdb, + 0x58, 0xcf, 0xb5, 0xcd, 0x79, 0xf8, 0x80, 0x08, 0xe3, 0x15, 0xdc, 0x7d, 0x83, 0x88, + 0xe7, 0x6c, 0x17, 0x82, 0xfd, 0x27, 0x95, 0xd1, 0x8a, 0x76, 0x36, 0x24, 0xc2, 0x5f, + 0xa9, 0x59, 0xcc, 0x97, ], ask: [ - 0x42, 0x6a, 0x78, 0x44, 0xf3, 0x05, 0xb9, 0xd4, 0xe0, 0x7e, 0xa5, 0x2a, 0x39, 0x00, - 0x1c, 0x9b, 0x33, 0x6c, 0xfc, 0x0d, 0x6f, 0xa1, 0x5e, 0xf3, 0xd1, 0x1c, 0x3d, 0x7b, - 0x74, 0xf0, 0x8c, 0x2d, + 0x74, 0xef, 0xaa, 0xff, 0x27, 0x9c, 0xde, 0x93, 0x36, 0x11, 0x7a, 0xa4, 0x68, 0xb4, + 0xed, 0xdb, 0x70, 0x38, 0xa1, 0x22, 0xef, 0x86, 0x7d, 0xba, 0x05, 0x3e, 0x33, 0x55, + 0x68, 0x0a, 0x8c, 0x3c, ], ak: [ - 0xb1, 0xe0, 0xac, 0xbc, 0x69, 0xbf, 0x37, 0x7b, 0x85, 0xab, 0xf0, 0xf5, 0xa1, 0x0b, - 0xe7, 0x2c, 0x3b, 0x64, 0x00, 0x06, 0xff, 0x08, 0x50, 0x52, 0x80, 0xe4, 0xf0, 0x0f, - 0xad, 0xf7, 0x63, 0x28, + 0xc4, 0x51, 0x8d, 0x3c, 0xde, 0xa6, 0x55, 0xa3, 0x2d, 0xf8, 0xe3, 0xf5, 0xc1, 0x51, + 0xb5, 0x42, 0x32, 0x85, 0x31, 0xca, 0x01, 0xa6, 0x3f, 0x3c, 0x03, 0xa3, 0xc2, 0x4e, + 0xa7, 0x32, 0x82, 0x3a, + ], + isk: [ + 0x48, 0x9c, 0xe7, 0x57, 0x45, 0x82, 0x4b, 0x77, 0x86, 0x8c, 0x53, 0x23, 0x9c, 0xfb, + 0xdf, 0x73, 0xca, 0xec, 0x65, 0x60, 0x40, 0x37, 0x31, 0x4f, 0xaa, 0xce, 0xb5, 0x62, + 0x18, 0xc6, 0xbd, 0x30, + ], + ik: [ + 0xed, 0x56, 0xef, 0x8b, 0x55, 0x28, 0x00, 0x0f, 0xc2, 0xee, 0xf3, 0x33, 0x50, 0x8f, + 0x4c, 0x32, 0x71, 0x62, 0xd8, 0x96, 0x3b, 0xad, 0x50, 0xcc, 0x55, 0xdc, 0x03, 0x7d, + 0xb9, 0x60, 0x7f, 0x52, ], nk: [ - 0xcf, 0x36, 0xad, 0x6a, 0x06, 0x6c, 0xd2, 0x13, 0xe1, 0xd7, 0x67, 0xab, 0x07, 0x1d, - 0xc1, 0x16, 0x78, 0x85, 0xc4, 0x16, 0x8b, 0xc2, 0xe2, 0x17, 0x54, 0x48, 0x56, 0x3a, - 0xd1, 0x3f, 0x33, 0x3d, + 0x76, 0xff, 0xc1, 0xbb, 0x8d, 0xd7, 0xfb, 0x48, 0x7d, 0x48, 0xd0, 0x94, 0x29, 0x66, + 0x0b, 0xbc, 0x1d, 0xfc, 0xbf, 0x57, 0xc4, 0xa5, 0xa3, 0x21, 0x33, 0x24, 0x33, 0x44, + 0x70, 0xed, 0xdf, 0x33, ], rivk: [ - 0xc4, 0x1b, 0xba, 0xd3, 0x51, 0x05, 0xa8, 0x03, 0x14, 0xb7, 0x96, 0x24, 0xb6, 0x75, - 0x24, 0x12, 0x20, 0xb3, 0x31, 0xf1, 0x25, 0x92, 0x61, 0x7b, 0xdb, 0x70, 0x5b, 0xfc, - 0xce, 0x72, 0xae, 0x38, + 0x22, 0xe2, 0xf3, 0x90, 0x11, 0xe6, 0x70, 0xc8, 0x0f, 0xba, 0xc8, 0x91, 0x59, 0xac, + 0x63, 0x4d, 0x84, 0xd7, 0xc1, 0x3e, 0xbe, 0xfb, 0x97, 0x3b, 0xa4, 0x1f, 0x0c, 0x79, + 0xf0, 0x33, 0xfc, 0x3f, ], ivk: [ - 0xf7, 0x9f, 0xe8, 0x02, 0xe4, 0xd2, 0x43, 0x07, 0xa6, 0xaa, 0xf8, 0x5d, 0x19, 0xf5, - 0xe0, 0x83, 0x37, 0x40, 0xba, 0xe5, 0x98, 0xdc, 0x7c, 0x88, 0x0a, 0xc6, 0x09, 0x63, - 0x1d, 0xe1, 0x58, 0x19, + 0xe6, 0x80, 0xf5, 0xa7, 0x15, 0xb3, 0x2b, 0x9e, 0x1a, 0x14, 0x67, 0x9f, 0x11, 0x16, + 0xf1, 0x13, 0xaa, 0x04, 0x93, 0xf3, 0x82, 0x1b, 0x10, 0x8c, 0xa7, 0xe1, 0xc0, 0x71, + 0xad, 0x75, 0x2d, 0x22, ], ovk: [ - 0xf9, 0x63, 0x66, 0xbc, 0x6e, 0xab, 0xd2, 0x32, 0x54, 0x9e, 0xbb, 0x43, 0xb4, 0xed, - 0x6f, 0xd8, 0x1d, 0x33, 0x03, 0x73, 0xc5, 0xb5, 0x66, 0x90, 0x4e, 0x9a, 0xf1, 0x1a, - 0x6b, 0xab, 0x8d, 0x77, + 0x2a, 0x34, 0xab, 0x11, 0xc4, 0x0c, 0x6b, 0x3b, 0x28, 0x54, 0x56, 0xa6, 0x91, 0x54, + 0xcb, 0xe4, 0x4c, 0xba, 0x01, 0xda, 0x6d, 0xb0, 0xc2, 0xb2, 0x2b, 0x84, 0xca, 0x27, + 0x2b, 0xae, 0x01, 0xad, ], dk: [ - 0x80, 0x3e, 0x34, 0x85, 0x73, 0x02, 0x2b, 0xf8, 0x93, 0x2f, 0x23, 0xee, 0x7a, 0x32, - 0x5e, 0xa2, 0x83, 0x87, 0x9c, 0x65, 0x24, 0x12, 0xb8, 0x60, 0x6b, 0xe3, 0x19, 0x8c, - 0x4b, 0x78, 0x2c, 0x47, + 0xfa, 0xaa, 0xb4, 0xb9, 0x32, 0x46, 0x23, 0xc6, 0xc8, 0x6b, 0xd5, 0xdb, 0x70, 0xa7, + 0x18, 0xd9, 0x0b, 0xc0, 0xf1, 0x5b, 0x2b, 0x39, 0xeb, 0xfa, 0x82, 0xb5, 0xb1, 0xcc, + 0x14, 0x67, 0x0c, 0xbe, ], default_d: [ - 0xdb, 0x8c, 0x30, 0x55, 0x24, 0xbc, 0x0d, 0xea, 0xa8, 0x5d, 0x97, + 0x66, 0x4c, 0xab, 0xf8, 0xf7, 0x68, 0x93, 0xcb, 0x8d, 0xa7, 0x84, ], default_pk_d: [ - 0x04, 0xea, 0x8c, 0x13, 0x20, 0xff, 0xbb, 0xad, 0xfe, 0x96, 0xf0, 0xc6, 0xff, 0x16, - 0xb6, 0x07, 0x11, 0x1b, 0x55, 0x83, 0xbf, 0xb6, 0xf1, 0xea, 0x45, 0x27, 0x5e, 0xf2, - 0xaa, 0x2d, 0x87, 0x9b, + 0x07, 0x7c, 0x84, 0x57, 0x8b, 0x1d, 0xae, 0x2f, 0x80, 0x69, 0xef, 0x67, 0xd2, 0x87, + 0x71, 0x8d, 0xaf, 0xf5, 0xa1, 0x69, 0x4e, 0x1a, 0x8e, 0xa2, 0x36, 0xc9, 0xe6, 0x94, + 0x61, 0x5f, 0xb8, 0x16, ], internal_rivk: [ - 0x9e, 0x45, 0x2a, 0xb7, 0x2c, 0x6c, 0x8e, 0xcc, 0xf2, 0xe4, 0x39, 0xa0, 0xce, 0xc0, - 0xa0, 0xac, 0x39, 0x4a, 0x1a, 0xa1, 0x21, 0xac, 0x60, 0x32, 0xa7, 0xeb, 0xc2, 0x9d, - 0xb4, 0x85, 0x62, 0x26, + 0xc4, 0x01, 0xbc, 0x90, 0x7a, 0xaa, 0xed, 0xd1, 0x3b, 0x1f, 0xa7, 0x0d, 0x7a, 0xb2, + 0x8d, 0x71, 0x3b, 0x46, 0x38, 0xeb, 0xfb, 0xc8, 0xf9, 0xcc, 0x1d, 0xae, 0xd5, 0xac, + 0x2b, 0x76, 0x75, 0x33, ], internal_ivk: [ - 0x3b, 0xa9, 0x3b, 0x0f, 0xc3, 0xf2, 0x7a, 0xb2, 0x17, 0x63, 0x5d, 0x03, 0xf9, 0x0d, - 0x0b, 0x84, 0x2d, 0x99, 0xa1, 0x2c, 0xdc, 0x37, 0xa8, 0x1c, 0x18, 0x1e, 0xc0, 0x18, - 0xe5, 0xf4, 0x4c, 0x11, + 0xea, 0x9b, 0xeb, 0x2d, 0x19, 0x6a, 0xd4, 0x79, 0x69, 0xf2, 0x03, 0xdd, 0x28, 0xa0, + 0xfb, 0xe2, 0x4b, 0x98, 0x12, 0xb1, 0x15, 0x5b, 0x17, 0x01, 0x96, 0x36, 0x6a, 0xcd, + 0x62, 0xf5, 0xeb, 0x0c, ], internal_ovk: [ - 0xe3, 0xc7, 0xf8, 0x6c, 0x1b, 0x23, 0x83, 0xb3, 0xbd, 0x41, 0xad, 0x1a, 0x8f, 0x11, - 0xef, 0xa2, 0x55, 0x4a, 0x41, 0x0a, 0x98, 0xc8, 0x92, 0x07, 0xae, 0xb4, 0x31, 0x9b, - 0x1a, 0xbd, 0x78, 0x79, + 0x2f, 0x6d, 0x74, 0x4f, 0x40, 0xd6, 0xdc, 0xe6, 0x5e, 0x33, 0x5d, 0x3c, 0xb3, 0x96, + 0xc5, 0xaf, 0x54, 0xf0, 0xf7, 0xd5, 0x4f, 0xb4, 0x37, 0xec, 0x8e, 0x20, 0x29, 0x28, + 0x05, 0x8e, 0xfa, 0xdf, ], internal_dk: [ - 0xd7, 0x1a, 0x68, 0xcf, 0xd6, 0xc7, 0x68, 0xf4, 0x30, 0x73, 0xf6, 0x98, 0x18, 0x9a, - 0xc7, 0x5e, 0xe4, 0x21, 0xb4, 0x20, 0x4b, 0xb6, 0xf3, 0xc5, 0xd0, 0xfc, 0x43, 0x28, - 0x49, 0xaa, 0x71, 0x61, + 0x9f, 0xec, 0x61, 0xd0, 0x20, 0xb9, 0x29, 0x37, 0xbd, 0xf3, 0xc3, 0xce, 0x09, 0x43, + 0x3d, 0xdf, 0x01, 0xd4, 0xab, 0xe7, 0x43, 0x93, 0x94, 0x6e, 0x49, 0xcd, 0x79, 0xd1, + 0x19, 0x86, 0xb9, 0xfe, + ], + asset: [ + 0x67, 0x43, 0xf9, 0x3a, 0x6e, 0xbd, 0xa7, 0x2a, 0x8c, 0x7c, 0x5a, 0x2b, 0x7f, 0xa3, + 0x04, 0xfe, 0x32, 0xb2, 0x9b, 0x4f, 0x70, 0x6a, 0xa8, 0xf7, 0x42, 0x0f, 0x3d, 0x8e, + 0x7a, 0x59, 0x70, 0x2f, ], - note_v: 6792346249443327211, + note_v: 4573834453415770104, note_rho: [ - 0x4b, 0x19, 0x22, 0x32, 0xec, 0xb9, 0xf0, 0xc0, 0x24, 0x11, 0xe5, 0x25, 0x96, 0xbc, - 0x5e, 0x90, 0x45, 0x7e, 0x74, 0x59, 0x39, 0xff, 0xed, 0xbd, 0x12, 0x86, 0x3c, 0xe7, - 0x1a, 0x02, 0xaf, 0x11, + 0x21, 0xa9, 0xfb, 0x80, 0xad, 0x03, 0xbc, 0x0c, 0xda, 0x4a, 0x44, 0x94, 0x6c, 0x00, + 0xe1, 0xb1, 0xa1, 0xdf, 0x0e, 0x5b, 0x87, 0xb5, 0xbe, 0xce, 0x47, 0x7a, 0x70, 0x96, + 0x49, 0xe9, 0x50, 0x06, ], note_rseed: [ - 0x7d, 0x41, 0x7a, 0xdb, 0x3d, 0x15, 0xcc, 0x54, 0xdc, 0xb1, 0xfc, 0xe4, 0x67, 0x50, - 0x0c, 0x6b, 0x8f, 0xb8, 0x6b, 0x12, 0xb5, 0x6d, 0xa9, 0xc3, 0x82, 0x85, 0x7d, 0xee, - 0xcc, 0x40, 0xa9, 0x8d, + 0x05, 0x91, 0x39, 0x48, 0x12, 0x95, 0x1e, 0x1f, 0xe3, 0x89, 0x5b, 0x8c, 0xc3, 0xd1, + 0x4d, 0x2c, 0xf6, 0x55, 0x6d, 0xf6, 0xed, 0x4b, 0x4d, 0xdd, 0x3d, 0x9a, 0x69, 0xf5, + 0x33, 0x57, 0xd7, 0x76, ], note_cmx: [ - 0xa9, 0xb1, 0x1b, 0xaf, 0x30, 0x34, 0xb6, 0x5c, 0x64, 0x24, 0x84, 0x1b, 0xfe, 0x02, - 0x3f, 0x8e, 0xda, 0x13, 0x13, 0xc3, 0x0a, 0xa2, 0x7d, 0xe9, 0x2e, 0x21, 0xa1, 0x08, - 0x31, 0x6e, 0x82, 0x19, + 0xbb, 0x2d, 0xd3, 0x29, 0xdf, 0xca, 0x48, 0xdc, 0x11, 0x56, 0x36, 0x58, 0xd0, 0x7e, + 0x20, 0x4a, 0x1d, 0x21, 0x2d, 0x20, 0x27, 0xe1, 0x45, 0x7c, 0xe6, 0x96, 0x8c, 0xdf, + 0xb0, 0x07, 0x7e, 0x04, ], note_nf: [ - 0x72, 0xd6, 0x30, 0x89, 0x60, 0x35, 0x1f, 0x7b, 0x26, 0xfa, 0x64, 0x60, 0x3f, 0xe4, - 0xdf, 0xd8, 0x67, 0xbd, 0x5e, 0xb3, 0x67, 0xba, 0x2b, 0x7c, 0xa4, 0x91, 0xc9, 0x23, - 0xc0, 0xea, 0xd2, 0x22, + 0xd4, 0x0c, 0xe3, 0x47, 0xb2, 0x3e, 0x26, 0x36, 0xc2, 0xb4, 0xc5, 0x43, 0x39, 0x50, + 0x26, 0xab, 0xb4, 0xa1, 0x5f, 0x28, 0xf9, 0x0a, 0x67, 0xb7, 0x08, 0xd6, 0x4b, 0x22, + 0x6f, 0x3a, 0x39, 0x31, ], }, TestVector { sk: [ - 0x5f, 0x29, 0x35, 0x39, 0x5e, 0xe4, 0x76, 0x2d, 0xd2, 0x1a, 0xfd, 0xbb, 0x5d, 0x47, - 0xfa, 0x9a, 0x6d, 0xd9, 0x84, 0xd5, 0x67, 0xdb, 0x28, 0x57, 0xb9, 0x27, 0xb7, 0xfa, - 0xe2, 0xdb, 0x58, 0x71, + 0x7f, 0x4f, 0x5c, 0xcb, 0xdb, 0xc5, 0x96, 0x63, 0x12, 0x77, 0xf8, 0xfe, 0xcd, 0x08, + 0xcb, 0x05, 0x6b, 0x95, 0xe3, 0x02, 0x5b, 0x97, 0x92, 0xff, 0xf7, 0xf2, 0x44, 0xfc, + 0x71, 0x62, 0x69, 0xb9, ], ask: [ - 0x11, 0x80, 0x73, 0x28, 0x51, 0x64, 0xe6, 0x55, 0x73, 0x58, 0xfb, 0xc4, 0x1a, 0x81, - 0x35, 0xcb, 0x06, 0x2f, 0x86, 0x76, 0xcb, 0x61, 0xf9, 0xaa, 0x52, 0xd1, 0x9a, 0x09, - 0xfa, 0xc5, 0x58, 0x02, + 0x0a, 0xfd, 0x61, 0xd4, 0x12, 0x57, 0xb5, 0xe9, 0x36, 0xb9, 0x29, 0x29, 0xa3, 0xe1, + 0xb8, 0x7d, 0x60, 0x89, 0x7c, 0xb3, 0xdc, 0x8e, 0x77, 0x3f, 0x4f, 0xa1, 0xef, 0x40, + 0xef, 0xb5, 0x4b, 0x04, ], ak: [ - 0x0d, 0x26, 0x2d, 0xe3, 0x60, 0x94, 0x33, 0xfe, 0x5b, 0x7c, 0x86, 0x2b, 0xc4, 0x8e, - 0xf5, 0x6d, 0x83, 0x20, 0x09, 0xf7, 0x24, 0x2e, 0x1f, 0x7c, 0x77, 0x0a, 0x12, 0x24, - 0x1d, 0xfa, 0x28, 0x07, + 0x84, 0x7e, 0xc5, 0xb1, 0xe3, 0xdd, 0xfd, 0x93, 0xca, 0x0c, 0x67, 0xea, 0x48, 0x1b, + 0x40, 0x5b, 0xae, 0xef, 0x48, 0xb0, 0xf2, 0x7f, 0x87, 0xb8, 0x1f, 0xed, 0x32, 0xae, + 0x56, 0x31, 0x6f, 0x04, + ], + isk: [ + 0x26, 0xd6, 0x2e, 0x95, 0x96, 0xfa, 0x82, 0x5c, 0x6b, 0xf2, 0x1a, 0xff, 0x9e, 0x68, + 0x62, 0x5a, 0x19, 0x24, 0x40, 0xea, 0x06, 0x82, 0x81, 0x23, 0xd9, 0x78, 0x84, 0x80, + 0x6f, 0x15, 0xfa, 0x08, + ], + ik: [ + 0x95, 0x9c, 0x44, 0x8d, 0xaf, 0xb6, 0xb7, 0xc2, 0x54, 0x90, 0x42, 0xdd, 0x75, 0x7a, + 0x81, 0xfa, 0x16, 0xca, 0xd4, 0xd2, 0x7f, 0xc1, 0x5f, 0x45, 0x33, 0xcd, 0xe2, 0x0c, + 0xc5, 0xb5, 0xcd, 0xc9, ], nk: [ - 0x51, 0xba, 0xf3, 0x33, 0xcf, 0xf1, 0xf2, 0xd0, 0xc7, 0xe3, 0xcf, 0xf4, 0xd3, 0x01, - 0x29, 0x9d, 0xc1, 0xef, 0xe9, 0x83, 0x00, 0x31, 0x4a, 0x54, 0x19, 0x38, 0x02, 0x9b, - 0x45, 0xcc, 0x15, 0x21, + 0xd7, 0xd8, 0xf3, 0xd5, 0x18, 0x22, 0xd3, 0x4a, 0xdf, 0x86, 0xeb, 0xd3, 0x53, 0x36, + 0x47, 0x73, 0x2c, 0x03, 0xf6, 0x42, 0xd6, 0xed, 0x06, 0xff, 0x61, 0xd2, 0x50, 0xd6, + 0xba, 0xfd, 0x59, 0x37, ], rivk: [ - 0x22, 0x8f, 0xeb, 0x79, 0x21, 0x98, 0x73, 0xc7, 0xa7, 0x60, 0x6e, 0x52, 0x97, 0x3c, - 0x85, 0xf4, 0x60, 0x46, 0x5a, 0x60, 0x59, 0x08, 0x39, 0x19, 0xed, 0x73, 0xeb, 0x80, - 0x5c, 0x11, 0x83, 0x01, + 0xae, 0xea, 0xd1, 0x3e, 0x25, 0x36, 0xe8, 0xcb, 0xa6, 0x24, 0x46, 0xd8, 0xff, 0x10, + 0x99, 0x88, 0xce, 0xa9, 0xb2, 0x57, 0xce, 0xaf, 0xc8, 0xd2, 0x0b, 0x85, 0x07, 0xcc, + 0xc9, 0x81, 0x58, 0x2a, ], ivk: [ - 0x76, 0xf4, 0x9c, 0xf8, 0xa3, 0x19, 0x21, 0x85, 0x61, 0x6a, 0x9a, 0x0d, 0xa0, 0xc7, - 0x6e, 0xc2, 0xc2, 0x75, 0x61, 0x59, 0xbc, 0xe1, 0x86, 0xa1, 0x86, 0x2b, 0x6e, 0x6e, - 0x59, 0x44, 0x2d, 0x11, + 0x83, 0xbb, 0x91, 0x72, 0x72, 0xb0, 0xa0, 0x4b, 0x78, 0x21, 0xfb, 0x8e, 0xef, 0xd5, + 0x7b, 0xdb, 0x15, 0xa0, 0x28, 0x28, 0x73, 0x95, 0x46, 0x28, 0x5e, 0x7f, 0x19, 0x78, + 0x17, 0x43, 0xaa, 0x10, ], ovk: [ - 0xeb, 0x72, 0xb6, 0xc3, 0x1e, 0x83, 0x7f, 0xd8, 0x37, 0xaa, 0xcb, 0x61, 0xfa, 0xba, - 0xce, 0x75, 0xa1, 0x9d, 0xd9, 0xdd, 0x5b, 0x4b, 0x3a, 0x3e, 0xe7, 0x23, 0xc1, 0x4d, - 0xa7, 0x7b, 0x4b, 0xe8, + 0x48, 0x25, 0xc8, 0x9b, 0xc8, 0xef, 0x4d, 0x75, 0x50, 0xa8, 0xdc, 0x1b, 0xda, 0x47, + 0xc4, 0xe4, 0x1a, 0x30, 0xca, 0x56, 0x72, 0x26, 0xd0, 0xb3, 0x78, 0xb0, 0xb9, 0xcc, + 0xb2, 0xfb, 0x36, 0xe5, ], dk: [ - 0xee, 0x19, 0xf8, 0xdd, 0xd9, 0xda, 0x06, 0x34, 0x24, 0x51, 0x43, 0xc4, 0xb4, 0x3a, - 0xfc, 0x7d, 0x78, 0xc5, 0x49, 0xc8, 0x20, 0x54, 0xa9, 0xd8, 0x40, 0x07, 0xb5, 0x62, - 0x17, 0xdb, 0xfd, 0xd6, + 0x17, 0x84, 0x93, 0x0e, 0xf3, 0xd2, 0x6a, 0xce, 0x1e, 0xad, 0xb7, 0x0b, 0x38, 0x81, + 0x0b, 0x98, 0xf1, 0x82, 0x33, 0x8d, 0x54, 0xff, 0xe8, 0x37, 0x78, 0xf2, 0x7b, 0xe2, + 0xd1, 0x20, 0x67, 0xc0, ], default_d: [ - 0xaa, 0xe3, 0x6e, 0x09, 0x4d, 0xe0, 0x7b, 0xc1, 0x6f, 0x89, 0x8e, + 0x46, 0x3b, 0x71, 0x6d, 0x24, 0xdd, 0x01, 0x02, 0x03, 0xa7, 0x29, ], default_pk_d: [ - 0xb6, 0x53, 0x3d, 0xcb, 0xff, 0xf0, 0xf6, 0xc1, 0xce, 0xef, 0xa8, 0x47, 0x99, 0xbd, - 0xa3, 0xde, 0x73, 0x34, 0x32, 0x6c, 0xcd, 0x65, 0xf7, 0xce, 0x92, 0xff, 0x3d, 0x9e, - 0x6e, 0x1f, 0x14, 0x0b, + 0x9e, 0x22, 0xd0, 0x82, 0xbf, 0xbe, 0x2f, 0x05, 0x20, 0x69, 0x13, 0xa8, 0x63, 0x15, + 0xf0, 0x80, 0xbb, 0x87, 0xe7, 0x87, 0xff, 0x51, 0x84, 0x53, 0xb0, 0x85, 0x0b, 0xc3, + 0x57, 0xd9, 0x18, 0x06, ], internal_rivk: [ - 0x25, 0x44, 0x06, 0x72, 0x3b, 0x06, 0x67, 0xaf, 0x27, 0xe5, 0x1c, 0xb3, 0xce, 0x8f, - 0xa1, 0x38, 0x81, 0x64, 0xd9, 0x43, 0x76, 0xc8, 0x50, 0xbd, 0xdb, 0x39, 0xe9, 0xbe, - 0xa5, 0xfa, 0x96, 0x05, + 0xdf, 0x5f, 0x4f, 0x62, 0x55, 0x28, 0xd5, 0x6b, 0x2e, 0x64, 0xaf, 0x93, 0xb4, 0x79, + 0xbf, 0x1c, 0x3b, 0x37, 0xab, 0x8a, 0xcb, 0x9b, 0x9d, 0x4a, 0x75, 0x75, 0xcc, 0x75, + 0x2a, 0x9c, 0x08, 0x1b, ], internal_ivk: [ - 0xba, 0xd4, 0x83, 0x7b, 0xa7, 0x88, 0x22, 0xb8, 0xb1, 0x65, 0xb0, 0xa1, 0x6e, 0x11, - 0x04, 0xc7, 0x05, 0xc3, 0xc0, 0xe3, 0x82, 0xd3, 0xf1, 0x3c, 0x19, 0x5c, 0x0e, 0xf3, - 0x11, 0xbb, 0x80, 0x04, + 0xe3, 0x3c, 0xea, 0x19, 0xf7, 0x6a, 0x3b, 0xdc, 0x49, 0xc3, 0x2e, 0x32, 0x2f, 0xeb, + 0x87, 0x0e, 0xd2, 0xae, 0x18, 0x57, 0xca, 0x47, 0x03, 0x4a, 0x01, 0x60, 0x40, 0x0e, + 0x9c, 0xeb, 0x4c, 0x2b, ], internal_ovk: [ - 0xb9, 0x11, 0x3a, 0x95, 0x2d, 0xcc, 0x1e, 0x15, 0xc3, 0x4d, 0x13, 0x66, 0x03, 0xa2, - 0xef, 0x25, 0x4a, 0x38, 0x75, 0x5a, 0x55, 0x7f, 0xa9, 0xf8, 0x8c, 0x14, 0x3b, 0xd3, - 0x07, 0x64, 0x41, 0xb0, + 0xc9, 0x3d, 0x92, 0x4f, 0x45, 0x96, 0x08, 0xef, 0x68, 0xa6, 0x36, 0xe2, 0xe2, 0xfe, + 0xd5, 0xeb, 0x9b, 0xe3, 0x8c, 0xeb, 0xae, 0x57, 0x1d, 0x0e, 0xeb, 0xf3, 0xe8, 0xa5, + 0x37, 0x4f, 0x99, 0x71, ], internal_dk: [ - 0x02, 0xb5, 0x2c, 0x6e, 0xd9, 0xad, 0x49, 0xfb, 0x38, 0xe4, 0x44, 0x7c, 0x69, 0xb5, - 0x70, 0xeb, 0xd0, 0x55, 0xe4, 0xc7, 0xfd, 0x91, 0xc0, 0x20, 0xff, 0x43, 0x46, 0x1d, - 0x14, 0xe0, 0x2f, 0x29, + 0xec, 0xe1, 0xd3, 0x58, 0x8f, 0xc5, 0x0a, 0xa1, 0xf1, 0x06, 0x5d, 0x93, 0xf5, 0xd8, + 0xcf, 0xca, 0xf1, 0x35, 0x3a, 0xe1, 0xab, 0x39, 0x58, 0x9a, 0xb9, 0x28, 0xdf, 0xda, + 0xfe, 0x36, 0x84, 0x43, + ], + asset: [ + 0x67, 0x43, 0xf9, 0x3a, 0x6e, 0xbd, 0xa7, 0x2a, 0x8c, 0x7c, 0x5a, 0x2b, 0x7f, 0xa3, + 0x04, 0xfe, 0x32, 0xb2, 0x9b, 0x4f, 0x70, 0x6a, 0xa8, 0xf7, 0x42, 0x0f, 0x3d, 0x8e, + 0x7a, 0x59, 0x70, 0x2f, ], - note_v: 4079549063511228677, + note_v: 18438745196586160858, note_rho: [ - 0x26, 0x70, 0xdc, 0x82, 0xd3, 0x90, 0x26, 0xc6, 0xcb, 0x4c, 0xd4, 0xb0, 0xf7, 0xf5, - 0xaa, 0x2a, 0x4f, 0x5a, 0x53, 0x41, 0xec, 0x5d, 0xd7, 0x15, 0x40, 0x6f, 0x2f, 0xdd, - 0x2a, 0xfa, 0x73, 0x3f, + 0x1a, 0xbd, 0x5c, 0xe4, 0xfd, 0xdf, 0xcc, 0xfc, 0x3a, 0x61, 0x28, 0xae, 0xf7, 0x84, + 0xa6, 0x46, 0x10, 0xa8, 0x9d, 0x1a, 0x70, 0x99, 0x21, 0x6d, 0x08, 0x14, 0xd3, 0xa2, + 0xd4, 0x52, 0x43, 0x1c, ], note_rseed: [ - 0x5f, 0x64, 0x1c, 0x8c, 0x21, 0x86, 0x2a, 0x1b, 0xaf, 0xce, 0x26, 0x09, 0xd9, 0xee, - 0xcf, 0xa1, 0x58, 0xcf, 0xb5, 0xcd, 0x79, 0xf8, 0x80, 0x08, 0xe3, 0x15, 0xdc, 0x7d, - 0x83, 0x88, 0xe7, 0x6c, + 0x32, 0xd4, 0x11, 0xac, 0x1c, 0xce, 0x82, 0xad, 0x02, 0x29, 0x40, 0x7b, 0xbc, 0x48, + 0x98, 0x56, 0x75, 0xe3, 0xf8, 0x74, 0xa4, 0x53, 0x3f, 0x1d, 0x63, 0xa8, 0x4d, 0xfa, + 0x3e, 0x0f, 0x46, 0x0f, ], note_cmx: [ - 0x0f, 0xfb, 0xca, 0x1d, 0x59, 0x21, 0xfa, 0x0a, 0x8c, 0x51, 0x16, 0xae, 0x13, 0x7e, - 0x37, 0xf2, 0xc1, 0x18, 0xd5, 0x21, 0x25, 0x62, 0x8d, 0x8a, 0x3f, 0x41, 0x2c, 0xe0, - 0xe6, 0x53, 0x0e, 0x04, + 0xd6, 0x3a, 0x49, 0x61, 0x70, 0x68, 0x72, 0xdd, 0xf4, 0x0b, 0x6d, 0xd2, 0xa9, 0xc9, + 0xc1, 0xdb, 0xec, 0xb9, 0x7e, 0x72, 0xf0, 0x3f, 0x2f, 0x5a, 0xdd, 0x8b, 0x63, 0x53, + 0xe3, 0x9e, 0x59, 0x10, ], note_nf: [ - 0xe6, 0x2b, 0x8e, 0xd8, 0x35, 0x40, 0x14, 0x6c, 0xd2, 0x3c, 0xac, 0x74, 0xee, 0xd7, - 0xd7, 0x73, 0xd8, 0x02, 0x24, 0xa5, 0xaa, 0x30, 0xd6, 0x8e, 0x35, 0x57, 0x2e, 0xe8, - 0x83, 0xd1, 0xb7, 0x04, + 0x7e, 0xbe, 0xaa, 0x1a, 0x59, 0xed, 0x46, 0x01, 0x45, 0x8b, 0xa4, 0x6d, 0xcc, 0x96, + 0x2e, 0xd8, 0x1c, 0x15, 0xc7, 0x7f, 0x7e, 0x44, 0x52, 0x48, 0xe4, 0xfb, 0x52, 0x1e, + 0x59, 0xaa, 0x23, 0x1c, ], }, TestVector { sk: [ - 0x17, 0x82, 0xfd, 0x27, 0x95, 0xd1, 0x8a, 0x76, 0x36, 0x24, 0xc2, 0x5f, 0xa9, 0x59, - 0xcc, 0x97, 0x48, 0x9c, 0xe7, 0x57, 0x45, 0x82, 0x4b, 0x77, 0x86, 0x8c, 0x53, 0x23, - 0x9c, 0xfb, 0xdf, 0x73, + 0xe2, 0xf5, 0x7e, 0x34, 0xfb, 0xc7, 0x54, 0x23, 0xc3, 0x73, 0x7f, 0x5b, 0x2a, 0x06, + 0x15, 0xf5, 0x72, 0x2d, 0xb0, 0x41, 0xa3, 0xef, 0x66, 0xfa, 0x48, 0x3a, 0xfd, 0x3c, + 0x2e, 0x19, 0xe5, 0x94, ], ask: [ - 0xf6, 0xef, 0x32, 0x8d, 0x24, 0x76, 0x1d, 0x6d, 0x3c, 0xcd, 0x25, 0xd4, 0x71, 0x96, - 0xe8, 0x10, 0x9c, 0x03, 0x8f, 0xe1, 0x7c, 0x59, 0xa7, 0xf0, 0x5b, 0x98, 0xd6, 0x6b, - 0xeb, 0xc6, 0x41, 0x24, + 0x12, 0x4b, 0x26, 0x4c, 0x66, 0x07, 0xd3, 0x43, 0x5b, 0x4b, 0xbb, 0x10, 0x39, 0x31, + 0x4b, 0x39, 0x60, 0x4f, 0x06, 0x54, 0x10, 0x0e, 0xa9, 0x0a, 0x3f, 0x9b, 0xfa, 0xe5, + 0x4a, 0x45, 0xa8, 0x36, ], ak: [ - 0xd1, 0x17, 0x87, 0xca, 0x58, 0x2f, 0x94, 0x8e, 0x45, 0x07, 0x18, 0xb3, 0x69, 0x98, - 0xdf, 0x28, 0xbb, 0x0f, 0x10, 0x21, 0xea, 0x84, 0x3f, 0x86, 0x7f, 0x8a, 0x17, 0x0f, - 0x5c, 0x33, 0x90, 0x1f, + 0xbe, 0xbc, 0xa2, 0xb4, 0x46, 0x40, 0x91, 0x6a, 0xbf, 0x7e, 0xab, 0xb3, 0x44, 0x48, + 0xef, 0x19, 0xec, 0x7c, 0x02, 0x32, 0x8b, 0x12, 0x5e, 0xb5, 0xa1, 0x04, 0xcc, 0xf3, + 0x08, 0xfb, 0xd0, 0x3c, + ], + isk: [ + 0x44, 0xa6, 0x4a, 0xdd, 0x6d, 0xf1, 0xd9, 0x63, 0xf5, 0xdd, 0x5b, 0x50, 0x10, 0xd3, + 0xd0, 0x25, 0xf0, 0x28, 0x7c, 0x4c, 0xf1, 0x9c, 0x75, 0xf3, 0x3d, 0x51, 0xdd, 0xdd, + 0xba, 0x5d, 0x65, 0x7b, + ], + ik: [ + 0x0b, 0x93, 0xf6, 0x34, 0x6e, 0x57, 0x23, 0x27, 0x1b, 0x60, 0x7b, 0xc8, 0x08, 0x68, + 0x08, 0xf1, 0xbb, 0x03, 0x5d, 0x0d, 0xe5, 0x52, 0x4d, 0x06, 0x48, 0x08, 0x31, 0xe7, + 0x16, 0x31, 0x52, 0xd7, ], nk: [ - 0x9e, 0x99, 0x7d, 0x9d, 0x26, 0x97, 0x87, 0x26, 0x8e, 0x09, 0x2a, 0x7c, 0x85, 0x41, - 0x7d, 0xa5, 0x30, 0xea, 0x42, 0xfa, 0xc6, 0x68, 0xa7, 0x49, 0xaf, 0x55, 0xdf, 0xb7, - 0x1c, 0xdb, 0xbe, 0x09, + 0x49, 0xaf, 0xb9, 0xd3, 0x17, 0x63, 0x82, 0x90, 0x2b, 0x98, 0x5d, 0x7b, 0x04, 0xb3, + 0x77, 0x7b, 0x3e, 0x93, 0xf9, 0x25, 0xc0, 0xcf, 0x09, 0x40, 0x22, 0x91, 0xd6, 0x90, + 0x9d, 0x8b, 0x64, 0x0b, ], rivk: [ - 0x13, 0x6c, 0x6f, 0xe2, 0xe2, 0xb7, 0x9c, 0x51, 0x56, 0xdb, 0x50, 0x47, 0xd8, 0xd5, - 0xe7, 0x95, 0xdf, 0xc0, 0xbd, 0xc0, 0x88, 0x08, 0x53, 0xa4, 0x4a, 0xdb, 0x73, 0x92, - 0xc0, 0x2f, 0x94, 0x1b, + 0x29, 0x1c, 0xe2, 0x3e, 0x99, 0x33, 0x8b, 0x88, 0x3c, 0x3e, 0xcc, 0x93, 0xed, 0x61, + 0x59, 0x74, 0x83, 0xea, 0x1f, 0xbc, 0x78, 0x3f, 0xa4, 0x5b, 0xa7, 0xba, 0xf8, 0xfb, + 0x14, 0x78, 0xfe, 0x1a, ], ivk: [ - 0x02, 0x8b, 0x64, 0x05, 0x64, 0xb2, 0x49, 0x05, 0xde, 0x92, 0x92, 0xba, 0x5b, 0x98, - 0x10, 0xad, 0xdd, 0x86, 0xbe, 0xd0, 0xfb, 0x3b, 0x2d, 0x6b, 0x37, 0xf2, 0x6d, 0xd2, - 0x38, 0xa7, 0xdb, 0x13, + 0x61, 0x58, 0x87, 0xc8, 0x04, 0xac, 0x73, 0x06, 0x24, 0x51, 0x93, 0x54, 0x3f, 0x8a, + 0x8b, 0x20, 0xde, 0x76, 0x67, 0xba, 0xdd, 0xd3, 0x52, 0x64, 0x78, 0x07, 0x63, 0x37, + 0x49, 0x20, 0xd1, 0x1f, ], ovk: [ - 0x98, 0xd6, 0xa4, 0xbf, 0x68, 0x01, 0xd8, 0xba, 0x0d, 0x0b, 0x67, 0xea, 0x7b, 0x80, - 0x52, 0x07, 0xab, 0xc0, 0x34, 0x8f, 0xc5, 0x62, 0x00, 0x5a, 0x59, 0xa2, 0x7a, 0x8a, - 0x46, 0xfa, 0x6a, 0xdd, + 0x69, 0x96, 0x86, 0xa4, 0x13, 0xbc, 0x95, 0x43, 0xe8, 0xb3, 0x90, 0xc1, 0x51, 0x4a, + 0x41, 0xff, 0xa2, 0x80, 0xf1, 0xea, 0x8a, 0x52, 0xc6, 0x1a, 0x56, 0xea, 0x94, 0x98, + 0x6d, 0xd8, 0x66, 0x2c, ], dk: [ - 0xd0, 0xba, 0xef, 0x60, 0x12, 0xd3, 0x08, 0xef, 0xbb, 0x76, 0x9a, 0x99, 0xcc, 0xa2, - 0x92, 0x8c, 0xed, 0xe8, 0xdb, 0x27, 0x76, 0x45, 0xa7, 0x77, 0xea, 0xf1, 0x72, 0x2c, - 0xd0, 0x84, 0x50, 0xb3, + 0x2b, 0xc7, 0xd4, 0x9f, 0xed, 0x53, 0xc1, 0x59, 0x21, 0x9d, 0x29, 0xb3, 0xe5, 0x51, + 0x08, 0xd6, 0x5d, 0x2a, 0x82, 0x3f, 0xce, 0x17, 0x51, 0x08, 0xdb, 0xc9, 0xc5, 0xb5, + 0x00, 0x4a, 0x7f, 0xd4, ], default_d: [ - 0xcc, 0x7c, 0xe7, 0x34, 0xb0, 0x75, 0xa0, 0x1b, 0x92, 0xaa, 0xca, + 0x80, 0x1a, 0x91, 0xc1, 0x78, 0x47, 0x23, 0x30, 0x82, 0x67, 0x9a, ], default_pk_d: [ - 0x3d, 0xa5, 0x27, 0x3a, 0x56, 0x67, 0xc7, 0x66, 0xb8, 0x23, 0x12, 0x06, 0x18, 0x0f, - 0x15, 0x8a, 0xc0, 0x2a, 0xf3, 0xf0, 0x6e, 0xcc, 0xa6, 0xec, 0x7c, 0x38, 0xc7, 0x5d, - 0x33, 0x60, 0x03, 0x20, + 0x8e, 0xa1, 0xac, 0x5f, 0x65, 0xc1, 0x79, 0x9b, 0x6c, 0x7a, 0x68, 0x4f, 0xf3, 0x5e, + 0x63, 0xbd, 0xdf, 0x75, 0xff, 0xf6, 0x9f, 0xc2, 0xd2, 0x83, 0x59, 0xf2, 0xd4, 0x96, + 0xff, 0x9e, 0xb7, 0x20, ], internal_rivk: [ - 0x88, 0xd7, 0xb1, 0x96, 0x99, 0xf3, 0x94, 0xa5, 0x50, 0xbc, 0x9c, 0xdc, 0x6b, 0xf3, - 0xfc, 0x71, 0xf6, 0x10, 0xc3, 0x06, 0x56, 0x37, 0x61, 0x53, 0xa6, 0x96, 0x1f, 0xcd, - 0x5b, 0x97, 0xfa, 0x19, + 0x29, 0x8e, 0xf3, 0x46, 0x9e, 0x43, 0x01, 0x93, 0x44, 0xfa, 0x27, 0x4b, 0x67, 0xcc, + 0xd3, 0xef, 0xda, 0x04, 0x02, 0x18, 0x07, 0x17, 0xea, 0x6c, 0x7e, 0x6f, 0x11, 0xdf, + 0x1c, 0x8e, 0xbe, 0x20, ], internal_ivk: [ - 0x0a, 0x2d, 0xc9, 0x66, 0x61, 0xb9, 0x27, 0x25, 0x0d, 0x7e, 0x3c, 0xd2, 0xc7, 0xe0, - 0x6d, 0x51, 0x74, 0xc6, 0x2c, 0xb1, 0x2e, 0x07, 0x16, 0x7f, 0x19, 0x4f, 0x4c, 0xe6, - 0x4e, 0x68, 0x95, 0x02, + 0xa2, 0xea, 0xb2, 0x74, 0xa9, 0x69, 0xc4, 0x46, 0x8f, 0x66, 0x83, 0x9c, 0x72, 0xaa, + 0x6e, 0x65, 0xe6, 0x59, 0xb1, 0x2c, 0xd2, 0x17, 0xba, 0x91, 0x04, 0x21, 0xb8, 0x89, + 0x9f, 0xab, 0x59, 0x32, ], internal_ovk: [ - 0xcc, 0x79, 0x65, 0xf3, 0x3a, 0xc0, 0x1c, 0x60, 0x68, 0x51, 0xb1, 0x29, 0xbd, 0xc9, - 0xb6, 0xab, 0xd5, 0xca, 0x5b, 0x9d, 0x24, 0x1d, 0xbd, 0x5c, 0x18, 0xb2, 0x46, 0x9b, - 0x7c, 0x8c, 0xc8, 0x9f, + 0x81, 0xc1, 0xe2, 0xde, 0x44, 0xcb, 0xd6, 0xd5, 0xdd, 0x87, 0x6c, 0x87, 0xb5, 0xf8, + 0x28, 0x0b, 0xec, 0xa7, 0xfa, 0x77, 0x97, 0x76, 0x54, 0x73, 0xf5, 0x92, 0xd5, 0xfa, + 0xe3, 0xf7, 0xda, 0x9f, ], internal_dk: [ - 0xda, 0xa2, 0x42, 0xd2, 0x0d, 0xfd, 0xce, 0x8f, 0xc1, 0x0f, 0x4d, 0x99, 0x39, 0x7d, - 0xa2, 0x2c, 0x49, 0x1d, 0xc0, 0x9e, 0x1b, 0x12, 0x0f, 0x66, 0x93, 0xd6, 0x86, 0xec, - 0xd4, 0x03, 0x0a, 0x00, + 0x2b, 0x04, 0xdc, 0x9d, 0xed, 0xc2, 0xd0, 0x5e, 0x16, 0x37, 0x1b, 0xcb, 0x8a, 0x17, + 0x85, 0x44, 0x98, 0x53, 0xf0, 0xed, 0xaf, 0xeb, 0x09, 0xfd, 0xd4, 0x48, 0x3f, 0x42, + 0xec, 0x7a, 0xc1, 0xb6, ], - note_v: 5706402952489856202, + asset: [ + 0xcc, 0x73, 0x29, 0xf3, 0xe9, 0xb4, 0xe5, 0x4c, 0x23, 0x6c, 0x29, 0xaf, 0x39, 0x23, + 0x10, 0x17, 0x56, 0xd9, 0xfa, 0x4b, 0xd0, 0xf7, 0xd2, 0xdd, 0xaa, 0xcb, 0x6b, 0x0f, + 0x86, 0xa2, 0x65, 0x8e, + ], + note_v: 1456989545392107075, note_rho: [ - 0xa1, 0xdf, 0x0e, 0x5b, 0x87, 0xb5, 0xbe, 0xce, 0x47, 0x7a, 0x70, 0x96, 0x49, 0xe9, - 0x50, 0x06, 0x05, 0x91, 0x39, 0x48, 0x12, 0x95, 0x1e, 0x1f, 0xe3, 0x89, 0x5b, 0x8c, - 0xc3, 0xd1, 0x4d, 0x2c, + 0x90, 0x70, 0x46, 0x07, 0xf3, 0x87, 0xa0, 0x3e, 0x49, 0xbf, 0x98, 0x36, 0x57, 0x44, + 0x31, 0x34, 0x5a, 0x78, 0x77, 0xef, 0xaa, 0x8a, 0x08, 0xe7, 0x30, 0x81, 0xef, 0x8d, + 0x62, 0xcb, 0x78, 0x0a, ], note_rseed: [ - 0xf6, 0x55, 0x6d, 0xf6, 0xed, 0x4b, 0x4d, 0xdd, 0x3d, 0x9a, 0x69, 0xf5, 0x33, 0x57, - 0xd7, 0x76, 0x7f, 0x4f, 0x5c, 0xcb, 0xdb, 0xc5, 0x96, 0x63, 0x12, 0x77, 0xf8, 0xfe, - 0xcd, 0x08, 0xcb, 0x05, + 0xb6, 0x88, 0x3a, 0x50, 0xa0, 0xd4, 0x70, 0x19, 0x0d, 0xfb, 0xa1, 0x0a, 0x85, 0x7f, + 0x82, 0x84, 0x2d, 0x38, 0x25, 0xb3, 0xd6, 0xda, 0x05, 0x73, 0xd3, 0x16, 0xeb, 0x16, + 0x0d, 0xc0, 0xb7, 0x16, ], note_cmx: [ - 0x63, 0xce, 0xe3, 0x7e, 0x3c, 0x7b, 0x4e, 0x6c, 0xc9, 0x39, 0xa2, 0xe6, 0x3a, 0xda, - 0x74, 0xf8, 0x5e, 0xa4, 0x8b, 0xa0, 0x7a, 0x4f, 0x92, 0xcc, 0xbd, 0x34, 0xfa, 0xa4, - 0x2d, 0xfd, 0x49, 0x16, + 0x26, 0xc0, 0xb4, 0x92, 0xe5, 0x6c, 0xf6, 0xc5, 0xdd, 0x67, 0x9c, 0x84, 0x66, 0x7b, + 0x74, 0x41, 0x83, 0x63, 0xc7, 0xd9, 0x15, 0xed, 0x6b, 0x72, 0x50, 0xde, 0xa9, 0xd9, + 0xe7, 0xeb, 0x51, 0x39, ], note_nf: [ - 0x4c, 0x99, 0xbf, 0xa8, 0xc2, 0x0d, 0xba, 0x59, 0xbb, 0x73, 0x47, 0xda, 0x16, 0xc4, - 0x3b, 0x73, 0xc8, 0x87, 0x94, 0xc9, 0xeb, 0xcd, 0x0d, 0xd2, 0xb2, 0x5e, 0xe7, 0xbb, - 0x83, 0x6f, 0x95, 0x20, + 0x7e, 0xec, 0xa6, 0x5c, 0xbd, 0xc5, 0x01, 0x18, 0x2f, 0x6e, 0x1b, 0x11, 0xa2, 0x3b, + 0x0f, 0xaa, 0x80, 0xfc, 0x26, 0xca, 0x16, 0xbc, 0x4c, 0xd0, 0x97, 0x33, 0xab, 0x0e, + 0x1d, 0x10, 0x8d, 0x16, ], }, TestVector { sk: [ - 0x6b, 0x95, 0xe3, 0x02, 0x5b, 0x97, 0x92, 0xff, 0xf7, 0xf2, 0x44, 0xfc, 0x71, 0x62, - 0x69, 0xb9, 0x26, 0xd6, 0x2e, 0x95, 0x96, 0xfa, 0x82, 0x5c, 0x6b, 0xf2, 0x1a, 0xff, - 0x9e, 0x68, 0x62, 0x5a, + 0xc4, 0x8f, 0xbd, 0x46, 0x7f, 0x75, 0xb7, 0x80, 0x14, 0x9a, 0xe8, 0x80, 0x8f, 0x4e, + 0x68, 0xf5, 0x0c, 0x05, 0x36, 0xac, 0xdd, 0xf6, 0xf1, 0xae, 0xab, 0x01, 0x6b, 0x6b, + 0xc1, 0xec, 0x14, 0x4b, ], ask: [ - 0x75, 0x7d, 0x15, 0x8d, 0x07, 0x35, 0x6b, 0x3b, 0xc2, 0xc9, 0xe5, 0x1c, 0x55, 0x8a, - 0x9b, 0x31, 0x6b, 0xdd, 0xbc, 0x36, 0x0b, 0x8b, 0xeb, 0x6e, 0x2a, 0xe3, 0xb0, 0x61, - 0x8f, 0x06, 0x2d, 0x2e, + 0xb1, 0xc5, 0x78, 0x06, 0x79, 0xa6, 0x48, 0x9f, 0x79, 0x78, 0xd0, 0x2d, 0x12, 0xb9, + 0xcf, 0x78, 0xe9, 0x18, 0x25, 0x6d, 0xfa, 0xae, 0xbe, 0xe5, 0xd8, 0x9d, 0x71, 0xe5, + 0xc1, 0xdc, 0x0e, 0x3b, ], ak: [ - 0x44, 0x9a, 0x90, 0xd2, 0xe8, 0xd1, 0xa0, 0x37, 0x64, 0x2a, 0x97, 0x09, 0x6c, 0x91, - 0x65, 0x43, 0x46, 0x2a, 0x13, 0x7f, 0xfe, 0xa3, 0x7b, 0xaf, 0x41, 0xef, 0x28, 0x6b, - 0xb7, 0x32, 0xbe, 0x2c, + 0x95, 0x99, 0x81, 0xe9, 0x29, 0xa7, 0x15, 0xa3, 0x4e, 0x5b, 0x05, 0xc0, 0xc1, 0x23, + 0x1e, 0x52, 0x25, 0x96, 0xb9, 0x44, 0xd5, 0x24, 0xf6, 0x2c, 0x2a, 0x4b, 0xd6, 0x95, + 0x3e, 0x5a, 0x84, 0x13, + ], + isk: [ + 0x4e, 0x55, 0x3a, 0xcf, 0xd6, 0x70, 0xf7, 0x7e, 0x75, 0x5f, 0xc8, 0x8e, 0x06, 0x77, + 0xe3, 0x1b, 0xa4, 0x59, 0xb4, 0x4e, 0x30, 0x77, 0x68, 0x95, 0x8f, 0xe3, 0x78, 0x9d, + 0x41, 0xc2, 0xb1, 0xff, + ], + ik: [ + 0xbf, 0xfe, 0xa0, 0x0a, 0xf9, 0x2b, 0x81, 0xbc, 0x57, 0x2b, 0xea, 0x4a, 0x26, 0x73, + 0x5a, 0x34, 0x9f, 0x4d, 0x76, 0xd1, 0x69, 0x68, 0xe5, 0x6c, 0x56, 0x5f, 0xd9, 0x2b, + 0xeb, 0x46, 0x08, 0x48, ], nk: [ - 0xfd, 0x31, 0x64, 0xc6, 0x32, 0xbe, 0xc9, 0x4c, 0xe9, 0xfb, 0x2f, 0x30, 0x22, 0x63, - 0xb8, 0x84, 0xab, 0xb9, 0xc1, 0x0e, 0x55, 0xe4, 0x48, 0x64, 0x7f, 0x67, 0x98, 0x49, - 0x5c, 0x9d, 0x08, 0x3f, + 0x7c, 0xf5, 0xe1, 0x97, 0xb7, 0x7a, 0x3c, 0xe4, 0xb6, 0x69, 0x61, 0x5b, 0x78, 0xd3, + 0x19, 0x65, 0x9a, 0x90, 0x46, 0x3e, 0x45, 0x93, 0x32, 0x47, 0x44, 0xb9, 0xb4, 0x19, + 0x35, 0xa9, 0xfd, 0x3a, ], rivk: [ - 0xc0, 0xb3, 0x6b, 0x56, 0x07, 0x0f, 0xff, 0x2f, 0xdf, 0x38, 0xeb, 0xa1, 0x1a, 0x74, - 0x24, 0x95, 0x71, 0x95, 0x01, 0x4c, 0xba, 0x43, 0xa5, 0x6b, 0xd1, 0xb1, 0x65, 0x8e, - 0x66, 0xa3, 0x9d, 0x00, + 0x61, 0xf7, 0x39, 0x8a, 0x70, 0x07, 0x07, 0x95, 0x94, 0xad, 0xa8, 0xc8, 0x37, 0x0d, + 0xd8, 0xa9, 0xe4, 0x90, 0x66, 0xee, 0xf2, 0xd6, 0x05, 0x9b, 0x02, 0xa1, 0x67, 0x68, + 0x26, 0xaa, 0x4a, 0x2d, ], ivk: [ - 0x97, 0x6a, 0x87, 0x88, 0x19, 0x1b, 0x87, 0xe4, 0xc1, 0x3f, 0x2c, 0x6d, 0x23, 0xb4, - 0xf3, 0x59, 0x5e, 0x02, 0x28, 0xe2, 0x45, 0xe9, 0x6e, 0xef, 0x1d, 0x24, 0xb2, 0x93, - 0x29, 0x6a, 0x19, 0x1c, + 0xcc, 0xb2, 0x24, 0x66, 0xf1, 0xa3, 0xda, 0x33, 0xc2, 0xfd, 0xab, 0x63, 0x19, 0xde, + 0x82, 0x71, 0xff, 0xd9, 0xc7, 0xc7, 0xba, 0xfa, 0x24, 0x06, 0x8e, 0x72, 0x32, 0x1c, + 0x87, 0x67, 0x76, 0x2b, ], ovk: [ - 0x1e, 0xd0, 0xed, 0xa5, 0xa4, 0x08, 0x61, 0x31, 0x26, 0x1a, 0x2e, 0xd4, 0x42, 0x92, - 0x61, 0xe4, 0x27, 0x6a, 0x26, 0xd4, 0x28, 0x59, 0xfa, 0xbd, 0xa3, 0x1a, 0xa9, 0x67, - 0x09, 0x87, 0x43, 0x71, + 0x12, 0xac, 0xb4, 0xf9, 0xf0, 0xb2, 0xcc, 0x5d, 0xfa, 0x03, 0x15, 0x46, 0x73, 0xd7, + 0xf3, 0x0c, 0x7f, 0x1c, 0xb1, 0x84, 0xa7, 0xce, 0x4e, 0xd8, 0x4b, 0x9d, 0x0b, 0x3d, + 0x8e, 0x68, 0x63, 0xd3, ], dk: [ - 0x5e, 0x5b, 0x60, 0xc0, 0x5b, 0x53, 0xd0, 0xbc, 0xd2, 0xda, 0x46, 0xa1, 0x31, 0x29, - 0x12, 0x51, 0x5c, 0xc7, 0xcf, 0x2d, 0x97, 0x4c, 0x11, 0x7c, 0x8d, 0xde, 0xa9, 0xfa, - 0xb6, 0x20, 0xc6, 0x68, + 0x51, 0xba, 0x5e, 0x4e, 0x4b, 0x8f, 0xbe, 0xf0, 0xd0, 0x1e, 0xf3, 0x8c, 0x77, 0xb4, + 0xba, 0x7f, 0xfa, 0x26, 0x72, 0xfa, 0x7a, 0xde, 0x50, 0x4f, 0xdb, 0x85, 0x91, 0x05, + 0x46, 0x7d, 0x0a, 0x91, ], default_d: [ - 0x99, 0xaf, 0x6b, 0xf3, 0xf4, 0x75, 0xbd, 0xe8, 0x89, 0xaa, 0xca, + 0x7f, 0xd2, 0x1b, 0xf0, 0xf5, 0xf3, 0x2f, 0x7d, 0xf2, 0xec, 0x7f, ], default_pk_d: [ - 0xac, 0xdc, 0xd3, 0x48, 0xca, 0x45, 0xee, 0x58, 0x32, 0x78, 0x30, 0x38, 0x46, 0xca, - 0x07, 0x84, 0x59, 0xd5, 0xbe, 0x5c, 0x5d, 0xcf, 0x34, 0x7e, 0x3b, 0x9a, 0x34, 0xcb, - 0xa1, 0x24, 0xb4, 0xa3, + 0x54, 0x92, 0x6e, 0xd8, 0xd4, 0xbc, 0x4c, 0xcd, 0xed, 0xc9, 0x91, 0xaa, 0x62, 0x19, + 0xc3, 0xf6, 0xb4, 0x58, 0xd6, 0x78, 0xc6, 0xd6, 0xc3, 0xc9, 0x0d, 0x57, 0xfc, 0x08, + 0x71, 0xc3, 0x50, 0xbe, ], internal_rivk: [ - 0x94, 0x1a, 0x17, 0xe1, 0x20, 0x2a, 0x62, 0x71, 0xa4, 0x4a, 0x01, 0x66, 0x65, 0x53, - 0xb5, 0x81, 0xbf, 0x25, 0xef, 0x99, 0xe8, 0xe9, 0x5f, 0x13, 0x2a, 0xce, 0x38, 0x1d, - 0x96, 0x01, 0x84, 0x32, + 0xd6, 0x2f, 0x96, 0x87, 0x62, 0x35, 0x26, 0x2b, 0x7e, 0x75, 0x5a, 0x3f, 0x1d, 0x4e, + 0x79, 0x99, 0x7e, 0xec, 0x6d, 0x46, 0x60, 0x39, 0x8f, 0xe0, 0x7e, 0x29, 0x0a, 0x31, + 0xac, 0xf0, 0xdb, 0x2c, ], internal_ivk: [ - 0xa2, 0x76, 0x29, 0xac, 0x1c, 0x62, 0xc9, 0xf4, 0xda, 0xd5, 0x7c, 0x95, 0x30, 0xab, - 0x2a, 0x59, 0x80, 0x0d, 0x2e, 0xf4, 0x55, 0xcd, 0x17, 0x44, 0x6f, 0x3f, 0xc6, 0x08, - 0x1a, 0x58, 0x1e, 0x3b, + 0x6e, 0x03, 0xa4, 0xfd, 0xba, 0x1e, 0xc7, 0xcd, 0xcf, 0x05, 0x09, 0x97, 0x60, 0xbb, + 0xb9, 0xa7, 0x0f, 0x42, 0x4d, 0xcb, 0x20, 0x88, 0x01, 0xd1, 0xe2, 0x7f, 0x12, 0xbd, + 0x4f, 0x14, 0x91, 0x1f, ], internal_ovk: [ - 0xe9, 0x89, 0x8e, 0xd6, 0xb6, 0x69, 0xc8, 0xd9, 0xd5, 0x90, 0xb7, 0x59, 0xd0, 0x29, - 0x5f, 0xcf, 0xaf, 0x95, 0xe2, 0xda, 0xf7, 0xda, 0x99, 0x1c, 0x27, 0x57, 0xdc, 0xef, - 0xe1, 0x62, 0x6e, 0x0e, + 0xba, 0xe4, 0x5d, 0xdd, 0xa9, 0xfe, 0x68, 0x60, 0xe7, 0xc8, 0x70, 0x09, 0x38, 0xb1, + 0x32, 0x4e, 0x6f, 0xe0, 0xe9, 0x88, 0x6e, 0xd8, 0xb0, 0xe2, 0xf9, 0xeb, 0x46, 0xe0, + 0x53, 0x1d, 0x2a, 0x5f, ], internal_dk: [ - 0x61, 0x0c, 0xbd, 0x9a, 0x57, 0x79, 0x79, 0xe1, 0xf7, 0x1d, 0xa8, 0x10, 0x0f, 0x6f, - 0xe6, 0xb8, 0xf6, 0xd1, 0x0a, 0x74, 0x7f, 0xed, 0x2a, 0x1c, 0x91, 0xcb, 0xe1, 0x42, - 0x47, 0x5c, 0x30, 0x82, + 0xc1, 0xcf, 0x55, 0xea, 0xc9, 0xa8, 0x94, 0x18, 0x77, 0x6b, 0x9e, 0xfc, 0x67, 0xef, + 0xe9, 0x0b, 0xf3, 0x61, 0xee, 0xb0, 0x96, 0xed, 0x61, 0x86, 0xc4, 0x1a, 0x60, 0xc4, + 0x29, 0xa5, 0xb5, 0xa9, + ], + asset: [ + 0xbc, 0x6b, 0xc2, 0x30, 0x7b, 0x48, 0x8d, 0x25, 0x56, 0xd7, 0xb7, 0x38, 0x0e, 0xa4, + 0xff, 0xd7, 0x12, 0xf6, 0xb0, 0x2f, 0xe8, 0x06, 0xb9, 0x45, 0x69, 0xcd, 0x40, 0x59, + 0xf3, 0x96, 0xbf, 0x29, ], - note_v: 2558469029534639129, + note_v: 94453636825041987, note_rho: [ - 0x72, 0x2d, 0xb0, 0x41, 0xa3, 0xef, 0x66, 0xfa, 0x48, 0x3a, 0xfd, 0x3c, 0x2e, 0x19, - 0xe5, 0x94, 0x44, 0xa6, 0x4a, 0xdd, 0x6d, 0xf1, 0xd9, 0x63, 0xf5, 0xdd, 0x5b, 0x50, - 0x10, 0xd3, 0xd0, 0x25, + 0xb9, 0x9d, 0x0a, 0x40, 0xe5, 0xe1, 0x71, 0x1c, 0xa9, 0x44, 0xf7, 0x2d, 0x43, 0x6a, + 0x10, 0x2f, 0xca, 0x4b, 0x97, 0x69, 0x3d, 0xa0, 0xb0, 0x86, 0xfe, 0x9d, 0x2e, 0x71, + 0x62, 0x47, 0x0d, 0x02, ], note_rseed: [ - 0xf0, 0x28, 0x7c, 0x4c, 0xf1, 0x9c, 0x75, 0xf3, 0x3d, 0x51, 0xdd, 0xdd, 0xba, 0x5d, - 0x65, 0x7b, 0x43, 0xee, 0x8d, 0xa6, 0x45, 0x44, 0x38, 0x14, 0xcc, 0x73, 0x29, 0xf3, - 0xe9, 0xb4, 0xe5, 0x4c, + 0xe0, 0xf0, 0x5d, 0x4b, 0xec, 0x95, 0x12, 0xbf, 0xb3, 0xf3, 0x83, 0x27, 0x29, 0x6e, + 0xfa, 0xa7, 0x43, 0x28, 0xb1, 0x18, 0xc2, 0x74, 0x02, 0xc7, 0x0c, 0x3a, 0x90, 0xb4, + 0x9a, 0xd4, 0xbb, 0xc6, ], note_cmx: [ - 0x1e, 0x61, 0x9e, 0x46, 0xbb, 0x62, 0xb6, 0x1d, 0x4e, 0x1c, 0xf3, 0x62, 0x2e, 0xa7, - 0x0a, 0x90, 0x8d, 0xe7, 0xf0, 0x76, 0xec, 0xf8, 0x7f, 0x54, 0x1e, 0x0b, 0x7b, 0x48, - 0xad, 0x4a, 0x26, 0x01, + 0x98, 0xfc, 0x4e, 0x7f, 0x1d, 0xb8, 0x5a, 0xe6, 0x42, 0x14, 0xd8, 0x30, 0x06, 0xd8, + 0xac, 0xa8, 0xc2, 0x48, 0x73, 0x53, 0x2c, 0x22, 0x1b, 0x06, 0xd1, 0x8d, 0xf2, 0xb7, + 0xeb, 0x5f, 0xe5, 0x00, ], note_nf: [ - 0x3b, 0x94, 0x8d, 0xb2, 0x16, 0x08, 0xe9, 0xac, 0xb2, 0x2a, 0x54, 0x17, 0xb9, 0x8c, - 0x0d, 0xed, 0xd5, 0x27, 0xa9, 0x64, 0x87, 0x81, 0x4e, 0x64, 0x20, 0xcb, 0xff, 0x6e, - 0x4e, 0xee, 0x4e, 0x31, + 0x37, 0xd7, 0xe9, 0x3c, 0xec, 0xfc, 0x62, 0x08, 0x8c, 0xde, 0x33, 0x41, 0x47, 0x88, + 0xfe, 0xab, 0x15, 0x8a, 0x40, 0xb4, 0xe9, 0x4a, 0x51, 0x11, 0xa7, 0x07, 0xaf, 0x3a, + 0x44, 0x3b, 0xd1, 0x3a, ], }, TestVector { sk: [ - 0x23, 0x6c, 0x29, 0xaf, 0x39, 0x23, 0x10, 0x17, 0x56, 0xd9, 0xfa, 0x4b, 0xd0, 0xf7, - 0xd2, 0xdd, 0xaa, 0xcb, 0x6b, 0x0f, 0x86, 0xa2, 0x65, 0x8e, 0x0a, 0x07, 0xa0, 0x5a, - 0xc5, 0xb9, 0x50, 0x05, + 0x8e, 0x37, 0xc0, 0xaa, 0x7d, 0x9b, 0x3f, 0xe1, 0x77, 0x99, 0xd7, 0x3b, 0x84, 0x1e, + 0x75, 0x17, 0x13, 0xa0, 0x29, 0x43, 0x90, 0x5a, 0xae, 0x08, 0x03, 0xfd, 0x69, 0x44, + 0x2e, 0xb7, 0x68, 0x1e, ], ask: [ - 0xb4, 0xde, 0xd9, 0x0d, 0x62, 0x11, 0x7f, 0x18, 0xf3, 0xdd, 0x5f, 0xdb, 0x22, 0x23, - 0x8a, 0x35, 0xca, 0x37, 0xc4, 0x0f, 0xee, 0xc8, 0x45, 0xce, 0x5f, 0xc2, 0x7f, 0xe8, - 0xbc, 0xa5, 0xef, 0x0f, + 0xfb, 0x9c, 0xa6, 0xa7, 0xf2, 0x49, 0x20, 0x67, 0xaa, 0x19, 0x42, 0x01, 0xaa, 0xbc, + 0xd5, 0xc0, 0xce, 0xe9, 0x9f, 0x6d, 0x65, 0x0f, 0x0f, 0x10, 0x44, 0x96, 0xac, 0xc5, + 0x88, 0x34, 0x89, 0x2b, ], ak: [ - 0x4e, 0xfd, 0x5a, 0x2e, 0xf1, 0xff, 0xa9, 0x9a, 0x0f, 0xf6, 0x2b, 0x76, 0x7d, 0x44, - 0xb3, 0x65, 0x1f, 0xfa, 0x1c, 0x69, 0x69, 0x15, 0xac, 0x00, 0xa2, 0x5e, 0xa3, 0xac, - 0x7d, 0xff, 0x99, 0x01, + 0xa0, 0xb2, 0x52, 0xde, 0x9e, 0x88, 0xee, 0xc0, 0x36, 0x2e, 0x43, 0x6f, 0x58, 0x52, + 0xf7, 0x4f, 0x7e, 0x3c, 0x74, 0x94, 0xe4, 0xa6, 0x65, 0x2f, 0xbf, 0xa7, 0x44, 0xdb, + 0xa3, 0xa9, 0x23, 0x14, + ], + isk: [ + 0xc2, 0xa0, 0x56, 0x00, 0x05, 0x4e, 0x92, 0xee, 0xd5, 0x55, 0x02, 0x8f, 0x21, 0xb6, + 0xa1, 0x55, 0x26, 0x8a, 0x2d, 0xd6, 0x64, 0x0a, 0x69, 0x30, 0x1a, 0x52, 0xa3, 0x8d, + 0x4d, 0x9f, 0x9f, 0x95, + ], + ik: [ + 0x3e, 0x34, 0xea, 0xa1, 0x93, 0x26, 0x04, 0x49, 0xf3, 0xe8, 0x83, 0xfd, 0x5f, 0xbd, + 0x84, 0xfd, 0x99, 0xbf, 0x10, 0xa1, 0xa4, 0xdf, 0x14, 0x60, 0x98, 0x78, 0x4a, 0xe2, + 0xc3, 0xc2, 0xdb, 0xf7, ], nk: [ - 0x02, 0xab, 0x99, 0x5c, 0xe9, 0x8f, 0x63, 0x02, 0x5f, 0xb6, 0x24, 0x28, 0xa0, 0xfb, - 0xf5, 0x2f, 0x25, 0x22, 0xe6, 0xa2, 0x72, 0x61, 0x07, 0x8a, 0x9f, 0x4d, 0x6a, 0x36, - 0xa1, 0xc0, 0x5d, 0x39, + 0xfe, 0x7d, 0xda, 0x8a, 0x42, 0xb1, 0x49, 0x04, 0xad, 0x4f, 0xf1, 0x14, 0xae, 0x3a, + 0x97, 0xd2, 0x01, 0xb6, 0x17, 0xf5, 0xd5, 0xd0, 0x2e, 0xe0, 0xde, 0x77, 0x4b, 0xb4, + 0x6e, 0xd0, 0x56, 0x37, ], rivk: [ - 0xd9, 0x84, 0x0d, 0x0b, 0xd8, 0x95, 0x20, 0xab, 0xbc, 0xa7, 0xf1, 0x0b, 0xe6, 0xeb, - 0xa3, 0x66, 0xf8, 0x6e, 0xc3, 0xb7, 0x8d, 0xbd, 0xf1, 0xeb, 0xfe, 0x20, 0xd9, 0x95, - 0x12, 0xaf, 0x15, 0x15, + 0xf8, 0xbf, 0x8f, 0x4f, 0x71, 0x88, 0x90, 0x67, 0xcb, 0x99, 0xf2, 0xec, 0xc5, 0x41, + 0x50, 0x6c, 0x23, 0x0a, 0xff, 0x88, 0x64, 0x26, 0x68, 0x59, 0xf0, 0x15, 0xdf, 0xf4, + 0xc4, 0x89, 0x5e, 0x32, ], ivk: [ - 0x58, 0xf5, 0xbb, 0x5c, 0x32, 0x31, 0x15, 0x25, 0x29, 0x42, 0x3b, 0x67, 0xfa, 0x43, - 0x28, 0x79, 0x11, 0x26, 0x35, 0xcd, 0xa0, 0xda, 0x2e, 0xc2, 0x41, 0x9c, 0x6f, 0xe9, - 0x1e, 0xa4, 0x8d, 0x24, + 0x4b, 0x22, 0xa9, 0x1d, 0xfe, 0xa9, 0x16, 0x81, 0x91, 0x48, 0xb8, 0x3d, 0x80, 0x5d, + 0xe3, 0xc7, 0xc6, 0x3f, 0xe3, 0x58, 0x11, 0x41, 0xec, 0xdc, 0x26, 0x43, 0x28, 0xe5, + 0x7c, 0x0b, 0x43, 0x2b, ], ovk: [ - 0x78, 0xf5, 0xd3, 0x48, 0x67, 0x2e, 0x8d, 0x20, 0x9c, 0x41, 0xb7, 0x83, 0xf8, 0xca, - 0x14, 0xa7, 0x7b, 0x3e, 0xa3, 0xe6, 0x00, 0x4c, 0xa4, 0xe0, 0xc2, 0x5a, 0xa4, 0x45, - 0x63, 0x98, 0x1d, 0xcb, + 0x12, 0xe5, 0xa1, 0x7f, 0x89, 0x12, 0xd9, 0x6b, 0xfd, 0xc7, 0xd3, 0x75, 0x3c, 0xe2, + 0xa8, 0x3a, 0xca, 0x2b, 0xc6, 0x45, 0x38, 0x3b, 0xc4, 0x54, 0x51, 0x11, 0x5e, 0xd5, + 0xb3, 0xf5, 0xbe, 0xaa, ], dk: [ - 0x5d, 0x7f, 0xe3, 0x96, 0xbb, 0xfd, 0x22, 0x67, 0xac, 0xa7, 0x11, 0xab, 0x5b, 0x3e, - 0x1f, 0x02, 0x4f, 0x49, 0x11, 0xf3, 0xa1, 0x81, 0x73, 0x2f, 0x13, 0x22, 0xa1, 0x59, - 0x2f, 0x9e, 0x0e, 0xbe, + 0xc6, 0xa0, 0xdc, 0x04, 0x56, 0xbc, 0x4c, 0x39, 0x9e, 0x20, 0x2d, 0x00, 0xd3, 0x2e, + 0xaf, 0xc9, 0xa8, 0xc0, 0xe2, 0x65, 0xa4, 0xae, 0xb1, 0x07, 0xa9, 0xa6, 0x4d, 0x93, + 0x8b, 0x14, 0xc0, 0x0f, ], default_d: [ - 0x2f, 0xbe, 0x4b, 0x4b, 0x1e, 0xdf, 0xf3, 0x31, 0x23, 0xce, 0x65, + 0x07, 0xd3, 0x0c, 0x15, 0x5a, 0x71, 0x0a, 0x2d, 0x03, 0x28, 0x25, ], default_pk_d: [ - 0xeb, 0x2c, 0x6f, 0xee, 0x34, 0x1e, 0xad, 0xe0, 0x7d, 0x74, 0x87, 0x99, 0x7a, 0xa7, - 0x23, 0x69, 0x7d, 0x05, 0xe6, 0x29, 0x60, 0xdf, 0x37, 0x9c, 0x9e, 0x4a, 0x8d, 0x47, - 0x6d, 0xfa, 0xc5, 0xbf, + 0xd7, 0x8b, 0x08, 0x60, 0xbb, 0xf7, 0x82, 0x52, 0x83, 0x79, 0x8e, 0xa7, 0xa6, 0x62, + 0x98, 0x14, 0xed, 0xe8, 0x14, 0x8a, 0x53, 0x8d, 0xe6, 0x30, 0x0e, 0x0f, 0x88, 0x90, + 0x4f, 0x01, 0x4c, 0x19, ], internal_rivk: [ - 0x66, 0x3b, 0x67, 0xd3, 0xac, 0x15, 0x99, 0x27, 0xf0, 0x6e, 0x6c, 0x8d, 0xab, 0x80, - 0xa5, 0x89, 0x67, 0xc5, 0x45, 0xda, 0xac, 0x3d, 0x98, 0x72, 0x9a, 0x0b, 0xcc, 0x41, - 0xfd, 0x53, 0x6d, 0x2b, + 0xc4, 0x35, 0x16, 0x37, 0x67, 0x71, 0xad, 0xca, 0x2b, 0x7b, 0xeb, 0xe3, 0xe6, 0xa7, + 0x1c, 0xb6, 0x5c, 0xa8, 0xcf, 0x1f, 0xfb, 0x16, 0xc9, 0xc4, 0xf0, 0x48, 0x19, 0x86, + 0x87, 0x9e, 0xee, 0x28, ], internal_ivk: [ - 0xaa, 0x6a, 0xcc, 0x8a, 0x7a, 0xa9, 0xa8, 0x05, 0x20, 0x04, 0xff, 0x93, 0x83, 0x3f, - 0x4a, 0xbb, 0x15, 0x3b, 0x45, 0x79, 0x7f, 0xd9, 0x07, 0xe3, 0x05, 0xc8, 0x92, 0x7b, - 0xb0, 0x37, 0x82, 0x20, + 0xaf, 0x6a, 0xbb, 0xb5, 0xde, 0x71, 0x0f, 0x0f, 0xb4, 0x0f, 0xa5, 0xa2, 0xe2, 0x7e, + 0x8c, 0x83, 0x2c, 0x69, 0x9c, 0x2b, 0x7f, 0x58, 0xbd, 0xa6, 0xbc, 0x9a, 0xd5, 0xb9, + 0x11, 0xc1, 0xf0, 0x20, ], internal_ovk: [ - 0xbf, 0xd1, 0x09, 0x67, 0x27, 0xb6, 0xd5, 0xa2, 0xe1, 0x7a, 0xcb, 0xc5, 0xb2, 0x46, - 0x80, 0xcb, 0x88, 0xdb, 0x34, 0xcf, 0x53, 0xb6, 0xb7, 0x46, 0x6c, 0xef, 0x67, 0x6f, - 0xb3, 0xf7, 0x22, 0x29, + 0x08, 0x6a, 0x61, 0x0d, 0x50, 0x7d, 0xb9, 0xaa, 0x4f, 0x34, 0x90, 0x40, 0xd4, 0xf4, + 0xbf, 0x35, 0x58, 0x05, 0x68, 0xcf, 0x36, 0xe9, 0x3f, 0x40, 0x57, 0x5f, 0x7f, 0x2a, + 0x50, 0xb6, 0xa1, 0xde, ], internal_dk: [ - 0x47, 0xbd, 0xf9, 0x27, 0x1e, 0xcc, 0x50, 0xe7, 0x05, 0xc5, 0x21, 0xcd, 0x0d, 0xbb, - 0xaf, 0x1c, 0x4e, 0x6a, 0x96, 0x2f, 0xc9, 0x14, 0x13, 0x48, 0xb8, 0xbd, 0x7b, 0x35, - 0xc4, 0x00, 0x1e, 0x62, + 0xfa, 0xae, 0xd1, 0xb9, 0xd7, 0xee, 0x7b, 0x90, 0xb4, 0xa4, 0x70, 0xfd, 0x49, 0xdc, + 0xd2, 0x8c, 0x76, 0xe6, 0x0e, 0xfc, 0xb8, 0x0f, 0x4d, 0x9e, 0x40, 0xe6, 0x6f, 0xa7, + 0x76, 0xc7, 0x07, 0x1f, ], - note_v: 15425828902564319772, + asset: [ + 0x1c, 0xe4, 0xc9, 0xbe, 0x0a, 0x6a, 0x49, 0x2f, 0xe7, 0x9f, 0x15, 0x81, 0xa1, 0x55, + 0xfa, 0x3a, 0x2b, 0x9d, 0xaf, 0xd8, 0x2e, 0x65, 0x0b, 0x38, 0x6a, 0xd3, 0xa0, 0x8c, + 0xb6, 0xb8, 0x31, 0x31, + ], + note_v: 1448031623652762490, note_rho: [ - 0x73, 0x6c, 0x23, 0x35, 0x7c, 0x85, 0xf4, 0x57, 0x91, 0xe1, 0x70, 0x80, 0x29, 0xd9, - 0x82, 0x4d, 0x90, 0x70, 0x46, 0x07, 0xf3, 0x87, 0xa0, 0x3e, 0x49, 0xbf, 0x98, 0x36, - 0x57, 0x44, 0x31, 0x34, + 0x76, 0x1f, 0xd3, 0xf4, 0x1e, 0x72, 0x8e, 0x1a, 0x28, 0xf8, 0x9d, 0xb8, 0x9f, 0xfd, + 0xec, 0xa3, 0x64, 0xdd, 0x2f, 0x0f, 0x07, 0x39, 0xf0, 0x53, 0x45, 0x56, 0x48, 0x31, + 0x99, 0xc7, 0x1f, 0x18, ], note_rseed: [ - 0x5a, 0x78, 0x77, 0xef, 0xaa, 0x8a, 0x08, 0xe7, 0x30, 0x81, 0xef, 0x8d, 0x62, 0xcb, - 0x78, 0x0a, 0xb6, 0x88, 0x3a, 0x50, 0xa0, 0xd4, 0x70, 0x19, 0x0d, 0xfb, 0xa1, 0x0a, - 0x85, 0x7f, 0x82, 0x84, + 0x93, 0x41, 0xac, 0x9b, 0x78, 0xa2, 0x69, 0x16, 0x42, 0x06, 0xa0, 0xea, 0x1c, 0xe7, + 0x3b, 0xfb, 0x2a, 0x94, 0x2e, 0x73, 0x70, 0xb2, 0x47, 0xc0, 0x46, 0xf8, 0xe7, 0x5e, + 0xf8, 0xe3, 0xf8, 0xbd, ], note_cmx: [ - 0xc8, 0x52, 0x8f, 0x72, 0x2c, 0xd3, 0xe4, 0x7d, 0xc9, 0x9e, 0x1e, 0x38, 0x80, 0x56, - 0x37, 0x08, 0x15, 0xa9, 0xd0, 0x37, 0x97, 0x3d, 0x85, 0xca, 0xc7, 0xea, 0x38, 0xb5, - 0xa7, 0x16, 0xfa, 0x3b, + 0xdf, 0x72, 0x6a, 0x0e, 0x47, 0xd8, 0xb7, 0xd9, 0xcc, 0xa2, 0x6a, 0x1f, 0x74, 0x55, + 0x4a, 0x81, 0x52, 0x5b, 0x1b, 0x7a, 0xf1, 0x6e, 0xfb, 0x52, 0xb9, 0x27, 0x8b, 0x7c, + 0x8a, 0xbf, 0x8c, 0x22, ], note_nf: [ - 0xac, 0xc2, 0xed, 0x2c, 0x7e, 0x3b, 0x19, 0x7e, 0x5c, 0xdb, 0x4a, 0x57, 0x63, 0x57, - 0xd5, 0xf1, 0x35, 0x39, 0x16, 0x26, 0xc7, 0xa8, 0x25, 0xd1, 0x0a, 0xa2, 0x60, 0xae, - 0x0b, 0x95, 0x81, 0x28, + 0x6a, 0xfb, 0x25, 0xb0, 0x7d, 0x0d, 0x60, 0xa3, 0x28, 0xef, 0x22, 0xd9, 0x06, 0xf3, + 0x53, 0x1d, 0x8b, 0x50, 0xc4, 0x10, 0x7b, 0xd1, 0xc7, 0x66, 0x2c, 0xd6, 0x7b, 0x5d, + 0xb2, 0x0a, 0x05, 0x28, ], }, TestVector { sk: [ - 0x2d, 0x38, 0x25, 0xb3, 0xd6, 0xda, 0x05, 0x73, 0xd3, 0x16, 0xeb, 0x16, 0x0d, 0xc0, - 0xb7, 0x16, 0xc4, 0x8f, 0xbd, 0x46, 0x7f, 0x75, 0xb7, 0x80, 0x14, 0x9a, 0xe8, 0x80, - 0x8f, 0x4e, 0x68, 0xf5, + 0x82, 0x1c, 0xf5, 0x77, 0x49, 0x18, 0x64, 0xe2, 0x0e, 0x6d, 0x08, 0xfd, 0x2e, 0x32, + 0xb5, 0x55, 0xc9, 0x2c, 0x66, 0x1f, 0x19, 0x58, 0x8b, 0x72, 0xa8, 0x95, 0x99, 0x71, + 0x0a, 0x88, 0x06, 0x12, ], ask: [ - 0x2d, 0x6e, 0x97, 0x3e, 0x17, 0x54, 0xd4, 0x17, 0x87, 0x93, 0x4c, 0x34, 0x55, 0x8c, - 0xfe, 0x99, 0x38, 0x44, 0x19, 0x99, 0x72, 0xd9, 0xa6, 0x34, 0x8b, 0x7a, 0x3d, 0xad, - 0xfc, 0xb6, 0x77, 0x2a, + 0xf5, 0x90, 0xaa, 0x36, 0x24, 0x9c, 0x92, 0xdb, 0x3c, 0xb8, 0x45, 0x9e, 0x7c, 0x0a, + 0x19, 0xd9, 0x22, 0xa7, 0x5e, 0x78, 0x3f, 0xf3, 0x6e, 0x7d, 0x08, 0x10, 0x55, 0xcd, + 0x5f, 0xf2, 0x1c, 0x38, ], ak: [ - 0x76, 0x21, 0x59, 0xa4, 0x14, 0xf5, 0x74, 0xb5, 0x39, 0x75, 0x0f, 0x22, 0xc8, 0x86, - 0x3b, 0x02, 0xd2, 0x5c, 0xc1, 0x0c, 0x90, 0x71, 0xfc, 0x02, 0x19, 0xe9, 0x7f, 0x93, - 0x92, 0xd0, 0x67, 0x0c, + 0x66, 0x38, 0xf1, 0x69, 0x63, 0x2d, 0xd9, 0x4d, 0x3b, 0x0c, 0x21, 0x4e, 0xac, 0xc8, + 0x52, 0xc1, 0xe4, 0xe0, 0x70, 0xcb, 0xdf, 0xb6, 0xe6, 0x2d, 0x08, 0x0f, 0x57, 0x68, + 0xa6, 0xaa, 0xd4, 0x23, + ], + isk: [ + 0x53, 0xca, 0x28, 0x5b, 0x63, 0x04, 0xb3, 0x7d, 0xa2, 0xb5, 0x29, 0x4f, 0x5c, 0xb3, + 0x54, 0xa8, 0x94, 0x32, 0x28, 0x48, 0xcc, 0xbd, 0xc7, 0xc2, 0x54, 0x5b, 0x7d, 0xa5, + 0x68, 0xaf, 0xac, 0x87, + ], + ik: [ + 0x5e, 0x8e, 0x92, 0x06, 0x37, 0x1f, 0xe4, 0xa0, 0x1d, 0x1c, 0x8a, 0x2c, 0x36, 0xe2, + 0x1a, 0x22, 0x6b, 0x12, 0xb2, 0xf6, 0x56, 0xfc, 0xcc, 0x0e, 0x9c, 0x43, 0x22, 0x27, + 0x69, 0x31, 0x09, 0x91, ], nk: [ - 0x25, 0x91, 0xed, 0xf7, 0xef, 0x4c, 0xf2, 0x18, 0x4c, 0x34, 0xbe, 0x93, 0xfc, 0xf6, - 0x12, 0x91, 0x50, 0x42, 0xf1, 0x5a, 0xb5, 0x08, 0x4b, 0x14, 0xe1, 0x66, 0x79, 0x5b, - 0x09, 0xce, 0xa1, 0x33, + 0x64, 0x02, 0x41, 0x63, 0x14, 0x5b, 0x68, 0x66, 0x8d, 0x1c, 0x3f, 0x9c, 0x0f, 0x76, + 0xd3, 0x92, 0xd3, 0x71, 0x8f, 0x01, 0x75, 0x18, 0x1b, 0xa1, 0x4a, 0x0f, 0xc9, 0x5b, + 0x7f, 0xec, 0x65, 0x35, ], rivk: [ - 0x75, 0x8f, 0xb2, 0x50, 0xdd, 0x29, 0x50, 0xe5, 0xd2, 0xb2, 0xee, 0xd7, 0xff, 0xcf, - 0x94, 0xae, 0x67, 0xcd, 0xe1, 0x25, 0xb9, 0x5b, 0x47, 0x9e, 0x23, 0x77, 0x81, 0x3a, - 0x85, 0xa0, 0x3d, 0x2f, + 0x4a, 0x61, 0xd4, 0x32, 0x0d, 0x12, 0xdd, 0x47, 0xa6, 0xc2, 0x2d, 0x00, 0xd8, 0xb0, + 0x52, 0xb4, 0x83, 0xd0, 0x40, 0xda, 0xd3, 0x79, 0xbb, 0x29, 0x0b, 0x40, 0xd5, 0x0d, + 0x36, 0x71, 0xcd, 0x0c, ], ivk: [ - 0x6e, 0xa4, 0x36, 0x3c, 0xb2, 0xdf, 0x62, 0xb1, 0x0d, 0xa1, 0x30, 0x8a, 0x0b, 0x96, - 0x79, 0xbd, 0x0f, 0x74, 0x95, 0xff, 0xe7, 0xd4, 0xe2, 0x61, 0x8f, 0x54, 0xdf, 0x9b, - 0x67, 0x0c, 0x33, 0x16, + 0x2c, 0x2b, 0x90, 0xc8, 0x3c, 0x30, 0xc2, 0x71, 0x64, 0xce, 0x4d, 0xd9, 0x14, 0xe6, + 0xb8, 0x9e, 0x99, 0x50, 0xe4, 0xf9, 0xa7, 0xa2, 0x4a, 0xfb, 0xcf, 0x11, 0xfe, 0x0d, + 0x86, 0xb1, 0x36, 0x1d, ], ovk: [ - 0xa6, 0x3c, 0xbc, 0xd3, 0x1b, 0xa1, 0x36, 0xd8, 0x3b, 0x8f, 0x1e, 0x88, 0xef, 0xb6, - 0x00, 0x55, 0xef, 0x6f, 0x98, 0x25, 0x2d, 0xdb, 0xd7, 0x5f, 0x62, 0x5f, 0x44, 0xdc, - 0xb6, 0x63, 0x2c, 0x72, + 0x30, 0xe0, 0xa4, 0x48, 0xa6, 0x1e, 0x75, 0xa2, 0x5b, 0xd5, 0x89, 0x61, 0x12, 0x5a, + 0x8e, 0xae, 0x84, 0x45, 0x24, 0xde, 0x0d, 0x91, 0x22, 0xa1, 0x2a, 0x4d, 0x59, 0x6c, + 0xfe, 0xdf, 0xab, 0xc1, ], dk: [ - 0x02, 0xf0, 0x74, 0x08, 0xf3, 0x3e, 0x87, 0x12, 0xe4, 0xc9, 0xec, 0x42, 0xde, 0x56, - 0x04, 0x20, 0x01, 0x09, 0x86, 0x17, 0x24, 0xd3, 0x3e, 0xb6, 0x36, 0x8b, 0x70, 0xf6, - 0x5e, 0x0a, 0x16, 0x21, + 0x33, 0xe4, 0x2c, 0x50, 0xa6, 0x37, 0xe9, 0xdb, 0x68, 0xbe, 0x33, 0x11, 0xbf, 0x5d, + 0x7f, 0xc4, 0x77, 0x4b, 0xe6, 0x19, 0x26, 0xc8, 0x7e, 0xe4, 0xc7, 0xef, 0x36, 0xf1, + 0x87, 0xbb, 0x8c, 0xea, ], default_d: [ - 0x08, 0xdf, 0x1d, 0x4b, 0x45, 0xc6, 0x73, 0xa4, 0x59, 0xff, 0x58, + 0xc8, 0xa8, 0x3e, 0x75, 0xb1, 0x29, 0x1e, 0x29, 0x59, 0x00, 0xa5, ], default_pk_d: [ - 0x26, 0x8c, 0xc2, 0x4b, 0x38, 0xa6, 0x28, 0x80, 0xb6, 0xee, 0x3c, 0xbc, 0xb8, 0x5a, - 0x71, 0x2f, 0xa6, 0x86, 0xcf, 0xfc, 0xa6, 0xdb, 0x2f, 0xee, 0xc5, 0xf3, 0xc3, 0x56, - 0x6f, 0x84, 0x21, 0x8f, + 0xc5, 0xc1, 0x1c, 0x61, 0x37, 0xce, 0x83, 0x92, 0x69, 0xee, 0x46, 0xc7, 0x97, 0xeb, + 0xc4, 0x6c, 0x10, 0x53, 0x1c, 0x11, 0xc7, 0x51, 0xa7, 0xda, 0xab, 0xa6, 0x62, 0x2a, + 0x43, 0xe5, 0xaf, 0x35, ], internal_rivk: [ - 0x00, 0x57, 0x37, 0x74, 0x61, 0xf2, 0x19, 0x1a, 0x7e, 0xca, 0x2b, 0x02, 0xed, 0xfd, - 0x9c, 0x9b, 0x44, 0x84, 0x5d, 0x2f, 0xdb, 0x8a, 0x99, 0xc7, 0x61, 0x20, 0x52, 0x7e, - 0x53, 0xdd, 0x09, 0x17, + 0x69, 0xa9, 0x4e, 0x8c, 0x99, 0x82, 0x59, 0xfe, 0x6e, 0x54, 0x6c, 0x83, 0x32, 0x8b, + 0x72, 0xf6, 0xf8, 0x3e, 0x80, 0x11, 0x70, 0x6a, 0x5e, 0x31, 0xc2, 0x0c, 0xf8, 0x85, + 0x1e, 0x13, 0x94, 0x37, ], internal_ivk: [ - 0x81, 0x62, 0x97, 0x35, 0x09, 0x47, 0x0c, 0x44, 0x24, 0x19, 0x11, 0xc0, 0x6d, 0x04, - 0x02, 0x9f, 0x5f, 0x1f, 0x0e, 0x98, 0x51, 0xe3, 0x2b, 0xa6, 0x9b, 0x18, 0xe5, 0x81, - 0x05, 0xdd, 0x4e, 0x2b, + 0x14, 0xb4, 0xf4, 0x27, 0xd3, 0x39, 0xd1, 0xba, 0x26, 0xae, 0xcd, 0x57, 0x6f, 0x65, + 0x60, 0x9f, 0x18, 0xd9, 0xfc, 0x35, 0xb5, 0xf6, 0xdb, 0x5a, 0xf4, 0xc2, 0xa4, 0x32, + 0x09, 0x5b, 0x88, 0x28, ], internal_ovk: [ - 0x69, 0x47, 0x91, 0x0e, 0xa3, 0xe7, 0x33, 0x1d, 0x15, 0xa7, 0x1a, 0x64, 0xb2, 0xa8, - 0xc1, 0x6a, 0x6d, 0xa0, 0x8e, 0x6f, 0x34, 0x29, 0xdb, 0x26, 0xf9, 0x37, 0xab, 0x9d, - 0xd1, 0x33, 0xb5, 0xfd, + 0x01, 0xdb, 0x0e, 0x1d, 0x57, 0x47, 0x62, 0xfd, 0xf3, 0x18, 0xa4, 0xf0, 0x48, 0x57, + 0xcf, 0x3b, 0x35, 0x7e, 0xeb, 0xd7, 0xad, 0x92, 0x9e, 0xb9, 0xf8, 0xf1, 0x37, 0x33, + 0xda, 0x8f, 0x2d, 0x69, ], internal_dk: [ - 0x32, 0x7f, 0x76, 0xcc, 0x42, 0x44, 0xce, 0x0a, 0x91, 0x48, 0xa3, 0x5a, 0x7e, 0xa6, - 0x22, 0x8d, 0x44, 0x1c, 0x4c, 0x7b, 0x05, 0xbd, 0x02, 0x65, 0x7c, 0xea, 0xab, 0xb6, - 0x09, 0xbc, 0x3c, 0x52, + 0xf7, 0x6c, 0xb8, 0x2a, 0x6f, 0xe2, 0x49, 0xaf, 0xda, 0x87, 0xa7, 0xb5, 0xd8, 0xf7, + 0x7c, 0x4f, 0xba, 0x4d, 0x62, 0x73, 0xd8, 0x0e, 0xe4, 0x5a, 0x3d, 0xd5, 0xb6, 0x37, + 0xa4, 0x30, 0x5f, 0xdb, + ], + asset: [ + 0x57, 0xf4, 0xb4, 0x5d, 0x64, 0x19, 0xf0, 0xd2, 0xe2, 0xc5, 0xaf, 0x33, 0xae, 0x24, + 0x37, 0x85, 0xb3, 0x25, 0xcd, 0xab, 0x95, 0x40, 0x4f, 0xc7, 0xae, 0xd7, 0x05, 0x25, + 0xcd, 0xdb, 0x41, 0x87, ], - note_v: 12606128263924155660, + note_v: 3250512694054592767, note_rho: [ - 0x12, 0xf6, 0xb0, 0x2f, 0xe8, 0x06, 0xb9, 0x45, 0x69, 0xcd, 0x40, 0x59, 0xf3, 0x96, - 0xbf, 0x29, 0xb9, 0x9d, 0x0a, 0x40, 0xe5, 0xe1, 0x71, 0x1c, 0xa9, 0x44, 0xf7, 0x2d, - 0x43, 0x6a, 0x10, 0x2f, + 0xbd, 0xf9, 0x55, 0x59, 0x48, 0xcb, 0xd5, 0xa3, 0x32, 0xd0, 0x45, 0xde, 0x6b, 0xa6, + 0xbf, 0x44, 0x90, 0xad, 0xfe, 0x74, 0x44, 0xcd, 0x46, 0x7a, 0x09, 0x07, 0x54, 0x17, + 0xfc, 0xc0, 0x06, 0x2e, ], note_rseed: [ - 0xca, 0x4b, 0x97, 0x69, 0x3d, 0xa0, 0xb0, 0x86, 0xfe, 0x9d, 0x2e, 0x71, 0x62, 0x47, - 0x0d, 0x02, 0xe0, 0xf0, 0x5d, 0x4b, 0xec, 0x95, 0x12, 0xbf, 0xb3, 0xf3, 0x83, 0x27, - 0x29, 0x6e, 0xfa, 0xa7, + 0x49, 0xf0, 0x08, 0xc5, 0x1a, 0xd4, 0x22, 0x74, 0x39, 0xc1, 0xb4, 0x47, 0x6c, 0xcd, + 0x8e, 0x97, 0x86, 0x2d, 0xab, 0x7b, 0xe1, 0xe8, 0xd3, 0x99, 0xc0, 0x5e, 0xf2, 0x7c, + 0x6e, 0x22, 0xee, 0x27, ], note_cmx: [ - 0x6a, 0x11, 0x95, 0xaa, 0x05, 0x36, 0xf6, 0x0e, 0xcf, 0xae, 0xcb, 0xdf, 0x53, 0x74, - 0xe4, 0x94, 0xea, 0x07, 0x2a, 0x2b, 0x86, 0x7b, 0x5f, 0x69, 0x43, 0x40, 0xc9, 0x6f, - 0xc3, 0x70, 0xa9, 0x10, + 0x83, 0xc0, 0x41, 0xba, 0x80, 0x64, 0x27, 0x9b, 0x24, 0x02, 0xae, 0x1e, 0x60, 0x30, + 0xcb, 0x89, 0xc5, 0x0d, 0x96, 0x6e, 0x03, 0x93, 0x73, 0x5c, 0x45, 0x81, 0xd4, 0x98, + 0x11, 0x38, 0x8d, 0x01, ], note_nf: [ - 0xb0, 0xf1, 0x60, 0x2a, 0x2b, 0x1a, 0xf2, 0xfc, 0x55, 0xf1, 0x59, 0x50, 0xa6, 0x83, - 0x83, 0x85, 0xe5, 0xe3, 0x9f, 0xec, 0xfd, 0x05, 0xcc, 0xec, 0x79, 0x9b, 0x75, 0xc6, - 0x5c, 0x8d, 0xa2, 0x35, + 0x1c, 0xe7, 0x2d, 0x48, 0x1c, 0xd5, 0x9e, 0x6c, 0x89, 0x5d, 0x2c, 0x65, 0x85, 0xe9, + 0x77, 0x27, 0x9d, 0x99, 0x27, 0x2e, 0x66, 0xa6, 0xda, 0xa4, 0x74, 0x20, 0xed, 0xbb, + 0xa7, 0xf8, 0x9f, 0x27, ], }, TestVector { sk: [ - 0x43, 0x28, 0xb1, 0x18, 0xc2, 0x74, 0x02, 0xc7, 0x0c, 0x3a, 0x90, 0xb4, 0x9a, 0xd4, - 0xbb, 0xc6, 0x8e, 0x37, 0xc0, 0xaa, 0x7d, 0x9b, 0x3f, 0xe1, 0x77, 0x99, 0xd7, 0x3b, - 0x84, 0x1e, 0x75, 0x17, + 0x3e, 0x15, 0x78, 0x6e, 0x39, 0x4c, 0x8f, 0x1b, 0xe3, 0x16, 0x82, 0xa3, 0x01, 0x47, + 0x96, 0x3a, 0xc8, 0xda, 0x8d, 0x41, 0xd8, 0x04, 0x25, 0x84, 0x26, 0xa3, 0xf7, 0x02, + 0x89, 0xb8, 0xad, 0x19, ], ask: [ - 0x28, 0xdc, 0x45, 0xf1, 0x15, 0x44, 0x42, 0x5c, 0x1b, 0xef, 0x86, 0x61, 0xda, 0x11, - 0x15, 0x5f, 0xdb, 0xb7, 0xe3, 0xbc, 0xfc, 0x0f, 0x0d, 0x49, 0xe6, 0xf1, 0x31, 0xe7, - 0xc0, 0x9d, 0x35, 0x2f, + 0xd4, 0x21, 0xad, 0x5b, 0x18, 0x0c, 0x34, 0x4b, 0x93, 0xb4, 0xcf, 0x3c, 0xe9, 0x55, + 0x49, 0x1e, 0x00, 0x58, 0x45, 0xd9, 0x2e, 0x6f, 0xd6, 0xe9, 0xeb, 0x27, 0x6d, 0xfd, + 0xe6, 0xea, 0x89, 0x0c, ], ak: [ - 0x0d, 0x21, 0x1a, 0x90, 0x60, 0xfb, 0xaa, 0x66, 0x4e, 0x41, 0xa7, 0x34, 0xad, 0x1d, - 0x8d, 0x4b, 0x02, 0x5f, 0x8c, 0xc1, 0x60, 0xe1, 0xf4, 0xe9, 0x5f, 0x0a, 0x85, 0x3e, - 0xbc, 0x41, 0x6a, 0x2b, + 0x91, 0x34, 0xed, 0x63, 0xae, 0xe1, 0x94, 0xb4, 0xb5, 0x58, 0xf5, 0xf6, 0x55, 0xba, + 0xb5, 0x39, 0x39, 0x6b, 0x99, 0x67, 0x8e, 0xf9, 0x1f, 0x44, 0x5b, 0x51, 0x7c, 0x79, + 0xc5, 0x82, 0x18, 0x0e, + ], + isk: [ + 0xd8, 0xde, 0x13, 0xbe, 0x4e, 0xeb, 0xe3, 0xbd, 0x4c, 0x8a, 0x6f, 0x55, 0xd6, 0xe0, + 0xc3, 0x73, 0xd4, 0x56, 0x85, 0x18, 0x79, 0xf5, 0xfb, 0xc2, 0x82, 0xdb, 0x9e, 0x13, + 0x48, 0x06, 0xbf, 0xf7, + ], + ik: [ + 0xb7, 0x47, 0x4b, 0x65, 0x52, 0xdf, 0xc5, 0xe1, 0xe2, 0x57, 0xca, 0xbf, 0xee, 0x40, + 0xe6, 0x08, 0x85, 0x7a, 0x2f, 0xbd, 0x48, 0xfd, 0xa6, 0x6e, 0x9c, 0x71, 0x31, 0x17, + 0x11, 0x58, 0x24, 0xa8, ], nk: [ - 0x3e, 0x88, 0xf2, 0x07, 0x1f, 0xd9, 0xa2, 0xbb, 0x26, 0xcd, 0xa2, 0xea, 0x85, 0x6a, - 0xa0, 0xfb, 0x3a, 0x80, 0xa8, 0x7d, 0x2f, 0xb6, 0x13, 0x6f, 0xab, 0x85, 0xe3, 0x6c, - 0x5b, 0x38, 0xd8, 0x24, + 0x1b, 0x7d, 0x9f, 0x63, 0x24, 0x9b, 0x96, 0xe7, 0xde, 0x1e, 0xe9, 0xfc, 0xf9, 0x3b, + 0xbd, 0xa4, 0xeb, 0xe7, 0xe8, 0xe4, 0xc2, 0x1a, 0x6f, 0xe4, 0x24, 0xe9, 0x0b, 0x1d, + 0x72, 0x4f, 0x58, 0x39, ], rivk: [ - 0x2c, 0x37, 0x38, 0x82, 0xc4, 0x08, 0xcd, 0x5f, 0xd4, 0x82, 0xa0, 0xc9, 0x81, 0x6f, - 0xc3, 0x22, 0x03, 0xa1, 0x0f, 0xbf, 0xce, 0x0e, 0x20, 0x0c, 0xcf, 0xd9, 0xee, 0x30, - 0x7c, 0x5e, 0x12, 0x24, + 0x60, 0x2b, 0x39, 0xb7, 0xca, 0xff, 0x4e, 0x65, 0x6d, 0x1e, 0x2e, 0x50, 0x87, 0xbf, + 0x19, 0xec, 0x40, 0x93, 0x92, 0x5b, 0x99, 0x36, 0xb2, 0x72, 0x70, 0x74, 0x8e, 0x1b, + 0x16, 0xe0, 0x2f, 0x05, ], ivk: [ - 0xbb, 0x9e, 0x20, 0xb2, 0x99, 0x1c, 0x99, 0x6d, 0xa2, 0x1e, 0x3e, 0xcd, 0x39, 0xfb, - 0x7b, 0x3a, 0xa2, 0xba, 0xbc, 0x6b, 0xde, 0x18, 0x6f, 0x7d, 0xd8, 0xa8, 0x75, 0xd1, - 0x0c, 0x51, 0xa4, 0x30, + 0x5c, 0xb0, 0x1e, 0x28, 0x3d, 0x8b, 0x9e, 0xb1, 0x39, 0xe7, 0x4d, 0x4a, 0x72, 0xca, + 0x45, 0x14, 0x6b, 0xa7, 0xdd, 0x5e, 0x33, 0xe2, 0x79, 0xd3, 0x59, 0xd0, 0xc2, 0x75, + 0x01, 0x5a, 0xc1, 0x18, ], ovk: [ - 0x93, 0x21, 0x83, 0x8a, 0x2d, 0xb7, 0xf1, 0x68, 0xf0, 0xce, 0x77, 0xc4, 0x5b, 0x21, - 0x1f, 0xfb, 0xb9, 0xb3, 0x65, 0xe8, 0x5e, 0x67, 0x31, 0xd9, 0x09, 0x70, 0x05, 0x53, - 0xde, 0x49, 0x2b, 0x28, + 0x92, 0x13, 0x53, 0x2c, 0x80, 0xac, 0x0c, 0x31, 0x00, 0x1c, 0x08, 0x29, 0x67, 0x89, + 0x8c, 0xe1, 0x5e, 0xc6, 0x7e, 0xd5, 0xe6, 0x89, 0x65, 0x34, 0xb3, 0x3f, 0xc3, 0x4a, + 0x80, 0xda, 0x82, 0x83, ], dk: [ - 0x3d, 0xf5, 0x83, 0x36, 0x1b, 0x33, 0x38, 0xbb, 0x68, 0x15, 0xf8, 0x58, 0x72, 0xe3, - 0x9f, 0x04, 0xdf, 0x50, 0x08, 0x52, 0x48, 0x84, 0xaf, 0x0f, 0x8c, 0x55, 0x97, 0x16, - 0xfc, 0xb1, 0x49, 0x58, + 0x54, 0x72, 0xf9, 0x27, 0x27, 0x9e, 0xd7, 0xce, 0xc0, 0x9e, 0x60, 0xe7, 0x13, 0xd9, + 0xaf, 0x82, 0xe6, 0x79, 0x6f, 0x60, 0x9b, 0x83, 0xe7, 0xff, 0xdf, 0x2e, 0xbf, 0x16, + 0x4a, 0xd8, 0xa2, 0xb6, ], default_d: [ - 0x4c, 0x40, 0x64, 0xc4, 0x7a, 0x5c, 0xa6, 0xe7, 0x5d, 0x46, 0x44, + 0xac, 0xfb, 0x8d, 0xbc, 0x78, 0x27, 0x95, 0xb0, 0x21, 0xa1, 0xaf, ], default_pk_d: [ - 0xf5, 0x17, 0x17, 0x4b, 0xe2, 0x58, 0x92, 0x32, 0x78, 0xcf, 0x45, 0x89, 0x08, 0xc0, - 0x73, 0x56, 0x49, 0xf1, 0x89, 0x9d, 0xb9, 0x9c, 0x3b, 0xa9, 0x00, 0x3f, 0x4b, 0xa3, - 0x0a, 0xb0, 0xd2, 0x10, + 0x5c, 0x9e, 0xac, 0x4a, 0x26, 0x36, 0xef, 0x27, 0x0b, 0xd8, 0x98, 0x6b, 0x72, 0xb7, + 0x01, 0x45, 0x5d, 0x40, 0x14, 0xbb, 0x83, 0xe8, 0x31, 0xa7, 0x04, 0x01, 0x75, 0x3d, + 0xc7, 0xf5, 0x58, 0x3b, ], internal_rivk: [ - 0xd8, 0x09, 0xa2, 0xa3, 0xd3, 0x6e, 0xf9, 0x6d, 0xc5, 0x63, 0xf8, 0xa7, 0xb4, 0x13, - 0x90, 0x8b, 0xfd, 0xff, 0xc0, 0x6d, 0x51, 0x06, 0x48, 0x49, 0xef, 0x88, 0x6b, 0x6a, - 0x1d, 0x1d, 0x7c, 0x3f, + 0x52, 0x22, 0xd7, 0x35, 0x07, 0x6e, 0x53, 0x15, 0x2a, 0x3d, 0x00, 0x33, 0x19, 0x6e, + 0xe7, 0x3c, 0x7f, 0x6b, 0xf6, 0x08, 0xce, 0x1a, 0x7d, 0x54, 0xac, 0xfc, 0x04, 0x54, + 0x91, 0x87, 0xe7, 0x02, ], internal_ivk: [ - 0xae, 0x18, 0xa9, 0xa4, 0x25, 0x12, 0x38, 0x7f, 0x92, 0xee, 0xc1, 0x34, 0xbd, 0xe5, - 0x28, 0xb6, 0x2b, 0x61, 0xe9, 0x95, 0x6f, 0x9f, 0xb3, 0xc7, 0xd6, 0x5e, 0x19, 0x45, - 0xda, 0x34, 0xf3, 0x09, + 0x44, 0xff, 0x25, 0xf6, 0xbd, 0x3e, 0xfc, 0xc1, 0x4a, 0x12, 0xdb, 0x7e, 0x2d, 0x2a, + 0xdd, 0xce, 0xe4, 0x84, 0x86, 0x22, 0xa9, 0x98, 0xb7, 0x83, 0x60, 0x88, 0x78, 0x36, + 0x0a, 0xb8, 0xd7, 0x24, ], internal_ovk: [ - 0x67, 0xa6, 0xd8, 0x4a, 0x81, 0x66, 0x32, 0x6c, 0xf3, 0x4c, 0xed, 0xff, 0xd4, 0x29, - 0x8a, 0x13, 0xb8, 0x01, 0xcb, 0x12, 0x2d, 0x5f, 0x33, 0x29, 0xa1, 0x59, 0x9f, 0x31, - 0xea, 0xdf, 0x5b, 0x17, + 0x21, 0x1d, 0x5c, 0x4e, 0x72, 0x3f, 0x62, 0xfc, 0xdd, 0x7f, 0x90, 0xe9, 0x54, 0xd1, + 0xba, 0x14, 0xe5, 0x9f, 0xb6, 0x0c, 0xdd, 0x7e, 0x44, 0xb7, 0xb9, 0x4a, 0x58, 0xcc, + 0x48, 0xfa, 0x96, 0x67, ], internal_dk: [ - 0xa0, 0x07, 0x3a, 0xdd, 0xfb, 0x89, 0xc9, 0xcc, 0x34, 0x9e, 0xad, 0x5a, 0x92, 0xb7, - 0xd4, 0x17, 0xfe, 0x0e, 0x61, 0xf4, 0xa7, 0xe5, 0x66, 0x69, 0xc9, 0x07, 0xd4, 0x17, - 0x46, 0xc0, 0x72, 0xb9, + 0xa6, 0xc2, 0x25, 0xd5, 0xac, 0xd0, 0x8e, 0x27, 0xb9, 0x46, 0x80, 0x71, 0x19, 0xc5, + 0xb0, 0x46, 0xb6, 0x97, 0x5c, 0xb1, 0xa0, 0x3a, 0xac, 0xf0, 0x89, 0x76, 0x39, 0xb0, + 0x65, 0x4c, 0x7e, 0x20, + ], + asset: [ + 0x0c, 0x15, 0x13, 0xad, 0x47, 0xca, 0x61, 0xc6, 0x59, 0xcc, 0x5d, 0x32, 0x5b, 0x44, + 0x0f, 0x6b, 0x9f, 0x59, 0xaf, 0xf6, 0x68, 0x79, 0xbb, 0x66, 0x88, 0xfd, 0x28, 0x59, + 0x36, 0x2b, 0x18, 0x2f, ], - note_v: 625536973899669523, + note_v: 7844555504117092638, note_rho: [ - 0x03, 0xfd, 0x69, 0x44, 0x2e, 0xb7, 0x68, 0x1e, 0xc2, 0xa0, 0x56, 0x00, 0x05, 0x4e, - 0x92, 0xee, 0xd5, 0x55, 0x02, 0x8f, 0x21, 0xb6, 0xa1, 0x55, 0x26, 0x8a, 0x2d, 0xd6, - 0x64, 0x0a, 0x69, 0x30, + 0xf3, 0x7b, 0xf6, 0xf3, 0xac, 0x2d, 0x26, 0xb8, 0x46, 0x86, 0xe5, 0x69, 0xd5, 0x8d, + 0x99, 0xc1, 0x38, 0x35, 0x97, 0xfa, 0xd8, 0x11, 0x93, 0xc4, 0xc1, 0xb1, 0x6e, 0x6a, + 0x90, 0xe2, 0xd5, 0x07, ], note_rseed: [ - 0x1a, 0x52, 0xa3, 0x8d, 0x4d, 0x9f, 0x9f, 0x95, 0x7a, 0xe3, 0x5a, 0xf7, 0x16, 0x71, - 0x18, 0x14, 0x1c, 0xe4, 0xc9, 0xbe, 0x0a, 0x6a, 0x49, 0x2f, 0xe7, 0x9f, 0x15, 0x81, - 0xa1, 0x55, 0xfa, 0x3a, + 0xcd, 0xfe, 0x6f, 0xbd, 0xaa, 0x86, 0x16, 0x3e, 0x9c, 0xf5, 0xde, 0x31, 0x00, 0xfb, + 0xca, 0x7e, 0x8d, 0xa0, 0x47, 0xb0, 0x90, 0xdb, 0x9f, 0x37, 0x95, 0x2f, 0xbf, 0xee, + 0x76, 0xaf, 0x61, 0x66, ], note_cmx: [ - 0xf7, 0x0e, 0xbf, 0x0f, 0x5e, 0xe5, 0xda, 0x6c, 0x6c, 0xde, 0xff, 0x8f, 0xec, 0x2f, - 0x8e, 0xed, 0x65, 0xc8, 0x8e, 0x67, 0x55, 0xda, 0xf1, 0x14, 0xd5, 0x54, 0xaf, 0x19, - 0x67, 0xa7, 0xf4, 0x0a, + 0x2e, 0xc3, 0xc2, 0x5f, 0xed, 0x4b, 0x55, 0xf2, 0x3a, 0xef, 0xd4, 0x2a, 0x69, 0x61, + 0x59, 0x72, 0x69, 0x87, 0x74, 0xe6, 0x6c, 0xe2, 0x7f, 0x1b, 0x25, 0x6a, 0xce, 0x16, + 0x51, 0x7f, 0xc0, 0x3c, ], note_nf: [ - 0x95, 0x64, 0x97, 0x28, 0x46, 0x5e, 0x68, 0x2a, 0xc0, 0x57, 0xad, 0x87, 0x62, 0x94, - 0xd7, 0x00, 0xc2, 0x7f, 0xeb, 0xa2, 0xf7, 0x50, 0x92, 0x2f, 0x95, 0x51, 0x85, 0x70, - 0x62, 0x61, 0xc3, 0x0c, + 0xaf, 0x67, 0xf7, 0xdf, 0x55, 0x93, 0xc3, 0x90, 0x80, 0x60, 0xb0, 0x50, 0x35, 0x96, + 0xef, 0x32, 0x0b, 0xad, 0x21, 0x30, 0x20, 0xa8, 0x44, 0x7b, 0x69, 0x38, 0x81, 0xf2, + 0xfd, 0x35, 0x9f, 0x11, ], }, ] diff --git a/src/test_vectors/note_encryption.rs b/src/test_vectors/note_encryption.rs index e27ec24d8..b4a1f3137 100644 --- a/src/test_vectors/note_encryption.rs +++ b/src/test_vectors/note_encryption.rs @@ -1,6 +1,5 @@ -//! Test vectors for Orchard key components. - pub(crate) struct TestVector { + // make all fields public so we can use them in the test pub(crate) incoming_viewing_key: [u8; 64], pub(crate) ovk: [u8; 32], pub(crate) default_d: [u8; 11], @@ -22,8 +21,8 @@ pub(crate) struct TestVector { pub(crate) c_out: [u8; 80], } +// From https://github.com/zcash-hackworks/zcash-test-vectors/blob/master/orchard_note_encryption.py pub(crate) fn test_vectors() -> Vec { - // From https://github.com/zcash-hackworks/zcash-test-vectors/blob/master/orchard_note_encryption.py vec![ TestVector { incoming_viewing_key: [ @@ -96,35 +95,36 @@ pub(crate) fn test_vectors() -> Vec { 0x42, 0xc2, 0x38, 0x51, 0x38, 0x15, 0x30, 0x2d, 0xf0, 0xf4, 0x83, 0x04, 0x21, 0xa6, 0xc1, 0x3e, 0x71, 0x01, ], + // FIXME: used instead of rho, which was possibly modified in zsa1 version nf_old: [ 0xc5, 0x96, 0xfb, 0xd3, 0x2e, 0xbb, 0xcb, 0xad, 0xae, 0x60, 0xd2, 0x85, 0xc7, 0xd7, 0x5f, 0xa8, 0x36, 0xf9, 0xd2, 0xfa, 0x86, 0x10, 0x0a, 0xb8, 0x58, 0xea, 0x2d, 0xe1, 0xf1, 0x1c, 0x83, 0x06, ], cmx: [ - 0xa5, 0x70, 0x6f, 0x3d, 0x1b, 0x68, 0x8e, 0x9d, 0xc6, 0x34, 0xee, 0xe4, 0xe6, 0x5b, - 0x02, 0x8a, 0x43, 0xee, 0xae, 0xd2, 0x43, 0x5b, 0xea, 0x2a, 0xe3, 0xd5, 0x16, 0x05, - 0x75, 0xc1, 0x1a, 0x3b, + 0x23, 0x75, 0x7c, 0x51, 0x58, 0x21, 0xcb, 0xc1, 0x84, 0x3c, 0x9a, 0x45, 0x7b, 0x7e, + 0x6a, 0xe6, 0x01, 0xad, 0xd2, 0xea, 0x10, 0xb9, 0xc8, 0x6d, 0x6b, 0x31, 0x7c, 0xe2, + 0xf1, 0x7b, 0xd9, 0x21, ], esk: [ - 0x56, 0x66, 0x9d, 0x64, 0x3f, 0x78, 0x0b, 0x6a, 0xd8, 0xb3, 0xd3, 0x5a, 0xd7, 0x46, - 0x8a, 0xaa, 0x73, 0x27, 0x66, 0x57, 0x5f, 0x84, 0xa9, 0x5d, 0x20, 0xa6, 0x25, 0xff, - 0x38, 0x77, 0xea, 0x3f, + 0x5b, 0xfe, 0x46, 0x9c, 0x33, 0xe4, 0x47, 0xba, 0x45, 0x6b, 0x8b, 0xfe, 0x9b, 0x38, + 0x5b, 0x39, 0x31, 0xb4, 0xba, 0xeb, 0x8f, 0x70, 0x23, 0xfe, 0x8e, 0x33, 0x35, 0x4f, + 0xff, 0xf1, 0xbd, 0x1a, ], ephemeral_key: [ - 0xad, 0xdb, 0x47, 0xb6, 0xac, 0x5d, 0xfc, 0x16, 0x55, 0x89, 0x23, 0xd3, 0xa8, 0xf3, - 0x76, 0x09, 0x5c, 0x69, 0x5c, 0x04, 0x7c, 0x4e, 0x32, 0x66, 0xae, 0x67, 0x69, 0x87, - 0xf7, 0xe3, 0x13, 0x81, + 0x8a, 0x5e, 0x13, 0x2c, 0x3a, 0x07, 0x04, 0xf2, 0x45, 0x6f, 0xbd, 0x77, 0x7a, 0x13, + 0xd6, 0xec, 0x57, 0x65, 0x56, 0x71, 0xdb, 0x07, 0x2a, 0x7d, 0x27, 0x6a, 0xd9, 0x69, + 0xf5, 0xec, 0x45, 0x17, ], shared_secret: [ - 0x30, 0x3c, 0x1c, 0x3f, 0x2b, 0xcb, 0xb9, 0xd8, 0x49, 0x70, 0x15, 0xa6, 0xdf, 0xca, - 0x95, 0x4e, 0xce, 0x0d, 0x3b, 0x6c, 0xf1, 0x0a, 0xb9, 0xf7, 0x19, 0xeb, 0x89, 0x19, - 0x9e, 0xdf, 0xe9, 0x89, + 0x36, 0xd5, 0x4c, 0xab, 0xc6, 0x7f, 0x6c, 0xc7, 0x26, 0xa7, 0x30, 0xf3, 0xa0, 0xce, + 0xed, 0x58, 0x53, 0xf0, 0x8c, 0xd3, 0x81, 0x46, 0xc8, 0x34, 0x25, 0x98, 0x98, 0x7c, + 0x21, 0x50, 0x48, 0xa5, ], k_enc: [ - 0xef, 0x9d, 0x62, 0x25, 0x68, 0x7c, 0x2c, 0x91, 0x7b, 0x5c, 0xad, 0xa1, 0x75, 0x23, - 0xe8, 0xfb, 0xdb, 0x08, 0x82, 0x25, 0xaf, 0x2d, 0xb5, 0x72, 0xbb, 0x40, 0x0e, 0x44, - 0x8b, 0x5e, 0xa8, 0x71, + 0x82, 0xc4, 0x32, 0x65, 0x33, 0x7f, 0x1a, 0xb3, 0x7b, 0x18, 0xdf, 0x27, 0x75, 0x48, + 0x61, 0x82, 0x63, 0xb8, 0x02, 0x4d, 0x9b, 0x14, 0x5a, 0x05, 0xad, 0xe2, 0xeb, 0x54, + 0x79, 0x18, 0x03, 0x20, ], p_enc: [ 0x02, 0x56, 0xe8, 0x4b, 0x1a, 0xdc, 0x94, 0x23, 0xc3, 0x67, 0x6c, 0x04, 0x8d, 0x5f, @@ -170,68 +170,68 @@ pub(crate) fn test_vectors() -> Vec { 0xee, 0xcc, 0x40, 0xa9, ], c_enc: [ - 0x1a, 0x9a, 0xdb, 0x14, 0x24, 0x98, 0xe3, 0xdc, 0xc7, 0x6f, 0xed, 0x77, 0x86, 0x14, - 0xdd, 0x31, 0x6c, 0x02, 0xfb, 0xb8, 0xba, 0x92, 0x44, 0xae, 0x4c, 0x2e, 0x32, 0xa0, - 0x7d, 0xae, 0xec, 0xa4, 0x12, 0x26, 0xb9, 0x8b, 0xfe, 0x74, 0xf9, 0xfc, 0xb2, 0x28, - 0xcf, 0xc1, 0x00, 0xf3, 0x18, 0x0f, 0x57, 0x75, 0xec, 0xe3, 0x8b, 0xe7, 0xed, 0x45, - 0xd9, 0x40, 0x21, 0xf4, 0x40, 0x1b, 0x2a, 0x4d, 0x75, 0x82, 0xb4, 0x28, 0xd4, 0x9e, - 0xc7, 0xf5, 0xb5, 0xa4, 0x98, 0x97, 0x3e, 0x60, 0xe3, 0x8e, 0x74, 0xf5, 0xc3, 0xe5, - 0x77, 0x82, 0x7c, 0x38, 0x28, 0x57, 0xd8, 0x16, 0x6b, 0x54, 0xe6, 0x4f, 0x66, 0xef, - 0x5c, 0x7e, 0x8c, 0x9b, 0xaa, 0x2a, 0x3f, 0xa9, 0xe3, 0x7d, 0x08, 0x77, 0x17, 0xd5, - 0xe9, 0x6b, 0xc2, 0xf7, 0x3d, 0x03, 0x14, 0x50, 0xdc, 0x24, 0x32, 0xba, 0x49, 0xd8, - 0xb7, 0x4d, 0xb2, 0x13, 0x09, 0x9e, 0xa9, 0xba, 0x04, 0xeb, 0x63, 0xb6, 0x57, 0x4d, - 0x46, 0xc0, 0x3c, 0xe7, 0x90, 0x0d, 0x4a, 0xc4, 0xbb, 0x18, 0x8e, 0xe9, 0x03, 0x0d, - 0x7f, 0x69, 0xc8, 0x95, 0xa9, 0x4f, 0xc1, 0x82, 0xf2, 0x25, 0xa9, 0x4f, 0x0c, 0xde, - 0x1b, 0x49, 0x88, 0x68, 0x71, 0xa3, 0x76, 0x34, 0x1e, 0xa9, 0x41, 0x71, 0xbe, 0xfd, - 0x95, 0xa8, 0x30, 0xfa, 0x18, 0x40, 0x70, 0x97, 0xdc, 0xa5, 0x11, 0x02, 0x54, 0x63, - 0xd4, 0x37, 0xe9, 0x69, 0x5c, 0xaa, 0x07, 0x9a, 0x2f, 0x68, 0xcd, 0xc7, 0xf2, 0xc1, - 0x32, 0x67, 0xbf, 0xf4, 0x19, 0x51, 0x37, 0xfa, 0x89, 0x53, 0x25, 0x2a, 0x81, 0xb2, - 0xaf, 0xa1, 0x58, 0x2b, 0x9b, 0xfb, 0x4a, 0xc9, 0x60, 0x37, 0xed, 0x29, 0x91, 0xd3, - 0xcb, 0xc7, 0xd5, 0x4a, 0xff, 0x6e, 0x62, 0x1b, 0x06, 0xa7, 0xb2, 0xb9, 0xca, 0xf2, - 0x95, 0x5e, 0xfa, 0xf4, 0xea, 0x8e, 0xfc, 0xfd, 0x02, 0x3a, 0x3c, 0x17, 0x48, 0xdf, - 0x3c, 0xbd, 0x43, 0xe0, 0xb9, 0xa8, 0xb0, 0x94, 0x56, 0x88, 0xd5, 0x20, 0x56, 0xc1, - 0xd1, 0x6e, 0xea, 0x37, 0xe7, 0x98, 0xba, 0x31, 0xdc, 0x3e, 0x5d, 0x49, 0x52, 0xbd, - 0x51, 0xec, 0x76, 0x9d, 0x57, 0x88, 0xb6, 0xe3, 0x5f, 0xe9, 0x04, 0x2b, 0x95, 0xd4, - 0xd2, 0x17, 0x81, 0x40, 0x0e, 0xaf, 0xf5, 0x86, 0x16, 0xad, 0x56, 0x27, 0x96, 0x63, - 0x6a, 0x50, 0xb8, 0xed, 0x6c, 0x7f, 0x98, 0x1d, 0xc7, 0xba, 0x81, 0x4e, 0xff, 0x15, - 0x2c, 0xb2, 0x28, 0xa2, 0xea, 0xd2, 0xf8, 0x32, 0x66, 0x2f, 0xa4, 0xa4, 0xa5, 0x07, - 0x97, 0xb0, 0xf8, 0x5b, 0x62, 0xd0, 0x8b, 0x1d, 0xd2, 0xd8, 0xe4, 0x3b, 0x4a, 0x5b, - 0xfb, 0xb1, 0x59, 0xed, 0x57, 0x8e, 0xf7, 0x47, 0x5d, 0xe0, 0xad, 0xa1, 0x3e, 0x17, - 0xad, 0x87, 0xcc, 0x23, 0x05, 0x67, 0x2b, 0xcc, 0x55, 0xa8, 0x88, 0x13, 0x17, 0xfd, - 0xc1, 0xbf, 0xc4, 0x59, 0xb6, 0x8b, 0x2d, 0xf7, 0x0c, 0xad, 0x37, 0x70, 0xed, 0x0f, - 0xd0, 0x2d, 0x64, 0xb9, 0x6f, 0x2b, 0xbf, 0x6f, 0x8f, 0x63, 0x2e, 0x86, 0x6c, 0xa5, - 0xd1, 0x96, 0xd2, 0x48, 0xad, 0x05, 0xc3, 0xde, 0x64, 0x41, 0x48, 0xa8, 0x0b, 0x51, - 0xad, 0xa9, 0x5b, 0xd0, 0x8d, 0x73, 0xcd, 0xbb, 0x45, 0x26, 0x4f, 0x3b, 0xd1, 0x13, - 0x83, 0x5b, 0x46, 0xf9, 0xbe, 0x7b, 0x6d, 0x23, 0xa4, 0x3b, 0xdd, 0xfe, 0x1e, 0x74, - 0x08, 0xc9, 0x70, 0x31, 0xe1, 0xa8, 0x21, 0x4b, 0xab, 0x46, 0x39, 0x10, 0x44, 0xb7, - 0x00, 0xd3, 0x8f, 0x51, 0x92, 0xc5, 0x7f, 0xe6, 0xf8, 0x71, 0x59, 0xb5, 0x55, 0x12, - 0x09, 0x4e, 0x29, 0xd2, 0xce, 0xba, 0xb8, 0x68, 0xc8, 0xf1, 0xad, 0xba, 0xd5, 0x70, - 0x77, 0xcb, 0xeb, 0x5e, 0x69, 0x65, 0x85, 0x82, 0xbf, 0x98, 0xd1, 0x9d, 0x64, 0xf4, - 0x4b, 0x0d, 0x50, 0xc7, 0xe2, 0x20, 0x9a, 0xb3, 0xfc, 0x56, 0xb4, 0xf4, 0x09, 0x12, - 0x3a, 0xae, 0xb0, 0x26, 0x3a, 0x22, 0x45, 0x1b, 0xc1, 0x4e, 0xd7, 0x56, 0xd0, 0x48, - 0x38, 0x5a, 0xed, 0xbb, 0x86, 0xa8, 0x46, 0x77, 0xbb, 0x2d, 0x21, 0xc5, 0x2c, 0xc9, - 0x49, 0x41, 0x47, 0xbf, 0x0f, 0xb1, 0x02, 0x74, 0x52, 0x82, 0x99, 0x09, 0x09, 0x72, - 0x62, 0x28, 0x18, 0x6e, 0x02, 0xc8, + 0x93, 0xe0, 0x48, 0x74, 0xb5, 0x83, 0x7c, 0x26, 0x1d, 0xaf, 0x1a, 0x27, 0xb7, 0x83, + 0xec, 0x48, 0x65, 0xd3, 0xbb, 0x72, 0x8e, 0xb1, 0x61, 0xda, 0xed, 0xb8, 0x44, 0x6a, + 0xb3, 0x8f, 0x07, 0x8e, 0xa8, 0x66, 0x2e, 0x4d, 0x2e, 0x9d, 0x00, 0xa3, 0x95, 0x27, + 0xdc, 0xde, 0x51, 0x7a, 0xc3, 0xdb, 0xf9, 0xd2, 0x7e, 0x3c, 0x79, 0xfa, 0x88, 0x1a, + 0xbb, 0x48, 0xb7, 0x0d, 0xbc, 0x28, 0xdd, 0xf4, 0xaf, 0x81, 0xae, 0xed, 0x2a, 0x29, + 0x86, 0x00, 0x51, 0x08, 0x48, 0xed, 0xbd, 0xc4, 0x2e, 0x88, 0x95, 0x48, 0x70, 0xd5, + 0xd6, 0x01, 0xcd, 0xf2, 0x90, 0x18, 0x1b, 0x53, 0x91, 0x05, 0xb9, 0xf6, 0x13, 0x86, + 0xcb, 0x07, 0x84, 0x6b, 0xc8, 0xe3, 0x19, 0xdf, 0xab, 0x8e, 0x10, 0x97, 0x66, 0xa2, + 0x8c, 0x1e, 0x0b, 0xbf, 0x91, 0x32, 0x02, 0xce, 0xcd, 0x1b, 0x48, 0x17, 0xa2, 0x28, + 0x2f, 0xc2, 0x9e, 0xd4, 0x4d, 0x9b, 0x04, 0x04, 0x9d, 0xe5, 0x5a, 0xcf, 0x54, 0x99, + 0xe5, 0xf5, 0x65, 0xd4, 0x8b, 0x8f, 0x19, 0x72, 0xc0, 0x43, 0x84, 0x77, 0x96, 0x23, + 0x0d, 0xc6, 0x8f, 0x32, 0x57, 0xc0, 0x85, 0x29, 0x14, 0x8c, 0x8e, 0x0c, 0x32, 0x7b, + 0x25, 0xb4, 0x59, 0x87, 0x7c, 0xde, 0xd9, 0x8f, 0xf7, 0x8e, 0x81, 0xfa, 0x69, 0x2e, + 0x14, 0xf8, 0xfd, 0xa1, 0xfe, 0x52, 0x4f, 0xf1, 0x50, 0x18, 0x1f, 0x73, 0x6e, 0xd3, + 0xa8, 0x8e, 0xc7, 0x89, 0xdc, 0x15, 0x95, 0x4a, 0x02, 0x63, 0x9a, 0x8a, 0x20, 0xca, + 0x38, 0xd8, 0x99, 0xbf, 0xd1, 0xc5, 0x73, 0xb0, 0x41, 0xee, 0x7b, 0xf2, 0x2b, 0x96, + 0x75, 0xbd, 0xa8, 0xc4, 0xb0, 0x58, 0xa0, 0x5a, 0x49, 0x33, 0x03, 0xb1, 0x1f, 0x35, + 0x81, 0xc1, 0x9d, 0x2d, 0xa9, 0x96, 0x6a, 0x71, 0x06, 0x6e, 0xc1, 0x7d, 0xcc, 0xd3, + 0x48, 0x20, 0x7e, 0xb3, 0x14, 0xf6, 0xcf, 0xc9, 0xd0, 0x6a, 0x62, 0x14, 0xc6, 0x72, + 0x10, 0x97, 0xa5, 0x2e, 0x27, 0x76, 0x66, 0x7c, 0x6b, 0xe9, 0xc8, 0x86, 0x2b, 0x17, + 0x3d, 0xb0, 0xe8, 0x04, 0xb1, 0x2c, 0xaa, 0xe9, 0xd9, 0xfa, 0x09, 0xf3, 0xf4, 0x8c, + 0xaf, 0x4b, 0xf7, 0x56, 0xa2, 0x78, 0x95, 0x0a, 0x25, 0x4e, 0xc4, 0x14, 0x76, 0x77, + 0xaa, 0xca, 0x21, 0x42, 0x96, 0x08, 0x1a, 0x2f, 0x62, 0x4a, 0x92, 0x78, 0x94, 0x6e, + 0x68, 0x9d, 0xd9, 0x14, 0x02, 0x90, 0x92, 0xe7, 0xfa, 0x8f, 0xbc, 0x8a, 0x04, 0x46, + 0x7d, 0x60, 0xed, 0xff, 0x5d, 0x97, 0xcb, 0x65, 0x09, 0xa0, 0xc7, 0x2c, 0xed, 0x77, + 0xac, 0xa8, 0x71, 0x30, 0x8e, 0x7d, 0xe2, 0xbe, 0xb1, 0x52, 0x0a, 0x34, 0x17, 0xd7, + 0x21, 0x3a, 0x9a, 0xbd, 0x47, 0x35, 0x8c, 0x4f, 0x32, 0x9f, 0x0f, 0x64, 0x41, 0x92, + 0x10, 0xa9, 0x9d, 0xb2, 0xde, 0x6e, 0x6d, 0x89, 0x21, 0xb0, 0xf4, 0xf9, 0x9f, 0xd6, + 0x45, 0xfa, 0xe0, 0xd6, 0x29, 0xce, 0x22, 0x11, 0x90, 0x5f, 0x25, 0xf4, 0x0d, 0x12, + 0x0b, 0x63, 0x27, 0x93, 0x75, 0xb5, 0x43, 0xc3, 0x1e, 0x3b, 0x55, 0x7e, 0x57, 0xa7, + 0xa8, 0x7c, 0x61, 0x79, 0xeb, 0xd3, 0x4f, 0x6d, 0xbb, 0x92, 0x0e, 0xc5, 0xe0, 0x5d, + 0x6a, 0x77, 0xec, 0xdf, 0x36, 0xb4, 0x57, 0xba, 0xb4, 0x56, 0x6c, 0x40, 0x8f, 0xb5, + 0x7d, 0xfc, 0xdd, 0xda, 0xa4, 0x2c, 0x51, 0x34, 0xaf, 0x3e, 0x97, 0x8d, 0xbf, 0xd0, + 0xdf, 0xb0, 0xca, 0x4f, 0xfa, 0xf1, 0x65, 0x0a, 0xbe, 0xe1, 0x62, 0x5f, 0x7f, 0x4b, + 0xf8, 0x25, 0x06, 0x01, 0x00, 0x64, 0x5b, 0x54, 0xc0, 0x04, 0x1f, 0xbf, 0xbd, 0xef, + 0xf7, 0xb9, 0x38, 0x04, 0xe9, 0xcc, 0x0c, 0xcd, 0x6f, 0x27, 0xbe, 0x40, 0x01, 0x6c, + 0x32, 0xd4, 0x2f, 0xe3, 0x66, 0xfa, 0xaa, 0x86, 0x87, 0xc2, 0xd1, 0x92, 0x61, 0x9f, + 0x56, 0x5b, 0x0c, 0x70, 0xea, 0x6a, 0x3f, 0x79, 0xd5, 0x3a, 0x52, 0x41, 0xe6, 0x9c, + 0x3c, 0xa6, 0x87, 0xa1, 0x12, 0xfb, 0x16, 0xc2, 0x5c, 0xc0, 0x83, 0x17, 0xdb, 0xa4, + 0x23, 0x97, 0x0c, 0x32, 0xdf, 0xb4, 0xbd, 0x69, 0x22, 0xe3, 0x36, 0xab, 0xf2, 0xfd, + 0xe2, 0xc3, 0xaa, 0x5d, 0xb2, 0x93, 0xef, 0x27, 0x47, 0x87, 0x6c, 0x8b, 0xd8, 0x6e, + 0xa1, 0x87, 0xcb, 0x60, 0x1a, 0xf7, ], ock: [ - 0x4e, 0x9d, 0x45, 0x94, 0x6b, 0x3e, 0xea, 0xe7, 0xfe, 0x30, 0x5d, 0x5b, 0x90, 0x50, - 0x36, 0x14, 0x1f, 0x9f, 0x40, 0x09, 0xa6, 0x29, 0x4b, 0x96, 0xc7, 0x22, 0xa4, 0xa0, - 0xbe, 0x68, 0x5d, 0xff, + 0xb3, 0x25, 0xeb, 0xe5, 0x7a, 0x2c, 0x40, 0xa8, 0xb2, 0x11, 0xcf, 0xdf, 0x72, 0xa1, + 0xa2, 0x44, 0xf1, 0x53, 0x42, 0x85, 0x98, 0x88, 0xa3, 0x64, 0x52, 0x3e, 0xfd, 0x2a, + 0xc6, 0x6a, 0x1a, 0xd6, ], op: [ 0x63, 0xf7, 0x12, 0x5d, 0xf4, 0x83, 0x6f, 0xd2, 0x81, 0x6b, 0x02, 0x4e, 0xe7, 0x0e, 0xfe, 0x09, 0xfb, 0x9a, 0x7b, 0x38, 0x63, 0xc6, 0xea, 0xcd, 0xf9, 0x5e, 0x03, 0x89, - 0x49, 0x50, 0x69, 0x2c, 0x56, 0x66, 0x9d, 0x64, 0x3f, 0x78, 0x0b, 0x6a, 0xd8, 0xb3, - 0xd3, 0x5a, 0xd7, 0x46, 0x8a, 0xaa, 0x73, 0x27, 0x66, 0x57, 0x5f, 0x84, 0xa9, 0x5d, - 0x20, 0xa6, 0x25, 0xff, 0x38, 0x77, 0xea, 0x3f, + 0x49, 0x50, 0x69, 0x2c, 0x5b, 0xfe, 0x46, 0x9c, 0x33, 0xe4, 0x47, 0xba, 0x45, 0x6b, + 0x8b, 0xfe, 0x9b, 0x38, 0x5b, 0x39, 0x31, 0xb4, 0xba, 0xeb, 0x8f, 0x70, 0x23, 0xfe, + 0x8e, 0x33, 0x35, 0x4f, 0xff, 0xf1, 0xbd, 0x1a, ], c_out: [ - 0xcb, 0xdf, 0x68, 0xa5, 0x7f, 0xb4, 0xa4, 0x6f, 0x34, 0x60, 0xff, 0x22, 0x7b, 0xc6, - 0x18, 0xda, 0xe1, 0x12, 0x29, 0x45, 0xb3, 0x80, 0xc7, 0xe5, 0x49, 0xcf, 0x4a, 0x6e, - 0x8b, 0xf3, 0x75, 0x49, 0xba, 0xe1, 0x89, 0x1f, 0xd8, 0xd1, 0xa4, 0x94, 0x4f, 0xdf, - 0x41, 0x0f, 0x07, 0x02, 0xed, 0xa5, 0x44, 0x2f, 0x0e, 0xa0, 0x1a, 0x5d, 0xf0, 0x12, - 0xa0, 0xae, 0x4d, 0x84, 0xed, 0x79, 0x80, 0x33, 0x28, 0xbd, 0x1f, 0xd5, 0xfa, 0xc7, - 0x19, 0x21, 0x6a, 0x77, 0x6d, 0xe6, 0x4f, 0xd1, 0x67, 0xdb, + 0x55, 0xb8, 0x90, 0x7c, 0x6d, 0x45, 0x4b, 0x83, 0x63, 0x4f, 0x1b, 0x9a, 0x1a, 0xa3, + 0xc3, 0xc9, 0x8a, 0xdc, 0x77, 0xd9, 0x6c, 0x2f, 0x62, 0x49, 0xec, 0x66, 0xdb, 0xae, + 0x4d, 0x0c, 0xc9, 0x40, 0xd7, 0x26, 0xbc, 0xd1, 0xec, 0x91, 0x18, 0x9f, 0xd3, 0x04, + 0x9a, 0x33, 0xf2, 0xea, 0x7d, 0x8b, 0x74, 0xaa, 0xc1, 0x7c, 0xda, 0x38, 0x83, 0x80, + 0x2d, 0xb5, 0x96, 0x9d, 0x8d, 0x2f, 0x32, 0x25, 0x91, 0x9c, 0xe3, 0x88, 0x26, 0x41, + 0x5c, 0xc6, 0xb3, 0x38, 0x94, 0x4b, 0x48, 0x99, 0x54, 0x8b, ], }, TestVector { @@ -305,35 +305,36 @@ pub(crate) fn test_vectors() -> Vec { 0xa2, 0x17, 0x64, 0x10, 0x4a, 0x23, 0xea, 0xf6, 0xba, 0x49, 0x6c, 0xb9, 0xb8, 0xe8, 0x25, 0x7a, 0xd8, 0xb3, ], + // FIXME: used instead of rho, which was possibly modified in zsa1 version nf_old: [ 0x33, 0x88, 0xda, 0x05, 0x06, 0xda, 0x9e, 0xa2, 0xd5, 0x16, 0x73, 0x9b, 0x95, 0x1c, 0x7c, 0xc0, 0x58, 0x53, 0x36, 0xb4, 0x4d, 0xf9, 0xb3, 0xb5, 0x0e, 0x48, 0x93, 0xe4, 0xb1, 0x84, 0x92, 0x11, ], cmx: [ - 0x9e, 0x04, 0x32, 0xb2, 0xb3, 0x33, 0xcd, 0xe8, 0xce, 0x92, 0x1b, 0x77, 0xca, 0x7e, - 0x9e, 0x41, 0x51, 0xe3, 0x74, 0xd5, 0x16, 0xcd, 0xa1, 0x17, 0x63, 0x83, 0x6a, 0xf3, - 0xb6, 0x6f, 0x5b, 0x15, + 0x59, 0xb6, 0xf3, 0xd4, 0x03, 0x22, 0x3d, 0x6c, 0xe4, 0x3d, 0xed, 0xae, 0xe2, 0x35, + 0xfc, 0xa9, 0x5c, 0xc8, 0xb2, 0x49, 0x94, 0x1c, 0xcd, 0xb6, 0x6f, 0x3f, 0x61, 0x1c, + 0xc5, 0xe9, 0xf9, 0x0f, ], esk: [ - 0x68, 0x65, 0x87, 0xce, 0x53, 0xc3, 0x39, 0xf9, 0xce, 0xcf, 0x4d, 0x80, 0x4a, 0x17, - 0x09, 0x39, 0x2b, 0x6a, 0xb1, 0x08, 0xea, 0x2c, 0x57, 0x79, 0x92, 0x1c, 0xd5, 0xda, - 0x8a, 0x6e, 0x1a, 0x08, + 0x10, 0x87, 0x4a, 0x74, 0x22, 0x7a, 0xc7, 0x99, 0x5e, 0xdd, 0xdd, 0x73, 0x4d, 0x0e, + 0x00, 0xdc, 0xc9, 0xf4, 0x8a, 0x01, 0xdd, 0x5c, 0x4c, 0xb1, 0x22, 0xc0, 0x61, 0xe0, + 0xbd, 0xc9, 0xce, 0x14, ], ephemeral_key: [ - 0x91, 0x92, 0x3e, 0xd8, 0x2b, 0x76, 0xd7, 0x97, 0x30, 0x7c, 0xaa, 0x23, 0x02, 0xc0, - 0xcf, 0x75, 0x56, 0x12, 0x17, 0x24, 0x98, 0x67, 0x53, 0x2a, 0xe5, 0x1c, 0x2e, 0xa0, - 0x05, 0xed, 0xad, 0xb6, + 0xd2, 0x9e, 0x0d, 0x00, 0x1e, 0xe7, 0x1e, 0x05, 0x99, 0x08, 0x65, 0x04, 0xd8, 0x62, + 0xc7, 0xf5, 0x2b, 0x08, 0x60, 0x77, 0x0d, 0x8a, 0x4b, 0x42, 0xa8, 0x68, 0x11, 0xac, + 0x31, 0x69, 0x85, 0x8c, ], shared_secret: [ - 0x53, 0xd7, 0xe4, 0x84, 0x3a, 0x36, 0xd5, 0x79, 0xb5, 0xa7, 0xc1, 0x04, 0x11, 0x96, - 0xbd, 0x4c, 0x85, 0x80, 0x5c, 0xcd, 0x0a, 0x3f, 0x95, 0xbc, 0x9e, 0x71, 0x06, 0x90, - 0xd1, 0x1b, 0x7a, 0xaa, + 0x11, 0xa0, 0xac, 0x79, 0x9a, 0x29, 0xb0, 0xed, 0x19, 0x5e, 0xd8, 0x7b, 0x13, 0x83, + 0x22, 0x26, 0x3b, 0xbb, 0x9c, 0x31, 0x00, 0x8c, 0x29, 0x59, 0xaf, 0x2f, 0xc6, 0x36, + 0x68, 0x7e, 0xd9, 0xb0, ], k_enc: [ - 0xc2, 0xe3, 0x38, 0x9d, 0x6f, 0xc3, 0xcd, 0x06, 0x7f, 0x59, 0x0a, 0x93, 0x73, 0x05, - 0x04, 0xad, 0x9b, 0x63, 0xc4, 0x55, 0x45, 0x69, 0xb9, 0x62, 0x0f, 0x3e, 0xf0, 0xb0, - 0x65, 0x94, 0xde, 0xd6, + 0x4b, 0xbf, 0x80, 0xe7, 0xa1, 0x70, 0x3a, 0xc1, 0x4a, 0xd7, 0xb5, 0x44, 0x8a, 0x2e, + 0x8e, 0x79, 0x49, 0x30, 0x49, 0xd1, 0x9a, 0x6a, 0x51, 0x31, 0x67, 0xd5, 0x5b, 0xdd, + 0x58, 0x6a, 0xc0, 0xd9, ], p_enc: [ 0x02, 0x55, 0x6e, 0x5e, 0x1b, 0xf5, 0x1b, 0xc6, 0xa6, 0x11, 0x58, 0xf7, 0x40, 0x50, @@ -379,68 +380,68 @@ pub(crate) fn test_vectors() -> Vec { 0x8b, 0x1e, 0x88, 0x6f, ], c_enc: [ - 0x6d, 0x21, 0x18, 0x0a, 0xc4, 0x74, 0x94, 0x57, 0x8a, 0x90, 0x06, 0xaf, 0x5b, 0xeb, - 0x4e, 0x34, 0x55, 0x59, 0xab, 0xdb, 0x0e, 0x23, 0xed, 0x52, 0x65, 0xaf, 0x79, 0xce, - 0x0c, 0xc5, 0x96, 0x71, 0xea, 0x31, 0x7b, 0x3e, 0xb1, 0x52, 0x93, 0xd1, 0xe0, 0x4a, - 0x9a, 0xd8, 0x39, 0x69, 0xab, 0x9e, 0x17, 0x08, 0xf2, 0x28, 0x85, 0x3a, 0x28, 0x1f, - 0xcf, 0x6c, 0x97, 0x60, 0xae, 0x71, 0x96, 0x5b, 0xb1, 0xd4, 0x45, 0x2e, 0x5e, 0xd0, - 0x06, 0x00, 0xab, 0x58, 0x94, 0x27, 0x75, 0xb7, 0x4e, 0x12, 0x62, 0xb4, 0x22, 0x5d, - 0x3b, 0x61, 0x9c, 0x31, 0x65, 0x96, 0xd7, 0xcf, 0x9c, 0x93, 0xbd, 0xb5, 0x2a, 0xfa, - 0x77, 0x8a, 0xa1, 0x20, 0x8d, 0x56, 0xd0, 0x69, 0xe5, 0x6e, 0x27, 0x79, 0x61, 0x4d, - 0x56, 0xf4, 0x36, 0x10, 0x72, 0xbc, 0x15, 0x16, 0xa9, 0xb4, 0x56, 0x2a, 0x4f, 0x54, - 0x63, 0xa5, 0x13, 0xc4, 0x59, 0x42, 0x15, 0x70, 0xf3, 0x34, 0xef, 0xb6, 0xbc, 0xd2, - 0x08, 0xf8, 0xf8, 0x05, 0x0e, 0x15, 0x3d, 0x4e, 0x61, 0xf3, 0x1e, 0xdd, 0xbb, 0x5a, - 0x98, 0xf1, 0x70, 0xd3, 0xd0, 0x80, 0xe8, 0xec, 0x3f, 0x65, 0x20, 0xb6, 0xa2, 0xd6, - 0x08, 0x83, 0xa5, 0x87, 0xff, 0x0e, 0x98, 0x21, 0x1c, 0x73, 0x45, 0x16, 0xb5, 0xdc, - 0xc7, 0x5e, 0xf2, 0x3c, 0xfb, 0x9f, 0x55, 0xf1, 0xde, 0xed, 0xf1, 0x26, 0xc2, 0xce, - 0x17, 0x27, 0x3f, 0x41, 0xdb, 0xbb, 0xbd, 0x2f, 0x49, 0xe3, 0x55, 0x77, 0x6e, 0xc0, - 0x46, 0x98, 0x35, 0xf7, 0x9d, 0x94, 0x80, 0x42, 0xf8, 0x42, 0x0f, 0x11, 0xe1, 0xab, - 0xd7, 0x45, 0x06, 0xb7, 0x8b, 0x5e, 0x41, 0xcb, 0xe0, 0xc7, 0x07, 0x17, 0xf4, 0x6e, - 0x7e, 0xb9, 0xac, 0xdc, 0x35, 0x1c, 0x94, 0x98, 0x83, 0x3a, 0xfd, 0xed, 0x93, 0x06, - 0xa0, 0x43, 0x5b, 0x10, 0xb8, 0x3a, 0xe3, 0x95, 0xd5, 0x7f, 0x5b, 0x0a, 0x5d, 0x41, - 0xa9, 0x34, 0x2d, 0x02, 0xec, 0x58, 0xb6, 0xee, 0x16, 0x87, 0x77, 0x50, 0x16, 0xb8, - 0x74, 0x9b, 0x28, 0x7a, 0xbd, 0xd3, 0xed, 0x1a, 0x83, 0x5e, 0xa8, 0xf3, 0xb1, 0x4d, - 0x08, 0x18, 0xfe, 0x0d, 0x5d, 0x9a, 0x48, 0xeb, 0x02, 0x13, 0x64, 0x0e, 0xec, 0xc1, - 0x9a, 0x5d, 0x16, 0x61, 0xdb, 0x82, 0x2b, 0x77, 0x9b, 0x08, 0x0c, 0xd8, 0xba, 0x7f, - 0x3a, 0x27, 0x23, 0x21, 0xee, 0x5d, 0xa2, 0x27, 0x8c, 0x53, 0x85, 0x67, 0xd0, 0xd9, - 0xbb, 0x28, 0xce, 0x64, 0x21, 0x31, 0x15, 0x03, 0xa4, 0xa0, 0x17, 0x14, 0xcf, 0x91, - 0x01, 0x55, 0x2b, 0xa5, 0xef, 0xc8, 0x5c, 0x94, 0xd5, 0xe5, 0x09, 0x72, 0x7e, 0x5e, - 0x01, 0x1c, 0x15, 0xb1, 0xb2, 0xec, 0xdf, 0xf3, 0x99, 0xc0, 0xbe, 0x33, 0x42, 0xab, - 0x6e, 0xdd, 0xa8, 0xe3, 0xed, 0x81, 0x1a, 0x7d, 0x9c, 0x9c, 0xa4, 0xbb, 0x71, 0xa5, - 0x63, 0xe1, 0x59, 0x78, 0xbf, 0x8e, 0x64, 0x04, 0xac, 0x79, 0x6e, 0xb7, 0x81, 0xfd, - 0x2c, 0xf2, 0x19, 0x1b, 0x2f, 0x4d, 0x40, 0x76, 0xd9, 0x3c, 0xcc, 0x80, 0xf7, 0xe5, - 0x92, 0xfa, 0x66, 0x9b, 0x72, 0x26, 0x57, 0x82, 0xee, 0x8f, 0x5c, 0xe3, 0x03, 0x12, - 0xd3, 0x51, 0x2b, 0x35, 0x49, 0x0a, 0xfe, 0x00, 0x6b, 0xad, 0xb1, 0x62, 0x0d, 0x1b, - 0x0c, 0x79, 0xfb, 0xc4, 0xbe, 0xc5, 0x65, 0xd7, 0x46, 0x1d, 0x68, 0xef, 0x72, 0x27, - 0x79, 0x11, 0x77, 0x6c, 0xd5, 0xa7, 0xb5, 0xfc, 0x6f, 0xa8, 0xb3, 0xee, 0xfd, 0x7a, - 0x39, 0xe8, 0xe5, 0xb4, 0xf6, 0xa5, 0x0c, 0x7d, 0x58, 0xd9, 0xeb, 0x08, 0x38, 0x0d, - 0x32, 0x0b, 0x36, 0xea, 0x04, 0x37, 0x00, 0xac, 0xa7, 0x64, 0xb4, 0x8c, 0x3d, 0xa4, - 0x93, 0x67, 0xfa, 0x93, 0x35, 0x6a, 0xaa, 0x4f, 0x87, 0x08, 0xea, 0x6e, 0x34, 0x59, - 0x81, 0x84, 0x5b, 0xe7, 0x37, 0x6d, 0xa7, 0x98, 0x40, 0x53, 0xef, 0x7d, 0xd4, 0xb6, - 0xa7, 0x27, 0x92, 0x35, 0x6a, 0x6c, 0x34, 0x62, 0x68, 0x88, 0xcc, 0x70, 0xde, 0x49, - 0x9e, 0xf9, 0x10, 0x26, 0x95, 0xd9, 0xdb, 0x12, 0xaf, 0x29, 0x62, 0xfc, 0x75, 0xd4, - 0x36, 0x56, 0x19, 0xdb, 0x0e, 0x87, 0x6c, 0xdb, 0x82, 0x02, 0xe8, 0x16, 0xfd, 0xc2, - 0xcd, 0xf3, 0x7a, 0xd3, 0xbe, 0x3b, + 0x1b, 0x42, 0x34, 0x80, 0xbf, 0x37, 0x67, 0xf5, 0xeb, 0xfc, 0x40, 0xb8, 0xc8, 0x9c, + 0xc5, 0x34, 0xf1, 0x65, 0xc3, 0x5d, 0x19, 0xc8, 0xda, 0x6c, 0x32, 0x10, 0xe9, 0x52, + 0xca, 0xd8, 0x23, 0xa7, 0x84, 0x60, 0x21, 0xc3, 0xde, 0x4a, 0x86, 0x93, 0xb7, 0x1e, + 0x28, 0x7f, 0x46, 0x86, 0xac, 0x0a, 0xdd, 0xce, 0xd9, 0x4e, 0xba, 0x81, 0x0a, 0x99, + 0x8b, 0x82, 0x3a, 0x4a, 0xd2, 0x41, 0xaa, 0x9f, 0x4a, 0x3a, 0xe4, 0x82, 0x5d, 0xe9, + 0x95, 0xdd, 0x58, 0x73, 0x56, 0x62, 0x44, 0xbb, 0xd8, 0x75, 0xd0, 0x1b, 0xf3, 0x28, + 0xe8, 0x22, 0xca, 0xfd, 0xb8, 0x3e, 0xd7, 0x75, 0x3a, 0x88, 0x85, 0xd7, 0xae, 0xf2, + 0x45, 0x5a, 0x15, 0x2e, 0x23, 0xdf, 0xa2, 0xd6, 0x99, 0xb3, 0x5c, 0x33, 0xd3, 0x61, + 0x07, 0x2a, 0xe5, 0xc5, 0x12, 0x43, 0x4d, 0x34, 0x6f, 0x6c, 0x56, 0xfb, 0x5f, 0x11, + 0xb0, 0xb6, 0x47, 0xcb, 0xca, 0xfe, 0x02, 0xd8, 0x84, 0x55, 0xa6, 0x30, 0xa3, 0x50, + 0x86, 0x2b, 0x3c, 0xd1, 0x51, 0x3b, 0x6d, 0x6e, 0x41, 0x17, 0xc7, 0x5e, 0xc4, 0xb1, + 0x2f, 0xd7, 0x5a, 0x90, 0xf8, 0x2d, 0xce, 0xa1, 0xc7, 0x71, 0xfd, 0xda, 0x24, 0xec, + 0xf0, 0xa3, 0xe5, 0xb2, 0xe8, 0xa2, 0x24, 0x23, 0x6e, 0xf0, 0x9a, 0x93, 0xab, 0x59, + 0xe5, 0x9b, 0xdf, 0xb8, 0x72, 0x86, 0x0c, 0xc2, 0xd9, 0x11, 0x34, 0xca, 0xf2, 0x13, + 0x98, 0x48, 0xe3, 0x9a, 0xa6, 0x4b, 0xa2, 0xe6, 0xd7, 0x25, 0x20, 0x54, 0xf3, 0x7a, + 0xd5, 0x5c, 0x2c, 0xe5, 0xf8, 0x1b, 0x33, 0xcc, 0xb6, 0x8a, 0x94, 0x73, 0x71, 0x24, + 0x3a, 0x77, 0xe8, 0x43, 0x67, 0xd9, 0xd3, 0x5b, 0x11, 0x68, 0x14, 0x10, 0xea, 0x79, + 0x8b, 0x03, 0x87, 0xb8, 0xf1, 0x0b, 0x1f, 0x89, 0xc6, 0x8a, 0xd1, 0xcc, 0xa9, 0xa3, + 0xe0, 0x32, 0xf3, 0x49, 0x98, 0x79, 0xc8, 0x9a, 0xe6, 0x38, 0x2f, 0x38, 0x97, 0x22, + 0x01, 0x1f, 0x49, 0x25, 0x14, 0x3e, 0xa8, 0x50, 0x73, 0xe4, 0xff, 0x0c, 0xcf, 0x6d, + 0x77, 0x9b, 0xc3, 0xbf, 0x4c, 0x1b, 0x95, 0xfc, 0x7c, 0xf7, 0xf9, 0x91, 0xa2, 0x16, + 0x2a, 0xb9, 0x45, 0x41, 0xf3, 0x99, 0x8e, 0xf6, 0xbc, 0x3f, 0xe8, 0x02, 0x54, 0xab, + 0xa4, 0x1f, 0x15, 0x23, 0x15, 0x03, 0x45, 0x1b, 0x15, 0xe1, 0x08, 0x52, 0xf8, 0x5b, + 0xd2, 0xd1, 0x15, 0x93, 0x53, 0x14, 0xcd, 0x80, 0xc1, 0x23, 0xbe, 0x0b, 0x53, 0x0f, + 0xaa, 0xd6, 0xb5, 0x07, 0x49, 0x68, 0x22, 0x1d, 0xa0, 0x4b, 0x54, 0x6d, 0x96, 0x21, + 0x63, 0x29, 0x9d, 0x52, 0xce, 0xf4, 0x1e, 0x29, 0x6d, 0xa5, 0x9c, 0xb0, 0x76, 0xdb, + 0xe8, 0x99, 0x70, 0x4b, 0x61, 0x73, 0x0c, 0x19, 0xbd, 0x22, 0x1a, 0xd2, 0xbd, 0x29, + 0x81, 0xea, 0x95, 0x1b, 0xe0, 0x2c, 0x9f, 0x5b, 0xdf, 0x92, 0xd9, 0x87, 0x07, 0x46, + 0xb2, 0xa5, 0x8c, 0x3d, 0x18, 0xa7, 0xd3, 0xe5, 0xe2, 0xc6, 0x3a, 0xc2, 0x61, 0x58, + 0x37, 0xbe, 0x1c, 0x6f, 0xe0, 0x03, 0x65, 0x6c, 0x1b, 0x3d, 0x71, 0x50, 0x5f, 0x5e, + 0x21, 0x88, 0x10, 0x4e, 0x98, 0x91, 0x1b, 0x6a, 0x5e, 0x3f, 0x52, 0x82, 0xfa, 0xc0, + 0xc8, 0xfa, 0x1b, 0xa3, 0x6f, 0xfc, 0x07, 0xdc, 0x7a, 0x40, 0x9d, 0xf2, 0xeb, 0xa8, + 0xc7, 0x5f, 0x70, 0xbd, 0x59, 0xa6, 0xf0, 0x65, 0x1d, 0xc1, 0xb1, 0xb5, 0x96, 0xde, + 0x6a, 0xce, 0xc7, 0x78, 0xe2, 0xe3, 0x2f, 0x1e, 0xd4, 0x6d, 0xf7, 0xa9, 0xae, 0xf5, + 0x1d, 0xfe, 0x5a, 0xa5, 0x24, 0x36, 0xea, 0x07, 0xf5, 0x05, 0xd3, 0x39, 0xf2, 0x03, + 0x45, 0x86, 0x61, 0xc8, 0x3a, 0x9a, 0x5a, 0x27, 0xaa, 0x48, 0xb5, 0xec, 0x47, 0xf8, + 0xd6, 0x0d, 0x2a, 0x41, 0x00, 0x1f, 0xce, 0x30, 0xff, 0x75, 0x3a, 0x8a, 0x8c, 0xe4, + 0x92, 0xef, 0xcd, 0x1f, 0x75, 0x3b, 0x7f, 0x4a, 0xd7, 0x36, 0x62, 0x64, 0x47, 0xd1, + 0xb6, 0xf0, 0x7a, 0x61, 0x7d, 0x4b, 0xfc, 0xdb, 0x48, 0xaf, 0xef, 0x08, 0x2d, 0xae, + 0x1d, 0x76, 0x54, 0x4e, 0x8b, 0x63, 0xad, 0xcb, 0xb6, 0x0e, 0x14, 0x96, 0x69, 0x32, + 0x60, 0xc7, 0x20, 0xe6, 0x72, 0x1e, 0x00, 0x20, 0xef, 0xa3, 0xf8, 0xd8, 0x8d, 0x15, + 0xb5, 0xaa, 0x48, 0xa1, 0xb2, 0x2c, ], ock: [ - 0x91, 0x36, 0x59, 0x30, 0x9e, 0xcf, 0xcd, 0xfd, 0x7e, 0x0c, 0xef, 0x23, 0xf8, 0x80, - 0xae, 0x4c, 0xf4, 0xd8, 0xcf, 0x67, 0x78, 0xb9, 0xc4, 0xe6, 0xf4, 0xc7, 0x71, 0x7b, - 0xf5, 0xca, 0xf0, 0x9e, + 0xab, 0xd0, 0xc2, 0x46, 0x97, 0xe4, 0x5b, 0x8b, 0xc4, 0x83, 0x0f, 0xb1, 0x46, 0x53, + 0x2e, 0xa0, 0xac, 0x84, 0x55, 0x81, 0xca, 0x35, 0x39, 0xd3, 0x41, 0x24, 0x73, 0x54, + 0x09, 0xd0, 0x15, 0xac, ], op: [ 0xb4, 0xca, 0xc5, 0x6f, 0x06, 0x2b, 0xfb, 0x2e, 0x27, 0x15, 0xea, 0xf9, 0xc8, 0xfc, 0xdb, 0xc2, 0x0c, 0x86, 0x79, 0x3f, 0x23, 0x57, 0xdd, 0xd0, 0x4a, 0xad, 0x39, 0xf9, - 0x4a, 0xd7, 0xc7, 0x84, 0x68, 0x65, 0x87, 0xce, 0x53, 0xc3, 0x39, 0xf9, 0xce, 0xcf, - 0x4d, 0x80, 0x4a, 0x17, 0x09, 0x39, 0x2b, 0x6a, 0xb1, 0x08, 0xea, 0x2c, 0x57, 0x79, - 0x92, 0x1c, 0xd5, 0xda, 0x8a, 0x6e, 0x1a, 0x08, + 0x4a, 0xd7, 0xc7, 0x84, 0x10, 0x87, 0x4a, 0x74, 0x22, 0x7a, 0xc7, 0x99, 0x5e, 0xdd, + 0xdd, 0x73, 0x4d, 0x0e, 0x00, 0xdc, 0xc9, 0xf4, 0x8a, 0x01, 0xdd, 0x5c, 0x4c, 0xb1, + 0x22, 0xc0, 0x61, 0xe0, 0xbd, 0xc9, 0xce, 0x14, ], c_out: [ - 0x4d, 0xf8, 0xda, 0x22, 0xec, 0x17, 0xf4, 0x16, 0xe0, 0x59, 0x1a, 0xac, 0xc1, 0x6b, - 0x6d, 0xd2, 0xbb, 0xbf, 0x47, 0xbe, 0x04, 0x30, 0x3d, 0xc8, 0x85, 0xd3, 0x5a, 0xc3, - 0xf9, 0x92, 0x3e, 0xea, 0x41, 0xf3, 0x6b, 0x3a, 0x4a, 0x5c, 0x5e, 0x73, 0x3e, 0x32, - 0x6e, 0x96, 0xdb, 0xe5, 0x5e, 0xf9, 0xe7, 0xe8, 0x42, 0x27, 0x0c, 0xbf, 0x46, 0x7c, - 0xdc, 0x16, 0x0e, 0xbf, 0x4f, 0x10, 0x9a, 0xd6, 0x92, 0x0a, 0x6a, 0xed, 0x4a, 0x01, - 0x71, 0xd9, 0x06, 0xe3, 0xe8, 0x13, 0x32, 0xe6, 0xc5, 0x61, + 0xea, 0xdf, 0x7e, 0xeb, 0x10, 0x2d, 0xb1, 0x88, 0x58, 0x54, 0xc2, 0x9e, 0xb7, 0xb0, + 0x5c, 0x7c, 0x96, 0xbb, 0xb8, 0x90, 0x00, 0x2c, 0x4e, 0xd1, 0x14, 0xed, 0x62, 0xf5, + 0xf9, 0xcc, 0xb4, 0x41, 0x6b, 0x5e, 0xdd, 0xd9, 0xad, 0xb5, 0x5c, 0xe9, 0xc7, 0xa0, + 0xd8, 0x44, 0x2b, 0xbc, 0x8a, 0xfa, 0x5c, 0x77, 0xb9, 0x90, 0xad, 0x6d, 0x46, 0x12, + 0x4d, 0xde, 0x70, 0x49, 0x48, 0x72, 0xb2, 0x20, 0x8a, 0x7c, 0x58, 0x02, 0xdf, 0xe9, + 0xbd, 0x1c, 0xa1, 0x9b, 0xef, 0x4b, 0x37, 0xc6, 0x13, 0xb2, ], }, TestVector { @@ -514,35 +515,36 @@ pub(crate) fn test_vectors() -> Vec { 0x9d, 0x5e, 0x64, 0x07, 0x19, 0xbc, 0xa5, 0xc8, 0xed, 0x49, 0x99, 0x97, 0x34, 0xe6, 0xc5, 0xb3, 0x73, 0x3e, ], + // FIXME: used instead of rho, which was possibly modified in zsa1 version nf_old: [ 0xbe, 0xf8, 0xcf, 0x16, 0x98, 0xe4, 0x78, 0x47, 0xd3, 0x8e, 0x1a, 0xaa, 0x88, 0x86, 0x10, 0x77, 0xcd, 0xb5, 0xad, 0x4c, 0xf6, 0x6f, 0xe4, 0x2f, 0xd6, 0x52, 0x57, 0x81, 0xb6, 0xd3, 0x4f, 0x1e, ], cmx: [ - 0xd8, 0x19, 0xa6, 0x37, 0x7a, 0xce, 0x33, 0xf9, 0x21, 0xf2, 0x29, 0xf9, 0x32, 0x86, - 0x6d, 0x9f, 0xcd, 0xb9, 0xd0, 0x42, 0x6a, 0xfa, 0xca, 0x9e, 0x60, 0x50, 0xb4, 0x7a, - 0x83, 0x19, 0xd6, 0x0d, + 0x0b, 0x74, 0x59, 0x61, 0x6f, 0xc6, 0x93, 0x95, 0xe6, 0x44, 0x36, 0xcf, 0x4a, 0xe9, + 0x44, 0x1d, 0x37, 0x4b, 0x29, 0x04, 0x9e, 0x4c, 0x86, 0x22, 0x3a, 0x03, 0x83, 0xf4, + 0xe0, 0x24, 0x69, 0x05, ], esk: [ - 0x59, 0xd1, 0x0a, 0x5b, 0x94, 0x15, 0x8a, 0x3f, 0x3a, 0x78, 0xb3, 0x5d, 0xa9, 0xc6, - 0x27, 0xbe, 0xdf, 0x7c, 0xfb, 0x84, 0x7e, 0x3e, 0x59, 0x86, 0xec, 0x8a, 0xd7, 0xf7, - 0x4c, 0xd9, 0xb2, 0x1b, + 0xc4, 0x92, 0x42, 0xce, 0xe7, 0xe0, 0x86, 0x8f, 0x2a, 0x75, 0xa1, 0xc4, 0x12, 0xbc, + 0x44, 0xd5, 0x4c, 0x97, 0x09, 0xf6, 0x59, 0xde, 0xd3, 0x26, 0x95, 0x72, 0x92, 0x93, + 0x59, 0xe0, 0x4c, 0x3a, ], ephemeral_key: [ - 0x5b, 0xcb, 0xf9, 0xf1, 0xd7, 0xdd, 0x68, 0xe7, 0xcc, 0x6d, 0x6c, 0x78, 0x49, 0x50, - 0xd1, 0xc2, 0xe0, 0xbe, 0x6a, 0x84, 0xa7, 0xa8, 0x8d, 0x6f, 0x7a, 0x20, 0x98, 0xc3, - 0xdc, 0xae, 0x3f, 0x2f, + 0x0e, 0x04, 0xd8, 0x52, 0x5d, 0xd6, 0x8f, 0x7a, 0xe8, 0x68, 0xca, 0x81, 0x1e, 0x88, + 0x33, 0xa7, 0xf4, 0x7d, 0x7a, 0xad, 0xd3, 0x76, 0x03, 0xac, 0xe6, 0x07, 0xee, 0x6c, + 0x86, 0x6b, 0xce, 0x23, ], shared_secret: [ - 0x37, 0x35, 0x1c, 0xe2, 0x57, 0xb2, 0x79, 0x4d, 0x86, 0xa5, 0x3d, 0x26, 0x8d, 0xc9, - 0x00, 0x06, 0x40, 0xc2, 0x76, 0xf3, 0xf4, 0x65, 0xe1, 0xaa, 0x70, 0xbf, 0xde, 0xf4, - 0x99, 0xa3, 0xd7, 0xaa, + 0x4a, 0x7a, 0x54, 0xac, 0x00, 0x41, 0x95, 0x98, 0xb0, 0x76, 0x01, 0x53, 0xe2, 0x6a, + 0xcc, 0xd2, 0x15, 0x05, 0x24, 0x16, 0x65, 0x17, 0x13, 0xee, 0xa1, 0x89, 0x19, 0xf3, + 0xe2, 0x62, 0xd3, 0xb6, ], k_enc: [ - 0xea, 0x22, 0x99, 0x65, 0x39, 0xd3, 0x74, 0xda, 0x6a, 0x75, 0x34, 0x39, 0x5a, 0xe9, - 0x23, 0x36, 0xfc, 0xa7, 0x85, 0x11, 0x20, 0xdd, 0x1a, 0xe4, 0x9e, 0x45, 0xb3, 0x3e, - 0x0b, 0xed, 0xe9, 0xac, + 0x30, 0x62, 0x6d, 0x92, 0xeb, 0x62, 0x0f, 0xd4, 0xa9, 0x28, 0xb4, 0x3f, 0xd5, 0x50, + 0x69, 0x74, 0x71, 0x76, 0x7d, 0xe4, 0x49, 0x6c, 0xfd, 0xad, 0xb1, 0xda, 0x18, 0xfc, + 0x0c, 0xdd, 0x5a, 0xa6, ], p_enc: [ 0x02, 0x08, 0xab, 0x2e, 0xe9, 0x9d, 0x4d, 0x9b, 0x98, 0x3d, 0xdd, 0x22, 0x47, 0xee, @@ -588,68 +590,68 @@ pub(crate) fn test_vectors() -> Vec { 0x55, 0x21, 0x93, 0xb1, ], c_enc: [ - 0x12, 0xd6, 0x64, 0xed, 0x05, 0xd6, 0x46, 0x26, 0x89, 0xd4, 0xf2, 0x4a, 0xee, 0x5a, - 0x4f, 0x0f, 0x32, 0x35, 0xff, 0x11, 0x0b, 0x2d, 0xf9, 0x9f, 0x67, 0xd8, 0xc5, 0xb3, - 0x68, 0xdd, 0x47, 0x69, 0xd8, 0x44, 0xd3, 0xdd, 0xa0, 0x3f, 0x58, 0xc5, 0x48, 0x63, - 0x62, 0xe8, 0x90, 0x81, 0xa5, 0xdf, 0xd0, 0xa6, 0x06, 0xa3, 0x91, 0x26, 0x4b, 0x56, - 0xca, 0x3a, 0xfc, 0x4f, 0xe0, 0xe4, 0xc3, 0x05, 0xf3, 0x07, 0x78, 0x09, 0x4a, 0x00, - 0xb7, 0x33, 0x4b, 0xdd, 0x82, 0x45, 0xac, 0x56, 0x0e, 0xf3, 0x29, 0xbc, 0x68, 0x97, - 0xd4, 0xd7, 0xba, 0x31, 0xac, 0x84, 0x54, 0x44, 0x1a, 0x15, 0xc8, 0xd3, 0xce, 0xcc, - 0x71, 0x32, 0xdf, 0x0d, 0x9d, 0x0e, 0xcf, 0x92, 0x84, 0x34, 0xa0, 0xd2, 0x8c, 0x1b, - 0x00, 0x48, 0x52, 0x01, 0xec, 0x33, 0xbe, 0x9a, 0x28, 0x74, 0xb4, 0x29, 0x6c, 0x04, - 0x22, 0xc7, 0xe7, 0xa0, 0xa3, 0xa2, 0x2e, 0xc7, 0xe7, 0x21, 0xa4, 0x79, 0x22, 0x8d, - 0xa2, 0x8b, 0x47, 0x37, 0xaf, 0x52, 0x06, 0xdf, 0x7d, 0x74, 0xe4, 0x84, 0xc4, 0xf7, - 0xa8, 0x56, 0xbe, 0x8c, 0xd0, 0x4b, 0x21, 0x26, 0xb5, 0x27, 0x11, 0xe7, 0xb0, 0xaf, - 0x75, 0xc7, 0x52, 0x84, 0xa1, 0x57, 0x20, 0x40, 0xe8, 0xad, 0xe5, 0x85, 0xe8, 0xa4, - 0x82, 0x80, 0x03, 0x59, 0x67, 0x46, 0xc4, 0x0c, 0x9d, 0x76, 0x0d, 0x92, 0x74, 0xb1, - 0x25, 0x42, 0x2b, 0x63, 0x48, 0x1a, 0x17, 0xff, 0xba, 0xb8, 0xc2, 0xde, 0x13, 0xb2, - 0x19, 0xf5, 0x8a, 0x35, 0x95, 0x2d, 0x88, 0x7a, 0xed, 0xe8, 0xe0, 0x2f, 0x10, 0x33, - 0x8c, 0x23, 0x98, 0x23, 0xfb, 0x43, 0x49, 0x51, 0x84, 0x47, 0x12, 0xf6, 0x8d, 0x6e, - 0x4f, 0xef, 0xae, 0x2b, 0x79, 0x5b, 0xa9, 0x78, 0xe9, 0x81, 0xc1, 0x09, 0x27, 0xab, - 0xbc, 0x16, 0x30, 0x66, 0xa0, 0xe9, 0x60, 0xb3, 0xb8, 0xa3, 0x26, 0xc0, 0x39, 0x85, - 0x81, 0x10, 0x93, 0x99, 0xf6, 0xed, 0x60, 0x44, 0x9a, 0xa8, 0x58, 0xd5, 0xdd, 0x27, - 0xdb, 0xf8, 0x89, 0x9f, 0x9c, 0x9a, 0x50, 0x20, 0x5f, 0x25, 0xd0, 0xcc, 0x50, 0xb2, - 0xde, 0xe3, 0x63, 0x54, 0xc5, 0xe4, 0x48, 0x4d, 0x36, 0xf6, 0x3c, 0x97, 0x63, 0xd8, - 0x41, 0xad, 0x5e, 0x00, 0x21, 0x63, 0x6a, 0x85, 0x7c, 0xfb, 0x79, 0xa5, 0x12, 0x3c, - 0x3d, 0xfb, 0x77, 0x3d, 0x0c, 0x1b, 0xeb, 0x9f, 0x90, 0xa9, 0x72, 0xd0, 0xfc, 0x80, - 0x5f, 0x65, 0x5d, 0x69, 0x40, 0x85, 0x23, 0xb9, 0x9b, 0x62, 0xa8, 0xfa, 0xbe, 0xf0, - 0xc0, 0x24, 0xf2, 0x1f, 0x50, 0xe4, 0xc1, 0x12, 0xe2, 0xfe, 0xdd, 0x58, 0xca, 0xe9, - 0x60, 0x9a, 0xc6, 0xf7, 0xcc, 0x79, 0x83, 0x86, 0xc9, 0xd9, 0x06, 0x42, 0x1c, 0xa5, - 0x7c, 0xf8, 0x1b, 0x09, 0x6b, 0xba, 0xda, 0x64, 0xd0, 0xee, 0x76, 0x95, 0x18, 0x9d, - 0x5f, 0xb1, 0x7a, 0xe2, 0x53, 0x1d, 0xbb, 0x2c, 0x00, 0x58, 0x5a, 0x26, 0xa6, 0x8c, - 0x27, 0xf9, 0x77, 0x77, 0x84, 0x1a, 0x3e, 0x39, 0x30, 0xc7, 0x0f, 0xc3, 0xfa, 0x8e, - 0x2b, 0x7f, 0xc2, 0x1e, 0x87, 0xcf, 0x9f, 0x63, 0xb3, 0x63, 0xb8, 0x8d, 0xaa, 0x1f, - 0xb6, 0x7b, 0xda, 0xe8, 0xe5, 0x5b, 0x68, 0x51, 0x6d, 0x19, 0xdf, 0xef, 0xec, 0x9b, - 0x3d, 0x38, 0xe6, 0xe1, 0xd0, 0xa6, 0xe4, 0x51, 0xd6, 0xd1, 0xf5, 0x2d, 0x1f, 0x96, - 0xdd, 0x0d, 0x53, 0x6d, 0x68, 0xd2, 0x69, 0x86, 0x70, 0x9f, 0x41, 0xe7, 0x60, 0x74, - 0x05, 0x5b, 0xf7, 0x52, 0xbf, 0x38, 0x86, 0x92, 0xc8, 0x2c, 0xfd, 0xa1, 0xeb, 0xb0, - 0x17, 0x8b, 0x8e, 0x0c, 0x85, 0xad, 0x7b, 0x15, 0x99, 0x14, 0x42, 0x8e, 0x30, 0x21, - 0xda, 0xe3, 0x01, 0x0d, 0x65, 0x6c, 0x10, 0x36, 0xf4, 0xa5, 0x7e, 0x7f, 0xad, 0xe0, - 0xfc, 0x32, 0x2a, 0xa6, 0xfd, 0xde, 0x71, 0x4a, 0x8c, 0x53, 0x78, 0x79, 0xe7, 0x04, - 0x41, 0x6f, 0x51, 0x04, 0xdb, 0xbc, 0x8f, 0xf2, 0x42, 0xc1, 0x6d, 0x2d, 0xf4, 0xa8, - 0x41, 0xeb, 0x6b, 0x45, 0x3a, 0x12, 0x83, 0xf6, 0x5f, 0xe1, 0x0d, 0x70, 0xc8, 0x76, - 0x41, 0x8e, 0x44, 0x4a, 0xb3, 0x1b, 0x93, 0x71, 0xa2, 0x7d, 0x36, 0xd8, 0x6e, 0x8f, - 0x1c, 0x32, 0x77, 0xca, 0xfd, 0xf8, + 0x81, 0x56, 0x2d, 0xbe, 0xf7, 0xbb, 0x35, 0x3a, 0x62, 0xe7, 0xc8, 0x1e, 0xbe, 0x68, + 0x15, 0x6c, 0xb7, 0x5c, 0x5c, 0x7e, 0x3d, 0x96, 0xbb, 0xcd, 0x7d, 0xaf, 0xf5, 0x0c, + 0xb0, 0x95, 0x7d, 0x33, 0xdd, 0x99, 0x77, 0x9f, 0x7d, 0x3d, 0x72, 0xb1, 0x8d, 0xeb, + 0x7a, 0x69, 0x75, 0x10, 0xe0, 0x13, 0x5b, 0x8d, 0xf4, 0x83, 0xa4, 0xd7, 0x1d, 0x1a, + 0xb1, 0x08, 0x09, 0x6e, 0x76, 0x08, 0x91, 0xd5, 0x31, 0x07, 0xf0, 0x3d, 0xea, 0x4a, + 0xe8, 0xe4, 0xd3, 0xfe, 0xbd, 0x98, 0x77, 0xf8, 0x57, 0x0a, 0xa3, 0x09, 0xd0, 0x97, + 0xd4, 0x23, 0xbb, 0x76, 0x3f, 0xb3, 0xe7, 0xe9, 0xbe, 0x3c, 0x8f, 0xa0, 0x34, 0xc0, + 0x1d, 0x66, 0x4f, 0x47, 0xa0, 0xe7, 0x13, 0x3c, 0xa1, 0x1a, 0x48, 0xcd, 0x0e, 0xea, + 0x46, 0x35, 0xfa, 0x77, 0x25, 0x0a, 0x17, 0xbd, 0xf7, 0xb7, 0x32, 0xc8, 0x98, 0x46, + 0x51, 0x57, 0x4f, 0xd4, 0xf9, 0x9f, 0x7a, 0xa0, 0xdb, 0x28, 0xc2, 0x97, 0x31, 0x52, + 0xbf, 0x42, 0x6e, 0xe9, 0xa4, 0xd8, 0x41, 0xa9, 0x1d, 0x5d, 0x33, 0x57, 0x18, 0xee, + 0xcb, 0xc9, 0xc8, 0xb2, 0xa2, 0x00, 0x15, 0x70, 0xfe, 0x8b, 0x77, 0x91, 0x43, 0xdf, + 0x22, 0x95, 0x98, 0xa5, 0xbe, 0x25, 0x48, 0xcf, 0x35, 0x84, 0x25, 0x18, 0xcc, 0x1d, + 0xbc, 0x78, 0xcc, 0x2f, 0x0f, 0xc8, 0xea, 0x35, 0x7c, 0xe6, 0xc1, 0x7e, 0xb9, 0x7c, + 0x61, 0x38, 0xd5, 0x3e, 0x6c, 0x8e, 0x00, 0xf0, 0x7f, 0x80, 0x01, 0x25, 0x18, 0x2b, + 0x25, 0xa5, 0xe8, 0x75, 0xc5, 0x37, 0x72, 0x09, 0x52, 0x72, 0x22, 0x37, 0x1f, 0x72, + 0xbf, 0xbd, 0x46, 0x28, 0x44, 0xab, 0x06, 0xf3, 0xb3, 0xa1, 0xeb, 0xa3, 0x44, 0x23, + 0xb6, 0x9a, 0xbf, 0x5d, 0xe6, 0x64, 0xba, 0x83, 0xcd, 0x43, 0xb6, 0xa8, 0xe9, 0xd5, + 0xb7, 0xc5, 0x2a, 0xdb, 0x86, 0x15, 0x04, 0x1b, 0x90, 0xd9, 0x08, 0x83, 0x1a, 0x6f, + 0xf9, 0x2d, 0xb4, 0x8a, 0x14, 0xac, 0x4d, 0xfa, 0x67, 0xd0, 0x2c, 0x72, 0xe0, 0xc8, + 0x63, 0x15, 0x7d, 0x98, 0xf8, 0xf5, 0x45, 0x37, 0x92, 0x97, 0x43, 0xc9, 0x69, 0xbc, + 0x91, 0xc2, 0xc1, 0x37, 0x52, 0x04, 0x98, 0x3c, 0x99, 0x99, 0x97, 0x5f, 0xfa, 0x5e, + 0xe5, 0xfe, 0x1f, 0x69, 0x71, 0x99, 0x40, 0x5f, 0x09, 0x66, 0xe3, 0x1f, 0x34, 0xe1, + 0x52, 0x38, 0x44, 0x38, 0x18, 0x44, 0x98, 0x2b, 0x2c, 0x3b, 0x49, 0xa2, 0x09, 0xff, + 0xa3, 0xce, 0xe9, 0x79, 0xa8, 0x5b, 0x19, 0xb8, 0x50, 0xf4, 0x1d, 0xcc, 0xc4, 0x63, + 0xe2, 0x2e, 0x24, 0xa3, 0x04, 0x9d, 0x37, 0xb1, 0xfb, 0x37, 0x0d, 0xeb, 0xdd, 0xf4, + 0xde, 0x05, 0x46, 0x24, 0x5e, 0x4f, 0x02, 0xa9, 0x84, 0x98, 0xaf, 0x53, 0x2e, 0x27, + 0xac, 0xae, 0x5c, 0x7e, 0xd1, 0x43, 0xe6, 0xe9, 0xcc, 0xfa, 0x74, 0x35, 0x16, 0x02, + 0x16, 0x57, 0xac, 0xb2, 0x5e, 0x44, 0x47, 0x84, 0x5c, 0x5f, 0x9c, 0x59, 0x64, 0x60, + 0x7c, 0x4a, 0x78, 0x72, 0x1d, 0x98, 0x1a, 0x7f, 0xf2, 0xfd, 0xf6, 0xc0, 0x33, 0x62, + 0x8b, 0xff, 0xd6, 0xf0, 0xb8, 0xde, 0x0c, 0xd6, 0x35, 0xec, 0x22, 0xf8, 0xb5, 0x0e, + 0xd6, 0x37, 0xfe, 0x4e, 0x00, 0xf9, 0xd3, 0xc3, 0xd4, 0xf1, 0x81, 0x0b, 0x09, 0xb7, + 0x5c, 0x96, 0xe2, 0xfc, 0xf1, 0x11, 0x85, 0x31, 0x7e, 0xdf, 0xa3, 0x9d, 0x19, 0x25, + 0xde, 0xd8, 0x14, 0xdd, 0xe0, 0xef, 0x00, 0xa3, 0xfb, 0x47, 0xaf, 0x5d, 0x81, 0x20, + 0x94, 0xaf, 0x13, 0xd0, 0x1c, 0x98, 0x56, 0x9f, 0xf7, 0x73, 0x57, 0x87, 0xfa, 0x9b, + 0xd0, 0x1f, 0xa0, 0x69, 0x28, 0x27, 0x5f, 0xdd, 0x10, 0x38, 0x96, 0x5f, 0xb0, 0x6f, + 0xb3, 0x5e, 0xdb, 0x73, 0x80, 0xdd, 0x3c, 0x42, 0x41, 0x9e, 0x0c, 0x0e, 0xde, 0x4c, + 0x48, 0x6a, 0x9d, 0xb4, 0x95, 0x38, 0x86, 0xae, 0xc6, 0xad, 0x30, 0x70, 0x28, 0xeb, + 0x26, 0xa3, 0x7e, 0xf4, 0x71, 0x56, 0x7a, 0xd4, 0xbd, 0x4e, 0xaa, 0xb7, 0xa8, 0x2c, + 0xb0, 0xd6, 0xb5, 0xf0, 0x5e, 0x89, 0x4e, 0x53, 0x25, 0x82, 0x1d, 0x92, 0xbe, 0xd2, + 0xb8, 0x6f, 0xb2, 0x43, 0x37, 0xd5, 0x79, 0x28, 0x8f, 0x6d, 0xf7, 0x34, 0x77, 0x1d, + 0x9e, 0xf8, 0x35, 0x8b, 0xa9, 0x1a, ], ock: [ - 0xca, 0x6f, 0x98, 0xe6, 0xcf, 0x9f, 0xc3, 0x6a, 0xf5, 0xf6, 0x98, 0x82, 0x74, 0x2d, - 0x06, 0xec, 0x5d, 0x29, 0xac, 0x2a, 0x02, 0x89, 0x44, 0xa2, 0x01, 0x89, 0xd5, 0x1c, - 0x8a, 0x9b, 0xdc, 0xd6, + 0xb6, 0x36, 0xc3, 0x9a, 0x6b, 0xad, 0x22, 0x63, 0xb2, 0x44, 0x1e, 0xd5, 0xbb, 0xdb, + 0x01, 0x35, 0x88, 0xfb, 0x46, 0x27, 0x01, 0xe6, 0xf8, 0x76, 0x64, 0x6c, 0x8c, 0x17, + 0xfa, 0x2e, 0xfd, 0xe8, ], op: [ 0x82, 0xfe, 0xf6, 0x43, 0xdb, 0xf4, 0x2d, 0xca, 0x51, 0x56, 0xfb, 0x51, 0xd4, 0xc4, 0xee, 0x00, 0x8a, 0x72, 0xf0, 0xdb, 0xc3, 0xf3, 0x1e, 0xfa, 0xb0, 0x75, 0xf2, 0x75, - 0x15, 0x37, 0x14, 0x0d, 0x59, 0xd1, 0x0a, 0x5b, 0x94, 0x15, 0x8a, 0x3f, 0x3a, 0x78, - 0xb3, 0x5d, 0xa9, 0xc6, 0x27, 0xbe, 0xdf, 0x7c, 0xfb, 0x84, 0x7e, 0x3e, 0x59, 0x86, - 0xec, 0x8a, 0xd7, 0xf7, 0x4c, 0xd9, 0xb2, 0x1b, + 0x15, 0x37, 0x14, 0x0d, 0xc4, 0x92, 0x42, 0xce, 0xe7, 0xe0, 0x86, 0x8f, 0x2a, 0x75, + 0xa1, 0xc4, 0x12, 0xbc, 0x44, 0xd5, 0x4c, 0x97, 0x09, 0xf6, 0x59, 0xde, 0xd3, 0x26, + 0x95, 0x72, 0x92, 0x93, 0x59, 0xe0, 0x4c, 0x3a, ], c_out: [ - 0xa9, 0x5e, 0x1a, 0x22, 0x45, 0x65, 0x29, 0x5e, 0x9b, 0x55, 0x3a, 0xdd, 0xe8, 0xb0, - 0x14, 0x47, 0x5c, 0x68, 0x7b, 0x5d, 0x13, 0x49, 0xc1, 0xdf, 0x8a, 0xd4, 0xb7, 0xcf, - 0xd3, 0xdf, 0xc1, 0x00, 0x6c, 0x7c, 0x37, 0xde, 0x67, 0x6d, 0x6f, 0xde, 0x31, 0x8e, - 0x2f, 0xdf, 0xcc, 0x2e, 0x2e, 0x23, 0x2c, 0xc5, 0xf8, 0x85, 0x28, 0x39, 0xe7, 0xef, - 0xab, 0x8b, 0x20, 0x0e, 0xbc, 0x6a, 0x4d, 0xf8, 0x2a, 0x75, 0x21, 0xce, 0x0f, 0x38, - 0x4f, 0xe2, 0x7a, 0x0d, 0xec, 0x59, 0xe9, 0xd2, 0xc0, 0xe3, + 0x46, 0xba, 0x14, 0xf8, 0x3f, 0xf5, 0xab, 0x76, 0x0f, 0x14, 0x20, 0xeb, 0xde, 0xd9, + 0x86, 0xfd, 0x93, 0x78, 0x27, 0xbc, 0x05, 0x69, 0x2e, 0xca, 0xdb, 0x65, 0x2e, 0xbb, + 0xc8, 0xf6, 0xd9, 0xb5, 0x2e, 0xc3, 0x97, 0x87, 0xd8, 0xeb, 0xdd, 0x50, 0x6c, 0xa1, + 0xa8, 0x5d, 0xc3, 0xd5, 0xba, 0x4c, 0x5b, 0x41, 0x52, 0x61, 0xb0, 0x75, 0x3a, 0xc1, + 0x0e, 0x01, 0x86, 0x45, 0x32, 0xa3, 0x57, 0x2c, 0x68, 0xaf, 0xe4, 0x0a, 0xc3, 0xc0, + 0x95, 0x7b, 0x7a, 0xfc, 0x23, 0xfd, 0x5e, 0x05, 0x17, 0xaa, ], }, TestVector { @@ -723,35 +725,36 @@ pub(crate) fn test_vectors() -> Vec { 0xfa, 0xde, 0x94, 0xfa, 0x0b, 0x46, 0xe3, 0xb1, 0xa5, 0x73, 0x34, 0x99, 0x34, 0xe2, 0x32, 0xb5, 0x0e, 0x96, ], + // FIXME: used instead of rho, which was possibly modified in zsa1 version nf_old: [ 0x18, 0x89, 0x8e, 0x75, 0x21, 0x7b, 0x32, 0x9b, 0x3a, 0x56, 0x7b, 0x09, 0x37, 0x89, 0xa4, 0xd8, 0x19, 0xcd, 0xb0, 0x34, 0x88, 0xb8, 0x10, 0xda, 0x22, 0x0c, 0x3f, 0x59, 0xba, 0x03, 0x39, 0x26, ], cmx: [ - 0x23, 0xad, 0xc3, 0xbf, 0x35, 0x0e, 0xb0, 0x84, 0xbd, 0x28, 0xbc, 0x2d, 0xcf, 0xb7, - 0x98, 0x3f, 0xf6, 0xb3, 0xb6, 0xf2, 0xeb, 0x2d, 0x6f, 0x12, 0x4f, 0xfc, 0x46, 0x85, - 0xab, 0xe8, 0xde, 0x3a, + 0x05, 0xb5, 0xe3, 0x20, 0x76, 0xda, 0xe0, 0x94, 0x83, 0x35, 0xac, 0x3d, 0x65, 0x1c, + 0x6d, 0xbe, 0xa6, 0x4c, 0xe9, 0x11, 0x42, 0x3e, 0x2f, 0x2c, 0x7c, 0x1b, 0xdf, 0xa6, + 0xb1, 0x41, 0x41, 0x30, ], esk: [ - 0x34, 0x39, 0x22, 0x52, 0xc9, 0xcc, 0x9f, 0x45, 0x4b, 0x54, 0x2c, 0xf1, 0xb8, 0x88, - 0xb3, 0xab, 0x02, 0xe6, 0x05, 0xa8, 0xda, 0x26, 0x10, 0x7d, 0x98, 0x02, 0xf1, 0x53, - 0x6a, 0x9e, 0x9f, 0x2b, + 0x8b, 0x14, 0x62, 0x2d, 0x2f, 0x91, 0xf1, 0x69, 0x8d, 0x53, 0xfe, 0x47, 0x9a, 0x1e, + 0x5c, 0x00, 0x64, 0x98, 0xb9, 0x8b, 0x85, 0xb4, 0x50, 0xbd, 0x92, 0x3a, 0x5d, 0x00, + 0xcb, 0x52, 0xa6, 0x13, ], ephemeral_key: [ - 0x91, 0xaf, 0x13, 0x8e, 0xd9, 0x95, 0x44, 0x66, 0x95, 0x16, 0x1b, 0x14, 0x2d, 0xc2, - 0xde, 0x59, 0xac, 0x23, 0x05, 0xec, 0xbe, 0xc6, 0x29, 0x33, 0xf5, 0x2f, 0x2a, 0xa1, - 0xf9, 0xb2, 0x71, 0x86, + 0x86, 0xee, 0x66, 0xa6, 0xc7, 0xd9, 0xb5, 0xc4, 0xf0, 0xe2, 0xd2, 0xa0, 0xe1, 0x56, + 0x1e, 0x2a, 0xfa, 0x55, 0x41, 0xa7, 0x24, 0xee, 0x02, 0x7f, 0xc7, 0x0b, 0xb7, 0xe8, + 0x0a, 0x2c, 0x60, 0x98, ], shared_secret: [ - 0xe1, 0xd3, 0xaf, 0x73, 0x6a, 0xb9, 0xc6, 0x11, 0x6f, 0x46, 0x8f, 0x91, 0x66, 0x80, - 0x63, 0x20, 0x35, 0x0f, 0x7e, 0x73, 0x51, 0x3b, 0xa6, 0x05, 0x50, 0xeb, 0x2d, 0xf0, - 0x1f, 0xf7, 0x83, 0x2d, + 0x88, 0xd1, 0x38, 0x2c, 0x14, 0x42, 0x02, 0xd0, 0xd7, 0x55, 0x75, 0x87, 0xb0, 0xd5, + 0xd0, 0x21, 0x69, 0x29, 0x2a, 0x25, 0x05, 0x43, 0xcb, 0x0a, 0x06, 0xc3, 0x4f, 0x45, + 0x2f, 0x7b, 0x3b, 0x36, ], k_enc: [ - 0xb4, 0x3e, 0x43, 0x3e, 0x16, 0x45, 0xeb, 0x51, 0x5e, 0x4a, 0x4c, 0x7d, 0x10, 0xc9, - 0x3d, 0x08, 0xf2, 0xf1, 0xc3, 0x30, 0x95, 0xbf, 0x8c, 0x80, 0x0a, 0x04, 0x17, 0x62, - 0xab, 0x5c, 0xf8, 0x2c, + 0xe3, 0x73, 0xd8, 0x6e, 0xc9, 0xdd, 0xdd, 0x64, 0x5d, 0x9a, 0x6d, 0x06, 0xef, 0xce, + 0x22, 0xb8, 0x96, 0x42, 0x1d, 0x57, 0xa4, 0x4d, 0x37, 0xa6, 0x50, 0x4a, 0x5d, 0x19, + 0xdf, 0x21, 0x73, 0x73, ], p_enc: [ 0x02, 0xaa, 0x14, 0x92, 0x9c, 0x57, 0x89, 0x85, 0x85, 0xce, 0x66, 0x5a, 0xfa, 0x3f, @@ -797,68 +800,68 @@ pub(crate) fn test_vectors() -> Vec { 0x72, 0x65, 0x57, 0x53, ], c_enc: [ - 0x27, 0x62, 0x0d, 0xf5, 0xdb, 0x17, 0x76, 0x6e, 0xbd, 0x9a, 0x99, 0xd6, 0x9a, 0x9a, - 0x49, 0x38, 0x73, 0x21, 0xf0, 0xc9, 0x47, 0x25, 0x23, 0x57, 0xb5, 0xb7, 0x48, 0x49, - 0x38, 0xe3, 0xf5, 0xff, 0x9f, 0x32, 0x0e, 0x80, 0x6c, 0x4b, 0x54, 0xc3, 0x6e, 0x41, - 0x2e, 0x8a, 0x6e, 0xad, 0xe3, 0x5b, 0x83, 0x01, 0xf7, 0x34, 0xf3, 0x71, 0x2e, 0x6a, - 0xac, 0xe6, 0x99, 0xf5, 0x9e, 0x11, 0x2a, 0x7b, 0xf5, 0x44, 0x59, 0xdc, 0x5d, 0x9f, - 0x7b, 0xbf, 0x3b, 0x9f, 0x74, 0x6c, 0x45, 0xbb, 0xed, 0x69, 0xa4, 0x25, 0x1b, 0x29, - 0xf3, 0xd2, 0x15, 0xc2, 0x9f, 0x76, 0x1c, 0x7d, 0x05, 0x88, 0x19, 0xf0, 0xdd, 0x4e, - 0x70, 0x71, 0xb0, 0x77, 0xcb, 0x00, 0xcb, 0x93, 0x62, 0xa4, 0x98, 0x16, 0x88, 0x0d, - 0x49, 0xb7, 0x11, 0xf9, 0x20, 0x65, 0xf1, 0x53, 0x2e, 0x58, 0x18, 0x0b, 0xbd, 0xb4, - 0x91, 0xdb, 0xbb, 0x96, 0x8a, 0x09, 0xb5, 0x63, 0xce, 0x1d, 0x29, 0x87, 0x6f, 0xd0, - 0x52, 0x6d, 0x65, 0xda, 0x67, 0x27, 0xad, 0x40, 0xf9, 0x64, 0x02, 0xf9, 0x9a, 0xa5, - 0xac, 0x06, 0x42, 0x51, 0xc4, 0x65, 0xe3, 0xc7, 0xdb, 0x1f, 0xfe, 0xef, 0xac, 0xd7, - 0xf5, 0x1b, 0xa4, 0xf1, 0x9c, 0x6c, 0x17, 0x87, 0xa0, 0xff, 0xb4, 0x9d, 0xbb, 0x7b, - 0x0a, 0x2b, 0x15, 0x64, 0x03, 0xd6, 0x6c, 0x22, 0x13, 0xe5, 0x1d, 0x58, 0xea, 0xef, - 0xe8, 0x6d, 0x5d, 0xef, 0x0d, 0x24, 0xb7, 0xf2, 0xf8, 0xc1, 0x10, 0x32, 0x9a, 0x3a, - 0x73, 0xcb, 0x33, 0x50, 0x14, 0x0e, 0x6b, 0xf7, 0x2c, 0xb6, 0xaa, 0x22, 0x2d, 0xef, - 0x5a, 0x47, 0xe2, 0x1a, 0xf0, 0xb9, 0xae, 0xeb, 0x74, 0x8c, 0x01, 0xc6, 0x7a, 0xb6, - 0xc9, 0xfd, 0x6e, 0x53, 0x6a, 0x0d, 0x92, 0x76, 0x61, 0x51, 0xb1, 0xac, 0x7c, 0xc9, - 0x85, 0x5c, 0xa9, 0x8d, 0xea, 0x74, 0x85, 0x14, 0xef, 0xee, 0x89, 0xe8, 0x9a, 0x01, - 0x68, 0xf5, 0xdd, 0xf4, 0xac, 0x2b, 0x7c, 0xe1, 0xc9, 0xc2, 0x92, 0xfb, 0xef, 0x2f, - 0x45, 0x51, 0xa8, 0x88, 0xc3, 0x34, 0x5c, 0x65, 0x92, 0x30, 0x39, 0xfc, 0x21, 0xf7, - 0x31, 0x55, 0x9b, 0xd9, 0x24, 0xbc, 0x2c, 0x15, 0x5b, 0xc0, 0xbe, 0x80, 0x38, 0x4a, - 0x9e, 0x49, 0xbd, 0xa6, 0x9a, 0x70, 0x6b, 0x1a, 0xd6, 0xa2, 0x62, 0xab, 0xc6, 0x26, - 0x50, 0x77, 0x2f, 0xd7, 0xea, 0xbc, 0x3f, 0x75, 0xa9, 0xac, 0xca, 0xa2, 0x8b, 0xcd, - 0xea, 0x65, 0xf9, 0x4e, 0x16, 0xcc, 0x3d, 0x05, 0x38, 0xe5, 0x49, 0x86, 0x0a, 0x60, - 0x12, 0x5b, 0xb4, 0xbc, 0x0c, 0x23, 0xe3, 0x22, 0x27, 0x68, 0x2c, 0x09, 0xb5, 0xaa, - 0x30, 0x4a, 0x16, 0x09, 0x2a, 0xd4, 0xa3, 0xe2, 0xf6, 0x28, 0x3c, 0x38, 0x51, 0x80, - 0x6e, 0x72, 0x17, 0x3f, 0x7d, 0x32, 0x97, 0xed, 0x92, 0xe5, 0x32, 0x40, 0x39, 0xa7, - 0x31, 0x4f, 0x5f, 0xb7, 0x38, 0x6e, 0x09, 0x94, 0xf5, 0x2f, 0x8c, 0xcc, 0xf1, 0x87, - 0xd6, 0x20, 0x41, 0x0c, 0xce, 0x9d, 0x0b, 0x91, 0x93, 0xac, 0xec, 0x6d, 0x4c, 0x9b, - 0xd3, 0x4e, 0x08, 0x80, 0x58, 0x0a, 0xbe, 0xae, 0xd9, 0x7c, 0xb7, 0x80, 0x0f, 0x6a, - 0xbc, 0x67, 0xc2, 0x5c, 0x49, 0x19, 0x2e, 0x37, 0xdc, 0xf3, 0x3d, 0x1a, 0x59, 0x16, - 0x47, 0x5a, 0xe9, 0x99, 0x90, 0xd8, 0x29, 0xc1, 0xd5, 0x9e, 0x69, 0x2f, 0x47, 0x36, - 0x93, 0xbc, 0xe3, 0x58, 0x5a, 0xec, 0xd3, 0xc1, 0x3b, 0xae, 0x15, 0xcb, 0xef, 0xf2, - 0x98, 0x52, 0x2a, 0xab, 0xf4, 0x6b, 0xea, 0x3a, 0xbf, 0x63, 0x30, 0xa5, 0x6e, 0x37, - 0x24, 0x51, 0x81, 0x32, 0xce, 0x94, 0x39, 0x41, 0x6a, 0x28, 0xe9, 0x52, 0x0d, 0xdf, - 0x64, 0x17, 0x00, 0xb4, 0x6f, 0x37, 0x49, 0x50, 0xf3, 0x27, 0xaf, 0x3d, 0x0b, 0x3d, - 0x3b, 0x3f, 0x61, 0xa8, 0x84, 0xcf, 0x4f, 0x82, 0x02, 0x56, 0xfb, 0x91, 0x65, 0xdc, - 0xa0, 0xe4, 0x32, 0x60, 0xfc, 0xb5, 0x63, 0xef, 0x1a, 0xb4, 0xe7, 0x12, 0xef, 0x07, - 0x23, 0xd6, 0x75, 0x90, 0xa4, 0xff, 0xc3, 0x66, 0xc4, 0xa7, 0x92, 0x50, 0x29, 0x93, - 0x1b, 0xf0, 0x87, 0x3d, 0xac, 0xaa, 0xe9, 0x38, 0x5d, 0x9a, 0xd9, 0x1a, 0xed, 0x75, - 0x93, 0x9d, 0x8b, 0xd1, 0xaf, 0x5d, + 0xe7, 0x67, 0x81, 0xae, 0x63, 0x84, 0x1f, 0xff, 0xea, 0x30, 0x21, 0x96, 0x15, 0x94, + 0xc2, 0x2a, 0x87, 0x20, 0xc7, 0xd8, 0xaa, 0x80, 0x8b, 0xc8, 0x6e, 0x71, 0xa3, 0x6a, + 0xd7, 0xf8, 0x6f, 0xf8, 0x7c, 0x07, 0xd3, 0xc6, 0x50, 0xa0, 0x8e, 0x23, 0xe9, 0xb5, + 0x4f, 0x00, 0xb4, 0x0b, 0xa0, 0x15, 0x91, 0x69, 0xdf, 0xca, 0x34, 0xc1, 0x40, 0xce, + 0x93, 0x40, 0x19, 0xb2, 0xea, 0xa8, 0xea, 0x84, 0x35, 0x80, 0xb3, 0x5f, 0x14, 0xea, + 0x51, 0x92, 0xde, 0x8a, 0x12, 0xf9, 0xab, 0xc9, 0x06, 0x10, 0x15, 0xe1, 0x47, 0x9e, + 0xf9, 0x8d, 0x19, 0xa5, 0x34, 0xe9, 0xe4, 0x61, 0x64, 0xc3, 0xca, 0xc4, 0xeb, 0x54, + 0x26, 0x4c, 0xed, 0xcd, 0x83, 0xaf, 0xc2, 0xac, 0x2e, 0x08, 0x7e, 0x39, 0xdf, 0xba, + 0xe7, 0x6b, 0xd5, 0x50, 0xcc, 0x64, 0xa4, 0x04, 0xd2, 0x0c, 0x22, 0xca, 0x00, 0x3b, + 0xf7, 0x5b, 0x12, 0xfb, 0xb8, 0xc7, 0x15, 0x13, 0x72, 0x70, 0x0b, 0x43, 0x9b, 0x3e, + 0x06, 0x57, 0xec, 0xc3, 0x07, 0x70, 0x8f, 0xc3, 0x74, 0x94, 0xbd, 0x06, 0x39, 0xe8, + 0xe1, 0xea, 0xea, 0x37, 0x8f, 0x27, 0xa1, 0x35, 0x74, 0xb7, 0x1f, 0xa4, 0x88, 0x3b, + 0x80, 0x71, 0x2c, 0x7b, 0xeb, 0x5c, 0x30, 0x5f, 0x8d, 0x67, 0xe9, 0x19, 0x97, 0xf8, + 0x03, 0x19, 0xdd, 0xb1, 0x15, 0xb9, 0x51, 0x23, 0x89, 0x7a, 0xae, 0x5f, 0x2d, 0x14, + 0xff, 0xcf, 0xac, 0x7f, 0x65, 0x49, 0xca, 0x54, 0x8f, 0x6e, 0xab, 0xdf, 0x74, 0x81, + 0x70, 0x27, 0xd4, 0x2d, 0x92, 0xd5, 0xcd, 0xf8, 0x8e, 0xd8, 0xd5, 0x11, 0xd1, 0xb5, + 0xc4, 0x32, 0x2f, 0x77, 0x79, 0x74, 0x88, 0x6c, 0x0e, 0xd0, 0x13, 0x99, 0x18, 0x0a, + 0xfa, 0x59, 0x7d, 0xd2, 0xb7, 0x7c, 0x58, 0xb2, 0x7c, 0x8a, 0x61, 0x20, 0x69, 0xe3, + 0x86, 0xad, 0x63, 0x4c, 0xb0, 0x17, 0xa8, 0xe9, 0xf4, 0x8e, 0x37, 0xc4, 0x3e, 0xe8, + 0x73, 0x3a, 0x0a, 0xcb, 0x69, 0xf8, 0xed, 0x9f, 0x6f, 0x30, 0x5f, 0x3b, 0xd1, 0xe9, + 0x82, 0xb9, 0x4b, 0x1e, 0x51, 0xf4, 0xba, 0x98, 0x5b, 0x20, 0xec, 0x97, 0x4a, 0xc9, + 0xa7, 0x93, 0xaa, 0x26, 0x4d, 0x61, 0x5b, 0x9d, 0xea, 0x48, 0x59, 0xa4, 0xd4, 0xca, + 0xa7, 0x0d, 0x7a, 0x6b, 0x65, 0x30, 0x76, 0x85, 0xab, 0x53, 0x4e, 0x54, 0x55, 0x63, + 0x1f, 0x6d, 0x68, 0xa4, 0x51, 0xd8, 0xaf, 0x2d, 0x41, 0x82, 0x52, 0x80, 0x0f, 0x68, + 0x42, 0x31, 0xaf, 0xc2, 0x6d, 0x1f, 0xef, 0xc4, 0x03, 0xd7, 0x5f, 0x2e, 0x12, 0x0f, + 0x5b, 0xe2, 0xb6, 0x74, 0x48, 0x60, 0x09, 0x26, 0x7c, 0xbc, 0x0c, 0xb0, 0x01, 0xbb, + 0x47, 0xf0, 0xff, 0x46, 0x97, 0xea, 0xf5, 0x3d, 0xc9, 0x9c, 0x10, 0x77, 0x3a, 0x38, + 0xcd, 0x06, 0xb4, 0x8b, 0xa3, 0x91, 0x19, 0xdb, 0x49, 0x84, 0xd0, 0x9a, 0x5b, 0xde, + 0x13, 0x89, 0x0e, 0xa0, 0x61, 0x3d, 0x0c, 0xe0, 0x04, 0x3e, 0xae, 0x9a, 0x20, 0x89, + 0x14, 0x1f, 0xd9, 0x46, 0x59, 0x13, 0xc1, 0xcc, 0x33, 0x27, 0xa5, 0x59, 0x42, 0xb9, + 0xfd, 0x8f, 0xb8, 0x1c, 0x84, 0x7d, 0x8f, 0xdd, 0xf8, 0xbd, 0xba, 0xcf, 0xa0, 0xfb, + 0x05, 0x52, 0xc1, 0xfe, 0x4c, 0xc4, 0xc0, 0x7f, 0x4d, 0xcf, 0x15, 0x1c, 0x5e, 0x74, + 0xe8, 0xd6, 0x9b, 0x2b, 0x8b, 0xf7, 0xfd, 0x95, 0xec, 0xeb, 0x65, 0x5e, 0x00, 0x53, + 0x58, 0x16, 0xd3, 0x8b, 0x4a, 0x28, 0xd4, 0xa9, 0xae, 0xeb, 0xb6, 0x9a, 0xb4, 0xdd, + 0x12, 0xbf, 0x13, 0xfd, 0x5a, 0x45, 0x9b, 0x6b, 0xb6, 0x83, 0xff, 0xd9, 0xdd, 0x7b, + 0x0d, 0x0c, 0xe7, 0x29, 0x67, 0x75, 0x80, 0x8a, 0x84, 0x3f, 0x3b, 0x8c, 0xc7, 0x89, + 0xfd, 0x5f, 0x43, 0xe0, 0x84, 0xd8, 0x7d, 0x6a, 0xda, 0x8d, 0x1f, 0x28, 0xc2, 0x64, + 0xe6, 0x44, 0xe9, 0xad, 0x96, 0x5c, 0x28, 0x08, 0x8a, 0x52, 0xe4, 0xb3, 0x56, 0x42, + 0xf9, 0xb5, 0xe0, 0x66, 0x49, 0x90, 0x96, 0x3b, 0xc2, 0x3b, 0x9b, 0xb4, 0x8f, 0x46, + 0x74, 0x73, 0x53, 0x58, 0x0e, 0xcc, 0x45, 0x20, 0xcf, 0xf1, 0xfa, 0x7f, 0x8f, 0xbc, + 0x03, 0x0e, 0x64, 0x7d, 0xf1, 0x44, 0xee, 0x6c, 0xa5, 0xb3, 0x16, 0xb3, 0xaf, 0x90, + 0x48, 0x9a, 0x80, 0x9d, 0x9c, 0x9f, ], ock: [ - 0x2a, 0xec, 0x11, 0xd4, 0xae, 0x79, 0x84, 0xe1, 0x69, 0xd1, 0xdf, 0xf1, 0xff, 0x0f, - 0x9a, 0xf5, 0x19, 0x96, 0x34, 0x51, 0xa4, 0x1c, 0x9f, 0x5a, 0xdc, 0x58, 0xe4, 0xf9, - 0x0a, 0xf3, 0x8d, 0x47, + 0x85, 0x6e, 0x1a, 0x97, 0x09, 0xb0, 0xc4, 0x16, 0x93, 0x3f, 0x59, 0x70, 0x71, 0x5c, + 0x56, 0xe2, 0xe0, 0x5c, 0x2e, 0xa9, 0x7d, 0x81, 0x51, 0x25, 0x70, 0x14, 0x79, 0xc3, + 0x3a, 0x5d, 0x91, 0xcb, ], op: [ 0x78, 0xa4, 0xe3, 0x39, 0x88, 0xd7, 0x1d, 0x71, 0x8e, 0x59, 0x55, 0x55, 0x28, 0x4c, 0x24, 0x9a, 0x62, 0xb7, 0x12, 0x88, 0x06, 0xa5, 0x4c, 0x3b, 0x36, 0xa3, 0xaa, 0x57, - 0x14, 0x93, 0x16, 0x36, 0x34, 0x39, 0x22, 0x52, 0xc9, 0xcc, 0x9f, 0x45, 0x4b, 0x54, - 0x2c, 0xf1, 0xb8, 0x88, 0xb3, 0xab, 0x02, 0xe6, 0x05, 0xa8, 0xda, 0x26, 0x10, 0x7d, - 0x98, 0x02, 0xf1, 0x53, 0x6a, 0x9e, 0x9f, 0x2b, + 0x14, 0x93, 0x16, 0x36, 0x8b, 0x14, 0x62, 0x2d, 0x2f, 0x91, 0xf1, 0x69, 0x8d, 0x53, + 0xfe, 0x47, 0x9a, 0x1e, 0x5c, 0x00, 0x64, 0x98, 0xb9, 0x8b, 0x85, 0xb4, 0x50, 0xbd, + 0x92, 0x3a, 0x5d, 0x00, 0xcb, 0x52, 0xa6, 0x13, ], c_out: [ - 0xe6, 0xeb, 0x22, 0x47, 0xc9, 0x33, 0xe2, 0x4c, 0x9d, 0xf1, 0x28, 0xb1, 0xe0, 0x4e, - 0x8b, 0xc0, 0x5c, 0x65, 0xeb, 0x31, 0x97, 0xdf, 0x9b, 0xa8, 0x70, 0xd8, 0xa0, 0xa1, - 0x8d, 0x9c, 0x24, 0xb7, 0xc9, 0x78, 0xc3, 0x4d, 0x3c, 0x7b, 0xbd, 0x21, 0xe8, 0x7b, - 0x22, 0x39, 0x21, 0x87, 0x54, 0xd9, 0x67, 0x3a, 0x56, 0xa2, 0x73, 0x58, 0x0f, 0x6b, - 0x41, 0xc6, 0x91, 0xe5, 0xfd, 0x30, 0x9c, 0xd5, 0xd1, 0xd2, 0x6d, 0x57, 0x63, 0xa9, - 0xe8, 0xd2, 0x71, 0xc9, 0x77, 0x05, 0x0e, 0x05, 0xdc, 0x96, + 0x72, 0x36, 0xea, 0xb9, 0xf0, 0x12, 0x98, 0xc8, 0x4f, 0x38, 0x28, 0xf6, 0xac, 0x15, + 0x42, 0x76, 0xb5, 0xb7, 0x64, 0x62, 0xf5, 0x74, 0x2d, 0x69, 0xdc, 0x47, 0x7a, 0x10, + 0x5d, 0xc2, 0x71, 0x1b, 0x12, 0xe9, 0xb5, 0x82, 0x8c, 0x01, 0x76, 0xfe, 0xf4, 0x4a, + 0x54, 0x0f, 0x60, 0x95, 0x8e, 0x5a, 0x3e, 0xd6, 0xa2, 0xcc, 0x5e, 0xdd, 0xe9, 0x13, + 0xd1, 0x4c, 0xf8, 0xe8, 0xe2, 0x8e, 0xa2, 0x5c, 0x18, 0x62, 0x7a, 0x84, 0xa2, 0xbe, + 0x96, 0x1f, 0x44, 0x72, 0x67, 0x67, 0xe9, 0xf8, 0x43, 0x1b, ], }, TestVector { @@ -932,35 +935,36 @@ pub(crate) fn test_vectors() -> Vec { 0x72, 0x95, 0x89, 0xbe, 0x69, 0xd8, 0x28, 0xbe, 0x54, 0x30, 0x69, 0x16, 0x41, 0x3c, 0xd2, 0x50, 0x21, 0x17, ], + // FIXME: used instead of rho, which was possibly modified in zsa1 version nf_old: [ 0x23, 0x39, 0xa8, 0x95, 0x29, 0xcf, 0x35, 0x7b, 0x06, 0x7d, 0xd2, 0x8b, 0xe4, 0x06, 0x6e, 0x16, 0x23, 0x6d, 0xc5, 0xd7, 0x87, 0x06, 0x14, 0x9a, 0x72, 0x8c, 0x3e, 0x3d, 0x9d, 0xc1, 0x08, 0x1c, ], cmx: [ - 0xe3, 0x04, 0xcf, 0x08, 0xc7, 0x86, 0xaf, 0xcb, 0x1d, 0x65, 0x2f, 0x7a, 0x94, 0x17, - 0x29, 0x32, 0x01, 0x51, 0x71, 0x37, 0x93, 0x82, 0x89, 0x42, 0xcb, 0x88, 0xd0, 0x1f, - 0x68, 0x60, 0x4e, 0x1f, + 0xea, 0x7c, 0x13, 0xf7, 0xe1, 0x20, 0x5e, 0x78, 0xc8, 0xce, 0x4e, 0xe4, 0xfd, 0xcd, + 0xb7, 0xee, 0x76, 0x92, 0x8d, 0xdf, 0x6d, 0xbe, 0x1b, 0x2d, 0x6f, 0x69, 0x81, 0xb7, + 0xc9, 0x65, 0x79, 0x10, ], esk: [ - 0x0f, 0xba, 0x68, 0x76, 0xb3, 0x76, 0x5d, 0xff, 0x4f, 0x4c, 0x40, 0xaf, 0x89, 0x3e, - 0x4b, 0xd1, 0x34, 0x3a, 0x53, 0x4c, 0xdf, 0x50, 0x20, 0x15, 0x6b, 0x5e, 0xd1, 0xf6, - 0xbf, 0x62, 0xbe, 0x3c, + 0x85, 0x7b, 0xa2, 0x47, 0xd4, 0x68, 0xe1, 0x8d, 0xfe, 0x96, 0x73, 0xe9, 0x05, 0x99, + 0x23, 0xc2, 0x2e, 0x9b, 0x70, 0x0d, 0x56, 0x3d, 0xf8, 0xa9, 0x89, 0xcc, 0x63, 0x00, + 0x06, 0x15, 0xb2, 0x0d, ], ephemeral_key: [ - 0xdf, 0xe0, 0xf0, 0x0e, 0xb2, 0xb2, 0xf7, 0x08, 0x04, 0x19, 0x1b, 0x5b, 0x2d, 0xdf, - 0x57, 0x8f, 0x6a, 0xda, 0x21, 0x1b, 0x8b, 0x41, 0x7d, 0x95, 0xd2, 0xb7, 0x34, 0xff, - 0xa2, 0x2d, 0x81, 0x30, + 0x89, 0xfd, 0x2c, 0xf3, 0x79, 0x56, 0xba, 0xaf, 0x11, 0x27, 0xbb, 0x0e, 0x33, 0x40, + 0x01, 0x09, 0xdb, 0x03, 0x50, 0xf4, 0xab, 0xb7, 0xd6, 0xd8, 0x1f, 0xa5, 0x84, 0x8e, + 0x1b, 0xb1, 0x69, 0x26, ], shared_secret: [ - 0x0e, 0xc6, 0x82, 0xc8, 0xdc, 0x66, 0x41, 0x41, 0x02, 0x4f, 0x92, 0x9d, 0x1a, 0xe5, - 0xd3, 0x9c, 0x39, 0x4d, 0x05, 0xa2, 0x4d, 0xad, 0x0e, 0x4a, 0x6f, 0x94, 0x98, 0xed, - 0x5f, 0x87, 0xd4, 0x88, + 0xdb, 0xa6, 0x37, 0x94, 0xb6, 0x7c, 0x49, 0x6d, 0x01, 0x1c, 0xfb, 0x6b, 0xba, 0x29, + 0x7c, 0xa5, 0x7d, 0x18, 0xc7, 0xa9, 0xad, 0xdf, 0xfb, 0xc8, 0x37, 0x17, 0x6a, 0xcf, + 0x3a, 0x30, 0x1e, 0x23, ], k_enc: [ - 0xb1, 0x24, 0x5f, 0xb6, 0x37, 0x47, 0xc0, 0x13, 0x39, 0xcd, 0xe8, 0xf9, 0x35, 0x98, - 0xdf, 0xb2, 0xd3, 0x99, 0xec, 0x5e, 0x03, 0xbe, 0xa1, 0x3f, 0x3d, 0xbf, 0x01, 0xca, - 0xdb, 0x93, 0xc9, 0xba, + 0x80, 0xe7, 0x52, 0x2c, 0xb0, 0x32, 0x51, 0xc8, 0x55, 0x34, 0x1f, 0x06, 0xf9, 0x41, + 0x33, 0x41, 0xe1, 0x6e, 0x83, 0xb4, 0x89, 0xe1, 0x5a, 0x0a, 0x00, 0x65, 0xc3, 0x3b, + 0xf3, 0x81, 0x58, 0xc4, ], p_enc: [ 0x02, 0xe0, 0x66, 0xb5, 0xe7, 0x96, 0x86, 0xe9, 0xf3, 0x6e, 0xce, 0xc7, 0x7e, 0x65, @@ -1006,68 +1010,68 @@ pub(crate) fn test_vectors() -> Vec { 0xd7, 0x6b, 0xa4, 0x80, ], c_enc: [ - 0x31, 0xec, 0x78, 0xd4, 0x02, 0x14, 0xc1, 0xbc, 0x7b, 0x25, 0x94, 0x7b, 0x42, 0xf3, - 0x54, 0x34, 0x60, 0x72, 0x90, 0x27, 0x7c, 0x44, 0xc4, 0x89, 0xe9, 0x38, 0x72, 0x2f, - 0x7c, 0x12, 0xff, 0x55, 0xc4, 0xf1, 0xdf, 0xbe, 0x0f, 0x1a, 0x65, 0xb1, 0x5c, 0x0c, - 0xc4, 0x7a, 0x46, 0xc9, 0xbb, 0x33, 0x5b, 0xd1, 0xa3, 0xe7, 0xe6, 0x62, 0xee, 0x85, - 0x84, 0x57, 0x6b, 0x6f, 0x42, 0x81, 0x95, 0xc9, 0x8c, 0x72, 0xfb, 0x99, 0x75, 0xc7, - 0x17, 0x9c, 0x4c, 0xab, 0x58, 0x66, 0xf5, 0xb4, 0x85, 0x42, 0x8b, 0x50, 0x8e, 0x2e, - 0x05, 0xbe, 0x0c, 0x98, 0x41, 0xa3, 0xa2, 0x91, 0x12, 0x80, 0x2c, 0x52, 0x15, 0xe2, - 0x51, 0x37, 0xcf, 0xdd, 0x13, 0x8c, 0x99, 0x39, 0x0e, 0xfb, 0xce, 0xb7, 0x52, 0x4e, - 0x84, 0x7c, 0x36, 0xb4, 0x3f, 0x3e, 0xde, 0x32, 0xf2, 0x3b, 0x39, 0x81, 0xf6, 0xd3, - 0xc3, 0x2b, 0x17, 0xbb, 0xbe, 0x65, 0xf2, 0xfd, 0x01, 0xab, 0xdd, 0x99, 0x87, 0xf1, - 0xb8, 0x88, 0xeb, 0xef, 0x41, 0xef, 0x45, 0x55, 0xc9, 0xfb, 0x0c, 0x8a, 0xee, 0x9b, - 0x6d, 0xd0, 0x85, 0xb9, 0xfb, 0xc7, 0x4f, 0xe4, 0x6a, 0x1e, 0x36, 0x3d, 0x68, 0x32, - 0xb5, 0x08, 0x20, 0x0e, 0x50, 0x0d, 0xa6, 0x95, 0x13, 0xb7, 0x9e, 0x81, 0xf7, 0x33, - 0xb6, 0x6c, 0x3f, 0x24, 0x3a, 0x28, 0x5b, 0xf8, 0x6f, 0xfe, 0xef, 0x4f, 0xfd, 0x1c, - 0xac, 0xa7, 0x83, 0x07, 0x26, 0x63, 0xbf, 0x9b, 0x48, 0x7f, 0xbc, 0x3e, 0x7f, 0x5a, - 0xd2, 0xf7, 0xac, 0xbf, 0x2b, 0x6e, 0x00, 0x8e, 0x3e, 0x4d, 0x6f, 0x31, 0xe1, 0x14, - 0x75, 0xe1, 0x96, 0x98, 0x9d, 0xb9, 0x62, 0x8a, 0x5d, 0x56, 0x39, 0x7c, 0x9a, 0x04, - 0x2a, 0xab, 0x55, 0xe1, 0xec, 0xc4, 0x92, 0xfe, 0x94, 0x27, 0xd4, 0x90, 0xf2, 0x73, - 0xb6, 0x01, 0xd6, 0x51, 0x05, 0x56, 0x82, 0xd3, 0x5b, 0x30, 0x75, 0xfa, 0xda, 0x85, - 0x25, 0x84, 0x48, 0x14, 0x95, 0x7f, 0xfc, 0x9b, 0xc7, 0xfb, 0x39, 0x39, 0x73, 0x7b, - 0x01, 0x50, 0x2e, 0x0b, 0x6f, 0x1f, 0x9b, 0x88, 0xf2, 0x71, 0x54, 0x80, 0xae, 0x42, - 0x2e, 0x9b, 0xb7, 0xb7, 0x6e, 0x5d, 0x22, 0xde, 0x0d, 0x3d, 0x7a, 0xea, 0x58, 0x10, - 0x01, 0xdc, 0xf4, 0x6a, 0x62, 0x2f, 0x08, 0x03, 0x10, 0xbe, 0x50, 0xdf, 0x07, 0x75, - 0x21, 0x92, 0xd4, 0xe4, 0x1a, 0xc5, 0x18, 0xe4, 0x24, 0x1e, 0x06, 0x67, 0x76, 0xa8, - 0xea, 0xec, 0xc7, 0x42, 0xfd, 0x2c, 0x1b, 0xf0, 0x6f, 0xc5, 0x8b, 0xd2, 0x8d, 0x1d, - 0x6c, 0x60, 0x1f, 0x91, 0x5d, 0x75, 0x2e, 0x7c, 0xc3, 0xd9, 0x76, 0x3c, 0x8b, 0x9e, - 0xec, 0x14, 0x2c, 0x84, 0x81, 0xf9, 0xc5, 0x23, 0x59, 0xbf, 0xbf, 0x51, 0x24, 0x36, - 0x67, 0x84, 0xe1, 0x71, 0xd7, 0xa4, 0xaa, 0x01, 0x5e, 0x85, 0x56, 0x47, 0x4a, 0x6d, - 0x0f, 0xee, 0x69, 0xb0, 0xd5, 0x3e, 0xe7, 0xf4, 0xed, 0xf5, 0xea, 0x59, 0xfa, 0x55, - 0x97, 0xf4, 0x8d, 0xd6, 0xaa, 0x88, 0x51, 0x84, 0x29, 0xac, 0x8c, 0x18, 0xc4, 0x73, - 0x8d, 0xb8, 0x01, 0x09, 0xa5, 0xe4, 0xbc, 0x81, 0xbb, 0x84, 0xb3, 0x7d, 0x9b, 0x2a, - 0xd4, 0xb1, 0xd2, 0x6b, 0x36, 0x3d, 0x16, 0x60, 0x72, 0xf0, 0x8c, 0x56, 0x70, 0x62, - 0x27, 0xa9, 0xf8, 0x32, 0x97, 0x03, 0x70, 0x12, 0xd1, 0xf6, 0xda, 0x24, 0xa8, 0x69, - 0xeb, 0x32, 0x97, 0xbc, 0xbc, 0xcc, 0x8d, 0x7d, 0xed, 0x03, 0x0a, 0x3d, 0x60, 0xdf, - 0x88, 0x82, 0xe0, 0x62, 0x9e, 0x36, 0x14, 0x3c, 0x09, 0xca, 0x05, 0x21, 0x43, 0xcb, - 0x56, 0x62, 0x93, 0x8f, 0xa9, 0xf1, 0x15, 0xdd, 0xc0, 0x96, 0x65, 0x4c, 0x0b, 0x40, - 0x59, 0x4c, 0xba, 0x19, 0xee, 0xd4, 0x99, 0x53, 0x2b, 0x70, 0x8a, 0xde, 0xbe, 0x47, - 0x72, 0x6a, 0x83, 0xaf, 0x46, 0x3c, 0x80, 0xba, 0x2a, 0x1f, 0xe0, 0x71, 0xe1, 0x66, - 0xc4, 0x4d, 0x70, 0xdd, 0xbb, 0xba, 0x67, 0x06, 0xa1, 0xdc, 0x43, 0x27, 0x26, 0xfe, - 0x0f, 0xdb, 0xc6, 0x28, 0x21, 0xb5, 0x04, 0xea, 0x11, 0x66, 0xda, 0x48, 0xa8, 0x1b, - 0x63, 0x5e, 0x37, 0x63, 0x33, 0xd9, 0xbe, 0xfe, 0xc4, 0x93, 0xa0, 0x7d, 0xf4, 0x7b, - 0xba, 0x0a, 0x2e, 0x2f, 0x65, 0xe7, + 0x3f, 0x4e, 0x9b, 0x18, 0x56, 0xe7, 0xbf, 0xba, 0x7a, 0xbb, 0xc9, 0x4a, 0x72, 0xb4, + 0xab, 0xb1, 0xd8, 0x46, 0x26, 0x79, 0x30, 0x77, 0xe8, 0x37, 0xda, 0xf3, 0x3f, 0xff, + 0xa2, 0x7c, 0x7a, 0x33, 0x97, 0x8a, 0x54, 0x32, 0x51, 0x0d, 0x99, 0x3c, 0x7d, 0x92, + 0x24, 0xc0, 0x97, 0xac, 0xc5, 0x25, 0x88, 0x1c, 0x76, 0x08, 0x3c, 0x1b, 0x65, 0x1a, + 0x9d, 0xe1, 0xb5, 0xc1, 0xa6, 0xe0, 0x48, 0x2f, 0xae, 0x8f, 0x98, 0x6a, 0xb5, 0x9f, + 0xa7, 0xcd, 0x43, 0x98, 0x99, 0x6e, 0x2b, 0xc0, 0x3a, 0xdc, 0xa9, 0x90, 0x32, 0x3b, + 0xaa, 0xbd, 0xda, 0xae, 0x40, 0xb0, 0x56, 0xb7, 0xac, 0x17, 0xf8, 0x20, 0xd1, 0x1c, + 0x0d, 0xec, 0xba, 0x14, 0xf2, 0x57, 0xa6, 0xcf, 0x09, 0x18, 0x19, 0x8f, 0x38, 0x9c, + 0xdb, 0x29, 0x55, 0x77, 0x25, 0x96, 0x92, 0x7c, 0xbf, 0x55, 0x88, 0x56, 0x13, 0x35, + 0xe7, 0xd6, 0x2e, 0x6a, 0x8a, 0xf7, 0xbc, 0x33, 0xb9, 0x9a, 0x55, 0xaf, 0xa1, 0xb7, + 0xef, 0x20, 0xeb, 0x4e, 0xd6, 0xde, 0x89, 0x69, 0xd2, 0x9f, 0x04, 0x21, 0xcd, 0x4d, + 0x99, 0x06, 0x66, 0xfd, 0xcf, 0x1e, 0xbd, 0x09, 0x06, 0x57, 0x02, 0x13, 0x4d, 0x31, + 0xc3, 0x29, 0x26, 0xa3, 0x8b, 0x6b, 0x6b, 0x48, 0xfd, 0xc9, 0xb3, 0xc7, 0x64, 0xc3, + 0xcd, 0x95, 0xb9, 0x72, 0xe7, 0x68, 0xeb, 0xd8, 0xaa, 0xe9, 0x0d, 0x6a, 0x4a, 0x98, + 0xb2, 0xd9, 0x2f, 0xd9, 0xdf, 0xa2, 0xa2, 0x99, 0xd0, 0x60, 0xe8, 0x5e, 0xf5, 0x68, + 0x3f, 0x51, 0xd0, 0x51, 0x4a, 0x6e, 0xba, 0x72, 0x57, 0x3f, 0x7b, 0xae, 0x84, 0xa2, + 0xfd, 0x92, 0xbe, 0x64, 0x24, 0x1c, 0x27, 0xa6, 0xe5, 0xce, 0xac, 0xbf, 0x37, 0xb2, + 0xd9, 0xa9, 0x75, 0xdf, 0x7a, 0xee, 0xbb, 0xa1, 0x4d, 0x8c, 0x81, 0x15, 0x8e, 0xcf, + 0x5a, 0x0a, 0x25, 0xe1, 0x2f, 0x98, 0x5d, 0x08, 0xfb, 0xb4, 0xa1, 0xc1, 0x3f, 0x76, + 0x1f, 0x3f, 0xfe, 0xe8, 0xd5, 0x38, 0xe3, 0x93, 0xf3, 0x58, 0x0b, 0x73, 0x82, 0xcd, + 0x0b, 0xf5, 0x17, 0xce, 0x78, 0x87, 0x1c, 0x19, 0xac, 0xf8, 0xca, 0x06, 0x5d, 0x7c, + 0x83, 0x87, 0xce, 0xcd, 0x0d, 0x37, 0xae, 0x21, 0x7f, 0x44, 0x06, 0x94, 0x77, 0x2a, + 0xbd, 0x4b, 0x36, 0x55, 0x56, 0x85, 0x4b, 0xaa, 0x8b, 0xcc, 0xa9, 0xc4, 0xfe, 0xf7, + 0x18, 0x99, 0x12, 0xf9, 0x8a, 0x25, 0x27, 0x68, 0x92, 0x76, 0xa4, 0x00, 0x8c, 0x83, + 0x8f, 0xe7, 0x4f, 0x7c, 0x2b, 0x75, 0x9f, 0xc2, 0xab, 0x7a, 0xfe, 0x37, 0x82, 0x80, + 0x6e, 0x31, 0xb1, 0xc5, 0x30, 0xcc, 0x46, 0x20, 0x3b, 0xb3, 0xa5, 0x66, 0xca, 0xf4, + 0xd1, 0x5b, 0x99, 0x40, 0xb4, 0x3f, 0x33, 0xa8, 0x6a, 0x65, 0xd4, 0x9d, 0xa8, 0xb6, + 0x78, 0x7d, 0xe0, 0x96, 0x38, 0xb4, 0x81, 0xf3, 0xa8, 0x10, 0x8a, 0x96, 0x9e, 0xca, + 0xdf, 0x90, 0x98, 0xbf, 0xf2, 0x14, 0x0c, 0x4b, 0x42, 0xe2, 0xb0, 0xfb, 0x10, 0xb9, + 0x02, 0x89, 0xb0, 0xc6, 0xdb, 0x8b, 0xc0, 0x85, 0xe8, 0xaf, 0xe9, 0x5d, 0xd3, 0x6a, + 0x45, 0x36, 0xea, 0xd7, 0xe9, 0x5c, 0x99, 0x66, 0x2c, 0xd9, 0x28, 0xc2, 0x2c, 0x3e, + 0xbf, 0x39, 0x79, 0x15, 0x78, 0xbc, 0x66, 0xfe, 0xa3, 0x01, 0x4d, 0x22, 0x92, 0x94, + 0x30, 0x83, 0xe7, 0x46, 0x81, 0x24, 0x52, 0xb0, 0x0b, 0xc2, 0xf3, 0xe4, 0x7c, 0x49, + 0x47, 0x46, 0xce, 0xd5, 0x57, 0xb1, 0x3a, 0xe3, 0x03, 0x0d, 0x8a, 0x95, 0x78, 0x10, + 0x2b, 0xba, 0xd2, 0xfc, 0x3b, 0x84, 0x5f, 0x31, 0xae, 0x16, 0xf8, 0xd8, 0x0b, 0x77, + 0xf8, 0x43, 0x15, 0x84, 0xa3, 0x7e, 0x8f, 0x30, 0xb0, 0xb9, 0x5c, 0xc4, 0x55, 0x5a, + 0xbc, 0x05, 0x3a, 0x0b, 0x4f, 0xf9, 0x13, 0xb0, 0x03, 0x69, 0xf1, 0x74, 0x7b, 0x1f, + 0x1c, 0x0a, 0xc8, 0x75, 0x4f, 0x01, 0x7e, 0x99, 0x47, 0xca, 0x63, 0x25, 0x5b, 0x3c, + 0x23, 0xf4, 0x56, 0xe2, 0x3f, 0x96, 0x76, 0x13, 0x99, 0x60, 0x1f, 0xd8, 0xda, 0xdb, + 0x5e, 0x3f, 0x90, 0xab, 0x1b, 0x20, 0x13, 0x81, 0x80, 0xed, 0x69, 0x73, 0x22, 0x39, + 0xc8, 0xc2, 0x15, 0xd9, 0xcc, 0x8a, 0xc8, 0x05, 0x9b, 0xde, 0x81, 0x63, 0x27, 0xd2, + 0x20, 0xb9, 0xa8, 0xec, 0xba, 0x5d, ], ock: [ - 0xec, 0xa3, 0x70, 0x7a, 0x74, 0x5d, 0x5d, 0x58, 0x65, 0x86, 0xb2, 0x35, 0xf2, 0x92, - 0xad, 0x20, 0x48, 0x93, 0x14, 0xc4, 0x58, 0x80, 0xd9, 0x83, 0x2b, 0x7f, 0x47, 0xee, - 0xbb, 0xd4, 0x5c, 0xfe, + 0xe6, 0xb7, 0x05, 0x50, 0xe1, 0xd7, 0xa2, 0xbe, 0x73, 0x04, 0x39, 0x64, 0x41, 0xec, + 0x6a, 0xc0, 0x47, 0x45, 0x99, 0xf9, 0xea, 0xd7, 0x55, 0xc2, 0xcf, 0x27, 0x6b, 0x87, + 0x50, 0xc5, 0xcf, 0x2d, ], op: [ 0x3b, 0x3e, 0x88, 0x3e, 0x95, 0x8c, 0xd6, 0xe0, 0x75, 0x4d, 0x74, 0xca, 0xae, 0x1e, 0x5a, 0x43, 0x98, 0xab, 0xeb, 0x7d, 0x10, 0xee, 0x5f, 0x75, 0xa4, 0xab, 0x8e, 0xf7, - 0x03, 0x8e, 0x3d, 0xb3, 0x0f, 0xba, 0x68, 0x76, 0xb3, 0x76, 0x5d, 0xff, 0x4f, 0x4c, - 0x40, 0xaf, 0x89, 0x3e, 0x4b, 0xd1, 0x34, 0x3a, 0x53, 0x4c, 0xdf, 0x50, 0x20, 0x15, - 0x6b, 0x5e, 0xd1, 0xf6, 0xbf, 0x62, 0xbe, 0x3c, + 0x03, 0x8e, 0x3d, 0xb3, 0x85, 0x7b, 0xa2, 0x47, 0xd4, 0x68, 0xe1, 0x8d, 0xfe, 0x96, + 0x73, 0xe9, 0x05, 0x99, 0x23, 0xc2, 0x2e, 0x9b, 0x70, 0x0d, 0x56, 0x3d, 0xf8, 0xa9, + 0x89, 0xcc, 0x63, 0x00, 0x06, 0x15, 0xb2, 0x0d, ], c_out: [ - 0xd0, 0x65, 0x9a, 0x03, 0xc5, 0x3e, 0x15, 0xdc, 0x11, 0x01, 0xa6, 0x6e, 0xa8, 0x0d, - 0xf4, 0x14, 0x4d, 0x5e, 0xe0, 0x1c, 0x3d, 0xbf, 0x20, 0x2c, 0xe6, 0x08, 0x7e, 0x96, - 0xa8, 0x5a, 0xe1, 0x39, 0xdd, 0x46, 0xfc, 0x82, 0xa1, 0xc3, 0x7d, 0x06, 0x05, 0xf8, - 0x49, 0x98, 0x53, 0x13, 0x16, 0xf1, 0xf0, 0xcb, 0xc0, 0x4e, 0xa2, 0x0a, 0xa4, 0x04, - 0xb3, 0xd5, 0xb0, 0x42, 0x96, 0x01, 0x49, 0x81, 0x6d, 0x9b, 0x8f, 0x06, 0x2a, 0xfc, - 0xc1, 0x93, 0x89, 0x43, 0x82, 0x7a, 0x1b, 0x43, 0xfc, 0xbd, + 0x02, 0xb1, 0x37, 0x3e, 0xb1, 0x89, 0x56, 0x32, 0x2b, 0x47, 0xa1, 0x70, 0x0d, 0xb7, + 0x43, 0x31, 0x6e, 0xde, 0x46, 0x44, 0xd6, 0x59, 0x3c, 0xd7, 0x94, 0x22, 0xd7, 0x51, + 0x3d, 0x1b, 0x80, 0xe6, 0x85, 0x05, 0xdf, 0xe9, 0xd6, 0x86, 0x2e, 0x79, 0x4e, 0x30, + 0x28, 0x8b, 0xae, 0xa8, 0xb0, 0xbc, 0xb3, 0x8b, 0x35, 0x49, 0x77, 0xaa, 0xee, 0x57, + 0x2e, 0xe8, 0x86, 0x8b, 0x2d, 0xa0, 0x7d, 0xa2, 0x99, 0x2c, 0x6d, 0x9f, 0xb8, 0xbd, + 0x59, 0x0b, 0x8d, 0xa0, 0x28, 0x11, 0xb5, 0x09, 0xe8, 0xc6, ], }, TestVector { @@ -1141,35 +1145,36 @@ pub(crate) fn test_vectors() -> Vec { 0x6e, 0x62, 0xe4, 0xed, 0xc7, 0x86, 0xd9, 0xe0, 0xb2, 0x7d, 0x26, 0x62, 0x8b, 0x79, 0xda, 0x6b, 0x15, 0x14, ], + // FIXME: used instead of rho, which was possibly modified in zsa1 version nf_old: [ 0xe5, 0xd0, 0x8c, 0x40, 0x26, 0x3e, 0x4a, 0x2a, 0x56, 0x96, 0xda, 0x21, 0x0d, 0x8e, 0x9a, 0x77, 0xf0, 0xaf, 0xc4, 0xc6, 0x8a, 0x6d, 0xda, 0x38, 0xe2, 0x85, 0xf4, 0xe3, 0xef, 0x13, 0xb8, 0x17, ], cmx: [ - 0xad, 0xc2, 0x44, 0x3a, 0xf9, 0x57, 0x67, 0x47, 0xca, 0x4f, 0x10, 0x4b, 0x1f, 0x5a, - 0x7a, 0xdc, 0x80, 0x5a, 0xc5, 0x5a, 0xcc, 0x56, 0x33, 0xa0, 0xb3, 0xc2, 0xdc, 0x7a, - 0xad, 0xff, 0x21, 0x26, + 0x18, 0xfc, 0xbd, 0x40, 0xac, 0xf1, 0xa7, 0xf4, 0xd6, 0x09, 0x87, 0x9a, 0x5f, 0x5e, + 0x3b, 0x39, 0x70, 0x09, 0x4f, 0xf8, 0xbe, 0x84, 0x18, 0x60, 0x70, 0x16, 0xc6, 0xa6, + 0x97, 0xf8, 0x9c, 0x20, ], esk: [ - 0x24, 0x75, 0x30, 0x5c, 0x35, 0xcf, 0x37, 0xeb, 0xd2, 0x77, 0x82, 0x35, 0x16, 0x58, - 0x5a, 0xfa, 0x06, 0x05, 0x78, 0x52, 0x17, 0x1e, 0x0c, 0xe4, 0xb0, 0x52, 0xd5, 0xb4, - 0x20, 0x41, 0xd8, 0x1c, + 0x3b, 0xc1, 0x7a, 0x58, 0x0d, 0x53, 0x0f, 0x89, 0x30, 0xa3, 0x6b, 0x8d, 0x6f, 0xea, + 0x67, 0x85, 0x7f, 0x7b, 0x85, 0x20, 0xfd, 0x2e, 0x0a, 0xb5, 0xd5, 0xcb, 0xab, 0x1a, + 0xcc, 0xd5, 0x4e, 0x3a, ], ephemeral_key: [ - 0x00, 0x5d, 0x31, 0x5b, 0xd1, 0x80, 0xa2, 0x94, 0x0b, 0xd7, 0xfb, 0x34, 0xa7, 0x0e, - 0x90, 0xe8, 0x32, 0x6c, 0xb1, 0x34, 0x30, 0x66, 0x05, 0x46, 0x53, 0xd2, 0x64, 0x4d, - 0x20, 0x45, 0xe3, 0x0f, + 0xcf, 0xe0, 0x3e, 0xb2, 0xd3, 0x36, 0x76, 0xb7, 0x73, 0x83, 0x7d, 0xa8, 0x39, 0x17, + 0x2d, 0x33, 0x33, 0x31, 0x88, 0xc9, 0xdf, 0xef, 0x05, 0xc8, 0x32, 0xa2, 0x5c, 0x86, + 0xd3, 0xbf, 0x0e, 0x8f, ], shared_secret: [ - 0x8e, 0x59, 0x0d, 0x06, 0x3f, 0x7e, 0xc3, 0x8e, 0xb2, 0x00, 0x84, 0x70, 0xf9, 0xbb, - 0x42, 0x29, 0x04, 0xfc, 0x0b, 0xaf, 0x97, 0x80, 0xf8, 0xfd, 0x1f, 0x54, 0x22, 0xea, - 0x30, 0x8c, 0x47, 0xba, + 0xd2, 0xc2, 0x88, 0x9e, 0x03, 0x7e, 0xac, 0x60, 0x60, 0x58, 0x68, 0x2b, 0xaa, 0x38, + 0x86, 0xa4, 0xc2, 0xdd, 0x44, 0xea, 0xdf, 0x8b, 0x2c, 0xe4, 0x39, 0x95, 0xde, 0xd7, + 0x61, 0xfd, 0xaf, 0xb5, ], k_enc: [ - 0xeb, 0xb2, 0xff, 0x9b, 0x1f, 0x29, 0x0d, 0xa5, 0x63, 0x27, 0xa9, 0x67, 0x71, 0xb2, - 0x5f, 0x71, 0x29, 0xff, 0x10, 0x2e, 0xe6, 0xd2, 0xb2, 0x0d, 0xa0, 0x9a, 0x06, 0x25, - 0xf8, 0xbb, 0x26, 0x07, + 0xfe, 0xe3, 0xe3, 0xb5, 0xfd, 0x6c, 0xd8, 0x54, 0x44, 0x2b, 0x2a, 0xc2, 0x97, 0x70, + 0xfb, 0x0e, 0x39, 0x32, 0xf4, 0x71, 0x52, 0x43, 0x26, 0xda, 0x4a, 0x57, 0xc2, 0x56, + 0x18, 0x06, 0x9e, 0x99, ], p_enc: [ 0x02, 0x1c, 0xa7, 0xb6, 0x49, 0x39, 0x9e, 0x13, 0xe4, 0x39, 0x44, 0x62, 0x91, 0x20, @@ -1215,68 +1220,68 @@ pub(crate) fn test_vectors() -> Vec { 0x34, 0x1e, 0x4e, 0x6f, ], c_enc: [ - 0x96, 0x3b, 0xe3, 0x6e, 0xdc, 0xa4, 0x8b, 0x7c, 0x4a, 0x1c, 0xd6, 0xa1, 0x37, 0x2e, - 0x84, 0xc0, 0x54, 0x54, 0x83, 0x4c, 0x5e, 0xe1, 0x92, 0x5e, 0xed, 0xeb, 0x48, 0xda, - 0x16, 0x77, 0x79, 0xe3, 0x99, 0x83, 0x58, 0xcb, 0x92, 0x7a, 0x0a, 0x0b, 0x36, 0x9c, - 0x85, 0xee, 0xb3, 0x30, 0xf7, 0x00, 0x5c, 0x26, 0x9d, 0x0b, 0xe4, 0xf2, 0x38, 0x09, - 0x57, 0xb1, 0x62, 0x97, 0x7c, 0xae, 0x7a, 0x7b, 0x1d, 0x0b, 0xe5, 0xd0, 0xb7, 0x03, - 0xd3, 0x92, 0xac, 0xae, 0xd2, 0x4f, 0x52, 0x5b, 0x83, 0xcf, 0xdd, 0x7f, 0x35, 0xc1, - 0xf1, 0x74, 0xbf, 0x06, 0x6b, 0x7a, 0xfd, 0xb7, 0x45, 0xed, 0xbe, 0xdc, 0x0b, 0x46, - 0xa5, 0x91, 0x36, 0x21, 0x47, 0x61, 0x9d, 0x6b, 0xd3, 0xf3, 0xce, 0x6b, 0x45, 0x23, - 0xf0, 0x64, 0x9a, 0x7c, 0x65, 0x32, 0x2d, 0x05, 0xfa, 0xe2, 0x22, 0x70, 0x1a, 0x8c, - 0xd6, 0xca, 0xbf, 0x8d, 0xc3, 0x2f, 0x05, 0x5f, 0xeb, 0x14, 0x1e, 0x55, 0x6d, 0xdf, - 0xb1, 0x98, 0x30, 0xb7, 0x20, 0x4c, 0x30, 0x98, 0x4e, 0xdd, 0xf4, 0x34, 0xec, 0xc5, - 0xf0, 0xea, 0x82, 0x5c, 0xf8, 0xd9, 0xd5, 0x03, 0x8f, 0x28, 0xe2, 0x3e, 0xf3, 0x6b, - 0xa9, 0x38, 0x52, 0xe5, 0x8e, 0x85, 0xf8, 0x90, 0xb1, 0x77, 0x5c, 0x6d, 0x4c, 0x13, - 0x5b, 0xef, 0x0e, 0x2a, 0x19, 0x33, 0x02, 0xd9, 0x0a, 0x80, 0x4c, 0x85, 0x31, 0x25, - 0xaa, 0x5b, 0x11, 0x6f, 0x8c, 0x58, 0x0e, 0xb6, 0x54, 0xfe, 0x35, 0xe6, 0x73, 0x79, - 0x9e, 0x93, 0xcf, 0x58, 0xfe, 0x1e, 0x70, 0xcd, 0xe1, 0x19, 0xab, 0x58, 0x6c, 0x12, - 0xc4, 0x95, 0x75, 0xe6, 0x1a, 0xc4, 0xb7, 0x71, 0xfa, 0x8e, 0xbf, 0x76, 0xca, 0x95, - 0xd6, 0x51, 0xa4, 0xba, 0x87, 0x3b, 0x24, 0xcf, 0x97, 0xff, 0x75, 0x5b, 0xc7, 0x49, - 0xf4, 0x09, 0x6d, 0x2d, 0xa1, 0x5c, 0xf8, 0x30, 0x36, 0xcc, 0x22, 0x0f, 0x0a, 0x68, - 0x93, 0x43, 0x21, 0xc9, 0xae, 0x33, 0x4e, 0x2d, 0x99, 0xa9, 0x95, 0xe9, 0x29, 0x04, - 0xc1, 0x45, 0x23, 0x33, 0x19, 0x00, 0xcb, 0xca, 0x20, 0x4a, 0xdc, 0xb6, 0x93, 0x9d, - 0xc1, 0x71, 0x87, 0x53, 0x53, 0xa1, 0x1e, 0x12, 0xba, 0xcb, 0x2a, 0xab, 0x0f, 0x57, - 0x17, 0x9f, 0x1b, 0x67, 0xea, 0xcc, 0x7e, 0x7b, 0x6c, 0x5c, 0xc8, 0xa3, 0x78, 0x64, - 0x9b, 0x62, 0xb8, 0x52, 0xfa, 0x47, 0x6f, 0x93, 0x37, 0x88, 0x59, 0xd0, 0xd9, 0xa3, - 0x03, 0x3d, 0xa1, 0x31, 0x28, 0x17, 0x57, 0xad, 0x98, 0x5c, 0x86, 0xfe, 0x03, 0x7a, - 0x4e, 0xdd, 0x0a, 0x4a, 0x49, 0xee, 0x5c, 0x4f, 0x48, 0x15, 0xf0, 0x14, 0x73, 0xb9, - 0x60, 0xa1, 0x8a, 0x3b, 0x7f, 0x75, 0x07, 0xee, 0x3d, 0x8b, 0x39, 0x5a, 0x76, 0x68, - 0x40, 0x95, 0x5b, 0xaa, 0xdd, 0x0a, 0xbb, 0xf4, 0xf5, 0x91, 0x4e, 0x92, 0x10, 0xf5, - 0x9e, 0x4c, 0xd1, 0x3c, 0x82, 0xe0, 0xac, 0xf8, 0x79, 0x51, 0x78, 0x02, 0x91, 0xd0, - 0xa9, 0xa7, 0x0f, 0x6b, 0x4f, 0xf5, 0x0d, 0x81, 0x0d, 0x50, 0x90, 0x20, 0x45, 0x30, - 0xad, 0x69, 0x44, 0xb1, 0x3d, 0x23, 0x83, 0xab, 0xca, 0x42, 0x0c, 0xb6, 0xd9, 0xfc, - 0xd8, 0xfd, 0xcb, 0xe9, 0xb3, 0xb5, 0xf4, 0x2f, 0x0a, 0xf5, 0xdf, 0x36, 0x37, 0x8c, - 0xe7, 0x3d, 0xc9, 0x06, 0x16, 0x7d, 0xd4, 0xb3, 0x80, 0x41, 0x8f, 0x17, 0xe4, 0x50, - 0x61, 0x18, 0x57, 0x23, 0xda, 0xbb, 0x6f, 0xfd, 0xbb, 0xd5, 0xa4, 0x18, 0xc3, 0xc6, - 0xfd, 0x33, 0x70, 0x34, 0x09, 0x94, 0x27, 0x7b, 0x88, 0x8e, 0xe4, 0x9b, 0x08, 0x91, - 0xbb, 0xb9, 0x4b, 0x6b, 0x8b, 0x06, 0x5f, 0xd1, 0x92, 0x00, 0xdc, 0x3a, 0x68, 0x1c, - 0xa5, 0xff, 0x2a, 0x98, 0x8f, 0xa6, 0x6d, 0x02, 0x9d, 0xdd, 0xf9, 0xb0, 0x3a, 0x5e, - 0x6c, 0x6e, 0x99, 0xb6, 0x35, 0x41, 0x15, 0x6a, 0x09, 0x51, 0xd9, 0x08, 0x7d, 0xd8, - 0x83, 0xd5, 0x13, 0x9e, 0xe6, 0x7a, 0x8c, 0xe5, 0xdd, 0x6e, 0xf1, 0x4c, 0x9a, 0x10, - 0xdb, 0x81, 0x8b, 0x93, 0x69, 0x02, 0xc7, 0x99, 0x93, 0x90, 0xf9, 0x72, 0xba, 0xfa, - 0x5a, 0x57, 0x2f, 0xc8, 0x73, 0x42, 0xe2, 0xc5, 0x1c, 0xeb, 0x80, 0x30, 0xe0, 0x6b, - 0x72, 0x40, 0x95, 0xf9, 0x8d, 0x7b, + 0xbe, 0x1d, 0xff, 0xd3, 0x37, 0x0c, 0x67, 0x56, 0x69, 0xcc, 0x9a, 0xe1, 0xd0, 0x30, + 0x2d, 0x7f, 0x90, 0x6d, 0x25, 0x23, 0x09, 0x3c, 0x24, 0xf4, 0x25, 0x7a, 0x83, 0xbc, + 0x4f, 0x36, 0x62, 0x3a, 0x08, 0x2c, 0xe6, 0xeb, 0x45, 0x21, 0x95, 0x71, 0x91, 0xd5, + 0x7e, 0x14, 0x11, 0xed, 0xe7, 0x1d, 0x44, 0xb5, 0x6c, 0x57, 0xcb, 0x22, 0x81, 0x4a, + 0x04, 0x69, 0x39, 0xd2, 0xff, 0xf9, 0x2b, 0x46, 0x62, 0x76, 0x2d, 0x4f, 0x21, 0xc0, + 0x78, 0x42, 0x74, 0x72, 0xb9, 0x18, 0x10, 0x10, 0x55, 0x56, 0xf4, 0xde, 0x0a, 0x27, + 0xe7, 0x70, 0x08, 0x47, 0x72, 0xcb, 0xfe, 0xbf, 0x87, 0xdb, 0x33, 0x14, 0xab, 0x70, + 0xf2, 0x6d, 0x11, 0xea, 0x5d, 0xe2, 0x67, 0xc3, 0xa9, 0xa8, 0xf4, 0x6b, 0xad, 0x13, + 0xc7, 0x36, 0x26, 0x10, 0xbd, 0xba, 0x81, 0x02, 0xd4, 0xb7, 0x26, 0xef, 0x26, 0xec, + 0x79, 0x4a, 0x15, 0x66, 0x57, 0x1b, 0xfd, 0xc1, 0x02, 0x47, 0x7d, 0xa5, 0xb4, 0x9b, + 0xbf, 0x9f, 0xe4, 0xb1, 0xa4, 0x4e, 0xd0, 0xb3, 0xbc, 0xed, 0x99, 0xba, 0x81, 0x9a, + 0x4f, 0x30, 0x22, 0x65, 0x49, 0x44, 0x5b, 0xc6, 0x1c, 0xff, 0x5c, 0x33, 0x16, 0x33, + 0x5f, 0x6b, 0xd4, 0xa9, 0xa4, 0x24, 0xc9, 0x4a, 0xe0, 0xb5, 0xcb, 0xe4, 0x8a, 0xfb, + 0x2b, 0x94, 0xd0, 0xc7, 0xe4, 0x4e, 0x32, 0x30, 0x95, 0xa7, 0x2e, 0x42, 0x64, 0xe9, + 0x1c, 0x48, 0x94, 0xb9, 0xe8, 0x45, 0xaf, 0x32, 0x35, 0x02, 0xda, 0xe8, 0xc1, 0x86, + 0x78, 0xa4, 0xf7, 0x40, 0xe5, 0xa6, 0x3a, 0x4c, 0x70, 0x29, 0x92, 0xfa, 0xcd, 0xd3, + 0x57, 0x35, 0xb1, 0xd1, 0x34, 0x8b, 0x91, 0x9c, 0x70, 0x0c, 0x42, 0xd3, 0x30, 0xd3, + 0x86, 0xaf, 0xb8, 0x73, 0xfa, 0xba, 0xd8, 0xcb, 0x32, 0x18, 0x15, 0x1b, 0x40, 0x18, + 0x01, 0xe3, 0x69, 0x34, 0x4f, 0xf2, 0x0a, 0xaa, 0x66, 0x73, 0x47, 0x4f, 0x4b, 0xfc, + 0x98, 0xd0, 0x7e, 0x36, 0x7b, 0xc4, 0x2e, 0xf1, 0xa0, 0x4f, 0xa1, 0xbc, 0x12, 0x52, + 0x18, 0x8d, 0xd9, 0xd3, 0xe0, 0x00, 0xe3, 0xf5, 0xe9, 0xdf, 0xc9, 0xe1, 0x3e, 0xe9, + 0xdb, 0x55, 0x04, 0x0d, 0x17, 0x22, 0x7d, 0xa4, 0x4a, 0x3e, 0x08, 0xfd, 0x5e, 0xc8, + 0x58, 0xc4, 0x9c, 0x2e, 0x6a, 0x71, 0x1f, 0x8e, 0x68, 0xd0, 0xa1, 0xdf, 0x88, 0xef, + 0x09, 0x40, 0xf7, 0x2e, 0xd7, 0x3e, 0xf4, 0x9e, 0x8a, 0x45, 0xae, 0x2e, 0x5e, 0x1b, + 0xf1, 0x37, 0xba, 0x58, 0xcf, 0xb9, 0x25, 0x79, 0xab, 0xb2, 0xa4, 0x93, 0x13, 0xa2, + 0xff, 0x3d, 0xb6, 0x16, 0x93, 0xd2, 0xb7, 0x58, 0xaf, 0x20, 0x47, 0x2a, 0xc6, 0x40, + 0x6b, 0xa3, 0x55, 0xb4, 0x8c, 0xee, 0x22, 0xe7, 0x0f, 0xb8, 0xf9, 0xd4, 0x8e, 0xa3, + 0x93, 0x4b, 0x62, 0x24, 0xac, 0xe2, 0x69, 0xb9, 0xef, 0x54, 0x6d, 0xbf, 0xc5, 0x2a, + 0xbe, 0xcf, 0xac, 0x59, 0x40, 0xf0, 0x40, 0xbd, 0x21, 0xe9, 0x0e, 0xfa, 0x82, 0x75, + 0x56, 0x1a, 0x88, 0xbc, 0x18, 0xe2, 0x6b, 0x98, 0x8d, 0x11, 0x79, 0xb7, 0xa2, 0xc3, + 0xaf, 0xd8, 0x6e, 0xf2, 0xa0, 0x90, 0x62, 0x52, 0x23, 0x23, 0x4b, 0x39, 0xc9, 0xe2, + 0x06, 0x8d, 0x94, 0x5d, 0xd7, 0x76, 0x3b, 0x01, 0x0c, 0x28, 0xc8, 0x9b, 0x72, 0xe2, + 0x55, 0x13, 0xb3, 0x9c, 0x3c, 0xe1, 0x17, 0x73, 0x42, 0x8a, 0xd3, 0x44, 0xe1, 0xd5, + 0xd5, 0x1b, 0x92, 0x00, 0x14, 0xf9, 0x17, 0x06, 0xff, 0xae, 0x3d, 0x86, 0x36, 0x14, + 0x77, 0xfd, 0x5d, 0xe0, 0x13, 0x42, 0x2c, 0x06, 0xa3, 0x32, 0xe3, 0x45, 0x79, 0x75, + 0xcf, 0x9b, 0xe9, 0xf9, 0xab, 0x3a, 0x06, 0x87, 0x2e, 0xf0, 0x71, 0x7d, 0x39, 0x08, + 0xbd, 0xeb, 0xf8, 0x41, 0x8c, 0xe5, 0x57, 0xd5, 0x2d, 0x51, 0xa2, 0x50, 0xc0, 0x8c, + 0x5b, 0x79, 0x3a, 0xd4, 0xbc, 0x0f, 0x16, 0xc6, 0x27, 0x89, 0xfe, 0xa2, 0xca, 0xb3, + 0x9c, 0xcc, 0xa4, 0x07, 0xee, 0x9e, 0x47, 0xf5, 0x6d, 0x20, 0xa7, 0x41, 0x91, 0x2c, + 0x6b, 0xad, 0xdb, 0xd7, 0xfa, 0x7b, 0x97, 0xe5, 0x46, 0x33, 0x61, 0x28, 0x74, 0x5a, + 0xe7, 0xd7, 0x30, 0xa5, 0x5a, 0x6a, 0xc7, 0xb8, 0xfc, 0xbd, 0x72, 0xce, 0x78, 0x95, + 0x9c, 0x7a, 0x79, 0x75, 0x21, 0x2c, ], ock: [ - 0x5b, 0x5b, 0x20, 0xfc, 0x46, 0xba, 0x14, 0xbd, 0x18, 0x43, 0xb6, 0xc7, 0x7e, 0xc3, - 0xf4, 0x55, 0xb7, 0x65, 0xb4, 0xd1, 0x2d, 0xb6, 0x52, 0xeb, 0x34, 0x20, 0x0c, 0x41, - 0x48, 0x88, 0x1f, 0xfc, + 0xeb, 0x3e, 0xd9, 0xfc, 0xb3, 0xaa, 0x91, 0xc4, 0xf5, 0xec, 0xfd, 0x43, 0xdb, 0xda, + 0x40, 0x33, 0x06, 0x93, 0xc3, 0xa6, 0x56, 0x75, 0x45, 0xfd, 0x23, 0x6a, 0xf1, 0x90, + 0x8e, 0x29, 0x42, 0xa3, ], op: [ 0x3f, 0xeb, 0x34, 0x5a, 0xec, 0xd3, 0x42, 0x9a, 0x16, 0xe1, 0x0f, 0x3d, 0x13, 0x20, 0xbc, 0x99, 0x71, 0xb5, 0x9e, 0x63, 0x9d, 0x62, 0xb6, 0x96, 0x1a, 0xea, 0x78, 0x15, - 0x67, 0xa8, 0x60, 0x9e, 0x24, 0x75, 0x30, 0x5c, 0x35, 0xcf, 0x37, 0xeb, 0xd2, 0x77, - 0x82, 0x35, 0x16, 0x58, 0x5a, 0xfa, 0x06, 0x05, 0x78, 0x52, 0x17, 0x1e, 0x0c, 0xe4, - 0xb0, 0x52, 0xd5, 0xb4, 0x20, 0x41, 0xd8, 0x1c, + 0x67, 0xa8, 0x60, 0x9e, 0x3b, 0xc1, 0x7a, 0x58, 0x0d, 0x53, 0x0f, 0x89, 0x30, 0xa3, + 0x6b, 0x8d, 0x6f, 0xea, 0x67, 0x85, 0x7f, 0x7b, 0x85, 0x20, 0xfd, 0x2e, 0x0a, 0xb5, + 0xd5, 0xcb, 0xab, 0x1a, 0xcc, 0xd5, 0x4e, 0x3a, ], c_out: [ - 0xe0, 0x1b, 0x5c, 0x1e, 0x01, 0x90, 0x0f, 0xf7, 0x9b, 0xf7, 0x27, 0xf5, 0x37, 0xc4, - 0xac, 0x36, 0xf8, 0x06, 0x7a, 0x0c, 0xc5, 0xc8, 0xe9, 0xc8, 0x20, 0x44, 0x28, 0x43, - 0x69, 0x35, 0x30, 0x91, 0x8a, 0xea, 0x67, 0x2c, 0x4c, 0xd8, 0xfa, 0x3f, 0x6f, 0x2c, - 0xb6, 0x8b, 0x87, 0x17, 0x22, 0xe7, 0x78, 0xf6, 0xe2, 0x5e, 0x78, 0xae, 0x00, 0xa8, - 0x43, 0x28, 0xc4, 0xc2, 0xbf, 0x1c, 0x79, 0xb2, 0xc9, 0xd8, 0x69, 0x72, 0x60, 0xcd, - 0x44, 0x7e, 0x2e, 0xff, 0x31, 0x5d, 0x74, 0xb5, 0xb1, 0xfd, + 0x60, 0xf3, 0xe8, 0x94, 0xe3, 0x86, 0x4e, 0xfb, 0x48, 0xcc, 0xae, 0x50, 0xe1, 0x0d, + 0xa7, 0x73, 0xdc, 0xcf, 0x85, 0x62, 0x45, 0x5d, 0x1b, 0x73, 0x1a, 0xad, 0x44, 0xe1, + 0x5e, 0x3e, 0x40, 0x18, 0x31, 0xce, 0x6f, 0x92, 0xf4, 0x53, 0x2d, 0x90, 0x83, 0x92, + 0x59, 0xce, 0x9c, 0xb1, 0x44, 0x62, 0x1f, 0x12, 0x01, 0x77, 0x8f, 0x61, 0x5d, 0x09, + 0x87, 0x01, 0x0c, 0x8d, 0x13, 0x5c, 0x32, 0xd5, 0x6e, 0xe2, 0x84, 0x68, 0x65, 0xa2, + 0x61, 0xde, 0x14, 0x25, 0xd2, 0x3b, 0xcc, 0x51, 0xb8, 0xa0, ], }, TestVector { @@ -1350,35 +1355,36 @@ pub(crate) fn test_vectors() -> Vec { 0x0a, 0x12, 0x01, 0x2d, 0x63, 0xc0, 0x09, 0xc6, 0x77, 0x44, 0xba, 0xe0, 0xd5, 0x83, 0x88, 0xff, 0xee, 0x2f, ], + // FIXME: used instead of rho, which was possibly modified in zsa1 version nf_old: [ 0xe9, 0x16, 0x93, 0xc3, 0x7d, 0x04, 0x37, 0x5e, 0x67, 0xc5, 0x71, 0x5a, 0x39, 0xc9, 0x79, 0x4a, 0x4e, 0xcd, 0x08, 0x38, 0xe2, 0x35, 0x1f, 0xd7, 0xcd, 0x93, 0xa1, 0x55, 0x7f, 0x01, 0x02, 0x3e, ], cmx: [ - 0xcc, 0x29, 0x41, 0xe0, 0xf6, 0x38, 0x25, 0x7f, 0xb6, 0x51, 0x6a, 0x27, 0xc3, 0x0e, - 0xaa, 0xe0, 0xb4, 0x6d, 0x2f, 0xf0, 0x6a, 0x73, 0x50, 0x70, 0x41, 0x74, 0x6c, 0xdc, - 0x23, 0x07, 0x61, 0x25, + 0x1d, 0x51, 0xea, 0x92, 0xfa, 0x43, 0x55, 0x0a, 0x0e, 0xdd, 0xea, 0x23, 0x6e, 0x17, + 0xa0, 0x16, 0x93, 0xc2, 0x2d, 0x8d, 0xd8, 0x1c, 0x9c, 0x9e, 0xc8, 0x76, 0xa2, 0x4e, + 0x67, 0xd4, 0x93, 0x0b, ], esk: [ - 0xec, 0x99, 0xeb, 0x6f, 0x67, 0x1d, 0x0a, 0x9e, 0x84, 0x5a, 0xbf, 0xb7, 0x8a, 0xec, - 0xe9, 0x32, 0xeb, 0x13, 0xf5, 0xae, 0xd6, 0x4f, 0x20, 0xa7, 0x77, 0xc9, 0x46, 0xe9, - 0xcd, 0x7a, 0x24, 0x23, + 0x19, 0xe0, 0x26, 0x4b, 0x82, 0x88, 0xf7, 0x3e, 0xbf, 0x97, 0x14, 0xb0, 0xdf, 0x85, + 0x8e, 0xf7, 0xab, 0x39, 0xec, 0x50, 0x2c, 0xd2, 0x98, 0xf2, 0xc4, 0x84, 0xa9, 0xf4, + 0xc7, 0xda, 0x74, 0x36, ], ephemeral_key: [ - 0xad, 0xa7, 0x60, 0x27, 0xdc, 0xae, 0xb5, 0xf1, 0x58, 0xac, 0x6c, 0x5c, 0x6d, 0x7f, - 0x05, 0x31, 0x8f, 0xec, 0x26, 0xd5, 0xc7, 0x94, 0xf2, 0xe9, 0x00, 0xcb, 0x96, 0x29, - 0x92, 0x49, 0xe0, 0xb5, + 0x8f, 0xbe, 0xb6, 0xb3, 0x03, 0x8e, 0x69, 0x49, 0x91, 0x6a, 0x2c, 0x06, 0x0e, 0xf9, + 0xa4, 0xb1, 0xfe, 0xf1, 0x3a, 0xce, 0x2f, 0xee, 0x00, 0x25, 0xda, 0x32, 0xc3, 0x6d, + 0x23, 0x1a, 0x61, 0x34, ], shared_secret: [ - 0xc2, 0x5c, 0xf1, 0xd6, 0x53, 0x2e, 0x06, 0xcb, 0x8b, 0x15, 0x22, 0x14, 0x76, 0x6e, - 0xee, 0xd7, 0x5a, 0x17, 0x8c, 0x82, 0x2a, 0x11, 0x51, 0xf6, 0x9e, 0x92, 0xe9, 0xcf, - 0xfa, 0x47, 0xcb, 0x19, + 0x67, 0xd6, 0x8a, 0x5a, 0x05, 0x93, 0xfd, 0x16, 0x7d, 0x38, 0x08, 0x2e, 0x49, 0xd2, + 0x30, 0x30, 0x86, 0xe5, 0x5a, 0x43, 0xc1, 0x24, 0xd5, 0xaa, 0xa8, 0x20, 0xab, 0x0c, + 0x3f, 0x5c, 0xc5, 0x37, ], k_enc: [ - 0xd4, 0xef, 0x89, 0xc4, 0x64, 0xbe, 0x8f, 0x42, 0xf6, 0xb7, 0xf2, 0x6d, 0x89, 0x37, - 0x8b, 0x73, 0xa3, 0x55, 0xa4, 0xfe, 0x24, 0x6c, 0x2e, 0xc8, 0xe8, 0x14, 0x6b, 0xef, - 0x7d, 0xdd, 0x14, 0x19, + 0x6b, 0x8d, 0x83, 0xf2, 0xf1, 0xfd, 0x1e, 0xad, 0x7d, 0x45, 0x42, 0xb3, 0x63, 0x09, + 0x34, 0x07, 0xc5, 0x0a, 0x20, 0xed, 0x7f, 0x0e, 0x8c, 0xf2, 0xdb, 0x53, 0x6d, 0xb1, + 0xbe, 0x25, 0xe9, 0x8d, ], p_enc: [ 0x02, 0x56, 0x4f, 0xc3, 0x81, 0xfc, 0x4d, 0xc8, 0x11, 0x8d, 0xe4, 0x7c, 0x10, 0xb8, @@ -1424,68 +1430,68 @@ pub(crate) fn test_vectors() -> Vec { 0x1a, 0x81, 0xa3, 0x59, ], c_enc: [ - 0xea, 0x86, 0x7e, 0x07, 0xac, 0xb7, 0xfa, 0x03, 0xe7, 0x36, 0xce, 0xdd, 0xed, 0x82, - 0x3d, 0x19, 0x91, 0x30, 0xfb, 0x3f, 0xef, 0x62, 0xcc, 0x3e, 0xa9, 0xa0, 0xc9, 0x35, - 0xdf, 0x05, 0xc5, 0xad, 0x5e, 0x67, 0xf7, 0x4f, 0xcb, 0xa6, 0x67, 0xe0, 0x81, 0x1c, - 0xdc, 0x0c, 0xa9, 0xf3, 0xd7, 0x81, 0x76, 0x43, 0x75, 0x56, 0x47, 0xbe, 0x59, 0xdf, - 0x09, 0x6e, 0x46, 0x5e, 0xc1, 0x11, 0x24, 0x36, 0x3c, 0x98, 0x1c, 0x55, 0xd5, 0x5f, - 0x8d, 0x8a, 0xc8, 0xb6, 0x54, 0x0a, 0x98, 0xcf, 0xcc, 0x29, 0x4a, 0xa7, 0xcc, 0x62, - 0x95, 0x50, 0x85, 0x3a, 0x25, 0xbf, 0x6b, 0x32, 0x35, 0x16, 0xe1, 0x58, 0x2b, 0x4e, - 0x8b, 0x82, 0x95, 0xe2, 0x7f, 0x6b, 0x99, 0x94, 0x80, 0x2e, 0xfe, 0xf5, 0x43, 0x1f, - 0x03, 0x7d, 0x22, 0x09, 0xa0, 0x88, 0x07, 0x34, 0x6f, 0xb3, 0x9c, 0xad, 0xd8, 0x93, - 0xd6, 0x5f, 0x64, 0xc7, 0xfe, 0x92, 0xec, 0xbc, 0xdf, 0xe5, 0x55, 0x54, 0xca, 0xff, - 0xb0, 0xcf, 0x41, 0xeb, 0x5c, 0x55, 0x72, 0xba, 0x44, 0x39, 0x90, 0x00, 0xe9, 0xfa, - 0x9a, 0xaf, 0x6e, 0xb7, 0x6c, 0x2a, 0x8a, 0x5d, 0x7b, 0x6b, 0x52, 0xb9, 0xa9, 0xef, - 0x6e, 0xc3, 0xed, 0xa6, 0x65, 0xfe, 0x8a, 0xa8, 0x07, 0x48, 0xb8, 0x1f, 0x7d, 0x55, - 0x96, 0xf1, 0x94, 0x2f, 0xf7, 0x1d, 0x29, 0xc6, 0x78, 0xa3, 0xb6, 0xc6, 0x6b, 0xa7, - 0x0f, 0x45, 0xb1, 0xfc, 0xf2, 0x22, 0x38, 0x84, 0x50, 0x68, 0xf3, 0x60, 0xb0, 0x99, - 0xae, 0xe9, 0xf2, 0xf0, 0xef, 0x22, 0x33, 0x3f, 0xd6, 0x4f, 0xf1, 0x1e, 0x48, 0x15, - 0x43, 0xa5, 0x2b, 0xb3, 0x3f, 0x52, 0x3d, 0xe2, 0xec, 0x92, 0x3a, 0xe9, 0x86, 0x58, - 0x57, 0x71, 0x7b, 0x65, 0xd4, 0x4c, 0x3d, 0x9d, 0xb7, 0xb3, 0xec, 0xb2, 0xff, 0x02, - 0x25, 0x29, 0x7d, 0xeb, 0x83, 0xdd, 0x1b, 0x9a, 0x39, 0x4d, 0x69, 0x7c, 0x09, 0xd7, - 0xfe, 0xc6, 0x1e, 0xac, 0xee, 0x39, 0xa2, 0xf1, 0xce, 0xd9, 0xe6, 0xfd, 0xa5, 0xc0, - 0xf3, 0x27, 0x71, 0xc6, 0xce, 0x3f, 0x17, 0xbe, 0x0e, 0xef, 0x81, 0x10, 0x99, 0xc1, - 0x09, 0xe4, 0xfb, 0x6a, 0xec, 0x30, 0xdf, 0x04, 0x5b, 0x43, 0xda, 0x89, 0x30, 0x8b, - 0xc8, 0x37, 0x68, 0x8b, 0xb0, 0xf4, 0xa2, 0xc6, 0x04, 0xa1, 0x54, 0xa8, 0x47, 0xc5, - 0xd7, 0x87, 0x27, 0xf0, 0xe1, 0xab, 0x11, 0xe3, 0x40, 0xcf, 0xd4, 0xc7, 0xe8, 0xc6, - 0xba, 0xff, 0xfe, 0xfc, 0x74, 0xef, 0x55, 0x3d, 0x4b, 0x29, 0x26, 0x9f, 0x38, 0xb4, - 0xb7, 0xfe, 0x6e, 0x07, 0x3a, 0x70, 0xae, 0xf2, 0x0d, 0x6c, 0x23, 0x8b, 0x9f, 0xfd, - 0x24, 0x1f, 0xf6, 0x99, 0x99, 0x92, 0x30, 0xf0, 0xb3, 0x9c, 0x96, 0x3e, 0xfa, 0x00, - 0xef, 0x7f, 0x09, 0x2d, 0x76, 0x0c, 0x40, 0x9a, 0x2b, 0x6c, 0x26, 0xb4, 0x97, 0x82, - 0x9b, 0x81, 0xcb, 0xa4, 0xc8, 0x3b, 0x11, 0x44, 0xc6, 0x5a, 0x2d, 0x31, 0x78, 0xbb, - 0x28, 0xc1, 0xd8, 0xe3, 0x30, 0xd3, 0xf4, 0xaf, 0x90, 0x10, 0xad, 0x49, 0xa5, 0xdb, - 0x70, 0xd6, 0x6a, 0xf5, 0x70, 0x19, 0x21, 0x49, 0x80, 0x5f, 0xe1, 0xca, 0x61, 0xc6, - 0xd4, 0xec, 0xaf, 0xa7, 0x97, 0x51, 0x7f, 0x33, 0x06, 0xaf, 0x2a, 0x32, 0x27, 0x3b, - 0xf3, 0xd6, 0x98, 0xaa, 0x55, 0xa5, 0x72, 0xb2, 0xdf, 0x80, 0x36, 0xd9, 0x7c, 0xf5, - 0x8c, 0x12, 0x9f, 0x82, 0x85, 0xd0, 0xd7, 0xea, 0x04, 0xc1, 0x88, 0xa8, 0x39, 0x6e, - 0x73, 0x8b, 0xd4, 0x48, 0x46, 0x5e, 0x7b, 0x9a, 0x64, 0xb7, 0x96, 0x7b, 0xcb, 0x25, - 0xf8, 0xaa, 0x85, 0x9e, 0xa5, 0xca, 0x06, 0xc3, 0xdf, 0x39, 0x0f, 0xac, 0x8a, 0xc6, - 0x06, 0x05, 0x03, 0x1a, 0x02, 0x09, 0xbb, 0x80, 0x24, 0x0d, 0x05, 0x45, 0xf4, 0x11, - 0x77, 0xea, 0xb4, 0x40, 0x2e, 0x8a, 0x42, 0x3a, 0x40, 0xcc, 0xff, 0x58, 0x6b, 0x2e, - 0xdd, 0x6a, 0xcf, 0xb8, 0xf1, 0xd8, 0x0d, 0x8c, 0x60, 0x5f, 0x49, 0x05, 0x2e, 0x7a, - 0x30, 0x82, 0x6e, 0x1f, 0x03, 0x09, 0x9c, 0x71, 0x43, 0xad, 0x0b, 0x51, 0xfc, 0x63, - 0x6f, 0x1d, 0x87, 0x05, 0x83, 0xd6, 0xed, 0xce, 0xcd, 0xe9, 0x42, 0x38, 0x9e, 0x6c, - 0x01, 0x00, 0x66, 0x78, 0xda, 0xad, + 0x77, 0xc6, 0xef, 0xc8, 0xb5, 0x42, 0xa7, 0x07, 0xc0, 0xa5, 0xcf, 0x5c, 0xe3, 0xf3, + 0xb9, 0x6d, 0xe1, 0x91, 0x95, 0x7c, 0x9f, 0xa6, 0xe9, 0xbb, 0x4b, 0x8d, 0x89, 0x9e, + 0x1f, 0x19, 0xe0, 0x20, 0xba, 0x7b, 0xb3, 0xfe, 0xf1, 0x67, 0x81, 0xc8, 0x8c, 0xc5, + 0xd4, 0x4a, 0x5e, 0xf8, 0x17, 0x31, 0x47, 0xdc, 0x3d, 0x1b, 0x51, 0x6a, 0xf6, 0xdd, + 0x77, 0xdd, 0xb6, 0xee, 0x67, 0xaa, 0xf5, 0x42, 0xce, 0xe2, 0xbe, 0xd3, 0xe4, 0xa0, + 0x7e, 0xce, 0x42, 0x8f, 0x22, 0xa8, 0x01, 0xcf, 0x01, 0xba, 0xad, 0x18, 0x27, 0xfd, + 0x42, 0x57, 0x46, 0xc5, 0x45, 0x00, 0x1c, 0x35, 0x6d, 0x0a, 0xbe, 0xaa, 0xa5, 0xa4, + 0x22, 0xdf, 0xff, 0x0e, 0xe2, 0x18, 0xac, 0x37, 0xef, 0x83, 0x97, 0xc6, 0x2c, 0xa8, + 0x6f, 0xab, 0xeb, 0xb6, 0x88, 0xb3, 0x8f, 0xb4, 0xa6, 0x54, 0x29, 0x11, 0xbe, 0x1c, + 0x5e, 0x71, 0x77, 0x8b, 0x5e, 0xb5, 0x3a, 0xf1, 0xc4, 0xcb, 0x4d, 0xd9, 0x94, 0x72, + 0x4f, 0x61, 0x0f, 0x38, 0x72, 0x4a, 0x73, 0xdf, 0x09, 0x2b, 0xea, 0xe8, 0xb8, 0x7f, + 0x7f, 0x6a, 0x2b, 0xc0, 0x9d, 0xf2, 0xaa, 0x18, 0xc2, 0xf8, 0xee, 0xba, 0x63, 0xee, + 0x0d, 0x31, 0x35, 0x3b, 0x6f, 0x28, 0x3e, 0xf5, 0x9a, 0xc1, 0x53, 0x60, 0x73, 0xda, + 0x7a, 0x6d, 0x82, 0xbf, 0xdc, 0x09, 0x74, 0x02, 0x08, 0x0f, 0xa1, 0x03, 0xcb, 0x8b, + 0x3e, 0xfb, 0x94, 0x1e, 0xe5, 0x01, 0xf6, 0x41, 0x2c, 0xfb, 0xc2, 0x50, 0xaf, 0xad, + 0xbe, 0x54, 0x4a, 0xc5, 0x1f, 0xce, 0x41, 0x5a, 0x24, 0x93, 0xba, 0x83, 0x9e, 0x38, + 0x18, 0xb0, 0xfe, 0x30, 0x18, 0xbf, 0xa4, 0x37, 0xf0, 0x6e, 0x31, 0x86, 0x14, 0x8a, + 0xa4, 0x05, 0xba, 0xb8, 0x21, 0xa2, 0x6e, 0xa0, 0x7f, 0x93, 0xcf, 0xe7, 0x56, 0x8f, + 0xe3, 0xef, 0x08, 0xfa, 0x0b, 0x80, 0xfc, 0xec, 0x5b, 0xd5, 0x91, 0x5f, 0x68, 0x8c, + 0xf5, 0x99, 0x31, 0x5e, 0x79, 0xaa, 0xea, 0x34, 0xd5, 0x18, 0xd9, 0x55, 0xfe, 0xef, + 0x30, 0x3f, 0x69, 0xb2, 0x87, 0xc6, 0xd0, 0x51, 0x6d, 0xa2, 0x39, 0xfb, 0xbd, 0xdb, + 0xaf, 0x25, 0x56, 0xeb, 0xce, 0x77, 0xa3, 0xd5, 0x97, 0x23, 0x5c, 0x22, 0xd3, 0x8c, + 0x5b, 0x5e, 0xeb, 0x98, 0xc7, 0xc0, 0x8d, 0xa8, 0xd3, 0x76, 0xbb, 0xa1, 0xb5, 0x07, + 0x85, 0xbe, 0x82, 0xbf, 0xe0, 0x9a, 0xe7, 0x1c, 0xcc, 0xaf, 0x31, 0xa2, 0xf0, 0xcf, + 0xa0, 0x76, 0xd1, 0xe4, 0xd1, 0xb5, 0x2f, 0xee, 0x45, 0xc8, 0xed, 0x23, 0xdf, 0x33, + 0xa8, 0x1c, 0xb1, 0xa8, 0xac, 0xec, 0x9f, 0x53, 0x5d, 0xa4, 0x96, 0x70, 0xf9, 0x98, + 0x6d, 0x5c, 0x92, 0xc8, 0x2b, 0x0a, 0xd2, 0x20, 0xf8, 0x5f, 0x3b, 0x38, 0x72, 0xeb, + 0xe0, 0x53, 0xcd, 0xeb, 0x96, 0x1b, 0xd2, 0xd3, 0xab, 0x3b, 0xcd, 0x67, 0x6e, 0x6f, + 0xd7, 0xcb, 0xe9, 0x79, 0x5e, 0x1f, 0x2d, 0x82, 0x87, 0x00, 0x7c, 0x91, 0x0e, 0x7b, + 0x43, 0x01, 0x69, 0xe4, 0x51, 0xf0, 0xb2, 0xd7, 0x63, 0xe5, 0x43, 0x03, 0x3b, 0xc6, + 0xc7, 0x38, 0x9f, 0xa1, 0x61, 0x5b, 0xa1, 0x9d, 0x1f, 0x27, 0x48, 0xb2, 0x17, 0xc9, + 0x60, 0xfe, 0x05, 0x04, 0x07, 0xc8, 0xf4, 0x73, 0x35, 0x6b, 0xaa, 0x6e, 0x0c, 0x7d, + 0x77, 0xfa, 0xc6, 0xc7, 0xdb, 0x45, 0x12, 0xaf, 0x57, 0x96, 0xb3, 0xbc, 0xf1, 0x23, + 0xe0, 0x90, 0xb9, 0x80, 0xeb, 0xc2, 0xd6, 0x4b, 0x86, 0xdd, 0x24, 0xcb, 0x9a, 0x6d, + 0xab, 0x1d, 0xb4, 0x13, 0x04, 0x75, 0x38, 0x90, 0x2e, 0x2e, 0x49, 0x0e, 0x4f, 0xc8, + 0x78, 0xaa, 0x04, 0xdb, 0xef, 0x66, 0x99, 0x63, 0x9c, 0x3d, 0xab, 0x17, 0xc5, 0x14, + 0x70, 0x48, 0xac, 0x6d, 0x48, 0x49, 0x0d, 0xc4, 0x88, 0x5e, 0xd9, 0x86, 0x70, 0x63, + 0x35, 0xf4, 0x1b, 0xa4, 0x15, 0x59, 0x65, 0x9e, 0x1b, 0x53, 0xda, 0x76, 0x51, 0x4c, + 0xc4, 0x0a, 0xdb, 0x66, 0xc3, 0x5c, 0xe5, 0x6f, 0x3a, 0xbe, 0x39, 0xe1, 0xae, 0xe5, + 0x84, 0x9f, 0xff, 0xcc, 0x6e, 0x1f, 0x1b, 0xf8, 0x11, 0xce, 0xb6, 0x65, 0xa6, 0xfc, + 0xf8, 0x80, 0x6b, 0xbb, 0xba, 0x4a, 0x5b, 0x87, 0x38, 0xa1, 0x17, 0xdc, 0xaf, 0xfb, + 0x4f, 0xdf, 0x10, 0x08, 0x00, 0x6f, ], ock: [ - 0xf9, 0x59, 0x87, 0xcc, 0x0c, 0x73, 0x57, 0xc7, 0x20, 0x26, 0x27, 0xa5, 0xa5, 0x50, - 0x09, 0xef, 0xd7, 0x17, 0x55, 0x3e, 0x9d, 0x34, 0xc1, 0x5f, 0xad, 0xf5, 0xc9, 0x46, - 0xa9, 0xa0, 0x72, 0x17, + 0xb4, 0xf8, 0x8a, 0x29, 0x2d, 0x09, 0xd9, 0x35, 0xb4, 0x77, 0x5a, 0x29, 0x30, 0xeb, + 0x38, 0xce, 0xbd, 0x5a, 0xf6, 0xff, 0x3f, 0x39, 0xef, 0x5b, 0xb2, 0x4c, 0xd5, 0x72, + 0x81, 0xf0, 0x8c, 0xfb, ], op: [ 0xae, 0xee, 0xa5, 0x0c, 0x6b, 0xb0, 0x2e, 0x5e, 0x22, 0x4d, 0xc2, 0x95, 0x9c, 0x22, 0x9d, 0x0e, 0x3b, 0xb8, 0x79, 0xc4, 0xab, 0x00, 0xaa, 0x0a, 0xb2, 0x5a, 0x40, 0x10, - 0x6b, 0x80, 0xbb, 0xb7, 0xec, 0x99, 0xeb, 0x6f, 0x67, 0x1d, 0x0a, 0x9e, 0x84, 0x5a, - 0xbf, 0xb7, 0x8a, 0xec, 0xe9, 0x32, 0xeb, 0x13, 0xf5, 0xae, 0xd6, 0x4f, 0x20, 0xa7, - 0x77, 0xc9, 0x46, 0xe9, 0xcd, 0x7a, 0x24, 0x23, + 0x6b, 0x80, 0xbb, 0xb7, 0x19, 0xe0, 0x26, 0x4b, 0x82, 0x88, 0xf7, 0x3e, 0xbf, 0x97, + 0x14, 0xb0, 0xdf, 0x85, 0x8e, 0xf7, 0xab, 0x39, 0xec, 0x50, 0x2c, 0xd2, 0x98, 0xf2, + 0xc4, 0x84, 0xa9, 0xf4, 0xc7, 0xda, 0x74, 0x36, ], c_out: [ - 0x28, 0x9d, 0x00, 0xd4, 0x62, 0x78, 0x0b, 0xdb, 0xb6, 0xcd, 0x6c, 0xec, 0x93, 0x6b, - 0xe6, 0x5e, 0x63, 0x0d, 0x4a, 0x3c, 0x2a, 0xf7, 0x6e, 0x10, 0x4b, 0x17, 0x4e, 0x3d, - 0x5b, 0x71, 0x66, 0x39, 0xb0, 0x68, 0xb3, 0x85, 0x00, 0xd8, 0x04, 0x00, 0xee, 0x64, - 0x2f, 0x8e, 0x08, 0xc8, 0xdb, 0x29, 0xff, 0xd5, 0xa9, 0xda, 0xde, 0x84, 0xa5, 0x49, - 0x5d, 0x57, 0x7b, 0x2f, 0x56, 0xd3, 0x2b, 0x07, 0x96, 0xca, 0x23, 0xf0, 0x0f, 0x0f, - 0x8e, 0xf9, 0x93, 0x07, 0x4f, 0x88, 0x0d, 0x6a, 0xeb, 0xcb, + 0x94, 0xe3, 0x7f, 0xd6, 0x62, 0x82, 0xc0, 0x2e, 0x90, 0xe7, 0x69, 0x91, 0x4c, 0xaf, + 0x95, 0xa4, 0x95, 0xf4, 0x89, 0x7f, 0x55, 0xa5, 0xae, 0x95, 0xad, 0xe8, 0xbf, 0x67, + 0x61, 0xe3, 0x1b, 0xa5, 0xd1, 0xcf, 0xeb, 0x30, 0x6f, 0x4e, 0x22, 0x01, 0x42, 0x51, + 0xcb, 0xe3, 0xf8, 0x72, 0x4b, 0xe7, 0x69, 0x21, 0xe2, 0xad, 0xa4, 0x6e, 0x3b, 0x14, + 0x5d, 0x1b, 0x04, 0x3e, 0xb1, 0x2a, 0x0e, 0xfa, 0xb5, 0x16, 0x09, 0x34, 0xbc, 0x75, + 0x9e, 0x02, 0x01, 0xd8, 0x66, 0xad, 0xa7, 0x44, 0x35, 0x71, ], }, TestVector { @@ -1559,35 +1565,36 @@ pub(crate) fn test_vectors() -> Vec { 0xcd, 0x51, 0x00, 0x89, 0x08, 0xa6, 0xcd, 0xd0, 0xaa, 0x02, 0x1b, 0x88, 0x8b, 0x98, 0xe2, 0x3c, 0x39, 0x11, ], + // FIXME: used instead of rho, which was possibly modified in zsa1 version nf_old: [ 0x35, 0x6f, 0xc7, 0x2e, 0x1b, 0xf1, 0xe3, 0xa2, 0xa5, 0x9a, 0xa9, 0xe4, 0x75, 0x15, 0x5c, 0xf7, 0x43, 0xf8, 0xfd, 0xf0, 0xd1, 0x5b, 0x4c, 0xc4, 0x02, 0x60, 0xd0, 0xd0, 0x9a, 0xda, 0x04, 0x08, ], cmx: [ - 0xca, 0xa2, 0x8a, 0x69, 0x04, 0x54, 0x66, 0x37, 0xa7, 0xd4, 0xe5, 0xfb, 0xc2, 0x65, - 0x4c, 0xbf, 0x24, 0x4d, 0x18, 0x77, 0x9d, 0x35, 0x62, 0x25, 0x6c, 0x14, 0xd5, 0xb1, - 0x00, 0x5d, 0xc6, 0x0f, + 0xbe, 0x43, 0xee, 0x84, 0x70, 0x70, 0x75, 0xac, 0x48, 0x08, 0xd0, 0x97, 0x54, 0x07, + 0xc0, 0x27, 0x36, 0xd7, 0x66, 0x64, 0xf4, 0xe7, 0xae, 0xce, 0x01, 0xd9, 0xcc, 0x68, + 0x32, 0x4a, 0xe9, 0x04, ], esk: [ - 0x01, 0xa3, 0x66, 0x1e, 0xa9, 0xaa, 0xb8, 0xf4, 0x32, 0x53, 0x42, 0x0e, 0xff, 0xd7, - 0xa4, 0x83, 0xc2, 0x79, 0xd4, 0x18, 0x18, 0xbc, 0xb3, 0xee, 0x91, 0x90, 0x01, 0xf8, - 0x66, 0xa8, 0xe9, 0x2c, + 0xf9, 0xf7, 0xa0, 0x10, 0x5e, 0xa9, 0xf4, 0x45, 0xfb, 0x7a, 0x14, 0x49, 0x72, 0x62, + 0xc6, 0xe4, 0xd7, 0x32, 0x89, 0x32, 0x7b, 0x8a, 0x2d, 0xf5, 0xe2, 0x63, 0xf3, 0xe3, + 0x99, 0x07, 0xea, 0x0c, ], ephemeral_key: [ - 0x00, 0x62, 0x7e, 0x29, 0xc1, 0x83, 0x3e, 0x4e, 0x8f, 0xad, 0xe0, 0x82, 0x52, 0xf3, - 0x83, 0x67, 0x78, 0xb9, 0x39, 0x4c, 0x1f, 0xfe, 0xab, 0x70, 0xbf, 0x35, 0x93, 0xd5, - 0x9a, 0x81, 0xa0, 0xa5, + 0xfa, 0x19, 0xa1, 0x52, 0x7b, 0x76, 0x04, 0x8f, 0xf3, 0x7f, 0xa4, 0xf8, 0x27, 0x89, + 0xfe, 0x80, 0xb0, 0xcd, 0xd3, 0x5d, 0x5d, 0xa9, 0xc2, 0xec, 0x3f, 0xe3, 0x04, 0x38, + 0x05, 0xc0, 0x61, 0x23, ], shared_secret: [ - 0xa9, 0x93, 0x34, 0x1f, 0x99, 0xeb, 0xa8, 0x2d, 0xb6, 0xec, 0x5e, 0x71, 0x3e, 0xe2, - 0x9c, 0x01, 0xf4, 0xce, 0x2a, 0x8b, 0xb6, 0xb5, 0xeb, 0xb6, 0x0b, 0xa6, 0xeb, 0xa9, - 0x6b, 0xa4, 0x17, 0x9b, + 0x2d, 0xb5, 0xb8, 0x92, 0xb6, 0x1b, 0x9c, 0x55, 0x3b, 0x6c, 0x9b, 0x7a, 0xcc, 0x7d, + 0x71, 0x05, 0xc1, 0xdd, 0x4c, 0x28, 0xc6, 0x7f, 0x97, 0x8b, 0x6d, 0x79, 0xc7, 0x1b, + 0x98, 0xa0, 0xd0, 0x00, ], k_enc: [ - 0x35, 0x81, 0x19, 0x19, 0x3c, 0x9d, 0x2a, 0xb6, 0xd4, 0x95, 0xe0, 0x19, 0xf9, 0x7a, - 0x1c, 0x41, 0x30, 0xae, 0xe6, 0x3d, 0xae, 0xc6, 0xbb, 0xa2, 0xf2, 0x74, 0x40, 0x0f, - 0xd3, 0x4f, 0xad, 0x28, + 0x16, 0xe3, 0xf9, 0x85, 0xc0, 0x7f, 0xef, 0xe5, 0x30, 0xd9, 0xe6, 0x94, 0x5e, 0xde, + 0xc1, 0x90, 0x3b, 0xb1, 0xca, 0x8d, 0xa5, 0xa2, 0x5b, 0xe9, 0x59, 0x78, 0x63, 0x7a, + 0x40, 0x8c, 0x2e, 0xfe, ], p_enc: [ 0x02, 0xc6, 0xe8, 0xf0, 0xd5, 0x0a, 0xe8, 0x05, 0x87, 0x91, 0xdc, 0x0e, 0x46, 0x49, @@ -1633,68 +1640,68 @@ pub(crate) fn test_vectors() -> Vec { 0x84, 0x37, 0x3f, 0x4f, ], c_enc: [ - 0x31, 0xac, 0xda, 0xa6, 0xc1, 0x76, 0xbb, 0x7a, 0x2c, 0x7d, 0x66, 0x09, 0xdc, 0x2c, - 0x5e, 0x7b, 0x2e, 0xe7, 0x1d, 0xa9, 0x3c, 0x73, 0x87, 0x52, 0x74, 0xfa, 0x6c, 0x2a, - 0xd6, 0x26, 0x13, 0xc7, 0x18, 0x9b, 0x35, 0x33, 0xec, 0xf0, 0x34, 0xd8, 0x76, 0xc7, - 0x26, 0xf1, 0xed, 0x99, 0x43, 0xd4, 0x45, 0x07, 0x87, 0x52, 0x75, 0xa8, 0xe3, 0x71, - 0x0a, 0x11, 0x8d, 0x91, 0x64, 0x72, 0x91, 0x28, 0x6c, 0xf8, 0x80, 0xa7, 0x82, 0xab, - 0xea, 0xa8, 0xa6, 0xc3, 0x2f, 0xdf, 0x6f, 0x30, 0x4b, 0x0e, 0xe5, 0xbc, 0xb1, 0x4b, - 0x82, 0x79, 0x2a, 0xa3, 0xaf, 0xd7, 0x24, 0x3f, 0x57, 0xb7, 0xdc, 0xa7, 0x93, 0x52, - 0x19, 0xdf, 0x98, 0x2c, 0xe1, 0x28, 0xae, 0xa6, 0xf6, 0xbd, 0x18, 0xe1, 0x30, 0x7e, - 0xba, 0x0e, 0x3d, 0xb0, 0x06, 0x14, 0xc2, 0x65, 0xc6, 0xf2, 0x8b, 0xfe, 0x58, 0xc1, - 0x1d, 0x4a, 0xc9, 0x6d, 0x49, 0x02, 0x96, 0x7b, 0x54, 0xbc, 0x5d, 0xd1, 0x5c, 0x14, - 0x3f, 0xf4, 0x2b, 0xbb, 0x62, 0xb9, 0x34, 0xb0, 0x9e, 0x79, 0xb6, 0x1e, 0xaf, 0xe7, - 0x9a, 0xbc, 0x86, 0x94, 0x47, 0x5b, 0x6c, 0x8e, 0x19, 0x94, 0xba, 0x05, 0x5e, 0xa3, - 0xc1, 0x82, 0x93, 0xb0, 0x3c, 0x42, 0x49, 0x50, 0x1d, 0xfd, 0xc0, 0x14, 0x60, 0xcf, - 0x78, 0xcd, 0x97, 0x51, 0x30, 0xae, 0x34, 0x05, 0xba, 0x7d, 0xdc, 0x71, 0x30, 0xcb, - 0xdb, 0xb9, 0x8c, 0x7a, 0xaf, 0x6b, 0x1d, 0x0b, 0x44, 0xa5, 0x16, 0x79, 0xaa, 0x63, - 0x0a, 0x43, 0xae, 0x23, 0xb3, 0xd2, 0x2f, 0x73, 0x4c, 0xe1, 0xdb, 0xed, 0xea, 0x17, - 0x5a, 0x00, 0x62, 0xb0, 0x6e, 0x23, 0xf4, 0xd0, 0x6d, 0x2a, 0xd0, 0x45, 0xae, 0x98, - 0x2d, 0xb4, 0x34, 0x8f, 0x20, 0xc8, 0x9b, 0xf9, 0x67, 0x0e, 0x2f, 0xda, 0x47, 0x2e, - 0x55, 0xce, 0x4c, 0x35, 0x82, 0xb7, 0x64, 0x43, 0xe0, 0xab, 0xbb, 0x77, 0x8a, 0xec, - 0xa0, 0xf3, 0x9c, 0x55, 0xb6, 0xab, 0xbe, 0xd8, 0x1f, 0xde, 0x89, 0xad, 0x2c, 0x56, - 0x7d, 0xfe, 0x27, 0x7b, 0xb2, 0x69, 0xac, 0x6a, 0xe0, 0xe1, 0x88, 0x39, 0x8d, 0xea, - 0x24, 0xad, 0xcc, 0xe1, 0x82, 0xe7, 0xfd, 0xdc, 0x80, 0xeb, 0xd7, 0x69, 0xd0, 0xf0, - 0x76, 0xf9, 0xaf, 0x2d, 0xd9, 0x83, 0x07, 0xa5, 0x27, 0xc6, 0x99, 0x42, 0xdf, 0xa3, - 0xe7, 0xf4, 0x86, 0x76, 0x10, 0x1a, 0x47, 0xeb, 0x07, 0x80, 0xb6, 0x90, 0xb1, 0xaf, - 0x10, 0xfc, 0xfb, 0x5e, 0xe2, 0xbd, 0x40, 0xd2, 0x7d, 0x10, 0x9b, 0xa1, 0x5a, 0xb0, - 0xb1, 0xe9, 0x55, 0x4f, 0xdd, 0xfa, 0x81, 0x6b, 0x99, 0xcd, 0x8f, 0xdd, 0xe6, 0x81, - 0xae, 0x6b, 0x6c, 0xbb, 0xfb, 0xf0, 0x2c, 0x36, 0x32, 0x68, 0xd0, 0xf3, 0xc6, 0xa7, - 0x26, 0x1b, 0x6d, 0x00, 0x87, 0xbc, 0xad, 0xb6, 0xfb, 0x9b, 0xf3, 0x93, 0x04, 0xfc, - 0x08, 0x41, 0x5d, 0x83, 0x6f, 0xe4, 0x09, 0xa4, 0x3f, 0xaf, 0x9e, 0x28, 0xfb, 0x48, - 0x3f, 0x4a, 0x47, 0xaa, 0xd7, 0xe1, 0xf7, 0x97, 0x30, 0xb3, 0x21, 0x53, 0x60, 0x80, - 0xdb, 0x35, 0x12, 0x48, 0xb2, 0x66, 0x9b, 0x6e, 0x74, 0x48, 0x90, 0x87, 0xae, 0x72, - 0xba, 0x15, 0xd2, 0xae, 0xdd, 0x0c, 0x1e, 0x7e, 0xb1, 0x5a, 0x2f, 0x5a, 0x77, 0x31, - 0xeb, 0x45, 0xa6, 0x17, 0x8a, 0x44, 0x87, 0x09, 0x31, 0xec, 0x8e, 0x34, 0x8c, 0x19, - 0x2b, 0xc8, 0x87, 0xc8, 0x63, 0x60, 0x56, 0x67, 0x6f, 0x58, 0xd0, 0xc6, 0x34, 0xfc, - 0x99, 0xea, 0x7b, 0x07, 0xfa, 0x1b, 0x62, 0x99, 0xae, 0x5d, 0xbf, 0xe0, 0x84, 0x45, - 0xad, 0x99, 0x9f, 0x45, 0xdf, 0x00, 0xf1, 0xa4, 0x7a, 0xa5, 0xef, 0x6f, 0x88, 0xcd, - 0xba, 0x80, 0xc8, 0x8f, 0x94, 0x01, 0xe6, 0xe9, 0x09, 0xca, 0x2c, 0x5d, 0xe2, 0xcf, - 0x8f, 0x6a, 0x98, 0x44, 0xca, 0x32, 0xfe, 0x91, 0xf7, 0x13, 0xfe, 0x10, 0xa0, 0x69, - 0x8a, 0x1b, 0x3b, 0xfd, 0xf4, 0x47, 0x43, 0x75, 0xb4, 0x79, 0x1d, 0xc8, 0x50, 0x50, - 0xc9, 0x28, 0x90, 0x0e, 0x73, 0x1f, 0x7c, 0x4a, 0x12, 0x9d, 0x8e, 0x21, 0xfc, 0xf4, - 0x17, 0x62, 0x7c, 0x47, 0xdd, 0xc9, 0xf5, 0x88, 0x40, 0x38, 0x41, 0x31, 0x7a, 0x9a, - 0xc2, 0x6e, 0xef, 0x6c, 0xda, 0x23, + 0x2d, 0x40, 0x4a, 0x68, 0x81, 0xa6, 0xee, 0x76, 0x0c, 0xb5, 0x3b, 0x9c, 0xc2, 0x71, + 0x5c, 0xa7, 0x6a, 0x3a, 0x2f, 0xc9, 0x69, 0x3b, 0x1a, 0xbb, 0xcd, 0xc7, 0x5c, 0xb6, + 0xd6, 0xc3, 0x6e, 0xcf, 0x84, 0xd6, 0x93, 0x67, 0x2c, 0x53, 0xce, 0xd8, 0x79, 0x8c, + 0xc8, 0xf1, 0xe5, 0x3b, 0x8a, 0x9d, 0xe7, 0xbb, 0xb5, 0xe8, 0xc5, 0xa4, 0x6c, 0x3a, + 0x74, 0x12, 0xdf, 0x11, 0xc5, 0xda, 0x16, 0xb4, 0xdd, 0x22, 0x90, 0x1a, 0x59, 0x2b, + 0x0e, 0x93, 0x29, 0x77, 0xba, 0x06, 0x67, 0x3d, 0x6f, 0xd0, 0x38, 0xac, 0xba, 0xa9, + 0xbf, 0x79, 0xc1, 0x5b, 0xa6, 0x2b, 0x6e, 0x30, 0x74, 0xef, 0x95, 0x3b, 0x81, 0x4c, + 0xf1, 0xbd, 0xf0, 0x15, 0x77, 0xed, 0x3e, 0x3f, 0xae, 0xf4, 0x71, 0x55, 0xc9, 0x1c, + 0x68, 0xee, 0x32, 0x88, 0x1b, 0x73, 0x74, 0x94, 0xb3, 0xb4, 0x76, 0x08, 0x3b, 0x3b, + 0xd1, 0x77, 0x93, 0xc4, 0x98, 0x93, 0x1e, 0xaa, 0x92, 0xb1, 0x7c, 0x7d, 0x10, 0x47, + 0x58, 0xfc, 0x8b, 0x34, 0x93, 0xd2, 0x47, 0x41, 0x7f, 0x5e, 0xc1, 0x97, 0x9a, 0x35, + 0x28, 0x93, 0xe9, 0x95, 0x63, 0xb6, 0xc3, 0xab, 0x95, 0xcc, 0x5a, 0xfa, 0x37, 0x32, + 0xef, 0xae, 0xce, 0x9e, 0x74, 0x32, 0xc8, 0x04, 0x15, 0xe2, 0x5f, 0x55, 0x56, 0x53, + 0xc7, 0xda, 0x5d, 0xb0, 0xcc, 0x61, 0x08, 0x74, 0x21, 0x95, 0x9b, 0xb1, 0xdf, 0x80, + 0x03, 0xb7, 0x3d, 0xa0, 0xbe, 0xf0, 0x60, 0xf3, 0xa8, 0x4c, 0x8b, 0xc2, 0x4c, 0xc7, + 0x6d, 0x0d, 0x9e, 0x9c, 0x33, 0x76, 0x5c, 0x20, 0xf0, 0x7d, 0x80, 0xe2, 0x0f, 0xdf, + 0x27, 0x81, 0x5d, 0xbd, 0x9d, 0x71, 0x7c, 0x09, 0x66, 0xf8, 0x0b, 0x94, 0xb9, 0x59, + 0x15, 0x08, 0x1e, 0xa4, 0x55, 0x37, 0xa5, 0xa0, 0x74, 0xb9, 0xc9, 0x4b, 0x43, 0xdd, + 0xf4, 0xa9, 0xcb, 0xad, 0xe9, 0x04, 0x51, 0x0e, 0xaa, 0x96, 0x9e, 0x66, 0x6c, 0x94, + 0x34, 0xb9, 0xf6, 0x3e, 0xae, 0x62, 0xad, 0x58, 0x27, 0x99, 0x62, 0xe9, 0x41, 0x33, + 0x05, 0x5c, 0xbc, 0xc4, 0xb1, 0x55, 0xc0, 0x0f, 0x1b, 0x83, 0xff, 0x41, 0x28, 0xa8, + 0xab, 0xb4, 0xce, 0x68, 0xe9, 0xf1, 0xe3, 0x08, 0xe6, 0xf9, 0x7e, 0x51, 0x3a, 0xf5, + 0x95, 0x47, 0x1a, 0x16, 0x77, 0xef, 0x78, 0xe9, 0x77, 0x0f, 0x43, 0xad, 0xde, 0x1a, + 0x64, 0x58, 0x6d, 0xe6, 0xa5, 0x87, 0xc3, 0xd6, 0x93, 0xfe, 0xa8, 0xfc, 0xc6, 0xac, + 0xc8, 0x94, 0x96, 0x1e, 0x2f, 0x47, 0xb2, 0x02, 0xe8, 0x6a, 0x57, 0x38, 0x79, 0xb5, + 0xbf, 0xd7, 0x29, 0xda, 0x2f, 0xbe, 0xfc, 0x64, 0x5c, 0xfa, 0xb1, 0x88, 0x0d, 0x51, + 0x76, 0x40, 0xdf, 0x5f, 0x53, 0xe5, 0x7c, 0x72, 0xd6, 0x5a, 0x63, 0x3a, 0xa5, 0x36, + 0xb2, 0x98, 0x34, 0xbf, 0x28, 0x16, 0xb1, 0xf7, 0x16, 0xbf, 0x43, 0x6d, 0x6b, 0x2b, + 0x6e, 0x47, 0x73, 0x28, 0xc9, 0x58, 0xa6, 0xb8, 0xcf, 0x73, 0xb9, 0x5d, 0x22, 0xf6, + 0x99, 0x3b, 0x3f, 0xc5, 0x25, 0xdb, 0x62, 0x7f, 0x6f, 0x38, 0xd0, 0x77, 0x9a, 0x1d, + 0x39, 0xaf, 0x05, 0xed, 0x74, 0xfd, 0xfe, 0xff, 0x98, 0x7a, 0x95, 0x88, 0xd8, 0x0b, + 0x7e, 0x79, 0x69, 0x4a, 0xe4, 0x55, 0x29, 0x29, 0x88, 0x1c, 0x5b, 0xfe, 0x20, 0x49, + 0x2f, 0xd6, 0xf3, 0x37, 0xca, 0x88, 0xdf, 0xb5, 0x01, 0xe5, 0x45, 0xd2, 0x36, 0x73, + 0xac, 0xac, 0xbc, 0x3d, 0x33, 0x14, 0xa8, 0xbb, 0xf5, 0xec, 0x70, 0xb7, 0x05, 0xcc, + 0x9d, 0x26, 0x57, 0xbd, 0xd5, 0xa7, 0x09, 0x15, 0xbe, 0xf6, 0xd0, 0xf0, 0x39, 0xd3, + 0xeb, 0xa6, 0xbb, 0x71, 0x5b, 0xe5, 0x1e, 0xbf, 0x6e, 0xf6, 0x59, 0xea, 0x32, 0xff, + 0x80, 0xc8, 0x2c, 0x04, 0x21, 0x67, 0x5f, 0xe3, 0x71, 0xef, 0x49, 0xf1, 0xb9, 0xe3, + 0x8f, 0x43, 0x7b, 0x4a, 0x76, 0x55, 0xdc, 0x29, 0x16, 0xaa, 0x30, 0x86, 0xde, 0x6c, + 0x62, 0xa8, 0x2b, 0x36, 0x1c, 0x05, 0x3f, 0xc6, 0x34, 0x54, 0xcc, 0xd0, 0x2c, 0x22, + 0xd4, 0x1f, 0xf5, 0xbb, 0x83, 0x62, 0xde, 0xaa, 0x70, 0x82, 0x5a, 0xd2, 0xf9, 0x93, + 0x63, 0x9f, 0xc4, 0x46, 0x06, 0x9d, 0x78, 0xa6, 0x1d, 0x33, 0x8d, 0xf5, 0x8f, 0x77, + 0x63, 0xe3, 0x55, 0xe6, 0xa9, 0xff, ], ock: [ - 0x9c, 0x10, 0x3d, 0xd5, 0xd6, 0x38, 0x6c, 0xdd, 0x67, 0x69, 0x51, 0xe6, 0x56, 0x4b, - 0x16, 0x6b, 0xc5, 0xc5, 0x72, 0x32, 0xcf, 0xc3, 0x1e, 0x0e, 0x69, 0xce, 0x84, 0xda, - 0xe8, 0x32, 0x76, 0xbe, + 0x8b, 0x0d, 0x29, 0x8e, 0xe8, 0xb4, 0x25, 0x34, 0xa4, 0x2f, 0xb9, 0x63, 0x5b, 0xa7, + 0x58, 0xea, 0x9f, 0x91, 0x8b, 0x83, 0x16, 0xc0, 0xe8, 0x94, 0xa9, 0x08, 0x48, 0x89, + 0x01, 0xd9, 0xfb, 0xa3, ], op: [ 0x8e, 0x66, 0xb7, 0x92, 0xec, 0xb1, 0x56, 0xef, 0x68, 0x5e, 0xe8, 0xea, 0x35, 0xd3, 0x82, 0x75, 0x8b, 0xa4, 0x15, 0x97, 0xa3, 0x3a, 0x93, 0xba, 0xf3, 0x81, 0xd6, 0x3c, - 0x17, 0x5b, 0xa9, 0x8b, 0x01, 0xa3, 0x66, 0x1e, 0xa9, 0xaa, 0xb8, 0xf4, 0x32, 0x53, - 0x42, 0x0e, 0xff, 0xd7, 0xa4, 0x83, 0xc2, 0x79, 0xd4, 0x18, 0x18, 0xbc, 0xb3, 0xee, - 0x91, 0x90, 0x01, 0xf8, 0x66, 0xa8, 0xe9, 0x2c, + 0x17, 0x5b, 0xa9, 0x8b, 0xf9, 0xf7, 0xa0, 0x10, 0x5e, 0xa9, 0xf4, 0x45, 0xfb, 0x7a, + 0x14, 0x49, 0x72, 0x62, 0xc6, 0xe4, 0xd7, 0x32, 0x89, 0x32, 0x7b, 0x8a, 0x2d, 0xf5, + 0xe2, 0x63, 0xf3, 0xe3, 0x99, 0x07, 0xea, 0x0c, ], c_out: [ - 0xdf, 0x6b, 0xb6, 0x2e, 0x3b, 0x64, 0xf7, 0xe9, 0x37, 0xc1, 0xde, 0x38, 0xaa, 0xc5, - 0xe6, 0xb1, 0x61, 0x35, 0xba, 0x2f, 0x9d, 0xbe, 0xed, 0xb0, 0x7a, 0x45, 0xb6, 0xf0, - 0x9d, 0xf3, 0xeb, 0xec, 0xac, 0x04, 0x6c, 0x61, 0x92, 0xfb, 0xe8, 0x95, 0xd2, 0x31, - 0x02, 0x77, 0xb3, 0xe0, 0x3a, 0x90, 0xfd, 0xc8, 0x53, 0x48, 0x4a, 0x01, 0x5c, 0x88, - 0xd6, 0x63, 0x2e, 0x97, 0xba, 0x98, 0xad, 0xca, 0x9e, 0x49, 0xf5, 0x38, 0xc3, 0xa7, - 0xcb, 0x6d, 0x77, 0x23, 0xbd, 0xcc, 0x9c, 0x03, 0xae, 0x88, + 0xf3, 0xbf, 0x90, 0x76, 0xf3, 0xdb, 0x66, 0x32, 0x6d, 0xa6, 0x0c, 0xc7, 0x94, 0x3c, + 0x85, 0x4d, 0x8d, 0xe9, 0x9f, 0x57, 0x53, 0xf7, 0x0c, 0x32, 0xed, 0x01, 0xfb, 0x2e, + 0x84, 0x9c, 0x9d, 0xc7, 0x3f, 0x80, 0xb5, 0xcb, 0xaa, 0xb4, 0x99, 0x2d, 0xd7, 0xe7, + 0x38, 0xb9, 0x61, 0xfd, 0x75, 0x3f, 0x7c, 0x5b, 0x29, 0x24, 0xd1, 0xd9, 0x63, 0x06, + 0x61, 0x33, 0x92, 0x59, 0x28, 0x3e, 0x3a, 0x95, 0x3c, 0x57, 0xdf, 0x3a, 0x48, 0xca, + 0x82, 0x71, 0xfc, 0x5f, 0x26, 0x4d, 0x6f, 0x15, 0xb6, 0xb3, ], }, TestVector { @@ -1768,35 +1775,36 @@ pub(crate) fn test_vectors() -> Vec { 0x7e, 0xed, 0xd2, 0xa7, 0x06, 0x44, 0x07, 0x34, 0x78, 0x41, 0x01, 0xae, 0x2d, 0x8e, 0x87, 0xe5, 0x05, 0xad, ], + // FIXME: used instead of rho, which was possibly modified in zsa1 version nf_old: [ 0x32, 0x91, 0x87, 0x35, 0x66, 0x3f, 0x34, 0xad, 0xa0, 0x22, 0x8a, 0xea, 0x4a, 0xcc, 0x19, 0x2a, 0x12, 0x3f, 0xcf, 0xa0, 0x60, 0x46, 0x89, 0xf9, 0x1a, 0xcb, 0xe9, 0x38, 0x31, 0xe4, 0x8c, 0x0c, ], cmx: [ - 0xde, 0x7b, 0xf1, 0x55, 0x08, 0x29, 0x51, 0x96, 0x0a, 0x10, 0xbb, 0x8b, 0x75, 0x41, - 0x02, 0x43, 0x0f, 0x89, 0xf5, 0x32, 0x67, 0x24, 0x04, 0x36, 0x81, 0xf5, 0x06, 0xf7, - 0x48, 0xe2, 0x6f, 0x07, + 0x6d, 0x29, 0x97, 0xd1, 0xce, 0x0a, 0x94, 0x9a, 0x63, 0x70, 0x0f, 0x46, 0x1b, 0x57, + 0x12, 0xae, 0xeb, 0x43, 0xd4, 0x55, 0x04, 0xe3, 0x5b, 0xda, 0x16, 0x52, 0x97, 0x77, + 0xc7, 0x4d, 0x19, 0x1b, ], esk: [ - 0x1d, 0xb6, 0x79, 0x07, 0x9a, 0xcd, 0xef, 0xe9, 0xfc, 0x1e, 0x59, 0xa1, 0x33, 0xf3, - 0x7b, 0x6d, 0x1f, 0xfb, 0xed, 0x78, 0x8c, 0xce, 0x3b, 0x0c, 0xdd, 0x63, 0xe0, 0x62, - 0x83, 0x05, 0x47, 0x08, + 0x9d, 0xc4, 0xc8, 0xc0, 0x32, 0xd3, 0xbe, 0x66, 0xd2, 0x63, 0x6b, 0xa0, 0x02, 0x0c, + 0x63, 0xf4, 0x26, 0x53, 0x29, 0xff, 0xac, 0x2a, 0xe6, 0x35, 0x57, 0x32, 0x63, 0xf4, + 0x99, 0xbd, 0x4c, 0x13, ], ephemeral_key: [ - 0x18, 0x20, 0x84, 0x5b, 0x2d, 0x90, 0xe5, 0x45, 0x76, 0x0f, 0xca, 0x4d, 0xab, 0x30, - 0xa6, 0x78, 0x3e, 0x03, 0x1c, 0x0e, 0x54, 0x28, 0xcc, 0x22, 0x6f, 0x3f, 0x40, 0x1d, - 0xec, 0x20, 0x0b, 0x11, + 0xe4, 0x76, 0x95, 0x86, 0x30, 0x4a, 0x6a, 0x9b, 0x3a, 0x2a, 0xef, 0x3a, 0xf5, 0x8b, + 0x97, 0xda, 0xc2, 0xcc, 0x4a, 0xeb, 0x38, 0x9f, 0x68, 0xc1, 0x28, 0x87, 0x73, 0x1e, + 0x0e, 0x12, 0xbc, 0x1e, ], shared_secret: [ - 0x79, 0x38, 0x77, 0xa1, 0xae, 0xda, 0xe9, 0xac, 0x6d, 0xa3, 0xd7, 0xe8, 0x02, 0xb5, - 0xbc, 0x77, 0x3c, 0x0d, 0x93, 0x1c, 0x79, 0x6d, 0x17, 0x0c, 0x59, 0x7f, 0x22, 0xba, - 0x6f, 0xcc, 0xa2, 0x06, + 0xf6, 0xba, 0x4b, 0x1f, 0xbe, 0x01, 0xfa, 0x2f, 0x1d, 0xd4, 0x09, 0x3c, 0x5c, 0xc4, + 0x85, 0xa9, 0xbf, 0xd9, 0xef, 0x0f, 0x57, 0x89, 0x49, 0xd6, 0xe1, 0x00, 0xb0, 0x05, + 0x5c, 0xb8, 0xf3, 0x31, ], k_enc: [ - 0x28, 0x20, 0xb9, 0x38, 0xd6, 0xfc, 0xea, 0x99, 0xa7, 0x23, 0x37, 0x50, 0xa0, 0xf0, - 0x9a, 0x32, 0x10, 0xad, 0x91, 0x73, 0x46, 0x16, 0x6a, 0xea, 0xdc, 0x89, 0xbb, 0x50, - 0xf4, 0x54, 0x50, 0xa3, + 0xd3, 0xc2, 0x20, 0x51, 0x00, 0x3e, 0x88, 0x2a, 0x5d, 0xdd, 0xfb, 0x48, 0x23, 0xd6, + 0x77, 0x26, 0x96, 0xa7, 0xe9, 0x9f, 0x26, 0xb1, 0xa6, 0xac, 0xd2, 0x4b, 0xee, 0xd5, + 0xf2, 0x2f, 0x9f, 0xf8, ], p_enc: [ 0x02, 0x81, 0xf2, 0x75, 0x7c, 0x53, 0x2e, 0xd3, 0xb6, 0x2e, 0x89, 0x01, 0x22, 0x92, @@ -1842,68 +1850,68 @@ pub(crate) fn test_vectors() -> Vec { 0x3e, 0xcc, 0xc6, 0x23, ], c_enc: [ - 0xd9, 0x6a, 0xe8, 0x2f, 0xba, 0xff, 0xb9, 0xe4, 0xbd, 0x36, 0x47, 0x57, 0x96, 0x33, - 0xbc, 0x8a, 0x89, 0x66, 0xae, 0x4e, 0x18, 0x85, 0x99, 0xdc, 0x3c, 0xf0, 0x30, 0x41, - 0xd2, 0x64, 0x4f, 0x60, 0x3c, 0xe5, 0x56, 0x2e, 0x7f, 0xa1, 0xd3, 0x83, 0x12, 0x79, - 0xb6, 0x32, 0x60, 0x4d, 0x06, 0x5e, 0xd2, 0x46, 0xad, 0x2d, 0x4f, 0x73, 0xf3, 0xa4, - 0x1b, 0x2a, 0x27, 0x99, 0xe5, 0xba, 0xf8, 0x6e, 0x7d, 0x9f, 0xcc, 0x64, 0xd5, 0x6b, - 0xde, 0x56, 0xcb, 0xb0, 0x01, 0xeb, 0x7c, 0x7c, 0x0c, 0xf1, 0xe2, 0xae, 0xc3, 0xce, - 0xb1, 0x49, 0x2d, 0xdf, 0x4e, 0x35, 0x20, 0x76, 0x1f, 0x70, 0xf6, 0xa9, 0x5c, 0x9e, - 0xde, 0xed, 0x51, 0x43, 0x6d, 0xca, 0xcf, 0x71, 0x1e, 0xb5, 0x53, 0x24, 0xd3, 0xf0, - 0x1d, 0xcc, 0xa0, 0x1b, 0xca, 0x15, 0xba, 0xf2, 0x8f, 0xed, 0x81, 0x4c, 0xc3, 0x3a, - 0x43, 0x6b, 0xbc, 0x08, 0x60, 0x56, 0x78, 0x55, 0xa4, 0x9f, 0x5e, 0xfd, 0x49, 0xea, - 0x78, 0x30, 0xc2, 0xf6, 0x00, 0x61, 0xd8, 0x13, 0xa8, 0x49, 0xb4, 0x40, 0xb1, 0x2e, - 0x8f, 0x31, 0xe2, 0xdc, 0x0c, 0x39, 0x4c, 0xeb, 0x92, 0x4f, 0x0d, 0xc6, 0xd5, 0x7b, - 0xcc, 0x39, 0x1d, 0x4a, 0x5f, 0x56, 0x9f, 0x34, 0x74, 0x6b, 0x9d, 0x92, 0x08, 0x82, - 0x25, 0xb1, 0xaa, 0x3e, 0x90, 0x6f, 0x6d, 0xe4, 0xa7, 0x92, 0x2a, 0xc1, 0x16, 0xac, - 0xb2, 0x78, 0xe8, 0xef, 0xbb, 0xf6, 0xf1, 0xe3, 0xe0, 0x8d, 0x66, 0xb3, 0x4d, 0x6e, - 0xde, 0x34, 0xae, 0x78, 0x40, 0xa8, 0x80, 0x2b, 0x7c, 0x10, 0x0f, 0xa7, 0x98, 0x46, - 0x4d, 0xb5, 0x29, 0x45, 0xdb, 0xbe, 0x35, 0xe7, 0x7a, 0x77, 0x21, 0xb2, 0xe0, 0xf8, - 0xb9, 0xa1, 0x0f, 0x6b, 0xf9, 0xa2, 0x80, 0x8f, 0xa5, 0x85, 0xff, 0x21, 0xb0, 0xa3, - 0xaf, 0xfd, 0x5f, 0x3c, 0xb2, 0x30, 0x63, 0x4e, 0x2e, 0x43, 0xff, 0xde, 0x6d, 0x09, - 0x0a, 0xfc, 0xc6, 0x70, 0x4d, 0x7b, 0x3f, 0xc6, 0x15, 0x44, 0x85, 0x3b, 0xcd, 0xa7, - 0xa1, 0x06, 0xd8, 0x5b, 0xd8, 0xd8, 0x6c, 0x6f, 0x8c, 0xe0, 0x34, 0x01, 0x6e, 0xd9, - 0xa3, 0x69, 0x46, 0xf8, 0x52, 0x8b, 0x6f, 0x1e, 0x1a, 0x19, 0x82, 0xd6, 0x8d, 0x38, - 0x86, 0xe5, 0xea, 0xe6, 0xc1, 0xe3, 0x88, 0xf3, 0xde, 0xad, 0x0d, 0x35, 0x3b, 0x6c, - 0x0c, 0xbf, 0x57, 0xc2, 0xe4, 0x7d, 0x30, 0x72, 0x3e, 0xac, 0x95, 0x7b, 0x4a, 0xec, - 0x82, 0xc8, 0xa1, 0x00, 0x9e, 0x3d, 0x71, 0x96, 0x92, 0xb2, 0xfc, 0xbd, 0xda, 0xae, - 0x62, 0x5a, 0x89, 0x6a, 0x47, 0x29, 0x85, 0xb7, 0x9e, 0xb6, 0x2b, 0x1f, 0xe3, 0x3d, - 0x6e, 0x27, 0xbc, 0x1f, 0x10, 0xe4, 0xfe, 0x5c, 0x06, 0xb2, 0x4c, 0x59, 0x7f, 0x72, - 0x3c, 0x67, 0x13, 0x36, 0x13, 0xae, 0x8e, 0x15, 0x4d, 0x81, 0x69, 0x78, 0xb8, 0xfc, - 0xa6, 0x50, 0xc0, 0x1d, 0x77, 0x1a, 0x62, 0x69, 0x2a, 0x84, 0x82, 0x94, 0x2e, 0x28, - 0xfe, 0xf0, 0x45, 0x19, 0x9e, 0xd1, 0xa6, 0x64, 0x99, 0xeb, 0xa1, 0xee, 0xc1, 0x9a, - 0xc8, 0x4a, 0x12, 0xe4, 0x10, 0x29, 0xd2, 0x2f, 0x21, 0x87, 0x6e, 0xd7, 0x4a, 0x76, - 0xef, 0x39, 0xa0, 0x57, 0xce, 0x0a, 0x15, 0x8e, 0x68, 0x51, 0xec, 0x35, 0x6d, 0x97, - 0x7b, 0x1a, 0xa6, 0x8d, 0xcf, 0x70, 0x88, 0xa9, 0xf0, 0xf9, 0xe4, 0x75, 0xa2, 0xbb, - 0xc1, 0xc4, 0x49, 0x5b, 0x54, 0x6f, 0xff, 0xed, 0xaa, 0x66, 0xc4, 0xf9, 0x51, 0x74, - 0xc6, 0x2f, 0x56, 0x5a, 0x3c, 0xc0, 0xac, 0xaf, 0x85, 0x4a, 0xde, 0xd4, 0xb4, 0x25, - 0xa0, 0xc7, 0xdb, 0xcd, 0x37, 0x42, 0xa7, 0xe0, 0x59, 0x2e, 0x83, 0x73, 0x41, 0xf8, - 0x95, 0x32, 0x90, 0x99, 0xe1, 0x70, 0xb6, 0xff, 0xb1, 0x05, 0xfd, 0xbc, 0x77, 0x29, - 0x8e, 0x8c, 0x0f, 0x5e, 0xeb, 0x9e, 0x99, 0xc6, 0x58, 0x4b, 0xcf, 0xf1, 0x20, 0x20, - 0x9d, 0x69, 0x22, 0xb5, 0x34, 0xbe, 0xc9, 0xfa, 0xc1, 0xd7, 0xd2, 0x74, 0xdb, 0xcb, - 0x4a, 0x12, 0xea, 0x5a, 0x99, 0x21, 0x39, 0x2f, 0x00, 0x96, 0x60, 0x29, 0xff, 0x26, - 0x0e, 0xd2, 0x4c, 0x32, 0x78, 0x58, 0xe0, 0x34, 0x64, 0x0a, 0x8c, 0xfb, 0x28, 0xad, - 0x97, 0xe5, 0x3d, 0x80, 0xe1, 0xc9, + 0x72, 0x29, 0xa0, 0xa5, 0x6a, 0x14, 0x4b, 0x04, 0x2c, 0x1e, 0xad, 0x91, 0x80, 0xac, + 0x54, 0xda, 0xc6, 0xc5, 0x5c, 0xf4, 0xc2, 0x2f, 0xbe, 0x7c, 0xde, 0x99, 0x96, 0x0b, + 0xc6, 0x20, 0xd4, 0xdd, 0x60, 0xe4, 0xbf, 0x18, 0xa0, 0xea, 0x7a, 0xd9, 0x09, 0x3b, + 0xcd, 0x3f, 0xf6, 0xd1, 0x61, 0x1c, 0x56, 0x5f, 0x88, 0xe7, 0x35, 0xef, 0x4c, 0x51, + 0x8c, 0x77, 0xd6, 0x22, 0x28, 0xe1, 0xe4, 0xa1, 0x35, 0xca, 0x6c, 0xb4, 0xed, 0x5a, + 0xbb, 0xdf, 0x3e, 0x81, 0xd0, 0x96, 0x50, 0xa8, 0xfa, 0x9b, 0x5c, 0x3d, 0x05, 0xb6, + 0xda, 0xcf, 0x3c, 0x3d, 0xb3, 0xb3, 0x63, 0xe4, 0x10, 0x57, 0x23, 0x70, 0x0c, 0x69, + 0x13, 0x9f, 0x81, 0xec, 0xc4, 0x8d, 0x88, 0x3d, 0xa0, 0x39, 0xdd, 0xed, 0x5e, 0xf6, + 0x04, 0x0a, 0xb2, 0x12, 0x0e, 0x53, 0x3b, 0x1f, 0xfd, 0x06, 0x74, 0xdb, 0x5b, 0x92, + 0x6e, 0x58, 0x7f, 0x16, 0xe7, 0xe8, 0x96, 0x2b, 0x12, 0x48, 0x35, 0xbd, 0x56, 0xcf, + 0xd8, 0xe7, 0x5b, 0xf6, 0xaa, 0x4d, 0xcd, 0x4d, 0x6f, 0x0b, 0x55, 0x61, 0x71, 0x9c, + 0x80, 0xaa, 0x82, 0xb3, 0xbc, 0xea, 0x16, 0x7a, 0x31, 0xc6, 0x69, 0x87, 0x61, 0xe2, + 0xd2, 0x6c, 0xb5, 0x6d, 0xd3, 0x04, 0x16, 0x72, 0x1c, 0x93, 0x37, 0x32, 0x92, 0x85, + 0x33, 0x58, 0xfa, 0xfe, 0x74, 0x95, 0x55, 0x8d, 0xb9, 0x9e, 0x47, 0xa3, 0xa1, 0x6e, + 0xd2, 0x2c, 0xdb, 0x9d, 0x7d, 0x16, 0xcf, 0xd9, 0xa7, 0xbb, 0x55, 0x9c, 0x72, 0x86, + 0xed, 0x84, 0xf8, 0x89, 0x9c, 0xb0, 0x52, 0x2e, 0x8a, 0x49, 0x7f, 0x3e, 0x14, 0x45, + 0x2b, 0xa8, 0xa9, 0x4a, 0x7f, 0x58, 0xe5, 0xde, 0x37, 0x1d, 0x76, 0xec, 0xc9, 0xef, + 0xe2, 0x0a, 0xe7, 0x9b, 0xee, 0x12, 0xbc, 0xe4, 0xe4, 0xb6, 0xf2, 0x35, 0x35, 0xe5, + 0xc3, 0xc4, 0x3a, 0x4c, 0xa2, 0x07, 0x6f, 0xd6, 0x73, 0xf0, 0x80, 0x6f, 0xa9, 0x85, + 0xc5, 0x88, 0xd1, 0x14, 0xc0, 0x7d, 0x8c, 0xe3, 0xa2, 0x33, 0xe5, 0x4d, 0x77, 0x11, + 0x6c, 0x8a, 0x2a, 0x56, 0xa6, 0x82, 0xe7, 0xa4, 0x85, 0xdf, 0x71, 0xb3, 0x02, 0xa0, + 0x36, 0xdd, 0xab, 0x21, 0x4d, 0xee, 0x77, 0x62, 0x19, 0xcc, 0x24, 0x25, 0x94, 0xf7, + 0x5b, 0x8e, 0xbd, 0x56, 0x6d, 0x74, 0xb1, 0x6c, 0x9e, 0xc0, 0x05, 0x8b, 0xca, 0x28, + 0x81, 0xb7, 0x9b, 0x10, 0xe8, 0xa8, 0x01, 0x08, 0x20, 0x61, 0x8a, 0xc6, 0x52, 0x6c, + 0xf9, 0x4b, 0x13, 0xd9, 0x75, 0x9f, 0x37, 0x33, 0x93, 0x34, 0xe8, 0xb2, 0xc6, 0xbd, + 0xd1, 0xd0, 0xf5, 0xe2, 0x46, 0x3c, 0xff, 0x2b, 0x8d, 0xa6, 0xd2, 0xc6, 0x86, 0xaa, + 0x98, 0x7c, 0xd1, 0xf0, 0x7e, 0x9a, 0xa2, 0x60, 0xdd, 0x04, 0x28, 0xa4, 0xff, 0x78, + 0xaa, 0x8f, 0xda, 0x47, 0x7a, 0xb3, 0x8a, 0xcf, 0xcc, 0xb1, 0x90, 0x91, 0x77, 0xb5, + 0x27, 0xe9, 0x38, 0xf1, 0xf9, 0xdc, 0xf3, 0x1f, 0x4f, 0x40, 0xa9, 0x62, 0x89, 0x51, + 0xfc, 0x2a, 0x7a, 0xbc, 0x04, 0x1e, 0x8c, 0x93, 0x36, 0x08, 0xbb, 0x47, 0xb4, 0x50, + 0xb2, 0x8f, 0xee, 0xe0, 0x41, 0x58, 0xa8, 0x17, 0x4b, 0xff, 0xe4, 0x97, 0x06, 0x02, + 0x48, 0x86, 0x42, 0xc1, 0x9e, 0x61, 0xd4, 0x73, 0xf3, 0xde, 0x0c, 0xb0, 0xb6, 0x4a, + 0x30, 0xd6, 0xf1, 0x46, 0x68, 0xd1, 0xb0, 0x17, 0x77, 0x56, 0x6f, 0xb5, 0xac, 0xc2, + 0xe9, 0x2e, 0x64, 0xd9, 0x75, 0x7f, 0xba, 0x13, 0xc1, 0xee, 0x9c, 0xd0, 0x3a, 0xbe, + 0x98, 0xbd, 0x7e, 0x8a, 0xd7, 0x04, 0x1c, 0x3f, 0xea, 0xe7, 0xc1, 0xa7, 0x24, 0x3a, + 0xe3, 0x61, 0x0a, 0xac, 0x64, 0xfe, 0xc6, 0xc9, 0xfc, 0x94, 0x3d, 0x6a, 0xbc, 0xe9, + 0x10, 0xad, 0xbe, 0x23, 0xb5, 0x46, 0xb4, 0xc2, 0x4a, 0xa9, 0xf2, 0xce, 0x5d, 0x97, + 0x06, 0x2e, 0xe0, 0xd1, 0xcc, 0xc4, 0x8c, 0xfd, 0x1f, 0xdb, 0xa7, 0xfd, 0xac, 0x0b, + 0x04, 0xd1, 0xb3, 0xdc, 0x7a, 0x70, 0x78, 0x1c, 0xdd, 0xa2, 0xa2, 0x70, 0x3d, 0xe0, + 0x03, 0xcd, 0x01, 0x51, 0xec, 0x65, 0xbf, 0x7d, 0x1a, 0xc6, 0x3b, 0xb7, 0x35, 0xbc, + 0x2b, 0xb6, 0x7a, 0xd2, 0xb0, 0x1e, 0xd6, 0xb9, 0xae, 0x2e, 0xbb, 0xd3, 0x7a, 0x8f, + 0x8e, 0xc1, 0xa6, 0x53, 0xa8, 0x7e, ], ock: [ - 0x28, 0xcf, 0x3b, 0xea, 0xc3, 0xbd, 0xe2, 0xe9, 0x63, 0xaa, 0x60, 0x91, 0x3f, 0x10, - 0x5d, 0x25, 0x67, 0xcd, 0xaf, 0xbb, 0x66, 0x09, 0x08, 0x5a, 0x84, 0x3f, 0x75, 0x68, - 0xe4, 0x92, 0xd4, 0x4e, + 0x1b, 0xa4, 0xac, 0xd7, 0x75, 0x10, 0xc4, 0xf0, 0xc7, 0x66, 0xad, 0xf7, 0xc7, 0xdf, + 0x1d, 0x1c, 0x54, 0xd5, 0xbc, 0xe3, 0xd6, 0x0a, 0xf3, 0x5e, 0x8d, 0xd4, 0x8f, 0xdd, + 0x04, 0xa7, 0x8c, 0x0b, ], op: [ 0x55, 0xdb, 0x72, 0x90, 0x07, 0x3b, 0xa0, 0x06, 0x66, 0xe8, 0x7d, 0x25, 0x61, 0xb8, 0x88, 0x3c, 0x66, 0x2c, 0x56, 0x78, 0xff, 0x27, 0x30, 0x2a, 0x82, 0xe2, 0x0a, 0x72, - 0x01, 0x70, 0x89, 0x1a, 0x1d, 0xb6, 0x79, 0x07, 0x9a, 0xcd, 0xef, 0xe9, 0xfc, 0x1e, - 0x59, 0xa1, 0x33, 0xf3, 0x7b, 0x6d, 0x1f, 0xfb, 0xed, 0x78, 0x8c, 0xce, 0x3b, 0x0c, - 0xdd, 0x63, 0xe0, 0x62, 0x83, 0x05, 0x47, 0x08, + 0x01, 0x70, 0x89, 0x1a, 0x9d, 0xc4, 0xc8, 0xc0, 0x32, 0xd3, 0xbe, 0x66, 0xd2, 0x63, + 0x6b, 0xa0, 0x02, 0x0c, 0x63, 0xf4, 0x26, 0x53, 0x29, 0xff, 0xac, 0x2a, 0xe6, 0x35, + 0x57, 0x32, 0x63, 0xf4, 0x99, 0xbd, 0x4c, 0x13, ], c_out: [ - 0x0b, 0x2c, 0xc0, 0xa2, 0x2d, 0x06, 0xfc, 0x36, 0xa0, 0x8a, 0x7d, 0x82, 0x33, 0x8d, - 0x4a, 0xd0, 0x95, 0xa3, 0x93, 0xa1, 0xc2, 0x4a, 0x78, 0x8d, 0x45, 0x24, 0x35, 0x94, - 0x4a, 0xcc, 0xe6, 0x38, 0x1e, 0xcc, 0x69, 0x37, 0xf2, 0xc3, 0x8c, 0x89, 0xa5, 0xf5, - 0x1a, 0xa6, 0x0c, 0xa6, 0x58, 0xfe, 0x71, 0x37, 0x1c, 0x2a, 0x83, 0xf4, 0x96, 0xca, - 0x2e, 0x62, 0x49, 0x79, 0x2e, 0x09, 0xeb, 0x79, 0xea, 0x3a, 0x13, 0x80, 0x32, 0x18, - 0xff, 0x20, 0x88, 0x9d, 0x8c, 0x59, 0xc8, 0x5e, 0x90, 0x99, + 0x43, 0x0d, 0xaa, 0x6b, 0x75, 0x63, 0x22, 0x80, 0xd5, 0xe6, 0xda, 0xcb, 0xd2, 0xa0, + 0xff, 0xe2, 0xaf, 0x98, 0x60, 0xc8, 0x3a, 0x3d, 0x2a, 0x87, 0xf1, 0x79, 0x62, 0x88, + 0xeb, 0xed, 0x64, 0xd0, 0xcd, 0xc4, 0x60, 0xe2, 0xc8, 0x61, 0xc4, 0xf9, 0x38, 0x7d, + 0x92, 0x59, 0xfc, 0x60, 0x01, 0xac, 0xd0, 0xe7, 0x6f, 0x3b, 0x0f, 0xdb, 0x5d, 0xac, + 0x97, 0x4c, 0x26, 0xb5, 0x1b, 0x85, 0x9f, 0xab, 0xe0, 0x2e, 0xab, 0xae, 0x96, 0x8a, + 0xab, 0x2e, 0x5e, 0x61, 0xef, 0xc2, 0xd4, 0x46, 0x2c, 0x1e, ], }, TestVector { @@ -1977,35 +1985,36 @@ pub(crate) fn test_vectors() -> Vec { 0xbd, 0xb9, 0x6f, 0x1c, 0xe0, 0x57, 0xc3, 0x30, 0xd1, 0xcc, 0xba, 0x2f, 0x7d, 0xa8, 0x71, 0x55, 0x00, 0xb5, ], + // FIXME: used instead of rho, which was possibly modified in zsa1 version nf_old: [ 0x3b, 0x37, 0x96, 0x78, 0x0c, 0x0a, 0xec, 0x14, 0xed, 0x28, 0x74, 0xb5, 0x23, 0x06, 0xe1, 0xc3, 0xd5, 0xde, 0x45, 0x93, 0xc6, 0x69, 0xaf, 0x1c, 0xaf, 0x11, 0xbc, 0xb4, 0xd3, 0x5c, 0x60, 0x12, ], cmx: [ - 0x4d, 0xa9, 0xdf, 0xdc, 0x70, 0x8c, 0xe8, 0xa0, 0x77, 0xa0, 0x6e, 0xc0, 0x67, 0x79, - 0x24, 0xcf, 0x37, 0x70, 0xed, 0xc2, 0x07, 0xfd, 0x5e, 0x7d, 0x69, 0x5f, 0x71, 0xb0, - 0x15, 0xbb, 0x03, 0x05, + 0x6a, 0xba, 0x28, 0x10, 0x5b, 0xc0, 0x72, 0xc5, 0x2a, 0xb8, 0xa3, 0x14, 0x79, 0x7f, + 0xf8, 0x66, 0x66, 0xdf, 0xb7, 0xcd, 0x8a, 0x2a, 0xe1, 0x7c, 0x58, 0x5f, 0xb7, 0xb6, + 0x51, 0x5b, 0x97, 0x1c, ], esk: [ - 0xae, 0xec, 0x0d, 0xb9, 0x0e, 0x55, 0x83, 0x3c, 0x8b, 0xaf, 0x52, 0x6d, 0x66, 0x54, - 0xa1, 0x74, 0x5b, 0xa4, 0x4c, 0xad, 0x3c, 0xf9, 0xa6, 0x2c, 0xfb, 0xee, 0x5d, 0xe3, - 0x99, 0xca, 0x31, 0x26, + 0x03, 0xfb, 0x79, 0x43, 0x75, 0x27, 0x5d, 0x23, 0xd1, 0x58, 0xd5, 0x64, 0x6b, 0xc4, + 0x63, 0xa8, 0xb7, 0x38, 0xbc, 0x79, 0x38, 0xf6, 0x0d, 0xfb, 0x15, 0x5b, 0xef, 0x4d, + 0x46, 0x1e, 0xec, 0x29, ], ephemeral_key: [ - 0x2d, 0xa0, 0x59, 0x4c, 0xd8, 0x74, 0x91, 0x46, 0x52, 0x67, 0xe7, 0x2c, 0x61, 0x89, - 0x07, 0x91, 0xfe, 0xb4, 0x25, 0xa2, 0xbb, 0xcd, 0xda, 0xcf, 0xe4, 0x5a, 0x66, 0x62, - 0x2f, 0x49, 0xef, 0x35, + 0x95, 0x9b, 0xea, 0x8e, 0x11, 0x96, 0x8b, 0x0f, 0x34, 0x3c, 0x04, 0xcd, 0x6d, 0x50, + 0x16, 0xfc, 0xd4, 0x33, 0x90, 0x75, 0x36, 0xa2, 0x46, 0xba, 0x1c, 0x5d, 0x3e, 0x88, + 0x97, 0xf3, 0x23, 0x1c, ], shared_secret: [ - 0xe0, 0xb1, 0x52, 0x67, 0xfd, 0x21, 0x08, 0xeb, 0xbd, 0xd4, 0x16, 0x3f, 0x83, 0xad, - 0xef, 0xb6, 0x1c, 0x3e, 0xdf, 0x56, 0x6d, 0x94, 0x6f, 0xa1, 0xc1, 0x5e, 0x96, 0x46, - 0x43, 0xb1, 0x9c, 0x8e, + 0xe2, 0x69, 0x19, 0xb4, 0x0c, 0x70, 0xaf, 0x74, 0x1d, 0xf9, 0x04, 0x51, 0x72, 0x55, + 0x03, 0x58, 0x89, 0xee, 0x5a, 0x44, 0x42, 0x6d, 0x6a, 0xb8, 0x5c, 0x07, 0x4b, 0x86, + 0x2b, 0xa0, 0x63, 0x08, ], k_enc: [ - 0x28, 0x48, 0xae, 0x53, 0xaa, 0xce, 0xbe, 0x7c, 0xab, 0x58, 0x73, 0x1d, 0xc2, 0x21, - 0x88, 0x1b, 0x60, 0x2c, 0xc5, 0xa5, 0x3b, 0xcc, 0x1f, 0x76, 0xc8, 0x20, 0xb0, 0xea, - 0x13, 0x55, 0x68, 0x8e, + 0x09, 0xda, 0xc6, 0x51, 0x1c, 0x38, 0x44, 0x58, 0x7f, 0x82, 0x9c, 0x2f, 0x1e, 0xa0, + 0x37, 0xa8, 0x1a, 0x8d, 0x54, 0x85, 0xed, 0x04, 0xea, 0xf2, 0x75, 0x80, 0x05, 0xb3, + 0x2a, 0x20, 0x47, 0x0b, ], p_enc: [ 0x02, 0xdd, 0xb7, 0xc5, 0xbc, 0x4d, 0xe9, 0xdf, 0x52, 0x1b, 0xb0, 0x4b, 0xad, 0x95, @@ -2051,68 +2060,68 @@ pub(crate) fn test_vectors() -> Vec { 0xf5, 0xc6, 0x38, 0xbf, ], c_enc: [ - 0xf1, 0x42, 0xc4, 0xe5, 0x0e, 0xef, 0x2c, 0x64, 0x44, 0xcc, 0xd4, 0x0b, 0x8c, 0x99, - 0xe5, 0x6a, 0x72, 0xec, 0x4e, 0x30, 0xcf, 0x73, 0x68, 0x75, 0xf0, 0xaa, 0x6b, 0x8e, - 0x6d, 0x9c, 0xc3, 0x67, 0x73, 0x2d, 0xbc, 0x9a, 0xf0, 0xb3, 0x7d, 0x1f, 0xca, 0x6d, - 0x5b, 0xdd, 0x1d, 0xc1, 0x23, 0x79, 0x29, 0x66, 0x99, 0x9d, 0x62, 0xea, 0xf8, 0xc5, - 0xfe, 0x8d, 0x99, 0x91, 0x84, 0xf2, 0x8b, 0x99, 0xec, 0xef, 0xcc, 0x8f, 0x14, 0x8d, - 0xbd, 0x52, 0x02, 0x6f, 0xdb, 0x48, 0xdf, 0xda, 0x7b, 0xad, 0xb6, 0xd1, 0xfc, 0xd2, - 0x9a, 0xd2, 0x19, 0xea, 0xbf, 0xbb, 0x44, 0x3f, 0x5d, 0x0f, 0x98, 0xb6, 0x6a, 0x3a, - 0x25, 0x73, 0x1b, 0x52, 0xd7, 0xf2, 0xdf, 0x70, 0x01, 0x4b, 0x4a, 0xc6, 0x99, 0x34, - 0x32, 0xf8, 0x98, 0x1e, 0x9c, 0xbf, 0xe1, 0x69, 0x13, 0xf6, 0x8a, 0x93, 0x5d, 0x2d, - 0xd0, 0x06, 0xd4, 0x28, 0xf1, 0x45, 0x53, 0xe7, 0x29, 0x86, 0xc7, 0x0f, 0xb4, 0x43, - 0x18, 0xd2, 0x7c, 0x4d, 0x6f, 0x6f, 0xd3, 0x92, 0x3a, 0xb0, 0xf6, 0x28, 0x9a, 0x02, - 0x48, 0x5e, 0x87, 0x17, 0xe5, 0x7d, 0xa0, 0x24, 0xeb, 0xe1, 0x6e, 0x9c, 0xf8, 0x35, - 0xcf, 0x53, 0xd2, 0x19, 0x4f, 0xd4, 0x25, 0x50, 0x06, 0xb8, 0x1b, 0xfd, 0x51, 0xd1, - 0xef, 0x5a, 0xe9, 0xf9, 0xef, 0x6a, 0xf6, 0x57, 0x41, 0x81, 0xe2, 0xe2, 0x26, 0x50, - 0xcb, 0x91, 0x2a, 0x6b, 0x89, 0x88, 0xa0, 0x28, 0x86, 0x32, 0xbc, 0x73, 0x62, 0xbb, - 0xe1, 0x87, 0x23, 0xd8, 0x27, 0xf7, 0x94, 0x58, 0x62, 0x26, 0x0d, 0xf7, 0x8e, 0x95, - 0xd7, 0xd5, 0xe3, 0x31, 0x3f, 0x5a, 0xff, 0x72, 0xe2, 0x1c, 0xe2, 0xdf, 0x00, 0xee, - 0x7e, 0x81, 0x5a, 0xba, 0x17, 0xcc, 0xde, 0x15, 0xc2, 0x7e, 0xee, 0x08, 0x5f, 0x52, - 0xf3, 0x6c, 0x02, 0xec, 0xd6, 0x6c, 0xe1, 0x8b, 0x40, 0x15, 0xbe, 0xb6, 0x09, 0x23, - 0x3f, 0x6e, 0xb2, 0x8e, 0x4a, 0xd5, 0xcd, 0xbe, 0x6f, 0xdc, 0xab, 0x68, 0xbf, 0xbb, - 0x6f, 0xfd, 0x87, 0xd3, 0x86, 0xd8, 0x7e, 0xb1, 0xfe, 0x00, 0x34, 0x27, 0x0f, 0x41, - 0x27, 0x1e, 0xa0, 0x1f, 0x9e, 0xae, 0xa9, 0xe8, 0x9f, 0x78, 0x35, 0x9e, 0x41, 0x73, - 0x94, 0xbb, 0x9d, 0xf5, 0xb6, 0x1c, 0x36, 0xe3, 0x0b, 0xc1, 0xce, 0x4a, 0xb1, 0xbd, - 0xd7, 0x9f, 0xa4, 0x08, 0x3e, 0x82, 0x8d, 0xd1, 0x04, 0xe4, 0x73, 0x80, 0xcd, 0x83, - 0xcd, 0x65, 0x9d, 0xf4, 0x4d, 0xb9, 0x43, 0xdc, 0x07, 0xbc, 0xc8, 0x07, 0x05, 0x04, - 0xa1, 0xc6, 0x55, 0x23, 0x02, 0xe7, 0x4b, 0xe4, 0xb9, 0xc4, 0x32, 0x75, 0xec, 0xc2, - 0x88, 0xce, 0xda, 0x41, 0x59, 0xa9, 0xcc, 0x55, 0x7c, 0x18, 0x19, 0x5c, 0xec, 0x92, - 0x62, 0x24, 0xd8, 0xd6, 0x9e, 0x98, 0xe1, 0x83, 0x5a, 0x2e, 0x29, 0x05, 0x63, 0xef, - 0x20, 0xd0, 0x83, 0xd1, 0x4e, 0x93, 0xcc, 0x1f, 0x3f, 0x76, 0x3e, 0xf5, 0x58, 0x0e, - 0x13, 0x5f, 0xae, 0x1b, 0xb8, 0x54, 0x4a, 0x0c, 0x5c, 0x6d, 0x88, 0x17, 0x41, 0xe4, - 0x51, 0x34, 0x47, 0xac, 0xeb, 0x09, 0x33, 0xe6, 0xeb, 0xaf, 0x0c, 0xe3, 0x13, 0xc1, - 0x8c, 0x9a, 0xf9, 0x5b, 0xa5, 0x61, 0x31, 0xf7, 0x8f, 0x42, 0x72, 0x41, 0x22, 0x65, - 0xbc, 0xf4, 0xc5, 0xf6, 0x80, 0x89, 0x3c, 0xcd, 0xa5, 0x73, 0x7d, 0xa8, 0x23, 0xb7, - 0x63, 0x6e, 0x98, 0xdb, 0xa5, 0x62, 0x44, 0xf2, 0xb9, 0x6a, 0x10, 0x90, 0xa6, 0x60, - 0x38, 0x15, 0xc0, 0xef, 0x54, 0x97, 0x50, 0xf2, 0x47, 0x06, 0x19, 0x0b, 0x55, 0x76, - 0x6e, 0x8a, 0x62, 0x09, 0xa1, 0xc2, 0x2f, 0x67, 0xe8, 0x77, 0x62, 0x66, 0xb6, 0xfa, - 0xe4, 0x5b, 0xf7, 0x94, 0x90, 0x7f, 0x64, 0x71, 0x4f, 0xbe, 0x26, 0xc3, 0x0a, 0xc4, - 0x04, 0x11, 0xf5, 0xe6, 0x4f, 0xc1, 0x66, 0xc8, 0x4f, 0x28, 0xb8, 0x23, 0xfd, 0xaa, - 0x68, 0x32, 0xa3, 0x25, 0x63, 0x31, 0x7d, 0x25, 0x4c, 0x53, 0x16, 0x9b, 0x9f, 0xfb, - 0x24, 0x53, 0xa1, 0x12, 0x2f, 0xa4, 0x4c, 0x7f, 0x17, 0xc1, 0x36, 0xb5, 0x7e, 0x20, - 0xad, 0x17, 0x7a, 0x7e, 0xee, 0xbf, 0x9f, 0x56, 0xfb, 0x0b, 0x55, 0xcc, 0xcf, 0x68, - 0x2b, 0x8a, 0x5b, 0xd8, 0xa7, 0x45, + 0x7b, 0x59, 0x87, 0x78, 0xa7, 0x28, 0x4d, 0x52, 0xa7, 0x47, 0x77, 0x4c, 0x54, 0xbd, + 0x92, 0x57, 0xb3, 0xf1, 0x7a, 0xf1, 0x3e, 0xcc, 0x72, 0xc0, 0xe3, 0xcd, 0x95, 0xeb, + 0xfa, 0xfa, 0xa3, 0x7d, 0x16, 0x65, 0x15, 0x53, 0xdd, 0x27, 0xf0, 0x1c, 0x9c, 0xf2, + 0x4b, 0x62, 0xd7, 0xdc, 0xfd, 0x52, 0xfa, 0x4b, 0x2b, 0x3b, 0x4a, 0x8c, 0xa9, 0xeb, + 0xfc, 0xe7, 0xf4, 0xfc, 0xec, 0x27, 0xe6, 0x05, 0x8e, 0x44, 0x68, 0xc1, 0x50, 0x10, + 0xd0, 0x17, 0xcb, 0x90, 0x1a, 0xbf, 0xb2, 0x2e, 0xad, 0x86, 0x99, 0x83, 0xf6, 0x9a, + 0xed, 0xf2, 0xda, 0x7d, 0x6a, 0xaf, 0xd1, 0x30, 0x6e, 0xe7, 0x36, 0xf2, 0xdb, 0x33, + 0xbc, 0xe4, 0xb0, 0x9f, 0xca, 0x74, 0x69, 0x2a, 0x52, 0x09, 0xa7, 0x39, 0x2b, 0x7e, + 0xa9, 0x68, 0x5b, 0xe9, 0xec, 0x43, 0x1f, 0xfe, 0x50, 0xf7, 0x0f, 0x90, 0x22, 0x74, + 0x05, 0x03, 0x45, 0x2a, 0xb5, 0x14, 0x92, 0xb1, 0xf7, 0x47, 0x7e, 0xda, 0x42, 0x7b, + 0x42, 0x3a, 0x93, 0x1b, 0x26, 0x38, 0x6c, 0x56, 0xe4, 0x27, 0x86, 0x3d, 0x46, 0xb1, + 0x99, 0xff, 0xa0, 0x8c, 0x52, 0x9f, 0xa5, 0x72, 0x1f, 0x68, 0xe9, 0x14, 0xf6, 0xea, + 0x6a, 0x8a, 0xe6, 0xae, 0xcb, 0xf7, 0x37, 0x47, 0x1e, 0xbd, 0x83, 0xdb, 0xa9, 0xa7, + 0xcd, 0x89, 0x75, 0x66, 0x20, 0x4e, 0x2b, 0xae, 0x63, 0xe3, 0x4e, 0x70, 0x32, 0x51, + 0x02, 0x96, 0x92, 0x0d, 0x7e, 0x7a, 0x7c, 0xcf, 0x0f, 0xeb, 0xe7, 0xa8, 0x33, 0x69, + 0x6a, 0x4b, 0x67, 0x41, 0x88, 0x5e, 0x9b, 0x94, 0x0c, 0x61, 0xdd, 0x8d, 0x44, 0x38, + 0x54, 0x74, 0x15, 0x31, 0x0b, 0x15, 0xcf, 0x18, 0xdc, 0x19, 0x90, 0x07, 0x8c, 0x70, + 0x8b, 0xea, 0xc3, 0x32, 0xa8, 0xe0, 0x81, 0x46, 0xa6, 0x95, 0x8e, 0xa6, 0xf4, 0x3f, + 0xd0, 0xc2, 0xc8, 0xe9, 0x99, 0xaa, 0x4f, 0xdf, 0x1e, 0x77, 0xef, 0xde, 0x54, 0xfd, + 0x65, 0xc6, 0x7a, 0x3f, 0x07, 0xda, 0xf5, 0xf6, 0x04, 0x49, 0x60, 0xa0, 0xb6, 0xdd, + 0x84, 0x1f, 0xf8, 0xb8, 0xa5, 0x92, 0xc7, 0xb1, 0x09, 0x34, 0x2c, 0x73, 0x5c, 0x2a, + 0x0e, 0x37, 0xb3, 0x0b, 0x8b, 0xaa, 0x5c, 0x77, 0x01, 0xeb, 0xc7, 0xa8, 0xf8, 0x20, + 0xc0, 0x22, 0x7c, 0xa5, 0x00, 0x3f, 0x36, 0xee, 0x68, 0xf7, 0xb2, 0x89, 0x81, 0xc2, + 0x73, 0x32, 0x03, 0x9d, 0xd6, 0xa4, 0x94, 0xf0, 0xcd, 0x02, 0xbd, 0xd2, 0x8f, 0x68, + 0x3e, 0xca, 0x1b, 0x03, 0x2a, 0xfc, 0x09, 0xdd, 0x0c, 0xd8, 0x56, 0xcb, 0xc1, 0xa3, + 0x5e, 0x74, 0xd4, 0x0c, 0x24, 0x53, 0xdf, 0xe2, 0x42, 0xc8, 0x6a, 0x7a, 0x60, 0xbc, + 0xbd, 0xdb, 0x17, 0x96, 0x6c, 0x7d, 0xba, 0x76, 0x9e, 0xab, 0xd1, 0xc1, 0x67, 0xb7, + 0xe8, 0x19, 0x78, 0xf9, 0x12, 0x8b, 0xac, 0x26, 0xa2, 0x8d, 0x77, 0x21, 0x30, 0x79, + 0xcb, 0x56, 0xc0, 0x95, 0xa7, 0xc0, 0x60, 0xde, 0x0e, 0x77, 0x5c, 0xa8, 0xac, 0x8e, + 0x6c, 0xa9, 0x4d, 0x19, 0xc6, 0x16, 0x2e, 0x44, 0xf7, 0xa8, 0xf0, 0x14, 0x9d, 0x31, + 0xd3, 0x46, 0x3d, 0x01, 0xb6, 0x1a, 0x14, 0x63, 0xa9, 0xde, 0x3d, 0x8a, 0xb7, 0x40, + 0x04, 0x0a, 0x76, 0xe0, 0x5b, 0x37, 0x64, 0x28, 0x86, 0x29, 0x87, 0x59, 0x5b, 0x87, + 0xce, 0xa6, 0x94, 0xfe, 0x92, 0x0a, 0x06, 0x7e, 0x81, 0x6b, 0x4f, 0x29, 0xa3, 0xa2, + 0x24, 0x50, 0x14, 0x0f, 0x13, 0x5d, 0x71, 0x9a, 0x97, 0x1b, 0x81, 0xfc, 0x19, 0x16, + 0x98, 0x0a, 0x55, 0xdd, 0xf8, 0xd9, 0x87, 0x30, 0x57, 0x36, 0x35, 0xa0, 0x70, 0x85, + 0xc4, 0xe7, 0x7c, 0x7e, 0x1c, 0xdb, 0xb6, 0x85, 0x42, 0x6e, 0xe4, 0x62, 0xcc, 0x30, + 0x83, 0xa3, 0xf5, 0xa3, 0xb9, 0x17, 0xc0, 0x6f, 0x9a, 0x96, 0xf9, 0xf7, 0xbd, 0x81, + 0xac, 0xa4, 0x9b, 0xef, 0x95, 0xb9, 0x28, 0x06, 0xc4, 0x2d, 0x09, 0x12, 0x01, 0x31, + 0x42, 0xb2, 0x2a, 0x7b, 0xad, 0x72, 0x12, 0x11, 0x46, 0x91, 0xf1, 0xdc, 0x72, 0x64, + 0xc6, 0x7e, 0x76, 0x34, 0xf5, 0xd7, 0x95, 0xc9, 0x75, 0x30, 0x62, 0xe3, 0x06, 0xc0, + 0x6b, 0xc1, 0x03, 0xaa, 0x01, 0xc1, 0x0d, 0x1f, 0x5d, 0xd4, 0xcd, 0x59, 0xf6, 0x53, + 0x2c, 0xb7, 0x23, 0xe3, 0xa0, 0x26, ], ock: [ - 0x06, 0x3c, 0x83, 0xa4, 0x95, 0x74, 0xe7, 0x80, 0x35, 0x89, 0xcc, 0x3d, 0x34, 0xb4, - 0x38, 0x90, 0xf3, 0xd7, 0x63, 0x87, 0x35, 0xe7, 0xbd, 0x5e, 0xbd, 0xd1, 0xa5, 0xea, - 0xb9, 0xd9, 0xc5, 0xd6, + 0x4a, 0x25, 0x25, 0x4c, 0xcc, 0x44, 0x4e, 0xc6, 0x1c, 0x2b, 0xac, 0xeb, 0x2e, 0xe3, + 0x97, 0x7a, 0x63, 0x32, 0x44, 0x9a, 0x3a, 0x53, 0xad, 0xd2, 0x31, 0xab, 0xf3, 0xd1, + 0x8b, 0xb3, 0x29, 0x3d, ], op: [ 0x65, 0x3d, 0x07, 0xc9, 0x07, 0x94, 0x6a, 0xc3, 0x02, 0x0e, 0xbd, 0xe1, 0xb4, 0xf6, 0x10, 0x21, 0x0c, 0x30, 0xc4, 0x50, 0xe4, 0x27, 0x12, 0x65, 0xa0, 0x5d, 0x6e, 0xce, - 0x44, 0x6d, 0xf4, 0x39, 0xae, 0xec, 0x0d, 0xb9, 0x0e, 0x55, 0x83, 0x3c, 0x8b, 0xaf, - 0x52, 0x6d, 0x66, 0x54, 0xa1, 0x74, 0x5b, 0xa4, 0x4c, 0xad, 0x3c, 0xf9, 0xa6, 0x2c, - 0xfb, 0xee, 0x5d, 0xe3, 0x99, 0xca, 0x31, 0x26, + 0x44, 0x6d, 0xf4, 0x39, 0x03, 0xfb, 0x79, 0x43, 0x75, 0x27, 0x5d, 0x23, 0xd1, 0x58, + 0xd5, 0x64, 0x6b, 0xc4, 0x63, 0xa8, 0xb7, 0x38, 0xbc, 0x79, 0x38, 0xf6, 0x0d, 0xfb, + 0x15, 0x5b, 0xef, 0x4d, 0x46, 0x1e, 0xec, 0x29, ], c_out: [ - 0xca, 0xb7, 0x8d, 0xd1, 0x83, 0xf3, 0xe1, 0x6a, 0xf7, 0x6e, 0x9a, 0x90, 0x3d, 0xd4, - 0x2a, 0x96, 0x67, 0xbf, 0xe7, 0x08, 0xce, 0x88, 0x79, 0xb8, 0x38, 0x6e, 0x62, 0xac, - 0x9f, 0x66, 0x74, 0xf4, 0x93, 0x59, 0x5d, 0xa5, 0x06, 0xe9, 0xef, 0x06, 0xbb, 0xa2, - 0x4a, 0x93, 0x80, 0x60, 0xe5, 0xd3, 0x82, 0xcc, 0x75, 0xdf, 0xab, 0x97, 0xe0, 0xf8, - 0x49, 0x4b, 0x47, 0x6a, 0xdf, 0x4f, 0xfd, 0x96, 0xff, 0x7f, 0x1b, 0x4f, 0x16, 0xf8, - 0x59, 0x4b, 0x7c, 0x5a, 0x21, 0x9c, 0x7a, 0x00, 0xad, 0x15, + 0x7b, 0xf4, 0x12, 0x7d, 0x22, 0xcc, 0x57, 0x35, 0x87, 0x51, 0x2f, 0xf8, 0x1e, 0x55, + 0x3e, 0x3c, 0x98, 0x23, 0x5f, 0x51, 0xc7, 0x23, 0x7e, 0x9e, 0x76, 0x1a, 0x08, 0xf2, + 0xe1, 0xe8, 0x0d, 0x04, 0x26, 0x98, 0xfc, 0x3b, 0x1d, 0x03, 0x18, 0xf1, 0xfd, 0xca, + 0x8e, 0x41, 0xa3, 0x16, 0xd6, 0xaf, 0x3a, 0xc0, 0xc4, 0x0c, 0xe1, 0x99, 0x47, 0xa2, + 0xba, 0xfe, 0x80, 0x4d, 0x46, 0x6e, 0xd0, 0x79, 0x82, 0x7f, 0xc1, 0x41, 0x91, 0xeb, + 0xb5, 0x99, 0x17, 0x87, 0x49, 0xe9, 0xc4, 0x06, 0xaf, 0x26, ], }, ] diff --git a/src/test_vectors/note_encryption_v3.rs b/src/test_vectors/note_encryption_v3.rs new file mode 100644 index 000000000..79b514869 --- /dev/null +++ b/src/test_vectors/note_encryption_v3.rs @@ -0,0 +1,4389 @@ +// From https://github.com/zcash-hackworks/zcash-test-vectors/ (orchard_note_encryption) + +pub(crate) struct TestVector { + pub(crate) incoming_viewing_key: [u8; 64], + pub(crate) ovk: [u8; 32], + pub(crate) default_d: [u8; 11], + pub(crate) default_pk_d: [u8; 32], + pub(crate) v: u64, + pub(crate) rseed: [u8; 32], + pub(crate) asset: [u8; 32], + pub(crate) memo: [u8; 512], + pub(crate) cv_net: [u8; 32], + pub(crate) rho: [u8; 32], + pub(crate) cmx: [u8; 32], + pub(crate) esk: [u8; 32], + pub(crate) ephemeral_key: [u8; 32], + pub(crate) shared_secret: [u8; 32], + pub(crate) k_enc: [u8; 32], + pub(crate) p_enc: [u8; 596], + pub(crate) c_enc: [u8; 612], + pub(crate) ock: [u8; 32], + pub(crate) op: [u8; 64], + pub(crate) c_out: [u8; 80], +} + +pub(crate) fn test_vectors() -> Vec { + vec![ + TestVector { + incoming_viewing_key: [ + 0x10, 0x39, 0xd8, 0xe6, 0x4a, 0x80, 0x90, 0x2e, 0x10, 0x59, 0x47, 0x81, 0x7d, 0xf3, + 0xbd, 0xfb, 0x7d, 0xf7, 0x03, 0x0e, 0x68, 0x73, 0x9f, 0x9c, 0x53, 0x3a, 0x36, 0xbf, + 0x5a, 0x6a, 0x80, 0x72, 0x43, 0x10, 0x6d, 0xe9, 0xa7, 0xec, 0x54, 0xdd, 0x36, 0xdf, + 0xa7, 0x0b, 0xdb, 0xd9, 0x07, 0x2d, 0xbd, 0xda, 0xb5, 0xe0, 0x66, 0xaa, 0xef, 0xfc, + 0xf9, 0xbb, 0xa3, 0x20, 0xd4, 0xff, 0xf7, 0x12, + ], + ovk: [ + 0x5d, 0x7a, 0x8f, 0x73, 0x9a, 0x2d, 0x9e, 0x94, 0x5b, 0x0c, 0xe1, 0x52, 0xa8, 0x04, + 0x9e, 0x29, 0x4c, 0x4d, 0x6e, 0x66, 0xb1, 0x64, 0x93, 0x9d, 0xaf, 0xfa, 0x2e, 0xf6, + 0xee, 0x69, 0x21, 0x48, + ], + default_d: [ + 0x56, 0xe8, 0x4b, 0x1a, 0xdc, 0x94, 0x23, 0xc3, 0x67, 0x6c, 0x04, + ], + default_pk_d: [ + 0x63, 0xf7, 0x12, 0x5d, 0xf4, 0x83, 0x6f, 0xd2, 0x81, 0x6b, 0x02, 0x4e, 0xe7, 0x0e, + 0xfe, 0x09, 0xfb, 0x9a, 0x7b, 0x38, 0x63, 0xc6, 0xea, 0xcd, 0xf9, 0x5e, 0x03, 0x89, + 0x49, 0x50, 0x69, 0x2c, + ], + v: 8567075990963576717, + rseed: [ + 0xbf, 0x69, 0xb8, 0x25, 0x0c, 0x18, 0xef, 0x41, 0x29, 0x4c, 0xa9, 0x79, 0x93, 0xdb, + 0x54, 0x6c, 0x1f, 0xe0, 0x1f, 0x7e, 0x9c, 0x8e, 0x36, 0xd6, 0xa5, 0xe2, 0x9d, 0x4e, + 0x30, 0xa7, 0x35, 0x94, + ], + asset: [ + 0x67, 0x43, 0xf9, 0x3a, 0x6e, 0xbd, 0xa7, 0x2a, 0x8c, 0x7c, 0x5a, 0x2b, 0x7f, 0xa3, + 0x04, 0xfe, 0x32, 0xb2, 0x9b, 0x4f, 0x70, 0x6a, 0xa8, 0xf7, 0x42, 0x0f, 0x3d, 0x8e, + 0x7a, 0x59, 0x70, 0x2f, + ], + memo: [ + 0xff, 0xbf, 0x50, 0x98, 0x42, 0x1c, 0x69, 0x37, 0x8a, 0xf1, 0xe4, 0x0f, 0x64, 0xe1, + 0x25, 0x94, 0x6f, 0x62, 0xc2, 0xfa, 0x7b, 0x2f, 0xec, 0xbc, 0xb6, 0x4b, 0x69, 0x68, + 0x91, 0x2a, 0x63, 0x81, 0xce, 0x3d, 0xc1, 0x66, 0xd5, 0x6a, 0x1d, 0x62, 0xf5, 0xa8, + 0xd7, 0x55, 0x1d, 0xb5, 0xfd, 0x93, 0x13, 0xe8, 0xc7, 0x20, 0x3d, 0x99, 0x6a, 0xf7, + 0xd4, 0x77, 0x08, 0x37, 0x56, 0xd5, 0x9a, 0xf8, 0x0d, 0x06, 0xa7, 0x45, 0xf4, 0x4a, + 0xb0, 0x23, 0x75, 0x2c, 0xb5, 0xb4, 0x06, 0xed, 0x89, 0x85, 0xe1, 0x81, 0x30, 0xab, + 0x33, 0x36, 0x26, 0x97, 0xb0, 0xe4, 0xe4, 0xc7, 0x63, 0xcc, 0xb8, 0xf6, 0x76, 0x49, + 0x5c, 0x22, 0x2f, 0x7f, 0xba, 0x1e, 0x31, 0xde, 0xfa, 0x3d, 0x5a, 0x57, 0xef, 0xc2, + 0xe1, 0xe9, 0xb0, 0x1a, 0x03, 0x55, 0x87, 0xd5, 0xfb, 0x1a, 0x38, 0xe0, 0x1d, 0x94, + 0x90, 0x3d, 0x3c, 0x3e, 0x0a, 0xd3, 0x36, 0x0c, 0x1d, 0x37, 0x10, 0xac, 0xd2, 0x0b, + 0x18, 0x3e, 0x31, 0xd4, 0x9f, 0x25, 0xc9, 0xa1, 0x38, 0xf4, 0x9b, 0x1a, 0x53, 0x7e, + 0xdc, 0xf0, 0x4b, 0xe3, 0x4a, 0x98, 0x51, 0xa7, 0xaf, 0x9d, 0xb6, 0x99, 0x0e, 0xd8, + 0x3d, 0xd6, 0x4a, 0xf3, 0x59, 0x7c, 0x04, 0x32, 0x3e, 0xa5, 0x1b, 0x00, 0x52, 0xad, + 0x80, 0x84, 0xa8, 0xb9, 0xda, 0x94, 0x8d, 0x32, 0x0d, 0xad, 0xd6, 0x4f, 0x54, 0x31, + 0xe6, 0x1d, 0xdf, 0x65, 0x8d, 0x24, 0xae, 0x67, 0xc2, 0x2c, 0x8d, 0x13, 0x09, 0x13, + 0x1f, 0xc0, 0x0f, 0xe7, 0xf2, 0x35, 0x73, 0x42, 0x76, 0xd3, 0x8d, 0x47, 0xf1, 0xe1, + 0x91, 0xe0, 0x0c, 0x7a, 0x1d, 0x48, 0xaf, 0x04, 0x68, 0x27, 0x59, 0x1e, 0x97, 0x33, + 0xa9, 0x7f, 0xa6, 0xb6, 0x79, 0xf3, 0xdc, 0x60, 0x1d, 0x00, 0x82, 0x85, 0xed, 0xcb, + 0xda, 0xe6, 0x9c, 0xe8, 0xfc, 0x1b, 0xe4, 0xaa, 0xc0, 0x0f, 0xf2, 0x71, 0x1e, 0xbd, + 0x93, 0x1d, 0xe5, 0x18, 0x85, 0x68, 0x78, 0xf7, 0x34, 0x76, 0xf2, 0x1a, 0x48, 0x2e, + 0xc9, 0x37, 0x83, 0x65, 0xc8, 0xf7, 0x39, 0x3c, 0x94, 0xe2, 0x88, 0x53, 0x15, 0xeb, + 0x46, 0x71, 0x09, 0x8b, 0x79, 0x53, 0x5e, 0x79, 0x0f, 0xe5, 0x3e, 0x29, 0xfe, 0xf2, + 0xb3, 0x76, 0x66, 0x97, 0xac, 0x32, 0xb4, 0xf4, 0x73, 0xf4, 0x68, 0xa0, 0x08, 0xe7, + 0x23, 0x89, 0xfc, 0x03, 0x88, 0x0d, 0x78, 0x0c, 0xb0, 0x7f, 0xcf, 0xaa, 0xbe, 0x3f, + 0x1a, 0x84, 0xb2, 0x7d, 0xb5, 0x9a, 0x4a, 0x15, 0x3d, 0x88, 0x2d, 0x2b, 0x21, 0x03, + 0x59, 0x65, 0x55, 0xed, 0x94, 0x94, 0xc6, 0xac, 0x89, 0x3c, 0x49, 0x72, 0x38, 0x33, + 0xec, 0x89, 0x26, 0xc1, 0x03, 0x95, 0x86, 0xa7, 0xaf, 0xcf, 0x4a, 0x0d, 0x9c, 0x73, + 0x1e, 0x98, 0x5d, 0x99, 0x58, 0x9c, 0x8b, 0xb8, 0x38, 0xe8, 0xaa, 0xf7, 0x45, 0x53, + 0x3e, 0xd9, 0xe8, 0xae, 0x3a, 0x1c, 0xd0, 0x74, 0xa5, 0x1a, 0x20, 0xda, 0x8a, 0xba, + 0x18, 0xd1, 0xdb, 0xeb, 0xbc, 0x86, 0x2d, 0xed, 0x42, 0x43, 0x5e, 0x92, 0x47, 0x69, + 0x30, 0xd0, 0x69, 0x89, 0x6c, 0xff, 0x30, 0xeb, 0x41, 0x4f, 0x72, 0x7b, 0x89, 0xe0, + 0x01, 0xaf, 0xa2, 0xfb, 0x8d, 0xc3, 0x43, 0x6d, 0x75, 0xa4, 0xa6, 0xf2, 0x65, 0x72, + 0x50, 0x4b, 0x19, 0x22, 0x32, 0xec, 0xb9, 0xf0, 0xc0, 0x24, 0x11, 0xe5, 0x25, 0x96, + 0xbc, 0x5e, 0x90, 0x45, 0x7e, 0x74, 0x59, 0x39, 0xff, 0xed, 0xbd, 0x12, 0x86, 0x3c, + 0xe7, 0x1a, 0x02, 0xaf, 0x11, 0x7d, 0x41, 0x7a, 0xdb, 0x3d, 0x15, 0xcc, 0x54, 0xdc, + 0xb1, 0xfc, 0xe4, 0x67, 0x50, 0x0c, 0x6b, 0x8f, 0xb8, 0x6b, 0x12, 0xb5, 0x6d, 0xa9, + 0xc3, 0x82, 0x85, 0x7d, 0xee, 0xcc, 0x40, 0xa9, + ], + cv_net: [ + 0xdd, 0xba, 0x24, 0xf3, 0x9f, 0x70, 0x8e, 0xd7, 0xa7, 0x48, 0x57, 0x13, 0x71, 0x11, + 0x42, 0xc2, 0x38, 0x51, 0x38, 0x15, 0x30, 0x2d, 0xf0, 0xf4, 0x83, 0x04, 0x21, 0xa6, + 0xc1, 0x3e, 0x71, 0x01, + ], + rho: [ + 0xca, 0x1f, 0xeb, 0x30, 0xca, 0x11, 0x17, 0x76, 0xc0, 0x41, 0x74, 0x66, 0xbd, 0x69, + 0xb3, 0xd2, 0x13, 0x88, 0x2e, 0xef, 0x55, 0xe6, 0x0b, 0x6d, 0x9e, 0x2a, 0x98, 0xe7, + 0x05, 0xee, 0xf3, 0x27, + ], + cmx: [ + 0x23, 0x75, 0x7c, 0x51, 0x58, 0x21, 0xcb, 0xc1, 0x84, 0x3c, 0x9a, 0x45, 0x7b, 0x7e, + 0x6a, 0xe6, 0x01, 0xad, 0xd2, 0xea, 0x10, 0xb9, 0xc8, 0x6d, 0x6b, 0x31, 0x7c, 0xe2, + 0xf1, 0x7b, 0xd9, 0x21, + ], + esk: [ + 0x5b, 0xfe, 0x46, 0x9c, 0x33, 0xe4, 0x47, 0xba, 0x45, 0x6b, 0x8b, 0xfe, 0x9b, 0x38, + 0x5b, 0x39, 0x31, 0xb4, 0xba, 0xeb, 0x8f, 0x70, 0x23, 0xfe, 0x8e, 0x33, 0x35, 0x4f, + 0xff, 0xf1, 0xbd, 0x1a, + ], + ephemeral_key: [ + 0x8a, 0x5e, 0x13, 0x2c, 0x3a, 0x07, 0x04, 0xf2, 0x45, 0x6f, 0xbd, 0x77, 0x7a, 0x13, + 0xd6, 0xec, 0x57, 0x65, 0x56, 0x71, 0xdb, 0x07, 0x2a, 0x7d, 0x27, 0x6a, 0xd9, 0x69, + 0xf5, 0xec, 0x45, 0x17, + ], + shared_secret: [ + 0x36, 0xd5, 0x4c, 0xab, 0xc6, 0x7f, 0x6c, 0xc7, 0x26, 0xa7, 0x30, 0xf3, 0xa0, 0xce, + 0xed, 0x58, 0x53, 0xf0, 0x8c, 0xd3, 0x81, 0x46, 0xc8, 0x34, 0x25, 0x98, 0x98, 0x7c, + 0x21, 0x50, 0x48, 0xa5, + ], + k_enc: [ + 0x82, 0xc4, 0x32, 0x65, 0x33, 0x7f, 0x1a, 0xb3, 0x7b, 0x18, 0xdf, 0x27, 0x75, 0x48, + 0x61, 0x82, 0x63, 0xb8, 0x02, 0x4d, 0x9b, 0x14, 0x5a, 0x05, 0xad, 0xe2, 0xeb, 0x54, + 0x79, 0x18, 0x03, 0x20, + ], + p_enc: [ + 0x03, 0x56, 0xe8, 0x4b, 0x1a, 0xdc, 0x94, 0x23, 0xc3, 0x67, 0x6c, 0x04, 0x8d, 0x5f, + 0x29, 0x35, 0x39, 0x5e, 0xe4, 0x76, 0xbf, 0x69, 0xb8, 0x25, 0x0c, 0x18, 0xef, 0x41, + 0x29, 0x4c, 0xa9, 0x79, 0x93, 0xdb, 0x54, 0x6c, 0x1f, 0xe0, 0x1f, 0x7e, 0x9c, 0x8e, + 0x36, 0xd6, 0xa5, 0xe2, 0x9d, 0x4e, 0x30, 0xa7, 0x35, 0x94, 0x67, 0x43, 0xf9, 0x3a, + 0x6e, 0xbd, 0xa7, 0x2a, 0x8c, 0x7c, 0x5a, 0x2b, 0x7f, 0xa3, 0x04, 0xfe, 0x32, 0xb2, + 0x9b, 0x4f, 0x70, 0x6a, 0xa8, 0xf7, 0x42, 0x0f, 0x3d, 0x8e, 0x7a, 0x59, 0x70, 0x2f, + 0xff, 0xbf, 0x50, 0x98, 0x42, 0x1c, 0x69, 0x37, 0x8a, 0xf1, 0xe4, 0x0f, 0x64, 0xe1, + 0x25, 0x94, 0x6f, 0x62, 0xc2, 0xfa, 0x7b, 0x2f, 0xec, 0xbc, 0xb6, 0x4b, 0x69, 0x68, + 0x91, 0x2a, 0x63, 0x81, 0xce, 0x3d, 0xc1, 0x66, 0xd5, 0x6a, 0x1d, 0x62, 0xf5, 0xa8, + 0xd7, 0x55, 0x1d, 0xb5, 0xfd, 0x93, 0x13, 0xe8, 0xc7, 0x20, 0x3d, 0x99, 0x6a, 0xf7, + 0xd4, 0x77, 0x08, 0x37, 0x56, 0xd5, 0x9a, 0xf8, 0x0d, 0x06, 0xa7, 0x45, 0xf4, 0x4a, + 0xb0, 0x23, 0x75, 0x2c, 0xb5, 0xb4, 0x06, 0xed, 0x89, 0x85, 0xe1, 0x81, 0x30, 0xab, + 0x33, 0x36, 0x26, 0x97, 0xb0, 0xe4, 0xe4, 0xc7, 0x63, 0xcc, 0xb8, 0xf6, 0x76, 0x49, + 0x5c, 0x22, 0x2f, 0x7f, 0xba, 0x1e, 0x31, 0xde, 0xfa, 0x3d, 0x5a, 0x57, 0xef, 0xc2, + 0xe1, 0xe9, 0xb0, 0x1a, 0x03, 0x55, 0x87, 0xd5, 0xfb, 0x1a, 0x38, 0xe0, 0x1d, 0x94, + 0x90, 0x3d, 0x3c, 0x3e, 0x0a, 0xd3, 0x36, 0x0c, 0x1d, 0x37, 0x10, 0xac, 0xd2, 0x0b, + 0x18, 0x3e, 0x31, 0xd4, 0x9f, 0x25, 0xc9, 0xa1, 0x38, 0xf4, 0x9b, 0x1a, 0x53, 0x7e, + 0xdc, 0xf0, 0x4b, 0xe3, 0x4a, 0x98, 0x51, 0xa7, 0xaf, 0x9d, 0xb6, 0x99, 0x0e, 0xd8, + 0x3d, 0xd6, 0x4a, 0xf3, 0x59, 0x7c, 0x04, 0x32, 0x3e, 0xa5, 0x1b, 0x00, 0x52, 0xad, + 0x80, 0x84, 0xa8, 0xb9, 0xda, 0x94, 0x8d, 0x32, 0x0d, 0xad, 0xd6, 0x4f, 0x54, 0x31, + 0xe6, 0x1d, 0xdf, 0x65, 0x8d, 0x24, 0xae, 0x67, 0xc2, 0x2c, 0x8d, 0x13, 0x09, 0x13, + 0x1f, 0xc0, 0x0f, 0xe7, 0xf2, 0x35, 0x73, 0x42, 0x76, 0xd3, 0x8d, 0x47, 0xf1, 0xe1, + 0x91, 0xe0, 0x0c, 0x7a, 0x1d, 0x48, 0xaf, 0x04, 0x68, 0x27, 0x59, 0x1e, 0x97, 0x33, + 0xa9, 0x7f, 0xa6, 0xb6, 0x79, 0xf3, 0xdc, 0x60, 0x1d, 0x00, 0x82, 0x85, 0xed, 0xcb, + 0xda, 0xe6, 0x9c, 0xe8, 0xfc, 0x1b, 0xe4, 0xaa, 0xc0, 0x0f, 0xf2, 0x71, 0x1e, 0xbd, + 0x93, 0x1d, 0xe5, 0x18, 0x85, 0x68, 0x78, 0xf7, 0x34, 0x76, 0xf2, 0x1a, 0x48, 0x2e, + 0xc9, 0x37, 0x83, 0x65, 0xc8, 0xf7, 0x39, 0x3c, 0x94, 0xe2, 0x88, 0x53, 0x15, 0xeb, + 0x46, 0x71, 0x09, 0x8b, 0x79, 0x53, 0x5e, 0x79, 0x0f, 0xe5, 0x3e, 0x29, 0xfe, 0xf2, + 0xb3, 0x76, 0x66, 0x97, 0xac, 0x32, 0xb4, 0xf4, 0x73, 0xf4, 0x68, 0xa0, 0x08, 0xe7, + 0x23, 0x89, 0xfc, 0x03, 0x88, 0x0d, 0x78, 0x0c, 0xb0, 0x7f, 0xcf, 0xaa, 0xbe, 0x3f, + 0x1a, 0x84, 0xb2, 0x7d, 0xb5, 0x9a, 0x4a, 0x15, 0x3d, 0x88, 0x2d, 0x2b, 0x21, 0x03, + 0x59, 0x65, 0x55, 0xed, 0x94, 0x94, 0xc6, 0xac, 0x89, 0x3c, 0x49, 0x72, 0x38, 0x33, + 0xec, 0x89, 0x26, 0xc1, 0x03, 0x95, 0x86, 0xa7, 0xaf, 0xcf, 0x4a, 0x0d, 0x9c, 0x73, + 0x1e, 0x98, 0x5d, 0x99, 0x58, 0x9c, 0x8b, 0xb8, 0x38, 0xe8, 0xaa, 0xf7, 0x45, 0x53, + 0x3e, 0xd9, 0xe8, 0xae, 0x3a, 0x1c, 0xd0, 0x74, 0xa5, 0x1a, 0x20, 0xda, 0x8a, 0xba, + 0x18, 0xd1, 0xdb, 0xeb, 0xbc, 0x86, 0x2d, 0xed, 0x42, 0x43, 0x5e, 0x92, 0x47, 0x69, + 0x30, 0xd0, 0x69, 0x89, 0x6c, 0xff, 0x30, 0xeb, 0x41, 0x4f, 0x72, 0x7b, 0x89, 0xe0, + 0x01, 0xaf, 0xa2, 0xfb, 0x8d, 0xc3, 0x43, 0x6d, 0x75, 0xa4, 0xa6, 0xf2, 0x65, 0x72, + 0x50, 0x4b, 0x19, 0x22, 0x32, 0xec, 0xb9, 0xf0, 0xc0, 0x24, 0x11, 0xe5, 0x25, 0x96, + 0xbc, 0x5e, 0x90, 0x45, 0x7e, 0x74, 0x59, 0x39, 0xff, 0xed, 0xbd, 0x12, 0x86, 0x3c, + 0xe7, 0x1a, 0x02, 0xaf, 0x11, 0x7d, 0x41, 0x7a, 0xdb, 0x3d, 0x15, 0xcc, 0x54, 0xdc, + 0xb1, 0xfc, 0xe4, 0x67, 0x50, 0x0c, 0x6b, 0x8f, 0xb8, 0x6b, 0x12, 0xb5, 0x6d, 0xa9, + 0xc3, 0x82, 0x85, 0x7d, 0xee, 0xcc, 0x40, 0xa9, + ], + c_enc: [ + 0x92, 0xe0, 0x48, 0x74, 0xb5, 0x83, 0x7c, 0x26, 0x1d, 0xaf, 0x1a, 0x27, 0xb7, 0x83, + 0xec, 0x48, 0x65, 0xd3, 0xbb, 0x72, 0x8e, 0xb1, 0x61, 0xda, 0xed, 0xb8, 0x44, 0x6a, + 0xb3, 0x8f, 0x07, 0x8e, 0xa8, 0x66, 0x2e, 0x4d, 0x2e, 0x9d, 0x00, 0xa3, 0x95, 0x27, + 0xdc, 0xde, 0x51, 0x7a, 0xc3, 0xdb, 0xf9, 0xd2, 0x7e, 0x3c, 0xe1, 0x06, 0x21, 0xb8, + 0x97, 0xe9, 0x79, 0x10, 0xba, 0xa5, 0x63, 0xd0, 0xb4, 0xc3, 0x8f, 0x87, 0x77, 0xf9, + 0xdf, 0xb5, 0x5a, 0x4d, 0x0c, 0xa6, 0x49, 0x80, 0x7a, 0x6e, 0x7e, 0x3b, 0x63, 0x7b, + 0xe7, 0x83, 0x5c, 0x0c, 0x07, 0x6e, 0x6f, 0x06, 0xee, 0x5c, 0x8a, 0xac, 0x6a, 0xd2, + 0x13, 0x00, 0xf8, 0xe1, 0xcd, 0x39, 0x5f, 0x69, 0x2d, 0xc5, 0x72, 0xab, 0x07, 0xfd, + 0x4b, 0xe1, 0xf2, 0xc6, 0x52, 0x09, 0x64, 0xed, 0xec, 0x3b, 0xe5, 0x56, 0x22, 0xac, + 0x4d, 0x23, 0x85, 0x8c, 0x39, 0x8d, 0xf6, 0x6d, 0x6a, 0x6e, 0x54, 0x60, 0x18, 0xf9, + 0x81, 0x66, 0x89, 0x24, 0xbe, 0x96, 0x3b, 0x7c, 0xbb, 0x0c, 0x7f, 0x10, 0x4d, 0x16, + 0x07, 0xfb, 0xcb, 0xc0, 0x18, 0x49, 0xd9, 0x93, 0x72, 0xcb, 0x8e, 0x64, 0xb2, 0xca, + 0x15, 0xd7, 0xf8, 0xc5, 0x37, 0x20, 0x05, 0xa8, 0x89, 0xd6, 0xa9, 0x31, 0x23, 0x59, + 0x42, 0x09, 0xe4, 0xd2, 0x59, 0x7b, 0x6e, 0x83, 0x78, 0x2e, 0x5d, 0x1a, 0xb0, 0xc5, + 0xd6, 0x42, 0xbe, 0x32, 0xe7, 0xb4, 0x89, 0x85, 0xaa, 0x07, 0x7e, 0x9a, 0x76, 0xbd, + 0xe2, 0x7d, 0xf4, 0x26, 0x74, 0x8b, 0xf3, 0x25, 0x52, 0x01, 0x56, 0x88, 0xb3, 0x6e, + 0x34, 0xff, 0x9d, 0x22, 0x11, 0xd8, 0x72, 0xfb, 0x23, 0x6a, 0x18, 0x2f, 0xe4, 0xf2, + 0x87, 0xa5, 0x5b, 0xfc, 0xee, 0xa3, 0xed, 0x99, 0xfd, 0xc2, 0x91, 0xf9, 0x1d, 0x6e, + 0xf8, 0xd2, 0x9a, 0x27, 0x8f, 0xa6, 0x46, 0xe8, 0xe7, 0xdc, 0x66, 0xd4, 0x9b, 0x38, + 0x62, 0x26, 0x7e, 0xd5, 0x8b, 0x31, 0x66, 0x09, 0x97, 0xa5, 0x8f, 0x29, 0x73, 0x5c, + 0xc6, 0xe5, 0x98, 0x65, 0x54, 0x2f, 0x5d, 0x90, 0x8c, 0xe5, 0x2d, 0x9f, 0x5b, 0x29, + 0xc9, 0x78, 0x24, 0xd1, 0x4d, 0x4d, 0x64, 0xcd, 0xbe, 0x56, 0x93, 0xb5, 0x1b, 0x7e, + 0xc7, 0x31, 0xc9, 0x92, 0x4b, 0x4f, 0x47, 0x5a, 0x14, 0xd0, 0x58, 0x7b, 0xe6, 0x45, + 0x44, 0x8a, 0x07, 0x55, 0x4f, 0x15, 0xbc, 0x9d, 0xaf, 0xa1, 0xf7, 0x38, 0x6a, 0xe8, + 0x6f, 0x71, 0x48, 0x2b, 0x35, 0x6e, 0xa7, 0x9c, 0xdc, 0x44, 0x73, 0x2c, 0xfa, 0x41, + 0x46, 0xe6, 0xca, 0x51, 0x04, 0xf0, 0xa4, 0x60, 0x7b, 0xd6, 0x4b, 0x58, 0x39, 0x6e, + 0x44, 0x3f, 0xad, 0x2c, 0xfc, 0x36, 0xdd, 0xd3, 0xae, 0x9a, 0xa4, 0xbe, 0xa8, 0x7a, + 0xde, 0xd5, 0xec, 0x35, 0x17, 0x42, 0xfc, 0x5a, 0x90, 0x6a, 0xd0, 0x54, 0xd3, 0x59, + 0x43, 0x16, 0xcc, 0x54, 0xb8, 0x74, 0xbb, 0xce, 0xc2, 0xa8, 0x14, 0x31, 0x50, 0x18, + 0xbc, 0x7e, 0x1d, 0x3c, 0x74, 0x84, 0x72, 0xbd, 0x96, 0x77, 0x76, 0x5d, 0xcf, 0x59, + 0xb1, 0x6d, 0x55, 0xa3, 0xf1, 0x86, 0x4f, 0x75, 0x1a, 0x69, 0x3d, 0x76, 0x9c, 0xc7, + 0x6b, 0x8e, 0x32, 0x8a, 0x9a, 0xc8, 0x3b, 0xe1, 0x78, 0x39, 0x1b, 0xeb, 0x5f, 0x28, + 0xab, 0x69, 0x2b, 0x6f, 0x02, 0xa3, 0xf7, 0x49, 0x8a, 0x4b, 0xc5, 0x51, 0xf8, 0x48, + 0x7d, 0xae, 0xba, 0x3b, 0xe0, 0x2e, 0xb0, 0x20, 0xc1, 0x60, 0xf8, 0x78, 0x53, 0x91, + 0xaa, 0x03, 0xde, 0x44, 0x7b, 0x37, 0xf9, 0x5b, 0xec, 0xfe, 0x3e, 0xca, 0x95, 0xae, + 0x62, 0xab, 0xa0, 0x82, 0x20, 0xee, 0x87, 0xd2, 0x48, 0x16, 0xb0, 0x99, 0x5f, 0x27, + 0x30, 0xe8, 0xff, 0x9a, 0xca, 0x21, 0x8b, 0x88, 0xe3, 0x1b, 0x1f, 0xb7, 0x78, 0x3a, + 0x29, 0x80, 0xf7, 0xb2, 0x98, 0x44, 0xc1, 0x06, 0x26, 0xa2, 0x13, 0xa9, 0x81, 0x41, + 0x7d, 0x90, 0xdf, 0xf9, 0xfb, 0x2a, 0xba, 0xfe, 0xc8, 0x38, 0x23, 0x0e, 0x1a, 0x55, + 0xcf, 0xc5, 0xf7, 0xf8, 0x19, 0xab, 0xf6, 0xe5, 0xb0, 0xa7, 0x48, 0x3b, 0xf1, 0xbc, + 0xeb, 0x15, 0xe8, 0x5b, 0xfe, 0x12, 0xfd, 0x55, 0x02, 0x81, 0xe5, 0x28, 0x20, 0xd0, + 0xbd, 0xb2, 0xa5, 0xba, 0x34, 0xe3, 0x74, 0xca, 0x2f, 0xfd, 0xac, 0x56, 0xce, 0x51, + 0x3c, 0xf3, 0xdd, 0x23, 0xde, 0x9f, 0xb4, 0xa1, 0xd2, 0xff, 0x4f, 0xfe, 0x74, 0x9b, + 0xd8, 0xcb, 0x30, 0x8f, 0x9a, 0xf7, 0xb6, 0xfe, 0xa2, 0x39, + ], + ock: [ + 0xb3, 0x25, 0xeb, 0xe5, 0x7a, 0x2c, 0x40, 0xa8, 0xb2, 0x11, 0xcf, 0xdf, 0x72, 0xa1, + 0xa2, 0x44, 0xf1, 0x53, 0x42, 0x85, 0x98, 0x88, 0xa3, 0x64, 0x52, 0x3e, 0xfd, 0x2a, + 0xc6, 0x6a, 0x1a, 0xd6, + ], + op: [ + 0x63, 0xf7, 0x12, 0x5d, 0xf4, 0x83, 0x6f, 0xd2, 0x81, 0x6b, 0x02, 0x4e, 0xe7, 0x0e, + 0xfe, 0x09, 0xfb, 0x9a, 0x7b, 0x38, 0x63, 0xc6, 0xea, 0xcd, 0xf9, 0x5e, 0x03, 0x89, + 0x49, 0x50, 0x69, 0x2c, 0x5b, 0xfe, 0x46, 0x9c, 0x33, 0xe4, 0x47, 0xba, 0x45, 0x6b, + 0x8b, 0xfe, 0x9b, 0x38, 0x5b, 0x39, 0x31, 0xb4, 0xba, 0xeb, 0x8f, 0x70, 0x23, 0xfe, + 0x8e, 0x33, 0x35, 0x4f, 0xff, 0xf1, 0xbd, 0x1a, + ], + c_out: [ + 0x55, 0xb8, 0x90, 0x7c, 0x6d, 0x45, 0x4b, 0x83, 0x63, 0x4f, 0x1b, 0x9a, 0x1a, 0xa3, + 0xc3, 0xc9, 0x8a, 0xdc, 0x77, 0xd9, 0x6c, 0x2f, 0x62, 0x49, 0xec, 0x66, 0xdb, 0xae, + 0x4d, 0x0c, 0xc9, 0x40, 0xd7, 0x26, 0xbc, 0xd1, 0xec, 0x91, 0x18, 0x9f, 0xd3, 0x04, + 0x9a, 0x33, 0xf2, 0xea, 0x7d, 0x8b, 0x74, 0xaa, 0xc1, 0x7c, 0xda, 0x38, 0x83, 0x80, + 0x2d, 0xb5, 0x96, 0x9d, 0x8d, 0x2f, 0x32, 0x25, 0x91, 0x9c, 0xe3, 0x88, 0x26, 0x41, + 0x5c, 0xc6, 0xb3, 0x38, 0x94, 0x4b, 0x48, 0x99, 0x54, 0x8b, + ], + }, + TestVector { + incoming_viewing_key: [ + 0xfd, 0x9e, 0x9a, 0x1f, 0x38, 0x1c, 0xbe, 0x75, 0xcd, 0x8d, 0x6a, 0xe1, 0x2f, 0xca, + 0x87, 0x2e, 0x94, 0x00, 0xf0, 0x02, 0x72, 0xb0, 0x29, 0x65, 0x2e, 0x65, 0x6c, 0x8f, + 0x3c, 0x4b, 0xf0, 0x37, 0xee, 0xef, 0x96, 0x42, 0x1b, 0x2f, 0xab, 0x2f, 0xb3, 0xad, + 0x1e, 0x0a, 0xd8, 0x50, 0x2d, 0x74, 0xe6, 0xf0, 0x8f, 0x0d, 0xd5, 0x18, 0xf8, 0xfa, + 0x82, 0x2a, 0x65, 0xbe, 0x27, 0x40, 0xc0, 0x21, + ], + ovk: [ + 0xe7, 0x30, 0x81, 0xef, 0x8d, 0x62, 0xcb, 0x78, 0x0a, 0xb6, 0x88, 0x3a, 0x50, 0xa0, + 0xd4, 0x70, 0x19, 0x0d, 0xfb, 0xa1, 0x0a, 0x85, 0x7f, 0x82, 0x84, 0x2d, 0x38, 0x25, + 0xb3, 0xd6, 0xda, 0x05, + ], + default_d: [ + 0x55, 0x6e, 0x5e, 0x1b, 0xf5, 0x1b, 0xc6, 0xa6, 0x11, 0x58, 0xf7, + ], + default_pk_d: [ + 0xb4, 0xca, 0xc5, 0x6f, 0x06, 0x2b, 0xfb, 0x2e, 0x27, 0x15, 0xea, 0xf9, 0xc8, 0xfc, + 0xdb, 0xc2, 0x0c, 0x86, 0x79, 0x3f, 0x23, 0x57, 0xdd, 0xd0, 0x4a, 0xad, 0x39, 0xf9, + 0x4a, 0xd7, 0xc7, 0x84, + ], + v: 9072946746592546880, + rseed: [ + 0xae, 0xab, 0x01, 0x6b, 0x6b, 0xc1, 0xec, 0x14, 0x4b, 0x4e, 0x55, 0x3a, 0xcf, 0xd6, + 0x70, 0xf7, 0x7e, 0x75, 0x5f, 0xc8, 0x8e, 0x06, 0x77, 0xe3, 0x1b, 0xa4, 0x59, 0xb4, + 0x4e, 0x30, 0x77, 0x68, + ], + asset: [ + 0x67, 0x43, 0xf9, 0x3a, 0x6e, 0xbd, 0xa7, 0x2a, 0x8c, 0x7c, 0x5a, 0x2b, 0x7f, 0xa3, + 0x04, 0xfe, 0x32, 0xb2, 0x9b, 0x4f, 0x70, 0x6a, 0xa8, 0xf7, 0x42, 0x0f, 0x3d, 0x8e, + 0x7a, 0x59, 0x70, 0x2f, + ], + memo: [ + 0xff, 0x95, 0x8f, 0xe3, 0x78, 0x9d, 0x41, 0xc2, 0xb1, 0xff, 0x43, 0x4c, 0xb3, 0x0e, + 0x15, 0x91, 0x4f, 0x01, 0xbc, 0x6b, 0xc2, 0x30, 0x7b, 0x48, 0x8d, 0x25, 0x56, 0xd7, + 0xb7, 0x38, 0x0e, 0xa4, 0xff, 0xd7, 0x12, 0xf6, 0xb0, 0x2f, 0xe8, 0x06, 0xb9, 0x45, + 0x69, 0xcd, 0x40, 0x59, 0xf3, 0x96, 0xbf, 0x29, 0xb9, 0x9d, 0x0a, 0x40, 0xe5, 0xe1, + 0x71, 0x1c, 0xa9, 0x44, 0xf7, 0x2d, 0x43, 0x6a, 0x10, 0x2f, 0xca, 0x4b, 0x97, 0x69, + 0x3d, 0xa0, 0xb0, 0x86, 0xfe, 0x9d, 0x2e, 0x71, 0x62, 0x47, 0x0d, 0x02, 0xe0, 0xf0, + 0x5d, 0x4b, 0xec, 0x95, 0x12, 0xbf, 0xb3, 0xf3, 0x83, 0x27, 0x29, 0x6e, 0xfa, 0xa7, + 0x43, 0x28, 0xb1, 0x18, 0xc2, 0x74, 0x02, 0xc7, 0x0c, 0x3a, 0x90, 0xb4, 0x9a, 0xd4, + 0xbb, 0xc6, 0x8e, 0x37, 0xc0, 0xaa, 0x7d, 0x9b, 0x3f, 0xe1, 0x77, 0x99, 0xd7, 0x3b, + 0x84, 0x1e, 0x75, 0x17, 0x13, 0xa0, 0x29, 0x43, 0x90, 0x5a, 0xae, 0x08, 0x03, 0xfd, + 0x69, 0x44, 0x2e, 0xb7, 0x68, 0x1e, 0xc2, 0xa0, 0x56, 0x00, 0x05, 0x4e, 0x92, 0xee, + 0xd5, 0x55, 0x02, 0x8f, 0x21, 0xb6, 0xa1, 0x55, 0x26, 0x8a, 0x2d, 0xd6, 0x64, 0x0a, + 0x69, 0x30, 0x1a, 0x52, 0xa3, 0x8d, 0x4d, 0x9f, 0x9f, 0x95, 0x7a, 0xe3, 0x5a, 0xf7, + 0x16, 0x71, 0x18, 0x14, 0x1c, 0xe4, 0xc9, 0xbe, 0x0a, 0x6a, 0x49, 0x2f, 0xe7, 0x9f, + 0x15, 0x81, 0xa1, 0x55, 0xfa, 0x3a, 0x2b, 0x9d, 0xaf, 0xd8, 0x2e, 0x65, 0x0b, 0x38, + 0x6a, 0xd3, 0xa0, 0x8c, 0xb6, 0xb8, 0x31, 0x31, 0xac, 0x30, 0x0b, 0x08, 0x46, 0x35, + 0x4a, 0x7e, 0xef, 0x9c, 0x41, 0x0e, 0x4b, 0x62, 0xc4, 0x7c, 0x54, 0x26, 0x90, 0x7d, + 0xfc, 0x66, 0x85, 0xc5, 0xc9, 0x9b, 0x71, 0x41, 0xac, 0x62, 0x6a, 0xb4, 0x76, 0x1f, + 0xd3, 0xf4, 0x1e, 0x72, 0x8e, 0x1a, 0x28, 0xf8, 0x9d, 0xb8, 0x9f, 0xfd, 0xec, 0xa3, + 0x64, 0xdd, 0x2f, 0x0f, 0x07, 0x39, 0xf0, 0x53, 0x45, 0x56, 0x48, 0x31, 0x99, 0xc7, + 0x1f, 0x18, 0x93, 0x41, 0xac, 0x9b, 0x78, 0xa2, 0x69, 0x16, 0x42, 0x06, 0xa0, 0xea, + 0x1c, 0xe7, 0x3b, 0xfb, 0x2a, 0x94, 0x2e, 0x73, 0x70, 0xb2, 0x47, 0xc0, 0x46, 0xf8, + 0xe7, 0x5e, 0xf8, 0xe3, 0xf8, 0xbd, 0x82, 0x1c, 0xf5, 0x77, 0x49, 0x18, 0x64, 0xe2, + 0x0e, 0x6d, 0x08, 0xfd, 0x2e, 0x32, 0xb5, 0x55, 0xc9, 0x2c, 0x66, 0x1f, 0x19, 0x58, + 0x8b, 0x72, 0xa8, 0x95, 0x99, 0x71, 0x0a, 0x88, 0x06, 0x12, 0x53, 0xca, 0x28, 0x5b, + 0x63, 0x04, 0xb3, 0x7d, 0xa2, 0xb5, 0x29, 0x4f, 0x5c, 0xb3, 0x54, 0xa8, 0x94, 0x32, + 0x28, 0x48, 0xcc, 0xbd, 0xc7, 0xc2, 0x54, 0x5b, 0x7d, 0xa5, 0x68, 0xaf, 0xac, 0x87, + 0xff, 0xa0, 0x05, 0xc3, 0x12, 0x24, 0x1c, 0x2d, 0x57, 0xf4, 0xb4, 0x5d, 0x64, 0x19, + 0xf0, 0xd2, 0xe2, 0xc5, 0xaf, 0x33, 0xae, 0x24, 0x37, 0x85, 0xb3, 0x25, 0xcd, 0xab, + 0x95, 0x40, 0x4f, 0xc7, 0xae, 0xd7, 0x05, 0x25, 0xcd, 0xdb, 0x41, 0x87, 0x2c, 0xfc, + 0xc2, 0x14, 0xb1, 0x32, 0x32, 0xed, 0xc7, 0x86, 0x09, 0x75, 0x3d, 0xbf, 0xf9, 0x30, + 0xeb, 0x0d, 0xc1, 0x56, 0x61, 0x2b, 0x9c, 0xb4, 0x34, 0xbc, 0x4b, 0x69, 0x33, 0x92, + 0xde, 0xb8, 0x7c, 0x53, 0x04, 0x35, 0x31, 0x2e, 0xdc, 0xed, 0xc6, 0xa9, 0x61, 0x13, + 0x33, 0x38, 0xd7, 0x86, 0xc4, 0xa3, 0xe1, 0x03, 0xf6, 0x01, 0x10, 0xa1, 0x6b, 0x13, + 0x37, 0x12, 0x97, 0x04, 0xbf, 0x47, 0x54, 0xff, 0x6b, 0xa9, 0xfb, 0xe6, 0x59, 0x51, + 0xe6, 0x10, 0x62, 0x0f, 0x71, 0xcd, 0xa8, 0xfc, 0x87, 0x76, 0x25, 0xf2, 0xc5, 0xbb, + 0x04, 0xcb, 0xe1, 0x22, 0x8b, 0x1e, 0x88, 0x6f, + ], + cv_net: [ + 0x15, 0x49, 0x70, 0x7e, 0x1e, 0xd2, 0xb2, 0xeb, 0x66, 0x15, 0x65, 0x0b, 0xec, 0x45, + 0xa2, 0x17, 0x64, 0x10, 0x4a, 0x23, 0xea, 0xf6, 0xba, 0x49, 0x6c, 0xb9, 0xb8, 0xe8, + 0x25, 0x7a, 0xd8, 0xb3, + ], + rho: [ + 0xc1, 0xe1, 0x59, 0x5b, 0x8d, 0xe7, 0x55, 0x97, 0x66, 0xe5, 0xa6, 0x72, 0x5f, 0x5b, + 0xe5, 0x74, 0x2f, 0x43, 0xbf, 0x40, 0x62, 0x3b, 0x71, 0x49, 0xca, 0xe2, 0x67, 0x5c, + 0x4d, 0xb2, 0xc7, 0x31, + ], + cmx: [ + 0x59, 0xb6, 0xf3, 0xd4, 0x03, 0x22, 0x3d, 0x6c, 0xe4, 0x3d, 0xed, 0xae, 0xe2, 0x35, + 0xfc, 0xa9, 0x5c, 0xc8, 0xb2, 0x49, 0x94, 0x1c, 0xcd, 0xb6, 0x6f, 0x3f, 0x61, 0x1c, + 0xc5, 0xe9, 0xf9, 0x0f, + ], + esk: [ + 0x10, 0x87, 0x4a, 0x74, 0x22, 0x7a, 0xc7, 0x99, 0x5e, 0xdd, 0xdd, 0x73, 0x4d, 0x0e, + 0x00, 0xdc, 0xc9, 0xf4, 0x8a, 0x01, 0xdd, 0x5c, 0x4c, 0xb1, 0x22, 0xc0, 0x61, 0xe0, + 0xbd, 0xc9, 0xce, 0x14, + ], + ephemeral_key: [ + 0xd2, 0x9e, 0x0d, 0x00, 0x1e, 0xe7, 0x1e, 0x05, 0x99, 0x08, 0x65, 0x04, 0xd8, 0x62, + 0xc7, 0xf5, 0x2b, 0x08, 0x60, 0x77, 0x0d, 0x8a, 0x4b, 0x42, 0xa8, 0x68, 0x11, 0xac, + 0x31, 0x69, 0x85, 0x8c, + ], + shared_secret: [ + 0x11, 0xa0, 0xac, 0x79, 0x9a, 0x29, 0xb0, 0xed, 0x19, 0x5e, 0xd8, 0x7b, 0x13, 0x83, + 0x22, 0x26, 0x3b, 0xbb, 0x9c, 0x31, 0x00, 0x8c, 0x29, 0x59, 0xaf, 0x2f, 0xc6, 0x36, + 0x68, 0x7e, 0xd9, 0xb0, + ], + k_enc: [ + 0x4b, 0xbf, 0x80, 0xe7, 0xa1, 0x70, 0x3a, 0xc1, 0x4a, 0xd7, 0xb5, 0x44, 0x8a, 0x2e, + 0x8e, 0x79, 0x49, 0x30, 0x49, 0xd1, 0x9a, 0x6a, 0x51, 0x31, 0x67, 0xd5, 0x5b, 0xdd, + 0x58, 0x6a, 0xc0, 0xd9, + ], + p_enc: [ + 0x03, 0x55, 0x6e, 0x5e, 0x1b, 0xf5, 0x1b, 0xc6, 0xa6, 0x11, 0x58, 0xf7, 0x40, 0x50, + 0xaf, 0xd8, 0xfe, 0x94, 0xe9, 0x7d, 0xae, 0xab, 0x01, 0x6b, 0x6b, 0xc1, 0xec, 0x14, + 0x4b, 0x4e, 0x55, 0x3a, 0xcf, 0xd6, 0x70, 0xf7, 0x7e, 0x75, 0x5f, 0xc8, 0x8e, 0x06, + 0x77, 0xe3, 0x1b, 0xa4, 0x59, 0xb4, 0x4e, 0x30, 0x77, 0x68, 0x67, 0x43, 0xf9, 0x3a, + 0x6e, 0xbd, 0xa7, 0x2a, 0x8c, 0x7c, 0x5a, 0x2b, 0x7f, 0xa3, 0x04, 0xfe, 0x32, 0xb2, + 0x9b, 0x4f, 0x70, 0x6a, 0xa8, 0xf7, 0x42, 0x0f, 0x3d, 0x8e, 0x7a, 0x59, 0x70, 0x2f, + 0xff, 0x95, 0x8f, 0xe3, 0x78, 0x9d, 0x41, 0xc2, 0xb1, 0xff, 0x43, 0x4c, 0xb3, 0x0e, + 0x15, 0x91, 0x4f, 0x01, 0xbc, 0x6b, 0xc2, 0x30, 0x7b, 0x48, 0x8d, 0x25, 0x56, 0xd7, + 0xb7, 0x38, 0x0e, 0xa4, 0xff, 0xd7, 0x12, 0xf6, 0xb0, 0x2f, 0xe8, 0x06, 0xb9, 0x45, + 0x69, 0xcd, 0x40, 0x59, 0xf3, 0x96, 0xbf, 0x29, 0xb9, 0x9d, 0x0a, 0x40, 0xe5, 0xe1, + 0x71, 0x1c, 0xa9, 0x44, 0xf7, 0x2d, 0x43, 0x6a, 0x10, 0x2f, 0xca, 0x4b, 0x97, 0x69, + 0x3d, 0xa0, 0xb0, 0x86, 0xfe, 0x9d, 0x2e, 0x71, 0x62, 0x47, 0x0d, 0x02, 0xe0, 0xf0, + 0x5d, 0x4b, 0xec, 0x95, 0x12, 0xbf, 0xb3, 0xf3, 0x83, 0x27, 0x29, 0x6e, 0xfa, 0xa7, + 0x43, 0x28, 0xb1, 0x18, 0xc2, 0x74, 0x02, 0xc7, 0x0c, 0x3a, 0x90, 0xb4, 0x9a, 0xd4, + 0xbb, 0xc6, 0x8e, 0x37, 0xc0, 0xaa, 0x7d, 0x9b, 0x3f, 0xe1, 0x77, 0x99, 0xd7, 0x3b, + 0x84, 0x1e, 0x75, 0x17, 0x13, 0xa0, 0x29, 0x43, 0x90, 0x5a, 0xae, 0x08, 0x03, 0xfd, + 0x69, 0x44, 0x2e, 0xb7, 0x68, 0x1e, 0xc2, 0xa0, 0x56, 0x00, 0x05, 0x4e, 0x92, 0xee, + 0xd5, 0x55, 0x02, 0x8f, 0x21, 0xb6, 0xa1, 0x55, 0x26, 0x8a, 0x2d, 0xd6, 0x64, 0x0a, + 0x69, 0x30, 0x1a, 0x52, 0xa3, 0x8d, 0x4d, 0x9f, 0x9f, 0x95, 0x7a, 0xe3, 0x5a, 0xf7, + 0x16, 0x71, 0x18, 0x14, 0x1c, 0xe4, 0xc9, 0xbe, 0x0a, 0x6a, 0x49, 0x2f, 0xe7, 0x9f, + 0x15, 0x81, 0xa1, 0x55, 0xfa, 0x3a, 0x2b, 0x9d, 0xaf, 0xd8, 0x2e, 0x65, 0x0b, 0x38, + 0x6a, 0xd3, 0xa0, 0x8c, 0xb6, 0xb8, 0x31, 0x31, 0xac, 0x30, 0x0b, 0x08, 0x46, 0x35, + 0x4a, 0x7e, 0xef, 0x9c, 0x41, 0x0e, 0x4b, 0x62, 0xc4, 0x7c, 0x54, 0x26, 0x90, 0x7d, + 0xfc, 0x66, 0x85, 0xc5, 0xc9, 0x9b, 0x71, 0x41, 0xac, 0x62, 0x6a, 0xb4, 0x76, 0x1f, + 0xd3, 0xf4, 0x1e, 0x72, 0x8e, 0x1a, 0x28, 0xf8, 0x9d, 0xb8, 0x9f, 0xfd, 0xec, 0xa3, + 0x64, 0xdd, 0x2f, 0x0f, 0x07, 0x39, 0xf0, 0x53, 0x45, 0x56, 0x48, 0x31, 0x99, 0xc7, + 0x1f, 0x18, 0x93, 0x41, 0xac, 0x9b, 0x78, 0xa2, 0x69, 0x16, 0x42, 0x06, 0xa0, 0xea, + 0x1c, 0xe7, 0x3b, 0xfb, 0x2a, 0x94, 0x2e, 0x73, 0x70, 0xb2, 0x47, 0xc0, 0x46, 0xf8, + 0xe7, 0x5e, 0xf8, 0xe3, 0xf8, 0xbd, 0x82, 0x1c, 0xf5, 0x77, 0x49, 0x18, 0x64, 0xe2, + 0x0e, 0x6d, 0x08, 0xfd, 0x2e, 0x32, 0xb5, 0x55, 0xc9, 0x2c, 0x66, 0x1f, 0x19, 0x58, + 0x8b, 0x72, 0xa8, 0x95, 0x99, 0x71, 0x0a, 0x88, 0x06, 0x12, 0x53, 0xca, 0x28, 0x5b, + 0x63, 0x04, 0xb3, 0x7d, 0xa2, 0xb5, 0x29, 0x4f, 0x5c, 0xb3, 0x54, 0xa8, 0x94, 0x32, + 0x28, 0x48, 0xcc, 0xbd, 0xc7, 0xc2, 0x54, 0x5b, 0x7d, 0xa5, 0x68, 0xaf, 0xac, 0x87, + 0xff, 0xa0, 0x05, 0xc3, 0x12, 0x24, 0x1c, 0x2d, 0x57, 0xf4, 0xb4, 0x5d, 0x64, 0x19, + 0xf0, 0xd2, 0xe2, 0xc5, 0xaf, 0x33, 0xae, 0x24, 0x37, 0x85, 0xb3, 0x25, 0xcd, 0xab, + 0x95, 0x40, 0x4f, 0xc7, 0xae, 0xd7, 0x05, 0x25, 0xcd, 0xdb, 0x41, 0x87, 0x2c, 0xfc, + 0xc2, 0x14, 0xb1, 0x32, 0x32, 0xed, 0xc7, 0x86, 0x09, 0x75, 0x3d, 0xbf, 0xf9, 0x30, + 0xeb, 0x0d, 0xc1, 0x56, 0x61, 0x2b, 0x9c, 0xb4, 0x34, 0xbc, 0x4b, 0x69, 0x33, 0x92, + 0xde, 0xb8, 0x7c, 0x53, 0x04, 0x35, 0x31, 0x2e, 0xdc, 0xed, 0xc6, 0xa9, 0x61, 0x13, + 0x33, 0x38, 0xd7, 0x86, 0xc4, 0xa3, 0xe1, 0x03, 0xf6, 0x01, 0x10, 0xa1, 0x6b, 0x13, + 0x37, 0x12, 0x97, 0x04, 0xbf, 0x47, 0x54, 0xff, 0x6b, 0xa9, 0xfb, 0xe6, 0x59, 0x51, + 0xe6, 0x10, 0x62, 0x0f, 0x71, 0xcd, 0xa8, 0xfc, 0x87, 0x76, 0x25, 0xf2, 0xc5, 0xbb, + 0x04, 0xcb, 0xe1, 0x22, 0x8b, 0x1e, 0x88, 0x6f, + ], + c_enc: [ + 0x1a, 0x42, 0x34, 0x80, 0xbf, 0x37, 0x67, 0xf5, 0xeb, 0xfc, 0x40, 0xb8, 0xc8, 0x9c, + 0xc5, 0x34, 0xf1, 0x65, 0xc3, 0x5d, 0x19, 0xc8, 0xda, 0x6c, 0x32, 0x10, 0xe9, 0x52, + 0xca, 0xd8, 0x23, 0xa7, 0x84, 0x60, 0x21, 0xc3, 0xde, 0x4a, 0x86, 0x93, 0xb7, 0x1e, + 0x28, 0x7f, 0x46, 0x86, 0xac, 0x0a, 0xdd, 0xce, 0xd9, 0x4e, 0x22, 0x57, 0x7c, 0x40, + 0x9d, 0xa2, 0xdc, 0xa2, 0xef, 0xc2, 0xb3, 0xf8, 0x86, 0x97, 0xf5, 0xed, 0x20, 0x5a, + 0xb2, 0xf9, 0xea, 0x29, 0x85, 0xdd, 0x8b, 0x91, 0xb3, 0x2c, 0x1d, 0x7a, 0x8d, 0xa3, + 0xe8, 0x60, 0x57, 0xe8, 0x70, 0x8c, 0x7e, 0xb1, 0x32, 0x32, 0xaf, 0x56, 0x5d, 0xa5, + 0xa3, 0x5d, 0xe5, 0x06, 0x26, 0x29, 0x6a, 0xa6, 0x07, 0x1a, 0xa0, 0x0a, 0x2c, 0xf2, + 0x47, 0x3f, 0xa8, 0x0b, 0xfd, 0xbb, 0x95, 0x89, 0x48, 0x2a, 0x83, 0x5d, 0x56, 0xd2, + 0x27, 0xe6, 0x29, 0xe3, 0x5b, 0x2f, 0xb0, 0xf3, 0xdd, 0x38, 0xf1, 0x3b, 0xaa, 0x24, + 0xe5, 0x88, 0x26, 0x66, 0x25, 0x31, 0x07, 0x6a, 0xab, 0x9f, 0x4e, 0x3d, 0xe2, 0xc0, + 0xd0, 0x03, 0xe8, 0xd1, 0x0a, 0x8a, 0x70, 0x64, 0x3f, 0xe2, 0x4b, 0x1e, 0x4a, 0x2b, + 0x6d, 0x42, 0x74, 0xbc, 0xc5, 0xfc, 0xe0, 0x49, 0x3a, 0xec, 0x37, 0xe3, 0x24, 0xe9, + 0xb5, 0x13, 0x47, 0xe3, 0x20, 0xa8, 0xa0, 0x0d, 0xd6, 0xd6, 0xcd, 0x3a, 0x46, 0x70, + 0x4b, 0x90, 0xaf, 0x0d, 0x30, 0xe1, 0xda, 0x33, 0x7a, 0x2a, 0x82, 0x98, 0x26, 0xce, + 0x70, 0xf4, 0xf8, 0xa7, 0xcd, 0x31, 0x37, 0x59, 0x42, 0xda, 0x53, 0x4b, 0x68, 0x8b, + 0xf0, 0xbe, 0x8b, 0x6b, 0x90, 0x52, 0x6b, 0x18, 0x1d, 0x9f, 0x07, 0x2f, 0x60, 0x83, + 0x42, 0xb2, 0x4c, 0x89, 0xda, 0xd7, 0xf7, 0xf3, 0x07, 0x9f, 0xe9, 0x9b, 0x6c, 0xfc, + 0x73, 0x38, 0xc2, 0x86, 0x94, 0x2c, 0xab, 0x60, 0x72, 0x95, 0x3f, 0x08, 0x6d, 0x59, + 0xa1, 0xd6, 0x60, 0x00, 0xa4, 0xea, 0x6a, 0xe6, 0x3f, 0xbb, 0xfc, 0x5d, 0xc7, 0x6e, + 0x23, 0x14, 0x29, 0x88, 0x72, 0x5d, 0xea, 0x47, 0x43, 0x52, 0x2b, 0x92, 0x2c, 0xeb, + 0x89, 0xf1, 0x94, 0x8c, 0xe9, 0x43, 0xd5, 0x73, 0x66, 0x10, 0x30, 0xfe, 0x0c, 0xec, + 0x60, 0x7b, 0xd2, 0x47, 0xc9, 0xb5, 0x91, 0x84, 0x3d, 0x3e, 0x38, 0xa9, 0x47, 0x29, + 0x29, 0x8e, 0x60, 0x05, 0xdf, 0xd9, 0xf4, 0xf0, 0xf4, 0x86, 0xcb, 0xa7, 0xb6, 0x51, + 0xd5, 0xb9, 0xd3, 0xd7, 0xae, 0x64, 0x48, 0xe3, 0x9d, 0x19, 0xd7, 0x77, 0x41, 0x79, + 0x2d, 0x60, 0x9c, 0x2e, 0xb9, 0x7f, 0xa9, 0xba, 0x6e, 0x0b, 0x33, 0xdf, 0x17, 0xff, + 0x0f, 0x3c, 0x61, 0x16, 0x38, 0x9f, 0x3d, 0xa3, 0xb0, 0xd6, 0x56, 0xb9, 0x15, 0x3e, + 0xb3, 0x3f, 0x1b, 0xb5, 0x03, 0x94, 0xd7, 0x37, 0xb6, 0x78, 0x15, 0x35, 0xe9, 0x2b, + 0xcc, 0x8a, 0x7e, 0x56, 0xe6, 0x08, 0x02, 0x33, 0x3f, 0xea, 0x10, 0xde, 0xb6, 0xc7, + 0x9b, 0x66, 0x3d, 0xdd, 0x92, 0x82, 0x84, 0x91, 0x46, 0x23, 0x3f, 0x07, 0x8a, 0xbb, + 0x6d, 0x38, 0xec, 0x80, 0x7c, 0x45, 0x79, 0x4d, 0xf4, 0xaa, 0xfe, 0xe8, 0xd7, 0x58, + 0xb9, 0xda, 0xb4, 0xf3, 0x9a, 0xbd, 0x9a, 0xce, 0x42, 0xea, 0x39, 0x88, 0x9d, 0x5f, + 0x40, 0x24, 0x12, 0x24, 0xa9, 0xe1, 0x17, 0x1b, 0xad, 0xcf, 0x4c, 0x5a, 0x75, 0x9e, + 0x3b, 0xb9, 0xc7, 0x9e, 0x3d, 0x1c, 0x72, 0xb4, 0xaf, 0x65, 0x81, 0xe0, 0x7b, 0xde, + 0xdf, 0xc1, 0x7f, 0xe6, 0x82, 0x70, 0x79, 0x9c, 0x3b, 0xb0, 0x8b, 0x11, 0xfe, 0xfe, + 0xb1, 0xed, 0xb2, 0xbb, 0xa0, 0xf1, 0x14, 0x6b, 0x54, 0x01, 0x2a, 0xd3, 0x17, 0x57, + 0x10, 0x2c, 0xaa, 0x5d, 0xee, 0x1f, 0xcf, 0x1f, 0x97, 0x13, 0x34, 0x0d, 0xa2, 0x52, + 0xbd, 0x41, 0xed, 0x4a, 0xe2, 0x11, 0xf3, 0x5f, 0x88, 0x99, 0x1e, 0x1f, 0xe3, 0x47, + 0xd7, 0x0f, 0x52, 0xcd, 0x12, 0xd7, 0x36, 0x13, 0xcd, 0x13, 0xcf, 0xb1, 0x2e, 0xb2, + 0x5f, 0x83, 0x2b, 0x34, 0xc8, 0xb6, 0x69, 0x3a, 0x85, 0xb4, 0x00, 0xfc, 0xe3, 0x03, + 0xdc, 0xcb, 0x3f, 0x8d, 0x90, 0xf5, 0xb7, 0x0c, 0x1e, 0x00, 0xd1, 0xb5, 0x41, 0xe0, + 0xe1, 0x37, 0x3c, 0xc0, 0xc4, 0x05, 0x00, 0x72, 0x18, 0x76, 0x90, 0xf1, 0x38, 0xfd, + 0x25, 0x03, 0x27, 0x2a, 0x3f, 0x9e, 0xc5, 0x72, 0x0d, 0xd3, 0xe5, 0xb1, 0xda, 0x59, + 0x51, 0x4d, 0x4c, 0xb5, 0x0b, 0x1a, 0x44, 0x5a, 0x9d, 0x66, + ], + ock: [ + 0xab, 0xd0, 0xc2, 0x46, 0x97, 0xe4, 0x5b, 0x8b, 0xc4, 0x83, 0x0f, 0xb1, 0x46, 0x53, + 0x2e, 0xa0, 0xac, 0x84, 0x55, 0x81, 0xca, 0x35, 0x39, 0xd3, 0x41, 0x24, 0x73, 0x54, + 0x09, 0xd0, 0x15, 0xac, + ], + op: [ + 0xb4, 0xca, 0xc5, 0x6f, 0x06, 0x2b, 0xfb, 0x2e, 0x27, 0x15, 0xea, 0xf9, 0xc8, 0xfc, + 0xdb, 0xc2, 0x0c, 0x86, 0x79, 0x3f, 0x23, 0x57, 0xdd, 0xd0, 0x4a, 0xad, 0x39, 0xf9, + 0x4a, 0xd7, 0xc7, 0x84, 0x10, 0x87, 0x4a, 0x74, 0x22, 0x7a, 0xc7, 0x99, 0x5e, 0xdd, + 0xdd, 0x73, 0x4d, 0x0e, 0x00, 0xdc, 0xc9, 0xf4, 0x8a, 0x01, 0xdd, 0x5c, 0x4c, 0xb1, + 0x22, 0xc0, 0x61, 0xe0, 0xbd, 0xc9, 0xce, 0x14, + ], + c_out: [ + 0xea, 0xdf, 0x7e, 0xeb, 0x10, 0x2d, 0xb1, 0x88, 0x58, 0x54, 0xc2, 0x9e, 0xb7, 0xb0, + 0x5c, 0x7c, 0x96, 0xbb, 0xb8, 0x90, 0x00, 0x2c, 0x4e, 0xd1, 0x14, 0xed, 0x62, 0xf5, + 0xf9, 0xcc, 0xb4, 0x41, 0x6b, 0x5e, 0xdd, 0xd9, 0xad, 0xb5, 0x5c, 0xe9, 0xc7, 0xa0, + 0xd8, 0x44, 0x2b, 0xbc, 0x8a, 0xfa, 0x5c, 0x77, 0xb9, 0x90, 0xad, 0x6d, 0x46, 0x12, + 0x4d, 0xde, 0x70, 0x49, 0x48, 0x72, 0xb2, 0x20, 0x8a, 0x7c, 0x58, 0x02, 0xdf, 0xe9, + 0xbd, 0x1c, 0xa1, 0x9b, 0xef, 0x4b, 0x37, 0xc6, 0x13, 0xb2, + ], + }, + TestVector { + incoming_viewing_key: [ + 0x91, 0xee, 0x20, 0x54, 0x48, 0xc9, 0x8b, 0x69, 0xa3, 0x3e, 0xbf, 0x29, 0x35, 0x09, + 0x5d, 0x79, 0xc2, 0x53, 0x02, 0x9e, 0x5e, 0x5d, 0xc0, 0x2d, 0xf5, 0x8a, 0x10, 0x03, + 0xd1, 0xd8, 0x5c, 0x27, 0xf2, 0xde, 0xf5, 0xb1, 0x10, 0xfd, 0x43, 0xd7, 0x15, 0xe8, + 0xd5, 0x9e, 0xc4, 0xad, 0x0f, 0x41, 0x02, 0x0e, 0xc6, 0x60, 0xcd, 0x97, 0x33, 0xe7, + 0x79, 0xb5, 0x1a, 0x7a, 0xc2, 0xd5, 0xa6, 0x31, + ], + ovk: [ + 0x18, 0x2f, 0x20, 0x7b, 0x31, 0x75, 0x96, 0x1f, 0x64, 0x11, 0xa4, 0x93, 0xbf, 0xfd, + 0x04, 0x8e, 0x7d, 0x0d, 0x87, 0xd8, 0x2f, 0xe6, 0xf9, 0x90, 0xa2, 0xb0, 0xa2, 0x5f, + 0x5a, 0xa0, 0x11, 0x1a, + ], + default_d: [ + 0x08, 0xab, 0x2e, 0xe9, 0x9d, 0x4d, 0x9b, 0x98, 0x3d, 0xdd, 0x22, + ], + default_pk_d: [ + 0x82, 0xfe, 0xf6, 0x43, 0xdb, 0xf4, 0x2d, 0xca, 0x51, 0x56, 0xfb, 0x51, 0xd4, 0xc4, + 0xee, 0x00, 0x8a, 0x72, 0xf0, 0xdb, 0xc3, 0xf3, 0x1e, 0xfa, 0xb0, 0x75, 0xf2, 0x75, + 0x15, 0x37, 0x14, 0x0d, + ], + v: 14400879385556610631, + rseed: [ + 0xd5, 0x07, 0xcd, 0xfe, 0x6f, 0xbd, 0xaa, 0x86, 0x16, 0x3e, 0x9c, 0xf5, 0xde, 0x31, + 0x00, 0xfb, 0xca, 0x7e, 0x8d, 0xa0, 0x47, 0xb0, 0x90, 0xdb, 0x9f, 0x37, 0x95, 0x2f, + 0xbf, 0xee, 0x76, 0xaf, + ], + asset: [ + 0x67, 0x43, 0xf9, 0x3a, 0x6e, 0xbd, 0xa7, 0x2a, 0x8c, 0x7c, 0x5a, 0x2b, 0x7f, 0xa3, + 0x04, 0xfe, 0x32, 0xb2, 0x9b, 0x4f, 0x70, 0x6a, 0xa8, 0xf7, 0x42, 0x0f, 0x3d, 0x8e, + 0x7a, 0x59, 0x70, 0x2f, + ], + memo: [ + 0xff, 0x61, 0x66, 0x81, 0x90, 0xbd, 0x52, 0xed, 0x49, 0x0e, 0x67, 0x7b, 0x51, 0x5d, + 0x01, 0x43, 0x84, 0xaf, 0x07, 0x21, 0x9c, 0x7c, 0x0e, 0xe7, 0xfc, 0x7b, 0xfc, 0x79, + 0xf3, 0x25, 0x64, 0x4e, 0x4d, 0xf4, 0xc0, 0xd7, 0xdb, 0x08, 0xe9, 0xf0, 0xbd, 0x02, + 0x49, 0x43, 0xc7, 0x05, 0xab, 0xff, 0x89, 0x94, 0xbf, 0xa6, 0x05, 0xcf, 0xbc, 0x7e, + 0xd7, 0x46, 0xa7, 0xd3, 0xf7, 0xc3, 0x7d, 0x9e, 0x8b, 0xdc, 0x43, 0x3b, 0x7d, 0x79, + 0xe0, 0x8a, 0x12, 0xf7, 0x38, 0xa8, 0xf0, 0xdb, 0xdd, 0xfe, 0xf2, 0xf2, 0x65, 0x7e, + 0xf3, 0xe4, 0x7d, 0x1b, 0x0f, 0xd1, 0x1e, 0x6a, 0x13, 0x31, 0x1f, 0xb7, 0x99, 0xc7, + 0x9c, 0x64, 0x1d, 0x9d, 0xa4, 0x3b, 0x33, 0xe7, 0xad, 0x01, 0x2e, 0x28, 0x25, 0x53, + 0x98, 0x78, 0x92, 0x62, 0x27, 0x5f, 0x11, 0x75, 0xbe, 0x84, 0x62, 0xc0, 0x14, 0x91, + 0xc4, 0xd8, 0x42, 0x40, 0x6d, 0x0e, 0xc4, 0x28, 0x2c, 0x95, 0x26, 0x17, 0x4a, 0x09, + 0x87, 0x8f, 0xe8, 0xfd, 0xde, 0x33, 0xa2, 0x96, 0x04, 0xe5, 0xe5, 0xe7, 0xb2, 0xa0, + 0x25, 0xd6, 0x65, 0x0b, 0x97, 0xdb, 0xb5, 0x2b, 0xef, 0xb5, 0x9b, 0x1d, 0x30, 0xa5, + 0x74, 0x33, 0xb0, 0xa3, 0x51, 0x47, 0x44, 0x44, 0x09, 0x9d, 0xaa, 0x37, 0x10, 0x46, + 0x61, 0x32, 0x60, 0xcf, 0x33, 0x54, 0xcf, 0xcd, 0xad, 0xa6, 0x63, 0xec, 0xe8, 0x24, + 0xff, 0xd7, 0xe4, 0x43, 0x93, 0x88, 0x6a, 0x86, 0x16, 0x5d, 0xdd, 0xdf, 0x2b, 0x4c, + 0x41, 0x77, 0x35, 0x54, 0xc8, 0x69, 0x95, 0x26, 0x94, 0x08, 0xb1, 0x1e, 0x67, 0x37, + 0xa4, 0xc4, 0x47, 0x58, 0x6f, 0x69, 0x17, 0x34, 0x46, 0xd8, 0xe4, 0x8b, 0xf8, 0x4c, + 0xbc, 0x00, 0x0a, 0x80, 0x78, 0x99, 0x97, 0x3e, 0xb9, 0x3c, 0x5e, 0x81, 0x9a, 0xad, + 0x66, 0x94, 0x13, 0xf8, 0x38, 0x79, 0x33, 0xad, 0x15, 0x84, 0xaa, 0x35, 0xe4, 0x3f, + 0x4e, 0xcd, 0x1e, 0x2d, 0x04, 0x07, 0xc0, 0xb1, 0xb8, 0x99, 0x20, 0xff, 0xdf, 0xdb, + 0x9b, 0xea, 0x51, 0xac, 0x95, 0xb5, 0x57, 0xaf, 0x71, 0xb8, 0x9f, 0x90, 0x3f, 0x5d, + 0x98, 0x48, 0xf1, 0x4f, 0xcb, 0xeb, 0x18, 0x37, 0x57, 0x0f, 0x54, 0x4d, 0x63, 0x59, + 0xeb, 0x23, 0xfa, 0xf3, 0x8a, 0x08, 0x22, 0xda, 0x36, 0xce, 0x42, 0x6c, 0x4a, 0x2f, + 0xbe, 0xff, 0xeb, 0x0a, 0x8a, 0x2e, 0x29, 0x7a, 0x9d, 0x19, 0xba, 0x15, 0x02, 0x45, + 0x90, 0xe3, 0x32, 0x9d, 0x9f, 0xa9, 0x26, 0x1f, 0x99, 0x38, 0xa4, 0x03, 0x2d, 0xd3, + 0x46, 0x06, 0xc9, 0xcf, 0x9f, 0x3d, 0xd3, 0x3e, 0x57, 0x6f, 0x05, 0xcd, 0x1d, 0xd6, + 0x81, 0x1c, 0x62, 0x98, 0x75, 0x7d, 0x77, 0xd9, 0xe8, 0x10, 0xab, 0xdb, 0x22, 0x6a, + 0xfc, 0xaa, 0x43, 0x46, 0xa6, 0x56, 0x0f, 0x89, 0x32, 0xb3, 0x18, 0x1f, 0xd3, 0x55, + 0xd5, 0xd3, 0x91, 0x97, 0x61, 0x83, 0xf8, 0xd9, 0x93, 0x88, 0x83, 0x96, 0x32, 0xd6, + 0x35, 0x4f, 0x66, 0x6d, 0x09, 0xd3, 0xe5, 0x62, 0x9e, 0xa1, 0x97, 0x37, 0x38, 0x86, + 0x13, 0xd3, 0x8a, 0x34, 0xfd, 0x0f, 0x6e, 0x50, 0xee, 0x5a, 0x0c, 0xc9, 0x67, 0x71, + 0x77, 0xf5, 0x00, 0x28, 0xc1, 0x41, 0x37, 0x81, 0x87, 0xbd, 0x28, 0x19, 0x40, 0x3f, + 0xc5, 0x34, 0xf8, 0x00, 0x76, 0xe9, 0x38, 0x0c, 0xb4, 0x96, 0x4d, 0x3b, 0x6b, 0x45, + 0x81, 0x9d, 0x3b, 0x8e, 0x9c, 0xaf, 0x54, 0xf0, 0x51, 0x85, 0x2d, 0x67, 0x1b, 0xf8, + 0xc1, 0xff, 0xde, 0x2d, 0x15, 0x10, 0x75, 0x64, 0x18, 0xcb, 0x48, 0x10, 0x93, 0x6a, + 0xa5, 0x7e, 0x69, 0x65, 0xd6, 0xfb, 0x65, 0x6a, 0x76, 0x0b, 0x7f, 0x19, 0xad, 0xf9, + 0x6c, 0x17, 0x34, 0x88, 0x55, 0x21, 0x93, 0xb1, + ], + cv_net: [ + 0xc3, 0x94, 0x68, 0x5d, 0x92, 0x95, 0x59, 0x7e, 0x21, 0x55, 0x7f, 0x21, 0x9f, 0x3c, + 0x9d, 0x5e, 0x64, 0x07, 0x19, 0xbc, 0xa5, 0xc8, 0xed, 0x49, 0x99, 0x97, 0x34, 0xe6, + 0xc5, 0xb3, 0x73, 0x3e, + ], + rho: [ + 0xc8, 0x8d, 0x00, 0x84, 0x84, 0xc5, 0xd7, 0x98, 0x20, 0xab, 0x68, 0xc6, 0x7d, 0x08, + 0x36, 0x72, 0xb0, 0x7f, 0x72, 0x7d, 0x44, 0xd0, 0xcd, 0x14, 0x73, 0x88, 0x00, 0xf8, + 0x25, 0xb9, 0xff, 0x16, + ], + cmx: [ + 0x0b, 0x74, 0x59, 0x61, 0x6f, 0xc6, 0x93, 0x95, 0xe6, 0x44, 0x36, 0xcf, 0x4a, 0xe9, + 0x44, 0x1d, 0x37, 0x4b, 0x29, 0x04, 0x9e, 0x4c, 0x86, 0x22, 0x3a, 0x03, 0x83, 0xf4, + 0xe0, 0x24, 0x69, 0x05, + ], + esk: [ + 0xc4, 0x92, 0x42, 0xce, 0xe7, 0xe0, 0x86, 0x8f, 0x2a, 0x75, 0xa1, 0xc4, 0x12, 0xbc, + 0x44, 0xd5, 0x4c, 0x97, 0x09, 0xf6, 0x59, 0xde, 0xd3, 0x26, 0x95, 0x72, 0x92, 0x93, + 0x59, 0xe0, 0x4c, 0x3a, + ], + ephemeral_key: [ + 0x0e, 0x04, 0xd8, 0x52, 0x5d, 0xd6, 0x8f, 0x7a, 0xe8, 0x68, 0xca, 0x81, 0x1e, 0x88, + 0x33, 0xa7, 0xf4, 0x7d, 0x7a, 0xad, 0xd3, 0x76, 0x03, 0xac, 0xe6, 0x07, 0xee, 0x6c, + 0x86, 0x6b, 0xce, 0x23, + ], + shared_secret: [ + 0x4a, 0x7a, 0x54, 0xac, 0x00, 0x41, 0x95, 0x98, 0xb0, 0x76, 0x01, 0x53, 0xe2, 0x6a, + 0xcc, 0xd2, 0x15, 0x05, 0x24, 0x16, 0x65, 0x17, 0x13, 0xee, 0xa1, 0x89, 0x19, 0xf3, + 0xe2, 0x62, 0xd3, 0xb6, + ], + k_enc: [ + 0x30, 0x62, 0x6d, 0x92, 0xeb, 0x62, 0x0f, 0xd4, 0xa9, 0x28, 0xb4, 0x3f, 0xd5, 0x50, + 0x69, 0x74, 0x71, 0x76, 0x7d, 0xe4, 0x49, 0x6c, 0xfd, 0xad, 0xb1, 0xda, 0x18, 0xfc, + 0x0c, 0xdd, 0x5a, 0xa6, + ], + p_enc: [ + 0x03, 0x08, 0xab, 0x2e, 0xe9, 0x9d, 0x4d, 0x9b, 0x98, 0x3d, 0xdd, 0x22, 0x47, 0xee, + 0x58, 0x85, 0x80, 0x33, 0xda, 0xc7, 0xd5, 0x07, 0xcd, 0xfe, 0x6f, 0xbd, 0xaa, 0x86, + 0x16, 0x3e, 0x9c, 0xf5, 0xde, 0x31, 0x00, 0xfb, 0xca, 0x7e, 0x8d, 0xa0, 0x47, 0xb0, + 0x90, 0xdb, 0x9f, 0x37, 0x95, 0x2f, 0xbf, 0xee, 0x76, 0xaf, 0x67, 0x43, 0xf9, 0x3a, + 0x6e, 0xbd, 0xa7, 0x2a, 0x8c, 0x7c, 0x5a, 0x2b, 0x7f, 0xa3, 0x04, 0xfe, 0x32, 0xb2, + 0x9b, 0x4f, 0x70, 0x6a, 0xa8, 0xf7, 0x42, 0x0f, 0x3d, 0x8e, 0x7a, 0x59, 0x70, 0x2f, + 0xff, 0x61, 0x66, 0x81, 0x90, 0xbd, 0x52, 0xed, 0x49, 0x0e, 0x67, 0x7b, 0x51, 0x5d, + 0x01, 0x43, 0x84, 0xaf, 0x07, 0x21, 0x9c, 0x7c, 0x0e, 0xe7, 0xfc, 0x7b, 0xfc, 0x79, + 0xf3, 0x25, 0x64, 0x4e, 0x4d, 0xf4, 0xc0, 0xd7, 0xdb, 0x08, 0xe9, 0xf0, 0xbd, 0x02, + 0x49, 0x43, 0xc7, 0x05, 0xab, 0xff, 0x89, 0x94, 0xbf, 0xa6, 0x05, 0xcf, 0xbc, 0x7e, + 0xd7, 0x46, 0xa7, 0xd3, 0xf7, 0xc3, 0x7d, 0x9e, 0x8b, 0xdc, 0x43, 0x3b, 0x7d, 0x79, + 0xe0, 0x8a, 0x12, 0xf7, 0x38, 0xa8, 0xf0, 0xdb, 0xdd, 0xfe, 0xf2, 0xf2, 0x65, 0x7e, + 0xf3, 0xe4, 0x7d, 0x1b, 0x0f, 0xd1, 0x1e, 0x6a, 0x13, 0x31, 0x1f, 0xb7, 0x99, 0xc7, + 0x9c, 0x64, 0x1d, 0x9d, 0xa4, 0x3b, 0x33, 0xe7, 0xad, 0x01, 0x2e, 0x28, 0x25, 0x53, + 0x98, 0x78, 0x92, 0x62, 0x27, 0x5f, 0x11, 0x75, 0xbe, 0x84, 0x62, 0xc0, 0x14, 0x91, + 0xc4, 0xd8, 0x42, 0x40, 0x6d, 0x0e, 0xc4, 0x28, 0x2c, 0x95, 0x26, 0x17, 0x4a, 0x09, + 0x87, 0x8f, 0xe8, 0xfd, 0xde, 0x33, 0xa2, 0x96, 0x04, 0xe5, 0xe5, 0xe7, 0xb2, 0xa0, + 0x25, 0xd6, 0x65, 0x0b, 0x97, 0xdb, 0xb5, 0x2b, 0xef, 0xb5, 0x9b, 0x1d, 0x30, 0xa5, + 0x74, 0x33, 0xb0, 0xa3, 0x51, 0x47, 0x44, 0x44, 0x09, 0x9d, 0xaa, 0x37, 0x10, 0x46, + 0x61, 0x32, 0x60, 0xcf, 0x33, 0x54, 0xcf, 0xcd, 0xad, 0xa6, 0x63, 0xec, 0xe8, 0x24, + 0xff, 0xd7, 0xe4, 0x43, 0x93, 0x88, 0x6a, 0x86, 0x16, 0x5d, 0xdd, 0xdf, 0x2b, 0x4c, + 0x41, 0x77, 0x35, 0x54, 0xc8, 0x69, 0x95, 0x26, 0x94, 0x08, 0xb1, 0x1e, 0x67, 0x37, + 0xa4, 0xc4, 0x47, 0x58, 0x6f, 0x69, 0x17, 0x34, 0x46, 0xd8, 0xe4, 0x8b, 0xf8, 0x4c, + 0xbc, 0x00, 0x0a, 0x80, 0x78, 0x99, 0x97, 0x3e, 0xb9, 0x3c, 0x5e, 0x81, 0x9a, 0xad, + 0x66, 0x94, 0x13, 0xf8, 0x38, 0x79, 0x33, 0xad, 0x15, 0x84, 0xaa, 0x35, 0xe4, 0x3f, + 0x4e, 0xcd, 0x1e, 0x2d, 0x04, 0x07, 0xc0, 0xb1, 0xb8, 0x99, 0x20, 0xff, 0xdf, 0xdb, + 0x9b, 0xea, 0x51, 0xac, 0x95, 0xb5, 0x57, 0xaf, 0x71, 0xb8, 0x9f, 0x90, 0x3f, 0x5d, + 0x98, 0x48, 0xf1, 0x4f, 0xcb, 0xeb, 0x18, 0x37, 0x57, 0x0f, 0x54, 0x4d, 0x63, 0x59, + 0xeb, 0x23, 0xfa, 0xf3, 0x8a, 0x08, 0x22, 0xda, 0x36, 0xce, 0x42, 0x6c, 0x4a, 0x2f, + 0xbe, 0xff, 0xeb, 0x0a, 0x8a, 0x2e, 0x29, 0x7a, 0x9d, 0x19, 0xba, 0x15, 0x02, 0x45, + 0x90, 0xe3, 0x32, 0x9d, 0x9f, 0xa9, 0x26, 0x1f, 0x99, 0x38, 0xa4, 0x03, 0x2d, 0xd3, + 0x46, 0x06, 0xc9, 0xcf, 0x9f, 0x3d, 0xd3, 0x3e, 0x57, 0x6f, 0x05, 0xcd, 0x1d, 0xd6, + 0x81, 0x1c, 0x62, 0x98, 0x75, 0x7d, 0x77, 0xd9, 0xe8, 0x10, 0xab, 0xdb, 0x22, 0x6a, + 0xfc, 0xaa, 0x43, 0x46, 0xa6, 0x56, 0x0f, 0x89, 0x32, 0xb3, 0x18, 0x1f, 0xd3, 0x55, + 0xd5, 0xd3, 0x91, 0x97, 0x61, 0x83, 0xf8, 0xd9, 0x93, 0x88, 0x83, 0x96, 0x32, 0xd6, + 0x35, 0x4f, 0x66, 0x6d, 0x09, 0xd3, 0xe5, 0x62, 0x9e, 0xa1, 0x97, 0x37, 0x38, 0x86, + 0x13, 0xd3, 0x8a, 0x34, 0xfd, 0x0f, 0x6e, 0x50, 0xee, 0x5a, 0x0c, 0xc9, 0x67, 0x71, + 0x77, 0xf5, 0x00, 0x28, 0xc1, 0x41, 0x37, 0x81, 0x87, 0xbd, 0x28, 0x19, 0x40, 0x3f, + 0xc5, 0x34, 0xf8, 0x00, 0x76, 0xe9, 0x38, 0x0c, 0xb4, 0x96, 0x4d, 0x3b, 0x6b, 0x45, + 0x81, 0x9d, 0x3b, 0x8e, 0x9c, 0xaf, 0x54, 0xf0, 0x51, 0x85, 0x2d, 0x67, 0x1b, 0xf8, + 0xc1, 0xff, 0xde, 0x2d, 0x15, 0x10, 0x75, 0x64, 0x18, 0xcb, 0x48, 0x10, 0x93, 0x6a, + 0xa5, 0x7e, 0x69, 0x65, 0xd6, 0xfb, 0x65, 0x6a, 0x76, 0x0b, 0x7f, 0x19, 0xad, 0xf9, + 0x6c, 0x17, 0x34, 0x88, 0x55, 0x21, 0x93, 0xb1, + ], + c_enc: [ + 0x80, 0x56, 0x2d, 0xbe, 0xf7, 0xbb, 0x35, 0x3a, 0x62, 0xe7, 0xc8, 0x1e, 0xbe, 0x68, + 0x15, 0x6c, 0xb7, 0x5c, 0x5c, 0x7e, 0x3d, 0x96, 0xbb, 0xcd, 0x7d, 0xaf, 0xf5, 0x0c, + 0xb0, 0x95, 0x7d, 0x33, 0xdd, 0x99, 0x77, 0x9f, 0x7d, 0x3d, 0x72, 0xb1, 0x8d, 0xeb, + 0x7a, 0x69, 0x75, 0x10, 0xe0, 0x13, 0x5b, 0x8d, 0xf4, 0x83, 0x3c, 0xf5, 0x82, 0xa1, + 0x4f, 0x08, 0xfc, 0xa9, 0xb3, 0x7a, 0xac, 0x85, 0x1f, 0xf9, 0xf5, 0x80, 0x5c, 0x57, + 0x74, 0x8a, 0x3f, 0xe8, 0x1b, 0x88, 0xc9, 0x8c, 0x96, 0xfd, 0x2a, 0x75, 0xc4, 0xf6, + 0x66, 0xb6, 0x1d, 0x20, 0x74, 0x06, 0x5c, 0xf4, 0x4a, 0x30, 0xa1, 0x98, 0xa2, 0x98, + 0xb7, 0xda, 0x42, 0x7c, 0x18, 0x60, 0x8a, 0x8f, 0x13, 0x83, 0x63, 0xf0, 0x55, 0x40, + 0x42, 0xd3, 0xe3, 0xa7, 0xe3, 0x22, 0x94, 0x51, 0x51, 0xc6, 0x3b, 0xb2, 0x37, 0xb3, + 0x20, 0xbc, 0x78, 0x0a, 0x8f, 0x9e, 0x01, 0xc6, 0x01, 0xf0, 0x34, 0xbc, 0xf0, 0x37, + 0x67, 0xd5, 0xd7, 0x50, 0x40, 0x2a, 0x23, 0x80, 0x0f, 0x46, 0xec, 0x08, 0x78, 0x0a, + 0x8f, 0x78, 0xe9, 0xa2, 0x37, 0xa9, 0xcb, 0x83, 0x06, 0x26, 0x1d, 0x1b, 0xb4, 0xc3, + 0xf6, 0x2e, 0xf4, 0xcb, 0x0f, 0x70, 0x34, 0x65, 0x32, 0x24, 0xfe, 0x77, 0x17, 0x9a, + 0x4d, 0x12, 0x15, 0x9a, 0x87, 0x66, 0xff, 0xc5, 0x9b, 0xee, 0x68, 0xd9, 0x74, 0xd2, + 0x27, 0x73, 0xe5, 0xca, 0x4f, 0x34, 0xf4, 0x62, 0x73, 0xa4, 0x46, 0x33, 0x69, 0xb1, + 0x76, 0xa6, 0x1f, 0x1e, 0x47, 0x8c, 0x2d, 0x3c, 0x4e, 0x42, 0x70, 0x13, 0xe5, 0xd8, + 0x69, 0x75, 0xea, 0x91, 0x93, 0x05, 0x0e, 0x52, 0xa7, 0x02, 0x6f, 0x76, 0x96, 0x4c, + 0xa0, 0x18, 0x15, 0x9b, 0xdc, 0x19, 0x6c, 0x44, 0xca, 0xd2, 0xd2, 0x62, 0x3d, 0x33, + 0x50, 0x7e, 0xf0, 0xfe, 0xc1, 0x0f, 0x9d, 0x80, 0xb2, 0x08, 0xe3, 0xc3, 0x3f, 0x7d, + 0x50, 0x76, 0x41, 0x63, 0xb3, 0xf0, 0x33, 0x29, 0xad, 0x41, 0xeb, 0x5a, 0x4f, 0xb4, + 0xf3, 0xab, 0x8e, 0xef, 0x2d, 0xa5, 0xcb, 0x3a, 0x7c, 0x86, 0x22, 0x16, 0x48, 0x70, + 0xa8, 0x2c, 0x63, 0x5d, 0x23, 0x51, 0x53, 0x9b, 0x97, 0x3c, 0x40, 0xd5, 0x8e, 0x91, + 0x79, 0x43, 0x6b, 0x9c, 0x0b, 0x74, 0xfd, 0x5e, 0xab, 0x81, 0x49, 0x59, 0xd2, 0x80, + 0xea, 0x3f, 0x8e, 0x09, 0xd8, 0x44, 0x2f, 0xea, 0x4a, 0xdc, 0x8c, 0xc9, 0xc2, 0xfe, + 0x50, 0xef, 0xad, 0x2e, 0xe1, 0x9a, 0xb5, 0x85, 0x7a, 0x2d, 0x2f, 0xb1, 0xd1, 0x13, + 0x67, 0x08, 0x22, 0xb9, 0x57, 0x95, 0xa3, 0x4d, 0x20, 0xf7, 0xc6, 0x37, 0xf8, 0xdc, + 0xcf, 0xe7, 0x35, 0x52, 0xfd, 0x34, 0x17, 0x6a, 0xbf, 0x0f, 0x8e, 0x3c, 0xfa, 0x70, + 0xbe, 0xc8, 0x84, 0x4b, 0x87, 0xb1, 0x44, 0xcb, 0x99, 0xb0, 0xb0, 0x9b, 0x47, 0xc6, + 0x62, 0xdd, 0x70, 0x5e, 0x4d, 0x74, 0xc1, 0x5d, 0x47, 0x42, 0x98, 0x33, 0xe7, 0x80, + 0x5d, 0x88, 0x40, 0x46, 0xc0, 0xd9, 0x36, 0xc8, 0x72, 0x32, 0xcd, 0xc9, 0x53, 0xbf, + 0x6e, 0x61, 0x93, 0xb4, 0xcf, 0x67, 0x81, 0x12, 0x8e, 0xbe, 0x7a, 0x51, 0xdb, 0x9b, + 0x36, 0x67, 0x38, 0x08, 0xad, 0x77, 0x18, 0xe2, 0x50, 0xcb, 0x51, 0x15, 0x85, 0xf6, + 0xbc, 0x09, 0x78, 0xbd, 0x17, 0xe4, 0x71, 0x7e, 0xa4, 0x19, 0x3d, 0x09, 0x5d, 0x22, + 0x2b, 0xa1, 0xb2, 0xf9, 0xd8, 0x18, 0x98, 0x1d, 0xf1, 0x72, 0xa4, 0x91, 0xd8, 0x41, + 0xbc, 0x73, 0xec, 0x17, 0x93, 0x41, 0xa2, 0x8f, 0x03, 0x8a, 0xa3, 0xe4, 0xc8, 0x65, + 0x24, 0x11, 0xf1, 0x85, 0xa6, 0x49, 0x92, 0xa6, 0xce, 0xa6, 0xc4, 0x5c, 0x70, 0xe9, + 0xd6, 0x64, 0x69, 0x4b, 0xc9, 0x44, 0x1f, 0x29, 0xc4, 0x81, 0x81, 0x5a, 0x82, 0xb3, + 0xa3, 0x30, 0xc9, 0x6c, 0x05, 0xfc, 0x9c, 0x48, 0x5a, 0xe8, 0xd9, 0x96, 0xb6, 0xf9, + 0xf6, 0x87, 0xf3, 0x90, 0x1f, 0x74, 0x0a, 0xc8, 0x9a, 0xb2, 0x42, 0xf2, 0xaa, 0x0c, + 0xe7, 0xb0, 0xeb, 0x14, 0xb4, 0x2d, 0x65, 0xba, 0xd9, 0xfe, 0x5c, 0xe2, 0x91, 0xa2, + 0x2c, 0xb1, 0xff, 0xdf, 0xdf, 0x27, 0x30, 0xd6, 0x8f, 0x68, 0x2d, 0xe0, 0xf9, 0xf3, + 0xa3, 0x04, 0xf5, 0x0c, 0x4f, 0xfd, 0xf9, 0x58, 0x30, 0x6c, 0x11, 0xa2, 0x91, 0x70, + 0xdd, 0xae, 0x90, 0x65, 0xcc, 0xc9, 0xd4, 0xd2, 0x77, 0x62, 0x6e, 0x78, 0x81, 0x72, + 0x3a, 0xe1, 0x72, 0xff, 0x09, 0xdb, 0x09, 0x38, 0x6f, 0x9e, + ], + ock: [ + 0xb6, 0x36, 0xc3, 0x9a, 0x6b, 0xad, 0x22, 0x63, 0xb2, 0x44, 0x1e, 0xd5, 0xbb, 0xdb, + 0x01, 0x35, 0x88, 0xfb, 0x46, 0x27, 0x01, 0xe6, 0xf8, 0x76, 0x64, 0x6c, 0x8c, 0x17, + 0xfa, 0x2e, 0xfd, 0xe8, + ], + op: [ + 0x82, 0xfe, 0xf6, 0x43, 0xdb, 0xf4, 0x2d, 0xca, 0x51, 0x56, 0xfb, 0x51, 0xd4, 0xc4, + 0xee, 0x00, 0x8a, 0x72, 0xf0, 0xdb, 0xc3, 0xf3, 0x1e, 0xfa, 0xb0, 0x75, 0xf2, 0x75, + 0x15, 0x37, 0x14, 0x0d, 0xc4, 0x92, 0x42, 0xce, 0xe7, 0xe0, 0x86, 0x8f, 0x2a, 0x75, + 0xa1, 0xc4, 0x12, 0xbc, 0x44, 0xd5, 0x4c, 0x97, 0x09, 0xf6, 0x59, 0xde, 0xd3, 0x26, + 0x95, 0x72, 0x92, 0x93, 0x59, 0xe0, 0x4c, 0x3a, + ], + c_out: [ + 0x46, 0xba, 0x14, 0xf8, 0x3f, 0xf5, 0xab, 0x76, 0x0f, 0x14, 0x20, 0xeb, 0xde, 0xd9, + 0x86, 0xfd, 0x93, 0x78, 0x27, 0xbc, 0x05, 0x69, 0x2e, 0xca, 0xdb, 0x65, 0x2e, 0xbb, + 0xc8, 0xf6, 0xd9, 0xb5, 0x2e, 0xc3, 0x97, 0x87, 0xd8, 0xeb, 0xdd, 0x50, 0x6c, 0xa1, + 0xa8, 0x5d, 0xc3, 0xd5, 0xba, 0x4c, 0x5b, 0x41, 0x52, 0x61, 0xb0, 0x75, 0x3a, 0xc1, + 0x0e, 0x01, 0x86, 0x45, 0x32, 0xa3, 0x57, 0x2c, 0x68, 0xaf, 0xe4, 0x0a, 0xc3, 0xc0, + 0x95, 0x7b, 0x7a, 0xfc, 0x23, 0xfd, 0x5e, 0x05, 0x17, 0xaa, + ], + }, + TestVector { + incoming_viewing_key: [ + 0xf1, 0x90, 0x42, 0xb9, 0xd1, 0x0c, 0xc4, 0x80, 0xa0, 0x8c, 0x04, 0x32, 0x2d, 0xb6, + 0xec, 0x4e, 0x41, 0x2e, 0xaa, 0x84, 0xc9, 0x71, 0x82, 0x8c, 0xcc, 0xd7, 0x33, 0xa1, + 0x1f, 0x25, 0x3e, 0xda, 0x8a, 0xc3, 0x0b, 0xa3, 0x1f, 0xbc, 0x89, 0x5d, 0x60, 0xb9, + 0x83, 0x06, 0x2a, 0x5f, 0x45, 0x33, 0x90, 0x79, 0x32, 0x26, 0xff, 0xd9, 0x21, 0xbd, + 0x64, 0xac, 0x39, 0x07, 0x03, 0x85, 0x6a, 0x0b, + ], + ovk: [ + 0xda, 0xdc, 0x96, 0x6c, 0x8a, 0x54, 0x66, 0xb6, 0x1f, 0xc9, 0x98, 0xc3, 0x1f, 0x10, + 0x70, 0xd9, 0xa5, 0xc9, 0xa6, 0xd2, 0x68, 0xd3, 0x04, 0xfe, 0x6b, 0x8f, 0xd3, 0xb4, + 0x01, 0x03, 0x48, 0x61, + ], + default_d: [ + 0xaa, 0x14, 0x92, 0x9c, 0x57, 0x89, 0x85, 0x85, 0xce, 0x66, 0x5a, + ], + default_pk_d: [ + 0x78, 0xa4, 0xe3, 0x39, 0x88, 0xd7, 0x1d, 0x71, 0x8e, 0x59, 0x55, 0x55, 0x28, 0x4c, + 0x24, 0x9a, 0x62, 0xb7, 0x12, 0x88, 0x06, 0xa5, 0x4c, 0x3b, 0x36, 0xa3, 0xaa, 0x57, + 0x14, 0x93, 0x16, 0x36, + ], + v: 17936016275122962426, + rseed: [ + 0x49, 0x95, 0x0a, 0xfc, 0xb0, 0xef, 0x46, 0x2a, 0x2a, 0xe0, 0x24, 0xb0, 0xf0, 0x22, + 0x4d, 0xfd, 0x73, 0x68, 0x4b, 0x88, 0xc7, 0xfb, 0xe9, 0x2d, 0x02, 0xb6, 0x8f, 0x75, + 0x9c, 0x47, 0x52, 0x66, + ], + asset: [ + 0x67, 0x43, 0xf9, 0x3a, 0x6e, 0xbd, 0xa7, 0x2a, 0x8c, 0x7c, 0x5a, 0x2b, 0x7f, 0xa3, + 0x04, 0xfe, 0x32, 0xb2, 0x9b, 0x4f, 0x70, 0x6a, 0xa8, 0xf7, 0x42, 0x0f, 0x3d, 0x8e, + 0x7a, 0x59, 0x70, 0x2f, + ], + memo: [ + 0xff, 0x3c, 0xd7, 0xb9, 0x7a, 0x14, 0x94, 0x36, 0x49, 0x30, 0x55, 0x21, 0x32, 0x6b, + 0xde, 0x08, 0x56, 0x30, 0x86, 0x46, 0x29, 0x29, 0x1b, 0xae, 0x25, 0xff, 0x88, 0x22, + 0xa1, 0x4c, 0x4b, 0x66, 0x6a, 0x92, 0x59, 0xad, 0x0d, 0xc4, 0x2a, 0x82, 0x90, 0xac, + 0x7b, 0xc7, 0xf5, 0x3a, 0x16, 0xf3, 0x79, 0xf7, 0x58, 0xe5, 0xde, 0x75, 0x0f, 0x04, + 0xfd, 0x7c, 0xad, 0x47, 0x70, 0x1c, 0x85, 0x97, 0xf9, 0x78, 0x88, 0xbe, 0xa6, 0xfa, + 0x0b, 0xf2, 0x99, 0x99, 0x56, 0xfb, 0xfd, 0x0e, 0xe6, 0x8e, 0xc3, 0x6e, 0x46, 0x88, + 0x80, 0x9a, 0xe2, 0x31, 0xeb, 0x8b, 0xc4, 0x36, 0x9f, 0x5f, 0xe1, 0x57, 0x3f, 0x57, + 0xe0, 0x99, 0xd9, 0xc0, 0x99, 0x01, 0xbf, 0x39, 0xca, 0xac, 0x48, 0xdc, 0x11, 0x95, + 0x6a, 0x8a, 0xe9, 0x05, 0xea, 0xd8, 0x69, 0x54, 0x54, 0x7c, 0x44, 0x8a, 0xe4, 0x3d, + 0x31, 0x5e, 0x66, 0x9c, 0x42, 0x42, 0xda, 0x56, 0x59, 0x38, 0xf4, 0x17, 0xbf, 0x43, + 0xce, 0x7b, 0x2b, 0x30, 0xb1, 0xcd, 0x40, 0x18, 0x38, 0x8e, 0x1a, 0x91, 0x0f, 0x0f, + 0xc4, 0x1f, 0xb0, 0x87, 0x7a, 0x59, 0x25, 0xe4, 0x66, 0x81, 0x9d, 0x37, 0x5b, 0x0a, + 0x91, 0x2d, 0x4f, 0xe8, 0x43, 0xb7, 0x6e, 0xf6, 0xf2, 0x23, 0xf0, 0xf7, 0xc8, 0x94, + 0xf3, 0x8f, 0x7a, 0xb7, 0x80, 0xdf, 0xd7, 0x5f, 0x66, 0x9c, 0x8c, 0x06, 0xcf, 0xfa, + 0x43, 0xeb, 0x47, 0x56, 0x5a, 0x50, 0xe3, 0xb1, 0xfa, 0x45, 0xad, 0x61, 0xce, 0x9a, + 0x1c, 0x47, 0x27, 0xb7, 0xaa, 0xa5, 0x35, 0x62, 0xf5, 0x23, 0xe7, 0x39, 0x52, 0xbb, + 0xf3, 0x3d, 0x8a, 0x41, 0x04, 0x07, 0x8a, 0xde, 0x3e, 0xaa, 0xa4, 0x96, 0x99, 0xa6, + 0x9f, 0xdf, 0x1c, 0x5a, 0xc7, 0x73, 0x21, 0x46, 0xee, 0x5e, 0x1d, 0x6b, 0x6c, 0xa9, + 0xb9, 0x18, 0x0f, 0x96, 0x4c, 0xc9, 0xd0, 0x87, 0x8a, 0xe1, 0x37, 0x35, 0x24, 0xd7, + 0xd5, 0x10, 0xe5, 0x82, 0x27, 0xdf, 0x6d, 0xe9, 0xd3, 0x0d, 0x27, 0x18, 0x67, 0x64, + 0x01, 0x77, 0xb0, 0xf1, 0x85, 0x6e, 0x28, 0xd5, 0xc8, 0xaf, 0xb0, 0x95, 0xef, 0x61, + 0x84, 0xfe, 0xd6, 0x51, 0x58, 0x90, 0x22, 0xee, 0xae, 0xa4, 0xc0, 0xce, 0x1f, 0xa6, + 0xf0, 0x85, 0x09, 0x2b, 0x04, 0x97, 0x94, 0x89, 0x17, 0x2b, 0x3e, 0xf8, 0x19, 0x4a, + 0x79, 0x8d, 0xf5, 0x72, 0x4d, 0x6b, 0x05, 0xf1, 0xae, 0x00, 0x00, 0x13, 0xa0, 0x8d, + 0x61, 0x2b, 0xca, 0x8a, 0x8c, 0x31, 0x44, 0x3c, 0x10, 0x34, 0x6d, 0xbf, 0x61, 0xde, + 0x84, 0x75, 0xc0, 0xbb, 0xec, 0x51, 0x04, 0xb4, 0x75, 0x56, 0xaf, 0x3d, 0x51, 0x44, + 0x58, 0xe2, 0x32, 0x1d, 0x14, 0x60, 0x71, 0x78, 0x9d, 0x23, 0x35, 0x93, 0x4a, 0x68, + 0x06, 0x14, 0xe8, 0x35, 0x62, 0xf8, 0x2d, 0xfd, 0x40, 0x5b, 0x54, 0xa4, 0x5e, 0xb3, + 0x2c, 0x16, 0x54, 0x48, 0xd4, 0xd5, 0xd6, 0x1c, 0xa2, 0x85, 0x95, 0x85, 0x36, 0x9f, + 0x53, 0xf1, 0xa1, 0x37, 0xe9, 0xe8, 0x2b, 0x67, 0xb8, 0xfd, 0xaf, 0x01, 0xbd, 0xa5, + 0x4a, 0x31, 0x73, 0x11, 0x89, 0x6a, 0xe1, 0x02, 0x80, 0xa0, 0x32, 0x44, 0x0c, 0x42, + 0x0a, 0x42, 0x1e, 0x94, 0x4d, 0x1e, 0x95, 0x2b, 0x70, 0xd5, 0x82, 0x6c, 0xd3, 0xb0, + 0x8b, 0x7d, 0xb9, 0x63, 0x0f, 0xe4, 0xfd, 0x5f, 0x22, 0x12, 0x5d, 0xe8, 0x40, 0xfc, + 0xc4, 0x0b, 0x98, 0x03, 0x8a, 0xf1, 0x1d, 0x55, 0xbe, 0x25, 0x43, 0x25, 0x97, 0xb4, + 0xb6, 0x5b, 0x9e, 0xc1, 0xc7, 0xa8, 0xbb, 0xfd, 0x05, 0x2c, 0xbf, 0x7e, 0x1c, 0x17, + 0x85, 0x31, 0x49, 0x34, 0xb2, 0x62, 0xd5, 0x85, 0x37, 0x54, 0xf1, 0xf1, 0x77, 0x71, + 0xcf, 0xb7, 0x50, 0x30, 0x72, 0x65, 0x57, 0x53, + ], + cv_net: [ + 0xd4, 0x51, 0xb4, 0x62, 0x89, 0xba, 0x99, 0x8c, 0x0c, 0xce, 0xd1, 0xcc, 0x15, 0xb3, + 0xfa, 0xde, 0x94, 0xfa, 0x0b, 0x46, 0xe3, 0xb1, 0xa5, 0x73, 0x34, 0x99, 0x34, 0xe2, + 0x32, 0xb5, 0x0e, 0x96, + ], + rho: [ + 0xa9, 0x0a, 0x9b, 0x8a, 0xb1, 0x35, 0x9d, 0xc9, 0x6b, 0xda, 0xe9, 0x0e, 0x52, 0x74, + 0x78, 0x8c, 0xb0, 0xc4, 0x26, 0xef, 0xf2, 0x60, 0x43, 0x61, 0x85, 0x39, 0x8b, 0xff, + 0xf5, 0x0e, 0x92, 0x37, + ], + cmx: [ + 0x05, 0xb5, 0xe3, 0x20, 0x76, 0xda, 0xe0, 0x94, 0x83, 0x35, 0xac, 0x3d, 0x65, 0x1c, + 0x6d, 0xbe, 0xa6, 0x4c, 0xe9, 0x11, 0x42, 0x3e, 0x2f, 0x2c, 0x7c, 0x1b, 0xdf, 0xa6, + 0xb1, 0x41, 0x41, 0x30, + ], + esk: [ + 0x8b, 0x14, 0x62, 0x2d, 0x2f, 0x91, 0xf1, 0x69, 0x8d, 0x53, 0xfe, 0x47, 0x9a, 0x1e, + 0x5c, 0x00, 0x64, 0x98, 0xb9, 0x8b, 0x85, 0xb4, 0x50, 0xbd, 0x92, 0x3a, 0x5d, 0x00, + 0xcb, 0x52, 0xa6, 0x13, + ], + ephemeral_key: [ + 0x86, 0xee, 0x66, 0xa6, 0xc7, 0xd9, 0xb5, 0xc4, 0xf0, 0xe2, 0xd2, 0xa0, 0xe1, 0x56, + 0x1e, 0x2a, 0xfa, 0x55, 0x41, 0xa7, 0x24, 0xee, 0x02, 0x7f, 0xc7, 0x0b, 0xb7, 0xe8, + 0x0a, 0x2c, 0x60, 0x98, + ], + shared_secret: [ + 0x88, 0xd1, 0x38, 0x2c, 0x14, 0x42, 0x02, 0xd0, 0xd7, 0x55, 0x75, 0x87, 0xb0, 0xd5, + 0xd0, 0x21, 0x69, 0x29, 0x2a, 0x25, 0x05, 0x43, 0xcb, 0x0a, 0x06, 0xc3, 0x4f, 0x45, + 0x2f, 0x7b, 0x3b, 0x36, + ], + k_enc: [ + 0xe3, 0x73, 0xd8, 0x6e, 0xc9, 0xdd, 0xdd, 0x64, 0x5d, 0x9a, 0x6d, 0x06, 0xef, 0xce, + 0x22, 0xb8, 0x96, 0x42, 0x1d, 0x57, 0xa4, 0x4d, 0x37, 0xa6, 0x50, 0x4a, 0x5d, 0x19, + 0xdf, 0x21, 0x73, 0x73, + ], + p_enc: [ + 0x03, 0xaa, 0x14, 0x92, 0x9c, 0x57, 0x89, 0x85, 0x85, 0xce, 0x66, 0x5a, 0xfa, 0x3f, + 0x54, 0xec, 0xc5, 0x87, 0xe9, 0xf8, 0x49, 0x95, 0x0a, 0xfc, 0xb0, 0xef, 0x46, 0x2a, + 0x2a, 0xe0, 0x24, 0xb0, 0xf0, 0x22, 0x4d, 0xfd, 0x73, 0x68, 0x4b, 0x88, 0xc7, 0xfb, + 0xe9, 0x2d, 0x02, 0xb6, 0x8f, 0x75, 0x9c, 0x47, 0x52, 0x66, 0x67, 0x43, 0xf9, 0x3a, + 0x6e, 0xbd, 0xa7, 0x2a, 0x8c, 0x7c, 0x5a, 0x2b, 0x7f, 0xa3, 0x04, 0xfe, 0x32, 0xb2, + 0x9b, 0x4f, 0x70, 0x6a, 0xa8, 0xf7, 0x42, 0x0f, 0x3d, 0x8e, 0x7a, 0x59, 0x70, 0x2f, + 0xff, 0x3c, 0xd7, 0xb9, 0x7a, 0x14, 0x94, 0x36, 0x49, 0x30, 0x55, 0x21, 0x32, 0x6b, + 0xde, 0x08, 0x56, 0x30, 0x86, 0x46, 0x29, 0x29, 0x1b, 0xae, 0x25, 0xff, 0x88, 0x22, + 0xa1, 0x4c, 0x4b, 0x66, 0x6a, 0x92, 0x59, 0xad, 0x0d, 0xc4, 0x2a, 0x82, 0x90, 0xac, + 0x7b, 0xc7, 0xf5, 0x3a, 0x16, 0xf3, 0x79, 0xf7, 0x58, 0xe5, 0xde, 0x75, 0x0f, 0x04, + 0xfd, 0x7c, 0xad, 0x47, 0x70, 0x1c, 0x85, 0x97, 0xf9, 0x78, 0x88, 0xbe, 0xa6, 0xfa, + 0x0b, 0xf2, 0x99, 0x99, 0x56, 0xfb, 0xfd, 0x0e, 0xe6, 0x8e, 0xc3, 0x6e, 0x46, 0x88, + 0x80, 0x9a, 0xe2, 0x31, 0xeb, 0x8b, 0xc4, 0x36, 0x9f, 0x5f, 0xe1, 0x57, 0x3f, 0x57, + 0xe0, 0x99, 0xd9, 0xc0, 0x99, 0x01, 0xbf, 0x39, 0xca, 0xac, 0x48, 0xdc, 0x11, 0x95, + 0x6a, 0x8a, 0xe9, 0x05, 0xea, 0xd8, 0x69, 0x54, 0x54, 0x7c, 0x44, 0x8a, 0xe4, 0x3d, + 0x31, 0x5e, 0x66, 0x9c, 0x42, 0x42, 0xda, 0x56, 0x59, 0x38, 0xf4, 0x17, 0xbf, 0x43, + 0xce, 0x7b, 0x2b, 0x30, 0xb1, 0xcd, 0x40, 0x18, 0x38, 0x8e, 0x1a, 0x91, 0x0f, 0x0f, + 0xc4, 0x1f, 0xb0, 0x87, 0x7a, 0x59, 0x25, 0xe4, 0x66, 0x81, 0x9d, 0x37, 0x5b, 0x0a, + 0x91, 0x2d, 0x4f, 0xe8, 0x43, 0xb7, 0x6e, 0xf6, 0xf2, 0x23, 0xf0, 0xf7, 0xc8, 0x94, + 0xf3, 0x8f, 0x7a, 0xb7, 0x80, 0xdf, 0xd7, 0x5f, 0x66, 0x9c, 0x8c, 0x06, 0xcf, 0xfa, + 0x43, 0xeb, 0x47, 0x56, 0x5a, 0x50, 0xe3, 0xb1, 0xfa, 0x45, 0xad, 0x61, 0xce, 0x9a, + 0x1c, 0x47, 0x27, 0xb7, 0xaa, 0xa5, 0x35, 0x62, 0xf5, 0x23, 0xe7, 0x39, 0x52, 0xbb, + 0xf3, 0x3d, 0x8a, 0x41, 0x04, 0x07, 0x8a, 0xde, 0x3e, 0xaa, 0xa4, 0x96, 0x99, 0xa6, + 0x9f, 0xdf, 0x1c, 0x5a, 0xc7, 0x73, 0x21, 0x46, 0xee, 0x5e, 0x1d, 0x6b, 0x6c, 0xa9, + 0xb9, 0x18, 0x0f, 0x96, 0x4c, 0xc9, 0xd0, 0x87, 0x8a, 0xe1, 0x37, 0x35, 0x24, 0xd7, + 0xd5, 0x10, 0xe5, 0x82, 0x27, 0xdf, 0x6d, 0xe9, 0xd3, 0x0d, 0x27, 0x18, 0x67, 0x64, + 0x01, 0x77, 0xb0, 0xf1, 0x85, 0x6e, 0x28, 0xd5, 0xc8, 0xaf, 0xb0, 0x95, 0xef, 0x61, + 0x84, 0xfe, 0xd6, 0x51, 0x58, 0x90, 0x22, 0xee, 0xae, 0xa4, 0xc0, 0xce, 0x1f, 0xa6, + 0xf0, 0x85, 0x09, 0x2b, 0x04, 0x97, 0x94, 0x89, 0x17, 0x2b, 0x3e, 0xf8, 0x19, 0x4a, + 0x79, 0x8d, 0xf5, 0x72, 0x4d, 0x6b, 0x05, 0xf1, 0xae, 0x00, 0x00, 0x13, 0xa0, 0x8d, + 0x61, 0x2b, 0xca, 0x8a, 0x8c, 0x31, 0x44, 0x3c, 0x10, 0x34, 0x6d, 0xbf, 0x61, 0xde, + 0x84, 0x75, 0xc0, 0xbb, 0xec, 0x51, 0x04, 0xb4, 0x75, 0x56, 0xaf, 0x3d, 0x51, 0x44, + 0x58, 0xe2, 0x32, 0x1d, 0x14, 0x60, 0x71, 0x78, 0x9d, 0x23, 0x35, 0x93, 0x4a, 0x68, + 0x06, 0x14, 0xe8, 0x35, 0x62, 0xf8, 0x2d, 0xfd, 0x40, 0x5b, 0x54, 0xa4, 0x5e, 0xb3, + 0x2c, 0x16, 0x54, 0x48, 0xd4, 0xd5, 0xd6, 0x1c, 0xa2, 0x85, 0x95, 0x85, 0x36, 0x9f, + 0x53, 0xf1, 0xa1, 0x37, 0xe9, 0xe8, 0x2b, 0x67, 0xb8, 0xfd, 0xaf, 0x01, 0xbd, 0xa5, + 0x4a, 0x31, 0x73, 0x11, 0x89, 0x6a, 0xe1, 0x02, 0x80, 0xa0, 0x32, 0x44, 0x0c, 0x42, + 0x0a, 0x42, 0x1e, 0x94, 0x4d, 0x1e, 0x95, 0x2b, 0x70, 0xd5, 0x82, 0x6c, 0xd3, 0xb0, + 0x8b, 0x7d, 0xb9, 0x63, 0x0f, 0xe4, 0xfd, 0x5f, 0x22, 0x12, 0x5d, 0xe8, 0x40, 0xfc, + 0xc4, 0x0b, 0x98, 0x03, 0x8a, 0xf1, 0x1d, 0x55, 0xbe, 0x25, 0x43, 0x25, 0x97, 0xb4, + 0xb6, 0x5b, 0x9e, 0xc1, 0xc7, 0xa8, 0xbb, 0xfd, 0x05, 0x2c, 0xbf, 0x7e, 0x1c, 0x17, + 0x85, 0x31, 0x49, 0x34, 0xb2, 0x62, 0xd5, 0x85, 0x37, 0x54, 0xf1, 0xf1, 0x77, 0x71, + 0xcf, 0xb7, 0x50, 0x30, 0x72, 0x65, 0x57, 0x53, + ], + c_enc: [ + 0xe6, 0x67, 0x81, 0xae, 0x63, 0x84, 0x1f, 0xff, 0xea, 0x30, 0x21, 0x96, 0x15, 0x94, + 0xc2, 0x2a, 0x87, 0x20, 0xc7, 0xd8, 0xaa, 0x80, 0x8b, 0xc8, 0x6e, 0x71, 0xa3, 0x6a, + 0xd7, 0xf8, 0x6f, 0xf8, 0x7c, 0x07, 0xd3, 0xc6, 0x50, 0xa0, 0x8e, 0x23, 0xe9, 0xb5, + 0x4f, 0x00, 0xb4, 0x0b, 0xa0, 0x15, 0x91, 0x69, 0xdf, 0xca, 0xac, 0xbe, 0x6e, 0x4d, + 0x87, 0xe9, 0x2a, 0xae, 0x2f, 0xe4, 0xe5, 0x8e, 0x78, 0x48, 0x69, 0xa9, 0x70, 0x68, + 0x4c, 0x9b, 0x87, 0xc9, 0xa1, 0xa0, 0xcc, 0x39, 0xb3, 0xbc, 0xce, 0xf4, 0x7c, 0xd7, + 0x6c, 0x23, 0x97, 0xb1, 0x43, 0x39, 0x5a, 0xd5, 0xbd, 0x5f, 0xe4, 0x22, 0x2c, 0x05, + 0xee, 0xb7, 0xc2, 0x0a, 0x5d, 0x0c, 0x35, 0xf0, 0x3a, 0xa2, 0xa6, 0xba, 0xfa, 0xdf, + 0x36, 0x3b, 0x1b, 0xa1, 0x5f, 0x8e, 0x75, 0x17, 0x79, 0x32, 0x03, 0xba, 0x09, 0x0e, + 0xda, 0x67, 0x1a, 0xcf, 0x48, 0xba, 0xaf, 0x8a, 0x6c, 0x1d, 0x55, 0xac, 0x76, 0x0b, + 0x10, 0xa0, 0x85, 0xb2, 0xe8, 0x33, 0xeb, 0x03, 0xb2, 0xbb, 0xd5, 0x21, 0x46, 0xd2, + 0x73, 0x19, 0xcc, 0x97, 0x13, 0x70, 0x14, 0xe7, 0x83, 0xac, 0xb6, 0x40, 0x27, 0xb6, + 0xea, 0x33, 0xa7, 0x1e, 0x54, 0xab, 0xb0, 0xe3, 0xf6, 0x05, 0x39, 0x10, 0xce, 0x33, + 0xa1, 0xc2, 0xde, 0x27, 0xd5, 0x80, 0x1a, 0x0d, 0xfc, 0x95, 0x28, 0xf8, 0x17, 0xb1, + 0x24, 0x88, 0x05, 0x62, 0xb7, 0x1f, 0xb9, 0x91, 0xd4, 0x1d, 0x2b, 0x4a, 0x20, 0x3b, + 0x3b, 0x20, 0x97, 0x55, 0xb6, 0x16, 0x8a, 0x99, 0x8c, 0xea, 0xb0, 0x2b, 0x21, 0x1e, + 0x49, 0xfe, 0x6a, 0xb1, 0x3a, 0x9a, 0x38, 0x83, 0xfe, 0xca, 0xfa, 0x87, 0x6d, 0xb2, + 0xbe, 0x99, 0x1a, 0x0a, 0xab, 0xb9, 0xf1, 0x50, 0xd5, 0xf1, 0xbf, 0xfc, 0x75, 0xbf, + 0x4d, 0xd0, 0xcf, 0x15, 0x09, 0xe5, 0x6b, 0x7e, 0xc8, 0x37, 0xdb, 0x74, 0xd1, 0xcb, + 0x2a, 0x10, 0x45, 0x1e, 0x1c, 0x04, 0xdd, 0xf9, 0x5b, 0x17, 0x20, 0x00, 0x94, 0x52, + 0xc5, 0x55, 0x86, 0x96, 0x35, 0x0e, 0xfd, 0xbf, 0x38, 0xc3, 0xde, 0x29, 0x98, 0x09, + 0x7c, 0xa7, 0xac, 0xd7, 0x09, 0x9a, 0x73, 0x94, 0x73, 0xc2, 0x07, 0x85, 0x89, 0xe7, + 0x18, 0xf9, 0x20, 0xad, 0xeb, 0xd6, 0xcb, 0x6e, 0xb1, 0x2e, 0x3f, 0xd2, 0x29, 0x47, + 0xa7, 0x6d, 0x19, 0x17, 0x45, 0xa6, 0xa9, 0x73, 0xc8, 0xb8, 0x4e, 0x9c, 0xd3, 0x30, + 0x7e, 0x47, 0x88, 0x81, 0xe9, 0x79, 0x8f, 0xd6, 0x66, 0x57, 0xec, 0xe5, 0xe0, 0x89, + 0xd6, 0x62, 0x71, 0x18, 0xc1, 0x1b, 0xa4, 0x01, 0xb0, 0x17, 0xdb, 0x2d, 0x6f, 0xf4, + 0x42, 0x10, 0xdb, 0x3e, 0x05, 0xaf, 0xe3, 0x10, 0x18, 0x79, 0xd9, 0x6f, 0x20, 0x2b, + 0x04, 0x93, 0x67, 0x2b, 0x55, 0x01, 0x3b, 0x26, 0x47, 0xad, 0x71, 0x7f, 0x8e, 0xf2, + 0x6f, 0x3d, 0x43, 0xb7, 0x75, 0x9e, 0xf5, 0xd6, 0x72, 0xcb, 0x14, 0x17, 0xf9, 0x78, + 0x81, 0xc3, 0x28, 0x80, 0x61, 0x2e, 0x6b, 0x00, 0xcc, 0x63, 0xfd, 0xa8, 0xd0, 0x29, + 0x88, 0xc4, 0x03, 0xee, 0x95, 0x6f, 0xfe, 0x72, 0xa2, 0xe1, 0xd1, 0x64, 0x29, 0x10, + 0xe3, 0xdf, 0x2c, 0xb8, 0xe0, 0xce, 0x90, 0x6f, 0x66, 0x2a, 0x96, 0x37, 0x5b, 0x78, + 0x64, 0xe1, 0x7f, 0x2a, 0x3d, 0x12, 0x19, 0x68, 0x47, 0x57, 0x03, 0x3c, 0xeb, 0x0c, + 0xb7, 0xea, 0x10, 0xd9, 0x90, 0x2d, 0x56, 0x55, 0x53, 0x15, 0xa8, 0x0f, 0x99, 0x7f, + 0xb7, 0xc3, 0xa6, 0xb7, 0x0e, 0x30, 0x7f, 0x33, 0x18, 0x44, 0x60, 0x1e, 0xf5, 0x70, + 0x13, 0xe3, 0xd3, 0x35, 0xfe, 0x48, 0x29, 0x81, 0xef, 0x72, 0x1f, 0xf0, 0xc3, 0x4f, + 0xb8, 0x8a, 0xcd, 0xae, 0x2f, 0xa0, 0xc1, 0x80, 0x1a, 0xd1, 0xe9, 0x67, 0x56, 0x25, + 0x66, 0xf7, 0xea, 0x6c, 0x65, 0x67, 0xfe, 0x06, 0x6d, 0x33, 0xd0, 0x84, 0x1b, 0x33, + 0xb5, 0x60, 0xe2, 0xf8, 0x43, 0x58, 0xd4, 0x1a, 0xfc, 0x3e, 0x43, 0x6d, 0x86, 0x8e, + 0x02, 0x1a, 0x1e, 0xde, 0xb3, 0x69, 0xa9, 0x84, 0x06, 0xa5, 0x76, 0xed, 0x48, 0x38, + 0xc7, 0x30, 0xad, 0xef, 0xd6, 0x94, 0x24, 0xc2, 0x35, 0xdb, 0x4f, 0xb1, 0xf6, 0xf6, + 0x2e, 0x9b, 0x51, 0x80, 0x5c, 0xdb, 0x43, 0xea, 0xf2, 0xa6, 0xb4, 0x5f, 0x81, 0x4d, + 0xaf, 0x53, 0x0a, 0xfb, 0xd0, 0xb3, 0x0b, 0xbb, 0xbb, 0xa9, 0x66, 0x05, 0x9a, 0x08, + 0xd3, 0x1d, 0x13, 0x7b, 0xbf, 0x5e, 0xc5, 0x80, 0x58, 0xd3, + ], + ock: [ + 0x85, 0x6e, 0x1a, 0x97, 0x09, 0xb0, 0xc4, 0x16, 0x93, 0x3f, 0x59, 0x70, 0x71, 0x5c, + 0x56, 0xe2, 0xe0, 0x5c, 0x2e, 0xa9, 0x7d, 0x81, 0x51, 0x25, 0x70, 0x14, 0x79, 0xc3, + 0x3a, 0x5d, 0x91, 0xcb, + ], + op: [ + 0x78, 0xa4, 0xe3, 0x39, 0x88, 0xd7, 0x1d, 0x71, 0x8e, 0x59, 0x55, 0x55, 0x28, 0x4c, + 0x24, 0x9a, 0x62, 0xb7, 0x12, 0x88, 0x06, 0xa5, 0x4c, 0x3b, 0x36, 0xa3, 0xaa, 0x57, + 0x14, 0x93, 0x16, 0x36, 0x8b, 0x14, 0x62, 0x2d, 0x2f, 0x91, 0xf1, 0x69, 0x8d, 0x53, + 0xfe, 0x47, 0x9a, 0x1e, 0x5c, 0x00, 0x64, 0x98, 0xb9, 0x8b, 0x85, 0xb4, 0x50, 0xbd, + 0x92, 0x3a, 0x5d, 0x00, 0xcb, 0x52, 0xa6, 0x13, + ], + c_out: [ + 0x72, 0x36, 0xea, 0xb9, 0xf0, 0x12, 0x98, 0xc8, 0x4f, 0x38, 0x28, 0xf6, 0xac, 0x15, + 0x42, 0x76, 0xb5, 0xb7, 0x64, 0x62, 0xf5, 0x74, 0x2d, 0x69, 0xdc, 0x47, 0x7a, 0x10, + 0x5d, 0xc2, 0x71, 0x1b, 0x12, 0xe9, 0xb5, 0x82, 0x8c, 0x01, 0x76, 0xfe, 0xf4, 0x4a, + 0x54, 0x0f, 0x60, 0x95, 0x8e, 0x5a, 0x3e, 0xd6, 0xa2, 0xcc, 0x5e, 0xdd, 0xe9, 0x13, + 0xd1, 0x4c, 0xf8, 0xe8, 0xe2, 0x8e, 0xa2, 0x5c, 0x18, 0x62, 0x7a, 0x84, 0xa2, 0xbe, + 0x96, 0x1f, 0x44, 0x72, 0x67, 0x67, 0xe9, 0xf8, 0x43, 0x1b, + ], + }, + TestVector { + incoming_viewing_key: [ + 0x0b, 0xb5, 0x6c, 0x49, 0xc0, 0x63, 0x2d, 0x4c, 0xc7, 0xe4, 0x85, 0x51, 0xdb, 0x46, + 0x42, 0x8f, 0x1b, 0x1a, 0x52, 0x66, 0x1e, 0x07, 0xe0, 0xc3, 0xbc, 0xc2, 0x31, 0x74, + 0xcc, 0xbb, 0xbd, 0xa1, 0xfa, 0x19, 0x24, 0xf4, 0x16, 0xcd, 0x48, 0x39, 0x0e, 0x2b, + 0x11, 0xc6, 0xe7, 0x82, 0x56, 0xd4, 0xc4, 0xc5, 0x64, 0x1a, 0xca, 0xd9, 0xa2, 0x0c, + 0x24, 0xfb, 0xe6, 0xcb, 0x4e, 0xe7, 0x81, 0x25, + ], + ovk: [ + 0x21, 0xe9, 0x1a, 0x3c, 0x4a, 0xa3, 0xf2, 0x7f, 0xa1, 0xb6, 0x33, 0x96, 0xe2, 0xb4, + 0x1d, 0xb9, 0x08, 0xfd, 0xab, 0x8b, 0x18, 0xcc, 0x73, 0x04, 0xe9, 0x4e, 0x97, 0x05, + 0x68, 0xf9, 0x42, 0x1c, + ], + default_d: [ + 0xe0, 0x66, 0xb5, 0xe7, 0x96, 0x86, 0xe9, 0xf3, 0x6e, 0xce, 0xc7, + ], + default_pk_d: [ + 0x3b, 0x3e, 0x88, 0x3e, 0x95, 0x8c, 0xd6, 0xe0, 0x75, 0x4d, 0x74, 0xca, 0xae, 0x1e, + 0x5a, 0x43, 0x98, 0xab, 0xeb, 0x7d, 0x10, 0xee, 0x5f, 0x75, 0xa4, 0xab, 0x8e, 0xf7, + 0x03, 0x8e, 0x3d, 0xb3, + ], + v: 12119135386131850622, + rseed: [ + 0xc3, 0x6d, 0xcf, 0xd3, 0x4a, 0x0c, 0xb6, 0x63, 0x78, 0x76, 0x10, 0x5e, 0x79, 0xbf, + 0x3b, 0xd5, 0x8e, 0xc1, 0x48, 0xcb, 0x64, 0x97, 0x0e, 0x32, 0x23, 0xa9, 0x1f, 0x71, + 0xdf, 0xcf, 0xd5, 0xa0, + ], + asset: [ + 0x67, 0x43, 0xf9, 0x3a, 0x6e, 0xbd, 0xa7, 0x2a, 0x8c, 0x7c, 0x5a, 0x2b, 0x7f, 0xa3, + 0x04, 0xfe, 0x32, 0xb2, 0x9b, 0x4f, 0x70, 0x6a, 0xa8, 0xf7, 0x42, 0x0f, 0x3d, 0x8e, + 0x7a, 0x59, 0x70, 0x2f, + ], + memo: [ + 0xff, 0x4b, 0x66, 0x7f, 0xba, 0xf3, 0xd4, 0xb3, 0xb9, 0x08, 0xb9, 0x82, 0x88, 0x20, + 0xdf, 0xec, 0xdd, 0x75, 0x37, 0x50, 0xb5, 0xf9, 0xd2, 0x21, 0x6e, 0x56, 0xc6, 0x15, + 0x27, 0x2f, 0x85, 0x44, 0x64, 0xc0, 0xca, 0x4b, 0x1e, 0x85, 0xae, 0xdd, 0x03, 0x82, + 0x92, 0xc4, 0xe1, 0xa5, 0x77, 0x44, 0xeb, 0xba, 0x01, 0x0b, 0x9e, 0xbf, 0xbb, 0x01, + 0x1b, 0xd6, 0xf0, 0xb7, 0x88, 0x05, 0x02, 0x5d, 0x27, 0xf3, 0xc1, 0x77, 0x46, 0xba, + 0xe1, 0x16, 0xc1, 0x5d, 0x9f, 0x47, 0x1f, 0x0f, 0x62, 0x88, 0xa1, 0x50, 0x64, 0x7b, + 0x2a, 0xfe, 0x9d, 0xf7, 0xcc, 0xcf, 0x01, 0xf5, 0xcd, 0xe5, 0xf0, 0x46, 0x80, 0xbb, + 0xfe, 0xd8, 0x7f, 0x6c, 0xf4, 0x29, 0xfb, 0x27, 0xad, 0x6b, 0xab, 0xe7, 0x91, 0x76, + 0x66, 0x11, 0xcf, 0x5b, 0xc2, 0x0e, 0x48, 0xbe, 0xf1, 0x19, 0x25, 0x9b, 0x9b, 0x8a, + 0x0e, 0x39, 0xc3, 0xdf, 0x28, 0xcb, 0x95, 0x82, 0xea, 0x33, 0x86, 0x01, 0xcd, 0xc4, + 0x81, 0xb3, 0x2f, 0xb8, 0x2a, 0xde, 0xeb, 0xb3, 0xda, 0xde, 0x25, 0xd1, 0xa3, 0xdf, + 0x20, 0xc3, 0x7e, 0x71, 0x25, 0x06, 0xb5, 0xd9, 0x96, 0xc4, 0x9a, 0x9f, 0x0f, 0x30, + 0xdd, 0xcb, 0x91, 0xfe, 0x90, 0x04, 0xe1, 0xe8, 0x32, 0x94, 0xa6, 0xc9, 0x20, 0x3d, + 0x94, 0xe8, 0xdc, 0x2c, 0xbb, 0x44, 0x9d, 0xe4, 0x15, 0x50, 0x32, 0x60, 0x4e, 0x47, + 0x99, 0x70, 0x16, 0xb3, 0x04, 0xfd, 0x43, 0x7d, 0x82, 0x35, 0x04, 0x5e, 0x25, 0x5a, + 0x19, 0xb7, 0x43, 0xa0, 0xa9, 0xf2, 0xe3, 0x36, 0xb4, 0x4c, 0xae, 0x30, 0x7b, 0xb3, + 0x98, 0x7b, 0xd3, 0xe4, 0xe7, 0x77, 0xfb, 0xb3, 0x4c, 0x0a, 0xb8, 0xcc, 0x3d, 0x67, + 0x46, 0x6c, 0x0a, 0x88, 0xdd, 0x4c, 0xca, 0xd1, 0x8a, 0x07, 0xa8, 0xd1, 0x06, 0x8d, + 0xf5, 0xb6, 0x29, 0xe5, 0x71, 0x8d, 0x0f, 0x6d, 0xf5, 0xc9, 0x57, 0xcf, 0x71, 0xbb, + 0x00, 0xa5, 0x17, 0x8f, 0x17, 0x5c, 0xac, 0xa9, 0x44, 0xe6, 0x35, 0xc5, 0x15, 0x9f, + 0x73, 0x8e, 0x24, 0x02, 0xa2, 0xd2, 0x1a, 0xa0, 0x81, 0xe1, 0x0e, 0x45, 0x6a, 0xfb, + 0x00, 0xb9, 0xf6, 0x24, 0x16, 0xc8, 0xb9, 0xc0, 0xf7, 0x22, 0x8f, 0x51, 0x07, 0x29, + 0xe0, 0xbe, 0x3f, 0x30, 0x53, 0x13, 0xd7, 0x7f, 0x73, 0x79, 0xdc, 0x2a, 0xf2, 0x48, + 0x69, 0xc6, 0xc7, 0x4e, 0xe4, 0x47, 0x14, 0x98, 0x86, 0x1d, 0x19, 0x2f, 0x0f, 0xf0, + 0xf5, 0x08, 0x28, 0x5d, 0xab, 0x6b, 0x6a, 0x36, 0xcc, 0xf7, 0xd1, 0x22, 0x56, 0xcc, + 0x76, 0xb9, 0x55, 0x03, 0x72, 0x0a, 0xc6, 0x72, 0xd0, 0x82, 0x68, 0xd2, 0xcf, 0x77, + 0x73, 0xb6, 0xba, 0x2a, 0x5f, 0x66, 0x48, 0x47, 0xbf, 0x70, 0x7f, 0x2f, 0xc1, 0x0c, + 0x98, 0xf2, 0xf0, 0x06, 0xec, 0x22, 0xcc, 0xb5, 0xa8, 0xc8, 0xb7, 0xc4, 0x0c, 0x7c, + 0x2d, 0x49, 0xa6, 0x63, 0x9b, 0x9f, 0x2c, 0xe3, 0x3c, 0x25, 0xc0, 0x4b, 0xc4, 0x61, + 0xe7, 0x44, 0xdf, 0xa5, 0x36, 0xb0, 0x0d, 0x94, 0xba, 0xdd, 0xf4, 0xf4, 0xd1, 0x40, + 0x44, 0xc6, 0x95, 0xa3, 0x38, 0x81, 0x47, 0x7d, 0xf1, 0x24, 0xf0, 0xfc, 0xf2, 0x06, + 0xa9, 0xfb, 0x2e, 0x65, 0xe3, 0x04, 0xcd, 0xbf, 0x0c, 0x4d, 0x23, 0x90, 0x17, 0x0c, + 0x13, 0x0a, 0xb8, 0x49, 0xc2, 0xf2, 0x2b, 0x5c, 0xdd, 0x39, 0x21, 0x64, 0x0c, 0x8c, + 0xf1, 0x97, 0x6a, 0xe1, 0x01, 0x0b, 0x0d, 0xfd, 0x9c, 0xb2, 0x54, 0x3e, 0x45, 0xf9, + 0x97, 0x49, 0xcc, 0x4d, 0x61, 0xf2, 0xe8, 0xaa, 0xbf, 0xe9, 0x8b, 0xd9, 0x05, 0xfa, + 0x39, 0x95, 0x1b, 0x33, 0xea, 0x76, 0x9c, 0x45, 0xab, 0x95, 0x31, 0xc5, 0x72, 0x09, + 0x86, 0x2a, 0xd1, 0x2f, 0xd7, 0x6b, 0xa4, 0x80, + ], + cv_net: [ + 0xca, 0xf6, 0x40, 0x8d, 0xef, 0x1f, 0x0f, 0x2b, 0xaa, 0x17, 0xb1, 0x30, 0xc3, 0xae, + 0x72, 0x95, 0x89, 0xbe, 0x69, 0xd8, 0x28, 0xbe, 0x54, 0x30, 0x69, 0x16, 0x41, 0x3c, + 0xd2, 0x50, 0x21, 0x17, + ], + rho: [ + 0x8d, 0x67, 0xe3, 0xba, 0x4d, 0xbc, 0x9d, 0xa5, 0xe8, 0x38, 0x23, 0xa1, 0x23, 0x11, + 0x63, 0x96, 0x51, 0xa4, 0xff, 0xa9, 0x5f, 0x27, 0xc1, 0x83, 0x0d, 0x91, 0xd8, 0xb7, + 0x3c, 0xfb, 0xf1, 0x31, + ], + cmx: [ + 0xea, 0x7c, 0x13, 0xf7, 0xe1, 0x20, 0x5e, 0x78, 0xc8, 0xce, 0x4e, 0xe4, 0xfd, 0xcd, + 0xb7, 0xee, 0x76, 0x92, 0x8d, 0xdf, 0x6d, 0xbe, 0x1b, 0x2d, 0x6f, 0x69, 0x81, 0xb7, + 0xc9, 0x65, 0x79, 0x10, + ], + esk: [ + 0x85, 0x7b, 0xa2, 0x47, 0xd4, 0x68, 0xe1, 0x8d, 0xfe, 0x96, 0x73, 0xe9, 0x05, 0x99, + 0x23, 0xc2, 0x2e, 0x9b, 0x70, 0x0d, 0x56, 0x3d, 0xf8, 0xa9, 0x89, 0xcc, 0x63, 0x00, + 0x06, 0x15, 0xb2, 0x0d, + ], + ephemeral_key: [ + 0x89, 0xfd, 0x2c, 0xf3, 0x79, 0x56, 0xba, 0xaf, 0x11, 0x27, 0xbb, 0x0e, 0x33, 0x40, + 0x01, 0x09, 0xdb, 0x03, 0x50, 0xf4, 0xab, 0xb7, 0xd6, 0xd8, 0x1f, 0xa5, 0x84, 0x8e, + 0x1b, 0xb1, 0x69, 0x26, + ], + shared_secret: [ + 0xdb, 0xa6, 0x37, 0x94, 0xb6, 0x7c, 0x49, 0x6d, 0x01, 0x1c, 0xfb, 0x6b, 0xba, 0x29, + 0x7c, 0xa5, 0x7d, 0x18, 0xc7, 0xa9, 0xad, 0xdf, 0xfb, 0xc8, 0x37, 0x17, 0x6a, 0xcf, + 0x3a, 0x30, 0x1e, 0x23, + ], + k_enc: [ + 0x80, 0xe7, 0x52, 0x2c, 0xb0, 0x32, 0x51, 0xc8, 0x55, 0x34, 0x1f, 0x06, 0xf9, 0x41, + 0x33, 0x41, 0xe1, 0x6e, 0x83, 0xb4, 0x89, 0xe1, 0x5a, 0x0a, 0x00, 0x65, 0xc3, 0x3b, + 0xf3, 0x81, 0x58, 0xc4, + ], + p_enc: [ + 0x03, 0xe0, 0x66, 0xb5, 0xe7, 0x96, 0x86, 0xe9, 0xf3, 0x6e, 0xce, 0xc7, 0x7e, 0x65, + 0x41, 0x7b, 0x6c, 0xd1, 0x2f, 0xa8, 0xc3, 0x6d, 0xcf, 0xd3, 0x4a, 0x0c, 0xb6, 0x63, + 0x78, 0x76, 0x10, 0x5e, 0x79, 0xbf, 0x3b, 0xd5, 0x8e, 0xc1, 0x48, 0xcb, 0x64, 0x97, + 0x0e, 0x32, 0x23, 0xa9, 0x1f, 0x71, 0xdf, 0xcf, 0xd5, 0xa0, 0x67, 0x43, 0xf9, 0x3a, + 0x6e, 0xbd, 0xa7, 0x2a, 0x8c, 0x7c, 0x5a, 0x2b, 0x7f, 0xa3, 0x04, 0xfe, 0x32, 0xb2, + 0x9b, 0x4f, 0x70, 0x6a, 0xa8, 0xf7, 0x42, 0x0f, 0x3d, 0x8e, 0x7a, 0x59, 0x70, 0x2f, + 0xff, 0x4b, 0x66, 0x7f, 0xba, 0xf3, 0xd4, 0xb3, 0xb9, 0x08, 0xb9, 0x82, 0x88, 0x20, + 0xdf, 0xec, 0xdd, 0x75, 0x37, 0x50, 0xb5, 0xf9, 0xd2, 0x21, 0x6e, 0x56, 0xc6, 0x15, + 0x27, 0x2f, 0x85, 0x44, 0x64, 0xc0, 0xca, 0x4b, 0x1e, 0x85, 0xae, 0xdd, 0x03, 0x82, + 0x92, 0xc4, 0xe1, 0xa5, 0x77, 0x44, 0xeb, 0xba, 0x01, 0x0b, 0x9e, 0xbf, 0xbb, 0x01, + 0x1b, 0xd6, 0xf0, 0xb7, 0x88, 0x05, 0x02, 0x5d, 0x27, 0xf3, 0xc1, 0x77, 0x46, 0xba, + 0xe1, 0x16, 0xc1, 0x5d, 0x9f, 0x47, 0x1f, 0x0f, 0x62, 0x88, 0xa1, 0x50, 0x64, 0x7b, + 0x2a, 0xfe, 0x9d, 0xf7, 0xcc, 0xcf, 0x01, 0xf5, 0xcd, 0xe5, 0xf0, 0x46, 0x80, 0xbb, + 0xfe, 0xd8, 0x7f, 0x6c, 0xf4, 0x29, 0xfb, 0x27, 0xad, 0x6b, 0xab, 0xe7, 0x91, 0x76, + 0x66, 0x11, 0xcf, 0x5b, 0xc2, 0x0e, 0x48, 0xbe, 0xf1, 0x19, 0x25, 0x9b, 0x9b, 0x8a, + 0x0e, 0x39, 0xc3, 0xdf, 0x28, 0xcb, 0x95, 0x82, 0xea, 0x33, 0x86, 0x01, 0xcd, 0xc4, + 0x81, 0xb3, 0x2f, 0xb8, 0x2a, 0xde, 0xeb, 0xb3, 0xda, 0xde, 0x25, 0xd1, 0xa3, 0xdf, + 0x20, 0xc3, 0x7e, 0x71, 0x25, 0x06, 0xb5, 0xd9, 0x96, 0xc4, 0x9a, 0x9f, 0x0f, 0x30, + 0xdd, 0xcb, 0x91, 0xfe, 0x90, 0x04, 0xe1, 0xe8, 0x32, 0x94, 0xa6, 0xc9, 0x20, 0x3d, + 0x94, 0xe8, 0xdc, 0x2c, 0xbb, 0x44, 0x9d, 0xe4, 0x15, 0x50, 0x32, 0x60, 0x4e, 0x47, + 0x99, 0x70, 0x16, 0xb3, 0x04, 0xfd, 0x43, 0x7d, 0x82, 0x35, 0x04, 0x5e, 0x25, 0x5a, + 0x19, 0xb7, 0x43, 0xa0, 0xa9, 0xf2, 0xe3, 0x36, 0xb4, 0x4c, 0xae, 0x30, 0x7b, 0xb3, + 0x98, 0x7b, 0xd3, 0xe4, 0xe7, 0x77, 0xfb, 0xb3, 0x4c, 0x0a, 0xb8, 0xcc, 0x3d, 0x67, + 0x46, 0x6c, 0x0a, 0x88, 0xdd, 0x4c, 0xca, 0xd1, 0x8a, 0x07, 0xa8, 0xd1, 0x06, 0x8d, + 0xf5, 0xb6, 0x29, 0xe5, 0x71, 0x8d, 0x0f, 0x6d, 0xf5, 0xc9, 0x57, 0xcf, 0x71, 0xbb, + 0x00, 0xa5, 0x17, 0x8f, 0x17, 0x5c, 0xac, 0xa9, 0x44, 0xe6, 0x35, 0xc5, 0x15, 0x9f, + 0x73, 0x8e, 0x24, 0x02, 0xa2, 0xd2, 0x1a, 0xa0, 0x81, 0xe1, 0x0e, 0x45, 0x6a, 0xfb, + 0x00, 0xb9, 0xf6, 0x24, 0x16, 0xc8, 0xb9, 0xc0, 0xf7, 0x22, 0x8f, 0x51, 0x07, 0x29, + 0xe0, 0xbe, 0x3f, 0x30, 0x53, 0x13, 0xd7, 0x7f, 0x73, 0x79, 0xdc, 0x2a, 0xf2, 0x48, + 0x69, 0xc6, 0xc7, 0x4e, 0xe4, 0x47, 0x14, 0x98, 0x86, 0x1d, 0x19, 0x2f, 0x0f, 0xf0, + 0xf5, 0x08, 0x28, 0x5d, 0xab, 0x6b, 0x6a, 0x36, 0xcc, 0xf7, 0xd1, 0x22, 0x56, 0xcc, + 0x76, 0xb9, 0x55, 0x03, 0x72, 0x0a, 0xc6, 0x72, 0xd0, 0x82, 0x68, 0xd2, 0xcf, 0x77, + 0x73, 0xb6, 0xba, 0x2a, 0x5f, 0x66, 0x48, 0x47, 0xbf, 0x70, 0x7f, 0x2f, 0xc1, 0x0c, + 0x98, 0xf2, 0xf0, 0x06, 0xec, 0x22, 0xcc, 0xb5, 0xa8, 0xc8, 0xb7, 0xc4, 0x0c, 0x7c, + 0x2d, 0x49, 0xa6, 0x63, 0x9b, 0x9f, 0x2c, 0xe3, 0x3c, 0x25, 0xc0, 0x4b, 0xc4, 0x61, + 0xe7, 0x44, 0xdf, 0xa5, 0x36, 0xb0, 0x0d, 0x94, 0xba, 0xdd, 0xf4, 0xf4, 0xd1, 0x40, + 0x44, 0xc6, 0x95, 0xa3, 0x38, 0x81, 0x47, 0x7d, 0xf1, 0x24, 0xf0, 0xfc, 0xf2, 0x06, + 0xa9, 0xfb, 0x2e, 0x65, 0xe3, 0x04, 0xcd, 0xbf, 0x0c, 0x4d, 0x23, 0x90, 0x17, 0x0c, + 0x13, 0x0a, 0xb8, 0x49, 0xc2, 0xf2, 0x2b, 0x5c, 0xdd, 0x39, 0x21, 0x64, 0x0c, 0x8c, + 0xf1, 0x97, 0x6a, 0xe1, 0x01, 0x0b, 0x0d, 0xfd, 0x9c, 0xb2, 0x54, 0x3e, 0x45, 0xf9, + 0x97, 0x49, 0xcc, 0x4d, 0x61, 0xf2, 0xe8, 0xaa, 0xbf, 0xe9, 0x8b, 0xd9, 0x05, 0xfa, + 0x39, 0x95, 0x1b, 0x33, 0xea, 0x76, 0x9c, 0x45, 0xab, 0x95, 0x31, 0xc5, 0x72, 0x09, + 0x86, 0x2a, 0xd1, 0x2f, 0xd7, 0x6b, 0xa4, 0x80, + ], + c_enc: [ + 0x3e, 0x4e, 0x9b, 0x18, 0x56, 0xe7, 0xbf, 0xba, 0x7a, 0xbb, 0xc9, 0x4a, 0x72, 0xb4, + 0xab, 0xb1, 0xd8, 0x46, 0x26, 0x79, 0x30, 0x77, 0xe8, 0x37, 0xda, 0xf3, 0x3f, 0xff, + 0xa2, 0x7c, 0x7a, 0x33, 0x97, 0x8a, 0x54, 0x32, 0x51, 0x0d, 0x99, 0x3c, 0x7d, 0x92, + 0x24, 0xc0, 0x97, 0xac, 0xc5, 0x25, 0x88, 0x1c, 0x76, 0x08, 0xa4, 0x13, 0xfa, 0x5f, + 0x49, 0xaf, 0xc6, 0x58, 0x93, 0x94, 0xab, 0x86, 0x59, 0x0c, 0x43, 0x78, 0x5a, 0x58, + 0x0b, 0xd2, 0x86, 0x0b, 0xe3, 0xb8, 0x07, 0x99, 0xc1, 0x47, 0xf4, 0xe6, 0xc7, 0x50, + 0x31, 0x36, 0x76, 0x9a, 0xe4, 0xc6, 0x2c, 0xd9, 0x16, 0x9d, 0xd3, 0x66, 0xb8, 0x99, + 0xa5, 0x44, 0x8c, 0xdb, 0xc4, 0x0c, 0x8d, 0x89, 0x60, 0x38, 0x6c, 0x0f, 0x0e, 0x3e, + 0x74, 0x03, 0xd2, 0x6e, 0x66, 0xa5, 0x99, 0x40, 0xe7, 0x6a, 0xc7, 0x9d, 0xd1, 0xea, + 0xea, 0x55, 0xd0, 0xc0, 0x9f, 0x3b, 0xf6, 0xd9, 0xdc, 0xea, 0xe1, 0xee, 0x87, 0x41, + 0x38, 0x39, 0x1a, 0x0c, 0x93, 0x3e, 0x7b, 0x72, 0x75, 0xd7, 0x3b, 0x8e, 0xf4, 0x9b, + 0x8c, 0x39, 0x5c, 0x87, 0xfd, 0x32, 0x09, 0xe1, 0xf5, 0xa9, 0xc5, 0x52, 0xe6, 0x11, + 0x2b, 0xd9, 0xf3, 0xea, 0xb6, 0xbd, 0x4f, 0x26, 0xab, 0xa6, 0x4d, 0xb8, 0x27, 0xa7, + 0x1b, 0x86, 0x53, 0x9c, 0xf9, 0x72, 0x96, 0xfe, 0xca, 0x46, 0x27, 0x3e, 0xf4, 0x56, + 0xfe, 0x16, 0x0b, 0x31, 0xc7, 0x72, 0xcf, 0xf6, 0x82, 0xa6, 0xed, 0x06, 0x10, 0x93, + 0x14, 0x6e, 0xa6, 0x57, 0xf4, 0x61, 0xb5, 0x6f, 0xb2, 0x3c, 0x20, 0x64, 0xd8, 0x98, + 0xec, 0x25, 0x70, 0x34, 0x3c, 0x56, 0x6a, 0xdc, 0x1f, 0x2d, 0x1d, 0x86, 0x48, 0x41, + 0x42, 0x2e, 0x96, 0x4a, 0x4a, 0xb8, 0x3c, 0x18, 0x95, 0x0f, 0x82, 0xfa, 0x97, 0x4c, + 0x83, 0x3c, 0xf7, 0x62, 0x3d, 0xa9, 0xb8, 0xbe, 0xec, 0x7a, 0x1e, 0xbf, 0x5c, 0xeb, + 0x22, 0x25, 0xc1, 0xf2, 0xda, 0x30, 0xd0, 0x47, 0x9d, 0xbb, 0xa1, 0x68, 0x1f, 0x6e, + 0x75, 0xf2, 0xfa, 0xce, 0x30, 0x70, 0xe7, 0xa8, 0x13, 0xaa, 0x88, 0x34, 0x72, 0xae, + 0x47, 0x7c, 0x47, 0xbc, 0x2e, 0xc2, 0xe5, 0xc6, 0xcd, 0x85, 0x5d, 0x12, 0x25, 0x7c, + 0x54, 0xbd, 0xea, 0xdc, 0x44, 0x3b, 0xe7, 0xd6, 0xb6, 0x7d, 0x11, 0xad, 0xd4, 0x1f, + 0x49, 0xa9, 0xb4, 0xd8, 0x13, 0x8f, 0xd8, 0x7c, 0x0d, 0xee, 0x7f, 0x5f, 0xae, 0x0c, + 0xd8, 0x83, 0x7c, 0x39, 0xdb, 0x19, 0x9e, 0xea, 0x34, 0x48, 0xa9, 0x41, 0x05, 0x1f, + 0x78, 0x5c, 0x1f, 0x8a, 0xd0, 0xb2, 0x65, 0xd8, 0x78, 0x7c, 0x70, 0x1d, 0xe0, 0x5b, + 0xf1, 0xc6, 0x6a, 0x3d, 0x65, 0x94, 0xf5, 0x22, 0x19, 0xcc, 0xb3, 0x1e, 0x05, 0x03, + 0x9c, 0x83, 0x02, 0x2a, 0xa8, 0x61, 0x21, 0x1c, 0x50, 0xc2, 0xf0, 0xcf, 0xb1, 0xbe, + 0x94, 0x45, 0xcd, 0xb9, 0x6d, 0xf0, 0x0a, 0x16, 0x67, 0x57, 0x1a, 0x68, 0xb7, 0xf2, + 0x19, 0x45, 0xb1, 0xfa, 0xef, 0x4e, 0xbc, 0xcf, 0xa1, 0xc5, 0x83, 0xc4, 0x66, 0xb0, + 0xef, 0x58, 0x8a, 0xcd, 0xfd, 0x47, 0x8c, 0x7f, 0x21, 0x22, 0x61, 0x12, 0x8a, 0xf4, + 0x25, 0xa2, 0xe0, 0xa3, 0xa2, 0x7e, 0x17, 0x48, 0x7f, 0xff, 0x08, 0xb9, 0xfb, 0x80, + 0xd8, 0xaa, 0x71, 0x8f, 0xe2, 0x67, 0xda, 0xbc, 0x70, 0xd3, 0x6b, 0x8f, 0x62, 0xe0, + 0xe9, 0x04, 0x33, 0x47, 0x01, 0x4e, 0x02, 0xa2, 0x7a, 0x85, 0x79, 0x97, 0xe1, 0xcf, + 0x3e, 0x72, 0x33, 0xe2, 0x51, 0x3f, 0x83, 0x2e, 0x60, 0x35, 0x91, 0x68, 0xe1, 0x73, + 0xfc, 0x03, 0x07, 0x9e, 0x99, 0x83, 0xa1, 0x34, 0x1d, 0x68, 0xbb, 0x3a, 0x3c, 0x53, + 0x3a, 0x31, 0x84, 0xf4, 0xaa, 0x41, 0x75, 0xa9, 0xfe, 0xc1, 0xf0, 0x1f, 0xe3, 0xf8, + 0xb4, 0xfa, 0xeb, 0xed, 0x30, 0xb7, 0xe7, 0x18, 0x0e, 0x7e, 0xd7, 0xfc, 0x80, 0x7d, + 0x51, 0x0c, 0x06, 0x01, 0x42, 0x8d, 0xd6, 0x96, 0x41, 0xa3, 0x07, 0x29, 0xcd, 0x64, + 0x45, 0xde, 0x66, 0x0f, 0xb1, 0xbe, 0x2f, 0xb9, 0x6e, 0x56, 0xbb, 0x67, 0xb6, 0xef, + 0x88, 0xe0, 0x7d, 0x14, 0xae, 0xda, 0xa0, 0xbd, 0x23, 0x27, 0xe9, 0xd5, 0x27, 0xb7, + 0xe3, 0x30, 0x07, 0xf8, 0xca, 0xb5, 0x10, 0xad, 0xc2, 0x53, 0xca, 0xe6, 0x68, 0x7f, + 0xfd, 0xc9, 0x60, 0x40, 0x30, 0x40, 0x15, 0x9a, 0x7e, 0x98, 0xda, 0xa8, 0xa7, 0x7b, + 0x2a, 0x3f, 0xdf, 0x4f, 0x79, 0xd5, 0xbd, 0xbe, 0x9e, 0x2b, + ], + ock: [ + 0xe6, 0xb7, 0x05, 0x50, 0xe1, 0xd7, 0xa2, 0xbe, 0x73, 0x04, 0x39, 0x64, 0x41, 0xec, + 0x6a, 0xc0, 0x47, 0x45, 0x99, 0xf9, 0xea, 0xd7, 0x55, 0xc2, 0xcf, 0x27, 0x6b, 0x87, + 0x50, 0xc5, 0xcf, 0x2d, + ], + op: [ + 0x3b, 0x3e, 0x88, 0x3e, 0x95, 0x8c, 0xd6, 0xe0, 0x75, 0x4d, 0x74, 0xca, 0xae, 0x1e, + 0x5a, 0x43, 0x98, 0xab, 0xeb, 0x7d, 0x10, 0xee, 0x5f, 0x75, 0xa4, 0xab, 0x8e, 0xf7, + 0x03, 0x8e, 0x3d, 0xb3, 0x85, 0x7b, 0xa2, 0x47, 0xd4, 0x68, 0xe1, 0x8d, 0xfe, 0x96, + 0x73, 0xe9, 0x05, 0x99, 0x23, 0xc2, 0x2e, 0x9b, 0x70, 0x0d, 0x56, 0x3d, 0xf8, 0xa9, + 0x89, 0xcc, 0x63, 0x00, 0x06, 0x15, 0xb2, 0x0d, + ], + c_out: [ + 0x02, 0xb1, 0x37, 0x3e, 0xb1, 0x89, 0x56, 0x32, 0x2b, 0x47, 0xa1, 0x70, 0x0d, 0xb7, + 0x43, 0x31, 0x6e, 0xde, 0x46, 0x44, 0xd6, 0x59, 0x3c, 0xd7, 0x94, 0x22, 0xd7, 0x51, + 0x3d, 0x1b, 0x80, 0xe6, 0x85, 0x05, 0xdf, 0xe9, 0xd6, 0x86, 0x2e, 0x79, 0x4e, 0x30, + 0x28, 0x8b, 0xae, 0xa8, 0xb0, 0xbc, 0xb3, 0x8b, 0x35, 0x49, 0x77, 0xaa, 0xee, 0x57, + 0x2e, 0xe8, 0x86, 0x8b, 0x2d, 0xa0, 0x7d, 0xa2, 0x99, 0x2c, 0x6d, 0x9f, 0xb8, 0xbd, + 0x59, 0x0b, 0x8d, 0xa0, 0x28, 0x11, 0xb5, 0x09, 0xe8, 0xc6, + ], + }, + TestVector { + incoming_viewing_key: [ + 0xeb, 0xd4, 0x80, 0x6d, 0x81, 0x25, 0x49, 0x89, 0xfa, 0xdb, 0xa8, 0xcd, 0x58, 0x96, + 0x7d, 0x6f, 0xd8, 0x73, 0x83, 0xbc, 0x09, 0x38, 0x63, 0xd5, 0xab, 0xfc, 0xdd, 0xd3, + 0x8f, 0x15, 0x39, 0xfa, 0xb7, 0xe5, 0xd4, 0xf0, 0x61, 0x91, 0x67, 0xb8, 0xd4, 0x82, + 0xcb, 0x54, 0x8c, 0xb5, 0x59, 0x83, 0x49, 0x6f, 0x77, 0xd3, 0xdc, 0xaf, 0xf5, 0x6e, + 0x32, 0x41, 0x0b, 0xfe, 0xc1, 0xf2, 0x68, 0x11, + ], + ovk: [ + 0xb2, 0x5f, 0x30, 0x3f, 0x58, 0x15, 0xc4, 0x53, 0x31, 0x24, 0xac, 0xf9, 0xd1, 0x89, + 0x40, 0xe7, 0x75, 0x22, 0xac, 0x5d, 0xc4, 0xb9, 0x57, 0x0a, 0xae, 0x8f, 0x47, 0xb7, + 0xf5, 0x7f, 0xd8, 0x76, + ], + default_d: [ + 0x1c, 0xa7, 0xb6, 0x49, 0x39, 0x9e, 0x13, 0xe4, 0x39, 0x44, 0x62, + ], + default_pk_d: [ + 0x3f, 0xeb, 0x34, 0x5a, 0xec, 0xd3, 0x42, 0x9a, 0x16, 0xe1, 0x0f, 0x3d, 0x13, 0x20, + 0xbc, 0x99, 0x71, 0xb5, 0x9e, 0x63, 0x9d, 0x62, 0xb6, 0x96, 0x1a, 0xea, 0x78, 0x15, + 0x67, 0xa8, 0x60, 0x9e, + ], + v: 9624581763228770449, + rseed: [ + 0x4a, 0x95, 0xb2, 0x05, 0x52, 0x6c, 0xfc, 0xb4, 0xc4, 0xe1, 0xcc, 0x95, 0x51, 0x75, + 0xb3, 0xe8, 0xde, 0x1f, 0x5d, 0x81, 0xb1, 0x86, 0x69, 0x69, 0x23, 0x50, 0xaa, 0xa1, + 0xa1, 0xd7, 0x97, 0x61, + ], + asset: [ + 0x67, 0x43, 0xf9, 0x3a, 0x6e, 0xbd, 0xa7, 0x2a, 0x8c, 0x7c, 0x5a, 0x2b, 0x7f, 0xa3, + 0x04, 0xfe, 0x32, 0xb2, 0x9b, 0x4f, 0x70, 0x6a, 0xa8, 0xf7, 0x42, 0x0f, 0x3d, 0x8e, + 0x7a, 0x59, 0x70, 0x2f, + ], + memo: [ + 0xff, 0x75, 0x82, 0xe5, 0x4d, 0x7a, 0x5b, 0x57, 0xa6, 0x83, 0xb3, 0x2f, 0xb1, 0x09, + 0x80, 0x62, 0xda, 0xd7, 0xb0, 0xc2, 0xeb, 0x51, 0x8f, 0x68, 0x62, 0xe8, 0x3d, 0xb2, + 0x5e, 0x3d, 0xba, 0xf7, 0xae, 0xd5, 0x04, 0xde, 0x93, 0x2a, 0xcb, 0x99, 0xd7, 0x35, + 0x99, 0x2c, 0xe6, 0x2b, 0xae, 0x9e, 0xf8, 0x93, 0xff, 0x6a, 0xcc, 0x0f, 0xfc, 0xf8, + 0xe3, 0x48, 0x3e, 0x14, 0x6b, 0x9d, 0x49, 0xdd, 0x8c, 0x78, 0x35, 0xf4, 0x3a, 0x37, + 0xdc, 0xa0, 0x78, 0x7e, 0x3e, 0xc9, 0xf6, 0x60, 0x52, 0x23, 0xd5, 0xba, 0x7a, 0xe0, + 0xab, 0x90, 0x25, 0xb7, 0x3b, 0xc0, 0x3f, 0x7f, 0xac, 0x36, 0xc0, 0x09, 0xa5, 0x6d, + 0x4d, 0x95, 0xd1, 0xe8, 0x1d, 0x3b, 0x3e, 0xbc, 0xa7, 0xe5, 0x4c, 0xc1, 0xa1, 0x2d, + 0x12, 0x7b, 0x57, 0xc8, 0x13, 0x89, 0x76, 0xe7, 0x91, 0x01, 0x3b, 0x01, 0x5f, 0x06, + 0xa6, 0x24, 0xf5, 0x21, 0xb6, 0xee, 0x04, 0xec, 0x98, 0x08, 0x93, 0xc7, 0xe5, 0xe0, + 0x1a, 0x33, 0x62, 0x03, 0x59, 0x40, 0x94, 0xf8, 0x28, 0x33, 0xd7, 0x44, 0x5f, 0xe2, + 0xd0, 0x91, 0x30, 0xf6, 0x35, 0x11, 0xda, 0x54, 0x83, 0x2d, 0xe9, 0x13, 0x6b, 0x39, + 0xf4, 0x59, 0x9f, 0x5a, 0xa5, 0xdf, 0xbb, 0x45, 0xda, 0x60, 0xcd, 0xce, 0xab, 0x7e, + 0xef, 0xde, 0x89, 0xbe, 0x63, 0xf3, 0xf7, 0xc0, 0xd2, 0x32, 0x48, 0x47, 0xcc, 0xe1, + 0x40, 0x5d, 0xef, 0x7c, 0x46, 0x9b, 0x0e, 0x27, 0x24, 0x94, 0xe5, 0xdf, 0x54, 0xf5, + 0x68, 0x65, 0x6c, 0xb9, 0xc8, 0x81, 0x8d, 0x92, 0xb7, 0x2b, 0x8b, 0xc3, 0x4d, 0xb7, + 0xbb, 0x31, 0x12, 0x48, 0x7e, 0x74, 0x6e, 0xef, 0xe4, 0xe8, 0x08, 0xbb, 0xb2, 0x87, + 0xd9, 0x9b, 0xf0, 0x7d, 0x00, 0xda, 0xbe, 0xde, 0xdc, 0x5e, 0x5f, 0x07, 0x4f, 0xfe, + 0xae, 0x0c, 0xba, 0x7d, 0xa3, 0xa5, 0x16, 0xc1, 0x73, 0xbe, 0x1c, 0x51, 0x33, 0x23, + 0xe1, 0x19, 0xf6, 0x35, 0xe8, 0x20, 0x9a, 0x07, 0x4b, 0x21, 0x6b, 0x70, 0x23, 0xfa, + 0xdc, 0x2d, 0x25, 0x94, 0x9c, 0x90, 0x03, 0x7e, 0x71, 0xe3, 0xe5, 0x50, 0x72, 0x6d, + 0x21, 0x0a, 0x2c, 0x68, 0x83, 0x42, 0xe5, 0x24, 0x40, 0x63, 0x5e, 0x9c, 0xc1, 0x4a, + 0xfe, 0x10, 0x10, 0x26, 0x21, 0xa9, 0xc9, 0xac, 0xcb, 0x78, 0x2e, 0x9e, 0x4a, 0x5f, + 0xa8, 0x7f, 0x0a, 0x95, 0x6f, 0x5b, 0x85, 0x50, 0x99, 0x60, 0x28, 0x5c, 0x22, 0x62, + 0x7c, 0x59, 0x48, 0x3a, 0x5a, 0x4c, 0x28, 0xcc, 0xe4, 0xb1, 0x56, 0xe5, 0x51, 0x40, + 0x6a, 0x7e, 0xe8, 0x35, 0x56, 0x56, 0xa2, 0x1e, 0x43, 0xe3, 0x8c, 0xe1, 0x29, 0xfd, + 0xad, 0xb7, 0x59, 0xed, 0xdf, 0xa0, 0x8f, 0x00, 0xfc, 0x8e, 0x56, 0x7c, 0xef, 0x93, + 0xc6, 0x79, 0x2d, 0x01, 0xdf, 0x05, 0xe6, 0xd5, 0x80, 0xf4, 0xd5, 0xd4, 0x8d, 0xf0, + 0x42, 0x45, 0x1a, 0x33, 0x59, 0x0d, 0x3e, 0x8c, 0xf4, 0x9b, 0x26, 0x27, 0x21, 0x8f, + 0x0c, 0x29, 0x2f, 0xa6, 0x6a, 0xda, 0x94, 0x5f, 0xa5, 0x5b, 0xb2, 0x35, 0x48, 0xe3, + 0x3a, 0x83, 0xa5, 0x62, 0x95, 0x7a, 0x31, 0x49, 0xa9, 0x93, 0xcc, 0x47, 0x23, 0x62, + 0x29, 0x87, 0x36, 0xa8, 0xb7, 0x78, 0xd9, 0x7c, 0xe4, 0x23, 0x01, 0x3d, 0x64, 0xb3, + 0x2c, 0xd1, 0x72, 0xef, 0xa5, 0x51, 0xbf, 0x7f, 0x36, 0x8f, 0x04, 0xbd, 0xae, 0xc6, + 0x09, 0x1a, 0x30, 0x04, 0xa7, 0x57, 0x59, 0x8b, 0x80, 0x1d, 0xcf, 0x67, 0x5c, 0xb8, + 0x3e, 0x43, 0xa5, 0x3a, 0xe8, 0xb2, 0x54, 0xd3, 0x33, 0xbc, 0xda, 0x20, 0xd4, 0x81, + 0x7d, 0x34, 0x77, 0xab, 0xfb, 0xa2, 0x5b, 0xb8, 0x3d, 0xf5, 0x94, 0x9c, 0x12, 0x6f, + 0x14, 0x9b, 0x1d, 0x99, 0x34, 0x1e, 0x4e, 0x6f, + ], + cv_net: [ + 0xd2, 0xf9, 0xad, 0xff, 0x53, 0x1b, 0x65, 0x43, 0x2b, 0xa2, 0xd7, 0xda, 0xa6, 0xd8, + 0x6e, 0x62, 0xe4, 0xed, 0xc7, 0x86, 0xd9, 0xe0, 0xb2, 0x7d, 0x26, 0x62, 0x8b, 0x79, + 0xda, 0x6b, 0x15, 0x14, + ], + rho: [ + 0x9a, 0x09, 0xe4, 0x72, 0xe8, 0xe9, 0x96, 0xfc, 0xc3, 0x0e, 0xd5, 0x23, 0x72, 0x08, + 0xdb, 0xb0, 0x01, 0x71, 0x32, 0x0e, 0x6b, 0xea, 0x43, 0x91, 0x86, 0x00, 0x9d, 0xad, + 0x21, 0x38, 0xab, 0x29, + ], + cmx: [ + 0x18, 0xfc, 0xbd, 0x40, 0xac, 0xf1, 0xa7, 0xf4, 0xd6, 0x09, 0x87, 0x9a, 0x5f, 0x5e, + 0x3b, 0x39, 0x70, 0x09, 0x4f, 0xf8, 0xbe, 0x84, 0x18, 0x60, 0x70, 0x16, 0xc6, 0xa6, + 0x97, 0xf8, 0x9c, 0x20, + ], + esk: [ + 0x3b, 0xc1, 0x7a, 0x58, 0x0d, 0x53, 0x0f, 0x89, 0x30, 0xa3, 0x6b, 0x8d, 0x6f, 0xea, + 0x67, 0x85, 0x7f, 0x7b, 0x85, 0x20, 0xfd, 0x2e, 0x0a, 0xb5, 0xd5, 0xcb, 0xab, 0x1a, + 0xcc, 0xd5, 0x4e, 0x3a, + ], + ephemeral_key: [ + 0xcf, 0xe0, 0x3e, 0xb2, 0xd3, 0x36, 0x76, 0xb7, 0x73, 0x83, 0x7d, 0xa8, 0x39, 0x17, + 0x2d, 0x33, 0x33, 0x31, 0x88, 0xc9, 0xdf, 0xef, 0x05, 0xc8, 0x32, 0xa2, 0x5c, 0x86, + 0xd3, 0xbf, 0x0e, 0x8f, + ], + shared_secret: [ + 0xd2, 0xc2, 0x88, 0x9e, 0x03, 0x7e, 0xac, 0x60, 0x60, 0x58, 0x68, 0x2b, 0xaa, 0x38, + 0x86, 0xa4, 0xc2, 0xdd, 0x44, 0xea, 0xdf, 0x8b, 0x2c, 0xe4, 0x39, 0x95, 0xde, 0xd7, + 0x61, 0xfd, 0xaf, 0xb5, + ], + k_enc: [ + 0xfe, 0xe3, 0xe3, 0xb5, 0xfd, 0x6c, 0xd8, 0x54, 0x44, 0x2b, 0x2a, 0xc2, 0x97, 0x70, + 0xfb, 0x0e, 0x39, 0x32, 0xf4, 0x71, 0x52, 0x43, 0x26, 0xda, 0x4a, 0x57, 0xc2, 0x56, + 0x18, 0x06, 0x9e, 0x99, + ], + p_enc: [ + 0x03, 0x1c, 0xa7, 0xb6, 0x49, 0x39, 0x9e, 0x13, 0xe4, 0x39, 0x44, 0x62, 0x91, 0x20, + 0xf4, 0xd4, 0x1e, 0x62, 0x91, 0x85, 0x4a, 0x95, 0xb2, 0x05, 0x52, 0x6c, 0xfc, 0xb4, + 0xc4, 0xe1, 0xcc, 0x95, 0x51, 0x75, 0xb3, 0xe8, 0xde, 0x1f, 0x5d, 0x81, 0xb1, 0x86, + 0x69, 0x69, 0x23, 0x50, 0xaa, 0xa1, 0xa1, 0xd7, 0x97, 0x61, 0x67, 0x43, 0xf9, 0x3a, + 0x6e, 0xbd, 0xa7, 0x2a, 0x8c, 0x7c, 0x5a, 0x2b, 0x7f, 0xa3, 0x04, 0xfe, 0x32, 0xb2, + 0x9b, 0x4f, 0x70, 0x6a, 0xa8, 0xf7, 0x42, 0x0f, 0x3d, 0x8e, 0x7a, 0x59, 0x70, 0x2f, + 0xff, 0x75, 0x82, 0xe5, 0x4d, 0x7a, 0x5b, 0x57, 0xa6, 0x83, 0xb3, 0x2f, 0xb1, 0x09, + 0x80, 0x62, 0xda, 0xd7, 0xb0, 0xc2, 0xeb, 0x51, 0x8f, 0x68, 0x62, 0xe8, 0x3d, 0xb2, + 0x5e, 0x3d, 0xba, 0xf7, 0xae, 0xd5, 0x04, 0xde, 0x93, 0x2a, 0xcb, 0x99, 0xd7, 0x35, + 0x99, 0x2c, 0xe6, 0x2b, 0xae, 0x9e, 0xf8, 0x93, 0xff, 0x6a, 0xcc, 0x0f, 0xfc, 0xf8, + 0xe3, 0x48, 0x3e, 0x14, 0x6b, 0x9d, 0x49, 0xdd, 0x8c, 0x78, 0x35, 0xf4, 0x3a, 0x37, + 0xdc, 0xa0, 0x78, 0x7e, 0x3e, 0xc9, 0xf6, 0x60, 0x52, 0x23, 0xd5, 0xba, 0x7a, 0xe0, + 0xab, 0x90, 0x25, 0xb7, 0x3b, 0xc0, 0x3f, 0x7f, 0xac, 0x36, 0xc0, 0x09, 0xa5, 0x6d, + 0x4d, 0x95, 0xd1, 0xe8, 0x1d, 0x3b, 0x3e, 0xbc, 0xa7, 0xe5, 0x4c, 0xc1, 0xa1, 0x2d, + 0x12, 0x7b, 0x57, 0xc8, 0x13, 0x89, 0x76, 0xe7, 0x91, 0x01, 0x3b, 0x01, 0x5f, 0x06, + 0xa6, 0x24, 0xf5, 0x21, 0xb6, 0xee, 0x04, 0xec, 0x98, 0x08, 0x93, 0xc7, 0xe5, 0xe0, + 0x1a, 0x33, 0x62, 0x03, 0x59, 0x40, 0x94, 0xf8, 0x28, 0x33, 0xd7, 0x44, 0x5f, 0xe2, + 0xd0, 0x91, 0x30, 0xf6, 0x35, 0x11, 0xda, 0x54, 0x83, 0x2d, 0xe9, 0x13, 0x6b, 0x39, + 0xf4, 0x59, 0x9f, 0x5a, 0xa5, 0xdf, 0xbb, 0x45, 0xda, 0x60, 0xcd, 0xce, 0xab, 0x7e, + 0xef, 0xde, 0x89, 0xbe, 0x63, 0xf3, 0xf7, 0xc0, 0xd2, 0x32, 0x48, 0x47, 0xcc, 0xe1, + 0x40, 0x5d, 0xef, 0x7c, 0x46, 0x9b, 0x0e, 0x27, 0x24, 0x94, 0xe5, 0xdf, 0x54, 0xf5, + 0x68, 0x65, 0x6c, 0xb9, 0xc8, 0x81, 0x8d, 0x92, 0xb7, 0x2b, 0x8b, 0xc3, 0x4d, 0xb7, + 0xbb, 0x31, 0x12, 0x48, 0x7e, 0x74, 0x6e, 0xef, 0xe4, 0xe8, 0x08, 0xbb, 0xb2, 0x87, + 0xd9, 0x9b, 0xf0, 0x7d, 0x00, 0xda, 0xbe, 0xde, 0xdc, 0x5e, 0x5f, 0x07, 0x4f, 0xfe, + 0xae, 0x0c, 0xba, 0x7d, 0xa3, 0xa5, 0x16, 0xc1, 0x73, 0xbe, 0x1c, 0x51, 0x33, 0x23, + 0xe1, 0x19, 0xf6, 0x35, 0xe8, 0x20, 0x9a, 0x07, 0x4b, 0x21, 0x6b, 0x70, 0x23, 0xfa, + 0xdc, 0x2d, 0x25, 0x94, 0x9c, 0x90, 0x03, 0x7e, 0x71, 0xe3, 0xe5, 0x50, 0x72, 0x6d, + 0x21, 0x0a, 0x2c, 0x68, 0x83, 0x42, 0xe5, 0x24, 0x40, 0x63, 0x5e, 0x9c, 0xc1, 0x4a, + 0xfe, 0x10, 0x10, 0x26, 0x21, 0xa9, 0xc9, 0xac, 0xcb, 0x78, 0x2e, 0x9e, 0x4a, 0x5f, + 0xa8, 0x7f, 0x0a, 0x95, 0x6f, 0x5b, 0x85, 0x50, 0x99, 0x60, 0x28, 0x5c, 0x22, 0x62, + 0x7c, 0x59, 0x48, 0x3a, 0x5a, 0x4c, 0x28, 0xcc, 0xe4, 0xb1, 0x56, 0xe5, 0x51, 0x40, + 0x6a, 0x7e, 0xe8, 0x35, 0x56, 0x56, 0xa2, 0x1e, 0x43, 0xe3, 0x8c, 0xe1, 0x29, 0xfd, + 0xad, 0xb7, 0x59, 0xed, 0xdf, 0xa0, 0x8f, 0x00, 0xfc, 0x8e, 0x56, 0x7c, 0xef, 0x93, + 0xc6, 0x79, 0x2d, 0x01, 0xdf, 0x05, 0xe6, 0xd5, 0x80, 0xf4, 0xd5, 0xd4, 0x8d, 0xf0, + 0x42, 0x45, 0x1a, 0x33, 0x59, 0x0d, 0x3e, 0x8c, 0xf4, 0x9b, 0x26, 0x27, 0x21, 0x8f, + 0x0c, 0x29, 0x2f, 0xa6, 0x6a, 0xda, 0x94, 0x5f, 0xa5, 0x5b, 0xb2, 0x35, 0x48, 0xe3, + 0x3a, 0x83, 0xa5, 0x62, 0x95, 0x7a, 0x31, 0x49, 0xa9, 0x93, 0xcc, 0x47, 0x23, 0x62, + 0x29, 0x87, 0x36, 0xa8, 0xb7, 0x78, 0xd9, 0x7c, 0xe4, 0x23, 0x01, 0x3d, 0x64, 0xb3, + 0x2c, 0xd1, 0x72, 0xef, 0xa5, 0x51, 0xbf, 0x7f, 0x36, 0x8f, 0x04, 0xbd, 0xae, 0xc6, + 0x09, 0x1a, 0x30, 0x04, 0xa7, 0x57, 0x59, 0x8b, 0x80, 0x1d, 0xcf, 0x67, 0x5c, 0xb8, + 0x3e, 0x43, 0xa5, 0x3a, 0xe8, 0xb2, 0x54, 0xd3, 0x33, 0xbc, 0xda, 0x20, 0xd4, 0x81, + 0x7d, 0x34, 0x77, 0xab, 0xfb, 0xa2, 0x5b, 0xb8, 0x3d, 0xf5, 0x94, 0x9c, 0x12, 0x6f, + 0x14, 0x9b, 0x1d, 0x99, 0x34, 0x1e, 0x4e, 0x6f, + ], + c_enc: [ + 0xbf, 0x1d, 0xff, 0xd3, 0x37, 0x0c, 0x67, 0x56, 0x69, 0xcc, 0x9a, 0xe1, 0xd0, 0x30, + 0x2d, 0x7f, 0x90, 0x6d, 0x25, 0x23, 0x09, 0x3c, 0x24, 0xf4, 0x25, 0x7a, 0x83, 0xbc, + 0x4f, 0x36, 0x62, 0x3a, 0x08, 0x2c, 0xe6, 0xeb, 0x45, 0x21, 0x95, 0x71, 0x91, 0xd5, + 0x7e, 0x14, 0x11, 0xed, 0xe7, 0x1d, 0x44, 0xb5, 0x6c, 0x57, 0x53, 0x14, 0xfa, 0x95, + 0x27, 0xae, 0xc5, 0xaf, 0xd5, 0x06, 0xc2, 0x42, 0xac, 0xdc, 0xa9, 0xd3, 0xc9, 0xa5, + 0x53, 0xcf, 0xef, 0x49, 0x9e, 0x87, 0x30, 0xf7, 0x55, 0x6a, 0xd0, 0xba, 0xc0, 0xff, + 0xb6, 0xd0, 0x8e, 0x7c, 0xac, 0x9b, 0x6e, 0x71, 0xf6, 0x6d, 0x19, 0x17, 0xfc, 0x52, + 0xdc, 0x91, 0x33, 0xae, 0x12, 0x4a, 0x40, 0x9d, 0xda, 0x38, 0x75, 0xcb, 0xae, 0xb5, + 0xf2, 0x96, 0xd5, 0x3a, 0x9f, 0x17, 0xb0, 0x28, 0x7d, 0xaa, 0x31, 0xd6, 0x89, 0xa7, + 0xde, 0xaf, 0x05, 0x2d, 0xab, 0xa6, 0xd0, 0xe8, 0x87, 0xcd, 0x1a, 0x3a, 0x6d, 0xd4, + 0x67, 0x17, 0xe5, 0xda, 0x63, 0xe5, 0x59, 0x67, 0x95, 0xf8, 0xe1, 0xdb, 0x6a, 0x45, + 0x8e, 0xab, 0x64, 0xa7, 0xd0, 0x68, 0xe1, 0x67, 0xef, 0xf1, 0x9b, 0xf2, 0x3b, 0x1b, + 0xe7, 0x72, 0x87, 0xf9, 0x0e, 0xe5, 0xcd, 0x34, 0x13, 0x85, 0xad, 0xc9, 0xda, 0xb7, + 0xd0, 0xef, 0x05, 0xc3, 0x61, 0x7d, 0x9f, 0x4b, 0xd7, 0xa2, 0x78, 0xb0, 0xa7, 0xc7, + 0x57, 0x73, 0x57, 0x89, 0xd3, 0xff, 0x0e, 0x91, 0xfb, 0xe1, 0x31, 0x78, 0xae, 0x76, + 0xeb, 0x91, 0xd8, 0x35, 0xd0, 0x65, 0xd7, 0xb3, 0x83, 0x18, 0xf5, 0x64, 0xb7, 0x69, + 0xe8, 0xd9, 0x68, 0x97, 0xb7, 0xab, 0xc8, 0xaa, 0xf3, 0x41, 0x7a, 0x49, 0xe6, 0x8f, + 0x35, 0xcd, 0x7f, 0x45, 0x1d, 0x99, 0x4a, 0xd8, 0x7d, 0xd4, 0xbc, 0x55, 0xc4, 0x5d, + 0xb3, 0x21, 0xf8, 0x49, 0xce, 0xb9, 0x54, 0x30, 0xe8, 0xe6, 0xe2, 0xe4, 0x8c, 0x3b, + 0xbf, 0x8f, 0x7a, 0x1a, 0xaf, 0x1c, 0x52, 0xf2, 0x3f, 0xca, 0x52, 0xca, 0xcc, 0xfb, + 0x26, 0xa4, 0x58, 0x40, 0x42, 0x73, 0xe5, 0x69, 0x7f, 0xcc, 0xf5, 0xa5, 0x9a, 0x61, + 0xb3, 0xea, 0xd6, 0x6a, 0x03, 0xfd, 0xaf, 0x31, 0xb2, 0xeb, 0x2d, 0x32, 0xa9, 0x02, + 0x40, 0x50, 0x98, 0xa7, 0x67, 0xbb, 0x6d, 0x30, 0xbf, 0x1b, 0x48, 0x7d, 0xcc, 0x5d, + 0x38, 0xfb, 0x9d, 0x54, 0x9c, 0xc5, 0x21, 0x30, 0x75, 0xe1, 0x2d, 0x04, 0x34, 0x71, + 0xc3, 0xab, 0x03, 0x5b, 0x1d, 0xff, 0xd6, 0xe8, 0xaa, 0x61, 0x99, 0xc8, 0x0c, 0xe9, + 0x9d, 0x66, 0xa5, 0x07, 0x3b, 0x91, 0x73, 0xc3, 0x25, 0x4b, 0xd2, 0x4a, 0xf5, 0x9c, + 0x96, 0x27, 0xb9, 0x8c, 0xdb, 0x06, 0x0f, 0x07, 0x34, 0x04, 0xb4, 0xfb, 0xf6, 0x5b, + 0xdd, 0x1a, 0xcb, 0x1c, 0xb6, 0xc0, 0xa4, 0xc1, 0x8d, 0x55, 0x4f, 0x7a, 0x4c, 0x5a, + 0x1a, 0x93, 0x94, 0xb3, 0x85, 0xe8, 0xdf, 0xf4, 0xbb, 0xd1, 0x4a, 0x1a, 0x20, 0x1f, + 0xa8, 0x33, 0x20, 0x37, 0x34, 0x5a, 0x62, 0x29, 0x3d, 0x8c, 0xfc, 0x5c, 0xd9, 0x4c, + 0x0c, 0x21, 0xa9, 0xc8, 0x06, 0x52, 0x1c, 0xe2, 0x28, 0x01, 0xdb, 0xa5, 0xb5, 0xa3, + 0xb3, 0xf6, 0x9a, 0xbd, 0x01, 0xd4, 0x4c, 0xcb, 0xc2, 0x3b, 0x06, 0x3f, 0x41, 0x2c, + 0xa1, 0xa9, 0xd4, 0xfd, 0x17, 0xda, 0xbe, 0x54, 0x9f, 0x8b, 0x89, 0x11, 0x21, 0xe0, + 0x79, 0xb8, 0x2b, 0x5e, 0x6e, 0xa7, 0x43, 0xe6, 0x37, 0xb9, 0xd2, 0xd1, 0x1e, 0x86, + 0xa0, 0xc2, 0x76, 0x9a, 0xe3, 0xdc, 0xde, 0xcd, 0x74, 0xcb, 0xec, 0xe5, 0x6e, 0x52, + 0x74, 0xca, 0x1f, 0x23, 0x25, 0xc3, 0x93, 0xe5, 0xef, 0x18, 0xef, 0x99, 0x03, 0x04, + 0x22, 0x39, 0xe2, 0x5c, 0x2f, 0x10, 0x62, 0x21, 0x2a, 0x04, 0x67, 0x0d, 0xd3, 0xea, + 0xd5, 0xa9, 0x55, 0xf7, 0x8b, 0x6a, 0x00, 0xdd, 0x9f, 0x12, 0xc1, 0xdc, 0x0b, 0x3a, + 0x58, 0xaf, 0x82, 0x3b, 0x78, 0x73, 0x22, 0xaa, 0x8f, 0x2e, 0xde, 0xc8, 0x48, 0x41, + 0x99, 0x15, 0xb0, 0x6b, 0x60, 0xd9, 0x5a, 0xf2, 0xd4, 0x41, 0xba, 0xd4, 0x35, 0x7b, + 0xed, 0x8a, 0xdb, 0xf0, 0xd0, 0x5f, 0xc6, 0x37, 0xcb, 0xaa, 0xff, 0x15, 0x58, 0x26, + 0x8c, 0x9c, 0x92, 0x41, 0x9e, 0x97, 0x51, 0xc4, 0x18, 0xa6, 0x7a, 0xe3, 0x86, 0x29, + 0xf0, 0xcd, 0xf7, 0x7d, 0xaa, 0xd6, 0xf0, 0xac, 0xc9, 0x32, 0x98, 0x51, 0xcd, 0x17, + 0xda, 0x6a, 0xd7, 0xbb, 0x73, 0xf3, 0x5d, 0x23, 0xba, 0xc7, + ], + ock: [ + 0xeb, 0x3e, 0xd9, 0xfc, 0xb3, 0xaa, 0x91, 0xc4, 0xf5, 0xec, 0xfd, 0x43, 0xdb, 0xda, + 0x40, 0x33, 0x06, 0x93, 0xc3, 0xa6, 0x56, 0x75, 0x45, 0xfd, 0x23, 0x6a, 0xf1, 0x90, + 0x8e, 0x29, 0x42, 0xa3, + ], + op: [ + 0x3f, 0xeb, 0x34, 0x5a, 0xec, 0xd3, 0x42, 0x9a, 0x16, 0xe1, 0x0f, 0x3d, 0x13, 0x20, + 0xbc, 0x99, 0x71, 0xb5, 0x9e, 0x63, 0x9d, 0x62, 0xb6, 0x96, 0x1a, 0xea, 0x78, 0x15, + 0x67, 0xa8, 0x60, 0x9e, 0x3b, 0xc1, 0x7a, 0x58, 0x0d, 0x53, 0x0f, 0x89, 0x30, 0xa3, + 0x6b, 0x8d, 0x6f, 0xea, 0x67, 0x85, 0x7f, 0x7b, 0x85, 0x20, 0xfd, 0x2e, 0x0a, 0xb5, + 0xd5, 0xcb, 0xab, 0x1a, 0xcc, 0xd5, 0x4e, 0x3a, + ], + c_out: [ + 0x60, 0xf3, 0xe8, 0x94, 0xe3, 0x86, 0x4e, 0xfb, 0x48, 0xcc, 0xae, 0x50, 0xe1, 0x0d, + 0xa7, 0x73, 0xdc, 0xcf, 0x85, 0x62, 0x45, 0x5d, 0x1b, 0x73, 0x1a, 0xad, 0x44, 0xe1, + 0x5e, 0x3e, 0x40, 0x18, 0x31, 0xce, 0x6f, 0x92, 0xf4, 0x53, 0x2d, 0x90, 0x83, 0x92, + 0x59, 0xce, 0x9c, 0xb1, 0x44, 0x62, 0x1f, 0x12, 0x01, 0x77, 0x8f, 0x61, 0x5d, 0x09, + 0x87, 0x01, 0x0c, 0x8d, 0x13, 0x5c, 0x32, 0xd5, 0x6e, 0xe2, 0x84, 0x68, 0x65, 0xa2, + 0x61, 0xde, 0x14, 0x25, 0xd2, 0x3b, 0xcc, 0x51, 0xb8, 0xa0, + ], + }, + TestVector { + incoming_viewing_key: [ + 0xc3, 0x7c, 0x7d, 0xbb, 0xe5, 0x51, 0xd9, 0xd3, 0xb1, 0xa4, 0x96, 0x88, 0x7d, 0xb2, + 0xe8, 0x42, 0xdc, 0x94, 0x52, 0x01, 0xf4, 0x08, 0x10, 0xdf, 0x4d, 0x76, 0x39, 0x32, + 0xed, 0x5c, 0x76, 0x39, 0x8b, 0x35, 0x73, 0xfe, 0x23, 0xf1, 0xe8, 0xb7, 0xe7, 0x9f, + 0x1c, 0x16, 0x95, 0xc0, 0x97, 0xc1, 0x24, 0xff, 0x1f, 0x7d, 0x6e, 0x61, 0xf2, 0xc5, + 0x8f, 0x14, 0x39, 0xa7, 0x56, 0x96, 0x9d, 0x19, + ], + ovk: [ + 0xa6, 0x68, 0xa0, 0xae, 0x2b, 0xb9, 0x34, 0xc8, 0x2c, 0x41, 0x42, 0xda, 0x69, 0xd1, + 0x2c, 0xa7, 0xde, 0x9a, 0x7d, 0xf7, 0x06, 0x40, 0x0e, 0xc7, 0x98, 0x78, 0xd8, 0x68, + 0xe1, 0x7e, 0x8f, 0x71, + ], + default_d: [ + 0x56, 0x4f, 0xc3, 0x81, 0xfc, 0x4d, 0xc8, 0x11, 0x8d, 0xe4, 0x7c, + ], + default_pk_d: [ + 0xae, 0xee, 0xa5, 0x0c, 0x6b, 0xb0, 0x2e, 0x5e, 0x22, 0x4d, 0xc2, 0x95, 0x9c, 0x22, + 0x9d, 0x0e, 0x3b, 0xb8, 0x79, 0xc4, 0xab, 0x00, 0xaa, 0x0a, 0xb2, 0x5a, 0x40, 0x10, + 0x6b, 0x80, 0xbb, 0xb7, + ], + v: 11137853725062838288, + rseed: [ + 0x25, 0x37, 0xb8, 0x71, 0xb4, 0x29, 0x4a, 0x65, 0xd3, 0xe0, 0x55, 0xff, 0x71, 0x8d, + 0xd9, 0xdc, 0x8c, 0x75, 0xe7, 0xe5, 0xb2, 0xef, 0xe4, 0x42, 0x63, 0x73, 0x71, 0xb7, + 0xc4, 0x8f, 0x6e, 0xe9, + ], + asset: [ + 0x67, 0x43, 0xf9, 0x3a, 0x6e, 0xbd, 0xa7, 0x2a, 0x8c, 0x7c, 0x5a, 0x2b, 0x7f, 0xa3, + 0x04, 0xfe, 0x32, 0xb2, 0x9b, 0x4f, 0x70, 0x6a, 0xa8, 0xf7, 0x42, 0x0f, 0x3d, 0x8e, + 0x7a, 0x59, 0x70, 0x2f, + ], + memo: [ + 0xff, 0x9e, 0x3e, 0xa3, 0x8a, 0x4b, 0x0f, 0x2f, 0x67, 0xfc, 0x2b, 0x90, 0x8c, 0xda, + 0x65, 0x7e, 0xae, 0x75, 0x4e, 0x03, 0x7e, 0x26, 0x2e, 0x9a, 0x9f, 0x9b, 0xd7, 0xec, + 0x42, 0x67, 0xed, 0x8e, 0x96, 0x93, 0x0e, 0x10, 0x84, 0x78, 0x3c, 0x37, 0xd6, 0xf9, + 0xdd, 0x15, 0xfd, 0x29, 0xf4, 0xcc, 0x47, 0x7e, 0x66, 0xf1, 0x30, 0xd6, 0x30, 0x43, + 0x0d, 0xcc, 0x01, 0x04, 0x89, 0x9b, 0x4f, 0x9f, 0x46, 0xeb, 0x09, 0x0e, 0xf7, 0xfc, + 0x90, 0xb4, 0x79, 0xab, 0xf6, 0x1f, 0x93, 0x95, 0x5e, 0xe0, 0x0e, 0x6a, 0x18, 0x48, + 0xf1, 0xab, 0x14, 0xad, 0x33, 0x4f, 0x2b, 0x68, 0x03, 0x58, 0x08, 0xcd, 0xf1, 0xbb, + 0x9e, 0x9d, 0x9a, 0x81, 0x6b, 0xaf, 0x72, 0x8a, 0x95, 0x5b, 0x96, 0x0b, 0x77, 0x01, + 0xfa, 0x62, 0x66, 0x87, 0xdc, 0x3c, 0x9c, 0xba, 0x64, 0x63, 0x37, 0xb5, 0x3e, 0x29, + 0x81, 0x6e, 0x94, 0x82, 0xdd, 0xf5, 0x57, 0x8a, 0x87, 0x68, 0xaa, 0xe4, 0x77, 0xfc, + 0xe4, 0x10, 0xac, 0x2d, 0x5d, 0xe6, 0x09, 0x58, 0x61, 0xc1, 0x11, 0xd7, 0xfe, 0xb3, + 0xe6, 0xbb, 0x4f, 0xbb, 0x5a, 0x54, 0x95, 0x54, 0x95, 0x97, 0x27, 0x98, 0x35, 0x0a, + 0x25, 0x3f, 0x05, 0xf6, 0x6c, 0x2e, 0xcf, 0xcb, 0xc0, 0xed, 0x43, 0xf5, 0xec, 0x2e, + 0x6d, 0x8d, 0xba, 0x15, 0xa5, 0x12, 0x54, 0xd9, 0x7b, 0x18, 0x21, 0x10, 0x7c, 0x07, + 0xdd, 0x9a, 0x16, 0xef, 0x84, 0x06, 0xf9, 0x43, 0xe2, 0x82, 0xb9, 0x5d, 0x4b, 0x36, + 0x25, 0x30, 0xc9, 0x13, 0xd6, 0xba, 0x42, 0x1d, 0xf6, 0x02, 0x7d, 0xe5, 0xaf, 0x1e, + 0x47, 0x45, 0xd5, 0x86, 0x81, 0x06, 0x95, 0x4b, 0xe6, 0xc1, 0x96, 0x27, 0x80, 0xa2, + 0x94, 0x10, 0x72, 0xe9, 0x51, 0x31, 0xb1, 0x67, 0x9d, 0xf0, 0x63, 0x76, 0x25, 0x04, + 0x2c, 0x37, 0xd4, 0x8f, 0xfb, 0x15, 0x2e, 0x5e, 0xbc, 0x18, 0x5c, 0x8a, 0x2b, 0x7d, + 0x43, 0x85, 0xf1, 0xc9, 0x5a, 0xf9, 0x37, 0xdf, 0x78, 0xdf, 0xd8, 0x75, 0x7f, 0xab, + 0x43, 0x49, 0x68, 0xb0, 0xb5, 0x7c, 0x66, 0x57, 0x44, 0x68, 0xf1, 0x60, 0xb4, 0x47, + 0xac, 0x82, 0x21, 0xe5, 0x06, 0x06, 0x76, 0xa8, 0x42, 0xa1, 0xc6, 0xb7, 0x17, 0x2d, + 0xd3, 0x34, 0x0f, 0x76, 0x40, 0x70, 0xab, 0x1f, 0xe0, 0x91, 0xc5, 0xc7, 0x4c, 0x95, + 0xa5, 0xdc, 0x04, 0x33, 0x90, 0x72, 0x3a, 0x4c, 0x12, 0x7d, 0xa1, 0x4c, 0xdd, 0xe1, + 0xdc, 0x26, 0x75, 0xa6, 0x23, 0x40, 0xb3, 0xe6, 0xaf, 0xd0, 0x52, 0x2a, 0x31, 0xde, + 0x26, 0xe7, 0xd1, 0xec, 0x3a, 0x9c, 0x8a, 0x09, 0x1f, 0xfd, 0xc7, 0x5b, 0x7e, 0xcf, + 0xdc, 0x7c, 0x12, 0x99, 0x5a, 0x5e, 0x37, 0xce, 0x34, 0x88, 0xbd, 0x29, 0xf8, 0x62, + 0x9d, 0x68, 0xf6, 0x96, 0x49, 0x24, 0x48, 0xdd, 0x52, 0x66, 0x97, 0x47, 0x6d, 0xc0, + 0x61, 0x34, 0x6e, 0xbe, 0x3f, 0x67, 0x72, 0x17, 0xff, 0x9c, 0x60, 0xef, 0xce, 0x94, + 0x3a, 0xf2, 0x8d, 0xfd, 0x3f, 0x9e, 0x59, 0x69, 0x25, 0x98, 0xa6, 0x04, 0x7c, 0x23, + 0xc4, 0xc0, 0x14, 0x00, 0xf1, 0xab, 0x57, 0x30, 0xea, 0xc0, 0xae, 0x8d, 0x58, 0x43, + 0xd5, 0x05, 0x1c, 0x37, 0x62, 0x40, 0x17, 0x2a, 0xf2, 0x18, 0xd7, 0xa1, 0xec, 0xfe, + 0x65, 0xb4, 0xf7, 0x51, 0x00, 0x63, 0x89, 0x83, 0xc1, 0x4d, 0xe4, 0x97, 0x47, 0x55, + 0xda, 0xde, 0x80, 0x18, 0xc9, 0xb8, 0xf4, 0x54, 0x3f, 0xb0, 0x95, 0x96, 0x15, 0x13, + 0xe6, 0x7c, 0x61, 0xdb, 0xc5, 0x9c, 0x60, 0x7f, 0x9b, 0x51, 0xf8, 0xd0, 0x9b, 0xdc, + 0xad, 0x28, 0xbc, 0xfb, 0x9e, 0x5d, 0x27, 0x44, 0xea, 0x88, 0x48, 0xb2, 0x62, 0x3a, + 0xc0, 0x7f, 0x8e, 0xf6, 0x1a, 0x81, 0xa3, 0x59, + ], + cv_net: [ + 0xb2, 0x7f, 0x48, 0x59, 0x15, 0x0d, 0x48, 0x45, 0xab, 0x57, 0x78, 0x82, 0x61, 0x50, + 0x0a, 0x12, 0x01, 0x2d, 0x63, 0xc0, 0x09, 0xc6, 0x77, 0x44, 0xba, 0xe0, 0xd5, 0x83, + 0x88, 0xff, 0xee, 0x2f, + ], + rho: [ + 0x54, 0x3e, 0xa7, 0x11, 0x56, 0xc9, 0xa6, 0xf8, 0x04, 0x1f, 0xa7, 0x7e, 0xc1, 0xc5, + 0xaf, 0x90, 0x28, 0x8f, 0x27, 0x20, 0xf1, 0x3f, 0xf0, 0x93, 0xc6, 0x86, 0x26, 0x6b, + 0x92, 0xd7, 0xa0, 0x24, + ], + cmx: [ + 0x1d, 0x51, 0xea, 0x92, 0xfa, 0x43, 0x55, 0x0a, 0x0e, 0xdd, 0xea, 0x23, 0x6e, 0x17, + 0xa0, 0x16, 0x93, 0xc2, 0x2d, 0x8d, 0xd8, 0x1c, 0x9c, 0x9e, 0xc8, 0x76, 0xa2, 0x4e, + 0x67, 0xd4, 0x93, 0x0b, + ], + esk: [ + 0x19, 0xe0, 0x26, 0x4b, 0x82, 0x88, 0xf7, 0x3e, 0xbf, 0x97, 0x14, 0xb0, 0xdf, 0x85, + 0x8e, 0xf7, 0xab, 0x39, 0xec, 0x50, 0x2c, 0xd2, 0x98, 0xf2, 0xc4, 0x84, 0xa9, 0xf4, + 0xc7, 0xda, 0x74, 0x36, + ], + ephemeral_key: [ + 0x8f, 0xbe, 0xb6, 0xb3, 0x03, 0x8e, 0x69, 0x49, 0x91, 0x6a, 0x2c, 0x06, 0x0e, 0xf9, + 0xa4, 0xb1, 0xfe, 0xf1, 0x3a, 0xce, 0x2f, 0xee, 0x00, 0x25, 0xda, 0x32, 0xc3, 0x6d, + 0x23, 0x1a, 0x61, 0x34, + ], + shared_secret: [ + 0x67, 0xd6, 0x8a, 0x5a, 0x05, 0x93, 0xfd, 0x16, 0x7d, 0x38, 0x08, 0x2e, 0x49, 0xd2, + 0x30, 0x30, 0x86, 0xe5, 0x5a, 0x43, 0xc1, 0x24, 0xd5, 0xaa, 0xa8, 0x20, 0xab, 0x0c, + 0x3f, 0x5c, 0xc5, 0x37, + ], + k_enc: [ + 0x6b, 0x8d, 0x83, 0xf2, 0xf1, 0xfd, 0x1e, 0xad, 0x7d, 0x45, 0x42, 0xb3, 0x63, 0x09, + 0x34, 0x07, 0xc5, 0x0a, 0x20, 0xed, 0x7f, 0x0e, 0x8c, 0xf2, 0xdb, 0x53, 0x6d, 0xb1, + 0xbe, 0x25, 0xe9, 0x8d, + ], + p_enc: [ + 0x03, 0x56, 0x4f, 0xc3, 0x81, 0xfc, 0x4d, 0xc8, 0x11, 0x8d, 0xe4, 0x7c, 0x10, 0xb8, + 0xa1, 0xba, 0xf3, 0x9a, 0x91, 0x9a, 0x25, 0x37, 0xb8, 0x71, 0xb4, 0x29, 0x4a, 0x65, + 0xd3, 0xe0, 0x55, 0xff, 0x71, 0x8d, 0xd9, 0xdc, 0x8c, 0x75, 0xe7, 0xe5, 0xb2, 0xef, + 0xe4, 0x42, 0x63, 0x73, 0x71, 0xb7, 0xc4, 0x8f, 0x6e, 0xe9, 0x67, 0x43, 0xf9, 0x3a, + 0x6e, 0xbd, 0xa7, 0x2a, 0x8c, 0x7c, 0x5a, 0x2b, 0x7f, 0xa3, 0x04, 0xfe, 0x32, 0xb2, + 0x9b, 0x4f, 0x70, 0x6a, 0xa8, 0xf7, 0x42, 0x0f, 0x3d, 0x8e, 0x7a, 0x59, 0x70, 0x2f, + 0xff, 0x9e, 0x3e, 0xa3, 0x8a, 0x4b, 0x0f, 0x2f, 0x67, 0xfc, 0x2b, 0x90, 0x8c, 0xda, + 0x65, 0x7e, 0xae, 0x75, 0x4e, 0x03, 0x7e, 0x26, 0x2e, 0x9a, 0x9f, 0x9b, 0xd7, 0xec, + 0x42, 0x67, 0xed, 0x8e, 0x96, 0x93, 0x0e, 0x10, 0x84, 0x78, 0x3c, 0x37, 0xd6, 0xf9, + 0xdd, 0x15, 0xfd, 0x29, 0xf4, 0xcc, 0x47, 0x7e, 0x66, 0xf1, 0x30, 0xd6, 0x30, 0x43, + 0x0d, 0xcc, 0x01, 0x04, 0x89, 0x9b, 0x4f, 0x9f, 0x46, 0xeb, 0x09, 0x0e, 0xf7, 0xfc, + 0x90, 0xb4, 0x79, 0xab, 0xf6, 0x1f, 0x93, 0x95, 0x5e, 0xe0, 0x0e, 0x6a, 0x18, 0x48, + 0xf1, 0xab, 0x14, 0xad, 0x33, 0x4f, 0x2b, 0x68, 0x03, 0x58, 0x08, 0xcd, 0xf1, 0xbb, + 0x9e, 0x9d, 0x9a, 0x81, 0x6b, 0xaf, 0x72, 0x8a, 0x95, 0x5b, 0x96, 0x0b, 0x77, 0x01, + 0xfa, 0x62, 0x66, 0x87, 0xdc, 0x3c, 0x9c, 0xba, 0x64, 0x63, 0x37, 0xb5, 0x3e, 0x29, + 0x81, 0x6e, 0x94, 0x82, 0xdd, 0xf5, 0x57, 0x8a, 0x87, 0x68, 0xaa, 0xe4, 0x77, 0xfc, + 0xe4, 0x10, 0xac, 0x2d, 0x5d, 0xe6, 0x09, 0x58, 0x61, 0xc1, 0x11, 0xd7, 0xfe, 0xb3, + 0xe6, 0xbb, 0x4f, 0xbb, 0x5a, 0x54, 0x95, 0x54, 0x95, 0x97, 0x27, 0x98, 0x35, 0x0a, + 0x25, 0x3f, 0x05, 0xf6, 0x6c, 0x2e, 0xcf, 0xcb, 0xc0, 0xed, 0x43, 0xf5, 0xec, 0x2e, + 0x6d, 0x8d, 0xba, 0x15, 0xa5, 0x12, 0x54, 0xd9, 0x7b, 0x18, 0x21, 0x10, 0x7c, 0x07, + 0xdd, 0x9a, 0x16, 0xef, 0x84, 0x06, 0xf9, 0x43, 0xe2, 0x82, 0xb9, 0x5d, 0x4b, 0x36, + 0x25, 0x30, 0xc9, 0x13, 0xd6, 0xba, 0x42, 0x1d, 0xf6, 0x02, 0x7d, 0xe5, 0xaf, 0x1e, + 0x47, 0x45, 0xd5, 0x86, 0x81, 0x06, 0x95, 0x4b, 0xe6, 0xc1, 0x96, 0x27, 0x80, 0xa2, + 0x94, 0x10, 0x72, 0xe9, 0x51, 0x31, 0xb1, 0x67, 0x9d, 0xf0, 0x63, 0x76, 0x25, 0x04, + 0x2c, 0x37, 0xd4, 0x8f, 0xfb, 0x15, 0x2e, 0x5e, 0xbc, 0x18, 0x5c, 0x8a, 0x2b, 0x7d, + 0x43, 0x85, 0xf1, 0xc9, 0x5a, 0xf9, 0x37, 0xdf, 0x78, 0xdf, 0xd8, 0x75, 0x7f, 0xab, + 0x43, 0x49, 0x68, 0xb0, 0xb5, 0x7c, 0x66, 0x57, 0x44, 0x68, 0xf1, 0x60, 0xb4, 0x47, + 0xac, 0x82, 0x21, 0xe5, 0x06, 0x06, 0x76, 0xa8, 0x42, 0xa1, 0xc6, 0xb7, 0x17, 0x2d, + 0xd3, 0x34, 0x0f, 0x76, 0x40, 0x70, 0xab, 0x1f, 0xe0, 0x91, 0xc5, 0xc7, 0x4c, 0x95, + 0xa5, 0xdc, 0x04, 0x33, 0x90, 0x72, 0x3a, 0x4c, 0x12, 0x7d, 0xa1, 0x4c, 0xdd, 0xe1, + 0xdc, 0x26, 0x75, 0xa6, 0x23, 0x40, 0xb3, 0xe6, 0xaf, 0xd0, 0x52, 0x2a, 0x31, 0xde, + 0x26, 0xe7, 0xd1, 0xec, 0x3a, 0x9c, 0x8a, 0x09, 0x1f, 0xfd, 0xc7, 0x5b, 0x7e, 0xcf, + 0xdc, 0x7c, 0x12, 0x99, 0x5a, 0x5e, 0x37, 0xce, 0x34, 0x88, 0xbd, 0x29, 0xf8, 0x62, + 0x9d, 0x68, 0xf6, 0x96, 0x49, 0x24, 0x48, 0xdd, 0x52, 0x66, 0x97, 0x47, 0x6d, 0xc0, + 0x61, 0x34, 0x6e, 0xbe, 0x3f, 0x67, 0x72, 0x17, 0xff, 0x9c, 0x60, 0xef, 0xce, 0x94, + 0x3a, 0xf2, 0x8d, 0xfd, 0x3f, 0x9e, 0x59, 0x69, 0x25, 0x98, 0xa6, 0x04, 0x7c, 0x23, + 0xc4, 0xc0, 0x14, 0x00, 0xf1, 0xab, 0x57, 0x30, 0xea, 0xc0, 0xae, 0x8d, 0x58, 0x43, + 0xd5, 0x05, 0x1c, 0x37, 0x62, 0x40, 0x17, 0x2a, 0xf2, 0x18, 0xd7, 0xa1, 0xec, 0xfe, + 0x65, 0xb4, 0xf7, 0x51, 0x00, 0x63, 0x89, 0x83, 0xc1, 0x4d, 0xe4, 0x97, 0x47, 0x55, + 0xda, 0xde, 0x80, 0x18, 0xc9, 0xb8, 0xf4, 0x54, 0x3f, 0xb0, 0x95, 0x96, 0x15, 0x13, + 0xe6, 0x7c, 0x61, 0xdb, 0xc5, 0x9c, 0x60, 0x7f, 0x9b, 0x51, 0xf8, 0xd0, 0x9b, 0xdc, + 0xad, 0x28, 0xbc, 0xfb, 0x9e, 0x5d, 0x27, 0x44, 0xea, 0x88, 0x48, 0xb2, 0x62, 0x3a, + 0xc0, 0x7f, 0x8e, 0xf6, 0x1a, 0x81, 0xa3, 0x59, + ], + c_enc: [ + 0x76, 0xc6, 0xef, 0xc8, 0xb5, 0x42, 0xa7, 0x07, 0xc0, 0xa5, 0xcf, 0x5c, 0xe3, 0xf3, + 0xb9, 0x6d, 0xe1, 0x91, 0x95, 0x7c, 0x9f, 0xa6, 0xe9, 0xbb, 0x4b, 0x8d, 0x89, 0x9e, + 0x1f, 0x19, 0xe0, 0x20, 0xba, 0x7b, 0xb3, 0xfe, 0xf1, 0x67, 0x81, 0xc8, 0x8c, 0xc5, + 0xd4, 0x4a, 0x5e, 0xf8, 0x17, 0x31, 0x47, 0xdc, 0x3d, 0x1b, 0xc9, 0xb7, 0x31, 0x44, + 0x93, 0x2b, 0x1e, 0xeb, 0x8c, 0x2a, 0x84, 0xf9, 0x3d, 0x9b, 0xdf, 0x53, 0x78, 0x67, + 0xab, 0x82, 0x4c, 0xc3, 0xa4, 0xc5, 0xdc, 0x5b, 0xeb, 0xd8, 0x95, 0x26, 0xba, 0x5c, + 0x2b, 0x5a, 0x76, 0x76, 0x4b, 0x33, 0x2f, 0x2d, 0xdc, 0x0f, 0x48, 0x2f, 0xd4, 0x57, + 0xb3, 0x6d, 0x16, 0x05, 0xca, 0xea, 0xe2, 0xc7, 0xf1, 0x5a, 0x05, 0x91, 0xfa, 0x40, + 0xa4, 0x57, 0x49, 0xa7, 0x58, 0xcb, 0x88, 0xaa, 0xd5, 0xd0, 0x85, 0x92, 0x11, 0x4e, + 0x75, 0x7b, 0x19, 0x37, 0xf4, 0x99, 0x73, 0xe5, 0xba, 0x72, 0x8c, 0xa4, 0xb0, 0x9c, + 0x71, 0xe2, 0x25, 0x54, 0xf8, 0x89, 0x34, 0x8d, 0xbe, 0x7b, 0x7d, 0x7b, 0xd5, 0x02, + 0x84, 0x71, 0x20, 0xe1, 0xfe, 0xb6, 0xaf, 0x86, 0xeb, 0x19, 0x1a, 0xb2, 0x1d, 0x21, + 0x20, 0xa6, 0xbd, 0x2c, 0x38, 0x04, 0x22, 0x28, 0xa7, 0xb0, 0xda, 0xc3, 0x16, 0xe3, + 0x39, 0x05, 0x4f, 0xb4, 0x30, 0xce, 0xac, 0x6c, 0xea, 0xa8, 0xd3, 0x18, 0x10, 0xa7, + 0x99, 0x7f, 0xfb, 0xc1, 0x58, 0xfc, 0x7b, 0x2c, 0xb6, 0x2b, 0x13, 0x5e, 0xde, 0x3f, + 0x65, 0x6e, 0x4b, 0x13, 0x57, 0xac, 0x31, 0x48, 0x96, 0xf1, 0x35, 0x58, 0xec, 0x32, + 0x90, 0x8e, 0x9d, 0xd6, 0x85, 0xb4, 0xee, 0x9a, 0x7d, 0x81, 0x4d, 0xdc, 0x50, 0x2c, + 0xe7, 0xac, 0xa1, 0xda, 0x00, 0xee, 0xda, 0xe4, 0x96, 0x03, 0x35, 0xe5, 0x75, 0x6a, + 0x42, 0xd6, 0xf4, 0x4f, 0x85, 0x2c, 0x8a, 0x7a, 0xd0, 0x0e, 0xf7, 0x9a, 0x4d, 0xb1, + 0x4e, 0xae, 0xc9, 0x56, 0x2a, 0xba, 0xc3, 0x08, 0x01, 0x1e, 0xbf, 0x00, 0x57, 0x6e, + 0x6c, 0xa3, 0xea, 0x16, 0xe5, 0x01, 0xbf, 0x35, 0x0f, 0x82, 0x14, 0xb6, 0x84, 0x04, + 0xdb, 0x24, 0x2e, 0x9f, 0x85, 0x3d, 0x82, 0xbe, 0x44, 0x25, 0x0d, 0xf0, 0xa8, 0x1d, + 0xe7, 0x0e, 0x10, 0x40, 0xfa, 0xde, 0x44, 0x69, 0x1e, 0xca, 0x6e, 0x03, 0xc4, 0x6c, + 0x4b, 0x57, 0xc7, 0x89, 0xc9, 0x74, 0x8e, 0x0e, 0x2e, 0xf4, 0x11, 0x9d, 0xbd, 0x7b, + 0x39, 0x3d, 0x63, 0x3c, 0x6e, 0xc8, 0xf0, 0xd0, 0x4d, 0x97, 0x1d, 0x2b, 0xd5, 0xab, + 0xed, 0x9f, 0x36, 0xc9, 0xb4, 0xb4, 0x6e, 0x3b, 0x32, 0x56, 0x9d, 0x31, 0x89, 0x45, + 0x6e, 0x65, 0x51, 0x67, 0x7e, 0xe7, 0x71, 0xb0, 0xf0, 0xa2, 0x6f, 0x84, 0xc2, 0x9f, + 0xdc, 0xa3, 0xd6, 0x42, 0x82, 0x60, 0x05, 0x37, 0x34, 0x7b, 0xd7, 0xf6, 0x0c, 0xe4, + 0x27, 0xbf, 0x55, 0xe9, 0xb1, 0xbf, 0xd4, 0xb7, 0x56, 0x4f, 0x9f, 0xb1, 0x93, 0x02, + 0xdc, 0x41, 0xe7, 0xde, 0xde, 0x7f, 0x4f, 0xc0, 0x0f, 0x57, 0x3e, 0x33, 0xf4, 0xbe, + 0x41, 0x40, 0xdd, 0xc9, 0x76, 0x93, 0xaf, 0x52, 0x48, 0x95, 0x87, 0xf0, 0xd0, 0x81, + 0x0f, 0x3d, 0x9c, 0x35, 0x6f, 0x32, 0xe9, 0x3d, 0x47, 0x56, 0x0c, 0x01, 0x1c, 0x0c, + 0x94, 0xe1, 0xa6, 0x49, 0x7e, 0x87, 0x45, 0x8e, 0xad, 0x8a, 0x34, 0x67, 0x84, 0xbc, + 0x42, 0x66, 0x16, 0x7f, 0x87, 0x7e, 0x38, 0x92, 0xa8, 0x98, 0x77, 0x4c, 0xe3, 0xad, + 0x3b, 0x82, 0x8d, 0x9d, 0xd1, 0xd2, 0xe4, 0x0a, 0x89, 0xf1, 0xfc, 0xe4, 0x9d, 0x6b, + 0x20, 0x18, 0x9e, 0x0c, 0x22, 0xe0, 0x17, 0xab, 0x55, 0x5b, 0x68, 0xa7, 0x4e, 0x66, + 0xb4, 0xeb, 0x31, 0xee, 0x78, 0xaf, 0xbe, 0x63, 0x25, 0xcb, 0xad, 0xd5, 0xa8, 0x38, + 0x29, 0x49, 0xf3, 0xc7, 0x48, 0xa9, 0xe7, 0x22, 0xfc, 0x58, 0xeb, 0xab, 0xdc, 0x69, + 0x64, 0x22, 0x4c, 0x48, 0x58, 0x6e, 0x94, 0x3c, 0x60, 0x2f, 0x70, 0x5e, 0x55, 0x4b, + 0xc0, 0x1c, 0x58, 0x90, 0x4d, 0x2f, 0xa7, 0x1e, 0x4c, 0x44, 0xe3, 0x8c, 0x3d, 0x19, + 0x04, 0x7d, 0xa9, 0x39, 0xaf, 0x3b, 0x3f, 0xba, 0x89, 0xad, 0x1b, 0x83, 0xb5, 0xb3, + 0xb4, 0xbd, 0x8c, 0xe5, 0x99, 0xeb, 0x69, 0x7a, 0xb6, 0x5d, 0x37, 0x04, 0x5e, 0xa9, + 0x15, 0x98, 0xdb, 0x59, 0x18, 0x75, 0xf6, 0xcc, 0x18, 0x02, 0x79, 0x0a, 0x3c, 0x1f, + 0x40, 0xeb, 0x68, 0x8e, 0x7c, 0xb8, 0xbb, 0x3d, 0x07, 0xde, + ], + ock: [ + 0xb4, 0xf8, 0x8a, 0x29, 0x2d, 0x09, 0xd9, 0x35, 0xb4, 0x77, 0x5a, 0x29, 0x30, 0xeb, + 0x38, 0xce, 0xbd, 0x5a, 0xf6, 0xff, 0x3f, 0x39, 0xef, 0x5b, 0xb2, 0x4c, 0xd5, 0x72, + 0x81, 0xf0, 0x8c, 0xfb, + ], + op: [ + 0xae, 0xee, 0xa5, 0x0c, 0x6b, 0xb0, 0x2e, 0x5e, 0x22, 0x4d, 0xc2, 0x95, 0x9c, 0x22, + 0x9d, 0x0e, 0x3b, 0xb8, 0x79, 0xc4, 0xab, 0x00, 0xaa, 0x0a, 0xb2, 0x5a, 0x40, 0x10, + 0x6b, 0x80, 0xbb, 0xb7, 0x19, 0xe0, 0x26, 0x4b, 0x82, 0x88, 0xf7, 0x3e, 0xbf, 0x97, + 0x14, 0xb0, 0xdf, 0x85, 0x8e, 0xf7, 0xab, 0x39, 0xec, 0x50, 0x2c, 0xd2, 0x98, 0xf2, + 0xc4, 0x84, 0xa9, 0xf4, 0xc7, 0xda, 0x74, 0x36, + ], + c_out: [ + 0x94, 0xe3, 0x7f, 0xd6, 0x62, 0x82, 0xc0, 0x2e, 0x90, 0xe7, 0x69, 0x91, 0x4c, 0xaf, + 0x95, 0xa4, 0x95, 0xf4, 0x89, 0x7f, 0x55, 0xa5, 0xae, 0x95, 0xad, 0xe8, 0xbf, 0x67, + 0x61, 0xe3, 0x1b, 0xa5, 0xd1, 0xcf, 0xeb, 0x30, 0x6f, 0x4e, 0x22, 0x01, 0x42, 0x51, + 0xcb, 0xe3, 0xf8, 0x72, 0x4b, 0xe7, 0x69, 0x21, 0xe2, 0xad, 0xa4, 0x6e, 0x3b, 0x14, + 0x5d, 0x1b, 0x04, 0x3e, 0xb1, 0x2a, 0x0e, 0xfa, 0xb5, 0x16, 0x09, 0x34, 0xbc, 0x75, + 0x9e, 0x02, 0x01, 0xd8, 0x66, 0xad, 0xa7, 0x44, 0x35, 0x71, + ], + }, + TestVector { + incoming_viewing_key: [ + 0x74, 0xa8, 0x41, 0x1a, 0x20, 0xbc, 0x3c, 0x53, 0xf7, 0xe7, 0xab, 0xb9, 0x31, 0x6c, + 0x44, 0x2b, 0x4b, 0x09, 0xcf, 0x88, 0xbb, 0xed, 0x4a, 0x90, 0xb9, 0x2f, 0x5a, 0x1c, + 0xed, 0x93, 0x16, 0x2b, 0xc3, 0x37, 0x34, 0x67, 0x20, 0xec, 0x0c, 0xd0, 0xea, 0x73, + 0x5d, 0x9e, 0x32, 0x3f, 0x20, 0xdb, 0x77, 0x8a, 0xd1, 0x8a, 0x84, 0xc7, 0x9e, 0xe6, + 0x28, 0x77, 0x99, 0xef, 0x02, 0x76, 0x41, 0x07, + ], + ovk: [ + 0x0c, 0x81, 0x1e, 0x4c, 0x31, 0xfb, 0xb4, 0x9f, 0x3a, 0x90, 0xbb, 0xd0, 0x5d, 0xce, + 0x62, 0xf3, 0x44, 0xe7, 0x07, 0x75, 0x93, 0x15, 0x9a, 0xe3, 0x50, 0x50, 0xb0, 0x4c, + 0x9e, 0x6b, 0x86, 0xbc, + ], + default_d: [ + 0xc6, 0xe8, 0xf0, 0xd5, 0x0a, 0xe8, 0x05, 0x87, 0x91, 0xdc, 0x0e, + ], + default_pk_d: [ + 0x8e, 0x66, 0xb7, 0x92, 0xec, 0xb1, 0x56, 0xef, 0x68, 0x5e, 0xe8, 0xea, 0x35, 0xd3, + 0x82, 0x75, 0x8b, 0xa4, 0x15, 0x97, 0xa3, 0x3a, 0x93, 0xba, 0xf3, 0x81, 0xd6, 0x3c, + 0x17, 0x5b, 0xa9, 0x8b, + ], + v: 7387862906040043846, + rseed: [ + 0x25, 0x01, 0xe5, 0x1b, 0x01, 0x2a, 0xea, 0x94, 0x46, 0xa2, 0x10, 0x4e, 0x93, 0xf8, + 0x15, 0xa0, 0xb3, 0xa2, 0x9b, 0x45, 0x83, 0x14, 0xf3, 0xd8, 0xbe, 0x2b, 0x98, 0x23, + 0xd3, 0x42, 0xf4, 0x62, + ], + asset: [ + 0x67, 0x43, 0xf9, 0x3a, 0x6e, 0xbd, 0xa7, 0x2a, 0x8c, 0x7c, 0x5a, 0x2b, 0x7f, 0xa3, + 0x04, 0xfe, 0x32, 0xb2, 0x9b, 0x4f, 0x70, 0x6a, 0xa8, 0xf7, 0x42, 0x0f, 0x3d, 0x8e, + 0x7a, 0x59, 0x70, 0x2f, + ], + memo: [ + 0xff, 0x13, 0xe9, 0x42, 0xa7, 0xe1, 0x9a, 0x46, 0xe9, 0x70, 0xb5, 0xc5, 0x06, 0x70, + 0x84, 0x30, 0x31, 0x7b, 0x1b, 0xb3, 0xb3, 0x5d, 0xf6, 0x8a, 0xe3, 0x3a, 0x49, 0x26, + 0xa0, 0x3e, 0x6b, 0xfe, 0xb5, 0x51, 0x04, 0x16, 0xfc, 0xbb, 0x05, 0x24, 0xc9, 0xca, + 0x50, 0x74, 0x15, 0x6c, 0xc5, 0xa5, 0xd6, 0xfe, 0x1c, 0x99, 0x5e, 0xdc, 0x60, 0xa2, + 0xf5, 0x50, 0x41, 0x1a, 0xa4, 0x1e, 0x3d, 0xa3, 0xbd, 0xcf, 0x64, 0xbc, 0xf0, 0x4a, + 0x05, 0x10, 0x57, 0x1b, 0x93, 0x6d, 0x47, 0xe5, 0x5c, 0xec, 0x03, 0x30, 0xee, 0x8d, + 0xfe, 0x73, 0x56, 0x34, 0x04, 0xf0, 0x47, 0xd7, 0xf3, 0xa8, 0xa3, 0xd7, 0x74, 0x3b, + 0xc5, 0x54, 0x95, 0x52, 0x10, 0xf1, 0xeb, 0x0d, 0x08, 0x59, 0x9e, 0xa7, 0x7d, 0x5f, + 0x97, 0x4d, 0x87, 0x17, 0x6d, 0x37, 0xd9, 0x8b, 0x9c, 0x0a, 0xd4, 0x40, 0x40, 0x72, + 0x09, 0xed, 0x6a, 0x9f, 0x08, 0x46, 0x4d, 0x56, 0x55, 0x93, 0xe1, 0xa6, 0x3b, 0x93, + 0x85, 0x36, 0xb4, 0x92, 0x44, 0xe9, 0x7d, 0x88, 0x01, 0x73, 0xb6, 0x40, 0xf2, 0xdd, + 0xb7, 0x4d, 0x06, 0x8e, 0xcb, 0x46, 0xcf, 0x28, 0x9b, 0x7d, 0x89, 0x13, 0x07, 0xbb, + 0xa3, 0x70, 0x54, 0xcf, 0x91, 0xb3, 0x1f, 0xc8, 0x2f, 0x74, 0xd5, 0xfc, 0xc0, 0x00, + 0x94, 0x2e, 0xde, 0x91, 0x18, 0x25, 0xf5, 0x3f, 0xe6, 0x09, 0x68, 0x6f, 0x46, 0x32, + 0x23, 0xb1, 0xe9, 0xbc, 0x03, 0xbd, 0xe8, 0x95, 0xd1, 0x23, 0x8f, 0xad, 0x04, 0xa3, + 0xbf, 0xce, 0x68, 0xa0, 0x75, 0xe8, 0xa3, 0x7c, 0x0e, 0x87, 0xbf, 0x46, 0xdd, 0x01, + 0x55, 0x45, 0xf9, 0xb4, 0xfb, 0x0e, 0xec, 0x64, 0x5f, 0xfc, 0xbb, 0xe0, 0xca, 0x5f, + 0x8c, 0x56, 0x1b, 0x25, 0x7d, 0x52, 0xd6, 0x02, 0xd8, 0xc9, 0x4c, 0x50, 0x28, 0x73, + 0xa0, 0x1d, 0x92, 0x51, 0xd8, 0xc8, 0x60, 0xc0, 0x41, 0x52, 0x5b, 0x3b, 0xf4, 0xe3, + 0xa2, 0xeb, 0x92, 0x72, 0x81, 0x5c, 0x75, 0x86, 0x76, 0x84, 0x28, 0xb4, 0xc2, 0xb2, + 0x5e, 0x37, 0x45, 0xf0, 0x09, 0xc5, 0xdc, 0xe2, 0x0b, 0x69, 0xd5, 0xd7, 0xc4, 0x3c, + 0xeb, 0x73, 0x6b, 0x68, 0x31, 0xe8, 0xc1, 0x10, 0xf1, 0x6c, 0xfd, 0xb3, 0xa4, 0x67, + 0xe9, 0x41, 0x4c, 0x00, 0xec, 0xf1, 0x37, 0x31, 0x50, 0x08, 0x94, 0x55, 0x56, 0x78, + 0xc4, 0x97, 0xfa, 0xba, 0x9a, 0x95, 0xd0, 0x1c, 0xc4, 0x64, 0x39, 0x0f, 0xc4, 0xa7, + 0x6b, 0xfa, 0x8b, 0x0e, 0x1c, 0x68, 0xa5, 0x25, 0xd7, 0x06, 0xd6, 0x60, 0x4b, 0x23, + 0x30, 0xb6, 0xb3, 0x48, 0x52, 0x15, 0xf6, 0x06, 0xf1, 0x88, 0x3a, 0x75, 0x15, 0x88, + 0xc7, 0xef, 0xa5, 0x06, 0xc3, 0xe8, 0xd0, 0xc6, 0x01, 0x92, 0xe8, 0x47, 0x6b, 0xd1, + 0x17, 0x5d, 0x95, 0x62, 0x08, 0x7b, 0xdb, 0x81, 0x8e, 0x66, 0x21, 0x62, 0x86, 0xba, + 0xfe, 0x47, 0xff, 0x4d, 0xbc, 0xce, 0xd5, 0x14, 0x44, 0x48, 0x0a, 0x9a, 0x56, 0x73, + 0xec, 0xe7, 0xfa, 0xc7, 0x3a, 0x0e, 0xd4, 0x1a, 0xb0, 0x05, 0x17, 0x53, 0xa7, 0xca, + 0xa8, 0x9b, 0xe3, 0x13, 0x9a, 0xfd, 0x97, 0x93, 0xb3, 0xe0, 0x2f, 0x27, 0xf0, 0x40, + 0x04, 0x65, 0x95, 0xac, 0xd4, 0x7b, 0xf1, 0x3f, 0xd0, 0xda, 0x27, 0xf0, 0x9e, 0xda, + 0x48, 0x03, 0x6d, 0x3e, 0xe4, 0x37, 0xf2, 0xee, 0x8f, 0x86, 0x06, 0xea, 0x97, 0x34, + 0x3c, 0x33, 0x58, 0x46, 0x57, 0xf4, 0x6d, 0xba, 0x99, 0xdb, 0x5c, 0xfe, 0x6c, 0xa1, + 0x76, 0xfa, 0xb7, 0xb0, 0xf3, 0xbf, 0xa0, 0xab, 0x61, 0xe3, 0x40, 0xc3, 0x4e, 0xb9, + 0xf1, 0x7c, 0x7e, 0xc2, 0xbe, 0x03, 0xb1, 0x80, 0xf0, 0xbb, 0x6f, 0x43, 0x4c, 0x2a, + 0x65, 0x42, 0xe0, 0x0e, 0x84, 0x37, 0x3f, 0x4f, + ], + cv_net: [ + 0x47, 0x35, 0xa6, 0xfd, 0x21, 0x5c, 0x7b, 0x95, 0x03, 0x3d, 0xab, 0x62, 0xcc, 0xf9, + 0xcd, 0x51, 0x00, 0x89, 0x08, 0xa6, 0xcd, 0xd0, 0xaa, 0x02, 0x1b, 0x88, 0x8b, 0x98, + 0xe2, 0x3c, 0x39, 0x11, + ], + rho: [ + 0xbd, 0xda, 0xe8, 0xdf, 0xf1, 0x20, 0x5e, 0x04, 0x96, 0x8f, 0xae, 0x1f, 0xd9, 0xbe, + 0x51, 0xd8, 0x25, 0xf5, 0xd8, 0x78, 0x1d, 0x93, 0x3d, 0x0f, 0x5b, 0xce, 0x9c, 0xa8, + 0x3e, 0xe8, 0xed, 0x20, + ], + cmx: [ + 0xbe, 0x43, 0xee, 0x84, 0x70, 0x70, 0x75, 0xac, 0x48, 0x08, 0xd0, 0x97, 0x54, 0x07, + 0xc0, 0x27, 0x36, 0xd7, 0x66, 0x64, 0xf4, 0xe7, 0xae, 0xce, 0x01, 0xd9, 0xcc, 0x68, + 0x32, 0x4a, 0xe9, 0x04, + ], + esk: [ + 0xf9, 0xf7, 0xa0, 0x10, 0x5e, 0xa9, 0xf4, 0x45, 0xfb, 0x7a, 0x14, 0x49, 0x72, 0x62, + 0xc6, 0xe4, 0xd7, 0x32, 0x89, 0x32, 0x7b, 0x8a, 0x2d, 0xf5, 0xe2, 0x63, 0xf3, 0xe3, + 0x99, 0x07, 0xea, 0x0c, + ], + ephemeral_key: [ + 0xfa, 0x19, 0xa1, 0x52, 0x7b, 0x76, 0x04, 0x8f, 0xf3, 0x7f, 0xa4, 0xf8, 0x27, 0x89, + 0xfe, 0x80, 0xb0, 0xcd, 0xd3, 0x5d, 0x5d, 0xa9, 0xc2, 0xec, 0x3f, 0xe3, 0x04, 0x38, + 0x05, 0xc0, 0x61, 0x23, + ], + shared_secret: [ + 0x2d, 0xb5, 0xb8, 0x92, 0xb6, 0x1b, 0x9c, 0x55, 0x3b, 0x6c, 0x9b, 0x7a, 0xcc, 0x7d, + 0x71, 0x05, 0xc1, 0xdd, 0x4c, 0x28, 0xc6, 0x7f, 0x97, 0x8b, 0x6d, 0x79, 0xc7, 0x1b, + 0x98, 0xa0, 0xd0, 0x00, + ], + k_enc: [ + 0x16, 0xe3, 0xf9, 0x85, 0xc0, 0x7f, 0xef, 0xe5, 0x30, 0xd9, 0xe6, 0x94, 0x5e, 0xde, + 0xc1, 0x90, 0x3b, 0xb1, 0xca, 0x8d, 0xa5, 0xa2, 0x5b, 0xe9, 0x59, 0x78, 0x63, 0x7a, + 0x40, 0x8c, 0x2e, 0xfe, + ], + p_enc: [ + 0x03, 0xc6, 0xe8, 0xf0, 0xd5, 0x0a, 0xe8, 0x05, 0x87, 0x91, 0xdc, 0x0e, 0x46, 0x49, + 0xcd, 0xa3, 0x2b, 0xf6, 0x86, 0x66, 0x25, 0x01, 0xe5, 0x1b, 0x01, 0x2a, 0xea, 0x94, + 0x46, 0xa2, 0x10, 0x4e, 0x93, 0xf8, 0x15, 0xa0, 0xb3, 0xa2, 0x9b, 0x45, 0x83, 0x14, + 0xf3, 0xd8, 0xbe, 0x2b, 0x98, 0x23, 0xd3, 0x42, 0xf4, 0x62, 0x67, 0x43, 0xf9, 0x3a, + 0x6e, 0xbd, 0xa7, 0x2a, 0x8c, 0x7c, 0x5a, 0x2b, 0x7f, 0xa3, 0x04, 0xfe, 0x32, 0xb2, + 0x9b, 0x4f, 0x70, 0x6a, 0xa8, 0xf7, 0x42, 0x0f, 0x3d, 0x8e, 0x7a, 0x59, 0x70, 0x2f, + 0xff, 0x13, 0xe9, 0x42, 0xa7, 0xe1, 0x9a, 0x46, 0xe9, 0x70, 0xb5, 0xc5, 0x06, 0x70, + 0x84, 0x30, 0x31, 0x7b, 0x1b, 0xb3, 0xb3, 0x5d, 0xf6, 0x8a, 0xe3, 0x3a, 0x49, 0x26, + 0xa0, 0x3e, 0x6b, 0xfe, 0xb5, 0x51, 0x04, 0x16, 0xfc, 0xbb, 0x05, 0x24, 0xc9, 0xca, + 0x50, 0x74, 0x15, 0x6c, 0xc5, 0xa5, 0xd6, 0xfe, 0x1c, 0x99, 0x5e, 0xdc, 0x60, 0xa2, + 0xf5, 0x50, 0x41, 0x1a, 0xa4, 0x1e, 0x3d, 0xa3, 0xbd, 0xcf, 0x64, 0xbc, 0xf0, 0x4a, + 0x05, 0x10, 0x57, 0x1b, 0x93, 0x6d, 0x47, 0xe5, 0x5c, 0xec, 0x03, 0x30, 0xee, 0x8d, + 0xfe, 0x73, 0x56, 0x34, 0x04, 0xf0, 0x47, 0xd7, 0xf3, 0xa8, 0xa3, 0xd7, 0x74, 0x3b, + 0xc5, 0x54, 0x95, 0x52, 0x10, 0xf1, 0xeb, 0x0d, 0x08, 0x59, 0x9e, 0xa7, 0x7d, 0x5f, + 0x97, 0x4d, 0x87, 0x17, 0x6d, 0x37, 0xd9, 0x8b, 0x9c, 0x0a, 0xd4, 0x40, 0x40, 0x72, + 0x09, 0xed, 0x6a, 0x9f, 0x08, 0x46, 0x4d, 0x56, 0x55, 0x93, 0xe1, 0xa6, 0x3b, 0x93, + 0x85, 0x36, 0xb4, 0x92, 0x44, 0xe9, 0x7d, 0x88, 0x01, 0x73, 0xb6, 0x40, 0xf2, 0xdd, + 0xb7, 0x4d, 0x06, 0x8e, 0xcb, 0x46, 0xcf, 0x28, 0x9b, 0x7d, 0x89, 0x13, 0x07, 0xbb, + 0xa3, 0x70, 0x54, 0xcf, 0x91, 0xb3, 0x1f, 0xc8, 0x2f, 0x74, 0xd5, 0xfc, 0xc0, 0x00, + 0x94, 0x2e, 0xde, 0x91, 0x18, 0x25, 0xf5, 0x3f, 0xe6, 0x09, 0x68, 0x6f, 0x46, 0x32, + 0x23, 0xb1, 0xe9, 0xbc, 0x03, 0xbd, 0xe8, 0x95, 0xd1, 0x23, 0x8f, 0xad, 0x04, 0xa3, + 0xbf, 0xce, 0x68, 0xa0, 0x75, 0xe8, 0xa3, 0x7c, 0x0e, 0x87, 0xbf, 0x46, 0xdd, 0x01, + 0x55, 0x45, 0xf9, 0xb4, 0xfb, 0x0e, 0xec, 0x64, 0x5f, 0xfc, 0xbb, 0xe0, 0xca, 0x5f, + 0x8c, 0x56, 0x1b, 0x25, 0x7d, 0x52, 0xd6, 0x02, 0xd8, 0xc9, 0x4c, 0x50, 0x28, 0x73, + 0xa0, 0x1d, 0x92, 0x51, 0xd8, 0xc8, 0x60, 0xc0, 0x41, 0x52, 0x5b, 0x3b, 0xf4, 0xe3, + 0xa2, 0xeb, 0x92, 0x72, 0x81, 0x5c, 0x75, 0x86, 0x76, 0x84, 0x28, 0xb4, 0xc2, 0xb2, + 0x5e, 0x37, 0x45, 0xf0, 0x09, 0xc5, 0xdc, 0xe2, 0x0b, 0x69, 0xd5, 0xd7, 0xc4, 0x3c, + 0xeb, 0x73, 0x6b, 0x68, 0x31, 0xe8, 0xc1, 0x10, 0xf1, 0x6c, 0xfd, 0xb3, 0xa4, 0x67, + 0xe9, 0x41, 0x4c, 0x00, 0xec, 0xf1, 0x37, 0x31, 0x50, 0x08, 0x94, 0x55, 0x56, 0x78, + 0xc4, 0x97, 0xfa, 0xba, 0x9a, 0x95, 0xd0, 0x1c, 0xc4, 0x64, 0x39, 0x0f, 0xc4, 0xa7, + 0x6b, 0xfa, 0x8b, 0x0e, 0x1c, 0x68, 0xa5, 0x25, 0xd7, 0x06, 0xd6, 0x60, 0x4b, 0x23, + 0x30, 0xb6, 0xb3, 0x48, 0x52, 0x15, 0xf6, 0x06, 0xf1, 0x88, 0x3a, 0x75, 0x15, 0x88, + 0xc7, 0xef, 0xa5, 0x06, 0xc3, 0xe8, 0xd0, 0xc6, 0x01, 0x92, 0xe8, 0x47, 0x6b, 0xd1, + 0x17, 0x5d, 0x95, 0x62, 0x08, 0x7b, 0xdb, 0x81, 0x8e, 0x66, 0x21, 0x62, 0x86, 0xba, + 0xfe, 0x47, 0xff, 0x4d, 0xbc, 0xce, 0xd5, 0x14, 0x44, 0x48, 0x0a, 0x9a, 0x56, 0x73, + 0xec, 0xe7, 0xfa, 0xc7, 0x3a, 0x0e, 0xd4, 0x1a, 0xb0, 0x05, 0x17, 0x53, 0xa7, 0xca, + 0xa8, 0x9b, 0xe3, 0x13, 0x9a, 0xfd, 0x97, 0x93, 0xb3, 0xe0, 0x2f, 0x27, 0xf0, 0x40, + 0x04, 0x65, 0x95, 0xac, 0xd4, 0x7b, 0xf1, 0x3f, 0xd0, 0xda, 0x27, 0xf0, 0x9e, 0xda, + 0x48, 0x03, 0x6d, 0x3e, 0xe4, 0x37, 0xf2, 0xee, 0x8f, 0x86, 0x06, 0xea, 0x97, 0x34, + 0x3c, 0x33, 0x58, 0x46, 0x57, 0xf4, 0x6d, 0xba, 0x99, 0xdb, 0x5c, 0xfe, 0x6c, 0xa1, + 0x76, 0xfa, 0xb7, 0xb0, 0xf3, 0xbf, 0xa0, 0xab, 0x61, 0xe3, 0x40, 0xc3, 0x4e, 0xb9, + 0xf1, 0x7c, 0x7e, 0xc2, 0xbe, 0x03, 0xb1, 0x80, 0xf0, 0xbb, 0x6f, 0x43, 0x4c, 0x2a, + 0x65, 0x42, 0xe0, 0x0e, 0x84, 0x37, 0x3f, 0x4f, + ], + c_enc: [ + 0x2c, 0x40, 0x4a, 0x68, 0x81, 0xa6, 0xee, 0x76, 0x0c, 0xb5, 0x3b, 0x9c, 0xc2, 0x71, + 0x5c, 0xa7, 0x6a, 0x3a, 0x2f, 0xc9, 0x69, 0x3b, 0x1a, 0xbb, 0xcd, 0xc7, 0x5c, 0xb6, + 0xd6, 0xc3, 0x6e, 0xcf, 0x84, 0xd6, 0x93, 0x67, 0x2c, 0x53, 0xce, 0xd8, 0x79, 0x8c, + 0xc8, 0xf1, 0xe5, 0x3b, 0x8a, 0x9d, 0xe7, 0xbb, 0xb5, 0xe8, 0x5d, 0xf4, 0x7c, 0x42, + 0xbd, 0x4e, 0xe2, 0x7d, 0xa0, 0xd6, 0xf9, 0x5a, 0xa4, 0xf1, 0x10, 0xd4, 0x5a, 0xe2, + 0x8e, 0x6f, 0xea, 0x40, 0xe4, 0x7b, 0xc6, 0x08, 0x1b, 0x78, 0xe2, 0xcb, 0xa1, 0x78, + 0xf5, 0x3b, 0x2c, 0x0f, 0xfd, 0x71, 0xf1, 0x52, 0x54, 0x55, 0x70, 0x8a, 0x92, 0x50, + 0xb0, 0x28, 0x17, 0x90, 0x70, 0xc7, 0xd3, 0xbe, 0x38, 0xdc, 0x67, 0x3f, 0xc1, 0x20, + 0x6c, 0xce, 0x64, 0xd5, 0x13, 0xed, 0x14, 0x3e, 0xbf, 0x45, 0x76, 0x3c, 0xa5, 0xea, + 0x12, 0x6e, 0xc1, 0x4d, 0x01, 0xda, 0xcb, 0x64, 0x60, 0xa5, 0xdc, 0xd2, 0x26, 0xd1, + 0xa9, 0x5c, 0x8d, 0xf9, 0xc4, 0x64, 0xd9, 0x35, 0xb6, 0xaa, 0x60, 0x7f, 0xff, 0x2d, + 0x3d, 0x72, 0x55, 0x83, 0xf8, 0x82, 0x1a, 0xe9, 0xb4, 0x7f, 0xce, 0x87, 0x5e, 0xa8, + 0x7c, 0xea, 0x41, 0x21, 0xec, 0xc8, 0x5b, 0x93, 0xa6, 0x38, 0xf5, 0x6f, 0x48, 0xf7, + 0x0a, 0xc8, 0x85, 0xb4, 0x89, 0x03, 0x02, 0xdf, 0x12, 0x5f, 0x80, 0x20, 0x16, 0x4d, + 0xd0, 0x13, 0xc7, 0x3f, 0xd2, 0xb4, 0x0f, 0x38, 0xc6, 0x9b, 0xe8, 0xcf, 0x0a, 0x3b, + 0xaf, 0xa6, 0x3b, 0x2b, 0xa0, 0x4d, 0x98, 0x65, 0xa2, 0x55, 0xc2, 0x34, 0x60, 0x83, + 0x33, 0x04, 0xf6, 0xe7, 0xf6, 0xec, 0xd4, 0x7d, 0xa7, 0x8b, 0x29, 0xfa, 0x95, 0x15, + 0xba, 0x60, 0xed, 0x15, 0x78, 0x78, 0x02, 0xe7, 0xa9, 0xf6, 0x63, 0xe9, 0xad, 0xda, + 0x54, 0x64, 0x77, 0xf7, 0xa9, 0x94, 0xc1, 0x6b, 0x81, 0x41, 0xf4, 0x54, 0xc4, 0x34, + 0xd5, 0x7f, 0x8b, 0xd3, 0xb8, 0xc0, 0xe7, 0x21, 0x1c, 0x91, 0x5f, 0xc3, 0xfe, 0xb5, + 0xdd, 0xe3, 0xb9, 0x1c, 0xed, 0x14, 0x93, 0x7a, 0x00, 0xff, 0xfc, 0xba, 0x37, 0x2e, + 0x69, 0x28, 0x70, 0xca, 0x44, 0xd0, 0x0c, 0x24, 0xc0, 0x0d, 0x61, 0x0a, 0x75, 0xa5, + 0x18, 0xca, 0x83, 0x62, 0xcd, 0xb3, 0xcf, 0xb6, 0xdc, 0x10, 0x5a, 0xa6, 0x86, 0x37, + 0x69, 0x52, 0x03, 0x45, 0xae, 0x51, 0x3d, 0x60, 0x89, 0x85, 0xba, 0x9b, 0xab, 0x2f, + 0x61, 0x4c, 0xd8, 0xad, 0xfc, 0xe6, 0x07, 0x15, 0x6d, 0x04, 0xe7, 0x70, 0xe6, 0x3e, + 0x2c, 0xd4, 0x7a, 0xb8, 0x5f, 0x8e, 0x74, 0x51, 0x8e, 0x19, 0x70, 0x7d, 0x83, 0xe3, + 0xc4, 0x86, 0xad, 0x9e, 0x0a, 0x28, 0x34, 0xc5, 0x8b, 0x4b, 0x72, 0x7a, 0x9b, 0xb0, + 0xc3, 0x7e, 0x8f, 0xcb, 0xdd, 0x9a, 0x49, 0xe8, 0x23, 0x74, 0xd5, 0x24, 0x44, 0x42, + 0x9b, 0x6e, 0x9a, 0x0d, 0xf2, 0xaf, 0x47, 0xe9, 0xd4, 0x58, 0x1d, 0xbe, 0xc7, 0xc6, + 0x0f, 0xb9, 0x33, 0x79, 0x4e, 0xc6, 0x88, 0x16, 0xbe, 0xd4, 0x2e, 0x97, 0xfb, 0xbc, + 0x91, 0xbd, 0x5e, 0x25, 0x69, 0x07, 0xb3, 0x9d, 0x24, 0xad, 0x54, 0xb5, 0x06, 0x4a, + 0x46, 0xb4, 0x01, 0x83, 0x38, 0x26, 0xfe, 0x4d, 0xff, 0x2e, 0x9f, 0xcc, 0xca, 0x8c, + 0x54, 0xf7, 0x83, 0x25, 0x4d, 0x28, 0x05, 0xe9, 0x56, 0x04, 0x41, 0x72, 0xa7, 0x65, + 0x81, 0xff, 0xfd, 0x45, 0x8b, 0x6a, 0x64, 0x69, 0xdc, 0x40, 0xf9, 0x4e, 0x60, 0x65, + 0xf9, 0x9c, 0x3f, 0x63, 0xda, 0x89, 0xf3, 0x26, 0x0a, 0xfe, 0xde, 0x0f, 0xfa, 0x0c, + 0xd3, 0x3a, 0xb0, 0x89, 0xb1, 0x31, 0xed, 0x55, 0x40, 0x29, 0x06, 0xba, 0xf8, 0x0b, + 0xcc, 0x64, 0x3d, 0xf9, 0x34, 0x1c, 0xce, 0x9a, 0x55, 0x3b, 0x5a, 0xe5, 0x11, 0xe5, + 0xdc, 0xd2, 0x83, 0x5c, 0x3b, 0xf5, 0x71, 0xe8, 0xaa, 0xd1, 0x61, 0x8c, 0xf7, 0x06, + 0xd9, 0x14, 0xe6, 0xa3, 0x99, 0xd1, 0x8d, 0xeb, 0xf5, 0x6b, 0x3b, 0x46, 0xc5, 0xd4, + 0x56, 0x2f, 0x1c, 0x7d, 0x24, 0x2d, 0xdc, 0x53, 0xa5, 0x73, 0x63, 0x6e, 0x75, 0x3c, + 0x91, 0x52, 0x4c, 0xb9, 0x3f, 0xcd, 0x88, 0xa2, 0x3b, 0xe9, 0xb3, 0x4e, 0xca, 0xb4, + 0xbf, 0x89, 0x71, 0x01, 0x34, 0xfc, 0xe8, 0x34, 0x5b, 0xcd, 0x6a, 0x5a, 0x3d, 0x72, + 0x1e, 0xa8, 0xb6, 0x20, 0x7c, 0x2f, 0xcf, 0x81, 0x75, 0x80, 0xe0, 0xa6, 0x3d, 0xb4, + 0x37, 0x7c, 0x86, 0xe4, 0x15, 0x1e, 0xd8, 0xd3, 0x0a, 0x71, + ], + ock: [ + 0x8b, 0x0d, 0x29, 0x8e, 0xe8, 0xb4, 0x25, 0x34, 0xa4, 0x2f, 0xb9, 0x63, 0x5b, 0xa7, + 0x58, 0xea, 0x9f, 0x91, 0x8b, 0x83, 0x16, 0xc0, 0xe8, 0x94, 0xa9, 0x08, 0x48, 0x89, + 0x01, 0xd9, 0xfb, 0xa3, + ], + op: [ + 0x8e, 0x66, 0xb7, 0x92, 0xec, 0xb1, 0x56, 0xef, 0x68, 0x5e, 0xe8, 0xea, 0x35, 0xd3, + 0x82, 0x75, 0x8b, 0xa4, 0x15, 0x97, 0xa3, 0x3a, 0x93, 0xba, 0xf3, 0x81, 0xd6, 0x3c, + 0x17, 0x5b, 0xa9, 0x8b, 0xf9, 0xf7, 0xa0, 0x10, 0x5e, 0xa9, 0xf4, 0x45, 0xfb, 0x7a, + 0x14, 0x49, 0x72, 0x62, 0xc6, 0xe4, 0xd7, 0x32, 0x89, 0x32, 0x7b, 0x8a, 0x2d, 0xf5, + 0xe2, 0x63, 0xf3, 0xe3, 0x99, 0x07, 0xea, 0x0c, + ], + c_out: [ + 0xf3, 0xbf, 0x90, 0x76, 0xf3, 0xdb, 0x66, 0x32, 0x6d, 0xa6, 0x0c, 0xc7, 0x94, 0x3c, + 0x85, 0x4d, 0x8d, 0xe9, 0x9f, 0x57, 0x53, 0xf7, 0x0c, 0x32, 0xed, 0x01, 0xfb, 0x2e, + 0x84, 0x9c, 0x9d, 0xc7, 0x3f, 0x80, 0xb5, 0xcb, 0xaa, 0xb4, 0x99, 0x2d, 0xd7, 0xe7, + 0x38, 0xb9, 0x61, 0xfd, 0x75, 0x3f, 0x7c, 0x5b, 0x29, 0x24, 0xd1, 0xd9, 0x63, 0x06, + 0x61, 0x33, 0x92, 0x59, 0x28, 0x3e, 0x3a, 0x95, 0x3c, 0x57, 0xdf, 0x3a, 0x48, 0xca, + 0x82, 0x71, 0xfc, 0x5f, 0x26, 0x4d, 0x6f, 0x15, 0xb6, 0xb3, + ], + }, + TestVector { + incoming_viewing_key: [ + 0x73, 0xa2, 0x5e, 0xba, 0x9b, 0xd7, 0xa8, 0xed, 0x2b, 0x5b, 0x1b, 0x8d, 0x5a, 0x05, + 0x6b, 0xde, 0x8d, 0x05, 0xe6, 0xa2, 0x80, 0x67, 0xb3, 0x84, 0x57, 0x91, 0xbe, 0xbf, + 0xa7, 0xae, 0x2a, 0xcd, 0x36, 0x32, 0x6f, 0xe6, 0x27, 0xbe, 0xe8, 0x0e, 0x32, 0x92, + 0xe0, 0xe5, 0x13, 0x2d, 0xe1, 0x6c, 0xa4, 0xf8, 0x1e, 0x5a, 0x6f, 0xc0, 0x9c, 0x95, + 0xff, 0x13, 0xb5, 0x2e, 0x96, 0xb7, 0x89, 0x0f, + ], + ovk: [ + 0xf5, 0xe8, 0xde, 0xd8, 0x18, 0x92, 0x51, 0x1c, 0xc2, 0x85, 0x1b, 0x00, 0xb8, 0x32, + 0x71, 0x2a, 0x6d, 0x3b, 0xa5, 0x66, 0x65, 0x17, 0xbc, 0xd3, 0x56, 0x76, 0x21, 0xa7, + 0xcf, 0x84, 0x45, 0x58, + ], + default_d: [ + 0x81, 0xf2, 0x75, 0x7c, 0x53, 0x2e, 0xd3, 0xb6, 0x2e, 0x89, 0x01, + ], + default_pk_d: [ + 0x55, 0xdb, 0x72, 0x90, 0x07, 0x3b, 0xa0, 0x06, 0x66, 0xe8, 0x7d, 0x25, 0x61, 0xb8, + 0x88, 0x3c, 0x66, 0x2c, 0x56, 0x78, 0xff, 0x27, 0x30, 0x2a, 0x82, 0xe2, 0x0a, 0x72, + 0x01, 0x70, 0x89, 0x1a, + ], + v: 17209482587585417762, + rseed: [ + 0xfc, 0x54, 0x88, 0x62, 0xf5, 0xa0, 0x70, 0x94, 0xfd, 0x42, 0x8a, 0x7b, 0xbc, 0x15, + 0xd7, 0xb3, 0x8d, 0x05, 0x36, 0x2c, 0x9c, 0xa9, 0x85, 0xf5, 0x8a, 0x76, 0x64, 0x7d, + 0x2b, 0xe4, 0xc2, 0xcd, + ], + asset: [ + 0x67, 0x43, 0xf9, 0x3a, 0x6e, 0xbd, 0xa7, 0x2a, 0x8c, 0x7c, 0x5a, 0x2b, 0x7f, 0xa3, + 0x04, 0xfe, 0x32, 0xb2, 0x9b, 0x4f, 0x70, 0x6a, 0xa8, 0xf7, 0x42, 0x0f, 0x3d, 0x8e, + 0x7a, 0x59, 0x70, 0x2f, + ], + memo: [ + 0xff, 0x6b, 0x3d, 0x17, 0xd6, 0x87, 0x09, 0x71, 0xd7, 0xa0, 0x98, 0xba, 0xf7, 0x2c, + 0x6f, 0x6f, 0x12, 0x14, 0xcf, 0x1f, 0xaa, 0xe4, 0x88, 0xbd, 0x7d, 0xe2, 0x59, 0xd3, + 0x41, 0x5c, 0x2f, 0x0d, 0xde, 0xc7, 0x45, 0x70, 0x04, 0xf3, 0x57, 0x08, 0xd1, 0xec, + 0xcc, 0xcc, 0x0d, 0xf6, 0x5a, 0x04, 0x94, 0x3a, 0xd5, 0xcb, 0xc1, 0x3f, 0x29, 0x5f, + 0x00, 0x0f, 0xe0, 0x56, 0xc4, 0x0b, 0x2d, 0x88, 0xf2, 0x7d, 0xc3, 0x4c, 0xfe, 0xb8, + 0x03, 0xbe, 0x34, 0x83, 0xa9, 0xeb, 0xf9, 0xb5, 0xa9, 0x02, 0x60, 0x57, 0x72, 0x5d, + 0x63, 0xea, 0xd2, 0xc0, 0xc0, 0xff, 0x1f, 0xe2, 0x6a, 0xc1, 0xe7, 0xbd, 0xfc, 0xd6, + 0xfa, 0xd8, 0x75, 0x84, 0x2d, 0x19, 0x4f, 0x33, 0x17, 0x50, 0x46, 0x2c, 0x06, 0xb8, + 0xd7, 0x98, 0x2d, 0x67, 0x99, 0x5e, 0xd5, 0xd3, 0xae, 0x96, 0xa0, 0x5a, 0xe0, 0x06, + 0x7f, 0x4e, 0xb1, 0xc7, 0xc9, 0x32, 0x31, 0xbd, 0x39, 0x77, 0x3c, 0xbe, 0x0a, 0x9d, + 0x66, 0xb0, 0xc9, 0xaa, 0x8c, 0xff, 0x6a, 0x37, 0x6e, 0x1f, 0x37, 0x2e, 0xac, 0x6a, + 0xc4, 0xe4, 0x6c, 0xc0, 0x94, 0x22, 0x45, 0xd4, 0xc2, 0xdc, 0xf0, 0x2d, 0x76, 0x40, + 0xff, 0xcc, 0x5a, 0x6a, 0xc3, 0xa8, 0x7f, 0x5c, 0x41, 0x15, 0x51, 0xbc, 0xc2, 0xf2, + 0x6c, 0xb9, 0x49, 0x61, 0xd5, 0x3f, 0x95, 0xdd, 0xb1, 0x9a, 0xe9, 0x30, 0xc8, 0xd7, + 0x0f, 0x03, 0x1b, 0x29, 0xa5, 0xdf, 0x99, 0xff, 0x36, 0x69, 0x5e, 0x80, 0x2c, 0xbc, + 0xb6, 0xb5, 0x8c, 0x1b, 0xa7, 0xed, 0x5e, 0xac, 0xfa, 0x76, 0x41, 0x4a, 0x41, 0xad, + 0x4a, 0x44, 0xf7, 0x1f, 0x1b, 0x58, 0x0d, 0x34, 0xc3, 0xa9, 0x52, 0x92, 0x0b, 0x25, + 0x4a, 0x14, 0x5f, 0xea, 0x51, 0x7f, 0x5b, 0x42, 0xb2, 0xf6, 0x5e, 0xcd, 0x0f, 0x82, + 0x59, 0x54, 0x78, 0xd8, 0x0a, 0xe5, 0xc8, 0xce, 0xea, 0x12, 0xa1, 0x61, 0xcc, 0xbb, + 0x5e, 0xac, 0x09, 0x99, 0x0f, 0xc6, 0x19, 0xa4, 0x60, 0x80, 0x43, 0x6d, 0xbd, 0x08, + 0xd7, 0x47, 0x84, 0xaf, 0x00, 0x2d, 0x58, 0xe0, 0x6f, 0xaf, 0x7f, 0x3c, 0xea, 0xe7, + 0xd3, 0x41, 0x9b, 0x1f, 0xca, 0x26, 0x5a, 0x55, 0x59, 0xcf, 0x9e, 0x2d, 0x3b, 0x60, + 0x97, 0x8d, 0x81, 0xa6, 0x78, 0xb9, 0xed, 0x8e, 0x44, 0x86, 0xb4, 0xd1, 0x46, 0x09, + 0xd6, 0xc1, 0x27, 0xc0, 0xc2, 0xfb, 0xff, 0xe3, 0x0a, 0x60, 0xf7, 0xbf, 0xf1, 0xd9, + 0xfb, 0x83, 0x00, 0xed, 0x00, 0x92, 0x53, 0xba, 0x9b, 0x99, 0x6f, 0xa0, 0x52, 0x41, + 0xb1, 0x0f, 0x5a, 0xc9, 0xa8, 0x40, 0x8e, 0x92, 0x5b, 0x62, 0x6b, 0xb2, 0x1a, 0x47, + 0x1f, 0xe3, 0xbe, 0xde, 0x52, 0xbb, 0xa0, 0x97, 0xb2, 0xa9, 0x9a, 0x9b, 0xa5, 0xa8, + 0x66, 0x58, 0xc3, 0xfd, 0x9e, 0xc5, 0x5b, 0xfa, 0x9b, 0x32, 0x85, 0x67, 0x25, 0x4a, + 0xb3, 0x6d, 0x2c, 0x7f, 0x44, 0xd2, 0xc7, 0xe1, 0x3e, 0xb5, 0x4b, 0xeb, 0x70, 0xea, + 0x8f, 0xa9, 0x4b, 0x6c, 0x6e, 0x01, 0x2d, 0x79, 0xe3, 0xf5, 0x36, 0x89, 0xc2, 0xb1, + 0xa1, 0x8e, 0xaf, 0x2d, 0x47, 0x1d, 0x13, 0xc1, 0xab, 0x39, 0xd9, 0x19, 0x4a, 0xe8, + 0x43, 0xab, 0x1d, 0x28, 0xff, 0xa8, 0xf6, 0x9d, 0xc7, 0xe1, 0x5c, 0xc3, 0x8b, 0x12, + 0xe8, 0xfc, 0xd7, 0x92, 0x55, 0xb7, 0x21, 0x60, 0x56, 0xd9, 0xed, 0xb7, 0x48, 0x2f, + 0xb9, 0x8a, 0xa0, 0x33, 0xb6, 0x5e, 0x51, 0xc1, 0xa0, 0x8b, 0x8a, 0x11, 0xd8, 0x4d, + 0x04, 0x09, 0xb7, 0x34, 0xf4, 0x52, 0xaa, 0xf0, 0xd6, 0xb1, 0x8f, 0x50, 0x25, 0x86, + 0x83, 0xd3, 0xf9, 0xa7, 0x6d, 0x39, 0x9f, 0xd0, 0x47, 0xee, 0xe2, 0x88, 0xbb, 0x45, + 0x85, 0x85, 0x1d, 0xc9, 0x3e, 0xcc, 0xc6, 0x23, + ], + cv_net: [ + 0xe8, 0x06, 0x5c, 0x40, 0x96, 0xd3, 0x54, 0x33, 0x40, 0x01, 0x1f, 0x58, 0x90, 0xb1, + 0x7e, 0xed, 0xd2, 0xa7, 0x06, 0x44, 0x07, 0x34, 0x78, 0x41, 0x01, 0xae, 0x2d, 0x8e, + 0x87, 0xe5, 0x05, 0xad, + ], + rho: [ + 0xc2, 0x79, 0xfa, 0x9d, 0x1c, 0x84, 0x11, 0x93, 0xd3, 0x32, 0xf8, 0xcc, 0xf4, 0xd0, + 0xb1, 0xe4, 0x56, 0x01, 0xa8, 0xaf, 0x66, 0x76, 0xd7, 0x62, 0xfb, 0xa7, 0x31, 0x33, + 0x45, 0x89, 0x35, 0x14, + ], + cmx: [ + 0x6d, 0x29, 0x97, 0xd1, 0xce, 0x0a, 0x94, 0x9a, 0x63, 0x70, 0x0f, 0x46, 0x1b, 0x57, + 0x12, 0xae, 0xeb, 0x43, 0xd4, 0x55, 0x04, 0xe3, 0x5b, 0xda, 0x16, 0x52, 0x97, 0x77, + 0xc7, 0x4d, 0x19, 0x1b, + ], + esk: [ + 0x9d, 0xc4, 0xc8, 0xc0, 0x32, 0xd3, 0xbe, 0x66, 0xd2, 0x63, 0x6b, 0xa0, 0x02, 0x0c, + 0x63, 0xf4, 0x26, 0x53, 0x29, 0xff, 0xac, 0x2a, 0xe6, 0x35, 0x57, 0x32, 0x63, 0xf4, + 0x99, 0xbd, 0x4c, 0x13, + ], + ephemeral_key: [ + 0xe4, 0x76, 0x95, 0x86, 0x30, 0x4a, 0x6a, 0x9b, 0x3a, 0x2a, 0xef, 0x3a, 0xf5, 0x8b, + 0x97, 0xda, 0xc2, 0xcc, 0x4a, 0xeb, 0x38, 0x9f, 0x68, 0xc1, 0x28, 0x87, 0x73, 0x1e, + 0x0e, 0x12, 0xbc, 0x1e, + ], + shared_secret: [ + 0xf6, 0xba, 0x4b, 0x1f, 0xbe, 0x01, 0xfa, 0x2f, 0x1d, 0xd4, 0x09, 0x3c, 0x5c, 0xc4, + 0x85, 0xa9, 0xbf, 0xd9, 0xef, 0x0f, 0x57, 0x89, 0x49, 0xd6, 0xe1, 0x00, 0xb0, 0x05, + 0x5c, 0xb8, 0xf3, 0x31, + ], + k_enc: [ + 0xd3, 0xc2, 0x20, 0x51, 0x00, 0x3e, 0x88, 0x2a, 0x5d, 0xdd, 0xfb, 0x48, 0x23, 0xd6, + 0x77, 0x26, 0x96, 0xa7, 0xe9, 0x9f, 0x26, 0xb1, 0xa6, 0xac, 0xd2, 0x4b, 0xee, 0xd5, + 0xf2, 0x2f, 0x9f, 0xf8, + ], + p_enc: [ + 0x03, 0x81, 0xf2, 0x75, 0x7c, 0x53, 0x2e, 0xd3, 0xb6, 0x2e, 0x89, 0x01, 0x22, 0x92, + 0x4c, 0xd1, 0x3b, 0x5d, 0xd4, 0xee, 0xfc, 0x54, 0x88, 0x62, 0xf5, 0xa0, 0x70, 0x94, + 0xfd, 0x42, 0x8a, 0x7b, 0xbc, 0x15, 0xd7, 0xb3, 0x8d, 0x05, 0x36, 0x2c, 0x9c, 0xa9, + 0x85, 0xf5, 0x8a, 0x76, 0x64, 0x7d, 0x2b, 0xe4, 0xc2, 0xcd, 0x67, 0x43, 0xf9, 0x3a, + 0x6e, 0xbd, 0xa7, 0x2a, 0x8c, 0x7c, 0x5a, 0x2b, 0x7f, 0xa3, 0x04, 0xfe, 0x32, 0xb2, + 0x9b, 0x4f, 0x70, 0x6a, 0xa8, 0xf7, 0x42, 0x0f, 0x3d, 0x8e, 0x7a, 0x59, 0x70, 0x2f, + 0xff, 0x6b, 0x3d, 0x17, 0xd6, 0x87, 0x09, 0x71, 0xd7, 0xa0, 0x98, 0xba, 0xf7, 0x2c, + 0x6f, 0x6f, 0x12, 0x14, 0xcf, 0x1f, 0xaa, 0xe4, 0x88, 0xbd, 0x7d, 0xe2, 0x59, 0xd3, + 0x41, 0x5c, 0x2f, 0x0d, 0xde, 0xc7, 0x45, 0x70, 0x04, 0xf3, 0x57, 0x08, 0xd1, 0xec, + 0xcc, 0xcc, 0x0d, 0xf6, 0x5a, 0x04, 0x94, 0x3a, 0xd5, 0xcb, 0xc1, 0x3f, 0x29, 0x5f, + 0x00, 0x0f, 0xe0, 0x56, 0xc4, 0x0b, 0x2d, 0x88, 0xf2, 0x7d, 0xc3, 0x4c, 0xfe, 0xb8, + 0x03, 0xbe, 0x34, 0x83, 0xa9, 0xeb, 0xf9, 0xb5, 0xa9, 0x02, 0x60, 0x57, 0x72, 0x5d, + 0x63, 0xea, 0xd2, 0xc0, 0xc0, 0xff, 0x1f, 0xe2, 0x6a, 0xc1, 0xe7, 0xbd, 0xfc, 0xd6, + 0xfa, 0xd8, 0x75, 0x84, 0x2d, 0x19, 0x4f, 0x33, 0x17, 0x50, 0x46, 0x2c, 0x06, 0xb8, + 0xd7, 0x98, 0x2d, 0x67, 0x99, 0x5e, 0xd5, 0xd3, 0xae, 0x96, 0xa0, 0x5a, 0xe0, 0x06, + 0x7f, 0x4e, 0xb1, 0xc7, 0xc9, 0x32, 0x31, 0xbd, 0x39, 0x77, 0x3c, 0xbe, 0x0a, 0x9d, + 0x66, 0xb0, 0xc9, 0xaa, 0x8c, 0xff, 0x6a, 0x37, 0x6e, 0x1f, 0x37, 0x2e, 0xac, 0x6a, + 0xc4, 0xe4, 0x6c, 0xc0, 0x94, 0x22, 0x45, 0xd4, 0xc2, 0xdc, 0xf0, 0x2d, 0x76, 0x40, + 0xff, 0xcc, 0x5a, 0x6a, 0xc3, 0xa8, 0x7f, 0x5c, 0x41, 0x15, 0x51, 0xbc, 0xc2, 0xf2, + 0x6c, 0xb9, 0x49, 0x61, 0xd5, 0x3f, 0x95, 0xdd, 0xb1, 0x9a, 0xe9, 0x30, 0xc8, 0xd7, + 0x0f, 0x03, 0x1b, 0x29, 0xa5, 0xdf, 0x99, 0xff, 0x36, 0x69, 0x5e, 0x80, 0x2c, 0xbc, + 0xb6, 0xb5, 0x8c, 0x1b, 0xa7, 0xed, 0x5e, 0xac, 0xfa, 0x76, 0x41, 0x4a, 0x41, 0xad, + 0x4a, 0x44, 0xf7, 0x1f, 0x1b, 0x58, 0x0d, 0x34, 0xc3, 0xa9, 0x52, 0x92, 0x0b, 0x25, + 0x4a, 0x14, 0x5f, 0xea, 0x51, 0x7f, 0x5b, 0x42, 0xb2, 0xf6, 0x5e, 0xcd, 0x0f, 0x82, + 0x59, 0x54, 0x78, 0xd8, 0x0a, 0xe5, 0xc8, 0xce, 0xea, 0x12, 0xa1, 0x61, 0xcc, 0xbb, + 0x5e, 0xac, 0x09, 0x99, 0x0f, 0xc6, 0x19, 0xa4, 0x60, 0x80, 0x43, 0x6d, 0xbd, 0x08, + 0xd7, 0x47, 0x84, 0xaf, 0x00, 0x2d, 0x58, 0xe0, 0x6f, 0xaf, 0x7f, 0x3c, 0xea, 0xe7, + 0xd3, 0x41, 0x9b, 0x1f, 0xca, 0x26, 0x5a, 0x55, 0x59, 0xcf, 0x9e, 0x2d, 0x3b, 0x60, + 0x97, 0x8d, 0x81, 0xa6, 0x78, 0xb9, 0xed, 0x8e, 0x44, 0x86, 0xb4, 0xd1, 0x46, 0x09, + 0xd6, 0xc1, 0x27, 0xc0, 0xc2, 0xfb, 0xff, 0xe3, 0x0a, 0x60, 0xf7, 0xbf, 0xf1, 0xd9, + 0xfb, 0x83, 0x00, 0xed, 0x00, 0x92, 0x53, 0xba, 0x9b, 0x99, 0x6f, 0xa0, 0x52, 0x41, + 0xb1, 0x0f, 0x5a, 0xc9, 0xa8, 0x40, 0x8e, 0x92, 0x5b, 0x62, 0x6b, 0xb2, 0x1a, 0x47, + 0x1f, 0xe3, 0xbe, 0xde, 0x52, 0xbb, 0xa0, 0x97, 0xb2, 0xa9, 0x9a, 0x9b, 0xa5, 0xa8, + 0x66, 0x58, 0xc3, 0xfd, 0x9e, 0xc5, 0x5b, 0xfa, 0x9b, 0x32, 0x85, 0x67, 0x25, 0x4a, + 0xb3, 0x6d, 0x2c, 0x7f, 0x44, 0xd2, 0xc7, 0xe1, 0x3e, 0xb5, 0x4b, 0xeb, 0x70, 0xea, + 0x8f, 0xa9, 0x4b, 0x6c, 0x6e, 0x01, 0x2d, 0x79, 0xe3, 0xf5, 0x36, 0x89, 0xc2, 0xb1, + 0xa1, 0x8e, 0xaf, 0x2d, 0x47, 0x1d, 0x13, 0xc1, 0xab, 0x39, 0xd9, 0x19, 0x4a, 0xe8, + 0x43, 0xab, 0x1d, 0x28, 0xff, 0xa8, 0xf6, 0x9d, 0xc7, 0xe1, 0x5c, 0xc3, 0x8b, 0x12, + 0xe8, 0xfc, 0xd7, 0x92, 0x55, 0xb7, 0x21, 0x60, 0x56, 0xd9, 0xed, 0xb7, 0x48, 0x2f, + 0xb9, 0x8a, 0xa0, 0x33, 0xb6, 0x5e, 0x51, 0xc1, 0xa0, 0x8b, 0x8a, 0x11, 0xd8, 0x4d, + 0x04, 0x09, 0xb7, 0x34, 0xf4, 0x52, 0xaa, 0xf0, 0xd6, 0xb1, 0x8f, 0x50, 0x25, 0x86, + 0x83, 0xd3, 0xf9, 0xa7, 0x6d, 0x39, 0x9f, 0xd0, 0x47, 0xee, 0xe2, 0x88, 0xbb, 0x45, + 0x85, 0x85, 0x1d, 0xc9, 0x3e, 0xcc, 0xc6, 0x23, + ], + c_enc: [ + 0x73, 0x29, 0xa0, 0xa5, 0x6a, 0x14, 0x4b, 0x04, 0x2c, 0x1e, 0xad, 0x91, 0x80, 0xac, + 0x54, 0xda, 0xc6, 0xc5, 0x5c, 0xf4, 0xc2, 0x2f, 0xbe, 0x7c, 0xde, 0x99, 0x96, 0x0b, + 0xc6, 0x20, 0xd4, 0xdd, 0x60, 0xe4, 0xbf, 0x18, 0xa0, 0xea, 0x7a, 0xd9, 0x09, 0x3b, + 0xcd, 0x3f, 0xf6, 0xd1, 0x61, 0x1c, 0x56, 0x5f, 0x88, 0xe7, 0xad, 0xc7, 0x88, 0x7c, + 0x34, 0x4d, 0x78, 0x79, 0x73, 0x3d, 0x26, 0x30, 0xbd, 0x45, 0x07, 0x25, 0xcd, 0xfc, + 0xef, 0x8f, 0xe4, 0x0f, 0xf0, 0xdc, 0x6f, 0x45, 0x9e, 0xc6, 0x67, 0x38, 0x5a, 0x94, + 0xfb, 0x63, 0x44, 0x5a, 0x61, 0xc7, 0x3d, 0x9d, 0x16, 0x1b, 0x77, 0x06, 0xf6, 0xb3, + 0x26, 0xf4, 0x07, 0xc2, 0xde, 0x59, 0xe3, 0xe6, 0x01, 0xdb, 0xa0, 0x00, 0xe7, 0x73, + 0x81, 0x5d, 0xb0, 0x97, 0x22, 0xe9, 0xbd, 0x23, 0x07, 0x4d, 0x20, 0x6d, 0xbe, 0xfd, + 0x0b, 0x7f, 0x8b, 0x55, 0x14, 0xee, 0x62, 0x46, 0xb5, 0xde, 0x97, 0x68, 0xad, 0x50, + 0x18, 0x17, 0xa4, 0x42, 0x04, 0x87, 0x07, 0x78, 0x61, 0xa0, 0x6c, 0xf5, 0xfa, 0xa0, + 0xae, 0x0d, 0xf9, 0x03, 0x02, 0x51, 0xa9, 0xe3, 0x9e, 0x7c, 0xde, 0x48, 0x3e, 0xd8, + 0x28, 0xd8, 0xb2, 0x7e, 0xbd, 0x6d, 0xa9, 0xca, 0x96, 0x54, 0xaf, 0xc1, 0xdf, 0x94, + 0x00, 0xb2, 0xbe, 0xc7, 0x60, 0xfb, 0x26, 0x00, 0xa4, 0x53, 0x67, 0x3f, 0x6e, 0x7c, + 0x89, 0x4b, 0x9c, 0xcd, 0x8a, 0x57, 0x2d, 0x24, 0xa5, 0x47, 0x31, 0x22, 0xfe, 0x40, + 0x06, 0xe8, 0x0c, 0x9a, 0x97, 0x5e, 0x93, 0xbe, 0xc5, 0x7e, 0xbc, 0x4c, 0x44, 0xb2, + 0x8e, 0xb0, 0x1f, 0xbc, 0xb2, 0xb2, 0xde, 0x55, 0x9b, 0xf0, 0x2d, 0x7b, 0x2c, 0xe4, + 0xf3, 0xd1, 0x1e, 0x86, 0xcb, 0xaa, 0x10, 0x00, 0xee, 0xbd, 0x0d, 0x1b, 0x58, 0x8c, + 0x99, 0xd7, 0xf9, 0xd9, 0x57, 0xc6, 0x4e, 0x0a, 0x1e, 0x59, 0x67, 0x66, 0xe7, 0x6c, + 0x0e, 0xdc, 0xc6, 0xd9, 0xef, 0x34, 0x58, 0x74, 0x52, 0x04, 0x46, 0x39, 0x48, 0xd9, + 0x78, 0xd1, 0x3c, 0x4b, 0xc0, 0xf4, 0x2c, 0xc9, 0xb8, 0x93, 0x65, 0x27, 0x71, 0xf6, + 0xd1, 0x17, 0x7c, 0x78, 0x58, 0xf5, 0x77, 0x03, 0xec, 0x38, 0x3c, 0x3b, 0xad, 0x82, + 0x1b, 0x2f, 0x82, 0x87, 0x9c, 0x3e, 0x1d, 0x39, 0x91, 0xd2, 0x09, 0xb5, 0xc8, 0x94, + 0xc4, 0x65, 0xdd, 0x5e, 0xd9, 0x57, 0x19, 0x27, 0x2f, 0x9f, 0x03, 0x4c, 0xd9, 0x41, + 0xa0, 0x32, 0x33, 0xe1, 0x10, 0xd5, 0x80, 0xc1, 0x93, 0xc1, 0x9a, 0x92, 0x91, 0x19, + 0x45, 0x5a, 0xa6, 0x2e, 0x10, 0x35, 0x78, 0xa2, 0xd6, 0x46, 0x06, 0x26, 0xba, 0x04, + 0x37, 0x82, 0xb8, 0xd1, 0x3a, 0x31, 0x4e, 0x51, 0xf4, 0xa2, 0x81, 0x59, 0x32, 0x5f, + 0xbb, 0x35, 0xbe, 0xbb, 0xba, 0xf5, 0x27, 0x25, 0x64, 0xa7, 0xf5, 0x3f, 0x4c, 0x38, + 0xb0, 0xf6, 0xea, 0xed, 0x1a, 0xfc, 0x71, 0x31, 0x59, 0x87, 0xac, 0xbc, 0x95, 0x91, + 0x82, 0xab, 0xd3, 0xee, 0x9d, 0x87, 0x18, 0xc2, 0x26, 0x2f, 0x53, 0x1b, 0xfb, 0x57, + 0x1b, 0xb7, 0x4e, 0x9a, 0xf3, 0x63, 0x61, 0x36, 0x75, 0xce, 0xed, 0x6f, 0x97, 0xbe, + 0x67, 0x4c, 0x43, 0xf2, 0xad, 0x13, 0xdf, 0x86, 0x8d, 0xf6, 0xd4, 0x6f, 0x80, 0x72, + 0x6b, 0xe7, 0x88, 0x79, 0x04, 0xdf, 0x5b, 0x6b, 0xb5, 0x15, 0x7a, 0x87, 0x42, 0x06, + 0xe1, 0x77, 0x8a, 0x5d, 0x08, 0x4f, 0xd7, 0x60, 0x98, 0x6d, 0xb8, 0x39, 0xb0, 0xd9, + 0x6c, 0xcd, 0x41, 0x34, 0x38, 0xef, 0x02, 0xc7, 0x9e, 0xba, 0xc9, 0xe7, 0x49, 0xf8, + 0x93, 0x60, 0xb7, 0x5d, 0xcd, 0x1e, 0xb7, 0x73, 0x94, 0x73, 0xe3, 0x1f, 0xa9, 0xca, + 0xe4, 0x94, 0x30, 0x6e, 0xa4, 0x82, 0x4a, 0xb4, 0xa9, 0xbf, 0x92, 0x5d, 0xb7, 0x4c, + 0xf3, 0xdb, 0xac, 0x38, 0x93, 0xe7, 0xf0, 0x71, 0x00, 0x77, 0xff, 0x37, 0x90, 0x2d, + 0x18, 0x7f, 0xce, 0xbe, 0xf9, 0x76, 0xd6, 0x2c, 0xae, 0xfd, 0xcc, 0x14, 0x8c, 0x68, + 0xd7, 0x7e, 0x3e, 0xb2, 0x1d, 0xd5, 0x0c, 0x34, 0x01, 0x08, 0x34, 0x23, 0xf0, 0x38, + 0x11, 0x73, 0x0b, 0xc5, 0xf8, 0x14, 0xe0, 0x99, 0x02, 0xf0, 0x60, 0x80, 0xbf, 0xb4, + 0x8b, 0x34, 0x1e, 0xce, 0x80, 0xac, 0x29, 0xcb, 0x41, 0xe3, 0x20, 0x9d, 0x07, 0x9a, + 0xc8, 0x4e, 0x85, 0x1b, 0xfb, 0x26, 0xdd, 0x39, 0xd9, 0x66, 0x2a, 0x11, 0x90, 0x28, + 0x17, 0xb0, 0x8d, 0xa3, 0x89, 0x7a, 0x5c, 0x87, 0x62, 0x22, + ], + ock: [ + 0x1b, 0xa4, 0xac, 0xd7, 0x75, 0x10, 0xc4, 0xf0, 0xc7, 0x66, 0xad, 0xf7, 0xc7, 0xdf, + 0x1d, 0x1c, 0x54, 0xd5, 0xbc, 0xe3, 0xd6, 0x0a, 0xf3, 0x5e, 0x8d, 0xd4, 0x8f, 0xdd, + 0x04, 0xa7, 0x8c, 0x0b, + ], + op: [ + 0x55, 0xdb, 0x72, 0x90, 0x07, 0x3b, 0xa0, 0x06, 0x66, 0xe8, 0x7d, 0x25, 0x61, 0xb8, + 0x88, 0x3c, 0x66, 0x2c, 0x56, 0x78, 0xff, 0x27, 0x30, 0x2a, 0x82, 0xe2, 0x0a, 0x72, + 0x01, 0x70, 0x89, 0x1a, 0x9d, 0xc4, 0xc8, 0xc0, 0x32, 0xd3, 0xbe, 0x66, 0xd2, 0x63, + 0x6b, 0xa0, 0x02, 0x0c, 0x63, 0xf4, 0x26, 0x53, 0x29, 0xff, 0xac, 0x2a, 0xe6, 0x35, + 0x57, 0x32, 0x63, 0xf4, 0x99, 0xbd, 0x4c, 0x13, + ], + c_out: [ + 0x43, 0x0d, 0xaa, 0x6b, 0x75, 0x63, 0x22, 0x80, 0xd5, 0xe6, 0xda, 0xcb, 0xd2, 0xa0, + 0xff, 0xe2, 0xaf, 0x98, 0x60, 0xc8, 0x3a, 0x3d, 0x2a, 0x87, 0xf1, 0x79, 0x62, 0x88, + 0xeb, 0xed, 0x64, 0xd0, 0xcd, 0xc4, 0x60, 0xe2, 0xc8, 0x61, 0xc4, 0xf9, 0x38, 0x7d, + 0x92, 0x59, 0xfc, 0x60, 0x01, 0xac, 0xd0, 0xe7, 0x6f, 0x3b, 0x0f, 0xdb, 0x5d, 0xac, + 0x97, 0x4c, 0x26, 0xb5, 0x1b, 0x85, 0x9f, 0xab, 0xe0, 0x2e, 0xab, 0xae, 0x96, 0x8a, + 0xab, 0x2e, 0x5e, 0x61, 0xef, 0xc2, 0xd4, 0x46, 0x2c, 0x1e, + ], + }, + TestVector { + incoming_viewing_key: [ + 0xa4, 0xd7, 0x9c, 0x81, 0x9a, 0x6c, 0x5e, 0x01, 0x67, 0xfc, 0xa9, 0x8c, 0xe2, 0x62, + 0x98, 0x15, 0xf9, 0xba, 0xc9, 0x26, 0xb6, 0x27, 0x18, 0xcf, 0xbe, 0x50, 0x45, 0xd9, + 0x2d, 0xd7, 0x1c, 0xd3, 0x36, 0x75, 0xd5, 0x56, 0xe0, 0x77, 0x1e, 0x40, 0xcc, 0x3d, + 0x61, 0x8d, 0x9b, 0xda, 0x13, 0x2f, 0x13, 0x95, 0x3d, 0x82, 0x43, 0x2e, 0x81, 0x59, + 0x4a, 0x97, 0x1e, 0x98, 0xb0, 0x71, 0x40, 0x39, + ], + ovk: [ + 0x67, 0x79, 0x9a, 0x90, 0x01, 0xa2, 0xed, 0x36, 0x76, 0xa8, 0xb4, 0x03, 0xae, 0x25, + 0xff, 0xd7, 0x72, 0xf7, 0x08, 0x1e, 0x9a, 0x32, 0xbc, 0xc1, 0xc5, 0xe2, 0xed, 0xd4, + 0xe2, 0xa6, 0x57, 0x6b, + ], + default_d: [ + 0xdd, 0xb7, 0xc5, 0xbc, 0x4d, 0xe9, 0xdf, 0x52, 0x1b, 0xb0, 0x4b, + ], + default_pk_d: [ + 0x65, 0x3d, 0x07, 0xc9, 0x07, 0x94, 0x6a, 0xc3, 0x02, 0x0e, 0xbd, 0xe1, 0xb4, 0xf6, + 0x10, 0x21, 0x0c, 0x30, 0xc4, 0x50, 0xe4, 0x27, 0x12, 0x65, 0xa0, 0x5d, 0x6e, 0xce, + 0x44, 0x6d, 0xf4, 0x39, + ], + v: 7122345086698755501, + rseed: [ + 0x2d, 0xd4, 0x17, 0xdf, 0x26, 0xdc, 0xd2, 0x20, 0xf2, 0xb7, 0x31, 0x77, 0x2b, 0x43, + 0x9e, 0x96, 0xd6, 0x14, 0xe1, 0xfa, 0xcb, 0x48, 0x6c, 0x7a, 0x7d, 0x51, 0x71, 0xb1, + 0xde, 0x35, 0x9f, 0x6a, + ], + asset: [ + 0x67, 0x43, 0xf9, 0x3a, 0x6e, 0xbd, 0xa7, 0x2a, 0x8c, 0x7c, 0x5a, 0x2b, 0x7f, 0xa3, + 0x04, 0xfe, 0x32, 0xb2, 0x9b, 0x4f, 0x70, 0x6a, 0xa8, 0xf7, 0x42, 0x0f, 0x3d, 0x8e, + 0x7a, 0x59, 0x70, 0x2f, + ], + memo: [ + 0xff, 0xd3, 0xa9, 0x6f, 0x64, 0x9c, 0x96, 0x91, 0x02, 0xa1, 0x96, 0x4f, 0xb4, 0xb4, + 0xa1, 0xa4, 0x27, 0x9c, 0x68, 0xe6, 0xc3, 0x72, 0xe4, 0x21, 0x87, 0xd7, 0x54, 0xe8, + 0x04, 0xa6, 0x16, 0x53, 0x09, 0x20, 0x69, 0xfb, 0x9b, 0x6d, 0x25, 0x26, 0x68, 0x90, + 0x80, 0x8b, 0x01, 0x5d, 0xf2, 0x8c, 0x80, 0x10, 0x65, 0xda, 0x6f, 0xeb, 0xdc, 0x1a, + 0x56, 0xbf, 0xd0, 0x02, 0x62, 0x5a, 0xcf, 0xaa, 0x53, 0x73, 0xfd, 0xe1, 0x49, 0xc1, + 0xcf, 0xc3, 0x64, 0x9b, 0x48, 0x69, 0x69, 0x6d, 0x44, 0xec, 0xb1, 0x24, 0x79, 0xc5, + 0xeb, 0xef, 0x99, 0x5f, 0x10, 0x02, 0x9f, 0x8b, 0x53, 0x0e, 0xeb, 0x3f, 0xdc, 0x2e, + 0x50, 0xe8, 0x75, 0x7f, 0xc0, 0xbb, 0x9e, 0x26, 0x30, 0x23, 0xdb, 0x82, 0xf8, 0x78, + 0xd9, 0xac, 0x7f, 0xfb, 0x0b, 0xd4, 0x39, 0x1d, 0xf1, 0xd8, 0x79, 0x89, 0x9a, 0x3e, + 0xf5, 0x7b, 0xfd, 0x0d, 0x1f, 0x77, 0x55, 0x64, 0x8e, 0xdd, 0x85, 0xbb, 0x05, 0x2a, + 0x6e, 0xdf, 0x71, 0xcd, 0x26, 0x28, 0xc9, 0x87, 0x42, 0x9f, 0x36, 0xdc, 0x50, 0x5c, + 0xcc, 0x43, 0xf3, 0x0e, 0x7a, 0x86, 0x9c, 0x9e, 0x25, 0x5e, 0x2a, 0xf9, 0xfc, 0xf3, + 0x0c, 0x12, 0x17, 0x96, 0xd1, 0x90, 0x00, 0x09, 0x60, 0xcb, 0x6f, 0xe2, 0xf1, 0xbf, + 0x24, 0x61, 0x18, 0xb4, 0x98, 0xf3, 0x24, 0x7f, 0x9d, 0x48, 0x4c, 0x73, 0xcf, 0x09, + 0x39, 0x30, 0x39, 0xe4, 0x53, 0x26, 0xb8, 0xff, 0xff, 0xb3, 0xe7, 0xe6, 0x15, 0x9c, + 0x46, 0x69, 0x9f, 0x10, 0x07, 0x92, 0xd4, 0x67, 0x29, 0x50, 0x34, 0x8a, 0x90, 0x55, + 0x2e, 0x45, 0x94, 0x3b, 0xee, 0xac, 0xf0, 0x3f, 0x32, 0x16, 0xf9, 0x4e, 0x27, 0x4d, + 0x63, 0xd6, 0x37, 0xd9, 0xf1, 0x90, 0xe8, 0xa2, 0x66, 0xcd, 0xee, 0xf1, 0x53, 0x53, + 0x0b, 0xee, 0x5c, 0xb8, 0x35, 0x52, 0x60, 0x50, 0x5c, 0x2c, 0x2e, 0x5d, 0x99, 0x0f, + 0xff, 0xdc, 0x34, 0xec, 0x0f, 0xf7, 0xf1, 0xaf, 0x81, 0xb2, 0x4c, 0xed, 0x0e, 0xfa, + 0x62, 0x13, 0xda, 0x6c, 0x7c, 0x60, 0xc4, 0x87, 0xf5, 0xf7, 0xb0, 0x3f, 0x81, 0x60, + 0xa0, 0x57, 0xf4, 0x6d, 0x05, 0xbf, 0x82, 0x18, 0xb3, 0xad, 0xd9, 0xc0, 0x68, 0x93, + 0xbd, 0x02, 0xdb, 0x9b, 0x61, 0x19, 0x1d, 0xfb, 0x13, 0x3b, 0xfa, 0xbe, 0x48, 0x58, + 0xe4, 0x7a, 0x4c, 0xc3, 0x2e, 0x41, 0x6e, 0xc0, 0x8b, 0x8a, 0xc7, 0x91, 0x5a, 0x43, + 0x73, 0x3f, 0x44, 0x06, 0xe9, 0xd9, 0x67, 0xc5, 0x60, 0xf3, 0x44, 0xd7, 0xe9, 0x04, + 0xa2, 0x80, 0x45, 0xd9, 0x9f, 0x3a, 0xf8, 0xc8, 0x2e, 0x97, 0xe1, 0xb9, 0xc1, 0xb2, + 0x05, 0xe5, 0x85, 0xfb, 0xeb, 0xb4, 0x8f, 0xaf, 0x58, 0xf1, 0xb6, 0x5d, 0xca, 0x24, + 0x97, 0xe0, 0x9a, 0x70, 0xaa, 0xd4, 0x86, 0x5f, 0x85, 0x71, 0x5a, 0x28, 0x0e, 0x18, + 0x6f, 0x3f, 0xc1, 0x74, 0x0d, 0x81, 0x84, 0xd3, 0x3e, 0x83, 0x22, 0x16, 0x95, 0x21, + 0xcd, 0xc1, 0x32, 0x21, 0x29, 0x39, 0xc8, 0x4a, 0x10, 0x89, 0x64, 0xe2, 0xde, 0x74, + 0xb6, 0xea, 0x55, 0xb4, 0xcb, 0x8f, 0x6f, 0x9b, 0xee, 0x98, 0xb1, 0x0d, 0x41, 0x51, + 0x09, 0x45, 0x5f, 0x48, 0xb7, 0x76, 0x08, 0x2d, 0xc3, 0x0b, 0x4b, 0xc7, 0x34, 0x77, + 0x07, 0x55, 0x11, 0x70, 0x03, 0x08, 0x15, 0x8c, 0xe2, 0xf2, 0xf9, 0xbf, 0x0f, 0x69, + 0x1b, 0x2c, 0xe5, 0x3e, 0x61, 0x14, 0x2c, 0xb7, 0x40, 0xc1, 0x5b, 0x7b, 0x62, 0x3c, + 0xf4, 0x8b, 0x3f, 0x7b, 0xfe, 0xfa, 0x31, 0xbc, 0xdc, 0x66, 0x5c, 0x6d, 0x71, 0x23, + 0xe9, 0x53, 0x50, 0x81, 0x13, 0x75, 0x94, 0x7b, 0x05, 0x5a, 0x43, 0xdb, 0x07, 0xe0, + 0x3f, 0x33, 0x62, 0x7d, 0xf5, 0xc6, 0x38, 0xbf, + ], + cv_net: [ + 0x00, 0x55, 0xf3, 0x5c, 0x6c, 0x82, 0x62, 0xac, 0x74, 0xfe, 0x27, 0xd7, 0x2a, 0x33, + 0xbd, 0xb9, 0x6f, 0x1c, 0xe0, 0x57, 0xc3, 0x30, 0xd1, 0xcc, 0xba, 0x2f, 0x7d, 0xa8, + 0x71, 0x55, 0x00, 0xb5, + ], + rho: [ + 0xea, 0x38, 0x44, 0x75, 0x9a, 0x9a, 0x1c, 0xc5, 0x28, 0xb2, 0x95, 0xce, 0x70, 0x13, + 0x7a, 0x85, 0xf9, 0xf0, 0x8e, 0x41, 0xa5, 0xc7, 0xc1, 0xca, 0xc1, 0x55, 0xa6, 0x69, + 0xa3, 0x18, 0x53, 0x3e, + ], + cmx: [ + 0x6a, 0xba, 0x28, 0x10, 0x5b, 0xc0, 0x72, 0xc5, 0x2a, 0xb8, 0xa3, 0x14, 0x79, 0x7f, + 0xf8, 0x66, 0x66, 0xdf, 0xb7, 0xcd, 0x8a, 0x2a, 0xe1, 0x7c, 0x58, 0x5f, 0xb7, 0xb6, + 0x51, 0x5b, 0x97, 0x1c, + ], + esk: [ + 0x03, 0xfb, 0x79, 0x43, 0x75, 0x27, 0x5d, 0x23, 0xd1, 0x58, 0xd5, 0x64, 0x6b, 0xc4, + 0x63, 0xa8, 0xb7, 0x38, 0xbc, 0x79, 0x38, 0xf6, 0x0d, 0xfb, 0x15, 0x5b, 0xef, 0x4d, + 0x46, 0x1e, 0xec, 0x29, + ], + ephemeral_key: [ + 0x95, 0x9b, 0xea, 0x8e, 0x11, 0x96, 0x8b, 0x0f, 0x34, 0x3c, 0x04, 0xcd, 0x6d, 0x50, + 0x16, 0xfc, 0xd4, 0x33, 0x90, 0x75, 0x36, 0xa2, 0x46, 0xba, 0x1c, 0x5d, 0x3e, 0x88, + 0x97, 0xf3, 0x23, 0x1c, + ], + shared_secret: [ + 0xe2, 0x69, 0x19, 0xb4, 0x0c, 0x70, 0xaf, 0x74, 0x1d, 0xf9, 0x04, 0x51, 0x72, 0x55, + 0x03, 0x58, 0x89, 0xee, 0x5a, 0x44, 0x42, 0x6d, 0x6a, 0xb8, 0x5c, 0x07, 0x4b, 0x86, + 0x2b, 0xa0, 0x63, 0x08, + ], + k_enc: [ + 0x09, 0xda, 0xc6, 0x51, 0x1c, 0x38, 0x44, 0x58, 0x7f, 0x82, 0x9c, 0x2f, 0x1e, 0xa0, + 0x37, 0xa8, 0x1a, 0x8d, 0x54, 0x85, 0xed, 0x04, 0xea, 0xf2, 0x75, 0x80, 0x05, 0xb3, + 0x2a, 0x20, 0x47, 0x0b, + ], + p_enc: [ + 0x03, 0xdd, 0xb7, 0xc5, 0xbc, 0x4d, 0xe9, 0xdf, 0x52, 0x1b, 0xb0, 0x4b, 0xad, 0x95, + 0x6d, 0xdc, 0x1e, 0xa7, 0xd7, 0x62, 0x2d, 0xd4, 0x17, 0xdf, 0x26, 0xdc, 0xd2, 0x20, + 0xf2, 0xb7, 0x31, 0x77, 0x2b, 0x43, 0x9e, 0x96, 0xd6, 0x14, 0xe1, 0xfa, 0xcb, 0x48, + 0x6c, 0x7a, 0x7d, 0x51, 0x71, 0xb1, 0xde, 0x35, 0x9f, 0x6a, 0x67, 0x43, 0xf9, 0x3a, + 0x6e, 0xbd, 0xa7, 0x2a, 0x8c, 0x7c, 0x5a, 0x2b, 0x7f, 0xa3, 0x04, 0xfe, 0x32, 0xb2, + 0x9b, 0x4f, 0x70, 0x6a, 0xa8, 0xf7, 0x42, 0x0f, 0x3d, 0x8e, 0x7a, 0x59, 0x70, 0x2f, + 0xff, 0xd3, 0xa9, 0x6f, 0x64, 0x9c, 0x96, 0x91, 0x02, 0xa1, 0x96, 0x4f, 0xb4, 0xb4, + 0xa1, 0xa4, 0x27, 0x9c, 0x68, 0xe6, 0xc3, 0x72, 0xe4, 0x21, 0x87, 0xd7, 0x54, 0xe8, + 0x04, 0xa6, 0x16, 0x53, 0x09, 0x20, 0x69, 0xfb, 0x9b, 0x6d, 0x25, 0x26, 0x68, 0x90, + 0x80, 0x8b, 0x01, 0x5d, 0xf2, 0x8c, 0x80, 0x10, 0x65, 0xda, 0x6f, 0xeb, 0xdc, 0x1a, + 0x56, 0xbf, 0xd0, 0x02, 0x62, 0x5a, 0xcf, 0xaa, 0x53, 0x73, 0xfd, 0xe1, 0x49, 0xc1, + 0xcf, 0xc3, 0x64, 0x9b, 0x48, 0x69, 0x69, 0x6d, 0x44, 0xec, 0xb1, 0x24, 0x79, 0xc5, + 0xeb, 0xef, 0x99, 0x5f, 0x10, 0x02, 0x9f, 0x8b, 0x53, 0x0e, 0xeb, 0x3f, 0xdc, 0x2e, + 0x50, 0xe8, 0x75, 0x7f, 0xc0, 0xbb, 0x9e, 0x26, 0x30, 0x23, 0xdb, 0x82, 0xf8, 0x78, + 0xd9, 0xac, 0x7f, 0xfb, 0x0b, 0xd4, 0x39, 0x1d, 0xf1, 0xd8, 0x79, 0x89, 0x9a, 0x3e, + 0xf5, 0x7b, 0xfd, 0x0d, 0x1f, 0x77, 0x55, 0x64, 0x8e, 0xdd, 0x85, 0xbb, 0x05, 0x2a, + 0x6e, 0xdf, 0x71, 0xcd, 0x26, 0x28, 0xc9, 0x87, 0x42, 0x9f, 0x36, 0xdc, 0x50, 0x5c, + 0xcc, 0x43, 0xf3, 0x0e, 0x7a, 0x86, 0x9c, 0x9e, 0x25, 0x5e, 0x2a, 0xf9, 0xfc, 0xf3, + 0x0c, 0x12, 0x17, 0x96, 0xd1, 0x90, 0x00, 0x09, 0x60, 0xcb, 0x6f, 0xe2, 0xf1, 0xbf, + 0x24, 0x61, 0x18, 0xb4, 0x98, 0xf3, 0x24, 0x7f, 0x9d, 0x48, 0x4c, 0x73, 0xcf, 0x09, + 0x39, 0x30, 0x39, 0xe4, 0x53, 0x26, 0xb8, 0xff, 0xff, 0xb3, 0xe7, 0xe6, 0x15, 0x9c, + 0x46, 0x69, 0x9f, 0x10, 0x07, 0x92, 0xd4, 0x67, 0x29, 0x50, 0x34, 0x8a, 0x90, 0x55, + 0x2e, 0x45, 0x94, 0x3b, 0xee, 0xac, 0xf0, 0x3f, 0x32, 0x16, 0xf9, 0x4e, 0x27, 0x4d, + 0x63, 0xd6, 0x37, 0xd9, 0xf1, 0x90, 0xe8, 0xa2, 0x66, 0xcd, 0xee, 0xf1, 0x53, 0x53, + 0x0b, 0xee, 0x5c, 0xb8, 0x35, 0x52, 0x60, 0x50, 0x5c, 0x2c, 0x2e, 0x5d, 0x99, 0x0f, + 0xff, 0xdc, 0x34, 0xec, 0x0f, 0xf7, 0xf1, 0xaf, 0x81, 0xb2, 0x4c, 0xed, 0x0e, 0xfa, + 0x62, 0x13, 0xda, 0x6c, 0x7c, 0x60, 0xc4, 0x87, 0xf5, 0xf7, 0xb0, 0x3f, 0x81, 0x60, + 0xa0, 0x57, 0xf4, 0x6d, 0x05, 0xbf, 0x82, 0x18, 0xb3, 0xad, 0xd9, 0xc0, 0x68, 0x93, + 0xbd, 0x02, 0xdb, 0x9b, 0x61, 0x19, 0x1d, 0xfb, 0x13, 0x3b, 0xfa, 0xbe, 0x48, 0x58, + 0xe4, 0x7a, 0x4c, 0xc3, 0x2e, 0x41, 0x6e, 0xc0, 0x8b, 0x8a, 0xc7, 0x91, 0x5a, 0x43, + 0x73, 0x3f, 0x44, 0x06, 0xe9, 0xd9, 0x67, 0xc5, 0x60, 0xf3, 0x44, 0xd7, 0xe9, 0x04, + 0xa2, 0x80, 0x45, 0xd9, 0x9f, 0x3a, 0xf8, 0xc8, 0x2e, 0x97, 0xe1, 0xb9, 0xc1, 0xb2, + 0x05, 0xe5, 0x85, 0xfb, 0xeb, 0xb4, 0x8f, 0xaf, 0x58, 0xf1, 0xb6, 0x5d, 0xca, 0x24, + 0x97, 0xe0, 0x9a, 0x70, 0xaa, 0xd4, 0x86, 0x5f, 0x85, 0x71, 0x5a, 0x28, 0x0e, 0x18, + 0x6f, 0x3f, 0xc1, 0x74, 0x0d, 0x81, 0x84, 0xd3, 0x3e, 0x83, 0x22, 0x16, 0x95, 0x21, + 0xcd, 0xc1, 0x32, 0x21, 0x29, 0x39, 0xc8, 0x4a, 0x10, 0x89, 0x64, 0xe2, 0xde, 0x74, + 0xb6, 0xea, 0x55, 0xb4, 0xcb, 0x8f, 0x6f, 0x9b, 0xee, 0x98, 0xb1, 0x0d, 0x41, 0x51, + 0x09, 0x45, 0x5f, 0x48, 0xb7, 0x76, 0x08, 0x2d, 0xc3, 0x0b, 0x4b, 0xc7, 0x34, 0x77, + 0x07, 0x55, 0x11, 0x70, 0x03, 0x08, 0x15, 0x8c, 0xe2, 0xf2, 0xf9, 0xbf, 0x0f, 0x69, + 0x1b, 0x2c, 0xe5, 0x3e, 0x61, 0x14, 0x2c, 0xb7, 0x40, 0xc1, 0x5b, 0x7b, 0x62, 0x3c, + 0xf4, 0x8b, 0x3f, 0x7b, 0xfe, 0xfa, 0x31, 0xbc, 0xdc, 0x66, 0x5c, 0x6d, 0x71, 0x23, + 0xe9, 0x53, 0x50, 0x81, 0x13, 0x75, 0x94, 0x7b, 0x05, 0x5a, 0x43, 0xdb, 0x07, 0xe0, + 0x3f, 0x33, 0x62, 0x7d, 0xf5, 0xc6, 0x38, 0xbf, + ], + c_enc: [ + 0x7a, 0x59, 0x87, 0x78, 0xa7, 0x28, 0x4d, 0x52, 0xa7, 0x47, 0x77, 0x4c, 0x54, 0xbd, + 0x92, 0x57, 0xb3, 0xf1, 0x7a, 0xf1, 0x3e, 0xcc, 0x72, 0xc0, 0xe3, 0xcd, 0x95, 0xeb, + 0xfa, 0xfa, 0xa3, 0x7d, 0x16, 0x65, 0x15, 0x53, 0xdd, 0x27, 0xf0, 0x1c, 0x9c, 0xf2, + 0x4b, 0x62, 0xd7, 0xdc, 0xfd, 0x52, 0xfa, 0x4b, 0x2b, 0x3b, 0xd2, 0x1c, 0xf9, 0xbe, + 0xf6, 0xc6, 0xc5, 0x47, 0x62, 0xfa, 0x2a, 0x61, 0x45, 0x53, 0xcd, 0x9b, 0x45, 0x3e, + 0x23, 0xbe, 0x78, 0x88, 0x56, 0x69, 0x77, 0xf6, 0xc4, 0xe0, 0xe7, 0x7c, 0x90, 0xe6, + 0x1b, 0x01, 0x1a, 0xe9, 0x95, 0x5e, 0x62, 0x87, 0x04, 0xd6, 0x20, 0x36, 0x6e, 0xda, + 0xef, 0xcc, 0x17, 0x13, 0xc7, 0x48, 0xc5, 0xb3, 0x6a, 0x32, 0x76, 0x51, 0xaf, 0x94, + 0xcf, 0x94, 0x82, 0x10, 0xb6, 0x10, 0x8b, 0xe4, 0x82, 0x5b, 0xe5, 0x75, 0x2e, 0x7f, + 0xcd, 0xe1, 0x2d, 0x1a, 0x03, 0x74, 0xa3, 0x85, 0xeb, 0x58, 0xfa, 0xde, 0x07, 0x3e, + 0x04, 0x87, 0xdc, 0x92, 0x17, 0x6c, 0x48, 0xc3, 0x6b, 0x7a, 0x2b, 0x34, 0x7a, 0x0f, + 0x96, 0x87, 0x5a, 0x31, 0x2a, 0xd5, 0x17, 0x9d, 0xa3, 0xfc, 0x81, 0x9c, 0xf0, 0xd4, + 0x8a, 0xb1, 0x46, 0xec, 0x2a, 0x2d, 0xd1, 0x45, 0xd7, 0x8d, 0x9d, 0x9f, 0x88, 0x84, + 0x82, 0x16, 0x55, 0x7d, 0x6e, 0x28, 0x30, 0x33, 0x56, 0xea, 0xfb, 0x2d, 0xbb, 0xe4, + 0xfd, 0x12, 0x24, 0x71, 0x37, 0x31, 0x73, 0x0e, 0xae, 0x6f, 0x52, 0x62, 0x5a, 0x59, + 0xe5, 0xb6, 0x06, 0xd2, 0xb2, 0x77, 0xe4, 0x09, 0x7e, 0x4f, 0x54, 0x24, 0x56, 0x84, + 0xeb, 0x3b, 0x64, 0xf5, 0x4d, 0xf6, 0x69, 0x7d, 0x6f, 0x39, 0x82, 0xba, 0xc4, 0x98, + 0xdf, 0x5a, 0x14, 0x43, 0x4f, 0x2e, 0x51, 0xab, 0x4c, 0xc2, 0x9d, 0x6f, 0x31, 0x28, + 0x8f, 0xf6, 0x67, 0x80, 0xb7, 0x89, 0xa8, 0x30, 0x6b, 0x20, 0xc6, 0x55, 0x3a, 0x52, + 0x46, 0x35, 0xb6, 0xec, 0xb6, 0x79, 0xe5, 0x03, 0x09, 0x54, 0x02, 0x96, 0xed, 0xef, + 0x53, 0x83, 0x31, 0x63, 0xc4, 0xa2, 0x86, 0x00, 0xd1, 0xca, 0xa8, 0x43, 0x7e, 0x6f, + 0xb9, 0xce, 0xc4, 0xb9, 0xea, 0xf5, 0x66, 0xe1, 0x7b, 0xe8, 0xf8, 0xcc, 0x34, 0xcd, + 0xdb, 0x35, 0x88, 0xce, 0xb2, 0xbf, 0xe8, 0x8c, 0xc3, 0xee, 0xb4, 0x1b, 0x92, 0x63, + 0x1f, 0x13, 0xc5, 0xeb, 0xa6, 0x86, 0x30, 0xbf, 0xa5, 0x35, 0x31, 0x30, 0x06, 0x57, + 0x49, 0x44, 0x83, 0x3c, 0xea, 0x59, 0xd9, 0xb2, 0xd1, 0x94, 0xd8, 0xc1, 0xac, 0xc1, + 0xa4, 0x17, 0x62, 0xf8, 0x98, 0x09, 0xf7, 0x8d, 0xab, 0xe9, 0x9b, 0x95, 0xb5, 0xdd, + 0xbe, 0xd1, 0xd0, 0x01, 0x03, 0x26, 0x84, 0x4f, 0x23, 0x04, 0x85, 0x84, 0xaa, 0x14, + 0x66, 0x0f, 0xe2, 0x54, 0x9c, 0xbe, 0xe9, 0xaf, 0x4b, 0x63, 0xdd, 0xde, 0x1c, 0xec, + 0x9f, 0x8d, 0x7c, 0xcb, 0xa6, 0x2a, 0x39, 0xf2, 0xf4, 0x48, 0x04, 0x96, 0xa1, 0x0f, + 0x17, 0xe9, 0xf9, 0x12, 0xc6, 0xc0, 0xa1, 0x3d, 0xbd, 0x90, 0x32, 0x60, 0x42, 0x89, + 0x4b, 0xcd, 0xf6, 0xa8, 0x07, 0x32, 0xc5, 0xfb, 0x03, 0x09, 0xee, 0xbd, 0xc4, 0x34, + 0x0c, 0x5e, 0xb5, 0x66, 0x41, 0x7c, 0xc6, 0xc8, 0xa6, 0xa6, 0x09, 0xdf, 0x5b, 0x41, + 0xc6, 0xc2, 0x95, 0xd6, 0x47, 0x3d, 0xab, 0xc7, 0x4c, 0xbb, 0x34, 0xb5, 0x5b, 0xa7, + 0x9a, 0x89, 0x46, 0x35, 0xa9, 0x00, 0x93, 0x27, 0xcc, 0x1e, 0x6d, 0x3e, 0x42, 0xba, + 0x3c, 0xba, 0xfb, 0x32, 0x1b, 0xc0, 0xb2, 0xee, 0x28, 0xe4, 0x1e, 0xf3, 0xba, 0xec, + 0xbe, 0x50, 0x46, 0x72, 0xf6, 0xe9, 0x35, 0x08, 0x66, 0x90, 0x87, 0xd5, 0x03, 0x34, + 0x36, 0x41, 0xb5, 0x9b, 0x90, 0x6a, 0x56, 0x4b, 0x7b, 0x67, 0x53, 0xd6, 0x19, 0xee, + 0xc4, 0xf5, 0xe8, 0x10, 0x62, 0x0e, 0x7b, 0x50, 0x65, 0x1a, 0xb6, 0x5e, 0x0a, 0x3d, + 0xbb, 0x1d, 0x0a, 0xb7, 0x72, 0x1c, 0x5b, 0xf0, 0xd5, 0x40, 0xe1, 0x30, 0x2d, 0x8c, + 0xce, 0x27, 0x07, 0x71, 0x91, 0x99, 0xfa, 0xa5, 0x32, 0x11, 0x06, 0xab, 0x06, 0x81, + 0x6a, 0x8c, 0x04, 0x6e, 0x47, 0x8b, 0xd5, 0xc3, 0xb4, 0x8f, 0xe6, 0x65, 0xc8, 0xd5, + 0x92, 0xfb, 0x30, 0x6b, 0xa9, 0x37, 0x10, 0x23, 0x30, 0xe4, 0x56, 0x48, 0xf1, 0xc1, + 0x6f, 0x3d, 0x1a, 0x96, 0x0f, 0x2f, 0x5f, 0x8c, 0x4d, 0x00, 0x12, 0x07, 0x8f, 0x9c, + 0xfd, 0xf6, 0xb6, 0x6d, 0xe9, 0x61, 0xca, 0x2e, 0x14, 0x0d, + ], + ock: [ + 0x4a, 0x25, 0x25, 0x4c, 0xcc, 0x44, 0x4e, 0xc6, 0x1c, 0x2b, 0xac, 0xeb, 0x2e, 0xe3, + 0x97, 0x7a, 0x63, 0x32, 0x44, 0x9a, 0x3a, 0x53, 0xad, 0xd2, 0x31, 0xab, 0xf3, 0xd1, + 0x8b, 0xb3, 0x29, 0x3d, + ], + op: [ + 0x65, 0x3d, 0x07, 0xc9, 0x07, 0x94, 0x6a, 0xc3, 0x02, 0x0e, 0xbd, 0xe1, 0xb4, 0xf6, + 0x10, 0x21, 0x0c, 0x30, 0xc4, 0x50, 0xe4, 0x27, 0x12, 0x65, 0xa0, 0x5d, 0x6e, 0xce, + 0x44, 0x6d, 0xf4, 0x39, 0x03, 0xfb, 0x79, 0x43, 0x75, 0x27, 0x5d, 0x23, 0xd1, 0x58, + 0xd5, 0x64, 0x6b, 0xc4, 0x63, 0xa8, 0xb7, 0x38, 0xbc, 0x79, 0x38, 0xf6, 0x0d, 0xfb, + 0x15, 0x5b, 0xef, 0x4d, 0x46, 0x1e, 0xec, 0x29, + ], + c_out: [ + 0x7b, 0xf4, 0x12, 0x7d, 0x22, 0xcc, 0x57, 0x35, 0x87, 0x51, 0x2f, 0xf8, 0x1e, 0x55, + 0x3e, 0x3c, 0x98, 0x23, 0x5f, 0x51, 0xc7, 0x23, 0x7e, 0x9e, 0x76, 0x1a, 0x08, 0xf2, + 0xe1, 0xe8, 0x0d, 0x04, 0x26, 0x98, 0xfc, 0x3b, 0x1d, 0x03, 0x18, 0xf1, 0xfd, 0xca, + 0x8e, 0x41, 0xa3, 0x16, 0xd6, 0xaf, 0x3a, 0xc0, 0xc4, 0x0c, 0xe1, 0x99, 0x47, 0xa2, + 0xba, 0xfe, 0x80, 0x4d, 0x46, 0x6e, 0xd0, 0x79, 0x82, 0x7f, 0xc1, 0x41, 0x91, 0xeb, + 0xb5, 0x99, 0x17, 0x87, 0x49, 0xe9, 0xc4, 0x06, 0xaf, 0x26, + ], + }, + TestVector { + incoming_viewing_key: [ + 0xdc, 0x10, 0x95, 0x20, 0x57, 0xc4, 0xbe, 0xaa, 0xd8, 0xaf, 0x37, 0xce, 0x4e, 0xee, + 0x9b, 0x10, 0xed, 0x84, 0xf4, 0x6b, 0xad, 0xd4, 0x8e, 0x0a, 0x22, 0x9b, 0xe8, 0x41, + 0x54, 0xa9, 0xbf, 0x75, 0x6b, 0xe0, 0x2e, 0xcf, 0xa9, 0xad, 0x6d, 0x9c, 0x02, 0xc8, + 0xf9, 0x54, 0xcb, 0x15, 0x71, 0x7b, 0x79, 0x46, 0x1f, 0x00, 0x4b, 0xf1, 0xbc, 0x5c, + 0x7e, 0x3f, 0xda, 0x73, 0x53, 0x7c, 0x1a, 0x0a, + ], + ovk: [ + 0x97, 0x74, 0x85, 0xcd, 0xdf, 0xbe, 0xd5, 0x93, 0x2f, 0x50, 0x7b, 0x79, 0x94, 0x7a, + 0xdb, 0x2f, 0xad, 0x37, 0x61, 0x5a, 0xa7, 0x17, 0xdb, 0x5f, 0x29, 0x80, 0x99, 0xf2, + 0x0f, 0x26, 0x3b, 0x35, + ], + default_d: [ + 0xf6, 0xb0, 0x18, 0xdf, 0xa7, 0x26, 0x31, 0x5b, 0x44, 0xcf, 0x9e, + ], + default_pk_d: [ + 0x05, 0x82, 0x53, 0xd4, 0x85, 0x76, 0x44, 0x88, 0x5e, 0x26, 0xa9, 0x09, 0xc8, 0x38, + 0x59, 0x25, 0x23, 0x5a, 0x75, 0x29, 0x85, 0x44, 0x6e, 0x11, 0x69, 0x5f, 0x36, 0xc2, + 0xe6, 0x84, 0x45, 0xbb, + ], + v: 2111628168871420429, + rseed: [ + 0xcc, 0x57, 0x9a, 0x7a, 0x8f, 0xff, 0x7c, 0xa7, 0xcf, 0x14, 0x5d, 0xfc, 0x13, 0xea, + 0xfc, 0x34, 0x15, 0x3b, 0x2c, 0x3e, 0x8a, 0xfb, 0xe5, 0x34, 0x44, 0xd0, 0xc7, 0x3b, + 0x3b, 0xd5, 0xbc, 0x87, + ], + asset: [ + 0xa9, 0x71, 0x5e, 0x65, 0xaf, 0x82, 0x67, 0x37, 0x3d, 0x34, 0x51, 0x67, 0x4f, 0xf0, + 0x84, 0xef, 0xd9, 0x2c, 0xcf, 0x3b, 0xcc, 0x7a, 0xca, 0x14, 0x67, 0xb6, 0x32, 0x7e, + 0x4f, 0x95, 0x22, 0xb2, + ], + memo: [ + 0xff, 0x0b, 0x01, 0xcd, 0x45, 0x79, 0x11, 0xe3, 0x56, 0x31, 0x3f, 0xd1, 0xda, 0xfb, + 0x4c, 0x81, 0x51, 0x63, 0x4a, 0x01, 0xaf, 0xf7, 0xcf, 0x11, 0x6d, 0x43, 0x3c, 0x3d, + 0x2b, 0x3a, 0xdd, 0xa9, 0xce, 0xbe, 0x18, 0xf7, 0xd1, 0x72, 0x44, 0x3e, 0x5e, 0x7b, + 0x5a, 0xc9, 0xab, 0xe8, 0xdb, 0x22, 0x56, 0xd7, 0xeb, 0xe2, 0xff, 0x28, 0x02, 0x09, + 0x39, 0x50, 0x38, 0x70, 0x59, 0x7b, 0x9a, 0x95, 0x58, 0x92, 0xc7, 0x38, 0x96, 0x50, + 0xa2, 0xd4, 0x2e, 0xc9, 0x2b, 0xe7, 0x23, 0xfe, 0xdf, 0x2f, 0x2e, 0xde, 0x5a, 0x47, + 0x2a, 0xa1, 0xe7, 0x4f, 0x33, 0xad, 0x41, 0x90, 0x15, 0x44, 0xed, 0xbb, 0xe3, 0xac, + 0x46, 0x4c, 0xf4, 0x39, 0x19, 0x60, 0x15, 0xf4, 0xf2, 0x2a, 0xc2, 0xb8, 0xfc, 0x01, + 0x49, 0x6b, 0xea, 0xb4, 0xd4, 0x59, 0x07, 0xf4, 0x79, 0x81, 0x2a, 0x25, 0x94, 0x31, + 0xa2, 0xcb, 0xc9, 0x3d, 0x4f, 0x3b, 0x84, 0xe4, 0xdd, 0x36, 0x60, 0x20, 0x27, 0x3a, + 0x67, 0x52, 0xe5, 0x01, 0xaf, 0x6f, 0xf1, 0xb7, 0x8d, 0xdc, 0x81, 0x7e, 0x6e, 0xa3, + 0x51, 0xd6, 0x00, 0x6b, 0xec, 0xf8, 0xd2, 0xff, 0xb0, 0x39, 0x90, 0xf6, 0x77, 0x74, + 0xa8, 0x1e, 0x05, 0xb7, 0xf4, 0xbb, 0xad, 0x85, 0x77, 0xfa, 0x27, 0xc9, 0xde, 0x64, + 0xe1, 0xb1, 0x1d, 0xcf, 0x38, 0x4f, 0x59, 0x56, 0x44, 0x37, 0x48, 0x75, 0x5a, 0x9f, + 0xc6, 0xf2, 0xa0, 0x0b, 0x10, 0xc3, 0x65, 0x7e, 0xba, 0xc0, 0x3b, 0xfc, 0x0b, 0x58, + 0x7b, 0xef, 0x2f, 0x45, 0xec, 0x8a, 0xcd, 0xaa, 0x51, 0xc1, 0x43, 0xb0, 0xcb, 0x25, + 0xb9, 0x14, 0x2c, 0x61, 0xbd, 0x79, 0x0a, 0x80, 0xd7, 0xc2, 0x3f, 0x90, 0xcc, 0x03, + 0x49, 0x5b, 0x51, 0xe4, 0xd2, 0x84, 0x3e, 0x55, 0x7f, 0x9e, 0x25, 0x45, 0x10, 0x8c, + 0x6c, 0x6f, 0xae, 0x35, 0x9f, 0x64, 0x5c, 0x27, 0x68, 0x91, 0xc0, 0xdc, 0xab, 0x3f, + 0xaf, 0x18, 0x77, 0x00, 0xc0, 0x82, 0xdc, 0x47, 0x77, 0x40, 0xfb, 0x3f, 0x2c, 0xd7, + 0xbb, 0x59, 0xfb, 0x35, 0x85, 0x54, 0xe9, 0x4c, 0x7e, 0x67, 0x8c, 0xe0, 0x1a, 0xeb, + 0xf9, 0x4e, 0x51, 0x5e, 0x49, 0x72, 0x29, 0x67, 0x99, 0x5a, 0xea, 0x85, 0x8d, 0x64, + 0xe7, 0x78, 0x9f, 0xf3, 0x06, 0x36, 0x95, 0x77, 0x22, 0x81, 0x80, 0x32, 0x6a, 0x5b, + 0x0a, 0xf4, 0x75, 0xe2, 0x7a, 0x54, 0xb2, 0x07, 0xb4, 0x1f, 0x92, 0xe3, 0x76, 0x17, + 0x0e, 0x3f, 0xb0, 0x05, 0x02, 0x82, 0x61, 0xc9, 0x9c, 0x2d, 0xbd, 0x0e, 0xed, 0xee, + 0x87, 0x1c, 0x1c, 0x0f, 0x48, 0xb8, 0xe9, 0xb8, 0xe4, 0xbe, 0x77, 0xd1, 0xb7, 0x37, + 0xfe, 0x21, 0xf0, 0xfa, 0x5a, 0x18, 0xeb, 0xb5, 0x27, 0x55, 0xb5, 0xa6, 0xcf, 0x61, + 0x30, 0xfb, 0x56, 0x94, 0x4c, 0xfa, 0xb8, 0x75, 0x27, 0xc2, 0x50, 0xd1, 0x13, 0xb2, + 0x9b, 0xca, 0xc9, 0xaa, 0xa1, 0x0c, 0x2e, 0x7d, 0xe4, 0x15, 0xed, 0xb0, 0x80, 0x6c, + 0x6d, 0xa0, 0x30, 0x20, 0xa1, 0x34, 0xca, 0x7e, 0xcd, 0xc8, 0xda, 0x1b, 0xd5, 0x7a, + 0x37, 0xf5, 0x5a, 0x46, 0x94, 0x0b, 0x45, 0xb2, 0x41, 0xb1, 0xc1, 0x6e, 0xe1, 0x00, + 0x92, 0x7d, 0x1b, 0xd8, 0x60, 0xd4, 0x45, 0xa9, 0xde, 0x50, 0xd4, 0xc3, 0x84, 0xd6, + 0xe1, 0xd0, 0x01, 0x08, 0x02, 0x6c, 0x0e, 0xa5, 0xeb, 0xbf, 0x0b, 0x72, 0xfb, 0xf5, + 0xc3, 0x70, 0xbc, 0xe1, 0x8d, 0x3a, 0xcb, 0xc4, 0x65, 0x99, 0x09, 0x9b, 0xaa, 0xe1, + 0xd8, 0x02, 0xf7, 0x73, 0x33, 0x49, 0x4a, 0x7a, 0xe1, 0x30, 0xfe, 0x86, 0xe8, 0xf8, + 0x18, 0xf9, 0x26, 0x1a, 0x2d, 0xad, 0xb4, 0x12, 0x52, 0x29, 0xba, 0x0f, 0xfc, 0x0e, + 0x70, 0x90, 0x32, 0x44, 0x30, 0xb5, 0x21, 0xa9, + ], + cv_net: [ + 0xba, 0x69, 0x9c, 0xe4, 0x21, 0x41, 0x85, 0x30, 0x94, 0xe2, 0x84, 0x00, 0x50, 0x17, + 0x2c, 0x3b, 0x94, 0x21, 0x3e, 0x86, 0x47, 0x3b, 0x5e, 0x2f, 0xdd, 0x70, 0x97, 0x80, + 0xbc, 0xca, 0x68, 0xb4, + ], + rho: [ + 0xf6, 0x5d, 0x22, 0x96, 0x09, 0x58, 0xd7, 0x28, 0x59, 0x60, 0x9c, 0x99, 0x46, 0xd8, + 0xa9, 0x4a, 0x06, 0x04, 0xb8, 0x00, 0x6c, 0xc7, 0x94, 0xbc, 0xab, 0x57, 0x73, 0x49, + 0xbc, 0xf8, 0x63, 0x37, + ], + cmx: [ + 0x20, 0x43, 0xa5, 0x58, 0x39, 0x9e, 0x2e, 0xed, 0x91, 0xd9, 0x5d, 0x32, 0xe6, 0xd6, + 0x7c, 0x93, 0xdb, 0x08, 0xe2, 0x15, 0x15, 0x02, 0x85, 0x8d, 0x8b, 0x77, 0x54, 0x87, + 0x5f, 0x10, 0x89, 0x32, + ], + esk: [ + 0x05, 0x18, 0xdd, 0xc0, 0xc4, 0x7b, 0x7f, 0x77, 0xed, 0xcd, 0x39, 0x16, 0x0f, 0xe5, + 0x67, 0x75, 0x1e, 0xb8, 0x4a, 0xa2, 0x1d, 0x33, 0xa6, 0x90, 0xe0, 0xd2, 0x9b, 0x35, + 0x9a, 0xc4, 0xfa, 0x2c, + ], + ephemeral_key: [ + 0x10, 0x0d, 0xf0, 0x1d, 0x49, 0x86, 0x01, 0x21, 0x8a, 0x28, 0x6b, 0x8f, 0x4e, 0x54, + 0xda, 0x9b, 0x3f, 0x14, 0x5c, 0x34, 0x70, 0xa9, 0xdb, 0xc4, 0x14, 0x48, 0x0a, 0xa8, + 0xf2, 0xf4, 0x90, 0x9c, + ], + shared_secret: [ + 0x93, 0x68, 0xdd, 0x4f, 0x2a, 0xf6, 0x23, 0x34, 0xb8, 0x85, 0xb9, 0x6b, 0xc4, 0xc3, + 0x8f, 0x10, 0x3a, 0xec, 0x25, 0x6b, 0xed, 0xc2, 0x8b, 0x5e, 0x2e, 0x10, 0x36, 0x4c, + 0xdd, 0xf3, 0x84, 0xa4, + ], + k_enc: [ + 0x7a, 0xff, 0xfc, 0x6e, 0xae, 0x5d, 0x56, 0xb2, 0x7b, 0x86, 0xdb, 0x9e, 0xc8, 0xae, + 0xc2, 0x70, 0xbb, 0x0a, 0xb7, 0x31, 0x23, 0xfd, 0x2a, 0x0b, 0x83, 0xf4, 0xef, 0x84, + 0xc6, 0x98, 0xe1, 0x67, + ], + p_enc: [ + 0x03, 0xf6, 0xb0, 0x18, 0xdf, 0xa7, 0x26, 0x31, 0x5b, 0x44, 0xcf, 0x9e, 0x0d, 0x22, + 0x4a, 0xb7, 0xa1, 0x02, 0x4e, 0x1d, 0xcc, 0x57, 0x9a, 0x7a, 0x8f, 0xff, 0x7c, 0xa7, + 0xcf, 0x14, 0x5d, 0xfc, 0x13, 0xea, 0xfc, 0x34, 0x15, 0x3b, 0x2c, 0x3e, 0x8a, 0xfb, + 0xe5, 0x34, 0x44, 0xd0, 0xc7, 0x3b, 0x3b, 0xd5, 0xbc, 0x87, 0xa9, 0x71, 0x5e, 0x65, + 0xaf, 0x82, 0x67, 0x37, 0x3d, 0x34, 0x51, 0x67, 0x4f, 0xf0, 0x84, 0xef, 0xd9, 0x2c, + 0xcf, 0x3b, 0xcc, 0x7a, 0xca, 0x14, 0x67, 0xb6, 0x32, 0x7e, 0x4f, 0x95, 0x22, 0xb2, + 0xff, 0x0b, 0x01, 0xcd, 0x45, 0x79, 0x11, 0xe3, 0x56, 0x31, 0x3f, 0xd1, 0xda, 0xfb, + 0x4c, 0x81, 0x51, 0x63, 0x4a, 0x01, 0xaf, 0xf7, 0xcf, 0x11, 0x6d, 0x43, 0x3c, 0x3d, + 0x2b, 0x3a, 0xdd, 0xa9, 0xce, 0xbe, 0x18, 0xf7, 0xd1, 0x72, 0x44, 0x3e, 0x5e, 0x7b, + 0x5a, 0xc9, 0xab, 0xe8, 0xdb, 0x22, 0x56, 0xd7, 0xeb, 0xe2, 0xff, 0x28, 0x02, 0x09, + 0x39, 0x50, 0x38, 0x70, 0x59, 0x7b, 0x9a, 0x95, 0x58, 0x92, 0xc7, 0x38, 0x96, 0x50, + 0xa2, 0xd4, 0x2e, 0xc9, 0x2b, 0xe7, 0x23, 0xfe, 0xdf, 0x2f, 0x2e, 0xde, 0x5a, 0x47, + 0x2a, 0xa1, 0xe7, 0x4f, 0x33, 0xad, 0x41, 0x90, 0x15, 0x44, 0xed, 0xbb, 0xe3, 0xac, + 0x46, 0x4c, 0xf4, 0x39, 0x19, 0x60, 0x15, 0xf4, 0xf2, 0x2a, 0xc2, 0xb8, 0xfc, 0x01, + 0x49, 0x6b, 0xea, 0xb4, 0xd4, 0x59, 0x07, 0xf4, 0x79, 0x81, 0x2a, 0x25, 0x94, 0x31, + 0xa2, 0xcb, 0xc9, 0x3d, 0x4f, 0x3b, 0x84, 0xe4, 0xdd, 0x36, 0x60, 0x20, 0x27, 0x3a, + 0x67, 0x52, 0xe5, 0x01, 0xaf, 0x6f, 0xf1, 0xb7, 0x8d, 0xdc, 0x81, 0x7e, 0x6e, 0xa3, + 0x51, 0xd6, 0x00, 0x6b, 0xec, 0xf8, 0xd2, 0xff, 0xb0, 0x39, 0x90, 0xf6, 0x77, 0x74, + 0xa8, 0x1e, 0x05, 0xb7, 0xf4, 0xbb, 0xad, 0x85, 0x77, 0xfa, 0x27, 0xc9, 0xde, 0x64, + 0xe1, 0xb1, 0x1d, 0xcf, 0x38, 0x4f, 0x59, 0x56, 0x44, 0x37, 0x48, 0x75, 0x5a, 0x9f, + 0xc6, 0xf2, 0xa0, 0x0b, 0x10, 0xc3, 0x65, 0x7e, 0xba, 0xc0, 0x3b, 0xfc, 0x0b, 0x58, + 0x7b, 0xef, 0x2f, 0x45, 0xec, 0x8a, 0xcd, 0xaa, 0x51, 0xc1, 0x43, 0xb0, 0xcb, 0x25, + 0xb9, 0x14, 0x2c, 0x61, 0xbd, 0x79, 0x0a, 0x80, 0xd7, 0xc2, 0x3f, 0x90, 0xcc, 0x03, + 0x49, 0x5b, 0x51, 0xe4, 0xd2, 0x84, 0x3e, 0x55, 0x7f, 0x9e, 0x25, 0x45, 0x10, 0x8c, + 0x6c, 0x6f, 0xae, 0x35, 0x9f, 0x64, 0x5c, 0x27, 0x68, 0x91, 0xc0, 0xdc, 0xab, 0x3f, + 0xaf, 0x18, 0x77, 0x00, 0xc0, 0x82, 0xdc, 0x47, 0x77, 0x40, 0xfb, 0x3f, 0x2c, 0xd7, + 0xbb, 0x59, 0xfb, 0x35, 0x85, 0x54, 0xe9, 0x4c, 0x7e, 0x67, 0x8c, 0xe0, 0x1a, 0xeb, + 0xf9, 0x4e, 0x51, 0x5e, 0x49, 0x72, 0x29, 0x67, 0x99, 0x5a, 0xea, 0x85, 0x8d, 0x64, + 0xe7, 0x78, 0x9f, 0xf3, 0x06, 0x36, 0x95, 0x77, 0x22, 0x81, 0x80, 0x32, 0x6a, 0x5b, + 0x0a, 0xf4, 0x75, 0xe2, 0x7a, 0x54, 0xb2, 0x07, 0xb4, 0x1f, 0x92, 0xe3, 0x76, 0x17, + 0x0e, 0x3f, 0xb0, 0x05, 0x02, 0x82, 0x61, 0xc9, 0x9c, 0x2d, 0xbd, 0x0e, 0xed, 0xee, + 0x87, 0x1c, 0x1c, 0x0f, 0x48, 0xb8, 0xe9, 0xb8, 0xe4, 0xbe, 0x77, 0xd1, 0xb7, 0x37, + 0xfe, 0x21, 0xf0, 0xfa, 0x5a, 0x18, 0xeb, 0xb5, 0x27, 0x55, 0xb5, 0xa6, 0xcf, 0x61, + 0x30, 0xfb, 0x56, 0x94, 0x4c, 0xfa, 0xb8, 0x75, 0x27, 0xc2, 0x50, 0xd1, 0x13, 0xb2, + 0x9b, 0xca, 0xc9, 0xaa, 0xa1, 0x0c, 0x2e, 0x7d, 0xe4, 0x15, 0xed, 0xb0, 0x80, 0x6c, + 0x6d, 0xa0, 0x30, 0x20, 0xa1, 0x34, 0xca, 0x7e, 0xcd, 0xc8, 0xda, 0x1b, 0xd5, 0x7a, + 0x37, 0xf5, 0x5a, 0x46, 0x94, 0x0b, 0x45, 0xb2, 0x41, 0xb1, 0xc1, 0x6e, 0xe1, 0x00, + 0x92, 0x7d, 0x1b, 0xd8, 0x60, 0xd4, 0x45, 0xa9, 0xde, 0x50, 0xd4, 0xc3, 0x84, 0xd6, + 0xe1, 0xd0, 0x01, 0x08, 0x02, 0x6c, 0x0e, 0xa5, 0xeb, 0xbf, 0x0b, 0x72, 0xfb, 0xf5, + 0xc3, 0x70, 0xbc, 0xe1, 0x8d, 0x3a, 0xcb, 0xc4, 0x65, 0x99, 0x09, 0x9b, 0xaa, 0xe1, + 0xd8, 0x02, 0xf7, 0x73, 0x33, 0x49, 0x4a, 0x7a, 0xe1, 0x30, 0xfe, 0x86, 0xe8, 0xf8, + 0x18, 0xf9, 0x26, 0x1a, 0x2d, 0xad, 0xb4, 0x12, 0x52, 0x29, 0xba, 0x0f, 0xfc, 0x0e, + 0x70, 0x90, 0x32, 0x44, 0x30, 0xb5, 0x21, 0xa9, + ], + c_enc: [ + 0x45, 0x6b, 0x2b, 0xb8, 0x03, 0xc7, 0xdf, 0xf7, 0xac, 0x82, 0xe6, 0x42, 0xf4, 0xd8, + 0x46, 0x1e, 0x0b, 0x7a, 0x3b, 0x3c, 0x95, 0xa4, 0xcb, 0xf1, 0xc0, 0x6f, 0xeb, 0x93, + 0xa1, 0x8b, 0xeb, 0xa2, 0x9f, 0x2b, 0x8f, 0x12, 0x1a, 0x61, 0x5c, 0xa5, 0x3f, 0xc2, + 0xa7, 0x60, 0x63, 0xb8, 0x0d, 0xaa, 0x71, 0x01, 0x8b, 0x66, 0x3b, 0x7c, 0x46, 0x6d, + 0xb2, 0x63, 0xf9, 0x04, 0x27, 0xd0, 0x11, 0x7f, 0x0b, 0x89, 0x90, 0x6e, 0x98, 0x41, + 0x7f, 0x3e, 0xe8, 0x5a, 0xcc, 0xed, 0xb1, 0x41, 0xfb, 0x10, 0x26, 0xa3, 0xb3, 0xf7, + 0xa4, 0xfd, 0x10, 0x24, 0xf9, 0xc8, 0x08, 0x9a, 0x2e, 0xbe, 0x1a, 0x27, 0x82, 0xf8, + 0xb0, 0xbf, 0x5c, 0x40, 0xb6, 0xd5, 0x2f, 0xfe, 0x38, 0x37, 0xf4, 0xe4, 0x42, 0x52, + 0x13, 0x41, 0xc2, 0x4d, 0x3e, 0x89, 0x55, 0x95, 0x08, 0x86, 0x27, 0x85, 0xea, 0x63, + 0x56, 0xb4, 0xe4, 0x66, 0xc3, 0x25, 0x9c, 0xeb, 0x0d, 0x28, 0x2e, 0x07, 0xbb, 0x35, + 0xdc, 0xf2, 0xd9, 0xa8, 0x62, 0xc7, 0x47, 0x58, 0xd3, 0x83, 0xaa, 0xa2, 0x82, 0xfa, + 0xc4, 0xfa, 0xcf, 0xe5, 0x39, 0xe4, 0xe1, 0xbb, 0xd5, 0x46, 0x8a, 0xcf, 0x25, 0xec, + 0x2b, 0x4b, 0xa5, 0x11, 0x9d, 0xea, 0xed, 0x01, 0x1d, 0x4f, 0x30, 0xb0, 0xc5, 0x82, + 0x01, 0xfe, 0xe1, 0xc6, 0xe4, 0xf6, 0xb5, 0x2e, 0x41, 0xad, 0xfa, 0x5d, 0x6f, 0xda, + 0x94, 0xa5, 0x23, 0x20, 0xe8, 0x3b, 0x80, 0xc6, 0xfc, 0xee, 0xb8, 0x97, 0x89, 0xd8, + 0x79, 0x94, 0xb7, 0xa0, 0x16, 0xec, 0x64, 0xe4, 0x70, 0x78, 0x07, 0xf8, 0xf2, 0xd2, + 0x30, 0x63, 0x10, 0x74, 0x10, 0x9f, 0xc5, 0x9d, 0xe3, 0xe4, 0x37, 0x10, 0xca, 0xe8, + 0x9c, 0xb1, 0x89, 0xa0, 0xa4, 0x64, 0x8b, 0x37, 0x54, 0x5d, 0x25, 0x49, 0x47, 0x95, + 0xa8, 0xdf, 0x3f, 0xfc, 0x7a, 0x3a, 0x21, 0xe3, 0xb9, 0x1c, 0x95, 0x96, 0xe0, 0xd5, + 0x10, 0x5d, 0xf8, 0xad, 0xa9, 0xcf, 0xe9, 0x31, 0x10, 0xb1, 0x9f, 0xf2, 0xaf, 0x83, + 0x03, 0xb5, 0xd2, 0x79, 0x3f, 0xff, 0xd0, 0x4d, 0x8e, 0x02, 0xf7, 0xb9, 0x30, 0x14, + 0x80, 0xdf, 0xd9, 0x35, 0x50, 0x2d, 0x98, 0xe2, 0xf3, 0xc3, 0xe9, 0xe9, 0x5e, 0x64, + 0xe4, 0x96, 0xeb, 0x7d, 0x15, 0xcf, 0x2c, 0x70, 0x11, 0x94, 0xe6, 0x25, 0xde, 0x52, + 0x1a, 0x02, 0x55, 0x20, 0xdf, 0x67, 0xac, 0x2b, 0xa4, 0x3b, 0x9c, 0x4a, 0x6d, 0x77, + 0xb8, 0x6a, 0x40, 0x18, 0x2d, 0x70, 0x31, 0x8b, 0x8f, 0xa3, 0x48, 0xb1, 0x86, 0x47, + 0xd8, 0x4e, 0x0e, 0xe5, 0xf0, 0x56, 0x07, 0xa2, 0xb8, 0xf2, 0x69, 0xe1, 0x86, 0xc7, + 0x94, 0x28, 0xbe, 0xa6, 0x7c, 0xbf, 0x71, 0xda, 0xcc, 0x98, 0xe9, 0xcc, 0x72, 0x5e, + 0x50, 0x53, 0xa4, 0x40, 0xca, 0xa6, 0xca, 0xd2, 0x41, 0xa5, 0x06, 0x28, 0x18, 0x3a, + 0xe9, 0xef, 0x9f, 0x0c, 0xbd, 0xfe, 0xf7, 0x0a, 0x42, 0xe5, 0xb7, 0x97, 0xbc, 0x99, + 0xd9, 0x22, 0xfc, 0xc2, 0x81, 0x37, 0x84, 0xea, 0xe4, 0x48, 0x60, 0x18, 0x0e, 0xf8, + 0xe8, 0x1f, 0x7b, 0x94, 0xf2, 0xad, 0x62, 0x12, 0x8b, 0xb6, 0x1f, 0x10, 0xd5, 0x0c, + 0x9c, 0xad, 0x9d, 0x80, 0x48, 0xd9, 0x78, 0x01, 0x8a, 0x1f, 0x3b, 0xc9, 0x24, 0x28, + 0xf8, 0x9d, 0x7d, 0xdc, 0xe5, 0x45, 0x4b, 0xc4, 0x49, 0x1f, 0xb4, 0xc2, 0xcb, 0x66, + 0x88, 0x35, 0xb2, 0x2f, 0xcc, 0x4d, 0xf2, 0x08, 0xf2, 0x16, 0x64, 0xf7, 0x12, 0x94, + 0xc5, 0xce, 0xd3, 0x3c, 0x8e, 0x11, 0xd4, 0x25, 0xd1, 0x39, 0x85, 0x23, 0xc2, 0x79, + 0x88, 0x3a, 0x38, 0x2f, 0x70, 0xfe, 0xfe, 0xc8, 0x25, 0xc5, 0xe3, 0x50, 0x85, 0xaf, + 0x82, 0xd0, 0xa0, 0xa9, 0xbf, 0x45, 0x11, 0x65, 0x0a, 0x2b, 0xfb, 0xf0, 0xb2, 0x18, + 0x82, 0x10, 0x5e, 0xc6, 0xe5, 0x99, 0x74, 0xd8, 0xd6, 0xce, 0x73, 0x07, 0x8f, 0xb4, + 0xb5, 0x63, 0x4e, 0x85, 0xd7, 0xe2, 0x0a, 0x97, 0xff, 0xb6, 0x5d, 0x4f, 0x5e, 0xaf, + 0x42, 0x63, 0x9b, 0x09, 0xf5, 0xed, 0xa5, 0x9a, 0xb1, 0x04, 0x97, 0x69, 0x95, 0x41, + 0xd1, 0xc8, 0x22, 0x8e, 0xca, 0x31, 0x3f, 0xd0, 0x0a, 0x21, 0xb3, 0x02, 0x7b, 0x40, + 0xd0, 0xc1, 0xfd, 0x4c, 0x2f, 0x0d, 0x97, 0xf1, 0xa9, 0x58, 0xe9, 0x2b, 0x45, 0xd5, + 0xd4, 0xbf, 0xc2, 0xef, 0x18, 0xef, 0xd6, 0xb2, 0x5b, 0x47, 0xa9, 0x4d, 0xae, 0x73, + 0xc3, 0xcf, 0xc9, 0xca, 0xd8, 0xdb, 0x82, 0x3f, 0xbd, 0x74, + ], + ock: [ + 0x9b, 0x8e, 0x79, 0x56, 0x76, 0x38, 0xa2, 0xee, 0x38, 0x72, 0x5a, 0x94, 0x28, 0x99, + 0xa5, 0xa3, 0xbd, 0xd6, 0x88, 0xdb, 0x76, 0x38, 0x99, 0x7c, 0x77, 0x27, 0x6d, 0x27, + 0x0c, 0x87, 0xd2, 0xa3, + ], + op: [ + 0x05, 0x82, 0x53, 0xd4, 0x85, 0x76, 0x44, 0x88, 0x5e, 0x26, 0xa9, 0x09, 0xc8, 0x38, + 0x59, 0x25, 0x23, 0x5a, 0x75, 0x29, 0x85, 0x44, 0x6e, 0x11, 0x69, 0x5f, 0x36, 0xc2, + 0xe6, 0x84, 0x45, 0xbb, 0x05, 0x18, 0xdd, 0xc0, 0xc4, 0x7b, 0x7f, 0x77, 0xed, 0xcd, + 0x39, 0x16, 0x0f, 0xe5, 0x67, 0x75, 0x1e, 0xb8, 0x4a, 0xa2, 0x1d, 0x33, 0xa6, 0x90, + 0xe0, 0xd2, 0x9b, 0x35, 0x9a, 0xc4, 0xfa, 0x2c, + ], + c_out: [ + 0xe6, 0xe7, 0xa3, 0x48, 0xf3, 0x3a, 0xdd, 0x64, 0x22, 0x87, 0xc5, 0xf8, 0xf0, 0x9a, + 0x5a, 0xae, 0xd7, 0x9d, 0xf6, 0x70, 0xcc, 0x29, 0x74, 0x78, 0xc2, 0x27, 0x11, 0xe3, + 0x4e, 0xfa, 0x00, 0x88, 0x1d, 0x34, 0xb8, 0x7c, 0x0f, 0x69, 0xcb, 0x55, 0xd9, 0x1d, + 0x91, 0x1d, 0x2d, 0x84, 0x1e, 0x5e, 0xf6, 0x40, 0x38, 0x24, 0xdc, 0x9d, 0x7c, 0x55, + 0x1c, 0xdb, 0xae, 0xb4, 0xa6, 0xfb, 0x46, 0x8e, 0xc0, 0x39, 0xbc, 0x84, 0x17, 0x79, + 0xa0, 0xd7, 0xbf, 0xc3, 0x1b, 0xe2, 0x0b, 0x34, 0xee, 0x25, + ], + }, + TestVector { + incoming_viewing_key: [ + 0xb6, 0x6c, 0x73, 0x33, 0x75, 0xda, 0xc6, 0xff, 0xcc, 0x98, 0xf5, 0x0f, 0x3a, 0xf0, + 0xb0, 0x76, 0x05, 0x53, 0xfe, 0x98, 0xed, 0x61, 0xff, 0xa4, 0x93, 0xea, 0xe6, 0x8d, + 0xf0, 0xb3, 0x33, 0x4e, 0xe8, 0xd4, 0x39, 0x37, 0xb7, 0xdb, 0x8e, 0xbb, 0xfe, 0xbd, + 0x54, 0x8a, 0x28, 0x02, 0x51, 0xea, 0x87, 0xaa, 0x5d, 0x8c, 0xa5, 0x36, 0x86, 0x1b, + 0x38, 0x4f, 0x20, 0x86, 0x9f, 0x8f, 0xe8, 0x01, + ], + ovk: [ + 0xe9, 0x4c, 0x15, 0x24, 0x5f, 0x1a, 0x95, 0x88, 0x40, 0xba, 0x3f, 0x38, 0x0a, 0x4d, + 0x20, 0xf1, 0x18, 0x4e, 0x77, 0x82, 0x7d, 0xe3, 0xff, 0x8f, 0x3d, 0x73, 0x45, 0x9a, + 0xfe, 0x24, 0x1f, 0x72, + ], + default_d: [ + 0x7c, 0x51, 0xbe, 0xc6, 0xee, 0x28, 0x46, 0xfd, 0x85, 0x12, 0x64, + ], + default_pk_d: [ + 0x7a, 0xfc, 0xa0, 0x5d, 0x04, 0x2c, 0x84, 0x3e, 0xec, 0xdc, 0x37, 0x24, 0x10, 0x52, + 0xc4, 0x6f, 0x93, 0xd4, 0xaf, 0xd5, 0xc9, 0xb0, 0x4d, 0x2b, 0x26, 0x4e, 0x81, 0x0f, + 0x25, 0xc8, 0xd6, 0xae, + ], + v: 16065731808124965111, + rseed: [ + 0x26, 0xf2, 0x84, 0x38, 0xe5, 0x78, 0x2f, 0x45, 0xac, 0x1d, 0x07, 0xf6, 0xf6, 0xf5, + 0xed, 0x73, 0x74, 0x1d, 0x57, 0x85, 0x83, 0x7a, 0x6b, 0x84, 0x4b, 0x47, 0x47, 0x75, + 0x71, 0x8c, 0x29, 0xdd, + ], + asset: [ + 0xdf, 0xfd, 0x79, 0xa9, 0xde, 0xd0, 0x5e, 0x88, 0x89, 0x58, 0x19, 0x9e, 0xea, 0x45, + 0x01, 0xe2, 0x99, 0x0a, 0x53, 0xa5, 0xcd, 0x2a, 0x46, 0xa4, 0x01, 0x57, 0x65, 0x88, + 0xfd, 0x7d, 0x05, 0x8a, + ], + memo: [ + 0xff, 0x99, 0x08, 0x4e, 0x9f, 0x88, 0xef, 0x15, 0x3a, 0x83, 0x29, 0xf5, 0x32, 0xa6, + 0x90, 0x17, 0xdc, 0x3a, 0x97, 0xed, 0x75, 0x43, 0x67, 0x72, 0x30, 0x98, 0xe5, 0x76, + 0x58, 0x40, 0xb0, 0x22, 0x89, 0x72, 0x44, 0x74, 0x5f, 0xbb, 0xbb, 0x30, 0xa7, 0xcb, + 0x54, 0xfa, 0x05, 0x11, 0x16, 0x6e, 0x95, 0x44, 0x12, 0x20, 0x00, 0x61, 0x0b, 0xd2, + 0xaa, 0xcb, 0xd8, 0x23, 0x25, 0xa5, 0x9b, 0x95, 0x15, 0x4e, 0xcd, 0x82, 0xc8, 0x8d, + 0x23, 0xab, 0xd1, 0xe2, 0x07, 0x70, 0xff, 0xb8, 0xaa, 0xbf, 0x83, 0xfc, 0x07, 0x34, + 0x96, 0x4c, 0xcd, 0x41, 0x1d, 0x1c, 0x93, 0x57, 0x14, 0xe2, 0x4a, 0xab, 0x56, 0x6f, + 0x4f, 0x08, 0x42, 0x40, 0x14, 0xc4, 0xec, 0xa9, 0x1b, 0x59, 0x0f, 0x08, 0x2b, 0x47, + 0x3f, 0x36, 0x1c, 0x87, 0x41, 0x5d, 0x37, 0xbd, 0x20, 0xd7, 0x0f, 0xd0, 0xb5, 0x2b, + 0x6d, 0xdf, 0x18, 0x65, 0xf7, 0x66, 0x70, 0x2e, 0x32, 0xb0, 0x5b, 0x3c, 0xf1, 0x63, + 0x0e, 0xe8, 0x59, 0x7a, 0xae, 0x19, 0x63, 0x3f, 0x35, 0x16, 0xa8, 0x55, 0x5a, 0xc5, + 0xbe, 0x32, 0xc6, 0x75, 0xbe, 0x18, 0x17, 0xef, 0xbf, 0xfd, 0x93, 0x69, 0x04, 0x1a, + 0x08, 0x9c, 0x28, 0x3f, 0x19, 0x64, 0x99, 0x68, 0xc2, 0x49, 0x8c, 0xde, 0x56, 0xf5, + 0x00, 0x43, 0x4f, 0x28, 0x0d, 0x77, 0xa9, 0xc6, 0x2e, 0x43, 0xcb, 0xd3, 0xf1, 0x36, + 0xa4, 0xc6, 0xa0, 0x0a, 0x43, 0xe6, 0xed, 0x53, 0x0c, 0xb2, 0xe8, 0xae, 0x83, 0x88, + 0x60, 0xad, 0xc8, 0x8a, 0xac, 0xc7, 0xbd, 0x6a, 0x00, 0xae, 0x0c, 0x19, 0xff, 0x45, + 0x33, 0xa4, 0x85, 0xef, 0xde, 0x08, 0x2b, 0x5f, 0x4d, 0x1f, 0x7a, 0x8e, 0xbe, 0x7e, + 0xd8, 0x2b, 0x7b, 0x05, 0xa8, 0xcf, 0xe1, 0xe3, 0x73, 0x45, 0x9f, 0x1b, 0xdc, 0xbf, + 0x95, 0x25, 0x74, 0x7e, 0x8c, 0x95, 0x08, 0xa5, 0x55, 0xfa, 0xcb, 0x79, 0x87, 0x40, + 0xe0, 0xbd, 0xf9, 0x94, 0xd9, 0x73, 0x9b, 0xbe, 0x55, 0x38, 0xa0, 0xae, 0x0f, 0x07, + 0x6c, 0x58, 0x2c, 0x0f, 0x5b, 0xa8, 0x78, 0xb9, 0x9b, 0x82, 0x49, 0xdb, 0x1d, 0x7e, + 0x95, 0x05, 0x6c, 0x98, 0xaf, 0x08, 0x3d, 0x98, 0xcb, 0x0e, 0xd9, 0xe3, 0xf7, 0x43, + 0x6e, 0x1c, 0x76, 0x43, 0x76, 0x6f, 0x96, 0x6b, 0x83, 0xe9, 0x99, 0x20, 0x6e, 0xbd, + 0x13, 0x93, 0xb9, 0xb2, 0xa7, 0xf4, 0x14, 0x48, 0x0f, 0xa0, 0x17, 0x48, 0x00, 0x69, + 0xf8, 0x5c, 0x77, 0x49, 0xc4, 0x35, 0xae, 0x2f, 0xba, 0x2d, 0xdc, 0x10, 0x38, 0xd5, + 0x47, 0xd8, 0x48, 0x54, 0x81, 0x7e, 0xf3, 0x96, 0x35, 0xc2, 0x98, 0x27, 0xaa, 0xd8, + 0x67, 0x26, 0xc9, 0xad, 0xe3, 0xb2, 0x65, 0xb9, 0x08, 0x6c, 0x8b, 0x5b, 0x75, 0xef, + 0x56, 0xfe, 0x4b, 0xd8, 0xb4, 0xd6, 0x28, 0x93, 0x89, 0x5b, 0x3f, 0xd2, 0x73, 0x4f, + 0xda, 0xc4, 0x64, 0x15, 0x6d, 0x7e, 0x5e, 0xbc, 0x7e, 0xcf, 0x1d, 0x83, 0xb8, 0x6f, + 0x65, 0x96, 0x37, 0xe3, 0xb1, 0x42, 0xc1, 0x64, 0x96, 0x3b, 0x8c, 0xdc, 0xf4, 0xba, + 0x4f, 0x40, 0x35, 0xdf, 0xfc, 0x5a, 0x78, 0x94, 0x58, 0x84, 0x77, 0x81, 0x91, 0x8a, + 0xc7, 0x2f, 0xc1, 0x8b, 0xbb, 0xf5, 0x11, 0x00, 0x32, 0xe6, 0x6d, 0x75, 0xb3, 0x17, + 0x1e, 0xf4, 0xb5, 0x13, 0x29, 0x01, 0x64, 0xa7, 0x7b, 0x42, 0xb0, 0xa4, 0xcf, 0xb8, + 0x96, 0x39, 0xab, 0x23, 0x84, 0x5e, 0x1a, 0xa2, 0xa4, 0x52, 0xf3, 0x73, 0x1c, 0x8c, + 0xb6, 0x50, 0x82, 0xa6, 0x22, 0xa7, 0xc2, 0xe0, 0x01, 0x3e, 0xa4, 0x7d, 0x0b, 0xdd, + 0x42, 0xd6, 0x99, 0x04, 0x66, 0x64, 0x9a, 0x90, 0x5c, 0x68, 0x4c, 0x32, 0x51, 0x71, + 0x6d, 0x61, 0xf7, 0x60, 0xd5, 0x3d, 0xe6, 0xe3, + ], + cv_net: [ + 0x0a, 0x1f, 0x28, 0x15, 0xb7, 0xaf, 0xe2, 0x19, 0x06, 0x87, 0x15, 0xfc, 0x76, 0x6b, + 0x87, 0x2e, 0xf2, 0x17, 0x35, 0x43, 0xac, 0x81, 0x4c, 0x32, 0xb4, 0xb6, 0x9c, 0x9c, + 0x34, 0x5e, 0x46, 0x98, + ], + rho: [ + 0x27, 0x3c, 0x68, 0xd1, 0x9c, 0xda, 0xa8, 0x62, 0x8b, 0xac, 0x37, 0xa2, 0xd4, 0x2c, + 0x51, 0x1c, 0x9b, 0xab, 0x65, 0xb6, 0xd8, 0xd5, 0xc5, 0xbd, 0x1e, 0x32, 0x77, 0x1a, + 0xb6, 0xf6, 0x4c, 0x26, + ], + cmx: [ + 0xf0, 0x32, 0x44, 0xf8, 0x87, 0xe7, 0x5e, 0x45, 0x2f, 0xf0, 0x06, 0x89, 0x64, 0x44, + 0x2c, 0x9b, 0xc1, 0x03, 0x48, 0xec, 0xa6, 0xc2, 0xbc, 0x46, 0xcc, 0x85, 0xda, 0x5d, + 0x34, 0x0b, 0x43, 0x35, + ], + esk: [ + 0xcb, 0xfc, 0x51, 0x10, 0xff, 0x2f, 0xe9, 0xc5, 0xd5, 0x9e, 0xef, 0x08, 0xbd, 0xf6, + 0xf8, 0x57, 0xe7, 0x1a, 0xab, 0x45, 0x0e, 0x6c, 0xd6, 0x13, 0xf5, 0x3b, 0x57, 0xc3, + 0x45, 0xa9, 0x87, 0x2f, + ], + ephemeral_key: [ + 0xa5, 0xc8, 0x0a, 0x29, 0xf2, 0xec, 0xdd, 0xd7, 0x01, 0x96, 0xef, 0x45, 0x9e, 0xd5, + 0x03, 0xc4, 0xb3, 0xc2, 0x22, 0x8d, 0x10, 0xcc, 0xbc, 0xad, 0x9a, 0x28, 0x23, 0x30, + 0x07, 0x7b, 0xca, 0x0c, + ], + shared_secret: [ + 0x37, 0x14, 0x15, 0xfc, 0x1e, 0x98, 0x42, 0xa1, 0x26, 0xa3, 0x7a, 0xa7, 0x7b, 0x8f, + 0x0f, 0x1a, 0xb6, 0x48, 0xa3, 0xf7, 0x43, 0x57, 0x34, 0x89, 0x6f, 0x07, 0x59, 0x52, + 0xe7, 0xd1, 0x60, 0x17, + ], + k_enc: [ + 0xd7, 0x36, 0xf0, 0x3c, 0x81, 0x2d, 0x9b, 0xf9, 0x54, 0xff, 0xd2, 0x41, 0x84, 0x07, + 0xf3, 0x36, 0xa5, 0xf9, 0x69, 0x8b, 0x62, 0x85, 0x23, 0x2f, 0x5c, 0x85, 0xf0, 0xd1, + 0x1d, 0x5e, 0x9d, 0x0a, + ], + p_enc: [ + 0x03, 0x7c, 0x51, 0xbe, 0xc6, 0xee, 0x28, 0x46, 0xfd, 0x85, 0x12, 0x64, 0xf7, 0x90, + 0xfb, 0xa7, 0xf5, 0xf1, 0xf4, 0xde, 0x26, 0xf2, 0x84, 0x38, 0xe5, 0x78, 0x2f, 0x45, + 0xac, 0x1d, 0x07, 0xf6, 0xf6, 0xf5, 0xed, 0x73, 0x74, 0x1d, 0x57, 0x85, 0x83, 0x7a, + 0x6b, 0x84, 0x4b, 0x47, 0x47, 0x75, 0x71, 0x8c, 0x29, 0xdd, 0xdf, 0xfd, 0x79, 0xa9, + 0xde, 0xd0, 0x5e, 0x88, 0x89, 0x58, 0x19, 0x9e, 0xea, 0x45, 0x01, 0xe2, 0x99, 0x0a, + 0x53, 0xa5, 0xcd, 0x2a, 0x46, 0xa4, 0x01, 0x57, 0x65, 0x88, 0xfd, 0x7d, 0x05, 0x8a, + 0xff, 0x99, 0x08, 0x4e, 0x9f, 0x88, 0xef, 0x15, 0x3a, 0x83, 0x29, 0xf5, 0x32, 0xa6, + 0x90, 0x17, 0xdc, 0x3a, 0x97, 0xed, 0x75, 0x43, 0x67, 0x72, 0x30, 0x98, 0xe5, 0x76, + 0x58, 0x40, 0xb0, 0x22, 0x89, 0x72, 0x44, 0x74, 0x5f, 0xbb, 0xbb, 0x30, 0xa7, 0xcb, + 0x54, 0xfa, 0x05, 0x11, 0x16, 0x6e, 0x95, 0x44, 0x12, 0x20, 0x00, 0x61, 0x0b, 0xd2, + 0xaa, 0xcb, 0xd8, 0x23, 0x25, 0xa5, 0x9b, 0x95, 0x15, 0x4e, 0xcd, 0x82, 0xc8, 0x8d, + 0x23, 0xab, 0xd1, 0xe2, 0x07, 0x70, 0xff, 0xb8, 0xaa, 0xbf, 0x83, 0xfc, 0x07, 0x34, + 0x96, 0x4c, 0xcd, 0x41, 0x1d, 0x1c, 0x93, 0x57, 0x14, 0xe2, 0x4a, 0xab, 0x56, 0x6f, + 0x4f, 0x08, 0x42, 0x40, 0x14, 0xc4, 0xec, 0xa9, 0x1b, 0x59, 0x0f, 0x08, 0x2b, 0x47, + 0x3f, 0x36, 0x1c, 0x87, 0x41, 0x5d, 0x37, 0xbd, 0x20, 0xd7, 0x0f, 0xd0, 0xb5, 0x2b, + 0x6d, 0xdf, 0x18, 0x65, 0xf7, 0x66, 0x70, 0x2e, 0x32, 0xb0, 0x5b, 0x3c, 0xf1, 0x63, + 0x0e, 0xe8, 0x59, 0x7a, 0xae, 0x19, 0x63, 0x3f, 0x35, 0x16, 0xa8, 0x55, 0x5a, 0xc5, + 0xbe, 0x32, 0xc6, 0x75, 0xbe, 0x18, 0x17, 0xef, 0xbf, 0xfd, 0x93, 0x69, 0x04, 0x1a, + 0x08, 0x9c, 0x28, 0x3f, 0x19, 0x64, 0x99, 0x68, 0xc2, 0x49, 0x8c, 0xde, 0x56, 0xf5, + 0x00, 0x43, 0x4f, 0x28, 0x0d, 0x77, 0xa9, 0xc6, 0x2e, 0x43, 0xcb, 0xd3, 0xf1, 0x36, + 0xa4, 0xc6, 0xa0, 0x0a, 0x43, 0xe6, 0xed, 0x53, 0x0c, 0xb2, 0xe8, 0xae, 0x83, 0x88, + 0x60, 0xad, 0xc8, 0x8a, 0xac, 0xc7, 0xbd, 0x6a, 0x00, 0xae, 0x0c, 0x19, 0xff, 0x45, + 0x33, 0xa4, 0x85, 0xef, 0xde, 0x08, 0x2b, 0x5f, 0x4d, 0x1f, 0x7a, 0x8e, 0xbe, 0x7e, + 0xd8, 0x2b, 0x7b, 0x05, 0xa8, 0xcf, 0xe1, 0xe3, 0x73, 0x45, 0x9f, 0x1b, 0xdc, 0xbf, + 0x95, 0x25, 0x74, 0x7e, 0x8c, 0x95, 0x08, 0xa5, 0x55, 0xfa, 0xcb, 0x79, 0x87, 0x40, + 0xe0, 0xbd, 0xf9, 0x94, 0xd9, 0x73, 0x9b, 0xbe, 0x55, 0x38, 0xa0, 0xae, 0x0f, 0x07, + 0x6c, 0x58, 0x2c, 0x0f, 0x5b, 0xa8, 0x78, 0xb9, 0x9b, 0x82, 0x49, 0xdb, 0x1d, 0x7e, + 0x95, 0x05, 0x6c, 0x98, 0xaf, 0x08, 0x3d, 0x98, 0xcb, 0x0e, 0xd9, 0xe3, 0xf7, 0x43, + 0x6e, 0x1c, 0x76, 0x43, 0x76, 0x6f, 0x96, 0x6b, 0x83, 0xe9, 0x99, 0x20, 0x6e, 0xbd, + 0x13, 0x93, 0xb9, 0xb2, 0xa7, 0xf4, 0x14, 0x48, 0x0f, 0xa0, 0x17, 0x48, 0x00, 0x69, + 0xf8, 0x5c, 0x77, 0x49, 0xc4, 0x35, 0xae, 0x2f, 0xba, 0x2d, 0xdc, 0x10, 0x38, 0xd5, + 0x47, 0xd8, 0x48, 0x54, 0x81, 0x7e, 0xf3, 0x96, 0x35, 0xc2, 0x98, 0x27, 0xaa, 0xd8, + 0x67, 0x26, 0xc9, 0xad, 0xe3, 0xb2, 0x65, 0xb9, 0x08, 0x6c, 0x8b, 0x5b, 0x75, 0xef, + 0x56, 0xfe, 0x4b, 0xd8, 0xb4, 0xd6, 0x28, 0x93, 0x89, 0x5b, 0x3f, 0xd2, 0x73, 0x4f, + 0xda, 0xc4, 0x64, 0x15, 0x6d, 0x7e, 0x5e, 0xbc, 0x7e, 0xcf, 0x1d, 0x83, 0xb8, 0x6f, + 0x65, 0x96, 0x37, 0xe3, 0xb1, 0x42, 0xc1, 0x64, 0x96, 0x3b, 0x8c, 0xdc, 0xf4, 0xba, + 0x4f, 0x40, 0x35, 0xdf, 0xfc, 0x5a, 0x78, 0x94, 0x58, 0x84, 0x77, 0x81, 0x91, 0x8a, + 0xc7, 0x2f, 0xc1, 0x8b, 0xbb, 0xf5, 0x11, 0x00, 0x32, 0xe6, 0x6d, 0x75, 0xb3, 0x17, + 0x1e, 0xf4, 0xb5, 0x13, 0x29, 0x01, 0x64, 0xa7, 0x7b, 0x42, 0xb0, 0xa4, 0xcf, 0xb8, + 0x96, 0x39, 0xab, 0x23, 0x84, 0x5e, 0x1a, 0xa2, 0xa4, 0x52, 0xf3, 0x73, 0x1c, 0x8c, + 0xb6, 0x50, 0x82, 0xa6, 0x22, 0xa7, 0xc2, 0xe0, 0x01, 0x3e, 0xa4, 0x7d, 0x0b, 0xdd, + 0x42, 0xd6, 0x99, 0x04, 0x66, 0x64, 0x9a, 0x90, 0x5c, 0x68, 0x4c, 0x32, 0x51, 0x71, + 0x6d, 0x61, 0xf7, 0x60, 0xd5, 0x3d, 0xe6, 0xe3, + ], + c_enc: [ + 0xfc, 0x90, 0xcb, 0xe1, 0xcd, 0x9f, 0x59, 0x9a, 0x1a, 0x24, 0xc7, 0xa3, 0xea, 0xf6, + 0x07, 0xd9, 0x13, 0xbf, 0x48, 0xbd, 0xc1, 0xa4, 0x6d, 0xf7, 0xb1, 0x74, 0x7f, 0x12, + 0x60, 0x64, 0x49, 0x4b, 0xf5, 0x39, 0x61, 0xe9, 0xa5, 0xa2, 0xb9, 0x69, 0x80, 0x57, + 0x63, 0x44, 0x2e, 0x2c, 0x38, 0x8d, 0x21, 0x2d, 0x74, 0x84, 0x6e, 0x57, 0x27, 0x87, + 0x2d, 0x06, 0x3f, 0xc9, 0x94, 0xa4, 0x4f, 0x9e, 0xb6, 0x55, 0x25, 0xd6, 0x8f, 0x98, + 0x24, 0xa6, 0x03, 0x75, 0xfe, 0x43, 0xc0, 0x5f, 0x08, 0xfe, 0x45, 0x42, 0xa7, 0xe4, + 0x0c, 0x03, 0x8d, 0xe7, 0x10, 0x85, 0x01, 0x17, 0x95, 0x1b, 0x9a, 0x32, 0x1e, 0xea, + 0x4f, 0x8c, 0x91, 0xc0, 0x1d, 0x39, 0xdb, 0xb5, 0xd4, 0x12, 0x40, 0xf8, 0xb1, 0xb1, + 0xdb, 0xb3, 0x3f, 0x45, 0x87, 0x87, 0xdb, 0x8c, 0xda, 0x06, 0x9b, 0x64, 0x5a, 0x76, + 0x38, 0xc2, 0xec, 0xca, 0xd3, 0xd9, 0xa7, 0x39, 0xd6, 0x4c, 0x9a, 0xd5, 0xd5, 0xb3, + 0xa0, 0x24, 0x55, 0xa4, 0xec, 0xd6, 0x96, 0x7c, 0xf3, 0xb3, 0x3b, 0xf0, 0x4e, 0xf6, + 0xdd, 0x88, 0x10, 0xe1, 0x0c, 0x25, 0x86, 0xf7, 0x89, 0x32, 0x44, 0xea, 0x72, 0x80, + 0xd1, 0x34, 0xcf, 0x37, 0xb3, 0xdc, 0x0c, 0x32, 0x82, 0x3b, 0x1a, 0x29, 0xc5, 0x0c, + 0xa6, 0x48, 0x31, 0xd8, 0x4e, 0xbd, 0xf5, 0xe0, 0x1c, 0x14, 0xca, 0x36, 0x05, 0xbe, + 0x02, 0xf1, 0x5f, 0x31, 0x57, 0x90, 0xf7, 0x4e, 0x20, 0x57, 0x7f, 0x92, 0x39, 0x51, + 0x2f, 0xbd, 0xdd, 0x67, 0x63, 0x77, 0xae, 0x50, 0xc3, 0xfe, 0x71, 0xc9, 0x30, 0xa8, + 0x29, 0x57, 0xd1, 0x54, 0x70, 0xeb, 0x1b, 0x55, 0xb2, 0x0c, 0xe5, 0x02, 0x35, 0x64, + 0xfe, 0xa7, 0xe1, 0x81, 0xbe, 0x04, 0xa9, 0x33, 0xa7, 0xa3, 0xa1, 0x11, 0x89, 0x4d, + 0xec, 0xf7, 0x2a, 0x56, 0x54, 0xcb, 0x4e, 0xac, 0x32, 0xe1, 0xd5, 0x96, 0xad, 0x99, + 0x1a, 0x2f, 0x4c, 0x62, 0xe8, 0xe2, 0x82, 0x57, 0x13, 0x7b, 0xcb, 0xa5, 0x03, 0xdc, + 0x91, 0xed, 0x9e, 0x90, 0xb3, 0x08, 0xcd, 0xa5, 0xcc, 0xcc, 0xc9, 0xd1, 0x4e, 0xa6, + 0xd0, 0x3b, 0x3d, 0xec, 0xa1, 0x57, 0xd5, 0x30, 0xde, 0x63, 0x1e, 0x1e, 0x45, 0x8f, + 0x6a, 0x60, 0x8e, 0x1f, 0x9d, 0x57, 0x9b, 0x6e, 0xe6, 0x00, 0x5c, 0xd0, 0xa8, 0xc3, + 0xe2, 0xdf, 0x89, 0x46, 0x8a, 0xcf, 0xb4, 0x36, 0xcb, 0x59, 0x84, 0x56, 0xf0, 0x38, + 0x95, 0x5d, 0xc6, 0xb4, 0x07, 0xec, 0x33, 0x00, 0xa5, 0xcf, 0xcd, 0xc8, 0x45, 0x47, + 0xe3, 0xef, 0xe9, 0xfc, 0xa1, 0x7e, 0xd2, 0xc2, 0x74, 0xf0, 0x03, 0x0b, 0x63, 0xcc, + 0x42, 0xe2, 0x38, 0x94, 0xa5, 0xf2, 0x53, 0x66, 0xcb, 0xc3, 0xbf, 0xcb, 0x77, 0x2d, + 0x04, 0x17, 0xf6, 0x24, 0x4b, 0x2f, 0xd8, 0x17, 0xc4, 0xc6, 0x79, 0x06, 0xc3, 0x38, + 0x4d, 0x69, 0xd7, 0x93, 0xef, 0xca, 0x6e, 0x5d, 0x6a, 0xf2, 0x5e, 0x4e, 0xbc, 0x0f, + 0x53, 0x56, 0xeb, 0x74, 0x28, 0x85, 0x19, 0xe8, 0xf4, 0x49, 0x38, 0xeb, 0xf9, 0xb2, + 0x5b, 0xe5, 0x85, 0xe1, 0x35, 0x1f, 0x62, 0x59, 0x6c, 0x31, 0x79, 0xca, 0xe4, 0x5e, + 0x75, 0x49, 0xd7, 0xfb, 0xb5, 0x91, 0x3b, 0xe9, 0xc3, 0xba, 0xa5, 0x7c, 0xab, 0x7c, + 0xd4, 0xb5, 0x67, 0x12, 0x8d, 0x1b, 0xa5, 0x20, 0x31, 0xd7, 0xd5, 0xa5, 0xbd, 0x69, + 0xde, 0x61, 0x4a, 0xbb, 0x8c, 0xa3, 0x8a, 0x94, 0x51, 0xcd, 0x1b, 0xad, 0xd9, 0x71, + 0xb3, 0xf1, 0xb0, 0xb5, 0x0c, 0x7f, 0x21, 0xbf, 0xc4, 0x23, 0x04, 0xa4, 0xa5, 0x3e, + 0x0d, 0x55, 0x92, 0x0d, 0xa0, 0x53, 0x27, 0x14, 0x79, 0x13, 0x45, 0xfb, 0x07, 0x4c, + 0x66, 0xc4, 0xb7, 0xc9, 0x89, 0x28, 0x30, 0xf9, 0x62, 0x09, 0xb8, 0x1c, 0x26, 0xd1, + 0x74, 0xf8, 0xa9, 0x33, 0xc3, 0x77, 0x9d, 0x97, 0x88, 0x55, 0x3f, 0x6e, 0xeb, 0x21, + 0xf7, 0xdb, 0x57, 0x78, 0xf4, 0xf8, 0x17, 0x4c, 0xb4, 0x6f, 0x71, 0xfd, 0xdc, 0x4b, + 0xe4, 0xd8, 0x70, 0x3e, 0xbf, 0xbc, 0xd2, 0xa7, 0x72, 0x89, 0xee, 0xfa, 0x72, 0x76, + 0x56, 0x74, 0xdb, 0xf0, 0x43, 0xd4, 0x25, 0x8c, 0xcc, 0x4a, 0x2f, 0x16, 0x5c, 0x02, + 0xdc, 0xdb, 0x57, 0x2a, 0x70, 0x9d, 0x58, 0x45, 0x83, 0xe9, 0xde, 0x07, 0x8f, 0x1b, + 0x6c, 0x0c, 0x67, 0xf2, 0x8f, 0x17, 0xae, 0x52, 0x30, 0x19, 0x83, 0xf7, 0x9c, 0x28, + 0x83, 0x95, 0xa3, 0x99, 0x63, 0x65, 0xa2, 0x0c, 0x22, 0x9e, + ], + ock: [ + 0xb9, 0x64, 0x28, 0x18, 0x81, 0x8d, 0x69, 0x17, 0x6d, 0x6c, 0xe6, 0x08, 0x88, 0x7d, + 0x75, 0x70, 0x58, 0xc7, 0x35, 0x42, 0x74, 0xac, 0xa2, 0xb8, 0x7b, 0x50, 0xf7, 0xa6, + 0x38, 0x52, 0x51, 0x1b, + ], + op: [ + 0x7a, 0xfc, 0xa0, 0x5d, 0x04, 0x2c, 0x84, 0x3e, 0xec, 0xdc, 0x37, 0x24, 0x10, 0x52, + 0xc4, 0x6f, 0x93, 0xd4, 0xaf, 0xd5, 0xc9, 0xb0, 0x4d, 0x2b, 0x26, 0x4e, 0x81, 0x0f, + 0x25, 0xc8, 0xd6, 0xae, 0xcb, 0xfc, 0x51, 0x10, 0xff, 0x2f, 0xe9, 0xc5, 0xd5, 0x9e, + 0xef, 0x08, 0xbd, 0xf6, 0xf8, 0x57, 0xe7, 0x1a, 0xab, 0x45, 0x0e, 0x6c, 0xd6, 0x13, + 0xf5, 0x3b, 0x57, 0xc3, 0x45, 0xa9, 0x87, 0x2f, + ], + c_out: [ + 0xa2, 0xd6, 0x5e, 0x96, 0x7e, 0x98, 0x89, 0x0e, 0x9c, 0x42, 0xf9, 0xb3, 0x4b, 0xf8, + 0x45, 0xfb, 0x8e, 0xaa, 0xf9, 0x20, 0x45, 0x0b, 0x29, 0xec, 0x06, 0x16, 0xb3, 0xf0, + 0x82, 0xea, 0x90, 0x8c, 0x66, 0x87, 0xf4, 0xf9, 0x74, 0x1a, 0xe8, 0xab, 0x81, 0x30, + 0x15, 0x35, 0xfd, 0x10, 0x30, 0x35, 0x7a, 0x78, 0xb2, 0x07, 0xf1, 0xc4, 0x42, 0x77, + 0xf5, 0x03, 0xdb, 0x42, 0xa2, 0xc4, 0xdd, 0x20, 0x25, 0x33, 0x2f, 0x49, 0x5e, 0x88, + 0x31, 0x1b, 0x4c, 0x2f, 0x66, 0xb6, 0x07, 0x29, 0x04, 0x89, + ], + }, + TestVector { + incoming_viewing_key: [ + 0x8c, 0x45, 0x43, 0xe1, 0x1f, 0x9f, 0x30, 0x7e, 0xc9, 0x04, 0x31, 0x61, 0x29, 0x46, + 0xfb, 0x01, 0x81, 0xb3, 0x6e, 0x1b, 0x52, 0xdb, 0x43, 0x1e, 0x6d, 0xf9, 0x38, 0x8c, + 0xac, 0xd3, 0x08, 0xe8, 0x99, 0xd9, 0x3f, 0x70, 0xad, 0x2a, 0xea, 0xec, 0x99, 0x5e, + 0xcc, 0xe1, 0x80, 0x1c, 0x61, 0x56, 0xe2, 0x3e, 0xc4, 0x1b, 0x1a, 0xe1, 0xcd, 0x2f, + 0xd6, 0xe3, 0x9b, 0x69, 0x98, 0x2f, 0x46, 0x33, + ], + ovk: [ + 0x01, 0x76, 0xae, 0x33, 0x93, 0x25, 0xd5, 0xa5, 0x88, 0xda, 0x57, 0x96, 0xfa, 0xae, + 0x5b, 0xab, 0x7c, 0x82, 0x97, 0x7c, 0x0f, 0xf7, 0x97, 0x09, 0x3e, 0x2c, 0x1f, 0x3a, + 0xe8, 0x55, 0xf6, 0x5a, + ], + default_d: [ + 0x4e, 0x42, 0x6d, 0xf1, 0xad, 0x32, 0x48, 0x94, 0xbc, 0xa2, 0xc1, + ], + default_pk_d: [ + 0x84, 0xda, 0x49, 0x6b, 0x16, 0x0a, 0x81, 0x72, 0xc4, 0x8d, 0x76, 0xb4, 0xfb, 0x08, + 0xbc, 0xab, 0xf4, 0x0f, 0xf1, 0xe4, 0x2c, 0x48, 0x66, 0x77, 0x57, 0x4f, 0x9e, 0xf8, + 0x36, 0x34, 0xb0, 0x23, + ], + v: 3775288302605163507, + rseed: [ + 0x49, 0x56, 0xbb, 0xb1, 0x95, 0xa4, 0xfa, 0x66, 0xdc, 0x9c, 0xd5, 0x42, 0xc7, 0x6b, + 0x91, 0x50, 0xc8, 0x4b, 0xf8, 0x90, 0x78, 0x99, 0x42, 0xf5, 0x5c, 0x20, 0x0b, 0x77, + 0x3e, 0xcd, 0xd7, 0x99, + ], + asset: [ + 0xa6, 0x33, 0x05, 0x44, 0xe5, 0x46, 0x39, 0xb5, 0x41, 0x87, 0x01, 0xff, 0x4c, 0xc4, + 0x5a, 0x31, 0xf6, 0x2e, 0xdd, 0x84, 0x3d, 0xbb, 0xdc, 0x5a, 0xa7, 0x27, 0xab, 0x79, + 0xb4, 0x42, 0x68, 0x3c, + ], + memo: [ + 0xff, 0x2c, 0xff, 0x3e, 0xca, 0x24, 0xde, 0x3e, 0x09, 0x84, 0xe1, 0x0e, 0x68, 0xae, + 0x38, 0x75, 0x34, 0xb9, 0x6c, 0xde, 0x37, 0x92, 0xf1, 0x35, 0xbf, 0x5f, 0x68, 0x78, + 0x7d, 0x37, 0x0c, 0xa8, 0xc4, 0xc4, 0x07, 0x4d, 0xc5, 0xd6, 0x01, 0xae, 0x90, 0x49, + 0x54, 0x37, 0xc3, 0xc2, 0xd4, 0x8a, 0x3d, 0x96, 0x66, 0x83, 0xac, 0x05, 0x16, 0x0b, + 0x7a, 0x84, 0xea, 0xa7, 0xaa, 0xb7, 0x40, 0x09, 0xe5, 0x7a, 0x85, 0xf7, 0xbf, 0x68, + 0xa2, 0xe4, 0x82, 0x00, 0x0f, 0x82, 0x9c, 0x54, 0x50, 0x73, 0xa1, 0x5d, 0x5c, 0xd0, + 0xfc, 0xc5, 0x74, 0x39, 0xa4, 0x35, 0x0e, 0xaf, 0x09, 0x8d, 0xfb, 0x82, 0xa0, 0x85, + 0xea, 0x8a, 0x4a, 0xf6, 0xfa, 0x83, 0x81, 0xf0, 0x65, 0x88, 0x19, 0xea, 0xb4, 0x83, + 0xf6, 0x5b, 0x32, 0x5d, 0x5a, 0xed, 0xa1, 0x52, 0x32, 0xcf, 0xad, 0xec, 0x75, 0xab, + 0x18, 0x66, 0xe4, 0xc0, 0x15, 0x5a, 0x9c, 0x74, 0xa7, 0xa5, 0x7c, 0xcf, 0x34, 0xc4, + 0x83, 0xac, 0x7d, 0xa1, 0x58, 0x8a, 0x1b, 0x6b, 0x99, 0x41, 0xf1, 0x10, 0x40, 0xf9, + 0x4c, 0xf7, 0x8f, 0xad, 0x89, 0xbf, 0x11, 0xfe, 0xd6, 0x9a, 0xa0, 0xd8, 0x31, 0x05, + 0xad, 0xac, 0xdd, 0x4e, 0x5f, 0x04, 0xa6, 0x24, 0x24, 0x02, 0x3c, 0x9b, 0x9e, 0x33, + 0xc4, 0xfb, 0x7f, 0x12, 0xbd, 0xf2, 0x1f, 0x07, 0xf2, 0x65, 0xc5, 0x37, 0xd5, 0x1c, + 0x65, 0x51, 0xf4, 0x61, 0x7b, 0x91, 0x5d, 0x21, 0x99, 0x18, 0x39, 0xc3, 0xd0, 0xd3, + 0x63, 0x93, 0xd6, 0x46, 0xe0, 0xa8, 0xa4, 0x15, 0x09, 0x21, 0x7d, 0x0e, 0x7d, 0x2c, + 0xa1, 0xa0, 0xa0, 0xd6, 0x77, 0xa3, 0xea, 0xca, 0x23, 0xed, 0xeb, 0x07, 0xb7, 0x4e, + 0x65, 0x2a, 0x0b, 0xc5, 0x0c, 0x6c, 0x08, 0x3a, 0x55, 0xd6, 0xc7, 0x30, 0x6e, 0x74, + 0x08, 0x6f, 0x47, 0x68, 0x93, 0x3a, 0xa2, 0x48, 0x73, 0x68, 0x18, 0x67, 0xa7, 0x89, + 0x3d, 0x77, 0xcb, 0x7f, 0x29, 0xb8, 0xc8, 0x47, 0xc5, 0x83, 0xf2, 0xd0, 0x71, 0xa6, + 0x86, 0x61, 0x6e, 0x20, 0x67, 0x19, 0xf7, 0x61, 0xae, 0x39, 0xc1, 0x10, 0x44, 0x2e, + 0x06, 0x16, 0x3d, 0x2b, 0x84, 0x59, 0x03, 0x60, 0x69, 0x5d, 0x4e, 0x19, 0x84, 0x9e, + 0x63, 0x4f, 0x24, 0xd9, 0xad, 0x39, 0x6c, 0x19, 0xff, 0x83, 0xce, 0x74, 0xf4, 0x6e, + 0x64, 0x5f, 0x93, 0x2e, 0x14, 0x1a, 0x41, 0x19, 0x59, 0x36, 0xc8, 0x5d, 0x51, 0x44, + 0x14, 0xf1, 0x12, 0xe6, 0x0b, 0x1a, 0x25, 0x37, 0xc3, 0x8d, 0x6d, 0xc6, 0xc4, 0x63, + 0x83, 0x05, 0xc9, 0xbd, 0x6c, 0x62, 0xe3, 0x66, 0xbc, 0x63, 0x12, 0x3e, 0x3e, 0x6d, + 0xd3, 0x6e, 0xed, 0xd3, 0x13, 0x6f, 0xce, 0x8d, 0xee, 0xca, 0x2a, 0xa0, 0x9a, 0x32, + 0x98, 0xa3, 0x9d, 0x83, 0x85, 0x9e, 0xfc, 0x9b, 0x2b, 0x69, 0xcf, 0x9a, 0x7d, 0xee, + 0x08, 0xa9, 0x8e, 0x4b, 0xe5, 0x58, 0xac, 0x79, 0x12, 0xfd, 0xcb, 0x42, 0x20, 0x90, + 0x75, 0x42, 0x02, 0x60, 0xf7, 0xca, 0xd0, 0xf2, 0xc0, 0x1f, 0x2a, 0xfe, 0x33, 0x07, + 0x3f, 0x26, 0x24, 0x9d, 0x94, 0x4f, 0x7a, 0x50, 0xdd, 0x84, 0x83, 0x9b, 0xc3, 0xea, + 0x7f, 0xde, 0xe4, 0xed, 0x71, 0x44, 0x9c, 0xf0, 0x75, 0x33, 0xd2, 0x6e, 0x1e, 0x27, + 0xa3, 0xef, 0xb0, 0x32, 0xc3, 0xa3, 0xb3, 0x4b, 0xd3, 0x09, 0x26, 0x22, 0xd2, 0x06, + 0x2a, 0xe5, 0x36, 0xef, 0x51, 0x49, 0xc4, 0x9b, 0x5b, 0xc9, 0x47, 0x5e, 0xaf, 0xab, + 0x6e, 0x67, 0x57, 0x61, 0x00, 0x8b, 0x0d, 0xad, 0xde, 0xec, 0xaa, 0x60, 0x44, 0x70, + 0xbb, 0xe0, 0xfa, 0xda, 0x25, 0x5d, 0x29, 0x0e, 0x92, 0xb1, 0x90, 0xc2, 0xc2, 0xd8, + 0xc2, 0xde, 0xe5, 0x45, 0x5d, 0x1f, 0xa9, 0xa9, + ], + cv_net: [ + 0xde, 0x2b, 0xfc, 0x89, 0x5b, 0xa8, 0xb5, 0x43, 0x03, 0x93, 0x43, 0x4e, 0x20, 0x92, + 0xce, 0xe7, 0x81, 0xe4, 0x00, 0x28, 0x5c, 0xc6, 0x66, 0xbc, 0x6c, 0x41, 0x89, 0xdb, + 0x2d, 0xda, 0x71, 0x92, + ], + rho: [ + 0xea, 0x1d, 0x9d, 0x26, 0x5e, 0xf4, 0x8a, 0x18, 0x97, 0x89, 0x70, 0xb1, 0x76, 0x7b, + 0xe0, 0xe8, 0x14, 0x11, 0x94, 0x7e, 0x9e, 0x69, 0xb7, 0x19, 0xfa, 0xb7, 0x41, 0x72, + 0x1d, 0x40, 0x9b, 0x33, + ], + cmx: [ + 0xf5, 0x3a, 0x98, 0x99, 0xcd, 0x37, 0xf6, 0x2c, 0x94, 0x85, 0x84, 0xb9, 0x67, 0x7c, + 0x78, 0x4c, 0x73, 0x48, 0x43, 0x40, 0x1a, 0x3a, 0x61, 0x0a, 0xcb, 0x28, 0x2f, 0x04, + 0x30, 0xfd, 0x18, 0x3c, + ], + esk: [ + 0x1b, 0x52, 0x63, 0x2d, 0x2a, 0x8d, 0x58, 0xd1, 0x63, 0x57, 0xa9, 0x19, 0xa2, 0x06, + 0x31, 0xe2, 0x91, 0x14, 0xc8, 0x60, 0x07, 0xa2, 0xb1, 0x8b, 0x25, 0xec, 0xff, 0x47, + 0x72, 0x16, 0x8c, 0x05, + ], + ephemeral_key: [ + 0xc1, 0xce, 0x25, 0xfb, 0x89, 0xe5, 0xca, 0x89, 0x97, 0xf9, 0xb4, 0xbb, 0x0e, 0x1e, + 0xfb, 0xcc, 0x1a, 0x8c, 0xbf, 0x44, 0xec, 0xfd, 0x33, 0x2c, 0x6c, 0x5c, 0x17, 0x3b, + 0xb1, 0x1f, 0xb5, 0x87, + ], + shared_secret: [ + 0x2e, 0xe5, 0x69, 0xce, 0xb3, 0xfd, 0xb8, 0x67, 0xa5, 0xd8, 0x4c, 0x92, 0x68, 0x24, + 0xef, 0x54, 0x9f, 0x2d, 0xd2, 0x8f, 0x8b, 0x04, 0x8d, 0x67, 0xd0, 0x28, 0x81, 0x7d, + 0xbf, 0xf5, 0xd2, 0xb1, + ], + k_enc: [ + 0x41, 0x4d, 0x80, 0x67, 0xc9, 0xfe, 0xbd, 0x5e, 0xbc, 0xd9, 0xae, 0x8c, 0x05, 0x99, + 0x4e, 0x3b, 0x06, 0x85, 0xc8, 0x86, 0x6f, 0x88, 0x95, 0x94, 0xc3, 0x74, 0xb3, 0x75, + 0xac, 0x2c, 0x6d, 0x24, + ], + p_enc: [ + 0x03, 0x4e, 0x42, 0x6d, 0xf1, 0xad, 0x32, 0x48, 0x94, 0xbc, 0xa2, 0xc1, 0xf3, 0xdb, + 0x77, 0x79, 0xb5, 0x84, 0x64, 0x34, 0x49, 0x56, 0xbb, 0xb1, 0x95, 0xa4, 0xfa, 0x66, + 0xdc, 0x9c, 0xd5, 0x42, 0xc7, 0x6b, 0x91, 0x50, 0xc8, 0x4b, 0xf8, 0x90, 0x78, 0x99, + 0x42, 0xf5, 0x5c, 0x20, 0x0b, 0x77, 0x3e, 0xcd, 0xd7, 0x99, 0xa6, 0x33, 0x05, 0x44, + 0xe5, 0x46, 0x39, 0xb5, 0x41, 0x87, 0x01, 0xff, 0x4c, 0xc4, 0x5a, 0x31, 0xf6, 0x2e, + 0xdd, 0x84, 0x3d, 0xbb, 0xdc, 0x5a, 0xa7, 0x27, 0xab, 0x79, 0xb4, 0x42, 0x68, 0x3c, + 0xff, 0x2c, 0xff, 0x3e, 0xca, 0x24, 0xde, 0x3e, 0x09, 0x84, 0xe1, 0x0e, 0x68, 0xae, + 0x38, 0x75, 0x34, 0xb9, 0x6c, 0xde, 0x37, 0x92, 0xf1, 0x35, 0xbf, 0x5f, 0x68, 0x78, + 0x7d, 0x37, 0x0c, 0xa8, 0xc4, 0xc4, 0x07, 0x4d, 0xc5, 0xd6, 0x01, 0xae, 0x90, 0x49, + 0x54, 0x37, 0xc3, 0xc2, 0xd4, 0x8a, 0x3d, 0x96, 0x66, 0x83, 0xac, 0x05, 0x16, 0x0b, + 0x7a, 0x84, 0xea, 0xa7, 0xaa, 0xb7, 0x40, 0x09, 0xe5, 0x7a, 0x85, 0xf7, 0xbf, 0x68, + 0xa2, 0xe4, 0x82, 0x00, 0x0f, 0x82, 0x9c, 0x54, 0x50, 0x73, 0xa1, 0x5d, 0x5c, 0xd0, + 0xfc, 0xc5, 0x74, 0x39, 0xa4, 0x35, 0x0e, 0xaf, 0x09, 0x8d, 0xfb, 0x82, 0xa0, 0x85, + 0xea, 0x8a, 0x4a, 0xf6, 0xfa, 0x83, 0x81, 0xf0, 0x65, 0x88, 0x19, 0xea, 0xb4, 0x83, + 0xf6, 0x5b, 0x32, 0x5d, 0x5a, 0xed, 0xa1, 0x52, 0x32, 0xcf, 0xad, 0xec, 0x75, 0xab, + 0x18, 0x66, 0xe4, 0xc0, 0x15, 0x5a, 0x9c, 0x74, 0xa7, 0xa5, 0x7c, 0xcf, 0x34, 0xc4, + 0x83, 0xac, 0x7d, 0xa1, 0x58, 0x8a, 0x1b, 0x6b, 0x99, 0x41, 0xf1, 0x10, 0x40, 0xf9, + 0x4c, 0xf7, 0x8f, 0xad, 0x89, 0xbf, 0x11, 0xfe, 0xd6, 0x9a, 0xa0, 0xd8, 0x31, 0x05, + 0xad, 0xac, 0xdd, 0x4e, 0x5f, 0x04, 0xa6, 0x24, 0x24, 0x02, 0x3c, 0x9b, 0x9e, 0x33, + 0xc4, 0xfb, 0x7f, 0x12, 0xbd, 0xf2, 0x1f, 0x07, 0xf2, 0x65, 0xc5, 0x37, 0xd5, 0x1c, + 0x65, 0x51, 0xf4, 0x61, 0x7b, 0x91, 0x5d, 0x21, 0x99, 0x18, 0x39, 0xc3, 0xd0, 0xd3, + 0x63, 0x93, 0xd6, 0x46, 0xe0, 0xa8, 0xa4, 0x15, 0x09, 0x21, 0x7d, 0x0e, 0x7d, 0x2c, + 0xa1, 0xa0, 0xa0, 0xd6, 0x77, 0xa3, 0xea, 0xca, 0x23, 0xed, 0xeb, 0x07, 0xb7, 0x4e, + 0x65, 0x2a, 0x0b, 0xc5, 0x0c, 0x6c, 0x08, 0x3a, 0x55, 0xd6, 0xc7, 0x30, 0x6e, 0x74, + 0x08, 0x6f, 0x47, 0x68, 0x93, 0x3a, 0xa2, 0x48, 0x73, 0x68, 0x18, 0x67, 0xa7, 0x89, + 0x3d, 0x77, 0xcb, 0x7f, 0x29, 0xb8, 0xc8, 0x47, 0xc5, 0x83, 0xf2, 0xd0, 0x71, 0xa6, + 0x86, 0x61, 0x6e, 0x20, 0x67, 0x19, 0xf7, 0x61, 0xae, 0x39, 0xc1, 0x10, 0x44, 0x2e, + 0x06, 0x16, 0x3d, 0x2b, 0x84, 0x59, 0x03, 0x60, 0x69, 0x5d, 0x4e, 0x19, 0x84, 0x9e, + 0x63, 0x4f, 0x24, 0xd9, 0xad, 0x39, 0x6c, 0x19, 0xff, 0x83, 0xce, 0x74, 0xf4, 0x6e, + 0x64, 0x5f, 0x93, 0x2e, 0x14, 0x1a, 0x41, 0x19, 0x59, 0x36, 0xc8, 0x5d, 0x51, 0x44, + 0x14, 0xf1, 0x12, 0xe6, 0x0b, 0x1a, 0x25, 0x37, 0xc3, 0x8d, 0x6d, 0xc6, 0xc4, 0x63, + 0x83, 0x05, 0xc9, 0xbd, 0x6c, 0x62, 0xe3, 0x66, 0xbc, 0x63, 0x12, 0x3e, 0x3e, 0x6d, + 0xd3, 0x6e, 0xed, 0xd3, 0x13, 0x6f, 0xce, 0x8d, 0xee, 0xca, 0x2a, 0xa0, 0x9a, 0x32, + 0x98, 0xa3, 0x9d, 0x83, 0x85, 0x9e, 0xfc, 0x9b, 0x2b, 0x69, 0xcf, 0x9a, 0x7d, 0xee, + 0x08, 0xa9, 0x8e, 0x4b, 0xe5, 0x58, 0xac, 0x79, 0x12, 0xfd, 0xcb, 0x42, 0x20, 0x90, + 0x75, 0x42, 0x02, 0x60, 0xf7, 0xca, 0xd0, 0xf2, 0xc0, 0x1f, 0x2a, 0xfe, 0x33, 0x07, + 0x3f, 0x26, 0x24, 0x9d, 0x94, 0x4f, 0x7a, 0x50, 0xdd, 0x84, 0x83, 0x9b, 0xc3, 0xea, + 0x7f, 0xde, 0xe4, 0xed, 0x71, 0x44, 0x9c, 0xf0, 0x75, 0x33, 0xd2, 0x6e, 0x1e, 0x27, + 0xa3, 0xef, 0xb0, 0x32, 0xc3, 0xa3, 0xb3, 0x4b, 0xd3, 0x09, 0x26, 0x22, 0xd2, 0x06, + 0x2a, 0xe5, 0x36, 0xef, 0x51, 0x49, 0xc4, 0x9b, 0x5b, 0xc9, 0x47, 0x5e, 0xaf, 0xab, + 0x6e, 0x67, 0x57, 0x61, 0x00, 0x8b, 0x0d, 0xad, 0xde, 0xec, 0xaa, 0x60, 0x44, 0x70, + 0xbb, 0xe0, 0xfa, 0xda, 0x25, 0x5d, 0x29, 0x0e, 0x92, 0xb1, 0x90, 0xc2, 0xc2, 0xd8, + 0xc2, 0xde, 0xe5, 0x45, 0x5d, 0x1f, 0xa9, 0xa9, + ], + c_enc: [ + 0xbc, 0x8a, 0x16, 0xfd, 0x57, 0xbc, 0x03, 0x60, 0x59, 0xe5, 0x4d, 0xc2, 0xbc, 0xfa, + 0xad, 0x9c, 0xc1, 0xfa, 0xe8, 0xcb, 0x2b, 0xe2, 0xa0, 0xc8, 0x5e, 0x81, 0x6c, 0x67, + 0xfd, 0xcd, 0x0b, 0x93, 0xe6, 0xa1, 0xed, 0xc8, 0x3b, 0xfa, 0xc4, 0x1e, 0xb4, 0x19, + 0x1c, 0x56, 0x4b, 0xac, 0x58, 0x01, 0x62, 0x92, 0x2d, 0x88, 0x25, 0x30, 0x28, 0xeb, + 0x88, 0xed, 0x46, 0xbf, 0x24, 0x2d, 0x82, 0x28, 0x6c, 0xb0, 0xa5, 0x66, 0xce, 0x01, + 0x18, 0x09, 0x4c, 0x90, 0x8f, 0xc2, 0x68, 0xb3, 0x2b, 0xcb, 0xdc, 0x4c, 0x22, 0x82, + 0xc5, 0x24, 0x2a, 0x65, 0x15, 0x48, 0x8b, 0x83, 0x3d, 0x29, 0x8e, 0x49, 0xda, 0x33, + 0x3a, 0xdd, 0x96, 0xc9, 0x9b, 0x98, 0xac, 0x06, 0x7f, 0x21, 0x41, 0x28, 0x9a, 0xcd, + 0x89, 0x49, 0x64, 0xfc, 0xf8, 0x94, 0xc9, 0x26, 0xf1, 0x81, 0xb1, 0x19, 0x85, 0x68, + 0xb1, 0xdd, 0x6f, 0x5e, 0xd1, 0x22, 0xdc, 0x70, 0x44, 0xad, 0x96, 0x76, 0xa7, 0xc5, + 0xae, 0x8e, 0xa9, 0x0f, 0x64, 0xbc, 0x59, 0x09, 0x36, 0xe0, 0xdf, 0x53, 0x1c, 0x1b, + 0x94, 0xb7, 0x35, 0xcd, 0x7b, 0x18, 0x73, 0xc8, 0x51, 0x6f, 0xea, 0x83, 0x64, 0x91, + 0x40, 0xbc, 0xbb, 0x9b, 0x42, 0xea, 0x6c, 0xb7, 0xaf, 0x67, 0xdc, 0x2d, 0xdb, 0xb4, + 0x7a, 0xb2, 0x25, 0xe7, 0x98, 0x29, 0xcd, 0xaf, 0x77, 0x04, 0xfb, 0x56, 0x5b, 0x43, + 0x91, 0x76, 0xf3, 0x35, 0xe4, 0x2b, 0x64, 0xc1, 0x6d, 0xdf, 0xe0, 0x88, 0x45, 0x38, + 0xbf, 0x43, 0x33, 0xe3, 0x2c, 0xa1, 0xe6, 0x27, 0x41, 0xc3, 0xe7, 0x4c, 0x8f, 0xaa, + 0xde, 0x0d, 0x89, 0xfa, 0x10, 0x30, 0xcd, 0x8e, 0xfd, 0x20, 0x22, 0x3e, 0x41, 0xc3, + 0xfc, 0xca, 0xaa, 0xe7, 0x76, 0xe6, 0x8e, 0xe8, 0x40, 0x56, 0x6f, 0x4d, 0x13, 0xc1, + 0xc9, 0xd5, 0xcb, 0xbe, 0xcf, 0xa7, 0x49, 0x9d, 0x43, 0x12, 0x7c, 0xe8, 0xfd, 0x83, + 0xdb, 0x6e, 0x89, 0x67, 0x90, 0x32, 0x25, 0x24, 0x87, 0x21, 0x40, 0x0d, 0x5e, 0x3e, + 0xc0, 0xc1, 0x8e, 0x10, 0xf5, 0xe6, 0x6e, 0x10, 0x17, 0x0c, 0xb3, 0x74, 0x48, 0x22, + 0x4a, 0xde, 0x39, 0x9f, 0x1d, 0x74, 0xa2, 0x16, 0x7d, 0x9f, 0xdb, 0xfe, 0x36, 0xe1, + 0x28, 0xe4, 0x8c, 0x01, 0x62, 0x61, 0x16, 0xc1, 0xa2, 0xdf, 0x3c, 0xb0, 0x23, 0xd8, + 0x0a, 0xed, 0x9b, 0xfc, 0x02, 0x71, 0xb8, 0x1f, 0xf9, 0x79, 0x81, 0x01, 0x6f, 0xff, + 0x19, 0x61, 0x08, 0x88, 0x8b, 0xcb, 0xca, 0x84, 0x5b, 0x5d, 0x97, 0x1b, 0xd5, 0x4f, + 0x49, 0x7d, 0x3f, 0x3a, 0x09, 0x29, 0x9e, 0x56, 0x50, 0xd3, 0x26, 0xd8, 0x9b, 0x9a, + 0x5e, 0xff, 0x3e, 0xbd, 0x27, 0x39, 0x34, 0xc4, 0x9f, 0x81, 0x46, 0x7e, 0xb8, 0x4f, + 0x56, 0x98, 0x90, 0xcf, 0x89, 0x05, 0xb7, 0x4c, 0xd3, 0xed, 0xa6, 0x3c, 0x53, 0x88, + 0xd5, 0x51, 0x5e, 0x3f, 0xd8, 0x1c, 0x70, 0xc1, 0x5e, 0x2a, 0x98, 0x2d, 0x59, 0x0e, + 0x87, 0xb8, 0x64, 0x45, 0x4b, 0xcd, 0xf5, 0xf8, 0x4d, 0x9f, 0x11, 0xcb, 0x9c, 0xf2, + 0xb5, 0xde, 0x3c, 0x5e, 0x0e, 0x2a, 0x6c, 0x48, 0x16, 0x61, 0x64, 0x96, 0x6f, 0xb9, + 0x0d, 0xac, 0xf8, 0x67, 0x4f, 0x9f, 0x1a, 0x34, 0xd2, 0xcd, 0xc7, 0xc9, 0x48, 0xab, + 0x99, 0xc3, 0x58, 0xa1, 0x95, 0x47, 0x0a, 0xdd, 0x06, 0x5e, 0xaf, 0x79, 0x24, 0xfa, + 0xed, 0x63, 0x27, 0xa6, 0x10, 0xf5, 0x2e, 0xd5, 0xd3, 0xa8, 0x7e, 0x11, 0xb5, 0x97, + 0x4f, 0xa0, 0x60, 0x45, 0xa4, 0x08, 0x95, 0xcd, 0xad, 0x60, 0x1c, 0xae, 0x01, 0xed, + 0xda, 0x17, 0x52, 0x81, 0x62, 0xd7, 0x21, 0x24, 0xf2, 0x05, 0x6b, 0x9a, 0xb8, 0xc0, + 0xc0, 0xf5, 0xc6, 0xdd, 0xaa, 0x0f, 0x5e, 0x33, 0xfb, 0x04, 0x23, 0x0b, 0x61, 0x1b, + 0xff, 0xd8, 0xbd, 0xdc, 0x63, 0x4c, 0x79, 0x60, 0xa3, 0xd4, 0xe6, 0x8f, 0x21, 0xe7, + 0x83, 0x04, 0xe4, 0xc4, 0xd2, 0xdc, 0xd6, 0xa1, 0x9c, 0xfc, 0x04, 0x57, 0x97, 0x09, + 0xf0, 0x33, 0xf1, 0x95, 0x78, 0xae, 0x7f, 0x0b, 0xc6, 0x46, 0x32, 0xa6, 0xd7, 0xda, + 0x40, 0xdc, 0x0c, 0x38, 0x1d, 0xd4, 0x49, 0xe1, 0xa0, 0xb0, 0xe7, 0xf8, 0xc5, 0xfe, + 0x88, 0xaa, 0x93, 0x4e, 0x16, 0xc8, 0xf1, 0xdb, 0xef, 0x72, 0x88, 0x34, 0xcf, 0x25, + 0x30, 0xe3, 0x3f, 0xb9, 0x27, 0xe9, 0x96, 0xce, 0x48, 0x89, 0xf9, 0xf6, 0xf4, 0x42, + 0x1c, 0x60, 0x78, 0xb0, 0x8d, 0x72, 0x2d, 0xc4, 0x4a, 0xb7, + ], + ock: [ + 0x67, 0x0e, 0xa5, 0x94, 0x8e, 0x85, 0x29, 0xa9, 0x52, 0xb2, 0x0a, 0xcc, 0x17, 0x70, + 0xe2, 0xa9, 0xc0, 0x67, 0xb0, 0x7b, 0x89, 0xfd, 0xaa, 0xf7, 0x84, 0xdf, 0x83, 0xfd, + 0x53, 0x7b, 0xdd, 0x86, + ], + op: [ + 0x84, 0xda, 0x49, 0x6b, 0x16, 0x0a, 0x81, 0x72, 0xc4, 0x8d, 0x76, 0xb4, 0xfb, 0x08, + 0xbc, 0xab, 0xf4, 0x0f, 0xf1, 0xe4, 0x2c, 0x48, 0x66, 0x77, 0x57, 0x4f, 0x9e, 0xf8, + 0x36, 0x34, 0xb0, 0x23, 0x1b, 0x52, 0x63, 0x2d, 0x2a, 0x8d, 0x58, 0xd1, 0x63, 0x57, + 0xa9, 0x19, 0xa2, 0x06, 0x31, 0xe2, 0x91, 0x14, 0xc8, 0x60, 0x07, 0xa2, 0xb1, 0x8b, + 0x25, 0xec, 0xff, 0x47, 0x72, 0x16, 0x8c, 0x05, + ], + c_out: [ + 0x20, 0xe0, 0x0c, 0xab, 0xc6, 0xc7, 0x06, 0xfa, 0x38, 0x19, 0x16, 0x78, 0x26, 0x44, + 0x90, 0x28, 0x9e, 0x0e, 0xd3, 0x2b, 0x9c, 0x77, 0x6d, 0xa2, 0xab, 0xe0, 0x21, 0x4f, + 0x89, 0x9b, 0xf9, 0x7b, 0x08, 0x3b, 0xe5, 0x8e, 0xdd, 0xbb, 0x57, 0x97, 0x28, 0x22, + 0xbb, 0x10, 0x8e, 0x2c, 0xad, 0xfc, 0x76, 0xab, 0xe6, 0x13, 0x13, 0x9e, 0x94, 0x1c, + 0x2c, 0xa1, 0x59, 0x21, 0x98, 0x91, 0xb1, 0x52, 0x83, 0xd8, 0x5a, 0x0d, 0xc9, 0x4d, + 0x59, 0xf9, 0x7b, 0x6c, 0x3c, 0x53, 0x6f, 0xcf, 0x93, 0x98, + ], + }, + TestVector { + incoming_viewing_key: [ + 0x47, 0x30, 0x68, 0xbf, 0x68, 0xe5, 0x0b, 0xe3, 0x85, 0x7d, 0xec, 0xb2, 0xef, 0xd5, + 0xde, 0x20, 0xea, 0xc8, 0x1b, 0x37, 0x5b, 0xd0, 0xbb, 0xe8, 0x36, 0x86, 0x6e, 0x99, + 0x36, 0x3b, 0x37, 0x50, 0x9d, 0x53, 0x8f, 0xcc, 0xa9, 0x33, 0x37, 0xad, 0xbc, 0x24, + 0x81, 0xe2, 0x70, 0x26, 0x18, 0x4c, 0x3f, 0x4f, 0x48, 0xcc, 0x5d, 0x5a, 0x0e, 0x4a, + 0x4c, 0xfa, 0x4d, 0x6a, 0x24, 0x7f, 0x2e, 0x39, + ], + ovk: [ + 0x25, 0xb4, 0xc2, 0x6e, 0xb0, 0x3f, 0x71, 0x66, 0x46, 0x61, 0x9a, 0xf0, 0x24, 0x56, + 0xae, 0x69, 0x59, 0x62, 0xfe, 0x5e, 0x93, 0x1a, 0x63, 0xb5, 0xc7, 0x90, 0x52, 0xec, + 0xd3, 0x33, 0xe1, 0x84, + ], + default_d: [ + 0x61, 0x5f, 0x53, 0x89, 0x1a, 0x18, 0xe0, 0x52, 0x17, 0x2d, 0x81, + ], + default_pk_d: [ + 0x04, 0x47, 0x12, 0x42, 0xe1, 0xf4, 0x2b, 0xf0, 0x81, 0xf0, 0x8e, 0x9d, 0x71, 0xfe, + 0x4f, 0x3a, 0x65, 0x91, 0xa7, 0xc0, 0x1e, 0xe2, 0xcf, 0x35, 0x30, 0x2f, 0x38, 0xd3, + 0x34, 0xeb, 0x90, 0x2c, + ], + v: 15119422206032203650, + rseed: [ + 0x45, 0x60, 0x3a, 0x53, 0x46, 0x2c, 0x60, 0xe1, 0xf6, 0xcb, 0x0c, 0x9c, 0xa0, 0x39, + 0x0c, 0x48, 0x82, 0x24, 0xc3, 0x13, 0x26, 0x9f, 0xcd, 0x59, 0xfc, 0xb6, 0x11, 0xfb, + 0x2d, 0x9b, 0x4c, 0x8f, + ], + asset: [ + 0x61, 0x16, 0xcf, 0xec, 0x26, 0x47, 0xcc, 0xaa, 0xe1, 0xc7, 0x4b, 0x41, 0x6f, 0x3e, + 0x6a, 0xe8, 0xf7, 0xcc, 0x60, 0xea, 0xaf, 0x7b, 0x6a, 0x59, 0x0d, 0x51, 0x54, 0x41, + 0x38, 0xe1, 0x73, 0x29, + ], + memo: [ + 0xff, 0xa6, 0x01, 0xbb, 0x1c, 0xb8, 0xd0, 0x7d, 0x79, 0x7b, 0xf5, 0xde, 0x52, 0xbc, + 0xee, 0xb0, 0x23, 0x01, 0xc8, 0x96, 0x2a, 0xc1, 0xfc, 0x04, 0x91, 0xdc, 0x81, 0xaf, + 0xfd, 0x6c, 0x1e, 0xbf, 0x89, 0xa1, 0x3d, 0x6f, 0x29, 0x0e, 0xda, 0x5d, 0x5c, 0xef, + 0x38, 0x22, 0x15, 0xc5, 0xe9, 0x51, 0xd7, 0x13, 0x05, 0xef, 0x33, 0xd9, 0x73, 0x71, + 0x26, 0xd0, 0xe6, 0x62, 0x90, 0x5f, 0x12, 0x50, 0x92, 0x6f, 0x6a, 0x22, 0x99, 0x90, + 0xe3, 0x8f, 0x69, 0xad, 0x9a, 0x91, 0x92, 0xb3, 0x02, 0xf2, 0x6b, 0xdd, 0xa4, 0x65, + 0xd9, 0x0b, 0x94, 0xb1, 0x2c, 0x57, 0xfa, 0x3f, 0xd6, 0x93, 0x00, 0x83, 0xf1, 0x84, + 0x43, 0x8d, 0x8a, 0x88, 0x9d, 0x3f, 0x5e, 0xce, 0xa2, 0xc6, 0xd2, 0x3d, 0x67, 0x36, + 0xf2, 0xa0, 0xf1, 0x8e, 0x26, 0xf4, 0xfa, 0x45, 0xd1, 0xbe, 0x8f, 0x3d, 0xc4, 0xa7, + 0x07, 0x13, 0x7e, 0x95, 0xd2, 0xad, 0x59, 0x4f, 0x6c, 0x03, 0xd2, 0x49, 0x23, 0x06, + 0x7a, 0xe4, 0x7f, 0xd6, 0x42, 0x5e, 0xfb, 0x9c, 0x1d, 0x50, 0x4e, 0x6f, 0xd5, 0x57, + 0x53, 0x40, 0x94, 0x56, 0x01, 0xfe, 0x80, 0x6f, 0x57, 0x56, 0xac, 0xb5, 0x62, 0xf1, + 0x3c, 0x0c, 0xa1, 0xd8, 0x03, 0xa1, 0x95, 0xc2, 0xeb, 0xb2, 0xef, 0x02, 0xac, 0x33, + 0xe6, 0xa8, 0x8d, 0xea, 0x07, 0x5b, 0xa9, 0x96, 0xd3, 0xc3, 0x36, 0x64, 0x8e, 0x86, + 0x94, 0xd3, 0xa1, 0x9d, 0x3d, 0xca, 0x53, 0x1b, 0xeb, 0x50, 0xd4, 0x32, 0x7c, 0x5c, + 0x0c, 0x23, 0xcb, 0x7c, 0xfd, 0xb0, 0x8c, 0xa7, 0xcf, 0x2c, 0xac, 0x6b, 0xc1, 0x39, + 0xd0, 0x74, 0x14, 0x73, 0xd3, 0x76, 0x02, 0x9c, 0xb4, 0xab, 0x6b, 0xf0, 0x54, 0x55, + 0x7c, 0xe2, 0x94, 0xc7, 0x28, 0xa4, 0x68, 0x7d, 0x57, 0xec, 0x89, 0x09, 0xff, 0x51, + 0xa4, 0xd0, 0x2f, 0x9d, 0xcd, 0x11, 0x19, 0x3d, 0x7d, 0x1c, 0x9f, 0xda, 0xe6, 0xa1, + 0x73, 0x96, 0xa1, 0xbf, 0x57, 0xa9, 0x94, 0x93, 0x4f, 0x5e, 0x7a, 0x59, 0xf0, 0x45, + 0xde, 0xbe, 0xaf, 0xf6, 0x2e, 0xf3, 0x26, 0xb9, 0x47, 0xf2, 0xa8, 0xb4, 0x95, 0x55, + 0xe4, 0xd9, 0x9b, 0x3b, 0xf5, 0xc8, 0x1f, 0xf9, 0xfe, 0x31, 0x4e, 0x04, 0x7a, 0xf1, + 0x52, 0x50, 0x8f, 0x57, 0x01, 0x5c, 0xa4, 0x02, 0xc6, 0x7d, 0x92, 0x5c, 0x99, 0xac, + 0xea, 0x3e, 0xe8, 0xcc, 0x4b, 0x00, 0x8c, 0x5c, 0xb4, 0x39, 0x66, 0xe7, 0x14, 0xef, + 0x48, 0x0f, 0xd0, 0x5e, 0x07, 0xc7, 0xb2, 0xdd, 0xa9, 0xaa, 0x39, 0x66, 0x11, 0x3e, + 0xaa, 0x29, 0x3d, 0x3f, 0x62, 0x2b, 0x30, 0x9d, 0x64, 0x80, 0x3c, 0xe1, 0xe6, 0x37, + 0x8b, 0x6a, 0xac, 0x4f, 0xab, 0x52, 0x7c, 0x43, 0xcd, 0x45, 0xed, 0x0a, 0x3c, 0x1a, + 0x4b, 0x9f, 0xb1, 0x8d, 0xcc, 0xcf, 0xcd, 0xb6, 0xac, 0x0c, 0x24, 0x21, 0x63, 0x9c, + 0xda, 0x00, 0x75, 0xa2, 0x0d, 0xc5, 0x11, 0x1b, 0x8d, 0x3d, 0x31, 0x99, 0x49, 0x5b, + 0xd9, 0x13, 0x3d, 0xba, 0xb9, 0x45, 0x41, 0x41, 0x0e, 0x4f, 0xba, 0x92, 0xc7, 0xb6, + 0x06, 0xa5, 0xcb, 0x12, 0x2f, 0x14, 0x0c, 0xf1, 0xa3, 0x59, 0x6f, 0x27, 0x88, 0xf3, + 0xc8, 0xb9, 0x26, 0x60, 0xf1, 0x4c, 0xb6, 0x5a, 0xf5, 0xdd, 0x23, 0xdf, 0xdb, 0xac, + 0x13, 0x71, 0xec, 0xf4, 0xb3, 0x37, 0x12, 0xfe, 0xd2, 0x29, 0x2c, 0x44, 0xf7, 0x08, + 0x34, 0xcf, 0x96, 0xc0, 0x5d, 0x58, 0x82, 0x7e, 0x69, 0xbf, 0xc2, 0xe6, 0x96, 0xfa, + 0x08, 0x74, 0x86, 0x9c, 0x02, 0xf3, 0xdc, 0xa1, 0x1c, 0x3b, 0x90, 0xcb, 0x21, 0x4e, + 0x68, 0xbc, 0x1c, 0xae, 0x03, 0x9d, 0x7a, 0x14, 0x6c, 0xdc, 0x1d, 0x60, 0x9d, 0x7a, + 0x6b, 0x3f, 0xd5, 0xd4, 0x61, 0xb0, 0x95, 0x1c, + ], + cv_net: [ + 0x45, 0x37, 0x85, 0x3e, 0x18, 0xac, 0x2c, 0xe9, 0x37, 0x79, 0x8c, 0x9b, 0xce, 0xa9, + 0x80, 0x2d, 0x65, 0x00, 0x74, 0xdb, 0xd7, 0xe0, 0x6a, 0x48, 0x98, 0x03, 0x15, 0x30, + 0x78, 0xe9, 0x97, 0x0b, + ], + rho: [ + 0x9a, 0xd0, 0x7f, 0x1c, 0x28, 0x7b, 0xdd, 0x53, 0x4f, 0x6f, 0x7e, 0xae, 0x08, 0xf7, + 0x85, 0x72, 0xa3, 0x05, 0xfa, 0x3b, 0x70, 0x68, 0xa3, 0x78, 0x38, 0x27, 0xaf, 0xe2, + 0x14, 0x7a, 0x27, 0x10, + ], + cmx: [ + 0x82, 0x9c, 0x4a, 0x9c, 0x2a, 0x01, 0x66, 0xc9, 0xba, 0x2e, 0x16, 0x9e, 0xdd, 0xda, + 0xe6, 0xdb, 0x59, 0xf0, 0x12, 0xa7, 0x26, 0x29, 0xce, 0x34, 0xf6, 0xc2, 0x88, 0x7e, + 0xfb, 0xe1, 0xd9, 0x3f, + ], + esk: [ + 0xb5, 0x9a, 0x18, 0x4d, 0x24, 0xe6, 0x1b, 0x9f, 0x9d, 0x37, 0x1d, 0xa4, 0xb1, 0x44, + 0x01, 0x72, 0x02, 0x9a, 0x2e, 0xbc, 0x0a, 0x2a, 0xbe, 0xb8, 0xaf, 0x2b, 0xd1, 0xa0, + 0x8c, 0x67, 0xd9, 0x3f, + ], + ephemeral_key: [ + 0x46, 0x73, 0x1f, 0xff, 0xc5, 0x9a, 0xf4, 0xc1, 0x28, 0x82, 0xbc, 0xca, 0xea, 0xa7, + 0xb8, 0xed, 0x39, 0x0b, 0x14, 0x66, 0x72, 0xe1, 0x36, 0x51, 0xc3, 0x2e, 0x57, 0x80, + 0x62, 0x68, 0x65, 0xa7, + ], + shared_secret: [ + 0x9d, 0x56, 0xbd, 0x96, 0x00, 0x39, 0x62, 0x5e, 0x11, 0x7d, 0x7b, 0xfe, 0xd4, 0x3a, + 0x57, 0x3b, 0x11, 0x51, 0x7f, 0xfa, 0x76, 0x14, 0xea, 0x2d, 0xa7, 0x7e, 0xdf, 0x62, + 0x7f, 0x6f, 0x13, 0xaa, + ], + k_enc: [ + 0x04, 0x2f, 0x92, 0x82, 0x13, 0x44, 0xde, 0x97, 0x7c, 0xee, 0x89, 0x9e, 0xd2, 0x1b, + 0xc8, 0x48, 0xf5, 0xc4, 0xfe, 0xdc, 0x39, 0xf2, 0xdf, 0xed, 0xad, 0x62, 0xcc, 0x7a, + 0x92, 0x7f, 0x74, 0xfd, + ], + p_enc: [ + 0x03, 0x61, 0x5f, 0x53, 0x89, 0x1a, 0x18, 0xe0, 0x52, 0x17, 0x2d, 0x81, 0x82, 0xcf, + 0xb3, 0xe7, 0x63, 0xfa, 0xd2, 0xd1, 0x45, 0x60, 0x3a, 0x53, 0x46, 0x2c, 0x60, 0xe1, + 0xf6, 0xcb, 0x0c, 0x9c, 0xa0, 0x39, 0x0c, 0x48, 0x82, 0x24, 0xc3, 0x13, 0x26, 0x9f, + 0xcd, 0x59, 0xfc, 0xb6, 0x11, 0xfb, 0x2d, 0x9b, 0x4c, 0x8f, 0x61, 0x16, 0xcf, 0xec, + 0x26, 0x47, 0xcc, 0xaa, 0xe1, 0xc7, 0x4b, 0x41, 0x6f, 0x3e, 0x6a, 0xe8, 0xf7, 0xcc, + 0x60, 0xea, 0xaf, 0x7b, 0x6a, 0x59, 0x0d, 0x51, 0x54, 0x41, 0x38, 0xe1, 0x73, 0x29, + 0xff, 0xa6, 0x01, 0xbb, 0x1c, 0xb8, 0xd0, 0x7d, 0x79, 0x7b, 0xf5, 0xde, 0x52, 0xbc, + 0xee, 0xb0, 0x23, 0x01, 0xc8, 0x96, 0x2a, 0xc1, 0xfc, 0x04, 0x91, 0xdc, 0x81, 0xaf, + 0xfd, 0x6c, 0x1e, 0xbf, 0x89, 0xa1, 0x3d, 0x6f, 0x29, 0x0e, 0xda, 0x5d, 0x5c, 0xef, + 0x38, 0x22, 0x15, 0xc5, 0xe9, 0x51, 0xd7, 0x13, 0x05, 0xef, 0x33, 0xd9, 0x73, 0x71, + 0x26, 0xd0, 0xe6, 0x62, 0x90, 0x5f, 0x12, 0x50, 0x92, 0x6f, 0x6a, 0x22, 0x99, 0x90, + 0xe3, 0x8f, 0x69, 0xad, 0x9a, 0x91, 0x92, 0xb3, 0x02, 0xf2, 0x6b, 0xdd, 0xa4, 0x65, + 0xd9, 0x0b, 0x94, 0xb1, 0x2c, 0x57, 0xfa, 0x3f, 0xd6, 0x93, 0x00, 0x83, 0xf1, 0x84, + 0x43, 0x8d, 0x8a, 0x88, 0x9d, 0x3f, 0x5e, 0xce, 0xa2, 0xc6, 0xd2, 0x3d, 0x67, 0x36, + 0xf2, 0xa0, 0xf1, 0x8e, 0x26, 0xf4, 0xfa, 0x45, 0xd1, 0xbe, 0x8f, 0x3d, 0xc4, 0xa7, + 0x07, 0x13, 0x7e, 0x95, 0xd2, 0xad, 0x59, 0x4f, 0x6c, 0x03, 0xd2, 0x49, 0x23, 0x06, + 0x7a, 0xe4, 0x7f, 0xd6, 0x42, 0x5e, 0xfb, 0x9c, 0x1d, 0x50, 0x4e, 0x6f, 0xd5, 0x57, + 0x53, 0x40, 0x94, 0x56, 0x01, 0xfe, 0x80, 0x6f, 0x57, 0x56, 0xac, 0xb5, 0x62, 0xf1, + 0x3c, 0x0c, 0xa1, 0xd8, 0x03, 0xa1, 0x95, 0xc2, 0xeb, 0xb2, 0xef, 0x02, 0xac, 0x33, + 0xe6, 0xa8, 0x8d, 0xea, 0x07, 0x5b, 0xa9, 0x96, 0xd3, 0xc3, 0x36, 0x64, 0x8e, 0x86, + 0x94, 0xd3, 0xa1, 0x9d, 0x3d, 0xca, 0x53, 0x1b, 0xeb, 0x50, 0xd4, 0x32, 0x7c, 0x5c, + 0x0c, 0x23, 0xcb, 0x7c, 0xfd, 0xb0, 0x8c, 0xa7, 0xcf, 0x2c, 0xac, 0x6b, 0xc1, 0x39, + 0xd0, 0x74, 0x14, 0x73, 0xd3, 0x76, 0x02, 0x9c, 0xb4, 0xab, 0x6b, 0xf0, 0x54, 0x55, + 0x7c, 0xe2, 0x94, 0xc7, 0x28, 0xa4, 0x68, 0x7d, 0x57, 0xec, 0x89, 0x09, 0xff, 0x51, + 0xa4, 0xd0, 0x2f, 0x9d, 0xcd, 0x11, 0x19, 0x3d, 0x7d, 0x1c, 0x9f, 0xda, 0xe6, 0xa1, + 0x73, 0x96, 0xa1, 0xbf, 0x57, 0xa9, 0x94, 0x93, 0x4f, 0x5e, 0x7a, 0x59, 0xf0, 0x45, + 0xde, 0xbe, 0xaf, 0xf6, 0x2e, 0xf3, 0x26, 0xb9, 0x47, 0xf2, 0xa8, 0xb4, 0x95, 0x55, + 0xe4, 0xd9, 0x9b, 0x3b, 0xf5, 0xc8, 0x1f, 0xf9, 0xfe, 0x31, 0x4e, 0x04, 0x7a, 0xf1, + 0x52, 0x50, 0x8f, 0x57, 0x01, 0x5c, 0xa4, 0x02, 0xc6, 0x7d, 0x92, 0x5c, 0x99, 0xac, + 0xea, 0x3e, 0xe8, 0xcc, 0x4b, 0x00, 0x8c, 0x5c, 0xb4, 0x39, 0x66, 0xe7, 0x14, 0xef, + 0x48, 0x0f, 0xd0, 0x5e, 0x07, 0xc7, 0xb2, 0xdd, 0xa9, 0xaa, 0x39, 0x66, 0x11, 0x3e, + 0xaa, 0x29, 0x3d, 0x3f, 0x62, 0x2b, 0x30, 0x9d, 0x64, 0x80, 0x3c, 0xe1, 0xe6, 0x37, + 0x8b, 0x6a, 0xac, 0x4f, 0xab, 0x52, 0x7c, 0x43, 0xcd, 0x45, 0xed, 0x0a, 0x3c, 0x1a, + 0x4b, 0x9f, 0xb1, 0x8d, 0xcc, 0xcf, 0xcd, 0xb6, 0xac, 0x0c, 0x24, 0x21, 0x63, 0x9c, + 0xda, 0x00, 0x75, 0xa2, 0x0d, 0xc5, 0x11, 0x1b, 0x8d, 0x3d, 0x31, 0x99, 0x49, 0x5b, + 0xd9, 0x13, 0x3d, 0xba, 0xb9, 0x45, 0x41, 0x41, 0x0e, 0x4f, 0xba, 0x92, 0xc7, 0xb6, + 0x06, 0xa5, 0xcb, 0x12, 0x2f, 0x14, 0x0c, 0xf1, 0xa3, 0x59, 0x6f, 0x27, 0x88, 0xf3, + 0xc8, 0xb9, 0x26, 0x60, 0xf1, 0x4c, 0xb6, 0x5a, 0xf5, 0xdd, 0x23, 0xdf, 0xdb, 0xac, + 0x13, 0x71, 0xec, 0xf4, 0xb3, 0x37, 0x12, 0xfe, 0xd2, 0x29, 0x2c, 0x44, 0xf7, 0x08, + 0x34, 0xcf, 0x96, 0xc0, 0x5d, 0x58, 0x82, 0x7e, 0x69, 0xbf, 0xc2, 0xe6, 0x96, 0xfa, + 0x08, 0x74, 0x86, 0x9c, 0x02, 0xf3, 0xdc, 0xa1, 0x1c, 0x3b, 0x90, 0xcb, 0x21, 0x4e, + 0x68, 0xbc, 0x1c, 0xae, 0x03, 0x9d, 0x7a, 0x14, 0x6c, 0xdc, 0x1d, 0x60, 0x9d, 0x7a, + 0x6b, 0x3f, 0xd5, 0xd4, 0x61, 0xb0, 0x95, 0x1c, + ], + c_enc: [ + 0x16, 0x76, 0x72, 0x3a, 0x18, 0xff, 0x58, 0x77, 0x70, 0x15, 0x8d, 0x6b, 0x85, 0x09, + 0x3c, 0x49, 0x20, 0x16, 0xf8, 0x7e, 0xc3, 0xfa, 0xe8, 0xb0, 0xb4, 0x7c, 0xd9, 0x29, + 0x8f, 0xa2, 0x07, 0xc4, 0xb6, 0x09, 0xc6, 0x92, 0xdd, 0xb9, 0x10, 0x19, 0x72, 0xc9, + 0x4c, 0x71, 0x87, 0x84, 0x85, 0x42, 0x1e, 0xfb, 0x70, 0x1c, 0xf5, 0x15, 0xa2, 0x3f, + 0xbf, 0x36, 0xfe, 0x93, 0x54, 0x0d, 0x82, 0xd6, 0x9a, 0x72, 0x62, 0x4e, 0x25, 0x4f, + 0xe3, 0xa0, 0x11, 0xc5, 0xdb, 0xdb, 0xd2, 0xbd, 0xff, 0xb8, 0x83, 0x8a, 0xf3, 0x7d, + 0x03, 0xce, 0x69, 0x12, 0x6b, 0x2f, 0x68, 0x21, 0x25, 0xb7, 0xa9, 0xb2, 0xa3, 0xee, + 0x11, 0x8a, 0xe5, 0xad, 0xb4, 0x60, 0xa4, 0x68, 0x7c, 0x24, 0x30, 0x18, 0x7b, 0xfd, + 0x0f, 0x6c, 0x2a, 0x3d, 0x5d, 0x74, 0x30, 0x1c, 0xbd, 0x8f, 0xd0, 0x26, 0xc8, 0x64, + 0x4f, 0xbf, 0xa2, 0x65, 0x69, 0x88, 0xe9, 0x58, 0x59, 0x0b, 0x81, 0x6a, 0x1e, 0x64, + 0x0e, 0x46, 0x71, 0x0e, 0x46, 0xfa, 0x15, 0x94, 0xff, 0x2a, 0x61, 0xd6, 0xf6, 0xe7, + 0xb4, 0xa9, 0xf6, 0xe0, 0xde, 0x68, 0x3d, 0x95, 0xe5, 0x9d, 0x43, 0x57, 0xf7, 0x9a, + 0xc4, 0x93, 0x86, 0x6d, 0xab, 0x06, 0x57, 0x76, 0xc0, 0xb1, 0x43, 0x6b, 0x8e, 0x04, + 0x47, 0x68, 0x43, 0xc2, 0x8b, 0x48, 0x45, 0xea, 0xff, 0x17, 0x83, 0xa8, 0x50, 0xc2, + 0x4a, 0x90, 0x65, 0xc3, 0x36, 0x51, 0xc4, 0xb3, 0xdd, 0x19, 0x92, 0xf4, 0xf2, 0x08, + 0xb8, 0x51, 0xbf, 0xff, 0xe9, 0xb7, 0xbb, 0x7a, 0xad, 0x76, 0x7c, 0x23, 0x60, 0xb0, + 0x5c, 0x11, 0x23, 0x09, 0x66, 0xda, 0x55, 0x7e, 0x31, 0x3a, 0xe6, 0x1c, 0x95, 0x42, + 0x97, 0x66, 0x10, 0x6b, 0x4b, 0x1b, 0x35, 0x47, 0x64, 0xe4, 0xe1, 0xe4, 0xdf, 0x90, + 0xc1, 0x2d, 0x24, 0x37, 0x9d, 0x67, 0xba, 0xc6, 0x66, 0x97, 0xaf, 0x23, 0x44, 0x97, + 0xf2, 0xd6, 0xf9, 0xa6, 0x12, 0x85, 0x0d, 0xd7, 0x1d, 0x1c, 0x98, 0xce, 0x65, 0xd8, + 0x50, 0x7f, 0xa3, 0x46, 0x35, 0x83, 0x12, 0x39, 0xe2, 0x10, 0xf7, 0xdb, 0xb3, 0x05, + 0x04, 0x2d, 0x47, 0x50, 0xd9, 0x5a, 0xdf, 0xff, 0xc9, 0x8d, 0xeb, 0x0f, 0x17, 0x13, + 0xbc, 0x01, 0xaf, 0x5d, 0xb5, 0x99, 0x29, 0x89, 0x76, 0xab, 0xba, 0xdb, 0x0f, 0x4d, + 0xed, 0x1a, 0x2f, 0xe4, 0xcf, 0x90, 0x60, 0x0e, 0x0d, 0x28, 0xd3, 0x07, 0xc6, 0x41, + 0xf7, 0x52, 0x3c, 0x16, 0x66, 0x40, 0x1d, 0x78, 0x6f, 0xd2, 0x4a, 0xe1, 0x68, 0x0f, + 0xe9, 0x26, 0x70, 0x4c, 0xb6, 0xe2, 0xaf, 0x80, 0x1a, 0x0d, 0x82, 0x75, 0x9d, 0xd8, + 0x7a, 0x8c, 0xd8, 0x7b, 0x85, 0xbb, 0x07, 0x51, 0xa7, 0x08, 0xc9, 0xf4, 0xa7, 0xd3, + 0x24, 0xe5, 0xc9, 0x3a, 0xd2, 0x2b, 0x86, 0x43, 0xdf, 0xfa, 0x5f, 0x50, 0x79, 0xfc, + 0x6f, 0x01, 0x6d, 0x94, 0x3c, 0x99, 0x09, 0x27, 0x5c, 0x96, 0xf5, 0xfe, 0x7b, 0x56, + 0x33, 0x3c, 0x24, 0x01, 0x99, 0x73, 0xd9, 0x4f, 0x06, 0xeb, 0xf6, 0xc0, 0xf6, 0xef, + 0xdd, 0x42, 0xea, 0xb0, 0x63, 0x49, 0xd5, 0xe8, 0xb9, 0x60, 0xba, 0x8c, 0x68, 0xee, + 0xfd, 0x44, 0x49, 0x99, 0xf6, 0xfa, 0x3d, 0x6a, 0x3a, 0xe3, 0x1a, 0xe8, 0x54, 0x6e, + 0xdc, 0x62, 0x78, 0x25, 0x63, 0x7e, 0x1e, 0x86, 0x39, 0x8d, 0x0e, 0xd3, 0xd8, 0x8b, + 0xfa, 0xea, 0x8b, 0x4b, 0x08, 0x50, 0xd8, 0xa8, 0x28, 0x6e, 0xa9, 0xf3, 0xd1, 0x3f, + 0xa8, 0xf4, 0x16, 0x53, 0x45, 0x1b, 0x97, 0xb3, 0x8b, 0x06, 0x3a, 0x5f, 0xc6, 0xdb, + 0xe4, 0xe9, 0x19, 0x94, 0x87, 0xc9, 0x73, 0xef, 0x8f, 0x2c, 0x26, 0x3f, 0x85, 0x05, + 0xf4, 0xc3, 0xbe, 0xc9, 0xd1, 0x79, 0xbb, 0xd6, 0x5d, 0x1e, 0xdc, 0x58, 0x95, 0xa1, + 0x6c, 0xc7, 0x98, 0x6b, 0xcf, 0xc4, 0xba, 0xe8, 0x7e, 0xc0, 0xb2, 0x9b, 0xf1, 0xb3, + 0x97, 0x61, 0x5c, 0x95, 0x13, 0xfa, 0x52, 0xeb, 0xe1, 0xe9, 0xfc, 0xfb, 0xf1, 0x92, + 0xed, 0x49, 0x26, 0x27, 0x27, 0xa0, 0x8a, 0xd3, 0xc2, 0x95, 0x5b, 0x3d, 0xf2, 0xee, + 0xad, 0x30, 0x24, 0x3e, 0x32, 0xb2, 0x54, 0x1e, 0x8f, 0x9f, 0xce, 0x6c, 0xa5, 0xe7, + 0x0f, 0xf3, 0xa5, 0xe9, 0x35, 0x2b, 0xb8, 0x93, 0xe3, 0xdc, 0xa2, 0x74, 0xa1, 0x11, + 0xbb, 0xd6, 0x9c, 0x2b, 0x4c, 0x2e, 0xc9, 0x49, 0x81, 0x3d, 0xb7, 0x8c, 0x5e, 0x16, + 0xbc, 0x7a, 0xf6, 0x72, 0xb2, 0x0d, 0x7a, 0x16, 0xec, 0x48, + ], + ock: [ + 0xa8, 0xa5, 0x77, 0x53, 0x40, 0x60, 0x3d, 0xad, 0x7d, 0x52, 0x3c, 0x94, 0x64, 0x4b, + 0x4d, 0x3f, 0x61, 0x92, 0xfb, 0x19, 0x8e, 0x8d, 0xe5, 0x70, 0x61, 0x52, 0xf4, 0x55, + 0x68, 0x24, 0x58, 0x73, + ], + op: [ + 0x04, 0x47, 0x12, 0x42, 0xe1, 0xf4, 0x2b, 0xf0, 0x81, 0xf0, 0x8e, 0x9d, 0x71, 0xfe, + 0x4f, 0x3a, 0x65, 0x91, 0xa7, 0xc0, 0x1e, 0xe2, 0xcf, 0x35, 0x30, 0x2f, 0x38, 0xd3, + 0x34, 0xeb, 0x90, 0x2c, 0xb5, 0x9a, 0x18, 0x4d, 0x24, 0xe6, 0x1b, 0x9f, 0x9d, 0x37, + 0x1d, 0xa4, 0xb1, 0x44, 0x01, 0x72, 0x02, 0x9a, 0x2e, 0xbc, 0x0a, 0x2a, 0xbe, 0xb8, + 0xaf, 0x2b, 0xd1, 0xa0, 0x8c, 0x67, 0xd9, 0x3f, + ], + c_out: [ + 0xe3, 0x49, 0x59, 0x73, 0x78, 0x12, 0xaf, 0x29, 0xef, 0x95, 0x78, 0x3d, 0xcf, 0xb2, + 0xfd, 0x19, 0xab, 0x10, 0xd2, 0x17, 0xdd, 0x7d, 0x7f, 0xa6, 0x9e, 0x45, 0x21, 0xfe, + 0x8e, 0xce, 0x1a, 0x86, 0xee, 0x5b, 0xaf, 0x9d, 0xe8, 0x51, 0x2f, 0x84, 0xa2, 0xb9, + 0x12, 0xbf, 0xa3, 0x2e, 0x50, 0xc9, 0x1e, 0xfc, 0xfa, 0x14, 0x50, 0xb7, 0xdb, 0x82, + 0xd5, 0xa2, 0xa9, 0x9d, 0x40, 0xf7, 0xbd, 0x6d, 0x66, 0xd5, 0xaa, 0x9a, 0x13, 0xec, + 0xc1, 0x61, 0x05, 0x74, 0x0a, 0x68, 0xdb, 0xd9, 0x5e, 0x0a, + ], + }, + TestVector { + incoming_viewing_key: [ + 0xfc, 0x8c, 0x64, 0x1c, 0x0b, 0x28, 0xbe, 0xbf, 0x85, 0x24, 0x25, 0xae, 0x95, 0x5f, + 0xe6, 0x40, 0x1c, 0xfd, 0x9e, 0x60, 0x63, 0xf2, 0x50, 0x11, 0x3d, 0xa0, 0xb5, 0x8b, + 0x2a, 0x0f, 0x49, 0xb9, 0x12, 0x0b, 0x89, 0x9f, 0x08, 0x10, 0x6b, 0x30, 0x86, 0xb2, + 0xf4, 0x11, 0x63, 0x6f, 0x50, 0xab, 0x48, 0x7c, 0xfb, 0x28, 0x81, 0x89, 0x77, 0x8f, + 0xe4, 0xe5, 0xa1, 0x91, 0x8b, 0x98, 0xd5, 0x0a, + ], + ovk: [ + 0xbe, 0xd1, 0x7d, 0xf5, 0xf8, 0x88, 0xc8, 0xca, 0x14, 0x67, 0xae, 0x17, 0xdb, 0xbc, + 0xde, 0x31, 0xc1, 0x10, 0x5c, 0xb5, 0xbd, 0xa8, 0x8a, 0xc6, 0xc6, 0x27, 0x00, 0x2c, + 0xe2, 0x1c, 0x02, 0x14, + ], + default_d: [ + 0xd2, 0xf7, 0x5f, 0x7c, 0xe7, 0x1b, 0xa4, 0xa7, 0xab, 0x69, 0xb8, + ], + default_pk_d: [ + 0x49, 0x19, 0x01, 0x2e, 0x40, 0x43, 0x82, 0xeb, 0xee, 0x8e, 0x60, 0xe9, 0xd4, 0xf1, + 0x30, 0x79, 0xc0, 0x8d, 0x9c, 0x6d, 0x50, 0xf9, 0x35, 0x86, 0x7d, 0x33, 0x01, 0xf6, + 0x89, 0xcf, 0xf9, 0x1e, + ], + v: 7555450289479839818, + rseed: [ + 0x13, 0xeb, 0x7c, 0xea, 0xa5, 0xff, 0x12, 0x90, 0xb0, 0x3e, 0xc9, 0x1c, 0xe6, 0xdd, + 0x28, 0x13, 0x0c, 0x3a, 0xb0, 0xb2, 0x3b, 0x60, 0x2b, 0xd5, 0xbe, 0x5d, 0xc2, 0x60, + 0x03, 0xaa, 0xe0, 0x4b, + ], + asset: [ + 0x29, 0x8a, 0xc0, 0xaf, 0xdc, 0x52, 0x87, 0xd7, 0xad, 0x12, 0x4c, 0xd9, 0x40, 0x5a, + 0x62, 0xcd, 0x1c, 0xa0, 0x8b, 0x28, 0x2e, 0xfe, 0xf7, 0xf9, 0x28, 0xdf, 0x76, 0xe2, + 0x82, 0x1a, 0x41, 0x84, + ], + memo: [ + 0xff, 0x33, 0xd7, 0xbd, 0x25, 0x90, 0xe9, 0x0c, 0x8c, 0x38, 0x8e, 0xa7, 0x95, 0x51, + 0x22, 0xdb, 0xac, 0xa6, 0x7b, 0x30, 0x39, 0x5a, 0x92, 0x8b, 0x57, 0xb8, 0x57, 0x51, + 0x23, 0x20, 0x5a, 0xe1, 0x91, 0x52, 0xe4, 0x1e, 0x00, 0x29, 0x31, 0xb4, 0x57, 0x46, + 0x19, 0x8e, 0x5d, 0xd9, 0x57, 0x1a, 0x56, 0xa7, 0xe0, 0xd4, 0x23, 0xff, 0x27, 0x98, + 0x9d, 0x3e, 0xb4, 0x17, 0xec, 0xd3, 0xc3, 0x09, 0x3f, 0xb8, 0x2c, 0x56, 0x58, 0xe2, + 0x96, 0x24, 0xc5, 0x32, 0x19, 0xa6, 0x0c, 0xd0, 0xa8, 0xc4, 0xda, 0x36, 0x7e, 0x29, + 0xa7, 0x17, 0x79, 0xa7, 0x30, 0x32, 0x98, 0x5a, 0x3d, 0x1f, 0xd0, 0x3d, 0xd4, 0xd0, + 0x6e, 0x05, 0x56, 0x6f, 0x3b, 0x84, 0x36, 0x7c, 0xf0, 0xfa, 0xee, 0x9b, 0xc3, 0xbd, + 0x7a, 0x3a, 0x60, 0x6a, 0x9f, 0xdb, 0x84, 0x9c, 0x5d, 0x82, 0xd0, 0xa6, 0x19, 0x23, + 0xc2, 0xe5, 0xd8, 0xaa, 0x63, 0xa8, 0xa5, 0x0c, 0x38, 0xbd, 0x03, 0x87, 0x72, 0xc4, + 0x14, 0x3d, 0x8b, 0x7a, 0xcf, 0xd7, 0x4e, 0x72, 0xc0, 0x4d, 0x89, 0x24, 0x8d, 0xff, + 0x20, 0xfe, 0x8d, 0xc5, 0xec, 0x21, 0x49, 0x05, 0x4e, 0xa2, 0x41, 0x64, 0xe8, 0x5f, + 0x67, 0x44, 0xad, 0x0c, 0xac, 0xf1, 0xa8, 0xb7, 0x01, 0x26, 0xf4, 0x82, 0xc0, 0x92, + 0xed, 0x9f, 0x61, 0x27, 0xd2, 0x05, 0x0d, 0x12, 0xe8, 0x78, 0xa7, 0x96, 0x53, 0xa1, + 0xe8, 0x4d, 0xae, 0xc3, 0xeb, 0xe6, 0x2d, 0x5f, 0x6c, 0x4a, 0xbe, 0x5c, 0xe9, 0x0a, + 0x7f, 0xe2, 0xe5, 0x2a, 0x8d, 0x78, 0x46, 0xe8, 0xed, 0xf2, 0xf2, 0xbc, 0xe0, 0x5a, + 0x03, 0x7c, 0x82, 0x6f, 0x22, 0xca, 0xad, 0x12, 0x61, 0x46, 0x7d, 0xcf, 0xb7, 0xd6, + 0xb6, 0x13, 0x3d, 0xc2, 0x1e, 0x80, 0x96, 0xc7, 0xe9, 0xf8, 0xe9, 0xe1, 0x0c, 0x1e, + 0x3f, 0xac, 0x40, 0x58, 0xb6, 0x82, 0xc6, 0x8e, 0x54, 0xfa, 0xca, 0xe0, 0xf9, 0xc2, + 0xdd, 0x4d, 0x64, 0xd9, 0x04, 0x61, 0x52, 0xb4, 0x76, 0x23, 0x32, 0x93, 0x9f, 0x17, + 0xe6, 0xaa, 0xf7, 0xd8, 0xb9, 0xd3, 0x58, 0xe2, 0x21, 0x8d, 0x4e, 0x0d, 0x69, 0xa4, + 0xf1, 0x19, 0xe1, 0xc6, 0x4e, 0xec, 0x4c, 0x8b, 0x53, 0x28, 0x09, 0x70, 0x71, 0x31, + 0xf0, 0x1f, 0x55, 0xc7, 0xad, 0x04, 0xcf, 0xb6, 0x3f, 0x7c, 0x4a, 0x3d, 0x0a, 0x2b, + 0x0f, 0xfb, 0x0b, 0x05, 0xa6, 0xbe, 0x05, 0x5b, 0x8c, 0x94, 0xca, 0x80, 0xbb, 0x0a, + 0x1d, 0x13, 0xcd, 0x4c, 0xd6, 0x9a, 0xb9, 0x83, 0x04, 0xae, 0x25, 0x15, 0xd5, 0xf7, + 0x69, 0x9d, 0x4a, 0xbe, 0xe5, 0xc2, 0x0b, 0xe6, 0x09, 0xd8, 0x73, 0x51, 0x10, 0x12, + 0xf2, 0x34, 0xbd, 0x85, 0xa7, 0xef, 0xf5, 0xfb, 0x63, 0x4c, 0xff, 0x26, 0x58, 0xba, + 0x65, 0x16, 0x04, 0x85, 0x63, 0x09, 0x5e, 0xce, 0xfb, 0x30, 0x15, 0xee, 0x3f, 0x03, + 0xca, 0x52, 0xa1, 0x77, 0xf2, 0x61, 0xec, 0xdc, 0x26, 0xbc, 0x08, 0x9d, 0x34, 0xc6, + 0x40, 0x48, 0x46, 0xe9, 0xc6, 0x47, 0xfc, 0xfe, 0x98, 0xcc, 0x6a, 0xcd, 0xbb, 0x46, + 0x4f, 0x64, 0x27, 0x8a, 0xd8, 0xce, 0x9d, 0x1a, 0xe0, 0xd4, 0x15, 0xbc, 0x0c, 0x05, + 0x24, 0x5f, 0xdd, 0xaf, 0x4e, 0xbc, 0x8d, 0xc7, 0x03, 0xa8, 0x5c, 0xb2, 0x70, 0xf7, + 0x96, 0xad, 0x2d, 0x93, 0x7e, 0x2a, 0xc0, 0xd5, 0xe0, 0xa3, 0x48, 0x21, 0x75, 0x80, + 0x00, 0xaa, 0x59, 0xc9, 0xd4, 0x65, 0x24, 0x85, 0x29, 0x4e, 0xe0, 0xab, 0x29, 0x69, + 0x6b, 0x21, 0x43, 0x0f, 0xa5, 0x4d, 0xcf, 0xbf, 0x2b, 0x9c, 0x49, 0xd1, 0x42, 0x06, + 0x42, 0x09, 0xee, 0xee, 0xd4, 0xd4, 0x71, 0xff, 0xc0, 0x17, 0xd4, 0xe2, 0x0a, 0x79, + 0x6b, 0x09, 0x27, 0x80, 0x4c, 0x06, 0x1b, 0x9f, + ], + cv_net: [ + 0x71, 0x00, 0xa7, 0x52, 0x93, 0xf4, 0xae, 0xfd, 0x89, 0xa1, 0x66, 0xa5, 0xf8, 0x4d, + 0x34, 0xda, 0xf4, 0xe5, 0x98, 0x34, 0xcd, 0x65, 0xd7, 0x9f, 0xfc, 0x41, 0xdd, 0xf0, + 0x68, 0x2d, 0xc2, 0xab, + ], + rho: [ + 0x31, 0x70, 0x5e, 0xfb, 0xf8, 0x0c, 0x7a, 0x7a, 0xb7, 0x81, 0xdf, 0x53, 0x77, 0xf8, + 0x4d, 0x4b, 0x32, 0x36, 0xdb, 0x1f, 0x32, 0xac, 0xa7, 0x94, 0x5c, 0xf2, 0x6e, 0xc8, + 0xb9, 0xd0, 0xb7, 0x32, + ], + cmx: [ + 0xde, 0x71, 0x70, 0xc9, 0xd8, 0x0f, 0x64, 0x00, 0x29, 0x73, 0xc2, 0xc7, 0x58, 0x02, + 0x7b, 0xc4, 0x38, 0xe5, 0x83, 0x68, 0x56, 0xa7, 0x40, 0x03, 0x20, 0xb1, 0xbd, 0xe2, + 0xed, 0xa1, 0x7d, 0x31, + ], + esk: [ + 0xc0, 0xdb, 0x43, 0x69, 0x10, 0x03, 0x45, 0x7d, 0x61, 0xfb, 0x58, 0x93, 0x20, 0x26, + 0xf9, 0xdd, 0x2c, 0x35, 0xb9, 0x05, 0x7f, 0xad, 0x50, 0xd8, 0x44, 0x72, 0x83, 0xf9, + 0x4e, 0xd5, 0x95, 0x3d, + ], + ephemeral_key: [ + 0xce, 0x67, 0x94, 0x31, 0x5f, 0x46, 0x2d, 0xed, 0xf3, 0xc5, 0x77, 0x4a, 0xac, 0x7f, + 0x3c, 0x7b, 0x70, 0xba, 0x7d, 0x72, 0x43, 0xbb, 0x0c, 0xc3, 0xb0, 0x67, 0xdc, 0x28, + 0x38, 0xf1, 0x11, 0xa3, + ], + shared_secret: [ + 0xea, 0x22, 0x6b, 0x69, 0xec, 0x2d, 0x9f, 0xcf, 0x91, 0x9c, 0xe5, 0x70, 0x06, 0x09, + 0x89, 0x94, 0xf7, 0x14, 0xb3, 0x9c, 0x34, 0x61, 0x52, 0xbc, 0x11, 0x51, 0xa0, 0xc6, + 0x9e, 0xe0, 0x04, 0x06, + ], + k_enc: [ + 0xb4, 0x56, 0x1b, 0xdb, 0xe0, 0xea, 0x44, 0x20, 0x75, 0xe7, 0xe6, 0x6f, 0xb3, 0xc0, + 0xfa, 0xd3, 0xaf, 0xc2, 0x85, 0x6e, 0xf4, 0xf3, 0x61, 0xb4, 0xac, 0x33, 0xaa, 0xe0, + 0x15, 0x52, 0xfd, 0x49, + ], + p_enc: [ + 0x03, 0xd2, 0xf7, 0x5f, 0x7c, 0xe7, 0x1b, 0xa4, 0xa7, 0xab, 0x69, 0xb8, 0x4a, 0x70, + 0x91, 0xfe, 0x01, 0x5a, 0xda, 0x68, 0x13, 0xeb, 0x7c, 0xea, 0xa5, 0xff, 0x12, 0x90, + 0xb0, 0x3e, 0xc9, 0x1c, 0xe6, 0xdd, 0x28, 0x13, 0x0c, 0x3a, 0xb0, 0xb2, 0x3b, 0x60, + 0x2b, 0xd5, 0xbe, 0x5d, 0xc2, 0x60, 0x03, 0xaa, 0xe0, 0x4b, 0x29, 0x8a, 0xc0, 0xaf, + 0xdc, 0x52, 0x87, 0xd7, 0xad, 0x12, 0x4c, 0xd9, 0x40, 0x5a, 0x62, 0xcd, 0x1c, 0xa0, + 0x8b, 0x28, 0x2e, 0xfe, 0xf7, 0xf9, 0x28, 0xdf, 0x76, 0xe2, 0x82, 0x1a, 0x41, 0x84, + 0xff, 0x33, 0xd7, 0xbd, 0x25, 0x90, 0xe9, 0x0c, 0x8c, 0x38, 0x8e, 0xa7, 0x95, 0x51, + 0x22, 0xdb, 0xac, 0xa6, 0x7b, 0x30, 0x39, 0x5a, 0x92, 0x8b, 0x57, 0xb8, 0x57, 0x51, + 0x23, 0x20, 0x5a, 0xe1, 0x91, 0x52, 0xe4, 0x1e, 0x00, 0x29, 0x31, 0xb4, 0x57, 0x46, + 0x19, 0x8e, 0x5d, 0xd9, 0x57, 0x1a, 0x56, 0xa7, 0xe0, 0xd4, 0x23, 0xff, 0x27, 0x98, + 0x9d, 0x3e, 0xb4, 0x17, 0xec, 0xd3, 0xc3, 0x09, 0x3f, 0xb8, 0x2c, 0x56, 0x58, 0xe2, + 0x96, 0x24, 0xc5, 0x32, 0x19, 0xa6, 0x0c, 0xd0, 0xa8, 0xc4, 0xda, 0x36, 0x7e, 0x29, + 0xa7, 0x17, 0x79, 0xa7, 0x30, 0x32, 0x98, 0x5a, 0x3d, 0x1f, 0xd0, 0x3d, 0xd4, 0xd0, + 0x6e, 0x05, 0x56, 0x6f, 0x3b, 0x84, 0x36, 0x7c, 0xf0, 0xfa, 0xee, 0x9b, 0xc3, 0xbd, + 0x7a, 0x3a, 0x60, 0x6a, 0x9f, 0xdb, 0x84, 0x9c, 0x5d, 0x82, 0xd0, 0xa6, 0x19, 0x23, + 0xc2, 0xe5, 0xd8, 0xaa, 0x63, 0xa8, 0xa5, 0x0c, 0x38, 0xbd, 0x03, 0x87, 0x72, 0xc4, + 0x14, 0x3d, 0x8b, 0x7a, 0xcf, 0xd7, 0x4e, 0x72, 0xc0, 0x4d, 0x89, 0x24, 0x8d, 0xff, + 0x20, 0xfe, 0x8d, 0xc5, 0xec, 0x21, 0x49, 0x05, 0x4e, 0xa2, 0x41, 0x64, 0xe8, 0x5f, + 0x67, 0x44, 0xad, 0x0c, 0xac, 0xf1, 0xa8, 0xb7, 0x01, 0x26, 0xf4, 0x82, 0xc0, 0x92, + 0xed, 0x9f, 0x61, 0x27, 0xd2, 0x05, 0x0d, 0x12, 0xe8, 0x78, 0xa7, 0x96, 0x53, 0xa1, + 0xe8, 0x4d, 0xae, 0xc3, 0xeb, 0xe6, 0x2d, 0x5f, 0x6c, 0x4a, 0xbe, 0x5c, 0xe9, 0x0a, + 0x7f, 0xe2, 0xe5, 0x2a, 0x8d, 0x78, 0x46, 0xe8, 0xed, 0xf2, 0xf2, 0xbc, 0xe0, 0x5a, + 0x03, 0x7c, 0x82, 0x6f, 0x22, 0xca, 0xad, 0x12, 0x61, 0x46, 0x7d, 0xcf, 0xb7, 0xd6, + 0xb6, 0x13, 0x3d, 0xc2, 0x1e, 0x80, 0x96, 0xc7, 0xe9, 0xf8, 0xe9, 0xe1, 0x0c, 0x1e, + 0x3f, 0xac, 0x40, 0x58, 0xb6, 0x82, 0xc6, 0x8e, 0x54, 0xfa, 0xca, 0xe0, 0xf9, 0xc2, + 0xdd, 0x4d, 0x64, 0xd9, 0x04, 0x61, 0x52, 0xb4, 0x76, 0x23, 0x32, 0x93, 0x9f, 0x17, + 0xe6, 0xaa, 0xf7, 0xd8, 0xb9, 0xd3, 0x58, 0xe2, 0x21, 0x8d, 0x4e, 0x0d, 0x69, 0xa4, + 0xf1, 0x19, 0xe1, 0xc6, 0x4e, 0xec, 0x4c, 0x8b, 0x53, 0x28, 0x09, 0x70, 0x71, 0x31, + 0xf0, 0x1f, 0x55, 0xc7, 0xad, 0x04, 0xcf, 0xb6, 0x3f, 0x7c, 0x4a, 0x3d, 0x0a, 0x2b, + 0x0f, 0xfb, 0x0b, 0x05, 0xa6, 0xbe, 0x05, 0x5b, 0x8c, 0x94, 0xca, 0x80, 0xbb, 0x0a, + 0x1d, 0x13, 0xcd, 0x4c, 0xd6, 0x9a, 0xb9, 0x83, 0x04, 0xae, 0x25, 0x15, 0xd5, 0xf7, + 0x69, 0x9d, 0x4a, 0xbe, 0xe5, 0xc2, 0x0b, 0xe6, 0x09, 0xd8, 0x73, 0x51, 0x10, 0x12, + 0xf2, 0x34, 0xbd, 0x85, 0xa7, 0xef, 0xf5, 0xfb, 0x63, 0x4c, 0xff, 0x26, 0x58, 0xba, + 0x65, 0x16, 0x04, 0x85, 0x63, 0x09, 0x5e, 0xce, 0xfb, 0x30, 0x15, 0xee, 0x3f, 0x03, + 0xca, 0x52, 0xa1, 0x77, 0xf2, 0x61, 0xec, 0xdc, 0x26, 0xbc, 0x08, 0x9d, 0x34, 0xc6, + 0x40, 0x48, 0x46, 0xe9, 0xc6, 0x47, 0xfc, 0xfe, 0x98, 0xcc, 0x6a, 0xcd, 0xbb, 0x46, + 0x4f, 0x64, 0x27, 0x8a, 0xd8, 0xce, 0x9d, 0x1a, 0xe0, 0xd4, 0x15, 0xbc, 0x0c, 0x05, + 0x24, 0x5f, 0xdd, 0xaf, 0x4e, 0xbc, 0x8d, 0xc7, 0x03, 0xa8, 0x5c, 0xb2, 0x70, 0xf7, + 0x96, 0xad, 0x2d, 0x93, 0x7e, 0x2a, 0xc0, 0xd5, 0xe0, 0xa3, 0x48, 0x21, 0x75, 0x80, + 0x00, 0xaa, 0x59, 0xc9, 0xd4, 0x65, 0x24, 0x85, 0x29, 0x4e, 0xe0, 0xab, 0x29, 0x69, + 0x6b, 0x21, 0x43, 0x0f, 0xa5, 0x4d, 0xcf, 0xbf, 0x2b, 0x9c, 0x49, 0xd1, 0x42, 0x06, + 0x42, 0x09, 0xee, 0xee, 0xd4, 0xd4, 0x71, 0xff, 0xc0, 0x17, 0xd4, 0xe2, 0x0a, 0x79, + 0x6b, 0x09, 0x27, 0x80, 0x4c, 0x06, 0x1b, 0x9f, + ], + c_enc: [ + 0x59, 0x9a, 0x4d, 0x9f, 0x53, 0x3c, 0x46, 0xa9, 0x6f, 0x92, 0xaf, 0x8c, 0x08, 0xae, + 0x59, 0x71, 0x10, 0x23, 0x0e, 0xb8, 0x41, 0xc2, 0xf7, 0xc9, 0xd4, 0xf1, 0x45, 0x87, + 0x76, 0x36, 0xc8, 0x9d, 0xd8, 0xf3, 0x84, 0xa9, 0x40, 0xdc, 0x89, 0x72, 0x55, 0x53, + 0x57, 0xbc, 0x07, 0x48, 0x2a, 0x0a, 0x32, 0x3d, 0x87, 0xae, 0x10, 0xeb, 0x99, 0x82, + 0x5a, 0xe4, 0xe0, 0x06, 0x0e, 0x25, 0x6c, 0x3c, 0x3b, 0xeb, 0xa3, 0x2f, 0xa2, 0xb2, + 0xd2, 0x7f, 0x04, 0x6f, 0x7a, 0x93, 0x6d, 0xf8, 0xa9, 0x61, 0xc8, 0x18, 0x4e, 0xe3, + 0xc6, 0x8e, 0xbc, 0xe9, 0x80, 0x64, 0x45, 0xb4, 0x3e, 0x66, 0x67, 0x19, 0x95, 0xa2, + 0x43, 0x7a, 0x7f, 0x70, 0x91, 0x47, 0x14, 0x8a, 0x76, 0x03, 0x6d, 0x25, 0x5e, 0xba, + 0xc4, 0xd0, 0xd8, 0x34, 0x82, 0x93, 0x23, 0x9a, 0x78, 0x64, 0xe7, 0x9b, 0xef, 0xf7, + 0x6f, 0x61, 0x50, 0xe0, 0xc4, 0xf4, 0x7a, 0x85, 0x26, 0xe3, 0xed, 0x06, 0x75, 0xfa, + 0xc6, 0xac, 0xcc, 0x30, 0xa4, 0xd6, 0x73, 0xca, 0x80, 0x85, 0x95, 0x96, 0xfe, 0xc9, + 0xcd, 0x6a, 0x93, 0xfb, 0xa0, 0xe8, 0x9e, 0xf5, 0x3f, 0x3e, 0x26, 0x74, 0xd3, 0x2a, + 0x4b, 0x43, 0xf9, 0xa4, 0x38, 0x7d, 0xce, 0x33, 0xac, 0xa1, 0xe4, 0xff, 0xdc, 0x6d, + 0x2d, 0x31, 0x89, 0xc6, 0x23, 0xca, 0x56, 0x4d, 0x03, 0xac, 0x5b, 0x35, 0xb1, 0xa7, + 0x47, 0xff, 0x44, 0x6b, 0xc2, 0x5e, 0xd2, 0x2d, 0x09, 0x68, 0x2c, 0xef, 0x3a, 0x30, + 0xff, 0xa5, 0xc4, 0x0e, 0x27, 0x70, 0xf1, 0x84, 0x98, 0xb1, 0x2f, 0x86, 0x8b, 0xa9, + 0x2a, 0x13, 0xaa, 0x4f, 0xa2, 0x14, 0xb0, 0x62, 0xe3, 0x64, 0x9c, 0xf9, 0xc8, 0x5e, + 0x7a, 0x8a, 0x55, 0xf5, 0xf3, 0xdd, 0x68, 0x84, 0x2a, 0xea, 0x7c, 0x92, 0x79, 0x2a, + 0x52, 0x60, 0x0f, 0x86, 0x6c, 0x34, 0xa1, 0x0c, 0x51, 0x14, 0x13, 0x62, 0x02, 0x24, + 0xfb, 0x85, 0xaf, 0xc6, 0x06, 0xdd, 0x4f, 0x7b, 0x2f, 0x76, 0xbe, 0x76, 0x0c, 0xa1, + 0x94, 0xb6, 0xd4, 0x88, 0x2e, 0x5a, 0x4a, 0x76, 0x3d, 0x75, 0x0d, 0xb7, 0xe1, 0x68, + 0xa4, 0x18, 0x11, 0x92, 0x35, 0xda, 0xf9, 0xcb, 0x1b, 0xdb, 0x07, 0xff, 0x46, 0x83, + 0x3a, 0x87, 0xa3, 0x92, 0x6b, 0x14, 0xa5, 0x26, 0x4f, 0x10, 0x4f, 0x7f, 0x89, 0xf7, + 0x6f, 0x10, 0x10, 0x8f, 0x2b, 0x6e, 0xa5, 0x05, 0xd4, 0xf0, 0xd2, 0x6d, 0x58, 0x31, + 0x1c, 0xc7, 0x21, 0x9c, 0x6b, 0xc4, 0x38, 0xd0, 0xe1, 0xb3, 0x17, 0x60, 0x18, 0x73, + 0x9e, 0x6f, 0x75, 0xd0, 0x73, 0x59, 0xf5, 0xe8, 0x95, 0x7e, 0x12, 0xc3, 0x03, 0xaa, + 0x52, 0x9b, 0x11, 0xa1, 0x81, 0x66, 0x25, 0xa1, 0x20, 0xf3, 0x6d, 0xcd, 0xdd, 0xff, + 0x9c, 0x65, 0xbc, 0xac, 0x8f, 0x10, 0x67, 0xc7, 0xfe, 0x88, 0xf6, 0x44, 0x85, 0x94, + 0xcf, 0x1d, 0xff, 0x8e, 0x29, 0x00, 0xae, 0x84, 0xd2, 0xa7, 0xc8, 0x1b, 0x90, 0x6d, + 0xd0, 0xbc, 0x86, 0x96, 0xe3, 0x70, 0x98, 0x07, 0x4b, 0x75, 0xd8, 0x38, 0xd8, 0xab, + 0xdc, 0x90, 0x46, 0x08, 0x2b, 0xe4, 0xa6, 0x09, 0x95, 0xc4, 0xf4, 0xed, 0x80, 0xe2, + 0xd7, 0x87, 0x38, 0x25, 0x77, 0x3b, 0xa6, 0x3e, 0xe4, 0xcb, 0x97, 0x36, 0x9a, 0x50, + 0x70, 0xb5, 0x72, 0x5c, 0x5f, 0xeb, 0x32, 0x62, 0x45, 0x87, 0x80, 0x1e, 0x5a, 0xc0, + 0x30, 0xe6, 0x45, 0xbd, 0xf2, 0xe5, 0x86, 0xcf, 0x98, 0x66, 0xea, 0xfb, 0x76, 0xf5, + 0x59, 0x76, 0xa3, 0x3d, 0x62, 0xae, 0xdc, 0x76, 0x27, 0x78, 0x3b, 0x48, 0x48, 0x93, + 0x61, 0xf9, 0x9c, 0xae, 0xb1, 0xb1, 0x9c, 0x55, 0x22, 0x58, 0x9f, 0xd2, 0x1d, 0x51, + 0x45, 0x49, 0xd7, 0x4a, 0xb1, 0x92, 0x25, 0xed, 0x6e, 0x4c, 0x20, 0x3a, 0xdd, 0xfa, + 0x55, 0xfc, 0x9e, 0xc9, 0x89, 0xb6, 0x69, 0x02, 0x3c, 0xf3, 0x05, 0xb4, 0x2b, 0x33, + 0x0f, 0xc2, 0x30, 0x80, 0xab, 0xe4, 0x25, 0x01, 0xe5, 0x9c, 0x85, 0x1c, 0x54, 0xc7, + 0x49, 0x66, 0xf6, 0x0b, 0xe9, 0xdc, 0x56, 0x1a, 0x2d, 0x91, 0xf5, 0xd3, 0x2a, 0xdd, + 0x19, 0xb8, 0x9a, 0xca, 0xbe, 0x92, 0x1b, 0x99, 0x25, 0x3a, 0xfe, 0xfb, 0x2f, 0xf6, + 0x42, 0xd8, 0x6e, 0x65, 0x59, 0x51, 0x95, 0x8e, 0xfb, 0x82, 0xab, 0xe5, 0x84, 0x5d, + 0xad, 0xf0, 0x13, 0x27, 0x03, 0x7e, 0xda, 0x01, 0xf9, 0x97, 0xd4, 0x19, 0x4f, 0x97, + 0xb7, 0xd7, 0xef, 0xa4, 0xf4, 0xd0, 0x18, 0x2d, 0xa4, 0xc4, + ], + ock: [ + 0x9d, 0x33, 0x8d, 0x19, 0x91, 0xba, 0x13, 0xfe, 0xe7, 0x37, 0x70, 0x9b, 0x7a, 0xbb, + 0x50, 0x77, 0x8d, 0xe1, 0xd8, 0x2f, 0xdb, 0x6b, 0x34, 0x7f, 0x58, 0xdd, 0xf5, 0x78, + 0xdd, 0x54, 0x42, 0xd7, + ], + op: [ + 0x49, 0x19, 0x01, 0x2e, 0x40, 0x43, 0x82, 0xeb, 0xee, 0x8e, 0x60, 0xe9, 0xd4, 0xf1, + 0x30, 0x79, 0xc0, 0x8d, 0x9c, 0x6d, 0x50, 0xf9, 0x35, 0x86, 0x7d, 0x33, 0x01, 0xf6, + 0x89, 0xcf, 0xf9, 0x1e, 0xc0, 0xdb, 0x43, 0x69, 0x10, 0x03, 0x45, 0x7d, 0x61, 0xfb, + 0x58, 0x93, 0x20, 0x26, 0xf9, 0xdd, 0x2c, 0x35, 0xb9, 0x05, 0x7f, 0xad, 0x50, 0xd8, + 0x44, 0x72, 0x83, 0xf9, 0x4e, 0xd5, 0x95, 0x3d, + ], + c_out: [ + 0x1f, 0x61, 0xfa, 0x64, 0x74, 0xce, 0xd5, 0x5b, 0xcf, 0xc9, 0x40, 0x5f, 0x9b, 0x07, + 0xc6, 0x02, 0xb9, 0x71, 0x4b, 0xf4, 0x02, 0x1d, 0x59, 0x4d, 0x72, 0xcf, 0xc6, 0x46, + 0x13, 0xd9, 0x01, 0x0c, 0x92, 0x4a, 0x7a, 0xc6, 0x74, 0x5d, 0x04, 0x8b, 0x15, 0xcc, + 0x94, 0xc4, 0x86, 0x4d, 0x1e, 0x0b, 0x4b, 0x43, 0x55, 0xac, 0x8e, 0xbb, 0x40, 0xee, + 0x36, 0x14, 0x00, 0x11, 0xf4, 0xc0, 0x1b, 0x3f, 0x53, 0xc0, 0xf6, 0x3a, 0xb5, 0x64, + 0x74, 0x81, 0x27, 0x73, 0x0e, 0x6c, 0x58, 0x4a, 0xf9, 0xb3, + ], + }, + TestVector { + incoming_viewing_key: [ + 0x53, 0x3d, 0xc3, 0xd4, 0x93, 0xf2, 0xb8, 0x7a, 0x03, 0x3d, 0xf5, 0x07, 0x05, 0xf2, + 0x90, 0x54, 0x16, 0x38, 0xe9, 0x08, 0x7d, 0xcd, 0xbc, 0xfe, 0x52, 0x7e, 0x77, 0x5a, + 0xaf, 0x09, 0x30, 0x29, 0xac, 0xec, 0x74, 0xdd, 0xe6, 0x02, 0xfc, 0x7c, 0x73, 0xcb, + 0x38, 0x50, 0xbd, 0xfb, 0xf2, 0x61, 0x79, 0x4c, 0x9c, 0x29, 0x9d, 0x0b, 0x98, 0xee, + 0x0f, 0x20, 0x71, 0xd6, 0xd4, 0xe3, 0x7b, 0x05, + ], + ovk: [ + 0x32, 0x4d, 0xce, 0x2a, 0x1e, 0xa1, 0xe4, 0x30, 0x4f, 0x49, 0xe4, 0x3a, 0xe0, 0x65, + 0xe3, 0xfb, 0x19, 0x6f, 0x76, 0xd9, 0xb8, 0x79, 0xc7, 0x20, 0x08, 0x62, 0xea, 0xd1, + 0x8d, 0xea, 0x5f, 0xb6, + ], + default_d: [ + 0x20, 0x8c, 0x6d, 0x90, 0x6c, 0xfa, 0x93, 0xf1, 0x2d, 0x6a, 0x7e, + ], + default_pk_d: [ + 0x64, 0xce, 0xac, 0xec, 0x3c, 0x2e, 0xa7, 0x9c, 0x4c, 0xd3, 0xe2, 0xf0, 0xfb, 0xb9, + 0xe1, 0xd4, 0x39, 0x55, 0xae, 0x66, 0xd8, 0x93, 0x92, 0xbf, 0x48, 0xaf, 0xb6, 0xc4, + 0xab, 0x00, 0xa0, 0x28, + ], + v: 12711846894898776584, + rseed: [ + 0x7b, 0xdc, 0x8b, 0xa3, 0xe4, 0xe3, 0xd1, 0xd9, 0x33, 0xbf, 0xb5, 0x80, 0xf5, 0xb3, + 0xe8, 0x7a, 0x2a, 0x06, 0x51, 0x70, 0x51, 0x41, 0x0f, 0xe1, 0xb4, 0xff, 0x1e, 0xa0, + 0xad, 0xe8, 0x24, 0xf3, + ], + asset: [ + 0xf9, 0x78, 0x1e, 0xbe, 0x31, 0x7a, 0x07, 0x10, 0xae, 0x54, 0x61, 0xe3, 0x4f, 0xe6, + 0xf1, 0xb1, 0xaa, 0x9b, 0x4e, 0x67, 0xb1, 0x49, 0x10, 0x98, 0x48, 0x02, 0xc2, 0xa7, + 0xe3, 0x81, 0x93, 0xbc, + ], + memo: [ + 0xff, 0x38, 0x51, 0x54, 0x56, 0xa5, 0x7c, 0x7a, 0x91, 0x6a, 0x74, 0x38, 0x8e, 0xe8, + 0xf1, 0x28, 0x1f, 0x9a, 0xde, 0x0a, 0xe2, 0xa2, 0x61, 0x3a, 0x06, 0x12, 0xc4, 0x69, + 0xdf, 0x79, 0x2b, 0x8d, 0xf4, 0xca, 0xe4, 0xfc, 0x25, 0xc1, 0xca, 0xdb, 0xa9, 0x5a, + 0x80, 0x7c, 0xe6, 0x1e, 0x5a, 0x53, 0x03, 0xfa, 0xaf, 0x9e, 0x14, 0x65, 0x39, 0x96, + 0xb5, 0xa8, 0xad, 0xc3, 0x4f, 0xd4, 0x75, 0xef, 0x14, 0x99, 0x09, 0x4b, 0xab, 0xaf, + 0x1f, 0x3f, 0x07, 0xda, 0x9a, 0x39, 0x0b, 0x1d, 0x9f, 0xc9, 0xa0, 0x83, 0x27, 0x98, + 0x7a, 0xdf, 0xe9, 0x56, 0x48, 0x63, 0xfb, 0xdf, 0xa8, 0xf6, 0xb4, 0x6a, 0x88, 0x41, + 0x58, 0x30, 0x99, 0xaf, 0xb7, 0x87, 0x01, 0x18, 0xfa, 0xce, 0x76, 0x34, 0x7e, 0x40, + 0xb6, 0xfd, 0x8c, 0xd1, 0x55, 0x82, 0xae, 0x8e, 0x23, 0xbe, 0x9a, 0x02, 0x19, 0xbc, + 0x3e, 0x4e, 0x45, 0x46, 0xa3, 0x0d, 0x3b, 0xbb, 0xbd, 0x16, 0x86, 0x08, 0x68, 0x76, + 0xbe, 0x0e, 0x4c, 0x85, 0x9b, 0xe7, 0x1f, 0xb5, 0x8f, 0x4f, 0xab, 0x3d, 0x28, 0xc0, + 0xb4, 0xf7, 0xe7, 0x5a, 0xd1, 0xed, 0xb7, 0xf8, 0x89, 0x46, 0xfb, 0x40, 0xcf, 0xa5, + 0x78, 0x6a, 0x0f, 0xcb, 0xa1, 0x30, 0x3c, 0x83, 0x47, 0xec, 0xee, 0x93, 0xd4, 0x6d, + 0x14, 0x0b, 0xb5, 0xf6, 0x95, 0x31, 0xd6, 0x66, 0x54, 0x8b, 0x10, 0x9c, 0xe7, 0x64, + 0xbe, 0xad, 0x7c, 0x87, 0xbd, 0x4c, 0x87, 0x64, 0x94, 0xde, 0x82, 0xdb, 0x6e, 0x50, + 0x73, 0xa6, 0xc9, 0x4f, 0x7c, 0x09, 0x9a, 0x40, 0xd7, 0xa3, 0x1c, 0x4a, 0x04, 0xb6, + 0x9c, 0x9f, 0xcc, 0xf3, 0xc7, 0xdd, 0x56, 0xf5, 0x54, 0x47, 0x76, 0xc5, 0x3b, 0x4d, + 0xf7, 0x95, 0x39, 0x81, 0xd5, 0x5a, 0x96, 0xa6, 0xdc, 0xff, 0x99, 0x04, 0xa9, 0x08, + 0x42, 0xe5, 0xba, 0xfe, 0xc8, 0x84, 0x0c, 0x2d, 0x25, 0x5b, 0xf5, 0xad, 0x61, 0xc4, + 0x60, 0xf9, 0x8f, 0xeb, 0x82, 0xa1, 0x0f, 0xa1, 0xc0, 0x99, 0xf6, 0x27, 0x76, 0x79, + 0x82, 0x36, 0xc5, 0xca, 0x7f, 0x1e, 0x46, 0xeb, 0xdb, 0x2b, 0x14, 0x4d, 0x87, 0x13, + 0xe5, 0x6c, 0x77, 0x2f, 0x2c, 0x3b, 0x86, 0x0e, 0xa5, 0xb0, 0x3a, 0x88, 0x54, 0xbc, + 0x6e, 0x65, 0x90, 0xd6, 0x3c, 0xc0, 0xea, 0x54, 0xf1, 0x0b, 0x73, 0xba, 0x24, 0x1b, + 0xf7, 0x4b, 0x63, 0x55, 0x51, 0xa2, 0xaa, 0xca, 0x96, 0x87, 0xac, 0x52, 0x69, 0xfd, + 0x36, 0x8b, 0x26, 0xd7, 0x0a, 0x73, 0x7f, 0x26, 0x76, 0x85, 0x99, 0x8a, 0x3f, 0x7d, + 0x26, 0x37, 0x91, 0x49, 0x09, 0xc7, 0x46, 0x49, 0x5d, 0x24, 0xc4, 0x98, 0x63, 0x5e, + 0xf9, 0x7a, 0xc6, 0x6a, 0x40, 0x08, 0x94, 0xc0, 0x9f, 0x73, 0x48, 0x8e, 0xb7, 0xcf, + 0x33, 0xf6, 0xda, 0xd1, 0x66, 0x6a, 0x05, 0xf9, 0x1a, 0xd7, 0x75, 0x79, 0x65, 0xc2, + 0x99, 0x36, 0xe7, 0xfa, 0x48, 0xd7, 0x7e, 0x89, 0xee, 0x09, 0x62, 0xf5, 0x8c, 0x05, + 0x1d, 0x11, 0xd0, 0x55, 0xfc, 0xe2, 0x04, 0xa5, 0x62, 0xde, 0x68, 0x08, 0x8a, 0x1b, + 0x26, 0x48, 0xb8, 0x17, 0x4c, 0xbc, 0xfc, 0x8b, 0x5b, 0x5c, 0xd0, 0x77, 0x11, 0x5a, + 0xfd, 0xe1, 0x84, 0x05, 0x05, 0x4e, 0x5d, 0xa9, 0xa0, 0x43, 0x10, 0x34, 0x2c, 0x5d, + 0x3b, 0x52, 0x6e, 0x0b, 0x02, 0xc5, 0xca, 0x17, 0x22, 0xba, 0xde, 0xee, 0x23, 0xd1, + 0x45, 0xe8, 0xeb, 0x22, 0x13, 0xfc, 0x4a, 0xf1, 0xe4, 0x50, 0xe4, 0xd5, 0x21, 0x7c, + 0x66, 0x17, 0x00, 0x8c, 0x78, 0xf4, 0xfb, 0x11, 0x12, 0xf4, 0x02, 0x8a, 0x70, 0x4f, + 0xc5, 0xa9, 0x38, 0x2c, 0x6b, 0x03, 0xe7, 0xd8, 0x08, 0x5e, 0x90, 0x6c, 0xf8, 0x4c, + 0xa2, 0xc1, 0x20, 0x7c, 0x87, 0xa2, 0xbc, 0xe2, + ], + cv_net: [ + 0x5d, 0xd1, 0x3d, 0xcf, 0x9a, 0xf3, 0x52, 0xf5, 0xfe, 0x0b, 0x2b, 0xcb, 0xd0, 0xdb, + 0xd7, 0xda, 0xfb, 0xbe, 0x53, 0xb0, 0xa9, 0x6b, 0x08, 0x1c, 0x90, 0xba, 0xde, 0xd9, + 0xbe, 0x4b, 0x4f, 0x87, + ], + rho: [ + 0x56, 0xbc, 0x48, 0x21, 0xa5, 0x3d, 0x5e, 0x9e, 0x6d, 0x7a, 0x04, 0x44, 0x44, 0x45, + 0x4f, 0xfb, 0xc2, 0x36, 0x9c, 0xb1, 0x48, 0xeb, 0x76, 0xf1, 0xed, 0xf1, 0xb5, 0xc7, + 0x41, 0x84, 0x28, 0x2a, + ], + cmx: [ + 0x1e, 0xaa, 0x25, 0x97, 0xb0, 0x8f, 0x7c, 0x9c, 0x57, 0x9c, 0xe1, 0x43, 0xb7, 0xfb, + 0x2b, 0x10, 0x33, 0x82, 0xff, 0x63, 0x77, 0xb1, 0xc8, 0xbf, 0xbc, 0xcd, 0x8d, 0xa2, + 0x97, 0xe0, 0xa9, 0x0c, + ], + esk: [ + 0x9b, 0x32, 0x77, 0x19, 0x3b, 0x63, 0x60, 0x8e, 0x6a, 0x3d, 0xdf, 0x7c, 0xe2, 0xd2, + 0x33, 0x58, 0x4e, 0x66, 0x17, 0xd6, 0xf6, 0xa2, 0x1c, 0xdc, 0x86, 0x48, 0x56, 0x2c, + 0xbd, 0x86, 0x3f, 0x09, + ], + ephemeral_key: [ + 0x5a, 0x48, 0x58, 0x15, 0xc4, 0xa7, 0x47, 0x06, 0xe9, 0xde, 0x87, 0xfa, 0x60, 0xa2, + 0x81, 0x6f, 0x89, 0x0b, 0xe3, 0xdb, 0x54, 0xeb, 0x3f, 0x4b, 0xaf, 0x37, 0xdb, 0xc9, + 0xbd, 0xe5, 0xfe, 0x9d, + ], + shared_secret: [ + 0x96, 0x8d, 0xf2, 0xe8, 0x5d, 0x7b, 0xd1, 0x08, 0xf5, 0x72, 0x12, 0x53, 0x93, 0x76, + 0xaf, 0x25, 0x83, 0x2e, 0xf4, 0xdb, 0xd6, 0x40, 0x2a, 0x41, 0x4d, 0x73, 0xc5, 0x6b, + 0xee, 0xe4, 0xf2, 0xa8, + ], + k_enc: [ + 0xf7, 0x73, 0x91, 0x24, 0x3f, 0xdb, 0x35, 0xb2, 0x26, 0x94, 0xdb, 0x91, 0xde, 0xbd, + 0x78, 0x55, 0x79, 0x3c, 0xa7, 0x1e, 0x82, 0xbd, 0xc2, 0xee, 0x74, 0xc9, 0xb7, 0xb6, + 0x97, 0xc0, 0x24, 0x71, + ], + p_enc: [ + 0x03, 0x20, 0x8c, 0x6d, 0x90, 0x6c, 0xfa, 0x93, 0xf1, 0x2d, 0x6a, 0x7e, 0x08, 0x0a, + 0x98, 0x91, 0x66, 0x8d, 0x69, 0xb0, 0x7b, 0xdc, 0x8b, 0xa3, 0xe4, 0xe3, 0xd1, 0xd9, + 0x33, 0xbf, 0xb5, 0x80, 0xf5, 0xb3, 0xe8, 0x7a, 0x2a, 0x06, 0x51, 0x70, 0x51, 0x41, + 0x0f, 0xe1, 0xb4, 0xff, 0x1e, 0xa0, 0xad, 0xe8, 0x24, 0xf3, 0xf9, 0x78, 0x1e, 0xbe, + 0x31, 0x7a, 0x07, 0x10, 0xae, 0x54, 0x61, 0xe3, 0x4f, 0xe6, 0xf1, 0xb1, 0xaa, 0x9b, + 0x4e, 0x67, 0xb1, 0x49, 0x10, 0x98, 0x48, 0x02, 0xc2, 0xa7, 0xe3, 0x81, 0x93, 0xbc, + 0xff, 0x38, 0x51, 0x54, 0x56, 0xa5, 0x7c, 0x7a, 0x91, 0x6a, 0x74, 0x38, 0x8e, 0xe8, + 0xf1, 0x28, 0x1f, 0x9a, 0xde, 0x0a, 0xe2, 0xa2, 0x61, 0x3a, 0x06, 0x12, 0xc4, 0x69, + 0xdf, 0x79, 0x2b, 0x8d, 0xf4, 0xca, 0xe4, 0xfc, 0x25, 0xc1, 0xca, 0xdb, 0xa9, 0x5a, + 0x80, 0x7c, 0xe6, 0x1e, 0x5a, 0x53, 0x03, 0xfa, 0xaf, 0x9e, 0x14, 0x65, 0x39, 0x96, + 0xb5, 0xa8, 0xad, 0xc3, 0x4f, 0xd4, 0x75, 0xef, 0x14, 0x99, 0x09, 0x4b, 0xab, 0xaf, + 0x1f, 0x3f, 0x07, 0xda, 0x9a, 0x39, 0x0b, 0x1d, 0x9f, 0xc9, 0xa0, 0x83, 0x27, 0x98, + 0x7a, 0xdf, 0xe9, 0x56, 0x48, 0x63, 0xfb, 0xdf, 0xa8, 0xf6, 0xb4, 0x6a, 0x88, 0x41, + 0x58, 0x30, 0x99, 0xaf, 0xb7, 0x87, 0x01, 0x18, 0xfa, 0xce, 0x76, 0x34, 0x7e, 0x40, + 0xb6, 0xfd, 0x8c, 0xd1, 0x55, 0x82, 0xae, 0x8e, 0x23, 0xbe, 0x9a, 0x02, 0x19, 0xbc, + 0x3e, 0x4e, 0x45, 0x46, 0xa3, 0x0d, 0x3b, 0xbb, 0xbd, 0x16, 0x86, 0x08, 0x68, 0x76, + 0xbe, 0x0e, 0x4c, 0x85, 0x9b, 0xe7, 0x1f, 0xb5, 0x8f, 0x4f, 0xab, 0x3d, 0x28, 0xc0, + 0xb4, 0xf7, 0xe7, 0x5a, 0xd1, 0xed, 0xb7, 0xf8, 0x89, 0x46, 0xfb, 0x40, 0xcf, 0xa5, + 0x78, 0x6a, 0x0f, 0xcb, 0xa1, 0x30, 0x3c, 0x83, 0x47, 0xec, 0xee, 0x93, 0xd4, 0x6d, + 0x14, 0x0b, 0xb5, 0xf6, 0x95, 0x31, 0xd6, 0x66, 0x54, 0x8b, 0x10, 0x9c, 0xe7, 0x64, + 0xbe, 0xad, 0x7c, 0x87, 0xbd, 0x4c, 0x87, 0x64, 0x94, 0xde, 0x82, 0xdb, 0x6e, 0x50, + 0x73, 0xa6, 0xc9, 0x4f, 0x7c, 0x09, 0x9a, 0x40, 0xd7, 0xa3, 0x1c, 0x4a, 0x04, 0xb6, + 0x9c, 0x9f, 0xcc, 0xf3, 0xc7, 0xdd, 0x56, 0xf5, 0x54, 0x47, 0x76, 0xc5, 0x3b, 0x4d, + 0xf7, 0x95, 0x39, 0x81, 0xd5, 0x5a, 0x96, 0xa6, 0xdc, 0xff, 0x99, 0x04, 0xa9, 0x08, + 0x42, 0xe5, 0xba, 0xfe, 0xc8, 0x84, 0x0c, 0x2d, 0x25, 0x5b, 0xf5, 0xad, 0x61, 0xc4, + 0x60, 0xf9, 0x8f, 0xeb, 0x82, 0xa1, 0x0f, 0xa1, 0xc0, 0x99, 0xf6, 0x27, 0x76, 0x79, + 0x82, 0x36, 0xc5, 0xca, 0x7f, 0x1e, 0x46, 0xeb, 0xdb, 0x2b, 0x14, 0x4d, 0x87, 0x13, + 0xe5, 0x6c, 0x77, 0x2f, 0x2c, 0x3b, 0x86, 0x0e, 0xa5, 0xb0, 0x3a, 0x88, 0x54, 0xbc, + 0x6e, 0x65, 0x90, 0xd6, 0x3c, 0xc0, 0xea, 0x54, 0xf1, 0x0b, 0x73, 0xba, 0x24, 0x1b, + 0xf7, 0x4b, 0x63, 0x55, 0x51, 0xa2, 0xaa, 0xca, 0x96, 0x87, 0xac, 0x52, 0x69, 0xfd, + 0x36, 0x8b, 0x26, 0xd7, 0x0a, 0x73, 0x7f, 0x26, 0x76, 0x85, 0x99, 0x8a, 0x3f, 0x7d, + 0x26, 0x37, 0x91, 0x49, 0x09, 0xc7, 0x46, 0x49, 0x5d, 0x24, 0xc4, 0x98, 0x63, 0x5e, + 0xf9, 0x7a, 0xc6, 0x6a, 0x40, 0x08, 0x94, 0xc0, 0x9f, 0x73, 0x48, 0x8e, 0xb7, 0xcf, + 0x33, 0xf6, 0xda, 0xd1, 0x66, 0x6a, 0x05, 0xf9, 0x1a, 0xd7, 0x75, 0x79, 0x65, 0xc2, + 0x99, 0x36, 0xe7, 0xfa, 0x48, 0xd7, 0x7e, 0x89, 0xee, 0x09, 0x62, 0xf5, 0x8c, 0x05, + 0x1d, 0x11, 0xd0, 0x55, 0xfc, 0xe2, 0x04, 0xa5, 0x62, 0xde, 0x68, 0x08, 0x8a, 0x1b, + 0x26, 0x48, 0xb8, 0x17, 0x4c, 0xbc, 0xfc, 0x8b, 0x5b, 0x5c, 0xd0, 0x77, 0x11, 0x5a, + 0xfd, 0xe1, 0x84, 0x05, 0x05, 0x4e, 0x5d, 0xa9, 0xa0, 0x43, 0x10, 0x34, 0x2c, 0x5d, + 0x3b, 0x52, 0x6e, 0x0b, 0x02, 0xc5, 0xca, 0x17, 0x22, 0xba, 0xde, 0xee, 0x23, 0xd1, + 0x45, 0xe8, 0xeb, 0x22, 0x13, 0xfc, 0x4a, 0xf1, 0xe4, 0x50, 0xe4, 0xd5, 0x21, 0x7c, + 0x66, 0x17, 0x00, 0x8c, 0x78, 0xf4, 0xfb, 0x11, 0x12, 0xf4, 0x02, 0x8a, 0x70, 0x4f, + 0xc5, 0xa9, 0x38, 0x2c, 0x6b, 0x03, 0xe7, 0xd8, 0x08, 0x5e, 0x90, 0x6c, 0xf8, 0x4c, + 0xa2, 0xc1, 0x20, 0x7c, 0x87, 0xa2, 0xbc, 0xe2, + ], + c_enc: [ + 0xf9, 0x09, 0x97, 0x73, 0x8b, 0x14, 0xd8, 0xa8, 0x4e, 0x32, 0x74, 0xbb, 0x70, 0x76, + 0x31, 0x15, 0xb7, 0x2e, 0x0a, 0x3d, 0xde, 0x8e, 0xa4, 0x70, 0x91, 0x1f, 0xb4, 0x58, + 0x70, 0xb0, 0x14, 0x8e, 0x7d, 0x37, 0x2b, 0xf2, 0x26, 0x8b, 0x3e, 0xe8, 0xda, 0xe5, + 0xfd, 0xe5, 0xea, 0x9b, 0x61, 0x59, 0x8e, 0xf1, 0x1b, 0x73, 0x14, 0x4f, 0x75, 0x53, + 0xb2, 0x13, 0xa0, 0x4c, 0x85, 0xf2, 0x5c, 0x54, 0x6c, 0x8a, 0x38, 0xa6, 0x0e, 0x50, + 0x86, 0x08, 0xb9, 0xca, 0x59, 0x3b, 0x94, 0xd8, 0x68, 0x8d, 0x6e, 0xff, 0xa5, 0x36, + 0x04, 0xd4, 0xdb, 0xc0, 0xf3, 0x45, 0x03, 0xaa, 0xe4, 0x6f, 0x3c, 0x8a, 0x8d, 0x2e, + 0x46, 0xa8, 0x1f, 0x09, 0x12, 0x6c, 0x45, 0x36, 0xfd, 0x02, 0x58, 0xf5, 0x97, 0x40, + 0xad, 0x0d, 0xb8, 0x02, 0xcc, 0x02, 0x42, 0x53, 0x4d, 0xdf, 0x52, 0xa6, 0xbf, 0x6a, + 0x03, 0x4d, 0xe6, 0x26, 0xf0, 0x18, 0x84, 0x4a, 0xdc, 0xb2, 0x6d, 0xcd, 0xc2, 0x85, + 0x16, 0x37, 0x16, 0xdd, 0x54, 0x65, 0x1c, 0x88, 0x73, 0x53, 0xf1, 0xff, 0xef, 0xa0, + 0x37, 0x71, 0x2a, 0xc0, 0xdf, 0x3a, 0x92, 0x98, 0x19, 0x06, 0x87, 0x54, 0x9d, 0x79, + 0xc6, 0xa3, 0x60, 0x0c, 0xc1, 0xc7, 0x29, 0xa3, 0x93, 0xd4, 0x4f, 0xec, 0xe5, 0x7f, + 0xd4, 0xcb, 0x0c, 0x0f, 0xb0, 0xc7, 0x86, 0x1b, 0x92, 0x5b, 0x94, 0xcd, 0x6a, 0x26, + 0x90, 0xf0, 0x02, 0xc4, 0x3a, 0x16, 0x6e, 0x56, 0x77, 0x72, 0x9f, 0x35, 0x52, 0xae, + 0xe0, 0xf2, 0xc1, 0x95, 0xaa, 0x91, 0xb2, 0xdd, 0xe3, 0x65, 0xdd, 0x14, 0xf2, 0xf0, + 0x7b, 0x3c, 0x38, 0x34, 0x7f, 0x6c, 0x0d, 0xab, 0x82, 0x84, 0x1e, 0xba, 0xde, 0x1e, + 0xf8, 0x13, 0xf2, 0xcd, 0x88, 0x5b, 0x57, 0x84, 0x37, 0x44, 0x45, 0x24, 0x93, 0x6a, + 0x65, 0x46, 0xc4, 0x55, 0xd6, 0xc9, 0x2e, 0x6d, 0x3d, 0xc5, 0x38, 0xb6, 0xcd, 0x9f, + 0x6d, 0x4c, 0xc0, 0xd7, 0x4d, 0x7b, 0xc2, 0x46, 0x7e, 0x21, 0x5b, 0xe8, 0xc3, 0xd4, + 0xff, 0x91, 0x8a, 0x2d, 0x98, 0x71, 0x00, 0xff, 0x34, 0x02, 0x4c, 0x88, 0x62, 0x79, + 0xd6, 0x4c, 0xaf, 0xdf, 0xd9, 0x0f, 0x1c, 0x04, 0xc4, 0x6b, 0xc9, 0xd5, 0xe9, 0xe2, + 0xaf, 0xd0, 0x3a, 0xb7, 0x55, 0xe4, 0x0f, 0x08, 0x7e, 0xb5, 0x1e, 0xe3, 0xd1, 0x02, + 0xb6, 0xb0, 0x69, 0xb6, 0x50, 0xf5, 0xd8, 0x55, 0x03, 0x35, 0x47, 0x1b, 0x24, 0x46, + 0x5d, 0x93, 0x4d, 0x63, 0x34, 0x39, 0xb1, 0x08, 0xd9, 0x04, 0x2b, 0x37, 0xf9, 0xf7, + 0x2e, 0x74, 0xfd, 0x6b, 0xa0, 0x01, 0x58, 0x5b, 0x08, 0x62, 0xdb, 0x99, 0x4a, 0x5e, + 0xc1, 0x2d, 0xc9, 0x1e, 0x01, 0x48, 0x6a, 0x8d, 0xc6, 0x8a, 0xb9, 0xa3, 0x41, 0x93, + 0x52, 0x61, 0x73, 0xec, 0xc0, 0xd1, 0x55, 0xb5, 0xcd, 0xd6, 0xbc, 0x07, 0xe6, 0x3e, + 0x41, 0xaf, 0x9e, 0x52, 0x4c, 0xd3, 0xe6, 0x55, 0x5d, 0x38, 0xb4, 0x6d, 0xb2, 0xd9, + 0x9e, 0x5b, 0xa4, 0xa4, 0x95, 0xff, 0x30, 0xfe, 0xf2, 0x54, 0xc9, 0xfe, 0x7b, 0x79, + 0x0c, 0xe5, 0x6a, 0x40, 0xf4, 0x00, 0x27, 0xbb, 0x62, 0x05, 0x86, 0x38, 0xc4, 0x94, + 0x17, 0x7b, 0x7f, 0x5c, 0x8f, 0x29, 0x44, 0x9e, 0x9e, 0xc3, 0xbd, 0xb3, 0xab, 0x04, + 0x16, 0x0d, 0x96, 0xd0, 0xd4, 0x04, 0x79, 0x5d, 0x54, 0x28, 0x40, 0x82, 0xb6, 0x35, + 0x7d, 0x58, 0x1d, 0xc2, 0x64, 0x81, 0x13, 0x67, 0xbb, 0xb1, 0x31, 0x9a, 0x31, 0xf7, + 0x66, 0x4a, 0x4e, 0xca, 0x93, 0x2a, 0xbb, 0xd7, 0x33, 0xa7, 0x1a, 0x31, 0xaf, 0x23, + 0x11, 0xc4, 0x9a, 0xc9, 0xaf, 0x22, 0xf8, 0x16, 0x7b, 0x25, 0x51, 0xac, 0xf5, 0x73, + 0xd9, 0x1b, 0x40, 0x98, 0xc4, 0xde, 0xa8, 0xa9, 0x79, 0x9d, 0x9d, 0x54, 0x52, 0x0c, + 0xc6, 0x3e, 0x55, 0x71, 0x8a, 0x24, 0x85, 0xbf, 0x6f, 0x63, 0x16, 0x30, 0x7c, 0xea, + 0x21, 0x5e, 0x22, 0x22, 0x8d, 0x45, 0x34, 0x9a, 0x03, 0x50, 0x31, 0xa4, 0xcb, 0x67, + 0x7b, 0x52, 0x3a, 0x3a, 0x51, 0x25, 0x2c, 0x6c, 0x61, 0xd0, 0xe2, 0x43, 0x2b, 0x94, + 0xac, 0x9c, 0x0d, 0xb5, 0x0d, 0xbc, 0xb9, 0xa2, 0xaf, 0x76, 0xb9, 0xf9, 0x11, 0x0a, + 0xd6, 0xcc, 0x2e, 0x7d, 0xe6, 0x49, 0x3a, 0x8e, 0x3c, 0xd1, 0xab, 0xf0, 0x6f, 0x4a, + 0x2d, 0x47, 0x5e, 0xc7, 0x60, 0xeb, 0x7c, 0x36, 0xbb, 0xb1, 0x27, 0x50, 0x61, 0x10, + 0x2d, 0xb3, 0x35, 0x6e, 0x11, 0x4d, 0xbc, 0xa3, 0xc5, 0xd8, + ], + ock: [ + 0x3c, 0x85, 0x16, 0x2e, 0x48, 0x67, 0xfc, 0x45, 0x89, 0xf6, 0xc6, 0x07, 0x69, 0x3b, + 0x8f, 0x4a, 0x7e, 0x85, 0xe0, 0x19, 0xf2, 0x33, 0x2f, 0xeb, 0xff, 0x08, 0xcb, 0xad, + 0x99, 0x4b, 0x3e, 0x81, + ], + op: [ + 0x64, 0xce, 0xac, 0xec, 0x3c, 0x2e, 0xa7, 0x9c, 0x4c, 0xd3, 0xe2, 0xf0, 0xfb, 0xb9, + 0xe1, 0xd4, 0x39, 0x55, 0xae, 0x66, 0xd8, 0x93, 0x92, 0xbf, 0x48, 0xaf, 0xb6, 0xc4, + 0xab, 0x00, 0xa0, 0x28, 0x9b, 0x32, 0x77, 0x19, 0x3b, 0x63, 0x60, 0x8e, 0x6a, 0x3d, + 0xdf, 0x7c, 0xe2, 0xd2, 0x33, 0x58, 0x4e, 0x66, 0x17, 0xd6, 0xf6, 0xa2, 0x1c, 0xdc, + 0x86, 0x48, 0x56, 0x2c, 0xbd, 0x86, 0x3f, 0x09, + ], + c_out: [ + 0x92, 0x05, 0x27, 0xe0, 0x4a, 0xa5, 0x39, 0xdd, 0x95, 0x62, 0x23, 0x36, 0xea, 0x92, + 0xa8, 0xd5, 0x7a, 0x34, 0xd8, 0x7d, 0xac, 0x1c, 0x8d, 0xfd, 0x1b, 0x95, 0x4d, 0xfb, + 0x17, 0x70, 0x72, 0xfc, 0xbd, 0x1b, 0xa0, 0x7c, 0x28, 0x45, 0x1b, 0xa0, 0x99, 0xd6, + 0x3a, 0xb0, 0xb0, 0x51, 0x6d, 0x41, 0xe4, 0xb4, 0x3f, 0x04, 0xc7, 0xe3, 0xb5, 0x3a, + 0xec, 0xd0, 0xa0, 0x48, 0x34, 0x24, 0x48, 0xa8, 0x17, 0x60, 0xa4, 0x1e, 0x6e, 0x85, + 0x48, 0x02, 0x25, 0x43, 0xd6, 0x39, 0xb8, 0x9e, 0xa7, 0x46, + ], + }, + TestVector { + incoming_viewing_key: [ + 0x77, 0x5c, 0x7f, 0x5c, 0xab, 0x43, 0x86, 0x88, 0x64, 0x3d, 0xdd, 0x15, 0x8d, 0xda, + 0xed, 0xf9, 0xa0, 0xea, 0xef, 0x61, 0x4b, 0x54, 0x90, 0x60, 0xf1, 0xe4, 0xd7, 0xcc, + 0x3e, 0x7e, 0x8b, 0x64, 0x49, 0x9a, 0x81, 0x8a, 0x6d, 0x0e, 0x33, 0x57, 0x68, 0x6e, + 0x65, 0xbc, 0x27, 0x4e, 0x3f, 0x7d, 0x45, 0x5b, 0x91, 0x1f, 0x13, 0x9f, 0x19, 0xf0, + 0x81, 0x61, 0x57, 0x51, 0x91, 0x3e, 0xb4, 0x12, + ], + ovk: [ + 0x45, 0xe1, 0x59, 0x6c, 0xbf, 0x46, 0x70, 0xb7, 0xe0, 0x5d, 0xfd, 0xaf, 0xbb, 0x0c, + 0xf3, 0xdd, 0xee, 0x28, 0xd7, 0x6a, 0x82, 0x42, 0x8e, 0x8a, 0xba, 0x43, 0x64, 0xe8, + 0x4b, 0xac, 0x37, 0x92, + ], + default_d: [ + 0x2d, 0x0e, 0x22, 0xbe, 0xb8, 0x62, 0xfe, 0x52, 0xc1, 0x4c, 0xf5, + ], + default_pk_d: [ + 0x9a, 0xe4, 0x94, 0xa9, 0xfc, 0xff, 0x9b, 0x74, 0x49, 0x14, 0x53, 0x31, 0x04, 0x4f, + 0x9a, 0x02, 0x53, 0xe5, 0x24, 0xa0, 0x2c, 0x77, 0x95, 0xe9, 0x8f, 0x83, 0xec, 0x7d, + 0x96, 0xdc, 0xe6, 0xb7, + ], + v: 10238534295395242511, + rseed: [ + 0xad, 0x8c, 0x7d, 0x94, 0x37, 0xe2, 0x0e, 0x2a, 0x1f, 0x20, 0xe8, 0x18, 0xf9, 0x05, + 0x7c, 0x5a, 0xba, 0xaa, 0x2e, 0x5c, 0x15, 0xb9, 0x49, 0x45, 0xcd, 0x42, 0x4c, 0x28, + 0xa5, 0xfa, 0x38, 0x5d, + ], + asset: [ + 0x76, 0xba, 0x24, 0x3f, 0x28, 0x42, 0xb7, 0xb5, 0xfc, 0x74, 0x6a, 0xe5, 0x1b, 0x0b, + 0xc4, 0xbd, 0x4f, 0xc9, 0xfd, 0x83, 0x35, 0x65, 0xea, 0x85, 0x2b, 0x92, 0xb2, 0x24, + 0xf6, 0x99, 0x03, 0x18, + ], + memo: [ + 0xff, 0xad, 0xfe, 0x49, 0x07, 0xb2, 0x74, 0xd8, 0x42, 0x70, 0x7d, 0xb3, 0x69, 0x7a, + 0x5a, 0xe6, 0xc8, 0xf5, 0x42, 0xe5, 0xec, 0xc0, 0x7f, 0xe4, 0x73, 0x50, 0xd1, 0x01, + 0x46, 0x70, 0x21, 0x2e, 0xfe, 0x81, 0xfb, 0x7c, 0x73, 0xe8, 0x45, 0x0d, 0xf8, 0x14, + 0xef, 0x62, 0x32, 0xf7, 0x49, 0x0f, 0x63, 0xcc, 0xf0, 0x74, 0x80, 0xf8, 0x84, 0xa6, + 0x6e, 0xaf, 0xfc, 0x28, 0xfe, 0xa4, 0x48, 0xd7, 0xb4, 0x01, 0xcd, 0xae, 0x10, 0xe7, + 0xc0, 0xc7, 0xf9, 0xa7, 0xb1, 0x53, 0x31, 0x96, 0x9f, 0xc8, 0xcb, 0x36, 0x39, 0x67, + 0x73, 0xde, 0x19, 0x19, 0x31, 0xc7, 0x50, 0xf6, 0xce, 0x5c, 0xaa, 0xf2, 0x97, 0x68, + 0xeb, 0xb2, 0x7d, 0xac, 0xc7, 0x38, 0x05, 0x6a, 0x81, 0x25, 0xb4, 0x77, 0x2b, 0xf8, + 0x7a, 0xe1, 0x0a, 0x8a, 0x30, 0x9b, 0x9b, 0xd6, 0x55, 0x04, 0x3c, 0xfc, 0x31, 0x59, + 0x49, 0x43, 0x68, 0xc5, 0xab, 0x8c, 0xad, 0xb7, 0xf6, 0x71, 0xe9, 0x62, 0x6b, 0xd2, + 0x63, 0xe3, 0x11, 0x81, 0xa6, 0x04, 0xb5, 0x06, 0xa0, 0x3b, 0x43, 0x9a, 0x7f, 0xfe, + 0x43, 0x55, 0x89, 0x24, 0x77, 0xe2, 0xbd, 0xf3, 0x38, 0xc6, 0x2c, 0x39, 0x22, 0xf7, + 0xd3, 0xc9, 0xa5, 0x6c, 0x71, 0x03, 0xd9, 0x11, 0x94, 0x8a, 0x84, 0xb5, 0xae, 0x2d, + 0xbb, 0x16, 0xa3, 0x76, 0x1a, 0xdd, 0x05, 0x3a, 0x0f, 0x96, 0x7e, 0x6b, 0x5b, 0xc9, + 0x42, 0x11, 0xb6, 0x54, 0x71, 0x53, 0x26, 0x7c, 0x6e, 0xe1, 0xca, 0xd0, 0xd9, 0x74, + 0xa7, 0x10, 0x88, 0x58, 0x37, 0x35, 0xe4, 0xf6, 0x3d, 0x33, 0x15, 0x6d, 0xad, 0xd5, + 0x4c, 0x2f, 0xaf, 0x89, 0x11, 0x4a, 0x12, 0x7b, 0x97, 0xb9, 0x4c, 0xc2, 0xa2, 0x2e, + 0xf3, 0x03, 0xf4, 0x59, 0xd0, 0x4f, 0xc0, 0xb5, 0x3a, 0xce, 0x59, 0x18, 0xd4, 0x7f, + 0xf3, 0x3a, 0x55, 0x8b, 0xd7, 0x1a, 0x75, 0xf3, 0x55, 0xfb, 0xd0, 0x6b, 0xbc, 0xcf, + 0x4e, 0x02, 0xc3, 0xc0, 0xa4, 0xb6, 0x3d, 0x0c, 0xc9, 0x49, 0x80, 0x1d, 0x63, 0xa6, + 0x4c, 0xb2, 0xd3, 0x23, 0x73, 0xb2, 0xc7, 0xb2, 0x74, 0xab, 0x2d, 0xb4, 0x68, 0x21, + 0x42, 0xc8, 0xb2, 0x1d, 0x84, 0xc4, 0x81, 0xf5, 0xef, 0x21, 0xe4, 0xb5, 0xe3, 0x60, + 0x34, 0x51, 0xbf, 0x94, 0x77, 0x4d, 0x0e, 0xf4, 0x7f, 0x63, 0xfa, 0x6a, 0xbb, 0x78, + 0xd2, 0x1c, 0x19, 0x3c, 0xbe, 0x65, 0xb6, 0x95, 0xfe, 0x67, 0x42, 0x3c, 0x1e, 0x2d, + 0x31, 0x2e, 0x27, 0x76, 0xfa, 0x24, 0xec, 0xe8, 0x46, 0x83, 0xe7, 0x48, 0x76, 0xc5, + 0x5e, 0xa0, 0x36, 0x9e, 0x4e, 0xa0, 0xe8, 0x64, 0x94, 0xe0, 0x0d, 0xde, 0x23, 0x6a, + 0x16, 0x89, 0x73, 0x1f, 0x0a, 0x5d, 0x82, 0x03, 0xaf, 0xde, 0x5c, 0x42, 0x36, 0x40, + 0xb8, 0x1e, 0x4f, 0x63, 0x1c, 0x98, 0x1c, 0x11, 0xa2, 0xe1, 0xd1, 0x84, 0xc6, 0x7c, + 0x52, 0x8d, 0xf9, 0x2d, 0x53, 0xae, 0xc4, 0x4a, 0x40, 0xa4, 0xea, 0x2a, 0x13, 0x1b, + 0x47, 0x33, 0xcf, 0xe4, 0x5c, 0x6b, 0x00, 0x12, 0xc3, 0xe9, 0xe2, 0x09, 0x75, 0xba, + 0xae, 0xcb, 0x02, 0x32, 0xdf, 0x88, 0x0b, 0xd7, 0xd1, 0xde, 0x13, 0xe1, 0x34, 0x94, + 0x62, 0xec, 0x8d, 0x5d, 0xf3, 0xe7, 0x80, 0xff, 0xa7, 0x2e, 0xba, 0x8a, 0x8d, 0xf7, + 0xfc, 0xf3, 0x98, 0xec, 0x23, 0x05, 0x13, 0xca, 0x9d, 0x61, 0x23, 0xf8, 0xb9, 0xd8, + 0x17, 0x85, 0x60, 0xda, 0xf9, 0x75, 0x11, 0x19, 0x55, 0xa2, 0xbc, 0xa3, 0x42, 0x3e, + 0xee, 0xfc, 0x52, 0x7b, 0xe3, 0xa8, 0x54, 0x3e, 0xb9, 0x0a, 0x5e, 0xc0, 0x2f, 0x35, + 0xa7, 0xc6, 0x4b, 0x7d, 0xd5, 0x9a, 0x72, 0xda, 0x00, 0x74, 0x63, 0x4e, 0x01, 0xd2, + 0xab, 0xf3, 0x63, 0x7a, 0xdd, 0x77, 0xc7, 0x35, + ], + cv_net: [ + 0x43, 0x94, 0x47, 0xab, 0x14, 0x5a, 0x6f, 0x0e, 0x5a, 0x3b, 0x43, 0x63, 0x04, 0x4c, + 0x73, 0x07, 0x93, 0xf4, 0x36, 0x33, 0x1f, 0xfe, 0x66, 0x30, 0xc7, 0xca, 0x2d, 0x9b, + 0x23, 0x2a, 0xe1, 0x98, + ], + rho: [ + 0xd6, 0xff, 0xc4, 0x74, 0x88, 0xad, 0x05, 0x93, 0x89, 0x70, 0xc4, 0xb1, 0x56, 0xd0, + 0x53, 0xb9, 0x3b, 0xcb, 0xb4, 0x37, 0x57, 0x1c, 0x62, 0xf3, 0x75, 0x60, 0x7e, 0x90, + 0x4e, 0xb3, 0xa2, 0x08, + ], + cmx: [ + 0xb5, 0x62, 0x5f, 0xa5, 0xfb, 0xeb, 0xa7, 0xc9, 0xea, 0xff, 0xff, 0x7d, 0xf4, 0x75, + 0xdc, 0x82, 0x33, 0x22, 0xee, 0x88, 0x01, 0x70, 0x56, 0x45, 0xe5, 0x62, 0x7e, 0x4a, + 0xca, 0x36, 0x6c, 0x02, + ], + esk: [ + 0x24, 0x50, 0xae, 0xde, 0xb9, 0x7e, 0x62, 0xd7, 0x9c, 0xcb, 0x44, 0xb0, 0xb0, 0x4f, + 0xe7, 0x93, 0x92, 0x5d, 0x49, 0xc4, 0xc0, 0x1f, 0x49, 0x2e, 0xa9, 0xec, 0x88, 0x17, + 0x18, 0x65, 0x40, 0x33, + ], + ephemeral_key: [ + 0x51, 0x66, 0x26, 0x31, 0x6e, 0xea, 0x63, 0xa6, 0x45, 0xae, 0x56, 0x23, 0x81, 0x5a, + 0x31, 0x74, 0xb3, 0xed, 0x36, 0x64, 0xc3, 0x3e, 0x6a, 0x51, 0x81, 0xa9, 0xf5, 0xb5, + 0x42, 0x76, 0x7a, 0x2d, + ], + shared_secret: [ + 0xf6, 0x04, 0x23, 0x98, 0x7f, 0x0e, 0x67, 0x6d, 0x1a, 0x3b, 0xb6, 0xef, 0xe0, 0x39, + 0x42, 0x1d, 0xbb, 0xc8, 0x24, 0xb6, 0x90, 0xc1, 0x94, 0xa4, 0x90, 0xe4, 0x17, 0x1d, + 0xde, 0x21, 0x58, 0x19, + ], + k_enc: [ + 0x20, 0x98, 0x25, 0x7e, 0x2b, 0x9b, 0x7f, 0xc0, 0x62, 0x82, 0x38, 0x03, 0x38, 0x59, + 0x7d, 0xcb, 0x62, 0x7d, 0xdf, 0x47, 0x3e, 0x83, 0xa7, 0x2e, 0x61, 0xb0, 0xf2, 0x2c, + 0xcf, 0xaf, 0xbe, 0x4e, + ], + p_enc: [ + 0x03, 0x2d, 0x0e, 0x22, 0xbe, 0xb8, 0x62, 0xfe, 0x52, 0xc1, 0x4c, 0xf5, 0x0f, 0x12, + 0xb0, 0x11, 0xb2, 0x94, 0x16, 0x8e, 0xad, 0x8c, 0x7d, 0x94, 0x37, 0xe2, 0x0e, 0x2a, + 0x1f, 0x20, 0xe8, 0x18, 0xf9, 0x05, 0x7c, 0x5a, 0xba, 0xaa, 0x2e, 0x5c, 0x15, 0xb9, + 0x49, 0x45, 0xcd, 0x42, 0x4c, 0x28, 0xa5, 0xfa, 0x38, 0x5d, 0x76, 0xba, 0x24, 0x3f, + 0x28, 0x42, 0xb7, 0xb5, 0xfc, 0x74, 0x6a, 0xe5, 0x1b, 0x0b, 0xc4, 0xbd, 0x4f, 0xc9, + 0xfd, 0x83, 0x35, 0x65, 0xea, 0x85, 0x2b, 0x92, 0xb2, 0x24, 0xf6, 0x99, 0x03, 0x18, + 0xff, 0xad, 0xfe, 0x49, 0x07, 0xb2, 0x74, 0xd8, 0x42, 0x70, 0x7d, 0xb3, 0x69, 0x7a, + 0x5a, 0xe6, 0xc8, 0xf5, 0x42, 0xe5, 0xec, 0xc0, 0x7f, 0xe4, 0x73, 0x50, 0xd1, 0x01, + 0x46, 0x70, 0x21, 0x2e, 0xfe, 0x81, 0xfb, 0x7c, 0x73, 0xe8, 0x45, 0x0d, 0xf8, 0x14, + 0xef, 0x62, 0x32, 0xf7, 0x49, 0x0f, 0x63, 0xcc, 0xf0, 0x74, 0x80, 0xf8, 0x84, 0xa6, + 0x6e, 0xaf, 0xfc, 0x28, 0xfe, 0xa4, 0x48, 0xd7, 0xb4, 0x01, 0xcd, 0xae, 0x10, 0xe7, + 0xc0, 0xc7, 0xf9, 0xa7, 0xb1, 0x53, 0x31, 0x96, 0x9f, 0xc8, 0xcb, 0x36, 0x39, 0x67, + 0x73, 0xde, 0x19, 0x19, 0x31, 0xc7, 0x50, 0xf6, 0xce, 0x5c, 0xaa, 0xf2, 0x97, 0x68, + 0xeb, 0xb2, 0x7d, 0xac, 0xc7, 0x38, 0x05, 0x6a, 0x81, 0x25, 0xb4, 0x77, 0x2b, 0xf8, + 0x7a, 0xe1, 0x0a, 0x8a, 0x30, 0x9b, 0x9b, 0xd6, 0x55, 0x04, 0x3c, 0xfc, 0x31, 0x59, + 0x49, 0x43, 0x68, 0xc5, 0xab, 0x8c, 0xad, 0xb7, 0xf6, 0x71, 0xe9, 0x62, 0x6b, 0xd2, + 0x63, 0xe3, 0x11, 0x81, 0xa6, 0x04, 0xb5, 0x06, 0xa0, 0x3b, 0x43, 0x9a, 0x7f, 0xfe, + 0x43, 0x55, 0x89, 0x24, 0x77, 0xe2, 0xbd, 0xf3, 0x38, 0xc6, 0x2c, 0x39, 0x22, 0xf7, + 0xd3, 0xc9, 0xa5, 0x6c, 0x71, 0x03, 0xd9, 0x11, 0x94, 0x8a, 0x84, 0xb5, 0xae, 0x2d, + 0xbb, 0x16, 0xa3, 0x76, 0x1a, 0xdd, 0x05, 0x3a, 0x0f, 0x96, 0x7e, 0x6b, 0x5b, 0xc9, + 0x42, 0x11, 0xb6, 0x54, 0x71, 0x53, 0x26, 0x7c, 0x6e, 0xe1, 0xca, 0xd0, 0xd9, 0x74, + 0xa7, 0x10, 0x88, 0x58, 0x37, 0x35, 0xe4, 0xf6, 0x3d, 0x33, 0x15, 0x6d, 0xad, 0xd5, + 0x4c, 0x2f, 0xaf, 0x89, 0x11, 0x4a, 0x12, 0x7b, 0x97, 0xb9, 0x4c, 0xc2, 0xa2, 0x2e, + 0xf3, 0x03, 0xf4, 0x59, 0xd0, 0x4f, 0xc0, 0xb5, 0x3a, 0xce, 0x59, 0x18, 0xd4, 0x7f, + 0xf3, 0x3a, 0x55, 0x8b, 0xd7, 0x1a, 0x75, 0xf3, 0x55, 0xfb, 0xd0, 0x6b, 0xbc, 0xcf, + 0x4e, 0x02, 0xc3, 0xc0, 0xa4, 0xb6, 0x3d, 0x0c, 0xc9, 0x49, 0x80, 0x1d, 0x63, 0xa6, + 0x4c, 0xb2, 0xd3, 0x23, 0x73, 0xb2, 0xc7, 0xb2, 0x74, 0xab, 0x2d, 0xb4, 0x68, 0x21, + 0x42, 0xc8, 0xb2, 0x1d, 0x84, 0xc4, 0x81, 0xf5, 0xef, 0x21, 0xe4, 0xb5, 0xe3, 0x60, + 0x34, 0x51, 0xbf, 0x94, 0x77, 0x4d, 0x0e, 0xf4, 0x7f, 0x63, 0xfa, 0x6a, 0xbb, 0x78, + 0xd2, 0x1c, 0x19, 0x3c, 0xbe, 0x65, 0xb6, 0x95, 0xfe, 0x67, 0x42, 0x3c, 0x1e, 0x2d, + 0x31, 0x2e, 0x27, 0x76, 0xfa, 0x24, 0xec, 0xe8, 0x46, 0x83, 0xe7, 0x48, 0x76, 0xc5, + 0x5e, 0xa0, 0x36, 0x9e, 0x4e, 0xa0, 0xe8, 0x64, 0x94, 0xe0, 0x0d, 0xde, 0x23, 0x6a, + 0x16, 0x89, 0x73, 0x1f, 0x0a, 0x5d, 0x82, 0x03, 0xaf, 0xde, 0x5c, 0x42, 0x36, 0x40, + 0xb8, 0x1e, 0x4f, 0x63, 0x1c, 0x98, 0x1c, 0x11, 0xa2, 0xe1, 0xd1, 0x84, 0xc6, 0x7c, + 0x52, 0x8d, 0xf9, 0x2d, 0x53, 0xae, 0xc4, 0x4a, 0x40, 0xa4, 0xea, 0x2a, 0x13, 0x1b, + 0x47, 0x33, 0xcf, 0xe4, 0x5c, 0x6b, 0x00, 0x12, 0xc3, 0xe9, 0xe2, 0x09, 0x75, 0xba, + 0xae, 0xcb, 0x02, 0x32, 0xdf, 0x88, 0x0b, 0xd7, 0xd1, 0xde, 0x13, 0xe1, 0x34, 0x94, + 0x62, 0xec, 0x8d, 0x5d, 0xf3, 0xe7, 0x80, 0xff, 0xa7, 0x2e, 0xba, 0x8a, 0x8d, 0xf7, + 0xfc, 0xf3, 0x98, 0xec, 0x23, 0x05, 0x13, 0xca, 0x9d, 0x61, 0x23, 0xf8, 0xb9, 0xd8, + 0x17, 0x85, 0x60, 0xda, 0xf9, 0x75, 0x11, 0x19, 0x55, 0xa2, 0xbc, 0xa3, 0x42, 0x3e, + 0xee, 0xfc, 0x52, 0x7b, 0xe3, 0xa8, 0x54, 0x3e, 0xb9, 0x0a, 0x5e, 0xc0, 0x2f, 0x35, + 0xa7, 0xc6, 0x4b, 0x7d, 0xd5, 0x9a, 0x72, 0xda, 0x00, 0x74, 0x63, 0x4e, 0x01, 0xd2, + 0xab, 0xf3, 0x63, 0x7a, 0xdd, 0x77, 0xc7, 0x35, + ], + c_enc: [ + 0xa4, 0x01, 0xab, 0x60, 0x1f, 0x8d, 0x69, 0xd9, 0x38, 0x0c, 0x3d, 0xef, 0x1f, 0x1a, + 0x34, 0xbe, 0x6c, 0xfa, 0x4d, 0x83, 0x8b, 0xf8, 0x7f, 0x00, 0xe3, 0x6b, 0xe6, 0xbe, + 0x68, 0x60, 0xbe, 0xa8, 0x3d, 0xab, 0xdd, 0x00, 0xab, 0xe7, 0xe0, 0xd1, 0x21, 0x90, + 0xfb, 0x54, 0xb0, 0xf2, 0xad, 0xcf, 0xef, 0x9e, 0xf4, 0x2b, 0xa2, 0x31, 0x77, 0x6a, + 0xd3, 0xee, 0x09, 0x86, 0xdb, 0x3f, 0x4f, 0xc0, 0xa8, 0xa1, 0xc6, 0xa7, 0xfe, 0x54, + 0xa6, 0x6b, 0xd7, 0x68, 0xa9, 0xde, 0xd2, 0x5b, 0xb1, 0x89, 0xd5, 0x87, 0x1c, 0xaf, + 0x4d, 0xf8, 0x95, 0x6c, 0x2f, 0x30, 0x70, 0x15, 0x89, 0xa4, 0xdc, 0xdb, 0x68, 0x11, + 0x6d, 0x0f, 0x50, 0x9b, 0x34, 0x1e, 0x8f, 0x25, 0x8e, 0x17, 0x38, 0xb5, 0x51, 0x9c, + 0x99, 0xf1, 0xdb, 0xd0, 0x86, 0x31, 0x56, 0x2f, 0x90, 0xd1, 0x5e, 0x72, 0x8a, 0x85, + 0x25, 0xa1, 0x1b, 0xfe, 0x53, 0x95, 0x24, 0x5d, 0x71, 0x79, 0xcf, 0x8e, 0x97, 0xa8, + 0x3f, 0xaa, 0x4c, 0xf3, 0xb2, 0xa8, 0xb5, 0xef, 0x62, 0x13, 0xe3, 0x30, 0x89, 0xb4, + 0xeb, 0x03, 0xe7, 0xc2, 0xf0, 0x12, 0x11, 0xfc, 0x53, 0xbc, 0x01, 0x16, 0x40, 0x05, + 0x01, 0x5d, 0xbf, 0x33, 0xc6, 0x50, 0xa3, 0xf8, 0x33, 0xba, 0x67, 0x77, 0xcf, 0xf1, + 0xd7, 0x38, 0xe2, 0x1c, 0x58, 0xdc, 0x05, 0xc3, 0xb4, 0xec, 0xb9, 0x7a, 0x6c, 0xe0, + 0xb0, 0xc5, 0xee, 0x94, 0x4c, 0x24, 0xb3, 0x3b, 0xb0, 0xce, 0x32, 0xbe, 0x02, 0x3e, + 0x21, 0x3f, 0xf7, 0xc9, 0xd4, 0x12, 0x4f, 0xc9, 0xdc, 0x4a, 0xa7, 0xca, 0x47, 0x13, + 0x86, 0x48, 0xe2, 0xbb, 0x80, 0x7c, 0xea, 0x7a, 0x58, 0xe7, 0x67, 0xd3, 0x27, 0x07, + 0x4a, 0xe5, 0xe3, 0x9c, 0x3c, 0x17, 0xb7, 0x7c, 0x09, 0x0a, 0xf9, 0x42, 0x5b, 0xc6, + 0x40, 0xd2, 0x1d, 0xd6, 0x81, 0xa6, 0x37, 0x45, 0xe9, 0x02, 0x59, 0xe2, 0xd1, 0x09, + 0x0c, 0x88, 0x48, 0x8e, 0x21, 0x48, 0xb9, 0xee, 0x24, 0x31, 0xc5, 0xae, 0xf5, 0x10, + 0x95, 0xb3, 0x5a, 0x37, 0x7c, 0xfa, 0x76, 0x5d, 0x82, 0x24, 0x98, 0x83, 0x00, 0x04, + 0x71, 0x79, 0xa5, 0x09, 0x40, 0x28, 0xbe, 0x52, 0x7d, 0x5d, 0xe1, 0xc2, 0x69, 0xff, + 0x45, 0x2c, 0x0a, 0xaf, 0x5a, 0x47, 0x7e, 0x93, 0x90, 0xa0, 0xf0, 0xa8, 0x68, 0x11, + 0x3c, 0x7c, 0xd1, 0x9e, 0x2e, 0xac, 0x54, 0x0d, 0xc6, 0x59, 0xda, 0x29, 0x60, 0x06, + 0x77, 0x6e, 0xda, 0x0d, 0xf9, 0x81, 0xc4, 0x11, 0xc1, 0x50, 0x01, 0xa9, 0x8b, 0x6a, + 0xd6, 0x58, 0xd9, 0xa6, 0x4c, 0x12, 0x6a, 0xbe, 0xfc, 0x73, 0x9a, 0xa1, 0xf4, 0x44, + 0xbb, 0x83, 0xf3, 0xf1, 0x4d, 0x11, 0x3d, 0x02, 0x8f, 0xae, 0x10, 0xe4, 0xc5, 0xdb, + 0xe7, 0x78, 0x51, 0x96, 0x83, 0xcd, 0xf4, 0xc2, 0xf4, 0x6c, 0x4a, 0x52, 0xae, 0x12, + 0x09, 0xe1, 0x12, 0x7f, 0x9d, 0xc4, 0xed, 0x86, 0x7d, 0x8e, 0xda, 0x02, 0x4a, 0x68, + 0x9f, 0x6b, 0x15, 0xb8, 0x05, 0x38, 0x03, 0x02, 0x44, 0x02, 0xa1, 0xce, 0x6f, 0x1c, + 0x63, 0x6f, 0x2e, 0xfc, 0xf9, 0xd0, 0x60, 0x51, 0x5c, 0xd6, 0x14, 0x71, 0x8d, 0x51, + 0x52, 0x7d, 0x26, 0x7a, 0xd8, 0x95, 0xfa, 0xd8, 0xec, 0xfb, 0x23, 0x51, 0xf8, 0x92, + 0x45, 0x0d, 0xc8, 0x74, 0xe8, 0x74, 0x39, 0x2c, 0x91, 0xed, 0x3a, 0xf1, 0x18, 0x38, + 0xc4, 0xb5, 0x48, 0x2e, 0x8c, 0x92, 0xeb, 0xc7, 0xa0, 0x08, 0x8e, 0x49, 0xd2, 0xb0, + 0xb4, 0xa1, 0xbd, 0x33, 0x3b, 0x38, 0x7f, 0x49, 0xe3, 0x0f, 0xd2, 0x1a, 0x6e, 0xdc, + 0x89, 0x94, 0x83, 0x4f, 0x28, 0xe9, 0xf2, 0x52, 0x9a, 0x7e, 0x27, 0x24, 0x21, 0x6d, + 0x9e, 0x1a, 0xe5, 0xb4, 0x6e, 0xb1, 0x9a, 0x53, 0xea, 0x2b, 0x97, 0x99, 0x65, 0xf7, + 0x5b, 0x83, 0xf6, 0x86, 0xed, 0xc0, 0x1d, 0x25, 0x7a, 0x06, 0x58, 0xd7, 0x4e, 0x25, + 0xc0, 0xe1, 0xa8, 0xb0, 0x65, 0x60, 0x43, 0x1f, 0x85, 0x10, 0x5c, 0xf9, 0x8a, 0x1f, + 0xfe, 0x28, 0x40, 0x8a, 0x64, 0xf4, 0xc0, 0x27, 0x8d, 0x36, 0xed, 0xea, 0x76, 0x40, + 0xa2, 0x18, 0x26, 0xc3, 0xae, 0xba, 0xcb, 0x41, 0x4d, 0xa1, 0x8c, 0xc1, 0xd1, 0xe8, + 0x64, 0xc1, 0x6e, 0x97, 0x71, 0x0d, 0x56, 0xe0, 0xa1, 0x0e, 0x2c, 0xae, 0x86, 0xcb, + 0x27, 0x50, 0x14, 0x21, 0xdf, 0x52, 0xeb, 0x3c, 0x2f, 0x6e, 0x9d, 0x15, 0x59, 0xc1, + 0xb9, 0x5e, 0x7f, 0x63, 0xcb, 0x5c, 0xfa, 0xf5, 0xca, 0xc1, + ], + ock: [ + 0xc3, 0xd1, 0x04, 0x73, 0x14, 0x50, 0x57, 0x52, 0x3a, 0x55, 0xb7, 0x25, 0xcb, 0x2b, + 0x25, 0xd4, 0xe1, 0xe0, 0x5b, 0xc2, 0xfe, 0x4b, 0xbe, 0xbe, 0xb4, 0xd4, 0x2a, 0x61, + 0x8a, 0xbc, 0xd8, 0xbc, + ], + op: [ + 0x9a, 0xe4, 0x94, 0xa9, 0xfc, 0xff, 0x9b, 0x74, 0x49, 0x14, 0x53, 0x31, 0x04, 0x4f, + 0x9a, 0x02, 0x53, 0xe5, 0x24, 0xa0, 0x2c, 0x77, 0x95, 0xe9, 0x8f, 0x83, 0xec, 0x7d, + 0x96, 0xdc, 0xe6, 0xb7, 0x24, 0x50, 0xae, 0xde, 0xb9, 0x7e, 0x62, 0xd7, 0x9c, 0xcb, + 0x44, 0xb0, 0xb0, 0x4f, 0xe7, 0x93, 0x92, 0x5d, 0x49, 0xc4, 0xc0, 0x1f, 0x49, 0x2e, + 0xa9, 0xec, 0x88, 0x17, 0x18, 0x65, 0x40, 0x33, + ], + c_out: [ + 0x74, 0xd2, 0x40, 0xe8, 0xbe, 0x49, 0xb2, 0xa1, 0xad, 0x31, 0x8c, 0xfe, 0xf8, 0x43, + 0x5b, 0x79, 0x7f, 0x71, 0xfa, 0x8b, 0xda, 0x90, 0xed, 0x98, 0x4b, 0x15, 0x69, 0x7c, + 0x3e, 0x34, 0x81, 0x8f, 0x48, 0x96, 0x53, 0x79, 0x0f, 0xe7, 0x04, 0xc8, 0x16, 0x62, + 0xd9, 0xfb, 0x70, 0xde, 0x53, 0x63, 0xca, 0x17, 0xf6, 0x26, 0x2b, 0xae, 0xe2, 0x4b, + 0x2f, 0x2a, 0x80, 0x46, 0x8b, 0x03, 0x94, 0x1f, 0x55, 0x6a, 0x93, 0x0c, 0x37, 0x50, + 0xe6, 0x9a, 0xce, 0xcc, 0x79, 0xc0, 0xe4, 0x72, 0x0f, 0xe5, + ], + }, + TestVector { + incoming_viewing_key: [ + 0x9c, 0xe9, 0x20, 0x37, 0x6a, 0x6a, 0x54, 0x1e, 0x6a, 0xad, 0x66, 0x0e, 0xfa, 0x09, + 0x8d, 0xc5, 0x4c, 0x18, 0xfc, 0xeb, 0x13, 0xd0, 0x99, 0x9f, 0xbc, 0xc7, 0xfd, 0x45, + 0xa5, 0x7c, 0xcc, 0x10, 0xb8, 0xaa, 0x86, 0xc4, 0x54, 0x0d, 0x0a, 0x9f, 0xc6, 0x6d, + 0xf8, 0x5d, 0xad, 0xd6, 0x21, 0x56, 0x36, 0x5e, 0x28, 0xa3, 0xe9, 0x80, 0xb9, 0x8d, + 0x13, 0x1b, 0x50, 0x3a, 0xa0, 0x6a, 0x6c, 0x19, + ], + ovk: [ + 0xf8, 0x1a, 0xd6, 0x17, 0xfa, 0x26, 0xf0, 0xdf, 0xb8, 0x36, 0x55, 0xb8, 0xa2, 0x9a, + 0x7f, 0x83, 0x42, 0x32, 0x42, 0x5e, 0x8c, 0x47, 0x45, 0x88, 0xf1, 0x8d, 0xd3, 0x26, + 0xaa, 0x39, 0x6c, 0x3e, + ], + default_d: [ + 0xfb, 0x8e, 0xa2, 0xcc, 0x0a, 0xd2, 0x30, 0x91, 0x32, 0xfd, 0x11, + ], + default_pk_d: [ + 0xcc, 0x18, 0xe4, 0xb6, 0x5f, 0x89, 0x34, 0x06, 0x31, 0x5d, 0xb7, 0x1f, 0xac, 0x06, + 0x5d, 0x71, 0xd0, 0xea, 0xba, 0x7c, 0xf3, 0xc2, 0xba, 0x94, 0x77, 0x12, 0x32, 0x75, + 0x43, 0x4b, 0x1e, 0xb0, + ], + v: 2690686290017047047, + rseed: [ + 0x0b, 0x39, 0x05, 0xa4, 0xe3, 0xbd, 0x01, 0xc5, 0x4d, 0xf8, 0x64, 0x34, 0x43, 0xbe, + 0x0f, 0x88, 0x90, 0x32, 0xea, 0x32, 0x5b, 0xf0, 0x71, 0x07, 0xfd, 0x41, 0xd6, 0x73, + 0xee, 0xba, 0xe6, 0xfa, + ], + asset: [ + 0x64, 0xd0, 0x87, 0x40, 0x89, 0x86, 0xe7, 0x3d, 0x6e, 0x28, 0x4f, 0xea, 0x9a, 0x23, + 0xc3, 0x93, 0x11, 0x78, 0x2f, 0x86, 0xca, 0xbf, 0xf9, 0x45, 0x5e, 0x4c, 0xf6, 0x99, + 0xe5, 0xf5, 0xd4, 0xbc, + ], + memo: [ + 0xff, 0x63, 0x7b, 0x70, 0xcc, 0x0e, 0xd3, 0xf0, 0x09, 0x58, 0xdf, 0xb8, 0xdc, 0xf0, + 0x0e, 0x85, 0xa1, 0xd0, 0xa6, 0xa8, 0x90, 0x81, 0x40, 0xc2, 0xf4, 0x34, 0xc2, 0xe2, + 0x60, 0xef, 0xb0, 0xbc, 0xa2, 0x00, 0x35, 0x04, 0xc9, 0x99, 0x93, 0xa9, 0xe1, 0xc0, + 0xff, 0x9c, 0xef, 0xe6, 0xa6, 0x65, 0xd7, 0x91, 0x42, 0x86, 0x90, 0xe4, 0x7e, 0xf8, + 0xc1, 0x31, 0xa8, 0xe9, 0xbf, 0xb4, 0xc3, 0x08, 0x02, 0x35, 0x03, 0x2d, 0x73, 0x1b, + 0x0d, 0x38, 0x41, 0x22, 0x5f, 0x1c, 0x11, 0xe2, 0xc2, 0x8e, 0xe8, 0x4d, 0x35, 0xf9, + 0x22, 0x61, 0x00, 0x56, 0x59, 0x72, 0xeb, 0x26, 0x9d, 0x27, 0x8e, 0xf6, 0x49, 0x79, + 0xbf, 0x65, 0x15, 0xed, 0x4a, 0x68, 0x40, 0xb0, 0x88, 0x3a, 0x9e, 0x6e, 0xf6, 0x4a, + 0x0e, 0xfc, 0xae, 0x1c, 0xf2, 0x1d, 0xfe, 0x74, 0x85, 0x4e, 0x84, 0xc2, 0x74, 0x9f, + 0xac, 0x03, 0x82, 0x52, 0x75, 0xc9, 0xb6, 0x30, 0x21, 0x84, 0xc7, 0x2d, 0xf4, 0xc4, + 0xbb, 0x28, 0x62, 0xe4, 0xe8, 0xa7, 0xd9, 0xa4, 0xa2, 0x82, 0x86, 0x6f, 0x9a, 0x7b, + 0x2c, 0xfc, 0x9a, 0x56, 0x31, 0x3d, 0xa0, 0xc4, 0x7a, 0x34, 0xb7, 0xb9, 0xcd, 0xa3, + 0xac, 0xe8, 0x18, 0x5f, 0x07, 0xdf, 0x36, 0xe4, 0x48, 0xa7, 0x6a, 0xa4, 0x77, 0xf2, + 0x24, 0xd8, 0x7a, 0x07, 0x4f, 0x43, 0xaf, 0x5d, 0x5f, 0x79, 0xb3, 0xab, 0x11, 0x28, + 0xf0, 0x81, 0x91, 0x44, 0x7f, 0xa6, 0x46, 0xbf, 0xdd, 0xe5, 0xb5, 0x1e, 0x23, 0x3c, + 0xa6, 0x15, 0x5d, 0x10, 0x15, 0x85, 0xbc, 0x2c, 0x40, 0x15, 0x8a, 0xc2, 0x10, 0x6e, + 0x66, 0xa2, 0x6e, 0x46, 0x42, 0x33, 0x70, 0x63, 0x68, 0x76, 0xb4, 0x34, 0xa7, 0x4f, + 0x8c, 0xe8, 0x06, 0x00, 0x50, 0xb0, 0x82, 0xa7, 0x9b, 0x61, 0xbb, 0x5d, 0x34, 0x4e, + 0xb5, 0xa1, 0x15, 0x83, 0x26, 0xce, 0xd9, 0xa9, 0xd9, 0xf5, 0x4f, 0xb2, 0xfe, 0x8f, + 0x9f, 0x05, 0xcd, 0x11, 0x1e, 0xe4, 0x6c, 0x47, 0x10, 0xf6, 0xf6, 0x3a, 0x62, 0x69, + 0x45, 0x57, 0xef, 0x1b, 0x12, 0xc8, 0x80, 0x06, 0xb6, 0x78, 0x72, 0x50, 0x5f, 0x4e, + 0x88, 0x3b, 0x58, 0x59, 0x07, 0x92, 0x9a, 0x2f, 0x3f, 0xdb, 0x0d, 0x8f, 0x79, 0x14, + 0xc4, 0x2d, 0xde, 0x2d, 0x20, 0x00, 0xf5, 0xae, 0x02, 0xd4, 0x18, 0x21, 0xc8, 0xe1, + 0xee, 0x01, 0x38, 0xeb, 0xcb, 0x72, 0x8d, 0x7c, 0x6c, 0x3c, 0x80, 0x02, 0x7e, 0x43, + 0x75, 0x94, 0xc6, 0x70, 0xfd, 0x6f, 0x39, 0x08, 0x22, 0x2e, 0xe7, 0xa1, 0xb9, 0x17, + 0xf8, 0x27, 0x1a, 0xbe, 0x66, 0x0e, 0x39, 0xe0, 0x51, 0xaa, 0xa6, 0xfc, 0xa1, 0x86, + 0x22, 0x76, 0xe2, 0xba, 0xa0, 0xfe, 0x0b, 0x16, 0x2a, 0xeb, 0xcf, 0xe3, 0xd9, 0x34, + 0x9c, 0x8d, 0x15, 0x4b, 0xb7, 0xee, 0x28, 0x21, 0x2c, 0x1b, 0xaa, 0x70, 0x5d, 0x82, + 0x07, 0x0d, 0x70, 0x32, 0xf2, 0x69, 0x5d, 0x17, 0x96, 0x80, 0x9f, 0xab, 0x41, 0x24, + 0x69, 0x26, 0xaf, 0x99, 0x2b, 0x6e, 0xee, 0x95, 0xa9, 0xa0, 0x6b, 0xc4, 0x56, 0x2c, + 0x5f, 0x2f, 0x1b, 0x19, 0x54, 0x95, 0x00, 0x37, 0x2e, 0x7a, 0xd5, 0x79, 0xa6, 0xd6, + 0xd7, 0x8b, 0x33, 0x15, 0x31, 0x30, 0xfb, 0x44, 0x8f, 0xb7, 0x9e, 0x8a, 0x66, 0x9d, + 0xb8, 0xa0, 0xf3, 0x5c, 0xdf, 0x9a, 0xe5, 0xd3, 0x2d, 0x73, 0x2f, 0xc7, 0x94, 0x18, + 0xe2, 0x3b, 0x45, 0x1d, 0xdc, 0x95, 0xa2, 0x2a, 0xba, 0xbb, 0x05, 0x6e, 0xc6, 0xb5, + 0xe8, 0xba, 0x4f, 0x52, 0x4d, 0xfa, 0xfe, 0x87, 0x52, 0x62, 0xdd, 0x7b, 0xe4, 0x1c, + 0xbb, 0xc6, 0x24, 0x20, 0xd4, 0xad, 0x6d, 0xf5, 0xc9, 0xb7, 0x13, 0x60, 0x4f, 0x65, + 0x60, 0x88, 0xa4, 0x48, 0x5e, 0x93, 0xbe, 0x19, + ], + cv_net: [ + 0xf4, 0x5c, 0xba, 0x14, 0x6a, 0xe7, 0x18, 0x85, 0xfd, 0x61, 0xb4, 0xa0, 0xf3, 0x6b, + 0x95, 0x26, 0xa6, 0xe9, 0x4a, 0x49, 0x70, 0x10, 0xe3, 0x2a, 0x8a, 0x76, 0xbc, 0xdf, + 0xa7, 0x20, 0xb8, 0xa6, + ], + rho: [ + 0x85, 0x2f, 0x5c, 0x39, 0xd3, 0xf3, 0x55, 0xa3, 0x85, 0xe2, 0xab, 0xd2, 0x54, 0x3a, + 0xa5, 0xed, 0x09, 0xc6, 0xee, 0x3b, 0x7f, 0x39, 0x34, 0x14, 0xe1, 0x1c, 0xd4, 0x20, + 0x4c, 0x3f, 0x8d, 0x26, + ], + cmx: [ + 0x4c, 0x6c, 0x39, 0xec, 0xcf, 0xc0, 0xce, 0xe9, 0x0b, 0x46, 0xdb, 0x88, 0x98, 0xe0, + 0xd1, 0x8b, 0x2c, 0x7a, 0x61, 0x63, 0x0a, 0xb2, 0x71, 0x5c, 0x77, 0x07, 0x17, 0x37, + 0xca, 0x2a, 0x18, 0x13, + ], + esk: [ + 0xaa, 0x84, 0x16, 0x79, 0xd4, 0xd2, 0x40, 0xb0, 0xab, 0xc4, 0xa5, 0xd8, 0x9a, 0xa8, + 0xd6, 0xb3, 0xb0, 0x86, 0x92, 0x23, 0xed, 0x76, 0x3b, 0x67, 0x6a, 0x72, 0xcb, 0x74, + 0xfb, 0x18, 0xd1, 0x17, + ], + ephemeral_key: [ + 0x3c, 0x04, 0xbe, 0x6e, 0x42, 0xa6, 0xca, 0x7f, 0x5d, 0xda, 0x0d, 0x82, 0xdf, 0x30, + 0x7b, 0xd9, 0x6b, 0xb7, 0xb1, 0xae, 0x8d, 0x62, 0x31, 0x87, 0xe3, 0x9c, 0x00, 0xa4, + 0x8c, 0x25, 0xaa, 0x9d, + ], + shared_secret: [ + 0x3a, 0x60, 0x2b, 0xaf, 0xb8, 0xa2, 0x66, 0x5a, 0x74, 0xdf, 0x34, 0xab, 0x6e, 0x3c, + 0x48, 0x8b, 0x09, 0xe2, 0x28, 0x4e, 0xa1, 0x7d, 0x56, 0x02, 0x62, 0xe2, 0x1f, 0x7f, + 0x3c, 0xba, 0xa3, 0x95, + ], + k_enc: [ + 0x1b, 0x6d, 0xd1, 0x03, 0x49, 0x63, 0x67, 0xc9, 0x2b, 0x36, 0x8f, 0xc2, 0xf1, 0xc6, + 0x2e, 0x56, 0xc8, 0xc9, 0xfb, 0xe3, 0x4a, 0x35, 0x84, 0x1f, 0xe1, 0xa3, 0x70, 0x96, + 0x43, 0xe1, 0x35, 0xe1, + ], + p_enc: [ + 0x03, 0xfb, 0x8e, 0xa2, 0xcc, 0x0a, 0xd2, 0x30, 0x91, 0x32, 0xfd, 0x11, 0x07, 0xd2, + 0x7a, 0xc6, 0xec, 0x3c, 0x57, 0x25, 0x0b, 0x39, 0x05, 0xa4, 0xe3, 0xbd, 0x01, 0xc5, + 0x4d, 0xf8, 0x64, 0x34, 0x43, 0xbe, 0x0f, 0x88, 0x90, 0x32, 0xea, 0x32, 0x5b, 0xf0, + 0x71, 0x07, 0xfd, 0x41, 0xd6, 0x73, 0xee, 0xba, 0xe6, 0xfa, 0x64, 0xd0, 0x87, 0x40, + 0x89, 0x86, 0xe7, 0x3d, 0x6e, 0x28, 0x4f, 0xea, 0x9a, 0x23, 0xc3, 0x93, 0x11, 0x78, + 0x2f, 0x86, 0xca, 0xbf, 0xf9, 0x45, 0x5e, 0x4c, 0xf6, 0x99, 0xe5, 0xf5, 0xd4, 0xbc, + 0xff, 0x63, 0x7b, 0x70, 0xcc, 0x0e, 0xd3, 0xf0, 0x09, 0x58, 0xdf, 0xb8, 0xdc, 0xf0, + 0x0e, 0x85, 0xa1, 0xd0, 0xa6, 0xa8, 0x90, 0x81, 0x40, 0xc2, 0xf4, 0x34, 0xc2, 0xe2, + 0x60, 0xef, 0xb0, 0xbc, 0xa2, 0x00, 0x35, 0x04, 0xc9, 0x99, 0x93, 0xa9, 0xe1, 0xc0, + 0xff, 0x9c, 0xef, 0xe6, 0xa6, 0x65, 0xd7, 0x91, 0x42, 0x86, 0x90, 0xe4, 0x7e, 0xf8, + 0xc1, 0x31, 0xa8, 0xe9, 0xbf, 0xb4, 0xc3, 0x08, 0x02, 0x35, 0x03, 0x2d, 0x73, 0x1b, + 0x0d, 0x38, 0x41, 0x22, 0x5f, 0x1c, 0x11, 0xe2, 0xc2, 0x8e, 0xe8, 0x4d, 0x35, 0xf9, + 0x22, 0x61, 0x00, 0x56, 0x59, 0x72, 0xeb, 0x26, 0x9d, 0x27, 0x8e, 0xf6, 0x49, 0x79, + 0xbf, 0x65, 0x15, 0xed, 0x4a, 0x68, 0x40, 0xb0, 0x88, 0x3a, 0x9e, 0x6e, 0xf6, 0x4a, + 0x0e, 0xfc, 0xae, 0x1c, 0xf2, 0x1d, 0xfe, 0x74, 0x85, 0x4e, 0x84, 0xc2, 0x74, 0x9f, + 0xac, 0x03, 0x82, 0x52, 0x75, 0xc9, 0xb6, 0x30, 0x21, 0x84, 0xc7, 0x2d, 0xf4, 0xc4, + 0xbb, 0x28, 0x62, 0xe4, 0xe8, 0xa7, 0xd9, 0xa4, 0xa2, 0x82, 0x86, 0x6f, 0x9a, 0x7b, + 0x2c, 0xfc, 0x9a, 0x56, 0x31, 0x3d, 0xa0, 0xc4, 0x7a, 0x34, 0xb7, 0xb9, 0xcd, 0xa3, + 0xac, 0xe8, 0x18, 0x5f, 0x07, 0xdf, 0x36, 0xe4, 0x48, 0xa7, 0x6a, 0xa4, 0x77, 0xf2, + 0x24, 0xd8, 0x7a, 0x07, 0x4f, 0x43, 0xaf, 0x5d, 0x5f, 0x79, 0xb3, 0xab, 0x11, 0x28, + 0xf0, 0x81, 0x91, 0x44, 0x7f, 0xa6, 0x46, 0xbf, 0xdd, 0xe5, 0xb5, 0x1e, 0x23, 0x3c, + 0xa6, 0x15, 0x5d, 0x10, 0x15, 0x85, 0xbc, 0x2c, 0x40, 0x15, 0x8a, 0xc2, 0x10, 0x6e, + 0x66, 0xa2, 0x6e, 0x46, 0x42, 0x33, 0x70, 0x63, 0x68, 0x76, 0xb4, 0x34, 0xa7, 0x4f, + 0x8c, 0xe8, 0x06, 0x00, 0x50, 0xb0, 0x82, 0xa7, 0x9b, 0x61, 0xbb, 0x5d, 0x34, 0x4e, + 0xb5, 0xa1, 0x15, 0x83, 0x26, 0xce, 0xd9, 0xa9, 0xd9, 0xf5, 0x4f, 0xb2, 0xfe, 0x8f, + 0x9f, 0x05, 0xcd, 0x11, 0x1e, 0xe4, 0x6c, 0x47, 0x10, 0xf6, 0xf6, 0x3a, 0x62, 0x69, + 0x45, 0x57, 0xef, 0x1b, 0x12, 0xc8, 0x80, 0x06, 0xb6, 0x78, 0x72, 0x50, 0x5f, 0x4e, + 0x88, 0x3b, 0x58, 0x59, 0x07, 0x92, 0x9a, 0x2f, 0x3f, 0xdb, 0x0d, 0x8f, 0x79, 0x14, + 0xc4, 0x2d, 0xde, 0x2d, 0x20, 0x00, 0xf5, 0xae, 0x02, 0xd4, 0x18, 0x21, 0xc8, 0xe1, + 0xee, 0x01, 0x38, 0xeb, 0xcb, 0x72, 0x8d, 0x7c, 0x6c, 0x3c, 0x80, 0x02, 0x7e, 0x43, + 0x75, 0x94, 0xc6, 0x70, 0xfd, 0x6f, 0x39, 0x08, 0x22, 0x2e, 0xe7, 0xa1, 0xb9, 0x17, + 0xf8, 0x27, 0x1a, 0xbe, 0x66, 0x0e, 0x39, 0xe0, 0x51, 0xaa, 0xa6, 0xfc, 0xa1, 0x86, + 0x22, 0x76, 0xe2, 0xba, 0xa0, 0xfe, 0x0b, 0x16, 0x2a, 0xeb, 0xcf, 0xe3, 0xd9, 0x34, + 0x9c, 0x8d, 0x15, 0x4b, 0xb7, 0xee, 0x28, 0x21, 0x2c, 0x1b, 0xaa, 0x70, 0x5d, 0x82, + 0x07, 0x0d, 0x70, 0x32, 0xf2, 0x69, 0x5d, 0x17, 0x96, 0x80, 0x9f, 0xab, 0x41, 0x24, + 0x69, 0x26, 0xaf, 0x99, 0x2b, 0x6e, 0xee, 0x95, 0xa9, 0xa0, 0x6b, 0xc4, 0x56, 0x2c, + 0x5f, 0x2f, 0x1b, 0x19, 0x54, 0x95, 0x00, 0x37, 0x2e, 0x7a, 0xd5, 0x79, 0xa6, 0xd6, + 0xd7, 0x8b, 0x33, 0x15, 0x31, 0x30, 0xfb, 0x44, 0x8f, 0xb7, 0x9e, 0x8a, 0x66, 0x9d, + 0xb8, 0xa0, 0xf3, 0x5c, 0xdf, 0x9a, 0xe5, 0xd3, 0x2d, 0x73, 0x2f, 0xc7, 0x94, 0x18, + 0xe2, 0x3b, 0x45, 0x1d, 0xdc, 0x95, 0xa2, 0x2a, 0xba, 0xbb, 0x05, 0x6e, 0xc6, 0xb5, + 0xe8, 0xba, 0x4f, 0x52, 0x4d, 0xfa, 0xfe, 0x87, 0x52, 0x62, 0xdd, 0x7b, 0xe4, 0x1c, + 0xbb, 0xc6, 0x24, 0x20, 0xd4, 0xad, 0x6d, 0xf5, 0xc9, 0xb7, 0x13, 0x60, 0x4f, 0x65, + 0x60, 0x88, 0xa4, 0x48, 0x5e, 0x93, 0xbe, 0x19, + ], + c_enc: [ + 0xb4, 0x15, 0x88, 0x23, 0x1d, 0x6b, 0xa2, 0x9c, 0xc5, 0xb9, 0xaa, 0xf0, 0xc1, 0xf0, + 0xba, 0x44, 0x16, 0x6e, 0xdb, 0x8a, 0x27, 0x29, 0xca, 0xba, 0x53, 0x71, 0xe7, 0xac, + 0x36, 0x90, 0x0f, 0xaa, 0x64, 0xf5, 0x76, 0x0d, 0xce, 0x55, 0x20, 0xda, 0x82, 0x8d, + 0x5e, 0x25, 0xbd, 0x83, 0x51, 0x95, 0x11, 0x64, 0x12, 0x11, 0x80, 0x9d, 0xff, 0xd8, + 0xcf, 0xeb, 0xff, 0xf3, 0xcd, 0xdc, 0xd2, 0x75, 0x88, 0x1e, 0x39, 0xb6, 0x3d, 0xac, + 0x4d, 0x98, 0x6b, 0x10, 0xc0, 0xe4, 0xc5, 0x52, 0x63, 0xde, 0x3e, 0x02, 0x54, 0x94, + 0x81, 0x8a, 0x38, 0x08, 0xd9, 0xab, 0xc6, 0xec, 0x38, 0x8f, 0x95, 0x26, 0x73, 0x95, + 0x0a, 0xa2, 0xd0, 0xe4, 0xba, 0x00, 0x53, 0x75, 0xac, 0x60, 0x5d, 0xc8, 0x25, 0xde, + 0x4d, 0xd8, 0x93, 0x8b, 0x94, 0x7f, 0xf7, 0x19, 0x4c, 0xfe, 0x7c, 0x1d, 0x79, 0xa1, + 0x27, 0x15, 0x5d, 0x11, 0xcb, 0xe3, 0x43, 0xf3, 0x2f, 0xd1, 0x0c, 0x7d, 0xae, 0x39, + 0x1f, 0x00, 0xb4, 0x4f, 0xbe, 0x30, 0x1c, 0x63, 0xfd, 0x4b, 0xf1, 0xc0, 0xdf, 0xb6, + 0xc9, 0xec, 0xb4, 0xc3, 0xf3, 0xfe, 0xf5, 0x40, 0xb6, 0x7e, 0xb9, 0x23, 0x13, 0x71, + 0x9c, 0x5a, 0x30, 0x7a, 0xd3, 0x95, 0x6b, 0xb9, 0x4e, 0x29, 0x86, 0x85, 0x2a, 0x64, + 0x5a, 0x95, 0xd6, 0xdc, 0x75, 0xaa, 0x27, 0x4c, 0xcf, 0xd2, 0x71, 0xd0, 0xea, 0xe2, + 0x65, 0x81, 0xf5, 0xf5, 0x5d, 0x64, 0x74, 0xaa, 0xad, 0x37, 0x4c, 0x86, 0x45, 0x05, + 0xe6, 0x92, 0x37, 0xf6, 0x66, 0x99, 0xee, 0x39, 0xe9, 0xfc, 0xf5, 0xb1, 0xb7, 0x03, + 0x35, 0x1e, 0x71, 0xf6, 0x3b, 0x02, 0x33, 0x40, 0x82, 0xee, 0xbe, 0xd8, 0x68, 0xb5, + 0x61, 0x2a, 0x33, 0x95, 0x78, 0x5a, 0x33, 0x2a, 0x52, 0x43, 0xe4, 0x98, 0x6e, 0x1f, + 0xf5, 0xb4, 0x2d, 0x06, 0x69, 0xc1, 0x5c, 0x45, 0xff, 0x81, 0xe2, 0x2e, 0xea, 0xe4, + 0xde, 0x7d, 0x9a, 0x4f, 0x57, 0x24, 0xc8, 0x96, 0x03, 0x94, 0x92, 0x5b, 0xa1, 0xa1, + 0x90, 0x0f, 0xa2, 0xb5, 0x59, 0x3d, 0x55, 0x45, 0x5e, 0x0b, 0xe0, 0x31, 0x8c, 0x80, + 0x23, 0x81, 0xec, 0x9c, 0x0a, 0x83, 0xc2, 0xe5, 0xf9, 0x33, 0x9f, 0x02, 0x9c, 0x44, + 0x24, 0x72, 0x8f, 0x91, 0x9d, 0x18, 0x4f, 0x36, 0x16, 0x50, 0xba, 0x65, 0xd6, 0x98, + 0xa8, 0xd1, 0x67, 0xbe, 0xd9, 0xdd, 0x01, 0xfa, 0x70, 0x74, 0xe4, 0x6a, 0xf6, 0x57, + 0x16, 0xdd, 0xd9, 0x7e, 0x7b, 0xb6, 0x00, 0x13, 0x05, 0x96, 0x8c, 0xd5, 0xb4, 0x87, + 0x0d, 0xf2, 0x00, 0x42, 0xe7, 0x69, 0xe0, 0x2d, 0xf1, 0x8b, 0x9f, 0xde, 0x9f, 0xda, + 0xa7, 0x6b, 0x00, 0xca, 0x26, 0x45, 0x9d, 0x54, 0x37, 0x19, 0x19, 0x72, 0xd7, 0x08, + 0xde, 0xda, 0xbf, 0x1d, 0x61, 0x7f, 0x73, 0x3a, 0x60, 0xeb, 0xfe, 0xc6, 0xac, 0xf0, + 0x0b, 0xb1, 0xdf, 0xbf, 0x11, 0x2d, 0x3a, 0xaa, 0xc9, 0xfb, 0xd2, 0x30, 0xcc, 0xaa, + 0x9c, 0xf3, 0x58, 0x45, 0x93, 0x54, 0xac, 0x5b, 0x29, 0xbd, 0xb7, 0x3a, 0x45, 0x27, + 0x1b, 0x1f, 0x9e, 0xd0, 0x0e, 0x3e, 0x20, 0xb1, 0x2f, 0xed, 0x5c, 0xd5, 0x6a, 0xbb, + 0xb0, 0xb9, 0x4a, 0x9e, 0xee, 0x5f, 0xf8, 0xf9, 0x36, 0x1d, 0xfd, 0x6c, 0x94, 0x08, + 0x5d, 0x28, 0x98, 0xe5, 0x46, 0xeb, 0x92, 0xe6, 0xdb, 0xe9, 0xf0, 0x2e, 0xb5, 0xbf, + 0x7d, 0x12, 0x67, 0x5d, 0x3c, 0x6a, 0xc7, 0x18, 0x4b, 0x26, 0x01, 0xe4, 0xf4, 0x05, + 0x37, 0x3a, 0x4f, 0x1c, 0x5d, 0xf7, 0x6b, 0x3c, 0xb5, 0x29, 0x99, 0xd8, 0x0f, 0x59, + 0xb3, 0x94, 0xbc, 0xed, 0x9f, 0x66, 0xbc, 0xf7, 0xdc, 0x37, 0xc2, 0xb4, 0xc6, 0xf7, + 0x74, 0x5b, 0xc6, 0xf0, 0x37, 0x74, 0xfa, 0xc6, 0x24, 0x5d, 0x7c, 0x63, 0x6d, 0xfc, + 0x5f, 0x76, 0x58, 0xb2, 0xd2, 0xfd, 0x84, 0xac, 0xa9, 0xe0, 0xef, 0xcd, 0xe0, 0x09, + 0x3e, 0x62, 0x29, 0x38, 0xb7, 0x5d, 0xae, 0x66, 0xcf, 0x63, 0xf6, 0xd2, 0x35, 0x17, + 0x2e, 0x5a, 0x0b, 0xbe, 0xcd, 0x15, 0x56, 0x6c, 0x61, 0xfe, 0x5a, 0x58, 0x94, 0x7c, + 0x18, 0xb9, 0xb5, 0xa1, 0x27, 0x29, 0x4b, 0x67, 0x67, 0xd0, 0x2b, 0x0f, 0x66, 0x4c, + 0xef, 0x25, 0x8e, 0x26, 0x11, 0x1c, 0xf0, 0x9c, 0x9b, 0x61, 0xd4, 0x41, 0x52, 0x8d, + 0x8c, 0xa2, 0xd8, 0x00, 0x5c, 0xad, 0x2a, 0xe4, 0x16, 0xe3, 0x4b, 0xb2, 0x6b, 0x41, + 0xa1, 0x85, 0x5a, 0xf9, 0x90, 0xcd, 0xb6, 0x77, 0xaf, 0x0d, + ], + ock: [ + 0x2b, 0x28, 0x4c, 0xea, 0xca, 0x3e, 0xe7, 0x05, 0x2b, 0xb4, 0xad, 0x16, 0x7e, 0xc4, + 0x4f, 0xbf, 0x14, 0x4f, 0x7a, 0xef, 0x67, 0x8a, 0x37, 0xe6, 0x1e, 0x0b, 0x1f, 0x6b, + 0xdc, 0x24, 0xa0, 0x0d, + ], + op: [ + 0xcc, 0x18, 0xe4, 0xb6, 0x5f, 0x89, 0x34, 0x06, 0x31, 0x5d, 0xb7, 0x1f, 0xac, 0x06, + 0x5d, 0x71, 0xd0, 0xea, 0xba, 0x7c, 0xf3, 0xc2, 0xba, 0x94, 0x77, 0x12, 0x32, 0x75, + 0x43, 0x4b, 0x1e, 0xb0, 0xaa, 0x84, 0x16, 0x79, 0xd4, 0xd2, 0x40, 0xb0, 0xab, 0xc4, + 0xa5, 0xd8, 0x9a, 0xa8, 0xd6, 0xb3, 0xb0, 0x86, 0x92, 0x23, 0xed, 0x76, 0x3b, 0x67, + 0x6a, 0x72, 0xcb, 0x74, 0xfb, 0x18, 0xd1, 0x17, + ], + c_out: [ + 0x4b, 0x9a, 0x5a, 0x4a, 0x4d, 0xda, 0x98, 0xfb, 0x92, 0x9a, 0xe9, 0x7b, 0x11, 0xb2, + 0x09, 0xae, 0x23, 0x42, 0x5e, 0x52, 0x26, 0x9a, 0xad, 0xca, 0x13, 0x23, 0x9c, 0xb9, + 0xb3, 0x8f, 0xbf, 0xfb, 0x85, 0x29, 0x58, 0x41, 0xd0, 0xf3, 0x2b, 0xea, 0xd9, 0x2c, + 0x4d, 0x3c, 0x88, 0xe6, 0xe7, 0x2a, 0x1b, 0xe1, 0xd6, 0x64, 0x9b, 0x1c, 0xee, 0x43, + 0x0e, 0xad, 0x38, 0x44, 0x56, 0x07, 0xc4, 0xa9, 0xb6, 0x02, 0x51, 0x83, 0x56, 0x1e, + 0x6c, 0xff, 0x55, 0x2a, 0xf0, 0x88, 0x98, 0xd4, 0x09, 0xa6, + ], + }, + TestVector { + incoming_viewing_key: [ + 0xb4, 0x9e, 0x3c, 0x5b, 0xb9, 0x9e, 0x47, 0xc5, 0x3d, 0x6e, 0x5c, 0x34, 0x7c, 0x99, + 0x8f, 0x30, 0x2d, 0x3f, 0xf4, 0x75, 0x23, 0xe7, 0xc3, 0xd7, 0xb6, 0x4c, 0x82, 0x98, + 0xdc, 0x7b, 0x10, 0xe9, 0x54, 0xdf, 0x06, 0x00, 0x0b, 0xc0, 0xcc, 0x30, 0xec, 0xf6, + 0x75, 0x5d, 0x92, 0x7e, 0xee, 0xce, 0xe6, 0xec, 0x9e, 0x8e, 0x0c, 0xba, 0xa3, 0x1b, + 0x71, 0xe0, 0xa4, 0x33, 0x4a, 0xd6, 0x42, 0x1b, + ], + ovk: [ + 0x97, 0x9f, 0x06, 0x58, 0x66, 0x73, 0xbc, 0x6f, 0xf1, 0xc5, 0xd3, 0xb3, 0x20, 0xf3, + 0x49, 0xa5, 0xb3, 0xa8, 0xb3, 0x55, 0x59, 0x22, 0x96, 0xaa, 0xf6, 0x1c, 0x5b, 0x72, + 0x52, 0xf7, 0x3e, 0xc0, + ], + default_d: [ + 0x8d, 0xb1, 0x31, 0xa6, 0x5b, 0xa6, 0xca, 0x91, 0xc9, 0xe9, 0x7b, + ], + default_pk_d: [ + 0x6f, 0xce, 0x26, 0xab, 0xe6, 0xc0, 0xb6, 0x84, 0x37, 0x36, 0x96, 0x46, 0xee, 0xe1, + 0xe9, 0xdc, 0xa5, 0x1a, 0x42, 0x58, 0xf3, 0xae, 0x72, 0x23, 0x87, 0xf6, 0xd0, 0xdf, + 0xf4, 0x1a, 0x1f, 0x88, + ], + v: 5531329397987978327, + rseed: [ + 0x1f, 0xbd, 0x83, 0xd5, 0x4a, 0xaf, 0x44, 0x1e, 0x31, 0x9e, 0xa4, 0x7a, 0x86, 0x2a, + 0xd0, 0x29, 0x3c, 0xed, 0xf5, 0xdd, 0x9e, 0xda, 0xde, 0xee, 0x33, 0xcb, 0x52, 0x2c, + 0xd0, 0x11, 0x8b, 0xbd, + ], + asset: [ + 0xc3, 0xcc, 0x4f, 0x43, 0xfa, 0x01, 0x88, 0x52, 0x1b, 0xc6, 0x1b, 0x21, 0xdd, 0x04, + 0xe3, 0x7a, 0x83, 0xec, 0xe6, 0x8c, 0xa7, 0xa2, 0xfa, 0x6c, 0x8f, 0x9e, 0x34, 0xa6, + 0x29, 0x03, 0x35, 0xaa, + ], + memo: [ + 0xff, 0x81, 0x1a, 0xce, 0x9a, 0x23, 0xbd, 0xa3, 0x9a, 0xba, 0x72, 0xf1, 0x56, 0x6f, + 0xc1, 0x68, 0x84, 0x97, 0xd2, 0xa7, 0x92, 0x8c, 0x36, 0x70, 0x15, 0x25, 0x67, 0x8b, + 0xc9, 0x72, 0x14, 0xb3, 0x1b, 0x37, 0xba, 0xb4, 0x6b, 0x88, 0xf2, 0x7f, 0x04, 0x48, + 0xde, 0xcb, 0x31, 0x62, 0x2d, 0x0f, 0x0f, 0x87, 0xa8, 0x55, 0xba, 0x54, 0x00, 0x03, + 0x32, 0x03, 0x1f, 0x73, 0xab, 0xff, 0xd4, 0x65, 0x91, 0xda, 0x0b, 0x88, 0x72, 0x35, + 0x04, 0xed, 0xb2, 0x33, 0x72, 0x30, 0xda, 0xd2, 0xac, 0xc0, 0xd8, 0xbb, 0x68, 0xbc, + 0x83, 0x7a, 0x2f, 0xf9, 0x30, 0xbf, 0xf0, 0x6f, 0xde, 0x74, 0xeb, 0x90, 0xaa, 0xe4, + 0xf6, 0x0d, 0xbb, 0x6e, 0xb8, 0x27, 0xea, 0x99, 0x88, 0x4a, 0xcd, 0x62, 0x85, 0xa9, + 0x88, 0x92, 0x80, 0x2c, 0xf5, 0x9d, 0x5d, 0x60, 0xd0, 0x16, 0x63, 0x38, 0x7b, 0x3e, + 0xd2, 0x72, 0x3b, 0xd6, 0x48, 0x9e, 0x9c, 0x2c, 0x10, 0x6d, 0x4a, 0xa2, 0xde, 0x23, + 0xce, 0xd1, 0x6c, 0x72, 0x04, 0x29, 0xc7, 0x75, 0x3a, 0x77, 0x38, 0xec, 0x7d, 0x9d, + 0xb8, 0x62, 0x42, 0x29, 0xed, 0xd2, 0x17, 0xb8, 0x0d, 0x74, 0x87, 0x5a, 0x14, 0xca, + 0xe4, 0x86, 0x3f, 0x13, 0x9e, 0x9c, 0x0b, 0x13, 0x1b, 0x2a, 0x4c, 0x28, 0x07, 0x1a, + 0x38, 0xec, 0x61, 0xf6, 0x68, 0x01, 0xaa, 0x59, 0x56, 0xfc, 0xb2, 0xa4, 0x6b, 0x95, + 0x87, 0x66, 0x5b, 0x75, 0x71, 0xaa, 0x03, 0x48, 0x1f, 0xd8, 0xd9, 0xd5, 0x69, 0x8f, + 0x83, 0x6f, 0xc8, 0x63, 0x5e, 0x69, 0xe3, 0xbd, 0xe4, 0x2f, 0x4a, 0xc0, 0x71, 0x32, + 0x8b, 0x54, 0x09, 0xf6, 0xe4, 0x2d, 0x79, 0x0a, 0xed, 0xd7, 0x3b, 0xc1, 0xa2, 0x35, + 0x47, 0x23, 0xb3, 0xb8, 0x19, 0xd0, 0x63, 0x7a, 0x6f, 0xa4, 0x66, 0x39, 0x46, 0xa3, + 0x0a, 0xc5, 0xaf, 0xdd, 0x30, 0xce, 0x83, 0x0f, 0x67, 0x91, 0xb4, 0x57, 0x52, 0x70, + 0xa1, 0x72, 0x0f, 0x91, 0x86, 0x6e, 0x2b, 0x86, 0xf4, 0x78, 0x88, 0x94, 0xc8, 0xda, + 0x62, 0xd8, 0xb9, 0x1f, 0xaf, 0x52, 0x0e, 0x3b, 0xed, 0xbc, 0x12, 0x06, 0xa5, 0xa5, + 0xe6, 0xef, 0xd3, 0xdf, 0xde, 0x08, 0x43, 0xc3, 0xb0, 0x67, 0x57, 0x64, 0x3f, 0xc0, + 0x06, 0x00, 0x88, 0x38, 0xca, 0x47, 0x30, 0x87, 0xf8, 0x97, 0x79, 0x18, 0xcc, 0x1b, + 0x81, 0xc9, 0xe6, 0x8e, 0x3b, 0x88, 0x8f, 0xe6, 0xf7, 0xc6, 0x30, 0xf1, 0xbc, 0x7a, + 0xe1, 0x88, 0xf5, 0x12, 0x84, 0x20, 0x41, 0xca, 0xda, 0x1e, 0x05, 0xf8, 0x66, 0xd2, + 0x56, 0x2d, 0xbe, 0x09, 0xc4, 0xb4, 0x30, 0x68, 0xf7, 0x54, 0xda, 0xd3, 0x4d, 0xf0, + 0xfc, 0xfc, 0x18, 0x1f, 0x31, 0x80, 0x1a, 0x79, 0x92, 0xd2, 0xf1, 0x6b, 0xe0, 0x21, + 0x1b, 0x4a, 0x22, 0xf6, 0x2a, 0xab, 0x64, 0x70, 0x1b, 0xf4, 0xa4, 0xe6, 0xd6, 0x66, + 0xfc, 0x30, 0x4a, 0x5c, 0x79, 0xc6, 0x09, 0xac, 0xc4, 0x3b, 0x00, 0xb4, 0x86, 0x48, + 0x93, 0xd3, 0x7d, 0x50, 0x07, 0xf0, 0xc3, 0x29, 0xa4, 0x75, 0x50, 0x52, 0x57, 0x75, + 0x70, 0xdd, 0x38, 0xfa, 0xc0, 0x43, 0xcd, 0x91, 0xc1, 0x2e, 0xe3, 0x4e, 0x9c, 0xfa, + 0xe3, 0x92, 0xa7, 0x8b, 0xda, 0xbd, 0x4e, 0xe3, 0x1d, 0xc0, 0xde, 0xb0, 0x2f, 0xe7, + 0xb1, 0xd8, 0xb0, 0x17, 0x8a, 0xc9, 0x51, 0x31, 0x05, 0xfc, 0xc7, 0xe3, 0x0b, 0xa8, + 0xe0, 0x16, 0xaa, 0x36, 0xa6, 0xb5, 0xdf, 0x5e, 0x5a, 0x19, 0x09, 0xf6, 0x3a, 0xba, + 0x09, 0x5d, 0x98, 0x77, 0xa8, 0xf2, 0xdc, 0x53, 0xf4, 0x6f, 0x6c, 0x9b, 0x07, 0xad, + 0xdf, 0x14, 0x6f, 0x4f, 0xfa, 0x50, 0x1f, 0x9d, 0xd3, 0xcf, 0xf9, 0x24, 0xe3, 0x01, + 0x0f, 0xaf, 0x50, 0x4e, 0x2b, 0x8a, 0xca, 0x73, + ], + cv_net: [ + 0x1a, 0xa2, 0x3d, 0x96, 0x79, 0xbc, 0x66, 0x04, 0xb6, 0x25, 0x2c, 0x4f, 0x48, 0x1b, + 0x3a, 0x2a, 0xf5, 0x46, 0x32, 0xf8, 0x30, 0x08, 0x14, 0x68, 0x29, 0x65, 0x94, 0x5e, + 0x7e, 0x33, 0x2a, 0x0d, + ], + rho: [ + 0x09, 0x1d, 0x83, 0x73, 0x3a, 0x9f, 0xfb, 0x18, 0xc1, 0x7a, 0xd1, 0x93, 0x8d, 0xd2, + 0x67, 0x93, 0xc3, 0xfe, 0xfa, 0xda, 0xee, 0xa8, 0xe2, 0x3c, 0x44, 0xd5, 0xe0, 0x18, + 0x4b, 0xc8, 0x45, 0x10, + ], + cmx: [ + 0x06, 0x65, 0x7e, 0xd7, 0x3d, 0x2a, 0x26, 0xfa, 0xfd, 0xe2, 0xb5, 0xb3, 0x73, 0xf4, + 0x60, 0x07, 0x89, 0xf5, 0x23, 0x2b, 0x57, 0x3b, 0x4e, 0xcf, 0xd5, 0x3c, 0x14, 0x03, + 0x9b, 0xeb, 0x15, 0x1c, + ], + esk: [ + 0x2f, 0x98, 0x2d, 0xec, 0xa7, 0x60, 0x51, 0x41, 0xd9, 0xc9, 0xa1, 0xe6, 0xfb, 0x57, + 0xe2, 0xb8, 0x01, 0xb4, 0x49, 0x6f, 0xbd, 0xd4, 0xc0, 0xa8, 0xb9, 0x5f, 0xc8, 0x7e, + 0xa7, 0x37, 0x3e, 0x2f, + ], + ephemeral_key: [ + 0xda, 0x72, 0x84, 0xa0, 0xe0, 0xde, 0x52, 0x09, 0x3c, 0xc2, 0xe1, 0x9c, 0x0a, 0xf1, + 0x93, 0xbd, 0xb4, 0x2c, 0x80, 0xc9, 0xc7, 0xf9, 0xf2, 0x36, 0x00, 0xe6, 0x08, 0x01, + 0x72, 0xc5, 0xf5, 0x39, + ], + shared_secret: [ + 0x9b, 0xcf, 0xb9, 0x6f, 0x4c, 0xf1, 0x83, 0xc1, 0x7f, 0xb1, 0x99, 0xda, 0x16, 0x5f, + 0xbf, 0x8a, 0x47, 0x47, 0x7e, 0x00, 0x36, 0x6d, 0x1c, 0xb7, 0x3b, 0x32, 0xec, 0x0e, + 0x3a, 0xc1, 0x98, 0x0f, + ], + k_enc: [ + 0x21, 0xe0, 0x97, 0x87, 0x0a, 0xee, 0xc0, 0x19, 0x76, 0x86, 0xee, 0x37, 0x22, 0x78, + 0xfe, 0x4a, 0xa2, 0x23, 0x8d, 0x87, 0x65, 0x32, 0x63, 0x84, 0x8a, 0x2f, 0xf5, 0x27, + 0x9f, 0x2b, 0x1d, 0x9b, + ], + p_enc: [ + 0x03, 0x8d, 0xb1, 0x31, 0xa6, 0x5b, 0xa6, 0xca, 0x91, 0xc9, 0xe9, 0x7b, 0x57, 0xac, + 0xbf, 0xfe, 0xc7, 0x3a, 0xc3, 0x4c, 0x1f, 0xbd, 0x83, 0xd5, 0x4a, 0xaf, 0x44, 0x1e, + 0x31, 0x9e, 0xa4, 0x7a, 0x86, 0x2a, 0xd0, 0x29, 0x3c, 0xed, 0xf5, 0xdd, 0x9e, 0xda, + 0xde, 0xee, 0x33, 0xcb, 0x52, 0x2c, 0xd0, 0x11, 0x8b, 0xbd, 0xc3, 0xcc, 0x4f, 0x43, + 0xfa, 0x01, 0x88, 0x52, 0x1b, 0xc6, 0x1b, 0x21, 0xdd, 0x04, 0xe3, 0x7a, 0x83, 0xec, + 0xe6, 0x8c, 0xa7, 0xa2, 0xfa, 0x6c, 0x8f, 0x9e, 0x34, 0xa6, 0x29, 0x03, 0x35, 0xaa, + 0xff, 0x81, 0x1a, 0xce, 0x9a, 0x23, 0xbd, 0xa3, 0x9a, 0xba, 0x72, 0xf1, 0x56, 0x6f, + 0xc1, 0x68, 0x84, 0x97, 0xd2, 0xa7, 0x92, 0x8c, 0x36, 0x70, 0x15, 0x25, 0x67, 0x8b, + 0xc9, 0x72, 0x14, 0xb3, 0x1b, 0x37, 0xba, 0xb4, 0x6b, 0x88, 0xf2, 0x7f, 0x04, 0x48, + 0xde, 0xcb, 0x31, 0x62, 0x2d, 0x0f, 0x0f, 0x87, 0xa8, 0x55, 0xba, 0x54, 0x00, 0x03, + 0x32, 0x03, 0x1f, 0x73, 0xab, 0xff, 0xd4, 0x65, 0x91, 0xda, 0x0b, 0x88, 0x72, 0x35, + 0x04, 0xed, 0xb2, 0x33, 0x72, 0x30, 0xda, 0xd2, 0xac, 0xc0, 0xd8, 0xbb, 0x68, 0xbc, + 0x83, 0x7a, 0x2f, 0xf9, 0x30, 0xbf, 0xf0, 0x6f, 0xde, 0x74, 0xeb, 0x90, 0xaa, 0xe4, + 0xf6, 0x0d, 0xbb, 0x6e, 0xb8, 0x27, 0xea, 0x99, 0x88, 0x4a, 0xcd, 0x62, 0x85, 0xa9, + 0x88, 0x92, 0x80, 0x2c, 0xf5, 0x9d, 0x5d, 0x60, 0xd0, 0x16, 0x63, 0x38, 0x7b, 0x3e, + 0xd2, 0x72, 0x3b, 0xd6, 0x48, 0x9e, 0x9c, 0x2c, 0x10, 0x6d, 0x4a, 0xa2, 0xde, 0x23, + 0xce, 0xd1, 0x6c, 0x72, 0x04, 0x29, 0xc7, 0x75, 0x3a, 0x77, 0x38, 0xec, 0x7d, 0x9d, + 0xb8, 0x62, 0x42, 0x29, 0xed, 0xd2, 0x17, 0xb8, 0x0d, 0x74, 0x87, 0x5a, 0x14, 0xca, + 0xe4, 0x86, 0x3f, 0x13, 0x9e, 0x9c, 0x0b, 0x13, 0x1b, 0x2a, 0x4c, 0x28, 0x07, 0x1a, + 0x38, 0xec, 0x61, 0xf6, 0x68, 0x01, 0xaa, 0x59, 0x56, 0xfc, 0xb2, 0xa4, 0x6b, 0x95, + 0x87, 0x66, 0x5b, 0x75, 0x71, 0xaa, 0x03, 0x48, 0x1f, 0xd8, 0xd9, 0xd5, 0x69, 0x8f, + 0x83, 0x6f, 0xc8, 0x63, 0x5e, 0x69, 0xe3, 0xbd, 0xe4, 0x2f, 0x4a, 0xc0, 0x71, 0x32, + 0x8b, 0x54, 0x09, 0xf6, 0xe4, 0x2d, 0x79, 0x0a, 0xed, 0xd7, 0x3b, 0xc1, 0xa2, 0x35, + 0x47, 0x23, 0xb3, 0xb8, 0x19, 0xd0, 0x63, 0x7a, 0x6f, 0xa4, 0x66, 0x39, 0x46, 0xa3, + 0x0a, 0xc5, 0xaf, 0xdd, 0x30, 0xce, 0x83, 0x0f, 0x67, 0x91, 0xb4, 0x57, 0x52, 0x70, + 0xa1, 0x72, 0x0f, 0x91, 0x86, 0x6e, 0x2b, 0x86, 0xf4, 0x78, 0x88, 0x94, 0xc8, 0xda, + 0x62, 0xd8, 0xb9, 0x1f, 0xaf, 0x52, 0x0e, 0x3b, 0xed, 0xbc, 0x12, 0x06, 0xa5, 0xa5, + 0xe6, 0xef, 0xd3, 0xdf, 0xde, 0x08, 0x43, 0xc3, 0xb0, 0x67, 0x57, 0x64, 0x3f, 0xc0, + 0x06, 0x00, 0x88, 0x38, 0xca, 0x47, 0x30, 0x87, 0xf8, 0x97, 0x79, 0x18, 0xcc, 0x1b, + 0x81, 0xc9, 0xe6, 0x8e, 0x3b, 0x88, 0x8f, 0xe6, 0xf7, 0xc6, 0x30, 0xf1, 0xbc, 0x7a, + 0xe1, 0x88, 0xf5, 0x12, 0x84, 0x20, 0x41, 0xca, 0xda, 0x1e, 0x05, 0xf8, 0x66, 0xd2, + 0x56, 0x2d, 0xbe, 0x09, 0xc4, 0xb4, 0x30, 0x68, 0xf7, 0x54, 0xda, 0xd3, 0x4d, 0xf0, + 0xfc, 0xfc, 0x18, 0x1f, 0x31, 0x80, 0x1a, 0x79, 0x92, 0xd2, 0xf1, 0x6b, 0xe0, 0x21, + 0x1b, 0x4a, 0x22, 0xf6, 0x2a, 0xab, 0x64, 0x70, 0x1b, 0xf4, 0xa4, 0xe6, 0xd6, 0x66, + 0xfc, 0x30, 0x4a, 0x5c, 0x79, 0xc6, 0x09, 0xac, 0xc4, 0x3b, 0x00, 0xb4, 0x86, 0x48, + 0x93, 0xd3, 0x7d, 0x50, 0x07, 0xf0, 0xc3, 0x29, 0xa4, 0x75, 0x50, 0x52, 0x57, 0x75, + 0x70, 0xdd, 0x38, 0xfa, 0xc0, 0x43, 0xcd, 0x91, 0xc1, 0x2e, 0xe3, 0x4e, 0x9c, 0xfa, + 0xe3, 0x92, 0xa7, 0x8b, 0xda, 0xbd, 0x4e, 0xe3, 0x1d, 0xc0, 0xde, 0xb0, 0x2f, 0xe7, + 0xb1, 0xd8, 0xb0, 0x17, 0x8a, 0xc9, 0x51, 0x31, 0x05, 0xfc, 0xc7, 0xe3, 0x0b, 0xa8, + 0xe0, 0x16, 0xaa, 0x36, 0xa6, 0xb5, 0xdf, 0x5e, 0x5a, 0x19, 0x09, 0xf6, 0x3a, 0xba, + 0x09, 0x5d, 0x98, 0x77, 0xa8, 0xf2, 0xdc, 0x53, 0xf4, 0x6f, 0x6c, 0x9b, 0x07, 0xad, + 0xdf, 0x14, 0x6f, 0x4f, 0xfa, 0x50, 0x1f, 0x9d, 0xd3, 0xcf, 0xf9, 0x24, 0xe3, 0x01, + 0x0f, 0xaf, 0x50, 0x4e, 0x2b, 0x8a, 0xca, 0x73, + ], + c_enc: [ + 0x13, 0xd7, 0xdf, 0xcd, 0x1d, 0x75, 0x4d, 0xcd, 0x16, 0x52, 0x32, 0x83, 0x8f, 0x14, + 0xdd, 0x80, 0x5e, 0x12, 0xcc, 0x7e, 0x75, 0x15, 0x43, 0xd2, 0xa6, 0x8e, 0x23, 0x7a, + 0x92, 0x3b, 0xce, 0xeb, 0xa3, 0x5a, 0x62, 0x43, 0xc6, 0xa4, 0xc5, 0xf0, 0xd2, 0xa4, + 0xc3, 0x86, 0x07, 0xa6, 0xf1, 0x1b, 0x17, 0xfd, 0xd6, 0xc6, 0x92, 0x66, 0xf2, 0xc9, + 0x6a, 0xdc, 0x44, 0x6f, 0x2e, 0x2d, 0x07, 0x3e, 0xe9, 0xea, 0xe2, 0x9a, 0x37, 0xef, + 0x5d, 0x03, 0xf6, 0x78, 0xf5, 0x56, 0x29, 0x45, 0xb2, 0x08, 0x27, 0x76, 0xce, 0x9f, + 0x39, 0x08, 0x87, 0x3a, 0x99, 0xa6, 0xa2, 0x8b, 0xae, 0xdc, 0x7f, 0x54, 0x89, 0xce, + 0x4b, 0x30, 0xd8, 0x43, 0x66, 0xc5, 0x46, 0xb4, 0x36, 0x67, 0x91, 0x44, 0xf9, 0x27, + 0xf7, 0x1c, 0x65, 0x09, 0x69, 0xda, 0x22, 0x42, 0x28, 0x5a, 0x86, 0x27, 0x96, 0x54, + 0x89, 0xb7, 0x0b, 0x35, 0x6c, 0xf7, 0x4e, 0x07, 0x8a, 0xa2, 0x7d, 0xa8, 0xf9, 0x2f, + 0xb3, 0x09, 0x57, 0x12, 0x62, 0xf2, 0xd4, 0xc3, 0x36, 0xf7, 0x12, 0x15, 0x9b, 0x3e, + 0x9b, 0x43, 0x24, 0x38, 0x5b, 0xb3, 0x26, 0x2a, 0xc5, 0xf3, 0x13, 0x57, 0xaf, 0x9e, + 0x1a, 0xaa, 0x75, 0xd0, 0x1c, 0x06, 0x31, 0xbf, 0xdd, 0x34, 0xc5, 0x9b, 0x27, 0xd5, + 0x3b, 0xeb, 0xf1, 0xaa, 0x54, 0xe9, 0xc4, 0xaa, 0x98, 0x0f, 0x24, 0x7b, 0xf4, 0x22, + 0xa0, 0xe6, 0xdb, 0xf5, 0x54, 0x6e, 0xdc, 0x10, 0x0f, 0xce, 0x6c, 0xce, 0xc8, 0x32, + 0x7e, 0xb4, 0x8a, 0x9a, 0x39, 0xe4, 0xc2, 0xa9, 0x12, 0xb2, 0x98, 0x85, 0xe0, 0xc3, + 0xe7, 0x33, 0x55, 0x58, 0xbd, 0x85, 0x84, 0x38, 0xd0, 0x35, 0xd2, 0xf2, 0xbe, 0x1d, + 0x35, 0x66, 0xe4, 0x22, 0xfe, 0x37, 0xc0, 0xcb, 0x2e, 0x05, 0x8d, 0xad, 0x8c, 0xc6, + 0x45, 0x62, 0xa5, 0x50, 0x1b, 0x54, 0xa4, 0x4f, 0x9a, 0x77, 0x77, 0xc6, 0xd2, 0x77, + 0x04, 0xa4, 0xce, 0xad, 0x26, 0xa1, 0xc2, 0x56, 0x01, 0x8d, 0xc1, 0xbb, 0xfa, 0x58, + 0x84, 0xa0, 0x6c, 0xc7, 0x25, 0x23, 0xaf, 0xfb, 0x43, 0xf5, 0xc5, 0xbc, 0x2f, 0x1d, + 0x36, 0x04, 0x0f, 0x85, 0xf7, 0xe8, 0xc0, 0x62, 0xc1, 0xf2, 0x26, 0x50, 0x9d, 0x20, + 0xf9, 0xa4, 0x88, 0x5e, 0x15, 0x70, 0x4f, 0x73, 0x01, 0xdf, 0x60, 0x3d, 0xa1, 0xfc, + 0x5b, 0xca, 0x84, 0xf8, 0x55, 0xc1, 0x17, 0xcb, 0x30, 0x55, 0xc5, 0x70, 0x83, 0x45, + 0x7e, 0x1d, 0x14, 0x85, 0x7c, 0x2b, 0xf9, 0x41, 0xe8, 0x20, 0x73, 0x5c, 0x58, 0x8a, + 0xae, 0x6f, 0x66, 0x45, 0xdc, 0x3f, 0xbd, 0x30, 0x65, 0xab, 0xa1, 0x7f, 0xd2, 0x48, + 0x2a, 0x1b, 0x37, 0xb2, 0xf3, 0x88, 0x07, 0x5e, 0x46, 0xbb, 0x9d, 0x37, 0x27, 0xcc, + 0x73, 0xdb, 0xae, 0x0e, 0x96, 0xa8, 0x44, 0x5f, 0xda, 0x8f, 0x87, 0x64, 0xf9, 0x68, + 0x0b, 0xf6, 0xc5, 0x91, 0xa8, 0x48, 0x10, 0xfa, 0x0c, 0x1b, 0x5a, 0x2f, 0x2a, 0xa9, + 0xad, 0xbb, 0x88, 0x64, 0x22, 0x31, 0x72, 0x1e, 0xd6, 0xea, 0x12, 0x16, 0xab, 0x9b, + 0xfa, 0x0e, 0x12, 0x4c, 0xe4, 0x74, 0x94, 0x44, 0x53, 0x4d, 0x68, 0x70, 0x19, 0x74, + 0x60, 0xf7, 0x49, 0xef, 0xb0, 0x28, 0x8f, 0x96, 0x28, 0x3f, 0xc9, 0x37, 0xef, 0xbb, + 0x14, 0x59, 0xaa, 0x73, 0xc2, 0x7b, 0x6b, 0x2b, 0x5c, 0x57, 0x7d, 0x46, 0x60, 0xf9, + 0x8e, 0x81, 0x8c, 0xaa, 0xad, 0xbe, 0x45, 0x4e, 0xcd, 0x16, 0xc1, 0xd8, 0xa9, 0x9b, + 0x77, 0x97, 0x8e, 0x93, 0xd6, 0x9d, 0xcb, 0x8b, 0xf0, 0xe8, 0x4a, 0x0a, 0x91, 0x3f, + 0x55, 0xcc, 0x16, 0x50, 0xc2, 0xb9, 0x2d, 0x4c, 0x9d, 0xcd, 0xb1, 0x2e, 0xe2, 0x36, + 0x7e, 0xd9, 0x79, 0xb9, 0x53, 0x5f, 0xe1, 0x5c, 0x87, 0xd1, 0x7f, 0x37, 0xa3, 0x24, + 0x84, 0x7f, 0x16, 0x45, 0x39, 0x75, 0x7d, 0x83, 0x00, 0x87, 0xf6, 0x39, 0xeb, 0x6c, + 0x3e, 0xfb, 0x8d, 0xa4, 0xff, 0xa5, 0xd7, 0xca, 0x58, 0x34, 0x4d, 0x65, 0x81, 0x76, + 0x64, 0xa7, 0x4e, 0xaf, 0xa1, 0xa4, 0x7f, 0x69, 0xf1, 0xc8, 0x10, 0x6b, 0x6f, 0x5f, + 0x96, 0x4f, 0x4c, 0x73, 0xed, 0xed, 0xb1, 0xe1, 0x25, 0xde, 0xb2, 0x28, 0xc5, 0x62, + 0xfd, 0xc1, 0x87, 0x41, 0x41, 0xa9, 0x7c, 0x62, 0x58, 0x16, 0xc0, 0xcf, 0xeb, 0x83, + 0x84, 0x28, 0x7f, 0x6b, 0x2d, 0x5f, 0xa1, 0x81, 0x89, 0xe1, 0x4f, 0x91, 0xdf, 0x72, + 0x4e, 0x59, 0x80, 0x45, 0x8c, 0x51, 0xfb, 0x1c, 0xd8, 0x46, + ], + ock: [ + 0x59, 0xb8, 0x10, 0x2e, 0x91, 0x7f, 0xf5, 0xa4, 0x23, 0x60, 0x50, 0x7c, 0xce, 0x30, + 0xcc, 0x5b, 0xda, 0xb7, 0x76, 0x18, 0x61, 0x9f, 0x52, 0xda, 0xfa, 0xbd, 0xf5, 0x5a, + 0x3f, 0x64, 0xc1, 0xee, + ], + op: [ + 0x6f, 0xce, 0x26, 0xab, 0xe6, 0xc0, 0xb6, 0x84, 0x37, 0x36, 0x96, 0x46, 0xee, 0xe1, + 0xe9, 0xdc, 0xa5, 0x1a, 0x42, 0x58, 0xf3, 0xae, 0x72, 0x23, 0x87, 0xf6, 0xd0, 0xdf, + 0xf4, 0x1a, 0x1f, 0x88, 0x2f, 0x98, 0x2d, 0xec, 0xa7, 0x60, 0x51, 0x41, 0xd9, 0xc9, + 0xa1, 0xe6, 0xfb, 0x57, 0xe2, 0xb8, 0x01, 0xb4, 0x49, 0x6f, 0xbd, 0xd4, 0xc0, 0xa8, + 0xb9, 0x5f, 0xc8, 0x7e, 0xa7, 0x37, 0x3e, 0x2f, + ], + c_out: [ + 0x7e, 0xaf, 0x92, 0x5e, 0x3e, 0x5c, 0xd2, 0x0c, 0xc9, 0x34, 0x9f, 0x17, 0x4b, 0xdc, + 0x8c, 0x46, 0x45, 0x65, 0xb8, 0x04, 0x68, 0x9d, 0x79, 0x8d, 0x63, 0x2f, 0x58, 0xaa, + 0x26, 0x7a, 0x2f, 0x4e, 0x65, 0xed, 0x07, 0x33, 0xc4, 0x18, 0x67, 0x7b, 0xda, 0x1a, + 0xf5, 0x6e, 0xa9, 0xfd, 0xec, 0xcc, 0xcc, 0xdc, 0x10, 0xa9, 0xb6, 0xda, 0xa4, 0x92, + 0x4b, 0x46, 0x2f, 0x1e, 0x9d, 0x08, 0x65, 0xba, 0xc3, 0xab, 0x71, 0x7a, 0xb8, 0x4f, + 0x54, 0x2c, 0x2f, 0x8d, 0x46, 0xe3, 0x20, 0x5f, 0xb0, 0x33, + ], + }, + TestVector { + incoming_viewing_key: [ + 0xa6, 0x68, 0x13, 0x52, 0xa3, 0x52, 0x26, 0x91, 0x10, 0x0f, 0x53, 0xfc, 0x34, 0xab, + 0x73, 0x32, 0x8a, 0xf1, 0xb9, 0xf3, 0xa4, 0xa0, 0x6d, 0xbd, 0x3a, 0x14, 0x99, 0x67, + 0x09, 0xe6, 0xf2, 0x84, 0x31, 0xee, 0x72, 0xf2, 0x69, 0xae, 0xd7, 0x5d, 0x36, 0x34, + 0x89, 0x36, 0x90, 0x5e, 0xbb, 0x91, 0x80, 0x7d, 0x74, 0xd5, 0x0c, 0xb2, 0x7f, 0xcd, + 0x8b, 0x4f, 0xb6, 0xf4, 0x48, 0xc3, 0x62, 0x03, + ], + ovk: [ + 0x78, 0xf1, 0x45, 0xea, 0x29, 0xd2, 0x71, 0xb9, 0x40, 0xc6, 0x99, 0x41, 0xe4, 0xc3, + 0xfd, 0x2d, 0x71, 0xf3, 0xb1, 0x90, 0x69, 0x0e, 0xe1, 0x6f, 0x5d, 0x14, 0xac, 0x22, + 0x24, 0xe6, 0xfc, 0x89, + ], + default_d: [ + 0x11, 0x6e, 0x79, 0x94, 0x55, 0xae, 0xa1, 0x91, 0x8f, 0xbf, 0xd4, + ], + default_pk_d: [ + 0x3e, 0x5e, 0x46, 0xeb, 0x0f, 0xe8, 0xe6, 0xf0, 0xcf, 0x6a, 0xab, 0x2b, 0x41, 0xfb, + 0xcf, 0xfb, 0xb2, 0x98, 0xf8, 0xd5, 0x34, 0xc8, 0xd9, 0xd3, 0x11, 0xe4, 0xc6, 0x10, + 0x3a, 0x56, 0x6a, 0xaa, + ], + v: 15093716717054627455, + rseed: [ + 0x7e, 0x62, 0x25, 0x8d, 0x65, 0xa1, 0x92, 0x15, 0x7c, 0xdf, 0x2e, 0xc3, 0x21, 0x40, + 0x7f, 0x68, 0x2f, 0x5e, 0xec, 0x6a, 0x32, 0x97, 0xab, 0x20, 0xb7, 0x06, 0x1c, 0x62, + 0x24, 0x57, 0x16, 0xa4, + ], + asset: [ + 0x96, 0x86, 0xaa, 0x36, 0x36, 0xbd, 0x37, 0x5b, 0xd3, 0x13, 0x6b, 0xee, 0x0b, 0xda, + 0xab, 0xcf, 0xac, 0x88, 0x1b, 0xc7, 0x01, 0x81, 0x27, 0x21, 0xe6, 0xfb, 0x75, 0xaa, + 0x07, 0x2d, 0x2d, 0x18, + ], + memo: [ + 0xff, 0x4f, 0x71, 0xfb, 0xfc, 0x34, 0xc7, 0x9b, 0x44, 0xe0, 0x9e, 0x42, 0x12, 0xac, + 0x26, 0x53, 0xf6, 0xc4, 0x03, 0x64, 0x3e, 0x1c, 0x5b, 0x9a, 0xd1, 0x34, 0xd8, 0x9c, + 0x68, 0x0b, 0x70, 0x72, 0x83, 0xaf, 0x54, 0x32, 0x6f, 0xc4, 0xf8, 0x4d, 0x6a, 0x58, + 0x29, 0xa0, 0xad, 0x48, 0x30, 0x80, 0x6c, 0x05, 0x75, 0x84, 0x92, 0xcd, 0x6a, 0xc4, + 0x6b, 0xa0, 0x1a, 0x2b, 0x37, 0x22, 0xb5, 0xe4, 0xcd, 0xaf, 0xbb, 0x3f, 0x36, 0x78, + 0x5f, 0x42, 0x4a, 0xf0, 0x44, 0xda, 0xc5, 0xdb, 0x5f, 0x7d, 0xf8, 0x39, 0xeb, 0x63, + 0xc0, 0xc1, 0x7d, 0x8b, 0x0c, 0x79, 0xdb, 0x86, 0x30, 0x94, 0x20, 0x15, 0xbe, 0x13, + 0xf7, 0x9a, 0xf6, 0xf4, 0x3e, 0x5a, 0xb0, 0x77, 0x81, 0x14, 0x79, 0x8f, 0x44, 0x22, + 0x58, 0xee, 0xdc, 0x43, 0x6f, 0xcc, 0x38, 0x6b, 0x36, 0xb5, 0x7e, 0x19, 0x17, 0xd7, + 0x20, 0x17, 0x73, 0x66, 0xf4, 0x24, 0xb0, 0xa5, 0x4b, 0x0b, 0x60, 0xf4, 0xfb, 0x13, + 0x58, 0xc2, 0x0a, 0xa4, 0x1d, 0xc5, 0x02, 0xe1, 0xdd, 0x8a, 0x16, 0x33, 0xf3, 0xd8, + 0xe3, 0x27, 0x6b, 0x59, 0xe7, 0xd2, 0xc4, 0xe6, 0x24, 0xa6, 0xf5, 0x36, 0x95, 0xbc, + 0xaf, 0x24, 0x7e, 0x36, 0x48, 0x3f, 0x13, 0xb2, 0x04, 0x42, 0x22, 0x37, 0xfc, 0x6a, + 0xb3, 0xeb, 0xa0, 0x2f, 0xc4, 0x14, 0x2b, 0x42, 0x97, 0xeb, 0xb5, 0x68, 0x3d, 0xb8, + 0xd2, 0x43, 0x19, 0x70, 0x6a, 0xd2, 0x6a, 0xaf, 0xd8, 0x1c, 0x53, 0xb7, 0x40, 0xf3, + 0x45, 0x43, 0xa6, 0xb3, 0xe9, 0xf5, 0xbb, 0x7d, 0x5c, 0x49, 0xe8, 0xc3, 0x7f, 0x61, + 0x49, 0x21, 0x25, 0x4f, 0x32, 0x12, 0x39, 0x4c, 0x79, 0x7d, 0x1c, 0xee, 0x78, 0x99, + 0xb7, 0xb4, 0xb6, 0x5b, 0x59, 0xb7, 0x34, 0x2f, 0x92, 0x53, 0x1c, 0x1d, 0x59, 0xe1, + 0x79, 0x70, 0xb7, 0x31, 0x74, 0x14, 0x43, 0x8c, 0xd8, 0x0b, 0xd0, 0xf9, 0xa6, 0x7c, + 0x9b, 0x9e, 0x55, 0x2f, 0x01, 0x3c, 0x11, 0x5a, 0x95, 0x4f, 0x35, 0xe0, 0x61, 0x6c, + 0x68, 0xd4, 0x31, 0x63, 0xd3, 0x34, 0xda, 0xc3, 0x82, 0x70, 0x33, 0xe5, 0xad, 0x84, + 0x88, 0xbf, 0xd9, 0xc4, 0xbb, 0xbe, 0x8f, 0x59, 0x35, 0xc6, 0xc5, 0xea, 0x04, 0xc3, + 0xad, 0x49, 0xc7, 0x47, 0xa9, 0xe7, 0x23, 0x1b, 0xcd, 0x7d, 0x16, 0x21, 0x5e, 0x6e, + 0x80, 0x73, 0x7d, 0x6b, 0x54, 0xfe, 0xc8, 0xb8, 0x84, 0x02, 0xf0, 0x47, 0x52, 0x45, + 0xe1, 0x74, 0xa7, 0x45, 0xb8, 0x31, 0xf8, 0xfe, 0x03, 0xa7, 0x6f, 0xb9, 0xce, 0xca, + 0x4d, 0x22, 0xb7, 0x83, 0xc3, 0x28, 0xc6, 0x91, 0x5c, 0x43, 0x40, 0x50, 0x64, 0xae, + 0x56, 0xbc, 0x89, 0xe6, 0x4d, 0x15, 0x78, 0xe4, 0xd3, 0xa3, 0x4b, 0xb9, 0x55, 0x91, + 0xea, 0xf1, 0xd3, 0xda, 0x02, 0xa4, 0x54, 0x9f, 0xa8, 0x0d, 0xb0, 0xff, 0x7c, 0xb0, + 0x39, 0x93, 0xb6, 0x8a, 0xe1, 0x5a, 0x30, 0xe8, 0x79, 0x49, 0xaa, 0x08, 0x0e, 0x94, + 0xab, 0xde, 0x68, 0x89, 0x8c, 0x33, 0x92, 0xa2, 0x17, 0xd6, 0x49, 0x61, 0x6b, 0xbe, + 0x73, 0x9b, 0x13, 0xd1, 0x4d, 0xf0, 0x3f, 0xf2, 0x76, 0x71, 0x48, 0x9b, 0xe0, 0xb4, + 0xbe, 0xba, 0xaf, 0xa7, 0xd1, 0xe6, 0x39, 0xd5, 0xb3, 0xe9, 0x94, 0xff, 0xb6, 0xb7, + 0xa2, 0x09, 0xf6, 0xad, 0xfe, 0x8d, 0x1e, 0x5c, 0xcf, 0x01, 0x0c, 0x19, 0x16, 0x8a, + 0xeb, 0x18, 0xaa, 0x9d, 0x68, 0x7e, 0x24, 0xad, 0xc0, 0xb1, 0x13, 0x5c, 0x70, 0xc9, + 0x70, 0xe0, 0x90, 0x3a, 0xf6, 0xe1, 0x70, 0x81, 0xd5, 0x81, 0x8e, 0x88, 0xb1, 0x4e, + 0x4f, 0x60, 0x1b, 0x8c, 0x06, 0x3e, 0x3f, 0x43, 0x87, 0xff, 0xa2, 0x32, 0x2a, 0x51, + 0x81, 0x90, 0x9f, 0x09, 0x80, 0xd6, 0x89, 0xde, + ], + cv_net: [ + 0x91, 0x6d, 0xc3, 0x82, 0x2a, 0x4e, 0x3b, 0xb4, 0x1f, 0xa8, 0x33, 0xc2, 0x73, 0xa9, + 0xd3, 0x7d, 0x17, 0x17, 0xa4, 0x8d, 0x8f, 0x00, 0x6c, 0x1f, 0xf5, 0x86, 0x21, 0x46, + 0x29, 0x55, 0x39, 0x1c, + ], + rho: [ + 0x57, 0x87, 0x18, 0x97, 0x6d, 0xa3, 0xdc, 0xb4, 0x30, 0x32, 0x71, 0x52, 0x20, 0x72, + 0xd0, 0x28, 0x44, 0x22, 0x13, 0x50, 0x86, 0x4e, 0xed, 0x56, 0x3d, 0xab, 0x30, 0x22, + 0x7f, 0x28, 0x4b, 0x2e, + ], + cmx: [ + 0x7a, 0xd4, 0xd8, 0xf5, 0xd4, 0xe7, 0xa9, 0x79, 0xfa, 0x73, 0x93, 0xed, 0x26, 0xf1, + 0x7d, 0x14, 0x2b, 0x65, 0xf5, 0x3b, 0xb4, 0x6d, 0xa6, 0x0a, 0x50, 0x22, 0x28, 0xc0, + 0x7b, 0x2c, 0xda, 0x27, + ], + esk: [ + 0xe4, 0x00, 0x13, 0x04, 0x47, 0xc1, 0xbd, 0x1a, 0x0c, 0x13, 0x02, 0xf5, 0x10, 0xe9, + 0xeb, 0x09, 0xed, 0x76, 0xda, 0xbc, 0xfe, 0x2a, 0x69, 0x1c, 0xc4, 0x69, 0x2d, 0x0c, + 0x1b, 0x30, 0x33, 0x01, + ], + ephemeral_key: [ + 0x27, 0xcb, 0x40, 0x68, 0x0f, 0xb1, 0xd9, 0x19, 0x64, 0x6e, 0x74, 0x20, 0xe6, 0xa8, + 0xb5, 0x20, 0xe1, 0x9a, 0x17, 0x3f, 0x1e, 0x79, 0x4d, 0x2b, 0x49, 0x2b, 0xfa, 0xbb, + 0x83, 0xce, 0x6c, 0xa0, + ], + shared_secret: [ + 0x1c, 0xd0, 0x66, 0x91, 0x6c, 0x19, 0xfa, 0x33, 0x69, 0xaa, 0x3c, 0x6a, 0x53, 0x76, + 0x97, 0xf4, 0xb4, 0x26, 0x44, 0xda, 0x20, 0xca, 0x46, 0x79, 0x93, 0x2b, 0x7c, 0x90, + 0x5f, 0x2d, 0x69, 0x00, + ], + k_enc: [ + 0xce, 0x9d, 0x22, 0x0d, 0x3a, 0xfe, 0xc6, 0x23, 0x21, 0xdd, 0xf1, 0x97, 0xa6, 0x36, + 0xdc, 0xb3, 0x45, 0x58, 0x83, 0xb7, 0x35, 0x82, 0x8c, 0x65, 0xe7, 0x16, 0x6c, 0x15, + 0xd8, 0xcc, 0xfc, 0xf9, + ], + p_enc: [ + 0x03, 0x11, 0x6e, 0x79, 0x94, 0x55, 0xae, 0xa1, 0x91, 0x8f, 0xbf, 0xd4, 0x7f, 0x8e, + 0x6a, 0x5c, 0x62, 0xa7, 0x77, 0xd1, 0x7e, 0x62, 0x25, 0x8d, 0x65, 0xa1, 0x92, 0x15, + 0x7c, 0xdf, 0x2e, 0xc3, 0x21, 0x40, 0x7f, 0x68, 0x2f, 0x5e, 0xec, 0x6a, 0x32, 0x97, + 0xab, 0x20, 0xb7, 0x06, 0x1c, 0x62, 0x24, 0x57, 0x16, 0xa4, 0x96, 0x86, 0xaa, 0x36, + 0x36, 0xbd, 0x37, 0x5b, 0xd3, 0x13, 0x6b, 0xee, 0x0b, 0xda, 0xab, 0xcf, 0xac, 0x88, + 0x1b, 0xc7, 0x01, 0x81, 0x27, 0x21, 0xe6, 0xfb, 0x75, 0xaa, 0x07, 0x2d, 0x2d, 0x18, + 0xff, 0x4f, 0x71, 0xfb, 0xfc, 0x34, 0xc7, 0x9b, 0x44, 0xe0, 0x9e, 0x42, 0x12, 0xac, + 0x26, 0x53, 0xf6, 0xc4, 0x03, 0x64, 0x3e, 0x1c, 0x5b, 0x9a, 0xd1, 0x34, 0xd8, 0x9c, + 0x68, 0x0b, 0x70, 0x72, 0x83, 0xaf, 0x54, 0x32, 0x6f, 0xc4, 0xf8, 0x4d, 0x6a, 0x58, + 0x29, 0xa0, 0xad, 0x48, 0x30, 0x80, 0x6c, 0x05, 0x75, 0x84, 0x92, 0xcd, 0x6a, 0xc4, + 0x6b, 0xa0, 0x1a, 0x2b, 0x37, 0x22, 0xb5, 0xe4, 0xcd, 0xaf, 0xbb, 0x3f, 0x36, 0x78, + 0x5f, 0x42, 0x4a, 0xf0, 0x44, 0xda, 0xc5, 0xdb, 0x5f, 0x7d, 0xf8, 0x39, 0xeb, 0x63, + 0xc0, 0xc1, 0x7d, 0x8b, 0x0c, 0x79, 0xdb, 0x86, 0x30, 0x94, 0x20, 0x15, 0xbe, 0x13, + 0xf7, 0x9a, 0xf6, 0xf4, 0x3e, 0x5a, 0xb0, 0x77, 0x81, 0x14, 0x79, 0x8f, 0x44, 0x22, + 0x58, 0xee, 0xdc, 0x43, 0x6f, 0xcc, 0x38, 0x6b, 0x36, 0xb5, 0x7e, 0x19, 0x17, 0xd7, + 0x20, 0x17, 0x73, 0x66, 0xf4, 0x24, 0xb0, 0xa5, 0x4b, 0x0b, 0x60, 0xf4, 0xfb, 0x13, + 0x58, 0xc2, 0x0a, 0xa4, 0x1d, 0xc5, 0x02, 0xe1, 0xdd, 0x8a, 0x16, 0x33, 0xf3, 0xd8, + 0xe3, 0x27, 0x6b, 0x59, 0xe7, 0xd2, 0xc4, 0xe6, 0x24, 0xa6, 0xf5, 0x36, 0x95, 0xbc, + 0xaf, 0x24, 0x7e, 0x36, 0x48, 0x3f, 0x13, 0xb2, 0x04, 0x42, 0x22, 0x37, 0xfc, 0x6a, + 0xb3, 0xeb, 0xa0, 0x2f, 0xc4, 0x14, 0x2b, 0x42, 0x97, 0xeb, 0xb5, 0x68, 0x3d, 0xb8, + 0xd2, 0x43, 0x19, 0x70, 0x6a, 0xd2, 0x6a, 0xaf, 0xd8, 0x1c, 0x53, 0xb7, 0x40, 0xf3, + 0x45, 0x43, 0xa6, 0xb3, 0xe9, 0xf5, 0xbb, 0x7d, 0x5c, 0x49, 0xe8, 0xc3, 0x7f, 0x61, + 0x49, 0x21, 0x25, 0x4f, 0x32, 0x12, 0x39, 0x4c, 0x79, 0x7d, 0x1c, 0xee, 0x78, 0x99, + 0xb7, 0xb4, 0xb6, 0x5b, 0x59, 0xb7, 0x34, 0x2f, 0x92, 0x53, 0x1c, 0x1d, 0x59, 0xe1, + 0x79, 0x70, 0xb7, 0x31, 0x74, 0x14, 0x43, 0x8c, 0xd8, 0x0b, 0xd0, 0xf9, 0xa6, 0x7c, + 0x9b, 0x9e, 0x55, 0x2f, 0x01, 0x3c, 0x11, 0x5a, 0x95, 0x4f, 0x35, 0xe0, 0x61, 0x6c, + 0x68, 0xd4, 0x31, 0x63, 0xd3, 0x34, 0xda, 0xc3, 0x82, 0x70, 0x33, 0xe5, 0xad, 0x84, + 0x88, 0xbf, 0xd9, 0xc4, 0xbb, 0xbe, 0x8f, 0x59, 0x35, 0xc6, 0xc5, 0xea, 0x04, 0xc3, + 0xad, 0x49, 0xc7, 0x47, 0xa9, 0xe7, 0x23, 0x1b, 0xcd, 0x7d, 0x16, 0x21, 0x5e, 0x6e, + 0x80, 0x73, 0x7d, 0x6b, 0x54, 0xfe, 0xc8, 0xb8, 0x84, 0x02, 0xf0, 0x47, 0x52, 0x45, + 0xe1, 0x74, 0xa7, 0x45, 0xb8, 0x31, 0xf8, 0xfe, 0x03, 0xa7, 0x6f, 0xb9, 0xce, 0xca, + 0x4d, 0x22, 0xb7, 0x83, 0xc3, 0x28, 0xc6, 0x91, 0x5c, 0x43, 0x40, 0x50, 0x64, 0xae, + 0x56, 0xbc, 0x89, 0xe6, 0x4d, 0x15, 0x78, 0xe4, 0xd3, 0xa3, 0x4b, 0xb9, 0x55, 0x91, + 0xea, 0xf1, 0xd3, 0xda, 0x02, 0xa4, 0x54, 0x9f, 0xa8, 0x0d, 0xb0, 0xff, 0x7c, 0xb0, + 0x39, 0x93, 0xb6, 0x8a, 0xe1, 0x5a, 0x30, 0xe8, 0x79, 0x49, 0xaa, 0x08, 0x0e, 0x94, + 0xab, 0xde, 0x68, 0x89, 0x8c, 0x33, 0x92, 0xa2, 0x17, 0xd6, 0x49, 0x61, 0x6b, 0xbe, + 0x73, 0x9b, 0x13, 0xd1, 0x4d, 0xf0, 0x3f, 0xf2, 0x76, 0x71, 0x48, 0x9b, 0xe0, 0xb4, + 0xbe, 0xba, 0xaf, 0xa7, 0xd1, 0xe6, 0x39, 0xd5, 0xb3, 0xe9, 0x94, 0xff, 0xb6, 0xb7, + 0xa2, 0x09, 0xf6, 0xad, 0xfe, 0x8d, 0x1e, 0x5c, 0xcf, 0x01, 0x0c, 0x19, 0x16, 0x8a, + 0xeb, 0x18, 0xaa, 0x9d, 0x68, 0x7e, 0x24, 0xad, 0xc0, 0xb1, 0x13, 0x5c, 0x70, 0xc9, + 0x70, 0xe0, 0x90, 0x3a, 0xf6, 0xe1, 0x70, 0x81, 0xd5, 0x81, 0x8e, 0x88, 0xb1, 0x4e, + 0x4f, 0x60, 0x1b, 0x8c, 0x06, 0x3e, 0x3f, 0x43, 0x87, 0xff, 0xa2, 0x32, 0x2a, 0x51, + 0x81, 0x90, 0x9f, 0x09, 0x80, 0xd6, 0x89, 0xde, + ], + c_enc: [ + 0xb1, 0x69, 0x64, 0x77, 0xe6, 0x58, 0xb6, 0xf8, 0xe2, 0x4e, 0x02, 0x55, 0x52, 0xb4, + 0x8d, 0xd4, 0x84, 0x58, 0xf2, 0xcd, 0x75, 0x70, 0xc0, 0xe8, 0xce, 0xc4, 0xed, 0x4c, + 0xf7, 0x9b, 0xd5, 0xb6, 0x9e, 0xa8, 0x54, 0x12, 0x3b, 0x4e, 0xaf, 0x97, 0x8b, 0x14, + 0x2e, 0xb3, 0xef, 0x53, 0xaa, 0xfc, 0x78, 0x90, 0xdd, 0xa2, 0x8a, 0xfa, 0x25, 0xf1, + 0x45, 0xc8, 0xb9, 0x7f, 0x7b, 0x94, 0x50, 0xc1, 0xd5, 0xe0, 0xc3, 0x7d, 0xaf, 0x5e, + 0xd4, 0xec, 0xd9, 0xb6, 0x3d, 0xbc, 0xd2, 0x15, 0x11, 0x23, 0x13, 0x9b, 0xbc, 0x2b, + 0x65, 0x1a, 0x8f, 0x69, 0xcf, 0xbf, 0xb7, 0xcb, 0x60, 0x44, 0x78, 0xf3, 0xf2, 0x64, + 0xd9, 0xdd, 0x75, 0xcf, 0x31, 0x9e, 0x3e, 0xcd, 0xf5, 0xb3, 0x34, 0x26, 0x54, 0x85, + 0x7c, 0x52, 0xa1, 0xfc, 0x61, 0x40, 0x55, 0xa2, 0x46, 0xf5, 0x26, 0x3e, 0x85, 0x36, + 0x83, 0xef, 0x54, 0x41, 0x3b, 0xac, 0x99, 0x1a, 0xe6, 0x35, 0x01, 0x50, 0xe1, 0x34, + 0x52, 0xa3, 0xa6, 0x20, 0xc5, 0x3f, 0x80, 0xda, 0xcc, 0x7a, 0xf0, 0x59, 0x26, 0xd9, + 0xc5, 0x9a, 0x94, 0xe4, 0x78, 0x9a, 0xcc, 0x68, 0xd8, 0x51, 0x05, 0x6b, 0x75, 0xa7, + 0x4e, 0x2e, 0x1b, 0x38, 0xbf, 0xcb, 0x6d, 0xba, 0xab, 0x37, 0xa3, 0x8a, 0xe0, 0x2c, + 0x9c, 0x35, 0x25, 0x9e, 0x52, 0x84, 0xe4, 0xfe, 0x83, 0xdd, 0xb2, 0x29, 0x24, 0xa1, + 0xc4, 0x0a, 0xa2, 0x5e, 0xd1, 0xf5, 0xc0, 0x6d, 0xa1, 0x58, 0x31, 0xf0, 0x41, 0x50, + 0xa3, 0x7c, 0x1b, 0xa3, 0xd1, 0x17, 0x04, 0x93, 0xca, 0x29, 0xf3, 0x43, 0x4a, 0xfa, + 0x06, 0x9b, 0x46, 0xaf, 0xdc, 0x87, 0x0a, 0x29, 0x6f, 0xdc, 0x0e, 0xb6, 0x1b, 0x55, + 0x70, 0x77, 0xa1, 0xda, 0x1f, 0xe8, 0x22, 0xb6, 0xce, 0x24, 0x7c, 0x8e, 0x19, 0x9f, + 0xc4, 0x85, 0x14, 0x6f, 0x38, 0x4a, 0xcf, 0x5c, 0x52, 0x69, 0x7e, 0xfa, 0xcc, 0x5b, + 0xfe, 0x42, 0x02, 0xe8, 0x5f, 0x06, 0x4b, 0xc8, 0xe1, 0x2e, 0xee, 0x39, 0x79, 0x6d, + 0xfd, 0x13, 0x99, 0xb1, 0xc1, 0xe8, 0xc7, 0x4b, 0x5e, 0xc3, 0xc3, 0x1d, 0x2c, 0xfa, + 0x44, 0x87, 0x02, 0x5c, 0xeb, 0x5d, 0xb3, 0x55, 0x9d, 0x4b, 0x7b, 0xac, 0x02, 0x73, + 0xf1, 0x33, 0x51, 0xd2, 0xd1, 0x3c, 0xec, 0x0a, 0x44, 0x8c, 0x00, 0x11, 0x09, 0x45, + 0x2c, 0x40, 0x92, 0xc8, 0x11, 0x91, 0xa0, 0xda, 0xa9, 0x79, 0xe2, 0x6a, 0x96, 0x24, + 0xe4, 0x0c, 0xa4, 0xac, 0xcb, 0x63, 0x46, 0xaa, 0xe1, 0x88, 0xca, 0x09, 0x39, 0xdd, + 0x9f, 0x6b, 0x6e, 0x45, 0xe4, 0x1b, 0xca, 0xeb, 0xdc, 0x1d, 0xa8, 0x01, 0xcc, 0xd4, + 0xdc, 0x93, 0x32, 0x26, 0x6f, 0xb3, 0xeb, 0x23, 0x7b, 0x07, 0x72, 0x45, 0xa7, 0x91, + 0xec, 0xb4, 0x0e, 0x5c, 0x40, 0x56, 0xad, 0xd6, 0xb1, 0xb5, 0xf7, 0xf8, 0xfa, 0x10, + 0x4f, 0xba, 0x61, 0x3e, 0xd9, 0x29, 0xe1, 0xfa, 0xd2, 0x26, 0x47, 0x50, 0x35, 0xb6, + 0x1a, 0x9f, 0x85, 0xaf, 0xba, 0xfb, 0x16, 0x6b, 0x24, 0xc2, 0x4d, 0x2c, 0x28, 0x93, + 0x7b, 0x17, 0x70, 0xba, 0x26, 0x9c, 0x15, 0xeb, 0x2d, 0x9b, 0xdc, 0x2b, 0x83, 0xea, + 0xd8, 0xa0, 0x1d, 0xdb, 0x11, 0x08, 0x3b, 0x13, 0xd6, 0x2d, 0x57, 0x2c, 0xf7, 0x8d, + 0x5c, 0xba, 0x6f, 0x36, 0x52, 0xca, 0xc4, 0xd2, 0x4c, 0x71, 0xc5, 0x47, 0x27, 0x26, + 0x24, 0xc0, 0x78, 0xe0, 0xb9, 0x69, 0x68, 0xfe, 0x09, 0xd8, 0x3e, 0xf7, 0x30, 0x20, + 0x62, 0xbb, 0x5d, 0x3a, 0x2c, 0xcf, 0x73, 0x4e, 0x0f, 0xd3, 0x51, 0x01, 0xfd, 0x58, + 0x64, 0x73, 0x3f, 0x44, 0xd0, 0x75, 0xc3, 0x8b, 0x73, 0xf6, 0xbf, 0xb8, 0xc3, 0x9c, + 0x7b, 0x6b, 0x3d, 0xbc, 0xd1, 0x9a, 0x05, 0x89, 0x91, 0x86, 0x37, 0xf7, 0x5b, 0xbe, + 0x40, 0x15, 0x7b, 0x80, 0xe5, 0x9e, 0x55, 0x58, 0x50, 0x28, 0xa5, 0xec, 0x20, 0x1e, + 0x00, 0x8f, 0xf6, 0xf5, 0x12, 0xe2, 0x53, 0xcc, 0x9a, 0xcf, 0x62, 0x7d, 0x94, 0x35, + 0xdb, 0x6b, 0x14, 0xb9, 0x82, 0x48, 0x79, 0xf4, 0xe4, 0x0a, 0x36, 0xd5, 0xec, 0x94, + 0x2b, 0xff, 0x04, 0xfd, 0x0b, 0xb8, 0x0c, 0x3e, 0xdd, 0xb7, 0xb2, 0x0a, 0x11, 0x6b, + 0xa7, 0x0d, 0x84, 0x84, 0x6e, 0xc6, 0xd2, 0x52, 0x0f, 0xe7, 0x68, 0x89, 0x9e, 0xd5, + 0x27, 0xd3, 0x1d, 0x32, 0x19, 0x68, 0xde, 0xc1, 0x32, 0x7b, 0x81, 0xcc, 0x61, 0x89, + 0x8f, 0x2c, 0xc4, 0x5a, 0xeb, 0x43, 0x52, 0x9e, 0x7d, 0x08, + ], + ock: [ + 0x89, 0x5c, 0x90, 0x04, 0xec, 0x4c, 0x50, 0xd6, 0xd5, 0xfd, 0x6a, 0x51, 0x71, 0x2a, + 0xcc, 0xa4, 0x77, 0x1e, 0x1c, 0xe0, 0xb9, 0x94, 0x30, 0xf0, 0x45, 0x9d, 0x43, 0xff, + 0x16, 0x6a, 0x93, 0xf8, + ], + op: [ + 0x3e, 0x5e, 0x46, 0xeb, 0x0f, 0xe8, 0xe6, 0xf0, 0xcf, 0x6a, 0xab, 0x2b, 0x41, 0xfb, + 0xcf, 0xfb, 0xb2, 0x98, 0xf8, 0xd5, 0x34, 0xc8, 0xd9, 0xd3, 0x11, 0xe4, 0xc6, 0x10, + 0x3a, 0x56, 0x6a, 0xaa, 0xe4, 0x00, 0x13, 0x04, 0x47, 0xc1, 0xbd, 0x1a, 0x0c, 0x13, + 0x02, 0xf5, 0x10, 0xe9, 0xeb, 0x09, 0xed, 0x76, 0xda, 0xbc, 0xfe, 0x2a, 0x69, 0x1c, + 0xc4, 0x69, 0x2d, 0x0c, 0x1b, 0x30, 0x33, 0x01, + ], + c_out: [ + 0xc7, 0xf4, 0x90, 0x67, 0x45, 0x7f, 0x0c, 0xa0, 0xbf, 0x73, 0x0e, 0x55, 0x17, 0x06, + 0x7d, 0x49, 0x39, 0x9a, 0xce, 0xb7, 0xa6, 0x32, 0x85, 0x34, 0x63, 0x90, 0x76, 0xc1, + 0x44, 0xb2, 0x96, 0xc4, 0xce, 0xd1, 0x5a, 0x49, 0xd3, 0xba, 0xe5, 0x8e, 0xc5, 0xf8, + 0xc0, 0xb5, 0x48, 0x06, 0x33, 0x4e, 0x63, 0xc1, 0x14, 0x1c, 0xb8, 0xd3, 0x04, 0x49, + 0x2a, 0xf5, 0xff, 0x0b, 0x5c, 0x14, 0x75, 0x8d, 0x45, 0x60, 0x30, 0x82, 0x0a, 0xbd, + 0xd6, 0x8f, 0x2e, 0x67, 0xa5, 0x87, 0xb2, 0x60, 0xf0, 0x48, + ], + }, + ] +} diff --git a/src/tree.rs b/src/tree.rs index 352974672..a10de6ea5 100644 --- a/src/tree.rs +++ b/src/tree.rs @@ -84,7 +84,7 @@ impl Anchor { /// The Merkle path from a leaf of the note commitment tree /// to its anchor. -#[derive(Debug)] +#[derive(Debug, Clone)] pub struct MerklePath { position: u32, auth_path: [MerkleHashOrchard; MERKLE_DEPTH_ORCHARD], diff --git a/src/value.rs b/src/value.rs index 9ac440eeb..b156770d2 100644 --- a/src/value.rs +++ b/src/value.rs @@ -40,6 +40,7 @@ use core::fmt::{self, Debug}; use core::iter::Sum; use core::ops::{Add, RangeInclusive, Sub}; +use std::ops::Neg; use bitvec::{array::BitArray, order::Lsb0}; use ff::{Field, PrimeField}; @@ -53,12 +54,13 @@ use rand::RngCore; use subtle::CtOption; use crate::{ - constants::fixed_bases::{ - VALUE_COMMITMENT_PERSONALIZATION, VALUE_COMMITMENT_R_BYTES, VALUE_COMMITMENT_V_BYTES, - }, + constants::fixed_bases::{VALUE_COMMITMENT_PERSONALIZATION, VALUE_COMMITMENT_R_BYTES}, primitives::redpallas::{self, Binding}, }; +use crate::builder::BuildError; +use crate::note::AssetBase; + /// Maximum note value. pub const MAX_NOTE_VALUE: u64 = u64::MAX; @@ -116,6 +118,11 @@ impl NoteValue { pub(crate) fn to_le_bits(self) -> BitArray<[u8; 8], Lsb0> { BitArray::<_, Lsb0>::new(self.0.to_le_bytes()) } + + /// The minimum, greater than zero, note value that can not be split further. + pub fn unsplittable() -> Self { + NoteValue(1u64) + } } impl From<&NoteValue> for Assigned { @@ -124,6 +131,12 @@ impl From<&NoteValue> for Assigned { } } +impl From for i128 { + fn from(value: NoteValue) -> Self { + value.0 as i128 + } +} + impl Sub for NoteValue { type Output = ValueSum; @@ -176,15 +189,33 @@ impl ValueSum { sign, ) } + + pub(crate) fn into>(self) -> Result { + i64::try_from(self) + .map_err(BuildError::ValueSum) + .and_then(|i| V::try_from(i).map_err(|_| BuildError::ValueSum(OverflowError))) + } } -impl Add for ValueSum { +impl> Add for ValueSum { type Output = Option; #[allow(clippy::suspicious_arithmetic_impl)] - fn add(self, rhs: Self) -> Self::Output { + fn add(self, rhs: T) -> Self::Output { self.0 - .checked_add(rhs.0) + .checked_add(rhs.into()) + .filter(|v| VALUE_SUM_RANGE.contains(v)) + .map(ValueSum) + } +} + +impl Neg for ValueSum { + type Output = Option; + + #[allow(clippy::suspicious_arithmetic_impl)] + fn neg(self) -> Self::Output { + self.0 + .checked_neg() .filter(|v| VALUE_SUM_RANGE.contains(v)) .map(ValueSum) } @@ -210,8 +241,14 @@ impl TryFrom for i64 { } } +impl From for i128 { + fn from(value: ValueSum) -> Self { + value.0 + } +} + /// The blinding factor for a [`ValueCommitment`]. -#[derive(Clone, Debug)] +#[derive(Clone, Copy, Debug)] pub struct ValueCommitTrapdoor(pallas::Scalar); impl ValueCommitTrapdoor { @@ -308,9 +345,8 @@ impl ValueCommitment { /// /// [concretehomomorphiccommit]: https://zips.z.cash/protocol/nu5.pdf#concretehomomorphiccommit #[allow(non_snake_case)] - pub fn derive(value: ValueSum, rcv: ValueCommitTrapdoor) -> Self { + pub fn derive(value: ValueSum, rcv: ValueCommitTrapdoor, asset: AssetBase) -> Self { let hasher = pallas::Point::hash_to_curve(VALUE_COMMITMENT_PERSONALIZATION); - let V = hasher(&VALUE_COMMITMENT_V_BYTES); let R = hasher(&VALUE_COMMITMENT_R_BYTES); let abs_value = u64::try_from(value.0.abs()).expect("value must be in valid range"); @@ -320,7 +356,9 @@ impl ValueCommitment { pallas::Scalar::from(abs_value) }; - ValueCommitment(V * value + R * rcv.0) + let V_zsa = asset.cv_base(); + + ValueCommitment(V_zsa * value + R * rcv.0) } pub(crate) fn into_bvk(self) -> redpallas::VerificationKey { @@ -424,6 +462,9 @@ pub mod testing { #[cfg(test)] mod tests { + use crate::note::asset_base::testing::{arb_asset_base, native_asset_base}; + + use crate::note::AssetBase; use proptest::prelude::*; use super::{ @@ -432,35 +473,82 @@ mod tests { }; use crate::primitives::redpallas; + fn check_binding_signature( + native_values: &[(ValueSum, ValueCommitTrapdoor, AssetBase)], + arb_values: &[(ValueSum, ValueCommitTrapdoor, AssetBase)], + neg_trapdoors: &[ValueCommitTrapdoor], + arb_values_to_burn: &[(ValueSum, ValueCommitTrapdoor, AssetBase)], + ) { + // for each arb value, create a negative value with a different trapdoor + let neg_arb_values: Vec<_> = arb_values + .iter() + .cloned() + .zip(neg_trapdoors.iter().cloned()) + .map(|((value, _, asset), rcv)| ((-value).unwrap(), rcv, asset)) + .collect(); + + let native_value_balance = native_values + .iter() + .map(|(value, _, _)| value) + .sum::>() + .expect("we generate values that won't overflow"); + + let values = [ + native_values, + arb_values, + &neg_arb_values, + arb_values_to_burn, + ] + .concat(); + + let bsk = values + .iter() + .map(|(_, rcv, _)| rcv) + .sum::() + .into_bsk(); + + let bvk = (values + .into_iter() + .map(|(value, rcv, asset)| ValueCommitment::derive(value, rcv, asset)) + .sum::() + - ValueCommitment::derive( + native_value_balance, + ValueCommitTrapdoor::zero(), + AssetBase::native(), + ) + - arb_values_to_burn + .iter() + .map(|(value, _, asset)| { + ValueCommitment::derive(*value, ValueCommitTrapdoor::zero(), *asset) + }) + .sum::()) + .into_bvk(); + + assert_eq!(redpallas::VerificationKey::from(&bsk), bvk); + } + proptest! { #[test] - fn bsk_consistent_with_bvk( - values in (1usize..10).prop_flat_map(|n_values| + fn bsk_consistent_with_bvk_native_with_zsa_transfer_and_burning( + native_values in (1usize..10).prop_flat_map(|n_values| arb_note_value_bounded(MAX_NOTE_VALUE / n_values as u64).prop_flat_map(move |bound| - prop::collection::vec((arb_value_sum_bounded(bound), arb_trapdoor()), n_values) + prop::collection::vec((arb_value_sum_bounded(bound), arb_trapdoor(), native_asset_base()), n_values) ) + ), + (asset_values, neg_trapdoors) in (1usize..10).prop_flat_map(|n_values| + (arb_note_value_bounded(MAX_NOTE_VALUE / n_values as u64).prop_flat_map(move |bound| + prop::collection::vec((arb_value_sum_bounded(bound), arb_trapdoor(), arb_asset_base()), n_values) + ), prop::collection::vec(arb_trapdoor(), n_values)) + ), + burn_values in (1usize..10).prop_flat_map(|n_values| + arb_note_value_bounded(MAX_NOTE_VALUE / n_values as u64) + .prop_flat_map(move |bound| prop::collection::vec((arb_value_sum_bounded(bound), arb_trapdoor(), arb_asset_base()), n_values)) ) ) { - let value_balance = values - .iter() - .map(|(value, _)| value) - .sum::>() - .expect("we generate values that won't overflow"); - - let bsk = values - .iter() - .map(|(_, rcv)| rcv) - .sum::() - .into_bsk(); - - let bvk = (values - .into_iter() - .map(|(value, rcv)| ValueCommitment::derive(value, rcv)) - .sum::() - - ValueCommitment::derive(value_balance, ValueCommitTrapdoor::zero())) - .into_bvk(); - - assert_eq!(redpallas::VerificationKey::from(&bsk), bvk); + check_binding_signature(&native_values, &[], &[], &[]); + check_binding_signature(&native_values, &[], &[], &burn_values); + check_binding_signature(&native_values, &asset_values, &neg_trapdoors, &[]); + check_binding_signature(&native_values, &asset_values, &neg_trapdoors, &burn_values); } } } diff --git a/src/zip32.rs b/src/zip32.rs index 31f318b11..2a036ec9b 100644 --- a/src/zip32.rs +++ b/src/zip32.rs @@ -13,8 +13,11 @@ use crate::{ pub use zip32::ChildIndex; -const ZIP32_ORCHARD_PERSONALIZATION: &[u8; 16] = b"ZcashIP32Orchard"; const ZIP32_ORCHARD_FVFP_PERSONALIZATION: &[u8; 16] = b"ZcashOrchardFVFP"; +/// Personalization for the master extended spending key +pub const ZIP32_ORCHARD_PERSONALIZATION: &[u8; 16] = b"ZcashIP32Orchard"; +/// Personalization for the master extended issuance key +pub const ZIP32_ORCHARD_PERSONALIZATION_FOR_ISSUANCE: &[u8; 16] = b"ZIP32ZSAIssue_V1"; /// Errors produced in derivation of extended spending keys #[derive(Debug, PartialEq, Eq)] @@ -148,8 +151,12 @@ impl ExtendedSpendingKey { /// # Panics /// /// Panics if seed results in invalid spending key. - pub fn from_path(seed: &[u8], path: &[ChildIndex]) -> Result { - let mut xsk = Self::master(seed)?; + pub fn from_path( + seed: &[u8], + path: &[ChildIndex], + personalization: &[u8; 16], + ) -> Result { + let mut xsk = Self::master(seed, personalization)?; for i in path { xsk = xsk.derive_child(*i)?; } @@ -165,13 +172,13 @@ impl ExtendedSpendingKey { /// # Panics /// /// Panics if the seed is shorter than 32 bytes or longer than 252 bytes. - fn master(seed: &[u8]) -> Result { + fn master(seed: &[u8], personalization: &[u8; 16]) -> Result { assert!(seed.len() >= 32 && seed.len() <= 252); // I := BLAKE2b-512("ZcashIP32Orchard", seed) let I: [u8; 64] = { let mut I = Blake2bParams::new() .hash_length(64) - .personal(ZIP32_ORCHARD_PERSONALIZATION) + .personal(personalization) .to_state(); I.update(seed); I.finalize().as_bytes().try_into().unwrap() @@ -245,7 +252,7 @@ mod tests { #[test] fn derive_child() { let seed = [0; 32]; - let xsk_m = ExtendedSpendingKey::master(&seed).unwrap(); + let xsk_m = ExtendedSpendingKey::master(&seed, ZIP32_ORCHARD_PERSONALIZATION).unwrap(); let i_5 = ChildIndex::hardened(5); let xsk_5 = xsk_m.derive_child(i_5); @@ -256,20 +263,25 @@ mod tests { #[test] fn path() { let seed = [0; 32]; - let xsk_m = ExtendedSpendingKey::master(&seed).unwrap(); + let xsk_m = ExtendedSpendingKey::master(&seed, ZIP32_ORCHARD_PERSONALIZATION).unwrap(); let xsk_5h = xsk_m.derive_child(ChildIndex::hardened(5)).unwrap(); assert!(bool::from( - ExtendedSpendingKey::from_path(&seed, &[ChildIndex::hardened(5)]) - .unwrap() - .ct_eq(&xsk_5h) + ExtendedSpendingKey::from_path( + &seed, + &[ChildIndex::hardened(5)], + ZIP32_ORCHARD_PERSONALIZATION + ) + .unwrap() + .ct_eq(&xsk_5h) )); let xsk_5h_7 = xsk_5h.derive_child(ChildIndex::hardened(7)).unwrap(); assert!(bool::from( ExtendedSpendingKey::from_path( &seed, - &[ChildIndex::hardened(5), ChildIndex::hardened(7)] + &[ChildIndex::hardened(5), ChildIndex::hardened(7)], + ZIP32_ORCHARD_PERSONALIZATION ) .unwrap() .ct_eq(&xsk_5h_7) diff --git a/tests/builder.rs b/tests/builder.rs index 8ce67e92a..845fa2367 100644 --- a/tests/builder.rs +++ b/tests/builder.rs @@ -5,17 +5,19 @@ use orchard::{ bundle::{Authorized, Flags}, circuit::{ProvingKey, VerifyingKey}, keys::{FullViewingKey, PreparedIncomingViewingKey, Scope, SpendAuthorizingKey, SpendingKey}, - note::ExtractedNoteCommitment, - note_encryption::OrchardDomain, + note::{AssetBase, ExtractedNoteCommitment}, + note_encryption_v3::OrchardDomainV3, tree::{MerkleHashOrchard, MerklePath}, value::NoteValue, - Bundle, + Anchor, Bundle, Note, }; use rand::rngs::OsRng; -use zcash_note_encryption::try_note_decryption; +use zcash_note_encryption_zsa::try_note_decryption; -fn verify_bundle(bundle: &Bundle, vk: &VerifyingKey) { - assert!(matches!(bundle.verify_proof(vk), Ok(()))); +pub fn verify_bundle(bundle: &Bundle, vk: &VerifyingKey, verify_proof: bool) { + if verify_proof { + assert!(matches!(bundle.verify_proof(vk), Ok(()))); + } let sighash: [u8; 32] = bundle.commitment().into(); let bvk = bundle.binding_validating_key(); for action in bundle.actions() { @@ -27,6 +29,24 @@ fn verify_bundle(bundle: &Bundle, vk: &VerifyingKey) { ); } +pub fn build_merkle_path(note: &Note) -> (MerklePath, Anchor) { + // Use the tree with a single leaf. + let cmx: ExtractedNoteCommitment = note.commitment().into(); + let leaf = MerkleHashOrchard::from_cmx(&cmx); + let mut tree = BridgeTree::::new(100); + tree.append(leaf); + let position = tree.mark().unwrap(); + let root = tree.root(0).unwrap(); + let auth_path = tree.witness(position, 0).unwrap(); + let merkle_path = MerklePath::from_parts( + u64::from(position).try_into().unwrap(), + auth_path[..].try_into().unwrap(), + ); + let anchor = root.into(); + assert_eq!(anchor, merkle_path.root(cmx)); + (merkle_path, anchor) +} + #[test] fn bundle_chain() { let mut rng = OsRng; @@ -51,7 +71,7 @@ fn bundle_chain() { ); let note_value = NoteValue::from_raw(5000); assert_eq!( - builder.add_output(None, recipient, note_value, None), + builder.add_output(None, recipient, note_value, AssetBase::native(), None), Ok(()) ); let (unauthorized, bundle_meta) = builder.build(&mut rng).unwrap().unwrap(); @@ -74,7 +94,7 @@ fn bundle_chain() { }; // Verify the shielding bundle. - verify_bundle(&shielding_bundle, &vk); + verify_bundle(&shielding_bundle, &vk, true); // Create a shielded bundle spending the previous output. let shielded_bundle: Bundle<_, i64> = { @@ -83,30 +103,23 @@ fn bundle_chain() { .actions() .iter() .find_map(|action| { - let domain = OrchardDomain::for_action(action); + let domain = OrchardDomainV3::for_action(action); try_note_decryption(&domain, &ivk, action) }) .unwrap(); - // Use the tree with a single leaf. - let cmx: ExtractedNoteCommitment = note.commitment().into(); - let leaf = MerkleHashOrchard::from_cmx(&cmx); - let mut tree = BridgeTree::::new(100); - tree.append(leaf); - let position = tree.mark().unwrap(); - let root = tree.root(0).unwrap(); - let auth_path = tree.witness(position, 0).unwrap(); - let merkle_path = MerklePath::from_parts( - u64::from(position).try_into().unwrap(), - auth_path[..].try_into().unwrap(), - ); - let anchor = root.into(); - assert_eq!(anchor, merkle_path.root(cmx)); + let (merkle_path, anchor) = build_merkle_path(¬e); - let mut builder = Builder::new(BundleType::DEFAULT, anchor); + let mut builder = Builder::new(BundleType::DEFAULT_VANILLA, anchor); assert_eq!(builder.add_spend(fvk, note, merkle_path), Ok(())); assert_eq!( - builder.add_output(None, recipient, NoteValue::from_raw(5000), None), + builder.add_output( + None, + recipient, + NoteValue::from_raw(5000), + AssetBase::native(), + None + ), Ok(()) ); let (unauthorized, _) = builder.build(&mut rng).unwrap().unwrap(); @@ -118,5 +131,5 @@ fn bundle_chain() { }; // Verify the shielded bundle. - verify_bundle(&shielded_bundle, &vk); + verify_bundle(&shielded_bundle, &vk, true); } diff --git a/tests/zsa.rs b/tests/zsa.rs new file mode 100644 index 000000000..4d6826b08 --- /dev/null +++ b/tests/zsa.rs @@ -0,0 +1,557 @@ +mod builder; + +use crate::builder::verify_bundle; +use bridgetree::BridgeTree; +use incrementalmerkletree::Hashable; +use orchard::bundle::Authorized; +use orchard::issuance::{verify_issue_bundle, IssueBundle, IssueInfo, Signed, Unauthorized}; +use orchard::keys::{IssuanceAuthorizingKey, IssuanceValidatingKey}; +use orchard::note::{AssetBase, ExtractedNoteCommitment}; +use orchard::note_encryption_v3::OrchardDomainV3; +use orchard::tree::{MerkleHashOrchard, MerklePath}; +use orchard::{ + builder::{Builder, BundleType}, + circuit::{ProvingKey, VerifyingKey}, + keys::{FullViewingKey, PreparedIncomingViewingKey, Scope, SpendAuthorizingKey, SpendingKey}, + value::NoteValue, + Address, Anchor, Bundle, Note, +}; +use rand::rngs::OsRng; +use std::collections::HashSet; +use zcash_note_encryption_zsa::try_note_decryption; + +#[derive(Debug)] +struct Keychain { + pk: ProvingKey, + vk: VerifyingKey, + sk: SpendingKey, + fvk: FullViewingKey, + isk: IssuanceAuthorizingKey, + ik: IssuanceValidatingKey, + recipient: Address, +} + +impl Keychain { + fn pk(&self) -> &ProvingKey { + &self.pk + } + fn sk(&self) -> &SpendingKey { + &self.sk + } + fn fvk(&self) -> &FullViewingKey { + &self.fvk + } + fn isk(&self) -> &IssuanceAuthorizingKey { + &self.isk + } + fn ik(&self) -> &IssuanceValidatingKey { + &self.ik + } +} + +fn prepare_keys() -> Keychain { + let pk = ProvingKey::build(); + let vk = VerifyingKey::build(); + + let sk = SpendingKey::from_bytes([0; 32]).unwrap(); + let fvk = FullViewingKey::from(&sk); + let recipient = fvk.address_at(0u32, Scope::External); + + let isk = IssuanceAuthorizingKey::from_bytes([1u8; 32]).unwrap(); + let ik = IssuanceValidatingKey::from(&isk); + Keychain { + pk, + vk, + sk, + fvk, + isk, + ik, + recipient, + } +} + +fn sign_issue_bundle( + unauthorized: IssueBundle, + isk: &IssuanceAuthorizingKey, +) -> IssueBundle { + let sighash = unauthorized.commitment().into(); + let proven = unauthorized.prepare(sighash); + proven.sign(isk).unwrap() +} + +fn build_and_sign_bundle( + builder: Builder, + mut rng: OsRng, + pk: &ProvingKey, + sk: &SpendingKey, +) -> Bundle { + let unauthorized = builder.build(&mut rng).unwrap().unwrap().0; + let sighash = unauthorized.commitment().into(); + let proven = unauthorized.create_proof(pk, &mut rng).unwrap(); + proven + .apply_signatures(rng, sighash, &[SpendAuthorizingKey::from(sk)]) + .unwrap() +} + +pub fn build_merkle_path_with_two_leaves( + note1: &Note, + note2: &Note, +) -> (MerklePath, MerklePath, Anchor) { + let mut tree = BridgeTree::::new(100); + + // Add first leaf + let cmx1: ExtractedNoteCommitment = note1.commitment().into(); + let leaf1 = MerkleHashOrchard::from_cmx(&cmx1); + tree.append(leaf1); + let position1 = tree.mark().unwrap(); + + // Add second leaf + let cmx2: ExtractedNoteCommitment = note2.commitment().into(); + let leaf2 = MerkleHashOrchard::from_cmx(&cmx2); + tree.append(leaf2); + let position2 = tree.mark().unwrap(); + + let root = tree.root(0).unwrap(); + let anchor = root.into(); + + // Calculate first path + let auth_path1 = tree.witness(position1, 0).unwrap(); + let merkle_path1 = MerklePath::from_parts( + u64::from(position1).try_into().unwrap(), + auth_path1[..].try_into().unwrap(), + ); + + // Calculate second path + let auth_path2 = tree.witness(position2, 0).unwrap(); + let merkle_path2 = MerklePath::from_parts( + u64::from(position2).try_into().unwrap(), + auth_path2[..].try_into().unwrap(), + ); + + assert_eq!(anchor, merkle_path1.root(cmx1)); + assert_eq!(anchor, merkle_path2.root(cmx2)); + (merkle_path1, merkle_path2, anchor) +} + +fn issue_zsa_notes(asset_descr: &str, keys: &Keychain) -> (Note, Note) { + let mut rng = OsRng; + // Create a issuance bundle + let unauthorized_asset = IssueBundle::new( + keys.ik().clone(), + asset_descr.to_string(), + Some(IssueInfo { + recipient: keys.recipient, + value: NoteValue::from_raw(40), + }), + &mut rng, + ); + + assert!(unauthorized_asset.is_ok()); + + let (mut unauthorized, _) = unauthorized_asset.unwrap(); + + assert!(unauthorized + .add_recipient( + asset_descr.to_string(), + keys.recipient, + NoteValue::from_raw(2), + &mut rng, + ) + .is_ok()); + + let issue_bundle = sign_issue_bundle(unauthorized, keys.isk()); + + // Take notes from first action + let notes = issue_bundle.get_all_notes(); + let note1 = notes.get(0).unwrap(); + let note2 = notes.get(1).unwrap(); + + assert!(verify_issue_bundle( + &issue_bundle, + issue_bundle.commitment().into(), + &HashSet::new(), + ) + .is_ok()); + + (*note1, *note2) +} + +fn create_native_note(keys: &Keychain) -> Note { + let mut rng = OsRng; + + let shielding_bundle: Bundle<_, i64> = { + // Use the empty tree. + let anchor = MerkleHashOrchard::empty_root(32.into()).into(); + + let mut builder = Builder::new(BundleType::Coinbase, anchor); + assert_eq!( + builder.add_output( + None, + keys.recipient, + NoteValue::from_raw(100), + AssetBase::native(), + None + ), + Ok(()) + ); + let unauthorized = builder.build(&mut rng).unwrap().unwrap().0; + let sighash = unauthorized.commitment().into(); + let proven = unauthorized.create_proof(keys.pk(), &mut rng).unwrap(); + proven.apply_signatures(rng, sighash, &[]).unwrap() + }; + let ivk = keys.fvk().to_ivk(Scope::External); + let (native_note, _, _) = shielding_bundle + .actions() + .iter() + .find_map(|action| { + let domain = OrchardDomainV3::for_action(action); + try_note_decryption(&domain, &PreparedIncomingViewingKey::new(&ivk), action) + }) + .unwrap(); + + native_note +} + +struct TestSpendInfo { + note: Note, + merkle_path: MerklePath, +} + +impl TestSpendInfo { + fn merkle_path(&self) -> &MerklePath { + &self.merkle_path + } +} + +struct TestOutputInfo { + value: NoteValue, + asset: AssetBase, +} + +fn build_and_verify_bundle( + spends: Vec<&TestSpendInfo>, + outputs: Vec, + assets_to_burn: Vec<(AssetBase, NoteValue)>, + anchor: Anchor, + expected_num_actions: usize, + keys: &Keychain, +) -> Result<(), String> { + let rng = OsRng; + let shielded_bundle: Bundle<_, i64> = { + let mut builder = Builder::new(BundleType::DEFAULT_ZSA, anchor); + + spends + .iter() + .try_for_each(|spend| { + builder.add_spend(keys.fvk().clone(), spend.note, spend.merkle_path().clone()) + }) + .map_err(|err| err.to_string())?; + outputs + .iter() + .try_for_each(|output| { + builder.add_output(None, keys.recipient, output.value, output.asset, None) + }) + .map_err(|err| err.to_string())?; + assets_to_burn + .into_iter() + .try_for_each(|(asset, value)| builder.add_burn(asset, value))?; + build_and_sign_bundle(builder, rng, keys.pk(), keys.sk()) + }; + + // Verify the shielded bundle, currently without the proof. + verify_bundle(&shielded_bundle, &keys.vk, true); + assert_eq!(shielded_bundle.actions().len(), expected_num_actions); + assert!(verify_unique_spent_nullifiers(&shielded_bundle)); + Ok(()) +} + +fn verify_unique_spent_nullifiers(bundle: &Bundle) -> bool { + let mut unique_nulifiers = Vec::new(); + let spent_nullifiers = bundle + .actions() + .iter() + .map(|action| *action.nullifier()) + .collect::>(); + spent_nullifiers.iter().enumerate().all(|(i, item)| { + unique_nulifiers.push(*item); + // Check if the item is already in the unique_nullifiers vector by checking that the first + // position of the item is equal to the current index i. + unique_nulifiers.iter().position(|x| x == item) == Some(i) + }) +} + +/// Issue several ZSA and native notes and spend them in different combinations, e.g. split and join +#[test] +fn zsa_issue_and_transfer() { + // --------------------------- Setup ----------------------------------------- + + let keys = prepare_keys(); + let asset_descr = "zsa_asset"; + + // Prepare ZSA + let (zsa_note_1, zsa_note_2) = issue_zsa_notes(asset_descr, &keys); + + let (merkle_path1, merkle_path2, anchor) = + build_merkle_path_with_two_leaves(&zsa_note_1, &zsa_note_2); + + let zsa_spend_1 = TestSpendInfo { + note: zsa_note_1, + merkle_path: merkle_path1, + }; + let zsa_spend_2 = TestSpendInfo { + note: zsa_note_2, + merkle_path: merkle_path2, + }; + + let native_note = create_native_note(&keys); + let (native_merkle_path_1, native_merkle_path_2, native_anchor) = + build_merkle_path_with_two_leaves(&native_note, &zsa_note_1); + let native_spend: TestSpendInfo = TestSpendInfo { + note: native_note, + merkle_path: native_merkle_path_1, + }; + let zsa_spend_with_native: TestSpendInfo = TestSpendInfo { + note: zsa_note_1, + merkle_path: native_merkle_path_2, + }; + + // --------------------------- Tests ----------------------------------------- + + // 1. Spend single ZSA note + build_and_verify_bundle( + vec![&zsa_spend_1], + vec![TestOutputInfo { + value: zsa_spend_1.note.value(), + asset: zsa_spend_1.note.asset(), + }], + vec![], + anchor, + 2, + &keys, + ) + .unwrap(); + + // 2. Split single ZSA note into 3 notes + let delta_1 = 2; // arbitrary number for value manipulation + let delta_2 = 5; // arbitrary number for value manipulation + build_and_verify_bundle( + vec![&zsa_spend_1], + vec![ + TestOutputInfo { + value: NoteValue::from_raw(zsa_spend_1.note.value().inner() - delta_1 - delta_2), + asset: zsa_spend_1.note.asset(), + }, + TestOutputInfo { + value: NoteValue::from_raw(delta_1), + asset: zsa_spend_1.note.asset(), + }, + TestOutputInfo { + value: NoteValue::from_raw(delta_2), + asset: zsa_spend_1.note.asset(), + }, + ], + vec![], + anchor, + 3, + &keys, + ) + .unwrap(); + + // 3. Join 2 ZSA notes into a single note + build_and_verify_bundle( + vec![&zsa_spend_1, &zsa_spend_2], + vec![TestOutputInfo { + value: NoteValue::from_raw( + zsa_spend_1.note.value().inner() + zsa_spend_2.note.value().inner(), + ), + asset: zsa_spend_1.note.asset(), + }], + vec![], + anchor, + 2, + &keys, + ) + .unwrap(); + + // 4. Take 2 ZSA notes and send them as 2 notes with different denomination + build_and_verify_bundle( + vec![&zsa_spend_1, &zsa_spend_2], + vec![ + TestOutputInfo { + value: NoteValue::from_raw(zsa_spend_1.note.value().inner() - delta_1), + asset: zsa_spend_1.note.asset(), + }, + TestOutputInfo { + value: NoteValue::from_raw(zsa_spend_2.note.value().inner() + delta_1), + asset: zsa_spend_2.note.asset(), + }, + ], + vec![], + anchor, + 2, + &keys, + ) + .unwrap(); + + // 5. Spend single ZSA note, mixed with native note (shielding) + build_and_verify_bundle( + vec![&zsa_spend_1], + vec![ + TestOutputInfo { + value: zsa_spend_1.note.value(), + asset: zsa_spend_1.note.asset(), + }, + TestOutputInfo { + value: NoteValue::from_raw(100), + asset: AssetBase::native(), + }, + ], + vec![], + anchor, + 2, + &keys, + ) + .unwrap(); + + // 6. Spend single ZSA note, mixed with native note (shielded to shielded) + build_and_verify_bundle( + vec![&zsa_spend_with_native, &native_spend], + vec![ + TestOutputInfo { + value: zsa_spend_1.note.value(), + asset: zsa_spend_1.note.asset(), + }, + TestOutputInfo { + value: NoteValue::from_raw(native_spend.note.value().inner() - delta_1 - delta_2), + asset: AssetBase::native(), + }, + TestOutputInfo { + value: NoteValue::from_raw(delta_1), + asset: AssetBase::native(), + }, + TestOutputInfo { + value: NoteValue::from_raw(delta_2), + asset: AssetBase::native(), + }, + ], + vec![], + native_anchor, + 4, + &keys, + ) + .unwrap(); + + // 7. Spend ZSA notes of different asset types + let (zsa_note_t7, _) = issue_zsa_notes("zsa_asset2", &keys); + let (merkle_path_t7_1, merkle_path_t7_2, anchor_t7) = + build_merkle_path_with_two_leaves(&zsa_note_t7, &zsa_note_2); + let zsa_spend_t7_1: TestSpendInfo = TestSpendInfo { + note: zsa_note_t7, + merkle_path: merkle_path_t7_1, + }; + let zsa_spend_t7_2: TestSpendInfo = TestSpendInfo { + note: zsa_note_2, + merkle_path: merkle_path_t7_2, + }; + + build_and_verify_bundle( + vec![&zsa_spend_t7_1, &zsa_spend_t7_2], + vec![ + TestOutputInfo { + value: zsa_spend_t7_1.note.value(), + asset: zsa_spend_t7_1.note.asset(), + }, + TestOutputInfo { + value: zsa_spend_t7_2.note.value(), + asset: zsa_spend_t7_2.note.asset(), + }, + ], + vec![], + anchor_t7, + 2, + &keys, + ) + .unwrap(); + + // 8. Same but wrong denomination + let result = std::panic::catch_unwind(|| { + build_and_verify_bundle( + vec![&zsa_spend_t7_1, &zsa_spend_t7_2], + vec![ + TestOutputInfo { + value: NoteValue::from_raw(zsa_spend_t7_1.note.value().inner() + delta_1), + asset: zsa_spend_t7_1.note.asset(), + }, + TestOutputInfo { + value: NoteValue::from_raw(zsa_spend_t7_2.note.value().inner() - delta_1), + asset: zsa_spend_t7_2.note.asset(), + }, + ], + vec![], + anchor_t7, + 2, + &keys, + ) + .unwrap(); + }); + assert!(result.is_err()); + + // 9. Burn ZSA assets + build_and_verify_bundle( + vec![&zsa_spend_1], + vec![], + vec![(zsa_spend_1.note.asset(), zsa_spend_1.note.value())], + anchor, + 2, + &keys, + ) + .unwrap(); + + // 10. Burn a partial amount of the ZSA assets + let value_to_burn = 3; + let value_to_transfer = zsa_spend_1.note.value().inner() - value_to_burn; + + build_and_verify_bundle( + vec![&zsa_spend_1], + vec![TestOutputInfo { + value: NoteValue::from_raw(value_to_transfer), + asset: zsa_spend_1.note.asset(), + }], + vec![(zsa_spend_1.note.asset(), NoteValue::from_raw(value_to_burn))], + anchor, + 2, + &keys, + ) + .unwrap(); + + // 11. Try to burn native asset - should fail + let result = build_and_verify_bundle( + vec![&native_spend], + vec![], + vec![(AssetBase::native(), native_spend.note.value())], + native_anchor, + 2, + &keys, + ); + match result { + Ok(_) => panic!("Test should fail"), + Err(error) => assert_eq!(error, "Burning is only possible for non-native assets"), + } + + // 12. Try to burn zero value - should fail + let result = build_and_verify_bundle( + vec![&zsa_spend_1], + vec![TestOutputInfo { + value: zsa_spend_1.note.value(), + asset: zsa_spend_1.note.asset(), + }], + vec![(zsa_spend_1.note.asset(), NoteValue::from_raw(0))], + anchor, + 2, + &keys, + ); + match result { + Ok(_) => panic!("Test should fail"), + Err(error) => assert_eq!(error, "Burning is not possible for zero values"), + } +}