------ Credits to Anavrins for SHA-256 in LUA API (Without him this = impossible) --- Please rush down this is just SHA-256 code local mod32 = 2^32 local sha_hashlen = 32 local sha_blocksize = 64 local band = bit32 and bit32.band or bit.band local bnot = bit32 and bit32.bnot or bit.bnot local bxor = bit32 and bit32.bxor or bit.bxor local blshift = bit32 and bit32.lshift or bit.blshift local upack = unpack local function rrotate(n, b) local s = n/(2^b) local f = s%1 return (s-f) + f*mod32 end local function brshift(int, by) -- Thanks bit32 for bad rshift local s = int / (2^by) return s - s%1 end local H = { 0x6a09e667, 0xbb67ae85, 0x3c6ef372, 0xa54ff53a, 0x510e527f, 0x9b05688c, 0x1f83d9ab, 0x5be0cd19, } local K = { 0x428a2f98, 0x71374491, 0xb5c0fbcf, 0xe9b5dba5, 0x3956c25b, 0x59f111f1, 0x923f82a4, 0xab1c5ed5, 0xd807aa98, 0x12835b01, 0x243185be, 0x550c7dc3, 0x72be5d74, 0x80deb1fe, 0x9bdc06a7, 0xc19bf174, 0xe49b69c1, 0xefbe4786, 0x0fc19dc6, 0x240ca1cc, 0x2de92c6f, 0x4a7484aa, 0x5cb0a9dc, 0x76f988da, 0x983e5152, 0xa831c66d, 0xb00327c8, 0xbf597fc7, 0xc6e00bf3, 0xd5a79147, 0x06ca6351, 0x14292967, 0x27b70a85, 0x2e1b2138, 0x4d2c6dfc, 0x53380d13, 0x650a7354, 0x766a0abb, 0x81c2c92e, 0x92722c85, 0xa2bfe8a1, 0xa81a664b, 0xc24b8b70, 0xc76c51a3, 0xd192e819, 0xd6990624, 0xf40e3585, 0x106aa070, 0x19a4c116, 0x1e376c08, 0x2748774c, 0x34b0bcb5, 0x391c0cb3, 0x4ed8aa4a, 0x5b9cca4f, 0x682e6ff3, 0x748f82ee, 0x78a5636f, 0x84c87814, 0x8cc70208, 0x90befffa, 0xa4506ceb, 0xbef9a3f7, 0xc67178f2, } local function incr(t, incr) if 0xFFFFFFFF - t[1] < incr then t[2] = t[2] + 1 t[1] = incr - (0xFFFFFFFF - t[1]) - 1 else t[1] = t[1] + incr end return t end local function preprocess(data) local len = #data data[#data+1] = 0x80 while #data%64~=56 do data[#data+1] = 0 end local l = incr({0,0}, len*8) for i = 2, 1, -1 do data[#data+1] = band(brshift(band(l[i], 0xFF000000), 24), 0xFF) data[#data+1] = band(brshift(band(l[i], 0xFF0000), 16), 0xFF) data[#data+1] = band(brshift(band(l[i], 0xFF00), 8), 0xFF) data[#data+1] = band(l[i], 0xFF) end return data end local function BE_toInt(bs, i) return blshift((bs[i] or 0), 24) + blshift((bs[i+1] or 0), 16) + blshift((bs[i+2] or 0), 8) + (bs[i+3] or 0) end local function digestblock(data, i, C) local w = {} for j = 1, 16 do w[j] = BE_toInt(data, i+(j-1)*4) end for j = 17, 64 do local v = w[j-15] local s0 = bxor(bxor(rrotate(w[j-15], 7), rrotate(w[j-15], 18)), brshift(w[j-15], 3)) local s1 = bxor(bxor(rrotate(w[j-2], 17), rrotate(w[j-2], 19)), brshift(w[j-2], 10)) w[j] = (w[j-16] + s0 + w[j-7] + s1)%mod32 end local a, b, c, d, e, f, g, h = upack(C) for j = 1, 64 do local S1 = bxor(bxor(rrotate(e, 6), rrotate(e, 11)), rrotate(e, 25)) local ch = bxor(band(e, f), band(bnot(e), g)) local temp1 = (h + S1 + ch + K[j] + w[j])%mod32 local S0 = bxor(bxor(rrotate(a, 2), rrotate(a, 13)), rrotate(a, 22)) local maj = bxor(bxor(band(a, b), band(a, c)), band(b, c)) local temp2 = (S0 + maj)%mod32 h, g, f, e, d, c, b, a = g, f, e, (d+temp1)%mod32, c, b, a, (temp1+temp2)%mod32 end C[1] = (C[1] + a)%mod32 C[2] = (C[2] + b)%mod32 C[3] = (C[3] + c)%mod32 C[4] = (C[4] + d)%mod32 C[5] = (C[5] + e)%mod32 C[6] = (C[6] + f)%mod32 C[7] = (C[7] + g)%mod32 C[8] = (C[8] + h)%mod32 return C end local mt = { __tostring = function(a) return string.char(unpack(a)) end, __index = { toHex = function(self, s) return ("%02x"):rep(#self):format(unpack(self)) end, isEqual = function(self, t) if type(t) ~= "table" then return false end if #self ~= #t then return false end local ret = 0 for i = 1, #self do ret = bit32.bor(ret, bxor(self[i], t[i])) end return ret == 0 end } } local function toBytes(t, n) local b = {} for i = 1, n do b[(i-1)*4+1] = band(brshift(band(t[i], 0xFF000000), 24), 0xFF) b[(i-1)*4+2] = band(brshift(band(t[i], 0xFF0000), 16), 0xFF) b[(i-1)*4+3] = band(brshift(band(t[i], 0xFF00), 8), 0xFF) b[(i-1)*4+4] = band(t[i], 0xFF) end return setmetatable(b, mt) end function digest(data) data = data or "" data = type(data) == "string" and {data:byte(1,-1)} or data data = preprocess(data) local C = {upack(H)} for i = 1, #data, 64 do C = digestblock(data, i, C) end return toBytes(C, 8) end function hmac(data, key) local data = type(data) == "table" and {upack(data)} or {tostring(data):byte(1,-1)} local key = type(key) == "table" and {upack(key)} or {tostring(key):byte(1,-1)} local blocksize = sha_blocksize key = #key > blocksize and digest(key) or key local ipad = {} local opad = {} local padded_key = {} for i = 1, blocksize do ipad[i] = bxor(0x36, key[i] or 0) opad[i] = bxor(0x5C, key[i] or 0) end for i = 1, #data do ipad[blocksize+i] = data[i] end ipad = digest(ipad) for i = 1, blocksize do padded_key[i] = opad[i] padded_key[blocksize+i] = ipad[i] end return digest(padded_key) end function pbkdf2(pass, salt, iter, dklen) local out = {} local hashlen = sha_hashlen local block = 1 dklen = dklen or 32 while dklen > 0 do local ikey = {} local isalt = type(salt) == "table" and {upack(salt)} or {tostring(salt):byte(1,-1)} local clen = dklen > hashlen and hashlen or dklen isalt[#isalt+1] = band(brshift(band(block, 0xFF000000), 24), 0xFF) isalt[#isalt+1] = band(brshift(band(block, 0xFF0000), 16), 0xFF) isalt[#isalt+1] = band(brshift(band(block, 0xFF00), 8), 0xFF) isalt[#isalt+1] = band(block, 0xFF) for j = 1, iter do isalt = hmac(isalt, pass) for k = 1, clen do ikey[k] = bxor(isalt[k], ikey[k] or 0) end if j % 200 == 0 then os.queueEvent("PBKDF2", j) coroutine.yield("PBKDF2") end end dklen = dklen - clen block = block+1 for k = 1, clen do out[#out+1] = ikey[k] end end return setmetatable(out, mt) end --[[---------------------------------------------------------- Main Functions Begin SHA-256 Code END -----------------------------------------------------------]]-- token = "def_tk_010sk25jsmiq25jgsm23915asddrasdf" -- If you edit this, remember it and edit this in your disk lost password too! else u wont be able to ever recover password. function encrypt(str, saltt) return pbkdf2(str, saltt, 128):toHex() end oldPullEvent = os.pullEvent os.pullEvent = os.pullEventRaw function CheckInstallation() print("NOTE: Disk's must be the first one attached") sleep(0.5) if not fs.exists("DiskLock.shx") then term.clear() term.setCursorPos(1,1) print("Do you want to create a computer lock?") print("Valid Values: yes/no (Case-Sensitive)") val = read() if val == "yes" then term.clear() term.setCursorPos(1, 1) if not fs.exists("/disk/") then oldCol = term.getTextColor() if term.isColor() then term.setTextColor(colors.blue) end print("Please insert your disk, After press enter to continue") if term.isColor() then term.setTextColor(colors.black) end entr = read("") if term.isColor() then term.setTextColor(oldCol) end CheckInstallation() else oldCol = term.getTextColor() if term.isColor() then term.setTextColor(colors.lightBlue) end print("Found Disc Continuing...") if term.isColor() then term.setTextColor(oldCol) end sleep(0.3) term.clear() term.setCursorPos(1, 1) oldCol = term.getTextColor() if term.isColor() then term.setTextColor(colors.orange) end print("Please insert your desired password!") print(" Remember this since it can create your another password disk!") if term.isColor() then term.setTextColor(colors.green) end pass = read("*") if term.isColor() then term.setTextColor(oldCol) end if pass == nil or pass == "" or pass == " " or pass == "123" or pass == "abc" then sleep(1.0) term.clear() term.setCursorPos(1, 1) oldCol = term.getTextColor() if term.isColor() then term.setTextColor(colors.red) end print("Its a dumb password!") if term.isColor() then term.setTextColor(oldCol) end error() else handle = fs.open("DiskLock.shx", "w") compId = os.computerID() idwpass = compId ..":" ..token term.clear() if term.isColor() then oco2 = term.getTextColor() term.setTextColor(colors.yellow) end print("Encrypting Now, It will take some time but you will get better results too!") if term.isColor() then term.setTextColor(oco2) end enc_pass = encrypt(pass, idwpass) handle.write(enc_pass) handle.close() if fs.exists("disk/DiskLock.shc") then fs.delete("disk/DiskLock.shc") end handle = fs.open("disk/DiskLock.shc", "w") handle.write(enc_pass) handle.close() shell.run("set shell.allow_disk_startup false") term.clear() term.setCursorPos(1, 1) oldCol = term.getTextColor() if term.isColor() then term.setTextColor(colors.green) end print(" " ..tostring(compId) .. " is your computer id, Remember it to recover password disk") sleep(5) term.clear() print("Success, Rebooting now to apply changes...") if term.isColor() then term.setTextColor(oldCol) end sleep(1) os.reboot() end end elseif val == "no" then term.clear() term.setCursorPos(1, 1) oldCol = term.getTextColor() if term.isColor() then term.setTextColor(colors.red) end print("You chose NO, Continuing to Boot") if term.isColor() then term.setTextColor(oldCol) end error() else term.clear() term.setCursorPos(1, 1) oldCol = term.getTextColor() if term.isColor() then term.setTextColor(colors.blue) end print("Unknown/Idiotic Value...") if term.isColor() then term.setTextColor(oldCol) end error() end end end function CheckLogin() term.clear() term.setCursorPos(1,1) if fs.exists("DiskLock.shx") then shell.run("set shell.allow_disk_startup false") term.clear() term.setCursorPos(1, 1) if not fs.exists("/disk/") then term.clear() oldCol = term.getTextColor() if term.isColor() then term.setTextColor(colors.red) end print("Welcome, Please insert the login disk!") if term.isColor() then term.setTextColor(colors.yellow) end print("Press enter once done.") if term.isColor() then term.setTextColor(colors.black) end xazz = read("") if term.isColor() then term.setTextColor(oldCol) end CheckLogin() else oldCol = term.getTextColor() if term.isColor() then term.setTextColor(colors.orange) end print("Reading Disk.....") if term.isColor() then term.setTextColor(oldCol) end sleep(1) if not fs.exists("disk/DiskLock.shc") then oldCol = term.getTextColor() if term.isColor() then term.setTextColor(colors.red) end print("This disk does not contain login files!") if term.isColor() then term.setTextColor(oldCol) end sleep(1) CheckLogin() else pathTofile = shell.resolve("disk/DiskLock.shc") file = fs.open(pathTofile, "r") if file then diskdata = file.readAll() file.close() p2f2 = shell.resolve("DiskLock.shx") file2 = fs.open(p2f2, "r") if not file2 then oldCol = term.getTextColor() if term.isColor() then term.setTextColor(colors.red) end print("Computer failed to read the login data, File.IO Failure!") print("Computer has not continued to boot.") if term.isColor() then term.setTextColor(oldCol) end end logindata = file2.readAll() file2.close() if (diskdata == logindata) then oldCol = term.getTextColor() if term.isColor() then term.setTextColor(colors.red) end shell.run("eject", "left") shell.run("eject", "right") shell.run("eject", "top") shell.run("eject", "bottom") term.clear() oldCol = term.getTextColor() if term.isColor() then term.setTextColor(colors.green) end print("Welcome back!") if term.isColor() then term.setTextColor(oldCol) end os.pullEvent = oldPullEvent error() else oldCol = term.getTextColor() if term.isColor() then term.setTextColor(colors.red) end print("The login data dosen't match!") if term.isColor() then term.setTextColor(oldCol) end sleep(1) CheckLogin() end else oldCol = term.getTextColor() if term.isColor() then term.setTextColor(colors.red) end print("Failed to read the disk file!") if term.isColor() then term.setTextColor(oldCol) end sleep(1) CheckLogin() end end end end end CheckInstallation() CheckLogin()