<div dir="ltr"><div>We are having some troubles converting some code from OpenSSL 1.1.x to OpenSSL <br>3.0.7 APIs, to get rid of deprecation warnings, and hope someone may be able to <br>give us some hints in the right direction.<br></div><div><br></div><div><br></div><b>Part1</b>:  We are encrypting some text file with openssl3 commands <br>and extracting public part(ephdata) of provate key and appending it to encryptedfile.<br>All openssl operations done using openssl(version 3.0.7) commands in bash script.<br><br>openssl ecparam -name secp521r1 -genkey -noout -out ephpri.pem<br>openssl pkeyutl -derive -inkey ephpri.pem -peerkey ecpubkey.pem -out derive.bin<br>ENVELOPE=$(openssl dgst -sha512 derive.bin | awk '{print $2}')<br>AESKEY=$(echo $ENVELOPE | cut -c1-64)<br>AESIV=$(echo $ENVELOPE | cut -c65-96)<br>echo "AESKEY = $AESKEY"<br>echo "AESIV  = $AESIV"<br># encrypt file.txt<br>openssl enc -e -aes-256-ctr -in file.txt -out file.enc -K $AESKEY -iv $AESIV<br><br>#extract and append pub part of private-key<br># export public data of the ephemeral key<br>openssl ec -in ephpri.pem -pubout -out ephdata.tmp -outform DER -conv_form compressed<br>OFFSET=$(openssl asn1parse -inform DER -in ephdata.tmp | grep "BIT STRING" | awk -F ':' '{print $1}' | awk '{print $1}')<br>OFFSET=$(expr $OFFSET + 3)<br>dd if=ephdata.tmp of=ephdata bs=$OFFSET count=1024 skip=1<br>append_file file.enc ephdata<br><br><b>Part2</b>: We are processing the encrypted file on other peer using application which uses openssl3 APIs.<br>1) extraction of ephdata(pub part of key in part1) from encrypted file.<br>2) preparing public key from ephdata <br>3) prearing hash using own private key and derived public key<br>4) deriving of AES keys from hash and decrypting encrypted file using the same.<br><br><u>Low level APIs: ( part2 decryption succeeds):</u><div><br><div>group = EC_GROUP_new_by_curve_name(NID_secp521r1);<br>EC_GROUP_precompute_mult(group, nullptr)<br>EC_GROUP_set_point_conversion_form(group, POINT_CONVERSION_COMPRESSED);</div><div><br>publicKey  = EC_KEY_new();<br>EC_KEY_set_group(key, group)<br>point = EC_POINT_new(group);<br>EC_POINT_oct2point(group, point, data, length, nullptr)  // data is ephdata - derived in part1 <br>EC_KEY_set_public_key(

publicKey  , point)<br>EC_POINT_free(point);<br>EC_KEY_check_key(

publicKey  ) // key is public key derived from ephdata<br><br>ECDH_compute_key(envelope,<br>                         SHA512_DIGEST_LENGTH,<br>                         EC_KEY_get0_public_key(publicKey),<br>                         privateKey,<br>                         eciesKeyDerivationFn)</div><div>--------------------------------------------------------------------------------------------------------------------------------------<br><br><u>Replaced with high level APIs ( part2 decryption fails) :<br></u>   </div><div>// ctx setting with named curve</div><div> nid = NID_secp521r1;<br>    pctx = EVP_PKEY_CTX_new_from_name(NULL, "EC", NULL);<br>    EVP_PKEY_keygen_init(pctx)<br>    EVP_PKEY_CTX_set_ec_paramgen_curve_nid(pctx, nid)<br>    params[0] = OSSL_PARAM_construct_utf8_string("point-format", compressionState, 0);<br>    params[1] = OSSL_PARAM_construct_end();<br>    EVP_PKEY_CTX_set_params(pctx, params)<br><br></div><div>// public key derivation from pubdata from peer</div><div>   dctx = EVP_PKEY_CTX_new_from_name(NULL, "EC", NULL)<br></div><div>   EVP_PKEY_fromdata_init(dctx)<br></div><div>    //param struct for fromdata<br>    OSSL_PARAM params[4];<br>    char *secp521r1 = (char *)"secp521r1";<br>    params[0] = OSSL_PARAM_construct_octet_string("pub", (void *) data, length);<br>    params[1] = OSSL_PARAM_construct_utf8_string("group", secp521r1, 0);<br>    char *compressionState = (char *)"compressed";<br>    params[2] = OSSL_PARAM_construct_utf8_string("point-format", compressionState, 0);<br>    params[3] = OSSL_PARAM_construct_end();<br></div><div>    EVP_PKEY * public_key = nullptr;<br></div><div>    EVP_PKEY_fromdata(dctx, &public_key   , EVP_PKEY_PUBLIC_KEY, params) <br><br>// hash/envelope derivation </div><div>dctx = EVP_PKEY_CTX_new_from_pkey(NULL, d->privateKey, NULL);<br>EVP_PKEY_derive_init(dctx)</div><div>OSSL_PARAM params[4];<br>unsigned int padding = 1;<b><br></b></div><div>params[0] = OSSL_PARAM_construct_uint(OSSL_EXCHANGE_PARAM_PAD, &padding);<br>params[1] = OSSL_PARAM_construct_utf8_string(OSSL_EXCHANGE_PARAM_KDF_DIGEST,<br>                        (char*)"sha512", 0);<br>params[2] = OSSL_PARAM_construct_size_t(OSSL_EXCHANGE_PARAM_KDF_OUTLEN,<br>                        &length);<br>params[3] = OSSL_PARAM_construct_end();<br></div><div>EVP_PKEY_CTX_set_params(dctx, params)<b><br></b></div><div>EVP_PKEY_derive_set_peer(dctx, publicKey)<br></div><div>EVP_PKEY_derive(dctx, envelope, &length)<br></div><div><br></div><div><b><br></b></div><div><b>Issue</b>:<br>If part2 application uses high level APIs, decryption of the file fails.<br>However if part2 application uses low level APIs ( deprecated in openssl3) decryption succeeds.<br>Issue could be either in publickey derivation from ephdata or hash.<br><br><div><br></div><div>Thanks,</div><div><br></div></div></div></div>