@@ -79,7 +79,7 @@ static const uint32_t K[64] = {
7979 0x90befffaUL , 0xa4506cebUL , 0xbef9a3f7UL , 0xc67178f2UL
8080};
8181
82- static void esp_sha256_transform (esp_sha256_t * ctx , uint8_t * buf )
82+ static void esp_sha256_transform (esp_sha256_t * ctx , const uint8_t * buf )
8383{
8484 uint32_t S [8 ], W [64 ], t0 , t1 ;
8585 uint32_t t ;
@@ -108,8 +108,8 @@ int esp_sha256_init(esp_sha256_t *ctx)
108108{
109109 util_assert (ctx );
110110
111- ctx -> curlen = 0 ;
112- ctx -> length = 0 ;
111+ ctx -> total [ 0 ] = 0 ;
112+ ctx -> total [ 1 ] = 0 ;
113113
114114 ctx -> state [0 ] = 0x6A09E667UL ;
115115 ctx -> state [1 ] = 0xBB67AE85UL ;
@@ -127,8 +127,8 @@ int esp_sha224_init(esp_sha224_t *ctx)
127127{
128128 util_assert (ctx );
129129
130- ctx -> curlen = 0 ;
131- ctx -> length = 0 ;
130+ ctx -> total [ 0 ] = 0 ;
131+ ctx -> total [ 1 ] = 0 ;
132132
133133 ctx -> state [0 ] = 0xC1059ED8 ;
134134 ctx -> state [1 ] = 0x367CD507 ;
@@ -144,39 +144,43 @@ int esp_sha224_init(esp_sha224_t *ctx)
144144
145145int esp_sha256_update (esp_sha256_t * ctx , const void * src , size_t size )
146146{
147- const uint8_t * in = (const uint8_t * )src ;
148- uint32_t n ;
147+ size_t fill ;
148+ uint32_t left ;
149+ const uint8_t * input = (const uint8_t * )src ;
149150
150151 util_assert (ctx );
151152 util_assert (src );
152153 util_assert (size );
153154
154- if ( ctx -> curlen >= sizeof ( ctx -> buf ))
155- return -1 ;
156-
157- while ( size > 0 ) {
158- if ( ctx -> curlen == 0 && size >= 64 ) {
159- esp_sha256_transform ( ctx , ( uint8_t * ) in );
160-
161- ctx -> length += 64 * 8 ;
162- in += 64 ;
163- size -= 64 ;
164- } else {
165- n = MIN ( size , ( 64 - ctx -> curlen ));
166- memcpy (ctx -> buf + ctx -> curlen , in , n );
167- ctx -> curlen += n ;
168- in += n ;
169- size -= n ;
170-
171- if ( ctx -> curlen == 64 ) {
172- esp_sha256_transform ( ctx , ctx -> buf );
173-
174- ctx -> length += 8 * 64 ;
175- ctx -> curlen = 0 ;
176- }
177- }
155+ left = ctx -> total [ 0 ] & 0x3F ;
156+ fill = 64 - left ;
157+
158+ ctx -> total [ 0 ] += size ;
159+ ctx -> total [ 0 ] &= 0xFFFFFFFF ;
160+
161+ if ( ctx -> total [ 0 ] < size )
162+ ctx -> total [ 1 ] ++ ;
163+
164+ if ( left && size >= fill ) {
165+ memcpy ( ctx -> buffer + left , input , fill );
166+
167+ esp_sha256_transform (ctx , ctx -> buffer );
168+
169+ input += fill ;
170+ size -= fill ;
171+ left = 0 ;
172+ }
173+
174+ while ( size >= 64 ) {
175+ esp_sha256_transform ( ctx , input ) ;
176+
177+ input += 64 ;
178+ size -= 64 ;
178179 }
179180
181+ if (size > 0 )
182+ memcpy (ctx -> buffer + left , input , size );
183+
180184 return 0 ;
181185}
182186
@@ -191,37 +195,42 @@ int esp_sha224_update(esp_sha224_t *ctx, const void *src, size_t size)
191195
192196int esp_sha224_finish (esp_sha224_t * ctx , void * dest )
193197{
194- int i ;
198+ uint32_t used ;
199+ uint32_t high , low ;
195200 uint8_t * out = (uint8_t * )dest ;
196201
197202 util_assert (ctx );
198203 util_assert (dest );
199204
200- if (ctx -> curlen >= sizeof (ctx -> buf ))
201- return -1 ;
202-
203- ctx -> length += ctx -> curlen * 8 ;
205+ used = ctx -> total [0 ] & 0x3F ;
204206
205- ctx -> buf [ ctx -> curlen ++ ] = 0x80 ;
207+ ctx -> buffer [ used ++ ] = 0x80 ;
206208
207- if (ctx -> curlen > 56 ) {
208- while (ctx -> curlen < 64 )
209- ctx -> buf [ ctx -> curlen ++ ] = 0 ;
210-
211- esp_sha256_transform (ctx , ctx -> buf );
212- ctx -> curlen = 0 ;
209+ if (used <= 56 ) {
210+ memset (ctx -> buffer + used , 0 , 56 - used );
211+ } else {
212+ memset ( ctx -> buffer + used , 0 , 64 - used );
213+ esp_sha256_transform (ctx , ctx -> buffer );
214+ memset ( ctx -> buffer , 0 , 56 ) ;
213215 }
214216
215- while (ctx -> curlen < 56 )
216- ctx -> buf [ ctx -> curlen ++ ] = 0 ;
217+ high = (ctx -> total [ 0 ] >> 29 ) | ( ctx -> total [ 1 ] << 3 );
218+ low = ( ctx -> total [ 0 ] << 3 ) ;
217219
218- ESP_PUT_BE64 (ctx -> buf + 56 , ctx -> length );
219- esp_sha256_transform (ctx , ctx -> buf );
220+ ESP_PUT_BE32 (ctx -> buffer + 56 , high );
221+ ESP_PUT_BE32 (ctx -> buffer + 60 , low );
220222
221- for (i = 0 ; i < 7 ; i ++ )
222- ESP_PUT_BE32 (out + (4 * i ), ctx -> state [i ]);
223+ esp_sha256_transform (ctx , ctx -> buffer );
223224
224- return 0 ;
225+ ESP_PUT_BE32 (out + 0 , ctx -> state [0 ]);
226+ ESP_PUT_BE32 (out + 4 , ctx -> state [1 ]);
227+ ESP_PUT_BE32 (out + 8 , ctx -> state [2 ]);
228+ ESP_PUT_BE32 (out + 12 , ctx -> state [3 ]);
229+ ESP_PUT_BE32 (out + 16 , ctx -> state [4 ]);
230+ ESP_PUT_BE32 (out + 20 , ctx -> state [5 ]);
231+ ESP_PUT_BE32 (out + 24 , ctx -> state [6 ]);
232+
233+ return ( 0 );
225234}
226235
227236int esp_sha256_finish (esp_sha256_t * ctx , void * dest )
0 commit comments