Diff
Modified: trunk/Source/WebKit2/ChangeLog (185496 => 185497)
--- trunk/Source/WebKit2/ChangeLog 2015-06-12 10:34:14 UTC (rev 185496)
+++ trunk/Source/WebKit2/ChangeLog 2015-06-12 10:46:47 UTC (rev 185497)
@@ -1,3 +1,30 @@
+2015-06-12 Antti Koivisto <[email protected]>
+
+ Use SHA1 for cache coder checksums
+ https://bugs.webkit.org/show_bug.cgi?id=145880
+
+ Reviewed by Anders Carlsson.
+
+ Make cache data error detection more robust by using SHA1 for checksums.
+
+ * NetworkProcess/cache/NetworkCacheDecoder.cpp:
+ (WebKit::NetworkCache::Decoder::Decoder):
+ (WebKit::NetworkCache::Decoder::decodeFixedLengthData):
+ (WebKit::NetworkCache::Decoder::decodeNumber):
+ (WebKit::NetworkCache::Decoder::verifyChecksum):
+ * NetworkProcess/cache/NetworkCacheDecoder.h:
+ * NetworkProcess/cache/NetworkCacheEncoder.cpp:
+ (WebKit::NetworkCache::Encoder::Encoder):
+ (WebKit::NetworkCache::Encoder::grow):
+ (WebKit::NetworkCache::Encoder::updateChecksumForData):
+ (WebKit::NetworkCache::Encoder::encodeFixedLengthData):
+ (WebKit::NetworkCache::Encoder::encodeNumber):
+ (WebKit::NetworkCache::Encoder::encodeChecksum):
+ * NetworkProcess/cache/NetworkCacheEncoder.h:
+ (WebKit::NetworkCache::Encoder::buffer):
+ (WebKit::NetworkCache::Encoder::bufferSize):
+ (WebKit::NetworkCache::Encoder::updateChecksumForNumber):
+
2015-06-12 Csaba Osztrogonác <[email protected]>
[EFL] Fix deprecated declarations warnings related to WK2 versioned structs
Modified: trunk/Source/WebKit2/NetworkProcess/cache/NetworkCacheDecoder.cpp (185496 => 185497)
--- trunk/Source/WebKit2/NetworkProcess/cache/NetworkCacheDecoder.cpp 2015-06-12 10:34:14 UTC (rev 185496)
+++ trunk/Source/WebKit2/NetworkProcess/cache/NetworkCacheDecoder.cpp 2015-06-12 10:46:47 UTC (rev 185497)
@@ -37,7 +37,6 @@
: m_buffer(buffer)
, m_bufferPosition(buffer)
, m_bufferEnd(buffer + bufferSize)
- , m_checksum(0)
{
}
@@ -58,7 +57,7 @@
memcpy(data, m_bufferPosition, size);
m_bufferPosition += size;
- Encoder::updateChecksumForData(m_checksum, data, size);
+ Encoder::updateChecksumForData(m_sha1, data, size);
return true;
}
@@ -71,7 +70,7 @@
memcpy(&value, m_bufferPosition, sizeof(value));
m_bufferPosition += sizeof(Type);
- Encoder::updateChecksumForNumber(m_checksum, value);
+ Encoder::updateChecksumForNumber(m_sha1, value);
return true;
}
@@ -122,11 +121,14 @@
bool Decoder::verifyChecksum()
{
- unsigned computedChecksum = m_checksum;
- unsigned decodedChecksum;
- if (!decodeNumber(decodedChecksum))
+ SHA1::Digest computedHash;
+ m_sha1.computeHash(computedHash);
+
+ SHA1::Digest savedHash;
+ if (!decodeFixedLengthData(savedHash.data(), sizeof(savedHash)))
return false;
- return computedChecksum == decodedChecksum;
+
+ return computedHash == savedHash;
}
}
Modified: trunk/Source/WebKit2/NetworkProcess/cache/NetworkCacheDecoder.h (185496 => 185497)
--- trunk/Source/WebKit2/NetworkProcess/cache/NetworkCacheDecoder.h 2015-06-12 10:34:14 UTC (rev 185496)
+++ trunk/Source/WebKit2/NetworkProcess/cache/NetworkCacheDecoder.h 2015-06-12 10:46:47 UTC (rev 185497)
@@ -29,6 +29,7 @@
#if ENABLE(NETWORK_CACHE)
#include "NetworkCacheCoder.h"
+#include <wtf/SHA1.h>
namespace WebKit {
namespace NetworkCache {
@@ -92,7 +93,7 @@
const uint8_t* m_bufferPosition;
const uint8_t* m_bufferEnd;
- unsigned m_checksum;
+ SHA1 m_sha1;
};
}
Modified: trunk/Source/WebKit2/NetworkProcess/cache/NetworkCacheEncoder.cpp (185496 => 185497)
--- trunk/Source/WebKit2/NetworkProcess/cache/NetworkCacheEncoder.cpp 2015-06-12 10:34:14 UTC (rev 185496)
+++ trunk/Source/WebKit2/NetworkProcess/cache/NetworkCacheEncoder.cpp 2015-06-12 10:46:47 UTC (rev 185497)
@@ -32,7 +32,6 @@
namespace NetworkCache {
Encoder::Encoder()
- : m_checksum(0)
{
}
@@ -47,17 +46,16 @@
return m_buffer.data() + newPosition;
}
-void Encoder::updateChecksumForData(unsigned& checksum, const uint8_t* data, size_t size)
+void Encoder::updateChecksumForData(SHA1& sha1, const uint8_t* data, size_t size)
{
- // FIXME: hashMemory should not require alignment.
- size_t hashSize = size - size % 2;
- unsigned hash = StringHasher::hashMemory(data, hashSize) ^ Encoder::Salt<uint8_t*>::value;
- checksum = WTF::pairIntHash(checksum, hash);
+ auto typeSalt = Salt<uint8_t*>::value;
+ sha1.addBytes(reinterpret_cast<uint8_t*>(&typeSalt), sizeof(typeSalt));
+ sha1.addBytes(data, size);
}
void Encoder::encodeFixedLengthData(const uint8_t* data, size_t size)
{
- updateChecksumForData(m_checksum, data, size);
+ updateChecksumForData(m_sha1, data, size);
uint8_t* buffer = grow(size);
memcpy(buffer, data, size);
@@ -66,7 +64,7 @@
template<typename Type>
void Encoder::encodeNumber(Type value)
{
- Encoder::updateChecksumForNumber(m_checksum, value);
+ Encoder::updateChecksumForNumber(m_sha1, value);
uint8_t* buffer = grow(sizeof(Type));
memcpy(buffer, &value, sizeof(Type));
@@ -119,7 +117,9 @@
void Encoder::encodeChecksum()
{
- encodeNumber(m_checksum);
+ SHA1::Digest hash;
+ m_sha1.computeHash(hash);
+ encodeFixedLengthData(hash.data(), hash.size());
}
}
Modified: trunk/Source/WebKit2/NetworkProcess/cache/NetworkCacheEncoder.h (185496 => 185497)
--- trunk/Source/WebKit2/NetworkProcess/cache/NetworkCacheEncoder.h 2015-06-12 10:34:14 UTC (rev 185496)
+++ trunk/Source/WebKit2/NetworkProcess/cache/NetworkCacheEncoder.h 2015-06-12 10:46:47 UTC (rev 185497)
@@ -29,8 +29,7 @@
#if ENABLE(NETWORK_CACHE)
#include "NetworkCacheCoder.h"
-#include <wtf/HashFunctions.h>
-#include <wtf/StringHasher.h>
+#include <wtf/SHA1.h>
#include <wtf/Vector.h>
namespace WebKit {
@@ -69,8 +68,8 @@
const uint8_t* buffer() const { return m_buffer.data(); }
size_t bufferSize() const { return m_buffer.size(); }
- static void updateChecksumForData(unsigned& checksum, const uint8_t*, size_t);
- template <typename Type> static void updateChecksumForNumber(unsigned& checksum, Type);
+ static void updateChecksumForData(SHA1&, const uint8_t*, size_t);
+ template <typename Type> static void updateChecksumForNumber(SHA1&, Type);
private:
void encode(bool);
@@ -90,7 +89,7 @@
template <typename Type> struct Salt;
Vector<uint8_t, 4096> m_buffer;
- unsigned m_checksum;
+ SHA1 m_sha1;
};
template <> struct Encoder::Salt<bool> { static const unsigned value = 3; };
@@ -105,10 +104,11 @@
template <> struct Encoder::Salt<uint8_t*> { static const unsigned value = 101; };
template <typename Type>
-void Encoder::updateChecksumForNumber(unsigned& checksum, Type value)
+void Encoder::updateChecksumForNumber(SHA1& sha1, Type value)
{
- unsigned hash = WTF::intHash(static_cast<uint64_t>(value)) ^ Encoder::Salt<Type>::value;
- checksum = WTF::pairIntHash(checksum, hash);
+ auto typeSalt = Salt<Type>::value;
+ sha1.addBytes(reinterpret_cast<uint8_t*>(&typeSalt), sizeof(typeSalt));
+ sha1.addBytes(reinterpret_cast<uint8_t*>(&value), sizeof(value));
}
}