Трудно ответить на вопрос, не зная, почему вы думаете, BIO_push
- это все, что вам нужно сделать.В любом случае, вы не должны звонить BIO_ctrl
напрямую.Вы должны использовать высокоуровневую оболочку BIO_set_ssl
, определенную в bio.h
:
#define BIO_set_ssl(b,ssl,c) BIO_ctrl(b,BIO_C_SET_SSL,c,(char *)ssl)
Этот макрос устанавливает элемент ssl объекта BIO, как вы можете видеть в bio_ssl.c
:
case BIO_C_SET_SSL:
if (ssl != NULL)
ssl_free(b);
b->shutdown=(int)num;
ssl=(SSL *)ptr;
((BIO_SSL *)b->ptr)->ssl=ssl;
bio=SSL_get_rbio(ssl);
if (bio != NULL)
{
if (b->next_bio != NULL)
BIO_push(bio,b->next_bio);
b->next_bio=bio;
CRYPTO_add(&bio->references,1,CRYPTO_LOCK_BIO);
}
b->init=1;
break;
Важным шагом в этой функции является не BIO_push
, а то, где он устанавливает указатель ssl в объекте BIO_SSL
на ваш активный контекст SSL, т. Е. ((BIO_SSL *)b->ptr)->ssl=ssl;
.