@springrole/springwallet
Version:
Wallet for SpringRole users
12 lines • 3.12 kB
JavaScript
;var _interopRequireDefault=require("@babel/runtime/helpers/interopRequireDefault");Object.defineProperty(exports,"__esModule",{value:!0}),exports.encryptMnemonic=encryptMnemonic,exports.decryptMnemonic=decryptMnemonic;var _regenerator=_interopRequireDefault(require("@babel/runtime/regenerator")),_asyncToGenerator2=_interopRequireDefault(require("@babel/runtime/helpers/asyncToGenerator")),_util=require("util"),_bip=require("bip39"),_crypto=require("crypto"),asyncPbkdf2=(0,_util.promisify)(_crypto.pbkdf2);/**
* Encrypt a mnemonic using password
* @method encryptMnemonic
* @param phrase - string of the encrypted mnemonic
* @returns {Promise<String>} hex-encoded string of the encrypted mnemonic
*/function encryptMnemonic(){return _encryptMnemonic.apply(this,arguments)}/**
* Decrypt an encrypted mnemonic with a password
* @method decryptMnemonic
* @param {String} encryptedMnemonic - Hex-encoded string of the encrypted mnemonic
* @param {String} password - Password
* @return {Promise<String>} mnemonic - plain text mnemonic phrase
*/function _encryptMnemonic(){return _encryptMnemonic=(0,_asyncToGenerator2["default"])(/*#__PURE__*/_regenerator["default"].mark(function a(b,c){var d,e,f,g,h,i,j,k,l,m,n,o;return _regenerator["default"].wrap(function(a){for(;;)switch(a.prev=a.next){case 0:if((0,_bip.validateMnemonic)(b)){a.next=2;break}throw new Error("Not a valid bip39 mnemonic");case 2:return d=Buffer.from((0,_bip.mnemonicToEntropy)(b),"hex"),e=(0,_crypto.randomBytes)(16),a.next=6,asyncPbkdf2(c,e,1e5,48,"sha512");case 6:return f=a.sent,g=f.slice(0,16),h=f.slice(16,32),i=f.slice(32,48),j=(0,_crypto.createCipheriv)("aes-128-cbc",g,i),k=Buffer.concat([j.update(d),j.final()]),l=Buffer.concat([e,k]),m=(0,_crypto.createHmac)("sha256",h),m.write(l),n=m.digest(),o=Buffer.concat([e,n,k]),a.abrupt("return",o.toString("hex"));case 18:case"end":return a.stop();}},a)})),_encryptMnemonic.apply(this,arguments)}function decryptMnemonic(){return _decryptMnemonic.apply(this,arguments)}function _decryptMnemonic(){return _decryptMnemonic=(0,_asyncToGenerator2["default"])(/*#__PURE__*/_regenerator["default"].mark(function a(b,c){var d,e,f,g,h,i,j,k,l,m,n,o,p,q,r,s;return _regenerator["default"].wrap(function(a){for(;;)switch(a.prev=a.next){case 0:return d=Buffer.from(b,"hex"),e=d.slice(0,16),f=d.slice(16,48),g=d.slice(48),h=Buffer.concat([e,g]),a.next=7,asyncPbkdf2(c,e,1e5,48,"sha512");case 7:if(i=a.sent,j=i.slice(0,16),k=i.slice(16,32),l=i.slice(32,48),m=(0,_crypto.createDecipheriv)("aes-128-cbc",j,l),n=Buffer.concat([m.update(g),m.final()]),o=(0,_crypto.createHmac)("sha256",k),o.write(h),p=o.digest(),q=(0,_crypto.createHash)("sha256").update(f).digest().toString("hex"),r=(0,_crypto.createHash)("sha256").update(p).digest().toString("hex"),q===r){a.next=20;break}throw new Error("Wrong password (HMAC mismatch)");case 20:if(s=(0,_bip.entropyToMnemonic)(n),(0,_bip.validateMnemonic)(s)){a.next=23;break}throw new Error("Wrong password (invalid plaintext)");case 23:return a.abrupt("return",s);case 24:case"end":return a.stop();}},a)})),_decryptMnemonic.apply(this,arguments)}