如何在Python3.6'中实现FIPS_mode()和FIPS_mode_set();什么是ssl模块?
我试图在Python的ssl模块中实现FIPS_mode和FIPS_mode_set函数,因为默认情况下它们不存在。由于各种使用原因,Python3.4已经提交并被拒绝 以该补丁为灵感,我做了一些修改,并在ssl.py中添加了以下代码:如何在Python3.6'中实现FIPS_mode()和FIPS_mode_set();什么是ssl模块?,python,python-3.x,ssl,fips,Python,Python 3.x,Ssl,Fips,我试图在Python的ssl模块中实现FIPS_mode和FIPS_mode_set函数,因为默认情况下它们不存在。由于各种使用原因,Python3.4已经提交并被拒绝 以该补丁为灵感,我做了一些修改,并在ssl.py中添加了以下代码: try: from _ssl import FIPS_mode, FIPS_mode_set except ImportError: pass #define EXPORT_FIPSMODE_FUNCS #ifdef EXPORT_FIPSM
try:
from _ssl import FIPS_mode, FIPS_mode_set
except ImportError:
pass
#define EXPORT_FIPSMODE_FUNCS
#ifdef EXPORT_FIPSMODE_FUNCS
static PyObject *
_ssl_FIPS_mode_impl(PyObject *module) {
return PyLong_FromLong(FIPS_mode());
}
static PyObject *
_ssl_FIPS_mode_set_impl(PyObject *module, int n) {
if (FIPS_mode_set(n) == 0) {
_setSSLError(ERR_error_string(ERR_get_error(), NULL) , 0, __FILE__, __LINE__);
return NULL;
}
Py_RETURN_NONE;
}
#endif //EXPORT_FIPSMODE_FUNCS
/* List of functions exported by this module. */
static PyMethodDef PySSL_methods[] = {
_SSL__TEST_DECODE_CERT_METHODDEF
_SSL_RAND_ADD_METHODDEF
_SSL_RAND_BYTES_METHODDEF
_SSL_RAND_PSEUDO_BYTES_METHODDEF
_SSL_RAND_EGD_METHODDEF
_SSL_RAND_STATUS_METHODDEF
_SSL_GET_DEFAULT_VERIFY_PATHS_METHODDEF
_SSL_ENUM_CERTIFICATES_METHODDEF
_SSL_ENUM_CRLS_METHODDEF
_SSL_TXT2OBJ_METHODDEF
_SSL_NID2OBJ_METHODDEF
_SSL_FIPS_MODE_SET_METHODDEF
_SSL_FIPS_MODE_METHODDEF
{NULL, NULL} /* Sentinel */
};
以及\u ssl.c中的以下代码:
try:
from _ssl import FIPS_mode, FIPS_mode_set
except ImportError:
pass
#define EXPORT_FIPSMODE_FUNCS
#ifdef EXPORT_FIPSMODE_FUNCS
static PyObject *
_ssl_FIPS_mode_impl(PyObject *module) {
return PyLong_FromLong(FIPS_mode());
}
static PyObject *
_ssl_FIPS_mode_set_impl(PyObject *module, int n) {
if (FIPS_mode_set(n) == 0) {
_setSSLError(ERR_error_string(ERR_get_error(), NULL) , 0, __FILE__, __LINE__);
return NULL;
}
Py_RETURN_NONE;
}
#endif //EXPORT_FIPSMODE_FUNCS
/* List of functions exported by this module. */
static PyMethodDef PySSL_methods[] = {
_SSL__TEST_DECODE_CERT_METHODDEF
_SSL_RAND_ADD_METHODDEF
_SSL_RAND_BYTES_METHODDEF
_SSL_RAND_PSEUDO_BYTES_METHODDEF
_SSL_RAND_EGD_METHODDEF
_SSL_RAND_STATUS_METHODDEF
_SSL_GET_DEFAULT_VERIFY_PATHS_METHODDEF
_SSL_ENUM_CERTIFICATES_METHODDEF
_SSL_ENUM_CRLS_METHODDEF
_SSL_TXT2OBJ_METHODDEF
_SSL_NID2OBJ_METHODDEF
_SSL_FIPS_MODE_SET_METHODDEF
_SSL_FIPS_MODE_METHODDEF
{NULL, NULL} /* Sentinel */
};
但是,这会引发以下错误:
./Modules/_ssl.c:5060:5: error: '_SSL_FIPS_MODE_SET_METHODDEF' undeclared here (not in a function)
_SSL_FIPS_MODE_SET_METHODDEF
./Modules/_ssl.c:5061:5: error: expected '}' before '_SSL_FIPS_MODE_METHODDEF'
_SSL_FIPS_MODE_METHODDEF
./Modules/_ssl.c:4641:1: warning: '_ssl_FIPS_mode_impl' defined but not used [-Wunused-function] _ssl_FIPS_mode_impl(PyObject
*module) {
./Modules/_ssl.c:4646:1: warning: '_ssl_FIPS_mode_set_impl' defined but not used [-Wunused-function]
_ssl_FIPS_mode_set_impl(PyObject *module, int n) { ^
我很确定我在这里遗漏了一些非常琐碎的东西,但我似乎无法弄清楚到底是什么。任何帮助都将不胜感激!谢谢
更新:
CristiFati大喊一声,他指出我缺少需要定义的宏,我能够解决这个问题。如果其他人需要在Python 3.6中实现FIPS模式,请添加以下代码:
\u ssl.c:
static PyObject *
_ssl_FIPS_mode_impl(PyObject *module) {
return PyLong_FromLong(FIPS_mode());
}
static PyObject *
_ssl_FIPS_mode_set_impl(PyObject *module, int n) {
if (FIPS_mode_set(n) == 0) {
_setSSLError(ERR_error_string(ERR_get_error(), NULL) , 0, __FILE__, __LINE__);
return NULL;
}
Py_RETURN_NONE;
}
static PyMethodDef PySSL_methods[] = {
_SSL__TEST_DECODE_CERT_METHODDEF
_SSL_RAND_ADD_METHODDEF
_SSL_RAND_BYTES_METHODDEF
_SSL_RAND_PSEUDO_BYTES_METHODDEF
_SSL_RAND_EGD_METHODDEF
_SSL_RAND_STATUS_METHODDEF
_SSL_GET_DEFAULT_VERIFY_PATHS_METHODDEF
_SSL_ENUM_CERTIFICATES_METHODDEF
_SSL_ENUM_CRLS_METHODDEF
_SSL_TXT2OBJ_METHODDEF
_SSL_NID2OBJ_METHODDEF
_SSL_FIPS_MODE_METHODDEF
_SSL_FIPS_MODE_SET_METHODDEF
{NULL, NULL} /* Sentinel */
};
PyDoc_STRVAR(_ssl_FIPS_mode__doc__,
"FIPS Mode");
#define _SSL_FIPS_MODE_METHODDEF \
{"FIPS_mode", (PyCFunction)_ssl_FIPS_mode, METH_NOARGS, _ssl_FIPS_mode__doc__},
static PyObject *
_ssl_FIPS_mode_impl(PyObject *module);
static PyObject *
_ssl_FIPS_mode(PyObject *module, PyObject *Py_UNUSED(ignored))
{
return _ssl_FIPS_mode_impl(module);
}
PyDoc_STRVAR(_ssl_FIPS_mode_set_doc__,
"FIPS Mode Set");
#define _SSL_FIPS_MODE_SET_METHODDEF \
{"FIPS_mode_set", (PyCFunction)_ssl_FIPS_mode_set, METH_O, _ssl_FIPS_mode_set_doc__},
static PyObject *
_ssl_FIPS_mode_set_impl(PyObject *module, int n);
static PyObject *
_ssl_FIPS_mode_set(PyObject *module, PyObject *arg)
{
PyObject *return_value = NULL;
int n;
if (!PyArg_Parse(arg, "i:FIPS_mode_set", &n)) {
goto exit;
}
return_value = _ssl_FIPS_mode_set_impl(module, n);
exit:
return return_value;
}
try:
from _ssl import FIPS_mode, FIPS_mode_set
print('successful import')
except ImportError as e:
print('error in importing')
print(e)
\u ssl.c.h:
static PyObject *
_ssl_FIPS_mode_impl(PyObject *module) {
return PyLong_FromLong(FIPS_mode());
}
static PyObject *
_ssl_FIPS_mode_set_impl(PyObject *module, int n) {
if (FIPS_mode_set(n) == 0) {
_setSSLError(ERR_error_string(ERR_get_error(), NULL) , 0, __FILE__, __LINE__);
return NULL;
}
Py_RETURN_NONE;
}
static PyMethodDef PySSL_methods[] = {
_SSL__TEST_DECODE_CERT_METHODDEF
_SSL_RAND_ADD_METHODDEF
_SSL_RAND_BYTES_METHODDEF
_SSL_RAND_PSEUDO_BYTES_METHODDEF
_SSL_RAND_EGD_METHODDEF
_SSL_RAND_STATUS_METHODDEF
_SSL_GET_DEFAULT_VERIFY_PATHS_METHODDEF
_SSL_ENUM_CERTIFICATES_METHODDEF
_SSL_ENUM_CRLS_METHODDEF
_SSL_TXT2OBJ_METHODDEF
_SSL_NID2OBJ_METHODDEF
_SSL_FIPS_MODE_METHODDEF
_SSL_FIPS_MODE_SET_METHODDEF
{NULL, NULL} /* Sentinel */
};
PyDoc_STRVAR(_ssl_FIPS_mode__doc__,
"FIPS Mode");
#define _SSL_FIPS_MODE_METHODDEF \
{"FIPS_mode", (PyCFunction)_ssl_FIPS_mode, METH_NOARGS, _ssl_FIPS_mode__doc__},
static PyObject *
_ssl_FIPS_mode_impl(PyObject *module);
static PyObject *
_ssl_FIPS_mode(PyObject *module, PyObject *Py_UNUSED(ignored))
{
return _ssl_FIPS_mode_impl(module);
}
PyDoc_STRVAR(_ssl_FIPS_mode_set_doc__,
"FIPS Mode Set");
#define _SSL_FIPS_MODE_SET_METHODDEF \
{"FIPS_mode_set", (PyCFunction)_ssl_FIPS_mode_set, METH_O, _ssl_FIPS_mode_set_doc__},
static PyObject *
_ssl_FIPS_mode_set_impl(PyObject *module, int n);
static PyObject *
_ssl_FIPS_mode_set(PyObject *module, PyObject *arg)
{
PyObject *return_value = NULL;
int n;
if (!PyArg_Parse(arg, "i:FIPS_mode_set", &n)) {
goto exit;
}
return_value = _ssl_FIPS_mode_set_impl(module, n);
exit:
return return_value;
}
try:
from _ssl import FIPS_mode, FIPS_mode_set
print('successful import')
except ImportError as e:
print('error in importing')
print(e)
ssl.py:
static PyObject *
_ssl_FIPS_mode_impl(PyObject *module) {
return PyLong_FromLong(FIPS_mode());
}
static PyObject *
_ssl_FIPS_mode_set_impl(PyObject *module, int n) {
if (FIPS_mode_set(n) == 0) {
_setSSLError(ERR_error_string(ERR_get_error(), NULL) , 0, __FILE__, __LINE__);
return NULL;
}
Py_RETURN_NONE;
}
static PyMethodDef PySSL_methods[] = {
_SSL__TEST_DECODE_CERT_METHODDEF
_SSL_RAND_ADD_METHODDEF
_SSL_RAND_BYTES_METHODDEF
_SSL_RAND_PSEUDO_BYTES_METHODDEF
_SSL_RAND_EGD_METHODDEF
_SSL_RAND_STATUS_METHODDEF
_SSL_GET_DEFAULT_VERIFY_PATHS_METHODDEF
_SSL_ENUM_CERTIFICATES_METHODDEF
_SSL_ENUM_CRLS_METHODDEF
_SSL_TXT2OBJ_METHODDEF
_SSL_NID2OBJ_METHODDEF
_SSL_FIPS_MODE_METHODDEF
_SSL_FIPS_MODE_SET_METHODDEF
{NULL, NULL} /* Sentinel */
};
PyDoc_STRVAR(_ssl_FIPS_mode__doc__,
"FIPS Mode");
#define _SSL_FIPS_MODE_METHODDEF \
{"FIPS_mode", (PyCFunction)_ssl_FIPS_mode, METH_NOARGS, _ssl_FIPS_mode__doc__},
static PyObject *
_ssl_FIPS_mode_impl(PyObject *module);
static PyObject *
_ssl_FIPS_mode(PyObject *module, PyObject *Py_UNUSED(ignored))
{
return _ssl_FIPS_mode_impl(module);
}
PyDoc_STRVAR(_ssl_FIPS_mode_set_doc__,
"FIPS Mode Set");
#define _SSL_FIPS_MODE_SET_METHODDEF \
{"FIPS_mode_set", (PyCFunction)_ssl_FIPS_mode_set, METH_O, _ssl_FIPS_mode_set_doc__},
static PyObject *
_ssl_FIPS_mode_set_impl(PyObject *module, int n);
static PyObject *
_ssl_FIPS_mode_set(PyObject *module, PyObject *arg)
{
PyObject *return_value = NULL;
int n;
if (!PyArg_Parse(arg, "i:FIPS_mode_set", &n)) {
goto exit;
}
return_value = _ssl_FIPS_mode_set_impl(module, n);
exit:
return return_value;
}
try:
from _ssl import FIPS_mode, FIPS_mode_set
print('successful import')
except ImportError as e:
print('error in importing')
print(e)
查看源代码,我注意到自从Python3.5以来,${Python\u SRC\u DIR}/Modules/\u ssl.c结构与我提交补丁的3.4版本()相比发生了变化(变得“稍微”结构化,并且还包含生成的代码)
基本上,PySSL_methods数组中的每个条目不再当场定义,而是通过预处理器宏间接定义
您按照新标准操作,但忘记定义宏 要解决此问题,请执行以下操作:
#ifdef EXPORT\u FIPSMODE\u FUNCS
):
/。。。
}
#定义_SSL_FIPS_MODE_METHODDEF\
{“FIPS_mode”,(PyCFunction){ssl_FIPS_mode_impl,METH_NOARGS,NULL},
#定义_SSL_FIPS_MODE_SET_METHODDEF\
{“FIPS_mode_set”,(PyCFunction){ssl_FIPS_mode_set_impl,METH_O,NULL},
#endif//EXPORT\u FIPSMODE\u FUNCS
// ...
/。。。
_SSL_NID2OBJ_METHODDEF
#ifdef导出功能
_SSL_FIPS_MODE_METHODDEF
_SSL_FIPS_MODE_SET_METHODDEF
#endif//EXPORT\u FIPSMODE\u FUNCS
{NULL,NULL}/*哨兵*/
// ...
try:
from _ssl import FIPS_mode, FIPS_mode_set
except ImportError:
pass
#define EXPORT_FIPSMODE_FUNCS
#ifdef EXPORT_FIPSMODE_FUNCS
static PyObject *
_ssl_FIPS_mode_impl(PyObject *module) {
return PyLong_FromLong(FIPS_mode());
}
static PyObject *
_ssl_FIPS_mode_set_impl(PyObject *module, int n) {
if (FIPS_mode_set(n) == 0) {
_setSSLError(ERR_error_string(ERR_get_error(), NULL) , 0, __FILE__, __LINE__);
return NULL;
}
Py_RETURN_NONE;
}
#endif //EXPORT_FIPSMODE_FUNCS
/* List of functions exported by this module. */
static PyMethodDef PySSL_methods[] = {
_SSL__TEST_DECODE_CERT_METHODDEF
_SSL_RAND_ADD_METHODDEF
_SSL_RAND_BYTES_METHODDEF
_SSL_RAND_PSEUDO_BYTES_METHODDEF
_SSL_RAND_EGD_METHODDEF
_SSL_RAND_STATUS_METHODDEF
_SSL_GET_DEFAULT_VERIFY_PATHS_METHODDEF
_SSL_ENUM_CERTIFICATES_METHODDEF
_SSL_ENUM_CRLS_METHODDEF
_SSL_TXT2OBJ_METHODDEF
_SSL_NID2OBJ_METHODDEF
_SSL_FIPS_MODE_SET_METHODDEF
_SSL_FIPS_MODE_METHODDEF
{NULL, NULL} /* Sentinel */
};
- 因为您没有定义docstring,所以我用null(PyMethodDef的最后一个成员)填充了它们。这将产生语法正确的代码,但我不确定当您对这两个函数中的任何一个运行
时,它在运行时的行为如何。如果出现故障,请从修补程序中复制定义,或者使用PyDoc_STRVAR定义一些伪字符串(当然,还要重新编译)help()
- 虽然这比原来的补丁更接近标准,但它并不完全符合标准,正如OP(@HussainAliAkbar)在(第二次)编辑中所示。事情有点复杂(还涉及${PYTHON\u SRC\u DIR}/Modules/clinic/\u ssl.c.h)。请参阅下面的下一更新部分
更新#0
- 我花了一些时间检查了一下那个诊所文件夹是怎么回事。是的。我认为它是<强>主改进<强>,因为它允许开发人员在每个函数(“猴子工作”) 中编写参数解析代码(涉及Pyalg**,Py*yChalk函数)。
- 我花了几个小时,但我做到了“按部就班”(至少,我认为是这样)
---Python-3.6.4/Modules//u ssl.c.orig 2018-07-27 19:10:06.13199999+0300
+++Python-3.6.4/Modules/_ssl.c 2018-07-27 20:32:15.531999999+0300
@@ -4789,6 +4789,46 @@
返回结果;
}
+#如果已定义(导出FIPSMODE函数)
+
+无符号字符_fips_table_sig[0x0C]={0x21、0x7A、0x65、0x6C、0x75、0x72、0x20、0x49、0x54、0x41、0x46、0x00};
+
+/*[诊所资料]
+_ssl.FIPS_模式
+
+如果启用FIPS模式,则返回1(!=0),否则返回0。
+[诊所启动生成代码]*/
+
+静态PyObject*
+_ssl_FIPS_mode_impl(PyObject*模块)
+/*[门诊端生成代码:输出=89f5a88ec715a291输入=52E4E5FDD1F55C7]*/
+{
+从long(FIPS_mode())返回PyLong_;
+}
+
+/*[诊所资料]
+_ssl.FIPS\u模式\u集
+模式:int
+ /
+
+尝试将FIPS模式设置为“模式”(int)。
+
+一无所获。启用FIPS模式失败时引发SSLError。
+[诊所启动生成代码]*/
+
+静态PyObject*
+_ssl\u FIPS\u mode\u set\u impl(PyObject*模块,int模式)
+/*[临床最终生成代码:输出=70e3e9f3bb4fce65输入=899c21a986720235]*/
+{
+如果(FIPS_模式_设置(模式)==0){
+设置错误(ERR\u error\u字符串(ERR\u get\u error(),NULL),0,文件,行;
+返回NULL;
+ }
+Py_返回_无;
+}
+
+#endif//EXPORT\u FIPSMODE\u FUNCS
+
#ifdef硕士学位
静态PyObject*
@@ -5055,6 +5095,8 @@
_SSL_ENUM_CRLS_METHODDEF
_SSL_TXT2OBJ_METHODDEF
_SSL_NID2OBJ_METHODDEF
+_SSL_FIPS_MODE_METHODDEF
+_SSL_FIPS_MODE_SET_METHODDEF
{NULL,NULL}/*哨兵*/
};
---Python-3.6.4/Modules/clinic//u ssl.c.h.orig 2018-07-27 19:10:48.06799999+0300
+++Python-3.6.4/Modules/clinic/_ssl.c.h 2018-07-27 20:31:04.50799999+0300
@@ -1062,6 +1062,61 @@
返回_值;
}
+#如果已定义(导出FIPSMODE函数)
+
+PyDoc_STRVAR(_ssl_FIPS_mode___doc_uuu),
+FIPS_模式($module,/)\n
+“--\n”
+“\n”
+“如果启用FIPS模式,则返回1(!=0),否则返回0。”);
+
+#定义_SSL_FIPS_MODE_METHODDEF\
+{“FIPS_mode”,(PyCFunction){ssl_FIPS_mode,METH_NOARGS,{ssl_FIPS_mode_doc},
+
+静态PyObject*
+_ssl_FIPS_mode_impl(PyObject*模块);
+
+静态PyObject*
+_ssl_FIPS_模式(PyObject*模块,PyObject*Py_未使用(忽略))
+{
+返回ssl FIPS模式impl(模块);
+}
+
+#endif/*已定义(导出FIPSMODE函数)*/
+
+#如果已定义(导出FIPSMODE函数)
+
+PyDoc_STRVAR(_ssl