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);