@dioxide-js/silas
Version:
RPC utility for Silas
144 lines (141 loc) • 5.49 kB
JavaScript
import { __awaiter } from '../../node_modules/tslib/tslib.es6.mjs';
import { dataview } from '../../node_modules/@dioxide-js/misc/dist/misc.es5.mjs';
import { getPublicKey, verify, sign } from '../../node_modules/@noble/ed25519/lib/esm/index.mjs';
import base32Encode from '../../_virtual/index2.mjs';
import sha256 from '../../_virtual/nodecrypto.mjs';
import crc32c from '../../_virtual/crc32c.mjs';
import crypto from 'crypto';
import { formatedSalt, encodeMnemonic } from './base.mjs';
class ECDSA {
constructor(options) {
this.privateKeyU8 = new Uint8Array();
this.encryptMethod = 'sm2';
this.encryptOrderNum = 4;
this.saltRef = 1;
this.salt = new Uint8Array();
this.seed = new Uint8Array();
this.alias = 'Address1';
this.words = [];
if (options === null || options === void 0 ? void 0 : options.privateKey) {
const { privateKey } = options;
if (!(privateKey instanceof Uint8Array)) {
throw `Illegal privatekey, expect Uint8Array`;
}
this.salt = formatedSalt(this.saltRef);
this.seed = this.generateSeed();
this.privateKeyU8 = this.get32bPrivateKey(options.privateKey);
this.privateKey = dataview.u8ToHex(this.privateKeyU8);
}
}
generateSeed(seed) {
let seedU8 = [];
if (!seed) {
const tableContainer = new Uint8Array(27);
const randomData = crypto.getRandomValues(tableContainer);
seedU8 = randomData;
}
else {
seedU8 = seed;
}
this.words = encodeMnemonic(seedU8);
return new Uint8Array(seedU8);
}
generate() {
return __awaiter(this, void 0, void 0, function* () {
const [pku8, sku8] = yield this.keyPaires();
const address = this.pkToAddress(pku8, true);
const sk = dataview.u8ToHex(sku8);
const pk = dataview.u8ToHex(pku8);
return { publickey: pk, privatekey: sk, pku8, sku8, address };
});
}
pkToAddrU8(publickey) {
if (publickey.length !== 32) {
throw 'expect 32 bytes publick key';
}
const o = this.pkToDIOStruct(publickey);
return o.address;
}
pkToAddress(publickey, postfix = true) {
const u8 = this.pkToAddrU8(publickey);
const address = base32Encode(u8, 'Crockford').toLowerCase();
return postfix ? address + ':' + this.encryptMethod : address;
}
getPubicKeyFromPrivateKey(privateKey) {
if (typeof privateKey === 'string') {
privateKey = dataview.hexToU8(privateKey);
}
return getPublicKey(privateKey);
}
pkToDIOStruct(publicKey, salt = 1, alias) {
const order = this.encryptOrderNum;
const method = this.encryptMethod;
let errorCorrectingCode = crc32c.buf(publicKey, order);
errorCorrectingCode = (errorCorrectingCode & 0xfffffff0) | order;
errorCorrectingCode = errorCorrectingCode >>> 0;
const buffer = new Int32Array([errorCorrectingCode]).buffer;
const errorCorrectingCodeBuffer = new Uint8Array(buffer);
const mergedBuffer = dataview.concat(publicKey, errorCorrectingCodeBuffer);
const address = {
currency: 'DIO',
address: mergedBuffer,
encryptMethod: method,
encryptMethodOrderNumber: order,
salt: salt || 1,
alias: alias || `Address${salt}`,
};
return address;
}
keyPaires() {
return __awaiter(this, void 0, void 0, function* () {
let publicKey;
let privateKey;
if (this.privateKey && this.privateKeyU8) {
privateKey = this.privateKeyU8;
publicKey = yield getPublicKey(privateKey);
}
else {
const [pk, sk] = yield seed2PairOfKey(this.seed, this.salt);
publicKey = pk;
privateKey = sk;
}
return [publicKey, privateKey];
});
}
sign(content, privateKey) {
return __awaiter(this, void 0, void 0, function* () {
if (Array.isArray(content)) {
const message = Uint8Array.from(content);
return sign(message, privateKey);
}
privateKey = this.get32bPrivateKey(privateKey);
return sign(content, privateKey);
});
}
get32bPrivateKey(sk) {
const l = sk.length;
if (!(l === 64 || l === 32)) {
throw `Illegal PrivateKey format, expect 32 bytes 64 bytes`;
}
return sk.length === 64 ? sk.slice(0, 32) : sk;
}
verify(msg, sigValueHex, publicKey) {
const pk = dataview.u8ToHex(publicKey);
if (Array.isArray(msg)) {
msg = Uint8Array.from(msg);
msg = dataview.u8ToHex(msg);
}
return verify(sigValueHex, msg, pk);
}
}
function seed2PairOfKey(seed_1) {
return __awaiter(this, arguments, void 0, function* (seed, salt = new Uint8Array()) {
const formatedSeed = dataview.concat(seed, salt);
const privateKeyStr = sha256(formatedSeed, { asBytes: true });
const privateKey = new Uint8Array(privateKeyStr);
const publicKey = yield getPublicKey(privateKey);
return [publicKey, privateKey];
});
}
export { ECDSA as default };
//# sourceMappingURL=ecdsa.mjs.map