Return vector from from CRYPT_SHA*Generate() functions.
Make convenience routine more convenient by removing output buffer
allocation requirements from callers.
Change-Id: If65dfdfa1bf6513ebbe9a38dc1c20b1d960fb2d4
Reviewed-on: https://pdfium-review.googlesource.com/c/pdfium/+/120792
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 33faec5..963a0da 100644
--- a/core/fdrm/fx_crypt_sha.cpp
+++ b/core/fdrm/fx_crypt_sha.cpp
@@ -428,12 +428,14 @@
}
}
-void CRYPT_SHA1Generate(pdfium::span<const uint8_t> data,
- pdfium::span<uint8_t, 20> digest) {
+DataVector<uint8_t> CRYPT_SHA1Generate(pdfium::span<const uint8_t> data) {
CRYPT_sha1_context s;
CRYPT_SHA1Start(&s);
CRYPT_SHA1Update(&s, data);
+
+ DataVector<uint8_t> digest(20);
CRYPT_SHA1Finish(&s, digest);
+ return digest;
}
void CRYPT_SHA256Start(CRYPT_sha2_context* context) {
@@ -492,12 +494,14 @@
SHA_PUT_UINT32(context->state[7], digest, 28);
}
-void CRYPT_SHA256Generate(pdfium::span<const uint8_t> data,
- pdfium::span<uint8_t, 32> digest) {
+DataVector<uint8_t> CRYPT_SHA256Generate(pdfium::span<const uint8_t> data) {
CRYPT_sha2_context ctx;
CRYPT_SHA256Start(&ctx);
CRYPT_SHA256Update(&ctx, data);
+
+ DataVector<uint8_t> digest(32);
CRYPT_SHA256Finish(&ctx, digest);
+ return digest;
}
void CRYPT_SHA384Start(CRYPT_sha2_context* context) {
@@ -555,12 +559,14 @@
SHA_PUT_UINT64(context->state[5], digest, 40);
}
-void CRYPT_SHA384Generate(pdfium::span<const uint8_t> data,
- pdfium::span<uint8_t, 48> digest) {
+DataVector<uint8_t> CRYPT_SHA384Generate(pdfium::span<const uint8_t> data) {
CRYPT_sha2_context context;
CRYPT_SHA384Start(&context);
CRYPT_SHA384Update(&context, data);
+
+ DataVector<uint8_t> digest(48);
CRYPT_SHA384Finish(&context, digest);
+ return digest;
}
void CRYPT_SHA512Start(CRYPT_sha2_context* context) {
@@ -601,10 +607,12 @@
SHA_PUT_UINT64(context->state[7], digest, 56);
}
-void CRYPT_SHA512Generate(pdfium::span<const uint8_t> data,
- pdfium::span<uint8_t, 64> digest) {
+DataVector<uint8_t> CRYPT_SHA512Generate(pdfium::span<const uint8_t> data) {
CRYPT_sha2_context context;
CRYPT_SHA512Start(&context);
CRYPT_SHA512Update(&context, data);
+
+ DataVector<uint8_t> digest(64);
CRYPT_SHA512Finish(&context, digest);
+ return digest;
}
diff --git a/core/fdrm/fx_crypt_sha.h b/core/fdrm/fx_crypt_sha.h
index 4e08e1a..c6e4def 100644
--- a/core/fdrm/fx_crypt_sha.h
+++ b/core/fdrm/fx_crypt_sha.h
@@ -11,6 +11,7 @@
#include <array>
+#include "core/fxcrt/data_vector.h"
#include "core/fxcrt/span.h"
struct CRYPT_sha1_context {
@@ -31,31 +32,27 @@
pdfium::span<const uint8_t> data);
void CRYPT_SHA1Finish(CRYPT_sha1_context* context,
pdfium::span<uint8_t, 20> digest);
-void CRYPT_SHA1Generate(pdfium::span<const uint8_t> data,
- pdfium::span<uint8_t, 20> digest);
+DataVector<uint8_t> CRYPT_SHA1Generate(pdfium::span<const uint8_t> data);
void CRYPT_SHA256Start(CRYPT_sha2_context* context);
void CRYPT_SHA256Update(CRYPT_sha2_context* context,
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);
+DataVector<uint8_t> CRYPT_SHA256Generate(pdfium::span<const uint8_t> data);
void CRYPT_SHA384Start(CRYPT_sha2_context* context);
void CRYPT_SHA384Update(CRYPT_sha2_context* context,
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);
+DataVector<uint8_t> CRYPT_SHA384Generate(pdfium::span<const uint8_t> data);
void CRYPT_SHA512Start(CRYPT_sha2_context* context);
void CRYPT_SHA512Update(CRYPT_sha2_context* context,
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);
+DataVector<uint8_t> CRYPT_SHA512Generate(pdfium::span<const uint8_t> data);
#endif // CORE_FDRM_FX_CRYPT_SHA_H_
diff --git a/core/fdrm/fx_crypt_unittest.cpp b/core/fdrm/fx_crypt_unittest.cpp
index aa19922..f4ae16b 100644
--- a/core/fdrm/fx_crypt_unittest.cpp
+++ b/core/fdrm/fx_crypt_unittest.cpp
@@ -9,6 +9,7 @@
#include <vector>
#include "core/fxcrt/bytestring.h"
+#include "core/fxcrt/data_vector.h"
#include "core/fxcrt/fx_memcpy_wrappers.h"
#include "testing/gmock/include/gmock/gmock.h"
#include "testing/gtest/include/gtest/gtest.h"
@@ -178,8 +179,8 @@
TEST(FXCRYPT, Sha1Empty) {
static const char kInput[] = "";
- uint8_t actual[20];
- CRYPT_SHA1Generate(ByteStringView(kInput).unsigned_span(), actual);
+ DataVector<uint8_t> actual =
+ CRYPT_SHA1Generate(ByteStringView(kInput).unsigned_span());
EXPECT_THAT(actual, ElementsAre(0xda, 0x39, 0xa3, 0xee, 0x5e, 0x6b, 0x4b,
0x0d, 0x32, 0x55, 0xbf, 0xef, 0x95, 0x60,
0x18, 0x90, 0xaf, 0xd8, 0x07, 0x09));
@@ -189,8 +190,8 @@
TEST(FXCRYPT, Sha1TestA1) {
// Example A.1 from FIPS 180-2: one-block message.
static const char kInput[] = "abc";
- uint8_t actual[20];
- CRYPT_SHA1Generate(ByteStringView(kInput).unsigned_span(), actual);
+ DataVector<uint8_t> actual =
+ CRYPT_SHA1Generate(ByteStringView(kInput).unsigned_span());
EXPECT_THAT(actual, ElementsAre(0xa9, 0x99, 0x3e, 0x36, 0x47, 0x06, 0x81,
0x6a, 0xba, 0x3e, 0x25, 0x71, 0x78, 0x50,
0xc2, 0x6c, 0x9c, 0xd0, 0xd8, 0x9d));
@@ -200,8 +201,8 @@
// Example A.2 from FIPS 180-2: multi-block message.
static const char kInput[] =
"abcdbcdecdefdefgefghfghighijhijkijkljklmklmnlmnomnopnopq";
- uint8_t actual[20];
- CRYPT_SHA1Generate(ByteStringView(kInput).unsigned_span(), actual);
+ DataVector<uint8_t> actual =
+ CRYPT_SHA1Generate(ByteStringView(kInput).unsigned_span());
EXPECT_THAT(actual, ElementsAre(0x84, 0x98, 0x3e, 0x44, 0x1c, 0x3b, 0xd2,
0x6e, 0xba, 0xae, 0x4a, 0xa1, 0xf9, 0x51,
0x29, 0xe5, 0xe5, 0x46, 0x70, 0xf1));
@@ -209,8 +210,9 @@
TEST(FXCRYPT, Sha256Empty) {
static const char kInput[] = "";
- uint8_t actual[32];
- CRYPT_SHA256Generate(ByteStringView(kInput).unsigned_span(), actual);
+ DataVector<uint8_t> actual =
+
+ CRYPT_SHA256Generate(ByteStringView(kInput).unsigned_span());
EXPECT_THAT(actual,
ElementsAre(0xe3, 0xb0, 0xc4, 0x42, 0x98, 0xfc, 0x1c, 0x14, 0x9a,
0xfb, 0xf4, 0xc8, 0x99, 0x6f, 0xb9, 0x24, 0x27, 0xae,
@@ -221,8 +223,8 @@
TEST(FXCRYPT, Sha256TestB1) {
// Example B.1 from FIPS 180-2: one-block message.
static const char kInput[] = "abc";
- uint8_t actual[32];
- CRYPT_SHA256Generate(ByteStringView(kInput).unsigned_span(), actual);
+ DataVector<uint8_t> actual =
+ CRYPT_SHA256Generate(ByteStringView(kInput).unsigned_span());
EXPECT_THAT(actual,
ElementsAre(0xba, 0x78, 0x16, 0xbf, 0x8f, 0x01, 0xcf, 0xea, 0x41,
0x41, 0x40, 0xde, 0x5d, 0xae, 0x22, 0x23, 0xb0, 0x03,
@@ -234,8 +236,8 @@
// Example B.2 from FIPS 180-2: multi-block message.
static const char kInput[] =
"abcdbcdecdefdefgefghfghighijhijkijkljklmklmnlmnomnopnopq";
- uint8_t actual[32];
- CRYPT_SHA256Generate(ByteStringView(kInput).unsigned_span(), actual);
+ DataVector<uint8_t> actual =
+ CRYPT_SHA256Generate(ByteStringView(kInput).unsigned_span());
EXPECT_THAT(actual,
ElementsAre(0x24, 0x8d, 0x6a, 0x61, 0xd2, 0x06, 0x38, 0xb8, 0xe5,
0xc0, 0x26, 0x93, 0x0c, 0x3e, 0x60, 0x39, 0xa3, 0x3c,
@@ -491,8 +493,8 @@
TEST(FXCRYPT, Sha384Empty) {
static const char kInput[] = "";
- uint8_t actual[48];
- CRYPT_SHA384Generate(ByteStringView(kInput).unsigned_span(), actual);
+ DataVector<uint8_t> actual =
+ CRYPT_SHA384Generate(ByteStringView(kInput).unsigned_span());
EXPECT_THAT(
actual,
ElementsAre(0x38, 0xb0, 0x60, 0xa7, 0x51, 0xac, 0x96, 0x38, 0x4c, 0xd9,
@@ -506,8 +508,8 @@
TEST(FXCRYPT, Sha384Test) {
static const char kInput[] =
"This is a simple test. To see whether it is getting correct value.";
- uint8_t actual[48];
- CRYPT_SHA384Generate(ByteStringView(kInput).unsigned_span(), actual);
+ DataVector<uint8_t> actual =
+ CRYPT_SHA384Generate(ByteStringView(kInput).unsigned_span());
EXPECT_THAT(
actual,
ElementsAre(0x95, 0x54, 0xff, 0xd3, 0x89, 0xf0, 0xd6, 0x42, 0xe9, 0x33,
@@ -522,9 +524,9 @@
static const char kInput[] =
"aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa"
"aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa";
- uint8_t actual[48];
EXPECT_EQ(112u, strlen(kInput));
- CRYPT_SHA384Generate(ByteStringView(kInput).unsigned_span(), actual);
+ DataVector<uint8_t> actual =
+ CRYPT_SHA384Generate(ByteStringView(kInput).unsigned_span());
EXPECT_THAT(
actual,
ElementsAre(0x18, 0x7d, 0x4e, 0x07, 0xcb, 0x30, 0x61, 0x03, 0xc6, 0x99,
@@ -536,8 +538,8 @@
TEST(FXCRYPT, Sha512Empty) {
static const char kInput[] = "";
- uint8_t actual[64];
- CRYPT_SHA512Generate(ByteStringView(kInput).unsigned_span(), actual);
+ DataVector<uint8_t> actual =
+ CRYPT_SHA512Generate(ByteStringView(kInput).unsigned_span());
EXPECT_THAT(
actual,
ElementsAre(0xcf, 0x83, 0xe1, 0x35, 0x7e, 0xef, 0xb8, 0xbd, 0xf1, 0x54,
@@ -553,8 +555,8 @@
TEST(FXCRYPT, Sha512Test) {
static const char kInput[] =
"This is a simple test. To see whether it is getting correct value.";
- uint8_t actual[64];
- CRYPT_SHA512Generate(ByteStringView(kInput).unsigned_span(), actual);
+ DataVector<uint8_t> actual =
+ CRYPT_SHA512Generate(ByteStringView(kInput).unsigned_span());
EXPECT_THAT(
actual,
ElementsAre(0x86, 0xB5, 0x05, 0x63, 0xA2, 0x6F, 0xD6, 0xFA, 0xEB, 0x9B,
@@ -572,8 +574,8 @@
"aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa"
"aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa";
EXPECT_EQ(112u, strlen(kInput));
- uint8_t actual[64];
- CRYPT_SHA512Generate(ByteStringView(kInput).unsigned_span(), actual);
+ DataVector<uint8_t> actual =
+ CRYPT_SHA512Generate(ByteStringView(kInput).unsigned_span());
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 25b8645..57fc974 100644
--- a/core/fpdfapi/parser/cpdf_security_handler.cpp
+++ b/core/fpdfapi/parser/cpdf_security_handler.cpp
@@ -155,30 +155,22 @@
CRYPT_AESSetIV(&aes, iv);
CRYPT_AESEncrypt(&aes, encrypted_output_span.data(), content.data(),
encrypted_output_span.size());
- int iHash = 0;
+
switch (BigOrder64BitsMod3(encrypted_output_span)) {
case 0:
- iHash = 0;
block_size = 32;
+ inter_digest = CRYPT_SHA256Generate(encrypted_output_span);
break;
case 1:
- iHash = 1;
block_size = 48;
+ inter_digest = CRYPT_SHA384Generate(encrypted_output_span);
break;
default:
- iHash = 2;
block_size = 64;
+ inter_digest = CRYPT_SHA512Generate(encrypted_output_span);
break;
}
- inter_digest.resize(block_size);
input = inter_digest.data();
- if (iHash == 0) {
- CRYPT_SHA256Generate(encrypted_output_span, inter_digest);
- } else if (iHash == 1) {
- CRYPT_SHA384Generate(encrypted_output_span, inter_digest);
- } else if (iHash == 2) {
- CRYPT_SHA512Generate(encrypted_output_span, inter_digest);
- }
key = input;
iv = UNSAFE_TODO(input + 16);
++i;
diff --git a/core/fpdfapi/parser/cpdf_stream_acc.cpp b/core/fpdfapi/parser/cpdf_stream_acc.cpp
index ffa0567..8e18336 100644
--- a/core/fpdfapi/parser/cpdf_stream_acc.cpp
+++ b/core/fpdfapi/parser/cpdf_stream_acc.cpp
@@ -85,9 +85,7 @@
}
DataVector<uint8_t> CPDF_StreamAcc::ComputeDigest() const {
- DataVector<uint8_t> digest(20);
- CRYPT_SHA1Generate(GetSpan(), digest);
- return digest;
+ return CRYPT_SHA1Generate(GetSpan());
}
DataVector<uint8_t> CPDF_StreamAcc::DetachData() {