Correctly estimate the initial MTU for legacy packets.
This commit is contained in:
parent
0e65326047
commit
0209f12d27
3 changed files with 27 additions and 0 deletions
src
|
@ -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 cipher_t *cipher_open_blowfish_ofb(void) __attribute__ ((__malloc__));
|
||||||
extern void cipher_close(cipher_t *);
|
extern void cipher_close(cipher_t *);
|
||||||
extern size_t cipher_keylength(const 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 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(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__));
|
extern bool cipher_set_key_from_rsa(cipher_t *, void *, size_t, bool) __attribute__ ((__warn_unused_result__));
|
||||||
|
|
|
@ -929,6 +929,25 @@ static length_t choose_initial_maxmtu(node_t *n) {
|
||||||
mtu -= SPTPS_DATAGRAM_OVERHEAD;
|
mtu -= SPTPS_DATAGRAM_OVERHEAD;
|
||||||
if((n->options >> 24) >= 4)
|
if((n->options >> 24) >= 4)
|
||||||
mtu -= sizeof(node_id_t) + sizeof(node_id_t);
|
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) {
|
if (mtu < 512) {
|
||||||
|
|
|
@ -79,6 +79,13 @@ size_t cipher_keylength(const cipher_t *cipher) {
|
||||||
return cipher->cipher->key_len + cipher->cipher->iv_len;
|
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 cipher_set_key(cipher_t *cipher, void *key, bool encrypt) {
|
||||||
bool result;
|
bool result;
|
||||||
|
|
||||||
|
|
Loading…
Add table
Reference in a new issue