115 lines
3.2 KiB
C
115 lines
3.2 KiB
C
#include <check.h>
|
|
|
|
#include "ntru_crypto.h"
|
|
#include "ntru_crypto_sha256.h"
|
|
#include "ntru_crypto_ntru_mgf1.h"
|
|
|
|
#include "test_common.h"
|
|
#include "check_common.h"
|
|
|
|
START_TEST(test_mgf)
|
|
{
|
|
uint32_t rc;
|
|
|
|
NTRU_CK_MEM state_mem;
|
|
NTRU_CK_MEM seed_mem;
|
|
NTRU_CK_MEM out1_mem;
|
|
NTRU_CK_MEM out2_mem;
|
|
|
|
uint8_t *state;
|
|
uint8_t *seed;
|
|
uint8_t *out1;
|
|
uint8_t *out2;
|
|
|
|
state = ntru_ck_malloc(&state_mem, SHA_256_MD_LEN + 4);
|
|
seed = ntru_ck_malloc(&seed_mem, SHA_256_MD_LEN + 8);
|
|
out1 = ntru_ck_malloc(&out1_mem, 10*SHA_256_MD_LEN);
|
|
out2 = ntru_ck_malloc(&out2_mem, 10*SHA_256_MD_LEN);
|
|
|
|
randombytes(seed, state_mem.len);
|
|
|
|
/* Check reproducibility */
|
|
/* seed */
|
|
rc = ntru_mgf1(state, NTRU_CRYPTO_HASH_ALGID_SHA256, SHA_256_MD_LEN,
|
|
0, seed_mem.len, seed, NULL);
|
|
/* make 10 calls */
|
|
rc = ntru_mgf1(state, NTRU_CRYPTO_HASH_ALGID_SHA256, SHA_256_MD_LEN,
|
|
10, 0, NULL, out1);
|
|
ck_assert_uint_eq(rc, NTRU_RESULT(NTRU_OK));
|
|
|
|
/* reseed with same seed */
|
|
rc = ntru_mgf1(state, NTRU_CRYPTO_HASH_ALGID_SHA256, SHA_256_MD_LEN,
|
|
0, seed_mem.len, seed, NULL);
|
|
rc = ntru_mgf1(state, NTRU_CRYPTO_HASH_ALGID_SHA256, SHA_256_MD_LEN,
|
|
10, 0, NULL, out2);
|
|
ck_assert_uint_eq(rc, NTRU_RESULT(NTRU_OK));
|
|
|
|
/* compare outputs (should match) */
|
|
ck_assert_int_eq(memcmp(out1, out2, out1_mem.len), 0);
|
|
|
|
/* Check dependence on counter */
|
|
/* reseed with same seed */
|
|
rc = ntru_mgf1(state, NTRU_CRYPTO_HASH_ALGID_SHA256, SHA_256_MD_LEN,
|
|
0, seed_mem.len, seed, NULL);
|
|
/* change counter */
|
|
memset(state + SHA_256_MD_LEN, 0xff, 4);
|
|
/* make 10 calls */
|
|
rc = ntru_mgf1(state, NTRU_CRYPTO_HASH_ALGID_SHA256, SHA_256_MD_LEN,
|
|
10, 0, NULL, out2);
|
|
ck_assert_uint_eq(rc, NTRU_RESULT(NTRU_OK));
|
|
|
|
/* compare outputs (should not match) */
|
|
ck_assert_int_ne(memcmp(out1, out2, out1_mem.len), 0);
|
|
|
|
/* Try an unknown algorithm */
|
|
rc = ntru_mgf1(state, -1, SHA_256_MD_LEN, 1, 0, NULL, out1);
|
|
ck_assert_uint_eq(rc, HASH_RESULT(NTRU_CRYPTO_HASH_BAD_ALG));
|
|
|
|
ntru_ck_mem_ok(&state_mem);
|
|
ntru_ck_mem_ok(&seed_mem);
|
|
ntru_ck_mem_ok(&out1_mem);
|
|
ntru_ck_mem_ok(&out2_mem);
|
|
|
|
ntru_ck_mem_free(&state_mem);
|
|
ntru_ck_mem_free(&seed_mem);
|
|
ntru_ck_mem_free(&out2_mem);
|
|
}
|
|
END_TEST
|
|
|
|
START_TEST(test_mgftp1)
|
|
{
|
|
uint32_t rc;
|
|
|
|
/* Check error cases */
|
|
/* Fail in mgf1, initial request */
|
|
rc = ntru_mgftp1(-1,SHA_256_MD_LEN, 1, 0, NULL, NULL, 5, NULL);
|
|
ck_assert_uint_eq(rc, HASH_RESULT(NTRU_CRYPTO_HASH_BAD_ALG));
|
|
|
|
/* Fail in mgf1, num_trits_needed >= 5 */
|
|
rc = ntru_mgftp1(-1,SHA_256_MD_LEN, 0, 0, NULL, NULL, 5, NULL);
|
|
ck_assert_uint_eq(rc, HASH_RESULT(NTRU_CRYPTO_HASH_BAD_ALG));
|
|
|
|
/* Fail in mgf1, num_trits_needed < 5 */
|
|
rc = ntru_mgftp1(-1,SHA_256_MD_LEN, 0, 0, NULL, NULL, 1, NULL);
|
|
ck_assert_uint_eq(rc, HASH_RESULT(NTRU_CRYPTO_HASH_BAD_ALG));
|
|
}
|
|
END_TEST
|
|
|
|
Suite *
|
|
ntruencrypt_internal_mgf_suite(void)
|
|
{
|
|
Suite *s;
|
|
TCase *tc_mgf;
|
|
|
|
s = suite_create("NTRUEncrypt.Internal.MGF");
|
|
|
|
tc_mgf = tcase_create("Key");
|
|
tcase_add_test(tc_mgf, test_mgf);
|
|
tcase_add_test(tc_mgf, test_mgftp1);
|
|
|
|
suite_add_tcase(s, tc_mgf);
|
|
|
|
return s;
|
|
}
|
|
|