Source-Changes-HG archive

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index][Old Index]

[src/trunk]: src/sys/opencrypto add an AES-CTR xform, from OpenBSD



details:   https://anonhg.NetBSD.org/src/rev/61bd456f268d
branches:  trunk
changeset: 765242:61bd456f268d
user:      drochner <drochner%NetBSD.org@localhost>
date:      Mon May 23 13:51:10 2011 +0000

description:
add an AES-CTR xform, from OpenBSD

diffstat:

 sys/opencrypto/cryptodev.c        |   7 ++-
 sys/opencrypto/cryptodev.h        |   5 +-
 sys/opencrypto/cryptosoft.c       |  10 +++-
 sys/opencrypto/cryptosoft_xform.c |  89 ++++++++++++++++++++++++++++++++++++++-
 sys/opencrypto/xform.c            |   9 +++-
 sys/opencrypto/xform.h            |   3 +-
 6 files changed, 112 insertions(+), 11 deletions(-)

diffs (284 lines):

diff -r 60f3f9b63cba -r 61bd456f268d sys/opencrypto/cryptodev.c
--- a/sys/opencrypto/cryptodev.c        Mon May 23 13:46:54 2011 +0000
+++ b/sys/opencrypto/cryptodev.c        Mon May 23 13:51:10 2011 +0000
@@ -1,4 +1,4 @@
-/*     $NetBSD: cryptodev.c,v 1.58 2011/05/23 13:46:54 drochner Exp $ */
+/*     $NetBSD: cryptodev.c,v 1.59 2011/05/23 13:51:10 drochner Exp $ */
 /*     $FreeBSD: src/sys/opencrypto/cryptodev.c,v 1.4.2.4 2003/06/03 00:09:02 sam Exp $        */
 /*     $OpenBSD: cryptodev.c,v 1.53 2002/07/10 22:21:30 mickey Exp $   */
 
@@ -64,7 +64,7 @@
  */
 
 #include <sys/cdefs.h>
-__KERNEL_RCSID(0, "$NetBSD: cryptodev.c,v 1.58 2011/05/23 13:46:54 drochner Exp $");
+__KERNEL_RCSID(0, "$NetBSD: cryptodev.c,v 1.59 2011/05/23 13:51:10 drochner Exp $");
 
 #include <sys/param.h>
 #include <sys/systm.h>
@@ -1521,6 +1521,9 @@
        case CRYPTO_AES_CBC:
                txform = &enc_xform_rijndael128;
                break;
+       case CRYPTO_AES_CTR:
+               txform = &enc_xform_aes_ctr;
+               break;
        case CRYPTO_NULL_CBC:
                txform = &enc_xform_null;
                break;
diff -r 60f3f9b63cba -r 61bd456f268d sys/opencrypto/cryptodev.h
--- a/sys/opencrypto/cryptodev.h        Mon May 23 13:46:54 2011 +0000
+++ b/sys/opencrypto/cryptodev.h        Mon May 23 13:51:10 2011 +0000
@@ -1,4 +1,4 @@
-/*     $NetBSD: cryptodev.h,v 1.21 2011/05/16 10:18:52 drochner Exp $ */
+/*     $NetBSD: cryptodev.h,v 1.22 2011/05/23 13:51:10 drochner Exp $ */
 /*     $FreeBSD: src/sys/opencrypto/cryptodev.h,v 1.2.2.6 2003/07/02 17:04:50 sam Exp $        */
 /*     $OpenBSD: cryptodev.h,v 1.33 2002/07/17 23:52:39 art Exp $      */
 
@@ -138,7 +138,8 @@
 #define CRYPTO_SHA2_384_HMAC   24
 #define CRYPTO_SHA2_512_HMAC   25
 #define CRYPTO_CAMELLIA_CBC    26
-#define CRYPTO_ALGORITHM_MAX   26 /* Keep updated - see below */
+#define CRYPTO_AES_CTR         27
+#define CRYPTO_ALGORITHM_MAX   27 /* Keep updated - see below */
 
 /* Algorithm flags */
 #define        CRYPTO_ALG_FLAG_SUPPORTED       0x01 /* Algorithm is supported */
