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