Commit 045162e5 authored by Pauli's avatar Pauli
Browse files

Detect endian without relying on defined symbols.

parent 2500c093
Loading
Loading
Loading
Loading

test/endian.h

0 → 100644
+22 −0
Original line number Diff line number Diff line
/*
 * 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
+13 −10
Original line number Diff line number Diff line
@@ -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 swap_copy(unsigned char *out, const void *in, size_t len)

static void copy_to_le(unsigned char *out, const void *in, size_t len)
{
#ifdef B_ENDIAN
    swap_copy(out, in, len);
#else
    DECLARE_IS_ENDIAN;

    if (IS_LITTLE_ENDIAN)
        memcpy(out, in, len);
#endif
    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
    DECLARE_IS_ENDIAN;

    if (IS_LITTLE_ENDIAN)
        swap_copy(out, in, len);
#endif
    else
        memcpy(out, in, len);
}

static const struct {