corecrypto/ccec25519/crypto_test/crypto_test_ed25519.c

141 lines
4.4 KiB
C
Raw Permalink Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

/* Copyright (c) (2014,2015,2016,2018,2019) Apple Inc. All rights reserved.
*
* corecrypto is licensed under Apple Inc.s Internal Use License Agreement (which
* is contained in the License.txt file distributed with corecrypto) and only to
* people who accept that license. IMPORTANT: Any license rights granted to you by
* Apple Inc. (if any) are limited to internal use within your organization only on
* devices and computers you own or control, for the sole purpose of verifying the
* security characteristics and correct functioning of the Apple Software. You may
* not, directly or indirectly, redistribute the Apple Software or any portions thereof.
*/
#include "testmore.h"
#include "testbyteBuffer.h"
#include "testccnBuffer.h"
#if (CCED25519 == 0)
entryPoint(cced25519, "cced25519 test")
#else
#include <corecrypto/cc_priv.h>
#include <corecrypto/ccrng_sequence.h>
#include <corecrypto/ccec25519.h>
#include <corecrypto/ccsha2.h>
#include "cced25519_priv.h"
static int verbose = 0;
typedef struct {
uint8_t sk[32];
uint8_t pk[32];
uint8_t sig[64];
size_t len;
const void *msg;
} ed25519_test_vector;
static const ed25519_test_vector testVectors[] = {
#include "crypto_test_ed25519.inc"
};
static int cced_round_trip(const struct ccdigest_info *di,
char *extlabel,
const ccec25519secretkey sk,
const ccec25519pubkey pk,
const void *katsig,
size_t msglen,
const void *msg)
{
uint8_t sig[64];
int err;
cc_clear(sizeof(sig), sig);
if (katsig) {
err = cced25519_sign_deterministic(di, sig, msglen, msg, pk, sk, global_test_rng);
is(err, 0, "Sign %s", extlabel);
ok_memcmp(sig, katsig, sizeof(sig), "Signature %s", extlabel);
}
cced25519_sign(di, sig, msglen, msg, pk, sk);
err = cced25519_verify(di, msglen, msg, sig, pk);
is(err, 0, "Verify %s", extlabel);
return err == 0;
}
static void test_rng(const struct ccdigest_info *di, size_t msg_len, const void *msg)
{
const uint8_t zeros = 0x00;
const uint8_t ones = 0xff;
uint8_t prime[32] = {
0xed, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x7f
};
struct ccrng_sequence_state seq_rng;
struct ccrng_state *rng = (struct ccrng_state *)&seq_rng;
int rv;
uint8_t sig[64];
ccec25519pubkey pk;
ccec25519secretkey sk;
cced25519_make_key_pair(di, global_test_rng, pk, sk);
ccrng_sequence_init(&seq_rng, 1, &zeros);
rv = cced25519_sign_deterministic(di, sig, msg_len, msg, pk, sk, rng);
isnt(rv, CCERR_OK, "RNG returning only zeros should fail");
ccrng_sequence_init(&seq_rng, 1, &ones);
rv = cced25519_sign_deterministic(di, sig, msg_len, msg, pk, sk, rng);
isnt(rv, CCERR_OK, "RNG returning only ones should fail");
ccrng_sequence_init(&seq_rng, sizeof(prime), prime);
rv = cced25519_sign_deterministic(di, sig, msg_len, msg, pk, sk, rng);
isnt(rv, CCERR_OK, "RNG returning only p should fail");
prime[0] -= 1;
ccrng_sequence_init(&seq_rng, sizeof(prime), prime);
rv = cced25519_sign_deterministic(di, sig, msg_len, msg, pk, sk, rng);
is(rv, CCERR_OK, "RNG returning p-1 should work");
}
int cced25519_tests(TM_UNUSED int argc, TM_UNUSED char *const *argv)
{
size_t i, n;
struct ccrng_state *rng = global_test_rng;
const struct ccdigest_info *di = ccsha512_di();
char label[64];
plan_tests(3086);
if (verbose) {
diag("Starting ed25519 tests\n");
}
n = CC_ARRAY_LEN(testVectors);
for (i = 0; i < n; ++i) {
const ed25519_test_vector *const tv = &testVectors[i];
snprintf(label, sizeof(label), "test vector %zu", i + 1);
cced_round_trip(di, label, tv->sk, tv->pk, tv->sig, tv->len, tv->msg);
}
byteBuffer msg = hexStringToBytes("1010101010101010101010101010");
for (i = 0; i < 10; ++i) {
ccec25519secretkey sk;
ccec25519pubkey pk;
cced25519_make_key_pair(di, rng, pk, sk);
snprintf(label, sizeof(label), "Generated Pair Test %zu", i + 1);
cced_round_trip(di, label, sk, pk, NULL, msg->len, msg->bytes);
}
test_rng(di, msg->len, msg->bytes);
free(msg);
return 0;
}
#endif // CCED25519TEST