diff -r 60f3f9b63cba -r 61bd456f268d sys/opencrypto/cryptosoft.c
--- a/sys/opencrypto/cryptosoft.c       Mon May 23 13:46:54 2011 +0000
+++ b/sys/opencrypto/cryptosoft.c       Mon May 23 13:51:10 2011 +0000
@@ -1,4 +1,4 @@
-/*     $NetBSD: cryptosoft.c,v 1.32 2011/05/23 13:46:54 drochner Exp $ */
+/*     $NetBSD: cryptosoft.c,v 1.33 2011/05/23 13:51:10 drochner Exp $ */
 /*     $FreeBSD: src/sys/opencrypto/cryptosoft.c,v 1.2.2.1 2002/11/21 23:34:23 sam Exp $       */
 /*     $OpenBSD: cryptosoft.c,v 1.35 2002/04/26 08:43:50 deraadt Exp $ */
 
@@ -24,7 +24,7 @@
  */
 
 #include <sys/cdefs.h>
-__KERNEL_RCSID(0, "$NetBSD: cryptosoft.c,v 1.32 2011/05/23 13:46:54 drochner Exp $");
+__KERNEL_RCSID(0, "$NetBSD: cryptosoft.c,v 1.33 2011/05/23 13:51:10 drochner Exp $");
 
 #include <sys/param.h>
 #include <sys/systm.h>
@@ -702,6 +702,9 @@
                case CRYPTO_CAMELLIA_CBC:
                        txf = &swcr_enc_xform_camellia;
                        goto enccommon;
+               case CRYPTO_AES_CTR:
+                       txf = &swcr_enc_xform_aes_ctr;
+                       goto enccommon;
                case CRYPTO_NULL_CBC:
                        txf = &swcr_enc_xform_null;
                        goto enccommon;
@@ -889,6 +892,7 @@
                case CRYPTO_SKIPJACK_CBC:
                case CRYPTO_RIJNDAEL128_CBC:
                case CRYPTO_CAMELLIA_CBC:
+               case CRYPTO_AES_CTR:
                case CRYPTO_NULL_CBC:
                        txf = swd->sw_exf;
 
@@ -1017,6 +1021,7 @@
                case CRYPTO_SKIPJACK_CBC:
                case CRYPTO_RIJNDAEL128_CBC:
                case CRYPTO_CAMELLIA_CBC:
+               case CRYPTO_AES_CTR:
                        if ((crp->crp_etype = swcr_encdec(crd, sw,
                            crp->crp_buf, type)) != 0)
                                goto done;
@@ -1084,6 +1089,7 @@
        REGISTER(CRYPTO_CAST_CBC);
        REGISTER(CRYPTO_SKIPJACK_CBC);
        REGISTER(CRYPTO_CAMELLIA_CBC);
+       REGISTER(CRYPTO_AES_CTR);
        REGISTER(CRYPTO_NULL_CBC);
        REGISTER(CRYPTO_MD5_HMAC);
        REGISTER(CRYPTO_MD5_HMAC_96);
diff -r 60f3f9b63cba -r 61bd456f268d sys/opencrypto/cryptosoft_xform.c
--- a/sys/opencrypto/cryptosoft_xform.c Mon May 23 13:46:54 2011 +0000
+++ b/sys/opencrypto/cryptosoft_xform.c Mon May 23 13:51:10 2011 +0000
@@ -1,4 +1,4 @@
-/*     $NetBSD: cryptosoft_xform.c,v 1.17 2011/05/23 13:46:54 drochner Exp $ */
+/*     $NetBSD: cryptosoft_xform.c,v 1.18 2011/05/23 13:51:10 drochner Exp $ */
 /*     $FreeBSD: src/sys/opencrypto/xform.c,v 1.1.2.1 2002/11/21 23:34:23 sam Exp $    */
 /*     $OpenBSD: xform.c,v 1.19 2002/08/16 22:47:25 dhartmei Exp $     */
 
@@ -40,7 +40,7 @@
  */
 
 #include <sys/cdefs.h>
