comparison packet.c @ 528:378a6389f88e

- Don't be dumb and encrypt/decrypt in a while() loop - why did I do this??
author Matt Johnston <matt@ucc.asn.au>
date Wed, 25 Feb 2009 14:04:02 +0000
parents a3748e54273c
children 22a0d8355c2c
comparison
equal deleted inserted replaced
521:cc2dff9bd671 528:378a6389f88e
238 buf_resize(ses.decryptreadbuf, ses.readbuf->len - macsize); 238 buf_resize(ses.decryptreadbuf, ses.readbuf->len - macsize);
239 buf_setlen(ses.decryptreadbuf, ses.decryptreadbuf->size); 239 buf_setlen(ses.decryptreadbuf, ses.decryptreadbuf->size);
240 buf_setpos(ses.decryptreadbuf, blocksize); 240 buf_setpos(ses.decryptreadbuf, blocksize);
241 241
242 /* decrypt it */ 242 /* decrypt it */
243 while (ses.readbuf->pos < ses.readbuf->len - macsize) { 243 len = ses.readbuf->len - macsize - ses.readbuf->pos;
244 if (ses.keys->recv_crypt_mode->decrypt( 244 if (ses.keys->recv_crypt_mode->decrypt(
245 buf_getptr(ses.readbuf, blocksize), 245 buf_getptr(ses.readbuf, len),
246 buf_getwriteptr(ses.decryptreadbuf, blocksize), 246 buf_getwriteptr(ses.decryptreadbuf, len),
247 blocksize, 247 len,
248 &ses.keys->recv_cipher_state) != CRYPT_OK) { 248 &ses.keys->recv_cipher_state) != CRYPT_OK) {
249 dropbear_exit("error decrypting"); 249 dropbear_exit("error decrypting");
250 } 250 }
251 buf_incrpos(ses.readbuf, blocksize); 251 buf_incrpos(ses.readbuf, len);
252 buf_incrwritepos(ses.decryptreadbuf, blocksize); 252 buf_incrwritepos(ses.decryptreadbuf, len);
253 }
254 253
255 /* check the hmac */ 254 /* check the hmac */
256 buf_setpos(ses.readbuf, ses.readbuf->len - macsize); 255 buf_setpos(ses.readbuf, ses.readbuf->len - macsize);
257 if (checkmac(ses.readbuf, ses.decryptreadbuf) != DROPBEAR_SUCCESS) { 256 if (checkmac(ses.readbuf, ses.decryptreadbuf) != DROPBEAR_SUCCESS) {
258 dropbear_exit("Integrity error"); 257 dropbear_exit("Integrity error");
452 unsigned char padlen; 451 unsigned char padlen;
453 unsigned char blocksize, macsize; 452 unsigned char blocksize, macsize;
454 buffer * writebuf; /* the packet which will go on the wire */ 453 buffer * writebuf; /* the packet which will go on the wire */
455 buffer * clearwritebuf; /* unencrypted, possibly compressed */ 454 buffer * clearwritebuf; /* unencrypted, possibly compressed */
456 unsigned char type; 455 unsigned char type;
457 unsigned int clear_len; 456 unsigned int len;
458 457
459 type = ses.writepayload->data[0]; 458 type = ses.writepayload->data[0];
460 TRACE(("enter encrypt_packet()")) 459 TRACE(("enter encrypt_packet()"))
461 TRACE(("encrypt_packet type is %d", type)) 460 TRACE(("encrypt_packet type is %d", type))
462 461
472 macsize = ses.keys->trans_algo_mac->hashsize; 471 macsize = ses.keys->trans_algo_mac->hashsize;
473 472
474 /* Encrypted packet len is payload+5, then worst case is if we are 3 away 473 /* Encrypted packet len is payload+5, then worst case is if we are 3 away
475 * from a blocksize multiple. In which case we need to pad to the 474 * from a blocksize multiple. In which case we need to pad to the
476 * multiple, then add another blocksize (or MIN_PACKET_LEN) */ 475 * multiple, then add another blocksize (or MIN_PACKET_LEN) */
477 clear_len = (ses.writepayload->len+4+1) + MIN_PACKET_LEN + 3; 476 len = (ses.writepayload->len+4+1) + MIN_PACKET_LEN + 3;
478 477
479 #ifndef DISABLE_ZLIB 478 #ifndef DISABLE_ZLIB
480 clear_len += ZLIB_COMPRESS_INCR; /* bit of a kludge, but we can't know len*/ 479 len += ZLIB_COMPRESS_INCR; /* bit of a kludge, but we can't know len*/
481 #endif 480 #endif
482 clearwritebuf = buf_new(clear_len); 481 clearwritebuf = buf_new(len);
483 buf_setlen(clearwritebuf, PACKET_PAYLOAD_OFF); 482 buf_setlen(clearwritebuf, PACKET_PAYLOAD_OFF);
484 buf_setpos(clearwritebuf, PACKET_PAYLOAD_OFF); 483 buf_setpos(clearwritebuf, PACKET_PAYLOAD_OFF);
485 484
486 buf_setpos(ses.writepayload, 0); 485 buf_setpos(ses.writepayload, 0);
487 486
529 /* create a new writebuffer, this is freed when it has been put on the 528 /* create a new writebuffer, this is freed when it has been put on the
530 * wire by writepacket() */ 529 * wire by writepacket() */
531 writebuf = buf_new(clearwritebuf->len + macsize); 530 writebuf = buf_new(clearwritebuf->len + macsize);
532 531
533 /* encrypt it */ 532 /* encrypt it */
534 while (clearwritebuf->pos < clearwritebuf->len) { 533 len = clearwritebuf->len;
535 if (ses.keys->trans_crypt_mode->encrypt( 534 if (ses.keys->trans_crypt_mode->encrypt(
536 buf_getptr(clearwritebuf, blocksize), 535 buf_getptr(clearwritebuf, len),
537 buf_getwriteptr(writebuf, blocksize), 536 buf_getwriteptr(writebuf, len),
538 blocksize, 537 len,
539 &ses.keys->trans_cipher_state) != CRYPT_OK) { 538 &ses.keys->trans_cipher_state) != CRYPT_OK) {
540 dropbear_exit("error encrypting"); 539 dropbear_exit("error encrypting");
541 } 540 }
542 buf_incrpos(clearwritebuf, blocksize); 541 buf_incrpos(clearwritebuf, len);
543 buf_incrwritepos(writebuf, blocksize); 542 buf_incrwritepos(writebuf, len);
544 }
545 543
546 /* now add a hmac and we're done */ 544 /* now add a hmac and we're done */
547 writemac(writebuf, clearwritebuf); 545 writemac(writebuf, clearwritebuf);
548 546
549 /* clearwritebuf is finished with */ 547 /* clearwritebuf is finished with */