SHA256
Обновление архитектуры ключей и кошельков
This commit is contained in:
@@ -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: адрес пустой');
|
||||
|
||||
Reference in New Issue
Block a user