bool Speed()

in tool/speed.cc [2747:3033]


bool Speed(const std::vector<std::string> &args) {
#if AWSLC_API_VERSION > 27
  OPENSSL_BEGIN_ALLOW_DEPRECATED
  // We started marking this as deprecated.
  EVP_MD_unstable_sha3_enable(true);
  OPENSSL_END_ALLOW_DEPRECATED
#elif AWSLC_API_VERSION > 16
  // For mainline AWS-LC this is a no-op, however if speed.cc built with an old
  // branch of AWS-LC SHA3 might be disabled by default and fail the benchmark.
  EVP_MD_unstable_sha3_enable(true);
#endif
  std::map<std::string, std::string> args_map;
  args_list_t extra_args;
  if (!ParseKeyValueArguments(args_map, extra_args, args, kArguments) ||
      extra_args.size() > 0) {
    PrintUsage(kArguments);
    return false;
  }

  if (args_map.count("-filter") != 0) {
    if (!parseCommaArgument(g_filters, args_map, "-filter")) {
      return false;
    }
  }

#if defined(DIT_OPTION)
  if (args_map.count("-dit") != 0) {
    g_dit = true;
  }
#endif

  if (args_map.count("-json") != 0) {
    g_print_json = true;
  }

  if (args_map.count("-timeout") != 0 && args_map.count("-timeout_ms") != 0) {
    puts("'-timeout' and '-timeout_ms' are mutually exclusive");
    PrintUsage(kArguments);
    return false;
  }

  if (args_map.count("-timeout") != 0) {
    int timeout = atoi(args_map["-timeout"].c_str());
    if (1 > timeout) {
      puts("'-timeout' must be positive");
      PrintUsage(kArguments);
      return false;
    }
    g_timeout_ms = ((uint64_t)timeout) * 1000;
  }

  if (args_map.count("-timeout_ms") != 0) {
    int timeout_ms = atoi(args_map["-timeout_ms"].c_str());
    if (1 > timeout_ms) {
      puts("'-timeout_ms' must be positive");
      PrintUsage(kArguments);
      return false;
    }
    g_timeout_ms = timeout_ms;
  }

  if (args_map.count("-chunks") != 0) {
    std::vector<std::string> chunkVector;
    if (!parseCommaArgument(chunkVector,
        args_map, "-chunks")) {
      return false;
    }
    if (!parseStringVectorToIntegerVector(chunkVector, g_chunk_lengths)) {
      return false;
    }
  }

  if (args_map.count("-threads") != 0) {
    std::vector<std::string> threadVector;
    if (!parseCommaArgument(threadVector,
                            args_map, "-threads")) {
      return false;
    }
    if (!parseStringVectorToIntegerVector(threadVector, g_threads)) {
      return false;
    }
  }

  if (args_map.count("-primes") != 0) {
    std::vector<std::string> primeVector;
    if (!parseCommaArgument(primeVector,
        args_map, "-primes")) {
      return false;
    }
    if (!parseStringVectorToIntegerVector(primeVector, g_prime_bit_lengths)) {
      return false;
    }
  }
#if defined(DIT_OPTION)
  armv8_disable_dit(); // disable DIT capability at run-time
  armv8_enable_dit();  // enable back DIT capability at run-time
  uint64_t original_dit = 0;
  if (g_dit)
  {
    original_dit = armv8_set_dit();
  }
#endif

  // kTLSADLen is the number of bytes of additional data that TLS passes to
  // AEADs.
  static const size_t kTLSADLen = 13;
#if !defined(OPENSSL_BENCHMARK)

  // kLegacyADLen is the number of bytes that TLS passes to the "legacy" AEADs.
  // These are AEADs that weren't originally defined as AEADs, but which we use
  // via the AEAD interface. In order for that to work, they have some TLS
  // knowledge in them and construct a couple of the AD bytes internally.
  static const size_t kLegacyADLen = kTLSADLen - 2;
#endif

#if defined(CMAKE_BUILD_TYPE_DEBUG)
  printf("Benchmarking in debug mode.\n");
#endif

  if (g_print_json) {
    puts("[");
  }

  for (std::string selected : g_filters) {
    if(!SpeedAESBlock("AES-128", 128, selected) ||
       !SpeedAESBlock("AES-192", 192, selected) ||
       !SpeedAESBlock("AES-256", 256, selected) ||
       !SpeedEvpCipherGeneric(EVP_aes_128_gcm(), "EVP-AES-128-GCM", kTLSADLen, selected) ||
       !SpeedEvpCipherGeneric(EVP_aes_192_gcm(), "EVP-AES-192-GCM", kTLSADLen, selected) ||
       !SpeedEvpCipherGeneric(EVP_aes_256_gcm(), "EVP-AES-256-GCM", kTLSADLen, selected) ||
       !SpeedEvpCipherGeneric(EVP_aes_128_ctr(), "EVP-AES-128-CTR", kTLSADLen, selected) ||
       !SpeedEvpCipherGeneric(EVP_aes_192_ctr(), "EVP-AES-192-CTR", kTLSADLen, selected) ||
       !SpeedEvpCipherGeneric(EVP_aes_256_ctr(), "EVP-AES-256-CTR", kTLSADLen, selected) ||
       !SpeedEvpCipherGeneric(EVP_aes_128_cbc(), "EVP-AES-128-CBC", kTLSADLen, selected) ||
       !SpeedEvpCipherGeneric(EVP_aes_192_cbc(), "EVP-AES-192-CBC", kTLSADLen, selected) ||
       !SpeedEvpCipherGeneric(EVP_aes_256_cbc(), "EVP-AES-256-CBC", kTLSADLen, selected) ||
       !SpeedAES256XTS("AES-256-XTS", selected) ||
#if !defined(OPENSSL_3_0_BENCHMARK)
       // OpenSSL 3.0 deprecated RC4
       !SpeedEvpCipherGeneric(EVP_rc4(), "EVP-RC4", kTLSADLen, selected) ||
#endif
#if !defined(OPENSSL_3_0_BENCHMARK)
       // OpenSSL 3.0 doesn't allow MD4 calls
       !SpeedHash(EVP_md4(), "MD4", selected) ||
#endif
       !SpeedHash(EVP_md5(), "MD5", selected) ||
       !SpeedHash(EVP_sha1(), "SHA-1", selected) ||
       !SpeedHash(EVP_sha224(), "SHA-224", selected) ||
       !SpeedHash(EVP_sha256(), "SHA-256", selected) ||
       !SpeedHash(EVP_sha384(), "SHA-384", selected) ||
       !SpeedHash(EVP_sha512(), "SHA-512", selected) ||
       // OpenSSL 1.0 and BoringSSL don't support SHA3.
#if (!defined(OPENSSL_1_0_BENCHMARK) && !defined(BORINGSSL_BENCHMARK) && !defined(OPENSSL_IS_AWSLC)) || AWSLC_API_VERSION > 16
       !SpeedHash(EVP_sha3_224(), "SHA3-224", selected) ||
       !SpeedHash(EVP_sha3_256(), "SHA3-256", selected) ||
       !SpeedHash(EVP_sha3_384(), "SHA3-384", selected) ||
       !SpeedHash(EVP_sha3_512(), "SHA3-512", selected) ||
#endif
#if (!defined(OPENSSL_1_0_BENCHMARK) && !defined(BORINGSSL_BENCHMARK) && !defined(OPENSSL_IS_AWSLC)) || AWSLC_API_VERSION >= 22
       // OpenSSL 1.0 and BoringSSL don't support SHAKE
       !SpeedHash(EVP_shake128(), "SHAKE-128", selected) ||
       !SpeedHash(EVP_shake256(), "SHAKE-256", selected) ||
#endif
#if (!defined(BORINGSSL_BENCHMARK) && !defined(OPENSSL_IS_AWSLC)) || AWSLC_API_VERSION >= 20
       // BoringSSL doesn't support ripemd160
       !SpeedHash(EVP_ripemd160(), "RIPEMD-160", selected) ||
#endif
#if !defined(OPENSSL_1_0_BENCHMARK)
       !SpeedHash(EVP_md5_sha1(), "MD5-SHA-1", selected) ||
#endif
       !SpeedHmac(EVP_md5(), "HMAC-MD5", selected) ||
       !SpeedHmac(EVP_sha1(), "HMAC-SHA1", selected) ||
       !SpeedHmac(EVP_sha256(), "HMAC-SHA256", selected) ||
       !SpeedHmac(EVP_sha384(), "HMAC-SHA384", selected) ||
       !SpeedHmac(EVP_sha512(), "HMAC-SHA512", selected) ||
       !SpeedHmacOneShot(EVP_md5(), "HMAC-MD5-OneShot", selected) ||
       !SpeedHmacOneShot(EVP_sha1(), "HMAC-SHA1-OneShot", selected) ||
       !SpeedHmacOneShot(EVP_sha256(), "HMAC-SHA256-OneShot", selected) ||
       !SpeedHmacOneShot(EVP_sha384(), "HMAC-SHA384-OneShot", selected) ||
       !SpeedHmacOneShot(EVP_sha512(), "HMAC-SHA512-OneShot", selected) ||
#if !defined(OPENSSL_1_0_BENCHMARK)
       !SpeedCmac(EVP_aes_128_cbc(), "CMAC-AES-128-CBC", selected) ||
       !SpeedCmac(EVP_aes_256_cbc(), "CMAC-AES-256-CBC", selected) ||
#endif
       !SpeedRandom(RAND_bytes, "RNG", selected) ||
       !SpeedECDH(selected) ||
       !SpeedECDSA(selected) ||
       !SpeedECKeyGen(selected) ||
       !SpeedECKeyGenerateKey(false, selected) ||
#if !defined(OPENSSL_1_0_BENCHMARK)
       // OpenSSL 1.0.2 is missing functions e.g. |EVP_PKEY_get0_EC_KEY| and
       // doesn't implement X255519 either.
       !SpeedEvpEcdh(selected) ||
       !SpeedECPOINT(selected) ||
       // OpenSSL 1.0 doesn't support Scrypt
       !SpeedScrypt(selected) ||
#endif
#if (!defined(OPENSSL_1_0_BENCHMARK) && !defined(BORINGSSL_BENCHMARK) && !defined(OPENSSL_IS_AWSLC)) || AWSLC_API_VERSION >= 24
        // BoringSSL doesn't support ChaCha through the EVP_CIPHER API,
        // OpenSSL 1.0 doesn't support ChaCha at all,
        // AWS-LC only after API version 24
       !SpeedEvpCipherGeneric(EVP_chacha20_poly1305(), "EVP-ChaCha20-Poly1305", kTLSADLen, selected) ||
#endif
#if (!defined(OPENSSL_1_0_BENCHMARK) && !defined(BORINGSSL_BENCHMARK) && !defined(OPENSSL_IS_AWSLC)) || AWSLC_API_VERSION >= 22
       // OpenSSL 1.0 and BoringSSL don't support DH_new_by_nid, NID_ffdhe2048, or NID_ffdhe4096
       !SpeedFFDH(selected) ||
#endif
       !SpeedRSA(selected) ||
       !SpeedRSAKeyGen(false, selected) ||
       !SpeedDHcheck(selected)
#if !defined(OPENSSL_BENCHMARK)
       ||
#if AWSLC_API_VERSION > 16
       !SpeedKEM(selected) ||
#endif
#if AWSLC_API_VERSION > 31
       !SpeedDigestSign(selected) ||
#endif
       !SpeedAEADSeal(EVP_aead_aes_128_gcm(), "AEAD-AES-128-GCM", kTLSADLen, selected) ||
       !SpeedAEADOpen(EVP_aead_aes_128_gcm(), "AEAD-AES-128-GCM", kTLSADLen, selected) ||
       !SpeedAEADSeal(EVP_aead_aes_256_gcm(), "AEAD-AES-256-GCM", kTLSADLen, selected) ||
       !SpeedAEADOpen(EVP_aead_aes_256_gcm(), "AEAD-AES-256-GCM", kTLSADLen, selected) ||
       !SpeedAEADSeal(EVP_aead_chacha20_poly1305(), "AEAD-ChaCha20-Poly1305", kTLSADLen, selected) ||
       !SpeedAEADSeal(EVP_aead_des_ede3_cbc_sha1_tls(), "AEAD-DES-EDE3-CBC-SHA1",kLegacyADLen, selected) ||
       !SpeedAEADSeal(EVP_aead_aes_128_cbc_sha1_tls(), "AEAD-AES-128-CBC-SHA1",kLegacyADLen, selected) ||
       !SpeedAEADSeal(EVP_aead_aes_256_cbc_sha1_tls(), "AEAD-AES-256-CBC-SHA1",kLegacyADLen, selected) ||
       !SpeedAEADOpen(EVP_aead_aes_128_cbc_sha1_tls(), "AEAD-AES-128-CBC-SHA1", kLegacyADLen, selected) ||
       !SpeedAEADOpen(EVP_aead_aes_256_cbc_sha1_tls(), "AEAD-AES-256-CBC-SHA1", kLegacyADLen, selected) ||
       !SpeedAEADSeal(EVP_aead_aes_128_gcm_siv(), "AEAD-AES-128-GCM-SIV",kTLSADLen, selected) ||
       !SpeedAEADSeal(EVP_aead_aes_256_gcm_siv(), "AEAD-AES-256-GCM-SIV",kTLSADLen, selected) ||
       !SpeedAEADOpen(EVP_aead_aes_128_gcm_siv(), "AEAD-AES-128-GCM-SIV", kTLSADLen, selected) ||
       !SpeedAEADOpen(EVP_aead_aes_256_gcm_siv(), "AEAD-AES-256-GCM-SIV", kTLSADLen, selected) ||
       !SpeedAEADSeal(EVP_aead_aes_128_ccm_bluetooth(),"AEAD-AES-128-CCM-Bluetooth", kTLSADLen, selected) ||
       !Speed25519(selected) ||
       !SpeedSPAKE2(selected) ||
       !SpeedRSAKeyGen(true, selected) ||
       !SpeedHRSS(selected) ||
       !SpeedHash(EVP_blake2b256(), "BLAKE2b-256", selected) ||
       !SpeedECKeyGenerateKey(true, selected) ||
#if defined(OPENSSL_IS_AWSLC)
       !SpeedRefcount(selected) ||
#endif
#if defined(INTERNAL_TOOL)
       !SpeedRandom(CRYPTO_sysrand, "CRYPTO_sysrand", selected) ||
       !SpeedRandom(CRYPTO_sysrand_for_seed, "CRYPTO_sysrand_for_seed", selected) ||
       !SpeedHashToCurve(selected) ||
       !SpeedTrustToken("TrustToken-Exp1-Batch1", TRUST_TOKEN_experiment_v1(), 1, selected) ||
       !SpeedTrustToken("TrustToken-Exp1-Batch10", TRUST_TOKEN_experiment_v1(), 10, selected) ||
       !SpeedTrustToken("TrustToken-Exp2VOfPRF-Batch1", TRUST_TOKEN_experiment_v2_voprf(), 1, selected) ||
       !SpeedTrustToken("TrustToken-Exp2VOPRF-Batch10", TRUST_TOKEN_experiment_v2_voprf(), 10, selected) ||
       !SpeedTrustToken("TrustToken-Exp2PMB-Batch1", TRUST_TOKEN_experiment_v2_pmb(), 1, selected) ||
       !SpeedTrustToken("TrustToken-Exp2PMB-Batch10", TRUST_TOKEN_experiment_v2_pmb(), 10, selected) ||
#endif
#if AWSLC_API_VERSION > 16
       !SpeedPKCS8(selected) ||
#endif
       !SpeedBase64(selected) ||
       !SpeedSipHash(selected)
#endif
       ) {
      return false;
    }

#if defined(AWSLC_FIPS)
    if (!SpeedSelfTest(selected)) {
      return false;
    }
#if defined(FIPS_ENTROPY_SOURCE_JITTER_CPU)
    if (!SpeedJitter(selected)) {
      return false;
    }
#endif
#endif
  }

  if (g_print_json) {
    puts("\n]");
  }

#if defined(DIT_OPTION  )
  if (g_dit)
  {
    armv8_restore_dit(&original_dit);
  }
#endif
  return true;
}