Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(110)

Side by Side Diff: net/websockets/websocket_frame.cc

Issue 1399303002: net/websockets: Convert int types from basictypes.h to the ones from stdint.h (Closed) Base URL: https://chromium.googlesource.com/chromium/src.git@master
Patch Set: websocket_deflate_stream.cc Created 5 years, 2 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch
« no previous file with comments | « net/websockets/websocket_frame.h ('k') | net/websockets/websocket_frame_parser.h » ('j') | no next file with comments »
Toggle Intra-line Diffs ('i') | Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
OLDNEW
1 // Copyright (c) 2012 The Chromium Authors. All rights reserved. 1 // Copyright (c) 2012 The Chromium Authors. All rights reserved.
2 // Use of this source code is governed by a BSD-style license that can be 2 // Use of this source code is governed by a BSD-style license that can be
3 // found in the LICENSE file. 3 // found in the LICENSE file.
4 4
5 #include "net/websockets/websocket_frame.h" 5 #include "net/websockets/websocket_frame.h"
6 6
7 #include <stddef.h> 7 #include <stddef.h>
8 #include <stdint.h> 8 #include <stdint.h>
9 9
10 #include <algorithm> 10 #include <algorithm>
(...skipping 17 matching lines...) Expand all
28 28
29 using PackedMaskType = uint32_t __attribute__((vector_size(16))); 29 using PackedMaskType = uint32_t __attribute__((vector_size(16)));
30 30
31 #else 31 #else
32 32
33 using PackedMaskType = size_t; 33 using PackedMaskType = size_t;
34 34
35 #endif // defined(COMPILER_GCC) && defined(ARCH_CPU_X86_FAMILY) && 35 #endif // defined(COMPILER_GCC) && defined(ARCH_CPU_X86_FAMILY) &&
36 // !defined(OS_NACL) 36 // !defined(OS_NACL)
37 37
38 const uint8 kFinalBit = 0x80; 38 const uint8_t kFinalBit = 0x80;
39 const uint8 kReserved1Bit = 0x40; 39 const uint8_t kReserved1Bit = 0x40;
40 const uint8 kReserved2Bit = 0x20; 40 const uint8_t kReserved2Bit = 0x20;
41 const uint8 kReserved3Bit = 0x10; 41 const uint8_t kReserved3Bit = 0x10;
42 const uint8 kOpCodeMask = 0xF; 42 const uint8_t kOpCodeMask = 0xF;
43 const uint8 kMaskBit = 0x80; 43 const uint8_t kMaskBit = 0x80;
44 const uint64 kMaxPayloadLengthWithoutExtendedLengthField = 125; 44 const uint64_t kMaxPayloadLengthWithoutExtendedLengthField = 125;
45 const uint64 kPayloadLengthWithTwoByteExtendedLengthField = 126; 45 const uint64_t kPayloadLengthWithTwoByteExtendedLengthField = 126;
46 const uint64 kPayloadLengthWithEightByteExtendedLengthField = 127; 46 const uint64_t kPayloadLengthWithEightByteExtendedLengthField = 127;
47 47
48 inline void MaskWebSocketFramePayloadByBytes( 48 inline void MaskWebSocketFramePayloadByBytes(
49 const WebSocketMaskingKey& masking_key, 49 const WebSocketMaskingKey& masking_key,
50 size_t masking_key_offset, 50 size_t masking_key_offset,
51 char* const begin, 51 char* const begin,
52 char* const end) { 52 char* const end) {
53 for (char* masked = begin; masked != end; ++masked) { 53 for (char* masked = begin; masked != end; ++masked) {
54 *masked ^= masking_key.key[masking_key_offset++]; 54 *masked ^= masking_key.key[masking_key_offset++];
55 if (masking_key_offset == WebSocketFrameHeader::kMaskingKeyLength) 55 if (masking_key_offset == WebSocketFrameHeader::kMaskingKeyLength)
56 masking_key_offset = 0; 56 masking_key_offset = 0;
(...skipping 39 matching lines...) Expand 10 before | Expand all | Expand 10 after
96 return (WebSocketFrameHeader::kBaseHeaderSize + extended_length_size + 96 return (WebSocketFrameHeader::kBaseHeaderSize + extended_length_size +
97 (header.masked ? WebSocketFrameHeader::kMaskingKeyLength : 0)); 97 (header.masked ? WebSocketFrameHeader::kMaskingKeyLength : 0));
98 } 98 }
99 99
100 int WriteWebSocketFrameHeader(const WebSocketFrameHeader& header, 100 int WriteWebSocketFrameHeader(const WebSocketFrameHeader& header,
101 const WebSocketMaskingKey* masking_key, 101 const WebSocketMaskingKey* masking_key,
102 char* buffer, 102 char* buffer,
103 int buffer_size) { 103 int buffer_size) {
104 DCHECK((header.opcode & kOpCodeMask) == header.opcode) 104 DCHECK((header.opcode & kOpCodeMask) == header.opcode)
105 << "header.opcode must fit to kOpCodeMask."; 105 << "header.opcode must fit to kOpCodeMask.";
106 DCHECK(header.payload_length <= static_cast<uint64>(kint64max)) 106 DCHECK(header.payload_length <= static_cast<uint64_t>(kint64max))
107 << "WebSocket specification doesn't allow a frame longer than " 107 << "WebSocket specification doesn't allow a frame longer than "
108 << "kint64max (0x7FFFFFFFFFFFFFFF) bytes."; 108 << "kint64max (0x7FFFFFFFFFFFFFFF) bytes.";
109 DCHECK_GE(buffer_size, 0); 109 DCHECK_GE(buffer_size, 0);
110 110
111 // WebSocket frame format is as follows: 111 // WebSocket frame format is as follows:
112 // - Common header (2 bytes) 112 // - Common header (2 bytes)
113 // - Optional extended payload length 113 // - Optional extended payload length
114 // (2 or 8 bytes, present if actual payload length is more than 125 bytes) 114 // (2 or 8 bytes, present if actual payload length is more than 125 bytes)
115 // - Optional masking key (4 bytes, present if MASK bit is on) 115 // - Optional masking key (4 bytes, present if MASK bit is on)
116 // - Actual payload (XOR masked with masking key if MASK bit is on) 116 // - Actual payload (XOR masked with masking key if MASK bit is on)
117 // 117 //
118 // This function constructs frame header (the first three in the list 118 // This function constructs frame header (the first three in the list
119 // above). 119 // above).
120 120
121 int header_size = GetWebSocketFrameHeaderSize(header); 121 int header_size = GetWebSocketFrameHeaderSize(header);
122 if (header_size > buffer_size) 122 if (header_size > buffer_size)
123 return ERR_INVALID_ARGUMENT; 123 return ERR_INVALID_ARGUMENT;
124 124
125 int buffer_index = 0; 125 int buffer_index = 0;
126 126
127 uint8 first_byte = 0u; 127 uint8_t first_byte = 0u;
128 first_byte |= header.final ? kFinalBit : 0u; 128 first_byte |= header.final ? kFinalBit : 0u;
129 first_byte |= header.reserved1 ? kReserved1Bit : 0u; 129 first_byte |= header.reserved1 ? kReserved1Bit : 0u;
130 first_byte |= header.reserved2 ? kReserved2Bit : 0u; 130 first_byte |= header.reserved2 ? kReserved2Bit : 0u;
131 first_byte |= header.reserved3 ? kReserved3Bit : 0u; 131 first_byte |= header.reserved3 ? kReserved3Bit : 0u;
132 first_byte |= header.opcode & kOpCodeMask; 132 first_byte |= header.opcode & kOpCodeMask;
133 buffer[buffer_index++] = first_byte; 133 buffer[buffer_index++] = first_byte;
134 134
135 int extended_length_size = 0; 135 int extended_length_size = 0;
136 uint8 second_byte = 0u; 136 uint8_t second_byte = 0u;
137 second_byte |= header.masked ? kMaskBit : 0u; 137 second_byte |= header.masked ? kMaskBit : 0u;
138 if (header.payload_length <= kMaxPayloadLengthWithoutExtendedLengthField) { 138 if (header.payload_length <= kMaxPayloadLengthWithoutExtendedLengthField) {
139 second_byte |= header.payload_length; 139 second_byte |= header.payload_length;
140 } else if (header.payload_length <= kuint16max) { 140 } else if (header.payload_length <= kuint16max) {
141 second_byte |= kPayloadLengthWithTwoByteExtendedLengthField; 141 second_byte |= kPayloadLengthWithTwoByteExtendedLengthField;
142 extended_length_size = 2; 142 extended_length_size = 2;
143 } else { 143 } else {
144 second_byte |= kPayloadLengthWithEightByteExtendedLengthField; 144 second_byte |= kPayloadLengthWithEightByteExtendedLengthField;
145 extended_length_size = 8; 145 extended_length_size = 8;
146 } 146 }
147 buffer[buffer_index++] = second_byte; 147 buffer[buffer_index++] = second_byte;
148 148
149 // Writes "extended payload length" field. 149 // Writes "extended payload length" field.
150 if (extended_length_size == 2) { 150 if (extended_length_size == 2) {
151 uint16 payload_length_16 = static_cast<uint16>(header.payload_length); 151 uint16_t payload_length_16 = static_cast<uint16_t>(header.payload_length);
152 base::WriteBigEndian(buffer + buffer_index, payload_length_16); 152 base::WriteBigEndian(buffer + buffer_index, payload_length_16);
153 buffer_index += sizeof(payload_length_16); 153 buffer_index += sizeof(payload_length_16);
154 } else if (extended_length_size == 8) { 154 } else if (extended_length_size == 8) {
155 base::WriteBigEndian(buffer + buffer_index, header.payload_length); 155 base::WriteBigEndian(buffer + buffer_index, header.payload_length);
156 buffer_index += sizeof(header.payload_length); 156 buffer_index += sizeof(header.payload_length);
157 } 157 }
158 158
159 // Writes "masking key" field, if needed. 159 // Writes "masking key" field, if needed.
160 if (header.masked) { 160 if (header.masked) {
161 DCHECK(masking_key); 161 DCHECK(masking_key);
(...skipping 12 matching lines...) Expand all
174 WebSocketMaskingKey GenerateWebSocketMaskingKey() { 174 WebSocketMaskingKey GenerateWebSocketMaskingKey() {
175 // Masking keys should be generated from a cryptographically secure random 175 // Masking keys should be generated from a cryptographically secure random
176 // number generator, which means web application authors should not be able 176 // number generator, which means web application authors should not be able
177 // to guess the next value of masking key. 177 // to guess the next value of masking key.
178 WebSocketMaskingKey masking_key; 178 WebSocketMaskingKey masking_key;
179 base::RandBytes(masking_key.key, WebSocketFrameHeader::kMaskingKeyLength); 179 base::RandBytes(masking_key.key, WebSocketFrameHeader::kMaskingKeyLength);
180 return masking_key; 180 return masking_key;
181 } 181 }
182 182
183 void MaskWebSocketFramePayload(const WebSocketMaskingKey& masking_key, 183 void MaskWebSocketFramePayload(const WebSocketMaskingKey& masking_key,
184 uint64 frame_offset, 184 uint64_t frame_offset,
185 char* const data, 185 char* const data,
186 int data_size) { 186 int data_size) {
187 static const size_t kMaskingKeyLength = 187 static const size_t kMaskingKeyLength =
188 WebSocketFrameHeader::kMaskingKeyLength; 188 WebSocketFrameHeader::kMaskingKeyLength;
189 189
190 DCHECK_GE(data_size, 0); 190 DCHECK_GE(data_size, 0);
191 191
192 // Most of the masking is done in chunks of sizeof(PackedMaskType), except for 192 // Most of the masking is done in chunks of sizeof(PackedMaskType), except for
193 // the beginning and the end of the buffer which may be unaligned. 193 // the beginning and the end of the buffer which may be unaligned.
194 // PackedMaskType must be a multiple of kMaskingKeyLength in size. 194 // PackedMaskType must be a multiple of kMaskingKeyLength in size.
(...skipping 51 matching lines...) Expand 10 before | Expand all | Expand 10 after
246 } 246 }
247 247
248 MaskWebSocketFramePayloadByBytes( 248 MaskWebSocketFramePayloadByBytes(
249 masking_key, 249 masking_key,
250 (frame_offset + (aligned_end - data)) % kMaskingKeyLength, 250 (frame_offset + (aligned_end - data)) % kMaskingKeyLength,
251 aligned_end, 251 aligned_end,
252 end); 252 end);
253 } 253 }
254 254
255 } // namespace net 255 } // namespace net
OLDNEW
« no previous file with comments | « net/websockets/websocket_frame.h ('k') | net/websockets/websocket_frame_parser.h » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698