Fix BN_[pseudo_]rand: 'mask' must be used even if top=-1.
[openssl.git] / crypto / bn / bn_rand.c
index b8fbbc8..fb583fb 100644 (file)
@@ -76,7 +76,7 @@ static int bnrand(int pseudorand, BIGNUM *rnd, int bits, int top, int bottom)
 
        bytes=(bits+7)/8;
        bit=(bits-1)%8;
-       mask=0xff<<bit;
+       mask=0xff<<(bit+1);
 
        buf=(unsigned char *)OPENSSL_malloc(bytes);
        if (buf == NULL)
@@ -133,16 +133,15 @@ static int bnrand(int pseudorand, BIGNUM *rnd, int bits, int top, int bottom)
                        else
                                {
                                buf[0]|=(3<<(bit-1));
-                               buf[0]&= ~(mask<<1);
                                }
                        }
                else
                        {
                        buf[0]|=(1<<bit);
-                       buf[0]&= ~(mask<<1);
                        }
                }
-       if (bottom) /* set bottom bits to whatever odd is */
+       buf[0] &= ~mask;
+       if (bottom) /* set bottom bit if requested */
                buf[bytes-1]|=1;
        if (!BN_bin2bn(buf,bytes,rnd)) goto err;
        ret=1;