]> andersk Git - openssh.git/commitdiff
- markus@cvs.openbsd.org 2003/05/17 04:27:52
authordjm <djm>
Sun, 18 May 2003 10:53:59 +0000 (10:53 +0000)
committerdjm <djm>
Sun, 18 May 2003 10:53:59 +0000 (10:53 +0000)
     [cipher.c cipher-ctr.c myproposal.h]
     experimental support for aes-ctr modes from
     http://www.ietf.org/internet-drafts/draft-ietf-secsh-newmodes-00.txt
     ok djm@

ChangeLog
Makefile.in
cipher-ctr.c [new file with mode: 0644]
cipher.c
myproposal.h

index ea6bd929f1ec83cdf4f29a1c09430eb8525d3daf..d198d67e802dbb870504e58783352dcd59f1a7f5 100644 (file)
--- a/ChangeLog
+++ b/ChangeLog
@@ -9,6 +9,11 @@
    - itojun@cvs.openbsd.org 2003/05/17 03:25:58
      [auth-rhosts.c]
      just in case, put numbers to sscanf %s arg.
+   - markus@cvs.openbsd.org 2003/05/17 04:27:52
+     [cipher.c cipher-ctr.c myproposal.h]
+     experimental support for aes-ctr modes from
+     http://www.ietf.org/internet-drafts/draft-ietf-secsh-newmodes-00.txt
+     ok djm@
  - (djm) Remove IPv4 by default hack now that we can specify AF in config
 
 20030517
index f73442899b02fd22546e50885f96dc22508cf8fc..fab1cf038af69290667745ba823a94d4a540d130 100644 (file)
@@ -61,7 +61,7 @@ INSTALL_SSH_RAND_HELPER=@INSTALL_SSH_RAND_HELPER@
 TARGETS=ssh$(EXEEXT) sshd$(EXEEXT) ssh-add$(EXEEXT) ssh-keygen$(EXEEXT) ssh-keyscan${EXEEXT} ssh-keysign${EXEEXT} ssh-agent$(EXEEXT) scp$(EXEEXT) ssh-rand-helper${EXEEXT} sftp-server$(EXEEXT) sftp$(EXEEXT)
 
 LIBSSH_OBJS=authfd.o authfile.o bufaux.o buffer.o canohost.o channels.o \
-       cipher.o  cipher-aes.o cipher-bf1.o cipher-3des1.o \
+       cipher.o  cipher-aes.o cipher-bf1.o cipher-ctr.o cipher-3des1.o \
        compat.o compress.o crc32.o deattack.o fatal.o \
        hostfile.o log.o match.o mpaux.o nchan.o packet.o radix.o \
        readpass.o rsa.o tildexpand.o ttymodes.o xmalloc.o atomicio.o \
