Browse Source

Merges Buffer refactorings from base58-native by Stephen Pair

hk-custom-address
Daniel Cousens 11 years ago
parent
commit
fb6c76a976
  1. 87
      src/base58.js

87
src/base58.js

@ -2,78 +2,65 @@
// Originally written by Mike Hearn for BitcoinJ // Originally written by Mike Hearn for BitcoinJ
// Copyright (c) 2011 Google Inc // Copyright (c) 2011 Google Inc
// Ported to JavaScript by Stefan Thomas // Ported to JavaScript by Stefan Thomas
// Merged Buffer refactorings from base58-native by Stephen Pair
// Copyright (c) 2013 BitPay Inc
var BigInteger = require('./jsbn/jsbn') var BigInteger = require('./jsbn/jsbn')
// FIXME: ? This is a Base58Check alphabet var ALPHABET = '123456789ABCDEFGHJKLMNPQRSTUVWXYZabcdefghijkmnopqrstuvwxyz'
var alphabet = "123456789ABCDEFGHJKLMNPQRSTUVWXYZabcdefghijkmnopqrstuvwxyz" var ALPHABET_BUF = new Buffer(ALPHABET, 'ascii')
var base = BigInteger.valueOf(58) var ALPHABET_MAP = {}
for(var i = 0; i < ALPHABET.length; i++) {
var alphabetMap = {} ALPHABET_MAP[ALPHABET[i]] = BigInteger.valueOf(i)
for (var i=0; i<alphabet.length; ++i) {
var chr = alphabet[i]
alphabetMap[chr] = BigInteger.valueOf(i)
} }
var BASE = BigInteger.valueOf(58)
// encode a byte array into a base58 encoded String
// @return String
function encode(buffer) { function encode(buffer) {
var bi = BigInteger.fromByteArrayUnsigned(buffer) var bi = BigInteger.fromByteArrayUnsigned(buffer)
var chars = [] var result = new Buffer(buffer.length << 1)
while (bi.compareTo(base) >= 0) { var i = result.length - 1
var mod = bi.mod(base) while (bi.compareTo(BigInteger.ZERO) > 0) {
bi = bi.subtract(mod).divide(base) var remainder = bi.mod(BASE)
bi = bi.divide(BASE)
chars.push(alphabet[mod.intValue()]) result[i] = ALPHABET_BUF[remainder.intValue()]
i--
} }
chars.push(alphabet[bi.intValue()]) // deal with leading zeros
var j = 0
// Convert leading zeros too. while (buffer[j] === 0) {
for (var i=0; i<buffer.length; i++) { result[i] = ALPHABET_BUF[0]
if (buffer[i] !== 0x00) break j++
i--
chars.push(alphabet[0])
} }
return chars.reverse().join('') return result.slice(i + 1, result.length).toString('ascii')
} }
// decode a base58 encoded String into a byte array function decode(string) {
// @return Array if (string.length === 0) return new Buffer(0)
function decode(str) {
var num = BigInteger.valueOf(0)
var leading_zero = 0
var seen_other = false
for (var i=0; i<str.length; ++i) { var num = BigInteger.ZERO.clone()
var chr = str[i]
var bi = alphabetMap[chr]
// if we encounter an invalid character, decoding fails for (var i = 0; i < string.length; i++) {
if (bi === undefined) { num = num.multiply(BASE)
throw new Error('invalid base58 string: ' + str) num = num.add(ALPHABET_MAP[string.charAt(i)])
} }
num = num.multiply(base).add(bi) // deal with leading zeros
var i = 0
if (chr === '1' && !seen_other) { while ((i < string.length) && (string[i] === ALPHABET[0])) {
++leading_zero i++
} else {
seen_other = true
}
} }
var bytes = num.toByteArrayUnsigned() // FIXME: If BigInteger supported buffers, this could be a copy
var buffer = new Buffer(num.toByteArrayUnsigned())
// remove leading zeros var padding = new Buffer(i)
while (leading_zero-- > 0) { padding.fill(0)
bytes.unshift(0)
}
return new Buffer(bytes) return Buffer.concat([padding, buffer])
} }
module.exports = { module.exports = {

Loading…
Cancel
Save