| 
									
										
										
										
											2019-07-25 18:55:00 +08:00
										 |  |  | =pod | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | =head1 NAME | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | provider-cipher - The cipher library E<lt>-E<gt> provider functions | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | =head1 SYNOPSIS | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | =for comment multiple includes | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |  #include <openssl/core_numbers.h> | 
					
						
							|  |  |  |  #include <openssl/core_names.h> | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |  /* | 
					
						
							|  |  |  |   * None of these are actual functions, but are displayed like this for | 
					
						
							|  |  |  |   * the function signatures for functions that are offered as function | 
					
						
							|  |  |  |   * pointers in OSSL_DISPATCH arrays. | 
					
						
							|  |  |  |   */ | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |  /* Context management */ | 
					
						
							|  |  |  |  void *OP_cipher_newctx(void *provctx); | 
					
						
							|  |  |  |  void OP_cipher_freectx(void *cctx); | 
					
						
							|  |  |  |  void *OP_cipher_dupctx(void *cctx); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |  /* Encryption/decryption */ | 
					
						
							|  |  |  |  int OP_cipher_encrypt_init(void *cctx, const unsigned char *key, | 
					
						
							|  |  |  |                             size_t keylen, const unsigned char *iv, | 
					
						
							|  |  |  |                             size_t ivlen); | 
					
						
							|  |  |  |  int OP_cipher_decrypt_init(void *cctx, const unsigned char *key, | 
					
						
							|  |  |  |                             size_t keylen, const unsigned char *iv, | 
					
						
							|  |  |  |                             size_t ivlen); | 
					
						
							|  |  |  |  int OP_cipher_update(void *cctx, unsigned char *out, size_t *outl, | 
					
						
							|  |  |  |                       size_t outsize, const unsigned char *in, size_t inl); | 
					
						
							|  |  |  |  int OP_cipher_final(void *cctx, unsigned char *out, size_t *outl, | 
					
						
							|  |  |  |                      size_t outsize); | 
					
						
							|  |  |  |  int OP_cipher_cipher(void *cctx, unsigned char *out, size_t *outl, | 
					
						
							|  |  |  |                       size_t outsize, const unsigned char *in, size_t inl); | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
											
												Add missing EVP param utility functions
