Hi,

I am wondering whether it is ok to update a key's ex data from within an engine 
method that is using the key.  This is with both OpenSSL 1.1.1a and 1.0.2j.

In my engine's load_privkey() method I connect to the HSM and obtain handles 
for a session and the key object.  Both handles are then stored in the key's ex 
data using RSA_set_ex_data() or EC_KEY_set_ex_data().  They will later be 
released by the registered free_func.  The sign and/or encrypt methods use 
these handles when making their calls to the HSM API.

This works fine for single operations like an openssl x509 command line, but 
not for long running applications such as stunnel.  It appears that stunnel 
loads all configured keys and certs at startup and then waits for clients to 
connect.  If there is no activity for a while the HSM will time out my session 
handle and the next sign operation using that session fails.  I can catch the 
error and reconnect, but this results in a new session handle.  The next time a 
client calls the same service, that key's ex data still contains the old 
outdated session handle resulting in the same error all over again.

So whenever I renew a session handle in the sign method I need to update the ex 
data of the affected key with the new value.

This appears to work fine for EC keys by calling EC_KEY_set_ex_data() from 
within the engine's ecdsa_do_sign() method.  The same goes for RSA keys in 
rsa_private_decrypt() and rsa_private_encrypt(), but with rsa_sign() I have a 
problem in that the key parameter is const RSA *.

Is the lack of const in rsa_private_encrypt() and ecdsa_do_sign() an oversight 
and I should not be manipulating ex data of the provided key in this way?
Or is the const in rsa_sign() too strict and it is actually ok to modify the ex 
data of the key?

Regards,
Andrew.

Reply via email to