123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113 |
- "use strict";
- var __importDefault = (this && this.__importDefault) || function (mod) {
- return (mod && mod.__esModule) ? mod : { "default": mod };
- };
- Object.defineProperty(exports, "__esModule", { value: true });
- exports.keyToRFC1751Mnemonic = exports.rfc1751MnemonicToKey = void 0;
- const rfc1751Words_json_1 = __importDefault(require("./rfc1751Words.json"));
- const rfc1751WordList = rfc1751Words_json_1.default;
- const BINARY = ['0000', '0001', '0010', '0011', '0100', '0101', '0110', '0111',
- '1000', '1001', '1010', '1011', '1100', '1101', '1110', '1111'];
- function keyToBinary(key) {
- let res = '';
- for (const num of key) {
- res += BINARY[num >> 4] + BINARY[num & 0x0f];
- }
- return res;
- }
- function extract(key, start, length) {
- const subKey = key.substring(start, start + length);
- let acc = 0;
- for (let index = 0; index < subKey.length; index++) {
- acc = acc * 2 + subKey.charCodeAt(index) - 48;
- }
- return acc;
- }
- function keyToRFC1751Mnemonic(hex_key) {
- const buf = Buffer.from(hex_key.replace(/\s+/gu, ''), 'hex');
- let key = bufferToArray(swap128(buf));
- const padding = [];
- for (let index = 0; index < (8 - (key.length % 8)) % 8; index++) {
- padding.push(0);
- }
- key = padding.concat(key);
- const english = [];
- for (let index = 0; index < key.length; index += 8) {
- const subKey = key.slice(index, index + 8);
- let skbin = keyToBinary(subKey);
- let parity = 0;
- for (let j = 0; j < 64; j += 2) {
- parity += extract(skbin, j, 2);
- }
- subKey.push((parity << 6) & 0xff);
- skbin = keyToBinary(subKey);
- for (let j = 0; j < 64; j += 11) {
- english.push(rfc1751WordList[extract(skbin, j, 11)]);
- }
- }
- return english.join(' ');
- }
- exports.keyToRFC1751Mnemonic = keyToRFC1751Mnemonic;
- function rfc1751MnemonicToKey(english) {
- const words = english.split(' ');
- let key = [];
- for (let index = 0; index < words.length; index += 6) {
- const { subKey, word } = getSubKey(words, index);
- const skbin = keyToBinary(subKey);
- let parity = 0;
- for (let j = 0; j < 64; j += 2) {
- parity += extract(skbin, j, 2);
- }
- const cs0 = extract(skbin, 64, 2);
- const cs1 = parity & 3;
- if (cs0 !== cs1) {
- throw new Error(`Parity error at ${word}`);
- }
- key = key.concat(subKey.slice(0, 8));
- }
- const bufferKey = swap128(Buffer.from(key));
- return bufferKey;
- }
- exports.rfc1751MnemonicToKey = rfc1751MnemonicToKey;
- function getSubKey(words, index) {
- const sublist = words.slice(index, index + 6);
- let bits = 0;
- const ch = [0, 0, 0, 0, 0, 0, 0, 0, 0];
- let word = '';
- for (word of sublist) {
- const idx = rfc1751WordList.indexOf(word.toUpperCase());
- if (idx === -1) {
- throw new TypeError(`Expected an RFC1751 word, but received '${word}'. ` +
- `For the full list of words in the RFC1751 encoding see https://datatracker.ietf.org/doc/html/rfc1751`);
- }
- const shift = (8 - ((bits + 11) % 8)) % 8;
- const y = idx << shift;
- const cl = y >> 16;
- const cc = (y >> 8) & 0xff;
- const cr = y & 0xff;
- const t = Math.floor(bits / 8);
- if (shift > 5) {
- ch[t] |= cl;
- ch[t + 1] |= cc;
- ch[t + 2] |= cr;
- }
- else if (shift > -3) {
- ch[t] |= cc;
- ch[t + 1] |= cr;
- }
- else {
- ch[t] |= cr;
- }
- bits += 11;
- }
- const subKey = ch.slice();
- return { subKey, word };
- }
- function bufferToArray(buf) {
- return Array.prototype.slice.call(buf);
- }
- function swap128(buf) {
- const reversedBytes = buf.swap64();
- return Buffer.concat([reversedBytes.slice(8, 16), reversedBytes.slice(0, 8)], 16);
- }
- //# sourceMappingURL=rfc1751.js.map
|