diff -r 000000000000 -r 598d09faf89c aeslua/util.lua --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/aeslua/util.lua Wed Feb 16 20:29:33 2011 +0000 @@ -0,0 +1,155 @@ +local bit = require("bit"); + +local public = {}; +local private = {}; + +local aeslua = require("aeslua"); +aeslua.util = public; + +-- +-- calculate the parity of one byte +-- +function public.byteParity(byte) + byte = bit.bxor(byte, bit.rshift(byte, 4)); + byte = bit.bxor(byte, bit.rshift(byte, 2)); + byte = bit.bxor(byte, bit.rshift(byte, 1)); + return bit.band(byte, 1); +end + +-- +-- get byte at position index +-- +function public.getByte(number, index) + if (index == 0) then + return bit.band(number,0xff); + else + return bit.band(bit.rshift(number, index*8),0xff); + end +end + + +-- +-- put number into int at position index +-- +function public.putByte(number, index) + if (index == 0) then + return bit.band(number,0xff); + else + return bit.lshift(bit.band(number,0xff),index*8); + end +end + +-- +-- convert byte array to int array +-- +function public.bytesToInts(bytes, start, n) + local ints = {}; + for i = 0, n - 1 do + ints[i] = public.putByte(bytes[start + (i*4) ], 3) + + public.putByte(bytes[start + (i*4) + 1], 2) + + public.putByte(bytes[start + (i*4) + 2], 1) + + public.putByte(bytes[start + (i*4) + 3], 0); + end + return ints; +end + +-- +-- convert int array to byte array +-- +function public.intsToBytes(ints, output, outputOffset, n) + n = n or #ints; + for i = 0, n do + for j = 0,3 do + output[outputOffset + i*4 + (3 - j)] = public.getByte(ints[i], j); + end + end + return output; +end + +-- +-- convert bytes to hexString +-- +function private.bytesToHex(bytes) + local hexBytes = ""; + + for i,byte in ipairs(bytes) do + hexBytes = hexBytes .. string.format("%02x ", byte); + end + + return hexBytes; +end + +-- +-- convert data to hex string +-- +function public.toHexString(data) + local type = type(data); + if (type == "number") then + return string.format("%08x",data); + elseif (type == "table") then + return private.bytesToHex(data); + elseif (type == "string") then + local bytes = {string.byte(data, 1, #data)}; + + return private.bytesToHex(bytes); + else + return data; + end +end + +function public.padByteString(data) + local dataLength = #data; + + local random1 = math.random(0,255); + local random2 = math.random(0,255); + + local prefix = string.char(random1, + random2, + random1, + random2, + public.getByte(dataLength, 3), + public.getByte(dataLength, 2), + public.getByte(dataLength, 1), + public.getByte(dataLength, 0)); + + data = prefix .. data; + + local paddingLength = math.ceil(#data/16)*16 - #data; + local padding = ""; + for i=1,paddingLength do + padding = padding .. string.char(math.random(0,255)); + end + + return data .. padding; +end + +function private.properlyDecrypted(data) + local random = {string.byte(data,1,4)}; + + if (random[1] == random[3] and random[2] == random[4]) then + return true; + end + + return false; +end + +function public.unpadByteString(data) + if (not private.properlyDecrypted(data)) then + return nil; + end + + local dataLength = public.putByte(string.byte(data,5), 3) + + public.putByte(string.byte(data,6), 2) + + public.putByte(string.byte(data,7), 1) + + public.putByte(string.byte(data,8), 0); + + return string.sub(data,9,8+dataLength); +end + +function public.xorIV(data, iv) + for i = 1,16 do + data[i] = bit.bxor(data[i], iv[i]); + end +end + +return public;