Home | History | Annotate | Line # | Download | only in helpers
      1 /*
      2  * Copyright 2016-2024 The OpenSSL Project Authors. All Rights Reserved.
      3  *
      4  * Licensed under the Apache License 2.0 (the "License").  You may not use
      5  * this file except in compliance with the License.  You can obtain a copy
      6  * in the file LICENSE in the source distribution or at
      7  * https://www.openssl.org/source/license.html
      8  */
      9 
     10 /*
     11  * We need access to the deprecated low level ENGINE APIs for legacy purposes
     12  * when the deprecated calls are not hidden
     13  */
     14 #ifndef OPENSSL_NO_DEPRECATED_3_0
     15 # define OPENSSL_SUPPRESS_DEPRECATED
     16 #endif
     17 
     18 #include <string.h>
     19 
     20 #include <openssl/engine.h>
     21 #include "internal/nelem.h"
     22 #include "ssltestlib.h"
     23 #include "../testutil.h"
     24 #include "e_os.h" /* for ossl_sleep() etc. */
     25 
     26 #ifdef OPENSSL_SYS_UNIX
     27 # include <unistd.h>
     28 # ifndef OPENSSL_NO_KTLS
     29 #  include <netinet/in.h>
     30 #  include <netinet/in.h>
     31 #  include <arpa/inet.h>
     32 #  include <sys/socket.h>
     33 #  include <unistd.h>
     34 #  include <fcntl.h>
     35 # endif
     36 #endif
     37 
     38 static int tls_dump_new(BIO *bi);
     39 static int tls_dump_free(BIO *a);
     40 static int tls_dump_read(BIO *b, char *out, int outl);
     41 static int tls_dump_write(BIO *b, const char *in, int inl);
     42 static long tls_dump_ctrl(BIO *b, int cmd, long num, void *ptr);
     43 static int tls_dump_gets(BIO *bp, char *buf, int size);
     44 static int tls_dump_puts(BIO *bp, const char *str);
     45 
     46 /* Choose a sufficiently large type likely to be unused for this custom BIO */
     47 #define BIO_TYPE_TLS_DUMP_FILTER  (0x80 | BIO_TYPE_FILTER)
     48 #define BIO_TYPE_MEMPACKET_TEST    0x81
     49 #define BIO_TYPE_ALWAYS_RETRY      0x82
     50 
     51 static BIO_METHOD *method_tls_dump = NULL;
     52 static BIO_METHOD *meth_mem = NULL;
     53 static BIO_METHOD *meth_always_retry = NULL;
     54 static int retry_err = -1;
     55 
     56 /* Note: Not thread safe! */
     57 const BIO_METHOD *bio_f_tls_dump_filter(void)
     58 {
     59     if (method_tls_dump == NULL) {
     60         method_tls_dump = BIO_meth_new(BIO_TYPE_TLS_DUMP_FILTER,
     61                                         "TLS dump filter");
     62         if (   method_tls_dump == NULL
     63             || !BIO_meth_set_write(method_tls_dump, tls_dump_write)
     64             || !BIO_meth_set_read(method_tls_dump, tls_dump_read)
     65             || !BIO_meth_set_puts(method_tls_dump, tls_dump_puts)
     66             || !BIO_meth_set_gets(method_tls_dump, tls_dump_gets)
     67             || !BIO_meth_set_ctrl(method_tls_dump, tls_dump_ctrl)
     68             || !BIO_meth_set_create(method_tls_dump, tls_dump_new)
     69             || !BIO_meth_set_destroy(method_tls_dump, tls_dump_free))
     70             return NULL;
     71     }
     72     return method_tls_dump;
     73 }
     74 
     75 void bio_f_tls_dump_filter_free(void)
     76 {
     77     BIO_meth_free(method_tls_dump);
     78 }
     79 
     80 static int tls_dump_new(BIO *bio)
     81 {
     82     BIO_set_init(bio, 1);
     83     return 1;
     84 }
     85 
     86 static int tls_dump_free(BIO *bio)
     87 {
     88     BIO_set_init(bio, 0);
     89 
     90     return 1;
     91 }
     92 
     93 static void copy_flags(BIO *bio)
     94 {
     95     int flags;
     96     BIO *next = BIO_next(bio);
     97 
     98     flags = BIO_test_flags(next, BIO_FLAGS_SHOULD_RETRY | BIO_FLAGS_RWS);
     99     BIO_clear_flags(bio, BIO_FLAGS_SHOULD_RETRY | BIO_FLAGS_RWS);
    100     BIO_set_flags(bio, flags);
    101 }
    102 
    103 #define RECORD_CONTENT_TYPE     0
    104 #define RECORD_VERSION_HI       1
    105 #define RECORD_VERSION_LO       2
    106 #define RECORD_EPOCH_HI         3
    107 #define RECORD_EPOCH_LO         4
    108 #define RECORD_SEQUENCE_START   5
    109 #define RECORD_SEQUENCE_END     10
    110 #define RECORD_LEN_HI           11
    111 #define RECORD_LEN_LO           12
    112 
    113 #define MSG_TYPE                0
    114 #define MSG_LEN_HI              1
    115 #define MSG_LEN_MID             2
    116 #define MSG_LEN_LO              3
    117 #define MSG_SEQ_HI              4
    118 #define MSG_SEQ_LO              5
    119 #define MSG_FRAG_OFF_HI         6
    120 #define MSG_FRAG_OFF_MID        7
    121 #define MSG_FRAG_OFF_LO         8
    122 #define MSG_FRAG_LEN_HI         9
    123 #define MSG_FRAG_LEN_MID        10
    124 #define MSG_FRAG_LEN_LO         11
    125 
    126 
    127 static void dump_data(const char *data, int len)
    128 {
    129     int rem, i, content, reclen, msglen, fragoff, fraglen, epoch;
    130     unsigned char *rec;
    131 
    132     printf("---- START OF PACKET ----\n");
    133 
    134     rem = len;
    135     rec = (unsigned char *)data;
    136 
    137     while (rem > 0) {
    138         if (rem != len)
    139             printf("*\n");
    140         printf("*---- START OF RECORD ----\n");
    141         if (rem < DTLS1_RT_HEADER_LENGTH) {
    142             printf("*---- RECORD TRUNCATED ----\n");
    143             break;
    144         }
    145         content = rec[RECORD_CONTENT_TYPE];
    146         printf("** Record Content-type: %d\n", content);
    147         printf("** Record Version: %02x%02x\n",
    148                rec[RECORD_VERSION_HI], rec[RECORD_VERSION_LO]);
    149         epoch = (rec[RECORD_EPOCH_HI] << 8) | rec[RECORD_EPOCH_LO];
    150         printf("** Record Epoch: %d\n", epoch);
    151         printf("** Record Sequence: ");
    152         for (i = RECORD_SEQUENCE_START; i <= RECORD_SEQUENCE_END; i++)
    153             printf("%02x", rec[i]);
    154         reclen = (rec[RECORD_LEN_HI] << 8) | rec[RECORD_LEN_LO];
    155         printf("\n** Record Length: %d\n", reclen);
    156 
    157         /* Now look at message */
    158         rec += DTLS1_RT_HEADER_LENGTH;
    159         rem -= DTLS1_RT_HEADER_LENGTH;
    160         if (content == SSL3_RT_HANDSHAKE) {
    161             printf("**---- START OF HANDSHAKE MESSAGE FRAGMENT ----\n");
    162             if (epoch > 0) {
    163                 printf("**---- HANDSHAKE MESSAGE FRAGMENT ENCRYPTED ----\n");
    164             } else if (rem < DTLS1_HM_HEADER_LENGTH
    165                     || reclen < DTLS1_HM_HEADER_LENGTH) {
    166                 printf("**---- HANDSHAKE MESSAGE FRAGMENT TRUNCATED ----\n");
    167             } else {
    168                 printf("*** Message Type: %d\n", rec[MSG_TYPE]);
    169                 msglen = (rec[MSG_LEN_HI] << 16) | (rec[MSG_LEN_MID] << 8)
    170                          | rec[MSG_LEN_LO];
    171                 printf("*** Message Length: %d\n", msglen);
    172                 printf("*** Message sequence: %d\n",
    173                        (rec[MSG_SEQ_HI] << 8) | rec[MSG_SEQ_LO]);
    174                 fragoff = (rec[MSG_FRAG_OFF_HI] << 16)
    175                           | (rec[MSG_FRAG_OFF_MID] << 8)
    176                           | rec[MSG_FRAG_OFF_LO];
    177                 printf("*** Message Fragment offset: %d\n", fragoff);
    178                 fraglen = (rec[MSG_FRAG_LEN_HI] << 16)
    179                           | (rec[MSG_FRAG_LEN_MID] << 8)
    180                           | rec[MSG_FRAG_LEN_LO];
    181                 printf("*** Message Fragment len: %d\n", fraglen);
    182                 if (fragoff + fraglen > msglen)
    183                     printf("***---- HANDSHAKE MESSAGE FRAGMENT INVALID ----\n");
    184                 else if (reclen < fraglen)
    185                     printf("**---- HANDSHAKE MESSAGE FRAGMENT TRUNCATED ----\n");
    186                 else
    187                     printf("**---- END OF HANDSHAKE MESSAGE FRAGMENT ----\n");
    188             }
    189         }
    190         if (rem < reclen) {
    191             printf("*---- RECORD TRUNCATED ----\n");
    192             rem = 0;
    193         } else {
    194             rec += reclen;
    195             rem -= reclen;
    196             printf("*---- END OF RECORD ----\n");
    197         }
    198     }
    199     printf("---- END OF PACKET ----\n\n");
    200     fflush(stdout);
    201 }
    202 
    203 static int tls_dump_read(BIO *bio, char *out, int outl)
    204 {
    205     int ret;
    206     BIO *next = BIO_next(bio);
    207 
    208     ret = BIO_read(next, out, outl);
    209     copy_flags(bio);
    210 
    211     if (ret > 0) {
    212         dump_data(out, ret);
    213     }
    214 
    215     return ret;
    216 }
    217 
    218 static int tls_dump_write(BIO *bio, const char *in, int inl)
    219 {
    220     int ret;
    221     BIO *next = BIO_next(bio);
    222 
    223     ret = BIO_write(next, in, inl);
    224     copy_flags(bio);
    225 
    226     return ret;
    227 }
    228 
    229 static long tls_dump_ctrl(BIO *bio, int cmd, long num, void *ptr)
    230 {
    231     long ret;
    232     BIO *next = BIO_next(bio);
    233 
    234     if (next == NULL)
    235         return 0;
    236 
    237     switch (cmd) {
    238     case BIO_CTRL_DUP:
    239         ret = 0L;
    240         break;
    241     default:
    242         ret = BIO_ctrl(next, cmd, num, ptr);
    243         break;
    244     }
    245     return ret;
    246 }
    247 
    248 static int tls_dump_gets(BIO *bio, char *buf, int size)
    249 {
    250     /* We don't support this - not needed anyway */
    251     return -1;
    252 }
    253 
    254 static int tls_dump_puts(BIO *bio, const char *str)
    255 {
    256     return tls_dump_write(bio, str, strlen(str));
    257 }
    258 
    259 
    260 struct mempacket_st {
    261     unsigned char *data;
    262     int len;
    263     unsigned int num;
    264     unsigned int type;
    265 };
    266 
    267 static void mempacket_free(MEMPACKET *pkt)
    268 {
    269     if (pkt->data != NULL)
    270         OPENSSL_free(pkt->data);
    271     OPENSSL_free(pkt);
    272 }
    273 
    274 typedef struct mempacket_test_ctx_st {
    275     STACK_OF(MEMPACKET) *pkts;
    276     unsigned int epoch;
    277     unsigned int currrec;
    278     unsigned int currpkt;
    279     unsigned int lastpkt;
    280     unsigned int injected;
    281     unsigned int noinject;
    282     unsigned int dropepoch;
    283     int droprec;
    284     int duprec;
    285 } MEMPACKET_TEST_CTX;
    286 
    287 static int mempacket_test_new(BIO *bi);
    288 static int mempacket_test_free(BIO *a);
    289 static int mempacket_test_read(BIO *b, char *out, int outl);
    290 static int mempacket_test_write(BIO *b, const char *in, int inl);
    291 static long mempacket_test_ctrl(BIO *b, int cmd, long num, void *ptr);
    292 static int mempacket_test_gets(BIO *bp, char *buf, int size);
    293 static int mempacket_test_puts(BIO *bp, const char *str);
    294 
    295 const BIO_METHOD *bio_s_mempacket_test(void)
    296 {
    297     if (meth_mem == NULL) {
    298         if (!TEST_ptr(meth_mem = BIO_meth_new(BIO_TYPE_MEMPACKET_TEST,
    299                                               "Mem Packet Test"))
    300             || !TEST_true(BIO_meth_set_write(meth_mem, mempacket_test_write))
    301             || !TEST_true(BIO_meth_set_read(meth_mem, mempacket_test_read))
    302             || !TEST_true(BIO_meth_set_puts(meth_mem, mempacket_test_puts))
    303             || !TEST_true(BIO_meth_set_gets(meth_mem, mempacket_test_gets))
    304             || !TEST_true(BIO_meth_set_ctrl(meth_mem, mempacket_test_ctrl))
    305             || !TEST_true(BIO_meth_set_create(meth_mem, mempacket_test_new))
    306             || !TEST_true(BIO_meth_set_destroy(meth_mem, mempacket_test_free)))
    307             return NULL;
    308     }
    309     return meth_mem;
    310 }
    311 
    312 void bio_s_mempacket_test_free(void)
    313 {
    314     BIO_meth_free(meth_mem);
    315 }
    316 
    317 static int mempacket_test_new(BIO *bio)
    318 {
    319     MEMPACKET_TEST_CTX *ctx;
    320 
    321     if (!TEST_ptr(ctx = OPENSSL_zalloc(sizeof(*ctx))))
    322         return 0;
    323     if (!TEST_ptr(ctx->pkts = sk_MEMPACKET_new_null())) {
    324         OPENSSL_free(ctx);
    325         return 0;
    326     }
    327     ctx->dropepoch = 0;
    328     ctx->droprec = -1;
    329     BIO_set_init(bio, 1);
    330     BIO_set_data(bio, ctx);
    331     return 1;
    332 }
    333 
    334 static int mempacket_test_free(BIO *bio)
    335 {
    336     MEMPACKET_TEST_CTX *ctx = BIO_get_data(bio);
    337 
    338     sk_MEMPACKET_pop_free(ctx->pkts, mempacket_free);
    339     OPENSSL_free(ctx);
    340     BIO_set_data(bio, NULL);
    341     BIO_set_init(bio, 0);
    342     return 1;
    343 }
    344 
    345 /* Record Header values */
    346 #define EPOCH_HI        3
    347 #define EPOCH_LO        4
    348 #define RECORD_SEQUENCE 10
    349 #define RECORD_LEN_HI   11
    350 #define RECORD_LEN_LO   12
    351 
    352 #define STANDARD_PACKET                 0
    353 
    354 static int mempacket_test_read(BIO *bio, char *out, int outl)
    355 {
    356     MEMPACKET_TEST_CTX *ctx = BIO_get_data(bio);
    357     MEMPACKET *thispkt;
    358     unsigned char *rec;
    359     int rem;
    360     unsigned int seq, offset, len, epoch;
    361 
    362     BIO_clear_retry_flags(bio);
    363     if ((thispkt = sk_MEMPACKET_value(ctx->pkts, 0)) == NULL
    364         || thispkt->num != ctx->currpkt) {
    365         /* Probably run out of data */
    366         BIO_set_retry_read(bio);
    367         return -1;
    368     }
    369     (void)sk_MEMPACKET_shift(ctx->pkts);
    370     ctx->currpkt++;
    371 
    372     if (outl > thispkt->len)
    373         outl = thispkt->len;
    374 
    375     if (thispkt->type != INJECT_PACKET_IGNORE_REC_SEQ
    376             && (ctx->injected || ctx->droprec >= 0)) {
    377         /*
    378          * Overwrite the record sequence number. We strictly number them in
    379          * the order received. Since we are actually a reliable transport
    380          * we know that there won't be any re-ordering. We overwrite to deal
    381          * with any packets that have been injected
    382          */
    383         for (rem = thispkt->len, rec = thispkt->data; rem > 0; rem -= len) {
    384             if (rem < DTLS1_RT_HEADER_LENGTH)
    385                 return -1;
    386             epoch = (rec[EPOCH_HI] << 8) | rec[EPOCH_LO];
    387             if (epoch != ctx->epoch) {
    388                 ctx->epoch = epoch;
    389                 ctx->currrec = 0;
    390             }
    391             seq = ctx->currrec;
    392             offset = 0;
    393             do {
    394                 rec[RECORD_SEQUENCE - offset] = seq & 0xFF;
    395                 seq >>= 8;
    396                 offset++;
    397             } while (seq > 0);
    398 
    399             len = ((rec[RECORD_LEN_HI] << 8) | rec[RECORD_LEN_LO])
    400                   + DTLS1_RT_HEADER_LENGTH;
    401             if (rem < (int)len)
    402                 return -1;
    403             if (ctx->droprec == (int)ctx->currrec && ctx->dropepoch == epoch) {
    404                 if (rem > (int)len)
    405                     memmove(rec, rec + len, rem - len);
    406                 outl -= len;
    407                 ctx->droprec = -1;
    408                 if (outl == 0)
    409                     BIO_set_retry_read(bio);
    410             } else {
    411                 rec += len;
    412             }
    413 
    414             ctx->currrec++;
    415         }
    416     }
    417 
    418     memcpy(out, thispkt->data, outl);
    419     mempacket_free(thispkt);
    420     return outl;
    421 }
    422 
    423 /*
    424  * Look for records from different epochs in the last datagram and swap them
    425  * around
    426  */
    427 int mempacket_swap_epoch(BIO *bio)
    428 {
    429     MEMPACKET_TEST_CTX *ctx = BIO_get_data(bio);
    430     MEMPACKET *thispkt;
    431     int rem, len, prevlen = 0, pktnum;
    432     unsigned char *rec, *prevrec = NULL, *tmp;
    433     unsigned int epoch;
    434     int numpkts = sk_MEMPACKET_num(ctx->pkts);
    435 
    436     if (numpkts <= 0)
    437         return 0;
    438 
    439     /*
    440      * If there are multiple packets we only look in the last one. This should
    441      * always be the one where any epoch change occurs.
    442      */
    443     thispkt = sk_MEMPACKET_value(ctx->pkts, numpkts - 1);
    444     if (thispkt == NULL)
    445         return 0;
    446 
    447     for (rem = thispkt->len, rec = thispkt->data; rem > 0; rem -= len, rec += len) {
    448         if (rem < DTLS1_RT_HEADER_LENGTH)
    449             return 0;
    450         epoch = (rec[EPOCH_HI] << 8) | rec[EPOCH_LO];
    451         len = ((rec[RECORD_LEN_HI] << 8) | rec[RECORD_LEN_LO])
    452                 + DTLS1_RT_HEADER_LENGTH;
    453         if (rem < len)
    454             return 0;
    455 
    456         /* Assumes the epoch change does not happen on the first record */
    457         if (epoch != ctx->epoch) {
    458             if (prevrec == NULL)
    459                 return 0;
    460 
    461             /*
    462              * We found 2 records with different epochs. Take a copy of the
    463              * earlier record
    464              */
    465             tmp = OPENSSL_malloc(prevlen);
    466             if (tmp == NULL)
    467                 return 0;
    468 
    469             memcpy(tmp, prevrec, prevlen);
    470             /*
    471              * Move everything from this record onwards, including any trailing
    472              * records, and overwrite the earlier record
    473              */
    474             memmove(prevrec, rec, rem);
    475             thispkt->len -= prevlen;
    476             pktnum = thispkt->num;
    477 
    478             /*
    479              * Create a new packet for the earlier record that we took out and
    480              * add it to the end of the packet list.
    481              */
    482             thispkt = OPENSSL_malloc(sizeof(*thispkt));
    483             if (thispkt == NULL) {
    484                 OPENSSL_free(tmp);
    485                 return 0;
    486             }
    487             thispkt->type = INJECT_PACKET;
    488             thispkt->data = tmp;
    489             thispkt->len = prevlen;
    490             thispkt->num = pktnum + 1;
    491             if (sk_MEMPACKET_insert(ctx->pkts, thispkt, numpkts) <= 0) {
    492                 OPENSSL_free(tmp);
    493                 OPENSSL_free(thispkt);
    494                 return 0;
    495             }
    496 
    497             return 1;
    498         }
    499         prevrec = rec;
    500         prevlen = len;
    501     }
    502 
    503     return 0;
    504 }
    505 
    506 /* Move packet from position s to position d in the list (d < s) */
    507 int mempacket_move_packet(BIO *bio, int d, int s)
    508 {
    509     MEMPACKET_TEST_CTX *ctx = BIO_get_data(bio);
    510     MEMPACKET *thispkt;
    511     int numpkts = sk_MEMPACKET_num(ctx->pkts);
    512     int i;
    513 
    514     if (d >= s)
    515         return 0;
    516 
    517     /* We need at least s + 1 packets to be able to swap them */
    518     if (numpkts <= s)
    519         return 0;
    520 
    521     /* Get the packet at position s */
    522     thispkt = sk_MEMPACKET_value(ctx->pkts, s);
    523     if (thispkt == NULL)
    524         return 0;
    525 
    526     /* Remove and re-add it */
    527     if (sk_MEMPACKET_delete(ctx->pkts, s) != thispkt)
    528         return 0;
    529 
    530     thispkt->num -= (s - d);
    531     if (sk_MEMPACKET_insert(ctx->pkts, thispkt, d) <= 0)
    532         return 0;
    533 
    534     /* Increment the packet numbers for moved packets */
    535     for (i = d + 1; i <= s; i++) {
    536         thispkt = sk_MEMPACKET_value(ctx->pkts, i);
    537         thispkt->num++;
    538     }
    539     return 1;
    540 }
    541 
    542 int mempacket_test_inject(BIO *bio, const char *in, int inl, int pktnum,
    543                           int type)
    544 {
    545     MEMPACKET_TEST_CTX *ctx = BIO_get_data(bio);
    546     MEMPACKET *thispkt = NULL, *looppkt, *nextpkt, *allpkts[3];
    547     int i, duprec;
    548     const unsigned char *inu = (const unsigned char *)in;
    549     size_t len = ((inu[RECORD_LEN_HI] << 8) | inu[RECORD_LEN_LO])
    550                  + DTLS1_RT_HEADER_LENGTH;
    551 
    552     if (ctx == NULL)
    553         return -1;
    554 
    555     if ((size_t)inl < len)
    556         return -1;
    557 
    558     if ((size_t)inl == len)
    559         duprec = 0;
    560     else
    561         duprec = ctx->duprec > 0;
    562 
    563     /* We don't support arbitrary injection when duplicating records */
    564     if (duprec && pktnum != -1)
    565         return -1;
    566 
    567     /* We only allow injection before we've started writing any data */
    568     if (pktnum >= 0) {
    569         if (ctx->noinject)
    570             return -1;
    571         ctx->injected  = 1;
    572     } else {
    573         ctx->noinject = 1;
    574     }
    575 
    576     for (i = 0; i < (duprec ? 3 : 1); i++) {
    577         if (!TEST_ptr(allpkts[i] = OPENSSL_malloc(sizeof(*thispkt))))
    578             goto err;
    579         thispkt = allpkts[i];
    580 
    581         if (!TEST_ptr(thispkt->data = OPENSSL_malloc(inl)))
    582             goto err;
    583         /*
    584          * If we are duplicating the packet, we duplicate it three times. The
    585          * first two times we drop the first record if there are more than one.
    586          * In this way we know that libssl will not be able to make progress
    587          * until it receives the last packet, and hence will be forced to
    588          * buffer these records.
    589          */
    590         if (duprec && i != 2) {
    591             memcpy(thispkt->data, in + len, inl - len);
    592             thispkt->len = inl - len;
    593         } else {
    594             memcpy(thispkt->data, in, inl);
    595             thispkt->len = inl;
    596         }
    597         thispkt->num = (pktnum >= 0) ? (unsigned int)pktnum : ctx->lastpkt + i;
    598         thispkt->type = type;
    599     }
    600 
    601     for (i = 0; i < sk_MEMPACKET_num(ctx->pkts); i++) {
    602         if (!TEST_ptr(looppkt = sk_MEMPACKET_value(ctx->pkts, i)))
    603             goto err;
    604         /* Check if we found the right place to insert this packet */
    605         if (looppkt->num > thispkt->num) {
    606             if (sk_MEMPACKET_insert(ctx->pkts, thispkt, i) == 0)
    607                 goto err;
    608             /* If we're doing up front injection then we're done */
    609             if (pktnum >= 0)
    610                 return inl;
    611             /*
    612              * We need to do some accounting on lastpkt. We increment it first,
    613              * but it might now equal the value of injected packets, so we need
    614              * to skip over those
    615              */
    616             ctx->lastpkt++;
    617             do {
    618                 i++;
    619                 nextpkt = sk_MEMPACKET_value(ctx->pkts, i);
    620                 if (nextpkt != NULL && nextpkt->num == ctx->lastpkt)
    621                     ctx->lastpkt++;
    622                 else
    623                     return inl;
    624             } while(1);
    625         } else if (looppkt->num == thispkt->num) {
    626             if (!ctx->noinject) {
    627                 /* We injected two packets with the same packet number! */
    628                 goto err;
    629             }
    630             ctx->lastpkt++;
    631             thispkt->num++;
    632         }
    633     }
    634     /*
    635      * We didn't find any packets with a packet number equal to or greater than
    636      * this one, so we just add it onto the end
    637      */
    638     for (i = 0; i < (duprec ? 3 : 1); i++) {
    639         thispkt = allpkts[i];
    640         if (!sk_MEMPACKET_push(ctx->pkts, thispkt))
    641             goto err;
    642 
    643         if (pktnum < 0)
    644             ctx->lastpkt++;
    645     }
    646 
    647     return inl;
    648 
    649  err:
    650     for (i = 0; i < (ctx->duprec > 0 ? 3 : 1); i++)
    651         mempacket_free(allpkts[i]);
    652     return -1;
    653 }
    654 
    655 static int mempacket_test_write(BIO *bio, const char *in, int inl)
    656 {
    657     return mempacket_test_inject(bio, in, inl, -1, STANDARD_PACKET);
    658 }
    659 
    660 static long mempacket_test_ctrl(BIO *bio, int cmd, long num, void *ptr)
    661 {
    662     long ret = 1;
    663     MEMPACKET_TEST_CTX *ctx = BIO_get_data(bio);
    664     MEMPACKET *thispkt;
    665 
    666     switch (cmd) {
    667     case BIO_CTRL_EOF:
    668         ret = (long)(sk_MEMPACKET_num(ctx->pkts) == 0);
    669         break;
    670     case BIO_CTRL_GET_CLOSE:
    671         ret = BIO_get_shutdown(bio);
    672         break;
    673     case BIO_CTRL_SET_CLOSE:
    674         BIO_set_shutdown(bio, (int)num);
    675         break;
    676     case BIO_CTRL_WPENDING:
    677         ret = 0L;
    678         break;
    679     case BIO_CTRL_PENDING:
    680         thispkt = sk_MEMPACKET_value(ctx->pkts, 0);
    681         if (thispkt == NULL)
    682             ret = 0;
    683         else
    684             ret = thispkt->len;
    685         break;
    686     case BIO_CTRL_FLUSH:
    687         ret = 1;
    688         break;
    689     case MEMPACKET_CTRL_SET_DROP_EPOCH:
    690         ctx->dropepoch = (unsigned int)num;
    691         break;
    692     case MEMPACKET_CTRL_SET_DROP_REC:
    693         ctx->droprec = (int)num;
    694         break;
    695     case MEMPACKET_CTRL_GET_DROP_REC:
    696         ret = ctx->droprec;
    697         break;
    698     case MEMPACKET_CTRL_SET_DUPLICATE_REC:
    699         ctx->duprec = (int)num;
    700         break;
    701     case BIO_CTRL_RESET:
    702     case BIO_CTRL_DUP:
    703     case BIO_CTRL_PUSH:
    704     case BIO_CTRL_POP:
    705     default:
    706         ret = 0;
    707         break;
    708     }
    709     return ret;
    710 }
    711 
    712 static int mempacket_test_gets(BIO *bio, char *buf, int size)
    713 {
    714     /* We don't support this - not needed anyway */
    715     return -1;
    716 }
    717 
    718 static int mempacket_test_puts(BIO *bio, const char *str)
    719 {
    720     return mempacket_test_write(bio, str, strlen(str));
    721 }
    722 
    723 static int always_retry_new(BIO *bi);
    724 static int always_retry_free(BIO *a);
    725 static int always_retry_read(BIO *b, char *out, int outl);
    726 static int always_retry_write(BIO *b, const char *in, int inl);
    727 static long always_retry_ctrl(BIO *b, int cmd, long num, void *ptr);
    728 static int always_retry_gets(BIO *bp, char *buf, int size);
    729 static int always_retry_puts(BIO *bp, const char *str);
    730 
    731 const BIO_METHOD *bio_s_always_retry(void)
    732 {
    733     if (meth_always_retry == NULL) {
    734         if (!TEST_ptr(meth_always_retry = BIO_meth_new(BIO_TYPE_ALWAYS_RETRY,
    735                                                        "Always Retry"))
    736             || !TEST_true(BIO_meth_set_write(meth_always_retry,
    737                                              always_retry_write))
    738             || !TEST_true(BIO_meth_set_read(meth_always_retry,
    739                                             always_retry_read))
    740             || !TEST_true(BIO_meth_set_puts(meth_always_retry,
    741                                             always_retry_puts))
    742             || !TEST_true(BIO_meth_set_gets(meth_always_retry,
    743                                             always_retry_gets))
    744             || !TEST_true(BIO_meth_set_ctrl(meth_always_retry,
    745                                             always_retry_ctrl))
    746             || !TEST_true(BIO_meth_set_create(meth_always_retry,
    747                                               always_retry_new))
    748             || !TEST_true(BIO_meth_set_destroy(meth_always_retry,
    749                                                always_retry_free)))
    750             return NULL;
    751     }
    752     return meth_always_retry;
    753 }
    754 
    755 void bio_s_always_retry_free(void)
    756 {
    757     BIO_meth_free(meth_always_retry);
    758 }
    759 
    760 static int always_retry_new(BIO *bio)
    761 {
    762     BIO_set_init(bio, 1);
    763     return 1;
    764 }
    765 
    766 static int always_retry_free(BIO *bio)
    767 {
    768     BIO_set_data(bio, NULL);
    769     BIO_set_init(bio, 0);
    770     return 1;
    771 }
    772 
    773 void set_always_retry_err_val(int err)
    774 {
    775     retry_err = err;
    776 }
    777 
    778 static int always_retry_read(BIO *bio, char *out, int outl)
    779 {
    780     BIO_set_retry_read(bio);
    781     return retry_err;
    782 }
    783 
    784 static int always_retry_write(BIO *bio, const char *in, int inl)
    785 {
    786     BIO_set_retry_write(bio);
    787     return retry_err;
    788 }
    789 
    790 static long always_retry_ctrl(BIO *bio, int cmd, long num, void *ptr)
    791 {
    792     long ret = 1;
    793 
    794     switch (cmd) {
    795     case BIO_CTRL_FLUSH:
    796         BIO_set_retry_write(bio);
    797         /* fall through */
    798     case BIO_CTRL_EOF:
    799     case BIO_CTRL_RESET:
    800     case BIO_CTRL_DUP:
    801     case BIO_CTRL_PUSH:
    802     case BIO_CTRL_POP:
    803     default:
    804         ret = 0;
    805         break;
    806     }
    807     return ret;
    808 }
    809 
    810 static int always_retry_gets(BIO *bio, char *buf, int size)
    811 {
    812     BIO_set_retry_read(bio);
    813     return retry_err;
    814 }
    815 
    816 static int always_retry_puts(BIO *bio, const char *str)
    817 {
    818     BIO_set_retry_write(bio);
    819     return retry_err;
    820 }
    821 
    822 int create_ssl_ctx_pair(OSSL_LIB_CTX *libctx, const SSL_METHOD *sm,
    823                         const SSL_METHOD *cm, int min_proto_version,
    824                         int max_proto_version, SSL_CTX **sctx, SSL_CTX **cctx,
    825                         char *certfile, char *privkeyfile)
    826 {
    827     SSL_CTX *serverctx = NULL;
    828     SSL_CTX *clientctx = NULL;
    829 
    830     if (sctx != NULL) {
    831         if (*sctx != NULL)
    832             serverctx = *sctx;
    833         else if (!TEST_ptr(serverctx = SSL_CTX_new_ex(libctx, NULL, sm))
    834             || !TEST_true(SSL_CTX_set_options(serverctx,
    835                                               SSL_OP_ALLOW_CLIENT_RENEGOTIATION)))
    836             goto err;
    837     }
    838 
    839     if (cctx != NULL) {
    840         if (*cctx != NULL)
    841             clientctx = *cctx;
    842         else if (!TEST_ptr(clientctx = SSL_CTX_new_ex(libctx, NULL, cm)))
    843             goto err;
    844     }
    845 
    846 #if !defined(OPENSSL_NO_TLS1_3) \
    847     && defined(OPENSSL_NO_EC) \
    848     && defined(OPENSSL_NO_DH)
    849     /*
    850      * There are no usable built-in TLSv1.3 groups if ec and dh are both
    851      * disabled
    852      */
    853     if (max_proto_version == 0
    854             && (sm == TLS_server_method() || cm == TLS_client_method()))
    855         max_proto_version = TLS1_2_VERSION;
    856 #endif
    857 
    858     if (serverctx != NULL
    859             && ((min_proto_version > 0
    860                  && !TEST_true(SSL_CTX_set_min_proto_version(serverctx,
    861                                                             min_proto_version)))
    862                 || (max_proto_version > 0
    863                     && !TEST_true(SSL_CTX_set_max_proto_version(serverctx,
    864                                                                 max_proto_version)))))
    865         goto err;
    866     if (clientctx != NULL
    867         && ((min_proto_version > 0
    868              && !TEST_true(SSL_CTX_set_min_proto_version(clientctx,
    869                                                          min_proto_version)))
    870             || (max_proto_version > 0
    871                 && !TEST_true(SSL_CTX_set_max_proto_version(clientctx,
    872                                                             max_proto_version)))))
    873         goto err;
    874 
    875     if (serverctx != NULL && certfile != NULL && privkeyfile != NULL) {
    876         if (!TEST_int_eq(SSL_CTX_use_certificate_file(serverctx, certfile,
    877                                                       SSL_FILETYPE_PEM), 1)
    878                 || !TEST_int_eq(SSL_CTX_use_PrivateKey_file(serverctx,
    879                                                             privkeyfile,
    880                                                             SSL_FILETYPE_PEM), 1)
    881                 || !TEST_int_eq(SSL_CTX_check_private_key(serverctx), 1))
    882             goto err;
    883     }
    884 
    885     if (sctx != NULL)
    886         *sctx = serverctx;
    887     if (cctx != NULL)
    888         *cctx = clientctx;
    889     return 1;
    890 
    891  err:
    892     if (sctx != NULL && *sctx == NULL)
    893         SSL_CTX_free(serverctx);
    894     if (cctx != NULL && *cctx == NULL)
    895         SSL_CTX_free(clientctx);
    896     return 0;
    897 }
    898 
    899 #define MAXLOOPS    1000000
    900 
    901 #if !defined(OPENSSL_NO_KTLS) && !defined(OPENSSL_NO_SOCK)
    902 static int set_nb(int fd)
    903 {
    904     int flags;
    905 
    906     flags = fcntl(fd,F_GETFL,0);
    907     if (flags == -1)
    908         return flags;
    909     flags = fcntl(fd, F_SETFL, flags | O_NONBLOCK);
    910     return flags;
    911 }
    912 
    913 int create_test_sockets(int *cfdp, int *sfdp)
    914 {
    915     struct sockaddr_in sin;
    916     const char *host = "127.0.0.1";
    917     int cfd_connected = 0, ret = 0;
    918     socklen_t slen = sizeof(sin);
    919     int afd = -1, cfd = -1, sfd = -1;
    920 
    921     memset ((char *) &sin, 0, sizeof(sin));
    922     sin.sin_family = AF_INET;
    923     sin.sin_addr.s_addr = inet_addr(host);
    924 
    925     afd = socket(AF_INET, SOCK_STREAM, 0);
    926     if (afd < 0)
    927         return 0;
    928 
    929     if (bind(afd, (struct sockaddr*)&sin, sizeof(sin)) < 0)
    930         goto out;
    931 
    932     if (getsockname(afd, (struct sockaddr*)&sin, &slen) < 0)
    933         goto out;
    934 
    935     if (listen(afd, 1) < 0)
    936         goto out;
    937 
    938     cfd = socket(AF_INET, SOCK_STREAM, 0);
    939     if (cfd < 0)
    940         goto out;
    941 
    942     if (set_nb(afd) == -1)
    943         goto out;
    944 
    945     while (sfd == -1 || !cfd_connected ) {
    946         sfd = accept(afd, NULL, 0);
    947         if (sfd == -1 && errno != EAGAIN)
    948             goto out;
    949 
    950         if (!cfd_connected && connect(cfd, (struct sockaddr*)&sin, sizeof(sin)) < 0)
    951             goto out;
    952         else
    953             cfd_connected = 1;
    954     }
    955 
    956     if (set_nb(cfd) == -1 || set_nb(sfd) == -1)
    957         goto out;
    958     ret = 1;
    959     *cfdp = cfd;
    960     *sfdp = sfd;
    961     goto success;
    962 
    963 out:
    964     if (cfd != -1)
    965         close(cfd);
    966     if (sfd != -1)
    967         close(sfd);
    968 success:
    969     if (afd != -1)
    970         close(afd);
    971     return ret;
    972 }
    973 
    974 int create_ssl_objects2(SSL_CTX *serverctx, SSL_CTX *clientctx, SSL **sssl,
    975                           SSL **cssl, int sfd, int cfd)
    976 {
    977     SSL *serverssl = NULL, *clientssl = NULL;
    978     BIO *s_to_c_bio = NULL, *c_to_s_bio = NULL;
    979 
    980     if (*sssl != NULL)
    981         serverssl = *sssl;
    982     else if (!TEST_ptr(serverssl = SSL_new(serverctx)))
    983         goto error;
    984     if (*cssl != NULL)
    985         clientssl = *cssl;
    986     else if (!TEST_ptr(clientssl = SSL_new(clientctx)))
    987         goto error;
    988 
    989     if (!TEST_ptr(s_to_c_bio = BIO_new_socket(sfd, BIO_NOCLOSE))
    990             || !TEST_ptr(c_to_s_bio = BIO_new_socket(cfd, BIO_NOCLOSE)))
    991         goto error;
    992 
    993     SSL_set_bio(clientssl, c_to_s_bio, c_to_s_bio);
    994     SSL_set_bio(serverssl, s_to_c_bio, s_to_c_bio);
    995     *sssl = serverssl;
    996     *cssl = clientssl;
    997     return 1;
    998 
    999  error:
   1000     SSL_free(serverssl);
   1001     SSL_free(clientssl);
   1002     BIO_free(s_to_c_bio);
   1003     BIO_free(c_to_s_bio);
   1004     return 0;
   1005 }
   1006 #endif
   1007 
   1008 /*
   1009  * NOTE: Transfers control of the BIOs - this function will free them on error
   1010  */
   1011 int create_ssl_objects(SSL_CTX *serverctx, SSL_CTX *clientctx, SSL **sssl,
   1012                           SSL **cssl, BIO *s_to_c_fbio, BIO *c_to_s_fbio)
   1013 {
   1014     SSL *serverssl = NULL, *clientssl = NULL;
   1015     BIO *s_to_c_bio = NULL, *c_to_s_bio = NULL;
   1016 
   1017     if (*sssl != NULL)
   1018         serverssl = *sssl;
   1019     else if (!TEST_ptr(serverssl = SSL_new(serverctx)))
   1020         goto error;
   1021     if (*cssl != NULL)
   1022         clientssl = *cssl;
   1023     else if (!TEST_ptr(clientssl = SSL_new(clientctx)))
   1024         goto error;
   1025 
   1026     if (SSL_is_dtls(clientssl)) {
   1027         if (!TEST_ptr(s_to_c_bio = BIO_new(bio_s_mempacket_test()))
   1028                 || !TEST_ptr(c_to_s_bio = BIO_new(bio_s_mempacket_test())))
   1029             goto error;
   1030     } else {
   1031         if (!TEST_ptr(s_to_c_bio = BIO_new(BIO_s_mem()))
   1032                 || !TEST_ptr(c_to_s_bio = BIO_new(BIO_s_mem())))
   1033             goto error;
   1034     }
   1035 
   1036     if (s_to_c_fbio != NULL
   1037             && !TEST_ptr(s_to_c_bio = BIO_push(s_to_c_fbio, s_to_c_bio)))
   1038         goto error;
   1039     if (c_to_s_fbio != NULL
   1040             && !TEST_ptr(c_to_s_bio = BIO_push(c_to_s_fbio, c_to_s_bio)))
   1041         goto error;
   1042 
   1043     /* Set Non-blocking IO behaviour */
   1044     BIO_set_mem_eof_return(s_to_c_bio, -1);
   1045     BIO_set_mem_eof_return(c_to_s_bio, -1);
   1046 
   1047     /* Up ref these as we are passing them to two SSL objects */
   1048     SSL_set_bio(serverssl, c_to_s_bio, s_to_c_bio);
   1049     BIO_up_ref(s_to_c_bio);
   1050     BIO_up_ref(c_to_s_bio);
   1051     SSL_set_bio(clientssl, s_to_c_bio, c_to_s_bio);
   1052     *sssl = serverssl;
   1053     *cssl = clientssl;
   1054     return 1;
   1055 
   1056  error:
   1057     SSL_free(serverssl);
   1058     SSL_free(clientssl);
   1059     BIO_free(s_to_c_bio);
   1060     BIO_free(c_to_s_bio);
   1061     BIO_free(s_to_c_fbio);
   1062     BIO_free(c_to_s_fbio);
   1063 
   1064     return 0;
   1065 }
   1066 
   1067 /*
   1068  * Create an SSL connection, but does not read any post-handshake
   1069  * NewSessionTicket messages.
   1070  * If |read| is set and we're using DTLS then we will attempt to SSL_read on
   1071  * the connection once we've completed one half of it, to ensure any retransmits
   1072  * get triggered.
   1073  * We stop the connection attempt (and return a failure value) if either peer
   1074  * has SSL_get_error() return the value in the |want| parameter. The connection
   1075  * attempt could be restarted by a subsequent call to this function.
   1076  */
   1077 int create_bare_ssl_connection(SSL *serverssl, SSL *clientssl, int want,
   1078                                int read)
   1079 {
   1080     int retc = -1, rets = -1, err, abortctr = 0;
   1081     int clienterr = 0, servererr = 0;
   1082     int isdtls = SSL_is_dtls(serverssl);
   1083 
   1084     do {
   1085         err = SSL_ERROR_WANT_WRITE;
   1086         while (!clienterr && retc <= 0 && err == SSL_ERROR_WANT_WRITE) {
   1087             retc = SSL_connect(clientssl);
   1088             if (retc <= 0)
   1089                 err = SSL_get_error(clientssl, retc);
   1090         }
   1091 
   1092         if (!clienterr && retc <= 0 && err != SSL_ERROR_WANT_READ) {
   1093             TEST_info("SSL_connect() failed %d, %d", retc, err);
   1094             if (want != SSL_ERROR_SSL)
   1095                 TEST_openssl_errors();
   1096             clienterr = 1;
   1097         }
   1098         if (want != SSL_ERROR_NONE && err == want)
   1099             return 0;
   1100 
   1101         err = SSL_ERROR_WANT_WRITE;
   1102         while (!servererr && rets <= 0 && err == SSL_ERROR_WANT_WRITE) {
   1103             rets = SSL_accept(serverssl);
   1104             if (rets <= 0)
   1105                 err = SSL_get_error(serverssl, rets);
   1106         }
   1107 
   1108         if (!servererr && rets <= 0
   1109                 && err != SSL_ERROR_WANT_READ
   1110                 && err != SSL_ERROR_WANT_X509_LOOKUP) {
   1111             TEST_info("SSL_accept() failed %d, %d", rets, err);
   1112             if (want != SSL_ERROR_SSL)
   1113                 TEST_openssl_errors();
   1114             servererr = 1;
   1115         }
   1116         if (want != SSL_ERROR_NONE && err == want)
   1117             return 0;
   1118         if (clienterr && servererr)
   1119             return 0;
   1120         if (isdtls && read) {
   1121             unsigned char buf[20];
   1122 
   1123             /* Trigger any retransmits that may be appropriate */
   1124             if (rets > 0 && retc <= 0) {
   1125                 if (SSL_read(serverssl, buf, sizeof(buf)) > 0) {
   1126                     /* We don't expect this to succeed! */
   1127                     TEST_info("Unexpected SSL_read() success!");
   1128                     return 0;
   1129                 }
   1130             }
   1131             if (retc > 0 && rets <= 0) {
   1132                 if (SSL_read(clientssl, buf, sizeof(buf)) > 0) {
   1133                     /* We don't expect this to succeed! */
   1134                     TEST_info("Unexpected SSL_read() success!");
   1135                     return 0;
   1136                 }
   1137             }
   1138         }
   1139         if (++abortctr == MAXLOOPS) {
   1140             TEST_info("No progress made");
   1141             return 0;
   1142         }
   1143         if (isdtls && abortctr <= 50 && (abortctr % 10) == 0) {
   1144             /*
   1145              * It looks like we're just spinning. Pause for a short period to
   1146              * give the DTLS timer a chance to do something. We only do this for
   1147              * the first few times to prevent hangs.
   1148              */
   1149             ossl_sleep(50);
   1150         }
   1151     } while (retc <=0 || rets <= 0);
   1152 
   1153     return 1;
   1154 }
   1155 
   1156 /*
   1157  * Create an SSL connection including any post handshake NewSessionTicket
   1158  * messages.
   1159  */
   1160 int create_ssl_connection(SSL *serverssl, SSL *clientssl, int want)
   1161 {
   1162     int i;
   1163     unsigned char buf;
   1164     size_t readbytes;
   1165 
   1166     if (!create_bare_ssl_connection(serverssl, clientssl, want, 1))
   1167         return 0;
   1168 
   1169     /*
   1170      * We attempt to read some data on the client side which we expect to fail.
   1171      * This will ensure we have received the NewSessionTicket in TLSv1.3 where
   1172      * appropriate. We do this twice because there are 2 NewSessionTickets.
   1173      */
   1174     for (i = 0; i < 2; i++) {
   1175         if (SSL_read_ex(clientssl, &buf, sizeof(buf), &readbytes) > 0) {
   1176             if (!TEST_ulong_eq(readbytes, 0))
   1177                 return 0;
   1178         } else if (!TEST_int_eq(SSL_get_error(clientssl, 0),
   1179                                 SSL_ERROR_WANT_READ)) {
   1180             return 0;
   1181         }
   1182     }
   1183 
   1184     return 1;
   1185 }
   1186 
   1187 void shutdown_ssl_connection(SSL *serverssl, SSL *clientssl)
   1188 {
   1189     SSL_shutdown(clientssl);
   1190     SSL_shutdown(serverssl);
   1191     SSL_free(serverssl);
   1192     SSL_free(clientssl);
   1193 }
   1194 
   1195 ENGINE *load_dasync(void)
   1196 {
   1197 #if !defined(OPENSSL_NO_TLS1_2) && !defined(OPENSSL_NO_DYNAMIC_ENGINE)
   1198     ENGINE *e;
   1199 
   1200     if (!TEST_ptr(e = ENGINE_by_id("dasync")))
   1201         return NULL;
   1202 
   1203     if (!TEST_true(ENGINE_init(e))) {
   1204         ENGINE_free(e);
   1205         return NULL;
   1206     }
   1207 
   1208     if (!TEST_true(ENGINE_register_ciphers(e))) {
   1209         ENGINE_free(e);
   1210         return NULL;
   1211     }
   1212 
   1213     return e;
   1214 #else
   1215     return NULL;
   1216 #endif
   1217 }
   1218