项目文件夹

文件
wehub-resource-sync 98e40dac97
CLI Smoke Test / smoke-test-linux (20) (push) Has been cancelled
CLI Smoke Test / smoke-test-linux (24) (push) Has been cancelled
CLI Smoke Test / smoke-test-windows (20) (push) Has been cancelled
CLI Smoke Test / smoke-test-windows (24) (push) Has been cancelled
Expo App TypeScript typecheck / typecheck (push) Has been cancelled
chore: import upstream snapshot with attribution
2026-07-13 12:40:49 +08:00

72 行
3.6 KiB
TypeScript

import { describe, it, expect } from '@/dev/testRunner';
import { deriveKey, deriveSecretKeyTreeRoot, deriveSecretKeyTreeChild } from './deriveKey';
import { encodeUTF8 } from './text';
import { encodeHex } from './hex';
describe('Key Derivation Tests', () => {
// Test vectors
const testVectors = [
{
seed: encodeUTF8('test seed'),
usage: 'test usage',
path: ['child1', 'child2'],
expectedRootKey: 'E6E55652456F9FE47D6FF46CA3614E85B499F77E7B340FBBB1553307CEDC1E74',
expectedRootChainCode: '81ECFD529E8EF95DD5C06CFE169158CF02B7C09A33746C527B4BD4D740B9CC5A',
expectedChildKey: 'D5EAE039FB9143E9433BB1ADC104C2FF5D7FA6751E680B4B1CBC7ADF1AF65BF3',
expectedChildChainCode: '8AA339189BAB38B51DD8770B1498682BCB03E42240E273041ACC7E3DF62FE868',
expectedFinalKey: '1011C097D2105D27362B987A631496BBF68B836124D1D072E9D1613C6028CF75',
expectedFinalChainCode: 'BE98EF894B1C62B8253B480DD415B6EB707028362F2FCECF2CB3871DB8B007F1'
}
];
it('deriveSecretKeyTreeRoot should produce correct root key and chain code', async () => {
for (const vector of testVectors) {
const result = await deriveSecretKeyTreeRoot(vector.seed, vector.usage);
expect(encodeHex(result.key)).toEqual(vector.expectedRootKey);
expect(encodeHex(result.chainCode)).toEqual(vector.expectedRootChainCode);
}
});
it('deriveSecretKeyTreeChild should produce correct child key and chain code', async () => {
for (const vector of testVectors) {
const rootState = await deriveSecretKeyTreeRoot(vector.seed, vector.usage);
const childState = await deriveSecretKeyTreeChild(rootState.chainCode, vector.path[0]);
const childState2 = await deriveSecretKeyTreeChild(childState.chainCode, vector.path[1]);
expect(encodeHex(childState.key)).toEqual(vector.expectedChildKey);
expect(encodeHex(childState.chainCode)).toEqual(vector.expectedChildChainCode);
expect(encodeHex(childState2.key)).toEqual(vector.expectedFinalKey);
expect(encodeHex(childState2.chainCode)).toEqual(vector.expectedFinalChainCode);
}
});
it('deriveKey should produce correct final key for given path', async () => {
for (const vector of testVectors) {
const result = await deriveKey(vector.seed, vector.usage, vector.path);
expect(encodeHex(result)).toEqual(vector.expectedFinalKey);
}
});
it('deriveKey should be deterministic', async () => {
for (const vector of testVectors) {
const result1 = await deriveKey(vector.seed, vector.usage, vector.path);
const result2 = await deriveKey(vector.seed, vector.usage, vector.path);
expect(encodeHex(result1)).toEqual(encodeHex(result2));
}
});
it('deriveKey should produce different keys for different paths', async () => {
for (const vector of testVectors) {
const result1 = await deriveKey(vector.seed, vector.usage, vector.path);
const result2 = await deriveKey(vector.seed, vector.usage, [...vector.path, 'additional']);
expect(encodeHex(result1)).not.toEqual(encodeHex(result2));
}
});
it('deriveKey should produce different keys for different usages', async () => {
for (const vector of testVectors) {
const result1 = await deriveKey(vector.seed, vector.usage, vector.path);
const result2 = await deriveKey(vector.seed, vector.usage + 'different', vector.path);
expect(encodeHex(result1)).not.toEqual(encodeHex(result2));
}
});
});