From 1bc101252c348a94f3cf1ead5774f317ca72aea7 Mon Sep 17 00:00:00 2001 From: samkim-crypto Date: Wed, 21 Jun 2023 06:14:18 +0900 Subject: [PATCH] [zk-token-sdk] Use `TryFrom<&[T]>` for `&[T]` instead of `arrayref` (#31959) * remove `arrayref` from `auth_encryption` * remove `arrayref` from `sigma_proofs` * refactor `canonical_scalar_from_slice` * remove `arrayref` from `Cargo.toml` * cargo lock --- Cargo.lock | 1 - programs/sbf/Cargo.lock | 1 - zk-token-sdk/Cargo.toml | 1 - .../src/encryption/auth_encryption.rs | 10 ++---- .../ciphertext_ciphertext_equality_proof.rs | 23 +++++--------- .../ciphertext_commitment_equality_proof.rs | 21 +++++-------- zk-token-sdk/src/sigma_proofs/fee_proof.rs | 31 +++++++------------ .../grouped_ciphertext_validity_proof.rs | 18 ++++------- zk-token-sdk/src/sigma_proofs/mod.rs | 18 +++++++++++ zk-token-sdk/src/sigma_proofs/pubkey_proof.rs | 17 +++++----- .../src/sigma_proofs/zero_balance_proof.rs | 12 +++---- 11 files changed, 66 insertions(+), 87 deletions(-) diff --git a/Cargo.lock b/Cargo.lock index 1e93a0b66..8577d393d 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -7250,7 +7250,6 @@ name = "solana-zk-token-sdk" version = "1.17.0" dependencies = [ "aes-gcm-siv", - "arrayref", "base64 0.21.2", "bincode", "bytemuck", diff --git a/programs/sbf/Cargo.lock b/programs/sbf/Cargo.lock index ccb105311..7c95954fc 100644 --- a/programs/sbf/Cargo.lock +++ b/programs/sbf/Cargo.lock @@ -6264,7 +6264,6 @@ name = "solana-zk-token-sdk" version = "1.17.0" dependencies = [ "aes-gcm-siv", - "arrayref", "base64 0.21.2", "bincode", "bytemuck", diff --git a/zk-token-sdk/Cargo.toml b/zk-token-sdk/Cargo.toml index 4d1b904c4..5a627440f 100644 --- a/zk-token-sdk/Cargo.toml +++ b/zk-token-sdk/Cargo.toml @@ -21,7 +21,6 @@ tiny-bip39 = { workspace = true } [target.'cfg(not(target_os = "solana"))'.dependencies] aes-gcm-siv = { workspace = true } -arrayref = { workspace = true } bincode = { workspace = true } byteorder = { workspace = true } curve25519-dalek = { workspace = true, features = ["serde"] } diff --git a/zk-token-sdk/src/encryption/auth_encryption.rs b/zk-token-sdk/src/encryption/auth_encryption.rs index 600938bfc..14e2f3cf2 100644 --- a/zk-token-sdk/src/encryption/auth_encryption.rs +++ b/zk-token-sdk/src/encryption/auth_encryption.rs @@ -12,7 +12,6 @@ use { thiserror::Error, }; use { - arrayref::{array_ref, array_refs}, base64::{prelude::BASE64_STANDARD, Engine}, sha3::{Digest, Sha3_512}, solana_sdk::{ @@ -218,13 +217,10 @@ impl AeCiphertext { return None; } - let bytes = array_ref![bytes, 0, 36]; - let (nonce, ciphertext) = array_refs![bytes, 12, 24]; + let nonce = bytes[..32].try_into().ok()?; + let ciphertext = bytes[32..].try_into().ok()?; - Some(AeCiphertext { - nonce: *nonce, - ciphertext: *ciphertext, - }) + Some(AeCiphertext { nonce, ciphertext }) } } diff --git a/zk-token-sdk/src/sigma_proofs/ciphertext_ciphertext_equality_proof.rs b/zk-token-sdk/src/sigma_proofs/ciphertext_ciphertext_equality_proof.rs index 6f2dd72cd..da706b707 100644 --- a/zk-token-sdk/src/sigma_proofs/ciphertext_ciphertext_equality_proof.rs +++ b/zk-token-sdk/src/sigma_proofs/ciphertext_ciphertext_equality_proof.rs @@ -11,6 +11,7 @@ use { pedersen::{PedersenOpening, G, H}, }, errors::ProofVerificationError, + sigma_proofs::canonical_scalar_from_slice, }, curve25519_dalek::traits::MultiscalarMul, rand::rngs::OsRng, @@ -18,7 +19,6 @@ use { }; use { crate::{sigma_proofs::errors::EqualityProofError, transcript::TranscriptProtocol}, - arrayref::{array_ref, array_refs}, curve25519_dalek::{ ristretto::{CompressedRistretto, RistrettoPoint}, scalar::Scalar, @@ -239,20 +239,13 @@ impl CiphertextCiphertextEqualityProof { return Err(ProofVerificationError::Deserialization.into()); } - let bytes = array_ref![bytes, 0, 224]; - let (Y_0, Y_1, Y_2, Y_3, z_s, z_x, z_r) = array_refs![bytes, 32, 32, 32, 32, 32, 32, 32]; - - let Y_0 = CompressedRistretto::from_slice(Y_0); - let Y_1 = CompressedRistretto::from_slice(Y_1); - let Y_2 = CompressedRistretto::from_slice(Y_2); - let Y_3 = CompressedRistretto::from_slice(Y_3); - - let z_s = - Scalar::from_canonical_bytes(*z_s).ok_or(ProofVerificationError::Deserialization)?; - let z_x = - Scalar::from_canonical_bytes(*z_x).ok_or(ProofVerificationError::Deserialization)?; - let z_r = - Scalar::from_canonical_bytes(*z_r).ok_or(ProofVerificationError::Deserialization)?; + let Y_0 = CompressedRistretto::from_slice(&bytes[..32]); + let Y_1 = CompressedRistretto::from_slice(&bytes[32..64]); + let Y_2 = CompressedRistretto::from_slice(&bytes[64..96]); + let Y_3 = CompressedRistretto::from_slice(&bytes[96..128]); + let z_s = canonical_scalar_from_slice(&bytes[128..160])?; + let z_x = canonical_scalar_from_slice(&bytes[160..192])?; + let z_r = canonical_scalar_from_slice(&bytes[192..224])?; Ok(CiphertextCiphertextEqualityProof { Y_0, diff --git a/zk-token-sdk/src/sigma_proofs/ciphertext_commitment_equality_proof.rs b/zk-token-sdk/src/sigma_proofs/ciphertext_commitment_equality_proof.rs index b85b5069b..61ebf905f 100644 --- a/zk-token-sdk/src/sigma_proofs/ciphertext_commitment_equality_proof.rs +++ b/zk-token-sdk/src/sigma_proofs/ciphertext_commitment_equality_proof.rs @@ -16,6 +16,7 @@ use { pedersen::{PedersenCommitment, PedersenOpening, G, H}, }, errors::ProofVerificationError, + sigma_proofs::canonical_scalar_from_slice, }, curve25519_dalek::traits::MultiscalarMul, rand::rngs::OsRng, @@ -23,7 +24,6 @@ use { }; use { crate::{sigma_proofs::errors::EqualityProofError, transcript::TranscriptProtocol}, - arrayref::{array_ref, array_refs}, curve25519_dalek::{ ristretto::{CompressedRistretto, RistrettoPoint}, scalar::Scalar, @@ -219,19 +219,12 @@ impl CiphertextCommitmentEqualityProof { return Err(ProofVerificationError::Deserialization.into()); } - let bytes = array_ref![bytes, 0, 192]; - let (Y_0, Y_1, Y_2, z_s, z_x, z_r) = array_refs![bytes, 32, 32, 32, 32, 32, 32]; - - let Y_0 = CompressedRistretto::from_slice(Y_0); - let Y_1 = CompressedRistretto::from_slice(Y_1); - let Y_2 = CompressedRistretto::from_slice(Y_2); - - let z_s = - Scalar::from_canonical_bytes(*z_s).ok_or(ProofVerificationError::Deserialization)?; - let z_x = - Scalar::from_canonical_bytes(*z_x).ok_or(ProofVerificationError::Deserialization)?; - let z_r = - Scalar::from_canonical_bytes(*z_r).ok_or(ProofVerificationError::Deserialization)?; + let Y_0 = CompressedRistretto::from_slice(&bytes[..32]); + let Y_1 = CompressedRistretto::from_slice(&bytes[32..64]); + let Y_2 = CompressedRistretto::from_slice(&bytes[64..96]); + let z_s = canonical_scalar_from_slice(&bytes[96..128])?; + let z_x = canonical_scalar_from_slice(&bytes[128..160])?; + let z_r = canonical_scalar_from_slice(&bytes[160..192])?; Ok(CiphertextCommitmentEqualityProof { Y_0, diff --git a/zk-token-sdk/src/sigma_proofs/fee_proof.rs b/zk-token-sdk/src/sigma_proofs/fee_proof.rs index 6602a6c15..07797aa44 100644 --- a/zk-token-sdk/src/sigma_proofs/fee_proof.rs +++ b/zk-token-sdk/src/sigma_proofs/fee_proof.rs @@ -4,7 +4,10 @@ #[cfg(not(target_os = "solana"))] use { - crate::encryption::pedersen::{PedersenCommitment, PedersenOpening, G, H}, + crate::{ + encryption::pedersen::{PedersenCommitment, PedersenOpening, G, H}, + sigma_proofs::canonical_scalar_from_slice, + }, rand::rngs::OsRng, }; use { @@ -12,7 +15,6 @@ use { errors::ProofVerificationError, sigma_proofs::errors::FeeSigmaProofError, transcript::TranscriptProtocol, }, - arrayref::{array_ref, array_refs}, curve25519_dalek::{ ristretto::{CompressedRistretto, RistrettoPoint}, scalar::Scalar, @@ -367,24 +369,15 @@ impl FeeSigmaProof { return Err(ProofVerificationError::Deserialization.into()); } - let bytes = array_ref![bytes, 0, 256]; - let (Y_max_proof, z_max_proof, c_max_proof, Y_delta, Y_claimed, z_x, z_delta, z_claimed) = - array_refs![bytes, 32, 32, 32, 32, 32, 32, 32, 32]; + let Y_max_proof = CompressedRistretto::from_slice(&bytes[..32]); + let z_max_proof = canonical_scalar_from_slice(&bytes[32..64])?; + let c_max_proof = canonical_scalar_from_slice(&bytes[64..96])?; - let Y_max_proof = CompressedRistretto::from_slice(Y_max_proof); - let z_max_proof = Scalar::from_canonical_bytes(*z_max_proof) - .ok_or(ProofVerificationError::Deserialization)?; - let c_max_proof = Scalar::from_canonical_bytes(*c_max_proof) - .ok_or(ProofVerificationError::Deserialization)?; - - let Y_delta = CompressedRistretto::from_slice(Y_delta); - let Y_claimed = CompressedRistretto::from_slice(Y_claimed); - let z_x = - Scalar::from_canonical_bytes(*z_x).ok_or(ProofVerificationError::Deserialization)?; - let z_delta = Scalar::from_canonical_bytes(*z_delta) - .ok_or(ProofVerificationError::Deserialization)?; - let z_claimed = Scalar::from_canonical_bytes(*z_claimed) - .ok_or(ProofVerificationError::Deserialization)?; + let Y_delta = CompressedRistretto::from_slice(&bytes[96..128]); + let Y_claimed = CompressedRistretto::from_slice(&bytes[128..160]); + let z_x = canonical_scalar_from_slice(&bytes[160..192])?; + let z_delta = canonical_scalar_from_slice(&bytes[192..224])?; + let z_claimed = canonical_scalar_from_slice(&bytes[224..256])?; Ok(Self { fee_max_proof: FeeMaxProof { diff --git a/zk-token-sdk/src/sigma_proofs/grouped_ciphertext_validity_proof.rs b/zk-token-sdk/src/sigma_proofs/grouped_ciphertext_validity_proof.rs index 49c457915..6060d7fb4 100644 --- a/zk-token-sdk/src/sigma_proofs/grouped_ciphertext_validity_proof.rs +++ b/zk-token-sdk/src/sigma_proofs/grouped_ciphertext_validity_proof.rs @@ -16,6 +16,7 @@ use { pedersen::{PedersenCommitment, PedersenOpening, G, H}, }, errors::ProofVerificationError, + sigma_proofs::canonical_scalar_from_slice, }, curve25519_dalek::traits::MultiscalarMul, rand::rngs::OsRng, @@ -23,7 +24,6 @@ use { }; use { crate::{sigma_proofs::errors::ValidityProofError, transcript::TranscriptProtocol}, - arrayref::{array_ref, array_refs}, curve25519_dalek::{ ristretto::{CompressedRistretto, RistrettoPoint}, scalar::Scalar, @@ -209,17 +209,11 @@ impl GroupedCiphertext2HandlesValidityProof { return Err(ProofVerificationError::Deserialization.into()); } - let bytes = array_ref![bytes, 0, 160]; - let (Y_0, Y_1, Y_2, z_r, z_x) = array_refs![bytes, 32, 32, 32, 32, 32]; - - let Y_0 = CompressedRistretto::from_slice(Y_0); - let Y_1 = CompressedRistretto::from_slice(Y_1); - let Y_2 = CompressedRistretto::from_slice(Y_2); - - let z_r = - Scalar::from_canonical_bytes(*z_r).ok_or(ProofVerificationError::Deserialization)?; - let z_x = - Scalar::from_canonical_bytes(*z_x).ok_or(ProofVerificationError::Deserialization)?; + let Y_0 = CompressedRistretto::from_slice(&bytes[..32]); + let Y_1 = CompressedRistretto::from_slice(&bytes[32..64]); + let Y_2 = CompressedRistretto::from_slice(&bytes[64..96]); + let z_r = canonical_scalar_from_slice(&bytes[96..128])?; + let z_x = canonical_scalar_from_slice(&bytes[128..160])?; Ok(GroupedCiphertext2HandlesValidityProof { Y_0, diff --git a/zk-token-sdk/src/sigma_proofs/mod.rs b/zk-token-sdk/src/sigma_proofs/mod.rs index 7ce550f4a..41b7760ee 100644 --- a/zk-token-sdk/src/sigma_proofs/mod.rs +++ b/zk-token-sdk/src/sigma_proofs/mod.rs @@ -23,3 +23,21 @@ pub mod fee_proof; pub mod grouped_ciphertext_validity_proof; pub mod pubkey_proof; pub mod zero_balance_proof; + +#[cfg(not(target_os = "solana"))] +use {crate::errors::ProofVerificationError, curve25519_dalek::scalar::Scalar}; + +#[cfg(not(target_os = "solana"))] +fn canonical_scalar_from_slice(bytes: &[u8]) -> Result { + if bytes.len() != 32 { + return Err(ProofVerificationError::Deserialization); + } + + let scalar_bytes = bytes[..32] + .try_into() + .map_err(|_| ProofVerificationError::Deserialization)?; + + let scalar = Scalar::from_canonical_bytes(scalar_bytes) + .ok_or(ProofVerificationError::Deserialization)?; + Ok(scalar) +} diff --git a/zk-token-sdk/src/sigma_proofs/pubkey_proof.rs b/zk-token-sdk/src/sigma_proofs/pubkey_proof.rs index c2912debf..6cf36daf4 100644 --- a/zk-token-sdk/src/sigma_proofs/pubkey_proof.rs +++ b/zk-token-sdk/src/sigma_proofs/pubkey_proof.rs @@ -5,9 +5,12 @@ #[cfg(not(target_os = "solana"))] use { - crate::encryption::{ - elgamal::{ElGamalKeypair, ElGamalPubkey}, - pedersen::H, + crate::{ + encryption::{ + elgamal::{ElGamalKeypair, ElGamalPubkey}, + pedersen::H, + }, + sigma_proofs::canonical_scalar_from_slice, }, rand::rngs::OsRng, zeroize::Zeroize, @@ -17,7 +20,6 @@ use { errors::ProofVerificationError, sigma_proofs::errors::PubkeyValidityProofError, transcript::TranscriptProtocol, }, - arrayref::{array_ref, array_refs}, curve25519_dalek::{ ristretto::{CompressedRistretto, RistrettoPoint}, scalar::Scalar, @@ -126,11 +128,8 @@ impl PubkeyValidityProof { return Err(ProofVerificationError::Deserialization.into()); } - let bytes = array_ref![bytes, 0, 64]; - let (Y, z) = array_refs![bytes, 32, 32]; - - let Y = CompressedRistretto::from_slice(Y); - let z = Scalar::from_canonical_bytes(*z).ok_or(ProofVerificationError::Deserialization)?; + let Y = CompressedRistretto::from_slice(&bytes[..32]); + let z = canonical_scalar_from_slice(&bytes[32..64])?; Ok(PubkeyValidityProof { Y, z }) } diff --git a/zk-token-sdk/src/sigma_proofs/zero_balance_proof.rs b/zk-token-sdk/src/sigma_proofs/zero_balance_proof.rs index d835e1635..aa037ccf9 100644 --- a/zk-token-sdk/src/sigma_proofs/zero_balance_proof.rs +++ b/zk-token-sdk/src/sigma_proofs/zero_balance_proof.rs @@ -11,6 +11,7 @@ use { pedersen::H, }, errors::ProofVerificationError, + sigma_proofs::canonical_scalar_from_slice, }, curve25519_dalek::traits::MultiscalarMul, rand::rngs::OsRng, @@ -18,7 +19,6 @@ use { }; use { crate::{sigma_proofs::errors::ZeroBalanceProofError, transcript::TranscriptProtocol}, - arrayref::{array_ref, array_refs}, curve25519_dalek::{ ristretto::{CompressedRistretto, RistrettoPoint}, scalar::Scalar, @@ -165,13 +165,9 @@ impl ZeroBalanceProof { return Err(ProofVerificationError::Deserialization.into()); } - let bytes = array_ref![bytes, 0, 96]; - let (Y_P, Y_D, z) = array_refs![bytes, 32, 32, 32]; - - let Y_P = CompressedRistretto::from_slice(Y_P); - let Y_D = CompressedRistretto::from_slice(Y_D); - - let z = Scalar::from_canonical_bytes(*z).ok_or(ProofVerificationError::Deserialization)?; + let Y_P = CompressedRistretto::from_slice(&bytes[..32]); + let Y_D = CompressedRistretto::from_slice(&bytes[32..64]); + let z = canonical_scalar_from_slice(&bytes[64..96])?; Ok(ZeroBalanceProof { Y_P, Y_D, z }) }