forked from wolfSSL/wolfssl
DTLS Window Update: fixes and changes
This commit is contained in:
@@ -567,13 +567,15 @@ static int ExportKeyState(WOLFSSL* ssl, byte* exp, word32 len, byte ver)
|
||||
exp[idx++] = keys->encryptionOn;
|
||||
exp[idx++] = keys->decryptedCur;
|
||||
|
||||
c16toa(WOLFSSL_DTLS_WINDOW_WORDS, exp + idx); idx += OPAQUE16_LEN;
|
||||
{
|
||||
word32 i;
|
||||
|
||||
c16toa(WOLFSSL_DTLS_WINDOW_WORDS, exp + idx); idx += OPAQUE16_LEN;
|
||||
for (i = 0; i < WOLFSSL_DTLS_WINDOW_WORDS; i++) {
|
||||
c32toa(keys->window[i], exp + idx);
|
||||
idx += OPAQUE32_LEN;
|
||||
}
|
||||
c16toa(WOLFSSL_DTLS_WINDOW_WORDS, exp + idx); idx += OPAQUE16_LEN;
|
||||
for (i = 0; i < WOLFSSL_DTLS_WINDOW_WORDS; i++) {
|
||||
c32toa(keys->prevWindow[i], exp + idx);
|
||||
idx += OPAQUE32_LEN;
|
||||
@@ -704,26 +706,40 @@ static int ImportKeyState(WOLFSSL* ssl, byte* exp, word32 len, byte ver)
|
||||
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;
|
||||
|
||||
if (windowSz > WOLFSSL_DTLS_WINDOW_WORDS) {
|
||||
adj = WOLFSSL_DTLS_WINDOW_WORDS - windowSz;
|
||||
windowSz = WOLFSSL_DTLS_WINDOW_WORDS;
|
||||
if (wordCount > WOLFSSL_DTLS_WINDOW_WORDS) {
|
||||
wordCount = 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]);
|
||||
idx += OPAQUE32_LEN;
|
||||
}
|
||||
idx += adj;
|
||||
for (i = 0; i < windowSz; i++) {
|
||||
idx += wordAdj;
|
||||
|
||||
/* 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]);
|
||||
idx += OPAQUE32_LEN;
|
||||
}
|
||||
idx += adj;
|
||||
idx += wordAdj;
|
||||
|
||||
}
|
||||
|
||||
#ifdef HAVE_TRUNCATED_HMAC
|
||||
@@ -7919,7 +7935,8 @@ static INLINE int DtlsUpdateWindow(WOLFSSL* ssl)
|
||||
word32 idx = 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 {
|
||||
if (diff >= DTLS_SEQ_BITS)
|
||||
|
@@ -970,9 +970,9 @@ enum Misc {
|
||||
DTLS_EXPORT_PRO = 165,/* wolfSSL protocol 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_KEY_SZ = 323 + (DTLS_SEQ_SZ * 2),
|
||||
DTLS_EXPORT_KEY_SZ = 325 + (DTLS_SEQ_SZ * 2),
|
||||
/* 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 */
|
||||
DTLS_EXPORT_SPC_SZ = 16, /* amount of bytes used from CipherSpecs */
|
||||
DTLS_EXPORT_LEN = 2, /* 2 bytes for length and protocol */
|
||||
|
Reference in New Issue
Block a user