Repository: randombit/botan
Pull request #2227 (2019-12-12 14:12:13)

Clean up handling of POWER ISA extensions
See #2226


Patch:
diff --git a/configure.py b/configure.py
index 028417a4b..3be4f4d78 100755
--- a/configure.py
+++ b/configure.py
@@ -343,15 +343,15 @@ def process_command_line(args): # pylint: disable=too-many-locals,too-many-state
     isa_extensions = [
         'SSE2', 'SSSE3', 'SSE4.1', 'SSE4.2', 'AVX2', 'BMI2', 'RDRAND', 'RDSEED',
         'AES-NI', 'SHA-NI',
-        'AltiVec', 'NEON', 'ARMv8Crypto']
+        'AltiVec', 'NEON', 'ARMv8 Crypto', 'POWER Crypto']
 
     for isa_extn_name in isa_extensions:
-        isa_extn = isa_extn_name.lower()
+        isa_extn = isa_extn_name.lower().replace(' ', '')
 
         target_group.add_option('--disable-%s' % (isa_extn),
                                 help='disable %s intrinsics' % (isa_extn_name),
                                 action='append_const',
-                                const=isa_extn.replace('-', '').replace('.', ''),
+                                const=isa_extn.replace('-', '').replace('.', '').replace(' ', ''),
                                 dest='disable_intrinsics')
 
     build_group = optparse.OptionGroup(parser, 'Build options')
diff --git a/src/build-data/arch/ppc64.txt b/src/build-data/arch/ppc64.txt
index 470bee2db..57a363c04 100644
--- a/src/build-data/arch/ppc64.txt
+++ b/src/build-data/arch/ppc64.txt
@@ -12,6 +12,5 @@ ppc64el
 
 <isa_extensions>
 altivec
-ppccrypto
-power9
+powercrypto
 </isa_extensions>
diff --git a/src/build-data/cc/gcc.txt b/src/build-data/cc/gcc.txt
index 4ff005bd5..a653fe47e 100644
--- a/src/build-data/cc/gcc.txt
+++ b/src/build-data/cc/gcc.txt
@@ -64,8 +64,7 @@ rdseed  -> "-mrdseed"
 sha     -> "-msha"
 altivec -> "-maltivec"
 
-ppccrypto -> "-mcrypto"
-power9    -> "-mcpu=power9"
+powercrypto -> "-mcrypto"
 
 arm64:armv8crypto -> ""
 arm64:armv8sm3 -> "-march=armv8.2-a+sm4"
diff --git a/src/lib/block/aes/aes.cpp b/src/lib/block/aes/aes.cpp
index 2813a5f5a..af7ec8f46 100644
--- a/src/lib/block/aes/aes.cpp
+++ b/src/lib/block/aes/aes.cpp
@@ -431,7 +431,7 @@ size_t aes_parallelism()
 #endif
 
 #if defined(BOTAN_HAS_AES_POWER8)
-   if(CPUID::has_ppc_crypto())
+   if(CPUID::has_power_crypto())
       {
       return 4;
       }
@@ -457,7 +457,7 @@ const char* aes_provider()
 #endif
 
 #if defined(BOTAN_HAS_AES_POWER8)
-   if(CPUID::has_ppc_crypto())
+   if(CPUID::has_power_crypto())
       {
       return "power8";
       }
@@ -509,7 +509,7 @@ void AES_128::encrypt_n(const uint8_t in[], uint8_t out[], size_t blocks) const
 #endif
 
 #if defined(BOTAN_HAS_AES_POWER8)
-   if(CPUID::has_ppc_crypto())
+   if(CPUID::has_power_crypto())
       {
       return power8_encrypt_n(in, out, blocks);
       }
@@ -544,7 +544,7 @@ void AES_128::decrypt_n(const uint8_t in[], uint8_t out[], size_t blocks) const
 #endif
 
 #if defined(BOTAN_HAS_AES_POWER8)
-   if(CPUID::has_ppc_crypto())
+   if(CPUID::has_power_crypto())
       {
       return power8_decrypt_n(in, out, blocks);
       }
