]> andersk Git - openssh.git/blobdiff - cipher.c
- djm@cvs.openbsd.org 2005/05/23 23:32:46
[openssh.git] / cipher.c
index 255f840a39df050d07d3e000a1b9e9a438985e2d..b56492940c806114c48ffc843877c891e03dcad1 100644 (file)
--- a/cipher.c
+++ b/cipher.c
@@ -35,7 +35,7 @@
  */
 
 #include "includes.h"
-RCSID("$OpenBSD: cipher.c,v 1.69 2004/06/21 17:36:31 avsm Exp $");
+RCSID("$OpenBSD: cipher.c,v 1.74 2005/05/23 23:32:46 djm Exp $");
 
 #include "xmalloc.h"
 #include "log.h"
@@ -74,39 +74,42 @@ struct Cipher {
        int     number;         /* for ssh1 only */
        u_int   block_size;
        u_int   key_len;
+       u_int   discard_len;
        const EVP_CIPHER        *(*evptype)(void);
 } ciphers[] = {
-       { "none",               SSH_CIPHER_NONE, 8, 0, EVP_enc_null },
-       { "des",                SSH_CIPHER_DES, 8, 8, EVP_des_cbc },
-       { "3des",               SSH_CIPHER_3DES, 8, 16, evp_ssh1_3des },
-       { "blowfish",           SSH_CIPHER_BLOWFISH, 8, 32, evp_ssh1_bf },
-
-       { "3des-cbc",           SSH_CIPHER_SSH2, 8, 24, EVP_des_ede3_cbc },
-       { "blowfish-cbc",       SSH_CIPHER_SSH2, 8, 16, EVP_bf_cbc },
-       { "cast128-cbc",        SSH_CIPHER_SSH2, 8, 16, EVP_cast5_cbc },
-       { "arcfour",            SSH_CIPHER_SSH2, 8, 16, EVP_rc4 },
+       { "none",               SSH_CIPHER_NONE, 8, 0, 0, EVP_enc_null },
+       { "des",                SSH_CIPHER_DES, 8, 8, 0, EVP_des_cbc },
+       { "3des",               SSH_CIPHER_3DES, 8, 16, 0, evp_ssh1_3des },
+       { "blowfish",           SSH_CIPHER_BLOWFISH, 8, 32, 0, evp_ssh1_bf },
+
+       { "3des-cbc",           SSH_CIPHER_SSH2, 8, 24, 0, EVP_des_ede3_cbc },
+       { "blowfish-cbc",       SSH_CIPHER_SSH2, 8, 16, 0, EVP_bf_cbc },
+       { "cast128-cbc",        SSH_CIPHER_SSH2, 8, 16, 0, EVP_cast5_cbc },
+       { "arcfour",            SSH_CIPHER_SSH2, 8, 16, 0, EVP_rc4 },
+       { "arcfour128",         SSH_CIPHER_SSH2, 8, 16, 1536, EVP_rc4 },
+       { "arcfour256",         SSH_CIPHER_SSH2, 8, 32, 1536, EVP_rc4 },
 #if OPENSSL_VERSION_NUMBER < 0x00907000L
-       { "aes128-cbc",         SSH_CIPHER_SSH2, 16, 16, evp_rijndael },
-       { "aes192-cbc",         SSH_CIPHER_SSH2, 16, 24, evp_rijndael },
-       { "aes256-cbc",         SSH_CIPHER_SSH2, 16, 32, evp_rijndael },
+       { "aes128-cbc",         SSH_CIPHER_SSH2, 16, 16, 0, evp_rijndael },
+       { "aes192-cbc",         SSH_CIPHER_SSH2, 16, 24, 0, evp_rijndael },
+       { "aes256-cbc",         SSH_CIPHER_SSH2, 16, 32, 0, evp_rijndael },
        { "rijndael-cbc@lysator.liu.se",
-                               SSH_CIPHER_SSH2, 16, 32, evp_rijndael },
+                               SSH_CIPHER_SSH2, 16, 32, 0, evp_rijndael },
 #else
