From 9dc36589ae69f2938469b854b21ba1738469798b Mon Sep 17 00:00:00 2001
From: Lukas Fleischer <calcurse@cryptocrack.de>
Date: Tue, 8 Jul 2014 12:50:03 +0200
Subject: 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>
---
 src/sha1.c | 6 +++++-
 1 file changed, 5 insertions(+), 1 deletion(-)

(limited to 'src')

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)
-- 
cgit v1.2.3-70-g09d2