Coverage Report

Created: 2025-07-01 06:25

/src/nss/lib/freebl/sha_fast.h
Line
Count
Source (jump to first uncovered line)
1
/* This Source Code Form is subject to the terms of the Mozilla Public
2
 * License, v. 2.0. If a copy of the MPL was not distributed with this
3
 * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
4
5
#ifndef _SHA_FAST_H_
6
#define _SHA_FAST_H_
7
8
#include "prlong.h"
9
#include "blapii.h"
10
11
#define SHA1_INPUT_LEN 64
12
13
#if defined(IS_64) && !defined(__sparc) && !defined(__aarch64__)
14
typedef PRUint64 SHA_HW_t;
15
#define SHA1_USING_64_BIT 1
16
#else
17
typedef PRUint32 SHA_HW_t;
18
#endif
19
20
struct SHA1ContextStr;
21
22
typedef void (*sha1_compress_t)(struct SHA1ContextStr *);
23
typedef void (*sha1_update_t)(struct SHA1ContextStr *, const unsigned char *,
24
                              unsigned int);
25
26
struct SHA1ContextStr {
27
    union {
28
        PRUint32 w[16]; /* input buffer */
29
        PRUint8 b[64];
30
    } u;
31
    PRUint64 size;  /* count of hashed bytes. */
32
    SHA_HW_t H[22]; /* 5 state variables, 16 tmp values, 1 extra */
33
    sha1_compress_t compress;
34
    sha1_update_t update;
35
};
36
37
#if defined(_MSC_VER)
38
#include <stdlib.h>
39
#if defined(IS_LITTLE_ENDIAN)
40
#if (_MSC_VER >= 1300)
41
#pragma intrinsic(_byteswap_ulong)
42
#define SHA_HTONL(x) _byteswap_ulong(x)
43
#elif defined(NSS_X86_OR_X64)
44
#ifndef FORCEINLINE
45
#if (_MSC_VER >= 1200)
46
#define FORCEINLINE __forceinline
47
#else
48
#define FORCEINLINE __inline
49
#endif /* _MSC_VER */
50
#endif /* !defined FORCEINLINE */
51
#define FASTCALL __fastcall
52
53
static FORCEINLINE PRUint32 FASTCALL
54
swap4b(PRUint32 dwd)
55
{
56
    __asm {
57
      mov   eax,dwd
58
  bswap eax
59
    }
60
}
61
62
#define SHA_HTONL(x) swap4b(x)
63
#endif /* NSS_X86_OR_X64 */
64
#endif /* IS_LITTLE_ENDIAN */
65
66
#pragma intrinsic(_lrotr, _lrotl)
67
#define SHA_ROTL(x, n) _lrotl(x, n)
68
#define SHA_ROTL_IS_DEFINED 1
69
#endif /* _MSC_VER */
70
71
#if defined(__GNUC__)
72
/* __x86_64__  and __x86_64 are defined by GCC on x86_64 CPUs */
73
#if defined(SHA1_USING_64_BIT)
74
static __inline__ PRUint64
75
SHA_ROTL(PRUint64 x, PRUint32 n)
76
0
{
77
0
    PRUint32 t = (PRUint32)x;
78
0
    return ((t << n) | (t >> (32 - n)));
79
0
}
Unexecuted instantiation: camellia.c:SHA_ROTL
Unexecuted instantiation: sha_fast.c:SHA_ROTL
80
#else
81
static __inline__ PRUint32
82
SHA_ROTL(PRUint32 t, PRUint32 n)
83
{
84
    return ((t << n) | (t >> (32 - n)));
85
}
86
#endif
87
#define SHA_ROTL_IS_DEFINED 1
88
89
#if defined(NSS_X86_OR_X64)
90
static __inline__ PRUint32
91
swap4b(PRUint32 value)
92
0
{
93
0
    __asm__("bswap %0"
94
0
            : "+r"(value));
95
0
    return (value);
96
0
}
Unexecuted instantiation: camellia.c:swap4b
Unexecuted instantiation: sha_fast.c:swap4b
97
0
#define SHA_HTONL(x) swap4b(x)
98
99
#elif defined(__thumb2__) ||       \
100
    (!defined(__thumb__) &&        \
101
     (defined(__ARM_ARCH_6__) ||   \
102
      defined(__ARM_ARCH_6J__) ||  \
103
      defined(__ARM_ARCH_6K__) ||  \
104
      defined(__ARM_ARCH_6Z__) ||  \
105
      defined(__ARM_ARCH_6ZK__) || \
106
      defined(__ARM_ARCH_6T2__) || \
107
      defined(__ARM_ARCH_7__) ||   \
108
      defined(__ARM_ARCH_7A__) ||  \
109
      defined(__ARM_ARCH_7R__)))
