aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--README.md2
-rw-r--r--startup.lua16
-rw-r--r--system/apis/sha256.lua338
-rw-r--r--system/boot.lua16
-rw-r--r--system/post-setup.lua7
-rw-r--r--system/recovery/main.lua2
6 files changed, 198 insertions, 183 deletions
diff --git a/README.md b/README.md
index effa70d..7b49cba 100644
--- a/README.md
+++ b/README.md
@@ -12,7 +12,7 @@ The programs/apis I used for bits-UI.
- FireWolf by GravityScore and 1lann
- Mouse File Browser by Stiepen irc(Kilobyte), Cruor and BigSHinyToys
- fLib by NDFJay
-- Sha256 by CompuTech
+- Sha256 by Anavrins
- JSON API by ElvishJerricco
# Installation
diff --git a/startup.lua b/startup.lua
index eccb3b6..424850e 100644
--- a/startup.lua
+++ b/startup.lua
@@ -51,7 +51,7 @@ function bootloaderInput()
if input == "1" then
clear()
print("Loading bits-UI...")
- sleep(3)
+ sleep(1)
clear()
if fs.exists(boot) then
shell.run("/system/boot.lua")
@@ -61,26 +61,26 @@ function bootloaderInput()
print("[ERROR] System has been halted.")
term.setCursorPos(1,2)
print("Details: Cannot find boot.lua")
- sleep(3)
+ sleep(2)
os.shutdown()
end
elseif input == "2" then
clear()
if devMode == true then
- print("Developer mode is set to true! Which means that you cannot update, you must use github to update.")
- sleep(3)
+ print("Developer mode is set to true!\n Which means that you cannot update, you must use github to update.")
+ sleep(2)
clear()
bootloader()
bootloaderInput()
else
print("Running the updater...")
- sleep(3)
+ sleep(1)
shell.run("pastebin", "run", "7XY80hfG")
end
elseif input == "3" then
clear()
print("Running Recovery Mode...")
- sleep(2)
+ sleep(1)
shell.run("/system/recovery/main.lua")
elseif input == "4" then
clear()
@@ -90,7 +90,7 @@ function bootloaderInput()
term.setTextColor(1)
else
print("[ERROR] Invalid number.")
- sleep(2)
+ sleep(1)
clear()
bootloader()
bootloaderInput()
@@ -115,6 +115,6 @@ else
print("[ERROR] System cannot find bubl.cfg...")
term.setCursorPos(1,2)
print("System halted...")
- sleep(3)
+ sleep(2)
os.shutdown()
end
diff --git a/system/apis/sha256.lua b/system/apis/sha256.lua
index 9c57269..5842c8d 100644
--- a/system/apis/sha256.lua
+++ b/system/apis/sha256.lua
@@ -1,194 +1,204 @@
--- From http://pastebin.com/gsFrNjbt linked from http://www.computercraft.info/forums2/index.php?/topic/8169-sha-256-in-pure-lua/
-
---
--- Adaptation of the Secure Hashing Algorithm (SHA-244/256)
--- Found Here: http://lua-users.org/wiki/SecureHashAlgorithm
---
--- Using an adapted version of the bit library
--- Found Here: https://bitbucket.org/Boolsheet/bslf/src/1ee664885805/bit.lua
---
-
-local MOD = 2^32
-local MODM = MOD-1
-
-local function memoize(f)
- local mt = {}
- local t = setmetatable({}, mt)
- function mt:__index(k)
- local v = f(k)
- t[k] = v
- return v
- end
- return t
+-- SHA-256, HMAC and PBKDF2 functions in ComputerCraft
+-- By Anavrins
+-- For help and details, you can PM me on the CC forums
+-- http://www.computercraft.info/forums2/index.php?/user/12870-anavrins
+-- You may use this code in your projects without asking me, as long as credit is given
+
+-- Pastebin: https://pastebin.com/6UV4qfNF
+-- Usage: https://pastebin.com/q2SQ7eRg
+-- Last update: May 13, 2019
+
+local mod32 = 2^32
+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 function make_bitop_uncached(t, m)
- local function bitop(a, b)
- local res,p = 0,1
- while a ~= 0 and b ~= 0 do
- local am, bm = a % m, b % m
- res = res + t[am][bm] * p
- a = (a - am) / m
- b = (b - bm) / m
- p = p*m
- end
- res = res + (a + b) * p
- return res
+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 counter(incr)
+ local t1, t2 = 0, 0
+ if 0xFFFFFFFF - t1 < incr then
+ t2 = t2 + 1
+ t1 = incr - (0xFFFFFFFF - t1) - 1
+ else t1 = t1 + incr
end
- return bitop
+ return t2, t1
end
-local function make_bitop(t)
- local op1 = make_bitop_uncached(t,2^1)
- local op2 = memoize(function(a) return memoize(function(b) return op1(a, b) end) end)
- return make_bitop_uncached(op2, 2 ^ (t.n or 1))
+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 bxor1 = make_bitop({[0] = {[0] = 0,[1] = 1}, [1] = {[0] = 1, [1] = 0}, n = 4})
-
-local function bxor(a, b, c, ...)
- local z = nil
- if b then
- a = a % MOD
- b = b % MOD
- z = bxor1(a, b)
- if c then z = bxor(z, c, ...) end
- return z
- elseif a then return a % MOD
- else return 0 end
+local function preprocess(data)
+ local len = #data
+ local proc = {}
+ data[#data+1] = 0x80
+ while #data%64~=56 do data[#data+1] = 0 end
+ local blocks = math.ceil(#data/64)
+ for i = 1, blocks do
+ proc[i] = {}
+ for j = 1, 16 do
+ proc[i][j] = BE_toInt(data, 1+((i-1)*64)+((j-1)*4))
+ end
+ end
+ proc[blocks][15], proc[blocks][16] = counter(len*8)
+ return proc
end
-local function band(a, b, c, ...)
- local z
- if b then
- a = a % MOD
- b = b % MOD
- z = ((a + b) - bxor1(a,b)) / 2
- if c then z = bit32_band(z, c, ...) end
- return z
- elseif a then return a % MOD
- else return MODM end
+local function digestblock(w, C)
+ 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 function bnot(x) return (-1 - x) % MOD 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 rshift1(a, disp)
- if disp < 0 then return lshift(a,-disp) end
- return math.floor(a % 2 ^ 32 / 2 ^ disp)
+ function toBytes(t, n)
+ local b = {}
+ for i = 1, n do
+ b[(i-1)*4+1] = band(brshift(t[i], 24), 0xFF)
+ b[(i-1)*4+2] = band(brshift(t[i], 16), 0xFF)
+ b[(i-1)*4+3] = band(brshift(t[i], 8), 0xFF)
+ b[(i-1)*4+4] = band(t[i], 0xFF)
+ end
+ return setmetatable(b, mt)
end
-local function rshift(x, disp)
- if disp > 31 or disp < -31 then return 0 end
- return rshift1(x % MOD, disp)
-end
+ function digest(data)
+ local data = data or ""
+ data = type(data) == "table" and {upack(data)} or {tostring(data):byte(1,-1)}
-local function lshift(a, disp)
- if disp < 0 then return rshift(a,-disp) end
- return (a * 2 ^ disp) % 2 ^ 32
+ data = preprocess(data)
+ local C = {upack(H)}
+ for i = 1, #data do C = digestblock(data[i], C) end
+ return toBytes(C, 8)
end
-local function rrotate(x, disp)
- x = x % MOD
- disp = disp % 32
- local low = band(x, 2 ^ disp - 1)
- return rshift(x, disp) + lshift(low, 32 - disp)
-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 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 blocksize = 64
-local function str2hexa(s)
- return (string.gsub(s, ".", function(c) return string.format("%02x", string.byte(c)) end))
-end
+ key = #key > blocksize and digest(key) or key
-local function num2s(l, n)
- local s = ""
- for i = 1, n do
- local rem = l % 256
- s = string.char(rem) .. s
- l = (l - rem) / 256
- end
- return s
-end
+ local ipad = {}
+ local opad = {}
+ local padded_key = {}
-local function s232num(s, i)
- local n = 0
- for i = i, i + 3 do n = n*256 + string.byte(s, i) end
- return n
-end
+ for i = 1, blocksize do
+ ipad[i] = bxor(0x36, key[i] or 0)
+ opad[i] = bxor(0x5C, key[i] or 0)
+ end
-local function preproc(msg, len)
- local extra = 64 - ((len + 9) % 64)
- len = num2s(8 * len, 8)
- msg = msg .. "\128" .. string.rep("\0", extra) .. len
- assert(#msg % 64 == 0)
- return msg
-end
+ for i = 1, #data do
+ ipad[blocksize+i] = data[i]
+ end
-local function initH256(H)
- H[1] = 0x6a09e667
- H[2] = 0xbb67ae85
- H[3] = 0x3c6ef372
- H[4] = 0xa54ff53a
- H[5] = 0x510e527f
- H[6] = 0x9b05688c
- H[7] = 0x1f83d9ab
- H[8] = 0x5be0cd19
- return H
-end
+ ipad = digest(ipad)
-local function digestblock(msg, i, H)
- local w = {}
- for j = 1, 16 do w[j] = s232num(msg, i + (j - 1)*4) end
- for j = 17, 64 do
- local v = w[j - 15]
- local s0 = bxor(rrotate(v, 7), rrotate(v, 18), rshift(v, 3))
- v = w[j - 2]
- w[j] = w[j - 16] + s0 + w[j - 7] + bxor(rrotate(v, 17), rrotate(v, 19), rshift(v, 10))
+ for i = 1, blocksize do
+ padded_key[i] = opad[i]
+ padded_key[blocksize+i] = ipad[i]
end
- 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]
- for i = 1, 64 do
- local s0 = bxor(rrotate(a, 2), rrotate(a, 13), rrotate(a, 22))
- local maj = bxor(band(a, b), band(a, c), band(b, c))
- local t2 = s0 + maj
- local s1 = bxor(rrotate(e, 6), rrotate(e, 11), rrotate(e, 25))
- local ch = bxor (band(e, f), band(bnot(e), g))
- local t1 = h + s1 + ch + k[i] + w[i]
- h, g, f, e, d, c, b, a = g, f, e, d + t1, c, b, a, t1 + t2
+ return digest(padded_key)
+end
+
+ function pbkdf2(pass, salt, iter, dklen)
+ local salt = type(salt) == "table" and salt or {tostring(salt):byte(1,-1)}
+ local hashlen = 32
+ local dklen = dklen or 32
+ local block = 1
+ local out = {}
+
+ while dklen > 0 do
+ local ikey = {}
+ local isalt = {upack(salt)}
+ local clen = dklen > hashlen and hashlen or dklen
+
+ isalt[#isalt+1] = band(brshift(block, 24), 0xFF)
+ isalt[#isalt+1] = band(brshift(block, 16), 0xFF)
+ isalt[#isalt+1] = band(brshift(block, 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
- H[1] = band(H[1] + a)
- H[2] = band(H[2] + b)
- H[3] = band(H[3] + c)
- H[4] = band(H[4] + d)
- H[5] = band(H[5] + e)
- H[6] = band(H[6] + f)
- H[7] = band(H[7] + g)
- H[8] = band(H[8] + h)
+ return setmetatable(out, mt)
end
--- Made this global
-function sha256(msg)
- msg = preproc(msg, #msg)
- local H = initH256({})
- for i = 1, #msg, 64 do digestblock(msg, i, H) end
- return str2hexa(num2s(H[1], 4) .. num2s(H[2], 4) .. num2s(H[3], 4) .. num2s(H[4], 4) ..
- num2s(H[5], 4) .. num2s(H[6], 4) .. num2s(H[7], 4) .. num2s(H[8], 4))
-end \ No newline at end of file
+return {
+ digest = digest,
+ hmac = hmac,
+ pbkdf2 = pbkdf2,
+} \ No newline at end of file
diff --git a/system/boot.lua b/system/boot.lua
index 5418427..c1caace 100644
--- a/system/boot.lua
+++ b/system/boot.lua
@@ -20,7 +20,7 @@ term.clear()
term.setCursorPos(1,1)
print("Starting up bits-UI ".. version .."...")
-sleep(2)
+sleep(1)
if term.isColor() then
term.setTextColor(colors.green)
@@ -31,7 +31,7 @@ else
os.shutdown()
end
-sleep(2)
+sleep(1)
if fs.exists(desktop) then
term.setTextColor(colors.green)
@@ -39,11 +39,11 @@ if fs.exists(desktop) then
else
term.setTextColor(colors.red)
print("[ERROR] Desktop cannot be found...")
- sleep(3)
+ sleep(2)
os.shutdown()
end
-sleep(2)
+sleep(1)
if fs.exists("/home") then
term.setTextColor(colors.green)
@@ -63,7 +63,7 @@ else
print("[OK] Etc directory has been created...")
end
-sleep(2)
+sleep(1)
if fs.exists("/home/.config") then
term.setTextColor(colors.green)
@@ -74,13 +74,13 @@ else
term.setTextColor(colors.blue)
print("[INFO] Config has not been found!")
print("[INFO] You will be sent to the post installation setup...")
- sleep(3)
+ sleep(2)
shell.run("/system/post-setup.lua")
end
-sleep(2)
+sleep(1)
term.setTextColor(colors.green)
print("[DONE] Boot sequence has been completed...")
term.setTextColor(colors.white)
-sleep(2)
+sleep(1)
shell.run(desktop) \ No newline at end of file
diff --git a/system/post-setup.lua b/system/post-setup.lua
index 9ff14d6..2adc201 100644
--- a/system/post-setup.lua
+++ b/system/post-setup.lua
@@ -13,6 +13,8 @@
GNU General Public License for more details.
]]--
os.loadAPI("/system/apis/sha256.lua")
+os.loadAPI("/system/apis/json.lua")
+local config = "/home/.config"
term.clear()
term.setCursorPos(1,1)
@@ -37,7 +39,7 @@ end
print("Welcome to the bits-UI Post Setup!")
sleep(2)
print("Please enter your password.")
-print("(Don't set your real password in servers.)")
+--print("(Don't set your real password in servers.)")
local passPath = "/etc/passwd.pwd"
if fs.exists(passPath) then
@@ -46,7 +48,8 @@ if fs.exists(passPath) then
else
local passwd = read(" ")
local insertPasswd = fs.open(passPath, "a")
- insertPasswd.writeLine(passwd)
+ local hashedString = sha256.pbkdf2(passwd, 2, 32):toHex()
+ insertPasswd.writeLine(hashedString)
insertPasswd.close()
print("Thanks, I will save that.")
end
diff --git a/system/recovery/main.lua b/system/recovery/main.lua
index 39c1ec5..944e168 100644
--- a/system/recovery/main.lua
+++ b/system/recovery/main.lua
@@ -24,4 +24,6 @@ if input == "reset" then
shell.run("/system/recovery/reset.lua")
elseif input == "transfer" then
shell.run("/system/recovery/transfer.lua")
+else
+ shell.run("/startup.lua")
end \ No newline at end of file