blob: ca56158f8987d1b72284935d95c29f2f5064d1df [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>
Dave Barach68b0fb02017-02-28 15:15:56 -050020#include <vnet/udp/udp.h>
Ed Warnickecb9cada2015-12-08 15:45:58 -070021#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;
Radu Nicolaucb33dc22017-02-16 16:49:46 +0000346 u8 *key = sa->is_initiator ? sa->sk_er : sa->sk_ei;
Ed Warnickecb9cada2015-12-08 15:45:58 -0700347
Keith Burns (alagalah)166a9d42016-08-06 11:00:56 -0700348 tr_encr =
349 ikev2_sa_get_td_for_type (sa->r_proposals, IKEV2_TRANSFORM_TYPE_ENCR);
Ed Warnickecb9cada2015-12-08 15:45:58 -0700350 block_size = tr_encr->block_size;
351
352 /* check if data is multiplier of cipher block size */
Keith Burns (alagalah)166a9d42016-08-06 11:00:56 -0700353 if (len % block_size)
354 {
355 clib_warning ("wrong data length");
356 return 0;
357 }
Ed Warnickecb9cada2015-12-08 15:45:58 -0700358
Keith Burns (alagalah)166a9d42016-08-06 11:00:56 -0700359 EVP_CIPHER_CTX_init (&ctx);
360 r = vec_new (u8, len - block_size);
Radu Nicolaucb33dc22017-02-16 16:49:46 +0000361 EVP_DecryptInit_ex (&ctx, tr_encr->cipher, NULL, key, data);
Keith Burns (alagalah)166a9d42016-08-06 11:00:56 -0700362 EVP_DecryptUpdate (&ctx, r, &out_len, data + block_size, len - block_size);
363 EVP_DecryptFinal_ex (&ctx, r + out_len, &out_len);
Ed Warnickecb9cada2015-12-08 15:45:58 -0700364
365 /* remove padding */
Keith Burns (alagalah)166a9d42016-08-06 11:00:56 -0700366 _vec_len (r) -= r[vec_len (r) - 1] + 1;
Ed Warnickecb9cada2015-12-08 15:45:58 -0700367
Keith Burns (alagalah)166a9d42016-08-06 11:00:56 -0700368 EVP_CIPHER_CTX_cleanup (&ctx);
Ed Warnickecb9cada2015-12-08 15:45:58 -0700369 return r;
370}
371
372int
Keith Burns (alagalah)166a9d42016-08-06 11:00:56 -0700373ikev2_encrypt_data (ikev2_sa_t * sa, v8 * src, u8 * dst)
Ed Warnickecb9cada2015-12-08 15:45:58 -0700374{
375 EVP_CIPHER_CTX ctx;
376 int out_len;
377 int bs;
Keith Burns (alagalah)166a9d42016-08-06 11:00:56 -0700378 ikev2_sa_transform_t *tr_encr;
Radu Nicolaucb33dc22017-02-16 16:49:46 +0000379 u8 *key = sa->is_initiator ? sa->sk_ei : sa->sk_er;
Ed Warnickecb9cada2015-12-08 15:45:58 -0700380
Keith Burns (alagalah)166a9d42016-08-06 11:00:56 -0700381 tr_encr =
382 ikev2_sa_get_td_for_type (sa->r_proposals, IKEV2_TRANSFORM_TYPE_ENCR);
Ed Warnickecb9cada2015-12-08 15:45:58 -0700383 bs = tr_encr->block_size;
384
385 /* generate IV */
Keith Burns (alagalah)166a9d42016-08-06 11:00:56 -0700386 RAND_bytes (dst, bs);
Ed Warnickecb9cada2015-12-08 15:45:58 -0700387
Keith Burns (alagalah)166a9d42016-08-06 11:00:56 -0700388 EVP_CIPHER_CTX_init (&ctx);
Ed Warnickecb9cada2015-12-08 15:45:58 -0700389
Radu Nicolaucb33dc22017-02-16 16:49:46 +0000390 EVP_EncryptInit_ex (&ctx, tr_encr->cipher, NULL, key, dst /* dst */ );
Keith Burns (alagalah)166a9d42016-08-06 11:00:56 -0700391 EVP_EncryptUpdate (&ctx, dst + bs, &out_len, src, vec_len (src));
Ed Warnickecb9cada2015-12-08 15:45:58 -0700392
Keith Burns (alagalah)166a9d42016-08-06 11:00:56 -0700393 EVP_CIPHER_CTX_cleanup (&ctx);
Ed Warnickecb9cada2015-12-08 15:45:58 -0700394
Keith Burns (alagalah)166a9d42016-08-06 11:00:56 -0700395 ASSERT (vec_len (src) == out_len);
Ed Warnickecb9cada2015-12-08 15:45:58 -0700396
397 return out_len + bs;
398}
399
400void
Keith Burns (alagalah)166a9d42016-08-06 11:00:56 -0700401ikev2_generate_dh (ikev2_sa_t * sa, ikev2_sa_transform_t * t)
Ed Warnickecb9cada2015-12-08 15:45:58 -0700402{
403 int r;
404
405 if (t->dh_group == IKEV2_DH_GROUP_MODP)
406 {
Keith Burns (alagalah)166a9d42016-08-06 11:00:56 -0700407 DH *dh = DH_new ();
408 BN_hex2bn (&dh->p, t->dh_p);
409 BN_hex2bn (&dh->g, t->dh_g);
410 DH_generate_key (dh);
Ed Warnickecb9cada2015-12-08 15:45:58 -0700411
Radu Nicolaucb33dc22017-02-16 16:49:46 +0000412 if (sa->is_initiator)
413 {
414 sa->i_dh_data = vec_new (u8, t->key_len);
415 r = BN_bn2bin (dh->pub_key, sa->i_dh_data);
416 ASSERT (r == t->key_len);
Ed Warnickecb9cada2015-12-08 15:45:58 -0700417
Radu Nicolaucb33dc22017-02-16 16:49:46 +0000418 sa->dh_private_key = vec_new (u8, t->key_len);
419 r = BN_bn2bin (dh->priv_key, sa->dh_private_key);
420 ASSERT (r == t->key_len);
421
422 }
423 else
424 {
425 sa->r_dh_data = vec_new (u8, t->key_len);
426 r = BN_bn2bin (dh->pub_key, sa->r_dh_data);
427 ASSERT (r == t->key_len);
428 BIGNUM *ex;
429 sa->dh_shared_key = vec_new (u8, t->key_len);
430 ex = BN_bin2bn (sa->i_dh_data, vec_len (sa->i_dh_data), NULL);
431 r = DH_compute_key (sa->dh_shared_key, ex, dh);
432 ASSERT (r == t->key_len);
433 BN_clear_free (ex);
434 }
Keith Burns (alagalah)166a9d42016-08-06 11:00:56 -0700435 DH_free (dh);
Ed Warnickecb9cada2015-12-08 15:45:58 -0700436 }
437 else if (t->dh_group == IKEV2_DH_GROUP_ECP)
438 {
Keith Burns (alagalah)166a9d42016-08-06 11:00:56 -0700439 EC_KEY *ec = EC_KEY_new_by_curve_name (t->nid);
440 ASSERT (ec);
Ed Warnickecb9cada2015-12-08 15:45:58 -0700441
Keith Burns (alagalah)166a9d42016-08-06 11:00:56 -0700442 EC_KEY_generate_key (ec);
Ed Warnickecb9cada2015-12-08 15:45:58 -0700443
Keith Burns (alagalah)166a9d42016-08-06 11:00:56 -0700444 const EC_POINT *r_point = EC_KEY_get0_public_key (ec);
445 const EC_GROUP *group = EC_KEY_get0_group (ec);
446 BIGNUM *x = NULL, *y = NULL;
447 BN_CTX *bn_ctx = BN_CTX_new ();
Ed Warnickecb9cada2015-12-08 15:45:58 -0700448 u16 x_off, y_off, len;
Keith Burns (alagalah)166a9d42016-08-06 11:00:56 -0700449 EC_POINT *i_point = EC_POINT_new (group);
450 EC_POINT *shared_point = EC_POINT_new (group);
Ed Warnickecb9cada2015-12-08 15:45:58 -0700451
Keith Burns (alagalah)166a9d42016-08-06 11:00:56 -0700452 x = BN_new ();
453 y = BN_new ();
Ed Warnickecb9cada2015-12-08 15:45:58 -0700454 len = t->key_len / 2;
455
Keith Burns (alagalah)166a9d42016-08-06 11:00:56 -0700456 EC_POINT_get_affine_coordinates_GFp (group, r_point, x, y, bn_ctx);
Radu Nicolaucb33dc22017-02-16 16:49:46 +0000457
458 if (sa->is_initiator)
459 {
460 sa->i_dh_data = vec_new (u8, t->key_len);
461 x_off = len - BN_num_bytes (x);
462 memset (sa->i_dh_data, 0, x_off);
463 BN_bn2bin (x, sa->i_dh_data + x_off);
464 y_off = t->key_len - BN_num_bytes (y);
465 memset (sa->i_dh_data + len, 0, y_off - len);
466 BN_bn2bin (y, sa->i_dh_data + y_off);
467
468 const BIGNUM *prv = EC_KEY_get0_private_key (ec);
469 sa->dh_private_key = vec_new (u8, BN_num_bytes (prv));
470 r = BN_bn2bin (prv, sa->dh_private_key);
471 ASSERT (r == BN_num_bytes (prv));
472 }
473 else
474 {
475 sa->r_dh_data = vec_new (u8, t->key_len);
476 x_off = len - BN_num_bytes (x);
477 memset (sa->r_dh_data, 0, x_off);
478 BN_bn2bin (x, sa->r_dh_data + x_off);
479 y_off = t->key_len - BN_num_bytes (y);
480 memset (sa->r_dh_data + len, 0, y_off - len);
481 BN_bn2bin (y, sa->r_dh_data + y_off);
482
483 x = BN_bin2bn (sa->i_dh_data, len, x);
484 y = BN_bin2bn (sa->i_dh_data + len, len, y);
485 EC_POINT_set_affine_coordinates_GFp (group, i_point, x, y, bn_ctx);
486 sa->dh_shared_key = vec_new (u8, t->key_len);
487 EC_POINT_mul (group, shared_point, NULL, i_point,
488 EC_KEY_get0_private_key (ec), NULL);
489 EC_POINT_get_affine_coordinates_GFp (group, shared_point, x, y,
490 bn_ctx);
491 x_off = len - BN_num_bytes (x);
492 memset (sa->dh_shared_key, 0, x_off);
493 BN_bn2bin (x, sa->dh_shared_key + x_off);
494 y_off = t->key_len - BN_num_bytes (y);
495 memset (sa->dh_shared_key + len, 0, y_off - len);
496 BN_bn2bin (y, sa->dh_shared_key + y_off);
497 }
498
499 EC_KEY_free (ec);
500 BN_free (x);
501 BN_free (y);
502 BN_CTX_free (bn_ctx);
503 EC_POINT_free (i_point);
504 EC_POINT_free (shared_point);
505 }
506}
507
508void
509ikev2_complete_dh (ikev2_sa_t * sa, ikev2_sa_transform_t * t)
510{
511 int r;
512
513 if (t->dh_group == IKEV2_DH_GROUP_MODP)
514 {
515 DH *dh = DH_new ();
516 BN_hex2bn (&dh->p, t->dh_p);
517 BN_hex2bn (&dh->g, t->dh_g);
518 dh->priv_key =
519 BN_bin2bn (sa->dh_private_key, vec_len (sa->dh_private_key), NULL);
520
521 BIGNUM *ex;
522 sa->dh_shared_key = vec_new (u8, t->key_len);
523 ex = BN_bin2bn (sa->r_dh_data, vec_len (sa->r_dh_data), NULL);
524 r = DH_compute_key (sa->dh_shared_key, ex, dh);
525 ASSERT (r == t->key_len);
526 BN_clear_free (ex);
527 DH_free (dh);
528 }
529 else if (t->dh_group == IKEV2_DH_GROUP_ECP)
530 {
531 EC_KEY *ec = EC_KEY_new_by_curve_name (t->nid);
532 ASSERT (ec);
533
534 const EC_GROUP *group = EC_KEY_get0_group (ec);
535 BIGNUM *x = NULL, *y = NULL;
536 BN_CTX *bn_ctx = BN_CTX_new ();
537 u16 x_off, y_off, len;
538 BIGNUM *prv;
539
540 prv =
541 BN_bin2bn (sa->dh_private_key, vec_len (sa->dh_private_key), NULL);
542 EC_KEY_set_private_key (ec, prv);
543
544 x = BN_new ();
545 y = BN_new ();
546 len = t->key_len / 2;
547
548 x = BN_bin2bn (sa->r_dh_data, len, x);
549 y = BN_bin2bn (sa->r_dh_data + len, len, y);
550 EC_POINT *r_point = EC_POINT_new (group);
551 EC_POINT_set_affine_coordinates_GFp (group, r_point, x, y, bn_ctx);
552 EC_KEY_set_public_key (ec, r_point);
553
554 EC_POINT *i_point = EC_POINT_new (group);
555 EC_POINT *shared_point = EC_POINT_new (group);
Ed Warnickecb9cada2015-12-08 15:45:58 -0700556
Keith Burns (alagalah)166a9d42016-08-06 11:00:56 -0700557 x = BN_bin2bn (sa->i_dh_data, len, x);
558 y = BN_bin2bn (sa->i_dh_data + len, len, y);
559 EC_POINT_set_affine_coordinates_GFp (group, i_point, x, y, bn_ctx);
Radu Nicolaucb33dc22017-02-16 16:49:46 +0000560 EC_POINT_mul (group, shared_point, NULL, r_point,
Keith Burns (alagalah)166a9d42016-08-06 11:00:56 -0700561 EC_KEY_get0_private_key (ec), NULL);
562 EC_POINT_get_affine_coordinates_GFp (group, shared_point, x, y, bn_ctx);
Radu Nicolaucb33dc22017-02-16 16:49:46 +0000563 sa->dh_shared_key = vec_new (u8, t->key_len);
Keith Burns (alagalah)166a9d42016-08-06 11:00:56 -0700564 x_off = len - BN_num_bytes (x);
565 memset (sa->dh_shared_key, 0, x_off);
566 BN_bn2bin (x, sa->dh_shared_key + x_off);
567 y_off = t->key_len - BN_num_bytes (y);
568 memset (sa->dh_shared_key + len, 0, y_off - len);
569 BN_bn2bin (y, sa->dh_shared_key + y_off);
Ed Warnickecb9cada2015-12-08 15:45:58 -0700570
Keith Burns (alagalah)166a9d42016-08-06 11:00:56 -0700571 EC_KEY_free (ec);
572 BN_free (x);
573 BN_free (y);
Radu Nicolaucb33dc22017-02-16 16:49:46 +0000574 BN_free (prv);
Keith Burns (alagalah)166a9d42016-08-06 11:00:56 -0700575 BN_CTX_free (bn_ctx);
576 EC_POINT_free (i_point);
Radu Nicolaucb33dc22017-02-16 16:49:46 +0000577 EC_POINT_free (r_point);
Keith Burns (alagalah)166a9d42016-08-06 11:00:56 -0700578 EC_POINT_free (shared_point);
Ed Warnickecb9cada2015-12-08 15:45:58 -0700579 }
580}
581
582int
Keith Burns (alagalah)166a9d42016-08-06 11:00:56 -0700583ikev2_verify_sign (EVP_PKEY * pkey, u8 * sigbuf, u8 * data)
Ed Warnickecb9cada2015-12-08 15:45:58 -0700584{
585 EVP_MD_CTX md_ctx;
586
Keith Burns (alagalah)166a9d42016-08-06 11:00:56 -0700587 EVP_VerifyInit (&md_ctx, EVP_sha1 ());
588 EVP_VerifyUpdate (&md_ctx, data, vec_len (data));
Ed Warnickecb9cada2015-12-08 15:45:58 -0700589
Keith Burns (alagalah)166a9d42016-08-06 11:00:56 -0700590 return EVP_VerifyFinal (&md_ctx, sigbuf, vec_len (sigbuf), pkey);
Ed Warnickecb9cada2015-12-08 15:45:58 -0700591}
592
593u8 *
Keith Burns (alagalah)166a9d42016-08-06 11:00:56 -0700594ikev2_calc_sign (EVP_PKEY * pkey, u8 * data)
Ed Warnickecb9cada2015-12-08 15:45:58 -0700595{
596 EVP_MD_CTX md_ctx;
597 unsigned int sig_len = 0;
Keith Burns (alagalah)166a9d42016-08-06 11:00:56 -0700598 u8 *sign;
Ed Warnickecb9cada2015-12-08 15:45:58 -0700599
Keith Burns (alagalah)166a9d42016-08-06 11:00:56 -0700600 EVP_SignInit (&md_ctx, EVP_sha1 ());
601 EVP_SignUpdate (&md_ctx, data, vec_len (data));
Ed Warnickecb9cada2015-12-08 15:45:58 -0700602 /* get sign len */
Keith Burns (alagalah)166a9d42016-08-06 11:00:56 -0700603 EVP_SignFinal (&md_ctx, NULL, &sig_len, pkey);
604 sign = vec_new (u8, sig_len);
Ed Warnickecb9cada2015-12-08 15:45:58 -0700605 /* calc sign */
Keith Burns (alagalah)166a9d42016-08-06 11:00:56 -0700606 EVP_SignFinal (&md_ctx, sign, &sig_len, pkey);
Ed Warnickecb9cada2015-12-08 15:45:58 -0700607
608 return sign;
609}
610
611EVP_PKEY *
612ikev2_load_cert_file (u8 * file)
613{
Keith Burns (alagalah)166a9d42016-08-06 11:00:56 -0700614 FILE *fp;
615 X509 *x509;
616 EVP_PKEY *pkey = NULL;
Ed Warnickecb9cada2015-12-08 15:45:58 -0700617
Keith Burns (alagalah)166a9d42016-08-06 11:00:56 -0700618 fp = fopen ((char *) file, "r");
Ed Warnickecb9cada2015-12-08 15:45:58 -0700619 if (!fp)
620 {
Keith Burns (alagalah)166a9d42016-08-06 11:00:56 -0700621 clib_warning ("open %s failed", file);
Ed Warnickecb9cada2015-12-08 15:45:58 -0700622 goto end;
623 }
624
Keith Burns (alagalah)166a9d42016-08-06 11:00:56 -0700625 x509 = PEM_read_X509 (fp, NULL, NULL, NULL);
626 fclose (fp);
Ed Warnickecb9cada2015-12-08 15:45:58 -0700627 if (x509 == NULL)
628 {
Keith Burns (alagalah)166a9d42016-08-06 11:00:56 -0700629 clib_warning ("read cert %s failed", file);
Ed Warnickecb9cada2015-12-08 15:45:58 -0700630 goto end;
631 }
632
Keith Burns (alagalah)166a9d42016-08-06 11:00:56 -0700633 pkey = X509_get_pubkey (x509);
Ed Warnickecb9cada2015-12-08 15:45:58 -0700634 if (pkey == NULL)
Keith Burns (alagalah)166a9d42016-08-06 11:00:56 -0700635 clib_warning ("get pubkey %s failed", file);
Ed Warnickecb9cada2015-12-08 15:45:58 -0700636
637end:
638 return pkey;
639}
640
641EVP_PKEY *
642ikev2_load_key_file (u8 * file)
643{
644 FILE *fp;
Keith Burns (alagalah)166a9d42016-08-06 11:00:56 -0700645 EVP_PKEY *pkey = NULL;
Ed Warnickecb9cada2015-12-08 15:45:58 -0700646
Keith Burns (alagalah)166a9d42016-08-06 11:00:56 -0700647 fp = fopen ((char *) file, "r");
Ed Warnickecb9cada2015-12-08 15:45:58 -0700648 if (!fp)
649 {
Keith Burns (alagalah)166a9d42016-08-06 11:00:56 -0700650 clib_warning ("open %s failed", file);
Ed Warnickecb9cada2015-12-08 15:45:58 -0700651 goto end;
652 }
653
Keith Burns (alagalah)166a9d42016-08-06 11:00:56 -0700654 pkey = PEM_read_PrivateKey (fp, NULL, NULL, NULL);
655 fclose (fp);
Ed Warnickecb9cada2015-12-08 15:45:58 -0700656 if (pkey == NULL)
Keith Burns (alagalah)166a9d42016-08-06 11:00:56 -0700657 clib_warning ("read %s failed", file);
Ed Warnickecb9cada2015-12-08 15:45:58 -0700658
659end:
660 return pkey;
661}
662
663void
664ikev2_crypto_init (ikev2_main_t * km)
665{
Keith Burns (alagalah)166a9d42016-08-06 11:00:56 -0700666 ikev2_sa_transform_t *tr;
Ed Warnickecb9cada2015-12-08 15:45:58 -0700667
668 /* vector of supported transforms - in order of preference */
Keith Burns (alagalah)166a9d42016-08-06 11:00:56 -0700669 vec_add2 (km->supported_transforms, tr, 1);
670 tr->type = IKEV2_TRANSFORM_TYPE_ENCR;
671 tr->encr_type = IKEV2_TRANSFORM_ENCR_TYPE_AES_CBC;
672 tr->key_len = 256 / 8;
673 tr->block_size = 128 / 8;
674 tr->cipher = EVP_aes_256_cbc ();
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_ENCR;
678 tr->encr_type = IKEV2_TRANSFORM_ENCR_TYPE_AES_CBC;
679 tr->key_len = 192 / 8;
680 tr->block_size = 128 / 8;
681 tr->cipher = EVP_aes_192_cbc ();
Ed Warnickecb9cada2015-12-08 15:45:58 -0700682
Keith Burns (alagalah)166a9d42016-08-06 11:00:56 -0700683 vec_add2 (km->supported_transforms, tr, 1);
684 tr->type = IKEV2_TRANSFORM_TYPE_ENCR;
685 tr->encr_type = IKEV2_TRANSFORM_ENCR_TYPE_AES_CBC;
686 tr->key_len = 128 / 8;
687 tr->block_size = 128 / 8;
688 tr->cipher = EVP_aes_128_cbc ();
Ed Warnickecb9cada2015-12-08 15:45:58 -0700689
Keith Burns (alagalah)166a9d42016-08-06 11:00:56 -0700690 vec_add2 (km->supported_transforms, tr, 1);
691 tr->type = IKEV2_TRANSFORM_TYPE_PRF;
692 tr->prf_type = IKEV2_TRANSFORM_PRF_TYPE_PRF_HMAC_SHA1;
693 tr->key_len = 160 / 8;
694 tr->key_trunc = 160 / 8;
695 tr->md = EVP_sha1 ();
Ed Warnickecb9cada2015-12-08 15:45:58 -0700696
Keith Burns (alagalah)166a9d42016-08-06 11:00:56 -0700697 vec_add2 (km->supported_transforms, tr, 1);
698 tr->type = IKEV2_TRANSFORM_TYPE_INTEG;
699 tr->integ_type = IKEV2_TRANSFORM_INTEG_TYPE_AUTH_HMAC_SHA1_96;
700 tr->key_len = 160 / 8;
701 tr->key_trunc = 96 / 8;
702 tr->md = EVP_sha1 ();
Ed Warnickecb9cada2015-12-08 15:45:58 -0700703
704#if defined(OPENSSL_NO_CISCO_FECDH)
Keith Burns (alagalah)166a9d42016-08-06 11:00:56 -0700705 vec_add2 (km->supported_transforms, tr, 1);
706 tr->type = IKEV2_TRANSFORM_TYPE_DH;
707 tr->dh_type = IKEV2_TRANSFORM_DH_TYPE_BRAINPOOL_512;
708 tr->key_len = (512 * 2) / 8;
709 tr->nid = NID_brainpoolP512r1;
710 tr->dh_group = IKEV2_DH_GROUP_ECP;
Ed Warnickecb9cada2015-12-08 15:45:58 -0700711
Keith Burns (alagalah)166a9d42016-08-06 11:00:56 -0700712 vec_add2 (km->supported_transforms, tr, 1);
713 tr->type = IKEV2_TRANSFORM_TYPE_DH;
714 tr->dh_type = IKEV2_TRANSFORM_DH_TYPE_BRAINPOOL_384;
715 tr->key_len = (384 * 2) / 8;
716 tr->nid = NID_brainpoolP384r1;
717 tr->dh_group = IKEV2_DH_GROUP_ECP;
Ed Warnickecb9cada2015-12-08 15:45:58 -0700718
Keith Burns (alagalah)166a9d42016-08-06 11:00:56 -0700719 vec_add2 (km->supported_transforms, tr, 1);
720 tr->type = IKEV2_TRANSFORM_TYPE_DH;
721 tr->dh_type = IKEV2_TRANSFORM_DH_TYPE_BRAINPOOL_256;
722 tr->key_len = (256 * 2) / 8;
723 tr->nid = NID_brainpoolP256r1;
724 tr->dh_group = IKEV2_DH_GROUP_ECP;
Ed Warnickecb9cada2015-12-08 15:45:58 -0700725
Keith Burns (alagalah)166a9d42016-08-06 11:00:56 -0700726 vec_add2 (km->supported_transforms, tr, 1);
727 tr->type = IKEV2_TRANSFORM_TYPE_DH;
728 tr->dh_type = IKEV2_TRANSFORM_DH_TYPE_BRAINPOOL_224;
729 tr->key_len = (224 * 2) / 8;
730 tr->nid = NID_brainpoolP224r1;
731 tr->dh_group = IKEV2_DH_GROUP_ECP;
Ed Warnickecb9cada2015-12-08 15:45:58 -0700732
Keith Burns (alagalah)166a9d42016-08-06 11:00:56 -0700733 vec_add2 (km->supported_transforms, tr, 1);
734 tr->type = IKEV2_TRANSFORM_TYPE_DH;
735 tr->dh_type = IKEV2_TRANSFORM_DH_TYPE_ECP_224;
736 tr->key_len = (224 * 2) / 8;
737 tr->nid = NID_secp224r1;
738 tr->dh_group = IKEV2_DH_GROUP_ECP;
Ed Warnickecb9cada2015-12-08 15:45:58 -0700739#endif
740
Keith Burns (alagalah)166a9d42016-08-06 11:00:56 -0700741 vec_add2 (km->supported_transforms, tr, 1);
742 tr->type = IKEV2_TRANSFORM_TYPE_DH;
743 tr->dh_type = IKEV2_TRANSFORM_DH_TYPE_ECP_521;
744 tr->key_len = (528 * 2) / 8;
745 tr->nid = NID_secp521r1;
746 tr->dh_group = IKEV2_DH_GROUP_ECP;
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_DH;
750 tr->dh_type = IKEV2_TRANSFORM_DH_TYPE_ECP_384;
751 tr->key_len = (384 * 2) / 8;
752 tr->nid = NID_secp384r1;
753 tr->dh_group = IKEV2_DH_GROUP_ECP;
Ed Warnickecb9cada2015-12-08 15:45:58 -0700754
Keith Burns (alagalah)166a9d42016-08-06 11:00:56 -0700755 vec_add2 (km->supported_transforms, tr, 1);
756 tr->type = IKEV2_TRANSFORM_TYPE_DH;
757 tr->dh_type = IKEV2_TRANSFORM_DH_TYPE_ECP_256;
758 tr->key_len = (256 * 2) / 8;
759 tr->nid = NID_X9_62_prime256v1;
760 tr->dh_group = IKEV2_DH_GROUP_ECP;
Ed Warnickecb9cada2015-12-08 15:45:58 -0700761
Keith Burns (alagalah)166a9d42016-08-06 11:00:56 -0700762 vec_add2 (km->supported_transforms, tr, 1);
763 tr->type = IKEV2_TRANSFORM_TYPE_DH;
764 tr->dh_type = IKEV2_TRANSFORM_DH_TYPE_ECP_192;
765 tr->key_len = (192 * 2) / 8;
766 tr->nid = NID_X9_62_prime192v1;
767 tr->dh_group = IKEV2_DH_GROUP_ECP;
Ed Warnickecb9cada2015-12-08 15:45:58 -0700768
Keith Burns (alagalah)166a9d42016-08-06 11:00:56 -0700769 vec_add2 (km->supported_transforms, tr, 1);
770 tr->type = IKEV2_TRANSFORM_TYPE_DH;
771 tr->dh_type = IKEV2_TRANSFORM_DH_TYPE_MODP_2048_256;
772 tr->key_len = 2048 / 8;
773 tr->dh_p = (const char *) &modp_dh_2048_256_prime;
774 tr->dh_g = (const char *) &modp_dh_2048_256_generator;
775 tr->dh_group = IKEV2_DH_GROUP_MODP;
Ed Warnickecb9cada2015-12-08 15:45:58 -0700776
Keith Burns (alagalah)166a9d42016-08-06 11:00:56 -0700777 vec_add2 (km->supported_transforms, tr, 1);
778 tr->type = IKEV2_TRANSFORM_TYPE_DH;
779 tr->dh_type = IKEV2_TRANSFORM_DH_TYPE_MODP_2048_224;
780 tr->key_len = 2048 / 8;
781 tr->dh_p = (const char *) &modp_dh_2048_224_prime;
782 tr->dh_g = (const char *) &modp_dh_2048_224_generator;
783 tr->dh_group = IKEV2_DH_GROUP_MODP;
Ed Warnickecb9cada2015-12-08 15:45:58 -0700784
Keith Burns (alagalah)166a9d42016-08-06 11:00:56 -0700785 vec_add2 (km->supported_transforms, tr, 1);
786 tr->type = IKEV2_TRANSFORM_TYPE_DH;
787 tr->dh_type = IKEV2_TRANSFORM_DH_TYPE_MODP_1024_160;
788 tr->key_len = 1024 / 8;
789 tr->dh_p = (const char *) &modp_dh_1024_160_prime;
790 tr->dh_g = (const char *) &modp_dh_1024_160_generator;
791 tr->dh_group = IKEV2_DH_GROUP_MODP;
Ed Warnickecb9cada2015-12-08 15:45:58 -0700792
Keith Burns (alagalah)166a9d42016-08-06 11:00:56 -0700793 vec_add2 (km->supported_transforms, tr, 1);
794 tr->type = IKEV2_TRANSFORM_TYPE_DH;
795 tr->dh_type = IKEV2_TRANSFORM_DH_TYPE_MODP_8192;
796 tr->key_len = 8192 / 8;
797 tr->dh_p = (const char *) &modp_dh_8192_prime;
798 tr->dh_g = (const char *) &modp_dh_8192_generator;
799 tr->dh_group = IKEV2_DH_GROUP_MODP;
Ed Warnickecb9cada2015-12-08 15:45:58 -0700800
Keith Burns (alagalah)166a9d42016-08-06 11:00:56 -0700801 vec_add2 (km->supported_transforms, tr, 1);
802 tr->type = IKEV2_TRANSFORM_TYPE_DH;
803 tr->dh_type = IKEV2_TRANSFORM_DH_TYPE_MODP_6144;
804 tr->key_len = 6144 / 8;
805 tr->dh_p = (const char *) &modp_dh_6144_prime;
806 tr->dh_g = (const char *) &modp_dh_6144_generator;
807 tr->dh_group = IKEV2_DH_GROUP_MODP;
Ed Warnickecb9cada2015-12-08 15:45:58 -0700808
Keith Burns (alagalah)166a9d42016-08-06 11:00:56 -0700809 vec_add2 (km->supported_transforms, tr, 1);
810 tr->type = IKEV2_TRANSFORM_TYPE_DH;
811 tr->dh_type = IKEV2_TRANSFORM_DH_TYPE_MODP_4096;
812 tr->key_len = 4096 / 8;
813 tr->dh_p = (const char *) &modp_dh_4096_prime;
814 tr->dh_g = (const char *) &modp_dh_4096_generator;
815 tr->dh_group = IKEV2_DH_GROUP_MODP;
Ed Warnickecb9cada2015-12-08 15:45:58 -0700816
Keith Burns (alagalah)166a9d42016-08-06 11:00:56 -0700817 vec_add2 (km->supported_transforms, tr, 1);
818 tr->type = IKEV2_TRANSFORM_TYPE_DH;
819 tr->dh_type = IKEV2_TRANSFORM_DH_TYPE_MODP_3072;
820 tr->key_len = 3072 / 8;
821 tr->dh_p = (const char *) &modp_dh_3072_prime;
822 tr->dh_g = (const char *) &modp_dh_3072_generator;
823 tr->dh_group = IKEV2_DH_GROUP_MODP;
Ed Warnickecb9cada2015-12-08 15:45:58 -0700824
Keith Burns (alagalah)166a9d42016-08-06 11:00:56 -0700825 vec_add2 (km->supported_transforms, tr, 1);
826 tr->type = IKEV2_TRANSFORM_TYPE_DH;
827 tr->dh_type = IKEV2_TRANSFORM_DH_TYPE_MODP_2048;
828 tr->key_len = 2048 / 8;
829 tr->dh_p = (const char *) &modp_dh_2048_prime;
830 tr->dh_g = (const char *) &modp_dh_2048_generator;
831 tr->dh_group = IKEV2_DH_GROUP_MODP;
Ed Warnickecb9cada2015-12-08 15:45:58 -0700832
Keith Burns (alagalah)166a9d42016-08-06 11:00:56 -0700833 vec_add2 (km->supported_transforms, tr, 1);
834 tr->type = IKEV2_TRANSFORM_TYPE_DH;
835 tr->dh_type = IKEV2_TRANSFORM_DH_TYPE_MODP_1536;
836 tr->key_len = 1536 / 8;
837 tr->dh_p = (const char *) &modp_dh_1536_prime;
838 tr->dh_g = (const char *) &modp_dh_1536_generator;
839 tr->dh_group = IKEV2_DH_GROUP_MODP;
Ed Warnickecb9cada2015-12-08 15:45:58 -0700840
Keith Burns (alagalah)166a9d42016-08-06 11:00:56 -0700841 vec_add2 (km->supported_transforms, tr, 1);
842 tr->type = IKEV2_TRANSFORM_TYPE_DH;
843 tr->dh_type = IKEV2_TRANSFORM_DH_TYPE_MODP_1024;
844 tr->key_len = 1024 / 8;
845 tr->dh_p = (const char *) &modp_dh_1024_prime;
846 tr->dh_g = (const char *) &modp_dh_1024_generator;
847 tr->dh_group = IKEV2_DH_GROUP_MODP;
Ed Warnickecb9cada2015-12-08 15:45:58 -0700848
Keith Burns (alagalah)166a9d42016-08-06 11:00:56 -0700849 vec_add2 (km->supported_transforms, tr, 1);
850 tr->type = IKEV2_TRANSFORM_TYPE_DH;
851 tr->dh_type = IKEV2_TRANSFORM_DH_TYPE_MODP_768;
852 tr->key_len = 768 / 8;
853 tr->dh_p = (const char *) &modp_dh_768_prime;
854 tr->dh_g = (const char *) &modp_dh_768_generator;
855 tr->dh_group = IKEV2_DH_GROUP_MODP;
Ed Warnickecb9cada2015-12-08 15:45:58 -0700856
Keith Burns (alagalah)166a9d42016-08-06 11:00:56 -0700857 vec_add2 (km->supported_transforms, tr, 1);
858 tr->type = IKEV2_TRANSFORM_TYPE_ESN;
859 tr->esn_type = IKEV2_TRANSFORM_ESN_TYPE_ESN;
Ed Warnickecb9cada2015-12-08 15:45:58 -0700860
Keith Burns (alagalah)166a9d42016-08-06 11:00:56 -0700861 vec_add2 (km->supported_transforms, tr, 1);
862 tr->type = IKEV2_TRANSFORM_TYPE_ESN;
863 tr->esn_type = IKEV2_TRANSFORM_ESN_TYPE_NO_ESN;
Ed Warnickecb9cada2015-12-08 15:45:58 -0700864}
865
866
Keith Burns (alagalah)166a9d42016-08-06 11:00:56 -0700867
868/*
869 * fd.io coding-style-patch-verification: ON
870 *
871 * Local Variables:
872 * eval: (c-set-style "gnu")
873 * End:
874 */