On Tue, Nov 12, 2019 at 09:57:31AM +0100, Mike Belopuhov wrote:
> Hi Tobias,
> 
> I see, however, I don't think iked would negotiate an SA
> without ESN support if the other side supports ESN, so I'm
> not sure how "enforcing" changes that.

It doesn't, but if I have an iked on both sides one will have to
make the decision. I have another case where I actually can not
use ESN, with two ikeds this can not be configured currently.

> In any case, I'm not opposed to adding a toggle if you guys
> need it, but could you please adjust the grammar so that "esn"
> and "no esn" are used instead of "on" and "off" since that's
> what we're normally doing.  "on" and "off" are clutches for
> simple file formats, parse.y allows you to make it a bit nicer.

Makes sense. Here is the updated diff including a fix for bluhms
comment.

Index: iked.conf.5
===================================================================
RCS file: /mount/openbsd/cvs/src/sbin/iked/iked.conf.5,v
retrieving revision 1.57
diff -u -p -r1.57 iked.conf.5
--- iked.conf.5 24 Aug 2019 13:24:49 -0000      1.57
+++ iked.conf.5 12 Nov 2019 13:49:37 -0000
@@ -409,6 +409,7 @@ multiple crypto transforms.
 .Ic auth Ar algorithm
 .Ic enc Ar algorithm
 .Ic group Ar group
+.Ic esn
 .Xc
 These parameters define the cryptographic transforms to be used for
 the Child SA negotiation, also known as phase 2.
@@ -421,6 +422,7 @@ Possible values for
 .Ic auth ,
 .Ic enc ,
 .Ic group ,
+.Ic esn ,
 and the default proposals are described below in
 .Sx CRYPTO TRANSFORMS .
 If omitted,
@@ -849,6 +851,17 @@ not encryption:
 .It Li aes-192-gmac Ta "224 bits" Ta "[ESP only]"
 .It Li aes-256-gmac Ta "288 bits" Ta "[ESP only]"
 .It Li null Ta "" Ta "[ESP only]"
+.El
+.Pp
+The Extended Sequence Numbers option can be enabled or disabled with the
+.Ic esn
+or
+.Ic noesn
+keywords:
+.Bl -column "noesn" "[ESP only]" -offset indent
+.It Em ESN
+.It Li esn Ta "[ESP only]"
+.It Li noesn Ta "[ESP only]"
 .El
 .Pp
 Transforms followed by
