<html 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 name=Title content=""><meta name=Keywords content=""><meta http-equiv=Content-Type content="text/html; charset=utf-8"><meta name=Generator content="Microsoft Word 15 (filtered medium)"><style><!--
/* Font Definitions */
@font-face
        {font-family:Arial;
        panose-1:2 11 6 4 2 2 2 2 2 4;}
@font-face
        {font-family:"Cambria Math";
        panose-1:2 4 5 3 5 4 6 3 2 4;}
@font-face
        {font-family:Calibri;
        panose-1:2 15 5 2 2 2 4 3 2 4;}
@font-face
        {font-family:Monaco;
        panose-1:2 0 5 0 0 0 0 0 0 0;}
/* Style Definitions */
p.MsoNormal, li.MsoNormal, div.MsoNormal
        {margin:0in;
        margin-bottom:.0001pt;
        font-size:12.0pt;
        font-family:Calibri;}
a:link, span.MsoHyperlink
        {mso-style-priority:99;
        color:#0563C1;
        text-decoration:underline;}
a:visited, span.MsoHyperlinkFollowed
        {mso-style-priority:99;
        color:#954F72;
        text-decoration:underline;}
span.EmailStyle17
        {mso-style-type:personal-compose;
        font-family:Calibri;
        color:windowtext;}
p.p1, li.p1, div.p1
        {mso-style-name:p1;
        margin:0in;
        margin-bottom:.0001pt;
        font-size:10.5pt;
        font-family:Monaco;}
