aboutsummaryrefslogtreecommitdiff
path: root/System/apis
diff options
context:
space:
mode:
authorAndrew Lee <alee14498@protonmail.com>2020-11-15 13:37:32 -0500
committerAndrew Lee <alee14498@protonmail.com>2020-11-15 13:37:32 -0500
commit621e13d8bed7215a076e505eba998c7a0ec38519 (patch)
tree46a8be63ce5fe3c5a38bfbdce6ec269382f39c01 /System/apis
parentbed8f884aa3acbca1bc5a0772c73d17c373be77e (diff)
downloadbits-UI-621e13d8bed7215a076e505eba998c7a0ec38519.tar.gz
bits-UI-621e13d8bed7215a076e505eba998c7a0ec38519.tar.bz2
bits-UI-621e13d8bed7215a076e505eba998c7a0ec38519.zip
New program system; Capitalized folders
Diffstat (limited to 'System/apis')
-rw-r--r--System/apis/flib.lua124
-rw-r--r--System/apis/json.lua209
-rw-r--r--System/apis/sha256.lua204
3 files changed, 537 insertions, 0 deletions
diff --git a/System/apis/flib.lua b/System/apis/flib.lua
new file mode 100644
index 0000000..c3b7150
--- /dev/null
+++ b/System/apis/flib.lua
@@ -0,0 +1,124 @@
+--[[
+ fLib by NDFJay
+]]--
+function exists(path)
+ local file = assert(io.open(path, "r"))
+ if file ~= nil then
+ file:close()
+ return true
+ end
+
+ return false
+end
+
+function getTable(path)
+ if exists(path) then
+ local file = io.open(path, "r")
+ local lines = {}
+ local i = 1
+ local line = file:read("*l")
+ while line ~= nil do
+ lines[i] = line
+ line = file:read("*l")
+ i = i + 1
+ end
+ file:close()
+ return lines
+ end
+ return {}
+end
+
+function getLine(path, n)
+ if exists(path) then
+ local lines = getTable(path)
+ return lines[n]
+ end
+ return ""
+end
+
+function getText(path)
+ if exists(path) then
+ local file = assert(io.open(path, "r"))
+ return file:read("*a")
+ end
+ return ""
+end
+
+function fappend(path, text)
+ local file = assert(io.open(path, "a"))
+ file:write(text.."\n")
+ file:close()
+end
+
+function fwrite(path, text)
+ local file = assert(io.open(path, "w"))
+ file:write(text)
+ file:close()
+end
+
+function fwriteAtStart(path, text)
+ local _text = getText(path)
+ fwrite(path, text.."\n".._text)
+end
+
+function fwriteFromTable(path, t)
+ local text = ""
+ for _, line in pairs(t) do
+ text = text..line.."\n"
+ end
+ fwrite(path, text)
+end
+
+function fappendFromTable(path, t)
+ local text = ""
+ for _, line in pairs(t) do
+ text = text..line.."\n"
+ end
+ fappend(path, text)
+end
+
+function fwriteAtStartFromTable(path, t)
+ local text = ""
+ for _, line in pairs(t) do
+ text = text..line.."\n"
+ end
+ fwriteAtStart(path, text)
+end
+
+function replaceLine(path, n, text)
+ local lines = getTable(path)
+ lines[n] = text
+ fwriteFromTable(path, lines)
+end
+
+function getName(path)
+ if exists(path) then
+ local lastSlashPos = 1
+ for i = 1, path:len() do
+ if path:sub(i, i) == "/" then
+ lastSlashPos = i
+ end
+ end
+
+ return path:sub(lastSlashPos + 1)
+ end
+ return ""
+end
+
+function getPath(path)
+ if exists(path) then
+ local lastSlashPos = 1
+ for i = 1, path:len() do
+ if path:sub(i, i) == "/" then
+ lastSlashPos = i
+ end
+ end
+
+ return path:sub(1, lastSlashPos)
+ end
+ return ""
+end
+
+function fremove(path)
+ os.remove(path)
+end \ No newline at end of file
diff --git a/System/apis/json.lua b/System/apis/json.lua
new file mode 100644
index 0000000..3bef482
--- /dev/null
+++ b/System/apis/json.lua
@@ -0,0 +1,209 @@
+------------------------------------------------------------------ utils
+local controls = {["\n"]="\\n", ["\r"]="\\r", ["\t"]="\\t", ["\b"]="\\b", ["\f"]="\\f", ["\""]="\\\"", ["\\"]="\\\\"}
+
+local function isArray(t)
+ local max = 0
+ for k,v in pairs(t) do
+ if type(k) ~= "number" then
+ return false
+ elseif k > max then
+ max = k
+ end
+ end
+ return max == #t
+end
+
+local whites = {['\n']=true; ['\r']=true; ['\t']=true; [' ']=true; [',']=true; [':']=true}
+function removeWhite(str)
+ while whites[str:sub(1, 1)] do
+ str = str:sub(2)
+ end
+ return str
+end
+
+------------------------------------------------------------------ encoding
+
+local function encodeCommon(val, pretty, tabLevel, tTracking)
+ local str = ""
+
+ -- Tabbing util
+ local function tab(s)
+ str = str .. ("\t"):rep(tabLevel) .. s
+ end
+
+ local function arrEncoding(val, bracket, closeBracket, iterator, loopFunc)
+ str = str .. bracket
+ if pretty then
+ str = str .. "\n"
+ tabLevel = tabLevel + 1
+ end
+ for k,v in iterator(val) do
+ tab("")
+ loopFunc(k,v)
+ str = str .. ","
+ if pretty then str = str .. "\n" end
+ end
+ if pretty then
+ tabLevel = tabLevel - 1
+ end
+ if str:sub(-2) == ",\n" then
+ str = str:sub(1, -3) .. "\n"
+ elseif str:sub(-1) == "," then
+ str = str:sub(1, -2)
+ end
+ tab(closeBracket)
+ end
+
+ -- Table encoding
+ if type(val) == "table" then
+ assert(not tTracking[val], "Cannot encode a table holding itself recursively")
+ tTracking[val] = true
+ if isArray(val) then
+ arrEncoding(val, "[", "]", ipairs, function(k,v)
+ str = str .. encodeCommon(v, pretty, tabLevel, tTracking)
+ end)
+ else
+ arrEncoding(val, "{", "}", pairs, function(k,v)
+ assert(type(k) == "string", "JSON object keys must be strings", 2)
+ str = str .. encodeCommon(k, pretty, tabLevel, tTracking)
+ str = str .. (pretty and ": " or ":") .. encodeCommon(v, pretty, tabLevel, tTracking)
+ end)
+ end
+ -- String encoding
+ elseif type(val) == "string" then
+ str = '"' .. val:gsub("[%c\"\\]", controls) .. '"'
+ -- Number encoding
+ elseif type(val) == "number" or type(val) == "boolean" then
+ str = tostring(val)
+ else
+ error("JSON only supports arrays, objects, numbers, booleans, and strings", 2)
+ end
+ return str
+end
+
+function encode(val)
+ return encodeCommon(val, false, 0, {})
+end
+
+function encodePretty(val)
+ return encodeCommon(val, true, 0, {})
+end
+
+------------------------------------------------------------------ decoding
+
+local decodeControls = {}
+for k,v in pairs(controls) do
+ decodeControls[v] = k
+end
+
+function parseBoolean(str)
+ if str:sub(1, 4) == "true" then
+ return true, removeWhite(str:sub(5))
+ else
+ return false, removeWhite(str:sub(6))
+ end
+end
+
+function parseNull(str)
+ return nil, removeWhite(str:sub(5))
+end
+
+local numChars = {['e']=true; ['E']=true; ['+']=true; ['-']=true; ['.']=true}
+function parseNumber(str)
+ local i = 1
+ while numChars[str:sub(i, i)] or tonumber(str:sub(i, i)) do
+ i = i + 1
+ end
+ local val = tonumber(str:sub(1, i - 1))
+ str = removeWhite(str:sub(i))
+ return val, str
+end
+
+function parseString(str)
+ str = str:sub(2)
+ local s = ""
+ while str:sub(1,1) ~= "\"" do
+ local next = str:sub(1,1)
+ str = str:sub(2)
+ assert(next ~= "\n", "Unclosed string")
+
+ if next == "\\" then
+ local escape = str:sub(1,1)
+ str = str:sub(2)
+
+ next = assert(decodeControls[next..escape], "Invalid escape character")
+ end
+
+ s = s .. next
+ end
+ return s, removeWhite(str:sub(2))
+end
+
+function parseArray(str)
+ str = removeWhite(str:sub(2))
+
+ local val = {}
+ local i = 1
+ while str:sub(1, 1) ~= "]" do
+ local v = nil
+ v, str = parseValue(str)
+ val[i] = v
+ i = i + 1
+ str = removeWhite(str)
+ end
+ str = removeWhite(str:sub(2))
+ return val, str
+end
+
+function parseObject(str)
+ str = removeWhite(str:sub(2))
+
+ local val = {}
+ while str:sub(1, 1) ~= "}" do
+ local k, v = nil, nil
+ k, v, str = parseMember(str)
+ val[k] = v
+ str = removeWhite(str)
+ end
+ str = removeWhite(str:sub(2))
+ return val, str
+end
+
+function parseMember(str)
+ local k = nil
+ k, str = parseValue(str)
+ local val = nil
+ val, str = parseValue(str)
+ return k, val, str
+end
+
+function parseValue(str)
+ local fchar = str:sub(1, 1)
+ if fchar == "{" then
+ return parseObject(str)
+ elseif fchar == "[" then
+ return parseArray(str)
+ elseif tonumber(fchar) ~= nil or numChars[fchar] then
+ return parseNumber(str)
+ elseif str:sub(1, 4) == "true" or str:sub(1, 5) == "false" then
+ return parseBoolean(str)
+ elseif fchar == "\"" then
+ return parseString(str)
+ elseif str:sub(1, 4) == "null" then
+ return parseNull(str)
+ end
+ return nil
+end
+
+function decode(str)
+ str = removeWhite(str)
+ t = parseValue(str)
+ return t
+end
+
+function decodeFromFile(path)
+ local file = assert(fs.open(path, "r"))
+ local decoded = decode(file.readAll())
+ file.close()
+ return decoded
+end \ No newline at end of file
diff --git a/System/apis/sha256.lua b/System/apis/sha256.lua
new file mode 100644
index 0000000..5842c8d
--- /dev/null
+++ b/System/apis/sha256.lua
@@ -0,0 +1,204 @@
+-- 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 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 t2, t1
+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 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 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 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
+ }
+}
+
+ 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
+
+ function digest(data)
+ local data = data or ""
+ data = type(data) == "table" and {upack(data)} or {tostring(data):byte(1,-1)}
+
+ data = preprocess(data)
+ local C = {upack(H)}
+ for i = 1, #data 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 = 64
+
+ 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 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
+
+ return setmetatable(out, mt)
+end
+
+return {
+ digest = digest,
+ hmac = hmac,
+ pbkdf2 = pbkdf2,
+} \ No newline at end of file