UNPKG

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