Неверная длина сообщения при использовании 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
,