| 
									
										
										
										
											2018-09-20 04:23:45 +08:00
										 |  |  | =pod | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | =head1 NAME | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2019-09-02 11:58:22 +08:00
										 |  |  | EVP_KDF-SSHKDF - The SSHKDF EVP_KDF implementation | 
					
						
							| 
									
										
										
										
											2018-09-20 04:23:45 +08:00
										 |  |  | 
 | 
					
						
							|  |  |  | =head1 DESCRIPTION | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | Support for computing the B<SSHKDF> KDF through the B<EVP_KDF> API. | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2019-09-02 11:58:22 +08:00
										 |  |  | The EVP_KDF-SSHKDF algorithm implements the SSHKDF key derivation function. | 
					
						
							| 
									
										
										
										
											2018-09-20 04:23:45 +08:00
										 |  |  | It is defined in RFC 4253, section 7.2 and is used by SSH to derive IVs, | 
					
						
							|  |  |  | encryption keys and integrity keys. | 
					
						
							|  |  |  | Five inputs are required to perform key derivation: The hashing function | 
					
						
							|  |  |  | (for example SHA256), the Initial Key, the Exchange Hash, the Session ID, | 
					
						
							|  |  |  | and the derivation key type. | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2019-09-02 11:58:22 +08:00
										 |  |  | =head2 Identity | 
					
						
							| 
									
										
										
										
											2018-09-20 04:23:45 +08:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2019-09-02 11:58:22 +08:00
										 |  |  | "SSHKDF" is the name for this implementation; it | 
					
						
							|  |  |  | can be used with the EVP_KDF_fetch() function. | 
					
						
							| 
									
										
										
										
											2018-09-20 04:23:45 +08:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2019-09-02 11:58:22 +08:00
										 |  |  | =head2 Supported parameters | 
					
						
							| 
									
										
										
										
											2018-09-20 04:23:45 +08:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2019-09-02 11:58:22 +08:00
										 |  |  | The supported parameters are: | 
					
						
							| 
									
										
										
										
											2018-09-20 04:23:45 +08:00
										 |  |  | 
 | 
					
						
							|  |  |  | =over 4 | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2019-09-10 16:05:57 +08:00
										 |  |  | =item "properties" (B<OSSL_KDF_PARAM_PROPERTIES>) <UTF8 string> | 
					
						
							| 
									
										
										
										
											2018-09-20 04:23:45 +08:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2019-09-10 16:05:57 +08:00
										 |  |  | =item "digest" (B<OSSL_KDF_PARAM_DIGEST>) <UTF8 string> | 
					
						
							| 
									
										
										
										
											2018-09-20 04:23:45 +08:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2019-09-10 16:05:57 +08:00
										 |  |  | =item "key" (B<OSSL_KDF_PARAM_KEY>) <octet string> | 
					
						
							| 
									
										
										
										
											2018-09-20 04:23:45 +08:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2019-09-02 11:58:22 +08:00
										 |  |  | These parameters work as described in L<EVP_KDF(3)/PARAMETERS>. | 
					
						
							| 
									
										
										
										
											2018-09-20 04:23:45 +08:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2019-09-10 16:05:57 +08:00
										 |  |  | =item "xcghash" (B<OSSL_KDF_PARAM_SSHKDF_XCGHASH>) <octet string> | 
					
						
							| 
									
										
										
										
											2018-09-20 04:23:45 +08:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2019-09-10 16:05:57 +08:00
										 |  |  | =item "session_id" (B<OSSL_KDF_PARAM_SSHKDF_SESSION_ID>) <octet string> | 
					
						
							| 
									
										
										
										
											2018-09-20 04:23:45 +08:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2019-09-02 11:58:22 +08:00
										 |  |  | These parameters set the respective values for the KDF. | 
					
						
							|  |  |  | If a value is already set, the contents are replaced. | 
					
						
							| 
									
										
										
										
											2018-09-20 04:23:45 +08:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2019-09-10 16:05:57 +08:00
										 |  |  | =item "type" (B<OSSL_KDF_PARAM_SSHKDF_TYPE>) <integer> | 
					
						
							| 
									
										
										
										
											2018-09-20 04:23:45 +08:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2019-09-02 11:58:22 +08:00
										 |  |  | This parameter sets the type for the SSHHKDF operation. | 
					
						
							|  |  |  | There are six supported types: | 
					
						
							| 
									
										
										
										
											2018-09-20 04:23:45 +08:00
										 |  |  | 
 | 
					
						
							|  |  |  | =over 4 | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2019-07-02 16:04:04 +08:00
										 |  |  | =item EVP_KDF_SSHKDF_TYPE_INITIAL_IV_CLI_TO_SRV | 
					
						
							| 
									
										
										
										
											2018-09-20 04:23:45 +08:00
										 |  |  | 
 | 
					
						
							|  |  |  | The Initial IV from client to server. | 
					
						
							|  |  |  | A single char of value 65 (ASCII char 'A'). | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2019-07-02 16:04:04 +08:00
										 |  |  | =item EVP_KDF_SSHKDF_TYPE_INITIAL_IV_SRV_TO_CLI | 
					
						
							| 
									
										
										
										
											2018-09-20 04:23:45 +08:00
										 |  |  | 
 | 
					
						
							|  |  |  | The Initial IV from server to client | 
					
						
							|  |  |  | A single char of value 66 (ASCII char 'B'). | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | =item EVP_KDF_SSHKDF_TYPE_ENCRYPTION_KEY_CLI_TO_SRV | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | The Encryption Key from client to server | 
					
						
							|  |  |  | A single char of value 67 (ASCII char 'C'). | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | =item EVP_KDF_SSHKDF_TYPE_ENCRYPTION_KEY_SRV_TO_CLI | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | The Encryption Key from server to client | 
					
						
							|  |  |  | A single char of value 68 (ASCII char 'D'). | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | =item EVP_KDF_SSHKDF_TYPE_INTEGRITY_KEY_CLI_TO_SRV | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | The Integrity Key from client to server | 
					
						
							|  |  |  | A single char of value 69 (ASCII char 'E'). | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | =item EVP_KDF_SSHKDF_TYPE_INTEGRITY_KEY_SRV_TO_CLI | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | The Integrity Key from client to server | 
					
						
							|  |  |  | A single char of value 70 (ASCII char 'F'). | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | =back | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | =back | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | =head1 NOTES | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | A context for SSHKDF can be obtained by calling: | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2019-09-02 11:58:22 +08:00
										 |  |  |  EVP_KDF *kdf = EVP_KDF_fetch(NULL, "SSHKDF", NULL); | 
					
						
							|  |  |  |  EVP_KDF_CTX *kctx = EVP_KDF_CTX_new(kdf); | 
					
						
							| 
									
										
										
										
											2018-09-20 04:23:45 +08:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2019-09-27 19:26:22 +08:00
										 |  |  | The output length of the SSHKDF derivation is specified via the I<keylen> | 
					
						
							| 
									
										
										
										
											2019-10-05 01:40:14 +08:00
										 |  |  | parameter to the L<EVP_KDF_derive(3)> function. | 
					
						
							| 
									
										
										
										
											2019-10-05 05:09:19 +08:00
										 |  |  | Since the SSHKDF output length is variable, calling L<EVP_KDF_size(3)> | 
					
						
							| 
									
										
										
										
											2018-09-20 04:23:45 +08:00
										 |  |  | to obtain the requisite length is not meaningful. The caller must | 
					
						
							|  |  |  | allocate a buffer of the desired length, and pass that buffer to the | 
					
						
							| 
									
										
										
										
											2019-10-05 01:40:14 +08:00
										 |  |  | L<EVP_KDF_derive(3)> function along with the desired length. | 
					
						
							| 
									
										
										
										
											2018-09-20 04:23:45 +08:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2019-08-16 02:26:08 +08:00
										 |  |  | =head1 EXAMPLES | 
					
						
							| 
									
										
										
										
											2018-09-20 04:23:45 +08:00
										 |  |  | 
 | 
					
						
							|  |  |  | This example derives an 8 byte IV using SHA-256 with a 1K "key" and appropriate | 
					
						
							|  |  |  | "xcghash" and "session_id" values: | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2019-09-02 11:58:22 +08:00
										 |  |  |  EVP_KDF *kdf; | 
					
						
							| 
									
										
										
										
											2018-09-20 04:23:45 +08:00
										 |  |  |  EVP_KDF_CTX *kctx; | 
					
						
							|  |  |  |  unsigned char key[1024] = "01234..."; | 
					
						
							|  |  |  |  unsigned char xcghash[32] = "012345..."; | 
					
						
							|  |  |  |  unsigned char session_id[32] = "012345..."; | 
					
						
							|  |  |  |  unsigned char out[8]; | 
					
						
							|  |  |  |  size_t outlen = sizeof(out); | 
					
						
							| 
									
										
										
										
											2019-09-02 11:58:22 +08:00
										 |  |  |  OSSL_PARAM params[6], *p = params; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |  kdf = EVP_KDF_fetch(NULL, "SSHKDF", NULL); | 
					
						
							|  |  |  |  kctx = EVP_KDF_CTX_new(kdf); | 
					
						
							|  |  |  |  EVP_KDF_free(kdf); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |  *p++ = OSSL_PARAM_construct_utf8_string(OSSL_KDF_PARAM_DIGEST, | 
					
						
							|  |  |  |                                          SN_sha256, strlen(SN_sha256)); | 
					
						
							|  |  |  |  *p++ = OSSL_PARAM_construct_octet_string(OSSL_KDF_PARAM_KEY, | 
					
						
							|  |  |  |                                           key, (size_t)1024); | 
					
						
							|  |  |  |  *p++ = OSSL_PARAM_construct_octet_string(OSSL_KDF_PARAM_SSHKDF_XCGHASH, | 
					
						
							|  |  |  |                                           xcghash, (size_t)32); | 
					
						
							|  |  |  |  *p++ = OSSL_PARAM_construct_octet_string(OSSL_KDF_PARAM_SALT, | 
					
						
							|  |  |  |                                           session_id, (size_t)32); | 
					
						
							|  |  |  |  *p++ = OSSL_PARAM_construct_int(OSSL_KDF_PARAM_SSHKDF_TYPE, | 
					
						
							|  |  |  |                                  EVP_KDF_SSHKDF_TYPE_INITIAL_IV_CLI_TO_SRV); | 
					
						
							|  |  |  |  *p = OSSL_PARAM_construct_end(); | 
					
						
							| 
									
										
										
										
											2019-09-15 07:44:14 +08:00
										 |  |  |  if (EVP_KDF_CTX_set_params(kctx, params) <= 0) | 
					
						
							| 
									
										
										
										
											2018-09-20 04:23:45 +08:00
										 |  |  |      /* Error */ | 
					
						
							| 
									
										
										
										
											2019-09-02 11:58:22 +08:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2018-09-20 04:23:45 +08:00
										 |  |  |  if (EVP_KDF_derive(kctx, out, &outlen) <= 0) | 
					
						
							|  |  |  |      /* Error */ | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | =head1 CONFORMING TO | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | RFC 4253 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | =head1 SEE ALSO | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2019-09-17 06:44:15 +08:00
										 |  |  | L<EVP_KDF(3)>, | 
					
						
							|  |  |  | L<EVP_KDF_CTX_new(3)>, | 
					
						
							|  |  |  | L<EVP_KDF_CTX_free(3)>, | 
					
						
							|  |  |  | L<EVP_KDF_CTX_set_params(3)>, | 
					
						
							|  |  |  | L<EVP_KDF_size(3)>, | 
					
						
							|  |  |  | L<EVP_KDF_derive(3)>, | 
					
						
							| 
									
										
										
										
											2019-09-02 11:58:22 +08:00
										 |  |  | L<EVP_KDF(3)/PARAMETERS> | 
					
						
							| 
									
										
										
										
											2018-09-20 04:23:45 +08:00
										 |  |  | 
 | 
					
						
							|  |  |  | =head1 COPYRIGHT | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2020-05-15 21:09:49 +08:00
										 |  |  | Copyright 2016-2020 The OpenSSL Project Authors. All Rights Reserved. | 
					
						
							| 
									
										
										
										
											2018-09-20 04:23:45 +08:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2020-04-27 12:59:50 +08:00
										 |  |  | Licensed under the Apache License 2.0 (the "License").  You may not use | 
					
						
							| 
									
										
										
										
											2018-09-20 04:23:45 +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 | 
					
						
							|  |  |  | 
 |