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");
      }

_______________________________________________
Spice-devel mailing list
[email protected]
http://lists.freedesktop.org/mailman/listinfo/spice-devel

Reply via email to