xref: /freebsd/crypto/openssl/test/helpers/ssltestlib.c (revision 78e936b2d0b5e6554425009199be31e76bc67c10)
1 /*
2  * Copyright 2016-2026 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/e_os.h"
22 #include "internal/nelem.h"
23 #include "ssltestlib.h"
24 #include "../testutil.h"
25 
26 #if (!defined(OPENSSL_NO_KTLS) || !defined(OPENSSL_NO_QUIC)) && !defined(OPENSSL_NO_POSIX_IO) && !defined(OPENSSL_NO_SOCK)
27 #define OSSL_USE_SOCKETS 1
28 #include "internal/e_winsock.h"
29 #include "internal/sockets.h"
30 #include <openssl/bio.h>
31 #endif
32 
33 static int tls_dump_new(BIO *bi);
34 static int tls_dump_free(BIO *a);
35 static int tls_dump_read(BIO *b, char *out, int outl);
36 static int tls_dump_write(BIO *b, const char *in, int inl);
37 static long tls_dump_ctrl(BIO *b, int cmd, long num, void *ptr);
38 static int tls_dump_gets(BIO *bp, char *buf, int size);
39 static int tls_dump_puts(BIO *bp, const char *str);
40 
41 /* Choose a sufficiently large type likely to be unused for this custom BIO */
42 #define BIO_TYPE_TLS_DUMP_FILTER (0x80 | BIO_TYPE_FILTER)
43 #define BIO_TYPE_MEMPACKET_TEST 0x81
44 #define BIO_TYPE_ALWAYS_RETRY 0x82
45 #define BIO_TYPE_MAYBE_RETRY (0x83 | BIO_TYPE_FILTER)
46 #define BIO_TYPE_NO_RETRY_ZERO (0x84 | BIO_TYPE_FILTER)
47 
48 static BIO_METHOD *method_tls_dump = NULL;
49 static BIO_METHOD *meth_mem = NULL;
50 static BIO_METHOD *meth_always_retry = NULL;
51 static BIO_METHOD *meth_maybe_retry = NULL;
52 static BIO_METHOD *meth_no_retry_zero = NULL;
53 static int retry_err = -1;
54 
55 /* Note: Not thread safe! */
bio_f_tls_dump_filter(void)56 const BIO_METHOD *bio_f_tls_dump_filter(void)
57 {
58     if (method_tls_dump == NULL) {
59         method_tls_dump = BIO_meth_new(BIO_TYPE_TLS_DUMP_FILTER,
60             "TLS dump filter");
61         if (method_tls_dump == NULL
62             || !BIO_meth_set_write(method_tls_dump, tls_dump_write)
63             || !BIO_meth_set_read(method_tls_dump, tls_dump_read)
64             || !BIO_meth_set_puts(method_tls_dump, tls_dump_puts)
65             || !BIO_meth_set_gets(method_tls_dump, tls_dump_gets)
66             || !BIO_meth_set_ctrl(method_tls_dump, tls_dump_ctrl)
67             || !BIO_meth_set_create(method_tls_dump, tls_dump_new)
68             || !BIO_meth_set_destroy(method_tls_dump, tls_dump_free))
69             return NULL;
70     }
71     return method_tls_dump;
72 }
73 
bio_f_tls_dump_filter_free(void)74 void bio_f_tls_dump_filter_free(void)
75 {
76     BIO_meth_free(method_tls_dump);
77 }
78 
tls_dump_new(BIO * bio)79 static int tls_dump_new(BIO *bio)
80 {
81     BIO_set_init(bio, 1);
82     return 1;
83 }
84 
tls_dump_free(BIO * bio)85 static int tls_dump_free(BIO *bio)
86 {
87     BIO_set_init(bio, 0);
88 
89     return 1;
90 }
91 
copy_flags(BIO * bio)92 static void copy_flags(BIO *bio)
93 {
94     int flags;
95     BIO *next = BIO_next(bio);
96 
97     flags = BIO_test_flags(next, BIO_FLAGS_SHOULD_RETRY | BIO_FLAGS_RWS);
98     BIO_clear_flags(bio, BIO_FLAGS_SHOULD_RETRY | BIO_FLAGS_RWS);
99     BIO_set_flags(bio, flags);
100 }
101 
102 #define RECORD_CONTENT_TYPE 0
103 #define RECORD_VERSION_HI 1
104 #define RECORD_VERSION_LO 2
105 #define RECORD_EPOCH_HI 3
106 #define RECORD_EPOCH_LO 4
107 #define RECORD_SEQUENCE_START 5
108 #define RECORD_SEQUENCE_END 10
109 #define RECORD_LEN_HI 11
110 #define RECORD_LEN_LO 12
111 
112 #define MSG_TYPE 0
113 #define MSG_LEN_HI 1
114 #define MSG_LEN_MID 2
115 #define MSG_LEN_LO 3
116 #define MSG_SEQ_HI 4
117 #define MSG_SEQ_LO 5
118 #define MSG_FRAG_OFF_HI 6
119 #define MSG_FRAG_OFF_MID 7
120 #define MSG_FRAG_OFF_LO 8
121 #define MSG_FRAG_LEN_HI 9
122 #define MSG_FRAG_LEN_MID 10
123 #define MSG_FRAG_LEN_LO 11
124 
dump_data(const char * data,int len)125 static void dump_data(const char *data, int len)
126 {
127     int rem, i, content, reclen, msglen, fragoff, fraglen, epoch;
128     unsigned char *rec;
129 
130     printf("---- START OF PACKET ----\n");
131 
132     rem = len;
133     rec = (unsigned char *)data;
134 
135     while (rem > 0) {
136         if (rem != len)
137             printf("*\n");
138         printf("*---- START OF RECORD ----\n");
139         if (rem < DTLS1_RT_HEADER_LENGTH) {
140             printf("*---- RECORD TRUNCATED ----\n");
141             break;
142         }
143         content = rec[RECORD_CONTENT_TYPE];
144         printf("** Record Content-type: %d\n", content);
145         printf("** Record Version: %02x%02x\n",
146             rec[RECORD_VERSION_HI], rec[RECORD_VERSION_LO]);
147         epoch = (rec[RECORD_EPOCH_HI] << 8) | rec[RECORD_EPOCH_LO];
148         printf("** Record Epoch: %d\n", epoch);
149         printf("** Record Sequence: ");
150         for (i = RECORD_SEQUENCE_START; i <= RECORD_SEQUENCE_END; i++)
151             printf("%02x", rec[i]);
152         reclen = (rec[RECORD_LEN_HI] << 8) | rec[RECORD_LEN_LO];
153         printf("\n** Record Length: %d\n", reclen);
154 
155         /* Now look at message */
156         rec += DTLS1_RT_HEADER_LENGTH;
157         rem -= DTLS1_RT_HEADER_LENGTH;
158         if (content == SSL3_RT_HANDSHAKE) {
159             printf("**---- START OF HANDSHAKE MESSAGE FRAGMENT ----\n");
160             if (epoch > 0) {
161                 printf("**---- HANDSHAKE MESSAGE FRAGMENT ENCRYPTED ----\n");
162             } else if (rem < DTLS1_HM_HEADER_LENGTH
163                 || reclen < DTLS1_HM_HEADER_LENGTH) {
164                 printf("**---- HANDSHAKE MESSAGE FRAGMENT TRUNCATED ----\n");
165             } else {
166                 printf("*** Message Type: %d\n", rec[MSG_TYPE]);
167                 msglen = (rec[MSG_LEN_HI] << 16) | (rec[MSG_LEN_MID] << 8)
168                     | rec[MSG_LEN_LO];
169                 printf("*** Message Length: %d\n", msglen);
170                 printf("*** Message sequence: %d\n",
171                     (rec[MSG_SEQ_HI] << 8) | rec[MSG_SEQ_LO]);
172                 fragoff = (rec[MSG_FRAG_OFF_HI] << 16)
173                     | (rec[MSG_FRAG_OFF_MID] << 8)
174                     | rec[MSG_FRAG_OFF_LO];
175                 printf("*** Message Fragment offset: %d\n", fragoff);
176                 fraglen = (rec[MSG_FRAG_LEN_HI] << 16)
177                     | (rec[MSG_FRAG_LEN_MID] << 8)
178                     | rec[MSG_FRAG_LEN_LO];
179                 printf("*** Message Fragment len: %d\n", fraglen);
180                 if (fragoff + fraglen > msglen)
181                     printf("***---- HANDSHAKE MESSAGE FRAGMENT INVALID ----\n");
182                 else if (reclen < fraglen)
183                     printf("**---- HANDSHAKE MESSAGE FRAGMENT TRUNCATED ----\n");
184                 else
185                     printf("**---- END OF HANDSHAKE MESSAGE FRAGMENT ----\n");
186             }
187         }
188         if (rem < reclen) {
189             printf("*---- RECORD TRUNCATED ----\n");
190             rem = 0;
191         } else {
192             rec += reclen;
193             rem -= reclen;
194             printf("*---- END OF RECORD ----\n");
195         }
196     }
197     printf("---- END OF PACKET ----\n\n");
198     fflush(stdout);
199 }
200 
tls_dump_read(BIO * bio,char * out,int outl)201 static int tls_dump_read(BIO *bio, char *out, int outl)
202 {
203     int ret;
204     BIO *next = BIO_next(bio);
205 
206     ret = BIO_read(next, out, outl);
207     copy_flags(bio);
208 
209     if (ret > 0) {
210         dump_data(out, ret);
211     }
212 
213     return ret;
214 }
215 
tls_dump_write(BIO * bio,const char * in,int inl)216 static int tls_dump_write(BIO *bio, const char *in, int inl)
217 {
218     int ret;
219     BIO *next = BIO_next(bio);
220 
221     ret = BIO_write(next, in, inl);
222     copy_flags(bio);
223 
224     return ret;
225 }
226 
tls_dump_ctrl(BIO * bio,int cmd,long num,void * ptr)227 static long tls_dump_ctrl(BIO *bio, int cmd, long num, void *ptr)
228 {
229     long ret;
230     BIO *next = BIO_next(bio);
231 
232     if (next == NULL)
233         return 0;
234 
235     switch (cmd) {
236     case BIO_CTRL_DUP:
237         ret = 0L;
238         break;
239     default:
240         ret = BIO_ctrl(next, cmd, num, ptr);
241         break;
242     }
243     return ret;
244 }
245 
tls_dump_gets(BIO * bio,char * buf,int size)246 static int tls_dump_gets(BIO *bio, char *buf, int size)
247 {
248     /* We don't support this - not needed anyway */
249     return -1;
250 }
251 
tls_dump_puts(BIO * bio,const char * str)252 static int tls_dump_puts(BIO *bio, const char *str)
253 {
254     return tls_dump_write(bio, str, strlen(str));
255 }
256 
257 struct mempacket_st {
258     unsigned char *data;
259     int len;
260     unsigned int num;
261     unsigned int type;
262 };
263 
mempacket_free(MEMPACKET * pkt)264 static void mempacket_free(MEMPACKET *pkt)
265 {
266     if (pkt->data != NULL)
267         OPENSSL_free(pkt->data);
268     OPENSSL_free(pkt);
269 }
270 
271 typedef struct mempacket_test_ctx_st {
272     STACK_OF(MEMPACKET) *pkts;
273     uint16_t epoch;
274     unsigned int currrec;
275     unsigned int currpkt;
276     unsigned int lastpkt;
277     unsigned int injected;
278     unsigned int noinject;
279     unsigned int dropepoch;
280     int droprec;
281     int duprec;
282 } MEMPACKET_TEST_CTX;
283 
284 static int mempacket_test_new(BIO *bi);
285 static int mempacket_test_free(BIO *a);
286 static int mempacket_test_read(BIO *b, char *out, int outl);
287 static int mempacket_test_write(BIO *b, const char *in, int inl);
288 static long mempacket_test_ctrl(BIO *b, int cmd, long num, void *ptr);
289 static int mempacket_test_gets(BIO *bp, char *buf, int size);
290 static int mempacket_test_puts(BIO *bp, const char *str);
291 
bio_s_mempacket_test(void)292 const BIO_METHOD *bio_s_mempacket_test(void)
293 {
294     if (meth_mem == NULL) {
295         if (!TEST_ptr(meth_mem = BIO_meth_new(BIO_TYPE_MEMPACKET_TEST,
296                           "Mem Packet Test"))
297             || !TEST_true(BIO_meth_set_write(meth_mem, mempacket_test_write))
298             || !TEST_true(BIO_meth_set_read(meth_mem, mempacket_test_read))
299             || !TEST_true(BIO_meth_set_puts(meth_mem, mempacket_test_puts))
300             || !TEST_true(BIO_meth_set_gets(meth_mem, mempacket_test_gets))
301             || !TEST_true(BIO_meth_set_ctrl(meth_mem, mempacket_test_ctrl))
302             || !TEST_true(BIO_meth_set_create(meth_mem, mempacket_test_new))
303             || !TEST_true(BIO_meth_set_destroy(meth_mem, mempacket_test_free)))
304             return NULL;
305     }
306     return meth_mem;
307 }
308 
bio_s_mempacket_test_free(void)309 void bio_s_mempacket_test_free(void)
310 {
311     BIO_meth_free(meth_mem);
312 }
313 
mempacket_test_new(BIO * bio)314 static int mempacket_test_new(BIO *bio)
315 {
316     MEMPACKET_TEST_CTX *ctx;
317 
318     if (!TEST_ptr(ctx = OPENSSL_zalloc(sizeof(*ctx))))
319         return 0;
320     if (!TEST_ptr(ctx->pkts = sk_MEMPACKET_new_null())) {
321         OPENSSL_free(ctx);
322         return 0;
323     }
324     ctx->dropepoch = 0;
325     ctx->droprec = -1;
326     BIO_set_init(bio, 1);
327     BIO_set_data(bio, ctx);
328     return 1;
329 }
330 
mempacket_test_free(BIO * bio)331 static int mempacket_test_free(BIO *bio)
332 {
333     MEMPACKET_TEST_CTX *ctx = BIO_get_data(bio);
334 
335     sk_MEMPACKET_pop_free(ctx->pkts, mempacket_free);
336     OPENSSL_free(ctx);
337     BIO_set_data(bio, NULL);
338     BIO_set_init(bio, 0);
339     return 1;
340 }
341 
342 /* Record Header values */
343 #define EPOCH_HI 3
344 #define EPOCH_LO 4
345 #define RECORD_SEQUENCE 10
346 #define RECORD_LEN_HI 11
347 #define RECORD_LEN_LO 12
348 
349 #define STANDARD_PACKET 0
350 
mempacket_test_read(BIO * bio,char * out,int outl)351 static int mempacket_test_read(BIO *bio, char *out, int outl)
352 {
353     MEMPACKET_TEST_CTX *ctx = BIO_get_data(bio);
354     MEMPACKET *thispkt;
355     unsigned char *rec;
356     int rem;
357     unsigned int seq, offset, len, epoch;
358 
359     BIO_clear_retry_flags(bio);
360     if ((thispkt = sk_MEMPACKET_value(ctx->pkts, 0)) == NULL
361         || thispkt->num != ctx->currpkt) {
362         /* Probably run out of data */
363         BIO_set_retry_read(bio);
364         return -1;
365     }
366     (void)sk_MEMPACKET_shift(ctx->pkts);
367     ctx->currpkt++;
368 
369     if (outl > thispkt->len)
370         outl = thispkt->len;
371 
372     if (thispkt->type != INJECT_PACKET_IGNORE_REC_SEQ
373         && (ctx->injected || ctx->droprec >= 0)) {
374         /*
375          * Overwrite the record sequence number. We strictly number them in
376          * the order received. Since we are actually a reliable transport
377          * we know that there won't be any re-ordering. We overwrite to deal
378          * with any packets that have been injected
379          */
380         for (rem = thispkt->len, rec = thispkt->data; rem > 0; rem -= len) {
381             if (rem < DTLS1_RT_HEADER_LENGTH)
382                 return -1;
383             epoch = (rec[EPOCH_HI] << 8) | rec[EPOCH_LO];
384             if (epoch != ctx->epoch) {
385                 ctx->epoch = epoch;
386                 ctx->currrec = 0;
387             }
388             seq = ctx->currrec;
389             offset = 0;
390             do {
391                 rec[RECORD_SEQUENCE - offset] = seq & 0xFF;
392                 seq >>= 8;
393                 offset++;
394             } while (seq > 0);
395 
396             len = ((rec[RECORD_LEN_HI] << 8) | rec[RECORD_LEN_LO])
397                 + DTLS1_RT_HEADER_LENGTH;
398             if (rem < (int)len)
399                 return -1;
400             if (ctx->droprec == (int)ctx->currrec && ctx->dropepoch == epoch) {
401                 if (rem > (int)len)
402                     memmove(rec, rec + len, rem - len);
403                 outl -= len;
404                 ctx->droprec = -1;
405                 if (outl == 0)
406                     BIO_set_retry_read(bio);
407             } else {
408                 rec += len;
409             }
410 
411             ctx->currrec++;
412         }
413     }
414 
415     memcpy(out, thispkt->data, outl);
416     mempacket_free(thispkt);
417     return outl;
418 }
419 
420 /*
421  * Look for records from different epochs in the last datagram and swap them
422  * around
423  */
mempacket_swap_epoch(BIO * bio)424 int mempacket_swap_epoch(BIO *bio)
425 {
426     MEMPACKET_TEST_CTX *ctx = BIO_get_data(bio);
427     MEMPACKET *thispkt;
428     int rem, len, prevlen = 0, pktnum;
429     unsigned char *rec, *prevrec = NULL, *tmp;
430     unsigned int epoch;
431     int numpkts = sk_MEMPACKET_num(ctx->pkts);
432 
433     if (numpkts <= 0)
434         return 0;
435 
436     /*
437      * If there are multiple packets we only look in the last one. This should
438      * always be the one where any epoch change occurs.
439      */
440     thispkt = sk_MEMPACKET_value(ctx->pkts, numpkts - 1);
441     if (thispkt == NULL)
442         return 0;
443 
444     for (rem = thispkt->len, rec = thispkt->data; rem > 0; rem -= len, rec += len) {
445         if (rem < DTLS1_RT_HEADER_LENGTH)
446             return 0;
447         epoch = (rec[EPOCH_HI] << 8) | rec[EPOCH_LO];
448         len = ((rec[RECORD_LEN_HI] << 8) | rec[RECORD_LEN_LO])
449             + DTLS1_RT_HEADER_LENGTH;
450         if (rem < len)
451             return 0;
452 
453         /* Assumes the epoch change does not happen on the first record */
454         if (epoch != ctx->epoch) {
455             if (prevrec == NULL)
456                 return 0;
457 
458             /*
459              * We found 2 records with different epochs. Take a copy of the
460              * earlier record
461              */
462             tmp = OPENSSL_malloc(prevlen);
463             if (tmp == NULL)
464                 return 0;
465 
466             memcpy(tmp, prevrec, prevlen);
467             /*
468              * Move everything from this record onwards, including any trailing
469              * records, and overwrite the earlier record
470              */
471             memmove(prevrec, rec, rem);
472             thispkt->len -= prevlen;
473             pktnum = thispkt->num;
474 
475             /*
476              * Create a new packet for the earlier record that we took out and
477              * add it to the end of the packet list.
478              */
479             thispkt = OPENSSL_malloc(sizeof(*thispkt));
480             if (thispkt == NULL) {
481                 OPENSSL_free(tmp);
482                 return 0;
483             }
484             thispkt->type = INJECT_PACKET;
485             thispkt->data = tmp;
486             thispkt->len = prevlen;
487             thispkt->num = pktnum + 1;
488             if (sk_MEMPACKET_insert(ctx->pkts, thispkt, numpkts) <= 0) {
489                 OPENSSL_free(tmp);
490                 OPENSSL_free(thispkt);
491                 return 0;
492             }
493 
494             return 1;
495         }
496         prevrec = rec;
497         prevlen = len;
498     }
499 
500     return 0;
501 }
502 
503 /* Move packet from position s to position d in the list (d < s) */
mempacket_move_packet(BIO * bio,int d,int s)504 int mempacket_move_packet(BIO *bio, int d, int s)
505 {
506     MEMPACKET_TEST_CTX *ctx = BIO_get_data(bio);
507     MEMPACKET *thispkt;
508     int numpkts = sk_MEMPACKET_num(ctx->pkts);
509     int i;
510 
511     if (d >= s)
512         return 0;
513 
514     /* We need at least s + 1 packets to be able to swap them */
515     if (numpkts <= s)
516         return 0;
517 
518     /* Get the packet at position s */
519     thispkt = sk_MEMPACKET_value(ctx->pkts, s);
520     if (thispkt == NULL)
521         return 0;
522 
523     /* Remove and re-add it */
524     if (sk_MEMPACKET_delete(ctx->pkts, s) != thispkt)
525         return 0;
526 
527     thispkt->num -= (s - d);
528     if (sk_MEMPACKET_insert(ctx->pkts, thispkt, d) <= 0)
529         return 0;
530 
531     /* Increment the packet numbers for moved packets */
532     for (i = d + 1; i <= s; i++) {
533         thispkt = sk_MEMPACKET_value(ctx->pkts, i);
534         thispkt->num++;
535     }
536     return 1;
537 }
538 
mempacket_dup_last_packet(BIO * bio)539 int mempacket_dup_last_packet(BIO *bio)
540 {
541     MEMPACKET_TEST_CTX *ctx = BIO_get_data(bio);
542     MEMPACKET *thispkt, *duppkt;
543     int numpkts = sk_MEMPACKET_num(ctx->pkts);
544 
545     /* We can only duplicate a packet if there is at least 1 pending */
546     if (numpkts <= 0)
547         return 0;
548 
549     /* Get the last packet */
550     thispkt = sk_MEMPACKET_value(ctx->pkts, numpkts - 1);
551     if (thispkt == NULL)
552         return 0;
553 
554     duppkt = OPENSSL_malloc(sizeof(*duppkt));
555     if (duppkt == NULL)
556         return 0;
557 
558     *duppkt = *thispkt;
559     duppkt->data = OPENSSL_memdup(thispkt->data, thispkt->len);
560     if (duppkt->data == NULL) {
561         mempacket_free(duppkt);
562         return 0;
563     }
564     duppkt->num++;
565     if (sk_MEMPACKET_insert(ctx->pkts, duppkt, numpkts) <= 0) {
566         mempacket_free(duppkt);
567         return 0;
568     }
569 
570     return 1;
571 }
572 
mempacket_test_inject(BIO * bio,const char * in,int inl,int pktnum,int type)573 int mempacket_test_inject(BIO *bio, const char *in, int inl, int pktnum,
574     int type)
575 {
576     MEMPACKET_TEST_CTX *ctx = BIO_get_data(bio);
577     MEMPACKET *thispkt = NULL, *looppkt, *nextpkt, *allpkts[3];
578     int i, duprec;
579     const unsigned char *inu = (const unsigned char *)in;
580     size_t len = ((inu[RECORD_LEN_HI] << 8) | inu[RECORD_LEN_LO])
581         + DTLS1_RT_HEADER_LENGTH;
582 
583     if (ctx == NULL)
584         return -1;
585 
586     if ((size_t)inl < len)
587         return -1;
588 
589     if ((size_t)inl == len)
590         duprec = 0;
591     else
592         duprec = ctx->duprec > 0;
593 
594     /* We don't support arbitrary injection when duplicating records */
595     if (duprec && pktnum != -1)
596         return -1;
597 
598     /* We only allow injection before we've started writing any data */
599     if (pktnum >= 0) {
600         if (ctx->noinject)
601             return -1;
602         ctx->injected = 1;
603     } else {
604         ctx->noinject = 1;
605     }
606 
607     for (i = 0; i < (duprec ? 3 : 1); i++) {
608         if (!TEST_ptr(allpkts[i] = OPENSSL_malloc(sizeof(*thispkt))))
609             goto err;
610         thispkt = allpkts[i];
611 
612         if (!TEST_ptr(thispkt->data = OPENSSL_malloc(inl)))
613             goto err;
614         /*
615          * If we are duplicating the packet, we duplicate it three times. The
616          * first two times we drop the first record if there are more than one.
617          * In this way we know that libssl will not be able to make progress
618          * until it receives the last packet, and hence will be forced to
619          * buffer these records.
620          */
621         if (duprec && i != 2) {
622             memcpy(thispkt->data, in + len, inl - len);
623             thispkt->len = inl - len;
624         } else {
625             memcpy(thispkt->data, in, inl);
626             thispkt->len = inl;
627         }
628         thispkt->num = (pktnum >= 0) ? (unsigned int)pktnum : ctx->lastpkt + i;
629         thispkt->type = type;
630     }
631 
632     for (i = 0; i < sk_MEMPACKET_num(ctx->pkts); i++) {
633         if (!TEST_ptr(looppkt = sk_MEMPACKET_value(ctx->pkts, i)))
634             goto err;
635         /* Check if we found the right place to insert this packet */
636         if (looppkt->num > thispkt->num) {
637             if (sk_MEMPACKET_insert(ctx->pkts, thispkt, i) == 0)
638                 goto err;
639             /* If we're doing up front injection then we're done */
640             if (pktnum >= 0)
641                 return inl;
642             /*
643              * We need to do some accounting on lastpkt. We increment it first,
644              * but it might now equal the value of injected packets, so we need
645              * to skip over those
646              */
647             ctx->lastpkt++;
648             do {
649                 i++;
650                 nextpkt = sk_MEMPACKET_value(ctx->pkts, i);
651                 if (nextpkt != NULL && nextpkt->num == ctx->lastpkt)
652                     ctx->lastpkt++;
653                 else
654                     return inl;
655             } while (1);
656         } else if (looppkt->num == thispkt->num) {
657             if (!ctx->noinject) {
658                 /* We injected two packets with the same packet number! */
659                 goto err;
660             }
661             ctx->lastpkt++;
662             thispkt->num++;
663         }
664     }
665     /*
666      * We didn't find any packets with a packet number equal to or greater than
667      * this one, so we just add it onto the end
668      */
669     for (i = 0; i < (duprec ? 3 : 1); i++) {
670         thispkt = allpkts[i];
671         if (!sk_MEMPACKET_push(ctx->pkts, thispkt))
672             goto err;
673 
674         if (pktnum < 0)
675             ctx->lastpkt++;
676     }
677 
678     return inl;
679 
680 err:
681     for (i = 0; i < (ctx->duprec > 0 ? 3 : 1); i++)
682         mempacket_free(allpkts[i]);
683     return -1;
684 }
685 
mempacket_test_write(BIO * bio,const char * in,int inl)686 static int mempacket_test_write(BIO *bio, const char *in, int inl)
687 {
688     return mempacket_test_inject(bio, in, inl, -1, STANDARD_PACKET);
689 }
690 
mempacket_test_ctrl(BIO * bio,int cmd,long num,void * ptr)691 static long mempacket_test_ctrl(BIO *bio, int cmd, long num, void *ptr)
692 {
693     long ret = 1;
694     MEMPACKET_TEST_CTX *ctx = BIO_get_data(bio);
695     MEMPACKET *thispkt;
696 
697     switch (cmd) {
698     case BIO_CTRL_EOF:
699         ret = (long)(sk_MEMPACKET_num(ctx->pkts) == 0);
700         break;
701     case BIO_CTRL_GET_CLOSE:
702         ret = BIO_get_shutdown(bio);
703         break;
704     case BIO_CTRL_SET_CLOSE:
705         BIO_set_shutdown(bio, (int)num);
706         break;
707     case BIO_CTRL_WPENDING:
708         ret = 0L;
709         break;
710     case BIO_CTRL_PENDING:
711         thispkt = sk_MEMPACKET_value(ctx->pkts, 0);
712         if (thispkt == NULL)
713             ret = 0;
714         else
715             ret = thispkt->len;
716         break;
717     case BIO_CTRL_FLUSH:
718         ret = 1;
719         break;
720     case MEMPACKET_CTRL_SET_DROP_EPOCH:
721         ctx->dropepoch = (unsigned int)num;
722         break;
723     case MEMPACKET_CTRL_SET_DROP_REC:
724         ctx->droprec = (int)num;
725         break;
726     case MEMPACKET_CTRL_GET_DROP_REC:
727         ret = ctx->droprec;
728         break;
729     case MEMPACKET_CTRL_SET_DUPLICATE_REC:
730         ctx->duprec = (int)num;
731         break;
732     case BIO_CTRL_RESET:
733     case BIO_CTRL_DUP:
734     case BIO_CTRL_PUSH:
735     case BIO_CTRL_POP:
736     default:
737         ret = 0;
738         break;
739     }
740     return ret;
741 }
742 
mempacket_test_gets(BIO * bio,char * buf,int size)743 static int mempacket_test_gets(BIO *bio, char *buf, int size)
744 {
745     /* We don't support this - not needed anyway */
746     return -1;
747 }
748 
mempacket_test_puts(BIO * bio,const char * str)749 static int mempacket_test_puts(BIO *bio, const char *str)
750 {
751     return mempacket_test_write(bio, str, strlen(str));
752 }
753 
754 static int always_retry_new(BIO *bi);
755 static int always_retry_free(BIO *a);
756 static int always_retry_read(BIO *b, char *out, int outl);
757 static int always_retry_write(BIO *b, const char *in, int inl);
758 static long always_retry_ctrl(BIO *b, int cmd, long num, void *ptr);
759 static int always_retry_gets(BIO *bp, char *buf, int size);
760 static int always_retry_puts(BIO *bp, const char *str);
761 
bio_s_always_retry(void)762 const BIO_METHOD *bio_s_always_retry(void)
763 {
764     if (meth_always_retry == NULL) {
765         if (!TEST_ptr(meth_always_retry = BIO_meth_new(BIO_TYPE_ALWAYS_RETRY,
766                           "Always Retry"))
767             || !TEST_true(BIO_meth_set_write(meth_always_retry,
768                 always_retry_write))
769             || !TEST_true(BIO_meth_set_read(meth_always_retry,
770                 always_retry_read))
771             || !TEST_true(BIO_meth_set_puts(meth_always_retry,
772                 always_retry_puts))
773             || !TEST_true(BIO_meth_set_gets(meth_always_retry,
774                 always_retry_gets))
775             || !TEST_true(BIO_meth_set_ctrl(meth_always_retry,
776                 always_retry_ctrl))
777             || !TEST_true(BIO_meth_set_create(meth_always_retry,
778                 always_retry_new))
779             || !TEST_true(BIO_meth_set_destroy(meth_always_retry,
780                 always_retry_free)))
781             return NULL;
782     }
783     return meth_always_retry;
784 }
785 
bio_s_always_retry_free(void)786 void bio_s_always_retry_free(void)
787 {
788     BIO_meth_free(meth_always_retry);
789 }
790 
always_retry_new(BIO * bio)791 static int always_retry_new(BIO *bio)
792 {
793     BIO_set_init(bio, 1);
794     return 1;
795 }
796 
always_retry_free(BIO * bio)797 static int always_retry_free(BIO *bio)
798 {
799     BIO_set_data(bio, NULL);
800     BIO_set_init(bio, 0);
801     return 1;
802 }
803 
set_always_retry_err_val(int err)804 void set_always_retry_err_val(int err)
805 {
806     retry_err = err;
807 }
808 
always_retry_read(BIO * bio,char * out,int outl)809 static int always_retry_read(BIO *bio, char *out, int outl)
810 {
811     BIO_set_retry_read(bio);
812     return retry_err;
813 }
814 
always_retry_write(BIO * bio,const char * in,int inl)815 static int always_retry_write(BIO *bio, const char *in, int inl)
816 {
817     BIO_set_retry_write(bio);
818     return retry_err;
819 }
820 
always_retry_ctrl(BIO * bio,int cmd,long num,void * ptr)821 static long always_retry_ctrl(BIO *bio, int cmd, long num, void *ptr)
822 {
823     long ret = 1;
824 
825     switch (cmd) {
826     case BIO_CTRL_FLUSH:
827         BIO_set_retry_write(bio);
828         /* fall through */
829     case BIO_CTRL_EOF:
830     case BIO_CTRL_RESET:
831     case BIO_CTRL_DUP:
832     case BIO_CTRL_PUSH:
833     case BIO_CTRL_POP:
834     default:
835         ret = 0;
836         break;
837     }
838     return ret;
839 }
840 
always_retry_gets(BIO * bio,char * buf,int size)841 static int always_retry_gets(BIO *bio, char *buf, int size)
842 {
843     BIO_set_retry_read(bio);
844     return retry_err;
845 }
846 
always_retry_puts(BIO * bio,const char * str)847 static int always_retry_puts(BIO *bio, const char *str)
848 {
849     BIO_set_retry_write(bio);
850     return retry_err;
851 }
852 
853 struct maybe_retry_data_st {
854     unsigned int retrycnt;
855 };
856 
857 static int maybe_retry_new(BIO *bi);
858 static int maybe_retry_free(BIO *a);
859 static int maybe_retry_write(BIO *b, const char *in, int inl);
860 static long maybe_retry_ctrl(BIO *b, int cmd, long num, void *ptr);
861 static int no_retry_zero_new(BIO *bi);
862 static int no_retry_zero_free(BIO *a);
863 static int no_retry_zero_write(BIO *b, const char *in, int inl);
864 static long no_retry_zero_ctrl(BIO *b, int cmd, long num, void *ptr);
865 
bio_s_maybe_retry(void)866 const BIO_METHOD *bio_s_maybe_retry(void)
867 {
868     if (meth_maybe_retry == NULL) {
869         if (!TEST_ptr(meth_maybe_retry = BIO_meth_new(BIO_TYPE_MAYBE_RETRY,
870                           "Maybe Retry"))
871             || !TEST_true(BIO_meth_set_write(meth_maybe_retry,
872                 maybe_retry_write))
873             || !TEST_true(BIO_meth_set_ctrl(meth_maybe_retry,
874                 maybe_retry_ctrl))
875             || !TEST_true(BIO_meth_set_create(meth_maybe_retry,
876                 maybe_retry_new))
877             || !TEST_true(BIO_meth_set_destroy(meth_maybe_retry,
878                 maybe_retry_free)))
879             return NULL;
880     }
881     return meth_maybe_retry;
882 }
883 
bio_s_maybe_retry_free(void)884 void bio_s_maybe_retry_free(void)
885 {
886     BIO_meth_free(meth_maybe_retry);
887 }
888 
maybe_retry_new(BIO * bio)889 static int maybe_retry_new(BIO *bio)
890 {
891     struct maybe_retry_data_st *data = OPENSSL_zalloc(sizeof(*data));
892 
893     if (data == NULL)
894         return 0;
895 
896     BIO_set_data(bio, data);
897     BIO_set_init(bio, 1);
898     return 1;
899 }
900 
maybe_retry_free(BIO * bio)901 static int maybe_retry_free(BIO *bio)
902 {
903     struct maybe_retry_data_st *data = BIO_get_data(bio);
904 
905     OPENSSL_free(data);
906     BIO_set_data(bio, NULL);
907     BIO_set_init(bio, 0);
908     return 1;
909 }
910 
maybe_retry_write(BIO * bio,const char * in,int inl)911 static int maybe_retry_write(BIO *bio, const char *in, int inl)
912 {
913     struct maybe_retry_data_st *data = BIO_get_data(bio);
914 
915     if (data == NULL)
916         return -1;
917 
918     if (data->retrycnt == 0) {
919         BIO_set_retry_write(bio);
920         return -1;
921     }
922     data->retrycnt--;
923 
924     return BIO_write(BIO_next(bio), in, inl);
925 }
926 
maybe_retry_ctrl(BIO * bio,int cmd,long num,void * ptr)927 static long maybe_retry_ctrl(BIO *bio, int cmd, long num, void *ptr)
928 {
929     struct maybe_retry_data_st *data = BIO_get_data(bio);
930 
931     if (data == NULL)
932         return 0;
933 
934     switch (cmd) {
935     case MAYBE_RETRY_CTRL_SET_RETRY_AFTER_CNT:
936         data->retrycnt = num;
937         return 1;
938 
939     case BIO_CTRL_FLUSH:
940         if (data->retrycnt == 0) {
941             BIO_set_retry_write(bio);
942             return -1;
943         }
944         data->retrycnt--;
945         /* fall through */
946     default:
947         return BIO_ctrl(BIO_next(bio), cmd, num, ptr);
948     }
949 }
950 
bio_s_no_retry_zero(void)951 const BIO_METHOD *bio_s_no_retry_zero(void)
952 {
953     if (meth_no_retry_zero == NULL) {
954         if (!TEST_ptr(meth_no_retry_zero = BIO_meth_new(BIO_TYPE_NO_RETRY_ZERO,
955                           "No Retry Zero"))
956             || !TEST_true(BIO_meth_set_write(meth_no_retry_zero,
957                 no_retry_zero_write))
958             || !TEST_true(BIO_meth_set_ctrl(meth_no_retry_zero,
959                 no_retry_zero_ctrl))
960             || !TEST_true(BIO_meth_set_create(meth_no_retry_zero,
961                 no_retry_zero_new))
962             || !TEST_true(BIO_meth_set_destroy(meth_no_retry_zero,
963                 no_retry_zero_free)))
964             return NULL;
965     }
966     return meth_no_retry_zero;
967 }
968 
bio_s_no_retry_zero_free(void)969 void bio_s_no_retry_zero_free(void)
970 {
971     BIO_meth_free(meth_no_retry_zero);
972 }
973 
no_retry_zero_new(BIO * bio)974 static int no_retry_zero_new(BIO *bio)
975 {
976     BIO_set_init(bio, 1);
977     return 1;
978 }
979 
no_retry_zero_free(BIO * bio)980 static int no_retry_zero_free(BIO *bio)
981 {
982     BIO_set_data(bio, NULL);
983     BIO_set_init(bio, 0);
984     return 1;
985 }
986 
no_retry_zero_write(BIO * bio,const char * in,int inl)987 static int no_retry_zero_write(BIO *bio, const char *in, int inl)
988 {
989     BIO_clear_retry_flags(bio);
990     return 0;
991 }
992 
no_retry_zero_ctrl(BIO * bio,int cmd,long num,void * ptr)993 static long no_retry_zero_ctrl(BIO *bio, int cmd, long num, void *ptr)
994 {
995     BIO *next = BIO_next(bio);
996 
997     switch (cmd) {
998     case BIO_CTRL_FLUSH:
999         return next == NULL ? 1 : BIO_ctrl(next, cmd, num, ptr);
1000 
1001     default:
1002         return next == NULL ? 0 : BIO_ctrl(next, cmd, num, ptr);
1003     }
1004 }
1005 
create_ssl_ctx_pair(OSSL_LIB_CTX * libctx,const SSL_METHOD * sm,const SSL_METHOD * cm,int min_proto_version,int max_proto_version,SSL_CTX ** sctx,SSL_CTX ** cctx,char * certfile,char * privkeyfile)1006 int create_ssl_ctx_pair(OSSL_LIB_CTX *libctx, const SSL_METHOD *sm,
1007     const SSL_METHOD *cm, int min_proto_version,
1008     int max_proto_version, SSL_CTX **sctx, SSL_CTX **cctx,
1009     char *certfile, char *privkeyfile)
1010 {
1011     SSL_CTX *serverctx = NULL;
1012     SSL_CTX *clientctx = NULL;
1013 
1014     if (sctx != NULL) {
1015         if (*sctx != NULL)
1016             serverctx = *sctx;
1017         else if (!TEST_ptr(serverctx = SSL_CTX_new_ex(libctx, NULL, sm))
1018             || !TEST_true(SSL_CTX_set_options(serverctx,
1019                 SSL_OP_ALLOW_CLIENT_RENEGOTIATION)))
1020             goto err;
1021     }
1022 
1023     if (cctx != NULL) {
1024         if (*cctx != NULL)
1025             clientctx = *cctx;
1026         else if (!TEST_ptr(clientctx = SSL_CTX_new_ex(libctx, NULL, cm)))
1027             goto err;
1028     }
1029 
1030 #if !defined(OPENSSL_NO_TLS1_3) \
1031     && defined(OPENSSL_NO_EC)   \
1032     && defined(OPENSSL_NO_DH)
1033     /*
1034      * There are no usable built-in TLSv1.3 groups if ec and dh are both
1035      * disabled
1036      */
1037     if (max_proto_version == 0
1038         && (sm == TLS_server_method() || cm == TLS_client_method()))
1039         max_proto_version = TLS1_2_VERSION;
1040 #endif
1041 
1042     if (serverctx != NULL
1043         && ((min_proto_version > 0
1044                 && !TEST_true(SSL_CTX_set_min_proto_version(serverctx,
1045                     min_proto_version)))
1046             || (max_proto_version > 0
1047                 && !TEST_true(SSL_CTX_set_max_proto_version(serverctx,
1048                     max_proto_version)))))
1049         goto err;
1050     if (clientctx != NULL
1051         && ((min_proto_version > 0
1052                 && !TEST_true(SSL_CTX_set_min_proto_version(clientctx,
1053                     min_proto_version)))
1054             || (max_proto_version > 0
1055                 && !TEST_true(SSL_CTX_set_max_proto_version(clientctx,
1056                     max_proto_version)))))
1057         goto err;
1058 
1059     if (serverctx != NULL && certfile != NULL && privkeyfile != NULL) {
1060         if (!TEST_int_eq(SSL_CTX_use_certificate_file(serverctx, certfile,
1061                              SSL_FILETYPE_PEM),
1062                 1)
1063             || !TEST_int_eq(SSL_CTX_use_PrivateKey_file(serverctx,
1064                                 privkeyfile,
1065                                 SSL_FILETYPE_PEM),
1066                 1)
1067             || !TEST_int_eq(SSL_CTX_check_private_key(serverctx), 1))
1068             goto err;
1069     }
1070 
1071     if (sctx != NULL)
1072         *sctx = serverctx;
1073     if (cctx != NULL)
1074         *cctx = clientctx;
1075     return 1;
1076 
1077 err:
1078     if (sctx != NULL && *sctx == NULL)
1079         SSL_CTX_free(serverctx);
1080     if (cctx != NULL && *cctx == NULL)
1081         SSL_CTX_free(clientctx);
1082     return 0;
1083 }
1084 
1085 #define MAXLOOPS 1000000
1086 
1087 #if defined(OSSL_USE_SOCKETS)
1088 
wait_until_sock_readable(int sock)1089 int wait_until_sock_readable(int sock)
1090 {
1091     fd_set readfds;
1092     struct timeval timeout;
1093     int width;
1094 
1095     width = sock + 1;
1096     FD_ZERO(&readfds);
1097     openssl_fdset(sock, &readfds);
1098     timeout.tv_sec = 10; /* give up after 10 seconds */
1099     timeout.tv_usec = 0;
1100 
1101     select(width, &readfds, NULL, NULL, &timeout);
1102 
1103     return FD_ISSET(sock, &readfds);
1104 }
1105 
create_test_sockets(int * cfdp,int * sfdp,int socktype,BIO_ADDR * saddr)1106 int create_test_sockets(int *cfdp, int *sfdp, int socktype, BIO_ADDR *saddr)
1107 {
1108     struct sockaddr_in sin;
1109     const char *host = "127.0.0.1";
1110     int cfd_connected = 0, ret = 0;
1111     socklen_t slen = sizeof(sin);
1112     int afd = -1, cfd = -1, sfd = -1;
1113 
1114     memset((char *)&sin, 0, sizeof(sin));
1115     sin.sin_family = AF_INET;
1116     sin.sin_addr.s_addr = inet_addr(host);
1117 
1118     afd = BIO_socket(AF_INET, socktype,
1119         socktype == SOCK_STREAM ? IPPROTO_TCP : IPPROTO_UDP, 0);
1120     if (afd == INVALID_SOCKET)
1121         return 0;
1122 
1123     if (bind(afd, (struct sockaddr *)&sin, sizeof(sin)) < 0)
1124         goto out;
1125 
1126     if (getsockname(afd, (struct sockaddr *)&sin, &slen) < 0)
1127         goto out;
1128 
1129     if (saddr != NULL
1130         && !BIO_ADDR_rawmake(saddr, sin.sin_family, &sin.sin_addr,
1131             sizeof(sin.sin_addr), sin.sin_port))
1132         goto out;
1133 
1134     if (socktype == SOCK_STREAM && listen(afd, 1) < 0)
1135         goto out;
1136 
1137     cfd = BIO_socket(AF_INET, socktype,
1138         socktype == SOCK_STREAM ? IPPROTO_TCP : IPPROTO_UDP, 0);
1139     if (cfd == INVALID_SOCKET)
1140         goto out;
1141 
1142     if (!BIO_socket_nbio(afd, 1))
1143         goto out;
1144 
1145     /*
1146      * If a DGRAM socket then we don't call "accept" or "connect" - so act like
1147      * we already called them.
1148      */
1149     if (socktype == SOCK_DGRAM) {
1150         cfd_connected = 1;
1151         sfd = afd;
1152         afd = -1;
1153     }
1154 
1155     while (sfd == -1 || !cfd_connected) {
1156         sfd = accept(afd, NULL, 0);
1157         if (sfd == -1 && errno != EAGAIN)
1158             goto out;
1159 
1160         if (!cfd_connected && connect(cfd, (struct sockaddr *)&sin, sizeof(sin)) < 0)
1161             goto out;
1162         else
1163             cfd_connected = 1;
1164     }
1165 
1166     if (!BIO_socket_nbio(cfd, 1) || !BIO_socket_nbio(sfd, 1))
1167         goto out;
1168     ret = 1;
1169     *cfdp = cfd;
1170     *sfdp = sfd;
1171     goto success;
1172 
1173 out:
1174     if (cfd != -1)
1175         close(cfd);
1176     if (sfd != -1)
1177         close(sfd);
1178 success:
1179     if (afd != -1)
1180         close(afd);
1181     return ret;
1182 }
1183 
create_ssl_objects2(SSL_CTX * serverctx,SSL_CTX * clientctx,SSL ** sssl,SSL ** cssl,int sfd,int cfd)1184 int create_ssl_objects2(SSL_CTX *serverctx, SSL_CTX *clientctx, SSL **sssl,
1185     SSL **cssl, int sfd, int cfd)
1186 {
1187     SSL *serverssl = NULL, *clientssl = NULL;
1188     BIO *s_to_c_bio = NULL, *c_to_s_bio = NULL;
1189     BIO_POLL_DESCRIPTOR rdesc = { 0 }, wdesc = { 0 };
1190 
1191     if (*sssl != NULL)
1192         serverssl = *sssl;
1193     else if (!TEST_ptr(serverssl = SSL_new(serverctx)))
1194         goto error;
1195     if (*cssl != NULL)
1196         clientssl = *cssl;
1197     else if (!TEST_ptr(clientssl = SSL_new(clientctx)))
1198         goto error;
1199 
1200     if (!TEST_ptr(s_to_c_bio = BIO_new_socket(sfd, BIO_NOCLOSE))
1201         || !TEST_ptr(c_to_s_bio = BIO_new_socket(cfd, BIO_NOCLOSE)))
1202         goto error;
1203 
1204     if (!TEST_false(SSL_get_rpoll_descriptor(clientssl, &rdesc)
1205             || !TEST_false(SSL_get_wpoll_descriptor(clientssl, &wdesc))))
1206         goto error;
1207 
1208     SSL_set_bio(clientssl, c_to_s_bio, c_to_s_bio);
1209     SSL_set_bio(serverssl, s_to_c_bio, s_to_c_bio);
1210 
1211     if (!TEST_true(SSL_get_rpoll_descriptor(clientssl, &rdesc))
1212         || !TEST_true(SSL_get_wpoll_descriptor(clientssl, &wdesc))
1213         || !TEST_int_eq(rdesc.type, BIO_POLL_DESCRIPTOR_TYPE_SOCK_FD)
1214         || !TEST_int_eq(wdesc.type, BIO_POLL_DESCRIPTOR_TYPE_SOCK_FD)
1215         || !TEST_int_eq(rdesc.value.fd, cfd)
1216         || !TEST_int_eq(wdesc.value.fd, cfd))
1217         goto error;
1218 
1219     if (!TEST_true(SSL_get_rpoll_descriptor(serverssl, &rdesc))
1220         || !TEST_true(SSL_get_wpoll_descriptor(serverssl, &wdesc))
1221         || !TEST_int_eq(rdesc.type, BIO_POLL_DESCRIPTOR_TYPE_SOCK_FD)
1222         || !TEST_int_eq(wdesc.type, BIO_POLL_DESCRIPTOR_TYPE_SOCK_FD)
1223         || !TEST_int_eq(rdesc.value.fd, sfd)
1224         || !TEST_int_eq(wdesc.value.fd, sfd))
1225         goto error;
1226 
1227     *sssl = serverssl;
1228     *cssl = clientssl;
1229     return 1;
1230 
1231 error:
1232     SSL_free(serverssl);
1233     SSL_free(clientssl);
1234     BIO_free(s_to_c_bio);
1235     BIO_free(c_to_s_bio);
1236     return 0;
1237 }
1238 
1239 #else
1240 
wait_until_sock_readable(int sock)1241 int wait_until_sock_readable(int sock)
1242 {
1243     return 0;
1244 }
1245 
1246 #endif /* defined(OSSL_USE_SOCKETS) */
1247 
1248 /*
1249  * NOTE: Transfers control of the BIOs - this function will free them on error
1250  */
create_ssl_objects(SSL_CTX * serverctx,SSL_CTX * clientctx,SSL ** sssl,SSL ** cssl,BIO * s_to_c_fbio,BIO * c_to_s_fbio)1251 int create_ssl_objects(SSL_CTX *serverctx, SSL_CTX *clientctx, SSL **sssl,
1252     SSL **cssl, BIO *s_to_c_fbio, BIO *c_to_s_fbio)
1253 {
1254     SSL *serverssl = NULL, *clientssl = NULL;
1255     BIO *s_to_c_bio = NULL, *c_to_s_bio = NULL;
1256 
1257     if (*sssl != NULL)
1258         serverssl = *sssl;
1259     else if (!TEST_ptr(serverssl = SSL_new(serverctx)))
1260         goto error;
1261     if (*cssl != NULL)
1262         clientssl = *cssl;
1263     else if (!TEST_ptr(clientssl = SSL_new(clientctx)))
1264         goto error;
1265 
1266     if (SSL_is_dtls(clientssl)) {
1267         if (!TEST_ptr(s_to_c_bio = BIO_new(bio_s_mempacket_test()))
1268             || !TEST_ptr(c_to_s_bio = BIO_new(bio_s_mempacket_test())))
1269             goto error;
1270     } else {
1271         if (!TEST_ptr(s_to_c_bio = BIO_new(BIO_s_mem()))
1272             || !TEST_ptr(c_to_s_bio = BIO_new(BIO_s_mem())))
1273             goto error;
1274     }
1275 
1276     if (s_to_c_fbio != NULL
1277         && !TEST_ptr(s_to_c_bio = BIO_push(s_to_c_fbio, s_to_c_bio)))
1278         goto error;
1279     if (c_to_s_fbio != NULL
1280         && !TEST_ptr(c_to_s_bio = BIO_push(c_to_s_fbio, c_to_s_bio)))
1281         goto error;
1282 
1283     /* Set Non-blocking IO behaviour */
1284     BIO_set_mem_eof_return(s_to_c_bio, -1);
1285     BIO_set_mem_eof_return(c_to_s_bio, -1);
1286 
1287     /* Up ref these as we are passing them to two SSL objects */
1288     if (!BIO_up_ref(s_to_c_bio))
1289         goto error;
1290     if (!BIO_up_ref(c_to_s_bio)) {
1291         BIO_free(s_to_c_bio);
1292         goto error;
1293     }
1294 
1295     SSL_set_bio(serverssl, c_to_s_bio, s_to_c_bio);
1296     SSL_set_bio(clientssl, s_to_c_bio, c_to_s_bio);
1297     *sssl = serverssl;
1298     *cssl = clientssl;
1299     return 1;
1300 
1301 error:
1302     SSL_free(serverssl);
1303     SSL_free(clientssl);
1304     BIO_free(s_to_c_bio);
1305     BIO_free(c_to_s_bio);
1306     BIO_free(s_to_c_fbio);
1307     BIO_free(c_to_s_fbio);
1308 
1309     return 0;
1310 }
1311 
1312 /*
1313  * Create an SSL connection, but does not read any post-handshake
1314  * NewSessionTicket messages.
1315  * If |read| is set and we're using DTLS then we will attempt to SSL_read on
1316  * the connection once we've completed one half of it, to ensure any retransmits
1317  * get triggered.
1318  * We stop the connection attempt (and return a failure value) if either peer
1319  * has SSL_get_error() return the value in the |want| parameter. The connection
1320  * attempt could be restarted by a subsequent call to this function.
1321  */
create_bare_ssl_connection_ex(SSL * serverssl,SSL * clientssl,int want,int read,int listen,int * cm_count,int * sm_count)1322 int create_bare_ssl_connection_ex(SSL *serverssl, SSL *clientssl, int want,
1323     int read, int listen, int *cm_count, int *sm_count)
1324 {
1325     int retc = -1, rets = -1, err, abortctr = 0, ret = 0;
1326     int clienterr = 0, servererr = 0;
1327     int isdtls = SSL_is_dtls(serverssl);
1328     int icm_count = 0, ism_count = 0;
1329 #ifndef OPENSSL_NO_SOCK
1330     BIO_ADDR *peer = NULL;
1331 
1332     if (listen) {
1333         if (!isdtls) {
1334             TEST_error("DTLSv1_listen requested for non-DTLS object\n");
1335             return 0;
1336         }
1337         peer = BIO_ADDR_new();
1338         if (!TEST_ptr(peer))
1339             return 0;
1340     }
1341 #else
1342     if (listen) {
1343         TEST_error("DTLSv1_listen requested in a no-sock build\n");
1344         return 0;
1345     }
1346 #endif
1347 
1348     do {
1349         err = SSL_ERROR_WANT_WRITE;
1350         while (!clienterr && retc <= 0 && err == SSL_ERROR_WANT_WRITE) {
1351             retc = SSL_connect(clientssl);
1352             if (retc <= 0)
1353                 err = SSL_get_error(clientssl, retc);
1354             icm_count++;
1355         }
1356 
1357         if (!clienterr && retc <= 0 && err != SSL_ERROR_WANT_READ) {
1358             TEST_info("SSL_connect() failed %d, %d", retc, err);
1359             if (want != SSL_ERROR_SSL)
1360                 TEST_openssl_errors();
1361             clienterr = 1;
1362         }
1363         if (want != SSL_ERROR_NONE && err == want)
1364             goto err;
1365 
1366         err = SSL_ERROR_WANT_WRITE;
1367         while (!servererr && rets <= 0 && err == SSL_ERROR_WANT_WRITE) {
1368 #ifndef OPENSSL_NO_SOCK
1369             if (listen) {
1370                 rets = DTLSv1_listen(serverssl, peer);
1371                 if (rets < 0) {
1372                     err = SSL_ERROR_SSL;
1373                 } else if (rets == 0) {
1374                     err = SSL_ERROR_WANT_READ;
1375                 } else {
1376                     /* Success - stop listening and call SSL_accept from now on */
1377                     listen = 0;
1378                     rets = 0;
1379                 }
1380                 ism_count++;
1381             } else
1382 #endif
1383             {
1384                 rets = SSL_accept(serverssl);
1385                 if (rets <= 0)
1386                     err = SSL_get_error(serverssl, rets);
1387                 ism_count++;
1388             }
1389         }
1390 
1391         if (!servererr && rets <= 0
1392             && err != SSL_ERROR_WANT_READ
1393             && err != SSL_ERROR_WANT_X509_LOOKUP) {
1394             TEST_info("SSL_accept() failed %d, %d", rets, err);
1395             if (want != SSL_ERROR_SSL)
1396                 TEST_openssl_errors();
1397             servererr = 1;
1398         }
1399         if (want != SSL_ERROR_NONE && err == want)
1400             goto err;
1401         if (clienterr && servererr)
1402             goto err;
1403         if (isdtls && read) {
1404             unsigned char buf[20];
1405 
1406             /* Trigger any retransmits that may be appropriate */
1407             if (rets > 0 && retc <= 0) {
1408                 if (SSL_read(serverssl, buf, sizeof(buf)) > 0) {
1409                     /* We don't expect this to succeed! */
1410                     TEST_info("Unexpected SSL_read() success!");
1411                     goto err;
1412                 }
1413                 ism_count++;
1414             }
1415             if (retc > 0 && rets <= 0) {
1416                 if (SSL_read(clientssl, buf, sizeof(buf)) > 0) {
1417                     /* We don't expect this to succeed! */
1418                     TEST_info("Unexpected SSL_read() success!");
1419                     goto err;
1420                 }
1421                 icm_count++;
1422             }
1423         }
1424         if (++abortctr == MAXLOOPS) {
1425             TEST_info("No progress made");
1426             goto err;
1427         }
1428         if (isdtls && abortctr <= 50 && (abortctr % 10) == 0) {
1429             /*
1430              * It looks like we're just spinning. Pause for a short period to
1431              * give the DTLS timer a chance to do something. We only do this for
1432              * the first few times to prevent hangs.
1433              */
1434             OSSL_sleep(50);
1435         }
1436     } while (retc <= 0 || rets <= 0);
1437 
1438     ret = 1;
1439 err:
1440     if (cm_count != NULL)
1441         *cm_count = icm_count;
1442     if (sm_count != NULL)
1443         *sm_count = ism_count;
1444 #ifndef OPENSSL_NO_SOCK
1445     BIO_ADDR_free(peer);
1446 #endif
1447     return ret;
1448 }
1449 
create_bare_ssl_connection(SSL * serverssl,SSL * clientssl,int want,int read,int listen)1450 int create_bare_ssl_connection(SSL *serverssl, SSL *clientssl, int want,
1451     int read, int listen)
1452 {
1453     return create_bare_ssl_connection_ex(serverssl, clientssl, want, read,
1454         listen, NULL, NULL);
1455 }
1456 
1457 /*
1458  * Create an SSL connection including any post handshake NewSessionTicket
1459  * messages.
1460  */
create_ssl_connection_ex(SSL * serverssl,SSL * clientssl,int want,int * cm_count,int * sm_count)1461 int create_ssl_connection_ex(SSL *serverssl, SSL *clientssl, int want,
1462     int *cm_count, int *sm_count)
1463 {
1464     int i;
1465     unsigned char buf;
1466     size_t readbytes;
1467 
1468     if (!create_bare_ssl_connection_ex(serverssl, clientssl, want, 1, 0,
1469             cm_count, sm_count))
1470         return 0;
1471 
1472     /*
1473      * We attempt to read some data on the client side which we expect to fail.
1474      * This will ensure we have received the NewSessionTicket in TLSv1.3 where
1475      * appropriate. We do this twice because there are 2 NewSessionTickets.
1476      */
1477     for (i = 0; i < 2; i++) {
1478         if (SSL_read_ex(clientssl, &buf, sizeof(buf), &readbytes) > 0) {
1479             if (!TEST_ulong_eq(readbytes, 0))
1480                 return 0;
1481         } else if (!TEST_int_eq(SSL_get_error(clientssl, 0),
1482                        SSL_ERROR_WANT_READ)) {
1483             return 0;
1484         }
1485         if (cm_count != NULL)
1486             (*cm_count)++;
1487     }
1488 
1489     return 1;
1490 }
1491 
create_ssl_connection(SSL * serverssl,SSL * clientssl,int want)1492 int create_ssl_connection(SSL *serverssl, SSL *clientssl, int want)
1493 {
1494     return create_ssl_connection_ex(serverssl, clientssl, want, NULL, NULL);
1495 }
1496 
shutdown_ssl_connection(SSL * serverssl,SSL * clientssl)1497 void shutdown_ssl_connection(SSL *serverssl, SSL *clientssl)
1498 {
1499     SSL_shutdown(clientssl);
1500     SSL_shutdown(serverssl);
1501     SSL_free(serverssl);
1502     SSL_free(clientssl);
1503 }
1504 
create_a_psk(SSL * ssl,size_t mdsize)1505 SSL_SESSION *create_a_psk(SSL *ssl, size_t mdsize)
1506 {
1507     const SSL_CIPHER *cipher = NULL;
1508     const unsigned char key[SHA384_DIGEST_LENGTH] = {
1509         0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07, 0x08, 0x09, 0x0a,
1510         0x0b, 0x0c, 0x0d, 0x0e, 0x0f, 0x10, 0x11, 0x12, 0x13, 0x14, 0x15,
1511         0x16, 0x17, 0x18, 0x19, 0x1a, 0x1b, 0x1c, 0x1d, 0x1e, 0x1f, 0x20,
1512         0x21, 0x22, 0x23, 0x24, 0x25, 0x26, 0x27, 0x28, 0x29, 0x2a, 0x2b,
1513         0x2c, 0x2d, 0x2e, 0x2f
1514     };
1515     SSL_SESSION *sess = NULL;
1516 
1517     if (mdsize == SHA384_DIGEST_LENGTH) {
1518         cipher = SSL_CIPHER_find(ssl, TLS13_AES_256_GCM_SHA384_BYTES);
1519     } else if (mdsize == SHA256_DIGEST_LENGTH) {
1520         /*
1521          * Any ciphersuite using SHA256 will do - it will be compatible with
1522          * the actual ciphersuite selected as long as it too is based on SHA256
1523          */
1524         cipher = SSL_CIPHER_find(ssl, TLS13_AES_128_GCM_SHA256_BYTES);
1525     } else {
1526         /* Should not happen */
1527         return NULL;
1528     }
1529     sess = SSL_SESSION_new();
1530     if (!TEST_ptr(sess)
1531         || !TEST_ptr(cipher)
1532         || !TEST_true(SSL_SESSION_set1_master_key(sess, key, mdsize))
1533         || !TEST_true(SSL_SESSION_set_cipher(sess, cipher))
1534         || !TEST_true(
1535             SSL_SESSION_set_protocol_version(sess,
1536                 TLS1_3_VERSION))) {
1537         SSL_SESSION_free(sess);
1538         return NULL;
1539     }
1540     return sess;
1541 }
1542 
1543 #define NUM_EXTRA_CERTS 40
1544 
ssl_ctx_add_large_cert_chain(OSSL_LIB_CTX * libctx,SSL_CTX * sctx,const char * cert_file)1545 int ssl_ctx_add_large_cert_chain(OSSL_LIB_CTX *libctx, SSL_CTX *sctx,
1546     const char *cert_file)
1547 {
1548     BIO *certbio = NULL;
1549     X509 *chaincert = NULL;
1550     int certlen;
1551     int ret = 0;
1552     int i;
1553 
1554     if (!TEST_ptr(certbio = BIO_new_file(cert_file, "r")))
1555         goto end;
1556 
1557     if (!TEST_ptr(chaincert = X509_new_ex(libctx, NULL)))
1558         goto end;
1559 
1560     if (PEM_read_bio_X509(certbio, &chaincert, NULL, NULL) == NULL)
1561         goto end;
1562     BIO_free(certbio);
1563     certbio = NULL;
1564 
1565     /*
1566      * We assume the supplied certificate is big enough so that if we add
1567      * NUM_EXTRA_CERTS it will make the overall message large enough. The
1568      * default buffer size is requested to be 16k, but due to the way BUF_MEM
1569      * works, it ends up allocating a little over 21k (16 * 4/3). So, in this
1570      * test we need to have a message larger than that.
1571      */
1572     certlen = i2d_X509(chaincert, NULL);
1573     OPENSSL_assert(certlen * NUM_EXTRA_CERTS > (SSL3_RT_MAX_PLAIN_LENGTH * 4) / 3);
1574     for (i = 0; i < NUM_EXTRA_CERTS; i++) {
1575         if (!X509_up_ref(chaincert))
1576             goto end;
1577         if (!SSL_CTX_add_extra_chain_cert(sctx, chaincert)) {
1578             X509_free(chaincert);
1579             goto end;
1580         }
1581     }
1582 
1583     ret = 1;
1584 end:
1585     BIO_free(certbio);
1586     X509_free(chaincert);
1587     return ret;
1588 }
1589 
load_dasync(void)1590 ENGINE *load_dasync(void)
1591 {
1592 #if !defined(OPENSSL_NO_TLS1_2) && !defined(OPENSSL_NO_DYNAMIC_ENGINE)
1593     ENGINE *e;
1594 
1595     if (!TEST_ptr(e = ENGINE_by_id("dasync")))
1596         return NULL;
1597 
1598     if (!TEST_true(ENGINE_init(e))) {
1599         ENGINE_free(e);
1600         return NULL;
1601     }
1602 
1603     if (!TEST_true(ENGINE_register_ciphers(e))) {
1604         ENGINE_free(e);
1605         return NULL;
1606     }
1607 
1608     return e;
1609 #else
1610     return NULL;
1611 #endif
1612 }
1613