blob: 32927629c5e38cabc22ef90259c5cec8b305384c [file] [log] [blame]
Ed Warnickecb9cada2015-12-08 15:45:58 -07001/*
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:
6 *
7 * http://www.apache.org/licenses/LICENSE-2.0
8 *
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.
14 */
15
16#include <vlib/vlib.h>
17#include <vnet/vnet.h>
18#include <vnet/pg/pg.h>
19#include <vppinfra/error.h>
20#include <vnet/ip/udp.h>
21#include <vnet/ipsec/ikev2.h>
22#include <vnet/ipsec/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
29/* from RFC7296 */
30static const char modp_dh_768_prime[] =
Keith Burns (alagalah)166a9d42016-08-06 11:00:56 -070031 "FFFFFFFFFFFFFFFFC90FDAA22168C234C4C6628B80DC1CD1"
32 "29024E088A67CC74020BBEA63B139B22514A08798E3404DD"
33 "EF9519B3CD3A431B302B0A6DF25F14374FE1356D6D51C245"
34 "E485B576625E7EC6F44C42E9A63A3620FFFFFFFFFFFFFFFF";
Ed Warnickecb9cada2015-12-08 15:45:58 -070035static const char modp_dh_768_generator[] = "02";
36
37static const char modp_dh_1024_prime[] =
Keith Burns (alagalah)166a9d42016-08-06 11:00:56 -070038 "FFFFFFFFFFFFFFFFC90FDAA22168C234C4C6628B80DC1CD1"
39 "29024E088A67CC74020BBEA63B139B22514A08798E3404DD"
40 "EF9519B3CD3A431B302B0A6DF25F14374FE1356D6D51C245"
41 "E485B576625E7EC6F44C42E9A637ED6B0BFF5CB6F406B7ED"
42 "EE386BFB5A899FA5AE9F24117C4B1FE649286651ECE65381" "FFFFFFFFFFFFFFFF";
Ed Warnickecb9cada2015-12-08 15:45:58 -070043static const char modp_dh_1024_generator[] = "02";
44
45/* from RFC3526 */
46static const char modp_dh_1536_prime[] =
Keith Burns (alagalah)166a9d42016-08-06 11:00:56 -070047 "FFFFFFFFFFFFFFFFC90FDAA22168C234C4C6628B80DC1CD1"
48 "29024E088A67CC74020BBEA63B139B22514A08798E3404DD"
49 "EF9519B3CD3A431B302B0A6DF25F14374FE1356D6D51C245"
50 "E485B576625E7EC6F44C42E9A637ED6B0BFF5CB6F406B7ED"
51 "EE386BFB5A899FA5AE9F24117C4B1FE649286651ECE45B3D"
52 "C2007CB8A163BF0598DA48361C55D39A69163FA8FD24CF5F"
53 "83655D23DCA3AD961C62F356208552BB9ED529077096966D"
54 "670C354E4ABC9804F1746C08CA237327FFFFFFFFFFFFFFFF";
Ed Warnickecb9cada2015-12-08 15:45:58 -070055static const char modp_dh_1536_generator[] = "02";
56
57static const char modp_dh_2048_prime[] =
Keith Burns (alagalah)166a9d42016-08-06 11:00:56 -070058 "FFFFFFFFFFFFFFFFC90FDAA22168C234C4C6628B80DC1CD1"
59 "29024E088A67CC74020BBEA63B139B22514A08798E3404DD"
60 "EF9519B3CD3A431B302B0A6DF25F14374FE1356D6D51C245"
61 "E485B576625E7EC6F44C42E9A637ED6B0BFF5CB6F406B7ED"
62 "EE386BFB5A899FA5AE9F24117C4B1FE649286651ECE45B3D"
63 "C2007CB8A163BF0598DA48361C55D39A69163FA8FD24CF5F"
64 "83655D23DCA3AD961C62F356208552BB9ED529077096966D"
65 "670C354E4ABC9804F1746C08CA18217C32905E462E36CE3B"
66 "E39E772C180E86039B2783A2EC07A28FB5C55DF06F4C52C9"
67 "DE2BCBF6955817183995497CEA956AE515D2261898FA0510"
68 "15728E5A8AACAA68FFFFFFFFFFFFFFFF";
Ed Warnickecb9cada2015-12-08 15:45:58 -070069static const char modp_dh_2048_generator[] = "02";
70
71static const char modp_dh_3072_prime[] =
Keith Burns (alagalah)166a9d42016-08-06 11:00:56 -070072 "FFFFFFFFFFFFFFFFC90FDAA22168C234C4C6628B80DC1CD1"
73 "29024E088A67CC74020BBEA63B139B22514A08798E3404DD"
74 "EF9519B3CD3A431B302B0A6DF25F14374FE1356D6D51C245"
75 "E485B576625E7EC6F44C42E9A637ED6B0BFF5CB6F406B7ED"
76 "EE386BFB5A899FA5AE9F24117C4B1FE649286651ECE45B3D"
77 "C2007CB8A163BF0598DA48361C55D39A69163FA8FD24CF5F"
78 "83655D23DCA3AD961C62F356208552BB9ED529077096966D"
79 "670C354E4ABC9804F1746C08CA18217C32905E462E36CE3B"
80 "E39E772C180E86039B2783A2EC07A28FB5C55DF06F4C52C9"
81 "DE2BCBF6955817183995497CEA956AE515D2261898FA0510"
82 "15728E5A8AAAC42DAD33170D04507A33A85521ABDF1CBA64"
83 "ECFB850458DBEF0A8AEA71575D060C7DB3970F85A6E1E4C7"
84 "ABF5AE8CDB0933D71E8C94E04A25619DCEE3D2261AD2EE6B"
85 "F12FFA06D98A0864D87602733EC86A64521F2B18177B200C"
86 "BBE117577A615D6C770988C0BAD946E208E24FA074E5AB31"
87 "43DB5BFCE0FD108E4B82D120A93AD2CAFFFFFFFFFFFFFFFF";
Ed Warnickecb9cada2015-12-08 15:45:58 -070088static const char modp_dh_3072_generator[] = "02";
89
90static const char modp_dh_4096_prime[] =
Keith Burns (alagalah)166a9d42016-08-06 11:00:56 -070091 "FFFFFFFFFFFFFFFFC90FDAA22168C234C4C6628B80DC1CD1"
92 "29024E088A67CC74020BBEA63B139B22514A08798E3404DD"
93 "EF9519B3CD3A431B302B0A6DF25F14374FE1356D6D51C245"
94 "E485B576625E7EC6F44C42E9A637ED6B0BFF5CB6F406B7ED"
95 "EE386BFB5A899FA5AE9F24117C4B1FE649286651ECE45B3D"
96 "C2007CB8A163BF0598DA48361C55D39A69163FA8FD24CF5F"
97 "83655D23DCA3AD961C62F356208552BB9ED529077096966D"
98 "670C354E4ABC9804F1746C08CA18217C32905E462E36CE3B"
99 "E39E772C180E86039B2783A2EC07A28FB5C55DF06F4C52C9"
100 "DE2BCBF6955817183995497CEA956AE515D2261898FA0510"
101 "15728E5A8AAAC42DAD33170D04507A33A85521ABDF1CBA64"
102 "ECFB850458DBEF0A8AEA71575D060C7DB3970F85A6E1E4C7"
103 "ABF5AE8CDB0933D71E8C94E04A25619DCEE3D2261AD2EE6B"
104 "F12FFA06D98A0864D87602733EC86A64521F2B18177B200C"
105 "BBE117577A615D6C770988C0BAD946E208E24FA074E5AB31"
106 "43DB5BFCE0FD108E4B82D120A92108011A723C12A787E6D7"
107 "88719A10BDBA5B2699C327186AF4E23C1A946834B6150BDA"
108 "2583E9CA2AD44CE8DBBBC2DB04DE8EF92E8EFC141FBECAA6"
109 "287C59474E6BC05D99B2964FA090C3A2233BA186515BE7ED"
110 "1F612970CEE2D7AFB81BDD762170481CD0069127D5B05AA9"
111 "93B4EA988D8FDDC186FFB7DC90A6C08F4DF435C934063199" "FFFFFFFFFFFFFFFF";
Ed Warnickecb9cada2015-12-08 15:45:58 -0700112static const char modp_dh_4096_generator[] = "02";
113
114static const char modp_dh_6144_prime[] =
Keith Burns (alagalah)166a9d42016-08-06 11:00:56 -0700115 "FFFFFFFFFFFFFFFFC90FDAA22168C234C4C6628B80DC1CD129024E08"
116 "8A67CC74020BBEA63B139B22514A08798E3404DDEF9519B3CD3A431B"
117 "302B0A6DF25F14374FE1356D6D51C245E485B576625E7EC6F44C42E9"
118 "A637ED6B0BFF5CB6F406B7EDEE386BFB5A899FA5AE9F24117C4B1FE6"
119 "49286651ECE45B3DC2007CB8A163BF0598DA48361C55D39A69163FA8"
120 "FD24CF5F83655D23DCA3AD961C62F356208552BB9ED529077096966D"
121 "670C354E4ABC9804F1746C08CA18217C32905E462E36CE3BE39E772C"
122 "180E86039B2783A2EC07A28FB5C55DF06F4C52C9DE2BCBF695581718"
123 "3995497CEA956AE515D2261898FA051015728E5A8AAAC42DAD33170D"
124 "04507A33A85521ABDF1CBA64ECFB850458DBEF0A8AEA71575D060C7D"
125 "B3970F85A6E1E4C7ABF5AE8CDB0933D71E8C94E04A25619DCEE3D226"
126 "1AD2EE6BF12FFA06D98A0864D87602733EC86A64521F2B18177B200C"
127 "BBE117577A615D6C770988C0BAD946E208E24FA074E5AB3143DB5BFC"
128 "E0FD108E4B82D120A92108011A723C12A787E6D788719A10BDBA5B26"
129 "99C327186AF4E23C1A946834B6150BDA2583E9CA2AD44CE8DBBBC2DB"
130 "04DE8EF92E8EFC141FBECAA6287C59474E6BC05D99B2964FA090C3A2"
131 "233BA186515BE7ED1F612970CEE2D7AFB81BDD762170481CD0069127"
132 "D5B05AA993B4EA988D8FDDC186FFB7DC90A6C08F4DF435C934028492"
133 "36C3FAB4D27C7026C1D4DCB2602646DEC9751E763DBA37BDF8FF9406"
134 "AD9E530EE5DB382F413001AEB06A53ED9027D831179727B0865A8918"
135 "DA3EDBEBCF9B14ED44CE6CBACED4BB1BDB7F1447E6CC254B33205151"
136 "2BD7AF426FB8F401378CD2BF5983CA01C64B92ECF032EA15D1721D03"
137 "F482D7CE6E74FEF6D55E702F46980C82B5A84031900B1C9E59E7C97F"
138 "BEC7E8F323A97A7E36CC88BE0F1D45B7FF585AC54BD407B22B4154AA"
139 "CC8F6D7EBF48E1D814CC5ED20F8037E0A79715EEF29BE32806A1D58B"
140 "B7C5DA76F550AA3D8A1FBFF0EB19CCB1A313D55CDA56C9EC2EF29632"
141 "387FE8D76E3C0468043E8F663F4860EE12BF2D5B0B7474D6E694F91E"
142 "6DCC4024FFFFFFFFFFFFFFFF";
Ed Warnickecb9cada2015-12-08 15:45:58 -0700143static const char modp_dh_6144_generator[] = "02";
144
145static const char modp_dh_8192_prime[] =
Keith Burns (alagalah)166a9d42016-08-06 11:00:56 -0700146 "FFFFFFFFFFFFFFFFC90FDAA22168C234C4C6628B80DC1CD1"
147 "29024E088A67CC74020BBEA63B139B22514A08798E3404DD"
148 "EF9519B3CD3A431B302B0A6DF25F14374FE1356D6D51C245"
149 "E485B576625E7EC6F44C42E9A637ED6B0BFF5CB6F406B7ED"
150 "EE386BFB5A899FA5AE9F24117C4B1FE649286651ECE45B3D"
151 "C2007CB8A163BF0598DA48361C55D39A69163FA8FD24CF5F"
152 "83655D23DCA3AD961C62F356208552BB9ED529077096966D"
153 "670C354E4ABC9804F1746C08CA18217C32905E462E36CE3B"
154 "E39E772C180E86039B2783A2EC07A28FB5C55DF06F4C52C9"
155 "DE2BCBF6955817183995497CEA956AE515D2261898FA0510"
156 "15728E5A8AAAC42DAD33170D04507A33A85521ABDF1CBA64"
157 "ECFB850458DBEF0A8AEA71575D060C7DB3970F85A6E1E4C7"
158 "ABF5AE8CDB0933D71E8C94E04A25619DCEE3D2261AD2EE6B"
159 "F12FFA06D98A0864D87602733EC86A64521F2B18177B200C"
160 "BBE117577A615D6C770988C0BAD946E208E24FA074E5AB31"
161 "43DB5BFCE0FD108E4B82D120A92108011A723C12A787E6D7"
162 "88719A10BDBA5B2699C327186AF4E23C1A946834B6150BDA"
163 "2583E9CA2AD44CE8DBBBC2DB04DE8EF92E8EFC141FBECAA6"
164 "287C59474E6BC05D99B2964FA090C3A2233BA186515BE7ED"
165 "1F612970CEE2D7AFB81BDD762170481CD0069127D5B05AA9"
166 "93B4EA988D8FDDC186FFB7DC90A6C08F4DF435C934028492"
167 "36C3FAB4D27C7026C1D4DCB2602646DEC9751E763DBA37BD"
168 "F8FF9406AD9E530EE5DB382F413001AEB06A53ED9027D831"
169 "179727B0865A8918DA3EDBEBCF9B14ED44CE6CBACED4BB1B"
170 "DB7F1447E6CC254B332051512BD7AF426FB8F401378CD2BF"
171 "5983CA01C64B92ECF032EA15D1721D03F482D7CE6E74FEF6"
172 "D55E702F46980C82B5A84031900B1C9E59E7C97FBEC7E8F3"
173 "23A97A7E36CC88BE0F1D45B7FF585AC54BD407B22B4154AA"
174 "CC8F6D7EBF48E1D814CC5ED20F8037E0A79715EEF29BE328"
175 "06A1D58BB7C5DA76F550AA3D8A1FBFF0EB19CCB1A313D55C"
176 "DA56C9EC2EF29632387FE8D76E3C0468043E8F663F4860EE"
177 "12BF2D5B0B7474D6E694F91E6DBE115974A3926F12FEE5E4"
178 "38777CB6A932DF8CD8BEC4D073B931BA3BC832B68D9DD300"
179 "741FA7BF8AFC47ED2576F6936BA424663AAB639C5AE4F568"
180 "3423B4742BF1C978238F16CBE39D652DE3FDB8BEFC848AD9"
181 "22222E04A4037C0713EB57A81A23F0C73473FC646CEA306B"
182 "4BCBC8862F8385DDFA9D4B7FA2C087E879683303ED5BDD3A"
183 "062B3CF5B3A278A66D2A13F83F44F82DDF310EE074AB6A36"
184 "4597E899A0255DC164F31CC50846851DF9AB48195DED7EA1"
185 "B1D510BD7EE74D73FAF36BC31ECFA268359046F4EB879F92"
186 "4009438B481C6CD7889A002ED5EE382BC9190DA6FC026E47"
187 "9558E4475677E9AA9E3050E2765694DFC81F56E880B96E71"
188 "60C980DD98EDD3DFFFFFFFFFFFFFFFFF";
Ed Warnickecb9cada2015-12-08 15:45:58 -0700189static const char modp_dh_8192_generator[] = "02";
190
191/* from RFC5114 */
192static const char modp_dh_1024_160_prime[] =
Keith Burns (alagalah)166a9d42016-08-06 11:00:56 -0700193 "B10B8F96A080E01DDE92DE5EAE5D54EC52C99FBCFB06A3C6"
194 "9A6A9DCA52D23B616073E28675A23D189838EF1E2EE652C0"
195 "13ECB4AEA906112324975C3CD49B83BFACCBDD7D90C4BD70"
196 "98488E9C219A73724EFFD6FAE5644738FAA31A4FF55BCCC0"
197 "A151AF5F0DC8B4BD45BF37DF365C1A65E68CFDA76D4DA708" "DF1FB2BC2E4A4371";
Ed Warnickecb9cada2015-12-08 15:45:58 -0700198static const char modp_dh_1024_160_generator[] =
Keith Burns (alagalah)166a9d42016-08-06 11:00:56 -0700199 "A4D1CBD5C3FD34126765A442EFB99905F8104DD258AC507F"
200 "D6406CFF14266D31266FEA1E5C41564B777E690F5504F213"
201 "160217B4B01B886A5E91547F9E2749F4D7FBD7D3B9A92EE1"
202 "909D0D2263F80A76A6A24C087A091F531DBF0A0169B6A28A"
203 "D662A4D18E73AFA32D779D5918D08BC8858F4DCEF97C2A24" "855E6EEB22B3B2E5";
Ed Warnickecb9cada2015-12-08 15:45:58 -0700204
205static const char modp_dh_2048_224_prime[] =
Keith Burns (alagalah)166a9d42016-08-06 11:00:56 -0700206 "AD107E1E9123A9D0D660FAA79559C51FA20D64E5683B9FD1"
207 "B54B1597B61D0A75E6FA141DF95A56DBAF9A3C407BA1DF15"
208 "EB3D688A309C180E1DE6B85A1274A0A66D3F8152AD6AC212"
209 "9037C9EDEFDA4DF8D91E8FEF55B7394B7AD5B7D0B6C12207"
210 "C9F98D11ED34DBF6C6BA0B2C8BBC27BE6A00E0A0B9C49708"
211 "B3BF8A317091883681286130BC8985DB1602E714415D9330"
212 "278273C7DE31EFDC7310F7121FD5A07415987D9ADC0A486D"
213 "CDF93ACC44328387315D75E198C641A480CD86A1B9E587E8"
214 "BE60E69CC928B2B9C52172E413042E9B23F10B0E16E79763"
215 "C9B53DCF4BA80A29E3FB73C16B8E75B97EF363E2FFA31F71"
216 "CF9DE5384E71B81C0AC4DFFE0C10E64F";
Ed Warnickecb9cada2015-12-08 15:45:58 -0700217static const char modp_dh_2048_224_generator[] =
Keith Burns (alagalah)166a9d42016-08-06 11:00:56 -0700218 "AC4032EF4F2D9AE39DF30B5C8FFDAC506CDEBE7B89998CAF"
219 "74866A08CFE4FFE3A6824A4E10B9A6F0DD921F01A70C4AFA"
220 "AB739D7700C29F52C57DB17C620A8652BE5E9001A8D66AD7"
221 "C17669101999024AF4D027275AC1348BB8A762D0521BC98A"
222 "E247150422EA1ED409939D54DA7460CDB5F6C6B250717CBE"
223 "F180EB34118E98D119529A45D6F834566E3025E316A330EF"
224 "BB77A86F0C1AB15B051AE3D428C8F8ACB70A8137150B8EEB"
225 "10E183EDD19963DDD9E263E4770589EF6AA21E7F5F2FF381"
226 "B539CCE3409D13CD566AFBB48D6C019181E1BCFE94B30269"
227 "EDFE72FE9B6AA4BD7B5A0F1C71CFFF4C19C418E1F6EC0179"
228 "81BC087F2A7065B384B890D3191F2BFA";
Ed Warnickecb9cada2015-12-08 15:45:58 -0700229
230static const char modp_dh_2048_256_prime[] =
Keith Burns (alagalah)166a9d42016-08-06 11:00:56 -0700231 "87A8E61DB4B6663CFFBBD19C651959998CEEF608660DD0F2"
232 "5D2CEED4435E3B00E00DF8F1D61957D4FAF7DF4561B2AA30"
233 "16C3D91134096FAA3BF4296D830E9A7C209E0C6497517ABD"
234 "5A8A9D306BCF67ED91F9E6725B4758C022E0B1EF4275BF7B"
235 "6C5BFC11D45F9088B941F54EB1E59BB8BC39A0BF12307F5C"
236 "4FDB70C581B23F76B63ACAE1CAA6B7902D52526735488A0E"
237 "F13C6D9A51BFA4AB3AD8347796524D8EF6A167B5A41825D9"
238 "67E144E5140564251CCACB83E6B486F6B3CA3F7971506026"
239 "C0B857F689962856DED4010ABD0BE621C3A3960A54E710C3"
240 "75F26375D7014103A4B54330C198AF126116D2276E11715F"
241 "693877FAD7EF09CADB094AE91E1A1597";
Ed Warnickecb9cada2015-12-08 15:45:58 -0700242static const char modp_dh_2048_256_generator[] =
Keith Burns (alagalah)166a9d42016-08-06 11:00:56 -0700243 "3FB32C9B73134D0B2E77506660EDBD484CA7B18F21EF2054"
244 "07F4793A1A0BA12510DBC15077BE463FFF4FED4AAC0BB555"
245 "BE3A6C1B0C6B47B1BC3773BF7E8C6F62901228F8C28CBB18"
246 "A55AE31341000A650196F931C77A57F2DDF463E5E9EC144B"
247 "777DE62AAAB8A8628AC376D282D6ED3864E67982428EBC83"
248 "1D14348F6F2F9193B5045AF2767164E1DFC967C1FB3F2E55"
249 "A4BD1BFFE83B9C80D052B985D182EA0ADB2A3B7313D3FE14"
250 "C8484B1E052588B9B7D2BBD2DF016199ECD06E1557CD0915"
251 "B3353BBB64E0EC377FD028370DF92B52C7891428CDC67EB6"
252 "184B523D1DB246C32F63078490F00EF8D647D148D4795451"
253 "5E2327CFEF98C582664B4C0F6CC41659";
Ed Warnickecb9cada2015-12-08 15:45:58 -0700254
255v8 *
Keith Burns (alagalah)166a9d42016-08-06 11:00:56 -0700256ikev2_calc_prf (ikev2_sa_transform_t * tr, v8 * key, v8 * data)
Ed Warnickecb9cada2015-12-08 15:45:58 -0700257{
258 HMAC_CTX ctx;
Keith Burns (alagalah)166a9d42016-08-06 11:00:56 -0700259 v8 *prf;
Ed Warnickecb9cada2015-12-08 15:45:58 -0700260 unsigned int len = 0;
261
Keith Burns (alagalah)166a9d42016-08-06 11:00:56 -0700262 prf = vec_new (u8, tr->key_trunc);
263 HMAC_CTX_init (&ctx);
264 HMAC_Init_ex (&ctx, key, vec_len (key), tr->md, NULL);
265 HMAC_Update (&ctx, data, vec_len (data));
266 HMAC_Final (&ctx, prf, &len);
267 HMAC_CTX_cleanup (&ctx);
Ed Warnickecb9cada2015-12-08 15:45:58 -0700268
Keith Burns (alagalah)166a9d42016-08-06 11:00:56 -0700269 ASSERT (len == tr->key_trunc);
Ed Warnickecb9cada2015-12-08 15:45:58 -0700270
271 return prf;
272}
Keith Burns (alagalah)166a9d42016-08-06 11:00:56 -0700273
Ed Warnickecb9cada2015-12-08 15:45:58 -0700274u8 *
Keith Burns (alagalah)166a9d42016-08-06 11:00:56 -0700275ikev2_calc_prfplus (ikev2_sa_transform_t * tr, u8 * key, u8 * seed, int len)
Ed Warnickecb9cada2015-12-08 15:45:58 -0700276{
Keith Burns (alagalah)166a9d42016-08-06 11:00:56 -0700277 v8 *t = 0, *s = 0, *tmp = 0, *ret = 0;
Ed Warnickecb9cada2015-12-08 15:45:58 -0700278 u8 x = 0;
279
280 /* prf+ (K,S) = T1 | T2 | T3 | T4 | ...
281
Keith Burns (alagalah)166a9d42016-08-06 11:00:56 -0700282 where:
283 T1 = prf (K, S | 0x01)
284 T2 = prf (K, T1 | S | 0x02)
285 T3 = prf (K, T2 | S | 0x03)
286 T4 = prf (K, T3 | S | 0x04)
287 */
Ed Warnickecb9cada2015-12-08 15:45:58 -0700288
Keith Burns (alagalah)166a9d42016-08-06 11:00:56 -0700289 while (vec_len (ret) < len && x < 255)
290 {
291 if (t)
292 {
293 vec_append (s, t);
294 vec_free (t);
295 }
296
297 vec_append (s, seed);
298 vec_add2 (s, tmp, 1);
299 *tmp = x + 1;
300 t = ikev2_calc_prf (tr, key, s);
301 vec_append (ret, t);
302 vec_free (s);
303 x++;
Ed Warnickecb9cada2015-12-08 15:45:58 -0700304 }
305
Keith Burns (alagalah)166a9d42016-08-06 11:00:56 -0700306 vec_free (t);
Ed Warnickecb9cada2015-12-08 15:45:58 -0700307
Keith Burns (alagalah)166a9d42016-08-06 11:00:56 -0700308 if (x == 255)
309 {
310 vec_free (ret);
311 }
Ed Warnickecb9cada2015-12-08 15:45:58 -0700312
313 return ret;
314}
315
316v8 *
Keith Burns (alagalah)166a9d42016-08-06 11:00:56 -0700317ikev2_calc_integr (ikev2_sa_transform_t * tr, v8 * key, u8 * data, int len)
Ed Warnickecb9cada2015-12-08 15:45:58 -0700318{
Keith Burns (alagalah)166a9d42016-08-06 11:00:56 -0700319 v8 *r;
Ed Warnickecb9cada2015-12-08 15:45:58 -0700320 HMAC_CTX hctx;
321 unsigned int l;
322
Keith Burns (alagalah)166a9d42016-08-06 11:00:56 -0700323 ASSERT (tr->type == IKEV2_TRANSFORM_TYPE_INTEG);
Ed Warnickecb9cada2015-12-08 15:45:58 -0700324
Keith Burns (alagalah)166a9d42016-08-06 11:00:56 -0700325 r = vec_new (u8, tr->key_len);
Ed Warnickecb9cada2015-12-08 15:45:58 -0700326
327 /* verify integrity of data */
Keith Burns (alagalah)166a9d42016-08-06 11:00:56 -0700328 HMAC_CTX_init (&hctx);
329 HMAC_Init (&hctx, key, vec_len (key), tr->md);
330 HMAC_Update (&hctx, (const u8 *) data, len);
331 HMAC_Final (&hctx, r, &l);
332 HMAC_CTX_cleanup (&hctx);
Ed Warnickecb9cada2015-12-08 15:45:58 -0700333
Keith Burns (alagalah)166a9d42016-08-06 11:00:56 -0700334 ASSERT (l == tr->key_len);
Ed Warnickecb9cada2015-12-08 15:45:58 -0700335
336 return r;
337}
338
339v8 *
Keith Burns (alagalah)166a9d42016-08-06 11:00:56 -0700340ikev2_decrypt_data (ikev2_sa_t * sa, u8 * data, int len)
Ed Warnickecb9cada2015-12-08 15:45:58 -0700341{
342 EVP_CIPHER_CTX ctx;
Keith Burns (alagalah)166a9d42016-08-06 11:00:56 -0700343 v8 *r;
Ed Warnickecb9cada2015-12-08 15:45:58 -0700344 int out_len = 0, block_size;
Keith Burns (alagalah)166a9d42016-08-06 11:00:56 -0700345 ikev2_sa_transform_t *tr_encr;
Ed Warnickecb9cada2015-12-08 15:45:58 -0700346
Keith Burns (alagalah)166a9d42016-08-06 11:00:56 -0700347 tr_encr =
348 ikev2_sa_get_td_for_type (sa->r_proposals, IKEV2_TRANSFORM_TYPE_ENCR);
Ed Warnickecb9cada2015-12-08 15:45:58 -0700349 block_size = tr_encr->block_size;
350
351 /* check if data is multiplier of cipher block size */
Keith Burns (alagalah)166a9d42016-08-06 11:00:56 -0700352 if (len % block_size)
353 {
354 clib_warning ("wrong data length");
355 return 0;
356 }
Ed Warnickecb9cada2015-12-08 15:45:58 -0700357
Keith Burns (alagalah)166a9d42016-08-06 11:00:56 -0700358 EVP_CIPHER_CTX_init (&ctx);
359 r = vec_new (u8, len - block_size);
360 EVP_DecryptInit_ex (&ctx, tr_encr->cipher, NULL, sa->sk_ei, data);
361 EVP_DecryptUpdate (&ctx, r, &out_len, data + block_size, len - block_size);
362 EVP_DecryptFinal_ex (&ctx, r + out_len, &out_len);
Ed Warnickecb9cada2015-12-08 15:45:58 -0700363
364 /* remove padding */
Keith Burns (alagalah)166a9d42016-08-06 11:00:56 -0700365 _vec_len (r) -= r[vec_len (r) - 1] + 1;
Ed Warnickecb9cada2015-12-08 15:45:58 -0700366
Keith Burns (alagalah)166a9d42016-08-06 11:00:56 -0700367 EVP_CIPHER_CTX_cleanup (&ctx);
Ed Warnickecb9cada2015-12-08 15:45:58 -0700368 return r;
369}
370
371int
Keith Burns (alagalah)166a9d42016-08-06 11:00:56 -0700372ikev2_encrypt_data (ikev2_sa_t * sa, v8 * src, u8 * dst)
Ed Warnickecb9cada2015-12-08 15:45:58 -0700373{
374 EVP_CIPHER_CTX ctx;
375 int out_len;
376 int bs;
Keith Burns (alagalah)166a9d42016-08-06 11:00:56 -0700377 ikev2_sa_transform_t *tr_encr;
Ed Warnickecb9cada2015-12-08 15:45:58 -0700378
Keith Burns (alagalah)166a9d42016-08-06 11:00:56 -0700379 tr_encr =
380 ikev2_sa_get_td_for_type (sa->r_proposals, IKEV2_TRANSFORM_TYPE_ENCR);
Ed Warnickecb9cada2015-12-08 15:45:58 -0700381 bs = tr_encr->block_size;
382
383 /* generate IV */
Keith Burns (alagalah)166a9d42016-08-06 11:00:56 -0700384 RAND_bytes (dst, bs);
Ed Warnickecb9cada2015-12-08 15:45:58 -0700385
Keith Burns (alagalah)166a9d42016-08-06 11:00:56 -0700386 EVP_CIPHER_CTX_init (&ctx);
Ed Warnickecb9cada2015-12-08 15:45:58 -0700387
Keith Burns (alagalah)166a9d42016-08-06 11:00:56 -0700388 EVP_EncryptInit_ex (&ctx, tr_encr->cipher, NULL, sa->sk_er, dst /* dst */ );
389 EVP_EncryptUpdate (&ctx, dst + bs, &out_len, src, vec_len (src));
Ed Warnickecb9cada2015-12-08 15:45:58 -0700390
Keith Burns (alagalah)166a9d42016-08-06 11:00:56 -0700391 EVP_CIPHER_CTX_cleanup (&ctx);
Ed Warnickecb9cada2015-12-08 15:45:58 -0700392
Keith Burns (alagalah)166a9d42016-08-06 11:00:56 -0700393 ASSERT (vec_len (src) == out_len);
Ed Warnickecb9cada2015-12-08 15:45:58 -0700394
395 return out_len + bs;
396}
397
398void
Keith Burns (alagalah)166a9d42016-08-06 11:00:56 -0700399ikev2_generate_dh (ikev2_sa_t * sa, ikev2_sa_transform_t * t)
Ed Warnickecb9cada2015-12-08 15:45:58 -0700400{
401 int r;
402
403 if (t->dh_group == IKEV2_DH_GROUP_MODP)
404 {
Keith Burns (alagalah)166a9d42016-08-06 11:00:56 -0700405 DH *dh = DH_new ();
406 BN_hex2bn (&dh->p, t->dh_p);
407 BN_hex2bn (&dh->g, t->dh_g);
408 DH_generate_key (dh);
Ed Warnickecb9cada2015-12-08 15:45:58 -0700409
Keith Burns (alagalah)166a9d42016-08-06 11:00:56 -0700410 sa->r_dh_data = vec_new (u8, t->key_len);
411 r = BN_bn2bin (dh->pub_key, sa->r_dh_data);
412 ASSERT (r == t->key_len);
Ed Warnickecb9cada2015-12-08 15:45:58 -0700413
Keith Burns (alagalah)166a9d42016-08-06 11:00:56 -0700414 BIGNUM *ex;
415 sa->dh_shared_key = vec_new (u8, t->key_len);
416 ex = BN_bin2bn (sa->i_dh_data, vec_len (sa->i_dh_data), NULL);
417 r = DH_compute_key (sa->dh_shared_key, ex, dh);
418 ASSERT (r == t->key_len);
419 BN_clear_free (ex);
420 DH_free (dh);
Ed Warnickecb9cada2015-12-08 15:45:58 -0700421 }
422 else if (t->dh_group == IKEV2_DH_GROUP_ECP)
423 {
Keith Burns (alagalah)166a9d42016-08-06 11:00:56 -0700424 EC_KEY *ec = EC_KEY_new_by_curve_name (t->nid);
425 ASSERT (ec);
Ed Warnickecb9cada2015-12-08 15:45:58 -0700426
Keith Burns (alagalah)166a9d42016-08-06 11:00:56 -0700427 EC_KEY_generate_key (ec);
Ed Warnickecb9cada2015-12-08 15:45:58 -0700428
Keith Burns (alagalah)166a9d42016-08-06 11:00:56 -0700429 const EC_POINT *r_point = EC_KEY_get0_public_key (ec);
430 const EC_GROUP *group = EC_KEY_get0_group (ec);
431 BIGNUM *x = NULL, *y = NULL;
432 BN_CTX *bn_ctx = BN_CTX_new ();
Ed Warnickecb9cada2015-12-08 15:45:58 -0700433 u16 x_off, y_off, len;
Keith Burns (alagalah)166a9d42016-08-06 11:00:56 -0700434 EC_POINT *i_point = EC_POINT_new (group);
435 EC_POINT *shared_point = EC_POINT_new (group);
Ed Warnickecb9cada2015-12-08 15:45:58 -0700436
Keith Burns (alagalah)166a9d42016-08-06 11:00:56 -0700437 x = BN_new ();
438 y = BN_new ();
Ed Warnickecb9cada2015-12-08 15:45:58 -0700439 len = t->key_len / 2;
440
Keith Burns (alagalah)166a9d42016-08-06 11:00:56 -0700441 EC_POINT_get_affine_coordinates_GFp (group, r_point, x, y, bn_ctx);
442 sa->r_dh_data = vec_new (u8, t->key_len);
443 x_off = len - BN_num_bytes (x);
444 memset (sa->r_dh_data, 0, x_off);
445 BN_bn2bin (x, sa->r_dh_data + x_off);
446 y_off = t->key_len - BN_num_bytes (y);
447 memset (sa->r_dh_data + len, 0, y_off - len);
448 BN_bn2bin (y, sa->r_dh_data + y_off);
Ed Warnickecb9cada2015-12-08 15:45:58 -0700449
Keith Burns (alagalah)166a9d42016-08-06 11:00:56 -0700450 x = BN_bin2bn (sa->i_dh_data, len, x);
451 y = BN_bin2bn (sa->i_dh_data + len, len, y);
452 EC_POINT_set_affine_coordinates_GFp (group, i_point, x, y, bn_ctx);
453 sa->dh_shared_key = vec_new (u8, t->key_len);
454 EC_POINT_mul (group, shared_point, NULL, i_point,
455 EC_KEY_get0_private_key (ec), NULL);
456 EC_POINT_get_affine_coordinates_GFp (group, shared_point, x, y, bn_ctx);
457 x_off = len - BN_num_bytes (x);
458 memset (sa->dh_shared_key, 0, x_off);
459 BN_bn2bin (x, sa->dh_shared_key + x_off);
460 y_off = t->key_len - BN_num_bytes (y);
461 memset (sa->dh_shared_key + len, 0, y_off - len);
462 BN_bn2bin (y, sa->dh_shared_key + y_off);
Ed Warnickecb9cada2015-12-08 15:45:58 -0700463
Keith Burns (alagalah)166a9d42016-08-06 11:00:56 -0700464 EC_KEY_free (ec);
465 BN_free (x);
466 BN_free (y);
467 BN_CTX_free (bn_ctx);
468 EC_POINT_free (i_point);
469 EC_POINT_free (shared_point);
Ed Warnickecb9cada2015-12-08 15:45:58 -0700470 }
471}
472
473int
Keith Burns (alagalah)166a9d42016-08-06 11:00:56 -0700474ikev2_verify_sign (EVP_PKEY * pkey, u8 * sigbuf, u8 * data)
Ed Warnickecb9cada2015-12-08 15:45:58 -0700475{
476 EVP_MD_CTX md_ctx;
477
Keith Burns (alagalah)166a9d42016-08-06 11:00:56 -0700478 EVP_VerifyInit (&md_ctx, EVP_sha1 ());
479 EVP_VerifyUpdate (&md_ctx, data, vec_len (data));
Ed Warnickecb9cada2015-12-08 15:45:58 -0700480
Keith Burns (alagalah)166a9d42016-08-06 11:00:56 -0700481 return EVP_VerifyFinal (&md_ctx, sigbuf, vec_len (sigbuf), pkey);
Ed Warnickecb9cada2015-12-08 15:45:58 -0700482}
483
484u8 *
Keith Burns (alagalah)166a9d42016-08-06 11:00:56 -0700485ikev2_calc_sign (EVP_PKEY * pkey, u8 * data)
Ed Warnickecb9cada2015-12-08 15:45:58 -0700486{
487 EVP_MD_CTX md_ctx;
488 unsigned int sig_len = 0;
Keith Burns (alagalah)166a9d42016-08-06 11:00:56 -0700489 u8 *sign;
Ed Warnickecb9cada2015-12-08 15:45:58 -0700490
Keith Burns (alagalah)166a9d42016-08-06 11:00:56 -0700491 EVP_SignInit (&md_ctx, EVP_sha1 ());
492 EVP_SignUpdate (&md_ctx, data, vec_len (data));
Ed Warnickecb9cada2015-12-08 15:45:58 -0700493 /* get sign len */
Keith Burns (alagalah)166a9d42016-08-06 11:00:56 -0700494 EVP_SignFinal (&md_ctx, NULL, &sig_len, pkey);
495 sign = vec_new (u8, sig_len);
Ed Warnickecb9cada2015-12-08 15:45:58 -0700496 /* calc sign */
Keith Burns (alagalah)166a9d42016-08-06 11:00:56 -0700497 EVP_SignFinal (&md_ctx, sign, &sig_len, pkey);
Ed Warnickecb9cada2015-12-08 15:45:58 -0700498
499 return sign;
500}
501
502EVP_PKEY *
503ikev2_load_cert_file (u8 * file)
504{
Keith Burns (alagalah)166a9d42016-08-06 11:00:56 -0700505 FILE *fp;
506 X509 *x509;
507 EVP_PKEY *pkey = NULL;
Ed Warnickecb9cada2015-12-08 15:45:58 -0700508
Keith Burns (alagalah)166a9d42016-08-06 11:00:56 -0700509 fp = fopen ((char *) file, "r");
Ed Warnickecb9cada2015-12-08 15:45:58 -0700510 if (!fp)
511 {
Keith Burns (alagalah)166a9d42016-08-06 11:00:56 -0700512 clib_warning ("open %s failed", file);
Ed Warnickecb9cada2015-12-08 15:45:58 -0700513 goto end;
514 }
515
Keith Burns (alagalah)166a9d42016-08-06 11:00:56 -0700516 x509 = PEM_read_X509 (fp, NULL, NULL, NULL);
517 fclose (fp);
Ed Warnickecb9cada2015-12-08 15:45:58 -0700518 if (x509 == NULL)
519 {
Keith Burns (alagalah)166a9d42016-08-06 11:00:56 -0700520 clib_warning ("read cert %s failed", file);
Ed Warnickecb9cada2015-12-08 15:45:58 -0700521 goto end;
522 }
523
Keith Burns (alagalah)166a9d42016-08-06 11:00:56 -0700524 pkey = X509_get_pubkey (x509);
Ed Warnickecb9cada2015-12-08 15:45:58 -0700525 if (pkey == NULL)
Keith Burns (alagalah)166a9d42016-08-06 11:00:56 -0700526 clib_warning ("get pubkey %s failed", file);
Ed Warnickecb9cada2015-12-08 15:45:58 -0700527
528end:
529 return pkey;
530}
531
532EVP_PKEY *
533ikev2_load_key_file (u8 * file)
534{
535 FILE *fp;
Keith Burns (alagalah)166a9d42016-08-06 11:00:56 -0700536 EVP_PKEY *pkey = NULL;
Ed Warnickecb9cada2015-12-08 15:45:58 -0700537
Keith Burns (alagalah)166a9d42016-08-06 11:00:56 -0700538 fp = fopen ((char *) file, "r");
Ed Warnickecb9cada2015-12-08 15:45:58 -0700539 if (!fp)
540 {
Keith Burns (alagalah)166a9d42016-08-06 11:00:56 -0700541 clib_warning ("open %s failed", file);
Ed Warnickecb9cada2015-12-08 15:45:58 -0700542 goto end;
543 }
544
Keith Burns (alagalah)166a9d42016-08-06 11:00:56 -0700545 pkey = PEM_read_PrivateKey (fp, NULL, NULL, NULL);
546 fclose (fp);
Ed Warnickecb9cada2015-12-08 15:45:58 -0700547 if (pkey == NULL)
Keith Burns (alagalah)166a9d42016-08-06 11:00:56 -0700548 clib_warning ("read %s failed", file);
Ed Warnickecb9cada2015-12-08 15:45:58 -0700549
550end:
551 return pkey;
552}
553
554void
555ikev2_crypto_init (ikev2_main_t * km)
556{
Keith Burns (alagalah)166a9d42016-08-06 11:00:56 -0700557 ikev2_sa_transform_t *tr;
Ed Warnickecb9cada2015-12-08 15:45:58 -0700558
559 /* vector of supported transforms - in order of preference */
Keith Burns (alagalah)166a9d42016-08-06 11:00:56 -0700560 vec_add2 (km->supported_transforms, tr, 1);
561 tr->type = IKEV2_TRANSFORM_TYPE_ENCR;
562 tr->encr_type = IKEV2_TRANSFORM_ENCR_TYPE_AES_CBC;
563 tr->key_len = 256 / 8;
564 tr->block_size = 128 / 8;
565 tr->cipher = EVP_aes_256_cbc ();
Ed Warnickecb9cada2015-12-08 15:45:58 -0700566
Keith Burns (alagalah)166a9d42016-08-06 11:00:56 -0700567 vec_add2 (km->supported_transforms, tr, 1);
568 tr->type = IKEV2_TRANSFORM_TYPE_ENCR;
569 tr->encr_type = IKEV2_TRANSFORM_ENCR_TYPE_AES_CBC;
570 tr->key_len = 192 / 8;
571 tr->block_size = 128 / 8;
572 tr->cipher = EVP_aes_192_cbc ();
Ed Warnickecb9cada2015-12-08 15:45:58 -0700573
Keith Burns (alagalah)166a9d42016-08-06 11:00:56 -0700574 vec_add2 (km->supported_transforms, tr, 1);
575 tr->type = IKEV2_TRANSFORM_TYPE_ENCR;
576 tr->encr_type = IKEV2_TRANSFORM_ENCR_TYPE_AES_CBC;
577 tr->key_len = 128 / 8;
578 tr->block_size = 128 / 8;
579 tr->cipher = EVP_aes_128_cbc ();
Ed Warnickecb9cada2015-12-08 15:45:58 -0700580
Keith Burns (alagalah)166a9d42016-08-06 11:00:56 -0700581 vec_add2 (km->supported_transforms, tr, 1);
582 tr->type = IKEV2_TRANSFORM_TYPE_PRF;
583 tr->prf_type = IKEV2_TRANSFORM_PRF_TYPE_PRF_HMAC_SHA1;
584 tr->key_len = 160 / 8;
585 tr->key_trunc = 160 / 8;
586 tr->md = EVP_sha1 ();
Ed Warnickecb9cada2015-12-08 15:45:58 -0700587
Keith Burns (alagalah)166a9d42016-08-06 11:00:56 -0700588 vec_add2 (km->supported_transforms, tr, 1);
589 tr->type = IKEV2_TRANSFORM_TYPE_INTEG;
590 tr->integ_type = IKEV2_TRANSFORM_INTEG_TYPE_AUTH_HMAC_SHA1_96;
591 tr->key_len = 160 / 8;
592 tr->key_trunc = 96 / 8;
593 tr->md = EVP_sha1 ();
Ed Warnickecb9cada2015-12-08 15:45:58 -0700594
595#if defined(OPENSSL_NO_CISCO_FECDH)
Keith Burns (alagalah)166a9d42016-08-06 11:00:56 -0700596 vec_add2 (km->supported_transforms, tr, 1);
597 tr->type = IKEV2_TRANSFORM_TYPE_DH;
598 tr->dh_type = IKEV2_TRANSFORM_DH_TYPE_BRAINPOOL_512;
599 tr->key_len = (512 * 2) / 8;
600 tr->nid = NID_brainpoolP512r1;
601 tr->dh_group = IKEV2_DH_GROUP_ECP;
Ed Warnickecb9cada2015-12-08 15:45:58 -0700602
Keith Burns (alagalah)166a9d42016-08-06 11:00:56 -0700603 vec_add2 (km->supported_transforms, tr, 1);
604 tr->type = IKEV2_TRANSFORM_TYPE_DH;
605 tr->dh_type = IKEV2_TRANSFORM_DH_TYPE_BRAINPOOL_384;
606 tr->key_len = (384 * 2) / 8;
607 tr->nid = NID_brainpoolP384r1;
608 tr->dh_group = IKEV2_DH_GROUP_ECP;
Ed Warnickecb9cada2015-12-08 15:45:58 -0700609
Keith Burns (alagalah)166a9d42016-08-06 11:00:56 -0700610 vec_add2 (km->supported_transforms, tr, 1);
611 tr->type = IKEV2_TRANSFORM_TYPE_DH;
612 tr->dh_type = IKEV2_TRANSFORM_DH_TYPE_BRAINPOOL_256;
613 tr->key_len = (256 * 2) / 8;
614 tr->nid = NID_brainpoolP256r1;
615 tr->dh_group = IKEV2_DH_GROUP_ECP;
Ed Warnickecb9cada2015-12-08 15:45:58 -0700616
Keith Burns (alagalah)166a9d42016-08-06 11:00:56 -0700617 vec_add2 (km->supported_transforms, tr, 1);
618 tr->type = IKEV2_TRANSFORM_TYPE_DH;
619 tr->dh_type = IKEV2_TRANSFORM_DH_TYPE_BRAINPOOL_224;
620 tr->key_len = (224 * 2) / 8;
621 tr->nid = NID_brainpoolP224r1;
622 tr->dh_group = IKEV2_DH_GROUP_ECP;
Ed Warnickecb9cada2015-12-08 15:45:58 -0700623
Keith Burns (alagalah)166a9d42016-08-06 11:00:56 -0700624 vec_add2 (km->supported_transforms, tr, 1);
625 tr->type = IKEV2_TRANSFORM_TYPE_DH;
626 tr->dh_type = IKEV2_TRANSFORM_DH_TYPE_ECP_224;
627 tr->key_len = (224 * 2) / 8;
628 tr->nid = NID_secp224r1;
629 tr->dh_group = IKEV2_DH_GROUP_ECP;
Ed Warnickecb9cada2015-12-08 15:45:58 -0700630#endif
631
Keith Burns (alagalah)166a9d42016-08-06 11:00:56 -0700632 vec_add2 (km->supported_transforms, tr, 1);
633 tr->type = IKEV2_TRANSFORM_TYPE_DH;
634 tr->dh_type = IKEV2_TRANSFORM_DH_TYPE_ECP_521;
635 tr->key_len = (528 * 2) / 8;
636 tr->nid = NID_secp521r1;
637 tr->dh_group = IKEV2_DH_GROUP_ECP;
Ed Warnickecb9cada2015-12-08 15:45:58 -0700638
Keith Burns (alagalah)166a9d42016-08-06 11:00:56 -0700639 vec_add2 (km->supported_transforms, tr, 1);
640 tr->type = IKEV2_TRANSFORM_TYPE_DH;
641 tr->dh_type = IKEV2_TRANSFORM_DH_TYPE_ECP_384;
642 tr->key_len = (384 * 2) / 8;
643 tr->nid = NID_secp384r1;
644 tr->dh_group = IKEV2_DH_GROUP_ECP;
Ed Warnickecb9cada2015-12-08 15:45:58 -0700645
Keith Burns (alagalah)166a9d42016-08-06 11:00:56 -0700646 vec_add2 (km->supported_transforms, tr, 1);
647 tr->type = IKEV2_TRANSFORM_TYPE_DH;
648 tr->dh_type = IKEV2_TRANSFORM_DH_TYPE_ECP_256;
649 tr->key_len = (256 * 2) / 8;
650 tr->nid = NID_X9_62_prime256v1;
651 tr->dh_group = IKEV2_DH_GROUP_ECP;
Ed Warnickecb9cada2015-12-08 15:45:58 -0700652
Keith Burns (alagalah)166a9d42016-08-06 11:00:56 -0700653 vec_add2 (km->supported_transforms, tr, 1);
654 tr->type = IKEV2_TRANSFORM_TYPE_DH;
655 tr->dh_type = IKEV2_TRANSFORM_DH_TYPE_ECP_192;
656 tr->key_len = (192 * 2) / 8;
657 tr->nid = NID_X9_62_prime192v1;
658 tr->dh_group = IKEV2_DH_GROUP_ECP;
Ed Warnickecb9cada2015-12-08 15:45:58 -0700659
Keith Burns (alagalah)166a9d42016-08-06 11:00:56 -0700660 vec_add2 (km->supported_transforms, tr, 1);
661 tr->type = IKEV2_TRANSFORM_TYPE_DH;
662 tr->dh_type = IKEV2_TRANSFORM_DH_TYPE_MODP_2048_256;
663 tr->key_len = 2048 / 8;
664 tr->dh_p = (const char *) &modp_dh_2048_256_prime;
665 tr->dh_g = (const char *) &modp_dh_2048_256_generator;
666 tr->dh_group = IKEV2_DH_GROUP_MODP;
Ed Warnickecb9cada2015-12-08 15:45:58 -0700667
Keith Burns (alagalah)166a9d42016-08-06 11:00:56 -0700668 vec_add2 (km->supported_transforms, tr, 1);
669 tr->type = IKEV2_TRANSFORM_TYPE_DH;
670 tr->dh_type = IKEV2_TRANSFORM_DH_TYPE_MODP_2048_224;
671 tr->key_len = 2048 / 8;
672 tr->dh_p = (const char *) &modp_dh_2048_224_prime;
673 tr->dh_g = (const char *) &modp_dh_2048_224_generator;
674 tr->dh_group = IKEV2_DH_GROUP_MODP;
Ed Warnickecb9cada2015-12-08 15:45:58 -0700675
Keith Burns (alagalah)166a9d42016-08-06 11:00:56 -0700676 vec_add2 (km->supported_transforms, tr, 1);
677 tr->type = IKEV2_TRANSFORM_TYPE_DH;
678 tr->dh_type = IKEV2_TRANSFORM_DH_TYPE_MODP_1024_160;
679 tr->key_len = 1024 / 8;
680 tr->dh_p = (const char *) &modp_dh_1024_160_prime;
681 tr->dh_g = (const char *) &modp_dh_1024_160_generator;
682 tr->dh_group = IKEV2_DH_GROUP_MODP;
Ed Warnickecb9cada2015-12-08 15:45:58 -0700683
Keith Burns (alagalah)166a9d42016-08-06 11:00:56 -0700684 vec_add2 (km->supported_transforms, tr, 1);
685 tr->type = IKEV2_TRANSFORM_TYPE_DH;
686 tr->dh_type = IKEV2_TRANSFORM_DH_TYPE_MODP_8192;
687 tr->key_len = 8192 / 8;
688 tr->dh_p = (const char *) &modp_dh_8192_prime;
689 tr->dh_g = (const char *) &modp_dh_8192_generator;
690 tr->dh_group = IKEV2_DH_GROUP_MODP;
Ed Warnickecb9cada2015-12-08 15:45:58 -0700691
Keith Burns (alagalah)166a9d42016-08-06 11:00:56 -0700692 vec_add2 (km->supported_transforms, tr, 1);
693 tr->type = IKEV2_TRANSFORM_TYPE_DH;
694 tr->dh_type = IKEV2_TRANSFORM_DH_TYPE_MODP_6144;
695 tr->key_len = 6144 / 8;
696 tr->dh_p = (const char *) &modp_dh_6144_prime;
697 tr->dh_g = (const char *) &modp_dh_6144_generator;
698 tr->dh_group = IKEV2_DH_GROUP_MODP;
Ed Warnickecb9cada2015-12-08 15:45:58 -0700699
Keith Burns (alagalah)166a9d42016-08-06 11:00:56 -0700700 vec_add2 (km->supported_transforms, tr, 1);
701 tr->type = IKEV2_TRANSFORM_TYPE_DH;
702 tr->dh_type = IKEV2_TRANSFORM_DH_TYPE_MODP_4096;
703 tr->key_len = 4096 / 8;
704 tr->dh_p = (const char *) &modp_dh_4096_prime;
705 tr->dh_g = (const char *) &modp_dh_4096_generator;
706 tr->dh_group = IKEV2_DH_GROUP_MODP;
Ed Warnickecb9cada2015-12-08 15:45:58 -0700707
Keith Burns (alagalah)166a9d42016-08-06 11:00:56 -0700708 vec_add2 (km->supported_transforms, tr, 1);
709 tr->type = IKEV2_TRANSFORM_TYPE_DH;
710 tr->dh_type = IKEV2_TRANSFORM_DH_TYPE_MODP_3072;
711 tr->key_len = 3072 / 8;
712 tr->dh_p = (const char *) &modp_dh_3072_prime;
713 tr->dh_g = (const char *) &modp_dh_3072_generator;
714 tr->dh_group = IKEV2_DH_GROUP_MODP;
Ed Warnickecb9cada2015-12-08 15:45:58 -0700715
Keith Burns (alagalah)166a9d42016-08-06 11:00:56 -0700716 vec_add2 (km->supported_transforms, tr, 1);
717 tr->type = IKEV2_TRANSFORM_TYPE_DH;
718 tr->dh_type = IKEV2_TRANSFORM_DH_TYPE_MODP_2048;
719 tr->key_len = 2048 / 8;
720 tr->dh_p = (const char *) &modp_dh_2048_prime;
721 tr->dh_g = (const char *) &modp_dh_2048_generator;
722 tr->dh_group = IKEV2_DH_GROUP_MODP;
Ed Warnickecb9cada2015-12-08 15:45:58 -0700723
Keith Burns (alagalah)166a9d42016-08-06 11:00:56 -0700724 vec_add2 (km->supported_transforms, tr, 1);
725 tr->type = IKEV2_TRANSFORM_TYPE_DH;
726 tr->dh_type = IKEV2_TRANSFORM_DH_TYPE_MODP_1536;
727 tr->key_len = 1536 / 8;
728 tr->dh_p = (const char *) &modp_dh_1536_prime;
729 tr->dh_g = (const char *) &modp_dh_1536_generator;
730 tr->dh_group = IKEV2_DH_GROUP_MODP;
Ed Warnickecb9cada2015-12-08 15:45:58 -0700731
Keith Burns (alagalah)166a9d42016-08-06 11:00:56 -0700732 vec_add2 (km->supported_transforms, tr, 1);
733 tr->type = IKEV2_TRANSFORM_TYPE_DH;
734 tr->dh_type = IKEV2_TRANSFORM_DH_TYPE_MODP_1024;
735 tr->key_len = 1024 / 8;
736 tr->dh_p = (const char *) &modp_dh_1024_prime;
737 tr->dh_g = (const char *) &modp_dh_1024_generator;
738 tr->dh_group = IKEV2_DH_GROUP_MODP;
Ed Warnickecb9cada2015-12-08 15:45:58 -0700739
Keith Burns (alagalah)166a9d42016-08-06 11:00:56 -0700740 vec_add2 (km->supported_transforms, tr, 1);
741 tr->type = IKEV2_TRANSFORM_TYPE_DH;
742 tr->dh_type = IKEV2_TRANSFORM_DH_TYPE_MODP_768;
743 tr->key_len = 768 / 8;
744 tr->dh_p = (const char *) &modp_dh_768_prime;
745 tr->dh_g = (const char *) &modp_dh_768_generator;
746 tr->dh_group = IKEV2_DH_GROUP_MODP;
Ed Warnickecb9cada2015-12-08 15:45:58 -0700747
Keith Burns (alagalah)166a9d42016-08-06 11:00:56 -0700748 vec_add2 (km->supported_transforms, tr, 1);
749 tr->type = IKEV2_TRANSFORM_TYPE_ESN;
750 tr->esn_type = IKEV2_TRANSFORM_ESN_TYPE_ESN;
Ed Warnickecb9cada2015-12-08 15:45:58 -0700751
Keith Burns (alagalah)166a9d42016-08-06 11:00:56 -0700752 vec_add2 (km->supported_transforms, tr, 1);
753 tr->type = IKEV2_TRANSFORM_TYPE_ESN;
754 tr->esn_type = IKEV2_TRANSFORM_ESN_TYPE_NO_ESN;
Ed Warnickecb9cada2015-12-08 15:45:58 -0700755}
756
757
Keith Burns (alagalah)166a9d42016-08-06 11:00:56 -0700758
759/*
760 * fd.io coding-style-patch-verification: ON
761 *
762 * Local Variables:
763 * eval: (c-set-style "gnu")
764 * End:
765 */