| 
									
										
										
										
											2019-09-18 04:35:23 +08:00
										 |  |  | =pod | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | =head1 NAME | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | EVP_KDF-KRB5KDF - The RFC3961 Krb5 KDF EVP_KDF implementation | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | =head1 DESCRIPTION | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | Support for computing the B<KRB5KDF> KDF through the B<EVP_KDF> API. | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | The EVP_KDF-KRB5KDF algorithm implements the key derivation function defined | 
					
						
							|  |  |  | in RFC 3961, section 5.1 and is used by Krb5 to derive session keys. | 
					
						
							|  |  |  | Three inputs are required to perform key derivation: a cipher, (for example | 
					
						
							|  |  |  | AES-128-CBC), the initial key, and a constant. | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | =head2 Identity | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | "KRB5KDF" is the name for this implementation; | 
					
						
							|  |  |  | it can be used with the EVP_KDF_fetch() function. | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | =head2 Supported parameters | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | The supported parameters are: | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | =over 4 | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2019-11-12 23:59:23 +08:00
										 |  |  | =item "properties" (B<OSSL_KDF_PARAM_PROPERTIES>) <UTF8 string> | 
					
						
							| 
									
										
										
										
											2019-09-18 04:35:23 +08:00
										 |  |  | 
 | 
					
						
							|  |  |  | =item "cipher" (B<OSSL_KDF_PARAM_CIPHER>) <UTF8 string> | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | =item "key" (B<OSSL_KDF_PARAM_KEY>) <octet string> | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | These parameters work as described in L<EVP_KDF(3)/PARAMETERS>. | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | =item "constant" (B<OSSL_KDF_PARAM_CONSTANT>) <octet string> | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | This parameter sets the constant value for the KDF. | 
					
						
							|  |  |  | If a value is already set, the contents are replaced. | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | =back | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | =head1 NOTES | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | A context for KRB5KDF can be obtained by calling: | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |  EVP_KDF *kdf = EVP_KDF_fetch(NULL, "KRB5KDF", NULL); | 
					
						
							| 
									
										
										
										
											2020-06-18 16:30:48 +08:00
										 |  |  |  EVP_KDF_CTX *kctx = EVP_KDF_CTX_new(kdf); | 
					
						
							| 
									
										
										
										
											2019-09-18 04:35:23 +08:00
										 |  |  | 
 | 
					
						
							|  |  |  | The output length of the KRB5KDF derivation is specified via the I<keylen> | 
					
						
							|  |  |  | parameter to the L<EVP_KDF_derive(3)> function, and MUST match the key | 
					
						
							| 
									
										
										
										
											2020-06-30 03:13:07 +08:00
										 |  |  | length for the chosen cipher or an error is returned. Moreover, the | 
					
						
							| 
									
										
										
										
											2019-09-18 04:35:23 +08:00
										 |  |  | constant's length must not exceed the block size of the cipher. | 
					
						
							|  |  |  | Since the KRB5KDF output length depends on the chosen cipher, calling | 
					
						
							| 
									
										
										
										
											2020-10-13 12:30:12 +08:00
										 |  |  | L<EVP_KDF_CTX_get_kdf_size(3)> to obtain the requisite length returns the correct length | 
					
						
							| 
									
										
										
										
											2019-09-18 04:35:23 +08:00
										 |  |  | only after the cipher is set. Prior to that B<EVP_MAX_KEY_LENGTH> is returned. | 
					
						
							|  |  |  | The caller must allocate a buffer of the correct length for the chosen | 
					
						
							|  |  |  | cipher, and pass that buffer to the L<EVP_KDF_derive(3)> function along | 
					
						
							|  |  |  | with that length. | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | =head1 EXAMPLES | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | This example derives a key using the AES-128-CBC cipher: | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |  EVP_KDF *kdf; | 
					
						
							|  |  |  |  EVP_KDF_CTX *kctx; | 
					
						
							|  |  |  |  unsigned char key[16] = "01234..."; | 
					
						
							|  |  |  |  unsigned char constant[] = "I'm a constant"; | 
					
						
							|  |  |  |  unsigned char out[16]; | 
					
						
							|  |  |  |  size_t outlen = sizeof(out); | 
					
						
							|  |  |  |  OSSL_PARAM params[4], *p = params; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |  kdf = EVP_KDF_fetch(NULL, "KRB5KDF", NULL); | 
					
						
							| 
									
										
										
										
											2020-06-18 16:30:48 +08:00
										 |  |  |  kctx = EVP_KDF_CTX_new(kdf); | 
					
						
							| 
									
										
										
										
											2019-09-18 04:35:23 +08:00
										 |  |  |  EVP_KDF_free(kdf); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |  *p++ = OSSL_PARAM_construct_utf8_string(OSSL_KDF_PARAM_CIPHER, | 
					
						
							|  |  |  |                                          SN_aes_128_cbc, | 
					
						
							|  |  |  |                                          strlen(SN_aes_128_cbc)); | 
					
						
							|  |  |  |  *p++ = OSSL_PARAM_construct_octet_string(OSSL_KDF_PARAM_KEY, | 
					
						
							|  |  |  |                                           key, (size_t)16); | 
					
						
							|  |  |  |  *p++ = OSSL_PARAM_construct_octet_string(OSSL_KDF_PARAM_CONSTANT, | 
					
						
							|  |  |  |                                           constant, strlen(constant)); | 
					
						
							|  |  |  |  *p = OSSL_PARAM_construct_end(); | 
					
						
							| 
									
										
										
										
											2021-02-26 08:09:49 +08:00
										 |  |  |  if (EVP_KDF_derive(kctx, out, outlen, params) <= 0) | 
					
						
							| 
									
										
										
										
											2019-09-18 04:35:23 +08:00
										 |  |  |      /* Error */ | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2020-06-18 16:30:48 +08:00
										 |  |  |  EVP_KDF_CTX_free(kctx); | 
					
						
							| 
									
										
										
										
											2019-09-18 04:35:23 +08:00
										 |  |  | 
 | 
					
						
							|  |  |  | =head1 CONFORMING TO | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | RFC 3961 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | =head1 SEE ALSO | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2019-10-05 05:09:19 +08:00
										 |  |  | L<EVP_KDF(3)>, | 
					
						
							| 
									
										
										
										
											2020-06-18 16:30:48 +08:00
										 |  |  | L<EVP_KDF_CTX_free(3)>, | 
					
						
							| 
									
										
										
										
											2019-09-18 04:35:23 +08:00
										 |  |  | L<EVP_KDF_ctrl(3)>, | 
					
						
							| 
									
										
										
										
											2020-10-13 12:30:12 +08:00
										 |  |  | L<EVP_KDF_CTX_get_kdf_size(3)>, | 
					
						
							| 
									
										
										
										
											2019-09-18 04:35:23 +08:00
										 |  |  | L<EVP_KDF_derive(3)>, | 
					
						
							|  |  |  | L<EVP_KDF(3)/PARAMETERS> | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | =head1 HISTORY | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | This functionality was added to OpenSSL 3.0. | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | =head1 COPYRIGHT | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2020-04-23 20:55:52 +08:00
										 |  |  | Copyright 2016-2020 The OpenSSL Project Authors. All Rights Reserved. | 
					
						
							| 
									
										
										
										
											2019-09-18 04:35:23 +08:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2020-04-27 12:59:50 +08:00
										 |  |  | Licensed under the Apache License 2.0 (the "License").  You may not use | 
					
						
							| 
									
										
										
										
											2019-09-18 04:35:23 +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 | 
					
						
							|  |  |  | 
 |