@@ -577,7 +577,7 @@ void AES_128::key_schedule(const uint8_t key[], size_t length)
 #endif
 
 #if defined(BOTAN_HAS_AES_POWER8)
-   if(CPUID::has_ppc_crypto())
+   if(CPUID::has_power_crypto())
       {
       return aes_key_schedule(key, length, m_EK, m_DK, m_ME, m_MD);
       }
@@ -620,7 +620,7 @@ void AES_192::encrypt_n(const uint8_t in[], uint8_t out[], size_t blocks) const
 #endif
 
 #if defined(BOTAN_HAS_AES_POWER8)
-   if(CPUID::has_ppc_crypto())
+   if(CPUID::has_power_crypto())
       {
       return power8_encrypt_n(in, out, blocks);
       }
@@ -655,7 +655,7 @@ void AES_192::decrypt_n(const uint8_t in[], uint8_t out[], size_t blocks) const
 #endif
 
 #if defined(BOTAN_HAS_AES_POWER8)
-   if(CPUID::has_ppc_crypto())
+   if(CPUID::has_power_crypto())
       {
       return power8_decrypt_n(in, out, blocks);
       }
@@ -688,7 +688,7 @@ void AES_192::key_schedule(const uint8_t key[], size_t length)
 #endif
 
 #if defined(BOTAN_HAS_AES_POWER8)
-   if(CPUID::has_ppc_crypto())
+   if(CPUID::has_power_crypto())
       {
       return aes_key_schedule(key, length, m_EK, m_DK, m_ME, m_MD);
       }
@@ -731,7 +731,7 @@ void AES_256::encrypt_n(const uint8_t in[], uint8_t out[], size_t blocks) const
 #endif
 
 #if defined(BOTAN_HAS_AES_POWER8)
-   if(CPUID::has_ppc_crypto())
+   if(CPUID::has_power_crypto())
       {
       return power8_encrypt_n(in, out, blocks);
       }
@@ -766,7 +766,7 @@ void AES_256::decrypt_n(const uint8_t in[], uint8_t out[], size_t blocks) const
 #endif
 
 #if defined(BOTAN_HAS_AES_POWER8)
-   if(CPUID::has_ppc_crypto())
+   if(CPUID::has_power_crypto())
       {
       return power8_decrypt_n(in, out, blocks);
       }
@@ -799,7 +799,7 @@ void AES_256::key_schedule(const uint8_t key[], size_t length)
 #endif
 
 #if defined(BOTAN_HAS_AES_POWER8)
-   if(CPUID::has_ppc_crypto())
+   if(CPUID::has_power_crypto())
       {
       return aes_key_schedule(key, length, m_EK, m_DK, m_ME, m_MD);
       }
diff --git a/src/lib/block/aes/aes_power8/info.txt b/src/lib/block/aes/aes_power8/info.txt
index d02858bfc..df569edd5 100644
--- a/src/lib/block/aes/aes_power8/info.txt
+++ b/src/lib/block/aes/aes_power8/info.txt
@@ -7,5 +7,5 @@ ppc64
 </arch>
 
 <isa>
-ppccrypto
+powercrypto
 </isa>
diff --git a/src/lib/entropy/p9_darn/info.txt b/src/lib/entropy/p9_darn/info.txt
index 47d99aa3d..e703786f4 100644
--- a/src/lib/entropy/p9_darn/info.txt
+++ b/src/lib/entropy/p9_darn/info.txt
@@ -9,3 +9,7 @@ p9_darn.h
 <arch>
 ppc64
 </arch>
+
+<isa>
+powercrypto
+</isa>
diff --git a/src/lib/utils/cpuid/cpuid.cpp b/src/lib/utils/cpuid/cpuid.cpp
index 81fabf0a3..199feca66 100644
--- a/src/lib/utils/cpuid/cpuid.cpp
+++ b/src/lib/utils/cpuid/cpuid.cpp
@@ -55,7 +55,7 @@ std::string CPUID::to_string()
 
 #if defined(BOTAN_TARGET_CPU_IS_PPC_FAMILY)
    CPUID_PRINT(altivec);
