1e1051a39Sopenharmony_ci/* 2e1051a39Sopenharmony_ci * Copyright 2021 The OpenSSL Project Authors. All Rights Reserved. 3e1051a39Sopenharmony_ci * 4e1051a39Sopenharmony_ci * Licensed under the Apache License 2.0 (the "License"). You may not use 5e1051a39Sopenharmony_ci * this file except in compliance with the License. You can obtain a copy 6e1051a39Sopenharmony_ci * in the file LICENSE in the source distribution or at 7e1051a39Sopenharmony_ci * https://www.openssl.org/source/license.html 8e1051a39Sopenharmony_ci */ 9e1051a39Sopenharmony_ci 10e1051a39Sopenharmony_ci#include <string.h> 11e1051a39Sopenharmony_ci#include <openssl/bio.h> 12e1051a39Sopenharmony_ci#include "testutil.h" 13e1051a39Sopenharmony_ci 14e1051a39Sopenharmony_cistruct ossl_core_bio_st { 15e1051a39Sopenharmony_ci int dummy; 16e1051a39Sopenharmony_ci BIO *bio; 17e1051a39Sopenharmony_ci}; 18e1051a39Sopenharmony_ci 19e1051a39Sopenharmony_cistatic int tst_bio_core_read_ex(OSSL_CORE_BIO *bio, char *data, size_t data_len, 20e1051a39Sopenharmony_ci size_t *bytes_read) 21e1051a39Sopenharmony_ci{ 22e1051a39Sopenharmony_ci return BIO_read_ex(bio->bio, data, data_len, bytes_read); 23e1051a39Sopenharmony_ci} 24e1051a39Sopenharmony_ci 25e1051a39Sopenharmony_cistatic int tst_bio_core_write_ex(OSSL_CORE_BIO *bio, const char *data, 26e1051a39Sopenharmony_ci size_t data_len, size_t *written) 27e1051a39Sopenharmony_ci{ 28e1051a39Sopenharmony_ci return BIO_write_ex(bio->bio, data, data_len, written); 29e1051a39Sopenharmony_ci} 30e1051a39Sopenharmony_ci 31e1051a39Sopenharmony_cistatic int tst_bio_core_gets(OSSL_CORE_BIO *bio, char *buf, int size) 32e1051a39Sopenharmony_ci{ 33e1051a39Sopenharmony_ci return BIO_gets(bio->bio, buf, size); 34e1051a39Sopenharmony_ci} 35e1051a39Sopenharmony_ci 36e1051a39Sopenharmony_cistatic int tst_bio_core_puts(OSSL_CORE_BIO *bio, const char *str) 37e1051a39Sopenharmony_ci{ 38e1051a39Sopenharmony_ci return BIO_puts(bio->bio, str); 39e1051a39Sopenharmony_ci} 40e1051a39Sopenharmony_ci 41e1051a39Sopenharmony_cistatic long tst_bio_core_ctrl(OSSL_CORE_BIO *bio, int cmd, long num, void *ptr) 42e1051a39Sopenharmony_ci{ 43e1051a39Sopenharmony_ci return BIO_ctrl(bio->bio, cmd, num, ptr); 44e1051a39Sopenharmony_ci} 45e1051a39Sopenharmony_ci 46e1051a39Sopenharmony_cistatic int tst_bio_core_up_ref(OSSL_CORE_BIO *bio) 47e1051a39Sopenharmony_ci{ 48e1051a39Sopenharmony_ci return BIO_up_ref(bio->bio); 49e1051a39Sopenharmony_ci} 50e1051a39Sopenharmony_ci 51e1051a39Sopenharmony_cistatic int tst_bio_core_free(OSSL_CORE_BIO *bio) 52e1051a39Sopenharmony_ci{ 53e1051a39Sopenharmony_ci return BIO_free(bio->bio); 54e1051a39Sopenharmony_ci} 55e1051a39Sopenharmony_ci 56e1051a39Sopenharmony_cistatic const OSSL_DISPATCH biocbs[] = { 57e1051a39Sopenharmony_ci { OSSL_FUNC_BIO_READ_EX, (void (*)(void))tst_bio_core_read_ex }, 58e1051a39Sopenharmony_ci { OSSL_FUNC_BIO_WRITE_EX, (void (*)(void))tst_bio_core_write_ex }, 59e1051a39Sopenharmony_ci { OSSL_FUNC_BIO_GETS, (void (*)(void))tst_bio_core_gets }, 60e1051a39Sopenharmony_ci { OSSL_FUNC_BIO_PUTS, (void (*)(void))tst_bio_core_puts }, 61e1051a39Sopenharmony_ci { OSSL_FUNC_BIO_CTRL, (void (*)(void))tst_bio_core_ctrl }, 62e1051a39Sopenharmony_ci { OSSL_FUNC_BIO_UP_REF, (void (*)(void))tst_bio_core_up_ref }, 63e1051a39Sopenharmony_ci { OSSL_FUNC_BIO_FREE, (void (*)(void))tst_bio_core_free }, 64e1051a39Sopenharmony_ci { 0, NULL } 65e1051a39Sopenharmony_ci}; 66e1051a39Sopenharmony_ci 67e1051a39Sopenharmony_cistatic int test_bio_core(void) 68e1051a39Sopenharmony_ci{ 69e1051a39Sopenharmony_ci BIO *cbio = NULL, *cbiobad = NULL; 70e1051a39Sopenharmony_ci OSSL_LIB_CTX *libctx = OSSL_LIB_CTX_new_from_dispatch(NULL, biocbs); 71e1051a39Sopenharmony_ci int testresult = 0; 72e1051a39Sopenharmony_ci OSSL_CORE_BIO corebio; 73e1051a39Sopenharmony_ci const char *msg = "Hello world"; 74e1051a39Sopenharmony_ci char buf[80]; 75e1051a39Sopenharmony_ci 76e1051a39Sopenharmony_ci corebio.bio = BIO_new(BIO_s_mem()); 77e1051a39Sopenharmony_ci if (!TEST_ptr(corebio.bio) 78e1051a39Sopenharmony_ci || !TEST_ptr(libctx) 79e1051a39Sopenharmony_ci /* 80e1051a39Sopenharmony_ci * Attempting to create a corebio in a libctx that was not 81e1051a39Sopenharmony_ci * created via OSSL_LIB_CTX_new_from_dispatch() should fail. 82e1051a39Sopenharmony_ci */ 83e1051a39Sopenharmony_ci || !TEST_ptr_null((cbiobad = BIO_new_from_core_bio(NULL, &corebio))) 84e1051a39Sopenharmony_ci || !TEST_ptr((cbio = BIO_new_from_core_bio(libctx, &corebio)))) 85e1051a39Sopenharmony_ci goto err; 86e1051a39Sopenharmony_ci 87e1051a39Sopenharmony_ci if (!TEST_int_gt(BIO_puts(corebio.bio, msg), 0) 88e1051a39Sopenharmony_ci /* Test a ctrl via BIO_eof */ 89e1051a39Sopenharmony_ci || !TEST_false(BIO_eof(cbio)) 90e1051a39Sopenharmony_ci || !TEST_int_gt(BIO_gets(cbio, buf, sizeof(buf)), 0) 91e1051a39Sopenharmony_ci || !TEST_true(BIO_eof(cbio)) 92e1051a39Sopenharmony_ci || !TEST_str_eq(buf, msg)) 93e1051a39Sopenharmony_ci goto err; 94e1051a39Sopenharmony_ci 95e1051a39Sopenharmony_ci buf[0] = '\0'; 96e1051a39Sopenharmony_ci if (!TEST_int_gt(BIO_write(cbio, msg, strlen(msg) + 1), 0) 97e1051a39Sopenharmony_ci || !TEST_int_gt(BIO_read(cbio, buf, sizeof(buf)), 0) 98e1051a39Sopenharmony_ci || !TEST_str_eq(buf, msg)) 99e1051a39Sopenharmony_ci goto err; 100e1051a39Sopenharmony_ci 101e1051a39Sopenharmony_ci testresult = 1; 102e1051a39Sopenharmony_ci err: 103e1051a39Sopenharmony_ci BIO_free(cbiobad); 104e1051a39Sopenharmony_ci BIO_free(cbio); 105e1051a39Sopenharmony_ci BIO_free(corebio.bio); 106e1051a39Sopenharmony_ci OSSL_LIB_CTX_free(libctx); 107e1051a39Sopenharmony_ci return testresult; 108e1051a39Sopenharmony_ci} 109e1051a39Sopenharmony_ci 110e1051a39Sopenharmony_ciint setup_tests(void) 111e1051a39Sopenharmony_ci{ 112e1051a39Sopenharmony_ci if (!test_skip_common_options()) { 113e1051a39Sopenharmony_ci TEST_error("Error parsing test options\n"); 114e1051a39Sopenharmony_ci return 0; 115e1051a39Sopenharmony_ci } 116e1051a39Sopenharmony_ci 117e1051a39Sopenharmony_ci ADD_TEST(test_bio_core); 118e1051a39Sopenharmony_ci return 1; 119e1051a39Sopenharmony_ci} 120