Advertisement
1lann

Firewolf Encrypted Rednet Receive Demo

Jun 20th, 2014
189
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Lua 17.59 KB | None | 0 0
  1. --  RC4
  2.     --    RC4
  3.     --    Implementation by AgentE382
  4.  
  5.  
  6.     local cryptWrapper = function(plaintext, salt)
  7.         local key = type(salt) == "table" and {unpack(salt)} or {string.byte(salt, 1, #salt)}
  8.         local S = {}
  9.         for i = 0, 255 do
  10.             S[i] = i
  11.         end
  12.  
  13.         local j, keylength = 0, #key
  14.         for i = 0, 255 do
  15.             j = (j + S[i] + key[i % keylength + 1]) % 256
  16.             S[i], S[j] = S[j], S[i]
  17.         end
  18.  
  19.         local i = 0
  20.         j = 0
  21.         local chars, astable = type(plaintext) == "table" and {unpack(plaintext)} or {string.byte(plaintext, 1, #plaintext)}, false
  22.  
  23.         for n = 1, #chars do
  24.             i = (i + 1) % 256
  25.             j = (j + S[i]) % 256
  26.             S[i], S[j] = S[j], S[i]
  27.             chars[n] = bit.bxor(S[(S[i] + S[j]) % 256], chars[n])
  28.             if chars[n] > 127 or chars[n] == 13 then
  29.                 astable = true
  30.             end
  31.         end
  32.  
  33.         return astable and chars or string.char(unpack(chars))
  34.     end
  35.  
  36.  
  37.     local crypt = function(text, key)
  38.         local resp, msg = pcall(cryptWrapper, text, key)
  39.         if resp then
  40.             return msg
  41.         else
  42.             return nil
  43.         end
  44.     end
  45.  
  46.  
  47. --  Base64
  48.     --
  49.     --  Base64 Encryption/Decryption
  50.     --  By KillaVanilla
  51.     --  http://www.computercraft.info/forums2/index.php?/topic/12450-killavanillas-various-apis/
  52.     --  http://pastebin.com/rCYDnCxn
  53.     --
  54.  
  55.  
  56.  
  57.     local alphabet = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/"
  58.  
  59.  
  60.     local function sixBitToBase64(input)
  61.         return string.sub(alphabet, input+1, input+1)
  62.     end
  63.  
  64.  
  65.     local function base64ToSixBit(input)
  66.         for i=1, 64 do
  67.             if input == string.sub(alphabet, i, i) then
  68.                 return i-1
  69.             end
  70.         end
  71.     end
  72.  
  73.  
  74.     local function octetToBase64(o1, o2, o3)
  75.         local shifted = bit.brshift(bit.band(o1, 0xFC), 2)
  76.         local i1 = sixBitToBase64(shifted)
  77.         local i2 = "A"
  78.         local i3 = "="
  79.         local i4 = "="
  80.         if o2 then
  81.             i2 = sixBitToBase64(bit.bor( bit.blshift(bit.band(o1, 3), 4), bit.brshift(bit.band(o2, 0xF0), 4) ))
  82.             if not o3 then
  83.                 i3 = sixBitToBase64(bit.blshift(bit.band(o2, 0x0F), 2))
  84.             else
  85.                 i3 = sixBitToBase64(bit.bor( bit.blshift(bit.band(o2, 0x0F), 2), bit.brshift(bit.band(o3, 0xC0), 6) ))
  86.             end
  87.         else
  88.             i2 = sixBitToBase64(bit.blshift(bit.band(o1, 3), 4))
  89.         end
  90.         if o3 then
  91.             i4 = sixBitToBase64(bit.band(o3, 0x3F))
  92.         end
  93.  
  94.         return i1..i2..i3..i4
  95.     end
  96.  
  97.  
  98.     local function base64ToThreeOctet(s1)
  99.         local c1 = base64ToSixBit(string.sub(s1, 1, 1))
  100.         local c2 = base64ToSixBit(string.sub(s1, 2, 2))
  101.         local c3 = 0
  102.         local c4 = 0
  103.         local o1 = 0
  104.         local o2 = 0
  105.         local o3 = 0
  106.         if string.sub(s1, 3, 3) == "=" then
  107.             c3 = nil
  108.             c4 = nil
  109.         elseif string.sub(s1, 4, 4) == "=" then
  110.             c3 = base64ToSixBit(string.sub(s1, 3, 3))
  111.             c4 = nil
  112.         else
  113.             c3 = base64ToSixBit(string.sub(s1, 3, 3))
  114.             c4 = base64ToSixBit(string.sub(s1, 4, 4))
  115.         end
  116.         o1 = bit.bor( bit.blshift(c1, 2), bit.brshift(bit.band( c2, 0x30 ), 4) )
  117.         if c3 then
  118.             o2 = bit.bor( bit.blshift(bit.band(c2, 0x0F), 4), bit.brshift(bit.band( c3, 0x3C ), 2) )
  119.         else
  120.             o2 = nil
  121.         end
  122.         if c4 then
  123.             o3 = bit.bor( bit.blshift(bit.band(c3, 3), 6), c4 )
  124.         else
  125.             o3 = nil
  126.         end
  127.         return o1, o2, o3
  128.     end
  129.  
  130.  
  131.     local function splitIntoBlocks(bytes)
  132.         local blockNum = 1
  133.         local blocks = {}
  134.         for i=1, #bytes, 3 do
  135.             blocks[blockNum] = {bytes[i], bytes[i+1], bytes[i+2]}
  136.             blockNum = blockNum+1
  137.         end
  138.         return blocks
  139.     end
  140.  
  141.  
  142.     function base64Encode(bytes)
  143.         local blocks = splitIntoBlocks(bytes)
  144.         local output = ""
  145.         for i=1, #blocks do
  146.             output = output..octetToBase64( unpack(blocks[i]) )
  147.         end
  148.         return output
  149.     end
  150.  
  151.  
  152.     function base64Decode(str)
  153.         local bytes = {}
  154.         local blocks = {}
  155.         local blockNum = 1
  156.  
  157.         for i=1, #str, 4 do
  158.             blocks[blockNum] = string.sub(str, i, i+3)
  159.             blockNum = blockNum+1
  160.         end
  161.  
  162.         for i=1, #blocks do
  163.             local o1, o2, o3 = base64ToThreeOctet(blocks[i])
  164.             table.insert(bytes, o1)
  165.             table.insert(bytes, o2)
  166.             table.insert(bytes, o3)
  167.         end
  168.  
  169.         return bytes
  170.     end
  171.  
  172.  
  173. --  SHA-256
  174.     --
  175.     --  Adaptation of the Secure Hashing Algorithm (SHA-244/256)
  176.     --  Found Here: http://lua-users.org/wiki/SecureHashAlgorithm
  177.     --
  178.     --  Using an adapted version of the bit library
  179.     --  Found Here: https://bitbucket.org/Boolsheet/bslf/src/1ee664885805/bit.lua
  180.     --
  181.  
  182.  
  183.  
  184.     local MOD = 2^32
  185.     local MODM = MOD-1
  186.  
  187.  
  188.     local function memoize(f)
  189.         local mt = {}
  190.         local t = setmetatable({}, mt)
  191.         function mt:__index(k)
  192.             local v = f(k)
  193.             t[k] = v
  194.             return v
  195.         end
  196.         return t
  197.     end
  198.  
  199.  
  200.     local function make_bitop_uncached(t, m)
  201.         local function bitop(a, b)
  202.             local res,p = 0,1
  203.             while a ~= 0 and b ~= 0 do
  204.                 local am, bm = a % m, b % m
  205.                 res = res + t[am][bm] * p
  206.                 a = (a - am) / m
  207.                 b = (b - bm) / m
  208.                 p = p * m
  209.             end
  210.             res = res + (a + b) * p
  211.             return res
  212.         end
  213.  
  214.         return bitop
  215.     end
  216.  
  217.  
  218.     local function make_bitop(t)
  219.         local op1 = make_bitop_uncached(t,2^1)
  220.         local op2 = memoize(function(a)
  221.             return memoize(function(b)
  222.                 return op1(a, b)
  223.             end)
  224.         end)
  225.         return make_bitop_uncached(op2, 2 ^ (t.n or 1))
  226.     end
  227.  
  228.  
  229.     local customBxor1 = make_bitop({[0] = {[0] = 0,[1] = 1}, [1] = {[0] = 1, [1] = 0}, n = 4})
  230.  
  231.     local function customBxor(a, b, c, ...)
  232.         local z = nil
  233.         if b then
  234.             a = a % MOD
  235.             b = b % MOD
  236.             z = customBxor1(a, b)
  237.             if c then
  238.                 z = customBxor(z, c, ...)
  239.             end
  240.             return z
  241.         elseif a then
  242.             return a % MOD
  243.         else
  244.             return 0
  245.         end
  246.     end
  247.  
  248.  
  249.     local function customBand(a, b, c, ...)
  250.         local z
  251.         if b then
  252.             a = a % MOD
  253.             b = b % MOD
  254.             z = ((a + b) - customBxor1(a,b)) / 2
  255.             if c then
  256.                 z = customBand(z, c, ...)
  257.             end
  258.             return z
  259.         elseif a then
  260.             return a % MOD
  261.         else
  262.             return MODM
  263.         end
  264.     end
  265.  
  266.  
  267.     local function bnot(x)
  268.         return (-1 - x) % MOD
  269.     end
  270.  
  271.  
  272.     local function rshift1(a, disp)
  273.         if disp < 0 then
  274.             return lshift(a, -disp)
  275.         end
  276.         return math.floor(a % 2 ^ 32 / 2 ^ disp)
  277.     end
  278.  
  279.  
  280.     local function rshift(x, disp)
  281.         if disp > 31 or disp < -31 then
  282.             return 0
  283.         end
  284.         return rshift1(x % MOD, disp)
  285.     end
  286.  
  287.  
  288.     local function lshift(a, disp)
  289.         if disp < 0 then
  290.             return rshift(a, -disp)
  291.         end
  292.         return (a * 2 ^ disp) % 2 ^ 32
  293.     end
  294.  
  295.  
  296.     local function rrotate(x, disp)
  297.         x = x % MOD
  298.         disp = disp % 32
  299.         local low = customBand(x, 2 ^ disp - 1)
  300.         return rshift(x, disp) + lshift(low, 32 - disp)
  301.     end
  302.  
  303.  
  304.     local k = {
  305.         0x428a2f98, 0x71374491, 0xb5c0fbcf, 0xe9b5dba5,
  306.         0x3956c25b, 0x59f111f1, 0x923f82a4, 0xab1c5ed5,
  307.         0xd807aa98, 0x12835b01, 0x243185be, 0x550c7dc3,
  308.         0x72be5d74, 0x80deb1fe, 0x9bdc06a7, 0xc19bf174,
  309.         0xe49b69c1, 0xefbe4786, 0x0fc19dc6, 0x240ca1cc,
  310.         0x2de92c6f, 0x4a7484aa, 0x5cb0a9dc, 0x76f988da,
  311.         0x983e5152, 0xa831c66d, 0xb00327c8, 0xbf597fc7,
  312.         0xc6e00bf3, 0xd5a79147, 0x06ca6351, 0x14292967,
  313.         0x27b70a85, 0x2e1b2138, 0x4d2c6dfc, 0x53380d13,
  314.         0x650a7354, 0x766a0abb, 0x81c2c92e, 0x92722c85,
  315.         0xa2bfe8a1, 0xa81a664b, 0xc24b8b70, 0xc76c51a3,
  316.         0xd192e819, 0xd6990624, 0xf40e3585, 0x106aa070,
  317.         0x19a4c116, 0x1e376c08, 0x2748774c, 0x34b0bcb5,
  318.         0x391c0cb3, 0x4ed8aa4a, 0x5b9cca4f, 0x682e6ff3,
  319.         0x748f82ee, 0x78a5636f, 0x84c87814, 0x8cc70208,
  320.         0x90befffa, 0xa4506ceb, 0xbef9a3f7, 0xc67178f2,
  321.     }
  322.  
  323.  
  324.     local function str2hexa(s)
  325.         return (string.gsub(s, ".", function(c)
  326.             return string.format("%02x", string.byte(c))
  327.         end))
  328.     end
  329.  
  330.  
  331.     local function num2s(l, n)
  332.         local s = ""
  333.         for i = 1, n do
  334.             local rem = l % 256
  335.             s = string.char(rem) .. s
  336.             l = (l - rem) / 256
  337.         end
  338.         return s
  339.     end
  340.  
  341.  
  342.     local function s232num(s, i)
  343.         local n = 0
  344.         for i = i, i + 3 do
  345.             n = n*256 + string.byte(s, i)
  346.         end
  347.         return n
  348.     end
  349.  
  350.  
  351.     local function preproc(msg, len)
  352.         local extra = 64 - ((len + 9) % 64)
  353.         len = num2s(8 * len, 8)
  354.         msg = msg .. "\128" .. string.rep("\0", extra) .. len
  355.         assert(#msg % 64 == 0)
  356.         return msg
  357.     end
  358.  
  359.  
  360.     local function initH256(H)
  361.         H[1] = 0x6a09e667
  362.         H[2] = 0xbb67ae85
  363.         H[3] = 0x3c6ef372
  364.         H[4] = 0xa54ff53a
  365.         H[5] = 0x510e527f
  366.         H[6] = 0x9b05688c
  367.         H[7] = 0x1f83d9ab
  368.         H[8] = 0x5be0cd19
  369.         return H
  370.     end
  371.  
  372.  
  373.     local function digestblock(msg, i, H)
  374.         local w = {}
  375.         for j = 1, 16 do
  376.             w[j] = s232num(msg, i + (j - 1)*4)
  377.         end
  378.         for j = 17, 64 do
  379.             local v = w[j - 15]
  380.             local s0 = customBxor(rrotate(v, 7), rrotate(v, 18), rshift(v, 3))
  381.             v = w[j - 2]
  382.             w[j] = w[j - 16] + s0 + w[j - 7] + customBxor(rrotate(v, 17), rrotate(v, 19), rshift(v, 10))
  383.         end
  384.  
  385.         local a, b, c, d, e, f, g, h = H[1], H[2], H[3], H[4], H[5], H[6], H[7], H[8]
  386.         for i = 1, 64 do
  387.             local s0 = customBxor(rrotate(a, 2), rrotate(a, 13), rrotate(a, 22))
  388.             local maj = customBxor(customBand(a, b), customBand(a, c), customBand(b, c))
  389.             local t2 = s0 + maj
  390.             local s1 = customBxor(rrotate(e, 6), rrotate(e, 11), rrotate(e, 25))
  391.             local ch = customBxor (customBand(e, f), customBand(bnot(e), g))
  392.             local t1 = h + s1 + ch + k[i] + w[i]
  393.             h, g, f, e, d, c, b, a = g, f, e, d + t1, c, b, a, t1 + t2
  394.         end
  395.  
  396.         H[1] = customBand(H[1] + a)
  397.         H[2] = customBand(H[2] + b)
  398.         H[3] = customBand(H[3] + c)
  399.         H[4] = customBand(H[4] + d)
  400.         H[5] = customBand(H[5] + e)
  401.         H[6] = customBand(H[6] + f)
  402.         H[7] = customBand(H[7] + g)
  403.         H[8] = customBand(H[8] + h)
  404.     end
  405.  
  406.  
  407.     local function sha256(msg)
  408.         msg = preproc(msg, #msg)
  409.         local H = initH256({})
  410.         for i = 1, #msg, 64 do
  411.             digestblock(msg, i, H)
  412.         end
  413.         return str2hexa(num2s(H[1], 4) .. num2s(H[2], 4) .. num2s(H[3], 4) .. num2s(H[4], 4) ..
  414.             num2s(H[5], 4) .. num2s(H[6], 4) .. num2s(H[7], 4) .. num2s(H[8], 4))
  415.     end
  416.  
  417.  
  418. local protocolName = "Firewolf"
  419.  
  420.  
  421. --  Cryptography
  422.     local Cryptography = {}
  423.     Cryptography.sha = {}
  424.     Cryptography.base64 = {}
  425.     Cryptography.aes = {}
  426.  
  427.  
  428.     function Cryptography.bytesFromMessage(msg)
  429.         local bytes = {}
  430.  
  431.         for i = 1, msg:len() do
  432.             local letter = string.byte(msg:sub(i, i))
  433.             table.insert(bytes, letter)
  434.         end
  435.  
  436.         return bytes
  437.     end
  438.  
  439.  
  440.     function Cryptography.messageFromBytes(bytes)
  441.         local msg = ""
  442.  
  443.         for i = 1, #bytes do
  444.             local letter = string.char(bytes[i])
  445.             msg = msg .. letter
  446.         end
  447.  
  448.         return msg
  449.     end
  450.  
  451.  
  452.     function Cryptography.bytesFromKey(key)
  453.         local bytes = {}
  454.  
  455.         for i = 1, key:len() / 2 do
  456.             local group = key:sub((i - 1) * 2 + 1, (i - 1) * 2 + 1)
  457.             local num = tonumber(group, 16)
  458.             table.insert(bytes, num)
  459.         end
  460.  
  461.         return bytes
  462.     end
  463.  
  464.  
  465.     function Cryptography.sha.sha256(msg)
  466.         return sha256(msg)
  467.     end
  468.  
  469.  
  470.     function Cryptography.aes.encrypt(msg, key)
  471.         return base64Encode(crypt(msg, key))
  472.     end
  473.  
  474.  
  475.     function Cryptography.aes.decrypt(msg, key)
  476.         return crypt(base64Decode(msg), key)
  477.     end
  478.  
  479.  
  480.     function Cryptography.base64.encode(msg)
  481.         return base64Encode(Cryptography.bytesFromMessage(msg))
  482.     end
  483.  
  484.  
  485.     function Cryptography.base64.decode(msg)
  486.         return Cryptography.messageFromBytes(base64Decode(msg))
  487.     end
  488.  
  489.  
  490. --  Modem
  491.     local Modem = {}
  492.  
  493.     Modem.modems = {}
  494.  
  495.     function Modem.exists()
  496.         Modem.exists = false
  497.         for _, side in pairs(rs.getSides()) do
  498.             if peripheral.isPresent(side) and peripheral.getType(side) == "modem" then
  499.                 Modem.exists = true
  500.  
  501.                 if not Modem.modems[side] then
  502.                     Modem.modems[side] = peripheral.wrap(side)
  503.                 end
  504.             end
  505.         end
  506.  
  507.         return Modem.exists
  508.     end
  509.  
  510.  
  511.     function Modem.open(channel)
  512.         if not Modem.exists then
  513.             return false
  514.         end
  515.  
  516.         for side, modem in pairs(Modem.modems) do
  517.             modem.open(channel)
  518.         end
  519.  
  520.         return true
  521.     end
  522.  
  523.  
  524.     function Modem.close(channel)
  525.         if not Modem.exists then
  526.             return false
  527.         end
  528.  
  529.         for side, modem in pairs(Modem.modems) do
  530.             modem.close(channel)
  531.         end
  532.  
  533.         return true
  534.     end
  535.  
  536.  
  537.     function Modem.isOpen(channel)
  538.         if not Modem.exists then
  539.             return false
  540.         end
  541.  
  542.         local isOpen = false
  543.         for side, modem in pairs(Modem.modems) do
  544.             if modem.isOpen(channel) then
  545.                 isOpen = true
  546.                 break
  547.             end
  548.         end
  549.  
  550.         return isOpen
  551.     end
  552.  
  553.  
  554.     function Modem.send(channel, msg)
  555.         if not Modem.exists then
  556.             return false
  557.         end
  558.  
  559.         if not Modem.isOpen(channel) then
  560.             Modem.open(channel)
  561.         end
  562.  
  563.         for side, modem in pairs(Modem.modems) do
  564.             modem.transmit(channel, channel, msg)
  565.         end
  566.  
  567.         return true
  568.     end
  569.  
  570.  
  571. --  Handshake
  572.     local Handshake = {}
  573.  
  574.     Handshake.prime = 625210769
  575.     Handshake.channel = 54569
  576.     Handshake.base = -1
  577.     Handshake.secret = -1
  578.     Handshake.sharedSecret = -1
  579.     Handshake.packetHeader = "["..protocolName.."-Handshake-Packet Header]"
  580.     Handshake.packetMatch = "%["..protocolName.."%-Handshake%-Packet Header%](.+)"
  581.  
  582.     function Handshake.exponentWithModulo(base, exponent, modulo)
  583.         local remainder = base
  584.  
  585.         for i = 1, exponent-1 do
  586.             remainder = remainder * remainder
  587.             if remainder >= modulo then
  588.                 remainder = remainder % modulo
  589.             end
  590.         end
  591.  
  592.         return remainder
  593.     end
  594.  
  595.  
  596.     function Handshake.clear()
  597.         Handshake.base = -1
  598.         Handshake.secret = -1
  599.         Handshake.sharedSecret = -1
  600.     end
  601.  
  602.     function Handshake.generateInitiatorData()
  603.         Handshake.base = math.random(10,99999)
  604.         Handshake.secret = math.random(10,99999)
  605.         return {
  606.             type = "initiate",
  607.             prime = Handshake.prime,
  608.             base = Handshake.base,
  609.             moddedSecret = Handshake.exponentWithModulo(Handshake.base, Handshake.secret, Handshake.prime)
  610.         }
  611.     end
  612.  
  613.     function Handshake.generateResponseData(initiatorData)
  614.         local isPrimeANumber = type(initiatorData.prime) == "number"
  615.         local isPrimeMatching = initiatorData.prime == Handshake.prime
  616.         local isBaseANumber = type(initiatorData.base) == "number"
  617.         local isInitiator = initiatorData.type == "initiate"
  618.         local isModdedSecretANumber = type(initiatorData.moddedSecret) == "number"
  619.         local areAllNumbersNumbers = isPrimeANumber and isBaseANumber and isModdedSecretANumber
  620.  
  621.         if areAllNumbersNumbers and isPrimeMatching then
  622.             if isInitiator then
  623.                 Handshake.base = initiatorData.base
  624.                 Handshake.secret = math.random(10,99999)
  625.                 Handshake.sharedSecret = Handshake.exponentWithModulo(initiatorData.moddedSecret, Handshake.secret, Handshake.prime)
  626.                 return {
  627.                     type = "response",
  628.                     prime = Handshake.prime,
  629.                     base = Handshake.base,
  630.                     moddedSecret = Handshake.exponentWithModulo(Handshake.base, Handshake.secret, Handshake.prime)
  631.                 }, Handshake.sharedSecret
  632.             elseif initiatorData.type == "response" and Handshake.base > 0 and Handshake.secret > 0 then
  633.                 Handshake.sharedSecret = Handshake.exponentWithModulo(initiatorData.moddedSecret, Handshake.secret, Handshake.prime)
  634.                 return Handshake.sharedSecret
  635.             else
  636.                 return false
  637.             end
  638.         else
  639.             return false
  640.         end
  641.     end
  642.  
  643.  
  644. --  Secure Connection
  645.     local SecureConnection = {}
  646.     SecureConnection.__index = SecureConnection
  647.  
  648.  
  649.     SecureConnection.packetHeader = "["..protocolName.."-SecureConnection-Packet Header]"
  650.     SecureConnection.packetMatch = "%["..protocolName.."%-SecureConnection%-Packet Header%](.+)"
  651.     SecureConnection.connectionTimeout = 0.1
  652.     SecureConnection.successPacketTimeout = 0.1
  653.  
  654.  
  655.     function SecureConnection.new(secret, key, distance)
  656.         local self = setmetatable({}, SecureConnection)
  657.         self:setup(secret, key, distance)
  658.         return self
  659.     end
  660.  
  661.  
  662.     function SecureConnection.verifyHeader(msg)
  663.         if msg:match(SecureConnection.packetMatch) then
  664.             return true
  665.         else
  666.             return false
  667.         end
  668.     end
  669.  
  670.  
  671.     function SecureConnection:setup(secret, key, distance)
  672.         local rawSecret
  673.  
  674.         if not distance or distance < 0 then
  675.             self.isRednet = true
  676.             self.distance = -1
  677.             rawSecret = tostring(secret) .. "|" .. tostring(key)
  678.         else
  679.             self.isRednet = false
  680.             self.distance = distance
  681.             rawSecret = tostring(secret) .. "|" .. tostring(key) .. "|" .. tostring(distance)
  682.         end
  683.  
  684.         self.secret = Cryptography.sha.sha256(rawSecret)
  685.  
  686.         if not self.isRednet then
  687.             local total = 0
  688.  
  689.             for i = 1, self.secret:len() do
  690.                 local letter = string.byte(self.secret:sub(i, i))
  691.                 total = total + letter
  692.             end
  693.  
  694.             self.channel = total % 65530
  695.             Modem.open(self.channel)
  696.         else
  697.             self.channel = nil
  698.         end
  699.     end
  700.  
  701.  
  702.     function SecureConnection:sendMessage(msg, id)
  703.         if self.isRednet and not id then
  704.             return false
  705.         else
  706.             local rawEncryptedMsg = Cryptography.aes.encrypt(SecureConnection.packetHeader .. msg, self.secret)
  707.             local encryptedMsg = SecureConnection.packetHeader .. rawEncryptedMsg
  708.  
  709.             if self.isRednet then
  710.                 rednet.send(id, encryptedMsg)
  711.                 return true
  712.             else
  713.                 return Modem.send(self.channel, encryptedMsg)
  714.             end
  715.         end
  716.     end
  717.  
  718.     function SecureConnection:decryptMessage(msg)
  719.         if SecureConnection.verifyHeader(msg) then
  720.             local encrypted = msg:match(SecureConnection.packetMatch)
  721.  
  722.             local unencryptedMsg = nil
  723.             pcall(function() unencryptedMsg = Cryptography.aes.decrypt(encrypted, self.secret) end)
  724.             if not unencryptedMsg then
  725.                 return false, "Could not decrypt"
  726.             end
  727.  
  728.             if SecureConnection.verifyHeader(unencryptedMsg) then
  729.                 return unencryptedMsg:match(SecureConnection.packetMatch)
  730.             else
  731.                 return false, "Could not verify"
  732.             end
  733.         end
  734.     end
  735.  
  736.  
  737. --  Testing
  738.  
  739. print(Modem.exists())
  740.  
  741. Modem.open(Handshake.channel)
  742. Handshake.clear()
  743.  
  744. local secret = nil
  745. local distance = 0
  746.  
  747. while true do
  748.     local e, p1, p2, p3, msg, p5 = os.pullEvent()
  749.     if e == "modem_message" then
  750.         if msg:match(Handshake.packetMatch) then
  751.             local unserialized = textutils.unserialize(msg:match(Handshake.packetMatch))
  752.             local data, key = Handshake.generateResponseData(unserialized)
  753.             print("key: ",key)
  754.             distance = p5
  755.             secret = key
  756.             if type(data) == "table" then
  757.                 local toSend = Handshake.packetHeader .. textutils.serialize(data)
  758.                 Modem.send(Handshake.channel, toSend)
  759.             end
  760.             break
  761.         end
  762.     end
  763. end
  764.  
  765. local connection = SecureConnection.new(secret, "1lann.com", distance)
  766.  
  767. while true do
  768.     local e, p1, p2, p3, msg, p5 = os.pullEvent()
  769.     print(e)
  770.     if e == "modem_message" then
  771.         print("message received")
  772.         if SecureConnection.verifyHeader(msg) then
  773.             print("Header verified")
  774.             local resp, data = connection:decryptMessage(msg)
  775.             if not resp then
  776.                 print(data)
  777.             else
  778.                 print(resp)
  779.             end
  780.             break
  781.         end
  782.     end
  783. end
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement