| 
									
										
										
										
											2015-12-19 00:09:45 +08:00
										 |  |  | =pod | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | =head1 NAME | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | EVP_CIPHER_meth_new, EVP_CIPHER_meth_dup, EVP_CIPHER_meth_free, | 
					
						
							|  |  |  | EVP_CIPHER_meth_set_iv_length, EVP_CIPHER_meth_set_flags, | 
					
						
							|  |  |  | EVP_CIPHER_meth_set_impl_ctx_size, EVP_CIPHER_meth_set_init, | 
					
						
							|  |  |  | EVP_CIPHER_meth_set_do_cipher, EVP_CIPHER_meth_set_cleanup, | 
					
						
							|  |  |  | EVP_CIPHER_meth_set_set_asn1_params, EVP_CIPHER_meth_set_get_asn1_params, | 
					
						
							|  |  |  | EVP_CIPHER_meth_set_ctrl, EVP_CIPHER_meth_get_init, | 
					
						
							|  |  |  | EVP_CIPHER_meth_get_do_cipher, EVP_CIPHER_meth_get_cleanup, | 
					
						
							|  |  |  | EVP_CIPHER_meth_get_set_asn1_params, EVP_CIPHER_meth_get_get_asn1_params, | 
					
						
							| 
									
										
										
										
											2019-09-04 00:11:49 +08:00
										 |  |  | EVP_CIPHER_meth_get_ctrl | 
					
						
							| 
									
										
										
										
											2019-06-25 00:47:04 +08:00
										 |  |  | - Routines to build up EVP_CIPHER methods | 
					
						
							| 
									
										
										
										
											2015-12-19 00:09:45 +08:00
										 |  |  | 
 | 
					
						
							|  |  |  | =head1 SYNOPSIS | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |  #include <openssl/evp.h> | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |  EVP_CIPHER *EVP_CIPHER_meth_new(int cipher_type, int block_size, int key_len); | 
					
						
							|  |  |  |  EVP_CIPHER *EVP_CIPHER_meth_dup(const EVP_CIPHER *cipher); | 
					
						
							|  |  |  |  void EVP_CIPHER_meth_free(EVP_CIPHER *cipher); | 
					
						
							| 
									
										
										
										
											2016-05-20 20:11:46 +08:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2015-12-19 00:09:45 +08:00
										 |  |  |  int EVP_CIPHER_meth_set_iv_length(EVP_CIPHER *cipher, int iv_len); | 
					
						
							|  |  |  |  int EVP_CIPHER_meth_set_flags(EVP_CIPHER *cipher, unsigned long flags); | 
					
						
							|  |  |  |  int EVP_CIPHER_meth_set_impl_ctx_size(EVP_CIPHER *cipher, int ctx_size); | 
					
						
							|  |  |  |  int EVP_CIPHER_meth_set_init(EVP_CIPHER *cipher, | 
					
						
							| 
									
										
										
										
											2017-01-21 02:58:49 +08:00
										 |  |  |                               int (*init)(EVP_CIPHER_CTX *ctx, | 
					
						
							|  |  |  |                                           const unsigned char *key, | 
					
						
							|  |  |  |                                           const unsigned char *iv, | 
					
						
							|  |  |  |                                           int enc)); | 
					
						
							| 
									
										
										
										
											2015-12-19 00:09:45 +08:00
										 |  |  |  int EVP_CIPHER_meth_set_do_cipher(EVP_CIPHER *cipher, | 
					
						
							| 
									
										
										
										
											2017-01-21 02:58:49 +08:00
										 |  |  |                                    int (*do_cipher)(EVP_CIPHER_CTX *ctx, | 
					
						
							|  |  |  |                                                     unsigned char *out, | 
					
						
							|  |  |  |                                                     const unsigned char *in, | 
					
						
							|  |  |  |                                                     size_t inl)); | 
					
						
							| 
									
										
										
										
											2015-12-19 00:09:45 +08:00
										 |  |  |  int EVP_CIPHER_meth_set_cleanup(EVP_CIPHER *cipher, | 
					
						
							| 
									
										
										
										
											2017-01-21 02:58:49 +08:00
										 |  |  |                                  int (*cleanup)(EVP_CIPHER_CTX *)); | 
					
						
							| 
									
										
										
										
											2015-12-19 00:09:45 +08:00
										 |  |  |  int EVP_CIPHER_meth_set_set_asn1_params(EVP_CIPHER *cipher, | 
					
						
							| 
									
										
										
										
											2017-01-21 02:58:49 +08:00
										 |  |  |                                          int (*set_asn1_parameters)(EVP_CIPHER_CTX *, | 
					
						
							|  |  |  |                                                                     ASN1_TYPE *)); | 
					
						
							| 
									
										
										
										
											2015-12-19 00:09:45 +08:00
										 |  |  |  int EVP_CIPHER_meth_set_get_asn1_params(EVP_CIPHER *cipher, | 
					
						
							| 
									
										
										
										
											2017-01-21 02:58:49 +08:00
										 |  |  |                                          int (*get_asn1_parameters)(EVP_CIPHER_CTX *, | 
					
						
							|  |  |  |                                                                     ASN1_TYPE *)); | 
					
						
							| 
									
										
										
										
											2015-12-19 00:09:45 +08:00
										 |  |  |  int EVP_CIPHER_meth_set_ctrl(EVP_CIPHER *cipher, | 
					
						
							| 
									
										
										
										
											2017-01-21 02:58:49 +08:00
										 |  |  |                               int (*ctrl)(EVP_CIPHER_CTX *, int type, | 
					
						
							|  |  |  |                                           int arg, void *ptr)); | 
					
						
							| 
									
										
										
										
											2016-05-20 20:11:46 +08:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2015-12-19 00:09:45 +08:00
										 |  |  |  int (*EVP_CIPHER_meth_get_init(const EVP_CIPHER *cipher))(EVP_CIPHER_CTX *ctx, | 
					
						
							|  |  |  |                                                            const unsigned char *key, | 
					
						
							|  |  |  |                                                            const unsigned char *iv, | 
					
						
							|  |  |  |                                                            int enc); | 
					
						
							|  |  |  |  int (*EVP_CIPHER_meth_get_do_cipher(const EVP_CIPHER *cipher))(EVP_CIPHER_CTX *ctx, | 
					
						
							|  |  |  |                                                                 unsigned char *out, | 
					
						
							|  |  |  |                                                                 const unsigned char *in, | 
					
						
							|  |  |  |                                                                 size_t inl); | 
					
						
							|  |  |  |  int (*EVP_CIPHER_meth_get_cleanup(const EVP_CIPHER *cipher))(EVP_CIPHER_CTX *); | 
					
						
							|  |  |  |  int (*EVP_CIPHER_meth_get_set_asn1_params(const EVP_CIPHER *cipher))(EVP_CIPHER_CTX *, | 
					
						
							|  |  |  |                                                                       ASN1_TYPE *); | 
					
						
							|  |  |  |  int (*EVP_CIPHER_meth_get_get_asn1_params(const EVP_CIPHER *cipher))(EVP_CIPHER_CTX *, | 
					
						
							| 
									
										
										
										
											2017-01-21 02:58:49 +08:00
										 |  |  |                                                                       ASN1_TYPE *); | 
					
						
							| 
									
										
										
										
											2015-12-19 00:09:45 +08:00
										 |  |  |  int (*EVP_CIPHER_meth_get_ctrl(const EVP_CIPHER *cipher))(EVP_CIPHER_CTX *, | 
					
						
							|  |  |  |                                                            int type, int arg, | 
					
						
							|  |  |  |                                                            void *ptr); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | =head1 DESCRIPTION | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | The B<EVP_CIPHER> type is a structure for symmetric cipher method | 
					
						
							|  |  |  | implementation. | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | EVP_CIPHER_meth_new() creates a new B<EVP_CIPHER> structure. | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | EVP_CIPHER_meth_dup() creates a copy of B<cipher>. | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | EVP_CIPHER_meth_free() destroys a B<EVP_CIPHER> structure. | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2018-02-28 14:30:32 +08:00
										 |  |  | EVP_CIPHER_meth_set_iv_length() sets the length of the IV. | 
					
						
							| 
									
										
										
										
											2015-12-19 00:09:45 +08:00
										 |  |  | This is only needed when the implemented cipher mode requires it. | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | EVP_CIPHER_meth_set_flags() sets the flags to describe optional | 
					
						
							|  |  |  | behaviours in the particular B<cipher>. | 
					
						
							|  |  |  | With the exception of cipher modes, of which only one may be present, | 
					
						
							|  |  |  | several flags can be or'd together. | 
					
						
							|  |  |  | The available flags are: | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2017-04-04 03:39:09 +08:00
										 |  |  | =over 4 | 
					
						
							| 
									
										
										
										
											2015-12-19 00:09:45 +08:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2016-05-20 20:11:46 +08:00
										 |  |  | =item EVP_CIPH_STREAM_CIPHER, EVP_CIPH_ECB_MODE EVP_CIPH_CBC_MODE, | 
					
						
							|  |  |  | EVP_CIPH_CFB_MODE, EVP_CIPH_OFB_MODE, EVP_CIPH_CTR_MODE, EVP_CIPH_GCM_MODE, | 
					
						
							|  |  |  | EVP_CIPH_CCM_MODE, EVP_CIPH_XTS_MODE, EVP_CIPH_WRAP_MODE, | 
					
						
							| 
									
										
										
										
											2017-05-19 22:27:28 +08:00
										 |  |  | EVP_CIPH_OCB_MODE, EVP_CIPH_SIV_MODE | 
					
						
							| 
									
										
										
										
											2015-12-19 00:09:45 +08:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2016-05-20 20:11:46 +08:00
										 |  |  | The cipher mode. | 
					
						
							| 
									
										
										
										
											2015-12-19 00:09:45 +08:00
										 |  |  | 
 | 
					
						
							|  |  |  | =item EVP_CIPH_VARIABLE_LENGTH | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | This cipher is of variable length. | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | =item EVP_CIPH_CUSTOM_IV | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | Storing and initialising the IV is left entirely to the | 
					
						
							|  |  |  | implementation. | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | =item EVP_CIPH_ALWAYS_CALL_INIT | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | Set this if the implementation's init() function should be called even | 
					
						
							|  |  |  | if B<key> is B<NULL>. | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | =item EVP_CIPH_CTRL_INIT | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | Set this to have the implementation's ctrl() function called with | 
					
						
							|  |  |  | command code B<EVP_CTRL_INIT> early in its setup. | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | =item EVP_CIPH_CUSTOM_KEY_LENGTH | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | Checking and setting the key length after creating the B<EVP_CIPHER> | 
					
						
							|  |  |  | is left to the implementation. | 
					
						
							|  |  |  | Whenever someone uses EVP_CIPHER_CTX_set_key_length() on a | 
					
						
							|  |  |  | B<EVP_CIPHER> with this flag set, the implementation's ctrl() function | 
					
						
							|  |  |  | will be called with the control code B<EVP_CTRL_SET_KEY_LENGTH> and | 
					
						
							|  |  |  | the key length in B<arg>. | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | =item EVP_CIPH_NO_PADDING | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | Don't use standard block padding. | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | =item EVP_CIPH_RAND_KEY | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | Making a key with random content is left to the implementation. | 
					
						
							|  |  |  | This is done by calling the implementation's ctrl() function with the | 
					
						
							|  |  |  | control code B<EVP_CTRL_RAND_KEY> and the pointer to the key memory | 
					
						
							|  |  |  | storage in B<ptr>. | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | =item EVP_CIPH_CUSTOM_COPY | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | Set this to have the implementation's ctrl() function called with | 
					
						
							|  |  |  | command code B<EVP_CTRL_COPY> at the end of EVP_CIPHER_CTX_copy(). | 
					
						
							|  |  |  | The intended use is for further things to deal with after the | 
					
						
							|  |  |  | implementation specific data block has been copied. | 
					
						
							|  |  |  | The destination B<EVP_CIPHER_CTX> is passed to the control with the | 
					
						
							|  |  |  | B<ptr> parameter. | 
					
						
							|  |  |  | The implementation specific data block is reached with | 
					
						
							| 
									
										
										
										
											2016-03-07 18:17:27 +08:00
										 |  |  | EVP_CIPHER_CTX_get_cipher_data(). | 
					
						
							| 
									
										
										
										
											2015-12-19 00:09:45 +08:00
										 |  |  | 
 | 
					
						
							|  |  |  | =item EVP_CIPH_FLAG_DEFAULT_ASN1 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | Use the default EVP routines to pass IV to and from ASN.1. | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | =item EVP_CIPH_FLAG_LENGTH_BITS | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | Signals that the length of the input buffer for encryption / | 
					
						
							| 
									
										
										
										
											2017-08-01 06:58:40 +08:00
										 |  |  | decryption is to be understood as the number of bits instead of | 
					
						
							| 
									
										
										
										
											2015-12-19 00:09:45 +08:00
										 |  |  | bytes for this implementation. | 
					
						
							|  |  |  | This is only useful for CFB1 ciphers. | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | =begin comment | 
					
						
							|  |  |  | The FIPS flags seem to be unused, so I'm hiding them until I get an | 
					
						
							|  |  |  | explanation or they get removed.  /RL | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | =item EVP_CIPH_FLAG_FIPS | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | =item EVP_CIPH_FLAG_NON_FIPS_ALLOW | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | =end comment | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | =item EVP_CIPH_FLAG_CUSTOM_CIPHER | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | This indicates that the implementation takes care of everything, | 
					
						
							|  |  |  | including padding, buffering and finalization. | 
					
						
							|  |  |  | The EVP routines will simply give them control and do nothing more. | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | =item EVP_CIPH_FLAG_AEAD_CIPHER | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2016-03-20 23:51:06 +08:00
										 |  |  | This indicates that this is an AEAD cipher implementation. | 
					
						
							| 
									
										
										
										
											2015-12-19 00:09:45 +08:00
										 |  |  | 
 | 
					
						
							|  |  |  | =item EVP_CIPH_FLAG_TLS1_1_MULTIBLOCK | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2016-05-20 20:11:46 +08:00
										 |  |  | Allow interleaving of crypto blocks, a particular optimization only applicable | 
					
						
							|  |  |  | to certain TLS ciphers. | 
					
						
							| 
									
										
										
										
											2015-12-19 00:09:45 +08:00
										 |  |  | 
 | 
					
						
							|  |  |  | =back | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2015-09-22 18:11:24 +08:00
										 |  |  | EVP_CIPHER_meth_set_impl_ctx_size() sets the size of the EVP_CIPHER's | 
					
						
							|  |  |  | implementation context so that it can be automatically allocated. | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2015-12-19 00:09:45 +08:00
										 |  |  | EVP_CIPHER_meth_set_init() sets the cipher init function for | 
					
						
							|  |  |  | B<cipher>. | 
					
						
							|  |  |  | The cipher init function is called by EVP_CipherInit(), | 
					
						
							|  |  |  | EVP_CipherInit_ex(), EVP_EncryptInit(), EVP_EncryptInit_ex(), | 
					
						
							|  |  |  | EVP_DecryptInit(), EVP_DecryptInit_ex(). | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | EVP_CIPHER_meth_set_do_cipher() sets the cipher function for | 
					
						
							|  |  |  | B<cipher>. | 
					
						
							|  |  |  | The cipher function is called by EVP_CipherUpdate(), | 
					
						
							|  |  |  | EVP_EncryptUpdate(), EVP_DecryptUpdate(), EVP_CipherFinal(), | 
					
						
							|  |  |  | EVP_EncryptFinal(), EVP_EncryptFinal_ex(), EVP_DecryptFinal() and | 
					
						
							|  |  |  | EVP_DecryptFinal_ex(). | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | EVP_CIPHER_meth_set_cleanup() sets the function for B<cipher> to do | 
					
						
							| 
									
										
										
										
											2016-06-29 04:39:55 +08:00
										 |  |  | extra cleanup before the method's private data structure is cleaned | 
					
						
							| 
									
										
										
										
											2015-12-19 00:09:45 +08:00
										 |  |  | out and freed. | 
					
						
							|  |  |  | Note that the cleanup function is passed a B<EVP_CIPHER_CTX *>, the | 
					
						
							|  |  |  | private data structure is then available with | 
					
						
							| 
									
										
										
										
											2016-03-07 18:17:27 +08:00
										 |  |  | EVP_CIPHER_CTX_get_cipher_data(). | 
					
						
							| 
									
										
										
										
											2015-12-19 00:09:45 +08:00
										 |  |  | This cleanup function is called by EVP_CIPHER_CTX_reset() and | 
					
						
							|  |  |  | EVP_CIPHER_CTX_free(). | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2017-11-24 22:14:42 +08:00
										 |  |  | EVP_CIPHER_meth_set_set_asn1_params() sets the function for B<cipher> | 
					
						
							|  |  |  | to set the AlgorithmIdentifier "parameter" based on the passed cipher. | 
					
						
							|  |  |  | This function is called by EVP_CIPHER_param_to_asn1(). | 
					
						
							|  |  |  | EVP_CIPHER_meth_set_get_asn1_params() sets the function for B<cipher> | 
					
						
							|  |  |  | that sets the cipher parameters based on an ASN.1 AlgorithmIdentifier | 
					
						
							|  |  |  | "parameter". | 
					
						
							|  |  |  | Both these functions are needed when there is a need for custom data | 
					
						
							|  |  |  | (more or other than the cipher IV). | 
					
						
							|  |  |  | They are called by EVP_CIPHER_param_to_asn1() and | 
					
						
							|  |  |  | EVP_CIPHER_asn1_to_param() respectively if defined. | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2015-12-19 00:09:45 +08:00
										 |  |  | EVP_CIPHER_meth_set_ctrl() sets the control function for B<cipher>. | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2017-11-24 22:14:42 +08:00
										 |  |  | EVP_CIPHER_meth_get_init(), EVP_CIPHER_meth_get_do_cipher(), | 
					
						
							|  |  |  | EVP_CIPHER_meth_get_cleanup(), EVP_CIPHER_meth_get_set_asn1_params(), | 
					
						
							|  |  |  | EVP_CIPHER_meth_get_get_asn1_params() and EVP_CIPHER_meth_get_ctrl() | 
					
						
							|  |  |  | are all used to retrieve the method data given with the | 
					
						
							|  |  |  | EVP_CIPHER_meth_set_*() functions above. | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2016-05-20 20:11:46 +08:00
										 |  |  | =head1 RETURN VALUES | 
					
						
							| 
									
										
										
										
											2015-12-19 00:09:45 +08:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2017-11-24 22:14:42 +08:00
										 |  |  | EVP_CIPHER_meth_new() and EVP_CIPHER_meth_dup() return a pointer to a | 
					
						
							|  |  |  | newly created B<EVP_CIPHER>, or NULL on failure. | 
					
						
							|  |  |  | All EVP_CIPHER_meth_set_*() functions return 1. | 
					
						
							|  |  |  | All EVP_CIPHER_meth_get_*() functions return pointers to their | 
					
						
							|  |  |  | respective B<cipher> function. | 
					
						
							| 
									
										
										
										
											2015-12-19 00:09:45 +08:00
										 |  |  | 
 | 
					
						
							|  |  |  | =head1 SEE ALSO | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2019-10-05 05:09:19 +08:00
										 |  |  | L<EVP_EncryptInit(3)> | 
					
						
							| 
									
										
										
										
											2015-12-19 00:09:45 +08:00
										 |  |  | 
 | 
					
						
							|  |  |  | =head1 HISTORY | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2017-07-15 21:39:45 +08:00
										 |  |  | The functions described here were added in OpenSSL 1.1.0. | 
					
						
							| 
									
										
										
										
											2019-09-04 00:11:49 +08:00
										 |  |  | The B<EVP_CIPHER> structure created with these functions became reference | 
					
						
							|  |  |  | counted in OpenSSL 3.0. | 
					
						
							| 
									
										
										
										
											2015-12-19 00:09:45 +08:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2016-05-18 23:44:05 +08:00
										 |  |  | =head1 COPYRIGHT | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2018-03-20 21:00:17 +08:00
										 |  |  | Copyright 2016-2018 The OpenSSL Project Authors. All Rights Reserved. | 
					
						
							| 
									
										
										
										
											2016-05-18 23:44:05 +08:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2018-12-06 21:04:44 +08:00
										 |  |  | Licensed under the Apache License 2.0 (the "License").  You may not use | 
					
						
							| 
									
										
										
										
											2016-05-18 23:44:05 +08:00
										 |  |  | 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 |