Add support for X9.62 KDF.
[openssl.git] / crypto / ec / ec.h
index 1f46b5233b4c01a02c9fde782a6deef9d92d22f6..cca45596b2b9a16f22aed3d0a5a4b89a6997995d 100644 (file)
@@ -151,7 +151,7 @@ const EC_METHOD *EC_GFp_mont_method(void);
  */
 const EC_METHOD *EC_GFp_nist_method(void);
 
  */
 const EC_METHOD *EC_GFp_nist_method(void);
 
-#ifdef EC_NISTP_64_GCC_128
+#ifndef OPENSSL_NO_EC_NISTP_64_GCC_128
 #ifndef OPENSSL_SYS_WIN32
 /** Returns 64-bit optimized methods for nistp224
  *  \return  EC_METHOD object
 #ifndef OPENSSL_SYS_WIN32
 /** Returns 64-bit optimized methods for nistp224
  *  \return  EC_METHOD object
@@ -398,6 +398,8 @@ typedef struct {
  * are filled with the data of the first nitems internal groups */
 size_t EC_get_builtin_curves(EC_builtin_curve *r, size_t nitems);
 
  * are filled with the data of the first nitems internal groups */
 size_t EC_get_builtin_curves(EC_builtin_curve *r, size_t nitems);
 
+const char *EC_curve_nid2nist(int nid);
+int EC_curve_nist2nid(const char *name);
 
 /********************************************************************/
 /*                    EC_POINT functions                            */
 
 /********************************************************************/
 /*                    EC_POINT functions                            */
@@ -808,7 +810,15 @@ void EC_KEY_set_conv_form(EC_KEY *eckey, point_conversion_form_t cform);
 /* functions to set/get method specific data  */
 void *EC_KEY_get_key_method_data(EC_KEY *key, 
        void *(*dup_func)(void *), void (*free_func)(void *), void (*clear_free_func)(void *));
 /* functions to set/get method specific data  */
 void *EC_KEY_get_key_method_data(EC_KEY *key, 
        void *(*dup_func)(void *), void (*free_func)(void *), void (*clear_free_func)(void *));
-void EC_KEY_insert_key_method_data(EC_KEY *key, void *data,
+/** Sets the key method data of an EC_KEY object, if none has yet been set.
+ *  \param  key              EC_KEY object
+ *  \param  data             opaque data to install.
+ *  \param  dup_func         a function that duplicates |data|.
+ *  \param  free_func        a function that frees |data|.
+ *  \param  clear_free_func  a function that wipes and frees |data|.
+ *  \return the previously set data pointer, or NULL if |data| was inserted.
+ */
+void *EC_KEY_insert_key_method_data(EC_KEY *key, void *data,
        void *(*dup_func)(void *), void (*free_func)(void *), void (*clear_free_func)(void *));
 /* wrapper functions for the underlying EC_GROUP object */
 void EC_KEY_set_asn1_flag(EC_KEY *eckey, int asn1_flag);
        void *(*dup_func)(void *), void (*free_func)(void *), void (*clear_free_func)(void *));
 /* wrapper functions for the underlying EC_GROUP object */
 void EC_KEY_set_asn1_flag(EC_KEY *eckey, int asn1_flag);
@@ -954,11 +964,78 @@ int       EC_KEY_print_fp(FILE *fp, const EC_KEY *key, int off);
 #endif
 
 #define EVP_PKEY_CTX_set_ec_paramgen_curve_nid(ctx, nid) \
 #endif
 
 #define EVP_PKEY_CTX_set_ec_paramgen_curve_nid(ctx, nid) \
-       EVP_PKEY_CTX_ctrl(ctx, EVP_PKEY_EC, EVP_PKEY_OP_PARAMGEN, \
+       EVP_PKEY_CTX_ctrl(ctx, EVP_PKEY_EC, \
+                               EVP_PKEY_OP_PARAMGEN|EVP_PKEY_OP_KEYGEN, \
                                EVP_PKEY_CTRL_EC_PARAMGEN_CURVE_NID, nid, NULL)
 
                                EVP_PKEY_CTRL_EC_PARAMGEN_CURVE_NID, nid, NULL)
 
