@@ -80,7 +80,19 @@ void blk_SHA1_Final(unsigned char hashout[20], blk_SHA_CTX *ctx)
80
80
((unsigned int * )hashout )[i ] = htonl (ctx -> H [i ]);
81
81
}
82
82
83
- #define SHA_ROT (X ,n ) (((X) << (n)) | ((X) >> (32-(n))))
83
+ #if defined(__i386__ ) || defined(__x86_64__ )
84
+
85
+ #define SHA_ASM (op , x , n ) ({ unsigned int __res; asm(op " %1,%0":"=r" (__res):"i" (n), "0" (x)); __res; })
86
+ #define SHA_ROL (x ,n ) SHA_ASM("rol", x, n)
87
+ #define SHA_ROR (x ,n ) SHA_ASM("ror", x, n)
88
+
89
+ #else
90
+
91
+ #define SHA_ROT (X ,n ) (((X) << (l)) | ((X) >> (r)))
92
+ #define SHA_ROL (X ,n ) SHA_ROT(X,n,32-(n))
93
+ #define SHA_ROR (X ,n ) SHA_ROT(X,32-(n),n)
94
+
95
+ #endif
84
96
85
97
static void blk_SHA1Block (blk_SHA_CTX * ctx , const unsigned int * data )
86
98
{
@@ -93,7 +105,7 @@ static void blk_SHA1Block(blk_SHA_CTX *ctx, const unsigned int *data)
93
105
94
106
/* Unroll it? */
95
107
for (t = 16 ; t <= 79 ; t ++ )
96
- W [t ] = SHA_ROT (W [t - 3 ] ^ W [t - 8 ] ^ W [t - 14 ] ^ W [t - 16 ], 1 );
108
+ W [t ] = SHA_ROL (W [t - 3 ] ^ W [t - 8 ] ^ W [t - 14 ] ^ W [t - 16 ], 1 );
97
109
98
110
A = ctx -> H [0 ];
99
111
B = ctx -> H [1 ];
@@ -102,35 +114,35 @@ static void blk_SHA1Block(blk_SHA_CTX *ctx, const unsigned int *data)
102
114
E = ctx -> H [4 ];
103
115
104
116
#define T_0_19 (t ) \
105
- TEMP = SHA_ROT (A,5) + (((C^D)&B)^D) + E + W[t] + 0x5a827999; \
106
- E = D; D = C; C = SHA_ROT (B, 30 ); B = A; A = TEMP;
117
+ TEMP = SHA_ROL (A,5) + (((C^D)&B)^D) + E + W[t] + 0x5a827999; \
118
+ E = D; D = C; C = SHA_ROR (B, 2 ); B = A; A = TEMP;
107
119
108
120
T_0_19 ( 0 ); T_0_19 ( 1 ); T_0_19 ( 2 ); T_0_19 ( 3 ); T_0_19 ( 4 );
109
121
T_0_19 ( 5 ); T_0_19 ( 6 ); T_0_19 ( 7 ); T_0_19 ( 8 ); T_0_19 ( 9 );
110
122
T_0_19 (10 ); T_0_19 (11 ); T_0_19 (12 ); T_0_19 (13 ); T_0_19 (14 );
111
123
T_0_19 (15 ); T_0_19 (16 ); T_0_19 (17 ); T_0_19 (18 ); T_0_19 (19 );
112
124
113
125
#define T_20_39 (t ) \
114
- TEMP = SHA_ROT (A,5) + (B^C^D) + E + W[t] + 0x6ed9eba1; \
115
- E = D; D = C; C = SHA_ROT (B, 30 ); B = A; A = TEMP;
126
+ TEMP = SHA_ROL (A,5) + (B^C^D) + E + W[t] + 0x6ed9eba1; \
127
+ E = D; D = C; C = SHA_ROR (B, 2 ); B = A; A = TEMP;
116
128
117
129
T_20_39 (20 ); T_20_39 (21 ); T_20_39 (22 ); T_20_39 (23 ); T_20_39 (24 );
118
130
T_20_39 (25 ); T_20_39 (26 ); T_20_39 (27 ); T_20_39 (28 ); T_20_39 (29 );
119
131
T_20_39 (30 ); T_20_39 (31 ); T_20_39 (32 ); T_20_39 (33 ); T_20_39 (34 );
120
132
T_20_39 (35 ); T_20_39 (36 ); T_20_39 (37 ); T_20_39 (38 ); T_20_39 (39 );
121
133
122
134
#define T_40_59 (t ) \
123
- TEMP = SHA_ROT (A,5) + ((B&C)|(D&(B|C))) + E + W[t] + 0x8f1bbcdc; \
124
- E = D; D = C; C = SHA_ROT (B, 30 ); B = A; A = TEMP;
135
+ TEMP = SHA_ROL (A,5) + ((B&C)|(D&(B|C))) + E + W[t] + 0x8f1bbcdc; \
136
+ E = D; D = C; C = SHA_ROR (B, 2 ); B = A; A = TEMP;
125
137
126
138
T_40_59 (40 ); T_40_59 (41 ); T_40_59 (42 ); T_40_59 (43 ); T_40_59 (44 );
127
139
T_40_59 (45 ); T_40_59 (46 ); T_40_59 (47 ); T_40_59 (48 ); T_40_59 (49 );
128
140
T_40_59 (50 ); T_40_59 (51 ); T_40_59 (52 ); T_40_59 (53 ); T_40_59 (54 );
129
141
T_40_59 (55 ); T_40_59 (56 ); T_40_59 (57 ); T_40_59 (58 ); T_40_59 (59 );
130
142
131
143
#define T_60_79 (t ) \
132
- TEMP = SHA_ROT (A,5) + (B^C^D) + E + W[t] + 0xca62c1d6; \
133
- E = D; D = C; C = SHA_ROT (B, 30 ); B = A; A = TEMP;
144
+ TEMP = SHA_ROL (A,5) + (B^C^D) + E + W[t] + 0xca62c1d6; \
145
+ E = D; D = C; C = SHA_ROR (B, 2 ); B = A; A = TEMP;
134
146
135
147
T_60_79 (60 ); T_60_79 (61 ); T_60_79 (62 ); T_60_79 (63 ); T_60_79 (64 );
136
148
T_60_79 (65 ); T_60_79 (66 ); T_60_79 (67 ); T_60_79 (68 ); T_60_79 (69 );
0 commit comments