@@ -135,20 +135,14 @@ int wc_Sha256Update(wc_Sha256* sha, const byte* in, word32 sz)
135135#ifdef WOLFSSL_DEVCRYPTO_HASH_KEEP
136136 /* keep full message to hash at end instead of incremental updates */
137137 if (sha -> len < sha -> used + sz ) {
138- if (sha -> msg == NULL ) {
139- sha -> msg = (byte * )XMALLOC (sha -> used + sz , sha -> heap ,
140- DYNAMIC_TYPE_TMP_BUFFER );
141- } else {
142- byte * pt = (byte * )XREALLOC (sha -> msg , sha -> used + sz , sha -> heap ,
143- DYNAMIC_TYPE_TMP_BUFFER );
144- if (pt == NULL ) {
145- return MEMORY_E ;
146- }
147- sha -> msg = pt ;
148- }
149- if (sha -> msg == NULL ) {
138+ byte * pt = (byte * )XREALLOC (sha -> msg , sha -> used + sz , sha -> heap ,
139+ DYNAMIC_TYPE_TMP_BUFFER );
140+ if (pt == NULL ) {
150141 return MEMORY_E ;
151142 }
143+
144+ sha -> msg = pt ;
145+
152146 sha -> len = sha -> used + sz ;
153147 }
154148 XMEMCPY (sha -> msg + sha -> used , in , sz );
@@ -180,6 +174,7 @@ int wc_Sha256Final(wc_Sha256* sha, byte* hash)
180174#endif
181175 ret = GetDigest (sha , CRYPTO_SHA2_256 , hash );
182176 if (ret != 0 ) {
177+ wc_Sha256Free (sha );
183178 return ret ;
184179 }
185180
@@ -190,6 +185,7 @@ int wc_Sha256Final(wc_Sha256* sha, byte* hash)
190185
191186int wc_Sha256GetHash (wc_Sha256 * sha , byte * hash )
192187{
188+
193189 if (sha == NULL || hash == NULL ) {
194190 return BAD_FUNC_ARG ;
195191 }
@@ -198,6 +194,11 @@ int wc_Sha256GetHash(wc_Sha256* sha, byte* hash)
198194 {
199195 int ret ;
200196 wc_Sha256 cpy ;
197+ XMEMSET (& cpy , 0 , sizeof (cpy )); /* ZII */
198+ /* mark as having no /dev/crypto session yet so the wc_Sha256Free()
199+ * in wc_Sha256Copy() does not close fd 0 (cfd == -1 is the
200+ * "no session" sentinel, matching wc_AesInit()) */
201+ cpy .ctx .cfd = -1 ;
201202 wc_Sha256Copy (sha , & cpy );
202203
203204 if ((ret = HashUpdate (& cpy , CRYPTO_SHA2_256 , cpy .msg , cpy .used )) == 0 ) {
@@ -219,10 +220,12 @@ int wc_Sha256GetHash(wc_Sha256* sha, byte* hash)
219220
220221int wc_Sha256Copy (wc_Sha256 * src , wc_Sha256 * dst )
221222{
223+
222224 if (src == NULL || dst == NULL ) {
223225 return BAD_FUNC_ARG ;
224226 }
225227
228+ wc_Sha256Free (dst );
226229 wc_InitSha256_ex (dst , src -> heap , 0 );
227230#ifdef WOLFSSL_DEVCRYPTO_HASH_KEEP
228231 dst -> len = src -> len ;
@@ -232,9 +235,15 @@ int wc_Sha256Copy(wc_Sha256* src, wc_Sha256* dst)
232235 return MEMORY_E ;
233236 }
234237 XMEMCPY (dst -> msg , src -> msg , src -> len );
235- #endif
236238
237239 return 0 ;
240+ #else
241+ (void )src ;
242+ (void )dst ;
243+
244+ WOLFSSL_MSG ("Compile with WOLFSSL_DEVCRYPTO_HASH_KEEP for this feature" );
245+ return NOT_COMPILED_IN ;
246+ #endif
238247}
239248
240249#endif /* !NO_SHA256 */
0 commit comments