Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/303.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/python-3.x/16.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何在Python3.6'中实现FIPS_mode()和FIPS_mode_set();什么是ssl模块?_Python_Python 3.x_Ssl_Fips - Fatal编程技术网

如何在Python3.6'中实现FIPS_mode()和FIPS_mode_set();什么是ssl模块?

如何在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

我试图在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_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数组中的每个条目不再当场定义,而是通过预处理器宏间接定义
您按照新标准操作,但忘记定义宏

要解决此问题,请执行以下操作:

  • 为PyMethodDef条目定义两个宏(内部
    #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
    // ...
    
  • 在定义PySSL_方法时,通过一个#ifdef子句(与定义它们的位置类似)来“保护”新宏(这样,如果未定义EXPORT_FIPSMODE_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的最后一个成员)填充了它们。这将产生语法正确的代码,但我不确定当您对这两个函数中的任何一个运行
      help()
      时,它在运行时的行为如何。如果出现故障,请从修补程序中复制定义,或者使用PyDoc_STRVAR定义一些伪字符串(当然,还要重新编译)
    • 虽然这比原来的补丁更接近标准,但它并不完全符合标准,正如OP(@HussainAliAkbar)在(第二次)编辑中所示。事情有点复杂(还涉及${PYTHON\u SRC\u DIR}/Modules/clinic/\u ssl.c.h)。请参阅下面的下一更新部分


    更新#0
    • 我花了一些时间检查了一下那个诊所文件夹是怎么回事。是的。我认为它是<强>主改进<强>,因为它允许开发人员在每个函数(“猴子工作”)
    • 中编写参数解析代码(涉及Pyalg**,Py*yChalk函数)。
    • 我花了几个小时,但我做到了“按部就班”(至少,我认为是这样)
    Python-3.6.4-ssl_fips.diff:

    ---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