Quellcodebibliothek Statistik Leitseite products/sources/formale Sprachen/C/Firefox/security/nss/lib/freebl/   (Browser von der Mozilla Stiftung Version 136.0.1©)  Datei vom 10.2.2025 mit Größe 5 kB image not shown  

Quelle  sha_fast.h   Sprache: C

 
/* This Source Code Form is subject to the terms of the Mozilla Public
 * License, v. 2.0. If a copy of the MPL was not distributed with this
 * file, You can obtain one at http://mozilla.org/MPL/2.0/. */


#ifndef _SHA_FAST_H_
#define _SHA_FAST_H_

#include "prlong.h"
#include "blapii.h"

#define SHA1_INPUT_LEN 64

#if defined(IS_64) && !defined(__sparc) && !defined(__aarch64__)
typedef PRUint64 SHA_HW_t;
#define SHA1_USING_64_BIT 1
#else
typedef PRUint32 SHA_HW_t;
#endif

struct SHA1ContextStr;

typedef void (*sha1_compress_t)(struct SHA1ContextStr *);
typedef void (*sha1_update_t)(struct SHA1ContextStr *, const unsigned char *,
                              unsigned int);

struct SHA1ContextStr {
    union {
        PRUint32 w[16]; /* input buffer */
        PRUint8 b[64];
    } u;
    PRUint64 size;  /* count of hashed bytes. */
    SHA_HW_t H[22]; /* 5 state variables, 16 tmp values, 1 extra */
    sha1_compress_t compress;
    sha1_update_t update;
};

#if defined(_MSC_VER)
#include <stdlib.h>
#if defined(IS_LITTLE_ENDIAN)
#if (_MSC_VER >= 1300)
#pragma intrinsic(_byteswap_ulong)
#define SHA_HTONL(x) _byteswap_ulong(x)
#elif defined(NSS_X86_OR_X64)
#ifndef FORCEINLINE
#if (_MSC_VER >= 1200)
#define FORCEINLINE __forceinline
#else
#define FORCEINLINE __inline
#endif /* _MSC_VER */
#endif /* !defined FORCEINLINE */
#define FASTCALL __fastcall

static FORCEINLINE PRUint32 FASTCALL
swap4b(PRUint32 dwd)
{
    __asm {
     mov   eax,dwd
 bswap eax
    }
}

#define SHA_HTONL(x) swap4b(x)
#endif /* NSS_X86_OR_X64 */
#endif /* IS_LITTLE_ENDIAN */

#pragma intrinsic(_lrotr, _lrotl)
#define SHA_ROTL(x, n) _lrotl(x, n)
#define SHA_ROTL_IS_DEFINED 1
#endif /* _MSC_VER */

#if defined(__GNUC__)
/* __x86_64__  and __x86_64 are defined by GCC on x86_64 CPUs */
#if defined(SHA1_USING_64_BIT)
static __inline__ PRUint64
SHA_ROTL(PRUint64 x, PRUint32 n)
{
    PRUint32 t = (PRUint32)x;
    return ((t << n) | (t >> (32 - n)));
}
#else
static __inline__ PRUint32
SHA_ROTL(PRUint32 t, PRUint32 n)
{
    return ((t << n) | (t >> (32 - n)));
}
#endif
#define SHA_ROTL_IS_DEFINED 1

#if defined(NSS_X86_OR_X64)
static __inline__ PRUint32
swap4b(PRUint32 value)
{
    __asm__("bswap %0"
            : "+r"(value));
    return (value);
}
#define SHA_HTONL(x) swap4b(x)

#elif defined(__thumb2__) ||       \
    (!defined(__thumb__) &&        \
     (defined(__ARM_ARCH_6__) ||   \
      defined(__ARM_ARCH_6J__) ||  \
      defined(__ARM_ARCH_6K__) ||  \
      defined(__ARM_ARCH_6Z__) ||  \
      defined(__ARM_ARCH_6ZK__) || \
      defined(__ARM_ARCH_6T2__) || \
      defined(__ARM_ARCH_7__) ||   \
      defined(__ARM_ARCH_7A__) ||  \
      defined(__ARM_ARCH_7R__)))
