【问题标题】:Incorrect message length when using C python api使用 C python api 时消息长度不正确
【发布时间】:2018-08-07 18:34:01
【问题描述】:

我正在尝试扩展 libhydrogen(可在此处找到的开源代码:https://github.com/jedisct1/libhydrogen/)以支持对 Python 中底层库的调用。但是,我遇到了一个奇怪的问题。 具体来说,我有以下代码:

static PyObject* crypto_secretbox_encrypt(PyObject* self, PyObject* args){
    char* m;
    size_t mlen;
    uint64_t msg_id;
    char *ctx;
    size_t ctx_len;
    const uint8_t *key; //this shouldn't matter its secret
    size_t key_len;
    PyArg_ParseTuple(args, "s#|K|s#|s#", &m, &mlen, &msg_id, &ctx, &ctx_len, &key, &key_len); //only s# accepts null bytes, need to random pointers to store lengths
    //printf("Parsed \n");
    //printf("MSG: %s, MSG_ID: %" PRIu64 ", CTX: %s\n", m, msg_id, ctx);
    if(ctx_len != hydro_secretbox_CONTEXTBYTES){
        PyErr_Format(PyExc_ValueError, "Context not of correct size: Received %lu bytes", ctx_len);
        return NULL;
    }

    if(key_len != hydro_secretbox_KEYBYTES){
        PyErr_Format(PyExc_ValueError, "Key not of correct size: Received %lu bytes", key_len);
        return NULL;
    }

它能够成功解析ctx的长度,但是,当它到达key时就会抛出错误,

  File "cryptotest.py", line 7, in <module>
    c1 = crypto.secretbox_encrypt("message1", 0, "\x00"*8, '\x00'*32);
ValueError: Key not of correct size: Received 140123308032032 bytes

关于为什么我无法成功解析密钥长度的任何想法?

【问题讨论】:

    标签: python c python-c-api python-extensions


    【解决方案1】:

    您已将长度指定为size_ts# 格式不采用 size_tIt takes an int or Py_ssize_t,取决于 PY_SSIZE_T_CLEAN 宏在包含 Python.h 之前是否为 #defined。

    注意:对于格式的所有# 变体(s#y# 等),长度参数的类型(int 或Py_ssize_t)通过定义来控制包含Python.h 之前的宏PY_SSIZE_T_CLEAN。如果定义了宏,则长度为Py_ssize_t 而不是int。此行为将在未来的 Python 版本中更改为仅支持 Py_ssize_t 并删除 int 支持。最好总是定义PY_SSIZE_T_CLEAN

    【讨论】:

    • 谢谢!我刚刚意识到我正在转换为错误的数据类型,这是一个潜在的问题,我假设某些类型转换会在解析 number 时弄乱它的值。我找不到有关 Py_ssize_t 的文档,但我可以毫无问题地转换为 size_t 吗?
    • @HansonD​​uan:与Py_ssize_t 的文档最接近的是PEP 353,它将其指定为与size_t 相同的大小,但已签名,并在@987654345 时指定为ssize_t 的typedef @ 可用。
    猜你喜欢
    • 2021-12-15
    • 1970-01-01
    • 1970-01-01
    • 2018-04-25
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-06-24
    • 1970-01-01
    相关资源
    最近更新 更多