diff --git a/cipher-ctr.c b/cipher-ctr.c
new file mode 100644 (file)
index 0000000..8d548c7
--- /dev/null
@@ -0,0 +1,149 @@
+/*
+ * Copyright (c) 2003 Markus Friedl.  All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ * 1. Redistributions of source code must retain the above copyright
+ *    notice, this list of conditions and the following disclaimer.
+ * 2. Redistributions in binary form must reproduce the above copyright
+ *    notice, this list of conditions and the following disclaimer in the
+ *    documentation and/or other materials provided with the distribution.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR
+ * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
+ * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
+ * IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT,
+ * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
+ * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+ * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+ * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
+ * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ */
+#include "includes.h"
+RCSID("$OpenBSD: cipher-ctr.c,v 1.1 2003/05/17 04:27:52 markus Exp $");
+
+#include <openssl/evp.h>
+
+#include "log.h"
+#include "xmalloc.h"
+
+#if OPENSSL_VERSION_NUMBER < 0x00907000L
+#include "rijndael.h"
+#define AES_KEY rijndael_ctx
+#define AES_BLOCK_SIZE 16
+#define AES_encrypt(a, b, c) rijndael_encrypt(c, a, b)
+#define AES_set_encrypt_key(a, b, c) rijndael_set_key(c, (char *)a, b, 1)
+#else
+#include <openssl/aes.h>
+#endif
+
+const EVP_CIPHER *evp_aes_128_ctr(void);
+void ssh_aes_ctr_iv(EVP_CIPHER_CTX *, int, u_char *, u_int);
+
+struct ssh_aes_ctr_ctx
+{
+       AES_KEY         aes_ctx;
+       u_char          aes_counter[AES_BLOCK_SIZE];
+};
+
+/*
+ * increment counter 'ctr',
+ * the counter is of size 'len' bytes and stored in network-byte-order.
+ * (LSB at ctr[len-1], MSB at ctr[0])
+ */
+static void
+ssh_ctr_inc(u_char *ctr, u_int len)
+{
+       int i;
+
+       for (i = len - 1; i >= 0; i--)
+               if (++ctr[i])   /* continue on overflow */
+                       return;
+}
+
+static int
+ssh_aes_ctr(EVP_CIPHER_CTX *ctx, u_char *dest, const u_char *src,
+    u_int len)
+{
+       struct ssh_aes_ctr_ctx *c;
+       u_int n = 0;
+       u_char buf[AES_BLOCK_SIZE];
+
+       if (len == 0)
+               return (1);
+       if ((c = EVP_CIPHER_CTX_get_app_data(ctx)) == NULL)
+               return (0);
+
+       while ((len--) > 0) {
+               if (n == 0) {
+                       AES_encrypt(c->aes_counter, buf, &c->aes_ctx);
+                       ssh_ctr_inc(c->aes_counter, AES_BLOCK_SIZE);
+               }
+               *(dest++) = *(src++) ^ buf[n];
+               n = (n + 1) % AES_BLOCK_SIZE;
+       }
+       return (1);
+}
+
+static int
+ssh_aes_ctr_init(EVP_CIPHER_CTX *ctx, const u_char *key, const u_char *iv,
+    int enc)
+{
+       struct ssh_aes_ctr_ctx *c;
+
+       if ((c = EVP_CIPHER_CTX_get_app_data(ctx)) == NULL) {
+               c = xmalloc(sizeof(*c));
+               EVP_CIPHER_CTX_set_app_data(ctx, c);
+       }
+       if (key != NULL)
+                AES_set_encrypt_key(key, ctx->key_len * 8, &c->aes_ctx);
+       if (iv != NULL)
+               memcpy(c->aes_counter, iv, AES_BLOCK_SIZE);
+       return (1);
+}
+
+static int
+ssh_aes_ctr_cleanup(EVP_CIPHER_CTX *ctx)
+{
+       struct ssh_aes_ctr_ctx *c;
+
+       if ((c = EVP_CIPHER_CTX_get_app_data(ctx)) != NULL) {
+               memset(c, 0, sizeof(*c));
+               xfree(c);
+               EVP_CIPHER_CTX_set_app_data(ctx, NULL);
+       }
+       return (1);
+}
+
+void
+ssh_aes_ctr_iv(EVP_CIPHER_CTX *evp, int doset, u_char * iv, u_int len)
+{
+       struct ssh_aes_ctr_ctx *c;
+
+       if ((c = EVP_CIPHER_CTX_get_app_data(evp)) == NULL)
+               fatal("ssh_aes_ctr_iv: no context");
+       if (doset)
+               memcpy(c->aes_counter, iv, len);
+       else
+               memcpy(iv, c->aes_counter, len);
+}
+
+const EVP_CIPHER *
+evp_aes_128_ctr(void)
+{
+       static EVP_CIPHER aes_ctr;
+
+       memset(&aes_ctr, 0, sizeof(EVP_CIPHER));
+       aes_ctr.nid = NID_undef;
+       aes_ctr.block_size = AES_BLOCK_SIZE;
+       aes_ctr.iv_len = AES_BLOCK_SIZE;
+       aes_ctr.key_len = 16;
+       aes_ctr.init = ssh_aes_ctr_init;
+       aes_ctr.cleanup = ssh_aes_ctr_cleanup;
+       aes_ctr.do_cipher = ssh_aes_ctr;
+       aes_ctr.flags = EVP_CIPH_CBC_MODE | EVP_CIPH_VARIABLE_LENGTH |
+           EVP_CIPH_ALWAYS_CALL_INIT | EVP_CIPH_CUSTOM_IV;
+       return (&aes_ctr);
+}
index acb436c8aec2e167470cb5f2c2ca995990fe6d49..e7c3c5411e3d6d821c52b6b9aa410cae3ff16ed0 100644 (file)
--- a/cipher.c
+++ b/cipher.c
@@ -35,7 +35,7 @@
  */
 
 #include "includes.h"
