Changeset 185497 in webkit


Ignore:
Timestamp:
Jun 12, 2015, 3:46:47 AM (10 years ago)
Author:
Antti Koivisto
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):

Location:
trunk/Source/WebKit2
Files:
5 edited

Legend:

Unmodified
Added
Removed
  • trunk/Source/WebKit2/ChangeLog

    r185496 r185497  
     12015-06-12  Antti Koivisto  <antti@apple.com>
     2
     3        Use SHA1 for cache coder checksums
     4        https://bugs.webkit.org/show_bug.cgi?id=145880
     5
     6        Reviewed by Anders Carlsson.
     7
     8        Make cache data error detection more robust by using SHA1 for checksums.
     9
     10        * NetworkProcess/cache/NetworkCacheDecoder.cpp:
     11        (WebKit::NetworkCache::Decoder::Decoder):
     12        (WebKit::NetworkCache::Decoder::decodeFixedLengthData):
     13        (WebKit::NetworkCache::Decoder::decodeNumber):
     14        (WebKit::NetworkCache::Decoder::verifyChecksum):
     15        * NetworkProcess/cache/NetworkCacheDecoder.h:
     16        * NetworkProcess/cache/NetworkCacheEncoder.cpp:
     17        (WebKit::NetworkCache::Encoder::Encoder):
     18        (WebKit::NetworkCache::Encoder::grow):
     19        (WebKit::NetworkCache::Encoder::updateChecksumForData):
     20        (WebKit::NetworkCache::Encoder::encodeFixedLengthData):
     21        (WebKit::NetworkCache::Encoder::encodeNumber):
     22        (WebKit::NetworkCache::Encoder::encodeChecksum):
     23        * NetworkProcess/cache/NetworkCacheEncoder.h:
     24        (WebKit::NetworkCache::Encoder::buffer):
     25        (WebKit::NetworkCache::Encoder::bufferSize):
     26        (WebKit::NetworkCache::Encoder::updateChecksumForNumber):
     27
    1282015-06-12  Csaba Osztrogonác  <ossy@webkit.org>
    229
  • trunk/Source/WebKit2/NetworkProcess/cache/NetworkCacheDecoder.cpp

    r185458 r185497  
    3838    , m_bufferPosition(buffer)
    3939    , m_bufferEnd(buffer + bufferSize)
    40     , m_checksum(0)
    4140{
    4241}
     
    5958    m_bufferPosition += size;
    6059
    61     Encoder::updateChecksumForData(m_checksum, data, size);
     60    Encoder::updateChecksumForData(m_sha1, data, size);
    6261    return true;
    6362}
     
    7271    m_bufferPosition += sizeof(Type);
    7372
    74     Encoder::updateChecksumForNumber(m_checksum, value);
     73    Encoder::updateChecksumForNumber(m_sha1, value);
    7574    return true;
    7675}
     
    123122bool Decoder::verifyChecksum()
    124123{
    125     unsigned computedChecksum = m_checksum;
    126     unsigned decodedChecksum;
    127     if (!decodeNumber(decodedChecksum))
     124    SHA1::Digest computedHash;
     125    m_sha1.computeHash(computedHash);
     126
     127    SHA1::Digest savedHash;
     128    if (!decodeFixedLengthData(savedHash.data(), sizeof(savedHash)))
    128129        return false;
    129     return computedChecksum == decodedChecksum;
     130
     131    return computedHash == savedHash;
    130132}
    131133
  • trunk/Source/WebKit2/NetworkProcess/cache/NetworkCacheDecoder.h

    r185458 r185497  
    3030
    3131#include "NetworkCacheCoder.h"
     32#include <wtf/SHA1.h>
    3233
    3334namespace WebKit {
     
    9394    const uint8_t* m_bufferEnd;
    9495
    95     unsigned m_checksum;
     96    SHA1 m_sha1;
    9697};
    9798
  • trunk/Source/WebKit2/NetworkProcess/cache/NetworkCacheEncoder.cpp

    r181140 r185497  
    3333
    3434Encoder::Encoder()
    35     : m_checksum(0)
    3635{
    3736}
     
    4847}
    4948
    50 void Encoder::updateChecksumForData(unsigned& checksum, const uint8_t* data, size_t size)
     49void Encoder::updateChecksumForData(SHA1& sha1, const uint8_t* data, size_t size)
    5150{
    52     // FIXME: hashMemory should not require alignment.
    53     size_t hashSize = size - size % 2;
    54     unsigned hash = StringHasher::hashMemory(data, hashSize) ^ Encoder::Salt<uint8_t*>::value;
    55     checksum = WTF::pairIntHash(checksum, hash);
     51    auto typeSalt = Salt<uint8_t*>::value;
     52    sha1.addBytes(reinterpret_cast<uint8_t*>(&typeSalt), sizeof(typeSalt));
     53    sha1.addBytes(data, size);
    5654}
    5755
    5856void Encoder::encodeFixedLengthData(const uint8_t* data, size_t size)
    5957{
    60     updateChecksumForData(m_checksum, data, size);
     58    updateChecksumForData(m_sha1, data, size);
    6159
    6260    uint8_t* buffer = grow(size);
     
    6765void Encoder::encodeNumber(Type value)
    6866{
    69     Encoder::updateChecksumForNumber(m_checksum, value);
     67    Encoder::updateChecksumForNumber(m_sha1, value);
    7068
    7169    uint8_t* buffer = grow(sizeof(Type));
     
    120118void Encoder::encodeChecksum()
    121119{
    122     encodeNumber(m_checksum);
     120    SHA1::Digest hash;
     121    m_sha1.computeHash(hash);
     122    encodeFixedLengthData(hash.data(), hash.size());
    123123}
    124124
  • trunk/Source/WebKit2/NetworkProcess/cache/NetworkCacheEncoder.h

    r183265 r185497  
    3030
    3131#include "NetworkCacheCoder.h"
    32 #include <wtf/HashFunctions.h>
    33 #include <wtf/StringHasher.h>
     32#include <wtf/SHA1.h>
    3433#include <wtf/Vector.h>
    3534
     
    7069    size_t bufferSize() const { return m_buffer.size(); }
    7170
    72     static void updateChecksumForData(unsigned& checksum, const uint8_t*, size_t);
    73     template <typename Type> static void updateChecksumForNumber(unsigned& checksum, Type);
     71    static void updateChecksumForData(SHA1&, const uint8_t*, size_t);
     72    template <typename Type> static void updateChecksumForNumber(SHA1&, Type);
    7473
    7574private:
     
    9190
    9291    Vector<uint8_t, 4096> m_buffer;
    93     unsigned m_checksum;
     92    SHA1 m_sha1;
    9493};
    9594
     
    106105
    107106template <typename Type>
    108 void Encoder::updateChecksumForNumber(unsigned& checksum, Type value)
     107void Encoder::updateChecksumForNumber(SHA1& sha1, Type value)
    109108{
    110     unsigned hash = WTF::intHash(static_cast<uint64_t>(value)) ^ Encoder::Salt<Type>::value;
    111     checksum = WTF::pairIntHash(checksum, hash);
     109    auto typeSalt = Salt<Type>::value;
     110    sha1.addBytes(reinterpret_cast<uint8_t*>(&typeSalt), sizeof(typeSalt));
     111    sha1.addBytes(reinterpret_cast<uint8_t*>(&value), sizeof(value));
    112112}
    113113
Note: See TracChangeset for help on using the changeset viewer.