| 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); |
| } |