diff options
author | Lukas Fleischer <calcurse@cryptocrack.de> | 2014-07-08 12:50:03 +0200 |
---|---|---|
committer | Lukas Fleischer <calcurse@cryptocrack.de> | 2014-07-08 12:54:03 +0200 |
commit | 9dc36589ae69f2938469b854b21ba1738469798b (patch) | |
tree | eb001207a38b90a11144273cc7bd734198c27d6c /src | |
parent | 0529b864b0b2ababd799ee18faf486dbcce68b97 (diff) | |
download | calcurse-9dc36589ae69f2938469b854b21ba1738469798b.tar.gz calcurse-9dc36589ae69f2938469b854b21ba1738469798b.zip |
Fix SHA1 calculation of long notes
sha1_update() modifies the input data, so we need to duplicate the input
before calculating the hash. Otherwise, input data longer than 64 bytes
will be garbled.
Reported-by: Hakan Jerning <jerning@home.se>
Signed-off-by: Lukas Fleischer <calcurse@cryptocrack.de>
Diffstat (limited to 'src')
-rw-r--r-- | src/sha1.c | 6 |
1 files changed, 5 insertions, 1 deletions
@@ -40,6 +40,7 @@ */ #include <stdio.h> +#include <stdlib.h> #include <string.h> #include "sha1.h" @@ -233,18 +234,21 @@ void sha1_final(sha1_ctx_t * ctx, uint8_t digest[SHA1_DIGESTLEN]) void sha1_digest(const char *data, char *buffer) { + char *buf = strdup(data); sha1_ctx_t ctx; uint8_t digest[SHA1_DIGESTLEN]; int i; sha1_init(&ctx); - sha1_update(&ctx, (const uint8_t *)data, strlen(data)); + sha1_update(&ctx, (const uint8_t *)buf, strlen(buf)); sha1_final(&ctx, (uint8_t *) digest); for (i = 0; i < SHA1_DIGESTLEN; i++) { snprintf(buffer, 3, "%02x", digest[i]); buffer += sizeof(char) * 2; } + + free(buf); } void sha1_stream(FILE * fp, char *buffer) |