p.p2, li.p2, div.p2
        {mso-style-name:p2;
        margin:0in;
        margin-bottom:.0001pt;
        font-size:10.5pt;
        font-family:Monaco;
        color:#3933FF;}
p.p3, li.p3, div.p3
        {mso-style-name:p3;
        margin:0in;
        margin-bottom:.0001pt;
        font-size:10.5pt;
        font-family:Monaco;}
p.p4, li.p4, div.p4
        {mso-style-name:p4;
        margin:0in;
        margin-bottom:.0001pt;
        font-size:10.5pt;
        font-family:Monaco;
        color:#793D93;}
span.s1
        {mso-style-name:s1;
        color:#793D93;}
span.s2
        {mso-style-name:s2;
        color:#931A68;}
span.s3
        {mso-style-name:s3;
        color:black;}
span.s4
        {mso-style-name:s4;
        text-decoration:underline;}
span.s5
        {mso-style-name:s5;
        color:#006141;}
span.apple-tab-span
        {mso-style-name:apple-tab-span;}
span.msoIns
        {mso-style-type:export-only;
        mso-style-name:"";
        text-decoration:underline;
        color:teal;}
.MsoChpDefault
        {mso-style-type:export-only;
        font-family:Calibri;}
@page WordSection1
        {size:8.5in 11.0in;
        margin:1.0in 1.0in 1.0in 1.0in;}
div.WordSection1
        {page:WordSection1;}
--></style></head><body bgcolor=white lang=EN-US link="#0563C1" vlink="#954F72"><div class=WordSection1><p class=MsoNormal>I’m playing with RSA-PSS signatures, and stumbled upon a few problems. I tried the OpenSSL manual pages, but still coming short of complete understanding. :-)<o:p></o:p></p><p class=MsoNormal><o:p> </o:p></p><p class=MsoNormal>This is how I initialize the contexts (error handlers removed for brevity):<o:p></o:p></p><p class=p1><span class=apple-tab-span><o:p> </o:p></span></p><p class=p1><span class=apple-tab-span>      </span>ctx = <span class=s1>EVP_PKEY_CTX_new</span>(privkey, NULL);<o:p></o:p></p><p class=p4><span class=apple-tab-span>      </span><span class=s3>md_ctx = </span>EVP_MD_CTX_create<span class=s3>();</span><o:p></o:p></p><p class=p1><span class=apple-tab-span>      </span><span class=s2>const</span> <span class=s5>EVP_MD</span> *md = <span class=s1>EVP_sha256</span>();<o:p></o:p></p><p class=p1><span class=apple-tab-span>      </span>rv = <span class=s1>EVP_DigestInit_ex</span>(md_ctx, md, NULL);<o:p></o:p></p><p class=p1><span class=apple-tab-span>      </span>rv = <span class=s1>EVP_DigestSignInit</span>(md_ctx, &ctx, md, NULL, privkey);<o:p></o:p></p><p class=MsoNormal><o:p> </o:p></p><p class=MsoNormal>First question: do I need <span style='font-family:Monaco'>EVP_DigestInit_ex()</span> there?<o:p></o:p></p><p class=MsoNormal><o:p> </o:p></p><p class=MsoNormal>Second question: do I have to specify hash-function (<span style='font-family:Monaco'>EVP_MD*</span>) twice? First when initializing <span style='font-family:Monaco'>EVP_MD_CTX</span>, and second for <span style='font-family:Monaco'>EVP_DigestSignInit()</span>?<o:p></o:p></p><p class=MsoNormal><o:p> </o:p></p><p class=MsoNormal>At the end I need to dispose of both <span style='font-family:Monaco'>ctx</span> and <span style='font-family:Monaco'>md_ctx</span>. That leads to my third question/problem. The code I tried (based on what the man page says: to avoid memory leak, I need to do <span style='font-family:Monaco'>EVP_MD_CTX_destroy(md_ctx)</span> crashes with SIGV:<o:p></o:p></p><p class=MsoNormal><o:p> </o:p></p><p class=MsoNormal><span style='font-size:10.5pt;font-family:Monaco;color:black'>      </span><span style='font-size:10.5pt;font-family:Monaco;color:#793D93'>EVP_MD_CTX_destroy</span><span style='font-size:10.5pt;font-family:Monaco;color:black'>(md_ctx); // this succeeds</span><span style='font-size:10.5pt;font-family:Monaco;color:#793D93'><o:p></o:p></span></p><p class=MsoNormal><span style='font-size:10.5pt;font-family:Monaco;color:black'>      </span><span style='font-size:10.5pt;font-family:Monaco;color:#793D93'>EVP_PKEY_CTX_free</span><span style='font-size:10.5pt;font-family:Monaco;color:black'>(ctx);  // but here the code crashes</span><span style='font-size:10.5pt;font-family:Monaco;color:#793D93'><o:p></o:p></span></p><p class=MsoNormal><o:p> </o:p></p><p class=MsoNormal>Same happens when I reverse the above order:<o:p></o:p></p><p class=MsoNormal><o:p> </o:p></p><p class=MsoNormal><span style='font-size:10.5pt;font-family:Monaco;color:black'>      </span><span style='font-size:10.5pt;font-family:Monaco;color:#793D93'>EVP_PKEY_CTX_free</span><span style='font-size:10.5pt;font-family:Monaco;color:black'>(ctx); // this succeeds</span><span style='font-size:10.5pt;font-family:Monaco;color:#793D93'><o:p></o:p></span></p><p class=MsoNormal><span style='font-size:10.5pt;font-family:Monaco;color:black'>      </span><span style='font-size:10.5pt;font-family:Monaco;color:#793D93'>EVP_MD_CTX_destroy</span><span style='font-size:10.5pt;font-family:Monaco;color:black'>(md_ctx); // but then this one causes crash</span><span style='font-size:10.5pt;font-family:Monaco;color:#793D93'><o:p></o:p></span></p><p class=MsoNormal><o:p> </o:p></p><p class=MsoNormal>So what’s the correct way of freeing both of them? Or is it that because they’re sort of “bound together” by <span class=s1>EVP_DigestSignInit</span>(md_ctx, &ctx, md, NULL, privkey); freeing one frees the other?</p><p class=MsoNormal><o:p> </o:p></p><p class=MsoNormal>Thanks!<o:p></o:p></p><p class=MsoNormal><span style='font-size:10.5pt;color:black'>— <o:p></o:p></span></p><div><p class=MsoNormal><span style='font-size:10.5pt;color:black'>Regards,<o:p></o:p></span></p></div><div><p class=MsoNormal><span style='font-size:10.5pt;color:black'>Uri<o:p></o:p></span></p></div><p class=MsoNormal><o:p> </o:p></p></div></body></html>