-       { "aes128-cbc",         SSH_CIPHER_SSH2, 16, 16, EVP_aes_128_cbc },
-       { "aes192-cbc",         SSH_CIPHER_SSH2, 16, 24, EVP_aes_192_cbc },
-       { "aes256-cbc",         SSH_CIPHER_SSH2, 16, 32, EVP_aes_256_cbc },
+       { "aes128-cbc",         SSH_CIPHER_SSH2, 16, 16, 0, EVP_aes_128_cbc },
+       { "aes192-cbc",         SSH_CIPHER_SSH2, 16, 24, 0, EVP_aes_192_cbc },
+       { "aes256-cbc",         SSH_CIPHER_SSH2, 16, 32, 0, EVP_aes_256_cbc },
        { "rijndael-cbc@lysator.liu.se",
-                               SSH_CIPHER_SSH2, 16, 32, EVP_aes_256_cbc },
+                               SSH_CIPHER_SSH2, 16, 32, 0, EVP_aes_256_cbc },
 #endif
 #if OPENSSL_VERSION_NUMBER >= 0x00905000L
-       { "aes128-ctr",         SSH_CIPHER_SSH2, 16, 16, evp_aes_128_ctr },
-       { "aes192-ctr",         SSH_CIPHER_SSH2, 16, 24, evp_aes_128_ctr },
-       { "aes256-ctr",         SSH_CIPHER_SSH2, 16, 32, evp_aes_128_ctr },
+       { "aes128-ctr",         SSH_CIPHER_SSH2, 16, 16, 0, evp_aes_128_ctr },
+       { "aes192-ctr",         SSH_CIPHER_SSH2, 16, 24, 0, evp_aes_128_ctr },
+       { "aes256-ctr",         SSH_CIPHER_SSH2, 16, 32, 0, evp_aes_128_ctr },
 #endif
 #if defined(EVP_CTRL_SET_ACSS_MODE)
-       { "acss@openssh.org",   SSH_CIPHER_SSH2, 16, 5, EVP_acss },
+       { "acss@openssh.org",   SSH_CIPHER_SSH2, 16, 5, 0, EVP_acss },
 #endif
-       { NULL,                 SSH_CIPHER_ILLEGAL, 0, 0, NULL }
+       { NULL,                 SSH_CIPHER_INVALID, 0, 0, 0, NULL }
 };
 
 /*--*/
@@ -146,7 +149,7 @@ cipher_by_name(const char *name)
 {
        Cipher *c;
        for (c = ciphers; c->name != NULL; c++)
-               if (strcasecmp(c->name, name) == 0)
+               if (strcmp(c->name, name) == 0)
                        return c;
        return NULL;
 }
@@ -199,8 +202,10 @@ cipher_number(const char *name)
        Cipher *c;
        if (name == NULL)
                return -1;
-       c = cipher_by_name(name);
-       return (c==NULL) ? -1 : c->number;
+       for (c = ciphers; c->name != NULL; c++)
+               if (strcasecmp(c->name, name) == 0)
+                       return c->number;
+       return -1;
 }
 
 char *
@@ -222,6 +227,7 @@ cipher_init(CipherContext *cc, Cipher *cipher,
        const EVP_CIPHER *type;
 #endif
        int klen;
+       u_char *junk, *discard;
 
        if (cipher->number == SSH_CIPHER_DES) {
                if (dowarn) {
@@ -252,7 +258,7 @@ cipher_init(CipherContext *cc, Cipher *cipher,
                type->key_len = keylen;
        }
        EVP_CipherInit(&cc->evp, type, (u_char *)key, (u_char *)iv,
-           (encrypt == CIPHER_ENCRYPT));
+           (do_encrypt == CIPHER_ENCRYPT));
 #else
        if (EVP_CipherInit(&cc->evp, type, NULL, (u_char *)iv,
            (do_encrypt == CIPHER_ENCRYPT)) == 0)
@@ -269,6 +275,17 @@ cipher_init(CipherContext *cc, Cipher *cipher,
                fatal("cipher_init: EVP_CipherInit: set key failed for %s",
                    cipher->name);
 #endif
+
+       if (cipher->discard_len > 0) {          
+               junk = xmalloc(cipher->discard_len);
+               discard = xmalloc(cipher->discard_len);
+               if (EVP_Cipher(&cc->evp, discard, junk,
+                   cipher->discard_len) == 0)
+                       fatal("evp_crypt: EVP_Cipher failed during discard");
+               memset(discard, 0, cipher->discard_len);
+               xfree(junk);
+               xfree(discard);
+       }
 }
 
 void
This page took 0.045561 seconds and 4 git commands to generate.