<html xmlns:v="urn:schemas-microsoft-com:vml" xmlns:o="urn:schemas-microsoft-com:office:office" xmlns:w="urn:schemas-microsoft-com:office:word" xmlns:m="http://schemas.microsoft.com/office/2004/12/omml" xmlns="http://www.w3.org/TR/REC-html40">
<head>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8">
<meta name="Generator" content="Microsoft Word 14 (filtered medium)">
<style><!--
/* Font Definitions */
@font-face
        {font-family:Calibri;
        panose-1:2 15 5 2 2 2 4 3 2 4;}
@font-face
        {font-family:Tahoma;
        panose-1:2 11 6 4 3 5 4 4 2 4;}
/* Style Definitions */
p.MsoNormal, li.MsoNormal, div.MsoNormal
        {margin:0in;
        margin-bottom:.0001pt;
        font-size:12.0pt;
        font-family:"Times New Roman","serif";}
a:link, span.MsoHyperlink
        {mso-style-priority:99;
        color:blue;
        text-decoration:underline;}
a:visited, span.MsoHyperlinkFollowed
        {mso-style-priority:99;
        color:purple;
        text-decoration:underline;}
span.EmailStyle17
        {mso-style-type:personal-reply;
        font-family:"Calibri","sans-serif";
        color:#1F497D;}
.MsoChpDefault
        {mso-style-type:export-only;
        font-family:"Calibri","sans-serif";}
@page WordSection1
        {size:8.5in 11.0in;
        margin:1.0in 1.0in 1.0in 1.0in;}
div.WordSection1
        {page:WordSection1;}
--></style><!--[if gte mso 9]><xml>
<o:shapedefaults v:ext="edit" spidmax="1026" />
</xml><![endif]--><!--[if gte mso 9]><xml>
<o:shapelayout v:ext="edit">
<o:idmap v:ext="edit" data="1" />
</o:shapelayout></xml><![endif]-->
</head>
<body lang="EN-US" link="blue" vlink="purple">
<div class="WordSection1">
<p class="MsoNormal"><span style="font-size:11.0pt;font-family:"Calibri","sans-serif";color:#1F497D"><o:p> </o:p></span></p>
<p class="MsoNormal"><span style="font-size:11.0pt;font-family:"Calibri","sans-serif";color:#1F497D"><o:p> </o:p></span></p>
<div style="border:none;border-left:solid blue 1.5pt;padding:0in 0in 0in 4.0pt">
<div>
<div style="border:none;border-top:solid #B5C4DF 1.0pt;padding:3.0pt 0in 0in 0in">
<p class="MsoNormal"><b><span style="font-size:10.0pt;font-family:"Tahoma","sans-serif"">From:</span></b><span style="font-size:10.0pt;font-family:"Tahoma","sans-serif""> kernelnewbies-bounces@kernelnewbies.org [mailto:kernelnewbies-bounces@kernelnewbies.org]
<b>On Behalf Of </b>lx<br>
<b>Sent:</b> Friday, August 28, 2015 12:36 AM<br>
<b>To:</b> kernelnewbies<br>
<b>Subject:</b> SHA-1 hash calculate in Kernel.<o:p></o:p></span></p>
</div>
</div>
<p class="MsoNormal"><o:p> </o:p></p>
<div>
<p class="MsoNormal">hi all:<o:p></o:p></p>
<div>
<p class="MsoNormal"> I built a module for calculate the SHA-1. The code is:<o:p></o:p></p>
</div>
<div>
<p class="MsoNormal">##################<o:p></o:p></p>
</div>
<div>
<div>
<p class="MsoNormal">#include <linux/init.h><o:p></o:p></p>
</div>
<div>
<p class="MsoNormal">#include <linux/module.h><o:p></o:p></p>
</div>
<div>
<p class="MsoNormal">#include <linux/kernel.h><o:p></o:p></p>
</div>
<div>
<p class="MsoNormal">#include <linux/crypto.h><o:p></o:p></p>
</div>
<div>
<p class="MsoNormal">#include <linux/err.h><o:p></o:p></p>
</div>
<div>
<p class="MsoNormal">#include <linux/scatterlist.h><o:p></o:p></p>
</div>
<div>
<p class="MsoNormal">MODULE_LICENSE("Dual BSD/GPL");<o:p></o:p></p>
</div>
<div>
<p class="MsoNormal"><o:p> </o:p></p>
</div>
<div>
<p class="MsoNormal">#define SHA1_LENGTH 20<o:p></o:p></p>
</div>
<div>
<p class="MsoNormal"><o:p> </o:p></p>
</div>
<div>
<p class="MsoNormal">static int hello_init(void)<o:p></o:p></p>
</div>
<div>
<p class="MsoNormal">{<o:p></o:p></p>
</div>
<div>
<p class="MsoNormal"> /* <o:p></o:p></p>
</div>
<div>
<p class="MsoNormal"> * <a href="http://lxr.oss.org.cn/source/fs/ecryptfs/crypto.c?v=2.6.30">
http://lxr.oss.org.cn/source/fs/ecryptfs/crypto.c?v=2.6.30</a><o:p></o:p></p>
</div>
<div>
<p class="MsoNormal"> */<o:p></o:p></p>
</div>
<div>
<p class="MsoNormal"> struct scatterlist sg; <o:p></o:p></p>
</div>
<div>
<p class="MsoNormal"> struct hash_desc desc;<o:p></o:p></p>
</div>
<div>
<p class="MsoNormal"><o:p> </o:p></p>
</div>
<div>
<p class="MsoNormal"> //way 1 <o:p></o:p></p>
</div>
<div>
<p class="MsoNormal"> /* <o:p></o:p></p>
</div>
<div>
<p class="MsoNormal"> char *plaintext = "c";<o:p></o:p></p>
</div>
<div>
<p class="MsoNormal"> size_t len = strlen(plaintext);<o:p></o:p></p>
</div>
<div>
<p class="MsoNormal"> */<o:p></o:p></p>
</div>
<div>
<p class="MsoNormal"><o:p> </o:p></p>
</div>
<div>
<p class="MsoNormal"> //way 2<o:p></o:p></p>
</div>
<div>
<p class="MsoNormal"> /* <o:p></o:p></p>
</div>
<div>
<p class="MsoNormal"> char *plaintext = kmalloc(sizeof(char), GFP_KERNEL);<o:p></o:p></p>
</div>
<div>
<p class="MsoNormal"> plaintext = "c"; <o:p></o:p></p>
</div>
<div>
<p class="MsoNormal"> size_t len = 1;<o:p></o:p></p>
</div>
<div>
<p class="MsoNormal"> */<o:p></o:p></p>
</div>
<div>
<p class="MsoNormal"><o:p> </o:p></p>
</div>
<div>
<p class="MsoNormal"> // way 3.<o:p></o:p></p>
</div>
<div>
<p class="MsoNormal"> /* <o:p></o:p></p>
</div>
<div>
<p class="MsoNormal"> char plaintext[1] = {'c'};<o:p></o:p></p>
</div>
<div>
<p class="MsoNormal"> size_t len = 1;<o:p></o:p></p>
</div>
<div>
<p class="MsoNormal"> */<o:p></o:p></p>
</div>
<div>
<p class="MsoNormal"><o:p> </o:p></p>
</div>
<div>
<p class="MsoNormal"> // way 4.<o:p></o:p></p>
</div>
<div>
<p class="MsoNormal"> /* <o:p></o:p></p>
</div>
<div>
<p class="MsoNormal"> char *plaintext = (char *)__get_free_page(GFP_KERNEL);<o:p></o:p></p>
</div>
<div>
<p class="MsoNormal"> memcpy(plaintext, "c", 1);<o:p></o:p></p>
</div>
<div>
<p class="MsoNormal"> size_t len = 1;<o:p></o:p></p>
</div>
<div>
<p class="MsoNormal"> */<o:p></o:p></p>
</div>
</div>
<div>
<p class="MsoNormal"><o:p> </o:p></p>
</div>
<div>
<div>
<p class="MsoNormal"> int rc = 0;<o:p></o:p></p>
</div>
<div>
<p class="MsoNormal"> int i; <o:p></o:p></p>
</div>
<div>
<p class="MsoNormal"> char hashtext[SHA1_LENGTH];<o:p></o:p></p>
</div>
<div>
<p class="MsoNormal"><o:p> </o:p></p>
</div>
<div>
<p class="MsoNormal"> memset(hashtext, 0x00, SHA1_LENGTH);<o:p></o:p></p>
</div>
<div>
<p class="MsoNormal"> printk(KERN_INFO "sha1: %s\n", __FUNCTION__);<o:p></o:p></p>
</div>
<div>
<p class="MsoNormal"><o:p> </o:p></p>
</div>
<div>
<p class="MsoNormal"> sg_init_one(&sg, plaintext, len);<o:p></o:p></p>
</div>
<div>
<p class="MsoNormal"> desc.tfm = crypto_alloc_hash("sha1", 0, CRYPTO_ALG_ASYNC);<o:p></o:p></p>
</div>
<div>
<p class="MsoNormal"> desc.flags = 0;<o:p></o:p></p>
</div>
<div>
<p class="MsoNormal"><o:p> </o:p></p>
</div>
<div>
<p class="MsoNormal"> rc = crypto_hash_init(&desc);<o:p></o:p></p>
</div>
<div>
<p class="MsoNormal"> if (rc) {<o:p></o:p></p>
</div>
<div>
<p class="MsoNormal"> printk(KERN_ERR "%s: Error initializing crypto hash; rc = [%d]\n", __func__, rc);<o:p></o:p></p>
</div>
<div>
<p class="MsoNormal"> goto out;<o:p></o:p></p>
</div>
<div>
<p class="MsoNormal"> }<o:p></o:p></p>
</div>
<div>
<p class="MsoNormal"> rc = crypto_hash_update(&desc, &sg, len);<o:p></o:p></p>
</div>
<div>
<p class="MsoNormal"> if (rc) {<o:p></o:p></p>
</div>
<div>
<p class="MsoNormal"> printk(KERN_ERR "%s: Error updating crypto hash; rc = [%d]\n", __func__, rc);<o:p></o:p></p>
</div>
<div>
<p class="MsoNormal"> goto out;<o:p></o:p></p>
</div>
<div>
<p class="MsoNormal"> }<o:p></o:p></p>
</div>
<div>
<p class="MsoNormal"> rc = crypto_hash_final(&desc, hashtext);<o:p></o:p></p>
</div>
<div>
<p class="MsoNormal"> if (rc) {<o:p></o:p></p>
</div>
<div>
<p class="MsoNormal"> printk(KERN_ERR "%s: Error finalizing crypto hash; rc = [%d]\n", __func__, rc);<o:p></o:p></p>
</div>
<div>
<p class="MsoNormal"> goto out;<o:p></o:p></p>
</div>
<div>
<p class="MsoNormal"> }<o:p></o:p></p>
</div>
<div>
<p class="MsoNormal"> crypto_free_hash(desc.tfm);<o:p></o:p></p>
</div>
<div>
<p class="MsoNormal"><o:p> </o:p></p>
</div>
<div>
<p class="MsoNormal"> for (i = 0; i < 20; i++) {<o:p></o:p></p>
</div>
<div>
<p class="MsoNormal"> printk(KERN_INFO "%02x-%d\n", hashtext[i]&0xff, i);<o:p></o:p></p>
</div>
<div>
<p class="MsoNormal"> }<o:p></o:p></p>
</div>
<div>
<p class="MsoNormal"><o:p> </o:p></p>
</div>
<div>
<p class="MsoNormal">out:<o:p></o:p></p>
</div>
<div>
<p class="MsoNormal"> printk(KERN_INFO "end\n");<o:p></o:p></p>
</div>
<div>
<p class="MsoNormal"> return rc;<o:p></o:p></p>
</div>
<div>
<p class="MsoNormal">}<o:p></o:p></p>
</div>
</div>
<div>
<p class="MsoNormal"><o:p> </o:p></p>
</div>
<div>
<div>
<p class="MsoNormal">static void hello_exit(void)<o:p></o:p></p>
</div>
<div>
<p class="MsoNormal">{<o:p></o:p></p>
</div>
<div>
<p class="MsoNormal"> printk(KERN_ALERT "Goodbye, cruel world\n");<o:p></o:p></p>
</div>
<div>
<p class="MsoNormal">}<o:p></o:p></p>
</div>
<div>
<p class="MsoNormal"><o:p> </o:p></p>
</div>
<div>
<p class="MsoNormal">module_init(hello_init);<o:p></o:p></p>
</div>
<div>
<p class="MsoNormal">module_exit(hello_exit);<o:p></o:p></p>
</div>
</div>
<div>
<p class="MsoNormal">##################<o:p></o:p></p>
</div>
<div>
<p class="MsoNormal">I can just get the right result by way 3 and 4, In way 1 and 2 , I get the wrong result, <o:p></o:p></p>
</div>
<div>
<p class="MsoNormal">I check the result by link: <a href="http://www.xorbin.com/tools/sha1-hash-calculator">
http://www.xorbin.com/tools/sha1-hash-calculator</a> .<o:p></o:p></p>
</div>
<div>
<p class="MsoNormal">Please tell me why? Thank you.<o:p></o:p></p>
</div>
<div>
<p class="MsoNormal"><o:p> </o:p></p>
</div>
<div>
<p class="MsoNormal"><span style="color:#1F497D">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:<o:p></o:p></span></p>
<p class="MsoNormal"><span style="color:#1F497D"><o:p> </o:p></span></p>
<p class="MsoNormal"><span style="color:#1F497D"> plaintext = "c"; <o:p></o:p></span></p>
<p class="MsoNormal"><span style="color:#1F497D"><o:p> </o:p></span></p>
<p class="MsoNormal"><span style="color:#1F497D">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?<o:p></o:p></span></p>
<p class="MsoNormal"><span style="font-size:11.0pt;font-family:"Calibri","sans-serif";color:#1F497D"><o:p> </o:p></span></p>
<p class="MsoNormal"><span style="font-size:11.0pt;font-family:"Calibri","sans-serif";color:#1F497D">Jeff Haran<o:p></o:p></span></p>
<p class="MsoNormal"><span style="font-size:11.0pt;font-family:"Calibri","sans-serif";color:#1F497D"><o:p> </o:p></span></p>
</div>
<div>
<div>
<p class="MsoNormal"><o:p> </o:p></p>
</div>
</div>
</div>
</div>
</div>
</body>
</html>