Я пытаюсь вычислить хеш-память 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. Если «выход» это символ без знака, я получаю правильный вывод, но не тогда, когда я использую символ.
Если я больше напишу значение keybuf, только тогда он будет работать.
Я попытался отливку типа keybuf как (u8 *), как указано в некоторых форумах, но это не работает слишком
Искаженная выход с помощью полукокс:
3ffffffe9ffffffb7ffffffb472ffffffe0ffffffed41225affffffebffffffdaffffffd3ffffffbaffffffabffffffde
Может кто-нибудь поможет мне в этом?
1. Не получил это полностью. Вы говорите, что printk меняет значение keybuf? Кроме того, почему не используется литье типа? Множество примеров в Интернете просто используют массив char. 2. Исправлено. благодаря – Natasha