+#define EVP_PKEY_CTX_set_ec_param_enc(ctx, flag) \
+       EVP_PKEY_CTX_ctrl(ctx, EVP_PKEY_EC, \
+                               EVP_PKEY_OP_PARAMGEN|EVP_PKEY_OP_KEYGEN, \
+                               EVP_PKEY_CTRL_EC_PARAM_ENC, flag, NULL)
+
+#define EVP_PKEY_CTX_set_ecdh_cofactor_mode(ctx, flag) \
+       EVP_PKEY_CTX_ctrl(ctx, EVP_PKEY_EC, \
+                               EVP_PKEY_OP_DERIVE, \
+                               EVP_PKEY_CTRL_EC_ECDH_COFACTOR, flag, NULL)
+
+#define EVP_PKEY_CTX_get_ecdh_cofactor_mode(ctx) \
+       EVP_PKEY_CTX_ctrl(ctx, EVP_PKEY_EC, \
+                               EVP_PKEY_OP_DERIVE, \
+                               EVP_PKEY_CTRL_EC_ECDH_COFACTOR, -2, NULL)
+
+#define EVP_PKEY_CTX_set_ecdh_kdf_type(ctx, kdf) \
+       EVP_PKEY_CTX_ctrl(ctx, EVP_PKEY_EC, \
+                               EVP_PKEY_OP_DERIVE, \
+                               EVP_PKEY_CTRL_EC_KDF_TYPE, kdf, NULL)
+
+#define EVP_PKEY_CTX_get_ecdh_kdf_type(ctx) \
+       EVP_PKEY_CTX_ctrl(ctx, EVP_PKEY_EC, \
+                               EVP_PKEY_OP_DERIVE, \
+                               EVP_PKEY_CTRL_EC_KDF_TYPE, -2, NULL)
+
+#define EVP_PKEY_CTX_set_ecdh_kdf_md(ctx, md) \
+       EVP_PKEY_CTX_ctrl(ctx, EVP_PKEY_EC, \
+                               EVP_PKEY_OP_DERIVE, \
+                               EVP_PKEY_CTRL_EC_KDF_MD, 0, (void *)md)
+
+#define EVP_PKEY_CTX_get_ecdh_kdf_md(ctx, pmd) \
+       EVP_PKEY_CTX_ctrl(ctx, EVP_PKEY_EC, \
+                               EVP_PKEY_OP_DERIVE, \
+                               EVP_PKEY_CTRL_GET_EC_KDF_MD, 0, (void *)pmd)
+
+#define EVP_PKEY_CTX_set_ecdh_kdf_outlen(ctx, len) \
+       EVP_PKEY_CTX_ctrl(ctx, EVP_PKEY_EC, \
+                               EVP_PKEY_OP_DERIVE, \
+                               EVP_PKEY_CTRL_EC_KDF_OUTLEN, len, NULL)
+
+#define EVP_PKEY_CTX_get_ecdh_kdf_outlen(ctx, plen) \
+       EVP_PKEY_CTX_ctrl(ctx, EVP_PKEY_EC, \
+                               EVP_PKEY_OP_DERIVE, \
+                       EVP_PKEY_CTRL_GET_EC_KDF_OUTLEN, 0, (void *)plen)
+
+#define EVP_PKEY_CTX_set0_ecdh_kdf_ukm(ctx, p, plen) \
+       EVP_PKEY_CTX_ctrl(ctx, EVP_PKEY_EC, \
+                               EVP_PKEY_OP_DERIVE, \
+                               EVP_PKEY_CTRL_EC_KDF_UKM, plen, (void *)p)
+
+#define EVP_PKEY_CTX_get0_ecdh_kdf_ukm(ctx, p) \
+       EVP_PKEY_CTX_ctrl(ctx, EVP_PKEY_EC, \
+                               EVP_PKEY_OP_DERIVE, \
+                               EVP_PKEY_CTRL_GET_EC_KDF_UKM, 0, (void *)p)
 
 #define EVP_PKEY_CTRL_EC_PARAMGEN_CURVE_NID            (EVP_PKEY_ALG_CTRL + 1)
 
 #define EVP_PKEY_CTRL_EC_PARAMGEN_CURVE_NID            (EVP_PKEY_ALG_CTRL + 1)
