New attempt.  This performs the check at parse time in validate_sa().

(Yes, I'm aware that the regression tests will also require some
tweaking.)

Index: ipsecctl.h
===================================================================
RCS file: /cvs/src/sbin/ipsecctl/ipsecctl.h,v
retrieving revision 1.65
diff -u -p -r1.65 ipsecctl.h
--- ipsecctl.h  5 Jul 2012 09:02:20 -0000       1.65
+++ ipsecctl.h  8 Jul 2012 13:54:02 -0000
@@ -143,7 +143,8 @@ struct ipsec_xf {
        u_int16_t        id;
        size_t           keymin;
        size_t           keymax;
-       int              noauth;
+       u_int8_t         noauth;
+       u_int8_t         nostatic;
 };
 
 struct ipsec_transforms {
Index: parse.y
===================================================================
RCS file: /cvs/src/sbin/ipsecctl/parse.y,v
retrieving revision 1.154
diff -u -p -r1.154 parse.y
--- parse.y     7 Jul 2012 20:29:23 -0000       1.154
+++ parse.y     8 Jul 2012 14:10:26 -0000
@@ -98,28 +98,28 @@ const struct ipsec_xf authxfs[] = {
 };
 
 const struct ipsec_xf encxfs[] = {
-       { "unknown",            ENCXF_UNKNOWN,          0,      0,      0 },
-       { "none",               ENCXF_NONE,             0,      0,      0 },
-       { "3des-cbc",           ENCXF_3DES_CBC,         24,     24,     0 },
-       { "des-cbc",            ENCXF_DES_CBC,          8,      8,      0 },
-       { "aes",                ENCXF_AES,              16,     32,     0 },
-       { "aes-128",            ENCXF_AES_128,          16,     16,     0 },
-       { "aes-192",            ENCXF_AES_192,          24,     24,     0 },
-       { "aes-256",            ENCXF_AES_256,          32,     32,     0 },
-       { "aesctr",             ENCXF_AESCTR,           16+4,   32+4,   0 },
-       { "aes-128-ctr",        ENCXF_AES_128_CTR,      16+4,   16+4,   0 },
-       { "aes-192-ctr",        ENCXF_AES_192_CTR,      24+4,   24+4,   0 },
-       { "aes-256-ctr",        ENCXF_AES_256_CTR,      32+4,   32+4,   0 },
-       { "aes-128-gcm",        ENCXF_AES_128_GCM,      16+4,   16+4,   1 },
-       { "aes-192-gcm",        ENCXF_AES_192_GCM,      24+4,   24+4,   1 },
-       { "aes-256-gcm",        ENCXF_AES_256_GCM,      32+4,   32+4,   1 },
-       { "aes-128-gmac",       ENCXF_AES_128_GMAC,     16+4,   16+4,   1 },
-       { "aes-192-gmac",       ENCXF_AES_192_GMAC,     24+4,   24+4,   1 },
-       { "aes-256-gmac",       ENCXF_AES_256_GMAC,     32+4,   32+4,   1 },
-       { "blowfish",           ENCXF_BLOWFISH,         5,      56,     0 },
-       { "cast128",            ENCXF_CAST128,          5,      16,     0 },
-       { "null",               ENCXF_NULL,             0,      0,      0 },
-       { NULL,                 0,                      0,      0,      0 },
+       { "unknown",            ENCXF_UNKNOWN,          0,      0,      0, 0 },
+       { "none",               ENCXF_NONE,             0,      0,      0, 0 },
+       { "3des-cbc",           ENCXF_3DES_CBC,         24,     24,     0, 0 },
+       { "des-cbc",            ENCXF_DES_CBC,          8,      8,      0, 0 },
+       { "aes",                ENCXF_AES,              16,     32,     0, 0 },
+       { "aes-128",            ENCXF_AES_128,          16,     16,     0, 0 },
+       { "aes-192",            ENCXF_AES_192,          24,     24,     0, 0 },
+       { "aes-256",            ENCXF_AES_256,          32,     32,     0, 0 },
+       { "aesctr",             ENCXF_AESCTR,           16+4,   32+4,   0, 1 },
+       { "aes-128-ctr",        ENCXF_AES_128_CTR,      16+4,   16+4,   0, 1 },
+       { "aes-192-ctr",        ENCXF_AES_192_CTR,      24+4,   24+4,   0, 1 },
+       { "aes-256-ctr",        ENCXF_AES_256_CTR,      32+4,   32+4,   0, 1 },
+       { "aes-128-gcm",        ENCXF_AES_128_GCM,      16+4,   16+4,   1, 1 },
+       { "aes-192-gcm",        ENCXF_AES_192_GCM,      24+4,   24+4,   1, 1 },
+       { "aes-256-gcm",        ENCXF_AES_256_GCM,      32+4,   32+4,   1, 1 },
+       { "aes-128-gmac",       ENCXF_AES_128_GMAC,     16+4,   16+4,   1, 1 },
+       { "aes-192-gmac",       ENCXF_AES_192_GMAC,     24+4,   24+4,   1, 1 },
+       { "aes-256-gmac",       ENCXF_AES_256_GMAC,     32+4,   32+4,   1, 1 },
+       { "blowfish",           ENCXF_BLOWFISH,         5,      56,     0, 0 },
+       { "cast128",            ENCXF_CAST128,          5,      16,     0, 0 },
+       { "null",               ENCXF_NULL,             0,      0,      0, 0 },
+       { NULL,                 0,                      0,      0,      0, 0 },
 };
 
 const struct ipsec_xf compxfs[] = {
@@ -2219,6 +2219,11 @@ validate_sa(u_int32_t spi, u_int8_t saty
                }
                if (!xfs->encxf)
                        xfs->encxf = &encxfs[ENCXF_AES];
+               if (xfs->encxf->nostatic) {
+                       yyerror("%s is disallowed with static keys",
+                           xfs->encxf->name);
+                       return 0;
+               }
                if (xfs->encxf->noauth && xfs->authxf) {
                        yyerror("authentication is implicit for %s",
                            xfs->encxf->name);
-- 
Christian "naddy" Weisgerber                          na...@mips.inka.de

Reply via email to