UNPKG

1.46 kBJavaScriptView Raw
1import { u8aEq } from '@polkadot/util';
2import { jsonDecryptData } from '@polkadot/util-crypto';
3import { PKCS8_DIVIDER, PKCS8_HEADER, PUB_LENGTH, SEC_LENGTH, SEED_LENGTH } from './defaults.js';
4const SEED_OFFSET = PKCS8_HEADER.length;
5export function decodePair(passphrase, encrypted, _encType) {
6 const encType = Array.isArray(_encType) || _encType === undefined
7 ? _encType
8 : [_encType];
9 const decrypted = jsonDecryptData(encrypted, passphrase, encType);
10 const header = decrypted.subarray(0, PKCS8_HEADER.length);
11 if (!u8aEq(header, PKCS8_HEADER)) {
12 throw new Error('Invalid Pkcs8 header found in body');
13 }
14 let secretKey = decrypted.subarray(SEED_OFFSET, SEED_OFFSET + SEC_LENGTH);
15 let divOffset = SEED_OFFSET + SEC_LENGTH;
16 let divider = decrypted.subarray(divOffset, divOffset + PKCS8_DIVIDER.length);
17 // old-style, we have the seed here
18 if (!u8aEq(divider, PKCS8_DIVIDER)) {
19 divOffset = SEED_OFFSET + SEED_LENGTH;
20 secretKey = decrypted.subarray(SEED_OFFSET, divOffset);
21 divider = decrypted.subarray(divOffset, divOffset + PKCS8_DIVIDER.length);
22 if (!u8aEq(divider, PKCS8_DIVIDER)) {
23 throw new Error('Invalid Pkcs8 divider found in body');
24 }
25 }
26 const pubOffset = divOffset + PKCS8_DIVIDER.length;
27 const publicKey = decrypted.subarray(pubOffset, pubOffset + PUB_LENGTH);
28 return {
29 publicKey,
30 secretKey
31 };
32}