Home | History | Annotate | Line # | Download | only in man7
      1 =pod
      2 
      3 =head1 NAME
      4 
      5 provider-asym_cipher - The asym_cipher library E<lt>-E<gt> provider functions
      6 
      7 =head1 SYNOPSIS
      8 
      9 =for openssl multiple includes
     10 
     11  #include <openssl/core_dispatch.h>
     12  #include <openssl/core_names.h>
     13 
     14  /*
     15   * None of these are actual functions, but are displayed like this for
     16   * the function signatures for functions that are offered as function
     17   * pointers in OSSL_DISPATCH arrays.
     18   */
     19 
     20  /* Context management */
     21  void *OSSL_FUNC_asym_cipher_newctx(void *provctx);
     22  void OSSL_FUNC_asym_cipher_freectx(void *ctx);
     23  void *OSSL_FUNC_asym_cipher_dupctx(void *ctx);
     24 
     25  /* Encryption */
     26  int OSSL_FUNC_asym_cipher_encrypt_init(void *ctx, void *provkey,
     27                                         const OSSL_PARAM params[]);
     28  int OSSL_FUNC_asym_cipher_encrypt(void *ctx, unsigned char *out, size_t *outlen,
     29                                    size_t outsize, const unsigned char *in,
     30                                    size_t inlen);
     31 
     32  /* Decryption */
     33  int OSSL_FUNC_asym_cipher_decrypt_init(void *ctx, void *provkey,
     34                                         const OSSL_PARAM params[]);
     35  int OSSL_FUNC_asym_cipher_decrypt(void *ctx, unsigned char *out, size_t *outlen,
     36                                    size_t outsize, const unsigned char *in,
     37                                    size_t inlen);
     38 
     39  /* Asymmetric Cipher parameters */
     40  int OSSL_FUNC_asym_cipher_get_ctx_params(void *ctx, OSSL_PARAM params[]);
     41  const OSSL_PARAM *OSSL_FUNC_asym_cipher_gettable_ctx_params(void *ctx, void *provctx);
     42  int OSSL_FUNC_asym_cipher_set_ctx_params(void *ctx, const OSSL_PARAM params[]);
     43  const OSSL_PARAM *OSSL_FUNC_asym_cipher_settable_ctx_params(void *ctx, void *provctx);
     44 
     45 =head1 DESCRIPTION
     46 
     47 This documentation is primarily aimed at provider authors. See L<provider(7)>
     48 for further information.
     49 
     50 The asymmetric cipher (OSSL_OP_ASYM_CIPHER) operation enables providers to
     51 implement asymmetric cipher algorithms and make them available to applications
     52 via the API functions L<EVP_PKEY_encrypt(3)>,
     53 L<EVP_PKEY_decrypt(3)> and
     54 other related functions).
     55 
     56 All "functions" mentioned here are passed as function pointers between
     57 F<libcrypto> and the provider in L<OSSL_DISPATCH(3)> arrays via
     58 L<OSSL_ALGORITHM(3)> arrays that are returned by the provider's
     59 provider_query_operation() function
     60 (see L<provider-base(7)/Provider Functions>).
     61 
     62 All these "functions" have a corresponding function type definition
     63 named B<OSSL_FUNC_{name}_fn>, and a helper function to retrieve the
     64 function pointer from an L<OSSL_DISPATCH(3)> element named
     65 B<OSSL_FUNC_{name}>.
     66 For example, the "function" OSSL_FUNC_asym_cipher_newctx() has these:
     67 
     68  typedef void *(OSSL_FUNC_asym_cipher_newctx_fn)(void *provctx);
     69  static ossl_inline OSSL_FUNC_asym_cipher_newctx_fn
     70      OSSL_FUNC_asym_cipher_newctx(const OSSL_DISPATCH *opf);
     71 
     72 L<OSSL_DISPATCH(3)> arrays are indexed by numbers that are provided as
     73 macros in L<openssl-core_dispatch.h(7)>, as follows:
     74 
     75  OSSL_FUNC_asym_cipher_newctx               OSSL_FUNC_ASYM_CIPHER_NEWCTX
     76  OSSL_FUNC_asym_cipher_freectx              OSSL_FUNC_ASYM_CIPHER_FREECTX
     77  OSSL_FUNC_asym_cipher_dupctx               OSSL_FUNC_ASYM_CIPHER_DUPCTX
     78 
     79  OSSL_FUNC_asym_cipher_encrypt_init         OSSL_FUNC_ASYM_CIPHER_ENCRYPT_INIT
     80  OSSL_FUNC_asym_cipher_encrypt              OSSL_FUNC_ASYM_CIPHER_ENCRYPT
     81 
     82  OSSL_FUNC_asym_cipher_decrypt_init         OSSL_FUNC_ASYM_CIPHER_DECRYPT_INIT
     83  OSSL_FUNC_asym_cipher_decrypt              OSSL_FUNC_ASYM_CIPHER_DECRYPT
     84 
     85  OSSL_FUNC_asym_cipher_get_ctx_params       OSSL_FUNC_ASYM_CIPHER_GET_CTX_PARAMS
     86  OSSL_FUNC_asym_cipher_gettable_ctx_params  OSSL_FUNC_ASYM_CIPHER_GETTABLE_CTX_PARAMS
     87  OSSL_FUNC_asym_cipher_set_ctx_params       OSSL_FUNC_ASYM_CIPHER_SET_CTX_PARAMS
     88  OSSL_FUNC_asym_cipher_settable_ctx_params  OSSL_FUNC_ASYM_CIPHER_SETTABLE_CTX_PARAMS
     89 
     90 An asymmetric cipher algorithm implementation may not implement all of these
     91 functions.
     92 In order to be a consistent set of functions a provider must implement
     93 OSSL_FUNC_asym_cipher_newctx and OSSL_FUNC_asym_cipher_freectx.
     94 It must also implement both of OSSL_FUNC_asym_cipher_encrypt_init and
     95 OSSL_FUNC_asym_cipher_encrypt, or both of OSSL_FUNC_asym_cipher_decrypt_init and
     96 OSSL_FUNC_asym_cipher_decrypt.
     97 OSSL_FUNC_asym_cipher_get_ctx_params is optional but if it is present then so must
     98 OSSL_FUNC_asym_cipher_gettable_ctx_params.
     99 Similarly, OSSL_FUNC_asym_cipher_set_ctx_params is optional but if it is present then
    100 so must OSSL_FUNC_asym_cipher_settable_ctx_params.
    101 
    102 An asymmetric cipher algorithm must also implement some mechanism for generating,
    103 loading or importing keys via the key management (OSSL_OP_KEYMGMT) operation.
    104 See L<provider-keymgmt(7)> for further details.
    105 
    106 =head2 Context Management Functions
    107 
    108 OSSL_FUNC_asym_cipher_newctx() should create and return a pointer to a provider side
    109 structure for holding context information during an asymmetric cipher operation.
    110 A pointer to this context will be passed back in a number of the other
    111 asymmetric cipher operation function calls.
    112 The parameter I<provctx> is the provider context generated during provider
    113 initialisation (see L<provider(7)>).
    114 
    115 OSSL_FUNC_asym_cipher_freectx() is passed a pointer to the provider side asymmetric
    116 cipher context in the I<ctx> parameter.
    117 This function should free any resources associated with that context.
    118 
    119 OSSL_FUNC_asym_cipher_dupctx() should duplicate the provider side asymmetric cipher
    120 context in the I<ctx> parameter and return the duplicate copy.
    121 
    122 =head2 Encryption Functions
    123 
    124 OSSL_FUNC_asym_cipher_encrypt_init() initialises a context for an asymmetric encryption
    125 given a provider side asymmetric cipher context in the I<ctx> parameter, and a
    126 pointer to a provider key object in the I<provkey> parameter.
    127 The I<params>, if not NULL, should be set on the context in a manner similar to
    128 using OSSL_FUNC_asym_cipher_set_ctx_params().
    129 The key object should have been previously generated, loaded or imported into
    130 the provider using the key management (OSSL_OP_KEYMGMT) operation (see L<provider-keymgmt(7)>).
    131 OSSL_FUNC_asym_cipher_encrypt() performs the actual encryption itself.
    132 A previously initialised asymmetric cipher context is passed in the I<ctx>
    133 parameter.
    134 The data to be encrypted is pointed to by the I<in> parameter which is I<inlen>
    135 bytes long.
    136 Unless I<out> is NULL, the encrypted data should be written to the location
    137 pointed to by the I<out> parameter and it should not exceed I<outsize> bytes in
    138 length.
    139 The length of the encrypted data should be written to I<*outlen>.
    140 If I<out> is NULL then the maximum length of the encrypted data should be
    141 written to I<*outlen>.
    142 
    143 =head2 Decryption Functions
    144 
    145 OSSL_FUNC_asym_cipher_decrypt_init() initialises a context for an asymmetric decryption
    146 given a provider side asymmetric cipher context in the I<ctx> parameter, and a
    147 pointer to a provider key object in the I<provkey> parameter.
    148 The I<params>, if not NULL, should be set on the context in a manner similar to
    149 using OSSL_FUNC_asym_cipher_set_ctx_params().
    150 The key object should have been previously generated, loaded or imported into
    151 the provider using the key management (OSSL_OP_KEYMGMT) operation (see
    152 L<provider-keymgmt(7)>).
    153 
    154 OSSL_FUNC_asym_cipher_decrypt() performs the actual decryption itself.
    155 A previously initialised asymmetric cipher context is passed in the I<ctx>
    156 parameter.
    157 The data to be decrypted is pointed to by the I<in> parameter which is I<inlen>
    158 bytes long.
    159 Unless I<out> is NULL, the decrypted data should be written to the location
    160 pointed to by the I<out> parameter and it should not exceed I<outsize> bytes in
    161 length.
    162 The length of the decrypted data should be written to I<*outlen>.
    163 If I<out> is NULL then the maximum length of the decrypted data should be
    164 written to I<*outlen>.
    165 
    166 =head2 Asymmetric Cipher Parameters
    167 
    168 See L<OSSL_PARAM(3)> for further details on the parameters structure used by
    169 the OSSL_FUNC_asym_cipher_get_ctx_params() and OSSL_FUNC_asym_cipher_set_ctx_params()
    170 functions.
    171 
    172 OSSL_FUNC_asym_cipher_get_ctx_params() gets asymmetric cipher parameters associated
    173 with the given provider side asymmetric cipher context I<ctx> and stores them in
    174 I<params>.
    175 Passing NULL for I<params> should return true.
    176 
    177 OSSL_FUNC_asym_cipher_set_ctx_params() sets the asymmetric cipher parameters associated
    178 with the given provider side asymmetric cipher context I<ctx> to I<params>.
    179 Any parameter settings are additional to any that were previously set.
    180 Passing NULL for I<params> should return true.
    181 
    182 Parameters currently recognised by built-in asymmetric cipher algorithms are as
    183 follows.
    184 Not all parameters are relevant to, or are understood by all asymmetric cipher
    185 algorithms:
    186 
    187 =over 4
    188 
    189 =item "pad-mode" (B<OSSL_ASYM_CIPHER_PARAM_PAD_MODE>) <UTF8 string> OR <integer>
    190 
    191 The type of padding to be used. The interpretation of this value will depend
    192 on the algorithm in use.
    193 
    194 =item "digest" (B<OSSL_ASYM_CIPHER_PARAM_OAEP_DIGEST>) <UTF8 string>
    195 
    196 Gets or sets the name of the OAEP digest algorithm used when OAEP padding is in
    197 use.
    198 
    199 =item "digest" (B<OSSL_ASYM_CIPHER_PARAM_DIGEST>) <UTF8 string>
    200 
    201 Gets or sets the name of the digest algorithm used by the algorithm (where
    202 applicable).
    203 
    204 =item "digest-props" (B<OSSL_ASYM_CIPHER_PARAM_OAEP_DIGEST_PROPS>) <UTF8 string>
    205 
    206 Gets or sets the properties to use when fetching the OAEP digest algorithm.
    207 
    208 =item "digest-props" (B<OSSL_ASYM_CIPHER_PARAM_DIGEST_PROPS>) <UTF8 string>
    209 
    210 Gets or sets the properties to use when fetching the cipher digest algorithm.
    211 
    212 =item "mgf1-digest" (B<OSSL_ASYM_CIPHER_PARAM_MGF1_DIGEST>) <UTF8 string>
    213 
    214 Gets or sets the name of the MGF1 digest algorithm used when OAEP or PSS padding
    215 is in use.
    216 
    217 =item "mgf1-digest-props" (B<OSSL_ASYM_CIPHER_PARAM_MGF1_DIGEST_PROPS>) <UTF8 string>
    218 
    219 Gets or sets the properties to use when fetching the MGF1 digest algorithm.
    220 
    221 =item "oaep-label" (B<OSSL_ASYM_CIPHER_PARAM_OAEP_LABEL>) <octet string ptr>
    222 
    223 Gets the OAEP label used when OAEP padding is in use.
    224 
    225 =item "oaep-label" (B<OSSL_ASYM_CIPHER_PARAM_OAEP_LABEL>) <octet string>
    226 
    227 Sets the OAEP label used when OAEP padding is in use.
    228 
    229 =item "tls-client-version" (B<OSSL_ASYM_CIPHER_PARAM_TLS_CLIENT_VERSION>) <unsigned integer>
    230 
    231 The TLS protocol version first requested by the client.
    232 
    233 =item "tls-negotiated-version" (B<OSSL_ASYM_CIPHER_PARAM_TLS_CLIENT_VERSION>) <unsigned integer>
    234 
    235 The negotiated TLS protocol version.
    236 
    237 =item "implicit-rejection" (B<OSSL_ASYM_CIPHER_PARAM_IMPLICIT_REJECTION>) <unsigned integer>
    238 
    239 Gets or sets the use of the implicit rejection mechanism for RSA PKCS#1 v1.5
    240 decryption. When set (non zero value), the decryption API will return
    241 a deterministically random value if the PKCS#1 v1.5 padding check fails.
    242 This makes exploitation of the Bleichenbacher significantly harder, even
    243 if the code using the RSA decryption API is not implemented in side-channel
    244 free manner. Set by default in OpenSSL providers.
    245 
    246 =back
    247 
    248 The OpenSSL FIPS provider also supports the following parameters:
    249 
    250 =over 4
    251 
    252 =item "fips-indicator" (B<OSSL_ASYM_CIPHER_PARAM_FIPS_APPROVED_INDICATOR>) <integer>
    253 
    254 A getter that returns 1 if the operation is FIPS approved, or 0 otherwise.
    255 This may be used after calling either OSSL_FUNC_asym_cipher_encrypt() or
    256 OSSL_FUNC_asym_cipher_decrypt(). It may return 0 if "key-check" is set to 0.
    257 
    258 =item "key-check" (B<OSSL_ASYM_CIPHER_PARAM_FIPS_KEY_CHECK>) <integer>
    259 
    260 If required this parameter should be set using either
    261 OSSL_FUNC_asym_cipher_encrypt_init() or OSSL_FUNC_asym_cipher_decrypt_init().
    262 The default value of 1 causes an error during the init if the key is not FIPS
    263 approved (e.g. The key has a security strength of less than 112 bits). Setting
    264 this to 0 will ignore the error and set the approved "fips-indicator" to 0.
    265 This option breaks FIPS compliance if it causes the approved "fips-indicator"
    266 to return 0.
    267 
    268 =back
    269 
    270 OSSL_FUNC_asym_cipher_gettable_ctx_params() and OSSL_FUNC_asym_cipher_settable_ctx_params()
    271 get a constant L<OSSL_PARAM(3)> array that describes the gettable and settable
    272 parameters, i.e. parameters that can be used with OSSL_FUNC_asym_cipherget_ctx_params()
    273 and OSSL_FUNC_asym_cipher_set_ctx_params() respectively.
    274 
    275 =head1 RETURN VALUES
    276 
    277 OSSL_FUNC_asym_cipher_newctx() and OSSL_FUNC_asym_cipher_dupctx() should return the newly
    278 created provider side asymmetric cipher context, or NULL on failure.
    279 
    280 All other functions should return 1 for success or 0 on error.
    281 
    282 =head1 SEE ALSO
    283 
    284 L<provider(7)>
    285 
    286 =head1 HISTORY
    287 
    288 The provider ASYM_CIPHER interface was introduced in OpenSSL 3.0.
    289 The Asymmetric Cipher Parameters "fips-indicator" and "key-check"
    290 were added in OpenSSL 3.4.
    291 
    292 =head1 COPYRIGHT
    293 
    294 Copyright 2019-2026 The OpenSSL Project Authors. All Rights Reserved.
    295 
    296 Licensed under the Apache License 2.0 (the "License").  You may not use
    297 this file except in compliance with the License.  You can obtain a copy
    298 in the file LICENSE in the source distribution or at
    299 L<https://www.openssl.org/source/license.html>.
    300 
    301 =cut
    302