UNPKG

@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
"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