Нет способа конвертировать char *
в unsigned char *
.Они указывают на данные, и вы должны знать формат данных.
Существует как минимум 3 различных формата для хэша SHA-1:
- необработанный двоичный дайджест в видемассив из точно 20 октетов
- дайджест в виде шестнадцатеричной строки, например
"e5e9fa1ba31ecd1ae84f75caaa474f3a663f05f4"
- дайджест в виде строки Base64, например
"5en6G6MezRroT3XKqkdPOmY/BfQ="
Ваш malloc(20 * sizeof(unsigned char))
имеет точный размер двоичного дайджеста, но слишком мал для размещения шестнадцатеричной строки или строки Base64.Я предполагаю, что unsigned char *
указывает на двоичный дайджест.
Но char *
получен из аргументов командной строки main()
, поэтому char *
, вероятно, указывает на строку.Аргументы командной строки всегда являются строками C;они заканчиваются символом NUL '\0'
и никогда не содержат '\0'
в строке.Необработанные двоичные дайджесты могут содержать '\0'
, поэтому они не работают в качестве аргументов командной строки.
Код для преобразования дайджеста SHA-1 из шестнадцатеричной строки в необработанный двоичный файл может выглядеть как
#include <stdio.h>
#include <stdlib.h>
unsigned char *
sha1_from_hex(char *hex)
{
int i, m, n, octet;
unsigned char *digest;
digest = malloc(20);
if (!digest)
return NULL;
for (i = 0; i < 20; i++) {
sscanf(hex, " %n%2x%n", &m, &octet, &n);
if (m != 0 || n != 2)
goto fail;
digest[i] = octet;
hex += 2;
}
if (*hex)
goto fail;
return digest;
fail:
free(digest);
return NULL;
}
Не используйте strncpy(dst, src, 20)
для копирования сырых двоичных дайджестов.Функция strncpy (3) прекращает копирование, если находит '\0'
;поэтому, если ваш дайджест содержит '\0'
, вы потеряете часть дайджеста.