OSDN Git Service

update key logic
[bytom/Bytom-JS-SDK.git] / src / utils / key / keystore.js
1 let cryp = require('crypto-browserify');
2 let scrypt = require('scrypt-js');
3
4 const scryptDKLen = 32;
5 const scryptR     = 8;
6
7 function encryptKey(key , auth, scryptN, scryptP){
8     let authArray = new Buffer(auth);
9     let salt = cryp.randomBytes(32);
10
11     let derivedKey = scrypt.syncScrypt(authArray, salt, scryptN, scryptR, scryptP, scryptDKLen);
12
13     let encryptKey = derivedKey.slice(0, 16);
14     let keyBytes = key.xPrv.xprv;
15     let iv = cryp.randomBytes(16);
16
17
18     let cipherText = aesCTRXOR(encryptKey, keyBytes, iv);
19
20     let kdfparams = {
21         n:scryptN,
22         r:scryptR,
23         p:scryptP,
24         dklen:scryptDKLen,
25         salt:salt.toString('hex')
26     };
27
28     let mac = cryp.createHash('sha256').update(Buffer.from([...derivedKey.slice(16, 32), ...cipherText])).digest();
29
30     return {
31         version: 1,
32         xpub:key.xPub,
33         alias:key.alias,
34         type: key.keyType,
35         crypto: {
36             ciphertext: cipherText.toString('hex'),
37             cipherparams: {
38                 iv: iv.toString('hex')
39             },
40             cipher:  'aes-128-ctr',
41             kdf:  'scrypt',
42             kdfparams: kdfparams,
43             mac: mac.toString('hex')
44         }
45     };
46 }
47
48 exports.encryptKey = encryptKey;
49
50 function aesCTRXOR(key, inText, iv) {
51     let cipher = cryp.createCipheriv('aes-128-ctr', key, iv);
52
53     var ciphertext = Buffer.from([
54         ...cipher.update(Buffer.from(inText, 'hex')),
55         ...cipher.final()]
56     );
57
58
59     return ciphertext;
60 }