X-Git-Url: https://git.openssl.org/gitweb/?p=openssl.git;a=blobdiff_plain;f=crypto%2Fevp%2Fevp_locl.h;h=fd684c4b4cfc950673b2de7183c95bdf9aab156c;hp=2453effe1d0f786314bd1d90872c617bebb9fe6f;hb=864b89ce497c57207d04a83e23f96f50dae9d164;hpb=b7c913c820a80f8534ead1dc49b569280fcb1f9a diff --git a/crypto/evp/evp_locl.h b/crypto/evp/evp_locl.h index 2453effe1d..fd684c4b4c 100644 --- a/crypto/evp/evp_locl.h +++ b/crypto/evp/evp_locl.h @@ -9,6 +9,11 @@ /* EVP_MD_CTX related stuff */ +#include + +#define EVP_CTRL_RET_UNSUPPORTED -1 + + struct evp_md_ctx_st { const EVP_MD *reqdigest; /* The original requested digest */ const EVP_MD *digest; @@ -44,18 +49,94 @@ struct evp_cipher_ctx_st { int final_used; int block_mask; unsigned char final[EVP_MAX_BLOCK_LENGTH]; /* possible final block */ + + /* Provider ctx */ + void *provctx; + EVP_CIPHER *fetched_cipher; } /* EVP_CIPHER_CTX */ ; struct evp_mac_ctx_st { - const EVP_MAC *meth; /* Method structure */ + EVP_MAC *meth; /* Method structure */ void *data; /* Individual method data */ } /* EVP_MAC_CTX */; struct evp_kdf_ctx_st { - const EVP_KDF_METHOD *kmeth; - EVP_KDF_IMPL *impl; /* Algorithm-specific data */ + EVP_KDF *meth; /* Method structure */ + void *data; /* Algorithm-specific data */ } /* EVP_KDF_CTX */ ; +struct evp_keymgmt_st { + int id; /* libcrypto internal */ + + char *name; + OSSL_PROVIDER *prov; + CRYPTO_REF_COUNT refcnt; + CRYPTO_RWLOCK *lock; + + /* Domain parameter routines */ + OSSL_OP_keymgmt_importdomparams_fn *importdomparams; + OSSL_OP_keymgmt_gendomparams_fn *gendomparams; + OSSL_OP_keymgmt_freedomparams_fn *freedomparams; + OSSL_OP_keymgmt_exportdomparams_fn *exportdomparams; + OSSL_OP_keymgmt_importdomparam_types_fn *importdomparam_types; + OSSL_OP_keymgmt_exportdomparam_types_fn *exportdomparam_types; + + /* Key routines */ + OSSL_OP_keymgmt_importkey_fn *importkey; + OSSL_OP_keymgmt_genkey_fn *genkey; + OSSL_OP_keymgmt_loadkey_fn *loadkey; + OSSL_OP_keymgmt_freekey_fn *freekey; + OSSL_OP_keymgmt_exportkey_fn *exportkey; + OSSL_OP_keymgmt_importkey_types_fn *importkey_types; + OSSL_OP_keymgmt_exportkey_types_fn *exportkey_types; +} /* EVP_KEYMGMT */ ; + +struct keymgmt_data_st { + OPENSSL_CTX *ctx; + const char *properties; +}; + +struct evp_keyexch_st { + char *name; + OSSL_PROVIDER *prov; + CRYPTO_REF_COUNT refcnt; + CRYPTO_RWLOCK *lock; + + EVP_KEYMGMT *keymgmt; + + OSSL_OP_keyexch_newctx_fn *newctx; + OSSL_OP_keyexch_init_fn *init; + OSSL_OP_keyexch_set_peer_fn *set_peer; + OSSL_OP_keyexch_derive_fn *derive; + OSSL_OP_keyexch_freectx_fn *freectx; + OSSL_OP_keyexch_dupctx_fn *dupctx; + OSSL_OP_keyexch_set_ctx_params_fn *set_ctx_params; + OSSL_OP_keyexch_settable_ctx_params_fn *settable_ctx_params; +} /* EVP_KEYEXCH */; + +struct evp_signature_st { + char *name; + OSSL_PROVIDER *prov; + CRYPTO_REF_COUNT refcnt; + CRYPTO_RWLOCK *lock; + + EVP_KEYMGMT *keymgmt; + + OSSL_OP_signature_newctx_fn *newctx; + OSSL_OP_signature_sign_init_fn *sign_init; + OSSL_OP_signature_sign_fn *sign; + OSSL_OP_signature_verify_init_fn *verify_init; + OSSL_OP_signature_verify_fn *verify; + OSSL_OP_signature_verify_recover_init_fn *verify_recover_init; + OSSL_OP_signature_verify_recover_fn *verify_recover; + OSSL_OP_signature_freectx_fn *freectx; + OSSL_OP_signature_dupctx_fn *dupctx; + OSSL_OP_signature_get_ctx_params_fn *get_ctx_params; + OSSL_OP_signature_gettable_ctx_params_fn *gettable_ctx_params; + OSSL_OP_signature_set_ctx_params_fn *set_ctx_params; + OSSL_OP_signature_settable_ctx_params_fn *settable_ctx_params; +} /* EVP_SIGNATURE */; + int PKCS5_v2_PBKDF2_keyivgen(EVP_CIPHER_CTX *ctx, const char *pass, int passlen, ASN1_TYPE *param, const EVP_CIPHER *c, const EVP_MD *md, @@ -87,7 +168,69 @@ int is_partially_overlapping(const void *ptr1, const void *ptr2, int len); void *evp_generic_fetch(OPENSSL_CTX *ctx, int operation_id, const char *algorithm, const char *properties, - void *(*new_method)(int nid, const OSSL_DISPATCH *fns, - OSSL_PROVIDER *prov), - int (*upref_method)(void *), + void *(*new_method)(const char *name, + const OSSL_DISPATCH *fns, + OSSL_PROVIDER *prov, + void *method_data), + void *method_data, + int (*up_ref_method)(void *), void (*free_method)(void *)); +void evp_generic_do_all(OPENSSL_CTX *libctx, int operation_id, + void (*user_fn)(void *method, void *arg), + void *user_arg, + void *(*new_method)(const char *name, + const OSSL_DISPATCH *fns, + OSSL_PROVIDER *prov, + void *method_data), + void *method_data, + void (*free_method)(void *)); + +/* Internal structure constructors for fetched methods */ +EVP_MD *evp_md_new(void); +EVP_CIPHER *evp_cipher_new(void); + +/* Helper functions to avoid duplicating code */ + +/* + * These methods implement different ways to pass a params array to the + * provider. They will return one of these values: + * + * -2 if the method doesn't come from a provider + * (evp_do_param will return this to the called) + * -1 if the provider doesn't offer the desired function + * (evp_do_param will raise an error and return 0) + * or the return value from the desired function + * (evp_do_param will return it to the caller) + */ +int evp_do_ciph_getparams(const EVP_CIPHER *ciph, OSSL_PARAM params[]); +int evp_do_ciph_ctx_getparams(const EVP_CIPHER *ciph, void *provctx, + OSSL_PARAM params[]); +int evp_do_ciph_ctx_setparams(const EVP_CIPHER *ciph, void *provctx, + OSSL_PARAM params[]); +int evp_do_md_getparams(const EVP_MD *md, OSSL_PARAM params[]); +int evp_do_md_ctx_getparams(const EVP_MD *md, void *provctx, + OSSL_PARAM params[]); +int evp_do_md_ctx_setparams(const EVP_MD *md, void *provctx, + OSSL_PARAM params[]); + +OSSL_PARAM *evp_pkey_to_param(EVP_PKEY *pkey, size_t *sz); + +#define M_check_autoarg(ctx, arg, arglen, err) \ + if (ctx->pmeth->flags & EVP_PKEY_FLAG_AUTOARGLEN) { \ + size_t pksize = (size_t)EVP_PKEY_size(ctx->pkey); \ + \ + if (pksize == 0) { \ + EVPerr(err, EVP_R_INVALID_KEY); /*ckerr_ignore*/ \ + return 0; \ + } \ + if (arg == NULL) { \ + *arglen = pksize; \ + return 1; \ + } \ + if (*arglen < pksize) { \ + EVPerr(err, EVP_R_BUFFER_TOO_SMALL); /*ckerr_ignore*/ \ + return 0; \ + } \ + } + +void evp_pkey_ctx_free_old_ops(EVP_PKEY_CTX *ctx);