Skip to content

Commit 062ce38

Browse files
committed
1 support gm algorithm (sm2 sm3 sm4)
2 upgrade version to 0.6.68
1 parent 173c128 commit 062ce38

6 files changed

Lines changed: 195 additions & 44 deletions

File tree

lib/crypto.js

Lines changed: 9 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -122,6 +122,8 @@ function eciesDecrypt(messageHex, privateKey) {
122122
return plainMsgBuf;
123123
}
124124

125+
126+
125127
function hmac(key, bytes) {
126128
//debug('key: ', JSON.stringify(key));
127129
//debug('bytes: ', JSON.stringify(bytes));
@@ -211,7 +213,10 @@ function paddingPass(password,keyLen){
211213
var symEncrypt = function(symKey, plaintext, algType = 'aes') {
212214
if(algType === "gmAlg") {
213215
return keypairs.gmAlgSymEnc(symKey, plaintext);
214-
} else {
216+
} else if(algType === "softGMAlg"){
217+
return keypairs.softGMAlgSymEnc(symKey, plaintext);
218+
}
219+
else {
215220
return aesEncrypt(symKey, plaintext);
216221
}
217222
};
@@ -236,7 +241,9 @@ var aesEncrypt = function(secret, plaintext) {
236241
var symDecrypt = function(symKey, encryptedHex, algType = 'aes') {
237242
if(algType === "gmAlg") {
238243
return keypairs.gmAlgSymDec(symKey, encryptedHex);
239-
} else {
244+
} else if(algType === "softGMAlg"){
245+
return keypairs.softGMAlgSymDec(symKey, encryptedHex);
246+
}else {
240247
return aesDecrypt(symKey, encryptedHex);
241248
}
242249
};

lib/util.js

Lines changed: 94 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -29,25 +29,52 @@ function getSequence(api, address) {
2929

3030
}
3131

32-
function generateToken(key, secretIn) {
33-
let symKey = secretIn;
32+
/**
33+
*
34+
* @param {*} key asymmetrically encrypted public or private key
35+
* @param {*} symKey symmetrically encrypted key
36+
*/
37+
function generateToken(key, symKey) {
38+
3439
let token;
3540
const isUserPub = symKey ? true : false;
36-
symKey = symKey ? symKey : cryptoo.randomBytes(AESKeyLength / 2).toString('hex');
37-
if (key === "gmAlg" || keypairs.getCryptAlgType() === "gmAlg") {
41+
symKey = symKey ? symKey : cryptoo.randomBytes(AESKeyLength / 2).toString('hex');
42+
43+
var algType = "ecdsa-secp256k1";
44+
var encrytPub = "";
45+
if(isUserPub){
46+
algType = keypairs.getAlgFromPubKey(key);
47+
encrytPub = key;
48+
}else{
49+
algType = keypairs.getAlgFromPrivateKey(key);
50+
encrytPub = keypairs.deriveKeypair(key).publicKey;
51+
}
52+
53+
if ( algType === "gmAlg" ) {
3854
token = keypairs.gmAlgSm2Enc(key, symKey);
39-
} else {
40-
const userPub = isUserPub ? key : keypairs.deriveKeypair(key).publicKey;
41-
token = crypto.eciesEncrypt(symKey, userPub);
55+
}else if(algType === "softGMAlg") {
56+
57+
if(symKey && typeof symKey === "object" && Buffer.isBuffer(symKey)){
58+
symKey = symKey.toString('hex');
59+
}
60+
61+
token = keypairs.softGMAlgSm2Enc(symKey,encrytPub);
62+
}else {
63+
token = crypto.eciesEncrypt(symKey, encrytPub);
4264
}
4365
return token;
4466
}
4567

4668
function decodeToken(that, token) {
47-
let symKey;
69+
70+
let symKey;
71+
var regSoftGMSeed = /^[a-zA-Z1-9]{51,51}/
72+
4873
if(that.connect.secret === "gmAlg") {
4974
symKey = keypairs.gmAlgSm2Dec(that.connect.secret, token);
50-
} else {
75+
}else if( regSoftGMSeed.test(that.connect.secret)){
76+
symKey = keypairs.softGMAlgSm2Dec(that.connect.secret, token);
77+
}else {
5178
let keypair = keypairs.deriveKeypair(that.connect.secret);
5279
symKey = crypto.eciesDecrypt(token, keypair.privateKey);
5380
}
@@ -354,12 +381,66 @@ function decodeChainsqlAddr(addrStr){
354381
return hexAddrStr;
355382
}
356383

384+
385+
/**
386+
* 32 bytes hex string to base58 chainsql address
387+
* @param {string} : hexStr
388+
* @returns {string} : base58 address string
389+
*/
390+
function encodeChainsqlAccountSecret(hexStr){
391+
let hexArray = Buffer.from(hexStr,'hex');
392+
let encodeRes = addressCodec.encodeAccountPrivate(hexArray);
393+
return encodeRes;
394+
}
395+
396+
/**
397+
* base58 chainsql address to 32 bytes hex string
398+
* @param {string} : base58 address string
399+
* @returns {string} : hexStr
400+
*/
401+
function decodeChainsqlAccountSecret(accountSecretStr){
402+
let decodeRes = addressCodec.decodeAccountPrivate(accountSecretStr);
403+
//decodeRes is decimal, format to hex
404+
let hexAddrStr = Buffer.from(decodeRes).toString('hex');
405+
return hexAddrStr;
406+
}
407+
408+
/**
409+
* 获取账户使用的加密算法
410+
* "gmAlg" :硬国密
411+
* "normal":spec256k1
412+
* "softGMAlg": 软国密
413+
* "ed25519": ed25519
414+
* @param {*} account
415+
*/
416+
function getCryptAlgTypeFromAccout(account){
417+
418+
const CryptAlgType = {
419+
GMALG:"gmAlg",
420+
ED25519:"ed25519",
421+
SOFTGMALG:"softGMAlg",
422+
NORMAL:"normal"
423+
}
424+
425+
const regSoftGMSeed = /^[a-zA-Z1-9]{51,51}/
426+
427+
var cryptoAlg = CryptAlgType.NORMAL;
428+
if(account.secret === "gmAlg"){
429+
cryptoAlg = CryptAlgType.GMALG ;
430+
}else if(regSoftGMSeed.test(account.secret)){
431+
cryptoAlg = CryptAlgType.SOFTGMALG ;
432+
}
433+
434+
435+
return cryptoAlg;
436+
}
437+
438+
357439
module.exports = {
358-
getFee: getFee,
359-
getSequence: getSequence,
360440
convertStringToHex: convertStringToHex,
361441
convertHexToString : convertHexToString,
362442
unHexTxData: unHexTxData,
443+
getCryptAlgTypeFromAccout:getCryptAlgTypeFromAccout,
363444
getTableSequence: getTableSequence,
364445
getUserToken: getUserToken,
365446
getTableName: getTableName,
@@ -374,6 +455,8 @@ module.exports = {
374455
isMeaningless: isMeaningless,
375456
encodeChainsqlAddr: encodeChainsqlAddr,
376457
decodeChainsqlAddr: decodeChainsqlAddr,
458+
encodeChainsqlAccountSecret: encodeChainsqlAccountSecret,
459+
decodeChainsqlAccountSecret: decodeChainsqlAccountSecret,
377460
signData:signData,
378461
parseCb: parseCb,
379462
checkCbOpt:checkCbOpt,

package.json

Lines changed: 6 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1,14 +1,14 @@
11
{
22
"name": "chainsql",
3-
"version": "0.6.67",
3+
"version": "0.6.68",
44
"description": "An database driver for chainsql ",
55
"main": "src/index.js",
66
"scripts": {
7-
"test": "echo \"Error: no test specified\" && exit 1"
7+
"test": "mocha"
88
},
99
"dependencies": {
1010
"bignumber.js": "^2.4.0",
11-
"chainsql-keypairs": "^0.10.6",
11+
"chainsql-keypairs": "^0.10.11",
1212
"chainsql-lib": "^0.17.44",
1313
"co": "^4.6.0",
1414
"elliptic": "^5.1.0",
@@ -21,6 +21,9 @@
2121
"web3-utils": "1.0.0-beta.36",
2222
"ws": "^7.2.0"
2323
},
24+
"devDependencies": {
25+
"mocha": "~2.3.3"
26+
},
2427
"repository": {
2528
"type": "git",
2629
"url": "git+https://github.com/chainsql/node-chainsql-api"

src/index.js

Lines changed: 77 additions & 24 deletions
Original file line numberDiff line numberDiff line change
@@ -20,10 +20,9 @@ const Table = require('./table');
2020
const Contract = require('./smartContract');
2121
const util = require('../lib/util');
2222
const opType = require('../lib/config').opType;
23-
const getFee = util.getFee;
24-
const getSequence = util.getSequence;
2523
const convertStringToHex = util.convertStringToHex;
26-
const getTableSequence = util.getTableSequence;
24+
const getCryptAlgTypeFromAccout = util.getCryptAlgTypeFromAccout;
25+
2726
const getUserToken = util.getUserToken;
2827
const getTxJson = util.getTxJson;
2928
const generateToken = util.generateToken;
@@ -47,10 +46,10 @@ class ChainsqlAPI extends Submit {
4746
this.cache = [];
4847
this.strictMode = false;
4948
this.needVerify = 1;
50-
if(algType === "gmAlg" || algType === "normal") {
49+
if(algType === "gmAlg" || algType === "normal" || algType === "softGMAlg" ) {
5150
keypairs.setCryptAlgType(algType);
5251
} else {
53-
throw new Error("Wrong algType for ChainsqlAPI object, must be 'gmAlg' or 'normal'");
52+
throw new Error("Wrong algType for ChainsqlAPI object, must be 'gmAlg','softGMAlg' or 'normal'");
5453
}
5554
}
5655

@@ -112,10 +111,14 @@ ChainsqlAPI.prototype.disconnect = function (cb) {
112111
}
113112
}
114113
ChainsqlAPI.prototype.as = function (account) {
114+
115115
if(!account.secret || !account.address){
116116
throw chainsqlError("c.as parameter invalid,must contain 'secret' and 'address'");
117117
}
118-
this.connect.as(account);
118+
119+
// 根据账户信息判断底层的算法类型
120+
keypairs.setCryptAlgType(getCryptAlgTypeFromAccout(account));
121+
this.connect.as(account);
119122
}
120123
ChainsqlAPI.prototype.use = function (address) {
121124
this.connect.use(address);
@@ -151,27 +154,32 @@ ChainsqlAPI.prototype.contract = function(jsonInterface, address, options) {
151154
}
152155

153156
ChainsqlAPI.prototype.generateAddress = function () {
154-
var account;
157+
158+
var account = {secret:"",address:""};
155159
var keypair;
156160
let ripple = new RippleAPI();
157161
if (arguments.length == 0) {
158162
account = ripple.generateAddress();
159163
keypair = keypairs.deriveKeypair(account.secret);
160164
} else {
161165
if(typeof(arguments[0]) === "object" ) {
162-
let secretNew = keypairs.generateSeed(arguments[0]);
163-
keypair = keypairs.deriveKeypair(secretNew);
164-
account = {
165-
secret: secretNew,
166-
address: keypairs.deriveAddress(keypair.publicKey)
167-
}
168-
} else {
169-
keypair = keypairs.deriveKeypair(arguments[0]);
170-
account = {
171-
secret: arguments[0],
172-
address: keypairs.deriveAddress(keypair.publicKey)
166+
let seed = keypairs.generateSeed(arguments[0]);
167+
keypair = keypairs.deriveKeypair(seed);
168+
169+
if(typeof(seed) !== "object"){
170+
// ed25519
171+
account.secret = seed;
172+
}else{
173+
// softGMAlg
174+
account.secret = util.encodeChainsqlAccountSecret(keypair.privateKey)
173175
}
176+
177+
} else {
178+
keypair = keypairs.deriveKeypair(arguments[0])
179+
account.secret =arguments[0]
174180
}
181+
182+
account.address = keypairs.deriveAddress(keypair.publicKey);
175183
}
176184
var opt = {
177185
version: 35
@@ -305,19 +313,22 @@ ChainsqlAPI.prototype.createTable = function (name, raw, inputOpt) {
305313
};
306314

307315
if (confidential) {
308-
var token = generateToken(that.connect.secret);
316+
var token = generateToken(that.connect.secret);
309317
var symKey = decodeToken(that, token);
318+
var regSoftGMSeed = /^[a-zA-Z1-9]{51,51}/
319+
310320
if(that.connect.secret === "gmAlg") {
311321
payment.raw = crypto.symEncrypt(symKey, payment.raw, "gmAlg").toUpperCase();
312-
} else {
322+
}else if( regSoftGMSeed.test(that.connect.secret)){
323+
payment.raw = crypto.symEncrypt(symKey, payment.raw, "softGMAlg").toUpperCase();
324+
}
325+
else {
313326
payment.raw = crypto.symEncrypt(symKey, payment.raw).toUpperCase();
314-
}
315-
327+
}
316328
payment.token = token.toUpperCase();
317329
} else {
318330
payment.raw = convertStringToHex(payment.raw);
319331
}
320-
321332
if (payment.operationRule) {
322333
payment.operationRule = convertStringToHex(payment.operationRule);
323334
}
@@ -774,6 +785,7 @@ function handleGrantPayment(ChainSQL) {
774785
reject(chainsqlError('your publicKey is not validate'));
775786
}
776787
ChainSQL.payment.token = token;
788+
console.log("token : ",token)
777789
}
778790
delete ChainSQL.payment.name;
779791
delete ChainSQL.payment.publicKey;
@@ -802,6 +814,47 @@ ChainsqlAPI.prototype.eciesDecrypt = function (cipher, secret) {
802814
return crypto.eciesDecrypt(cipher,keypair.privateKey);
803815
}
804816

817+
818+
819+
/**
820+
* 对称加密
821+
* @param {*} plainText
822+
* @param {*} publicKey
823+
*/
824+
ChainsqlAPI.prototype.symEncrypt = function (symKey, plaintext, algType = 'aes') {
825+
return crypto.symEncrypt(symKey,plaintext,algType);
826+
}
827+
828+
/**
829+
* 对称解密
830+
* @param {*} cipher
831+
* @param {*} privateKey
832+
*/
833+
ChainsqlAPI.prototype.symDecrypt = function (symKey, encryptedHex, algType = 'aes') {
834+
835+
return crypto.symDecrypt(symKey, encryptedHex, algType);
836+
}
837+
838+
/**
839+
* 非对称加密
840+
* @param {*} plainText
841+
* @param {*} publicKey
842+
*/
843+
ChainsqlAPI.prototype.asymEncrypt = function (plainText, publicKey) {
844+
return keypairs.asymEncrypt(plainText,publicKey);
845+
}
846+
847+
/**
848+
* 非对称解密
849+
* @param {*} cipher
850+
* @param {*} privateKey
851+
*/
852+
ChainsqlAPI.prototype.asymDecrypt = function (cipher, privateKey) {
853+
854+
return keypairs.asymDecrypt(cipher,privateKey);
855+
}
856+
857+
805858
ChainsqlAPI.prototype.getAccountTables = function(address, bGetDetailInfo=false){
806859
var connection = this.api ? this.api.connection : this.connect.api.connection;
807860
return new Promise(function(resolve, reject){
@@ -927,7 +980,7 @@ ChainsqlAPI.prototype.getLedgerTxs = function(ledgerIndex,includeSuccess,include
927980

928981
ChainsqlAPI.prototype.signFromString = function (messageHex, secret) {
929982

930-
var keypair = keypairs.deriveKeypair(secret);
983+
var keypair = keypairs.deriveKeypair(secret);
931984
var signatue = keypairs.sign(messageHex,keypair.privateKey);
932985
return signatue;
933986
};

src/submit.js

Lines changed: 1 addition & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -20,9 +20,7 @@ Submit.prototype.submit = function (expectOpt) {
2020
try {
2121
self.prepareJson().then(function (prepared) {
2222
self.txJSON = prepared.txJSON;
23-
24-
self.setCert();
25-
23+
self.setCert();
2624
let signedRet = self.signTx();
2725
self.handleSignedTx(self.ChainsqlAPI, signedRet, expectOpt, resolve, reject);
2826
}).catch(function (error) {

0 commit comments

Comments
 (0)