Title: [185497] trunk/Source/WebKit2
Revision
185497
Author
[email protected]
Date
2015-06-12 03:46:47 -0700 (Fri, 12 Jun 2015)

Log Message

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

Modified Paths

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));
 }
 
 }
_______________________________________________
webkit-changes mailing list
[email protected]
https://lists.webkit.org/mailman/listinfo/webkit-changes

Reply via email to