summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorLukas Fleischer <calcurse@cryptocrack.de>2014-07-08 12:50:03 +0200
committerLukas Fleischer <calcurse@cryptocrack.de>2014-07-08 12:54:03 +0200
commit9dc36589ae69f2938469b854b21ba1738469798b (patch)
treeeb001207a38b90a11144273cc7bd734198c27d6c
parent0529b864b0b2ababd799ee18faf486dbcce68b97 (diff)
downloadcalcurse-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>
-rw-r--r--src/sha1.c6
1 files changed, 5 insertions, 1 deletions
diff --git a/src/sha1.c b/src/sha1.c
index d32c241..ab3380f 100644
--- a/src/sha1.c
+++ b/src/sha1.c
@@ -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)