mirror of
https://github.com/wolfSSL/wolfssl.git
synced 2025-08-02 12:14:38 +02:00
Merge branch 'master' of git://github.com/JonasNorling/cyassl into JonasNorling-master
This commit is contained in:
@@ -1844,6 +1844,19 @@ int DtlsPoolSend(CYASSL* ssl)
|
|||||||
int sendResult;
|
int sendResult;
|
||||||
buffer* buf = &pool->buf[i];
|
buffer* buf = &pool->buf[i];
|
||||||
|
|
||||||
|
DtlsRecordLayerHeader* dtls = (DtlsRecordLayerHeader*)buf->buffer;
|
||||||
|
|
||||||
|
word16 message_epoch;
|
||||||
|
ato16(dtls->epoch, &message_epoch);
|
||||||
|
if (message_epoch == ssl->keys.dtls_epoch) {
|
||||||
|
/* Increment record sequence number on retransmitted handshake messages */
|
||||||
|
c32to48(ssl->keys.dtls_sequence_number, dtls->sequence_number);
|
||||||
|
ssl->keys.dtls_sequence_number++;
|
||||||
|
}
|
||||||
|
else {
|
||||||
|
/* The Finished message is sent with the next epoch, keep its sequence number */
|
||||||
|
}
|
||||||
|
|
||||||
if ((ret = CheckAvailableSize(ssl, buf->length)) != 0)
|
if ((ret = CheckAvailableSize(ssl, buf->length)) != 0)
|
||||||
return ret;
|
return ret;
|
||||||
|
|
||||||
@@ -3339,13 +3352,29 @@ int DoFinished(CYASSL* ssl, const byte* input, word32* inOutIdx, int sniff)
|
|||||||
|
|
||||||
if (ssl->options.side == CLIENT_END) {
|
if (ssl->options.side == CLIENT_END) {
|
||||||
ssl->options.serverState = SERVER_FINISHED_COMPLETE;
|
ssl->options.serverState = SERVER_FINISHED_COMPLETE;
|
||||||
if (!ssl->options.resuming)
|
if (!ssl->options.resuming) {
|
||||||
ssl->options.handShakeState = HANDSHAKE_DONE;
|
ssl->options.handShakeState = HANDSHAKE_DONE;
|
||||||
|
#ifdef CYASSL_DTLS
|
||||||
|
if (ssl->options.dtls) {
|
||||||
|
/* Other side has received our Finished, go to next epoch */
|
||||||
|
ssl->keys.dtls_epoch++;
|
||||||
|
ssl->keys.dtls_sequence_number = 1;
|
||||||
|
}
|
||||||
|
#endif
|
||||||
|
}
|
||||||
}
|
}
|
||||||
else {
|
else {
|
||||||
ssl->options.clientState = CLIENT_FINISHED_COMPLETE;
|
ssl->options.clientState = CLIENT_FINISHED_COMPLETE;
|
||||||
if (ssl->options.resuming)
|
if (ssl->options.resuming) {
|
||||||
ssl->options.handShakeState = HANDSHAKE_DONE;
|
ssl->options.handShakeState = HANDSHAKE_DONE;
|
||||||
|
#ifdef CYASSL_DTLS
|
||||||
|
if (ssl->options.dtls) {
|
||||||
|
/* Other side has received our Finished, go to next epoch */
|
||||||
|
ssl->keys.dtls_epoch++;
|
||||||
|
ssl->keys.dtls_sequence_number = 1;
|
||||||
|
}
|
||||||
|
#endif
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
*inOutIdx = idx;
|
*inOutIdx = idx;
|
||||||
@@ -5016,17 +5045,21 @@ int SendFinished(CYASSL* ssl)
|
|||||||
int headerSz = HANDSHAKE_HEADER_SZ;
|
int headerSz = HANDSHAKE_HEADER_SZ;
|
||||||
|
|
||||||
|
|
||||||
|
/* check for available size */
|
||||||
|
if ((ret = CheckAvailableSize(ssl, sizeof(input) + MAX_MSG_EXTRA)) != 0)
|
||||||
|
return ret;
|
||||||
|
|
||||||
#ifdef CYASSL_DTLS
|
#ifdef CYASSL_DTLS
|
||||||
|
word32 sequence_number = ssl->keys.dtls_sequence_number;
|
||||||
|
word16 epoch = ssl->keys.dtls_epoch;
|
||||||
if (ssl->options.dtls) {
|
if (ssl->options.dtls) {
|
||||||
|
/* Send Finished message with the next epoch, but don't commit that change
|
||||||
|
* until the other end confirms its reception. */
|
||||||
headerSz += DTLS_HANDSHAKE_EXTRA;
|
headerSz += DTLS_HANDSHAKE_EXTRA;
|
||||||
ssl->keys.dtls_epoch++;
|
ssl->keys.dtls_epoch++;
|
||||||
ssl->keys.dtls_sequence_number = 0; /* reset after epoch change */
|
ssl->keys.dtls_sequence_number = 0; /* reset after epoch change */
|
||||||
}
|
}
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
/* check for available size */
|
|
||||||
if ((ret = CheckAvailableSize(ssl, sizeof(input) + MAX_MSG_EXTRA)) != 0)
|
|
||||||
return ret;
|
|
||||||
|
|
||||||
/* get ouput buffer */
|
/* get ouput buffer */
|
||||||
output = ssl->buffers.outputBuffer.buffer +
|
output = ssl->buffers.outputBuffer.buffer +
|
||||||
@@ -5039,24 +5072,50 @@ int SendFinished(CYASSL* ssl)
|
|||||||
BuildFinished(ssl, hashes, ssl->options.side == CLIENT_END ? client :
|
BuildFinished(ssl, hashes, ssl->options.side == CLIENT_END ? client :
|
||||||
server);
|
server);
|
||||||
|
|
||||||
if ( (sendSz = BuildMessage(ssl, output, input, headerSz +
|
sendSz = BuildMessage(ssl, output, input, headerSz + finishedSz, handshake);
|
||||||
finishedSz, handshake)) < 0)
|
|
||||||
|
#ifdef CYASSL_DTLS
|
||||||
|
if (ssl->options.dtls) {
|
||||||
|
ssl->keys.dtls_epoch = epoch;
|
||||||
|
ssl->keys.dtls_sequence_number = sequence_number;
|
||||||
|
}
|
||||||
|
#endif
|
||||||
|
|
||||||
|
if (sendSz < 0)
|
||||||
return BUILD_MSG_ERROR;
|
return BUILD_MSG_ERROR;
|
||||||
|
|
||||||
if (!ssl->options.resuming) {
|
if (!ssl->options.resuming) {
|
||||||
#ifndef NO_SESSION_CACHE
|
#ifndef NO_SESSION_CACHE
|
||||||
AddSession(ssl); /* just try */
|
AddSession(ssl); /* just try */
|
||||||
#endif
|
#endif
|
||||||
if (ssl->options.side == CLIENT_END)
|
if (ssl->options.side == CLIENT_END) {
|
||||||
BuildFinished(ssl, &ssl->verifyHashes, server);
|
BuildFinished(ssl, &ssl->verifyHashes, server);
|
||||||
else
|
}
|
||||||
|
else {
|
||||||
ssl->options.handShakeState = HANDSHAKE_DONE;
|
ssl->options.handShakeState = HANDSHAKE_DONE;
|
||||||
|
#ifdef CYASSL_DTLS
|
||||||
|
if (ssl->options.dtls) {
|
||||||
|
/* Other side will soon receive our Finished, go to next epoch. */
|
||||||
|
ssl->keys.dtls_epoch++;
|
||||||
|
ssl->keys.dtls_sequence_number = 1;
|
||||||
|
}
|
||||||
|
#endif
|
||||||
|
}
|
||||||
}
|
}
|
||||||
else {
|
else {
|
||||||
if (ssl->options.side == CLIENT_END)
|
if (ssl->options.side == CLIENT_END) {
|
||||||
ssl->options.handShakeState = HANDSHAKE_DONE;
|
ssl->options.handShakeState = HANDSHAKE_DONE;
|
||||||
else
|
#ifdef CYASSL_DTLS
|
||||||
|
if (ssl->options.dtls) {
|
||||||
|
/* Other side will soon receive our Finished, go to next epoch. */
|
||||||
|
ssl->keys.dtls_epoch++;
|
||||||
|
ssl->keys.dtls_sequence_number = 1;
|
||||||
|
}
|
||||||
|
#endif
|
||||||
|
}
|
||||||
|
else {
|
||||||
BuildFinished(ssl, &ssl->verifyHashes, client);
|
BuildFinished(ssl, &ssl->verifyHashes, client);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
#ifdef CYASSL_DTLS
|
#ifdef CYASSL_DTLS
|
||||||
if (ssl->options.dtls) {
|
if (ssl->options.dtls) {
|
||||||
|
Reference in New Issue
Block a user