gateway2/Tongsuo-8.4.0/crypto/ec/ecp_meth.c
2026-07-11 13:40:57 +08:00

192 lines
6.3 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
*/
#include <string.h>
#include <openssl/err.h>
#include <openssl/ec.h>
#include <openssl/engine.h>
#include "ec_local.h"
/** Creates a new EC_POINT_METHOD object for the specified curve_id
* \param curve_id the elliptic curve id
* \return newly created EC_POINT_METHOD object or NULL if an error occurred
*/
EC_POINT_METHOD *EC_POINT_METHOD_new(int curve_id)
{
EC_POINT_METHOD *ret = OPENSSL_zalloc(sizeof(*ret));
if (ret == NULL)
return NULL;
ret->curve_id = curve_id;
return ret;
}
/** Frees a EC_POINT_METHOD object
* \param meth EC_POINT_METHOD object to be freed
*/
void EC_POINT_METHOD_free(EC_POINT_METHOD *meth)
{
OPENSSL_free(meth);
}
/** Copies EC_POINT_METHOD object
* \param dst destination EC_POINT_METHOD object
* \param src source EC_POINT_METHOD object
* \return 1 on success and 0 if an error occurred
*/
int EC_POINT_METHOD_copy(EC_POINT_METHOD *dst, const EC_POINT_METHOD *src)
{
if (dst == src)
return 1;
if (dst->curve_id != src->curve_id) {
ERR_raise(ERR_LIB_EC, EC_R_INCOMPATIBLE_OBJECTS);
return 0;
}
memcpy(dst, src, sizeof(*dst));
return 1;
}
/** Returns the curve_id of a EC_POINT_METHOD object
* \param meth EC_POINT_METHOD object
* \return NID of the curve name OID or 0 if not set.
*/
int EC_POINT_METHOD_curve_id(EC_POINT_METHOD *meth)
{
return meth->curve_id;
}
int (*EC_POINT_METHOD_get_add(EC_POINT_METHOD *meth))
(const EC_GROUP *, EC_POINT *r, const EC_POINT *a, const EC_POINT *b,
BN_CTX *)
{
return meth->add;
}
void EC_POINT_METHOD_set_add(EC_POINT_METHOD *meth,
int (*add)(const EC_GROUP *, EC_POINT *r,
const EC_POINT *a, const EC_POINT *b,
BN_CTX *))
{
meth->add = add;
}
int (*EC_POINT_METHOD_get_dbl(EC_POINT_METHOD *meth))
(const EC_GROUP *, EC_POINT *r, const EC_POINT *a, BN_CTX *)
{
return meth->dbl;
}
void EC_POINT_METHOD_set_dbl(EC_POINT_METHOD *meth,
int (*dbl)(const EC_GROUP *, EC_POINT *r,
const EC_POINT *a, BN_CTX *))
{
meth->dbl = dbl;
}
int (*EC_POINT_METHOD_get_invert(EC_POINT_METHOD *meth))
(const EC_GROUP *, EC_POINT *point, BN_CTX *)
{
return meth->invert;
}
void EC_POINT_METHOD_set_invert(EC_POINT_METHOD *meth,
int (*invert)(const EC_GROUP *, EC_POINT *point,
BN_CTX *))
{
meth->invert = invert;
}
int (*EC_POINT_METHOD_get_mul(EC_POINT_METHOD *meth))
(const EC_GROUP *group, EC_POINT *r, const BIGNUM *scalar, size_t num,
const EC_POINT *points[], const BIGNUM *scalars[], BN_CTX *)
{
return meth->mul;
}
void EC_POINT_METHOD_set_mul(EC_POINT_METHOD *meth,
int (*mul)(const EC_GROUP *group, EC_POINT *r,
const BIGNUM *scalar, size_t num,
const EC_POINT *points[],
const BIGNUM *scalars[], BN_CTX *))
{
meth->mul = mul;
}
int (*EC_POINT_METHOD_get_scalars_mul(EC_POINT_METHOD *meth))
(const EC_GROUP *group, EC_POINT *r[], size_t num, const EC_POINT *points[],
const BIGNUM *scalars[], BN_CTX *ctx)
{
return meth->scalars_mul;
}
void EC_POINT_METHOD_set_scalars_mul(EC_POINT_METHOD *meth,
int (*scalars_mul)(const EC_GROUP *group,
EC_POINT *r[], size_t num,
const EC_POINT *points[],
const BIGNUM *scalars[],
BN_CTX *ctx))
{
meth->scalars_mul = scalars_mul;
}
int (*EC_POINT_METHOD_get_scalar_mul(EC_POINT_METHOD *meth))
(const EC_GROUP *group, EC_POINT *r[], size_t num, const EC_POINT *points[],
const BIGNUM *scalar, BN_CTX *ctx)
{
return meth->scalar_mul;
}
void EC_POINT_METHOD_set_scalar_mul(EC_POINT_METHOD *meth,
int (*scalar_mul)(const EC_GROUP *group,
EC_POINT *r[], size_t num,
const EC_POINT *points[],
const BIGNUM *scalar,
BN_CTX *ctx))
{
meth->scalar_mul = scalar_mul;
}
int (*EC_POINT_METHOD_get_strings_to_points(EC_POINT_METHOD *meth))
(const EC_GROUP *group, EC_POINT *r[], size_t num, const unsigned char *strings[],
BN_CTX *ctx)
{
return meth->strings_to_points;
}
void EC_POINT_METHOD_set_strings_to_points(EC_POINT_METHOD *meth,
int (*func)(const EC_GROUP *group,
EC_POINT *r[], size_t num,
const unsigned char *strings[],
BN_CTX *ctx))
{
meth->strings_to_points = func;
}
int (*EC_POINT_METHOD_get_strings_to_points_scalar_mul(EC_POINT_METHOD *meth))
(const EC_GROUP *group, EC_POINT *r[], size_t num, const unsigned char *strings[],
const BIGNUM *scalar, BN_CTX *ctx)
{
return meth->strings_to_points_scalar_mul;
}
void EC_POINT_METHOD_set_strings_to_points_scalar_mul(EC_POINT_METHOD *meth,
int (*func)(const EC_GROUP *group,
EC_POINT *r[], size_t num,
const unsigned char *strings[],
const BIGNUM *scalar,
BN_CTX *ctx))
{
meth->strings_to_points_scalar_mul = func;
}