Обновление архитектуры ключей и кошельков

This commit is contained in:
AidarKC
2026-10-01 17:11:38 +03:00
parent f452ce1f1e
commit 8d22602761
51 changed files with 565 additions and 898 deletions
+21 -15
View File
@@ -323,20 +323,26 @@ function toJwkB64(value) {
return base64UrlEncode(bigIntToUnsignedBytes(value));
}
async function deriveArweaveWalletParts(clientKey32) {
if (!(clientKey32 instanceof Uint8Array)) {
throw new Error('SAWD-v1: clientKey32 должен быть Uint8Array');
async function deriveArweaveWalletParts(blockchainKey32) {
if (!(blockchainKey32 instanceof Uint8Array)) {
throw new Error('SAWD-v1: blockchainKey32 должен быть Uint8Array');
}
if (clientKey32.length !== 32) {
throw new Error('SAWD-v1: clientKey32 должен быть ровно 32 байта');
if (blockchainKey32.length !== 32) {
throw new Error('SAWD-v1: blockchainKey32 должен быть ровно 32 байта');
}
const masterSeed32 = await hmacSha256(MASTER_LABEL_UTF8, clientKey32);
const masterSeed32 = await hmacSha256(MASTER_LABEL_UTF8, blockchainKey32);
const masterSeedKey = await importHmacKey(masterSeed32);
const pResult = await derivePrimeWithImportedKey(masterSeedKey, 'p');
let qResult = await derivePrimeWithImportedKey(masterSeedKey, 'q');
while (qResult.prime === pResult.prime) {
// Две 2048-битные простые не гарантируют 4096-битный product: n может иметь
// 4095 бит. До публичного запуска legacy-output не фиксирован, поэтому SAWD-v1
// детерминированно продолжает q-sequence, пока modulus не станет ровно RSA_BITS.
while (
qResult.prime === pResult.prime
|| bitLength(pResult.prime * qResult.prime) !== RSA_BITS
) {
qResult = await derivePrimeWithImportedKey(masterSeedKey, 'q', qResult.index + 1n);
}
@@ -381,8 +387,8 @@ async function deriveArweaveWalletParts(clientKey32) {
};
}
export async function deriveArweaveWalletFromClientKey32(clientKey32) {
const result = await deriveArweaveWalletParts(clientKey32);
export async function deriveArweaveWalletFromBlockchainKey32(blockchainKey32) {
const result = await deriveArweaveWalletParts(blockchainKey32);
return {
derivation: result.derivation,
jwk: result.jwk,
@@ -395,7 +401,7 @@ export async function selfTestSawdV1() {
const invalid = new Uint8Array(31);
let invalidFailed = false;
try {
await deriveArweaveWalletFromClientKey32(invalid);
await deriveArweaveWalletFromBlockchainKey32(invalid);
} catch {
invalidFailed = true;
}
@@ -403,13 +409,13 @@ export async function selfTestSawdV1() {
throw new Error('SAWD-v1 self-test: длина != 32 должна приводить к ошибке');
}
const clientKey = new Uint8Array(32);
for (let i = 0; i < clientKey.length; i += 1) {
clientKey[i] = i + 1;
const blockchainKey = new Uint8Array(32);
for (let i = 0; i < blockchainKey.length; i += 1) {
blockchainKey[i] = i + 1;
}
const first = await deriveArweaveWalletParts(clientKey);
const second = await deriveArweaveWalletParts(clientKey);
const first = await deriveArweaveWalletParts(blockchainKey);
const second = await deriveArweaveWalletParts(blockchainKey);
if (!first.address || !second.address) {
throw new Error('SAWD-v1 self-test: адрес пустой');