UNPKG

mam.ts

Version:
206 lines 8.12 kB
"use strict"; Object.defineProperty(exports, "__esModule", { value: true }); var IOTA = require('./IOTA.js'); ////////////////////////////////////////////////////////////////// /* ======= CTrits bindings ======= */ var TritEncoding = { BYTE: 1, TRIT: 2, TRYTE: 3 }; /* ======= Rust bindings ======= */ var iota_ctrits_drop = IOTA.cwrap('iota_ctrits_drop', '', ['number']); var iota_ctrits_convert = IOTA.cwrap('iota_ctrits_convert', 'number', [ 'number', 'number' ]); var iota_ctrits_ctrits_from_trytes = IOTA.cwrap('iota_ctrits_ctrits_from_trytes', 'number', ['string', 'number']); var iota_ctrits_ctrits_from_bytes = IOTA.cwrap('iota_ctrits_ctrits_from_bytes', 'number', ['number', 'number']); var iota_ctrits_ctrits_from_trits = IOTA.cwrap('iota_ctrits_ctrits_from_trits', 'number', ['number', 'number']); // For accessing the struct members var iota_ctrits_ctrits_encoding = IOTA.cwrap('iota_ctrits_ctrits_encoding', 'number', ['number']); var iota_ctrits_ctrits_length = IOTA.cwrap('iota_ctrits_ctrits_length', 'number', ['number']); var iota_ctrits_ctrits_data = IOTA.cwrap('iota_ctrits_ctrits_data', 'number', ['number']); var iota_ctrits_ctrits_byte_length = IOTA.cwrap('iota_ctrits_ctrits_byte_length', 'number', ['number']); var iota_mam_id = IOTA.cwrap('iota_mam_id', 'number', [ 'number', 'number' ]); // (seed, message, key, root, siblings, next_root, start, index, security) -> encoded_message var iota_mam_create = IOTA.cwrap('iota_mam_create', 'number', [ 'number', 'number', 'number', 'number', 'number', 'number', 'number', 'number', 'number' ]); // (encoded_message, key, root, index) -> message var iota_mam_parse = IOTA.cwrap('iota_mam_parse', 'number', [ 'number', 'number', 'number', 'number' ]); // (seed, index, count, securit) -> MerkleTree instance var iota_merkle_create = IOTA.cwrap('iota_merkle_create', 'number', [ 'number', 'number', 'number', 'number' ]); // (MerkleTree instance) -> () var iota_merkle_drop = IOTA.cwrap('iota_merkle_drop', '', ['number']); // (MerkleTree instance) -> (siblings as number) var iota_merkle_siblings = IOTA.cwrap('iota_merkle_siblings', 'number', [ 'number' ]); // (MerkleTree instance, index) -> (MerkleBranch instance) var iota_merkle_branch = IOTA.cwrap('iota_merkle_branch', 'number', [ 'number', 'number' ]); // (MerkleBranch instance) -> () var iota_merkle_branch_drop = IOTA.cwrap('iota_merkle_branch_drop', '', [ 'number' ]); // (MerkleBranch instance) -> (number) var iota_merkle_branch_len = IOTA.cwrap('iota_merkle_branch_len', '', [ 'number' ]); // (address, siblings, index) -> (root as number) var iota_merkle_root = IOTA.cwrap('iota_merkle_root', 'number', [ 'number', 'number', 'number' ]); // (MerkleTree instance) -> root hash var iota_merkle_slice = IOTA.cwrap('iota_merkle_slice', 'number', ['number']); var string_to_ctrits_trits = function (str) { var strin = iota_ctrits_ctrits_from_trytes(str, str.length); var out = iota_ctrits_convert(strin, TritEncoding.TRIT); iota_ctrits_drop(strin); return out; }; var ctrits_trits_to_string = function (ctrits) { var str_trits = iota_ctrits_convert(ctrits, TritEncoding.TRYTE); var ptr = iota_ctrits_ctrits_data(str_trits); var len = iota_ctrits_ctrits_length(str_trits); var out = IOTA.Pointer_stringify(ptr, len); iota_ctrits_drop(str_trits); return out; }; var getMamRoot = function (SEED, CHANNEL) { var SEED_trits = string_to_ctrits_trits(SEED); var root_merkle = iota_merkle_create(SEED_trits, CHANNEL.start, CHANNEL.count, CHANNEL.security); return ctrits_trits_to_string(iota_merkle_slice(root_merkle)); }; var getMamAddress = function (KEY, ROOT) { var KEY_trits = string_to_ctrits_trits(KEY); var ROOT_trits = string_to_ctrits_trits(ROOT); var address = iota_mam_id(KEY_trits, ROOT_trits); return ctrits_trits_to_string(address); }; var createMessage = function (SEED, MESSAGE, SIDE_KEY, CHANNEL) { if (!SIDE_KEY) SIDE_KEY = '999999999999999999999999999999999999999999999999999999999999999999999999999999999'; // MAM settings var SEED_trits = string_to_ctrits_trits(SEED); var MESSAGE_trits = string_to_ctrits_trits(MESSAGE); var SIDE_KEY_trits = string_to_ctrits_trits(SIDE_KEY); var SECURITY = CHANNEL.security; var START = CHANNEL.start; var COUNT = CHANNEL.count; var NEXT_START = START + COUNT; var NEXT_COUNT = CHANNEL.next_count; var INDEX = CHANNEL.index; var HASH_LENGTH = 81; // set up merkle tree var root_merkle = iota_merkle_create(SEED_trits, START, COUNT, SECURITY); var next_root_merkle = iota_merkle_create(SEED_trits, NEXT_START, NEXT_COUNT, SECURITY); var root_branch = iota_merkle_branch(root_merkle, INDEX); var root_siblings = iota_merkle_siblings(root_branch); var next_root_branch = iota_merkle_branch(next_root_merkle, INDEX); var root = iota_merkle_slice(root_merkle); var next_root = iota_merkle_slice(next_root_merkle); var masked_payload = iota_mam_create(SEED_trits, MESSAGE_trits, SIDE_KEY_trits, root, root_siblings, next_root, START, INDEX, SECURITY); var response = { payload: ctrits_trits_to_string(masked_payload), root: ctrits_trits_to_string(root), next_root: ctrits_trits_to_string(next_root), side_key: SIDE_KEY }; // Clean up memory. Unneccessary for this example script, but should be done when running in a production // environment. iota_merkle_branch_drop(root_branch); iota_merkle_branch_drop(next_root_branch); iota_merkle_drop(root_merkle); iota_merkle_drop(next_root_merkle); [ SEED_trits, MESSAGE_trits, SIDE_KEY_trits, root, next_root, masked_payload, root_siblings ].forEach(iota_ctrits_drop); return response; }; var decodeMessage = function (PAYLOAD, SIDE_KEY, ROOT) { if (!SIDE_KEY) SIDE_KEY = '999999999999999999999999999999999999999999999999999999999999999999999999999999999'; var PAYLOAD_trits = string_to_ctrits_trits(PAYLOAD); var SIDE_KEY_trits = string_to_ctrits_trits(SIDE_KEY); var ROOT_trits = string_to_ctrits_trits(ROOT); var parse_result; try { parse_result = iota_mam_parse(PAYLOAD_trits, SIDE_KEY_trits, ROOT_trits); } catch (err) { console.log("Payload Trits:"); console.log(PAYLOAD_trits); console.log("Sidekey Trits:"); console.log(SIDE_KEY_trits); console.log("Root Trits:"); console.log(ROOT_trits); console.log("Result Error:"); console.log(parse_result); console.log("Parse Error: " + err); } var unmasked_payload_ctrits = IOTA.getValue(parse_result, 'i32'); var unmasked_payload = ctrits_trits_to_string(unmasked_payload_ctrits); var unmasked_next_root_ctrits = IOTA.getValue(parse_result + 4, 'i32'); var unmasked_next_root = ctrits_trits_to_string(unmasked_next_root_ctrits); [ PAYLOAD_trits, SIDE_KEY_trits, ROOT_trits, unmasked_payload_ctrits, unmasked_next_root_ctrits ].forEach(iota_ctrits_drop); IOTA._free(parse_result); return { payload: unmasked_payload, next_root: unmasked_next_root }; }; exports.Mam = { decodeMessage: decodeMessage, createMessage: createMessage, getMamAddress: getMamAddress, getMamRoot: getMamRoot }; exports.MamDetails = { string_to_ctrits_trits: string_to_ctrits_trits, iota_merkle_create: iota_merkle_create, iota_merkle_branch: iota_merkle_branch, iota_merkle_siblings: iota_merkle_siblings, iota_merkle_slice: iota_merkle_slice, ctrits_trits_to_string: ctrits_trits_to_string }; // Feed Mam functions into the main file //Main.setupEnv(Mam) // Export //export = Main; //# sourceMappingURL=node.js.map