Skip to content

Commit

Permalink
restructuring
Browse files Browse the repository at this point in the history
  • Loading branch information
jleni committed May 8, 2024
1 parent 1968039 commit 1609167
Show file tree
Hide file tree
Showing 17 changed files with 685 additions and 730 deletions.
9 changes: 9 additions & 0 deletions app/rust/include/commitments.h
Original file line number Diff line number Diff line change
@@ -0,0 +1,9 @@
void compute_note_commitment(uint8_t *inputptr, const uint8_t *rcmptr, const uint64_t value, const uint8_t *diversifier_ptr,
const uint8_t *pkd);

void compute_note_commitment_fullpoint(uint8_t *inputptr, const uint8_t *rcmptr, const uint64_t value,
const uint8_t *diversifier_ptr, const uint8_t *pkd);

void compute_value_commitment(const uint64_t value, const uint8_t *rcmptr, uint8_t *output);

void compute_nullifier(uint8_t *ncmptr, uint64_t pos, const uint8_t *nsk_ptr, uint8_t *outputptr);
8 changes: 8 additions & 0 deletions app/rust/include/notes.h
Original file line number Diff line number Diff line change
@@ -0,0 +1,8 @@
void rseed_get_esk_epk(const uint8_t *seed_ptr, uint8_t *d_ptr, uint8_t *output_esk_ptr, uint8_t *output_epk_ptr);

void rseed_get_rcm(const uint8_t *input, uint8_t *output_ptr);

void ka_to_key(uint8_t *esk_ptr, uint8_t *pkd_ptr, uint8_t *epk_ptr, uint8_t *output_ptr);

void prepare_enccompact_input(uint8_t *d, uint64_t value, uint8_t *rcm, uint8_t memotype, uint8_t *output);

79 changes: 3 additions & 76 deletions app/rust/include/rslib.h
Original file line number Diff line number Diff line change
Expand Up @@ -5,88 +5,15 @@
#include "parser_common.h"
#include "parser_txdef.h"

// ZIP32 functions
void get_pkd(const uint8_t *seed_ptr, const uint32_t pos, const uint8_t *diversifier_ptr, uint8_t *pkd);
#include "zip32.h"
#include "notes.h"
#include "commitments.h"

void get_pkd_from_seed(const uint8_t *seed_ptr, const uint32_t pos, const uint8_t *start_index, uint8_t *diversifier_ptr,
uint8_t *pkd);

void get_diversifier_list(const uint8_t *sk_ptr, uint8_t *diversifier_list);

void get_diversifier_fromlist(const uint8_t *diversifier_list, uint8_t *diversifier);

bool is_valid_diversifier(const uint8_t *diversifier);

void get_diversifier_list_withstartindex(const uint8_t *seed_ptr, const uint32_t pos, const uint8_t *startindex,
uint8_t *diversifier_list);

void get_default_diversifier_list_withstartindex(const uint8_t *seed_ptr, const uint32_t pos, uint8_t *startindex,
uint8_t *diversifier_list);

void get_default_diversifier_without_start_index(const uint8_t *see_ptr, const uint32_t pos, uint8_t *default_diversifier);

// void zip32_master(const uint8_t *seed_ptr, uint8_t *sk_ptr, uint8_t *dk_ptr);

void zip32_child_ask_nsk(const uint8_t *seed_ptr, uint8_t *ask, uint8_t *nsk, const uint32_t pos);

/**
* @deprecated This function is deprecated and should not be used in new code.
*/
void zip32_nsk_from_seed(const uint8_t *seed_ptr, uint8_t *nsk);

/**
* @deprecated This function is deprecated and should not be used in new code.
*/
void zip32_ivk(const uint8_t *ak_ptr, uint8_t *ivk_ptr, const uint32_t pos);

/**
* @deprecated This function is deprecated and should not be used in new code.
*/
void zip32_ovk(const uint8_t *seed_ptr, uint8_t *ovk, const uint32_t pos);

/**
* @deprecated This function is deprecated and should not be used in new code.
*/
void zip32_fvk(const uint8_t *seed_ptr, uint8_t *fvk, const uint32_t pos);

void zip32_child_proof_key(const uint8_t *seed_ptr, uint8_t *ak_ptr, uint8_t *nsk_ptr, const uint32_t pos);

// Rseed
void rseed_get_esk_epk(const uint8_t *seed_ptr, uint8_t *d_ptr, uint8_t *output_esk_ptr, uint8_t *output_epk_ptr);

void rseed_get_rcm(const uint8_t *input, uint8_t *output_ptr);

// Commitments
void compute_note_commitment(uint8_t *inputptr, const uint8_t *rcmptr, const uint64_t value, const uint8_t *diversifier_ptr,
const uint8_t *pkd);

void compute_note_commitment_fullpoint(uint8_t *inputptr, const uint8_t *rcmptr, const uint64_t value,
const uint8_t *diversifier_ptr, const uint8_t *pkd);

void compute_value_commitment(const uint64_t value, const uint8_t *rcmptr, uint8_t *output);

