<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:&quot;Calibri&quot;,&quot;sans-serif&quot;;color:#1F497D"><o:p>&nbsp;</o:p></span></p>
<p class="MsoNormal"><span style="font-size:11.0pt;font-family:&quot;Calibri&quot;,&quot;sans-serif&quot;;color:#1F497D"><o:p>&nbsp;</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:&quot;Tahoma&quot;,&quot;sans-serif&quot;">From:</span></b><span style="font-size:10.0pt;font-family:&quot;Tahoma&quot;,&quot;sans-serif&quot;"> 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>&nbsp;</o:p></p>
<div>
<p class="MsoNormal">hi all:<o:p></o:p></p>
<div>
<p class="MsoNormal">&nbsp; &nbsp; &nbsp; 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 &lt;linux/init.h&gt;<o:p></o:p></p>
</div>
<div>
<p class="MsoNormal">#include &lt;linux/module.h&gt;<o:p></o:p></p>
</div>
<div>
<p class="MsoNormal">#include &lt;linux/kernel.h&gt;<o:p></o:p></p>
</div>
<div>
<p class="MsoNormal">#include &lt;linux/crypto.h&gt;<o:p></o:p></p>
</div>
<div>
<p class="MsoNormal">#include &lt;linux/err.h&gt;<o:p></o:p></p>
</div>
<div>
<p class="MsoNormal">#include &lt;linux/scatterlist.h&gt;<o:p></o:p></p>
</div>
<div>
<p class="MsoNormal">MODULE_LICENSE(&quot;Dual BSD/GPL&quot;);<o:p></o:p></p>
</div>
<div>
<p class="MsoNormal"><o:p>&nbsp;</o:p></p>
</div>
<div>
<p class="MsoNormal">#define SHA1_LENGTH &nbsp; &nbsp; 20<o:p></o:p></p>
</div>
<div>
<p class="MsoNormal"><o:p>&nbsp;</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">&nbsp; &nbsp; /* &nbsp;<o:p></o:p></p>
</div>
<div>
<p class="MsoNormal">&nbsp; &nbsp; &nbsp;* <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">&nbsp; &nbsp; &nbsp;*/<o:p></o:p></p>
</div>
<div>
<p class="MsoNormal">&nbsp; &nbsp; struct scatterlist sg;&nbsp;<o:p></o:p></p>
</div>
<div>
<p class="MsoNormal">&nbsp; &nbsp; struct hash_desc desc;<o:p></o:p></p>
</div>
<div>
<p class="MsoNormal"><o:p>&nbsp;</o:p></p>
</div>
<div>
<p class="MsoNormal">&nbsp; &nbsp; //way 1 &nbsp; &nbsp;&nbsp;<o:p></o:p></p>
</div>
<div>
<p class="MsoNormal">&nbsp; &nbsp; /* &nbsp;<o:p></o:p></p>
</div>
<div>
<p class="MsoNormal">&nbsp; &nbsp; char *plaintext = &quot;c&quot;;<o:p></o:p></p>
</div>
<div>
<p class="MsoNormal">&nbsp; &nbsp; size_t len = strlen(plaintext);<o:p></o:p></p>
</div>
<div>
<p class="MsoNormal">&nbsp; &nbsp; */<o:p></o:p></p>
</div>
<div>
<p class="MsoNormal"><o:p>&nbsp;</o:p></p>
</div>
<div>
<p class="MsoNormal">&nbsp; &nbsp; //way 2<o:p></o:p></p>
</div>
<div>
<p class="MsoNormal">&nbsp; &nbsp; /* &nbsp;<o:p></o:p></p>
</div>
<div>
<p class="MsoNormal">&nbsp; &nbsp; char *plaintext = kmalloc(sizeof(char), GFP_KERNEL);<o:p></o:p></p>
</div>
<div>
<p class="MsoNormal">&nbsp; &nbsp; plaintext = &quot;c&quot;; &nbsp; &nbsp;<o:p></o:p></p>
</div>
<div>
<p class="MsoNormal">&nbsp; &nbsp; size_t len = 1;<o:p></o:p></p>
</div>
<div>
<p class="MsoNormal">&nbsp; &nbsp; */<o:p></o:p></p>
</div>
<div>
<p class="MsoNormal"><o:p>&nbsp;</o:p></p>
</div>
<div>
<p class="MsoNormal">&nbsp; &nbsp; // way 3.<o:p></o:p></p>
</div>
<div>
<p class="MsoNormal">&nbsp; &nbsp; /* &nbsp;<o:p></o:p></p>
</div>
<div>
<p class="MsoNormal">&nbsp; &nbsp; char plaintext[1] = {'c'};<o:p></o:p></p>
</div>
<div>
<p class="MsoNormal">&nbsp; &nbsp; size_t len = 1;<o:p></o:p></p>
</div>
<div>
<p class="MsoNormal">&nbsp; &nbsp; */<o:p></o:p></p>
</div>
<div>
<p class="MsoNormal"><o:p>&nbsp;</o:p></p>
</div>
<div>
<p class="MsoNormal">&nbsp; &nbsp; // way 4.<o:p></o:p></p>
</div>
<div>
<p class="MsoNormal">&nbsp; &nbsp; /* &nbsp;<o:p></o:p></p>
</div>
<div>
<p class="MsoNormal">&nbsp; &nbsp; char *plaintext = (char *)__get_free_page(GFP_KERNEL);<o:p></o:p></p>
</div>
<div>
<p class="MsoNormal">&nbsp; &nbsp; memcpy(plaintext, &quot;c&quot;, 1);<o:p></o:p></p>
</div>
<div>
<p class="MsoNormal">&nbsp; &nbsp; size_t len = 1;<o:p></o:p></p>
</div>
<div>
<p class="MsoNormal">&nbsp; &nbsp; */<o:p></o:p></p>
</div>
</div>
<div>
<p class="MsoNormal"><o:p>&nbsp;</o:p></p>
</div>
<div>
<div>
<p class="MsoNormal">&nbsp; &nbsp; int rc = 0;<o:p></o:p></p>
</div>
<div>
<p class="MsoNormal">&nbsp; &nbsp; int i; &nbsp;<o:p></o:p></p>
</div>
<div>
<p class="MsoNormal">&nbsp; &nbsp; char hashtext[SHA1_LENGTH];<o:p></o:p></p>
</div>
<div>
<p class="MsoNormal"><o:p>&nbsp;</o:p></p>
</div>
<div>
<p class="MsoNormal">&nbsp; &nbsp; memset(hashtext, 0x00, SHA1_LENGTH);<o:p></o:p></p>
</div>
<div>
<p class="MsoNormal">&nbsp; &nbsp; printk(KERN_INFO &quot;sha1: %s\n&quot;, __FUNCTION__);<o:p></o:p></p>
</div>
<div>
<p class="MsoNormal"><o:p>&nbsp;</o:p></p>
</div>
<div>
<p class="MsoNormal">&nbsp; &nbsp; sg_init_one(&amp;sg, plaintext, len);<o:p></o:p></p>
</div>
<div>
<p class="MsoNormal">&nbsp; &nbsp; desc.tfm = crypto_alloc_hash(&quot;sha1&quot;, 0, CRYPTO_ALG_ASYNC);<o:p></o:p></p>
</div>
<div>
<p class="MsoNormal">&nbsp; &nbsp; desc.flags = 0;<o:p></o:p></p>
</div>
<div>
<p class="MsoNormal"><o:p>&nbsp;</o:p></p>
</div>
<div>
<p class="MsoNormal">&nbsp; &nbsp; rc = crypto_hash_init(&amp;desc);<o:p></o:p></p>
</div>
<div>
<p class="MsoNormal">&nbsp; &nbsp; if (rc) {<o:p></o:p></p>
</div>
<div>
<p class="MsoNormal">&nbsp; &nbsp; &nbsp; &nbsp; printk(KERN_ERR &quot;%s: Error initializing crypto hash; rc = [%d]\n&quot;, __func__, rc);<o:p></o:p></p>
</div>
<div>
<p class="MsoNormal">&nbsp; &nbsp; &nbsp; &nbsp; goto out;<o:p></o:p></p>
</div>
<div>
<p class="MsoNormal">&nbsp; &nbsp; }<o:p></o:p></p>
</div>
<div>
<p class="MsoNormal">&nbsp; &nbsp; rc = crypto_hash_update(&amp;desc, &amp;sg, len);<o:p></o:p></p>
</div>
<div>
<p class="MsoNormal">&nbsp; &nbsp; if (rc) {<o:p></o:p></p>
</div>
<div>
<p class="MsoNormal">&nbsp; &nbsp; &nbsp; &nbsp; printk(KERN_ERR &quot;%s: Error updating crypto hash; rc = [%d]\n&quot;, __func__, rc);<o:p></o:p></p>
</div>
<div>
<p class="MsoNormal">&nbsp; &nbsp; &nbsp; &nbsp; goto out;<o:p></o:p></p>
</div>
<div>
<p class="MsoNormal">&nbsp; &nbsp; }<o:p></o:p></p>
</div>
<div>
<p class="MsoNormal">&nbsp; &nbsp; rc = crypto_hash_final(&amp;desc, hashtext);<o:p></o:p></p>
</div>
<div>
<p class="MsoNormal">&nbsp; &nbsp; if (rc) {<o:p></o:p></p>
</div>
<div>
<p class="MsoNormal">&nbsp; &nbsp; &nbsp; &nbsp; printk(KERN_ERR &quot;%s: Error finalizing crypto hash; rc = [%d]\n&quot;, __func__, rc);<o:p></o:p></p>
</div>
<div>
<p class="MsoNormal">&nbsp; &nbsp; &nbsp; &nbsp; goto out;<o:p></o:p></p>
</div>
<div>
<p class="MsoNormal">&nbsp; &nbsp; }<o:p></o:p></p>
</div>
<div>
<p class="MsoNormal">&nbsp; &nbsp; crypto_free_hash(desc.tfm);<o:p></o:p></p>
</div>
<div>
<p class="MsoNormal"><o:p>&nbsp;</o:p></p>
</div>
<div>
<p class="MsoNormal">&nbsp; &nbsp; for (i = 0; i &lt; 20; i&#43;&#43;) {<o:p></o:p></p>
</div>
<div>
<p class="MsoNormal">&nbsp; &nbsp; &nbsp; &nbsp; printk(KERN_INFO &quot;%02x-%d\n&quot;, hashtext[i]&amp;0xff, i);<o:p></o:p></p>
</div>
<div>
<p class="MsoNormal">&nbsp; &nbsp; }<o:p></o:p></p>
</div>
<div>
<p class="MsoNormal"><o:p>&nbsp;</o:p></p>
</div>
<div>
<p class="MsoNormal">out:<o:p></o:p></p>
</div>
<div>
<p class="MsoNormal">&nbsp; &nbsp; printk(KERN_INFO &quot;end\n&quot;);<o:p></o:p></p>
</div>
<div>
<p class="MsoNormal">&nbsp; &nbsp; 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>&nbsp;</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">&nbsp; &nbsp; printk(KERN_ALERT &quot;Goodbye, cruel world\n&quot;);<o:p></o:p></p>
</div>
<div>
<p class="MsoNormal">}<o:p></o:p></p>
</div>
<div>
<p class="MsoNormal"><o:p>&nbsp;</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,&nbsp;<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>&nbsp;</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. &nbsp;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>&nbsp;</o:p></span></p>
<p class="MsoNormal"><span style="color:#1F497D">&nbsp;&nbsp;&nbsp; plaintext = &quot;c&quot;;&nbsp; <o:p></o:p></span></p>
<p class="MsoNormal"><span style="color:#1F497D"><o:p>&nbsp;</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:&quot;Calibri&quot;,&quot;sans-serif&quot;;color:#1F497D"><o:p>&nbsp;</o:p></span></p>
<p class="MsoNormal"><span style="font-size:11.0pt;font-family:&quot;Calibri&quot;,&quot;sans-serif&quot;;color:#1F497D">Jeff Haran<o:p></o:p></span></p>
<p class="MsoNormal"><span style="font-size:11.0pt;font-family:&quot;Calibri&quot;,&quot;sans-serif&quot;;color:#1F497D"><o:p>&nbsp;</o:p></span></p>
</div>
<div>
<div>
<p class="MsoNormal"><o:p>&nbsp;</o:p></p>
</div>
</div>
</div>
</div>
</div>
</body>
</html>