From 5eadb54e26e239429e8b4fe18897781f2321738a Mon Sep 17 00:00:00 2001 From: Laszlo Ersek Date: Sat, 31 Mar 2018 17:06:39 +0200 Subject: [PATCH] CryptoPkg/TlsLib: use binary search in the TlsGetCipherMapping() function Improve the performance of the TlsGetCipherMapping() function by adopting the binary search from DhcpFindOptionFormat() [MdeModulePkg/Universal/Network/Dhcp4Dxe/Dhcp4Option.c]. Cc: Jiaxin Wu Cc: Qin Long Cc: Siyuan Fu Cc: Ting Ye Ref: https://bugzilla.tianocore.org/show_bug.cgi?id=915 Contributed-under: TianoCore Contribution Agreement 1.1 Signed-off-by: Laszlo Ersek Reviewed-by: Long Qin Reviewed-by: Jiaxin Wu --- CryptoPkg/Library/TlsLib/TlsConfig.c | 36 ++++++++++++++++++---------- 1 file changed, 23 insertions(+), 13 deletions(-) diff --git a/CryptoPkg/Library/TlsLib/TlsConfig.c b/CryptoPkg/Library/TlsLib/TlsConfig.c index 507489386b..c1d91a5994 100644 --- a/CryptoPkg/Library/TlsLib/TlsConfig.c +++ b/CryptoPkg/Library/TlsLib/TlsConfig.c @@ -30,6 +30,8 @@ typedef struct { // The mapping table between IANA/IETF Cipher Suite definitions and // OpenSSL-used Cipher Suite name. // +// Keep the table uniquely sorted by the IanaCipher field, in increasing order. +// STATIC CONST TLS_CIPHER_MAPPING TlsCipherMappingTable[] = { { 0x0001, "NULL-MD5" }, /// TLS_RSA_WITH_NULL_MD5 { 0x0002, "NULL-SHA" }, /// TLS_RSA_WITH_NULL_SHA @@ -71,22 +73,30 @@ TlsGetCipherMapping ( IN UINT16 CipherId ) { - CONST TLS_CIPHER_MAPPING *CipherEntry; - UINTN TableSize; - UINTN Index; - - CipherEntry = TlsCipherMappingTable; - TableSize = sizeof (TlsCipherMappingTable) / sizeof (TLS_CIPHER_MAPPING); + INTN Left; + INTN Right; + INTN Middle; // - // Search Cipher Mapping Table for IANA-OpenSSL Cipher Translation + // Binary Search Cipher Mapping Table for IANA-OpenSSL Cipher Translation // - for (Index = 0; Index < TableSize; Index++, CipherEntry++) { - // - // Translate IANA cipher suite name to OpenSSL name. - // - if (CipherEntry->IanaCipher == CipherId) { - return CipherEntry; + Left = 0; + Right = ARRAY_SIZE (TlsCipherMappingTable) - 1; + + while (Right >= Left) { + Middle = (Left + Right) / 2; + + if (CipherId == TlsCipherMappingTable[Middle].IanaCipher) { + // + // Translate IANA cipher suite ID to OpenSSL name. + // + return &TlsCipherMappingTable[Middle]; + } + + if (CipherId < TlsCipherMappingTable[Middle].IanaCipher) { + Right = Middle - 1; + } else { + Left = Middle + 1; } } -- 2.39.2