/*
* Copyright 2015-2018 The OpenSSL Project Authors. All Rights Reserved.
*
- * Licensed under the OpenSSL license (the "License"). You may not use
+ * 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://www.openssl.org/source/license.html
*/
#include <openssl/evp.h>
+#include <openssl/core_numbers.h>
#include "internal/refcount.h"
/*
int pkey_id;
int flags;
int (*init) (EVP_PKEY_CTX *ctx);
- int (*copy) (EVP_PKEY_CTX *dst, EVP_PKEY_CTX *src);
+ int (*copy) (EVP_PKEY_CTX *dst, const EVP_PKEY_CTX *src);
void (*cleanup) (EVP_PKEY_CTX *ctx);
int (*paramgen_init) (EVP_PKEY_CTX *ctx);
int (*paramgen) (EVP_PKEY_CTX *ctx, EVP_PKEY *pkey);
extern const EVP_PKEY_METHOD poly1305_pkey_meth;
extern const EVP_PKEY_METHOD siphash_pkey_meth;
+/* struct evp_mac_impl_st is defined by the implementation */
+typedef struct evp_mac_impl_st EVP_MAC_IMPL;
+struct evp_mac_st {
+ int type;
+ EVP_MAC_IMPL *(*new) (void);
+ EVP_MAC_IMPL *(*dup) (const EVP_MAC_IMPL *macsrc);
+ void (*free) (EVP_MAC_IMPL *macctx);
+ size_t (*size) (EVP_MAC_IMPL *macctx);
+ int (*init) (EVP_MAC_IMPL *macctx);
+ int (*update) (EVP_MAC_IMPL *macctx, const unsigned char *data,
+ size_t datalen);
+ int (*final) (EVP_MAC_IMPL *macctx, unsigned char *out);
+ int (*ctrl) (EVP_MAC_IMPL *macctx, int cmd, va_list args);
+ int (*ctrl_str) (EVP_MAC_IMPL *macctx, const char *type, const char *value);
+};
+
+extern const EVP_MAC blake2b_mac_meth;
+extern const EVP_MAC blake2s_mac_meth;
+extern const EVP_MAC cmac_meth;
+extern const EVP_MAC gmac_meth;
+extern const EVP_MAC hmac_meth;
+extern const EVP_MAC kmac128_meth;
+extern const EVP_MAC kmac256_meth;
+extern const EVP_MAC siphash_meth;
+extern const EVP_MAC poly1305_meth;
+
+/* Internal keccak algorithms used for KMAC */
+const EVP_MD *evp_keccak_kmac128(void);
+const EVP_MD *evp_keccak_kmac256(void);
+
+/*
+ * This function is internal for now, but can be made external when needed.
+ * The documentation would read:
+ *
+ * EVP_add_mac() adds the MAC implementation C<mac> to the internal
+ * object database.
+ */
+int EVP_add_mac(const EVP_MAC *mac);
+int EVP_add_kdf(const EVP_KDF *kdf);
+
+/* struct evp_kdf_impl_st is defined by the implementation */
+typedef struct evp_kdf_impl_st EVP_KDF_IMPL;
+struct evp_kdf_st {
+ int type;
+ EVP_KDF_IMPL *(*new) (void);
+ void (*free) (EVP_KDF_IMPL *impl);
+ void (*reset) (EVP_KDF_IMPL *impl);
+ int (*ctrl) (EVP_KDF_IMPL *impl, int cmd, va_list args);
+ int (*ctrl_str) (EVP_KDF_IMPL *impl, const char *type, const char *value);
+ size_t (*size) (EVP_KDF_IMPL *impl);
+ int (*derive) (EVP_KDF_IMPL *impl, unsigned char *key, size_t keylen);
+};
+
+extern const EVP_KDF pbkdf2_kdf_meth;
+extern const EVP_KDF scrypt_kdf_meth;
+extern const EVP_KDF tls1_prf_kdf_meth;
+extern const EVP_KDF hkdf_kdf_meth;
+extern const EVP_KDF sshkdf_kdf_meth;
+extern const EVP_KDF ss_kdf_meth;
+extern const EVP_KDF x963_kdf_meth;
+
struct evp_md_st {
+ /* nid */
int type;
+
+ /* Legacy structure members */
+ /* TODO(3.0): Remove these */
int pkey_type;
int md_size;
unsigned long flags;
int ctx_size; /* how big does the ctx->md_data need to be */
/* control function */
int (*md_ctrl) (EVP_MD_CTX *ctx, int cmd, int p1, void *p2);
+
+ /* New structure members */
+ /* TODO(3.0): Remove above comment when legacy has gone */
+ OSSL_PROVIDER *prov;
+ CRYPTO_REF_COUNT refcnt;
+ CRYPTO_RWLOCK *lock;
+ OSSL_OP_digest_newctx_fn *newctx;
+ OSSL_OP_digest_init_fn *dinit;
+ OSSL_OP_digest_update_fn *dupdate;
+ OSSL_OP_digest_final_fn *dfinal;
+ OSSL_OP_digest_digest_fn *digest;
+ OSSL_OP_digest_freectx_fn *freectx;
+ OSSL_OP_digest_dupctx_fn *dupctx;
+ OSSL_OP_digest_size_fn *size;
+ OSSL_OP_digest_block_size_fn *dblock_size;
+ OSSL_OP_digest_set_params_fn *set_params;
+ OSSL_OP_digest_get_params_fn *get_params;
+
} /* EVP_MD */ ;
struct evp_cipher_st {
int nid;
+
int block_size;
/* Default value for variable length ciphers */
int key_len;
int iv_len;
+
+ /* Legacy structure members */
+ /* TODO(3.0): Remove these */
/* Various flags */
unsigned long flags;
/* init key */
int (*ctrl) (EVP_CIPHER_CTX *, int type, int arg, void *ptr);
/* Application data */
void *app_data;
+
+ /* New structure members */
+ /* TODO(3.0): Remove above comment when legacy has gone */
+ OSSL_PROVIDER *prov;
+ CRYPTO_REF_COUNT refcnt;
+ CRYPTO_RWLOCK *lock;
+ OSSL_OP_cipher_newctx_fn *newctx;
+ OSSL_OP_cipher_encrypt_init_fn *einit;
+ OSSL_OP_cipher_decrypt_init_fn *dinit;
+ OSSL_OP_cipher_update_fn *cupdate;
+ OSSL_OP_cipher_final_fn *cfinal;
+ OSSL_OP_cipher_cipher_fn *ccipher;
+ OSSL_OP_cipher_freectx_fn *freectx;
+ OSSL_OP_cipher_dupctx_fn *dupctx;
+ OSSL_OP_cipher_key_length_fn *key_length;
+ OSSL_OP_cipher_iv_length_fn *iv_length;
+ OSSL_OP_cipher_block_size_fn *blocksize;
+ OSSL_OP_cipher_get_params_fn *get_params;
+ OSSL_OP_cipher_ctx_get_params_fn *ctx_get_params;
+ OSSL_OP_cipher_ctx_set_params_fn *ctx_set_params;
} /* EVP_CIPHER */ ;
/* Macros to code block cipher wrappers */
void openssl_add_all_ciphers_int(void);
void openssl_add_all_digests_int(void);
+void openssl_add_all_macs_int(void);
+void openssl_add_all_kdfs_int(void);
void evp_cleanup_int(void);
void evp_app_cleanup_int(void);