-   CPUID_PRINT(ppc_crypto);
+   CPUID_PRINT(power_crypto);
    CPUID_PRINT(darn_rng);
 #endif
 
@@ -167,8 +167,8 @@ CPUID::bit_from_string(const std::string& tok)
 #elif defined(BOTAN_TARGET_CPU_IS_PPC_FAMILY)
    if(tok == "altivec" || tok == "simd")
       return {Botan::CPUID::CPUID_ALTIVEC_BIT};
-   if(tok == "ppc_crypto")
-      return {Botan::CPUID::CPUID_PPC_CRYPTO_BIT};
+   if(tok == "power_crypto")
+      return {Botan::CPUID::CPUID_POWER_CRYPTO_BIT};
 
 #elif defined(BOTAN_TARGET_CPU_IS_ARM_FAMILY)
    if(tok == "neon" || tok == "simd")
diff --git a/src/lib/utils/cpuid/cpuid.h b/src/lib/utils/cpuid/cpuid.h
index 84201b910..77b0c99f6 100644
--- a/src/lib/utils/cpuid/cpuid.h
+++ b/src/lib/utils/cpuid/cpuid.h
@@ -120,7 +120,7 @@ class BOTAN_PUBLIC_API(2,1) CPUID final
 
 #if defined(BOTAN_TARGET_CPU_IS_PPC_FAMILY)
          CPUID_ALTIVEC_BIT    = (1ULL << 0),
-         CPUID_PPC_CRYPTO_BIT = (1ULL << 1),
+         CPUID_POWER_CRYPTO_BIT = (1ULL << 1),
          CPUID_DARN_BIT       = (1ULL << 2),
 #endif
 
@@ -150,8 +150,8 @@ class BOTAN_PUBLIC_API(2,1) CPUID final
       /**
       * Check if the processor supports POWER8 crypto extensions
       */
-      static bool has_ppc_crypto()
-         { return has_cpuid_bit(CPUID_PPC_CRYPTO_BIT); }
+      static bool has_power_crypto()
+         { return has_cpuid_bit(CPUID_POWER_CRYPTO_BIT); }
 
       /**
       * Check if the processor supports POWER9 DARN RNG
diff --git a/src/lib/utils/cpuid/cpuid_ppc.cpp b/src/lib/utils/cpuid/cpuid_ppc.cpp
index 4fb24f24b..604b97947 100644
--- a/src/lib/utils/cpuid/cpuid_ppc.cpp
+++ b/src/lib/utils/cpuid/cpuid_ppc.cpp
@@ -72,7 +72,7 @@ uint64_t CPUID::CPUID_Data::detect_cpu_features(size_t* cache_line_size)
 
    const unsigned long hwcap_crypto = OS::get_auxval(PPC_hwcap_bit::ARCH_hwcap_crypto);
    if(hwcap_crypto & PPC_hwcap_bit::CRYPTO_bit)
-     detected_features |= CPUID::CPUID_PPC_CRYPTO_BIT;
+     detected_features |= CPUID::CPUID_POWER_CRYPTO_BIT;
    if(hwcap_crypto & PPC_hwcap_bit::DARN_bit)
      detected_features |= CPUID::CPUID_DARN_BIT;
 


Test patch:
diff --git a/src/tests/data/block/aes.vec b/src/tests/data/block/aes.vec
index f65c00b7c..8cd7f4d85 100644
--- a/src/tests/data/block/aes.vec
+++ b/src/tests/data/block/aes.vec
@@ -1,7 +1,7 @@
 # Test vectors from NIST CAVP AESAVS
 # http://csrc.nist.gov/groups/STM/cavp/documents/aes/AESAVS.pdf
 
-#test cpuid aesni armv8aes ppc_crypto ssse3 neon altivec
+#test cpuid aesni armv8aes power_crypto ssse3 neon altivec
 
 [AES-128]
 Key = 000102030405060708090A0B0C0D0E0F