=pod =head1 NAME OPENSSL_NO_DEPRECATED_3_1, OSSL_DEPRECATEDIN_3_1, OPENSSL_NO_DEPRECATED_3_0, OSSL_DEPRECATEDIN_3_0, OPENSSL_NO_DEPRECATED_1_1_1, OSSL_DEPRECATEDIN_1_1_1, OPENSSL_NO_DEPRECATED_1_1_0, OSSL_DEPRECATEDIN_1_1_0, OPENSSL_NO_DEPRECATED_1_0_2, OSSL_DEPRECATEDIN_1_0_2, OPENSSL_NO_DEPRECATED_1_0_1, OSSL_DEPRECATEDIN_1_0_1, OPENSSL_NO_DEPRECATED_1_0_0, OSSL_DEPRECATEDIN_1_0_0, OPENSSL_NO_DEPRECATED_0_9_8, OSSL_DEPRECATEDIN_0_9_8, deprecation - How to do deprecation =head1 DESCRIPTION Deprecation of a symbol is adding an attribute to the declaration of that symbol (function, type, variable, but we currently only do that for functions in our public header files, F<< >>). Removal of a symbol is not the same thing as deprecation, as it actually explicitly removes the symbol from public view. OpenSSL configuration supports deprecation as well as simulating removal of symbols from public view (with the configuration option C, or if the user chooses to do so, with L), and also supports doing this in terms of a specified OpenSSL version (with the configuration option C<--api>, or if the user chooses to do so, with L). Deprecation is done using attribute macros named B>, used with any declaration it applies to. Simulating removal is done with C<#ifndef> preprocessor guards using macros named B>. B> and B> are defined in F<< >>. In those macro names, B> corresponds to the OpenSSL release since which the deprecation applies, with underscores instead of periods. Because of the change in version scheme with OpenSSL 3.0, the B> for versions before that are three numbers (such as C<1_1_0>), while they are two numbers (such as C<3_0>) from 3.0 and on. The implementation of a deprecated symbol is kept for one of two reasons: =over 4 =item Planned to be removed The symbol and its implementation are planned to be removed some time in the future, but needs to remain available until that time. Such an implementation needs to be guarded appropriately, as shown in L below. =item Planned to remain internally The symbol is planned to be removed from public view, but will otherwise remain for internal purposes. In this case, the implementation doesn't need to change or be guarded. However, it's necessary to ensure that the declaration remains available for the translation unit where the symbol is used or implemented, even when the symbol is publicly unavailable through simulated removal. That's done by including an internal header file very early in the affected translation units. See L below. In the future, when the deprecated declaration is to actually be removed from public view, it should be moved to an internal header file, with the deprecation attribute removed, and the translation units that implement or use that symbol should adjust their header inclusions accordingly. =back =head1 EXAMPLES =head2 Header files In public header files (F<< >>), this is what a deprecation is expected to look like, including the preprocessor wrapping for simulated removal: # ifndef OPENSSL_NO_DEPRECATED_3_0 /* ... */ OSSL_DEPRECATEDIN_3_0 RSA *RSA_new_method(ENGINE *engine); /* ... */ # endif =head2 Implementations to be removed For a deprecated function that we plan to remove in the future, for example RSA_new_method(), the following should be found very early (before including any OpenSSL header file) in the translation unit that implements it and in any translation unit that uses it: /* * Suppress deprecation warnings for RSA low level implementations that are * kept until removal. */ #define OPENSSL_SUPPRESS_DEPRECATED The RSA_new_method() implementation itself must be guarded the same way as its declaration in the public header file is: #ifndef OPENSSL_NO_DEPRECATED_3_0 RSA *RSA_new_method(ENGINE *engine) { /* ... */ } #endif =head2 Implementations to remain internally For a deprecated function that we plan to keep internally, for example RSA_size(), the following should be found very early (before including any other OpenSSL header file) in the translation unit that implements it and in any translation unit that uses it: /* * RSA low level APIs are deprecated for public use, but are kept for * internal use. */ #include "internal/deprecated.h" =head1 SEE ALSO L =head1 COPYRIGHT Copyright 2020-2021 The OpenSSL Project Authors. All Rights Reserved. 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 L. =cut