use package thirty-two
for base32 encoding/decoding
This commit is contained in:
parent
85b2e89fe7
commit
9f68f20826
216
lib/external/nibbler.js
vendored
216
lib/external/nibbler.js
vendored
@ -1,216 +0,0 @@
|
|||||||
/*
|
|
||||||
Copyright (c) 2010 Thomas Peri
|
|
||||||
http://www.tumuski.com/
|
|
||||||
|
|
||||||
Permission is hereby granted, free of charge, to any person obtaining a
|
|
||||||
copy of this software and associated documentation files (the
|
|
||||||
"Software"), to deal in the Software without restriction, including
|
|
||||||
without limitation the rights to use, copy, modify, merge, publish,
|
|
||||||
distribute, sublicense, and/or sell copies of the Software, and to
|
|
||||||
permit persons to whom the Software is furnished to do so, subject to
|
|
||||||
the following conditions:
|
|
||||||
|
|
||||||
The above copyright notice and this permission notice shall be included
|
|
||||||
in all copies or substantial portions of the Software.
|
|
||||||
|
|
||||||
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS
|
|
||||||
OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
|
|
||||||
MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.
|
|
||||||
IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY
|
|
||||||
CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT,
|
|
||||||
TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE
|
|
||||||
SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
|
|
||||||
*/
|
|
||||||
|
|
||||||
/*jslint white: true, browser: true, onevar: true, undef: true, nomen: true,
|
|
||||||
eqeqeq: true, plusplus: true, regexp: true, newcap: true, immed: true */
|
|
||||||
// (good parts minus bitwise and strict, plus white.)
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Nibbler - Multi-Base Encoder
|
|
||||||
*
|
|
||||||
* version 2010-04-07
|
|
||||||
*
|
|
||||||
* Options:
|
|
||||||
* dataBits: The number of bits in each character of unencoded data.
|
|
||||||
* codeBits: The number of bits in each character of encoded data.
|
|
||||||
* keyString: The characters that correspond to each value when encoded.
|
|
||||||
* pad (optional): The character to pad the end of encoded output.
|
|
||||||
* arrayData (optional): If truthy, unencoded data is an array instead of a string.
|
|
||||||
*
|
|
||||||
* Example:
|
|
||||||
*
|
|
||||||
* var base64_8bit = new Nibbler({
|
|
||||||
* dataBits: 8,
|
|
||||||
* codeBits: 6,
|
|
||||||
* keyString: 'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/',
|
|
||||||
* pad: '='
|
|
||||||
* });
|
|
||||||
* base64_8bit.encode("Hello, World!"); // returns "SGVsbG8sIFdvcmxkIQ=="
|
|
||||||
* base64_8bit.decode("SGVsbG8sIFdvcmxkIQ=="); // returns "Hello, World!"
|
|
||||||
*
|
|
||||||
* var base64_7bit = new Nibbler({
|
|
||||||
* dataBits: 7,
|
|
||||||
* codeBits: 6,
|
|
||||||
* keyString: 'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/',
|
|
||||||
* pad: '='
|
|
||||||
* });
|
|
||||||
* base64_7bit.encode("Hello, World!"); // returns "kZdmzesQV9/LZkQg=="
|
|
||||||
* base64_7bit.decode("kZdmzesQV9/LZkQg=="); // returns "Hello, World!"
|
|
||||||
*
|
|
||||||
*/
|
|
||||||
var Nibbler = function (options) {
|
|
||||||
var construct,
|
|
||||||
|
|
||||||
// options
|
|
||||||
pad, dataBits, codeBits, keyString, arrayData,
|
|
||||||
|
|
||||||
// private instance variables
|
|
||||||
mask, group, max,
|
|
||||||
|
|
||||||
// private methods
|
|
||||||
gcd, translate,
|
|
||||||
|
|
||||||
// public methods
|
|
||||||
encode, decode;
|
|
||||||
|
|
||||||
// pseudo-constructor
|
|
||||||
construct = function () {
|
|
||||||
var i, mag, prev;
|
|
||||||
|
|
||||||
// options
|
|
||||||
pad = options.pad || '';
|
|
||||||
dataBits = options.dataBits;
|
|
||||||
codeBits = options.codeBits;
|
|
||||||
keyString = options.keyString;
|
|
||||||
arrayData = options.arrayData;
|
|
||||||
|
|
||||||
// bitmasks
|
|
||||||
mag = Math.max(dataBits, codeBits);
|
|
||||||
prev = 0;
|
|
||||||
mask = [];
|
|
||||||
for (i = 0; i < mag; i += 1) {
|
|
||||||
mask.push(prev);
|
|
||||||
prev += prev + 1;
|
|
||||||
}
|
|
||||||
max = prev;
|
|
||||||
|
|
||||||
// ouput code characters in multiples of this number
|
|
||||||
group = dataBits / gcd(dataBits, codeBits);
|
|
||||||
};
|
|
||||||
|
|
||||||
// greatest common divisor
|
|
||||||
gcd = function (a, b) {
|
|
||||||
var t;
|
|
||||||
while (b !== 0) {
|
|
||||||
t = b;
|
|
||||||
b = a % b;
|
|
||||||
a = t;
|
|
||||||
}
|
|
||||||
return a;
|
|
||||||
};
|
|
||||||
|
|
||||||
// the re-coder
|
|
||||||
translate = function (input, bitsIn, bitsOut, decoding) {
|
|
||||||
var i, len, chr, byteIn,
|
|
||||||
buffer, size, output,
|
|
||||||
write;
|
|
||||||
|
|
||||||
// append a byte to the output
|
|
||||||
write = function (n) {
|
|
||||||
if (!decoding) {
|
|
||||||
output.push(keyString.charAt(n));
|
|
||||||
} else if (arrayData) {
|
|
||||||
output.push(n);
|
|
||||||
} else {
|
|
||||||
output.push(String.fromCharCode(n));
|
|
||||||
}
|
|
||||||
};
|
|
||||||
|
|
||||||
buffer = 0;
|
|
||||||
size = 0;
|
|
||||||
output = [];
|
|
||||||
|
|
||||||
len = input.length;
|
|
||||||
for (i = 0; i < len; i += 1) {
|
|
||||||
// the new size the buffer will be after adding these bits
|
|
||||||
size += bitsIn;
|
|
||||||
|
|
||||||
// read a character
|
|
||||||
if (decoding) {
|
|
||||||
// decode it
|
|
||||||
chr = input.charAt(i);
|
|
||||||
byteIn = keyString.indexOf(chr);
|
|
||||||
if (chr === pad) {
|
|
||||||
break;
|
|
||||||
} else if (byteIn < 0) {
|
|
||||||
throw 'the character "' + chr + '" is not a member of ' + keyString;
|
|
||||||
}
|
|
||||||
} else {
|
|
||||||
if (arrayData) {
|
|
||||||
byteIn = input[i];
|
|
||||||
} else {
|
|
||||||
byteIn = input.charCodeAt(i);
|
|
||||||
}
|
|
||||||
if ((byteIn | max) !== max) {
|
|
||||||
throw byteIn + " is outside the range 0-" + max;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
// shift the buffer to the left and add the new bits
|
|
||||||
buffer = (buffer << bitsIn) | byteIn;
|
|
||||||
|
|
||||||
// as long as there's enough in the buffer for another output...
|
|
||||||
while (size >= bitsOut) {
|
|
||||||
// the new size the buffer will be after an output
|
|
||||||
size -= bitsOut;
|
|
||||||
|
|
||||||
// output the part that lies to the left of that number of bits
|
|
||||||
// by shifting the them to the right
|
|
||||||
write(buffer >> size);
|
|
||||||
|
|
||||||
// remove the bits we wrote from the buffer
|
|
||||||
// by applying a mask with the new size
|
|
||||||
buffer &= mask[size];
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
// If we're encoding and there's input left over, pad the output.
|
|
||||||
// Otherwise, leave the extra bits off, 'cause they themselves are padding
|
|
||||||
if (!decoding && size > 0) {
|
|
||||||
|
|
||||||
// flush the buffer
|
|
||||||
write(buffer << (bitsOut - size));
|
|
||||||
|
|
||||||
// add padding keyString for the remainder of the group
|
|
||||||
len = output.length % group;
|
|
||||||
for (i = 0; i < len; i += 1) {
|
|
||||||
output.push(pad);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
// string!
|
|
||||||
return (arrayData && decoding) ? output : output.join('');
|
|
||||||
};
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Encode. Input and output are strings.
|
|
||||||
*/
|
|
||||||
encode = function (input) {
|
|
||||||
return translate(input, dataBits, codeBits, false);
|
|
||||||
};
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Decode. Input and output are strings.
|
|
||||||
*/
|
|
||||||
decode = function (input) {
|
|
||||||
return translate(input, codeBits, dataBits, true);
|
|
||||||
};
|
|
||||||
|
|
||||||
this.encode = encode;
|
|
||||||
this.decode = decode;
|
|
||||||
construct();
|
|
||||||
};
|
|
||||||
|
|
||||||
// For nodejs
|
|
||||||
module.exports = Nibbler;
|
|
21
lib/notp.js
21
lib/notp.js
@ -1,9 +1,6 @@
|
|||||||
|
|
||||||
/*
|
var crypto = require('crypto');
|
||||||
* Requires
|
var base32 = require('thirty-two');
|
||||||
*/
|
|
||||||
var crypto = require('crypto'),
|
|
||||||
base32 = require('./external/nibbler');
|
|
||||||
|
|
||||||
|
|
||||||
/*
|
/*
|
||||||
@ -11,21 +8,7 @@ var crypto = require('crypto'),
|
|||||||
*/
|
*/
|
||||||
module.exports = new Notp();
|
module.exports = new Notp();
|
||||||
|
|
||||||
|
|
||||||
/*
|
|
||||||
* Constructor function.
|
|
||||||
*
|
|
||||||
* Builds th base32 object
|
|
||||||
*/
|
|
||||||
function Notp() {
|
function Notp() {
|
||||||
base32 = new base32(
|
|
||||||
{
|
|
||||||
dataBits: 8,
|
|
||||||
codeBits: 5,
|
|
||||||
keyString: 'ABCDEFGHIJKLMNOPQRSTUVWXYZ234567',
|
|
||||||
pad: '='
|
|
||||||
}
|
|
||||||
);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
@ -15,7 +15,9 @@
|
|||||||
"engines": {
|
"engines": {
|
||||||
"node": "~v0.4.10"
|
"node": "~v0.4.10"
|
||||||
},
|
},
|
||||||
"dependencies": {},
|
"dependencies": {
|
||||||
|
"thirty-two": "0.0.1"
|
||||||
|
},
|
||||||
"devDependencies": {
|
"devDependencies": {
|
||||||
"expresso" : "0.9.0"
|
"expresso" : "0.9.0"
|
||||||
}
|
}
|
||||||
|
Loading…
x
Reference in New Issue
Block a user