summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--chat.dat1
-rw-r--r--chat.lua19
-rw-r--r--md5.lua167
3 files changed, 187 insertions, 0 deletions
diff --git a/chat.dat b/chat.dat
new file mode 100644
index 0000000..5086928
--- /dev/null
+++ b/chat.dat
@@ -0,0 +1 @@
+dep md5
diff --git a/chat.lua b/chat.lua
new file mode 100644
index 0000000..e21da68
--- /dev/null
+++ b/chat.lua
@@ -0,0 +1,19 @@
+local md5 = require("md5").hash
+
+local p = peripheral.find"manipulator"
+assert(p and p.hasModule"plethora:chat")
+local m = peripheral.wrap"monitor"
+assert(m)
+
+local function p(...)
+ term.redirect(m)
+ print(...)
+ term.redirect(term.native())
+end
+
+while true do
+ local _,user,msg = os.pullEvent"chat_message"
+ local h = md5(msg)
+
+ p("<"..user.."> ["..h.."] "..msg)
+end
diff --git a/md5.lua b/md5.lua
new file mode 100644
index 0000000..b421587
--- /dev/null
+++ b/md5.lua
@@ -0,0 +1,167 @@
+-- from https://github.com/philanc/plc/blob/master/plc/md5.lua
+------------------------------------------------------------------------
+-- md5 hash - see RFC 1321 - https://www.ietf.org/rfc/rfc1321.txt
+
+local spack, sunpack = string.pack, string.unpack
+
+------------------------------------------------------------------------
+
+local function FF(a, b, c, d, x, s, ac)
+ a = (a + ((b & c) | ((~b) & d)) + x + ac) & 0xffffffff
+ a = ((a << s) | (a >> (32-s))) & 0xffffffff
+ a = (a + b) & 0xffffffff
+ return a
+end
+
+local function GG(a, b, c, d, x, s, ac)
+ a = (a + ((b & d) | c & (~d) ) + x + ac) & 0xffffffff
+ a = ((a << s) | (a >> (32-s))) & 0xffffffff
+ a = (a + b) & 0xffffffff
+ return a
+end
+
+local function HH(a, b, c, d, x, s, ac)
+ a = (a + ((b ~ c ~ d)) + x + ac) & 0xffffffff
+ a = ((a << s) | (a >> (32-s))) & 0xffffffff
+ a = (a + b) & 0xffffffff
+ return a
+end
+
+local function II(a, b, c, d, x, s, ac)
+ a = (a + (c ~ (b | ~d)) + x + ac) & 0xffffffff
+ a = ((a << s) | (a >> (32-s))) & 0xffffffff
+ a = (a + b) & 0xffffffff
+ return a
+end
+
+local function transform(state, input, i, t)
+ -- process the 64-byte input block in string 'input' at offset 'i'
+ -- t is a uint32[16] array. It is passed as a parameter
+ -- for performance reasons
+ --
+ local a, b, c, d = state[1], state[2], state[3], state[4]
+
+ -- load array
+ for j = 1, 16 do
+ t[j] = sunpack("<I4", input, i)
+ i = i + 4
+ end
+
+ -- Round 1
+ a = FF (a, b, c, d, t[ 1], 7, 0xd76aa478)
+ d = FF (d, a, b, c, t[ 2], 12, 0xe8c7b756)
+ c = FF (c, d, a, b, t[ 3], 17, 0x242070db)
+ b = FF (b, c, d, a, t[ 4], 22, 0xc1bdceee)
+ a = FF (a, b, c, d, t[ 5], 7, 0xf57c0faf)
+ d = FF (d, a, b, c, t[ 6], 12, 0x4787c62a)
+ c = FF (c, d, a, b, t[ 7], 17, 0xa8304613)
+ b = FF (b, c, d, a, t[ 8], 22, 0xfd469501)
+ a = FF (a, b, c, d, t[ 9], 7, 0x698098d8)
+ d = FF (d, a, b, c, t[10], 12, 0x8b44f7af)
+ c = FF (c, d, a, b, t[11], 17, 0xffff5bb1)
+ b = FF (b, c, d, a, t[12], 22, 0x895cd7be)
+ a = FF (a, b, c, d, t[13], 7, 0x6b901122)
+ d = FF (d, a, b, c, t[14], 12, 0xfd987193)
+ c = FF (c, d, a, b, t[15], 17, 0xa679438e)
+ b = FF (b, c, d, a, t[16], 22, 0x49b40821)
+
+ -- Round 2
+ a = GG (a, b, c, d, t[ 2], 5, 0xf61e2562)
+ d = GG (d, a, b, c, t[ 7], 9, 0xc040b340)
+ c = GG (c, d, a, b, t[12], 14, 0x265e5a51)
+ b = GG (b, c, d, a, t[ 1], 20, 0xe9b6c7aa)
+ a = GG (a, b, c, d, t[ 6], 5, 0xd62f105d)
+ d = GG (d, a, b, c, t[11], 9, 0x2441453)
+ c = GG (c, d, a, b, t[16], 14, 0xd8a1e681)
+ b = GG (b, c, d, a, t[ 5], 20, 0xe7d3fbc8)
+ a = GG (a, b, c, d, t[10], 5, 0x21e1cde6)
+ d = GG (d, a, b, c, t[15], 9, 0xc33707d6)
+ c = GG (c, d, a, b, t[ 4], 14, 0xf4d50d87)
+ b = GG (b, c, d, a, t[ 9], 20, 0x455a14ed)
+ a = GG (a, b, c, d, t[14], 5, 0xa9e3e905)
+ d = GG (d, a, b, c, t[ 3], 9, 0xfcefa3f8)
+ c = GG (c, d, a, b, t[ 8], 14, 0x676f02d9)
+ b = GG (b, c, d, a, t[13], 20, 0x8d2a4c8a)
+
+ -- Round 3
+ a = HH (a, b, c, d, t[ 6], 4, 0xfffa3942)
+ d = HH (d, a, b, c, t[ 9], 11, 0x8771f681)
+ c = HH (c, d, a, b, t[12], 16, 0x6d9d6122)
+ b = HH (b, c, d, a, t[15], 23, 0xfde5380c)
+ a = HH (a, b, c, d, t[ 2], 4, 0xa4beea44)
+ d = HH (d, a, b, c, t[ 5], 11, 0x4bdecfa9)
+ c = HH (c, d, a, b, t[ 8], 16, 0xf6bb4b60)
+ b = HH (b, c, d, a, t[11], 23, 0xbebfbc70)
+ a = HH (a, b, c, d, t[14], 4, 0x289b7ec6)
+ d = HH (d, a, b, c, t[ 1], 11, 0xeaa127fa)
+ c = HH (c, d, a, b, t[ 4], 16, 0xd4ef3085)
+ b = HH (b, c, d, a, t[ 7], 23, 0x4881d05)
+ a = HH (a, b, c, d, t[10], 4, 0xd9d4d039)
+ d = HH (d, a, b, c, t[13], 11, 0xe6db99e5)
+ c = HH (c, d, a, b, t[16], 16, 0x1fa27cf8)
+ b = HH (b, c, d, a, t[ 3], 23, 0xc4ac5665)
+
+ -- Round 4
+ a = II (a, b, c, d, t[ 1], 6, 0xf4292244)
+ d = II (d, a, b, c, t[ 8], 10, 0x432aff97)
+ c = II (c, d, a, b, t[15], 15, 0xab9423a7)
+ b = II (b, c, d, a, t[ 6], 21, 0xfc93a039)
+ a = II (a, b, c, d, t[13], 6, 0x655b59c3)
+ d = II (d, a, b, c, t[ 4], 10, 0x8f0ccc92)
+ c = II (c, d, a, b, t[11], 15, 0xffeff47d)
+ b = II (b, c, d, a, t[ 2], 21, 0x85845dd1)
+ a = II (a, b, c, d, t[ 9], 6, 0x6fa87e4f)
+ d = II (d, a, b, c, t[16], 10, 0xfe2ce6e0)
+ c = II (c, d, a, b, t[ 7], 15, 0xa3014314)
+ b = II (b, c, d, a, t[14], 21, 0x4e0811a1)
+ a = II (a, b, c, d, t[ 5], 6, 0xf7537e82)
+ d = II (d, a, b, c, t[12], 10, 0xbd3af235)
+ c = II (c, d, a, b, t[ 3], 15, 0x2ad7d2bb)
+ b = II (b, c, d, a, t[10], 21, 0xeb86d391)
+
+ state[1] = (state[1] + a) & 0xffffffff
+ state[2] = (state[2] + b) & 0xffffffff
+ state[3] = (state[3] + c) & 0xffffffff
+ state[4] = (state[4] + d) & 0xffffffff
+end --transform()
+
+local function md5(input)
+ -- initialize state
+ local state = { 0x67452301, 0xefcdab89, 0x98badcfe, 0x10325476 }
+ local inputlen = #input
+ local inputbits = inputlen * 8 -- input length in bits
+ local r = inputlen -- number of unprocessed bytes
+ local i = 1 -- index in input string
+ local ibt = {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0} -- input block uint32[16]
+ -- process as many 64-byte blocks as possible
+ while r >= 64 do
+ -- process block
+ transform(state, input, i, ibt)
+ i = i + 64 -- update input index
+ r = r - 64 -- update number of unprocessed bytes
+ end
+ -- finalize. must append to input a mandatory 0x80 byte, some
+ -- padding, and the input bit-length ('inputbits')
+ local lastblock -- the rest of input .. some padding .. inputbits
+ local padlen -- padding length in bytes
+ if r < 56 then padlen = 55 - r else padlen = 119 - r end
+ lastblock = input:sub(i) -- remaining input
+ .. '\x80' .. ('\0'):rep(padlen) --padding
+ .. spack("<I8", inputbits) -- length in bits
+ assert(#lastblock == 64 or #lastblock == 128)
+ transform(state, lastblock, 1, ibt)
+ if #lastblock == 128 then
+ transform(state, lastblock, 65, ibt)
+ end
+ -- return the digest
+ local digest = spack("<I4I4I4I4", state[1], state[2], state[3], state[4])
+ return digest
+end --md5()
+
+--~ bin = require "plc.bin"
+--~ print(bin.stohex(md5'abc'))
+--~ print(bin.stohex(md5""))
+
+return { -- md5 module
+ hash = md5,
+}