<html><head>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8">
<meta name="Generator" content="Microsoft Word 15 (filtered medium)">
<!--[if !mso]><style>v\:* {behavior:url(#default#VML);}
o\:* {behavior:url(#default#VML);}
w\:* {behavior:url(#default#VML);}
.shape {behavior:url(#default#VML);}
</style><![endif]--><style><!--
/* Font Definitions */
@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:Consolas;
        panose-1:2 11 6 9 2 2 4 3 2 4;}
/* Style Definitions */
p.MsoNormal, li.MsoNormal, div.MsoNormal
        {margin:0cm;
        font-size:11.0pt;
        font-family:"Calibri",sans-serif;}
span.EmailStyle20
        {mso-style-type:personal-reply;
        font-family:"Calibri",sans-serif;
        color:windowtext;}
.MsoChpDefault
        {mso-style-type:export-only;
        font-size:10.0pt;}
@page WordSection1
        {size:612.0pt 792.0pt;
        margin:72.0pt 72.0pt 72.0pt 72.0pt;}
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-IN" link="#0563C1" vlink="#954F72" style="word-wrap:break-word">
<div class="WordSection1">
<p class="MsoNormal"><span style="mso-fareast-language:EN-US">Hi,<o:p></o:p></span></p>
<p class="MsoNormal"><span style="mso-fareast-language:EN-US">                For the equivalent replacement of DH_compute_key in 3.0, we tried to perform the steps suggested in earlier mail below<o:p></o:p></span></p>
<p class="MsoNormal"><span style="mso-fareast-language:EN-US">Our steps are as follows, but we see EVP_PKEY_derive  fails to perform.  please suggest if any steps are wrong or missing here.<o:p></o:p></span></p>
<p class="MsoNormal"><span style="mso-fareast-language:EN-US"><o:p> </o:p></span></p>
<p class="MsoNormal"><span style="mso-fareast-language:EN-US">//input - BIGNUM - pubkey, privkey, p ,<o:p></o:p></span></p>
<p class="MsoNormal"><span style="mso-fareast-language:EN-US">//output - sharedsecret<o:p></o:p></span></p>
<p class="MsoNormal"><span style="mso-fareast-language:EN-US"><o:p> </o:p></span></p>
<p class="MsoNormal"><span style="mso-fareast-language:EN-US">Evp_compute_key(unsigned char* sharedSecret, unsigned int len, BIGNUM *pubkey, BIGNUM *privkey, BIGNUM* dh_p)<o:p></o:p></span></p>
<p class="MsoNormal"><span style="mso-fareast-language:EN-US">{<o:p></o:p></span></p>
<p class="MsoNormal"><span style="mso-fareast-language:EN-US">OSSL_PARAM params[5];<o:p></o:p></span></p>
<p class="MsoNormal"><span style="mso-fareast-language:EN-US">unsigned char*  p_str = BN_bn2dec (dh_p);<o:p></o:p></span></p>
<p class="MsoNormal"><span style="mso-fareast-language:EN-US">unsigned char* pub_str = BN_bn2dec (pubkey);<o:p></o:p></span></p>
<p class="MsoNormal"><span style="mso-fareast-language:EN-US">unsigned char* priv_str = BN_bn2dec (privkey);<o:p></o:p></span></p>
<p class="MsoNormal"><span style="mso-fareast-language:EN-US"><o:p> </o:p></span></p>
<p class="MsoNormal"><span style="mso-fareast-language:EN-US">params[0] = OSSL_PARAM_construct_BN(OSSL_PKEY_PARAM_FFC_P, p_str, strlen(p_str));<o:p></o:p></span></p>
<p class="MsoNormal"><span style="mso-fareast-language:EN-US">params[1] = OSSL_PARAM_construct_uint(OSSL_PKEY_PARAM_FFC_G, &g);<o:p></o:p></span></p>
<p class="MsoNormal"><span style="mso-fareast-language:EN-US">params[2] = OSSL_PARAM_construct_BN(OSSL_PKEY_PARAM_PUB_KEY, pub_str, strlen(pub_str));<o:p></o:p></span></p>
<p class="MsoNormal"><span style="mso-fareast-language:EN-US">params[3] = OSSL_PARAM_construct_BN(OSSL_PKEY_PARAM_PRIV_KEY, priv_str, strlen(priv_str));<o:p></o:p></span></p>
<p class="MsoNormal"><span style="mso-fareast-language:EN-US">params[4] = OSSL_PARAM_construct_end();<o:p></o:p></span></p>
<p class="MsoNormal"><span style="mso-fareast-language:EN-US"><o:p> </o:p></span></p>
<p class="MsoNormal"><span style="mso-fareast-language:EN-US">gctx = EVP_PKEY_CTX_new_from_name(NULL, "DH", NULL);<o:p></o:p></span></p>
<p class="MsoNormal"><span style="mso-fareast-language:EN-US">EVP_PKEY_derive_init(gctx)<o:p></o:p></span></p>
<p class="MsoNormal"><span style="mso-fareast-language:EN-US">EVP_PKEY_CTX_set_params(gctx, params)<o:p></o:p></span></p>
<p class="MsoNormal"><span style="mso-fareast-language:EN-US"><o:p> </o:p></span></p>
<p class="MsoNormal"><span style="mso-fareast-language:EN-US">/* Determine buffer length */<o:p></o:p></span></p>
<p class="MsoNormal"><span style="mso-fareast-language:EN-US">EVP_PKEY_derive(gctx, NULL, &skeylen)<o:p></o:p></span></p>
<p class="MsoNormal"><span style="mso-fareast-language:EN-US">EVP_PKEY_derive(gctx, sharedSecret, &skeylen)<o:p></o:p></span></p>
<p class="MsoNormal"><span style="mso-fareast-language:EN-US">}<o:p></o:p></span></p>
<p class="MsoNormal"><span style="mso-fareast-language:EN-US"><o:p> </o:p></span></p>
<p class="MsoNormal"><span style="mso-fareast-language:EN-US">Note - EVP_PKEY_derive -- call fails what is wrong in the steps can you please g<o:p></o:p></span></p>
<p class="MsoNormal"><span style="mso-fareast-language:EN-US"><o:p> </o:p></span></p>
<div>
<div style="border:none;border-top:solid #E1E1E1 1.0pt;padding:3.0pt 0cm 0cm 0cm">
<p class="MsoNormal"><b><span lang="EN-US">From:</span></b><span lang="EN-US"> Sands, Daniel <dnsands@sandia.gov>
<br>
<b>Sent:</b> 16 December 2020 05:00<br>
<b>To:</b> Narayana, Sunil Kumar <sanarayana@rbbn.com>; openssl-users@openssl.org<br>
<b>Subject:</b> RE: [EXTERNAL] RE: DH_compute_key () - replacement in 3.0<o:p></o:p></span></p>
</div>
</div>
<p class="MsoNormal"><o:p> </o:p></p>
<div class="MsoNormal" align="center" style="text-align:center"><span lang="EN-US">
<hr size="2" width="100%" align="center">
</span></div>
<p class="MsoNormal"><span lang="EN-US">NOTICE: This email was received from an EXTERNAL sender<o:p></o:p></span></p>
<div class="MsoNormal" align="center" style="text-align:center"><span lang="EN-US">
<hr size="2" width="100%" align="center">
</span></div>
<p class="MsoNormal"><span lang="EN-US"><o:p> </o:p></span></p>
<p class="MsoNormal" style="text-indent:36.0pt">We do have generated the key using EVP_PKEY_gen as suggested in earlier emails, but since this was a non-ephemeral and we wanted to store the key in "raw" octet bytes, so we did extracted the whole DH priv/pub
 key pair out from the key generated via  EVP_PKEY_gen  ( using as suggested… EVP_PKEY_get_raw_public_key (pkey, pub, &len)  )<span lang="EN-US"><o:p></o:p></span></p>
<p class="MsoNormal"> <span lang="EN-US"><o:p></o:p></span></p>
<p class="MsoNormal">Now, at a later stage in application we have to compute the Secret key using the stored key’s (in above step).<span lang="EN-US"><o:p></o:p></span></p>
<p class="MsoNormal">As of now,  these keys are in uchar format, but are converted to BIGNUM and given to DH_compute_key as below.<span lang="EN-US"><o:p></o:p></span></p>
<p class="MsoNormal"> <span lang="EN-US"><o:p></o:p></span></p>
<p class="MsoNormal">   BIGNUM      *<span style="background:yellow;mso-highlight:yellow">bn_publicKey</span>;<span lang="EN-US"><o:p></o:p></span></p>
<p class="MsoNormal">    <span style="background:aqua;mso-highlight:aqua">dh->priv_key</span> = BN_bin2bn(privateKey, octet_len, NULL);<span lang="EN-US"><o:p></o:p></span></p>
<p class="MsoNormal">    <span style="background:yellow;mso-highlight:yellow">bn_publicKey</span> = BN_bin2bn(publicKey, octet_len, NULL);<span lang="EN-US"><o:p></o:p></span></p>
<p class="MsoNormal">    rv = DH_compute_key(sharedSecret, bn_publicKey, dh);<span lang="EN-US"><o:p></o:p></span></p>
<p class="MsoNormal"> <span lang="EN-US"><o:p></o:p></span></p>
<p class="MsoNormal">So in order to keep the existing frame work in place and just replace the DH_compute_key, we should be using the  dh->priv_key/ bn_publicKey  to compute shared secret key.<span lang="EN-US"><o:p></o:p></span></p>
<p class="MsoNormal">So we require to convert the BIGNUM key types to EVP_KEY types to use in EVP_PKEY_derive_init, EVP_PKEY_derive_set_peer, and EVP_PKEY_derive to get shared secret<span lang="EN-US"><o:p></o:p></span></p>
<p class="MsoNormal">Please suggest…<br>
<br>
<br>
<span lang="EN-US"><o:p></o:p></span></p>
<p class="MsoNormal">Is it possible to change the format of your raw blob?  If so, you can use i2d_PrivateKey or friends to output the entire private key to your raw data blob, and use d2i_PrivateKey et al to read it back into a working EVP_PKEY in a single
 call.<span lang="EN-US"><o:p></o:p></span></p>
<p class="MsoNormal"> <span lang="EN-US"><o:p></o:p></span></p>
<p class="MsoNormal">Otherwise, one shortcut you can do to avoid all the params work is to create a static array since you should already know how many params you need.  But you need the public key, the private key, the generator (g), and the prime modulus
 (p).  The following (untested) code ought to work.<span lang="EN-US"><o:p></o:p></span></p>
<p class="MsoNormal"> <span lang="EN-US"><o:p></o:p></span></p>
<p class="MsoNormal">OSSL_PARAM params[5];<span lang="EN-US"><o:p></o:p></span></p>
<p class="MsoNormal"> <span lang="EN-US"><o:p></o:p></span></p>
<p class="MsoNormal">params[0] = OSSL_PARAM_construct_BN(OSSL_PKEY_PARAM_FFC_P, <prime modulus>, <prime modulus bytes size>);<span lang="EN-US"><o:p></o:p></span></p>
<p class="MsoNormal">params[1] = OSSL_PARAM_construct_uint(OSSL_PKEY_PARAM_FFC_G, <generator>);<span lang="EN-US"><o:p></o:p></span></p>
<p class="MsoNormal">params[2] = OSSL_PARAM_construct_BN(OSSL_PKEY_PARAM_PUB_KEY, <public key>, <public key bytes size>);<span lang="EN-US"><o:p></o:p></span></p>
<p class="MsoNormal">params[3] = OSSL_PARAM_construct_BN(OSSL_PKEY_PARAM_PRIV_KEY, <private key>, <private key bytes size>);<span lang="EN-US"><o:p></o:p></span></p>
<p class="MsoNormal">params[4] = OSSL_PARAM_construct_end();<span lang="EN-US"><o:p></o:p></span></p>
<p class="MsoNormal"> <span lang="EN-US"><o:p></o:p></span></p>
<p class="MsoNormal">my_key_ctx = EVP_PKEY_CTX_new_from_name(NULL, “DH”, NULL);<span lang="EN-US"><o:p></o:p></span></p>
<p class="MsoNormal">EVP_PKEY_derive_init(my_key_ctx);<span lang="EN-US"><o:p></o:p></span></p>
<p class="MsoNormal">EVP_PKEY_CTX_set_params(my_key_ctx, params);<span lang="EN-US"><o:p></o:p></span></p>
<p class="MsoNormal">…<span lang="EN-US"><o:p></o:p></span></p>
<p class="MsoNormal"> <span lang="EN-US"><o:p></o:p></span></p>
</div>


<br><br><span style="font-family:Arial; Font-size:8.0pt"> <hr> Notice: This e-mail together with any attachments may contain information of Ribbon Communications Inc. that is confidential and/or proprietary for the sole use of the intended recipient.  Any review, disclosure, reliance or distribution by others or forwarding without express permission is strictly prohibited.  If you are not the intended recipient, please notify the sender immediately and then delete all copies, including any attachments.<hr> </span></body></html>