Как вычислить 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);
См. также