SHA-1 hash calculate in Kernel.
lx
lxlenovostar at gmail.com
Thu Oct 22 04:24:31 EDT 2015
hi all:
I finally implement it by learning form the function of tcp md5
checksum. This is the relative kernel source
<http://lxr.oss.org.cn/source/net/ipv4/tcp.c?v=2.6.30#L2667>. The SHA-1
implement is here
<https://github.com/lxlenovostar/kernel_test/blob/master/model/kernel_hash/sha.c>.But
I still have a question about __virt_addr_valid.
##############################
#include <linux/init.h>
#include <linux/module.h>
#include <linux/kernel.h>
#include <linux/crypto.h>
#include <linux/err.h>
#include <linux/scatterlist.h>
#include <linux/mm.h>
#define SHA1_LENGTH 20
static inline int phys_addr_valid(resource_size_t addr)
{
#ifdef CONFIG_PHYS_ADDR_T_64BIT
return !(addr >> boot_cpu_data.x86_phys_bits);
#else
return 1;
#endif
}
bool __virt_addr_valid(unsigned long x)
{
unsigned long old_x;
old_x = x;
//The kernel text is mapped into the region starting
from__START_KERNEL_MAP
if (x >= __START_KERNEL_map) {
if (x >= MODULES_VADDR && x <= MODULES_END) {
printk(KERN_INFO "right here");
}
x -= __START_KERNEL_map;
if (x >= KERNEL_IMAGE_SIZE) {
printk(KERN_INFO "error1");
return false;
}
x += phys_base;
} else {
if (x < PAGE_OFFSET) {
printk(KERN_INFO "error2");
return false;
}
x -= PAGE_OFFSET;
if (!phys_addr_valid(x)) {
printk(KERN_INFO "error3");
return false;
}
}
return pfn_valid(x >> PAGE_SHIFT);
}
static int minit(void)
{
/*
* http://lxr.oss.org.cn/source/fs/ecryptfs/crypto.c?v=2.6.30
*/
struct scatterlist sg;
struct hash_desc desc;
int rc = 0;
int i;
char hashtext[SHA1_LENGTH];
char *plaintext = NULL;
printk(KERN_INFO "valid=%s\n", virt_addr_valid(plaintext) ? "true" :
"false");
plaintext = "c";
printk(KERN_INFO "valid=%s\n", virt_addr_valid(plaintext) ? "true" :
"false");
size_t len = strlen(plaintext);
sg_init_one(&sg, (u8 *)plaintext, len);
desc.tfm = crypto_alloc_hash("sha1", 0, CRYPTO_ALG_ASYNC);
desc.flags = 0;
rc = crypto_hash_init(&desc);
if (rc) {
printk(KERN_ERR "%s: Error initializing crypto hash; rc = [%d]\n",
__func__, rc);
goto out;
}
rc = crypto_hash_update(&desc, &sg, len);
if (rc) {
printk(KERN_ERR "%s: Error updating crypto hash; rc = [%d]\n",
__func__, rc);
goto out;
}
rc = crypto_hash_final(&desc, hashtext);
if (rc) {
printk(KERN_ERR "%s: Error finalizing crypto hash; rc = [%d]\n",
__func__, rc);
goto out;
}
crypto_free_hash(desc.tfm);
for (i = 0; i < 20; i++) {
//printk(KERN_INFO "%02x-%d\n", hashtext[i]&0xff, i);
}
out:
return rc;
}
static void mexit(void)
{
printk("Exit %s.\n", THIS_MODULE->name);
}
##############################
I make and insmod it. the log is:
##############################
[root at localhost sha]# dmesg -c
error2
valid=false
right here
error1
valid=false
##############################
I think plaintext is between MODULES_VADDR and MODULES_END, So why the
address in
MODULES not a valid virtual address?
Thank you.
2015-08-29 19:49 GMT+08:00 Bernd Petrovitsch <bernd at petrovitsch.priv.at>:
> On Fre, 2015-08-28 at 15:36 +0800, lx wrote:
> [...]
> > //way 2
> > /*
> > char *plaintext = kmalloc(sizeof(char), GFP_KERNEL);
> > plaintext = "c";
>
> I don't think that this line doesn't give any warning ...
>
> Kind regards,
> Bernd
> --
> "I dislike type abstraction if it has no real reason. And saving
> on typing is not a good reason - if your typing speed is the main
> issue when you're coding, you're doing something seriously wrong."
> - Linus Torvalds
>
>
-------------- next part --------------
An HTML attachment was scrubbed...
URL: http://lists.kernelnewbies.org/pipermail/kernelnewbies/attachments/20151022/0ea08bec/attachment-0001.html
-------------- next part --------------
A non-text attachment was scrubbed...
Name: ????_102215_041814_PM.jpg
Type: image/jpeg
Size: 87487 bytes
Desc: not available
Url : http://lists.kernelnewbies.org/pipermail/kernelnewbies/attachments/20151022/0ea08bec/attachment-0001.jpg
More information about the Kernelnewbies
mailing list