@fioprotocol/fiojs
Version:
FioJS is a Utility SDK for packing, signing and encryption functionality for the FIO blockchain. It is used by the FIO TypeScript SDK
447 lines • 15.8 kB
JavaScript
"use strict";
var __read = (this && this.__read) || function (o, n) {
var m = typeof Symbol === "function" && o[Symbol.iterator];
if (!m) return o;
var i = m.call(o), r, ar = [], e;
try {
while ((n === void 0 || n-- > 0) && !(r = i.next()).done) ar.push(r.value);
}
catch (error) { e = { error: error }; }
finally {
try {
if (r && !r.done && (m = i["return"])) m.call(i);
}
finally { if (e) throw e.error; }
}
return ar;
};
var __spreadArray = (this && this.__spreadArray) || function (to, from, pack) {
if (pack || arguments.length === 2) for (var i = 0, l = from.length, ar; i < l; i++) {
if (ar || !(i in from)) {
if (!ar) ar = Array.prototype.slice.call(from, 0, i);
ar[i] = from[i];
}
}
return to.concat(ar || Array.prototype.slice.call(from));
};
var __values = (this && this.__values) || function(o) {
var s = typeof Symbol === "function" && Symbol.iterator, m = s && o[s], i = 0;
if (m) return m.call(o);
if (o && typeof o.length === "number") return {
next: function () {
if (o && i >= o.length) o = void 0;
return { value: o && o[i++], done: !o };
}
};
throw new TypeError(s ? "Object is not iterable." : "Symbol.iterator is not defined.");
};
Object.defineProperty(exports, "__esModule", { value: true });
exports.arrayToHex = exports.signatureToString = exports.stringToSignature = exports.privateKeyToString = exports.stringToPrivateKey = exports.convertLegacyPublicKeys = exports.convertLegacyPublicKey = exports.publicKeyToString = exports.stringToPublicKey = exports.signatureDataSize = exports.privateKeyDataSize = exports.publicKeyDataSize = exports.KeyType = exports.base64ToBinary = exports.binaryToBase58 = exports.base58ToBinary = exports.signedBinaryToDecimal = exports.binaryToDecimal = exports.signedDecimalToBinary = exports.decimalToBinary = exports.negate = exports.isNegative = void 0;
/**
* @module Numeric
*/
// copyright defined in fiojs/LICENSE.txt
var ripemd160 = require("./ecc").ripemd160;
var base58Chars = "123456789ABCDEFGHJKLMNPQRSTUVWXYZabcdefghijkmnopqrstuvwxyz";
var base64Chars = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/";
function create_base58_map() {
var base58M = Array(256).fill(-1);
for (var i = 0; i < base58Chars.length; ++i) {
base58M[base58Chars.charCodeAt(i)] = i;
}
return base58M;
}
var base58Map = create_base58_map();
function create_base64_map() {
var base64M = Array(256).fill(-1);
for (var i = 0; i < base64Chars.length; ++i) {
base64M[base64Chars.charCodeAt(i)] = i;
}
base64M["=".charCodeAt(0)] = 0;
return base64M;
}
var base64Map = create_base64_map();
/** Is `bignum` a negative number? */
function isNegative(bignum) {
return (bignum[bignum.length - 1] & 0x80) !== 0;
}
exports.isNegative = isNegative;
/** Negate `bignum` */
function negate(bignum) {
var carry = 1;
for (var i = 0; i < bignum.length; ++i) {
var x = (~bignum[i] & 0xff) + carry;
bignum[i] = x;
carry = x >> 8;
}
}
exports.negate = negate;
/**
* Convert an unsigned decimal number in `s` to a bignum
* @param size bignum size (bytes)
*/
function decimalToBinary(size, s) {
var result = new Uint8Array(size);
for (var i = 0; i < s.length; ++i) {
var srcDigit = s.charCodeAt(i);
if (srcDigit < "0".charCodeAt(0) || srcDigit > "9".charCodeAt(0)) {
throw new Error("invalid number");
}
var carry = srcDigit - "0".charCodeAt(0);
for (var j = 0; j < size; ++j) {
var x = result[j] * 10 + carry;
result[j] = x;
carry = x >> 8;
}
if (carry) {
throw new Error("number is out of range");
}
}
return result;
}
exports.decimalToBinary = decimalToBinary;
/**
* Convert a signed decimal number in `s` to a bignum
* @param size bignum size (bytes)
*/
function signedDecimalToBinary(size, s) {
var negative = s[0] === "-";
if (negative) {
s = s.substr(1);
}
var result = decimalToBinary(size, s);
if (negative) {
negate(result);
if (!isNegative(result)) {
throw new Error("number is out of range");
}
}
else if (isNegative(result)) {
throw new Error("number is out of range");
}
return result;
}
exports.signedDecimalToBinary = signedDecimalToBinary;
/**
* Convert `bignum` to an unsigned decimal number
* @param minDigits 0-pad result to this many digits
*/
function binaryToDecimal(bignum, minDigits) {
if (minDigits === void 0) { minDigits = 1; }
var result = Array(minDigits).fill("0".charCodeAt(0));
for (var i = bignum.length - 1; i >= 0; --i) {
var carry = bignum[i];
for (var j = 0; j < result.length; ++j) {
var x = ((result[j] - "0".charCodeAt(0)) << 8) + carry;
result[j] = "0".charCodeAt(0) + x % 10;
carry = (x / 10) | 0;
}
while (carry) {
result.push("0".charCodeAt(0) + carry % 10);
carry = (carry / 10) | 0;
}
}
result.reverse();
return String.fromCharCode.apply(String, __spreadArray([], __read(result), false));
}
exports.binaryToDecimal = binaryToDecimal;
/**
* Convert `bignum` to a signed decimal number
* @param minDigits 0-pad result to this many digits
*/
function signedBinaryToDecimal(bignum, minDigits) {
if (minDigits === void 0) { minDigits = 1; }
if (isNegative(bignum)) {
var x = bignum.slice();
negate(x);
return "-" + binaryToDecimal(x, minDigits);
}
return binaryToDecimal(bignum, minDigits);
}
exports.signedBinaryToDecimal = signedBinaryToDecimal;
/**
* Convert an unsigned base-58 number in `s` to a bignum
* @param size bignum size (bytes)
*/
function base58ToBinary(size, s) {
var result = new Uint8Array(size);
for (var i = 0; i < s.length; ++i) {
var carry = base58Map[s.charCodeAt(i)];
if (carry < 0) {
throw new Error("invalid base-58 value");
}
for (var j = 0; j < size; ++j) {
var x = result[j] * 58 + carry;
result[j] = x;
carry = x >> 8;
}
if (carry) {
throw new Error("base-58 value is out of range");
}
}
result.reverse();
return result;
}
exports.base58ToBinary = base58ToBinary;
/**
* Convert `bignum` to a base-58 number
* @param minDigits 0-pad result to this many digits
*/
function binaryToBase58(bignum, minDigits) {
var e_1, _a, e_2, _b;
if (minDigits === void 0) { minDigits = 1; }
var result = [];
try {
for (var bignum_1 = __values(bignum), bignum_1_1 = bignum_1.next(); !bignum_1_1.done; bignum_1_1 = bignum_1.next()) {
var byte = bignum_1_1.value;
var carry = byte;
for (var j = 0; j < result.length; ++j) {
var x = (base58Map[result[j]] << 8) + carry;
result[j] = base58Chars.charCodeAt(x % 58);
carry = (x / 58) | 0;
}
while (carry) {
result.push(base58Chars.charCodeAt(carry % 58));
carry = (carry / 58) | 0;
}
}
}
catch (e_1_1) { e_1 = { error: e_1_1 }; }
finally {
try {
if (bignum_1_1 && !bignum_1_1.done && (_a = bignum_1.return)) _a.call(bignum_1);
}
finally { if (e_1) throw e_1.error; }
}
try {
for (var bignum_2 = __values(bignum), bignum_2_1 = bignum_2.next(); !bignum_2_1.done; bignum_2_1 = bignum_2.next()) {
var byte = bignum_2_1.value;
if (byte) {
break;
}
else {
result.push("1".charCodeAt(0));
}
}
}
catch (e_2_1) { e_2 = { error: e_2_1 }; }
finally {
try {
if (bignum_2_1 && !bignum_2_1.done && (_b = bignum_2.return)) _b.call(bignum_2);
}
finally { if (e_2) throw e_2.error; }
}
result.reverse();
return String.fromCharCode.apply(String, __spreadArray([], __read(result), false));
}
exports.binaryToBase58 = binaryToBase58;
/** Convert an unsigned base-64 number in `s` to a bignum */
function base64ToBinary(s) {
var len = s.length;
if ((len & 3) === 1 && s[len - 1] === "=") {
len -= 1;
} // fc appends an extra '='
if ((len & 3) !== 0) {
throw new Error("base-64 value is not padded correctly");
}
var groups = len >> 2;
var bytes = groups * 3;
if (len > 0 && s[len - 1] === "=") {
if (s[len - 2] === "=") {
bytes -= 2;
}
else {
bytes -= 1;
}
}
var result = new Uint8Array(bytes);
for (var group = 0; group < groups; ++group) {
var digit0 = base64Map[s.charCodeAt(group * 4 + 0)];
var digit1 = base64Map[s.charCodeAt(group * 4 + 1)];
var digit2 = base64Map[s.charCodeAt(group * 4 + 2)];
var digit3 = base64Map[s.charCodeAt(group * 4 + 3)];
result[group * 3 + 0] = (digit0 << 2) | (digit1 >> 4);
if (group * 3 + 1 < bytes) {
result[group * 3 + 1] = ((digit1 & 15) << 4) | (digit2 >> 2);
}
if (group * 3 + 2 < bytes) {
result[group * 3 + 2] = ((digit2 & 3) << 6) | digit3;
}
}
return result;
}
exports.base64ToBinary = base64ToBinary;
/** Key types this library supports */
var KeyType;
(function (KeyType) {
KeyType[KeyType["k1"] = 0] = "k1";
KeyType[KeyType["r1"] = 1] = "r1";
})(KeyType = exports.KeyType || (exports.KeyType = {}));
/** Public key data size, excluding type field */
exports.publicKeyDataSize = 33;
/** Private key data size, excluding type field */
exports.privateKeyDataSize = 32;
/** Signature data size, excluding type field */
exports.signatureDataSize = 65;
function digestSuffixRipemd160(data, suffix) {
var d = new Uint8Array(data.length + suffix.length);
for (var i = 0; i < data.length; ++i) {
d[i] = data[i];
}
for (var i = 0; i < suffix.length; ++i) {
d[data.length + i] = suffix.charCodeAt(i);
}
return ripemd160(d);
}
function stringToKey(s, type, size, suffix) {
var whole = base58ToBinary(size + 4, s);
var result = { type: type, data: new Uint8Array(whole.buffer, 0, size) };
var digest = new Uint8Array(digestSuffixRipemd160(result.data, suffix));
if (digest[0] !== whole[size + 0] || digest[1] !== whole[size + 1]
|| digest[2] !== whole[size + 2] || digest[3] !== whole[size + 3]) {
throw new Error("checksum doesn't match");
}
return result;
}
function keyToString(key, suffix, prefix) {
var digest = new Uint8Array(digestSuffixRipemd160(key.data, suffix));
var whole = new Uint8Array(key.data.length + 4);
for (var i = 0; i < key.data.length; ++i) {
whole[i] = key.data[i];
}
for (var i = 0; i < 4; ++i) {
whole[i + key.data.length] = digest[i];
}
return prefix + binaryToBase58(whole);
}
/** Convert key in `s` to binary form */
function stringToPublicKey(s) {
if (typeof s !== "string") {
throw new Error("expected string containing public key");
}
if (s.substr(0, 3) === "FIO") {
var whole = base58ToBinary(exports.publicKeyDataSize + 4, s.substr(3));
var key = { type: KeyType.k1, data: new Uint8Array(exports.publicKeyDataSize) };
for (var i = 0; i < exports.publicKeyDataSize; ++i) {
key.data[i] = whole[i];
}
var digest = new Uint8Array(ripemd160(key.data));
if (digest[0] !== whole[exports.publicKeyDataSize] || digest[1] !== whole[34]
|| digest[2] !== whole[35] || digest[3] !== whole[36]) {
throw new Error("checksum doesn't match");
}
return key;
}
else if (s.substr(0, 7) === "PUB_K1_") {
return stringToKey(s.substr(7), KeyType.k1, exports.publicKeyDataSize, "K1");
}
else if (s.substr(0, 7) === "PUB_R1_") {
return stringToKey(s.substr(7), KeyType.r1, exports.publicKeyDataSize, "R1");
}
else {
throw new Error("unrecognized public key format");
}
}
exports.stringToPublicKey = stringToPublicKey;
/** Convert `key` to string (base-58) form */
function publicKeyToString(key) {
if (key.type === KeyType.k1 && key.data.length === exports.publicKeyDataSize) {
return keyToString(key, "K1", "PUB_K1_");
}
else if (key.type === KeyType.r1 && key.data.length === exports.publicKeyDataSize) {
return keyToString(key, "R1", "PUB_R1_");
}
else {
throw new Error("unrecognized public key format");
}
}
exports.publicKeyToString = publicKeyToString;
/** If a key is in the legacy format (`FIO` prefix), then convert it to the new format (`PUB_K1_`).
* Leaves other formats untouched
*/
function convertLegacyPublicKey(s) {
if (s.substr(0, 3) === "FIO") {
return publicKeyToString(stringToPublicKey(s));
}
return s;
}
exports.convertLegacyPublicKey = convertLegacyPublicKey;
/** If a key is in the legacy format (`FIO` prefix), then convert it to the new format (`PUB_K1_`).
* Leaves other formats untouched
*/
function convertLegacyPublicKeys(keys) {
return keys.map(convertLegacyPublicKey);
}
exports.convertLegacyPublicKeys = convertLegacyPublicKeys;
/** Convert key in `s` to binary form */
function stringToPrivateKey(s) {
if (typeof s !== "string") {
throw new Error("expected string containing private key");
}
if (s.substr(0, 7) === "PVT_R1_") {
return stringToKey(s.substr(7), KeyType.r1, exports.privateKeyDataSize, "R1");
}
else {
throw new Error("unrecognized private key format");
}
}
exports.stringToPrivateKey = stringToPrivateKey;
/** Convert `key` to string (base-58) form */
function privateKeyToString(key) {
if (key.type === KeyType.r1) {
return keyToString(key, "R1", "PVT_R1_");
}
else {
throw new Error("unrecognized private key format");
}
}
exports.privateKeyToString = privateKeyToString;
/** Convert key in `s` to binary form */
function stringToSignature(s) {
if (typeof s !== "string") {
throw new Error("expected string containing signature");
}
if (s.substr(0, 7) === "SIG_K1_") {
return stringToKey(s.substr(7), KeyType.k1, exports.signatureDataSize, "K1");
}
else if (s.substr(0, 7) === "SIG_R1_") {
return stringToKey(s.substr(7), KeyType.r1, exports.signatureDataSize, "R1");
}
else {
throw new Error("unrecognized signature format");
}
}
exports.stringToSignature = stringToSignature;
/** Convert `signature` to string (base-58) form */
function signatureToString(signature) {
if (signature.type === KeyType.k1) {
return keyToString(signature, "K1", "SIG_K1_");
}
else if (signature.type === KeyType.r1) {
return keyToString(signature, "R1", "SIG_R1_");
}
else {
throw new Error("unrecognized signature format");
}
}
exports.signatureToString = signatureToString;
function arrayToHex(data) {
var e_3, _a;
var result = "";
try {
for (var data_1 = __values(data), data_1_1 = data_1.next(); !data_1_1.done; data_1_1 = data_1.next()) {
var x = data_1_1.value;
result += ("00" + x.toString(16)).slice(-2);
}
}
catch (e_3_1) { e_3 = { error: e_3_1 }; }
finally {
try {
if (data_1_1 && !data_1_1.done && (_a = data_1.return)) _a.call(data_1);
}
finally { if (e_3) throw e_3.error; }
}
return result;
}
exports.arrayToHex = arrayToHex;
//# sourceMappingURL=chain-numeric.js.map