|
|
- Providers
- =========
-
- - [Standard Providers](#standard-providers)
- - [The Default Provider](#the-default-provider)
- - [The Legacy Provider](#the-legacy-provider)
- - [The FIPS Provider](#the-fips-provider)
- - [The Base Provider](#the-base-provider)
- - [The Null Provider](#the-null-provider)
- - [Loading Providers](#loading-providers)
-
-
- Standard Providers
- ==================
-
- Providers are containers for algorithm implementations. Whenever a cryptographic
- algorithm is used via the high level APIs a provider is selected. It is that
- provider implementation that actually does the required work. There are five
- providers distributed with OpenSSL. In the future we expect third parties to
- distribute their own providers which can be added to OpenSSL dynamically.
- Documentation about writing providers is available on the [provider(7)]
- manual page.
-
- [provider(7)]: https://www.openssl.org/docs/manmaster/man7/provider.html
-
-
- The Default Provider
- --------------------
-
- The default provider collects together all of the standard built-in OpenSSL
- algorithm implementations. If an application doesn't specify anything else
- explicitly (e.g. in the application or via config), then this is the provider
- that will be used. It is loaded automatically the first time that we try to
- get an algorithm from a provider if no other provider has been loaded yet.
- If another provider has already been loaded then it won't be loaded
- automatically. Therefore if you want to use it in conjunction with other
- providers then you must load it explicitly.
-
- This is a "built-in" provider which means that it is compiled and linked
- into the libcrypto library and does not exist as a separate standalone module.
-
- The Legacy Provider
- -------------------
-
- The legacy provider is a collection of legacy algorithms that are either no
- longer in common use or considered insecure and strongly discouraged from use.
- However, some applications may need to use these algorithms for backwards
- compatibility reasons. This provider is **not** loaded by default.
- This may mean that some applications upgrading from earlier versions of OpenSSL
- may find that some algorithms are no longer available unless they load the
- legacy provider explicitly.
-
- Algorithms in the legacy provider include MD2, MD4, MDC2, RMD160, CAST5,
- BF (Blowfish), IDEA, SEED, RC2, RC4, RC5 and DES (but not 3DES).
-
- The FIPS Provider
- -----------------
-
- The FIPS provider contains a sub-set of the algorithm implementations available
- from the default provider, consisting of algorithms conforming to FIPS standards.
- It is intended that this provider will be FIPS140-2 validated.
-
- In some cases there may be minor behavioural differences between algorithm
- implementations in this provider compared to the equivalent algorithm in the
- default provider. This is typically in order to conform to FIPS standards.
-
- The Base Provider
- -----------------
-
- The base provider contains a small sub-set of non-cryptographic algorithms
- available in the default provider. For example, it contains algorithms to
- serialize and deserialize keys to files. If you do not load the default
- provider then you should always load this one instead (in particular, if
- you are using the FIPS provider).
-
- The Null Provider
- -----------------
-
- The null provider is "built-in" to libcrypto and contains no algorithm
- implementations. In order to guarantee that the default provider is not
- automatically loaded, the null provider can be loaded instead.
-
- This can be useful if you are using non-default library contexts and want
- to ensure that the default library context is never used unintentionally.
-
-
- Loading Providers
- =================
-
-
- Providers to be loaded can be specified in the OpenSSL config file.
- See the [config(5)] manual page for information about how to configure
- providers via the config file, and how to automatically activate them.
-
- [config(5)]: https://www.openssl.org/docs/manmaster/man5/config.html
-
- The following is a minimal config file example to load and activate both
- the legacy and the default provider in the default library context.
-
- openssl_conf = openssl_init
-
- [openssl_init]
- providers = provider_sect
-
- [provider_sect]
- default = default_sect
- legacy = legacy_sect
-
- [default_sect]
- activate = 1
-
- [legacy_sect]
- activate = 1
-
-
- It is also possible to load providers programmatically. For example you can
- load the legacy provider into the default library context as shown below.
- Note that once you have explicitly loaded a provider into the library context
- the default provider will no longer be automatically loaded. Therefore you will
- often also want to explicitly load the default provider, as is done here:
-
-
- #include <stdio.h>
- #include <stdlib.h>
-
- #include <openssl/provider.h>
-
- int main(void)
- {
- OSSL_PROVIDER *legacy;
- OSSL_PROVIDER *deflt;
-
- /* Load Multiple providers into the default (NULL) library context */
- legacy = OSSL_PROVIDER_load(NULL, "legacy");
- if (legacy == NULL) {
- printf("Failed to load Legacy provider\n");
- exit(EXIT_FAILURE);
- }
- deflt = OSSL_PROVIDER_load(NULL, "default");
- if (deflt == NULL) {
- printf("Failed to load Default provider\n");
- OSSL_PROVIDER_unload(legacy);
- exit(EXIT_FAILURE);
- }
-
- /* Rest of application */
-
- OSSL_PROVIDER_unload(legacy);
- OSSL_PROVIDER_unload(deflt);
- exit(EXIT_SUCCESS);
- }
|