#include "dpl/test/test_runner.h"
#include <yaca_sign.h>
+#include <yaca_types.h>
+#include "yaca-test-common.h"
+#include "lorem.h"
+
+
+namespace {
+
+void sign_length_test(yaca_digest_algorithm_e algo,
+ const KeyPtr &key)
+{
+ CtxPtr ctx = sign_init(algo, key);
+ size_t output_len;
+ size_t key_bit_len;
+
+ YACA_SUCCESS(yaca_key_get_bit_length(key.get(), &key_bit_len));
+
+ YACA_SUCCESS(yaca_context_get_output_length(ctx.get(), 0, &output_len));
+
+ YACA_ASSERT_MSG(output_len * 8 == key_bit_len,
+ "Sign " << digest2str(algo) << " produces " << output_len * 8 <<
+ " bit signature. Expected " << key_bit_len << " bits.");
+}
+
+} // anonymous namespace
RUNNER_TEST_GROUP_INIT(T6000_YACA_SIGN);
-RUNNER_TEST(T6001_yaca_sign_init)
+RUNNER_TEST(T6010_yaca_sign_init_invalid_param, YacaTest)
+{
+ yaca_context_h ctx = YACA_CONTEXT_NULL;
+ KeyPtr prv = generate_key(YACA_KEY_TYPE_RSA_PRIV, YACA_KEY_LENGTH_1024BIT);
+ KeyPtr pub = extract_public_key(prv);
+ KeyPtr sym = generate_key(YACA_KEY_TYPE_SYMMETRIC, YACA_KEY_LENGTH_256BIT);
+
+ YACA_INVALID_PARAM(yaca_sign_initialize(nullptr, YACA_DIGEST_MD5, prv.get()));
+ YACA_INVALID_PARAM(yaca_sign_initialize(&ctx, static_cast<yaca_digest_algorithm_e>(-1), prv.get()));
+ YACA_INVALID_PARAM(yaca_sign_initialize(&ctx, YACA_DIGEST_MD5, YACA_KEY_NULL));
+ YACA_INVALID_PARAM(yaca_sign_initialize(&ctx, YACA_DIGEST_MD5, pub.get()));
+ YACA_INVALID_PARAM(yaca_sign_initialize(&ctx, YACA_DIGEST_MD5, sym.get()));
+}
+
+RUNNER_TEST(T6020_yaca_sign_update_invalid_param, YacaTest)
{
+ KeyPtr prv = generate_key(YACA_KEY_TYPE_RSA_PRIV, YACA_KEY_LENGTH_1024BIT);
+ CtxPtr ctx = sign_init(YACA_DIGEST_MD5, prv);
+ CtxPtr ctx_bad = digest_init(YACA_DIGEST_MD5);
+
+ YACA_INVALID_PARAM(yaca_sign_update(YACA_CONTEXT_NULL, lorem16, LOREM16_SIZE));
+ YACA_INVALID_PARAM(yaca_sign_update(ctx_bad.get(), lorem16, LOREM16_SIZE));
+ YACA_INVALID_PARAM(yaca_sign_update(ctx.get(), NULL, LOREM16_SIZE));
+ YACA_INVALID_PARAM(yaca_sign_update(ctx.get(), lorem16, 0));
}
-RUNNER_TEST(T6002_yaca_sign_update)
+RUNNER_TEST(T6030_yaca_sign_final_invalid_param, YacaTest)
{
+ KeyPtr prv = generate_key(YACA_KEY_TYPE_RSA_PRIV, YACA_KEY_LENGTH_1024BIT);
+ CtxPtr ctx = sign_init(YACA_DIGEST_MD5, prv);
+ size_t sign_len = get_output_length(ctx);
+ BufPtr sign = create_yaca_buffer(sign_len);
+
+ YACA_INVALID_PARAM(yaca_sign_finalize(YACA_CONTEXT_NULL, sign.get(), &sign_len));
+ YACA_INVALID_PARAM(yaca_sign_finalize(ctx.get(), nullptr, &sign_len));
+ YACA_INVALID_PARAM(yaca_sign_finalize(ctx.get(), sign.get(), nullptr));
}
-RUNNER_TEST(T6003_yaca_sign_final)
+RUNNER_TEST(T6040_yaca_verify_init_invalid_param)
{
+ yaca_context_h ctx = YACA_CONTEXT_NULL;
+ KeyPtr prv = generate_key(YACA_KEY_TYPE_RSA_PRIV, YACA_KEY_LENGTH_1024BIT);
+ KeyPtr pub = extract_public_key(prv);
+ KeyPtr sym = generate_key(YACA_KEY_TYPE_SYMMETRIC, YACA_KEY_LENGTH_256BIT);
+
+ YACA_INVALID_PARAM(yaca_verify_initialize(nullptr, YACA_DIGEST_MD5, pub.get()));
+ YACA_INVALID_PARAM(yaca_verify_initialize(&ctx, static_cast<yaca_digest_algorithm_e>(-1), prv.get()));
+ YACA_INVALID_PARAM(yaca_verify_initialize(&ctx, YACA_DIGEST_MD5, YACA_KEY_NULL));
+ YACA_INVALID_PARAM(yaca_verify_initialize(&ctx, YACA_DIGEST_MD5, prv.get()));
+ YACA_INVALID_PARAM(yaca_verify_initialize(&ctx, YACA_DIGEST_MD5, sym.get()));
}
-RUNNER_TEST(T6004_yaca_verify_init)
+RUNNER_TEST(T6050_yaca_verify_update_invalid_param)
{
+ KeyPtr prv = generate_key(YACA_KEY_TYPE_RSA_PRIV, YACA_KEY_LENGTH_1024BIT);
+ KeyPtr pub = extract_public_key(prv);
+ CtxPtr ctx = verify_init(YACA_DIGEST_MD5, pub);
+
+ YACA_INVALID_PARAM(yaca_sign_update(YACA_CONTEXT_NULL, lorem16, LOREM16_SIZE));
+ YACA_INVALID_PARAM(yaca_sign_update(ctx.get(), NULL, LOREM16_SIZE));
+ YACA_INVALID_PARAM(yaca_sign_update(ctx.get(), lorem16, 0));
}
-RUNNER_TEST(T6005_yaca_verify_update)
+RUNNER_TEST(T6060_yaca_verify_final_invalid_param)
{
+ KeyPtr prv = generate_key(YACA_KEY_TYPE_RSA_PRIV, YACA_KEY_LENGTH_1024BIT);
+ KeyPtr pub = extract_public_key(prv);
+ CtxPtr ctx = verify_init(YACA_DIGEST_MD5, pub);
+
+ YACA_INVALID_PARAM(yaca_verify_finalize(YACA_CONTEXT_NULL, lorem16, LOREM16_SIZE));
+ YACA_INVALID_PARAM(yaca_verify_finalize(ctx.get(), nullptr, LOREM16_SIZE));
+ YACA_INVALID_PARAM(yaca_verify_finalize(ctx.get(), lorem16, 0));
}
-RUNNER_TEST(T6006_yaca_verify_final)
+RUNNER_TEST(T6070_yaca_sign_get_output_length_invalid_param)
{
+ KeyPtr prv = generate_key(YACA_KEY_TYPE_RSA_PRIV, YACA_KEY_LENGTH_1024BIT);
+ KeyPtr pub = extract_public_key(prv);
+ CtxPtr ctx = sign_init(YACA_DIGEST_MD5, prv);
+ CtxPtr ctx_vrf = verify_init(YACA_DIGEST_MD5, pub);
+ size_t output_len;
+
+ YACA_INVALID_PARAM(yaca_context_get_output_length(ctx_vrf.get(), 0, &output_len));
+ YACA_INVALID_PARAM(yaca_context_get_output_length(ctx.get(), 1, &output_len));
+ YACA_INVALID_PARAM(yaca_context_get_output_length(ctx.get(), 0, NULL));
+}
+
+RUNNER_TEST(T6080_yaca_sign_get_output_length)
+{
+ const std::vector<yaca_digest_algorithm_e> digests = {
+ YACA_DIGEST_MD5,
+ YACA_DIGEST_SHA1,
+ YACA_DIGEST_SHA224,
+ YACA_DIGEST_SHA256,
+ YACA_DIGEST_SHA384,
+ YACA_DIGEST_SHA512
+ };
+
+ const std::vector<yaca_key_bit_length_e> lengths = {
+ YACA_KEY_LENGTH_256BIT,
+ YACA_KEY_LENGTH_512BIT,
+ YACA_KEY_LENGTH_1024BIT,
+ YACA_KEY_LENGTH_2048BIT,
+ YACA_KEY_LENGTH_3072BIT,
+ YACA_KEY_LENGTH_4096BIT
+ };
+
+ std::vector<KeyPtr> keys;
+
+ /* pre-generate keys to shorten the test execution time */
+ for (auto &l: lengths)
+ keys.push_back(generate_key(YACA_KEY_TYPE_RSA_PRIV, l));
+
+ for (auto &d: digests)
+ for (const auto &k: keys)
+ sign_length_test(d, k);
}