void compute_nullifier(uint8_t *ncmptr, uint64_t pos, const uint8_t *nsk_ptr, uint8_t *outputptr);

// Note encryption
void blake2b_prf(uint8_t *inputptr, uint8_t *outptr);

void ka_to_key(uint8_t *esk_ptr, uint8_t *pkd_ptr, uint8_t *epk_ptr, uint8_t *output_ptr);

void prepare_enccompact_input(uint8_t *d, uint64_t value, uint8_t *rcm, uint8_t memotype, uint8_t *output);

// RedJubjub
void random_fr(uint8_t *alpha_ptr);

void randomized_secret_from_seed(uint8_t *seed_ptr, uint32_t pos, uint8_t *alpha_ptr, uint8_t *output_ptr);

void get_rk(uint8_t *ask_ptr, uint8_t *alpha_ptr, uint8_t *output_ptr);
void rsk_to_rk(const uint8_t *rsk_ptr, uint8_t *rk_ptr);

// void randomize_pk(uint8_t *alpha_ptr, uint8_t *pk_ptr);

void sign_redjubjub(uint8_t *key_ptr, uint8_t *msg_ptr, uint8_t *out_ptr);

// Session key
// void sessionkey_agree(uint8_t *scalar_ptr, uint8_t *point_ptr, uint8_t *output_ptr);

// void pubkey_gen(uint8_t *scalar_ptr, uint8_t *output_ptr);
44 changes: 44 additions & 0 deletions app/rust/include/zip32.h
Original file line number Diff line number Diff line change
@@ -0,0 +1,44 @@
void get_pkd(const uint8_t *seed_ptr, const uint32_t pos, const uint8_t *diversifier_ptr, uint8_t *pkd);

void get_pkd_from_seed(const uint8_t *seed_ptr, const uint32_t pos, const uint8_t *start_index, uint8_t *diversifier_ptr,
uint8_t *pkd);

void get_diversifier_list(const uint8_t *sk_ptr, uint8_t *diversifier_list);

void get_diversifier_fromlist(const uint8_t *diversifier_list, uint8_t *diversifier);

bool is_valid_diversifier(const uint8_t *diversifier);

void get_diversifier_list_withstartindex(const uint8_t *seed_ptr, const uint32_t pos, const uint8_t *startindex,
uint8_t *diversifier_list);

void get_default_diversifier_list_withstartindex(const uint8_t *seed_ptr, const uint32_t pos, uint8_t *startindex,
uint8_t *diversifier_list);

void get_default_diversifier_without_start_index(const uint8_t *see_ptr, const uint32_t pos, uint8_t *default_diversifier);

// void zip32_master(const uint8_t *seed_ptr, uint8_t *sk_ptr, uint8_t *dk_ptr);

void zip32_child_ask_nsk(const uint8_t *seed_ptr, uint8_t *ask, uint8_t *nsk, const uint32_t pos);

/**
* @deprecated This function is deprecated and should not be used in new code.
*/
void zip32_nsk_from_seed(const uint8_t *seed_ptr, uint8_t *nsk);

/**
* @deprecated This function is deprecated and should not be used in new code.
*/
void zip32_ivk(const uint8_t *ak_ptr, uint8_t *ivk_ptr, const uint32_t pos);

/**
* @deprecated This function is deprecated and should not be used in new code.
*/
void zip32_ovk(const uint8_t *seed_ptr, uint8_t *ovk, const uint32_t pos);

/**
* @deprecated This function is deprecated and should not be used in new code.
*/
void zip32_fvk(const uint8_t *seed_ptr, uint8_t *fvk, const uint32_t pos);

