Неправильный дайджест SHA для очень длинных сообщений при использовании криптографии ядра - PullRequest
2 голосов
/ 16 марта 2020

Я пытаюсь вычислить дайджест ha sh, используя SHA-1, используя crypto ядра. Я получаю правильные результаты для сообщений размером до 4096 байт. Все, что за этим неправильно, неверно. Сам тест не дает сбоя, но дает неправильные ответы.

Comparison of kernel crypto versus OpenSSL

В левой части показан вывод из OpenSSL, а в правой части - криптография ядра. Я знаю, что левая сторона (OpenSSL) дает правильные результаты, потому что результаты были подтверждены лабораторией. На изображении длина сообщения составляет 32984, что составляет 4123 байта.

Мой код показан ниже:

int numpages = (msgLength / PAGE_SIZE);
if ( msgLength % PAGE_SIZE )
    numpages++; // Overflow

struct crypto_shash *tfm = NULL;
struct shash_desc *desc = NULL;
unsigned char *page_msg[numpages];
unsigned char *page_hash;
int i, msg_remaining;

tfm = crypto_alloc_shash("sha1", 0, 0);

desc = kmalloc(sizeof(*desc) + crypto_shash_descsize(tfm), GFP_KERNEL);
    if (!desc) {
        LOG_ERROR("Unable to allocate struct shash_desc\n");
        goto free_return;
    }

desc->tfm = tfm;
desc->flags = 0;

// temporary storage for hash in block-memory
page_hash = (unsigned char*)get_zeroed_page(GFP_KERNEL);

// setup message in block-memory
i=0;
msg_remaining = msgLength;
while ( msg_remaining > 0 ) {
    page_msg[i] = (unsigned char*)get_zeroed_page(GFP_KERNEL);
    memcpy(page_msg[i], msg + (i * PAGE_SIZE), (msg_remaining > PAGE_SIZE) ? PAGE_SIZE : msg_remaining);
    i++;
    msg_remaining -= PAGE_SIZE;
}

// do the operation
crypto_shash_init(desc);
if ( 0 != crypto_shash_digest(desc, page_msg[0], msgLength, page_hash) ) {
    LOG_ERROR("Bad Digest Returned\n");
    goto free_return;
}

free_return:
    crypto_free_shash(tfm);
    free_page((unsigned long)page_hash);
    for ( i = 0; i < numpages; i++ ) {
        free_page((unsigned long)page_msg[i]);
    }
...