fast reduction for NIST curves
[openssl.git] / crypto / ec / ec.h
index 4eb4ad678c1f07b52079e9e7d5e29a0bd04ffa84..5abef25f09535ef52e34ae85dfc0bae7ca088244 100644 (file)
@@ -127,9 +127,9 @@ typedef struct ec_point_st EC_POINT;
  */
 const EC_METHOD *EC_GFp_simple_method(void);
 const EC_METHOD *EC_GFp_mont_method(void);
+const EC_METHOD *EC_GFp_nist_method(void);
 #if 0
 const EC_METHOD *EC_GFp_recp_method(void); /* TODO */
-const EC_METHOD *EC_GFp_nist_method(void); /* TODO */
 #endif
 
 /* EC_METHOD for curves over GF(2^m).
@@ -184,14 +184,20 @@ EC_GROUP *EC_GROUP_new_curve_GF2m(const BIGNUM *p, const BIGNUM *a, const BIGNUM
 
 /* EC_GROUP_new_by_nid() creates a EC_GROUP structure specified by a NID */
 EC_GROUP *EC_GROUP_new_by_nid(int nid);
-/* EC_GROUP_get0_comment() returns a pointer to the 'comment' field of 
- * ec_curve_data_st structure */
-const char *EC_GROUP_get0_comment(int nid);
-/* internal function : ec_group_index2nid() returns the NID of curve
- * with the given index i from the internal curve list */
-int ec_group_index2nid(int i);
+/* handling of internal curves */
+typedef struct { 
+       int nid;
+       const char *comment;
+       } EC_builtin_curve;
+/* EC_builtin_curves(EC_builtin_curve *r, size_t size) returns number 
+ * of all available curves or zero if a error occurred. 
+ * In case r ist not zero nitems EC_builtin_curve structures 
+ * are filled with the data of the first nitems internal groups */
+size_t EC_get_builtin_curves(EC_builtin_curve *r, size_t nitems);
 
 
+/* EC_POINT functions */
+
 EC_POINT *EC_POINT_new(const EC_GROUP *);
 void EC_POINT_free(EC_POINT *);
 void EC_POINT_clear_free(EC_POINT *);
@@ -253,6 +259,14 @@ int EC_GROUP_precompute_mult(EC_GROUP *, BN_CTX *);
 
 
 /* ASN1 stuff */
+
+/* EC_GROUP_get_basis_type() returns the NID of the basis type
+ * used to represent the field elements */
+int EC_GROUP_get_basis_type(const EC_GROUP *);
+int EC_GROUP_get_trinomial_basis(const EC_GROUP *, unsigned int *k);
+int EC_GROUP_get_pentanomial_basis(const EC_GROUP *, unsigned int *k1, 
+       unsigned int *k2, unsigned int *k3);
+
 #define OPENSSL_EC_NAMED_CURVE 0x001
 
 typedef struct ecpk_parameters_st ECPKPARAMETERS;
@@ -356,6 +370,10 @@ void ERR_load_EC_strings(void);
 #define EC_F_ECPKPARAMETERS_PRINT_FP                    150
 #define EC_F_ECPUBLICKEY_GET_OCTET                      151
 #define EC_F_ECPUBLICKEY_SET_OCTET                      152
+#define EC_F_ECP_NIST_MOD_192                           203
+#define EC_F_ECP_NIST_MOD_224                           204
+#define EC_F_ECP_NIST_MOD_256                           205
+#define EC_F_ECP_NIST_MOD_521                           206
 #define EC_F_EC_ASN1_GROUP2CURVE                        153
 #define EC_F_EC_ASN1_GROUP2FIELDID                      154
 #define EC_F_EC_ASN1_GROUP2PARAMETERS                   155
@@ -363,6 +381,7 @@ void ERR_load_EC_strings(void);
 #define EC_F_EC_ASN1_PARAMETERS2GROUP                   157
 #define EC_F_EC_ASN1_PKPARAMETERS2GROUP                         158
 #define EC_F_EC_GF2M_SIMPLE_GROUP_CHECK_DISCRIMINANT    159
