From 7a5cca28b1bbea74075170be710abbdd9d0914d2 Mon Sep 17 00:00:00 2001 From: minecartchris Date: Sat, 7 Feb 2026 16:55:07 -0600 Subject: [PATCH] Add wirelessCode/wireless.lua --- wirelessCode/wireless.lua | 118 ++++++++++++++++++++++++++++++++++++++ 1 file changed, 118 insertions(+) create mode 100644 wirelessCode/wireless.lua diff --git a/wirelessCode/wireless.lua b/wirelessCode/wireless.lua new file mode 100644 index 0000000..1845d78 --- /dev/null +++ b/wirelessCode/wireless.lua @@ -0,0 +1,118 @@ +local key = "" +local wirelessChannel = 44385 + +local wirelessModem = assert(peripheral.wrap("top")) + +wirelessModem.open(wirelessChannel) + +local random = require("ccryptolib.random") +local aead = require("ccryptolib.aead") + +local seed = "" +-- this isnt exactly secure, but its fine, probably.. +for i=1,64 do + seed = seed .. string.char(math.random(0, 255)) +end + +random.init(seed) + +local function encrypt(message) + local nonce = random.random(12) + local ciphertext, tag = aead.encrypt(key, nonce, message, "") + + return nonce..tag..ciphertext +end + +local function decrypt(message) + local ciphertextLength = #message-12-16 + + if ciphertextLength < 0 then + printError("message too short, this may be caused by other traffic on the same port") + return + end + + if ciphertextLength >= 32768 then + printError("message too large, this may be caused by other traffic on the same port") + return + end + + local nonce, tag, endPos = string.unpack("c12c16", message) + local ciphertext = message:sub(endPos) + + local decryptedMessage = aead.decrypt(key, nonce, tag, ciphertext, "") -- this is nil if auth failed + + if not decryptedMessage then + printError("message auth invalid") + return + end + + return decryptedMessage +end + +local function sendWireless(tbl) + local str = textutils.serialize(tbl) + + if not str then + printError("failed to serialize message") + return + end + + local enc = encrypt(str) + + if not enc then + printError("failed to encrypt serialized message") + return + end + + wirelessModem.transmit(wirelessChannel, wirelessChannel, enc) +end + +local function recvWireless() + while true do + local event, side, channel, replyChannel, message, distance = os.pullEvent("modem_message") + if side == peripheral.getName(wirelessModem) and channel == wirelessChannel then + local dec = decrypt(message) + if dec then + local unser = textutils.unserialize(dec) + if unser then + return unser + else + printError("failed to unserialize") + end + end + end + end +end + +return { + broadcast = function(data, protocol) + local message_wrapper = { + nMessageID = math.random(1, 2147483647), -- we dont store messageid here because we shouldnt get our messages back + nRecipient = rednet.CHANNEL_BROADCAST, + nSender = os.getComputerID(), + message = data, + sProtocol = protocol, + } + + sendWireless(message_wrapper) + end, + receive = function(protocol, timeout) -- computer ids not implemented + local ret = {} + parallel.waitForAny(function() + while true do + local msg = recvWireless() + + if type(msg) == "table" then + ret = {msg.nMessageID, msg.message, msg.sProtocol} + return + end + end + end, function() -- this sucks as well + while not timeout do sleep(1) end + sleep(timeout) + ret = {} + end) + + return table.unpack(ret) + end +} \ No newline at end of file