@@ -504,11 +504,6 @@ typedef struct KeyShareInfo {
504504 int curve_id ;
505505} KeyShareInfo ;
506506
507- /* maximum previous acks to capture */
508- #ifndef WC_SNIFFER_HS_ACK_HIST_MAX
509- #define WC_SNIFFER_HS_ACK_HIST_MAX 10
510- #endif
511-
512507/* Sniffer Session holds info for each client/server SSL/TLS session */
513508typedef struct SnifferSession {
514509 SnifferServer * context ; /* server context */
@@ -520,10 +515,10 @@ typedef struct SnifferSession {
520515 word16 cliPort ; /* client port */
521516 word32 cliSeqStart ; /* client start sequence */
522517 word32 srvSeqStart ; /* server start sequence */
518+ word32 cliSeqLast ; /* client last sequence */
519+ word32 srvSeqLast ; /* server last sequence */
523520 word32 cliExpected ; /* client expected sequence (relative) */
524521 word32 srvExpected ; /* server expected sequence (relative) */
525- word32 cliAcks [WC_SNIFFER_HS_ACK_HIST_MAX ]; /* history of acks during handshake */
526- word32 srvAcks [WC_SNIFFER_HS_ACK_HIST_MAX ]; /* history of acks during handshake */
527522 FinCapture finCapture ; /* retain out of order FIN s */
528523 Flags flags ; /* session flags */
529524 time_t lastUsed ; /* last used ticks */
@@ -5638,55 +5633,16 @@ static int AddFinCapture(SnifferSession* session, word32 sequence)
56385633 return 1 ;
56395634}
56405635
5641- static int FindPrevAck (SnifferSession * session , word32 realAck )
5642- {
5643- int i ;
5644- word32 * acks = (session -> flags .side == WOLFSSL_SERVER_END ) ?
5645- session -> cliAcks : session -> srvAcks ;
5646- /* if previous ack found return 1, otherwise 0 */
5647- for (i = 0 ; i < WC_SNIFFER_HS_ACK_HIST_MAX ; i ++ ) {
5648- if (acks [i ] == realAck ) {
5649- return 1 ;
5650- }
5651-
5652- }
5653- return 0 ;
5654- }
5655- static void AddAck (SnifferSession * session , word32 realAck )
5656- {
5657- int i ;
5658- word32 * acks = (session -> flags .side == WOLFSSL_SERVER_END ) ?
5659- session -> cliAcks : session -> srvAcks ;
5660- /* find first empty ack slot */
5661- for (i = 0 ; i < WC_SNIFFER_HS_ACK_HIST_MAX ; i ++ ) {
5662- if (acks [i ] == 0 ) {
5663- break ;
5664- }
5665- }
5666- /* if out of slots, find oldest */
5667- if (i == WC_SNIFFER_HS_ACK_HIST_MAX ) {
5668- int idx = 0 ;
5669- word32 lastAck = realAck ;
5670- for (i = 0 ; i < WC_SNIFFER_HS_ACK_HIST_MAX ; i ++ ) {
5671- if (acks [i ] < lastAck ) {
5672- idx = i ;
5673- lastAck = acks [i ];
5674- }
5675- }
5676- i = idx ;
5677- }
5678-
5679- acks [i ] = realAck ;
5680- }
5681-
56825636/* Adjust incoming sequence based on side */
56835637/* returns 0 on success (continue), -1 on error, 1 on success (end) */
56845638static int AdjustSequence (TcpInfo * tcpInfo , SnifferSession * session ,
56855639 int * sslBytes , const byte * * sslFrame , char * error )
56865640{
56875641 int ret = 0 ;
56885642 word32 seqStart = (session -> flags .side == WOLFSSL_SERVER_END ) ?
5689- session -> cliSeqStart :session -> srvSeqStart ;
5643+ session -> cliSeqStart : session -> srvSeqStart ;
5644+ word32 * seqLast = (session -> flags .side == WOLFSSL_SERVER_END ) ?
5645+ & session -> cliSeqLast : & session -> srvSeqLast ;
56905646 word32 real = tcpInfo -> sequence - seqStart ;
56915647 word32 * expected = (session -> flags .side == WOLFSSL_SERVER_END ) ?
56925648 & session -> cliExpected : & session -> srvExpected ;
@@ -5747,15 +5703,21 @@ static int AdjustSequence(TcpInfo* tcpInfo, SnifferSession* session,
57475703 }
57485704 }
57495705 else if (* sslBytes > 0 ) {
5750- if (overlap < * sslBytes ) {
5751- /* adjust to remove partial overlap */
5752- * sslFrame += overlap ;
5706+ if (real + * sslBytes - 1 > * seqLast ) {
5707+ /* fix segment overlap */
5708+ #ifdef DEBUG_SNIFFER
5709+ WOLFSSL * ssl = (session -> flags .side == WOLFSSL_SERVER_END ) ?
5710+ session -> sslServer : session -> sslClient ;
5711+ printf ("\tSegment %d overlap (%d -> %d)\n" ,
5712+ * sslBytes ,
5713+ ssl -> buffers .inputBuffer .length - overlap ,
5714+ ssl -> buffers .inputBuffer .length + * sslBytes - overlap - 1 );
5715+ #endif
57535716 * sslBytes -= overlap ;
5754- }
5755- else {
5756- /* DUP overlap, allow */
5717+ * sslFrame += overlap ;
57575718 }
57585719
5720+ /* DUP overlap, allow */
57595721 skipPartial = 0 ; /* do not reset sslBytes */
57605722 }
57615723 ret = 0 ;
@@ -5765,13 +5727,13 @@ static int AdjustSequence(TcpInfo* tcpInfo, SnifferSession* session,
57655727 * possible spurious retransmission. */
57665728 if (* sslBytes > 0 ) {
57675729 /* If packet has data attempt to process packet, if hasn't
5768- * already been ack'd during handshake */
5730+ * already been received */
57695731 if (
57705732 #ifdef WOLFSSL_ASYNC_CRYPT
57715733 session -> sslServer -> error != WC_NO_ERR_TRACE (WC_PENDING_E ) &&
57725734 session -> pendSeq != tcpInfo -> sequence &&
57735735 #endif
5774- FindPrevAck ( session , real ) ) {
5736+ real + * sslBytes - 1 <= * seqLast ) {
57755737 Trace (DUPLICATE_STR );
57765738 ret = 1 ;
57775739 }
@@ -5843,7 +5805,7 @@ static int AdjustSequence(TcpInfo* tcpInfo, SnifferSession* session,
58435805 * expected += 1 ;
58445806 }
58455807 if (* sslBytes > 0 ) {
5846- AddAck ( session , real ) ;
5808+ * seqLast = real + * sslBytes - 1 ;
58475809 }
58485810 if (* sslBytes > 0 && skipPartial ) {
58495811 * sslBytes = 0 ;
0 commit comments