Commit 226cc7de authored by Bodo Möller's avatar Bodo Möller
Browse files

More method functions for EC_GFp_simple_method.

parent e869d4bd
Loading
Loading
Loading
Loading
+0 −1
Original line number Diff line number Diff line
@@ -553,4 +553,3 @@ int BN_bntest_rand(BIGNUM *rnd, int bits, int top,int bottom);
}
#endif
#endif
+38 −24
Original line number Diff line number Diff line
@@ -65,6 +65,7 @@ extern "C" {


typedef enum {
	/* values as defined in X9.62 (ECDSA) and elsewhere */
	POINT_CONVERSION_COMPRESSED = 2,
	POINT_CONVERSION_UNCOMPRESSED = 4,
	POINT_CONVERSION_HYBRID = 6
@@ -120,7 +121,12 @@ void EC_POINT_free(EC_POINT *);
void EC_POINT_clear_free(EC_POINT *);
int EC_POINT_copy(EC_POINT *, const EC_POINT *);
 
/* TODO: 'set' and 'get' functions for EC_POINTs */
int EC_POINT_set_to_infinity(const EC_GROUP *, EC_POINT *);
int EC_POINT_set_affine_coordinates_GFp(const EC_GROUP *, EC_POINT *,
	const BIGNUM *x, const BIGNUM *y, BN_CTX *);
int EC_POINT_get_affine_coordinates_GFp(const EC_GROUP *, const EC_POINT *,
	BIGNUM *x, BIGNUM *y, BN_CTX *);
/* TODO: other 'set' and 'get' functions for EC_POINTs */

size_t EC_POINT_point2oct(const EC_GROUP *, const EC_POINT *, point_conversion_form_t form,
        unsigned char *buf, size_t len, BN_CTX *);
@@ -149,33 +155,41 @@ int EC_POINT_make_affine(const EC_GROUP *, EC_POINT *, BN_CTX *);
/* Error codes for the EC functions. */

/* Function codes. */
#define EC_F_EC_GFP_SIMPLE_GROUP_SET_GENERATOR		 117
#define EC_F_EC_GFP_SIMPLE_MAKE_AFFINE			 118
#define EC_F_EC_GROUP_CLEAR_FREE			 103
#define EC_F_EC_GROUP_COPY				 102
#define EC_F_EC_GROUP_FREE				 104
#define EC_F_EC_GROUP_GET_EXTRA_DATA			 115
#define EC_F_EC_GROUP_NEW				 100
#define EC_F_EC_GROUP_SET_CURVE_GFP			 101
#define EC_F_EC_GROUP_SET_EXTRA_DATA			 116
#define EC_F_EC_GROUP_SET_GENERATOR			 106
#define EC_F_EC_POINT_ADD				 107
#define EC_F_EC_POINT_COPY				 108
#define EC_F_EC_POINT_DBL				 109
#define EC_F_EC_POINT_IS_AT_INFINITY			 110
#define EC_F_EC_POINT_IS_ON_CURVE			 111
#define EC_F_EC_POINT_MAKE_AFFINE			 112
#define EC_F_EC_POINT_NEW				 105
#define EC_F_EC_POINT_OCT2POINT				 113
#define EC_F_EC_POINT_POINT2OCT				 114
#define EC_F_EC_GFP_SIMPLE_GROUP_SET_GENERATOR		 100
#define EC_F_EC_GFP_SIMPLE_MAKE_AFFINE			 101
#define EC_F_EC_GFP_SIMPLE_OCT2POINT			 102
#define EC_F_EC_GFP_SIMPLE_POINT2OCT			 103
#define EC_F_EC_GFP_SIMPLE_POINT_GET_AFFINE_COORDINATES_GFP 104
#define EC_F_EC_GROUP_COPY				 105
#define EC_F_EC_GROUP_GET_EXTRA_DATA			 106
#define EC_F_EC_GROUP_NEW				 107
#define EC_F_EC_GROUP_SET_CURVE_GFP			 108
#define EC_F_EC_GROUP_SET_EXTRA_DATA			 109
#define EC_F_EC_GROUP_SET_GENERATOR			 110
#define EC_F_EC_POINT_ADD				 111
#define EC_F_EC_POINT_COPY				 112
#define EC_F_EC_POINT_DBL				 113
#define EC_F_EC_POINT_GET_AFFINE_COORDINATES_GFP	 114
#define EC_F_EC_POINT_IS_AT_INFINITY			 115
#define EC_F_EC_POINT_IS_ON_CURVE			 116
#define EC_F_EC_POINT_MAKE_AFFINE			 117
#define EC_F_EC_POINT_NEW				 118
#define EC_F_EC_POINT_OCT2POINT				 119
#define EC_F_EC_POINT_POINT2OCT				 120
#define EC_F_EC_POINT_SET_AFFINE_COORDINATES_GFP	 121
#define EC_F_EC_POINT_SET_TO_INFINITY			 122

/* Reason codes. */
#define EC_R_INCOMPATIBLE_OBJECTS			 100
#define EC_R_NO_SUCH_EXTRA_DATA				 101
#define EC_R_SLOT_FULL					 102
#define EC_R_BUFFER_TOO_SMALL				 100
#define EC_R_INCOMPATIBLE_OBJECTS			 101
#define EC_R_INVALID_ENCODING				 102
#define EC_R_INVALID_FORM				 103
#define EC_R_NO_SUCH_EXTRA_DATA				 104
#define EC_R_POINT_AT_INFINITY				 105
#define EC_R_POINT_IS_NOT_ON_CURVE			 106
#define EC_R_SLOT_FULL					 107

#ifdef  __cplusplus
}
#endif
#endif
+11 −2
Original line number Diff line number Diff line
@@ -68,9 +68,10 @@ static ERR_STRING_DATA EC_str_functs[]=
	{
{ERR_PACK(0,EC_F_EC_GFP_SIMPLE_GROUP_SET_GENERATOR,0),	"EC_GFP_SIMPLE_GROUP_SET_GENERATOR"},
{ERR_PACK(0,EC_F_EC_GFP_SIMPLE_MAKE_AFFINE,0),	"EC_GFP_SIMPLE_MAKE_AFFINE"},
{ERR_PACK(0,EC_F_EC_GROUP_CLEAR_FREE,0),	"EC_GROUP_clear_free"},
{ERR_PACK(0,EC_F_EC_GFP_SIMPLE_OCT2POINT,0),	"EC_GFP_SIMPLE_OCT2POINT"},
{ERR_PACK(0,EC_F_EC_GFP_SIMPLE_POINT2OCT,0),	"EC_GFP_SIMPLE_POINT2OCT"},
{ERR_PACK(0,EC_F_EC_GFP_SIMPLE_POINT_GET_AFFINE_COORDINATES_GFP,0),	"EC_GFP_SIMPLE_POINT_GET_AFFINE_COORDINATES_GFP"},
{ERR_PACK(0,EC_F_EC_GROUP_COPY,0),	"EC_GROUP_copy"},
{ERR_PACK(0,EC_F_EC_GROUP_FREE,0),	"EC_GROUP_free"},
{ERR_PACK(0,EC_F_EC_GROUP_GET_EXTRA_DATA,0),	"EC_GROUP_GET_EXTRA_DATA"},
{ERR_PACK(0,EC_F_EC_GROUP_NEW,0),	"EC_GROUP_new"},
{ERR_PACK(0,EC_F_EC_GROUP_SET_CURVE_GFP,0),	"EC_GROUP_set_curve_GFp"},
@@ -79,19 +80,27 @@ static ERR_STRING_DATA EC_str_functs[]=
{ERR_PACK(0,EC_F_EC_POINT_ADD,0),	"EC_POINT_add"},
{ERR_PACK(0,EC_F_EC_POINT_COPY,0),	"EC_POINT_copy"},
{ERR_PACK(0,EC_F_EC_POINT_DBL,0),	"EC_POINT_dbl"},
{ERR_PACK(0,EC_F_EC_POINT_GET_AFFINE_COORDINATES_GFP,0),	"EC_POINT_get_affine_coordinates_GFp"},
{ERR_PACK(0,EC_F_EC_POINT_IS_AT_INFINITY,0),	"EC_POINT_is_at_infinity"},
{ERR_PACK(0,EC_F_EC_POINT_IS_ON_CURVE,0),	"EC_POINT_is_on_curve"},
{ERR_PACK(0,EC_F_EC_POINT_MAKE_AFFINE,0),	"EC_POINT_make_affine"},
{ERR_PACK(0,EC_F_EC_POINT_NEW,0),	"EC_POINT_new"},
{ERR_PACK(0,EC_F_EC_POINT_OCT2POINT,0),	"EC_POINT_oct2point"},
{ERR_PACK(0,EC_F_EC_POINT_POINT2OCT,0),	"EC_POINT_point2oct"},
{ERR_PACK(0,EC_F_EC_POINT_SET_AFFINE_COORDINATES_GFP,0),	"EC_POINT_set_affine_coordinates_GFp"},
{ERR_PACK(0,EC_F_EC_POINT_SET_TO_INFINITY,0),	"EC_POINT_set_to_infinity"},
{0,NULL}
	};

static ERR_STRING_DATA EC_str_reasons[]=
	{
{EC_R_BUFFER_TOO_SMALL                   ,"buffer too small"},
{EC_R_INCOMPATIBLE_OBJECTS               ,"incompatible objects"},
{EC_R_INVALID_ENCODING                   ,"invalid encoding"},
{EC_R_INVALID_FORM                       ,"invalid form"},
{EC_R_NO_SUCH_EXTRA_DATA                 ,"no such extra data"},
{EC_R_POINT_AT_INFINITY                  ,"point at infinity"},
{EC_R_POINT_IS_NOT_ON_CURVE              ,"point is not on curve"},
{EC_R_SLOT_FULL                          ,"slot full"},
{0,NULL}
	};
+12 −2
Original line number Diff line number Diff line
@@ -84,7 +84,12 @@ struct ec_method_st {
	void (*point_clear_finish)(EC_POINT *);
	int (*point_copy)(EC_POINT *, const EC_POINT *);

	/* TODO: 'set' and 'get' functions for EC_POINTs */
	int (*point_set_to_infinity)(const EC_GROUP *, EC_POINT *);
	int (*point_set_affine_coordinates_GFp)(const EC_GROUP *, EC_POINT *,
		const BIGNUM *x, const BIGNUM *y, BN_CTX *);
	int (*point_get_affine_coordinates_GFp)(const EC_GROUP *, const EC_POINT *,
		BIGNUM *x, BIGNUM *y, BN_CTX *);
	/* TODO: other 'set' and 'get' functions for EC_POINTs */

	/* used by EC_POINT_point2oct, EC_POINT_oct2point: */
	size_t (*point2oct)(const EC_GROUP *, const EC_POINT *, point_conversion_form_t form,
@@ -188,7 +193,12 @@ int ec_GFp_simple_point_init(EC_POINT *);
void ec_GFp_simple_point_finish(EC_POINT *);
void ec_GFp_simple_point_clear_finish(EC_POINT *);
int ec_GFp_simple_point_copy(EC_POINT *, const EC_POINT *);
/* TODO: 'set' and 'get' functions for EC_POINTs */
int ec_GFp_simple_point_set_to_infinity(const EC_GROUP *, EC_POINT *);
int ec_GFp_simple_point_set_affine_coordinates_GFp(const EC_GROUP *, EC_POINT *,
	const BIGNUM *x, const BIGNUM *y, BN_CTX *);
int ec_GFp_simple_point_get_affine_coordinates_GFp(const EC_GROUP *, const EC_POINT *,
	BIGNUM *x, BIGNUM *y, BN_CTX *);
/* TODO: other 'set' and 'get' functions for EC_POINTs */
size_t ec_GFp_simple_point2oct(const EC_GROUP *, const EC_POINT *, point_conversion_form_t form,
	unsigned char *buf, size_t len, BN_CTX *);
int ec_GFp_simple_oct2point(const EC_GROUP *, EC_POINT *,
+51 −3
Original line number Diff line number Diff line
@@ -108,7 +108,6 @@ int EC_GROUP_set_curve_GFp(EC_GROUP *group, const BIGNUM *p, const BIGNUM *a, co
		ECerr(EC_F_EC_GROUP_SET_CURVE_GFP, ERR_R_SHOULD_NOT_HAVE_BEEN_CALLED);
		return 0;
		}
	
	return group->meth->group_set_curve_GFp(group, p, a, b, ctx);
	}

@@ -315,12 +314,61 @@ int EC_POINT_copy(EC_POINT *dest, const EC_POINT *src)
		ECerr(EC_F_EC_POINT_COPY, EC_R_INCOMPATIBLE_OBJECTS);
		return 0;
		}
	
	return dest->meth->point_copy(dest, src);
	}


/* TODO: 'set' and 'get' functions for EC_POINTs */
int EC_POINT_set_to_infinity(const EC_GROUP *group, EC_POINT *point)
	{
	if (group->meth->point_set_to_infinity == 0)
		{
		ECerr(EC_F_EC_POINT_SET_TO_INFINITY, ERR_R_SHOULD_NOT_HAVE_BEEN_CALLED);
		return 0;
		}
	if (group->meth != point->meth)
		{
		ECerr(EC_F_EC_POINT_SET_TO_INFINITY, EC_R_INCOMPATIBLE_OBJECTS);
		return 0;
		}
	return group->meth->point_set_to_infinity(group, point);
	}


int EC_POINT_set_affine_coordinates_GFp(const EC_GROUP *group, EC_POINT *point,
	const BIGNUM *x, const BIGNUM *y, BN_CTX *ctx)
	{
	if (group->meth->point_set_affine_coordinates_GFp == 0)
		{
		ECerr(EC_F_EC_POINT_SET_AFFINE_COORDINATES_GFP, ERR_R_SHOULD_NOT_HAVE_BEEN_CALLED);
		return 0;
		}
	if (group->meth != point->meth)
		{
		ECerr(EC_F_EC_POINT_SET_AFFINE_COORDINATES_GFP, EC_R_INCOMPATIBLE_OBJECTS);
		return 0;
		}
	return group->meth->point_set_affine_coordinates_GFp(group, point, x, y, ctx);
	}


int EC_POINT_get_affine_coordinates_GFp(const EC_GROUP *group, const EC_POINT *point,
	BIGNUM *x, BIGNUM *y, BN_CTX *ctx)
	{
	if (group->meth->point_get_affine_coordinates_GFp == 0)
		{
		ECerr(EC_F_EC_POINT_GET_AFFINE_COORDINATES_GFP, ERR_R_SHOULD_NOT_HAVE_BEEN_CALLED);
		return 0;
		}
	if (group->meth != point->meth)
		{
		ECerr(EC_F_EC_POINT_GET_AFFINE_COORDINATES_GFP, EC_R_INCOMPATIBLE_OBJECTS);
		return 0;
		}
	return group->meth->point_get_affine_coordinates_GFp(group, point, x, y, ctx);
	}


/* TODO: other 'set' and 'get' functions for EC_POINTs */


size_t EC_POINT_point2oct(const EC_GROUP *group, const EC_POINT *point, point_conversion_form_t form,
Loading