Use more spans with CRYPT_ArcFour code.

Change CRYPT_ArcFourSetup() and CRYPT_ArcFourCrypt() to take spans.

Change-Id: I739bccbefba1b937167f99e48722b35d12dafc99
Bug: 1030583
Reviewed-on: https://pdfium-review.googlesource.com/c/pdfium/+/63155
Commit-Queue: Lei Zhang <thestig@chromium.org>
Reviewed-by: Tom Sepez <tsepez@chromium.org>
diff --git a/core/fdrm/fx_crypt.cpp b/core/fdrm/fx_crypt.cpp
index 5d53fab..7e0ce7f 100644
--- a/core/fdrm/fx_crypt.cpp
+++ b/core/fdrm/fx_crypt.cpp
@@ -139,8 +139,7 @@
 }  // namespace
 
 void CRYPT_ArcFourSetup(CRYPT_rc4_context* context,
-                        const uint8_t* key,
-                        uint32_t size) {
+                        pdfium::span<const uint8_t> key) {
   context->x = 0;
   context->y = 0;
   for (int i = 0; i < kRC4ContextPermutationLength; ++i)
@@ -148,19 +147,18 @@
 
   int j = 0;
   for (int i = 0; i < kRC4ContextPermutationLength; ++i) {
-    j = (j + context->m[i] + (size ? key[i % size] : 0)) & 0xFF;
+    j = (j + context->m[i] + (key.size() ? key[i % key.size()] : 0)) & 0xFF;
     std::swap(context->m[i], context->m[j]);
   }
 }
 
 void CRYPT_ArcFourCrypt(CRYPT_rc4_context* context,
-                        uint8_t* data,
-                        uint32_t size) {
-  for (uint32_t i = 0; i < size; ++i) {
+                        pdfium::span<uint8_t> data) {
+  for (auto& datum : data) {
     context->x = (context->x + 1) & 0xFF;
     context->y = (context->y + context->m[context->x]) & 0xFF;
     std::swap(context->m[context->x], context->m[context->y]);
-    data[i] ^=
+    datum ^=
         context->m[(context->m[context->x] + context->m[context->y]) & 0xFF];
   }
 }
@@ -168,8 +166,8 @@
 void CRYPT_ArcFourCryptBlock(pdfium::span<uint8_t> data,
                              pdfium::span<const uint8_t> key) {
   CRYPT_rc4_context s;
-  CRYPT_ArcFourSetup(&s, key.data(), key.size());
-  CRYPT_ArcFourCrypt(&s, data.data(), data.size());
+  CRYPT_ArcFourSetup(&s, key);
+  CRYPT_ArcFourCrypt(&s, data);
 }
 
 void CRYPT_MD5Start(CRYPT_md5_context* context) {
diff --git a/core/fdrm/fx_crypt.h b/core/fdrm/fx_crypt.h
index 5cd5a4a..edbd50b 100644
--- a/core/fdrm/fx_crypt.h
+++ b/core/fdrm/fx_crypt.h
@@ -49,11 +49,8 @@
 void CRYPT_ArcFourCryptBlock(pdfium::span<uint8_t> data,
                              pdfium::span<const uint8_t> key);
 void CRYPT_ArcFourSetup(CRYPT_rc4_context* context,
-                        const uint8_t* key,
-                        uint32_t size);
-void CRYPT_ArcFourCrypt(CRYPT_rc4_context* context,
-                        uint8_t* data,
-                        uint32_t size);
+                        pdfium::span<const uint8_t> key);
+void CRYPT_ArcFourCrypt(CRYPT_rc4_context* context, pdfium::span<uint8_t> data);
 
 void CRYPT_AESSetKey(CRYPT_aes_context* context,
                      const uint8_t* key,
diff --git a/core/fdrm/fx_crypt_unittest.cpp b/core/fdrm/fx_crypt_unittest.cpp
index 4d5336d..5363728 100644
--- a/core/fdrm/fx_crypt_unittest.cpp
+++ b/core/fdrm/fx_crypt_unittest.cpp
@@ -304,7 +304,7 @@
         139, 24,  209, 251, 208, 28,  111, 89,  158, 155, 243, 107, 233, 169,
         117, 184, 31,  39};
     CRYPT_rc4_context context;
-    CRYPT_ArcFourSetup(&context, nullptr, 0);
+    CRYPT_ArcFourSetup(&context, {});
     CheckArcFourContext(context, 0, 0, kNullPermutation);
   }
   {
@@ -330,7 +330,7 @@
         29,  45,  14,  111};
     CRYPT_rc4_context context;
     static const uint8_t kFooBar[] = "foobar";
-    CRYPT_ArcFourSetup(&context, kFooBar, FX_ArraySize(kFooBar) - 1);
+    CRYPT_ArcFourSetup(&context, {kFooBar, FX_ArraySize(kFooBar) - 1});
     CheckArcFourContext(context, 0, 0, kFoobarPermutation);
   }
 }
