]> git.ipfire.org Git - thirdparty/strongswan.git/commitdiff
crypto: Define MODP_CUSTOM outside of IKE DH range
authorTobias Brunner <tobias@strongswan.org>
Mon, 1 Dec 2014 16:21:59 +0000 (17:21 +0100)
committerAndreas Steffen <andreas.steffen@strongswan.org>
Tue, 23 Dec 2014 14:40:01 +0000 (15:40 +0100)
Before this fix it was possible to crash charon with an IKE_SA_INIT
message containing a KE payload with DH group MODP_CUSTOM(1025).
Defining MODP_CUSTOM outside of the two byte IKE DH identifier range
prevents it from getting negotiated.

Fixes CVE-2014-9221.

src/charon-tkm/src/tkm/tkm_diffie_hellman.c
src/libstrongswan/crypto/diffie_hellman.c
src/libstrongswan/crypto/diffie_hellman.h
src/libstrongswan/plugins/gcrypt/gcrypt_dh.c
src/libstrongswan/plugins/gmp/gmp_diffie_hellman.c
src/libstrongswan/plugins/ntru/ntru_ke.c
src/libstrongswan/plugins/openssl/openssl_diffie_hellman.c
src/libstrongswan/plugins/openssl/openssl_ec_diffie_hellman.c
src/libstrongswan/plugins/pkcs11/pkcs11_dh.c

index 67db5e6d87d66f88ea9fd3f9baed383386d168dc..836e0b7f088dbdc0cb56e50dd992acda23d6b994 100644 (file)
@@ -41,7 +41,7 @@ struct private_tkm_diffie_hellman_t {
        /**
         * Diffie Hellman group number.
         */
-       u_int16_t group;
+       diffie_hellman_group_t group;
 
        /**
         * Diffie Hellman public value.
index bada1c529951c83b1ea421d538eea3dc8ef813cb..ac106e9c4d453fe2f8fc5a77ec729eadbf0b53dd 100644 (file)
@@ -42,15 +42,16 @@ ENUM_NEXT(diffie_hellman_group_names, MODP_1024_160, ECP_512_BP, ECP_521_BIT,
        "ECP_256_BP",
        "ECP_384_BP",
        "ECP_512_BP");
-ENUM_NEXT(diffie_hellman_group_names, MODP_NULL, MODP_CUSTOM, ECP_512_BP,
-       "MODP_NULL",
-       "MODP_CUSTOM");
-ENUM_NEXT(diffie_hellman_group_names, NTRU_112_BIT, NTRU_256_BIT, MODP_CUSTOM,
+ENUM_NEXT(diffie_hellman_group_names, MODP_NULL, MODP_NULL, ECP_512_BP,
+       "MODP_NULL");
+ENUM_NEXT(diffie_hellman_group_names, NTRU_112_BIT, NTRU_256_BIT, MODP_NULL,
        "NTRU_112",
        "NTRU_128",
        "NTRU_192",
        "NTRU_256");
-ENUM_END(diffie_hellman_group_names, NTRU_256_BIT);
+ENUM_NEXT(diffie_hellman_group_names, MODP_CUSTOM, MODP_CUSTOM, NTRU_256_BIT,
+       "MODP_CUSTOM");
+ENUM_END(diffie_hellman_group_names, MODP_CUSTOM);
 
 
 /**
index 105db22f14d4961051537d4970d2a48631f99920..d5161d077bb20e8bf1d0ee75ad6e3b74b8a6f971 100644 (file)
@@ -63,12 +63,14 @@ enum diffie_hellman_group_t {
        /** insecure NULL diffie hellman group for testing, in PRIVATE USE */
        MODP_NULL = 1024,
        /** MODP group with custom generator/prime */
-       MODP_CUSTOM = 1025,
        /** Parameters defined by IEEE 1363.1, in PRIVATE USE */
        NTRU_112_BIT = 1030,
        NTRU_128_BIT = 1031,
        NTRU_192_BIT = 1032,
-       NTRU_256_BIT = 1033
+       NTRU_256_BIT = 1033,
+       /** internally used DH group with additional parameters g and p, outside
+        * of PRIVATE USE (i.e. IKEv2 DH group range) so it can't be negotiated */
+       MODP_CUSTOM = 65536,
 };
 
 /**
index f418b941db866e4c91b44a2f545aaf5aa82297ab..299865da2e09264bfbac8c95720a2f458dbc97df 100644 (file)
@@ -35,7 +35,7 @@ struct private_gcrypt_dh_t {
        /**
         * Diffie Hellman group number
         */
-       u_int16_t group;
+       diffie_hellman_group_t group;
 
        /*
         * Generator value
index b74d35169f44795feef092fe12191fd5845a567f..9936f7e4518fb0f428e38b1a5cab2ae7e8628807 100644 (file)
@@ -42,7 +42,7 @@ struct private_gmp_diffie_hellman_t {
        /**
         * Diffie Hellman group number.
         */
-       u_int16_t group;
+       diffie_hellman_group_t group;
 
        /*
         * Generator value.
index abaa2233622196075b4e2073948bc4e1cc08ceda..e64f32b91d0e8edc16e70cf39b36fc15bab142a6 100644 (file)
@@ -56,7 +56,7 @@ struct private_ntru_ke_t {
        /**
         * Diffie Hellman group number.
         */
-       u_int16_t group;
+       diffie_hellman_group_t group;
 
        /**
         * NTRU Parameter Set
index ff33824736667d4bdede6b3db63277598a191359..1e68ac59b838f064ebca36bfed677c5886a3cb77 100644 (file)
@@ -38,7 +38,7 @@ struct private_openssl_diffie_hellman_t {
        /**
         * Diffie Hellman group number.
         */
-       u_int16_t group;
+       diffie_hellman_group_t group;
 
        /**
         * Diffie Hellman object
index b487d59a59a3ce8c062b0daf65282dcfaca6dff8..50853d6f0bdeefbe58f5e333e94ad680d9dc3adf 100644 (file)
@@ -40,7 +40,7 @@ struct private_openssl_ec_diffie_hellman_t {
        /**
         * Diffie Hellman group number.
         */
-       u_int16_t group;
+       diffie_hellman_group_t group;
 
        /**
         * EC private (public) key
index 36cc284bf2b57d35fbd6fe67451854aa88c5c1e0..23b63d2386af19a83ef64e7a02451b279f6b4c55 100644 (file)
@@ -47,7 +47,7 @@ struct private_pkcs11_dh_t {
        /**
         * Diffie Hellman group number.
         */
-       u_int16_t group;
+       diffie_hellman_group_t group;
 
        /**
         * Handle for own private value