Fix sha2 on big endian
https://gn-review.googlesource.com/c/gn/+/20540 has caused
a number of test failures on Big Endian because we don't need to
ByteSwap on said platforms.
Drive-by: also fix the same issue in sha1.
Bug: chromium:463302946
Change-Id: I7ccfbdf442da1cf99f7758593a313a5339c20cde
Reviewed-on: https://gn-review.googlesource.com/c/gn/+/20580
Reviewed-by: David Turner <digit@google.com>
Commit-Queue: David Turner <digit@google.com>
Reviewed-by: Andrew Grieve <agrieve@google.com>
diff --git a/src/base/sha1.cc b/src/base/sha1.cc
index 9c22be1..0a59b4f 100644
--- a/src/base/sha1.cc
+++ b/src/base/sha1.cc
@@ -114,8 +114,10 @@
Pad();
Process();
+#if defined(ARCH_CPU_LITTLE_ENDIAN)
for (int t = 0; t < 5; ++t)
H[t] = ByteSwap(H[t]);
+#endif
}
void SecureHashAlgorithm::Update(const void* data, size_t nbytes) {
@@ -161,8 +163,10 @@
//
// W and M are in a union, so no need to memcpy.
// memcpy(W, M, sizeof(M));
+#if defined(ARCH_CPU_LITTLE_ENDIAN)
for (t = 0; t < 16; ++t)
W[t] = ByteSwap(W[t]);
+#endif
// b.
for (t = 16; t < 80; ++t)
diff --git a/src/base/sha2.cc b/src/base/sha2.cc
index e6fcc08..3924ecc 100644
--- a/src/base/sha2.cc
+++ b/src/base/sha2.cc
@@ -77,9 +77,11 @@
// From section 6.2.2, step 1: "Prepare the message schedule"
memcpy(w_.data(), chunk.data(), chunk.size());
+#if defined(ARCH_CPU_LITTLE_ENDIAN)
for (int t = 0; t < 16; ++t) {
w_[t] = ByteSwap(w_[t]);
}
+#endif
for (int t = 16; t < 64; ++t) {
w_[t] = Sigma1(w_[t - 2]) + w_[t - 7] + Sigma0(w_[t - 15]) + w_[t - 16];
}
@@ -145,9 +147,11 @@
Update(std::string_view(padding_chunk.data(), padding_chunk.size()));
std::array<uint8_t, kSha256Length> result;
+#if defined(ARCH_CPU_LITTLE_ENDIAN)
for (uint32_t& word : hash_) {
word = ByteSwap(word);
}
+#endif
memcpy(result.data(), hash_.data(), sizeof(result));
return result;
}