Spanify CalcEncryptKey, CRYPT_SHA1* and CRYPT_SHA256*

-- convert to kConstant naming style.

Bug: 42271176
Change-Id: I683914ef0365adc086a13f71f31478c761d7f16b
Reviewed-on: https://pdfium-review.googlesource.com/c/pdfium/+/120671
Reviewed-by: Thomas Sepez <tsepez@google.com>
Reviewed-by: Lei Zhang <thestig@chromium.org>
Commit-Queue: Tom Sepez <tsepez@chromium.org>
diff --git a/core/fdrm/fx_crypt_sha.cpp b/core/fdrm/fx_crypt_sha.cpp
index e79188b..eb429ab 100644
--- a/core/fdrm/fx_crypt_sha.cpp
+++ b/core/fdrm/fx_crypt_sha.cpp
@@ -8,6 +8,7 @@
 
 #include "core/fxcrt/compiler_specific.h"
 #include "core/fxcrt/fx_memcpy_wrappers.h"
+#include "core/fxcrt/span_util.h"
 #include "core/fxcrt/stl_util.h"
 
 #define SHA_GET_UINT32(n, b, i)                                         \
@@ -149,7 +150,8 @@
   digest[4] += e;
 }
 
-void sha256_process(CRYPT_sha2_context* ctx, const uint8_t data[64]) {
+void sha256_process(CRYPT_sha2_context* ctx,
+                    pdfium::span<const uint8_t, 64> data) {
   uint32_t W[64];
   SHA_GET_UINT32(W[0], data, 0);
   SHA_GET_UINT32(W[1], data, 4);
@@ -250,12 +252,12 @@
   ctx->state[7] += H;
 }
 
-const uint8_t sha256_padding[64] = {
+const uint8_t kSha256Padding[64] = {
     0x80, 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, 0,
     0,    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0};
 
-const uint8_t sha384_padding[128] = {
+const uint8_t kSha384Padding[128] = {
     0x80, 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, 0,
     0,    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
@@ -369,21 +371,19 @@
 }
 
 void CRYPT_SHA1Update(CRYPT_sha1_context* context,
-                      const uint8_t* data,
-                      uint32_t size) {
-  context->total_bytes += size;
-  if (context->blkused && size < 64 - context->blkused) {
-    UNSAFE_TODO(
-        FXSYS_memcpy(context->block.data() + context->blkused, data, size));
-    context->blkused += size;
+                      pdfium::span<const uint8_t> data) {
+  const auto block_span = pdfium::make_span(context->block);
+  context->total_bytes += data.size();
+  if (context->blkused && data.size() < 64 - context->blkused) {
+    fxcrt::spancpy(block_span.subspan(context->blkused), data);
+    context->blkused += data.size();
     return;
   }
   std::array<uint32_t, 16> wordblock;
-  while (size >= 64 - context->blkused) {
-    UNSAFE_TODO(FXSYS_memcpy(context->block.data() + context->blkused, data,
-                             64 - context->blkused));
-    UNSAFE_TODO(data += 64 - context->blkused);
-    size -= 64 - context->blkused;
+  while (data.size() >= 64 - context->blkused) {
+    fxcrt::spancpy(block_span.subspan(context->blkused),
+                   data.first(64 - context->blkused));
+    data = data.subspan(64 - context->blkused);
     for (int i = 0; i < 16; i++) {
       wordblock[i] = (((uint32_t)context->block[i * 4 + 0]) << 24) |
                      (((uint32_t)context->block[i * 4 + 1]) << 16) |
@@ -393,8 +393,8 @@
     SHATransform(context->h, wordblock);
     context->blkused = 0;
   }
-  UNSAFE_TODO(FXSYS_memcpy(context->block.data(), data, size));
-  context->blkused = size;
+  fxcrt::spancpy(block_span, data);
+  context->blkused = static_cast<uint32_t>(data.size());
 }
 
 void CRYPT_SHA1Finish(CRYPT_sha1_context* context,
@@ -407,9 +407,9 @@
   } else {
     pad = 56 - context->blkused;
   }
-  UNSAFE_TODO(FXSYS_memset(c.data(), 0, pad));
+  fxcrt::Fill(pdfium::make_span(c).first(pad), 0);
   c[0] = 0x80;
-  CRYPT_SHA1Update(context, c.data(), pad);
+  CRYPT_SHA1Update(context, pdfium::make_span(c).first(pad));
   c[0] = (total_bits >> 56) & 0xFF;
   c[1] = (total_bits >> 48) & 0xFF;
   c[2] = (total_bits >> 40) & 0xFF;
@@ -418,7 +418,7 @@
   c[5] = (total_bits >> 16) & 0xFF;
   c[6] = (total_bits >> 8) & 0xFF;
   c[7] = (total_bits >> 0) & 0xFF;
-  CRYPT_SHA1Update(context, c.data(), 8);
+  CRYPT_SHA1Update(context, pdfium::make_span(c).first(8u));
   for (int i = 0; i < 5; i++) {
     digest[i * 4] = (context->h[i] >> 24) & 0xFF;
     digest[i * 4 + 1] = (context->h[i] >> 16) & 0xFF;
@@ -427,12 +427,11 @@
   }
 }
 
-void CRYPT_SHA1Generate(const uint8_t* data,
-                        uint32_t size,
+void CRYPT_SHA1Generate(pdfium::span<const uint8_t> data,
                         pdfium::span<uint8_t, 20> digest) {
   CRYPT_sha1_context s;
   CRYPT_SHA1Start(&s);
-  CRYPT_SHA1Update(&s, data, size);
+  CRYPT_SHA1Update(&s, data);
   CRYPT_SHA1Finish(&s, digest);
 }
 
@@ -450,39 +449,38 @@
 }
 
 void CRYPT_SHA256Update(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 & 0x3F;
   uint32_t fill = 64 - left;
-  context->total_bytes += size;
-  if (left && size >= fill) {
-    UNSAFE_TODO(FXSYS_memcpy(context->buffer + left, data, fill));
-    sha256_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));
+    sha256_process(context, buffer_span);
+    data = data.subspan(fill);
     left = 0;
   }
-  while (size >= 64) {
-    sha256_process(context, data);
-    size -= 64;
-    UNSAFE_TODO(data += 64);
+  while (data.size() >= 64) {
+    sha256_process(context, data.first(64u));
+    data = data.subspan(64u);
   }
-  if (size) {
-    UNSAFE_TODO(FXSYS_memcpy(context->buffer + left, data, size));
+  if (!data.empty()) {
+    fxcrt::spancpy(buffer_span.subspan(left), data);
   }
 }
 
-void CRYPT_SHA256Finish(CRYPT_sha2_context* context, uint8_t digest[32]) {
+void CRYPT_SHA256Finish(CRYPT_sha2_context* context,
+                        pdfium::span<uint8_t, 32> digest) {
   uint8_t msglen[8];
   uint64_t total_bits = 8 * context->total_bytes;  // Prior to padding.
   SHA_PUT_UINT64(total_bits, msglen, 0);
   uint32_t last = context->total_bytes & 0x3F;
   uint32_t padn = (last < 56) ? (56 - last) : (120 - last);
-  CRYPT_SHA256Update(context, sha256_padding, padn);
-  CRYPT_SHA256Update(context, msglen, 8);
+  CRYPT_SHA256Update(context, pdfium::span(kSha256Padding).first(padn));
+  CRYPT_SHA256Update(context, msglen);
   SHA_PUT_UINT32(context->state[0], digest, 0);
   SHA_PUT_UINT32(context->state[1], digest, 4);
   SHA_PUT_UINT32(context->state[2], digest, 8);
@@ -493,12 +491,11 @@
   SHA_PUT_UINT32(context->state[7], digest, 28);
 }
 
-void CRYPT_SHA256Generate(const uint8_t* data,
-                          uint32_t size,
-                          uint8_t digest[32]) {
+void CRYPT_SHA256Generate(pdfium::span<const uint8_t> data,
+                          pdfium::span<uint8_t, 32> digest) {
   CRYPT_sha2_context ctx;
   CRYPT_SHA256Start(&ctx);
-  CRYPT_SHA256Update(&ctx, data, size);
+  CRYPT_SHA256Update(&ctx, data);
   CRYPT_SHA256Finish(&ctx, digest);
 }
 
@@ -548,7 +545,7 @@
   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, sha384_padding, padn);
+  CRYPT_SHA384Update(context, kSha384Padding, padn);
   CRYPT_SHA384Update(context, msglen, 16);
   SHA_PUT_UINT64(context->state[0], digest, 0);
   SHA_PUT_UINT64(context->state[1], digest, 8);
@@ -593,7 +590,7 @@
   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, sha384_padding, padn);
+  CRYPT_SHA512Update(context, kSha384Padding, padn);
   CRYPT_SHA512Update(context, msglen, 16);
   SHA_PUT_UINT64(context->state[0], digest, 0);
   SHA_PUT_UINT64(context->state[1], digest, 8);
diff --git a/core/fdrm/fx_crypt_sha.h b/core/fdrm/fx_crypt_sha.h
index f4254e4..b4af2a1 100644
--- a/core/fdrm/fx_crypt_sha.h
+++ b/core/fdrm/fx_crypt_sha.h
@@ -28,22 +28,19 @@
 
 void CRYPT_SHA1Start(CRYPT_sha1_context* context);
 void CRYPT_SHA1Update(CRYPT_sha1_context* context,
-                      const uint8_t* data,
-                      uint32_t size);
+                      pdfium::span<const uint8_t> data);
 void CRYPT_SHA1Finish(CRYPT_sha1_context* context,
                       pdfium::span<uint8_t, 20> digest);
-void CRYPT_SHA1Generate(const uint8_t* data,
-                        uint32_t size,
+void CRYPT_SHA1Generate(pdfium::span<const uint8_t> data,
                         pdfium::span<uint8_t, 20> digest);
 
 void CRYPT_SHA256Start(CRYPT_sha2_context* context);
 void CRYPT_SHA256Update(CRYPT_sha2_context* context,
-                        const uint8_t* data,
-                        uint32_t size);
-void CRYPT_SHA256Finish(CRYPT_sha2_context* context, uint8_t digest[32]);
-void CRYPT_SHA256Generate(const uint8_t* data,
-                          uint32_t size,
-                          uint8_t digest[32]);
+                        pdfium::span<const uint8_t> data);
+void CRYPT_SHA256Finish(CRYPT_sha2_context* context,
+                        pdfium::span<uint8_t, 32> digest);
+void CRYPT_SHA256Generate(pdfium::span<const uint8_t> data,
+                          pdfium::span<uint8_t, 32> digest);
 
 void CRYPT_SHA384Start(CRYPT_sha2_context* context);
 void CRYPT_SHA384Update(CRYPT_sha2_context* context,
diff --git a/core/fdrm/fx_crypt_unittest.cpp b/core/fdrm/fx_crypt_unittest.cpp
index 6c774fe..4a4d0b6 100644
--- a/core/fdrm/fx_crypt_unittest.cpp
+++ b/core/fdrm/fx_crypt_unittest.cpp
@@ -179,8 +179,7 @@
 TEST(FXCRYPT, Sha1Empty) {
   static const char kInput[] = "";
   uint8_t actual[20];
-  CRYPT_SHA1Generate(reinterpret_cast<const uint8_t*>(kInput), strlen(kInput),
-                     actual);
+  CRYPT_SHA1Generate(ByteStringView(kInput).unsigned_span(), actual);
   EXPECT_THAT(actual, ElementsAre(0xda, 0x39, 0xa3, 0xee, 0x5e, 0x6b, 0x4b,
                                   0x0d, 0x32, 0x55, 0xbf, 0xef, 0x95, 0x60,
                                   0x18, 0x90, 0xaf, 0xd8, 0x07, 0x09));
@@ -191,8 +190,7 @@
   // Example A.1 from FIPS 180-2: one-block message.
   static const char kInput[] = "abc";
   uint8_t actual[20];
-  CRYPT_SHA1Generate(reinterpret_cast<const uint8_t*>(kInput), strlen(kInput),
-                     actual);
+  CRYPT_SHA1Generate(ByteStringView(kInput).unsigned_span(), actual);
   EXPECT_THAT(actual, ElementsAre(0xa9, 0x99, 0x3e, 0x36, 0x47, 0x06, 0x81,
                                   0x6a, 0xba, 0x3e, 0x25, 0x71, 0x78, 0x50,
                                   0xc2, 0x6c, 0x9c, 0xd0, 0xd8, 0x9d));
@@ -203,8 +201,7 @@
   static const char kInput[] =
       "abcdbcdecdefdefgefghfghighijhijkijkljklmklmnlmnomnopnopq";
   uint8_t actual[20];
-  CRYPT_SHA1Generate(reinterpret_cast<const uint8_t*>(kInput), strlen(kInput),
-                     actual);
+  CRYPT_SHA1Generate(ByteStringView(kInput).unsigned_span(), actual);
   EXPECT_THAT(actual, ElementsAre(0x84, 0x98, 0x3e, 0x44, 0x1c, 0x3b, 0xd2,
                                   0x6e, 0xba, 0xae, 0x4a, 0xa1, 0xf9, 0x51,
                                   0x29, 0xe5, 0xe5, 0x46, 0x70, 0xf1));
@@ -213,8 +210,7 @@
 TEST(FXCRYPT, Sha256Empty) {
   static const char kInput[] = "";
   uint8_t actual[32];
-  CRYPT_SHA256Generate(reinterpret_cast<const uint8_t*>(kInput), strlen(kInput),
-                       actual);
+  CRYPT_SHA256Generate(ByteStringView(kInput).unsigned_span(), actual);
   EXPECT_THAT(actual,
               ElementsAre(0xe3, 0xb0, 0xc4, 0x42, 0x98, 0xfc, 0x1c, 0x14, 0x9a,
                           0xfb, 0xf4, 0xc8, 0x99, 0x6f, 0xb9, 0x24, 0x27, 0xae,
@@ -226,8 +222,7 @@
   // Example B.1 from FIPS 180-2: one-block message.
   static const char kInput[] = "abc";
   uint8_t actual[32];
-  CRYPT_SHA256Generate(reinterpret_cast<const uint8_t*>(kInput), strlen(kInput),
-                       actual);
+  CRYPT_SHA256Generate(ByteStringView(kInput).unsigned_span(), actual);
   EXPECT_THAT(actual,
               ElementsAre(0xba, 0x78, 0x16, 0xbf, 0x8f, 0x01, 0xcf, 0xea, 0x41,
                           0x41, 0x40, 0xde, 0x5d, 0xae, 0x22, 0x23, 0xb0, 0x03,
@@ -240,8 +235,7 @@
   static const char kInput[] =
       "abcdbcdecdefdefgefghfghighijhijkijkljklmklmnlmnomnopnopq";
   uint8_t actual[32];
-  CRYPT_SHA256Generate(reinterpret_cast<const uint8_t*>(kInput), strlen(kInput),
-                       actual);
+  CRYPT_SHA256Generate(ByteStringView(kInput).unsigned_span(), actual);
   EXPECT_THAT(actual,
               ElementsAre(0x24, 0x8d, 0x6a, 0x61, 0xd2, 0x06, 0x38, 0xb8, 0xe5,
                           0xc0, 0x26, 0x93, 0x0c, 0x3e, 0x60, 0x39, 0xa3, 0x3c,
diff --git a/core/fpdfapi/parser/cpdf_security_handler.cpp b/core/fpdfapi/parser/cpdf_security_handler.cpp
index 9c255f0..28d76aa 100644
--- a/core/fpdfapi/parser/cpdf_security_handler.cpp
+++ b/core/fpdfapi/parser/cpdf_security_handler.cpp
@@ -28,6 +28,7 @@
 #include "core/fxcrt/notreached.h"
 #include "core/fxcrt/span.h"
 #include "core/fxcrt/span_util.h"
+#include "core/fxcrt/stl_util.h"
 
 namespace {
 
@@ -39,49 +40,50 @@
 void GetPassCode(const ByteString& password, pdfium::span<uint8_t> output) {
   DCHECK_EQ(sizeof(kDefaultPasscode), output.size());
   size_t len = std::min(password.GetLength(), output.size());
-  size_t remaining = output.size() - len;
-  UNSAFE_TODO({
-    FXSYS_memcpy(output.data(), password.unsigned_str(), len);
-    if (remaining) {
-      FXSYS_memcpy(&output[len], kDefaultPasscode, remaining);
-    }
-  });
+  auto remaining = fxcrt::spancpy(output, password.unsigned_span().first(len));
+  if (!remaining.empty()) {
+    auto default_span = pdfium::make_span(kDefaultPasscode);
+    fxcrt::spancpy(remaining, default_span.first(remaining.size()));
+  }
 }
 
 void CalcEncryptKey(const CPDF_Dictionary* pEncrypt,
                     const ByteString& password,
-                    uint8_t* key,
-                    size_t keylen,
+                    pdfium::span<uint8_t> key,
                     bool ignore_metadata,
                     const ByteString& file_id) {
+  fxcrt::Fill(key, 0);
+
   uint8_t passcode[32];
   GetPassCode(password, passcode);
+
   CRYPT_md5_context md5 = CRYPT_MD5Start();
   CRYPT_MD5Update(&md5, passcode);
+
   ByteString okey = pEncrypt->GetByteStringFor("O");
   CRYPT_MD5Update(&md5, okey.unsigned_span());
+
   uint32_t perm = pEncrypt->GetIntegerFor("P");
   CRYPT_MD5Update(&md5, pdfium::as_bytes(pdfium::span_from_ref(perm)));
-  if (!file_id.IsEmpty())
+  if (!file_id.IsEmpty()) {
     CRYPT_MD5Update(&md5, file_id.unsigned_span());
+  }
   const bool is_revision_3_or_greater = pEncrypt->GetIntegerFor("R") >= 3;
   if (!ignore_metadata && is_revision_3_or_greater &&
       !pEncrypt->GetBooleanFor("EncryptMetadata", true)) {
     constexpr uint32_t tag = 0xFFFFFFFF;
-    CRYPT_MD5Update(&md5, pdfium::as_bytes(pdfium::span_from_ref(tag)));
+    CRYPT_MD5Update(&md5, pdfium::byte_span_from_ref(tag));
   }
   uint8_t digest[16];
   CRYPT_MD5Finish(&md5, digest);
-  size_t copy_len = std::min(keylen, sizeof(digest));
+  size_t copy_len = std::min(key.size(), sizeof(digest));
+  auto digest_span = pdfium::make_span(digest).first(copy_len);
   if (is_revision_3_or_greater) {
     for (int i = 0; i < 50; i++) {
-      CRYPT_MD5Generate(pdfium::make_span(digest).first(copy_len), digest);
+      CRYPT_MD5Generate(digest_span, digest);
     }
   }
-  UNSAFE_TODO({
-    FXSYS_memset(key, 0, keylen);
-    FXSYS_memcpy(key, digest, copy_len);
-  });
+  fxcrt::spancpy(key, digest_span);
 }
 
 bool IsValidKeyLengthForCipher(CPDF_CryptoHandler::Cipher cipher,
@@ -115,11 +117,11 @@
                     uint8_t* hash) {
   CRYPT_sha2_context sha;
   CRYPT_SHA256Start(&sha);
-  CRYPT_SHA256Update(&sha, password.unsigned_str(), password.GetLength());
-  CRYPT_SHA256Update(&sha, salt, 8);
-  if (vector)
-    CRYPT_SHA256Update(&sha, vector, 48);
-
+  CRYPT_SHA256Update(&sha, password.unsigned_span());
+  CRYPT_SHA256Update(&sha, UNSAFE_TODO(pdfium::make_span(salt, 8)));
+  if (vector) {
+    CRYPT_SHA256Update(&sha, UNSAFE_TODO(pdfium::make_span(vector, 48)));
+  }
   uint8_t digest[32];
   CRYPT_SHA256Finish(&sha, digest);
 
@@ -171,8 +173,7 @@
     inter_digest.resize(block_size);
     input = inter_digest.data();
     if (iHash == 0) {
-      CRYPT_SHA256Generate(encrypted_output_span.data(),
-                           encrypted_output_span.size(), input);
+      CRYPT_SHA256Generate(encrypted_output_span, inter_digest);
     } else if (iHash == 1) {
       CRYPT_SHA384Generate(encrypted_output_span.data(),
                            encrypted_output_span.size(), input);
@@ -349,24 +350,26 @@
                    bOwner ? ukey.unsigned_str() : nullptr, digest);
   } else {
     CRYPT_SHA256Start(&sha);
-    CRYPT_SHA256Update(&sha, password.unsigned_str(), password.GetLength());
-    CRYPT_SHA256Update(&sha, UNSAFE_TODO(pkey + 32), 8);
-    if (bOwner)
-      CRYPT_SHA256Update(&sha, ukey.unsigned_str(), 48);
+    CRYPT_SHA256Update(&sha, password.unsigned_span());
+    CRYPT_SHA256Update(&sha, UNSAFE_TODO(pdfium::make_span(pkey + 32, 8)));
+    if (bOwner) {
+      CRYPT_SHA256Update(&sha, ukey.unsigned_span().first(48u));
+    }
     CRYPT_SHA256Finish(&sha, digest);
   }
   if (memcmp(digest, pkey, 32) != 0)
     return false;
 
   if (m_Revision >= 6) {
-    Revision6_Hash(password, UNSAFE_TODO((const uint8_t*)pkey + 40),
+    Revision6_Hash(password, UNSAFE_TODO(pkey + 40),
                    bOwner ? ukey.unsigned_str() : nullptr, digest);
   } else {
     CRYPT_SHA256Start(&sha);
-    CRYPT_SHA256Update(&sha, password.unsigned_str(), password.GetLength());
-    CRYPT_SHA256Update(&sha, UNSAFE_TODO(pkey + 40), 8);
-    if (bOwner)
-      CRYPT_SHA256Update(&sha, ukey.unsigned_str(), 48);
+    CRYPT_SHA256Update(&sha, password.unsigned_span());
+    CRYPT_SHA256Update(&sha, UNSAFE_TODO(pdfium::make_span(pkey + 40, 8)));
+    if (bOwner) {
+      CRYPT_SHA256Update(&sha, ukey.unsigned_span().first(48u));
+    }
     CRYPT_SHA256Finish(&sha, digest);
   }
   ByteString ekey = m_pEncryptDict->GetByteStringFor(bOwner ? "OE" : "UE");
@@ -447,7 +450,8 @@
 
 bool CPDF_SecurityHandler::CheckUserPassword(const ByteString& password,
                                              bool bIgnoreEncryptMeta) {
-  CalcEncryptKey(m_pEncryptDict.Get(), password, m_EncryptKey.data(), m_KeyLen,
+  CalcEncryptKey(m_pEncryptDict.Get(), password,
+                 pdfium::make_span(m_EncryptKey).first(m_KeyLen),
                  bIgnoreEncryptMeta, m_FileId);
   ByteString ukey =
       m_pEncryptDict ? m_pEncryptDict->GetByteStringFor("U") : ByteString();
@@ -570,9 +574,8 @@
     FX_Random_GenerateMT(random);
     CRYPT_sha2_context sha;
     CRYPT_SHA256Start(&sha);
-    CRYPT_SHA256Update(&sha, reinterpret_cast<uint8_t*>(random),
-                       sizeof(random));
-    CRYPT_SHA256Finish(&sha, m_EncryptKey.data());
+    CRYPT_SHA256Update(&sha, pdfium::as_bytes(pdfium::make_span(random)));
+    CRYPT_SHA256Finish(&sha, pdfium::make_span(m_EncryptKey));
     AES256_SetPassword(pEncryptDict, password);
     AES256_SetPerms(pEncryptDict);
     return;
@@ -582,8 +585,9 @@
   if (pIdArray)
     file_id = pIdArray->GetByteStringAt(0);
 
-  CalcEncryptKey(m_pEncryptDict.Get(), password, m_EncryptKey.data(), key_len,
-                 false, file_id);
+  CalcEncryptKey(m_pEncryptDict.Get(), password,
+                 pdfium::make_span(m_EncryptKey).first(key_len), false,
+                 file_id);
   if (m_Revision < 3) {
     uint8_t tempbuf[32];
     UNSAFE_TODO(
@@ -624,8 +628,10 @@
                                               const ByteString& password) {
   CRYPT_sha1_context sha;
   CRYPT_SHA1Start(&sha);
-  CRYPT_SHA1Update(&sha, m_EncryptKey.data(), m_EncryptKey.size());
-  CRYPT_SHA1Update(&sha, (uint8_t*)"hello", 5);
+  CRYPT_SHA1Update(&sha, m_EncryptKey);
+  // SAFETY: fixed-length string "hello" contains 5 characters.
+  CRYPT_SHA1Update(
+      &sha, pdfium::as_bytes(UNSAFE_BUFFERS(pdfium::make_span("hello", 5))));
 
   uint8_t digest[20];
   CRYPT_SHA1Finish(&sha, digest);
@@ -636,9 +642,9 @@
     Revision6_Hash(password, digest, nullptr, digest1);
   } else {
     CRYPT_SHA256Start(&sha2);
-    CRYPT_SHA256Update(&sha2, password.unsigned_str(), password.GetLength());
-    CRYPT_SHA256Update(&sha2, digest, 8);
-    CRYPT_SHA256Finish(&sha2, digest1);
+    CRYPT_SHA256Update(&sha2, password.unsigned_span());
+    CRYPT_SHA256Update(&sha2, pdfium::make_span(digest).first(8u));
+    CRYPT_SHA256Finish(&sha2, pdfium::make_span(digest1).first(32u));
   }
   UNSAFE_TODO(FXSYS_memcpy(digest1 + 32, digest, 16));
   pEncryptDict->SetNewFor<CPDF_String>(
@@ -647,9 +653,9 @@
     Revision6_Hash(password, UNSAFE_TODO(digest + 8), nullptr, digest1);
   } else {
     CRYPT_SHA256Start(&sha2);
-    CRYPT_SHA256Update(&sha2, password.unsigned_str(), password.GetLength());
-    CRYPT_SHA256Update(&sha2, UNSAFE_TODO(digest + 8), 8);
-    CRYPT_SHA256Finish(&sha2, digest1);
+    CRYPT_SHA256Update(&sha2, password.unsigned_span());
+    CRYPT_SHA256Update(&sha2, pdfium::make_span(digest).subspan(8, 8));
+    CRYPT_SHA256Finish(&sha2, pdfium::make_span(digest1).first(32));
   }
   CRYPT_aes_context aes = {};
   CRYPT_AESSetKey(&aes, digest1, 32);
diff --git a/core/fpdfapi/parser/cpdf_stream_acc.cpp b/core/fpdfapi/parser/cpdf_stream_acc.cpp
index b7d9aec..ffa0567 100644
--- a/core/fpdfapi/parser/cpdf_stream_acc.cpp
+++ b/core/fpdfapi/parser/cpdf_stream_acc.cpp
@@ -86,8 +86,7 @@
 
 DataVector<uint8_t> CPDF_StreamAcc::ComputeDigest() const {
   DataVector<uint8_t> digest(20);
-  pdfium::span<const uint8_t> span = GetSpan();
-  CRYPT_SHA1Generate(span.data(), span.size(), digest);
+  CRYPT_SHA1Generate(GetSpan(), digest);
   return digest;
 }