3132258ee40339712f65e3bab9b3f76fc02b6adb
chinhli
  Sun Dec 1 23:39:04 2013 -0800
created to have hmacSha1() and hmacMd5() functions in kent/src/lib tocalculate openssl keyed-hash message authentication code (HMAC)

diff --git src/lib/hmac.c src/lib/hmac.c
new file mode 100644
index 0000000..ab0b3ad
--- /dev/null
+++ src/lib/hmac.c
@@ -0,0 +1,58 @@
+/* Calculate an openssl keyed-hash message authentication code (HMAC) */
+// You may use other openssl hash engines. e.g EVP_md5(), EVP_sha224,
+// EVP_sha512, etc
+// Be careful of the length of string with the choosen hash engine.
+// SHA1 needed 20 characters, MD5 needed 16 characters.
+// Change the length accordingly with your choosen hash engine
+
+#ifdef USE_SSL 
+#include "openssl/hmac.h"
+#include "openssl/evp.h"
+#include "common.h"
+
+char *hmacSha1(char *key, char *data)
+/* Calculate a openssl SHA1 keyed-hash message authentication code (HMAC) */
+{
+unsigned char* digest;
+digest=HMAC(EVP_sha1(), key, strlen(key), (unsigned char*)data, strlen(data), NULL, NULL);
+char hmacStr[40];
+int i;
+for(i = 0; i < 20; i++)
+    sprintf(&hmacStr[i*2], "%02x", (unsigned int)digest[i]);
+return cloneString(hmacStr);
+}
+
+char *hmacMd5(char *key, char *data)
+/* Calculate a openssl MD5 keyed-hash message authentication code (HMAC) */
+{
+unsigned char* digest;
+digest=HMAC(EVP_md5(), key, strlen(key), (unsigned char*)data, strlen(data), NULL, NULL);
+//printf("Raw mdr digest: %s\n", digest);
+char hmacStr[32];
+int i;
+for(i = 0; i < 16; i++)
+    sprintf(&hmacStr[i*2], "%02x", (unsigned int)digest[i]);
+return cloneString(hmacStr);
+}
+
+#else // --------- no USE_SSL ==> errAbort with message that openssl is required --------------
+
+#include "common.h"
+#include "errabort.h"
+#define NEED_OPENSSL "kent/src must be recompiled with openssl libs and USE_SSL=1 in order for this to work."
+
+char *hmacSha1(char *key, char *data)
+/* This is just a warning that appears in the absence of USE_SSL. Real
+ * implementation is above! */
+{
+errAbort(NEED_OPENSSL);
+}
+
+char *hmacMd5(char *key, char *data)
+/* This is just a warning that appears in the absence of USE_SSL. Real
+ * implementation is above! */
+{
+errAbort(NEED_OPENSSL);
+}
+
+#endif