+#define EC_F_EC_GF2M_SIMPLE_GROUP_SET_CURVE             195
 #define EC_F_EC_GF2M_SIMPLE_OCT2POINT                   160
 #define EC_F_EC_GF2M_SIMPLE_POINT2OCT                   161
 #define EC_F_EC_GF2M_SIMPLE_POINT_GET_AFFINE_COORDINATES 162
@@ -372,6 +391,9 @@ void ERR_load_EC_strings(void);
 #define EC_F_EC_GFP_MONT_FIELD_ENCODE                   134
 #define EC_F_EC_GFP_MONT_FIELD_MUL                      131
 #define EC_F_EC_GFP_MONT_FIELD_SQR                      132
+#define EC_F_EC_GFP_NIST_FIELD_MUL                      200
+#define EC_F_EC_GFP_NIST_FIELD_SQR                      201
+#define EC_F_EC_GFP_NIST_GROUP_SET_CURVE_GFP            202
 #define EC_F_EC_GFP_SIMPLE_GROUP_CHECK_DISCRIMINANT     165
 #define EC_F_EC_GFP_SIMPLE_GROUP_SET_CURVE              166
 #define EC_F_EC_GFP_SIMPLE_GROUP_SET_CURVE_GFP          100
@@ -396,6 +418,8 @@ void ERR_load_EC_strings(void);
 #define EC_F_EC_GROUP_GET_DEGREE                        173
 #define EC_F_EC_GROUP_GET_EXTRA_DATA                    107
 #define EC_F_EC_GROUP_GET_ORDER                                 141
+#define EC_F_EC_GROUP_GET_PENTANOMIAL_BASIS             193
+#define EC_F_EC_GROUP_GET_TRINOMIAL_BASIS               194
 #define EC_F_EC_GROUP_GROUP2NID                                 147
 #define EC_F_EC_GROUP_NEW                               108
 #define EC_F_EC_GROUP_NEW_BY_NID                        174
@@ -451,6 +475,7 @@ void ERR_load_EC_strings(void);
 #define EC_R_GROUP2PKPARAMETERS_FAILURE                         120
 #define EC_R_I2D_ECPKPARAMETERS_FAILURE                         121
 #define EC_R_INCOMPATIBLE_OBJECTS                       101
+#define EC_R_INTERNAL_ERROR                             132
 #define EC_R_INVALID_ARGUMENT                           112
 #define EC_R_INVALID_COMPRESSED_POINT                   110
 #define EC_R_INVALID_COMPRESSION_BIT                    109
@@ -463,15 +488,19 @@ void ERR_load_EC_strings(void);
 #define EC_R_MISSING_PRIVATE_KEY                        125
 #define EC_R_NOT_IMPLEMENTED                            126
 #define EC_R_NOT_INITIALIZED                            111
+#define EC_R_NO_FIELD_MOD                               133
 #define EC_R_NO_SUCH_EXTRA_DATA                                 105
+#define EC_R_PASSED_NULL_PARAMETER                      134
 #define EC_R_PKPARAMETERS2GROUP_FAILURE                         127
 #define EC_R_POINT_AT_INFINITY                          106
 #define EC_R_POINT_IS_NOT_ON_CURVE                      107
+#define EC_R_PRIME_IS_NOT_A_NIST_PRIME                  135
 #define EC_R_SLOT_FULL                                  108
 #define EC_R_UNDEFINED_GENERATOR                        113
 #define EC_R_UNDEFINED_ORDER                            128
 #define EC_R_UNKNOWN_GROUP                              129
 #define EC_R_UNKNOWN_ORDER                              114
+#define EC_R_UNSUPPORTED_FIELD                          131
 #define EC_R_WRONG_ORDER                                130
 
 #ifdef  __cplusplus