<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8">
</head>
<body style="word-wrap: break-word; -webkit-nbsp-mode: space; -webkit-line-break: after-white-space; color: rgb(0, 0, 0); font-family: Calibri, sans-serif;">
<div>
<div>
<div>
<div class="">
<div class="" style="word-wrap: break-word; -webkit-nbsp-mode: space; -webkit-line-break: after-white-space;">
I am writing an app that needs to use RSA keys on a PKCS11-accessible token to encrypt and decrypt symmetric keys. For the context (no pun intended :) think of creating or mounting an existing encrypted file system.
<div class="" style="font-size: 14px;"><br class="">
</div>
<div class="" style="font-size: 14px;">To begin with, and to grasp the finer details of the programmatic interface of libcrypto, I’m “sculpting” my code after apps/pkeyutl.c and apps/apps.c.</div>
<div class="" style="font-size: 14px;"><br class="">
</div>
<div class="" style="font-size: 14px;">When I use “init_cx()” that in turn calls “load_key()” method in “apps.o” (and link my code with “apps.o” in addition to “-lcrypto”), everything works fine:</div>
<div class="" style="font-size: 14px;"><br class="">
</div>
<div class="">
<div class="" style="font-size: 11px; margin: 0px; font-family: Monaco; color: rgb(255, 38, 0);">
We expect an RSA token for this demo...</div>
<div class="" style="font-size: 11px; margin: 0px; font-family: Monaco;">Input buffer:</div>
<div class="" style="font-size: 11px; margin: 0px; font-family: Monaco;">01 02 03 04 05 06 07 08 09 0a 0b 0c 0d 0e 0f 10 </div>
<div class="" style="font-size: 11px; margin: 0px; font-family: Monaco;">10 0f 0e 0d 0c 0b 0a 09 08 07 06 05 04 03 02 01 </div>
<div class="" style="font-size: 11px; margin: 0px; font-family: Monaco; min-height: 15px;">
<br class="">
</div>
<div class="" style="font-size: 11px; margin: 0px; font-family: Monaco;">encrypt: allocating 256 bytes (rv=1)</div>
<div class="" style="font-size: 11px; margin: 0px; font-family: Monaco;">RSA encryption succeeded (rv=1 len=256):</div>
<div class="" style="font-size: 11px; margin: 0px; font-family: Monaco;">10 e5 a6 95 63 48 54 3f e2 84 7f 9c 39 6f 8c cd </div>
<div class="" style="font-size: 11px; margin: 0px; font-family: Monaco;">9a ef 18 3b 66 32 46 bf 9f d4 76 91 ce 98 5d 33 </div>
<div class="" style="font-size: 11px; margin: 0px; font-family: Monaco;">cd a7 cf 4e b7 d5 98 51 2d e3 8e 4f 09 52 1d 0f </div>
<div class="" style="font-size: 11px; margin: 0px; font-family: Monaco;">fa 3f 33 5c d9 d3 3b 2f a4 4f 87 17 73 09 c0 23 </div>
<div class="" style="font-size: 11px; margin: 0px; font-family: Monaco;">c7 56 40 ce 5f 3f 61 b1 b7 94 43 98 9f d0 cc c0 </div>
<div class="" style="font-size: 11px; margin: 0px; font-family: Monaco;">cd 38 e2 94 c4 64 a0 8f 3d fe e4 03 18 5f 83 9d </div>
<div class="" style="font-size: 11px; margin: 0px; font-family: Monaco;">da 04 42 3a f3 ad c1 3b 0c f3 60 f9 f8 c8 bc 95 </div>
<div class="" style="font-size: 11px; margin: 0px; font-family: Monaco;">83 2f 67 9b b7 3a 38 fe 79 66 30 80 7f 17 00 31 </div>
<div class="" style="font-size: 11px; margin: 0px; font-family: Monaco;">71 ee 2e c6 cd 7b 09 f3 09 eb c0 bd 45 4b 88 a9 </div>
<div class="" style="font-size: 11px; margin: 0px; font-family: Monaco;">36 23 87 71 a0 12 78 ba c5 34 be 8e ca c4 07 73 </div>
<div class="" style="font-size: 11px; margin: 0px; font-family: Monaco;">cd ea a9 90 c2 bf 31 aa ee ba 49 18 74 2e 9b 8c </div>
<div class="" style="font-size: 11px; margin: 0px; font-family: Monaco;">97 94 cb 11 5e cd fc 24 e5 84 e4 9f 17 5a ac 2b </div>
<div class="" style="font-size: 11px; margin: 0px; font-family: Monaco;">6d a5 61 bf 5d 3e 00 49 99 b0 90 32 33 02 42 ac </div>
<div class="" style="font-size: 11px; margin: 0px; font-family: Monaco;">fc 46 db 1d 8e 1d 7e 7e a4 a1 e3 c8 60 43 28 26 </div>
<div class="" style="font-size: 11px; margin: 0px; font-family: Monaco;">ef c4 84 d2 0d cf 92 61 75 bc 0c d9 47 b1 bb 9e </div>
<div class="" style="font-size: 11px; margin: 0px; font-family: Monaco;">78 00 32 b8 4b 35 c2 08 ad f6 f7 f8 bf e1 13 b1 </div>
<div class="" style="font-size: 11px; margin: 0px; font-family: Monaco; color: rgb(255, 38, 0);">
PKCS#11 token PIN: <span class="" style="color: rgb(0, 207, 144);">xxxxxxxx</span></div>
<div class="" style="font-size: 11px; margin: 0px; font-family: Monaco; min-height: 15px;">
<br class="">
</div>
<div class="" style="font-size: 11px; margin: 0px; font-family: Monaco;">decrypt: allocating 256 bytes (rv=1)</div>
<div class="" style="font-size: 11px; margin: 0px; font-family: Monaco;">RSA decryption succeeded (rv=1 len=32):</div>
<div class="" style="font-size: 11px; margin: 0px; font-family: Monaco;">01 02 03 04 05 06 07 08 09 0a 0b 0c 0d 0e 0f 10 </div>
<div class="" style="font-size: 11px; margin: 0px; font-family: Monaco;">10 0f 0e 0d 0c 0b 0a 09 08 07 06 05 04 03 02 01 </div>
<div class="" style="font-size: 11px; margin: 0px; font-family: Monaco;"><br class="">
</div>
<div class="" style="margin: 0px;">However when I try to call the EVP methods directly instead of going through the routines provided in apps.c, the decryption fails:</div>
<div class="" style="font-size: 11px; margin: 0px;"><br class="">
</div>
<div class="" style="margin: 0px;">
<div class="" style="font-size: 11px; margin: 0px; font-family: Monaco;">……</div>
<div class="" style="font-size: 11px; margin: 0px; font-family: Monaco; min-height: 15px;">
<br class="">
</div>
<div class="" style="font-size: 11px; margin: 0px; font-family: Monaco;">Encrypted symmetric key (256 bytes):</div>
<div class="" style="font-size: 11px; margin: 0px; font-family: Monaco;">76 f8 e9 b0 38 45 b5 fd b4 8e 96 f9 8a 86 ab 5a </div>
<div class="" style="font-size: 11px; margin: 0px; font-family: Monaco;">83 42 a4 b8 7e 06 e0 b7 ae 8c 7f 6c 5e 68 bd eb </div>
<div class="" style="font-size: 11px; margin: 0px; font-family: Monaco;">bf 3f 87 0c f8 0e 90 8f cd ec 01 f7 80 a8 71 00 </div>
<div class="" style="font-size: 11px; margin: 0px; font-family: Monaco;">3d 7a 5d 30 db 7f 7b 18 e2 de c0 c2 9e 07 ca 1f </div>
<div class="" style="font-size: 11px; margin: 0px; font-family: Monaco;">6c 9e dc 13 82 19 cd 49 7a fc 2c f0 52 ad 74 4a </div>
<div class="" style="font-size: 11px; margin: 0px; font-family: Monaco;">da f5 e5 71 50 d3 f9 e6 fc eb 67 6c 82 fa 00 e6 </div>
<div class="" style="font-size: 11px; margin: 0px; font-family: Monaco;">8f 2f 0a a0 9d c7 a6 85 5f 8e 93 07 53 9c e5 b3 </div>
<div class="" style="font-size: 11px; margin: 0px; font-family: Monaco;">23 9b fe 36 88 e5 7f f4 cf 81 13 dc 58 de e6 e1 </div>
<div class="" style="font-size: 11px; margin: 0px; font-family: Monaco;">d5 fe bf 5b db 5d a1 63 29 3e 96 13 d2 1a b6 b2 </div>
<div class="" style="font-size: 11px; margin: 0px; font-family: Monaco;">1f 95 73 90 97 86 ce e3 de 08 8d bc a3 11 9f 04 </div>
<div class="" style="font-size: 11px; margin: 0px; font-family: Monaco;">f5 f4 8d 8f 32 29 2c 91 74 0f 85 ab 75 3a c3 58 </div>
<div class="" style="font-size: 11px; margin: 0px; font-family: Monaco;">3e e9 30 48 f2 ae 67 08 f7 14 ce 0c 73 50 3b d4 </div>
<div class="" style="font-size: 11px; margin: 0px; font-family: Monaco;">94 aa 15 a3 79 e1 5b 27 a4 80 b9 71 53 5b 46 13 </div>
<div class="" style="font-size: 11px; margin: 0px; font-family: Monaco;">f2 c5 4b 0e 1d c7 57 3b 9f f4 a3 55 09 37 1a 47 </div>
<div class="" style="font-size: 11px; margin: 0px; font-family: Monaco;">68 0c e4 fc 86 1e d0 cc 3d 4d d7 25 7c 40 77 ba </div>
<div class="" style="font-size: 11px; margin: 0px; font-family: Monaco;">74 a5 ce 60 03 ea d4 54 a2 58 52 b5 aa bf 4a d2 </div>
<div class="" style="font-size: 11px; margin: 0px; font-family: Monaco; min-height: 15px;">
<br class="">
</div>
<div class="" style="font-size: 11px; margin: 0px; font-family: Monaco; color: rgb(255, 38, 0);">
PKCS#11 token PIN: <span class="" style="color: rgb(0, 207, 144);">xxxxxxxx</span></div>
<div class="" style="font-size: 11px; margin: 0px; font-family: Monaco; min-height: 15px;">
<br class="">
</div>
<div class="" style="font-size: 11px; margin: 0px; font-family: Monaco;">unwrap: loaded privkey of size 256</div>
<div class="" style="font-size: 11px; margin: 0px; font-family: Monaco;">unwrap: allocating 256 bytes...</div>
<div class="" style="font-size: 11px; margin: 0px; font-family: Monaco;">unwrap: decrypt returned 1 (0 bytes)</div>
<div class="" style="font-size: 11px; margin: 0px; font-family: Monaco;">unwrapping returned 1</div>
<div class="" style="font-size: 11px; margin: 0px; font-family: Monaco;">Decrypted symmetric key (0 bytes):</div>
<div class="" style="font-size: 11px;"><br class="">
</div>
<div class="" style="font-size: 11px;">You can see that up to the actual loading of the private key things are the same, and both variants of the app (the one using apps.c, and the one trying to directly call the EVP API) show the same prompt for the token
 PIN, and in both cases it <u class="">appears</u> (though I’m not sure at all of that) that the private key handle gets loaded.</div>
