Как вычислить SHA1 массива в ядре Linux


Я пытаюсь вычислить SHA1 целого массива в ядре Linux. Я прошел через это.crypto.c/crypto.h и security/integrity/ima/ima_crypto.c но я не могу понять, как init, а затем update компьютер SHA1. Может ли кто-нибудь указать мне учебник или руководство о том, как это сделать?

1 3

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, в то время как A struct 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);

См. также

Как использовать CryptoAPI в ядре linux 2.6