1 | import { u8aEq } from '@polkadot/util';
|
2 | import { jsonDecryptData } from '@polkadot/util-crypto';
|
3 | import { PKCS8_DIVIDER, PKCS8_HEADER, PUB_LENGTH, SEC_LENGTH, SEED_LENGTH } from './defaults.js';
|
4 | const SEED_OFFSET = PKCS8_HEADER.length;
|
5 | export 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 |
|
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 | }
|