-__KERNEL_RCSID(1, "$NetBSD: cryptosoft_xform.c,v 1.17 2011/05/23 13:46:54 drochner Exp $");
+__KERNEL_RCSID(1, "$NetBSD: cryptosoft_xform.c,v 1.18 2011/05/23 13:51:10 drochner Exp $");
 
 #include <crypto/blowfish/blowfish.h>
 #include <crypto/cast128/cast128.h>
@@ -89,6 +89,7 @@
 static  int skipjack_setkey(u_int8_t **, const u_int8_t *, int);
 static  int rijndael128_setkey(u_int8_t **, const u_int8_t *, int);
 static  int cml_setkey(u_int8_t **, const u_int8_t *, int);
+static  int aes_ctr_setkey(u_int8_t **, const u_int8_t *, int);
 static void des1_encrypt(void *, u_int8_t *);
 static void des3_encrypt(void *, u_int8_t *);
 static void blf_encrypt(void *, u_int8_t *);
@@ -103,6 +104,7 @@
 static void skipjack_decrypt(void *, u_int8_t *);
 static void rijndael128_decrypt(void *, u_int8_t *);
 static  void cml_decrypt(void *, u_int8_t *);
+static  void aes_ctr_crypt(void *, u_int8_t *);
 static void des1_zerokey(u_int8_t **);
 static void des3_zerokey(u_int8_t **);
 static void blf_zerokey(u_int8_t **);
@@ -110,6 +112,8 @@
 static void skipjack_zerokey(u_int8_t **);
 static void rijndael128_zerokey(u_int8_t **);
 static  void cml_zerokey(u_int8_t **);
+static  void aes_ctr_zerokey(u_int8_t **);
+static  void aes_ctr_reinit(void *, const u_int8_t *);
 
 static void null_init(void *);
 static int null_update(void *, const u_int8_t *, u_int16_t);
@@ -198,6 +202,15 @@
        NULL
 };
 
+static const struct swcr_enc_xform swcr_enc_xform_aes_ctr = {
+       &enc_xform_aes_ctr,
+       aes_ctr_crypt,
+       aes_ctr_crypt,
+       aes_ctr_setkey,
+       aes_ctr_zerokey,
+       aes_ctr_reinit
+};
+
 static const struct swcr_enc_xform swcr_enc_xform_arc4 = {
        &enc_xform_arc4,
        NULL,
@@ -625,6 +638,78 @@
        *sched = NULL;
 }
 
+#define AESCTR_NONCESIZE       4
+#define AESCTR_IVSIZE          8
+#define AESCTR_BLOCKSIZE       16
+
+struct aes_ctr_ctx {
+       /* need only encryption half */
+       u_int32_t ac_ek[4*(RIJNDAEL_MAXNR + 1)];
+       u_int8_t ac_block[AESCTR_BLOCKSIZE];
+       int ac_nr;
+};
+
+static void
+aes_ctr_crypt(void *key, u_int8_t *blk)
+{
+       struct aes_ctr_ctx *ctx;
+       u_int8_t keystream[AESCTR_BLOCKSIZE];
+       int i;
+
+       ctx = key;
+       /* increment counter */
+       for (i = AESCTR_BLOCKSIZE - 1;
+            i >= AESCTR_NONCESIZE + AESCTR_IVSIZE; i--)
+               if (++ctx->ac_block[i]) /* continue on overflow */
+                       break;
+       rijndaelEncrypt(ctx->ac_ek, ctx->ac_nr, ctx->ac_block, keystream);
+       for (i = 0; i < AESCTR_BLOCKSIZE; i++)
+               blk[i] ^= keystream[i];
+       memset(keystream, 0, sizeof(keystream));
+}
+
+int
+aes_ctr_setkey(u_int8_t **sched, const u_int8_t *key, int len)
+{
+       struct aes_ctr_ctx *ctx;
+
+       if (len < AESCTR_NONCESIZE)
+               return EINVAL;
+
+       ctx = malloc(sizeof(struct aes_ctr_ctx), M_CRYPTO_DATA,
+                    M_NOWAIT|M_ZERO);
+       if (!ctx)
+               return ENOMEM;
+       ctx->ac_nr = rijndaelKeySetupEnc(ctx->ac_ek, (const u_char *)key,
+                       (len - AESCTR_NONCESIZE) * 8);
+       if (!ctx->ac_nr) { /* wrong key len */
+               aes_ctr_zerokey((u_int8_t **)&ctx);
+               return EINVAL;
+       }
+       memcpy(ctx->ac_block, key + len - AESCTR_NONCESIZE, AESCTR_NONCESIZE);
+       *sched = (void *)ctx;
+       return 0;
+}
+
+void
+aes_ctr_zerokey(u_int8_t **sched)
+{
+
+       memset(*sched, 0, sizeof(struct aes_ctr_ctx));
+       free(*sched, M_CRYPTO_DATA);
+       *sched = NULL;
+}
+
+void
+aes_ctr_reinit(void *key, const u_int8_t *iv)
+{
+       struct aes_ctr_ctx *ctx = key;
+
+       memcpy(ctx->ac_block + AESCTR_NONCESIZE, iv, AESCTR_IVSIZE);
+       /* reset counter */
+       memset(ctx->ac_block + AESCTR_NONCESIZE + AESCTR_IVSIZE, 0, 4);
+}
+
 /*
  * And now for auth.
  */
