Как вычислить SHA1 массива в ядре Linux
Я пытаюсь вычислить SHA1 целого массива в ядре Linux. Я прошел через это.crypto.c
/crypto.h
и security/integrity/ima/ima_crypto.c
но я не могу понять, как init
, а затем update
компьютер SHA1. Может ли кто-нибудь указать мне учебник или руководство о том, как это сделать?
1 ответ:
Есть довольно хорошее введение в Linux cryptography api в Documentation/crypto/api-intro.txt . Также проверьте fs / ecryptfs / crypto.c для реального примера использования функций.
Вот краткое резюме, хотя, чтобы вы начали:
Шаг 1: Объявление
Создайте несколько локальных переменных:
struct scatterlist sg; struct hash_desc desc; char *plaintext = "plaintext goes here"; size_t len = strlen(plaintext); u8 hashval[20];
- A
struct scatterlist
используется для хранения вашего открытого текста в формате, понятном функциямcrypto.h
, в то время как Astruct hash_desc
используется настроить хэширование.- переменная
plaintext
содержит нашу строку открытого текста, в то время какhashval
будет содержать хэш нашего открытого текста.- наконец,
len
содержит длину строки открытого текста.обратите внимание, что в то время как я использую открытый текст ASCII в этом примере, вы также можете передать целочисленный массив - просто сохраните общий объем памяти в
len
и замените каждый экземплярplaintext
своим целочисленным массивом:int myarr[4] = { 1, 3, 3, 7 }; size_t len = sizeof(myarr);
Будьте осторожны: элемент
int
обычно имеет размер больше байта, поэтому хранение целочисленных значений в массивеint
не будет иметь того же внутреннего представления, что и массивchar
- вы можете получить пустые байты в качестве отступа между значениями.Кроме того, если вы намереваетесь хэшировать представление ASCII ваших целых чисел, вам придется сначала преобразовать значения в вашем массиве в строку символьной последовательности (возможно, используя
sprintf
).Шаг 2: Инициализация
Инициализировать
sg
иdesc
:Обратите внимание, чтоsg_init_one(&sg, plaintext, len); desc.tfm = crypto_alloc_hash("sha1", 0, CRYPTO_ALG_ASYNC);
"sha1"
передается вcrypto_alloc_hash
; это может быть установлено в"md5"
для хэширования MD5 или любой другой поддерживаемой строки, чтобы использовать соответствующий метод хэширования.Шаг 3: Хеширование
Теперь выполните хэширование с тремя вызовами функций:
crypto_hash_init(&desc); crypto_hash_update(&desc, &sg, len); crypto_hash_final(&desc, hashval);
crypto_hash_init
настраивает механизм хеширования в соответствии с поставляемымstruct hash_desc
.crypto_hash_update
выполняет фактический метод хэширования открытого текста.- наконец,
crypto_hash_final
копии хэш для массива символов.Шаг 4: Очистка
Свободная выделенная память, удерживаемая
desc.tfm
:crypto_free_hash(desc.tfm);
См. также