#if defined(IS_LITTLE_ENDIAN)
static __inline__ PRUint32
swap4b(PRUint32 value)
{
    PRUint32 ret;
    __asm__("rev %0, %1"
            : "=r"(ret)
            : "r"(value));
    return ret;
}
#define SHA_HTONL(x) swap4b(x)
#endif

#endif /* x86 family */

#endif /* __GNUC__ */

#if !defined(SHA_ROTL_IS_DEFINED)
#define SHA_NEED_TMP_VARIABLE 1
#define SHA_ROTL(X, n) (tmp = (X), ((tmp) << (n)) | ((tmp) >> (32 - (n))))
#endif

#if !defined(SHA_HTONL)
#define SHA_MASK 0x00FF00FF
#if defined(IS_LITTLE_ENDIAN)
#undef SHA_NEED_TMP_VARIABLE
#define SHA_NEED_TMP_VARIABLE 1
#define SHA_HTONL(x) (tmp = (x), tmp = (tmp << 16) | (tmp >> 16), \
                      ((tmp & SHA_MASK) << 8) | ((tmp >> 8) & SHA_MASK))
#else
#define SHA_HTONL(x) (x)
#endif
#endif

#define SHA_BYTESWAP(x) x = SHA_HTONL(x)

#define SHA_STORE(n) ((PRUint32 *)hashout)[n] = SHA_HTONL(ctx->H[n])
#if defined(HAVE_UNALIGNED_ACCESS)
#define SHA_STORE_RESULT \
    SHA_STORE(0);        \
    SHA_STORE(1);        \
    SHA_STORE(2);        \
    SHA_STORE(3);        \
    SHA_STORE(4);

#elif defined(IS_LITTLE_ENDIAN) || defined(SHA1_USING_64_BIT)
#define SHA_STORE_RESULT                            \
    if (!((ptrdiff_t)hashout % sizeof(PRUint32))) { \
        SHA_STORE(0);                               \
        SHA_STORE(1);                               \
        SHA_STORE(2);                               \
        SHA_STORE(3);                               \
        SHA_STORE(4);                               \
    } else {                                        \
        PRUint32 tmpbuf[5];                         \
        tmpbuf[0] = SHA_HTONL(ctx->H[0]);           \
        tmpbuf[1] = SHA_HTONL(ctx->H[1]);           \
        tmpbuf[2] = SHA_HTONL(ctx->H[2]);           \
        tmpbuf[3] = SHA_HTONL(ctx->H[3]);           \
        tmpbuf[4] = SHA_HTONL(ctx->H[4]);           \
        memcpy(hashout, tmpbuf, SHA1_LENGTH);       \
    }

#else
#define SHA_STORE_RESULT                            \
    if (!((ptrdiff_t)hashout % sizeof(PRUint32))) { \
        SHA_STORE(0);                               \
        SHA_STORE(1);                               \
        SHA_STORE(2);                               \
        SHA_STORE(3);                               \
        SHA_STORE(4);                               \
    } else {                                        \
        memcpy(hashout, ctx->H, SHA1_LENGTH);       \
    }
#endif

#endif /* _SHA_FAST_H_ */

Messung V0.5
C=95 H=81 G=88

¤ Dauer der Verarbeitung: 0.14 Sekunden  (vorverarbeitet)  ¤

*© Formatika GbR, Deutschland






Wurzel

Suchen

Beweissystem der NASA

Beweissystem Isabelle

NIST Cobol Testsuite

Cephes Mathematical Library

Wiener Entwicklungsmethode

Haftungshinweis

Die Informationen auf dieser Webseite wurden nach bestem Wissen sorgfältig zusammengestellt. Es wird jedoch weder Vollständigkeit, noch Richtigkeit, noch Qualität der bereit gestellten Informationen zugesichert.

Bemerkung:

Die farbliche Syntaxdarstellung und die Messung sind noch experimentell.