<div class="" style="font-size: 11px;"><br class="">
</div>
<div class="" style="font-size: 11px;">The <font face="Monaco" class="">opens-debug.log</font> file shows that there was a problem with the authentication to the token:</div>
<div class="" style="font-size: 11px;"><br class="">
</div>
<div class="" style="font-size: 11px;">
<div class="">0x7fff739f3000 16:10:25.4294968080 <b class="">[opensc-pkcs11] card-piv.c:2310:piv_validate_general_authentication: returning with: -1208 (Card does not support the requested operation)</b></div>
<div class="">0x7fff739f3000 16:10:25.784 [opensc-pkcs11] card-piv.c:2419:piv_decipher: returning with: -1208 (Card does not support the requested operation)</div>
<div class="">0x7fff739f3000 16:10:25.784 <b class="">[opensc-pkcs11] sec.c:44:sc_decipher: returning with: -1208 (Card does not support the requested operation)</b></div>
<div class="">0x7fff739f3000 16:10:25.784 [opensc-pkcs11] card-piv.c:2221:piv_set_security_env: called</div>
<div class="">0x7fff739f3000 16:10:25.784 [opensc-pkcs11] card-piv.c:2252:piv_set_security_env: returning with: 0 (Success)</div>
<div class="">0x7fff739f3000 16:10:25.140552804762384 [opensc-pkcs11] sec.c:72:sc_set_security_env: returning with: 0 (Success)</div>
<div class="">0x7fff739f3000 16:10:25.784 [opensc-pkcs11] card-piv.c:2417:piv_decipher: called</div>
<div class="">0x7fff739f3000 16:10:25.4294968080 [opensc-pkcs11] card-piv.c:2281:piv_validate_general_authentication: called</div>
<div class="">0x7fff739f3000 16:10:25.4294968080 [opensc-pkcs11] card-piv.c:2310:piv_validate_general_authentication: returning with: -1208 (Card does not support the requested operation)</div>
<div class="">0x7fff739f3000 16:10:25.784 [opensc-pkcs11] card-piv.c:2419:piv_decipher: returning with: -1208 (Card does not support the requested operation)</div>
<div class="">0x7fff739f3000 16:10:25.784 [opensc-pkcs11] sec.c:44:sc_decipher: returning with: -1208 (Card does not support the requested operation)</div>
</div>
<div class="" style="font-size: 11px;"><br class="">
</div>
<div class="" style="font-size: 11px;">This differs from what the log shows when the private key was loaded with “load_key()”:</div>
<div class="" style="font-size: 11px;"><br class="">
</div>
<div class="" style="font-size: 11px;">
<div class="">0x7fff739f3000 16:12:35.132 [opensc-pkcs11] reader-pcsc.c:313:refresh_attributes: returning with: 0 (Success)</div>
<div class="">0x7fff739f3000 16:12:35.140733193388164 [opensc-pkcs11] reader-pcsc.c:389:pcsc_detect_card_presence: returning with: 5</div>
<div class="">0x7fff739f3000 16:12:35.4294967435 [opensc-pkcs11] sec.c:206:sc_pin_cmd: returning with: 0 (Success)</div>
<div class="">0x7fff739f3000 16:12:37.939 <b class="">[opensc-pkcs11] sec.c:206:sc_pin_cmd: returning with: 0 (Success)</b></div>
<div class="">0x7fff739f3000 16:12:37.940 [opensc-pkcs11] card-piv.c:2221:piv_set_security_env: called</div>
<div class="">0x7fff739f3000 16:12:37.940 [opensc-pkcs11] card-piv.c:2252:piv_set_security_env: returning with: 0 (Success)</div>
<div class="">0x7fff739f3000 16:12:37.140295106724780 [opensc-pkcs11] sec.c:72:sc_set_security_env: returning with: 0 (Success)</div>
<div class="">0x7fff739f3000 16:12:37.940 <b class="">[opensc-pkcs11] card-piv.c:2417:piv_decipher: called</b></div>
<div class="">0x7fff739f3000 16:12:37.140733193388972<b class=""> [opensc-pkcs11] card-piv.c:2281:piv_validate_general_authentication: called</b></div>
<div class="">0x7fff739f3000 16:12:37.4294968236 <b class="">[opensc-pkcs11] card-piv.c:454:piv_general_io: called</b></div>
<div class="">0x7fff739f3000 16:12:38.608 <b class="">[opensc-pkcs11] card-piv.c:2419:piv_decipher: returning with: 256</b></div>
<div class="">0x7fff739f3000 16:12:38.608 <b class="">[opensc-pkcs11] sec.c:44:sc_decipher: returning with: 256</b></div>
<div class="">0x7fff739f3000 16:12:38.609 <b class="">[opensc-pkcs11] card-piv.c:2819:piv_finish: called</b></div>
<div class="">0x7fff739f3000 16:12:38.140295106724457 [opensc-pkcs11] ctx.c:818:sc_release_context: called</div>
</div>
<div class="" style="font-size: 11px;"><br class="">
</div>
<div class="">Here’s the relevant excerpt from the code that fails:</div>
<div class="" style="font-size: 11px;"><br class="">
</div>
<div class="" style="font-size: 11px;">
<div class="" style="margin: 0px; font-family: Monaco; color: rgb(78, 144, 114);">
<span class=""><span class="Apple-tab-span" style="white-space: pre;"></span></span>/* Retrieve the handle to private key on the token */</div>
<div class="" style="margin: 0px; font-family: Monaco; color: rgb(78, 144, 114);">
<span class=""><span class="Apple-tab-span" style="white-space: pre;"></span></span>/* Here need to get user PIN somehow ... */</div>
<div class="" style="margin: 0px; font-family: Monaco;"><span class="Apple-tab-span" style="white-space: pre;"></span><span class="" style="color: rgb(0, 97, 65);">PW_CB_DATA</span> cb_data;</div>
<div class="" style="margin: 0px; font-family: Monaco;"><span class="Apple-tab-span" style="white-space: pre;"></span>cb_data.<span class="" style="color: rgb(3, 38, 204);">password</span> = NULL;</div>
<div class="" style="margin: 0px; font-family: Monaco;"><span class="Apple-tab-span" style="white-space: pre;"></span>cb_data.<span class="" style="color: rgb(3, 38, 204);">prompt_info</span> = <span class="" style="color: rgb(57, 51, 255);">"id_03"</span>;</div>
<div class="" style="margin: 0px; font-family: Monaco;"><span class="Apple-tab-span" style="white-space: pre;"></span>privkey = <span class="" style="color: rgb(121, 61, 147);">ENGINE_load_private_key</span>(*e, <span class="" style="color: rgb(57, 51, 255);">"id_03"</span>,
 NULL, &cb_data);</div>
