question about certificate verifiy using TLS

From: Niklas Olsson (niklaso_at_hotmail.com)
Date: 08/30/04


Date: 30 Aug 2004 07:50:00 -0700

Hi,
I'm implementing PEAP and looking at the RFC2246 TLS version 1.0.
I'm trying to understand how the certificate verify is supposed to
work. (after I get back the server hello message)
It's quite clear that I should use the type and length fields of the
handshake messages.
I just don't know how to hash it. I thought first that I should use
hmac_md5 (I use cipher suite TLS_RSA_WITH_RC4_128_MD5)
The output is 16 bytes, but when I use ethereal and monitor what
windows sends I see that it sends 32 bytes.

in the RFC § 7.4.8 I can read that the structure of the message should
look like this:
struct {
  Signature signature;
} CertificateVerify

§ 7.4.3 shows
md5_hash
  MD5(ClientHello.random + ServerHello.random + ServerParams);

sha_hash
  SHA(ClientHello.random + ServerHello.random + ServerParams);

enum { anonymous, rsa, dsa } SignatureAlgorithm;
select (SignatureAlgorithm)
{
           case anonymous: struct { };
           case rsa:
               digitally-signed struct {
                   opaque md5_hash[16];
                   opaque sha_hash[20];
               };
           case dsa:
               digitally-signed struct {
                   opaque sha_hash[20];
    };
} Signature;

if I don't use hmac_md5 and only MD5, it still is only 16 bytes and 20
with sha1.

I'm a bit confused here as you see.
any help is highly appreciated.

thanks!