Changeset 185497 in webkit
- Timestamp:
- Jun 12, 2015, 3:46:47 AM (10 years ago)
- Location:
- trunk/Source/WebKit2
- Files:
-
- 5 edited
Legend:
- Unmodified
- Added
- Removed
-
trunk/Source/WebKit2/ChangeLog
r185496 r185497 1 2015-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 1 28 2015-06-12 Csaba Osztrogonác <ossy@webkit.org> 2 29 -
trunk/Source/WebKit2/NetworkProcess/cache/NetworkCacheDecoder.cpp
r185458 r185497 38 38 , m_bufferPosition(buffer) 39 39 , m_bufferEnd(buffer + bufferSize) 40 , m_checksum(0)41 40 { 42 41 } … … 59 58 m_bufferPosition += size; 60 59 61 Encoder::updateChecksumForData(m_ checksum, data, size);60 Encoder::updateChecksumForData(m_sha1, data, size); 62 61 return true; 63 62 } … … 72 71 m_bufferPosition += sizeof(Type); 73 72 74 Encoder::updateChecksumForNumber(m_ checksum, value);73 Encoder::updateChecksumForNumber(m_sha1, value); 75 74 return true; 76 75 } … … 123 122 bool Decoder::verifyChecksum() 124 123 { 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))) 128 129 return false; 129 return computedChecksum == decodedChecksum; 130 131 return computedHash == savedHash; 130 132 } 131 133 -
trunk/Source/WebKit2/NetworkProcess/cache/NetworkCacheDecoder.h
r185458 r185497 30 30 31 31 #include "NetworkCacheCoder.h" 32 #include <wtf/SHA1.h> 32 33 33 34 namespace WebKit { … … 93 94 const uint8_t* m_bufferEnd; 94 95 95 unsigned m_checksum;96 SHA1 m_sha1; 96 97 }; 97 98 -
trunk/Source/WebKit2/NetworkProcess/cache/NetworkCacheEncoder.cpp
r181140 r185497 33 33 34 34 Encoder::Encoder() 35 : m_checksum(0)36 35 { 37 36 } … … 48 47 } 49 48 50 void Encoder::updateChecksumForData( unsigned& checksum, const uint8_t* data, size_t size)49 void Encoder::updateChecksumForData(SHA1& sha1, const uint8_t* data, size_t size) 51 50 { 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); 56 54 } 57 55 58 56 void Encoder::encodeFixedLengthData(const uint8_t* data, size_t size) 59 57 { 60 updateChecksumForData(m_ checksum, data, size);58 updateChecksumForData(m_sha1, data, size); 61 59 62 60 uint8_t* buffer = grow(size); … … 67 65 void Encoder::encodeNumber(Type value) 68 66 { 69 Encoder::updateChecksumForNumber(m_ checksum, value);67 Encoder::updateChecksumForNumber(m_sha1, value); 70 68 71 69 uint8_t* buffer = grow(sizeof(Type)); … … 120 118 void Encoder::encodeChecksum() 121 119 { 122 encodeNumber(m_checksum); 120 SHA1::Digest hash; 121 m_sha1.computeHash(hash); 122 encodeFixedLengthData(hash.data(), hash.size()); 123 123 } 124 124 -
trunk/Source/WebKit2/NetworkProcess/cache/NetworkCacheEncoder.h
r183265 r185497 30 30 31 31 #include "NetworkCacheCoder.h" 32 #include <wtf/HashFunctions.h> 33 #include <wtf/StringHasher.h> 32 #include <wtf/SHA1.h> 34 33 #include <wtf/Vector.h> 35 34 … … 70 69 size_t bufferSize() const { return m_buffer.size(); } 71 70 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); 74 73 75 74 private: … … 91 90 92 91 Vector<uint8_t, 4096> m_buffer; 93 unsigned m_checksum;92 SHA1 m_sha1; 94 93 }; 95 94 … … 106 105 107 106 template <typename Type> 108 void Encoder::updateChecksumForNumber( unsigned& checksum, Type value)107 void Encoder::updateChecksumForNumber(SHA1& sha1, Type value) 109 108 { 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)); 112 112 } 113 113
Note:
See TracChangeset
for help on using the changeset viewer.