0.1.5 • Published 6 months ago

gm-crypto-wasm v0.1.5

Weekly downloads
-
License
MIT
Repository
github
Last release
6 months ago

gm-crypto-wasm

密码行业标准化委员会

This is the wasm version of gm-crypto, it has better performance.

Quick Start

Install

Using npm:

$ npm install gm-crypto-wasm

Using yarn:

$ yarn add gm-crypto-wasm

Using pnpm:

$ pnpm add gm-crypto-wasm

Basic Usage

SM2

Public Key Cryptographic Algorithm Based on Elliptic Curves.

import { SM2 } from "gm-crypto-wasm";

const { publicKey, privateKey } = SM2.generateKeyPair();
const originalData = "SM2 椭圆曲线公钥密码算法";

const encryptedData = SM2.encrypt(originalData, publicKey, {
  inputEncoding: "utf8",
  outputEncoding: "base64",
});

const decryptedData = SM2.decrypt(encryptedData, privateKey, {
  inputEncoding: "base64",
  outputEncoding: "utf8",
});

SM3

Cryptographic Hash Algorithm.

import { SM3 } from "gm-crypto-wasm";

console.log(SM3.digest("abc"));
console.log(SM3.digest("YWJj", "base64"));
console.log(SM3.digest("616263", "hex", "base64"));

SM4

Block Cipher Algorithm.

import { SM4 } from "gm-crypto-wasm";

const key = "0123456789abcdeffedcba9876543210"; // Any string of 32 hexadecimal digits
const originalData = "SM4 国标对称加密";

/**
 * Block cipher modes:
 * - ECB: electronic codebook
 * - CBC: cipher block chaining
 */

let encryptedData, decryptedData;

// ECB
encryptedData = SM4.encrypt(originalData, key, {
  inputEncoding: "utf8",
  outputEncoding: "base64",
});
decryptedData = SM4.decrypt(encryptedData, key, {
  inputEncoding: "base64",
  outputEncoding: "utf8",
});

// CBC
const iv = "0123456789abcdeffedcba9876543210"; // Initialization vector(any string of 32 hexadecimal digits)
encryptedData = SM4.encrypt(originalData, key, {
  iv: iv,
  mode: SM4.constants.CBC,
  inputEncoding: "utf8",
  outputEncoding: "hex",
});
decryptedData = SM4.decrypt(encryptedData, key, {
  iv: iv,
  mode: SM4.constants.CBC,
  inputEncoding: "hex",
  outputEncoding: "utf8",
});

benchmark

// Why is there no sm3?
// Because the calculation amount of sm3 is very small, the speed of js is already fast enough, and the loss of wasm data transmission is much greater than the calculation of js.
// So we used the js version of sm3

// pnpm bench
 DEV  v0.34.6

 ✓ bench/index.benchmark.ts (4) 10171ms
   ✓ sm2 (2) 9418ms
     name       hz      min      max     mean      p75      p99     p995     p999     rme  samples
   · js    19.1045  50.6476  60.2170  52.3436  53.0553  56.0920  60.2170  60.2170  ±0.50%      100
   · wasm  42.6254  21.5548  28.9284  23.4602  24.0769  28.8488  28.9284  28.9284  ±1.14%      100   fastest
   ✓ sm4 (2) 10167ms
     name       hz     min      max     mean      p75      p99     p995     p999     rme  samples
   · js    99.4326  9.6209  10.6127  10.0571  10.2032  10.5983  10.6127  10.6127  ±0.46%      100
   · wasm   136.29  6.3064   8.6758   7.3375   8.1883   8.6321   8.6758   8.6758  ±2.33%      100   fastest


 BENCH  Summary

  wasm - bench/index.benchmark.ts > sm2
    2.23x faster than js

  wasm - bench/index.benchmark.ts > sm4
    1.37x faster than js

API

SM2.generateKeyPair()

Generates a new asymmetric key pair.

SM2.encrypt(data, key, options)

Encrypt data.

ParamTypeDefaultDescription
datastring|ArrayBuffer|BufferPlain message
keystringPublic key generated by SM2.generateKeyPair()
optionsobjectOptions
options.modeC1C3C2 | C1C2C3C1C3C2Concatenation mode
options.inputEncodingstring"utf8"The encoding of the plain data string,if data is not a string then inputEncoding is ignored.
options.outputEncodingstringIf outputEncoding is provided, a string will be returned, otherwise a ArrayBuffer is returned.
options.pcbooleanfalseIncludes PC mark as first byte

SM2.decrypt(data, key, options)

Decrypt data.

ParamTypeDefaultDescription
datastring|ArrayBuffer|BufferCiphered data
keystringPrivate key generated by SM2.generateKeyPair()
options.modeC1C3C2 | C1C2C3C1C3C2Concatenation mode
options.inputEncodingstringThe encoding of the plain data string,if data is not a string then inputEncoding is ignored.
options.outputEncodingstringIf outputEncoding is provided, a string will be returned, otherwise a ArrayBuffer is returned.
options.pcbooleanfalseIncludes PC mark as first byte

SM3.digest(data, inputEncoding, outputEncoding)

Calculates the digest.

ParamTypeDefaultDescription
datastring|ArrayBuffer|BufferData message
inputEncodingstring"utf8"The encoding of the data string, if data is not a string then inputEncoding is ignored.
outputEncodingstringIf outputEncoding is provided, a string will be returned, otherwise a ArrayBuffer is returned.

SM4.encrypt(data, key, options)

Encrypt data.

ParamTypeDefaultDescription
datastring|ArrayBuffer|BufferPlain message
keystringCipher key(any string of 32 hexadecimal digits)
optionsobjectOptions
options.modeECB | CBCECBBlock cipher mode
options.ivstringInitialization vector(any string of 32 hexadecimal digits)
options.inputEncodingstring"utf8"The encoding of the plain data string,if data is not a string then inputEncoding is ignored.
options.outputEncodingstringIf outputEncoding is provided, a string will be returned, otherwise a ArrayBuffer is returned.

SM4.decrypt(data, key, options)

Decrypt data.

ParamTypeDefaultDescription
datastring|ArrayBuffer|BufferCiphered data
keystringCipher key(any string of 32 hexadecimal digits)
optionsobjectOptions
options.modeECB | CBCECBBlock cipher mode
options.ivstringInitialization vector(any string of 32 hexadecimal digits)
options.inputEncodingstringThe encoding of the plain data string,if data is not a string then inputEncoding is ignored.
options.outputEncodingstringIf outputEncoding is provided, a string will be returned, otherwise a ArrayBuffer is returned.
0.1.5

6 months ago

0.1.4

6 months ago

0.1.3

6 months ago

0.1.2

6 months ago