Неверная длина сообщения при использовании C Python API

Я пытаюсь расширить 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, однако, когда он добирается до ключа, он выдает ошибку,

  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

Любые идеи о том, почему я не могу успешно разобрать длину ключа?

1 ответ

Вы указали длину как size_t, s# формат не берет size_t, Требуется int или же Py_ssize_t в зависимости от того, PY_SSIZE_T_CLEAN макрос был #define д, прежде чем в том числе Python.h,

Примечание: для всех # варианты форматов (s#, y# и т. д.), тип аргумента длины (int или Py_ssize_t) контролируется путем определения макроса PY_SSIZE_T_CLEAN перед включением Python.h, Если макрос был определен, длина Py_ssize_t а не int, Это поведение изменится в будущей версии Python для поддержки только Py_ssize_t и бросить int служба поддержки. Лучше всегда определять PY_SSIZE_T_CLEAN,

Другие вопросы по тегам