+#define EVP_PKEY_CTRL_EC_PARAM_ENC                     (EVP_PKEY_ALG_CTRL + 2)
+#define EVP_PKEY_CTRL_EC_ECDH_COFACTOR                 (EVP_PKEY_ALG_CTRL + 3)
+#define EVP_PKEY_CTRL_EC_KDF_TYPE                      (EVP_PKEY_ALG_CTRL + 4)
+#define EVP_PKEY_CTRL_EC_KDF_MD                                (EVP_PKEY_ALG_CTRL + 5)
+#define EVP_PKEY_CTRL_GET_EC_KDF_MD                    (EVP_PKEY_ALG_CTRL + 6)
+#define EVP_PKEY_CTRL_EC_KDF_OUTLEN                    (EVP_PKEY_ALG_CTRL + 7)
+#define EVP_PKEY_CTRL_GET_EC_KDF_OUTLEN                        (EVP_PKEY_ALG_CTRL + 8)
+#define EVP_PKEY_CTRL_EC_KDF_UKM                       (EVP_PKEY_ALG_CTRL + 9)
+#define EVP_PKEY_CTRL_GET_EC_KDF_UKM                   (EVP_PKEY_ALG_CTRL + 10)
+/* KDF types */
+#define EVP_PKEY_ECDH_KDF_NONE                         1
+#define EVP_PKEY_ECDH_KDF_X9_62                                2
 
 /* BEGIN ERROR CODES */
 /* The following lines are auto generated by the script mkerr.pl. Any changes
 
 /* BEGIN ERROR CODES */
 /* The following lines are auto generated by the script mkerr.pl. Any changes
@@ -975,6 +1052,8 @@ void ERR_load_EC_strings(void);
 #define EC_F_D2I_ECPKPARAMETERS                                 145
 #define EC_F_D2I_ECPRIVATEKEY                           146
 #define EC_F_DO_EC_KEY_PRINT                            221
 #define EC_F_D2I_ECPKPARAMETERS                                 145
 #define EC_F_D2I_ECPRIVATEKEY                           146
 #define EC_F_DO_EC_KEY_PRINT                            221
+#define EC_F_ECDH_CMS_DECRYPT                           238
+#define EC_F_ECDH_CMS_SET_SHARED_INFO                   239
 #define EC_F_ECKEY_PARAM2TYPE                           223
 #define EC_F_ECKEY_PARAM_DECODE                                 212
 #define EC_F_ECKEY_PRIV_DECODE                          213
 #define EC_F_ECKEY_PARAM2TYPE                           223
 #define EC_F_ECKEY_PARAM_DECODE                                 212
 #define EC_F_ECKEY_PRIV_DECODE                          213
@@ -1133,6 +1212,7 @@ void ERR_load_EC_strings(void);
 #define EC_R_INVALID_PENTANOMIAL_BASIS                  132
 #define EC_R_INVALID_PRIVATE_KEY                        123
 #define EC_R_INVALID_TRINOMIAL_BASIS                    137
 #define EC_R_INVALID_PENTANOMIAL_BASIS                  132
 #define EC_R_INVALID_PRIVATE_KEY                        123
 #define EC_R_INVALID_TRINOMIAL_BASIS                    137
+#define EC_R_KDF_PARAMETER_ERROR                        148
 #define EC_R_KEYS_NOT_SET                               140
 #define EC_R_MISSING_PARAMETERS                                 124
 #define EC_R_MISSING_PRIVATE_KEY                        125
 #define EC_R_KEYS_NOT_SET                               140
 #define EC_R_MISSING_PARAMETERS                                 124
 #define EC_R_MISSING_PRIVATE_KEY                        125
@@ -1143,9 +1223,11 @@ void ERR_load_EC_strings(void);
 #define EC_R_NO_FIELD_MOD                               133
 #define EC_R_NO_PARAMETERS_SET                          139
 #define EC_R_PASSED_NULL_PARAMETER                      134
 #define EC_R_NO_FIELD_MOD                               133
 #define EC_R_NO_PARAMETERS_SET                          139
 #define EC_R_PASSED_NULL_PARAMETER                      134
+#define EC_R_PEER_KEY_ERROR                             149
 #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_PKPARAMETERS2GROUP_FAILURE                         127
 #define EC_R_POINT_AT_INFINITY                          106
 #define EC_R_POINT_IS_NOT_ON_CURVE                      107
+#define EC_R_SHARED_INFO_ERROR                          150
 #define EC_R_SLOT_FULL                                  108
 #define EC_R_UNDEFINED_GENERATOR                        113
 #define EC_R_UNDEFINED_ORDER                            128
 #define EC_R_SLOT_FULL                                  108
 #define EC_R_UNDEFINED_GENERATOR                        113
 #define EC_R_UNDEFINED_ORDER                            128