Implement hmac-sha1-96. It's RECOMMENDED in the current transport draft,
authorben <ben@cda61777-01e9-0310-a592-d414129be87e>
Sat, 10 Sep 2005 16:19:53 +0000 (16:19 +0000)
committerben <ben@cda61777-01e9-0310-a592-d414129be87e>
Sat, 10 Sep 2005 16:19:53 +0000 (16:19 +0000)
and we don't have any strong reason not to implement it, for all that it's
rather pointless.

git-svn-id: svn://svn.tartarus.org/sgt/putty@6284 cda61777-01e9-0310-a592-d414129be87e

ssh.c
ssh.h
sshsha.c

diff --git a/ssh.c b/ssh.c
index 75610c6..d1b7acc 100644 (file)
--- a/ssh.c
+++ b/ssh.c
@@ -462,10 +462,10 @@ static void do_ssh2_authconn(Ssh ssh, unsigned char *in, int inlen,
 const static struct ssh_signkey *hostkey_algs[] = { &ssh_rsa, &ssh_dss };
 
 const static struct ssh_mac *macs[] = {
-    &ssh_hmac_sha1, &ssh_hmac_md5
+    &ssh_hmac_sha1, &ssh_hmac_sha1_96, &ssh_hmac_md5
 };
 const static struct ssh_mac *buggymacs[] = {
-    &ssh_hmac_sha1_buggy, &ssh_hmac_md5
+    &ssh_hmac_sha1_buggy, &ssh_hmac_sha1_96_buggy, &ssh_hmac_md5
 };
 
 static void *ssh_comp_none_init(void)
diff --git a/ssh.h b/ssh.h
index 43060c9..8357f0c 100644 (file)
--- a/ssh.h
+++ b/ssh.h
@@ -269,6 +269,8 @@ extern const struct ssh_signkey ssh_rsa;
 extern const struct ssh_mac ssh_hmac_md5;
 extern const struct ssh_mac ssh_hmac_sha1;
 extern const struct ssh_mac ssh_hmac_sha1_buggy;
+extern const struct ssh_mac ssh_hmac_sha1_96;
+extern const struct ssh_mac ssh_hmac_sha1_96_buggy;
 
 
 /*
index 29908b6..b3860b6 100644 (file)
--- a/sshsha.c
+++ b/sshsha.c
@@ -301,6 +301,22 @@ static int sha1_verify(void *handle, unsigned char *blk, int len,
     return !memcmp(correct, blk + len, 20);
 }
 
+static void sha1_96_generate(void *handle, unsigned char *blk, int len,
+                            unsigned long seq)
+{
+    unsigned char full[20];
+    sha1_do_hmac(handle, blk, len, seq, full);
+    memcpy(blk + len, full, 12);
+}
+
+static int sha1_96_verify(void *handle, unsigned char *blk, int len,
+                      unsigned long seq)
+{
+    unsigned char correct[20];
+    sha1_do_hmac(handle, blk, len, seq, correct);
+    return !memcmp(correct, blk + len, 12);
+}
+
 void hmac_sha1_simple(void *key, int keylen, void *data, int datalen,
                      unsigned char *output) {
     SHA_State states[2];
@@ -322,6 +338,14 @@ const struct ssh_mac ssh_hmac_sha1 = {
     "HMAC-SHA1"
 };
 
+const struct ssh_mac ssh_hmac_sha1_96 = {
+    sha1_make_context, sha1_free_context, sha1_key,
+    sha1_96_generate, sha1_96_verify,
+    "hmac-sha1-96",
+    12,
+    "HMAC-SHA1-96"
+};
+
 const struct ssh_mac ssh_hmac_sha1_buggy = {
     sha1_make_context, sha1_free_context, sha1_key_buggy,
     sha1_generate, sha1_verify,
@@ -329,3 +353,11 @@ const struct ssh_mac ssh_hmac_sha1_buggy = {
     20,
     "bug-compatible HMAC-SHA1"
 };
+
+const struct ssh_mac ssh_hmac_sha1_96_buggy = {
+    sha1_make_context, sha1_free_context, sha1_key_buggy,
+    sha1_96_generate, sha1_96_verify,
+    "hmac-sha1-96",
+    12,
+    "bug-compatible HMAC-SHA1-96"
+};