<div class="" style="margin: 0px; font-family: Monaco;"><span class="Apple-tab-span" style="white-space: pre;"></span><span class="" style="color: rgb(147, 26, 104);">if</span> (privkey == NULL) {</div>
<div class="" style="margin: 0px; font-family: Monaco; color: rgb(57, 51, 255);">
<span class=""><span class="Apple-tab-span" style="white-space: pre;"></span></span><span class="" style="color: rgb(121, 61, 147);">fprintf</span><span class="">(stderr, </span>"unwrap: failed to get handle to <span class="" style="text-decoration: underline;">privkey</span> id_03\n"<span class="">);</span></div>
<div class="" style="margin: 0px; font-family: Monaco;"><span class="Apple-tab-span" style="white-space: pre;"></span><span class="" style="color: rgb(147, 26, 104);">goto</span> end;</div>
<div class="" style="margin: 0px; font-family: Monaco;"><span class="Apple-tab-span" style="white-space: pre;"></span>}</div>
<div class="" style="margin: 0px; font-family: Monaco; color: rgb(57, 51, 255);">
<span class=""><span class="Apple-tab-span" style="white-space: pre;"></span></span><span class="" style="color: rgb(121, 61, 147);">printf</span><span class="">(</span>"unwrap: loaded <span class="" style="text-decoration: underline;">privkey</span> of size
 %1d\n"<span class="">, </span><span class="" style="color: rgb(121, 61, 147);">EVP_PKEY_size</span><span class="">(privkey));</span></div>
<div class="" style="margin: 0px; font-family: Monaco; min-height: 15px;"><br class="">
</div>
<div class="" style="margin: 0px; font-family: Monaco; color: rgb(78, 144, 114);">
<span class=""><span class="Apple-tab-span" style="white-space: pre;"></span></span>/* Create context */</div>
<div class="" style="margin: 0px; font-family: Monaco;"><span class="Apple-tab-span" style="white-space: pre;"></span>ctx = <span class="" style="color: rgb(121, 61, 147);">EVP_PKEY_CTX_new</span>(privkey, NULL);</div>
<div class="" style="margin: 0px; font-family: Monaco; color: rgb(121, 61, 147);">
<span class=""><span class="Apple-tab-span" style="white-space: pre;"></span></span>EVP_PKEY_free<span class="">(privkey);</span></div>
<div class="" style="margin: 0px; font-family: Monaco;"><span class="Apple-tab-span" style="white-space: pre;"></span><span class="" style="color: rgb(147, 26, 104);">if</span> (ctx == NULL) {</div>
<div class="" style="margin: 0px; font-family: Monaco; color: rgb(57, 51, 255);">
<span class=""><span class="Apple-tab-span" style="white-space: pre;"></span></span><span class="" style="color: rgb(121, 61, 147);">fprintf</span><span class="">(stderr, </span>"unwrap: failed to create context\n"<span class="">);</span></div>
<div class="" style="margin: 0px; font-family: Monaco;"><span class="Apple-tab-span" style="white-space: pre;"></span><span class="" style="color: rgb(147, 26, 104);">goto</span> end;</div>
<div class="" style="margin: 0px; font-family: Monaco;"><span class="Apple-tab-span" style="white-space: pre;"></span>}</div>
<div class="" style="margin: 0px; font-family: Monaco; color: rgb(121, 61, 147);">
<span class=""><span class="Apple-tab-span" style="white-space: pre;"></span>rv = </span>EVP_PKEY_decrypt_init<span class="">(ctx);</span></div>
<div class="" style="margin: 0px; font-family: Monaco;"><span class="Apple-tab-span" style="white-space: pre;"></span>EVP_PKEY_CTX_set_rsa_padding(ctx, RSA_PKCS1_PADDING);</div>
<div class="" style="margin: 0px; font-family: Monaco;"><span class="Apple-tab-span" style="white-space: pre;"></span><span class="" style="color: rgb(147, 26, 104);">if</span> (rv <= 0) {</div>
<div class="" style="margin: 0px; font-family: Monaco; color: rgb(57, 51, 255);">
<span class=""><span class="Apple-tab-span" style="white-space: pre;"></span></span><span class="" style="color: rgb(121, 61, 147);">fprintf</span><span class="">(stderr, </span>"unwrap: failed to initialize decrypt_ctx (rv=%d\n"<span class="">, rv);</span></div>
<div class="" style="margin: 0px; font-family: Monaco;"><span class="Apple-tab-span" style="white-space: pre;"></span><span class="" style="color: rgb(147, 26, 104);">goto</span> end;</div>
<div class="" style="margin: 0px; font-family: Monaco;"><span class="Apple-tab-span" style="white-space: pre;"></span>}</div>
<div class="" style="margin: 0px; font-family: Monaco; min-height: 15px;"><br class="">
</div>
<div class="" style="margin: 0px; font-family: Monaco; color: rgb(78, 144, 114);">
<span class=""><span class="Apple-tab-span" style="white-space: pre;"></span></span>/* Unwrap the encrypted key */</div>
<div class="" style="margin: 0px; font-family: Monaco;"><span class="Apple-tab-span" style="white-space: pre;"></span>*olen = 0;</div>
<div class="" style="margin: 0px; font-family: Monaco;"><span class="Apple-tab-span" style="white-space: pre;"></span>rv = <span class="" style="color: rgb(121, 61, 147);">EVP_PKEY_decrypt</span>(ctx, NULL, olen, in, inlen);</div>
<div class="" style="margin: 0px; font-family: Monaco;"><span class="Apple-tab-span" style="white-space: pre;"></span><span class="" style="color: rgb(147, 26, 104);">if</span> ((rv <= 0) || (*olen == 0)) {</div>
<div class="" style="margin: 0px; font-family: Monaco; color: rgb(57, 51, 255);">
<span class=""><span class="Apple-tab-span" style="white-space: pre;"></span></span><span class="" style="color: rgb(121, 61, 147);">fprintf</span><span class="">(stderr, </span>"unwrap: failed to get required output <span class="" style="text-decoration: underline;">buf</span> <span class="" style="text-decoration: underline;">len</span> (<span class="" style="text-decoration: underline;">rv</span>=%d)\n"<span class="">,
 rv);</span></div>
<div class="" style="margin: 0px; font-family: Monaco;"><span class="Apple-tab-span" style="white-space: pre;"></span><span class="" style="color: rgb(147, 26, 104);">goto</span> end;</div>
<div class="" style="margin: 0px; font-family: Monaco;"><span class="Apple-tab-span" style="white-space: pre;"></span>}</div>
<div class="" style="margin: 0px; font-family: Monaco; color: rgb(57, 51, 255);">
<span class=""><span class="Apple-tab-span" style="white-space: pre;"></span></span><span class="" style="color: rgb(121, 61, 147);">printf</span><span class="">(</span>"unwrap: allocating %1lu bytes...\n"<span class="">, *olen);</span></div>
<div class="" style="margin: 0px; font-family: Monaco;"><span class="Apple-tab-span" style="white-space: pre;"></span>*out = OPENSSL_malloc(*olen);</div>
<div class="" style="margin: 0px; font-family: Monaco;"><span class="Apple-tab-span" style="white-space: pre;"></span><span class="" style="color: rgb(147, 26, 104);">if</span> (*out == NULL) {</div>
<div class="" style="margin: 0px; font-family: Monaco; color: rgb(57, 51, 255);">
<span class=""><span class="Apple-tab-span" style="white-space: pre;"></span></span><span class="" style="color: rgb(121, 61, 147);">fprintf</span><span class="">(stderr, </span>"unwrap: failed to allocate output <span class="" style="text-decoration: underline;">buf</span> (%1lu
 bytes)\n"<span class="">, *olen);</span></div>
<div class="" style="margin: 0px; font-family: Monaco;"><span class="Apple-tab-span" style="white-space: pre;"></span>rv = -1;</div>
<div class="" style="margin: 0px; font-family: Monaco;"><span class="Apple-tab-span" style="white-space: pre;"></span><span class="" style="color: rgb(147, 26, 104);">goto</span> end;</div>
<div class="" style="margin: 0px; font-family: Monaco;"><span class="Apple-tab-span" style="white-space: pre;"></span>}</div>
<div class="" style="margin: 0px; font-family: Monaco;"><span class="Apple-tab-span" style="white-space: pre;"></span>rv = <span class="" style="color: rgb(121, 61, 147);">EVP_PKEY_decrypt</span>(ctx, *out, olen, in, inlen);</div>
<div class="" style="margin: 0px; font-family: Monaco;"><span class="Apple-tab-span" style="white-space: pre;"></span><span class="" style="color: rgb(147, 26, 104);">if</span> (rv <= 0) {</div>
<div class="" style="margin: 0px; font-family: Monaco;"><span class="Apple-tab-span" style="white-space: pre;"></span>OPENSSL_free(*out);</div>
<div class="" style="margin: 0px; font-family: Monaco; color: rgb(57, 51, 255);">
<span class=""><span class="Apple-tab-span" style="white-space: pre;"></span></span><span class="" style="color: rgb(121, 61, 147);">fprintf</span><span class="">(stderr, </span>"unwrap: failed to decrypt (rv=%d)\n"<span class="">, rv);</span></div>
<div class="" style="margin: 0px; font-family: Monaco;"><span class="Apple-tab-span" style="white-space: pre;"></span><span class="" style="color: rgb(147, 26, 104);">goto</span> end;</div>
<div class="" style="margin: 0px; font-family: Monaco;"><span class="Apple-tab-span" style="white-space: pre;"></span>}</div>
<div class="" style="margin: 0px; font-family: Monaco; color: rgb(57, 51, 255);">
<span class=""><span class="Apple-tab-span" style="white-space: pre;"></span></span><span class="" style="color: rgb(121, 61, 147);">printf</span><span class="">(</span>"unwrap: decrypt returned %d (%1lu bytes)\n"<span class="">, rv, *olen);</span></div>
</div>
<div class="" style="font-size: 11px;"><span class=""><br class="">
</span></div>
<div class="" style="font-size: 11px;"><span class=""><br class="">
</span></div>
<div class=""><span class="">I tried, but could not figure out from looking at </span>“<span class="">apps.c</span>”<span class=""> what structures and methods I need to pass to </span>“ENGINE_load_private_key()”, and how to properly initialize them. Web searches
 did not help.</div>
<div class="" style="font-size: 14px;"><br class="">
</div>
<div class="" style="font-size: 14px;">I’d appreciate guidance, as I’d rather not pull the entire “apps.c” into the app I’m building, it it can be avoided.</div>
<div class="" style="font-size: 14px;"><br class="">
</div>
<div class="" style="font-size: 14px;">Thanks!</div>
</div>
</div>
</div>
</div>
</div>
<div style="font-size: 14px;">
<div><font class="Apple-style-span" color="#000000"><font class="Apple-style-span" face="Calibri">--</font></font></div>
<div><font class="Apple-style-span" color="#000000"><font class="Apple-style-span" face="Calibri">Regards,</font></font></div>
<div><font class="Apple-style-span" color="#000000"><font class="Apple-style-span" face="Calibri">Uri Blumenthal</font></font></div>
</div>
</div>
</div>
</body>
</html>