void zip32_child_proof_key(const uint8_t *seed_ptr, uint8_t *ak_ptr, uint8_t *nsk_ptr, const uint32_t pos);
1 change: 1 addition & 0 deletions app/rust/src/bolos/blake2b.rs
Original file line number Diff line number Diff line change
Expand Up @@ -202,6 +202,7 @@ pub fn blake2s_diversification(tag: &[u8]) -> [u8; 32] {
pub const GH_FIRST_BLOCK: &[u8; 64] =
b"096b36a5804bfacef1691e173c366a47ff5ba84a44f26ddd7e8d9f79d5b42df0";

// FIXME: not using bolos blake!?
let h = Blake2sParams::new()
.hash_length(32)
.personal(KEY_DIVERSIFICATION_PERSONALIZATION)
Expand Down
110 changes: 7 additions & 103 deletions app/rust/src/commitments.rs
Original file line number Diff line number Diff line change
Expand Up @@ -3,17 +3,16 @@ use crate::constants::{
NOTE_POSITION_BASE, PEDERSEN_RANDOMNESS_BASE, VALUE_COMMITMENT_RANDOM_BASE,
VALUE_COMMITMENT_VALUE_BASE,
};
use crate::cryptoops::{add_to_point, extended_to_bytes, extended_to_u_bytes};
use crate::cryptoops::{add_to_point, extended_to_bytes};
use blake2s_simd::Params as Blake2sParams;
use jubjub::{AffinePoint, ExtendedPoint, Fr};

use crate::pedersen::*;
use crate::personalization::CRH_NF;
use crate::sapling::sapling_nsk_to_nk;
use crate::types::Diversifier;
use crate::utils::{into_fixed_array, shiftsixbits};
use crate::zip32::zip32_nsk_from_seed;
use crate::{cryptoops, utils, zip32}; // #[inline(never)]
use crate::zip32_extern::zip32_nsk_from_seed;
use crate::{utils, zip32}; // #[inline(never)]

#[inline(never)]
pub fn group_hash_from_diversifier(diversifier_ptr: *const Diversifier, gd_ptr: *mut [u8; 32]) {
Expand Down Expand Up @@ -67,99 +66,20 @@ pub fn mixed_pedersen(e: &ExtendedPoint, scalar: Fr) -> [u8; 32] {
#[inline(never)]
pub fn prf_nf(nk: &[u8; 32], rho: &[u8; 32]) -> [u8; 32] {
// BLAKE2s Personalization for PRF^nf = BLAKE2s(nk | rho)

// FIXME: not using bolos blake!?
let h = Blake2sParams::new()
.hash_length(32)
.personal(CRH_NF)
.to_state()
.update(nk)
.update(rho)
.finalize();

let x: [u8; 32] = *h.as_array();
x
}

//////////////////////////////
//////////////////////////////
#[no_mangle]
pub extern "C" fn compute_nullifier(
ncm_ptr: *const [u8; 32],
pos: u64,
nsk_ptr: *const [u8; 32],
output_ptr: *mut [u8; 32],
) {
c_zemu_log_stack(b"compute_nullifier\x00".as_ref());
let ncm = unsafe { *ncm_ptr };
let nsk = unsafe { &*nsk_ptr };
let nk = sapling_nsk_to_nk(nsk);

crate::bolos::heartbeat();

let scalar = Fr::from(pos);
let e = cryptoops::bytes_to_extended(ncm);
crate::bolos::heartbeat();

let rho = mixed_pedersen(&e, scalar);
crate::bolos::heartbeat();

let output = unsafe { &mut *output_ptr };
output.copy_from_slice(&prf_nf(&nk, &rho));
}

//////////////////////////////
//////////////////////////////
#[no_mangle]
pub extern "C" fn compute_note_commitment(
input_ptr: *mut [u8; 32],
rcm_ptr: *const [u8; 32],
value: u64,
diversifier_ptr: *const Diversifier,
pkd_ptr: *const [u8; 32],
) {
let mut gd = [0u8; 32];
let diversifier = unsafe { &*diversifier_ptr };
group_hash_from_diversifier(diversifier, &mut gd);

let pkd = unsafe { &*pkd_ptr };
let out = unsafe { &mut *input_ptr };
prepare_and_hash_input_commitment(value, &gd, pkd, out);

let rc = unsafe { &*rcm_ptr };
let mut e = cryptoops::bytes_to_extended(*out);
let s = multiply_with_pedersen_base(rc);

add_to_point(&mut e, &s);

out.copy_from_slice(&extended_to_u_bytes(&e));
}

//////////////////////////////
//////////////////////////////
#[no_mangle]
pub extern "C" fn compute_note_commitment_fullpoint(
input_ptr: *mut [u8; 32],
rcm_ptr: *const [u8; 32],
value: u64,
diversifier_ptr: *const Diversifier,
pkd_ptr: *const [u8; 32],
) {
let mut gd = [0u8; 32];
let diversifier = unsafe { &*diversifier_ptr };

group_hash_from_diversifier(diversifier, &mut gd);

let pkd = unsafe { &*pkd_ptr };
let out = unsafe { &mut *input_ptr };
prepare_and_hash_input_commitment(value, &gd, pkd, out);

let rc = unsafe { &*rcm_ptr };
let mut e = cryptoops::bytes_to_extended(*out);
let s = multiply_with_pedersen_base(rc);

add_to_point(&mut e, &s);

out.copy_from_slice(&extended_to_bytes(&e));
}

//////////////////////////////
//////////////////////////////

Expand All @@ -174,28 +94,12 @@ pub fn value_commitment_step2(rcm: &[u8; 32]) -> ExtendedPoint {
VALUE_COMMITMENT_RANDOM_BASE.multiply_bits(rcm)
}

#[no_mangle]
pub extern "C" fn compute_value_commitment(
value: u64,
rcm_ptr: *const [u8; 32],
output_ptr: *mut [u8; 32],
) {
let rc = unsafe { &*rcm_ptr };
let output_msg = unsafe { &mut *output_ptr };

//let vcm = value_commitment(value, rc);
let mut x = value_commitment_step1(value);
let s = value_commitment_step2(rc);
add_to_point(&mut x, &s);
let vcm = extended_to_bytes(&x);
output_msg.copy_from_slice(&vcm);
}

//////////////////////////////
//////////////////////////////

#[cfg(test)]
mod tests {
use crate::commitments_extern::{compute_note_commitment, compute_nullifier};
use crate::types::diversifier_zero;
use crate::utils::into_fixed_array;

Expand Down

0 comments on commit 1609167

Please sign in to comment.