From 146a77ff415e2e6887affc6405ce8ee6724dcf05 Mon Sep 17 00:00:00 2001 From: Henrique Dias Date: Sun, 31 Dec 2017 12:55:35 +0000 Subject: [PATCH 1/2] updates --- .gitignore | 2 ++ script.js | 10 +++++++ src/base32.js | 75 ++++++++++++++++++++++++++++++++++++++++++++++++ src/constants.js | 5 ++-- src/index.js | 1 + 5 files changed, 91 insertions(+), 2 deletions(-) create mode 100644 script.js create mode 100644 src/base32.js diff --git a/.gitignore b/.gitignore index ff1fec8..8127d8a 100644 --- a/.gitignore +++ b/.gitignore @@ -30,6 +30,8 @@ build # Dependency directory # https://www.npmjs.org/doc/misc/npm-faq.html#should-i-check-my-node_modules-folder-into-git node_modules +yarn.lock +package-lock.json dist docs diff --git a/script.js b/script.js new file mode 100644 index 0000000..31c5329 --- /dev/null +++ b/script.js @@ -0,0 +1,10 @@ +const multibase = require('.') +const raw = new Buffer('1220120f6af601d46e10b2d2e11ed71c55d25f3042c22501e41d1246e7a1e9d3d8ec', 'hex') + +const encoded = multibase.encode('base32', raw) + +console.log(encoded.toString()) + +const decoded = multibase.decode(encoded) + +console.log(decoded.toString('hex')) \ No newline at end of file diff --git a/src/base32.js b/src/base32.js new file mode 100644 index 0000000..962bb56 --- /dev/null +++ b/src/base32.js @@ -0,0 +1,75 @@ +function readChar (alphabet, char) { + var idx = alphabet.indexOf(char) + + if (idx === -1) { + throw new Error('Invalid character found: ' + char) + } + + return idx +} + +function decode (input, alphabet) { + var length = input.length + + var bits = 0 + var value = 0 + + var index = 0 + var output = new Uint8Array((length * 5 / 8) | 0) + + for (var i = 0; i < length; i++) { + value = (value << 5) | readChar(alphabet, input[i]) + bits += 5 + + if (bits >= 8) { + output[index++] = (value >>> (bits - 8)) & 255 + bits -= 8 + } + } + + return output.buffer +} + +function encode (buffer, alphabet) { + var length = buffer.byteLength + var view = new Uint8Array(buffer) + + var bits = 0 + var value = 0 + var output = '' + + for (var i = 0; i < length; i++) { + value = (value << 8) | view[i] + bits += 8 + + while (bits >= 5) { + output += alphabet[(value >>> (bits - 5)) & 31] + bits -= 5 + } + } + + if (bits > 0) { + output += alphabet[(value << (5 - bits)) & 31] + } + + return output +} + +module.exports = function base32 (alphabet) { + return { + encode (input) { + if (typeof input === 'string') { + return encode(new Buffer(input), alphabet) + } + return encode(input, alphabet) + }, + decode (input) { + for (let char of input) { + if (alphabet.indexOf(char) < 0) { + throw new Error('invalid base32 character') + } + } + return decode(input, alphabet) + } + } +} \ No newline at end of file diff --git a/src/constants.js b/src/constants.js index 2f5509c..91fbcc3 100644 --- a/src/constants.js +++ b/src/constants.js @@ -3,6 +3,7 @@ const Base = require('./base.js') const baseX = require('base-x') const base16 = require('./base16') +const base32 = require('./base32') // name, code, implementation, alphabet const constants = [ @@ -11,8 +12,8 @@ const constants = [ ['base8', '7', baseX, '01234567'], ['base10', '9', baseX, '0123456789'], ['base16', 'f', base16, '0123456789abcdef'], - ['base32hex', 'v', baseX, '0123456789abcdefghijklmnopqrstuv'], - ['base32', 'b', baseX, 'abcdefghijklmnopqrstuvwxyz234567'], + ['base32hex', 'v', base32, '0123456789abcdefghijklmnopqrstuv'], + ['base32', 'b', base32, 'abcdefghijklmnopqrstuvwxyz234567'], ['base32z', 'h', baseX, 'ybndrfg8ejkmcpqxot1uwisza345h769'], ['base58flickr', 'Z', baseX, '123456789abcdefghijkmnopqrstuvwxyzABCDEFGHJKLMNPQRSTUVWXYZ'], ['base58btc', 'z', baseX, '123456789ABCDEFGHJKLMNPQRSTUVWXYZabcdefghijkmnopqrstuvwxyz'], diff --git a/src/index.js b/src/index.js index d43f330..43fee2d 100644 --- a/src/index.js +++ b/src/index.js @@ -132,5 +132,6 @@ function getBase (nameOrCode) { throw new Error('Base ' + nameOrCode + ' is not implemented yet') } + return base } From 39a73d5fe6b790b843c875179bcbcaf4e15260b7 Mon Sep 17 00:00:00 2001 From: Henrique Dias Date: Sun, 31 Dec 2017 13:15:41 +0000 Subject: [PATCH 2/2] fix linting --- script.js | 10 ---------- src/base32.js | 32 +++++++++++++++++--------------- src/constants.js | 2 +- src/index.js | 1 - test/multibase.spec.js | 17 ++++++++++++++++- 5 files changed, 34 insertions(+), 28 deletions(-) delete mode 100644 script.js diff --git a/script.js b/script.js deleted file mode 100644 index 31c5329..0000000 --- a/script.js +++ /dev/null @@ -1,10 +0,0 @@ -const multibase = require('.') -const raw = new Buffer('1220120f6af601d46e10b2d2e11ed71c55d25f3042c22501e41d1246e7a1e9d3d8ec', 'hex') - -const encoded = multibase.encode('base32', raw) - -console.log(encoded.toString()) - -const decoded = multibase.decode(encoded) - -console.log(decoded.toString('hex')) \ No newline at end of file diff --git a/src/base32.js b/src/base32.js index 962bb56..626ee0a 100644 --- a/src/base32.js +++ b/src/base32.js @@ -1,23 +1,25 @@ +'use strict' + function readChar (alphabet, char) { - var idx = alphabet.indexOf(char) + let idx = alphabet.indexOf(char) if (idx === -1) { - throw new Error('Invalid character found: ' + char) + throw new Error('invalid character found: ' + char) } return idx } function decode (input, alphabet) { - var length = input.length + let length = input.length - var bits = 0 - var value = 0 + let bits = 0 + let value = 0 - var index = 0 - var output = new Uint8Array((length * 5 / 8) | 0) + let index = 0 + let output = new Uint8Array((length * 5 / 8) | 0) - for (var i = 0; i < length; i++) { + for (let i = 0; i < length; i++) { value = (value << 5) | readChar(alphabet, input[i]) bits += 5 @@ -31,14 +33,14 @@ function decode (input, alphabet) { } function encode (buffer, alphabet) { - var length = buffer.byteLength - var view = new Uint8Array(buffer) + let length = buffer.byteLength + let view = new Uint8Array(buffer) - var bits = 0 - var value = 0 - var output = '' + let bits = 0 + let value = 0 + let output = '' - for (var i = 0; i < length; i++) { + for (let i = 0; i < length; i++) { value = (value << 8) | view[i] bits += 8 @@ -72,4 +74,4 @@ module.exports = function base32 (alphabet) { return decode(input, alphabet) } } -} \ No newline at end of file +} diff --git a/src/constants.js b/src/constants.js index 91fbcc3..bd9aeeb 100644 --- a/src/constants.js +++ b/src/constants.js @@ -14,7 +14,7 @@ const constants = [ ['base16', 'f', base16, '0123456789abcdef'], ['base32hex', 'v', base32, '0123456789abcdefghijklmnopqrstuv'], ['base32', 'b', base32, 'abcdefghijklmnopqrstuvwxyz234567'], - ['base32z', 'h', baseX, 'ybndrfg8ejkmcpqxot1uwisza345h769'], + ['base32z', 'h', base32, 'ybndrfg8ejkmcpqxot1uwisza345h769'], ['base58flickr', 'Z', baseX, '123456789abcdefghijkmnopqrstuvwxyzABCDEFGHJKLMNPQRSTUVWXYZ'], ['base58btc', 'z', baseX, '123456789ABCDEFGHJKLMNPQRSTUVWXYZabcdefghijkmnopqrstuvwxyz'], ['base64', 'm', baseX, 'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/'], diff --git a/src/index.js b/src/index.js index 43fee2d..d43f330 100644 --- a/src/index.js +++ b/src/index.js @@ -132,6 +132,5 @@ function getBase (nameOrCode) { throw new Error('Base ' + nameOrCode + ' is not implemented yet') } - return base } diff --git a/test/multibase.spec.js b/test/multibase.spec.js index 58fb0da..4713475 100644 --- a/test/multibase.spec.js +++ b/test/multibase.spec.js @@ -19,8 +19,23 @@ const supportedBases = [ ['base16', 'yes mani !', 'f796573206d616e692021'], ['base16', new Buffer([0x01]), 'f01'], ['base16', new Buffer([15]), 'f0f'], - ['base32hex', 'yes mani !', 'vf5in683dc5n6i811'], + ['base32', 'yes mani !', 'bpfsxgidnmfxgsibb'], + ['base32', 'f', 'bmy'], + ['base32', 'fo', 'bmzxq'], + ['base32', 'foo', 'bmzxw6'], + ['base32', 'foob', 'bmzxw6yq'], + ['base32', 'fooba', 'bmzxw6ytb'], + ['base32', 'foobar', 'bmzxw6ytboi'], + + ['base32hex', 'yes mani !', 'vf5in683dc5n6i811'], + ['base32hex', 'f', 'vco'], + ['base32hex', 'fo', 'vcpng'], + ['base32hex', 'foo', 'vcpnmu'], + ['base32hex', 'foob', 'vcpnmuog'], + ['base32hex', 'fooba', 'vcpnmuoj1'], + ['base32hex', 'foobar', 'vcpnmuoj1e8'], + ['base32z', 'yes mani !', 'hxf1zgedpcfzg1ebb'], ['base58flickr', 'yes mani !', 'Z7Pznk19XTTzBtx'], ['base58btc', 'yes mani !', 'z7paNL19xttacUY'],