static int cbc_test_generic(DrewLoader *ldr, const char *name, const struct test *testdata, size_t ntests) { int id, result = 0; const drew_block_functbl_t *functbl; drew_block_t algo; drew_mode_t c; const void *tmp; uint8_t buf[128]; id = drew_loader_lookup_by_name(ldr, name, 0, -1); if (id < 0) return id; drew_loader_get_functbl(ldr, id, &tmp); functbl = tmp; functbl->init(&algo, 0, ldr, NULL); for (size_t i = 0; i < ntests; i++) { memset(buf, 0, sizeof(buf)); result <<= 1; cbc_init(&c, 0, ldr, NULL); algo.functbl->init(&algo, 0, ldr, NULL); algo.functbl->setkey(&algo, testdata[i].key, testdata[i].keysz, DREW_BLOCK_MODE_ENCRYPT); cbc_setblock(&c, &algo); cbc_setiv(&c, testdata[i].iv, testdata[i].ivsz); cbc_encrypt(&c, buf, testdata[i].input, MIN(sizeof(buf), testdata[i].datasz)); result |= !!memcmp(buf, testdata[i].output, testdata[i].datasz); cbc_fini(&c, 0); algo.functbl->fini(&algo, 0); cbc_init(&c, 0, ldr, NULL); algo.functbl->init(&algo, 0, ldr, NULL); algo.functbl->setkey(&algo, testdata[i].key, testdata[i].keysz, DREW_BLOCK_MODE_DECRYPT); cbc_setblock(&c, &algo); cbc_setiv(&c, testdata[i].iv, testdata[i].ivsz); cbc_decrypt(&c, buf, testdata[i].output, MIN(sizeof(buf), testdata[i].datasz)); result |= !!memcmp(buf, testdata[i].input, testdata[i].datasz); cbc_fini(&c, 0); algo.functbl->fini(&algo, 0); } return result; }
int main(int argc, char *argv[]) { lua_State *L = cbc_init(); cbc_run(L); return 0; }