1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
|
--- 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;
|