Use span arguments in fx_crypt md5 code

-- Remove GET/PUT macros in favor of byteorder.h functions

Change-Id: Ifa3303b053afbd5fd5eeb18419a10c01e7afa347
Reviewed-on: https://pdfium-review.googlesource.com/c/pdfium/+/120932
Reviewed-by: Tom Sepez <tsepez@google.com>
Commit-Queue: Tom Sepez <tsepez@chromium.org>
Reviewed-by: Lei Zhang <thestig@chromium.org>
diff --git a/core/fdrm/fx_crypt.cpp b/core/fdrm/fx_crypt.cpp
index 49f2a90..0320144 100644
--- a/core/fdrm/fx_crypt.cpp
+++ b/core/fdrm/fx_crypt.cpp
@@ -8,25 +8,10 @@
 
 #include <utility>
 
+#include "core/fxcrt/byteorder.h"
 #include "core/fxcrt/compiler_specific.h"
 #include "core/fxcrt/stl_util.h"
 
-#define GET_UINT32(n, b, i)                            \
-  UNSAFE_TODO({                                        \
-    (n) = (uint32_t)((uint8_t*)b)[(i)] |               \
-          (((uint32_t)((uint8_t*)b)[(i) + 1]) << 8) |  \
-          (((uint32_t)((uint8_t*)b)[(i) + 2]) << 16) | \
-          (((uint32_t)((uint8_t*)b)[(i) + 3]) << 24);  \
-  })
-
-#define PUT_UINT32(n, b, i)                                   \
-  UNSAFE_TODO({                                               \
-    (((uint8_t*)b)[(i)]) = (uint8_t)(((n)) & 0xFF);           \
-    (((uint8_t*)b)[(i) + 1]) = (uint8_t)(((n) >> 8) & 0xFF);  \
-    (((uint8_t*)b)[(i) + 2]) = (uint8_t)(((n) >> 16) & 0xFF); \
-    (((uint8_t*)b)[(i) + 3]) = (uint8_t)(((n) >> 24) & 0xFF); \
-  })
-
 namespace {
 
 const uint8_t md5_padding[64] = {
@@ -34,24 +19,24 @@
     0,    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
     0,    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0};
 
-void md5_process(CRYPT_md5_context* ctx, const uint8_t data[64]) {
+void md5_process(CRYPT_md5_context* ctx, pdfium::span<const uint8_t, 64> data) {
   uint32_t X[16];
-  GET_UINT32(X[0], data, 0);
-  GET_UINT32(X[1], data, 4);
-  GET_UINT32(X[2], data, 8);
-  GET_UINT32(X[3], data, 12);
-  GET_UINT32(X[4], data, 16);
-  GET_UINT32(X[5], data, 20);
-  GET_UINT32(X[6], data, 24);
-  GET_UINT32(X[7], data, 28);
-  GET_UINT32(X[8], data, 32);
-  GET_UINT32(X[9], data, 36);
-  GET_UINT32(X[10], data, 40);
-  GET_UINT32(X[11], data, 44);
-  GET_UINT32(X[12], data, 48);
-  GET_UINT32(X[13], data, 52);
-  GET_UINT32(X[14], data, 56);
-  GET_UINT32(X[15], data, 60);
+  X[0] = fxcrt::GetUInt32LSBFirst(data.subspan(0, 4));
+  X[1] = fxcrt::GetUInt32LSBFirst(data.subspan(4, 4));
+  X[2] = fxcrt::GetUInt32LSBFirst(data.subspan(8, 4));
+  X[3] = fxcrt::GetUInt32LSBFirst(data.subspan(12, 4));
+  X[4] = fxcrt::GetUInt32LSBFirst(data.subspan(16, 4));
+  X[5] = fxcrt::GetUInt32LSBFirst(data.subspan(20, 4));
+  X[6] = fxcrt::GetUInt32LSBFirst(data.subspan(24, 4));
+  X[7] = fxcrt::GetUInt32LSBFirst(data.subspan(28, 4));
+  X[8] = fxcrt::GetUInt32LSBFirst(data.subspan(32, 4));
+  X[9] = fxcrt::GetUInt32LSBFirst(data.subspan(36, 4));
+  X[10] = fxcrt::GetUInt32LSBFirst(data.subspan(40, 4));
+  X[11] = fxcrt::GetUInt32LSBFirst(data.subspan(44, 4));
+  X[12] = fxcrt::GetUInt32LSBFirst(data.subspan(48, 4));
+  X[13] = fxcrt::GetUInt32LSBFirst(data.subspan(52, 4));
+  X[14] = fxcrt::GetUInt32LSBFirst(data.subspan(56, 4));
+  X[15] = fxcrt::GetUInt32LSBFirst(data.subspan(60, 4));
   uint32_t A = ctx->state[0];
   uint32_t B = ctx->state[1];
   uint32_t C = ctx->state[2];
@@ -206,7 +191,7 @@
     left = 0;
   }
   while (data.size() >= 64) {
-    md5_process(context, data.data());
+    md5_process(context, data.first(64));
     data = data.subspan(64);
   }
   if (!data.empty()) {
@@ -214,21 +199,24 @@
   }
 }
 
-void CRYPT_MD5Finish(CRYPT_md5_context* context, uint8_t digest[16]) {
+void CRYPT_MD5Finish(CRYPT_md5_context* context,
+                     pdfium::span<uint8_t, 16> digest) {
   uint8_t msglen[8];
-  PUT_UINT32(context->total[0], msglen, 0);
-  PUT_UINT32(context->total[1], msglen, 4);
+  auto msglen_span = pdfium::make_span(msglen);
+  fxcrt::PutUInt32LSBFirst(context->total[0], msglen_span.subspan(0, 4));
+  fxcrt::PutUInt32LSBFirst(context->total[1], msglen_span.subspan(4, 4));
   uint32_t last = (context->total[0] >> 3) & 0x3F;
   uint32_t padn = (last < 56) ? (56 - last) : (120 - last);
   CRYPT_MD5Update(context, pdfium::make_span(md5_padding).first(padn));
   CRYPT_MD5Update(context, msglen);
-  PUT_UINT32(context->state[0], digest, 0);
-  PUT_UINT32(context->state[1], digest, 4);
-  PUT_UINT32(context->state[2], digest, 8);
-  PUT_UINT32(context->state[3], digest, 12);
+  fxcrt::PutUInt32LSBFirst(context->state[0], digest.subspan(0, 4));
+  fxcrt::PutUInt32LSBFirst(context->state[1], digest.subspan(4, 4));
+  fxcrt::PutUInt32LSBFirst(context->state[2], digest.subspan(8, 4));
+  fxcrt::PutUInt32LSBFirst(context->state[3], digest.subspan(12, 4));
 }
 
-void CRYPT_MD5Generate(pdfium::span<const uint8_t> data, uint8_t digest[16]) {
+void CRYPT_MD5Generate(pdfium::span<const uint8_t> data,
+                       pdfium::span<uint8_t, 16> digest) {
   CRYPT_md5_context ctx = CRYPT_MD5Start();
   CRYPT_MD5Update(&ctx, data);
   CRYPT_MD5Finish(&ctx, digest);
diff --git a/core/fdrm/fx_crypt.h b/core/fdrm/fx_crypt.h
index ca9af59..b8e108a 100644
--- a/core/fdrm/fx_crypt.h
+++ b/core/fdrm/fx_crypt.h
@@ -37,7 +37,9 @@
 CRYPT_md5_context CRYPT_MD5Start();
 void CRYPT_MD5Update(CRYPT_md5_context* context,
                      pdfium::span<const uint8_t> data);
-void CRYPT_MD5Finish(CRYPT_md5_context* context, uint8_t digest[16]);
-void CRYPT_MD5Generate(pdfium::span<const uint8_t> data, uint8_t digest[16]);
+void CRYPT_MD5Finish(CRYPT_md5_context* context,
+                     pdfium::span<uint8_t, 16> digest);
+void CRYPT_MD5Generate(pdfium::span<const uint8_t> data,
+                       pdfium::span<uint8_t, 16> digest);
 
 #endif  // CORE_FDRM_FX_CRYPT_H_
diff --git a/core/fpdfapi/parser/cpdf_security_handler.cpp b/core/fpdfapi/parser/cpdf_security_handler.cpp
index bfe43d3..4ecff9c 100644
--- a/core/fpdfapi/parser/cpdf_security_handler.cpp
+++ b/core/fpdfapi/parser/cpdf_security_handler.cpp
@@ -473,7 +473,7 @@
   CRYPT_MD5Update(&md5, kDefaultPasscode);
   if (!m_FileId.IsEmpty())
     CRYPT_MD5Update(&md5, m_FileId.unsigned_span());
-  CRYPT_MD5Finish(&md5, ukeybuf);
+  CRYPT_MD5Finish(&md5, pdfium::make_span(ukeybuf).first(16u));
   return memcmp(test, ukeybuf, 16) == 0;
 }
 
@@ -594,8 +594,8 @@
       CRYPT_MD5Update(&md5, file_id.unsigned_span());
 
     uint8_t digest[32];
-    CRYPT_MD5Finish(&md5, digest);
     auto partial_digest_span = pdfium::make_span(digest).first(16u);
+    CRYPT_MD5Finish(&md5, partial_digest_span);
     CRYPT_ArcFourCryptBlock(partial_digest_span,
                             pdfium::make_span(m_EncryptKey).first(key_len));
     uint8_t tempkey[32];
@@ -607,7 +607,7 @@
                               pdfium::make_span(tempkey).first(key_len));
     }
     CRYPT_MD5Generate(pdfium::make_span(digest).first(16u),
-                      pdfium::make_span(digest).subspan(16u).data());
+                      pdfium::make_span(digest).subspan(16u));
     pEncryptDict->SetNewFor<CPDF_String>("U",
                                          UNSAFE_TODO(ByteString(digest, 32)));
   }
diff --git a/fpdfsdk/fpdf_attachment.cpp b/fpdfsdk/fpdf_attachment.cpp
index 96434bf..63537f9 100644
--- a/fpdfsdk/fpdf_attachment.cpp
+++ b/fpdfsdk/fpdf_attachment.cpp
@@ -247,7 +247,7 @@
       pdfium::make_span(static_cast<const uint8_t*>(contents), len));
 
   std::array<uint8_t, 16> digest;
-  CRYPT_MD5Generate(contents_span, digest.data());
+  CRYPT_MD5Generate(contents_span, digest);
 
   // Set the checksum of the new attachment in the dictionary.
   pParamsDict->SetNewFor<CPDF_String>(kChecksumKey, digest,