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