You cannot select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

105 lines
3.5 KiB
Lua

local skynet = require "skynet"
skynet.start(function ()
function tohex(s)
return (s:gsub('.', function (c) return string.format("%02x", string.byte(c)) end))
end
function hexprint(s)
print(crypto.hex(s))
end
local crypto = require 'crypto'
-- TESTING HEX
local tst = 'abcd'
assert(crypto.hex, "missing crypto.hex")
local actual = crypto.hex(tst)
local expected = tohex(tst)
assert(actual == expected, "different hex results")
-- TESTING ENCRYPT
assert(crypto.encrypt, "missing crypto.encrypt")
local cipher = 'aes128'
local text = 'Hello world!'
local key = 'abcd'
local iv = '1234'
local res = assert(crypto.encrypt(cipher, text, key, iv))
assert(type(res) == "string", "wrong result type, expecting string")
assert(#res % 16 == 0, "unexpected result size") -- aes128 block size is 16bytes
assert(crypto.hex(res) == "9bac9a71dd600824706096852e7282df", "unexpected result")
local res2 = crypto.encrypt(cipher, text, key, iv)
assert(res == res2, "the results are different!")
assert(crypto.encrypt.new, "missing crypto.encrypt.new")
local ctx = crypto.encrypt.new(cipher, key, iv)
local p1 = ctx:update(text)
local p2 = ctx:final()
local res3 = p1 .. p2
assert(res == res3, "constructed result is different from direct")
-- TESTING DECRYPT
assert(crypto.decrypt, "missing crypto.decrypt")
local dec = crypto.decrypt(cipher, res, key, iv)
assert(dec == text, "different direct result")
print(dec)
assert(crypto.decrypt.new, "missing crypto.decrypt.new")
local ctx = crypto.decrypt.new(cipher, key, iv)
local p1 = ctx:update(res)
local p2 = ctx:final()
local dec2 = p1 .. p2
assert(dec2 == text, "different partial result")
-- Testing errors when decrypting
local ctx, err = crypto.decrypt("aes128", res, key.."improper key", iv)
assert(not ctx and err, "should have failed")
-- wrong iv, will result in garbage
local ctx, err = crypto.decrypt("aes128", res, key, iv .. "foo")
assert(ctx ~= text, "should have failed")
local ctx, err = crypto.decrypt("aes128", res .. "foo", key, iv)
assert(not ctx and err, "should have failed")
-- don't crash on an invalid iv
local ok, ctx, err = pcall(crypto.decrypt, "aes128", res, key, iv .. "123456123456123456")
assert(not ok and ctx, "should have failed")
local ok, ctx = pcall(crypto.decrypt.new, "aes128", key, iv .. "123456123456123456")
assert(not ok and ctx, "should have failed")
-- don't crash on an invalid key
local ok, ctx, err = pcall(crypto.decrypt, "aes128", res, string.rep(key, 100), iv)
assert(not ok and ctx, "should have failed")
local ok, ctx = pcall(crypto.decrypt.new, "aes128", string.rep(key, 100), iv)
assert(not ok and ctx, "should have failed")
-- Testing errors when encrypting
-- don't crash on an invalid iv
local ok, res, err = pcall(crypto.encrypt, "aes128", text, key, iv .. "123456123456123456")
assert(not ok and res)
local ok, res, err = pcall(crypto.encrypt.new, "aes128", key, iv .. "123456123456123456")
assert(not ok and res)
-- don't crash on an invalid key
local ok, res, err = pcall(crypto.encrypt, "aes128", text, string.rep(key, 100), iv)
assert(not ok and res)
local ok, res, err = pcall(crypto.encrypt.new, "aes128", string.rep(key, 100), iv)
assert(not ok and res)
local res = crypto.decrypt("aes128", crypto.encrypt("aes128", "", key, iv), key, iv)
assert(res == "")
print("test end.")
skynet.exit()
end)