stroke: Make 96-bit truncation for SHA-256 configurable
authorTobias Brunner <tobias@strongswan.org>
Wed, 10 May 2017 17:32:53 +0000 (19:32 +0200)
committerTobias Brunner <tobias@strongswan.org>
Fri, 26 May 2017 09:22:28 +0000 (11:22 +0200)
man/ipsec.conf.5.in
src/libcharon/plugins/stroke/stroke_config.c
src/libcharon/plugins/stroke/stroke_socket.c
src/starter/args.c
src/starter/confread.h
src/starter/keywords.h
src/starter/keywords.txt
src/starter/starterstroke.c
src/stroke/stroke_msg.h

index ee7d860..fef44ae 100644 (file)
@@ -1141,6 +1141,13 @@ a value of 0 disables IPsec replay protection.
 .BR reqid " = <number>"
 sets the reqid for a given connection to a pre-configured fixed value.
 .TP
+.BR sha256_96 " = " no " | yes"
+HMAC-SHA-256 is used with 128-bit truncation with IPsec. For compatibility
+with implementations that incorrectly use 96-bit truncation this option may be
+enabled to configure the shorter truncation length in the kernel.  This is not
+negotiated, so this only works with peers that use the incorrect truncation
+length (or have this option enabled).
+.TP
 .BR tfc " = <value>"
 number of bytes to pad ESP payload data to. Traffic Flow Confidentiality
 is currently supported in IKEv2 and applies to outgoing packets only. The
index a9d0736..d47787d 100644 (file)
@@ -1074,7 +1074,8 @@ static child_cfg_t *build_child_cfg(private_stroke_config_t *this,
                .options = (msg->add_conn.proxy_mode ? OPT_PROXY_MODE : 0) |
                                   (msg->add_conn.ipcomp ? OPT_IPCOMP : 0) |
                                   (msg->add_conn.me.hostaccess ? OPT_HOSTACCESS : 0) |
-                                  (msg->add_conn.install_policy ? 0 : OPT_NO_POLICIES),
+                                  (msg->add_conn.install_policy ? 0 : OPT_NO_POLICIES) |
+                                  (msg->add_conn.sha256_96 ? OPT_SHA256_96 : 0),
                .tfc = msg->add_conn.tfc,
                .inactivity = msg->add_conn.inactivity,
                .dpd_action = map_action(msg->add_conn.dpd.action),
index 46de90c..65d345d 100644 (file)
@@ -216,6 +216,7 @@ static void stroke_add_conn(private_stroke_socket_t *this, stroke_msg_t *msg)
        DBG_OPT("  dpdtimeout=%d", msg->add_conn.dpd.timeout);
        DBG_OPT("  dpdaction=%d", msg->add_conn.dpd.action);
        DBG_OPT("  closeaction=%d", msg->add_conn.close_action);
+       DBG_OPT("  sha256_96=%s", msg->add_conn.sha256_96 ? "yes" : "no");
        DBG_OPT("  mediation=%s", msg->add_conn.ikeme.mediation ? "yes" : "no");
        DBG_OPT("  mediated_by=%s", msg->add_conn.ikeme.mediated_by);
        DBG_OPT("  me_peerid=%s", msg->add_conn.ikeme.peerid);
index 7f010d3..477a520 100644 (file)
@@ -165,6 +165,7 @@ static const token_info_t token_info[] =
        { ARG_TIME, offsetof(starter_conn_t, dpd_timeout), NULL                        },
        { ARG_ENUM, offsetof(starter_conn_t, dpd_action), LST_dpd_action               },
        { ARG_ENUM, offsetof(starter_conn_t, close_action), LST_dpd_action             },
+       { ARG_ENUM, offsetof(starter_conn_t, sha256_96), LST_bool                      },
        { ARG_TIME, offsetof(starter_conn_t, inactivity), NULL                         },
        { ARG_MISC, 0, NULL  /* KW_MODECONFIG */                                       },
        { ARG_MISC, 0, NULL  /* KW_XAUTH */                                            },
index 2b974d1..8ee730d 100644 (file)
@@ -162,6 +162,8 @@ struct starter_conn {
 
                dpd_action_t    close_action;
 
+               bool            sha256_96;
+
                time_t          inactivity;
 
                bool            me_mediation;
index 94af493..0cb46a7 100644 (file)
@@ -64,6 +64,7 @@ enum kw_token_t {
        KW_DPDTIMEOUT,
        KW_DPDACTION,
        KW_CLOSEACTION,
+       KW_SHA256_96,
        KW_INACTIVITY,
        KW_MODECONFIG,
        KW_XAUTH,
index ee0bd31..3f92dc8 100644 (file)
@@ -61,6 +61,7 @@ dpddelay,          KW_DPDDELAY
 dpdtimeout,        KW_DPDTIMEOUT
 dpdaction,         KW_DPDACTION
 closeaction,       KW_CLOSEACTION
+sha256_96,         KW_SHA256_96
 inactivity,        KW_INACTIVITY
 modeconfig,        KW_MODECONFIG
 xauth,             KW_XAUTH
index b92c00c..90af937 100644 (file)
@@ -220,6 +220,7 @@ int starter_stroke_add_conn(starter_config_t *cfg, starter_conn_t *conn)
        msg->add_conn.dpd.timeout = conn->dpd_timeout;
        msg->add_conn.dpd.action = conn->dpd_action;
        msg->add_conn.close_action = conn->close_action;
+       msg->add_conn.sha256_96 = conn->sha256_96;
        msg->add_conn.inactivity = conn->inactivity;
        msg->add_conn.ikeme.mediation = conn->me_mediation;
        push_string(&msg, add_conn.ikeme.mediated_by, conn->me_mediated_by);
index a3b911d..60ea002 100644 (file)
@@ -302,6 +302,7 @@ struct stroke_msg_t {
                        } mark_in, mark_out;
                        stroke_end_t me, other;
                        uint32_t replay_window;
+                       bool sha256_96;
                } add_conn;
 
                /* data for STR_ADD_CA */