Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- rednet.host("luabank", "database")
- local crypt
- local function log(txt)
- local file = fs.open("banklog", "a")
- file.writeLine(txt)
- file.close()
- print(txt)
- end
- for i,v in pairs(peripheral.getNames()) do
- if peripheral.getType(v) == "cryptographic accelerator" then
- crypt = peripheral.wrap(v)
- elseif peripheral.getType(v) == "modem" then
- rednet.open(v)
- end
- end
- if not crypt then
- log("Error: Hook up a bloody cryptographic accelerator")
- return
- end
- term.clear()
- term.setCursorPos(1,1)
- local sessionKeys = {}
- local users = {}
- if fs.exists("enckeys") then
- local file = fs.open("enckeys", "r")
- local nkeys = textutils.unserialize(file.readAll())
- for i,v in pairs(nkeys) do
- sessionKeys[i] = {crypt.decodeKey("RSA", v[1]), crypt.decodeKey("AES", v[2])}
- end
- file.close()
- end
- if fs.exists("users") then
- local file = fs.open("users", "r")
- users = textutils.unserialize(file.readAll())
- file.close()
- end
- local function saveKeys()
- local nkeys = {}
- for i,v in pairs(sessionKeys) do
- nkeys[i] = {v[1].encode(), v[2].encode()}
- end
- local file = fs.open("enckeys", "w")
- file.write(textutils.serialize(nkeys))
- file.close()
- end
- local function saveUsers()
- local file = fs.open("users", "w")
- file.write(textutils.serialize(users))
- file.close()
- end
- local pub, priv
- if fs.exists("pbkeys") then
- local file = fs.open("pbkeys", "r")
- pub = crypt.decodeKey("RSA", file.readLine())
- priv = crypt.decodeKey("RSA", file.readLine())
- file.close()
- else
- pub, priv = crypt.generateKeyPair("RSA", 1024)
- local file = fs.open("pbkeys", "w")
- file.writeLine(pub.encode())
- file.writeLine(priv.encode())
- file.close()
- end
- local function generateU()
- local key = ""
- for i = 1, 16 do
- key = key .. string.char(math.random(32, 126))
- end
- return key
- end
- local function getUserFromCard(card)
- for i,v in pairs(users) do
- for m,c in pairs(v.cards) do
- if c == card then
- return i
- end
- end
- end
- end
- local function sMsg(id, msg)
- rednet.send(id, sessionKeys[id][2].encrypt("AES/CFB/NoPadding", msg), "luabank")
- end
- while true do
- local suc, err = pcall(function()
- local id, msg, protocol = rednet.receive("luabank")
- if protocol == "luabank" then
- if msg:sub(1, 5) == "skeys" then
- sessionKeys[id] = {crypt.decodeKey("RSA", msg:sub(6))}
- --saveKeys()
- rednet.send(id, "mkeys" .. pub.encode(), "luabank")
- elseif msg:sub(1, 5) == "tkeys" then
- local dat = priv.decrypt("RSA", msg:sub(6))
- if dat == "start" then
- sessionKeys[id][2] = crypt.generateSymmetricKey("AES", nil)
- saveKeys()
- rednet.send(id, "ykeys" .. sessionKeys[id][2].encode(), "luabank")
- end
- elseif msg:sub(1, 5) == "smsgs" then
- local dat = textutils.unserialize(sessionKeys[id][2].decrypt("AES/CFB/NoPadding", msg:sub(6)))
- if not dat then
- error("Could not decrypt message")
- end
- if dat[1] == "r" then -- register
- local username = dat[2]:lower()
- local password = dat[3]:lower()
- if users[username] then
- sMsg(id, "erroruser exists")
- log("User '" .. username .. "' exists")
- else
- users[username] = {cards = {}, money = 0, pass = crypt.hash("SHA256", password)}
- sMsg(id, "success")
- sMsg(id, "success")
- log("Created user '" .. username .. "'")
- saveUsers()
- end
- elseif dat[1] == "c" then -- create card
- local username = dat[2]:lower()
- local password = dat[3]:lower()
- if users[username] and users[username].pass == crypt.hash("SHA256", password) then
- local key = generateU()
- table.insert(users[username].cards, key)
- sMsg(id, key)
- log("Created card for user '" .. username .. "'")
- saveUsers()
- else
- sMsg(id, "errorinvalid")
- end
- elseif dat[1] == "t" then -- transact
- local card = dat[2]
- local rec = dat[3]
- local am = tonumber(dat[4])
- local pos = getUserFromCard(card)
- -- print(rec)
- if not users[rec] then
- sMsg(id, "errorrecipient invalid")
- else
- if am < 1 then
- sMsg(id, "errorinvald amount")
- elseif users[pos].money < am then
- sMsg(id, "errornot enough money")
- else
- users[pos].money = users[pos].money - am
- users[rec].money = users[rec].money + am
- saveUsers()
- print("Transfered " .. am .. " from user '" .. pos .. "' to user '" .. rec .. "'")
- sMsg(id, "success")
- end
- end
- elseif dat[1] == "tu" then
- local user = dat[2]
- local pass = dat[3]
- local rec = getUserFromCard(dat[4])
- local am = tonumber(dat[5])
- if users[user] and users[rec] then
- if users[user].pass == crypt.hash("SHA256", pass) then
- if am < 1 then --users[user].money < am
- sMsg(id, "errorinvalid money")
- else
- users[rec].money = users[rec].money + am
- users[user].money = users[user].money - am
- log("Transfered " .. am .. " from user '" .. user .. "' to user '" .. rec .. "'")
- sMsg(id, "success")
- end
- else
- sMsg(id, "errorinvalid password")
- end
- else
- sMsg(id, "errorinvalid user")
- end
- elseif dat[1] == "tl" then
- local user = dat[2]
- local pass = dat[3]
- local rec = dat[4]
- local am = tonumber(dat[5])
- if users[user] and users[rec] then
- if users[user].pass == crypt.hash("SHA256", pass) then
- if am < 1 or users[user].money < am then
- sMsg(id, "errorinvalid money")
- else
- users[user].money = users[user].money - am
- users[rec].money = users[rec].money + am
- log("Transfered " .. am .. " from user '" .. user .. "' to user '" .. rec .. "'")
- sMsg(id, "success")
- end
- else
- sMsg(id, "errorinvalid password")
- end
- else
- sMsg(id, "errorinvalid user")
- end
- end
- end
- end
- end)
- if not suc then
- log("Error: " .. err)
- end
- end
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement