2 * Copyright 2019-2020 The OpenSSL Project Authors. All Rights Reserved.
4 * Licensed under the Apache License 2.0 (the "License"). You may not use
5 * this file except in compliance with the License. You can obtain a copy
6 * in the file LICENSE in the source distribution or at
7 * https://www.openssl.org/source/license.html
10 #include <openssl/provider.h>
11 #include <openssl/engine.h>
15 * References to the underlying cipher implementation. |cipher| caches
16 * the cipher, always. |alloc_cipher| only holds a reference to an
17 * explicitly fetched cipher.
19 const EVP_CIPHER *cipher; /* cipher */
20 EVP_CIPHER *alloc_cipher; /* fetched cipher */
22 /* Conditions for legacy EVP_CIPHER uses */
23 ENGINE *engine; /* cipher engine */
28 * References to the underlying digest implementation. |md| caches
29 * the digest, always. |alloc_md| only holds a reference to an explicitly
32 const EVP_MD *md; /* digest */
33 EVP_MD *alloc_md; /* fetched digest */
35 /* Conditions for legacy EVP_MD uses */
36 ENGINE *engine; /* digest engine */
39 /* Cipher functions */
41 * Load a cipher from the specified parameters with the specified context.
42 * The params "properties", "engine" and "cipher" are used to determine the
43 * implementation used. If a provider cannot be found, it falls back to trying
44 * non-provider based implementations.
46 int ossl_prov_cipher_load_from_params(PROV_CIPHER *pc,
47 const OSSL_PARAM params[],
50 /* Reset the PROV_CIPHER fields and free any allocated cipher reference */
51 void ossl_prov_cipher_reset(PROV_CIPHER *pc);
53 /* Clone a PROV_CIPHER structure into a second */
54 int ossl_prov_cipher_copy(PROV_CIPHER *dst, const PROV_CIPHER *src);
56 /* Query the cipher and associated engine (if any) */
57 const EVP_CIPHER *ossl_prov_cipher_cipher(const PROV_CIPHER *pc);
58 ENGINE *ossl_prov_cipher_engine(const PROV_CIPHER *pc);
60 /* Digest functions */
62 * Load a digest from the specified parameters with the specified context.
63 * The params "properties", "engine" and "digest" are used to determine the
64 * implementation used. If a provider cannot be found, it falls back to trying
65 * non-provider based implementations.
67 int ossl_prov_digest_load_from_params(PROV_DIGEST *pd,
68 const OSSL_PARAM params[],
71 /* Reset the PROV_DIGEST fields and free any allocated digest reference */
72 void ossl_prov_digest_reset(PROV_DIGEST *pd);
74 /* Clone a PROV_DIGEST structure into a second */
75 int ossl_prov_digest_copy(PROV_DIGEST *dst, const PROV_DIGEST *src);
77 /* Query the digest and associated engine (if any) */
78 const EVP_MD *ossl_prov_digest_md(const PROV_DIGEST *pd);
79 ENGINE *ossl_prov_digest_engine(const PROV_DIGEST *pd);
83 * Load an EVP_MAC_CTX* from the specified parameters with the specified
85 * The params "mac" and "properties" are used to determine the implementation
86 * used, and the parameters "digest", "cipher", "engine" and "properties" are
87 * passed to the MAC via the created MAC context if they are given.
88 * If there is already a created MAC context, it will be replaced if the "mac"
89 * parameter is found, otherwise it will simply be used as is, and passed the
90 * parameters to pilfer as it sees fit.
92 * As an option, a MAC name may be explicitly given, and if it is, the "mac"
93 * parameter will be ignored.
94 * Similarly, as an option, a cipher name or a digest name may be explicitly
95 * given, and if any of them is, the "digest" and "cipher" parameters are
98 int ossl_prov_macctx_load_from_params(EVP_MAC_CTX **macctx,
99 const OSSL_PARAM params[],
101 const char *ciphername,
105 typedef struct ag_capable_st {
107 int (*capable)(void);
108 } OSSL_ALGORITHM_CAPABLE;
111 * Dynamically select algorithms by calling a capable() method.
112 * If this method is NULL or the method returns 1 then the algorithm is added.
114 void ossl_prov_cache_exported_algorithms(const OSSL_ALGORITHM_CAPABLE *in,
115 OSSL_ALGORITHM *out);