2015-11-19 6 views
0

Я пытаюсь использовать криптографические библиотеки ядра Linux для вычисления значения HMAC с учетом ключа и сообщения. Идея состоит в том, чтобы вычислить HMAC и вставить его в опцию TCP во время сеанса iperf (эта часть не актуальна). Это функция, которую я написал, чтобы использовать криптографические библиотеки, и он принимает два ключа 8 байт (которые должны быть объединены) и переменным числа байт, образующей сообщения:'BUG: scheduling while atomic' crypto_alloc_hash

void crypto_hmac_sha1(u8 *key_1, u8 *key_2, u32 *hash_out, int arg_num, ...) 
{ 
    struct crypto_ashash *shash; 
    struct shash_desc *desc = NULL; 
    const char hmac_alg[] = "hmac(sha1)"; 
    u8 key[16]; 
    int i; 
    int ret; 
    int length; 
    u8 *msg; 
    va_list list; 

    /* Initialize result placeholder */ 
    memset(hash_out, 0, sizeof(hash_out)); 

    for (i = 0; i < 8; i++) 
     key[i] ^= key_1[i]; 
    for (i = 0; i < 8; i++) 
     key[i + 8] ^= key_2[i]; 

    printk("A1\n"); 
    shash = crypto_alloc_ahash(hmac_alg, 0, 0); 
    printk("A2\n"); 
    desc = kzalloc(sizeof(*desc) + crypto_shash_descsize(shash), GFP_KERNEL); 
    if (!desc) 
     goto out; 

    desc->tfm = shash; 
    desc->flags = CRYPTO_TFM_REQ_MAY_SLEEP; 

    ret = crypto_shash_setkey(shash, key, 16); 
    if (ret < 0) 
     goto out; 

    crypto_shash_init(desc); 

    for (i = 0; i < arg_num; i++) { 
     length = va_arg(list, int); 
     msg = va_arg(list, u8 *); 
     ret = crypto_shash_update(desc, msg, length); 
     if (ret < 0) 
      goto out; 
    } 

    ret = crypto_shash_final(desc, hash_out); 
out: 
    kfree(desc); 
} 

Ошибка заключается в следующем (из-за к тому, что crypto_alloc_ahash пытается получить семафор и не допускается в данном контексте):

BUG: scheduling while atomic: iperf/769/0x00000100 
CPU: 0 PID: 769 Comm: iperf Not tainted 4.1.0-gdee0521-dirty #143 
Received SIGSEGV in SIGSEGV handler, aborting stack trace! 

Фикс предложения?

+1

'Исправить предложения?' - Очевидно: не используйте функцию, которая может спать, в контексте, который запрещает спать. Если результат функции сна не требуется * немедленно *, вы можете отложить его вызов, используя. например. 'Workqueue'. В противном случае ... ваш дизайн просто невозможно. – Tsyvarev

ответ

1

Не знакомы с библиотекой crypto: если у вас есть верхняя граница для числа одновременных исполнений crypto_hmac_sha1, вы можете использовать пул предварительно распределенных структур хеш-алгоритмов. Учитывая, что планирование/спящий режим, похоже, не разрешено, такой привязке не должно быть трудно найти: количество аппаратных потоков будет делать это.

Также, CRYPTO_TFM_REQ_MAY_SLEEP представляется подозрительным, если планирование не разрешено.

+0

Используя «предварительно распределенные структуры алгоритмов хэша», вы хотите переместить строку «crypto_alloc_ahash (hmac_alg, 0, 0)»; в другом месте, за пределами текущего контекста? –

+0

Да, вам нужно будет вызвать 'crypto_alloc_ahash' перед первым вызовом' crypto_hmac_sha1'. – kubanrob

 Смежные вопросы

  • Нет связанных вопросов^_^