X-Git-Url: https://git.distorted.org.uk/u/mdw/putty/blobdiff_plain/e557416818242c2e8b14ec03d321740fd83619e4..0965bee0865fd8ea129b2de62a3c50e09c59a184:/sshsha.c diff --git a/sshsha.c b/sshsha.c index 487d1733..48cabb5c 100644 --- a/sshsha.c +++ b/sshsha.c @@ -7,8 +7,6 @@ #include "ssh.h" -typedef unsigned int uint32; - /* ---------------------------------------------------------------------- * Core SHA algorithm: processes 16-word blocks into a message digest. */ @@ -170,28 +168,47 @@ void SHA_Simple(void *p, int len, unsigned char *output) { * HMAC wrapper on it. */ -static SHA_State sha1_mac_s1, sha1_mac_s2; +static SHA_State sha1_cs_mac_s1, sha1_cs_mac_s2; +static SHA_State sha1_sc_mac_s1, sha1_sc_mac_s2; -static void sha1_sesskey(unsigned char *key, int len) { +static void sha1_key(SHA_State *s1, SHA_State *s2, + unsigned char *key, int len) { unsigned char foo[64]; int i; memset(foo, 0x36, 64); for (i = 0; i < len && i < 64; i++) foo[i] ^= key[i]; - SHA_Init(&sha1_mac_s1); - SHA_Bytes(&sha1_mac_s1, foo, 64); + SHA_Init(s1); + SHA_Bytes(s1, foo, 64); memset(foo, 0x5C, 64); for (i = 0; i < len && i < 64; i++) foo[i] ^= key[i]; - SHA_Init(&sha1_mac_s2); - SHA_Bytes(&sha1_mac_s2, foo, 64); + SHA_Init(s2); + SHA_Bytes(s2, foo, 64); memset(foo, 0, 64); /* burn the evidence */ } -static void sha1_do_hmac(unsigned char *blk, int len, unsigned long seq, +static void sha1_cskey(unsigned char *key) { + sha1_key(&sha1_cs_mac_s1, &sha1_cs_mac_s2, key, 20); +} + +static void sha1_sckey(unsigned char *key) { + sha1_key(&sha1_sc_mac_s1, &sha1_sc_mac_s2, key, 20); +} + +static void sha1_cskey_buggy(unsigned char *key) { + sha1_key(&sha1_cs_mac_s1, &sha1_cs_mac_s2, key, 16); +} + +static void sha1_sckey_buggy(unsigned char *key) { + sha1_key(&sha1_sc_mac_s1, &sha1_sc_mac_s2, key, 16); +} + +static void sha1_do_hmac(SHA_State *s1, SHA_State *s2, + unsigned char *blk, int len, unsigned long seq, unsigned char *hmac) { SHA_State s; unsigned char intermediate[20]; @@ -201,27 +218,35 @@ static void sha1_do_hmac(unsigned char *blk, int len, unsigned long seq, intermediate[2] = (unsigned char)((seq >> 8) & 0xFF); intermediate[3] = (unsigned char)((seq ) & 0xFF); - s = sha1_mac_s1; /* structure copy */ + s = *s1; /* structure copy */ SHA_Bytes(&s, intermediate, 4); SHA_Bytes(&s, blk, len); SHA_Final(&s, intermediate); - s = sha1_mac_s2; /* structure copy */ + s = *s2; /* structure copy */ SHA_Bytes(&s, intermediate, 20); SHA_Final(&s, hmac); } static void sha1_generate(unsigned char *blk, int len, unsigned long seq) { - sha1_do_hmac(blk, len, seq, blk+len); + sha1_do_hmac(&sha1_cs_mac_s1, &sha1_cs_mac_s2, blk, len, seq, blk+len); } static int sha1_verify(unsigned char *blk, int len, unsigned long seq) { unsigned char correct[20]; - sha1_do_hmac(blk, len, seq, correct); + sha1_do_hmac(&sha1_sc_mac_s1, &sha1_sc_mac_s2, blk, len, seq, correct); return !memcmp(correct, blk+len, 20); } struct ssh_mac ssh_sha1 = { - sha1_sesskey, + sha1_cskey, sha1_sckey, + sha1_generate, + sha1_verify, + "hmac-sha1", + 20 +}; + +struct ssh_mac ssh_sha1_buggy = { + sha1_cskey_buggy, sha1_sckey_buggy, sha1_generate, sha1_verify, "hmac-sha1",