PHP WebShell

Текущая директория: /usr/lib/node_modules/bitgo/node_modules/cashaddress/lib

Просмотр файла: base32.js

'use strict';

var BigInteger = require('bigi');
var ALPHABET = 'qpzry9x8gf2tvdw0s3jn54khce6mua7l';

// pre-compute lookup table
var SEPARATOR = ':';
var CSLEN = 8;
var ALPHABET_MAP = {};
for (var z = 0; z < ALPHABET.length; z++) {
    var x = ALPHABET.charAt(z);
    if (ALPHABET_MAP[x] !== undefined) {
        throw new TypeError(x + ' is ambiguous');
    }
    ALPHABET_MAP[x] = z;
}

function polymodStep(pre) {
    var b = pre.shiftRight(35);
    var mask = BigInteger.fromHex('07ffffffff');

    var v = pre.and(mask).shiftLeft(new BigInteger('5'));

    if (b.and(new BigInteger('1')).intValue() > 0) {
        v = v.xor(BigInteger.fromHex('98f2bc8e61'));
    }
    if (b.and(new BigInteger('2')).intValue()) {
        v = v.xor(BigInteger.fromHex('79b76d99e2'));
    }
    if (b.and(new BigInteger('4')).intValue()) {
        v = v.xor(BigInteger.fromHex('f33e5fb3c4'));
    }
    if (b.and(new BigInteger('8')).intValue()) {
        v = v.xor(BigInteger.fromHex('ae2eabe2a8'));
    }
    if (b.and(new BigInteger('16')).intValue()) {
        v = v.xor(BigInteger.fromHex('1e4f43e470'));
    }

    return v;
}

function prefixChk(prefix) {
    var chk = new BigInteger('1');
    for (var i = 0; i < prefix.length; ++i) {
        var c = prefix.charCodeAt(i);

        var mixwith = new BigInteger('' + (c & 0x1f));
        chk = polymodStep(chk).xor(mixwith);
    }

    chk = polymodStep(chk);
    return chk;
}

function encode(prefix, words) {
    // too long?
    if (prefix.length + CSLEN + 1 + words.length > 90) {
        throw new TypeError('Exceeds Base32 maximum length');
    }

    prefix = prefix.toLowerCase();

    // determine chk mod
    var chk = prefixChk(prefix);
    var result = prefix + SEPARATOR;
    for (var i = 0; i < words.length; ++i) {
        var _x = words[i];
        if (_x >>> 5 !== 0) {
            throw new Error('Non 5-bit word');
        }

        chk = polymodStep(chk).xor(new BigInteger('' + _x));
        result += ALPHABET.charAt(_x);
    }

    for (var _i = 0; _i < CSLEN; ++_i) {
        chk = polymodStep(chk);
    }
    chk = chk.xor(new BigInteger('1'));
    for (var _i2 = 0; _i2 < CSLEN; ++_i2) {
        var pos = 5 * (CSLEN - 1 - _i2);
        var v2 = chk.shiftRight(new BigInteger('' + pos)).and(BigInteger.fromHex('1f'));
        result += ALPHABET.charAt(v2.toString(10));
    }

    return result;
}

function decode(str) {
    if (str.length < 8) {
        throw new TypeError(str + ' too short');
    }
    if (str.length > 90) {
        throw new TypeError(str + ' too long');
    }

    // don't allow mixed case
    var lowered = str.toLowerCase();
    var uppered = str.toUpperCase();
    if (str !== lowered && str !== uppered) {
        throw new Error('Mixed-case string ' + str);
    }

    str = lowered;

    var split = str.lastIndexOf(SEPARATOR);
    if (split === -1) {
        throw new Error('No separator character for ' + str);
    }

    if (split === 0) {
        throw new Error('Missing prefix for ' + str);
    }

    var prefix = str.slice(0, split);
    var wordChars = str.slice(split + 1);
    if (wordChars.length < 6) {
        throw new Error('Data too short');
    }

    var chk = prefixChk(prefix);
    var words = [];
    for (var i = 0; i < wordChars.length; ++i) {
        var c = wordChars.charAt(i);
        var v = ALPHABET_MAP[c];
        if (v === undefined) {
            throw new Error('Unknown character ' + c);
        }

        chk = polymodStep(chk).xor(new BigInteger('' + v));
        // not in the checksum?
        if (i + CSLEN >= wordChars.length) {
            continue;
        }
        words.push(v);
    }

    if (chk.toString(10) !== '1') {
        throw new Error('Invalid checksum for ' + str);
    }

    return { prefix: prefix, words: words };
}

function convert(data, inBits, outBits, pad) {
    var value = 0;
    var bits = 0;
    var maxV = (1 << outBits) - 1;

    var result = [];
    for (var i = 0; i < data.length; ++i) {
        value = value << inBits | data[i];
        bits += inBits;

        while (bits >= outBits) {
            bits -= outBits;
            result.push(value >>> bits & maxV);
        }
    }

    if (pad) {
        if (bits > 0) {
            result.push(value << outBits - bits & maxV);
        }
    } else {
        if (bits >= inBits) {
            throw new Error('Excess padding');
        }
        if (value << outBits - bits & maxV) {
            throw new Error('Non-zero padding');
        }
    }

    return result;
}

function toWords(bytes) {
    return convert(bytes, 8, 5, true);
}

function fromWords(words) {
    return convert(words, 5, 8, false);
}

module.exports = { decode: decode, encode: encode, toWords: toWords, fromWords: fromWords };

Выполнить команду


Для локальной разработки. Не используйте в интернете!