DTLS Window Update: fixes and changes

This commit is contained in:
John Safranek
2016-11-22 10:12:18 -08:00
parent ec6fec452d
commit 2d9d3aeb91
2 changed files with 30 additions and 13 deletions

View File

@@ -567,13 +567,15 @@ static int ExportKeyState(WOLFSSL* ssl, byte* exp, word32 len, byte ver)
exp[idx++] = keys->encryptionOn; exp[idx++] = keys->encryptionOn;
exp[idx++] = keys->decryptedCur; exp[idx++] = keys->decryptedCur;
c16toa(WOLFSSL_DTLS_WINDOW_WORDS, exp + idx); idx += OPAQUE16_LEN;
{ {
word32 i; word32 i;
c16toa(WOLFSSL_DTLS_WINDOW_WORDS, exp + idx); idx += OPAQUE16_LEN;
for (i = 0; i < WOLFSSL_DTLS_WINDOW_WORDS; i++) { for (i = 0; i < WOLFSSL_DTLS_WINDOW_WORDS; i++) {
c32toa(keys->window[i], exp + idx); c32toa(keys->window[i], exp + idx);
idx += OPAQUE32_LEN; idx += OPAQUE32_LEN;
} }
c16toa(WOLFSSL_DTLS_WINDOW_WORDS, exp + idx); idx += OPAQUE16_LEN;
for (i = 0; i < WOLFSSL_DTLS_WINDOW_WORDS; i++) { for (i = 0; i < WOLFSSL_DTLS_WINDOW_WORDS; i++) {
c32toa(keys->prevWindow[i], exp + idx); c32toa(keys->prevWindow[i], exp + idx);
idx += OPAQUE32_LEN; idx += OPAQUE32_LEN;
@@ -704,26 +706,40 @@ static int ImportKeyState(WOLFSSL* ssl, byte* exp, word32 len, byte ver)
keys->decryptedCur = exp[idx++]; keys->decryptedCur = exp[idx++];
{ {
word16 windowSz, i, adj = 0; word16 i, wordCount, wordAdj = 0;
ato16(exp + idx, &windowSz); /* do window */
ato16(exp + idx, &wordCount);
idx += OPAQUE16_LEN; idx += OPAQUE16_LEN;
if (windowSz > WOLFSSL_DTLS_WINDOW_WORDS) { if (wordCount > WOLFSSL_DTLS_WINDOW_WORDS) {
adj = WOLFSSL_DTLS_WINDOW_WORDS - windowSz; wordCount = WOLFSSL_DTLS_WINDOW_WORDS;
windowSz = WOLFSSL_DTLS_WINDOW_WORDS; wordAdj = (WOLFSSL_DTLS_WINDOW_WORDS - wordCount) * sizeof(word32);
} }
for (i = 0; i < windowSz; i++) { XMEMSET(keys->window, 0xFF, DTLS_SEQ_SZ);
for (i = 0; i < wordCount; i++) {
ato32(exp + idx, &keys->window[i]); ato32(exp + idx, &keys->window[i]);
idx += OPAQUE32_LEN; idx += OPAQUE32_LEN;
} }
idx += adj; idx += wordAdj;
for (i = 0; i < windowSz; i++) {
/* do prevWindow */
ato16(exp + idx, &wordCount);
idx += OPAQUE16_LEN;
if (wordCount > WOLFSSL_DTLS_WINDOW_WORDS) {
wordCount = WOLFSSL_DTLS_WINDOW_WORDS;
wordAdj = (WOLFSSL_DTLS_WINDOW_WORDS - wordCount) * sizeof(word32);
}
XMEMSET(keys->prevWindow, 0xFF, DTLS_SEQ_SZ);
for (i = 0; i < wordCount; i++) {
ato32(exp + idx, &keys->prevWindow[i]); ato32(exp + idx, &keys->prevWindow[i]);
idx += OPAQUE32_LEN; idx += OPAQUE32_LEN;
} }
idx += adj; idx += wordAdj;
} }
#ifdef HAVE_TRUNCATED_HMAC #ifdef HAVE_TRUNCATED_HMAC
@@ -7919,7 +7935,8 @@ static INLINE int DtlsUpdateWindow(WOLFSSL* ssl)
word32 idx = diff / DTLS_WORD_BITS; word32 idx = diff / DTLS_WORD_BITS;
word32 newDiff = diff % DTLS_WORD_BITS; word32 newDiff = diff % DTLS_WORD_BITS;
window[idx] |= (1 << (newDiff - 1)); if (idx < WOLFSSL_DTLS_WINDOW_WORDS)
window[idx] |= (1 << (newDiff - 1));
} }
else { else {
if (diff >= DTLS_SEQ_BITS) if (diff >= DTLS_SEQ_BITS)

View File

@@ -970,9 +970,9 @@ enum Misc {
DTLS_EXPORT_PRO = 165,/* wolfSSL protocol for serialized session */ DTLS_EXPORT_PRO = 165,/* wolfSSL protocol for serialized session */
DTLS_EXPORT_VERSION = 3, /* wolfSSL version for serialized session */ DTLS_EXPORT_VERSION = 3, /* wolfSSL version for serialized session */
DTLS_EXPORT_OPT_SZ = 57, /* amount of bytes used from Options */ DTLS_EXPORT_OPT_SZ = 57, /* amount of bytes used from Options */
DTLS_EXPORT_KEY_SZ = 323 + (DTLS_SEQ_SZ * 2), DTLS_EXPORT_KEY_SZ = 325 + (DTLS_SEQ_SZ * 2),
/* max amount of bytes used from Keys */ /* max amount of bytes used from Keys */
DTLS_EXPORT_MIN_KEY_SZ = 76 + (DTLS_SEQ_SZ * 2), DTLS_EXPORT_MIN_KEY_SZ = 78 + (DTLS_SEQ_SZ * 2),
/* min amount of bytes used from Keys */ /* min amount of bytes used from Keys */
DTLS_EXPORT_SPC_SZ = 16, /* amount of bytes used from CipherSpecs */ DTLS_EXPORT_SPC_SZ = 16, /* amount of bytes used from CipherSpecs */
DTLS_EXPORT_LEN = 2, /* 2 bytes for length and protocol */ DTLS_EXPORT_LEN = 2, /* 2 bytes for length and protocol */