Index: parse.y
===================================================================
RCS file: /mount/openbsd/cvs/src/sbin/iked/parse.y,v
retrieving revision 1.84
diff -u -p -r1.84 parse.y
--- parse.y     26 Sep 2019 07:33:36 -0000      1.84
+++ parse.y     12 Nov 2019 13:54:04 -0000
@@ -127,6 +127,8 @@ struct ipsec_transforms {
        unsigned int              nencxf;
        const struct ipsec_xf   **groupxf;
        unsigned int              ngroupxf;
+       const struct ipsec_xf   **esnxf;
+       unsigned int              nesnxf;
 };
 
 struct ipsec_mode {
@@ -259,6 +261,12 @@ const struct ipsec_xf groupxfs[] = {
        { NULL }
 };
 
+const struct ipsec_xf esnxfs[] = {
+       { "esn",                IKEV2_XFORMESN_ESN },
+       { "noesn",              IKEV2_XFORMESN_NONE },
+       { NULL }
+};
+
 const struct ipsec_xf methodxfs[] = {
        { "none",               IKEV2_AUTH_NONE },
        { "rsa",                IKEV2_AUTH_RSA_SIG },
@@ -395,7 +403,7 @@ typedef struct {
 %}
 
 %token FROM ESP AH IN PEER ON OUT TO SRCID DSTID PSK PORT
-%token FILENAME AUTHXF PRFXF ENCXF ERROR IKEV2 IKESA CHILDSA
+%token FILENAME AUTHXF PRFXF ENCXF ERROR IKEV2 IKESA CHILDSA ESN NOESN
 %token PASSIVE ACTIVE ANY TAG TAP PROTO LOCAL GROUP NAME CONFIG EAP USER
 %token IKEV1 FLOW SA TCPMD5 TUNNEL TRANSPORT COUPLE DECOUPLE SET
 %token INCLUDE LIFETIME BYTES INET INET6 QUICK SKIP DEFAULT
@@ -425,6 +433,7 @@ typedef struct {
 %type  <v.number>              byte_spec time_spec ikelifetime
 %type  <v.string>              name
 %type  <v.cfg>                 cfg ikecfg ikecfgvals
+%type  <v.string>              transform_esn
 %%
 
 grammar                : /* empty */
@@ -802,6 +811,24 @@ transform  : AUTHXF STRING                 {
                        ipsec_transforms->groupxf = xfs;
                        ipsec_transforms->ngroupxf++;
                }
+               | transform_esn                         {
+                       const struct ipsec_xf **xfs = ipsec_transforms->esnxf;
+                       size_t nxfs = ipsec_transforms->nesnxf;
+                       xfs = recallocarray(xfs, nxfs, nxfs + 1,
+                           sizeof(struct ipsec_xf *));
+                       if (xfs == NULL)
+                               err(1, "transform: recallocarray");
+                       if ((xfs[nxfs] = parse_xf($1, 0, esnxfs)) == NULL) {
+                               yyerror("%s not a valid transform", $1);
+                               YYERROR;
+                       }
+                       ipsec_transforms->esnxf = xfs;
+                       ipsec_transforms->nesnxf++;
+               }
+               ;
+
+transform_esn  : ESN           { $$ = "esn"; }
+               | NOESN         { $$ = "noesn"; }
                ;
 
 ike_sas                :                                       {
@@ -1180,6 +1207,7 @@ lookup(char *s)
                { "dstid",              DSTID },
                { "eap",                EAP },
                { "enc",                ENCXF },
+               { "esn",                ESN },
                { "esp",                ESP },
                { "file",               FILENAME },
                { "flow",               FLOW },
@@ -1198,6 +1226,7 @@ lookup(char *s)
                { "local",              LOCAL },
                { "mobike",             MOBIKE },
                { "name",               NAME },
+               { "noesn",              NOESN },
                { "nofragmentation",    NOFRAGMENTATION },
                { "nomobike",           NOMOBIKE },
                { "ocsp",               OCSP },
@@ -2578,6 +2607,10 @@ print_policy(struct iked_policy *pol)
                                                print_verbose(" group ");
                                                xfs = groupxfs;
                                                break;
+                                       case IKEV2_XFORMTYPE_ESN:
+                                               print_verbose(" ");
+                                               xfs = esnxfs;
+                                               break;
                                        default:
                                                continue;
                                        }
@@ -2830,6 +2863,11 @@ create_ike(char *name, int af, uint8_t i
                pol.pol_nproposals++;
        } else {
                for (i = 0; i < ike_sa->nxfs; i++) {
+                       if (ike_sa->xfs[i]->nesnxf) {
+                               yyerror("cannot use ESN with ikesa.");
+                               goto done;
+                       }
+
                        if ((p = calloc(1, sizeof(*p))) == NULL)
                                err(1, "%s", __func__);
 
@@ -2914,7 +2952,8 @@ create_ike(char *name, int af, uint8_t i
                            ikev2_default_esp_transforms,
                            ikev2_default_nesp_transforms);
                        copy_transforms(IKEV2_XFORMTYPE_ESN,
-                           NULL, 0, &xf, &xfi,
+                           ipsec_sa->xfs[i]->esnxf,
+                           ipsec_sa->xfs[i]->nesnxf, &xf, &xfi,
                            ikev2_default_esp_transforms,
                            ikev2_default_nesp_transforms);
 

Reply via email to