gateway2/Tongsuo-8.4.0/test/ecpmeth_test.c
2026-07-11 13:40:57 +08:00

171 lines
3.9 KiB
C

/*
* Copyright 2022 The Tongsuo Project Authors. All Rights Reserved.
*
* Licensed under the Apache License 2.0 (the "License"). You may not use
* this file except in compliance with the License. You can obtain a copy
* in the file LICENSE in the source distribution or at
* https://github.com/Tongsuo-Project/Tongsuo/blob/master/LICENSE.txt
*/
/* We need to use some deprecated APIs */
#define OPENSSL_SUPPRESS_DEPRECATED
#include <stdio.h>
#include <string.h>
#include <openssl/conf.h>
#include <openssl/opensslconf.h>
#include <openssl/evp.h>
#include <openssl/bn.h>
#include <openssl/bio.h>
#ifndef OPENSSL_NO_EC
# include <openssl/ec.h>
# ifndef OPENSSL_NO_ENGINE
# include <openssl/engine.h>
# endif
#include "testutil.h"
# ifndef OPENSSL_NO_ENGINE
static ENGINE *e;
# endif
static const char *scalars_arr[] = {
"785129917D45A9EA5437A59356B82338EAADDA6CEB199088F14AE10D1FA229B5",
"0000000000000000000000000000000000000000000000000000000000000002",
};
static int do_ecpmeth_engine_test(int curve_id)
{
int ret = 0, count;
BN_CTX *ctx = NULL;
BIGNUM *scalar1, *scalar2;
EC_GROUP *group = NULL;
EC_POINT *R = NULL;
EC_POINTS *rs = NULL;
const EC_POINT *G, *points[2];
const BIGNUM *scalars[2];
# ifndef OPENSSL_NO_ENGINE
const unsigned char *strings[] = {
(unsigned char *)"aabb",
(unsigned char *)"1122334455",
};
# endif
ctx = BN_CTX_new();
BN_CTX_start(ctx);
scalar1 = BN_CTX_get(ctx);
scalar2 = BN_CTX_get(ctx);
if (!TEST_ptr(scalar2)
|| !TEST_ptr(group = EC_GROUP_new_by_curve_name(curve_id))
# ifndef OPENSSL_NO_ENGINE
|| !TEST_true(EC_GROUP_set_engine(group, e))
# endif
|| !TEST_ptr(G = EC_GROUP_get0_generator(group))
|| !TEST_ptr(R = EC_POINT_new(group))
|| !TEST_true(BN_hex2bn(&scalar1, scalars_arr[0]))
|| !TEST_true(BN_hex2bn(&scalar2, scalars_arr[1])))
goto err;
points[0] = points[1] = G;
scalars[0] = scalar1;
scalars[1] = scalar2;
count = sizeof(points) / sizeof(points[0]);
if (!TEST_true(EC_POINTs_scalars_mul(group, &rs, count, points, scalars, NULL))
|| !TEST_ptr(rs)
|| !TEST_int_eq(EC_POINTS_count(rs), count))
goto err;
EC_POINTS_free(rs);
rs = NULL;
if (!TEST_true(EC_POINTs_scalar_mul(group, &rs, count, points, scalar1, NULL))
|| !TEST_ptr(rs)
|| !TEST_int_eq(EC_POINTS_count(rs), count))
goto err;
EC_POINTS_free(rs);
rs = NULL;
# ifndef OPENSSL_NO_ENGINE
count = sizeof(strings) / sizeof(strings[0]);
if (!TEST_true(EC_POINTs_from_strings(group, &rs, count, strings, NULL))
|| !TEST_ptr(rs)
|| !TEST_int_eq(EC_POINTS_count(rs), count))
goto err;
EC_POINTS_free(rs);
rs = NULL;
if (!TEST_true(EC_POINTs_from_strings_scalar_mul(group, &rs, count, strings,
scalar2, NULL))
|| !TEST_ptr(rs)
|| !TEST_int_eq(EC_POINTS_count(rs), count))
goto err;
# endif
ret = 1;
err:
EC_POINTS_free(rs);
BN_CTX_end(ctx);
BN_CTX_free(ctx);
EC_POINT_free(R);
EC_GROUP_free(group);
return ret;
}
static int ecpmeth_engine_test(void)
{
if (!TEST_true(do_ecpmeth_engine_test(NID_X9_62_prime256v1)))
return 0;
# ifndef OPENSSL_NO_SM2
if (!TEST_true(do_ecpmeth_engine_test(NID_sm2)))
return 0;
# endif
return 1;
}
#endif /* OPENSSL_NO_EC */
#ifndef OPENSSL_NO_ENGINE
int global_init(void)
{
OPENSSL_load_builtin_modules();
ENGINE_load_builtin_engines();
return 1;
}
#endif
int setup_tests(void)
{
#ifndef OPENSSL_NO_ENGINE
if ((e = ENGINE_by_id("ecptest")) == NULL) {
/* Probably a platform env issue, not a test failure. */
TEST_info("Can't load ecptest engine");
}
#endif
#ifndef OPENSSL_NO_EC
ADD_TEST(ecpmeth_engine_test);
#endif
return 1;
}
#ifndef OPENSSL_NO_ENGINE
void cleanup_tests(void)
{
ENGINE_free(e);
}
#endif