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)
pFad - Phonifier reborn

Pfad - The Proxy pFad of © 2024 Garber Painting. All rights reserved.

Note: This service is not intended for secure transactions such as banking, social media, email, or purchasing. Use at your own risk. We assume no liability whatsoever for broken pages.


Alternative Proxies:

Alternative Proxy

pFad Proxy

pFad v3 Proxy

pFad v4 Proxy