Skip to content
Snippets Groups Projects
Commit 215b01bb authored by Bartlomiej Sieka's avatar Bartlomiej Sieka Committed by Wolfgang Denk
Browse files

Add support for calculating hashes with watchdog triggering


Implement watchodg-aware variants of hash calculation functions:
- crc32_wd()
- md5_wd()
- sha1_csum_wd()
The above functions calculate the hash of the input buffer in chunks,
triggering the watchdog after processing each chunk. The chunk size
is given as a function call parameter.

Signed-off-by: default avatarBartlomiej Sieka <tur@semihalf.com>
parent 8875e3ab
No related branches found
No related tags found
No related merge requests found
...@@ -605,6 +605,7 @@ int vsprintf(char *buf, const char *fmt, va_list args); ...@@ -605,6 +605,7 @@ int vsprintf(char *buf, const char *fmt, va_list args);
/* lib_generic/crc32.c */ /* lib_generic/crc32.c */
uint32_t crc32 (uint32_t, const unsigned char *, uint); uint32_t crc32 (uint32_t, const unsigned char *, uint);
uint32_t crc32_wd (uint32_t, const unsigned char *, uint, uint);
uint32_t crc32_no_comp (uint32_t, const unsigned char *, uint); uint32_t crc32_no_comp (uint32_t, const unsigned char *, uint);
/* common/console.c */ /* common/console.c */
......
...@@ -79,6 +79,17 @@ void sha1_finish( sha1_context *ctx, unsigned char output[20] ); ...@@ -79,6 +79,17 @@ void sha1_finish( sha1_context *ctx, unsigned char output[20] );
void sha1_csum( unsigned char *input, int ilen, void sha1_csum( unsigned char *input, int ilen,
unsigned char output[20] ); unsigned char output[20] );
/**
* \brief Output = SHA-1( input buffer ), with watchdog triggering
*
* \param input buffer holding the data
* \param ilen length of the input data
* \param output SHA-1 checksum result
* \param chunk_sz watchdog triggering period (in bytes of input processed)
*/
void sha1_csum_wd (unsigned char *input, int ilen,
unsigned char output[20], unsigned int chunk_sz);
/** /**
* \brief Output = SHA-1( file contents ) * \brief Output = SHA-1( file contents )
* *
......
...@@ -20,4 +20,12 @@ struct MD5Context { ...@@ -20,4 +20,12 @@ struct MD5Context {
*/ */
void md5 (unsigned char *input, int len, unsigned char output[16]); void md5 (unsigned char *input, int len, unsigned char output[16]);
/*
* Calculate and store in 'output' the MD5 digest of 'len' bytes at 'input'.
* 'output' must have enough space to hold 16 bytes. If 'chunk' Trigger the
* watchdog every 'chunk_sz' bytes of input processed.
*/
void md5_wd (unsigned char *input, int len, unsigned char output[16],
unsigned int chunk_sz);
#endif /* _MD5_H */ #endif /* _MD5_H */
...@@ -198,3 +198,30 @@ uint32_t ZEXPORT crc32_no_comp(uint32_t crc, const Bytef *buf, uInt len) ...@@ -198,3 +198,30 @@ uint32_t ZEXPORT crc32_no_comp(uint32_t crc, const Bytef *buf, uInt len)
} }
#endif #endif
/*
* Calculate the crc32 checksum triggering the watchdog every 'chunk_sz' bytes
* of input.
*/
ulong crc32_wd (ulong crc, const unsigned char *buf, uint len, uint chunk_sz)
{
#if defined(CONFIG_HW_WATCHDOG) || defined(CONFIG_WATCHDOG)
const unsigned char *end, *curr;
int chunk;
curr = buf;
end = buf + len;
while (curr < end) {
chunk = end - curr;
if (chunk > chunk_sz)
chunk = chunk_sz;
crc = crc32 (crc, curr, chunk);
curr += chunk;
WATCHDOG_RESET ();
}
#else
crc = crc32 (crc, buf, len);
#endif
return crc;
}
...@@ -272,3 +272,39 @@ md5 (unsigned char *input, int len, unsigned char output[16]) ...@@ -272,3 +272,39 @@ md5 (unsigned char *input, int len, unsigned char output[16])
MD5Update(&context, input, len); MD5Update(&context, input, len);
MD5Final(output, &context); MD5Final(output, &context);
} }
/*
* Calculate and store in 'output' the MD5 digest of 'len' bytes at 'input'.
* 'output' must have enough space to hold 16 bytes. If 'chunk' Trigger the
* watchdog every 'chunk_sz' bytes of input processed.
*/
void
md5_wd (unsigned char *input, int len, unsigned char output[16],
unsigned int chunk_sz)
{
struct MD5Context context;
#if defined(CONFIG_HW_WATCHDOG) || defined(CONFIG_WATCHDOG)
unsigned char *end, *curr;
int chunk;
#endif
MD5Init(&context);
#if defined(CONFIG_HW_WATCHDOG) || defined(CONFIG_WATCHDOG)
curr = input;
end = input + len;
while (curr < end) {
chunk = end - curr;
if (chunk > chunk_sz)
chunk = chunk_sz;
MD5Update(&context, curr, chunk);
curr += chunk;
WATCHDOG_RESET ();
}
#else
MD5Update(&context, input, len);
#endif
MD5Final(output, &context);
}
...@@ -308,6 +308,39 @@ void sha1_csum (unsigned char *input, int ilen, unsigned char output[20]) ...@@ -308,6 +308,39 @@ void sha1_csum (unsigned char *input, int ilen, unsigned char output[20])
sha1_finish (&ctx, output); sha1_finish (&ctx, output);
} }
/*
* Output = SHA-1( input buffer ). Trigger the watchdog every 'chunk_sz'
* bytes of input processed.
*/
void sha1_csum_wd (unsigned char *input, int ilen, unsigned char output[20],
unsigned int chunk_sz)
{
sha1_context ctx;
#if defined(CONFIG_HW_WATCHDOG) || defined(CONFIG_WATCHDOG)
unsigned char *end, *curr;
int chunk;
#endif
sha1_starts (&ctx);
#if defined(CONFIG_HW_WATCHDOG) || defined(CONFIG_WATCHDOG)
curr = input;
end = input + ilen;
while (curr < end) {
chunk = end - curr;
if (chunk > chunk_sz)
chunk = chunk_sz;
sha1_update (&ctx, curr, chunk);
curr += chunk;
WATCHDOG_RESET ();
}
#else
sha1_update (&ctx, input, ilen);
#endif
sha1_finish (&ctx, output);
}
/* /*
* Output = HMAC-SHA-1( input buffer, hmac key ) * Output = HMAC-SHA-1( input buffer, hmac key )
*/ */
......
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment