Support the SSL HMAC variant (untested).
authormdw <mdw>
Tue, 3 Apr 2001 19:35:45 +0000 (19:35 +0000)
committermdw <mdw>
Tue, 3 Apr 2001 19:35:45 +0000 (19:35 +0000)
hmac-def.h
hmac.h

index 19df631..95d7562 100644 (file)
@@ -1,6 +1,6 @@
 /* -*-c-*-
  *
- * $Id: hmac-def.h,v 1.5 2000/10/15 19:09:20 mdw Exp $
+ * $Id: hmac-def.h,v 1.6 2001/04/03 19:35:45 mdw Exp $
  *
  * Definitions for HMAC and NMAC
  *
@@ -30,6 +30,9 @@
 /*----- Revision history --------------------------------------------------* 
  *
  * $Log: hmac-def.h,v $
+ * Revision 1.6  2001/04/03 19:35:45  mdw
+ * Support the SSL HMAC variant (untested).
+ *
  * Revision 1.5  2000/10/15 19:09:20  mdw
  * Support HMAC mode for hash functions which need to store more state than
  * the hash output size.
@@ -161,6 +164,49 @@ void pre##_hmacinit(pre##_mackey *key, const void *k, size_t sz)   \
   BURN(ctx);                                                           \
 }                                                                      \
                                                                        \
+/* --- @pre_sslmacinit@ --- *                                          \
+ *                                                                     \
+ * Arguments:  @pre_mackey *key@ = pointer to MAC key object           \
+ *             @const void *k@ = pointer to key to use                 \
+ *             @size_t sz@ = size of key data                          \
+ *                                                                     \
+ * Returns:    ---                                                     \
+ *                                                                     \
+ * Use:                Initializes a MAC key for doing hasing using the SSL3   \
+ *             variant of HMAC.                                        \
+ */                                                                    \
+                                                                       \
+void pre##_sslmacinit(pre##_mackey *key, const void *k, size_t sz)     \
+{                                                                      \
+  int i;                                                               \
+  const octet *kbuf = k;                                               \
+  pre##_ctx ctx;                                                       \
+  octet buf[PRE##_HASHSZ];                                             \
+                                                                       \
+  if (sz > PRE##_BUFSZ)        {                                               \
+    pre##_init(&ctx);                                                  \
+    pre##_hash(&ctx, k, sz);                                           \
+    pre##_done(&ctx, buf);                                             \
+    kbuf = buf;                                                                \
+    sz = PRE##_HASHSZ;                                                 \
+  }                                                                    \
+                                                                       \
+  pre##_init(&ctx);                                                    \
+  memcpy(ctx.buf, kbuf, sz);                                           \
+  memset(ctx.buf + sz, 0x5c, PRE##_BUFSZ - sz);                                \
+  pre##_compress(&ctx, ctx.buf);                                       \
+  pre##_state(&ctx, key->ochain);                                      \
+                                                                       \
+  pre##_init(&ctx);                                                    \
+  memcpy(ctx.buf, kbuf, sz);                                           \
+  memset(ctx.buf + sz, 0x36, PRE##_BUFSZ - sz);                                \
+  pre##_compress(&ctx, ctx.buf);                                       \
+  pre##_state(&ctx, key->ichain);                                      \
+                                                                       \
+  key->ocount = key->icount = PRE##_BUFSZ;                             \
+  BURN(ctx);                                                           \
+}                                                                      \
+                                                                       \
 /* --- @pre_macinit@ --- *                                             \
  *                                                                     \
  * Arguments:  @pre_macctx *ctx@ = pointer to MAC context block        \
@@ -245,6 +291,14 @@ static gmac *gkey(const void *k, size_t sz)                                \
   return (&gk->m);                                                     \
 }                                                                      \
                                                                        \
+static gmac *gsslkey(const void *k, size_t sz)                         \
+{                                                                      \
+  gkctx *gk = S_CREATE(gkctx);                                         \
+  gk->m.ops = &gkops;                                                  \
+  pre##_sslmacinit(&gk->k, k, sz);                                     \
+  return (&gk->m);                                                     \
+}                                                                      \
+                                                                       \
 static void ghhash(ghash *h, const void *p, size_t sz)                 \
 {                                                                      \
   gctx *g = (gctx *)h;                                                 \
@@ -290,6 +344,8 @@ static ghash *ghinit(void)                                          \
                                                                        \
 const gcmac pre##_hmac =                                               \
   { #pre "-hmac", PRE##_HASHSZ, pre##_mackeysz, gkey };                        \
+const gcmac pre##_sslmac =                                             \
+  { #pre "-sslmac", PRE##_HASHSZ, pre##_mackeysz, gsslkey };           \
 static const gmac_ops gkops = { &pre##_hmac, gkinit, gkdestroy };      \
 static const gchash gch = { #pre "-hmac", PRE##_HASHSZ, ghinit };      \
 static const ghash_ops gops =                                          \
diff --git a/hmac.h b/hmac.h
index b489e54..097371a 100644 (file)
--- a/hmac.h
+++ b/hmac.h
@@ -1,6 +1,6 @@
 /* -*-c-*-
  *
- * $Id: hmac.h,v 1.4 2000/10/15 19:09:20 mdw Exp $
+ * $Id: hmac.h,v 1.5 2001/04/03 19:35:45 mdw Exp $
  *
  * Generic code for HMAC and NMAC
  *
@@ -30,6 +30,9 @@
 /*----- Revision history --------------------------------------------------* 
  *
  * $Log: hmac.h,v $
+ * Revision 1.5  2001/04/03 19:35:45  mdw
+ * Support the SSL HMAC variant (untested).
+ *
  * Revision 1.4  2000/10/15 19:09:20  mdw
  * Support HMAC mode for hash functions which need to store more state than
  * the hash output size.
@@ -138,6 +141,21 @@ extern void pre##_nmacinit(pre##_mackey */*key*/,                  \
 extern void pre##_hmacinit(pre##_mackey */*key*/,                      \
                           const void */*k*/, size_t /*sz*/);           \
                                                                        \
+/* --- @pre_sslmacinit@ --- *                                          \
+ *                                                                     \
+ * Arguments:  @pre_mackey *key@ = pointer to MAC key object           \
+ *             @const void *k@ = pointer to key to use                 \
+ *             @size_t sz@ = size of key data                          \
+ *                                                                     \
+ * Returns:    ---                                                     \
+ *                                                                     \
+ * Use:                Initializes a MAC key for doing hasing using the SSL3   \
+ *             variant of HMAC.                                        \
+ */                                                                    \
+                                                                       \
+extern void pre##_sslmacinit(pre##_mackey */*key*/,                    \
+                            const void */*k*/, size_t /*sz*/);         \
+                                                                       \
 /* --- @pre_macinit@ --- *                                             \
  *                                                                     \
  * Arguments:  @pre_macctx *ctx@ = pointer to MAC context block        \