[Spice-devel] [RFCv5 46/47] (temp) client/red_channel: DEBUG: allow no SSL usage (useful for valgrind)
Yaniv Kaul
ykaul at redhat.com
Sun May 8 06:44:55 PDT 2011
On 05/08/2011 04:11 PM, Alon Levy wrote:
> ---
> client/red_channel.cpp | 40 +++++++++++++++++++++++++---------------
> 1 files changed, 25 insertions(+), 15 deletions(-)
>
> diff --git a/client/red_channel.cpp b/client/red_channel.cpp
> index d8dcc42..013a5a4 100644
> --- a/client/red_channel.cpp
> +++ b/client/red_channel.cpp
> @@ -173,23 +173,33 @@ void RedChannelBase::link(uint32_t connection_id, const std::string& password,
> if (bioKey != NULL) {
> BIO_write(bioKey, reply->pub_key, SPICE_TICKET_PUBKEY_BYTES);
> pubkey = d2i_PUBKEY_bio(bioKey, NULL);
> - rsa = pubkey->pkey.rsa;
> - nRSASize = RSA_size(rsa);
> - AutoArray<unsigned char> bufEncrypted(new unsigned char[nRSASize]);
> -
> - /*
> - The use of RSA encryption limit the potential maximum password length.
> - for RSA_PKCS1_OAEP_PADDING it is RSA_size(rsa) - 41.
> - */
> - if (RSA_public_encrypt(password.length() + 1, (unsigned char *)password.c_str(),
> - (uint8_t *)bufEncrypted.get(),
> - rsa, RSA_PKCS1_OAEP_PADDING)> 0) {
> - send((uint8_t*)bufEncrypted.get(), nRSASize);
> + if (pubkey == NULL) {
> +#ifdef ALLOW_NO_SSL
> + /* silly games vs valgrind */
> + nRSASize = 128;
> + uint8_t buf[128] = {0};
> + send(buf, nRSASize);
> +#else
> + THROW_ERR(SPICEC_ERROR_CODE_CONNECT_FAILED, "connect error - failed to get pubkey from server link message");
> +#endif
> } else {
> - THROW("could not encrypt password");
> + rsa = pubkey->pkey.rsa;
> + nRSASize = RSA_size(rsa);
> + AutoArray<unsigned char> bufEncrypted(new unsigned char[nRSASize]);
> +
> + /*
> + The use of RSA encryption limit the potential maximum password length.
> + for RSA_PKCS1_OAEP_PADDING it is RSA_size(rsa) - 41.
> + */
> + if (RSA_public_encrypt(password.length() + 1, (unsigned char *)password.c_str(),
> + (uint8_t *)bufEncrypted.get(),
> + rsa, RSA_PKCS1_OAEP_PADDING)> 0) {
> + send((uint8_t*)bufEncrypted.get(), nRSASize);
> + } else {
> + THROW("could not encrypt password");
> + }
> + memset(bufEncrypted.get(), 0, nRSASize);
I'd be surprised if this is actually doing what you expect it to do -
clear sensitive data?
I suspect an optimizing compiler will just skip memset() an area which
is never read again.
See http://msdn.microsoft.com/en-us/library/ms972826.aspx for a similar
scenario.
(of course, the patch above did not introduce this issue)
Y.
> }
> -
> - memset(bufEncrypted.get(), 0, nRSASize);
> } else {
> THROW("Could not initiate BIO");
> }
More information about the Spice-devel
mailing list