OSDN Git Service

update error code
[bytom/Bytom-JS-SDK.git] / src / sdk / keys.js
index 33e3752..2a017c9 100644 (file)
-import {createKey, resetKeyPassword} from '../wasm/func';
-import {getDB} from '../db/db';
+import {createkey, isValidMnemonic} from '../utils/key/createKey';
+import { decryptKey} from '../utils/key/keystore';
+import { camelize } from '../utils/utils';
+import CryptoJS from 'crypto-js';
+import {signMessage as signMJs} from '../utils/transaction/signMessage';
+import Error from '../utils/error';
+
 
 function keysSDK() {
 }
 
 /**
- * reset key password
- * 
- * @param {String}} rootXPub 
- * @param {String} oldPassword 
- * @param {String} newPassword 
+ * Create a new key.
+ *
+ * @param {String} alias - User specified, unique identifier.
+ * @param {String} password - User specified, key password.
  */
-keysSDK.prototype.resetKeyPassword = function(rootXPub, oldPassword, newPassword) {
-    let retPromise = new Promise((resolve, reject) => {
-        let data = {rootXPub: rootXPub, oldPassword:oldPassword, newPassword:newPassword};
-        resetKeyPassword(data).then(res => {
-            getDB().then(db => {
-                let objectStore = db.transaction(['keys'], 'readwrite').objectStore('keys');
-                let index = objectStore.index('xpub');
-                let keyRange = IDBKeyRange.only(rootXPub);
-                let getRequest = index.openCursor(keyRange);
-                getRequest.onsuccess = function (event) {
-                    const cursor = event.target.result;
-                    if(cursor && cursor.value.xpub === rootXPub) {
-                        const updateData = cursor.value;
-                        updateData.key = res.data;
-                        const request = cursor.update(updateData);
-                        request.onsuccess = function() {
-                            resolve(true);
-                        };
-                        request.onerror = function() {
-                            reject(new Error('db update error'));
-                        };
-                    } else {
-                        reject(new Error('db update error: not found by rootXPub'));
-                    }
-                };
-                getRequest.onerror = function () {
-                    reject(new Error('db get error'));
-                };
-            }).catch(error => {
-                reject(error);
-            });
-        }).catch(error => {
-            reject(error);
-        });
-    });
-    return retPromise;
+keysSDK.prototype.createKey = function(alias, password) {
+    var normalizedAlias = alias.toLowerCase().trim();
+
+    let data = {};
+    data.alias = normalizedAlias;
+    data.password = password;
+    const res = createkey(data);
+
+    res.vault = this.encryptMnemonic(res.mnemonic, password, res.keystore);
+
+    return res;
 };
 
 /**
- * get key by XPub
- * 
- * @param {String} xpub 
+ * Create a new key.
+ *
+ * @param {String} alias - User specified, unique identifier.
+ * @param {String} password - User specified, key password.
  */
-keysSDK.prototype.getKeyByXPub = function(xpub) {
-    let retPromise = new Promise((resolve, reject) => {
-        getDB().then(db => {
-            let getRequest = db.transaction(['keys'], 'readonly')
-                .objectStore('keys')
-                .index('xpub')
-                .get(xpub);
-            getRequest.onsuccess = function(e) {
-                if(e.target.result) {
-                    resolve(e.target.result.key);
-                } else {
-                    reject(new Error('not found by XPub'));    
-                }
-            };
-            getRequest.onerror = function() {
-                reject(new Error('db get error'));
-            };
-        }).catch(error => {
-            reject(error);
-        });
-    });
-    return retPromise;
+keysSDK.prototype.restoreFromMnemonic = function(alias, password, mnemonic) {
+    var normalizedAlias = alias.toLowerCase().trim();
+
+    let data = {};
+    data.alias = normalizedAlias;
+    data.password = password;
+    data.mnemonic = mnemonic;
+
+    const res = createkey(data);
+
+    res.vault = this.encryptMnemonic(mnemonic, password, res.keystore);
+    return res;
 };
 
 /**
- * List key
+ * Create a new key.
  *
- * @returns {Promise}
+ * @param {String} alias - User specified, unique identifier.
+ * @param {String} password - User specified, key password.
  */
-keysSDK.prototype.list = function() {
-    let retPromise = new Promise((resolve, reject) => {
-        getDB().then(db => {
-            let transaction = db.transaction(['keys'], 'readonly');
-            let objectStore = transaction.objectStore('keys');
-            let oc = objectStore.openCursor();
-            let ret = [];
-            oc.onsuccess = function (event) {
-                var cursor = event.target.result;
-                if (cursor) {
-                    ret.push({alias: cursor.value.alias, xpub: cursor.value.xpub});
-                    cursor.continue();
-                } else {
-                    resolve(ret);
-                }
-            };
-            oc.onerror = function(e){
-                reject(e);
-            };
-        }).catch(err => {
-            reject(err);
-        });
-    });
-    return retPromise;
+keysSDK.prototype.restoreFromKeystore = function( password, keystore) {
+
+    const result = decryptKey(keystore, password);
+    result.xpub = result.xPub.toString('hex');
+    delete result['xPub'];
+
+    return result;
 };
 
+
 /**
  * Create a new key.
- * 
+ *
  * @param {String} alias - User specified, unique identifier.
  * @param {String} password - User specified, key password.
  */
-keysSDK.prototype.create = function(alias, password) {
-    var normalizedAlias = alias.toLowerCase().trim();
+keysSDK.prototype.encryptMnemonic = function(mnemonic, password, keystore) {
+
+    const result = decryptKey(keystore, password);
+    const xprv = result.xPrv.toString('hex');
+
+    const ciphertext = CryptoJS.AES.encrypt(mnemonic, xprv);
+
+    return ciphertext.toString();
+};
+
+/**
+ * Create a new key.
+ *
+ * @param {String} alias - User specified, unique identifier.
+ * @param {String} password - User specified, key password.
+ */
+keysSDK.prototype.decryptMnemonic = function(ciphertext, password, keystore) {
+
+    const result = decryptKey(keystore, password);
+    const xprv = result.xPrv.toString('hex');
+
+
+    const bytes = CryptoJS.AES.decrypt(ciphertext, xprv);
+    const plaintext = bytes.toString(CryptoJS.enc.Utf8);
+
+    return plaintext;
+};
+
+
+
+/**
+ * Create a new key.
+ *
+ * @param {String} keystore - User specified, unique identifier.
+ */
+keysSDK.prototype.isValidKeystore = function(  keystore ) {
+
+    const walletImage = camelize(JSON.parse(keystore));
+
+    let keys, key;
+    if(walletImage.keyImages && walletImage.keyImages.xkeys ){
+        keys = walletImage.keyImages.xkeys;
+    }
+
+    // match older version of backups keystore files
+    else if(walletImage['accounts-server']){
+        keys = walletImage.keys.map(keyItem => JSON.parse( keyItem.key ) );
+    }else{
+        key  = walletImage;
+    }
+
+    if(keys){
+        if(keys.length>1){
+            throw new Error('do not support multiple keystore imported.', 'BTM3004');
+        }
+        else if(keys.length === 1){
+            key = keys[0];
+        }
+    }
+
+    return key;
+};
+
+/**
+ * Create a new key.
+ *
+ * @param {String} alias - User specified, unique identifier.
+ * @param {String} password - User specified, key password.
+ */
+keysSDK.prototype.isValidMnemonic = function(mnemonic) {
+
+    return isValidMnemonic(mnemonic);
+};
+
+/**
+ * Create a new key.
+ *
+ * @param {String} alias - User specified, unique identifier.
+ * @param {String} password - User specified, key password.
+ */
+keysSDK.prototype.verifyPassword = function(keystore, password) {
+    try{
+        decryptKey(keystore, password);
+    }catch (e){
+        return false;
+    }
+    return true;
+};
+
+/**
+ * Sign Message.
+ *
+ * @param {String} message - message.
+ * @param {String} password - password.
+ * @param {Object} address - address.
+ */
+keysSDK.prototype.signMessageJs = function(message, password, keystore) {
+    return signMJs(message, password, keystore);
+};
+
+keysSDK.prototype.signMessageJsPromise = function(message, password, keystore) {
     let retPromise = new Promise((resolve, reject) => {
-        getDB().then(db => {
-            let getRequest = db.transaction(['keys'], 'readonly')
-                .objectStore('keys')
-                .index('alias')
-                .get(normalizedAlias);
-            getRequest.onsuccess = function (e) {
-                if (e.target.result) {
-                    reject(new Error('key alias already exists'));
-                    return;
-                }
-                let data = {};
-                data.alias = normalizedAlias;
-                data.auth = password;
-                createKey(data).then((res) => {
-                    let jsonData = JSON.parse(res.data);
-                    let dbData = {
-                        key:res.data,
-                        xpub:jsonData.xpub,
-                        alias:alias,
-                    };
-                    let request = db.transaction(['keys'], 'readwrite')
-                        .objectStore('keys')
-                        .add(dbData);
-                    request.onsuccess = function () {
-                        resolve({xpub:jsonData.xpub, alias: alias});
-                    };
-                    request.onerror = function () {
-                        reject(new Error('db insert error'));
-                    };
-                }).catch(error => {
-                    reject(error);    
-                });
-            };
-            getRequest.onerror = function () {
-                reject(new Error('db get error'));
-            };
-        }).catch(error => {
+        try{
+            let result = this.signMessageJs(message, password, keystore);
+            resolve(result);
+        }
+        catch(error) {
             reject(error);
-        });
+        }
     });
+
     return retPromise;
 };