From 1a594fb6946a253871a67b2e8d6ef73e39508384 Mon Sep 17 00:00:00 2001 From: emmanuelm41 Date: Mon, 20 Jan 2025 16:11:56 -0300 Subject: [PATCH] feat: add parent fingerprint value --- app/src/coin.h | 1 + app/src/crypto.c | 10 +++++++++- js | 2 +- tests_zemu/tests/addresses.test.ts | 26 ++++++++++++++++++-------- 4 files changed, 29 insertions(+), 10 deletions(-) diff --git a/app/src/coin.h b/app/src/coin.h index 28d5cb9..cf6a0ac 100644 --- a/app/src/coin.h +++ b/app/src/coin.h @@ -48,6 +48,7 @@ extern "C" { // data for extended public key #define CHAIN_CODE_LEN_SECP256K1 32u #define VERSION_LEN 4u +#define PARENT_FINGERPRINT_LEN 4u #define INDEX_LEN 4u #define DEPTH_LEN 1u diff --git a/app/src/crypto.c b/app/src/crypto.c index 1d672a5..63afc3c 100644 --- a/app/src/crypto.c +++ b/app/src/crypto.c @@ -72,6 +72,7 @@ typedef struct { typedef struct { uint32_t version; uint8_t depth; + uint32_t parentFingerprint; uint32_t index; uint8_t chainCode[CHAIN_CODE_LEN_SECP256K1]; uint8_t publicKey[PK_LEN_SECP256K1]; @@ -230,6 +231,13 @@ zxerr_t crypto_fillAddress_extended_secp256k1(uint8_t *buffer, uint16_t buffer_l ); io_seproxyhal_io_heartbeat(); + // FIXME this needs to be calculated over the pk calculated for the previous level (parent pk), instead of the current level (current pk) + uint8_t sha256_pk[CX_SHA256_SIZE] = {0}; + uint8_t ripe_sha256_pk[CX_RIPEMD160_SIZE] = {0}; + cx_hash_sha256(answer->publicKey, PK_LEN_SECP256K1, sha256_pk, CX_SHA256_SIZE); // SHA256 + CHECK_ZXERR(ripemd160(sha256_pk, CX_SHA256_SIZE, ripe_sha256_pk)); // RIPEMD-160 + + memcpy(&answer->parentFingerprint, ripe_sha256_pk, PARENT_FINGERPRINT_LEN); answer->depth = hdPath.len; answer->index = hdPath.secp256k1_path[hdPath.len - 1]; @@ -239,7 +247,7 @@ zxerr_t crypto_fillAddress_extended_secp256k1(uint8_t *buffer, uint16_t buffer_l answer->version = PK_VERSION_TESTNET; } - *replyLen = PK_LEN_SECP256K1 + CHAIN_CODE_LEN_SECP256K1 + DEPTH_LEN + INDEX_LEN + VERSION_LEN; + *replyLen = PK_LEN_SECP256K1 + CHAIN_CODE_LEN_SECP256K1 + DEPTH_LEN + INDEX_LEN + VERSION_LEN + PARENT_FINGERPRINT_LEN; return zxerr_ok; } diff --git a/js b/js index e709a82..40d5420 160000 --- a/js +++ b/js @@ -1 +1 @@ -Subproject commit e709a82596b6e86085187d034a584b5064ef2fd8 +Subproject commit 40d5420c78d6112d612ef630c52e2b08f7d8c53a diff --git a/tests_zemu/tests/addresses.test.ts b/tests_zemu/tests/addresses.test.ts index 2638d78..72128d6 100644 --- a/tests_zemu/tests/addresses.test.ts +++ b/tests_zemu/tests/addresses.test.ts @@ -51,16 +51,21 @@ describe('Addresses', function () { const app = new ZCashApp(sim.getTransport()) const expectedPk = '0378e0db93ebe9b03fb04f08931038822b75db3a6089f54443b4e8ca1865811b79' const expectedChainCode = 'd293abfd48452b107be8a5895c721addca628c0ae36353bac34d13a1d8c5e73e' - const expectedExtendedPk = '2JcqaJaGEDfcv3TLvsnVL3tcM47pQ3nN24B7tVGcUEhPqaawqCrCtvvwWcgT7ExDmK2eGDtoikKsrqkwXpVjw77c4SaJyxBqrJm3W' + const expectedIndex = 0x80000000 + 5 + const expectedDepth = 3 + const expectedVersion = 0x0488B21E + const expectedFingerprint = "f4abeb80" + const expectedExtendedPk = '9XpNiCCC7BPCmQdqhAWdTVZJpNsDQUfxnnXDYpnqFgtyPxB4mBsMjp12a1s4SUM9qjSc9jn1W5btMvGPQYgPHBasdp2jJYdQkS3K8xQx4g' const addr = await app.getAddressTransparentExtended(`m/44'/133'/5'`, false) console.log(addr) - expect(addr?.version).toEqual(0x0488B21E) + expect(addr?.version).toEqual(expectedVersion) + expect(addr?.parentFingerprint.toString("hex")).toEqual(expectedFingerprint) expect(addr?.chainCode.toString('hex')).toEqual(expectedChainCode) expect(addr?.publicKey.toString('hex')).toEqual(expectedPk) - expect(addr?.index).toEqual(0x80000000 + 5) - expect(addr?.depth).toEqual(3) + expect(addr?.index).toEqual(expectedIndex) + expect(addr?.depth).toEqual(expectedDepth) expect(addr?.extendedPk).toEqual(expectedExtendedPk) } finally { await sim.close() @@ -105,7 +110,11 @@ describe('Addresses', function () { const app = new ZCashApp(sim.getTransport()) const expectedPk = '0378e0db93ebe9b03fb04f08931038822b75db3a6089f54443b4e8ca1865811b79' const expectedChainCode = 'd293abfd48452b107be8a5895c721addca628c0ae36353bac34d13a1d8c5e73e' - const expectedExtendedPk = '2JcqaJaGEDfcv3TLvsnVL3tcM47pQ3nN24B7tVGcUEhPqaawqCrCtvvwWcgT7ExDmK2eGDtoikKsrqkwXpVjw77c4SaJyxBqrJm3W' + const expectedIndex = 0x80000000 + 5 + const expectedDepth = 3 + const expectedVersion = 0x0488B21E + const expectedFingerprint = "f4abeb80" + const expectedExtendedPk = '9XpNiCCC7BPCmQdqhAWdTVZJpNsDQUfxnnXDYpnqFgtyPxB4mBsMjp12a1s4SUM9qjSc9jn1W5btMvGPQYgPHBasdp2jJYdQkS3K8xQx4g' const addrReq = app.getAddressTransparentExtended(`m/44'/133'/5'`, true) await sim.waitUntilScreenIsNot(sim.getMainMenuSnapshot()) @@ -113,11 +122,12 @@ describe('Addresses', function () { const addr = await addrReq - expect(addr?.version).toEqual(0x0488B21E) + expect(addr?.version).toEqual(expectedVersion) + expect(addr?.parentFingerprint.toString("hex")).toEqual(expectedFingerprint) expect(addr?.chainCode.toString('hex')).toEqual(expectedChainCode) expect(addr?.publicKey.toString('hex')).toEqual(expectedPk) - expect(addr?.index).toEqual(0x80000000 + 5) - expect(addr?.depth).toEqual(3) + expect(addr?.index).toEqual(expectedIndex) + expect(addr?.depth).toEqual(expectedDepth) expect(addr?.extendedPk).toEqual(expectedExtendedPk) } finally { await sim.close()