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