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:
parent
2f475d6aaf
commit
4b4f6b9d7f
@ -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()
|
||||||
|
@ -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;
|
||||||
}
|
}
|
||||||
|
Loading…
Reference in New Issue
Block a user