/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_ */ |