1 /* 2 * Copyright 2022-2023 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 #include <openssl/bio.h> 11 #include "testutil.h" 12 13 #ifndef OPENSSL_NO_DGRAM 14 static int test_dgram(void) 15 { 16 BIO *bio = BIO_new(BIO_s_dgram_mem()), *rbio = NULL; 17 int testresult = 0; 18 const char msg1[] = "12345656"; 19 const char msg2[] = "abcdefghijklmno"; 20 const char msg3[] = "ABCDEF"; 21 const char msg4[] = "FEDCBA"; 22 char buf[80]; 23 24 if (!TEST_ptr(bio)) 25 goto err; 26 27 rbio = BIO_new_mem_buf(msg1, sizeof(msg1)); 28 if (!TEST_ptr(rbio)) 29 goto err; 30 31 /* Setting the EOF return value on a non datagram mem BIO should be fine */ 32 if (!TEST_int_gt(BIO_set_mem_eof_return(rbio, 0), 0)) 33 goto err; 34 35 /* Setting the EOF return value on a datagram mem BIO should fail */ 36 if (!TEST_int_le(BIO_set_mem_eof_return(bio, 0), 0)) 37 goto err; 38 39 /* Write 4 dgrams */ 40 if (!TEST_int_eq(BIO_write(bio, msg1, sizeof(msg1)), sizeof(msg1))) 41 goto err; 42 if (!TEST_int_eq(BIO_write(bio, msg2, sizeof(msg2)), sizeof(msg2))) 43 goto err; 44 if (!TEST_int_eq(BIO_write(bio, msg3, sizeof(msg3)), sizeof(msg3))) 45 goto err; 46 if (!TEST_int_eq(BIO_write(bio, msg4, sizeof(msg4)), sizeof(msg4))) 47 goto err; 48 49 /* Reading all 4 dgrams out again should all be the correct size */ 50 if (!TEST_int_eq(BIO_read(bio, buf, sizeof(buf)), sizeof(msg1)) 51 || !TEST_mem_eq(buf, sizeof(msg1), msg1, sizeof(msg1)) 52 || !TEST_int_eq(BIO_read(bio, buf, sizeof(buf)), sizeof(msg2)) 53 || !TEST_mem_eq(buf, sizeof(msg2), msg2, sizeof(msg2)) 54 || !TEST_int_eq(BIO_read(bio, buf, sizeof(buf)), sizeof(msg3)) 55 || !TEST_mem_eq(buf, sizeof(msg3), msg3, sizeof(msg3)) 56 || !TEST_int_eq(BIO_read(bio, buf, sizeof(buf)), sizeof(msg4)) 57 || !TEST_mem_eq(buf, sizeof(msg4), msg4, sizeof(msg4))) 58 goto err; 59 60 /* Interleaving writes and reads should be fine */ 61 if (!TEST_int_eq(BIO_write(bio, msg1, sizeof(msg1)), sizeof(msg1))) 62 goto err; 63 if (!TEST_int_eq(BIO_write(bio, msg2, sizeof(msg2)), sizeof(msg2))) 64 goto err; 65 if (!TEST_int_eq(BIO_read(bio, buf, sizeof(buf)), sizeof(msg1)) 66 || !TEST_mem_eq(buf, sizeof(msg1), msg1, sizeof(msg1))) 67 goto err; 68 if (!TEST_int_eq(BIO_write(bio, msg3, sizeof(msg3)), sizeof(msg3))) 69 goto err; 70 if (!TEST_int_eq(BIO_read(bio, buf, sizeof(buf)), sizeof(msg2)) 71 || !TEST_mem_eq(buf, sizeof(msg2), msg2, sizeof(msg2)) 72 || !TEST_int_eq(BIO_read(bio, buf, sizeof(buf)), sizeof(msg3)) 73 || !TEST_mem_eq(buf, sizeof(msg3), msg3, sizeof(msg3))) 74 goto err; 75 76 /* 77 * Requesting less than the available data in a dgram should not impact the 78 * next packet. 79 */ 80 if (!TEST_int_eq(BIO_write(bio, msg1, sizeof(msg1)), sizeof(msg1))) 81 goto err; 82 if (!TEST_int_eq(BIO_write(bio, msg2, sizeof(msg2)), sizeof(msg2))) 83 goto err; 84 if (!TEST_int_eq(BIO_read(bio, buf, /* Short buffer */ 2), 2) 85 || !TEST_mem_eq(buf, 2, msg1, 2)) 86 goto err; 87 if (!TEST_int_eq(BIO_read(bio, buf, sizeof(buf)), sizeof(msg2)) 88 || !TEST_mem_eq(buf, sizeof(msg2), msg2, sizeof(msg2))) 89 goto err; 90 91 /* 92 * Writing a zero length datagram will return zero, but no datagrams will 93 * be written. Attempting to read when there are no datagrams to read should 94 * return a negative result, but not eof. Retry flags will be set. 95 */ 96 if (!TEST_int_eq(BIO_write(bio, NULL, 0), 0) 97 || !TEST_int_lt(BIO_read(bio, buf, sizeof(buf)), 0) 98 || !TEST_false(BIO_eof(bio)) 99 || !TEST_true(BIO_should_retry(bio))) 100 goto err; 101 102 if (!TEST_int_eq(BIO_dgram_set_mtu(bio, 123456), 1) 103 || !TEST_int_eq(BIO_dgram_get_mtu(bio), 123456)) 104 goto err; 105 106 testresult = 1; 107 err: 108 BIO_free(rbio); 109 BIO_free(bio); 110 return testresult; 111 } 112 #endif 113 114 int setup_tests(void) 115 { 116 if (!test_skip_common_options()) { 117 TEST_error("Error parsing test options\n"); 118 return 0; 119 } 120 121 #ifndef OPENSSL_NO_DGRAM 122 ADD_TEST(test_dgram); 123 #endif 124 125 return 1; 126 } 127