最近开发IPSec模块时,需要用到内核中hmac-sha1算法下面为hmac-sha1的简单使用方式
#include <linux/crypto.h>
#include <linux/init.h>
#include <linux/module.h>
#include <linux/kernel.h>
#include <crypto/hash.h>
#include <linux/scatterlist.h>
static void hexdump(char *data, int len)
{
int i = 0;
for(; i < len; i++){
if((len % 16) == 0)
printk("\n");
printk("%2x ", data[i]);
}
printk("\n");
}
static int __init hmac_sha1(void)
{
struct crypto_hash *hash;
struct hash_desc *desc;
char key[20];
struct scatterlist sg;
char data[100];
char digest[20];
memset(data, 0 ,100);
memset(key, 0 ,20);
hash = crypto_alloc_hash("hmac(sha1)", 0, CRYPTO_ALG_ASYNC);
if(IS_ERR(hash)){
printk(KERN_INFO "Can't alloc hmac\n");
return -2;
}
desc->tfm = hash;
desc->flags = 0;
if(crypto_hash_setkey(hash, key, 20)){
printk(KERN_INFO "crypto_hash_setkey()\n");
return -1;
}
if((crypto_hash_init(desc))){
printk("crypto_hash_init failed\n");
return -1;
}
sg_init_table(&sg, 1);
sg_set_buf(&sg, data, sizeof(data));
if (crypto_hash_update(desc, &sg, sizeof(data))){
printk(KERN_INFO "crypto_hash_update()\n");
return -1;
}
if((crypto_hash_final(desc, digest))){
printk("crypto_hash_final\n");
return -1;
}
hexdump(digest, 20);
}
static void __exit hmac_sha1_exit(void)
{
printk("hmac_exit\n");
}
module_init(hmac_sha1);
module_exit(hmac_sha1_exit);
MODULE_LICENSE("GPL");