[gnutls-dev] gnutls_pk.c uninitialised memory

Martijn Koster mak at greenhills.co.uk
Wed May 19 04:02:45 CEST 2004


Hi all,

I was using valgrind on gnutls-cli-debug, and it found a bug.
I tested gnutls-1.0.8, but that code has not changed in HEAD.

  valgrind --tool=memcheck \
    `which gnutls-cli-debug` pics.half.ebay.com

reported:

  Conditional jump or move depends on uninitialised value(s)
    at 0x3C294E16: _gnutls_pkcs1_rsa_encrypt (gnutls_pk.c:122)
    by 0x3C2938B1: _gnutls_gen_rsa_client_kx (auth_rsa.c:313)
    by 0x3C28D76C: _gnutls_send_client_kx_message (gnutls_kx.c:187)
    by 0x3C28846F: _gnutls_handshake_client (gnutls_handshake.c:2035)
    by 0x3C2880A7: gnutls_handshake (gnutls_handshake.c:1897)

That refers to the last line of this code:

   opaque rnd[3];

   /* Read three random bytes that will be
    * used to replace the zeros.
    */
   if ( (ret=_gnutls_get_random( rnd, 3, GNUTLS_STRONG_RANDOM)) < 0) {
                                gnutls_assert();
                                gnutls_afree(edata);
                                return ret;
   }
   /* use non zero values for 
    * the first two.
    */
   if (rnd[0]==0) rnd[0] = 0xaf;
   if (rnd[1]==0) rnd[1] = 0xae;

   if (ps[i] == 0) {
       /* If the first one is zero then set it to rnd[0].
        * If the second one is zero then set it to rnd[1].
        * Otherwise add (mod 256) the two previous ones plus rnd[3], or
use
        * rnd[1] if the value == 0.
        */
       if (i<2) ps[i] = rnd[i];
       else ps[i] = GMAX( rnd[3] + ps[i-1] + ps[i-2], rnd[1]);

rnd is a 3-byte array, and get_random fills it with 3 bytes,
but then in the last line rnd[3] is used, which is outside
the array, and uninitialised.

Current code in CVS has the same thing:

http://cvs.gnupg.org/cgi-bin/viewcvs.cgi/gnutls/lib/gnutls_pk.c?rev=HEAD&cvsroot=GNU+TLS+Library&content-type=text/vnd.viewcvs-markup

I presume that rnd[3] should be rnd[2]? With that change the warning
goes away. But I don't know what this code does, so I don't know if it's
the right fix. I've appended a patch.

Regards,

-- Martijn

--- gnutls_pk.c.orig    2004-05-18 14:58:03.569633016 +0100
+++ gnutls_pk.c 2004-05-18 14:58:27.360016328 +0100
@@ -115,11 +115,11 @@
                        if (ps[i] == 0) {
                                /* If the first one is zero then set it to rnd[0].
                                 * If the second one is zero then set it to rnd[1].
-                                * Otherwise add (mod 256) the two previous ones plus rnd[3], or use
+                                * Otherwise add (mod 256) the two previous ones plus rnd[2], or use
                                 * rnd[1] if the value == 0.
                                 */
                                if (i<2) ps[i] = rnd[i];
-                               else ps[i] = GMAX( rnd[3] + ps[i-1] + ps[i-2], rnd[1]);
+                               else ps[i] = GMAX( rnd[2] + ps[i-1] + ps[i-2], rnd[1]);
                        }
                }
                break;





More information about the Gnutls-dev mailing list