110
#if defined(IS_LITTLE_ENDIAN)
111
static __inline__ PRUint32
112
swap4b(PRUint32 value)
113
{
114
    PRUint32 ret;
115
    __asm__("rev %0, %1"
116
            : "=r"(ret)
117
            : "r"(value));
118
    return ret;
119
}
120
#define SHA_HTONL(x) swap4b(x)
121
#endif
122
123
#endif /* x86 family */
124
125
#endif /* __GNUC__ */
126
127
#if !defined(SHA_ROTL_IS_DEFINED)
128
#define SHA_NEED_TMP_VARIABLE 1
129
#define SHA_ROTL(X, n) (tmp = (X), ((tmp) << (n)) | ((tmp) >> (32 - (n))))
130
#endif
131
132
#if !defined(SHA_HTONL)
133
#define SHA_MASK 0x00FF00FF
134
#if defined(IS_LITTLE_ENDIAN)
135
#undef SHA_NEED_TMP_VARIABLE
136
#define SHA_NEED_TMP_VARIABLE 1
137
#define SHA_HTONL(x) (tmp = (x), tmp = (tmp << 16) | (tmp >> 16), \
138
                      ((tmp & SHA_MASK) << 8) | ((tmp >> 8) & SHA_MASK))
139
#else
140
#define SHA_HTONL(x) (x)
141
#endif
142
#endif
143
144
#define SHA_BYTESWAP(x) x = SHA_HTONL(x)
145
146
0
#define SHA_STORE(n) ((PRUint32 *)hashout)[n] = SHA_HTONL(ctx->H[n])
147
#if defined(HAVE_UNALIGNED_ACCESS)
148
#define SHA_STORE_RESULT \
149
0
    SHA_STORE(0);        \
150
0
    SHA_STORE(1);        \
151
0
    SHA_STORE(2);        \
152
0
    SHA_STORE(3);        \
153
0
    SHA_STORE(4);
154
155
#elif defined(IS_LITTLE_ENDIAN) || defined(SHA1_USING_64_BIT)
156
#define SHA_STORE_RESULT                            \
157
    if (!((ptrdiff_t)hashout % sizeof(PRUint32))) { \
158
        SHA_STORE(0);                               \
159
        SHA_STORE(1);                               \
160
        SHA_STORE(2);                               \
161
        SHA_STORE(3);                               \
162
        SHA_STORE(4);                               \
163
    } else {                                        \
164
        PRUint32 tmpbuf[5];                         \
165
        tmpbuf[0] = SHA_HTONL(ctx->H[0]);           \
166
        tmpbuf[1] = SHA_HTONL(ctx->H[1]);           \
167
        tmpbuf[2] = SHA_HTONL(ctx->H[2]);           \
168
        tmpbuf[3] = SHA_HTONL(ctx->H[3]);           \
169
        tmpbuf[4] = SHA_HTONL(ctx->H[4]);           \
170
        memcpy(hashout, tmpbuf, SHA1_LENGTH);       \
171
    }
172
173
#else
174
#define SHA_STORE_RESULT                            \
175
    if (!((ptrdiff_t)hashout % sizeof(PRUint32))) { \
176
        SHA_STORE(0);                               \
177
        SHA_STORE(1);                               \
178
        SHA_STORE(2);                               \
179
        SHA_STORE(3);                               \
180
        SHA_STORE(4);                               \
181
    } else {                                        \
182
        memcpy(hashout, ctx->H, SHA1_LENGTH);       \
183
    }
184
#endif
185
186
#endif /* _SHA_FAST_H_ */