Module Name: src
Committed By: vanhu
Date: Thu Nov 29 15:31:25 UTC 2012
Modified Files:
src/crypto/dist/ipsec-tools/src/racoon: algorithm.c algorithm.h
cfparse.y cftoken.l crypto_openssl.c crypto_openssl.h ipsec_doi.c
ipsec_doi.h pfkey.c racoon.conf.5 strnames.c
src/crypto/dist/ipsec-tools/src/setkey: token.l
Log Message:
Added support for AES GCM 16 in phase2 negociations. Code from Christophe Carre
/ NETASQ
To generate a diff of this commit:
cvs rdiff -u -r1.8 -r1.9 src/crypto/dist/ipsec-tools/src/racoon/algorithm.c
cvs rdiff -u -r1.5 -r1.6 src/crypto/dist/ipsec-tools/src/racoon/algorithm.h
cvs rdiff -u -r1.47 -r1.48 src/crypto/dist/ipsec-tools/src/racoon/cfparse.y \
src/crypto/dist/ipsec-tools/src/racoon/ipsec_doi.c
cvs rdiff -u -r1.26 -r1.27 src/crypto/dist/ipsec-tools/src/racoon/cftoken.l
cvs rdiff -u -r1.21 -r1.22 \
src/crypto/dist/ipsec-tools/src/racoon/crypto_openssl.c
cvs rdiff -u -r1.7 -r1.8 \
src/crypto/dist/ipsec-tools/src/racoon/crypto_openssl.h
cvs rdiff -u -r1.13 -r1.14 src/crypto/dist/ipsec-tools/src/racoon/ipsec_doi.h
cvs rdiff -u -r1.58 -r1.59 src/crypto/dist/ipsec-tools/src/racoon/pfkey.c
cvs rdiff -u -r1.64 -r1.65 \
src/crypto/dist/ipsec-tools/src/racoon/racoon.conf.5
cvs rdiff -u -r1.9 -r1.10 src/crypto/dist/ipsec-tools/src/racoon/strnames.c
cvs rdiff -u -r1.17 -r1.18 src/crypto/dist/ipsec-tools/src/setkey/token.l
Please note that diffs are not public domain; they are subject to the
copyright notices on the relevant files.
Modified files:
Index: src/crypto/dist/ipsec-tools/src/racoon/algorithm.c
diff -u src/crypto/dist/ipsec-tools/src/racoon/algorithm.c:1.8 src/crypto/dist/ipsec-tools/src/racoon/algorithm.c:1.9
--- src/crypto/dist/ipsec-tools/src/racoon/algorithm.c:1.8 Fri Oct 6 12:02:27 2006
+++ src/crypto/dist/ipsec-tools/src/racoon/algorithm.c Thu Nov 29 15:31:24 2012
@@ -1,4 +1,4 @@
-/* $NetBSD: algorithm.c,v 1.8 2006/10/06 12:02:27 manu Exp $ */
+/* $NetBSD: algorithm.c,v 1.9 2012/11/29 15:31:24 vanhu Exp $ */
/* Id: algorithm.c,v 1.15 2006/05/23 20:23:09 manubsd Exp */
@@ -165,6 +165,9 @@ static struct enc_algorithm ipsec_encdef
{ "aes", algtype_aes, IPSECDOI_ESP_AES, 16,
NULL, NULL,
NULL, eay_aes_keylen, },
+{ "aes_gcm_16", algtype_aesgcm16, IPSECDOI_ESP_AESGCM16, 16,
+ NULL, NULL,
+ NULL, eay_aesgcm_keylen, },
{ "twofish", algtype_twofish, IPSECDOI_ESP_TWOFISH, 16,
NULL, NULL,
NULL, eay_twofish_keylen, },
@@ -798,6 +801,7 @@ default_keylen(class, type)
case algtype_rc5:
case algtype_cast128:
case algtype_aes:
+ case algtype_aesgcm16:
case algtype_twofish:
case algtype_camellia:
return 128;
@@ -834,6 +838,7 @@ check_keylen(class, type, len)
case algtype_rc5:
case algtype_cast128:
case algtype_aes:
+ case algtype_aesgcm16:
case algtype_twofish:
case algtype_camellia:
if (len % 8 != 0) {
@@ -863,6 +868,10 @@ check_keylen(class, type, len)
if (!(len == 128 || len == 192 || len == 256))
badrange++;
break;
+ case algtype_aesgcm16:
+ if (!(len == 128 || len == 192 || len == 256))
+ badrange++;
+ break;
case algtype_twofish:
if (len < 40 || 256 < len)
badrange++;
Index: src/crypto/dist/ipsec-tools/src/racoon/algorithm.h
diff -u src/crypto/dist/ipsec-tools/src/racoon/algorithm.h:1.5 src/crypto/dist/ipsec-tools/src/racoon/algorithm.h:1.6
--- src/crypto/dist/ipsec-tools/src/racoon/algorithm.h:1.5 Fri Oct 6 12:02:27 2006
+++ src/crypto/dist/ipsec-tools/src/racoon/algorithm.h Thu Nov 29 15:31:24 2012
@@ -1,4 +1,4 @@
-/* $NetBSD: algorithm.h,v 1.5 2006/10/06 12:02:27 manu Exp $ */
+/* $NetBSD: algorithm.h,v 1.6 2012/11/29 15:31:24 vanhu Exp $ */
/* Id: algorithm.h,v 1.10 2005/04/09 16:25:23 manubsd Exp */
@@ -69,6 +69,7 @@ enum algtype {
algtype_rc4,
algtype_null_enc,
algtype_aes,
+ algtype_aesgcm16,
algtype_twofish,
algtype_camellia,
Index: src/crypto/dist/ipsec-tools/src/racoon/cfparse.y
diff -u src/crypto/dist/ipsec-tools/src/racoon/cfparse.y:1.47 src/crypto/dist/ipsec-tools/src/racoon/cfparse.y:1.48
--- src/crypto/dist/ipsec-tools/src/racoon/cfparse.y:1.47 Sun Jan 1 16:14:11 2012
+++ src/crypto/dist/ipsec-tools/src/racoon/cfparse.y Thu Nov 29 15:31:24 2012
@@ -1,4 +1,4 @@
-/* $NetBSD: cfparse.y,v 1.47 2012/01/01 16:14:11 tteras Exp $ */
+/* $NetBSD: cfparse.y,v 1.48 2012/11/29 15:31:24 vanhu Exp $ */
/* Id: cfparse.y,v 1.66 2006/08/22 18:17:17 manubsd Exp */
@@ -1722,6 +1722,7 @@ algorithm
: ALGORITHMTYPE keylength
{
int defklen;
+ int encklen_tmp;
$$ = newsainfoalg();
if ($$ == NULL) {
@@ -1754,9 +1755,35 @@ algorithm
else
$$->encklen = defklen;
+ /* Check keymat size instead of "human" key size
+ * because kernel store keymat size instead of "human key size".
+ * For example, the keymat size of aes_gcm_16 128 is 160 bits
+ * (128 bits + 4 bytes) instead of 128 bits.
+ *
+ * Currently, it is only useful for aes_gcm_16 (ipsec_enc).
+ */
+ if (cur_algclass == algclass_ipsec_enc)
+ {
+ encklen_tmp = alg_ipsec_encdef_keylen($$->alg, $$->encklen);
+ if (encklen_tmp < 0)
+ {
+ yyerror("Failed to convert keylen %d to keymat len for alg %d",
+ $$->encklen, $$->alg);
+ racoon_free($$);
+ $$ = NULL;
+ return -1;
+ }
+ }
+ else
+ {
+ /* XXX Convert key size to keymat size for other algorithm ?
+ */
+ encklen_tmp = $$->encklen;
+ }
+
/* check if it's supported algorithm by kernel */
if (!(cur_algclass == algclass_ipsec_auth && $1 == algtype_non_auth)
- && pk_checkalg(cur_algclass, $1, $$->encklen)) {
+ && pk_checkalg(cur_algclass, $1, encklen_tmp)) {
int a = algclass2doi(cur_algclass);
int b = algtype2doi(cur_algclass, $1);
if (a == IPSECDOI_ATTR_AUTH)
Index: src/crypto/dist/ipsec-tools/src/racoon/ipsec_doi.c
diff -u src/crypto/dist/ipsec-tools/src/racoon/ipsec_doi.c:1.47 src/crypto/dist/ipsec-tools/src/racoon/ipsec_doi.c:1.48
--- src/crypto/dist/ipsec-tools/src/racoon/ipsec_doi.c:1.47 Sun Jan 1 15:29:28 2012
+++ src/crypto/dist/ipsec-tools/src/racoon/ipsec_doi.c Thu Nov 29 15:31:25 2012
@@ -1,4 +1,4 @@
-/* $NetBSD: ipsec_doi.c,v 1.47 2012/01/01 15:29:28 tteras Exp $ */
+/* $NetBSD: ipsec_doi.c,v 1.48 2012/11/29 15:31:25 vanhu Exp $ */
/* Id: ipsec_doi.c,v 1.55 2006/08/17 09:20:41 vanhu Exp */
@@ -1973,6 +1973,7 @@ check_trns_esp(t_id)
case IPSECDOI_ESP_CAST:
case IPSECDOI_ESP_BLOWFISH:
case IPSECDOI_ESP_AES:
+ case IPSECDOI_ESP_AESGCM16:
case IPSECDOI_ESP_TWOFISH:
case IPSECDOI_ESP_CAMELLIA:
return 0;
Index: src/crypto/dist/ipsec-tools/src/racoon/cftoken.l
diff -u src/crypto/dist/ipsec-tools/src/racoon/cftoken.l:1.26 src/crypto/dist/ipsec-tools/src/racoon/cftoken.l:1.27
--- src/crypto/dist/ipsec-tools/src/racoon/cftoken.l:1.26 Sun Jan 1 15:29:28 2012
+++ src/crypto/dist/ipsec-tools/src/racoon/cftoken.l Thu Nov 29 15:31:24 2012
@@ -1,4 +1,4 @@
-/* $NetBSD: cftoken.l,v 1.26 2012/01/01 15:29:28 tteras Exp $ */
+/* $NetBSD: cftoken.l,v 1.27 2012/11/29 15:31:24 vanhu Exp $ */
/* Id: cftoken.l,v 1.53 2006/08/22 18:17:17 manubsd Exp */
@@ -453,6 +453,7 @@ rc4 { YYD; yylval.num = algtype_rc4; r
null_enc { YYD; yylval.num = algtype_null_enc; return(ALGORITHMTYPE); }
null { YYD; yylval.num = algtype_null_enc; return(ALGORITHMTYPE); }
aes { YYD; yylval.num = algtype_aes; return(ALGORITHMTYPE); }
+aes_gcm_16 { YYD; yylval.num = algtype_aesgcm16; return(ALGORITHMTYPE); }
rijndael { YYD; yylval.num = algtype_aes; return(ALGORITHMTYPE); }
twofish { YYD; yylval.num = algtype_twofish; return(ALGORITHMTYPE); }
camellia { YYD; yylval.num = algtype_camellia; return(ALGORITHMTYPE); }
Index: src/crypto/dist/ipsec-tools/src/racoon/crypto_openssl.c
diff -u src/crypto/dist/ipsec-tools/src/racoon/crypto_openssl.c:1.21 src/crypto/dist/ipsec-tools/src/racoon/crypto_openssl.c:1.22
--- src/crypto/dist/ipsec-tools/src/racoon/crypto_openssl.c:1.21 Wed Aug 15 14:51:30 2012
+++ src/crypto/dist/ipsec-tools/src/racoon/crypto_openssl.c Thu Nov 29 15:31:24 2012
@@ -1,4 +1,4 @@
-/* $NetBSD: crypto_openssl.c,v 1.21 2012/08/15 14:51:30 manu Exp $ */
+/* $NetBSD: crypto_openssl.c,v 1.22 2012/11/29 15:31:24 vanhu Exp $ */
/* Id: crypto_openssl.c,v 1.47 2006/05/06 20:42:09 manubsd Exp */
@@ -1700,6 +1700,39 @@ eay_aes_keylen(len)
return len;
}
+int
+eay_aesgcm_keylen(len)
+ int len;
+{
+ /* RFC 4106:
+ * The size of the KEYMAT for the AES-GCM-ESP MUST be four octets longer
+ * than is needed for the associated AES key. The keying material is
+ * used as follows:
+ *
+ * AES-GCM-ESP with a 128 bit key
+ * The KEYMAT requested for each AES-GCM key is 20 octets. The first
+ * 16 octets are the 128-bit AES key, and the remaining four octets
+ * are used as the salt value in the nonce.
+ *
+ * AES-GCM-ESP with a 192 bit key
+ * The KEYMAT requested for each AES-GCM key is 28 octets. The first
+ * 24 octets are the 192-bit AES key, and the remaining four octets
+ * are used as the salt value in the nonce.
+ *
+ * AES-GCM-ESP with a 256 bit key
+ * The KEYMAT requested for each AES GCM key is 36 octets. The first
+ * 32 octets are the 256-bit AES key, and the remaining four octets
+ * are used as the salt value in the nonce.
+ */
+ if (len == 0)
+ len = 128;
+
+ if (len != 128 && len != 192 && len != 256)
+ return -1;
+
+ return len + 32;
+}
+
#if defined(HAVE_OPENSSL_CAMELLIA_H)
/*
* CAMELLIA-CBC
Index: src/crypto/dist/ipsec-tools/src/racoon/crypto_openssl.h
diff -u src/crypto/dist/ipsec-tools/src/racoon/crypto_openssl.h:1.7 src/crypto/dist/ipsec-tools/src/racoon/crypto_openssl.h:1.8
--- src/crypto/dist/ipsec-tools/src/racoon/crypto_openssl.h:1.7 Mon Aug 17 11:59:10 2009
+++ src/crypto/dist/ipsec-tools/src/racoon/crypto_openssl.h Thu Nov 29 15:31:25 2012
@@ -1,4 +1,4 @@
-/* $NetBSD: crypto_openssl.h,v 1.7 2009/08/17 11:59:10 vanhu Exp $ */
+/* $NetBSD: crypto_openssl.h,v 1.8 2012/11/29 15:31:25 vanhu Exp $ */
/* Id: crypto_openssl.h,v 1.11 2004/11/13 11:28:01 manubsd Exp */
@@ -124,6 +124,9 @@ extern vchar_t *eay_aes_decrypt __P((vch
extern int eay_aes_weakkey __P((vchar_t *));
extern int eay_aes_keylen __P((int));
+/* AES GCM 16*/
+extern int eay_aesgcm_keylen __P((int));
+
#if defined(HAVE_OPENSSL_CAMELLIA_H)
/* Camellia */
extern vchar_t *eay_camellia_encrypt __P((vchar_t *, vchar_t *, vchar_t *));
Index: src/crypto/dist/ipsec-tools/src/racoon/ipsec_doi.h
diff -u src/crypto/dist/ipsec-tools/src/racoon/ipsec_doi.h:1.13 src/crypto/dist/ipsec-tools/src/racoon/ipsec_doi.h:1.14
--- src/crypto/dist/ipsec-tools/src/racoon/ipsec_doi.h:1.13 Sun Jan 1 15:29:28 2012
+++ src/crypto/dist/ipsec-tools/src/racoon/ipsec_doi.h Thu Nov 29 15:31:25 2012
@@ -1,4 +1,4 @@
-/* $NetBSD: ipsec_doi.h,v 1.13 2012/01/01 15:29:28 tteras Exp $ */
+/* $NetBSD: ipsec_doi.h,v 1.14 2012/11/29 15:31:25 vanhu Exp $ */
/* Id: ipsec_doi.h,v 1.15 2006/08/11 16:06:30 vanhu Exp */
@@ -75,6 +75,7 @@
#define IPSECDOI_ESP_RC4 10
#define IPSECDOI_ESP_NULL 11
#define IPSECDOI_ESP_AES 12
+#define IPSECDOI_ESP_AESGCM16 20
#define IPSECDOI_ESP_CAMELLIA 22
#if 1
/* draft-ietf-ipsec-ciph-aes-cbc-00.txt */
Index: src/crypto/dist/ipsec-tools/src/racoon/pfkey.c
diff -u src/crypto/dist/ipsec-tools/src/racoon/pfkey.c:1.58 src/crypto/dist/ipsec-tools/src/racoon/pfkey.c:1.59
--- src/crypto/dist/ipsec-tools/src/racoon/pfkey.c:1.58 Sun Jan 1 15:57:31 2012
+++ src/crypto/dist/ipsec-tools/src/racoon/pfkey.c Thu Nov 29 15:31:25 2012
@@ -1,6 +1,6 @@
-/* $NetBSD: pfkey.c,v 1.58 2012/01/01 15:57:31 tteras Exp $ */
+/* $NetBSD: pfkey.c,v 1.59 2012/11/29 15:31:25 vanhu Exp $ */
-/* $Id: pfkey.c,v 1.58 2012/01/01 15:57:31 tteras Exp $ */
+/* $Id: pfkey.c,v 1.59 2012/11/29 15:31:25 vanhu Exp $ */
/*
* Copyright (C) 1995, 1996, 1997, and 1998 WIDE Project.
@@ -587,6 +587,10 @@ ipsecdoi2pfkey_ealg(t_id)
case IPSECDOI_ESP_AES:
return SADB_X_EALG_AESCBC;
#endif
+#ifdef SADB_X_EALG_AESGCM16
+ case IPSECDOI_ESP_AESGCM16:
+ return SADB_X_EALG_AESGCM16;
+#endif
#ifdef SADB_X_EALG_TWOFISHCBC
case IPSECDOI_ESP_TWOFISH:
return SADB_X_EALG_TWOFISHCBC;
Index: src/crypto/dist/ipsec-tools/src/racoon/racoon.conf.5
diff -u src/crypto/dist/ipsec-tools/src/racoon/racoon.conf.5:1.64 src/crypto/dist/ipsec-tools/src/racoon/racoon.conf.5:1.65
--- src/crypto/dist/ipsec-tools/src/racoon/racoon.conf.5:1.64 Tue Nov 15 19:15:58 2011
+++ src/crypto/dist/ipsec-tools/src/racoon/racoon.conf.5 Thu Nov 29 15:31:25 2012
@@ -1,4 +1,4 @@
-.\" $NetBSD: racoon.conf.5,v 1.64 2011/11/15 19:15:58 wiz Exp $
+.\" $NetBSD: racoon.conf.5,v 1.65 2012/11/29 15:31:25 vanhu Exp $
.\"
.\" Id: racoon.conf.5,v 1.54 2006/08/22 18:17:17 manubsd Exp
.\"
@@ -1102,7 +1102,7 @@ Note that the kernel may not support the
.Ic des , 3des , des_iv64 , des_iv32 ,
.Ic rc5 , rc4 , idea , 3idea ,
.Ic cast128 , blowfish , null_enc ,
-.Ic twofish , rijndael , aes , camellia
+.Ic twofish , rijndael , aes , camellia , aes_gcm_16
.Pq used with ESP
.\"
.It Ic authentication_algorithm Ar algorithms ;
Index: src/crypto/dist/ipsec-tools/src/racoon/strnames.c
diff -u src/crypto/dist/ipsec-tools/src/racoon/strnames.c:1.9 src/crypto/dist/ipsec-tools/src/racoon/strnames.c:1.10
--- src/crypto/dist/ipsec-tools/src/racoon/strnames.c:1.9 Mon Jul 14 05:40:13 2008
+++ src/crypto/dist/ipsec-tools/src/racoon/strnames.c Thu Nov 29 15:31:25 2012
@@ -1,4 +1,4 @@
-/* $NetBSD: strnames.c,v 1.9 2008/07/14 05:40:13 tteras Exp $ */
+/* $NetBSD: strnames.c,v 1.10 2012/11/29 15:31:25 vanhu Exp $ */
/* $KAME: strnames.c,v 1.25 2003/11/13 10:53:26 itojun Exp $ */
@@ -471,6 +471,7 @@ static struct ksmap name_ipsecdoi_trns_e
{ IPSECDOI_ESP_RC4, "RC4", NULL },
{ IPSECDOI_ESP_NULL, "NULL", NULL },
{ IPSECDOI_ESP_AES, "AES", NULL },
+{ IPSECDOI_ESP_AESGCM16, "AES_GCM_16", NULL },
{ IPSECDOI_ESP_TWOFISH, "TWOFISH", NULL },
{ IPSECDOI_ESP_CAMELLIA, "CAMELLIA", NULL },
};
@@ -583,6 +584,7 @@ static struct ksmap name_attr_ipsec_auth
{ IPSECDOI_ATTR_AUTH_HMAC_SHA2_512, "hmac-sha512", NULL },
{ IPSECDOI_ATTR_AUTH_DES_MAC, "des-mac", NULL },
{ IPSECDOI_ATTR_AUTH_KPDK, "kpdk", NULL },
+{ IPSECDOI_ATTR_AUTH_NONE, "non_auth", NULL },
};
char *
Index: src/crypto/dist/ipsec-tools/src/setkey/token.l
diff -u src/crypto/dist/ipsec-tools/src/setkey/token.l:1.17 src/crypto/dist/ipsec-tools/src/setkey/token.l:1.18
--- src/crypto/dist/ipsec-tools/src/setkey/token.l:1.17 Mon Jan 9 15:25:13 2012
+++ src/crypto/dist/ipsec-tools/src/setkey/token.l Thu Nov 29 15:31:25 2012
@@ -1,4 +1,4 @@
-/* $NetBSD: token.l,v 1.17 2012/01/09 15:25:13 drochner Exp $ */
+/* $NetBSD: token.l,v 1.18 2012/11/29 15:31:25 vanhu Exp $ */
/* $KAME: token.l,v 1.44 2003/10/21 07:20:58 itojun Exp $ */
@@ -233,6 +233,16 @@ tcp {
yylval.num = SADB_X_EALG_AESGMAC; BEGIN INITIAL; return(ALG_ENC);
#endif
}
+<S_ENCALG>aes-gcm-16 {
+#ifdef SADB_X_EALG_AESGCM16
+ yylval.num = SADB_X_EALG_AESGCM16; BEGIN INITIAL; return(ALG_ENC);
+#endif
+}
+<S_ENCALG>aes-gmac {
+#ifdef SADB_X_EALG_AESGMAC
+ yylval.num = SADB_X_EALG_AESGMAC; BEGIN INITIAL; return(ALG_ENC);
+#endif
+}
/* compression algorithms */
{hyphen}C { return(F_COMP); }