Refactored error handling in crypto tester

This commit is contained in:
Martin Willi
2012-07-16 14:55:07 +02:00
parent 73264a81b8
commit 67ea663d7c
+114 -95
View File
@@ -193,7 +193,7 @@ METHOD(crypto_tester_t, test_crypter, bool,
while (enumerator->enumerate(enumerator, &vector)) while (enumerator->enumerate(enumerator, &vector))
{ {
crypter_t *crypter; crypter_t *crypter;
chunk_t key, plain, cipher, iv; chunk_t key, iv, plain = chunk_empty, cipher = chunk_empty;
if (vector->alg != alg) if (vector->alg != alg)
{ {
@@ -203,23 +203,22 @@ METHOD(crypto_tester_t, test_crypter, bool,
{ /* test only vectors with a specific key size, if key size given */ { /* test only vectors with a specific key size, if key size given */
continue; continue;
} }
tested++;
failed = TRUE;
crypter = create(alg, vector->key_size); crypter = create(alg, vector->key_size);
if (!crypter) if (!crypter)
{ {
DBG1(DBG_LIB, "%N[%s]: %u bit key size not supported", DBG1(DBG_LIB, "%N[%s]: %u bit key size not supported",
encryption_algorithm_names, alg, plugin_name, encryption_algorithm_names, alg, plugin_name,
BITS_PER_BYTE * vector->key_size); BITS_PER_BYTE * vector->key_size);
failed = TRUE;
continue; continue;
} }
failed = FALSE;
tested++;
key = chunk_create(vector->key, crypter->get_key_size(crypter)); key = chunk_create(vector->key, crypter->get_key_size(crypter));
if (!crypter->set_key(crypter, key)) if (!crypter->set_key(crypter, key))
{ {
failed = TRUE; goto failure;
} }
iv = chunk_create(vector->iv, crypter->get_iv_size(crypter)); iv = chunk_create(vector->iv, crypter->get_iv_size(crypter));
@@ -227,44 +226,46 @@ METHOD(crypto_tester_t, test_crypter, bool,
plain = chunk_create(vector->plain, vector->len); plain = chunk_create(vector->plain, vector->len);
if (!crypter->encrypt(crypter, plain, iv, &cipher)) if (!crypter->encrypt(crypter, plain, iv, &cipher))
{ {
failed = TRUE; goto failure;
} }
if (!memeq(vector->cipher, cipher.ptr, cipher.len)) if (!memeq(vector->cipher, cipher.ptr, cipher.len))
{ {
failed = TRUE; goto failure;
} }
/* inline decryption */ /* inline decryption */
if (!crypter->decrypt(crypter, cipher, iv, NULL)) if (!crypter->decrypt(crypter, cipher, iv, NULL))
{ {
failed = TRUE; goto failure;
} }
if (!memeq(vector->plain, cipher.ptr, cipher.len)) if (!memeq(vector->plain, cipher.ptr, cipher.len))
{ {
failed = TRUE; goto failure;
} }
free(cipher.ptr);
/* allocated decryption */ /* allocated decryption */
cipher = chunk_create(vector->cipher, vector->len); if (!crypter->decrypt(crypter,
if (!crypter->decrypt(crypter, cipher, iv, &plain)) chunk_create(vector->cipher, vector->len), iv, &plain))
{ {
failed = TRUE; goto failure;
} }
if (!memeq(vector->plain, plain.ptr, plain.len)) if (!memeq(vector->plain, plain.ptr, plain.len))
{ {
failed = TRUE; goto failure;
} }
/* inline encryption */ /* inline encryption */
if (!crypter->encrypt(crypter, plain, iv, NULL)) if (!crypter->encrypt(crypter, plain, iv, NULL))
{ {
failed = TRUE; goto failure;
} }
if (!memeq(vector->cipher, plain.ptr, plain.len)) if (!memeq(vector->cipher, plain.ptr, plain.len))
{ {
failed = TRUE; goto failure;
} }
free(plain.ptr);
failed = FALSE;
failure:
crypter->destroy(crypter); crypter->destroy(crypter);
chunk_free(&cipher);
chunk_free(&plain);
if (failed) if (failed)
{ {
DBG1(DBG_LIB, "disabled %N[%s]: %s test vector failed", DBG1(DBG_LIB, "disabled %N[%s]: %s test vector failed",
@@ -374,7 +375,7 @@ METHOD(crypto_tester_t, test_aead, bool,
while (enumerator->enumerate(enumerator, &vector)) while (enumerator->enumerate(enumerator, &vector))
{ {
aead_t *aead; aead_t *aead;
chunk_t key, plain, cipher, iv, assoc; chunk_t key, iv, assoc, plain = chunk_empty, cipher = chunk_empty;
size_t icv; size_t icv;
if (vector->alg != alg) if (vector->alg != alg)
@@ -385,23 +386,22 @@ METHOD(crypto_tester_t, test_aead, bool,
{ /* test only vectors with a specific key size, if key size given */ { /* test only vectors with a specific key size, if key size given */
continue; continue;
} }
tested++;
failed = TRUE;
aead = create(alg, vector->key_size); aead = create(alg, vector->key_size);
if (!aead) if (!aead)
{ {
DBG1(DBG_LIB, "%N[%s]: %u bit key size not supported", DBG1(DBG_LIB, "%N[%s]: %u bit key size not supported",
encryption_algorithm_names, alg, plugin_name, encryption_algorithm_names, alg, plugin_name,
BITS_PER_BYTE * vector->key_size); BITS_PER_BYTE * vector->key_size);
failed = TRUE;
continue; continue;
} }
failed = FALSE;
tested++;
key = chunk_create(vector->key, aead->get_key_size(aead)); key = chunk_create(vector->key, aead->get_key_size(aead));
if (!aead->set_key(aead, key)) if (!aead->set_key(aead, key))
{ {
failed = TRUE; goto failure;
} }
iv = chunk_create(vector->iv, aead->get_iv_size(aead)); iv = chunk_create(vector->iv, aead->get_iv_size(aead));
assoc = chunk_create(vector->adata, vector->alen); assoc = chunk_create(vector->adata, vector->alen);
@@ -411,46 +411,47 @@ METHOD(crypto_tester_t, test_aead, bool,
plain = chunk_create(vector->plain, vector->len); plain = chunk_create(vector->plain, vector->len);
if (!aead->encrypt(aead, plain, assoc, iv, &cipher)) if (!aead->encrypt(aead, plain, assoc, iv, &cipher))
{ {
failed = TRUE; goto failure;
} }
if (!memeq(vector->cipher, cipher.ptr, cipher.len)) if (!memeq(vector->cipher, cipher.ptr, cipher.len))
{ {
failed = TRUE; goto failure;
} }
/* inline decryption */ /* inline decryption */
if (!aead->decrypt(aead, cipher, assoc, iv, NULL)) if (!aead->decrypt(aead, cipher, assoc, iv, NULL))
{ {
failed = TRUE; goto failure;
} }
if (!memeq(vector->plain, cipher.ptr, cipher.len - icv)) if (!memeq(vector->plain, cipher.ptr, cipher.len - icv))
{ {
failed = TRUE; goto failure;
} }
free(cipher.ptr);
/* allocated decryption */ /* allocated decryption */
cipher = chunk_create(vector->cipher, vector->len + icv); if (!aead->decrypt(aead, chunk_create(vector->cipher, vector->len + icv),
if (!aead->decrypt(aead, cipher, assoc, iv, &plain)) assoc, iv, &plain))
{ {
plain = chunk_empty; goto failure;
failed = TRUE;
} }
else if (!memeq(vector->plain, plain.ptr, plain.len)) if (!memeq(vector->plain, plain.ptr, plain.len))
{ {
failed = TRUE; goto failure;
} }
plain.ptr = realloc(plain.ptr, plain.len + icv); plain.ptr = realloc(plain.ptr, plain.len + icv);
/* inline encryption */ /* inline encryption */
if (!aead->encrypt(aead, plain, assoc, iv, NULL)) if (!aead->encrypt(aead, plain, assoc, iv, NULL))
{ {
failed = TRUE; goto failure;
} }
if (!memeq(vector->cipher, plain.ptr, plain.len + icv)) if (!memeq(vector->cipher, plain.ptr, plain.len + icv))
{ {
failed = TRUE; goto failure;
} }
free(plain.ptr);
failed = FALSE;
failure:
aead->destroy(aead); aead->destroy(aead);
chunk_free(&cipher);
chunk_free(&plain);
if (failed) if (failed)
{ {
DBG1(DBG_LIB, "disabled %N[%s]: %s test vector failed", DBG1(DBG_LIB, "disabled %N[%s]: %s test vector failed",
@@ -552,7 +553,7 @@ METHOD(crypto_tester_t, test_signer, bool,
while (enumerator->enumerate(enumerator, &vector)) while (enumerator->enumerate(enumerator, &vector))
{ {
signer_t *signer; signer_t *signer;
chunk_t key, data, mac; chunk_t key, data, mac = chunk_empty;
if (vector->alg != alg) if (vector->alg != alg)
{ {
@@ -560,56 +561,54 @@ METHOD(crypto_tester_t, test_signer, bool,
} }
tested++; tested++;
failed = TRUE;
signer = create(alg); signer = create(alg);
if (!signer) if (!signer)
{ {
DBG1(DBG_LIB, "disabled %N[%s]: creating instance failed", DBG1(DBG_LIB, "disabled %N[%s]: creating instance failed",
integrity_algorithm_names, alg, plugin_name); integrity_algorithm_names, alg, plugin_name);
failed = TRUE;
break; break;
} }
failed = FALSE;
key = chunk_create(vector->key, signer->get_key_size(signer)); key = chunk_create(vector->key, signer->get_key_size(signer));
if (!signer->set_key(signer, key)) if (!signer->set_key(signer, key))
{ {
failed = TRUE; goto failure;
} }
/* allocated signature */ /* allocated signature */
data = chunk_create(vector->data, vector->len); data = chunk_create(vector->data, vector->len);
if (!signer->allocate_signature(signer, data, &mac)) if (!signer->allocate_signature(signer, data, &mac))
{ {
failed = TRUE; goto failure;
} }
if (mac.len != signer->get_block_size(signer)) if (mac.len != signer->get_block_size(signer))
{ {
failed = TRUE; goto failure;
} }
if (!memeq(vector->mac, mac.ptr, mac.len)) if (!memeq(vector->mac, mac.ptr, mac.len))
{ {
failed = TRUE; goto failure;
} }
/* signature to existing buffer */ /* signature to existing buffer */
memset(mac.ptr, 0, mac.len); memset(mac.ptr, 0, mac.len);
if (!signer->get_signature(signer, data, mac.ptr)) if (!signer->get_signature(signer, data, mac.ptr))
{ {
failed = TRUE; goto failure;
} }
if (!memeq(vector->mac, mac.ptr, mac.len)) if (!memeq(vector->mac, mac.ptr, mac.len))
{ {
failed = TRUE; goto failure;
} }
/* signature verification, good case */ /* signature verification, good case */
if (!signer->verify_signature(signer, data, mac)) if (!signer->verify_signature(signer, data, mac))
{ {
failed = TRUE; goto failure;
} }
/* signature verification, bad case */ /* signature verification, bad case */
*(mac.ptr + mac.len - 1) += 1; *(mac.ptr + mac.len - 1) += 1;
if (signer->verify_signature(signer, data, mac)) if (signer->verify_signature(signer, data, mac))
{ {
failed = TRUE; goto failure;
} }
/* signature to existing buffer, using append mode */ /* signature to existing buffer, using append mode */
if (data.len > 2) if (data.len > 2)
@@ -617,22 +616,24 @@ METHOD(crypto_tester_t, test_signer, bool,
if (!signer->allocate_signature(signer, if (!signer->allocate_signature(signer,
chunk_create(data.ptr, 1), NULL)) chunk_create(data.ptr, 1), NULL))
{ {
failed = TRUE; goto failure;
} }
if (!signer->get_signature(signer, if (!signer->get_signature(signer,
chunk_create(data.ptr + 1, 1), NULL)) chunk_create(data.ptr + 1, 1), NULL))
{ {
failed = TRUE; goto failure;
} }
if (!signer->verify_signature(signer, chunk_skip(data, 2), if (!signer->verify_signature(signer, chunk_skip(data, 2),
chunk_create(vector->mac, mac.len))) chunk_create(vector->mac, mac.len)))
{ {
failed = TRUE; goto failure;
} }
} }
free(mac.ptr);
failed = FALSE;
failure:
signer->destroy(signer); signer->destroy(signer);
chunk_free(&mac);
if (failed) if (failed)
{ {
DBG1(DBG_LIB, "disabled %N[%s]: %s test vector failed", DBG1(DBG_LIB, "disabled %N[%s]: %s test vector failed",
@@ -722,56 +723,65 @@ METHOD(crypto_tester_t, test_hasher, bool,
} }
tested++; tested++;
failed = TRUE;
hasher = create(alg); hasher = create(alg);
if (!hasher) if (!hasher)
{ {
DBG1(DBG_LIB, "disabled %N[%s]: creating instance failed", DBG1(DBG_LIB, "disabled %N[%s]: creating instance failed",
hash_algorithm_names, alg, plugin_name); hash_algorithm_names, alg, plugin_name);
failed = TRUE;
break; break;
} }
failed = FALSE;
/* allocated hash */ /* allocated hash */
data = chunk_create(vector->data, vector->len); data = chunk_create(vector->data, vector->len);
if (!hasher->allocate_hash(hasher, data, &hash)) if (!hasher->allocate_hash(hasher, data, &hash))
{ {
failed = TRUE; goto failure;
} }
if (hash.len != hasher->get_hash_size(hasher)) if (hash.len != hasher->get_hash_size(hasher))
{ {
failed = TRUE; goto failure;
} }
if (!memeq(vector->hash, hash.ptr, hash.len)) if (!memeq(vector->hash, hash.ptr, hash.len))
{ {
failed = TRUE; goto failure;
} }
/* hash to existing buffer */ /* hash to existing buffer */
memset(hash.ptr, 0, hash.len); memset(hash.ptr, 0, hash.len);
if (!hasher->get_hash(hasher, data, hash.ptr)) if (!hasher->get_hash(hasher, data, hash.ptr))
{ {
failed = TRUE; goto failure;
} }
if (!memeq(vector->hash, hash.ptr, hash.len)) if (!memeq(vector->hash, hash.ptr, hash.len))
{ {
failed = TRUE; goto failure;
} }
/* hasher to existing buffer, using append mode */ /* hasher to existing buffer, using append mode */
if (data.len > 2) if (data.len > 2)
{ {
memset(hash.ptr, 0, hash.len); memset(hash.ptr, 0, hash.len);
if (!hasher->allocate_hash(hasher, chunk_create(data.ptr, 1), NULL) || if (!hasher->allocate_hash(hasher, chunk_create(data.ptr, 1), NULL))
!hasher->get_hash(hasher, chunk_create(data.ptr + 1, 1), NULL) ||
!hasher->get_hash(hasher, chunk_skip(data, 2), hash.ptr) ||
!memeq(vector->hash, hash.ptr, hash.len))
{ {
failed = TRUE; goto failure;
}
if (!hasher->get_hash(hasher, chunk_create(data.ptr + 1, 1), NULL))
{
goto failure;
}
if (!hasher->get_hash(hasher, chunk_skip(data, 2), hash.ptr))
{
goto failure;
}
if (!memeq(vector->hash, hash.ptr, hash.len))
{
goto failure;
} }
} }
free(hash.ptr);
failed = FALSE;
failure:
hasher->destroy(hasher); hasher->destroy(hasher);
chunk_free(&hash);
if (failed) if (failed)
{ {
DBG1(DBG_LIB, "disabled %N[%s]: %s test vector failed", DBG1(DBG_LIB, "disabled %N[%s]: %s test vector failed",
@@ -860,7 +870,7 @@ METHOD(crypto_tester_t, test_prf, bool,
while (enumerator->enumerate(enumerator, &vector)) while (enumerator->enumerate(enumerator, &vector))
{ {
prf_t *prf; prf_t *prf;
chunk_t key, seed, out; chunk_t key, seed, out = chunk_empty;
if (vector->alg != alg) if (vector->alg != alg)
{ {
@@ -868,36 +878,33 @@ METHOD(crypto_tester_t, test_prf, bool,
} }
tested++; tested++;
failed = TRUE;
prf = create(alg); prf = create(alg);
if (!prf) if (!prf)
{ {
DBG1(DBG_LIB, "disabled %N[%s]: creating instance failed", DBG1(DBG_LIB, "disabled %N[%s]: creating instance failed",
pseudo_random_function_names, alg, plugin_name); pseudo_random_function_names, alg, plugin_name);
failed = TRUE;
break; break;
} }
failed = FALSE;
key = chunk_create(vector->key, vector->key_size); key = chunk_create(vector->key, vector->key_size);
if (!prf->set_key(prf, key)) if (!prf->set_key(prf, key))
{ {
failed = TRUE; goto failure;
} }
/* allocated bytes */ /* allocated bytes */
seed = chunk_create(vector->seed, vector->len); seed = chunk_create(vector->seed, vector->len);
if (!prf->allocate_bytes(prf, seed, &out)) if (!prf->allocate_bytes(prf, seed, &out))
{ {
failed = TRUE; goto failure;
} }
if (out.len != prf->get_block_size(prf)) if (out.len != prf->get_block_size(prf))
{ {
failed = TRUE; goto failure;
} }
if (!memeq(vector->out, out.ptr, out.len)) if (!memeq(vector->out, out.ptr, out.len))
{ {
failed = TRUE; goto failure;
} }
/* bytes to existing buffer */ /* bytes to existing buffer */
memset(out.ptr, 0, out.len); memset(out.ptr, 0, out.len);
@@ -905,16 +912,16 @@ METHOD(crypto_tester_t, test_prf, bool,
{ {
if (!prf->set_key(prf, key)) if (!prf->set_key(prf, key))
{ {
failed = TRUE; goto failure;
} }
} }
if (!prf->get_bytes(prf, seed, out.ptr)) if (!prf->get_bytes(prf, seed, out.ptr))
{ {
failed = TRUE; goto failure;
} }
if (!memeq(vector->out, out.ptr, out.len)) if (!memeq(vector->out, out.ptr, out.len))
{ {
failed = TRUE; goto failure;
} }
/* bytes to existing buffer, using append mode */ /* bytes to existing buffer, using append mode */
if (seed.len > 2) if (seed.len > 2)
@@ -924,23 +931,31 @@ METHOD(crypto_tester_t, test_prf, bool,
{ {
if (!prf->set_key(prf, key)) if (!prf->set_key(prf, key))
{ {
failed = TRUE; goto failure;
} }
} }
if (!prf->allocate_bytes(prf, chunk_create(seed.ptr, 1), NULL) || if (!prf->allocate_bytes(prf, chunk_create(seed.ptr, 1), NULL))
!prf->get_bytes(prf, chunk_create(seed.ptr + 1, 1), NULL) ||
!prf->get_bytes(prf, chunk_skip(seed, 2), out.ptr))
{ {
failed = TRUE; goto failure;
}
if (!prf->get_bytes(prf, chunk_create(seed.ptr + 1, 1), NULL))
{
goto failure;
}
if (!prf->get_bytes(prf, chunk_skip(seed, 2), out.ptr))
{
goto failure;
} }
if (!memeq(vector->out, out.ptr, out.len)) if (!memeq(vector->out, out.ptr, out.len))
{ {
failed = TRUE; goto failure;
} }
} }
free(out.ptr);
failed = FALSE;
failure:
prf->destroy(prf); prf->destroy(prf);
chunk_free(&out);
if (failed) if (failed)
{ {
DBG1(DBG_LIB, "disabled %N[%s]: %s test vector failed", DBG1(DBG_LIB, "disabled %N[%s]: %s test vector failed",
@@ -1036,35 +1051,39 @@ METHOD(crypto_tester_t, test_rng, bool,
} }
tested++; tested++;
failed = TRUE;
rng = create(quality); rng = create(quality);
if (!rng) if (!rng)
{ {
DBG1(DBG_LIB, "disabled %N[%s]: creating instance failed", DBG1(DBG_LIB, "disabled %N[%s]: creating instance failed",
rng_quality_names, quality, plugin_name); rng_quality_names, quality, plugin_name);
failed = TRUE;
break; break;
} }
failed = FALSE;
/* allocated bytes */ /* allocated bytes */
if (!rng->allocate_bytes(rng, vector->len, &data) || if (!rng->allocate_bytes(rng, vector->len, &data) ||
data.len != vector->len || data.len != vector->len ||
!vector->test(vector->user, data)) !vector->test(vector->user, data))
{ {
failed = TRUE; goto failure;
} }
if (!failed) if (!failed)
{ /* write bytes into existing buffer */ { /* write bytes into existing buffer */
memset(data.ptr, 0, data.len); memset(data.ptr, 0, data.len);
if (!rng->get_bytes(rng, vector->len, data.ptr) || if (!rng->get_bytes(rng, vector->len, data.ptr))
!vector->test(vector->user, data))
{ {
failed = TRUE; goto failure;
}
if (!vector->test(vector->user, data))
{
goto failure;
} }
} }
free(data.ptr);
failed = FALSE;
failure:
rng->destroy(rng); rng->destroy(rng);
chunk_free(&data);
if (failed) if (failed)
{ {
DBG1(DBG_LIB, "disabled %N[%s]: %s test vector failed", DBG1(DBG_LIB, "disabled %N[%s]: %s test vector failed",