String WebSocketHandshake::getExpectedWebSocketAccept(const String& secWebSocketKey) { static const char* const webSocketKeyGUID = "258EAFA5-E914-47DA-95CA-C5AB0DC85B11"; SHA1 sha1; CString keyData = secWebSocketKey.ascii(); sha1.addBytes(reinterpret_cast<const uint8_t*>(keyData.data()), keyData.length()); sha1.addBytes(reinterpret_cast<const uint8_t*>(webSocketKeyGUID), strlen(webSocketKeyGUID)); SHA1::Digest hash; sha1.computeHash(hash); return base64Encode(hash.data(), SHA1::hashSize); }
std::unique_ptr<DOMPatchSupport::Digest> DOMPatchSupport::createDigest(Node* node, UnusedNodesMap* unusedNodesMap) { auto digest = std::make_unique<Digest>(node); SHA1 sha1; Node::NodeType nodeType = node->nodeType(); sha1.addBytes(reinterpret_cast<const uint8_t*>(&nodeType), sizeof(nodeType)); addStringToSHA1(sha1, node->nodeName()); addStringToSHA1(sha1, node->nodeValue()); if (node->nodeType() == Node::ELEMENT_NODE) { Node* child = node->firstChild(); while (child) { std::unique_ptr<Digest> childInfo = createDigest(child, unusedNodesMap); addStringToSHA1(sha1, childInfo->m_sha1); child = child->nextSibling(); digest->m_children.append(WTF::move(childInfo)); } Element* element = toElement(node); if (element->hasAttributesWithoutUpdate()) { SHA1 attrsSHA1; for (const Attribute& attribute : element->attributesIterator()) { addStringToSHA1(attrsSHA1, attribute.name().toString()); addStringToSHA1(attrsSHA1, attribute.value()); } SHA1::Digest attrsHash; attrsSHA1.computeHash(attrsHash); digest->m_attrsSHA1 = base64Encode(attrsHash.data(), 10); addStringToSHA1(sha1, digest->m_attrsSHA1); } } SHA1::Digest hash; sha1.computeHash(hash); digest->m_sha1 = base64Encode(hash.data(), 10); if (unusedNodesMap) unusedNodesMap->add(digest->m_sha1, digest.get()); return digest; }
string FilesystemCache::fileUrl(const Sha1::Digest& sha1) const { return Directory::join(filePath(sha1), sha1.hexString().substr(2)); }
string FilesystemCache::filePath(const Sha1::Digest& sha1) const { return Directory::join(_url, sha1.hexString().substr(0, 2)); }
bool Coder<SHA1::Digest>::decode(Decoder& decoder, SHA1::Digest& digest) { return decoder.decodeFixedLengthData(digest.data(), sizeof(digest)); }
void Coder<SHA1::Digest>::encode(Encoder& encoder, const SHA1::Digest& digest) { encoder.encodeFixedLengthData(digest.data(), sizeof(digest)); }