Spanify CRYPT_SHA384* and CRYPT_SHA512*
Follow-on from
https://pdfium-review.googlesource.com/c/pdfium/+/120671
Bug: 422711176
Change-Id: I2644a0c0369e1e508090b46341fd71648d782877
Reviewed-on: https://pdfium-review.googlesource.com/c/pdfium/+/120790
Reviewed-by: Lei Zhang <thestig@chromium.org>
Reviewed-by: Thomas Sepez <tsepez@google.com>
Commit-Queue: Tom Sepez <tsepez@chromium.org>
diff --git a/core/fdrm/fx_crypt_sha.cpp b/core/fdrm/fx_crypt_sha.cpp
index eb429ab..33faec5 100644
--- a/core/fdrm/fx_crypt_sha.cpp
+++ b/core/fdrm/fx_crypt_sha.cpp
@@ -296,7 +296,8 @@
0x5fcb6fab3ad6faecULL, 0x6c44198c4a475817ULL,
});
-void sha384_process(CRYPT_sha2_context* ctx, const uint8_t data[128]) {
+void sha384_process(CRYPT_sha2_context* ctx,
+ pdfium::span<const uint8_t, 128> data) {
std::array<uint64_t, 80> W;
SHA_GET_UINT64(W[0], data, 0);
SHA_GET_UINT64(W[1], data, 8);
@@ -513,40 +514,39 @@
}
void CRYPT_SHA384Update(CRYPT_sha2_context* context,
- const uint8_t* data,
- uint32_t size) {
- if (!size)
+ pdfium::span<const uint8_t> data) {
+ if (data.empty()) {
return;
-
+ }
+ const auto buffer_span = pdfium::make_span(context->buffer);
uint32_t left = context->total_bytes & 0x7F;
uint32_t fill = 128 - left;
- context->total_bytes += size;
- if (left && size >= fill) {
- UNSAFE_TODO(FXSYS_memcpy(context->buffer + left, data, fill));
- sha384_process(context, context->buffer);
- size -= fill;
- UNSAFE_TODO(data += fill);
+ context->total_bytes += data.size();
+ if (left && data.size() >= fill) {
+ fxcrt::spancpy(buffer_span.subspan(left), data.first(fill));
+ sha384_process(context, buffer_span);
+ data = data.subspan(fill);
left = 0;
}
- while (size >= 128) {
+ while (data.size() >= 128) {
sha384_process(context, data);
- size -= 128;
- UNSAFE_TODO(data += 128);
+ data = data.subspan(128);
}
- if (size) {
- UNSAFE_TODO(FXSYS_memcpy(context->buffer + left, data, size));
+ if (!data.empty()) {
+ fxcrt::spancpy(buffer_span.subspan(left), data);
}
}
-void CRYPT_SHA384Finish(CRYPT_sha2_context* context, uint8_t digest[48]) {
+void CRYPT_SHA384Finish(CRYPT_sha2_context* context,
+ pdfium::span<uint8_t, 48> digest) {
uint8_t msglen[16];
uint64_t total_bits = 8 * context->total_bytes; // Prior to padding.
SHA_PUT_UINT64(0ULL, msglen, 0);
SHA_PUT_UINT64(total_bits, msglen, 8);
uint32_t last = context->total_bytes & 0x7F;
uint32_t padn = (last < 112) ? (112 - last) : (240 - last);
- CRYPT_SHA384Update(context, kSha384Padding, padn);
- CRYPT_SHA384Update(context, msglen, 16);
+ CRYPT_SHA384Update(context, pdfium::make_span(kSha384Padding).first(padn));
+ CRYPT_SHA384Update(context, msglen);
SHA_PUT_UINT64(context->state[0], digest, 0);
SHA_PUT_UINT64(context->state[1], digest, 8);
SHA_PUT_UINT64(context->state[2], digest, 16);
@@ -555,12 +555,11 @@
SHA_PUT_UINT64(context->state[5], digest, 40);
}
-void CRYPT_SHA384Generate(const uint8_t* data,
- uint32_t size,
- uint8_t digest[48]) {
+void CRYPT_SHA384Generate(pdfium::span<const uint8_t> data,
+ pdfium::span<uint8_t, 48> digest) {
CRYPT_sha2_context context;
CRYPT_SHA384Start(&context);
- CRYPT_SHA384Update(&context, data, size);
+ CRYPT_SHA384Update(&context, data);
CRYPT_SHA384Finish(&context, digest);
}
@@ -578,20 +577,20 @@
}
void CRYPT_SHA512Update(CRYPT_sha2_context* context,
- const uint8_t* data,
- uint32_t size) {
- CRYPT_SHA384Update(context, data, size);
+ pdfium::span<const uint8_t> data) {
+ CRYPT_SHA384Update(context, data);
}
-void CRYPT_SHA512Finish(CRYPT_sha2_context* context, uint8_t digest[64]) {
+void CRYPT_SHA512Finish(CRYPT_sha2_context* context,
+ pdfium::span<uint8_t, 64> digest) {
uint8_t msglen[16];
uint64_t total_bits = 8 * context->total_bytes;
SHA_PUT_UINT64(0ULL, msglen, 0);
SHA_PUT_UINT64(total_bits, msglen, 8);
uint32_t last = context->total_bytes & 0x7F;
uint32_t padn = (last < 112) ? (112 - last) : (240 - last);
- CRYPT_SHA512Update(context, kSha384Padding, padn);
- CRYPT_SHA512Update(context, msglen, 16);
+ CRYPT_SHA512Update(context, pdfium::make_span(kSha384Padding).first(padn));
+ CRYPT_SHA512Update(context, msglen);
SHA_PUT_UINT64(context->state[0], digest, 0);
SHA_PUT_UINT64(context->state[1], digest, 8);
SHA_PUT_UINT64(context->state[2], digest, 16);
@@ -602,11 +601,10 @@
SHA_PUT_UINT64(context->state[7], digest, 56);
}
-void CRYPT_SHA512Generate(const uint8_t* data,
- uint32_t size,
- uint8_t digest[64]) {
+void CRYPT_SHA512Generate(pdfium::span<const uint8_t> data,
+ pdfium::span<uint8_t, 64> digest) {
CRYPT_sha2_context context;
CRYPT_SHA512Start(&context);
- CRYPT_SHA512Update(&context, data, size);
+ CRYPT_SHA512Update(&context, data);
CRYPT_SHA512Finish(&context, digest);
}
diff --git a/core/fdrm/fx_crypt_sha.h b/core/fdrm/fx_crypt_sha.h
index b4af2a1..4e08e1a 100644
--- a/core/fdrm/fx_crypt_sha.h
+++ b/core/fdrm/fx_crypt_sha.h
@@ -44,20 +44,18 @@
void CRYPT_SHA384Start(CRYPT_sha2_context* context);
void CRYPT_SHA384Update(CRYPT_sha2_context* context,
- const uint8_t* data,
- uint32_t size);
-void CRYPT_SHA384Finish(CRYPT_sha2_context* context, uint8_t digest[48]);
-void CRYPT_SHA384Generate(const uint8_t* data,
- uint32_t size,
- uint8_t digest[48]);
+ pdfium::span<const uint8_t> data);
+void CRYPT_SHA384Finish(CRYPT_sha2_context* context,
+ pdfium::span<uint8_t, 48> digest);
+void CRYPT_SHA384Generate(pdfium::span<const uint8_t> data,
+ pdfium::span<uint8_t, 48> digest);
void CRYPT_SHA512Start(CRYPT_sha2_context* context);
void CRYPT_SHA512Update(CRYPT_sha2_context* context,
- const uint8_t* data,
- uint32_t size);
-void CRYPT_SHA512Finish(CRYPT_sha2_context* context, uint8_t digest[64]);
-void CRYPT_SHA512Generate(const uint8_t* data,
- uint32_t size,
- uint8_t digest[64]);
+ pdfium::span<const uint8_t> data);
+void CRYPT_SHA512Finish(CRYPT_sha2_context* context,
+ pdfium::span<uint8_t, 64> digest);
+void CRYPT_SHA512Generate(pdfium::span<const uint8_t> data,
+ pdfium::span<uint8_t, 64> digest);
#endif // CORE_FDRM_FX_CRYPT_SHA_H_
diff --git a/core/fdrm/fx_crypt_unittest.cpp b/core/fdrm/fx_crypt_unittest.cpp
index 4a4d0b6..aa19922 100644
--- a/core/fdrm/fx_crypt_unittest.cpp
+++ b/core/fdrm/fx_crypt_unittest.cpp
@@ -492,8 +492,7 @@
TEST(FXCRYPT, Sha384Empty) {
static const char kInput[] = "";
uint8_t actual[48];
- CRYPT_SHA384Generate(reinterpret_cast<const uint8_t*>(kInput), strlen(kInput),
- actual);
+ CRYPT_SHA384Generate(ByteStringView(kInput).unsigned_span(), actual);
EXPECT_THAT(
actual,
ElementsAre(0x38, 0xb0, 0x60, 0xa7, 0x51, 0xac, 0x96, 0x38, 0x4c, 0xd9,
@@ -508,8 +507,7 @@
static const char kInput[] =
"This is a simple test. To see whether it is getting correct value.";
uint8_t actual[48];
- CRYPT_SHA384Generate(reinterpret_cast<const uint8_t*>(kInput), strlen(kInput),
- actual);
+ CRYPT_SHA384Generate(ByteStringView(kInput).unsigned_span(), actual);
EXPECT_THAT(
actual,
ElementsAre(0x95, 0x54, 0xff, 0xd3, 0x89, 0xf0, 0xd6, 0x42, 0xe9, 0x33,
@@ -526,8 +524,7 @@
"aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa";
uint8_t actual[48];
EXPECT_EQ(112u, strlen(kInput));
- CRYPT_SHA384Generate(reinterpret_cast<const uint8_t*>(kInput), strlen(kInput),
- actual);
+ CRYPT_SHA384Generate(ByteStringView(kInput).unsigned_span(), actual);
EXPECT_THAT(
actual,
ElementsAre(0x18, 0x7d, 0x4e, 0x07, 0xcb, 0x30, 0x61, 0x03, 0xc6, 0x99,
@@ -540,8 +537,7 @@
TEST(FXCRYPT, Sha512Empty) {
static const char kInput[] = "";
uint8_t actual[64];
- CRYPT_SHA512Generate(reinterpret_cast<const uint8_t*>(kInput), strlen(kInput),
- actual);
+ CRYPT_SHA512Generate(ByteStringView(kInput).unsigned_span(), actual);
EXPECT_THAT(
actual,
ElementsAre(0xcf, 0x83, 0xe1, 0x35, 0x7e, 0xef, 0xb8, 0xbd, 0xf1, 0x54,
@@ -558,8 +554,7 @@
static const char kInput[] =
"This is a simple test. To see whether it is getting correct value.";
uint8_t actual[64];
- CRYPT_SHA512Generate(reinterpret_cast<const uint8_t*>(kInput), strlen(kInput),
- actual);
+ CRYPT_SHA512Generate(ByteStringView(kInput).unsigned_span(), actual);
EXPECT_THAT(
actual,
ElementsAre(0x86, 0xB5, 0x05, 0x63, 0xA2, 0x6F, 0xD6, 0xFA, 0xEB, 0x9B,
@@ -578,8 +573,7 @@
"aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa";
EXPECT_EQ(112u, strlen(kInput));
uint8_t actual[64];
- CRYPT_SHA512Generate(reinterpret_cast<const uint8_t*>(kInput), strlen(kInput),
- actual);
+ CRYPT_SHA512Generate(ByteStringView(kInput).unsigned_span(), actual);
EXPECT_THAT(
actual,
ElementsAre(0xc0, 0x1d, 0x08, 0x0e, 0xfd, 0x49, 0x27, 0x76, 0xa1, 0xc4,
diff --git a/core/fpdfapi/parser/cpdf_security_handler.cpp b/core/fpdfapi/parser/cpdf_security_handler.cpp
index 28d76aa..25b8645 100644
--- a/core/fpdfapi/parser/cpdf_security_handler.cpp
+++ b/core/fpdfapi/parser/cpdf_security_handler.cpp
@@ -175,11 +175,9 @@
if (iHash == 0) {
CRYPT_SHA256Generate(encrypted_output_span, inter_digest);
} else if (iHash == 1) {
- CRYPT_SHA384Generate(encrypted_output_span.data(),
- encrypted_output_span.size(), input);
+ CRYPT_SHA384Generate(encrypted_output_span, inter_digest);
} else if (iHash == 2) {
- CRYPT_SHA512Generate(encrypted_output_span.data(),
- encrypted_output_span.size(), input);
+ CRYPT_SHA512Generate(encrypted_output_span, inter_digest);
}
key = input;
iv = UNSAFE_TODO(input + 16);