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

Sha256 hash problem

Started by RainbowCow, 14 March 2015 - 11:45 PM
RainbowCow #1
Posted 15 March 2015 - 12:45 AM
When I write in the password hashed with sha256 I get the error message: startup:24: attempt to index ? (a function value)

I've looked through the code over and over, but I can't get it. Thanks in advance for helping!



--[[ Setup ]]

os.loadAPI("sha256")

--[[ Define ]]



--[[ Code ]]
while true do
  term.clear()
  term.setCursorPos(19,7)
  term.setTextColor(colors.blue)
  textutils.slowPrint("EyaX Security")
  sleep(0.5)
  term.setCursorPos(19,7)
  textutils.slowPrint("			 ")
  term.setCursorPos(19,7)
  textutils.slowPrint("Input Password.")
  term.setCursorPos(19,8)
  print("|>		   <|")
  term.setCursorPos(21,8)
  pass = read("*")
  if sha256.sha256(pass) ==  "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855" then
	term.setCursorPos(19,7)
	textutils.slowPrint("			   ")
	sleep(1)
	term.setCursorPos(19,8)
	textutils.slowPrint("			   ")
	sleep(1)
	term.setCursorPos(19,7)
	term.setTextColor(colors.lime)
	textutils.slowPrint("Access Granted")
	sleep(1)
	textutils.slowPrint("			  ")
	sleep(0.5)
	term.clear()
	term.setCursorPos(1,1)
	break
  else
	term.setCursorPos(19,7)
	textutils.slowPrint("			   ")
	sleep(1)
	term.setCursorPos(19,8)
	textutils.slowPrint("			   ")
	sleep(1)
	term.setCursorPos(19,7)
	term.setTextColor(colors.red)
	textutils.slowPrint("Access Denied")
	sleep(1)
	textutils.slowPrint("			  ")
	sleep(0.5)
	term.clear()
	term.setCursorPos(1,1)
--[[ End ]]
  end
end

And here is the sha256:


--  
--  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
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
		end
		return bitop
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))
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
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
end

local function bnot(x) return (-1 - x) % MOD end

local function rshift1(a, disp)
		if disp < 0 then return lshift(a,-disp) end
		return math.floor(a % 2 ^ 32 / 2 ^ disp)
end

local function rshift(x, disp)
		if disp > 31 or disp < -31 then return 0 end
		return rshift1(x % MOD, disp)
end

local function lshift(a, disp)
		if disp < 0 then return rshift(a,-disp) end
		return (a * 2 ^ disp) % 2 ^ 32
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

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 str2hexa(s)
		return (string.gsub(s, ".", function(c) return string.format("%02x", string.byte(c)) end))
end

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 function s232num(s, i)
		local n = 0
		for i = i, i + 3 do n = n*256 + string.byte(s, i) end
		return n
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

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

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))
		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
		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)
end

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
Edited on 15 March 2015 - 12:44 AM
Bomb Bloke #2
Posted 15 March 2015 - 01:04 AM
Line 24:

  if pass == sha256.sha256(pass) "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855" then

I assume you meant:

  if sha256.sha256(pass) == "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855" then
RainbowCow #3
Posted 15 March 2015 - 01:42 AM
Yeah, I fixed that ingame.

Just forgot to save that in notepad ++.
Bomb Bloke #4
Posted 15 March 2015 - 01:55 AM
In that case, if you're still getting the same error, double check that the code you're running in-game matches the code you've got here. In particular, make sure you're using the correct form of brackets.