These functions were missing for a completes API:
EVP_MD_get_params(), EVP_CIPHER_get_params(), EVP_CIPHER_CTX_set_params(),
and EVP_CIPHER_CTX_get_params
Additionally, we also add all the corresponding parameter descriptor
returning functions, along the correspoding provider dispatches:
EVP_MD_gettable_params(), EVP_MD_CTX_settable_params(),
EVP_MD_CTX_gettable_params(), EVP_CIPHER_gettable_params(),
EVP_CIPHER_CTX_settable_params(), and EVP_CIPHER_CTX_gettable_params()
Reviewed-by: Matt Caswell <matt@openssl.org>
Reviewed-by: Shane Lontis <shane.lontis@oracle.com>
(Merged from https://github.com/openssl/openssl/pull/9576)
											
										 
											2019-08-12 20:56:18 +08:00
										 |  |  |  /* Cipher parameter descriptors */ | 
					
						
							|  |  |  |  const OSSL_PARAM *OP_cipher_gettable_params(void); | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2019-09-05 09:23:57 +08:00
										 |  |  |  /* Cipher operation parameter descriptors */ | 
					
						
							| 
									
										
										
											
												Add missing EVP param utility functions
These functions were missing for a completes API:
EVP_MD_get_params(), EVP_CIPHER_get_params(), EVP_CIPHER_CTX_set_params(),
and EVP_CIPHER_CTX_get_params
Additionally, we also add all the corresponding parameter descriptor
returning functions, along the correspoding provider dispatches:
EVP_MD_gettable_params(), EVP_MD_CTX_settable_params(),
EVP_MD_CTX_gettable_params(), EVP_CIPHER_gettable_params(),
EVP_CIPHER_CTX_settable_params(), and EVP_CIPHER_CTX_gettable_params()
Reviewed-by: Matt Caswell <matt@openssl.org>
Reviewed-by: Shane Lontis <shane.lontis@oracle.com>
(Merged from https://github.com/openssl/openssl/pull/9576)
											
										 
											2019-08-12 20:56:18 +08:00
										 |  |  |  const OSSL_PARAM *OP_cipher_gettable_ctx_params(void); | 
					
						
							|  |  |  |  const OSSL_PARAM *OP_cipher_settable_ctx_params(void); | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2019-07-25 18:55:00 +08:00
										 |  |  |  /* Cipher parameters */ | 
					
						
							|  |  |  |  int OP_cipher_get_params(OSSL_PARAM params[]); | 
					
						
							| 
									
										
										
											
												Add missing EVP param utility functions
These functions were missing for a completes API:
EVP_MD_get_params(), EVP_CIPHER_get_params(), EVP_CIPHER_CTX_set_params(),
and EVP_CIPHER_CTX_get_params
Additionally, we also add all the corresponding parameter descriptor
returning functions, along the correspoding provider dispatches:
EVP_MD_gettable_params(), EVP_MD_CTX_settable_params(),
EVP_MD_CTX_gettable_params(), EVP_CIPHER_gettable_params(),
EVP_CIPHER_CTX_settable_params(), and EVP_CIPHER_CTX_gettable_params()
Reviewed-by: Matt Caswell <matt@openssl.org>
Reviewed-by: Shane Lontis <shane.lontis@oracle.com>
(Merged from https://github.com/openssl/openssl/pull/9576)
											
										 
											2019-08-12 20:56:18 +08:00
										 |  |  | 
 | 
					
						
							|  |  |  |  /* Cipher operation parameters */ | 
					
						
							| 
									
										
										
										
											2019-08-16 15:04:29 +08:00
										 |  |  |  int OP_cipher_get_ctx_params(void *cctx, OSSL_PARAM params[]); | 
					
						
							|  |  |  |  int OP_cipher_set_ctx_params(void *cctx, const OSSL_PARAM params[]); | 
					
						
							| 
									
										
										
										
											2019-07-25 18:55:00 +08:00
										 |  |  | 
 | 
					
						
							|  |  |  | =head1 DESCRIPTION | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | This documentation is primarily aimed at provider authors. See L<provider(7)> | 
					
						
							|  |  |  | for further information. | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | The CIPHER operation enables providers to implement cipher algorithms and make | 
					
						
							|  |  |  | them available to applications via the API functions L<EVP_EncryptInit_ex(3)>, | 
					
						
							|  |  |  | L<EVP_EncryptUpdate(3)> and L<EVP_EncryptFinal(3)> (as well as the decrypt | 
					
						
							|  |  |  | equivalents and other related functions). | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | All "functions" mentioned here are passed as function pointers between | 
					
						
							|  |  |  | F<libcrypto> and the provider in B<OSSL_DISPATCH> arrays via | 
					
						
							|  |  |  | B<OSSL_ALGORITHM> arrays that are returned by the provider's | 
					
						
							|  |  |  | provider_query_operation() function | 
					
						
							|  |  |  | (see L<provider-base(7)/Provider Functions>). | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | All these "functions" have a corresponding function type definition | 
					
						
							|  |  |  | named B<OSSL_{name}_fn>, and a helper function to retrieve the | 
					
						
							|  |  |  | function pointer from an B<OSSL_DISPATCH> element named | 
					
						
							|  |  |  | B<OSSL_get_{name}>. | 
					
						
							|  |  |  | For example, the "function" OP_cipher_newctx() has these: | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |  typedef void *(OSSL_OP_cipher_newctx_fn)(void *provctx); | 
					
						
							|  |  |  |  static ossl_inline OSSL_OP_cipher_newctx_fn | 
					
						
							|  |  |  |      OSSL_get_OP_cipher_newctx(const OSSL_DISPATCH *opf); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | B<OSSL_DISPATCH> arrays are indexed by numbers that are provided as | 
					
						
							|  |  |  | macros in L<openssl-core_numbers.h(7)>, as follows: | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
											
												Add missing EVP param utility functions
These functions were missing for a completes API:
EVP_MD_get_params(), EVP_CIPHER_get_params(), EVP_CIPHER_CTX_set_params(),
and EVP_CIPHER_CTX_get_params
Additionally, we also add all the corresponding parameter descriptor
returning functions, along the correspoding provider dispatches:
EVP_MD_gettable_params(), EVP_MD_CTX_settable_params(),
EVP_MD_CTX_gettable_params(), EVP_CIPHER_gettable_params(),
EVP_CIPHER_CTX_settable_params(), and EVP_CIPHER_CTX_gettable_params()
Reviewed-by: Matt Caswell <matt@openssl.org>
Reviewed-by: Shane Lontis <shane.lontis@oracle.com>
(Merged from https://github.com/openssl/openssl/pull/9576)
											
										 
											2019-08-12 20:56:18 +08:00
										 |  |  |  OP_cipher_newctx               OSSL_FUNC_CIPHER_NEWCTX | 
					
						
							|  |  |  |  OP_cipher_freectx              OSSL_FUNC_CIPHER_FREECTX | 
					
						
							|  |  |  |  OP_cipher_dupctx               OSSL_FUNC_CIPHER_DUPCTX | 
					
						
							| 
									
										
										
										
											2019-07-25 18:55:00 +08:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
											
												Add missing EVP param utility functions
These functions were missing for a completes API:
EVP_MD_get_params(), EVP_CIPHER_get_params(), EVP_CIPHER_CTX_set_params(),
and EVP_CIPHER_CTX_get_params
Additionally, we also add all the corresponding parameter descriptor
returning functions, along the correspoding provider dispatches:
EVP_MD_gettable_params(), EVP_MD_CTX_settable_params(),
EVP_MD_CTX_gettable_params(), EVP_CIPHER_gettable_params(),
EVP_CIPHER_CTX_settable_params(), and EVP_CIPHER_CTX_gettable_params()
Reviewed-by: Matt Caswell <matt@openssl.org>
Reviewed-by: Shane Lontis <shane.lontis@oracle.com>
(Merged from https://github.com/openssl/openssl/pull/9576)
											
										 
											2019-08-12 20:56:18 +08:00
										 |  |  |  OP_cipher_encrypt_init         OSSL_FUNC_CIPHER_ENCRYPT_INIT | 
					
						
							|  |  |  |  OP_cipher_decrypt_init         OSSL_FUNC_CIPHER_DECRYPT_INIT | 
					
						
							|  |  |  |  OP_cipher_update               OSSL_FUNC_CIPHER_UPDATE | 
					
						
							|  |  |  |  OP_cipher_final                OSSL_FUNC_CIPHER_FINAL | 
					
						
							|  |  |  |  OP_cipher_cipher               OSSL_FUNC_CIPHER_CIPHER | 
					
						
							| 
									
										
										
										
											2019-07-25 18:55:00 +08:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
											
												Add missing EVP param utility functions
These functions were missing for a completes API:
EVP_MD_get_params(), EVP_CIPHER_get_params(), EVP_CIPHER_CTX_set_params(),
and EVP_CIPHER_CTX_get_params
Additionally, we also add all the corresponding parameter descriptor
returning functions, along the correspoding provider dispatches:
EVP_MD_gettable_params(), EVP_MD_CTX_settable_params(),
EVP_MD_CTX_gettable_params(), EVP_CIPHER_gettable_params(),
EVP_CIPHER_CTX_settable_params(), and EVP_CIPHER_CTX_gettable_params()
Reviewed-by: Matt Caswell <matt@openssl.org>
Reviewed-by: Shane Lontis <shane.lontis@oracle.com>
(Merged from https://github.com/openssl/openssl/pull/9576)
											
										 
											2019-08-12 20:56:18 +08:00
										 |  |  |  OP_cipher_get_params           OSSL_FUNC_CIPHER_GET_PARAMS | 
					
						
							| 
									
										
										
										
											2019-08-16 15:04:29 +08:00
										 |  |  |  OP_cipher_get_ctx_params       OSSL_FUNC_CIPHER_GET_CTX_PARAMS | 
					
						
							|  |  |  |  OP_cipher_set_ctx_params       OSSL_FUNC_CIPHER_SET_CTX_PARAMS | 
					
						
							| 
									
										
										
											
												Add missing EVP param utility functions
These functions were missing for a completes API:
EVP_MD_get_params(), EVP_CIPHER_get_params(), EVP_CIPHER_CTX_set_params(),
and EVP_CIPHER_CTX_get_params
Additionally, we also add all the corresponding parameter descriptor
returning functions, along the correspoding provider dispatches:
EVP_MD_gettable_params(), EVP_MD_CTX_settable_params(),
EVP_MD_CTX_gettable_params(), EVP_CIPHER_gettable_params(),
EVP_CIPHER_CTX_settable_params(), and EVP_CIPHER_CTX_gettable_params()
Reviewed-by: Matt Caswell <matt@openssl.org>
Reviewed-by: Shane Lontis <shane.lontis@oracle.com>
(Merged from https://github.com/openssl/openssl/pull/9576)
											
										 
											2019-08-12 20:56:18 +08:00
										 |  |  | 
 | 
					
						
							|  |  |  |  OP_cipher_gettable_params      OSSL_FUNC_CIPHER_GETTABLE_PARAMS | 
					
						
							|  |  |  |  OP_cipher_gettable_ctx_params  OSSL_FUNC_CIPHER_GETTABLE_CTX_PARAMS | 
					
						
							|  |  |  |  OP_cipher_settable_ctx_params  OSSL_FUNC_CIPHER_SETTABLE_CTX_PARAMS | 
					
						
							| 
									
										
										
										
											2019-07-25 18:55:00 +08:00
										 |  |  | 
 | 
					
						
							|  |  |  | A cipher algorithm implementation may not implement all of these functions. | 
					
						
							|  |  |  | In order to be a consistent set of functions there must at least be a complete | 
					
						
							|  |  |  | set of "encrypt" functions, or a complete set of "decrypt" functions, or a | 
					
						
							|  |  |  | single "cipher" function. | 
					
						
							|  |  |  | In all cases both the OP_cipher_newctx and OP_cipher_freectx functions must be | 
					
						
							|  |  |  | present. | 
					
						
							|  |  |  | All other functions are optional. | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | =head2 Context Management Functions | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | OP_cipher_newctx() should create and return a pointer to a provider side | 
					
						
							|  |  |  | structure for holding context information during a cipher operation. | 
					
						
							|  |  |  | A pointer to this context will be passed back in a number of the other cipher | 
					
						
							|  |  |  | operation function calls. | 
					
						
							| 
									
										
										
										
											2019-09-27 19:26:22 +08:00
										 |  |  | The parameter I<provctx> is the provider context generated during provider | 
					
						
							| 
									
										
										
										
											2019-07-25 18:55:00 +08:00
										 |  |  | initialisation (see L<provider(3)>). | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | OP_cipher_freectx() is passed a pointer to the provider side cipher context in | 
					
						
							| 
									
										
										
										
											2019-09-27 19:26:22 +08:00
										 |  |  | the I<cctx> parameter. | 
					
						
							| 
									
										
										
										
											2019-07-25 18:55:00 +08:00
										 |  |  | This function should free any resources associated with that context. | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | OP_cipher_dupctx() should duplicate the provider side cipher context in the | 
					
						
							| 
									
										
										
										
											2019-09-27 19:26:22 +08:00
										 |  |  | I<cctx> parameter and return the duplicate copy. | 
					
						
							| 
									
										
										
										
											2019-07-25 18:55:00 +08:00
										 |  |  | 
 | 
					
						
							|  |  |  | =head2 Encryption/Decryption Functions | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | OP_cipher_encrypt_init() initialises a cipher operation for encryption given a | 
					
						
							| 
									
										
										
										
											2019-09-27 19:26:22 +08:00
										 |  |  | newly created provider side cipher context in the I<cctx> parameter. | 
					
						
							|  |  |  | The key to be used is given in I<key> which is I<keylen> bytes long. | 
					
						
							|  |  |  | The IV to be used is given in I<iv> which is I<ivlen> bytes long. | 
					
						
							| 
									
										
										
										
											2019-07-25 18:55:00 +08:00
										 |  |  | 
 | 
					
						
							|  |  |  | OP_cipher_decrypt_init() is the same as OP_cipher_encrypt_init() except that it | 
					
						
							|  |  |  | initialises the context for a decryption operation. | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | OP_cipher_update() is called to supply data to be encrypted/decrypted as part of | 
					
						
							|  |  |  | a previously initialised cipher operation. | 
					
						
							| 
									
										
										
										
											2019-09-27 19:26:22 +08:00
										 |  |  | The I<cctx> parameter contains a pointer to a previously initialised provider | 
					
						
							| 
									
										
										
										
											2019-07-25 18:55:00 +08:00
										 |  |  | side context. | 
					
						
							| 
									
										
										
										
											2019-09-27 19:26:22 +08:00
										 |  |  | OP_cipher_update() should encrypt/decrypt I<inl> bytes of data at the location | 
					
						
							|  |  |  | pointed to by I<in>. | 
					
						
							|  |  |  | The encrypted data should be stored in I<out> and the amount of data written to | 
					
						
							|  |  |  | I<*outl> which should not exceed I<outsize> bytes. | 
					
						
							| 
									
										
										
										
											2019-07-25 18:55:00 +08:00
										 |  |  | OP_cipher_update() may be called multiple times for a single cipher operation. | 
					
						
							|  |  |  | It is the responsibility of the cipher implementation to handle input lengths | 
					
						
							|  |  |  | that are not multiples of the block length. | 
					
						
							|  |  |  | In such cases a cipher implementation will typically cache partial blocks of | 
					
						
							|  |  |  | input data until a complete block is obtained. | 
					
						
							| 
									
										
										
										
											2019-09-27 19:26:22 +08:00
										 |  |  | I<out> may be the same location as I<in> but it should not partially overlap. | 
					
						
							|  |  |  | The same expectations apply to I<outsize> as documented for | 
					
						
							| 
									
										
										
										
											2019-07-25 18:55:00 +08:00
										 |  |  | L<EVP_EncryptUpdate(3)> and L<EVP_DecryptUpdate(3)>. | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | OP_cipher_final() completes an encryption or decryption started through previous | 
					
						
							|  |  |  | OP_cipher_encrypt_init() or OP_cipher_decrypt_init(), and OP_cipher_update() | 
					
						
							|  |  |  | calls. | 
					
						
							| 
									
										
										
										
											2019-09-27 19:26:22 +08:00
										 |  |  | The I<cctx> parameter contains a pointer to the provider side context. | 
					
						
							|  |  |  | Any final encryption/decryption output should be written to I<out> and the | 
					
						
							|  |  |  | amount of data written to I<*outl> which should not exceed I<outsize> bytes. | 
					
						
							|  |  |  | The same expectations apply to I<outsize> as documented for | 
					
						
							| 
									
										
										
										
											2019-07-25 18:55:00 +08:00
										 |  |  | L<EVP_EncryptFinal(3)> and L<EVP_DecryptFinal(3)>. | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | OP_cipher_cipher() performs encryption/decryption using the provider side cipher | 
					
						
							| 
									
										
										
										
											2019-09-27 19:26:22 +08:00
										 |  |  | context in the I<cctx> parameter that should have been previously initialised via | 
					
						
							| 
									
										
										
										
											2019-07-25 18:55:00 +08:00
										 |  |  | a call to OP_cipher_encrypt_init() or OP_cipher_decrypt_init. | 
					
						
							|  |  |  | This should call the raw underlying cipher function without any padding. | 
					
						
							|  |  |  | This will be invoked in the provider as a result of the application calling | 
					
						
							|  |  |  | L<EVP_Cipher(3)>. | 
					
						
							|  |  |  | The application is responsible for ensuring that the input is a multiple of the | 
					
						
							|  |  |  | block length. | 
					
						
							| 
									
										
										
										
											2019-09-27 19:26:22 +08:00
										 |  |  | The data to be encrypted/decrypted will be in I<in>, and it will be I<inl> bytes | 
					
						
							| 
									
										
										
										
											2019-07-25 18:55:00 +08:00
										 |  |  | in length. | 
					
						
							| 
									
										
										
										
											2019-09-27 19:26:22 +08:00
										 |  |  | The output from the encryption/decryption should be stored in I<out> and the | 
					
						
							|  |  |  | amount of data stored should be put in I<*outl> which should be no more than | 
					
						
							|  |  |  | I<outsize> bytes. | 
					
						
							| 
									
										
										
										
											2019-07-25 18:55:00 +08:00
										 |  |  | 
 | 
					
						
							|  |  |  | =head2 Cipher Parameters | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | See L<OSSL_PARAM(3)> for further details on the parameters structure used by | 
					
						
							|  |  |  | these functions. | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
											
												Add missing EVP param utility functions
These functions were missing for a completes API:
EVP_MD_get_params(), EVP_CIPHER_get_params(), EVP_CIPHER_CTX_set_params(),
and EVP_CIPHER_CTX_get_params
Additionally, we also add all the corresponding parameter descriptor
returning functions, along the correspoding provider dispatches:
EVP_MD_gettable_params(), EVP_MD_CTX_settable_params(),
EVP_MD_CTX_gettable_params(), EVP_CIPHER_gettable_params(),
EVP_CIPHER_CTX_settable_params(), and EVP_CIPHER_CTX_gettable_params()
Reviewed-by: Matt Caswell <matt@openssl.org>
Reviewed-by: Shane Lontis <shane.lontis@oracle.com>
(Merged from https://github.com/openssl/openssl/pull/9576)
											
										 
											2019-08-12 20:56:18 +08:00
										 |  |  | OP_cipher_get_params() gets details of the algorithm implementation | 
					
						
							| 
									
										
										
										
											2019-09-27 19:26:22 +08:00
										 |  |  | and stores them in I<params>. | 
					
						
							| 
									
										
										
										
											2019-07-25 18:55:00 +08:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2019-08-16 15:04:29 +08:00
										 |  |  | OP_cipher_set_ctx_params() sets cipher operation parameters for the | 
					
						
							| 
									
										
										
										
											2019-09-27 19:26:22 +08:00
										 |  |  | provider side cipher context I<cctx> to I<params>. | 
					
						
							| 
									
										
										
										
											2019-07-25 18:55:00 +08:00
										 |  |  | Any parameter settings are additional to any that were previously set. | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2019-08-16 15:04:29 +08:00
										 |  |  | OP_cipher_get_ctx_params() gets cipher operation details details from | 
					
						
							| 
									
										
										
										
											2019-09-27 19:26:22 +08:00
										 |  |  | the given provider side cipher context I<cctx> and stores them in I<params>. | 
					
						
							| 
									
										
										
											
												Add missing EVP param utility functions
These functions were missing for a completes API:
EVP_MD_get_params(), EVP_CIPHER_get_params(), EVP_CIPHER_CTX_set_params(),
and EVP_CIPHER_CTX_get_params
Additionally, we also add all the corresponding parameter descriptor
returning functions, along the correspoding provider dispatches:
EVP_MD_gettable_params(), EVP_MD_CTX_settable_params(),
EVP_MD_CTX_gettable_params(), EVP_CIPHER_gettable_params(),
EVP_CIPHER_CTX_settable_params(), and EVP_CIPHER_CTX_gettable_params()
Reviewed-by: Matt Caswell <matt@openssl.org>
Reviewed-by: Shane Lontis <shane.lontis@oracle.com>
(Merged from https://github.com/openssl/openssl/pull/9576)
											
										 
											2019-08-12 20:56:18 +08:00
										 |  |  | 
 | 
					
						
							|  |  |  | OP_cipher_gettable_params(), OP_cipher_gettable_ctx_params(), and | 
					
						
							|  |  |  | OP_cipher_settable_ctx_params() all return constant B<OSSL_PARAM> arrays | 
					
						
							|  |  |  | as descriptors of the parameters that OP_cipher_get_params(), | 
					
						
							| 
									
										
										
										
											2019-08-16 15:04:29 +08:00
										 |  |  | OP_cipher_get_ctx_params(), and OP_cipher_set_ctx_params() can handle, | 
					
						
							| 
									
										
										
											
												Add missing EVP param utility functions
These functions were missing for a completes API:
EVP_MD_get_params(), EVP_CIPHER_get_params(), EVP_CIPHER_CTX_set_params(),
and EVP_CIPHER_CTX_get_params
Additionally, we also add all the corresponding parameter descriptor
returning functions, along the correspoding provider dispatches:
EVP_MD_gettable_params(), EVP_MD_CTX_settable_params(),
EVP_MD_CTX_gettable_params(), EVP_CIPHER_gettable_params(),
EVP_CIPHER_CTX_settable_params(), and EVP_CIPHER_CTX_gettable_params()
Reviewed-by: Matt Caswell <matt@openssl.org>
Reviewed-by: Shane Lontis <shane.lontis@oracle.com>
(Merged from https://github.com/openssl/openssl/pull/9576)
											
										 
											2019-08-12 20:56:18 +08:00
										 |  |  | respectively. | 
					
						
							| 
									
										
										
										
											2019-07-25 18:55:00 +08:00
										 |  |  | 
 | 
					
						
							|  |  |  | Parameters currently recognised by built-in ciphers are as follows. Not all | 
					
						
							|  |  |  | parameters are relevant to, or are understood by all ciphers: | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | =over 4 | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2019-09-10 16:05:57 +08:00
										 |  |  | =item "padding" (B<OSSL_CIPHER_PARAM_PADDING>) <unsigned integer> | 
					
						
							| 
									
										
										
										
											2019-07-25 18:55:00 +08:00
										 |  |  | 
 | 
					
						
							|  |  |  | Sets the padding mode for the associated cipher ctx. | 
					
						
							|  |  |  | Setting a value of 1 will turn padding on. | 
					
						
							| 
									
										
										
										
											2019-09-05 09:23:57 +08:00
										 |  |  | Setting a value of 0 will turn padding off. | 
					
						
							| 
									
										
										
										
											2019-07-25 18:55:00 +08:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2019-09-10 16:05:57 +08:00
										 |  |  | =item "mode" (B<OSSL_CIPHER_PARAM_MODE>) <unsigned integer> | 
					
						
							| 
									
										
										
										
											2019-07-25 18:55:00 +08:00
										 |  |  | 
 | 
					
						
							|  |  |  | Gets the mode for the associated cipher algorithm. | 
					
						
							|  |  |  | See L<EVP_CIPHER_mode(3)> for a list of valid modes. | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2019-09-10 16:05:57 +08:00
										 |  |  | =item "blocksize" (B<OSSL_CIPHER_PARAM_BLOCK_SIZE>) <unsigned integer> | 
					
						
							| 
									
										
										
										
											2019-07-25 18:55:00 +08:00
										 |  |  | 
 | 
					
						
							|  |  |  | Gets the block size for the associated cipher algorithm. | 
					
						
							|  |  |  | The block size should be 1 for stream ciphers. | 
					
						
							|  |  |  | Note that the block size for a cipher may be different to the block size for | 
					
						
							|  |  |  | the underlying encryption/decryption primitive. | 
					
						
							|  |  |  | For example AES in CTR mode has a block size of 1 (because it operates like a | 
					
						
							|  |  |  | stream cipher), even though AES has a block size of 16. | 
					
						
							| 
									
										
										
										
											2019-09-26 10:14:00 +08:00
										 |  |  | The length of the "blocksize" parameter should not exceed that of a B<size_t>. | 
					
						
							| 
									
										
										
										
											2019-07-25 18:55:00 +08:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2019-09-10 16:05:57 +08:00
										 |  |  | =item "flags" (B<OSSL_CIPHER_PARAM_FLAGS>) <unsigned integer> | 
					
						
							| 
									
										
										
										
											2019-07-25 18:55:00 +08:00
										 |  |  | 
 | 
					
						
							|  |  |  | Gets any flags for the associated cipher algorithm. | 
					
						
							|  |  |  | See L<EVP_CIPHER_meth_set_flags(3)> for a list of currently defined cipher | 
					
						
							|  |  |  | flags. | 
					
						
							| 
									
										
										
										
											2019-09-26 10:14:00 +08:00
										 |  |  | The length of the "flags" parameter should equal that of an | 
					
						
							|  |  |  | B<unsigned long int>. | 
					
						
							| 
									
										
										
										
											2019-07-25 18:55:00 +08:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2019-09-10 16:05:57 +08:00
										 |  |  | =item "keylen" (B<OSSL_CIPHER_PARAM_KEYLEN>) <unsigned integer> | 
					
						
							| 
									
										
										
										
											2019-07-25 18:55:00 +08:00
										 |  |  | 
 | 
					
						
							|  |  |  | Gets the key length for the associated cipher algorithm. | 
					
						
							|  |  |  | This can also be used to get or set the key length for the associated cipher | 
					
						
							|  |  |  | ctx. | 
					
						
							| 
									
										
										
										
											2019-09-26 10:14:00 +08:00
										 |  |  | The length of the "keylen" parameter should not exceed that of a B<size_t>. | 
					
						
							| 
									
										
										
										
											2019-07-25 18:55:00 +08:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2019-09-10 16:05:57 +08:00
										 |  |  | =item "ivlen" (B<OSSL_CIPHER_PARAM_IVLEN>) <unsigned integer> | 
					
						
							| 
									
										
										
										
											2019-07-25 18:55:00 +08:00
										 |  |  | 
 | 
					
						
							|  |  |  | Gets the IV length for the associated cipher algorithm. | 
					
						
							| 
									
										
										
										
											2019-09-26 10:14:00 +08:00
										 |  |  | The length of the "ivlen" parameter should not exceed that of a B<size_t>. | 
					
						
							| 
									
										
										
										
											2019-07-25 18:55:00 +08:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2019-09-10 16:05:57 +08:00
										 |  |  | =item "iv" (B<OSSL_CIPHER_PARAM_IV>) <octet string OR octet ptr> | 
					
						
							| 
									
										
										
										
											2019-07-25 18:55:00 +08:00
										 |  |  | 
 | 
					
						
							|  |  |  | Gets the IV for the associated cipher ctx. | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2019-09-10 16:05:57 +08:00
										 |  |  | =item "num" (B<OSSL_CIPHER_PARAM_NUM>) <unsigned integer> | 
					
						
							| 
									
										
										
										
											2019-07-25 18:55:00 +08:00
										 |  |  | 
 | 
					
						
							|  |  |  | Gets or sets the cipher specific "num" parameter for the associated cipher ctx. | 
					
						
							|  |  |  | Built-in ciphers typically use this to track how much of the current underlying | 
					
						
							|  |  |  | block has been "used" already. | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2019-09-10 16:05:57 +08:00
										 |  |  | =item "tag" (B<OSSL_CIPHER_PARAM_AEAD_TAG>) <octet string> | 
					
						
							| 
									
										
										
										
											2019-07-25 18:55:00 +08:00
										 |  |  | 
 | 
					
						
							|  |  |  | Gets or sets the AEAD tag for the associated cipher ctx. | 
					
						
							|  |  |  | See L<EVP_EncryptInit(3)/AEAD Interface>. | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2019-09-10 16:05:57 +08:00
										 |  |  | =item "taglen" (B<OSSL_CIPHER_PARAM_AEAD_TAGLEN>) <unsigned integer> | 
					
						
							| 
									
										
										
										
											2019-09-11 15:52:30 +08:00
										 |  |  | 
 | 
					
						
							|  |  |  | Gets the tag length to be used for an AEAD cipher for the associated cipher ctx. | 
					
						
							|  |  |  | It returns a default value if it has not been set. | 
					
						
							| 
									
										
										
										
											2019-09-26 10:14:00 +08:00
										 |  |  | The length of the "taglen" parameter should not exceed that of a B<size_t>. | 
					
						
							| 
									
										
										
										
											2019-09-11 15:52:30 +08:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2019-09-10 16:05:57 +08:00
										 |  |  | =item "tlsaad" (B<OSSL_CIPHER_PARAM_AEAD_TLS1_AAD>) <octet string> | 
					
						
							| 
									
										
										
										
											2019-07-25 18:55:00 +08:00
										 |  |  | 
 | 
					
						
							|  |  |  | =for comment TODO(3.0): Consider changing this interface so that all ciphers | 
					
						
							|  |  |  | use the standard AEAD interface - rather than having this special purpose | 
					
						
							|  |  |  | interface for TLS | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | Sets TLSv1.2 AAD information for the associated cipher ctx. | 
					
						
							|  |  |  | TLSv1.2 AAD information is always 13 bytes in length and is as defined for the | 
					
						
							|  |  |  | "additional_data" field described in section 6.2.3.3 of RFC5246. | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2019-09-10 16:05:57 +08:00
										 |  |  | =item "tlsaadpad" (B<OSSL_CIPHER_PARAM_AEAD_TLS1_AAD_PAD>) <unsigned integer> | 
					
						
							| 
									
										
										
										
											2019-07-25 18:55:00 +08:00
										 |  |  | 
 | 
					
						
							|  |  |  | Gets the length of the tag that will be added to a TLS record for the AEAD | 
					
						
							|  |  |  | tag for the associated cipher ctx. | 
					
						
							| 
									
										
										
										
											2019-09-26 10:14:00 +08:00
										 |  |  | The length of the "tlsaadpad" parameter should not exceed that of a B<size_t>. | 
					
						
							| 
									
										
										
										
											2019-07-25 18:55:00 +08:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2019-09-10 16:05:57 +08:00
										 |  |  | =item "tlsivfixed" (B<OSSL_CIPHER_PARAM_AEAD_TLS1_IV_FIXED>) <octet string> | 
					
						
							| 
									
										
										
										
											2019-07-25 18:55:00 +08:00
										 |  |  | 
 | 
					
						
							|  |  |  | =for comment TODO(3.0): This interface needs completely redesigning! | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | Sets the fixed portion of an IV for an AEAD cipher used in a TLS record | 
					
						
							|  |  |  | encryption/ decryption for the associated cipher ctx. | 
					
						
							|  |  |  | TLS record encryption/decryption always occurs "in place" so that the input and | 
					
						
							|  |  |  | output buffers are always the same memory location. | 
					
						
							|  |  |  | AEAD IVs in TLSv1.2 consist of an implicit "fixed" part and an explicit part | 
					
						
							|  |  |  | that varies with every record. | 
					
						
							|  |  |  | Setting a TLS fixed IV changes a cipher to encrypt/decrypt TLS records. | 
					
						
							|  |  |  | TLS records are encrypted/decrypted using a single OP_cipher_cipher call per | 
					
						
							|  |  |  | record. | 
					
						
							|  |  |  | For a record decryption the first bytes of the input buffer will be the explict | 
					
						
							|  |  |  | part of the IV and the final bytes of the input buffer will be the AEAD tag. | 
					
						
							|  |  |  | The length of the explicit part of the IV and the tag length will depend on the | 
					
						
							|  |  |  | cipher in use and will be defined in the RFC for the relevant ciphersuite. | 
					
						
							|  |  |  | In order to allow for "in place" decryption the plaintext output should be | 
					
						
							|  |  |  | written to the same location in the output buffer that the ciphertext payload | 
					
						
							|  |  |  | was read from, i.e. immediately after the explicit IV. | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | When encrypting a record the first bytes of the input buffer will be empty to | 
					
						
							|  |  |  | allow space for the explicit IV, as will the final bytes where the tag will | 
					
						
							|  |  |  | be written. | 
					
						
							|  |  |  | The length of the input buffer will include the length of the explicit IV, the | 
					
						
							|  |  |  | payload, and the tag bytes. | 
					
						
							|  |  |  | The cipher implementation should generate the explicit IV and write it to the | 
					
						
							|  |  |  | beginning of the output buffer, do "in place" encryption of the payload and | 
					
						
							|  |  |  | write that to the output buffer, and finally add the tag onto the end of the | 
					
						
							|  |  |  | output buffer. | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2019-09-27 19:26:22 +08:00
										 |  |  | Whether encrypting or decrypting the value written to I<*outl> in the | 
					
						
							| 
									
										
										
										
											2019-07-25 18:55:00 +08:00
										 |  |  | OP_cipher_cipher call should be the length of the payload excluding the explicit | 
					
						
							|  |  |  | IV length and the tag length. | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2019-09-10 16:05:57 +08:00
										 |  |  | =item "ivlen" (B<OSSL_CIPHER_PARAM_AEAD_IVLEN>) <unsigned integer> | 
					
						
							| 
									
										
										
										
											2019-07-25 18:55:00 +08:00
										 |  |  | 
 | 
					
						
							|  |  |  | Sets the IV length to be used for an AEAD cipher for the associated cipher ctx. | 
					
						
							| 
									
										
										
										
											2019-09-26 10:14:00 +08:00
										 |  |  | The length of the "ivlen" parameter should not exceed that of a B<size_t>. | 
					
						
							| 
									
										
										
										
											2019-07-25 18:55:00 +08:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2019-09-10 16:05:57 +08:00
										 |  |  | =item "randkey" (B<OSSL_CIPHER_PARAM_RANDOM_KEY>) <octet string> | 
					
						
							| 
									
										
										
										
											2019-08-26 15:05:08 +08:00
										 |  |  | 
 | 
					
						
							|  |  |  | Gets a implementation specific randomly generated key for the associated | 
					
						
							|  |  |  | cipher ctx. This is currently only supported by 3DES (which sets the key to | 
					
						
							|  |  |  | odd parity). | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2019-07-25 18:55:00 +08:00
										 |  |  | =back | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | =head1 RETURN VALUES | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | OP_cipher_newctx() and OP_cipher_dupctx() should return the newly created | 
					
						
							|  |  |  | provider side cipher context, or NULL on failure. | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | OP_cipher_encrypt_init(), OP_cipher_decrypt_init(), OP_cipher_update(), | 
					
						
							|  |  |  | OP_cipher_final(), OP_cipher_cipher(), OP_cipher_get_params(), | 
					
						
							| 
									
										
										
										
											2019-08-16 15:04:29 +08:00
										 |  |  | OP_cipher_get_ctx_params() and OP_cipher_set_ctx_params() should return 1 for | 
					
						
							| 
									
										
										
										
											2019-07-25 18:55:00 +08:00
										 |  |  | success or 0 on error. | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2019-08-19 07:30:59 +08:00
										 |  |  | OP_cipher_gettable_params(), OP_cipher_gettable_ctx_params() and | 
					
						
							|  |  |  | OP_cipher_settable_ctx_params() should return a constant B<OSSL_PARAM> | 
					
						
							|  |  |  | array, or NULL if none is offered. | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2019-07-25 18:55:00 +08:00
										 |  |  | =head1 SEE ALSO | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | L<provider(7)> | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | =head1 HISTORY | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | The provider CIPHER interface was introduced in OpenSSL 3.0. | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | =head1 COPYRIGHT | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | Copyright 2019 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<https://www.openssl.org/source/license.html>. | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | =cut |