46 #if defined(OPENSSL_WINDOWS)
50 #elif defined(OPENSSL_APPLE)
56 #include "../crypto/ec_extra/internal.h"
57 #include "../crypto/fipsmodule/ec/internal.h"
58 #include "../crypto/internal.h"
59 #include "../crypto/trust_token/internal.h"
83 size_t bytes_per_call)
const {
87 printf(
"Did %u %s operations in %uus (%.1f ops/sec): %.1f MB/s\n",
90 static_cast<double>(bytes_per_call *
num_calls) /
us);
96 size_t bytes_per_call = 0)
const {
101 printf(
"{\"description\": \"%s\", \"numCalls\": %u, \"microseconds\": %u",
104 if (bytes_per_call > 0) {
105 printf(
", \"bytesPerCall\": %zu", bytes_per_call);
120 #if defined(OPENSSL_WINDOWS)
122 #elif defined(OPENSSL_APPLE)
127 gettimeofday(&tv, NULL);
136 clock_gettime(CLOCK_MONOTONIC, &ts);
140 ret += ts.tv_nsec / 1000;
153 unsigned done = 0, iterations_between_time_checks;
161 iterations_between_time_checks = 250;
164 iterations_between_time_checks =
165 static_cast<double>(100000) /
static_cast<double>(delta);
166 if (iterations_between_time_checks > 1000) {
167 iterations_between_time_checks = 1000;
168 }
else if (iterations_between_time_checks < 1) {
169 iterations_between_time_checks = 1;
174 for (
unsigned i = 0;
i < iterations_between_time_checks;
i++) {
193 if (!selected.empty() && selected.find(
"RSA") == std::string::npos) {
197 static const struct {
200 const size_t key_len;
209 bssl::UniquePtr<RSA>
key(
211 if (
key ==
nullptr) {
212 fprintf(
stderr,
"Failed to parse %s key.\n",
name.c_str());
218 const uint8_t fake_sha256_hash[32] = {0};
223 [&
key, &sig, &fake_sha256_hash, &sig_len]() ->
bool {
228 sig.get(), &sig_len,
key.get());
230 fprintf(
stderr,
"RSA_sign failed.\n");
237 [&
key, &fake_sha256_hash, &sig, sig_len]() ->
bool {
239 NID_sha256, fake_sha256_hash,
sizeof(fake_sha256_hash),
240 sig.get(), sig_len,
key.get());
242 fprintf(
stderr,
"RSA_verify failed.\n");
249 [&
key, &fake_sha256_hash, &sig, sig_len]() ->
bool {
255 bssl::UniquePtr<RSA> verify_key(
RSA_new());
261 if (!verify_key->n ||
266 sizeof(fake_sha256_hash), sig.get(), sig_len,
269 fprintf(
stderr,
"RSA_verify failed.\n");
277 kRSAKeys[
i].
key, kRSAKeys[
i].key_len)) !=
nullptr;
279 fprintf(
stderr,
"Failed to parse %s key.\n",
name.c_str());
291 if (selected !=
"RSAKeyGen") {
295 bssl::UniquePtr<BIGNUM> e(
BN_new());
300 const std::vector<int> kSizes = {2048, 3072, 4096};
301 for (
int size : kSizes) {
303 unsigned num_calls = 0;
305 std::vector<unsigned> durations;
308 bssl::UniquePtr<RSA> rsa(
RSA_new());
312 fprintf(
stderr,
"RSA_generate_key_ex failed.\n");
319 durations.push_back(iteration_end - iteration_start);
321 us = iteration_end -
start;
322 if (us > 30 * 1000000 ) {
327 std::sort(durations.begin(), durations.end());
332 const size_t n = durations.size();
345 unsigned min = durations[0];
346 unsigned median =
n & 1 ? durations[
n / 2]
347 : (durations[
n / 2 - 1] + durations[
n / 2]) / 2;
348 unsigned max = durations[
n - 1];
358 snprintf(
buf,
sizeof(
buf),
" (%zu byte%s)", chunk_len,
359 chunk_len != 1 ?
"s" :
"");
364 size_t chunk_len,
size_t ad_len,
369 bssl::ScopedEVP_AEAD_CTX
ctx;
374 std::unique_ptr<uint8_t[]>
key(
new uint8_t[key_len]);
376 std::unique_ptr<uint8_t[]> nonce(
new uint8_t[nonce_len]);
382 std::unique_ptr<uint8_t[]> out_storage(
384 std::unique_ptr<uint8_t[]> in2_storage(
386 std::unique_ptr<uint8_t[]> ad(
new uint8_t[ad_len]);
388 std::unique_ptr<uint8_t[]> tag_storage(
407 fprintf(
stderr,
"Failed to create EVP_AEAD_CTX.\n");
415 [chunk_len, nonce_len, ad_len, overhead_len,
in,
out,
tag,
416 &
ctx, &nonce, &ad]() ->
bool {
419 ctx.get(),
out,
tag, &tag_len, overhead_len,
420 nonce.get(), nonce_len,
in, chunk_len,
nullptr, 0,
423 fprintf(
stderr,
"EVP_AEAD_CTX_seal failed.\n");
430 nonce.get(), nonce_len,
in, chunk_len, ad.get(), ad_len);
436 fprintf(
stderr,
"Failed to create EVP_AEAD_CTX.\n");
442 [chunk_len, overhead_len, nonce_len, ad_len, in2,
out,
443 out_len, &
ctx, &nonce, &ad]() ->
bool {
448 chunk_len + overhead_len,
449 nonce.get(), nonce_len,
out,
450 out_len, ad.get(), ad_len);
452 fprintf(
stderr,
"EVP_AEAD_CTX_open failed.\n");
465 if (!selected.empty() &&
name.find(selected) == std::string::npos) {
479 if (!selected.empty() &&
name.find(selected) == std::string::npos) {
494 if (!selected.empty() &&
name.find(selected) == std::string::npos) {
498 static const uint8_t kZero[32] = {0};
506 fprintf(
stderr,
"AES_set_encrypt_key failed.\n");
523 fprintf(
stderr,
"AES_encrypt failed.\n");
535 fprintf(
stderr,
"AES_set_decrypt_key failed.\n");
552 fprintf(
stderr,
"AES_decrypt failed.\n");
563 bssl::ScopedEVP_MD_CTX
ctx;
566 if (chunk_len >
sizeof(
scratch)) {
580 fprintf(
stderr,
"EVP_DigestInit_ex failed.\n");
591 if (!selected.empty() &&
name.find(selected) == std::string::npos) {
607 if (chunk_len >
sizeof(
scratch)) {
625 if (!selected.empty() && selected !=
"RNG") {
640 if (!selected.empty() &&
name.find(selected) == std::string::npos) {
653 if (peer_value_len == 0) {
656 std::unique_ptr<uint8_t[]> peer_value(
new uint8_t[peer_value_len]);
660 if (peer_value_len == 0) {
675 bssl::UniquePtr<BIGNUM>
x(
BN_new());
676 if (!
point || !peer_point || !
ctx || !
x ||
678 peer_value_len,
ctx.get()) ||
682 nullptr,
ctx.get())) {
697 if (!selected.empty() &&
name.find(selected) == std::string::npos) {
717 return ECDSA_sign(0, digest,
sizeof(digest), signature, &sig_len,
726 return ECDSA_verify(0, digest,
sizeof(digest), signature, sig_len,
752 if (!selected.empty() && selected.find(
"25519") == std::string::npos) {
767 results.Print(
"Ed25519 key generation");
769 static const uint8_t kMessage[] = {0, 1, 2, 3, 4, 5};
773 return ED25519_sign(signature, kMessage,
sizeof(kMessage),
779 results.Print(
"Ed25519 signing");
785 fprintf(
stderr,
"Ed25519 verify failed.\n");
789 results.Print(
"Ed25519 verify");
797 fprintf(
stderr,
"Curve25519 base-point multiplication failed.\n");
801 results.Print(
"Curve25519 base-point multiplication");
811 fprintf(
stderr,
"Curve25519 arbitrary point multiplication failed.\n");
815 results.Print(
"Curve25519 arbitrary point multiplication");
821 if (!selected.empty() && selected.find(
"SPAKE2") == std::string::npos) {
827 static const uint8_t kAliceName[] = {
'A'};
828 static const uint8_t kBobName[] = {
'B'};
831 kAliceName,
sizeof(kAliceName), kBobName,
834 size_t alice_msg_len;
839 fprintf(
stderr,
"SPAKE2_generate_msg failed.\n");
845 kBobName,
sizeof(kBobName), kAliceName,
846 sizeof(kAliceName)));
848 size_t bob_msg_len, bob_key_len;
853 sizeof(bob_key), alice_msg, alice_msg_len)) {
859 fprintf(
stderr,
"SPAKE2 failed.\n");
862 results.Print(
"SPAKE2 over Ed25519");
868 if (!selected.empty() && selected.find(
"scrypt") == std::string::npos) {
874 static const char kPassword[] =
"password";
875 static const uint8_t kSalt[] =
"NaCl";
880 sizeof(kSalt) - 1, 1024, 8, 16, 0 ,
883 fprintf(
stderr,
"scrypt failed.\n");
886 results.Print(
"scrypt (N = 1024, r = 8, p = 16)");
891 sizeof(kSalt) - 1, 16384, 8, 1, 0 ,
894 fprintf(
stderr,
"scrypt failed.\n");
897 results.Print(
"scrypt (N = 16384, r = 8, p = 1)");
903 if (!selected.empty() && selected !=
"HRSS") {
916 fprintf(
stderr,
"Failed to time HRSS_generate_key.\n");
920 results.Print(
"HRSS generate");
937 fprintf(
stderr,
"Failed to time HRSS_encap.\n");
947 fprintf(
stderr,
"Failed to time HRSS_encap.\n");
957 if (!selected.empty() && selected.find(
"hashtocurve") == std::string::npos) {
964 static const uint8_t kLabel[] =
"label";
977 fprintf(
stderr,
"hash-to-curve failed.\n");
980 results.Print(
"hash-to-curve P384_XMD:SHA-512_SSWU_RO_");
987 fprintf(
stderr,
"hash-to-scalar failed.\n");
990 results.Print(
"hash-to-scalar P384_XMD:SHA-512");
997 if (!selected.empty() && selected.find(
"base64") == std::string::npos) {
1001 static const char kInput[] =
1002 "MIIDtTCCAp2gAwIBAgIJALW2IrlaBKUhMA0GCSqGSIb3DQEBCwUAMEUxCzAJBgNV"
1003 "BAYTAkFVMRMwEQYDVQQIEwpTb21lLVN0YXRlMSEwHwYDVQQKExhJbnRlcm5ldCBX"
1004 "aWRnaXRzIFB0eSBMdGQwHhcNMTYwNzA5MDQzODA5WhcNMTYwODA4MDQzODA5WjBF"
1005 "MQswCQYDVQQGEwJBVTETMBEGA1UECBMKU29tZS1TdGF0ZTEhMB8GA1UEChMYSW50"
1006 "ZXJuZXQgV2lkZ2l0cyBQdHkgTHRkMIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIB"
1007 "CgKCAQEAugvahBkSAUF1fC49vb1bvlPrcl80kop1iLpiuYoz4Qptwy57+EWssZBc"
1008 "HprZ5BkWf6PeGZ7F5AX1PyJbGHZLqvMCvViP6pd4MFox/igESISEHEixoiXCzepB"
1009 "rhtp5UQSjHD4D4hKtgdMgVxX+LRtwgW3mnu/vBu7rzpr/DS8io99p3lqZ1Aky+aN"
1010 "lcMj6MYy8U+YFEevb/V0lRY9oqwmW7BHnXikm/vi6sjIS350U8zb/mRzYeIs2R65"
1011 "LUduTL50+UMgat9ocewI2dv8aO9Dph+8NdGtg8LFYyTTHcUxJoMr1PTOgnmET19W"
1012 "JH4PrFwk7ZE1QJQQ1L4iKmPeQistuQIDAQABo4GnMIGkMB0GA1UdDgQWBBT5m6Vv"
1013 "zYjVYHG30iBE+j2XDhUE8jB1BgNVHSMEbjBsgBT5m6VvzYjVYHG30iBE+j2XDhUE"
1014 "8qFJpEcwRTELMAkGA1UEBhMCQVUxEzARBgNVBAgTClNvbWUtU3RhdGUxITAfBgNV"
1015 "BAoTGEludGVybmV0IFdpZGdpdHMgUHR5IEx0ZIIJALW2IrlaBKUhMAwGA1UdEwQF"
1016 "MAMBAf8wDQYJKoZIhvcNAQELBQADggEBAD7Jg68SArYWlcoHfZAB90Pmyrt5H6D8"
1017 "LRi+W2Ri1fBNxREELnezWJ2scjl4UMcsKYp4Pi950gVN+62IgrImcCNvtb5I1Cfy"
1018 "/MNNur9ffas6X334D0hYVIQTePyFk3umI+2mJQrtZZyMPIKSY/sYGQHhGGX6wGK+"
1019 "GO/og0PQk/Vu6D+GU2XRnDV0YZg1lsAsHd21XryK6fDmNkEMwbIWrts4xc7scRrG"
1020 "HWy+iMf6/7p/Ak/SIicM4XSwmlQ8pPxAZPr+E2LoVd9pMpWUwpW2UbtO5wsGTrY5"
1021 "sO45tFNN/y+jtUheB1C2ijObG/tXELaiyCdM+S/waeuv0MXtI4xnn1A=";
1023 std::vector<uint8_t>
out(strlen(
kInput));
1031 fprintf(
stderr,
"base64 decode failed.\n");
1050 if (!selected.empty() && selected.find(
"trusttoken") == std::string::npos) {
1058 size_t priv_key_len, pub_key_len;
1063 fprintf(
stderr,
"TRUST_TOKEN_generate_key failed.\n");
1068 bssl::UniquePtr<TRUST_TOKEN_CLIENT>
client(
1070 bssl::UniquePtr<TRUST_TOKEN_ISSUER> issuer(
1074 size_t priv_key_len, pub_key_len, key_index;
1075 if (!
client || !issuer ||
1082 fprintf(
stderr,
"failed to generate trust token key.\n");
1088 bssl::UniquePtr<EVP_PKEY> priv(
1090 bssl::UniquePtr<EVP_PKEY> pub(
1092 if (!priv || !pub) {
1093 fprintf(
stderr,
"failed to generate trust token SRR key.\n");
1100 RAND_bytes(metadata_key,
sizeof(metadata_key));
1102 sizeof(metadata_key))) {
1103 fprintf(
stderr,
"failed to generate trust token metadata key.\n");
1111 &msg_len, batchsize);
1114 sk_TRUST_TOKEN_PRETOKEN_pop_free(
client->pretokens,
1116 client->pretokens = sk_TRUST_TOKEN_PRETOKEN_new_null();
1119 fprintf(
stderr,
"TRUST_TOKEN_CLIENT_begin_issuance failed.\n");
1128 fprintf(
stderr,
"TRUST_TOKEN_CLIENT_begin_issuance failed.\n");
1131 bssl::UniquePtr<uint8_t> free_issue_msg(issue_msg);
1134 sk_TRUST_TOKEN_PRETOKEN_deep_copy(
client->pretokens,
1140 size_t resp_len, tokens_issued;
1142 &tokens_issued, issue_msg, msg_len,
1149 fprintf(
stderr,
"TRUST_TOKEN_ISSUER_issue failed.\n");
1155 size_t resp_len, tokens_issued;
1157 &tokens_issued, issue_msg, msg_len,
1160 fprintf(
stderr,
"TRUST_TOKEN_ISSUER_issue failed.\n");
1163 bssl::UniquePtr<uint8_t> free_issue_resp(issue_resp);
1169 issue_resp, resp_len));
1172 client->pretokens = sk_TRUST_TOKEN_PRETOKEN_deep_copy(
1177 fprintf(
stderr,
"TRUST_TOKEN_CLIENT_finish_issuance failed.\n");
1185 if (!tokens || sk_TRUST_TOKEN_num(tokens.get()) < 1) {
1186 fprintf(
stderr,
"TRUST_TOKEN_CLIENT_finish_issuance failed.\n");
1190 const TRUST_TOKEN *token = sk_TRUST_TOKEN_value(tokens.get(), 0);
1192 const uint8_t kClientData[] =
"\x70TEST CLIENT DATA";
1193 uint64_t kRedemptionTime = 13374242;
1197 size_t redeem_msg_len;
1199 client.get(), &redeem_msg, &redeem_msg_len, token, kClientData,
1200 sizeof(kClientData) - 1, kRedemptionTime);
1204 fprintf(
stderr,
"TRUST_TOKEN_CLIENT_begin_redemption failed.\n");
1210 size_t redeem_msg_len;
1212 client.get(), &redeem_msg, &redeem_msg_len, token, kClientData,
1213 sizeof(kClientData) - 1, kRedemptionTime)) {
1214 fprintf(
stderr,
"TRUST_TOKEN_CLIENT_begin_redemption failed.\n");
1217 bssl::UniquePtr<uint8_t> free_redeem_msg(redeem_msg);
1221 size_t redeem_resp_len;
1224 size_t client_data_len;
1227 issuer.get(), &redeem_resp, &redeem_resp_len, &rtoken, &client_data,
1228 &client_data_len, &redemption_time, redeem_msg, redeem_msg_len,
1235 fprintf(
stderr,
"TRUST_TOKEN_ISSUER_redeem failed.\n");
1241 size_t redeem_resp_len;
1244 size_t client_data_len;
1247 &rtoken, &client_data, &client_data_len,
1248 &redemption_time, redeem_msg, redeem_msg_len,
1250 fprintf(
stderr,
"TRUST_TOKEN_ISSUER_redeem failed.\n");
1253 bssl::UniquePtr<uint8_t> free_redeem_resp(redeem_resp);
1254 bssl::UniquePtr<uint8_t> free_client_data(client_data);
1255 bssl::UniquePtr<TRUST_TOKEN> free_rtoken(rtoken);
1258 uint8_t *srr = NULL, *sig = NULL;
1259 size_t srr_len, sig_len;
1261 client.get(), &srr, &srr_len, &sig, &sig_len, redeem_resp,
1267 fprintf(
stderr,
"TRUST_TOKEN_CLIENT_finish_redemption failed.\n");
1275 #if defined(BORINGSSL_FIPS)
1276 static bool SpeedSelfTest(
const std::string &selected) {
1277 if (!selected.empty() && selected.find(
"self-test") == std::string::npos) {
1283 fprintf(
stderr,
"BORINGSSL_self_test faileid.\n");
1297 "A filter on the speed tests to run",
1302 "The number of seconds to run each test for (default is 1)",
1307 "A comma-separated list of input sizes to run tests at (default is "
1308 "16,256,1350,8192,16384)",
1313 "If this flag is set, speed will print the output of each benchmark in "
1314 "JSON format as follows: \"{\"description\": "
1315 "\"descriptionOfOperation\", \"numCalls\": 1234, "
1316 "\"timeInMicroseconds\": 1234567, \"bytesPerCall\": 1234}\". When "
1317 "there is no information about the bytes per call for an operation, "
1318 "the JSON field for bytesPerCall will be omitted.",
1328 std::map<std::string, std::string> args_map;
1335 if (args_map.count(
"-filter") != 0) {
1336 selected = args_map[
"-filter"];
1339 if (args_map.count(
"-json") != 0) {
1343 if (args_map.count(
"-timeout") != 0) {
1347 if (args_map.count(
"-chunks") != 0) {
1349 const char *
start = args_map[
"-chunks"].data();
1350 const char *
end =
start + args_map[
"-chunks"].size();
1354 unsigned long long val = strtoull(
start, &
ptr, 10);
1357 static_cast<size_t>(val) != val) {
1358 fprintf(
stderr,
"Error parsing -chunks argument\n");
1364 if (*
start !=
',') {
1365 fprintf(
stderr,
"Error parsing -chunks argument\n");
1375 static const size_t kTLSADLen = 13;
1380 static const size_t kLegacyADLen = kTLSADLen - 2;
1391 kLegacyADLen, selected) ||
1393 kLegacyADLen, selected) ||
1395 kLegacyADLen, selected) ||
1397 kLegacyADLen, selected) ||
1399 kLegacyADLen, selected) ||
1409 kTLSADLen, selected) ||
1440 #if defined(BORINGSSL_FIPS)
1441 if (!SpeedSelfTest(selected)) {