BN: Check endianness in run-time, in BN_native2bn() and BN_bn2nativepad()
authorRichard Levitte <levitte@openssl.org>
Thu, 9 Jul 2020 06:40:50 +0000 (08:40 +0200)
committerRichard Levitte <levitte@openssl.org>
Sat, 11 Jul 2020 08:00:33 +0000 (10:00 +0200)
The code relied on B_ENDIAN being defined on all big-endian platform,
which turned out to not always be the case.

Fixes #12387

Reviewed-by: Kurt Roeckx <kurt@roeckx.be>
(Merged from https://github.com/openssl/openssl/pull/12390)

crypto/bn/bn_lib.c

index a0924d0e314f703f7b3b0c195a4aa9d395bb1d50..57783e47d80b47675f86ddaf2c36a23f66724b77 100644 (file)
@@ -10,6 +10,7 @@
 #include <assert.h>
 #include <limits.h>
 #include "internal/cryptlib.h"
+#include "internal/endian.h"
 #include "bn_local.h"
 #include <openssl/opensslconf.h>
 #include "internal/constant_time.h"
@@ -583,20 +584,20 @@ int BN_bn2lebinpad(const BIGNUM *a, unsigned char *to, int tolen)
 
 BIGNUM *BN_native2bn(const unsigned char *s, int len, BIGNUM *ret)
 {
-#ifdef B_ENDIAN
+    DECLARE_IS_ENDIAN;
+
+    if (IS_LITTLE_ENDIAN)
+        return BN_lebin2bn(s, len, ret);
     return BN_bin2bn(s, len, ret);
-#else
-    return BN_lebin2bn(s, len, ret);
-#endif
 }
 
 int BN_bn2nativepad(const BIGNUM *a, unsigned char *to, int tolen)
 {
-#ifdef B_ENDIAN
+    DECLARE_IS_ENDIAN;
+
+    if (IS_LITTLE_ENDIAN)
+        return BN_bn2lebinpad(a, to, tolen);
     return BN_bn2binpad(a, to, tolen);
-#else
-    return BN_bn2lebinpad(a, to, tolen);
-#endif
 }
 
 int BN_ucmp(const BIGNUM *a, const BIGNUM *b)