summaryrefslogtreecommitdiffstats
path: root/core/codecBase32.js
diff options
context:
space:
mode:
authorSteve Thomas <Sc00bz@users.noreply.github.com>2015-11-01 14:36:28 -0600
committerSteve Thomas <Sc00bz@users.noreply.github.com>2015-11-01 14:36:28 -0600
commitdb7e40d449ab4ae65bacf267b38d1bf836b4fe54 (patch)
treef6f815673f56490c8ae3bfdc8ed9a5f4d9996f76 /core/codecBase32.js
parent025908ef2b091faab75f60188654f789b691ff0d (diff)
parentf9a2494fae0dcddef493de453aa6ab69caa987cf (diff)
downloadsjcl-db7e40d449ab4ae65bacf267b38d1bf836b4fe54.zip
sjcl-db7e40d449ab4ae65bacf267b38d1bf836b4fe54.tar.gz
sjcl-db7e40d449ab4ae65bacf267b38d1bf836b4fe54.tar.bz2
Merge pull request #1 from bitwiseshiftleft/master
Update
Diffstat (limited to 'core/codecBase32.js')
-rw-r--r--core/codecBase32.js88
1 files changed, 88 insertions, 0 deletions
diff --git a/core/codecBase32.js b/core/codecBase32.js
new file mode 100644
index 0000000..9251e04
--- /dev/null
+++ b/core/codecBase32.js
@@ -0,0 +1,88 @@
+/** @fileOverview Bit array codec implementations.
+ *
+ * @author Nils Kenneweg
+ */
+
+/** @namespace Base32 encoding/decoding */
+sjcl.codec.base32 = {
+ /** The base32 alphabet.
+ * @private
+ */
+ _chars: "ABCDEFGHIJKLMNOPQRSTUVWXYZ234567",
+ _hexChars: "0123456789ABCDEFGHIJKLMNOPQRSTUV",
+
+ /* bits in an array */
+ BITS: 32,
+ /* base to encode at (2^x) */
+ BASE: 5,
+ /* bits - base */
+ REMAINING: 27,
+
+ /** Convert from a bitArray to a base32 string. */
+ fromBits: function (arr, _noEquals, _hex) {
+ var BITS = sjcl.codec.base32.BITS, BASE = sjcl.codec.base32.BASE, REMAINING = sjcl.codec.base32.REMAINING;
+ var out = "", i, bits=0, c = sjcl.codec.base32._chars, ta=0, bl = sjcl.bitArray.bitLength(arr);
+
+ if (_hex) {
+ c = sjcl.codec.base32._hexChars;
+ }
+
+ for (i=0; out.length * BASE < bl; ) {
+ out += c.charAt((ta ^ arr[i]>>>bits) >>> REMAINING);
+ if (bits < BASE) {
+ ta = arr[i] << (BASE-bits);
+ bits += REMAINING;
+ i++;
+ } else {
+ ta <<= BASE;
+ bits -= BASE;
+ }
+ }
+ while ((out.length & 7) && !_noEquals) { out += "="; }
+
+ return out;
+ },
+
+ /** Convert from a base32 string to a bitArray */
+ toBits: function(str, _hex) {
+ str = str.replace(/\s|=/g,'').toUpperCase();
+ var BITS = sjcl.codec.base32.BITS, BASE = sjcl.codec.base32.BASE, REMAINING = sjcl.codec.base32.REMAINING;
+ var out = [], i, bits=0, c = sjcl.codec.base32._chars, ta=0, x, format="base32";
+
+ if (_hex) {
+ c = sjcl.codec.base32._hexChars;
+ format = "base32hex"
+ }
+
+ for (i=0; i<str.length; i++) {
+ x = c.indexOf(str.charAt(i));
+ if (x < 0) {
+ // Invalid character, try hex format
+ if (!_hex) {
+ try {
+ return sjcl.codec.base32hex.toBits(str);
+ }
+ catch (e) {}
+ }
+ throw new sjcl.exception.invalid("this isn't " + format + "!");
+ }
+ if (bits > REMAINING) {
+ bits -= REMAINING;
+ out.push(ta ^ x>>>bits);
+ ta = x << (BITS-bits);
+ } else {
+ bits += BASE;
+ ta ^= x << (BITS-bits);
+ }
+ }
+ if (bits&56) {
+ out.push(sjcl.bitArray.partial(bits&56, ta, 1));
+ }
+ return out;
+ }
+};
+
+sjcl.codec.base32hex = {
+ fromBits: function (arr, _noEquals) { return sjcl.codec.base32.fromBits(arr,_noEquals,1); },
+ toBits: function (str) { return sjcl.codec.base32.toBits(str,1); }
+};