2015-09-24 2 views
0

Я пытаюсь вычислить хеш-память md5, используя криптографический API, но столкнулся с множеством проблем.Вычислительный хэш с криптовым API

char * getHashedKey(char *keybuf) { 
    char * output; 
    struct scatterlist sg; 
    struct crypto_hash *tfm; 
    struct hash_desc desc; 
    int i; 

    printk("%s received keybuf %s %d\n", __func__, keybuf, strlen(keybuf)); 
    output = kmalloc(sizeof(*output) * 16, GFP_KERNEL); 
    memset(output, 0x00, 16); 

    // works if I overwrite value like this 
    //keybuf = "abcdef"; 

    tfm = crypto_alloc_hash("md5", 0, CRYPTO_ALG_ASYNC); 
    desc.tfm = tfm; 
    desc.flags = 0; 

    sg_init_one(&sg, keybuf, strlen(keybuf)); 
    // tried type casting too 
    //sg_init_one(&sg, (u8 *) keybuf, strlen(keybuf)); 
    crypto_hash_init(&desc); 
    crypto_hash_update(&desc, &sg, strlen(keybuf)); 
    crypto_hash_final(&desc, output); 

    for(i = 0; i < 16; i++) 
    { 
     printk("%x", output[i]); 
    } 
    printk("\n"); 

    return output; 
} 

Вот что я пробовал: 1. Если «выход» это символ без знака, я получаю правильный вывод, но не тогда, когда я использую символ.

  1. Если я больше напишу значение keybuf, только тогда он будет работать.

  2. Я попытался отливку типа keybuf как (u8 *), как указано в некоторых форумах, но это не работает слишком

Искаженная выход с помощью полукокс:

3ffffffe9ffffffb7ffffffb472ffffffe0ffffffed41225affffffebffffffdaffffffd3ffffffbaffffffabffffffde 

Может кто-нибудь поможет мне в этом?

ответ

1

У вас есть две проблемы с отображением.

Первое: Передача значения char - неявно signed char - в качестве аргумента printf() заставляет его быть продлен до signed int. В результате передача значения с помощью набора высоких бит (например, 0xe9, второго байта в вашем образце) приведет к тому, что он будет расширен до 0xffffffe9 и напечатан как таковой.

Чтобы исправить это, объявите output как массив unsigned char или эквивалентный тип u8.

Во-вторых: вы печатаете каждый байт, используя строку формата %x, без указанных дополнений. Это вызовет значения между 0x0 и 0xf, которые будут напечатаны как один символ вместо двух, что приведет к неоднозначному выводу.

Чтобы исправить это, используйте строку формата %02x.

+0

1. Не получил это полностью. Вы говорите, что printk меняет значение keybuf? Кроме того, почему не используется литье типа? Множество примеров в Интернете просто используют массив char. 2. Исправлено. благодаря – Natasha

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