diff options
author | jsing <> | 2014-04-14 14:16:33 +0000 |
---|---|---|
committer | jsing <> | 2014-04-14 14:16:33 +0000 |
commit | 95692a60ee0169e369d59f82504e36ff376e13ba (patch) | |
tree | d3a4c41549109f6de6427907f10589c02eec0d25 /src/lib/libssl/d1_pkt.c | |
parent | 72c1bd17672378115dcd5254ed88828e45357e7f (diff) | |
download | openbsd-95692a60ee0169e369d59f82504e36ff376e13ba.tar.gz openbsd-95692a60ee0169e369d59f82504e36ff376e13ba.tar.bz2 openbsd-95692a60ee0169e369d59f82504e36ff376e13ba.zip |
First pass at applying KNF to the OpenSSL code, which almost makes it
readable. This pass is whitespace only and can readily be verified using
tr and md5.
Diffstat (limited to 'src/lib/libssl/d1_pkt.c')
-rw-r--r-- | src/lib/libssl/d1_pkt.c | 1461 |
1 files changed, 687 insertions, 774 deletions
diff --git a/src/lib/libssl/d1_pkt.c b/src/lib/libssl/d1_pkt.c index 52f7fc022f..30fe8460fb 100644 --- a/src/lib/libssl/d1_pkt.c +++ b/src/lib/libssl/d1_pkt.c | |||
@@ -122,107 +122,120 @@ | |||
122 | #include <openssl/rand.h> | 122 | #include <openssl/rand.h> |
123 | 123 | ||
124 | /* mod 128 saturating subtract of two 64-bit values in big-endian order */ | 124 | /* mod 128 saturating subtract of two 64-bit values in big-endian order */ |
125 | static int satsub64be(const unsigned char *v1,const unsigned char *v2) | 125 | static int |
126 | { int ret,sat,brw,i; | 126 | satsub64be(const unsigned char *v1, const unsigned char *v2) |
127 | 127 | { | |
128 | if (sizeof(long) == 8) do | 128 | int ret, sat, brw, i; |
129 | { const union { long one; char little; } is_endian = {1}; | 129 | |
130 | long l; | 130 | if (sizeof(long) == 8) |
131 | 131 | do { | |
132 | if (is_endian.little) break; | 132 | const union { |
133 | /* not reached on little-endians */ | 133 | long one; |
134 | /* following test is redundant, because input is | 134 | char little; |
135 | * always aligned, but I take no chances... */ | 135 | } is_endian = {1}; |
136 | if (((size_t)v1|(size_t)v2)&0x7) break; | 136 | long l; |
137 | 137 | ||
138 | l = *((long *)v1); | 138 | if (is_endian.little) |
139 | l -= *((long *)v2); | 139 | break; |
140 | if (l>128) return 128; | 140 | /* not reached on little-endians */ |
141 | else if (l<-128) return -128; | 141 | /* following test is redundant, because input is |
142 | else return (int)l; | 142 | * always aligned, but I take no chances... */ |
143 | } while (0); | 143 | if (((size_t)v1 | (size_t)v2) & 0x7) |
144 | 144 | break; | |
145 | ret = (int)v1[7]-(int)v2[7]; | 145 | |
146 | l = *((long *)v1); | ||
147 | l -= *((long *)v2); | ||
148 | if (l > 128) | ||
149 | return 128; | ||
150 | else if (l<-128) | ||
151 | return -128; | ||
152 | else | ||
153 | return (int)l; | ||
154 | } while (0); | ||
155 | |||
156 | ret = (int)v1[7] - (int)v2[7]; | ||
146 | sat = 0; | 157 | sat = 0; |
147 | brw = ret>>8; /* brw is either 0 or -1 */ | 158 | brw = ret >> 8; /* brw is either 0 or -1 */ |
148 | if (ret & 0x80) | 159 | if (ret & 0x80) { |
149 | { for (i=6;i>=0;i--) | 160 | for (i = 6; i >= 0; i--) { |
150 | { brw += (int)v1[i]-(int)v2[i]; | 161 | brw += (int)v1[i]-(int)v2[i]; |
151 | sat |= ~brw; | 162 | sat |= ~brw; |
152 | brw >>= 8; | 163 | brw >>= 8; |
153 | } | 164 | } |
154 | } | 165 | } else { |
155 | else | 166 | for (i = 6; i >= 0; i--) { |
156 | { for (i=6;i>=0;i--) | 167 | brw += (int)v1[i]-(int)v2[i]; |
157 | { brw += (int)v1[i]-(int)v2[i]; | ||
158 | sat |= brw; | 168 | sat |= brw; |
159 | brw >>= 8; | 169 | brw >>= 8; |
160 | } | 170 | } |
161 | } | 171 | } |
162 | brw <<= 8; /* brw is either 0 or -256 */ | 172 | brw <<= 8; /* brw is either 0 or -256 */ |
163 | 173 | ||
164 | if (sat&0xff) return brw | 0x80; | 174 | if (sat & 0xff) |
165 | else return brw + (ret&0xFF); | 175 | return brw | 0x80; |
176 | else | ||
177 | return brw + (ret & 0xFF); | ||
166 | } | 178 | } |
167 | 179 | ||
168 | static int have_handshake_fragment(SSL *s, int type, unsigned char *buf, | 180 | static int have_handshake_fragment(SSL *s, int type, unsigned char *buf, |
169 | int len, int peek); | 181 | int len, int peek); |
170 | static int dtls1_record_replay_check(SSL *s, DTLS1_BITMAP *bitmap); | 182 | static int dtls1_record_replay_check(SSL *s, DTLS1_BITMAP *bitmap); |
171 | static void dtls1_record_bitmap_update(SSL *s, DTLS1_BITMAP *bitmap); | 183 | static void dtls1_record_bitmap_update(SSL *s, DTLS1_BITMAP *bitmap); |
172 | static DTLS1_BITMAP *dtls1_get_bitmap(SSL *s, SSL3_RECORD *rr, | 184 | static DTLS1_BITMAP *dtls1_get_bitmap(SSL *s, SSL3_RECORD *rr, |
173 | unsigned int *is_next_epoch); | 185 | unsigned int *is_next_epoch); |
174 | #if 0 | 186 | #if 0 |
175 | static int dtls1_record_needs_buffering(SSL *s, SSL3_RECORD *rr, | 187 | static int dtls1_record_needs_buffering(SSL *s, SSL3_RECORD *rr, |
176 | unsigned short *priority, unsigned long *offset); | 188 | unsigned short *priority, unsigned long *offset); |
177 | #endif | 189 | #endif |
178 | static int dtls1_buffer_record(SSL *s, record_pqueue *q, | 190 | static int dtls1_buffer_record(SSL *s, record_pqueue *q, |
179 | unsigned char *priority); | 191 | unsigned char *priority); |
180 | static int dtls1_process_record(SSL *s); | 192 | static int dtls1_process_record(SSL *s); |
181 | 193 | ||
182 | /* copy buffered record into SSL structure */ | 194 | /* copy buffered record into SSL structure */ |
183 | static int | 195 | static int |
184 | dtls1_copy_record(SSL *s, pitem *item) | 196 | dtls1_copy_record(SSL *s, pitem *item) |
185 | { | 197 | { |
186 | DTLS1_RECORD_DATA *rdata; | 198 | DTLS1_RECORD_DATA *rdata; |
187 | 199 | ||
188 | rdata = (DTLS1_RECORD_DATA *)item->data; | 200 | rdata = (DTLS1_RECORD_DATA *)item->data; |
189 | 201 | ||
190 | if (s->s3->rbuf.buf != NULL) | 202 | if (s->s3->rbuf.buf != NULL) |
191 | OPENSSL_free(s->s3->rbuf.buf); | 203 | OPENSSL_free(s->s3->rbuf.buf); |
192 | 204 | ||
193 | s->packet = rdata->packet; | 205 | s->packet = rdata->packet; |
194 | s->packet_length = rdata->packet_length; | 206 | s->packet_length = rdata->packet_length; |
195 | memcpy(&(s->s3->rbuf), &(rdata->rbuf), sizeof(SSL3_BUFFER)); | 207 | memcpy(&(s->s3->rbuf), &(rdata->rbuf), sizeof(SSL3_BUFFER)); |
196 | memcpy(&(s->s3->rrec), &(rdata->rrec), sizeof(SSL3_RECORD)); | 208 | memcpy(&(s->s3->rrec), &(rdata->rrec), sizeof(SSL3_RECORD)); |
197 | 209 | ||
198 | /* Set proper sequence number for mac calculation */ | 210 | /* Set proper sequence number for mac calculation */ |
199 | memcpy(&(s->s3->read_sequence[2]), &(rdata->packet[5]), 6); | 211 | memcpy(&(s->s3->read_sequence[2]), &(rdata->packet[5]), 6); |
200 | 212 | ||
201 | return(1); | 213 | return (1); |
202 | } | 214 | } |
203 | 215 | ||
204 | 216 | ||
205 | static int | 217 | static int |
206 | dtls1_buffer_record(SSL *s, record_pqueue *queue, unsigned char *priority) | 218 | dtls1_buffer_record(SSL *s, record_pqueue *queue, unsigned char *priority) |
207 | { | 219 | { |
208 | DTLS1_RECORD_DATA *rdata; | 220 | DTLS1_RECORD_DATA *rdata; |
209 | pitem *item; | 221 | pitem *item; |
210 | 222 | ||
211 | /* Limit the size of the queue to prevent DOS attacks */ | 223 | /* Limit the size of the queue to prevent DOS attacks */ |
212 | if (pqueue_size(queue->q) >= 100) | 224 | if (pqueue_size(queue->q) >= 100) |
213 | return 0; | 225 | return 0; |
214 | 226 | ||
215 | rdata = OPENSSL_malloc(sizeof(DTLS1_RECORD_DATA)); | 227 | rdata = OPENSSL_malloc(sizeof(DTLS1_RECORD_DATA)); |
216 | item = pitem_new(priority, rdata); | 228 | item = pitem_new(priority, rdata); |
217 | if (rdata == NULL || item == NULL) | 229 | if (rdata == NULL || item == NULL) { |
218 | { | 230 | if (rdata != NULL) |
219 | if (rdata != NULL) OPENSSL_free(rdata); | 231 | OPENSSL_free(rdata); |
220 | if (item != NULL) pitem_free(item); | 232 | if (item != NULL) |
221 | 233 | pitem_free(item); | |
234 | |||
222 | SSLerr(SSL_F_DTLS1_BUFFER_RECORD, ERR_R_INTERNAL_ERROR); | 235 | SSLerr(SSL_F_DTLS1_BUFFER_RECORD, ERR_R_INTERNAL_ERROR); |
223 | return(0); | 236 | return (0); |
224 | } | 237 | } |
225 | 238 | ||
226 | rdata->packet = s->packet; | 239 | rdata->packet = s->packet; |
227 | rdata->packet_length = s->packet_length; | 240 | rdata->packet_length = s->packet_length; |
228 | memcpy(&(rdata->rbuf), &(s->s3->rbuf), sizeof(SSL3_BUFFER)); | 241 | memcpy(&(rdata->rbuf), &(s->s3->rbuf), sizeof(SSL3_BUFFER)); |
@@ -233,54 +246,51 @@ dtls1_buffer_record(SSL *s, record_pqueue *queue, unsigned char *priority) | |||
233 | #ifndef OPENSSL_NO_SCTP | 246 | #ifndef OPENSSL_NO_SCTP |
234 | /* Store bio_dgram_sctp_rcvinfo struct */ | 247 | /* Store bio_dgram_sctp_rcvinfo struct */ |
235 | if (BIO_dgram_is_sctp(SSL_get_rbio(s)) && | 248 | if (BIO_dgram_is_sctp(SSL_get_rbio(s)) && |
236 | (s->state == SSL3_ST_SR_FINISHED_A || s->state == SSL3_ST_CR_FINISHED_A)) { | 249 | (s->state == SSL3_ST_SR_FINISHED_A || s->state == SSL3_ST_CR_FINISHED_A)) { |
237 | BIO_ctrl(SSL_get_rbio(s), BIO_CTRL_DGRAM_SCTP_GET_RCVINFO, sizeof(rdata->recordinfo), &rdata->recordinfo); | 250 | BIO_ctrl(SSL_get_rbio(s), BIO_CTRL_DGRAM_SCTP_GET_RCVINFO, sizeof(rdata->recordinfo), &rdata->recordinfo); |
238 | } | 251 | } |
239 | #endif | 252 | #endif |
240 | 253 | ||
241 | /* insert should not fail, since duplicates are dropped */ | 254 | /* insert should not fail, since duplicates are dropped */ |
242 | if (pqueue_insert(queue->q, item) == NULL) | 255 | if (pqueue_insert(queue->q, item) == NULL) { |
243 | { | ||
244 | OPENSSL_free(rdata); | 256 | OPENSSL_free(rdata); |
245 | pitem_free(item); | 257 | pitem_free(item); |
246 | return(0); | 258 | return (0); |
247 | } | 259 | } |
248 | 260 | ||
249 | s->packet = NULL; | 261 | s->packet = NULL; |
250 | s->packet_length = 0; | 262 | s->packet_length = 0; |
251 | memset(&(s->s3->rbuf), 0, sizeof(SSL3_BUFFER)); | 263 | memset(&(s->s3->rbuf), 0, sizeof(SSL3_BUFFER)); |
252 | memset(&(s->s3->rrec), 0, sizeof(SSL3_RECORD)); | 264 | memset(&(s->s3->rrec), 0, sizeof(SSL3_RECORD)); |
253 | 265 | ||
254 | if (!ssl3_setup_buffers(s)) | 266 | if (!ssl3_setup_buffers(s)) { |
255 | { | ||
256 | SSLerr(SSL_F_DTLS1_BUFFER_RECORD, ERR_R_INTERNAL_ERROR); | 267 | SSLerr(SSL_F_DTLS1_BUFFER_RECORD, ERR_R_INTERNAL_ERROR); |
257 | OPENSSL_free(rdata); | 268 | OPENSSL_free(rdata); |
258 | pitem_free(item); | 269 | pitem_free(item); |
259 | return(0); | 270 | return (0); |
260 | } | ||
261 | |||
262 | return(1); | ||
263 | } | 271 | } |
264 | 272 | ||
273 | return (1); | ||
274 | } | ||
275 | |||
265 | 276 | ||
266 | static int | 277 | static int |
267 | dtls1_retrieve_buffered_record(SSL *s, record_pqueue *queue) | 278 | dtls1_retrieve_buffered_record(SSL *s, record_pqueue *queue) |
268 | { | 279 | { |
269 | pitem *item; | 280 | pitem *item; |
270 | 281 | ||
271 | item = pqueue_pop(queue->q); | 282 | item = pqueue_pop(queue->q); |
272 | if (item) | 283 | if (item) { |
273 | { | 284 | dtls1_copy_record(s, item); |
274 | dtls1_copy_record(s, item); | ||
275 | 285 | ||
276 | OPENSSL_free(item->data); | 286 | OPENSSL_free(item->data); |
277 | pitem_free(item); | 287 | pitem_free(item); |
278 | 288 | ||
279 | return(1); | 289 | return (1); |
280 | } | 290 | } |
281 | 291 | ||
282 | return(0); | 292 | return (0); |
283 | } | 293 | } |
284 | 294 | ||
285 | 295 | ||
286 | /* retrieve a buffered record that belongs to the new epoch, i.e., not processed | 296 | /* retrieve a buffered record that belongs to the new epoch, i.e., not processed |
@@ -296,98 +306,96 @@ dtls1_retrieve_buffered_record(SSL *s, record_pqueue *queue) | |||
296 | 306 | ||
297 | static int | 307 | static int |
298 | dtls1_process_buffered_records(SSL *s) | 308 | dtls1_process_buffered_records(SSL *s) |
299 | { | 309 | { |
300 | pitem *item; | 310 | pitem *item; |
301 | 311 | ||
302 | item = pqueue_peek(s->d1->unprocessed_rcds.q); | 312 | item = pqueue_peek(s->d1->unprocessed_rcds.q); |
303 | if (item) | 313 | if (item) { |
304 | { | 314 | /* Check if epoch is current. */ |
305 | /* Check if epoch is current. */ | 315 | if (s->d1->unprocessed_rcds.epoch != s->d1->r_epoch) |
306 | if (s->d1->unprocessed_rcds.epoch != s->d1->r_epoch) | 316 | return (1); |
307 | return(1); /* Nothing to do. */ | 317 | /* Nothing to do. */ |
308 | 318 | ||
309 | /* Process all the records. */ | 319 | /* Process all the records. */ |
310 | while (pqueue_peek(s->d1->unprocessed_rcds.q)) | 320 | while (pqueue_peek(s->d1->unprocessed_rcds.q)) { |
311 | { | 321 | dtls1_get_unprocessed_record(s); |
312 | dtls1_get_unprocessed_record(s); | 322 | if (! dtls1_process_record(s)) |
313 | if ( ! dtls1_process_record(s)) | 323 | return (0); |
314 | return(0); | 324 | dtls1_buffer_record(s, &(s->d1->processed_rcds), |
315 | dtls1_buffer_record(s, &(s->d1->processed_rcds), | 325 | s->s3->rrec.seq_num); |
316 | s->s3->rrec.seq_num); | 326 | } |
317 | } | 327 | } |
318 | } | ||
319 | 328 | ||
320 | /* sync epoch numbers once all the unprocessed records | 329 | /* sync epoch numbers once all the unprocessed records |
321 | * have been processed */ | 330 | * have been processed */ |
322 | s->d1->processed_rcds.epoch = s->d1->r_epoch; | 331 | s->d1->processed_rcds.epoch = s->d1->r_epoch; |
323 | s->d1->unprocessed_rcds.epoch = s->d1->r_epoch + 1; | 332 | s->d1->unprocessed_rcds.epoch = s->d1->r_epoch + 1; |
324 | 333 | ||
325 | return(1); | 334 | return (1); |
326 | } | 335 | } |
327 | 336 | ||
328 | 337 | ||
329 | #if 0 | 338 | #if 0 |
330 | 339 | ||
331 | static int | 340 | static int |
332 | dtls1_get_buffered_record(SSL *s) | 341 | dtls1_get_buffered_record(SSL *s) |
333 | { | 342 | { |
334 | pitem *item; | 343 | pitem *item; |
335 | PQ_64BIT priority = | 344 | PQ_64BIT priority = |
336 | (((PQ_64BIT)s->d1->handshake_read_seq) << 32) | | 345 | (((PQ_64BIT)s->d1->handshake_read_seq) << 32) | |
337 | ((PQ_64BIT)s->d1->r_msg_hdr.frag_off); | 346 | ((PQ_64BIT)s->d1->r_msg_hdr.frag_off); |
338 | 347 | ||
339 | if ( ! SSL_in_init(s)) /* if we're not (re)negotiating, | 348 | if (!SSL_in_init(s)) /* if we're not (re)negotiating, |
340 | nothing buffered */ | 349 | nothing buffered */ |
341 | return 0; | 350 | return 0; |
342 | 351 | ||
343 | 352 | ||
344 | item = pqueue_peek(s->d1->rcvd_records); | 353 | item = pqueue_peek(s->d1->rcvd_records); |
345 | if (item && item->priority == priority) | 354 | if (item && item->priority == priority) { |
346 | { | ||
347 | /* Check if we've received the record of interest. It must be | 355 | /* Check if we've received the record of interest. It must be |
348 | * a handshake record, since data records as passed up without | 356 | * a handshake record, since data records as passed up without |
349 | * buffering */ | 357 | * buffering */ |
350 | DTLS1_RECORD_DATA *rdata; | 358 | DTLS1_RECORD_DATA *rdata; |
351 | item = pqueue_pop(s->d1->rcvd_records); | 359 | item = pqueue_pop(s->d1->rcvd_records); |
352 | rdata = (DTLS1_RECORD_DATA *)item->data; | 360 | rdata = (DTLS1_RECORD_DATA *)item->data; |
353 | 361 | ||
354 | if (s->s3->rbuf.buf != NULL) | 362 | if (s->s3->rbuf.buf != NULL) |
355 | OPENSSL_free(s->s3->rbuf.buf); | 363 | OPENSSL_free(s->s3->rbuf.buf); |
356 | 364 | ||
357 | s->packet = rdata->packet; | 365 | s->packet = rdata->packet; |
358 | s->packet_length = rdata->packet_length; | 366 | s->packet_length = rdata->packet_length; |
359 | memcpy(&(s->s3->rbuf), &(rdata->rbuf), sizeof(SSL3_BUFFER)); | 367 | memcpy(&(s->s3->rbuf), &(rdata->rbuf), sizeof(SSL3_BUFFER)); |
360 | memcpy(&(s->s3->rrec), &(rdata->rrec), sizeof(SSL3_RECORD)); | 368 | memcpy(&(s->s3->rrec), &(rdata->rrec), sizeof(SSL3_RECORD)); |
361 | 369 | ||
362 | OPENSSL_free(item->data); | 370 | OPENSSL_free(item->data); |
363 | pitem_free(item); | 371 | pitem_free(item); |
364 | 372 | ||
365 | /* s->d1->next_expected_seq_num++; */ | 373 | /* s->d1->next_expected_seq_num++; */ |
366 | return(1); | 374 | return (1); |
367 | } | ||
368 | |||
369 | return 0; | ||
370 | } | 375 | } |
371 | 376 | ||
377 | return 0; | ||
378 | } | ||
379 | |||
372 | #endif | 380 | #endif |
373 | 381 | ||
374 | static int | 382 | static int |
375 | dtls1_process_record(SSL *s) | 383 | dtls1_process_record(SSL *s) |
376 | { | 384 | { |
377 | int i,al; | 385 | int i, al; |
378 | int enc_err; | 386 | int enc_err; |
379 | SSL_SESSION *sess; | 387 | SSL_SESSION *sess; |
380 | SSL3_RECORD *rr; | 388 | SSL3_RECORD *rr; |
381 | unsigned int mac_size, orig_len; | 389 | unsigned int mac_size, orig_len; |
382 | unsigned char md[EVP_MAX_MD_SIZE]; | 390 | unsigned char md[EVP_MAX_MD_SIZE]; |
383 | 391 | ||
384 | rr= &(s->s3->rrec); | 392 | rr = &(s->s3->rrec); |
385 | sess = s->session; | 393 | sess = s->session; |
386 | 394 | ||
387 | /* At this point, s->packet_length == SSL3_RT_HEADER_LNGTH + rr->length, | 395 | /* At this point, s->packet_length == SSL3_RT_HEADER_LNGTH + rr->length, |
388 | * and we have that many bytes in s->packet | 396 | * and we have that many bytes in s->packet |
389 | */ | 397 | */ |
390 | rr->input= &(s->packet[DTLS1_RT_HEADER_LENGTH]); | 398 | rr->input = &(s->packet[DTLS1_RT_HEADER_LENGTH]); |
391 | 399 | ||
392 | /* ok, we can now read from 's->packet' data into 'rr' | 400 | /* ok, we can now read from 's->packet' data into 'rr' |
393 | * rr->input points at rr->length bytes, which | 401 | * rr->input points at rr->length bytes, which |
@@ -400,48 +408,44 @@ dtls1_process_record(SSL *s) | |||
400 | * rr->length bytes of encrypted compressed stuff. */ | 408 | * rr->length bytes of encrypted compressed stuff. */ |
401 | 409 | ||
402 | /* check is not needed I believe */ | 410 | /* check is not needed I believe */ |
403 | if (rr->length > SSL3_RT_MAX_ENCRYPTED_LENGTH) | 411 | if (rr->length > SSL3_RT_MAX_ENCRYPTED_LENGTH) { |
404 | { | 412 | al = SSL_AD_RECORD_OVERFLOW; |
405 | al=SSL_AD_RECORD_OVERFLOW; | 413 | SSLerr(SSL_F_DTLS1_PROCESS_RECORD, SSL_R_ENCRYPTED_LENGTH_TOO_LONG); |
406 | SSLerr(SSL_F_DTLS1_PROCESS_RECORD,SSL_R_ENCRYPTED_LENGTH_TOO_LONG); | ||
407 | goto f_err; | 414 | goto f_err; |
408 | } | 415 | } |
409 | 416 | ||
410 | /* decrypt in place in 'rr->input' */ | 417 | /* decrypt in place in 'rr->input' */ |
411 | rr->data=rr->input; | 418 | rr->data = rr->input; |
412 | 419 | ||
413 | enc_err = s->method->ssl3_enc->enc(s,0); | 420 | enc_err = s->method->ssl3_enc->enc(s, 0); |
414 | /* enc_err is: | 421 | /* enc_err is: |
415 | * 0: (in non-constant time) if the record is publically invalid. | 422 | * 0: (in non-constant time) if the record is publically invalid. |
416 | * 1: if the padding is valid | 423 | * 1: if the padding is valid |
417 | * -1: if the padding is invalid */ | 424 | * -1: if the padding is invalid */ |
418 | if (enc_err == 0) | 425 | if (enc_err == 0) { |
419 | { | ||
420 | /* For DTLS we simply ignore bad packets. */ | 426 | /* For DTLS we simply ignore bad packets. */ |
421 | rr->length = 0; | 427 | rr->length = 0; |
422 | s->packet_length = 0; | 428 | s->packet_length = 0; |
423 | goto err; | 429 | goto err; |
424 | } | 430 | } |
425 | 431 | ||
426 | #ifdef TLS_DEBUG | 432 | #ifdef TLS_DEBUG |
427 | printf("dec %d\n",rr->length); | 433 | printf("dec %d\n", rr->length); |
428 | { unsigned int z; for (z=0; z<rr->length; z++) printf("%02X%c",rr->data[z],((z+1)%16)?' ':'\n'); } | 434 | { unsigned int z; for (z = 0; z<rr->length; z++) printf("%02X%c", rr->data[z],((z+1)%16)?' ':'\n'); } |
429 | printf("\n"); | 435 | printf("\n"); |
430 | #endif | 436 | #endif |
431 | 437 | ||
432 | /* r->length is now the compressed data plus mac */ | 438 | /* r->length is now the compressed data plus mac */ |
433 | if ((sess != NULL) && | 439 | if ((sess != NULL) && (s->enc_read_ctx != NULL) && |
434 | (s->enc_read_ctx != NULL) && | 440 | (EVP_MD_CTX_md(s->read_hash) != NULL)) { |
435 | (EVP_MD_CTX_md(s->read_hash) != NULL)) | ||
436 | { | ||
437 | /* s->read_hash != NULL => mac_size != -1 */ | 441 | /* s->read_hash != NULL => mac_size != -1 */ |
438 | unsigned char *mac = NULL; | 442 | unsigned char *mac = NULL; |
439 | unsigned char mac_tmp[EVP_MAX_MD_SIZE]; | 443 | unsigned char mac_tmp[EVP_MAX_MD_SIZE]; |
440 | mac_size=EVP_MD_CTX_size(s->read_hash); | 444 | mac_size = EVP_MD_CTX_size(s->read_hash); |
441 | OPENSSL_assert(mac_size <= EVP_MAX_MD_SIZE); | 445 | OPENSSL_assert(mac_size <= EVP_MAX_MD_SIZE); |
442 | 446 | ||
443 | /* kludge: *_cbc_remove_padding passes padding length in rr->type */ | 447 | /* kludge: *_cbc_remove_padding passes padding length in rr->type */ |
444 | orig_len = rr->length+((unsigned int)rr->type>>8); | 448 | orig_len = rr->length + ((unsigned int)rr->type >> 8); |
445 | 449 | ||
446 | /* orig_len is the length of the record before any padding was | 450 | /* orig_len is the length of the record before any padding was |
447 | * removed. This is public information, as is the MAC in use, | 451 | * removed. This is public information, as is the MAC in use, |
@@ -449,17 +453,15 @@ printf("\n"); | |||
449 | * amount of time if it's too short to possibly contain a MAC. | 453 | * amount of time if it's too short to possibly contain a MAC. |
450 | */ | 454 | */ |
451 | if (orig_len < mac_size || | 455 | if (orig_len < mac_size || |
452 | /* CBC records must have a padding length byte too. */ | 456 | /* CBC records must have a padding length byte too. */ |
453 | (EVP_CIPHER_CTX_mode(s->enc_read_ctx) == EVP_CIPH_CBC_MODE && | 457 | (EVP_CIPHER_CTX_mode(s->enc_read_ctx) == EVP_CIPH_CBC_MODE && |
454 | orig_len < mac_size+1)) | 458 | orig_len < mac_size + 1)) { |
455 | { | 459 | al = SSL_AD_DECODE_ERROR; |
456 | al=SSL_AD_DECODE_ERROR; | 460 | SSLerr(SSL_F_DTLS1_PROCESS_RECORD, SSL_R_LENGTH_TOO_SHORT); |
457 | SSLerr(SSL_F_DTLS1_PROCESS_RECORD,SSL_R_LENGTH_TOO_SHORT); | ||
458 | goto f_err; | 461 | goto f_err; |
459 | } | 462 | } |
460 | 463 | ||
461 | if (EVP_CIPHER_CTX_mode(s->enc_read_ctx) == EVP_CIPH_CBC_MODE) | 464 | if (EVP_CIPHER_CTX_mode(s->enc_read_ctx) == EVP_CIPH_CBC_MODE) { |
462 | { | ||
463 | /* We update the length so that the TLS header bytes | 465 | /* We update the length so that the TLS header bytes |
464 | * can be constructed correctly but we need to extract | 466 | * can be constructed correctly but we need to extract |
465 | * the MAC in constant time from within the record, | 467 | * the MAC in constant time from within the record, |
@@ -468,56 +470,49 @@ printf("\n"); | |||
468 | mac = mac_tmp; | 470 | mac = mac_tmp; |
469 | ssl3_cbc_copy_mac(mac_tmp, rr, mac_size, orig_len); | 471 | ssl3_cbc_copy_mac(mac_tmp, rr, mac_size, orig_len); |
470 | rr->length -= mac_size; | 472 | rr->length -= mac_size; |
471 | } | 473 | } else { |
472 | else | ||
473 | { | ||
474 | /* In this case there's no padding, so |orig_len| | 474 | /* In this case there's no padding, so |orig_len| |
475 | * equals |rec->length| and we checked that there's | 475 | * equals |rec->length| and we checked that there's |
476 | * enough bytes for |mac_size| above. */ | 476 | * enough bytes for |mac_size| above. */ |
477 | rr->length -= mac_size; | 477 | rr->length -= mac_size; |
478 | mac = &rr->data[rr->length]; | 478 | mac = &rr->data[rr->length]; |
479 | } | 479 | } |
480 | 480 | ||
481 | i=s->method->ssl3_enc->mac(s,md,0 /* not send */); | 481 | i = s->method->ssl3_enc->mac(s, md, 0 /* not send */); |
482 | if (i < 0 || mac == NULL || CRYPTO_memcmp(md, mac, (size_t)mac_size) != 0) | 482 | if (i < 0 || mac == NULL || CRYPTO_memcmp(md, mac, (size_t)mac_size) != 0) |
483 | enc_err = -1; | 483 | enc_err = -1; |
484 | if (rr->length > SSL3_RT_MAX_COMPRESSED_LENGTH+mac_size) | 484 | if (rr->length > SSL3_RT_MAX_COMPRESSED_LENGTH + mac_size) |
485 | enc_err = -1; | 485 | enc_err = -1; |
486 | } | 486 | } |
487 | 487 | ||
488 | if (enc_err < 0) | 488 | if (enc_err < 0) { |
489 | { | ||
490 | /* decryption failed, silently discard message */ | 489 | /* decryption failed, silently discard message */ |
491 | rr->length = 0; | 490 | rr->length = 0; |
492 | s->packet_length = 0; | 491 | s->packet_length = 0; |
493 | goto err; | 492 | goto err; |
494 | } | 493 | } |
495 | 494 | ||
496 | /* r->length is now just compressed */ | 495 | /* r->length is now just compressed */ |
497 | if (s->expand != NULL) | 496 | if (s->expand != NULL) { |
498 | { | 497 | if (rr->length > SSL3_RT_MAX_COMPRESSED_LENGTH) { |
499 | if (rr->length > SSL3_RT_MAX_COMPRESSED_LENGTH) | 498 | al = SSL_AD_RECORD_OVERFLOW; |
500 | { | 499 | SSLerr(SSL_F_DTLS1_PROCESS_RECORD, SSL_R_COMPRESSED_LENGTH_TOO_LONG); |
501 | al=SSL_AD_RECORD_OVERFLOW; | ||
502 | SSLerr(SSL_F_DTLS1_PROCESS_RECORD,SSL_R_COMPRESSED_LENGTH_TOO_LONG); | ||
503 | goto f_err; | 500 | goto f_err; |
504 | } | 501 | } |
505 | if (!ssl3_do_uncompress(s)) | 502 | if (!ssl3_do_uncompress(s)) { |
506 | { | 503 | al = SSL_AD_DECOMPRESSION_FAILURE; |
507 | al=SSL_AD_DECOMPRESSION_FAILURE; | 504 | SSLerr(SSL_F_DTLS1_PROCESS_RECORD, SSL_R_BAD_DECOMPRESSION); |
508 | SSLerr(SSL_F_DTLS1_PROCESS_RECORD,SSL_R_BAD_DECOMPRESSION); | ||
509 | goto f_err; | 505 | goto f_err; |
510 | } | ||
511 | } | 506 | } |
507 | } | ||
512 | 508 | ||
513 | if (rr->length > SSL3_RT_MAX_PLAIN_LENGTH) | 509 | if (rr->length > SSL3_RT_MAX_PLAIN_LENGTH) { |
514 | { | 510 | al = SSL_AD_RECORD_OVERFLOW; |
515 | al=SSL_AD_RECORD_OVERFLOW; | 511 | SSLerr(SSL_F_DTLS1_PROCESS_RECORD, SSL_R_DATA_LENGTH_TOO_LONG); |
516 | SSLerr(SSL_F_DTLS1_PROCESS_RECORD,SSL_R_DATA_LENGTH_TOO_LONG); | ||
517 | goto f_err; | 512 | goto f_err; |
518 | } | 513 | } |
519 | 514 | ||
520 | rr->off=0; | 515 | rr->off = 0; |
521 | /* So at this point the following is true | 516 | /* So at this point the following is true |
522 | * ssl->s3->rrec.type is the type of record | 517 | * ssl->s3->rrec.type is the type of record |
523 | * ssl->s3->rrec.length == number of bytes in record | 518 | * ssl->s3->rrec.length == number of bytes in record |
@@ -527,14 +522,14 @@ printf("\n"); | |||
527 | */ | 522 | */ |
528 | 523 | ||
529 | /* we have pulled in a full packet so zero things */ | 524 | /* we have pulled in a full packet so zero things */ |
530 | s->packet_length=0; | 525 | s->packet_length = 0; |
531 | dtls1_record_bitmap_update(s, &(s->d1->bitmap));/* Mark receipt of record. */ | 526 | dtls1_record_bitmap_update(s, &(s->d1->bitmap));/* Mark receipt of record. */ |
532 | return(1); | 527 | return (1); |
533 | 528 | ||
534 | f_err: | 529 | f_err: |
535 | ssl3_send_alert(s,SSL3_AL_FATAL,al); | 530 | ssl3_send_alert(s, SSL3_AL_FATAL, al); |
536 | err: | 531 | err: |
537 | return(0); | 532 | return (0); |
538 | } | 533 | } |
539 | 534 | ||
540 | 535 | ||
@@ -547,17 +542,18 @@ err: | |||
547 | * ssl->s3->rrec.length, - number of bytes | 542 | * ssl->s3->rrec.length, - number of bytes |
548 | */ | 543 | */ |
549 | /* used only by dtls1_read_bytes */ | 544 | /* used only by dtls1_read_bytes */ |
550 | int dtls1_get_record(SSL *s) | 545 | int |
551 | { | 546 | dtls1_get_record(SSL *s) |
552 | int ssl_major,ssl_minor; | 547 | { |
553 | int i,n; | 548 | int ssl_major, ssl_minor; |
549 | int i, n; | ||
554 | SSL3_RECORD *rr; | 550 | SSL3_RECORD *rr; |
555 | unsigned char *p = NULL; | 551 | unsigned char *p = NULL; |
556 | unsigned short version; | 552 | unsigned short version; |
557 | DTLS1_BITMAP *bitmap; | 553 | DTLS1_BITMAP *bitmap; |
558 | unsigned int is_next_epoch; | 554 | unsigned int is_next_epoch; |
559 | 555 | ||
560 | rr= &(s->s3->rrec); | 556 | rr = &(s->s3->rrec); |
561 | 557 | ||
562 | /* The epoch may have changed. If so, process all the | 558 | /* The epoch may have changed. If so, process all the |
563 | * pending records. This is a non-blocking operation. */ | 559 | * pending records. This is a non-blocking operation. */ |
@@ -570,104 +566,98 @@ int dtls1_get_record(SSL *s) | |||
570 | /* get something from the wire */ | 566 | /* get something from the wire */ |
571 | again: | 567 | again: |
572 | /* check if we have the header */ | 568 | /* check if we have the header */ |
573 | if ( (s->rstate != SSL_ST_READ_BODY) || | 569 | if ((s->rstate != SSL_ST_READ_BODY) || |
574 | (s->packet_length < DTLS1_RT_HEADER_LENGTH)) | 570 | (s->packet_length < DTLS1_RT_HEADER_LENGTH)) { |
575 | { | 571 | n = ssl3_read_n(s, DTLS1_RT_HEADER_LENGTH, s->s3->rbuf.len, 0); |
576 | n=ssl3_read_n(s, DTLS1_RT_HEADER_LENGTH, s->s3->rbuf.len, 0); | ||
577 | /* read timeout is handled by dtls1_read_bytes */ | 572 | /* read timeout is handled by dtls1_read_bytes */ |
578 | if (n <= 0) return(n); /* error or non-blocking */ | 573 | if (n <= 0) |
574 | return(n); /* error or non-blocking */ | ||
579 | 575 | ||
580 | /* this packet contained a partial record, dump it */ | 576 | /* this packet contained a partial record, dump it */ |
581 | if (s->packet_length != DTLS1_RT_HEADER_LENGTH) | 577 | if (s->packet_length != DTLS1_RT_HEADER_LENGTH) { |
582 | { | ||
583 | s->packet_length = 0; | 578 | s->packet_length = 0; |
584 | goto again; | 579 | goto again; |
585 | } | 580 | } |
586 | 581 | ||
587 | s->rstate=SSL_ST_READ_BODY; | 582 | s->rstate = SSL_ST_READ_BODY; |
588 | 583 | ||
589 | p=s->packet; | 584 | p = s->packet; |
590 | 585 | ||
591 | /* Pull apart the header into the DTLS1_RECORD */ | 586 | /* Pull apart the header into the DTLS1_RECORD */ |
592 | rr->type= *(p++); | 587 | rr->type= *(p++); |
593 | ssl_major= *(p++); | 588 | ssl_major= *(p++); |
594 | ssl_minor= *(p++); | 589 | ssl_minor= *(p++); |
595 | version=(ssl_major<<8)|ssl_minor; | 590 | version = (ssl_major << 8)|ssl_minor; |
596 | 591 | ||
597 | /* sequence number is 64 bits, with top 2 bytes = epoch */ | 592 | /* sequence number is 64 bits, with top 2 bytes = epoch */ |
598 | n2s(p,rr->epoch); | 593 | n2s(p, rr->epoch); |
599 | 594 | ||
600 | memcpy(&(s->s3->read_sequence[2]), p, 6); | 595 | memcpy(&(s->s3->read_sequence[2]), p, 6); |
601 | p+=6; | 596 | p += 6; |
602 | 597 | ||
603 | n2s(p,rr->length); | 598 | n2s(p, rr->length); |
604 | 599 | ||
605 | /* Lets check version */ | 600 | /* Lets check version */ |
606 | if (!s->first_packet) | 601 | if (!s->first_packet) { |
607 | { | 602 | if (version != s->version) { |
608 | if (version != s->version) | ||
609 | { | ||
610 | /* unexpected version, silently discard */ | 603 | /* unexpected version, silently discard */ |
611 | rr->length = 0; | 604 | rr->length = 0; |
612 | s->packet_length = 0; | 605 | s->packet_length = 0; |
613 | goto again; | 606 | goto again; |
614 | } | ||
615 | } | 607 | } |
608 | } | ||
616 | 609 | ||
617 | if ((version & 0xff00) != (s->version & 0xff00)) | 610 | if ((version & 0xff00) != (s->version & 0xff00)) { |
618 | { | ||
619 | /* wrong version, silently discard record */ | 611 | /* wrong version, silently discard record */ |
620 | rr->length = 0; | 612 | rr->length = 0; |
621 | s->packet_length = 0; | 613 | s->packet_length = 0; |
622 | goto again; | 614 | goto again; |
623 | } | 615 | } |
624 | 616 | ||
625 | if (rr->length > SSL3_RT_MAX_ENCRYPTED_LENGTH) | 617 | if (rr->length > SSL3_RT_MAX_ENCRYPTED_LENGTH) { |
626 | { | ||
627 | /* record too long, silently discard it */ | 618 | /* record too long, silently discard it */ |
628 | rr->length = 0; | 619 | rr->length = 0; |
629 | s->packet_length = 0; | 620 | s->packet_length = 0; |
630 | goto again; | 621 | goto again; |
631 | } | 622 | } |
632 | 623 | ||
633 | /* now s->rstate == SSL_ST_READ_BODY */ | 624 | /* now s->rstate == SSL_ST_READ_BODY */ |
634 | } | 625 | } |
635 | 626 | ||
636 | /* s->rstate == SSL_ST_READ_BODY, get and decode the data */ | 627 | /* s->rstate == SSL_ST_READ_BODY, get and decode the data */ |
637 | 628 | ||
638 | if (rr->length > s->packet_length-DTLS1_RT_HEADER_LENGTH) | 629 | if (rr->length > s->packet_length - DTLS1_RT_HEADER_LENGTH) { |
639 | { | ||
640 | /* now s->packet_length == DTLS1_RT_HEADER_LENGTH */ | 630 | /* now s->packet_length == DTLS1_RT_HEADER_LENGTH */ |
641 | i=rr->length; | 631 | i = rr->length; |
642 | n=ssl3_read_n(s,i,i,1); | 632 | n = ssl3_read_n(s, i, i, 1); |
643 | if (n <= 0) return(n); /* error or non-blocking io */ | 633 | if (n <= 0) |
634 | return(n); /* error or non-blocking io */ | ||
644 | 635 | ||
645 | /* this packet contained a partial record, dump it */ | 636 | /* this packet contained a partial record, dump it */ |
646 | if ( n != i) | 637 | if (n != i) { |
647 | { | ||
648 | rr->length = 0; | 638 | rr->length = 0; |
649 | s->packet_length = 0; | 639 | s->packet_length = 0; |
650 | goto again; | 640 | goto again; |
651 | } | 641 | } |
652 | 642 | ||
653 | /* now n == rr->length, | 643 | /* now n == rr->length, |
654 | * and s->packet_length == DTLS1_RT_HEADER_LENGTH + rr->length */ | 644 | * and s->packet_length == DTLS1_RT_HEADER_LENGTH + rr->length */ |
655 | } | 645 | } |
656 | s->rstate=SSL_ST_READ_HEADER; /* set state for later operations */ | 646 | s->rstate = SSL_ST_READ_HEADER; /* set state for later operations */ |
657 | 647 | ||
658 | /* match epochs. NULL means the packet is dropped on the floor */ | 648 | /* match epochs. NULL means the packet is dropped on the floor */ |
659 | bitmap = dtls1_get_bitmap(s, rr, &is_next_epoch); | 649 | bitmap = dtls1_get_bitmap(s, rr, &is_next_epoch); |
660 | if ( bitmap == NULL) | 650 | if (bitmap == NULL) { |
661 | { | ||
662 | rr->length = 0; | 651 | rr->length = 0; |
663 | s->packet_length = 0; /* dump this record */ | 652 | s->packet_length = 0; |
664 | goto again; /* get another record */ | 653 | /* dump this record */ |
665 | } | 654 | goto again; |
655 | /* get another record */ | ||
656 | } | ||
666 | 657 | ||
667 | #ifndef OPENSSL_NO_SCTP | 658 | #ifndef OPENSSL_NO_SCTP |
668 | /* Only do replay check if no SCTP bio */ | 659 | /* Only do replay check if no SCTP bio */ |
669 | if (!BIO_dgram_is_sctp(SSL_get_rbio(s))) | 660 | if (!BIO_dgram_is_sctp(SSL_get_rbio(s))) { |
670 | { | ||
671 | #endif | 661 | #endif |
672 | /* Check whether this is a repeat, or aged record. | 662 | /* Check whether this is a repeat, or aged record. |
673 | * Don't check if we're listening and this message is | 663 | * Don't check if we're listening and this message is |
@@ -677,45 +667,45 @@ again: | |||
677 | */ | 667 | */ |
678 | if (!(s->d1->listen && rr->type == SSL3_RT_HANDSHAKE && | 668 | if (!(s->d1->listen && rr->type == SSL3_RT_HANDSHAKE && |
679 | *p == SSL3_MT_CLIENT_HELLO) && | 669 | *p == SSL3_MT_CLIENT_HELLO) && |
680 | !dtls1_record_replay_check(s, bitmap)) | 670 | !dtls1_record_replay_check(s, bitmap)) { |
681 | { | ||
682 | rr->length = 0; | 671 | rr->length = 0; |
683 | s->packet_length=0; /* dump this record */ | 672 | s->packet_length=0; /* dump this record */ |
684 | goto again; /* get another record */ | 673 | goto again; |
685 | } | 674 | /* get another record */ |
675 | } | ||
686 | #ifndef OPENSSL_NO_SCTP | 676 | #ifndef OPENSSL_NO_SCTP |
687 | } | 677 | } |
688 | #endif | 678 | #endif |
689 | 679 | ||
690 | /* just read a 0 length packet */ | 680 | /* just read a 0 length packet */ |
691 | if (rr->length == 0) goto again; | 681 | if (rr->length == 0) |
682 | goto again; | ||
692 | 683 | ||
693 | /* If this record is from the next epoch (either HM or ALERT), | 684 | /* If this record is from the next epoch (either HM or ALERT), |
694 | * and a handshake is currently in progress, buffer it since it | 685 | * and a handshake is currently in progress, buffer it since it |
695 | * cannot be processed at this time. However, do not buffer | 686 | * cannot be processed at this time. However, do not buffer |
696 | * anything while listening. | 687 | * anything while listening. |
697 | */ | 688 | */ |
698 | if (is_next_epoch) | 689 | if (is_next_epoch) { |
699 | { | 690 | if ((SSL_in_init(s) || s->in_handshake) && !s->d1->listen) { |
700 | if ((SSL_in_init(s) || s->in_handshake) && !s->d1->listen) | ||
701 | { | ||
702 | dtls1_buffer_record(s, &(s->d1->unprocessed_rcds), rr->seq_num); | 691 | dtls1_buffer_record(s, &(s->d1->unprocessed_rcds), rr->seq_num); |
703 | } | 692 | } |
704 | rr->length = 0; | 693 | rr->length = 0; |
705 | s->packet_length = 0; | 694 | s->packet_length = 0; |
706 | goto again; | 695 | goto again; |
707 | } | 696 | } |
708 | 697 | ||
709 | if (!dtls1_process_record(s)) | 698 | if (!dtls1_process_record(s)) { |
710 | { | ||
711 | rr->length = 0; | 699 | rr->length = 0; |
712 | s->packet_length = 0; /* dump this record */ | 700 | s->packet_length = 0; |
713 | goto again; /* get another record */ | 701 | /* dump this record */ |
714 | } | 702 | goto again; |
703 | /* get another record */ | ||
704 | } | ||
715 | 705 | ||
716 | return(1); | 706 | return (1); |
717 | 707 | ||
718 | } | 708 | } |
719 | 709 | ||
720 | /* Return up to 'len' payload bytes received in 'type' records. | 710 | /* Return up to 'len' payload bytes received in 'type' records. |
721 | * 'type' is one of the following: | 711 | * 'type' is one of the following: |
@@ -744,28 +734,28 @@ again: | |||
744 | * Application data protocol | 734 | * Application data protocol |
745 | * none of our business | 735 | * none of our business |
746 | */ | 736 | */ |
747 | int dtls1_read_bytes(SSL *s, int type, unsigned char *buf, int len, int peek) | 737 | int |
748 | { | 738 | dtls1_read_bytes(SSL *s, int type, unsigned char *buf, int len, int peek) |
749 | int al,i,j,ret; | 739 | { |
740 | int al, i, j, ret; | ||
750 | unsigned int n; | 741 | unsigned int n; |
751 | SSL3_RECORD *rr; | 742 | SSL3_RECORD *rr; |
752 | void (*cb)(const SSL *ssl,int type2,int val)=NULL; | 743 | void (*cb)(const SSL *ssl, int type2, int val) = NULL; |
753 | 744 | ||
754 | if (s->s3->rbuf.buf == NULL) /* Not initialized yet */ | 745 | if (s->s3->rbuf.buf == NULL) /* Not initialized yet */ |
755 | if (!ssl3_setup_buffers(s)) | 746 | if (!ssl3_setup_buffers(s)) |
756 | return(-1); | 747 | return (-1); |
757 | 748 | ||
758 | /* XXX: check what the second '&& type' is about */ | 749 | /* XXX: check what the second '&& type' is about */ |
759 | if ((type && (type != SSL3_RT_APPLICATION_DATA) && | 750 | if ((type && (type != SSL3_RT_APPLICATION_DATA) && |
760 | (type != SSL3_RT_HANDSHAKE) && type) || | 751 | (type != SSL3_RT_HANDSHAKE) && type) || |
761 | (peek && (type != SSL3_RT_APPLICATION_DATA))) | 752 | (peek && (type != SSL3_RT_APPLICATION_DATA))) { |
762 | { | ||
763 | SSLerr(SSL_F_DTLS1_READ_BYTES, ERR_R_INTERNAL_ERROR); | 753 | SSLerr(SSL_F_DTLS1_READ_BYTES, ERR_R_INTERNAL_ERROR); |
764 | return -1; | 754 | return -1; |
765 | } | 755 | } |
766 | 756 | ||
767 | /* check whether there's a handshake message (client hello?) waiting */ | 757 | /* check whether there's a handshake message (client hello?) waiting */ |
768 | if ( (ret = have_handshake_fragment(s, type, buf, len, peek))) | 758 | if ((ret = have_handshake_fragment(s, type, buf, len, peek))) |
769 | return ret; | 759 | return ret; |
770 | 760 | ||
771 | /* Now s->d1->handshake_fragment_len == 0 if type == SSL3_RT_HANDSHAKE. */ | 761 | /* Now s->d1->handshake_fragment_len == 0 if type == SSL3_RT_HANDSHAKE. */ |
@@ -776,24 +766,25 @@ int dtls1_read_bytes(SSL *s, int type, unsigned char *buf, int len, int peek) | |||
776 | */ | 766 | */ |
777 | if ((!s->in_handshake && SSL_in_init(s)) || | 767 | if ((!s->in_handshake && SSL_in_init(s)) || |
778 | (BIO_dgram_is_sctp(SSL_get_rbio(s)) && | 768 | (BIO_dgram_is_sctp(SSL_get_rbio(s)) && |
779 | (s->state == DTLS1_SCTP_ST_SR_READ_SOCK || s->state == DTLS1_SCTP_ST_CR_READ_SOCK) && | 769 | (s->state == DTLS1_SCTP_ST_SR_READ_SOCK || |
780 | s->s3->in_read_app_data != 2)) | 770 | s->state == DTLS1_SCTP_ST_CR_READ_SOCK) && |
771 | s->s3->in_read_app_data != 2)) | ||
781 | #else | 772 | #else |
782 | if (!s->in_handshake && SSL_in_init(s)) | 773 | if (!s->in_handshake && SSL_in_init(s)) |
783 | #endif | 774 | #endif |
784 | { | 775 | { |
785 | /* type == SSL3_RT_APPLICATION_DATA */ | 776 | /* type == SSL3_RT_APPLICATION_DATA */ |
786 | i=s->handshake_func(s); | 777 | i = s->handshake_func(s); |
787 | if (i < 0) return(i); | 778 | if (i < 0) |
788 | if (i == 0) | 779 | return (i); |
789 | { | 780 | if (i == 0) { |
790 | SSLerr(SSL_F_DTLS1_READ_BYTES,SSL_R_SSL_HANDSHAKE_FAILURE); | 781 | SSLerr(SSL_F_DTLS1_READ_BYTES, SSL_R_SSL_HANDSHAKE_FAILURE); |
791 | return(-1); | 782 | return (-1); |
792 | } | ||
793 | } | 783 | } |
784 | } | ||
794 | 785 | ||
795 | start: | 786 | start: |
796 | s->rwstate=SSL_NOTHING; | 787 | s->rwstate = SSL_NOTHING; |
797 | 788 | ||
798 | /* s->s3->rrec.type - is the type of record | 789 | /* s->s3->rrec.type - is the type of record |
799 | * s->s3->rrec.data, - data | 790 | * s->s3->rrec.data, - data |
@@ -805,59 +796,52 @@ start: | |||
805 | * so process data buffered during the last handshake | 796 | * so process data buffered during the last handshake |
806 | * in advance, if any. | 797 | * in advance, if any. |
807 | */ | 798 | */ |
808 | if (s->state == SSL_ST_OK && rr->length == 0) | 799 | if (s->state == SSL_ST_OK && rr->length == 0) { |
809 | { | ||
810 | pitem *item; | 800 | pitem *item; |
811 | item = pqueue_pop(s->d1->buffered_app_data.q); | 801 | item = pqueue_pop(s->d1->buffered_app_data.q); |
812 | if (item) | 802 | if (item) { |
813 | { | ||
814 | #ifndef OPENSSL_NO_SCTP | 803 | #ifndef OPENSSL_NO_SCTP |
815 | /* Restore bio_dgram_sctp_rcvinfo struct */ | 804 | /* Restore bio_dgram_sctp_rcvinfo struct */ |
816 | if (BIO_dgram_is_sctp(SSL_get_rbio(s))) | 805 | if (BIO_dgram_is_sctp(SSL_get_rbio(s))) { |
817 | { | ||
818 | DTLS1_RECORD_DATA *rdata = (DTLS1_RECORD_DATA *) item->data; | 806 | DTLS1_RECORD_DATA *rdata = (DTLS1_RECORD_DATA *) item->data; |
819 | BIO_ctrl(SSL_get_rbio(s), BIO_CTRL_DGRAM_SCTP_SET_RCVINFO, sizeof(rdata->recordinfo), &rdata->recordinfo); | 807 | BIO_ctrl(SSL_get_rbio(s), BIO_CTRL_DGRAM_SCTP_SET_RCVINFO, sizeof(rdata->recordinfo), &rdata->recordinfo); |
820 | } | 808 | } |
821 | #endif | 809 | #endif |
822 | 810 | ||
823 | dtls1_copy_record(s, item); | 811 | dtls1_copy_record(s, item); |
824 | 812 | ||
825 | OPENSSL_free(item->data); | 813 | OPENSSL_free(item->data); |
826 | pitem_free(item); | 814 | pitem_free(item); |
827 | } | ||
828 | } | 815 | } |
816 | } | ||
829 | 817 | ||
830 | /* Check for timeout */ | 818 | /* Check for timeout */ |
831 | if (dtls1_handle_timeout(s) > 0) | 819 | if (dtls1_handle_timeout(s) > 0) |
832 | goto start; | 820 | goto start; |
833 | 821 | ||
834 | /* get new packet if necessary */ | 822 | /* get new packet if necessary */ |
835 | if ((rr->length == 0) || (s->rstate == SSL_ST_READ_BODY)) | 823 | if ((rr->length == 0) || (s->rstate == SSL_ST_READ_BODY)) { |
836 | { | 824 | ret = dtls1_get_record(s); |
837 | ret=dtls1_get_record(s); | 825 | if (ret <= 0) { |
838 | if (ret <= 0) | ||
839 | { | ||
840 | ret = dtls1_read_failed(s, ret); | 826 | ret = dtls1_read_failed(s, ret); |
841 | /* anything other than a timeout is an error */ | 827 | /* anything other than a timeout is an error */ |
842 | if (ret <= 0) | 828 | if (ret <= 0) |
843 | return(ret); | 829 | return (ret); |
844 | else | 830 | else |
845 | goto start; | 831 | goto start; |
846 | } | ||
847 | } | 832 | } |
833 | } | ||
848 | 834 | ||
849 | if (s->d1->listen && rr->type != SSL3_RT_HANDSHAKE) | 835 | if (s->d1->listen && rr->type != SSL3_RT_HANDSHAKE) { |
850 | { | ||
851 | rr->length = 0; | 836 | rr->length = 0; |
852 | goto start; | 837 | goto start; |
853 | } | 838 | } |
854 | 839 | ||
855 | /* we now have a packet which can be read and processed */ | 840 | /* we now have a packet which can be read and processed */ |
856 | 841 | ||
857 | if (s->s3->change_cipher_spec /* set when we receive ChangeCipherSpec, | 842 | if (s->s3->change_cipher_spec /* set when we receive ChangeCipherSpec, |
858 | * reset by ssl3_get_finished */ | 843 | * reset by ssl3_get_finished */ |
859 | && (rr->type != SSL3_RT_HANDSHAKE)) | 844 | && (rr->type != SSL3_RT_HANDSHAKE)) { |
860 | { | ||
861 | /* We now have application data between CCS and Finished. | 845 | /* We now have application data between CCS and Finished. |
862 | * Most likely the packets were reordered on their way, so | 846 | * Most likely the packets were reordered on their way, so |
863 | * buffer the application data for later processing rather | 847 | * buffer the application data for later processing rather |
@@ -866,75 +850,71 @@ start: | |||
866 | dtls1_buffer_record(s, &(s->d1->buffered_app_data), rr->seq_num); | 850 | dtls1_buffer_record(s, &(s->d1->buffered_app_data), rr->seq_num); |
867 | rr->length = 0; | 851 | rr->length = 0; |
868 | goto start; | 852 | goto start; |
869 | } | 853 | } |
870 | 854 | ||
871 | /* If the other end has shut down, throw anything we read away | 855 | /* If the other end has shut down, throw anything we read away |
872 | * (even in 'peek' mode) */ | 856 | * (even in 'peek' mode) */ |
873 | if (s->shutdown & SSL_RECEIVED_SHUTDOWN) | 857 | if (s->shutdown & SSL_RECEIVED_SHUTDOWN) { |
874 | { | 858 | rr->length = 0; |
875 | rr->length=0; | 859 | s->rwstate = SSL_NOTHING; |
876 | s->rwstate=SSL_NOTHING; | 860 | return (0); |
877 | return(0); | 861 | } |
878 | } | ||
879 | 862 | ||
880 | 863 | ||
881 | if (type == rr->type) /* SSL3_RT_APPLICATION_DATA or SSL3_RT_HANDSHAKE */ | 864 | if (type == rr->type) /* SSL3_RT_APPLICATION_DATA or SSL3_RT_HANDSHAKE */ |
882 | { | 865 | { |
883 | /* make sure that we are not getting application data when we | 866 | /* make sure that we are not getting application data when we |
884 | * are doing a handshake for the first time */ | 867 | * are doing a handshake for the first time */ |
885 | if (SSL_in_init(s) && (type == SSL3_RT_APPLICATION_DATA) && | 868 | if (SSL_in_init(s) && (type == SSL3_RT_APPLICATION_DATA) && |
886 | (s->enc_read_ctx == NULL)) | 869 | (s->enc_read_ctx == NULL)) { |
887 | { | 870 | al = SSL_AD_UNEXPECTED_MESSAGE; |
888 | al=SSL_AD_UNEXPECTED_MESSAGE; | 871 | SSLerr(SSL_F_DTLS1_READ_BYTES, SSL_R_APP_DATA_IN_HANDSHAKE); |
889 | SSLerr(SSL_F_DTLS1_READ_BYTES,SSL_R_APP_DATA_IN_HANDSHAKE); | ||
890 | goto f_err; | 872 | goto f_err; |
891 | } | 873 | } |
892 | 874 | ||
893 | if (len <= 0) return(len); | 875 | if (len <= 0) |
876 | return (len); | ||
894 | 877 | ||
895 | if ((unsigned int)len > rr->length) | 878 | if ((unsigned int)len > rr->length) |
896 | n = rr->length; | 879 | n = rr->length; |
897 | else | 880 | else |
898 | n = (unsigned int)len; | 881 | n = (unsigned int)len; |
899 | 882 | ||
900 | memcpy(buf,&(rr->data[rr->off]),n); | 883 | memcpy(buf, &(rr->data[rr->off]), n); |
901 | if (!peek) | 884 | if (!peek) { |
902 | { | 885 | rr->length -= n; |
903 | rr->length-=n; | 886 | rr->off += n; |
904 | rr->off+=n; | 887 | if (rr->length == 0) { |
905 | if (rr->length == 0) | 888 | s->rstate = SSL_ST_READ_HEADER; |
906 | { | 889 | rr->off = 0; |
907 | s->rstate=SSL_ST_READ_HEADER; | ||
908 | rr->off=0; | ||
909 | } | ||
910 | } | 890 | } |
891 | } | ||
911 | 892 | ||
912 | #ifndef OPENSSL_NO_SCTP | 893 | #ifndef OPENSSL_NO_SCTP |
913 | /* We were about to renegotiate but had to read | 894 | /* We were about to renegotiate but had to read |
914 | * belated application data first, so retry. | 895 | * belated application data first, so retry. |
915 | */ | 896 | */ |
916 | if (BIO_dgram_is_sctp(SSL_get_rbio(s)) && | 897 | if (BIO_dgram_is_sctp(SSL_get_rbio(s)) && |
917 | rr->type == SSL3_RT_APPLICATION_DATA && | 898 | rr->type == SSL3_RT_APPLICATION_DATA && |
918 | (s->state == DTLS1_SCTP_ST_SR_READ_SOCK || s->state == DTLS1_SCTP_ST_CR_READ_SOCK)) | 899 | (s->state == DTLS1_SCTP_ST_SR_READ_SOCK || |
919 | { | 900 | s->state == DTLS1_SCTP_ST_CR_READ_SOCK)) { |
920 | s->rwstate=SSL_READING; | 901 | s->rwstate = SSL_READING; |
921 | BIO_clear_retry_flags(SSL_get_rbio(s)); | 902 | BIO_clear_retry_flags(SSL_get_rbio(s)); |
922 | BIO_set_retry_read(SSL_get_rbio(s)); | 903 | BIO_set_retry_read(SSL_get_rbio(s)); |
923 | } | 904 | } |
924 | 905 | ||
925 | /* We might had to delay a close_notify alert because | 906 | /* We might had to delay a close_notify alert because |
926 | * of reordered app data. If there was an alert and there | 907 | * of reordered app data. If there was an alert and there |
927 | * is no message to read anymore, finally set shutdown. | 908 | * is no message to read anymore, finally set shutdown. |
928 | */ | 909 | */ |
929 | if (BIO_dgram_is_sctp(SSL_get_rbio(s)) && | 910 | if (BIO_dgram_is_sctp(SSL_get_rbio(s)) && |
930 | s->d1->shutdown_received && !BIO_dgram_sctp_msg_waiting(SSL_get_rbio(s))) | 911 | s->d1->shutdown_received && !BIO_dgram_sctp_msg_waiting(SSL_get_rbio(s))) { |
931 | { | 912 | s->shutdown |= SSL_RECEIVED_SHUTDOWN; |
932 | s->shutdown |= SSL_RECEIVED_SHUTDOWN; | 913 | return (0); |
933 | return(0); | ||
934 | } | ||
935 | #endif | ||
936 | return(n); | ||
937 | } | 914 | } |
915 | #endif | ||
916 | return (n); | ||
917 | } | ||
938 | 918 | ||
939 | 919 | ||
940 | /* If we get here, then type != rr->type; if we have a handshake | 920 | /* If we get here, then type != rr->type; if we have a handshake |
@@ -943,65 +923,57 @@ start: | |||
943 | /* In case of record types for which we have 'fragment' storage, | 923 | /* In case of record types for which we have 'fragment' storage, |
944 | * fill that so that we can process the data at a fixed place. | 924 | * fill that so that we can process the data at a fixed place. |
945 | */ | 925 | */ |
946 | { | 926 | { |
947 | unsigned int k, dest_maxlen = 0; | 927 | unsigned int k, dest_maxlen = 0; |
948 | unsigned char *dest = NULL; | 928 | unsigned char *dest = NULL; |
949 | unsigned int *dest_len = NULL; | 929 | unsigned int *dest_len = NULL; |
950 | 930 | ||
951 | if (rr->type == SSL3_RT_HANDSHAKE) | 931 | if (rr->type == SSL3_RT_HANDSHAKE) { |
952 | { | ||
953 | dest_maxlen = sizeof s->d1->handshake_fragment; | 932 | dest_maxlen = sizeof s->d1->handshake_fragment; |
954 | dest = s->d1->handshake_fragment; | 933 | dest = s->d1->handshake_fragment; |
955 | dest_len = &s->d1->handshake_fragment_len; | 934 | dest_len = &s->d1->handshake_fragment_len; |
956 | } | 935 | } else if (rr->type == SSL3_RT_ALERT) { |
957 | else if (rr->type == SSL3_RT_ALERT) | ||
958 | { | ||
959 | dest_maxlen = sizeof(s->d1->alert_fragment); | 936 | dest_maxlen = sizeof(s->d1->alert_fragment); |
960 | dest = s->d1->alert_fragment; | 937 | dest = s->d1->alert_fragment; |
961 | dest_len = &s->d1->alert_fragment_len; | 938 | dest_len = &s->d1->alert_fragment_len; |
962 | } | 939 | } |
963 | #ifndef OPENSSL_NO_HEARTBEATS | 940 | #ifndef OPENSSL_NO_HEARTBEATS |
964 | else if (rr->type == TLS1_RT_HEARTBEAT) | 941 | else if (rr->type == TLS1_RT_HEARTBEAT) { |
965 | { | ||
966 | dtls1_process_heartbeat(s); | 942 | dtls1_process_heartbeat(s); |
967 | 943 | ||
968 | /* Exit and notify application to read again */ | 944 | /* Exit and notify application to read again */ |
969 | rr->length = 0; | 945 | rr->length = 0; |
970 | s->rwstate=SSL_READING; | 946 | s->rwstate = SSL_READING; |
971 | BIO_clear_retry_flags(SSL_get_rbio(s)); | 947 | BIO_clear_retry_flags(SSL_get_rbio(s)); |
972 | BIO_set_retry_read(SSL_get_rbio(s)); | 948 | BIO_set_retry_read(SSL_get_rbio(s)); |
973 | return(-1); | 949 | return (-1); |
974 | } | 950 | } |
975 | #endif | 951 | #endif |
976 | /* else it's a CCS message, or application data or wrong */ | 952 | /* else it's a CCS message, or application data or wrong */ |
977 | else if (rr->type != SSL3_RT_CHANGE_CIPHER_SPEC) | 953 | else if (rr->type != SSL3_RT_CHANGE_CIPHER_SPEC) { |
978 | { | ||
979 | /* Application data while renegotiating | 954 | /* Application data while renegotiating |
980 | * is allowed. Try again reading. | 955 | * is allowed. Try again reading. |
981 | */ | 956 | */ |
982 | if (rr->type == SSL3_RT_APPLICATION_DATA) | 957 | if (rr->type == SSL3_RT_APPLICATION_DATA) { |
983 | { | ||
984 | BIO *bio; | 958 | BIO *bio; |
985 | s->s3->in_read_app_data=2; | 959 | s->s3->in_read_app_data = 2; |
986 | bio=SSL_get_rbio(s); | 960 | bio = SSL_get_rbio(s); |
987 | s->rwstate=SSL_READING; | 961 | s->rwstate = SSL_READING; |
988 | BIO_clear_retry_flags(bio); | 962 | BIO_clear_retry_flags(bio); |
989 | BIO_set_retry_read(bio); | 963 | BIO_set_retry_read(bio); |
990 | return(-1); | 964 | return (-1); |
991 | } | 965 | } |
992 | 966 | ||
993 | /* Not certain if this is the right error handling */ | 967 | /* Not certain if this is the right error handling */ |
994 | al=SSL_AD_UNEXPECTED_MESSAGE; | 968 | al = SSL_AD_UNEXPECTED_MESSAGE; |
995 | SSLerr(SSL_F_DTLS1_READ_BYTES,SSL_R_UNEXPECTED_RECORD); | 969 | SSLerr(SSL_F_DTLS1_READ_BYTES, SSL_R_UNEXPECTED_RECORD); |
996 | goto f_err; | 970 | goto f_err; |
997 | } | 971 | } |
998 | 972 | ||
999 | if (dest_maxlen > 0) | 973 | if (dest_maxlen > 0) { |
1000 | { | ||
1001 | /* XDTLS: In a pathalogical case, the Client Hello | 974 | /* XDTLS: In a pathalogical case, the Client Hello |
1002 | * may be fragmented--don't always expect dest_maxlen bytes */ | 975 | * may be fragmented--don't always expect dest_maxlen bytes */ |
1003 | if ( rr->length < dest_maxlen) | 976 | if (rr->length < dest_maxlen) { |
1004 | { | ||
1005 | #ifdef DTLS1_AD_MISSING_HANDSHAKE_MESSAGE | 977 | #ifdef DTLS1_AD_MISSING_HANDSHAKE_MESSAGE |
1006 | /* | 978 | /* |
1007 | * for normal alerts rr->length is 2, while | 979 | * for normal alerts rr->length is 2, while |
@@ -1010,20 +982,19 @@ start: | |||
1010 | */ | 982 | */ |
1011 | FIX ME | 983 | FIX ME |
1012 | #endif | 984 | #endif |
1013 | s->rstate=SSL_ST_READ_HEADER; | 985 | s->rstate = SSL_ST_READ_HEADER; |
1014 | rr->length = 0; | 986 | rr->length = 0; |
1015 | goto start; | 987 | goto start; |
1016 | } | 988 | } |
1017 | 989 | ||
1018 | /* now move 'n' bytes: */ | 990 | /* now move 'n' bytes: */ |
1019 | for ( k = 0; k < dest_maxlen; k++) | 991 | for ( k = 0; k < dest_maxlen; k++) { |
1020 | { | ||
1021 | dest[k] = rr->data[rr->off++]; | 992 | dest[k] = rr->data[rr->off++]; |
1022 | rr->length--; | 993 | rr->length--; |
1023 | } | ||
1024 | *dest_len = dest_maxlen; | ||
1025 | } | 994 | } |
995 | *dest_len = dest_maxlen; | ||
1026 | } | 996 | } |
997 | } | ||
1027 | 998 | ||
1028 | /* s->d1->handshake_fragment_len == 12 iff rr->type == SSL3_RT_HANDSHAKE; | 999 | /* s->d1->handshake_fragment_len == 12 iff rr->type == SSL3_RT_HANDSHAKE; |
1029 | * s->d1->alert_fragment_len == 7 iff rr->type == SSL3_RT_ALERT. | 1000 | * s->d1->alert_fragment_len == 7 iff rr->type == SSL3_RT_ALERT. |
@@ -1031,117 +1002,107 @@ start: | |||
1031 | 1002 | ||
1032 | /* If we are a client, check for an incoming 'Hello Request': */ | 1003 | /* If we are a client, check for an incoming 'Hello Request': */ |
1033 | if ((!s->server) && | 1004 | if ((!s->server) && |
1034 | (s->d1->handshake_fragment_len >= DTLS1_HM_HEADER_LENGTH) && | 1005 | (s->d1->handshake_fragment_len >= DTLS1_HM_HEADER_LENGTH) && |
1035 | (s->d1->handshake_fragment[0] == SSL3_MT_HELLO_REQUEST) && | 1006 | (s->d1->handshake_fragment[0] == SSL3_MT_HELLO_REQUEST) && |
1036 | (s->session != NULL) && (s->session->cipher != NULL)) | 1007 | (s->session != NULL) && (s->session->cipher != NULL)) { |
1037 | { | ||
1038 | s->d1->handshake_fragment_len = 0; | 1008 | s->d1->handshake_fragment_len = 0; |
1039 | 1009 | ||
1040 | if ((s->d1->handshake_fragment[1] != 0) || | 1010 | if ((s->d1->handshake_fragment[1] != 0) || |
1041 | (s->d1->handshake_fragment[2] != 0) || | 1011 | (s->d1->handshake_fragment[2] != 0) || |
1042 | (s->d1->handshake_fragment[3] != 0)) | 1012 | (s->d1->handshake_fragment[3] != 0)) { |
1043 | { | 1013 | al = SSL_AD_DECODE_ERROR; |
1044 | al=SSL_AD_DECODE_ERROR; | 1014 | SSLerr(SSL_F_DTLS1_READ_BYTES, SSL_R_BAD_HELLO_REQUEST); |
1045 | SSLerr(SSL_F_DTLS1_READ_BYTES,SSL_R_BAD_HELLO_REQUEST); | ||
1046 | goto err; | 1015 | goto err; |
1047 | } | 1016 | } |
1048 | 1017 | ||
1049 | /* no need to check sequence number on HELLO REQUEST messages */ | 1018 | /* no need to check sequence number on HELLO REQUEST messages */ |
1050 | 1019 | ||
1051 | if (s->msg_callback) | 1020 | if (s->msg_callback) |
1052 | s->msg_callback(0, s->version, SSL3_RT_HANDSHAKE, | 1021 | s->msg_callback(0, s->version, SSL3_RT_HANDSHAKE, |
1053 | s->d1->handshake_fragment, 4, s, s->msg_callback_arg); | 1022 | s->d1->handshake_fragment, 4, s, s->msg_callback_arg); |
1054 | 1023 | ||
1055 | if (SSL_is_init_finished(s) && | 1024 | if (SSL_is_init_finished(s) && |
1056 | !(s->s3->flags & SSL3_FLAGS_NO_RENEGOTIATE_CIPHERS) && | 1025 | !(s->s3->flags & SSL3_FLAGS_NO_RENEGOTIATE_CIPHERS) && |
1057 | !s->s3->renegotiate) | 1026 | !s->s3->renegotiate) { |
1058 | { | ||
1059 | s->d1->handshake_read_seq++; | 1027 | s->d1->handshake_read_seq++; |
1060 | s->new_session = 1; | 1028 | s->new_session = 1; |
1061 | ssl3_renegotiate(s); | 1029 | ssl3_renegotiate(s); |
1062 | if (ssl3_renegotiate_check(s)) | 1030 | if (ssl3_renegotiate_check(s)) { |
1063 | { | 1031 | i = s->handshake_func(s); |
1064 | i=s->handshake_func(s); | 1032 | if (i < 0) |
1065 | if (i < 0) return(i); | 1033 | return (i); |
1066 | if (i == 0) | 1034 | if (i == 0) { |
1067 | { | 1035 | SSLerr(SSL_F_DTLS1_READ_BYTES, SSL_R_SSL_HANDSHAKE_FAILURE); |
1068 | SSLerr(SSL_F_DTLS1_READ_BYTES,SSL_R_SSL_HANDSHAKE_FAILURE); | 1036 | return (-1); |
1069 | return(-1); | 1037 | } |
1070 | } | ||
1071 | 1038 | ||
1072 | if (!(s->mode & SSL_MODE_AUTO_RETRY)) | 1039 | if (!(s->mode & SSL_MODE_AUTO_RETRY)) { |
1073 | { | ||
1074 | if (s->s3->rbuf.left == 0) /* no read-ahead left? */ | 1040 | if (s->s3->rbuf.left == 0) /* no read-ahead left? */ |
1075 | { | 1041 | { |
1076 | BIO *bio; | 1042 | BIO *bio; |
1077 | /* In the case where we try to read application data, | 1043 | /* In the case where we try to read application data, |
1078 | * but we trigger an SSL handshake, we return -1 with | 1044 | * but we trigger an SSL handshake, we return -1 with |
1079 | * the retry option set. Otherwise renegotiation may | 1045 | * the retry option set. Otherwise renegotiation may |
1080 | * cause nasty problems in the blocking world */ | 1046 | * cause nasty problems in the blocking world */ |
1081 | s->rwstate=SSL_READING; | 1047 | s->rwstate = SSL_READING; |
1082 | bio=SSL_get_rbio(s); | 1048 | bio = SSL_get_rbio(s); |
1083 | BIO_clear_retry_flags(bio); | 1049 | BIO_clear_retry_flags(bio); |
1084 | BIO_set_retry_read(bio); | 1050 | BIO_set_retry_read(bio); |
1085 | return(-1); | 1051 | return (-1); |
1086 | } | ||
1087 | } | 1052 | } |
1088 | } | 1053 | } |
1089 | } | 1054 | } |
1055 | } | ||
1090 | /* we either finished a handshake or ignored the request, | 1056 | /* we either finished a handshake or ignored the request, |
1091 | * now try again to obtain the (application) data we were asked for */ | 1057 | * now try again to obtain the (application) data we were asked for */ |
1092 | goto start; | 1058 | goto start; |
1093 | } | 1059 | } |
1094 | 1060 | ||
1095 | if (s->d1->alert_fragment_len >= DTLS1_AL_HEADER_LENGTH) | 1061 | if (s->d1->alert_fragment_len >= DTLS1_AL_HEADER_LENGTH) { |
1096 | { | ||
1097 | int alert_level = s->d1->alert_fragment[0]; | 1062 | int alert_level = s->d1->alert_fragment[0]; |
1098 | int alert_descr = s->d1->alert_fragment[1]; | 1063 | int alert_descr = s->d1->alert_fragment[1]; |
1099 | 1064 | ||
1100 | s->d1->alert_fragment_len = 0; | 1065 | s->d1->alert_fragment_len = 0; |
1101 | 1066 | ||
1102 | if (s->msg_callback) | 1067 | if (s->msg_callback) |
1103 | s->msg_callback(0, s->version, SSL3_RT_ALERT, | 1068 | s->msg_callback(0, s->version, SSL3_RT_ALERT, |
1104 | s->d1->alert_fragment, 2, s, s->msg_callback_arg); | 1069 | s->d1->alert_fragment, 2, s, s->msg_callback_arg); |
1105 | 1070 | ||
1106 | if (s->info_callback != NULL) | 1071 | if (s->info_callback != NULL) |
1107 | cb=s->info_callback; | 1072 | cb = s->info_callback; |
1108 | else if (s->ctx->info_callback != NULL) | 1073 | else if (s->ctx->info_callback != NULL) |
1109 | cb=s->ctx->info_callback; | 1074 | cb = s->ctx->info_callback; |
1110 | 1075 | ||
1111 | if (cb != NULL) | 1076 | if (cb != NULL) { |
1112 | { | ||
1113 | j = (alert_level << 8) | alert_descr; | 1077 | j = (alert_level << 8) | alert_descr; |
1114 | cb(s, SSL_CB_READ_ALERT, j); | 1078 | cb(s, SSL_CB_READ_ALERT, j); |
1115 | } | 1079 | } |
1116 | 1080 | ||
1117 | if (alert_level == 1) /* warning */ | 1081 | if (alert_level == 1) /* warning */ |
1118 | { | 1082 | { |
1119 | s->s3->warn_alert = alert_descr; | 1083 | s->s3->warn_alert = alert_descr; |
1120 | if (alert_descr == SSL_AD_CLOSE_NOTIFY) | 1084 | if (alert_descr == SSL_AD_CLOSE_NOTIFY) { |
1121 | { | ||
1122 | #ifndef OPENSSL_NO_SCTP | 1085 | #ifndef OPENSSL_NO_SCTP |
1123 | /* With SCTP and streams the socket may deliver app data | 1086 | /* With SCTP and streams the socket may deliver app data |
1124 | * after a close_notify alert. We have to check this | 1087 | * after a close_notify alert. We have to check this |
1125 | * first so that nothing gets discarded. | 1088 | * first so that nothing gets discarded. |
1126 | */ | 1089 | */ |
1127 | if (BIO_dgram_is_sctp(SSL_get_rbio(s)) && | 1090 | if (BIO_dgram_is_sctp(SSL_get_rbio(s)) && |
1128 | BIO_dgram_sctp_msg_waiting(SSL_get_rbio(s))) | 1091 | BIO_dgram_sctp_msg_waiting(SSL_get_rbio(s))) { |
1129 | { | ||
1130 | s->d1->shutdown_received = 1; | 1092 | s->d1->shutdown_received = 1; |
1131 | s->rwstate=SSL_READING; | 1093 | s->rwstate = SSL_READING; |
1132 | BIO_clear_retry_flags(SSL_get_rbio(s)); | 1094 | BIO_clear_retry_flags(SSL_get_rbio(s)); |
1133 | BIO_set_retry_read(SSL_get_rbio(s)); | 1095 | BIO_set_retry_read(SSL_get_rbio(s)); |
1134 | return -1; | 1096 | return -1; |
1135 | } | 1097 | } |
1136 | #endif | 1098 | #endif |
1137 | s->shutdown |= SSL_RECEIVED_SHUTDOWN; | 1099 | s->shutdown |= SSL_RECEIVED_SHUTDOWN; |
1138 | return(0); | 1100 | return (0); |
1139 | } | 1101 | } |
1140 | #if 0 | 1102 | #if 0 |
1141 | /* XXX: this is a possible improvement in the future */ | 1103 | /* XXX: this is a possible improvement in the future */ |
1142 | /* now check if it's a missing record */ | 1104 | /* now check if it's a missing record */ |
1143 | if (alert_descr == DTLS1_AD_MISSING_HANDSHAKE_MESSAGE) | 1105 | if (alert_descr == DTLS1_AD_MISSING_HANDSHAKE_MESSAGE) { |
1144 | { | ||
1145 | unsigned short seq; | 1106 | unsigned short seq; |
1146 | unsigned int frag_off; | 1107 | unsigned int frag_off; |
1147 | unsigned char *p = &(s->d1->alert_fragment[2]); | 1108 | unsigned char *p = &(s->d1->alert_fragment[2]); |
@@ -1150,51 +1111,46 @@ start: | |||
1150 | n2l3(p, frag_off); | 1111 | n2l3(p, frag_off); |
1151 | 1112 | ||
1152 | dtls1_retransmit_message(s, | 1113 | dtls1_retransmit_message(s, |
1153 | dtls1_get_queue_priority(frag->msg_header.seq, 0), | 1114 | dtls1_get_queue_priority(frag->msg_header.seq, 0), |
1154 | frag_off, &found); | 1115 | frag_off, &found); |
1155 | if ( ! found && SSL_in_init(s)) | 1116 | if (!found && SSL_in_init(s)) { |
1156 | { | ||
1157 | /* fprintf( stderr,"in init = %d\n", SSL_in_init(s)); */ | 1117 | /* fprintf( stderr,"in init = %d\n", SSL_in_init(s)); */ |
1158 | /* requested a message not yet sent, | 1118 | /* requested a message not yet sent, |
1159 | send an alert ourselves */ | 1119 | send an alert ourselves */ |
1160 | ssl3_send_alert(s,SSL3_AL_WARNING, | 1120 | ssl3_send_alert(s, SSL3_AL_WARNING, |
1161 | DTLS1_AD_MISSING_HANDSHAKE_MESSAGE); | 1121 | DTLS1_AD_MISSING_HANDSHAKE_MESSAGE); |
1162 | } | ||
1163 | } | 1122 | } |
1164 | #endif | ||
1165 | } | 1123 | } |
1166 | else if (alert_level == 2) /* fatal */ | 1124 | #endif |
1167 | { | 1125 | } else if (alert_level == 2) /* fatal */ |
1126 | { | ||
1168 | char tmp[16]; | 1127 | char tmp[16]; |
1169 | 1128 | ||
1170 | s->rwstate=SSL_NOTHING; | 1129 | s->rwstate = SSL_NOTHING; |
1171 | s->s3->fatal_alert = alert_descr; | 1130 | s->s3->fatal_alert = alert_descr; |
1172 | SSLerr(SSL_F_DTLS1_READ_BYTES, SSL_AD_REASON_OFFSET + alert_descr); | 1131 | SSLerr(SSL_F_DTLS1_READ_BYTES, SSL_AD_REASON_OFFSET + alert_descr); |
1173 | BIO_snprintf(tmp,sizeof tmp,"%d",alert_descr); | 1132 | BIO_snprintf(tmp, sizeof tmp, "%d", alert_descr); |
1174 | ERR_add_error_data(2,"SSL alert number ",tmp); | 1133 | ERR_add_error_data(2, "SSL alert number ", tmp); |
1175 | s->shutdown|=SSL_RECEIVED_SHUTDOWN; | 1134 | s->shutdown|=SSL_RECEIVED_SHUTDOWN; |
1176 | SSL_CTX_remove_session(s->ctx,s->session); | 1135 | SSL_CTX_remove_session(s->ctx, s->session); |
1177 | return(0); | 1136 | return (0); |
1178 | } | 1137 | } else { |
1179 | else | 1138 | al = SSL_AD_ILLEGAL_PARAMETER; |
1180 | { | 1139 | SSLerr(SSL_F_DTLS1_READ_BYTES, SSL_R_UNKNOWN_ALERT_TYPE); |
1181 | al=SSL_AD_ILLEGAL_PARAMETER; | ||
1182 | SSLerr(SSL_F_DTLS1_READ_BYTES,SSL_R_UNKNOWN_ALERT_TYPE); | ||
1183 | goto f_err; | 1140 | goto f_err; |
1184 | } | 1141 | } |
1185 | 1142 | ||
1186 | goto start; | 1143 | goto start; |
1187 | } | 1144 | } |
1188 | 1145 | ||
1189 | if (s->shutdown & SSL_SENT_SHUTDOWN) /* but we have not received a shutdown */ | 1146 | if (s->shutdown & SSL_SENT_SHUTDOWN) /* but we have not received a shutdown */ |
1190 | { | 1147 | { |
1191 | s->rwstate=SSL_NOTHING; | 1148 | s->rwstate = SSL_NOTHING; |
1192 | rr->length=0; | 1149 | rr->length = 0; |
1193 | return(0); | 1150 | return (0); |
1194 | } | 1151 | } |
1195 | 1152 | ||
1196 | if (rr->type == SSL3_RT_CHANGE_CIPHER_SPEC) | 1153 | if (rr->type == SSL3_RT_CHANGE_CIPHER_SPEC) { |
1197 | { | ||
1198 | struct ccs_header_st ccs_hdr; | 1154 | struct ccs_header_st ccs_hdr; |
1199 | unsigned int ccs_hdr_len = DTLS1_CCS_HEADER_LENGTH; | 1155 | unsigned int ccs_hdr_len = DTLS1_CCS_HEADER_LENGTH; |
1200 | 1156 | ||
@@ -1206,31 +1162,29 @@ start: | |||
1206 | /* 'Change Cipher Spec' is just a single byte, so we know | 1162 | /* 'Change Cipher Spec' is just a single byte, so we know |
1207 | * exactly what the record payload has to look like */ | 1163 | * exactly what the record payload has to look like */ |
1208 | /* XDTLS: check that epoch is consistent */ | 1164 | /* XDTLS: check that epoch is consistent */ |
1209 | if ( (rr->length != ccs_hdr_len) || | 1165 | if ((rr->length != ccs_hdr_len) || |
1210 | (rr->off != 0) || (rr->data[0] != SSL3_MT_CCS)) | 1166 | (rr->off != 0) || (rr->data[0] != SSL3_MT_CCS)) { |
1211 | { | 1167 | i = SSL_AD_ILLEGAL_PARAMETER; |
1212 | i=SSL_AD_ILLEGAL_PARAMETER; | 1168 | SSLerr(SSL_F_DTLS1_READ_BYTES, SSL_R_BAD_CHANGE_CIPHER_SPEC); |
1213 | SSLerr(SSL_F_DTLS1_READ_BYTES,SSL_R_BAD_CHANGE_CIPHER_SPEC); | ||
1214 | goto err; | 1169 | goto err; |
1215 | } | 1170 | } |
1216 | 1171 | ||
1217 | rr->length=0; | 1172 | rr->length = 0; |
1218 | 1173 | ||
1219 | if (s->msg_callback) | 1174 | if (s->msg_callback) |
1220 | s->msg_callback(0, s->version, SSL3_RT_CHANGE_CIPHER_SPEC, | 1175 | s->msg_callback(0, s->version, SSL3_RT_CHANGE_CIPHER_SPEC, |
1221 | rr->data, 1, s, s->msg_callback_arg); | 1176 | rr->data, 1, s, s->msg_callback_arg); |
1222 | 1177 | ||
1223 | /* We can't process a CCS now, because previous handshake | 1178 | /* We can't process a CCS now, because previous handshake |
1224 | * messages are still missing, so just drop it. | 1179 | * messages are still missing, so just drop it. |
1225 | */ | 1180 | */ |
1226 | if (!s->d1->change_cipher_spec_ok) | 1181 | if (!s->d1->change_cipher_spec_ok) { |
1227 | { | ||
1228 | goto start; | 1182 | goto start; |
1229 | } | 1183 | } |
1230 | 1184 | ||
1231 | s->d1->change_cipher_spec_ok = 0; | 1185 | s->d1->change_cipher_spec_ok = 0; |
1232 | 1186 | ||
1233 | s->s3->change_cipher_spec=1; | 1187 | s->s3->change_cipher_spec = 1; |
1234 | if (!ssl3_do_change_cipher_spec(s)) | 1188 | if (!ssl3_do_change_cipher_spec(s)) |
1235 | goto err; | 1189 | goto err; |
1236 | 1190 | ||
@@ -1250,90 +1204,82 @@ start: | |||
1250 | #endif | 1204 | #endif |
1251 | 1205 | ||
1252 | goto start; | 1206 | goto start; |
1253 | } | 1207 | } |
1254 | 1208 | ||
1255 | /* Unexpected handshake message (Client Hello, or protocol violation) */ | 1209 | /* Unexpected handshake message (Client Hello, or protocol violation) */ |
1256 | if ((s->d1->handshake_fragment_len >= DTLS1_HM_HEADER_LENGTH) && | 1210 | if ((s->d1->handshake_fragment_len >= DTLS1_HM_HEADER_LENGTH) && |
1257 | !s->in_handshake) | 1211 | !s->in_handshake) { |
1258 | { | ||
1259 | struct hm_header_st msg_hdr; | 1212 | struct hm_header_st msg_hdr; |
1260 | 1213 | ||
1261 | /* this may just be a stale retransmit */ | 1214 | /* this may just be a stale retransmit */ |
1262 | dtls1_get_message_header(rr->data, &msg_hdr); | 1215 | dtls1_get_message_header(rr->data, &msg_hdr); |
1263 | if( rr->epoch != s->d1->r_epoch) | 1216 | if (rr->epoch != s->d1->r_epoch) { |
1264 | { | ||
1265 | rr->length = 0; | 1217 | rr->length = 0; |
1266 | goto start; | 1218 | goto start; |
1267 | } | 1219 | } |
1268 | 1220 | ||
1269 | /* If we are server, we may have a repeated FINISHED of the | 1221 | /* If we are server, we may have a repeated FINISHED of the |
1270 | * client here, then retransmit our CCS and FINISHED. | 1222 | * client here, then retransmit our CCS and FINISHED. |
1271 | */ | 1223 | */ |
1272 | if (msg_hdr.type == SSL3_MT_FINISHED) | 1224 | if (msg_hdr.type == SSL3_MT_FINISHED) { |
1273 | { | ||
1274 | if (dtls1_check_timeout_num(s) < 0) | 1225 | if (dtls1_check_timeout_num(s) < 0) |
1275 | return -1; | 1226 | return -1; |
1276 | 1227 | ||
1277 | dtls1_retransmit_buffered_messages(s); | 1228 | dtls1_retransmit_buffered_messages(s); |
1278 | rr->length = 0; | 1229 | rr->length = 0; |
1279 | goto start; | 1230 | goto start; |
1280 | } | 1231 | } |
1281 | 1232 | ||
1282 | if (((s->state&SSL_ST_MASK) == SSL_ST_OK) && | 1233 | if (((s->state&SSL_ST_MASK) == SSL_ST_OK) && |
1283 | !(s->s3->flags & SSL3_FLAGS_NO_RENEGOTIATE_CIPHERS)) | 1234 | !(s->s3->flags & SSL3_FLAGS_NO_RENEGOTIATE_CIPHERS)) { |
1284 | { | ||
1285 | #if 0 /* worked only because C operator preferences are not as expected (and | 1235 | #if 0 /* worked only because C operator preferences are not as expected (and |
1286 | * because this is not really needed for clients except for detecting | 1236 | * because this is not really needed for clients except for detecting |
1287 | * protocol violations): */ | 1237 | * protocol violations): */ |
1288 | s->state=SSL_ST_BEFORE|(s->server) | 1238 | s->state = SSL_ST_BEFORE | |
1289 | ?SSL_ST_ACCEPT | 1239 | (s->server) ? SSL_ST_ACCEPT : SSL_ST_CONNECT; |
1290 | :SSL_ST_CONNECT; | ||
1291 | #else | 1240 | #else |
1292 | s->state = s->server ? SSL_ST_ACCEPT : SSL_ST_CONNECT; | 1241 | s->state = s->server ? SSL_ST_ACCEPT : SSL_ST_CONNECT; |
1293 | #endif | 1242 | #endif |
1294 | s->renegotiate=1; | 1243 | s->renegotiate = 1; |
1295 | s->new_session=1; | 1244 | s->new_session = 1; |
1296 | } | 1245 | } |
1297 | i=s->handshake_func(s); | 1246 | i = s->handshake_func(s); |
1298 | if (i < 0) return(i); | 1247 | if (i < 0) |
1299 | if (i == 0) | 1248 | return (i); |
1300 | { | 1249 | if (i == 0) { |
1301 | SSLerr(SSL_F_DTLS1_READ_BYTES,SSL_R_SSL_HANDSHAKE_FAILURE); | 1250 | SSLerr(SSL_F_DTLS1_READ_BYTES, SSL_R_SSL_HANDSHAKE_FAILURE); |
1302 | return(-1); | 1251 | return (-1); |
1303 | } | 1252 | } |
1304 | 1253 | ||
1305 | if (!(s->mode & SSL_MODE_AUTO_RETRY)) | 1254 | if (!(s->mode & SSL_MODE_AUTO_RETRY)) { |
1306 | { | ||
1307 | if (s->s3->rbuf.left == 0) /* no read-ahead left? */ | 1255 | if (s->s3->rbuf.left == 0) /* no read-ahead left? */ |
1308 | { | 1256 | { |
1309 | BIO *bio; | 1257 | BIO *bio; |
1310 | /* In the case where we try to read application data, | 1258 | /* In the case where we try to read application data, |
1311 | * but we trigger an SSL handshake, we return -1 with | 1259 | * but we trigger an SSL handshake, we return -1 with |
1312 | * the retry option set. Otherwise renegotiation may | 1260 | * the retry option set. Otherwise renegotiation may |
1313 | * cause nasty problems in the blocking world */ | 1261 | * cause nasty problems in the blocking world */ |
1314 | s->rwstate=SSL_READING; | 1262 | s->rwstate = SSL_READING; |
1315 | bio=SSL_get_rbio(s); | 1263 | bio = SSL_get_rbio(s); |
1316 | BIO_clear_retry_flags(bio); | 1264 | BIO_clear_retry_flags(bio); |
1317 | BIO_set_retry_read(bio); | 1265 | BIO_set_retry_read(bio); |
1318 | return(-1); | 1266 | return (-1); |
1319 | } | ||
1320 | } | 1267 | } |
1321 | goto start; | ||
1322 | } | 1268 | } |
1269 | goto start; | ||
1270 | } | ||
1323 | 1271 | ||
1324 | switch (rr->type) | 1272 | switch (rr->type) { |
1325 | { | ||
1326 | default: | 1273 | default: |
1327 | #ifndef OPENSSL_NO_TLS | 1274 | #ifndef OPENSSL_NO_TLS |
1328 | /* TLS just ignores unknown message types */ | 1275 | /* TLS just ignores unknown message types */ |
1329 | if (s->version == TLS1_VERSION) | 1276 | if (s->version == TLS1_VERSION) { |
1330 | { | ||
1331 | rr->length = 0; | 1277 | rr->length = 0; |
1332 | goto start; | 1278 | goto start; |
1333 | } | 1279 | } |
1334 | #endif | 1280 | #endif |
1335 | al=SSL_AD_UNEXPECTED_MESSAGE; | 1281 | al = SSL_AD_UNEXPECTED_MESSAGE; |
1336 | SSLerr(SSL_F_DTLS1_READ_BYTES,SSL_R_UNEXPECTED_RECORD); | 1282 | SSLerr(SSL_F_DTLS1_READ_BYTES, SSL_R_UNEXPECTED_RECORD); |
1337 | goto f_err; | 1283 | goto f_err; |
1338 | case SSL3_RT_CHANGE_CIPHER_SPEC: | 1284 | case SSL3_RT_CHANGE_CIPHER_SPEC: |
1339 | case SSL3_RT_ALERT: | 1285 | case SSL3_RT_ALERT: |
@@ -1341,8 +1287,8 @@ start: | |||
1341 | /* we already handled all of these, with the possible exception | 1287 | /* we already handled all of these, with the possible exception |
1342 | * of SSL3_RT_HANDSHAKE when s->in_handshake is set, but that | 1288 | * of SSL3_RT_HANDSHAKE when s->in_handshake is set, but that |
1343 | * should not happen when type != rr->type */ | 1289 | * should not happen when type != rr->type */ |
1344 | al=SSL_AD_UNEXPECTED_MESSAGE; | 1290 | al = SSL_AD_UNEXPECTED_MESSAGE; |
1345 | SSLerr(SSL_F_DTLS1_READ_BYTES,ERR_R_INTERNAL_ERROR); | 1291 | SSLerr(SSL_F_DTLS1_READ_BYTES, ERR_R_INTERNAL_ERROR); |
1346 | goto f_err; | 1292 | goto f_err; |
1347 | case SSL3_RT_APPLICATION_DATA: | 1293 | case SSL3_RT_APPLICATION_DATA: |
1348 | /* At this point, we were expecting handshake data, | 1294 | /* At this point, we were expecting handshake data, |
@@ -1353,123 +1299,116 @@ start: | |||
1353 | * we will indulge it. | 1299 | * we will indulge it. |
1354 | */ | 1300 | */ |
1355 | if (s->s3->in_read_app_data && | 1301 | if (s->s3->in_read_app_data && |
1356 | (s->s3->total_renegotiations != 0) && | 1302 | (s->s3->total_renegotiations != 0) && |
1357 | (( | 1303 | (((s->state & SSL_ST_CONNECT) && |
1358 | (s->state & SSL_ST_CONNECT) && | 1304 | (s->state >= SSL3_ST_CW_CLNT_HELLO_A) && |
1359 | (s->state >= SSL3_ST_CW_CLNT_HELLO_A) && | 1305 | (s->state <= SSL3_ST_CR_SRVR_HELLO_A)) || ( |
1360 | (s->state <= SSL3_ST_CR_SRVR_HELLO_A) | 1306 | (s->state & SSL_ST_ACCEPT) && |
1361 | ) || ( | 1307 | (s->state <= SSL3_ST_SW_HELLO_REQ_A) && |
1362 | (s->state & SSL_ST_ACCEPT) && | 1308 | (s->state >= SSL3_ST_SR_CLNT_HELLO_A)))) { |
1363 | (s->state <= SSL3_ST_SW_HELLO_REQ_A) && | 1309 | s->s3->in_read_app_data = 2; |
1364 | (s->state >= SSL3_ST_SR_CLNT_HELLO_A) | 1310 | return (-1); |
1365 | ) | 1311 | } else { |
1366 | )) | 1312 | al = SSL_AD_UNEXPECTED_MESSAGE; |
1367 | { | 1313 | SSLerr(SSL_F_DTLS1_READ_BYTES, SSL_R_UNEXPECTED_RECORD); |
1368 | s->s3->in_read_app_data=2; | ||
1369 | return(-1); | ||
1370 | } | ||
1371 | else | ||
1372 | { | ||
1373 | al=SSL_AD_UNEXPECTED_MESSAGE; | ||
1374 | SSLerr(SSL_F_DTLS1_READ_BYTES,SSL_R_UNEXPECTED_RECORD); | ||
1375 | goto f_err; | 1314 | goto f_err; |
1376 | } | ||
1377 | } | 1315 | } |
1316 | } | ||
1378 | /* not reached */ | 1317 | /* not reached */ |
1379 | 1318 | ||
1380 | f_err: | 1319 | f_err: |
1381 | ssl3_send_alert(s,SSL3_AL_FATAL,al); | 1320 | ssl3_send_alert(s, SSL3_AL_FATAL, al); |
1382 | err: | 1321 | err: |
1383 | return(-1); | 1322 | return (-1); |
1384 | } | 1323 | } |
1385 | 1324 | ||
1386 | int | 1325 | int |
1387 | dtls1_write_app_data_bytes(SSL *s, int type, const void *buf_, int len) | 1326 | dtls1_write_app_data_bytes(SSL *s, int type, const void *buf_, int len) |
1388 | { | 1327 | { |
1389 | int i; | 1328 | int i; |
1390 | 1329 | ||
1391 | #ifndef OPENSSL_NO_SCTP | 1330 | #ifndef OPENSSL_NO_SCTP |
1392 | /* Check if we have to continue an interrupted handshake | 1331 | /* Check if we have to continue an interrupted handshake |
1393 | * for reading belated app data with SCTP. | 1332 | * for reading belated app data with SCTP. |
1394 | */ | 1333 | */ |
1395 | if ((SSL_in_init(s) && !s->in_handshake) || | 1334 | if ((SSL_in_init(s) && !s->in_handshake) || |
1396 | (BIO_dgram_is_sctp(SSL_get_wbio(s)) && | 1335 | (BIO_dgram_is_sctp(SSL_get_wbio(s)) && |
1397 | (s->state == DTLS1_SCTP_ST_SR_READ_SOCK || s->state == DTLS1_SCTP_ST_CR_READ_SOCK))) | 1336 | (s->state == DTLS1_SCTP_ST_SR_READ_SOCK || |
1337 | s->state == DTLS1_SCTP_ST_CR_READ_SOCK))) | ||
1398 | #else | 1338 | #else |
1399 | if (SSL_in_init(s) && !s->in_handshake) | 1339 | if (SSL_in_init(s) && !s->in_handshake) |
1400 | #endif | 1340 | #endif |
1401 | { | 1341 | { |
1402 | i=s->handshake_func(s); | 1342 | i = s->handshake_func(s); |
1403 | if (i < 0) return(i); | 1343 | if (i < 0) |
1404 | if (i == 0) | 1344 | return (i); |
1405 | { | 1345 | if (i == 0) { |
1406 | SSLerr(SSL_F_DTLS1_WRITE_APP_DATA_BYTES,SSL_R_SSL_HANDSHAKE_FAILURE); | 1346 | SSLerr(SSL_F_DTLS1_WRITE_APP_DATA_BYTES, SSL_R_SSL_HANDSHAKE_FAILURE); |
1407 | return -1; | 1347 | return -1; |
1408 | } | ||
1409 | } | 1348 | } |
1349 | } | ||
1410 | 1350 | ||
1411 | if (len > SSL3_RT_MAX_PLAIN_LENGTH) | 1351 | if (len > SSL3_RT_MAX_PLAIN_LENGTH) { |
1412 | { | 1352 | SSLerr(SSL_F_DTLS1_WRITE_APP_DATA_BYTES, SSL_R_DTLS_MESSAGE_TOO_BIG); |
1413 | SSLerr(SSL_F_DTLS1_WRITE_APP_DATA_BYTES,SSL_R_DTLS_MESSAGE_TOO_BIG); | 1353 | return -1; |
1414 | return -1; | 1354 | } |
1415 | } | ||
1416 | 1355 | ||
1417 | i = dtls1_write_bytes(s, type, buf_, len); | 1356 | i = dtls1_write_bytes(s, type, buf_, len); |
1418 | return i; | 1357 | return i; |
1419 | } | 1358 | } |
1420 | 1359 | ||
1421 | 1360 | ||
1422 | /* this only happens when a client hello is received and a handshake | 1361 | /* this only happens when a client hello is received and a handshake |
1423 | * is started. */ | 1362 | * is started. */ |
1424 | static int | 1363 | static int |
1425 | have_handshake_fragment(SSL *s, int type, unsigned char *buf, | 1364 | have_handshake_fragment(SSL *s, int type, unsigned char *buf, |
1426 | int len, int peek) | 1365 | int len, int peek) |
1427 | { | 1366 | { |
1428 | 1367 | ||
1429 | if ((type == SSL3_RT_HANDSHAKE) && (s->d1->handshake_fragment_len > 0)) | 1368 | if ((type == SSL3_RT_HANDSHAKE) && (s->d1->handshake_fragment_len > 0)) |
1430 | /* (partially) satisfy request from storage */ | 1369 | /* (partially) satisfy request from storage */ |
1431 | { | 1370 | { |
1432 | unsigned char *src = s->d1->handshake_fragment; | 1371 | unsigned char *src = s->d1->handshake_fragment; |
1433 | unsigned char *dst = buf; | 1372 | unsigned char *dst = buf; |
1434 | unsigned int k,n; | 1373 | unsigned int k, n; |
1435 | 1374 | ||
1436 | /* peek == 0 */ | 1375 | /* peek == 0 */ |
1437 | n = 0; | 1376 | n = 0; |
1438 | while ((len > 0) && (s->d1->handshake_fragment_len > 0)) | 1377 | while ((len > 0) && (s->d1->handshake_fragment_len > 0)) { |
1439 | { | ||
1440 | *dst++ = *src++; | 1378 | *dst++ = *src++; |
1441 | len--; s->d1->handshake_fragment_len--; | 1379 | len--; |
1380 | s->d1->handshake_fragment_len--; | ||
1442 | n++; | 1381 | n++; |
1443 | } | 1382 | } |
1444 | /* move any remaining fragment bytes: */ | 1383 | /* move any remaining fragment bytes: */ |
1445 | for (k = 0; k < s->d1->handshake_fragment_len; k++) | 1384 | for (k = 0; k < s->d1->handshake_fragment_len; k++) |
1446 | s->d1->handshake_fragment[k] = *src++; | 1385 | s->d1->handshake_fragment[k] = *src++; |
1447 | return n; | 1386 | return n; |
1448 | } | ||
1449 | |||
1450 | return 0; | ||
1451 | } | 1387 | } |
1452 | 1388 | ||
1453 | 1389 | return 0; | |
1390 | } | ||
1454 | 1391 | ||
1455 | 1392 | ||
1456 | /* Call this to write data in records of type 'type' | 1393 | /* Call this to write data in records of type 'type' |
1457 | * It will return <= 0 if not all data has been sent or non-blocking IO. | 1394 | * It will return <= 0 if not all data has been sent or non-blocking IO. |
1458 | */ | 1395 | */ |
1459 | int dtls1_write_bytes(SSL *s, int type, const void *buf, int len) | 1396 | int |
1460 | { | 1397 | dtls1_write_bytes(SSL *s, int type, const void *buf, int len) |
1398 | { | ||
1461 | int i; | 1399 | int i; |
1462 | 1400 | ||
1463 | OPENSSL_assert(len <= SSL3_RT_MAX_PLAIN_LENGTH); | 1401 | OPENSSL_assert(len <= SSL3_RT_MAX_PLAIN_LENGTH); |
1464 | s->rwstate=SSL_NOTHING; | 1402 | s->rwstate = SSL_NOTHING; |
1465 | i=do_dtls1_write(s, type, buf, len, 0); | 1403 | i = do_dtls1_write(s, type, buf, len, 0); |
1466 | return i; | 1404 | return i; |
1467 | } | 1405 | } |
1468 | 1406 | ||
1469 | int do_dtls1_write(SSL *s, int type, const unsigned char *buf, unsigned int len, int create_empty_fragment) | 1407 | int |
1470 | { | 1408 | do_dtls1_write(SSL *s, int type, const unsigned char *buf, unsigned int len, int create_empty_fragment) |
1471 | unsigned char *p,*pseq; | 1409 | { |
1472 | int i,mac_size,clear=0; | 1410 | unsigned char *p, *pseq; |
1411 | int i, mac_size, clear = 0; | ||
1473 | int prefix_len = 0; | 1412 | int prefix_len = 0; |
1474 | SSL3_RECORD *wr; | 1413 | SSL3_RECORD *wr; |
1475 | SSL3_BUFFER *wb; | 1414 | SSL3_BUFFER *wb; |
@@ -1478,54 +1417,49 @@ int do_dtls1_write(SSL *s, int type, const unsigned char *buf, unsigned int len, | |||
1478 | 1417 | ||
1479 | /* first check if there is a SSL3_BUFFER still being written | 1418 | /* first check if there is a SSL3_BUFFER still being written |
1480 | * out. This will happen with non blocking IO */ | 1419 | * out. This will happen with non blocking IO */ |
1481 | if (s->s3->wbuf.left != 0) | 1420 | if (s->s3->wbuf.left != 0) { |
1482 | { | ||
1483 | OPENSSL_assert(0); /* XDTLS: want to see if we ever get here */ | 1421 | OPENSSL_assert(0); /* XDTLS: want to see if we ever get here */ |
1484 | return(ssl3_write_pending(s,type,buf,len)); | 1422 | return (ssl3_write_pending(s, type, buf, len)); |
1485 | } | 1423 | } |
1486 | 1424 | ||
1487 | /* If we have an alert to send, lets send it */ | 1425 | /* If we have an alert to send, lets send it */ |
1488 | if (s->s3->alert_dispatch) | 1426 | if (s->s3->alert_dispatch) { |
1489 | { | 1427 | i = s->method->ssl_dispatch_alert(s); |
1490 | i=s->method->ssl_dispatch_alert(s); | ||
1491 | if (i <= 0) | 1428 | if (i <= 0) |
1492 | return(i); | 1429 | return (i); |
1493 | /* if it went, fall through and send more stuff */ | 1430 | /* if it went, fall through and send more stuff */ |
1494 | } | 1431 | } |
1495 | 1432 | ||
1496 | if (len == 0 && !create_empty_fragment) | 1433 | if (len == 0 && !create_empty_fragment) |
1497 | return 0; | 1434 | return 0; |
1498 | 1435 | ||
1499 | wr= &(s->s3->wrec); | 1436 | wr = &(s->s3->wrec); |
1500 | wb= &(s->s3->wbuf); | 1437 | wb = &(s->s3->wbuf); |
1501 | sess=s->session; | 1438 | sess = s->session; |
1502 | 1439 | ||
1503 | if ( (sess == NULL) || | 1440 | if ((sess == NULL) || (s->enc_write_ctx == NULL) || |
1504 | (s->enc_write_ctx == NULL) || | 1441 | (EVP_MD_CTX_md(s->write_hash) == NULL)) |
1505 | (EVP_MD_CTX_md(s->write_hash) == NULL)) | 1442 | clear = 1; |
1506 | clear=1; | ||
1507 | 1443 | ||
1508 | if (clear) | 1444 | if (clear) |
1509 | mac_size=0; | 1445 | mac_size = 0; |
1510 | else | 1446 | else { |
1511 | { | 1447 | mac_size = EVP_MD_CTX_size(s->write_hash); |
1512 | mac_size=EVP_MD_CTX_size(s->write_hash); | ||
1513 | if (mac_size < 0) | 1448 | if (mac_size < 0) |
1514 | goto err; | 1449 | goto err; |
1515 | } | 1450 | } |
1516 | 1451 | ||
1517 | /* DTLS implements explicit IV, so no need for empty fragments */ | 1452 | /* DTLS implements explicit IV, so no need for empty fragments */ |
1518 | #if 0 | 1453 | #if 0 |
1519 | /* 'create_empty_fragment' is true only when this function calls itself */ | 1454 | /* 'create_empty_fragment' is true only when this function calls itself */ |
1520 | if (!clear && !create_empty_fragment && !s->s3->empty_fragment_done | 1455 | if (!clear && !create_empty_fragment && !s->s3->empty_fragment_done && |
1521 | && SSL_version(s) != DTLS1_VERSION && SSL_version(s) != DTLS1_BAD_VER) | 1456 | SSL_version(s) != DTLS1_VERSION && |
1522 | { | 1457 | SSL_version(s) != DTLS1_BAD_VER) { |
1523 | /* countermeasure against known-IV weakness in CBC ciphersuites | 1458 | /* countermeasure against known-IV weakness in CBC ciphersuites |
1524 | * (see http://www.openssl.org/~bodo/tls-cbc.txt) | 1459 | * (see http://www.openssl.org/~bodo/tls-cbc.txt) |
1525 | */ | 1460 | */ |
1526 | 1461 | ||
1527 | if (s->s3->need_empty_fragments && type == SSL3_RT_APPLICATION_DATA) | 1462 | if (s->s3->need_empty_fragments && type == SSL3_RT_APPLICATION_DATA) { |
1528 | { | ||
1529 | /* recursive function call with 'create_empty_fragment' set; | 1463 | /* recursive function call with 'create_empty_fragment' set; |
1530 | * this prepares and buffers the data for an empty fragment | 1464 | * this prepares and buffers the data for an empty fragment |
1531 | * (these 'prefix_len' bytes are sent out later | 1465 | * (these 'prefix_len' bytes are sent out later |
@@ -1534,211 +1468,206 @@ int do_dtls1_write(SSL *s, int type, const unsigned char *buf, unsigned int len, | |||
1534 | if (prefix_len <= 0) | 1468 | if (prefix_len <= 0) |
1535 | goto err; | 1469 | goto err; |
1536 | 1470 | ||
1537 | if (s->s3->wbuf.len < (size_t)prefix_len + SSL3_RT_MAX_PACKET_SIZE) | 1471 | if (s->s3->wbuf.len < (size_t)prefix_len + SSL3_RT_MAX_PACKET_SIZE) { |
1538 | { | ||
1539 | /* insufficient space */ | 1472 | /* insufficient space */ |
1540 | SSLerr(SSL_F_DO_DTLS1_WRITE, ERR_R_INTERNAL_ERROR); | 1473 | SSLerr(SSL_F_DO_DTLS1_WRITE, ERR_R_INTERNAL_ERROR); |
1541 | goto err; | 1474 | goto err; |
1542 | } | ||
1543 | } | 1475 | } |
1544 | |||
1545 | s->s3->empty_fragment_done = 1; | ||
1546 | } | 1476 | } |
1477 | |||
1478 | s->s3->empty_fragment_done = 1; | ||
1479 | } | ||
1547 | #endif | 1480 | #endif |
1548 | p = wb->buf + prefix_len; | 1481 | p = wb->buf + prefix_len; |
1549 | 1482 | ||
1550 | /* write the header */ | 1483 | /* write the header */ |
1551 | 1484 | ||
1552 | *(p++)=type&0xff; | 1485 | *(p++) = type&0xff; |
1553 | wr->type=type; | 1486 | wr->type = type; |
1554 | 1487 | ||
1555 | *(p++)=(s->version>>8); | 1488 | *(p++) = (s->version >> 8); |
1556 | *(p++)=s->version&0xff; | 1489 | *(p++) = s->version&0xff; |
1557 | 1490 | ||
1558 | /* field where we are to write out packet epoch, seq num and len */ | 1491 | /* field where we are to write out packet epoch, seq num and len */ |
1559 | pseq=p; | 1492 | pseq = p; |
1560 | p+=10; | 1493 | |
1494 | p += 10; | ||
1561 | 1495 | ||
1562 | /* lets setup the record stuff. */ | 1496 | /* lets setup the record stuff. */ |
1563 | 1497 | ||
1564 | /* Make space for the explicit IV in case of CBC. | 1498 | /* Make space for the explicit IV in case of CBC. |
1565 | * (this is a bit of a boundary violation, but what the heck). | 1499 | * (this is a bit of a boundary violation, but what the heck). |
1566 | */ | 1500 | */ |
1567 | if ( s->enc_write_ctx && | 1501 | if (s->enc_write_ctx && |
1568 | (EVP_CIPHER_mode( s->enc_write_ctx->cipher ) & EVP_CIPH_CBC_MODE)) | 1502 | (EVP_CIPHER_mode( s->enc_write_ctx->cipher ) & EVP_CIPH_CBC_MODE)) |
1569 | bs = EVP_CIPHER_block_size(s->enc_write_ctx->cipher); | 1503 | bs = EVP_CIPHER_block_size(s->enc_write_ctx->cipher); |
1570 | else | 1504 | else |
1571 | bs = 0; | 1505 | bs = 0; |
1572 | 1506 | ||
1573 | wr->data=p + bs; /* make room for IV in case of CBC */ | 1507 | wr->data = p + bs; |
1574 | wr->length=(int)len; | 1508 | /* make room for IV in case of CBC */ |
1575 | wr->input=(unsigned char *)buf; | 1509 | wr->length = (int)len; |
1510 | wr->input = (unsigned char *)buf; | ||
1576 | 1511 | ||
1577 | /* we now 'read' from wr->input, wr->length bytes into | 1512 | /* we now 'read' from wr->input, wr->length bytes into |
1578 | * wr->data */ | 1513 | * wr->data */ |
1579 | 1514 | ||
1580 | /* first we compress */ | 1515 | /* first we compress */ |
1581 | if (s->compress != NULL) | 1516 | if (s->compress != NULL) { |
1582 | { | 1517 | if (!ssl3_do_compress(s)) { |
1583 | if (!ssl3_do_compress(s)) | 1518 | SSLerr(SSL_F_DO_DTLS1_WRITE, SSL_R_COMPRESSION_FAILURE); |
1584 | { | ||
1585 | SSLerr(SSL_F_DO_DTLS1_WRITE,SSL_R_COMPRESSION_FAILURE); | ||
1586 | goto err; | 1519 | goto err; |
1587 | } | ||
1588 | } | ||
1589 | else | ||
1590 | { | ||
1591 | memcpy(wr->data,wr->input,wr->length); | ||
1592 | wr->input=wr->data; | ||
1593 | } | 1520 | } |
1521 | } else { | ||
1522 | memcpy(wr->data, wr->input, wr->length); | ||
1523 | wr->input = wr->data; | ||
1524 | } | ||
1594 | 1525 | ||
1595 | /* we should still have the output to wr->data and the input | 1526 | /* we should still have the output to wr->data and the input |
1596 | * from wr->input. Length should be wr->length. | 1527 | * from wr->input. Length should be wr->length. |
1597 | * wr->data still points in the wb->buf */ | 1528 | * wr->data still points in the wb->buf */ |
1598 | 1529 | ||
1599 | if (mac_size != 0) | 1530 | if (mac_size != 0) { |
1600 | { | 1531 | if (s->method->ssl3_enc->mac(s, &(p[wr->length + bs]), 1) < 0) |
1601 | if(s->method->ssl3_enc->mac(s,&(p[wr->length + bs]),1) < 0) | ||
1602 | goto err; | 1532 | goto err; |
1603 | wr->length+=mac_size; | 1533 | wr->length += mac_size; |
1604 | } | 1534 | } |
1605 | 1535 | ||
1606 | /* this is true regardless of mac size */ | 1536 | /* this is true regardless of mac size */ |
1607 | wr->input=p; | 1537 | wr->input = p; |
1608 | wr->data=p; | 1538 | wr->data = p; |
1609 | 1539 | ||
1610 | 1540 | ||
1611 | /* ssl3_enc can only have an error on read */ | 1541 | /* ssl3_enc can only have an error on read */ |
1612 | if (bs) /* bs != 0 in case of CBC */ | 1542 | if (bs) /* bs != 0 in case of CBC */ |
1613 | { | 1543 | { |
1614 | RAND_pseudo_bytes(p,bs); | 1544 | RAND_pseudo_bytes(p, bs); |
1615 | /* master IV and last CBC residue stand for | 1545 | /* master IV and last CBC residue stand for |
1616 | * the rest of randomness */ | 1546 | * the rest of randomness */ |
1617 | wr->length += bs; | 1547 | wr->length += bs; |
1618 | } | 1548 | } |
1619 | 1549 | ||
1620 | s->method->ssl3_enc->enc(s,1); | 1550 | s->method->ssl3_enc->enc(s, 1); |
1621 | 1551 | ||
1622 | /* record length after mac and block padding */ | 1552 | /* record length after mac and block padding */ |
1623 | /* if (type == SSL3_RT_APPLICATION_DATA || | 1553 | /* if (type == SSL3_RT_APPLICATION_DATA || |
1624 | (type == SSL3_RT_ALERT && ! SSL_in_init(s))) */ | 1554 | (type == SSL3_RT_ALERT && ! SSL_in_init(s))) */ |
1625 | 1555 | ||
1626 | /* there's only one epoch between handshake and app data */ | 1556 | /* there's only one epoch between handshake and app data */ |
1627 | 1557 | ||
1628 | s2n(s->d1->w_epoch, pseq); | 1558 | s2n(s->d1->w_epoch, pseq); |
1629 | 1559 | ||
1630 | /* XDTLS: ?? */ | 1560 | /* XDTLS: ?? */ |
1631 | /* else | 1561 | /* else |
1632 | s2n(s->d1->handshake_epoch, pseq); */ | 1562 | s2n(s->d1->handshake_epoch, pseq); |
1563 | */ | ||
1633 | 1564 | ||
1634 | memcpy(pseq, &(s->s3->write_sequence[2]), 6); | 1565 | memcpy(pseq, &(s->s3->write_sequence[2]), 6); |
1635 | pseq+=6; | 1566 | pseq += 6; |
1636 | s2n(wr->length,pseq); | 1567 | s2n(wr->length, pseq); |
1637 | 1568 | ||
1638 | /* we should now have | 1569 | /* we should now have |
1639 | * wr->data pointing to the encrypted data, which is | 1570 | * wr->data pointing to the encrypted data, which is |
1640 | * wr->length long */ | 1571 | * wr->length long */ |
1641 | wr->type=type; /* not needed but helps for debugging */ | 1572 | wr->type=type; /* not needed but helps for debugging */ |
1642 | wr->length+=DTLS1_RT_HEADER_LENGTH; | 1573 | wr->length += DTLS1_RT_HEADER_LENGTH; |
1643 | 1574 | ||
1644 | #if 0 /* this is now done at the message layer */ | 1575 | #if 0 /* this is now done at the message layer */ |
1645 | /* buffer the record, making it easy to handle retransmits */ | 1576 | /* buffer the record, making it easy to handle retransmits */ |
1646 | if ( type == SSL3_RT_HANDSHAKE || type == SSL3_RT_CHANGE_CIPHER_SPEC) | 1577 | if (type == SSL3_RT_HANDSHAKE || type == SSL3_RT_CHANGE_CIPHER_SPEC) |
1647 | dtls1_buffer_record(s, wr->data, wr->length, | 1578 | dtls1_buffer_record(s, wr->data, wr->length, |
1648 | *((PQ_64BIT *)&(s->s3->write_sequence[0]))); | 1579 | *((PQ_64BIT *)&(s->s3->write_sequence[0]))); |
1649 | #endif | 1580 | #endif |
1650 | 1581 | ||
1651 | ssl3_record_sequence_update(&(s->s3->write_sequence[0])); | 1582 | ssl3_record_sequence_update(&(s->s3->write_sequence[0])); |
1652 | 1583 | ||
1653 | if (create_empty_fragment) | 1584 | if (create_empty_fragment) { |
1654 | { | ||
1655 | /* we are in a recursive call; | 1585 | /* we are in a recursive call; |
1656 | * just return the length, don't write out anything here | 1586 | * just return the length, don't write out anything here |
1657 | */ | 1587 | */ |
1658 | return wr->length; | 1588 | return wr->length; |
1659 | } | 1589 | } |
1660 | 1590 | ||
1661 | /* now let's set up wb */ | 1591 | /* now let's set up wb */ |
1662 | wb->left = prefix_len + wr->length; | 1592 | wb->left = prefix_len + wr->length; |
1663 | wb->offset = 0; | 1593 | wb->offset = 0; |
1664 | 1594 | ||
1665 | /* memorize arguments so that ssl3_write_pending can detect bad write retries later */ | 1595 | /* memorize arguments so that ssl3_write_pending can detect bad write retries later */ |
1666 | s->s3->wpend_tot=len; | 1596 | s->s3->wpend_tot = len; |
1667 | s->s3->wpend_buf=buf; | 1597 | s->s3->wpend_buf = buf; |
1668 | s->s3->wpend_type=type; | 1598 | s->s3->wpend_type = type; |
1669 | s->s3->wpend_ret=len; | 1599 | s->s3->wpend_ret = len; |
1670 | 1600 | ||
1671 | /* we now just need to write the buffer */ | 1601 | /* we now just need to write the buffer */ |
1672 | return ssl3_write_pending(s,type,buf,len); | 1602 | return ssl3_write_pending(s, type, buf, len); |
1673 | err: | 1603 | err: |
1674 | return -1; | 1604 | return -1; |
1675 | } | 1605 | } |
1676 | 1606 | ||
1677 | 1607 | ||
1678 | 1608 | ||
1679 | static int dtls1_record_replay_check(SSL *s, DTLS1_BITMAP *bitmap) | 1609 | static int |
1680 | { | 1610 | dtls1_record_replay_check(SSL *s, DTLS1_BITMAP *bitmap) |
1611 | { | ||
1681 | int cmp; | 1612 | int cmp; |
1682 | unsigned int shift; | 1613 | unsigned int shift; |
1683 | const unsigned char *seq = s->s3->read_sequence; | 1614 | const unsigned char *seq = s->s3->read_sequence; |
1684 | 1615 | ||
1685 | cmp = satsub64be(seq,bitmap->max_seq_num); | 1616 | cmp = satsub64be(seq, bitmap->max_seq_num); |
1686 | if (cmp > 0) | 1617 | if (cmp > 0) { |
1687 | { | 1618 | memcpy (s->s3->rrec.seq_num, seq, 8); |
1688 | memcpy (s->s3->rrec.seq_num,seq,8); | ||
1689 | return 1; /* this record in new */ | 1619 | return 1; /* this record in new */ |
1690 | } | 1620 | } |
1691 | shift = -cmp; | 1621 | shift = -cmp; |
1692 | if (shift >= sizeof(bitmap->map)*8) | 1622 | if (shift >= sizeof(bitmap->map)*8) |
1693 | return 0; /* stale, outside the window */ | 1623 | return 0; /* stale, outside the window */ |
1694 | else if (bitmap->map & (1UL<<shift)) | 1624 | else if (bitmap->map & (1UL << shift)) |
1695 | return 0; /* record previously received */ | 1625 | return 0; /* record previously received */ |
1696 | 1626 | ||
1697 | memcpy (s->s3->rrec.seq_num,seq,8); | 1627 | memcpy(s->s3->rrec.seq_num, seq, 8); |
1698 | return 1; | 1628 | return 1; |
1699 | } | 1629 | } |
1700 | 1630 | ||
1701 | 1631 | ||
1702 | static void dtls1_record_bitmap_update(SSL *s, DTLS1_BITMAP *bitmap) | 1632 | static void |
1703 | { | 1633 | dtls1_record_bitmap_update(SSL *s, DTLS1_BITMAP *bitmap) |
1634 | { | ||
1704 | int cmp; | 1635 | int cmp; |
1705 | unsigned int shift; | 1636 | unsigned int shift; |
1706 | const unsigned char *seq = s->s3->read_sequence; | 1637 | const unsigned char *seq = s->s3->read_sequence; |
1707 | 1638 | ||
1708 | cmp = satsub64be(seq,bitmap->max_seq_num); | 1639 | cmp = satsub64be(seq, bitmap->max_seq_num); |
1709 | if (cmp > 0) | 1640 | if (cmp > 0) { |
1710 | { | ||
1711 | shift = cmp; | 1641 | shift = cmp; |
1712 | if (shift < sizeof(bitmap->map)*8) | 1642 | if (shift < sizeof(bitmap->map)*8) |
1713 | bitmap->map <<= shift, bitmap->map |= 1UL; | 1643 | bitmap->map <<= shift, bitmap->map |= 1UL; |
1714 | else | 1644 | else |
1715 | bitmap->map = 1UL; | 1645 | bitmap->map = 1UL; |
1716 | memcpy(bitmap->max_seq_num,seq,8); | 1646 | memcpy(bitmap->max_seq_num, seq, 8); |
1717 | } | 1647 | } else { |
1718 | else { | ||
1719 | shift = -cmp; | 1648 | shift = -cmp; |
1720 | if (shift < sizeof(bitmap->map)*8) | 1649 | if (shift < sizeof(bitmap->map) * 8) |
1721 | bitmap->map |= 1UL<<shift; | 1650 | bitmap->map |= 1UL << shift; |
1722 | } | ||
1723 | } | 1651 | } |
1652 | } | ||
1724 | 1653 | ||
1725 | 1654 | ||
1726 | int dtls1_dispatch_alert(SSL *s) | 1655 | int |
1727 | { | 1656 | dtls1_dispatch_alert(SSL *s) |
1728 | int i,j; | 1657 | { |
1729 | void (*cb)(const SSL *ssl,int type,int val)=NULL; | 1658 | int i, j; |
1659 | void (*cb)(const SSL *ssl, int type, int val) = NULL; | ||
1730 | unsigned char buf[DTLS1_AL_HEADER_LENGTH]; | 1660 | unsigned char buf[DTLS1_AL_HEADER_LENGTH]; |
1731 | unsigned char *ptr = &buf[0]; | 1661 | unsigned char *ptr = &buf[0]; |
1732 | 1662 | ||
1733 | s->s3->alert_dispatch=0; | 1663 | s->s3->alert_dispatch = 0; |
1734 | 1664 | ||
1735 | memset(buf, 0x00, sizeof(buf)); | 1665 | memset(buf, 0x00, sizeof(buf)); |
1736 | *ptr++ = s->s3->send_alert[0]; | 1666 | *ptr++ = s->s3->send_alert[0]; |
1737 | *ptr++ = s->s3->send_alert[1]; | 1667 | *ptr++ = s->s3->send_alert[1]; |
1738 | 1668 | ||
1739 | #ifdef DTLS1_AD_MISSING_HANDSHAKE_MESSAGE | 1669 | #ifdef DTLS1_AD_MISSING_HANDSHAKE_MESSAGE |
1740 | if (s->s3->send_alert[1] == DTLS1_AD_MISSING_HANDSHAKE_MESSAGE) | 1670 | if (s->s3->send_alert[1] == DTLS1_AD_MISSING_HANDSHAKE_MESSAGE) { |
1741 | { | ||
1742 | s2n(s->d1->handshake_read_seq, ptr); | 1671 | s2n(s->d1->handshake_read_seq, ptr); |
1743 | #if 0 | 1672 | #if 0 |
1744 | if ( s->d1->r_msg_hdr.frag_off == 0) /* waiting for a new msg */ | 1673 | if ( s->d1->r_msg_hdr.frag_off == 0) /* waiting for a new msg */ |
@@ -1748,152 +1677,136 @@ int dtls1_dispatch_alert(SSL *s) | |||
1748 | #endif | 1677 | #endif |
1749 | 1678 | ||
1750 | #if 0 | 1679 | #if 0 |
1751 | fprintf(stderr, "s->d1->handshake_read_seq = %d, s->d1->r_msg_hdr.seq = %d\n",s->d1->handshake_read_seq,s->d1->r_msg_hdr.seq); | 1680 | fprintf(stderr, "s->d1->handshake_read_seq = %d, s->d1->r_msg_hdr.seq = %d\n", s->d1->handshake_read_seq, s->d1->r_msg_hdr.seq); |
1752 | #endif | 1681 | #endif |
1753 | l2n3(s->d1->r_msg_hdr.frag_off, ptr); | 1682 | l2n3(s->d1->r_msg_hdr.frag_off, ptr); |
1754 | } | 1683 | } |
1755 | #endif | 1684 | #endif |
1756 | 1685 | ||
1757 | i = do_dtls1_write(s, SSL3_RT_ALERT, &buf[0], sizeof(buf), 0); | 1686 | i = do_dtls1_write(s, SSL3_RT_ALERT, &buf[0], sizeof(buf), 0); |
1758 | if (i <= 0) | 1687 | if (i <= 0) { |
1759 | { | 1688 | s->s3->alert_dispatch = 1; |
1760 | s->s3->alert_dispatch=1; | ||
1761 | /* fprintf( stderr, "not done with alert\n" ); */ | 1689 | /* fprintf( stderr, "not done with alert\n" ); */ |
1762 | } | 1690 | } else { |
1763 | else | ||
1764 | { | ||
1765 | if (s->s3->send_alert[0] == SSL3_AL_FATAL | 1691 | if (s->s3->send_alert[0] == SSL3_AL_FATAL |
1766 | #ifdef DTLS1_AD_MISSING_HANDSHAKE_MESSAGE | 1692 | #ifdef DTLS1_AD_MISSING_HANDSHAKE_MESSAGE |
1767 | || s->s3->send_alert[1] == DTLS1_AD_MISSING_HANDSHAKE_MESSAGE | 1693 | || s->s3->send_alert[1] == DTLS1_AD_MISSING_HANDSHAKE_MESSAGE |
1768 | #endif | 1694 | #endif |
1769 | ) | 1695 | ) |
1770 | (void)BIO_flush(s->wbio); | 1696 | (void)BIO_flush(s->wbio); |
1771 | 1697 | ||
1772 | if (s->msg_callback) | 1698 | if (s->msg_callback) |
1773 | s->msg_callback(1, s->version, SSL3_RT_ALERT, s->s3->send_alert, | 1699 | s->msg_callback(1, s->version, SSL3_RT_ALERT, |
1774 | 2, s, s->msg_callback_arg); | 1700 | s->s3->send_alert, 2, s, s->msg_callback_arg); |
1775 | 1701 | ||
1776 | if (s->info_callback != NULL) | 1702 | if (s->info_callback != NULL) |
1777 | cb=s->info_callback; | 1703 | cb = s->info_callback; |
1778 | else if (s->ctx->info_callback != NULL) | 1704 | else if (s->ctx->info_callback != NULL) |
1779 | cb=s->ctx->info_callback; | 1705 | cb = s->ctx->info_callback; |
1780 | 1706 | ||
1781 | if (cb != NULL) | 1707 | if (cb != NULL) { |
1782 | { | 1708 | j = (s->s3->send_alert[0]<<8)|s->s3->send_alert[1]; |
1783 | j=(s->s3->send_alert[0]<<8)|s->s3->send_alert[1]; | 1709 | cb(s, SSL_CB_WRITE_ALERT, j); |
1784 | cb(s,SSL_CB_WRITE_ALERT,j); | ||
1785 | } | ||
1786 | } | 1710 | } |
1787 | return(i); | ||
1788 | } | 1711 | } |
1712 | return (i); | ||
1713 | } | ||
1789 | 1714 | ||
1790 | 1715 | ||
1791 | static DTLS1_BITMAP * | 1716 | static DTLS1_BITMAP * |
1792 | dtls1_get_bitmap(SSL *s, SSL3_RECORD *rr, unsigned int *is_next_epoch) | 1717 | dtls1_get_bitmap(SSL *s, SSL3_RECORD *rr, unsigned int *is_next_epoch) |
1793 | { | 1718 | { |
1794 | 1719 | ||
1795 | *is_next_epoch = 0; | 1720 | *is_next_epoch = 0; |
1796 | 1721 | ||
1797 | /* In current epoch, accept HM, CCS, DATA, & ALERT */ | 1722 | /* In current epoch, accept HM, CCS, DATA, & ALERT */ |
1798 | if (rr->epoch == s->d1->r_epoch) | 1723 | if (rr->epoch == s->d1->r_epoch) |
1799 | return &s->d1->bitmap; | 1724 | return &s->d1->bitmap; |
1800 | 1725 | ||
1801 | /* Only HM and ALERT messages can be from the next epoch */ | 1726 | /* Only HM and ALERT messages can be from the next epoch */ |
1802 | else if (rr->epoch == (unsigned long)(s->d1->r_epoch + 1) && | 1727 | else if (rr->epoch == (unsigned long)(s->d1->r_epoch + 1) && |
1803 | (rr->type == SSL3_RT_HANDSHAKE || | 1728 | (rr->type == SSL3_RT_HANDSHAKE || rr->type == SSL3_RT_ALERT)) { |
1804 | rr->type == SSL3_RT_ALERT)) | 1729 | *is_next_epoch = 1; |
1805 | { | 1730 | return &s->d1->next_bitmap; |
1806 | *is_next_epoch = 1; | 1731 | } |
1807 | return &s->d1->next_bitmap; | 1732 | |
1808 | } | 1733 | return NULL; |
1809 | 1734 | } | |
1810 | return NULL; | ||
1811 | } | ||
1812 | 1735 | ||
1813 | #if 0 | 1736 | #if 0 |
1814 | static int | 1737 | static int |
1815 | dtls1_record_needs_buffering(SSL *s, SSL3_RECORD *rr, unsigned short *priority, | 1738 | dtls1_record_needs_buffering(SSL *s, SSL3_RECORD *rr, unsigned short *priority, |
1816 | unsigned long *offset) | 1739 | unsigned long *offset) |
1817 | { | 1740 | { |
1818 | 1741 | ||
1819 | /* alerts are passed up immediately */ | 1742 | /* alerts are passed up immediately */ |
1820 | if ( rr->type == SSL3_RT_APPLICATION_DATA || | 1743 | if (rr->type == SSL3_RT_APPLICATION_DATA || rr->type == SSL3_RT_ALERT) |
1821 | rr->type == SSL3_RT_ALERT) | ||
1822 | return 0; | 1744 | return 0; |
1823 | 1745 | ||
1824 | /* Only need to buffer if a handshake is underway. | 1746 | /* Only need to buffer if a handshake is underway. |
1825 | * (this implies that Hello Request and Client Hello are passed up | 1747 | * (this implies that Hello Request and Client Hello are passed up |
1826 | * immediately) */ | 1748 | * immediately) */ |
1827 | if ( SSL_in_init(s)) | 1749 | if (SSL_in_init(s)) { |
1828 | { | ||
1829 | unsigned char *data = rr->data; | 1750 | unsigned char *data = rr->data; |
1830 | /* need to extract the HM/CCS sequence number here */ | 1751 | /* need to extract the HM/CCS sequence number here */ |
1831 | if ( rr->type == SSL3_RT_HANDSHAKE || | 1752 | if (rr->type == SSL3_RT_HANDSHAKE || |
1832 | rr->type == SSL3_RT_CHANGE_CIPHER_SPEC) | 1753 | rr->type == SSL3_RT_CHANGE_CIPHER_SPEC) { |
1833 | { | ||
1834 | unsigned short seq_num; | 1754 | unsigned short seq_num; |
1835 | struct hm_header_st msg_hdr; | 1755 | struct hm_header_st msg_hdr; |
1836 | struct ccs_header_st ccs_hdr; | 1756 | struct ccs_header_st ccs_hdr; |
1837 | 1757 | ||
1838 | if ( rr->type == SSL3_RT_HANDSHAKE) | 1758 | if (rr->type == SSL3_RT_HANDSHAKE) { |
1839 | { | ||
1840 | dtls1_get_message_header(data, &msg_hdr); | 1759 | dtls1_get_message_header(data, &msg_hdr); |
1841 | seq_num = msg_hdr.seq; | 1760 | seq_num = msg_hdr.seq; |
1842 | *offset = msg_hdr.frag_off; | 1761 | *offset = msg_hdr.frag_off; |
1843 | } | 1762 | } else { |
1844 | else | ||
1845 | { | ||
1846 | dtls1_get_ccs_header(data, &ccs_hdr); | 1763 | dtls1_get_ccs_header(data, &ccs_hdr); |
1847 | seq_num = ccs_hdr.seq; | 1764 | seq_num = ccs_hdr.seq; |
1848 | *offset = 0; | 1765 | *offset = 0; |
1849 | } | 1766 | } |
1850 | 1767 | ||
1851 | /* this is either a record we're waiting for, or a | 1768 | /* this is either a record we're waiting for, or a |
1852 | * retransmit of something we happened to previously | 1769 | * retransmit of something we happened to previously |
1853 | * receive (higher layers will drop the repeat silently */ | 1770 | * receive (higher layers will drop the repeat silently */ |
1854 | if ( seq_num < s->d1->handshake_read_seq) | 1771 | if (seq_num < s->d1->handshake_read_seq) |
1855 | return 0; | 1772 | return 0; |
1856 | if (rr->type == SSL3_RT_HANDSHAKE && | 1773 | if (rr->type == SSL3_RT_HANDSHAKE && |
1857 | seq_num == s->d1->handshake_read_seq && | 1774 | seq_num == s->d1->handshake_read_seq && |
1858 | msg_hdr.frag_off < s->d1->r_msg_hdr.frag_off) | 1775 | msg_hdr.frag_off < s->d1->r_msg_hdr.frag_off) |
1859 | return 0; | 1776 | return 0; |
1860 | else if ( seq_num == s->d1->handshake_read_seq && | 1777 | else if (seq_num == s->d1->handshake_read_seq && |
1861 | (rr->type == SSL3_RT_CHANGE_CIPHER_SPEC || | 1778 | (rr->type == SSL3_RT_CHANGE_CIPHER_SPEC || |
1862 | msg_hdr.frag_off == s->d1->r_msg_hdr.frag_off)) | 1779 | msg_hdr.frag_off == s->d1->r_msg_hdr.frag_off)) |
1863 | return 0; | 1780 | return 0; |
1864 | else | 1781 | else { |
1865 | { | ||
1866 | *priority = seq_num; | 1782 | *priority = seq_num; |
1867 | return 1; | 1783 | return 1; |
1868 | } | ||
1869 | } | 1784 | } |
1785 | } | ||
1870 | else /* unknown record type */ | 1786 | else /* unknown record type */ |
1871 | return 0; | 1787 | return 0; |
1872 | } | 1788 | } |
1873 | 1789 | ||
1874 | return 0; | 1790 | return 0; |
1875 | } | 1791 | } |
1876 | #endif | 1792 | #endif |
1877 | 1793 | ||
1878 | void | 1794 | void |
1879 | dtls1_reset_seq_numbers(SSL *s, int rw) | 1795 | dtls1_reset_seq_numbers(SSL *s, int rw) |
1880 | { | 1796 | { |
1881 | unsigned char *seq; | 1797 | unsigned char *seq; |
1882 | unsigned int seq_bytes = sizeof(s->s3->read_sequence); | 1798 | unsigned int seq_bytes = sizeof(s->s3->read_sequence); |
1883 | 1799 | ||
1884 | if ( rw & SSL3_CC_READ) | 1800 | if (rw & SSL3_CC_READ) { |
1885 | { | ||
1886 | seq = s->s3->read_sequence; | 1801 | seq = s->s3->read_sequence; |
1887 | s->d1->r_epoch++; | 1802 | s->d1->r_epoch++; |
1888 | memcpy(&(s->d1->bitmap), &(s->d1->next_bitmap), sizeof(DTLS1_BITMAP)); | 1803 | memcpy(&(s->d1->bitmap), &(s->d1->next_bitmap), sizeof(DTLS1_BITMAP)); |
1889 | memset(&(s->d1->next_bitmap), 0x00, sizeof(DTLS1_BITMAP)); | 1804 | memset(&(s->d1->next_bitmap), 0x00, sizeof(DTLS1_BITMAP)); |
1890 | } | 1805 | } else { |
1891 | else | ||
1892 | { | ||
1893 | seq = s->s3->write_sequence; | 1806 | seq = s->s3->write_sequence; |
1894 | memcpy(s->d1->last_write_sequence, seq, sizeof(s->s3->write_sequence)); | 1807 | memcpy(s->d1->last_write_sequence, seq, sizeof(s->s3->write_sequence)); |
1895 | s->d1->w_epoch++; | 1808 | s->d1->w_epoch++; |
1896 | } | 1809 | } |
1897 | 1810 | ||
1898 | memset(seq, 0x00, seq_bytes); | 1811 | memset(seq, 0x00, seq_bytes); |
1899 | } | 1812 | } |