--- src/ptclib/pssl.cxx.orig 2013-08-14 18:20:27.000000000 -0500 +++ src/ptclib/pssl.cxx 2018-11-06 11:53:45.651466000 -0600 @@ -140,7 +140,7 @@ class PSSL_BIO { public: - PSSL_BIO(BIO_METHOD *method = BIO_s_file_internal()) + PSSL_BIO(const BIO_METHOD *method = BIO_s_file()) { bio = BIO_new(method); } ~PSSL_BIO() @@ -627,9 +627,10 @@ if (dh == NULL) return; - dh->p = BN_bin2bn(pData, pSize, NULL); - dh->g = BN_bin2bn(gData, gSize, NULL); - if (dh->p != NULL && dh->g != NULL) + BIGNUM *p = BN_bin2bn(pData, pSize, NULL); + BIGNUM *g = BN_bin2bn(gData, gSize, NULL); + DH_set0_pqg(dh, p, NULL, g); + if (p != NULL && p != NULL) return; DH_free(dh); @@ -805,13 +806,11 @@ SSL_METHOD * meth; switch (method) { - case SSLv3: - meth = SSLv3_method(); - break; case TLSv1: meth = TLSv1_method(); break; case SSLv23: + case SSLv3: default: meth = SSLv23_method(); break; @@ -1117,7 +1116,7 @@ // -#define PSSLCHANNEL(bio) ((PSSLChannel *)(bio->ptr)) +#define PSSLCHANNEL(bio) ((PSSLChannel *)BIO_get_data(bio)) extern "C" { @@ -1130,10 +1129,9 @@ static int Psock_new(BIO * bio) { - bio->init = 0; - bio->num = 0; - bio->ptr = NULL; // this is really (PSSLChannel *) - bio->flags = 0; + BIO_set_init(bio, 0); + BIO_set_data(bio, NULL); + BIO_clear_flags(bio, ~0); return(1); } @@ -1144,13 +1142,13 @@ if (bio == NULL) return 0; - if (bio->shutdown) { - if (bio->init) { + if (BIO_get_shutdown(bio)) { + if (BIO_get_init(bio)) { PSSLCHANNEL(bio)->Shutdown(PSocket::ShutdownReadAndWrite); PSSLCHANNEL(bio)->Close(); } - bio->init = 0; - bio->flags = 0; + BIO_set_init(bio, 0); + BIO_clear_flags(bio, ~0); } return 1; } @@ -1160,11 +1158,11 @@ { switch (cmd) { case BIO_CTRL_SET_CLOSE: - bio->shutdown = (int)num; + BIO_set_shutdown(bio, (int)num); return 1; case BIO_CTRL_GET_CLOSE: - return bio->shutdown; + return BIO_get_shutdown(bio); case BIO_CTRL_FLUSH: return 1; @@ -1239,7 +1237,8 @@ }; -static BIO_METHOD methods_Psock = +static BIO_METHOD *methods_Psock = NULL; +/* { BIO_TYPE_SOCKET, "PTLib-PSSLChannel", @@ -1261,19 +1260,33 @@ Psock_free #endif }; +*/ - PBoolean PSSLChannel::OnOpen() { - BIO * bio = BIO_new(&methods_Psock); + if (methods_Psock == NULL) { + methods_Psock = BIO_meth_new(BIO_TYPE_SOCKET | BIO_get_new_index(), "PTLib-PSSLChannel"); + if (methods_Psock == NULL || + BIO_meth_set_write(methods_Psock, Psock_write) || + BIO_meth_set_read(methods_Psock, Psock_read) || + BIO_meth_set_puts(methods_Psock, Psock_puts) || + BIO_meth_set_gets(methods_Psock, NULL) || + BIO_meth_set_ctrl(methods_Psock, Psock_ctrl) || + BIO_meth_set_create(methods_Psock, Psock_new) || + BIO_meth_set_destroy(methods_Psock, Psock_free)) { + SSLerr(SSL_F_SSL_SET_FD,ERR_R_BUF_LIB); + return PFalse; + } + } + BIO * bio = BIO_new(methods_Psock); if (bio == NULL) { SSLerr(SSL_F_SSL_SET_FD,ERR_R_BUF_LIB); return PFalse; } // "Open" then bio - bio->ptr = this; - bio->init = 1; + BIO_set_data(bio, this); + BIO_set_init(bio, 1); SSL_set_bio(ssl, bio, bio); return PTrue;