Skip to content

Commit

Permalink
packages: Additional tests around shielded keys (#1129)
Browse files Browse the repository at this point in the history
* feat: additional tests around shielded keys

* feat: add test for shielded from mnemonic seed
  • Loading branch information
jurevans authored Sep 25, 2024
1 parent 6bd1e33 commit 77f10cd
Show file tree
Hide file tree
Showing 5 changed files with 84 additions and 10 deletions.
18 changes: 18 additions & 0 deletions packages/crypto/lib/src/crypto/bip39.rs
Original file line number Diff line number Diff line change
Expand Up @@ -114,6 +114,24 @@ mod tests {
assert_eq!(seed.vec.len(), 64);
}

#[wasm_bindgen_test]
fn can_restore_seed_from_phrase() {
let phrase = "caught pig embody hip goose like become worry face oval manual flame \
pizza steel viable proud eternal speed chapter sunny boat because view bullet";
let seed_bytes = vec![
178, 64, 160, 168, 33, 68, 84, 63, 0, 137, 121, 29, 66, 47, 123, 36, 64, 38, 160, 236,
93, 38, 53, 157, 169, 119, 42, 153, 188, 80, 209, 149, 51, 92, 251, 168, 150, 220, 70,
78, 230, 16, 152, 160, 85, 248, 115, 82, 183, 126, 96, 112, 58, 238, 230, 63, 89, 239,
0, 250, 163, 169, 166, 174,
];
let mnemonic = Mnemonic::from_phrase(phrase.into()).unwrap();
let seed = mnemonic
.to_seed(None)
.expect("Should return seed from mnemonic phrase");

assert_eq!(seed.vec, seed_bytes);
}

#[wasm_bindgen_test]
fn invalid_phrase_should_panic() {
let bad_phrase = "caught pig embody hip goose like become";
Expand Down
35 changes: 34 additions & 1 deletion packages/crypto/lib/src/crypto/zip32.rs
Original file line number Diff line number Diff line change
Expand Up @@ -86,6 +86,7 @@ impl ShieldedHDWallet {
#[cfg(test)]
mod tests {
use super::*;
use crate::crypto::bip39;
use masp_primitives::sapling::PaymentAddress;
use wasm_bindgen_test::*;

Expand All @@ -109,7 +110,7 @@ mod tests {
}

#[wasm_bindgen_test]
fn can_derive_child_to_serialized() {
fn can_derive_shielded_key_to_serialized() {
let seed = JsValue::from(js_sys::Uint8Array::new_with_length(64));
let shielded_wallet =
ShieldedHDWallet::new(seed).expect("Instantiating ShieldedHDWallet should not fail");
Expand All @@ -134,4 +135,36 @@ mod tests {
assert_eq!(xsk.expsk.to_bytes().len(), KEY_SIZE);
assert_eq!(xfvk.fvk.to_bytes().len(), KEY_SIZE);
}

#[wasm_bindgen_test]
fn can_restore_shielded_keys_from_mnemonic() {
let phrase = "great sphere inmate december menu warrior adjust glass flat heavy act mail";
let mnemonic = bip39::Mnemonic::from_phrase(phrase.into()).unwrap();
let seed = mnemonic
.to_seed(None)
.expect("Should return seed from mnemonic phrase");

let shielded_wallet = ShieldedHDWallet::new(JsValue::from(seed))
.expect("Instantiating ShieldedHDWallet should not fail");

let shielded_account = shielded_wallet
.derive(vec![32, 877, 0], None)
.expect("Deriving from ExtendedKeys should not fail");

let payment_address = PaymentAddress::try_from_slice(&shielded_account.payment_address())
.expect("should instantiate from serialized bytes");
let xfvk = ExtendedFullViewingKey::try_from_slice(&shielded_account.xfvk())
.expect("should instantiate from serialized bytes");

assert_eq!(payment_address.to_string(), "0a918bd974d1abddcc2e15eddec2557abae385ed59fb3089ed4aff418819a63bf4a7890591ff107a2b7569");
assert_eq!(
xfvk.fvk.to_string(),
format!(
"{}{}{}",
"9f89bdaf176f8528f43303ae793ce128af3436902a39ebbe46509f6fef11eb",
"585270060da4c12f1a52b63c7c6906dddcabb0ecd00735e11b0d7cbee277342dd89a10e9c7",
"e69bca34b50a3c8525bbee96347a7cadfd6c32d3af5b92ad1ecf07da"
)
);
}
}
14 changes: 13 additions & 1 deletion packages/sdk/src/tests/data.ts
Original file line number Diff line number Diff line change
Expand Up @@ -7,6 +7,9 @@ export const CHAIN_ID = "localnet.a905b497170d585eb67fd";
export const MNEMONIC_1 =
"liar bird install win wool venue observe maid flock clap bullet myth illness trip bread fresh polar smart use lunar tired embody come deer";

export const MNEMONIC_2 =
"resist mystery settle ask saddle great kite tragic leaf improve ticket admit analyst tomorrow tobacco aim desk melt wheel despair patch ketchup calm winner";

export const ACCOUNT_1 = {
address: "tnam1qz4sdx5jlh909j44uz46pf29ty0ztftfzc98s8dx",
publicKey:
Expand All @@ -21,7 +24,7 @@ export const ACCOUNT_2 = {
"tpknam1qrxzmeyka3v43jnrhep9stnj3jhtgzq96ku3u6lk8hy8xqmjqgjtw8qu274",
};

export const SHIELDED_ACCOUNT = {
export const SHIELDED_ACCOUNT_1 = {
paymentAddress:
"znam1t5y7e7n6l9n3wfdq8j973lu9n8s086et6snmcmvu3lues59d5qlg085u25grflkr87ktwuhvd4y",
spendingKey:
Expand All @@ -30,6 +33,15 @@ export const SHIELDED_ACCOUNT = {
"zvknam1qdjyja2zqqqqpqpxsekqx3tg8qz727cyqqhujj7c74xglmzk5lk0e2gej2s2e6c4vgxlamnryqz6ytms0wflzthg264m4qxucgsxf8en6unm9l33sc3qs9duecssuxah0hw267uu7nr9qym763v8qup2t3upxungmc0cqggvsy092ahrtpm7zv34sj8dy72zwpzwjja69pw6lacdd655j0zaxdjk6ej387njquecyqm2hzv3kps76wrv2y5xk634kkcc05tdrvwyhhqukwe9z",
};

export const SHIELDED_ACCOUNT_2 = {
paymentAddress:
"znam1u5nehkhgys5hdxzx6un9j2lfyx2e9fpzluaq7pedhkzxn9dm2wtfs8kywh45wc96yh63grkpw54",
spendingKey:
"zsknam1q0yp502jqqqqpqpf0vcvm20gadwfl2xt4gaqc5nwrdvl2ky3upvwja6uryucvmw5r7jxu2tuujuapqa5ud9cvuh9x4lkgy7sn7xlzm2kapqjl6y8zq4qwkl3vaye5z5gwe4yrmy5nh0a5zrlj8we947n2c4kmqm0t47gldgz8r58w2kwuee0edafdqmvvgtalpqyvanhzcvmglcufmu6g3jhr3kjayfhdfjefnsr8yhd3ah6xwpslgzy5s3xnhehzrsr2lqq0wfzacgrptw09",
viewingKey:
"zvknam1q0yp502jqqqqpqpf0vcvm20gadwfl2xt4gaqc5nwrdvl2ky3upvwja6uryucvmw5r7p9ddjvw86ma4qy57vzcqqqwa5efmvj2cnhgqgnktuffgz7zscd3fx776pul3f4df5ve3tef0htzwm7wv702t432m6fv9q2kepazvf78r58w2kwuee0edafdqmvvgtalpqyvanhzcvmglcufmu6g3jhr3kjayfhdfjefnsr8yhd3ah6xwpslgzy5s3xnhehzrsr2lqq0wfzacgx2s96s",
};

export const SIG_VALID = {
publicKey:
"tpknam1qptrn64myunqr4847yq4cn0uwek5ecwc7eeexjfc5npmd5kmg6ex563n5as",
Expand Down
21 changes: 17 additions & 4 deletions packages/sdk/src/tests/keys.test.ts
Original file line number Diff line number Diff line change
@@ -1,7 +1,9 @@
import {
ACCOUNT_1 as account1,
MNEMONIC_1 as mnemonic1,
SHIELDED_ACCOUNT as shieldedAccount,
MNEMONIC_2 as mnemonic2,
SHIELDED_ACCOUNT_1 as shieldedAccount1,
SHIELDED_ACCOUNT_2 as shieldedAccount2,
} from "./data";
import { initSdk } from "./initSdk";

Expand All @@ -20,13 +22,24 @@ describe("Keys", () => {
it("should derive shielded keys from seed", () => {
const { keys, mnemonic } = initSdk();
const seed = mnemonic.toSeed(mnemonic1);
const seed2 = mnemonic.toSeed(mnemonic2);

const { address, viewingKey, spendingKey } =
keys.deriveShieldedFromSeed(seed);

expect(address).toBe(shieldedAccount.paymentAddress);
expect(viewingKey).toBe(shieldedAccount.viewingKey);
expect(spendingKey).toBe(shieldedAccount.spendingKey);
expect(address).toBe(shieldedAccount1.paymentAddress);
expect(viewingKey).toBe(shieldedAccount1.viewingKey);
expect(spendingKey).toBe(shieldedAccount1.spendingKey);

const {
address: address2,
viewingKey: viewingKey2,
spendingKey: spendingKey2,
} = keys.deriveShieldedFromSeed(seed2);

expect(address2).toBe(shieldedAccount2.paymentAddress);
expect(viewingKey2).toBe(shieldedAccount2.viewingKey);
expect(spendingKey2).toBe(shieldedAccount2.spendingKey);
});

it("should derive keys from seed", () => {
Expand Down
6 changes: 2 additions & 4 deletions packages/sdk/src/utils.ts
Original file line number Diff line number Diff line change
Expand Up @@ -31,8 +31,7 @@ export const makeBip44Path = (
/**
* Return a properly formatted Sapling path
* @param coinType - SLIP-044 Coin designation
* @param account - numbered from index
in sequentially increasing manner. Defined as in BIP 44
* @param account - numbered from index in sequentially increasing manner. Defined as in BIP 44
* @returns Sapling path
*/
export const makeSaplingPath = (coinType: number, account: number): string => {
Expand All @@ -42,8 +41,7 @@ export const makeSaplingPath = (coinType: number, account: number): string => {
/**
* Return a properly formatted Sapling path array
* @param coinType - SLIP-044 Coin designation
* @param account - numbered from index
in sequentially increasing manner. Defined as in BIP 44
* @param account - numbered from index in sequentially increasing manner. Defined as in BIP 44
* @returns Sapling path array
*/
export const makeSaplingPathArray = (
Expand Down

1 comment on commit 77f10cd

@github-actions
Copy link

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Please sign in to comment.