我试图在Python的ssl模块中实现FIPS_mode和FIPS_mode_set函数,因为它们在默认情况下不存在。^python3.4的{a1}已提交,但由于各种使用原因被拒绝。在
作为灵感,我做了一些修改,并在中添加了以下代码ssl.py文件:
try:
from _ssl import FIPS_mode, FIPS_mode_set
except ImportError:
pass
以及\u ssl.c中的以下代码:
^{pr2}$但是,这会引发以下错误:
./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他指出我缺少需要定义的宏,我能够解决这个问题。如果其他人需要在Python3.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 */
};
\u ssl.c.h:
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;
}
ssl.py文件:
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_SRC_DIR}/Modules/_ssl.c的结构与我提交补丁的3.4版本相比发生了变化([Python]: Issue 27592: FIPS_mode() and FIPS_mode_set() functions in Python (ssl))。
基本上,PySSL_methods数组中的每个条目都不再是当场定义的,而是通过预处理器宏间接定义的。
您按照新的标准执行操作,但忘记定义宏。在
为了解决问题:
为PyMethodDef项定义2个宏(内部
#ifdef EXPORT_FIPSMODE_FUNCS
):“Protect”在定义PySSL\u方法时,通过ifdef子句(类似于它们的定义位置)来保护新宏(这样,如果EXPORT_FIPSMODE_functs未定义,则不会出现编译错误):
注意事项:
help()
。如果出现错误,请从补丁中复制定义或使用PyDoc_STRVAR定义一些伪字符串(当然还要重新编译)@EDIT0:
Python-3.6.4-ssl_fips.差异:
注意事项:
这是一个diff(请注意,它在${PYTHON\usrc_DIR}之外)。请参见[SO]: Run/Debug a Django application's UnitTests from the mouse right click context menu in PyCharm Community Edition? (@CristiFati's answer)(Patchingutrunner部分)了解如何在Win上应用补丁(基本上,以1“+”符号开头的每一行都会进入,而以1“-”符号开头的每一行都会退出)。我正在使用Cygwin,btw
源基线是v3.6.4(如文件名所示)
我还测试了更改(有一次我使用了为[SO]: How to enable FIPS mode for libcrypto and libssl packaged with Python? (@CristiFati's answer)构建的OpenSSL版本)
输出:
相关问题 更多 >
编程相关推荐