cipher-ethereum
Version:
An Ethereum library used by Cipher Browser, a mobile Ethereum client
184 lines (181 loc) • 9.04 kB
JavaScript
;
var _Mnemonic = require("./Mnemonic");
var __awaiter = undefined && undefined.__awaiter || function (thisArg, _arguments, P, generator) {
function adopt(value) {
return value instanceof P ? value : new P(function (resolve) {
resolve(value);
});
}
return new (P || (P = Promise))(function (resolve, reject) {
function fulfilled(value) {
try {
step(generator.next(value));
} catch (e) {
reject(e);
}
}
function rejected(value) {
try {
step(generator["throw"](value));
} catch (e) {
reject(e);
}
}
function step(result) {
result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected);
}
step((generator = generator.apply(thisArg, _arguments || [])).next());
});
};
var __generator = undefined && undefined.__generator || function (thisArg, body) {
var _ = { label: 0, sent: function () {
if (t[0] & 1) throw t[1];return t[1];
}, trys: [], ops: [] },
f,
y,
t,
g;
return g = { next: verb(0), "throw": verb(1), "return": verb(2) }, typeof Symbol === "function" && (g[Symbol.iterator] = function () {
return this;
}), g;
function verb(n) {
return function (v) {
return step([n, v]);
};
}
function step(op) {
if (f) throw new TypeError("Generator is already executing.");
while (_) try {
if (f = 1, y && (t = op[0] & 2 ? y["return"] : op[0] ? y["throw"] || ((t = y["return"]) && t.call(y), 0) : y.next) && !(t = t.call(y, op[1])).done) return t;
if (y = 0, t) op = [op[0] & 2, t.value];
switch (op[0]) {
case 0:case 1:
t = op;break;
case 4:
_.label++;return { value: op[1], done: false };
case 5:
_.label++;y = op[1];op = [0];continue;
case 7:
op = _.ops.pop();_.trys.pop();continue;
default:
if (!(t = _.trys, t = t.length > 0 && t[t.length - 1]) && (op[0] === 6 || op[0] === 2)) {
_ = 0;continue;
}
if (op[0] === 3 && (!t || op[1] > t[0] && op[1] < t[3])) {
_.label = op[1];break;
}
if (op[0] === 6 && _.label < t[1]) {
_.label = t[1];t = op;break;
}
if (t && _.label < t[2]) {
_.label = t[2];_.ops.push(op);break;
}
if (t[2]) _.ops.pop();
_.trys.pop();continue;
}
op = body.call(thisArg, _);
} catch (e) {
op = [6, e];y = 0;
} finally {
f = t = 0;
}
if (op[0] & 5) throw op[1];return { value: op[0] ? op[1] : void 0, done: true };
}
};
describe('generate', function () {
test('generates mnemonic phrase from entropy', function () {
var testCases = {
'4d3ef17b17a8a7ec7dfe3e112f7a61f6': 'essay wasp gain consider media wage wave sick bachelor knock observe undo',
baa076aafddbeb78ea973289feb05383: 'rival admit primary wing salt round prevent town measure void belt almost',
'50df9ecd8b1afc4f4afa49563b8b8cdc': 'express woman recall bike quit chicken cloud empty file sword tobacco rib'
};
Object.keys(testCases).forEach(function (hex) {
var entropy = Buffer.from(hex, 'hex');
var phrase = testCases[hex];
var mnemonic = _Mnemonic.Mnemonic.generate(entropy);
expect(mnemonic).not.toBe(null);
expect(mnemonic.entropy.toString('hex')).toBe(hex);
expect(mnemonic.phrase).toBe(phrase);
expect(mnemonic.words).toEqual(phrase.split(' '));
});
});
test('returns null when an entropy with an invalid length is passed', function () {
var testCases = ['4d3ef17b17a8a7ec7dfe3e112f7a61', 'baa076aafddbeb78ea973289feb053', '50df9ecd8b1afc4f4afa49563b'];
testCases.forEach(function (hex) {
var entropy = Buffer.from(hex, 'hex');
expect(_Mnemonic.Mnemonic.generate(entropy)).toBe(null);
});
});
});
describe('parse', function () {
test('parses mnemonic, verifies checksum, and decodes back to entropy', function () {
var testCases = {
'essay wasp gain consider media wage wave sick bachelor knock observe undo': '4d3ef17b17a8a7ec7dfe3e112f7a61f6',
'rival admit primary wing salt round prevent town measure void belt almost': 'baa076aafddbeb78ea973289feb05383',
'express woman recall bike quit chicken cloud empty file sword tobacco rib': '50df9ecd8b1afc4f4afa49563b8b8cdc'
};
Object.keys(testCases).forEach(function (phrase) {
var hex = testCases[phrase];
var mnemonic = _Mnemonic.Mnemonic.parse(phrase);
expect(mnemonic).not.toBe(null);
expect(mnemonic.entropy.toString('hex')).toBe(hex);
expect(mnemonic.phrase).toBe(phrase);
expect(mnemonic.words).toEqual(phrase.split(' '));
});
});
test('returns null when verification fails', function () {
var testCases = ['essay wasp gain consider media wage wave sick bachelor knock observe', 'essay wasp gain consider media wage wave sick bachelor knock observe uncle', 'river admit primary wing salt round prevent town measure void belt almost', 'express woman recall biology quit chicken cloud empty file sword tobacco rib'];
testCases.forEach(function (phrase) {
expect(_Mnemonic.Mnemonic.parse(phrase)).toBe(null);
});
});
});
describe('toSeed', function () {
test('returns a binary seed derived from a mnemonic phrase', function () {
var testCases = {
'essay wasp gain consider media wage wave sick bachelor knock observe undo': 'b7df235f1e8addda6befbdf66f4df613474e8ff6041c7826e4df7fa68aa8c244a1d687eda050f97fc20fc2fcd8c09e19ef21d6c14f523639b033e9fc4e6375a6',
'rival admit primary wing salt round prevent town measure void belt almost': '267d6fe81adc779fd2e875d62739cc67690af67025bca8fc6b1f5f3228fb312a1a9b10dedbb3cffc62730438f5afc8725dac6ee11fcd319b98611863226a2957',
'express woman recall bike quit chicken cloud empty file sword tobacco rib': 'c35ecec5b1986cd3a1407bc3c829610eb5fc9497e59f31c151a5ce422c7ff7e68bdf3343343605a53db8e7376a932a74b3e08296c0b51476f3d288b750089d9d'
};
Object.keys(testCases).forEach(function (phrase) {
var seed = testCases[phrase];
var mnemonic = _Mnemonic.Mnemonic.parse(phrase);
expect(mnemonic.toSeed().toString('hex')).toBe(seed);
});
});
});
describe('toSeedAsync', function () {
test('returns a binary seed derived from a mnemonic phrase', function () {
return __awaiter(void 0, void 0, void 0, function () {
var testCases, keys, i, phrase, seed, mnemonic, derivedSeed;
return __generator(this, function (_a) {
switch (_a.label) {
case 0:
testCases = {
'essay wasp gain consider media wage wave sick bachelor knock observe undo': 'b7df235f1e8addda6befbdf66f4df613474e8ff6041c7826e4df7fa68aa8c244a1d687eda050f97fc20fc2fcd8c09e19ef21d6c14f523639b033e9fc4e6375a6',
'rival admit primary wing salt round prevent town measure void belt almost': '267d6fe81adc779fd2e875d62739cc67690af67025bca8fc6b1f5f3228fb312a1a9b10dedbb3cffc62730438f5afc8725dac6ee11fcd319b98611863226a2957',
'express woman recall bike quit chicken cloud empty file sword tobacco rib': 'c35ecec5b1986cd3a1407bc3c829610eb5fc9497e59f31c151a5ce422c7ff7e68bdf3343343605a53db8e7376a932a74b3e08296c0b51476f3d288b750089d9d'
};
keys = Object.keys(testCases);
i = 0;
_a.label = 1;
case 1:
if (!(i < keys.length)) return [3 /*break*/, 4];
phrase = keys[i];
seed = testCases[phrase];
mnemonic = _Mnemonic.Mnemonic.parse(phrase);
return [4 /*yield*/, mnemonic.toSeedAsync()];
case 2:
derivedSeed = _a.sent();
expect(derivedSeed.toString('hex')).toBe(seed);
_a.label = 3;
case 3:
i++;
return [3 /*break*/, 1];
case 4:
return [2 /*return*/];
}
});
});
});
});