From 33a205b94c0328bc7df8f9826c5b97f655683028 Mon Sep 17 00:00:00 2001 From: Paul <3682187+PaulLaux@users.noreply.github.com> Date: Wed, 30 Mar 2022 19:10:55 +0300 Subject: [PATCH 01/16] Circleci project setup (#1) * Added .circleci/config.yml --- .circleci/config.yml | 29 +++++++++++++++++++++++++++++ 1 file changed, 29 insertions(+) create mode 100644 .circleci/config.yml diff --git a/.circleci/config.yml b/.circleci/config.yml new file mode 100644 index 000000000..153b55131 --- /dev/null +++ b/.circleci/config.yml @@ -0,0 +1,29 @@ +# Use the latest 2.1 version of CircleCI pipeline process engine. +# See: https://circleci.com/docs/2.0/configuration-reference +version: 2.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.59.0 + # Add steps to the job + # See: https://circleci.com/docs/2.0/configuration-reference/#steps + steps: + - checkout + - run: + name: "cargo test" + command: | + cargo version; + cargo test; + + +# Invoke jobs via workflows +# See: https://circleci.com/docs/2.0/configuration-reference/#workflows +workflows: + build-and-test: + jobs: + - cargo-test From 71565ee93306e955c2d0ab4c79ebb6657f20f212 Mon Sep 17 00:00:00 2001 From: Daniel Benarroch Date: Tue, 14 Jun 2022 17:33:34 +0200 Subject: [PATCH 02/16] issuer keys implementation (#5) Implements the issuer keys as IssuerAuthorizingKey -> isk IssuerVerifyingKey -> ik Test vectors generated with zcash_test_vectors repo --- src/keys.rs | 113 ++++++++++++++++++++++++++++++++++----- src/spec/prf_expand.rs | 2 + src/test_vectors/keys.rs | 102 +++++++++++++++++++++++++++++++++++ 3 files changed, 205 insertions(+), 12 deletions(-) diff --git a/src/keys.rs b/src/keys.rs index 0504dfa44..3f5b4bd8a 100644 --- a/src/keys.rs +++ b/src/keys.rs @@ -18,7 +18,7 @@ use zcash_note_encryption::EphemeralKeyBytes; use crate::{ address::Address, - primitives::redpallas::{self, SpendAuth}, + primitives::redpallas::{self, SpendAuth, VerificationKey}, spec::{ commit_ivk, diversify_hash, extract_p, ka_orchard, prf_nf, to_base, to_scalar, NonIdentityPallasPoint, NonZeroPallasBase, NonZeroPallasScalar, PrfExpand, @@ -188,21 +188,104 @@ 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) } } +/// An issuer authorizing key, used to create issuer authorization signatures. +/// This type enforces that the corresponding public point (ik^ℙ) has ỹ = 0. +/// +/// $\mathsf{isk}$ as defined in +/// [Zcash Protocol Spec § 4.2.3: Orchard Key Components][orchardkeycomponents]. +/// +/// [orchardkeycomponents]: https://zips.z.cash/protocol/nu5.pdf#orchardkeycomponents +#[derive(Clone, Debug)] +pub struct IssuerAuthorizingKey(redpallas::SigningKey); + +impl IssuerAuthorizingKey { + /// Derives isk from sk. Internal use only, does not enforce all constraints. + fn derive_inner(sk: &SpendingKey) -> pallas::Scalar { + to_scalar(PrfExpand::ZsaIsk.expand(&sk.0)) + } +} + +impl From<&SpendingKey> for IssuerAuthorizingKey { + fn from(sk: &SpendingKey) -> Self { + let isk = Self::derive_inner(sk); + // IssuerSigningKey cannot be constructed such that this assertion would fail. + assert!(!bool::from(isk.is_zero())); + let ret = IssuerAuthorizingKey(isk.to_repr().try_into().unwrap()); + // If the last bit of repr_P(ik) is 1, negate isk. + if (<[u8; 32]>::from(IssuerValidatingKey::from(&ret).0)[31] >> 7) == 1 { + IssuerAuthorizingKey((-isk).to_repr().try_into().unwrap()) + } else { + ret + } + } +} + +/// A key used to validate issuer authorization signatures. +/// +/// Defined in [Zcash Protocol Spec § 4.2.3: Orchard Key Components][orchardkeycomponents]. +/// Note that this is $\mathsf{ik}^\mathbb{P}$, which by construction is equivalent to +/// $\mathsf{ik}$ but stored here as a RedPallas verification key. +/// +/// [orchardkeycomponents]: https://zips.z.cash/protocol/nu5.pdf#orchardkeycomponents +#[derive(Debug, Clone, PartialOrd, Ord)] +pub struct IssuerValidatingKey(redpallas::VerificationKey); +impl From<&IssuerAuthorizingKey> for IssuerValidatingKey { + fn from(isk: &IssuerAuthorizingKey) -> Self { + IssuerValidatingKey((&isk.0).into()) + } +} + +impl From<&IssuerValidatingKey> for pallas::Point { + fn from(issuer_validating_key: &IssuerValidatingKey) -> pallas::Point { + pallas::Point::from_bytes(&(&issuer_validating_key.0).into()).unwrap() + } +} + +impl PartialEq for IssuerValidatingKey { + fn eq(&self, other: &Self) -> bool { + <[u8; 32]>::from(&self.0).eq(&<[u8; 32]>::from(&other.0)) + } +} + +impl Eq for IssuerValidatingKey {} + +impl IssuerValidatingKey { + /// Converts this spend validating key to its serialized form, + /// I2LEOSP_256(ik). + pub(crate) fn to_bytes(&self) -> [u8; 32] { + // This is correct because the wrapped point must have ỹ = 0, and + // so the point repr is the same as I2LEOSP of its x-coordinate. + <[u8; 32]>::from(&self.0) + } + + pub(crate) fn from_bytes(bytes: &[u8]) -> Option { + <[u8; 32]>::try_from(bytes) + .ok() + .and_then(check_structural_validity) + .map(IssuerValidatingKey) + } +} + +/// A function to check structural validity of the validating keys for authorizing transfers and +/// issuing assets +/// Structural validity checks for ik_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. +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 + } +} + /// 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]. @@ -1021,9 +1104,15 @@ mod tests { let ask: SpendAuthorizingKey = (&sk).into(); assert_eq!(<[u8; 32]>::from(&ask.0), tv.ask); + let isk: IssuerAuthorizingKey = (&sk).into(); + assert_eq!(<[u8; 32]>::from(&isk.0), tv.isk); + let ak: SpendValidatingKey = (&ask).into(); assert_eq!(<[u8; 32]>::from(ak.0), tv.ak); + let ik: IssuerValidatingKey = (&isk).into(); + assert_eq!(<[u8; 32]>::from(ik.0), tv.ik); + let nk: NullifierDerivingKey = (&sk).into(); assert_eq!(nk.0.to_repr(), tv.nk); diff --git a/src/spec/prf_expand.rs b/src/spec/prf_expand.rs index e2f95e7ff..fa7881889 100644 --- a/src/spec/prf_expand.rs +++ b/src/spec/prf_expand.rs @@ -10,6 +10,7 @@ pub(crate) enum PrfExpand { OrchardNk, OrchardRivk, Psi, + ZsaIsk, OrchardZip32Child, OrchardDkOvk, OrchardRivkInternal, @@ -24,6 +25,7 @@ impl PrfExpand { Self::OrchardNk => 0x07, Self::OrchardRivk => 0x08, Self::Psi => 0x09, + Self::ZsaIsk => 0x0a, Self::OrchardZip32Child => 0x81, Self::OrchardDkOvk => 0x82, Self::OrchardRivkInternal => 0x83, diff --git a/src/test_vectors/keys.rs b/src/test_vectors/keys.rs index 39d7dc00d..35cc1acbf 100644 --- a/src/test_vectors/keys.rs +++ b/src/test_vectors/keys.rs @@ -4,6 +4,8 @@ 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], @@ -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: [ + 0x95, 0x4a, 0x86, 0xc7, 0xa7, 0x15, 0x53, 0xfa, 0x6c, 0x8b, 0x67, 0x58, 0x54, 0x26, + 0x8e, 0xa5, 0x4c, 0x51, 0xfb, 0x17, 0xd8, 0x3d, 0x80, 0xee, 0x71, 0xd4, 0xae, 0x42, + 0xa1, 0xf8, 0xc8, 0x16, + ], + ik: [ + 0x2e, 0x4f, 0xd4, 0xa6, 0xec, 0x39, 0x94, 0x87, 0xd3, 0x78, 0xb4, 0xc7, 0x25, 0xfb, + 0x9b, 0xaf, 0xbc, 0x01, 0xa5, 0xe2, 0xb7, 0xf3, 0x68, 0x2e, 0xf4, 0x53, 0x95, 0x91, + 0xbc, 0xf0, 0x59, 0x02, + ], 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, @@ -132,6 +144,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: [ + 0xee, 0xf5, 0xe9, 0x1b, 0x36, 0xb8, 0x06, 0x86, 0x72, 0x3d, 0x14, 0xdc, 0xc7, 0x04, + 0xad, 0x59, 0x67, 0x08, 0x0b, 0x7d, 0x6e, 0x49, 0xaf, 0x97, 0x03, 0x0e, 0x4f, 0xa0, + 0xbf, 0x5a, 0xd9, 0x0b, + ], + ik: [ + 0x2e, 0xde, 0xfb, 0x15, 0x8e, 0xa4, 0x48, 0x82, 0x57, 0x2b, 0xcd, 0xb2, 0x35, 0xca, + 0x36, 0xab, 0x39, 0xc7, 0x47, 0xbb, 0x71, 0xfe, 0x0f, 0x10, 0xfa, 0xa3, 0x9b, 0xfd, + 0x62, 0x0a, 0xcc, 0x04, + ], 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, @@ -223,6 +245,16 @@ pub(crate) fn test_vectors() -> Vec { 0xed, 0xb4, 0x26, 0x65, 0x7b, 0x2d, 0x07, 0x40, 0x66, 0x64, 0xd8, 0x95, 0x31, 0x2e, 0xa1, 0xc3, 0xb3, 0x34, ], + isk: [ + 0x5b, 0x1f, 0xc4, 0x57, 0xae, 0x71, 0x38, 0x3c, 0x53, 0xf4, 0x69, 0x41, 0xb7, 0xcb, + 0x4c, 0xec, 0x3d, 0xea, 0xc0, 0xc6, 0x03, 0xe2, 0xcd, 0xd0, 0xd1, 0x8d, 0x94, 0x01, + 0x9e, 0x43, 0xe2, 0x07, + ], + ik: [ + 0x4f, 0x43, 0xeb, 0x7d, 0x9e, 0x03, 0x6f, 0xa6, 0x15, 0xfd, 0x04, 0xa5, 0xef, 0x6a, + 0xeb, 0x21, 0x6e, 0x06, 0x9b, 0xe9, 0x2d, 0x30, 0xe8, 0xf7, 0x16, 0x3e, 0xe3, 0x15, + 0x11, 0x6f, 0x18, 0x32, + ], 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, @@ -314,6 +346,16 @@ pub(crate) fn test_vectors() -> Vec { 0xe7, 0x2c, 0x3b, 0x64, 0x00, 0x06, 0xff, 0x08, 0x50, 0x52, 0x80, 0xe4, 0xf0, 0x0f, 0xad, 0xf7, 0x63, 0x28, ], + isk: [ + 0x71, 0xd0, 0x64, 0xaa, 0xa0, 0x82, 0x63, 0xb8, 0xe4, 0xc3, 0xed, 0x70, 0x3c, 0x6f, + 0x54, 0x25, 0x4a, 0x88, 0x8c, 0x36, 0xec, 0x69, 0x86, 0x62, 0xf7, 0x1f, 0xbb, 0xf4, + 0x26, 0xd9, 0x09, 0x28, + ], + ik: [ + 0x12, 0xb3, 0xab, 0xff, 0x96, 0x75, 0x20, 0x9e, 0x94, 0x54, 0x07, 0x0c, 0x14, 0xac, + 0x15, 0x54, 0x65, 0xae, 0x83, 0xbe, 0x2c, 0x39, 0x46, 0x63, 0x5e, 0x38, 0x77, 0xba, + 0x67, 0xdf, 0x49, 0x12, + ], 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, @@ -405,6 +447,16 @@ pub(crate) fn test_vectors() -> Vec { 0xf5, 0x6d, 0x83, 0x20, 0x09, 0xf7, 0x24, 0x2e, 0x1f, 0x7c, 0x77, 0x0a, 0x12, 0x24, 0x1d, 0xfa, 0x28, 0x07, ], + isk: [ + 0x44, 0x36, 0x1a, 0x7b, 0xa6, 0xa1, 0xaa, 0x17, 0x8e, 0x72, 0xaf, 0x47, 0xbd, 0xc1, + 0x60, 0x40, 0xce, 0x1c, 0x54, 0xdd, 0x4b, 0x56, 0x33, 0x21, 0x55, 0xba, 0x9d, 0x04, + 0x09, 0x71, 0xd0, 0x07, + ], + ik: [ + 0x1f, 0x17, 0x2d, 0x79, 0xae, 0xdc, 0xc2, 0x06, 0x8c, 0x3a, 0x09, 0x08, 0x93, 0xe1, + 0xa1, 0x75, 0xd9, 0xb5, 0x78, 0xf8, 0x91, 0xaf, 0x9a, 0xb6, 0x8d, 0x4f, 0xe1, 0xe9, + 0x05, 0xa3, 0xb2, 0x11, + ], 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, @@ -496,6 +548,16 @@ pub(crate) fn test_vectors() -> Vec { 0xdf, 0x28, 0xbb, 0x0f, 0x10, 0x21, 0xea, 0x84, 0x3f, 0x86, 0x7f, 0x8a, 0x17, 0x0f, 0x5c, 0x33, 0x90, 0x1f, ], + isk: [ + 0xdc, 0x93, 0x72, 0x9f, 0x3f, 0x28, 0x30, 0xed, 0x79, 0x1c, 0x21, 0xbe, 0xbe, 0x45, + 0x0f, 0xcf, 0x1f, 0x8f, 0xef, 0x49, 0x81, 0x39, 0xc7, 0x99, 0xd1, 0x63, 0x66, 0x5a, + 0x8c, 0x51, 0xe5, 0x2d, + ], + ik: [ + 0x1d, 0xb6, 0x1c, 0x29, 0x3e, 0x3a, 0x93, 0x34, 0x5d, 0x06, 0xb9, 0x0b, 0xd7, 0x1f, + 0xd3, 0x21, 0x5c, 0x2c, 0x1c, 0x29, 0x53, 0x5a, 0x10, 0xde, 0x9d, 0x31, 0x40, 0xb7, + 0x4d, 0xb6, 0x1d, 0x07, + ], 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, @@ -587,6 +649,16 @@ pub(crate) fn test_vectors() -> Vec { 0x65, 0x43, 0x46, 0x2a, 0x13, 0x7f, 0xfe, 0xa3, 0x7b, 0xaf, 0x41, 0xef, 0x28, 0x6b, 0xb7, 0x32, 0xbe, 0x2c, ], + isk: [ + 0xf2, 0x34, 0x52, 0x32, 0xc9, 0x19, 0xc1, 0x29, 0xe0, 0x4b, 0x0c, 0x46, 0xac, 0x2c, + 0xa8, 0x50, 0x65, 0xd9, 0x54, 0x85, 0xb9, 0x02, 0xab, 0x0f, 0x98, 0xf9, 0x3a, 0xee, + 0x59, 0x4b, 0x5f, 0x02, + ], + ik: [ + 0x2c, 0x83, 0xd9, 0x20, 0xe9, 0xf6, 0x6d, 0xa5, 0x04, 0x86, 0x37, 0xad, 0x9a, 0xa2, + 0xcc, 0xe6, 0xe1, 0x6e, 0xf4, 0x8f, 0x86, 0x50, 0xea, 0x00, 0xd8, 0xc2, 0xd7, 0x68, + 0x61, 0x8a, 0xe3, 0x36, + ], 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, @@ -678,6 +750,16 @@ pub(crate) fn test_vectors() -> Vec { 0xb3, 0x65, 0x1f, 0xfa, 0x1c, 0x69, 0x69, 0x15, 0xac, 0x00, 0xa2, 0x5e, 0xa3, 0xac, 0x7d, 0xff, 0x99, 0x01, ], + isk: [ + 0x3d, 0xa9, 0x08, 0x88, 0xba, 0x18, 0x24, 0xc8, 0x16, 0x29, 0x2d, 0x7f, 0x17, 0x33, + 0xac, 0x4c, 0xbe, 0x72, 0x2c, 0x6a, 0x12, 0x1c, 0xc7, 0x80, 0x17, 0x06, 0x26, 0xb7, + 0x0a, 0x26, 0x95, 0x28, + ], + ik: [ + 0x16, 0xa8, 0xff, 0x29, 0xb5, 0x17, 0xb5, 0xa8, 0xf7, 0xd0, 0x9b, 0x4e, 0x5e, 0x71, + 0x3a, 0x9a, 0x78, 0x4c, 0x74, 0x04, 0xd6, 0x1e, 0x3a, 0xf5, 0x30, 0x19, 0xc3, 0x47, + 0x0e, 0x90, 0x95, 0x22, + ], 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, @@ -769,6 +851,16 @@ pub(crate) fn test_vectors() -> Vec { 0x3b, 0x02, 0xd2, 0x5c, 0xc1, 0x0c, 0x90, 0x71, 0xfc, 0x02, 0x19, 0xe9, 0x7f, 0x93, 0x92, 0xd0, 0x67, 0x0c, ], + isk: [ + 0x01, 0x65, 0x33, 0x68, 0x4f, 0xb9, 0x81, 0x15, 0xa4, 0x05, 0xc9, 0xc7, 0xad, 0x47, + 0x72, 0x76, 0xab, 0x7c, 0x72, 0xfd, 0x67, 0x1a, 0x27, 0xe3, 0x6c, 0x0a, 0x7a, 0xbe, + 0x0a, 0x76, 0x90, 0x09, + ], + ik: [ + 0xff, 0xd7, 0x5f, 0x6f, 0x9e, 0xf4, 0x27, 0xf3, 0x26, 0xcd, 0xbf, 0x3a, 0x98, 0xbc, + 0xb5, 0x93, 0x63, 0x5a, 0x2c, 0x1a, 0xd7, 0x2b, 0x39, 0x99, 0x12, 0x61, 0xe2, 0x75, + 0xa9, 0xec, 0x6f, 0x10, + ], 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, @@ -860,6 +952,16 @@ pub(crate) fn test_vectors() -> Vec { 0x8d, 0x4b, 0x02, 0x5f, 0x8c, 0xc1, 0x60, 0xe1, 0xf4, 0xe9, 0x5f, 0x0a, 0x85, 0x3e, 0xbc, 0x41, 0x6a, 0x2b, ], + isk: [ + 0x76, 0x08, 0x32, 0x9d, 0xfa, 0x77, 0xc4, 0x2c, 0x4f, 0xc7, 0x6a, 0xc2, 0x95, 0x94, + 0xa2, 0x72, 0x83, 0x93, 0x4f, 0x5a, 0x93, 0x40, 0x71, 0xb9, 0xf8, 0xcd, 0x34, 0x4e, + 0x1f, 0x98, 0x45, 0x0e, + ], + ik: [ + 0x72, 0xa0, 0xac, 0x97, 0x8a, 0x2d, 0xa1, 0x61, 0xf4, 0x1f, 0x5b, 0x7a, 0x40, 0xbd, + 0x83, 0xc0, 0x58, 0x41, 0xf8, 0x1b, 0xc5, 0x11, 0x40, 0x67, 0xb8, 0x85, 0x98, 0x7f, + 0x48, 0xca, 0x52, 0x2d, + ], 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, From 5ae51075dbfafed9afba428b98639e864eee62a5 Mon Sep 17 00:00:00 2001 From: Paul <3682187+PaulLaux@users.noreply.github.com> Date: Tue, 14 Jun 2022 21:23:03 +0300 Subject: [PATCH 03/16] Added NoteType to Notes (#2) * Added NoteType to Notes * Added NoteType to value commitment derivation --- .circleci/config.yml | 15 ++++++- src/action.rs | 7 +++- src/builder.rs | 18 +++++++-- src/bundle.rs | 2 + src/circuit.rs | 3 +- src/constants/fixed_bases.rs | 4 ++ src/keys.rs | 2 + src/note.rs | 18 +++++++++ src/note/note_type.rs | 77 ++++++++++++++++++++++++++++++++++++ src/note_encryption.rs | 8 +++- src/value.rs | 66 ++++++++++++++++++------------- 11 files changed, 182 insertions(+), 38 deletions(-) create mode 100644 src/note/note_type.rs diff --git a/.circleci/config.yml b/.circleci/config.yml index 153b55131..ba37a7890 100644 --- a/.circleci/config.yml +++ b/.circleci/config.yml @@ -2,6 +2,9 @@ # 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: @@ -17,8 +20,15 @@ jobs: - run: name: "cargo test" command: | + sudo apt update && sudo apt-get install libfontconfig libfontconfig1-dev libfreetype6-dev; cargo version; - cargo test; + 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 @@ -26,4 +36,5 @@ jobs: workflows: build-and-test: jobs: - - cargo-test + - cargo-test: + context: CI-Orchard-slack diff --git a/src/action.rs b/src/action.rs index d0b73f23e..b6396ed91 100644 --- a/src/action.rs +++ b/src/action.rs @@ -126,6 +126,7 @@ pub(crate) mod testing { use proptest::prelude::*; + use crate::note::NoteType; use crate::{ note::{ commitment::ExtractedNoteCommitment, nullifier::testing::arb_nullifier, @@ -150,7 +151,8 @@ pub(crate) mod testing { let cmx = ExtractedNoteCommitment::from(note.commitment()); let cv_net = ValueCommitment::derive( spend_value - output_value, - ValueCommitTrapdoor::zero() + ValueCommitTrapdoor::zero(), + NoteType::native() ); // FIXME: make a real one from the note. let encrypted_note = TransmittedNoteCiphertext { @@ -181,7 +183,8 @@ pub(crate) mod testing { let cmx = ExtractedNoteCommitment::from(note.commitment()); let cv_net = ValueCommitment::derive( spend_value - output_value, - ValueCommitTrapdoor::zero() + ValueCommitTrapdoor::zero(), + NoteType::native() ); // FIXME: make a real one from the note. diff --git a/src/builder.rs b/src/builder.rs index fd1e9fd5f..7e3f00de1 100644 --- a/src/builder.rs +++ b/src/builder.rs @@ -9,6 +9,7 @@ use nonempty::NonEmpty; use pasta_curves::pallas; use rand::{prelude::SliceRandom, CryptoRng, RngCore}; +use crate::note::NoteType; use crate::{ action::Action, address::Address, @@ -141,7 +142,7 @@ impl ActionInfo { /// [orchardsend]: https://zips.z.cash/protocol/nu5.pdf#orchardsend fn build(self, mut rng: impl RngCore) -> (Action, Circuit) { let v_net = self.value_sum(); - let cv_net = ValueCommitment::derive(v_net, self.rcv.clone()); + let cv_net = ValueCommitment::derive(v_net, self.rcv, NoteType::native()); let nf_old = self.spend.note.nullifier(&self.spend.fvk); let sender_address = self.spend.note.recipient(); @@ -151,8 +152,15 @@ impl ActionInfo { let ak: SpendValidatingKey = self.spend.fvk.clone().into(); let alpha = pallas::Scalar::random(&mut rng); let rk = ak.randomize(&alpha); + let note_type = self.spend.note.note_type(); - let note = Note::new(self.output.recipient, self.output.value, nf_old, &mut rng); + let note = Note::new( + self.output.recipient, + self.output.value, + note_type, + nf_old, + &mut rng, + ); let cm_new = note.commitment(); let cmx = cm_new.into(); @@ -370,7 +378,11 @@ impl Builder { // Verify that bsk and bvk are consistent. let bvk = (actions.iter().map(|a| a.cv_net()).sum::() - - ValueCommitment::derive(value_balance, ValueCommitTrapdoor::zero())) + - ValueCommitment::derive( + value_balance, + ValueCommitTrapdoor::zero(), + NoteType::native(), + )) .into_bvk(); assert_eq!(redpallas::VerificationKey::from(&bsk), bvk); diff --git a/src/bundle.rs b/src/bundle.rs index c70ca6350..01b61d791 100644 --- a/src/bundle.rs +++ b/src/bundle.rs @@ -12,6 +12,7 @@ use memuse::DynamicUsage; use nonempty::NonEmpty; use zcash_note_encryption::{try_note_decryption, try_output_recovery_with_ovk}; +use crate::note::NoteType; use crate::{ action::Action, address::Address, @@ -379,6 +380,7 @@ impl> Bundle { - ValueCommitment::derive( ValueSum::from_raw(self.value_balance.into()), ValueCommitTrapdoor::zero(), + NoteType::native(), )) .into_bvk() } diff --git a/src/circuit.rs b/src/circuit.rs index b61ccb296..b9f64175d 100644 --- a/src/circuit.rs +++ b/src/circuit.rs @@ -900,6 +900,7 @@ mod tests { use rand::{rngs::OsRng, RngCore}; use super::{Circuit, Instance, Proof, ProvingKey, VerifyingKey, K}; + use crate::note::NoteType; use crate::{ keys::SpendValidatingKey, note::Note, @@ -923,7 +924,7 @@ mod tests { 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, NoteType::native()); let path = MerklePath::dummy(&mut rng); let anchor = path.root(spent_note.commitment().into()); diff --git a/src/constants/fixed_bases.rs b/src/constants/fixed_bases.rs index af11e335f..7a86487d3 100644 --- a/src/constants/fixed_bases.rs +++ b/src/constants/fixed_bases.rs @@ -19,8 +19,12 @@ pub mod value_commit_v; pub const ORCHARD_PERSONALIZATION: &str = "z.cash:Orchard"; /// SWU hash-to-curve personalization for the value commitment generator +/// TODO: should we change to "NOTE_TYPE_PERSONALIZATION"? pub const VALUE_COMMITMENT_PERSONALIZATION: &str = "z.cash:Orchard-cv"; +/// SWU hash-to-curve personalization for the note type generator +// pub const NOTE_TYPE_PERSONALIZATION: &str = "z.cash:Orchard-NoteType"; + /// SWU hash-to-curve value for the value commitment generator pub const VALUE_COMMITMENT_V_BYTES: [u8; 1] = *b"v"; diff --git a/src/keys.rs b/src/keys.rs index 3f5b4bd8a..811e86b36 100644 --- a/src/keys.rs +++ b/src/keys.rs @@ -1045,6 +1045,7 @@ mod tests { testing::{arb_diversifier_index, arb_diversifier_key, arb_esk, arb_spending_key}, *, }; + use crate::note::NoteType; use crate::{ note::{ExtractedNoteCommitment, Nullifier, RandomSeed}, value::NoteValue, @@ -1136,6 +1137,7 @@ mod tests { let note = Note::from_parts( addr, NoteValue::from_raw(tv.note_v), + NoteType::native(), rho, RandomSeed::from_bytes(tv.note_rseed, &rho).unwrap(), ); diff --git a/src/note.rs b/src/note.rs index 6bd3f7783..7c59e0360 100644 --- a/src/note.rs +++ b/src/note.rs @@ -19,6 +19,9 @@ pub use self::commitment::{ExtractedNoteCommitment, NoteCommitment}; pub(crate) mod nullifier; pub use self::nullifier::Nullifier; +pub(crate) mod note_type; +pub use self::note_type::NoteType; + /// The ZIP 212 seed randomness for a note. #[derive(Copy, Clone, Debug)] pub(crate) struct RandomSeed([u8; 32]); @@ -86,6 +89,8 @@ pub struct Note { recipient: Address, /// The value of this note. value: NoteValue, + /// The type of this note. + note_type: NoteType, /// A unique creation ID for this note. /// /// This is set to the nullifier of the note that was spent in the [`Action`] that @@ -111,12 +116,14 @@ impl Note { pub(crate) fn from_parts( recipient: Address, value: NoteValue, + note_type: NoteType, rho: Nullifier, rseed: RandomSeed, ) -> Self { Note { recipient, value, + note_type, rho, rseed, } @@ -130,6 +137,7 @@ impl Note { pub(crate) fn new( recipient: Address, value: NoteValue, + note_type: NoteType, rho: Nullifier, mut rng: impl RngCore, ) -> Self { @@ -137,6 +145,7 @@ impl Note { let note = Note { recipient, value, + note_type, rho, rseed: RandomSeed::random(&mut rng, &rho), }; @@ -162,6 +171,7 @@ impl Note { let note = Note::new( recipient, NoteValue::zero(), + NoteType::native(), rho.unwrap_or_else(|| Nullifier::dummy(rng)), rng, ); @@ -179,6 +189,11 @@ impl Note { self.value } + /// Returns the note type + pub fn note_type(&self) -> NoteType { + self.note_type + } + /// Returns the rseed value of this note. pub(crate) fn rseed(&self) -> &RandomSeed { &self.rseed @@ -265,6 +280,7 @@ impl fmt::Debug for TransmittedNoteCiphertext { pub mod testing { use proptest::prelude::*; + use crate::note::note_type::testing::arb_note_type; use crate::{ address::testing::arb_address, note::nullifier::testing::arb_nullifier, value::NoteValue, }; @@ -284,10 +300,12 @@ pub mod testing { recipient in arb_address(), rho in arb_nullifier(), rseed in arb_rseed(), + note_type in arb_note_type(), ) -> Note { Note { recipient, value, + note_type, rho, rseed, } diff --git a/src/note/note_type.rs b/src/note/note_type.rs new file mode 100644 index 000000000..d0857d61a --- /dev/null +++ b/src/note/note_type.rs @@ -0,0 +1,77 @@ +use group::GroupEncoding; +use halo2_proofs::arithmetic::CurveExt; +use pasta_curves::pallas; +use subtle::CtOption; + +use crate::constants::fixed_bases::{VALUE_COMMITMENT_PERSONALIZATION, VALUE_COMMITMENT_V_BYTES}; +use crate::keys::IssuerValidatingKey; + +/// Note type identifier. +#[derive(Clone, Copy, Debug, PartialEq, Eq)] +pub struct NoteType(pub(crate) pallas::Point); + +const MAX_ASSET_DESCRIPTION_SIZE: usize = 512; + +// the hasher used to derive the assetID +#[allow(non_snake_case)] +fn assetID_hasher(msg: Vec) -> pallas::Point { + // TODO(zsa) replace personalization, will require circuit change? + pallas::Point::hash_to_curve(VALUE_COMMITMENT_PERSONALIZATION)(&msg) +} + +impl NoteType { + /// Deserialize the note_type from a byte array. + pub fn from_bytes(bytes: &[u8; 32]) -> CtOption { + pallas::Point::from_bytes(bytes).map(NoteType) + } + + /// Serialize the note_type to its canonical byte representation. + pub fn to_bytes(self) -> [u8; 32] { + self.0.to_bytes() + } + + /// $DeriveNoteType$. + /// + /// Defined in [Zcash Protocol Spec § TBD: Note Types][notetypes]. + /// + /// [notetypes]: https://zips.z.cash/protocol/nu5.pdf#notetypes + #[allow(non_snake_case)] + pub fn derive(ik: &IssuerValidatingKey, assetDesc: Vec) -> Self { + assert!(assetDesc.len() < MAX_ASSET_DESCRIPTION_SIZE); + + let mut s = vec![]; + s.extend(ik.to_bytes()); + s.extend(assetDesc); + + NoteType(assetID_hasher(s)) + } + + /// Note type for the "native" currency (zec), maintains backward compatibility with Orchard untyped notes. + pub fn native() -> Self { + NoteType(assetID_hasher(VALUE_COMMITMENT_V_BYTES.to_vec())) + } +} + +/// Generators for property testing. +#[cfg(any(test, feature = "test-dependencies"))] +#[cfg_attr(docsrs, doc(cfg(feature = "test-dependencies")))] +pub mod testing { + use proptest::prelude::*; + + use super::NoteType; + + use crate::keys::{testing::arb_spending_key, IssuerAuthorizingKey, IssuerValidatingKey}; + + prop_compose! { + /// Generate a uniformly distributed note type + pub fn arb_note_type()( + sk in arb_spending_key(), + bytes32a in prop::array::uniform32(prop::num::u8::ANY), + bytes32b in prop::array::uniform32(prop::num::u8::ANY), + ) -> NoteType { + let bytes64 = [bytes32a, bytes32b].concat(); + let isk = IssuerAuthorizingKey::from(&sk); + NoteType::derive(&IssuerValidatingKey::from(&isk), bytes64) + } + } +} diff --git a/src/note_encryption.rs b/src/note_encryption.rs index 5113cf7e1..e45ca1ec2 100644 --- a/src/note_encryption.rs +++ b/src/note_encryption.rs @@ -10,6 +10,7 @@ use zcash_note_encryption::{ OUT_PLAINTEXT_SIZE, }; +use crate::note::NoteType; use crate::{ action::Action, keys::{ @@ -75,7 +76,8 @@ where let pk_d = get_validated_pk_d(&diversifier)?; let recipient = Address::from_parts(diversifier, pk_d); - let note = Note::from_parts(recipient, value, domain.rho, rseed); + // TODO: add note_type + let note = Note::from_parts(recipient, value, NoteType::native(), domain.rho, rseed); Some((note, recipient)) } @@ -156,6 +158,7 @@ impl Domain for OrchardDomain { np[0] = 0x02; np[1..12].copy_from_slice(note.recipient().diversifier().as_array()); np[12..20].copy_from_slice(¬e.value().to_bytes()); + // todo: add note_type np[20..52].copy_from_slice(note.rseed().as_bytes()); np[52..].copy_from_slice(memo); NotePlaintextBytes(np) @@ -343,6 +346,7 @@ mod tests { }; use super::{prf_ock_orchard, CompactAction, OrchardDomain, OrchardNoteEncryption}; + use crate::note::NoteType; use crate::{ action::Action, keys::{ @@ -396,7 +400,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); + let note = Note::from_parts(recipient, value, NoteType::native(), rho, rseed); assert_eq!(ExtractedNoteCommitment::from(note.commitment()), cmx); let action = Action::from_parts( diff --git a/src/value.rs b/src/value.rs index a760e77b3..abb287bcc 100644 --- a/src/value.rs +++ b/src/value.rs @@ -50,10 +50,9 @@ use pasta_curves::{ use rand::RngCore; use subtle::CtOption; +use crate::note::NoteType; 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}, }; @@ -209,7 +208,7 @@ impl TryFrom for i64 { } /// The blinding factor for a [`ValueCommitment`]. -#[derive(Clone, Debug)] +#[derive(Clone, Copy, Debug)] pub struct ValueCommitTrapdoor(pallas::Scalar); impl ValueCommitTrapdoor { @@ -292,9 +291,8 @@ impl ValueCommitment { /// /// [concretehomomorphiccommit]: https://zips.z.cash/protocol/nu5.pdf#concretehomomorphiccommit #[allow(non_snake_case)] - pub(crate) fn derive(value: ValueSum, rcv: ValueCommitTrapdoor) -> Self { + pub(crate) fn derive(value: ValueSum, rcv: ValueCommitTrapdoor, note_type: NoteType) -> 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"); @@ -304,7 +302,9 @@ impl ValueCommitment { pallas::Scalar::from(abs_value) }; - ValueCommitment(V * value + R * rcv.0) + let V_zsa = note_type.0; + + ValueCommitment(V_zsa * value + R * rcv.0) } pub(crate) fn into_bvk(self) -> redpallas::VerificationKey { @@ -407,6 +407,8 @@ pub mod testing { #[cfg(test)] mod tests { + use crate::note::note_type::testing::arb_note_type; + use crate::note::NoteType; use proptest::prelude::*; use super::{ @@ -415,6 +417,29 @@ mod tests { }; use crate::primitives::redpallas; + fn _bsk_consistent_with_bvk(values: &[(ValueSum, ValueCommitTrapdoor)], note_type: NoteType) { + 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 + .iter() + .map(|(value, rcv)| ValueCommitment::derive(*value, *rcv, note_type)) + .sum::() + - ValueCommitment::derive(value_balance, ValueCommitTrapdoor::zero(), note_type)) + .into_bvk(); + + assert_eq!(redpallas::VerificationKey::from(&bsk), bvk); + } + proptest! { #[test] fn bsk_consistent_with_bvk( @@ -422,28 +447,13 @@ mod tests { 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) ) - ) + ), + arb_note_type in arb_note_type(), ) { - 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); + // Test with native note type (zec) + _bsk_consistent_with_bvk(&values, NoteType::native()); + // Test with arbitrary note type + _bsk_consistent_with_bvk(&values, arb_note_type); } } } From ac71bc752847f36b23d25ad054f69b647cbed167 Mon Sep 17 00:00:00 2001 From: naure Date: Wed, 20 Jul 2022 13:08:58 +0200 Subject: [PATCH 04/16] ZSA note encryption in Orchard crate (#3) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit * Circleci project setup (#1) * Added .circleci/config.yml * Added NoteType to Notes * reformated file * updated `derive` for NoteType * added note_type to value commit derivation * rustfmt * updated ci config * updated ci config * updated ci config * updated derive for note_type * added test for arb note_type * added test for `native` note type * zsa-note-encryption: introduce AssetType and encode and decode it in note plaintexts * zsa-note-encryption: extend the size of compact notes to include asset_type * fixed clippy warrnings * rustfmt * zsa-note-encryption: document parsing requirement * zsa-note-encryption: revert support of ZSA compact action * zsa_value: add NoteType method is_native * zsa-note-encryption: remove dependency on changes in the other crate * zsa-note-encryption: extract memo of ZSA notes * zsa-note-encryption: tests (zcash_test_vectors 77c73492) * zsa-note-encryption: simplify roundtrip test * zsa-note-encryption: more test vectors (zcash_test_vectors c10da464) * Circleci project setup (#1) * Added .circleci/config.yml * issuer keys implementation (#5) Implements the issuer keys as IssuerAuthorizingKey -> isk IssuerVerifyingKey -> ik Test vectors generated with zcash_test_vectors repo * Added NoteType to Notes (#2) * Added NoteType to Notes * Added NoteType to value commitment derivation * zsa-note-encryption: use both native and ZSA in proptests * zsa-note-encryption: test vector commit 51398c93 * zsa-note-encryption: fix after merge Co-authored-by: Paul <3682187+PaulLaux@users.noreply.github.com> Co-authored-by: Paul Co-authored-by: Aurélien Nicolas Co-authored-by: Daniel Benarroch --- .gitignore | 1 + src/constants/fixed_bases.rs | 3 + src/note.rs | 1 + src/note/commitment.rs | 54 +- src/note/note_type.rs | 29 +- src/note_encryption.rs | 138 +- src/test_vectors/note_encryption.rs | 3612 +++++++++++++++++++++------ src/value.rs | 2 +- 8 files changed, 3068 insertions(+), 772 deletions(-) diff --git a/.gitignore b/.gitignore index 173b95142..57ee1a9ad 100644 --- a/.gitignore +++ b/.gitignore @@ -2,3 +2,4 @@ **/*.rs.bk Cargo.lock .vscode +.idea diff --git a/src/constants/fixed_bases.rs b/src/constants/fixed_bases.rs index 7a86487d3..bd58a90c2 100644 --- a/src/constants/fixed_bases.rs +++ b/src/constants/fixed_bases.rs @@ -34,6 +34,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/note.rs b/src/note.rs index 7c59e0360..514836e50 100644 --- a/src/note.rs +++ b/src/note.rs @@ -235,6 +235,7 @@ impl Note { g_d.to_bytes(), self.recipient.pk_d().to_bytes(), self.value, + self.note_type, self.rho.0, self.rseed.psi(&self.rho), self.rseed.rcm(&self.rho), diff --git a/src/note/commitment.rs b/src/note/commitment.rs index 9de51d28e..95dc92a2c 100644 --- a/src/note/commitment.rs +++ b/src/note/commitment.rs @@ -7,7 +7,11 @@ use pasta_curves::pallas; use subtle::{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::note_type::NoteType, spec::extract_p, value::NoteValue, }; @@ -41,22 +45,46 @@ impl NoteCommitment { g_d: [u8; 32], pk_d: [u8; 32], v: NoteValue, + note_type: NoteType, 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, - ) - .map(NoteCommitment) + 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 zec_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)); + + // TODO: make this constant-time. + if note_type.is_native().into() { + // Commit to ZEC notes as per the Orchard protocol. + Self::commit(NOTE_COMMITMENT_PERSONALIZATION, zec_note_bits, rcm) + } else { + // Commit to non-ZEC notes as per the ZSA protocol. + // Append the note type to the Orchard note encoding. + let type_bits = BitArray::<_, Lsb0>::new(note_type.to_bytes()); + let zsa_note_bits = zec_note_bits.chain(type_bits.iter().by_vals()); + + // Commit in a different domain than Orchard notes. + Self::commit(NOTE_ZSA_COMMITMENT_PERSONALIZATION, zsa_note_bits, rcm) + } + } + + fn commit( + personalization: &str, + bits: impl Iterator, + rcm: NoteCommitTrapdoor, + ) -> CtOption { + let domain = sinsemilla::CommitDomain::new(personalization); + domain.commit(bits, &rcm.0).map(NoteCommitment) } } diff --git a/src/note/note_type.rs b/src/note/note_type.rs index d0857d61a..6075259e3 100644 --- a/src/note/note_type.rs +++ b/src/note/note_type.rs @@ -1,7 +1,7 @@ use group::GroupEncoding; use halo2_proofs::arithmetic::CurveExt; use pasta_curves::pallas; -use subtle::CtOption; +use subtle::{Choice, ConstantTimeEq, CtOption}; use crate::constants::fixed_bases::{VALUE_COMMITMENT_PERSONALIZATION, VALUE_COMMITMENT_V_BYTES}; use crate::keys::IssuerValidatingKey; @@ -15,7 +15,7 @@ const MAX_ASSET_DESCRIPTION_SIZE: usize = 512; // the hasher used to derive the assetID #[allow(non_snake_case)] fn assetID_hasher(msg: Vec) -> pallas::Point { - // TODO(zsa) replace personalization, will require circuit change? + // TODO(zsa) replace personalization pallas::Point::hash_to_curve(VALUE_COMMITMENT_PERSONALIZATION)(&msg) } @@ -50,6 +50,16 @@ impl NoteType { pub fn native() -> Self { NoteType(assetID_hasher(VALUE_COMMITMENT_V_BYTES.to_vec())) } + + /// 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) + } } /// Generators for property testing. @@ -58,20 +68,25 @@ impl NoteType { pub mod testing { use proptest::prelude::*; - use super::NoteType; - use crate::keys::{testing::arb_spending_key, IssuerAuthorizingKey, IssuerValidatingKey}; + use super::NoteType; + prop_compose! { /// Generate a uniformly distributed note type pub fn arb_note_type()( + is_native in prop::bool::ANY, sk in arb_spending_key(), bytes32a in prop::array::uniform32(prop::num::u8::ANY), bytes32b in prop::array::uniform32(prop::num::u8::ANY), ) -> NoteType { - let bytes64 = [bytes32a, bytes32b].concat(); - let isk = IssuerAuthorizingKey::from(&sk); - NoteType::derive(&IssuerValidatingKey::from(&isk), bytes64) + if is_native { + NoteType::native() + } else { + let bytes64 = [bytes32a, bytes32b].concat(); + let isk = IssuerAuthorizingKey::from(&sk); + NoteType::derive(&IssuerValidatingKey::from(&isk), bytes64) + } } } } diff --git a/src/note_encryption.rs b/src/note_encryption.rs index e45ca1ec2..721185831 100644 --- a/src/note_encryption.rs +++ b/src/note_encryption.rs @@ -1,8 +1,7 @@ //! In-band secret distribution for Orchard bundles. -use core::fmt; - use blake2b_simd::{Hash, Params}; +use core::fmt; use group::ff::PrimeField; use zcash_note_encryption::{ BatchDomain, Domain, EphemeralKeyBytes, NotePlaintextBytes, OutPlaintextBytes, @@ -25,6 +24,15 @@ use crate::{ const PRF_OCK_ORCHARD_PERSONALIZATION: &[u8; 16] = b"Zcash_Orchardock"; +/// The size of the encoding of a ZSA asset type. +const ZSA_TYPE_SIZE: usize = 32; +/// The size of the ZSA variant of COMPACT_NOTE_SIZE. +const COMPACT_ZSA_NOTE_SIZE: usize = COMPACT_NOTE_SIZE + ZSA_TYPE_SIZE; +/// The size of the memo. +const MEMO_SIZE: usize = NOTE_PLAINTEXT_SIZE - COMPACT_NOTE_SIZE; +/// The size of the ZSA variant of the memo. +const ZSA_MEMO_SIZE: usize = NOTE_PLAINTEXT_SIZE - COMPACT_ZSA_NOTE_SIZE; + /// Defined in [Zcash Protocol Spec § 5.4.2: Pseudo Random Functions][concreteprfs]. /// /// [concreteprfs]: https://zips.z.cash/protocol/nu5.pdf#concreteprfs @@ -50,6 +58,8 @@ pub(crate) fn prf_ock_orchard( ) } +/// 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: &[u8], @@ -61,9 +71,8 @@ where assert!(plaintext.len() >= COMPACT_NOTE_SIZE); // Check note plaintext version - if plaintext[0] != 0x02 { - return None; - } + // and parse the asset type accordingly. + let note_type = parse_version_and_asset_type(plaintext)?; // The unwraps below are guaranteed to succeed by the assertion above let diversifier = Diversifier::from_bytes(plaintext[1..12].try_into().unwrap()); @@ -76,11 +85,25 @@ where let pk_d = get_validated_pk_d(&diversifier)?; let recipient = Address::from_parts(diversifier, pk_d); - // TODO: add note_type - let note = Note::from_parts(recipient, value, NoteType::native(), domain.rho, rseed); + + let note = Note::from_parts(recipient, value, note_type, domain.rho, rseed); Some((note, recipient)) } +fn parse_version_and_asset_type(plaintext: &[u8]) -> Option { + // TODO: make this constant-time? + match plaintext[0] { + 0x02 => Some(NoteType::native()), + 0x03 if plaintext.len() >= COMPACT_ZSA_NOTE_SIZE => { + let bytes = &plaintext[COMPACT_NOTE_SIZE..COMPACT_ZSA_NOTE_SIZE] + .try_into() + .unwrap(); + NoteType::from_bytes(bytes).into() + } + _ => None, + } +} + /// Orchard-specific note encryption logic. #[derive(Debug)] pub struct OrchardDomain { @@ -114,7 +137,7 @@ 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 fn derive_esk(note: &Self::Note) -> Option { Some(note.esk()) @@ -154,13 +177,23 @@ impl Domain for OrchardDomain { _: &Self::Recipient, memo: &Self::Memo, ) -> NotePlaintextBytes { + let is_native: bool = note.note_type().is_native().into(); + let mut np = [0; NOTE_PLAINTEXT_SIZE]; - np[0] = 0x02; + np[0] = if is_native { 0x02 } else { 0x03 }; np[1..12].copy_from_slice(note.recipient().diversifier().as_array()); np[12..20].copy_from_slice(¬e.value().to_bytes()); // todo: add note_type np[20..52].copy_from_slice(note.rseed().as_bytes()); - np[52..].copy_from_slice(memo); + if is_native { + np[52..].copy_from_slice(memo); + } else { + let zsa_type = note.note_type().to_bytes(); + np[52..84].copy_from_slice(&zsa_type); + let short_memo = &memo[0..memo.len() - ZSA_TYPE_SIZE]; + np[84..].copy_from_slice(short_memo); + // TODO: handle full-size memo or make short_memo explicit. + }; NotePlaintextBytes(np) } @@ -227,9 +260,20 @@ impl Domain for OrchardDomain { } fn extract_memo(&self, plaintext: &NotePlaintextBytes) -> Self::Memo { - plaintext.0[COMPACT_NOTE_SIZE..NOTE_PLAINTEXT_SIZE] - .try_into() - .unwrap() + let mut memo = [0; MEMO_SIZE]; + match get_note_version(plaintext) { + 0x02 => { + let full_memo = &plaintext.0[COMPACT_NOTE_SIZE..NOTE_PLAINTEXT_SIZE]; + memo.copy_from_slice(full_memo); + } + 0x03 => { + // ZSA note plaintext have a shorter memo. + let short_memo = &plaintext.0[COMPACT_ZSA_NOTE_SIZE..NOTE_PLAINTEXT_SIZE]; + memo[..ZSA_MEMO_SIZE].copy_from_slice(short_memo); + } + _ => {} + }; + memo } fn extract_pk_d(out_plaintext: &OutPlaintextBytes) -> Option { @@ -257,6 +301,10 @@ impl BatchDomain for OrchardDomain { } } +fn get_note_version(plaintext: &NotePlaintextBytes) -> u8 { + plaintext.0[0] +} + /// Implementation of in-band secret distribution for Orchard bundles. pub type OrchardNoteEncryption = zcash_note_encryption::NoteEncryption; @@ -279,7 +327,7 @@ pub struct CompactAction { nullifier: Nullifier, cmx: ExtractedNoteCommitment, ephemeral_key: EphemeralKeyBytes, - enc_ciphertext: [u8; 52], + enc_ciphertext: [u8; COMPACT_NOTE_SIZE], } impl fmt::Debug for CompactAction { @@ -294,7 +342,7 @@ impl From<&Action> for CompactAction { nullifier: *action.nullifier(), cmx: *action.cmx(), ephemeral_key: action.ephemeral_key(), - enc_ciphertext: action.encrypted_note().enc_ciphertext[..52] + enc_ciphertext: action.encrypted_note().enc_ciphertext[..COMPACT_NOTE_SIZE] .try_into() .unwrap(), } @@ -339,13 +387,13 @@ impl CompactAction { #[cfg(test)] mod tests { + use proptest::prelude::*; use rand::rngs::OsRng; use zcash_note_encryption::{ - try_compact_note_decryption, try_note_decryption, try_output_recovery_with_ovk, + 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::NoteType; use crate::{ action::Action, @@ -353,12 +401,55 @@ mod tests { DiversifiedTransmissionKey, Diversifier, EphemeralSecretKey, IncomingViewingKey, OutgoingViewingKey, }, - note::{ExtractedNoteCommitment, Nullifier, RandomSeed, TransmittedNoteCiphertext}, + note::{ + testing::arb_note, ExtractedNoteCommitment, Nullifier, RandomSeed, + TransmittedNoteCiphertext, + }, primitives::redpallas, value::{NoteValue, ValueCommitment}, Address, Note, }; + use super::{get_note_version, orchard_parse_note_plaintext_without_memo}; + use super::{prf_ock_orchard, CompactAction, OrchardDomain, OrchardNoteEncryption}; + + proptest! { + #[test] + fn test_encoding_roundtrip( + note in arb_note(NoteValue::from_raw(10)), + ) { + let memo = &crate::test_vectors::note_encryption::test_vectors()[0].memo; + + // Encode. + let plaintext = OrchardDomain::note_plaintext_bytes(¬e, ¬e.recipient(), memo); + + // Decode. + let domain = OrchardDomain { rho: note.rho() }; + let parsed_version = get_note_version(&plaintext); + let parsed_memo = domain.extract_memo(&plaintext); + + let (parsed_note, parsed_recipient) = orchard_parse_note_plaintext_without_memo(&domain, &plaintext.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()); + if parsed_note.note_type().is_native().into() { + assert_eq!(parsed_version, 0x02); + assert_eq!(&parsed_memo, memo); + } else { + assert_eq!(parsed_version, 0x03); + let mut short_memo = *memo; + short_memo[512 - 32..].copy_from_slice(&[0; 32]); + assert_eq!(parsed_memo, short_memo); + } + } + } + #[test] fn test_vectors() { let test_vectors = crate::test_vectors::note_encryption::test_vectors(); @@ -400,7 +491,13 @@ mod tests { assert_eq!(ock.as_ref(), tv.ock); let recipient = Address::from_parts(d, pk_d); - let note = Note::from_parts(recipient, value, NoteType::native(), rho, rseed); + + let note_type = match tv.note_type { + None => NoteType::native(), + Some(type_bytes) => NoteType::from_bytes(&type_bytes).unwrap(), + }; + + let note = Note::from_parts(recipient, value, note_type, rho, rseed); assert_eq!(ExtractedNoteCommitment::from(note.commitment()), cmx); let action = Action::from_parts( @@ -439,7 +536,8 @@ mod tests { assert_eq!(decrypted_note, note); assert_eq!(decrypted_to, recipient); } - None => panic!("Compact note decryption failed"), + None => assert!(tv.note_type.is_some(), "Compact note decryption failed"), + // Ignore that ZSA notes are not detected in compact decryption. } match try_output_recovery_with_ovk(&domain, &ovk, &action, &cv_net, &tv.c_out) { diff --git a/src/test_vectors/note_encryption.rs b/src/test_vectors/note_encryption.rs index 10ac4f5e0..7d2b7c960 100644 --- a/src/test_vectors/note_encryption.rs +++ b/src/test_vectors/note_encryption.rs @@ -1,4 +1,4 @@ -//! Test vectors for Orchard key components. +// From https://github.com/zcash-hackworks/zcash-test-vectors/ (orchard_note_encryption) pub(crate) struct TestVector { pub(crate) incoming_viewing_key: [u8; 64], @@ -20,10 +20,10 @@ pub(crate) struct TestVector { pub(crate) ock: [u8; 32], pub(crate) op: [u8; 64], pub(crate) c_out: [u8; 80], + pub(crate) note_type: Option<[u8; 32]>, } 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: [ @@ -97,34 +97,34 @@ pub(crate) fn test_vectors() -> Vec { 0xc1, 0x3e, 0x71, 0x01, ], rho: [ - 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, + 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: [ - 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,69 +170,70 @@ 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, + ], + note_type: None, }, TestVector { incoming_viewing_key: [ @@ -306,34 +307,34 @@ pub(crate) fn test_vectors() -> Vec { 0x25, 0x7a, 0xd8, 0xb3, ], rho: [ - 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, + 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: [ - 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,69 +380,70 @@ 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, + ], + note_type: None, }, TestVector { incoming_viewing_key: [ @@ -515,34 +517,34 @@ pub(crate) fn test_vectors() -> Vec { 0xc5, 0xb3, 0x73, 0x3e, ], rho: [ - 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, + 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: [ - 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,69 +590,70 @@ 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, + ], + note_type: None, }, TestVector { incoming_viewing_key: [ @@ -724,34 +727,34 @@ pub(crate) fn test_vectors() -> Vec { 0x32, 0xb5, 0x0e, 0x96, ], rho: [ - 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, + 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: [ - 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,69 +800,70 @@ 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, + ], + note_type: None, }, TestVector { incoming_viewing_key: [ @@ -933,34 +937,34 @@ pub(crate) fn test_vectors() -> Vec { 0xd2, 0x50, 0x21, 0x17, ], rho: [ - 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, + 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: [ - 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,69 +1010,70 @@ 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, + ], + note_type: None, }, TestVector { incoming_viewing_key: [ @@ -1142,34 +1147,34 @@ pub(crate) fn test_vectors() -> Vec { 0xda, 0x6b, 0x15, 0x14, ], rho: [ - 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, + 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: [ - 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,69 +1220,70 @@ 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, + ], + note_type: None, }, TestVector { incoming_viewing_key: [ @@ -1351,34 +1357,34 @@ pub(crate) fn test_vectors() -> Vec { 0x88, 0xff, 0xee, 0x2f, ], rho: [ - 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, + 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: [ - 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,69 +1430,70 @@ 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, + ], + note_type: None, }, TestVector { incoming_viewing_key: [ @@ -1560,34 +1567,34 @@ pub(crate) fn test_vectors() -> Vec { 0xe2, 0x3c, 0x39, 0x11, ], rho: [ - 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, + 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: [ - 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,69 +1640,70 @@ 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, + ], + note_type: None, }, TestVector { incoming_viewing_key: [ @@ -1769,34 +1777,34 @@ pub(crate) fn test_vectors() -> Vec { 0x87, 0xe5, 0x05, 0xad, ], rho: [ - 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, + 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: [ - 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,69 +1850,70 @@ 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, + ], + note_type: None, }, TestVector { incoming_viewing_key: [ @@ -1978,34 +1987,34 @@ pub(crate) fn test_vectors() -> Vec { 0x71, 0x55, 0x00, 0xb5, ], rho: [ - 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, + 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: [ - 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,69 +2060,2210 @@ 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: [ + 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, + ], + note_type: None, + }, + 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, + ], + 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, 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, + ], + cv_net: [ + 0x09, 0xee, 0x7e, 0xf6, 0x3a, 0xb1, 0xcf, 0x24, 0x2b, 0xaa, 0x76, 0xfc, 0xbf, 0xfb, + 0xe5, 0x75, 0x5f, 0x13, 0x14, 0x2b, 0x38, 0xb1, 0xa0, 0x40, 0x4d, 0x7d, 0x5a, 0x3f, + 0x4f, 0x22, 0x1e, 0x96, + ], + 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: [ + 0x85, 0xec, 0x16, 0xe8, 0x78, 0x77, 0x33, 0x37, 0x07, 0x9a, 0xec, 0xf3, 0x2c, 0x45, + 0x5e, 0xbf, 0x16, 0x96, 0x8d, 0xa1, 0xd4, 0x34, 0x51, 0xb7, 0xa3, 0x06, 0x87, 0x6c, + 0xa3, 0x08, 0xea, 0x3c, + ], + 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, + ], + 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, 0xb5, 0xdf, 0x47, 0xa6, 0x67, 0xc4, 0x6d, 0x4c, 0xff, 0xeb, + 0xfe, 0x3f, 0xbb, 0x0a, 0x4e, 0x48, + ], + ock: [ + 0x17, 0xeb, 0xb4, 0x82, 0xdf, 0x8d, 0x13, 0xc2, 0x0d, 0x9b, 0x4a, 0x03, 0x9f, 0x40, + 0x5a, 0x93, 0x69, 0x8a, 0xc2, 0x24, 0xf3, 0xea, 0x03, 0xfb, 0x55, 0x8d, 0x5b, 0x53, + 0x11, 0x46, 0xfb, 0xea, + ], + 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: [ + 0x2d, 0x76, 0x57, 0x79, 0x67, 0x44, 0x5f, 0xb9, 0x17, 0xee, 0x72, 0xd3, 0x2d, 0x4b, + 0x75, 0x3b, 0x25, 0x10, 0xd8, 0x05, 0x5d, 0xec, 0x8b, 0xf1, 0x22, 0x0a, 0x75, 0xf0, + 0x65, 0xbd, 0x47, 0xe2, 0xcc, 0xb6, 0x03, 0x98, 0x84, 0x50, 0x23, 0x1b, 0xd3, 0x1c, + 0x15, 0x6f, 0xf2, 0xa7, 0x2a, 0xfd, 0x4a, 0x96, 0x0b, 0x6f, 0x6a, 0x78, 0x84, 0x65, + 0x13, 0x51, 0xe2, 0x4b, 0x47, 0x02, 0x87, 0xd5, 0x83, 0xba, 0x69, 0x71, 0x18, 0xec, + 0x07, 0xf6, 0x59, 0x2c, 0x4c, 0xd7, 0xcd, 0x6a, 0xc7, 0x7e, + ], + note_type: Some([ + 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, + ]), + }, + 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, + ], + 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, 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, + ], + cv_net: [ + 0x54, 0xb6, 0x99, 0x64, 0x13, 0x6b, 0x63, 0xd1, 0x7d, 0x62, 0x44, 0x1a, 0x69, 0x37, + 0x13, 0x9d, 0x2c, 0xe1, 0x4b, 0xb5, 0x5c, 0x42, 0x07, 0xfe, 0x74, 0xd7, 0x70, 0x83, + 0x53, 0x51, 0x5b, 0xa8, + ], + 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: [ + 0x40, 0x8f, 0x59, 0x4f, 0xdd, 0xc5, 0x0c, 0x67, 0xf5, 0x47, 0xe1, 0xeb, 0x3e, 0xa2, + 0x99, 0xa3, 0x1f, 0x69, 0xf5, 0x7f, 0xc9, 0x92, 0x03, 0x01, 0x42, 0x90, 0x35, 0xa6, + 0xc2, 0x49, 0x79, 0x1a, + ], + 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, + ], + 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, 0xe0, 0x65, 0xff, 0xcb, 0xf6, 0xbb, 0xa0, 0x18, 0x09, 0x1e, + 0x49, 0xaa, 0x90, 0xe6, 0x02, 0xc8, + ], + ock: [ + 0x59, 0xf9, 0xcc, 0x26, 0x38, 0x4c, 0x6f, 0x73, 0xce, 0xa9, 0xb9, 0xe0, 0x94, 0x40, + 0xf8, 0xf0, 0x4c, 0x40, 0x25, 0xb5, 0x59, 0x04, 0x42, 0x3c, 0x35, 0x39, 0xc6, 0x6c, + 0x75, 0x11, 0x31, 0x23, + ], + 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: [ + 0x21, 0xe3, 0xf8, 0x97, 0xe1, 0xb1, 0x36, 0xe1, 0x74, 0xd7, 0xae, 0x88, 0xd7, 0x85, + 0xa0, 0x61, 0xe6, 0x71, 0xef, 0xf1, 0x81, 0x98, 0x0a, 0x6f, 0xf5, 0x19, 0xb3, 0xbb, + 0x6b, 0xbd, 0xaf, 0xea, 0x9d, 0xf9, 0x92, 0xbc, 0xaa, 0xc0, 0x2b, 0xdb, 0xcd, 0x4d, + 0xb1, 0xc1, 0xd3, 0xf3, 0x2d, 0xef, 0xcd, 0xf7, 0xf4, 0xad, 0x54, 0x1b, 0x6b, 0xee, + 0xe8, 0x27, 0xdd, 0x43, 0x89, 0xb8, 0x57, 0xd1, 0x6d, 0xb8, 0x24, 0xe7, 0x72, 0xba, + 0x5a, 0xb5, 0xe2, 0x8d, 0xd6, 0xe9, 0x80, 0x82, 0x6b, 0xed, + ], + note_type: Some([ + 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, + ]), + }, + 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, + ], + 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, 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, + ], + cv_net: [ + 0x10, 0xb2, 0x33, 0xd2, 0x49, 0x94, 0x68, 0xe0, 0xb0, 0xdf, 0x47, 0x3d, 0x5a, 0x21, + 0xb9, 0x3f, 0x7d, 0x2b, 0x5d, 0x5f, 0x09, 0x95, 0xa9, 0x55, 0xd0, 0x86, 0x8a, 0x27, + 0x45, 0x3f, 0x96, 0x82, + ], + 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: [ + 0x9e, 0x3d, 0x61, 0x35, 0x6b, 0x0d, 0x88, 0x95, 0x9e, 0x3f, 0x0f, 0xcc, 0x4a, 0x93, + 0x2e, 0x93, 0x2e, 0xac, 0xbc, 0x80, 0x1d, 0x48, 0xc0, 0x19, 0x5b, 0x9c, 0x8b, 0xd1, + 0x05, 0x5a, 0x8e, 0x2e, + ], + 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, + ], + 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, 0x3b, 0xca, 0xa8, 0x68, 0x6a, 0xc8, 0x49, 0x3b, 0x2c, 0xb8, + 0xf1, 0xd7, 0xd3, 0x95, 0x8a, 0x54, + ], + ock: [ + 0xdb, 0x1e, 0xf1, 0x9a, 0xf6, 0xdd, 0x1b, 0x7b, 0xf0, 0x64, 0x89, 0xe7, 0xdb, 0x86, + 0xca, 0xae, 0x27, 0xf6, 0x70, 0x1e, 0x09, 0x16, 0x8c, 0x6e, 0x0d, 0x2b, 0x89, 0x78, + 0xdf, 0x14, 0xe0, 0x96, + ], + 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: [ + 0x55, 0xdd, 0xba, 0xc4, 0x35, 0x64, 0x19, 0x54, 0xbd, 0xb1, 0xc9, 0x43, 0x4c, 0x36, + 0x79, 0x32, 0x19, 0x18, 0xbc, 0x1f, 0x29, 0x90, 0x7a, 0xc4, 0x24, 0x43, 0x55, 0x2d, + 0xfb, 0xe7, 0x05, 0xab, 0x26, 0x19, 0x1b, 0x4e, 0x2b, 0xae, 0xa4, 0xaa, 0xe0, 0x6d, + 0xa9, 0xf1, 0x38, 0x4e, 0x23, 0x7b, 0xee, 0xab, 0xb1, 0xa2, 0xd8, 0x22, 0x99, 0x5e, + 0xe7, 0xb9, 0x41, 0x0d, 0x6b, 0xe7, 0x59, 0x2a, 0xed, 0xa9, 0xf5, 0x2d, 0x56, 0xd8, + 0xc9, 0xf9, 0x3a, 0x0b, 0xe3, 0x8c, 0xfc, 0x8d, 0xc2, 0x94, + ], + note_type: Some([ + 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, + ]), + }, + 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, + ], + 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, 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, + ], + cv_net: [ + 0x7e, 0xfd, 0xf4, 0x17, 0xcf, 0xd6, 0x44, 0x7d, 0x96, 0x58, 0x1d, 0xd1, 0x7b, 0x82, + 0x12, 0xee, 0x53, 0x7b, 0x13, 0x4b, 0x05, 0xa5, 0x58, 0x67, 0x4a, 0x39, 0xe6, 0x66, + 0x97, 0xe6, 0x3a, 0x29, + ], + 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: [ + 0xf2, 0x04, 0x22, 0x51, 0xa0, 0x59, 0xa2, 0xf5, 0x8a, 0xb8, 0xe9, 0x0b, 0x52, 0x64, + 0xd0, 0xa4, 0x3f, 0x96, 0xd7, 0x7e, 0xdd, 0x54, 0xf8, 0x0f, 0xf4, 0x9d, 0x43, 0x86, + 0x81, 0x4d, 0x73, 0x2e, + ], + 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, + ], + 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, 0x06, 0x66, 0xf2, 0x3c, 0x7f, 0x97, 0xe7, 0x84, 0xbe, 0x68, + 0xcc, 0x22, 0xca, 0x1d, 0x09, 0xd5, + ], + ock: [ + 0xcf, 0x22, 0xd2, 0x83, 0x95, 0x98, 0x5d, 0x31, 0x6a, 0xf9, 0x50, 0x19, 0x21, 0xba, + 0xc1, 0x52, 0x57, 0x11, 0xbb, 0x3f, 0x3c, 0xc3, 0xc3, 0xc2, 0x82, 0xa3, 0xd1, 0x8e, + 0x43, 0xd4, 0x78, 0x05, + ], + 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: [ + 0x7a, 0xe6, 0x91, 0xd9, 0xbc, 0xd5, 0x38, 0x42, 0x7b, 0x4f, 0x07, 0xe2, 0x38, 0x81, + 0x94, 0x18, 0xbb, 0xb8, 0x18, 0x31, 0x88, 0x89, 0x93, 0x08, 0xfd, 0x6a, 0xab, 0x2b, + 0xf4, 0xf0, 0x69, 0x9c, 0xc5, 0x61, 0x9c, 0x8d, 0x4f, 0xc9, 0x95, 0xc2, 0x11, 0x76, + 0xbf, 0xea, 0x13, 0xee, 0x04, 0x03, 0xc0, 0xce, 0x57, 0x4f, 0xc8, 0xfa, 0x16, 0x81, + 0xb3, 0x76, 0xcf, 0x33, 0xc9, 0xff, 0x27, 0xa5, 0xaa, 0x01, 0x58, 0x24, 0xe6, 0x78, + 0x6e, 0x16, 0xe3, 0x7b, 0x35, 0x5c, 0xf7, 0x54, 0x52, 0xdb, + ], + note_type: Some([ + 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, + ]), + }, + 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, + ], + 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, 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, + ], + cv_net: [ + 0xf5, 0xc1, 0xcf, 0xbc, 0xb9, 0x2d, 0x34, 0xe4, 0x66, 0x1d, 0x58, 0x25, 0x42, 0xf7, + 0x0d, 0x05, 0x99, 0x09, 0x15, 0x20, 0xfe, 0x2a, 0xfa, 0xd8, 0xe8, 0x75, 0xca, 0x3b, + 0xcc, 0x70, 0x8a, 0x11, + ], + 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: [ + 0xe1, 0xc7, 0x67, 0xf3, 0x30, 0x15, 0xb5, 0xe2, 0x4a, 0x9a, 0xa5, 0x8b, 0x64, 0x7b, + 0x6b, 0x61, 0x32, 0x3c, 0xd3, 0x47, 0xe7, 0x21, 0x4c, 0x29, 0x1d, 0x09, 0x95, 0xc0, + 0xf5, 0xa6, 0x93, 0x2f, + ], + 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, + ], + 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, 0x7a, 0x73, 0x85, 0x39, 0x59, 0x33, 0x48, 0x6f, 0xab, 0x00, + 0xcc, 0x53, 0x03, 0xc5, 0xf3, 0xf0, + ], + ock: [ + 0xe3, 0xf2, 0x74, 0x2e, 0xa1, 0x97, 0x55, 0xa7, 0x99, 0x73, 0x1a, 0xcf, 0xe9, 0x98, + 0x86, 0xfb, 0x9f, 0xbb, 0x80, 0x48, 0xb5, 0x3a, 0x77, 0x72, 0xa2, 0x80, 0xd8, 0x17, + 0x19, 0xff, 0xfd, 0x28, + ], + 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: [ + 0x92, 0xe7, 0x7c, 0x9b, 0x69, 0x92, 0xee, 0x85, 0x06, 0x30, 0x6a, 0x96, 0xc8, 0xa5, + 0x1c, 0xc9, 0xa8, 0x96, 0x18, 0xc6, 0x36, 0x6f, 0xce, 0x78, 0xb2, 0x9a, 0xdb, 0x10, + 0x9b, 0x4a, 0x3b, 0x17, 0x48, 0x49, 0x13, 0x4f, 0x7a, 0xa2, 0x9c, 0x79, 0x1b, 0x91, + 0x5f, 0xd7, 0x5a, 0x6f, 0xfc, 0x57, 0x42, 0x78, 0xef, 0x50, 0x2b, 0x84, 0x02, 0x46, + 0x9a, 0xb5, 0xa7, 0xce, 0x77, 0x2b, 0x52, 0x2c, 0x4b, 0xaa, 0x12, 0x95, 0xd8, 0x8f, + 0x15, 0xdc, 0x75, 0x1d, 0xdf, 0x7d, 0x20, 0x8d, 0xd5, 0x17, + ], + note_type: Some([ + 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, + ]), + }, + 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, + ], + 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, 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, + ], + cv_net: [ + 0x65, 0x73, 0x3c, 0x9d, 0x97, 0xea, 0x82, 0xf6, 0xde, 0xf3, 0xde, 0x1f, 0xe8, 0x7e, + 0x12, 0x37, 0x6a, 0x92, 0x49, 0xdc, 0x86, 0x14, 0x67, 0x2d, 0x5e, 0xda, 0x15, 0xf3, + 0xca, 0xf4, 0x5b, 0x8c, + ], + 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: [ + 0xd7, 0x60, 0xac, 0xdb, 0xca, 0xda, 0xd1, 0x88, 0x08, 0x4f, 0xe4, 0x1a, 0x5c, 0x03, + 0xc2, 0xc8, 0xce, 0x34, 0xe1, 0x5f, 0x9d, 0xf4, 0x7b, 0x86, 0x9c, 0x44, 0xc7, 0x21, + 0x13, 0xa4, 0x0c, 0x3d, + ], + 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, + ], + 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, 0x40, 0xf3, 0x5b, 0x1d, 0xde, 0x91, 0xa3, 0xaf, 0x37, 0xa6, + 0x71, 0xb8, 0xaa, 0x9f, 0x69, 0xf0, + ], + ock: [ + 0x42, 0x46, 0x14, 0xa3, 0xb5, 0x79, 0x96, 0xef, 0xb1, 0x24, 0xb7, 0xf4, 0x50, 0xae, + 0x2a, 0xf7, 0xf6, 0xdc, 0x8c, 0x8c, 0xee, 0xa9, 0x4f, 0x17, 0x74, 0x77, 0x72, 0x1b, + 0x84, 0x61, 0x3b, 0x23, + ], + 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: [ - 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, + 0x8b, 0x94, 0x8b, 0x33, 0xf5, 0x55, 0xcd, 0x45, 0x5f, 0xaa, 0x36, 0x51, 0x7b, 0x8e, + 0xab, 0x29, 0xe1, 0xa5, 0x1f, 0x6c, 0xec, 0x21, 0x79, 0xd9, 0xea, 0xe4, 0xea, 0xca, + 0x92, 0x50, 0xbb, 0x9b, 0x55, 0xe4, 0xb5, 0x49, 0x49, 0x15, 0xc1, 0xf0, 0x01, 0x65, + 0xf8, 0x9d, 0x7c, 0x02, 0xa0, 0x25, 0x45, 0xb9, 0xd5, 0x98, 0x08, 0x6e, 0xeb, 0x96, + 0x1e, 0x58, 0x7e, 0x43, 0xfd, 0xfc, 0x65, 0xfe, 0x52, 0xf1, 0xe0, 0xc6, 0xa0, 0x46, + 0x46, 0x48, 0xcd, 0x1f, 0xc8, 0x9e, 0x80, 0xbd, 0x78, 0x0f, + ], + note_type: Some([ + 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, + ]), + }, + 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, + ], + 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, 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, + ], + cv_net: [ + 0x81, 0xa8, 0xbb, 0x76, 0xf2, 0x62, 0x73, 0x62, 0x8b, 0x9f, 0x9b, 0x66, 0x04, 0x94, + 0xb3, 0x45, 0xb7, 0x9d, 0x45, 0x16, 0x3c, 0x7b, 0x4c, 0xc5, 0x5a, 0x49, 0xff, 0x3f, + 0xc6, 0xb8, 0x1d, 0xaa, + ], + 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: [ + 0x8f, 0x56, 0xd1, 0x3f, 0xd9, 0xc8, 0x3e, 0xb7, 0x1b, 0x95, 0x87, 0x7a, 0x4f, 0x29, + 0x39, 0x64, 0xbf, 0x3f, 0x73, 0x1d, 0x8d, 0xf2, 0x04, 0x32, 0x2c, 0xed, 0xcb, 0x38, + 0x68, 0x21, 0x90, 0x3c, + ], + 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, + ], + 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, 0x5d, 0x13, 0x20, 0x25, 0x08, 0x07, 0x2b, 0x68, 0x82, 0xf4, + 0xd8, 0x2e, 0x93, 0x3c, 0x89, 0xe1, + ], + ock: [ + 0x71, 0x5c, 0x9a, 0x01, 0x87, 0xab, 0x90, 0xb2, 0x4d, 0x3c, 0xbb, 0xa3, 0xf1, 0xab, + 0x30, 0x67, 0xc5, 0x63, 0x06, 0x04, 0x48, 0xc0, 0x0e, 0xf2, 0x74, 0xb7, 0xea, 0x66, + 0x11, 0x13, 0x0d, 0x26, + ], + 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: [ + 0x22, 0xce, 0xb6, 0x94, 0x21, 0xab, 0x9e, 0xd0, 0x29, 0x97, 0x3f, 0xf2, 0x2e, 0xc9, + 0x5f, 0x23, 0x36, 0x56, 0xbe, 0x41, 0xd2, 0x25, 0x1a, 0x76, 0x77, 0xce, 0xb0, 0xd3, + 0x14, 0x22, 0x11, 0x6f, 0x8c, 0xa5, 0xf0, 0xae, 0x23, 0x12, 0xd4, 0xec, 0x60, 0x0c, + 0x5d, 0x7c, 0x56, 0x44, 0x5b, 0x6d, 0x8d, 0xc4, 0xb8, 0x0b, 0x47, 0x0b, 0xb1, 0xf6, + 0x51, 0xa5, 0x38, 0x28, 0x0d, 0xaa, 0x94, 0x20, 0x3a, 0xb5, 0x02, 0xa8, 0x15, 0x09, + 0xe4, 0x3a, 0x61, 0xa6, 0x98, 0x56, 0x57, 0xd9, 0xe8, 0x4e, + ], + note_type: Some([ + 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, + ]), + }, + 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, + ], + 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, 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, + ], + cv_net: [ + 0x40, 0x21, 0x95, 0x68, 0x0e, 0x02, 0x27, 0x30, 0x2c, 0x3a, 0x75, 0x6a, 0x34, 0xdf, + 0xdb, 0x13, 0x6b, 0xbd, 0x28, 0x7d, 0x7d, 0xc1, 0x25, 0x81, 0xd0, 0x8e, 0x2a, 0x63, + 0xb9, 0xc3, 0x92, 0x3e, + ], + 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: [ + 0x69, 0x4b, 0x6f, 0x3a, 0xb8, 0x37, 0xa9, 0x26, 0xd6, 0x77, 0x3e, 0xc4, 0xa6, 0x76, + 0x5d, 0xef, 0x82, 0x89, 0x33, 0x74, 0x2d, 0x93, 0x29, 0xfc, 0x88, 0x67, 0x1c, 0xcd, + 0x81, 0x21, 0xa4, 0x23, + ], + 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, + ], + 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, 0x21, 0x11, 0x25, 0x94, 0x3b, 0x09, 0x32, 0x24, 0x96, 0x7b, + 0x7e, 0x44, 0x16, 0x70, 0x64, 0xc9, + ], + ock: [ + 0xbc, 0x1b, 0xa7, 0xae, 0x73, 0xe7, 0x39, 0x7a, 0x64, 0xe0, 0xbd, 0x98, 0x63, 0xf1, + 0x33, 0x95, 0xdc, 0x0b, 0x15, 0xd4, 0x4e, 0x86, 0x70, 0xf1, 0x85, 0x5b, 0x68, 0xc2, + 0x9f, 0x97, 0x9a, 0xd2, + ], + 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: [ + 0xe2, 0x76, 0x3c, 0x2c, 0xd3, 0x04, 0x29, 0x45, 0x25, 0xf6, 0x6d, 0x17, 0xcd, 0xb4, + 0x2a, 0x6d, 0xaf, 0xd7, 0x47, 0x38, 0x37, 0x71, 0x52, 0x35, 0x62, 0xb2, 0x71, 0xbb, + 0xf5, 0xb2, 0x88, 0x41, 0xb5, 0xca, 0x65, 0xfd, 0xd3, 0x42, 0xee, 0x80, 0x2f, 0xee, + 0x12, 0x12, 0x47, 0x22, 0xcf, 0xf5, 0xe1, 0x99, 0xd6, 0xd9, 0x5c, 0x2f, 0x88, 0xc4, + 0xe2, 0x31, 0x31, 0xf4, 0xe7, 0x6b, 0xa7, 0x6b, 0x9d, 0x64, 0x66, 0x78, 0xd8, 0x53, + 0xd1, 0xdc, 0xaf, 0x81, 0xb8, 0x0e, 0x2e, 0xfd, 0xf0, 0x60, + ], + note_type: Some([ + 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, + ]), + }, + 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, + ], + 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, 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, + ], + cv_net: [ + 0x50, 0xaf, 0x90, 0x31, 0xf4, 0xe0, 0x4b, 0x79, 0xd7, 0xda, 0xb5, 0xe8, 0x5b, 0x51, + 0xee, 0x9b, 0xea, 0x56, 0xf7, 0xc5, 0x6b, 0x52, 0x22, 0x73, 0xd2, 0x30, 0xaa, 0x51, + 0x2b, 0xa9, 0xe7, 0x06, + ], + 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: [ + 0x76, 0xf1, 0xbd, 0x50, 0xf9, 0xb9, 0x06, 0xcb, 0x9f, 0xf2, 0xdd, 0x91, 0x8a, 0x36, + 0x7e, 0x5f, 0xb1, 0xa2, 0xef, 0x39, 0xf1, 0x4f, 0x6c, 0xe9, 0x4f, 0xf9, 0xf0, 0x91, + 0x55, 0xf8, 0xc2, 0x11, + ], + 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, + ], + 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, 0x68, 0xed, 0x11, 0x06, 0x29, 0x54, 0xd2, 0xe8, 0xd3, 0x0c, + 0xcc, 0xac, 0xba, 0xd9, 0xa2, 0xfa, + ], + ock: [ + 0xc7, 0x5b, 0x5b, 0xfa, 0x9f, 0x2e, 0xeb, 0xd9, 0x99, 0x80, 0x78, 0xf1, 0x8f, 0x0e, + 0x9b, 0x79, 0xf1, 0xe2, 0x13, 0xe8, 0x25, 0x61, 0x6f, 0xeb, 0x26, 0x08, 0xe9, 0xc7, + 0x81, 0xb5, 0x00, 0x95, + ], + 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: [ + 0xca, 0x4d, 0x6e, 0xb3, 0xea, 0x95, 0xc5, 0x5a, 0x91, 0x16, 0x85, 0x66, 0xe6, 0x67, + 0x63, 0xd1, 0x9e, 0x9c, 0x44, 0x33, 0x07, 0x3c, 0x08, 0x9a, 0x7d, 0xb9, 0x5b, 0x93, + 0xc8, 0xc4, 0x55, 0x0e, 0xb0, 0x8e, 0x28, 0xdd, 0xef, 0xba, 0x64, 0xe0, 0x58, 0xac, + 0x68, 0x44, 0xad, 0x77, 0x20, 0x67, 0xa1, 0x7c, 0x32, 0x53, 0xc3, 0x9a, 0x72, 0x4d, + 0xd8, 0x15, 0xf7, 0x29, 0x8c, 0x1d, 0x59, 0x09, 0x1f, 0x1b, 0x38, 0x7a, 0x26, 0x46, + 0xe7, 0xfe, 0x36, 0x3a, 0xde, 0x83, 0x63, 0xa9, 0x2a, 0xde, + ], + note_type: Some([ + 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, + ]), + }, + 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, + ], + 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, 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, + ], + cv_net: [ + 0x72, 0xd8, 0x2a, 0xd6, 0x89, 0xd2, 0x9f, 0x9b, 0x18, 0x9d, 0x5b, 0x44, 0x78, 0x9f, + 0x55, 0xfe, 0x1e, 0x9b, 0xab, 0x78, 0x8f, 0xf8, 0x7e, 0xbe, 0x9f, 0xc8, 0x59, 0x50, + 0x4f, 0xb2, 0x3c, 0x8a, + ], + 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: [ + 0x89, 0xe6, 0xa2, 0xb9, 0x70, 0x84, 0xe3, 0xd3, 0x34, 0x4f, 0xee, 0xb4, 0x64, 0x65, + 0x05, 0x72, 0x51, 0xb1, 0x9d, 0xa0, 0xce, 0xdf, 0x79, 0x71, 0x94, 0xc5, 0x97, 0xf9, + 0xf7, 0x7e, 0xf2, 0x1f, + ], + 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, + ], + 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, 0x90, 0xa6, 0xaf, 0x8c, 0x58, 0x1d, 0xf6, 0x09, 0xc4, 0x11, + 0xf4, 0x76, 0x11, 0x41, 0xd4, 0xa6, + ], + ock: [ + 0xdc, 0xf9, 0x34, 0xcf, 0x6a, 0x64, 0x90, 0x3f, 0x2d, 0x99, 0xa3, 0x07, 0xe1, 0x55, + 0xfb, 0x90, 0xe9, 0x7a, 0xc9, 0x0c, 0x38, 0x7f, 0x1b, 0xa5, 0xa6, 0xea, 0x43, 0xb5, + 0x91, 0xb0, 0x5d, 0x69, + ], + 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: [ + 0x25, 0xf4, 0xbb, 0x9f, 0xb4, 0x45, 0x06, 0x78, 0x9c, 0xf5, 0x1d, 0xc3, 0xf6, 0x5f, + 0x17, 0xaf, 0xee, 0xe0, 0x34, 0x92, 0x79, 0xc7, 0x89, 0x28, 0x9b, 0x03, 0xd3, 0x8c, + 0x2e, 0x20, 0xd3, 0x12, 0x5d, 0xe7, 0xc5, 0x6e, 0x18, 0x29, 0x2d, 0xec, 0xc6, 0x41, + 0x81, 0xa7, 0xe9, 0xa7, 0xbc, 0x12, 0xeb, 0x97, 0x85, 0xf0, 0xdd, 0x51, 0xd5, 0x88, + 0x62, 0x00, 0xfb, 0x18, 0x7d, 0x2c, 0x16, 0x90, 0x65, 0xaf, 0x84, 0xcc, 0x02, 0x3d, + 0x6d, 0x63, 0xce, 0x05, 0x83, 0x28, 0xe2, 0x47, 0xb5, 0x98, + ], + note_type: Some([ + 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, + ]), }, ] } diff --git a/src/value.rs b/src/value.rs index abb287bcc..8db1839aa 100644 --- a/src/value.rs +++ b/src/value.rs @@ -302,7 +302,7 @@ impl ValueCommitment { pallas::Scalar::from(abs_value) }; - let V_zsa = note_type.0; + let V_zsa = note_type.cv_base(); ValueCommitment(V_zsa * value + R * rcv.0) } From 61b5cdc7d069c1583844bcdc1254fece6adc978c Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Aur=C3=A9lien=20Nicolas?= Date: Sun, 21 Aug 2022 13:24:17 +0200 Subject: [PATCH 05/16] zsa-mux: multiplexer chip --- src/circuit.rs | 58 +- src/circuit/gadget.rs | 1 + src/circuit/gadget/mux_chip.rs | 125 + src/circuit_description | 4211 +++++++++++++------------------ src/circuit_proof_test_case.bin | Bin 5154 -> 5186 bytes 5 files changed, 1908 insertions(+), 2487 deletions(-) create mode 100644 src/circuit/gadget/mux_chip.rs diff --git a/src/circuit.rs b/src/circuit.rs index b9f64175d..9fe4c0d7b 100644 --- a/src/circuit.rs +++ b/src/circuit.rs @@ -3,6 +3,21 @@ use core::fmt; use group::{Curve, GroupEncoding}; +use halo2_gadgets::{ + ecc::{ + chip::{EccChip, EccConfig}, + FixedPoint, NonIdentityPoint, Point, ScalarFixed, ScalarFixedShort, ScalarVar, + }, + poseidon::{primitives as poseidon, Pow5Chip as PoseidonChip, Pow5Config as PoseidonConfig}, + sinsemilla::{ + chip::{SinsemillaChip, SinsemillaConfig}, + merkle::{ + chip::{MerkleChip, MerkleConfig}, + MerklePath, + }, + }, + utilities::lookup_range_check::LookupRangeCheckConfig, +}; use halo2_proofs::{ circuit::{floor_planner, Layouter, Value}, plonk::{ @@ -16,14 +31,7 @@ use memuse::DynamicUsage; use pasta_curves::{arithmetic::CurveAffine, pallas, vesta}; use rand::RngCore; -use self::{ - commit_ivk::{CommitIvkChip, CommitIvkConfig}, - gadget::{ - add_chip::{AddChip, AddConfig}, - assign_free_advice, - }, - note_commit::{NoteCommitChip, NoteCommitConfig}, -}; +use crate::circuit::gadget::mux_chip::{MuxChip, MuxConfig}; use crate::{ constants::{ OrchardCommitDomains, OrchardFixedBases, OrchardFixedBasesFull, OrchardHashDomains, @@ -42,20 +50,14 @@ use crate::{ tree::{Anchor, MerkleHashOrchard}, value::{NoteValue, ValueCommitTrapdoor, ValueCommitment}, }; -use halo2_gadgets::{ - ecc::{ - chip::{EccChip, EccConfig}, - FixedPoint, NonIdentityPoint, Point, ScalarFixed, ScalarFixedShort, ScalarVar, - }, - poseidon::{primitives as poseidon, Pow5Chip as PoseidonChip, Pow5Config as PoseidonConfig}, - sinsemilla::{ - chip::{SinsemillaChip, SinsemillaConfig}, - merkle::{ - chip::{MerkleChip, MerkleConfig}, - MerklePath, - }, + +use self::{ + commit_ivk::{CommitIvkChip, CommitIvkConfig}, + gadget::{ + add_chip::{AddChip, AddConfig}, + assign_free_advice, }, - utilities::lookup_range_check::LookupRangeCheckConfig, + note_commit::{NoteCommitChip, NoteCommitConfig}, }; mod commit_ivk; @@ -94,6 +96,7 @@ pub struct Config { commit_ivk_config: CommitIvkConfig, old_note_commit_config: NoteCommitConfig, new_note_commit_config: NoteCommitConfig, + mux_config: MuxConfig, } /// The Orchard Action circuit. @@ -186,6 +189,9 @@ impl plonk::Circuit for Circuit { ) }); + // Multiplexer. + let mux_config = MuxChip::configure(meta, advices[0], advices[1], advices[2], advices[3]); + // Addition of two field elements. let add_config = AddChip::configure(meta, advices[7], advices[8], advices[6]); @@ -312,6 +318,7 @@ impl plonk::Circuit for Circuit { commit_ivk_config, old_note_commit_config, new_note_commit_config, + mux_config, } } @@ -899,7 +906,6 @@ mod tests { use pasta_curves::pallas; use rand::{rngs::OsRng, RngCore}; - use super::{Circuit, Instance, Proof, ProvingKey, VerifyingKey, K}; use crate::note::NoteType; use crate::{ keys::SpendValidatingKey, @@ -908,6 +914,8 @@ mod tests { value::{ValueCommitTrapdoor, ValueCommitment}, }; + use super::{Circuit, Instance, Proof, ProvingKey, VerifyingKey, K}; + fn generate_circuit_instance(mut rng: R) -> (Circuit, Instance) { let (_, fvk, spent_note) = Note::dummy(&mut rng, None); @@ -991,8 +999,8 @@ mod tests { K as usize, &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)), 5024); + assert_eq!(usize::from(circuit_cost.proof_size(2)), 7296); usize::from(circuit_cost.proof_size(instances.len())) }; @@ -1100,7 +1108,7 @@ mod tests { let test_case_bytes = include_bytes!("circuit_proof_test_case.bin"); read_test_case(&test_case_bytes[..]).expect("proof must be valid") }; - assert_eq!(proof.0.len(), 4992); + assert_eq!(proof.0.len(), 5024); assert!(proof.verify(&vk, &[instance]).is_ok()); } diff --git a/src/circuit/gadget.rs b/src/circuit/gadget.rs index 21d24333f..5e2e0ba58 100644 --- a/src/circuit/gadget.rs +++ b/src/circuit/gadget.rs @@ -26,6 +26,7 @@ use halo2_proofs::{ }; pub(in crate::circuit) mod add_chip; +pub(in crate::circuit) mod mux_chip; impl super::Config { pub(super) fn add_chip(&self) -> add_chip::AddChip { diff --git a/src/circuit/gadget/mux_chip.rs b/src/circuit/gadget/mux_chip.rs new file mode 100644 index 000000000..617e4765b --- /dev/null +++ b/src/circuit/gadget/mux_chip.rs @@ -0,0 +1,125 @@ +use halo2_proofs::circuit::Value; +use halo2_proofs::{ + circuit::{AssignedCell, Chip, Layouter}, + plonk::{self, Advice, Column, ConstraintSystem, Constraints, Expression, Selector}, + poly::Rotation, +}; +use pasta_curves::arithmetic::CurveAffine; +use pasta_curves::pallas; + +#[derive(Clone, Debug)] +pub(in crate::circuit) struct MuxConfig { + q_mux: Selector, + switch: Column, + left: Column, + right: Column, + out: Column, +} + +/// A chip implementing a multiplexer on a single row. +/// +/// out = if (switch == 0) { left } else { right } +/// +/// Switch must be constrained to {0, 1} separately. +pub(in crate::circuit) struct MuxChip { + config: MuxConfig, +} + +impl Chip for MuxChip { + type Config = MuxConfig; + type Loaded = (); + + fn config(&self) -> &Self::Config { + &self.config + } + + fn loaded(&self) -> &Self::Loaded { + &() + } +} + +impl MuxChip { + pub(in crate::circuit) fn configure( + meta: &mut ConstraintSystem, + switch: Column, + left: Column, + right: Column, + out: Column, + ) -> MuxConfig { + let q_mux = meta.selector(); + + meta.create_gate("Field element multiplexer", |meta| { + let q_mux = meta.query_selector(q_mux); + let switch = meta.query_advice(switch, Rotation::cur()); + let left = meta.query_advice(left, Rotation::cur()); + let right = meta.query_advice(right, Rotation::cur()); + let out = meta.query_advice(out, Rotation::cur()); + + let one = Expression::Constant(pallas::Base::one()); + let not_switch = one - switch.clone(); + let should_be_zero = not_switch * left + switch * right - out; + + Constraints::with_selector(q_mux, Some(should_be_zero)) + }); + + MuxConfig { + q_mux, + switch, + left, + right, + out, + } + } + + pub(in crate::circuit) fn construct(config: MuxConfig) -> Self { + Self { config } + } +} + +pub trait MuxInstructions { + fn mux( + &self, + layouter: impl Layouter, + switch: &AssignedCell, + left: &AssignedCell, + right: &AssignedCell, + ) -> Result, plonk::Error>; +} + +impl MuxInstructions for MuxChip { + fn mux( + &self, + mut layouter: impl Layouter, + switch: &AssignedCell, + left: &AssignedCell, + right: &AssignedCell, + ) -> Result, plonk::Error> { + layouter.assign_region( + || "mux", + |mut region| { + // Enable the multiplexer gate. + self.config.q_mux.enable(&mut region, 0)?; + + // Copy the inputs into the multiplexer row. + switch.copy_advice(|| "copy switch", &mut region, self.config.switch, 0)?; + left.copy_advice(|| "copy left", &mut region, self.config.left, 0)?; + right.copy_advice(|| "copy right", &mut region, self.config.right, 0)?; + + // Assign the output value into the multiplexer row. + let out_val = compute_mux(switch.value(), left.value(), right.value()); + + region.assign_advice(|| "out", self.config.out, 0, || out_val) + }, + ) + } +} + +fn compute_mux( + switch: Value<&pallas::Base>, + left: Value<&pallas::Base>, + right: Value<&pallas::Base>, +) -> Value { + let one = Value::known(pallas::Base::one()); + let not_switch = one - switch; + not_switch * left + switch * right +} diff --git a/src/circuit_description b/src/circuit_description index 8bb3759ed..e8591029b 100644 --- a/src/circuit_description +++ b/src/circuit_description @@ -7,10 +7,10 @@ PinnedVerificationKey { omega: 0x181b50ad5f32119e31cbd395426d600b7a9b88bcaaa1c24eef28545aada17813, }, cs: PinnedConstraintSystem { - num_fixed_columns: 29, + num_fixed_columns: 30, num_advice_columns: 10, num_instance_columns: 1, - num_selectors: 56, + num_selectors: 57, gates: [ Product( Product( @@ -567,6 +567,147 @@ PinnedVerificationKey { ), ), ), + Sum( + Sum( + Product( + Sum( + Constant( + 0x0000000000000000000000000000000000000000000000000000000000000001, + ), + Negated( + Advice { + query_index: 0, + column_index: 0, + rotation: Rotation( + 0, + ), + }, + ), + ), + Advice { + query_index: 1, + column_index: 1, + rotation: Rotation( + 0, + ), + }, + ), + Product( + Advice { + query_index: 0, + column_index: 0, + rotation: Rotation( + 0, + ), + }, + Advice { + query_index: 2, + column_index: 2, + rotation: Rotation( + 0, + ), + }, + ), + ), + 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, + ), + }, + ), + ), + ), + Sum( + Constant( + 0x0000000000000000000000000000000000000000000000000000000000000004, + ), + Negated( + Fixed { + query_index: 18, + column_index: 18, + rotation: Rotation( + 0, + ), + }, + ), + ), + ), + Sum( + Constant( + 0x0000000000000000000000000000000000000000000000000000000000000005, + ), + Negated( + Fixed { + query_index: 18, + column_index: 18, + rotation: Rotation( + 0, + ), + }, + ), + ), + ), + Sum( + Constant( + 0x0000000000000000000000000000000000000000000000000000000000000006, + ), + Negated( + Fixed { + query_index: 18, + column_index: 18, + rotation: Rotation( + 0, + ), + }, + ), + ), + ), Sum( Sum( Advice { @@ -640,7 +781,7 @@ PinnedVerificationKey { ), Sum( Constant( - 0x0000000000000000000000000000000000000000000000000000000000000004, + 0x0000000000000000000000000000000000000000000000000000000000000003, ), Negated( Fixed { @@ -2913,7 +3054,7 @@ PinnedVerificationKey { ), Sum( Constant( - 0x0000000000000000000000000000000000000000000000000000000000000005, + 0x0000000000000000000000000000000000000000000000000000000000000004, ), Negated( Fixed { @@ -3098,7 +3239,7 @@ PinnedVerificationKey { ), Sum( Constant( - 0x0000000000000000000000000000000000000000000000000000000000000006, + 0x0000000000000000000000000000000000000000000000000000000000000005, ), Negated( Fixed { @@ -3205,7 +3346,7 @@ PinnedVerificationKey { ), Sum( Constant( - 0x0000000000000000000000000000000000000000000000000000000000000006, + 0x0000000000000000000000000000000000000000000000000000000000000005, ), Negated( Fixed { @@ -3312,7 +3453,7 @@ PinnedVerificationKey { ), Sum( Constant( - 0x0000000000000000000000000000000000000000000000000000000000000006, + 0x0000000000000000000000000000000000000000000000000000000000000005, ), Negated( Fixed { @@ -3452,7 +3593,7 @@ PinnedVerificationKey { ), Sum( Constant( - 0x0000000000000000000000000000000000000000000000000000000000000006, + 0x0000000000000000000000000000000000000000000000000000000000000005, ), Negated( Fixed { @@ -3684,7 +3825,7 @@ PinnedVerificationKey { ), Sum( Constant( - 0x0000000000000000000000000000000000000000000000000000000000000006, + 0x0000000000000000000000000000000000000000000000000000000000000005, ), Negated( Fixed { @@ -3853,7 +3994,7 @@ PinnedVerificationKey { ), Sum( Constant( - 0x0000000000000000000000000000000000000000000000000000000000000006, + 0x0000000000000000000000000000000000000000000000000000000000000005, ), Negated( Fixed { @@ -4047,37 +4188,21 @@ PinnedVerificationKey { 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, - ), - }, - ), + Fixed { + query_index: 20, + column_index: 20, + rotation: Rotation( + 0, ), - ), + }, Sum( Constant( 0x0000000000000000000000000000000000000000000000000000000000000002, ), Negated( Fixed { - query_index: 18, - column_index: 18, + query_index: 20, + column_index: 20, rotation: Rotation( 0, ), @@ -4091,8 +4216,8 @@ PinnedVerificationKey { ), Negated( Fixed { - query_index: 18, - column_index: 18, + query_index: 20, + column_index: 20, rotation: Rotation( 0, ), @@ -4106,8 +4231,8 @@ PinnedVerificationKey { ), Negated( Fixed { - query_index: 18, - column_index: 18, + query_index: 20, + column_index: 20, rotation: Rotation( 0, ), @@ -4121,8 +4246,8 @@ PinnedVerificationKey { ), Negated( Fixed { - query_index: 18, - column_index: 18, + query_index: 20, + column_index: 20, rotation: Rotation( 0, ), @@ -4187,37 +4312,21 @@ PinnedVerificationKey { 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, - ), - }, - ), + Fixed { + query_index: 20, + column_index: 20, + rotation: Rotation( + 0, ), - ), + }, Sum( Constant( 0x0000000000000000000000000000000000000000000000000000000000000002, ), Negated( Fixed { - query_index: 18, - column_index: 18, + query_index: 20, + column_index: 20, rotation: Rotation( 0, ), @@ -4231,8 +4340,8 @@ PinnedVerificationKey { ), Negated( Fixed { - query_index: 18, - column_index: 18, + query_index: 20, + column_index: 20, rotation: Rotation( 0, ), @@ -4246,8 +4355,8 @@ PinnedVerificationKey { ), Negated( Fixed { - query_index: 18, - column_index: 18, + query_index: 20, + column_index: 20, rotation: Rotation( 0, ), @@ -4261,8 +4370,8 @@ PinnedVerificationKey { ), Negated( Fixed { - query_index: 18, - column_index: 18, + query_index: 20, + column_index: 20, rotation: Rotation( 0, ), @@ -4419,37 +4528,21 @@ PinnedVerificationKey { 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, - ), - }, - ), + Fixed { + query_index: 20, + column_index: 20, + rotation: Rotation( + 0, ), - ), + }, Sum( Constant( 0x0000000000000000000000000000000000000000000000000000000000000002, ), Negated( Fixed { - query_index: 18, - column_index: 18, + query_index: 20, + column_index: 20, rotation: Rotation( 0, ), @@ -4463,8 +4556,8 @@ PinnedVerificationKey { ), Negated( Fixed { - query_index: 18, - column_index: 18, + query_index: 20, + column_index: 20, rotation: Rotation( 0, ), @@ -4478,8 +4571,8 @@ PinnedVerificationKey { ), Negated( Fixed { - query_index: 18, - column_index: 18, + query_index: 20, + column_index: 20, rotation: Rotation( 0, ), @@ -4493,8 +4586,8 @@ PinnedVerificationKey { ), Negated( Fixed { - query_index: 18, - column_index: 18, + query_index: 20, + column_index: 20, rotation: Rotation( 0, ), @@ -4588,37 +4681,21 @@ PinnedVerificationKey { 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, - ), - }, - ), + Fixed { + query_index: 20, + column_index: 20, + rotation: Rotation( + 0, ), - ), + }, Sum( Constant( 0x0000000000000000000000000000000000000000000000000000000000000002, ), Negated( Fixed { - query_index: 18, - column_index: 18, + query_index: 20, + column_index: 20, rotation: Rotation( 0, ), @@ -4632,8 +4709,8 @@ PinnedVerificationKey { ), Negated( Fixed { - query_index: 18, - column_index: 18, + query_index: 20, + column_index: 20, rotation: Rotation( 0, ), @@ -4647,8 +4724,8 @@ PinnedVerificationKey { ), Negated( Fixed { - query_index: 18, - column_index: 18, + query_index: 20, + column_index: 20, rotation: Rotation( 0, ), @@ -4662,8 +4739,8 @@ PinnedVerificationKey { ), Negated( Fixed { - query_index: 18, - column_index: 18, + query_index: 20, + column_index: 20, rotation: Rotation( 0, ), @@ -4798,7 +4875,7 @@ PinnedVerificationKey { }, Sum( Constant( - 0x0000000000000000000000000000000000000000000000000000000000000002, + 0x0000000000000000000000000000000000000000000000000000000000000001, ), Negated( Fixed { @@ -4944,20 +5021,20 @@ PinnedVerificationKey { Product( Product( Fixed { - query_index: 20, - column_index: 20, + query_index: 21, + column_index: 21, rotation: Rotation( 0, ), }, Sum( Constant( - 0x0000000000000000000000000000000000000000000000000000000000000001, + 0x0000000000000000000000000000000000000000000000000000000000000002, ), Negated( Fixed { - query_index: 20, - column_index: 20, + query_index: 21, + column_index: 21, rotation: Rotation( 0, ), @@ -4971,8 +5048,8 @@ PinnedVerificationKey { ), Negated( Fixed { - query_index: 20, - column_index: 20, + query_index: 21, + column_index: 21, rotation: Rotation( 0, ), @@ -4986,8 +5063,8 @@ PinnedVerificationKey { ), Negated( Fixed { - query_index: 20, - column_index: 20, + query_index: 21, + column_index: 21, rotation: Rotation( 0, ), @@ -5001,8 +5078,8 @@ PinnedVerificationKey { ), Negated( Fixed { - query_index: 20, - column_index: 20, + query_index: 21, + column_index: 21, rotation: Rotation( 0, ), @@ -5035,20 +5112,20 @@ PinnedVerificationKey { Product( Product( Fixed { - query_index: 20, - column_index: 20, + query_index: 21, + column_index: 21, rotation: Rotation( 0, ), }, Sum( Constant( - 0x0000000000000000000000000000000000000000000000000000000000000001, + 0x0000000000000000000000000000000000000000000000000000000000000002, ), Negated( Fixed { - query_index: 20, - column_index: 20, + query_index: 21, + column_index: 21, rotation: Rotation( 0, ), @@ -5062,8 +5139,8 @@ PinnedVerificationKey { ), Negated( Fixed { - query_index: 20, - column_index: 20, + query_index: 21, + column_index: 21, rotation: Rotation( 0, ), @@ -5077,8 +5154,8 @@ PinnedVerificationKey { ), Negated( Fixed { - query_index: 20, - column_index: 20, + query_index: 21, + column_index: 21, rotation: Rotation( 0, ), @@ -5092,8 +5169,8 @@ PinnedVerificationKey { ), Negated( Fixed { - query_index: 20, - column_index: 20, + query_index: 21, + column_index: 21, rotation: Rotation( 0, ), @@ -5126,20 +5203,20 @@ PinnedVerificationKey { Product( Product( Fixed { - query_index: 20, - column_index: 20, + query_index: 21, + column_index: 21, rotation: Rotation( 0, ), }, Sum( Constant( - 0x0000000000000000000000000000000000000000000000000000000000000001, + 0x0000000000000000000000000000000000000000000000000000000000000002, ), Negated( Fixed { - query_index: 20, - column_index: 20, + query_index: 21, + column_index: 21, rotation: Rotation( 0, ), @@ -5153,8 +5230,8 @@ PinnedVerificationKey { ), Negated( Fixed { - query_index: 20, - column_index: 20, + query_index: 21, + column_index: 21, rotation: Rotation( 0, ), @@ -5168,8 +5245,8 @@ PinnedVerificationKey { ), Negated( Fixed { - query_index: 20, - column_index: 20, + query_index: 21, + column_index: 21, rotation: Rotation( 0, ), @@ -5183,8 +5260,8 @@ PinnedVerificationKey { ), Negated( Fixed { - query_index: 20, - column_index: 20, + query_index: 21, + column_index: 21, rotation: Rotation( 0, ), @@ -5250,20 +5327,20 @@ PinnedVerificationKey { Product( Product( Fixed { - query_index: 20, - column_index: 20, + query_index: 21, + column_index: 21, rotation: Rotation( 0, ), }, Sum( Constant( - 0x0000000000000000000000000000000000000000000000000000000000000001, + 0x0000000000000000000000000000000000000000000000000000000000000002, ), Negated( Fixed { - query_index: 20, - column_index: 20, + query_index: 21, + column_index: 21, rotation: Rotation( 0, ), @@ -5277,8 +5354,8 @@ PinnedVerificationKey { ), Negated( Fixed { - query_index: 20, - column_index: 20, + query_index: 21, + column_index: 21, rotation: Rotation( 0, ), @@ -5292,8 +5369,8 @@ PinnedVerificationKey { ), Negated( Fixed { - query_index: 20, - column_index: 20, + query_index: 21, + column_index: 21, rotation: Rotation( 0, ), @@ -5307,8 +5384,8 @@ PinnedVerificationKey { ), Negated( Fixed { - query_index: 20, - column_index: 20, + query_index: 21, + column_index: 21, rotation: Rotation( 0, ), @@ -5466,20 +5543,20 @@ PinnedVerificationKey { Product( Product( Fixed { - query_index: 20, - column_index: 20, + query_index: 21, + column_index: 21, rotation: Rotation( 0, ), }, Sum( Constant( - 0x0000000000000000000000000000000000000000000000000000000000000001, + 0x0000000000000000000000000000000000000000000000000000000000000002, ), Negated( Fixed { - query_index: 20, - column_index: 20, + query_index: 21, + column_index: 21, rotation: Rotation( 0, ), @@ -5493,8 +5570,8 @@ PinnedVerificationKey { ), Negated( Fixed { - query_index: 20, - column_index: 20, + query_index: 21, + column_index: 21, rotation: Rotation( 0, ), @@ -5508,8 +5585,8 @@ PinnedVerificationKey { ), Negated( Fixed { - query_index: 20, - column_index: 20, + query_index: 21, + column_index: 21, rotation: Rotation( 0, ), @@ -5523,8 +5600,8 @@ PinnedVerificationKey { ), Negated( Fixed { - query_index: 20, - column_index: 20, + query_index: 21, + column_index: 21, rotation: Rotation( 0, ), @@ -5619,20 +5696,20 @@ PinnedVerificationKey { Product( Product( Fixed { - query_index: 20, - column_index: 20, + query_index: 21, + column_index: 21, rotation: Rotation( 0, ), }, Sum( Constant( - 0x0000000000000000000000000000000000000000000000000000000000000001, + 0x0000000000000000000000000000000000000000000000000000000000000002, ), Negated( Fixed { - query_index: 20, - column_index: 20, + query_index: 21, + column_index: 21, rotation: Rotation( 0, ), @@ -5646,8 +5723,8 @@ PinnedVerificationKey { ), Negated( Fixed { - query_index: 20, - column_index: 20, + query_index: 21, + column_index: 21, rotation: Rotation( 0, ), @@ -5661,8 +5738,8 @@ PinnedVerificationKey { ), Negated( Fixed { - query_index: 20, - column_index: 20, + query_index: 21, + column_index: 21, rotation: Rotation( 0, ), @@ -5676,8 +5753,8 @@ PinnedVerificationKey { ), Negated( Fixed { - query_index: 20, - column_index: 20, + query_index: 21, + column_index: 21, rotation: Rotation( 0, ), @@ -7351,16 +7428,32 @@ PinnedVerificationKey { Product( Product( Product( - Fixed { - query_index: 21, - column_index: 21, - 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( - 0x0000000000000000000000000000000000000000000000000000000000000002, + 0x0000000000000000000000000000000000000000000000000000000000000003, ), Negated( Fixed { @@ -7375,7 +7468,7 @@ PinnedVerificationKey { ), Sum( Constant( - 0x0000000000000000000000000000000000000000000000000000000000000003, + 0x0000000000000000000000000000000000000000000000000000000000000004, ), Negated( Fixed { @@ -7390,7 +7483,7 @@ PinnedVerificationKey { ), Sum( Constant( - 0x0000000000000000000000000000000000000000000000000000000000000004, + 0x0000000000000000000000000000000000000000000000000000000000000005, ), Negated( Fixed { @@ -7459,16 +7552,32 @@ PinnedVerificationKey { Product( Product( Product( - Fixed { - query_index: 21, - column_index: 21, - 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( - 0x0000000000000000000000000000000000000000000000000000000000000002, + 0x0000000000000000000000000000000000000000000000000000000000000003, ), Negated( Fixed { @@ -7483,7 +7592,7 @@ PinnedVerificationKey { ), Sum( Constant( - 0x0000000000000000000000000000000000000000000000000000000000000003, + 0x0000000000000000000000000000000000000000000000000000000000000004, ), Negated( Fixed { @@ -7498,7 +7607,7 @@ PinnedVerificationKey { ), Sum( Constant( - 0x0000000000000000000000000000000000000000000000000000000000000004, + 0x0000000000000000000000000000000000000000000000000000000000000005, ), Negated( Fixed { @@ -7596,16 +7705,32 @@ PinnedVerificationKey { Product( Product( Product( - Fixed { - query_index: 21, - column_index: 21, - 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( - 0x0000000000000000000000000000000000000000000000000000000000000002, + 0x0000000000000000000000000000000000000000000000000000000000000003, ), Negated( Fixed { @@ -7620,7 +7745,7 @@ PinnedVerificationKey { ), Sum( Constant( - 0x0000000000000000000000000000000000000000000000000000000000000003, + 0x0000000000000000000000000000000000000000000000000000000000000004, ), Negated( Fixed { @@ -7635,7 +7760,7 @@ PinnedVerificationKey { ), Sum( Constant( - 0x0000000000000000000000000000000000000000000000000000000000000004, + 0x0000000000000000000000000000000000000000000000000000000000000005, ), Negated( Fixed { @@ -9481,16 +9606,32 @@ PinnedVerificationKey { Product( Product( Product( - Fixed { - query_index: 21, - column_index: 21, - 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 { @@ -9505,7 +9646,7 @@ PinnedVerificationKey { ), Sum( Constant( - 0x0000000000000000000000000000000000000000000000000000000000000003, + 0x0000000000000000000000000000000000000000000000000000000000000004, ), Negated( Fixed { @@ -9520,7 +9661,7 @@ PinnedVerificationKey { ), Sum( Constant( - 0x0000000000000000000000000000000000000000000000000000000000000004, + 0x0000000000000000000000000000000000000000000000000000000000000005, ), Negated( Fixed { @@ -9561,16 +9702,32 @@ PinnedVerificationKey { Product( Product( Product( - Fixed { - query_index: 21, - column_index: 21, - 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 { @@ -9585,7 +9742,7 @@ PinnedVerificationKey { ), Sum( Constant( - 0x0000000000000000000000000000000000000000000000000000000000000003, + 0x0000000000000000000000000000000000000000000000000000000000000004, ), Negated( Fixed { @@ -9600,7 +9757,7 @@ PinnedVerificationKey { ), Sum( Constant( - 0x0000000000000000000000000000000000000000000000000000000000000004, + 0x0000000000000000000000000000000000000000000000000000000000000005, ), Negated( Fixed { @@ -9641,16 +9798,32 @@ PinnedVerificationKey { Product( Product( Product( - Fixed { - query_index: 21, - column_index: 21, - 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 { @@ -9665,7 +9838,7 @@ PinnedVerificationKey { ), Sum( Constant( - 0x0000000000000000000000000000000000000000000000000000000000000003, + 0x0000000000000000000000000000000000000000000000000000000000000004, ), Negated( Fixed { @@ -9680,7 +9853,7 @@ PinnedVerificationKey { ), Sum( Constant( - 0x0000000000000000000000000000000000000000000000000000000000000004, + 0x0000000000000000000000000000000000000000000000000000000000000005, ), Negated( Fixed { @@ -9734,16 +9907,32 @@ PinnedVerificationKey { Product( Product( Product( - Fixed { - query_index: 21, - column_index: 21, - 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 { @@ -9758,7 +9947,7 @@ PinnedVerificationKey { ), Sum( Constant( - 0x0000000000000000000000000000000000000000000000000000000000000003, + 0x0000000000000000000000000000000000000000000000000000000000000004, ), Negated( Fixed { @@ -9773,7 +9962,7 @@ PinnedVerificationKey { ), Sum( Constant( - 0x0000000000000000000000000000000000000000000000000000000000000004, + 0x0000000000000000000000000000000000000000000000000000000000000005, ), Negated( Fixed { @@ -9818,16 +10007,32 @@ PinnedVerificationKey { Product( Product( Product( - Fixed { - query_index: 21, - column_index: 21, - 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 { @@ -9842,7 +10047,7 @@ PinnedVerificationKey { ), Sum( Constant( - 0x0000000000000000000000000000000000000000000000000000000000000002, + 0x0000000000000000000000000000000000000000000000000000000000000003, ), Negated( Fixed { @@ -9857,7 +10062,7 @@ PinnedVerificationKey { ), Sum( Constant( - 0x0000000000000000000000000000000000000000000000000000000000000004, + 0x0000000000000000000000000000000000000000000000000000000000000005, ), Negated( Fixed { @@ -9891,16 +10096,32 @@ PinnedVerificationKey { Product( Product( Product( - Fixed { - query_index: 21, - column_index: 21, - 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 { @@ -9915,7 +10136,7 @@ PinnedVerificationKey { ), Sum( Constant( - 0x0000000000000000000000000000000000000000000000000000000000000002, + 0x0000000000000000000000000000000000000000000000000000000000000003, ), Negated( Fixed { @@ -9930,7 +10151,7 @@ PinnedVerificationKey { ), Sum( Constant( - 0x0000000000000000000000000000000000000000000000000000000000000004, + 0x0000000000000000000000000000000000000000000000000000000000000005, ), Negated( Fixed { @@ -9980,16 +10201,32 @@ PinnedVerificationKey { Product( Product( Product( - Fixed { - query_index: 21, - column_index: 21, - 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 { @@ -10004,7 +10241,7 @@ PinnedVerificationKey { ), Sum( Constant( - 0x0000000000000000000000000000000000000000000000000000000000000002, + 0x0000000000000000000000000000000000000000000000000000000000000003, ), Negated( Fixed { @@ -10019,7 +10256,7 @@ PinnedVerificationKey { ), Sum( Constant( - 0x0000000000000000000000000000000000000000000000000000000000000004, + 0x0000000000000000000000000000000000000000000000000000000000000005, ), Negated( Fixed { @@ -10097,16 +10334,32 @@ PinnedVerificationKey { Product( Product( Product( - Fixed { - query_index: 21, - column_index: 21, - 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 { @@ -10121,7 +10374,7 @@ PinnedVerificationKey { ), Sum( Constant( - 0x0000000000000000000000000000000000000000000000000000000000000002, + 0x0000000000000000000000000000000000000000000000000000000000000003, ), Negated( Fixed { @@ -10136,7 +10389,7 @@ PinnedVerificationKey { ), Sum( Constant( - 0x0000000000000000000000000000000000000000000000000000000000000004, + 0x0000000000000000000000000000000000000000000000000000000000000005, ), Negated( Fixed { @@ -10170,16 +10423,32 @@ PinnedVerificationKey { Product( Product( Product( - Fixed { - query_index: 21, - column_index: 21, - 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 { @@ -10194,7 +10463,7 @@ PinnedVerificationKey { ), Sum( Constant( - 0x0000000000000000000000000000000000000000000000000000000000000002, + 0x0000000000000000000000000000000000000000000000000000000000000003, ), Negated( Fixed { @@ -10209,7 +10478,7 @@ PinnedVerificationKey { ), Sum( Constant( - 0x0000000000000000000000000000000000000000000000000000000000000004, + 0x0000000000000000000000000000000000000000000000000000000000000005, ), Negated( Fixed { @@ -10282,16 +10551,32 @@ PinnedVerificationKey { Product( Product( Product( - Fixed { - query_index: 21, - column_index: 21, - 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 { @@ -10306,7 +10591,7 @@ PinnedVerificationKey { ), Sum( Constant( - 0x0000000000000000000000000000000000000000000000000000000000000002, + 0x0000000000000000000000000000000000000000000000000000000000000003, ), Negated( Fixed { @@ -10321,7 +10606,7 @@ PinnedVerificationKey { ), Sum( Constant( - 0x0000000000000000000000000000000000000000000000000000000000000004, + 0x0000000000000000000000000000000000000000000000000000000000000005, ), Negated( Fixed { @@ -10362,16 +10647,32 @@ PinnedVerificationKey { Product( Product( Product( - Fixed { - query_index: 21, - column_index: 21, - 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 { @@ -10386,7 +10687,7 @@ PinnedVerificationKey { ), Sum( Constant( - 0x0000000000000000000000000000000000000000000000000000000000000002, + 0x0000000000000000000000000000000000000000000000000000000000000003, ), Negated( Fixed { @@ -10401,7 +10702,7 @@ PinnedVerificationKey { ), Sum( Constant( - 0x0000000000000000000000000000000000000000000000000000000000000004, + 0x0000000000000000000000000000000000000000000000000000000000000005, ), Negated( Fixed { @@ -10449,16 +10750,32 @@ PinnedVerificationKey { Product( Product( Product( - Fixed { - query_index: 21, - column_index: 21, - 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 { @@ -10473,7 +10790,7 @@ PinnedVerificationKey { ), Sum( Constant( - 0x0000000000000000000000000000000000000000000000000000000000000002, + 0x0000000000000000000000000000000000000000000000000000000000000003, ), Negated( Fixed { @@ -10488,7 +10805,7 @@ PinnedVerificationKey { ), Sum( Constant( - 0x0000000000000000000000000000000000000000000000000000000000000004, + 0x0000000000000000000000000000000000000000000000000000000000000005, ), Negated( Fixed { @@ -10551,20 +10868,20 @@ PinnedVerificationKey { Product( Product( Fixed { - query_index: 21, - column_index: 21, + 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, ), @@ -10574,12 +10891,12 @@ PinnedVerificationKey { ), Sum( Constant( - 0x0000000000000000000000000000000000000000000000000000000000000002, + 0x0000000000000000000000000000000000000000000000000000000000000003, ), Negated( Fixed { - query_index: 21, - column_index: 21, + query_index: 24, + column_index: 24, rotation: Rotation( 0, ), @@ -10589,12 +10906,12 @@ PinnedVerificationKey { ), Sum( Constant( - 0x0000000000000000000000000000000000000000000000000000000000000003, + 0x0000000000000000000000000000000000000000000000000000000000000004, ), Negated( Fixed { - query_index: 21, - column_index: 21, + query_index: 24, + column_index: 24, rotation: Rotation( 0, ), @@ -10896,20 +11213,20 @@ PinnedVerificationKey { Product( Product( Fixed { - query_index: 21, - column_index: 21, + 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, ), @@ -10919,12 +11236,12 @@ PinnedVerificationKey { ), Sum( Constant( - 0x0000000000000000000000000000000000000000000000000000000000000002, + 0x0000000000000000000000000000000000000000000000000000000000000003, ), Negated( Fixed { - query_index: 21, - column_index: 21, + query_index: 24, + column_index: 24, rotation: Rotation( 0, ), @@ -10934,12 +11251,12 @@ PinnedVerificationKey { ), Sum( Constant( - 0x0000000000000000000000000000000000000000000000000000000000000003, + 0x0000000000000000000000000000000000000000000000000000000000000004, ), Negated( Fixed { - query_index: 21, - column_index: 21, + query_index: 24, + column_index: 24, rotation: Rotation( 0, ), @@ -11241,20 +11558,20 @@ PinnedVerificationKey { Product( Product( Fixed { - query_index: 21, - column_index: 21, + 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, ), @@ -11264,12 +11581,12 @@ PinnedVerificationKey { ), Sum( Constant( - 0x0000000000000000000000000000000000000000000000000000000000000002, + 0x0000000000000000000000000000000000000000000000000000000000000003, ), Negated( Fixed { - query_index: 21, - column_index: 21, + query_index: 24, + column_index: 24, rotation: Rotation( 0, ), @@ -11279,12 +11596,12 @@ PinnedVerificationKey { ), Sum( Constant( - 0x0000000000000000000000000000000000000000000000000000000000000003, + 0x0000000000000000000000000000000000000000000000000000000000000004, ), Negated( Fixed { - query_index: 21, - column_index: 21, + query_index: 24, + column_index: 24, rotation: Rotation( 0, ), @@ -11594,7 +11911,7 @@ PinnedVerificationKey { }, Sum( Constant( - 0x0000000000000000000000000000000000000000000000000000000000000002, + 0x0000000000000000000000000000000000000000000000000000000000000001, ), Negated( Fixed { @@ -11750,7 +12067,7 @@ PinnedVerificationKey { }, Sum( Constant( - 0x0000000000000000000000000000000000000000000000000000000000000002, + 0x0000000000000000000000000000000000000000000000000000000000000001, ), Negated( Fixed { @@ -12158,7 +12475,7 @@ PinnedVerificationKey { }, Sum( Constant( - 0x0000000000000000000000000000000000000000000000000000000000000002, + 0x0000000000000000000000000000000000000000000000000000000000000001, ), Negated( Fixed { @@ -12314,7 +12631,7 @@ PinnedVerificationKey { }, Sum( Constant( - 0x0000000000000000000000000000000000000000000000000000000000000002, + 0x0000000000000000000000000000000000000000000000000000000000000001, ), Negated( Fixed { @@ -12461,21 +12778,37 @@ PinnedVerificationKey { Product( Product( Product( - Fixed { - query_index: 24, - column_index: 24, - rotation: Rotation( - 0, - ), - }, - Sum( - Constant( - 0x0000000000000000000000000000000000000000000000000000000000000001, - ), - Negated( - Fixed { - query_index: 24, - column_index: 24, + 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( + 0x0000000000000000000000000000000000000000000000000000000000000002, + ), + Negated( + Fixed { + query_index: 21, + column_index: 21, rotation: Rotation( 0, ), @@ -12489,8 +12822,8 @@ PinnedVerificationKey { ), Negated( Fixed { - query_index: 24, - column_index: 24, + query_index: 21, + column_index: 21, rotation: Rotation( 0, ), @@ -12504,8 +12837,8 @@ PinnedVerificationKey { ), Negated( Fixed { - query_index: 24, - column_index: 24, + query_index: 21, + column_index: 21, rotation: Rotation( 0, ), @@ -12545,21 +12878,37 @@ PinnedVerificationKey { Product( Product( Product( - Fixed { - query_index: 24, - column_index: 24, - 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: 24, - column_index: 24, + query_index: 21, + column_index: 21, rotation: Rotation( 0, ), @@ -12573,8 +12922,8 @@ PinnedVerificationKey { ), Negated( Fixed { - query_index: 24, - column_index: 24, + query_index: 21, + column_index: 21, rotation: Rotation( 0, ), @@ -12588,8 +12937,8 @@ PinnedVerificationKey { ), Negated( Fixed { - query_index: 24, - column_index: 24, + query_index: 21, + column_index: 21, rotation: Rotation( 0, ), @@ -12629,21 +12978,37 @@ PinnedVerificationKey { Product( Product( Product( - Fixed { - query_index: 24, - column_index: 24, - 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: 24, - column_index: 24, + query_index: 21, + column_index: 21, rotation: Rotation( 0, ), @@ -12657,8 +13022,8 @@ PinnedVerificationKey { ), Negated( Fixed { - query_index: 24, - column_index: 24, + query_index: 21, + column_index: 21, rotation: Rotation( 0, ), @@ -12672,8 +13037,8 @@ PinnedVerificationKey { ), Negated( Fixed { - query_index: 24, - column_index: 24, + query_index: 21, + column_index: 21, rotation: Rotation( 0, ), @@ -12704,21 +13069,53 @@ PinnedVerificationKey { Product( Product( Product( - Fixed { - query_index: 24, - column_index: 24, - rotation: Rotation( - 0, + 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, + ), + }, + ), + ), + ), Sum( Constant( - 0x0000000000000000000000000000000000000000000000000000000000000001, + 0x0000000000000000000000000000000000000000000000000000000000000004, ), Negated( Fixed { - query_index: 24, - column_index: 24, + query_index: 25, + column_index: 25, rotation: Rotation( 0, ), @@ -12728,12 +13125,12 @@ PinnedVerificationKey { ), Sum( Constant( - 0x0000000000000000000000000000000000000000000000000000000000000002, + 0x0000000000000000000000000000000000000000000000000000000000000005, ), Negated( Fixed { - query_index: 24, - column_index: 24, + query_index: 25, + column_index: 25, rotation: Rotation( 0, ), @@ -12743,12 +13140,12 @@ PinnedVerificationKey { ), Sum( Constant( - 0x0000000000000000000000000000000000000000000000000000000000000004, + 0x0000000000000000000000000000000000000000000000000000000000000006, ), Negated( Fixed { - query_index: 24, - column_index: 24, + query_index: 25, + column_index: 25, rotation: Rotation( 0, ), @@ -13217,7 +13614,7 @@ PinnedVerificationKey { ), Sum( Constant( - 0x0000000000000000000000000000000000000000000000000000000000000003, + 0x0000000000000000000000000000000000000000000000000000000000000004, ), Negated( Fixed { @@ -13326,7 +13723,7 @@ PinnedVerificationKey { ), Sum( Constant( - 0x0000000000000000000000000000000000000000000000000000000000000003, + 0x0000000000000000000000000000000000000000000000000000000000000004, ), Negated( Fixed { @@ -13435,7 +13832,7 @@ PinnedVerificationKey { ), Sum( Constant( - 0x0000000000000000000000000000000000000000000000000000000000000003, + 0x0000000000000000000000000000000000000000000000000000000000000004, ), Negated( Fixed { @@ -13476,53 +13873,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: 24, + column_index: 24, + rotation: Rotation( + 0, ), - ), + }, Sum( Constant( - 0x0000000000000000000000000000000000000000000000000000000000000004, + 0x0000000000000000000000000000000000000000000000000000000000000001, ), Negated( Fixed { - query_index: 25, - column_index: 25, + query_index: 24, + column_index: 24, rotation: Rotation( 0, ), @@ -13532,12 +13897,12 @@ PinnedVerificationKey { ), Sum( Constant( - 0x0000000000000000000000000000000000000000000000000000000000000005, + 0x0000000000000000000000000000000000000000000000000000000000000002, ), Negated( Fixed { - query_index: 25, - column_index: 25, + query_index: 24, + column_index: 24, rotation: Rotation( 0, ), @@ -13547,12 +13912,12 @@ PinnedVerificationKey { ), Sum( Constant( - 0x0000000000000000000000000000000000000000000000000000000000000006, + 0x0000000000000000000000000000000000000000000000000000000000000003, ), Negated( Fixed { - query_index: 25, - column_index: 25, + query_index: 24, + column_index: 24, rotation: Rotation( 0, ), @@ -13597,53 +13962,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: 24, + column_index: 24, + rotation: Rotation( + 0, ), - ), + }, Sum( Constant( - 0x0000000000000000000000000000000000000000000000000000000000000004, + 0x0000000000000000000000000000000000000000000000000000000000000001, ), Negated( Fixed { - query_index: 25, - column_index: 25, + query_index: 24, + column_index: 24, rotation: Rotation( 0, ), @@ -13653,12 +13986,12 @@ PinnedVerificationKey { ), Sum( Constant( - 0x0000000000000000000000000000000000000000000000000000000000000005, + 0x0000000000000000000000000000000000000000000000000000000000000002, ), Negated( Fixed { - query_index: 25, - column_index: 25, + query_index: 24, + column_index: 24, rotation: Rotation( 0, ), @@ -13668,12 +14001,12 @@ PinnedVerificationKey { ), Sum( Constant( - 0x0000000000000000000000000000000000000000000000000000000000000006, + 0x0000000000000000000000000000000000000000000000000000000000000003, ), Negated( Fixed { - query_index: 25, - column_index: 25, + query_index: 24, + column_index: 24, rotation: Rotation( 0, ), @@ -13742,53 +14075,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: 24, + column_index: 24, + rotation: Rotation( + 0, ), - ), + }, Sum( Constant( - 0x0000000000000000000000000000000000000000000000000000000000000004, + 0x0000000000000000000000000000000000000000000000000000000000000001, ), Negated( Fixed { - query_index: 25, - column_index: 25, + query_index: 24, + column_index: 24, rotation: Rotation( 0, ), @@ -13798,12 +14099,12 @@ PinnedVerificationKey { ), Sum( Constant( - 0x0000000000000000000000000000000000000000000000000000000000000005, + 0x0000000000000000000000000000000000000000000000000000000000000002, ), Negated( Fixed { - query_index: 25, - column_index: 25, + query_index: 24, + column_index: 24, rotation: Rotation( 0, ), @@ -13813,12 +14114,12 @@ PinnedVerificationKey { ), Sum( Constant( - 0x0000000000000000000000000000000000000000000000000000000000000006, + 0x0000000000000000000000000000000000000000000000000000000000000003, ), Negated( Fixed { - query_index: 25, - column_index: 25, + query_index: 24, + column_index: 24, rotation: Rotation( 0, ), @@ -13861,53 +14162,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: 24, + column_index: 24, + rotation: Rotation( + 0, ), - ), + }, Sum( Constant( - 0x0000000000000000000000000000000000000000000000000000000000000004, + 0x0000000000000000000000000000000000000000000000000000000000000001, ), Negated( Fixed { - query_index: 25, - column_index: 25, + query_index: 24, + column_index: 24, rotation: Rotation( 0, ), @@ -13917,12 +14186,12 @@ PinnedVerificationKey { ), Sum( Constant( - 0x0000000000000000000000000000000000000000000000000000000000000005, + 0x0000000000000000000000000000000000000000000000000000000000000002, ), Negated( Fixed { - query_index: 25, - column_index: 25, + query_index: 24, + column_index: 24, rotation: Rotation( 0, ), @@ -13932,12 +14201,12 @@ PinnedVerificationKey { ), Sum( Constant( - 0x0000000000000000000000000000000000000000000000000000000000000006, + 0x0000000000000000000000000000000000000000000000000000000000000003, ), Negated( Fixed { - query_index: 25, - column_index: 25, + query_index: 24, + column_index: 24, rotation: Rotation( 0, ), @@ -13983,20 +14252,20 @@ PinnedVerificationKey { Product( Product( Fixed { - query_index: 25, - column_index: 25, + query_index: 26, + column_index: 26, rotation: Rotation( 0, ), }, Sum( Constant( - 0x0000000000000000000000000000000000000000000000000000000000000001, + 0x0000000000000000000000000000000000000000000000000000000000000002, ), Negated( Fixed { - query_index: 25, - column_index: 25, + query_index: 26, + column_index: 26, rotation: Rotation( 0, ), @@ -14010,8 +14279,8 @@ PinnedVerificationKey { ), Negated( Fixed { - query_index: 25, - column_index: 25, + query_index: 26, + column_index: 26, rotation: Rotation( 0, ), @@ -14025,8 +14294,8 @@ PinnedVerificationKey { ), Negated( Fixed { - query_index: 25, - column_index: 25, + query_index: 26, + column_index: 26, rotation: Rotation( 0, ), @@ -14040,8 +14309,8 @@ PinnedVerificationKey { ), Negated( Fixed { - query_index: 25, - column_index: 25, + query_index: 26, + column_index: 26, rotation: Rotation( 0, ), @@ -14055,8 +14324,8 @@ PinnedVerificationKey { ), Negated( Fixed { - query_index: 25, - column_index: 25, + query_index: 26, + column_index: 26, rotation: Rotation( 0, ), @@ -14488,37 +14757,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: 25, + column_index: 25, + rotation: Rotation( + 0, ), - ), + }, Sum( Constant( - 0x0000000000000000000000000000000000000000000000000000000000000003, + 0x0000000000000000000000000000000000000000000000000000000000000001, ), Negated( Fixed { - query_index: 26, - column_index: 26, + query_index: 25, + column_index: 25, rotation: Rotation( 0, ), @@ -14528,12 +14781,12 @@ PinnedVerificationKey { ), Sum( Constant( - 0x0000000000000000000000000000000000000000000000000000000000000004, + 0x0000000000000000000000000000000000000000000000000000000000000003, ), Negated( Fixed { - query_index: 26, - column_index: 26, + query_index: 25, + column_index: 25, rotation: Rotation( 0, ), @@ -14543,12 +14796,12 @@ PinnedVerificationKey { ), Sum( Constant( - 0x0000000000000000000000000000000000000000000000000000000000000005, + 0x0000000000000000000000000000000000000000000000000000000000000004, ), Negated( Fixed { - query_index: 26, - column_index: 26, + query_index: 25, + column_index: 25, rotation: Rotation( 0, ), @@ -14558,12 +14811,12 @@ PinnedVerificationKey { ), Sum( Constant( - 0x0000000000000000000000000000000000000000000000000000000000000006, + 0x0000000000000000000000000000000000000000000000000000000000000005, ), Negated( Fixed { - query_index: 26, - column_index: 26, + query_index: 25, + column_index: 25, rotation: Rotation( 0, ), @@ -14573,12 +14826,12 @@ PinnedVerificationKey { ), Sum( Constant( - 0x0000000000000000000000000000000000000000000000000000000000000007, + 0x0000000000000000000000000000000000000000000000000000000000000006, ), Negated( Fixed { - query_index: 26, - column_index: 26, + query_index: 25, + column_index: 25, rotation: Rotation( 0, ), @@ -14645,37 +14898,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: 25, + column_index: 25, + rotation: Rotation( + 0, ), - ), + }, Sum( Constant( - 0x0000000000000000000000000000000000000000000000000000000000000003, + 0x0000000000000000000000000000000000000000000000000000000000000001, ), Negated( Fixed { - query_index: 26, - column_index: 26, + query_index: 25, + column_index: 25, rotation: Rotation( 0, ), @@ -14685,12 +14922,12 @@ PinnedVerificationKey { ), Sum( Constant( - 0x0000000000000000000000000000000000000000000000000000000000000004, + 0x0000000000000000000000000000000000000000000000000000000000000003, ), Negated( Fixed { - query_index: 26, - column_index: 26, + query_index: 25, + column_index: 25, rotation: Rotation( 0, ), @@ -14700,12 +14937,12 @@ PinnedVerificationKey { ), Sum( Constant( - 0x0000000000000000000000000000000000000000000000000000000000000005, + 0x0000000000000000000000000000000000000000000000000000000000000004, ), Negated( Fixed { - query_index: 26, - column_index: 26, + query_index: 25, + column_index: 25, rotation: Rotation( 0, ), @@ -14715,12 +14952,12 @@ PinnedVerificationKey { ), Sum( Constant( - 0x0000000000000000000000000000000000000000000000000000000000000006, + 0x0000000000000000000000000000000000000000000000000000000000000005, ), Negated( Fixed { - query_index: 26, - column_index: 26, + query_index: 25, + column_index: 25, rotation: Rotation( 0, ), @@ -14730,12 +14967,12 @@ PinnedVerificationKey { ), Sum( Constant( - 0x0000000000000000000000000000000000000000000000000000000000000007, + 0x0000000000000000000000000000000000000000000000000000000000000006, ), Negated( Fixed { - query_index: 26, - column_index: 26, + query_index: 25, + column_index: 25, rotation: Rotation( 0, ), @@ -14802,37 +15039,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: 25, + column_index: 25, + rotation: Rotation( + 0, ), - ), + }, Sum( Constant( - 0x0000000000000000000000000000000000000000000000000000000000000003, + 0x0000000000000000000000000000000000000000000000000000000000000001, ), Negated( Fixed { - query_index: 26, - column_index: 26, + query_index: 25, + column_index: 25, rotation: Rotation( 0, ), @@ -14842,12 +15063,12 @@ PinnedVerificationKey { ), Sum( Constant( - 0x0000000000000000000000000000000000000000000000000000000000000004, + 0x0000000000000000000000000000000000000000000000000000000000000003, ), Negated( Fixed { - query_index: 26, - column_index: 26, + query_index: 25, + column_index: 25, rotation: Rotation( 0, ), @@ -14857,12 +15078,12 @@ PinnedVerificationKey { ), Sum( Constant( - 0x0000000000000000000000000000000000000000000000000000000000000005, + 0x0000000000000000000000000000000000000000000000000000000000000004, ), Negated( Fixed { - query_index: 26, - column_index: 26, + query_index: 25, + column_index: 25, rotation: Rotation( 0, ), @@ -14872,12 +15093,12 @@ PinnedVerificationKey { ), Sum( Constant( - 0x0000000000000000000000000000000000000000000000000000000000000006, + 0x0000000000000000000000000000000000000000000000000000000000000005, ), Negated( Fixed { - query_index: 26, - column_index: 26, + query_index: 25, + column_index: 25, rotation: Rotation( 0, ), @@ -14887,12 +15108,12 @@ PinnedVerificationKey { ), Sum( Constant( - 0x0000000000000000000000000000000000000000000000000000000000000007, + 0x0000000000000000000000000000000000000000000000000000000000000006, ), Negated( Fixed { - query_index: 26, - column_index: 26, + query_index: 25, + column_index: 25, rotation: Rotation( 0, ), @@ -14930,37 +15151,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: 25, + column_index: 25, + rotation: Rotation( + 0, ), - ), + }, Sum( Constant( - 0x0000000000000000000000000000000000000000000000000000000000000003, + 0x0000000000000000000000000000000000000000000000000000000000000001, ), Negated( Fixed { - query_index: 26, - column_index: 26, + query_index: 25, + column_index: 25, rotation: Rotation( 0, ), @@ -14970,12 +15175,12 @@ PinnedVerificationKey { ), Sum( Constant( - 0x0000000000000000000000000000000000000000000000000000000000000004, + 0x0000000000000000000000000000000000000000000000000000000000000002, ), Negated( Fixed { - query_index: 26, - column_index: 26, + query_index: 25, + column_index: 25, rotation: Rotation( 0, ), @@ -14985,12 +15190,12 @@ PinnedVerificationKey { ), Sum( Constant( - 0x0000000000000000000000000000000000000000000000000000000000000005, + 0x0000000000000000000000000000000000000000000000000000000000000004, ), Negated( Fixed { - query_index: 26, - column_index: 26, + query_index: 25, + column_index: 25, rotation: Rotation( 0, ), @@ -15000,12 +15205,12 @@ PinnedVerificationKey { ), Sum( Constant( - 0x0000000000000000000000000000000000000000000000000000000000000006, + 0x0000000000000000000000000000000000000000000000000000000000000005, ), Negated( Fixed { - query_index: 26, - column_index: 26, + query_index: 25, + column_index: 25, rotation: Rotation( 0, ), @@ -15015,12 +15220,12 @@ PinnedVerificationKey { ), Sum( Constant( - 0x0000000000000000000000000000000000000000000000000000000000000007, + 0x0000000000000000000000000000000000000000000000000000000000000006, ), Negated( Fixed { - query_index: 26, - column_index: 26, + query_index: 25, + column_index: 25, rotation: Rotation( 0, ), @@ -15067,37 +15272,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: 25, + column_index: 25, + rotation: Rotation( + 0, ), - ), + }, Sum( Constant( - 0x0000000000000000000000000000000000000000000000000000000000000003, + 0x0000000000000000000000000000000000000000000000000000000000000001, ), Negated( Fixed { - query_index: 26, - column_index: 26, + query_index: 25, + column_index: 25, rotation: Rotation( 0, ), @@ -15107,12 +15296,12 @@ PinnedVerificationKey { ), Sum( Constant( - 0x0000000000000000000000000000000000000000000000000000000000000004, + 0x0000000000000000000000000000000000000000000000000000000000000002, ), Negated( Fixed { - query_index: 26, - column_index: 26, + query_index: 25, + column_index: 25, rotation: Rotation( 0, ), @@ -15122,12 +15311,12 @@ PinnedVerificationKey { ), Sum( Constant( - 0x0000000000000000000000000000000000000000000000000000000000000005, + 0x0000000000000000000000000000000000000000000000000000000000000004, ), Negated( Fixed { - query_index: 26, - column_index: 26, + query_index: 25, + column_index: 25, rotation: Rotation( 0, ), @@ -15137,12 +15326,12 @@ PinnedVerificationKey { ), Sum( Constant( - 0x0000000000000000000000000000000000000000000000000000000000000006, + 0x0000000000000000000000000000000000000000000000000000000000000005, ), Negated( Fixed { - query_index: 26, - column_index: 26, + query_index: 25, + column_index: 25, rotation: Rotation( 0, ), @@ -15152,12 +15341,12 @@ PinnedVerificationKey { ), Sum( Constant( - 0x0000000000000000000000000000000000000000000000000000000000000007, + 0x0000000000000000000000000000000000000000000000000000000000000006, ), Negated( Fixed { - query_index: 26, - column_index: 26, + query_index: 25, + column_index: 25, rotation: Rotation( 0, ), @@ -15228,37 +15417,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: 25, + column_index: 25, + rotation: Rotation( + 0, ), - ), + }, Sum( Constant( - 0x0000000000000000000000000000000000000000000000000000000000000003, + 0x0000000000000000000000000000000000000000000000000000000000000001, ), Negated( Fixed { - query_index: 26, - column_index: 26, + query_index: 25, + column_index: 25, rotation: Rotation( 0, ), @@ -15268,12 +15441,12 @@ PinnedVerificationKey { ), Sum( Constant( - 0x0000000000000000000000000000000000000000000000000000000000000004, + 0x0000000000000000000000000000000000000000000000000000000000000002, ), Negated( Fixed { - query_index: 26, - column_index: 26, + query_index: 25, + column_index: 25, rotation: Rotation( 0, ), @@ -15283,12 +15456,12 @@ PinnedVerificationKey { ), Sum( Constant( - 0x0000000000000000000000000000000000000000000000000000000000000005, + 0x0000000000000000000000000000000000000000000000000000000000000004, ), Negated( Fixed { - query_index: 26, - column_index: 26, + query_index: 25, + column_index: 25, rotation: Rotation( 0, ), @@ -15298,12 +15471,12 @@ PinnedVerificationKey { ), Sum( Constant( - 0x0000000000000000000000000000000000000000000000000000000000000006, + 0x0000000000000000000000000000000000000000000000000000000000000005, ), Negated( Fixed { - query_index: 26, - column_index: 26, + query_index: 25, + column_index: 25, rotation: Rotation( 0, ), @@ -15313,12 +15486,12 @@ PinnedVerificationKey { ), Sum( Constant( - 0x0000000000000000000000000000000000000000000000000000000000000007, + 0x0000000000000000000000000000000000000000000000000000000000000006, ), Negated( Fixed { - query_index: 26, - column_index: 26, + query_index: 25, + column_index: 25, rotation: Rotation( 0, ), @@ -15363,37 +15536,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: 25, + column_index: 25, + rotation: Rotation( + 0, ), - ), + }, Sum( Constant( - 0x0000000000000000000000000000000000000000000000000000000000000003, + 0x0000000000000000000000000000000000000000000000000000000000000001, ), Negated( Fixed { - query_index: 26, - column_index: 26, + query_index: 25, + column_index: 25, rotation: Rotation( 0, ), @@ -15403,12 +15560,12 @@ PinnedVerificationKey { ), Sum( Constant( - 0x0000000000000000000000000000000000000000000000000000000000000004, + 0x0000000000000000000000000000000000000000000000000000000000000002, ), Negated( Fixed { - query_index: 26, - column_index: 26, + query_index: 25, + column_index: 25, rotation: Rotation( 0, ), @@ -15418,12 +15575,12 @@ PinnedVerificationKey { ), Sum( Constant( - 0x0000000000000000000000000000000000000000000000000000000000000005, + 0x0000000000000000000000000000000000000000000000000000000000000004, ), Negated( Fixed { - query_index: 26, - column_index: 26, + query_index: 25, + column_index: 25, rotation: Rotation( 0, ), @@ -15433,12 +15590,12 @@ PinnedVerificationKey { ), Sum( Constant( - 0x0000000000000000000000000000000000000000000000000000000000000006, + 0x0000000000000000000000000000000000000000000000000000000000000005, ), Negated( Fixed { - query_index: 26, - column_index: 26, + query_index: 25, + column_index: 25, rotation: Rotation( 0, ), @@ -15448,12 +15605,12 @@ PinnedVerificationKey { ), Sum( Constant( - 0x0000000000000000000000000000000000000000000000000000000000000007, + 0x0000000000000000000000000000000000000000000000000000000000000006, ), Negated( Fixed { - query_index: 26, - column_index: 26, + query_index: 25, + column_index: 25, rotation: Rotation( 0, ), @@ -15537,7 +15694,7 @@ PinnedVerificationKey { ), Sum( Constant( - 0x0000000000000000000000000000000000000000000000000000000000000004, + 0x0000000000000000000000000000000000000000000000000000000000000003, ), Negated( Fixed { @@ -15649,7 +15806,7 @@ PinnedVerificationKey { ), Sum( Constant( - 0x0000000000000000000000000000000000000000000000000000000000000004, + 0x0000000000000000000000000000000000000000000000000000000000000003, ), Negated( Fixed { @@ -15761,7 +15918,7 @@ PinnedVerificationKey { ), Sum( Constant( - 0x0000000000000000000000000000000000000000000000000000000000000004, + 0x0000000000000000000000000000000000000000000000000000000000000003, ), Negated( Fixed { @@ -15892,7 +16049,7 @@ PinnedVerificationKey { ), Sum( Constant( - 0x0000000000000000000000000000000000000000000000000000000000000004, + 0x0000000000000000000000000000000000000000000000000000000000000003, ), Negated( Fixed { @@ -16011,7 +16168,7 @@ PinnedVerificationKey { ), Sum( Constant( - 0x0000000000000000000000000000000000000000000000000000000000000004, + 0x0000000000000000000000000000000000000000000000000000000000000003, ), Negated( Fixed { @@ -16142,7 +16299,7 @@ PinnedVerificationKey { ), Sum( Constant( - 0x0000000000000000000000000000000000000000000000000000000000000004, + 0x0000000000000000000000000000000000000000000000000000000000000003, ), Negated( Fixed { @@ -16285,7 +16442,7 @@ PinnedVerificationKey { ), Sum( Constant( - 0x0000000000000000000000000000000000000000000000000000000000000004, + 0x0000000000000000000000000000000000000000000000000000000000000003, ), Negated( Fixed { @@ -16390,7 +16547,7 @@ PinnedVerificationKey { ), Sum( Constant( - 0x0000000000000000000000000000000000000000000000000000000000000004, + 0x0000000000000000000000000000000000000000000000000000000000000003, ), Negated( Fixed { @@ -16495,7 +16652,7 @@ PinnedVerificationKey { ), Sum( Constant( - 0x0000000000000000000000000000000000000000000000000000000000000004, + 0x0000000000000000000000000000000000000000000000000000000000000003, ), Negated( Fixed { @@ -16614,7 +16771,7 @@ PinnedVerificationKey { ), Sum( Constant( - 0x0000000000000000000000000000000000000000000000000000000000000004, + 0x0000000000000000000000000000000000000000000000000000000000000003, ), Negated( Fixed { @@ -16719,7 +16876,7 @@ PinnedVerificationKey { ), Sum( Constant( - 0x0000000000000000000000000000000000000000000000000000000000000004, + 0x0000000000000000000000000000000000000000000000000000000000000003, ), Negated( Fixed { @@ -16824,7 +16981,7 @@ PinnedVerificationKey { ), Sum( Constant( - 0x0000000000000000000000000000000000000000000000000000000000000004, + 0x0000000000000000000000000000000000000000000000000000000000000003, ), Negated( Fixed { @@ -16929,7 +17086,7 @@ PinnedVerificationKey { ), Sum( Constant( - 0x0000000000000000000000000000000000000000000000000000000000000004, + 0x0000000000000000000000000000000000000000000000000000000000000003, ), Negated( Fixed { @@ -17060,7 +17217,7 @@ PinnedVerificationKey { ), Sum( Constant( - 0x0000000000000000000000000000000000000000000000000000000000000004, + 0x0000000000000000000000000000000000000000000000000000000000000003, ), Negated( Fixed { @@ -17180,7 +17337,7 @@ PinnedVerificationKey { ), Sum( Constant( - 0x0000000000000000000000000000000000000000000000000000000000000005, + 0x0000000000000000000000000000000000000000000000000000000000000004, ), Negated( Fixed { @@ -17292,7 +17449,7 @@ PinnedVerificationKey { ), Sum( Constant( - 0x0000000000000000000000000000000000000000000000000000000000000005, + 0x0000000000000000000000000000000000000000000000000000000000000004, ), Negated( Fixed { @@ -17404,7 +17561,7 @@ PinnedVerificationKey { ), Sum( Constant( - 0x0000000000000000000000000000000000000000000000000000000000000005, + 0x0000000000000000000000000000000000000000000000000000000000000004, ), Negated( Fixed { @@ -17562,7 +17719,7 @@ PinnedVerificationKey { ), Sum( Constant( - 0x0000000000000000000000000000000000000000000000000000000000000006, + 0x0000000000000000000000000000000000000000000000000000000000000005, ), Negated( Fixed { @@ -17674,7 +17831,7 @@ PinnedVerificationKey { ), Sum( Constant( - 0x0000000000000000000000000000000000000000000000000000000000000006, + 0x0000000000000000000000000000000000000000000000000000000000000005, ), Negated( Fixed { @@ -17786,7 +17943,7 @@ PinnedVerificationKey { ), Sum( Constant( - 0x0000000000000000000000000000000000000000000000000000000000000006, + 0x0000000000000000000000000000000000000000000000000000000000000005, ), Negated( Fixed { @@ -17861,8 +18018,8 @@ PinnedVerificationKey { Product( Product( Fixed { - query_index: 25, - column_index: 25, + query_index: 26, + column_index: 26, rotation: Rotation( 0, ), @@ -17873,8 +18030,8 @@ PinnedVerificationKey { ), Negated( Fixed { - query_index: 25, - column_index: 25, + query_index: 26, + column_index: 26, rotation: Rotation( 0, ), @@ -17884,12 +18041,12 @@ PinnedVerificationKey { ), Sum( Constant( - 0x0000000000000000000000000000000000000000000000000000000000000002, + 0x0000000000000000000000000000000000000000000000000000000000000003, ), Negated( Fixed { - query_index: 25, - column_index: 25, + query_index: 26, + column_index: 26, rotation: Rotation( 0, ), @@ -17899,12 +18056,12 @@ PinnedVerificationKey { ), Sum( Constant( - 0x0000000000000000000000000000000000000000000000000000000000000003, + 0x0000000000000000000000000000000000000000000000000000000000000004, ), Negated( Fixed { - query_index: 25, - column_index: 25, + query_index: 26, + column_index: 26, rotation: Rotation( 0, ), @@ -17914,12 +18071,12 @@ PinnedVerificationKey { ), Sum( Constant( - 0x0000000000000000000000000000000000000000000000000000000000000004, + 0x0000000000000000000000000000000000000000000000000000000000000005, ), Negated( Fixed { - query_index: 25, - column_index: 25, + query_index: 26, + column_index: 26, rotation: Rotation( 0, ), @@ -17929,12 +18086,12 @@ PinnedVerificationKey { ), Sum( Constant( - 0x0000000000000000000000000000000000000000000000000000000000000005, + 0x0000000000000000000000000000000000000000000000000000000000000006, ), Negated( Fixed { - query_index: 25, - column_index: 25, + query_index: 26, + column_index: 26, rotation: Rotation( 0, ), @@ -17979,32 +18136,16 @@ 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: 26, + column_index: 26, + rotation: Rotation( + 0, ), - ), + }, Sum( Constant( - 0x0000000000000000000000000000000000000000000000000000000000000002, + 0x0000000000000000000000000000000000000000000000000000000000000001, ), Negated( Fixed { @@ -18019,7 +18160,7 @@ PinnedVerificationKey { ), Sum( Constant( - 0x0000000000000000000000000000000000000000000000000000000000000004, + 0x0000000000000000000000000000000000000000000000000000000000000002, ), Negated( Fixed { @@ -18034,7 +18175,7 @@ PinnedVerificationKey { ), Sum( Constant( - 0x0000000000000000000000000000000000000000000000000000000000000005, + 0x0000000000000000000000000000000000000000000000000000000000000004, ), Negated( Fixed { @@ -18049,7 +18190,7 @@ PinnedVerificationKey { ), Sum( Constant( - 0x0000000000000000000000000000000000000000000000000000000000000006, + 0x0000000000000000000000000000000000000000000000000000000000000005, ), Negated( Fixed { @@ -18064,7 +18205,7 @@ PinnedVerificationKey { ), Sum( Constant( - 0x0000000000000000000000000000000000000000000000000000000000000007, + 0x0000000000000000000000000000000000000000000000000000000000000006, ), Negated( Fixed { @@ -18107,32 +18248,16 @@ 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: 26, + column_index: 26, + rotation: Rotation( + 0, ), - ), + }, Sum( Constant( - 0x0000000000000000000000000000000000000000000000000000000000000002, + 0x0000000000000000000000000000000000000000000000000000000000000001, ), Negated( Fixed { @@ -18147,7 +18272,7 @@ PinnedVerificationKey { ), Sum( Constant( - 0x0000000000000000000000000000000000000000000000000000000000000004, + 0x0000000000000000000000000000000000000000000000000000000000000002, ), Negated( Fixed { @@ -18162,7 +18287,7 @@ PinnedVerificationKey { ), Sum( Constant( - 0x0000000000000000000000000000000000000000000000000000000000000005, + 0x0000000000000000000000000000000000000000000000000000000000000004, ), Negated( Fixed { @@ -18177,7 +18302,7 @@ PinnedVerificationKey { ), Sum( Constant( - 0x0000000000000000000000000000000000000000000000000000000000000006, + 0x0000000000000000000000000000000000000000000000000000000000000005, ), Negated( Fixed { @@ -18192,7 +18317,7 @@ PinnedVerificationKey { ), Sum( Constant( - 0x0000000000000000000000000000000000000000000000000000000000000007, + 0x0000000000000000000000000000000000000000000000000000000000000006, ), Negated( Fixed { @@ -18254,32 +18379,16 @@ 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: 26, + column_index: 26, + rotation: Rotation( + 0, ), - ), + }, Sum( Constant( - 0x0000000000000000000000000000000000000000000000000000000000000002, + 0x0000000000000000000000000000000000000000000000000000000000000001, ), Negated( Fixed { @@ -18294,7 +18403,7 @@ PinnedVerificationKey { ), Sum( Constant( - 0x0000000000000000000000000000000000000000000000000000000000000003, + 0x0000000000000000000000000000000000000000000000000000000000000002, ), Negated( Fixed { @@ -18309,7 +18418,7 @@ PinnedVerificationKey { ), Sum( Constant( - 0x0000000000000000000000000000000000000000000000000000000000000005, + 0x0000000000000000000000000000000000000000000000000000000000000003, ), Negated( Fixed { @@ -18324,7 +18433,7 @@ PinnedVerificationKey { ), Sum( Constant( - 0x0000000000000000000000000000000000000000000000000000000000000006, + 0x0000000000000000000000000000000000000000000000000000000000000005, ), Negated( Fixed { @@ -18339,7 +18448,7 @@ PinnedVerificationKey { ), Sum( Constant( - 0x0000000000000000000000000000000000000000000000000000000000000007, + 0x0000000000000000000000000000000000000000000000000000000000000006, ), Negated( Fixed { @@ -18382,32 +18491,16 @@ 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: 26, + column_index: 26, + rotation: Rotation( + 0, ), - ), + }, Sum( Constant( - 0x0000000000000000000000000000000000000000000000000000000000000002, + 0x0000000000000000000000000000000000000000000000000000000000000001, ), Negated( Fixed { @@ -18422,7 +18515,7 @@ PinnedVerificationKey { ), Sum( Constant( - 0x0000000000000000000000000000000000000000000000000000000000000003, + 0x0000000000000000000000000000000000000000000000000000000000000002, ), Negated( Fixed { @@ -18437,7 +18530,7 @@ PinnedVerificationKey { ), Sum( Constant( - 0x0000000000000000000000000000000000000000000000000000000000000005, + 0x0000000000000000000000000000000000000000000000000000000000000003, ), Negated( Fixed { @@ -18452,7 +18545,7 @@ PinnedVerificationKey { ), Sum( Constant( - 0x0000000000000000000000000000000000000000000000000000000000000006, + 0x0000000000000000000000000000000000000000000000000000000000000005, ), Negated( Fixed { @@ -18467,7 +18560,7 @@ PinnedVerificationKey { ), Sum( Constant( - 0x0000000000000000000000000000000000000000000000000000000000000007, + 0x0000000000000000000000000000000000000000000000000000000000000006, ), Negated( Fixed { @@ -18517,32 +18610,16 @@ 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: 26, + column_index: 26, + rotation: Rotation( + 0, ), - ), + }, Sum( Constant( - 0x0000000000000000000000000000000000000000000000000000000000000002, + 0x0000000000000000000000000000000000000000000000000000000000000001, ), Negated( Fixed { @@ -18557,7 +18634,7 @@ PinnedVerificationKey { ), Sum( Constant( - 0x0000000000000000000000000000000000000000000000000000000000000003, + 0x0000000000000000000000000000000000000000000000000000000000000002, ), Negated( Fixed { @@ -18572,7 +18649,7 @@ PinnedVerificationKey { ), Sum( Constant( - 0x0000000000000000000000000000000000000000000000000000000000000004, + 0x0000000000000000000000000000000000000000000000000000000000000003, ), Negated( Fixed { @@ -18587,7 +18664,7 @@ PinnedVerificationKey { ), Sum( Constant( - 0x0000000000000000000000000000000000000000000000000000000000000006, + 0x0000000000000000000000000000000000000000000000000000000000000004, ), Negated( Fixed { @@ -18602,7 +18679,7 @@ PinnedVerificationKey { ), Sum( Constant( - 0x0000000000000000000000000000000000000000000000000000000000000007, + 0x0000000000000000000000000000000000000000000000000000000000000006, ), Negated( Fixed { @@ -18664,32 +18741,16 @@ 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: 26, + column_index: 26, + rotation: Rotation( + 0, ), - ), + }, Sum( Constant( - 0x0000000000000000000000000000000000000000000000000000000000000002, + 0x0000000000000000000000000000000000000000000000000000000000000001, ), Negated( Fixed { @@ -18704,7 +18765,7 @@ PinnedVerificationKey { ), Sum( Constant( - 0x0000000000000000000000000000000000000000000000000000000000000003, + 0x0000000000000000000000000000000000000000000000000000000000000002, ), Negated( Fixed { @@ -18719,7 +18780,7 @@ PinnedVerificationKey { ), Sum( Constant( - 0x0000000000000000000000000000000000000000000000000000000000000004, + 0x0000000000000000000000000000000000000000000000000000000000000003, ), Negated( Fixed { @@ -18734,7 +18795,7 @@ PinnedVerificationKey { ), Sum( Constant( - 0x0000000000000000000000000000000000000000000000000000000000000006, + 0x0000000000000000000000000000000000000000000000000000000000000004, ), Negated( Fixed { @@ -18749,7 +18810,7 @@ PinnedVerificationKey { ), Sum( Constant( - 0x0000000000000000000000000000000000000000000000000000000000000007, + 0x0000000000000000000000000000000000000000000000000000000000000006, ), Negated( Fixed { @@ -18799,32 +18860,16 @@ 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: 26, + column_index: 26, + rotation: Rotation( + 0, ), - ), + }, Sum( Constant( - 0x0000000000000000000000000000000000000000000000000000000000000002, + 0x0000000000000000000000000000000000000000000000000000000000000001, ), Negated( Fixed { @@ -18839,7 +18884,7 @@ PinnedVerificationKey { ), Sum( Constant( - 0x0000000000000000000000000000000000000000000000000000000000000003, + 0x0000000000000000000000000000000000000000000000000000000000000002, ), Negated( Fixed { @@ -18854,7 +18899,7 @@ PinnedVerificationKey { ), Sum( Constant( - 0x0000000000000000000000000000000000000000000000000000000000000004, + 0x0000000000000000000000000000000000000000000000000000000000000003, ), Negated( Fixed { @@ -18869,7 +18914,7 @@ PinnedVerificationKey { ), Sum( Constant( - 0x0000000000000000000000000000000000000000000000000000000000000006, + 0x0000000000000000000000000000000000000000000000000000000000000004, ), Negated( Fixed { @@ -18884,7 +18929,7 @@ PinnedVerificationKey { ), Sum( Constant( - 0x0000000000000000000000000000000000000000000000000000000000000007, + 0x0000000000000000000000000000000000000000000000000000000000000006, ), Negated( Fixed { @@ -18920,32 +18965,16 @@ 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: 26, + column_index: 26, + rotation: Rotation( + 0, ), - ), + }, Sum( Constant( - 0x0000000000000000000000000000000000000000000000000000000000000002, + 0x0000000000000000000000000000000000000000000000000000000000000001, ), Negated( Fixed { @@ -18960,7 +18989,7 @@ PinnedVerificationKey { ), Sum( Constant( - 0x0000000000000000000000000000000000000000000000000000000000000003, + 0x0000000000000000000000000000000000000000000000000000000000000002, ), Negated( Fixed { @@ -18975,7 +19004,7 @@ PinnedVerificationKey { ), Sum( Constant( - 0x0000000000000000000000000000000000000000000000000000000000000004, + 0x0000000000000000000000000000000000000000000000000000000000000003, ), Negated( Fixed { @@ -18990,7 +19019,7 @@ PinnedVerificationKey { ), Sum( Constant( - 0x0000000000000000000000000000000000000000000000000000000000000006, + 0x0000000000000000000000000000000000000000000000000000000000000004, ), Negated( Fixed { @@ -19005,7 +19034,7 @@ PinnedVerificationKey { ), Sum( Constant( - 0x0000000000000000000000000000000000000000000000000000000000000007, + 0x0000000000000000000000000000000000000000000000000000000000000006, ), Negated( Fixed { @@ -19041,32 +19070,16 @@ 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: 26, + column_index: 26, + rotation: Rotation( + 0, ), - ), + }, Sum( Constant( - 0x0000000000000000000000000000000000000000000000000000000000000002, + 0x0000000000000000000000000000000000000000000000000000000000000001, ), Negated( Fixed { @@ -19081,7 +19094,7 @@ PinnedVerificationKey { ), Sum( Constant( - 0x0000000000000000000000000000000000000000000000000000000000000003, + 0x0000000000000000000000000000000000000000000000000000000000000002, ), Negated( Fixed { @@ -19096,7 +19109,7 @@ PinnedVerificationKey { ), Sum( Constant( - 0x0000000000000000000000000000000000000000000000000000000000000004, + 0x0000000000000000000000000000000000000000000000000000000000000003, ), Negated( Fixed { @@ -19111,7 +19124,7 @@ PinnedVerificationKey { ), Sum( Constant( - 0x0000000000000000000000000000000000000000000000000000000000000006, + 0x0000000000000000000000000000000000000000000000000000000000000004, ), Negated( Fixed { @@ -19126,7 +19139,7 @@ PinnedVerificationKey { ), Sum( Constant( - 0x0000000000000000000000000000000000000000000000000000000000000007, + 0x0000000000000000000000000000000000000000000000000000000000000006, ), Negated( Fixed { @@ -19162,32 +19175,16 @@ 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: 26, + column_index: 26, + rotation: Rotation( + 0, ), - ), + }, Sum( Constant( - 0x0000000000000000000000000000000000000000000000000000000000000002, + 0x0000000000000000000000000000000000000000000000000000000000000001, ), Negated( Fixed { @@ -19202,7 +19199,7 @@ PinnedVerificationKey { ), Sum( Constant( - 0x0000000000000000000000000000000000000000000000000000000000000003, + 0x0000000000000000000000000000000000000000000000000000000000000002, ), Negated( Fixed { @@ -19217,7 +19214,7 @@ PinnedVerificationKey { ), Sum( Constant( - 0x0000000000000000000000000000000000000000000000000000000000000004, + 0x0000000000000000000000000000000000000000000000000000000000000003, ), Negated( Fixed { @@ -19232,7 +19229,7 @@ PinnedVerificationKey { ), Sum( Constant( - 0x0000000000000000000000000000000000000000000000000000000000000005, + 0x0000000000000000000000000000000000000000000000000000000000000004, ), Negated( Fixed { @@ -19247,7 +19244,7 @@ PinnedVerificationKey { ), Sum( Constant( - 0x0000000000000000000000000000000000000000000000000000000000000007, + 0x0000000000000000000000000000000000000000000000000000000000000005, ), Negated( Fixed { @@ -19309,32 +19306,16 @@ 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: 26, + column_index: 26, + rotation: Rotation( + 0, ), - ), + }, Sum( Constant( - 0x0000000000000000000000000000000000000000000000000000000000000002, + 0x0000000000000000000000000000000000000000000000000000000000000001, ), Negated( Fixed { @@ -19349,7 +19330,7 @@ PinnedVerificationKey { ), Sum( Constant( - 0x0000000000000000000000000000000000000000000000000000000000000003, + 0x0000000000000000000000000000000000000000000000000000000000000002, ), Negated( Fixed { @@ -19364,7 +19345,7 @@ PinnedVerificationKey { ), Sum( Constant( - 0x0000000000000000000000000000000000000000000000000000000000000004, + 0x0000000000000000000000000000000000000000000000000000000000000003, ), Negated( Fixed { @@ -19379,7 +19360,7 @@ PinnedVerificationKey { ), Sum( Constant( - 0x0000000000000000000000000000000000000000000000000000000000000005, + 0x0000000000000000000000000000000000000000000000000000000000000004, ), Negated( Fixed { @@ -19394,7 +19375,7 @@ PinnedVerificationKey { ), Sum( Constant( - 0x0000000000000000000000000000000000000000000000000000000000000007, + 0x0000000000000000000000000000000000000000000000000000000000000005, ), Negated( Fixed { @@ -19456,32 +19437,16 @@ 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: 26, + column_index: 26, + rotation: Rotation( + 0, ), - ), + }, Sum( Constant( - 0x0000000000000000000000000000000000000000000000000000000000000002, + 0x0000000000000000000000000000000000000000000000000000000000000001, ), Negated( Fixed { @@ -19496,7 +19461,7 @@ PinnedVerificationKey { ), Sum( Constant( - 0x0000000000000000000000000000000000000000000000000000000000000003, + 0x0000000000000000000000000000000000000000000000000000000000000002, ), Negated( Fixed { @@ -19511,7 +19476,7 @@ PinnedVerificationKey { ), Sum( Constant( - 0x0000000000000000000000000000000000000000000000000000000000000004, + 0x0000000000000000000000000000000000000000000000000000000000000003, ), Negated( Fixed { @@ -19526,7 +19491,7 @@ PinnedVerificationKey { ), Sum( Constant( - 0x0000000000000000000000000000000000000000000000000000000000000005, + 0x0000000000000000000000000000000000000000000000000000000000000004, ), Negated( Fixed { @@ -19541,7 +19506,7 @@ PinnedVerificationKey { ), Sum( Constant( - 0x0000000000000000000000000000000000000000000000000000000000000007, + 0x0000000000000000000000000000000000000000000000000000000000000005, ), Negated( Fixed { @@ -19577,32 +19542,16 @@ 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: 26, + column_index: 26, + rotation: Rotation( + 0, ), - ), + }, Sum( Constant( - 0x0000000000000000000000000000000000000000000000000000000000000002, + 0x0000000000000000000000000000000000000000000000000000000000000001, ), Negated( Fixed { @@ -19617,7 +19566,7 @@ PinnedVerificationKey { ), Sum( Constant( - 0x0000000000000000000000000000000000000000000000000000000000000003, + 0x0000000000000000000000000000000000000000000000000000000000000002, ), Negated( Fixed { @@ -19632,7 +19581,7 @@ PinnedVerificationKey { ), Sum( Constant( - 0x0000000000000000000000000000000000000000000000000000000000000004, + 0x0000000000000000000000000000000000000000000000000000000000000003, ), Negated( Fixed { @@ -19647,7 +19596,7 @@ PinnedVerificationKey { ), Sum( Constant( - 0x0000000000000000000000000000000000000000000000000000000000000005, + 0x0000000000000000000000000000000000000000000000000000000000000004, ), Negated( Fixed { @@ -19662,7 +19611,7 @@ PinnedVerificationKey { ), Sum( Constant( - 0x0000000000000000000000000000000000000000000000000000000000000007, + 0x0000000000000000000000000000000000000000000000000000000000000005, ), Negated( Fixed { @@ -19700,20 +19649,20 @@ PinnedVerificationKey { Product( Product( Fixed { - query_index: 26, - column_index: 26, + query_index: 27, + column_index: 27, rotation: Rotation( 0, ), }, Sum( Constant( - 0x0000000000000000000000000000000000000000000000000000000000000001, + 0x0000000000000000000000000000000000000000000000000000000000000002, ), Negated( Fixed { - query_index: 26, - column_index: 26, + query_index: 27, + column_index: 27, rotation: Rotation( 0, ), @@ -19723,12 +19672,12 @@ PinnedVerificationKey { ), Sum( Constant( - 0x0000000000000000000000000000000000000000000000000000000000000002, + 0x0000000000000000000000000000000000000000000000000000000000000003, ), Negated( Fixed { - query_index: 26, - column_index: 26, + query_index: 27, + column_index: 27, rotation: Rotation( 0, ), @@ -19738,12 +19687,12 @@ PinnedVerificationKey { ), Sum( Constant( - 0x0000000000000000000000000000000000000000000000000000000000000003, + 0x0000000000000000000000000000000000000000000000000000000000000004, ), Negated( Fixed { - query_index: 26, - column_index: 26, + query_index: 27, + column_index: 27, rotation: Rotation( 0, ), @@ -19753,12 +19702,12 @@ PinnedVerificationKey { ), Sum( Constant( - 0x0000000000000000000000000000000000000000000000000000000000000004, + 0x0000000000000000000000000000000000000000000000000000000000000005, ), Negated( Fixed { - query_index: 26, - column_index: 26, + query_index: 27, + column_index: 27, rotation: Rotation( 0, ), @@ -19768,12 +19717,12 @@ PinnedVerificationKey { ), Sum( Constant( - 0x0000000000000000000000000000000000000000000000000000000000000005, + 0x0000000000000000000000000000000000000000000000000000000000000006, ), Negated( Fixed { - query_index: 26, - column_index: 26, + query_index: 27, + column_index: 27, rotation: Rotation( 0, ), @@ -19783,12 +19732,12 @@ PinnedVerificationKey { ), Sum( Constant( - 0x0000000000000000000000000000000000000000000000000000000000000006, + 0x0000000000000000000000000000000000000000000000000000000000000007, ), Negated( Fixed { - query_index: 26, - column_index: 26, + query_index: 27, + column_index: 27, rotation: Rotation( 0, ), @@ -19855,7 +19804,7 @@ PinnedVerificationKey { }, Sum( Constant( - 0x0000000000000000000000000000000000000000000000000000000000000002, + 0x0000000000000000000000000000000000000000000000000000000000000001, ), Negated( Fixed { @@ -20002,7 +19951,7 @@ PinnedVerificationKey { }, Sum( Constant( - 0x0000000000000000000000000000000000000000000000000000000000000002, + 0x0000000000000000000000000000000000000000000000000000000000000001, ), Negated( Fixed { @@ -20149,7 +20098,7 @@ PinnedVerificationKey { }, Sum( Constant( - 0x0000000000000000000000000000000000000000000000000000000000000002, + 0x0000000000000000000000000000000000000000000000000000000000000001, ), Negated( Fixed { @@ -20270,7 +20219,7 @@ PinnedVerificationKey { }, Sum( Constant( - 0x0000000000000000000000000000000000000000000000000000000000000002, + 0x0000000000000000000000000000000000000000000000000000000000000001, ), Negated( Fixed { @@ -20406,7 +20355,7 @@ PinnedVerificationKey { ), Sum( Constant( - 0x0000000000000000000000000000000000000000000000000000000000000003, + 0x0000000000000000000000000000000000000000000000000000000000000002, ), Negated( Fixed { @@ -20565,7 +20514,7 @@ PinnedVerificationKey { ), Sum( Constant( - 0x0000000000000000000000000000000000000000000000000000000000000003, + 0x0000000000000000000000000000000000000000000000000000000000000002, ), Negated( Fixed { @@ -20712,7 +20661,7 @@ PinnedVerificationKey { ), Sum( Constant( - 0x0000000000000000000000000000000000000000000000000000000000000003, + 0x0000000000000000000000000000000000000000000000000000000000000002, ), Negated( Fixed { @@ -20833,7 +20782,7 @@ PinnedVerificationKey { ), Sum( Constant( - 0x0000000000000000000000000000000000000000000000000000000000000003, + 0x0000000000000000000000000000000000000000000000000000000000000002, ), Negated( Fixed { @@ -20954,7 +20903,7 @@ PinnedVerificationKey { ), Sum( Constant( - 0x0000000000000000000000000000000000000000000000000000000000000003, + 0x0000000000000000000000000000000000000000000000000000000000000002, ), Negated( Fixed { @@ -21090,7 +21039,7 @@ PinnedVerificationKey { ), Sum( Constant( - 0x0000000000000000000000000000000000000000000000000000000000000004, + 0x0000000000000000000000000000000000000000000000000000000000000003, ), Negated( Fixed { @@ -21218,7 +21167,7 @@ PinnedVerificationKey { ), Sum( Constant( - 0x0000000000000000000000000000000000000000000000000000000000000004, + 0x0000000000000000000000000000000000000000000000000000000000000003, ), Negated( Fixed { @@ -21365,7 +21314,7 @@ PinnedVerificationKey { ), Sum( Constant( - 0x0000000000000000000000000000000000000000000000000000000000000004, + 0x0000000000000000000000000000000000000000000000000000000000000003, ), Negated( Fixed { @@ -21512,7 +21461,7 @@ PinnedVerificationKey { ), Sum( Constant( - 0x0000000000000000000000000000000000000000000000000000000000000004, + 0x0000000000000000000000000000000000000000000000000000000000000003, ), Negated( Fixed { @@ -21647,7 +21596,7 @@ PinnedVerificationKey { ), Sum( Constant( - 0x0000000000000000000000000000000000000000000000000000000000000004, + 0x0000000000000000000000000000000000000000000000000000000000000003, ), Negated( Fixed { @@ -21768,7 +21717,7 @@ PinnedVerificationKey { ), Sum( Constant( - 0x0000000000000000000000000000000000000000000000000000000000000004, + 0x0000000000000000000000000000000000000000000000000000000000000003, ), Negated( Fixed { @@ -21889,7 +21838,7 @@ PinnedVerificationKey { ), Sum( Constant( - 0x0000000000000000000000000000000000000000000000000000000000000004, + 0x0000000000000000000000000000000000000000000000000000000000000003, ), Negated( Fixed { @@ -22025,7 +21974,7 @@ PinnedVerificationKey { ), Sum( Constant( - 0x0000000000000000000000000000000000000000000000000000000000000005, + 0x0000000000000000000000000000000000000000000000000000000000000004, ), Negated( Fixed { @@ -22153,7 +22102,7 @@ PinnedVerificationKey { ), Sum( Constant( - 0x0000000000000000000000000000000000000000000000000000000000000005, + 0x0000000000000000000000000000000000000000000000000000000000000004, ), Negated( Fixed { @@ -22281,7 +22230,7 @@ PinnedVerificationKey { ), Sum( Constant( - 0x0000000000000000000000000000000000000000000000000000000000000005, + 0x0000000000000000000000000000000000000000000000000000000000000004, ), Negated( Fixed { @@ -22455,7 +22404,7 @@ PinnedVerificationKey { ), Sum( Constant( - 0x0000000000000000000000000000000000000000000000000000000000000006, + 0x0000000000000000000000000000000000000000000000000000000000000005, ), Negated( Fixed { @@ -22583,7 +22532,7 @@ PinnedVerificationKey { ), Sum( Constant( - 0x0000000000000000000000000000000000000000000000000000000000000006, + 0x0000000000000000000000000000000000000000000000000000000000000005, ), Negated( Fixed { @@ -22711,7 +22660,7 @@ PinnedVerificationKey { ), Sum( Constant( - 0x0000000000000000000000000000000000000000000000000000000000000006, + 0x0000000000000000000000000000000000000000000000000000000000000005, ), Negated( Fixed { @@ -22885,7 +22834,7 @@ PinnedVerificationKey { ), Sum( Constant( - 0x0000000000000000000000000000000000000000000000000000000000000007, + 0x0000000000000000000000000000000000000000000000000000000000000006, ), Negated( Fixed { @@ -22937,20 +22886,20 @@ PinnedVerificationKey { Product( Product( Fixed { - query_index: 27, - column_index: 27, + query_index: 28, + column_index: 28, rotation: Rotation( 0, ), }, Sum( Constant( - 0x0000000000000000000000000000000000000000000000000000000000000001, + 0x0000000000000000000000000000000000000000000000000000000000000002, ), Negated( Fixed { - query_index: 27, - column_index: 27, + query_index: 28, + column_index: 28, rotation: Rotation( 0, ), @@ -22960,12 +22909,12 @@ PinnedVerificationKey { ), Sum( Constant( - 0x0000000000000000000000000000000000000000000000000000000000000002, + 0x0000000000000000000000000000000000000000000000000000000000000003, ), Negated( Fixed { - query_index: 27, - column_index: 27, + query_index: 28, + column_index: 28, rotation: Rotation( 0, ), @@ -22975,12 +22924,12 @@ PinnedVerificationKey { ), Sum( Constant( - 0x0000000000000000000000000000000000000000000000000000000000000003, + 0x0000000000000000000000000000000000000000000000000000000000000004, ), Negated( Fixed { - query_index: 27, - column_index: 27, + query_index: 28, + column_index: 28, rotation: Rotation( 0, ), @@ -22990,12 +22939,12 @@ PinnedVerificationKey { ), Sum( Constant( - 0x0000000000000000000000000000000000000000000000000000000000000004, + 0x0000000000000000000000000000000000000000000000000000000000000005, ), Negated( Fixed { - query_index: 27, - column_index: 27, + query_index: 28, + column_index: 28, rotation: Rotation( 0, ), @@ -23005,12 +22954,12 @@ PinnedVerificationKey { ), Sum( Constant( - 0x0000000000000000000000000000000000000000000000000000000000000005, + 0x0000000000000000000000000000000000000000000000000000000000000006, ), Negated( Fixed { - query_index: 27, - column_index: 27, + query_index: 28, + column_index: 28, rotation: Rotation( 0, ), @@ -23020,12 +22969,12 @@ PinnedVerificationKey { ), Sum( Constant( - 0x0000000000000000000000000000000000000000000000000000000000000006, + 0x0000000000000000000000000000000000000000000000000000000000000007, ), Negated( Fixed { - query_index: 27, - column_index: 27, + query_index: 28, + column_index: 28, rotation: Rotation( 0, ), @@ -23065,20 +23014,20 @@ PinnedVerificationKey { Product( Product( Fixed { - query_index: 27, - column_index: 27, + query_index: 28, + column_index: 28, rotation: Rotation( 0, ), }, Sum( Constant( - 0x0000000000000000000000000000000000000000000000000000000000000001, + 0x0000000000000000000000000000000000000000000000000000000000000002, ), Negated( Fixed { - query_index: 27, - column_index: 27, + query_index: 28, + column_index: 28, rotation: Rotation( 0, ), @@ -23088,12 +23037,12 @@ PinnedVerificationKey { ), Sum( Constant( - 0x0000000000000000000000000000000000000000000000000000000000000002, + 0x0000000000000000000000000000000000000000000000000000000000000003, ), Negated( Fixed { - query_index: 27, - column_index: 27, + query_index: 28, + column_index: 28, rotation: Rotation( 0, ), @@ -23103,13 +23052,13 @@ PinnedVerificationKey { ), Sum( Constant( - 0x0000000000000000000000000000000000000000000000000000000000000003, + 0x0000000000000000000000000000000000000000000000000000000000000004, ), Negated( Fixed { - query_index: 27, - column_index: 27, - rotation: Rotation( + query_index: 28, + column_index: 28, + rotation: Rotation( 0, ), }, @@ -23118,12 +23067,12 @@ PinnedVerificationKey { ), Sum( Constant( - 0x0000000000000000000000000000000000000000000000000000000000000004, + 0x0000000000000000000000000000000000000000000000000000000000000005, ), Negated( Fixed { - query_index: 27, - column_index: 27, + query_index: 28, + column_index: 28, rotation: Rotation( 0, ), @@ -23133,12 +23082,12 @@ PinnedVerificationKey { ), Sum( Constant( - 0x0000000000000000000000000000000000000000000000000000000000000005, + 0x0000000000000000000000000000000000000000000000000000000000000006, ), Negated( Fixed { - query_index: 27, - column_index: 27, + query_index: 28, + column_index: 28, rotation: Rotation( 0, ), @@ -23148,12 +23097,12 @@ PinnedVerificationKey { ), Sum( Constant( - 0x0000000000000000000000000000000000000000000000000000000000000006, + 0x0000000000000000000000000000000000000000000000000000000000000007, ), Negated( Fixed { - query_index: 27, - column_index: 27, + query_index: 28, + column_index: 28, rotation: Rotation( 0, ), @@ -23220,7 +23169,7 @@ PinnedVerificationKey { }, Sum( Constant( - 0x0000000000000000000000000000000000000000000000000000000000000002, + 0x0000000000000000000000000000000000000000000000000000000000000001, ), Negated( Fixed { @@ -23348,7 +23297,7 @@ PinnedVerificationKey { }, Sum( Constant( - 0x0000000000000000000000000000000000000000000000000000000000000002, + 0x0000000000000000000000000000000000000000000000000000000000000001, ), Negated( Fixed { @@ -23498,7 +23447,7 @@ PinnedVerificationKey { ), Sum( Constant( - 0x0000000000000000000000000000000000000000000000000000000000000003, + 0x0000000000000000000000000000000000000000000000000000000000000002, ), Negated( Fixed { @@ -23645,7 +23594,7 @@ PinnedVerificationKey { ), Sum( Constant( - 0x0000000000000000000000000000000000000000000000000000000000000003, + 0x0000000000000000000000000000000000000000000000000000000000000002, ), Negated( Fixed { @@ -23780,7 +23729,7 @@ PinnedVerificationKey { ), Sum( Constant( - 0x0000000000000000000000000000000000000000000000000000000000000003, + 0x0000000000000000000000000000000000000000000000000000000000000002, ), Negated( Fixed { @@ -23901,7 +23850,7 @@ PinnedVerificationKey { ), Sum( Constant( - 0x0000000000000000000000000000000000000000000000000000000000000003, + 0x0000000000000000000000000000000000000000000000000000000000000002, ), Negated( Fixed { @@ -24022,7 +23971,7 @@ PinnedVerificationKey { ), Sum( Constant( - 0x0000000000000000000000000000000000000000000000000000000000000003, + 0x0000000000000000000000000000000000000000000000000000000000000002, ), Negated( Fixed { @@ -24158,7 +24107,7 @@ PinnedVerificationKey { ), Sum( Constant( - 0x0000000000000000000000000000000000000000000000000000000000000004, + 0x0000000000000000000000000000000000000000000000000000000000000003, ), Negated( Fixed { @@ -24305,7 +24254,7 @@ PinnedVerificationKey { ), Sum( Constant( - 0x0000000000000000000000000000000000000000000000000000000000000004, + 0x0000000000000000000000000000000000000000000000000000000000000003, ), Negated( Fixed { @@ -24452,7 +24401,7 @@ PinnedVerificationKey { ), Sum( Constant( - 0x0000000000000000000000000000000000000000000000000000000000000004, + 0x0000000000000000000000000000000000000000000000000000000000000003, ), Negated( Fixed { @@ -24573,7 +24522,7 @@ PinnedVerificationKey { ), Sum( Constant( - 0x0000000000000000000000000000000000000000000000000000000000000004, + 0x0000000000000000000000000000000000000000000000000000000000000003, ), Negated( Fixed { @@ -24709,7 +24658,7 @@ PinnedVerificationKey { ), Sum( Constant( - 0x0000000000000000000000000000000000000000000000000000000000000005, + 0x0000000000000000000000000000000000000000000000000000000000000004, ), Negated( Fixed { @@ -24788,974 +24737,11 @@ PinnedVerificationKey { 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, - ), - }, - ), - ), - ), - Sum( - Constant( - 0x0000000000000000000000000000000000000000000000000000000000000004, - ), - 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( - Constant( - 0x0000000000000000000000000000000000000000000000000000000000000007, - ), - Negated( - Fixed { - query_index: 28, - column_index: 28, - rotation: Rotation( - 0, - ), - }, - ), - ), - ), - 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: 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, - ), - }, - ), - ), - ), - Sum( - Constant( - 0x0000000000000000000000000000000000000000000000000000000000000004, - ), - 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( - Constant( - 0x0000000000000000000000000000000000000000000000000000000000000007, - ), - Negated( - Fixed { - query_index: 28, - column_index: 28, - rotation: Rotation( - 0, - ), - }, - ), - ), - ), - 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, - ), - }, - 0x0000000000000000000000000000000000000000000000000000000000000010, - ), - ), - Constant( - 0x0000000000000000000000000000100000000000000000000000000000000000, - ), - ), - Negated( - Constant( - 0x00000000000000000000000000000000224698fc094cf91b992d30ed00000001, - ), - ), - ), - 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, - ), - }, - ), - ), - ), - Sum( - Constant( - 0x0000000000000000000000000000000000000000000000000000000000000004, - ), - 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( - 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: 9, - column_index: 9, - 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, - ), - }, - ), - ), - ), - Sum( - Constant( - 0x0000000000000000000000000000000000000000000000000000000000000004, - ), - 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( - 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: 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, - ), - }, - ), - ), - ), - 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( - 0x0000000000000000000000000000000000000000000000000000000000000007, - ), - Negated( - Fixed { - query_index: 28, - column_index: 28, - rotation: Rotation( - 0, - ), - }, - ), - ), - ), - 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, - ), - ), - 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, - ), - }, - ), - ), - ), - 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( - 0x0000000000000000000000000000000000000000000000000000000000000007, - ), - Negated( - Fixed { - query_index: 28, - column_index: 28, - rotation: Rotation( - 0, - ), - }, - ), - ), - ), - 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, - ), - ), - Negated( - Constant( - 0x00000000000000000000000000000000224698fc094cf91b992d30ed00000001, - ), - ), - ), - 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, - ), - }, - ), - ), - ), - 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( - 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, - ), - }, + rotation: Rotation( + 0, + ), + }, + ), ), ), Product( @@ -25862,21 +24848,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, + ), + }, + 0x0000000000000000000000000000000000000000000000000000000000000010, + ), ), - }, - Advice { - query_index: 9, - column_index: 9, - rotation: Rotation( - 0, + Scaled( + Advice { + query_index: 18, + column_index: 7, + rotation: Rotation( + 1, + ), + }, + 0x4000000000000000000000000000000000000000000000000000000000000000, ), - }, + ), + Negated( + Advice { + query_index: 6, + column_index: 6, + rotation: Rotation( + 0, + ), + }, + ), ), ), Product( @@ -25983,21 +24995,47 @@ PinnedVerificationKey { ), ), ), - Product( - Advice { - query_index: 18, - column_index: 7, - rotation: Rotation( - 1, + 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, + ), + }, + 0x0000000000000000000000000000000000000000000000000000000000000010, + ), + ), + Constant( + 0x0000000000000000000000000000100000000000000000000000000000000000, + ), ), - }, - Advice { - query_index: 10, - column_index: 9, - rotation: Rotation( - 1, + Negated( + Constant( + 0x00000000000000000000000000000000224698fc094cf91b992d30ed00000001, + ), ), - }, + ), + Negated( + Advice { + query_index: 19, + column_index: 8, + rotation: Rotation( + 1, + ), + }, + ), ), ), Product( @@ -26091,7 +25129,7 @@ PinnedVerificationKey { ), Sum( Constant( - 0x0000000000000000000000000000000000000000000000000000000000000006, + 0x0000000000000000000000000000000000000000000000000000000000000007, ), Negated( Fixed { @@ -26105,6 +25143,13 @@ PinnedVerificationKey { ), ), Product( + Advice { + query_index: 18, + column_index: 7, + rotation: Rotation( + 1, + ), + }, Advice { query_index: 9, column_index: 9, @@ -26112,20 +25157,6 @@ PinnedVerificationKey { 0, ), }, - Sum( - Constant( - 0x0000000000000000000000000000000000000000000000000000000000000001, - ), - Negated( - Advice { - query_index: 9, - column_index: 9, - rotation: Rotation( - 0, - ), - }, - ), - ), ), ), Product( @@ -26219,7 +25250,7 @@ PinnedVerificationKey { ), Sum( Constant( - 0x0000000000000000000000000000000000000000000000000000000000000006, + 0x0000000000000000000000000000000000000000000000000000000000000007, ), Negated( Fixed { @@ -26232,47 +25263,21 @@ PinnedVerificationKey { ), ), ), - Sum( + Product( Advice { - query_index: 15, - column_index: 5, + query_index: 18, + column_index: 7, 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: 22, - column_index: 6, - rotation: Rotation( - 1, - ), - }, - 0x0000000000000000000000000000000000000000000000000000000000000400, - ), + Advice { + query_index: 10, + column_index: 9, + rotation: Rotation( + 1, ), - ), + }, ), ), Product( @@ -26380,21 +25385,14 @@ PinnedVerificationKey { ), ), Sum( - Advice { - query_index: 5, - column_index: 5, - rotation: Rotation( - 0, - ), - }, - Negated( + Sum( Sum( Sum( Advice { - query_index: 15, - column_index: 5, + query_index: 7, + column_index: 7, rotation: Rotation( - 1, + 0, ), }, Scaled( @@ -26405,20 +25403,39 @@ PinnedVerificationKey { 0, ), }, - 0x0400000000000000000000000000000000000000000000000000000000000000, + 0x0000000000000000000000000000000000000000000000000000000000000200, ), ), Scaled( Advice { - query_index: 9, - column_index: 9, + query_index: 22, + column_index: 6, rotation: Rotation( - 0, + 1, ), }, - 0x4000000000000000000000000000000000000000000000000000000000000000, + 0x0200000000000000000000000000000000000000000000000000000000000000, ), ), + Scaled( + Advice { + query_index: 18, + column_index: 7, + rotation: Rotation( + 1, + ), + }, + 0x4000000000000000000000000000000000000000000000000000000000000000, + ), + ), + Negated( + Advice { + query_index: 6, + column_index: 6, + rotation: Rotation( + 0, + ), + }, ), ), ), @@ -26529,13 +25546,25 @@ PinnedVerificationKey { Sum( Sum( Sum( - Advice { - query_index: 15, - column_index: 5, - rotation: Rotation( - 1, + 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, ), @@ -26663,17 +25692,17 @@ PinnedVerificationKey { ), Product( Advice { - query_index: 9, - column_index: 9, + query_index: 18, + column_index: 7, rotation: Rotation( - 0, + 1, ), }, Advice { - query_index: 8, - column_index: 8, + query_index: 22, + column_index: 6, rotation: Rotation( - 0, + 1, ), }, ), @@ -26784,17 +25813,17 @@ PinnedVerificationKey { ), Product( Advice { - query_index: 9, - column_index: 9, + query_index: 18, + column_index: 7, rotation: Rotation( - 0, + 1, ), }, Advice { - query_index: 18, - column_index: 7, + query_index: 9, + column_index: 9, rotation: Rotation( - 1, + 0, ), }, ), @@ -26903,6 +25932,254 @@ PinnedVerificationKey { ), ), ), + Product( + Advice { + query_index: 18, + column_index: 7, + rotation: Rotation( + 1, + ), + }, + Advice { + query_index: 10, + column_index: 9, + rotation: Rotation( + 1, + ), + }, + ), + ), + Product( + Fixed { + query_index: 29, + column_index: 29, + 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( + Fixed { + query_index: 29, + column_index: 29, + 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: 22, + column_index: 6, + rotation: Rotation( + 1, + ), + }, + 0x0000000000000000000000000000000000000000000000000000000000000400, + ), + ), + ), + ), + ), + Product( + Fixed { + query_index: 29, + column_index: 29, + 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, + ), + ), + Scaled( + Advice { + query_index: 9, + column_index: 9, + rotation: Rotation( + 0, + ), + }, + 0x4000000000000000000000000000000000000000000000000000000000000000, + ), + ), + ), + ), + ), + Product( + Fixed { + query_index: 29, + column_index: 29, + 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: 19, + column_index: 8, + rotation: Rotation( + 1, + ), + }, + ), + ), + ), + Product( + Fixed { + query_index: 29, + column_index: 29, + 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( + Fixed { + query_index: 29, + column_index: 29, + rotation: Rotation( + 0, + ), + }, + Product( + Advice { + query_index: 9, + column_index: 9, + rotation: Rotation( + 0, + ), + }, + Advice { + query_index: 18, + column_index: 7, + rotation: Rotation( + 1, + ), + }, + ), + ), + Product( + Fixed { + query_index: 29, + column_index: 29, + rotation: Rotation( + 0, + ), + }, Product( Advice { query_index: 9, @@ -27421,6 +26698,15 @@ PinnedVerificationKey { 0, ), ), + ( + Column { + index: 29, + column_type: Fixed, + }, + Rotation( + 0, + ), + ), ], permutation: Argument { columns: [ @@ -28106,17 +27392,18 @@ PinnedVerificationKey { (0x02c283cbde85f2ad26daddeabe01b1574ce7de68f0e329ec95a4154dd4713f29, 0x208cf96aa5255b543933ee3e9bdd054d4f15265a7c8921aaee89c192af2fd284), (0x1f777f0e4263ec4a19f30813739c640335ffa951cc3cc586b6c4095e737f95be, 0x061c07fb12cb19582eefd858a08e689acd970c8cb9ed8f7b928d88e691a2f586), (0x13d0bd76da4ace22c0e90b098d6073551322b8c734bf37eeca67fbf19687f550, 0x3d996cc9da5a31cefb453390b906eabbcc75797bc6a6b9c9e3af2fe7b6b8beed), - (0x04cad7405b492a30db0a710c842cecc97d02059acf4c02aa79626dce68ac4837, 0x3d6d7b6698b258e61ebe0b25d9cbcd4a016cb0a2ae8d92752532d98cfb27720d), + (0x16cc967b08c622132ea5bd25c0827c5746fcd6a9c6f784763bb65527349a2765, 0x284efb61ffde47401f489bcc836c97c0af875af5721c6e9fb5caf286cb04df88), (0x1b6f5383c5a0ae5bf457e1c8e17a933e892464d33fef9e9262411e01c117d87e, 0x0c552b960e8ce365b5f2302bcc0b7ce5cdf964e6036602cfc859c8769184f619), - (0x3fa4b5cc33e30de3ac7342c84f47f4fffe7ae77dda1689c2f08050d0ab743cb1, 0x327663e39b128ec28c94486b1e5d4429000626f65230ed572c66f80406a42176), - (0x2184a7d65b5000cc5c5f178c2f4ab5b11a67fdc626771c29ade508020c8da032, 0x34c98ee1f6dfa6c1e8cd915d1efeb484206e13e5e32e13118925913568e620b7), + (0x3b16a11303a9914a918a31d192d8c148d737ba6335bf59b24a50226ea6fde6e5, 0x1b94eb1ba5b61b6eb7ba23429c25c1b56332e8882e1dbdc5d3e70cfaf015bf6b), + (0x01c064e45f7961a7625d6a7f0840cb7a23a0a300eba199548dca797b92776d6a, 0x39a37ce2aa22bd26415fcffbaf8aec38f1bc55011f6c55bdf59e60967b8ef315), (0x0974ad1a3c0eb4c8d2c59cd820a82b7f28ea2f7a245008d403815131ff30879e, 0x00bb593cdf920cef4965f788d65eba3c3aa07d9718dfb62e3e385849a0d692a8), (0x1e355d783cffccafc120f462461fb312773442762383ac444009653f3d8d4be6, 0x3c60e17b18492aa2c41798b409d2bcc1857ca57ee9d2fb0001584cedc8e141d6), - (0x0a6fe1cc1ce659681079768ca8ff94d82c7d51ef39cd99b738b144de3a3027f6, 0x30cfc2f4e0ec95f623199970d8b762647ad2d7c3591a20781ee8187702babe5f), - (0x00d87a2c430f1db50a63f18f8cf8807f4f70d3acb940d4130ba6811f8ba2d479, 0x13d5742320e1b2cecda6073b7f2bf5816b9067453deeaa829f356a65ef5621b2), - (0x3118979ade023f3977d034f86eed6506d7e0586ead81f80bc5ca01a7660ee0c9, 0x30f6731193d5c786cf61b05523c05e2664a066c2d39a685588f02883057320ad), - (0x0df51bd411d5f95da66fcc57f5e4d8dbcca3d82b08ceb61e9ff1befa074e08d3, 0x11c9092b6d02c46f173b0108854499ca4922afaf58e0734e77a6088715e84b64), - (0x24289014ede2672df8e8e32eb4e0d71709846041319fb85b1328cdb3b8764565, 0x0833de9c0b76ae816df0e41ae33daece27c63a41f2ba9abbbc7c08724211b50c), + (0x25219cf4eb3ab5335b9934dbfb9ffc21c75a13199706b9167ad3ec3c62375fd2, 0x0311e81e0a5f94eba29ece2d8d18df813c723748e7fc91cadc19e6ad4831e5cd), + (0x018c435abdbe0051d20b1b557d9fd1e817a342651647cac7c58edd555495cec9, 0x0a061e068c64bed923b31d2953e8503a90bab28a52a44c781eafaa4e96126194), + (0x2d36bcdc5ab3f72357af5c1d6e150ba294774392fdb7289506d1f685af7012b6, 0x1abb5d3cc1cacb00a8e0503fd6b1a177852fd30b16c365287bc5ca2035bcdc21), + (0x259459a054b4a21c74508c1ec458a66b1ac3a942e640ec97574dd201c343d724, 0x2206ec87973fd46d03c6c603fcba5b5563aca7ed4d11c37467220a1de5abff60), + (0x31503525618fc6283b1df2d1757bd9f155fca694b64ab6927ee94b39dc560952, 0x1c74db4345164c77f05edad3c5eb6eed02b173c2c710509317b685b455c7c906), + (0x24a6899678eff985cd28bd6a0b7f022dab59c7a88e25380fb8026014d846845c, 0x3024539dac1246a06224bf2aa89c1d424dad644a20bae5c3d3059183a00e8a1d), ], permutation: VerifyingKey { commitments: [ diff --git a/src/circuit_proof_test_case.bin b/src/circuit_proof_test_case.bin index 9dcabe5b67196ea961707b01496939b1c75770c7..152286ed4e5368d649aa18feb7ed1ddb2a9fb84e 100644 GIT binary patch literal 5186 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 Date: Sun, 21 Aug 2022 19:31:26 +0200 Subject: [PATCH 06/16] zsa-mux: mux_point --- src/circuit.rs | 45 +++++++++++++++++++++++++++++----- src/circuit/gadget.rs | 4 +++ src/circuit/gadget/mux_chip.rs | 32 ++++++++++++++++++++++++ src/circuit/note_commit.rs | 43 +++++++++++++++++++++++++++++--- 4 files changed, 114 insertions(+), 10 deletions(-) diff --git a/src/circuit.rs b/src/circuit.rs index 9fe4c0d7b..d81b72ce3 100644 --- a/src/circuit.rs +++ b/src/circuit.rs @@ -32,6 +32,7 @@ use pasta_curves::{arithmetic::CurveAffine, pallas, vesta}; use rand::RngCore; use crate::circuit::gadget::mux_chip::{MuxChip, MuxConfig}; +use crate::note::NoteType; use crate::{ constants::{ OrchardCommitDomains, OrchardFixedBases, OrchardFixedBasesFull, OrchardHashDomains, @@ -296,13 +297,21 @@ impl plonk::Circuit for Circuit { // Configuration to handle decomposition and canonicity checking // for NoteCommit_old. - let old_note_commit_config = - NoteCommitChip::configure(meta, advices, sinsemilla_config_1.clone()); + let old_note_commit_config = NoteCommitChip::configure( + meta, + advices, + sinsemilla_config_1.clone(), + mux_config.clone(), + ); // Configuration to handle decomposition and canonicity checking // for NoteCommit_new. - let new_note_commit_config = - NoteCommitChip::configure(meta, advices, sinsemilla_config_2.clone()); + let new_note_commit_config = NoteCommitChip::configure( + meta, + advices, + sinsemilla_config_2.clone(), + mux_config.clone(), + ); Config { primary, @@ -335,7 +344,7 @@ 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_old, rho_old, cm_old, g_d_old, ak_P, nk, v_old, v_new, note_type, is_zsa) = { // Witness psi_old let psi_old = assign_free_advice( layouter.namespace(|| "witness psi_old"), @@ -393,7 +402,27 @@ impl plonk::Circuit for Circuit { self.v_new, )?; - (psi_old, rho_old, cm_old, g_d_old, ak_P, nk, v_old, v_new) + // TODO: move to self. + let note_type_value = Value::known(NoteType::native()); + let is_zsa_value = Value::known(pallas::Base::zero()); // TODO: bool type. + + // Witness note_type. + let note_type = NonIdentityPoint::new( + ecc_chip.clone(), + layouter.namespace(|| "note_type"), + note_type_value.as_ref().map(|nt| nt.cv_base().to_affine()), + )?; + + // Witness is_zsa. + let is_zsa = assign_free_advice( + layouter.namespace(|| "witness is_zsa"), + config.advices[0], + is_zsa_value, + )?; + + ( + psi_old, rho_old, cm_old, g_d_old, ak_P, nk, v_old, v_new, note_type, is_zsa, + ) }; // Merkle path validity check (https://p.z.cash/ZKS:action-merkle-path-validity?partial). @@ -570,9 +599,11 @@ impl plonk::Circuit for Circuit { config.sinsemilla_chip_1(), config.ecc_chip(), config.note_commit_chip_old(), + config.mux_chip(), g_d_old.inner(), pk_d_old.inner(), v_old.clone(), + is_zsa.clone(), rho_old, psi_old, rcm_old, @@ -628,9 +659,11 @@ impl plonk::Circuit for Circuit { config.sinsemilla_chip_2(), config.ecc_chip(), config.note_commit_chip_new(), + config.mux_chip(), g_d_new.inner(), pk_d_new.inner(), v_new.clone(), + is_zsa.clone(), rho_new, psi_new, rcm_new, diff --git a/src/circuit/gadget.rs b/src/circuit/gadget.rs index 5e2e0ba58..9333ed9b5 100644 --- a/src/circuit/gadget.rs +++ b/src/circuit/gadget.rs @@ -33,6 +33,10 @@ impl super::Config { add_chip::AddChip::construct(self.add_config.clone()) } + pub(super) fn mux_chip(&self) -> mux_chip::MuxChip { + mux_chip::MuxChip::construct(self.mux_config.clone()) + } + pub(super) fn commit_ivk_chip(&self) -> CommitIvkChip { CommitIvkChip::construct(self.commit_ivk_config.clone()) } diff --git a/src/circuit/gadget/mux_chip.rs b/src/circuit/gadget/mux_chip.rs index 617e4765b..21ef477c9 100644 --- a/src/circuit/gadget/mux_chip.rs +++ b/src/circuit/gadget/mux_chip.rs @@ -1,3 +1,4 @@ +use halo2_gadgets::ecc::chip::EccPoint; use halo2_proofs::circuit::Value; use halo2_proofs::{ circuit::{AssignedCell, Chip, Layouter}, @@ -84,6 +85,14 @@ pub trait MuxInstructions { left: &AssignedCell, right: &AssignedCell, ) -> Result, plonk::Error>; + + fn mux_point( + &self, + layouter: impl Layouter, + switch: &AssignedCell, + left: &EccPoint, + right: &EccPoint, + ) -> Result; } impl MuxInstructions for MuxChip { @@ -112,6 +121,29 @@ impl MuxInstructions for MuxChip { }, ) } + + fn mux_point( + &self, + mut layouter: impl Layouter, + switch: &AssignedCell, + left: &EccPoint, + right: &EccPoint, + ) -> Result { + let x = self.mux( + layouter.namespace(|| "mux x"), + switch, + &left.x(), + &right.x(), + )?; + let y = self.mux( + layouter.namespace(|| "mux y"), + switch, + &left.y(), + &right.y(), + )?; + + Ok(EccPoint::from_coordinates_unchecked(x.into(), y.into())) + } } fn compute_mux( diff --git a/src/circuit/note_commit.rs b/src/circuit/note_commit.rs index 1f4a3cec0..a4e75745a 100644 --- a/src/circuit/note_commit.rs +++ b/src/circuit/note_commit.rs @@ -24,6 +24,7 @@ use halo2_gadgets::{ bool_check, lookup_range_check::LookupRangeCheckConfig, FieldValue, RangeConstrained, }, }; +use crate::circuit::gadget::mux_chip::{MuxConfig, MuxInstructions}; type NoteCommitPiece = MessagePiece< pallas::Affine, @@ -1426,6 +1427,7 @@ pub struct NoteCommitConfig { advices: [Column; 10], sinsemilla_config: SinsemillaConfig, + mux_config: MuxConfig, } #[derive(Clone, Debug)] @@ -1444,6 +1446,7 @@ impl NoteCommitChip { OrchardCommitDomains, OrchardFixedBases, >, + mux_config: MuxConfig, ) -> NoteCommitConfig { // Useful constants let two = pallas::Base::from(2); @@ -1552,6 +1555,7 @@ impl NoteCommitChip { y_canon, advices, sinsemilla_config, + mux_config, } } @@ -1564,6 +1568,7 @@ pub(in crate::circuit) mod gadgets { use halo2_proofs::circuit::{Chip, Value}; use super::*; + use crate::circuit::gadget::mux_chip::MuxChip; #[allow(clippy::many_single_char_names)] #[allow(clippy::type_complexity)] @@ -1573,9 +1578,11 @@ pub(in crate::circuit) mod gadgets { chip: SinsemillaChip, ecc_chip: EccChip, note_commit_chip: NoteCommitChip, + mux_chip: MuxChip, g_d: &NonIdentityEccPoint, pk_d: &NonIdentityEccPoint, value: AssignedCell, + is_zsa: AssignedCell, rho: AssignedCell, psi: AssignedCell, rcm: ScalarFixed>, @@ -1666,12 +1673,26 @@ pub(in crate::circuit) mod gadgets { h.clone(), ], ); - let domain = CommitDomain::new(chip, ecc_chip, &OrchardCommitDomains::NoteCommit); - domain.commit( + let domain = CommitDomain::new(chip, ecc_chip.clone(), &OrchardCommitDomains::NoteCommit); + let (cm_native, zs) = domain.commit( layouter.namespace(|| "Process NoteCommit inputs"), message, rcm, - )? + )?; + + // TODO: use ZSA hash. + let cm_zsa = cm_native.clone(); + + let cm = mux_chip.mux_point( + layouter.namespace(|| "mux cm"), + &is_zsa, + cm_native.inner(), + cm_zsa.inner(), + )?; + let cm = Point::from_inner(ecc_chip.clone(), cm); + + // TODO: deal with zs too. + (cm, zs) }; // `CommitDomain::commit` returns the running sum for each `MessagePiece`. Grab @@ -2049,6 +2070,7 @@ mod tests { }; use rand::{rngs::OsRng, RngCore}; + use crate::circuit::gadget::mux_chip::MuxChip; #[test] fn note_commit() { @@ -2122,8 +2144,9 @@ mod tests { lookup, range_check, ); + let mux_config = MuxChip::configure(meta, advices[0], advices[1], advices[2], advices[3]); let note_commit_config = - NoteCommitChip::configure(meta, advices, sinsemilla_config); + NoteCommitChip::configure(meta, advices, sinsemilla_config, mux_config); let ecc_config = EccChip::::configure( meta, @@ -2159,6 +2182,8 @@ mod tests { // Construct a NoteCommit chip let note_commit_chip = NoteCommitChip::construct(note_commit_config.clone()); + let mux_chip = MuxChip::construct(note_commit_config.mux_config); + // Witness g_d let g_d = { let g_d = self.gd_x.zip(self.gd_y_lsb).map(|(x, y_lsb)| { @@ -2209,6 +2234,14 @@ mod tests { )? }; + // Witness is_zsa. + let is_zsa_value = Value::known(pallas::Base::zero()); + let is_zsa = assign_free_advice( + layouter.namespace(|| "witness is_zsa"), + note_commit_config.advices[0], + is_zsa_value, + )?; + // Witness rho let rho = assign_free_advice( layouter.namespace(|| "witness rho"), @@ -2235,9 +2268,11 @@ mod tests { sinsemilla_chip, ecc_chip.clone(), note_commit_chip, + mux_chip, g_d.inner(), pk_d.inner(), value_var, + is_zsa, rho, psi, rcm_gadget, From 71735a0f0371bb6e58268037f2c604c2009baccd Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Aur=C3=A9lien=20Nicolas?= Date: Sun, 21 Aug 2022 20:24:34 +0200 Subject: [PATCH 07/16] zsa-mux: select one of two note hashes --- src/circuit/note_commit.rs | 27 +- src/circuit_description | 1942 +++++++++++++++---------------- src/circuit_proof_test_case.bin | Bin 5186 -> 5186 bytes 3 files changed, 988 insertions(+), 981 deletions(-) diff --git a/src/circuit/note_commit.rs b/src/circuit/note_commit.rs index a4e75745a..f93489e48 100644 --- a/src/circuit/note_commit.rs +++ b/src/circuit/note_commit.rs @@ -1673,25 +1673,32 @@ pub(in crate::circuit) mod gadgets { h.clone(), ], ); + let domain = CommitDomain::new(chip, ecc_chip.clone(), &OrchardCommitDomains::NoteCommit); - let (cm_native, zs) = domain.commit( - layouter.namespace(|| "Process NoteCommit inputs"), + + let (hash_native, zs) = domain.hash( + layouter.namespace(|| "NoteCommit hash"), message, - rcm, )?; // TODO: use ZSA hash. - let cm_zsa = cm_native.clone(); + let hash_zsa = hash_native.clone(); - let cm = mux_chip.mux_point( - layouter.namespace(|| "mux cm"), + let hash = mux_chip.mux_point( + layouter.namespace(|| "mux hash"), &is_zsa, - cm_native.inner(), - cm_zsa.inner(), + &(hash_native.inner().clone().into()), + &(hash_zsa.inner().clone().into()), + )?; + let hash = Point::from_inner(ecc_chip.clone(), hash); + + let cm = domain.blind( + layouter.namespace(|| "NoteCommit blind"), + hash, + rcm, )?; - let cm = Point::from_inner(ecc_chip.clone(), cm); - // TODO: deal with zs too. + // TODO: handle zs in the zsa case. (cm, zs) }; diff --git a/src/circuit_description b/src/circuit_description index e8591029b..5e179e6c1 100644 --- a/src/circuit_description +++ b/src/circuit_description @@ -17,32 +17,16 @@ PinnedVerificationKey { 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, - ), - }, - ), + Fixed { + query_index: 18, + column_index: 18, + rotation: Rotation( + 0, ), - ), + }, Sum( Constant( - 0x0000000000000000000000000000000000000000000000000000000000000003, + 0x0000000000000000000000000000000000000000000000000000000000000002, ), Negated( Fixed { @@ -57,7 +41,7 @@ PinnedVerificationKey { ), Sum( Constant( - 0x0000000000000000000000000000000000000000000000000000000000000004, + 0x0000000000000000000000000000000000000000000000000000000000000003, ), Negated( Fixed { @@ -72,7 +56,7 @@ PinnedVerificationKey { ), Sum( Constant( - 0x0000000000000000000000000000000000000000000000000000000000000005, + 0x0000000000000000000000000000000000000000000000000000000000000004, ), Negated( Fixed { @@ -87,7 +71,7 @@ PinnedVerificationKey { ), Sum( Constant( - 0x0000000000000000000000000000000000000000000000000000000000000006, + 0x0000000000000000000000000000000000000000000000000000000000000005, ), Negated( Fixed { @@ -144,32 +128,16 @@ PinnedVerificationKey { 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, - ), - }, - ), + Fixed { + query_index: 18, + column_index: 18, + rotation: Rotation( + 0, ), - ), + }, Sum( Constant( - 0x0000000000000000000000000000000000000000000000000000000000000003, + 0x0000000000000000000000000000000000000000000000000000000000000002, ), Negated( Fixed { @@ -184,7 +152,7 @@ PinnedVerificationKey { ), Sum( Constant( - 0x0000000000000000000000000000000000000000000000000000000000000004, + 0x0000000000000000000000000000000000000000000000000000000000000003, ), Negated( Fixed { @@ -199,7 +167,7 @@ PinnedVerificationKey { ), Sum( Constant( - 0x0000000000000000000000000000000000000000000000000000000000000005, + 0x0000000000000000000000000000000000000000000000000000000000000004, ), Negated( Fixed { @@ -214,7 +182,7 @@ PinnedVerificationKey { ), Sum( Constant( - 0x0000000000000000000000000000000000000000000000000000000000000006, + 0x0000000000000000000000000000000000000000000000000000000000000005, ), Negated( Fixed { @@ -260,32 +228,16 @@ PinnedVerificationKey { 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, - ), - }, - ), + Fixed { + query_index: 18, + column_index: 18, + rotation: Rotation( + 0, ), - ), + }, Sum( Constant( - 0x0000000000000000000000000000000000000000000000000000000000000003, + 0x0000000000000000000000000000000000000000000000000000000000000002, ), Negated( Fixed { @@ -300,7 +252,7 @@ PinnedVerificationKey { ), Sum( Constant( - 0x0000000000000000000000000000000000000000000000000000000000000004, + 0x0000000000000000000000000000000000000000000000000000000000000003, ), Negated( Fixed { @@ -315,7 +267,7 @@ PinnedVerificationKey { ), Sum( Constant( - 0x0000000000000000000000000000000000000000000000000000000000000005, + 0x0000000000000000000000000000000000000000000000000000000000000004, ), Negated( Fixed { @@ -330,7 +282,7 @@ PinnedVerificationKey { ), Sum( Constant( - 0x0000000000000000000000000000000000000000000000000000000000000006, + 0x0000000000000000000000000000000000000000000000000000000000000005, ), Negated( Fixed { @@ -372,32 +324,16 @@ PinnedVerificationKey { 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, - ), - }, - ), + Fixed { + query_index: 18, + column_index: 18, + rotation: Rotation( + 0, ), - ), + }, Sum( Constant( - 0x0000000000000000000000000000000000000000000000000000000000000003, + 0x0000000000000000000000000000000000000000000000000000000000000002, ), Negated( Fixed { @@ -412,7 +348,7 @@ PinnedVerificationKey { ), Sum( Constant( - 0x0000000000000000000000000000000000000000000000000000000000000004, + 0x0000000000000000000000000000000000000000000000000000000000000003, ), Negated( Fixed { @@ -427,7 +363,7 @@ PinnedVerificationKey { ), Sum( Constant( - 0x0000000000000000000000000000000000000000000000000000000000000005, + 0x0000000000000000000000000000000000000000000000000000000000000004, ), Negated( Fixed { @@ -442,7 +378,7 @@ PinnedVerificationKey { ), Sum( Constant( - 0x0000000000000000000000000000000000000000000000000000000000000006, + 0x0000000000000000000000000000000000000000000000000000000000000005, ), Negated( Fixed { @@ -484,32 +420,16 @@ PinnedVerificationKey { 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, - ), - }, - ), + Fixed { + query_index: 18, + column_index: 18, + rotation: Rotation( + 0, ), - ), + }, Sum( Constant( - 0x0000000000000000000000000000000000000000000000000000000000000003, + 0x0000000000000000000000000000000000000000000000000000000000000001, ), Negated( Fixed { @@ -524,7 +444,7 @@ PinnedVerificationKey { ), Sum( Constant( - 0x0000000000000000000000000000000000000000000000000000000000000004, + 0x0000000000000000000000000000000000000000000000000000000000000003, ), Negated( Fixed { @@ -539,7 +459,7 @@ PinnedVerificationKey { ), Sum( Constant( - 0x0000000000000000000000000000000000000000000000000000000000000005, + 0x0000000000000000000000000000000000000000000000000000000000000004, ), Negated( Fixed { @@ -554,7 +474,7 @@ PinnedVerificationKey { ), Sum( Constant( - 0x0000000000000000000000000000000000000000000000000000000000000006, + 0x0000000000000000000000000000000000000000000000000000000000000005, ), Negated( Fixed { @@ -625,32 +545,16 @@ PinnedVerificationKey { 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, - ), - }, - ), + Fixed { + query_index: 18, + column_index: 18, + rotation: Rotation( + 0, ), - ), + }, Sum( Constant( - 0x0000000000000000000000000000000000000000000000000000000000000002, + 0x0000000000000000000000000000000000000000000000000000000000000001, ), Negated( Fixed { @@ -665,7 +569,7 @@ PinnedVerificationKey { ), Sum( Constant( - 0x0000000000000000000000000000000000000000000000000000000000000004, + 0x0000000000000000000000000000000000000000000000000000000000000002, ), Negated( Fixed { @@ -680,7 +584,7 @@ PinnedVerificationKey { ), Sum( Constant( - 0x0000000000000000000000000000000000000000000000000000000000000005, + 0x0000000000000000000000000000000000000000000000000000000000000004, ), Negated( Fixed { @@ -695,7 +599,7 @@ PinnedVerificationKey { ), Sum( Constant( - 0x0000000000000000000000000000000000000000000000000000000000000006, + 0x0000000000000000000000000000000000000000000000000000000000000005, ), Negated( Fixed { @@ -743,20 +647,20 @@ PinnedVerificationKey { Product( Product( Fixed { - query_index: 18, - column_index: 18, + query_index: 19, + column_index: 19, rotation: Rotation( 0, ), }, Sum( Constant( - 0x0000000000000000000000000000000000000000000000000000000000000001, + 0x0000000000000000000000000000000000000000000000000000000000000002, ), Negated( Fixed { - query_index: 18, - column_index: 18, + query_index: 19, + column_index: 19, rotation: Rotation( 0, ), @@ -766,12 +670,12 @@ PinnedVerificationKey { ), Sum( Constant( - 0x0000000000000000000000000000000000000000000000000000000000000002, + 0x0000000000000000000000000000000000000000000000000000000000000003, ), Negated( Fixed { - query_index: 18, - column_index: 18, + query_index: 19, + column_index: 19, rotation: Rotation( 0, ), @@ -781,12 +685,12 @@ PinnedVerificationKey { ), Sum( Constant( - 0x0000000000000000000000000000000000000000000000000000000000000003, + 0x0000000000000000000000000000000000000000000000000000000000000004, ), Negated( Fixed { - query_index: 18, - column_index: 18, + query_index: 19, + column_index: 19, rotation: Rotation( 0, ), @@ -800,8 +704,8 @@ PinnedVerificationKey { ), Negated( Fixed { - query_index: 18, - column_index: 18, + query_index: 19, + column_index: 19, rotation: Rotation( 0, ), @@ -815,8 +719,8 @@ PinnedVerificationKey { ), Negated( Fixed { - query_index: 18, - column_index: 18, + query_index: 19, + column_index: 19, rotation: Rotation( 0, ), @@ -860,21 +764,37 @@ PinnedVerificationKey { Product( Product( Product( - Fixed { - query_index: 19, - column_index: 19, - rotation: Rotation( - 0, - ), - }, - Sum( - Constant( - 0x0000000000000000000000000000000000000000000000000000000000000002, - ), + 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: 19, - column_index: 19, + query_index: 18, + column_index: 18, rotation: Rotation( 0, ), @@ -888,8 +808,8 @@ PinnedVerificationKey { ), Negated( Fixed { - query_index: 19, - column_index: 19, + query_index: 18, + column_index: 18, rotation: Rotation( 0, ), @@ -899,12 +819,12 @@ PinnedVerificationKey { ), Sum( Constant( - 0x0000000000000000000000000000000000000000000000000000000000000004, + 0x0000000000000000000000000000000000000000000000000000000000000005, ), Negated( Fixed { - query_index: 19, - column_index: 19, + query_index: 18, + column_index: 18, rotation: Rotation( 0, ), @@ -978,21 +898,37 @@ PinnedVerificationKey { Product( Product( Product( - Fixed { - query_index: 19, - column_index: 19, - rotation: Rotation( - 0, + 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: 19, - column_index: 19, + query_index: 18, + column_index: 18, rotation: Rotation( 0, ), @@ -1006,8 +942,8 @@ PinnedVerificationKey { ), Negated( Fixed { - query_index: 19, - column_index: 19, + query_index: 18, + column_index: 18, rotation: Rotation( 0, ), @@ -1017,12 +953,12 @@ PinnedVerificationKey { ), Sum( Constant( - 0x0000000000000000000000000000000000000000000000000000000000000004, + 0x0000000000000000000000000000000000000000000000000000000000000005, ), Negated( Fixed { - query_index: 19, - column_index: 19, + query_index: 18, + column_index: 18, rotation: Rotation( 0, ), @@ -1095,21 +1031,37 @@ PinnedVerificationKey { Product( Product( Product( - Fixed { - query_index: 19, - column_index: 19, - rotation: Rotation( - 0, + 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( - 0x0000000000000000000000000000000000000000000000000000000000000001, + 0x0000000000000000000000000000000000000000000000000000000000000002, ), Negated( Fixed { - query_index: 19, - column_index: 19, + query_index: 18, + column_index: 18, rotation: Rotation( 0, ), @@ -1123,8 +1075,8 @@ PinnedVerificationKey { ), Negated( Fixed { - query_index: 19, - column_index: 19, + query_index: 18, + column_index: 18, rotation: Rotation( 0, ), @@ -1138,8 +1090,8 @@ PinnedVerificationKey { ), Negated( Fixed { - query_index: 19, - column_index: 19, + query_index: 18, + column_index: 18, rotation: Rotation( 0, ), @@ -1205,20 +1157,20 @@ PinnedVerificationKey { Product( Product( Fixed { - query_index: 19, - column_index: 19, + query_index: 20, + column_index: 20, rotation: Rotation( 0, ), }, Sum( Constant( - 0x0000000000000000000000000000000000000000000000000000000000000001, + 0x0000000000000000000000000000000000000000000000000000000000000002, ), Negated( Fixed { - query_index: 19, - column_index: 19, + query_index: 20, + column_index: 20, rotation: Rotation( 0, ), @@ -1228,12 +1180,12 @@ PinnedVerificationKey { ), Sum( Constant( - 0x0000000000000000000000000000000000000000000000000000000000000002, + 0x0000000000000000000000000000000000000000000000000000000000000003, ), Negated( Fixed { - query_index: 19, - column_index: 19, + query_index: 20, + column_index: 20, rotation: Rotation( 0, ), @@ -1247,8 +1199,8 @@ PinnedVerificationKey { ), Negated( Fixed { - query_index: 19, - column_index: 19, + query_index: 20, + column_index: 20, rotation: Rotation( 0, ), @@ -1369,20 +1321,20 @@ PinnedVerificationKey { Product( Product( Fixed { - query_index: 19, - column_index: 19, + query_index: 20, + column_index: 20, rotation: Rotation( 0, ), }, Sum( Constant( - 0x0000000000000000000000000000000000000000000000000000000000000001, + 0x0000000000000000000000000000000000000000000000000000000000000002, ), Negated( Fixed { - query_index: 19, - column_index: 19, + query_index: 20, + column_index: 20, rotation: Rotation( 0, ), @@ -1392,12 +1344,12 @@ PinnedVerificationKey { ), Sum( Constant( - 0x0000000000000000000000000000000000000000000000000000000000000002, + 0x0000000000000000000000000000000000000000000000000000000000000003, ), Negated( Fixed { - query_index: 19, - column_index: 19, + query_index: 20, + column_index: 20, rotation: Rotation( 0, ), @@ -1411,8 +1363,8 @@ PinnedVerificationKey { ), Negated( Fixed { - query_index: 19, - column_index: 19, + query_index: 20, + column_index: 20, rotation: Rotation( 0, ), @@ -1504,8 +1456,8 @@ PinnedVerificationKey { Product( Product( Fixed { - query_index: 19, - column_index: 19, + query_index: 20, + column_index: 20, rotation: Rotation( 0, ), @@ -1516,8 +1468,8 @@ PinnedVerificationKey { ), Negated( Fixed { - query_index: 19, - column_index: 19, + query_index: 20, + column_index: 20, rotation: Rotation( 0, ), @@ -1527,12 +1479,12 @@ PinnedVerificationKey { ), Sum( Constant( - 0x0000000000000000000000000000000000000000000000000000000000000002, + 0x0000000000000000000000000000000000000000000000000000000000000003, ), Negated( Fixed { - query_index: 19, - column_index: 19, + query_index: 20, + column_index: 20, rotation: Rotation( 0, ), @@ -1542,12 +1494,12 @@ PinnedVerificationKey { ), Sum( Constant( - 0x0000000000000000000000000000000000000000000000000000000000000003, + 0x0000000000000000000000000000000000000000000000000000000000000004, ), Negated( Fixed { - query_index: 19, - column_index: 19, + query_index: 20, + column_index: 20, rotation: Rotation( 0, ), @@ -1630,8 +1582,8 @@ PinnedVerificationKey { Product( Product( Fixed { - query_index: 19, - column_index: 19, + query_index: 20, + column_index: 20, rotation: Rotation( 0, ), @@ -1642,8 +1594,8 @@ PinnedVerificationKey { ), Negated( Fixed { - query_index: 19, - column_index: 19, + query_index: 20, + column_index: 20, rotation: Rotation( 0, ), @@ -1653,12 +1605,12 @@ PinnedVerificationKey { ), Sum( Constant( - 0x0000000000000000000000000000000000000000000000000000000000000002, + 0x0000000000000000000000000000000000000000000000000000000000000003, ), Negated( Fixed { - query_index: 19, - column_index: 19, + query_index: 20, + column_index: 20, rotation: Rotation( 0, ), @@ -1668,12 +1620,12 @@ PinnedVerificationKey { ), Sum( Constant( - 0x0000000000000000000000000000000000000000000000000000000000000003, + 0x0000000000000000000000000000000000000000000000000000000000000004, ), Negated( Fixed { - query_index: 19, - column_index: 19, + query_index: 20, + column_index: 20, rotation: Rotation( 0, ), @@ -1769,8 +1721,8 @@ PinnedVerificationKey { Product( Product( Fixed { - query_index: 19, - column_index: 19, + query_index: 20, + column_index: 20, rotation: Rotation( 0, ), @@ -1781,8 +1733,8 @@ PinnedVerificationKey { ), Negated( Fixed { - query_index: 19, - column_index: 19, + query_index: 20, + column_index: 20, rotation: Rotation( 0, ), @@ -1792,12 +1744,12 @@ PinnedVerificationKey { ), Sum( Constant( - 0x0000000000000000000000000000000000000000000000000000000000000002, + 0x0000000000000000000000000000000000000000000000000000000000000003, ), Negated( Fixed { - query_index: 19, - column_index: 19, + query_index: 20, + column_index: 20, rotation: Rotation( 0, ), @@ -1807,12 +1759,12 @@ PinnedVerificationKey { ), Sum( Constant( - 0x0000000000000000000000000000000000000000000000000000000000000003, + 0x0000000000000000000000000000000000000000000000000000000000000004, ), Negated( Fixed { - query_index: 19, - column_index: 19, + query_index: 20, + column_index: 20, rotation: Rotation( 0, ), @@ -1913,8 +1865,8 @@ PinnedVerificationKey { Product( Product( Fixed { - query_index: 19, - column_index: 19, + query_index: 20, + column_index: 20, rotation: Rotation( 0, ), @@ -1925,8 +1877,8 @@ PinnedVerificationKey { ), Negated( Fixed { - query_index: 19, - column_index: 19, + query_index: 20, + column_index: 20, rotation: Rotation( 0, ), @@ -1936,12 +1888,12 @@ PinnedVerificationKey { ), Sum( Constant( - 0x0000000000000000000000000000000000000000000000000000000000000002, + 0x0000000000000000000000000000000000000000000000000000000000000003, ), Negated( Fixed { - query_index: 19, - column_index: 19, + query_index: 20, + column_index: 20, rotation: Rotation( 0, ), @@ -1951,12 +1903,12 @@ PinnedVerificationKey { ), Sum( Constant( - 0x0000000000000000000000000000000000000000000000000000000000000003, + 0x0000000000000000000000000000000000000000000000000000000000000004, ), Negated( Fixed { - query_index: 19, - column_index: 19, + query_index: 20, + column_index: 20, rotation: Rotation( 0, ), @@ -2057,8 +2009,8 @@ PinnedVerificationKey { Product( Product( Fixed { - query_index: 19, - column_index: 19, + query_index: 20, + column_index: 20, rotation: Rotation( 0, ), @@ -2069,8 +2021,8 @@ PinnedVerificationKey { ), Negated( Fixed { - query_index: 19, - column_index: 19, + query_index: 20, + column_index: 20, rotation: Rotation( 0, ), @@ -2080,12 +2032,12 @@ PinnedVerificationKey { ), Sum( Constant( - 0x0000000000000000000000000000000000000000000000000000000000000002, + 0x0000000000000000000000000000000000000000000000000000000000000003, ), Negated( Fixed { - query_index: 19, - column_index: 19, + query_index: 20, + column_index: 20, rotation: Rotation( 0, ), @@ -2095,12 +2047,12 @@ PinnedVerificationKey { ), Sum( Constant( - 0x0000000000000000000000000000000000000000000000000000000000000003, + 0x0000000000000000000000000000000000000000000000000000000000000004, ), Negated( Fixed { - query_index: 19, - column_index: 19, + query_index: 20, + column_index: 20, rotation: Rotation( 0, ), @@ -2199,8 +2151,8 @@ PinnedVerificationKey { Product( Product( Fixed { - query_index: 19, - column_index: 19, + query_index: 20, + column_index: 20, rotation: Rotation( 0, ), @@ -2211,8 +2163,8 @@ PinnedVerificationKey { ), Negated( Fixed { - query_index: 19, - column_index: 19, + query_index: 20, + column_index: 20, rotation: Rotation( 0, ), @@ -2222,12 +2174,12 @@ PinnedVerificationKey { ), Sum( Constant( - 0x0000000000000000000000000000000000000000000000000000000000000002, + 0x0000000000000000000000000000000000000000000000000000000000000003, ), Negated( Fixed { - query_index: 19, - column_index: 19, + query_index: 20, + column_index: 20, rotation: Rotation( 0, ), @@ -2237,12 +2189,12 @@ PinnedVerificationKey { ), Sum( Constant( - 0x0000000000000000000000000000000000000000000000000000000000000003, + 0x0000000000000000000000000000000000000000000000000000000000000004, ), Negated( Fixed { - query_index: 19, - column_index: 19, + query_index: 20, + column_index: 20, rotation: Rotation( 0, ), @@ -2341,8 +2293,8 @@ PinnedVerificationKey { Product( Product( Fixed { - query_index: 19, - column_index: 19, + query_index: 20, + column_index: 20, rotation: Rotation( 0, ), @@ -2353,8 +2305,8 @@ PinnedVerificationKey { ), Negated( Fixed { - query_index: 19, - column_index: 19, + query_index: 20, + column_index: 20, rotation: Rotation( 0, ), @@ -2364,12 +2316,12 @@ PinnedVerificationKey { ), Sum( Constant( - 0x0000000000000000000000000000000000000000000000000000000000000002, + 0x0000000000000000000000000000000000000000000000000000000000000003, ), Negated( Fixed { - query_index: 19, - column_index: 19, + query_index: 20, + column_index: 20, rotation: Rotation( 0, ), @@ -2379,12 +2331,12 @@ PinnedVerificationKey { ), Sum( Constant( - 0x0000000000000000000000000000000000000000000000000000000000000003, + 0x0000000000000000000000000000000000000000000000000000000000000004, ), Negated( Fixed { - query_index: 19, - column_index: 19, + query_index: 20, + column_index: 20, rotation: Rotation( 0, ), @@ -2441,8 +2393,8 @@ PinnedVerificationKey { Product( Product( Fixed { - query_index: 19, - column_index: 19, + query_index: 20, + column_index: 20, rotation: Rotation( 0, ), @@ -2453,8 +2405,8 @@ PinnedVerificationKey { ), Negated( Fixed { - query_index: 19, - column_index: 19, + query_index: 20, + column_index: 20, rotation: Rotation( 0, ), @@ -2464,12 +2416,12 @@ PinnedVerificationKey { ), Sum( Constant( - 0x0000000000000000000000000000000000000000000000000000000000000002, + 0x0000000000000000000000000000000000000000000000000000000000000003, ), Negated( Fixed { - query_index: 19, - column_index: 19, + query_index: 20, + column_index: 20, rotation: Rotation( 0, ), @@ -2479,12 +2431,12 @@ PinnedVerificationKey { ), Sum( Constant( - 0x0000000000000000000000000000000000000000000000000000000000000003, + 0x0000000000000000000000000000000000000000000000000000000000000004, ), Negated( Fixed { - query_index: 19, - column_index: 19, + query_index: 20, + column_index: 20, rotation: Rotation( 0, ), @@ -2541,8 +2493,8 @@ PinnedVerificationKey { Product( Product( Fixed { - query_index: 19, - column_index: 19, + query_index: 20, + column_index: 20, rotation: Rotation( 0, ), @@ -2553,8 +2505,8 @@ PinnedVerificationKey { ), Negated( Fixed { - query_index: 19, - column_index: 19, + query_index: 20, + column_index: 20, rotation: Rotation( 0, ), @@ -2564,12 +2516,12 @@ PinnedVerificationKey { ), Sum( Constant( - 0x0000000000000000000000000000000000000000000000000000000000000002, + 0x0000000000000000000000000000000000000000000000000000000000000003, ), Negated( Fixed { - query_index: 19, - column_index: 19, + query_index: 20, + column_index: 20, rotation: Rotation( 0, ), @@ -2579,12 +2531,12 @@ PinnedVerificationKey { ), Sum( Constant( - 0x0000000000000000000000000000000000000000000000000000000000000003, + 0x0000000000000000000000000000000000000000000000000000000000000004, ), Negated( Fixed { - query_index: 19, - column_index: 19, + query_index: 20, + column_index: 20, rotation: Rotation( 0, ), @@ -2641,8 +2593,8 @@ PinnedVerificationKey { Product( Product( Fixed { - query_index: 19, - column_index: 19, + query_index: 20, + column_index: 20, rotation: Rotation( 0, ), @@ -2653,8 +2605,8 @@ PinnedVerificationKey { ), Negated( Fixed { - query_index: 19, - column_index: 19, + query_index: 20, + column_index: 20, rotation: Rotation( 0, ), @@ -2664,12 +2616,12 @@ PinnedVerificationKey { ), Sum( Constant( - 0x0000000000000000000000000000000000000000000000000000000000000002, + 0x0000000000000000000000000000000000000000000000000000000000000003, ), Negated( Fixed { - query_index: 19, - column_index: 19, + query_index: 20, + column_index: 20, rotation: Rotation( 0, ), @@ -2679,12 +2631,12 @@ PinnedVerificationKey { ), Sum( Constant( - 0x0000000000000000000000000000000000000000000000000000000000000003, + 0x0000000000000000000000000000000000000000000000000000000000000004, ), Negated( Fixed { - query_index: 19, - column_index: 19, + query_index: 20, + column_index: 20, rotation: Rotation( 0, ), @@ -2741,8 +2693,8 @@ PinnedVerificationKey { Product( Product( Fixed { - query_index: 19, - column_index: 19, + query_index: 20, + column_index: 20, rotation: Rotation( 0, ), @@ -2753,8 +2705,8 @@ PinnedVerificationKey { ), Negated( Fixed { - query_index: 19, - column_index: 19, + query_index: 20, + column_index: 20, rotation: Rotation( 0, ), @@ -2764,12 +2716,12 @@ PinnedVerificationKey { ), Sum( Constant( - 0x0000000000000000000000000000000000000000000000000000000000000002, + 0x0000000000000000000000000000000000000000000000000000000000000003, ), Negated( Fixed { - query_index: 19, - column_index: 19, + query_index: 20, + column_index: 20, rotation: Rotation( 0, ), @@ -2779,12 +2731,12 @@ PinnedVerificationKey { ), Sum( Constant( - 0x0000000000000000000000000000000000000000000000000000000000000003, + 0x0000000000000000000000000000000000000000000000000000000000000004, ), Negated( Fixed { - query_index: 19, - column_index: 19, + query_index: 20, + column_index: 20, rotation: Rotation( 0, ), @@ -2870,8 +2822,8 @@ PinnedVerificationKey { Product( Product( Fixed { - query_index: 19, - column_index: 19, + query_index: 20, + column_index: 20, rotation: Rotation( 0, ), @@ -2882,8 +2834,8 @@ PinnedVerificationKey { ), Negated( Fixed { - query_index: 19, - column_index: 19, + query_index: 20, + column_index: 20, rotation: Rotation( 0, ), @@ -2893,12 +2845,12 @@ PinnedVerificationKey { ), Sum( Constant( - 0x0000000000000000000000000000000000000000000000000000000000000002, + 0x0000000000000000000000000000000000000000000000000000000000000003, ), Negated( Fixed { - query_index: 19, - column_index: 19, + query_index: 20, + column_index: 20, rotation: Rotation( 0, ), @@ -2908,12 +2860,12 @@ PinnedVerificationKey { ), Sum( Constant( - 0x0000000000000000000000000000000000000000000000000000000000000003, + 0x0000000000000000000000000000000000000000000000000000000000000004, ), Negated( Fixed { - query_index: 19, - column_index: 19, + query_index: 20, + column_index: 20, rotation: Rotation( 0, ), @@ -3001,8 +2953,8 @@ PinnedVerificationKey { Product( Product( Fixed { - query_index: 18, - column_index: 18, + query_index: 19, + column_index: 19, rotation: Rotation( 0, ), @@ -3013,8 +2965,8 @@ PinnedVerificationKey { ), Negated( Fixed { - query_index: 18, - column_index: 18, + query_index: 19, + column_index: 19, rotation: Rotation( 0, ), @@ -3024,12 +2976,12 @@ PinnedVerificationKey { ), Sum( Constant( - 0x0000000000000000000000000000000000000000000000000000000000000002, + 0x0000000000000000000000000000000000000000000000000000000000000003, ), Negated( Fixed { - query_index: 18, - column_index: 18, + query_index: 19, + column_index: 19, rotation: Rotation( 0, ), @@ -3039,12 +2991,12 @@ PinnedVerificationKey { ), Sum( Constant( - 0x0000000000000000000000000000000000000000000000000000000000000003, + 0x0000000000000000000000000000000000000000000000000000000000000004, ), Negated( Fixed { - query_index: 18, - column_index: 18, + query_index: 19, + column_index: 19, rotation: Rotation( 0, ), @@ -3054,12 +3006,12 @@ PinnedVerificationKey { ), Sum( Constant( - 0x0000000000000000000000000000000000000000000000000000000000000004, + 0x0000000000000000000000000000000000000000000000000000000000000005, ), Negated( Fixed { - query_index: 18, - column_index: 18, + query_index: 19, + column_index: 19, rotation: Rotation( 0, ), @@ -3073,8 +3025,8 @@ PinnedVerificationKey { ), Negated( Fixed { - query_index: 18, - column_index: 18, + query_index: 19, + column_index: 19, rotation: Rotation( 0, ), @@ -3171,8 +3123,8 @@ PinnedVerificationKey { Product( Product( Fixed { - query_index: 18, - column_index: 18, + query_index: 19, + column_index: 19, rotation: Rotation( 0, ), @@ -3183,8 +3135,8 @@ PinnedVerificationKey { ), Negated( Fixed { - query_index: 18, - column_index: 18, + query_index: 19, + column_index: 19, rotation: Rotation( 0, ), @@ -3198,8 +3150,8 @@ PinnedVerificationKey { ), Negated( Fixed { - query_index: 18, - column_index: 18, + query_index: 19, + column_index: 19, rotation: Rotation( 0, ), @@ -3209,12 +3161,12 @@ PinnedVerificationKey { ), Sum( Constant( - 0x0000000000000000000000000000000000000000000000000000000000000003, + 0x0000000000000000000000000000000000000000000000000000000000000004, ), Negated( Fixed { - query_index: 18, - column_index: 18, + query_index: 19, + column_index: 19, rotation: Rotation( 0, ), @@ -3224,12 +3176,12 @@ PinnedVerificationKey { ), Sum( Constant( - 0x0000000000000000000000000000000000000000000000000000000000000004, + 0x0000000000000000000000000000000000000000000000000000000000000005, ), Negated( Fixed { - query_index: 18, - column_index: 18, + query_index: 19, + column_index: 19, rotation: Rotation( 0, ), @@ -3239,12 +3191,12 @@ PinnedVerificationKey { ), Sum( Constant( - 0x0000000000000000000000000000000000000000000000000000000000000005, + 0x0000000000000000000000000000000000000000000000000000000000000006, ), Negated( Fixed { - query_index: 18, - column_index: 18, + query_index: 19, + column_index: 19, rotation: Rotation( 0, ), @@ -3278,8 +3230,8 @@ PinnedVerificationKey { Product( Product( Fixed { - query_index: 18, - column_index: 18, + query_index: 19, + column_index: 19, rotation: Rotation( 0, ), @@ -3290,8 +3242,8 @@ PinnedVerificationKey { ), Negated( Fixed { - query_index: 18, - column_index: 18, + query_index: 19, + column_index: 19, rotation: Rotation( 0, ), @@ -3305,8 +3257,8 @@ PinnedVerificationKey { ), Negated( Fixed { - query_index: 18, - column_index: 18, + query_index: 19, + column_index: 19, rotation: Rotation( 0, ), @@ -3316,12 +3268,12 @@ PinnedVerificationKey { ), Sum( Constant( - 0x0000000000000000000000000000000000000000000000000000000000000003, + 0x0000000000000000000000000000000000000000000000000000000000000004, ), Negated( Fixed { - query_index: 18, - column_index: 18, + query_index: 19, + column_index: 19, rotation: Rotation( 0, ), @@ -3331,12 +3283,12 @@ PinnedVerificationKey { ), Sum( Constant( - 0x0000000000000000000000000000000000000000000000000000000000000004, + 0x0000000000000000000000000000000000000000000000000000000000000005, ), Negated( Fixed { - query_index: 18, - column_index: 18, + query_index: 19, + column_index: 19, rotation: Rotation( 0, ), @@ -3346,12 +3298,12 @@ PinnedVerificationKey { ), Sum( Constant( - 0x0000000000000000000000000000000000000000000000000000000000000005, + 0x0000000000000000000000000000000000000000000000000000000000000006, ), Negated( Fixed { - query_index: 18, - column_index: 18, + query_index: 19, + column_index: 19, rotation: Rotation( 0, ), @@ -3385,8 +3337,8 @@ PinnedVerificationKey { Product( Product( Fixed { - query_index: 18, - column_index: 18, + query_index: 19, + column_index: 19, rotation: Rotation( 0, ), @@ -3397,8 +3349,8 @@ PinnedVerificationKey { ), Negated( Fixed { - query_index: 18, - column_index: 18, + query_index: 19, + column_index: 19, rotation: Rotation( 0, ), @@ -3412,8 +3364,8 @@ PinnedVerificationKey { ), Negated( Fixed { - query_index: 18, - column_index: 18, + query_index: 19, + column_index: 19, rotation: Rotation( 0, ), @@ -3423,12 +3375,12 @@ PinnedVerificationKey { ), Sum( Constant( - 0x0000000000000000000000000000000000000000000000000000000000000003, + 0x0000000000000000000000000000000000000000000000000000000000000004, ), Negated( Fixed { - query_index: 18, - column_index: 18, + query_index: 19, + column_index: 19, rotation: Rotation( 0, ), @@ -3438,12 +3390,12 @@ PinnedVerificationKey { ), Sum( Constant( - 0x0000000000000000000000000000000000000000000000000000000000000004, + 0x0000000000000000000000000000000000000000000000000000000000000005, ), Negated( Fixed { - query_index: 18, - column_index: 18, + query_index: 19, + column_index: 19, rotation: Rotation( 0, ), @@ -3453,12 +3405,12 @@ PinnedVerificationKey { ), Sum( Constant( - 0x0000000000000000000000000000000000000000000000000000000000000005, + 0x0000000000000000000000000000000000000000000000000000000000000006, ), Negated( Fixed { - query_index: 18, - column_index: 18, + query_index: 19, + column_index: 19, rotation: Rotation( 0, ), @@ -3525,8 +3477,8 @@ PinnedVerificationKey { Product( Product( Fixed { - query_index: 18, - column_index: 18, + query_index: 19, + column_index: 19, rotation: Rotation( 0, ), @@ -3537,8 +3489,8 @@ PinnedVerificationKey { ), Negated( Fixed { - query_index: 18, - column_index: 18, + query_index: 19, + column_index: 19, rotation: Rotation( 0, ), @@ -3552,8 +3504,8 @@ PinnedVerificationKey { ), Negated( Fixed { - query_index: 18, - column_index: 18, + query_index: 19, + column_index: 19, rotation: Rotation( 0, ), @@ -3563,12 +3515,12 @@ PinnedVerificationKey { ), Sum( Constant( - 0x0000000000000000000000000000000000000000000000000000000000000003, + 0x0000000000000000000000000000000000000000000000000000000000000004, ), Negated( Fixed { - query_index: 18, - column_index: 18, + query_index: 19, + column_index: 19, rotation: Rotation( 0, ), @@ -3578,12 +3530,12 @@ PinnedVerificationKey { ), Sum( Constant( - 0x0000000000000000000000000000000000000000000000000000000000000004, + 0x0000000000000000000000000000000000000000000000000000000000000005, ), Negated( Fixed { - query_index: 18, - column_index: 18, + query_index: 19, + column_index: 19, rotation: Rotation( 0, ), @@ -3593,12 +3545,12 @@ PinnedVerificationKey { ), Sum( Constant( - 0x0000000000000000000000000000000000000000000000000000000000000005, + 0x0000000000000000000000000000000000000000000000000000000000000006, ), Negated( Fixed { - query_index: 18, - column_index: 18, + query_index: 19, + column_index: 19, rotation: Rotation( 0, ), @@ -3757,8 +3709,8 @@ PinnedVerificationKey { Product( Product( Fixed { - query_index: 18, - column_index: 18, + query_index: 19, + column_index: 19, rotation: Rotation( 0, ), @@ -3769,8 +3721,8 @@ PinnedVerificationKey { ), Negated( Fixed { - query_index: 18, - column_index: 18, + query_index: 19, + column_index: 19, rotation: Rotation( 0, ), @@ -3784,8 +3736,8 @@ PinnedVerificationKey { ), Negated( Fixed { - query_index: 18, - column_index: 18, + query_index: 19, + column_index: 19, rotation: Rotation( 0, ), @@ -3795,12 +3747,12 @@ PinnedVerificationKey { ), Sum( Constant( - 0x0000000000000000000000000000000000000000000000000000000000000003, + 0x0000000000000000000000000000000000000000000000000000000000000004, ), Negated( Fixed { - query_index: 18, - column_index: 18, + query_index: 19, + column_index: 19, rotation: Rotation( 0, ), @@ -3810,12 +3762,12 @@ PinnedVerificationKey { ), Sum( Constant( - 0x0000000000000000000000000000000000000000000000000000000000000004, + 0x0000000000000000000000000000000000000000000000000000000000000005, ), Negated( Fixed { - query_index: 18, - column_index: 18, + query_index: 19, + column_index: 19, rotation: Rotation( 0, ), @@ -3825,12 +3777,12 @@ PinnedVerificationKey { ), Sum( Constant( - 0x0000000000000000000000000000000000000000000000000000000000000005, + 0x0000000000000000000000000000000000000000000000000000000000000006, ), Negated( Fixed { - query_index: 18, - column_index: 18, + query_index: 19, + column_index: 19, rotation: Rotation( 0, ), @@ -3926,8 +3878,8 @@ PinnedVerificationKey { Product( Product( Fixed { - query_index: 18, - column_index: 18, + query_index: 19, + column_index: 19, rotation: Rotation( 0, ), @@ -3938,8 +3890,8 @@ PinnedVerificationKey { ), Negated( Fixed { - query_index: 18, - column_index: 18, + query_index: 19, + column_index: 19, rotation: Rotation( 0, ), @@ -3953,8 +3905,8 @@ PinnedVerificationKey { ), Negated( Fixed { - query_index: 18, - column_index: 18, + query_index: 19, + column_index: 19, rotation: Rotation( 0, ), @@ -3964,12 +3916,12 @@ PinnedVerificationKey { ), Sum( Constant( - 0x0000000000000000000000000000000000000000000000000000000000000003, + 0x0000000000000000000000000000000000000000000000000000000000000004, ), Negated( Fixed { - query_index: 18, - column_index: 18, + query_index: 19, + column_index: 19, rotation: Rotation( 0, ), @@ -3979,12 +3931,12 @@ PinnedVerificationKey { ), Sum( Constant( - 0x0000000000000000000000000000000000000000000000000000000000000004, + 0x0000000000000000000000000000000000000000000000000000000000000005, ), Negated( Fixed { - query_index: 18, - column_index: 18, + query_index: 19, + column_index: 19, rotation: Rotation( 0, ), @@ -3994,12 +3946,12 @@ PinnedVerificationKey { ), Sum( Constant( - 0x0000000000000000000000000000000000000000000000000000000000000005, + 0x0000000000000000000000000000000000000000000000000000000000000006, ), Negated( Fixed { - query_index: 18, - column_index: 18, + query_index: 19, + column_index: 19, rotation: Rotation( 0, ), @@ -4188,21 +4140,37 @@ PinnedVerificationKey { Product( Product( Product( - Fixed { - query_index: 20, - column_index: 20, - rotation: Rotation( - 0, + Product( + Fixed { + query_index: 19, + column_index: 19, + rotation: Rotation( + 0, + ), + }, + Sum( + Constant( + 0x0000000000000000000000000000000000000000000000000000000000000001, + ), + Negated( + Fixed { + query_index: 19, + column_index: 19, + rotation: Rotation( + 0, + ), + }, + ), ), - }, + ), Sum( Constant( 0x0000000000000000000000000000000000000000000000000000000000000002, ), Negated( Fixed { - query_index: 20, - column_index: 20, + query_index: 19, + column_index: 19, rotation: Rotation( 0, ), @@ -4216,8 +4184,8 @@ PinnedVerificationKey { ), Negated( Fixed { - query_index: 20, - column_index: 20, + query_index: 19, + column_index: 19, rotation: Rotation( 0, ), @@ -4227,12 +4195,12 @@ PinnedVerificationKey { ), Sum( Constant( - 0x0000000000000000000000000000000000000000000000000000000000000004, + 0x0000000000000000000000000000000000000000000000000000000000000005, ), Negated( Fixed { - query_index: 20, - column_index: 20, + query_index: 19, + column_index: 19, rotation: Rotation( 0, ), @@ -4242,12 +4210,12 @@ PinnedVerificationKey { ), Sum( Constant( - 0x0000000000000000000000000000000000000000000000000000000000000005, + 0x0000000000000000000000000000000000000000000000000000000000000006, ), Negated( Fixed { - query_index: 20, - column_index: 20, + query_index: 19, + column_index: 19, rotation: Rotation( 0, ), @@ -4312,21 +4280,37 @@ PinnedVerificationKey { Product( Product( Product( - Fixed { - query_index: 20, - column_index: 20, - rotation: Rotation( - 0, + Product( + Fixed { + query_index: 19, + column_index: 19, + rotation: Rotation( + 0, + ), + }, + Sum( + Constant( + 0x0000000000000000000000000000000000000000000000000000000000000001, + ), + Negated( + Fixed { + query_index: 19, + column_index: 19, + rotation: Rotation( + 0, + ), + }, + ), ), - }, + ), Sum( Constant( 0x0000000000000000000000000000000000000000000000000000000000000002, ), Negated( Fixed { - query_index: 20, - column_index: 20, + query_index: 19, + column_index: 19, rotation: Rotation( 0, ), @@ -4340,8 +4324,8 @@ PinnedVerificationKey { ), Negated( Fixed { - query_index: 20, - column_index: 20, + query_index: 19, + column_index: 19, rotation: Rotation( 0, ), @@ -4351,12 +4335,12 @@ PinnedVerificationKey { ), Sum( Constant( - 0x0000000000000000000000000000000000000000000000000000000000000004, + 0x0000000000000000000000000000000000000000000000000000000000000005, ), Negated( Fixed { - query_index: 20, - column_index: 20, + query_index: 19, + column_index: 19, rotation: Rotation( 0, ), @@ -4366,12 +4350,12 @@ PinnedVerificationKey { ), Sum( Constant( - 0x0000000000000000000000000000000000000000000000000000000000000005, + 0x0000000000000000000000000000000000000000000000000000000000000006, ), Negated( Fixed { - query_index: 20, - column_index: 20, + query_index: 19, + column_index: 19, rotation: Rotation( 0, ), @@ -4528,21 +4512,37 @@ PinnedVerificationKey { Product( Product( Product( - Fixed { - query_index: 20, - column_index: 20, - rotation: Rotation( - 0, + Product( + Fixed { + query_index: 19, + column_index: 19, + rotation: Rotation( + 0, + ), + }, + Sum( + Constant( + 0x0000000000000000000000000000000000000000000000000000000000000001, + ), + Negated( + Fixed { + query_index: 19, + column_index: 19, + rotation: Rotation( + 0, + ), + }, + ), ), - }, + ), Sum( Constant( 0x0000000000000000000000000000000000000000000000000000000000000002, ), Negated( Fixed { - query_index: 20, - column_index: 20, + query_index: 19, + column_index: 19, rotation: Rotation( 0, ), @@ -4556,8 +4556,8 @@ PinnedVerificationKey { ), Negated( Fixed { - query_index: 20, - column_index: 20, + query_index: 19, + column_index: 19, rotation: Rotation( 0, ), @@ -4567,12 +4567,12 @@ PinnedVerificationKey { ), Sum( Constant( - 0x0000000000000000000000000000000000000000000000000000000000000004, + 0x0000000000000000000000000000000000000000000000000000000000000005, ), Negated( Fixed { - query_index: 20, - column_index: 20, + query_index: 19, + column_index: 19, rotation: Rotation( 0, ), @@ -4582,12 +4582,12 @@ PinnedVerificationKey { ), Sum( Constant( - 0x0000000000000000000000000000000000000000000000000000000000000005, + 0x0000000000000000000000000000000000000000000000000000000000000006, ), Negated( Fixed { - query_index: 20, - column_index: 20, + query_index: 19, + column_index: 19, rotation: Rotation( 0, ), @@ -4681,36 +4681,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, - ), - }, - ), - ), - ), - Sum( + Product( + Fixed { + query_index: 19, + column_index: 19, + rotation: Rotation( + 0, + ), + }, + Sum( + Constant( + 0x0000000000000000000000000000000000000000000000000000000000000001, + ), + Negated( + Fixed { + query_index: 19, + column_index: 19, + rotation: Rotation( + 0, + ), + }, + ), + ), + ), + Sum( + Constant( + 0x0000000000000000000000000000000000000000000000000000000000000002, + ), + Negated( + Fixed { + query_index: 19, + column_index: 19, + rotation: Rotation( + 0, + ), + }, + ), + ), + ), + Sum( Constant( 0x0000000000000000000000000000000000000000000000000000000000000003, ), Negated( Fixed { - query_index: 20, - column_index: 20, + query_index: 19, + column_index: 19, rotation: Rotation( 0, ), @@ -4720,12 +4736,12 @@ PinnedVerificationKey { ), Sum( Constant( - 0x0000000000000000000000000000000000000000000000000000000000000004, + 0x0000000000000000000000000000000000000000000000000000000000000005, ), Negated( Fixed { - query_index: 20, - column_index: 20, + query_index: 19, + column_index: 19, rotation: Rotation( 0, ), @@ -4735,12 +4751,12 @@ PinnedVerificationKey { ), Sum( Constant( - 0x0000000000000000000000000000000000000000000000000000000000000005, + 0x0000000000000000000000000000000000000000000000000000000000000006, ), Negated( Fixed { - query_index: 20, - column_index: 20, + query_index: 19, + column_index: 19, rotation: Rotation( 0, ), @@ -4865,32 +4881,16 @@ PinnedVerificationKey { Product( 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, - ), - }, - ), + Fixed { + query_index: 20, + column_index: 20, + rotation: Rotation( + 0, ), - ), + }, Sum( Constant( - 0x0000000000000000000000000000000000000000000000000000000000000003, + 0x0000000000000000000000000000000000000000000000000000000000000001, ), Negated( Fixed { @@ -4905,7 +4905,7 @@ PinnedVerificationKey { ), Sum( Constant( - 0x0000000000000000000000000000000000000000000000000000000000000004, + 0x0000000000000000000000000000000000000000000000000000000000000002, ), Negated( Fixed { @@ -4920,7 +4920,7 @@ PinnedVerificationKey { ), Sum( Constant( - 0x0000000000000000000000000000000000000000000000000000000000000005, + 0x0000000000000000000000000000000000000000000000000000000000000004, ), Negated( Fixed { @@ -5019,37 +5019,21 @@ PinnedVerificationKey { 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, - ), - }, - ), + Fixed { + query_index: 20, + column_index: 20, + rotation: Rotation( + 0, ), - ), + }, Sum( Constant( - 0x0000000000000000000000000000000000000000000000000000000000000003, + 0x0000000000000000000000000000000000000000000000000000000000000001, ), Negated( Fixed { - query_index: 21, - column_index: 21, + query_index: 20, + column_index: 20, rotation: Rotation( 0, ), @@ -5059,12 +5043,12 @@ PinnedVerificationKey { ), Sum( Constant( - 0x0000000000000000000000000000000000000000000000000000000000000004, + 0x0000000000000000000000000000000000000000000000000000000000000002, ), Negated( Fixed { - query_index: 21, - column_index: 21, + query_index: 20, + column_index: 20, rotation: Rotation( 0, ), @@ -5074,12 +5058,12 @@ PinnedVerificationKey { ), Sum( Constant( - 0x0000000000000000000000000000000000000000000000000000000000000005, + 0x0000000000000000000000000000000000000000000000000000000000000003, ), Negated( Fixed { - query_index: 21, - column_index: 21, + query_index: 20, + column_index: 20, rotation: Rotation( 0, ), @@ -5110,37 +5094,21 @@ PinnedVerificationKey { 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, - ), - }, - ), + Fixed { + query_index: 20, + column_index: 20, + rotation: Rotation( + 0, ), - ), + }, Sum( Constant( - 0x0000000000000000000000000000000000000000000000000000000000000003, + 0x0000000000000000000000000000000000000000000000000000000000000001, ), Negated( Fixed { - query_index: 21, - column_index: 21, + query_index: 20, + column_index: 20, rotation: Rotation( 0, ), @@ -5150,12 +5118,12 @@ PinnedVerificationKey { ), Sum( Constant( - 0x0000000000000000000000000000000000000000000000000000000000000004, + 0x0000000000000000000000000000000000000000000000000000000000000002, ), Negated( Fixed { - query_index: 21, - column_index: 21, + query_index: 20, + column_index: 20, rotation: Rotation( 0, ), @@ -5165,12 +5133,12 @@ PinnedVerificationKey { ), Sum( Constant( - 0x0000000000000000000000000000000000000000000000000000000000000005, + 0x0000000000000000000000000000000000000000000000000000000000000003, ), Negated( Fixed { - query_index: 21, - column_index: 21, + query_index: 20, + column_index: 20, rotation: Rotation( 0, ), @@ -5201,37 +5169,21 @@ PinnedVerificationKey { 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, - ), - }, - ), + Fixed { + query_index: 20, + column_index: 20, + rotation: Rotation( + 0, ), - ), + }, Sum( Constant( - 0x0000000000000000000000000000000000000000000000000000000000000003, + 0x0000000000000000000000000000000000000000000000000000000000000001, ), Negated( Fixed { - query_index: 21, - column_index: 21, + query_index: 20, + column_index: 20, rotation: Rotation( 0, ), @@ -5241,12 +5193,12 @@ PinnedVerificationKey { ), Sum( Constant( - 0x0000000000000000000000000000000000000000000000000000000000000004, + 0x0000000000000000000000000000000000000000000000000000000000000002, ), Negated( Fixed { - query_index: 21, - column_index: 21, + query_index: 20, + column_index: 20, rotation: Rotation( 0, ), @@ -5256,12 +5208,12 @@ PinnedVerificationKey { ), Sum( Constant( - 0x0000000000000000000000000000000000000000000000000000000000000005, + 0x0000000000000000000000000000000000000000000000000000000000000003, ), Negated( Fixed { - query_index: 21, - column_index: 21, + query_index: 20, + column_index: 20, rotation: Rotation( 0, ), @@ -5325,37 +5277,21 @@ PinnedVerificationKey { 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, - ), - }, - ), + Fixed { + query_index: 20, + column_index: 20, + rotation: Rotation( + 0, ), - ), + }, Sum( Constant( - 0x0000000000000000000000000000000000000000000000000000000000000003, + 0x0000000000000000000000000000000000000000000000000000000000000001, ), Negated( Fixed { - query_index: 21, - column_index: 21, + query_index: 20, + column_index: 20, rotation: Rotation( 0, ), @@ -5365,12 +5301,12 @@ PinnedVerificationKey { ), Sum( Constant( - 0x0000000000000000000000000000000000000000000000000000000000000004, + 0x0000000000000000000000000000000000000000000000000000000000000002, ), Negated( Fixed { - query_index: 21, - column_index: 21, + query_index: 20, + column_index: 20, rotation: Rotation( 0, ), @@ -5380,12 +5316,12 @@ PinnedVerificationKey { ), Sum( Constant( - 0x0000000000000000000000000000000000000000000000000000000000000005, + 0x0000000000000000000000000000000000000000000000000000000000000003, ), Negated( Fixed { - query_index: 21, - column_index: 21, + query_index: 20, + column_index: 20, rotation: Rotation( 0, ), @@ -5521,57 +5457,41 @@ PinnedVerificationKey { ), 0x0000000000000000000000000000000000000000000000000000000000000002, ), - Negated( - Constant( - 0x0000000000000000000000000000000000000000000000000000000000000001, - ), - ), - ), - Advice { - query_index: 1, - column_index: 1, - rotation: Rotation( - 0, - ), - }, - ), - ), - ), - Product( - 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, - ), - }, - ), + Negated( + Constant( + 0x0000000000000000000000000000000000000000000000000000000000000001, ), ), + ), + Advice { + query_index: 1, + column_index: 1, + rotation: Rotation( + 0, + ), + }, + ), + ), + ), + Product( + Product( + Product( + Product( + Fixed { + query_index: 20, + column_index: 20, + rotation: Rotation( + 0, + ), + }, Sum( Constant( - 0x0000000000000000000000000000000000000000000000000000000000000003, + 0x0000000000000000000000000000000000000000000000000000000000000001, ), Negated( Fixed { - query_index: 21, - column_index: 21, + query_index: 20, + column_index: 20, rotation: Rotation( 0, ), @@ -5581,12 +5501,12 @@ PinnedVerificationKey { ), Sum( Constant( - 0x0000000000000000000000000000000000000000000000000000000000000004, + 0x0000000000000000000000000000000000000000000000000000000000000002, ), Negated( Fixed { - query_index: 21, - column_index: 21, + query_index: 20, + column_index: 20, rotation: Rotation( 0, ), @@ -5596,12 +5516,12 @@ PinnedVerificationKey { ), Sum( Constant( - 0x0000000000000000000000000000000000000000000000000000000000000005, + 0x0000000000000000000000000000000000000000000000000000000000000003, ), Negated( Fixed { - query_index: 21, - column_index: 21, + query_index: 20, + column_index: 20, rotation: Rotation( 0, ), @@ -5694,37 +5614,21 @@ PinnedVerificationKey { 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, - ), - }, - ), + Fixed { + query_index: 20, + column_index: 20, + rotation: Rotation( + 0, ), - ), + }, Sum( Constant( - 0x0000000000000000000000000000000000000000000000000000000000000003, + 0x0000000000000000000000000000000000000000000000000000000000000001, ), Negated( Fixed { - query_index: 21, - column_index: 21, + query_index: 20, + column_index: 20, rotation: Rotation( 0, ), @@ -5734,12 +5638,12 @@ PinnedVerificationKey { ), Sum( Constant( - 0x0000000000000000000000000000000000000000000000000000000000000004, + 0x0000000000000000000000000000000000000000000000000000000000000002, ), Negated( Fixed { - query_index: 21, - column_index: 21, + query_index: 20, + column_index: 20, rotation: Rotation( 0, ), @@ -5749,12 +5653,12 @@ PinnedVerificationKey { ), Sum( Constant( - 0x0000000000000000000000000000000000000000000000000000000000000005, + 0x0000000000000000000000000000000000000000000000000000000000000003, ), Negated( Fixed { - query_index: 21, - column_index: 21, + query_index: 20, + column_index: 20, rotation: Rotation( 0, ), @@ -5943,21 +5847,37 @@ PinnedVerificationKey { Product( Product( Product( - Fixed { - query_index: 20, - column_index: 20, - rotation: Rotation( - 0, + Product( + Fixed { + query_index: 19, + column_index: 19, + rotation: Rotation( + 0, + ), + }, + Sum( + Constant( + 0x0000000000000000000000000000000000000000000000000000000000000001, + ), + Negated( + Fixed { + query_index: 19, + column_index: 19, + rotation: Rotation( + 0, + ), + }, + ), ), - }, + ), Sum( Constant( - 0x0000000000000000000000000000000000000000000000000000000000000001, + 0x0000000000000000000000000000000000000000000000000000000000000002, ), Negated( Fixed { - query_index: 20, - column_index: 20, + query_index: 19, + column_index: 19, rotation: Rotation( 0, ), @@ -5967,12 +5887,12 @@ PinnedVerificationKey { ), Sum( Constant( - 0x0000000000000000000000000000000000000000000000000000000000000002, + 0x0000000000000000000000000000000000000000000000000000000000000003, ), Negated( Fixed { - query_index: 20, - column_index: 20, + query_index: 19, + column_index: 19, rotation: Rotation( 0, ), @@ -5986,8 +5906,8 @@ PinnedVerificationKey { ), Negated( Fixed { - query_index: 20, - column_index: 20, + query_index: 19, + column_index: 19, rotation: Rotation( 0, ), @@ -5997,12 +5917,12 @@ PinnedVerificationKey { ), Sum( Constant( - 0x0000000000000000000000000000000000000000000000000000000000000005, + 0x0000000000000000000000000000000000000000000000000000000000000006, ), Negated( Fixed { - query_index: 20, - column_index: 20, + query_index: 19, + column_index: 19, rotation: Rotation( 0, ), @@ -6067,21 +5987,37 @@ PinnedVerificationKey { Product( Product( Product( - Fixed { - query_index: 20, - column_index: 20, - rotation: Rotation( - 0, + Product( + Fixed { + query_index: 19, + column_index: 19, + rotation: Rotation( + 0, + ), + }, + Sum( + Constant( + 0x0000000000000000000000000000000000000000000000000000000000000001, + ), + Negated( + Fixed { + query_index: 19, + column_index: 19, + rotation: Rotation( + 0, + ), + }, + ), ), - }, + ), Sum( Constant( - 0x0000000000000000000000000000000000000000000000000000000000000001, + 0x0000000000000000000000000000000000000000000000000000000000000002, ), Negated( Fixed { - query_index: 20, - column_index: 20, + query_index: 19, + column_index: 19, rotation: Rotation( 0, ), @@ -6091,12 +6027,12 @@ PinnedVerificationKey { ), Sum( Constant( - 0x0000000000000000000000000000000000000000000000000000000000000002, + 0x0000000000000000000000000000000000000000000000000000000000000003, ), Negated( Fixed { - query_index: 20, - column_index: 20, + query_index: 19, + column_index: 19, rotation: Rotation( 0, ), @@ -6110,8 +6046,8 @@ PinnedVerificationKey { ), Negated( Fixed { - query_index: 20, - column_index: 20, + query_index: 19, + column_index: 19, rotation: Rotation( 0, ), @@ -6121,12 +6057,12 @@ PinnedVerificationKey { ), Sum( Constant( - 0x0000000000000000000000000000000000000000000000000000000000000005, + 0x0000000000000000000000000000000000000000000000000000000000000006, ), Negated( Fixed { - query_index: 20, - column_index: 20, + query_index: 19, + column_index: 19, rotation: Rotation( 0, ), @@ -6283,21 +6219,37 @@ PinnedVerificationKey { Product( Product( Product( - Fixed { - query_index: 20, - column_index: 20, - rotation: Rotation( - 0, + Product( + Fixed { + query_index: 19, + column_index: 19, + rotation: Rotation( + 0, + ), + }, + Sum( + Constant( + 0x0000000000000000000000000000000000000000000000000000000000000001, + ), + Negated( + Fixed { + query_index: 19, + column_index: 19, + rotation: Rotation( + 0, + ), + }, + ), ), - }, + ), Sum( Constant( - 0x0000000000000000000000000000000000000000000000000000000000000001, + 0x0000000000000000000000000000000000000000000000000000000000000002, ), Negated( Fixed { - query_index: 20, - column_index: 20, + query_index: 19, + column_index: 19, rotation: Rotation( 0, ), @@ -6307,12 +6259,12 @@ PinnedVerificationKey { ), Sum( Constant( - 0x0000000000000000000000000000000000000000000000000000000000000002, + 0x0000000000000000000000000000000000000000000000000000000000000003, ), Negated( Fixed { - query_index: 20, - column_index: 20, + query_index: 19, + column_index: 19, rotation: Rotation( 0, ), @@ -6326,8 +6278,8 @@ PinnedVerificationKey { ), Negated( Fixed { - query_index: 20, - column_index: 20, + query_index: 19, + column_index: 19, rotation: Rotation( 0, ), @@ -6337,12 +6289,12 @@ PinnedVerificationKey { ), Sum( Constant( - 0x0000000000000000000000000000000000000000000000000000000000000005, + 0x0000000000000000000000000000000000000000000000000000000000000006, ), Negated( Fixed { - query_index: 20, - column_index: 20, + query_index: 19, + column_index: 19, rotation: Rotation( 0, ), @@ -6436,21 +6388,37 @@ PinnedVerificationKey { Product( Product( Product( - Fixed { - query_index: 20, - column_index: 20, - rotation: Rotation( - 0, + Product( + Fixed { + query_index: 19, + column_index: 19, + rotation: Rotation( + 0, + ), + }, + Sum( + Constant( + 0x0000000000000000000000000000000000000000000000000000000000000001, + ), + Negated( + Fixed { + query_index: 19, + column_index: 19, + rotation: Rotation( + 0, + ), + }, + ), ), - }, + ), Sum( Constant( - 0x0000000000000000000000000000000000000000000000000000000000000001, + 0x0000000000000000000000000000000000000000000000000000000000000002, ), Negated( Fixed { - query_index: 20, - column_index: 20, + query_index: 19, + column_index: 19, rotation: Rotation( 0, ), @@ -6460,12 +6428,12 @@ PinnedVerificationKey { ), Sum( Constant( - 0x0000000000000000000000000000000000000000000000000000000000000002, + 0x0000000000000000000000000000000000000000000000000000000000000003, ), Negated( Fixed { - query_index: 20, - column_index: 20, + query_index: 19, + column_index: 19, rotation: Rotation( 0, ), @@ -6479,8 +6447,8 @@ PinnedVerificationKey { ), Negated( Fixed { - query_index: 20, - column_index: 20, + query_index: 19, + column_index: 19, rotation: Rotation( 0, ), @@ -6490,12 +6458,12 @@ PinnedVerificationKey { ), Sum( Constant( - 0x0000000000000000000000000000000000000000000000000000000000000005, + 0x0000000000000000000000000000000000000000000000000000000000000006, ), Negated( Fixed { - query_index: 20, - column_index: 20, + query_index: 19, + column_index: 19, rotation: Rotation( 0, ), @@ -6621,21 +6589,37 @@ PinnedVerificationKey { Product( Product( Product( - Fixed { - query_index: 20, - column_index: 20, - rotation: Rotation( - 0, + Product( + Fixed { + query_index: 19, + column_index: 19, + rotation: Rotation( + 0, + ), + }, + Sum( + Constant( + 0x0000000000000000000000000000000000000000000000000000000000000001, + ), + Negated( + Fixed { + query_index: 19, + column_index: 19, + rotation: Rotation( + 0, + ), + }, + ), ), - }, + ), Sum( Constant( - 0x0000000000000000000000000000000000000000000000000000000000000001, + 0x0000000000000000000000000000000000000000000000000000000000000002, ), Negated( Fixed { - query_index: 20, - column_index: 20, + query_index: 19, + column_index: 19, rotation: Rotation( 0, ), @@ -6645,12 +6629,12 @@ PinnedVerificationKey { ), Sum( Constant( - 0x0000000000000000000000000000000000000000000000000000000000000002, + 0x0000000000000000000000000000000000000000000000000000000000000003, ), Negated( Fixed { - query_index: 20, - column_index: 20, + query_index: 19, + column_index: 19, rotation: Rotation( 0, ), @@ -6660,12 +6644,12 @@ PinnedVerificationKey { ), Sum( Constant( - 0x0000000000000000000000000000000000000000000000000000000000000003, + 0x0000000000000000000000000000000000000000000000000000000000000004, ), Negated( Fixed { - query_index: 20, - column_index: 20, + query_index: 19, + column_index: 19, rotation: Rotation( 0, ), @@ -6679,8 +6663,8 @@ PinnedVerificationKey { ), Negated( Fixed { - query_index: 20, - column_index: 20, + query_index: 19, + column_index: 19, rotation: Rotation( 0, ), @@ -6749,21 +6733,37 @@ PinnedVerificationKey { Product( Product( Product( - Fixed { - query_index: 20, - column_index: 20, - rotation: Rotation( - 0, + Product( + Fixed { + query_index: 19, + column_index: 19, + rotation: Rotation( + 0, + ), + }, + Sum( + Constant( + 0x0000000000000000000000000000000000000000000000000000000000000001, + ), + Negated( + Fixed { + query_index: 19, + column_index: 19, + rotation: Rotation( + 0, + ), + }, + ), ), - }, + ), Sum( Constant( - 0x0000000000000000000000000000000000000000000000000000000000000001, + 0x0000000000000000000000000000000000000000000000000000000000000002, ), Negated( Fixed { - query_index: 20, - column_index: 20, + query_index: 19, + column_index: 19, rotation: Rotation( 0, ), @@ -6773,12 +6773,12 @@ PinnedVerificationKey { ), Sum( Constant( - 0x0000000000000000000000000000000000000000000000000000000000000002, + 0x0000000000000000000000000000000000000000000000000000000000000003, ), Negated( Fixed { - query_index: 20, - column_index: 20, + query_index: 19, + column_index: 19, rotation: Rotation( 0, ), @@ -6788,12 +6788,12 @@ PinnedVerificationKey { ), Sum( Constant( - 0x0000000000000000000000000000000000000000000000000000000000000003, + 0x0000000000000000000000000000000000000000000000000000000000000004, ), Negated( Fixed { - query_index: 20, - column_index: 20, + query_index: 19, + column_index: 19, rotation: Rotation( 0, ), @@ -6807,8 +6807,8 @@ PinnedVerificationKey { ), Negated( Fixed { - query_index: 20, - column_index: 20, + query_index: 19, + column_index: 19, rotation: Rotation( 0, ), @@ -6916,20 +6916,20 @@ PinnedVerificationKey { Product( Product( Fixed { - query_index: 20, - column_index: 20, + query_index: 21, + column_index: 21, rotation: Rotation( 0, ), }, Sum( Constant( - 0x0000000000000000000000000000000000000000000000000000000000000001, + 0x0000000000000000000000000000000000000000000000000000000000000002, ), Negated( Fixed { - query_index: 20, - column_index: 20, + query_index: 21, + column_index: 21, rotation: Rotation( 0, ), @@ -6939,12 +6939,12 @@ PinnedVerificationKey { ), Sum( Constant( - 0x0000000000000000000000000000000000000000000000000000000000000002, + 0x0000000000000000000000000000000000000000000000000000000000000003, ), Negated( Fixed { - query_index: 20, - column_index: 20, + query_index: 21, + column_index: 21, rotation: Rotation( 0, ), @@ -6954,12 +6954,12 @@ PinnedVerificationKey { ), Sum( Constant( - 0x0000000000000000000000000000000000000000000000000000000000000003, + 0x0000000000000000000000000000000000000000000000000000000000000004, ), Negated( Fixed { - query_index: 20, - column_index: 20, + query_index: 21, + column_index: 21, rotation: Rotation( 0, ), @@ -6969,12 +6969,12 @@ PinnedVerificationKey { ), Sum( Constant( - 0x0000000000000000000000000000000000000000000000000000000000000004, + 0x0000000000000000000000000000000000000000000000000000000000000005, ), Negated( Fixed { - query_index: 20, - column_index: 20, + query_index: 21, + column_index: 21, rotation: Rotation( 0, ), @@ -7026,20 +7026,20 @@ PinnedVerificationKey { Product( Product( Fixed { - query_index: 20, - column_index: 20, + query_index: 21, + column_index: 21, rotation: Rotation( 0, ), }, Sum( Constant( - 0x0000000000000000000000000000000000000000000000000000000000000001, + 0x0000000000000000000000000000000000000000000000000000000000000002, ), Negated( Fixed { - query_index: 20, - column_index: 20, + query_index: 21, + column_index: 21, rotation: Rotation( 0, ), @@ -7049,12 +7049,12 @@ PinnedVerificationKey { ), Sum( Constant( - 0x0000000000000000000000000000000000000000000000000000000000000002, + 0x0000000000000000000000000000000000000000000000000000000000000003, ), Negated( Fixed { - query_index: 20, - column_index: 20, + query_index: 21, + column_index: 21, rotation: Rotation( 0, ), @@ -7064,12 +7064,12 @@ PinnedVerificationKey { ), Sum( Constant( - 0x0000000000000000000000000000000000000000000000000000000000000003, + 0x0000000000000000000000000000000000000000000000000000000000000004, ), Negated( Fixed { - query_index: 20, - column_index: 20, + query_index: 21, + column_index: 21, rotation: Rotation( 0, ), @@ -7079,12 +7079,12 @@ PinnedVerificationKey { ), Sum( Constant( - 0x0000000000000000000000000000000000000000000000000000000000000004, + 0x0000000000000000000000000000000000000000000000000000000000000005, ), Negated( Fixed { - query_index: 20, - column_index: 20, + query_index: 21, + column_index: 21, rotation: Rotation( 0, ), @@ -7124,20 +7124,20 @@ PinnedVerificationKey { Product( Product( Fixed { - query_index: 20, - column_index: 20, + query_index: 21, + column_index: 21, rotation: Rotation( 0, ), }, Sum( Constant( - 0x0000000000000000000000000000000000000000000000000000000000000001, + 0x0000000000000000000000000000000000000000000000000000000000000002, ), Negated( Fixed { - query_index: 20, - column_index: 20, + query_index: 21, + column_index: 21, rotation: Rotation( 0, ), @@ -7147,12 +7147,12 @@ PinnedVerificationKey { ), Sum( Constant( - 0x0000000000000000000000000000000000000000000000000000000000000002, + 0x0000000000000000000000000000000000000000000000000000000000000003, ), Negated( Fixed { - query_index: 20, - column_index: 20, + query_index: 21, + column_index: 21, rotation: Rotation( 0, ), @@ -7162,12 +7162,12 @@ PinnedVerificationKey { ), Sum( Constant( - 0x0000000000000000000000000000000000000000000000000000000000000003, + 0x0000000000000000000000000000000000000000000000000000000000000004, ), Negated( Fixed { - query_index: 20, - column_index: 20, + query_index: 21, + column_index: 21, rotation: Rotation( 0, ), @@ -7177,12 +7177,12 @@ PinnedVerificationKey { ), Sum( Constant( - 0x0000000000000000000000000000000000000000000000000000000000000004, + 0x0000000000000000000000000000000000000000000000000000000000000005, ), Negated( Fixed { - query_index: 20, - column_index: 20, + query_index: 21, + column_index: 21, rotation: Rotation( 0, ), @@ -7220,20 +7220,20 @@ PinnedVerificationKey { Product( Product( Fixed { - query_index: 20, - column_index: 20, + query_index: 21, + column_index: 21, rotation: Rotation( 0, ), }, Sum( Constant( - 0x0000000000000000000000000000000000000000000000000000000000000001, + 0x0000000000000000000000000000000000000000000000000000000000000002, ), Negated( Fixed { - query_index: 20, - column_index: 20, + query_index: 21, + column_index: 21, rotation: Rotation( 0, ), @@ -7243,12 +7243,12 @@ PinnedVerificationKey { ), Sum( Constant( - 0x0000000000000000000000000000000000000000000000000000000000000002, + 0x0000000000000000000000000000000000000000000000000000000000000003, ), Negated( Fixed { - query_index: 20, - column_index: 20, + query_index: 21, + column_index: 21, rotation: Rotation( 0, ), @@ -7258,12 +7258,12 @@ PinnedVerificationKey { ), Sum( Constant( - 0x0000000000000000000000000000000000000000000000000000000000000003, + 0x0000000000000000000000000000000000000000000000000000000000000004, ), Negated( Fixed { - query_index: 20, - column_index: 20, + query_index: 21, + column_index: 21, rotation: Rotation( 0, ), @@ -7273,12 +7273,12 @@ PinnedVerificationKey { ), Sum( Constant( - 0x0000000000000000000000000000000000000000000000000000000000000004, + 0x0000000000000000000000000000000000000000000000000000000000000005, ), Negated( Fixed { - query_index: 20, - column_index: 20, + query_index: 21, + column_index: 21, rotation: Rotation( 0, ), @@ -7309,20 +7309,20 @@ PinnedVerificationKey { Product( Product( Fixed { - query_index: 20, - column_index: 20, + query_index: 21, + column_index: 21, rotation: Rotation( 0, ), }, Sum( Constant( - 0x0000000000000000000000000000000000000000000000000000000000000001, + 0x0000000000000000000000000000000000000000000000000000000000000002, ), Negated( Fixed { - query_index: 20, - column_index: 20, + query_index: 21, + column_index: 21, rotation: Rotation( 0, ), @@ -7332,12 +7332,12 @@ PinnedVerificationKey { ), Sum( Constant( - 0x0000000000000000000000000000000000000000000000000000000000000002, + 0x0000000000000000000000000000000000000000000000000000000000000003, ), Negated( Fixed { - query_index: 20, - column_index: 20, + query_index: 21, + column_index: 21, rotation: Rotation( 0, ), @@ -7347,12 +7347,12 @@ PinnedVerificationKey { ), Sum( Constant( - 0x0000000000000000000000000000000000000000000000000000000000000003, + 0x0000000000000000000000000000000000000000000000000000000000000004, ), Negated( Fixed { - query_index: 20, - column_index: 20, + query_index: 21, + column_index: 21, rotation: Rotation( 0, ), @@ -7362,12 +7362,12 @@ PinnedVerificationKey { ), Sum( Constant( - 0x0000000000000000000000000000000000000000000000000000000000000004, + 0x0000000000000000000000000000000000000000000000000000000000000005, ), Negated( Fixed { - query_index: 20, - column_index: 20, + query_index: 21, + column_index: 21, rotation: Rotation( 0, ), @@ -27377,48 +27377,48 @@ PinnedVerificationKey { (0x05f5862cad2888855bc3c1843a9eff57b11b592d9eb0e13354256661387f5231, 0x32236b14df85bf5f532a930232cb23a5c56ef7d67aaeed8bcb8fc10ea132cbd6), (0x3e727e8554679f98120355d39d958dbd8755d5a7f8b42ea87f258064c4b3eb57, 0x0c0d5c23f3ee62ac1b2d986dd3033bbcab260d590e1393de3a14a4b31ae091bb), (0x3748680dd6a91c5dec668b30fb6bf9a450aeb884b81cbc344914f265760e7131, 0x18530eaa5c58b61bd3fc38220ea484c0922524a815a8f752be955c229f9c4164), - (0x18cd12d5f4e12bd7247a8fd7cc93ded7a8a9b60935b319b2db578a8fceef9559, 0x16b15af4fcfb9ed75533e7a4c1966cae5621f10dc1dfbba39a491ec37c911b5e), - (0x37e70146801841d95832259e4d8f39aeee8a364ea5007f82aa84a0e387231315, 0x20ef65833381c985722a95e65125a1123cab3357741168a5ed7e92e972dbd30d), - (0x12e3af8e507a2ca30e544568cf319701ecbc29dc5919f0198d541938edecc8f3, 0x3fb1bb2804faaa4c215e93694d5d1e6f87874cb8c34cb9206ff958de14e44275), - (0x334d99f316343f01c8eb67e327c76f743f8de7f957c893c6f30ccd87e5d1af3a, 0x1da64caf127c8eb513653791147a85ed1edcca12935c95b7d615a9377c9406d8), - (0x1430dca15080286939046d3cb9fb7ace4ed1da2fbe7a362e8f3575489bc6e3e1, 0x1ef5f4aff2902f3bc8acb2cc884a2d44334f910a68b2701f1c37943652b46d8f), - (0x02ebdeac7e91b3d15e4b7c0533e42678672ec384d51e51e22342be7edeeb8074, 0x03638952e0489de03ff03236433f5d2617cb4ddd0a72637ed31095deca85a2a6), - (0x31179b7f5b01ad2a55cf9a66f57b696e9b9cb4919cca426d469b270827f3018b, 0x2b231a9a71b674cc546ba9b36916a13411648903cfdcb808926fc47ee745586c), - (0x0673497660cec8a8c391cfb16f5ffdcb710f9e9e194a1a85935cf4bc45b01359, 0x15ce8801c51811f0256a43f762e497fe38c88866c09bb256289d93e0393dc225), - (0x098d2a0cfedae91fe29e21a01b5e43045b9cc8d9a334f1aee3e075f36a16e323, 0x0be47cc41643c9e6d95012428d5b46ae5a44e765392e05152a0181e30689d8b6), + (0x209149ec2f6e8d997df6b458b49df28bfeb6e0eab059d71bdd193daa6a9f91f7, 0x3aec4c1e14c257e8d1989e51315ad63ec52b4dda171bb65b88c742e1cc0d8794), + (0x2a9bdc41adab2aae6e1b041b10b057f2d1ec4c91f48ec76392f1b536e8781107, 0x39745aba0fbc0e9773d885fa7054bf275cf5b54a475b39a7bc1d220085c224ea), + (0x3e5d67d8e18a06647d85ac93133785ad15389c058185d229542f2b047b4ee34e, 0x38115c21067613d69a60adecbf71dd8b66f5c89638aec70de7c223ad1c74b97d), + (0x2eec768b1bfae43fc94786e66ef851b922d037e1093130bfb0e33f535d06fd74, 0x0694a3afac5a16d0210c9c655b5d1afc1c767b6ad732550055ecc41116546496), + (0x2fb0f29dc6a6b64bae1ce0db538657c8066836f3feb83f139d056c45c94f926c, 0x1d9b2360dc0b2837083d2954a82cdbc362a1e0c1128985ec810df1dc329d5407), + (0x0833435dd8ea91441a55eb5b7c9c1fcdd39240f2e800dba0391ac49717dd5209, 0x0c175f0c5791cb0f969e494db4f7ee8b0fbf7a16a9649d2348e6dc781d17633a), + (0x10aff8b9300298aaf214f81d78d9d56a9e7c2c82164a064aeaa83155cd75b4f7, 0x1bf92ad7cb9affa3ee14286db87fbf0ee2cc4a1c63be9309b2b1707affaed470), + (0x3dbaaee24af893710d212b59131c482248a49de380b8402276ecfbc7bf79e0d8, 0x3b04c15a27436184679c23a8aea5a79127c11b4208c32fa7d955e1c6217f7b22), + (0x13d9f4c34faa08b5133a4350ec14e5ea685524a7dc1de6c90c9e9de445334f4c, 0x0c4b93128738ac17cfe2d8440caa9ac593495ac7e5016850bd2242b78505fa76), (0x02adb7cbc9ebbbd87d7d6a41fc40cb4cf57585c6243aa204f757c9026ef20fd3, 0x327fc06fee179c6a57ed95336f9fb7854420d80dd191251a40935664ff6c8067), (0x2d00d4ec8aa5e4b3d035131f559e4a97f896e8dbc39badb92b58a8d46b5e91df, 0x37046fb32ed8eb4ba0b4da8e1c9b56cd3832fa2ed4788f7faf4fee1f76a94c32), (0x212f5afd70e787e2fd951e0ddc5430d1fa78f988c30740384d18cf9ff276b43b, 0x20c5a150e200caddf9a35a993668fc4742be5d924d1086f05c74ef6a78b5feb2), (0x02c283cbde85f2ad26daddeabe01b1574ce7de68f0e329ec95a4154dd4713f29, 0x208cf96aa5255b543933ee3e9bdd054d4f15265a7c8921aaee89c192af2fd284), (0x1f777f0e4263ec4a19f30813739c640335ffa951cc3cc586b6c4095e737f95be, 0x061c07fb12cb19582eefd858a08e689acd970c8cb9ed8f7b928d88e691a2f586), (0x13d0bd76da4ace22c0e90b098d6073551322b8c734bf37eeca67fbf19687f550, 0x3d996cc9da5a31cefb453390b906eabbcc75797bc6a6b9c9e3af2fe7b6b8beed), - (0x16cc967b08c622132ea5bd25c0827c5746fcd6a9c6f784763bb65527349a2765, 0x284efb61ffde47401f489bcc836c97c0af875af5721c6e9fb5caf286cb04df88), - (0x1b6f5383c5a0ae5bf457e1c8e17a933e892464d33fef9e9262411e01c117d87e, 0x0c552b960e8ce365b5f2302bcc0b7ce5cdf964e6036602cfc859c8769184f619), - (0x3b16a11303a9914a918a31d192d8c148d737ba6335bf59b24a50226ea6fde6e5, 0x1b94eb1ba5b61b6eb7ba23429c25c1b56332e8882e1dbdc5d3e70cfaf015bf6b), - (0x01c064e45f7961a7625d6a7f0840cb7a23a0a300eba199548dca797b92776d6a, 0x39a37ce2aa22bd26415fcffbaf8aec38f1bc55011f6c55bdf59e60967b8ef315), + (0x212421f38fcedccab0863c63d3c30bbe515d0e5711cc251e51aecdcbe0a0a047, 0x205729b5da64cc77f3e66dea638ce40cd933cdc38230d0d43431393104e76c1c), + (0x1ff66fbece57aad5fbda474a5eb6ac1ff1fa60303fd6767a90c376d28d68d913, 0x23346b3134217783b7baa46efc387431929ec56d0aed187bd25f50336db5ce92), + (0x3b06b75e3693f927ca000f5f4936f983fe858446cd2bb4f3ea3b84bf5a461390, 0x11c43a33b48009fceab363d6b1c098ab074ae5e95e29cc3d50a8aac643185bc4), + (0x2f025606b400d744db9c15c3587a39da2fd98adeb2a3387a4667b249ece328f1, 0x3dc36b2a0cfcb1e56de2509f1b0989c71cdca3fca7272b54d82ebbd04b0a3371), (0x0974ad1a3c0eb4c8d2c59cd820a82b7f28ea2f7a245008d403815131ff30879e, 0x00bb593cdf920cef4965f788d65eba3c3aa07d9718dfb62e3e385849a0d692a8), (0x1e355d783cffccafc120f462461fb312773442762383ac444009653f3d8d4be6, 0x3c60e17b18492aa2c41798b409d2bcc1857ca57ee9d2fb0001584cedc8e141d6), (0x25219cf4eb3ab5335b9934dbfb9ffc21c75a13199706b9167ad3ec3c62375fd2, 0x0311e81e0a5f94eba29ece2d8d18df813c723748e7fc91cadc19e6ad4831e5cd), - (0x018c435abdbe0051d20b1b557d9fd1e817a342651647cac7c58edd555495cec9, 0x0a061e068c64bed923b31d2953e8503a90bab28a52a44c781eafaa4e96126194), - (0x2d36bcdc5ab3f72357af5c1d6e150ba294774392fdb7289506d1f685af7012b6, 0x1abb5d3cc1cacb00a8e0503fd6b1a177852fd30b16c365287bc5ca2035bcdc21), - (0x259459a054b4a21c74508c1ec458a66b1ac3a942e640ec97574dd201c343d724, 0x2206ec87973fd46d03c6c603fcba5b5563aca7ed4d11c37467220a1de5abff60), - (0x31503525618fc6283b1df2d1757bd9f155fca694b64ab6927ee94b39dc560952, 0x1c74db4345164c77f05edad3c5eb6eed02b173c2c710509317b685b455c7c906), - (0x24a6899678eff985cd28bd6a0b7f022dab59c7a88e25380fb8026014d846845c, 0x3024539dac1246a06224bf2aa89c1d424dad644a20bae5c3d3059183a00e8a1d), + (0x2ebc4d9de863dadf554a27935ac09c8d50ad6c27f23d125068f9a598de50e59a, 0x0e9d18d974fa92ec36fa37b8baea07920f465025cfd61733ca86cf3cb063f75d), + (0x121c8ef2d47087e7eceb8c05b30964080dd652d507e0857c9cc084f89195726d, 0x2e3d7159eb2ce460e233f4572c93e6ebba67fe32aa192b64ceb9dd55724f87fc), + (0x3455ced69daf3bafeb264348dbf0f92ba793e0efcd72b9b8da187989b16531f5, 0x31675f11ce8873a66f63bd01751dbca1cba80f8cccb9267ff576797a4e1c9d1e), + (0x3e7de9e5f0cc06505efd346ef3663891bf5ab63b414f21f67d30ec66efbba929, 0x0eb8d386d63d04be291a2a3467f1b0a797a960c6eeb76322a74e51aaf9b897b2), + (0x3b7a64a651bd33dfecef1af52d06e634fe7fd03e484c1eee1140221978b6f72f, 0x01cb522af1dfcfd1c06b70712d1bd2d801505f90a165d3b02d91e18ee35e2136), ], 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), + (0x291778fca5adad7d6cc627d3ee3e956c6fec42c7e557e83e432c4b8f150f0f9e, 0x3a4b150cc6d94858be8a5d874ef7f7bf0761e8f5175752028d610e912cea8ab3), + (0x0483eae96cc11b555fb52cc1e51dc5bc7b19d69f797d76f75bbd9ee8c5a91329, 0x0beaa7f99a17cd75465d8f1d6879e59eca2a81041a3a0dec72c6a456b319cf97), + (0x2d04468bab9d6454c8f3163e0213840efdc8ce49148e52fd56d69aecbd34ea3c, 0x0f6298b97a19cdbd942ef9d0815e0e0c2b668404318d8540cf4c62ba2eaf73e3), + (0x07c265921ed6a04cbec06493e9d6ef2fb042f671f8849c7f0ae422b38e282cff, 0x19cce9b87f59cb62a15cdaed494b7db0732ea228f5bbe8c4e55fe52b4b44912d), + (0x2f2a4fe674511714675f35e9f154cc0b79b75ee1ffdf8db91b5889fb68a9c53b, 0x0859088c8bf69b32da25eb5637bbd2db6af8b152259f8386ffa74d73a842f169), + (0x104893debb057a57febe0db9e6243527cccc93e4524fbcb8326c376052010793, 0x0fd548af47b503811c146b10f39ff037599711dd80b29e624fc4400ce2cf6369), + (0x22d317c8881c13ed6a16c3fc8c9ddec3e0795cb845219162fd2dd744ab6d3ebd, 0x075f58c50410344de2450e261b951d6ad8a5e1373567b0570caa1dff6834780f), + (0x30e304a5d0a2dcda446e01a02e6d4436d1d9e6e587841a0a698014bb2c04706b, 0x164db4feeb61d80e49903c615e638efa42a7add04c44aff109d5d33fbb65c211), + (0x129000b15f60bf3f3321b868452c63d34de4ecec0966096d6d6430706839f3f9, 0x05be3abffb6ea7a200265f4c367081cb7c166f0e4c2a4227526f4a008e97bdc3), + (0x15633b5a3a2eb2192b18b3ea62c22fd1bcf6718574707a4e7c303a64a4a7f2b0, 0x01af6db1493f183315e3bfb57a1afcb3afbf1f02f58cbc6ea27511cd4ea32af7), + (0x23e7cb97bf6791925fab01101d9f41b47db4ebb09e4f4476fb463df3d4cd83a1, 0x08ef8c9c3401ca41c42331af667c45c62e017a18a983e75bebf38354bd062772), + (0x16c5f4baf2bc68482958f7924bbf25e94c39fbfe08d9c24d0523bea621c75436, 0x1a76bbd5513df6febd063b7b7eb758308089de72c5f7554051fa265ac2c11ff3), (0x21d210b41675a1eae44cbd0f3fd27d69e30716c71873f6089cee61acacd403ab, 0x2275e97c7e84f68bfaa528a9d8be4e059f7abefd80d03fbfca774e8414a9b7c1), (0x0f9e7de28e0f650d99d99d95c0fcd39c9dac9db5aa1973319f66922d6eb9f7d5, 0x1ba644ecc18ad711ddd33af7f695f6834e9f35c93d47a6a5273dabbe800fc7e6), (0x0aab3ab73afac76277cd94a891de15e42ceb09f3a9865dab5c814bebfbb4453f, 0x27119fec3736d99abeeef1ad7b857db7e754e0c158780ed3dd0cdd4dc2453e10), diff --git a/src/circuit_proof_test_case.bin b/src/circuit_proof_test_case.bin index 152286ed4e5368d649aa18feb7ed1ddb2a9fb84e..bb88373755f2eb4f11cab4e357646bd3fce969a3 100644 GIT binary patch literal 5186 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 literal 5186 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 Date: Sun, 21 Aug 2022 20:44:01 +0200 Subject: [PATCH 08/16] zsa-mux: dependencies on halo2 changes --- Cargo.toml | 9 ++++++--- 1 file changed, 6 insertions(+), 3 deletions(-) diff --git a/Cargo.toml b/Cargo.toml index 692cbd584..e74accef7 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -29,8 +29,10 @@ blake2b_simd = "1" ff = "0.12" fpe = "0.5" group = "0.12" -halo2_gadgets = "0.2" -halo2_proofs = "0.2" +halo2_gadgets = { version = "0.2", git = "https://github.com/QED-it/halo2", branch = "sinsemilla-hash-blind" } +halo2_proofs = { version = "0.2", git = "https://github.com/QED-it/halo2", branch = "sinsemilla-hash-blind" } +#halo2_gadgets = { version = "0.2", path = "../halo2/halo2_gadgets" } +#halo2_proofs = { version = "0.2", path = "../halo2/halo2_proofs" } hex = "0.4" lazy_static = "1" memuse = { version = "0.2", features = ["nonempty"] } @@ -52,7 +54,8 @@ plotters = { version = "0.3.0", optional = true } [dev-dependencies] criterion = "0.3" -halo2_gadgets = { version = "0.2", features = ["test-dependencies"] } +halo2_gadgets = { version = "0.2", git = "https://github.com/QED-it/halo2", branch = "sinsemilla-hash-blind", features = ["test-dependencies"] } +#halo2_gadgets = { version = "0.2", path = "../halo2/halo2_gadgets", features = ["test-dependencies"] } hex = "0.4" proptest = "1.0.0" zcash_note_encryption = { version = "0.1", features = ["pre-zip-212"] } From 2782d73e461379f41288964835ba033b00cae307 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Aur=C3=A9lien=20Nicolas?= Date: Mon, 22 Aug 2022 00:01:29 +0200 Subject: [PATCH 09/16] zsa-mux: check the consistency of is_zsa --- src/circuit.rs | 37 ++++++++--- src/circuit/gadget/mux_chip.rs | 105 ++++++++++++++++++++++++++++++++ src/circuit_description | 58 +++++++++--------- src/circuit_proof_test_case.bin | Bin 5186 -> 5186 bytes 4 files changed, 163 insertions(+), 37 deletions(-) diff --git a/src/circuit.rs b/src/circuit.rs index d81b72ce3..f4bec659c 100644 --- a/src/circuit.rs +++ b/src/circuit.rs @@ -31,7 +31,7 @@ use memuse::DynamicUsage; use pasta_curves::{arithmetic::CurveAffine, pallas, vesta}; use rand::RngCore; -use crate::circuit::gadget::mux_chip::{MuxChip, MuxConfig}; +use crate::circuit::gadget::mux_chip::{MuxChip, MuxConfig, MuxInstructions}; use crate::note::NoteType; use crate::{ constants::{ @@ -404,20 +404,41 @@ impl plonk::Circuit for Circuit { // TODO: move to self. let note_type_value = Value::known(NoteType::native()); - let is_zsa_value = Value::known(pallas::Base::zero()); // TODO: bool type. + let is_zsa_value = note_type_value.map(|nt| !bool::from(nt.is_native())); - // Witness note_type. + // Witness boolean is_zsa. + let mux_chip = config.mux_chip(); + let is_zsa = + mux_chip.witness_switch(layouter.namespace(|| "witness is_zsa"), is_zsa_value)?; + + // Witness note_type as a point. let note_type = NonIdentityPoint::new( ecc_chip.clone(), layouter.namespace(|| "note_type"), note_type_value.as_ref().map(|nt| nt.cv_base().to_affine()), )?; - // Witness is_zsa. - let is_zsa = assign_free_advice( - layouter.namespace(|| "witness is_zsa"), - config.advices[0], - is_zsa_value, + // The constant that represents the native note type. + let note_type_native = NoteType::native() + .cv_base() + .to_affine() + .coordinates() + .unwrap(); + + // If is_zsa=false, check that the note type is native. + // TODO: is this necessary? + // TODO: is it necessary to check the opposite case, with note_type!=native ? + mux_chip.conditional_advice( + layouter.namespace(|| "note_type consistency X"), + &is_zsa, + ¬e_type.inner().x(), + note_type_native.x(), + )?; + mux_chip.conditional_advice( + layouter.namespace(|| "note_type consistency Y"), + &is_zsa, + ¬e_type.inner().y(), + note_type_native.y(), )?; ( diff --git a/src/circuit/gadget/mux_chip.rs b/src/circuit/gadget/mux_chip.rs index 21ef477c9..09fb8e094 100644 --- a/src/circuit/gadget/mux_chip.rs +++ b/src/circuit/gadget/mux_chip.rs @@ -63,6 +63,8 @@ impl MuxChip { Constraints::with_selector(q_mux, Some(should_be_zero)) }); + // TODO: is enable equality or enable constant needed? + MuxConfig { q_mux, switch, @@ -78,6 +80,12 @@ impl MuxChip { } pub trait MuxInstructions { + fn witness_switch( + &self, + layouter: impl Layouter, + value: Value, + ) -> Result, plonk::Error>; + fn mux( &self, layouter: impl Layouter, @@ -93,9 +101,64 @@ pub trait MuxInstructions { left: &EccPoint, right: &EccPoint, ) -> Result; + + /// If is_free_advice { advice = anything } else { advice = constant } + fn conditional_advice( + &self, + layouter: impl Layouter, + is_free_advice: &AssignedCell, + advice: &AssignedCell, + else_constant: &C::Base, + ) -> Result<(), plonk::Error>; } impl MuxInstructions for MuxChip { + // TODO: this could return a wrapper type for usage safety. + // TODO: this could use constant-time Choice instead of bool. + fn witness_switch( + &self, + mut layouter: impl Layouter, + value: Value, + ) -> Result, plonk::Error> { + layouter.assign_region( + || "witness switch", + |mut region| { + // This is a boolean constraint implemented with the mux gate. + // Set left=switch, right=0, output=0, giving: + // (1 - switch) * switch == 0 + + // Enable the multiplexer gate. + self.config.q_mux.enable(&mut region, 0)?; + + let switch = region.assign_advice( + || "load switch", + self.config.switch, + 0, + || value.map(|b| pallas::Base::from(b)), + )?; + + // Copy the switch into the left input. + switch.copy_advice(|| "copy switch", &mut region, self.config.left, 0)?; + + // Force the right input and the output to zero. + region.assign_advice_from_constant( + || "null right", + self.config.right, + 0, + pallas::Base::zero(), + )?; + region.assign_advice_from_constant( + || "null output", + self.config.out, + 0, + pallas::Base::zero(), + )?; + + Ok(switch) + }, + ) + } + fn mux( &self, mut layouter: impl Layouter, @@ -144,6 +207,48 @@ impl MuxInstructions for MuxChip { Ok(EccPoint::from_coordinates_unchecked(x.into(), y.into())) } + + fn conditional_advice( + &self, + mut layouter: impl Layouter, + is_free_advice: &AssignedCell, + advice: &AssignedCell, + else_constant: &pallas::Base, + ) -> Result<(), plonk::Error> { + layouter.assign_region( + || "conditional advice", + |mut region| { + // Enable the multiplexer gate. + self.config.q_mux.enable(&mut region, 0)?; + + // Copy the switch. + is_free_advice.copy_advice(|| "copy switch", &mut region, self.config.switch, 0)?; + + // Copy the advice into the left input. + // When the switch is off, it must equal the constant output. + // When the switch is on, it is ignored so its value is freely chosen. + advice.copy_advice(|| "copy advice", &mut region, self.config.left, 0)?; + + // The right witness just satisfies the gate when the switch is on. + region.assign_advice( + || "witness right", + self.config.right, + 0, + || Value::known(*else_constant), + )?; + + // Force a constant output. + region.assign_advice_from_constant( + || "constant output", + self.config.out, + 0, + *else_constant, + )?; + + Ok(()) + }, + ) + } } fn compute_mux( diff --git a/src/circuit_description b/src/circuit_description index 5e179e6c1..0efc270e8 100644 --- a/src/circuit_description +++ b/src/circuit_description @@ -27377,48 +27377,48 @@ PinnedVerificationKey { (0x05f5862cad2888855bc3c1843a9eff57b11b592d9eb0e13354256661387f5231, 0x32236b14df85bf5f532a930232cb23a5c56ef7d67aaeed8bcb8fc10ea132cbd6), (0x3e727e8554679f98120355d39d958dbd8755d5a7f8b42ea87f258064c4b3eb57, 0x0c0d5c23f3ee62ac1b2d986dd3033bbcab260d590e1393de3a14a4b31ae091bb), (0x3748680dd6a91c5dec668b30fb6bf9a450aeb884b81cbc344914f265760e7131, 0x18530eaa5c58b61bd3fc38220ea484c0922524a815a8f752be955c229f9c4164), - (0x209149ec2f6e8d997df6b458b49df28bfeb6e0eab059d71bdd193daa6a9f91f7, 0x3aec4c1e14c257e8d1989e51315ad63ec52b4dda171bb65b88c742e1cc0d8794), - (0x2a9bdc41adab2aae6e1b041b10b057f2d1ec4c91f48ec76392f1b536e8781107, 0x39745aba0fbc0e9773d885fa7054bf275cf5b54a475b39a7bc1d220085c224ea), - (0x3e5d67d8e18a06647d85ac93133785ad15389c058185d229542f2b047b4ee34e, 0x38115c21067613d69a60adecbf71dd8b66f5c89638aec70de7c223ad1c74b97d), - (0x2eec768b1bfae43fc94786e66ef851b922d037e1093130bfb0e33f535d06fd74, 0x0694a3afac5a16d0210c9c655b5d1afc1c767b6ad732550055ecc41116546496), - (0x2fb0f29dc6a6b64bae1ce0db538657c8066836f3feb83f139d056c45c94f926c, 0x1d9b2360dc0b2837083d2954a82cdbc362a1e0c1128985ec810df1dc329d5407), - (0x0833435dd8ea91441a55eb5b7c9c1fcdd39240f2e800dba0391ac49717dd5209, 0x0c175f0c5791cb0f969e494db4f7ee8b0fbf7a16a9649d2348e6dc781d17633a), - (0x10aff8b9300298aaf214f81d78d9d56a9e7c2c82164a064aeaa83155cd75b4f7, 0x1bf92ad7cb9affa3ee14286db87fbf0ee2cc4a1c63be9309b2b1707affaed470), - (0x3dbaaee24af893710d212b59131c482248a49de380b8402276ecfbc7bf79e0d8, 0x3b04c15a27436184679c23a8aea5a79127c11b4208c32fa7d955e1c6217f7b22), - (0x13d9f4c34faa08b5133a4350ec14e5ea685524a7dc1de6c90c9e9de445334f4c, 0x0c4b93128738ac17cfe2d8440caa9ac593495ac7e5016850bd2242b78505fa76), + (0x3106241309d1fd256b3a6323de64fb6608a469063675f63cb82b309e7113bf14, 0x065db5b23e6e83af7789a091ec4121c0459b19ea02e5aa22d31d055075bde58b), + (0x13467c9214f2c1eb99bba9a1a108627c36d310dacd9171ac9ca4edf9ffbb2a2a, 0x0e5156b6d2be6b9c8b359b0ef80f002363d99dafcc2e355fdd0275232c56a5fc), + (0x3b4a47041b90e261cf3c04c47dab1479649ce379c62bec82011cc57c8fa8fb2b, 0x20ec2bbf97ee463402352d49bef1f12dcd3429f09001e1cf63b58479d116cb45), + (0x25ca4b5a69e0e6cbc61c0899d9a2598961b74a8201807f189e4e55a5236064f3, 0x24e7edaf95058317a36549165150c4d4b6899efefd87f4831c4cfb9df692ac7b), + (0x3cc1e0704d9983820ceae2c4e4334557a4883abb584f813769afd0b0794d6395, 0x15717cf051a5fd4e65caa3f40a39d52297511910094998f7ab799924b45c1b15), + (0x17b51257a31216b73df7e5e51ff2037d3a3c1556682c3a2e7e67769d3ebd55b2, 0x0cd0c9b88b7267090925e34cd65fff1a4fbb2a22a2c9c2f8338d86c27d6dc4a6), + (0x09a6ca59f082ec52c4e14dda80e6e2ef254ca296f4ed06cff2a94505c11617a7, 0x0c8dd8b65dfc364ba01b8a3bf5f61d4e343a596cd531d072772dc7c78a2054a4), + (0x04f7e1d9cffc94bc1ada88a74b6e2d290fe3bcdaecd44965da6ac498144bc4db, 0x2b833195c810a3c0cd64f9f7578893d390a0c2dd16fdeb1600a985ebfdb0bcab), + (0x257bd221294e176bf9109379281afcd1613e271e1aaa13a17edd9dbc15d3f338, 0x01b0098a965c7264fd100ef8499f7a1e888d5f5b25494bf9cc997f885858eb7d), (0x02adb7cbc9ebbbd87d7d6a41fc40cb4cf57585c6243aa204f757c9026ef20fd3, 0x327fc06fee179c6a57ed95336f9fb7854420d80dd191251a40935664ff6c8067), (0x2d00d4ec8aa5e4b3d035131f559e4a97f896e8dbc39badb92b58a8d46b5e91df, 0x37046fb32ed8eb4ba0b4da8e1c9b56cd3832fa2ed4788f7faf4fee1f76a94c32), (0x212f5afd70e787e2fd951e0ddc5430d1fa78f988c30740384d18cf9ff276b43b, 0x20c5a150e200caddf9a35a993668fc4742be5d924d1086f05c74ef6a78b5feb2), (0x02c283cbde85f2ad26daddeabe01b1574ce7de68f0e329ec95a4154dd4713f29, 0x208cf96aa5255b543933ee3e9bdd054d4f15265a7c8921aaee89c192af2fd284), (0x1f777f0e4263ec4a19f30813739c640335ffa951cc3cc586b6c4095e737f95be, 0x061c07fb12cb19582eefd858a08e689acd970c8cb9ed8f7b928d88e691a2f586), (0x13d0bd76da4ace22c0e90b098d6073551322b8c734bf37eeca67fbf19687f550, 0x3d996cc9da5a31cefb453390b906eabbcc75797bc6a6b9c9e3af2fe7b6b8beed), - (0x212421f38fcedccab0863c63d3c30bbe515d0e5711cc251e51aecdcbe0a0a047, 0x205729b5da64cc77f3e66dea638ce40cd933cdc38230d0d43431393104e76c1c), + (0x26391b9ee41c2c2faeb04adb3383f53cc0994f7a2f48200f1e3dfbf3604ab4ec, 0x3871c88716cbe7f59497df62971ef616407e66cf9ce33dfa517f2c7f84aca9d3), (0x1ff66fbece57aad5fbda474a5eb6ac1ff1fa60303fd6767a90c376d28d68d913, 0x23346b3134217783b7baa46efc387431929ec56d0aed187bd25f50336db5ce92), - (0x3b06b75e3693f927ca000f5f4936f983fe858446cd2bb4f3ea3b84bf5a461390, 0x11c43a33b48009fceab363d6b1c098ab074ae5e95e29cc3d50a8aac643185bc4), - (0x2f025606b400d744db9c15c3587a39da2fd98adeb2a3387a4667b249ece328f1, 0x3dc36b2a0cfcb1e56de2509f1b0989c71cdca3fca7272b54d82ebbd04b0a3371), + (0x129898b6bcca9f9ff44f5dc76cb26bc229fa8b14ff47d9153680b0ba5c5efbf6, 0x1be1a12569bd9d26ac6225d404a52099198520eebec3ae1ef5de8a18d74b6116), + (0x2c850dfed4e085708d77a27e27fbe8f68ebf3b9325d83b3642bc01884b4acdd3, 0x384616523a3f4984f40287f2d1870057ec8a1bc23f4ad95399b1db467e44d8be), (0x0974ad1a3c0eb4c8d2c59cd820a82b7f28ea2f7a245008d403815131ff30879e, 0x00bb593cdf920cef4965f788d65eba3c3aa07d9718dfb62e3e385849a0d692a8), (0x1e355d783cffccafc120f462461fb312773442762383ac444009653f3d8d4be6, 0x3c60e17b18492aa2c41798b409d2bcc1857ca57ee9d2fb0001584cedc8e141d6), (0x25219cf4eb3ab5335b9934dbfb9ffc21c75a13199706b9167ad3ec3c62375fd2, 0x0311e81e0a5f94eba29ece2d8d18df813c723748e7fc91cadc19e6ad4831e5cd), - (0x2ebc4d9de863dadf554a27935ac09c8d50ad6c27f23d125068f9a598de50e59a, 0x0e9d18d974fa92ec36fa37b8baea07920f465025cfd61733ca86cf3cb063f75d), - (0x121c8ef2d47087e7eceb8c05b30964080dd652d507e0857c9cc084f89195726d, 0x2e3d7159eb2ce460e233f4572c93e6ebba67fe32aa192b64ceb9dd55724f87fc), - (0x3455ced69daf3bafeb264348dbf0f92ba793e0efcd72b9b8da187989b16531f5, 0x31675f11ce8873a66f63bd01751dbca1cba80f8cccb9267ff576797a4e1c9d1e), - (0x3e7de9e5f0cc06505efd346ef3663891bf5ab63b414f21f67d30ec66efbba929, 0x0eb8d386d63d04be291a2a3467f1b0a797a960c6eeb76322a74e51aaf9b897b2), - (0x3b7a64a651bd33dfecef1af52d06e634fe7fd03e484c1eee1140221978b6f72f, 0x01cb522af1dfcfd1c06b70712d1bd2d801505f90a165d3b02d91e18ee35e2136), + (0x1189190c7140c25fb3bba8a8bcff6a3b6fceabbf0e19f72340e067ee2b54c4a0, 0x3f9f1830bb5cf117cbec426d8ab56f2522b50a080a1938b282d61f048e493f03), + (0x158e38d5f1746f7028a12fe429c8076808d5ebbfe328a8e4e391190e09f7c8b4, 0x244590041ac7661d9e0eccfe22e124cfe34513195c80529591d515c57303428a), + (0x00a668c6850dcd60304ddfed3a560903ea80f677d3e6be673db1a1c5fba0bba9, 0x04c42a9ba399209d1dee75b6405605352b905b6df019498d4cd5a75e748f0af0), + (0x13368605495bccc8e4e668869a945ad9f0ad837a3f9a74f5b7372cca5022ecb2, 0x0644b252c059170ef322e5fcaf000582a25ec388b571d062b385bd21b42e6870), + (0x24a6899678eff985cd28bd6a0b7f022dab59c7a88e25380fb8026014d846845c, 0x3024539dac1246a06224bf2aa89c1d424dad644a20bae5c3d3059183a00e8a1d), ], permutation: VerifyingKey { commitments: [ - (0x291778fca5adad7d6cc627d3ee3e956c6fec42c7e557e83e432c4b8f150f0f9e, 0x3a4b150cc6d94858be8a5d874ef7f7bf0761e8f5175752028d610e912cea8ab3), - (0x0483eae96cc11b555fb52cc1e51dc5bc7b19d69f797d76f75bbd9ee8c5a91329, 0x0beaa7f99a17cd75465d8f1d6879e59eca2a81041a3a0dec72c6a456b319cf97), - (0x2d04468bab9d6454c8f3163e0213840efdc8ce49148e52fd56d69aecbd34ea3c, 0x0f6298b97a19cdbd942ef9d0815e0e0c2b668404318d8540cf4c62ba2eaf73e3), - (0x07c265921ed6a04cbec06493e9d6ef2fb042f671f8849c7f0ae422b38e282cff, 0x19cce9b87f59cb62a15cdaed494b7db0732ea228f5bbe8c4e55fe52b4b44912d), - (0x2f2a4fe674511714675f35e9f154cc0b79b75ee1ffdf8db91b5889fb68a9c53b, 0x0859088c8bf69b32da25eb5637bbd2db6af8b152259f8386ffa74d73a842f169), - (0x104893debb057a57febe0db9e6243527cccc93e4524fbcb8326c376052010793, 0x0fd548af47b503811c146b10f39ff037599711dd80b29e624fc4400ce2cf6369), - (0x22d317c8881c13ed6a16c3fc8c9ddec3e0795cb845219162fd2dd744ab6d3ebd, 0x075f58c50410344de2450e261b951d6ad8a5e1373567b0570caa1dff6834780f), - (0x30e304a5d0a2dcda446e01a02e6d4436d1d9e6e587841a0a698014bb2c04706b, 0x164db4feeb61d80e49903c615e638efa42a7add04c44aff109d5d33fbb65c211), - (0x129000b15f60bf3f3321b868452c63d34de4ecec0966096d6d6430706839f3f9, 0x05be3abffb6ea7a200265f4c367081cb7c166f0e4c2a4227526f4a008e97bdc3), - (0x15633b5a3a2eb2192b18b3ea62c22fd1bcf6718574707a4e7c303a64a4a7f2b0, 0x01af6db1493f183315e3bfb57a1afcb3afbf1f02f58cbc6ea27511cd4ea32af7), - (0x23e7cb97bf6791925fab01101d9f41b47db4ebb09e4f4476fb463df3d4cd83a1, 0x08ef8c9c3401ca41c42331af667c45c62e017a18a983e75bebf38354bd062772), - (0x16c5f4baf2bc68482958f7924bbf25e94c39fbfe08d9c24d0523bea621c75436, 0x1a76bbd5513df6febd063b7b7eb758308089de72c5f7554051fa265ac2c11ff3), + (0x02fb5cfc62bc7250388a29c41794a1e71a1540f8ccd3be1dd75209048d871217, 0x1302535089af561bba274c29290ea485cfd5a9e4d12c88fd169de65555109d53), + (0x175ae172c15cb4f59a1000b21a55252c7fa2263ceb0e2b79ae947e97f0e3e10d, 0x37507a719799abf6d2e46e1b4fe36227af82b905fc17f9465e4d5e1aafa1ee85), + (0x2738c96c90fd6d6a56a844cd25c0c3ef22cd7e4ae5490892fde6d9818c3962b4, 0x31de6dfb5fb03a6b00103c5c247d96233ec9863c60279332263f0fee279858d3), + (0x2d3bcaac88876d8be45fa47099be09af49a73391b3c5b49fea69a440522c4f24, 0x1a35cf9296b34ca79012d289d81b632e70b86bfe50f27be355d75ecf48649c08), + (0x1aa313fa6cc8d7a53fa6ad875ef5a32665623ee512470baffd048795dcddc184, 0x2e7b4087d3e3b16911725593a42fc737ddf64707528b440b96b5050527872926), + (0x13f084c840acc771febd1ad985629498ad905a57ae9d1692e96b97e25ce50e9b, 0x2d785f60c1cb927bd59ad17f17015687aaf7ed5f9f17947866ad21cf670be621), + (0x2d5cacdf1cf549c6c8df32e63450ec5c1d8517280d144dc097a3625ceafb4797, 0x25e0ed853923c532f2c38fb3772ec91d58f44b4db82f5086192f672a86640a10), + (0x3790b4ccf0c276c6885c4accba6fec8478c34cdb1921c8f5f846e8f69c02bcf4, 0x3f7fc9373af3d643302453efaf5595ca38d4d413e448975d1eabc2bd3798d674), + (0x107bee655443a792413287fae0b57c4cc9f857a66f62dbdbca5b1f7aa59a9698, 0x0b0540333ab25c5abbb8883175f2c2ff9b2895b623f69c4b89a49c1779e50d7b), + (0x027a19c0ac9fb3d453e7089da87bf085d04e9db0bd80bef338cecaca7996288f, 0x1b432a8d64321bcb32490b01e49bbeaf585cd2faadbe47dc69431494404ea7a9), + (0x39f466f45af8fa7c3e96557e2d3c3ba4cdde2317e6eea57dc541f2c6b46f6833, 0x3991a495cd9f61de033e711927df3e04807ec7a358e1c9d3f5ae5e1ed8b68a8f), + (0x03312fa5333395d72948a9733ddc1c5624681a7894df7566ba0e78d6c5e09677, 0x0f0f985d59e03a458b0e4ca7ba32849f1d53dee8954e1103ad2d37bc52e7ad98), (0x21d210b41675a1eae44cbd0f3fd27d69e30716c71873f6089cee61acacd403ab, 0x2275e97c7e84f68bfaa528a9d8be4e059f7abefd80d03fbfca774e8414a9b7c1), (0x0f9e7de28e0f650d99d99d95c0fcd39c9dac9db5aa1973319f66922d6eb9f7d5, 0x1ba644ecc18ad711ddd33af7f695f6834e9f35c93d47a6a5273dabbe800fc7e6), (0x0aab3ab73afac76277cd94a891de15e42ceb09f3a9865dab5c814bebfbb4453f, 0x27119fec3736d99abeeef1ad7b857db7e754e0c158780ed3dd0cdd4dc2453e10), diff --git a/src/circuit_proof_test_case.bin b/src/circuit_proof_test_case.bin index bb88373755f2eb4f11cab4e357646bd3fce969a3..9047022e9e3f55db08675f32735a90282a9e4ff4 100644 GIT binary patch literal 5186 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 literal 5186 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 From f4fd74c95f7a3edb6aff390df54abe79368f07ec Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Aur=C3=A9lien=20Nicolas?= Date: Mon, 22 Aug 2022 12:00:07 +0200 Subject: [PATCH 10/16] zsa-mux: compute ZSA cm with a different hashing domain --- src/circuit/note_commit.rs | 15 ++++-- src/circuit_description | 78 ++++++++++++++++---------------- src/circuit_proof_test_case.bin | Bin 5186 -> 5186 bytes src/constants/sinsemilla.rs | 63 ++++++++++++++++++++++---- 4 files changed, 103 insertions(+), 53 deletions(-) diff --git a/src/circuit/note_commit.rs b/src/circuit/note_commit.rs index f93489e48..ba43f04b2 100644 --- a/src/circuit/note_commit.rs +++ b/src/circuit/note_commit.rs @@ -1674,15 +1674,22 @@ pub(in crate::circuit) mod gadgets { ], ); - let domain = CommitDomain::new(chip, ecc_chip.clone(), &OrchardCommitDomains::NoteCommit); + // TODO: use ZSA note_type. + let message_zsa = message.clone(); + + let domain = CommitDomain::new(chip.clone(), ecc_chip.clone(), &OrchardCommitDomains::NoteCommit); let (hash_native, zs) = domain.hash( - layouter.namespace(|| "NoteCommit hash"), + layouter.namespace(|| "NoteCommit native hash"), message, )?; - // TODO: use ZSA hash. - let hash_zsa = hash_native.clone(); + let domain_zsa = CommitDomain::new(chip, ecc_chip.clone(), &OrchardCommitDomains::NoteCommitZSA); + + let (hash_zsa, _zs_zsa) = domain_zsa.hash( + layouter.namespace(|| "NoteCommit ZSA hash"), + message_zsa, + )?; let hash = mux_chip.mux_point( layouter.namespace(|| "mux hash"), diff --git a/src/circuit_description b/src/circuit_description index 0efc270e8..4e29e4f8c 100644 --- a/src/circuit_description +++ b/src/circuit_description @@ -27377,48 +27377,48 @@ PinnedVerificationKey { (0x05f5862cad2888855bc3c1843a9eff57b11b592d9eb0e13354256661387f5231, 0x32236b14df85bf5f532a930232cb23a5c56ef7d67aaeed8bcb8fc10ea132cbd6), (0x3e727e8554679f98120355d39d958dbd8755d5a7f8b42ea87f258064c4b3eb57, 0x0c0d5c23f3ee62ac1b2d986dd3033bbcab260d590e1393de3a14a4b31ae091bb), (0x3748680dd6a91c5dec668b30fb6bf9a450aeb884b81cbc344914f265760e7131, 0x18530eaa5c58b61bd3fc38220ea484c0922524a815a8f752be955c229f9c4164), - (0x3106241309d1fd256b3a6323de64fb6608a469063675f63cb82b309e7113bf14, 0x065db5b23e6e83af7789a091ec4121c0459b19ea02e5aa22d31d055075bde58b), - (0x13467c9214f2c1eb99bba9a1a108627c36d310dacd9171ac9ca4edf9ffbb2a2a, 0x0e5156b6d2be6b9c8b359b0ef80f002363d99dafcc2e355fdd0275232c56a5fc), - (0x3b4a47041b90e261cf3c04c47dab1479649ce379c62bec82011cc57c8fa8fb2b, 0x20ec2bbf97ee463402352d49bef1f12dcd3429f09001e1cf63b58479d116cb45), - (0x25ca4b5a69e0e6cbc61c0899d9a2598961b74a8201807f189e4e55a5236064f3, 0x24e7edaf95058317a36549165150c4d4b6899efefd87f4831c4cfb9df692ac7b), - (0x3cc1e0704d9983820ceae2c4e4334557a4883abb584f813769afd0b0794d6395, 0x15717cf051a5fd4e65caa3f40a39d52297511910094998f7ab799924b45c1b15), - (0x17b51257a31216b73df7e5e51ff2037d3a3c1556682c3a2e7e67769d3ebd55b2, 0x0cd0c9b88b7267090925e34cd65fff1a4fbb2a22a2c9c2f8338d86c27d6dc4a6), - (0x09a6ca59f082ec52c4e14dda80e6e2ef254ca296f4ed06cff2a94505c11617a7, 0x0c8dd8b65dfc364ba01b8a3bf5f61d4e343a596cd531d072772dc7c78a2054a4), - (0x04f7e1d9cffc94bc1ada88a74b6e2d290fe3bcdaecd44965da6ac498144bc4db, 0x2b833195c810a3c0cd64f9f7578893d390a0c2dd16fdeb1600a985ebfdb0bcab), - (0x257bd221294e176bf9109379281afcd1613e271e1aaa13a17edd9dbc15d3f338, 0x01b0098a965c7264fd100ef8499f7a1e888d5f5b25494bf9cc997f885858eb7d), - (0x02adb7cbc9ebbbd87d7d6a41fc40cb4cf57585c6243aa204f757c9026ef20fd3, 0x327fc06fee179c6a57ed95336f9fb7854420d80dd191251a40935664ff6c8067), - (0x2d00d4ec8aa5e4b3d035131f559e4a97f896e8dbc39badb92b58a8d46b5e91df, 0x37046fb32ed8eb4ba0b4da8e1c9b56cd3832fa2ed4788f7faf4fee1f76a94c32), - (0x212f5afd70e787e2fd951e0ddc5430d1fa78f988c30740384d18cf9ff276b43b, 0x20c5a150e200caddf9a35a993668fc4742be5d924d1086f05c74ef6a78b5feb2), - (0x02c283cbde85f2ad26daddeabe01b1574ce7de68f0e329ec95a4154dd4713f29, 0x208cf96aa5255b543933ee3e9bdd054d4f15265a7c8921aaee89c192af2fd284), - (0x1f777f0e4263ec4a19f30813739c640335ffa951cc3cc586b6c4095e737f95be, 0x061c07fb12cb19582eefd858a08e689acd970c8cb9ed8f7b928d88e691a2f586), - (0x13d0bd76da4ace22c0e90b098d6073551322b8c734bf37eeca67fbf19687f550, 0x3d996cc9da5a31cefb453390b906eabbcc75797bc6a6b9c9e3af2fe7b6b8beed), - (0x26391b9ee41c2c2faeb04adb3383f53cc0994f7a2f48200f1e3dfbf3604ab4ec, 0x3871c88716cbe7f59497df62971ef616407e66cf9ce33dfa517f2c7f84aca9d3), - (0x1ff66fbece57aad5fbda474a5eb6ac1ff1fa60303fd6767a90c376d28d68d913, 0x23346b3134217783b7baa46efc387431929ec56d0aed187bd25f50336db5ce92), - (0x129898b6bcca9f9ff44f5dc76cb26bc229fa8b14ff47d9153680b0ba5c5efbf6, 0x1be1a12569bd9d26ac6225d404a52099198520eebec3ae1ef5de8a18d74b6116), - (0x2c850dfed4e085708d77a27e27fbe8f68ebf3b9325d83b3642bc01884b4acdd3, 0x384616523a3f4984f40287f2d1870057ec8a1bc23f4ad95399b1db467e44d8be), - (0x0974ad1a3c0eb4c8d2c59cd820a82b7f28ea2f7a245008d403815131ff30879e, 0x00bb593cdf920cef4965f788d65eba3c3aa07d9718dfb62e3e385849a0d692a8), - (0x1e355d783cffccafc120f462461fb312773442762383ac444009653f3d8d4be6, 0x3c60e17b18492aa2c41798b409d2bcc1857ca57ee9d2fb0001584cedc8e141d6), - (0x25219cf4eb3ab5335b9934dbfb9ffc21c75a13199706b9167ad3ec3c62375fd2, 0x0311e81e0a5f94eba29ece2d8d18df813c723748e7fc91cadc19e6ad4831e5cd), - (0x1189190c7140c25fb3bba8a8bcff6a3b6fceabbf0e19f72340e067ee2b54c4a0, 0x3f9f1830bb5cf117cbec426d8ab56f2522b50a080a1938b282d61f048e493f03), - (0x158e38d5f1746f7028a12fe429c8076808d5ebbfe328a8e4e391190e09f7c8b4, 0x244590041ac7661d9e0eccfe22e124cfe34513195c80529591d515c57303428a), - (0x00a668c6850dcd60304ddfed3a560903ea80f677d3e6be673db1a1c5fba0bba9, 0x04c42a9ba399209d1dee75b6405605352b905b6df019498d4cd5a75e748f0af0), - (0x13368605495bccc8e4e668869a945ad9f0ad837a3f9a74f5b7372cca5022ecb2, 0x0644b252c059170ef322e5fcaf000582a25ec388b571d062b385bd21b42e6870), - (0x24a6899678eff985cd28bd6a0b7f022dab59c7a88e25380fb8026014d846845c, 0x3024539dac1246a06224bf2aa89c1d424dad644a20bae5c3d3059183a00e8a1d), + (0x0b3ad00d92f45252c29d4dd34c8c3bcc0417e43346defdc8e9d08e2aa145e4fc, 0x047022c0ff68a065057afcc31daab78a5b8b52ae2d9fdd81ab378a967af2be11), + (0x3b44c08c70e24c3b7486aefab90e4bc824af2e4a38e5419ea5726114431f6594, 0x26d81bffeff10a6f71c67a11dd2201ff983263af0101ba5ac55786fd70cd1e0f), + (0x07417999a347a4315fc3ca96761927973fc2db9da253a9c2667e523eb64c64c3, 0x1b5756373c42f00b8f0706a10a0e1a78a07fdb8184474983b7a8a8fbe10bb8ec), + (0x12fb970aeb44e22b5f2a79b351c927587dbd3628c43667c34d49299a6941b664, 0x2dcbcce25f8d9ec1ea1834243ea754f17417bbe4880483daf015c48e0ea53299), + (0x1e402272ff5714a1963c32e2713070a5811eade3fccee44a7c643a5b1c156702, 0x3de1c0b61b59ca40ab5dd5d97ed53bb7b47acbda0043ba35f3231b54d81de740), + (0x0cac97a9783e60395f453c046c2597ecb0f1d95c0bd4c3d200aa7fe57b0718e6, 0x2c7604003d502d6572fda3857894d2efc571bd4e2515a75659410d14fecbc5c8), + (0x38d46c33cb89b53af577e6363b382a0b9f786793c8c9263458618c9d55aaa996, 0x073a8acc7538a108cfb7440e0e6c8ed77ad9299318c56e90d84a102573cf9e3d), + (0x00be9ec82385dac420b50f826b31c54173f58500c897cf7abf7088329f5016e0, 0x2e4c2400cbe9d02765402bf7dd183608ec4c5bbee66ca2d345d5685491cbca11), + (0x1785ca3bbf3646285d2b1e0a6786a3c7c4bc292649f874c9a93ca6c197720515, 0x21f4da6d3f19a73db2f96cc5d7e892704a92b86c9af20ed51f5569a27de08188), + (0x2493b660d0c162590393e262f1046e4ff90c7c2e3d856a5c9ee50655a89c515e, 0x3fc811b17b224089ff3bb999f50b4bed1d17e40bf16297c2e8b4b40e1a1b5508), + (0x039cd914898852e9fcb2e0624b68972a5fec48dd784e9535a71e93557bcec77d, 0x3d1d7ecc1fb4326b2d0fcb7b3a5a7d9f1778ac027210f0dbb3953bf5ae12a5fb), + (0x1cc1eb56a5f16ed6222484ac3ace06484edbf9c4ff0da3411e2c5b826a02e2b1, 0x1f4863314947932d305aca0e83d06ef96a461f6633b4d0694555c1ab622bfaa3), + (0x2e16632a8835e0a8cf74d4e221c05b10a513b049e82f2166822dd92fd62bdb34, 0x2a7fa4a0aa504938bc7e140fd49d00e9d799756fbc6c084aa1a86b847b465688), + (0x1db10c53c19421b8e34e489aa065b722868a537ca539abeeb374d375ee37ecc5, 0x24ffdfaae4d1d9eca7dd04fc3e0fb467b19aeb3538c1c4c9cece4e7ede2a12c9), + (0x38b67ac3a5632b575e7b76c28a9a0ba0937f8dccd5ba98b4b229d3061a6c02b2, 0x0fe20e8aada42373e16482a94bf0b1b0e1e8d536fa228315bc284799f2720cfe), + (0x193a939a6c9545cd93f2432c70e7f8c2f3632871fd2cdb8a8b1e553626faa3c3, 0x370788834ed4eaa2c6bb25b64d01e1ce695ab5f02dfda2b988500f09ba0605f6), + (0x3d0b76b6e08db5dce62962e811f1a6916f2bd1385a383668297c2ef4e5f2cb6f, 0x301815361206b365e93563d4cc2dfebfbdb3925f17a13e3077bcead847d2c597), + (0x0581ceea94fc32fdbef9baba57e599c1613bdcf3b08094b022ec7224ffa20c9b, 0x27fd6cae8b561ef48243d751d572a703b43bd721d5abad4fd2b92590ba530947), + (0x17fd272bb734ade7adf18d2b4a2bae1f27d8dc4f3d76623e3d8f5acaf3231dd3, 0x219cc3c3382c9e662ce51f6873a01546cc221bb9344a354dd3ca7092f3609fbf), + (0x02d05d30ba4e4303163bdba6a13e0de96594febc54708b0ba3fd235a75eb9bd0, 0x23e276e07d7eba989ada93e9ff22b98a6e09611443fd2b7fa04222e386bd6df1), + (0x30d0b56751a5735e5cc3952796b59e86704ddf003eeb26d20191d90170485b60, 0x396ccd52ec99d68f98f6ac898fda08935589b92eab830c754e7211d5058e8e8b), + (0x15934063d1fb7856a16af037fa9b4a1795adecbe7d8db20fe4fa0450202d7d88, 0x0385c0f2a285a3440ead1f68dde7b696a68c6779663c5c1d247172f20d940d20), + (0x2323d095347b023d0e60d7240b55c246d134f19461fef2d02efef68efe966dbc, 0x343c59bfaa1540d0b16f59012b5b8ab06f2e89a9842abd47937dc951c99ed234), + (0x10113a21ea966ba48220a6f24e0f8b15a16b6d4ed684327ce5afd97ed22e6a8e, 0x3998c2de00499494d0bf017a0136d014e81ddcf12b2f523dfd9f3c8032824b65), + (0x0822d5d6c32c8a6c2143d25883edf0ba9240a4c4901b3d98912fcb5b32e02c55, 0x2502a4f2ea667300d9c21f01f4ed55afc6016047ec3d83b84960c4beb7bdcef0), + (0x3a7e58b9e899b38a9cde64d329edd320c699fa57b192db27a0b44cd91ccae5a5, 0x079ac0e910d99f8204fefb00986ea2f44f907e33199194f5c100fd1f3651925e), + (0x03970969d5b59e114d9a60108ab749dce2971f73873168ec1bd280708e3b1b96, 0x24a6daca6d08c17f2233f998e1422cc6d2576685167607083108b0525b7075b0), ], permutation: VerifyingKey { commitments: [ - (0x02fb5cfc62bc7250388a29c41794a1e71a1540f8ccd3be1dd75209048d871217, 0x1302535089af561bba274c29290ea485cfd5a9e4d12c88fd169de65555109d53), - (0x175ae172c15cb4f59a1000b21a55252c7fa2263ceb0e2b79ae947e97f0e3e10d, 0x37507a719799abf6d2e46e1b4fe36227af82b905fc17f9465e4d5e1aafa1ee85), - (0x2738c96c90fd6d6a56a844cd25c0c3ef22cd7e4ae5490892fde6d9818c3962b4, 0x31de6dfb5fb03a6b00103c5c247d96233ec9863c60279332263f0fee279858d3), - (0x2d3bcaac88876d8be45fa47099be09af49a73391b3c5b49fea69a440522c4f24, 0x1a35cf9296b34ca79012d289d81b632e70b86bfe50f27be355d75ecf48649c08), - (0x1aa313fa6cc8d7a53fa6ad875ef5a32665623ee512470baffd048795dcddc184, 0x2e7b4087d3e3b16911725593a42fc737ddf64707528b440b96b5050527872926), - (0x13f084c840acc771febd1ad985629498ad905a57ae9d1692e96b97e25ce50e9b, 0x2d785f60c1cb927bd59ad17f17015687aaf7ed5f9f17947866ad21cf670be621), - (0x2d5cacdf1cf549c6c8df32e63450ec5c1d8517280d144dc097a3625ceafb4797, 0x25e0ed853923c532f2c38fb3772ec91d58f44b4db82f5086192f672a86640a10), - (0x3790b4ccf0c276c6885c4accba6fec8478c34cdb1921c8f5f846e8f69c02bcf4, 0x3f7fc9373af3d643302453efaf5595ca38d4d413e448975d1eabc2bd3798d674), - (0x107bee655443a792413287fae0b57c4cc9f857a66f62dbdbca5b1f7aa59a9698, 0x0b0540333ab25c5abbb8883175f2c2ff9b2895b623f69c4b89a49c1779e50d7b), - (0x027a19c0ac9fb3d453e7089da87bf085d04e9db0bd80bef338cecaca7996288f, 0x1b432a8d64321bcb32490b01e49bbeaf585cd2faadbe47dc69431494404ea7a9), - (0x39f466f45af8fa7c3e96557e2d3c3ba4cdde2317e6eea57dc541f2c6b46f6833, 0x3991a495cd9f61de033e711927df3e04807ec7a358e1c9d3f5ae5e1ed8b68a8f), - (0x03312fa5333395d72948a9733ddc1c5624681a7894df7566ba0e78d6c5e09677, 0x0f0f985d59e03a458b0e4ca7ba32849f1d53dee8954e1103ad2d37bc52e7ad98), + (0x1dd8538cdaf2d9cb76bbbc2ce070a7a1849c82ebc510c8b4c7328ca896126094, 0x2caf15523d510d58dfe4d67f653ee6b1175f4fba304231d84281cfe6f707fa8d), + (0x3d5a358c0c6108fd4bb1a76776b7d7c68ffecf4686640d693d7975e0c21627f1, 0x1cd56c75c1371cbd28ed810d7ef4043597f742a067a8f48b418bbd725f4fbed6), + (0x1d195b70ef8faa472ea7a4211a9e8d86efb577abc0390e175ca6a3dbb9c52dbb, 0x26c6e55077b1fdbd43fa2624827de02d774448eba9d63f0398656c6831b07b9a), + (0x198c2f1cc2459f197e98c85f85e9ed13f8a3ff9e72801730970525427f1ad399, 0x18ea8712823aaaa83bc789372f8fc03d8804142518ee1e3b91cf3d45dd842aed), + (0x0cc7116ec8b5b93e31aef0f21a56c201664f1ace676be27622536cb77460ec8a, 0x1609b52d7e622f85ae74d1f4a4fecf5269b3ed13de43684fd90cd6b694f18bf6), + (0x1ed99f930a8c44ba5c15485ab19ff2e4c6049589721a7ae9f06b2f653c6ccdf1, 0x0251124b186f99430123d5230980b07d4470b8d3fc473afcf24f6470c9e0c2c9), + (0x1f82733dcc2011fb5a47bfb09a9dae725aa4d3240994c891fcc56c61b5e07e30, 0x244548ab440ff89e9ecbbb6c87b45d7652e272f227da1e565b72527b5d4c36f6), + (0x3e2bc6994299f1716aa999042768bb77bed309c21736d69724bd355d7f0e9b6b, 0x034c3baa0eab5c05f36432cfb7bed01e4b779ef78a26ab1a9258d1cb0ecee520), + (0x1c33033ceb09ed64453c21d1b706d65913fe96d1df2004b6f29179d3f030800b, 0x082f1a389d7cc49eadf5085a639f31b3a5630b3ece607d44313f5f0a33ab239b), + (0x3eeff467adead22a5508126169f25b61e287f7453a0940a55887dbbc66c64f46, 0x0010332f18af926c46c187dbce714f31e1ac9c28c72693b39b10eba46c29d603), + (0x1f1fec9ee29f85d85e36656751cc7c7bb58ab2046db7c16d3fe7f4aa72d90475, 0x098b287a83e0fa4f01a8c81e30ea8b5589016b54bcb6ca560c9aea12d971f9eb), + (0x19f81530b4d517661c90b3cceb26394e42c4f9b310b2d15ec4f609d9507c22e6, 0x3e5acbfab72439dd9e7f0cae80b3869bf4d30ed2c814da08e5a391cb45187478), (0x21d210b41675a1eae44cbd0f3fd27d69e30716c71873f6089cee61acacd403ab, 0x2275e97c7e84f68bfaa528a9d8be4e059f7abefd80d03fbfca774e8414a9b7c1), (0x0f9e7de28e0f650d99d99d95c0fcd39c9dac9db5aa1973319f66922d6eb9f7d5, 0x1ba644ecc18ad711ddd33af7f695f6834e9f35c93d47a6a5273dabbe800fc7e6), (0x0aab3ab73afac76277cd94a891de15e42ceb09f3a9865dab5c814bebfbb4453f, 0x27119fec3736d99abeeef1ad7b857db7e754e0c158780ed3dd0cdd4dc2453e10), diff --git a/src/circuit_proof_test_case.bin b/src/circuit_proof_test_case.bin index 9047022e9e3f55db08675f32735a90282a9e4ff4..280ef4dafe87e341cd692b0e370e889c51f403ce 100644 GIT binary patch literal 5186 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 literal 5186 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 diff --git a/src/constants/sinsemilla.rs b/src/constants/sinsemilla.rs index f6c6ffba6..3358ef672 100644 --- a/src/constants/sinsemilla.rs +++ b/src/constants/sinsemilla.rs @@ -1,11 +1,12 @@ //! Sinsemilla generators -use super::{OrchardFixedBases, OrchardFixedBasesFull}; -use crate::spec::i2lebsp; -use halo2_gadgets::sinsemilla::{CommitDomains, HashDomains}; - use group::ff::PrimeField; +use halo2_gadgets::sinsemilla::{CommitDomains, HashDomains}; use pasta_curves::{arithmetic::CurveAffine, pallas}; +use crate::spec::i2lebsp; + +use super::{OrchardFixedBases, OrchardFixedBasesFull}; + /// Number of bits of each message piece in $\mathsf{SinsemillaHashToPoint}$ pub const K: usize = 10; @@ -37,6 +38,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 +91,7 @@ pub(crate) fn i2lebsp_k(int: usize) -> [bool; K] { #[derive(Clone, Debug, Eq, PartialEq)] pub enum OrchardHashDomains { NoteCommit, + NoteCommitZSA, CommitIvk, MerkleCrh, } @@ -96,6 +110,11 @@ impl HashDomains for OrchardHashDomains { pallas::Base::from_repr(Q_NOTE_COMMITMENT_M_GENERATOR.1).unwrap(), ) .unwrap(), + OrchardHashDomains::NoteCommitZSA => 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,13 +127,15 @@ impl HashDomains for OrchardHashDomains { #[derive(Clone, Debug, Eq, PartialEq)] pub enum OrchardCommitDomains { NoteCommit, + NoteCommitZSA, CommitIvk, } impl CommitDomains for OrchardCommitDomains { fn r(&self) -> OrchardFixedBasesFull { match self { - Self::NoteCommit => OrchardFixedBasesFull::NoteCommitR, + // Native and ZSA notes share the same blinding domain. + Self::NoteCommit | Self::NoteCommitZSA => 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::NoteCommitZSA => OrchardHashDomains::NoteCommitZSA, Self::CommitIvk => OrchardHashDomains::CommitIvk, } } @@ -129,17 +151,22 @@ impl CommitDomains for Or #[cfg(test)] mod tests { - use super::*; - use crate::constants::{ - fixed_bases::{COMMIT_IVK_PERSONALIZATION, NOTE_COMMITMENT_PERSONALIZATION}, - sinsemilla::MERKLE_CRH_PERSONALIZATION, - }; use group::{ff::PrimeField, Curve}; use halo2_gadgets::sinsemilla::primitives::{CommitDomain, HashDomain}; use halo2_proofs::arithmetic::CurveAffine; use halo2_proofs::pasta::pallas; use rand::{self, rngs::OsRng, Rng}; + use crate::constants::{ + fixed_bases::{ + COMMIT_IVK_PERSONALIZATION, NOTE_COMMITMENT_PERSONALIZATION, + NOTE_ZSA_COMMITMENT_PERSONALIZATION, + }, + sinsemilla::MERKLE_CRH_PERSONALIZATION, + }; + + use super::*; + #[test] // Nodes in the Merkle tree are Pallas base field elements. fn l_orchard_merkle() { @@ -192,6 +219,22 @@ mod tests { ); } + #[test] + fn q_note_commitment_zsa_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); From 610d6309b64a5f7a3949d232dfbe7404645008d2 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Aur=C3=A9lien=20Nicolas?= Date: Mon, 22 Aug 2022 18:29:56 +0200 Subject: [PATCH 11/16] zsa-mux: note_type as argument to note_commit --- src/circuit.rs | 2 ++ src/circuit/note_commit.rs | 10 ++++++++++ 2 files changed, 12 insertions(+) diff --git a/src/circuit.rs b/src/circuit.rs index f4bec659c..2b9aa049c 100644 --- a/src/circuit.rs +++ b/src/circuit.rs @@ -625,6 +625,7 @@ impl plonk::Circuit for Circuit { pk_d_old.inner(), v_old.clone(), is_zsa.clone(), + note_type.inner(), rho_old, psi_old, rcm_old, @@ -685,6 +686,7 @@ impl plonk::Circuit for Circuit { pk_d_new.inner(), v_new.clone(), is_zsa.clone(), + note_type.inner(), rho_new, psi_new, rcm_new, diff --git a/src/circuit/note_commit.rs b/src/circuit/note_commit.rs index ba43f04b2..e2ef15b79 100644 --- a/src/circuit/note_commit.rs +++ b/src/circuit/note_commit.rs @@ -1583,6 +1583,7 @@ pub(in crate::circuit) mod gadgets { pk_d: &NonIdentityEccPoint, value: AssignedCell, is_zsa: AssignedCell, + note_type: &NonIdentityEccPoint, rho: AssignedCell, psi: AssignedCell, rcm: ScalarFixed>, @@ -2085,6 +2086,7 @@ mod tests { use rand::{rngs::OsRng, RngCore}; use crate::circuit::gadget::mux_chip::MuxChip; + use crate::note::NoteType; #[test] fn note_commit() { @@ -2277,6 +2279,13 @@ mod tests { Value::known(rcm), )?; + // Witness note_type as a point. + let note_type = NonIdentityPoint::new( + ecc_chip.clone(), + layouter.namespace(|| "note_type"), + Value::known(NoteType::native().cv_base().to_affine()), + )?; + let cm = gadgets::note_commit( layouter.namespace(|| "Hash NoteCommit pieces"), sinsemilla_chip, @@ -2287,6 +2296,7 @@ mod tests { pk_d.inner(), value_var, is_zsa, + note_type.inner(), rho, psi, rcm_gadget, From 29808bd56587aff45ddc325e192071c5e7fe815d Mon Sep 17 00:00:00 2001 From: Paul <3682187+PaulLaux@users.noreply.github.com> Date: Mon, 19 Sep 2022 13:26:08 +0300 Subject: [PATCH 12/16] Zsa builder (#4) + Updated test bsk_consistent_with_bvk to verify mixed note types. + Added NoteType support to the builder and the bundle. + added split_flag to SpentInfo and as input to the Circuit (currently commented out) + added conditional cv_sum calculation (currently commented out) + added padding to actions --- .gitignore | 2 + benches/circuit.rs | 9 ++- benches/note_decryption.rs | 17 ++++- src/action.rs | 8 ++- src/builder.rs | 133 +++++++++++++++++++++++++++++-------- src/circuit.rs | 4 +- src/note.rs | 7 +- src/note/note_type.rs | 33 +++++++-- src/note_encryption.rs | 3 +- src/tree.rs | 2 +- src/value.rs | 74 +++++++++++++++++---- tests/builder.rs | 17 ++++- 12 files changed, 249 insertions(+), 60 deletions(-) diff --git a/.gitignore b/.gitignore index 57ee1a9ad..d7f36bd31 100644 --- a/.gitignore +++ b/.gitignore @@ -3,3 +3,5 @@ Cargo.lock .vscode .idea +action-circuit-layout.png +proptest-regressions/*.txt diff --git a/benches/circuit.rs b/benches/circuit.rs index 3140a90a4..6400513e2 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::NoteType; use orchard::{ builder::Builder, bundle::Flags, @@ -32,7 +33,13 @@ fn criterion_benchmark(c: &mut Criterion) { ); for _ in 0..num_recipients { builder - .add_recipient(None, recipient, NoteValue::from_raw(10), None) + .add_recipient( + None, + recipient, + NoteValue::from_raw(10), + NoteType::native(), + None, + ) .unwrap(); } let bundle: Bundle<_, i64> = builder.build(rng).unwrap(); diff --git a/benches/note_decryption.rs b/benches/note_decryption.rs index cab432fe3..73d4fcaea 100644 --- a/benches/note_decryption.rs +++ b/benches/note_decryption.rs @@ -4,6 +4,7 @@ use orchard::{ bundle::Flags, circuit::ProvingKey, keys::{FullViewingKey, Scope, SpendingKey}, + note::NoteType, note_encryption::{CompactAction, OrchardDomain}, value::NoteValue, Anchor, Bundle, @@ -51,10 +52,22 @@ fn bench_note_decryption(c: &mut Criterion) { // The builder pads to two actions, and shuffles their order. Add two recipients // so the first action is always decryptable. builder - .add_recipient(None, recipient, NoteValue::from_raw(10), None) + .add_recipient( + None, + recipient, + NoteValue::from_raw(10), + NoteType::native(), + None, + ) .unwrap(); builder - .add_recipient(None, recipient, NoteValue::from_raw(10), None) + .add_recipient( + None, + recipient, + NoteValue::from_raw(10), + NoteType::native(), + None, + ) .unwrap(); let bundle: Bundle<_, i64> = builder.build(rng).unwrap(); bundle diff --git a/src/action.rs b/src/action.rs index b6396ed91..b1eda4819 100644 --- a/src/action.rs +++ b/src/action.rs @@ -126,7 +126,7 @@ pub(crate) mod testing { use proptest::prelude::*; - use crate::note::NoteType; + use crate::note::note_type::testing::arb_note_type; use crate::{ note::{ commitment::ExtractedNoteCommitment, nullifier::testing::arb_nullifier, @@ -147,12 +147,13 @@ pub(crate) mod testing { nf in arb_nullifier(), rk in arb_spendauth_verification_key(), note in arb_note(output_value), + note_type in arb_note_type() ) -> Action<()> { let cmx = ExtractedNoteCommitment::from(note.commitment()); let cv_net = ValueCommitment::derive( spend_value - output_value, ValueCommitTrapdoor::zero(), - NoteType::native() + note_type ); // FIXME: make a real one from the note. let encrypted_note = TransmittedNoteCiphertext { @@ -179,12 +180,13 @@ 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), + note_type in arb_note_type() ) -> Action> { let cmx = ExtractedNoteCommitment::from(note.commitment()); let cv_net = ValueCommitment::derive( spend_value - output_value, ValueCommitTrapdoor::zero(), - NoteType::native() + note_type ); // FIXME: make a real one from the note. diff --git a/src/builder.rs b/src/builder.rs index 7e3f00de1..0ce8a06cc 100644 --- a/src/builder.rs +++ b/src/builder.rs @@ -2,6 +2,7 @@ use core::fmt; use core::iter; +use std::collections::HashMap; use ff::Field; use halo2_proofs::circuit::Value; @@ -58,21 +59,23 @@ impl From for Error { } /// Information about a specific note to be spent in an [`Action`]. -#[derive(Debug)] +#[derive(Debug, Clone)] struct SpendInfo { dummy_sk: Option, fvk: FullViewingKey, scope: Scope, note: Note, merkle_path: MerklePath, + // a flag to indicate whether the value of the note will be counted in the value sum of the action. + split_flag: bool, } impl SpendInfo { /// 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(note_type: NoteType, rng: &mut impl RngCore) -> Self { + let (sk, fvk, note) = Note::dummy(rng, None, note_type); let merkle_path = MerklePath::dummy(rng); SpendInfo { @@ -83,16 +86,25 @@ impl SpendInfo { scope: Scope::External, note, merkle_path, + split_flag: false, } } + + /// Duplicates the spend info and set the split flag to `true`. + fn create_split_spend(&self) -> Self { + let mut split_spend = self.clone(); + split_spend.split_flag = true; + split_spend + } } /// Information about a specific recipient to receive funds in an [`Action`]. -#[derive(Debug)] +#[derive(Debug, Clone)] struct RecipientInfo { ovk: Option, recipient: Address, value: NoteValue, + note_type: NoteType, memo: Option<[u8; 512]>, } @@ -108,6 +120,7 @@ impl RecipientInfo { ovk: None, recipient, value: NoteValue::zero(), + note_type: NoteType::native(), memo: None, } } @@ -131,7 +144,17 @@ impl ActionInfo { } /// Returns the value sum for this action. + /// Split notes does not contribute to the value sum. fn value_sum(&self) -> ValueSum { + // TODO: Aurel, uncomment when circuit for split flag is implemented. + // let spent_value = self + // .spend + // .split_flag + // .then(|| self.spend.note.value()) + // .unwrap_or_else(NoteValue::zero); + // + // spent_value - self.output.value + self.spend.note.value() - self.output.value } @@ -141,8 +164,15 @@ impl ActionInfo { /// /// [orchardsend]: https://zips.z.cash/protocol/nu5.pdf#orchardsend fn build(self, mut rng: impl RngCore) -> (Action, Circuit) { + assert_eq!( + self.output.note_type, + self.spend.note.note_type(), + "spend and recipient note types must be equal" + ); + let v_net = self.value_sum(); - let cv_net = ValueCommitment::derive(v_net, self.rcv, NoteType::native()); + let note_type = self.output.note_type; + let cv_net = ValueCommitment::derive(v_net, self.rcv, note_type); let nf_old = self.spend.note.nullifier(&self.spend.fvk); let sender_address = self.spend.note.recipient(); @@ -202,6 +232,7 @@ impl ActionInfo { g_d_old: Value::known(sender_address.g_d()), pk_d_old: Value::known(*sender_address.pk_d()), v_old: Value::known(self.spend.note.value()), + // split_flag: Value::known(self.spend.split_flag), rho_old: Value::known(rho_old), psi_old: Value::known(psi_old), rcm_old: Value::known(rcm_old), @@ -283,6 +314,7 @@ impl Builder { scope, note, merkle_path, + split_flag: false, }); Ok(()) @@ -294,6 +326,7 @@ impl Builder { ovk: Option, recipient: Address, value: NoteValue, + note_type: NoteType, memo: Option<[u8; 512]>, ) -> Result<(), &'static str> { if !self.flags.outputs_enabled() { @@ -304,6 +337,7 @@ impl Builder { ovk, recipient, value, + note_type, memo, }); @@ -315,23 +349,31 @@ impl Builder { /// The returned bundle will have no proof or signatures; these can be applied with /// [`Bundle::create_proof`] and [`Bundle::apply_signatures`] respectively. pub fn build>( - mut self, + self, mut rng: impl RngCore, ) -> Result, V>, Error> { + let mut pre_actions: Vec<_> = Vec::new(); + // Pair up the spends and recipients, extending with dummy values as necessary. - let pre_actions: Vec<_> = { - let num_spends = self.spends.len(); - let num_recipients = self.recipients.len(); + for (note_type, (mut spends, mut recipients)) in partition(&self.spends, &self.recipients) { + let num_spends = spends.len(); + let num_recipients = recipients.len(); let num_actions = [num_spends, num_recipients, MIN_ACTIONS] .iter() .max() .cloned() .unwrap(); - self.spends.extend( - iter::repeat_with(|| SpendInfo::dummy(&mut rng)).take(num_actions - num_spends), + // use the first spend to create split spend(s) or create a dummy if empty. + let dummy_spend = spends.first().map_or_else( + || SpendInfo::dummy(note_type, &mut rng), + |s| s.create_split_spend(), ); - self.recipients.extend( + + // Extend the spends and recipients with dummy values. + spends.extend(iter::repeat_with(|| dummy_spend.clone()).take(num_actions - num_spends)); + + recipients.extend( iter::repeat_with(|| RecipientInfo::dummy(&mut rng)) .take(num_actions - num_recipients), ); @@ -339,15 +381,16 @@ impl Builder { // Shuffle the spends and recipients, 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. - self.spends.shuffle(&mut rng); - self.recipients.shuffle(&mut rng); - - self.spends - .into_iter() - .zip(self.recipients.into_iter()) - .map(|(spend, recipient)| ActionInfo::new(spend, recipient, &mut rng)) - .collect() - }; + spends.shuffle(&mut rng); + recipients.shuffle(&mut rng); + + pre_actions.extend( + spends + .into_iter() + .zip(recipients.into_iter()) + .map(|(spend, recipient)| ActionInfo::new(spend, recipient, &mut rng)), + ); + } // Move some things out of self that we will need. let flags = self.flags; @@ -399,6 +442,30 @@ impl Builder { } } +/// partition a list of spends and recipients by note types. +fn partition( + spends: &[SpendInfo], + recipients: &[RecipientInfo], +) -> HashMap, Vec)> { + let mut hm = HashMap::new(); + + for s in spends.iter() { + hm.entry(s.note.note_type()) + .or_insert((vec![], vec![])) + .0 + .push(s.clone()); + } + + for r in recipients.iter() { + hm.entry(r.note_type) + .or_insert((vec![], vec![])) + .1 + .push(r.clone()) + } + + hm +} + /// Marker trait representing bundle signatures in the process of being created. pub trait InProgressSignatures: fmt::Debug { /// The authorization type of an Orchard action in the process of being authorized. @@ -663,6 +730,7 @@ pub mod testing { use proptest::collection::vec; use proptest::prelude::*; + use crate::note::NoteType; use crate::{ address::testing::arb_address, bundle::{Authorized, Bundle, Flags}, @@ -690,7 +758,7 @@ pub mod testing { sk: SpendingKey, anchor: Anchor, notes: Vec<(Note, MerklePath)>, - recipient_amounts: Vec<(Address, NoteValue)>, + recipient_amounts: Vec<(Address, NoteValue, NoteType)>, } impl ArbitraryBundleInputs { @@ -704,12 +772,12 @@ pub mod testing { builder.add_spend(fvk.clone(), note, path).unwrap(); } - for (addr, value) in self.recipient_amounts.into_iter() { + for (addr, value, note_type) in self.recipient_amounts.into_iter() { let scope = fvk.scope_for_address(&addr).unwrap(); let ovk = fvk.to_ovk(scope); builder - .add_recipient(Some(ovk.clone()), addr, value, None) + .add_recipient(Some(ovk.clone()), addr, value, note_type, None) .unwrap(); } @@ -743,9 +811,11 @@ pub mod testing { recipient_amounts in vec( arb_address().prop_flat_map(move |a| { arb_positive_note_value(MAX_NOTE_VALUE / n_recipients as u64) - .prop_map(move |v| (a, v)) + .prop_map(move |v| { + (a,v, NoteType::native()) + }) }), - n_recipients as usize + n_recipients as usize, ), rng_seed in prop::array::uniform32(prop::num::u8::ANY) ) -> ArbitraryBundleInputs { @@ -793,6 +863,8 @@ mod tests { use rand::rngs::OsRng; use super::Builder; + // use crate::keys::{IssuerAuthorizingKey, IssuerValidatingKey}; + use crate::note::NoteType; use crate::{ bundle::{Authorized, Bundle, Flags}, circuit::ProvingKey, @@ -817,8 +889,15 @@ mod tests { ); builder - .add_recipient(None, recipient, NoteValue::from_raw(5000), None) + .add_recipient( + None, + recipient, + NoteValue::from_raw(5000), + NoteType::native(), + None, + ) .unwrap(); + let bundle: Bundle = builder .build(&mut rng) .unwrap() diff --git a/src/circuit.rs b/src/circuit.rs index b9f64175d..346ae9b33 100644 --- a/src/circuit.rs +++ b/src/circuit.rs @@ -909,7 +909,7 @@ mod tests { }; fn generate_circuit_instance(mut rng: R) -> (Circuit, Instance) { - let (_, fvk, spent_note) = Note::dummy(&mut rng, None); + let (_, fvk, spent_note) = Note::dummy(&mut rng, None, NoteType::native()); let sender_address = spent_note.recipient(); let nk = *fvk.nk(); @@ -919,7 +919,7 @@ mod tests { let alpha = pallas::Scalar::random(&mut rng); let rk = ak.randomize(&alpha); - let (_, _, output_note) = Note::dummy(&mut rng, Some(nf_old)); + let (_, _, output_note) = Note::dummy(&mut rng, Some(nf_old), NoteType::native()); let cmx = output_note.commitment().into(); let value = spent_note.value() - output_note.value(); diff --git a/src/note.rs b/src/note.rs index 514836e50..9e56e31d0 100644 --- a/src/note.rs +++ b/src/note.rs @@ -163,6 +163,7 @@ impl Note { pub(crate) fn dummy( rng: &mut impl RngCore, rho: Option, + note_type: NoteType, ) -> (SpendingKey, FullViewingKey, Self) { let sk = SpendingKey::random(rng); let fvk: FullViewingKey = (&sk).into(); @@ -171,7 +172,7 @@ impl Note { let note = Note::new( recipient, NoteValue::zero(), - NoteType::native(), + note_type, rho.unwrap_or_else(|| Nullifier::dummy(rng)), rng, ); @@ -189,7 +190,7 @@ impl Note { self.value } - /// Returns the note type + /// Returns the note type of this note. pub fn note_type(&self) -> NoteType { self.note_type } @@ -296,7 +297,7 @@ 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(), diff --git a/src/note/note_type.rs b/src/note/note_type.rs index 6075259e3..8ac04b00b 100644 --- a/src/note/note_type.rs +++ b/src/note/note_type.rs @@ -1,16 +1,18 @@ use 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::{VALUE_COMMITMENT_PERSONALIZATION, VALUE_COMMITMENT_V_BYTES}; use crate::keys::IssuerValidatingKey; /// Note type identifier. -#[derive(Clone, Copy, Debug, PartialEq, Eq)] -pub struct NoteType(pub(crate) pallas::Point); +#[derive(Clone, Copy, Debug, Eq)] +pub struct NoteType(pallas::Point); -const MAX_ASSET_DESCRIPTION_SIZE: usize = 512; +pub const MAX_ASSET_DESCRIPTION_SIZE: usize = 512; // the hasher used to derive the assetID #[allow(non_snake_case)] @@ -62,16 +64,29 @@ impl NoteType { } } +impl Hash for NoteType { + fn hash(&self, h: &mut H) { + h.write(&self.to_bytes()); + h.finish(); + } +} + +impl PartialEq for NoteType { + 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::NoteType; + use proptest::prelude::*; use crate::keys::{testing::arb_spending_key, IssuerAuthorizingKey, IssuerValidatingKey}; - use super::NoteType; - prop_compose! { /// Generate a uniformly distributed note type pub fn arb_note_type()( @@ -89,4 +104,12 @@ pub mod testing { } } } + + prop_compose! { + /// Generate the native note type + pub fn native_note_type()(_i in 0..10) -> NoteType { + // TODO: remove _i + NoteType::native() + } + } } diff --git a/src/note_encryption.rs b/src/note_encryption.rs index 721185831..eeeacf575 100644 --- a/src/note_encryption.rs +++ b/src/note_encryption.rs @@ -394,6 +394,7 @@ mod tests { EphemeralKeyBytes, }; + use super::{prf_ock_orchard, CompactAction, OrchardDomain, OrchardNoteEncryption}; use crate::note::NoteType; use crate::{ action::Action, @@ -411,7 +412,6 @@ mod tests { }; use super::{get_note_version, orchard_parse_note_plaintext_without_memo}; - use super::{prf_ock_orchard, CompactAction, OrchardDomain, OrchardNoteEncryption}; proptest! { #[test] @@ -438,6 +438,7 @@ mod tests { // Check. assert_eq!(parsed_note, note); assert_eq!(parsed_recipient, note.recipient()); + if parsed_note.note_type().is_native().into() { assert_eq!(parsed_version, 0x02); assert_eq!(&parsed_memo, memo); diff --git a/src/tree.rs b/src/tree.rs index c2854200b..7e9601312 100644 --- a/src/tree.rs +++ b/src/tree.rs @@ -77,7 +77,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 8db1839aa..a3a2e7a8a 100644 --- a/src/value.rs +++ b/src/value.rs @@ -38,6 +38,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}; @@ -187,6 +188,18 @@ impl Add for 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) + } +} + impl<'a> Sum<&'a ValueSum> for Result { fn sum>(iter: I) -> Self { iter.fold(Ok(ValueSum(0)), |acc, v| (acc? + *v).ok_or(OverflowError)) @@ -407,7 +420,8 @@ pub mod testing { #[cfg(test)] mod tests { - use crate::note::note_type::testing::arb_note_type; + use crate::note::note_type::testing::{arb_note_type, native_note_type}; + use crate::note::NoteType; use proptest::prelude::*; @@ -417,43 +431,77 @@ mod tests { }; use crate::primitives::redpallas; - fn _bsk_consistent_with_bvk(values: &[(ValueSum, ValueCommitTrapdoor)], note_type: NoteType) { - let value_balance = values + fn _bsk_consistent_with_bvk( + native_values: &[(ValueSum, ValueCommitTrapdoor, NoteType)], + arb_values: &[(ValueSum, ValueCommitTrapdoor, NoteType)], + neg_trapdoors: &[ValueCommitTrapdoor], + ) { + // 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, _, note_type), rcv)| ((-value).unwrap(), rcv, note_type)) + .collect(); + + let native_value_balance = native_values .iter() - .map(|(value, _)| value) + .map(|(value, _, _)| value) .sum::>() .expect("we generate values that won't overflow"); + let values = [native_values, arb_values, &neg_arb_values].concat(); + let bsk = values .iter() - .map(|(_, rcv)| rcv) + .map(|(_, rcv, _)| rcv) .sum::() .into_bsk(); let bvk = (values .iter() - .map(|(value, rcv)| ValueCommitment::derive(*value, *rcv, note_type)) + .map(|(value, rcv, note_type)| ValueCommitment::derive(*value, *rcv, *note_type)) .sum::() - - ValueCommitment::derive(value_balance, ValueCommitTrapdoor::zero(), note_type)) + - ValueCommitment::derive( + native_value_balance, + ValueCommitTrapdoor::zero(), + NoteType::native(), + )) .into_bvk(); assert_eq!(redpallas::VerificationKey::from(&bsk), bvk); } + proptest! { + #[test] + fn bsk_consistent_with_bvk_native_only( + 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(), native_note_type()), n_values) + ) + ), + ) { + // Test with native note type (zec) only + _bsk_consistent_with_bvk(&native_values, &[], &[]); + } + } + proptest! { #[test] fn bsk_consistent_with_bvk( - values in (1usize..10).prop_flat_map(|n_values| + 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_note_type()), n_values) ) ), - arb_note_type in arb_note_type(), + (arb_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_note_type()), n_values) + ), prop::collection::vec(arb_trapdoor(), n_values)) + ), ) { // Test with native note type (zec) - _bsk_consistent_with_bvk(&values, NoteType::native()); - // Test with arbitrary note type - _bsk_consistent_with_bvk(&values, arb_note_type); + _bsk_consistent_with_bvk(&native_values, &arb_values, &neg_trapdoors); } } } diff --git a/tests/builder.rs b/tests/builder.rs index 35c53976d..4329efc7a 100644 --- a/tests/builder.rs +++ b/tests/builder.rs @@ -1,4 +1,5 @@ use incrementalmerkletree::{bridgetree::BridgeTree, Hashable, Tree}; +use orchard::note::NoteType; use orchard::{ builder::Builder, bundle::{Authorized, Flags}, @@ -43,7 +44,13 @@ fn bundle_chain() { let mut builder = Builder::new(Flags::from_parts(false, true), anchor); assert_eq!( - builder.add_recipient(None, recipient, NoteValue::from_raw(5000), None), + builder.add_recipient( + None, + recipient, + NoteValue::from_raw(5000), + NoteType::native(), + None + ), Ok(()) ); let unauthorized = builder.build(&mut rng).unwrap(); @@ -85,7 +92,13 @@ fn bundle_chain() { let mut builder = Builder::new(Flags::from_parts(true, true), anchor); assert_eq!(builder.add_spend(fvk, note, merkle_path), Ok(())); assert_eq!( - builder.add_recipient(None, recipient, NoteValue::from_raw(5000), None), + builder.add_recipient( + None, + recipient, + NoteValue::from_raw(5000), + NoteType::native(), + None + ), Ok(()) ); let unauthorized = builder.build(&mut rng).unwrap(); From 030b88dcecf37c56dc80de0cd852add0aa9eb6c6 Mon Sep 17 00:00:00 2001 From: naure Date: Sun, 25 Sep 2022 16:30:56 +0200 Subject: [PATCH 13/16] Hash the note type into the note commitment (#13) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit * zsa-mux: draft note_type into hash * zsa-hash-note-type: calculate the value of h_2 for native/ZSA * zsa-hash-note-type: recompose note_type from hash parts * zsa-hash-note-type: decomposition check but not canonicity check * zsa-hash-note-type: remove canonicity check of note_type * zsa-hash-note-type: remove unused canonicity check variables * zsa-hash-note-type: fix lint Co-authored-by: Aurélien Nicolas --- src/circuit.rs | 18 +- src/circuit/gadget/mux_chip.rs | 44 +- src/circuit/note_commit.rs | 383 ++++++-- src/circuit_description | 1518 +++++++++++++++---------------- src/circuit_proof_test_case.bin | Bin 5186 -> 5250 bytes 5 files changed, 1118 insertions(+), 845 deletions(-) diff --git a/src/circuit.rs b/src/circuit.rs index 288f176bb..e11e684b9 100644 --- a/src/circuit.rs +++ b/src/circuit.rs @@ -66,7 +66,8 @@ pub mod gadget; mod note_commit; /// Size of the Orchard circuit. -const K: u32 = 11; +const K: u32 = 12; +// TODO: attempt to optimize back to K=11. // Absolute offsets for public inputs. const ANCHOR: usize = 0; @@ -407,6 +408,7 @@ impl plonk::Circuit for Circuit { let is_zsa_value = note_type_value.map(|nt| !bool::from(nt.is_native())); // Witness boolean is_zsa. + // TODO: or use RangeConstrained::witness_short? let mux_chip = config.mux_chip(); let is_zsa = mux_chip.witness_switch(layouter.namespace(|| "witness is_zsa"), is_zsa_value)?; @@ -685,7 +687,7 @@ impl plonk::Circuit for Circuit { g_d_new.inner(), pk_d_new.inner(), v_new.clone(), - is_zsa.clone(), + is_zsa, note_type.inner(), rho_new, psi_new, @@ -1055,8 +1057,8 @@ mod tests { K as usize, &circuits[0], ); - assert_eq!(usize::from(circuit_cost.proof_size(1)), 5024); - assert_eq!(usize::from(circuit_cost.proof_size(2)), 7296); + assert_eq!(usize::from(circuit_cost.proof_size(1)), 5088); + assert_eq!(usize::from(circuit_cost.proof_size(2)), 7360); usize::from(circuit_cost.proof_size(instances.len())) }; @@ -1100,8 +1102,8 @@ mod tests { w.write_all(&<[u8; 32]>::from(instance.rk.clone()))?; w.write_all(&instance.cmx.to_bytes())?; w.write_all(&[ - if instance.enable_spend { 1 } else { 0 }, - if instance.enable_output { 1 } else { 0 }, + instance.enable_spend as u8, + instance.enable_output as u8, ])?; w.write_all(proof.as_ref())?; @@ -1153,7 +1155,7 @@ mod tests { 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"); @@ -1164,7 +1166,7 @@ mod tests { let test_case_bytes = include_bytes!("circuit_proof_test_case.bin"); read_test_case(&test_case_bytes[..]).expect("proof must be valid") }; - assert_eq!(proof.0.len(), 5024); + assert_eq!(proof.0.len(), 5088); assert!(proof.verify(&vk, &[instance]).is_ok()); } diff --git a/src/circuit/gadget/mux_chip.rs b/src/circuit/gadget/mux_chip.rs index 09fb8e094..5fae92fa6 100644 --- a/src/circuit/gadget/mux_chip.rs +++ b/src/circuit/gadget/mux_chip.rs @@ -79,6 +79,7 @@ impl MuxChip { } } +// TODO: simplify or generalize this API. pub trait MuxInstructions { fn witness_switch( &self, @@ -94,6 +95,14 @@ pub trait MuxInstructions { right: &AssignedCell, ) -> Result, plonk::Error>; + fn mux_const( + &self, + layouter: impl Layouter, + switch: &AssignedCell, + left: &C::Base, + right: &AssignedCell, + ) -> Result, plonk::Error>; + fn mux_point( &self, layouter: impl Layouter, @@ -134,7 +143,7 @@ impl MuxInstructions for MuxChip { || "load switch", self.config.switch, 0, - || value.map(|b| pallas::Base::from(b)), + || value.map(pallas::Base::from), )?; // Copy the switch into the left input. @@ -185,6 +194,39 @@ impl MuxInstructions for MuxChip { ) } + fn mux_const( + &self, + mut layouter: impl Layouter, + switch: &AssignedCell, + left: &pallas::Base, + right: &AssignedCell, + ) -> Result, plonk::Error> { + layouter.assign_region( + || "mux", + |mut region| { + // Enable the multiplexer gate. + self.config.q_mux.enable(&mut region, 0)?; + + // Copy the inputs into the multiplexer row. + switch.copy_advice(|| "copy switch", &mut region, self.config.switch, 0)?; + + region.assign_advice_from_constant( + || "constant left", + self.config.left, + 0, + *left, + )?; + + right.copy_advice(|| "copy right", &mut region, self.config.right, 0)?; + + // Assign the output value into the multiplexer row. + let out_val = compute_mux(switch.value(), Value::known(left), right.value()); + + region.assign_advice(|| "out", self.config.out, 0, || out_val) + }, + ) + } + fn mux_point( &self, mut layouter: impl Layouter, diff --git a/src/circuit/note_commit.rs b/src/circuit/note_commit.rs index e2ef15b79..004efcc3f 100644 --- a/src/circuit/note_commit.rs +++ b/src/circuit/note_commit.rs @@ -1,16 +1,5 @@ use core::iter; -use halo2_proofs::{ - circuit::{AssignedCell, Layouter, Value}, - plonk::{Advice, Column, ConstraintSystem, Constraints, Error, Expression, Selector}, - poly::Rotation, -}; -use pasta_curves::{arithmetic::FieldExt, pallas}; - -use crate::{ - constants::{OrchardCommitDomains, OrchardFixedBases, OrchardHashDomains, T_P}, - value::NoteValue, -}; use halo2_gadgets::{ ecc::{ chip::{EccChip, NonIdentityEccPoint}, @@ -24,7 +13,18 @@ use halo2_gadgets::{ bool_check, lookup_range_check::LookupRangeCheckConfig, FieldValue, RangeConstrained, }, }; +use halo2_proofs::{ + circuit::{AssignedCell, Layouter, Value}, + plonk::{Advice, Column, ConstraintSystem, Constraints, Error, Expression, Selector}, + poly::Rotation, +}; +use pasta_curves::{arithmetic::FieldExt, pallas}; + use crate::circuit::gadget::mux_chip::{MuxConfig, MuxInstructions}; +use crate::{ + constants::{OrchardCommitDomains, OrchardFixedBases, OrchardHashDomains, T_P}, + value::NoteValue, +}; type NoteCommitPiece = MessagePiece< pallas::Affine, @@ -577,11 +577,11 @@ impl DecomposeG { } /// h = h_0 || h_1 || h_2 -/// = (bits 249..=253 of psi) || (bit 254 of psi) || 4 zero bits +/// = (bits 249..=253 of psi) || (bit 254 of psi) || (4 bits of note_type or zeros) /// -/// | A_6 | A_7 | A_8 | q_notecommit_h | +/// | A_6 | A_7 | A_8 | A_9 | q_notecommit_h | /// ------------------------------------ -/// | h | h_0 | h_1 | 1 | +/// | h | h_0 | h_1 | h_2 | 1 | /// /// https://p.z.cash/orchard-0.1:note-commit-decomposition-h?partial #[derive(Clone, Debug)] @@ -590,6 +590,7 @@ struct DecomposeH { col_l: Column, col_m: Column, col_r: Column, + col_z: Column, } impl DecomposeH { @@ -598,7 +599,9 @@ impl DecomposeH { col_l: Column, col_m: Column, col_r: Column, + col_z: Column, two_pow_5: pallas::Base, + two_pow_6: pallas::Base, ) -> Self { let q_notecommit_h = meta.selector(); @@ -611,9 +614,11 @@ impl DecomposeH { 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_2 has been constrained to be 4 bits outside this gate. + let h_2 = meta.query_advice(col_z, Rotation::cur()); - // h = h_0 + (2^5) h_1 - let decomposition_check = h - (h_0 + h_1.clone() * two_pow_5); + // h = h_0 + (2^5) h_1 + (2^6) h_2 + let decomposition_check = h - (h_0 + h_1.clone() * two_pow_5 + h_2 * two_pow_6); Constraints::with_selector( q_notecommit_h, @@ -629,6 +634,7 @@ impl DecomposeH { col_l, col_m, col_r, + col_z, } } @@ -638,6 +644,7 @@ impl DecomposeH { chip: SinsemillaChip, layouter: &mut impl Layouter, psi: &AssignedCell, + h_2: &RangeConstrained>, ) -> Result< ( NoteCommitPiece, @@ -657,14 +664,12 @@ impl DecomposeH { // h_1 will be boolean-constrained in the gate. let h_1 = RangeConstrained::bitrange_of(psi.value(), 254..255); + // h_2 must have been constrained to be 4 bits outside of this gate. + let h = MessagePiece::from_subpieces( chip, layouter.namespace(|| "h"), - [ - h_0.value(), - h_1, - RangeConstrained::bitrange_of(Value::known(&pallas::Base::zero()), 0..4), - ], + [h_0.value(), h_1, h_2.value()], )?; Ok((h, h_0, h_1)) @@ -676,6 +681,7 @@ impl DecomposeH { h: NoteCommitPiece, h_0: RangeConstrained>, h_1: RangeConstrained>, + h_2: RangeConstrained>, ) -> Result, Error> { layouter.assign_region( || "NoteCommit MessagePiece h", @@ -688,6 +694,8 @@ impl DecomposeH { 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_2.inner() + .copy_advice(|| "h_2", &mut region, self.col_z, 0)?; Ok(h_1) }, @@ -695,6 +703,92 @@ impl DecomposeH { } } +/// j = j_0 || j_1 || j_2 || j_3 +/// = (bit 254 of x(note_type)) || (ỹ bit of note_type) || (8 zeros) || (50 zeros) +/// +/// | A_6 | A_7 | A_8 | q_notecommit_d | +/// ------------------------------------ +/// | j | j_0 | j_1 | 1 | +/// | | j_2 | j_3 | 0 | +/// +/// https://p.z.cash/orchard-0.1:note-commit-decomposition-d?partial +#[derive(Clone, Debug)] +struct DecomposeJ { + d: DecomposeD, +} + +impl DecomposeJ { + fn configure(d: DecomposeD) -> Self { + // Reuse the gates of DecomposeD::configure + Self { d } + } + + #[allow(clippy::type_complexity)] + fn decompose( + chip: SinsemillaChip, + layouter: &mut impl Layouter, + note_type: &NonIdentityEccPoint, + ) -> Result< + ( + NoteCommitPiece, + RangeConstrained>, + RangeConstrained>, + ), + Error, + > { + // j_0, j_1 will be boolean-constrained in the gate. + let j_0 = RangeConstrained::bitrange_of(note_type.x().value(), 254..255); + let j_1 = RangeConstrained::bitrange_of(note_type.y().value(), 0..1); + + let j_2 = RangeConstrained::bitrange_of(Value::known(&pallas::Base::zero()), 0..8); + + let j = MessagePiece::from_subpieces(chip, layouter.namespace(|| "j"), [j_0, j_1, j_2])?; + + 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.d.q_notecommit_d.enable(&mut region, 0)?; + + j.inner() + .cell_value() + .copy_advice(|| "j", &mut region, self.d.col_l, 0)?; + + let j_0 = region.assign_advice(|| "j_0", self.d.col_m, 0, || *j_0.inner())?; + + j_1.inner() + .copy_advice(|| "j_1", &mut region, self.d.col_r, 0)?; + + region.assign_advice_from_constant( + || "j_2 = 0", + self.d.col_m, + 1, + pallas::Base::zero(), + )?; + + // TODO: should this instead copy like z1_d in DecomposeD? + region.assign_advice_from_constant( + || "j_3 = 0", + self.d.col_r, + 1, + pallas::Base::zero(), + )?; + + Ok(j_0) + }, + ) + } +} + /// | A_6 | A_7 | A_8 | A_9 | q_notecommit_g_d | /// ----------------------------------------------------------- /// | x(g_d) | b_0 | a | z13_a | 1 | @@ -929,6 +1023,99 @@ impl PkdCanonicity { } } +/// | 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 | +/// +/// https://p.z.cash/orchard-0.1:note-commit-canonicity-pk_d?partial +#[derive(Clone, Debug)] +struct NoteTypeCanonicity { + q_notecommit_note_type: Selector, + col_l: Column, + col_m: Column, + col_r: Column, + col_z: Column, +} + +impl NoteTypeCanonicity { + #[allow(clippy::too_many_arguments)] + fn configure( + meta: &mut ConstraintSystem, + col_l: Column, + col_m: Column, + col_r: Column, + col_z: Column, + two_pow_4: pallas::Base, + two_pow_254: pallas::Base, + ) -> Self { + let q_notecommit_note_type = meta.selector(); + + meta.create_gate("NoteCommit input note_type", |meta| { + let q_notecommit_pk_d = meta.query_selector(q_notecommit_note_type); + + let note_type_x = meta.query_advice(col_l, Rotation::cur()); + + // `h_2` has been constrained to 4 bits outside this gate. + let h_2 = meta.query_advice(col_m, Rotation::cur()); + // j_0 has been constrained to be boolean outside this gate. + let j_0 = meta.query_advice(col_m, Rotation::next()); + // `i` has been constrained to 250 bits by the Sinsemilla hash. + let i = meta.query_advice(col_r, Rotation::cur()); + + // x(note_type) = h_2 + (2^4)i + (2^254)j_0 + let decomposition_check = { + let sum = h_2.clone() + i.clone() * two_pow_4 + j_0.clone() * two_pow_254; + sum - note_type_x + }; + + // TODO: check that the canonicity check is indeed not necessary + // for note_type (e.g., for cv computation). + Constraints::with_selector( + q_notecommit_pk_d, + iter::empty().chain(Some(("decomposition", decomposition_check))), + ) + }); + + Self { + q_notecommit_note_type, + col_l, + col_m, + col_r, + col_z, + } + } + + #[allow(clippy::too_many_arguments)] + fn assign( + &self, + layouter: &mut impl Layouter, + note_type: &NonIdentityEccPoint, + h_2: RangeConstrained>, + i: NoteCommitPiece, + j_0: AssignedCell, + ) -> Result<(), Error> { + layouter.assign_region( + || "NoteCommit input note_type", + |mut region| { + note_type + .x() + .copy_advice(|| "note_type_x", &mut region, self.col_l, 0)?; + + h_2.inner() + .copy_advice(|| "h_2", &mut region, self.col_m, 0)?; + j_0.copy_advice(|| "j_0", &mut region, self.col_m, 1)?; + + i.inner() + .cell_value() + .copy_advice(|| "i", &mut region, self.col_r, 0)?; + + self.q_notecommit_note_type.enable(&mut region, 0) + }, + ) + } +} + /// | A_6 | A_7 | A_8 | A_9 | q_notecommit_value | /// ------------------------------------------------ /// | value | d_2 | d_3 | e_0 | 1 | @@ -1418,8 +1605,10 @@ pub struct NoteCommitConfig { e: DecomposeE, g: DecomposeG, h: DecomposeH, + j: DecomposeJ, g_d: GdCanonicity, pk_d: PkdCanonicity, + note_type: NoteTypeCanonicity, value: ValueCanonicity, rho: RhoCanonicity, psi: PsiCanonicity, @@ -1476,7 +1665,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, col_z, two_pow_5, two_pow_6); + let j = DecomposeJ::configure(d.clone()); let g_d = GdCanonicity::configure( meta, @@ -1502,6 +1692,16 @@ impl NoteCommitChip { t_p.clone(), ); + let note_type = NoteTypeCanonicity::configure( + meta, + col_l, + col_m, + col_r, + col_z, + two_pow_4, + two_pow_254, + ); + let value = ValueCanonicity::configure(meta, col_l, col_m, col_r, col_z, two_pow_8, two_pow_58); @@ -1547,8 +1747,10 @@ impl NoteCommitChip { e, g, h, + j, g_d, pk_d, + note_type, value, rho, psi, @@ -1567,9 +1769,10 @@ impl NoteCommitChip { pub(in crate::circuit) mod gadgets { use halo2_proofs::circuit::{Chip, Value}; - use super::*; use crate::circuit::gadget::mux_chip::MuxChip; + use super::*; + #[allow(clippy::many_single_char_names)] #[allow(clippy::type_complexity)] #[allow(clippy::too_many_arguments)] @@ -1632,8 +1835,36 @@ pub(in crate::circuit) mod gadgets { // h = h_0 || h_1 || h_2 // = (bits 249..=253 of psi) || (bit 254 of psi) || 4 zero bits + // Constrain h_2_zsa to be 4 bits. + // TODO: Enforce h_2_zsa==h_2 for note_type recomposition. + let h_2_zsa = RangeConstrained::witness_short( + &lookup_config, + layouter.namespace(|| "h_2_zsa"), + note_type.x().value(), + 0..4, + )?; + // The value of h_2 is 4 zeros OR (bits 0..=3 of x(note_type)). + let h_2 = mux_chip.mux_const( + layouter.namespace(|| "h_2 = 0 or start of note_type"), + &is_zsa, + &pallas::Base::zero(), + &h_2_zsa.inner(), + )?; + let h_2 = RangeConstrained::unsound_unchecked(h_2, h_2_zsa.num_bits()); let (h, h_0, h_1) = - DecomposeH::decompose(&lookup_config, chip.clone(), &mut layouter, &psi)?; + DecomposeH::decompose(&lookup_config, chip.clone(), &mut layouter, &psi, &h_2)?; + // TODO: move the block above into DecomposeH. + + // i = bits 4..=253 of x(note_type) + let i = MessagePiece::from_subpieces( + chip.clone(), + layouter.namespace(|| "i"), + [RangeConstrained::bitrange_of(note_type.x().value(), 4..254)], + )?; + + // j = j_0 || j_1 || j_2 + // = (bit 254 of x(note_type)) || (ỹ bit of note_type) || 8 zeros + let (j, j_0, j_1) = DecomposeJ::decompose(chip.clone(), &mut layouter, note_type)?; // Check decomposition of `y(g_d)`. let b_2 = y_canonicity( @@ -1651,6 +1882,14 @@ pub(in crate::circuit) mod gadgets { pk_d.y(), d_1, )?; + // Check decomposition of `y(note_type)`. + let j_1 = y_canonicity( + &lookup_config, + ¬e_commit_chip.config.y_canon, + layouter.namespace(|| "y(note_type) decomposition"), + note_type.y(), + j_1, // Similar to d_1. + )?; // cm = NoteCommit^Orchard_rcm(g★_d || pk★_d || i2lebsp_{64}(v) || rho || psi) // @@ -1675,22 +1914,37 @@ pub(in crate::circuit) mod gadgets { ], ); - // TODO: use ZSA note_type. - let message_zsa = message.clone(); + let message_zsa = Message::from_pieces( + chip.clone(), + vec![ + a.clone(), + b.clone(), + c.clone(), + d.clone(), + e.clone(), + f.clone(), + g.clone(), + h.clone(), + // Compared to the native message, add i and j. + i.clone(), + j.clone(), + ], + ); - let domain = CommitDomain::new(chip.clone(), ecc_chip.clone(), &OrchardCommitDomains::NoteCommit); + let domain = CommitDomain::new( + chip.clone(), + ecc_chip.clone(), + &OrchardCommitDomains::NoteCommit, + ); - let (hash_native, zs) = domain.hash( - layouter.namespace(|| "NoteCommit native hash"), - message, - )?; + let (hash_native, _zs) = + domain.hash(layouter.namespace(|| "NoteCommit native hash"), message)?; - let domain_zsa = CommitDomain::new(chip, ecc_chip.clone(), &OrchardCommitDomains::NoteCommitZSA); + let domain_zsa = + CommitDomain::new(chip, ecc_chip.clone(), &OrchardCommitDomains::NoteCommitZSA); - let (hash_zsa, _zs_zsa) = domain_zsa.hash( - layouter.namespace(|| "NoteCommit ZSA hash"), - message_zsa, - )?; + let (hash_zsa, zs) = + domain_zsa.hash(layouter.namespace(|| "NoteCommit ZSA hash"), message_zsa)?; let hash = mux_chip.mux_point( layouter.namespace(|| "mux hash"), @@ -1700,13 +1954,8 @@ pub(in crate::circuit) mod gadgets { )?; let hash = Point::from_inner(ecc_chip.clone(), hash); - let cm = domain.blind( - layouter.namespace(|| "NoteCommit blind"), - hash, - rcm, - )?; + let cm = domain.blind(layouter.namespace(|| "NoteCommit blind"), hash, rcm)?; - // TODO: handle zs in the zsa case. (cm, zs) }; @@ -1765,7 +2014,11 @@ 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, h_0.clone(), h_1, h_2.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)?; @@ -1781,6 +2034,15 @@ pub(in crate::circuit) mod gadgets { z14_b3_c_prime, )?; + // Check note_type, using the same chip as pk_d. + cfg.note_type.assign( + &mut layouter.namespace(|| "note_type"), + note_type, + h_2_zsa, // Similar to b_3. + i, // Similar to c. + j_0, // Similar to d_0. + )?; + cfg.value.assign(&mut layouter, value, d_2, z1_d, e_0)?; cfg.rho.assign( @@ -2050,18 +2312,8 @@ pub(in crate::circuit) mod gadgets { mod tests { use core::iter; - use super::NoteCommitConfig; - use crate::{ - circuit::{ - gadget::assign_free_advice, - note_commit::{gadgets, NoteCommitChip}, - }, - constants::{ - fixed_bases::NOTE_COMMITMENT_PERSONALIZATION, OrchardCommitDomains, OrchardFixedBases, - OrchardHashDomains, L_ORCHARD_BASE, L_VALUE, T_Q, - }, - value::NoteValue, - }; + use ff::{Field, PrimeField, PrimeFieldBits}; + use group::Curve; use halo2_gadgets::{ ecc::{ chip::{EccChip, EccConfig}, @@ -2071,9 +2323,6 @@ mod tests { sinsemilla::primitives::CommitDomain, utilities::lookup_range_check::LookupRangeCheckConfig, }; - - use ff::{Field, PrimeField, PrimeFieldBits}; - use group::Curve; use halo2_proofs::{ circuit::{Layouter, SimpleFloorPlanner, Value}, dev::MockProver, @@ -2083,10 +2332,23 @@ mod tests { arithmetic::{CurveAffine, FieldExt}, pallas, }; - use rand::{rngs::OsRng, RngCore}; + use crate::circuit::gadget::mux_chip::MuxChip; use crate::note::NoteType; + use crate::{ + circuit::{ + gadget::assign_free_advice, + note_commit::{gadgets, NoteCommitChip}, + }, + constants::{ + fixed_bases::NOTE_COMMITMENT_PERSONALIZATION, OrchardCommitDomains, OrchardFixedBases, + OrchardHashDomains, L_ORCHARD_BASE, L_VALUE, T_Q, + }, + value::NoteValue, + }; + + use super::NoteCommitConfig; #[test] fn note_commit() { @@ -2160,7 +2422,8 @@ mod tests { lookup, range_check, ); - let mux_config = MuxChip::configure(meta, advices[0], advices[1], advices[2], advices[3]); + let mux_config = + MuxChip::configure(meta, advices[0], advices[1], advices[2], advices[3]); let note_commit_config = NoteCommitChip::configure(meta, advices, sinsemilla_config, mux_config); diff --git a/src/circuit_description b/src/circuit_description index 4e29e4f8c..242989b1b 100644 --- a/src/circuit_description +++ b/src/circuit_description @@ -2,15 +2,15 @@ PinnedVerificationKey { base_modulus: "0x40000000000000000000000000000000224698fc0994a8dd8c46eb2100000001", scalar_modulus: "0x40000000000000000000000000000000224698fc094cf91b992d30ed00000001", domain: PinnedEvaluationDomain { - k: 11, - extended_k: 14, - omega: 0x181b50ad5f32119e31cbd395426d600b7a9b88bcaaa1c24eef28545aada17813, + k: 12, + extended_k: 15, + omega: 0x028961bbd9c63b7bd7c75f72e02a9727d14d99e7985184470d34cd1b8ef03001, }, cs: PinnedConstraintSystem { num_fixed_columns: 30, num_advice_columns: 10, num_instance_columns: 1, - num_selectors: 57, + num_selectors: 59, gates: [ Product( Product( @@ -18583,22 +18583,34 @@ PinnedVerificationKey { }, Negated( 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, + ), + }, + 0x0000000000000000000000000000000000000000000000000000000000000020, ), - }, + ), Scaled( Advice { - query_index: 8, - column_index: 8, + query_index: 9, + column_index: 9, rotation: Rotation( 0, ), }, - 0x0000000000000000000000000000000000000000000000000000000000000020, + 0x0000000000000000000000000000000000000000000000000000000000000040, ), ), ), @@ -19745,6 +19757,153 @@ 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, + ), + }, + 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: 27, + column_index: 27, + rotation: Rotation( + 0, + ), + }, + Sum( + Constant( + 0x0000000000000000000000000000000000000000000000000000000000000001, + ), + 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, + ), + }, + ), + ), + ), Sum( Sum( Sum( @@ -19819,7 +19978,7 @@ PinnedVerificationKey { ), Sum( Constant( - 0x0000000000000000000000000000000000000000000000000000000000000003, + 0x0000000000000000000000000000000000000000000000000000000000000002, ), Negated( Fixed { @@ -19966,7 +20125,7 @@ PinnedVerificationKey { ), Sum( Constant( - 0x0000000000000000000000000000000000000000000000000000000000000003, + 0x0000000000000000000000000000000000000000000000000000000000000002, ), Negated( Fixed { @@ -20113,7 +20272,7 @@ PinnedVerificationKey { ), Sum( Constant( - 0x0000000000000000000000000000000000000000000000000000000000000003, + 0x0000000000000000000000000000000000000000000000000000000000000002, ), Negated( Fixed { @@ -20234,7 +20393,7 @@ PinnedVerificationKey { ), Sum( Constant( - 0x0000000000000000000000000000000000000000000000000000000000000003, + 0x0000000000000000000000000000000000000000000000000000000000000002, ), Negated( Fixed { @@ -20370,7 +20529,7 @@ PinnedVerificationKey { ), Sum( Constant( - 0x0000000000000000000000000000000000000000000000000000000000000004, + 0x0000000000000000000000000000000000000000000000000000000000000003, ), Negated( Fixed { @@ -20529,7 +20688,7 @@ PinnedVerificationKey { ), Sum( Constant( - 0x0000000000000000000000000000000000000000000000000000000000000004, + 0x0000000000000000000000000000000000000000000000000000000000000003, ), Negated( Fixed { @@ -20676,7 +20835,7 @@ PinnedVerificationKey { ), Sum( Constant( - 0x0000000000000000000000000000000000000000000000000000000000000004, + 0x0000000000000000000000000000000000000000000000000000000000000003, ), Negated( Fixed { @@ -20797,7 +20956,7 @@ PinnedVerificationKey { ), Sum( Constant( - 0x0000000000000000000000000000000000000000000000000000000000000004, + 0x0000000000000000000000000000000000000000000000000000000000000003, ), Negated( Fixed { @@ -20918,7 +21077,7 @@ PinnedVerificationKey { ), Sum( Constant( - 0x0000000000000000000000000000000000000000000000000000000000000004, + 0x0000000000000000000000000000000000000000000000000000000000000003, ), Negated( Fixed { @@ -21054,7 +21213,7 @@ PinnedVerificationKey { ), Sum( Constant( - 0x0000000000000000000000000000000000000000000000000000000000000005, + 0x0000000000000000000000000000000000000000000000000000000000000004, ), Negated( Fixed { @@ -21182,7 +21341,7 @@ PinnedVerificationKey { ), Sum( Constant( - 0x0000000000000000000000000000000000000000000000000000000000000005, + 0x0000000000000000000000000000000000000000000000000000000000000004, ), Negated( Fixed { @@ -21329,7 +21488,7 @@ PinnedVerificationKey { ), Sum( Constant( - 0x0000000000000000000000000000000000000000000000000000000000000005, + 0x0000000000000000000000000000000000000000000000000000000000000004, ), Negated( Fixed { @@ -21476,7 +21635,7 @@ PinnedVerificationKey { ), Sum( Constant( - 0x0000000000000000000000000000000000000000000000000000000000000005, + 0x0000000000000000000000000000000000000000000000000000000000000004, ), Negated( Fixed { @@ -21611,7 +21770,7 @@ PinnedVerificationKey { ), Sum( Constant( - 0x0000000000000000000000000000000000000000000000000000000000000005, + 0x0000000000000000000000000000000000000000000000000000000000000004, ), Negated( Fixed { @@ -21732,7 +21891,7 @@ PinnedVerificationKey { ), Sum( Constant( - 0x0000000000000000000000000000000000000000000000000000000000000005, + 0x0000000000000000000000000000000000000000000000000000000000000004, ), Negated( Fixed { @@ -21853,7 +22012,7 @@ PinnedVerificationKey { ), Sum( Constant( - 0x0000000000000000000000000000000000000000000000000000000000000005, + 0x0000000000000000000000000000000000000000000000000000000000000004, ), Negated( Fixed { @@ -21989,7 +22148,7 @@ PinnedVerificationKey { ), Sum( Constant( - 0x0000000000000000000000000000000000000000000000000000000000000006, + 0x0000000000000000000000000000000000000000000000000000000000000005, ), Negated( Fixed { @@ -22117,7 +22276,7 @@ PinnedVerificationKey { ), Sum( Constant( - 0x0000000000000000000000000000000000000000000000000000000000000006, + 0x0000000000000000000000000000000000000000000000000000000000000005, ), Negated( Fixed { @@ -22245,7 +22404,7 @@ PinnedVerificationKey { ), Sum( Constant( - 0x0000000000000000000000000000000000000000000000000000000000000006, + 0x0000000000000000000000000000000000000000000000000000000000000005, ), Negated( Fixed { @@ -22419,7 +22578,7 @@ PinnedVerificationKey { ), Sum( Constant( - 0x0000000000000000000000000000000000000000000000000000000000000007, + 0x0000000000000000000000000000000000000000000000000000000000000006, ), Negated( Fixed { @@ -22547,7 +22706,7 @@ PinnedVerificationKey { ), Sum( Constant( - 0x0000000000000000000000000000000000000000000000000000000000000007, + 0x0000000000000000000000000000000000000000000000000000000000000006, ), Negated( Fixed { @@ -22675,7 +22834,7 @@ PinnedVerificationKey { ), Sum( Constant( - 0x0000000000000000000000000000000000000000000000000000000000000007, + 0x0000000000000000000000000000000000000000000000000000000000000006, ), Negated( Fixed { @@ -22751,20 +22910,20 @@ PinnedVerificationKey { Product( Product( Fixed { - query_index: 27, - column_index: 27, + query_index: 28, + column_index: 28, rotation: Rotation( 0, ), }, Sum( Constant( - 0x0000000000000000000000000000000000000000000000000000000000000001, + 0x0000000000000000000000000000000000000000000000000000000000000002, ), Negated( Fixed { - query_index: 27, - column_index: 27, + query_index: 28, + column_index: 28, rotation: Rotation( 0, ), @@ -22774,12 +22933,12 @@ PinnedVerificationKey { ), Sum( Constant( - 0x0000000000000000000000000000000000000000000000000000000000000002, + 0x0000000000000000000000000000000000000000000000000000000000000003, ), Negated( Fixed { - query_index: 27, - column_index: 27, + query_index: 28, + column_index: 28, rotation: Rotation( 0, ), @@ -22789,12 +22948,12 @@ PinnedVerificationKey { ), Sum( Constant( - 0x0000000000000000000000000000000000000000000000000000000000000003, + 0x0000000000000000000000000000000000000000000000000000000000000004, ), Negated( Fixed { - query_index: 27, - column_index: 27, + query_index: 28, + column_index: 28, rotation: Rotation( 0, ), @@ -22804,12 +22963,12 @@ PinnedVerificationKey { ), Sum( Constant( - 0x0000000000000000000000000000000000000000000000000000000000000004, + 0x0000000000000000000000000000000000000000000000000000000000000005, ), Negated( Fixed { - query_index: 27, - column_index: 27, + query_index: 28, + column_index: 28, rotation: Rotation( 0, ), @@ -22819,12 +22978,12 @@ PinnedVerificationKey { ), Sum( Constant( - 0x0000000000000000000000000000000000000000000000000000000000000005, + 0x0000000000000000000000000000000000000000000000000000000000000006, ), Negated( Fixed { - query_index: 27, - column_index: 27, + query_index: 28, + column_index: 28, rotation: Rotation( 0, ), @@ -22834,12 +22993,12 @@ PinnedVerificationKey { ), Sum( Constant( - 0x0000000000000000000000000000000000000000000000000000000000000006, + 0x0000000000000000000000000000000000000000000000000000000000000007, ), Negated( Fixed { - query_index: 27, - column_index: 27, + query_index: 28, + column_index: 28, rotation: Rotation( 0, ), @@ -22894,7 +23053,7 @@ PinnedVerificationKey { }, Sum( Constant( - 0x0000000000000000000000000000000000000000000000000000000000000002, + 0x0000000000000000000000000000000000000000000000000000000000000001, ), Negated( Fixed { @@ -23022,7 +23181,7 @@ PinnedVerificationKey { }, Sum( Constant( - 0x0000000000000000000000000000000000000000000000000000000000000002, + 0x0000000000000000000000000000000000000000000000000000000000000001, ), Negated( Fixed { @@ -23184,7 +23343,7 @@ PinnedVerificationKey { ), Sum( Constant( - 0x0000000000000000000000000000000000000000000000000000000000000003, + 0x0000000000000000000000000000000000000000000000000000000000000002, ), Negated( Fixed { @@ -23312,7 +23471,7 @@ PinnedVerificationKey { ), Sum( Constant( - 0x0000000000000000000000000000000000000000000000000000000000000003, + 0x0000000000000000000000000000000000000000000000000000000000000002, ), Negated( Fixed { @@ -23395,22 +23554,34 @@ PinnedVerificationKey { }, Negated( 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, + ), + }, + 0x0000000000000000000000000000000000000000000000000000000000000020, ), - }, + ), Scaled( Advice { - query_index: 8, - column_index: 8, + query_index: 9, + column_index: 9, rotation: Rotation( 0, ), }, - 0x0000000000000000000000000000000000000000000000000000000000000020, + 0x0000000000000000000000000000000000000000000000000000000000000040, ), ), ), @@ -23462,7 +23633,7 @@ PinnedVerificationKey { ), Sum( Constant( - 0x0000000000000000000000000000000000000000000000000000000000000004, + 0x0000000000000000000000000000000000000000000000000000000000000003, ), Negated( Fixed { @@ -23609,7 +23780,7 @@ PinnedVerificationKey { ), Sum( Constant( - 0x0000000000000000000000000000000000000000000000000000000000000004, + 0x0000000000000000000000000000000000000000000000000000000000000003, ), Negated( Fixed { @@ -23744,7 +23915,7 @@ PinnedVerificationKey { ), Sum( Constant( - 0x0000000000000000000000000000000000000000000000000000000000000004, + 0x0000000000000000000000000000000000000000000000000000000000000003, ), Negated( Fixed { @@ -23865,7 +24036,7 @@ PinnedVerificationKey { ), Sum( Constant( - 0x0000000000000000000000000000000000000000000000000000000000000004, + 0x0000000000000000000000000000000000000000000000000000000000000003, ), Negated( Fixed { @@ -23986,7 +24157,7 @@ PinnedVerificationKey { ), Sum( Constant( - 0x0000000000000000000000000000000000000000000000000000000000000004, + 0x0000000000000000000000000000000000000000000000000000000000000003, ), Negated( Fixed { @@ -24122,7 +24293,7 @@ PinnedVerificationKey { ), Sum( Constant( - 0x0000000000000000000000000000000000000000000000000000000000000005, + 0x0000000000000000000000000000000000000000000000000000000000000004, ), Negated( Fixed { @@ -24269,7 +24440,7 @@ PinnedVerificationKey { ), Sum( Constant( - 0x0000000000000000000000000000000000000000000000000000000000000005, + 0x0000000000000000000000000000000000000000000000000000000000000004, ), Negated( Fixed { @@ -24416,7 +24587,7 @@ PinnedVerificationKey { ), Sum( Constant( - 0x0000000000000000000000000000000000000000000000000000000000000005, + 0x0000000000000000000000000000000000000000000000000000000000000004, ), Negated( Fixed { @@ -24537,7 +24708,7 @@ PinnedVerificationKey { ), Sum( Constant( - 0x0000000000000000000000000000000000000000000000000000000000000005, + 0x0000000000000000000000000000000000000000000000000000000000000004, ), Negated( Fixed { @@ -24673,7 +24844,7 @@ PinnedVerificationKey { ), Sum( Constant( - 0x0000000000000000000000000000000000000000000000000000000000000006, + 0x0000000000000000000000000000000000000000000000000000000000000005, ), Negated( Fixed { @@ -24719,18 +24890,18 @@ PinnedVerificationKey { 0, ), }, - 0x0000000000000000000000000000000000000000000000000000000000000100, + 0x0000000000000000000000000000000000000000000000000000000000000010, ), ), Scaled( Advice { - query_index: 9, - column_index: 9, + query_index: 18, + column_index: 7, rotation: Rotation( - 0, + 1, ), }, - 0x0000000000000000000000000000000000000000000000000400000000000000, + 0x4000000000000000000000000000000000000000000000000000000000000000, ), ), Negated( @@ -24835,7 +25006,7 @@ PinnedVerificationKey { ), Sum( Constant( - 0x0000000000000000000000000000000000000000000000000000000000000007, + 0x0000000000000000000000000000000000000000000000000000000000000006, ), Negated( Fixed { @@ -24866,18 +25037,18 @@ PinnedVerificationKey { 0, ), }, - 0x0000000000000000000000000000000000000000000000000000000000000010, + 0x0000000000000000000000000000000000000000000000000000000000000100, ), ), Scaled( Advice { - query_index: 18, - column_index: 7, + query_index: 9, + column_index: 9, rotation: Rotation( - 1, + 0, ), }, - 0x4000000000000000000000000000000000000000000000000000000000000000, + 0x0000000000000000000000000000000000000000000000000400000000000000, ), ), Negated( @@ -24894,85 +25065,104 @@ PinnedVerificationKey { 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: 29, + column_index: 29, + rotation: Rotation( + 0, + ), + }, + Sum( + Constant( + 0x0000000000000000000000000000000000000000000000000000000000000002, + ), + Negated( + Fixed { + query_index: 29, + column_index: 29, + rotation: Rotation( + 0, ), - ), + }, ), - Sum( - Constant( - 0x0000000000000000000000000000000000000000000000000000000000000004, + ), + ), + Sum( + Constant( + 0x0000000000000000000000000000000000000000000000000000000000000003, + ), + Negated( + Fixed { + query_index: 29, + column_index: 29, + rotation: Rotation( + 0, ), - Negated( - Fixed { - query_index: 28, - column_index: 28, - rotation: Rotation( - 0, - ), - }, + }, + ), + ), + ), + 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: 18, + column_index: 7, + rotation: Rotation( + 1, + ), + }, + 0x4000000000000000000000000000000000000000000000000000000000000000, + ), + ), + Negated( + Advice { + query_index: 6, + column_index: 6, + rotation: Rotation( + 0, + ), + }, + ), + ), + ), + Product( + Product( + Product( + Fixed { + query_index: 29, + column_index: 29, + rotation: Rotation( + 0, + ), + }, Sum( Constant( - 0x0000000000000000000000000000000000000000000000000000000000000005, + 0x0000000000000000000000000000000000000000000000000000000000000002, ), Negated( Fixed { - query_index: 28, - column_index: 28, + query_index: 29, + column_index: 29, rotation: Rotation( 0, ), @@ -24982,12 +25172,12 @@ PinnedVerificationKey { ), Sum( Constant( - 0x0000000000000000000000000000000000000000000000000000000000000007, + 0x0000000000000000000000000000000000000000000000000000000000000003, ), Negated( Fixed { - query_index: 28, - column_index: 28, + query_index: 29, + column_index: 29, rotation: Rotation( 0, ), @@ -25041,85 +25231,21 @@ PinnedVerificationKey { 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: 28, - column_index: 28, - rotation: Rotation( - 0, - ), - }, - ), + Fixed { + query_index: 29, + column_index: 29, + rotation: Rotation( + 0, ), - ), + }, Sum( Constant( - 0x0000000000000000000000000000000000000000000000000000000000000005, + 0x0000000000000000000000000000000000000000000000000000000000000002, ), Negated( Fixed { - query_index: 28, - column_index: 28, + query_index: 29, + column_index: 29, rotation: Rotation( 0, ), @@ -25129,12 +25255,12 @@ PinnedVerificationKey { ), Sum( Constant( - 0x0000000000000000000000000000000000000000000000000000000000000007, + 0x0000000000000000000000000000000000000000000000000000000000000003, ), Negated( Fixed { - query_index: 28, - column_index: 28, + query_index: 29, + column_index: 29, rotation: Rotation( 0, ), @@ -25162,85 +25288,21 @@ PinnedVerificationKey { 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: 28, - column_index: 28, - rotation: Rotation( - 0, - ), - }, - ), + Fixed { + query_index: 29, + column_index: 29, + rotation: Rotation( + 0, ), - ), + }, Sum( Constant( - 0x0000000000000000000000000000000000000000000000000000000000000005, + 0x0000000000000000000000000000000000000000000000000000000000000002, ), Negated( Fixed { - query_index: 28, - column_index: 28, + query_index: 29, + column_index: 29, rotation: Rotation( 0, ), @@ -25250,12 +25312,12 @@ PinnedVerificationKey { ), Sum( Constant( - 0x0000000000000000000000000000000000000000000000000000000000000007, + 0x0000000000000000000000000000000000000000000000000000000000000003, ), Negated( Fixed { - query_index: 28, - column_index: 28, + query_index: 29, + column_index: 29, rotation: Rotation( 0, ), @@ -25283,85 +25345,21 @@ PinnedVerificationKey { 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: 28, - column_index: 28, - rotation: Rotation( - 0, - ), - }, - ), + Fixed { + query_index: 29, + column_index: 29, + rotation: Rotation( + 0, ), - ), + }, Sum( Constant( - 0x0000000000000000000000000000000000000000000000000000000000000005, + 0x0000000000000000000000000000000000000000000000000000000000000001, ), Negated( Fixed { - query_index: 28, - column_index: 28, + query_index: 29, + column_index: 29, rotation: Rotation( 0, ), @@ -25371,12 +25369,12 @@ PinnedVerificationKey { ), Sum( Constant( - 0x0000000000000000000000000000000000000000000000000000000000000006, + 0x0000000000000000000000000000000000000000000000000000000000000003, ), Negated( Fixed { - query_index: 28, - column_index: 28, + query_index: 29, + column_index: 29, rotation: Rotation( 0, ), @@ -25442,85 +25440,21 @@ PinnedVerificationKey { 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: 28, - column_index: 28, - rotation: Rotation( - 0, - ), - }, - ), + Fixed { + query_index: 29, + column_index: 29, + rotation: Rotation( + 0, ), - ), + }, Sum( Constant( - 0x0000000000000000000000000000000000000000000000000000000000000005, + 0x0000000000000000000000000000000000000000000000000000000000000001, ), Negated( Fixed { - query_index: 28, - column_index: 28, + query_index: 29, + column_index: 29, rotation: Rotation( 0, ), @@ -25530,12 +25464,12 @@ PinnedVerificationKey { ), Sum( Constant( - 0x0000000000000000000000000000000000000000000000000000000000000006, + 0x0000000000000000000000000000000000000000000000000000000000000003, ), Negated( Fixed { - query_index: 28, - column_index: 28, + query_index: 29, + column_index: 29, rotation: Rotation( 0, ), @@ -25589,85 +25523,21 @@ PinnedVerificationKey { 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: 28, - column_index: 28, - rotation: Rotation( - 0, - ), - }, - ), + Fixed { + query_index: 29, + column_index: 29, + rotation: Rotation( + 0, ), - ), + }, Sum( Constant( - 0x0000000000000000000000000000000000000000000000000000000000000005, + 0x0000000000000000000000000000000000000000000000000000000000000001, ), Negated( Fixed { - query_index: 28, - column_index: 28, + query_index: 29, + column_index: 29, rotation: Rotation( 0, ), @@ -25677,12 +25547,12 @@ PinnedVerificationKey { ), Sum( Constant( - 0x0000000000000000000000000000000000000000000000000000000000000006, + 0x0000000000000000000000000000000000000000000000000000000000000003, ), Negated( Fixed { - query_index: 28, - column_index: 28, + query_index: 29, + column_index: 29, rotation: Rotation( 0, ), @@ -25710,85 +25580,21 @@ PinnedVerificationKey { 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: 28, - column_index: 28, - rotation: Rotation( - 0, - ), - }, - ), + Fixed { + query_index: 29, + column_index: 29, + rotation: Rotation( + 0, ), - ), + }, Sum( Constant( - 0x0000000000000000000000000000000000000000000000000000000000000005, + 0x0000000000000000000000000000000000000000000000000000000000000001, ), Negated( Fixed { - query_index: 28, - column_index: 28, + query_index: 29, + column_index: 29, rotation: Rotation( 0, ), @@ -25798,12 +25604,12 @@ PinnedVerificationKey { ), Sum( Constant( - 0x0000000000000000000000000000000000000000000000000000000000000006, + 0x0000000000000000000000000000000000000000000000000000000000000003, ), Negated( Fixed { - query_index: 28, - column_index: 28, + query_index: 29, + column_index: 29, rotation: Rotation( 0, ), @@ -25831,85 +25637,21 @@ PinnedVerificationKey { 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: 28, - column_index: 28, - rotation: Rotation( - 0, - ), - }, - ), + Fixed { + query_index: 29, + column_index: 29, + rotation: Rotation( + 0, ), - ), + }, Sum( Constant( - 0x0000000000000000000000000000000000000000000000000000000000000005, + 0x0000000000000000000000000000000000000000000000000000000000000001, ), Negated( Fixed { - query_index: 28, - column_index: 28, + query_index: 29, + column_index: 29, rotation: Rotation( 0, ), @@ -25919,12 +25661,12 @@ PinnedVerificationKey { ), Sum( Constant( - 0x0000000000000000000000000000000000000000000000000000000000000006, + 0x0000000000000000000000000000000000000000000000000000000000000003, ), Negated( Fixed { - query_index: 28, - column_index: 28, + query_index: 29, + column_index: 29, rotation: Rotation( 0, ), @@ -25950,13 +25692,45 @@ PinnedVerificationKey { ), ), Product( - Fixed { - query_index: 29, - column_index: 29, - rotation: Rotation( - 0, + Product( + Product( + Fixed { + query_index: 29, + column_index: 29, + rotation: Rotation( + 0, + ), + }, + Sum( + Constant( + 0x0000000000000000000000000000000000000000000000000000000000000001, + ), + Negated( + Fixed { + query_index: 29, + column_index: 29, + rotation: Rotation( + 0, + ), + }, + ), + ), ), - }, + Sum( + Constant( + 0x0000000000000000000000000000000000000000000000000000000000000002, + ), + Negated( + Fixed { + query_index: 29, + column_index: 29, + rotation: Rotation( + 0, + ), + }, + ), + ), + ), Product( Advice { query_index: 9, @@ -25982,13 +25756,45 @@ PinnedVerificationKey { ), ), Product( - Fixed { - query_index: 29, - column_index: 29, - rotation: Rotation( - 0, + Product( + Product( + Fixed { + query_index: 29, + column_index: 29, + rotation: Rotation( + 0, + ), + }, + Sum( + Constant( + 0x0000000000000000000000000000000000000000000000000000000000000001, + ), + Negated( + Fixed { + query_index: 29, + column_index: 29, + rotation: Rotation( + 0, + ), + }, + ), + ), ), - }, + Sum( + Constant( + 0x0000000000000000000000000000000000000000000000000000000000000002, + ), + Negated( + Fixed { + query_index: 29, + column_index: 29, + rotation: Rotation( + 0, + ), + }, + ), + ), + ), Sum( Advice { query_index: 15, @@ -26033,13 +25839,45 @@ PinnedVerificationKey { ), ), Product( - Fixed { - query_index: 29, - column_index: 29, - rotation: Rotation( - 0, + Product( + Product( + Fixed { + query_index: 29, + column_index: 29, + rotation: Rotation( + 0, + ), + }, + Sum( + Constant( + 0x0000000000000000000000000000000000000000000000000000000000000001, + ), + Negated( + Fixed { + query_index: 29, + column_index: 29, + rotation: Rotation( + 0, + ), + }, + ), + ), ), - }, + Sum( + Constant( + 0x0000000000000000000000000000000000000000000000000000000000000002, + ), + Negated( + Fixed { + query_index: 29, + column_index: 29, + rotation: Rotation( + 0, + ), + }, + ), + ), + ), Sum( Advice { query_index: 5, @@ -26084,13 +25922,45 @@ PinnedVerificationKey { ), ), Product( - Fixed { - query_index: 29, - column_index: 29, - rotation: Rotation( - 0, + Product( + Product( + Fixed { + query_index: 29, + column_index: 29, + rotation: Rotation( + 0, + ), + }, + Sum( + Constant( + 0x0000000000000000000000000000000000000000000000000000000000000001, + ), + Negated( + Fixed { + query_index: 29, + column_index: 29, + rotation: Rotation( + 0, + ), + }, + ), + ), ), - }, + Sum( + Constant( + 0x0000000000000000000000000000000000000000000000000000000000000002, + ), + Negated( + Fixed { + query_index: 29, + column_index: 29, + rotation: Rotation( + 0, + ), + }, + ), + ), + ), Sum( Sum( Sum( @@ -26123,13 +25993,45 @@ PinnedVerificationKey { ), ), Product( - Fixed { - query_index: 29, - column_index: 29, - rotation: Rotation( - 0, + Product( + Product( + Fixed { + query_index: 29, + column_index: 29, + rotation: Rotation( + 0, + ), + }, + Sum( + Constant( + 0x0000000000000000000000000000000000000000000000000000000000000001, + ), + Negated( + Fixed { + query_index: 29, + column_index: 29, + rotation: Rotation( + 0, + ), + }, + ), + ), ), - }, + Sum( + Constant( + 0x0000000000000000000000000000000000000000000000000000000000000002, + ), + Negated( + Fixed { + query_index: 29, + column_index: 29, + rotation: Rotation( + 0, + ), + }, + ), + ), + ), Product( Advice { query_index: 9, @@ -26148,13 +26050,45 @@ PinnedVerificationKey { ), ), Product( - Fixed { - query_index: 29, - column_index: 29, - rotation: Rotation( - 0, + Product( + Product( + Fixed { + query_index: 29, + column_index: 29, + rotation: Rotation( + 0, + ), + }, + Sum( + Constant( + 0x0000000000000000000000000000000000000000000000000000000000000001, + ), + Negated( + Fixed { + query_index: 29, + column_index: 29, + rotation: Rotation( + 0, + ), + }, + ), + ), ), - }, + Sum( + Constant( + 0x0000000000000000000000000000000000000000000000000000000000000002, + ), + Negated( + Fixed { + query_index: 29, + column_index: 29, + rotation: Rotation( + 0, + ), + }, + ), + ), + ), Product( Advice { query_index: 9, @@ -26173,13 +26107,45 @@ PinnedVerificationKey { ), ), Product( - Fixed { - query_index: 29, - column_index: 29, - rotation: Rotation( - 0, + Product( + Product( + Fixed { + query_index: 29, + column_index: 29, + rotation: Rotation( + 0, + ), + }, + Sum( + Constant( + 0x0000000000000000000000000000000000000000000000000000000000000001, + ), + Negated( + Fixed { + query_index: 29, + column_index: 29, + rotation: Rotation( + 0, + ), + }, + ), + ), ), - }, + Sum( + Constant( + 0x0000000000000000000000000000000000000000000000000000000000000002, + ), + Negated( + Fixed { + query_index: 29, + column_index: 29, + rotation: Rotation( + 0, + ), + }, + ), + ), + ), Product( Advice { query_index: 9, @@ -27374,51 +27340,51 @@ PinnedVerificationKey { minimum_degree: None, }, fixed_commitments: [ - (0x05f5862cad2888855bc3c1843a9eff57b11b592d9eb0e13354256661387f5231, 0x32236b14df85bf5f532a930232cb23a5c56ef7d67aaeed8bcb8fc10ea132cbd6), - (0x3e727e8554679f98120355d39d958dbd8755d5a7f8b42ea87f258064c4b3eb57, 0x0c0d5c23f3ee62ac1b2d986dd3033bbcab260d590e1393de3a14a4b31ae091bb), - (0x3748680dd6a91c5dec668b30fb6bf9a450aeb884b81cbc344914f265760e7131, 0x18530eaa5c58b61bd3fc38220ea484c0922524a815a8f752be955c229f9c4164), - (0x0b3ad00d92f45252c29d4dd34c8c3bcc0417e43346defdc8e9d08e2aa145e4fc, 0x047022c0ff68a065057afcc31daab78a5b8b52ae2d9fdd81ab378a967af2be11), - (0x3b44c08c70e24c3b7486aefab90e4bc824af2e4a38e5419ea5726114431f6594, 0x26d81bffeff10a6f71c67a11dd2201ff983263af0101ba5ac55786fd70cd1e0f), - (0x07417999a347a4315fc3ca96761927973fc2db9da253a9c2667e523eb64c64c3, 0x1b5756373c42f00b8f0706a10a0e1a78a07fdb8184474983b7a8a8fbe10bb8ec), - (0x12fb970aeb44e22b5f2a79b351c927587dbd3628c43667c34d49299a6941b664, 0x2dcbcce25f8d9ec1ea1834243ea754f17417bbe4880483daf015c48e0ea53299), - (0x1e402272ff5714a1963c32e2713070a5811eade3fccee44a7c643a5b1c156702, 0x3de1c0b61b59ca40ab5dd5d97ed53bb7b47acbda0043ba35f3231b54d81de740), - (0x0cac97a9783e60395f453c046c2597ecb0f1d95c0bd4c3d200aa7fe57b0718e6, 0x2c7604003d502d6572fda3857894d2efc571bd4e2515a75659410d14fecbc5c8), - (0x38d46c33cb89b53af577e6363b382a0b9f786793c8c9263458618c9d55aaa996, 0x073a8acc7538a108cfb7440e0e6c8ed77ad9299318c56e90d84a102573cf9e3d), - (0x00be9ec82385dac420b50f826b31c54173f58500c897cf7abf7088329f5016e0, 0x2e4c2400cbe9d02765402bf7dd183608ec4c5bbee66ca2d345d5685491cbca11), - (0x1785ca3bbf3646285d2b1e0a6786a3c7c4bc292649f874c9a93ca6c197720515, 0x21f4da6d3f19a73db2f96cc5d7e892704a92b86c9af20ed51f5569a27de08188), - (0x2493b660d0c162590393e262f1046e4ff90c7c2e3d856a5c9ee50655a89c515e, 0x3fc811b17b224089ff3bb999f50b4bed1d17e40bf16297c2e8b4b40e1a1b5508), - (0x039cd914898852e9fcb2e0624b68972a5fec48dd784e9535a71e93557bcec77d, 0x3d1d7ecc1fb4326b2d0fcb7b3a5a7d9f1778ac027210f0dbb3953bf5ae12a5fb), - (0x1cc1eb56a5f16ed6222484ac3ace06484edbf9c4ff0da3411e2c5b826a02e2b1, 0x1f4863314947932d305aca0e83d06ef96a461f6633b4d0694555c1ab622bfaa3), - (0x2e16632a8835e0a8cf74d4e221c05b10a513b049e82f2166822dd92fd62bdb34, 0x2a7fa4a0aa504938bc7e140fd49d00e9d799756fbc6c084aa1a86b847b465688), - (0x1db10c53c19421b8e34e489aa065b722868a537ca539abeeb374d375ee37ecc5, 0x24ffdfaae4d1d9eca7dd04fc3e0fb467b19aeb3538c1c4c9cece4e7ede2a12c9), - (0x38b67ac3a5632b575e7b76c28a9a0ba0937f8dccd5ba98b4b229d3061a6c02b2, 0x0fe20e8aada42373e16482a94bf0b1b0e1e8d536fa228315bc284799f2720cfe), - (0x193a939a6c9545cd93f2432c70e7f8c2f3632871fd2cdb8a8b1e553626faa3c3, 0x370788834ed4eaa2c6bb25b64d01e1ce695ab5f02dfda2b988500f09ba0605f6), - (0x3d0b76b6e08db5dce62962e811f1a6916f2bd1385a383668297c2ef4e5f2cb6f, 0x301815361206b365e93563d4cc2dfebfbdb3925f17a13e3077bcead847d2c597), - (0x0581ceea94fc32fdbef9baba57e599c1613bdcf3b08094b022ec7224ffa20c9b, 0x27fd6cae8b561ef48243d751d572a703b43bd721d5abad4fd2b92590ba530947), - (0x17fd272bb734ade7adf18d2b4a2bae1f27d8dc4f3d76623e3d8f5acaf3231dd3, 0x219cc3c3382c9e662ce51f6873a01546cc221bb9344a354dd3ca7092f3609fbf), - (0x02d05d30ba4e4303163bdba6a13e0de96594febc54708b0ba3fd235a75eb9bd0, 0x23e276e07d7eba989ada93e9ff22b98a6e09611443fd2b7fa04222e386bd6df1), - (0x30d0b56751a5735e5cc3952796b59e86704ddf003eeb26d20191d90170485b60, 0x396ccd52ec99d68f98f6ac898fda08935589b92eab830c754e7211d5058e8e8b), - (0x15934063d1fb7856a16af037fa9b4a1795adecbe7d8db20fe4fa0450202d7d88, 0x0385c0f2a285a3440ead1f68dde7b696a68c6779663c5c1d247172f20d940d20), - (0x2323d095347b023d0e60d7240b55c246d134f19461fef2d02efef68efe966dbc, 0x343c59bfaa1540d0b16f59012b5b8ab06f2e89a9842abd47937dc951c99ed234), - (0x10113a21ea966ba48220a6f24e0f8b15a16b6d4ed684327ce5afd97ed22e6a8e, 0x3998c2de00499494d0bf017a0136d014e81ddcf12b2f523dfd9f3c8032824b65), - (0x0822d5d6c32c8a6c2143d25883edf0ba9240a4c4901b3d98912fcb5b32e02c55, 0x2502a4f2ea667300d9c21f01f4ed55afc6016047ec3d83b84960c4beb7bdcef0), - (0x3a7e58b9e899b38a9cde64d329edd320c699fa57b192db27a0b44cd91ccae5a5, 0x079ac0e910d99f8204fefb00986ea2f44f907e33199194f5c100fd1f3651925e), - (0x03970969d5b59e114d9a60108ab749dce2971f73873168ec1bd280708e3b1b96, 0x24a6daca6d08c17f2233f998e1422cc6d2576685167607083108b0525b7075b0), + (0x3a83a8e762ebade712aa5cf3c41c730a79369475085bf1155579f7f7682408e2, 0x25b00d3ee1da9a6bbd36b35ba461da45abd931c767b863ec4a604f8ce094e4eb), + (0x1caeb4d7ebb44a717f83ee5afd35446a5e2124f6a4075342ba4eff589523fb57, 0x3a8c431a13632a5b5f035eb4b804d37f2591e84d05d765ba3f70a3d61b907ebb), + (0x107d95a6361fc98df9042f32451faa4fd48c1381653be7847d97cf997a55a4ad, 0x31ebf6a2e352108bb180c3278e72d88bb5bab723d3b38aa47c144fc37fb8a962), + (0x0b3116fa1a6b3b1c0496d0e8b6700b8e11c90d08bc6a1514182259919d275a55, 0x0b9c5452331b9fbc20082b8e60415e4e1727496a563f812aa22e12ea6da8121f), + (0x3967a067c14c0edce165ff72b7ab2606b84f4e2d27e252123fd6fe3da64405ca, 0x0cbc7ead2f5e168ba1f18090ba6e1dde81c71ac2f7e788fe1e9e60756492492f), + (0x29949133117dd4c1f922ce0b99a9b08fa554752c898217438f0195ceb395c797, 0x131657307f326a64f29e76de1bbfb6a08ed48b4d82aab321ab5b0c782e59b88d), + (0x0916753db6334ffc61f0bd5f104e7af9911e24fed95319a895db2c3ed6c04f03, 0x3b6bc871faf2945a1f0aa567f2afd41b7d9bae36b9567ce326527bf6c580e288), + (0x149c53e80f80d25730fde609c6202994265f9847841ce340e6b539521eeb4eec, 0x3ebcf70300678f384a7a43892e72c08c760382b2948e5878e468abe1de040c95), + (0x33985e25cbb508846a453129cb3c0ce14a5bd9c951489b16296c0e9e28a95e51, 0x2c0424b62abe054948b6796dcb19bb3a1673f700a0042535b03b818ad21ec74c), + (0x2f912f67e3c2b91bcd3ae8bf7ecea5467bad1b6813757c282eef51e42213a236, 0x3e9da3152ca6d957908cb322f02da4e86349942826ab80d7d48408ba446ceedb), + (0x026a7c37e268dbd591cea36d7c5dc2d45c0a0aee02969d706a8e2a86981dfc91, 0x1d005e1e899fcd5320c51af584d127fb05bac1061b822570387df73ef15cae2e), + (0x35db8a334ca7256bf681b82c375ac947db44a2cddd20dba84879a9b5650cf44b, 0x082ddccf36e20976dea53892d869f54e78bc62db1af453f979e7b88f2f325068), + (0x32e7d49a13fa029301c2aad4ebce53ec557b35f28519d2f91e2794f8960bce7f, 0x11467882a4a6b1c9fc269e92508827c6998b00f7f1836bcd1d432e1a5698debd), + (0x1500d4d77b3756b26280f9e6480db9477018ac1da90d8d1960eb5b1bc375c8db, 0x37de8b6d934c01f1651f13e477cea460fbc89eaf3f46c04ed7de3969e6c58df3), + (0x0945790e964f31066952a416b3f90e31099d9c52b693e40bbfe75379b2427b41, 0x12b87f63601422ff30b1d1488f56e8f360eaa728e21d361359172ce787885141), + (0x1e4295e95ea39b0a7529af6dca726ebf04321f255b6165197612b7cf9aacb340, 0x2af05f82ab47b9026a4d223bd344e84f079253deeea8e1ea05dce64972bce0da), + (0x1c7568f53e385a5a0db8a130ca49a95653f158e2b63c009142cec4787f7d17ee, 0x32dc8a00fe923957fe616afe44f4fe9a22948375b6b5305ae1d77b3af71abfac), + (0x0642adfd67cf4e81d8d749f0af7899cdfcadf626a7fc5ecf899df335637b1116, 0x3eaa3318136345491412d73cea3e4d32617138fed5ac07964148c416684c829d), + (0x1677bef1fee22af2545c154ca3f539079974f6caa08addadaa5940b670ffcf96, 0x0116d3d2c1bff627bb7d0939b31eccd7fa355061709fc0dd805ff0d84e3c723a), + (0x0c11eb743169fb6ec53a5a3f488222f384d4b511a1351aaa90232e2de324bf04, 0x20dddc311971f50cd06f208f789c5134fb3c46e03bace128037e494a7b356d3b), + (0x34524e4667247bb91885e711b4842ad750d6a1fa8b7d4169d40593ae5daa1a8b, 0x18b745fc9b240e012948826f895004cf70f069fc31a5591ae65c39d4c84d24ff), + (0x3744269e6bb077c0403eb2d8df841a7b79704699febb595ba39a855477afdb23, 0x3de274ea3c8a19e2a85908e1f5e754dfb45b8c74f4a1c8df0fd205b3a31d1104), + (0x1659e9b11ad8f8870c01ac69329f9b3589cac2bcbfc11aefa249f794ac2383e8, 0x17b197bade60bdd892acbea2d8570f8b68dc6967d41ad53353d80590615922cc), + (0x1fc683b4aa3aaa5d507db074437cb44eba22ccf691587a00d6b8e35b1db84295, 0x0016e5d1926deb58820360a975067e64fc830c77af0b58d431576c882d753688), + (0x0128bdf9f501f3776e3309e37ecdbb877c58347b3e81fde35c64929dec5a2df8, 0x0227030614551c33ac265b16821c7f61df912dff99deec74bc9eb81a925a2528), + (0x1d6d0268bbf9385d837fc245fb95e589106abf9164a14af358b175df67e55a5c, 0x15133a10336dfa242402ab9772b929323bb3412f5832c109462a83bd432fd47d), + (0x187361c5d421eba129cf4360e9f1f0c095252556b5ecda5da0385ce042afcd75, 0x31e3778cc1c7199c73dffd94213488d283b4194419ebe4760790af71d3e9608b), + (0x05b0237aa3e3b1f0f08fdf700bb972a3ccdb824703a8e2464811167b1bd16b5f, 0x11912de88efcf5d594ddc7db07e30eb3368ad767f73ee4ce1a31310cb78dbefa), + (0x3665e062e3cfeee35182b431f09a3c5602f135f9209c9fe004638f3ff7eb8e99, 0x2ce980f58f37a3fd67d9d1cd821ffb14a8ee15d3ef2c1bda8fe740f6af97e0ed), + (0x2d6db9fd8d718762d8e9d6c2f2ebb74fa610a8138071c8fec2097be84214c015, 0x0ea640500da8fdf07ff2f82a7b39dc4d7613f46fa0c0c04c28080c039de99f0c), ], permutation: VerifyingKey { commitments: [ - (0x1dd8538cdaf2d9cb76bbbc2ce070a7a1849c82ebc510c8b4c7328ca896126094, 0x2caf15523d510d58dfe4d67f653ee6b1175f4fba304231d84281cfe6f707fa8d), - (0x3d5a358c0c6108fd4bb1a76776b7d7c68ffecf4686640d693d7975e0c21627f1, 0x1cd56c75c1371cbd28ed810d7ef4043597f742a067a8f48b418bbd725f4fbed6), - (0x1d195b70ef8faa472ea7a4211a9e8d86efb577abc0390e175ca6a3dbb9c52dbb, 0x26c6e55077b1fdbd43fa2624827de02d774448eba9d63f0398656c6831b07b9a), - (0x198c2f1cc2459f197e98c85f85e9ed13f8a3ff9e72801730970525427f1ad399, 0x18ea8712823aaaa83bc789372f8fc03d8804142518ee1e3b91cf3d45dd842aed), - (0x0cc7116ec8b5b93e31aef0f21a56c201664f1ace676be27622536cb77460ec8a, 0x1609b52d7e622f85ae74d1f4a4fecf5269b3ed13de43684fd90cd6b694f18bf6), - (0x1ed99f930a8c44ba5c15485ab19ff2e4c6049589721a7ae9f06b2f653c6ccdf1, 0x0251124b186f99430123d5230980b07d4470b8d3fc473afcf24f6470c9e0c2c9), - (0x1f82733dcc2011fb5a47bfb09a9dae725aa4d3240994c891fcc56c61b5e07e30, 0x244548ab440ff89e9ecbbb6c87b45d7652e272f227da1e565b72527b5d4c36f6), - (0x3e2bc6994299f1716aa999042768bb77bed309c21736d69724bd355d7f0e9b6b, 0x034c3baa0eab5c05f36432cfb7bed01e4b779ef78a26ab1a9258d1cb0ecee520), - (0x1c33033ceb09ed64453c21d1b706d65913fe96d1df2004b6f29179d3f030800b, 0x082f1a389d7cc49eadf5085a639f31b3a5630b3ece607d44313f5f0a33ab239b), - (0x3eeff467adead22a5508126169f25b61e287f7453a0940a55887dbbc66c64f46, 0x0010332f18af926c46c187dbce714f31e1ac9c28c72693b39b10eba46c29d603), - (0x1f1fec9ee29f85d85e36656751cc7c7bb58ab2046db7c16d3fe7f4aa72d90475, 0x098b287a83e0fa4f01a8c81e30ea8b5589016b54bcb6ca560c9aea12d971f9eb), - (0x19f81530b4d517661c90b3cceb26394e42c4f9b310b2d15ec4f609d9507c22e6, 0x3e5acbfab72439dd9e7f0cae80b3869bf4d30ed2c814da08e5a391cb45187478), + (0x30a6cf79e19c1152d747cd72047704724515a0f4e40fd490dd23d55844eef8ac, 0x2f2f843bc407515c91f69d339bc2444be42908e07b2dbef34d61cfc63f18ae8f), + (0x3bd4152f2d8b6082e96252c238633fddc93617408fd102a96e75aca50c17b736, 0x3e369b6951e5d5fdb370f0b24e82c1938686efa45cd1cbe573faa9a094c3903d), + (0x15170333e4d2e6c4f5ed018093445acfad8c26780c7788eb101ec0a9f1a83153, 0x2ba1c3d7a72cf144c53272322878f1ff0f713701c71b35adb5136050c0183059), + (0x1a421544f8ca7d550b7d7541167140fb0c596cbf4c4b6802afc2d45377ea7324, 0x2e56f1755f4ee8a7a87aa4864944d0c36d002263434b2563ff9afe37c27fe463), + (0x3689adfd1c4ab99b1928bfede5c940bed5d45a3139ab2c132759bd108fe3629a, 0x1d399fda63740ac6dac4c281d77912ea34aadbb7485a9ef5581030e04cc7a2a6), + (0x15fec8739d0bad77e61a164b256d9e00d549041b9c7ae096c6cf0535a51609c3, 0x1fcf91b71c69dbb8785ba89a4fcc3614a1ce57b223dfe0abf0cf9b4d7e7cd6ad), + (0x1e02cb25a03031188c6e8f27e14b25e9dface9e906b8b72e5b820d5c75002864, 0x2507bfbfb12086825ed679ae0ee9a879bd4a5e2301200a14d6e2b2a1d5c6365b), + (0x301252ddeb85849e3ad18ce0af85aaa0cd1f07eedfdaccea3fb1c12837cc8742, 0x1aa485192008dd920e1fd491351060c85e465b4978e823107e83094230a83bfd), + (0x34fbf0308d0e338f0951eab22aeecffb55947770d0c0c3765c872c7955122a9c, 0x27ac178283d71eb511c09ebb20a439066c02d60e59b38fd44b01e3a68c98b930), + (0x0586aa2ff41729e750b4a1a3d40b28459f27ba5e85dcc3423f3ffd9d4ee0865f, 0x2753dc9d8c1044dfdd73256e2b3cb400394a7b2064305bdab242f9c8151cefab), + (0x27fe1d16ada10ec7ca28120884cdd57bb6917999e0cbae84bce02362ca0ac889, 0x1a9b9b2e685c380584b0eeff6bbcec4a0ec0f653b1993fbf27e6c0afde27ebe9), + (0x28c8e999738fbd10a4a406358c706750d637f36196e57fd39635b78659752e19, 0x17aabe8bc03bc5021b7417152c2024e97e27937c32b576c72427a7f370041ed5), (0x21d210b41675a1eae44cbd0f3fd27d69e30716c71873f6089cee61acacd403ab, 0x2275e97c7e84f68bfaa528a9d8be4e059f7abefd80d03fbfca774e8414a9b7c1), (0x0f9e7de28e0f650d99d99d95c0fcd39c9dac9db5aa1973319f66922d6eb9f7d5, 0x1ba644ecc18ad711ddd33af7f695f6834e9f35c93d47a6a5273dabbe800fc7e6), (0x0aab3ab73afac76277cd94a891de15e42ceb09f3a9865dab5c814bebfbb4453f, 0x27119fec3736d99abeeef1ad7b857db7e754e0c158780ed3dd0cdd4dc2453e10), diff --git a/src/circuit_proof_test_case.bin b/src/circuit_proof_test_case.bin index 280ef4dafe87e341cd692b0e370e889c51f403ce..9e59b55b3e866dc29fe8440967df9aaf0a4617ab 100644 GIT binary patch literal 5250 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 From 63d9ec53a0264ce29ad68cc94d2037eb7a62a13a Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Aur=C3=A9lien=20Nicolas?= Date: Sun, 25 Sep 2022 16:46:55 +0200 Subject: [PATCH 14/16] zsa-mux: take note_type as an input --- src/builder.rs | 1 + src/circuit.rs | 6 ++++-- 2 files changed, 5 insertions(+), 2 deletions(-) diff --git a/src/builder.rs b/src/builder.rs index 0ce8a06cc..324b2af92 100644 --- a/src/builder.rs +++ b/src/builder.rs @@ -247,6 +247,7 @@ impl ActionInfo { psi_new: Value::known(note.rseed().psi(¬e.rho())), rcm_new: Value::known(note.rseed().rcm(¬e.rho())), rcv: Value::known(self.rcv), + note_type: Value::known(note_type), }, ) } diff --git a/src/circuit.rs b/src/circuit.rs index e11e684b9..0b83c7bd3 100644 --- a/src/circuit.rs +++ b/src/circuit.rs @@ -123,6 +123,7 @@ pub struct Circuit { pub(crate) psi_new: Value, pub(crate) rcm_new: Value, pub(crate) rcv: Value, + pub(crate) note_type: Value, } impl plonk::Circuit for Circuit { @@ -403,8 +404,7 @@ impl plonk::Circuit for Circuit { self.v_new, )?; - // TODO: move to self. - let note_type_value = Value::known(NoteType::native()); + let note_type_value = self.note_type; let is_zsa_value = note_type_value.map(|nt| !bool::from(nt.is_native())); // Witness boolean is_zsa. @@ -1016,6 +1016,7 @@ 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), + note_type: Value::known(spent_note.note_type()), }, Instance { anchor, @@ -1202,6 +1203,7 @@ mod tests { psi_new: Value::unknown(), rcm_new: Value::unknown(), rcv: Value::unknown(), + note_type: Value::unknown(), }; halo2_proofs::dev::CircuitLayout::default() .show_labels(false) From bde70f5814088e16027ad7222face44c91047b62 Mon Sep 17 00:00:00 2001 From: naure Date: Sun, 25 Sep 2022 20:39:34 +0200 Subject: [PATCH 15/16] zsa-strict-note-type: strict equality/difference of native type (#18) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Co-authored-by: Aurélien Nicolas --- src/circuit.rs | 19 +++-- src/circuit/gadget.rs | 2 +- src/circuit/gadget/mux_chip.rs | 142 ++++++++++++++++++++++++++++++-- src/circuit_description | 58 ++++++------- src/circuit_proof_test_case.bin | Bin 5250 -> 5250 bytes 5 files changed, 173 insertions(+), 48 deletions(-) diff --git a/src/circuit.rs b/src/circuit.rs index 0b83c7bd3..735e75d75 100644 --- a/src/circuit.rs +++ b/src/circuit.rs @@ -427,16 +427,20 @@ impl plonk::Circuit for Circuit { .coordinates() .unwrap(); - // If is_zsa=false, check that the note type is native. - // TODO: is this necessary? - // TODO: is it necessary to check the opposite case, with note_type!=native ? - mux_chip.conditional_advice( + // If is_zsa=false, the note type is the native type (equal X coordinates). + // If is_zsa=true, the note type is different than the native type + // (also not its negation, because of different X coordinates). + mux_chip.constant_or_different( layouter.namespace(|| "note_type consistency X"), + config.add_chip(), &is_zsa, ¬e_type.inner().x(), note_type_native.x(), )?; - mux_chip.conditional_advice( + + // If is_zsa=false, the note type is the native type (equal Y coordinates). + // If is_zsa=true, there is nothing more to check about Y. + mux_chip.constant_or_any_value( layouter.namespace(|| "note_type consistency Y"), &is_zsa, ¬e_type.inner().y(), @@ -1102,10 +1106,7 @@ mod tests { w.write_all(&instance.nf_old.to_bytes())?; w.write_all(&<[u8; 32]>::from(instance.rk.clone()))?; w.write_all(&instance.cmx.to_bytes())?; - w.write_all(&[ - instance.enable_spend as u8, - instance.enable_output as u8, - ])?; + w.write_all(&[instance.enable_spend as u8, instance.enable_output as u8])?; w.write_all(proof.as_ref())?; Ok(()) diff --git a/src/circuit/gadget.rs b/src/circuit/gadget.rs index 9333ed9b5..55c368510 100644 --- a/src/circuit/gadget.rs +++ b/src/circuit/gadget.rs @@ -83,7 +83,7 @@ impl super::Config { } /// An instruction set for adding two circuit words (field elements). -pub(in crate::circuit) trait AddInstruction: Chip { +pub(crate) trait AddInstruction: Chip { /// Constraints `a + b` and returns the sum. fn add( &self, diff --git a/src/circuit/gadget/mux_chip.rs b/src/circuit/gadget/mux_chip.rs index 5fae92fa6..c532e9873 100644 --- a/src/circuit/gadget/mux_chip.rs +++ b/src/circuit/gadget/mux_chip.rs @@ -1,3 +1,4 @@ +use ff::Field; use halo2_gadgets::ecc::chip::EccPoint; use halo2_proofs::circuit::Value; use halo2_proofs::{ @@ -8,6 +9,8 @@ use halo2_proofs::{ use pasta_curves::arithmetic::CurveAffine; use pasta_curves::pallas; +use crate::circuit::gadget::AddInstruction; + #[derive(Clone, Debug)] pub(in crate::circuit) struct MuxConfig { q_mux: Selector, @@ -80,13 +83,21 @@ impl MuxChip { } // TODO: simplify or generalize this API. -pub trait MuxInstructions { +pub(crate) trait MuxInstructions { + /// Witness a boolean switch value. fn witness_switch( &self, layouter: impl Layouter, value: Value, ) -> Result, plonk::Error>; + /// Witness a value != 0 + fn witness_non_zero( + &self, + layouter: impl Layouter, + value: Value, + ) -> Result, plonk::Error>; + fn mux( &self, layouter: impl Layouter, @@ -111,17 +122,29 @@ pub trait MuxInstructions { right: &EccPoint, ) -> Result; - /// If is_free_advice { advice = anything } else { advice = constant } - fn conditional_advice( + /// If is_any_value { advice = any value } else { advice = constant } + /// Note that "any value" might equal the constant anyway. + fn constant_or_any_value( &self, layouter: impl Layouter, - is_free_advice: &AssignedCell, + is_any_value: &AssignedCell, advice: &AssignedCell, - else_constant: &C::Base, + constant: &C::Base, + ) -> Result<(), plonk::Error>; + + /// If is_different { advice != constant } else { advice == constant } + fn constant_or_different( + &self, + layouter: impl Layouter, + add_chip: impl AddInstruction, + is_different: &AssignedCell, + advice: &AssignedCell, + constant: &C::Base, ) -> Result<(), plonk::Error>; } impl MuxInstructions for MuxChip { + /// Witness a boolean switch value. // TODO: this could return a wrapper type for usage safety. // TODO: this could use constant-time Choice instead of bool. fn witness_switch( @@ -168,6 +191,56 @@ impl MuxInstructions for MuxChip { ) } + /// Witness a value != 0 + fn witness_non_zero( + &self, + mut layouter: impl Layouter, + value: Value, + ) -> Result, plonk::Error> { + layouter.assign_region( + || "witness_non_zero", + |mut region| { + // This is a non-zero constraint implemented with the mux gate. + // Set switch=value, right=1/value, left=0, output=1, giving: + // value * (1/value) == 1 + + // Enable the multiplexer gate. + self.config.q_mux.enable(&mut region, 0)?; + + let cell = + region.assign_advice(|| "witness value", self.config.switch, 0, || value)?; + + region.assign_advice( + || "witness 1/value", + self.config.right, + 0, + || { + value.map(|v| { + let inverse = v.invert().unwrap(); + inverse + }) + }, + )?; + + // Set the "left" and "output" constants. + region.assign_advice_from_constant( + || "left=0", + self.config.left, + 0, + pallas::Base::zero(), + )?; + region.assign_advice_from_constant( + || "output=1", + self.config.out, + 0, + pallas::Base::one(), + )?; + + Ok(cell) + }, + ) + } + fn mux( &self, mut layouter: impl Layouter, @@ -250,21 +323,23 @@ impl MuxInstructions for MuxChip { Ok(EccPoint::from_coordinates_unchecked(x.into(), y.into())) } - fn conditional_advice( + /// If is_any_value { advice = any value } else { advice = constant } + /// Note that "any value" might equal the constant anyway. + fn constant_or_any_value( &self, mut layouter: impl Layouter, - is_free_advice: &AssignedCell, + is_any_value: &AssignedCell, advice: &AssignedCell, else_constant: &pallas::Base, ) -> Result<(), plonk::Error> { layouter.assign_region( - || "conditional advice", + || "equal_or_anything", |mut region| { // Enable the multiplexer gate. self.config.q_mux.enable(&mut region, 0)?; // Copy the switch. - is_free_advice.copy_advice(|| "copy switch", &mut region, self.config.switch, 0)?; + is_any_value.copy_advice(|| "copy switch", &mut region, self.config.switch, 0)?; // Copy the advice into the left input. // When the switch is off, it must equal the constant output. @@ -291,6 +366,55 @@ impl MuxInstructions for MuxChip { }, ) } + + /// If is_different { advice != constant } else { advice == constant } + fn constant_or_different( + &self, + mut layouter: impl Layouter, + add_chip: impl AddInstruction, + is_different: &AssignedCell, + advice: &AssignedCell, + constant: &pallas::Base, + ) -> Result<(), plonk::Error> { + // Witness the difference between the advice and the constant. + let non_zero_value = + advice + .value() + .zip(is_different.value()) + .map(|(value, is_different)| { + let difference = constant - value; + + if difference.is_zero_vartime() { + assert!(is_different.is_zero_vartime(), "expected equal values"); + // If the values are equal, use any non-zero value to be ignored. + pallas::Base::one() + } else { + assert!(!is_different.is_zero_vartime(), "expected non-equal values"); + difference + } + }); + let non_zero = + self.witness_non_zero(layouter.namespace(|| "non-zero difference"), non_zero_value)?; + + // Prepare a cell that is definitely different than the advice cell. + let different_than_advice = + add_chip.add(layouter.namespace(|| "different cell"), &advice, &non_zero)?; + + // Prepare a cell whose value equals the given constant. + let advice_or_different = self.mux( + layouter.namespace(|| "advice or different"), + is_different, + &advice, // switch == 0, constant == advice + &different_than_advice, // switch == 1, constant != advice + )?; + + // Constrain the above cell to the given constant. + layouter.assign_region( + || "advice_or_different == constant", + |mut region| region.constrain_constant(advice_or_different.cell(), constant), + )?; + Ok(()) + } } fn compute_mux( diff --git a/src/circuit_description b/src/circuit_description index 242989b1b..1b91ed0dd 100644 --- a/src/circuit_description +++ b/src/circuit_description @@ -27343,48 +27343,48 @@ PinnedVerificationKey { (0x3a83a8e762ebade712aa5cf3c41c730a79369475085bf1155579f7f7682408e2, 0x25b00d3ee1da9a6bbd36b35ba461da45abd931c767b863ec4a604f8ce094e4eb), (0x1caeb4d7ebb44a717f83ee5afd35446a5e2124f6a4075342ba4eff589523fb57, 0x3a8c431a13632a5b5f035eb4b804d37f2591e84d05d765ba3f70a3d61b907ebb), (0x107d95a6361fc98df9042f32451faa4fd48c1381653be7847d97cf997a55a4ad, 0x31ebf6a2e352108bb180c3278e72d88bb5bab723d3b38aa47c144fc37fb8a962), - (0x0b3116fa1a6b3b1c0496d0e8b6700b8e11c90d08bc6a1514182259919d275a55, 0x0b9c5452331b9fbc20082b8e60415e4e1727496a563f812aa22e12ea6da8121f), - (0x3967a067c14c0edce165ff72b7ab2606b84f4e2d27e252123fd6fe3da64405ca, 0x0cbc7ead2f5e168ba1f18090ba6e1dde81c71ac2f7e788fe1e9e60756492492f), - (0x29949133117dd4c1f922ce0b99a9b08fa554752c898217438f0195ceb395c797, 0x131657307f326a64f29e76de1bbfb6a08ed48b4d82aab321ab5b0c782e59b88d), - (0x0916753db6334ffc61f0bd5f104e7af9911e24fed95319a895db2c3ed6c04f03, 0x3b6bc871faf2945a1f0aa567f2afd41b7d9bae36b9567ce326527bf6c580e288), - (0x149c53e80f80d25730fde609c6202994265f9847841ce340e6b539521eeb4eec, 0x3ebcf70300678f384a7a43892e72c08c760382b2948e5878e468abe1de040c95), - (0x33985e25cbb508846a453129cb3c0ce14a5bd9c951489b16296c0e9e28a95e51, 0x2c0424b62abe054948b6796dcb19bb3a1673f700a0042535b03b818ad21ec74c), - (0x2f912f67e3c2b91bcd3ae8bf7ecea5467bad1b6813757c282eef51e42213a236, 0x3e9da3152ca6d957908cb322f02da4e86349942826ab80d7d48408ba446ceedb), - (0x026a7c37e268dbd591cea36d7c5dc2d45c0a0aee02969d706a8e2a86981dfc91, 0x1d005e1e899fcd5320c51af584d127fb05bac1061b822570387df73ef15cae2e), - (0x35db8a334ca7256bf681b82c375ac947db44a2cddd20dba84879a9b5650cf44b, 0x082ddccf36e20976dea53892d869f54e78bc62db1af453f979e7b88f2f325068), + (0x12989292e551ed3193d571e1526c40af52f6fd2f98a780d98c4a3eb09013c85f, 0x0ad253a6663a036bc9d5309e9c025b814ac12aaeb9591e2792c320e837dd87fb), + (0x245d1e936d96e5dc31d10b40aee84f1e575815ddb7c733b1c83e047d85df0364, 0x157aaddb3f93bb3944a3ca9baa1e7dca4fe2b1bbb0082b9b2dc9e9766ceefe3d), + (0x1b10cd2f6d9bc469bb707562df5e942466c7e6fc9e901045e7d1ab84dd51fdfd, 0x2a3222a0ef3632c4f4f48cd184610474428676adef5da58a398fe21e5e6c6807), + (0x0e711c0eca6339d6a77dc43c1678b2e4510e962c60df1824027573702b9d078a, 0x22445473f884ee380e29ffa2071952825d6572b6cc49609da12ec6b5d6143904), + (0x061b3ba398bc5776b9d3d2895f6ce383175b3f523fe6e05f7abd0af2d28ab8a4, 0x11a5b2cba6dac838fadaf7472646bb9946e3c88b1d76f859cc3f911c390a11db), + (0x2e7b87cda4f4dc42615997eb222b15fc4c446cac1873435b04e638e37ac7534d, 0x366c034cf3bfe3dd3852bb2c989ec5d114f2a4c4ac2b0ad32bd1414c38451edb), + (0x1f564dbcec3cb8f25ed135c6dcfe590435942ea2077cfc099cca65ce772484ed, 0x2fd99b8aca4966cfcd61af45d58ac8c16bfefb3a100b3ca75207ed7b8dbfd739), + (0x324ed65e5a31fecf544bbf129494c22fd2fc63593b069a5122335612da4936c2, 0x1e1d1b67f1abe6fb1d4223550dd9c5b0115d9184ddb42ff16dbfd362839e6247), + (0x198cd9f2ba739c52175e88e16bc5c586ed3568854d63b21b04726bd634ff3893, 0x0c29eb5c2d40da02a1d51b4eceeb2b9fcd8aadf66e908e3bbc6603839551492d), (0x32e7d49a13fa029301c2aad4ebce53ec557b35f28519d2f91e2794f8960bce7f, 0x11467882a4a6b1c9fc269e92508827c6998b00f7f1836bcd1d432e1a5698debd), (0x1500d4d77b3756b26280f9e6480db9477018ac1da90d8d1960eb5b1bc375c8db, 0x37de8b6d934c01f1651f13e477cea460fbc89eaf3f46c04ed7de3969e6c58df3), (0x0945790e964f31066952a416b3f90e31099d9c52b693e40bbfe75379b2427b41, 0x12b87f63601422ff30b1d1488f56e8f360eaa728e21d361359172ce787885141), (0x1e4295e95ea39b0a7529af6dca726ebf04321f255b6165197612b7cf9aacb340, 0x2af05f82ab47b9026a4d223bd344e84f079253deeea8e1ea05dce64972bce0da), (0x1c7568f53e385a5a0db8a130ca49a95653f158e2b63c009142cec4787f7d17ee, 0x32dc8a00fe923957fe616afe44f4fe9a22948375b6b5305ae1d77b3af71abfac), (0x0642adfd67cf4e81d8d749f0af7899cdfcadf626a7fc5ecf899df335637b1116, 0x3eaa3318136345491412d73cea3e4d32617138fed5ac07964148c416684c829d), - (0x1677bef1fee22af2545c154ca3f539079974f6caa08addadaa5940b670ffcf96, 0x0116d3d2c1bff627bb7d0939b31eccd7fa355061709fc0dd805ff0d84e3c723a), + (0x3f1186a8a7ac49117f112774c46640f6787862d6b229f8b635d113bc7983bcd0, 0x360dcfdaae55345c62f3e9e35b8bcde535f49fd0f110035a0cab82e6d01eae67), (0x0c11eb743169fb6ec53a5a3f488222f384d4b511a1351aaa90232e2de324bf04, 0x20dddc311971f50cd06f208f789c5134fb3c46e03bace128037e494a7b356d3b), - (0x34524e4667247bb91885e711b4842ad750d6a1fa8b7d4169d40593ae5daa1a8b, 0x18b745fc9b240e012948826f895004cf70f069fc31a5591ae65c39d4c84d24ff), - (0x3744269e6bb077c0403eb2d8df841a7b79704699febb595ba39a855477afdb23, 0x3de274ea3c8a19e2a85908e1f5e754dfb45b8c74f4a1c8df0fd205b3a31d1104), + (0x1bbb5fecec25e1e692befb07f5fd3aca9a4bf99a48c5f81ddaebcdb4c848fa7c, 0x2efeabdd7c0dea8d34113e8c9bd6c099b308e765eb7648cdf3ba90a8195eb80e), + (0x22af4db15dceb16bbdd902d6b33a73f1c6463eb8f5ed88007dcf02081da3441c, 0x0f61a96580c8413a434f2643c87b36e359e46d08344fc474249592045d44c0af), (0x1659e9b11ad8f8870c01ac69329f9b3589cac2bcbfc11aefa249f794ac2383e8, 0x17b197bade60bdd892acbea2d8570f8b68dc6967d41ad53353d80590615922cc), (0x1fc683b4aa3aaa5d507db074437cb44eba22ccf691587a00d6b8e35b1db84295, 0x0016e5d1926deb58820360a975067e64fc830c77af0b58d431576c882d753688), (0x0128bdf9f501f3776e3309e37ecdbb877c58347b3e81fde35c64929dec5a2df8, 0x0227030614551c33ac265b16821c7f61df912dff99deec74bc9eb81a925a2528), - (0x1d6d0268bbf9385d837fc245fb95e589106abf9164a14af358b175df67e55a5c, 0x15133a10336dfa242402ab9772b929323bb3412f5832c109462a83bd432fd47d), - (0x187361c5d421eba129cf4360e9f1f0c095252556b5ecda5da0385ce042afcd75, 0x31e3778cc1c7199c73dffd94213488d283b4194419ebe4760790af71d3e9608b), - (0x05b0237aa3e3b1f0f08fdf700bb972a3ccdb824703a8e2464811167b1bd16b5f, 0x11912de88efcf5d594ddc7db07e30eb3368ad767f73ee4ce1a31310cb78dbefa), - (0x3665e062e3cfeee35182b431f09a3c5602f135f9209c9fe004638f3ff7eb8e99, 0x2ce980f58f37a3fd67d9d1cd821ffb14a8ee15d3ef2c1bda8fe740f6af97e0ed), - (0x2d6db9fd8d718762d8e9d6c2f2ebb74fa610a8138071c8fec2097be84214c015, 0x0ea640500da8fdf07ff2f82a7b39dc4d7613f46fa0c0c04c28080c039de99f0c), + (0x2205ed69d5614ddd2cfdfbde79aa4c7fca1a98c575c9263daea197807202f8cb, 0x3802574753e08a3be43c69e563d1eb994faa9e79ecaf64353ea0856011915887), + (0x048a44df2e9961d4fbe1657063d7ebef88a565230604e0866f6a333402ff81a1, 0x3781c462ab5b6b3fef07d1588a380da0913a0f5385f523a74cf6ee5d4fd7a38b), + (0x26a8ec0b689abd96b1d70ee271fb66ce2cf15cde24594bba08eebb2ec3dc271d, 0x33678b7dbb336a22160bfb90ead3391b881b57623086c13d939d81f51f4e94d2), + (0x01d25441a7869906f2e5b4b9be5ea291307887ef14676792e83ee88df5eaa139, 0x04b2900c7a337c328df30759321de78e8c1e63ace4d968301b73bc3667b8a9e4), + (0x18537b71cfe44057d6b24509e41af27c9250f97948ee509bd2b3249b3d936363, 0x1572f094bbab66327882c906a8d12976b9e740c755d31852527efe0b3ad8d110), ], permutation: VerifyingKey { commitments: [ - (0x30a6cf79e19c1152d747cd72047704724515a0f4e40fd490dd23d55844eef8ac, 0x2f2f843bc407515c91f69d339bc2444be42908e07b2dbef34d61cfc63f18ae8f), - (0x3bd4152f2d8b6082e96252c238633fddc93617408fd102a96e75aca50c17b736, 0x3e369b6951e5d5fdb370f0b24e82c1938686efa45cd1cbe573faa9a094c3903d), - (0x15170333e4d2e6c4f5ed018093445acfad8c26780c7788eb101ec0a9f1a83153, 0x2ba1c3d7a72cf144c53272322878f1ff0f713701c71b35adb5136050c0183059), - (0x1a421544f8ca7d550b7d7541167140fb0c596cbf4c4b6802afc2d45377ea7324, 0x2e56f1755f4ee8a7a87aa4864944d0c36d002263434b2563ff9afe37c27fe463), - (0x3689adfd1c4ab99b1928bfede5c940bed5d45a3139ab2c132759bd108fe3629a, 0x1d399fda63740ac6dac4c281d77912ea34aadbb7485a9ef5581030e04cc7a2a6), - (0x15fec8739d0bad77e61a164b256d9e00d549041b9c7ae096c6cf0535a51609c3, 0x1fcf91b71c69dbb8785ba89a4fcc3614a1ce57b223dfe0abf0cf9b4d7e7cd6ad), - (0x1e02cb25a03031188c6e8f27e14b25e9dface9e906b8b72e5b820d5c75002864, 0x2507bfbfb12086825ed679ae0ee9a879bd4a5e2301200a14d6e2b2a1d5c6365b), - (0x301252ddeb85849e3ad18ce0af85aaa0cd1f07eedfdaccea3fb1c12837cc8742, 0x1aa485192008dd920e1fd491351060c85e465b4978e823107e83094230a83bfd), - (0x34fbf0308d0e338f0951eab22aeecffb55947770d0c0c3765c872c7955122a9c, 0x27ac178283d71eb511c09ebb20a439066c02d60e59b38fd44b01e3a68c98b930), - (0x0586aa2ff41729e750b4a1a3d40b28459f27ba5e85dcc3423f3ffd9d4ee0865f, 0x2753dc9d8c1044dfdd73256e2b3cb400394a7b2064305bdab242f9c8151cefab), - (0x27fe1d16ada10ec7ca28120884cdd57bb6917999e0cbae84bce02362ca0ac889, 0x1a9b9b2e685c380584b0eeff6bbcec4a0ec0f653b1993fbf27e6c0afde27ebe9), - (0x28c8e999738fbd10a4a406358c706750d637f36196e57fd39635b78659752e19, 0x17aabe8bc03bc5021b7417152c2024e97e27937c32b576c72427a7f370041ed5), + (0x321650742388b891a2ca628c0253fe51fd9aff372ec60676190b2a3c41c369f6, 0x23b66038d92f713c7d2fc8fc19338ebb97246c6050014c5d38c3b9ef373b850c), + (0x0a7f15e2ac106d916cb0688d02f1460075988d6cc8c0ea4d2f963af14b9d4631, 0x3e1e658ea0785c3ad0eff5a1ca7f87d21f2a6b32c9a6493ab6b4f9a4abe4f9ee), + (0x12f4019cda957299d1a58bee5ffb2f53b1dc882f585caca399d42ee5efd58815, 0x38b6fe17f8f60f392006eb775534590732a503b66597839dfa0d6215469833ab), + (0x1fffe339d22f6eed361d89e1359d096384a5f6608e3a84de6c1e97546a2a41e3, 0x2efe0b6111fa51fe57b2b06f0de775a12f6710c186e0674b57ad653996f03570), + (0x3726961370f01f191b656369d7dc0e955492767d727d4a7fcb979684b377cc0a, 0x0d0351054f9093cf753c3dd43a06d169c68e4ef6405c840c6229b3fa0e5d4414), + (0x3fd1dd4fe8b1ead80b99dc1d031677c8e7ad85634f06c688fad6699f0a0e6e15, 0x020c7044b7c18fef50b895c09ccb4da421a1ee09f8cc13186568fb69a2cb633d), + (0x32cd28779d03eec0679aecaabdbe5900845ef9c5e380b818477cc77f515bb2dc, 0x0b9d0a72bd11e28ebc703269ec2b6012087df6952d0af7d58e6e70a9b08522e1), + (0x201986289b84e1488747a8938a53be0d8f2f17f124b31195e484285ae8153932, 0x0247c54df701728c1059e261fa20ada6b8c051de765fb0027af13dae2ac6f881), + (0x13df85822ee7b71378063bf11be41575c2269aeaec57385ff13bbeab571201f0, 0x29283330f93b4d539ddba9fb3f6ddef9b469eba692a9145cb428c5ab284b0e3b), + (0x286e3e4c7fb8af45ba94c95f4b4e5da9e81a200cdfb4a73f841bc6c36bc5bfb1, 0x253f1a3c6c353a73a2eefa7006130e59b365bdd0f40fa0ba93dc1c102783c63a), + (0x0ca0a21843a98e7d4234bf9814cce587ce3302fca2c06e1e69dbfda60a155282, 0x3372fac97d59919ae4763c5cea8d51b8c865a27418b444fecc67e2b095f7bf96), + (0x30e217c091b12a70d5340429c1653fbcae051feaced85660658a0c644888c691, 0x2c1dbf782f2042e5170d2bdcfc2ac8fbdf19a81ac3973ac3ba264ab274583caf), (0x21d210b41675a1eae44cbd0f3fd27d69e30716c71873f6089cee61acacd403ab, 0x2275e97c7e84f68bfaa528a9d8be4e059f7abefd80d03fbfca774e8414a9b7c1), (0x0f9e7de28e0f650d99d99d95c0fcd39c9dac9db5aa1973319f66922d6eb9f7d5, 0x1ba644ecc18ad711ddd33af7f695f6834e9f35c93d47a6a5273dabbe800fc7e6), (0x0aab3ab73afac76277cd94a891de15e42ceb09f3a9865dab5c814bebfbb4453f, 0x27119fec3736d99abeeef1ad7b857db7e754e0c158780ed3dd0cdd4dc2453e10), diff --git a/src/circuit_proof_test_case.bin b/src/circuit_proof_test_case.bin index 9e59b55b3e866dc29fe8440967df9aaf0a4617ab..b83b2cf9f176ec871932122e36ee5dcb3d7d67ce 100644 GIT binary patch literal 5250 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 Date: Sun, 25 Sep 2022 20:51:09 +0200 Subject: [PATCH 16/16] zsa-mux: fix linter --- src/builder.rs | 2 +- src/value.rs | 2 +- src/zip32.rs | 2 +- tests/builder.rs | 4 ++-- 4 files changed, 5 insertions(+), 5 deletions(-) diff --git a/src/builder.rs b/src/builder.rs index 324b2af92..9458a714c 100644 --- a/src/builder.rs +++ b/src/builder.rs @@ -904,7 +904,7 @@ mod tests { .unwrap() .create_proof(&pk, &mut rng) .unwrap() - .prepare(&mut rng, [0; 32]) + .prepare(rng, [0; 32]) .finalize() .unwrap(); assert_eq!(bundle.value_balance(), &(-5000)) diff --git a/src/value.rs b/src/value.rs index a3a2e7a8a..0750772ad 100644 --- a/src/value.rs +++ b/src/value.rs @@ -142,7 +142,7 @@ pub(crate) enum Sign { } /// A sum of Orchard note values. -#[derive(Clone, Copy, Debug, Default, PartialEq)] +#[derive(Clone, Copy, Debug, Default, PartialEq, Eq)] pub struct ValueSum(i128); impl ValueSum { diff --git a/src/zip32.rs b/src/zip32.rs index ab0d30b3d..3ba8bd571 100644 --- a/src/zip32.rs +++ b/src/zip32.rs @@ -65,7 +65,7 @@ impl FvkTag { } /// A hardened child index for a derived key. -#[derive(Copy, Clone, Debug, PartialEq)] +#[derive(Copy, Clone, Debug, PartialEq, Eq)] pub struct ChildIndex(u32); impl TryFrom for ChildIndex { diff --git a/tests/builder.rs b/tests/builder.rs index 4329efc7a..a31614d54 100644 --- a/tests/builder.rs +++ b/tests/builder.rs @@ -56,7 +56,7 @@ fn bundle_chain() { let unauthorized = builder.build(&mut rng).unwrap(); let sighash = unauthorized.commitment().into(); let proven = unauthorized.create_proof(&pk, &mut rng).unwrap(); - proven.apply_signatures(&mut rng, sighash, &[]).unwrap() + proven.apply_signatures(rng, sighash, &[]).unwrap() }; // Verify the shielding bundle. @@ -105,7 +105,7 @@ fn bundle_chain() { let sighash = unauthorized.commitment().into(); let proven = unauthorized.create_proof(&pk, &mut rng).unwrap(); proven - .apply_signatures(&mut rng, sighash, &[SpendAuthorizingKey::from(&sk)]) + .apply_signatures(rng, sighash, &[SpendAuthorizingKey::from(&sk)]) .unwrap() };