61
61
len = writebuf->len - writebuf->pos;
62
62
dropbear_assert(len > 0);
63
63
/* Try to write as much as possible */
64
written = write(ses.sock, buf_getptr(writebuf, len), len);
64
written = write(ses.sock_out, buf_getptr(writebuf, len), len);
67
67
if (errno == EINTR) {
122
123
* mightn't be any available (EAGAIN) */
123
124
dropbear_assert(ses.readbuf != NULL);
124
125
maxlen = ses.readbuf->len - ses.readbuf->pos;
125
len = read(ses.sock, buf_getptr(ses.readbuf, maxlen), maxlen);
126
len = read(ses.sock_in, buf_getptr(ses.readbuf, maxlen), maxlen);
128
129
ses.remoteclosed();
171
172
maxlen = blocksize - ses.readbuf->pos;
173
174
/* read the rest of the packet if possible */
174
len = read(ses.sock, buf_getwriteptr(ses.readbuf, maxlen),
175
len = read(ses.sock_in, buf_getwriteptr(ses.readbuf, maxlen),
177
178
ses.remoteclosed();
194
195
/* now we have the first block, need to get packet length, so we decrypt
195
196
* the first block (only need first 4 bytes) */
196
197
buf_setpos(ses.readbuf, 0);
197
if (ses.keys->recv_algo_crypt->cipherdesc == NULL) {
199
memcpy(buf_getwriteptr(ses.decryptreadbuf, blocksize),
200
buf_getptr(ses.readbuf, blocksize),
204
if (cbc_decrypt(buf_getptr(ses.readbuf, blocksize),
205
buf_getwriteptr(ses.decryptreadbuf,blocksize),
207
&ses.keys->recv_symmetric_struct) != CRYPT_OK) {
208
dropbear_exit("error decrypting");
198
if (ses.keys->recv_crypt_mode->decrypt(buf_getptr(ses.readbuf, blocksize),
199
buf_getwriteptr(ses.decryptreadbuf,blocksize),
201
&ses.keys->recv_cipher_state) != CRYPT_OK) {
202
dropbear_exit("error decrypting");
211
204
buf_setlen(ses.decryptreadbuf, blocksize);
212
205
len = buf_getint(ses.decryptreadbuf) + 4 + macsize;
246
239
buf_setlen(ses.decryptreadbuf, ses.decryptreadbuf->size);
247
240
buf_setpos(ses.decryptreadbuf, blocksize);
249
/* decrypt if encryption is set, memcpy otherwise */
250
if (ses.keys->recv_algo_crypt->cipherdesc == NULL) {
252
len = ses.readbuf->len - macsize - blocksize;
253
memcpy(buf_getwriteptr(ses.decryptreadbuf, len),
254
buf_getptr(ses.readbuf, len), len);
257
while (ses.readbuf->pos < ses.readbuf->len - macsize) {
258
if (cbc_decrypt(buf_getptr(ses.readbuf, blocksize),
259
buf_getwriteptr(ses.decryptreadbuf, blocksize),
261
&ses.keys->recv_symmetric_struct) != CRYPT_OK) {
262
dropbear_exit("error decrypting");
264
buf_incrpos(ses.readbuf, blocksize);
265
buf_incrwritepos(ses.decryptreadbuf, blocksize);
243
while (ses.readbuf->pos < ses.readbuf->len - macsize) {
244
if (ses.keys->recv_crypt_mode->decrypt(
245
buf_getptr(ses.readbuf, blocksize),
246
buf_getwriteptr(ses.decryptreadbuf, blocksize),
248
&ses.keys->recv_cipher_state) != CRYPT_OK) {
249
dropbear_exit("error decrypting");
251
buf_incrpos(ses.readbuf, blocksize);
252
buf_incrwritepos(ses.decryptreadbuf, blocksize);
269
255
/* check the hmac */
290
276
buf_setpos(ses.decryptreadbuf, PACKET_PAYLOAD_OFF);
292
278
#ifndef DISABLE_ZLIB
293
if (ses.keys->recv_algo_comp == DROPBEAR_COMP_ZLIB) {
279
if (is_compress_recv()) {
295
281
ses.payload = buf_decompress(ses.decryptreadbuf, len);
469
454
buffer * writebuf; /* the packet which will go on the wire */
470
455
buffer * clearwritebuf; /* unencrypted, possibly compressed */
471
456
unsigned char type;
457
unsigned int clear_len;
473
459
type = ses.writepayload->data[0];
474
460
TRACE(("enter encrypt_packet()"))
488
474
/* Encrypted packet len is payload+5, then worst case is if we are 3 away
489
475
* from a blocksize multiple. In which case we need to pad to the
490
476
* multiple, then add another blocksize (or MIN_PACKET_LEN) */
491
clearwritebuf = buf_new((ses.writepayload->len+4+1) + MIN_PACKET_LEN + 3
477
clear_len = (ses.writepayload->len+4+1) + MIN_PACKET_LEN + 3;
492
479
#ifndef DISABLE_ZLIB
493
+ ZLIB_COMPRESS_INCR /* bit of a kludge, but we can't know len*/
480
clear_len += ZLIB_COMPRESS_INCR; /* bit of a kludge, but we can't know len*/
482
clearwritebuf = buf_new(clear_len);
496
483
buf_setlen(clearwritebuf, PACKET_PAYLOAD_OFF);
497
484
buf_setpos(clearwritebuf, PACKET_PAYLOAD_OFF);
543
530
* wire by writepacket() */
544
531
writebuf = buf_new(clearwritebuf->len + macsize);
546
if (ses.keys->trans_algo_crypt->cipherdesc == NULL) {
548
memcpy(buf_getwriteptr(writebuf, clearwritebuf->len),
549
buf_getptr(clearwritebuf, clearwritebuf->len),
551
buf_incrwritepos(writebuf, clearwritebuf->len);
554
while (clearwritebuf->pos < clearwritebuf->len) {
555
if (cbc_encrypt(buf_getptr(clearwritebuf, blocksize),
556
buf_getwriteptr(writebuf, blocksize),
558
&ses.keys->trans_symmetric_struct) != CRYPT_OK) {
559
dropbear_exit("error encrypting");
561
buf_incrpos(clearwritebuf, blocksize);
562
buf_incrwritepos(writebuf, blocksize);
534
while (clearwritebuf->pos < clearwritebuf->len) {
535
if (ses.keys->trans_crypt_mode->encrypt(
536
buf_getptr(clearwritebuf, blocksize),
537
buf_getwriteptr(writebuf, blocksize),
539
&ses.keys->trans_cipher_state) != CRYPT_OK) {
540
dropbear_exit("error encrypting");
542
buf_incrpos(clearwritebuf, blocksize);
543
buf_incrwritepos(writebuf, blocksize);
566
546
/* now add a hmac and we're done */