This is a read-only snapshot of the ComputerCraft forums, taken in April 2020.
Meit's profile picture

Urgent Help on String Comparison

Started by Meit, 24 July 2016 - 07:53 PM
Meit #1
Posted 24 July 2016 - 09:53 PM
Hi guys, I know I should google how to do that on LUA but I have tried and it hasnt been working so far..
First code then I tell the important things

            if (diskdata == logindata) then
			  oldCol = term.getTextColor()
			  term.setTextColor(colors.green)
			  print("Welcome back!")
			  term.setTextColor(oldCol)
			  error()
		    else
			  oldCol = term.getTextColor()
			  term.setTextColor(colors.red)
			  print("The login data dosen't match!")
			  term.setTextColor(oldCol)
			  sleep(1)
			  CheckLogin()
		    end
Ok so in my code I read from a file in a disk and try to compare it with login data, but the problem even if diskdata is different from login data it dosent work! it just says welcome back and I have access, I tried so far:

if string.find(diskdata, logindata) == 1 then
if (diskdata == logindata) then
----even with this version-----
if diskdata == logindata then
-------------------------------------------------------------------------------
Now, According to google, lua string comparison examples this
should work but I dont know why it isnt working, am I doing something
wrong? Please correct me
valithor #2
Posted 24 July 2016 - 10:20 PM
diskdata==logindata should work. Would you mind posting the rest of your code either here (if it is relatively short), or to http://pastebin.com/. Chances are your problem comes from a different place in your code, than the comparison between the two strings.
Meit #3
Posted 25 July 2016 - 04:27 PM
I wouldn't mind posting my code,
Here you go
------ Credits to Avarin for SHA-256 in LUA API
--- 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 = "j1ms812n5slkna21p5is95k12m51"
function encrypt(str)
  gain = digest(str)
  return gain
end
--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()
		term.setTextColor(colors.blue)
		print("Please insert your disk, After press enter to continue")
		term.setTextColor(colors.black)
		entr = read("")
		term.setTextColor(oldCol)
		CheckInstallation()
	  else
		oldCol = term.getTextColor()
		term.setTextColor(colors.lightBlue)
		print("Found Disc Continuing...")
		term.setTextColor(oldCol)
		sleep(0.3)
		term.clear()
		term.setCursorPos(1, 1)
		oldCol = term.getTextColor()
		term.setTextColor(colors.orange)
		print("Please insert your desired password!")
		term.setTextColor(colors.green)
		pass = read("*")
		term.setTextColor(oldCol)
		if pass == nil or pass == "" or pass == " " then
		  sleep(1.0)
		  term.clear()
		  term.setCursorPos(1, 1)
		  oldCol = term.getTextColor()
		  term.setTextColor(colors.red)
		  print("Its a dumb password!")
		  term.setTextColor(oldCol)
		  error()
		else
		  handle = fs.open("DiskLock.shx", "w")
		  compId = os.computerID()
		  idwpass = compId ..":" ..token ..":" ..pass
		  enc_pass = encrypt(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()
		  term.setTextColor(colors.green)
		  print("Success, Rebooting now to apply changes...")
		  term.setTextColor(oldCol)
		  sleep(1)
		  os.reboot()
		end
	  end
	elseif val == "no" then
	  term.clear()
	  term.setCursorPos(1, 1)
	  oldCol = term.getTextColor()
	  term.setTextColor(colors.red)
	  print("You chose NO, Continuing to Boot")
	  term.setTextColor(oldCol)
	  error()
	else
	  term.clear()
	  term.setCursorPos(1, 1)
	  oldCol = term.getTextColor()
	  term.setTextColor(colors.blue)
	  print("Unknown/Idiotic Value...")
	  term.setTextColor(oldCol)
	  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()
	  term.setTextColor(colors.red)
	  print("Welcome, Please insert the login disk!")
	  term.setTextColor(colors.yellow)
	  print("Press enter once done.")
	  term.setTextColor(colors.black)
	  xazz = read("")
	  term.setTextColor(oldCol)
	  CheckLogin()
	else
	  oldCol = term.getTextColor()
	  term.setTextColor(colors.orange)
	  print("Reading Disk...")
	  term.setTextColor(oldCol)
	  sleep(1)
	  if not fs.exists("disk/DiskLock.shc") then
		oldCol = term.getTextColor()
		term.setTextColor(colors.red)
		print("This disk does not contain login files!")
		term.setTextColor(oldCol)
		sleep(1)
		CheckLogin()
	  else
		pathTofile = shell.resolve("disk/DiskLock.shc")
		file = fs.open(pathTofile, "r")
		if file then
		  diskdata = file.readAll()
		  file.close()
		  pathTofile = shell.resolve("disk/DiskLock.shc")
		  file = fs.open(pathTofile, "r")
		  if file then
			logindata = file.readAll()
			file.close()
			if (diskdata == logindata) then
			  oldCol = term.getTextColor()
			  term.setTextColor(colors.green)
			  print("Welcome back!")
			  term.setTextColor(oldCol)
			  error()
			else
			  oldCol = term.getTextColor()
			  term.setTextColor(colors.red)
			  print("The login data dosen't match!")
			  term.setTextColor(oldCol)
			  sleep(1)
			  CheckLogin()
			end
		  else
			oldCol = term.getTextColor()
			term.setTextColor(colors.red)
			print("Failed to read the application data file!")
			term.setTextColor(oldCol)
			sleep(1)
			CheckLogin()
		  end
		else
		 oldCol = term.getTextColor()
		 term.setTextColor(colors.red)
		 print("Failed to read the disk file!")
		 term.setTextColor(oldCol)
		 sleep(1)
		 CheckLogin()
	   end
	 end
   end
end
end
CheckInstallation()
CheckLogin()

I'm still a beginner in lua but I know those languages:
C++(win32), VB, Pawn(its easy and somewhat near lua)
P.S: Don't get strict cause I didnt use pbkdf2, I am testing it with sha256 right now.
and by the way can you tell me how should I use pbkdf2, I dont know what I should do of the salt parameter
Edited on 25 July 2016 - 02:29 PM
KingofGamesYami #4
Posted 25 July 2016 - 06:23 PM
You're opening the same file both times.


                pathTofile = shell.resolve("disk/DiskLock.shc") --#here 
                file = fs.open(pathTofile, "r")
                if file then
                  diskdata = file.readAll()
                  file.close()
                  pathTofile = shell.resolve("disk/DiskLock.shc") --#and here
                  file = fs.open(pathTofile, "r")
Anavrins #5
Posted 25 July 2016 - 06:25 PM
I recently modified my sha2 paste to include more info about how it all works.
The salt is basically a non-secret, random string of characters that you store alongside the hashed password.
When the user authenticate, he type his password, you retrieve the salt from the file, and you compare the resulting hash with the one in the file.
There's various videos on Youtube that explains it more in depth.
I also noticed you spelled my name wrong in your code :D/>
Meit #6
Posted 25 July 2016 - 07:14 PM
Thanks, They are working now ;)/>