Skip to content

Commit 8be31b7

Browse files
committed
Major restructure
1 parent 39f324f commit 8be31b7

File tree

13 files changed

+809
-774
lines changed

13 files changed

+809
-774
lines changed

README.md

Lines changed: 65 additions & 61 deletions
Large diffs are not rendered by default.

dist/lib/charSet.js

Lines changed: 30 additions & 29 deletions
Original file line numberDiff line numberDiff line change
@@ -1,9 +1,5 @@
11
'use strict';
22

3-
Object.defineProperty(exports, "__esModule", {
4-
value: true
5-
});
6-
73
var _log = require('babel-runtime/core-js/math/log2');
84

95
var _log2 = _interopRequireDefault(_log);
@@ -73,42 +69,47 @@ var CharSet = function () {
7369
var ndxFn = function ndxFn(bitsPerChar) {
7470
var bitsPerByte = 8;
7571

72+
// If bitsPerBytes is a multiple of bitsPerChar, we can slice off an integer number
73+
// of chars per byte.
7674
if ((0, _lcm2.default)(bitsPerChar, bitsPerByte) === bitsPerByte) {
7775
return function (chunk, slice, bytes) {
7876
var lShift = bitsPerChar;
7977
var rShift = bitsPerByte - bitsPerChar;
8078
return (bytes[chunk] << lShift * slice & 0xff) >> rShift;
8179
};
82-
} else {
83-
return function (chunk, slice, bytes) {
84-
var slicesPerChunk = (0, _lcm2.default)(bitsPerChar, bitsPerByte) / bitsPerByte;
85-
var bNum = chunk * slicesPerChunk;
86-
87-
var rShift = bitsPerByte - bitsPerChar;
88-
var lOffset = Math.floor(slice * bitsPerChar / bitsPerByte);
89-
var lShift = slice * bitsPerChar % bitsPerByte;
90-
91-
var ndx = (bytes[bNum + lOffset] << lShift & 0xff) >> rShift;
92-
93-
var rOffset = Math.ceil(slice * bitsPerChar / bitsPerByte);
94-
var rShiftIt = ((rOffset + 1) * bitsPerByte - (slice + 1) * bitsPerChar) % bitsPerByte;
95-
if (rShift < rShiftIt) {
96-
ndx += bytes[bNum + rOffset] >> rShiftIt;
97-
}
98-
return ndx;
99-
};
10080
}
81+
// Otherwise, while slicing off bits per char, we will possibly straddle a couple
82+
// of bytes, so a bit more work is involved
83+
else {
84+
return function (chunk, slice, bytes) {
85+
var slicesPerChunk = (0, _lcm2.default)(bitsPerChar, bitsPerByte) / bitsPerByte;
86+
var bNum = chunk * slicesPerChunk;
87+
88+
var rShift = bitsPerByte - bitsPerChar;
89+
var lOffset = Math.floor(slice * bitsPerChar / bitsPerByte);
90+
var lShift = slice * bitsPerChar % bitsPerByte;
91+
92+
var ndx = (bytes[bNum + lOffset] << lShift & 0xff) >> rShift;
93+
94+
var rOffset = Math.ceil(slice * bitsPerChar / bitsPerByte);
95+
var rShiftIt = ((rOffset + 1) * bitsPerByte - (slice + 1) * bitsPerChar) % bitsPerByte;
96+
if (rShift < rShiftIt) {
97+
ndx += bytes[bNum + rOffset] >> rShiftIt;
98+
}
99+
return ndx;
100+
};
101+
}
101102
};
102103
return CharSet;
103104
}();
104105

105-
exports.default = {
106-
charSet64: new CharSet('ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789-_'),
107-
charSet32: new CharSet('2346789bdfghjmnpqrtBDFGHJLMNPQRT'),
108-
charSet16: new CharSet('0123456789abcdef'),
109-
charSet8: new CharSet('01234567'),
110-
charSet4: new CharSet('ATCG'),
111-
charSet2: new CharSet('01'),
106+
module.exports = {
107+
base64: new CharSet('ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789-_'),
108+
base32: new CharSet('2346789bdfghjmnpqrtBDFGHJLMNPQRT'),
109+
base16: new CharSet('0123456789abcdef'),
110+
base8: new CharSet('01234567'),
111+
base4: new CharSet('ATCG'),
112+
base2: new CharSet('01'),
112113
isValid: function isValid(charSet) {
113114
return charSet instanceof CharSet;
114115
}

dist/lib/entropy.js

Lines changed: 16 additions & 135 deletions
Original file line numberDiff line numberDiff line change
@@ -1,9 +1,5 @@
11
'use strict';
22

3-
Object.defineProperty(exports, "__esModule", {
4-
value: true
5-
});
6-
73
var _log = require('babel-runtime/core-js/math/log10');
84

95
var _log3 = _interopRequireDefault(_log);
@@ -12,10 +8,6 @@ var _log4 = require('babel-runtime/core-js/math/log2');
128

139
var _log5 = _interopRequireDefault(_log4);
1410

15-
var _charSet = require('./charSet');
16-
17-
var _charSet2 = _interopRequireDefault(_charSet);
18-
1911
var _lcm = require('./lcm');
2012

2113
var _lcm2 = _interopRequireDefault(_lcm);
@@ -27,154 +19,43 @@ var _log10 = _log3.default;
2719
var _log2_10 = _log2(10);
2820
var _bitsPerByte = 8;
2921

30-
var _endianByteNum = function () {
31-
var buf32 = new Uint32Array(1);
32-
var buf8 = new Uint8Array(buf32.buffer);
33-
buf32[0] = 0xff;
34-
return buf8[0] === 0xff ? [2, 3, 4, 5, 6, 7] : [0, 1, 2, 3, 6, 7];
35-
}();
36-
37-
var bits = function bits(total, risk) {
38-
if (total == 0) {
22+
var _totalOf = function _totalOf(numStrings, log2Risk) {
23+
if (numStrings == 0) {
3924
return 0;
4025
}
4126

42-
var N = 0;
43-
if (total < 10001) {
44-
N = _log2(total) + _log2(total - 1) + _log2_10 * _log10(risk) - 1;
27+
var N = void 0;
28+
if (numStrings < 10001) {
29+
N = _log2(numStrings) + _log2(numStrings - 1);
4530
} else {
46-
var n = 2 * _log10(total) + _log10(risk);
47-
N = n * _log2_10 - 1;
31+
N = 2 * _log2(numStrings);
4832
}
49-
return N;
33+
return N + log2Risk - 1;
5034
};
5135

52-
var bitsWithRiskPower = function bitsWithRiskPower(total, rPower) {
36+
var bits = function bits(total, risk) {
5337
if (total == 0) {
5438
return 0;
5539
}
40+
return _totalOf(total, _log2(risk));
41+
};
5642

57-
var N = 0;
58-
if (total < 10001) {
59-
N = _log2(total) + _log2(total - 1) + _log2_10 * rPower - 1;
60-
} else {
61-
var n = 2 * _log10(total) + rPower;
62-
N = n * _log2_10 - 1;
63-
}
64-
return N;
43+
var bitsWithRiskPower = function bitsWithRiskPower(total, rPower) {
44+
var log2Risk = _log2_10 * rPower;
45+
return _totalOf(total, log2Risk);
6546
};
6647

6748
var bitsWithPowers = function bitsWithPowers(tPower, rPower) {
6849
var N = 0;
6950
if (tPower < 5) {
7051
return bitsWithRiskPower(Math.pow(10, tPower), rPower);
7152
} else {
72-
var n = 2 * tPower + rPower;
73-
N = n * _log2_10 - 1;
53+
return (2 * tPower + rPower) * _log2_10 - 1;
7454
}
75-
return N;
76-
};
77-
78-
var string = function string(entropyBits, charSet) {
79-
return stringWithBytes(entropyBits, charSet, _cryptoBytes(entropyBits, charSet));
80-
};
81-
82-
var stringRandom = function stringRandom(entropyBits, charSet) {
83-
return stringWithBytes(entropyBits, charSet, _randomBytes(entropyBits, charSet));
8455
};
8556

86-
var stringWithBytes = function stringWithBytes(entropyBits, charSet, bytes) {
87-
if (!_charSet2.default.isValid(charSet)) {
88-
throw new Error('Invalid CharSet');
89-
}
90-
if (entropyBits <= 0) {
91-
return '';
92-
}
93-
94-
var bitsPerChar = charSet.getBitsPerChar();
95-
var count = Math.ceil(entropyBits / bitsPerChar);
96-
if (count <= 0) {
97-
return '';
98-
}
99-
100-
var needed = Math.ceil(count * (bitsPerChar / _bitsPerByte));
101-
if (bytes.length < needed) {
102-
throw new Error('Insufficient bytes');
103-
}
104-
105-
var charsPerChunk = charSet.getCharsPerChunk();
106-
var chunks = Math.floor(count / charsPerChunk);
107-
var partials = count % charsPerChunk;
108-
109-
var ndxFn = charSet.getNdxFn();
110-
var chars = charSet.getChars();
111-
112-
var string = '';
113-
for (var chunk = 0; chunk < chunks; chunk++) {
114-
for (var slice = 0; slice < charsPerChunk; slice++) {
115-
var ndx = ndxFn(chunk, slice, bytes);
116-
string += chars[ndx];
117-
}
118-
}
119-
for (var _slice = 0; _slice < partials; _slice++) {
120-
var _ndx = ndxFn(chunks, _slice, bytes);
121-
string += chars[_ndx];
122-
}
123-
return string;
124-
};
125-
126-
var bytesNeeded = function bytesNeeded(entropyBits, charSet) {
127-
if (!_charSet2.default.isValid(charSet)) {
128-
throw new Error('Invalid CharSet');
129-
}
130-
131-
var bitsPerChar = charSet.getBitsPerChar();
132-
var count = Math.ceil(entropyBits / bitsPerChar);
133-
if (count <= 0) {
134-
return 0;
135-
}
136-
137-
var bytesPerSlice = bitsPerChar / _bitsPerByte;
138-
return Math.ceil(count * bytesPerSlice);
139-
};
140-
141-
var _cryptoBytes = function _cryptoBytes(entropyBits, charSet) {
142-
var crypto = require('crypto');
143-
return Buffer.from(crypto.randomBytes(bytesNeeded(entropyBits, charSet)));
144-
};
145-
146-
var _randomBytes = function _randomBytes(entropyBits, charSet) {
147-
var byteCount = bytesNeeded(entropyBits, charSet);
148-
var randCount = Math.ceil(byteCount / 6);
149-
150-
var buffer = new Buffer(byteCount);
151-
var dataView = new DataView(new ArrayBuffer(_bitsPerByte));
152-
for (var rNum = 0; rNum < randCount; rNum++) {
153-
dataView.setFloat64(0, Math.random());
154-
for (var n = 0; n < 6; n++) {
155-
var fByteNum = _endianByteNum[n];
156-
var bByteNum = 6 * rNum + n;
157-
if (bByteNum < byteCount) {
158-
buffer[bByteNum] = dataView.getUint8(fByteNum);
159-
}
160-
}
161-
}
162-
return buffer;
163-
};
164-
165-
exports.default = {
57+
module.exports = {
16658
bits: bits,
16759
bitsWithRiskPower: bitsWithRiskPower,
168-
bitsWithPowers: bitsWithPowers,
169-
string: string,
170-
stringRandom: stringRandom,
171-
stringWithBytes: stringWithBytes,
172-
bytesNeeded: bytesNeeded,
173-
174-
charSet64: _charSet2.default.charSet64,
175-
charSet32: _charSet2.default.charSet32,
176-
charSet16: _charSet2.default.charSet16,
177-
charSet8: _charSet2.default.charSet8,
178-
charSet4: _charSet2.default.charSet4,
179-
charSet2: _charSet2.default.charSet2
60+
bitsWithPowers: bitsWithPowers
18061
};

0 commit comments

Comments
 (0)