Add single-DES support in SSH2
authorsimon <simon@cda61777-01e9-0310-a592-d414129be87e>
Wed, 21 Nov 2001 23:06:10 +0000 (23:06 +0000)
committersimon <simon@cda61777-01e9-0310-a592-d414129be87e>
Wed, 21 Nov 2001 23:06:10 +0000 (23:06 +0000)
git-svn-id: svn://svn.tartarus.org/sgt/putty@1396 cda61777-01e9-0310-a592-d414129be87e

ssh.c
ssh.h
sshdes.c

diff --git a/ssh.c b/ssh.c
index ef573d4..3a02b12 100644 (file)
--- a/ssh.c
+++ b/ssh.c
@@ -236,15 +236,13 @@ extern void pfd_override_throttle(Socket s, int enable);
 #define OUR_V2_WINSIZE 16384
 
 /*
- * Ciphers for SSH2. We miss out single-DES because it isn't
- * supported; also 3DES and Blowfish are both done differently from
- * SSH1. (3DES uses outer chaining; Blowfish has the opposite
- * endianness and different-sized keys.)
+ * Ciphers for SSH2.
  */
 const static struct ssh2_ciphers *ciphers[] = {
     &ssh2_aes,
     &ssh2_blowfish,
     &ssh2_3des,
+    &ssh2_des,
 };
 
 const static struct ssh_kex *kex_algs[] = {
@@ -3172,7 +3170,8 @@ static int do_ssh2_transport(unsigned char *in, int inlen, int ispkt)
            n_preferred_ciphers++;
            break;
          case CIPHER_DES:
-           /* Not supported in SSH2; silently drop */
+           preferred_ciphers[n_preferred_ciphers] = &ssh2_des;
+           n_preferred_ciphers++;
            break;
          case CIPHER_3DES:
            preferred_ciphers[n_preferred_ciphers] = &ssh2_3des;
diff --git a/ssh.h b/ssh.h
index a12aed3..2edfa47 100644 (file)
--- a/ssh.h
+++ b/ssh.h
@@ -200,6 +200,7 @@ extern const struct ssh_cipher ssh_3des;
 extern const struct ssh_cipher ssh_des;
 extern const struct ssh_cipher ssh_blowfish_ssh1;
 extern const struct ssh2_ciphers ssh2_3des;
+extern const struct ssh2_ciphers ssh2_des;
 extern const struct ssh2_ciphers ssh2_aes;
 extern const struct ssh2_ciphers ssh2_blowfish;
 extern const struct ssh_kex ssh_diffiehellman;
index 44fbf00..ad4beb6 100644 (file)
--- a/sshdes.c
+++ b/sshdes.c
@@ -757,6 +757,13 @@ static void des3_cskey(unsigned char *key)
     logevent("Initialised triple-DES client->server encryption");
 }
 
+static void des_cskey(unsigned char *key)
+{
+    des_key_setup(GET_32BIT_MSB_FIRST(key),
+                 GET_32BIT_MSB_FIRST(key + 4), &cskeys[0]);
+    logevent("Initialised single-DES client->server encryption");
+}
+
 static void des3_csiv(unsigned char *key)
 {
     cskeys[0].eiv0 = GET_32BIT_MSB_FIRST(key);
@@ -780,6 +787,13 @@ static void des3_sckey(unsigned char *key)
     logevent("Initialised triple-DES server->client encryption");
 }
 
+static void des_sckey(unsigned char *key)
+{
+    des_key_setup(GET_32BIT_MSB_FIRST(key),
+                 GET_32BIT_MSB_FIRST(key + 4), &sckeys[0]);
+    logevent("Initialised single-DES server->client encryption");
+}
+
 static void des3_sesskey(unsigned char *key)
 {
     des3_cskey(key);
@@ -806,6 +820,16 @@ static void des3_ssh2_decrypt_blk(unsigned char *blk, int len)
     des_cbc3_decrypt(blk, blk, len, sckeys);
 }
 
+static void des_ssh2_encrypt_blk(unsigned char *blk, int len)
+{
+    des_cbc_encrypt(blk, blk, len, cskeys);
+}
+
+static void des_ssh2_decrypt_blk(unsigned char *blk, int len)
+{
+    des_cbc_decrypt(blk, blk, len, sckeys);
+}
+
 void des3_decrypt_pubkey(unsigned char *key, unsigned char *blk, int len)
 {
     DESContext ourkeys[3];
@@ -839,6 +863,20 @@ static const struct ssh2_cipher ssh_3des_ssh2 = {
     8, 168
 };
 
+/*
+ * Single DES in ssh2. It isn't clear that "des-cbc" is an official
+ * cipher name, but ssh.com support it and apparently aren't the
+ * only people to do so, so we sigh and implement it anyway.
+ */
+static const struct ssh2_cipher ssh_des_ssh2 = {
+    des3_csiv, des_cskey,             /* iv functions shared with 3des */
+    des3_sciv, des_sckey,
+    des_ssh2_encrypt_blk,
+    des_ssh2_decrypt_blk,
+    "des-cbc",
+    8, 56
+};
+
 static const struct ssh2_cipher *const des3_list[] = {
     &ssh_3des_ssh2
 };
@@ -848,6 +886,15 @@ const struct ssh2_ciphers ssh2_3des = {
     des3_list
 };
 
+static const struct ssh2_cipher *const des_list[] = {
+    &ssh_des_ssh2
+};
+
+const struct ssh2_ciphers ssh2_des = {
+    sizeof(des3_list) / sizeof(*des_list),
+    des_list
+};
+
 const struct ssh_cipher ssh_3des = {
     des3_sesskey,
     des3_encrypt_blk,
@@ -857,9 +904,8 @@ const struct ssh_cipher ssh_3des = {
 
 static void des_sesskey(unsigned char *key)
 {
-    des_key_setup(GET_32BIT_MSB_FIRST(key),
-                 GET_32BIT_MSB_FIRST(key + 4), &cskeys[0]);
-    logevent("Initialised single-DES encryption");
+    des_cskey(key);
+    des_sckey(key);
 }
 
 static void des_encrypt_blk(unsigned char *blk, int len)