1
0
mirror of https://github.com/gnss-sdr/gnss-sdr synced 2024-12-14 12:10:34 +00:00

Fix CMAC-AES with GnuTLS

This commit is contained in:
Carles Fernandez 2024-07-01 22:43:54 +02:00
parent 2f475d6aaf
commit 4b4f6b9d7f
No known key found for this signature in database
GPG Key ID: 4C583C52B0C3877D
2 changed files with 37 additions and 5 deletions

View File

@ -119,6 +119,9 @@ else()
if("${gnutls_gnutls_file_contents}" MATCHES "#define GNUTLS_VERSION_MAJOR 2") if("${gnutls_gnutls_file_contents}" MATCHES "#define GNUTLS_VERSION_MAJOR 2")
set(GNUTLS_HMAC_INIT_WITH_DIGEST TRUE) set(GNUTLS_HMAC_INIT_WITH_DIGEST TRUE)
endif() endif()
if("${gnutls_gnutls_file_contents}" MATCHES "GNUTLS_MAC_AES_CMAC_128")
set(GNUTLS_MAC_AES_CMAC_128 TRUE)
endif()
file(READ "${GNUTLS_INCLUDE_DIR}/gnutls/abstract.h" gnutls_abstract_file_contents) file(READ "${GNUTLS_INCLUDE_DIR}/gnutls/abstract.h" gnutls_abstract_file_contents)
if("${gnutls_abstract_file_contents}" MATCHES "gnutls_pubkey_export2") if("${gnutls_abstract_file_contents}" MATCHES "gnutls_pubkey_export2")
set(GNUTLS_PUBKEY_EXPORT2 TRUE) set(GNUTLS_PUBKEY_EXPORT2 TRUE)
@ -184,5 +187,8 @@ function(link_to_crypto_dependencies target)
if(GNUTLS_HMAC_INIT_WITH_DIGEST) if(GNUTLS_HMAC_INIT_WITH_DIGEST)
target_compile_definitions(${target} PRIVATE -DHAVE_GNUTLS_HMAC_INIT_WITH_DIGEST=1) target_compile_definitions(${target} PRIVATE -DHAVE_GNUTLS_HMAC_INIT_WITH_DIGEST=1)
endif() endif()
if(GNUTLS_MAC_AES_CMAC_128)
target_compile_definitions(${target} PRIVATE -DHAVE_GNUTLS_MAC_AES_CMAC_128=1)
endif()
endif() endif()
endfunction() endfunction()

View File

@ -436,7 +436,32 @@ std::vector<uint8_t> Gnss_Crypto::computeCMAC_AES(const std::vector<uint8_t>& ke
{ {
std::vector<uint8_t> output(16); std::vector<uint8_t> output(16);
#if USE_GNUTLS_FALLBACK #if USE_GNUTLS_FALLBACK
// CMAC-AES not implemented in GnuTLS #if HAVE_GNUTLS_MAC_AES_CMAC_128
gnutls_hmac_hd_t hmac;
// Initialize the HMAC context with the CMAC algorithm and key
int ret = gnutls_hmac_init(&hmac, GNUTLS_MAC_AES_CMAC_128, key.data(), key.size());
if (ret != GNUTLS_E_SUCCESS)
{
LOG(INFO) << "OSNMA CMAC-AES: gnutls_hmac_init failed: " << gnutls_strerror(ret);
return output;
}
// Update the HMAC context with the input data
ret = gnutls_hmac(hmac, input.data(), input.size());
if (ret != GNUTLS_E_SUCCESS)
{
LOG(INFO) << "OSNMA CMAC-AES: gnutls_hmac failed: " << gnutls_strerror(ret);
gnutls_hmac_deinit(hmac, nullptr);
return output;
}
// Retrieve the HMAC output
gnutls_hmac_output(hmac, output.data());
// Clean up the HMAC context
gnutls_hmac_deinit(hmac, nullptr);
#else
if (!key.empty()) if (!key.empty())
{ {
// do nothing // do nothing
@ -445,6 +470,7 @@ std::vector<uint8_t> Gnss_Crypto::computeCMAC_AES(const std::vector<uint8_t>& ke
{ {
// do nothing // do nothing
} }
#endif
#else // OpenSSL #else // OpenSSL
#if USE_OPENSSL_3 #if USE_OPENSSL_3
std::vector<uint8_t> aux(EVP_MAX_MD_SIZE); // CMAC-AES output size std::vector<uint8_t> aux(EVP_MAX_MD_SIZE); // CMAC-AES output size
@ -515,7 +541,7 @@ std::vector<uint8_t> Gnss_Crypto::computeCMAC_AES(const std::vector<uint8_t>& ke
} }
// Initialize the CMAC context with the key and cipher // Initialize the CMAC context with the key and cipher
if (1 != CMAC_Init(cmacCtx, key.data(), key.size(), EVP_aes_128_cbc(), nullptr)) if (CMAC_Init(cmacCtx, key.data(), key.size(), EVP_aes_128_cbc(), nullptr) != 1)
{ {
LOG(INFO) << "OSNMA CMAC-AES: MAC_Init failed"; LOG(INFO) << "OSNMA CMAC-AES: MAC_Init failed";
CMAC_CTX_free(cmacCtx); CMAC_CTX_free(cmacCtx);
@ -523,7 +549,7 @@ std::vector<uint8_t> Gnss_Crypto::computeCMAC_AES(const std::vector<uint8_t>& ke
} }
// Compute the CMAC // Compute the CMAC
if (1 != CMAC_Update(cmacCtx, input.data(), input.size())) if (CMAC_Update(cmacCtx, input.data(), input.size()) != 1)
{ {
LOG(INFO) << "OSNMA CMAC-AES: CMAC_Update failed"; LOG(INFO) << "OSNMA CMAC-AES: CMAC_Update failed";
CMAC_CTX_free(cmacCtx); CMAC_CTX_free(cmacCtx);
@ -531,9 +557,9 @@ std::vector<uint8_t> Gnss_Crypto::computeCMAC_AES(const std::vector<uint8_t>& ke
} }
// Finalize the CMAC computation and retrieve the output // Finalize the CMAC computation and retrieve the output
if (1 != CMAC_Final(cmacCtx, output.data(), &mac_length)) if (CMAC_Final(cmacCtx, output.data(), &mac_length) != 1)
{ {
LOG(INFO) << "OSNMA CMAC-AES:CMAC_Final failed"; LOG(INFO) << "OSNMA CMAC-AES: CMAC_Final failed";
CMAC_CTX_free(cmacCtx); CMAC_CTX_free(cmacCtx);
return output; return output;
} }