OLD | NEW |
1 /* | 1 /* |
2 * Copyright (C) 2011 Google Inc. All rights reserved. | 2 * Copyright (C) 2011 Google Inc. All rights reserved. |
3 * Copyright (C) Research In Motion Limited 2011. All rights reserved. | 3 * Copyright (C) Research In Motion Limited 2011. All rights reserved. |
4 * | 4 * |
5 * Redistribution and use in source and binary forms, with or without | 5 * Redistribution and use in source and binary forms, with or without |
6 * modification, are permitted provided that the following conditions are | 6 * modification, are permitted provided that the following conditions are |
7 * met: | 7 * met: |
8 * | 8 * |
9 * * Redistributions of source code must retain the above copyright | 9 * * Redistributions of source code must retain the above copyright |
10 * notice, this list of conditions and the following disclaimer. | 10 * notice, this list of conditions and the following disclaimer. |
(...skipping 20 matching lines...) Expand all Loading... |
31 | 31 |
32 #include "config.h" | 32 #include "config.h" |
33 | 33 |
34 #include "modules/websockets/WebSocketHandshake.h" | 34 #include "modules/websockets/WebSocketHandshake.h" |
35 | 35 |
36 #include "core/dom/Document.h" | 36 #include "core/dom/Document.h" |
37 #include "core/inspector/ScriptCallStack.h" | 37 #include "core/inspector/ScriptCallStack.h" |
38 #include "core/loader/CookieJar.h" | 38 #include "core/loader/CookieJar.h" |
39 #include "modules/websockets/WebSocket.h" | 39 #include "modules/websockets/WebSocket.h" |
40 #include "platform/Cookie.h" | 40 #include "platform/Cookie.h" |
| 41 #include "platform/Crypto.h" |
41 #include "platform/Logging.h" | 42 #include "platform/Logging.h" |
42 #include "platform/network/HTTPHeaderMap.h" | 43 #include "platform/network/HTTPHeaderMap.h" |
43 #include "platform/network/HTTPParsers.h" | 44 #include "platform/network/HTTPParsers.h" |
44 #include "platform/weborigin/SecurityOrigin.h" | 45 #include "platform/weborigin/SecurityOrigin.h" |
45 #include "public/platform/Platform.h" | 46 #include "public/platform/Platform.h" |
46 #include "wtf/CryptographicallyRandomNumber.h" | 47 #include "wtf/CryptographicallyRandomNumber.h" |
47 #include "wtf/SHA1.h" | |
48 #include "wtf/StdLibExtras.h" | 48 #include "wtf/StdLibExtras.h" |
49 #include "wtf/StringExtras.h" | 49 #include "wtf/StringExtras.h" |
50 #include "wtf/Vector.h" | 50 #include "wtf/Vector.h" |
51 #include "wtf/text/Base64.h" | 51 #include "wtf/text/Base64.h" |
52 #include "wtf/text/CString.h" | 52 #include "wtf/text/CString.h" |
53 #include "wtf/text/StringBuilder.h" | 53 #include "wtf/text/StringBuilder.h" |
54 #include "wtf/unicode/CharacterNames.h" | 54 #include "wtf/unicode/CharacterNames.h" |
55 | 55 |
56 namespace WebCore { | 56 namespace WebCore { |
57 | 57 |
(...skipping 54 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
112 { | 112 { |
113 static const size_t nonceSize = 16; | 113 static const size_t nonceSize = 16; |
114 unsigned char key[nonceSize]; | 114 unsigned char key[nonceSize]; |
115 cryptographicallyRandomValues(key, nonceSize); | 115 cryptographicallyRandomValues(key, nonceSize); |
116 return base64Encode(reinterpret_cast<char*>(key), nonceSize); | 116 return base64Encode(reinterpret_cast<char*>(key), nonceSize); |
117 } | 117 } |
118 | 118 |
119 String WebSocketHandshake::getExpectedWebSocketAccept(const String& secWebSocket
Key) | 119 String WebSocketHandshake::getExpectedWebSocketAccept(const String& secWebSocket
Key) |
120 { | 120 { |
121 static const char webSocketKeyGUID[] = "258EAFA5-E914-47DA-95CA-C5AB0DC85B11
"; | 121 static const char webSocketKeyGUID[] = "258EAFA5-E914-47DA-95CA-C5AB0DC85B11
"; |
122 SHA1 sha1; | |
123 CString keyData = secWebSocketKey.ascii(); | 122 CString keyData = secWebSocketKey.ascii(); |
124 sha1.addBytes(reinterpret_cast<const uint8_t*>(keyData.data()), keyData.leng
th()); | 123 |
125 sha1.addBytes(reinterpret_cast<const uint8_t*>(webSocketKeyGUID), strlen(web
SocketKeyGUID)); | 124 StringBuilder digestable; |
126 Vector<uint8_t, SHA1::outputSizeBytes> hash; | 125 digestable.append(secWebSocketKey); |
127 sha1.computeHash(hash); | 126 digestable.append(webSocketKeyGUID, strlen(webSocketKeyGUID)); |
128 return base64Encode(reinterpret_cast<const char*>(hash.data()), | 127 CString digestableCString = digestable.toString().utf8(); |
129 SHA1::outputSizeBytes); | 128 DigestValue digest; |
| 129 computeDigest(HashAlgorithmSha1, digestableCString.data(), digestableCString
.length(), digest); |
| 130 |
| 131 return base64Encode(reinterpret_cast<const char*>(digest.data()), sha1HashSi
ze); |
130 } | 132 } |
131 | 133 |
132 WebSocketHandshake::WebSocketHandshake(const KURL& url, const String& protocol,
Document* document) | 134 WebSocketHandshake::WebSocketHandshake(const KURL& url, const String& protocol,
Document* document) |
133 : m_url(url) | 135 : m_url(url) |
134 , m_clientProtocol(protocol) | 136 , m_clientProtocol(protocol) |
135 , m_secure(m_url.protocolIs("wss")) | 137 , m_secure(m_url.protocolIs("wss")) |
136 , m_document(document) | 138 , m_document(document) |
137 , m_mode(Incomplete) | 139 , m_mode(Incomplete) |
138 { | 140 { |
139 m_secWebSocketKey = generateSecWebSocketKey(); | 141 m_secWebSocketKey = generateSecWebSocketKey(); |
(...skipping 420 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
560 } | 562 } |
561 if (!match) { | 563 if (!match) { |
562 m_failureReason = formatHandshakeFailureReason("Sent non-empty 'Sec-
WebSocket-Protocol' header but no response was received"); | 564 m_failureReason = formatHandshakeFailureReason("Sent non-empty 'Sec-
WebSocket-Protocol' header but no response was received"); |
563 return false; | 565 return false; |
564 } | 566 } |
565 } | 567 } |
566 return true; | 568 return true; |
567 } | 569 } |
568 | 570 |
569 } // namespace WebCore | 571 } // namespace WebCore |
OLD | NEW |