44
55/**
66 @file sha1.c
7- LTC_SHA1 code by Tom St Denis
7+ SHA1 code by Tom St Denis
88*/
99
1010
1111#ifdef LTC_SHA1
1212
13+ /* While implementing the SMALL STACK option in https://github.com/libtom/libtomcrypt/pull/709
14+ * we came to the conclusion that SHA1 profits from the SMALL STACK option when the SMALL CODE
15+ * option is enabled, so let's do that.
16+ */
17+ #if defined(LTC_SMALL_STACK ) || defined(LTC_SMALL_CODE )
18+ #define LTC_SMALL_STACK_SHA1
19+ #endif
20+
1321const struct ltc_hash_descriptor sha1_desc =
1422{
1523 "sha1" ,
@@ -39,7 +47,12 @@ static int ss_sha1_compress(hash_state *md, const unsigned char *buf)
3947static int s_sha1_compress (hash_state * md , const unsigned char * buf )
4048#endif
4149{
42- ulong32 a ,b ,c ,d ,e ,W [80 ],i ;
50+ ulong32 a ,b ,c ,d ,e ,i ;
51+ #ifdef LTC_SMALL_STACK_SHA1
52+ ulong32 W [16 ];
53+ #else
54+ ulong32 W [80 ];
55+ #endif
4356#ifdef LTC_SMALL_CODE
4457 ulong32 t ;
4558#endif
@@ -56,78 +69,95 @@ static int s_sha1_compress(hash_state *md, const unsigned char *buf)
5669 d = md -> sha1 .state [3 ];
5770 e = md -> sha1 .state [4 ];
5871
72+ #ifdef LTC_SMALL_STACK_SHA1
73+ #define Wi (i ) do { W[(i) % 16] = ROL(W[((i) - 3) % 16] ^ W[((i) - 8) % 16] ^ W[((i) - 14) % 16] ^ W[((i) - 16) % 16], 1); } while(0)
74+ #define Windex (i ) ((i) % 16)
75+ #else
76+ #define Wi (i ) do { } while(0)
77+ #define Windex (i ) (i)
5978 /* expand it */
6079 for (i = 16 ; i < 80 ; i ++ ) {
6180 W [i ] = ROL (W [i - 3 ] ^ W [i - 8 ] ^ W [i - 14 ] ^ W [i - 16 ], 1 );
6281 }
82+ #endif
6383
6484 /* compress */
6585 /* round one */
66- #define FF0 (a ,b ,c ,d ,e ,i ) e = (ROLc(a, 5) + F0(b,c,d) + e + W[i ] + 0x5a827999UL); b = ROLc(b, 30);
67- #define FF1 (a ,b ,c ,d ,e ,i ) e = (ROLc(a, 5) + F1(b,c,d) + e + W[i ] + 0x6ed9eba1UL); b = ROLc(b, 30);
68- #define FF2 (a ,b ,c ,d ,e ,i ) e = (ROLc(a, 5) + F2(b,c,d) + e + W[i ] + 0x8f1bbcdcUL); b = ROLc(b, 30);
69- #define FF3 (a ,b ,c ,d ,e ,i ) e = (ROLc(a, 5) + F3(b,c,d) + e + W[i ] + 0xca62c1d6UL); b = ROLc(b, 30);
86+ #define FF0 (a ,b ,c ,d ,e ,i ) e = (ROLc(a, 5) + F0(b,c,d) + e + W[Windex(i) ] + 0x5a827999UL); b = ROLc(b, 30);
87+ #define FF1 (a ,b ,c ,d ,e ,i ) e = (ROLc(a, 5) + F1(b,c,d) + e + W[Windex(i) ] + 0x6ed9eba1UL); b = ROLc(b, 30);
88+ #define FF2 (a ,b ,c ,d ,e ,i ) e = (ROLc(a, 5) + F2(b,c,d) + e + W[Windex(i) ] + 0x8f1bbcdcUL); b = ROLc(b, 30);
89+ #define FF3 (a ,b ,c ,d ,e ,i ) e = (ROLc(a, 5) + F3(b,c,d) + e + W[Windex(i) ] + 0xca62c1d6UL); b = ROLc(b, 30);
7090
7191#ifdef LTC_SMALL_CODE
7292
73- for (i = 0 ; i < 20 ; ) {
93+ for (i = 0 ; i < 16 ; ) {
7494 FF0 (a ,b ,c ,d ,e ,i ++ ); t = e ; e = d ; d = c ; c = b ; b = a ; a = t ;
7595 }
96+ for (; i < 20 ; ) {
97+ Wi (i ); FF0 (a ,b ,c ,d ,e ,i ++ ); t = e ; e = d ; d = c ; c = b ; b = a ; a = t ;
98+ }
7699
77100 for (; i < 40 ; ) {
78- FF1 (a ,b ,c ,d ,e ,i ++ ); t = e ; e = d ; d = c ; c = b ; b = a ; a = t ;
101+ Wi ( i ); FF1 (a ,b ,c ,d ,e ,i ++ ); t = e ; e = d ; d = c ; c = b ; b = a ; a = t ;
79102 }
80103
81104 for (; i < 60 ; ) {
82- FF2 (a ,b ,c ,d ,e ,i ++ ); t = e ; e = d ; d = c ; c = b ; b = a ; a = t ;
105+ Wi ( i ); FF2 (a ,b ,c ,d ,e ,i ++ ); t = e ; e = d ; d = c ; c = b ; b = a ; a = t ;
83106 }
84107
85108 for (; i < 80 ; ) {
86- FF3 (a ,b ,c ,d ,e ,i ++ ); t = e ; e = d ; d = c ; c = b ; b = a ; a = t ;
109+ Wi ( i ); FF3 (a ,b ,c ,d ,e ,i ++ ); t = e ; e = d ; d = c ; c = b ; b = a ; a = t ;
87110 }
88111
89112#else
90113
91- for (i = 0 ; i < 20 ; ) {
114+ for (i = 0 ; i < 15 ; ) {
92115 FF0 (a ,b ,c ,d ,e ,i ++ );
93116 FF0 (e ,a ,b ,c ,d ,i ++ );
94117 FF0 (d ,e ,a ,b ,c ,i ++ );
95118 FF0 (c ,d ,e ,a ,b ,i ++ );
96119 FF0 (b ,c ,d ,e ,a ,i ++ );
97120 }
121+ FF0 (a ,b ,c ,d ,e ,i ++ );
122+ Wi (i ); FF0 (e ,a ,b ,c ,d ,i ++ );
123+ Wi (i ); FF0 (d ,e ,a ,b ,c ,i ++ );
124+ Wi (i ); FF0 (c ,d ,e ,a ,b ,i ++ );
125+ Wi (i ); FF0 (b ,c ,d ,e ,a ,i ++ );
98126
99127 /* round two */
100128 for (; i < 40 ; ) {
101- FF1 (a ,b ,c ,d ,e ,i ++ );
102- FF1 (e ,a ,b ,c ,d ,i ++ );
103- FF1 (d ,e ,a ,b ,c ,i ++ );
104- FF1 (c ,d ,e ,a ,b ,i ++ );
105- FF1 (b ,c ,d ,e ,a ,i ++ );
129+ Wi ( i ); FF1 (a ,b ,c ,d ,e ,i ++ );
130+ Wi ( i ); FF1 (e ,a ,b ,c ,d ,i ++ );
131+ Wi ( i ); FF1 (d ,e ,a ,b ,c ,i ++ );
132+ Wi ( i ); FF1 (c ,d ,e ,a ,b ,i ++ );
133+ Wi ( i ); FF1 (b ,c ,d ,e ,a ,i ++ );
106134 }
107135
108136 /* round three */
109137 for (; i < 60 ; ) {
110- FF2 (a ,b ,c ,d ,e ,i ++ );
111- FF2 (e ,a ,b ,c ,d ,i ++ );
112- FF2 (d ,e ,a ,b ,c ,i ++ );
113- FF2 (c ,d ,e ,a ,b ,i ++ );
114- FF2 (b ,c ,d ,e ,a ,i ++ );
138+ Wi ( i ); FF2 (a ,b ,c ,d ,e ,i ++ );
139+ Wi ( i ); FF2 (e ,a ,b ,c ,d ,i ++ );
140+ Wi ( i ); FF2 (d ,e ,a ,b ,c ,i ++ );
141+ Wi ( i ); FF2 (c ,d ,e ,a ,b ,i ++ );
142+ Wi ( i ); FF2 (b ,c ,d ,e ,a ,i ++ );
115143 }
116144
117145 /* round four */
118146 for (; i < 80 ; ) {
119- FF3 (a ,b ,c ,d ,e ,i ++ );
120- FF3 (e ,a ,b ,c ,d ,i ++ );
121- FF3 (d ,e ,a ,b ,c ,i ++ );
122- FF3 (c ,d ,e ,a ,b ,i ++ );
123- FF3 (b ,c ,d ,e ,a ,i ++ );
147+ Wi ( i ); FF3 (a ,b ,c ,d ,e ,i ++ );
148+ Wi ( i ); FF3 (e ,a ,b ,c ,d ,i ++ );
149+ Wi ( i ); FF3 (d ,e ,a ,b ,c ,i ++ );
150+ Wi ( i ); FF3 (c ,d ,e ,a ,b ,i ++ );
151+ Wi ( i ); FF3 (b ,c ,d ,e ,a ,i ++ );
124152 }
125153#endif
126154
127155 #undef FF0
128156 #undef FF1
129157 #undef FF2
130158 #undef FF3
159+ #undef Wi
160+ #undef Windex
131161
132162 /* store */
133163 md -> sha1 .state [0 ] = md -> sha1 .state [0 ] + a ;
0 commit comments