Advertisement
smigger22

EpicLock - PC

Feb 28th, 2015
224
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
  1. --  
  2. --  Adaptation of the Secure Hashing Algorithm (SHA-244/256)
  3. --  Found Here: http://lua-users.org/wiki/SecureHashAlgorithm
  4. --  
  5. --  Using an adapted version of the bit library
  6. --  Found Here: https://bitbucket.org/Boolsheet/bslf/src/1ee664885805/bit.lua
  7. --  
  8.  
  9. local MOD = 2^32
  10. local MODM = MOD-1
  11.  
  12. local function memoize(f)
  13.         local mt = {}
  14.         local t = setmetatable({}, mt)
  15.         function mt:__index(k)
  16.                 local v = f(k)
  17.                 t[k] = v
  18.                 return v
  19.         end
  20.         return t
  21. end
  22.  
  23. local function make_bitop_uncached(t, m)
  24.         local function bitop(a, b)
  25.                 local res,p = 0,1
  26.                 while a ~= 0 and b ~= 0 do
  27.                         local am, bm = a % m, b % m
  28.                         res = res + t[am][bm] * p
  29.                         a = (a - am) / m
  30.                         b = (b - bm) / m
  31.                         p = p*m
  32.                 end
  33.                 res = res + (a + b) * p
  34.                 return res
  35.         end
  36.         return bitop
  37. end
  38.  
  39. local function make_bitop(t)
  40.         local op1 = make_bitop_uncached(t,2^1)
  41.         local op2 = memoize(function(a) return memoize(function(b) return op1(a, b) end) end)
  42.         return make_bitop_uncached(op2, 2 ^ (t.n or 1))
  43. end
  44.  
  45. local bxor1 = make_bitop({[0] = {[0] = 0,[1] = 1}, [1] = {[0] = 1, [1] = 0}, n = 4})
  46.  
  47. local function bxor(a, b, c, ...)
  48.         local z = nil
  49.         if b then
  50.                 a = a % MOD
  51.                 b = b % MOD
  52.                 z = bxor1(a, b)
  53.                 if c then z = bxor(z, c, ...) end
  54.                 return z
  55.         elseif a then return a % MOD
  56.         else return 0 end
  57. end
  58.  
  59. local function band(a, b, c, ...)
  60.         local z
  61.         if b then
  62.                 a = a % MOD
  63.                 b = b % MOD
  64.                 z = ((a + b) - bxor1(a,b)) / 2
  65.                 if c then z = bit32_band(z, c, ...) end
  66.                 return z
  67.         elseif a then return a % MOD
  68.         else return MODM end
  69. end
  70.  
  71. local function bnot(x) return (-1 - x) % MOD end
  72.  
  73. local function rshift1(a, disp)
  74.         if disp < 0 then return lshift(a,-disp) end
  75.         return math.floor(a % 2 ^ 32 / 2 ^ disp)
  76. end
  77.  
  78. local function rshift(x, disp)
  79.         if disp > 31 or disp < -31 then return 0 end
  80.         return rshift1(x % MOD, disp)
  81. end
  82.  
  83. local function lshift(a, disp)
  84.         if disp < 0 then return rshift(a,-disp) end
  85.         return (a * 2 ^ disp) % 2 ^ 32
  86. end
  87.  
  88. local function rrotate(x, disp)
  89.     x = x % MOD
  90.     disp = disp % 32
  91.     local low = band(x, 2 ^ disp - 1)
  92.     return rshift(x, disp) + lshift(low, 32 - disp)
  93. end
  94.  
  95. local k = {
  96.         0x428a2f98, 0x71374491, 0xb5c0fbcf, 0xe9b5dba5,
  97.         0x3956c25b, 0x59f111f1, 0x923f82a4, 0xab1c5ed5,
  98.         0xd807aa98, 0x12835b01, 0x243185be, 0x550c7dc3,
  99.         0x72be5d74, 0x80deb1fe, 0x9bdc06a7, 0xc19bf174,
  100.         0xe49b69c1, 0xefbe4786, 0x0fc19dc6, 0x240ca1cc,
  101.         0x2de92c6f, 0x4a7484aa, 0x5cb0a9dc, 0x76f988da,
  102.         0x983e5152, 0xa831c66d, 0xb00327c8, 0xbf597fc7,
  103.         0xc6e00bf3, 0xd5a79147, 0x06ca6351, 0x14292967,
  104.         0x27b70a85, 0x2e1b2138, 0x4d2c6dfc, 0x53380d13,
  105.         0x650a7354, 0x766a0abb, 0x81c2c92e, 0x92722c85,
  106.         0xa2bfe8a1, 0xa81a664b, 0xc24b8b70, 0xc76c51a3,
  107.         0xd192e819, 0xd6990624, 0xf40e3585, 0x106aa070,
  108.         0x19a4c116, 0x1e376c08, 0x2748774c, 0x34b0bcb5,
  109.         0x391c0cb3, 0x4ed8aa4a, 0x5b9cca4f, 0x682e6ff3,
  110.         0x748f82ee, 0x78a5636f, 0x84c87814, 0x8cc70208,
  111.         0x90befffa, 0xa4506ceb, 0xbef9a3f7, 0xc67178f2,
  112. }
  113.  
  114. local function str2hexa(s)
  115.         return (string.gsub(s, ".", function(c) return string.format("%02x", string.byte(c)) end))
  116. end
  117.  
  118. local function num2s(l, n)
  119.         local s = ""
  120.         for i = 1, n do
  121.                 local rem = l % 256
  122.                 s = string.char(rem) .. s
  123.                 l = (l - rem) / 256
  124.         end
  125.         return s
  126. end
  127.  
  128. local function s232num(s, i)
  129.         local n = 0
  130.         for i = i, i + 3 do n = n*256 + string.byte(s, i) end
  131.         return n
  132. end
  133.  
  134. local function preproc(msg, len)
  135.         local extra = 64 - ((len + 9) % 64)
  136.         len = num2s(8 * len, 8)
  137.         msg = msg .. "\128" .. string.rep("\0", extra) .. len
  138.         assert(#msg % 64 == 0)
  139.         return msg
  140. end
  141.  
  142. local function initH256(H)
  143.         H[1] = 0x6a09e667
  144.         H[2] = 0xbb67ae85
  145.         H[3] = 0x3c6ef372
  146.         H[4] = 0xa54ff53a
  147.         H[5] = 0x510e527f
  148.         H[6] = 0x9b05688c
  149.         H[7] = 0x1f83d9ab
  150.         H[8] = 0x5be0cd19
  151.         return H
  152. end
  153.  
  154. local function digestblock(msg, i, H)
  155.         local w = {}
  156.         for j = 1, 16 do w[j] = s232num(msg, i + (j - 1)*4) end
  157.         for j = 17, 64 do
  158.                 local v = w[j - 15]
  159.                 local s0 = bxor(rrotate(v, 7), rrotate(v, 18), rshift(v, 3))
  160.                 v = w[j - 2]
  161.                 w[j] = w[j - 16] + s0 + w[j - 7] + bxor(rrotate(v, 17), rrotate(v, 19), rshift(v, 10))
  162.         end
  163.  
  164.         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]
  165.         for i = 1, 64 do
  166.                 local s0 = bxor(rrotate(a, 2), rrotate(a, 13), rrotate(a, 22))
  167.                 local maj = bxor(band(a, b), band(a, c), band(b, c))
  168.                 local t2 = s0 + maj
  169.                 local s1 = bxor(rrotate(e, 6), rrotate(e, 11), rrotate(e, 25))
  170.                 local ch = bxor (band(e, f), band(bnot(e), g))
  171.                 local t1 = h + s1 + ch + k[i] + w[i]
  172.                 h, g, f, e, d, c, b, a = g, f, e, d + t1, c, b, a, t1 + t2
  173.         end
  174.  
  175.         H[1] = band(H[1] + a)
  176.         H[2] = band(H[2] + b)
  177.         H[3] = band(H[3] + c)
  178.         H[4] = band(H[4] + d)
  179.         H[5] = band(H[5] + e)
  180.         H[6] = band(H[6] + f)
  181.         H[7] = band(H[7] + g)
  182.         H[8] = band(H[8] + h)
  183. end
  184.  
  185. local function sha256(msg)
  186.         msg = preproc(msg, #msg)
  187.         local H = initH256({})
  188.         for i = 1, #msg, 64 do digestblock(msg, i, H) end
  189.         return str2hexa(num2s(H[1], 4) .. num2s(H[2], 4) .. num2s(H[3], 4) .. num2s(H[4], 4) ..
  190.                 num2s(H[5], 4) .. num2s(H[6], 4) .. num2s(H[7], 4) .. num2s(H[8], 4))
  191. end
  192.  
  193. x, y = term.getSize()
  194.  
  195. function setScreen(bColour)
  196.     if term.isColour() then
  197.         term.setBackgroundColour(colours[bColour])
  198.         term.clear()
  199.     end
  200. end
  201.  
  202. function allColour(tColour, bColour)
  203.     if term.isColour() then
  204.         term.setTextColour(colours[tColour])
  205.         term.setBackgroundColour(colours[bColour])
  206.     else
  207.         term.setTextColour(colours.white)
  208.         term.setBackgroundColour(colours.black)
  209.     end
  210. end
  211.  
  212. function textColour(tColour)
  213.     if term.isColour() then
  214.         term.setTextColour(colours[tColour])
  215.     else
  216.         allColour("white", "black")
  217.     end
  218. end
  219.  
  220. function bgColour(bColour)
  221.     if term.isColour() then
  222.         term.setBackgroundColour(colours[bColour])
  223.     else
  224.         allColour("white", "black")
  225.     end
  226. end
  227.  
  228. function centered(str, height, tColour, bColour)
  229.     term.setCursorPos(x / 2 - #str / 2, height)
  230.     if tColour and bColour then
  231.         allColour(tColour, bColour)
  232.     elseif tColour then
  233.         textColour(tColour)
  234.     elseif bColour then
  235.         bgColour(bColour)
  236.     end
  237.     term.write(str)
  238. end
  239.  
  240. function left(str, height, tColour, bColour)
  241.     term.setCursorPos(1, height)
  242.     if tColour and bColour then
  243.         allColour(tColour, bColour)
  244.     elseif tColour then
  245.         textColour(tColour)
  246.     elseif bColour then
  247.         bgColour(bColour)
  248.     end
  249.     term.write(str)
  250. end
  251.  
  252. function right(str, height, tColour, bColour)
  253.     term.setCursorPos(x - #str, height)
  254.     if tColour and bColour then
  255.         allColour(tColour, bColour)
  256.     elseif tColour then
  257.         textColour(tColour)
  258.     elseif bColour then
  259.         bgColour(bColour)
  260.     end
  261.     term.write(str)
  262. end
  263.  
  264. function indented(str, indent, height, tColour, bColour)
  265.     term.setCursorPos(indent, height)
  266.     if tColour and bColour then
  267.         allColour(tColour, bColour)
  268.     elseif tColour then
  269.         textColour(tColour)
  270.     elseif bColour then
  271.         bgColour(bColour)
  272.     end
  273.     term.write(str)
  274. end
  275.  
  276. function clearLine(yPos, colour)
  277.     term.setCursorPos(1, yPos)
  278.     bgColour(colour)
  279.     term.clearLine()
  280. end
  281.  
  282. function checkForUsers()
  283.     if fs.exists(".userDetails") then
  284.         login()
  285.     else
  286.         register()
  287.     end
  288. end
  289.  
  290. function header()
  291.     setScreen("cyan")
  292.     for i = 1, 3 do
  293.         clearLine(i, "blue")
  294.     end
  295.     indented("EpicLock", 2, 2, "lightBlue")
  296.     bgColour("cyan")
  297. end
  298.  
  299. function login()
  300.     while true do
  301.         header()
  302.         right("Login", 2, "lightBlue", "blue")
  303.         indented("Username: ", 2, 5, "lightBlue", "cyan")
  304.         username = read()
  305.         if username:len() > 0 then
  306.             indented("Password: ", 2, 7)
  307.             password = read("*")
  308.             if password:len() > 0 then
  309.                 user = fs.open(".userDetails", "r")
  310.                 userUnserialized = textutils.unserialize(user.readAll())
  311.                 for k, v in pairs(userUnserialized) do
  312.                     if v["Username"] == username and v["Password"] == sha256(password) then
  313.                         setScreen("black")
  314.                         left(os.version(), 1, "yellow")
  315.                         term.setCursorPos(1, 2)
  316.                         return
  317.                     end
  318.                 end
  319.             end
  320.         end
  321.     end
  322. end
  323.  
  324. function register()
  325.     while true do
  326.         users = {}
  327.         header()
  328.         right("Register", 2, "lightBlue", "blue")
  329.         indented("Username: ", 2, 5, "lightBlue", "cyan")
  330.         username = read()
  331.         if username:len() > 0 then
  332.             indented("Password: ", 2, 7)
  333.             password = read("*")
  334.             if password:len() > 0 then
  335.                 user = fs.open(".userDetails", "w")
  336.                 users[#users + 1] = {["Username"] = username, ["Password"] = sha256(password)}
  337.                 user.write(textutils.serialize(users))
  338.                 user.close()
  339.                 login()
  340.             end
  341.         end
  342.     end
  343. end
  344.  
  345. os.pullEvent = os.pullEventRaw
  346. checkForUsers()
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement