From 81edc9beb6e0f2d41ef88fc237a2efba580289b2 Mon Sep 17 00:00:00 2001 From: David Benjamin Date: Wed, 18 Nov 2015 15:57:00 -0500 Subject: [PATCH] Do away with BN_LLONG in favor of BN_ULLONG. BN_LLONG is only ever used in #ifdefs. The actual type is BN_ULLONG. Switch the ifdefs to check on BN_ULLONG and remove BN_LLONG. Also fix signedness of all the constants (potentially avoiding undefined behavior in some operations). Change-Id: I3e7739bbe14c50ea7db04fc507a034a8cb315a5f Reviewed-on: https://boringssl-review.googlesource.com/6518 Reviewed-by: Adam Langley --- crypto/bn/div.c | 12 ++++++------ crypto/bn/generic.c | 26 +++++++++++++------------- crypto/bn/internal.h | 30 ++++++++++++++---------------- 3 files changed, 33 insertions(+), 35 deletions(-) diff --git a/crypto/bn/div.c b/crypto/bn/div.c index 779dda2d..f9e144a3 100644 --- a/crypto/bn/div.c +++ b/crypto/bn/div.c @@ -260,10 +260,10 @@ int BN_div(BIGNUM *dv, BIGNUM *rm, const BIGNUM *num, const BIGNUM *divisor, q = BN_MASK2; } else { /* n0 < d0 */ -#ifdef BN_LLONG +#ifdef BN_ULLONG BN_ULLONG t2; -#if defined(BN_LLONG) && !defined(div_asm) +#if defined(BN_ULLONG) && !defined(div_asm) q = (BN_ULONG)(((((BN_ULLONG)n0) << BN_BITS2) | n1) / d0); #else q = div_asm(n0, n1, d0); @@ -288,7 +288,7 @@ int BN_div(BIGNUM *dv, BIGNUM *rm, const BIGNUM *num, const BIGNUM *divisor, } t2 -= d1; } -#else /* !BN_LLONG */ +#else /* !BN_ULLONG */ BN_ULONG t2l, t2h; #if defined(div_asm) @@ -331,7 +331,7 @@ int BN_div(BIGNUM *dv, BIGNUM *rm, const BIGNUM *num, const BIGNUM *divisor, } t2l -= d1; } -#endif /* !BN_LLONG */ +#endif /* !BN_ULLONG */ } l0 = bn_mul_words(tmp->d, sdiv->d, div_n, q); @@ -601,7 +601,7 @@ BN_ULONG BN_div_word(BIGNUM *a, BN_ULONG w) { } BN_ULONG BN_mod_word(const BIGNUM *a, BN_ULONG w) { -#ifndef BN_LLONG +#ifndef BN_ULLONG BN_ULONG ret = 0; #else BN_ULLONG ret = 0; @@ -614,7 +614,7 @@ BN_ULONG BN_mod_word(const BIGNUM *a, BN_ULONG w) { w &= BN_MASK2; for (i = a->top - 1; i >= 0; i--) { -#ifndef BN_LLONG +#ifndef BN_ULLONG ret = ((ret << BN_BITS4) | ((a->d[i] >> BN_BITS4) & BN_MASK2l)) % w; ret = ((ret << BN_BITS4) | (a->d[i] & BN_MASK2l)) % w; #else diff --git a/crypto/bn/generic.c b/crypto/bn/generic.c index f6821bff..7303ca5b 100644 --- a/crypto/bn/generic.c +++ b/crypto/bn/generic.c @@ -69,7 +69,7 @@ (!defined(OPENSSL_X86_64) && !defined(OPENSSL_X86)) || \ (defined(OPENSSL_X86_64) && defined(OPENSSL_WINDOWS)) -#ifdef BN_LLONG +#ifdef BN_ULLONG #define mul_add(r, a, w, c) \ { \ BN_ULLONG t; \ @@ -216,9 +216,9 @@ (c) = h & BN_MASK2; \ (r) = l & BN_MASK2; \ } -#endif /* !BN_LLONG */ +#endif /* !BN_ULLONG */ -#if defined(BN_LLONG) || defined(BN_UMULT_HIGH) +#if defined(BN_ULLONG) || defined(BN_UMULT_HIGH) BN_ULONG bn_mul_add_words(BN_ULONG *rp, const BN_ULONG *ap, int num, BN_ULONG w) { @@ -298,7 +298,7 @@ void bn_sqr_words(BN_ULONG *r, const BN_ULONG *a, int n) { } } -#else /* !(defined(BN_LLONG) || defined(BN_UMULT_HIGH)) */ +#else /* !(defined(BN_ULLONG) || defined(BN_UMULT_HIGH)) */ BN_ULONG bn_mul_add_words(BN_ULONG *rp, const BN_ULONG *ap, int num, BN_ULONG w) { @@ -384,9 +384,9 @@ void bn_sqr_words(BN_ULONG *r, const BN_ULONG *a, int n) { } } -#endif /* !(defined(BN_LLONG) || defined(BN_UMULT_HIGH)) */ +#endif /* !(defined(BN_ULLONG) || defined(BN_UMULT_HIGH)) */ -#if defined(BN_LLONG) +#if defined(BN_ULLONG) BN_ULONG bn_div_words(BN_ULONG h, BN_ULONG l, BN_ULONG d) { return (BN_ULONG)(((((BN_ULLONG)h) << BN_BITS2) | l) / (BN_ULLONG)d); @@ -464,9 +464,9 @@ BN_ULONG bn_div_words(BN_ULONG h, BN_ULONG l, BN_ULONG d) { return ret; } -#endif /* !defined(BN_LLONG) */ +#endif /* !defined(BN_ULLONG) */ -#ifdef BN_LLONG +#ifdef BN_ULLONG BN_ULONG bn_add_words(BN_ULONG *r, const BN_ULONG *a, const BN_ULONG *b, int n) { BN_ULLONG ll = 0; @@ -506,7 +506,7 @@ BN_ULONG bn_add_words(BN_ULONG *r, const BN_ULONG *a, const BN_ULONG *b, return (BN_ULONG)ll; } -#else /* !BN_LLONG */ +#else /* !BN_ULLONG */ BN_ULONG bn_add_words(BN_ULONG *r, const BN_ULONG *a, const BN_ULONG *b, int n) { @@ -563,7 +563,7 @@ BN_ULONG bn_add_words(BN_ULONG *r, const BN_ULONG *a, const BN_ULONG *b, return (BN_ULONG)c; } -#endif /* !BN_LLONG */ +#endif /* !BN_ULLONG */ BN_ULONG bn_sub_words(BN_ULONG *r, const BN_ULONG *a, const BN_ULONG *b, int n) { @@ -625,7 +625,7 @@ BN_ULONG bn_sub_words(BN_ULONG *r, const BN_ULONG *a, const BN_ULONG *b, /* sqr_add_c(a,i,c0,c1,c2) -- c+=a[i]^2 for three word number c=(c2,c1,c0) */ /* sqr_add_c2(a,i,c0,c1,c2) -- c+=2*a[i]*a[j] for three word number c=(c2,c1,c0) */ -#ifdef BN_LLONG +#ifdef BN_ULLONG /* Keep in mind that additions to multiplication result can not overflow, * because its high half cannot be all-ones. */ @@ -716,7 +716,7 @@ BN_ULONG bn_sub_words(BN_ULONG *r, const BN_ULONG *a, const BN_ULONG *b, #define sqr_add_c2(a, i, j, c0, c1, c2) mul_add_c2((a)[i], (a)[j], c0, c1, c2) -#else /* !BN_LLONG */ +#else /* !BN_ULLONG */ /* Keep in mind that additions to hi can not overflow, because * the high word of a multiplication result cannot be all-ones. */ @@ -768,7 +768,7 @@ BN_ULONG bn_sub_words(BN_ULONG *r, const BN_ULONG *a, const BN_ULONG *b, } while (0) #define sqr_add_c2(a, i, j, c0, c1, c2) mul_add_c2((a)[i], (a)[j], c0, c1, c2) -#endif /* !BN_LLONG */ +#endif /* !BN_ULLONG */ void bn_mul_comba8(BN_ULONG *r, BN_ULONG *a, BN_ULONG *b) { BN_ULONG c1, c2, c3; diff --git a/crypto/bn/internal.h b/crypto/bn/internal.h index 6bb54b5e..72ef4e95 100644 --- a/crypto/bn/internal.h +++ b/crypto/bn/internal.h @@ -144,35 +144,33 @@ BIGNUM *bn_expand(BIGNUM *bn, size_t bits); #if !defined(_MSC_VER) /* MSVC doesn't support two-word integers on 64-bit. */ -#define BN_LLONG __int128_t #define BN_ULLONG __uint128_t #endif #define BN_BITS2 64 #define BN_BYTES 8 #define BN_BITS4 32 -#define BN_MASK2 (0xffffffffffffffffL) -#define BN_MASK2l (0xffffffffL) -#define BN_MASK2h (0xffffffff00000000L) -#define BN_MASK2h1 (0xffffffff80000000L) -#define BN_TBIT (0x8000000000000000L) +#define BN_MASK2 (0xffffffffffffffffUL) +#define BN_MASK2l (0xffffffffUL) +#define BN_MASK2h (0xffffffff00000000UL) +#define BN_MASK2h1 (0xffffffff80000000UL) +#define BN_TBIT (0x8000000000000000UL) #define BN_DEC_CONV (10000000000000000000UL) #define BN_DEC_NUM 19 #define TOBN(hi, lo) ((BN_ULONG)hi << 32 | lo) #elif defined(OPENSSL_32_BIT) -#define BN_LLONG int64_t #define BN_ULLONG uint64_t #define BN_BITS2 32 #define BN_BYTES 4 #define BN_BITS4 16 -#define BN_MASK2 (0xffffffffL) -#define BN_MASK2l (0xffff) -#define BN_MASK2h1 (0xffff8000L) -#define BN_MASK2h (0xffff0000L) -#define BN_TBIT (0x80000000L) -#define BN_DEC_CONV (1000000000L) +#define BN_MASK2 (0xffffffffUL) +#define BN_MASK2l (0xffffUL) +#define BN_MASK2h1 (0xffff8000UL) +#define BN_MASK2h (0xffff0000UL) +#define BN_TBIT (0x80000000UL) +#define BN_DEC_CONV (1000000000UL) #define BN_DEC_NUM 9 #define TOBN(hi, lo) lo, hi @@ -195,7 +193,7 @@ BIGNUM *bn_expand(BIGNUM *bn, size_t bits); sizeof(x) / sizeof(BN_ULONG), 0, BN_FLG_STATIC_DATA \ } -#if defined(BN_LLONG) +#if defined(BN_ULLONG) #define Lw(t) (((BN_ULONG)(t))&BN_MASK2) #define Hw(t) (((BN_ULONG)((t)>>BN_BITS2))&BN_MASK2) #endif @@ -225,7 +223,7 @@ int bn_cmp_part_words(const BN_ULONG *a, const BN_ULONG *b, int cl, int dl); int bn_mul_mont(BN_ULONG *rp, const BN_ULONG *ap, const BN_ULONG *bp, const BN_ULONG *np, const BN_ULONG *n0, int num); -#if !defined(BN_LLONG) +#if !defined(BN_ULLONG) #define LBITS(a) ((a) & BN_MASK2l) #define HBITS(a) (((a) >> BN_BITS4) & BN_MASK2l) @@ -257,7 +255,7 @@ int bn_mul_mont(BN_ULONG *rp, const BN_ULONG *ap, const BN_ULONG *bp, (h) = ht; \ } -#endif /* !defined(BN_LLONG) */ +#endif /* !defined(BN_ULLONG) */ #if !defined(OPENSSL_NO_ASM) && defined(OPENSSL_X86_64) # if defined(__GNUC__) && __GNUC__ >= 2