ACVP: update other cases of memcpying into ints. Change-Id: Ie49296f5998227e4157e3cf5afb84cedd90febc3 Reviewed-on: https://boringssl-review.googlesource.com/c/boringssl/+/97847 Presubmit-BoringSSL-Verified: boringssl-scoped@luci-project-accounts.iam.gserviceaccount.com <boringssl-scoped@luci-project-accounts.iam.gserviceaccount.com> Commit-Queue: Adam Langley <agl@google.com> Reviewed-by: David Benjamin <davidben@google.com>
diff --git a/util/fipstools/acvp/modulewrapper/modulewrapper.cc b/util/fipstools/acvp/modulewrapper/modulewrapper.cc index 8fffbac..217da01 100644 --- a/util/fipstools/acvp/modulewrapper/modulewrapper.cc +++ b/util/fipstools/acvp/modulewrapper/modulewrapper.cc
@@ -1013,17 +1013,13 @@ } static uint32_t GetIterations(const Span<const uint8_t> iterations_bytes) { - uint32_t iterations; - if (iterations_bytes.size() != sizeof(iterations)) { - LOG_ERROR( - "Expected %u-byte input for number of iterations, but found %u " - "bytes.\n", - static_cast<unsigned>(sizeof(iterations)), - static_cast<unsigned>(iterations_bytes.size())); + if (iterations_bytes.size() != sizeof(uint32_t)) { + LOG_ERROR("Iteration count value is %u bytes, not a uint32_t\n", + static_cast<unsigned>(iterations_bytes.size())); abort(); } - memcpy(&iterations, iterations_bytes.data(), sizeof(iterations)); + const uint32_t iterations = CRYPTO_load_u32_le(iterations_bytes.data()); if (iterations == 0 || iterations == UINT32_MAX) { LOG_ERROR("Invalid number of iterations: %x.\n", static_cast<unsigned>(iterations)); @@ -1146,7 +1142,7 @@ static bool AESGCMSetup(EVP_AEAD_CTX *ctx, Span<const uint8_t> tag_len_span, Span<const uint8_t> key) { if (tag_len_span.size() != sizeof(uint32_t)) { - LOG_ERROR("Tag size value is %u bytes, not an uint32_t\n", + LOG_ERROR("Tag size value is %u bytes, not a uint32_t\n", static_cast<unsigned>(tag_len_span.size())); return false; } @@ -1183,7 +1179,7 @@ Span<const uint8_t> tag_len_span, Span<const uint8_t> key) { if (tag_len_span.size() != sizeof(uint32_t)) { - LOG_ERROR("Tag size value is %u bytes, not an uint32_t\n", + LOG_ERROR("Tag size value is %u bytes, not a uint32_t\n", static_cast<unsigned>(tag_len_span.size())); return false; } @@ -1216,13 +1212,12 @@ static bool AESCCMSetup(EVP_AEAD_CTX *ctx, Span<const uint8_t> tag_len_span, Span<const uint8_t> key) { - uint32_t tag_len_32; - if (tag_len_span.size() != sizeof(tag_len_32)) { - LOG_ERROR("Tag size value is %u bytes, not an uint32_t\n", + if (tag_len_span.size() != sizeof(uint32_t)) { + LOG_ERROR("Tag size value is %u bytes, not a uint32_t\n", static_cast<unsigned>(tag_len_span.size())); return false; } - memcpy(&tag_len_32, tag_len_span.data(), sizeof(tag_len_32)); + const uint32_t tag_len_32 = CRYPTO_load_u32_le(tag_len_span.data()); const EVP_AEAD *aead; switch (tag_len_32) { case 4: @@ -1652,8 +1647,7 @@ nonce = args[7]; } - uint32_t out_len; - if (out_len_bytes.size() != sizeof(out_len) || + if (out_len_bytes.size() != sizeof(uint32_t) || entropy.size() < CTR_DRBG_MIN_ENTROPY_LEN || entropy.size() > CTR_DRBG_MAX_ENTROPY_LEN || (!reseed_entropy.empty() && @@ -1662,7 +1656,7 @@ (nonce.size() != CTR_DRBG_NONCE_LEN && nonce.size() != 0)) { return false; } - memcpy(&out_len, out_len_bytes.data(), sizeof(out_len)); + const uint32_t out_len = CRYPTO_load_u32_le(out_len_bytes.data()); if (out_len > (1 << 24)) { return false; } @@ -1859,11 +1853,10 @@ return false; } - uint32_t mac_len; - if (args[0].size() != sizeof(mac_len)) { + if (args[0].size() != sizeof(uint32_t)) { return false; } - memcpy(&mac_len, args[0].data(), sizeof(mac_len)); + const uint32_t mac_len = CRYPTO_load_u32_le(args[0].data()); if (mac_len != sizeof(mac)) { return false; } @@ -1910,11 +1903,10 @@ static bool RSAKeyGen(const Span<const uint8_t> args[], ReplyCallback write_reply) { - uint32_t bits; - if (args[0].size() != sizeof(bits)) { + if (args[0].size() != sizeof(uint32_t)) { return false; } - memcpy(&bits, args[0].data(), sizeof(bits)); + const uint32_t bits = CRYPTO_load_u32_le(args[0].data()); UniquePtr<RSA> key(RSA_new()); if (!RSA_generate_key_fips(key.get(), bits, nullptr)) { @@ -1938,11 +1930,10 @@ template <const EVP_MD *(MDFunc)(), bool UsePSS> static bool RSASigGen(const Span<const uint8_t> args[], ReplyCallback write_reply) { - uint32_t bits; - if (args[0].size() != sizeof(bits)) { + if (args[0].size() != sizeof(uint32_t)) { return false; } - memcpy(&bits, args[0].data(), sizeof(bits)); + const uint32_t bits = CRYPTO_load_u32_le(args[0].data()); const Span<const uint8_t> msg = args[1]; RSA *const key = GetRSAKey(bits); @@ -1956,11 +1947,10 @@ std::vector<uint8_t> sig(RSA_size(key)); size_t sig_len; if (UsePSS) { - uint32_t salt_len; - if (args[2].size() != sizeof(salt_len)) { + if (args[2].size() != sizeof(uint32_t)) { return false; } - memcpy(&salt_len, args[2].data(), sizeof(salt_len)); + const uint32_t salt_len = CRYPTO_load_u32_le(args[2].data()); if (salt_len != digest_len) { LOG_ERROR("PSS salt length %u does not match digest length %u.\n", static_cast<unsigned>(salt_len), @@ -2033,11 +2023,10 @@ const Span<const uint8_t> seed2 = args[4]; const EVP_MD *md = MDFunc(); - uint32_t out_len; - if (out_len_bytes.size() != sizeof(out_len)) { - return 0; + if (out_len_bytes.size() != sizeof(uint32_t)) { + return false; } - memcpy(&out_len, out_len_bytes.data(), sizeof(out_len)); + const uint32_t out_len = CRYPTO_load_u32_le(out_len_bytes.data()); std::vector<uint8_t> out(size_t{out_len}); if (!CRYPTO_tls1_prf(md, out.data(), out.size(), secret.data(), secret.size(),