#c
#c
Вопрос:
Этот вопрос сформулирован в стиле, в котором я познакомлю читателя с проблемой в начале, а в конце я представлю ему свою проблему, чтобы лучше понять мою ситуацию.
В этом протоколе: введите описание ссылки здесь создается структура salt_channel_t, которая определенно содержит необходимые криптографические переменные, которые я использую в программе для выполнения криптографических операций, таких как шифрование данных, дешифрование данных, аутентификация пользователя и тому подобное.
typedef struct salt_channel_s {
/* Encryption and signature stuff */
uint8_t ek_common[api_crypto_box_BEFORENMBYTES]; /**< Symmetric session encryption key. */
uint8_t peer_sk_pub[api_crypto_sign_PUBLICKEYBYTES];/**< Peer public signature key. */
uint8_t my_sk_sec[api_crypto_sign_SECRETKEYBYTES]; /**< My secret signature key. */
uint8_t *my_sk_pub; /**< My public signature key, points to amp;my_sk_sec[32]. */
uint8_t write_nonce[api_crypto_box_NONCEBYTES]; /**< Write nonce. */
uint8_t read_nonce[api_crypto_box_NONCEBYTES]; /**< Read nonce. */
salt_io_channel_t write_channel; /**< Write channel structure. */
salt_io_impl write_impl; /**< Function pointer to write implementation. */
salt_io_channel_t read_channel; /**< Read channel structure. */
salt_io_impl read_impl; /**< Function pointer to read implementation. */
uint8_t *hdshk_buffer; /**< Handshake buffer, used only during handshake. */
uint32_t hdshk_buffer_size; /**< Handshake buffer size >= SALT_HNDSHK_BUFFER_SIZE. */
} salt_channel_t;
Я прикрепляю часть структуры, она не завершена, я просто хотел увеличить ее.
Я постепенно заполняю эту структуру такими функциями, как salt_create (), salt_init_session () и тому подобное. Я создал переменную типа salt_channel_t с именем client_channel или server_channel (в зависимости от того, клиент это или сервер),
salt_channel_t client_channel;
salt_channel_t server_channel;
который, однако, является обычной переменной типа указателя. Поскольку функции протокола salt имеют формальные параметры, в основном типа указателя, я обращаюсь к ним классически через оператор amp; . например:
salt_create(amp;client_channel, SALT_CLIENT, (salt_io_impl) amp;dummy, (salt_io_impl) amp;dummy, NULL);
salt_init_session(amp;client_channel, client_buffer, sizeof(client_buffer));
Однако следующая функция:
salt_ret_t salti_wrap(salt_channel_t *p_channel,
uint8_t *p_data,
uint32_t size,
uint8_t header,
uint8_t **wrapped,
uint32_t *wrapped_length,
bool last_msg);
следует выполнить шифрование данных.
Т.Е. Использование будет:
параметр p_channel Указывает на структуру канала соли.
параметр p_data Указывает на текстовое сообщение clear.
размер параметра Размер открытого текстового сообщения.
тип параметра Тип сообщения.
параметр, завернутый, возвращает указатель на то место, где начинается необработанное сообщение для отправки.
параметр wrapped_length возвращает длину необработанного обернутого сообщения.
И зашифрованный блок, который я хочу отправить по сетевому каналу, используя, например, TCP, должен храниться в параметре wrapped, а длина этого блока — в параметре wrapped_length . Использование функции:
salti_io_write(client_channel, client_channel.write_channel.p_data, client_channel.write_channel.size);
затем этот зашифрованный блок определенного размера отправляется по каналу другой стороне.
Это функция всего тела:
salt_ret_t salti_wrap(salt_channel_t *p_channel,
uint8_t *p_data,
uint32_t size,
uint8_t header,
uint8_t **wrapped,
uint32_t *wrapped_length,
bool last_msg)
{
int ret;
memset(p_data, 0x00, api_crypto_box_ZEROBYTES);
p_data[32] = header;
p_data[33] = 0x00;
//crypto function
ret = api_crypto_box_afternm(p_data,
p_data,
size SALT_WRAP_OVERHEAD_SIZE,
p_channel->write_nonce,
p_channel->ek_common);
p_data[14] = SALT_ENCRYPTED_MSG_HEADER_VALUE;
p_data[15] = (last_msg) ? SALT_LAST_FLAG : 0x00U;
/*
* size is of cleartext message, with time[4], header[2], MAC[16] and header[2] the size if 24 bytes larger.
*/
salti_u32_to_bytes(amp;p_data[10], size SALT_WRAP_OVERHEAD_IO_SIZE);
/*
* The 4 size bytes are serialized. The size to send is 4 bytes more.
*/
*wrapped = amp;p_data[10];
*wrapped_length = size SALT_WRAP_OVERHEAD_IO_SIZE SALT_LENGTH_SIZE;
return SALT_SUCCESS;
}
И я вызываю эту функцию по этим правилам:
salti_wrapped(amp;client_channel,amp;client_channel.hdshk_buffer[SALT_M3_HOST_WRAPPED_OFFSET], size, SALT_M3_HEADER_VALUE, amp;client_channel.write_channel.p_data, amp;client_channel.write_channel.size, false);
Я знаю, что это чушь собачья, и я никогда не получу зашифрованные данные таким образом. Я не могу посоветовать себе, как это умело исправить в office, чтобы он выполнял свою работу должным образом. У кого-нибудь есть какая-нибудь умная идея, как решить эту проблему?
Я ожидаю, что выходные данные будут зашифрованы и сохранены в обернутой переменной wrapped_length . Однако в обернутой переменной они не означают одно и то же, и обернутая _length выходит для меня около 4237841, что также является полным заблуждением.
Комментарии:
1. В чем именно ваша проблема? Он читается так, как будто вы не получаете ожидаемый результат. Вы должны описать, что вы ожидаете от данного ввода и что вы получаете вместо этого.
2. Настало время научиться использовать отладчик. Пройдитесь по своему коду и посмотрите на него и переменные.