Correctly estimate the initial MTU for legacy packets.

This commit is contained in:
Guus Sliepen 2015-01-10 23:00:51 +01:00
parent 0e65326047
commit 0209f12d27
3 changed files with 27 additions and 0 deletions

View file

@ -33,6 +33,7 @@ extern cipher_t *cipher_open_by_nid(int) __attribute__ ((__malloc__));
extern cipher_t *cipher_open_blowfish_ofb(void) __attribute__ ((__malloc__));
extern void cipher_close(cipher_t *);
extern size_t cipher_keylength(const cipher_t *);
extern size_t cipher_blocksize(const cipher_t *);
extern void cipher_get_key(const cipher_t *, void *);
extern bool cipher_set_key(cipher_t *, void *, bool) __attribute__ ((__warn_unused_result__));
extern bool cipher_set_key_from_rsa(cipher_t *, void *, size_t, bool) __attribute__ ((__warn_unused_result__));

View file

@ -929,6 +929,25 @@ static length_t choose_initial_maxmtu(node_t *n) {
mtu -= SPTPS_DATAGRAM_OVERHEAD;
if((n->options >> 24) >= 4)
mtu -= sizeof(node_id_t) + sizeof(node_id_t);
} else {
mtu -= digest_length(n->outdigest);
/* Now it's tricky. We use CBC mode, so the length of the
encrypted payload must be a multiple of the blocksize. The
sequence number is also part of the encrypted payload, so we
must account for it after correcting for the blocksize.
Furthermore, the padding in the last block must be at least
1 byte. */
length_t blocksize = cipher_blocksize(n->outcipher);
if(blocksize > 1) {
mtu /= blocksize;
mtu *= blocksize;
mtu--;
}
mtu -= 4; // seqno
}
if (mtu < 512) {

View file

@ -79,6 +79,13 @@ size_t cipher_keylength(const cipher_t *cipher) {
return cipher->cipher->key_len + cipher->cipher->iv_len;
}
size_t cipher_blocksize(const cipher_t *cipher) {
if(!cipher || !cipher->cipher)
return 1;
return cipher->cipher->block_size;
}
bool cipher_set_key(cipher_t *cipher, void *key, bool encrypt) {
bool result;