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