@@ -1986,6 +1986,33 @@ set_default_verify_paths(PySSLContext *self, PyObject *unused)
19861986 Py_RETURN_NONE ;
19871987}
19881988
1989+ static PyObject *
1990+ set_ecdh_curve (PySSLContext * self , PyObject * name )
1991+ {
1992+ PyObject * name_bytes ;
1993+ int nid ;
1994+ EC_KEY * key ;
1995+
1996+ if (!PyUnicode_FSConverter (name , & name_bytes ))
1997+ return NULL ;
1998+ assert (PyBytes_Check (name_bytes ));
1999+ nid = OBJ_sn2nid (PyBytes_AS_STRING (name_bytes ));
2000+ Py_DECREF (name_bytes );
2001+ if (nid == 0 ) {
2002+ PyErr_Format (PyExc_ValueError ,
2003+ "unknown elliptic curve name %R" , name );
2004+ return NULL ;
2005+ }
2006+ key = EC_KEY_new_by_curve_name (nid );
2007+ if (key == NULL ) {
2008+ _setSSLError (NULL , 0 , __FILE__ , __LINE__ );
2009+ return NULL ;
2010+ }
2011+ SSL_CTX_set_tmp_ecdh (self -> ctx , key );
2012+ EC_KEY_free (key );
2013+ Py_RETURN_NONE ;
2014+ }
2015+
19892016static PyGetSetDef context_getsetlist [] = {
19902017 {"options" , (getter ) get_options ,
19912018 (setter ) set_options , NULL },
@@ -2007,6 +2034,8 @@ static struct PyMethodDef context_methods[] = {
20072034 METH_NOARGS , NULL },
20082035 {"set_default_verify_paths" , (PyCFunction ) set_default_verify_paths ,
20092036 METH_NOARGS , NULL },
2037+ {"set_ecdh_curve" , (PyCFunction ) set_ecdh_curve ,
2038+ METH_O , NULL },
20102039 {NULL , NULL } /* sentinel */
20112040};
20122041
@@ -2452,6 +2481,7 @@ PyInit__ssl(void)
24522481 PyModule_AddIntConstant (m , "OP_NO_TLSv1" , SSL_OP_NO_TLSv1 );
24532482 PyModule_AddIntConstant (m , "OP_CIPHER_SERVER_PREFERENCE" ,
24542483 SSL_OP_CIPHER_SERVER_PREFERENCE );
2484+ PyModule_AddIntConstant (m , "OP_SINGLE_ECDH_USE" , SSL_OP_SINGLE_ECDH_USE );
24552485
24562486#ifdef SSL_CTRL_SET_TLSEXT_HOSTNAME
24572487 r = Py_True ;
0 commit comments