@@ -346,7 +346,7 @@
       "!@#$%^&*()[]{};':\",.<>/?\\|\r\t\n";
   {
     CRYPT_rc4_context context;
-    CRYPT_ArcFourSetup(&context, nullptr, 0);
+    CRYPT_ArcFourSetup(&context, {});
 
     uint8_t data_short[FX_ArraySize(kDataShort)];
     memcpy(data_short, kDataShort, FX_ArraySize(kDataShort));
@@ -358,7 +358,7 @@
     static_assert(
         FX_ArraySize(kExpectedEncryptedDataShort) == FX_ArraySize(data_short),
         "data_short mismatch");
-    CRYPT_ArcFourCrypt(&context, data_short, FX_ArraySize(data_short));
+    CRYPT_ArcFourCrypt(&context, data_short);
     for (size_t i = 0; i < FX_ArraySize(data_short); ++i)
       EXPECT_EQ(kExpectedEncryptedDataShort[i], data_short[i]) << i;
 
@@ -386,7 +386,7 @@
   }
   {
     CRYPT_rc4_context context;
-    CRYPT_ArcFourSetup(&context, nullptr, 0);
+    CRYPT_ArcFourSetup(&context, {});
 
     uint8_t data_long[FX_ArraySize(kDataLong)];
     memcpy(data_long, kDataLong, FX_ArraySize(kDataLong));
@@ -415,7 +415,7 @@
         FX_ArraySize(kExpectedEncryptedDataLong) == FX_ArraySize(data_long),
         "data_long mismatch");
     static_assert(FX_ArraySize(data_long) > 256, "too short");
-    CRYPT_ArcFourCrypt(&context, data_long, FX_ArraySize(data_long));
+    CRYPT_ArcFourCrypt(&context, data_long);
     for (size_t i = 0; i < FX_ArraySize(data_long); ++i)
       EXPECT_EQ(kExpectedEncryptedDataLong[i], data_long[i]) << i;
 
@@ -444,7 +444,7 @@
   {
     CRYPT_rc4_context context;
     static const uint8_t kFooBar[] = "foobar";
-    CRYPT_ArcFourSetup(&context, kFooBar, FX_ArraySize(kFooBar) - 1);
+    CRYPT_ArcFourSetup(&context, {kFooBar, FX_ArraySize(kFooBar) - 1});
 
     uint8_t data_short[FX_ArraySize(kDataShort)];
     memcpy(data_short, kDataShort, FX_ArraySize(kDataShort));
@@ -456,7 +456,7 @@
     static_assert(
         FX_ArraySize(kExpectedEncryptedDataShort) == FX_ArraySize(data_short),
         "data_short mismatch");
-    CRYPT_ArcFourCrypt(&context, data_short, FX_ArraySize(data_short));
+    CRYPT_ArcFourCrypt(&context, data_short);
     for (size_t i = 0; i < FX_ArraySize(data_short); ++i)
       EXPECT_EQ(kExpectedEncryptedDataShort[i], data_short[i]) << i;
 
@@ -485,7 +485,7 @@
   {
     CRYPT_rc4_context context;
     static const uint8_t kFooBar[] = "foobar";
-    CRYPT_ArcFourSetup(&context, kFooBar, FX_ArraySize(kFooBar) - 1);
+    CRYPT_ArcFourSetup(&context, {kFooBar, FX_ArraySize(kFooBar) - 1});
 
     uint8_t data_long[FX_ArraySize(kDataLong)];
     memcpy(data_long, kDataLong, FX_ArraySize(kDataLong));
@@ -514,7 +514,7 @@
         FX_ArraySize(kExpectedEncryptedDataLong) == FX_ArraySize(data_long),
         "data_long mismatch");
     static_assert(FX_ArraySize(data_long) > 256, "too short");
-    CRYPT_ArcFourCrypt(&context, data_long, FX_ArraySize(data_long));
+    CRYPT_ArcFourCrypt(&context, data_long);
     for (size_t i = 0; i < FX_ArraySize(data_long); ++i)
       EXPECT_EQ(kExpectedEncryptedDataLong[i], data_long[i]) << i;
 
diff --git a/core/fpdfapi/parser/cpdf_crypto_handler.cpp b/core/fpdfapi/parser/cpdf_crypto_handler.cpp
index 3b3e71c..c59b824 100644
--- a/core/fpdfapi/parser/cpdf_crypto_handler.cpp
+++ b/core/fpdfapi/parser/cpdf_crypto_handler.cpp
@@ -152,7 +152,7 @@
     return pContext;
   }
   CRYPT_rc4_context* pContext = FX_Alloc(CRYPT_rc4_context, 1);
-  CRYPT_ArcFourSetup(pContext, realkey, realkeylen);
+  CRYPT_ArcFourSetup(pContext, {realkey, realkeylen});
   return pContext;
 }
 
@@ -171,7 +171,7 @@
     int old_size = dest_buf.GetSize();
     dest_buf.AppendBlock(source.data(), source.size());
     CRYPT_ArcFourCrypt(static_cast<CRYPT_rc4_context*>(context),
-                       dest_buf.GetBuffer() + old_size, source.size());
+                       dest_buf.GetSpan().subspan(old_size, source.size()));
     return true;
   }
   AESCryptContext* pContext = static_cast<AESCryptContext*>(context);