/** create a new BIO. * (internal openssl use via the tls_mbuf method) * @return 1 on success, 0 on error. */ static int tls_bio_mbuf_new(BIO* b) { struct tls_bio_mbuf_data* d; TLS_BIO_DBG("tls_bio_mbuf_new called (%p)\n", b); #if OPENSSL_VERSION_NUMBER < 0x010100000L b->init = 0; /* not initialized yet */ b->num = 0; b->ptr = 0; b->flags = 0; d = OPENSSL_malloc(sizeof(*d)); if (unlikely(d == 0)) return 0; d->rd = 0; d->wr = 0; b->ptr = d; #else BIO_set_init(b, 0); BIO_set_data(b, NULL); d = OPENSSL_zalloc(sizeof(*d)); if (unlikely(d == 0)) return 0; BIO_set_data(b, d); #endif return 1; }
/* * Write some data. * * This function implements a simple state machine that detects new lines. * It indents the output and prefixes it with a '#' character. * * It returns the number of input characters that were output in in_size. * More characters than this will likely have been output however any calling * code will be unable to correctly assess the actual number of characters * emitted and would be prone to failure if the actual number were returned. * * The BIO_data field is used as our state. If it is NULL, we've just * seen a new line. If it is not NULL, we're processing characters in a line. */ static int tap_write_ex(BIO *b, const char *buf, size_t size, size_t *in_size) { static char empty[] = ""; BIO *next = BIO_next(b); size_t i; int j; for (i = 0; i < size; i++) { if (BIO_get_data(b) == NULL) { BIO_set_data(b, empty); for (j = 0; j < subtest_level(); j++) if (!write_string(next, " ", 1)) goto err; if (!write_string(next, "# ", 2)) goto err; } if (!write_string(next, buf + i, 1)) goto err; if (buf[i] == '\n') BIO_set_data(b, NULL); } *in_size = i; return 1; err: *in_size = i; return 0; }
/* Called to initialize a new BIO */ static int bio_bufferevent_new(BIO *b) { BIO_set_init(b, 0); BIO_set_data(b, NULL); /* We'll be putting the bufferevent in this field.*/ return 1; }
static int tlso_bio_create( BIO *b ) { BIO_set_init( b, 1 ); BIO_set_data( b, NULL ); BIO_clear_flags( b, ~0 ); return 1; }
static int bio_create(BIO *b) { BIO_set_init(b, 1); BIO_set_data(b, NULL); return 1; }
/* This should exactly match OpenSSL's SSL_set_fd except for using my BIO */ static int my_SSL_set_fd(Port *port, int fd) { int ret = 0; BIO *bio; BIO_METHOD *bio_method; bio_method = my_BIO_s_socket(); if (bio_method == NULL) { SSLerr(SSL_F_SSL_SET_FD, ERR_R_BUF_LIB); goto err; } bio = BIO_new(bio_method); if (bio == NULL) { SSLerr(SSL_F_SSL_SET_FD, ERR_R_BUF_LIB); goto err; } BIO_set_data(bio, port); BIO_set_fd(bio, fd, BIO_NOCLOSE); SSL_set_bio(port->ssl, bio, bio); ret = 1; err: return ret; }
static int bio_zlib_new(BIO *bi) { BIO_ZLIB_CTX *ctx; # ifdef ZLIB_SHARED (void)COMP_zlib(); if (!zlib_loaded) { COMPerr(COMP_F_BIO_ZLIB_NEW, COMP_R_ZLIB_NOT_SUPPORTED); return 0; } # endif ctx = OPENSSL_zalloc(sizeof(*ctx)); if (ctx == NULL) { COMPerr(COMP_F_BIO_ZLIB_NEW, ERR_R_MALLOC_FAILURE); return 0; } ctx->ibufsize = ZLIB_DEFAULT_BUFSIZE; ctx->obufsize = ZLIB_DEFAULT_BUFSIZE; ctx->zin.zalloc = Z_NULL; ctx->zin.zfree = Z_NULL; ctx->zout.zalloc = Z_NULL; ctx->zout.zfree = Z_NULL; ctx->comp_level = Z_DEFAULT_COMPRESSION; BIO_set_init(bi, 1); BIO_set_data(bi, ctx); return 1; }
static BIO *dill_tls_new_cbio(void *mem) { BIO *bio = BIO_new(dill_tls_cbio); if(dill_slow(!bio)) {errno = EFAULT; return NULL;} BIO_set_data(bio, mem); BIO_set_init(bio, 1); return bio; }
int openssl_connect(git_stream *stream) { int ret; BIO *bio; openssl_stream *st = (openssl_stream *) stream; if ((ret = git_stream_connect(st->io)) < 0) return ret; st->connected = true; bio = BIO_new(git_stream_bio_method); GITERR_CHECK_ALLOC(bio); BIO_set_data(bio, st->io); SSL_set_bio(st->ssl, bio, bio); /* specify the host in case SNI is needed */ #ifdef SSL_CTRL_SET_TLSEXT_HOSTNAME SSL_set_tlsext_host_name(st->ssl, st->host); #endif if ((ret = SSL_connect(st->ssl)) <= 0) return ssl_set_error(st->ssl, ret); return verify_server_cert(st->ssl, st->host); }
static int tap_free(BIO *b) { if (b == NULL) return 0; BIO_set_data(b, NULL); BIO_set_init(b, 0); return 1; }
static int bio_destroy(BIO *b) { if (!b) return 0; BIO_set_data(b, NULL); return 1; }
static int mempacket_test_free(BIO *bio) { MEMPACKET_TEST_CTX *ctx = BIO_get_data(bio); sk_MEMPACKET_pop_free(ctx->pkts, mempacket_free); OPENSSL_free(ctx); BIO_set_data(bio, NULL); BIO_set_init(bio, 0); return 1; }
static int md_free(BIO *a) { if (a == NULL) return 0; EVP_MD_CTX_free(BIO_get_data(a)); BIO_set_data(a, NULL); BIO_set_init(a, 0); return 1; }
static int tlso_bio_destroy( BIO *b ) { if ( b == NULL ) return 0; BIO_set_data( b, NULL ); /* sb_tls_remove() will free it */ BIO_set_init( b, 0 ); BIO_clear_flags( b, ~0 ); return 1; }
int mongoc_stream_tls_openssl_bio_create (BIO *b) { BSON_ASSERT (b); BIO_set_init (b, 1); BIO_set_data (b, NULL); BIO_set_flags (b, 0); return 1; }
static int transport_bio_simple_new(BIO* bio) { WINPR_BIO_SIMPLE_SOCKET* ptr; BIO_set_flags(bio, BIO_FLAGS_SHOULD_RETRY); ptr = (WINPR_BIO_SIMPLE_SOCKET*) calloc(1, sizeof(WINPR_BIO_SIMPLE_SOCKET)); if (!ptr) return 0; BIO_set_data(bio, ptr); return 1; }
static int bio_rdp_tls_new(BIO* bio) { BIO_RDP_TLS* tls; BIO_set_flags(bio, BIO_FLAGS_SHOULD_RETRY); if (!(tls = calloc(1, sizeof(BIO_RDP_TLS)))) return 0; InitializeCriticalSectionAndSpinCount(&tls->lock, 4000); BIO_set_data(bio, (void*) tls); return 1; }
/* Create a new BIO to wrap communication around a bufferevent. If close_flag * is true, the bufferevent will be freed when the BIO is closed. */ static BIO * BIO_new_bufferevent(struct bufferevent *bufferevent, int close_flag) { BIO *result; if (!bufferevent) return NULL; if (!(result = BIO_new(BIO_s_bufferevent()))) return NULL; BIO_set_init(result, 1); BIO_set_data(result, bufferevent); BIO_set_shutdown(result, close_flag ? 1 : 0); return result; }
static int url_bio_create(BIO *b) { #if OPENSSL_VERSION_NUMBER >= 0x1010000fL BIO_set_init(b, 1); BIO_set_data(b, NULL); BIO_set_flags(b, 0); #else b->init = 1; b->ptr = NULL; b->flags = 0; #endif return 1; }
static int md_new(BIO *bi) { EVP_MD_CTX *ctx; ctx = EVP_MD_CTX_new(); if (ctx == NULL) return 0; BIO_set_init(bi, 1); BIO_set_data(bi, ctx); return 1; }
static long tap_ctrl(BIO *b, int cmd, long num, void *ptr) { BIO *next = BIO_next(b); switch (cmd) { case BIO_CTRL_RESET: BIO_set_data(b, NULL); break; default: break; } return BIO_ctrl(next, cmd, num, ptr); }
static int mempacket_test_new(BIO *bio) { MEMPACKET_TEST_CTX *ctx; if (!TEST_ptr(ctx = OPENSSL_zalloc(sizeof(*ctx)))) return 0; if (!TEST_ptr(ctx->pkts = sk_MEMPACKET_new_null())) { OPENSSL_free(ctx); return 0; } BIO_set_init(bio, 1); BIO_set_data(bio, ctx); return 1; }
static int ssl_new(BIO *bi) { BIO_SSL *bs = OPENSSL_zalloc(sizeof(*bs)); if (bs == NULL) { BIOerr(BIO_F_SSL_NEW, ERR_R_MALLOC_FAILURE); return 0; } BIO_set_init(bi, 0); BIO_set_data(bi, bs); /* Clear all flags */ BIO_clear_flags(bi, ~0); return 1; }
static int asn1_bio_new(BIO *b) { BIO_ASN1_BUF_CTX *ctx = OPENSSL_zalloc(sizeof(*ctx)); if (ctx == NULL) return 0; if (!asn1_bio_init(ctx, DEFAULT_ASN1_BUF_SIZE)) { OPENSSL_free(ctx); return 0; } BIO_set_data(b, ctx); BIO_set_init(b, 1); return 1; }
static int ok_free(BIO *a) { BIO_OK_CTX *ctx; if (a == NULL) return 0; ctx = BIO_get_data(a); EVP_MD_CTX_free(ctx->md); OPENSSL_clear_free(ctx, sizeof(BIO_OK_CTX)); BIO_set_data(a, NULL); BIO_set_init(a, 0); return 1; }
static int transport_bio_buffered_new(BIO* bio) { WINPR_BIO_BUFFERED_SOCKET* ptr; BIO_set_init(bio, 1); BIO_set_flags(bio, BIO_FLAGS_SHOULD_RETRY); ptr = (WINPR_BIO_BUFFERED_SOCKET*) calloc(1, sizeof(WINPR_BIO_BUFFERED_SOCKET)); if (!ptr) return -1; BIO_set_data(bio, (void*) ptr); if (!ringbuffer_init(&ptr->xmitBuffer, 0x10000)) return -1; return 1; }
static int b64_free(BIO *a) { BIO_B64_CTX *ctx; if (a == NULL) return 0; ctx = BIO_get_data(a); if (ctx == NULL) return 0; EVP_ENCODE_CTX_free(ctx->base64); OPENSSL_free(ctx); BIO_set_data(a, NULL); BIO_set_init(a, 0); return 1; }
static int transport_bio_simple_free(BIO* bio) { WINPR_BIO_SIMPLE_SOCKET* ptr; if (!bio) return 0; transport_bio_simple_uninit(bio); ptr = (WINPR_BIO_SIMPLE_SOCKET*) BIO_get_data(bio); if (ptr) { BIO_set_data(bio, NULL); free(ptr); } return 1; }
static int enc_free(BIO *a) { BIO_ENC_CTX *b; if (a == NULL) return 0; b = BIO_get_data(a); if (b == NULL) return 0; EVP_CIPHER_CTX_free(b->cipher); OPENSSL_clear_free(b, sizeof(BIO_ENC_CTX)); BIO_set_data(a, NULL); BIO_set_init(a, 0); return 1; }
static int asn1_bio_free(BIO *b) { BIO_ASN1_BUF_CTX *ctx; if (b == NULL) return 0; ctx = BIO_get_data(b); if (ctx == NULL) return 0; OPENSSL_free(ctx->buf); OPENSSL_free(ctx); BIO_set_data(b, NULL); BIO_set_init(b, 0); return 1; }