16
16
# define BOOST_ASIO_SYNC_OP_VOID_RETURN (e ) return
17
17
#endif
18
18
19
+ #if OPENSSL_VERSION_NUMBER >= 0x30000000L
20
+ #include < openssl/core_names.h>
21
+ #include < openssl/evp.h>
22
+ #endif
23
+
19
24
namespace boost {
20
25
namespace asio {
21
26
namespace ssl {
@@ -40,16 +45,19 @@ struct evp_pkey_cleanup
40
45
~evp_pkey_cleanup () { if (p) ::EVP_PKEY_free (p); }
41
46
};
42
47
48
+ #if OPENSSL_VERSION_NUMBER < 0x30000000L
43
49
struct ec_key_cleanup
44
50
{
45
51
EC_KEY *p;
46
52
~ec_key_cleanup () { if (p) ::EC_KEY_free (p); }
47
53
};
54
+ #endif
48
55
49
56
inline
50
57
BOOST_ASIO_SYNC_OP_VOID do_use_tmp_ecdh (boost::asio::ssl::context& ctx,
51
58
BIO* bio, boost::system::error_code& ec)
52
59
{
60
+ #if OPENSSL_VERSION_NUMBER < 0x30000000L
53
61
::ERR_clear_error ();
54
62
55
63
int nid = NID_undef;
@@ -63,7 +71,7 @@ BOOST_ASIO_SYNC_OP_VOID do_use_tmp_ecdh(boost::asio::ssl::context& ctx,
63
71
ec_key_cleanup key = { ::EVP_PKEY_get1_EC_KEY (pkey.p ) };
64
72
if (key.p )
65
73
{
66
- const EC_GROUP * group = EC_KEY_get0_group (key.p );
74
+ const EC_GROUP* group = EC_KEY_get0_group (key.p );
67
75
nid = EC_GROUP_get_curve_name (group);
68
76
}
69
77
}
@@ -83,6 +91,33 @@ BOOST_ASIO_SYNC_OP_VOID do_use_tmp_ecdh(boost::asio::ssl::context& ctx,
83
91
static_cast <int >(::ERR_get_error ()),
84
92
boost::asio::error::get_ssl_category ());
85
93
BOOST_ASIO_SYNC_OP_VOID_RETURN (ec);
94
+ #else
95
+ ::ERR_clear_error ();
96
+
97
+ x509_cleanup x509 = { ::PEM_read_bio_X509 (bio, NULL , 0 , NULL ) };
98
+ if (x509.p )
99
+ {
100
+ evp_pkey_cleanup pkey = { ::X509_get_pubkey (x509.p ) };
101
+ if (pkey.p )
102
+ {
103
+ char curve_name[64 ];
104
+ size_t return_size{ 0 };
105
+ if (::EVP_PKEY_get_utf8_string_param (pkey.p , OSSL_PKEY_PARAM_GROUP_NAME, curve_name, sizeof (curve_name), &return_size))
106
+ {
107
+ if (::SSL_CTX_set1_groups_list (ctx.native_handle (), curve_name) == 1 )
108
+ {
109
+ ec = boost::system::error_code ();
110
+ BOOST_ASIO_SYNC_OP_VOID_RETURN (ec);
111
+ }
112
+ }
113
+ }
114
+ }
115
+
116
+ ec = boost::system::error_code (
117
+ static_cast <int >(::ERR_get_error ()),
118
+ boost::asio::error::get_ssl_category ());
119
+ BOOST_ASIO_SYNC_OP_VOID_RETURN (ec);
120
+ #endif
86
121
}
87
122
88
123
inline
0 commit comments