-RCSID("$OpenBSD: cipher.c,v 1.64 2003/05/15 03:08:29 markus Exp $");
+RCSID("$OpenBSD: cipher.c,v 1.65 2003/05/17 04:27:52 markus Exp $");
 
 #include "xmalloc.h"
 #include "log.h"
@@ -55,6 +55,8 @@ extern void ssh_rijndael_iv(EVP_CIPHER_CTX *, int, u_char *, u_int);
 extern const EVP_CIPHER *evp_ssh1_bf(void);
 extern const EVP_CIPHER *evp_ssh1_3des(void);
 extern void ssh1_3des_iv(EVP_CIPHER_CTX *, int, u_char *, int);
+extern const EVP_CIPHER *evp_aes_128_ctr(void);
+extern void ssh_aes_ctr_iv(EVP_CIPHER_CTX *, int, u_char *, u_int);
 
 struct Cipher {
        char    *name;
@@ -85,6 +87,9 @@ struct Cipher {
        { "rijndael-cbc@lysator.liu.se",
                                SSH_CIPHER_SSH2, 16, 32, EVP_aes_256_cbc },
 #endif
+       { "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 },
 
        { NULL,                 SSH_CIPHER_ILLEGAL, 0, 0, NULL }
 };
@@ -337,6 +342,9 @@ cipher_get_keyiv(CipherContext *cc, u_char *iv, u_int len)
                        ssh_rijndael_iv(&cc->evp, 0, iv, len);
                else
 #endif
+               if (c->evptype == evp_aes_128_ctr)
+                       ssh_aes_ctr_iv(&cc->evp, 0, iv, len);
+               else
                        memcpy(iv, cc->evp.iv, len);
                break;
        case SSH_CIPHER_3DES:
@@ -365,6 +373,9 @@ cipher_set_keyiv(CipherContext *cc, u_char *iv)
                        ssh_rijndael_iv(&cc->evp, 1, iv, evplen);
                else
 #endif
+               if (c->evptype == evp_aes_128_ctr)
+                       ssh_aes_ctr_iv(&cc->evp, 1, iv, evplen);
+               else
                        memcpy(cc->evp.iv, iv, evplen);
                break;
        case SSH_CIPHER_3DES:
index 62f5cfb655ec3cc83403f3daf8615521631cba7e..8b431d9d2776b664c1f45f6604d0b3ad03af4ffe 100644 (file)
@@ -1,4 +1,4 @@
-/*     $OpenBSD: myproposal.h,v 1.14 2002/04/03 09:26:11 markus Exp $  */
+/*     $OpenBSD: myproposal.h,v 1.15 2003/05/17 04:27:52 markus Exp $  */
 
 /*
  * Copyright (c) 2000 Markus Friedl.  All rights reserved.
@@ -27,7 +27,8 @@
 #define        KEX_DEFAULT_PK_ALG      "ssh-rsa,ssh-dss"
 #define        KEX_DEFAULT_ENCRYPT \
        "aes128-cbc,3des-cbc,blowfish-cbc,cast128-cbc,arcfour," \
-       "aes192-cbc,aes256-cbc,rijndael-cbc@lysator.liu.se"
+       "aes192-cbc,aes256-cbc,rijndael-cbc@lysator.liu.se," \
+       "aes128-ctr,aes192-ctr,aes256-ctr"
 #define        KEX_DEFAULT_MAC \
        "hmac-md5,hmac-sha1,hmac-ripemd160," \
        "hmac-ripemd160@openssh.com," \
This page took 0.141979 seconds and 5 git commands to generate.