Basic idea behind explicit IV is to make it unpredictable for attacker.
authorAndy Polyakov <appro@openssl.org>
Sun, 30 Sep 2007 22:01:36 +0000 (22:01 +0000)
committerAndy Polyakov <appro@openssl.org>
Sun, 30 Sep 2007 22:01:36 +0000 (22:01 +0000)
Until now it was xor between CBC residue and 1st block from last datagram,
or in other words still predictable.

ssl/d1_pkt.c

index 4523484..b9bbbd4 100644 (file)
 #include <openssl/evp.h>
 #include <openssl/buffer.h>
 #include <openssl/pqueue.h>
 #include <openssl/evp.h>
 #include <openssl/buffer.h>
 #include <openssl/pqueue.h>
+#include <openssl/rand.h>
 
 /* mod 128 saturating subtract of two 64-bit values in big-endian order */
 static int satsub64be(const unsigned char *v1,const unsigned char *v2)
 
 /* mod 128 saturating subtract of two 64-bit values in big-endian order */
 static int satsub64be(const unsigned char *v1,const unsigned char *v2)
@@ -1430,8 +1431,14 @@ int do_dtls1_write(SSL *s, int type, const unsigned char *buf, unsigned int len,
 
 
        /* ssl3_enc can only have an error on read */
 
 
        /* ssl3_enc can only have an error on read */
-       wr->length += bs;  /* bs != 0 in case of CBC.  The enc fn provides
-                                               * the randomness */ 
+       if (bs) /* bs != 0 in case of CBC */
+               {
+               RAND_pseudo_bytes(p,bs);
+               /* master IV and last CBC residue stand for
+                * the rest of randomness */
+               wr->length += bs;
+               }
+
        s->method->ssl3_enc->enc(s,1);
 
        /* record length after mac and block padding */
        s->method->ssl3_enc->enc(s,1);
 
        /* record length after mac and block padding */