Re: SHA-1 hash calculate in Kernel.
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 ___ Kernelnewbies mailing list Kernelnewbies@kernelnewbies.org http://lists.kernelnewbies.org/mailman/listinfo/kernelnewbies
Re: SHA-1 hash calculate in Kernel.
lx lxlenovos...@gmail.com writes: hi all: I built a module for calculate the SHA-1. The code is: ## #include linux/init.h #include linux/module.h #include linux/kernel.h #include linux/crypto.h #include linux/err.h #include linux/scatterlist.h MODULE_LICENSE(Dual BSD/GPL); #define SHA1_LENGTH 20 static int hello_init(void) { /* * http://lxr.oss.org.cn/source/fs/ecryptfs/crypto.c?v=2.6.30 */ struct scatterlist sg; struct hash_desc desc; //way 1 /* char *plaintext = c; size_t len = strlen(plaintext); */ //way 2 /* char *plaintext = kmalloc(sizeof(char), GFP_KERNEL); plaintext = c; size_t len = 1; */ // way 3. /* char plaintext[1] = {'c'}; size_t len = 1; */ // way 4. /* char *plaintext = (char *)__get_free_page(GFP_KERNEL); memcpy(plaintext, c, 1); size_t len = 1; */ int rc = 0; int i; char hashtext[SHA1_LENGTH]; memset(hashtext, 0x00, SHA1_LENGTH); printk(KERN_INFO sha1: %s\n, __FUNCTION__); sg_init_one(sg, 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: printk(KERN_INFO end\n); return rc; } static void hello_exit(void) { printk(KERN_ALERT Goodbye, cruel world\n); } module_init(hello_init); module_exit(hello_exit); ## I can just get the right result by way 3 and 4, In way 1 and 2 , I get the wrong result, I suggest you add something like this: printk(KERN_INFO plaintext='%c', len=%zu, valid=%s\n, *plaintext, len, virt_addr_valid(plaintext) ? true : false); and then go figure out the relationship between that and the correct result :) Bjørn ___ Kernelnewbies mailing list Kernelnewbies@kernelnewbies.org http://lists.kernelnewbies.org/mailman/listinfo/kernelnewbies
RE: SHA-1 hash calculate in Kernel.
From: kernelnewbies-boun...@kernelnewbies.org [mailto:kernelnewbies-boun...@kernelnewbies.org] On Behalf Of lx Sent: Friday, August 28, 2015 12:36 AM To: kernelnewbies Subject: SHA-1 hash calculate in Kernel. hi all: I built a module for calculate the SHA-1. The code is: ## #include linux/init.h #include linux/module.h #include linux/kernel.h #include linux/crypto.h #include linux/err.h #include linux/scatterlist.h MODULE_LICENSE(Dual BSD/GPL); #define SHA1_LENGTH 20 static int hello_init(void) { /* * http://lxr.oss.org.cn/source/fs/ecryptfs/crypto.c?v=2.6.30 */ struct scatterlist sg; struct hash_desc desc; //way 1 /* char *plaintext = c; size_t len = strlen(plaintext); */ //way 2 /* char *plaintext = kmalloc(sizeof(char), GFP_KERNEL); plaintext = c; size_t len = 1; */ // way 3. /* char plaintext[1] = {'c'}; size_t len = 1; */ // way 4. /* char *plaintext = (char *)__get_free_page(GFP_KERNEL); memcpy(plaintext, c, 1); size_t len = 1; */ int rc = 0; int i; char hashtext[SHA1_LENGTH]; memset(hashtext, 0x00, SHA1_LENGTH); printk(KERN_INFO sha1: %s\n, __FUNCTION__); sg_init_one(sg, 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: printk(KERN_INFO end\n); return rc; } static void hello_exit(void) { printk(KERN_ALERT Goodbye, cruel world\n); } module_init(hello_init); module_exit(hello_exit); ## I can just get the right result by way 3 and 4, In way 1 and 2 , I get the wrong result, I check the result by link: http://www.xorbin.com/tools/sha1-hash-calculator . Please tell me why? Thank you. I don’t know why the crypto function isn’t generating the right result in the first two cases. Just pointing out that way 1 and way 2 are identical except that way 2 leaks the memory that was kmalloc()’ed. This in way 2 is a pointer assignment, not a buffer copy: plaintext = c; The big difference it seems between ways 1 and 2 and ways 3 and 4 is in the former, plaintext points to a string constant that I believe is going to be read only whereas in the latter, plaintext points to r/w memory. Maybe the crypto functions need r/w access? Jeff Haran ___ Kernelnewbies mailing list Kernelnewbies@kernelnewbies.org http://lists.kernelnewbies.org/mailman/listinfo/kernelnewbies