Detect endian without relying on defined symbols.

Reviewed-by: Richard Levitte <levitte@openssl.org>
(Merged from https://github.com/openssl/openssl/pull/8572)
diff --git a/test/endian.h b/test/endian.h
new file mode 100644
index 0000000..0bcec04
--- /dev/null
+++ b/test/endian.h
@@ -0,0 +1,22 @@
+/*
+ * Copyright 2019 The OpenSSL Project Authors. All Rights Reserved.
+ *
+ * Licensed under the Apache License 2.0 (the "License").  You may not use
+ * this file except in compliance with the License.  You can obtain a copy
+ * in the file LICENSE in the source distribution or at
+ * https://www.openssl.org/source/license.html
+ */
+
+#ifndef HEADER_INTERNAL_ENDIAN_H
+# define HEADER_INTERNAL_ENDIAN_H
+
+# define DECLARE_IS_ENDIAN \
+    const union { \
+        long one; \
+        char little; \
+    } ossl_is_endian = { 1 }
+
+# define IS_LITTLE_ENDIAN (ossl_is_endian.little != 0)
+# define IS_BIG_ENDIAN    (ossl_is_endian.little == 0)
+
+#endif
diff --git a/test/params_api_test.c b/test/params_api_test.c
index e592661..c99af3d 100644
--- a/test/params_api_test.c
+++ b/test/params_api_test.c
@@ -11,6 +11,7 @@
 #include <string.h>
 #include "testutil.h"
 #include "internal/nelem.h"
+#include "endian.h"
 #include <openssl/params.h>
 #include <openssl/bn.h>
 
@@ -27,20 +28,22 @@
 
 static void copy_to_le(unsigned char *out, const void *in, size_t len)
 {
-#ifdef B_ENDIAN
-    swap_copy(out, in, len);
-#else
-    memcpy(out, in, len);
-#endif
+    DECLARE_IS_ENDIAN;
+
+    if (IS_LITTLE_ENDIAN)
+        memcpy(out, in, len);
+    else
+        swap_copy(out, in, len);
 }
 
 static void copy_be_to_native(unsigned char *out, const void *in, size_t len)
 {
-#ifdef B_ENDIAN
-    memcpy(out, in, len);
-#else
-    swap_copy(out, in, len);
-#endif
+    DECLARE_IS_ENDIAN;
+
+    if (IS_LITTLE_ENDIAN)
+        swap_copy(out, in, len);
+    else
+        memcpy(out, in, len);
 }
 
 static const struct {