@@ -2142,6 +2142,31 @@ _ssl__SSLSocket_cipher_impl(PySSLSocket *self)
21422142 return cipher_to_tuple (current );
21432143}
21442144
2145+ /*[clinic input]
2146+ @critical_section
2147+ _ssl._SSLSocket.group
2148+ [clinic start generated code]*/
2149+
2150+ static PyObject *
2151+ _ssl__SSLSocket_group_impl (PySSLSocket * self )
2152+ /*[clinic end generated code: output=9c168ee877017b95 input=5f187d8bf0d433b7]*/
2153+ {
2154+ #if OPENSSL_VERSION_NUMBER >= 0x30200000L
2155+ const char * group_name ;
2156+
2157+ if (self -> ssl == NULL )
2158+ Py_RETURN_NONE ;
2159+ group_name = SSL_get0_group_name (self -> ssl );
2160+ if (group_name == NULL )
2161+ Py_RETURN_NONE ;
2162+ return PyUnicode_DecodeFSDefault (group_name );
2163+ #else
2164+ PyErr_SetString (PyExc_NotImplementedError ,
2165+ "Getting selected group requires OpenSSL 3.2 or later." );
2166+ return NULL ;
2167+ #endif
2168+ }
2169+
21452170/*[clinic input]
21462171@critical_section
21472172_ssl._SSLSocket.version
@@ -3023,6 +3048,7 @@ static PyMethodDef PySSLMethods[] = {
30233048 _SSL__SSLSOCKET_GETPEERCERT_METHODDEF
30243049 _SSL__SSLSOCKET_GET_CHANNEL_BINDING_METHODDEF
30253050 _SSL__SSLSOCKET_CIPHER_METHODDEF
3051+ _SSL__SSLSOCKET_GROUP_METHODDEF
30263052 _SSL__SSLSOCKET_SHARED_CIPHERS_METHODDEF
30273053 _SSL__SSLSOCKET_VERSION_METHODDEF
30283054 _SSL__SSLSOCKET_SELECTED_ALPN_PROTOCOL_METHODDEF
@@ -3402,6 +3428,73 @@ _ssl__SSLContext_get_ciphers_impl(PySSLContext *self)
34023428
34033429}
34043430
3431+ /*[clinic input]
3432+ @critical_section
3433+ _ssl._SSLContext.set_groups
3434+ grouplist: str
3435+ /
3436+ [clinic start generated code]*/
3437+
3438+ static PyObject *
3439+ _ssl__SSLContext_set_groups_impl (PySSLContext * self , const char * grouplist )
3440+ /*[clinic end generated code: output=0b5d05dfd371ffd0 input=2cc64cef21930741]*/
3441+ {
3442+ if (!SSL_CTX_set1_groups_list (self -> ctx , grouplist )) {
3443+ _setSSLError (get_state_ctx (self ), "unrecognized group" , 0 , __FILE__ , __LINE__ );
3444+ return NULL ;
3445+ }
3446+ Py_RETURN_NONE ;
3447+ }
3448+
3449+ /*[clinic input]
3450+ @critical_section
3451+ _ssl._SSLContext.get_groups
3452+ *
3453+ include_aliases: bool = False
3454+ [clinic start generated code]*/
3455+
3456+ static PyObject *
3457+ _ssl__SSLContext_get_groups_impl (PySSLContext * self , int include_aliases )
3458+ /*[clinic end generated code: output=6d6209dd1051529b input=3e8ee5deb277dcc5]*/
3459+ {
3460+ #if OPENSSL_VERSION_NUMBER >= 0x30500000L
3461+ STACK_OF (OPENSSL_CSTRING ) * groups ;
3462+ const char * group ;
3463+ size_t i , num ;
3464+ PyObject * result = NULL ;
3465+
3466+ if ((groups = sk_OPENSSL_CSTRING_new_null ()) == NULL ) {
3467+ _setSSLError (get_state_ctx (self ), "Can't allocate stack" , 0 , __FILE__ , __LINE__ );
3468+ return NULL ;
3469+ }
3470+
3471+ if (!SSL_CTX_get0_implemented_groups (self -> ctx , include_aliases , groups )) {
3472+ _setSSLError (get_state_ctx (self ), "Can't get groups" , 0 , __FILE__ , __LINE__ );
3473+ sk_OPENSSL_CSTRING_free (groups );
3474+ return NULL ;
3475+ }
3476+
3477+ num = sk_OPENSSL_CSTRING_num (groups );
3478+ result = PyList_New (num );
3479+ if (result == NULL ) {
3480+ _setSSLError (get_state_ctx (self ), "Can't allocate list" , 0 , __FILE__ , __LINE__ );
3481+ sk_OPENSSL_CSTRING_free (groups );
3482+ return NULL ;
3483+ }
3484+
3485+ for (i = 0 ; i < num ; ++ i ) {
3486+ group = sk_OPENSSL_CSTRING_value (groups , i );
3487+ PyList_SET_ITEM (result , i , PyUnicode_DecodeFSDefault (group ));
3488+ }
3489+
3490+ sk_OPENSSL_CSTRING_free (groups );
3491+ return result ;
3492+ #else
3493+ PyErr_SetString (PyExc_NotImplementedError ,
3494+ "Getting implemented groups requires OpenSSL 3.5 or later." );
3495+ return NULL ;
3496+ #endif
3497+ }
34053498
34063499static int
34073500do_protocol_selection (int alpn , unsigned char * * out , unsigned char * outlen ,
@@ -5249,6 +5342,7 @@ static struct PyMethodDef context_methods[] = {
52495342 _SSL__SSLCONTEXT__WRAP_SOCKET_METHODDEF
52505343 _SSL__SSLCONTEXT__WRAP_BIO_METHODDEF
52515344 _SSL__SSLCONTEXT_SET_CIPHERS_METHODDEF
5345+ _SSL__SSLCONTEXT_SET_GROUPS_METHODDEF
52525346 _SSL__SSLCONTEXT__SET_ALPN_PROTOCOLS_METHODDEF
52535347 _SSL__SSLCONTEXT_LOAD_CERT_CHAIN_METHODDEF
52545348 _SSL__SSLCONTEXT_LOAD_DH_PARAMS_METHODDEF
@@ -5259,6 +5353,7 @@ static struct PyMethodDef context_methods[] = {
52595353 _SSL__SSLCONTEXT_CERT_STORE_STATS_METHODDEF
52605354 _SSL__SSLCONTEXT_GET_CA_CERTS_METHODDEF
52615355 _SSL__SSLCONTEXT_GET_CIPHERS_METHODDEF
5356+ _SSL__SSLCONTEXT_GET_GROUPS_METHODDEF
52625357 _SSL__SSLCONTEXT_SET_PSK_CLIENT_CALLBACK_METHODDEF
52635358 _SSL__SSLCONTEXT_SET_PSK_SERVER_CALLBACK_METHODDEF
52645359 {NULL , NULL } /* sentinel */
0 commit comments