PHP WebShell

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

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

'use strict'
let BigInteger = require('bigi')
let ALPHABET = 'qpzry9x8gf2tvdw0s3jn54khce6mua7l'

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

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

    let 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) {
    let chk = new BigInteger('1')
    for (let i = 0; i < prefix.length; ++i) {
        let c = prefix.charCodeAt(i)

        let 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
    let chk = prefixChk(prefix)
    let result = prefix + SEPARATOR
    for (let i = 0; i < words.length; ++i) {
        let 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 (let i = 0; i < CSLEN; ++i) {
        chk = polymodStep(chk)
    }
    chk = chk.xor(new BigInteger('1'))
    for (let i = 0; i < CSLEN; ++i) {
        let pos = 5 * (CSLEN - 1 - i)
        let 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
    let lowered = str.toLowerCase()
    let uppered = str.toUpperCase()
    if (str !== lowered && str !== uppered) {
        throw new Error('Mixed-case string ' + str)
    }

    str = lowered

    let 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)
    }

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

    let chk = prefixChk(prefix)
    let words = []
    for (let i = 0; i < wordChars.length; ++i) {
        let c = wordChars.charAt(i)
        let 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, words }
}

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

    let result = []
    for (let 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, encode, toWords, fromWords }

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


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