/* * @project: TERA * @version: Development (beta) * @license: MIT (not for evil) * @copyright: Yuriy Ivanov (Vtools) 2017-2019 [progr76@gmail.com] * Web: https://terafoundation.org * Twitter: https://twitter.com/terafoundation * Telegram: https://t.me/terafoundation */ "use strict"; require('../core/crypto-library'); const OPEN_TYPE_TRANSACTION = 11; const MESSAGE_TYPE_TRANSACTION = 12; const MAX_MSG_SIZE = 1024; var TempArrayTr = new Uint8Array(MAX_MSG_SIZE); const MESSAGE_START = 9; const MESSAGE_END = MAX_MSG_SIZE - 5; import './names' import DApp from './dapp' export default class MessagerApp extends DApp { Server Channels NamesMap constructor() { super() this.Channels = {} this.NamesMap = global.NAMES.KeyValueMap global.MESSAGER = this } Decrypt(Body) { for (var key in this.Channels) { var Node = this.Channels[key]; global.Decrypt(Body, TempArrayTr, Node.Secret) if (global.IsZeroArr(TempArrayTr.slice(MESSAGE_END))) { var Str = global.Utf8ArrayToStr(TempArrayTr.slice(MESSAGE_START)); return Str; } } return undefined; } Encrypt(StrMessage, StrTo) { var NameArr; if (typeof StrTo === "string") { NameArr = global.GetArrFromStr(StrTo, 32) } else { NameArr = StrTo } var arrMessage = global.GetArrFromStr(StrMessage, MESSAGE_END); var ArrayTr = new Uint8Array(MAX_MSG_SIZE); ArrayTr[0] = MESSAGE_TYPE_TRANSACTION for (var i = 5; i < MAX_MSG_SIZE; i++) { ArrayTr[i] = arrMessage[i - MESSAGE_START] } var Body = new Uint8Array(MAX_MSG_SIZE); var Node = this.OpenChannel(NameArr); global.Encrypt(ArrayTr, Body, Node.Secret) return Body; } OpenChannel(FromNameArr) { var FromArr; var StrKeyFrom = global.GetHexFromAddres(FromNameArr); if (this.NamesMap[StrKeyFrom]) { FromArr = this.NamesMap[StrKeyFrom] } else { FromArr = FromNameArr } var StrKey = global.GetHexFromAddres(FromArr); var Node = this.Channels[StrKey]; if (!Node) { Node = { addrArr: FromArr } global.CheckContextSecret(this.Server, Node) this.Channels[StrKey] = Node } return Node; } OnWriteTransaction(Block, Body, BlockNum, TrNum) { var Type = Body[0]; if (Type === OPEN_TYPE_TRANSACTION) { var ToArr = Body.slice(33); if (global.CompareArr(ToArr, global.NAMES.CurrentNameArr) === 0 || global.CompareArr(ToArr, this.Server.addrArr) === 0) { var FromNameArr = Body.slice(1, 33); this.OpenChannel(FromNameArr) } } else if (Type === MESSAGE_TYPE_TRANSACTION) { var Str = this.Decrypt(Body); if (Str !== undefined) global.ToLog("GET MESSAGE:" + Str) } } OnMessage(Msg) { global.ToLog("GET MESSAGE:" + Msg.body) return; var Body = Msg.body; var Type = Body[0]; if (Type === MESSAGE_TYPE_TRANSACTION) { var Str = this.Decrypt(Body); if (Str !== undefined) { global.ToLog("GET MESSAGE:" + Str) } } } }; function TestEncryptDecrypt() { const CMessager = module.exports; var Server = { KeyPair: global.GetKeyPairTest("Test"), DApp: { Names: { KeyValueMap: {} } }, }; var Test = new CMessager(Server); var KeyPair2 = global.GetKeyPairTest("Test2"); var StrTest1 = global.GetArrFromStr("Test2", 32); var StrKey = global.GetHexFromAddres(StrTest1); global.MESSAGER.NamesMap[StrKey] = KeyPair2.addrArr; var Body = global.MESSAGER.Encrypt("This is a test message!", "Test2"); var Str2 = global.MESSAGER.Decrypt(Body); console.log("Decrypt:"); console.log(Str2); }; var messager = new MessagerApp(); global.DApps.Messager = messager; global.DAppByType[OPEN_TYPE_TRANSACTION] = messager; global.DAppByType[MESSAGE_TYPE_TRANSACTION] = messager;