Advertisement
Alakazard12

DataBase

Aug 2nd, 2014
82
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Lua 5.96 KB | None | 0 0
  1. rednet.host("luabank", "database")
  2. local crypt
  3.  
  4. local function log(txt)
  5.     local file = fs.open("banklog", "a")
  6.     file.writeLine(txt)
  7.     file.close()
  8.    
  9.     print(txt)
  10. end
  11.  
  12. for i,v in pairs(peripheral.getNames()) do
  13.     if peripheral.getType(v) == "cryptographic accelerator" then
  14.         crypt = peripheral.wrap(v)
  15.     elseif peripheral.getType(v) == "modem" then
  16.         rednet.open(v)
  17.     end
  18. end
  19.  
  20. if not crypt then
  21.     log("Error: Hook up a bloody cryptographic accelerator")
  22.     return
  23. end
  24.  
  25. term.clear()
  26. term.setCursorPos(1,1)
  27.  
  28. local sessionKeys = {}
  29. local users = {}
  30.  
  31. if fs.exists("enckeys") then
  32.     local file = fs.open("enckeys", "r")
  33.     local nkeys = textutils.unserialize(file.readAll())
  34.     for i,v in pairs(nkeys) do
  35.         sessionKeys[i] = {crypt.decodeKey("RSA", v[1]), crypt.decodeKey("AES", v[2])}
  36.     end
  37.     file.close()
  38. end
  39.  
  40. if fs.exists("users") then
  41.     local file = fs.open("users", "r")
  42.     users = textutils.unserialize(file.readAll())
  43.     file.close()
  44. end
  45.  
  46. local function saveKeys()
  47.     local nkeys = {}
  48.     for i,v in pairs(sessionKeys) do
  49.         nkeys[i] = {v[1].encode(), v[2].encode()}
  50.     end
  51.    
  52.     local file = fs.open("enckeys", "w")
  53.     file.write(textutils.serialize(nkeys))
  54.     file.close()
  55. end
  56.  
  57. local function saveUsers()
  58.     local file = fs.open("users", "w")
  59.     file.write(textutils.serialize(users))
  60.     file.close()
  61. end
  62.  
  63. local pub, priv
  64. if fs.exists("pbkeys") then
  65.     local file = fs.open("pbkeys", "r")
  66.     pub = crypt.decodeKey("RSA", file.readLine())
  67.     priv = crypt.decodeKey("RSA", file.readLine())
  68.     file.close()
  69. else
  70.     pub, priv = crypt.generateKeyPair("RSA", 1024)
  71.     local file = fs.open("pbkeys", "w")
  72.     file.writeLine(pub.encode())
  73.     file.writeLine(priv.encode())
  74.     file.close()
  75. end
  76.  
  77. local function generateU()
  78.     local key = ""
  79.     for i = 1, 16 do
  80.         key = key .. string.char(math.random(32, 126))
  81.     end
  82.    
  83.     return key
  84. end
  85.  
  86. local function getUserFromCard(card)
  87.     for i,v in pairs(users) do
  88.         for m,c in pairs(v.cards) do
  89.             if c == card then
  90.                 return i
  91.             end
  92.         end
  93.     end
  94. end
  95.  
  96. local function sMsg(id, msg)
  97.     rednet.send(id, sessionKeys[id][2].encrypt("AES/CFB/NoPadding", msg), "luabank")
  98. end
  99.  
  100. while true do
  101.     local suc, err = pcall(function()
  102.         local id, msg, protocol = rednet.receive("luabank")
  103.         if protocol == "luabank" then
  104.             if msg:sub(1, 5) == "skeys" then
  105.                 sessionKeys[id] = {crypt.decodeKey("RSA", msg:sub(6))}
  106.                 --saveKeys()
  107.                 rednet.send(id, "mkeys" .. pub.encode(), "luabank")
  108.             elseif msg:sub(1, 5) == "tkeys" then
  109.                 local dat = priv.decrypt("RSA", msg:sub(6))
  110.                 if dat == "start" then
  111.                     sessionKeys[id][2] = crypt.generateSymmetricKey("AES", nil)
  112.                     saveKeys()
  113.                     rednet.send(id, "ykeys" .. sessionKeys[id][2].encode(), "luabank")
  114.                 end
  115.             elseif msg:sub(1, 5) == "smsgs" then
  116.                 local dat = textutils.unserialize(sessionKeys[id][2].decrypt("AES/CFB/NoPadding", msg:sub(6)))
  117.                 if not dat then
  118.                     error("Could not decrypt message")
  119.                 end
  120.                
  121.                 if dat[1] == "r" then -- register
  122.                     local username = dat[2]:lower()
  123.                     local password = dat[3]:lower()
  124.                    
  125.                     if users[username] then
  126.                         sMsg(id, "erroruser exists")
  127.                         log("User '" .. username .. "' exists")
  128.                     else
  129.                         users[username] = {cards = {}, money = 0, pass = crypt.hash("SHA256", password)}
  130.                         sMsg(id, "success")
  131.                         sMsg(id, "success")
  132.                         log("Created user '" .. username .. "'")
  133.                         saveUsers()
  134.                     end
  135.                 elseif dat[1] == "c" then -- create card
  136.                     local username = dat[2]:lower()
  137.                     local password = dat[3]:lower()
  138.                    
  139.                     if users[username] and users[username].pass == crypt.hash("SHA256", password) then
  140.                         local key = generateU()
  141.                         table.insert(users[username].cards, key)
  142.                         sMsg(id, key)
  143.                         log("Created card for user '" .. username .. "'")
  144.                         saveUsers()
  145.                     else
  146.                         sMsg(id, "errorinvalid")
  147.                     end
  148.                 elseif dat[1] == "t" then -- transact
  149.                     local card = dat[2]
  150.                     local rec = dat[3]
  151.                     local am = tonumber(dat[4])
  152.                    
  153.                     local pos = getUserFromCard(card)
  154.                     -- print(rec)
  155.                     if not users[rec] then
  156.                         sMsg(id, "errorrecipient invalid")
  157.                     else
  158.                         if am < 1 then
  159.                             sMsg(id, "errorinvald amount")
  160.                         elseif users[pos].money < am then
  161.                             sMsg(id, "errornot enough money")
  162.                         else
  163.                             users[pos].money = users[pos].money - am
  164.                             users[rec].money = users[rec].money + am
  165.                             saveUsers()
  166.                             print("Transfered " .. am .. " from user '" .. pos .. "' to user '" .. rec .. "'")
  167.                             sMsg(id, "success")
  168.                         end
  169.                     end
  170.                 elseif dat[1] == "tu" then
  171.                     local user = dat[2]
  172.                     local pass = dat[3]
  173.                     local rec = getUserFromCard(dat[4])
  174.                     local am = tonumber(dat[5])
  175.                    
  176.                     if users[user] and users[rec] then
  177.                         if users[user].pass == crypt.hash("SHA256", pass) then
  178.                             if am < 1 then --users[user].money < am
  179.                                 sMsg(id, "errorinvalid money")
  180.                             else
  181.                                 users[rec].money = users[rec].money + am
  182.                                 users[user].money = users[user].money - am
  183.                                 log("Transfered " .. am .. " from user '" .. user .. "' to user '" .. rec .. "'")
  184.                                 sMsg(id, "success")
  185.                             end
  186.                         else
  187.                             sMsg(id,  "errorinvalid password")
  188.                         end
  189.                     else
  190.                         sMsg(id, "errorinvalid user")
  191.                     end
  192.                 elseif dat[1] == "tl" then
  193.                     local user = dat[2]
  194.                     local pass = dat[3]
  195.                     local rec = dat[4]
  196.                     local am = tonumber(dat[5])
  197.                    
  198.                     if users[user] and users[rec] then
  199.                         if users[user].pass == crypt.hash("SHA256", pass) then
  200.                             if am < 1 or users[user].money < am then
  201.                                 sMsg(id, "errorinvalid money")
  202.                             else
  203.                                 users[user].money = users[user].money  - am
  204.                                 users[rec].money = users[rec].money + am
  205.                                 log("Transfered " .. am .. " from user '" .. user .. "' to user '" .. rec .. "'")
  206.                                 sMsg(id, "success")
  207.                             end
  208.                         else
  209.                             sMsg(id, "errorinvalid password")
  210.                         end
  211.                     else
  212.                         sMsg(id, "errorinvalid user")
  213.                     end
  214.                 end
  215.             end
  216.         end
  217.     end)
  218.    
  219.     if not suc then
  220.         log("Error: " .. err)
  221.     end
  222. end
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement