20be89e1aaf424da6741e2eb59f072dd38cb4d13
[vpp.git] / src / plugins / ikev2 / ikev2.c
1 /*
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 <vlib/unix/plugin.h>
18 #include <vlibmemory/api.h>
19 #include <vpp/app/version.h>
20 #include <vnet/vnet.h>
21 #include <vppinfra/error.h>
22 #include <vppinfra/random.h>
23 #include <vnet/udp/udp.h>
24 #include <vnet/ipsec/ipsec.h>
25 #include <vnet/ipsec/ipsec_tun.h>
26 #include <vnet/ipip/ipip.h>
27 #include <plugins/ikev2/ikev2.h>
28 #include <plugins/ikev2/ikev2_priv.h>
29 #include <plugins/dns/dns.h>
30 #include <openssl/sha.h>
31 #include <vnet/ipsec/ipsec_punt.h>
32 #include <plugins/ikev2/ikev2.api_enum.h>
33
34 #define IKEV2_LIVENESS_RETRIES 3
35 #define IKEV2_LIVENESS_PERIOD_CHECK 30
36
37 ikev2_main_t ikev2_main;
38
39 static int ikev2_delete_tunnel_interface (vnet_main_t * vnm,
40                                           ikev2_sa_t * sa,
41                                           ikev2_child_sa_t * child);
42
43 #define ikev2_set_state(sa, v, ...) do { \
44     (sa)->state = v; \
45     ikev2_elog_sa_state("ispi %lx SA state changed to " #v __VA_ARGS__, sa->ispi); \
46   } while(0);
47
48 typedef struct
49 {
50   u32 next_index;
51   u32 sw_if_index;
52 } ikev2_trace_t;
53
54 static u8 *
55 format_ikev2_trace (u8 * s, va_list * args)
56 {
57   CLIB_UNUSED (vlib_main_t * vm) = va_arg (*args, vlib_main_t *);
58   CLIB_UNUSED (vlib_node_t * node) = va_arg (*args, vlib_node_t *);
59   ikev2_trace_t *t = va_arg (*args, ikev2_trace_t *);
60
61   s = format (s, "ikev2: sw_if_index %d, next index %d",
62               t->sw_if_index, t->next_index);
63   return s;
64 }
65
66 #define IKEV2_GENERATE_SA_INIT_OK_str ""
67 #define IKEV2_GENERATE_SA_INIT_OK_ERR_NO_DH_STR \
68   "no DH group configured for IKE proposals!"
69 #define IKEV2_GENERATE_SA_INIT_OK_ERR_UNSUPP_STR \
70   "DH group not supported!"
71
72 typedef enum
73 {
74   IKEV2_GENERATE_SA_INIT_OK,
75   IKEV2_GENERATE_SA_INIT_ERR_NO_DH,
76   IKEV2_GENERATE_SA_INIT_ERR_UNSUPPORTED_DH,
77 } ikev2_generate_sa_error_t;
78
79 static u8 *
80 format_ikev2_gen_sa_error (u8 * s, va_list * args)
81 {
82   ikev2_generate_sa_error_t e = va_arg (*args, ikev2_generate_sa_error_t);
83   switch (e)
84     {
85     case IKEV2_GENERATE_SA_INIT_OK:
86       break;
87     case IKEV2_GENERATE_SA_INIT_ERR_NO_DH:
88       s = format (s, IKEV2_GENERATE_SA_INIT_OK_ERR_NO_DH_STR);
89       break;
90     case IKEV2_GENERATE_SA_INIT_ERR_UNSUPPORTED_DH:
91       s = format (s, IKEV2_GENERATE_SA_INIT_OK_ERR_UNSUPP_STR);
92       break;
93     }
94   return s;
95 }
96
97 typedef enum
98 {
99   IKEV2_NEXT_IP4_LOOKUP,
100   IKEV2_NEXT_IP4_ERROR_DROP,
101   IKEV2_IP4_N_NEXT,
102 } ikev2_ip4_next_t;
103
104 typedef enum
105 {
106   IKEV2_NEXT_IP6_LOOKUP,
107   IKEV2_NEXT_IP6_ERROR_DROP,
108   IKEV2_IP6_N_NEXT,
109 } ikev2_ip6_next_t;
110
111 typedef u32 ikev2_non_esp_marker;
112
113 static u16
114 ikev2_get_port (ikev2_sa_t *sa)
115 {
116   return ikev2_natt_active (sa) ? IKEV2_PORT_NATT : IKEV2_PORT;
117 }
118
119 static int
120 ikev2_insert_non_esp_marker (ike_header_t *ike, int len)
121 {
122   memmove ((u8 *) ike + sizeof (ikev2_non_esp_marker), ike, len);
123   clib_memset (ike, 0, sizeof (ikev2_non_esp_marker));
124   return len + sizeof (ikev2_non_esp_marker);
125 }
126
127 static ikev2_sa_transform_t *
128 ikev2_find_transform_data (ikev2_sa_transform_t * t)
129 {
130   ikev2_main_t *km = &ikev2_main;
131   ikev2_sa_transform_t *td;
132
133   vec_foreach (td, km->supported_transforms)
134   {
135     if (td->type != t->type)
136       continue;
137
138     if (td->transform_id != t->transform_id)
139       continue;
140
141     if (td->type == IKEV2_TRANSFORM_TYPE_ENCR)
142       {
143         if (vec_len (t->attrs) != 4 || t->attrs[0] != 0x80
144             || t->attrs[1] != 14)
145           continue;
146
147         if (((t->attrs[2] << 8 | t->attrs[3]) / 8) != td->key_len)
148           continue;
149       }
150     return td;
151   }
152   return 0;
153 }
154
155 static ikev2_sa_proposal_t *
156 ikev2_select_proposal (ikev2_sa_proposal_t * proposals,
157                        ikev2_protocol_id_t prot_id)
158 {
159   ikev2_sa_proposal_t *rv = 0;
160   ikev2_sa_proposal_t *proposal;
161   ikev2_sa_transform_t *transform, *new_t;
162   u8 mandatory_bitmap, optional_bitmap;
163
164   if (prot_id == IKEV2_PROTOCOL_IKE)
165     {
166       mandatory_bitmap = (1 << IKEV2_TRANSFORM_TYPE_ENCR) |
167         (1 << IKEV2_TRANSFORM_TYPE_PRF) | (1 << IKEV2_TRANSFORM_TYPE_DH);
168       optional_bitmap = mandatory_bitmap | (1 << IKEV2_TRANSFORM_TYPE_INTEG);
169     }
170   else if (prot_id == IKEV2_PROTOCOL_ESP)
171     {
172       mandatory_bitmap = (1 << IKEV2_TRANSFORM_TYPE_ENCR) |
173         (1 << IKEV2_TRANSFORM_TYPE_ESN);
174       optional_bitmap = mandatory_bitmap |
175         (1 << IKEV2_TRANSFORM_TYPE_INTEG) | (1 << IKEV2_TRANSFORM_TYPE_DH);
176     }
177   else if (prot_id == IKEV2_PROTOCOL_AH)
178     {
179       mandatory_bitmap = (1 << IKEV2_TRANSFORM_TYPE_INTEG) |
180         (1 << IKEV2_TRANSFORM_TYPE_ESN);
181       optional_bitmap = mandatory_bitmap | (1 << IKEV2_TRANSFORM_TYPE_DH);
182     }
183   else
184     return 0;
185
186   vec_add2 (rv, proposal, 1);
187
188   vec_foreach (proposal, proposals)
189   {
190     u8 bitmap = 0;
191     if (proposal->protocol_id != prot_id)
192       continue;
193
194     vec_foreach (transform, proposal->transforms)
195     {
196       if ((1 << transform->type) & bitmap)
197         continue;
198
199       if (ikev2_find_transform_data (transform))
200         {
201           bitmap |= 1 << transform->type;
202           vec_add2 (rv->transforms, new_t, 1);
203           clib_memcpy_fast (new_t, transform, sizeof (*new_t));
204           new_t->attrs = vec_dup (transform->attrs);
205         }
206     }
207
208     if ((bitmap & mandatory_bitmap) == mandatory_bitmap &&
209         (bitmap & ~optional_bitmap) == 0)
210       {
211         rv->proposal_num = proposal->proposal_num;
212         rv->protocol_id = proposal->protocol_id;
213         RAND_bytes ((u8 *) & rv->spi, sizeof (rv->spi));
214         goto done;
215       }
216     else
217       {
218         vec_free (rv->transforms);
219       }
220   }
221
222   vec_free (rv);
223 done:
224   return rv;
225 }
226
227 ikev2_sa_transform_t *
228 ikev2_sa_get_td_for_type (ikev2_sa_proposal_t * p,
229                           ikev2_transform_type_t type)
230 {
231   ikev2_sa_transform_t *t;
232
233   if (!p)
234     return 0;
235
236   vec_foreach (t, p->transforms)
237   {
238     if (t->type == type)
239       return ikev2_find_transform_data (t);
240   }
241   return 0;
242 }
243
244 ikev2_child_sa_t *
245 ikev2_sa_get_child (ikev2_sa_t * sa, u32 spi, ikev2_protocol_id_t prot_id,
246                     int by_initiator)
247 {
248   ikev2_child_sa_t *c;
249   vec_foreach (c, sa->childs)
250   {
251     ikev2_sa_proposal_t *proposal =
252       by_initiator ? &c->i_proposals[0] : &c->r_proposals[0];
253     if (proposal && proposal->spi == spi && proposal->protocol_id == prot_id)
254       return c;
255   }
256
257   return 0;
258 }
259
260 void
261 ikev2_sa_free_proposal_vector (ikev2_sa_proposal_t ** v)
262 {
263   ikev2_sa_proposal_t *p;
264   ikev2_sa_transform_t *t;
265
266   if (!*v)
267     return;
268
269   vec_foreach (p, *v)
270   {
271     vec_foreach (t, p->transforms)
272     {
273       vec_free (t->attrs);
274     }
275     vec_free (p->transforms);
276   }
277   vec_free (*v);
278 }
279
280 static void
281 ikev2_sa_free_child_sa (ikev2_child_sa_t * c)
282 {
283   ikev2_sa_free_proposal_vector (&c->r_proposals);
284   ikev2_sa_free_proposal_vector (&c->i_proposals);
285   vec_free (c->sk_ai);
286   vec_free (c->sk_ar);
287   vec_free (c->sk_ei);
288   vec_free (c->sk_er);
289   vec_free (c->tsi);
290   vec_free (c->tsr);
291 }
292
293 static void
294 ikev2_sa_free_all_child_sa (ikev2_child_sa_t ** childs)
295 {
296   ikev2_child_sa_t *c;
297   vec_foreach (c, *childs) ikev2_sa_free_child_sa (c);
298
299   vec_free (*childs);
300 }
301
302 static void
303 ikev2_sa_del_child_sa (ikev2_sa_t * sa, ikev2_child_sa_t * child)
304 {
305   ikev2_sa_free_child_sa (child);
306   vec_del1 (sa->childs, child - sa->childs);
307 }
308
309 static void
310 ikev2_sa_free_all_vec (ikev2_sa_t * sa)
311 {
312   vec_free (sa->i_nonce);
313   vec_free (sa->r_nonce);
314
315   vec_free (sa->dh_shared_key);
316   vec_free (sa->dh_private_key);
317   vec_free (sa->i_dh_data);
318   vec_free (sa->r_dh_data);
319
320   ikev2_sa_free_proposal_vector (&sa->r_proposals);
321   ikev2_sa_free_proposal_vector (&sa->i_proposals);
322
323   vec_free (sa->sk_d);
324   vec_free (sa->sk_ai);
325   vec_free (sa->sk_ar);
326   vec_free (sa->sk_ei);
327   vec_free (sa->sk_er);
328   vec_free (sa->sk_pi);
329   vec_free (sa->sk_pr);
330
331   vec_free (sa->i_id.data);
332   vec_free (sa->r_id.data);
333
334   vec_free (sa->i_auth.data);
335   if (sa->i_auth.key)
336     EVP_PKEY_free (sa->i_auth.key);
337   vec_free (sa->r_auth.data);
338   if (sa->r_auth.key)
339     EVP_PKEY_free (sa->r_auth.key);
340
341   vec_free (sa->del);
342
343   vec_free (sa->rekey);
344
345   vec_free (sa->last_sa_init_req_packet_data);
346   vec_free (sa->last_sa_init_res_packet_data);
347
348   vec_free (sa->last_res_packet_data);
349
350   ikev2_sa_free_all_child_sa (&sa->childs);
351 }
352
353 static void
354 ikev2_delete_sa (ikev2_main_per_thread_data_t * ptd, ikev2_sa_t * sa)
355 {
356   uword *p;
357
358   ikev2_sa_free_all_vec (sa);
359
360   p = hash_get (ptd->sa_by_rspi, sa->rspi);
361   if (p)
362     {
363       hash_unset (ptd->sa_by_rspi, sa->rspi);
364       pool_put (ptd->sas, sa);
365     }
366 }
367
368 static ikev2_generate_sa_error_t
369 ikev2_generate_sa_init_data (ikev2_sa_t * sa)
370 {
371   ikev2_sa_transform_t *t = 0, *t2;
372   ikev2_main_t *km = &ikev2_main;
373
374   if (sa->dh_group == IKEV2_TRANSFORM_DH_TYPE_NONE)
375     return IKEV2_GENERATE_SA_INIT_ERR_NO_DH;
376
377   /* check if received DH group is on our list of supported groups */
378   vec_foreach (t2, km->supported_transforms)
379   {
380     if (t2->type == IKEV2_TRANSFORM_TYPE_DH && sa->dh_group == t2->dh_type)
381       {
382         t = t2;
383         break;
384       }
385   }
386
387   if (!t)
388     {
389       sa->dh_group = IKEV2_TRANSFORM_DH_TYPE_NONE;
390       return IKEV2_GENERATE_SA_INIT_ERR_UNSUPPORTED_DH;
391     }
392
393   if (sa->is_initiator)
394     {
395       /* generate rspi */
396       RAND_bytes ((u8 *) & sa->ispi, 8);
397
398       /* generate nonce */
399       sa->i_nonce = vec_new (u8, IKEV2_NONCE_SIZE);
400       RAND_bytes ((u8 *) sa->i_nonce, IKEV2_NONCE_SIZE);
401     }
402   else
403     {
404       /* generate rspi */
405       RAND_bytes ((u8 *) & sa->rspi, 8);
406
407       /* generate nonce */
408       sa->r_nonce = vec_new (u8, vec_len (sa->i_nonce));
409       RAND_bytes ((u8 *) sa->r_nonce, vec_len (sa->i_nonce));
410     }
411
412   /* generate dh keys */
413   ikev2_generate_dh (sa, t);
414
415   return IKEV2_GENERATE_SA_INIT_OK;
416 }
417
418 static void
419 ikev2_complete_sa_data (ikev2_sa_t * sa, ikev2_sa_t * sai)
420 {
421   ikev2_sa_transform_t *t = 0, *t2;
422   ikev2_main_t *km = &ikev2_main;
423
424   /*move some data to the new SA */
425 #define _(A) ({void* __tmp__ = (A); (A) = 0; __tmp__;})
426   sa->i_nonce = _(sai->i_nonce);
427   sa->i_dh_data = _(sai->i_dh_data);
428   sa->dh_private_key = _(sai->dh_private_key);
429   ip_address_copy (&sa->iaddr, &sai->iaddr);
430   ip_address_copy (&sa->raddr, &sai->raddr);
431   sa->is_initiator = sai->is_initiator;
432   sa->i_id.type = sai->i_id.type;
433   sa->r_id.type = sai->r_id.type;
434   sa->profile_index = sai->profile_index;
435   sa->tun_itf = sai->tun_itf;
436   sa->is_tun_itf_set = sai->is_tun_itf_set;
437   if (sai->natt_state == IKEV2_NATT_DISABLED)
438     sa->natt_state = IKEV2_NATT_DISABLED;
439   sa->i_id.data = _(sai->i_id.data);
440   sa->r_id.data = _(sai->r_id.data);
441   sa->i_auth.method = sai->i_auth.method;
442   sa->i_auth.hex = sai->i_auth.hex;
443   sa->i_auth.data = _(sai->i_auth.data);
444   sa->i_auth.key = _(sai->i_auth.key);
445   sa->last_sa_init_req_packet_data = _(sai->last_sa_init_req_packet_data);
446   sa->last_init_msg_id = sai->last_init_msg_id;
447   sa->childs = _(sai->childs);
448   sa->udp_encap = sai->udp_encap;
449   sa->ipsec_over_udp_port = sai->ipsec_over_udp_port;
450   sa->dst_port = sai->dst_port;
451   sa->sw_if_index = sai->sw_if_index;
452 #undef _
453
454
455   if (sa->dh_group == IKEV2_TRANSFORM_DH_TYPE_NONE)
456     {
457       return;
458     }
459
460   /* check if received DH group is on our list of supported groups */
461   vec_foreach (t2, km->supported_transforms)
462   {
463     if (t2->type == IKEV2_TRANSFORM_TYPE_DH && sa->dh_group == t2->dh_type)
464       {
465         t = t2;
466         break;
467       }
468   }
469
470   if (!t)
471     {
472       sa->dh_group = IKEV2_TRANSFORM_DH_TYPE_NONE;
473       return;
474     }
475
476
477   /* generate dh keys */
478   ikev2_complete_dh (sa, t);
479
480 }
481
482 static void
483 ikev2_calc_keys (ikev2_sa_t * sa)
484 {
485   u8 *tmp;
486   /* calculate SKEYSEED = prf(Ni | Nr, g^ir) */
487   u8 *skeyseed = 0;
488   u8 *s = 0;
489   u16 integ_key_len = 0, salt_len = 0;
490   ikev2_sa_transform_t *tr_encr, *tr_prf, *tr_integ;
491   tr_encr =
492     ikev2_sa_get_td_for_type (sa->r_proposals, IKEV2_TRANSFORM_TYPE_ENCR);
493   tr_prf =
494     ikev2_sa_get_td_for_type (sa->r_proposals, IKEV2_TRANSFORM_TYPE_PRF);
495   tr_integ =
496     ikev2_sa_get_td_for_type (sa->r_proposals, IKEV2_TRANSFORM_TYPE_INTEG);
497
498   if (tr_integ)
499     integ_key_len = tr_integ->key_len;
500   else
501     salt_len = sizeof (u32);
502
503   vec_append (s, sa->i_nonce);
504   vec_append (s, sa->r_nonce);
505   skeyseed = ikev2_calc_prf (tr_prf, s, sa->dh_shared_key);
506
507   /* Calculate S = Ni | Nr | SPIi | SPIr */
508   u64 *spi;
509   vec_add2 (s, tmp, 2 * sizeof (*spi));
510   spi = (u64 *) tmp;
511   spi[0] = clib_host_to_net_u64 (sa->ispi);
512   spi[1] = clib_host_to_net_u64 (sa->rspi);
513
514   /* calculate PRFplus */
515   u8 *keymat;
516   int len = tr_prf->key_trunc + /* SK_d */
517     integ_key_len * 2 +         /* SK_ai, SK_ar */
518     tr_encr->key_len * 2 +      /* SK_ei, SK_er */
519     tr_prf->key_len * 2 +       /* SK_pi, SK_pr */
520     salt_len * 2;
521
522   keymat = ikev2_calc_prfplus (tr_prf, skeyseed, s, len);
523   vec_free (skeyseed);
524   vec_free (s);
525
526   int pos = 0;
527
528   /* SK_d */
529   sa->sk_d = vec_new (u8, tr_prf->key_trunc);
530   clib_memcpy_fast (sa->sk_d, keymat + pos, tr_prf->key_trunc);
531   pos += tr_prf->key_trunc;
532
533   if (integ_key_len)
534     {
535       /* SK_ai */
536       sa->sk_ai = vec_new (u8, integ_key_len);
537       clib_memcpy_fast (sa->sk_ai, keymat + pos, integ_key_len);
538       pos += integ_key_len;
539
540       /* SK_ar */
541       sa->sk_ar = vec_new (u8, integ_key_len);
542       clib_memcpy_fast (sa->sk_ar, keymat + pos, integ_key_len);
543       pos += integ_key_len;
544     }
545
546   /* SK_ei */
547   sa->sk_ei = vec_new (u8, tr_encr->key_len + salt_len);
548   clib_memcpy_fast (sa->sk_ei, keymat + pos, tr_encr->key_len + salt_len);
549   pos += tr_encr->key_len + salt_len;
550
551   /* SK_er */
552   sa->sk_er = vec_new (u8, tr_encr->key_len + salt_len);
553   clib_memcpy_fast (sa->sk_er, keymat + pos, tr_encr->key_len + salt_len);
554   pos += tr_encr->key_len + salt_len;
555
556   /* SK_pi */
557   sa->sk_pi = vec_new (u8, tr_prf->key_len);
558   clib_memcpy_fast (sa->sk_pi, keymat + pos, tr_prf->key_len);
559   pos += tr_prf->key_len;
560
561   /* SK_pr */
562   sa->sk_pr = vec_new (u8, tr_prf->key_len);
563   clib_memcpy_fast (sa->sk_pr, keymat + pos, tr_prf->key_len);
564   pos += tr_prf->key_len;
565
566   vec_free (keymat);
567   sa->keys_generated = 1;
568 }
569
570 static void
571 ikev2_calc_child_keys (ikev2_sa_t * sa, ikev2_child_sa_t * child)
572 {
573   u8 *s = 0;
574   u16 integ_key_len = 0;
575   u8 salt_len = 0;
576
577   ikev2_sa_transform_t *tr_prf, *ctr_encr, *ctr_integ;
578   tr_prf =
579     ikev2_sa_get_td_for_type (sa->r_proposals, IKEV2_TRANSFORM_TYPE_PRF);
580   ctr_encr =
581     ikev2_sa_get_td_for_type (child->r_proposals, IKEV2_TRANSFORM_TYPE_ENCR);
582   ctr_integ =
583     ikev2_sa_get_td_for_type (child->r_proposals, IKEV2_TRANSFORM_TYPE_INTEG);
584
585   if (ctr_integ)
586     integ_key_len = ctr_integ->key_len;
587   else
588     salt_len = sizeof (u32);
589
590   vec_append (s, sa->i_nonce);
591   vec_append (s, sa->r_nonce);
592   /* calculate PRFplus */
593   u8 *keymat;
594   int len = ctr_encr->key_len * 2 + integ_key_len * 2 + salt_len * 2;
595
596   keymat = ikev2_calc_prfplus (tr_prf, sa->sk_d, s, len);
597
598   int pos = 0;
599
600   /* SK_ei */
601   child->sk_ei = vec_new (u8, ctr_encr->key_len);
602   clib_memcpy_fast (child->sk_ei, keymat + pos, ctr_encr->key_len);
603   pos += ctr_encr->key_len;
604
605   if (ctr_integ)
606     {
607       /* SK_ai */
608       child->sk_ai = vec_new (u8, ctr_integ->key_len);
609       clib_memcpy_fast (child->sk_ai, keymat + pos, ctr_integ->key_len);
610       pos += ctr_integ->key_len;
611     }
612   else
613     {
614       clib_memcpy (&child->salt_ei, keymat + pos, salt_len);
615       pos += salt_len;
616     }
617
618   /* SK_er */
619   child->sk_er = vec_new (u8, ctr_encr->key_len);
620   clib_memcpy_fast (child->sk_er, keymat + pos, ctr_encr->key_len);
621   pos += ctr_encr->key_len;
622
623   if (ctr_integ)
624     {
625       /* SK_ar */
626       child->sk_ar = vec_new (u8, integ_key_len);
627       clib_memcpy_fast (child->sk_ar, keymat + pos, integ_key_len);
628       pos += integ_key_len;
629     }
630   else
631     {
632       clib_memcpy (&child->salt_er, keymat + pos, salt_len);
633       pos += salt_len;
634     }
635
636   ASSERT (pos == len);
637
638   vec_free (keymat);
639 }
640
641 static u8 *
642 ikev2_compute_nat_sha1 (u64 ispi, u64 rspi, ip_address_t *ia, u16 port)
643 {
644   const u32 max_buf_size =
645     sizeof (ispi) + sizeof (rspi) + sizeof (ip6_address_t) + sizeof (u16);
646   u8 buf[max_buf_size];
647   u8 *res = vec_new (u8, 20);
648
649   clib_memcpy_fast (&buf[0], &ispi, sizeof (ispi));
650   clib_memcpy_fast (&buf[8], &rspi, sizeof (rspi));
651   clib_memcpy_fast (&buf[8 + 8], ip_addr_bytes (ia), ip_address_size (ia));
652   clib_memcpy_fast (&buf[8 + 8 + ip_address_size (ia)], &port, sizeof (port));
653   SHA1 (buf, 2 * sizeof (ispi) + sizeof (port) + ip_address_size (ia), res);
654   return res;
655 }
656
657 static int
658 ikev2_parse_ke_payload (const void *p, u32 rlen, ikev2_sa_t * sa,
659                         u8 ** ke_data)
660 {
661   const ike_ke_payload_header_t *ke = p;
662   u16 plen = clib_net_to_host_u16 (ke->length);
663   ASSERT (plen >= sizeof (*ke) && plen <= rlen);
664   if (sizeof (*ke) > rlen)
665     {
666       ikev2_elog_error ("KE: packet too small");
667       return 0;
668     }
669
670   sa->dh_group = clib_net_to_host_u16 (ke->dh_group);
671   vec_reset_length (ke_data[0]);
672   vec_add (ke_data[0], ke->payload, plen - sizeof (*ke));
673   return 1;
674 }
675
676 static int
677 ikev2_parse_nonce_payload (const void *p, u32 rlen, const u8 **nonce)
678 {
679   const ike_payload_header_t *ikep = p;
680   u16 plen = clib_net_to_host_u16 (ikep->length);
681   ASSERT (plen >= sizeof (*ikep) && plen <= rlen);
682   int len = plen - sizeof (*ikep);
683   ASSERT (len >= 16 && len <= 256);
684   if (PREDICT_FALSE (len < 16 || len > 256))
685     {
686       ikev2_elog_error ("NONCE: bad size");
687       return 0;
688     }
689   *nonce = ikep->payload;
690   return len;
691 }
692
693 static int
694 ikev2_check_payload_length (const ike_payload_header_t * ikep, int rlen,
695                             u16 * plen)
696 {
697   if (sizeof (*ikep) > rlen)
698     {
699       ikev2_elog_error ("payload: packet too small");
700       return 0;
701     }
702   *plen = clib_net_to_host_u16 (ikep->length);
703   if (*plen < sizeof (*ikep) || *plen > rlen)
704     {
705       ikev2_elog_error ("payload: bad size");
706       return 0;
707     }
708   return 1;
709 }
710
711 static int
712 ikev2_process_sa_init_req (vlib_main_t *vm, ikev2_sa_t *sa, ike_header_t *ike,
713                            udp_header_t *udp, u32 len, u32 sw_if_index)
714 {
715   int p = 0;
716   u8 payload = ike->nextpayload;
717   ike_payload_header_t *ikep;
718   u16 plen;
719
720   ikev2_elog_exchange ("ispi %lx rspi %lx IKE_INIT request received "
721                        "from ", clib_net_to_host_u64 (ike->ispi),
722                        clib_net_to_host_u64 (ike->rspi),
723                        ip_addr_v4 (&sa->iaddr).as_u32,
724                        ip_addr_version (&sa->iaddr) == AF_IP4);
725
726   sa->ispi = clib_net_to_host_u64 (ike->ispi);
727   sa->sw_if_index = sw_if_index;
728
729   /* store whole IKE payload - needed for PSK auth */
730   vec_reset_length (sa->last_sa_init_req_packet_data);
731   vec_add (sa->last_sa_init_req_packet_data, ike, len);
732
733   if (len < sizeof (*ike))
734     {
735       ikev2_elog_error ("IKE_INIT request too small");
736       return 0;
737     }
738
739   len -= sizeof (*ike);
740   while (p < len && payload != IKEV2_PAYLOAD_NONE)
741     {
742       ikep = (ike_payload_header_t *) & ike->payload[p];
743       int current_length = len - p;
744       if (!ikev2_check_payload_length (ikep, current_length, &plen))
745         return 0;
746
747       if (payload == IKEV2_PAYLOAD_SA)
748         {
749           ikev2_sa_free_proposal_vector (&sa->i_proposals);
750           sa->i_proposals = ikev2_parse_sa_payload (ikep, current_length);
751         }
752       else if (payload == IKEV2_PAYLOAD_KE)
753         {
754           if (!ikev2_parse_ke_payload (ikep, current_length, sa,
755                                        &sa->i_dh_data))
756             return 0;
757         }
758       else if (payload == IKEV2_PAYLOAD_NONCE)
759         {
760           const u8 *nonce;
761           int nonce_len;
762           vec_reset_length (sa->i_nonce);
763           if ((nonce_len = ikev2_parse_nonce_payload (ikep, current_length,
764                                                       &nonce)) <= 0)
765             return 0;
766           vec_add (sa->i_nonce, nonce, nonce_len);
767         }
768       else if (payload == IKEV2_PAYLOAD_NOTIFY)
769         {
770           ikev2_notify_t *n =
771             ikev2_parse_notify_payload (ikep, current_length);
772           if (n->msg_type == IKEV2_NOTIFY_MSG_NAT_DETECTION_SOURCE_IP)
773             {
774               u8 *src_sha = ikev2_compute_nat_sha1 (ike->ispi, 0, &sa->iaddr,
775                                                     udp->src_port);
776               if (clib_memcmp (src_sha, n->data, vec_len (src_sha)))
777                 {
778                   if (sa->natt_state == IKEV2_NATT_ENABLED)
779                     sa->natt_state = IKEV2_NATT_ACTIVE;
780                   ikev2_elog_uint (IKEV2_LOG_DEBUG, "ispi %lx initiator"
781                                    " behind NAT", sa->ispi);
782                 }
783               vec_free (src_sha);
784             }
785           else if (n->msg_type ==
786                    IKEV2_NOTIFY_MSG_NAT_DETECTION_DESTINATION_IP)
787             {
788               u8 *dst_sha = ikev2_compute_nat_sha1 (ike->ispi, 0, &sa->raddr,
789                                                     udp->dst_port);
790               if (clib_memcmp (dst_sha, n->data, vec_len (dst_sha)))
791                 {
792                   if (sa->natt_state == IKEV2_NATT_ENABLED)
793                     sa->natt_state = IKEV2_NATT_ACTIVE;
794                   ikev2_elog_uint (IKEV2_LOG_DEBUG, "ispi %lx responder"
795                                    " (self) behind NAT", sa->ispi);
796                 }
797               vec_free (dst_sha);
798             }
799           vec_free (n);
800         }
801       else if (payload == IKEV2_PAYLOAD_VENDOR)
802         {
803           ikev2_parse_vendor_payload (ikep);
804         }
805       else
806         {
807           ikev2_elog_uint (IKEV2_LOG_ERROR, "Unknown payload! type=%d",
808                            payload);
809           if (ikep->flags & IKEV2_PAYLOAD_FLAG_CRITICAL)
810             {
811               ikev2_set_state (sa, IKEV2_STATE_NOTIFY_AND_DELETE);
812               sa->unsupported_cp = payload;
813               return 0;
814             }
815         }
816
817       payload = ikep->nextpayload;
818       p += plen;
819     }
820
821   ikev2_set_state (sa, IKEV2_STATE_SA_INIT);
822   return 1;
823 }
824
825 static void
826 ikev2_process_sa_init_resp (vlib_main_t * vm,
827                             ikev2_sa_t * sa, ike_header_t * ike,
828                             udp_header_t * udp, u32 len)
829 {
830   int p = 0;
831   u8 payload = ike->nextpayload;
832   ike_payload_header_t *ikep;
833   u16 plen;
834
835   sa->ispi = clib_net_to_host_u64 (ike->ispi);
836   sa->rspi = clib_net_to_host_u64 (ike->rspi);
837
838   ikev2_elog_exchange ("ispi %lx rspi %lx IKE_INIT response received "
839                        "from ", sa->ispi, sa->rspi,
840                        ip_addr_v4 (&sa->raddr).as_u32,
841                        ip_addr_version (&sa->raddr) == AF_IP4);
842
843   /* store whole IKE payload - needed for PSK auth */
844   vec_reset_length (sa->last_sa_init_res_packet_data);
845   vec_add (sa->last_sa_init_res_packet_data, ike, len);
846
847   if (sizeof (*ike) > len)
848     {
849       ikev2_elog_error ("IKE_INIT response too small");
850       return;
851     }
852
853   len -= sizeof (*ike);
854   while (p < len && payload != IKEV2_PAYLOAD_NONE)
855     {
856       int current_length = len - p;
857       ikep = (ike_payload_header_t *) & ike->payload[p];
858       if (!ikev2_check_payload_length (ikep, current_length, &plen))
859         return;
860
861       if (payload == IKEV2_PAYLOAD_SA)
862         {
863           ikev2_sa_free_proposal_vector (&sa->r_proposals);
864           sa->r_proposals = ikev2_parse_sa_payload (ikep, current_length);
865           if (sa->r_proposals)
866             {
867               ikev2_set_state (sa, IKEV2_STATE_SA_INIT);
868               ike->msgid =
869                 clib_host_to_net_u32 (clib_net_to_host_u32 (ike->msgid) + 1);
870             }
871         }
872       else if (payload == IKEV2_PAYLOAD_KE)
873         {
874           if (!ikev2_parse_ke_payload (ikep, current_length, sa,
875                                        &sa->r_dh_data))
876             return;
877         }
878       else if (payload == IKEV2_PAYLOAD_NONCE)
879         {
880           const u8 *nonce;
881           int nonce_len;
882           vec_reset_length (sa->r_nonce);
883           if ((nonce_len = ikev2_parse_nonce_payload (ikep, current_length,
884                                                       &nonce)) <= 0)
885             return;
886           vec_add (sa->r_nonce, nonce, nonce_len);
887         }
888       else if (payload == IKEV2_PAYLOAD_NOTIFY)
889         {
890           ikev2_notify_t *n =
891             ikev2_parse_notify_payload (ikep, current_length);
892           if (n->msg_type == IKEV2_NOTIFY_MSG_NAT_DETECTION_SOURCE_IP)
893             {
894               u8 *src_sha = ikev2_compute_nat_sha1 (ike->ispi, ike->rspi,
895                                                     &sa->raddr,
896                                                     udp->src_port);
897               if (clib_memcmp (src_sha, n->data, vec_len (src_sha)))
898                 {
899                   ikev2_elog_uint (IKEV2_LOG_DEBUG, "ispi %lx responder"
900                                    " behind NAT, unsupported", sa->ispi);
901                 }
902               vec_free (src_sha);
903             }
904           else if (n->msg_type ==
905                    IKEV2_NOTIFY_MSG_NAT_DETECTION_DESTINATION_IP)
906             {
907               u8 *dst_sha = ikev2_compute_nat_sha1 (ike->ispi, ike->rspi,
908                                                     &sa->iaddr,
909                                                     udp->dst_port);
910               if (clib_memcmp (dst_sha, n->data, vec_len (dst_sha)))
911                 {
912                   if (sa->natt_state == IKEV2_NATT_ENABLED)
913                     sa->natt_state = IKEV2_NATT_ACTIVE;
914                   ikev2_elog_uint (IKEV2_LOG_DEBUG, "ispi %lx initiator"
915                                    " (self) behind NAT", sa->ispi);
916                 }
917               vec_free (dst_sha);
918             }
919           vec_free (n);
920         }
921       else if (payload == IKEV2_PAYLOAD_VENDOR)
922         {
923           ikev2_parse_vendor_payload (ikep);
924         }
925       else
926         {
927           ikev2_elog_uint (IKEV2_LOG_ERROR, "Unknown payload! type=%d",
928                            payload);
929           if (ikep->flags & IKEV2_PAYLOAD_FLAG_CRITICAL)
930             {
931               ikev2_set_state (sa, IKEV2_STATE_NOTIFY_AND_DELETE);
932               sa->unsupported_cp = payload;
933               return;
934             }
935         }
936
937       payload = ikep->nextpayload;
938       p += plen;
939     }
940 }
941
942 static u8 *
943 ikev2_decrypt_sk_payload (ikev2_sa_t * sa, ike_header_t * ike,
944                           u8 * payload, u32 rlen, u32 * out_len)
945 {
946   ikev2_main_per_thread_data_t *ptd = ikev2_get_per_thread_data ();
947   int p = 0;
948   u8 last_payload = 0, *hmac = 0, *plaintext = 0;
949   ike_payload_header_t *ikep = 0;
950   u16 plen = 0;
951   u32 dlen = 0;
952   ikev2_sa_transform_t *tr_integ;
953   ikev2_sa_transform_t *tr_encr;
954   tr_integ =
955     ikev2_sa_get_td_for_type (sa->r_proposals, IKEV2_TRANSFORM_TYPE_INTEG);
956   tr_encr =
957     ikev2_sa_get_td_for_type (sa->r_proposals, IKEV2_TRANSFORM_TYPE_ENCR);
958   int is_aead = tr_encr->encr_type == IKEV2_TRANSFORM_ENCR_TYPE_AES_GCM_16;
959
960   if (((!sa->sk_ar || !sa->sk_ai) && !is_aead) || (!sa->sk_ei || !sa->sk_er))
961     return 0;
962
963   if (rlen <= sizeof (*ike))
964     return 0;
965
966   int len = rlen - sizeof (*ike);
967   while (p < len &&
968          *payload != IKEV2_PAYLOAD_NONE && last_payload != IKEV2_PAYLOAD_SK)
969     {
970       ikep = (ike_payload_header_t *) & ike->payload[p];
971       int current_length = len - p;
972       if (!ikev2_check_payload_length (ikep, current_length, &plen))
973         return 0;
974
975       if (*payload == IKEV2_PAYLOAD_SK)
976         {
977           last_payload = *payload;
978         }
979       else
980         {
981           ikev2_elog_uint (IKEV2_LOG_ERROR, "Unknown payload! type=%d",
982                            *payload);
983           if (ikep->flags & IKEV2_PAYLOAD_FLAG_CRITICAL)
984             {
985               sa->unsupported_cp = *payload;
986               return 0;
987             }
988         }
989
990       *payload = ikep->nextpayload;
991       p += plen;
992     }
993
994   if (last_payload != IKEV2_PAYLOAD_SK)
995     {
996       ikev2_elog_error ("Last payload must be SK");
997       return 0;
998     }
999
1000   if (is_aead)
1001     {
1002       if (plen < sizeof (*ikep) + IKEV2_GCM_ICV_SIZE)
1003         return 0;
1004
1005       plen -= sizeof (*ikep) + IKEV2_GCM_ICV_SIZE;
1006       u8 *aad = (u8 *) ike;
1007       u32 aad_len = ikep->payload - aad;
1008       u8 *tag = ikep->payload + plen;
1009
1010       int rc = ikev2_decrypt_aead_data (ptd, sa, tr_encr, ikep->payload,
1011                                         plen, aad, aad_len, tag, &dlen);
1012       if (rc)
1013         {
1014           *out_len = dlen;
1015           plaintext = ikep->payload + IKEV2_GCM_IV_SIZE;
1016         }
1017     }
1018   else
1019     {
1020       if (rlen < tr_integ->key_trunc)
1021         return 0;
1022
1023       hmac =
1024         ikev2_calc_integr (tr_integ, sa->is_initiator ? sa->sk_ar : sa->sk_ai,
1025                            (u8 *) ike, rlen - tr_integ->key_trunc);
1026
1027       if (plen < sizeof (*ikep) + tr_integ->key_trunc)
1028         return 0;
1029
1030       plen = plen - sizeof (*ikep) - tr_integ->key_trunc;
1031
1032       if (clib_memcmp (hmac, &ikep->payload[plen], tr_integ->key_trunc))
1033         {
1034           ikev2_elog_error ("message integrity check failed");
1035           vec_free (hmac);
1036           return 0;
1037         }
1038       vec_free (hmac);
1039
1040       int rc = ikev2_decrypt_data (ptd, sa, tr_encr, ikep->payload, plen,
1041                                    &dlen);
1042       if (rc)
1043         {
1044           *out_len = dlen;
1045           plaintext = ikep->payload + tr_encr->block_size;
1046         }
1047     }
1048
1049   return plaintext;
1050 }
1051
1052 static int
1053 ikev2_is_id_equal (const ikev2_id_t *i1, const ikev2_id_t *i2)
1054 {
1055   if (i1->type != i2->type)
1056     return 0;
1057
1058   if (vec_len (i1->data) != vec_len (i2->data))
1059     return 0;
1060
1061   if (clib_memcmp (i1->data, i2->data, vec_len (i1->data)))
1062     return 0;
1063
1064   return 1;
1065 }
1066
1067 static void
1068 ikev2_initial_contact_cleanup_internal (ikev2_main_per_thread_data_t * ptd,
1069                                         ikev2_sa_t * sa)
1070 {
1071   ikev2_main_t *km = &ikev2_main;
1072   ikev2_sa_t *tmp;
1073   u32 i, *delete = 0;
1074   ikev2_child_sa_t *c;
1075
1076   /* find old IKE SAs with the same authenticated identity */
1077   /* *INDENT-OFF* */
1078   pool_foreach (tmp, ptd->sas)  {
1079     if (!ikev2_is_id_equal (&tmp->i_id, &sa->i_id)
1080         || !ikev2_is_id_equal(&tmp->r_id, &sa->r_id))
1081       continue;
1082
1083     if (sa->rspi != tmp->rspi)
1084       vec_add1(delete, tmp - ptd->sas);
1085   }
1086   /* *INDENT-ON* */
1087
1088   for (i = 0; i < vec_len (delete); i++)
1089     {
1090       tmp = pool_elt_at_index (ptd->sas, delete[i]);
1091       vec_foreach (c, tmp->childs)
1092       {
1093         ikev2_delete_tunnel_interface (km->vnet_main, tmp, c);
1094       }
1095       ikev2_delete_sa (ptd, tmp);
1096     }
1097
1098   vec_free (delete);
1099   sa->initial_contact = 0;
1100 }
1101
1102 static void
1103 ikev2_initial_contact_cleanup (ikev2_main_per_thread_data_t * ptd,
1104                                ikev2_sa_t * sa)
1105 {
1106   ikev2_main_t *km = &ikev2_main;
1107
1108   if (!sa->initial_contact)
1109     return;
1110
1111   if (ptd)
1112     {
1113       ikev2_initial_contact_cleanup_internal (ptd, sa);
1114     }
1115   else
1116     {
1117       vec_foreach (ptd, km->per_thread_data)
1118         ikev2_initial_contact_cleanup_internal (ptd, sa);
1119     }
1120   sa->initial_contact = 0;
1121 }
1122
1123 static int
1124 ikev2_parse_id_payload (const void *p, u16 rlen, ikev2_id_t * sa_id)
1125 {
1126   const ike_id_payload_header_t *id = p;
1127   u16 plen = clib_net_to_host_u16 (id->length);
1128   if (plen < sizeof (*id) || plen > rlen)
1129     return 0;
1130
1131   sa_id->type = id->id_type;
1132   vec_reset_length (sa_id->data);
1133   vec_add (sa_id->data, id->payload, plen - sizeof (*id));
1134
1135   return 1;
1136 }
1137
1138 static int
1139 ikev2_parse_auth_payload (const void *p, u32 rlen, ikev2_auth_t * a)
1140 {
1141   const ike_auth_payload_header_t *ah = p;
1142   u16 plen = clib_net_to_host_u16 (ah->length);
1143
1144   a->method = ah->auth_method;
1145   vec_reset_length (a->data);
1146   vec_add (a->data, ah->payload, plen - sizeof (*ah));
1147   return 1;
1148 }
1149
1150 static int
1151 ikev2_process_auth_req (vlib_main_t * vm, ikev2_sa_t * sa,
1152                         ike_header_t * ike, u32 len)
1153 {
1154   int p = 0;
1155   ikev2_child_sa_t *first_child_sa;
1156   u8 payload = ike->nextpayload;
1157   u8 *plaintext = 0;
1158   ike_payload_header_t *ikep;
1159   u16 plen;
1160   u32 dlen = 0;
1161
1162   ikev2_elog_exchange ("ispi %lx rspi %lx EXCHANGE_IKE_AUTH received "
1163                        "from ", clib_host_to_net_u64 (ike->ispi),
1164                        clib_host_to_net_u64 (ike->rspi),
1165                        sa->is_initiator ?
1166                        ip_addr_v4 (&sa->raddr).as_u32 :
1167                        ip_addr_v4 (&sa->iaddr).as_u32,
1168                        ip_addr_version (&sa->raddr) == AF_IP4);
1169
1170   ikev2_calc_keys (sa);
1171
1172   plaintext = ikev2_decrypt_sk_payload (sa, ike, &payload, len, &dlen);
1173
1174   if (!plaintext)
1175     {
1176       if (sa->unsupported_cp)
1177         {
1178           ikev2_set_state (sa, IKEV2_STATE_NOTIFY_AND_DELETE);
1179           return 0;
1180         }
1181       goto malformed;
1182     }
1183
1184   /* select or create 1st child SA */
1185   if (sa->is_initiator)
1186     {
1187       first_child_sa = &sa->childs[0];
1188     }
1189   else
1190     {
1191       ikev2_sa_free_all_child_sa (&sa->childs);
1192       vec_add2 (sa->childs, first_child_sa, 1);
1193     }
1194
1195
1196   /* process encrypted payload */
1197   while (p < dlen && payload != IKEV2_PAYLOAD_NONE)
1198     {
1199       ikep = (ike_payload_header_t *) & plaintext[p];
1200       int current_length = dlen - p;
1201       if (!ikev2_check_payload_length (ikep, current_length, &plen))
1202         goto malformed;
1203
1204       if (payload == IKEV2_PAYLOAD_SA)  /* 33 */
1205         {
1206           if (sa->is_initiator)
1207             {
1208               ikev2_sa_free_proposal_vector (&first_child_sa->r_proposals);
1209               first_child_sa->r_proposals = ikev2_parse_sa_payload (ikep,
1210                                                                     current_length);
1211             }
1212           else
1213             {
1214               ikev2_sa_free_proposal_vector (&first_child_sa->i_proposals);
1215               first_child_sa->i_proposals = ikev2_parse_sa_payload (ikep,
1216                                                                     current_length);
1217             }
1218         }
1219       else if (payload == IKEV2_PAYLOAD_IDI)    /* 35 */
1220         {
1221           if (!ikev2_parse_id_payload (ikep, current_length, &sa->i_id))
1222             goto malformed;
1223         }
1224       else if (payload == IKEV2_PAYLOAD_IDR)    /* 36 */
1225         {
1226           if (!ikev2_parse_id_payload (ikep, current_length, &sa->r_id))
1227             goto malformed;
1228         }
1229       else if (payload == IKEV2_PAYLOAD_AUTH)   /* 39 */
1230         {
1231           if (sa->is_initiator)
1232             {
1233               if (!ikev2_parse_auth_payload (ikep, current_length,
1234                                              &sa->r_auth))
1235                 goto malformed;
1236             }
1237           else
1238             {
1239               if (!ikev2_parse_auth_payload (ikep, current_length,
1240                                              &sa->i_auth))
1241                 goto malformed;
1242             }
1243         }
1244       else if (payload == IKEV2_PAYLOAD_NOTIFY) /* 41 */
1245         {
1246           ikev2_notify_t *n =
1247             ikev2_parse_notify_payload (ikep, current_length);
1248           if (n->msg_type == IKEV2_NOTIFY_MSG_INITIAL_CONTACT)
1249             {
1250               sa->initial_contact = 1;
1251             }
1252           vec_free (n);
1253         }
1254       else if (payload == IKEV2_PAYLOAD_VENDOR) /* 43 */
1255         {
1256           ikev2_parse_vendor_payload (ikep);
1257         }
1258       else if (payload == IKEV2_PAYLOAD_TSI)    /* 44 */
1259         {
1260           vec_free (first_child_sa->tsi);
1261           first_child_sa->tsi = ikev2_parse_ts_payload (ikep, current_length);
1262         }
1263       else if (payload == IKEV2_PAYLOAD_TSR)    /* 45 */
1264         {
1265           vec_free (first_child_sa->tsr);
1266           first_child_sa->tsr = ikev2_parse_ts_payload (ikep, current_length);
1267         }
1268       else
1269         {
1270           ikev2_elog_uint (IKEV2_LOG_ERROR, "Unknown payload! type=%d",
1271                            payload);
1272
1273           if (ikep->flags & IKEV2_PAYLOAD_FLAG_CRITICAL)
1274             {
1275               ikev2_set_state (sa, IKEV2_STATE_NOTIFY_AND_DELETE);
1276               sa->unsupported_cp = payload;
1277               return 0;
1278             }
1279         }
1280
1281       payload = ikep->nextpayload;
1282       p += plen;
1283     }
1284
1285   return 1;
1286
1287 malformed:
1288   ikev2_set_state (sa, IKEV2_STATE_DELETED, ": malformed IKE_AUTH");
1289   return 0;
1290 }
1291
1292 static int
1293 ikev2_process_informational_req (vlib_main_t * vm,
1294                                  ikev2_sa_t * sa, ike_header_t * ike, u32 len)
1295 {
1296   int p = 0;
1297   u8 payload = ike->nextpayload;
1298   u8 *plaintext = 0;
1299   ike_payload_header_t *ikep;
1300   u32 dlen = 0;
1301   ikev2_notify_t *n = 0;
1302
1303   sa->liveness_retries = 0;
1304   ikev2_elog_exchange ("ispi %lx rspi %lx INFORMATIONAL received "
1305                        "from ", clib_host_to_net_u64 (ike->ispi),
1306                        clib_host_to_net_u64 (ike->rspi),
1307                        ip_addr_v4 (&sa->iaddr).as_u32,
1308                        ip_addr_version (&sa->iaddr) == AF_IP4);
1309
1310   plaintext = ikev2_decrypt_sk_payload (sa, ike, &payload, len, &dlen);
1311
1312   if (!plaintext)
1313     return 0;
1314
1315   /* process encrypted payload */
1316   p = 0;
1317   while (p < dlen && payload != IKEV2_PAYLOAD_NONE)
1318     {
1319       u32 current_length = dlen - p;
1320       if (p + sizeof (*ikep) > dlen)
1321         return 0;
1322
1323       ikep = (ike_payload_header_t *) & plaintext[p];
1324       u16 plen = clib_net_to_host_u16 (ikep->length);
1325
1326       if (plen < sizeof (*ikep) || plen > current_length)
1327         return 0;
1328
1329       if (payload == IKEV2_PAYLOAD_NOTIFY)      /* 41 */
1330         {
1331           n = ikev2_parse_notify_payload (ikep, current_length);
1332           if (!n)
1333             return 0;
1334           if (n->msg_type == IKEV2_NOTIFY_MSG_AUTHENTICATION_FAILED)
1335             ikev2_set_state (sa, IKEV2_STATE_AUTH_FAILED);
1336           vec_free (n);
1337         }
1338       else if (payload == IKEV2_PAYLOAD_DELETE) /* 42 */
1339         {
1340           sa->del = ikev2_parse_delete_payload (ikep, current_length);
1341         }
1342       else if (payload == IKEV2_PAYLOAD_VENDOR) /* 43 */
1343         {
1344           ikev2_parse_vendor_payload (ikep);
1345         }
1346       else
1347         {
1348           ikev2_elog_uint (IKEV2_LOG_ERROR, "Unknown payload! type=%d",
1349                            payload);
1350           if (ikep->flags & IKEV2_PAYLOAD_FLAG_CRITICAL)
1351             {
1352               sa->unsupported_cp = payload;
1353               return 0;
1354             }
1355         }
1356       payload = ikep->nextpayload;
1357       p += plen;
1358     }
1359   return 1;
1360 }
1361
1362 static int
1363 ikev2_process_create_child_sa_req (vlib_main_t * vm,
1364                                    ikev2_sa_t * sa, ike_header_t * ike,
1365                                    u32 len)
1366 {
1367   int p = 0;
1368   u8 payload = ike->nextpayload;
1369   u8 *plaintext = 0;
1370   ikev2_rekey_t *rekey;
1371   ike_payload_header_t *ikep;
1372   ikev2_notify_t *n = 0;
1373   ikev2_ts_t *tsi = 0;
1374   ikev2_ts_t *tsr = 0;
1375   ikev2_sa_proposal_t *proposal = 0;
1376   ikev2_child_sa_t *child_sa;
1377   u32 dlen = 0, src;
1378   u16 plen;
1379   const u8 *nonce = 0;
1380   int nonce_len = 0;
1381
1382   if (sa->is_initiator)
1383     src = ip_addr_v4 (&sa->raddr).as_u32;
1384   else
1385     src = ip_addr_v4 (&sa->iaddr).as_u32;
1386
1387   ikev2_elog_exchange ("ispi %lx rspi %lx CREATE_CHILD_SA received from",
1388                        clib_host_to_net_u64 (ike->ispi),
1389                        clib_host_to_net_u64 (ike->rspi), src,
1390                        ip_addr_version (&sa->raddr) == AF_IP4);
1391
1392   plaintext = ikev2_decrypt_sk_payload (sa, ike, &payload, len, &dlen);
1393
1394   if (!plaintext)
1395     goto cleanup_and_exit;
1396
1397   /* process encrypted payload */
1398   p = 0;
1399   while (payload != IKEV2_PAYLOAD_NONE)
1400     {
1401       ikep = (ike_payload_header_t *) & plaintext[p];
1402       int current_length = dlen - p;
1403       if (!ikev2_check_payload_length (ikep, current_length, &plen))
1404         goto cleanup_and_exit;
1405
1406       if (payload == IKEV2_PAYLOAD_SA)
1407         {
1408           proposal = ikev2_parse_sa_payload (ikep, current_length);
1409         }
1410       else if (payload == IKEV2_PAYLOAD_NOTIFY)
1411         {
1412           ikev2_notify_t *n0;
1413           n0 = ikev2_parse_notify_payload (ikep, current_length);
1414           if (n0->msg_type == IKEV2_NOTIFY_MSG_REKEY_SA)
1415             {
1416               vec_free (n);
1417               n = n0;
1418             }
1419           else
1420             vec_free (n0);
1421         }
1422       else if (payload == IKEV2_PAYLOAD_DELETE)
1423         {
1424           sa->del = ikev2_parse_delete_payload (ikep, current_length);
1425         }
1426       else if (payload == IKEV2_PAYLOAD_VENDOR)
1427         {
1428           ikev2_parse_vendor_payload (ikep);
1429         }
1430       else if (payload == IKEV2_PAYLOAD_NONCE)
1431         {
1432           nonce_len = ikev2_parse_nonce_payload (ikep, current_length, &nonce);
1433           if (nonce_len <= 0)
1434             goto cleanup_and_exit;
1435         }
1436       else if (payload == IKEV2_PAYLOAD_TSI)
1437         {
1438           tsi = ikev2_parse_ts_payload (ikep, current_length);
1439         }
1440       else if (payload == IKEV2_PAYLOAD_TSR)
1441         {
1442           tsr = ikev2_parse_ts_payload (ikep, current_length);
1443         }
1444       else
1445         {
1446           ikev2_elog_uint (IKEV2_LOG_ERROR, "Unknown payload! type=%d",
1447                            payload);
1448           if (ikep->flags & IKEV2_PAYLOAD_FLAG_CRITICAL)
1449             {
1450               sa->unsupported_cp = payload;
1451               goto cleanup_and_exit;
1452             }
1453         }
1454       payload = ikep->nextpayload;
1455       p += plen;
1456     }
1457
1458   if (!proposal || proposal->protocol_id != IKEV2_PROTOCOL_ESP || !nonce)
1459     goto cleanup_and_exit;
1460
1461   if (sa->is_initiator)
1462     {
1463       rekey = sa->rekey;
1464       if (vec_len (rekey) == 0)
1465         goto cleanup_and_exit;
1466       rekey->protocol_id = proposal->protocol_id;
1467       rekey->i_proposal =
1468         ikev2_select_proposal (proposal, IKEV2_PROTOCOL_ESP);
1469       rekey->i_proposal->spi = rekey->spi;
1470       rekey->r_proposal = proposal;
1471       rekey->tsi = tsi;
1472       rekey->tsr = tsr;
1473       /* update Nr */
1474       vec_reset_length (sa->r_nonce);
1475       vec_add (sa->r_nonce, nonce, nonce_len);
1476       child_sa = ikev2_sa_get_child (sa, rekey->ispi, IKEV2_PROTOCOL_ESP, 1);
1477       if (child_sa)
1478         {
1479           child_sa->rekey_retries = 0;
1480         }
1481     }
1482   else
1483     {
1484       if (n)
1485         {
1486           child_sa = ikev2_sa_get_child (sa, n->spi, n->protocol_id, 1);
1487           if (!child_sa)
1488             {
1489               ikev2_elog_uint (IKEV2_LOG_ERROR, "child SA spi %lx not found",
1490                                n->spi);
1491               goto cleanup_and_exit;
1492             }
1493           vec_add2 (sa->rekey, rekey, 1);
1494           rekey->protocol_id = n->protocol_id;
1495           rekey->spi = n->spi;
1496           rekey->i_proposal = proposal;
1497           rekey->r_proposal =
1498             ikev2_select_proposal (proposal, IKEV2_PROTOCOL_ESP);
1499           /* update Ni */
1500           vec_reset_length (sa->i_nonce);
1501           vec_add (sa->i_nonce, nonce, nonce_len);
1502           /* generate new Nr */
1503           vec_validate (sa->r_nonce, nonce_len - 1);
1504           RAND_bytes ((u8 *) sa->r_nonce, nonce_len);
1505         }
1506       else
1507         {
1508           /* create new child SA */
1509           vec_add2 (sa->new_child, rekey, 1);
1510           rekey->i_proposal = proposal;
1511           rekey->r_proposal =
1512             ikev2_select_proposal (proposal, IKEV2_PROTOCOL_ESP);
1513           /* update Ni */
1514           vec_reset_length (sa->i_nonce);
1515           vec_add (sa->i_nonce, nonce, nonce_len);
1516           /* generate new Nr */
1517           vec_validate (sa->r_nonce, nonce_len - 1);
1518           RAND_bytes ((u8 *) sa->r_nonce, nonce_len);
1519         }
1520       rekey->tsi = tsi;
1521       rekey->tsr = tsr;
1522     }
1523   vec_free (n);
1524   return 1;
1525
1526 cleanup_and_exit:
1527   vec_free (n);
1528   vec_free (proposal);
1529   vec_free (tsr);
1530   vec_free (tsi);
1531   return 0;
1532 }
1533
1534 static u8 *
1535 ikev2_sa_generate_authmsg (ikev2_sa_t * sa, int is_responder)
1536 {
1537   u8 *authmsg = 0;
1538   u8 *data;
1539   u8 *nonce;
1540   ikev2_id_t *id;
1541   u8 *key;
1542   u8 *packet_data;
1543   ikev2_sa_transform_t *tr_prf;
1544
1545   tr_prf =
1546     ikev2_sa_get_td_for_type (sa->r_proposals, IKEV2_TRANSFORM_TYPE_PRF);
1547
1548   if (is_responder)
1549     {
1550       id = &sa->r_id;
1551       key = sa->sk_pr;
1552       nonce = sa->i_nonce;
1553       packet_data = sa->last_sa_init_res_packet_data;
1554     }
1555   else
1556     {
1557       id = &sa->i_id;
1558       key = sa->sk_pi;
1559       nonce = sa->r_nonce;
1560       packet_data = sa->last_sa_init_req_packet_data;
1561     }
1562
1563   data = vec_new (u8, 4);
1564   data[0] = id->type;
1565   vec_append (data, id->data);
1566
1567   u8 *id_hash = ikev2_calc_prf (tr_prf, key, data);
1568   vec_append (authmsg, packet_data);
1569   vec_append (authmsg, nonce);
1570   vec_append (authmsg, id_hash);
1571   vec_free (id_hash);
1572   vec_free (data);
1573
1574   return authmsg;
1575 }
1576
1577 static int
1578 ikev2_match_profile (const ikev2_profile_t *p, const ikev2_id_t *id_loc,
1579                      const ikev2_id_t *id_rem, int is_initiator)
1580 {
1581   /* on the initiator, IDi is always present and must match
1582    * however on the responder, IDr (which is our local id) is optional */
1583   if ((is_initiator || id_loc->type != 0) &&
1584       !ikev2_is_id_equal (&p->loc_id, id_loc))
1585     return 0;
1586
1587   /* on the initiator, we might not have configured a specific remote id
1588    * however on the responder, the remote id should always be configured */
1589   if ((!is_initiator || p->rem_id.type != 0) &&
1590       !ikev2_is_id_equal (&p->rem_id, id_rem))
1591     return 0;
1592
1593   return 1;
1594 }
1595
1596 static int
1597 ikev2_ts_cmp (ikev2_ts_t * ts1, ikev2_ts_t * ts2)
1598 {
1599   if (ts1->ts_type == ts2->ts_type && ts1->protocol_id == ts2->protocol_id &&
1600       ts1->start_port == ts2->start_port && ts1->end_port == ts2->end_port &&
1601       !ip_address_cmp (&ts1->start_addr, &ts2->start_addr) &&
1602       !ip_address_cmp (&ts1->end_addr, &ts2->end_addr))
1603     return 1;
1604
1605   return 0;
1606 }
1607
1608 static void
1609 ikev2_sa_match_ts (ikev2_sa_t * sa)
1610 {
1611   ikev2_main_t *km = &ikev2_main;
1612   ikev2_profile_t *p;
1613   ikev2_ts_t *ts, *p_tsi, *p_tsr, *tsi = 0, *tsr = 0;
1614   ikev2_id_t *id_rem, *id_loc;
1615
1616   /* *INDENT-OFF* */
1617   pool_foreach (p, km->profiles)  {
1618
1619     if (sa->is_initiator)
1620       {
1621         p_tsi = &p->loc_ts;
1622         p_tsr = &p->rem_ts;
1623         id_rem = &sa->r_id;
1624         id_loc = &sa->i_id;
1625       }
1626     else
1627       {
1628         p_tsi = &p->rem_ts;
1629         p_tsr = &p->loc_ts;
1630         id_rem = &sa->i_id;
1631         id_loc = &sa->r_id;
1632       }
1633
1634     if (!ikev2_match_profile (p, id_loc, id_rem, sa->is_initiator))
1635       continue;
1636
1637     sa->profile_index = p - km->profiles;
1638
1639     vec_foreach(ts, sa->childs[0].tsi)
1640       {
1641         if (ikev2_ts_cmp(p_tsi, ts))
1642           {
1643             vec_add1 (tsi, ts[0]);
1644             break;
1645           }
1646       }
1647
1648     vec_foreach(ts, sa->childs[0].tsr)
1649       {
1650         if (ikev2_ts_cmp(p_tsr, ts))
1651           {
1652             vec_add1 (tsr, ts[0]);
1653             break;
1654           }
1655       }
1656
1657     break;
1658   }
1659   /* *INDENT-ON* */
1660
1661   if (tsi && tsr)
1662     {
1663       vec_free (sa->childs[0].tsi);
1664       vec_free (sa->childs[0].tsr);
1665       sa->childs[0].tsi = tsi;
1666       sa->childs[0].tsr = tsr;
1667     }
1668   else
1669     {
1670       vec_free (tsi);
1671       vec_free (tsr);
1672       ikev2_set_state (sa, IKEV2_STATE_TS_UNACCEPTABLE);
1673     }
1674 }
1675
1676 static ikev2_profile_t *
1677 ikev2_select_profile (ikev2_main_t *km, ikev2_sa_t *sa,
1678                       ikev2_sa_transform_t *tr_prf, u8 *key_pad)
1679 {
1680   ikev2_profile_t *ret = 0, *p;
1681   ikev2_id_t *id_rem, *id_loc;
1682   ikev2_auth_t *sa_auth;
1683   u8 *authmsg, *psk = 0, *auth = 0;
1684
1685   authmsg = ikev2_sa_generate_authmsg (sa, sa->is_initiator);
1686
1687   if (sa->is_initiator)
1688     {
1689       id_rem = &sa->r_id;
1690       id_loc = &sa->i_id;
1691       sa_auth = &sa->r_auth;
1692     }
1693   else
1694     {
1695       id_rem = &sa->i_id;
1696       id_loc = &sa->r_id;
1697       sa_auth = &sa->i_auth;
1698     }
1699
1700   pool_foreach (p, km->profiles)
1701     {
1702       if (!ikev2_match_profile (p, id_loc, id_rem, sa->is_initiator))
1703         continue;
1704
1705       if (sa_auth->method == IKEV2_AUTH_METHOD_SHARED_KEY_MIC)
1706         {
1707           if (!p->auth.data ||
1708               p->auth.method != IKEV2_AUTH_METHOD_SHARED_KEY_MIC)
1709             continue;
1710
1711           psk = ikev2_calc_prf (tr_prf, p->auth.data, key_pad);
1712           auth = ikev2_calc_prf (tr_prf, psk, authmsg);
1713
1714           if (!clib_memcmp (auth, sa_auth->data, vec_len (sa_auth->data)))
1715             {
1716               ikev2_set_state (sa, IKEV2_STATE_AUTHENTICATED);
1717               vec_free (auth);
1718               ret = p;
1719               break;
1720             }
1721           else
1722             {
1723               ikev2_elog_uint (IKEV2_LOG_ERROR,
1724                                "shared key mismatch! ispi %lx", sa->ispi);
1725             }
1726         }
1727       else if (sa_auth->method == IKEV2_AUTH_METHOD_RSA_SIG)
1728         {
1729           if (p->auth.method != IKEV2_AUTH_METHOD_RSA_SIG)
1730             continue;
1731
1732           if (ikev2_verify_sign (p->auth.key, sa_auth->data, authmsg) == 1)
1733             {
1734               ikev2_set_state (sa, IKEV2_STATE_AUTHENTICATED);
1735               ret = p;
1736               break;
1737             }
1738           else
1739             {
1740               ikev2_elog_uint (IKEV2_LOG_ERROR,
1741                                "cert verification failed! ispi %lx", sa->ispi);
1742             }
1743         }
1744     }
1745   vec_free (authmsg);
1746   return ret;
1747 }
1748
1749 static void
1750 ikev2_sa_auth (ikev2_sa_t *sa)
1751 {
1752   ikev2_main_t *km = &ikev2_main;
1753   ikev2_profile_t *sel_p = 0;
1754   ikev2_sa_transform_t *tr_prf;
1755   u8 *psk, *authmsg, *key_pad;
1756
1757   tr_prf =
1758     ikev2_sa_get_td_for_type (sa->r_proposals, IKEV2_TRANSFORM_TYPE_PRF);
1759
1760   /* only shared key and rsa signature */
1761   if (!(sa->i_auth.method == IKEV2_AUTH_METHOD_SHARED_KEY_MIC ||
1762         sa->i_auth.method == IKEV2_AUTH_METHOD_RSA_SIG))
1763     {
1764       ikev2_elog_uint (IKEV2_LOG_ERROR, "unsupported authentication method %u",
1765                        sa->i_auth.method);
1766       ikev2_set_state (sa, IKEV2_STATE_AUTH_FAILED);
1767       return;
1768     }
1769
1770   key_pad = format (0, "%s", IKEV2_KEY_PAD);
1771   sel_p = ikev2_select_profile (km, sa, tr_prf, key_pad);
1772
1773   if (sel_p)
1774     {
1775       ASSERT (sa->state == IKEV2_STATE_AUTHENTICATED);
1776       sa->udp_encap = sel_p->udp_encap;
1777       sa->ipsec_over_udp_port = sel_p->ipsec_over_udp_port;
1778
1779       if (!sa->is_initiator)
1780         {
1781           vec_free (sa->r_id.data);
1782           sa->r_id.data = vec_dup (sel_p->loc_id.data);
1783           sa->r_id.type = sel_p->loc_id.type;
1784           sa->i_id.data = vec_dup (sel_p->rem_id.data);
1785           sa->i_id.type = sel_p->rem_id.type;
1786
1787           /* generate our auth data */
1788           authmsg = ikev2_sa_generate_authmsg (sa, 1);
1789           if (sel_p->auth.method == IKEV2_AUTH_METHOD_SHARED_KEY_MIC)
1790             {
1791               vec_free (sa->r_auth.data);
1792               psk = ikev2_calc_prf (tr_prf, sel_p->auth.data, key_pad);
1793               sa->r_auth.data = ikev2_calc_prf (tr_prf, psk, authmsg);
1794               sa->r_auth.method = IKEV2_AUTH_METHOD_SHARED_KEY_MIC;
1795               vec_free (psk);
1796             }
1797           else if (sel_p->auth.method == IKEV2_AUTH_METHOD_RSA_SIG)
1798             {
1799               vec_free (sa->r_auth.data);
1800               sa->r_auth.data = ikev2_calc_sign (km->pkey, authmsg);
1801               sa->r_auth.method = IKEV2_AUTH_METHOD_RSA_SIG;
1802             }
1803           vec_free (authmsg);
1804
1805           /* select transforms for 1st child sa */
1806           ikev2_sa_free_proposal_vector (&sa->childs[0].r_proposals);
1807           sa->childs[0].r_proposals =
1808             ikev2_select_proposal (sa->childs[0].i_proposals,
1809                                    IKEV2_PROTOCOL_ESP);
1810
1811           if (~0 != sel_p->tun_itf)
1812             {
1813               sa->is_tun_itf_set = 1;
1814               sa->tun_itf = sel_p->tun_itf;
1815             }
1816         }
1817     }
1818   else
1819     {
1820       ikev2_elog_uint (IKEV2_LOG_ERROR, "authentication failed, no matching "
1821                        "profile found! ispi %lx", sa->ispi);
1822       ikev2_set_state (sa, IKEV2_STATE_AUTH_FAILED);
1823     }
1824   vec_free (key_pad);
1825 }
1826
1827 static void
1828 ikev2_sa_auth_init (ikev2_sa_t * sa)
1829 {
1830   ikev2_main_t *km = &ikev2_main;
1831   u8 *authmsg, *key_pad, *psk = 0;
1832   ikev2_sa_transform_t *tr_prf;
1833
1834   tr_prf =
1835     ikev2_sa_get_td_for_type (sa->r_proposals, IKEV2_TRANSFORM_TYPE_PRF);
1836
1837   /* only shared key and rsa signature */
1838   if (!(sa->i_auth.method == IKEV2_AUTH_METHOD_SHARED_KEY_MIC ||
1839         sa->i_auth.method == IKEV2_AUTH_METHOD_RSA_SIG))
1840     {
1841       ikev2_elog_uint (IKEV2_LOG_ERROR,
1842                        "unsupported authentication method %u",
1843                        sa->i_auth.method);
1844       ikev2_set_state (sa, IKEV2_STATE_AUTH_FAILED);
1845       return;
1846     }
1847
1848   authmsg = ikev2_sa_generate_authmsg (sa, 0);
1849
1850   if (sa->i_auth.method == IKEV2_AUTH_METHOD_SHARED_KEY_MIC)
1851     {
1852       key_pad = format (0, "%s", IKEV2_KEY_PAD);
1853       psk = ikev2_calc_prf (tr_prf, sa->i_auth.data, key_pad);
1854       vec_free (sa->i_auth.data);
1855       sa->i_auth.data = ikev2_calc_prf (tr_prf, psk, authmsg);
1856       sa->i_auth.method = IKEV2_AUTH_METHOD_SHARED_KEY_MIC;
1857       vec_free (psk);
1858       vec_free (key_pad);
1859     }
1860   else if (sa->i_auth.method == IKEV2_AUTH_METHOD_RSA_SIG)
1861     {
1862       vec_free (sa->i_auth.data);
1863       sa->i_auth.data = ikev2_calc_sign (km->pkey, authmsg);
1864       sa->i_auth.method = IKEV2_AUTH_METHOD_RSA_SIG;
1865     }
1866   vec_free (authmsg);
1867 }
1868
1869 static u32
1870 ikev2_mk_local_sa_id (u32 sai, u32 ci, u32 ti)
1871 {
1872   return (0x80000000 | (ti << 24) | (sai << 12) | ci);
1873 }
1874
1875 static u32
1876 ikev2_mk_remote_sa_id (u32 sai, u32 ci, u32 ti)
1877 {
1878   return (0xc0000000 | (ti << 24) | (sai << 12) | ci);
1879 }
1880
1881 typedef struct
1882 {
1883   u32 sw_if_index;
1884   u32 salt_local;
1885   u32 salt_remote;
1886   u32 local_sa_id;
1887   u32 remote_sa_id;
1888   ipsec_sa_flags_t flags;
1889   u32 local_spi;
1890   u32 remote_spi;
1891   ipsec_crypto_alg_t encr_type;
1892   ipsec_integ_alg_t integ_type;
1893   ip_address_t local_ip;
1894   ip_address_t remote_ip;
1895   ipsec_key_t loc_ckey, rem_ckey, loc_ikey, rem_ikey;
1896   u8 is_rekey;
1897   u32 old_remote_sa_id;
1898   u16 ipsec_over_udp_port;
1899   u16 src_port;
1900   u16 dst_port;
1901 } ikev2_add_ipsec_tunnel_args_t;
1902
1903 static void
1904 ikev2_add_tunnel_from_main (ikev2_add_ipsec_tunnel_args_t * a)
1905 {
1906   ikev2_main_t *km = &ikev2_main;
1907   u32 sw_if_index;
1908   int rv = 0;
1909   tunnel_t tun_in = {
1910     .t_flags = TUNNEL_FLAG_NONE,
1911     .t_encap_decap_flags = TUNNEL_ENCAP_DECAP_FLAG_NONE,
1912     .t_dscp = 0,
1913     .t_mode = TUNNEL_MODE_P2P,
1914     .t_table_id = 0,
1915     .t_hop_limit = 255,
1916     .t_src = a->remote_ip,
1917     .t_dst = a->local_ip,
1918   };
1919   tunnel_t tun_out = {
1920     .t_flags = TUNNEL_FLAG_NONE,
1921     .t_encap_decap_flags = TUNNEL_ENCAP_DECAP_FLAG_NONE,
1922     .t_dscp = 0,
1923     .t_mode = TUNNEL_MODE_P2P,
1924     .t_table_id = 0,
1925     .t_hop_limit = 255,
1926     .t_src = a->local_ip,
1927     .t_dst = a->remote_ip,
1928   };
1929
1930   if (~0 == a->sw_if_index)
1931     {
1932       /* no tunnel associated with the SA/profile - create a new one */
1933       rv = ipip_add_tunnel (IPIP_TRANSPORT_IP4, ~0, &ip_addr_46 (&a->local_ip),
1934                             &ip_addr_46 (&a->remote_ip), 0,
1935                             TUNNEL_ENCAP_DECAP_FLAG_NONE, IP_DSCP_CS0,
1936                             TUNNEL_MODE_P2P, &sw_if_index);
1937
1938       if (rv == VNET_API_ERROR_IF_ALREADY_EXISTS)
1939         {
1940           if (hash_get (km->sw_if_indices, sw_if_index))
1941             /* interface is managed by IKE; proceed with updating SAs */
1942             rv = 0;
1943         }
1944       hash_set1 (km->sw_if_indices, sw_if_index);
1945     }
1946   else
1947     {
1948       sw_if_index = a->sw_if_index;
1949       vnet_sw_interface_admin_up (vnet_get_main (), sw_if_index);
1950     }
1951
1952   if (rv)
1953     {
1954       ikev2_elog_uint (IKEV2_LOG_ERROR,
1955                        "installing ipip tunnel failed! local spi: %x",
1956                        a->local_spi);
1957       return;
1958     }
1959
1960   u32 *sas_in = NULL;
1961   vec_add1 (sas_in, a->remote_sa_id);
1962   if (a->is_rekey)
1963     {
1964       ipsec_tun_protect_del (sw_if_index, NULL);
1965
1966       /* replace local SA immediately */
1967       ipsec_sa_unlock_id (a->local_sa_id);
1968
1969       /* keep the old sa */
1970       vec_add1 (sas_in, a->old_remote_sa_id);
1971     }
1972
1973   rv = ipsec_sa_add_and_lock (a->local_sa_id, a->local_spi, IPSEC_PROTOCOL_ESP,
1974                               a->encr_type, &a->loc_ckey, a->integ_type,
1975                               &a->loc_ikey, a->flags, a->salt_local,
1976                               a->src_port, a->dst_port, &tun_out, NULL);
1977   if (rv)
1978     goto err0;
1979
1980   rv = ipsec_sa_add_and_lock (
1981     a->remote_sa_id, a->remote_spi, IPSEC_PROTOCOL_ESP, a->encr_type,
1982     &a->rem_ckey, a->integ_type, &a->rem_ikey,
1983     (a->flags | IPSEC_SA_FLAG_IS_INBOUND), a->salt_remote,
1984     a->ipsec_over_udp_port, a->ipsec_over_udp_port, &tun_in, NULL);
1985   if (rv)
1986     goto err1;
1987
1988   rv = ipsec_tun_protect_update (sw_if_index, NULL, a->local_sa_id, sas_in);
1989   if (rv)
1990     goto err2;
1991
1992   return;
1993
1994 err2:
1995   ipsec_sa_unlock_id (a->remote_sa_id);
1996 err1:
1997   ipsec_sa_unlock_id (a->local_sa_id);
1998 err0:
1999   vec_free (sas_in);
2000 }
2001
2002 static int
2003 ikev2_create_tunnel_interface (vlib_main_t * vm,
2004                                ikev2_sa_t * sa,
2005                                ikev2_child_sa_t * child, u32 sa_index,
2006                                u32 child_index, u8 is_rekey)
2007 {
2008   u32 thread_index = vlib_get_thread_index ();
2009   ikev2_main_t *km = &ikev2_main;
2010   ipsec_crypto_alg_t encr_type;
2011   ipsec_integ_alg_t integ_type;
2012   ikev2_profile_t *p = 0;
2013   ikev2_sa_transform_t *tr;
2014   ikev2_sa_proposal_t *proposals;
2015   u8 is_aead = 0;
2016   ikev2_add_ipsec_tunnel_args_t a;
2017
2018   clib_memset (&a, 0, sizeof (a));
2019
2020   if (!child->r_proposals)
2021     {
2022       ikev2_set_state (sa, IKEV2_STATE_NO_PROPOSAL_CHOSEN);
2023       return 1;
2024     }
2025
2026   if (sa->is_initiator)
2027     {
2028       ip_address_copy (&a.local_ip, &sa->iaddr);
2029       ip_address_copy (&a.remote_ip, &sa->raddr);
2030       proposals = child->r_proposals;
2031       a.local_spi = child->r_proposals[0].spi;
2032       a.remote_spi = child->i_proposals[0].spi;
2033     }
2034   else
2035     {
2036       ip_address_copy (&a.local_ip, &sa->raddr);
2037       ip_address_copy (&a.remote_ip, &sa->iaddr);
2038       proposals = child->i_proposals;
2039       a.local_spi = child->i_proposals[0].spi;
2040       a.remote_spi = child->r_proposals[0].spi;
2041     }
2042
2043   a.flags = IPSEC_SA_FLAG_USE_ANTI_REPLAY;
2044   if (sa->udp_encap)
2045     {
2046       a.flags |= IPSEC_SA_FLAG_IS_TUNNEL;
2047       a.flags |= IPSEC_SA_FLAG_UDP_ENCAP;
2048     }
2049   if (ikev2_natt_active (sa))
2050     a.flags |= IPSEC_SA_FLAG_UDP_ENCAP;
2051   a.is_rekey = is_rekey;
2052
2053   tr = ikev2_sa_get_td_for_type (proposals, IKEV2_TRANSFORM_TYPE_ESN);
2054   if (tr && tr->esn_type)
2055     a.flags |= IPSEC_SA_FLAG_USE_ESN;
2056
2057   tr = ikev2_sa_get_td_for_type (proposals, IKEV2_TRANSFORM_TYPE_ENCR);
2058   if (tr)
2059     {
2060       if (tr->encr_type == IKEV2_TRANSFORM_ENCR_TYPE_AES_CBC && tr->key_len)
2061         {
2062           switch (tr->key_len)
2063             {
2064             case 16:
2065               encr_type = IPSEC_CRYPTO_ALG_AES_CBC_128;
2066               break;
2067             case 24:
2068               encr_type = IPSEC_CRYPTO_ALG_AES_CBC_192;
2069               break;
2070             case 32:
2071               encr_type = IPSEC_CRYPTO_ALG_AES_CBC_256;
2072               break;
2073             default:
2074               ikev2_set_state (sa, IKEV2_STATE_NO_PROPOSAL_CHOSEN);
2075               return 1;
2076               break;
2077             }
2078         }
2079       else if (tr->encr_type == IKEV2_TRANSFORM_ENCR_TYPE_AES_GCM_16
2080                && tr->key_len)
2081         {
2082           switch (tr->key_len)
2083             {
2084             case 16:
2085               encr_type = IPSEC_CRYPTO_ALG_AES_GCM_128;
2086               break;
2087             case 24:
2088               encr_type = IPSEC_CRYPTO_ALG_AES_GCM_192;
2089               break;
2090             case 32:
2091               encr_type = IPSEC_CRYPTO_ALG_AES_GCM_256;
2092               break;
2093             default:
2094               ikev2_set_state (sa, IKEV2_STATE_NO_PROPOSAL_CHOSEN);
2095               return 1;
2096               break;
2097             }
2098           is_aead = 1;
2099         }
2100       else
2101         {
2102           ikev2_set_state (sa, IKEV2_STATE_NO_PROPOSAL_CHOSEN);
2103           return 1;
2104         }
2105     }
2106   else
2107     {
2108       ikev2_set_state (sa, IKEV2_STATE_NO_PROPOSAL_CHOSEN);
2109       return 1;
2110     }
2111   a.encr_type = encr_type;
2112
2113   if (!is_aead)
2114     {
2115       tr = ikev2_sa_get_td_for_type (proposals, IKEV2_TRANSFORM_TYPE_INTEG);
2116       if (tr)
2117         {
2118           switch (tr->integ_type)
2119             {
2120             case IKEV2_TRANSFORM_INTEG_TYPE_AUTH_HMAC_SHA2_256_128:
2121               integ_type = IPSEC_INTEG_ALG_SHA_256_128;
2122               break;
2123             case IKEV2_TRANSFORM_INTEG_TYPE_AUTH_HMAC_SHA2_384_192:
2124               integ_type = IPSEC_INTEG_ALG_SHA_384_192;
2125               break;
2126             case IKEV2_TRANSFORM_INTEG_TYPE_AUTH_HMAC_SHA2_512_256:
2127               integ_type = IPSEC_INTEG_ALG_SHA_512_256;
2128               break;
2129             case IKEV2_TRANSFORM_INTEG_TYPE_AUTH_HMAC_SHA1_96:
2130               integ_type = IPSEC_INTEG_ALG_SHA1_96;
2131               break;
2132             default:
2133               ikev2_set_state (sa, IKEV2_STATE_NO_PROPOSAL_CHOSEN);
2134               return 1;
2135             }
2136         }
2137       else
2138         {
2139           ikev2_set_state (sa, IKEV2_STATE_NO_PROPOSAL_CHOSEN);
2140           return 1;
2141         }
2142     }
2143   else
2144     {
2145       integ_type = IPSEC_INTEG_ALG_NONE;
2146     }
2147
2148   a.integ_type = integ_type;
2149   ikev2_calc_child_keys (sa, child);
2150
2151   if (sa->is_initiator)
2152     {
2153       ipsec_mk_key (&a.loc_ikey, child->sk_ai, vec_len (child->sk_ai));
2154       ipsec_mk_key (&a.rem_ikey, child->sk_ar, vec_len (child->sk_ar));
2155       ipsec_mk_key (&a.loc_ckey, child->sk_ei, vec_len (child->sk_ei));
2156       ipsec_mk_key (&a.rem_ckey, child->sk_er, vec_len (child->sk_er));
2157       if (is_aead)
2158         {
2159           a.salt_remote = child->salt_er;
2160           a.salt_local = child->salt_ei;
2161         }
2162       a.dst_port = a.src_port = sa->ipsec_over_udp_port;
2163     }
2164   else
2165     {
2166       ipsec_mk_key (&a.loc_ikey, child->sk_ar, vec_len (child->sk_ar));
2167       ipsec_mk_key (&a.rem_ikey, child->sk_ai, vec_len (child->sk_ai));
2168       ipsec_mk_key (&a.loc_ckey, child->sk_er, vec_len (child->sk_er));
2169       ipsec_mk_key (&a.rem_ckey, child->sk_ei, vec_len (child->sk_ei));
2170       if (is_aead)
2171         {
2172           a.salt_remote = child->salt_ei;
2173           a.salt_local = child->salt_er;
2174         }
2175       a.dst_port =
2176         ikev2_natt_active (sa) ? sa->dst_port : sa->ipsec_over_udp_port;
2177       a.src_port = sa->ipsec_over_udp_port;
2178     }
2179
2180   if (sa->is_initiator && sa->profile_index != ~0)
2181     p = pool_elt_at_index (km->profiles, sa->profile_index);
2182
2183   if (p && p->lifetime)
2184     {
2185       child->time_to_expiration = vlib_time_now (vm) + p->lifetime;
2186       if (p->lifetime_jitter)
2187         {
2188           // This is not much better than rand(3), which Coverity warns
2189           // is unsuitable for security applications; random_u32 is
2190           // however fast. If this perturbance to the expiration time
2191           // needs to use a better RNG then we may need to use something
2192           // like /dev/urandom which has significant overhead.
2193           u32 rnd = (u32) (vlib_time_now (vm) * 1e6);
2194           rnd = random_u32 (&rnd);
2195
2196           child->time_to_expiration += 1 + (rnd % p->lifetime_jitter);
2197         }
2198     }
2199
2200   if (thread_index & 0xffffffc0)
2201     ikev2_elog_error ("error: thread index exceeds max range 0x3f!");
2202
2203   if (child_index & 0xfffff000 || sa_index & 0xfffff000)
2204     ikev2_elog_error ("error: sa/child index exceeds max range 0xfff!");
2205
2206   child->local_sa_id =
2207     a.local_sa_id =
2208     ikev2_mk_local_sa_id (sa_index, child_index, thread_index);
2209
2210   u32 remote_sa_id = ikev2_mk_remote_sa_id (sa_index, child_index,
2211                                             thread_index);
2212
2213   if (is_rekey)
2214     {
2215       /* create a new remote SA ID to keep the old SA for a bit longer
2216        * so the peer has some time to swap their SAs */
2217
2218       /* use most significat bit of child index part in id */
2219       u32 mask = 0x800;
2220       if (sa->current_remote_id_mask)
2221         {
2222           sa->old_remote_id = a.old_remote_sa_id = remote_sa_id | mask;
2223           sa->current_remote_id_mask = 0;
2224         }
2225       else
2226         {
2227           sa->old_remote_id = a.old_remote_sa_id = remote_sa_id;
2228           sa->current_remote_id_mask = mask;
2229           remote_sa_id |= mask;
2230         }
2231       sa->old_id_expiration = 3.0;
2232       sa->old_remote_id_present = 1;
2233     }
2234
2235   child->remote_sa_id = a.remote_sa_id = remote_sa_id;
2236
2237   a.sw_if_index = (sa->is_tun_itf_set ? sa->tun_itf : ~0);
2238   a.ipsec_over_udp_port = sa->ipsec_over_udp_port;
2239
2240   vl_api_rpc_call_main_thread (ikev2_add_tunnel_from_main,
2241                                (u8 *) & a, sizeof (a));
2242   return 0;
2243 }
2244
2245 typedef struct
2246 {
2247   ip46_address_t local_ip;
2248   ip46_address_t remote_ip;
2249   u32 remote_sa_id;
2250   u32 local_sa_id;
2251   u32 sw_if_index;
2252 } ikev2_del_ipsec_tunnel_args_t;
2253
2254 static u32
2255 ikev2_flip_alternate_sa_bit (u32 id)
2256 {
2257   u32 mask = 0x800;
2258   if (mask & id)
2259     return id & ~mask;
2260   return id | mask;
2261 }
2262
2263 static void
2264 ikev2_del_tunnel_from_main (ikev2_del_ipsec_tunnel_args_t * a)
2265 {
2266   ikev2_main_t *km = &ikev2_main;
2267   ipip_tunnel_t *ipip = NULL;
2268   u32 sw_if_index;
2269
2270   if (~0 == a->sw_if_index)
2271     {
2272     /* *INDENT-OFF* */
2273     ipip_tunnel_key_t key = {
2274       .src = a->local_ip,
2275       .dst = a->remote_ip,
2276       .transport = IPIP_TRANSPORT_IP4,
2277       .fib_index = 0,
2278     };
2279     /* *INDENT-ON* */
2280
2281       ipip = ipip_tunnel_db_find (&key);
2282
2283       if (ipip)
2284         {
2285           sw_if_index = ipip->sw_if_index;
2286           hash_unset (km->sw_if_indices, ipip->sw_if_index);
2287         }
2288       else
2289         sw_if_index = ~0;
2290     }
2291   else
2292     {
2293       sw_if_index = a->sw_if_index;
2294       vnet_sw_interface_admin_down (vnet_get_main (), sw_if_index);
2295     }
2296
2297   if (~0 != sw_if_index)
2298     ipsec_tun_protect_del (sw_if_index, NULL);
2299
2300   ipsec_sa_unlock_id (a->remote_sa_id);
2301   ipsec_sa_unlock_id (a->local_sa_id);
2302   ipsec_sa_unlock_id (ikev2_flip_alternate_sa_bit (a->remote_sa_id));
2303
2304   if (ipip)
2305     ipip_del_tunnel (ipip->sw_if_index);
2306 }
2307
2308 static int
2309 ikev2_delete_tunnel_interface (vnet_main_t * vnm, ikev2_sa_t * sa,
2310                                ikev2_child_sa_t * child)
2311 {
2312   ikev2_del_ipsec_tunnel_args_t a;
2313
2314   clib_memset (&a, 0, sizeof (a));
2315
2316   if (sa->is_initiator)
2317     {
2318       ip_address_to_46 (&sa->iaddr, &a.local_ip);
2319       ip_address_to_46 (&sa->raddr, &a.remote_ip);
2320     }
2321   else
2322     {
2323       ip_address_to_46 (&sa->raddr, &a.local_ip);
2324       ip_address_to_46 (&sa->iaddr, &a.remote_ip);
2325     }
2326
2327   a.remote_sa_id = child->remote_sa_id;
2328   a.local_sa_id = child->local_sa_id;
2329   a.sw_if_index = (sa->is_tun_itf_set ? sa->tun_itf : ~0);
2330
2331   vl_api_rpc_call_main_thread (ikev2_del_tunnel_from_main, (u8 *) & a,
2332                                sizeof (a));
2333   return 0;
2334 }
2335
2336 static u32
2337 ikev2_generate_message (vlib_buffer_t *b, ikev2_sa_t *sa, ike_header_t *ike,
2338                         void *user, udp_header_t *udp, ikev2_stats_t *stats)
2339 {
2340   ikev2_main_t *km = &ikev2_main;
2341   u16 buffer_data_size = vlib_buffer_get_default_data_size (km->vlib_main);
2342   v8 *integ = 0;
2343   ike_payload_header_t *ph;
2344   u16 plen;
2345   u32 tlen = 0;
2346
2347   ikev2_sa_transform_t *tr_encr, *tr_integ;
2348   tr_encr =
2349     ikev2_sa_get_td_for_type (sa->r_proposals, IKEV2_TRANSFORM_TYPE_ENCR);
2350   tr_integ =
2351     ikev2_sa_get_td_for_type (sa->r_proposals, IKEV2_TRANSFORM_TYPE_INTEG);
2352
2353   ikev2_payload_chain_t *chain = 0;
2354   ikev2_payload_new_chain (chain);
2355
2356   if (ike->exchange == IKEV2_EXCHANGE_SA_INIT)
2357     {
2358       if (sa->r_proposals == 0)
2359         {
2360           ikev2_payload_add_notify (chain,
2361                                     IKEV2_NOTIFY_MSG_NO_PROPOSAL_CHOSEN, 0);
2362           ikev2_set_state (sa, IKEV2_STATE_NOTIFY_AND_DELETE);
2363         }
2364       else if (sa->dh_group == IKEV2_TRANSFORM_DH_TYPE_NONE)
2365         {
2366           u8 *data = vec_new (u8, 2);
2367           ikev2_sa_transform_t *tr_dh;
2368           tr_dh =
2369             ikev2_sa_get_td_for_type (sa->r_proposals,
2370                                       IKEV2_TRANSFORM_TYPE_DH);
2371           ASSERT (tr_dh && tr_dh->dh_type);
2372
2373           data[0] = (tr_dh->dh_type >> 8) & 0xff;
2374           data[1] = (tr_dh->dh_type) & 0xff;
2375
2376           ikev2_payload_add_notify (chain,
2377                                     IKEV2_NOTIFY_MSG_INVALID_KE_PAYLOAD,
2378                                     data);
2379           vec_free (data);
2380           ikev2_set_state (sa, IKEV2_STATE_NOTIFY_AND_DELETE);
2381         }
2382       else if (sa->state == IKEV2_STATE_NOTIFY_AND_DELETE)
2383         {
2384           u8 *data = vec_new (u8, 1);
2385
2386           data[0] = sa->unsupported_cp;
2387           ikev2_payload_add_notify (chain,
2388                                     IKEV2_NOTIFY_MSG_UNSUPPORTED_CRITICAL_PAYLOAD,
2389                                     data);
2390           vec_free (data);
2391         }
2392       else
2393         {
2394           ASSERT (udp);
2395
2396           ike->rspi = clib_host_to_net_u64 (sa->rspi);
2397           ikev2_payload_add_sa (chain, sa->r_proposals);
2398           ikev2_payload_add_ke (chain, sa->dh_group, sa->r_dh_data);
2399           ikev2_payload_add_nonce (chain, sa->r_nonce);
2400
2401           u8 *nat_detection_sha1 =
2402             ikev2_compute_nat_sha1 (clib_host_to_net_u64 (sa->ispi),
2403                                     clib_host_to_net_u64 (sa->rspi),
2404                                     &sa->raddr, udp->dst_port);
2405           ikev2_payload_add_notify (chain,
2406                                     IKEV2_NOTIFY_MSG_NAT_DETECTION_SOURCE_IP,
2407                                     nat_detection_sha1);
2408           vec_free (nat_detection_sha1);
2409           nat_detection_sha1 =
2410             ikev2_compute_nat_sha1 (clib_host_to_net_u64 (sa->ispi),
2411                                     clib_host_to_net_u64 (sa->rspi),
2412                                     &sa->iaddr, udp->src_port);
2413           ikev2_payload_add_notify (chain,
2414                                     IKEV2_NOTIFY_MSG_NAT_DETECTION_DESTINATION_IP,
2415                                     nat_detection_sha1);
2416           vec_free (nat_detection_sha1);
2417         }
2418     }
2419   else if (ike->exchange == IKEV2_EXCHANGE_IKE_AUTH)
2420     {
2421       if (sa->state == IKEV2_STATE_AUTHENTICATED)
2422         {
2423           ikev2_payload_add_id (chain, &sa->r_id, IKEV2_PAYLOAD_IDR);
2424           ikev2_payload_add_auth (chain, &sa->r_auth);
2425           ikev2_payload_add_sa (chain, sa->childs[0].r_proposals);
2426           ikev2_payload_add_ts (chain, sa->childs[0].tsi, IKEV2_PAYLOAD_TSI);
2427           ikev2_payload_add_ts (chain, sa->childs[0].tsr, IKEV2_PAYLOAD_TSR);
2428         }
2429       else if (sa->state == IKEV2_STATE_AUTH_FAILED)
2430         {
2431           ikev2_payload_add_notify (chain,
2432                                     IKEV2_NOTIFY_MSG_AUTHENTICATION_FAILED,
2433                                     0);
2434           ikev2_set_state (sa, IKEV2_STATE_NOTIFY_AND_DELETE);
2435         }
2436       else if (sa->state == IKEV2_STATE_TS_UNACCEPTABLE)
2437         {
2438           ikev2_payload_add_notify (chain, IKEV2_NOTIFY_MSG_TS_UNACCEPTABLE,
2439                                     0);
2440           ikev2_payload_add_id (chain, &sa->r_id, IKEV2_PAYLOAD_IDR);
2441           ikev2_payload_add_auth (chain, &sa->r_auth);
2442         }
2443       else if (sa->state == IKEV2_STATE_NO_PROPOSAL_CHOSEN)
2444         {
2445           ikev2_payload_add_notify (chain,
2446                                     IKEV2_NOTIFY_MSG_NO_PROPOSAL_CHOSEN, 0);
2447           ikev2_payload_add_id (chain, &sa->r_id, IKEV2_PAYLOAD_IDR);
2448           ikev2_payload_add_auth (chain, &sa->r_auth);
2449           ikev2_payload_add_ts (chain, sa->childs[0].tsi, IKEV2_PAYLOAD_TSI);
2450           ikev2_payload_add_ts (chain, sa->childs[0].tsr, IKEV2_PAYLOAD_TSR);
2451         }
2452       else if (sa->state == IKEV2_STATE_NOTIFY_AND_DELETE)
2453         {
2454           u8 *data = vec_new (u8, 1);
2455
2456           data[0] = sa->unsupported_cp;
2457           ikev2_payload_add_notify (chain,
2458                                     IKEV2_NOTIFY_MSG_UNSUPPORTED_CRITICAL_PAYLOAD,
2459                                     data);
2460           vec_free (data);
2461         }
2462       else if (sa->state == IKEV2_STATE_SA_INIT)
2463         {
2464           ikev2_payload_add_id (chain, &sa->i_id, IKEV2_PAYLOAD_IDI);
2465           /* IDr is optional when sending INIT from the initiator */
2466           ASSERT (sa->r_id.type != 0 || sa->is_initiator);
2467           if (sa->r_id.type != 0)
2468             ikev2_payload_add_id (chain, &sa->r_id, IKEV2_PAYLOAD_IDR);
2469           ikev2_payload_add_auth (chain, &sa->i_auth);
2470           ikev2_payload_add_sa (chain, sa->childs[0].i_proposals);
2471           ikev2_payload_add_ts (chain, sa->childs[0].tsi, IKEV2_PAYLOAD_TSI);
2472           ikev2_payload_add_ts (chain, sa->childs[0].tsr, IKEV2_PAYLOAD_TSR);
2473           ikev2_payload_add_notify (chain, IKEV2_NOTIFY_MSG_INITIAL_CONTACT,
2474                                     0);
2475         }
2476       else
2477         {
2478           ikev2_set_state (sa, IKEV2_STATE_DELETED, ": unexpected IKE_AUTH");
2479           goto done;
2480         }
2481     }
2482   else if (ike->exchange == IKEV2_EXCHANGE_INFORMATIONAL)
2483     {
2484       /* if pending delete */
2485       if (sa->del)
2486         {
2487           if (sa->del[0].protocol_id == IKEV2_PROTOCOL_IKE)
2488             {
2489               if (ike_hdr_is_request (ike))
2490                 ikev2_payload_add_delete (chain, sa->del);
2491
2492               /* The response to a request that deletes the IKE SA is an empty
2493                  INFORMATIONAL response. */
2494               ikev2_set_state (sa, IKEV2_STATE_NOTIFY_AND_DELETE);
2495             }
2496           /* The response to a request that deletes ESP or AH SAs will contain
2497              delete payloads for the paired SAs going in the other direction. */
2498           else
2499             {
2500               ikev2_payload_add_delete (chain, sa->del);
2501             }
2502           vec_free (sa->del);
2503           sa->del = 0;
2504         }
2505       /* received N(AUTHENTICATION_FAILED) */
2506       else if (sa->state == IKEV2_STATE_AUTH_FAILED)
2507         {
2508           ikev2_set_state (sa, IKEV2_STATE_DELETED, ": auth failed");
2509           goto done;
2510         }
2511       /* received unsupported critical payload */
2512       else if (sa->unsupported_cp)
2513         {
2514           u8 *data = vec_new (u8, 1);
2515
2516           data[0] = sa->unsupported_cp;
2517           ikev2_payload_add_notify (chain,
2518                                     IKEV2_NOTIFY_MSG_UNSUPPORTED_CRITICAL_PAYLOAD,
2519                                     data);
2520           vec_free (data);
2521           sa->unsupported_cp = 0;
2522         }
2523       else
2524         /* else send empty response */
2525         {
2526           if (ike_hdr_is_response (ike))
2527             {
2528               ASSERT (stats != 0);
2529               stats->n_keepalives++;
2530               sa->stats.n_keepalives++;
2531             }
2532         }
2533     }
2534   else if (ike->exchange == IKEV2_EXCHANGE_CREATE_CHILD_SA)
2535     {
2536       if (sa->is_initiator)
2537         {
2538
2539           ikev2_sa_proposal_t *proposals = (ikev2_sa_proposal_t *) user;
2540           ikev2_notify_t notify;
2541           u8 *data = vec_new (u8, 4);
2542           clib_memset (&notify, 0, sizeof (notify));
2543           notify.protocol_id = IKEV2_PROTOCOL_ESP;
2544           notify.spi = sa->childs[0].i_proposals->spi;
2545           *(u32 *) data = clib_host_to_net_u32 (notify.spi);
2546
2547           ikev2_payload_add_sa (chain, proposals);
2548           ikev2_payload_add_nonce (chain, sa->i_nonce);
2549           ikev2_payload_add_ts (chain, sa->childs[0].tsi, IKEV2_PAYLOAD_TSI);
2550           ikev2_payload_add_ts (chain, sa->childs[0].tsr, IKEV2_PAYLOAD_TSR);
2551           ikev2_payload_add_notify_2 (chain, IKEV2_NOTIFY_MSG_REKEY_SA, data,
2552                                       &notify);
2553
2554           vec_free (data);
2555         }
2556       else if (vec_len (sa->rekey) > 0)
2557         {
2558           ikev2_payload_add_sa (chain, sa->rekey[0].r_proposal);
2559           ikev2_payload_add_nonce (chain, sa->r_nonce);
2560           ikev2_payload_add_ts (chain, sa->rekey[0].tsi, IKEV2_PAYLOAD_TSI);
2561           ikev2_payload_add_ts (chain, sa->rekey[0].tsr, IKEV2_PAYLOAD_TSR);
2562           vec_del1 (sa->rekey, 0);
2563         }
2564       else if (vec_len (sa->new_child) > 0)
2565         {
2566           ikev2_payload_add_sa (chain, sa->new_child[0].r_proposal);
2567           ikev2_payload_add_nonce (chain, sa->r_nonce);
2568           ikev2_payload_add_ts (chain, sa->new_child[0].tsi,
2569                                 IKEV2_PAYLOAD_TSI);
2570           ikev2_payload_add_ts (chain, sa->new_child[0].tsr,
2571                                 IKEV2_PAYLOAD_TSR);
2572           vec_del1 (sa->new_child, 0);
2573         }
2574       else if (sa->unsupported_cp)
2575         {
2576           u8 *data = vec_new (u8, 1);
2577
2578           data[0] = sa->unsupported_cp;
2579           ikev2_payload_add_notify (
2580             chain, IKEV2_NOTIFY_MSG_UNSUPPORTED_CRITICAL_PAYLOAD, data);
2581           vec_free (data);
2582           sa->unsupported_cp = 0;
2583         }
2584       else
2585         {
2586           ikev2_payload_add_notify (chain, IKEV2_NOTIFY_MSG_NO_ADDITIONAL_SAS,
2587                                     0);
2588         }
2589     }
2590
2591   /* IKEv2 header */
2592   ike->version = IKE_VERSION_2;
2593   ike->nextpayload = IKEV2_PAYLOAD_SK;
2594   tlen = sizeof (*ike);
2595
2596   if (sa->is_initiator)
2597     ike->flags |= IKEV2_HDR_FLAG_INITIATOR;
2598
2599   if (ike->exchange == IKEV2_EXCHANGE_SA_INIT)
2600     {
2601       tlen += vec_len (chain->data);
2602       ike->nextpayload = chain->first_payload_type;
2603       ike->length = clib_host_to_net_u32 (tlen);
2604
2605       if (tlen + b->current_length + b->current_data > buffer_data_size)
2606         {
2607           tlen = ~0;
2608           goto done;
2609         }
2610
2611       clib_memcpy_fast (ike->payload, chain->data, vec_len (chain->data));
2612
2613       /* store whole IKE payload - needed for PSK auth */
2614       vec_reset_length (sa->last_sa_init_res_packet_data);
2615       vec_add (sa->last_sa_init_res_packet_data, ike, tlen);
2616     }
2617   else
2618     {
2619       ikev2_main_per_thread_data_t *ptd = ikev2_get_per_thread_data ();
2620       ikev2_payload_chain_add_padding (chain, tr_encr->block_size);
2621
2622       /* SK payload */
2623       plen = sizeof (*ph);
2624       ph = (ike_payload_header_t *) & ike->payload[0];
2625       ph->nextpayload = chain->first_payload_type;
2626       ph->flags = 0;
2627       int is_aead =
2628         tr_encr->encr_type == IKEV2_TRANSFORM_ENCR_TYPE_AES_GCM_16;
2629       int iv_len = is_aead ? IKEV2_GCM_IV_SIZE : tr_encr->block_size;
2630       plen += vec_len (chain->data) + iv_len;
2631
2632       /* add space for hmac/tag */
2633       if (tr_integ)
2634         plen += tr_integ->key_trunc;
2635       else
2636         plen += IKEV2_GCM_ICV_SIZE;
2637       tlen += plen;
2638
2639       if (tlen + b->current_length + b->current_data > buffer_data_size)
2640         {
2641           tlen = ~0;
2642           goto done;
2643         }
2644
2645       /* payload and total length */
2646       ph->length = clib_host_to_net_u16 (plen);
2647       ike->length = clib_host_to_net_u32 (tlen);
2648
2649       if (is_aead)
2650         {
2651           if (!ikev2_encrypt_aead_data (ptd, sa, tr_encr, chain->data,
2652                                         ph->payload, (u8 *) ike,
2653                                         sizeof (*ike) + sizeof (*ph),
2654                                         ph->payload + plen - sizeof (*ph) -
2655                                         IKEV2_GCM_ICV_SIZE))
2656             {
2657               tlen = ~0;
2658               goto done;
2659             }
2660         }
2661       else
2662         {
2663           if (!ikev2_encrypt_data
2664               (ptd, sa, tr_encr, chain->data, ph->payload))
2665             {
2666               tlen = ~0;
2667               goto done;
2668             }
2669           integ =
2670             ikev2_calc_integr (tr_integ,
2671                                sa->is_initiator ? sa->sk_ai : sa->sk_ar,
2672                                (u8 *) ike, tlen - tr_integ->key_trunc);
2673           clib_memcpy_fast (ike->payload + tlen - tr_integ->key_trunc -
2674                             sizeof (*ike), integ, tr_integ->key_trunc);
2675         }
2676
2677       /* store whole IKE payload - needed for retransmit */
2678       vec_reset_length (sa->last_res_packet_data);
2679       vec_add (sa->last_res_packet_data, ike, tlen);
2680     }
2681
2682 done:
2683   ikev2_payload_destroy_chain (chain);
2684   vec_free (integ);
2685   return tlen;
2686 }
2687
2688 static u32
2689 ikev2_retransmit_sa_init_one (ikev2_sa_t * sa, ike_header_t * ike,
2690                               ip_address_t iaddr, ip_address_t raddr,
2691                               u32 rlen)
2692 {
2693   int p = 0;
2694   ike_header_t *tmp;
2695   u8 payload = ike->nextpayload;
2696
2697   if (sa->ispi != clib_net_to_host_u64 (ike->ispi) ||
2698       ip_address_cmp (&sa->iaddr, &iaddr) ||
2699       ip_address_cmp (&sa->raddr, &raddr))
2700     {
2701       return 0;
2702     }
2703
2704   while (p < rlen && payload != IKEV2_PAYLOAD_NONE)
2705     {
2706       ike_payload_header_t *ikep = (ike_payload_header_t *) & ike->payload[p];
2707       u32 plen = clib_net_to_host_u16 (ikep->length);
2708
2709       if (plen < sizeof (ike_payload_header_t))
2710         return ~0;
2711
2712       if (payload == IKEV2_PAYLOAD_NONCE &&
2713           !clib_memcmp (sa->i_nonce, ikep->payload, plen - sizeof (*ikep)))
2714         {
2715           /* req is retransmit */
2716           if (sa->state == IKEV2_STATE_SA_INIT)
2717             {
2718               sa->stats.n_init_retransmit++;
2719               tmp = (ike_header_t *) sa->last_sa_init_res_packet_data;
2720               u32 slen = clib_net_to_host_u32 (tmp->length);
2721               ike->ispi = tmp->ispi;
2722               ike->rspi = tmp->rspi;
2723               ike->nextpayload = tmp->nextpayload;
2724               ike->version = tmp->version;
2725               ike->exchange = tmp->exchange;
2726               ike->flags = tmp->flags;
2727               ike->msgid = tmp->msgid;
2728               ike->length = tmp->length;
2729               clib_memcpy_fast (ike->payload, tmp->payload,
2730                                 slen - sizeof (*ike));
2731               ikev2_elog_uint_peers (IKEV2_LOG_DEBUG,
2732                                      "ispi %lx IKE_SA_INIT retransmit "
2733                                      "from %d.%d.%d.%d to %d.%d.%d.%d",
2734                                      ike->ispi,
2735                                      ip_addr_v4 (&raddr).as_u32,
2736                                      ip_addr_v4 (&iaddr).as_u32);
2737               return slen;
2738             }
2739           /* else ignore req */
2740           else
2741             {
2742               ikev2_elog_uint_peers (IKEV2_LOG_DEBUG,
2743                                      "ispi %lx IKE_SA_INIT ignore "
2744                                      "from %d.%d.%d.%d to %d.%d.%d.%d",
2745                                      ike->ispi,
2746                                      ip_addr_v4 (&raddr).as_u32,
2747                                      ip_addr_v4 (&iaddr).as_u32);
2748               return ~0;
2749             }
2750         }
2751       payload = ikep->nextpayload;
2752       p += plen;
2753     }
2754
2755   return 0;
2756 }
2757
2758 static u32
2759 ikev2_retransmit_sa_init (ike_header_t * ike, ip_address_t iaddr,
2760                           ip_address_t raddr, u32 rlen)
2761 {
2762   ikev2_sa_t *sa;
2763   u32 res;
2764   ikev2_main_per_thread_data_t *ptd = ikev2_get_per_thread_data ();
2765
2766   /* *INDENT-OFF* */
2767   pool_foreach (sa, ptd->sas)  {
2768     res = ikev2_retransmit_sa_init_one (sa, ike, iaddr, raddr, rlen);
2769     if (res)
2770       return res;
2771   }
2772   /* *INDENT-ON* */
2773
2774   /* req is not retransmit */
2775   return 0;
2776 }
2777
2778 static u32
2779 ikev2_retransmit_resp (ikev2_sa_t * sa, ike_header_t * ike)
2780 {
2781   if (ike_hdr_is_response (ike))
2782     return 0;
2783
2784   u32 msg_id = clib_net_to_host_u32 (ike->msgid);
2785
2786   /* new req */
2787   if (msg_id > sa->last_msg_id || sa->last_msg_id == ~0)
2788     {
2789       sa->last_msg_id = msg_id;
2790       return 0;
2791     }
2792
2793   /* retransmitted req */
2794   if (msg_id == sa->last_msg_id)
2795     {
2796       sa->stats.n_retransmit++;
2797       ike_header_t *tmp = (ike_header_t *) sa->last_res_packet_data;
2798       u32 slen = clib_net_to_host_u32 (tmp->length);
2799       ike->ispi = tmp->ispi;
2800       ike->rspi = tmp->rspi;
2801       ike->nextpayload = tmp->nextpayload;
2802       ike->version = tmp->version;
2803       ike->exchange = tmp->exchange;
2804       ike->flags = tmp->flags;
2805       ike->msgid = tmp->msgid;
2806       ike->length = tmp->length;
2807       clib_memcpy_fast (ike->payload, tmp->payload, slen - sizeof (*ike));
2808       ikev2_elog_uint_peers (IKEV2_LOG_DEBUG, "IKE retransmit msgid %d",
2809                              msg_id, ip_addr_v4 (&sa->raddr).as_u32,
2810                              ip_addr_v4 (&sa->iaddr).as_u32);
2811       return slen;
2812     }
2813
2814   /* old req ignore */
2815   ikev2_elog_uint_peers (IKEV2_LOG_DEBUG, "IKE req ignore msgid %d",
2816                          msg_id, ip_addr_v4 (&sa->raddr).as_u32,
2817                          ip_addr_v4 (&sa->iaddr).as_u32);
2818   return ~0;
2819 }
2820
2821 static void
2822 ikev2_init_sa (vlib_main_t * vm, ikev2_sa_t * sa)
2823 {
2824   ikev2_main_t *km = &ikev2_main;
2825   sa->liveness_period_check = vlib_time_now (vm) + km->liveness_period;
2826   sa->profile_index = ~0;
2827 }
2828
2829 static void
2830 ikev2_del_sa_init_from_main (u64 * ispi)
2831 {
2832   ikev2_main_t *km = &ikev2_main;
2833   uword *p = hash_get (km->sa_by_ispi, *ispi);
2834   if (p)
2835     {
2836       ikev2_sa_t *sai = pool_elt_at_index (km->sais, p[0]);
2837       hash_unset (km->sa_by_ispi, sai->ispi);
2838       ikev2_sa_free_all_vec (sai);
2839       pool_put (km->sais, sai);
2840     }
2841 }
2842
2843 static void
2844 ikev2_del_sa_init (u64 ispi)
2845 {
2846   vl_api_rpc_call_main_thread (ikev2_del_sa_init_from_main, (u8 *) & ispi,
2847                                sizeof (ispi));
2848 }
2849
2850 static void
2851 ikev2_rewrite_v6_addrs (ikev2_sa_t *sa, ip6_header_t *ih)
2852 {
2853   if (sa->is_initiator)
2854     {
2855       ip_address_copy_addr (&ih->dst_address, &sa->raddr);
2856       ip_address_copy_addr (&ih->src_address, &sa->iaddr);
2857     }
2858   else
2859     {
2860       ip_address_copy_addr (&ih->dst_address, &sa->iaddr);
2861       ip_address_copy_addr (&ih->src_address, &sa->raddr);
2862     }
2863 }
2864
2865 static void
2866 ikev2_rewrite_v4_addrs (ikev2_sa_t *sa, ip4_header_t *ih)
2867 {
2868   if (sa->is_initiator)
2869     {
2870       ip_address_copy_addr (&ih->dst_address, &sa->raddr);
2871       ip_address_copy_addr (&ih->src_address, &sa->iaddr);
2872     }
2873   else
2874     {
2875       ip_address_copy_addr (&ih->dst_address, &sa->iaddr);
2876       ip_address_copy_addr (&ih->src_address, &sa->raddr);
2877     }
2878 }
2879
2880 static void
2881 ikev2_set_ip_address (ikev2_sa_t *sa, const void *iaddr, const void *raddr,
2882                       const ip_address_family_t af)
2883 {
2884   ip_address_set (&sa->raddr, raddr, af);
2885   ip_address_set (&sa->iaddr, iaddr, af);
2886 }
2887
2888 static void
2889 ikev2_elog_uint_peers_addr (u32 exchange, ip4_header_t * ip4,
2890                             ip6_header_t * ip6, u8 is_ip4)
2891 {
2892   u32 src, dst;
2893   if (is_ip4)
2894     {
2895       src = ip4->src_address.as_u32;
2896       dst = ip4->dst_address.as_u32;
2897     }
2898   else
2899     {
2900       src = ip6->src_address.as_u32[3];
2901       dst = ip6->dst_address.as_u32[3];
2902     }
2903   ikev2_elog_uint_peers (IKEV2_LOG_WARNING, "IKEv2 exchange %d "
2904                          "received from %d.%d.%d.%d to %d.%d.%d.%d",
2905                          exchange, src, dst);
2906 }
2907
2908 static void
2909 ikev2_generate_sa_init_data_and_log (ikev2_sa_t * sa)
2910 {
2911   ikev2_generate_sa_error_t rc = ikev2_generate_sa_init_data (sa);
2912
2913   if (PREDICT_TRUE (rc == IKEV2_GENERATE_SA_INIT_OK))
2914     return;
2915
2916   if (rc == IKEV2_GENERATE_SA_INIT_ERR_NO_DH)
2917     ikev2_elog_error (IKEV2_GENERATE_SA_INIT_OK_ERR_NO_DH_STR);
2918   else if (rc == IKEV2_GENERATE_SA_INIT_ERR_UNSUPPORTED_DH)
2919     ikev2_elog_error (IKEV2_GENERATE_SA_INIT_OK_ERR_UNSUPP_STR);
2920 }
2921
2922 static void
2923 ikev2_update_stats (vlib_main_t *vm, u32 node_index, ikev2_stats_t *s)
2924 {
2925   vlib_node_increment_counter (vm, node_index, IKEV2_ERROR_KEEPALIVE,
2926                                s->n_keepalives);
2927   vlib_node_increment_counter (vm, node_index, IKEV2_ERROR_REKEY_REQ,
2928                                s->n_rekey_req);
2929   vlib_node_increment_counter (vm, node_index, IKEV2_ERROR_INIT_SA_REQ,
2930                                s->n_sa_init_req);
2931   vlib_node_increment_counter (vm, node_index, IKEV2_ERROR_IKE_AUTH_REQ,
2932                                s->n_sa_auth_req);
2933 }
2934
2935 static uword
2936 ikev2_node_internal (vlib_main_t *vm, vlib_node_runtime_t *node,
2937                      vlib_frame_t *frame, u8 is_ip4, u8 natt)
2938 {
2939   u32 n_left = frame->n_vectors, *from;
2940   ikev2_main_t *km = &ikev2_main;
2941   vlib_buffer_t *bufs[VLIB_FRAME_SIZE], **b;
2942   u16 nexts[VLIB_FRAME_SIZE], *next = nexts;
2943   ikev2_main_per_thread_data_t *ptd = ikev2_get_per_thread_data ();
2944   ikev2_stats_t _stats, *stats = &_stats;
2945   int res;
2946
2947   /* no NAT traversal for ip6 */
2948   ASSERT (!natt || is_ip4);
2949
2950   clib_memset_u16 (stats, 0, sizeof (stats[0]) / sizeof (u16));
2951   from = vlib_frame_vector_args (frame);
2952   vlib_get_buffers (vm, from, bufs, n_left);
2953   b = bufs;
2954
2955   while (n_left > 0)
2956     {
2957       vlib_buffer_t *b0 = b[0];
2958       next[0] = is_ip4 ? IKEV2_NEXT_IP4_ERROR_DROP
2959         : IKEV2_NEXT_IP6_ERROR_DROP;
2960       ip4_header_t *ip40 = 0;
2961       ip6_header_t *ip60 = 0;
2962       udp_header_t *udp0;
2963       ike_header_t *ike0;
2964       ikev2_sa_t *sa0 = 0;
2965       ikev2_sa_t sa;            /* temporary store for SA */
2966       u32 rlen, slen = 0;
2967       int ip_hdr_sz = 0;
2968       int is_req = 0;
2969
2970       if (natt)
2971         {
2972           u8 *ptr = vlib_buffer_get_current (b0);
2973           ip40 = (ip4_header_t *) ptr;
2974           ptr += sizeof (*ip40);
2975           udp0 = (udp_header_t *) ptr;
2976           ptr += sizeof (*udp0);
2977           ike0 = (ike_header_t *) ptr;
2978           ip_hdr_sz = sizeof (*ip40);
2979         }
2980       else
2981         {
2982           u8 *ipx_hdr = b0->data + vnet_buffer (b0)->l3_hdr_offset;
2983           ike0 = vlib_buffer_get_current (b0);
2984           vlib_buffer_advance (b0, -sizeof (*udp0));
2985           udp0 = vlib_buffer_get_current (b0);
2986
2987           if (is_ip4)
2988             {
2989               ip40 = (ip4_header_t *) ipx_hdr;
2990               ip_hdr_sz = sizeof (*ip40);
2991             }
2992           else
2993             {
2994               ip60 = (ip6_header_t *) ipx_hdr;
2995               ip_hdr_sz = sizeof (*ip60);
2996             }
2997           vlib_buffer_advance (b0, -ip_hdr_sz);
2998         }
2999
3000       rlen = b0->current_length - ip_hdr_sz - sizeof (*udp0);
3001
3002       /* check for non-esp marker */
3003       if (natt)
3004         {
3005           ASSERT (*((u32 *) ike0) == 0);
3006           ike0 =
3007             (ike_header_t *) ((u8 *) ike0 + sizeof (ikev2_non_esp_marker));
3008           rlen -= sizeof (ikev2_non_esp_marker);
3009         }
3010
3011       if (clib_net_to_host_u32 (ike0->length) != rlen)
3012         {
3013           vlib_node_increment_counter (vm, node->node_index,
3014                                        IKEV2_ERROR_BAD_LENGTH, 1);
3015           goto dispatch0;
3016         }
3017
3018       if (ike0->version != IKE_VERSION_2)
3019         {
3020           vlib_node_increment_counter (vm, node->node_index,
3021                                        IKEV2_ERROR_NOT_IKEV2, 1);
3022           goto dispatch0;
3023         }
3024
3025       if (ike0->exchange == IKEV2_EXCHANGE_SA_INIT)
3026         {
3027           sa0 = &sa;
3028           clib_memset (sa0, 0, sizeof (*sa0));
3029
3030           if (ike_hdr_is_initiator (ike0))
3031             {
3032               sa0->stats.n_sa_init_req++;
3033               stats->n_sa_init_req++;
3034               if (ike0->rspi == 0)
3035                 {
3036                   if (is_ip4)
3037                     ikev2_set_ip_address (sa0, &ip40->src_address,
3038                                           &ip40->dst_address, AF_IP4);
3039                   else
3040                     ikev2_set_ip_address (sa0, &ip60->src_address,
3041                                           &ip60->dst_address, AF_IP6);
3042
3043                   sa0->dst_port = clib_net_to_host_u16 (udp0->src_port);
3044
3045                   slen =
3046                     ikev2_retransmit_sa_init (ike0, sa0->iaddr,
3047                                               sa0->raddr, rlen);
3048                   if (slen)
3049                     {
3050                       vlib_node_increment_counter (vm, node->node_index,
3051                                                    ~0 ==
3052                                                    slen ?
3053                                                    IKEV2_ERROR_IKE_SA_INIT_IGNORE
3054                                                    :
3055                                                    IKEV2_ERROR_IKE_SA_INIT_RETRANSMIT,
3056                                                    1);
3057                       goto dispatch0;
3058                     }
3059
3060                   res = ikev2_process_sa_init_req (
3061                     vm, sa0, ike0, udp0, rlen,
3062                     vnet_buffer (b0)->sw_if_index[VLIB_RX]);
3063                   if (!res)
3064                     vlib_node_increment_counter (vm, node->node_index,
3065                                                  IKEV2_ERROR_MALFORMED_PACKET,
3066                                                  1);
3067
3068                   if (sa0->state == IKEV2_STATE_SA_INIT)
3069                     {
3070                       ikev2_sa_free_proposal_vector (&sa0->r_proposals);
3071                       sa0->r_proposals =
3072                         ikev2_select_proposal (sa0->i_proposals,
3073                                                IKEV2_PROTOCOL_IKE);
3074                       ikev2_generate_sa_init_data_and_log (sa0);
3075                     }
3076
3077                   if (sa0->state == IKEV2_STATE_SA_INIT
3078                       || sa0->state == IKEV2_STATE_NOTIFY_AND_DELETE)
3079                     {
3080                       ike0->flags = IKEV2_HDR_FLAG_RESPONSE;
3081                       slen =
3082                         ikev2_generate_message (b0, sa0, ike0, 0, udp0, stats);
3083                       if (~0 == slen)
3084                         vlib_node_increment_counter (vm, node->node_index,
3085                                                      IKEV2_ERROR_NO_BUFF_SPACE,
3086                                                      1);
3087                     }
3088
3089                   if (sa0->state == IKEV2_STATE_SA_INIT)
3090                     {
3091                       /* add SA to the pool */
3092                       pool_get (ptd->sas, sa0);
3093                       clib_memcpy_fast (sa0, &sa, sizeof (*sa0));
3094                       ikev2_init_sa (vm, sa0);
3095                       hash_set (ptd->sa_by_rspi, sa0->rspi, sa0 - ptd->sas);
3096                     }
3097                   else
3098                     {
3099                       ikev2_sa_free_all_vec (sa0);
3100                     }
3101                 }
3102             }
3103           else                  //received sa_init without initiator flag
3104             {
3105               if (is_ip4)
3106                 ikev2_set_ip_address (sa0, &ip40->dst_address,
3107                                       &ip40->src_address, AF_IP4);
3108               else
3109                 ikev2_set_ip_address (sa0, &ip60->dst_address,
3110                                       &ip60->src_address, AF_IP6);
3111
3112               ikev2_process_sa_init_resp (vm, sa0, ike0, udp0, rlen);
3113
3114               if (sa0->state == IKEV2_STATE_SA_INIT)
3115                 {
3116                   is_req = 1;
3117                   ike0->exchange = IKEV2_EXCHANGE_IKE_AUTH;
3118                   uword *p = hash_get (km->sa_by_ispi, sa0->ispi);
3119                   if (p)
3120                     {
3121                       ikev2_sa_t *sai = pool_elt_at_index (km->sais, p[0]);
3122
3123                       if (clib_atomic_bool_cmp_and_swap
3124                           (&sai->init_response_received, 0, 1))
3125                         {
3126                           ikev2_complete_sa_data (sa0, sai);
3127                           ikev2_calc_keys (sa0);
3128                           ikev2_sa_auth_init (sa0);
3129                           ike0->flags = IKEV2_HDR_FLAG_INITIATOR;
3130                           ike0->msgid =
3131                             clib_net_to_host_u32 (sai->last_init_msg_id);
3132                           sa0->last_init_msg_id = sai->last_init_msg_id + 1;
3133                           slen = ikev2_generate_message (b0, sa0, ike0, 0,
3134                                                          udp0, stats);
3135                           if (~0 == slen)
3136                             vlib_node_increment_counter (vm,
3137                                                          node->node_index,
3138                                                          IKEV2_ERROR_NO_BUFF_SPACE,
3139                                                          1);
3140                         }
3141                       else
3142                         {
3143                           /* we've already processed sa-init response */
3144                           sa0->state = IKEV2_STATE_UNKNOWN;
3145                         }
3146                     }
3147                 }
3148
3149               if (sa0->state == IKEV2_STATE_SA_INIT)
3150                 {
3151                   /* add SA to the pool */
3152                   pool_get (ptd->sas, sa0);
3153                   clib_memcpy_fast (sa0, &sa, sizeof (*sa0));
3154                   hash_set (ptd->sa_by_rspi, sa0->rspi, sa0 - ptd->sas);
3155                 }
3156               else
3157                 {
3158                   ikev2_sa_free_all_vec (sa0);
3159                 }
3160             }
3161         }
3162       else if (ike0->exchange == IKEV2_EXCHANGE_IKE_AUTH)
3163         {
3164           uword *p;
3165           p = hash_get (ptd->sa_by_rspi, clib_net_to_host_u64 (ike0->rspi));
3166           if (p)
3167             {
3168               sa0 = pool_elt_at_index (ptd->sas, p[0]);
3169               slen = ikev2_retransmit_resp (sa0, ike0);
3170               if (slen)
3171                 {
3172                   vlib_node_increment_counter (vm, node->node_index,
3173                                                ~0 ==
3174                                                slen ?
3175                                                IKEV2_ERROR_IKE_REQ_IGNORE
3176                                                :
3177                                                IKEV2_ERROR_IKE_REQ_RETRANSMIT,
3178                                                1);
3179                   goto dispatch0;
3180                 }
3181
3182               sa0->dst_port = clib_net_to_host_u16 (udp0->src_port);
3183               res = ikev2_process_auth_req (vm, sa0, ike0, rlen);
3184               if (res)
3185                 ikev2_sa_auth (sa0);
3186               else
3187                 vlib_node_increment_counter (vm, node->node_index,
3188                                              IKEV2_ERROR_MALFORMED_PACKET, 1);
3189               if (sa0->state == IKEV2_STATE_AUTHENTICATED)
3190                 {
3191                   ikev2_initial_contact_cleanup (ptd, sa0);
3192                   ikev2_sa_match_ts (sa0);
3193                   if (sa0->state != IKEV2_STATE_TS_UNACCEPTABLE)
3194                     ikev2_create_tunnel_interface (vm, sa0,
3195                                                    &sa0->childs[0],
3196                                                    p[0], 0, 0);
3197                 }
3198
3199               if (sa0->is_initiator)
3200                 {
3201                   sa0->last_msg_id = ~0;
3202                   ikev2_del_sa_init (sa0->ispi);
3203                 }
3204               else
3205                 {
3206                   sa0->stats.n_sa_auth_req++;
3207                   stats->n_sa_auth_req++;
3208                   ike0->flags = IKEV2_HDR_FLAG_RESPONSE;
3209                   slen =
3210                     ikev2_generate_message (b0, sa0, ike0, 0, udp0, stats);
3211                   if (~0 == slen)
3212                     vlib_node_increment_counter (vm, node->node_index,
3213                                                  IKEV2_ERROR_NO_BUFF_SPACE,
3214                                                  1);
3215                 }
3216             }
3217         }
3218       else if (ike0->exchange == IKEV2_EXCHANGE_INFORMATIONAL)
3219         {
3220           uword *p;
3221           p = hash_get (ptd->sa_by_rspi, clib_net_to_host_u64 (ike0->rspi));
3222           if (p)
3223             {
3224               sa0 = pool_elt_at_index (ptd->sas, p[0]);
3225               slen = ikev2_retransmit_resp (sa0, ike0);
3226               if (slen)
3227                 {
3228                   vlib_node_increment_counter (vm, node->node_index,
3229                                                ~0 ==
3230                                                slen ?
3231                                                IKEV2_ERROR_IKE_REQ_IGNORE
3232                                                :
3233                                                IKEV2_ERROR_IKE_REQ_RETRANSMIT,
3234                                                1);
3235                   goto dispatch0;
3236                 }
3237
3238               res = ikev2_process_informational_req (vm, sa0, ike0, rlen);
3239               if (!res)
3240                 {
3241                   vlib_node_increment_counter (vm, node->node_index,
3242                                                IKEV2_ERROR_MALFORMED_PACKET,
3243                                                1);
3244                   slen = ~0;
3245                   goto dispatch0;
3246                 }
3247
3248               if (sa0->del)
3249                 {
3250                   if (sa0->del[0].protocol_id != IKEV2_PROTOCOL_IKE)
3251                     {
3252                       ikev2_delete_t *d, *tmp, *resp = 0;
3253                       vec_foreach (d, sa0->del)
3254                       {
3255                         ikev2_child_sa_t *ch_sa;
3256                         ch_sa = ikev2_sa_get_child (sa0, d->spi,
3257                                                     d->protocol_id,
3258                                                     !sa0->is_initiator);
3259                         if (ch_sa)
3260                           {
3261                             ikev2_delete_tunnel_interface (km->vnet_main,
3262                                                            sa0, ch_sa);
3263                             if (!sa0->is_initiator)
3264                               {
3265                                 vec_add2 (resp, tmp, 1);
3266                                 tmp->protocol_id = d->protocol_id;
3267                                 tmp->spi = ch_sa->r_proposals[0].spi;
3268                               }
3269                             ikev2_sa_del_child_sa (sa0, ch_sa);
3270                           }
3271                       }
3272                       if (!sa0->is_initiator)
3273                         {
3274                           vec_free (sa0->del);
3275                           sa0->del = resp;
3276                         }
3277                     }
3278                 }
3279               if (ike_hdr_is_request (ike0))
3280                 {
3281                   ike0->flags = IKEV2_HDR_FLAG_RESPONSE;
3282                   slen =
3283                     ikev2_generate_message (b0, sa0, ike0, 0, udp0, stats);
3284                   if (~0 == slen)
3285                     vlib_node_increment_counter (vm, node->node_index,
3286                                                  IKEV2_ERROR_NO_BUFF_SPACE,
3287                                                  1);
3288                 }
3289             }
3290         }
3291       else if (ike0->exchange == IKEV2_EXCHANGE_CREATE_CHILD_SA)
3292         {
3293           uword *p;
3294           p = hash_get (ptd->sa_by_rspi, clib_net_to_host_u64 (ike0->rspi));
3295           if (p)
3296             {
3297               sa0 = pool_elt_at_index (ptd->sas, p[0]);
3298               slen = ikev2_retransmit_resp (sa0, ike0);
3299               if (slen)
3300                 {
3301                   vlib_node_increment_counter (vm, node->node_index,
3302                                                ~0 ==
3303                                                slen ?
3304                                                IKEV2_ERROR_IKE_REQ_IGNORE
3305                                                :
3306                                                IKEV2_ERROR_IKE_REQ_RETRANSMIT,
3307                                                1);
3308                   goto dispatch0;
3309                 }
3310
3311               res = ikev2_process_create_child_sa_req (vm, sa0, ike0, rlen);
3312               if (!res)
3313                 {
3314                   vlib_node_increment_counter (vm, node->node_index,
3315                                                IKEV2_ERROR_MALFORMED_PACKET,
3316                                                1);
3317                   slen = ~0;
3318                   goto dispatch0;
3319                 }
3320
3321               if (sa0->rekey)
3322                 {
3323                   if (sa0->rekey[0].protocol_id != IKEV2_PROTOCOL_IKE)
3324                     {
3325                       if (sa0->childs)
3326                         ikev2_sa_free_all_child_sa (&sa0->childs);
3327                       ikev2_child_sa_t *child;
3328                       vec_add2 (sa0->childs, child, 1);
3329                       clib_memset (child, 0, sizeof (*child));
3330                       child->r_proposals = sa0->rekey[0].r_proposal;
3331                       child->i_proposals = sa0->rekey[0].i_proposal;
3332                       child->tsi = sa0->rekey[0].tsi;
3333                       child->tsr = sa0->rekey[0].tsr;
3334                       ikev2_create_tunnel_interface (vm, sa0, child, p[0],
3335                                                      child - sa0->childs, 1);
3336                     }
3337                   if (ike_hdr_is_response (ike0))
3338                     {
3339                       vec_free (sa0->rekey);
3340                     }
3341                   else
3342                     {
3343                       stats->n_rekey_req++;
3344                       sa0->stats.n_rekey_req++;
3345                       ike0->flags = IKEV2_HDR_FLAG_RESPONSE;
3346                       slen =
3347                         ikev2_generate_message (b0, sa0, ike0, 0, udp0, stats);
3348                       if (~0 == slen)
3349                         vlib_node_increment_counter (vm, node->node_index,
3350                                                      IKEV2_ERROR_NO_BUFF_SPACE,
3351                                                      1);
3352                     }
3353                 }
3354               else if (sa0->new_child)
3355                 {
3356                   ikev2_child_sa_t *c;
3357                   vec_add2 (sa0->childs, c, 1);
3358                   memset (c, 0, sizeof (*c));
3359                   c->r_proposals = sa0->new_child[0].r_proposal;
3360                   c->i_proposals = sa0->new_child[0].i_proposal;
3361                   c->tsi = sa0->new_child[0].tsi;
3362                   c->tsr = sa0->new_child[0].tsr;
3363                   ikev2_create_tunnel_interface (vm, sa0, c, p[0],
3364                                                  c - sa0->childs, 0);
3365                   if (ike_hdr_is_request (ike0))
3366                     {
3367                       ike0->flags = IKEV2_HDR_FLAG_RESPONSE;
3368                       slen =
3369                         ikev2_generate_message (b0, sa0, ike0, 0, udp0, 0);
3370                       if (~0 == slen)
3371                         vlib_node_increment_counter (
3372                           vm, node->node_index, IKEV2_ERROR_NO_BUFF_SPACE, 1);
3373                     }
3374                 }
3375             }
3376         }
3377       else
3378         {
3379           ikev2_elog_uint_peers_addr (ike0->exchange, ip40, ip60, is_ip4);
3380         }
3381
3382     dispatch0:
3383       /* if we are sending packet back, rewrite headers */
3384       if (slen && ~0 != slen)
3385         {
3386           if (is_ip4)
3387             {
3388               next[0] = IKEV2_NEXT_IP4_LOOKUP;
3389               ikev2_rewrite_v4_addrs (sa0, ip40);
3390             }
3391           else
3392             {
3393               next[0] = IKEV2_NEXT_IP6_LOOKUP;
3394               ikev2_rewrite_v6_addrs (sa0, ip60);
3395             }
3396
3397           if (is_req)
3398             {
3399               udp0->dst_port = udp0->src_port =
3400                 clib_net_to_host_u16 (ikev2_get_port (sa0));
3401
3402               if (udp0->dst_port == clib_net_to_host_u16 (IKEV2_PORT_NATT)
3403                   && ikev2_natt_active (sa0))
3404                 {
3405                   if (!natt)
3406                     slen = ikev2_insert_non_esp_marker (ike0, slen);
3407                 }
3408             }
3409           else
3410             {
3411               if (natt)
3412                 slen += sizeof (ikev2_non_esp_marker);
3413
3414               u16 tp = udp0->dst_port;
3415               udp0->dst_port = udp0->src_port;
3416               udp0->src_port = tp;
3417             }
3418
3419           udp0->length = clib_host_to_net_u16 (slen + sizeof (udp_header_t));
3420           udp0->checksum = 0;
3421           b0->current_length = slen + ip_hdr_sz + sizeof (udp_header_t);
3422           if (is_ip4)
3423             {
3424               ip40->length = clib_host_to_net_u16 (b0->current_length);
3425               ip40->checksum = ip4_header_checksum (ip40);
3426             }
3427           else
3428             {
3429               ip60->payload_length =
3430                 clib_host_to_net_u16 (b0->current_length - sizeof (*ip60));
3431             }
3432         }
3433       /* delete sa */
3434       if (sa0 && (sa0->state == IKEV2_STATE_DELETED ||
3435                   sa0->state == IKEV2_STATE_NOTIFY_AND_DELETE))
3436         {
3437           ikev2_child_sa_t *c;
3438
3439           vec_foreach (c, sa0->childs)
3440             ikev2_delete_tunnel_interface (km->vnet_main, sa0, c);
3441
3442           ikev2_delete_sa (ptd, sa0);
3443         }
3444       if (PREDICT_FALSE ((node->flags & VLIB_NODE_FLAG_TRACE)
3445                          && (b0->flags & VLIB_BUFFER_IS_TRACED)))
3446         {
3447
3448           ikev2_trace_t *t = vlib_add_trace (vm, node, b0, sizeof (*t));
3449           t->sw_if_index = vnet_buffer (b0)->sw_if_index[VLIB_RX];
3450           t->next_index = next[0];
3451         }
3452       n_left -= 1;
3453       next += 1;
3454       b += 1;
3455     }
3456
3457   ikev2_update_stats (vm, node->node_index, stats);
3458   vlib_node_increment_counter (vm, node->node_index,
3459                                IKEV2_ERROR_PROCESSED, frame->n_vectors);
3460   vlib_buffer_enqueue_to_next (vm, node, from, nexts, frame->n_vectors);
3461   return frame->n_vectors;
3462 }
3463
3464 static uword
3465 ikev2_ip4 (vlib_main_t * vm, vlib_node_runtime_t * node, vlib_frame_t * frame)
3466 {
3467   return ikev2_node_internal (vm, node, frame, 1 /* is_ip4 */, 0);
3468 }
3469
3470 static uword
3471 ikev2_ip4_natt (vlib_main_t *vm, vlib_node_runtime_t *node,
3472                 vlib_frame_t *frame)
3473 {
3474   return ikev2_node_internal (vm, node, frame, 1 /* is_ip4 */, 1 /* natt */);
3475 }
3476
3477 static uword
3478 ikev2_ip6 (vlib_main_t * vm, vlib_node_runtime_t * node, vlib_frame_t * frame)
3479 {
3480   return ikev2_node_internal (vm, node, frame, 0 /* is_ip4 */, 0);
3481 }
3482
3483 /* *INDENT-OFF* */
3484 VLIB_REGISTER_NODE (ikev2_node_ip4,static) = {
3485   .function = ikev2_ip4,
3486   .name = "ikev2-ip4",
3487   .vector_size = sizeof (u32),
3488   .format_trace = format_ikev2_trace,
3489   .type = VLIB_NODE_TYPE_INTERNAL,
3490
3491   .n_errors = IKEV2_N_ERROR,
3492   .error_counters = ikev2_error_counters,
3493
3494   .n_next_nodes = IKEV2_IP4_N_NEXT,
3495   .next_nodes = {
3496     [IKEV2_NEXT_IP4_LOOKUP] = "ip4-lookup",
3497     [IKEV2_NEXT_IP4_ERROR_DROP] = "error-drop",
3498   },
3499 };
3500
3501 VLIB_REGISTER_NODE (ikev2_node_ip4_natt,static) = {
3502   .function = ikev2_ip4_natt,
3503   .name = "ikev2-ip4-natt",
3504   .vector_size = sizeof (u32),
3505   .format_trace = format_ikev2_trace,
3506   .type = VLIB_NODE_TYPE_INTERNAL,
3507
3508   .n_errors = IKEV2_N_ERROR,
3509   .error_counters = ikev2_error_counters,
3510
3511   .n_next_nodes = IKEV2_IP4_N_NEXT,
3512   .next_nodes = {
3513     [IKEV2_NEXT_IP4_LOOKUP] = "ip4-lookup",
3514     [IKEV2_NEXT_IP4_ERROR_DROP] = "error-drop",
3515   },
3516 };
3517
3518 VLIB_REGISTER_NODE (ikev2_node_ip6,static) = {
3519   .function = ikev2_ip6,
3520   .name = "ikev2-ip6",
3521   .vector_size = sizeof (u32),
3522   .format_trace = format_ikev2_trace,
3523   .type = VLIB_NODE_TYPE_INTERNAL,
3524
3525   .n_errors = IKEV2_N_ERROR,
3526   .error_counters = ikev2_error_counters,
3527
3528   .n_next_nodes = IKEV2_IP6_N_NEXT,
3529   .next_nodes = {
3530     [IKEV2_NEXT_IP6_LOOKUP] = "ip6-lookup",
3531     [IKEV2_NEXT_IP6_ERROR_DROP] = "error-drop",
3532   },
3533 };
3534 /* *INDENT-ON* */
3535
3536 // set ikev2 proposals when vpp is used as initiator
3537 static clib_error_t *
3538 ikev2_set_initiator_proposals (vlib_main_t * vm, ikev2_sa_t * sa,
3539                                ikev2_transforms_set * ts,
3540                                ikev2_sa_proposal_t ** proposals, int is_ike)
3541 {
3542   clib_error_t *r;
3543   ikev2_main_t *km = &ikev2_main;
3544   ikev2_sa_proposal_t *proposal;
3545   vec_add2 (*proposals, proposal, 1);
3546   ikev2_sa_transform_t *td;
3547   int error;
3548
3549   /* Encryption */
3550   error = 1;
3551   vec_foreach (td, km->supported_transforms)
3552   {
3553     if (td->type == IKEV2_TRANSFORM_TYPE_ENCR
3554         && td->encr_type == ts->crypto_alg
3555         && td->key_len == ts->crypto_key_size / 8)
3556       {
3557         u16 attr[2];
3558         attr[0] = clib_host_to_net_u16 (14 | (1 << 15));
3559         attr[1] = clib_host_to_net_u16 (td->key_len << 3);
3560         vec_add (td->attrs, (u8 *) attr, 4);
3561         vec_add1 (proposal->transforms, *td);
3562         td->attrs = 0;
3563
3564         error = 0;
3565         break;
3566       }
3567   }
3568   if (error)
3569     {
3570       r = clib_error_return (0, "Unsupported algorithm");
3571       return r;
3572     }
3573
3574   if (IKEV2_TRANSFORM_INTEG_TYPE_NONE != ts->integ_alg)
3575     {
3576       /* Integrity */
3577       error = 1;
3578       vec_foreach (td, km->supported_transforms)
3579       {
3580         if (td->type == IKEV2_TRANSFORM_TYPE_INTEG
3581             && td->integ_type == ts->integ_alg)
3582           {
3583             vec_add1 (proposal->transforms, *td);
3584             error = 0;
3585             break;
3586           }
3587       }
3588       if (error)
3589         {
3590           ikev2_elog_error
3591             ("Didn't find any supported algorithm for IKEV2_TRANSFORM_TYPE_INTEG");
3592           r = clib_error_return (0, "Unsupported algorithm");
3593           return r;
3594         }
3595     }
3596
3597   /* PRF */
3598   if (is_ike)
3599     {
3600       error = 1;
3601       vec_foreach (td, km->supported_transforms)
3602       {
3603         if (td->type == IKEV2_TRANSFORM_TYPE_PRF
3604             && td->prf_type == IKEV2_TRANSFORM_PRF_TYPE_PRF_HMAC_SHA2_256)
3605           {
3606             vec_add1 (proposal->transforms, *td);
3607             error = 0;
3608             break;
3609           }
3610       }
3611       if (error)
3612         {
3613           r = clib_error_return (0, "Unsupported algorithm");
3614           return r;
3615         }
3616     }
3617
3618   /* DH */
3619   if (is_ike)
3620     {
3621       error = 1;
3622       vec_foreach (td, km->supported_transforms)
3623       {
3624         if (td->type == IKEV2_TRANSFORM_TYPE_DH && td->dh_type == ts->dh_type)
3625           {
3626             vec_add1 (proposal->transforms, *td);
3627             if (is_ike)
3628               {
3629                 sa->dh_group = td->dh_type;
3630               }
3631             error = 0;
3632             break;
3633           }
3634       }
3635       if (error)
3636         {
3637           r = clib_error_return (0, "Unsupported algorithm");
3638           return r;
3639         }
3640     }
3641
3642   if (!is_ike)
3643     {
3644       error = 1;
3645       vec_foreach (td, km->supported_transforms)
3646       {
3647         if (td->type == IKEV2_TRANSFORM_TYPE_ESN)
3648           {
3649             vec_add1 (proposal->transforms, *td);
3650             error = 0;
3651           }
3652       }
3653       if (error)
3654         {
3655           r = clib_error_return (0, "Unsupported algorithm");
3656           return r;
3657         }
3658     }
3659
3660
3661   return 0;
3662 }
3663
3664 static ikev2_profile_t *
3665 ikev2_profile_index_by_name (u8 * name)
3666 {
3667   ikev2_main_t *km = &ikev2_main;
3668   uword *p;
3669
3670   p = mhash_get (&km->profile_index_by_name, name);
3671   if (!p)
3672     return 0;
3673
3674   return pool_elt_at_index (km->profiles, p[0]);
3675 }
3676
3677
3678 static void
3679 ikev2_send_ike (vlib_main_t * vm, ip_address_t * src, ip_address_t * dst,
3680                 u32 bi0, u32 len, u16 src_port, u16 dst_port, u32 sw_if_index)
3681 {
3682   ip4_header_t *ip40;
3683   ip6_header_t *ip60;
3684   udp_header_t *udp0;
3685   vlib_buffer_t *b0;
3686   vlib_frame_t *f;
3687   u32 *to_next;
3688
3689   b0 = vlib_get_buffer (vm, bi0);
3690   vlib_buffer_advance (b0, -sizeof (udp_header_t));
3691   udp0 = vlib_buffer_get_current (b0);
3692   udp0->dst_port = clib_host_to_net_u16 (dst_port);
3693   udp0->src_port = clib_host_to_net_u16 (src_port);
3694   udp0->length = clib_host_to_net_u16 (len + sizeof (udp_header_t));
3695   udp0->checksum = 0;
3696
3697   if (ip_addr_version (dst) == AF_IP4)
3698     {
3699       vlib_buffer_advance (b0, -sizeof (ip4_header_t));
3700       ip40 = vlib_buffer_get_current (b0);
3701       ip40->ip_version_and_header_length = 0x45;
3702       ip40->tos = 0;
3703       ip40->fragment_id = 0;
3704       ip40->flags_and_fragment_offset = 0;
3705       ip40->ttl = 0xff;
3706       ip40->protocol = IP_PROTOCOL_UDP;
3707       ip40->dst_address.as_u32 = ip_addr_v4 (dst).as_u32;
3708       ip40->src_address.as_u32 = ip_addr_v4 (src).as_u32;
3709       b0->current_length =
3710         len + sizeof (ip4_header_t) + sizeof (udp_header_t);
3711       ip40->length = clib_host_to_net_u16 (b0->current_length);
3712       ip40->checksum = ip4_header_checksum (ip40);
3713     }
3714   else
3715     {
3716       vlib_buffer_advance (b0, -sizeof (ip6_header_t));
3717       ip60 = vlib_buffer_get_current (b0);
3718
3719       b0->current_length = len + sizeof (*ip60) + sizeof (udp_header_t);
3720       ip60->ip_version_traffic_class_and_flow_label =
3721         clib_host_to_net_u32 (0x6 << 28);
3722       ip60->payload_length =
3723         clib_host_to_net_u16 (b0->current_length - sizeof (*ip60));
3724       ip60->protocol = IP_PROTOCOL_UDP;
3725       ip60->hop_limit = 0xff;
3726       clib_memcpy_fast (ip60->src_address.as_u8, ip_addr_v6 (src).as_u8,
3727                         sizeof (ip60->src_address));
3728       clib_memcpy_fast (ip60->dst_address.as_u8, ip_addr_v6 (dst).as_u8,
3729                         sizeof (ip60->src_address));
3730     }
3731
3732   b0->flags |= VNET_BUFFER_F_LOCALLY_ORIGINATED;
3733   vnet_buffer (b0)->sw_if_index[VLIB_RX] = sw_if_index;
3734   vnet_buffer (b0)->sw_if_index[VLIB_TX] = ~0;
3735
3736   u32 next_index = (ip_addr_version (dst) == AF_IP4) ?
3737     ip4_lookup_node.index : ip6_lookup_node.index;
3738
3739   /* send the request */
3740   f = vlib_get_frame_to_node (vm, next_index);
3741   to_next = vlib_frame_vector_args (f);
3742   to_next[0] = bi0;
3743   f->n_vectors = 1;
3744   vlib_put_frame_to_node (vm, next_index, f);
3745
3746 }
3747
3748 static u32
3749 ikev2_get_new_ike_header_buff (vlib_main_t * vm, vlib_buffer_t ** b)
3750 {
3751   u32 bi0;
3752   if (vlib_buffer_alloc (vm, &bi0, 1) != 1)
3753     {
3754       *b = 0;
3755       return 0;
3756     }
3757   *b = vlib_get_buffer (vm, bi0);
3758   return bi0;
3759 }
3760
3761 clib_error_t *
3762 ikev2_set_local_key (vlib_main_t * vm, u8 * file)
3763 {
3764   ikev2_main_t *km = &ikev2_main;
3765
3766   if (km->pkey)
3767     EVP_PKEY_free (km->pkey);
3768   km->pkey = ikev2_load_key_file (file);
3769   if (km->pkey == NULL)
3770     return clib_error_return (0, "load key '%s' failed", file);
3771
3772   return 0;
3773 }
3774
3775 static vnet_api_error_t
3776 ikev2_register_udp_port (ikev2_profile_t *p, u16 port)
3777 {
3778   ipsec_register_udp_port (port);
3779   p->ipsec_over_udp_port = port;
3780   return 0;
3781 }
3782
3783 static void
3784 ikev2_unregister_udp_port (ikev2_profile_t *p)
3785 {
3786   if (p->ipsec_over_udp_port == IPSEC_UDP_PORT_NONE)
3787     return;
3788
3789   ipsec_unregister_udp_port (p->ipsec_over_udp_port);
3790   p->ipsec_over_udp_port = IPSEC_UDP_PORT_NONE;
3791 }
3792
3793 static void
3794 ikev2_initiate_delete_ike_sa_internal (vlib_main_t * vm,
3795                                        ikev2_main_per_thread_data_t * tkm,
3796                                        ikev2_sa_t * sa, u8 send_notification)
3797 {
3798   ikev2_main_t *km = &ikev2_main;
3799   ip_address_t *src, *dst;
3800   vlib_buffer_t *b0;
3801   ikev2_child_sa_t *c;
3802
3803   /* Create the Initiator notification for IKE SA removal */
3804   ike_header_t *ike0;
3805   u32 bi0 = 0;
3806   int len;
3807
3808   vec_resize (sa->del, 1);
3809   sa->del->protocol_id = IKEV2_PROTOCOL_IKE;
3810   sa->del->spi = sa->ispi;
3811
3812   if (send_notification)
3813     {
3814       bi0 = ikev2_get_new_ike_header_buff (vm, &b0);
3815       if (!bi0)
3816         {
3817           ikev2_log_error ("buffer alloc failure");
3818           goto delete_sa;
3819         }
3820
3821       ike0 = vlib_buffer_get_current (b0);
3822       ike0->exchange = IKEV2_EXCHANGE_INFORMATIONAL;
3823       ike0->ispi = clib_host_to_net_u64 (sa->ispi);
3824       ike0->rspi = clib_host_to_net_u64 (sa->rspi);
3825       ike0->flags = 0;
3826       ike0->msgid = clib_host_to_net_u32 (sa->last_init_msg_id);
3827       sa->last_init_msg_id += 1;
3828       len = ikev2_generate_message (b0, sa, ike0, 0, 0, 0);
3829       if (~0 == len)
3830         return;
3831
3832       if (ikev2_natt_active (sa))
3833         len = ikev2_insert_non_esp_marker (ike0, len);
3834
3835       if (sa->is_initiator)
3836         {
3837           src = &sa->iaddr;
3838           dst = &sa->raddr;
3839         }
3840       else
3841         {
3842           dst = &sa->iaddr;
3843           src = &sa->raddr;
3844         }
3845
3846       ikev2_send_ike (vm, src, dst, bi0, len,
3847                       ikev2_get_port (sa), sa->dst_port, 0);
3848     }
3849
3850 delete_sa:
3851   /* delete local SA */
3852   vec_foreach (c, sa->childs)
3853     ikev2_delete_tunnel_interface (km->vnet_main, sa, c);
3854
3855   u64 rspi = sa->rspi;
3856   ikev2_sa_free_all_vec (sa);
3857   uword *p = hash_get (tkm->sa_by_rspi, rspi);
3858   if (p)
3859     {
3860       hash_unset (tkm->sa_by_rspi, rspi);
3861       pool_put (tkm->sas, sa);
3862     }
3863 }
3864
3865 static void
3866 ikev2_cleanup_profile_sessions (ikev2_main_t * km, ikev2_profile_t * p)
3867 {
3868   ikev2_main_per_thread_data_t *tkm;
3869   ikev2_sa_t *sa;
3870   u32 pi = p - km->profiles;
3871   u32 *sai;
3872   u32 *del_sai = 0;
3873
3874   /* *INDENT-OFF* */
3875   pool_foreach (sa, km->sais)  {
3876     if (pi == sa->profile_index)
3877       vec_add1 (del_sai, sa - km->sais);
3878   }
3879   /* *INDENT-ON* */
3880
3881   vec_foreach (sai, del_sai)
3882   {
3883     sa = pool_elt_at_index (km->sais, sai[0]);
3884     ikev2_sa_free_all_vec (sa);
3885     hash_unset (km->sa_by_ispi, sa->ispi);
3886     pool_put (km->sais, sa);
3887   }
3888   vec_reset_length (del_sai);
3889
3890   vec_foreach (tkm, km->per_thread_data)
3891   {
3892     /* *INDENT-OFF* */
3893     pool_foreach (sa, tkm->sas)  {
3894       if (sa->profile_index != ~0 && pi == sa->profile_index)
3895         vec_add1 (del_sai, sa - tkm->sas);
3896     }
3897     /* *INDENT-ON* */
3898
3899     vec_foreach (sai, del_sai)
3900     {
3901       sa = pool_elt_at_index (tkm->sas, sai[0]);
3902       ikev2_initiate_delete_ike_sa_internal (km->vlib_main, tkm, sa, 1);
3903     }
3904
3905     vec_reset_length (del_sai);
3906   }
3907
3908   vec_free (del_sai);
3909 }
3910
3911 static void
3912 ikev2_profile_responder_free (ikev2_responder_t *r)
3913 {
3914   vec_free (r->hostname);
3915 }
3916
3917 static void
3918 ikev2_profile_free (ikev2_profile_t * p)
3919 {
3920   vec_free (p->name);
3921
3922   vec_free (p->auth.data);
3923   if (p->auth.key)
3924     EVP_PKEY_free (p->auth.key);
3925
3926   ikev2_profile_responder_free (&p->responder);
3927
3928   vec_free (p->loc_id.data);
3929   vec_free (p->rem_id.data);
3930 }
3931
3932 static void
3933 ikev2_bind (vlib_main_t *vm, ikev2_main_t *km)
3934 {
3935   if (0 == km->bind_refcount)
3936     {
3937       udp_register_dst_port (vm, IKEV2_PORT, ikev2_node_ip4.index, 1);
3938       udp_register_dst_port (vm, IKEV2_PORT, ikev2_node_ip6.index, 0);
3939       udp_register_dst_port (vm, IKEV2_PORT_NATT, ikev2_node_ip4.index, 1);
3940       udp_register_dst_port (vm, IKEV2_PORT_NATT, ikev2_node_ip6.index, 0);
3941
3942       vlib_punt_register (km->punt_hdl,
3943                           ipsec_punt_reason[IPSEC_PUNT_IP4_SPI_UDP_0],
3944                           "ikev2-ip4-natt");
3945     }
3946
3947   km->bind_refcount++;
3948 }
3949
3950 static void
3951 ikev2_unbind (vlib_main_t *vm, ikev2_main_t *km)
3952 {
3953   km->bind_refcount--;
3954   if (0 == km->bind_refcount)
3955     {
3956       vlib_punt_unregister (km->punt_hdl,
3957                             ipsec_punt_reason[IPSEC_PUNT_IP4_SPI_UDP_0],
3958                             "ikev2-ip4-natt");
3959
3960       udp_unregister_dst_port (vm, IKEV2_PORT_NATT, 0);
3961       udp_unregister_dst_port (vm, IKEV2_PORT_NATT, 1);
3962       udp_unregister_dst_port (vm, IKEV2_PORT, 0);
3963       udp_unregister_dst_port (vm, IKEV2_PORT, 1);
3964     }
3965 }
3966
3967 static void ikev2_lazy_init (ikev2_main_t *km);
3968
3969 clib_error_t *
3970 ikev2_add_del_profile (vlib_main_t * vm, u8 * name, int is_add)
3971 {
3972   ikev2_main_t *km = &ikev2_main;
3973   ikev2_profile_t *p;
3974
3975   ikev2_lazy_init (km);
3976
3977   if (is_add)
3978     {
3979       if (ikev2_profile_index_by_name (name))
3980         return clib_error_return (0, "policy %v already exists", name);
3981
3982       pool_get (km->profiles, p);
3983       clib_memset (p, 0, sizeof (*p));
3984       p->name = vec_dup (name);
3985       p->ipsec_over_udp_port = IPSEC_UDP_PORT_NONE;
3986       p->responder.sw_if_index = ~0;
3987       p->tun_itf = ~0;
3988       uword index = p - km->profiles;
3989       mhash_set_mem (&km->profile_index_by_name, name, &index, 0);
3990
3991       ikev2_bind (vm, km);
3992     }
3993   else
3994     {
3995       p = ikev2_profile_index_by_name (name);
3996       if (!p)
3997         return clib_error_return (0, "policy %v does not exists", name);
3998
3999       ikev2_unbind (vm, km);
4000
4001       ikev2_unregister_udp_port (p);
4002       ikev2_cleanup_profile_sessions (km, p);
4003
4004       ikev2_profile_free (p);
4005       pool_put (km->profiles, p);
4006       mhash_unset (&km->profile_index_by_name, name, 0);
4007     }
4008   return 0;
4009 }
4010
4011 clib_error_t *
4012 ikev2_set_profile_auth (vlib_main_t * vm, u8 * name, u8 auth_method,
4013                         u8 * auth_data, u8 data_hex_format)
4014 {
4015   ikev2_profile_t *p;
4016   clib_error_t *r;
4017
4018   p = ikev2_profile_index_by_name (name);
4019
4020   if (!p)
4021     {
4022       r = clib_error_return (0, "unknown profile %v", name);
4023       return r;
4024     }
4025
4026   if (p->auth.key)
4027     EVP_PKEY_free (p->auth.key);
4028   vec_free (p->auth.data);
4029
4030   p->auth.method = auth_method;
4031   p->auth.data = vec_dup (auth_data);
4032   p->auth.hex = data_hex_format;
4033
4034   if (auth_method == IKEV2_AUTH_METHOD_RSA_SIG)
4035     {
4036       vec_add1 (p->auth.data, 0);
4037       p->auth.key = ikev2_load_cert_file (p->auth.data);
4038       if (p->auth.key == NULL)
4039         return clib_error_return (0, "load cert '%s' failed", p->auth.data);
4040     }
4041
4042   return 0;
4043 }
4044
4045 static int
4046 ikev2_is_id_supported (u8 id_type)
4047 {
4048   return (id_type == IKEV2_ID_TYPE_ID_IPV4_ADDR ||
4049           id_type == IKEV2_ID_TYPE_ID_IPV6_ADDR ||
4050           id_type == IKEV2_ID_TYPE_ID_RFC822_ADDR ||
4051           id_type == IKEV2_ID_TYPE_ID_FQDN);
4052 }
4053
4054 clib_error_t *
4055 ikev2_set_profile_id (vlib_main_t * vm, u8 * name, u8 id_type, u8 * data,
4056                       int is_local)
4057 {
4058   ikev2_profile_t *p;
4059   clib_error_t *r;
4060
4061   if (!ikev2_is_id_supported (id_type))
4062     {
4063       r = clib_error_return (0, "unsupported identity type %U",
4064                              format_ikev2_id_type, id_type);
4065       return r;
4066     }
4067
4068   p = ikev2_profile_index_by_name (name);
4069
4070   if (!p)
4071     {
4072       r = clib_error_return (0, "unknown profile %v", name);
4073       return r;
4074     }
4075
4076   if (is_local)
4077     {
4078       vec_free (p->loc_id.data);
4079       p->loc_id.type = id_type;
4080       p->loc_id.data = vec_dup (data);
4081     }
4082   else
4083     {
4084       vec_free (p->rem_id.data);
4085       p->rem_id.type = id_type;
4086       p->rem_id.data = vec_dup (data);
4087     }
4088
4089   return 0;
4090 }
4091
4092 static void
4093 ikev2_set_ts_type (ikev2_ts_t *ts, const ip_address_t *addr)
4094 {
4095   if (ip_addr_version (addr) == AF_IP4)
4096     ts->ts_type = TS_IPV4_ADDR_RANGE;
4097   else
4098     ts->ts_type = TS_IPV6_ADDR_RANGE;
4099 }
4100
4101 static void
4102 ikev2_set_ts_addrs (ikev2_ts_t *ts, const ip_address_t *start,
4103                     const ip_address_t *end)
4104 {
4105   ip_address_copy (&ts->start_addr, start);
4106   ip_address_copy (&ts->end_addr, end);
4107 }
4108
4109 clib_error_t *
4110 ikev2_set_profile_ts (vlib_main_t * vm, u8 * name, u8 protocol_id,
4111                       u16 start_port, u16 end_port, ip_address_t start_addr,
4112                       ip_address_t end_addr, int is_local)
4113 {
4114   ikev2_profile_t *p;
4115   clib_error_t *r;
4116
4117   p = ikev2_profile_index_by_name (name);
4118
4119   if (!p)
4120     {
4121       r = clib_error_return (0, "unknown profile %v", name);
4122       return r;
4123     }
4124
4125   if (ip_addr_version (&start_addr) != ip_addr_version (&end_addr))
4126     return clib_error_return (0, "IP address version mismatch!");
4127
4128   if (is_local)
4129     {
4130       ikev2_set_ts_addrs (&p->loc_ts, &start_addr, &end_addr);
4131       p->loc_ts.start_port = start_port;
4132       p->loc_ts.end_port = end_port;
4133       p->loc_ts.protocol_id = protocol_id;
4134       ikev2_set_ts_type (&p->loc_ts, &start_addr);
4135     }
4136   else
4137     {
4138       ikev2_set_ts_addrs (&p->rem_ts, &start_addr, &end_addr);
4139       p->rem_ts.start_port = start_port;
4140       p->rem_ts.end_port = end_port;
4141       p->rem_ts.protocol_id = protocol_id;
4142       ikev2_set_ts_type (&p->rem_ts, &start_addr);
4143     }
4144
4145   return 0;
4146 }
4147
4148 clib_error_t *
4149 ikev2_set_profile_responder_hostname (vlib_main_t *vm, u8 *name, u8 *hostname,
4150                                       u32 sw_if_index)
4151 {
4152   ikev2_profile_t *p;
4153   clib_error_t *r;
4154
4155   p = ikev2_profile_index_by_name (name);
4156
4157   if (!p)
4158     {
4159       r = clib_error_return (0, "unknown profile %v", name);
4160       return r;
4161     }
4162
4163   p->responder.is_resolved = 0;
4164   p->responder.sw_if_index = sw_if_index;
4165   p->responder.hostname = vec_dup (hostname);
4166
4167   return 0;
4168 }
4169
4170 clib_error_t *
4171 ikev2_set_profile_responder (vlib_main_t * vm, u8 * name,
4172                              u32 sw_if_index, ip_address_t addr)
4173 {
4174   ikev2_profile_t *p;
4175   clib_error_t *r;
4176
4177   p = ikev2_profile_index_by_name (name);
4178
4179   if (!p)
4180     {
4181       r = clib_error_return (0, "unknown profile %v", name);
4182       return r;
4183     }
4184
4185   p->responder.is_resolved = 1;
4186   p->responder.sw_if_index = sw_if_index;
4187   ip_address_copy (&p->responder.addr, &addr);
4188
4189   return 0;
4190 }
4191
4192 clib_error_t *
4193 ikev2_set_profile_ike_transforms (vlib_main_t * vm, u8 * name,
4194                                   ikev2_transform_encr_type_t crypto_alg,
4195                                   ikev2_transform_integ_type_t integ_alg,
4196                                   ikev2_transform_dh_type_t dh_type,
4197                                   u32 crypto_key_size)
4198 {
4199   ikev2_profile_t *p;
4200
4201   p = ikev2_profile_index_by_name (name);
4202   if (!p)
4203     return clib_error_return (0, "unknown profile %v", name);
4204
4205   if ((IKEV2_TRANSFORM_INTEG_TYPE_NONE != integ_alg) +
4206         (IKEV2_TRANSFORM_ENCR_TYPE_AES_GCM_16 == crypto_alg) !=
4207       1)
4208     return clib_error_return (0, "invalid cipher + integrity algorithm");
4209
4210   p->ike_ts.crypto_alg = crypto_alg;
4211   p->ike_ts.integ_alg = integ_alg;
4212   p->ike_ts.dh_type = dh_type;
4213   p->ike_ts.crypto_key_size = crypto_key_size;
4214   return 0;
4215 }
4216
4217 clib_error_t *
4218 ikev2_set_profile_esp_transforms (vlib_main_t * vm, u8 * name,
4219                                   ikev2_transform_encr_type_t crypto_alg,
4220                                   ikev2_transform_integ_type_t integ_alg,
4221                                   u32 crypto_key_size)
4222 {
4223   ikev2_profile_t *p;
4224   clib_error_t *r;
4225
4226   p = ikev2_profile_index_by_name (name);
4227
4228   if (!p)
4229     {
4230       r = clib_error_return (0, "unknown profile %v", name);
4231       return r;
4232     }
4233
4234   p->esp_ts.crypto_alg = crypto_alg;
4235   p->esp_ts.integ_alg = integ_alg;
4236   p->esp_ts.crypto_key_size = crypto_key_size;
4237   return 0;
4238 }
4239
4240 clib_error_t *
4241 ikev2_set_profile_tunnel_interface (vlib_main_t * vm,
4242                                     u8 * name, u32 sw_if_index)
4243 {
4244   ikev2_profile_t *p;
4245   clib_error_t *r;
4246
4247   p = ikev2_profile_index_by_name (name);
4248
4249   if (!p)
4250     {
4251       r = clib_error_return (0, "unknown profile %v", name);
4252       return r;
4253     }
4254
4255   p->tun_itf = sw_if_index;
4256
4257   return 0;
4258 }
4259
4260 vnet_api_error_t
4261 ikev2_set_profile_ipsec_udp_port (vlib_main_t * vm, u8 * name, u16 port,
4262                                   u8 is_set)
4263 {
4264   ikev2_profile_t *p = ikev2_profile_index_by_name (name);
4265   vnet_api_error_t rv = 0;
4266
4267   if (!p)
4268     return VNET_API_ERROR_INVALID_VALUE;
4269
4270   if (is_set)
4271     {
4272       if (p->ipsec_over_udp_port != IPSEC_UDP_PORT_NONE)
4273         return VNET_API_ERROR_VALUE_EXIST;
4274
4275       rv = ikev2_register_udp_port (p, port);
4276     }
4277   else
4278     {
4279       if (p->ipsec_over_udp_port == IPSEC_UDP_PORT_NONE)
4280         return VNET_API_ERROR_INVALID_VALUE;
4281
4282       ikev2_unregister_udp_port (p);
4283     }
4284   return rv;
4285 }
4286
4287 clib_error_t *
4288 ikev2_set_profile_udp_encap (vlib_main_t * vm, u8 * name)
4289 {
4290   ikev2_profile_t *p = ikev2_profile_index_by_name (name);
4291   clib_error_t *r;
4292
4293   if (!p)
4294     {
4295       r = clib_error_return (0, "unknown profile %v", name);
4296       return r;
4297     }
4298
4299   p->udp_encap = 1;
4300   return 0;
4301 }
4302
4303 clib_error_t *
4304 ikev2_set_profile_sa_lifetime (vlib_main_t * vm, u8 * name,
4305                                u64 lifetime, u32 jitter, u32 handover,
4306                                u64 maxdata)
4307 {
4308   ikev2_profile_t *p;
4309   clib_error_t *r;
4310
4311   p = ikev2_profile_index_by_name (name);
4312
4313   if (!p)
4314     {
4315       r = clib_error_return (0, "unknown profile %v", name);
4316       return r;
4317     }
4318
4319   p->lifetime = lifetime;
4320   p->lifetime_jitter = jitter;
4321   p->handover = handover;
4322   p->lifetime_maxdata = maxdata;
4323   return 0;
4324 }
4325
4326 static int
4327 ikev2_get_if_address (u32 sw_if_index, ip_address_family_t af,
4328                       ip_address_t * out_addr)
4329 {
4330   ip4_address_t *if_ip4;
4331   ip6_address_t *if_ip6;
4332
4333   if (af == AF_IP4)
4334     {
4335       if_ip4 = ip4_interface_first_address (&ip4_main, sw_if_index, 0);
4336       if (if_ip4)
4337         {
4338           ip_address_set (out_addr, if_ip4, AF_IP4);
4339           return 1;
4340         }
4341     }
4342   else
4343     {
4344       if_ip6 = ip6_interface_first_address (&ip6_main, sw_if_index);
4345       if (if_ip6)
4346         {
4347           ip_address_set (out_addr, if_ip6, AF_IP6);
4348           return 1;
4349         }
4350     }
4351   return 0;
4352 }
4353
4354 static clib_error_t *
4355 ikev2_resolve_responder_hostname (vlib_main_t *vm, ikev2_responder_t *r)
4356 {
4357   ikev2_main_t *km = &ikev2_main;
4358   dns_cache_entry_t *ep = 0;
4359   dns_pending_request_t _t0, *t0 = &_t0;
4360   dns_resolve_name_t _rn, *rn = &_rn;
4361   u8 *name;
4362   int rv;
4363
4364   if (!km->dns_resolve_name)
4365     return clib_error_return (0, "cannot load symbols from dns plugin");
4366
4367   t0->request_type = DNS_API_PENDING_NAME_TO_IP;
4368   /* VPP main curse: IKEv2 uses only non-NULL terminated vectors internally
4369    * whereas DNS resolver expects a NULL-terminated C-string */
4370   name = vec_dup (r->hostname);
4371   vec_terminate_c_string (name);
4372   rv = km->dns_resolve_name (name, &ep, t0, rn);
4373   vec_free (name);
4374   if (rv < 0)
4375     return clib_error_return (0, "dns lookup failure");
4376
4377   if (ep == 0)
4378     return 0;
4379
4380   ip_address_copy (&r->addr, &rn->address);
4381   r->is_resolved = 1;
4382   return 0;
4383 }
4384
4385 clib_error_t *
4386 ikev2_initiate_sa_init (vlib_main_t * vm, u8 * name)
4387 {
4388   ikev2_profile_t *p;
4389   clib_error_t *r;
4390   ikev2_main_t *km = &ikev2_main;
4391   vlib_buffer_t *b0;
4392   ike_header_t *ike0;
4393   u32 bi0 = 0;
4394   int len = sizeof (ike_header_t), valid_ip = 0;
4395   ip_address_t src_if_ip = ip_address_initializer;
4396
4397   p = ikev2_profile_index_by_name (name);
4398
4399   if (!p)
4400     {
4401       r = clib_error_return (0, "unknown profile %v", name);
4402       return r;
4403     }
4404
4405   if (p->responder.sw_if_index == ~0 ||
4406       (ip_address_is_zero (&p->responder.addr) &&
4407        vec_len (p->responder.hostname) == 0))
4408     {
4409       r = clib_error_return (0, "responder not set for profile %v", name);
4410       return r;
4411     }
4412
4413   if (!p->responder.is_resolved)
4414     {
4415       /* try to resolve using dns plugin
4416        * success does not mean we have resolved the name */
4417       r = ikev2_resolve_responder_hostname (vm, &p->responder);
4418       if (r)
4419         return r;
4420     }
4421
4422   if (p->responder.is_resolved &&
4423       ikev2_get_if_address (p->responder.sw_if_index,
4424                             ip_addr_version (&p->responder.addr), &src_if_ip))
4425     {
4426       valid_ip = 1;
4427     }
4428
4429   /* Prepare the SA and the IKE payload */
4430   ikev2_sa_t sa;
4431   clib_memset (&sa, 0, sizeof (ikev2_sa_t));
4432   ikev2_payload_chain_t *chain = 0;
4433   ikev2_payload_new_chain (chain);
4434
4435   /* Build the IKE proposal payload */
4436   ikev2_sa_proposal_t *proposals = 0;
4437   ikev2_set_initiator_proposals (vm, &sa, &p->ike_ts, &proposals, 1);
4438   proposals[0].proposal_num = 1;
4439   proposals[0].protocol_id = IKEV2_PROTOCOL_IKE;
4440
4441   /* Add and then cleanup proposal data */
4442   ikev2_payload_add_sa (chain, proposals);
4443   ikev2_sa_free_proposal_vector (&proposals);
4444
4445   sa.is_initiator = 1;
4446   sa.profile_index = p - km->profiles;
4447   sa.state = IKEV2_STATE_SA_INIT;
4448   sa.tun_itf = p->tun_itf;
4449   sa.udp_encap = p->udp_encap;
4450   if (p->natt_disabled)
4451     sa.natt_state = IKEV2_NATT_DISABLED;
4452   sa.ipsec_over_udp_port = p->ipsec_over_udp_port;
4453   sa.is_tun_itf_set = 1;
4454   sa.initial_contact = 1;
4455   sa.dst_port = IKEV2_PORT;
4456
4457   ikev2_generate_sa_error_t rc = ikev2_generate_sa_init_data (&sa);
4458   if (rc != IKEV2_GENERATE_SA_INIT_OK)
4459     {
4460       ikev2_sa_free_all_vec (&sa);
4461       ikev2_payload_destroy_chain (chain);
4462       return clib_error_return (0, "%U", format_ikev2_gen_sa_error, rc);
4463     }
4464
4465   ikev2_payload_add_ke (chain, sa.dh_group, sa.i_dh_data);
4466   ikev2_payload_add_nonce (chain, sa.i_nonce);
4467
4468   /* Build the child SA proposal */
4469   vec_resize (sa.childs, 1);
4470   ikev2_set_initiator_proposals (vm, &sa, &p->esp_ts,
4471                                  &sa.childs[0].i_proposals, 0);
4472   sa.childs[0].i_proposals[0].proposal_num = 1;
4473   sa.childs[0].i_proposals[0].protocol_id = IKEV2_PROTOCOL_ESP;
4474   RAND_bytes ((u8 *) & sa.childs[0].i_proposals[0].spi,
4475               sizeof (sa.childs[0].i_proposals[0].spi));
4476
4477   /* Add NAT detection notification messages (mandatory) */
4478   u8 *nat_detection_sha1 = ikev2_compute_nat_sha1 (
4479     clib_host_to_net_u64 (sa.ispi), clib_host_to_net_u64 (sa.rspi), &src_if_ip,
4480     clib_host_to_net_u16 (IKEV2_PORT));
4481
4482   ikev2_payload_add_notify (chain, IKEV2_NOTIFY_MSG_NAT_DETECTION_SOURCE_IP,
4483                             nat_detection_sha1);
4484   vec_free (nat_detection_sha1);
4485   nat_detection_sha1 =
4486     ikev2_compute_nat_sha1 (clib_host_to_net_u64 (sa.ispi),
4487                             clib_host_to_net_u64 (sa.rspi),
4488                             &p->responder.addr,
4489                             clib_host_to_net_u16 (sa.dst_port));
4490   ikev2_payload_add_notify (chain,
4491                             IKEV2_NOTIFY_MSG_NAT_DETECTION_DESTINATION_IP,
4492                             nat_detection_sha1);
4493   vec_free (nat_detection_sha1);
4494
4495   u8 *sig_hash_algo = vec_new (u8, 8);
4496   u64 tmpsig = clib_host_to_net_u64 (0x0001000200030004);
4497   clib_memcpy_fast (sig_hash_algo, &tmpsig, sizeof (tmpsig));
4498   ikev2_payload_add_notify (chain,
4499                             IKEV2_NOTIFY_MSG_SIGNATURE_HASH_ALGORITHMS,
4500                             sig_hash_algo);
4501   vec_free (sig_hash_algo);
4502
4503   bi0 = ikev2_get_new_ike_header_buff (vm, &b0);
4504   if (!bi0)
4505     {
4506       ikev2_sa_free_all_vec (&sa);
4507       ikev2_payload_destroy_chain (chain);
4508       char *errmsg = "buffer alloc failure";
4509       ikev2_log_error (errmsg);
4510       return clib_error_return (0, errmsg);
4511     }
4512   ike0 = vlib_buffer_get_current (b0);
4513
4514   /* Buffer update and boilerplate */
4515   len += vec_len (chain->data);
4516   ike0->nextpayload = chain->first_payload_type;
4517   ike0->length = clib_host_to_net_u32 (len);
4518   clib_memcpy_fast (ike0->payload, chain->data, vec_len (chain->data));
4519   ikev2_payload_destroy_chain (chain);
4520
4521   ike0->version = IKE_VERSION_2;
4522   ike0->flags = IKEV2_HDR_FLAG_INITIATOR;
4523   ike0->exchange = IKEV2_EXCHANGE_SA_INIT;
4524   ike0->ispi = clib_host_to_net_u64 (sa.ispi);
4525   ike0->rspi = 0;
4526   ike0->msgid = 0;
4527   sa.last_init_msg_id += 1;
4528
4529   /* store whole IKE payload - needed for PSK auth */
4530   vec_reset_length (sa.last_sa_init_req_packet_data);
4531   vec_add (sa.last_sa_init_req_packet_data, ike0, len);
4532
4533   /* add data to the SA then add it to the pool */
4534   ip_address_copy (&sa.iaddr, &src_if_ip);
4535   ip_address_copy (&sa.raddr, &p->responder.addr);
4536   sa.i_id.type = p->loc_id.type;
4537   sa.i_id.data = vec_dup (p->loc_id.data);
4538   sa.r_id.type = p->rem_id.type;
4539   sa.r_id.data = vec_dup (p->rem_id.data);
4540   sa.i_auth.method = p->auth.method;
4541   sa.i_auth.hex = p->auth.hex;
4542   sa.i_auth.data = vec_dup (p->auth.data);
4543   sa.sw_if_index = p->responder.sw_if_index;
4544   vec_add (sa.childs[0].tsi, &p->loc_ts, 1);
4545   vec_add (sa.childs[0].tsr, &p->rem_ts, 1);
4546
4547   ikev2_initial_contact_cleanup (0, &sa);
4548
4549   /* add SA to the pool */
4550   ikev2_sa_t *sa0 = 0;
4551   pool_get (km->sais, sa0);
4552   clib_memcpy_fast (sa0, &sa, sizeof (*sa0));
4553   hash_set (km->sa_by_ispi, sa0->ispi, sa0 - km->sais);
4554
4555   if (valid_ip)
4556     {
4557       ikev2_send_ike (vm, &src_if_ip, &p->responder.addr, bi0, len, IKEV2_PORT,
4558                       sa.dst_port, sa.sw_if_index);
4559
4560       ikev2_elog_exchange
4561         ("ispi %lx rspi %lx IKEV2_EXCHANGE_SA_INIT sent to ",
4562          clib_host_to_net_u64 (sa0->ispi), 0,
4563          ip_addr_v4 (&p->responder.addr).as_u32,
4564          ip_addr_version (&p->responder.addr) == AF_IP4);
4565     }
4566
4567   return 0;
4568 }
4569
4570 static void
4571 ikev2_delete_child_sa_internal (vlib_main_t * vm, ikev2_sa_t * sa,
4572                                 ikev2_child_sa_t * csa)
4573 {
4574   /* Create the Initiator notification for child SA removal */
4575   ikev2_main_t *km = &ikev2_main;
4576   ike_header_t *ike0;
4577   u32 bi0 = 0;
4578   vlib_buffer_t *b0;
4579   int len;
4580
4581   bi0 = ikev2_get_new_ike_header_buff (vm, &b0);
4582   if (!bi0)
4583     {
4584       ikev2_log_error ("buffer alloc failure");
4585       return;
4586     }
4587
4588   ike0 = vlib_buffer_get_current (b0);
4589   ike0->exchange = IKEV2_EXCHANGE_INFORMATIONAL;
4590   ike0->ispi = clib_host_to_net_u64 (sa->ispi);
4591   ike0->rspi = clib_host_to_net_u64 (sa->rspi);
4592   ike0->flags = 0;
4593   vec_resize (sa->del, 1);
4594   sa->del->protocol_id = IKEV2_PROTOCOL_ESP;
4595   sa->del->spi = csa->i_proposals->spi;
4596   ike0->msgid = clib_host_to_net_u32 (sa->last_init_msg_id);
4597   sa->last_init_msg_id += 1;
4598   len = ikev2_generate_message (b0, sa, ike0, 0, 0, 0);
4599   if (~0 == len)
4600     return;
4601
4602   if (ikev2_natt_active (sa))
4603     len = ikev2_insert_non_esp_marker (ike0, len);
4604   ikev2_send_ike (vm, &sa->iaddr, &sa->raddr, bi0, len,
4605                   ikev2_get_port (sa), sa->dst_port, sa->sw_if_index);
4606
4607   /* delete local child SA */
4608   ikev2_delete_tunnel_interface (km->vnet_main, sa, csa);
4609   ikev2_sa_del_child_sa (sa, csa);
4610 }
4611
4612 clib_error_t *
4613 ikev2_initiate_delete_child_sa (vlib_main_t * vm, u32 ispi)
4614 {
4615   clib_error_t *r;
4616   ikev2_main_t *km = &ikev2_main;
4617   ikev2_main_per_thread_data_t *tkm;
4618   ikev2_sa_t *fsa = 0;
4619   ikev2_child_sa_t *fchild = 0;
4620
4621   /* Search for the child SA */
4622   vec_foreach (tkm, km->per_thread_data)
4623   {
4624     ikev2_sa_t *sa;
4625     if (fchild)
4626       break;
4627     /* *INDENT-OFF* */
4628     pool_foreach (sa, tkm->sas)  {
4629       fchild = ikev2_sa_get_child(sa, ispi, IKEV2_PROTOCOL_ESP, 1);
4630       if (fchild)
4631         {
4632           fsa = sa;
4633           break;
4634         }
4635     }
4636     /* *INDENT-ON* */
4637   }
4638
4639   if (!fchild || !fsa)
4640     {
4641       r = clib_error_return (0, "Child SA not found");
4642       return r;
4643     }
4644   else
4645     {
4646       ikev2_delete_child_sa_internal (vm, fsa, fchild);
4647     }
4648
4649   return 0;
4650 }
4651
4652 clib_error_t *
4653 ikev2_initiate_delete_ike_sa (vlib_main_t * vm, u64 ispi)
4654 {
4655   clib_error_t *r;
4656   ikev2_main_t *km = &ikev2_main;
4657   ikev2_main_per_thread_data_t *tkm;
4658   ikev2_sa_t *fsa = 0;
4659   ikev2_main_per_thread_data_t *ftkm = 0;
4660
4661   /* Search for the IKE SA */
4662   vec_foreach (tkm, km->per_thread_data)
4663   {
4664     ikev2_sa_t *sa;
4665     if (fsa)
4666       break;
4667     /* *INDENT-OFF* */
4668     pool_foreach (sa, tkm->sas)  {
4669       if (sa->ispi == ispi)
4670         {
4671           fsa = sa;
4672           ftkm = tkm;
4673           break;
4674         }
4675     }
4676     /* *INDENT-ON* */
4677   }
4678
4679   if (!fsa)
4680     {
4681       r = clib_error_return (0, "IKE SA not found");
4682       return r;
4683     }
4684
4685   ikev2_initiate_delete_ike_sa_internal (vm, ftkm, fsa, 1);
4686   return 0;
4687 }
4688
4689 static void
4690 ikev2_rekey_child_sa_internal (vlib_main_t * vm, ikev2_sa_t * sa,
4691                                ikev2_child_sa_t * csa)
4692 {
4693   /* Create the Initiator request for create child SA */
4694   ike_header_t *ike0;
4695   vlib_buffer_t *b0;
4696   u32 bi0 = 0;
4697   int len;
4698
4699   bi0 = ikev2_get_new_ike_header_buff (vm, &b0);
4700   if (!bi0)
4701     {
4702       ikev2_log_error ("buffer alloc failure");
4703       return;
4704     }
4705
4706   ike0 = vlib_buffer_get_current (b0);
4707   ike0->version = IKE_VERSION_2;
4708   ike0->flags = IKEV2_HDR_FLAG_INITIATOR;
4709   ike0->exchange = IKEV2_EXCHANGE_CREATE_CHILD_SA;
4710   ike0->ispi = clib_host_to_net_u64 (sa->ispi);
4711   ike0->rspi = clib_host_to_net_u64 (sa->rspi);
4712   ike0->msgid = clib_host_to_net_u32 (sa->last_init_msg_id);
4713   sa->last_init_msg_id += 1;
4714
4715   ikev2_rekey_t *rekey;
4716   vec_reset_length (sa->rekey);
4717   vec_add2 (sa->rekey, rekey, 1);
4718   ikev2_sa_proposal_t *proposals = vec_dup (csa->i_proposals);
4719
4720   /*need new ispi */
4721   RAND_bytes ((u8 *) & proposals[0].spi, sizeof (proposals[0].spi));
4722   rekey->spi = proposals[0].spi;
4723   rekey->ispi = csa->i_proposals->spi;
4724   len = ikev2_generate_message (b0, sa, ike0, proposals, 0, 0);
4725   if (~0 == len)
4726     return;
4727
4728   if (ikev2_natt_active (sa))
4729     len = ikev2_insert_non_esp_marker (ike0, len);
4730   ikev2_send_ike (vm, &sa->iaddr, &sa->raddr, bi0, len,
4731                   ikev2_get_port (sa), ikev2_get_port (sa), sa->sw_if_index);
4732   vec_free (proposals);
4733 }
4734
4735 clib_error_t *
4736 ikev2_initiate_rekey_child_sa (vlib_main_t * vm, u32 ispi)
4737 {
4738   clib_error_t *r;
4739   ikev2_main_t *km = &ikev2_main;
4740   ikev2_main_per_thread_data_t *tkm;
4741   ikev2_sa_t *fsa = 0;
4742   ikev2_child_sa_t *fchild = 0;
4743
4744   /* Search for the child SA */
4745   vec_foreach (tkm, km->per_thread_data)
4746   {
4747     ikev2_sa_t *sa;
4748     if (fchild)
4749       break;
4750     /* *INDENT-OFF* */
4751     pool_foreach (sa, tkm->sas)  {
4752       fchild = ikev2_sa_get_child(sa, ispi, IKEV2_PROTOCOL_ESP, 1);
4753       if (fchild)
4754         {
4755           fsa = sa;
4756           break;
4757         }
4758     }
4759     /* *INDENT-ON* */
4760   }
4761
4762   if (!fchild || !fsa)
4763     {
4764       r = clib_error_return (0, "Child SA not found");
4765       return r;
4766     }
4767   else
4768     {
4769       ikev2_rekey_child_sa_internal (vm, fsa, fchild);
4770     }
4771
4772   return 0;
4773 }
4774
4775 static int
4776 ikev2_sa_sw_if_match (ikev2_sa_t * sa, u32 sw_if_index)
4777 {
4778   return (sa->sw_if_index == sw_if_index) && sa->is_initiator;
4779 }
4780
4781 static void
4782 ikev2_sa_del (ikev2_profile_t * p, u32 sw_if_index)
4783 {
4784   u64 *ispi, *ispi_vec = 0;
4785   ikev2_sa_t *sa, **sap, **sa_vec = 0;
4786   ikev2_main_t *km = &ikev2_main;
4787   ikev2_main_per_thread_data_t *tkm;
4788   p->responder.sw_if_index = ~0;
4789
4790   vec_foreach (tkm, km->per_thread_data)
4791   {
4792     /* *INDENT-OFF* */
4793     pool_foreach (sa, tkm->sas)  {
4794       if (ikev2_sa_sw_if_match (sa, sw_if_index))
4795         vec_add1 (sa_vec, sa);
4796     }
4797     /* *INDENT-ON* */
4798
4799     vec_foreach (sap, sa_vec)
4800     {
4801       ikev2_initiate_delete_ike_sa_internal (km->vlib_main, tkm, *sap, 0);
4802     }
4803     vec_reset_length (sa_vec);
4804   }
4805   vec_free (sa_vec);
4806
4807   /* *INDENT-OFF* */
4808   pool_foreach (sa, km->sais)  {
4809     if (ikev2_sa_sw_if_match (sa, sw_if_index))
4810       vec_add1 (ispi_vec, sa->ispi);
4811   }
4812   /* *INDENT-ON* */
4813
4814   vec_foreach (ispi, ispi_vec)
4815   {
4816     ikev2_del_sa_init_from_main (ispi);
4817   }
4818
4819   vec_free (ispi_vec);
4820 }
4821
4822 static clib_error_t *
4823 ikev2_sw_interface_add_del (vnet_main_t * vnm, u32 sw_if_index, u32 is_add)
4824 {
4825   ikev2_main_t *km = &ikev2_main;
4826   ikev2_profile_t *p;
4827
4828   if (is_add)
4829     return 0;
4830
4831   /* *INDENT-OFF* */
4832   pool_foreach (p, km->profiles)  {
4833     if (p->responder.sw_if_index == sw_if_index)
4834       ikev2_sa_del (p, sw_if_index);
4835   }
4836   /* *INDENT-ON* */
4837
4838   return 0;
4839 }
4840
4841 VNET_SW_INTERFACE_ADD_DEL_FUNCTION (ikev2_sw_interface_add_del);
4842
4843 clib_error_t *
4844 ikev2_init (vlib_main_t * vm)
4845 {
4846   ikev2_main_t *km = &ikev2_main;
4847
4848   clib_memset (km, 0, sizeof (ikev2_main_t));
4849
4850   km->log_level = IKEV2_LOG_ERROR;
4851   km->log_class = vlib_log_register_class ("ikev2", 0);
4852
4853   km->vnet_main = vnet_get_main ();
4854   km->vlib_main = vm;
4855
4856   km->liveness_period = IKEV2_LIVENESS_PERIOD_CHECK;
4857   km->liveness_max_retries = IKEV2_LIVENESS_RETRIES;
4858
4859   return 0;
4860 }
4861
4862 /* *INDENT-OFF* */
4863 VLIB_INIT_FUNCTION (ikev2_init) = {
4864   .runs_after = VLIB_INITS ("ipsec_init", "ipsec_punt_init"),
4865 };
4866 /* *INDENT-ON* */
4867
4868 static u8
4869 ikev2_mngr_process_child_sa (ikev2_sa_t * sa, ikev2_child_sa_t * csa,
4870                              u8 del_old_ids)
4871 {
4872   ikev2_main_t *km = &ikev2_main;
4873   ikev2_profile_t *p = 0;
4874   vlib_main_t *vm = km->vlib_main;
4875   f64 now = vlib_time_now (vm);
4876   u8 res = 0;
4877
4878   if (sa->profile_index != ~0)
4879     p = pool_elt_at_index (km->profiles, sa->profile_index);
4880
4881   if (sa->is_initiator && p && csa->time_to_expiration
4882       && now > csa->time_to_expiration)
4883     {
4884       if (!csa->is_expired || csa->rekey_retries > 0)
4885         {
4886           ikev2_rekey_child_sa_internal (vm, sa, csa);
4887           csa->time_to_expiration = now + p->handover;
4888           csa->is_expired = 1;
4889           if (csa->rekey_retries == 0)
4890             {
4891               csa->rekey_retries = 5;
4892             }
4893           else if (csa->rekey_retries > 0)
4894             {
4895               csa->rekey_retries--;
4896               ikev2_log_debug ("Rekeying Child SA 0x%x, retries left %d",
4897                                csa->i_proposals->spi, csa->rekey_retries);
4898               if (csa->rekey_retries == 0)
4899                 {
4900                   csa->rekey_retries = -1;
4901                 }
4902             }
4903           res |= 1;
4904         }
4905       else
4906         {
4907           csa->time_to_expiration = 0;
4908           ikev2_delete_child_sa_internal (vm, sa, csa);
4909           res |= 1;
4910           return res;
4911         }
4912     }
4913
4914   if (del_old_ids)
4915     {
4916       ipip_tunnel_t *ipip = NULL;
4917       u32 sw_if_index = sa->is_tun_itf_set ? sa->tun_itf : ~0;
4918       if (~0 == sw_if_index)
4919         {
4920           ip46_address_t local_ip;
4921           ip46_address_t remote_ip;
4922           if (sa->is_initiator)
4923             {
4924               local_ip = to_ip46 (ip_addr_version (&sa->iaddr),
4925                                   ip_addr_bytes (&sa->iaddr));
4926               remote_ip = to_ip46 (ip_addr_version (&sa->raddr),
4927                                    ip_addr_bytes (&sa->raddr));
4928             }
4929           else
4930             {
4931               local_ip = to_ip46 (ip_addr_version (&sa->raddr),
4932                                   ip_addr_bytes (&sa->raddr));
4933               remote_ip = to_ip46 (ip_addr_version (&sa->iaddr),
4934                                    ip_addr_bytes (&sa->iaddr));
4935             }
4936
4937        /* *INDENT-OFF* */
4938        ipip_tunnel_key_t key = {
4939          .src = local_ip,
4940          .dst = remote_ip,
4941          .transport = IPIP_TRANSPORT_IP4,
4942          .fib_index = 0,
4943        };
4944        /* *INDENT-ON* */
4945
4946           ipip = ipip_tunnel_db_find (&key);
4947
4948           if (ipip)
4949             sw_if_index = ipip->sw_if_index;
4950           else
4951             return res;
4952         }
4953
4954       u32 *sas_in = NULL;
4955       vec_add1 (sas_in, csa->remote_sa_id);
4956       vlib_worker_thread_barrier_sync (vm);
4957       int rv = ipsec_tun_protect_update (sw_if_index, NULL,
4958                                          csa->local_sa_id, sas_in);
4959       if (rv)
4960         vec_free (sas_in);
4961       ipsec_sa_unlock_id (ikev2_flip_alternate_sa_bit (csa->remote_sa_id));
4962       vlib_worker_thread_barrier_release (vm);
4963     }
4964
4965   return res;
4966 }
4967
4968 int
4969 ikev2_set_log_level (ikev2_log_level_t log_level)
4970 {
4971   ikev2_main_t *km = &ikev2_main;
4972
4973   if (log_level >= IKEV2_LOG_MAX)
4974     {
4975       ikev2_log_error ("unknown logging level %d", log_level);
4976       return -1;
4977     }
4978
4979   km->log_level = log_level;
4980   return 0;
4981 }
4982
4983 clib_error_t *
4984 ikev2_set_liveness_params (u32 period, u32 max_retries)
4985 {
4986   ikev2_main_t *km = &ikev2_main;
4987
4988   if (period == 0 || max_retries == 0)
4989     return clib_error_return (0, "invalid args");
4990
4991   km->liveness_period = period;
4992   km->liveness_max_retries = max_retries;
4993   return 0;
4994 }
4995
4996 clib_error_t *
4997 ikev2_profile_natt_disable (u8 * name)
4998 {
4999   ikev2_profile_t *p = ikev2_profile_index_by_name (name);
5000   if (!p)
5001     return clib_error_return (0, "unknown profile %v", name);
5002
5003   p->natt_disabled = 1;
5004   return 0;
5005 }
5006
5007 static void
5008 ikev2_mngr_process_ipsec_sa (ipsec_sa_t * ipsec_sa)
5009 {
5010   ikev2_main_t *km = &ikev2_main;
5011   vlib_main_t *vm = km->vlib_main;
5012   ikev2_main_per_thread_data_t *tkm;
5013   ikev2_sa_t *fsa = 0;
5014   ikev2_profile_t *p = 0;
5015   ikev2_child_sa_t *fchild = 0;
5016   f64 now = vlib_time_now (vm);
5017   vlib_counter_t counts;
5018
5019   /* Search for the SA and child SA */
5020   vec_foreach (tkm, km->per_thread_data)
5021   {
5022     ikev2_sa_t *sa;
5023     if (fchild)
5024       break;
5025     /* *INDENT-OFF* */
5026     pool_foreach (sa, tkm->sas)  {
5027       fchild = ikev2_sa_get_child(sa, ipsec_sa->spi, IKEV2_PROTOCOL_ESP, 1);
5028       if (fchild)
5029         {
5030           fsa = sa;
5031           break;
5032         }
5033     }
5034     /* *INDENT-ON* */
5035   }
5036   vlib_get_combined_counter (&ipsec_sa_counters,
5037                              ipsec_sa->stat_index, &counts);
5038
5039   if (fsa && fsa->profile_index != ~0 && fsa->is_initiator)
5040     p = pool_elt_at_index (km->profiles, fsa->profile_index);
5041
5042   if (fchild && p && p->lifetime_maxdata)
5043     {
5044       if (!fchild->is_expired && counts.bytes > p->lifetime_maxdata)
5045         {
5046           fchild->time_to_expiration = now;
5047         }
5048     }
5049 }
5050
5051 static void
5052 ikev2_process_pending_sa_init_one (vlib_main_t *vm, ikev2_main_t *km,
5053                                    ikev2_sa_t *sa)
5054 {
5055   ikev2_profile_t *p;
5056   u32 bi0;
5057   u8 *nat_sha, *np;
5058   p = pool_elt_at_index (km->profiles, sa->profile_index);
5059
5060   if (!p->responder.is_resolved)
5061     {
5062       clib_error_t *r = ikev2_resolve_responder_hostname (vm, &p->responder);
5063       if (r)
5064         {
5065           clib_error_free (r);
5066           return;
5067         }
5068
5069       if (!p->responder.is_resolved)
5070         return;
5071
5072       ip_address_copy (&sa->raddr, &p->responder.addr);
5073
5074       /* update nat detection destination hash */
5075       np = ikev2_find_ike_notify_payload (
5076         (ike_header_t *) sa->last_sa_init_req_packet_data,
5077         IKEV2_NOTIFY_MSG_NAT_DETECTION_DESTINATION_IP);
5078       if (np)
5079         {
5080           nat_sha = ikev2_compute_nat_sha1 (
5081             clib_host_to_net_u64 (sa->ispi), clib_host_to_net_u64 (sa->rspi),
5082             &sa->raddr, clib_host_to_net_u16 (sa->dst_port));
5083           clib_memcpy_fast (np, nat_sha, vec_len (nat_sha));
5084           vec_free (nat_sha);
5085         }
5086     }
5087
5088   if (ip_address_is_zero (&sa->iaddr))
5089     {
5090       if (!ikev2_get_if_address (p->responder.sw_if_index,
5091                                  ip_addr_version (&p->responder.addr),
5092                                  &sa->iaddr))
5093         return;
5094
5095       /* update NAT detection payload */
5096       np =
5097         ikev2_find_ike_notify_payload
5098         ((ike_header_t *) sa->last_sa_init_req_packet_data,
5099          IKEV2_NOTIFY_MSG_NAT_DETECTION_SOURCE_IP);
5100       if (np)
5101         {
5102           nat_sha =
5103             ikev2_compute_nat_sha1 (clib_host_to_net_u64 (sa->ispi),
5104                                     clib_host_to_net_u64 (sa->rspi),
5105                                     &sa->iaddr,
5106                                     clib_host_to_net_u16 (IKEV2_PORT));
5107           clib_memcpy_fast (np, nat_sha, vec_len (nat_sha));
5108           vec_free (nat_sha);
5109         }
5110     }
5111
5112   if (vlib_buffer_alloc (km->vlib_main, &bi0, 1) != 1)
5113     return;
5114
5115   vlib_buffer_t *b = vlib_get_buffer (km->vlib_main, bi0);
5116   clib_memcpy_fast (vlib_buffer_get_current (b),
5117                     sa->last_sa_init_req_packet_data,
5118                     vec_len (sa->last_sa_init_req_packet_data));
5119
5120   ikev2_send_ike (km->vlib_main, &sa->iaddr, &sa->raddr, bi0,
5121                   vec_len (sa->last_sa_init_req_packet_data),
5122                   ikev2_get_port (sa), IKEV2_PORT, sa->sw_if_index);
5123 }
5124
5125 static void
5126 ikev2_process_pending_sa_init (vlib_main_t *vm, ikev2_main_t *km)
5127 {
5128   u32 sai;
5129   u64 ispi;
5130   ikev2_sa_t *sa;
5131
5132   /* *INDENT-OFF* */
5133   hash_foreach (ispi, sai, km->sa_by_ispi,
5134   ({
5135     sa = pool_elt_at_index (km->sais, sai);
5136     if (sa->init_response_received)
5137       continue;
5138
5139     ikev2_process_pending_sa_init_one (vm, km, sa);
5140   }));
5141   /* *INDENT-ON* */
5142 }
5143
5144 static void
5145 ikev2_send_informational_request (ikev2_sa_t * sa)
5146 {
5147   ikev2_main_t *km = &ikev2_main;
5148   ip_address_t *src, *dst;
5149   ike_header_t *ike0;
5150   vlib_buffer_t *b0;
5151   u32 bi0 = 0;
5152   u16 dp;
5153   int len;
5154
5155   bi0 = ikev2_get_new_ike_header_buff (km->vlib_main, &b0);
5156   if (!bi0)
5157     {
5158       ikev2_log_error ("buffer alloc failure");
5159       return;
5160     }
5161
5162   ike0 = vlib_buffer_get_current (b0);
5163   ike0->exchange = IKEV2_EXCHANGE_INFORMATIONAL;
5164   ike0->ispi = clib_host_to_net_u64 (sa->ispi);
5165   ike0->rspi = clib_host_to_net_u64 (sa->rspi);
5166   ike0->msgid = clib_host_to_net_u32 (sa->last_init_msg_id);
5167   ike0->flags = 0;
5168   sa->last_init_msg_id += 1;
5169   len = ikev2_generate_message (b0, sa, ike0, 0, 0, 0);
5170   if (~0 == len)
5171     return;
5172
5173   if (ikev2_natt_active (sa))
5174     len = ikev2_insert_non_esp_marker (ike0, len);
5175
5176   if (sa->is_initiator)
5177     {
5178       src = &sa->iaddr;
5179       dst = &sa->raddr;
5180     }
5181   else
5182     {
5183       dst = &sa->iaddr;
5184       src = &sa->raddr;
5185     }
5186
5187   dp = sa->dst_port ? sa->dst_port : ikev2_get_port (sa);
5188   ikev2_send_ike (km->vlib_main, src, dst, bi0, len, ikev2_get_port (sa), dp,
5189                   sa->sw_if_index);
5190 }
5191
5192 void
5193 ikev2_disable_dpd (void)
5194 {
5195   ikev2_main_t *km = &ikev2_main;
5196   km->dpd_disabled = 1;
5197 }
5198
5199 static int
5200 ikev2_mngr_process_responder_sas (ikev2_sa_t *sa)
5201 {
5202   ikev2_main_t *km = &ikev2_main;
5203   vlib_main_t *vm = km->vlib_main;
5204
5205   if (!sa->keys_generated)
5206     return 0;
5207
5208   if (sa->liveness_retries >= km->liveness_max_retries)
5209     return 1;
5210
5211   f64 now = vlib_time_now (vm);
5212
5213   if (sa->liveness_period_check < now)
5214     {
5215       sa->liveness_retries++;
5216       sa->liveness_period_check = now + km->liveness_period;
5217       ikev2_send_informational_request (sa);
5218     }
5219   return 0;
5220 }
5221
5222 static uword
5223 ikev2_mngr_process_fn (vlib_main_t * vm, vlib_node_runtime_t * rt,
5224                        vlib_frame_t * f)
5225 {
5226   ikev2_main_t *km = &ikev2_main;
5227   ikev2_profile_t *p;
5228   ikev2_child_sa_t *c;
5229   u32 *sai;
5230
5231   /* lazy init will wake it up */
5232   vlib_process_wait_for_event (vm);
5233
5234   while (1)
5235     {
5236       vlib_process_wait_for_event_or_clock (vm, 2);
5237       vlib_process_get_events (vm, NULL);
5238
5239       /* process ike child sas */
5240       ikev2_main_per_thread_data_t *tkm;
5241       vec_foreach (tkm, km->per_thread_data)
5242       {
5243         ikev2_sa_t *sa;
5244         u32 *to_be_deleted = 0;
5245
5246         /* *INDENT-OFF* */
5247         pool_foreach (sa, tkm->sas)  {
5248           ikev2_child_sa_t *c;
5249           u8 del_old_ids = 0;
5250
5251           if (sa->state != IKEV2_STATE_AUTHENTICATED)
5252             continue;
5253
5254           if (sa->old_remote_id_present && 0 > sa->old_id_expiration)
5255             {
5256               sa->old_remote_id_present = 0;
5257               del_old_ids = 1;
5258             }
5259           else
5260             sa->old_id_expiration -= 1;
5261
5262           vec_foreach (c, sa->childs)
5263             ikev2_mngr_process_child_sa(sa, c, del_old_ids);
5264
5265           if (!km->dpd_disabled && ikev2_mngr_process_responder_sas (sa))
5266             vec_add1 (to_be_deleted, sa - tkm->sas);
5267         }
5268         /* *INDENT-ON* */
5269
5270         vec_foreach (sai, to_be_deleted)
5271         {
5272           sa = pool_elt_at_index (tkm->sas, sai[0]);
5273           const u32 profile_index = sa->profile_index;
5274           const int reinitiate = (sa->is_initiator && profile_index != ~0);
5275           vec_foreach (c, sa->childs)
5276           {
5277             ikev2_delete_tunnel_interface (km->vnet_main, sa, c);
5278             ikev2_sa_del_child_sa (sa, c);
5279           }
5280           ikev2_sa_free_all_vec (sa);
5281           hash_unset (tkm->sa_by_rspi, sa->rspi);
5282           pool_put (tkm->sas, sa);
5283
5284           if (reinitiate)
5285             {
5286               p = pool_elt_at_index (km->profiles, profile_index);
5287               if (p)
5288                 {
5289                   clib_error_t *e = ikev2_initiate_sa_init (vm, p->name);
5290                   if (e)
5291                     {
5292                       ikev2_log_error ("%U", format_clib_error, e);
5293                       clib_error_free (e);
5294                     }
5295                 }
5296             }
5297         }
5298         vec_free (to_be_deleted);
5299       }
5300
5301       /* process ipsec sas */
5302       ipsec_sa_t *sa;
5303       /* *INDENT-OFF* */
5304       pool_foreach (sa, ipsec_sa_pool)
5305         {
5306           ikev2_mngr_process_ipsec_sa (sa);
5307         }
5308       /* *INDENT-ON* */
5309
5310       ikev2_process_pending_sa_init (vm, km);
5311     }
5312   return 0;
5313 }
5314
5315 /* *INDENT-OFF* */
5316 VLIB_REGISTER_NODE (ikev2_mngr_process_node, static) = {
5317     .function = ikev2_mngr_process_fn,
5318     .type = VLIB_NODE_TYPE_PROCESS,
5319     .name =
5320     "ikev2-manager-process",
5321 };
5322
5323 static void
5324 ikev2_lazy_init (ikev2_main_t *km)
5325 {
5326   vlib_thread_main_t *tm = vlib_get_thread_main ();
5327   int thread_id;
5328
5329   if (km->lazy_init_done)
5330     return;
5331
5332   ikev2_crypto_init (km);
5333
5334   mhash_init_vec_string (&km->profile_index_by_name, sizeof (uword));
5335
5336   vec_validate_aligned (km->per_thread_data, tm->n_vlib_mains - 1,
5337                         CLIB_CACHE_LINE_BYTES);
5338   for (thread_id = 0; thread_id < tm->n_vlib_mains; thread_id++)
5339     {
5340       ikev2_main_per_thread_data_t *ptd =
5341         vec_elt_at_index (km->per_thread_data, thread_id);
5342
5343       ptd->sa_by_rspi = hash_create (0, sizeof (uword));
5344
5345 #if OPENSSL_VERSION_NUMBER >= 0x10100000L
5346       ptd->evp_ctx = EVP_CIPHER_CTX_new ();
5347       ptd->hmac_ctx = HMAC_CTX_new ();
5348 #else
5349       EVP_CIPHER_CTX_init (&ptd->_evp_ctx);
5350       ptd->evp_ctx = &ptd->_evp_ctx;
5351       HMAC_CTX_init (&(ptd->_hmac_ctx));
5352       ptd->hmac_ctx = &ptd->_hmac_ctx;
5353 #endif
5354     }
5355
5356   km->sa_by_ispi = hash_create (0, sizeof (uword));
5357   km->sw_if_indices = hash_create (0, 0);
5358
5359   km->punt_hdl = vlib_punt_client_register ("ikev2");
5360
5361   km->dns_resolve_name =
5362     vlib_get_plugin_symbol ("dns_plugin.so", "dns_resolve_name");
5363   if (!km->dns_resolve_name)
5364     ikev2_log_error ("cannot load symbols from dns plugin");
5365
5366   /* wake up ikev2 process */
5367   vlib_process_signal_event (vlib_get_first_main (),
5368                              ikev2_mngr_process_node.index, 0, 0);
5369
5370   km->lazy_init_done = 1;
5371 }
5372
5373 VLIB_PLUGIN_REGISTER () = {
5374     .version = VPP_BUILD_VER,
5375     .description = "Internet Key Exchange (IKEv2) Protocol",
5376 };
5377 /* *INDENT-ON* */
5378
5379 /*
5380  * fd.io coding-style-patch-verification: ON
5381  *
5382  * Local Variables:
5383  * eval: (c-set-style "gnu")
5384  * End:
5385  */