diff -r 60f3f9b63cba -r 61bd456f268d sys/opencrypto/xform.c
--- a/sys/opencrypto/xform.c    Mon May 23 13:46:54 2011 +0000
+++ b/sys/opencrypto/xform.c    Mon May 23 13:51:10 2011 +0000
@@ -1,4 +1,4 @@
-/*     $NetBSD: xform.c,v 1.24 2011/05/23 13:46:54 drochner Exp $ */
+/*     $NetBSD: xform.c,v 1.25 2011/05/23 13:51:10 drochner Exp $ */
 /*     $FreeBSD: src/sys/opencrypto/xform.c,v 1.1.2.1 2002/11/21 23:34:23 sam Exp $    */
 /*     $OpenBSD: xform.c,v 1.19 2002/08/16 22:47:25 dhartmei Exp $     */
 
@@ -40,7 +40,7 @@
  */
 
 #include <sys/cdefs.h>
-__KERNEL_RCSID(0, "$NetBSD: xform.c,v 1.24 2011/05/23 13:46:54 drochner Exp $");
+__KERNEL_RCSID(0, "$NetBSD: xform.c,v 1.25 2011/05/23 13:51:10 drochner Exp $");
 
 #include <sys/param.h>
 #include <sys/malloc.h>
@@ -135,6 +135,11 @@
        16, 16, 8, 32
 };
 
+const struct enc_xform enc_xform_aes_ctr = {
+       CRYPTO_AES_CTR, "AES-CTR",
+       16, 8, 16+4, 32+4
+};
+
 /* Authentication instances */
 const struct auth_hash auth_hash_null = {
        CRYPTO_NULL_HMAC, "NULL-HMAC",
diff -r 60f3f9b63cba -r 61bd456f268d sys/opencrypto/xform.h
--- a/sys/opencrypto/xform.h    Mon May 23 13:46:54 2011 +0000
+++ b/sys/opencrypto/xform.h    Mon May 23 13:51:10 2011 +0000
@@ -1,4 +1,4 @@
-/*     $NetBSD: xform.h,v 1.15 2011/05/23 13:46:54 drochner Exp $ */
+/*     $NetBSD: xform.h,v 1.16 2011/05/23 13:51:10 drochner Exp $ */
 /*     $FreeBSD: src/sys/opencrypto/xform.h,v 1.1.2.1 2002/11/21 23:34:23 sam Exp $    */
 /*     $OpenBSD: xform.h,v 1.10 2002/04/22 23:10:09 deraadt Exp $      */
 
@@ -70,6 +70,7 @@
 extern const struct enc_xform enc_xform_rijndael128;
 extern const struct enc_xform enc_xform_arc4;
 extern const struct enc_xform enc_xform_camellia;
+extern const struct enc_xform enc_xform_aes_ctr;
 
 extern const struct auth_hash auth_hash_null;
 extern const struct auth_hash auth_hash_md5;



Home | Main Index | Thread Index | Old Index