Ошибка libsodium crypto_box_seal_open - PullRequest
       35

Ошибка libsodium crypto_box_seal_open

0 голосов
/ 10 октября 2018

Я использую следующую функцию для создания запечатанного ящика с использованием libsodium:

void encrypt_message(char *msg, char *enc_msg, int db_id)
{
    unsigned char pk[crypto_box_PUBLICKEYBYTES] = { '\0' };
    char key[BUFLEN] = { '\0' };

    db_man_get_contacts_public_key(db_id, key);

    sodium_hex2bin(pk, crypto_box_publickeybytes(), key, sizeof(key), 
                    NULL, NULL, NULL);

    crypto_box_seal(enc_msg, msg, sizeof(msg), pk);
}

После чего я преобразую двоичное зашифрованное сообщение в шестнадцатеричное, для хранения на диске, используя следующую функцию libsodium

sodium_bin2hex(hex_cipher_text, sizeof(hex_cipher_text),
                       cipher_text, sizeof(cipher_text));

hex_cipher_text затем сохраняется в базе данных SQLite3.Когда я получаю сообщение для расшифровки, происходит сбой вызова libsodium с кодом ошибки 1 .Моя функция расшифровки выглядит следующим образом:

void decrypt_message(message *msg)
{
    unsigned char pk[crypto_box_SECRETKEYBYTES] = { '\0' };
    unsigned char pubkey[crypto_box_PUBLICKEYBYTES] = { '\0' };
    char key[BUFLEN] = { '\0' };
    unsigned char tmp[BUFLEN] = { '\0' };
    int dbg = 0;

    db_man_get_my_private_key(key);
    sodium_hex2bin(pk, crypto_box_secretkeybytes(), key, sizeof(key), NULL, NULL, NULL);

    memset(key, '\0', BUFLEN);

    db_man_get_my_public_key(key);
    sodium_hex2bin(pubkey, crypto_box_publickeybytes(), key, sizeof(key), 
                    NULL, NULL, NULL);

    sodium_hex2bin(tmp, sizeof(tmp), msg->enc_body, sizeof(msg- >enc_body), 
                NULL, NULL, NULL);

    if ((dbg = crypto_box_seal_open(msg->dec_body, tmp, sizeof(tmp), pubkey, pk) != 0))
    {
        fprintf(stderr, "Decryption failed!\nError code: %d\n\n", dbg);   
    }
}

Любой совет будет принят с благодарностью.

Обновлен

По совету ФранкДенис и DamV Я изменил предыдущие функции шифрования и дешифрования следующим образом;обратите внимание на изменение вызова функции sizeof () на соответствующий вызов функции strlen () .

void encrypt_message(char *msg, char *enc_msg, int db_id)
{
    unsigned char pk[crypto_box_PUBLICKEYBYTES] = { '\0' };
    char key[BUFLEN] = { '\0' };

    db_man_get_contacts_public_key(db_id, key);

    sodium_hex2bin(pk, crypto_box_publickeybytes(), key, strlen(key), 
                    NULL, NULL, NULL);

    crypto_box_seal(enc_msg, msg, USR_MSG_MAX_LENGTH, pk);

}

void decrypt_message(message *msg)
{
    unsigned char pk[crypto_box_SECRETKEYBYTES] = { '\0' };
    unsigned char pubkey[crypto_box_PUBLICKEYBYTES] = { '\0' };
    char key[BUFLEN] = { '\0' };
    unsigned char tmp[BUFLEN] = { '\0' };
    int dbg = 0;

    db_man_get_my_private_key(key);
    sodium_hex2bin(pk, crypto_box_secretkeybytes(), key, strlen(key), 
                    NULL, NULL, NULL);

    memset(key, '\0', BUFLEN);

    db_man_get_my_public_key(key);
    sodium_hex2bin(pubkey, crypto_box_publickeybytes(), key, 
                    strlen(key), NULL, NULL, NULL);

    sodium_hex2bin(tmp, sizeof(tmp), msg->enc_body, strlen(msg->enc_body), 
                    NULL, NULL, NULL);

    if ((dbg = crypto_box_seal_open(msg->dec_body, tmp, 
        USR_MSG_MAX_LENGTH + crypto_box_SEALBYTES, pubkey, pk) != 0))
        {
            fprintf(stderr, "Decryption failed!\nError code: %d\n\n", dbg);

        }
}

Ответы [ 2 ]

0 голосов
/ 10 октября 2018

sizeof <pointer> возвращает константу, размер самого указателя.

В вашем коде sizeof(msg) всегда будет возвращать 4 или 8, независимо от размера сообщения.

sizeof(msg->enc_body), вероятно, тоже не делает то, что вы хотите.

Если вы новичок в языке C, я бы рекомендовал забыть ключевое слово sizeof.

Он вам редко нужен, и он является основным источником путаницы, ошибок и уязвимостей в приложениях, написанных людьми, плохо знакомыми с языком.

Единственное, что вам нужно запомнить, это то, что sizeof (<type>)или sizeof value всегда возвращает константу.

0 голосов
/ 10 октября 2018

Когда я получаю сообщение для расшифровки, происходит сбой вызова libsodium с кодом ошибки 1

Вы имеете в виду, что он возвращает -1, верно?

IИнтересно, может ли проблема быть с размером массива, который содержит двоичные значения.Я имею в виду, что если размер данных, хранящихся в шестнадцатеричной форме, меньше буфера, который вы выделили для его хранения, вы потеряете информацию о том, к какой части буфера действительно была записана.

Я особенно обеспокоено enc_body -> тмп.Если размер двоичных данных меньше, чем BUFLEN, вы дадите crypto_box_seal_open размер буфера больше, чем тот, который вы хотите дать.Это вызовет проблему с расшифровкой, не так ли?

На практике я думаю, что вы должны восстановить размер данных после вызова hex2bin (он, вероятно, выводит его), а затем передать его в crypto_box_seal_open вместо sizeof (tmp) (он же BUFLEN).

...