1 /* 2 * Copyright 2018-2020 The OpenSSL Project Authors. All Rights Reserved. 3 * 4 * Licensed under the Apache License 2.0 (the "License"). You may not use 5 * this file except in compliance with the License. You can obtain a copy 6 * in the file LICENSE in the source distribution or at 7 * https://www.openssl.org/source/license.html 8 */ 9 10 #include "ssl_local.h" 11 #include "internal/ktls.h" 12 13 #if defined(__FreeBSD__) 14 # include <crypto/cryptodev.h> 15 16 /*- 17 * Check if a given cipher is supported by the KTLS interface. 18 * The kernel might still fail the setsockopt() if no suitable 19 * provider is found, but this checks if the socket option 20 * supports the cipher suite used at all. 21 */ 22 int ktls_check_supported_cipher(const SSL *s, const EVP_CIPHER *c, 23 const EVP_CIPHER_CTX *dd) 24 { 25 26 switch (s->version) { 27 case TLS1_VERSION: 28 case TLS1_1_VERSION: 29 case TLS1_2_VERSION: 30 case TLS1_3_VERSION: 31 break; 32 default: 33 return 0; 34 } 35 36 switch (s->s3->tmp.new_cipher->algorithm_enc) { 37 case SSL_AES128GCM: 38 case SSL_AES256GCM: 39 return 1; 40 case SSL_AES128: 41 case SSL_AES256: 42 if (s->ext.use_etm) 43 return 0; 44 switch (s->s3->tmp.new_cipher->algorithm_mac) { 45 case SSL_SHA1: 46 case SSL_SHA256: 47 case SSL_SHA384: 48 return 1; 49 default: 50 return 0; 51 } 52 default: 53 return 0; 54 } 55 } 56 57 /* Function to configure kernel TLS structure */ 58 int ktls_configure_crypto(const SSL *s, const EVP_CIPHER *c, EVP_CIPHER_CTX *dd, 59 void *rl_sequence, ktls_crypto_info_t *crypto_info, 60 unsigned char **rec_seq, unsigned char *iv, 61 unsigned char *key, unsigned char *mac_key, 62 size_t mac_secret_size) 63 { 64 memset(crypto_info, 0, sizeof(*crypto_info)); 65 switch (s->s3->tmp.new_cipher->algorithm_enc) { 66 case SSL_AES128GCM: 67 case SSL_AES256GCM: 68 crypto_info->cipher_algorithm = CRYPTO_AES_NIST_GCM_16; 69 if (s->version == TLS1_3_VERSION) 70 crypto_info->iv_len = EVP_CIPHER_CTX_iv_length(dd); 71 else 72 crypto_info->iv_len = EVP_GCM_TLS_FIXED_IV_LEN; 73 break; 74 case SSL_AES128: 75 case SSL_AES256: 76 switch (s->s3->tmp.new_cipher->algorithm_mac) { 77 case SSL_SHA1: 78 crypto_info->auth_algorithm = CRYPTO_SHA1_HMAC; 79 break; 80 case SSL_SHA256: 81 crypto_info->auth_algorithm = CRYPTO_SHA2_256_HMAC; 82 break; 83 case SSL_SHA384: 84 crypto_info->auth_algorithm = CRYPTO_SHA2_384_HMAC; 85 break; 86 default: 87 return 0; 88 } 89 crypto_info->cipher_algorithm = CRYPTO_AES_CBC; 90 crypto_info->iv_len = EVP_CIPHER_iv_length(c); 91 crypto_info->auth_key = mac_key; 92 crypto_info->auth_key_len = mac_secret_size; 93 break; 94 default: 95 return 0; 96 } 97 crypto_info->cipher_key = key; 98 crypto_info->cipher_key_len = EVP_CIPHER_key_length(c); 99 crypto_info->iv = iv; 100 crypto_info->tls_vmajor = (s->version >> 8) & 0x000000ff; 101 crypto_info->tls_vminor = (s->version & 0x000000ff); 102 # ifdef TCP_RXTLS_ENABLE 103 memcpy(crypto_info->rec_seq, rl_sequence, sizeof(crypto_info->rec_seq)); 104 if (rec_seq != NULL) 105 *rec_seq = crypto_info->rec_seq; 106 # else 107 if (rec_seq != NULL) 108 *rec_seq = NULL; 109 # endif 110 return 1; 111 }; 112 113 #endif /* __FreeBSD__ */ 114 115 #if defined(OPENSSL_SYS_LINUX) 116 117 /* Function to check supported ciphers in Linux */ 118 int ktls_check_supported_cipher(const SSL *s, const EVP_CIPHER *c, 119 const EVP_CIPHER_CTX *dd) 120 { 121 switch (s->version) { 122 case TLS1_2_VERSION: 123 case TLS1_3_VERSION: 124 break; 125 default: 126 return 0; 127 } 128 129 /* check that cipher is AES_GCM_128, AES_GCM_256, AES_CCM_128 */ 130 switch (EVP_CIPHER_nid(c)) 131 { 132 # ifdef OPENSSL_KTLS_AES_CCM_128 133 case NID_aes_128_ccm: 134 if (EVP_CIPHER_CTX_tag_length(dd) != EVP_CCM_TLS_TAG_LEN) 135 return 0; 136 # endif 137 # ifdef OPENSSL_KTLS_AES_GCM_128 138 case NID_aes_128_gcm: 139 # endif 140 # ifdef OPENSSL_KTLS_AES_GCM_256 141 case NID_aes_256_gcm: 142 # endif 143 return 1; 144 default: 145 return 0; 146 } 147 } 148 149 /* Function to configure kernel TLS structure */ 150 int ktls_configure_crypto(const SSL *s, const EVP_CIPHER *c, EVP_CIPHER_CTX *dd, 151 void *rl_sequence, ktls_crypto_info_t *crypto_info, 152 unsigned char **rec_seq, unsigned char *iv, 153 unsigned char *key, unsigned char *mac_key, 154 size_t mac_secret_size) 155 { 156 unsigned char geniv[12]; 157 unsigned char *iiv = iv; 158 159 if (s->version == TLS1_2_VERSION && 160 EVP_CIPHER_mode(c) == EVP_CIPH_GCM_MODE) { 161 EVP_CIPHER_CTX_ctrl(dd, EVP_CTRL_GET_IV, 162 EVP_GCM_TLS_FIXED_IV_LEN + EVP_GCM_TLS_EXPLICIT_IV_LEN, 163 geniv); 164 iiv = geniv; 165 } 166 167 memset(crypto_info, 0, sizeof(*crypto_info)); 168 switch (EVP_CIPHER_nid(c)) 169 { 170 # ifdef OPENSSL_KTLS_AES_GCM_128 171 case NID_aes_128_gcm: 172 crypto_info->gcm128.info.cipher_type = TLS_CIPHER_AES_GCM_128; 173 crypto_info->gcm128.info.version = s->version; 174 crypto_info->tls_crypto_info_len = sizeof(crypto_info->gcm128); 175 memcpy(crypto_info->gcm128.iv, iiv + EVP_GCM_TLS_FIXED_IV_LEN, 176 TLS_CIPHER_AES_GCM_128_IV_SIZE); 177 memcpy(crypto_info->gcm128.salt, iiv, TLS_CIPHER_AES_GCM_128_SALT_SIZE); 178 memcpy(crypto_info->gcm128.key, key, EVP_CIPHER_key_length(c)); 179 memcpy(crypto_info->gcm128.rec_seq, rl_sequence, 180 TLS_CIPHER_AES_GCM_128_REC_SEQ_SIZE); 181 if (rec_seq != NULL) 182 *rec_seq = crypto_info->gcm128.rec_seq; 183 return 1; 184 # endif 185 # ifdef OPENSSL_KTLS_AES_GCM_256 186 case NID_aes_256_gcm: 187 crypto_info->gcm256.info.cipher_type = TLS_CIPHER_AES_GCM_256; 188 crypto_info->gcm256.info.version = s->version; 189 crypto_info->tls_crypto_info_len = sizeof(crypto_info->gcm256); 190 memcpy(crypto_info->gcm256.iv, iiv + EVP_GCM_TLS_FIXED_IV_LEN, 191 TLS_CIPHER_AES_GCM_256_IV_SIZE); 192 memcpy(crypto_info->gcm256.salt, iiv, TLS_CIPHER_AES_GCM_256_SALT_SIZE); 193 memcpy(crypto_info->gcm256.key, key, EVP_CIPHER_key_length(c)); 194 memcpy(crypto_info->gcm256.rec_seq, rl_sequence, 195 TLS_CIPHER_AES_GCM_256_REC_SEQ_SIZE); 196 if (rec_seq != NULL) 197 *rec_seq = crypto_info->gcm256.rec_seq; 198 return 1; 199 # endif 200 # ifdef OPENSSL_KTLS_AES_CCM_128 201 case NID_aes_128_ccm: 202 crypto_info->ccm128.info.cipher_type = TLS_CIPHER_AES_CCM_128; 203 crypto_info->ccm128.info.version = s->version; 204 crypto_info->tls_crypto_info_len = sizeof(crypto_info->ccm128); 205 memcpy(crypto_info->ccm128.iv, iiv + EVP_CCM_TLS_FIXED_IV_LEN, 206 TLS_CIPHER_AES_CCM_128_IV_SIZE); 207 memcpy(crypto_info->ccm128.salt, iiv, TLS_CIPHER_AES_CCM_128_SALT_SIZE); 208 memcpy(crypto_info->ccm128.key, key, EVP_CIPHER_key_length(c)); 209 memcpy(crypto_info->ccm128.rec_seq, rl_sequence, 210 TLS_CIPHER_AES_CCM_128_REC_SEQ_SIZE); 211 if (rec_seq != NULL) 212 *rec_seq = crypto_info->ccm128.rec_seq; 213 return 1; 214 # endif 215 default: 216 return 0; 217 } 218 219 } 220 221 #endif /* OPENSSL_SYS_LINUX */ 222