2 * Copyright (c) 2015 Cisco and/or its affiliates.
3 * Licensed under the Apache License, Version 2.0 (the "License");
4 * you may not use this file except in compliance with the License.
5 * You may obtain a copy of the License at:
7 * http://www.apache.org/licenses/LICENSE-2.0
9 * Unless required by applicable law or agreed to in writing, software
10 * distributed under the License is distributed on an "AS IS" BASIS,
11 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
12 * See the License for the specific language governing permissions and
13 * limitations under the License.
16 #include <vlib/vlib.h>
17 #include <vnet/vnet.h>
18 #include <vnet/pg/pg.h>
19 #include <vppinfra/error.h>
20 #include <vnet/udp/udp.h>
21 #include <plugins/ikev2/ikev2.h>
22 #include <plugins/ikev2/ikev2_priv.h>
23 #include <openssl/obj_mac.h>
24 #include <openssl/ec.h>
25 #include <openssl/x509.h>
26 #include <openssl/pem.h>
27 #include <openssl/bn.h>
28 #include <openssl/dh.h>
31 static const char modp_dh_768_prime[] =
32 "FFFFFFFFFFFFFFFFC90FDAA22168C234C4C6628B80DC1CD1"
33 "29024E088A67CC74020BBEA63B139B22514A08798E3404DD"
34 "EF9519B3CD3A431B302B0A6DF25F14374FE1356D6D51C245"
35 "E485B576625E7EC6F44C42E9A63A3620FFFFFFFFFFFFFFFF";
36 static const char modp_dh_768_generator[] = "02";
38 static const char modp_dh_1024_prime[] =
39 "FFFFFFFFFFFFFFFFC90FDAA22168C234C4C6628B80DC1CD1"
40 "29024E088A67CC74020BBEA63B139B22514A08798E3404DD"
41 "EF9519B3CD3A431B302B0A6DF25F14374FE1356D6D51C245"
42 "E485B576625E7EC6F44C42E9A637ED6B0BFF5CB6F406B7ED"
43 "EE386BFB5A899FA5AE9F24117C4B1FE649286651ECE65381" "FFFFFFFFFFFFFFFF";
44 static const char modp_dh_1024_generator[] = "02";
47 static const char modp_dh_1536_prime[] =
48 "FFFFFFFFFFFFFFFFC90FDAA22168C234C4C6628B80DC1CD1"
49 "29024E088A67CC74020BBEA63B139B22514A08798E3404DD"
50 "EF9519B3CD3A431B302B0A6DF25F14374FE1356D6D51C245"
51 "E485B576625E7EC6F44C42E9A637ED6B0BFF5CB6F406B7ED"
52 "EE386BFB5A899FA5AE9F24117C4B1FE649286651ECE45B3D"
53 "C2007CB8A163BF0598DA48361C55D39A69163FA8FD24CF5F"
54 "83655D23DCA3AD961C62F356208552BB9ED529077096966D"
55 "670C354E4ABC9804F1746C08CA237327FFFFFFFFFFFFFFFF";
56 static const char modp_dh_1536_generator[] = "02";
58 static const char modp_dh_2048_prime[] =
59 "FFFFFFFFFFFFFFFFC90FDAA22168C234C4C6628B80DC1CD1"
60 "29024E088A67CC74020BBEA63B139B22514A08798E3404DD"
61 "EF9519B3CD3A431B302B0A6DF25F14374FE1356D6D51C245"
62 "E485B576625E7EC6F44C42E9A637ED6B0BFF5CB6F406B7ED"
63 "EE386BFB5A899FA5AE9F24117C4B1FE649286651ECE45B3D"
64 "C2007CB8A163BF0598DA48361C55D39A69163FA8FD24CF5F"
65 "83655D23DCA3AD961C62F356208552BB9ED529077096966D"
66 "670C354E4ABC9804F1746C08CA18217C32905E462E36CE3B"
67 "E39E772C180E86039B2783A2EC07A28FB5C55DF06F4C52C9"
68 "DE2BCBF6955817183995497CEA956AE515D2261898FA0510"
69 "15728E5A8AACAA68FFFFFFFFFFFFFFFF";
70 static const char modp_dh_2048_generator[] = "02";
72 static const char modp_dh_3072_prime[] =
73 "FFFFFFFFFFFFFFFFC90FDAA22168C234C4C6628B80DC1CD1"
74 "29024E088A67CC74020BBEA63B139B22514A08798E3404DD"
75 "EF9519B3CD3A431B302B0A6DF25F14374FE1356D6D51C245"
76 "E485B576625E7EC6F44C42E9A637ED6B0BFF5CB6F406B7ED"
77 "EE386BFB5A899FA5AE9F24117C4B1FE649286651ECE45B3D"
78 "C2007CB8A163BF0598DA48361C55D39A69163FA8FD24CF5F"
79 "83655D23DCA3AD961C62F356208552BB9ED529077096966D"
80 "670C354E4ABC9804F1746C08CA18217C32905E462E36CE3B"
81 "E39E772C180E86039B2783A2EC07A28FB5C55DF06F4C52C9"
82 "DE2BCBF6955817183995497CEA956AE515D2261898FA0510"
83 "15728E5A8AAAC42DAD33170D04507A33A85521ABDF1CBA64"
84 "ECFB850458DBEF0A8AEA71575D060C7DB3970F85A6E1E4C7"
85 "ABF5AE8CDB0933D71E8C94E04A25619DCEE3D2261AD2EE6B"
86 "F12FFA06D98A0864D87602733EC86A64521F2B18177B200C"
87 "BBE117577A615D6C770988C0BAD946E208E24FA074E5AB31"
88 "43DB5BFCE0FD108E4B82D120A93AD2CAFFFFFFFFFFFFFFFF";
89 static const char modp_dh_3072_generator[] = "02";
91 static const char modp_dh_4096_prime[] =
92 "FFFFFFFFFFFFFFFFC90FDAA22168C234C4C6628B80DC1CD1"
93 "29024E088A67CC74020BBEA63B139B22514A08798E3404DD"
94 "EF9519B3CD3A431B302B0A6DF25F14374FE1356D6D51C245"
95 "E485B576625E7EC6F44C42E9A637ED6B0BFF5CB6F406B7ED"
96 "EE386BFB5A899FA5AE9F24117C4B1FE649286651ECE45B3D"
97 "C2007CB8A163BF0598DA48361C55D39A69163FA8FD24CF5F"
98 "83655D23DCA3AD961C62F356208552BB9ED529077096966D"
99 "670C354E4ABC9804F1746C08CA18217C32905E462E36CE3B"
100 "E39E772C180E86039B2783A2EC07A28FB5C55DF06F4C52C9"
101 "DE2BCBF6955817183995497CEA956AE515D2261898FA0510"
102 "15728E5A8AAAC42DAD33170D04507A33A85521ABDF1CBA64"
103 "ECFB850458DBEF0A8AEA71575D060C7DB3970F85A6E1E4C7"
104 "ABF5AE8CDB0933D71E8C94E04A25619DCEE3D2261AD2EE6B"
105 "F12FFA06D98A0864D87602733EC86A64521F2B18177B200C"
106 "BBE117577A615D6C770988C0BAD946E208E24FA074E5AB31"
107 "43DB5BFCE0FD108E4B82D120A92108011A723C12A787E6D7"
108 "88719A10BDBA5B2699C327186AF4E23C1A946834B6150BDA"
109 "2583E9CA2AD44CE8DBBBC2DB04DE8EF92E8EFC141FBECAA6"
110 "287C59474E6BC05D99B2964FA090C3A2233BA186515BE7ED"
111 "1F612970CEE2D7AFB81BDD762170481CD0069127D5B05AA9"
112 "93B4EA988D8FDDC186FFB7DC90A6C08F4DF435C934063199" "FFFFFFFFFFFFFFFF";
113 static const char modp_dh_4096_generator[] = "02";
115 static const char modp_dh_6144_prime[] =
116 "FFFFFFFFFFFFFFFFC90FDAA22168C234C4C6628B80DC1CD129024E08"
117 "8A67CC74020BBEA63B139B22514A08798E3404DDEF9519B3CD3A431B"
118 "302B0A6DF25F14374FE1356D6D51C245E485B576625E7EC6F44C42E9"
119 "A637ED6B0BFF5CB6F406B7EDEE386BFB5A899FA5AE9F24117C4B1FE6"
120 "49286651ECE45B3DC2007CB8A163BF0598DA48361C55D39A69163FA8"
121 "FD24CF5F83655D23DCA3AD961C62F356208552BB9ED529077096966D"
122 "670C354E4ABC9804F1746C08CA18217C32905E462E36CE3BE39E772C"
123 "180E86039B2783A2EC07A28FB5C55DF06F4C52C9DE2BCBF695581718"
124 "3995497CEA956AE515D2261898FA051015728E5A8AAAC42DAD33170D"
125 "04507A33A85521ABDF1CBA64ECFB850458DBEF0A8AEA71575D060C7D"
126 "B3970F85A6E1E4C7ABF5AE8CDB0933D71E8C94E04A25619DCEE3D226"
127 "1AD2EE6BF12FFA06D98A0864D87602733EC86A64521F2B18177B200C"
128 "BBE117577A615D6C770988C0BAD946E208E24FA074E5AB3143DB5BFC"
129 "E0FD108E4B82D120A92108011A723C12A787E6D788719A10BDBA5B26"
130 "99C327186AF4E23C1A946834B6150BDA2583E9CA2AD44CE8DBBBC2DB"
131 "04DE8EF92E8EFC141FBECAA6287C59474E6BC05D99B2964FA090C3A2"
132 "233BA186515BE7ED1F612970CEE2D7AFB81BDD762170481CD0069127"
133 "D5B05AA993B4EA988D8FDDC186FFB7DC90A6C08F4DF435C934028492"
134 "36C3FAB4D27C7026C1D4DCB2602646DEC9751E763DBA37BDF8FF9406"
135 "AD9E530EE5DB382F413001AEB06A53ED9027D831179727B0865A8918"
136 "DA3EDBEBCF9B14ED44CE6CBACED4BB1BDB7F1447E6CC254B33205151"
137 "2BD7AF426FB8F401378CD2BF5983CA01C64B92ECF032EA15D1721D03"
138 "F482D7CE6E74FEF6D55E702F46980C82B5A84031900B1C9E59E7C97F"
139 "BEC7E8F323A97A7E36CC88BE0F1D45B7FF585AC54BD407B22B4154AA"
140 "CC8F6D7EBF48E1D814CC5ED20F8037E0A79715EEF29BE32806A1D58B"
141 "B7C5DA76F550AA3D8A1FBFF0EB19CCB1A313D55CDA56C9EC2EF29632"
142 "387FE8D76E3C0468043E8F663F4860EE12BF2D5B0B7474D6E694F91E"
143 "6DCC4024FFFFFFFFFFFFFFFF";
144 static const char modp_dh_6144_generator[] = "02";
146 static const char modp_dh_8192_prime[] =
147 "FFFFFFFFFFFFFFFFC90FDAA22168C234C4C6628B80DC1CD1"
148 "29024E088A67CC74020BBEA63B139B22514A08798E3404DD"
149 "EF9519B3CD3A431B302B0A6DF25F14374FE1356D6D51C245"
150 "E485B576625E7EC6F44C42E9A637ED6B0BFF5CB6F406B7ED"
151 "EE386BFB5A899FA5AE9F24117C4B1FE649286651ECE45B3D"
152 "C2007CB8A163BF0598DA48361C55D39A69163FA8FD24CF5F"
153 "83655D23DCA3AD961C62F356208552BB9ED529077096966D"
154 "670C354E4ABC9804F1746C08CA18217C32905E462E36CE3B"
155 "E39E772C180E86039B2783A2EC07A28FB5C55DF06F4C52C9"
156 "DE2BCBF6955817183995497CEA956AE515D2261898FA0510"
157 "15728E5A8AAAC42DAD33170D04507A33A85521ABDF1CBA64"
158 "ECFB850458DBEF0A8AEA71575D060C7DB3970F85A6E1E4C7"
159 "ABF5AE8CDB0933D71E8C94E04A25619DCEE3D2261AD2EE6B"
160 "F12FFA06D98A0864D87602733EC86A64521F2B18177B200C"
161 "BBE117577A615D6C770988C0BAD946E208E24FA074E5AB31"
162 "43DB5BFCE0FD108E4B82D120A92108011A723C12A787E6D7"
163 "88719A10BDBA5B2699C327186AF4E23C1A946834B6150BDA"
164 "2583E9CA2AD44CE8DBBBC2DB04DE8EF92E8EFC141FBECAA6"
165 "287C59474E6BC05D99B2964FA090C3A2233BA186515BE7ED"
166 "1F612970CEE2D7AFB81BDD762170481CD0069127D5B05AA9"
167 "93B4EA988D8FDDC186FFB7DC90A6C08F4DF435C934028492"
168 "36C3FAB4D27C7026C1D4DCB2602646DEC9751E763DBA37BD"
169 "F8FF9406AD9E530EE5DB382F413001AEB06A53ED9027D831"
170 "179727B0865A8918DA3EDBEBCF9B14ED44CE6CBACED4BB1B"
171 "DB7F1447E6CC254B332051512BD7AF426FB8F401378CD2BF"
172 "5983CA01C64B92ECF032EA15D1721D03F482D7CE6E74FEF6"
173 "D55E702F46980C82B5A84031900B1C9E59E7C97FBEC7E8F3"
174 "23A97A7E36CC88BE0F1D45B7FF585AC54BD407B22B4154AA"
175 "CC8F6D7EBF48E1D814CC5ED20F8037E0A79715EEF29BE328"
176 "06A1D58BB7C5DA76F550AA3D8A1FBFF0EB19CCB1A313D55C"
177 "DA56C9EC2EF29632387FE8D76E3C0468043E8F663F4860EE"
178 "12BF2D5B0B7474D6E694F91E6DBE115974A3926F12FEE5E4"
179 "38777CB6A932DF8CD8BEC4D073B931BA3BC832B68D9DD300"
180 "741FA7BF8AFC47ED2576F6936BA424663AAB639C5AE4F568"
181 "3423B4742BF1C978238F16CBE39D652DE3FDB8BEFC848AD9"
182 "22222E04A4037C0713EB57A81A23F0C73473FC646CEA306B"
183 "4BCBC8862F8385DDFA9D4B7FA2C087E879683303ED5BDD3A"
184 "062B3CF5B3A278A66D2A13F83F44F82DDF310EE074AB6A36"
185 "4597E899A0255DC164F31CC50846851DF9AB48195DED7EA1"
186 "B1D510BD7EE74D73FAF36BC31ECFA268359046F4EB879F92"
187 "4009438B481C6CD7889A002ED5EE382BC9190DA6FC026E47"
188 "9558E4475677E9AA9E3050E2765694DFC81F56E880B96E71"
189 "60C980DD98EDD3DFFFFFFFFFFFFFFFFF";
190 static const char modp_dh_8192_generator[] = "02";
193 static const char modp_dh_1024_160_prime[] =
194 "B10B8F96A080E01DDE92DE5EAE5D54EC52C99FBCFB06A3C6"
195 "9A6A9DCA52D23B616073E28675A23D189838EF1E2EE652C0"
196 "13ECB4AEA906112324975C3CD49B83BFACCBDD7D90C4BD70"
197 "98488E9C219A73724EFFD6FAE5644738FAA31A4FF55BCCC0"
198 "A151AF5F0DC8B4BD45BF37DF365C1A65E68CFDA76D4DA708" "DF1FB2BC2E4A4371";
199 static const char modp_dh_1024_160_generator[] =
200 "A4D1CBD5C3FD34126765A442EFB99905F8104DD258AC507F"
201 "D6406CFF14266D31266FEA1E5C41564B777E690F5504F213"
202 "160217B4B01B886A5E91547F9E2749F4D7FBD7D3B9A92EE1"
203 "909D0D2263F80A76A6A24C087A091F531DBF0A0169B6A28A"
204 "D662A4D18E73AFA32D779D5918D08BC8858F4DCEF97C2A24" "855E6EEB22B3B2E5";
206 static const char modp_dh_2048_224_prime[] =
207 "AD107E1E9123A9D0D660FAA79559C51FA20D64E5683B9FD1"
208 "B54B1597B61D0A75E6FA141DF95A56DBAF9A3C407BA1DF15"
209 "EB3D688A309C180E1DE6B85A1274A0A66D3F8152AD6AC212"
210 "9037C9EDEFDA4DF8D91E8FEF55B7394B7AD5B7D0B6C12207"
211 "C9F98D11ED34DBF6C6BA0B2C8BBC27BE6A00E0A0B9C49708"
212 "B3BF8A317091883681286130BC8985DB1602E714415D9330"
213 "278273C7DE31EFDC7310F7121FD5A07415987D9ADC0A486D"
214 "CDF93ACC44328387315D75E198C641A480CD86A1B9E587E8"
215 "BE60E69CC928B2B9C52172E413042E9B23F10B0E16E79763"
216 "C9B53DCF4BA80A29E3FB73C16B8E75B97EF363E2FFA31F71"
217 "CF9DE5384E71B81C0AC4DFFE0C10E64F";
218 static const char modp_dh_2048_224_generator[] =
219 "AC4032EF4F2D9AE39DF30B5C8FFDAC506CDEBE7B89998CAF"
220 "74866A08CFE4FFE3A6824A4E10B9A6F0DD921F01A70C4AFA"
221 "AB739D7700C29F52C57DB17C620A8652BE5E9001A8D66AD7"
222 "C17669101999024AF4D027275AC1348BB8A762D0521BC98A"
223 "E247150422EA1ED409939D54DA7460CDB5F6C6B250717CBE"
224 "F180EB34118E98D119529A45D6F834566E3025E316A330EF"
225 "BB77A86F0C1AB15B051AE3D428C8F8ACB70A8137150B8EEB"
226 "10E183EDD19963DDD9E263E4770589EF6AA21E7F5F2FF381"
227 "B539CCE3409D13CD566AFBB48D6C019181E1BCFE94B30269"
228 "EDFE72FE9B6AA4BD7B5A0F1C71CFFF4C19C418E1F6EC0179"
229 "81BC087F2A7065B384B890D3191F2BFA";
231 static const char modp_dh_2048_256_prime[] =
232 "87A8E61DB4B6663CFFBBD19C651959998CEEF608660DD0F2"
233 "5D2CEED4435E3B00E00DF8F1D61957D4FAF7DF4561B2AA30"
234 "16C3D91134096FAA3BF4296D830E9A7C209E0C6497517ABD"
235 "5A8A9D306BCF67ED91F9E6725B4758C022E0B1EF4275BF7B"
236 "6C5BFC11D45F9088B941F54EB1E59BB8BC39A0BF12307F5C"
237 "4FDB70C581B23F76B63ACAE1CAA6B7902D52526735488A0E"
238 "F13C6D9A51BFA4AB3AD8347796524D8EF6A167B5A41825D9"
239 "67E144E5140564251CCACB83E6B486F6B3CA3F7971506026"
240 "C0B857F689962856DED4010ABD0BE621C3A3960A54E710C3"
241 "75F26375D7014103A4B54330C198AF126116D2276E11715F"
242 "693877FAD7EF09CADB094AE91E1A1597";
243 static const char modp_dh_2048_256_generator[] =
244 "3FB32C9B73134D0B2E77506660EDBD484CA7B18F21EF2054"
245 "07F4793A1A0BA12510DBC15077BE463FFF4FED4AAC0BB555"
246 "BE3A6C1B0C6B47B1BC3773BF7E8C6F62901228F8C28CBB18"
247 "A55AE31341000A650196F931C77A57F2DDF463E5E9EC144B"
248 "777DE62AAAB8A8628AC376D282D6ED3864E67982428EBC83"
249 "1D14348F6F2F9193B5045AF2767164E1DFC967C1FB3F2E55"
250 "A4BD1BFFE83B9C80D052B985D182EA0ADB2A3B7313D3FE14"
251 "C8484B1E052588B9B7D2BBD2DF016199ECD06E1557CD0915"
252 "B3353BBB64E0EC377FD028370DF92B52C7891428CDC67EB6"
253 "184B523D1DB246C32F63078490F00EF8D647D148D4795451"
254 "5E2327CFEF98C582664B4C0F6CC41659";
257 ikev2_calc_prf (ikev2_sa_transform_t * tr, v8 * key, v8 * data)
259 ikev2_main_t *km = &ikev2_main;
260 u32 thread_index = vlib_get_thread_index ();
261 ikev2_main_per_thread_data_t *ptd =
262 vec_elt_at_index (km->per_thread_data, thread_index);
263 HMAC_CTX *ctx = ptd->hmac_ctx;
265 unsigned int len = 0;
267 prf = vec_new (u8, tr->key_trunc);
268 HMAC_Init_ex (ctx, key, vec_len (key), tr->md, NULL);
269 HMAC_Update (ctx, data, vec_len (data));
270 HMAC_Final (ctx, prf, &len);
271 ASSERT (len == tr->key_trunc);
277 ikev2_calc_prfplus (ikev2_sa_transform_t * tr, u8 * key, u8 * seed, int len)
279 v8 *t = 0, *s = 0, *tmp = 0, *ret = 0;
282 /* prf+ (K,S) = T1 | T2 | T3 | T4 | ...
285 T1 = prf (K, S | 0x01)
286 T2 = prf (K, T1 | S | 0x02)
287 T3 = prf (K, T2 | S | 0x03)
288 T4 = prf (K, T3 | S | 0x04)
291 while (vec_len (ret) < len && x < 255)
299 vec_append (s, seed);
300 vec_add2 (s, tmp, 1);
302 t = ikev2_calc_prf (tr, key, s);
319 ikev2_calc_integr (ikev2_sa_transform_t * tr, v8 * key, u8 * data, int len)
321 ikev2_main_t *km = &ikev2_main;
322 u32 thread_index = vlib_get_thread_index ();
323 ikev2_main_per_thread_data_t *ptd =
324 vec_elt_at_index (km->per_thread_data, thread_index);
325 HMAC_CTX *ctx = ptd->hmac_ctx;
329 ASSERT (tr->type == IKEV2_TRANSFORM_TYPE_INTEG);
331 r = vec_new (u8, tr->key_len);
333 if (tr->md == EVP_sha1 ())
335 ikev2_elog_debug ("integrity checking with sha1");
337 else if (tr->md == EVP_sha256 ())
339 ikev2_elog_debug ("integrity checking with sha256");
342 /* verify integrity of data */
343 HMAC_Init_ex (ctx, key, vec_len (key), tr->md, NULL);
344 HMAC_Update (ctx, (const u8 *) data, len);
345 HMAC_Final (ctx, r, &l);
346 ASSERT (l == tr->key_len);
352 ikev2_decrypt_data (ikev2_sa_t * sa, u8 * data, int len)
354 ikev2_main_t *km = &ikev2_main;
355 u32 thread_index = vlib_get_thread_index ();
356 ikev2_main_per_thread_data_t *ptd =
357 vec_elt_at_index (km->per_thread_data, thread_index);
358 EVP_CIPHER_CTX *ctx = ptd->evp_ctx;
359 int out_len = 0, block_size;
360 ikev2_sa_transform_t *tr_encr;
361 u8 *key = sa->is_initiator ? sa->sk_er : sa->sk_ei;
364 ikev2_sa_get_td_for_type (sa->r_proposals, IKEV2_TRANSFORM_TYPE_ENCR);
365 block_size = tr_encr->block_size;
367 /* check if data is multiplier of cipher block size */
368 if (len % block_size)
370 ikev2_elog_error ("wrong data length");
374 v8 *r = vec_new (u8, len - block_size);
375 EVP_DecryptInit_ex (ctx, tr_encr->cipher, NULL, key, data);
376 EVP_DecryptUpdate (ctx, r, &out_len, data + block_size, len - block_size);
377 EVP_DecryptFinal_ex (ctx, r + out_len, &out_len);
379 _vec_len (r) -= r[vec_len (r) - 1] + 1;
385 ikev2_encrypt_data (ikev2_sa_t * sa, v8 * src, u8 * dst)
387 ikev2_main_t *km = &ikev2_main;
388 u32 thread_index = vlib_get_thread_index ();
389 ikev2_main_per_thread_data_t *ptd =
390 vec_elt_at_index (km->per_thread_data, thread_index);
391 EVP_CIPHER_CTX *ctx = ptd->evp_ctx;
394 ikev2_sa_transform_t *tr_encr;
395 u8 *key = sa->is_initiator ? sa->sk_ei : sa->sk_er;
398 ikev2_sa_get_td_for_type (sa->r_proposals, IKEV2_TRANSFORM_TYPE_ENCR);
399 bs = tr_encr->block_size;
402 RAND_bytes (dst, bs);
404 EVP_EncryptInit_ex (ctx, tr_encr->cipher, NULL, key, dst /* dst */ );
405 EVP_EncryptUpdate (ctx, dst + bs, &out_len, src, vec_len (src));
407 ASSERT (vec_len (src) == out_len);
414 BN_bn2binpad (const BIGNUM * a, unsigned char *to, int tolen)
416 int r = BN_bn2bin (a, to);
421 vec_insert (to, pad, 0);
422 clib_memset (to, 0, pad);
423 _vec_len (to) -= pad;
430 ikev2_generate_dh (ikev2_sa_t * sa, ikev2_sa_transform_t * t)
434 if (t->dh_group == IKEV2_DH_GROUP_MODP)
437 #if OPENSSL_VERSION_NUMBER >= 0x10100000L
440 const BIGNUM *pub_key, *priv_key;
442 BN_hex2bn (&p, t->dh_p);
443 BN_hex2bn (&g, t->dh_g);
444 DH_set0_pqg (dh, p, NULL, g);
446 BN_hex2bn (&dh->p, t->dh_p);
447 BN_hex2bn (&dh->g, t->dh_g);
449 DH_generate_key (dh);
451 if (sa->is_initiator)
453 sa->i_dh_data = vec_new (u8, t->key_len);
454 sa->dh_private_key = vec_new (u8, t->key_len);
455 #if OPENSSL_VERSION_NUMBER >= 0x10100000L
456 DH_get0_key (dh, &pub_key, &priv_key);
457 r = BN_bn2binpad (pub_key, sa->i_dh_data, t->key_len);
458 ASSERT (r == t->key_len);
459 r = BN_bn2binpad (priv_key, sa->dh_private_key, t->key_len);
461 r = BN_bn2binpad (dh->pub_key, sa->i_dh_data, t->key_len);
462 ASSERT (r == t->key_len);
463 r = BN_bn2binpad (dh->priv_key, sa->dh_private_key, t->key_len);
465 ASSERT (r == t->key_len);
469 sa->r_dh_data = vec_new (u8, t->key_len);
470 #if OPENSSL_VERSION_NUMBER >= 0x10100000L
471 DH_get0_key (dh, &pub_key, &priv_key);
472 r = BN_bn2binpad (pub_key, sa->r_dh_data, t->key_len);
474 r = BN_bn2binpad (dh->pub_key, sa->r_dh_data, t->key_len);
476 ASSERT (r == t->key_len);
479 sa->dh_shared_key = vec_new (u8, t->key_len);
480 ex = BN_bin2bn (sa->i_dh_data, vec_len (sa->i_dh_data), NULL);
481 r = DH_compute_key (sa->dh_shared_key, ex, dh);
482 ASSERT (t->key_len >= r);
483 int pad = t->key_len - r;
486 vec_insert (sa->dh_shared_key, pad, 0);
487 clib_memset (sa->dh_shared_key, 0, pad);
488 _vec_len (sa->dh_shared_key) -= pad;
494 else if (t->dh_group == IKEV2_DH_GROUP_ECP)
496 EC_KEY *ec = EC_KEY_new_by_curve_name (t->nid);
499 EC_KEY_generate_key (ec);
501 const EC_POINT *r_point = EC_KEY_get0_public_key (ec);
502 const EC_GROUP *group = EC_KEY_get0_group (ec);
503 BIGNUM *x = NULL, *y = NULL;
504 BN_CTX *bn_ctx = BN_CTX_new ();
505 u16 x_off, y_off, len;
506 EC_POINT *i_point = EC_POINT_new (group);
507 EC_POINT *shared_point = EC_POINT_new (group);
511 len = t->key_len / 2;
513 #if OPENSSL_VERSION_NUMBER >= 0x30000000L
514 EC_POINT_get_affine_coordinates (group, r_point, x, y, bn_ctx);
516 EC_POINT_get_affine_coordinates_GFp (group, r_point, x, y, bn_ctx);
519 if (sa->is_initiator)
521 sa->i_dh_data = vec_new (u8, t->key_len);
522 x_off = len - BN_num_bytes (x);
523 clib_memset (sa->i_dh_data, 0, x_off);
524 BN_bn2bin (x, sa->i_dh_data + x_off);
525 y_off = t->key_len - BN_num_bytes (y);
526 clib_memset (sa->i_dh_data + len, 0, y_off - len);
527 BN_bn2bin (y, sa->i_dh_data + y_off);
529 const BIGNUM *prv = EC_KEY_get0_private_key (ec);
530 sa->dh_private_key = vec_new (u8, BN_num_bytes (prv));
531 r = BN_bn2bin (prv, sa->dh_private_key);
532 ASSERT (r == BN_num_bytes (prv));
536 sa->r_dh_data = vec_new (u8, t->key_len);
537 x_off = len - BN_num_bytes (x);
538 clib_memset (sa->r_dh_data, 0, x_off);
539 BN_bn2bin (x, sa->r_dh_data + x_off);
540 y_off = t->key_len - BN_num_bytes (y);
541 clib_memset (sa->r_dh_data + len, 0, y_off - len);
542 BN_bn2bin (y, sa->r_dh_data + y_off);
544 x = BN_bin2bn (sa->i_dh_data, len, x);
545 y = BN_bin2bn (sa->i_dh_data + len, len, y);
546 #if OPENSSL_VERSION_NUMBER >= 0x30000000L
547 EC_POINT_set_affine_coordinates (group, i_point, x, y, bn_ctx);
549 EC_POINT_set_affine_coordinates_GFp (group, i_point, x, y, bn_ctx);
551 sa->dh_shared_key = vec_new (u8, t->key_len);
552 EC_POINT_mul (group, shared_point, NULL, i_point,
553 EC_KEY_get0_private_key (ec), NULL);
554 #if OPENSSL_VERSION_NUMBER >= 0x30000000L
555 EC_POINT_get_affine_coordinates (group, shared_point, x, y, bn_ctx);
557 EC_POINT_get_affine_coordinates_GFp (group, shared_point, x, y,
560 x_off = len - BN_num_bytes (x);
561 clib_memset (sa->dh_shared_key, 0, x_off);
562 BN_bn2bin (x, sa->dh_shared_key + x_off);
563 y_off = t->key_len - BN_num_bytes (y);
564 clib_memset (sa->dh_shared_key + len, 0, y_off - len);
565 BN_bn2bin (y, sa->dh_shared_key + y_off);
571 BN_CTX_free (bn_ctx);
572 EC_POINT_free (i_point);
573 EC_POINT_free (shared_point);
578 ikev2_complete_dh (ikev2_sa_t * sa, ikev2_sa_transform_t * t)
582 if (t->dh_group == IKEV2_DH_GROUP_MODP)
585 #if OPENSSL_VERSION_NUMBER >= 0x10100000L
590 BN_hex2bn (&p, t->dh_p);
591 BN_hex2bn (&g, t->dh_g);
592 DH_set0_pqg (dh, p, NULL, g);
595 BN_bin2bn (sa->dh_private_key, vec_len (sa->dh_private_key), NULL);
596 DH_set0_key (dh, NULL, priv_key);
598 BN_hex2bn (&dh->p, t->dh_p);
599 BN_hex2bn (&dh->g, t->dh_g);
602 BN_bin2bn (sa->dh_private_key, vec_len (sa->dh_private_key), NULL);
605 sa->dh_shared_key = vec_new (u8, t->key_len);
606 ex = BN_bin2bn (sa->r_dh_data, vec_len (sa->r_dh_data), NULL);
607 r = DH_compute_key (sa->dh_shared_key, ex, dh);
608 ASSERT (t->key_len >= r);
609 int pad = t->key_len - r;
612 vec_insert (sa->dh_shared_key, pad, 0);
613 clib_memset (sa->dh_shared_key, 0, pad);
614 _vec_len (sa->dh_shared_key) -= pad;
619 else if (t->dh_group == IKEV2_DH_GROUP_ECP)
621 EC_KEY *ec = EC_KEY_new_by_curve_name (t->nid);
624 const EC_GROUP *group = EC_KEY_get0_group (ec);
625 BIGNUM *x = NULL, *y = NULL;
626 BN_CTX *bn_ctx = BN_CTX_new ();
627 u16 x_off, y_off, len;
631 BN_bin2bn (sa->dh_private_key, vec_len (sa->dh_private_key), NULL);
632 EC_KEY_set_private_key (ec, prv);
636 len = t->key_len / 2;
638 x = BN_bin2bn (sa->r_dh_data, len, x);
639 y = BN_bin2bn (sa->r_dh_data + len, len, y);
640 EC_POINT *r_point = EC_POINT_new (group);
641 #if OPENSSL_VERSION_NUMBER >= 0x30000000L
642 EC_POINT_set_affine_coordinates (group, r_point, x, y, bn_ctx);
644 EC_POINT_set_affine_coordinates_GFp (group, r_point, x, y, bn_ctx);
646 EC_KEY_set_public_key (ec, r_point);
648 EC_POINT *i_point = EC_POINT_new (group);
649 EC_POINT *shared_point = EC_POINT_new (group);
651 x = BN_bin2bn (sa->i_dh_data, len, x);
652 y = BN_bin2bn (sa->i_dh_data + len, len, y);
653 #if OPENSSL_VERSION_NUMBER >= 0x30000000L
654 EC_POINT_set_affine_coordinates (group, i_point, x, y, bn_ctx);
656 EC_POINT_set_affine_coordinates_GFp (group, i_point, x, y, bn_ctx);
658 EC_POINT_mul (group, shared_point, NULL, r_point,
659 EC_KEY_get0_private_key (ec), NULL);
660 #if OPENSSL_VERSION_NUMBER >= 0x30000000L
661 EC_POINT_get_affine_coordinates (group, shared_point, x, y, bn_ctx);
663 EC_POINT_get_affine_coordinates_GFp (group, shared_point, x, y, bn_ctx);
665 sa->dh_shared_key = vec_new (u8, t->key_len);
666 x_off = len - BN_num_bytes (x);
667 clib_memset (sa->dh_shared_key, 0, x_off);
668 BN_bn2bin (x, sa->dh_shared_key + x_off);
669 y_off = t->key_len - BN_num_bytes (y);
670 clib_memset (sa->dh_shared_key + len, 0, y_off - len);
671 BN_bn2bin (y, sa->dh_shared_key + y_off);
677 BN_CTX_free (bn_ctx);
678 EC_POINT_free (i_point);
679 EC_POINT_free (r_point);
680 EC_POINT_free (shared_point);
685 ikev2_verify_sign (EVP_PKEY * pkey, u8 * sigbuf, u8 * data)
688 #if OPENSSL_VERSION_NUMBER >= 0x10100000L
689 EVP_MD_CTX *md_ctx = EVP_MD_CTX_new ();
692 EVP_MD_CTX_init (&md_ctx);
695 #if OPENSSL_VERSION_NUMBER >= 0x10100000L
696 EVP_VerifyInit (md_ctx, EVP_sha1 ());
697 EVP_VerifyUpdate (md_ctx, data, vec_len (data));
699 EVP_VerifyInit_ex (&md_ctx, EVP_sha1 (), NULL);
700 EVP_VerifyUpdate (&md_ctx, data, vec_len (data));
703 #if OPENSSL_VERSION_NUMBER >= 0x10100000L
704 verify = EVP_VerifyFinal (md_ctx, sigbuf, vec_len (sigbuf), pkey);
705 EVP_MD_CTX_free (md_ctx);
707 verify = EVP_VerifyFinal (&md_ctx, sigbuf, vec_len (sigbuf), pkey);
708 EVP_MD_CTX_cleanup (&md_ctx);
714 ikev2_calc_sign (EVP_PKEY * pkey, u8 * data)
716 #if OPENSSL_VERSION_NUMBER >= 0x10100000L
717 EVP_MD_CTX *md_ctx = EVP_MD_CTX_new ();
720 EVP_MD_CTX_init (&md_ctx);
722 unsigned int sig_len = 0;
725 #if OPENSSL_VERSION_NUMBER >= 0x10100000L
726 EVP_SignInit (md_ctx, EVP_sha1 ());
727 EVP_SignUpdate (md_ctx, data, vec_len (data));
729 EVP_SignFinal (md_ctx, NULL, &sig_len, pkey);
730 sign = vec_new (u8, sig_len);
732 EVP_SignFinal (md_ctx, sign, &sig_len, pkey);
733 EVP_MD_CTX_free (md_ctx);
735 EVP_SignInit (&md_ctx, EVP_sha1 ());
736 EVP_SignUpdate (&md_ctx, data, vec_len (data));
738 EVP_SignFinal (&md_ctx, NULL, &sig_len, pkey);
739 sign = vec_new (u8, sig_len);
741 EVP_SignFinal (&md_ctx, sign, &sig_len, pkey);
742 EVP_MD_CTX_cleanup (&md_ctx);
748 ikev2_load_cert_file (u8 * file)
752 EVP_PKEY *pkey = NULL;
754 fp = fopen ((char *) file, "r");
757 ikev2_log_error ("open %s failed", file);
761 x509 = PEM_read_X509 (fp, NULL, NULL, NULL);
765 ikev2_log_error ("read cert %s failed", file);
769 pkey = X509_get_pubkey (x509);
771 ikev2_log_error ("get pubkey %s failed", file);
778 ikev2_load_key_file (u8 * file)
781 EVP_PKEY *pkey = NULL;
783 fp = fopen ((char *) file, "r");
786 ikev2_log_error ("open %s failed", file);
790 pkey = PEM_read_PrivateKey (fp, NULL, NULL, NULL);
793 ikev2_log_error ("read %s failed", file);
800 ikev2_crypto_init (ikev2_main_t * km)
802 ikev2_sa_transform_t *tr;
804 /* vector of supported transforms - in order of preference */
808 vec_add2 (km->supported_transforms, tr, 1);
809 tr->type = IKEV2_TRANSFORM_TYPE_ENCR;
810 tr->encr_type = IKEV2_TRANSFORM_ENCR_TYPE_AES_CBC;
811 tr->key_len = 256 / 8;
812 tr->block_size = 128 / 8;
813 tr->cipher = EVP_aes_256_cbc ();
815 vec_add2 (km->supported_transforms, tr, 1);
816 tr->type = IKEV2_TRANSFORM_TYPE_ENCR;
817 tr->encr_type = IKEV2_TRANSFORM_ENCR_TYPE_AES_CBC;
818 tr->key_len = 192 / 8;
819 tr->block_size = 128 / 8;
820 tr->cipher = EVP_aes_192_cbc ();
822 vec_add2 (km->supported_transforms, tr, 1);
823 tr->type = IKEV2_TRANSFORM_TYPE_ENCR;
824 tr->encr_type = IKEV2_TRANSFORM_ENCR_TYPE_AES_CBC;
825 tr->key_len = 128 / 8;
826 tr->block_size = 128 / 8;
827 tr->cipher = EVP_aes_128_cbc ();
829 vec_add2 (km->supported_transforms, tr, 1);
830 tr->type = IKEV2_TRANSFORM_TYPE_ENCR;
831 tr->encr_type = IKEV2_TRANSFORM_ENCR_TYPE_AES_GCM_16;
832 tr->key_len = 256 / 8;
833 tr->block_size = 128 / 8;
834 tr->cipher = EVP_aes_256_gcm ();
836 vec_add2 (km->supported_transforms, tr, 1);
837 tr->type = IKEV2_TRANSFORM_TYPE_ENCR;
838 tr->encr_type = IKEV2_TRANSFORM_ENCR_TYPE_AES_GCM_16;
839 tr->key_len = 192 / 8;
840 tr->block_size = 128 / 8;
841 tr->cipher = EVP_aes_192_gcm ();
843 vec_add2 (km->supported_transforms, tr, 1);
844 tr->type = IKEV2_TRANSFORM_TYPE_ENCR;
845 tr->encr_type = IKEV2_TRANSFORM_ENCR_TYPE_AES_GCM_16;
846 tr->key_len = 128 / 8;
847 tr->block_size = 128 / 8;
848 tr->cipher = EVP_aes_128_gcm ();
851 vec_add2 (km->supported_transforms, tr, 1);
852 tr->type = IKEV2_TRANSFORM_TYPE_PRF;
853 tr->prf_type = IKEV2_TRANSFORM_PRF_TYPE_PRF_HMAC_SHA2_256;
854 tr->key_len = 256 / 8;
855 tr->key_trunc = 256 / 8;
856 tr->md = EVP_sha256 ();
858 vec_add2 (km->supported_transforms, tr, 1);
859 tr->type = IKEV2_TRANSFORM_TYPE_PRF;
860 tr->prf_type = IKEV2_TRANSFORM_PRF_TYPE_PRF_HMAC_SHA2_384;
861 tr->key_len = 384 / 8;
862 tr->key_trunc = 384 / 8;
863 tr->md = EVP_sha384 ();
865 vec_add2 (km->supported_transforms, tr, 1);
866 tr->type = IKEV2_TRANSFORM_TYPE_PRF;
867 tr->prf_type = IKEV2_TRANSFORM_PRF_TYPE_PRF_HMAC_SHA2_512;
868 tr->key_len = 512 / 8;
869 tr->key_trunc = 512 / 8;
870 tr->md = EVP_sha512 ();
872 vec_add2 (km->supported_transforms, tr, 1);
873 tr->type = IKEV2_TRANSFORM_TYPE_PRF;
874 tr->prf_type = IKEV2_TRANSFORM_PRF_TYPE_PRF_HMAC_SHA1;
875 tr->key_len = 160 / 8;
876 tr->key_trunc = 160 / 8;
877 tr->md = EVP_sha1 ();
880 vec_add2 (km->supported_transforms, tr, 1);
881 tr->type = IKEV2_TRANSFORM_TYPE_INTEG;
882 tr->integ_type = IKEV2_TRANSFORM_INTEG_TYPE_AUTH_HMAC_SHA2_256_128;
883 tr->key_len = 256 / 8;
884 tr->key_trunc = 128 / 8;
885 tr->md = EVP_sha256 ();
887 vec_add2 (km->supported_transforms, tr, 1);
888 tr->type = IKEV2_TRANSFORM_TYPE_INTEG;
889 tr->integ_type = IKEV2_TRANSFORM_INTEG_TYPE_AUTH_HMAC_SHA2_384_192;
890 tr->key_len = 384 / 8;
891 tr->key_trunc = 192 / 8;
892 tr->md = EVP_sha384 ();
894 vec_add2 (km->supported_transforms, tr, 1);
895 tr->type = IKEV2_TRANSFORM_TYPE_INTEG;
896 tr->integ_type = IKEV2_TRANSFORM_INTEG_TYPE_AUTH_HMAC_SHA2_512_256;
897 tr->key_len = 512 / 8;
898 tr->key_trunc = 256 / 8;
899 tr->md = EVP_sha512 ();
901 vec_add2 (km->supported_transforms, tr, 1);
902 tr->type = IKEV2_TRANSFORM_TYPE_INTEG;
903 tr->integ_type = IKEV2_TRANSFORM_INTEG_TYPE_AUTH_HMAC_SHA1_160;
904 tr->key_len = 160 / 8;
905 tr->key_trunc = 160 / 8;
906 tr->md = EVP_sha1 ();
908 vec_add2 (km->supported_transforms, tr, 1);
909 tr->type = IKEV2_TRANSFORM_TYPE_INTEG;
910 tr->integ_type = IKEV2_TRANSFORM_INTEG_TYPE_AUTH_HMAC_SHA1_96;
911 tr->key_len = 160 / 8;
912 tr->key_trunc = 96 / 8;
913 tr->md = EVP_sha1 ();
916 #if defined(OPENSSL_NO_CISCO_FECDH)
917 vec_add2 (km->supported_transforms, tr, 1);
918 tr->type = IKEV2_TRANSFORM_TYPE_DH;
919 tr->dh_type = IKEV2_TRANSFORM_DH_TYPE_BRAINPOOL_512;
920 tr->key_len = (512 * 2) / 8;
921 tr->nid = NID_brainpoolP512r1;
922 tr->dh_group = IKEV2_DH_GROUP_ECP;
924 vec_add2 (km->supported_transforms, tr, 1);
925 tr->type = IKEV2_TRANSFORM_TYPE_DH;
926 tr->dh_type = IKEV2_TRANSFORM_DH_TYPE_BRAINPOOL_384;
927 tr->key_len = (384 * 2) / 8;
928 tr->nid = NID_brainpoolP384r1;
929 tr->dh_group = IKEV2_DH_GROUP_ECP;
931 vec_add2 (km->supported_transforms, tr, 1);
932 tr->type = IKEV2_TRANSFORM_TYPE_DH;
933 tr->dh_type = IKEV2_TRANSFORM_DH_TYPE_BRAINPOOL_256;
934 tr->key_len = (256 * 2) / 8;
935 tr->nid = NID_brainpoolP256r1;
936 tr->dh_group = IKEV2_DH_GROUP_ECP;
938 vec_add2 (km->supported_transforms, tr, 1);
939 tr->type = IKEV2_TRANSFORM_TYPE_DH;
940 tr->dh_type = IKEV2_TRANSFORM_DH_TYPE_BRAINPOOL_224;
941 tr->key_len = (224 * 2) / 8;
942 tr->nid = NID_brainpoolP224r1;
943 tr->dh_group = IKEV2_DH_GROUP_ECP;
945 vec_add2 (km->supported_transforms, tr, 1);
946 tr->type = IKEV2_TRANSFORM_TYPE_DH;
947 tr->dh_type = IKEV2_TRANSFORM_DH_TYPE_ECP_224;
948 tr->key_len = (224 * 2) / 8;
949 tr->nid = NID_secp224r1;
950 tr->dh_group = IKEV2_DH_GROUP_ECP;
953 vec_add2 (km->supported_transforms, tr, 1);
954 tr->type = IKEV2_TRANSFORM_TYPE_DH;
955 tr->dh_type = IKEV2_TRANSFORM_DH_TYPE_ECP_521;
956 tr->key_len = (528 * 2) / 8;
957 tr->nid = NID_secp521r1;
958 tr->dh_group = IKEV2_DH_GROUP_ECP;
960 vec_add2 (km->supported_transforms, tr, 1);
961 tr->type = IKEV2_TRANSFORM_TYPE_DH;
962 tr->dh_type = IKEV2_TRANSFORM_DH_TYPE_ECP_384;
963 tr->key_len = (384 * 2) / 8;
964 tr->nid = NID_secp384r1;
965 tr->dh_group = IKEV2_DH_GROUP_ECP;
967 vec_add2 (km->supported_transforms, tr, 1);
968 tr->type = IKEV2_TRANSFORM_TYPE_DH;
969 tr->dh_type = IKEV2_TRANSFORM_DH_TYPE_ECP_256;
970 tr->key_len = (256 * 2) / 8;
971 tr->nid = NID_X9_62_prime256v1;
972 tr->dh_group = IKEV2_DH_GROUP_ECP;
974 vec_add2 (km->supported_transforms, tr, 1);
975 tr->type = IKEV2_TRANSFORM_TYPE_DH;
976 tr->dh_type = IKEV2_TRANSFORM_DH_TYPE_ECP_192;
977 tr->key_len = (192 * 2) / 8;
978 tr->nid = NID_X9_62_prime192v1;
979 tr->dh_group = IKEV2_DH_GROUP_ECP;
981 vec_add2 (km->supported_transforms, tr, 1);
982 tr->type = IKEV2_TRANSFORM_TYPE_DH;
983 tr->dh_type = IKEV2_TRANSFORM_DH_TYPE_MODP_2048_256;
984 tr->key_len = 2048 / 8;
985 tr->dh_p = (const char *) &modp_dh_2048_256_prime;
986 tr->dh_g = (const char *) &modp_dh_2048_256_generator;
987 tr->dh_group = IKEV2_DH_GROUP_MODP;
989 vec_add2 (km->supported_transforms, tr, 1);
990 tr->type = IKEV2_TRANSFORM_TYPE_DH;
991 tr->dh_type = IKEV2_TRANSFORM_DH_TYPE_MODP_2048_224;
992 tr->key_len = 2048 / 8;
993 tr->dh_p = (const char *) &modp_dh_2048_224_prime;
994 tr->dh_g = (const char *) &modp_dh_2048_224_generator;
995 tr->dh_group = IKEV2_DH_GROUP_MODP;
997 vec_add2 (km->supported_transforms, tr, 1);
998 tr->type = IKEV2_TRANSFORM_TYPE_DH;
999 tr->dh_type = IKEV2_TRANSFORM_DH_TYPE_MODP_1024_160;
1000 tr->key_len = 1024 / 8;
1001 tr->dh_p = (const char *) &modp_dh_1024_160_prime;
1002 tr->dh_g = (const char *) &modp_dh_1024_160_generator;
1003 tr->dh_group = IKEV2_DH_GROUP_MODP;
1005 vec_add2 (km->supported_transforms, tr, 1);
1006 tr->type = IKEV2_TRANSFORM_TYPE_DH;
1007 tr->dh_type = IKEV2_TRANSFORM_DH_TYPE_MODP_8192;
1008 tr->key_len = 8192 / 8;
1009 tr->dh_p = (const char *) &modp_dh_8192_prime;
1010 tr->dh_g = (const char *) &modp_dh_8192_generator;
1011 tr->dh_group = IKEV2_DH_GROUP_MODP;
1013 vec_add2 (km->supported_transforms, tr, 1);
1014 tr->type = IKEV2_TRANSFORM_TYPE_DH;
1015 tr->dh_type = IKEV2_TRANSFORM_DH_TYPE_MODP_6144;
1016 tr->key_len = 6144 / 8;
1017 tr->dh_p = (const char *) &modp_dh_6144_prime;
1018 tr->dh_g = (const char *) &modp_dh_6144_generator;
1019 tr->dh_group = IKEV2_DH_GROUP_MODP;
1021 vec_add2 (km->supported_transforms, tr, 1);
1022 tr->type = IKEV2_TRANSFORM_TYPE_DH;
1023 tr->dh_type = IKEV2_TRANSFORM_DH_TYPE_MODP_4096;
1024 tr->key_len = 4096 / 8;
1025 tr->dh_p = (const char *) &modp_dh_4096_prime;
1026 tr->dh_g = (const char *) &modp_dh_4096_generator;
1027 tr->dh_group = IKEV2_DH_GROUP_MODP;
1029 vec_add2 (km->supported_transforms, tr, 1);
1030 tr->type = IKEV2_TRANSFORM_TYPE_DH;
1031 tr->dh_type = IKEV2_TRANSFORM_DH_TYPE_MODP_3072;
1032 tr->key_len = 3072 / 8;
1033 tr->dh_p = (const char *) &modp_dh_3072_prime;
1034 tr->dh_g = (const char *) &modp_dh_3072_generator;
1035 tr->dh_group = IKEV2_DH_GROUP_MODP;
1037 vec_add2 (km->supported_transforms, tr, 1);
1038 tr->type = IKEV2_TRANSFORM_TYPE_DH;
1039 tr->dh_type = IKEV2_TRANSFORM_DH_TYPE_MODP_2048;
1040 tr->key_len = 2048 / 8;
1041 tr->dh_p = (const char *) &modp_dh_2048_prime;
1042 tr->dh_g = (const char *) &modp_dh_2048_generator;
1043 tr->dh_group = IKEV2_DH_GROUP_MODP;
1045 vec_add2 (km->supported_transforms, tr, 1);
1046 tr->type = IKEV2_TRANSFORM_TYPE_DH;
1047 tr->dh_type = IKEV2_TRANSFORM_DH_TYPE_MODP_1536;
1048 tr->key_len = 1536 / 8;
1049 tr->dh_p = (const char *) &modp_dh_1536_prime;
1050 tr->dh_g = (const char *) &modp_dh_1536_generator;
1051 tr->dh_group = IKEV2_DH_GROUP_MODP;
1053 vec_add2 (km->supported_transforms, tr, 1);
1054 tr->type = IKEV2_TRANSFORM_TYPE_DH;
1055 tr->dh_type = IKEV2_TRANSFORM_DH_TYPE_MODP_1024;
1056 tr->key_len = 1024 / 8;
1057 tr->dh_p = (const char *) &modp_dh_1024_prime;
1058 tr->dh_g = (const char *) &modp_dh_1024_generator;
1059 tr->dh_group = IKEV2_DH_GROUP_MODP;
1061 vec_add2 (km->supported_transforms, tr, 1);
1062 tr->type = IKEV2_TRANSFORM_TYPE_DH;
1063 tr->dh_type = IKEV2_TRANSFORM_DH_TYPE_MODP_768;
1064 tr->key_len = 768 / 8;
1065 tr->dh_p = (const char *) &modp_dh_768_prime;
1066 tr->dh_g = (const char *) &modp_dh_768_generator;
1067 tr->dh_group = IKEV2_DH_GROUP_MODP;
1069 vec_add2 (km->supported_transforms, tr, 1);
1070 tr->type = IKEV2_TRANSFORM_TYPE_ESN;
1071 tr->esn_type = IKEV2_TRANSFORM_ESN_TYPE_ESN;
1073 vec_add2 (km->supported_transforms, tr, 1);
1074 tr->type = IKEV2_TRANSFORM_TYPE_ESN;
1075 tr->esn_type = IKEV2_TRANSFORM_ESN_TYPE_NO_ESN;
1081 * fd.io coding-style-patch-verification: ON
1084 * eval: (c-set-style "gnu")