FD.io VPP  v20.09-rc2-28-g3c5414029
Vector Packet Processing
ikev2.c
Go to the documentation of this file.
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 <vnet/pg/pg.h>
22 #include <vppinfra/error.h>
23 #include <vppinfra/random.h>
24 #include <vnet/udp/udp.h>
25 #include <vnet/ipsec/ipsec.h>
26 #include <vnet/ipsec/ipsec_tun.h>
27 #include <vnet/ipip/ipip.h>
28 #include <plugins/ikev2/ikev2.h>
30 #include <openssl/sha.h>
31 #include <vnet/ipsec/ipsec_punt.h>
32 
33 #define IKEV2_LIVENESS_RETRIES 3
34 #define IKEV2_LIVENESS_PERIOD_CHECK 30
35 
37 
39  ikev2_sa_t * sa,
40  ikev2_child_sa_t * child);
41 
42 #define ikev2_set_state(sa, v) do { \
43  (sa)->state = v; \
44  ikev2_elog_sa_state("ispi %lx SA state changed to " #v, sa->ispi); \
45  } while(0);
46 
47 typedef struct
48 {
52 
53 static u8 *
54 format_ikev2_trace (u8 * s, va_list * args)
55 {
56  CLIB_UNUSED (vlib_main_t * vm) = va_arg (*args, vlib_main_t *);
57  CLIB_UNUSED (vlib_node_t * node) = va_arg (*args, vlib_node_t *);
58  ikev2_trace_t *t = va_arg (*args, ikev2_trace_t *);
59 
60  s = format (s, "ikev2: sw_if_index %d, next index %d",
61  t->sw_if_index, t->next_index);
62  return s;
63 }
64 
66 
67 #define foreach_ikev2_error \
68 _(PROCESSED, "IKEv2 packets processed") \
69 _(IKE_SA_INIT_RETRANSMIT, "IKE_SA_INIT retransmit ") \
70 _(IKE_SA_INIT_IGNORE, "IKE_SA_INIT ignore (IKE SA already auth)") \
71 _(IKE_REQ_RETRANSMIT, "IKE request retransmit") \
72 _(IKE_REQ_IGNORE, "IKE request ignore (old msgid)") \
73 _(NOT_IKEV2, "Non IKEv2 packets received") \
74 _(BAD_LENGTH, "Bad packet length")
75 
76 typedef enum
77 {
78 #define _(sym,str) IKEV2_ERROR_##sym,
80 #undef _
83 
84 static char *ikev2_error_strings[] = {
85 #define _(sym,string) string,
87 #undef _
88 };
89 
90 typedef enum
91 {
95 } ikev2_next_t;
96 
98 
101 {
102  return sa->natt ? IKEV2_PORT_NATT : IKEV2_PORT;
103 }
104 
106 ikev2_insert_non_esp_marker (ike_header_t * ike, int len)
107 {
108  memmove ((u8 *) ike + sizeof (ikev2_non_esp_marker), ike, len);
109  clib_memset (ike, 0, sizeof (ikev2_non_esp_marker));
110  return len + sizeof (ikev2_non_esp_marker);
111 }
112 
113 static ikev2_sa_transform_t *
115 {
116  ikev2_main_t *km = &ikev2_main;
118 
120  {
121  if (td->type != t->type)
122  continue;
123 
124  if (td->transform_id != t->transform_id)
125  continue;
126 
127  if (td->type == IKEV2_TRANSFORM_TYPE_ENCR)
128  {
129  if (vec_len (t->attrs) != 4 || t->attrs[0] != 0x80
130  || t->attrs[1] != 14)
131  continue;
132 
133  if (((t->attrs[2] << 8 | t->attrs[3]) / 8) != td->key_len)
134  continue;
135  }
136  return td;
137  }
138  return 0;
139 }
140 
141 static ikev2_sa_proposal_t *
143  ikev2_protocol_id_t prot_id)
144 {
145  ikev2_sa_proposal_t *rv = 0;
146  ikev2_sa_proposal_t *proposal;
147  ikev2_sa_transform_t *transform, *new_t;
148  u8 mandatory_bitmap, optional_bitmap;
149 
150  if (prot_id == IKEV2_PROTOCOL_IKE)
151  {
152  mandatory_bitmap = (1 << IKEV2_TRANSFORM_TYPE_ENCR) |
153  (1 << IKEV2_TRANSFORM_TYPE_PRF) | (1 << IKEV2_TRANSFORM_TYPE_DH);
154  optional_bitmap = mandatory_bitmap | (1 << IKEV2_TRANSFORM_TYPE_INTEG);
155  }
156  else if (prot_id == IKEV2_PROTOCOL_ESP)
157  {
158  mandatory_bitmap = (1 << IKEV2_TRANSFORM_TYPE_ENCR) |
159  (1 << IKEV2_TRANSFORM_TYPE_ESN);
160  optional_bitmap = mandatory_bitmap |
161  (1 << IKEV2_TRANSFORM_TYPE_INTEG) | (1 << IKEV2_TRANSFORM_TYPE_DH);
162  }
163  else if (prot_id == IKEV2_PROTOCOL_AH)
164  {
165  mandatory_bitmap = (1 << IKEV2_TRANSFORM_TYPE_INTEG) |
166  (1 << IKEV2_TRANSFORM_TYPE_ESN);
167  optional_bitmap = mandatory_bitmap | (1 << IKEV2_TRANSFORM_TYPE_DH);
168  }
169  else
170  return 0;
171 
172  vec_add2 (rv, proposal, 1);
173 
174  vec_foreach (proposal, proposals)
175  {
176  u8 bitmap = 0;
177  if (proposal->protocol_id != prot_id)
178  continue;
179 
180  vec_foreach (transform, proposal->transforms)
181  {
182  if ((1 << transform->type) & bitmap)
183  continue;
184 
185  if (ikev2_find_transform_data (transform))
186  {
187  bitmap |= 1 << transform->type;
188  vec_add2 (rv->transforms, new_t, 1);
189  clib_memcpy_fast (new_t, transform, sizeof (*new_t));
190  new_t->attrs = vec_dup (transform->attrs);
191  }
192  }
193 
194  if ((bitmap & mandatory_bitmap) == mandatory_bitmap &&
195  (bitmap & ~optional_bitmap) == 0)
196  {
197  rv->proposal_num = proposal->proposal_num;
198  rv->protocol_id = proposal->protocol_id;
199  RAND_bytes ((u8 *) & rv->spi, sizeof (rv->spi));
200  goto done;
201  }
202  else
203  {
204  vec_free (rv->transforms);
205  }
206  }
207 
208  vec_free (rv);
209 done:
210  return rv;
211 }
212 
216 {
218 
219  if (!p)
220  return 0;
221 
222  vec_foreach (t, p->transforms)
223  {
224  if (t->type == type)
225  return ikev2_find_transform_data (t);
226  }
227  return 0;
228 }
229 
232  int by_initiator)
233 {
235  vec_foreach (c, sa->childs)
236  {
237  ikev2_sa_proposal_t *proposal =
238  by_initiator ? &c->i_proposals[0] : &c->r_proposals[0];
239  if (proposal && proposal->spi == spi && proposal->protocol_id == prot_id)
240  return c;
241  }
242 
243  return 0;
244 }
245 
246 void
248 {
251 
252  if (!*v)
253  return;
254 
255  vec_foreach (p, *v)
256  {
257  vec_foreach (t, p->transforms)
258  {
259  vec_free (t->attrs);
260  }
261  vec_free (p->transforms);
262  }
263  vec_free (*v);
264 };
265 
266 static void
268 {
271  vec_free (c->sk_ai);
272  vec_free (c->sk_ar);
273  vec_free (c->sk_ei);
274  vec_free (c->sk_er);
275  vec_free (c->tsi);
276  vec_free (c->tsr);
277 }
278 
279 static void
281 {
283  vec_foreach (c, *childs) ikev2_sa_free_child_sa (c);
284 
285  vec_free (*childs);
286 }
287 
288 static void
290 {
291  ikev2_sa_free_child_sa (child);
292  vec_del1 (sa->childs, child - sa->childs);
293 }
294 
295 static void
297 {
298  vec_free (sa->i_nonce);
299  vec_free (sa->r_nonce);
300 
301  vec_free (sa->dh_shared_key);
302  vec_free (sa->dh_private_key);
303  vec_free (sa->i_dh_data);
304  vec_free (sa->r_dh_data);
305 
308 
309  vec_free (sa->sk_d);
310  vec_free (sa->sk_ai);
311  vec_free (sa->sk_ar);
312  vec_free (sa->sk_ei);
313  vec_free (sa->sk_er);
314  vec_free (sa->sk_pi);
315  vec_free (sa->sk_pr);
316 
317  vec_free (sa->i_id.data);
318  vec_free (sa->r_id.data);
319 
320  vec_free (sa->i_auth.data);
321  if (sa->i_auth.key)
322  EVP_PKEY_free (sa->i_auth.key);
323  vec_free (sa->r_auth.data);
324  if (sa->r_auth.key)
325  EVP_PKEY_free (sa->r_auth.key);
326 
327  vec_free (sa->del);
328 
329  vec_free (sa->rekey);
330 
333 
335 
337 }
338 
339 static void
341 {
342  ikev2_main_t *km = &ikev2_main;
343  u32 thread_index = vlib_get_thread_index ();
344  uword *p;
345 
347 
348  p = hash_get (km->per_thread_data[thread_index].sa_by_rspi, sa->rspi);
349  if (p)
350  {
351  hash_unset (km->per_thread_data[thread_index].sa_by_rspi, sa->rspi);
352  pool_put (km->per_thread_data[thread_index].sas, sa);
353  }
354 }
355 
356 static void
358 {
359  ikev2_sa_transform_t *t = 0, *t2;
360  ikev2_main_t *km = &ikev2_main;
361 
362  if (sa->dh_group == IKEV2_TRANSFORM_DH_TYPE_NONE)
363  {
364  return;
365  }
366 
367  /* check if received DH group is on our list of supported groups */
369  {
370  if (t2->type == IKEV2_TRANSFORM_TYPE_DH && sa->dh_group == t2->dh_type)
371  {
372  t = t2;
373  break;
374  }
375  }
376 
377  if (!t)
378  {
379  sa->dh_group = IKEV2_TRANSFORM_DH_TYPE_NONE;
380  return;
381  }
382 
383  if (sa->is_initiator)
384  {
385  /* generate rspi */
386  RAND_bytes ((u8 *) & sa->ispi, 8);
387 
388  /* generate nonce */
390  RAND_bytes ((u8 *) sa->i_nonce, IKEV2_NONCE_SIZE);
391  }
392  else
393  {
394  /* generate rspi */
395  RAND_bytes ((u8 *) & sa->rspi, 8);
396 
397  /* generate nonce */
399  RAND_bytes ((u8 *) sa->r_nonce, IKEV2_NONCE_SIZE);
400  }
401 
402  /* generate dh keys */
403  ikev2_generate_dh (sa, t);
404 
405 }
406 
407 static void
409 {
410  ikev2_sa_transform_t *t = 0, *t2;
411  ikev2_main_t *km = &ikev2_main;
412 
413  /*move some data to the new SA */
414 #define _(A) ({void* __tmp__ = (A); (A) = 0; __tmp__;})
415  sa->i_nonce = _(sai->i_nonce);
416  sa->i_dh_data = _(sai->i_dh_data);
417  sa->dh_private_key = _(sai->dh_private_key);
418  sa->iaddr.as_u32 = sai->iaddr.as_u32;
419  sa->raddr.as_u32 = sai->raddr.as_u32;
420  sa->is_initiator = sai->is_initiator;
421  sa->i_id.type = sai->i_id.type;
422  sa->r_id.type = sai->r_id.type;
423  sa->profile_index = sai->profile_index;
424  sa->tun_itf = sai->tun_itf;
425  sa->is_tun_itf_set = sai->is_tun_itf_set;
426  sa->i_id.data = _(sai->i_id.data);
427  sa->r_id.data = _(sai->r_id.data);
428  sa->i_auth.method = sai->i_auth.method;
429  sa->i_auth.hex = sai->i_auth.hex;
430  sa->i_auth.data = _(sai->i_auth.data);
431  sa->i_auth.key = _(sai->i_auth.key);
433  sa->childs = _(sai->childs);
434  sa->udp_encap = sai->udp_encap;
436  sa->dst_port = sai->dst_port;
437  sa->sw_if_index = sai->sw_if_index;
438 #undef _
439 
440 
441  if (sa->dh_group == IKEV2_TRANSFORM_DH_TYPE_NONE)
442  {
443  return;
444  }
445 
446  /* check if received DH group is on our list of supported groups */
448  {
449  if (t2->type == IKEV2_TRANSFORM_TYPE_DH && sa->dh_group == t2->dh_type)
450  {
451  t = t2;
452  break;
453  }
454  }
455 
456  if (!t)
457  {
458  sa->dh_group = IKEV2_TRANSFORM_DH_TYPE_NONE;
459  return;
460  }
461 
462 
463  /* generate dh keys */
464  ikev2_complete_dh (sa, t);
465 
466 }
467 
468 static void
470 {
471  u8 *tmp;
472  /* calculate SKEYSEED = prf(Ni | Nr, g^ir) */
473  u8 *skeyseed = 0;
474  u8 *s = 0;
475  u16 integ_key_len = 0, salt_len = 0;
476  ikev2_sa_transform_t *tr_encr, *tr_prf, *tr_integ;
477  tr_encr =
478  ikev2_sa_get_td_for_type (sa->r_proposals, IKEV2_TRANSFORM_TYPE_ENCR);
479  tr_prf =
480  ikev2_sa_get_td_for_type (sa->r_proposals, IKEV2_TRANSFORM_TYPE_PRF);
481  tr_integ =
482  ikev2_sa_get_td_for_type (sa->r_proposals, IKEV2_TRANSFORM_TYPE_INTEG);
483 
484  if (tr_integ)
485  integ_key_len = tr_integ->key_len;
486  else
487  salt_len = sizeof (u32);
488 
489  vec_append (s, sa->i_nonce);
490  vec_append (s, sa->r_nonce);
491  skeyseed = ikev2_calc_prf (tr_prf, s, sa->dh_shared_key);
492 
493  /* Calculate S = Ni | Nr | SPIi | SPIr */
494  u64 *spi;
495  vec_add2 (s, tmp, 2 * sizeof (*spi));
496  spi = (u64 *) tmp;
497  spi[0] = clib_host_to_net_u64 (sa->ispi);
498  spi[1] = clib_host_to_net_u64 (sa->rspi);
499 
500  /* calculate PRFplus */
501  u8 *keymat;
502  int len = tr_prf->key_trunc + /* SK_d */
503  integ_key_len * 2 + /* SK_ai, SK_ar */
504  tr_encr->key_len * 2 + /* SK_ei, SK_er */
505  tr_prf->key_len * 2 + /* SK_pi, SK_pr */
506  salt_len * 2;
507 
508  keymat = ikev2_calc_prfplus (tr_prf, skeyseed, s, len);
509  vec_free (skeyseed);
510  vec_free (s);
511 
512  int pos = 0;
513 
514  /* SK_d */
515  sa->sk_d = vec_new (u8, tr_prf->key_trunc);
516  clib_memcpy_fast (sa->sk_d, keymat + pos, tr_prf->key_trunc);
517  pos += tr_prf->key_trunc;
518 
519  if (integ_key_len)
520  {
521  /* SK_ai */
522  sa->sk_ai = vec_new (u8, integ_key_len);
523  clib_memcpy_fast (sa->sk_ai, keymat + pos, integ_key_len);
524  pos += integ_key_len;
525 
526  /* SK_ar */
527  sa->sk_ar = vec_new (u8, integ_key_len);
528  clib_memcpy_fast (sa->sk_ar, keymat + pos, integ_key_len);
529  pos += integ_key_len;
530  }
531 
532  /* SK_ei */
533  sa->sk_ei = vec_new (u8, tr_encr->key_len + salt_len);
534  clib_memcpy_fast (sa->sk_ei, keymat + pos, tr_encr->key_len + salt_len);
535  pos += tr_encr->key_len + salt_len;
536 
537  /* SK_er */
538  sa->sk_er = vec_new (u8, tr_encr->key_len + salt_len);
539  clib_memcpy_fast (sa->sk_er, keymat + pos, tr_encr->key_len + salt_len);
540  pos += tr_encr->key_len + salt_len;
541 
542  /* SK_pi */
543  sa->sk_pi = vec_new (u8, tr_prf->key_len);
544  clib_memcpy_fast (sa->sk_pi, keymat + pos, tr_prf->key_len);
545  pos += tr_prf->key_len;
546 
547  /* SK_pr */
548  sa->sk_pr = vec_new (u8, tr_prf->key_len);
549  clib_memcpy_fast (sa->sk_pr, keymat + pos, tr_prf->key_len);
550  pos += tr_prf->key_len;
551 
552  vec_free (keymat);
553  sa->keys_generated = 1;
554 }
555 
556 static void
558 {
559  u8 *s = 0;
560  u16 integ_key_len = 0;
561  u8 salt_len = 0;
562 
563  ikev2_sa_transform_t *tr_prf, *ctr_encr, *ctr_integ;
564  tr_prf =
565  ikev2_sa_get_td_for_type (sa->r_proposals, IKEV2_TRANSFORM_TYPE_PRF);
566  ctr_encr =
567  ikev2_sa_get_td_for_type (child->r_proposals, IKEV2_TRANSFORM_TYPE_ENCR);
568  ctr_integ =
569  ikev2_sa_get_td_for_type (child->r_proposals, IKEV2_TRANSFORM_TYPE_INTEG);
570 
571  if (ctr_integ)
572  integ_key_len = ctr_integ->key_len;
573  else
574  salt_len = sizeof (u32);
575 
576  vec_append (s, sa->i_nonce);
577  vec_append (s, sa->r_nonce);
578  /* calculate PRFplus */
579  u8 *keymat;
580  int len = ctr_encr->key_len * 2 + integ_key_len * 2 + salt_len * 2;
581 
582  keymat = ikev2_calc_prfplus (tr_prf, sa->sk_d, s, len);
583 
584  int pos = 0;
585 
586  /* SK_ei */
587  child->sk_ei = vec_new (u8, ctr_encr->key_len);
588  clib_memcpy_fast (child->sk_ei, keymat + pos, ctr_encr->key_len);
589  pos += ctr_encr->key_len;
590 
591  if (ctr_integ)
592  {
593  /* SK_ai */
594  child->sk_ai = vec_new (u8, ctr_integ->key_len);
595  clib_memcpy_fast (child->sk_ai, keymat + pos, ctr_integ->key_len);
596  pos += ctr_integ->key_len;
597  }
598  else
599  {
600  clib_memcpy (&child->salt_ei, keymat + pos, salt_len);
601  pos += salt_len;
602  }
603 
604  /* SK_er */
605  child->sk_er = vec_new (u8, ctr_encr->key_len);
606  clib_memcpy_fast (child->sk_er, keymat + pos, ctr_encr->key_len);
607  pos += ctr_encr->key_len;
608 
609  if (ctr_integ)
610  {
611  /* SK_ar */
612  child->sk_ar = vec_new (u8, integ_key_len);
613  clib_memcpy_fast (child->sk_ar, keymat + pos, integ_key_len);
614  pos += integ_key_len;
615  }
616  else
617  {
618  clib_memcpy (&child->salt_er, keymat + pos, salt_len);
619  pos += salt_len;
620  }
621 
622  ASSERT (pos == len);
623 
624  vec_free (keymat);
625 }
626 
629 {
630  /* ispi, rspi, ip, port */
631  u8 buf[8 + 8 + 4 + 2];
632  u8 *res = vec_new (u8, 20);
633 
634  clib_memcpy_fast (&buf[0], &ispi, sizeof (ispi));
635  clib_memcpy_fast (&buf[8], &rspi, sizeof (rspi));
636  clib_memcpy_fast (&buf[8 + 8], &ip, sizeof (ip));
637  clib_memcpy_fast (&buf[8 + 8 + 4], &port, sizeof (port));
638  SHA1 (buf, sizeof (buf), res);
639  return res;
640 }
641 
642 static void
644  ike_header_t * ike, udp_header_t * udp, u32 len)
645 {
646  int p = 0;
647  u8 payload = ike->nextpayload;
648 
649  ikev2_elog_exchange ("ispi %lx rspi %lx IKE_INIT request received "
650  "from %d.%d.%d.%d",
651  clib_net_to_host_u64 (ike->ispi),
652  clib_net_to_host_u64 (ike->rspi), sa->iaddr.as_u32);
653 
654  sa->ispi = clib_net_to_host_u64 (ike->ispi);
655 
656  /* store whole IKE payload - needed for PSK auth */
658  vec_add (sa->last_sa_init_req_packet_data, ike, len);
659 
660  while (p < len && payload != IKEV2_PAYLOAD_NONE)
661  {
662  ike_payload_header_t *ikep = (ike_payload_header_t *) & ike->payload[p];
663  u32 plen = clib_net_to_host_u16 (ikep->length);
664 
665  if (plen < sizeof (ike_payload_header_t))
666  return;
667 
668  if (payload == IKEV2_PAYLOAD_SA)
669  {
671  sa->i_proposals = ikev2_parse_sa_payload (ikep);
672  }
673  else if (payload == IKEV2_PAYLOAD_KE)
674  {
675  ike_ke_payload_header_t *ke = (ike_ke_payload_header_t *) ikep;
676  sa->dh_group = clib_net_to_host_u16 (ke->dh_group);
677  vec_free (sa->i_dh_data);
678  vec_add (sa->i_dh_data, ke->payload, plen - sizeof (*ke));
679  }
680  else if (payload == IKEV2_PAYLOAD_NONCE)
681  {
682  vec_free (sa->i_nonce);
683  vec_add (sa->i_nonce, ikep->payload, plen - sizeof (*ikep));
684  }
685  else if (payload == IKEV2_PAYLOAD_NOTIFY)
686  {
688  if (n->msg_type == IKEV2_NOTIFY_MSG_NAT_DETECTION_SOURCE_IP)
689  {
690  u8 *src_sha = ikev2_compute_nat_sha1 (ike->ispi, 0,
691  sa->iaddr.as_u32,
692  udp->src_port);
693  if (clib_memcmp (src_sha, n->data, vec_len (src_sha)))
694  {
695  sa->natt = 1;
696  ikev2_elog_uint (IKEV2_LOG_DEBUG, "ispi %lx initiator"
697  " behind NAT", sa->ispi);
698  }
699  vec_free (src_sha);
700  }
701  else if (n->msg_type ==
702  IKEV2_NOTIFY_MSG_NAT_DETECTION_DESTINATION_IP)
703  {
704  u8 *dst_sha = ikev2_compute_nat_sha1 (ike->ispi, 0,
705  sa->raddr.as_u32,
706  udp->dst_port);
707  if (clib_memcmp (dst_sha, n->data, vec_len (dst_sha)))
708  {
709  sa->natt = 1;
710  ikev2_elog_uint (IKEV2_LOG_DEBUG, "ispi %lx responder"
711  " (self) behind NAT", sa->ispi);
712  }
713  vec_free (dst_sha);
714  }
715  vec_free (n);
716  }
717  else if (payload == IKEV2_PAYLOAD_VENDOR)
718  {
720  }
721  else
722  {
723  ikev2_elog_uint (IKEV2_LOG_ERROR, "Unknown payload! type=%d",
724  payload);
725  if (ikep->flags & IKEV2_PAYLOAD_FLAG_CRITICAL)
726  {
728  sa->unsupported_cp = payload;
729  return;
730  }
731  }
732 
733  payload = ikep->nextpayload;
734  p += plen;
735  }
736 
738 }
739 
740 static void
742  ike_header_t * ike, udp_header_t * udp, u32 len)
743 {
744  int p = 0;
745  u8 payload = ike->nextpayload;
746 
747  sa->ispi = clib_net_to_host_u64 (ike->ispi);
748  sa->rspi = clib_net_to_host_u64 (ike->rspi);
749 
750  ikev2_elog_exchange ("ispi %lx rspi %lx IKE_INIT response received "
751  "from %d.%d.%d.%d", sa->ispi, sa->rspi,
752  sa->raddr.as_u32);
753 
754  /* store whole IKE payload - needed for PSK auth */
756  vec_add (sa->last_sa_init_res_packet_data, ike, len);
757 
758  while (p < len && payload != IKEV2_PAYLOAD_NONE)
759  {
760  ike_payload_header_t *ikep = (ike_payload_header_t *) & ike->payload[p];
761  u32 plen = clib_net_to_host_u16 (ikep->length);
762 
763  if (plen < sizeof (ike_payload_header_t))
764  return;
765 
766  if (payload == IKEV2_PAYLOAD_SA)
767  {
769  sa->r_proposals = ikev2_parse_sa_payload (ikep);
770  if (sa->r_proposals)
771  {
773  ike->msgid =
774  clib_host_to_net_u32 (clib_net_to_host_u32 (ike->msgid) + 1);
775  }
776  }
777  else if (payload == IKEV2_PAYLOAD_KE)
778  {
779  ike_ke_payload_header_t *ke = (ike_ke_payload_header_t *) ikep;
780  sa->dh_group = clib_net_to_host_u16 (ke->dh_group);
781  vec_free (sa->r_dh_data);
782  vec_add (sa->r_dh_data, ke->payload, plen - sizeof (*ke));
783  }
784  else if (payload == IKEV2_PAYLOAD_NONCE)
785  {
786  vec_free (sa->r_nonce);
787  vec_add (sa->r_nonce, ikep->payload, plen - sizeof (*ikep));
788  }
789  else if (payload == IKEV2_PAYLOAD_NOTIFY)
790  {
792  if (n->msg_type == IKEV2_NOTIFY_MSG_NAT_DETECTION_SOURCE_IP)
793  {
794  u8 *src_sha = ikev2_compute_nat_sha1 (ike->ispi,
795  ike->rspi,
796  sa->raddr.as_u32,
797  udp->src_port);
798  if (clib_memcmp (src_sha, n->data, vec_len (src_sha)))
799  {
800  ikev2_elog_uint (IKEV2_LOG_DEBUG, "ispi %lx responder"
801  " behind NAT, unsupported", sa->ispi);
802  }
803  vec_free (src_sha);
804  }
805  else if (n->msg_type ==
806  IKEV2_NOTIFY_MSG_NAT_DETECTION_DESTINATION_IP)
807  {
808  u8 *dst_sha = ikev2_compute_nat_sha1 (ike->ispi,
809  ike->rspi,
810  sa->iaddr.as_u32,
811  udp->dst_port);
812  if (clib_memcmp (dst_sha, n->data, vec_len (dst_sha)))
813  {
814  sa->natt = 1;
815  ikev2_elog_uint (IKEV2_LOG_DEBUG, "ispi %lx initiator"
816  " (self) behind NAT", sa->ispi);
817  }
818  vec_free (dst_sha);
819  }
820  vec_free (n);
821  }
822  else if (payload == IKEV2_PAYLOAD_VENDOR)
823  {
825  }
826  else
827  {
828  ikev2_elog_uint (IKEV2_LOG_ERROR, "Unknown payload! type=%d",
829  payload);
830  if (ikep->flags & IKEV2_PAYLOAD_FLAG_CRITICAL)
831  {
833  sa->unsupported_cp = payload;
834  return;
835  }
836  }
837 
838  payload = ikep->nextpayload;
839  p += plen;
840  }
841 }
842 
843 static u8 *
844 ikev2_decrypt_sk_payload (ikev2_sa_t * sa, ike_header_t * ike, u8 * payload,
845  u32 len)
846 {
848  int p = 0;
849  u8 last_payload = 0, *plaintext = 0;
850  u8 *hmac = 0;
851  ike_payload_header_t *ikep = 0;
852  u32 plen = 0;
853  ikev2_sa_transform_t *tr_integ;
854  ikev2_sa_transform_t *tr_encr;
855  tr_integ =
856  ikev2_sa_get_td_for_type (sa->r_proposals, IKEV2_TRANSFORM_TYPE_INTEG);
857  tr_encr =
858  ikev2_sa_get_td_for_type (sa->r_proposals, IKEV2_TRANSFORM_TYPE_ENCR);
859  int is_aead = tr_encr->encr_type == IKEV2_TRANSFORM_ENCR_TYPE_AES_GCM_16;
860 
861  if ((!sa->sk_ar || !sa->sk_ai) && !is_aead)
862  return 0;
863 
864  while (p < len &&
865  *payload != IKEV2_PAYLOAD_NONE && last_payload != IKEV2_PAYLOAD_SK)
866  {
867  ikep = (ike_payload_header_t *) & ike->payload[p];
868  plen = clib_net_to_host_u16 (ikep->length);
869 
870  if (plen < sizeof (*ikep))
871  return 0;
872 
873  if (*payload == IKEV2_PAYLOAD_SK)
874  {
875  last_payload = *payload;
876  }
877  else
878  {
879  ikev2_elog_uint (IKEV2_LOG_ERROR, "Unknown payload! type=%d",
880  *payload);
881  if (ikep->flags & IKEV2_PAYLOAD_FLAG_CRITICAL)
882  {
883  sa->unsupported_cp = *payload;
884  return 0;
885  }
886  }
887 
888  *payload = ikep->nextpayload;
889  p += plen;
890  }
891 
892  if (last_payload != IKEV2_PAYLOAD_SK)
893  {
894  ikev2_elog_error ("Last payload must be SK");
895  return 0;
896  }
897 
898  if (is_aead)
899  {
900  if (plen < sizeof (*ikep) + IKEV2_GCM_ICV_SIZE)
901  return 0;
902 
903  plen -= sizeof (*ikep) + IKEV2_GCM_ICV_SIZE;
904  u8 *aad = (u8 *) ike;
905  u32 aad_len = ikep->payload - aad;
906  u8 *tag = ikep->payload + plen;
907 
908  plaintext = ikev2_decrypt_aead_data (ptd, sa, tr_encr, ikep->payload,
909  plen, aad, aad_len, tag);
910  }
911  else
912  {
913  if (len < tr_integ->key_trunc)
914  return 0;
915 
916  hmac =
917  ikev2_calc_integr (tr_integ, sa->is_initiator ? sa->sk_ar : sa->sk_ai,
918  (u8 *) ike, len - tr_integ->key_trunc);
919 
920  if (plen < sizeof (*ikep) + tr_integ->key_trunc)
921  return 0;
922 
923  plen = plen - sizeof (*ikep) - tr_integ->key_trunc;
924 
925  if (memcmp (hmac, &ikep->payload[plen], tr_integ->key_trunc))
926  {
927  ikev2_elog_error ("message integrity check failed");
928  vec_free (hmac);
929  return 0;
930  }
931  vec_free (hmac);
932 
933  plaintext = ikev2_decrypt_data (ptd, sa, tr_encr, ikep->payload, plen);
934  }
935 
936  return plaintext;
937 }
938 
941 {
942  if (i1->type != i2->type)
943  return 0;
944 
945  if (vec_len (i1->data) != vec_len (i2->data))
946  return 0;
947 
948  if (memcmp (i1->data, i2->data, vec_len (i1->data)))
949  return 0;
950 
951  return 1;
952 }
953 
954 static void
956 {
957  ikev2_main_t *km = &ikev2_main;
958  ikev2_sa_t *tmp;
959  u32 i, *delete = 0;
961  u32 thread_index = vlib_get_thread_index ();
962 
963  if (!sa->initial_contact)
964  return;
965 
966  /* find old IKE SAs with the same authenticated identity */
967  /* *INDENT-OFF* */
968  pool_foreach (tmp, km->per_thread_data[thread_index].sas, ({
969  if (!ikev2_is_id_equal (&tmp->i_id, &sa->i_id)
970  || !ikev2_is_id_equal(&tmp->r_id, &sa->r_id))
971  continue;
972 
973  if (sa->rspi != tmp->rspi)
974  vec_add1(delete, tmp - km->per_thread_data[thread_index].sas);
975  }));
976  /* *INDENT-ON* */
977 
978  for (i = 0; i < vec_len (delete); i++)
979  {
980  tmp =
981  pool_elt_at_index (km->per_thread_data[thread_index].sas, delete[i]);
982  vec_foreach (c,
984  tmp, c);
985  ikev2_delete_sa (tmp);
986  }
987 
988  vec_free (delete);
989  sa->initial_contact = 0;
990 }
991 
992 static void
993 ikev2_process_auth_req (vlib_main_t * vm, ikev2_sa_t * sa, ike_header_t * ike,
994  u32 len)
995 {
996  ikev2_child_sa_t *first_child_sa;
997  int p = 0;
998  u8 payload = ike->nextpayload;
999  u8 *plaintext = 0;
1000  ike_payload_header_t *ikep;
1001  u32 plen;
1002 
1003  ikev2_elog_exchange ("ispi %lx rspi %lx EXCHANGE_IKE_AUTH received "
1004  "from %d.%d.%d.%d", clib_host_to_net_u64 (ike->ispi),
1005  clib_host_to_net_u64 (ike->rspi),
1006  sa->is_initiator ? sa->raddr.as_u32 : sa->
1007  iaddr.as_u32);
1008 
1009  ikev2_calc_keys (sa);
1010 
1011  plaintext = ikev2_decrypt_sk_payload (sa, ike, &payload, len);
1012 
1013  if (!plaintext)
1014  {
1015  if (sa->unsupported_cp)
1017  goto cleanup_and_exit;
1018  }
1019 
1020  /* select or create 1st child SA */
1021  if (sa->is_initiator)
1022  {
1023  first_child_sa = &sa->childs[0];
1024  }
1025  else
1026  {
1028  vec_add2 (sa->childs, first_child_sa, 1);
1029  }
1030 
1031 
1032  /* process encrypted payload */
1033  p = 0;
1034  while (p < vec_len (plaintext) && payload != IKEV2_PAYLOAD_NONE)
1035  {
1036  ikep = (ike_payload_header_t *) & plaintext[p];
1037  plen = clib_net_to_host_u16 (ikep->length);
1038 
1039  if (plen < sizeof (ike_payload_header_t))
1040  goto cleanup_and_exit;
1041 
1042  if (payload == IKEV2_PAYLOAD_SA) /* 33 */
1043  {
1044  if (sa->is_initiator)
1045  {
1046  ikev2_sa_free_proposal_vector (&first_child_sa->r_proposals);
1047  first_child_sa->r_proposals = ikev2_parse_sa_payload (ikep);
1048  }
1049  else
1050  {
1051  ikev2_sa_free_proposal_vector (&first_child_sa->i_proposals);
1052  first_child_sa->i_proposals = ikev2_parse_sa_payload (ikep);
1053  }
1054  }
1055  else if (payload == IKEV2_PAYLOAD_IDI) /* 35 */
1056  {
1057  ike_id_payload_header_t *id = (ike_id_payload_header_t *) ikep;
1058 
1059  sa->i_id.type = id->id_type;
1060  vec_free (sa->i_id.data);
1061  vec_add (sa->i_id.data, id->payload, plen - sizeof (*id));
1062  }
1063  else if (payload == IKEV2_PAYLOAD_IDR) /* 36 */
1064  {
1065  ike_id_payload_header_t *id = (ike_id_payload_header_t *) ikep;
1066 
1067  sa->r_id.type = id->id_type;
1068  vec_free (sa->r_id.data);
1069  vec_add (sa->r_id.data, id->payload, plen - sizeof (*id));
1070  }
1071  else if (payload == IKEV2_PAYLOAD_AUTH) /* 39 */
1072  {
1073  ike_auth_payload_header_t *a = (ike_auth_payload_header_t *) ikep;
1074 
1075  if (sa->is_initiator)
1076  {
1077  sa->r_auth.method = a->auth_method;
1078  vec_free (sa->r_auth.data);
1079  vec_add (sa->r_auth.data, a->payload, plen - sizeof (*a));
1080  }
1081  else
1082  {
1083  sa->i_auth.method = a->auth_method;
1084  vec_free (sa->i_auth.data);
1085  vec_add (sa->i_auth.data, a->payload, plen - sizeof (*a));
1086  }
1087  }
1088  else if (payload == IKEV2_PAYLOAD_NOTIFY) /* 41 */
1089  {
1091  if (n->msg_type == IKEV2_NOTIFY_MSG_INITIAL_CONTACT)
1092  {
1093  sa->initial_contact = 1;
1094  }
1095  vec_free (n);
1096  }
1097  else if (payload == IKEV2_PAYLOAD_VENDOR) /* 43 */
1098  {
1100  }
1101  else if (payload == IKEV2_PAYLOAD_TSI) /* 44 */
1102  {
1103  vec_free (first_child_sa->tsi);
1104  first_child_sa->tsi = ikev2_parse_ts_payload (ikep);
1105  }
1106  else if (payload == IKEV2_PAYLOAD_TSR) /* 45 */
1107  {
1108  vec_free (first_child_sa->tsr);
1109  first_child_sa->tsr = ikev2_parse_ts_payload (ikep);
1110  }
1111  else
1112  {
1113  ikev2_elog_uint (IKEV2_LOG_ERROR, "Unknown payload! type=%d",
1114  payload);
1115 
1116  if (ikep->flags & IKEV2_PAYLOAD_FLAG_CRITICAL)
1117  {
1119  sa->unsupported_cp = payload;
1120  return;
1121  }
1122  }
1123 
1124  payload = ikep->nextpayload;
1125  p += plen;
1126  }
1127 
1128 cleanup_and_exit:
1129  vec_free (plaintext);
1130 }
1131 
1132 static void
1134  ike_header_t * ike, u32 len)
1135 {
1136  int p = 0;
1137  u8 payload = ike->nextpayload;
1138  u8 *plaintext = 0;
1139  ike_payload_header_t *ikep;
1140  u32 plen;
1141 
1142  sa->liveness_retries = 0;
1143  ikev2_elog_exchange ("ispi %lx rspi %lx INFORMATIONAL received "
1144  "from %d.%d.%d.%d", clib_host_to_net_u64 (ike->ispi),
1145  clib_host_to_net_u64 (ike->rspi), sa->iaddr.as_u32);
1146 
1147  plaintext = ikev2_decrypt_sk_payload (sa, ike, &payload, len);
1148 
1149  if (!plaintext)
1150  goto cleanup_and_exit;
1151 
1152  /* process encrypted payload */
1153  p = 0;
1154  while (p < vec_len (plaintext) && payload != IKEV2_PAYLOAD_NONE)
1155  {
1156  ikep = (ike_payload_header_t *) & plaintext[p];
1157  plen = clib_net_to_host_u16 (ikep->length);
1158 
1159  if (plen < sizeof (ike_payload_header_t))
1160  goto cleanup_and_exit;
1161 
1162  if (payload == IKEV2_PAYLOAD_NOTIFY) /* 41 */
1163  {
1165  if (n->msg_type == IKEV2_NOTIFY_MSG_AUTHENTICATION_FAILED)
1167  vec_free (n);
1168  }
1169  else if (payload == IKEV2_PAYLOAD_DELETE) /* 42 */
1170  {
1171  sa->del = ikev2_parse_delete_payload (ikep);
1172  }
1173  else if (payload == IKEV2_PAYLOAD_VENDOR) /* 43 */
1174  {
1176  }
1177  else
1178  {
1179  ikev2_elog_uint (IKEV2_LOG_ERROR, "Unknown payload! type=%d",
1180  payload);
1181  if (ikep->flags & IKEV2_PAYLOAD_FLAG_CRITICAL)
1182  {
1183  sa->unsupported_cp = payload;
1184  return;
1185  }
1186  }
1187 
1188  payload = ikep->nextpayload;
1189  p += plen;
1190  }
1191 
1192 cleanup_and_exit:
1193  vec_free (plaintext);
1194 }
1195 
1196 static void
1198  ike_header_t * ike, u32 len)
1199 {
1200  int p = 0;
1201  u8 payload = ike->nextpayload;
1202  u8 *plaintext = 0;
1203  u8 rekeying = 0;
1204  u8 nonce[IKEV2_NONCE_SIZE];
1205 
1206  ike_payload_header_t *ikep;
1207  u32 plen;
1208  ikev2_notify_t *n = 0;
1209  ikev2_ts_t *tsi = 0;
1210  ikev2_ts_t *tsr = 0;
1211  ikev2_sa_proposal_t *proposal = 0;
1212  ikev2_child_sa_t *child_sa;
1213 
1214  ikev2_elog_exchange ("ispi %lx rspi %lx CREATE_CHILD_SA received "
1215  "from %d.%d.%d.%d", clib_host_to_net_u64 (ike->ispi),
1216  clib_host_to_net_u64 (ike->rspi), sa->raddr.as_u32);
1217 
1218  plaintext = ikev2_decrypt_sk_payload (sa, ike, &payload, len);
1219 
1220  if (!plaintext)
1221  goto cleanup_and_exit;
1222 
1223  /* process encrypted payload */
1224  p = 0;
1225  while (p < vec_len (plaintext) && payload != IKEV2_PAYLOAD_NONE)
1226  {
1227  ikep = (ike_payload_header_t *) & plaintext[p];
1228  plen = clib_net_to_host_u16 (ikep->length);
1229 
1230  if (plen < sizeof (ike_payload_header_t))
1231  goto cleanup_and_exit;
1232 
1233  else if (payload == IKEV2_PAYLOAD_SA)
1234  {
1235  proposal = ikev2_parse_sa_payload (ikep);
1236  }
1237  else if (payload == IKEV2_PAYLOAD_NOTIFY)
1238  {
1239  n = ikev2_parse_notify_payload (ikep);
1240  if (n->msg_type == IKEV2_NOTIFY_MSG_REKEY_SA)
1241  {
1242  rekeying = 1;
1243  }
1244  }
1245  else if (payload == IKEV2_PAYLOAD_DELETE)
1246  {
1247  sa->del = ikev2_parse_delete_payload (ikep);
1248  }
1249  else if (payload == IKEV2_PAYLOAD_VENDOR)
1250  {
1252  }
1253  else if (payload == IKEV2_PAYLOAD_NONCE)
1254  {
1255  clib_memcpy_fast (nonce, ikep->payload, plen - sizeof (*ikep));
1256  }
1257  else if (payload == IKEV2_PAYLOAD_TSI)
1258  {
1259  tsi = ikev2_parse_ts_payload (ikep);
1260  }
1261  else if (payload == IKEV2_PAYLOAD_TSR)
1262  {
1263  tsr = ikev2_parse_ts_payload (ikep);
1264  }
1265  else
1266  {
1267  ikev2_elog_uint (IKEV2_LOG_ERROR, "Unknown payload! type=%d",
1268  payload);
1269  if (ikep->flags & IKEV2_PAYLOAD_FLAG_CRITICAL)
1270  {
1271  sa->unsupported_cp = payload;
1272  goto cleanup_and_exit;
1273  }
1274  }
1275 
1276  payload = ikep->nextpayload;
1277  p += plen;
1278  }
1279 
1280  if (sa->is_initiator && proposal->protocol_id == IKEV2_PROTOCOL_ESP)
1281  {
1282  ikev2_rekey_t *rekey = &sa->rekey[0];
1283  rekey->protocol_id = proposal->protocol_id;
1284  rekey->i_proposal =
1286  rekey->i_proposal->spi = rekey->spi;
1287  rekey->r_proposal = proposal;
1288  rekey->tsi = tsi;
1289  rekey->tsr = tsr;
1290  /* update Nr */
1291  vec_free (sa->r_nonce);
1292  vec_add (sa->r_nonce, nonce, IKEV2_NONCE_SIZE);
1293  child_sa = ikev2_sa_get_child (sa, rekey->ispi, IKEV2_PROTOCOL_ESP, 1);
1294  if (child_sa)
1295  {
1296  child_sa->rekey_retries = 0;
1297  }
1298  }
1299  else if (rekeying)
1300  {
1301  ikev2_rekey_t *rekey;
1302  child_sa = ikev2_sa_get_child (sa, n->spi, n->protocol_id, 1);
1303  if (!child_sa)
1304  {
1305  ikev2_elog_uint (IKEV2_LOG_ERROR, "child SA spi %lx not found",
1306  n->spi);
1307  goto cleanup_and_exit;
1308  }
1309  vec_add2 (sa->rekey, rekey, 1);
1310  rekey->protocol_id = n->protocol_id;
1311  rekey->spi = n->spi;
1312  rekey->i_proposal = proposal;
1313  rekey->r_proposal =
1315  rekey->tsi = tsi;
1316  rekey->tsr = tsr;
1317  /* update Ni */
1318  vec_free (sa->i_nonce);
1319  vec_add (sa->i_nonce, nonce, IKEV2_NONCE_SIZE);
1320  /* generate new Nr */
1321  vec_free (sa->r_nonce);
1323  RAND_bytes ((u8 *) sa->r_nonce, IKEV2_NONCE_SIZE);
1324  }
1325 
1326 cleanup_and_exit:
1327  vec_free (plaintext);
1328  vec_free (n);
1329 }
1330 
1331 static u8 *
1332 ikev2_sa_generate_authmsg (ikev2_sa_t * sa, int is_responder)
1333 {
1334  u8 *authmsg = 0;
1335  u8 *data;
1336  u8 *nonce;
1337  ikev2_id_t *id;
1338  u8 *key;
1339  u8 *packet_data;
1340  ikev2_sa_transform_t *tr_prf;
1341 
1342  tr_prf =
1343  ikev2_sa_get_td_for_type (sa->r_proposals, IKEV2_TRANSFORM_TYPE_PRF);
1344 
1345  if (is_responder)
1346  {
1347  id = &sa->r_id;
1348  key = sa->sk_pr;
1349  nonce = sa->i_nonce;
1350  packet_data = sa->last_sa_init_res_packet_data;
1351  }
1352  else
1353  {
1354  id = &sa->i_id;
1355  key = sa->sk_pi;
1356  nonce = sa->r_nonce;
1357  packet_data = sa->last_sa_init_req_packet_data;
1358  }
1359 
1360  data = vec_new (u8, 4);
1361  data[0] = id->type;
1362  vec_append (data, id->data);
1363 
1364  u8 *id_hash = ikev2_calc_prf (tr_prf, key, data);
1365  vec_append (authmsg, packet_data);
1366  vec_append (authmsg, nonce);
1367  vec_append (authmsg, id_hash);
1368  vec_free (id_hash);
1369  vec_free (data);
1370 
1371  return authmsg;
1372 }
1373 
1374 static int
1376 {
1377  if (ts1->ts_type == ts2->ts_type && ts1->protocol_id == ts2->protocol_id &&
1378  ts1->start_port == ts2->start_port && ts1->end_port == ts2->end_port &&
1379  ts1->start_addr.as_u32 == ts2->start_addr.as_u32 &&
1380  ts1->end_addr.as_u32 == ts2->end_addr.as_u32)
1381  return 1;
1382 
1383  return 0;
1384 }
1385 
1386 static void
1388 {
1389  ikev2_main_t *km = &ikev2_main;
1390  ikev2_profile_t *p;
1391  ikev2_ts_t *ts, *p_tsi, *p_tsr, *tsi = 0, *tsr = 0;
1392  ikev2_id_t *id_rem, *id_loc;
1393 
1394  /* *INDENT-OFF* */
1395  pool_foreach (p, km->profiles, ({
1396 
1397  if (sa->is_initiator)
1398  {
1399  p_tsi = &p->loc_ts;
1400  p_tsr = &p->rem_ts;
1401  id_rem = &sa->r_id;
1402  id_loc = &sa->i_id;
1403  }
1404  else
1405  {
1406  p_tsi = &p->rem_ts;
1407  p_tsr = &p->loc_ts;
1408  id_rem = &sa->i_id;
1409  id_loc = &sa->r_id;
1410  }
1411 
1412  /* check id */
1413  if (!ikev2_is_id_equal (&p->rem_id, id_rem)
1414  || !ikev2_is_id_equal (&p->loc_id, id_loc))
1415  continue;
1416 
1417  sa->profile_index = p - km->profiles;
1418 
1419  vec_foreach(ts, sa->childs[0].tsi)
1420  {
1421  if (ikev2_ts_cmp(p_tsi, ts))
1422  {
1423  vec_add1 (tsi, ts[0]);
1424  break;
1425  }
1426  }
1427 
1428  vec_foreach(ts, sa->childs[0].tsr)
1429  {
1430  if (ikev2_ts_cmp(p_tsr, ts))
1431  {
1432  vec_add1 (tsr, ts[0]);
1433  break;
1434  }
1435  }
1436 
1437  break;
1438  }));
1439  /* *INDENT-ON* */
1440 
1441  if (tsi && tsr)
1442  {
1443  vec_free (sa->childs[0].tsi);
1444  vec_free (sa->childs[0].tsr);
1445  sa->childs[0].tsi = tsi;
1446  sa->childs[0].tsr = tsr;
1447  }
1448  else
1449  {
1450  vec_free (tsi);
1451  vec_free (tsr);
1453  }
1454 }
1455 
1456 static void
1458 {
1459  ikev2_main_t *km = &ikev2_main;
1460  ikev2_profile_t *p, *sel_p = 0;
1461  u8 *authmsg, *key_pad, *psk = 0, *auth = 0;
1462  ikev2_sa_transform_t *tr_prf;
1463 
1464  tr_prf =
1465  ikev2_sa_get_td_for_type (sa->r_proposals, IKEV2_TRANSFORM_TYPE_PRF);
1466 
1467  /* only shared key and rsa signature */
1468  if (!(sa->i_auth.method == IKEV2_AUTH_METHOD_SHARED_KEY_MIC ||
1469  sa->i_auth.method == IKEV2_AUTH_METHOD_RSA_SIG))
1470  {
1471  ikev2_elog_uint (IKEV2_LOG_ERROR,
1472  "unsupported authentication method %u",
1473  sa->i_auth.method);
1475  return;
1476  }
1477 
1478  key_pad = format (0, "%s", IKEV2_KEY_PAD);
1479  authmsg = ikev2_sa_generate_authmsg (sa, sa->is_initiator);
1480 
1481  ikev2_id_t *id_rem, *id_loc;
1482  ikev2_auth_t *sa_auth;
1483 
1484  if (sa->is_initiator)
1485  {
1486  id_rem = &sa->r_id;
1487  id_loc = &sa->i_id;
1488  sa_auth = &sa->r_auth;
1489  }
1490  else
1491  {
1492  id_rem = &sa->i_id;
1493  id_loc = &sa->r_id;
1494  sa_auth = &sa->i_auth;
1495  }
1496 
1497  /* *INDENT-OFF* */
1498  pool_foreach (p, km->profiles, ({
1499 
1500  /* check id */
1501  if (!ikev2_is_id_equal (&p->rem_id, id_rem)
1502  || !ikev2_is_id_equal (&p->loc_id, id_loc))
1503  continue;
1504 
1505  if (sa_auth->method == IKEV2_AUTH_METHOD_SHARED_KEY_MIC)
1506  {
1507  if (!p->auth.data ||
1508  p->auth.method != IKEV2_AUTH_METHOD_SHARED_KEY_MIC)
1509  continue;
1510 
1511  psk = ikev2_calc_prf(tr_prf, p->auth.data, key_pad);
1512  auth = ikev2_calc_prf(tr_prf, psk, authmsg);
1513 
1514  if (!memcmp(auth, sa_auth->data, vec_len(sa_auth->data)))
1515  {
1516  ikev2_set_state(sa, IKEV2_STATE_AUTHENTICATED);
1517  vec_free(auth);
1518  sel_p = p;
1519  break;
1520  }
1521 
1522  }
1523  else if (sa_auth->method == IKEV2_AUTH_METHOD_RSA_SIG)
1524  {
1525  if (p->auth.method != IKEV2_AUTH_METHOD_RSA_SIG)
1526  continue;
1527 
1528  if (ikev2_verify_sign(p->auth.key, sa_auth->data, authmsg) == 1)
1529  {
1530  ikev2_set_state(sa, IKEV2_STATE_AUTHENTICATED);
1531  sel_p = p;
1532  break;
1533  }
1534  }
1535 
1536  vec_free(auth);
1537  vec_free(psk);
1538  }));
1539  /* *INDENT-ON* */
1540 
1541  if (sel_p)
1542  {
1543  sa->udp_encap = sel_p->udp_encap;
1544  sa->ipsec_over_udp_port = sel_p->ipsec_over_udp_port;
1545  }
1546  vec_free (authmsg);
1547 
1548  if (sa->state == IKEV2_STATE_AUTHENTICATED)
1549  {
1550  if (!sa->is_initiator)
1551  {
1552  vec_free (sa->r_id.data);
1553  sa->r_id.data = vec_dup (sel_p->loc_id.data);
1554  sa->r_id.type = sel_p->loc_id.type;
1555  sa->i_id.data = vec_dup (sel_p->rem_id.data);
1556  sa->i_id.type = sel_p->rem_id.type;
1557 
1558  /* generate our auth data */
1559  authmsg = ikev2_sa_generate_authmsg (sa, 1);
1560  if (sel_p->auth.method == IKEV2_AUTH_METHOD_SHARED_KEY_MIC)
1561  {
1562  sa->r_auth.data = ikev2_calc_prf (tr_prf, psk, authmsg);
1563  sa->r_auth.method = IKEV2_AUTH_METHOD_SHARED_KEY_MIC;
1564  }
1565  else if (sel_p->auth.method == IKEV2_AUTH_METHOD_RSA_SIG)
1566  {
1567  sa->r_auth.data = ikev2_calc_sign (km->pkey, authmsg);
1568  sa->r_auth.method = IKEV2_AUTH_METHOD_RSA_SIG;
1569  }
1570  vec_free (authmsg);
1571 
1572  /* select transforms for 1st child sa */
1573  ikev2_sa_free_proposal_vector (&sa->childs[0].r_proposals);
1574  sa->childs[0].r_proposals =
1575  ikev2_select_proposal (sa->childs[0].i_proposals,
1577 
1578  if (~0 != sel_p->tun_itf)
1579  {
1580  sa->is_tun_itf_set = 1;
1581  sa->tun_itf = sel_p->tun_itf;
1582  }
1583  }
1584  }
1585  else
1586  {
1587  ikev2_elog_uint (IKEV2_LOG_ERROR, "authentication failed, no matching "
1588  "profile found! ispi %lx", sa->ispi);
1590  }
1591  vec_free (psk);
1592  vec_free (key_pad);
1593 }
1594 
1595 
1596 static void
1598 {
1599  ikev2_main_t *km = &ikev2_main;
1600  u8 *authmsg, *key_pad, *psk = 0;
1601  ikev2_sa_transform_t *tr_prf;
1602 
1603  tr_prf =
1604  ikev2_sa_get_td_for_type (sa->r_proposals, IKEV2_TRANSFORM_TYPE_PRF);
1605 
1606  /* only shared key and rsa signature */
1607  if (!(sa->i_auth.method == IKEV2_AUTH_METHOD_SHARED_KEY_MIC ||
1608  sa->i_auth.method == IKEV2_AUTH_METHOD_RSA_SIG))
1609  {
1610  ikev2_elog_uint (IKEV2_LOG_ERROR,
1611  "unsupported authentication method %u",
1612  sa->i_auth.method);
1614  return;
1615  }
1616 
1617  key_pad = format (0, "%s", IKEV2_KEY_PAD);
1618  authmsg = ikev2_sa_generate_authmsg (sa, 0);
1619  psk = ikev2_calc_prf (tr_prf, sa->i_auth.data, key_pad);
1620 
1621  if (sa->i_auth.method == IKEV2_AUTH_METHOD_SHARED_KEY_MIC)
1622  {
1623  sa->i_auth.data = ikev2_calc_prf (tr_prf, psk, authmsg);
1624  sa->i_auth.method = IKEV2_AUTH_METHOD_SHARED_KEY_MIC;
1625  }
1626  else if (sa->i_auth.method == IKEV2_AUTH_METHOD_RSA_SIG)
1627  {
1628  sa->i_auth.data = ikev2_calc_sign (km->pkey, authmsg);
1629  sa->i_auth.method = IKEV2_AUTH_METHOD_RSA_SIG;
1630  }
1631 
1632  vec_free (psk);
1633  vec_free (key_pad);
1634  vec_free (authmsg);
1635 }
1636 
1637 static u32
1639 {
1640  return (0x80000000 | (ti << 24) | (sai << 12) | ci);
1641 }
1642 
1643 static u32
1645 {
1646  return (0xc0000000 | (ti << 24) | (sai << 12) | ci);
1647 }
1648 
1649 typedef struct
1650 {
1661  ip46_address_t local_ip;
1662  ip46_address_t remote_ip;
1663  ipsec_key_t loc_ckey, rem_ckey, loc_ikey, rem_ikey;
1670 
1671 static void
1673 {
1674  ikev2_main_t *km = &ikev2_main;
1675  u32 sw_if_index;
1676  int rv = 0;
1677 
1678  if (~0 == a->sw_if_index)
1679  {
1680  /* no tunnel associated with the SA/profile - create a new one */
1682  &a->local_ip, &a->remote_ip, 0,
1683  TUNNEL_ENCAP_DECAP_FLAG_NONE, IP_DSCP_CS0,
1684  TUNNEL_MODE_P2P, &sw_if_index);
1685 
1686  if (rv == VNET_API_ERROR_IF_ALREADY_EXISTS)
1687  {
1688  if (hash_get (km->sw_if_indices, sw_if_index))
1689  /* interface is managed by IKE; proceed with updating SAs */
1690  rv = 0;
1691  }
1692  hash_set1 (km->sw_if_indices, sw_if_index);
1693  }
1694  else
1695  {
1696  sw_if_index = a->sw_if_index;
1697  vnet_sw_interface_admin_up (vnet_get_main (), sw_if_index);
1698  }
1699 
1700  if (rv)
1701  {
1702  ikev2_elog_peers (IKEV2_LOG_ERROR, "installing ipip tunnel failed! "
1703  "loc:%d.%d.%d.%d rem:%d.%d.%d.%d",
1704  a->local_ip.ip4.as_u32, a->remote_ip.ip4.as_u32);
1705  return;
1706  }
1707 
1708  u32 *sas_in = NULL;
1709  vec_add1 (sas_in, a->remote_sa_id);
1710  if (a->is_rekey)
1711  {
1712  ipsec_tun_protect_del (sw_if_index, NULL);
1713 
1714  /* replace local SA immediately */
1716 
1717  /* keep the old sa */
1718  vec_add1 (sas_in, a->old_remote_sa_id);
1719  }
1720 
1722  a->local_spi,
1724  &a->loc_ckey, a->integ_type, &a->loc_ikey,
1725  a->flags, 0, a->salt_local, &a->local_ip,
1726  &a->remote_ip, NULL, a->src_port, a->dst_port);
1729  a->integ_type, &a->rem_ikey,
1730  (a->flags | IPSEC_SA_FLAG_IS_INBOUND), 0,
1731  a->salt_remote, &a->remote_ip,
1732  &a->local_ip, NULL, a->ipsec_over_udp_port,
1733  a->ipsec_over_udp_port);
1734 
1735  rv |= ipsec_tun_protect_update (sw_if_index, NULL, a->local_sa_id, sas_in);
1736 }
1737 
1738 static int
1740  u32 thread_index,
1741  ikev2_sa_t * sa,
1742  ikev2_child_sa_t * child, u32 sa_index,
1743  u32 child_index, u8 is_rekey)
1744 {
1745  ikev2_main_t *km = &ikev2_main;
1746  ipsec_crypto_alg_t encr_type;
1747  ipsec_integ_alg_t integ_type;
1748  ikev2_profile_t *p = 0;
1750  ikev2_sa_proposal_t *proposals;
1751  u8 is_aead = 0;
1753 
1754  clib_memset (&a, 0, sizeof (a));
1755 
1756  if (!child->r_proposals)
1757  {
1759  return 1;
1760  }
1761 
1762  if (sa->is_initiator)
1763  {
1764  ip46_address_set_ip4 (&a.local_ip, &sa->iaddr);
1766  proposals = child->r_proposals;
1767  a.local_spi = child->r_proposals[0].spi;
1768  a.remote_spi = child->i_proposals[0].spi;
1769  }
1770  else
1771  {
1772  ip46_address_set_ip4 (&a.local_ip, &sa->raddr);
1774  proposals = child->i_proposals;
1775  a.local_spi = child->i_proposals[0].spi;
1776  a.remote_spi = child->r_proposals[0].spi;
1777  }
1778 
1779  a.flags = IPSEC_SA_FLAG_USE_ANTI_REPLAY;
1780  if (sa->udp_encap)
1781  {
1782  a.flags |= IPSEC_SA_FLAG_IS_TUNNEL;
1783  a.flags |= IPSEC_SA_FLAG_UDP_ENCAP;
1784  }
1785  if (sa->natt)
1786  a.flags |= IPSEC_SA_FLAG_UDP_ENCAP;
1787  a.is_rekey = is_rekey;
1788 
1789  tr = ikev2_sa_get_td_for_type (proposals, IKEV2_TRANSFORM_TYPE_ESN);
1790  if (tr && tr->esn_type)
1791  a.flags |= IPSEC_SA_FLAG_USE_ESN;
1792 
1793  tr = ikev2_sa_get_td_for_type (proposals, IKEV2_TRANSFORM_TYPE_ENCR);
1794  if (tr)
1795  {
1796  if (tr->encr_type == IKEV2_TRANSFORM_ENCR_TYPE_AES_CBC && tr->key_len)
1797  {
1798  switch (tr->key_len)
1799  {
1800  case 16:
1801  encr_type = IPSEC_CRYPTO_ALG_AES_CBC_128;
1802  break;
1803  case 24:
1804  encr_type = IPSEC_CRYPTO_ALG_AES_CBC_192;
1805  break;
1806  case 32:
1807  encr_type = IPSEC_CRYPTO_ALG_AES_CBC_256;
1808  break;
1809  default:
1811  return 1;
1812  break;
1813  }
1814  }
1815  else if (tr->encr_type == IKEV2_TRANSFORM_ENCR_TYPE_AES_GCM_16
1816  && tr->key_len)
1817  {
1818  switch (tr->key_len)
1819  {
1820  case 16:
1821  encr_type = IPSEC_CRYPTO_ALG_AES_GCM_128;
1822  break;
1823  case 24:
1824  encr_type = IPSEC_CRYPTO_ALG_AES_GCM_192;
1825  break;
1826  case 32:
1827  encr_type = IPSEC_CRYPTO_ALG_AES_GCM_256;
1828  break;
1829  default:
1831  return 1;
1832  break;
1833  }
1834  is_aead = 1;
1835  }
1836  else
1837  {
1839  return 1;
1840  }
1841  }
1842  else
1843  {
1845  return 1;
1846  }
1847  a.encr_type = encr_type;
1848 
1849  if (!is_aead)
1850  {
1851  tr = ikev2_sa_get_td_for_type (proposals, IKEV2_TRANSFORM_TYPE_INTEG);
1852  if (tr)
1853  {
1854  switch (tr->integ_type)
1855  {
1856  case IKEV2_TRANSFORM_INTEG_TYPE_AUTH_HMAC_SHA2_256_128:
1857  integ_type = IPSEC_INTEG_ALG_SHA_256_128;
1858  break;
1859  case IKEV2_TRANSFORM_INTEG_TYPE_AUTH_HMAC_SHA2_384_192:
1860  integ_type = IPSEC_INTEG_ALG_SHA_384_192;
1861  break;
1862  case IKEV2_TRANSFORM_INTEG_TYPE_AUTH_HMAC_SHA2_512_256:
1863  integ_type = IPSEC_INTEG_ALG_SHA_512_256;
1864  break;
1865  case IKEV2_TRANSFORM_INTEG_TYPE_AUTH_HMAC_SHA1_96:
1866  integ_type = IPSEC_INTEG_ALG_SHA1_96;
1867  break;
1868  default:
1870  return 1;
1871  }
1872  }
1873  else
1874  {
1876  return 1;
1877  }
1878  }
1879  else
1880  {
1881  integ_type = IPSEC_INTEG_ALG_NONE;
1882  }
1883 
1884  a.integ_type = integ_type;
1885  ikev2_calc_child_keys (sa, child);
1886 
1887  if (sa->is_initiator)
1888  {
1889  ipsec_mk_key (&a.loc_ikey, child->sk_ai, vec_len (child->sk_ai));
1890  ipsec_mk_key (&a.rem_ikey, child->sk_ar, vec_len (child->sk_ar));
1891  ipsec_mk_key (&a.loc_ckey, child->sk_ei, vec_len (child->sk_ei));
1892  ipsec_mk_key (&a.rem_ckey, child->sk_er, vec_len (child->sk_er));
1893  if (is_aead)
1894  {
1895  a.salt_remote = child->salt_er;
1896  a.salt_local = child->salt_ei;
1897  }
1899  }
1900  else
1901  {
1902  ipsec_mk_key (&a.loc_ikey, child->sk_ar, vec_len (child->sk_ar));
1903  ipsec_mk_key (&a.rem_ikey, child->sk_ai, vec_len (child->sk_ai));
1904  ipsec_mk_key (&a.loc_ckey, child->sk_er, vec_len (child->sk_er));
1905  ipsec_mk_key (&a.rem_ckey, child->sk_ei, vec_len (child->sk_ei));
1906  if (is_aead)
1907  {
1908  a.salt_remote = child->salt_ei;
1909  a.salt_local = child->salt_er;
1910  }
1911  a.dst_port = sa->natt ? sa->dst_port : sa->ipsec_over_udp_port;
1912  a.src_port = sa->ipsec_over_udp_port;
1913  }
1914 
1915  if (sa->is_initiator && sa->profile_index != ~0)
1916  p = pool_elt_at_index (km->profiles, sa->profile_index);
1917 
1918  if (p && p->lifetime)
1919  {
1920  child->time_to_expiration = vlib_time_now (vm) + p->lifetime;
1921  if (p->lifetime_jitter)
1922  {
1923  // This is not much better than rand(3), which Coverity warns
1924  // is unsuitable for security applications; random_u32 is
1925  // however fast. If this perturbance to the expiration time
1926  // needs to use a better RNG then we may need to use something
1927  // like /dev/urandom which has significant overhead.
1928  u32 rnd = (u32) (vlib_time_now (vm) * 1e6);
1929  rnd = random_u32 (&rnd);
1930 
1931  child->time_to_expiration += 1 + (rnd % p->lifetime_jitter);
1932  }
1933  }
1934 
1935  if (thread_index & 0xffffffc0)
1936  ikev2_elog_error ("error: thread index exceeds max range 0x3f!");
1937 
1938  if (child_index & 0xfffff000 || sa_index & 0xfffff000)
1939  ikev2_elog_error ("error: sa/child index exceeds max range 0xfff!");
1940 
1941  child->local_sa_id =
1942  a.local_sa_id =
1943  ikev2_mk_local_sa_id (sa_index, child_index, thread_index);
1944 
1945  u32 remote_sa_id = ikev2_mk_remote_sa_id (sa_index, child_index,
1946  thread_index);
1947 
1948  if (is_rekey)
1949  {
1950  /* create a new remote SA ID to keep the old SA for a bit longer
1951  * so the peer has some time to swap their SAs */
1952 
1953  /* use most significat bit of child index part in id */
1954  u32 mask = 0x800;
1955  if (sa->current_remote_id_mask)
1956  {
1957  sa->old_remote_id = a.old_remote_sa_id = remote_sa_id | mask;
1958  sa->current_remote_id_mask = 0;
1959  }
1960  else
1961  {
1962  sa->old_remote_id = a.old_remote_sa_id = remote_sa_id;
1964  remote_sa_id |= mask;
1965  }
1966  sa->old_id_expiration = 3.0;
1967  sa->old_remote_id_present = 1;
1968  }
1969 
1970  child->remote_sa_id = a.remote_sa_id = remote_sa_id;
1971 
1972  a.sw_if_index = (sa->is_tun_itf_set ? sa->tun_itf : ~0);
1974 
1976  (u8 *) & a, sizeof (a));
1977  return 0;
1978 }
1979 
1980 typedef struct
1981 {
1982  ip46_address_t local_ip;
1983  ip46_address_t remote_ip;
1988 
1991 {
1992  u32 mask = 0x800;
1993  if (mask & id)
1994  return id & ~mask;
1995  return id | mask;
1996 }
1997 
1998 static void
2000 {
2001  ikev2_main_t *km = &ikev2_main;
2002  ipip_tunnel_t *ipip = NULL;
2003  u32 sw_if_index;
2004 
2005  if (~0 == a->sw_if_index)
2006  {
2007  /* *INDENT-OFF* */
2008  ipip_tunnel_key_t key = {
2009  .src = a->local_ip,
2010  .dst = a->remote_ip,
2011  .transport = IPIP_TRANSPORT_IP4,
2012  .fib_index = 0,
2013  };
2014  /* *INDENT-ON* */
2015 
2016  ipip = ipip_tunnel_db_find (&key);
2017 
2018  if (ipip)
2019  {
2020  sw_if_index = ipip->sw_if_index;
2021  hash_unset (km->sw_if_indices, ipip->sw_if_index);
2022  }
2023  else
2024  sw_if_index = ~0;
2025  }
2026  else
2027  {
2028  sw_if_index = a->sw_if_index;
2029  vnet_sw_interface_admin_down (vnet_get_main (), sw_if_index);
2030  }
2031 
2032  if (~0 != sw_if_index)
2033  ipsec_tun_protect_del (sw_if_index, NULL);
2034 
2038 
2039  if (ipip)
2040  ipip_del_tunnel (ipip->sw_if_index);
2041 }
2042 
2043 static int
2045  ikev2_child_sa_t * child)
2046 {
2048 
2049  clib_memset (&a, 0, sizeof (a));
2050 
2051  if (sa->is_initiator)
2052  {
2053  ip46_address_set_ip4 (&a.local_ip, &sa->iaddr);
2055  }
2056  else
2057  {
2058  ip46_address_set_ip4 (&a.local_ip, &sa->raddr);
2060  }
2061 
2062  a.remote_sa_id = child->remote_sa_id;
2063  a.local_sa_id = child->local_sa_id;
2064  a.sw_if_index = (sa->is_tun_itf_set ? sa->tun_itf : ~0);
2065 
2067  sizeof (a));
2068  return 0;
2069 }
2070 
2071 static u32
2072 ikev2_generate_message (ikev2_sa_t * sa, ike_header_t * ike, void *user,
2073  udp_header_t * udp)
2074 {
2075  v8 *integ = 0;
2076  ike_payload_header_t *ph;
2077  u16 plen;
2078  u32 tlen = 0;
2079 
2080  ikev2_sa_transform_t *tr_encr, *tr_integ;
2081  tr_encr =
2082  ikev2_sa_get_td_for_type (sa->r_proposals, IKEV2_TRANSFORM_TYPE_ENCR);
2083  tr_integ =
2084  ikev2_sa_get_td_for_type (sa->r_proposals, IKEV2_TRANSFORM_TYPE_INTEG);
2085 
2086  ikev2_payload_chain_t *chain = 0;
2087  ikev2_payload_new_chain (chain);
2088 
2089  if (ike->exchange == IKEV2_EXCHANGE_SA_INIT)
2090  {
2091  if (sa->r_proposals == 0)
2092  {
2093  ikev2_payload_add_notify (chain,
2094  IKEV2_NOTIFY_MSG_NO_PROPOSAL_CHOSEN, 0);
2096  }
2097  else if (sa->dh_group == IKEV2_TRANSFORM_DH_TYPE_NONE)
2098  {
2099  u8 *data = vec_new (u8, 2);
2100  ikev2_sa_transform_t *tr_dh;
2101  tr_dh =
2103  IKEV2_TRANSFORM_TYPE_DH);
2104  ASSERT (tr_dh && tr_dh->dh_type);
2105 
2106  data[0] = (tr_dh->dh_type >> 8) & 0xff;
2107  data[1] = (tr_dh->dh_type) & 0xff;
2108 
2109  ikev2_payload_add_notify (chain,
2110  IKEV2_NOTIFY_MSG_INVALID_KE_PAYLOAD,
2111  data);
2112  vec_free (data);
2114  }
2115  else if (sa->state == IKEV2_STATE_NOTIFY_AND_DELETE)
2116  {
2117  u8 *data = vec_new (u8, 1);
2118 
2119  data[0] = sa->unsupported_cp;
2120  ikev2_payload_add_notify (chain,
2121  IKEV2_NOTIFY_MSG_UNSUPPORTED_CRITICAL_PAYLOAD,
2122  data);
2123  vec_free (data);
2124  }
2125  else
2126  {
2127  ASSERT (udp);
2128 
2129  ike->rspi = clib_host_to_net_u64 (sa->rspi);
2130  ikev2_payload_add_sa (chain, sa->r_proposals);
2131  ikev2_payload_add_ke (chain, sa->dh_group, sa->r_dh_data);
2132  ikev2_payload_add_nonce (chain, sa->r_nonce);
2133 
2134  u8 *nat_detection_sha1 =
2135  ikev2_compute_nat_sha1 (clib_host_to_net_u64 (sa->ispi),
2136  clib_host_to_net_u64 (sa->rspi),
2137  sa->raddr.as_u32,
2138  udp->dst_port);
2139  ikev2_payload_add_notify (chain,
2140  IKEV2_NOTIFY_MSG_NAT_DETECTION_SOURCE_IP,
2141  nat_detection_sha1);
2142  vec_free (nat_detection_sha1);
2143  nat_detection_sha1 =
2144  ikev2_compute_nat_sha1 (clib_host_to_net_u64 (sa->ispi),
2145  clib_host_to_net_u64 (sa->rspi),
2146  sa->iaddr.as_u32, udp->src_port);
2147  ikev2_payload_add_notify (chain,
2148  IKEV2_NOTIFY_MSG_NAT_DETECTION_DESTINATION_IP,
2149  nat_detection_sha1);
2150  vec_free (nat_detection_sha1);
2151  }
2152  }
2153  else if (ike->exchange == IKEV2_EXCHANGE_IKE_AUTH)
2154  {
2155  if (sa->state == IKEV2_STATE_AUTHENTICATED)
2156  {
2159  ikev2_payload_add_auth (chain, &sa->r_auth);
2160  ikev2_payload_add_sa (chain, sa->childs[0].r_proposals);
2163  }
2164  else if (sa->state == IKEV2_STATE_AUTH_FAILED)
2165  {
2166  ikev2_payload_add_notify (chain,
2167  IKEV2_NOTIFY_MSG_AUTHENTICATION_FAILED,
2168  0);
2170  }
2171  else if (sa->state == IKEV2_STATE_TS_UNACCEPTABLE)
2172  {
2173  ikev2_payload_add_notify (chain, IKEV2_NOTIFY_MSG_TS_UNACCEPTABLE,
2174  0);
2176  ikev2_payload_add_auth (chain, &sa->r_auth);
2177  }
2178  else if (sa->state == IKEV2_STATE_NO_PROPOSAL_CHOSEN)
2179  {
2180  ikev2_payload_add_notify (chain,
2181  IKEV2_NOTIFY_MSG_NO_PROPOSAL_CHOSEN, 0);
2183  ikev2_payload_add_auth (chain, &sa->r_auth);
2186  }
2187  else if (sa->state == IKEV2_STATE_NOTIFY_AND_DELETE)
2188  {
2189  u8 *data = vec_new (u8, 1);
2190 
2191  data[0] = sa->unsupported_cp;
2192  ikev2_payload_add_notify (chain,
2193  IKEV2_NOTIFY_MSG_UNSUPPORTED_CRITICAL_PAYLOAD,
2194  data);
2195  vec_free (data);
2196  }
2197  else if (sa->state == IKEV2_STATE_SA_INIT)
2198  {
2201  ikev2_payload_add_auth (chain, &sa->i_auth);
2202  ikev2_payload_add_sa (chain, sa->childs[0].i_proposals);
2205  ikev2_payload_add_notify (chain, IKEV2_NOTIFY_MSG_INITIAL_CONTACT,
2206  0);
2207  }
2208  else
2209  {
2211  goto done;
2212  }
2213  }
2214  else if (ike->exchange == IKEV2_EXCHANGE_INFORMATIONAL)
2215  {
2216  /* if pending delete */
2217  if (sa->del)
2218  {
2219  if (sa->del[0].protocol_id == IKEV2_PROTOCOL_IKE)
2220  {
2221  if (sa->is_initiator)
2222  ikev2_payload_add_delete (chain, sa->del);
2223 
2224  /* The response to a request that deletes the IKE SA is an empty
2225  INFORMATIONAL response. */
2227  }
2228  /* The response to a request that deletes ESP or AH SAs will contain
2229  delete payloads for the paired SAs going in the other direction. */
2230  else
2231  {
2232  ikev2_payload_add_delete (chain, sa->del);
2233  }
2234  vec_free (sa->del);
2235  sa->del = 0;
2236  }
2237  /* received N(AUTHENTICATION_FAILED) */
2238  else if (sa->state == IKEV2_STATE_AUTH_FAILED)
2239  {
2241  goto done;
2242  }
2243  /* received unsupported critical payload */
2244  else if (sa->unsupported_cp)
2245  {
2246  u8 *data = vec_new (u8, 1);
2247 
2248  data[0] = sa->unsupported_cp;
2249  ikev2_payload_add_notify (chain,
2250  IKEV2_NOTIFY_MSG_UNSUPPORTED_CRITICAL_PAYLOAD,
2251  data);
2252  vec_free (data);
2253  sa->unsupported_cp = 0;
2254  }
2255  /* else send empty response */
2256  }
2257  else if (ike->exchange == IKEV2_EXCHANGE_CREATE_CHILD_SA)
2258  {
2259  if (sa->is_initiator)
2260  {
2261 
2262  ikev2_sa_proposal_t *proposals = (ikev2_sa_proposal_t *) user;
2263  ikev2_notify_t notify;
2264  u8 *data = vec_new (u8, 4);
2265  clib_memset (&notify, 0, sizeof (notify));
2267  notify.spi = sa->childs[0].i_proposals->spi;
2268  *(u32 *) data = clib_host_to_net_u32 (notify.spi);
2269 
2270  ikev2_payload_add_sa (chain, proposals);
2271  ikev2_payload_add_nonce (chain, sa->i_nonce);
2274  ikev2_payload_add_notify_2 (chain, IKEV2_NOTIFY_MSG_REKEY_SA, data,
2275  &notify);
2276 
2277  vec_free (data);
2278  }
2279  else
2280  {
2281  if (vec_len (sa->rekey) > 0)
2282  {
2283  ikev2_payload_add_sa (chain, sa->rekey[0].r_proposal);
2284  ikev2_payload_add_nonce (chain, sa->r_nonce);
2285  ikev2_payload_add_ts (chain, sa->rekey[0].tsi,
2287  ikev2_payload_add_ts (chain, sa->rekey[0].tsr,
2289  vec_del1 (sa->rekey, 0);
2290  }
2291  else if (sa->unsupported_cp)
2292  {
2293  u8 *data = vec_new (u8, 1);
2294 
2295  data[0] = sa->unsupported_cp;
2296  ikev2_payload_add_notify (chain,
2297  IKEV2_NOTIFY_MSG_UNSUPPORTED_CRITICAL_PAYLOAD,
2298  data);
2299  vec_free (data);
2300  sa->unsupported_cp = 0;
2301  }
2302  else
2303  {
2304  ikev2_payload_add_notify (chain,
2305  IKEV2_NOTIFY_MSG_NO_ADDITIONAL_SAS,
2306  0);
2307  }
2308  }
2309  }
2310 
2311  /* IKEv2 header */
2312  ike->version = IKE_VERSION_2;
2313  ike->nextpayload = IKEV2_PAYLOAD_SK;
2314  tlen = sizeof (*ike);
2315  if (sa->is_initiator)
2316  {
2317  ike->flags = IKEV2_HDR_FLAG_INITIATOR;
2318  sa->last_init_msg_id = clib_net_to_host_u32 (ike->msgid);
2319  }
2320  else
2321  {
2322  ike->flags = IKEV2_HDR_FLAG_RESPONSE;
2323  }
2324 
2325 
2326  if (ike->exchange == IKEV2_EXCHANGE_SA_INIT)
2327  {
2328  tlen += vec_len (chain->data);
2329  ike->nextpayload = chain->first_payload_type;
2330  ike->length = clib_host_to_net_u32 (tlen);
2331  clib_memcpy_fast (ike->payload, chain->data, vec_len (chain->data));
2332 
2333  /* store whole IKE payload - needed for PSK auth */
2335  vec_add (sa->last_sa_init_res_packet_data, ike, tlen);
2336  }
2337  else
2338  {
2340  ikev2_payload_chain_add_padding (chain, tr_encr->block_size);
2341 
2342  /* SK payload */
2343  plen = sizeof (*ph);
2344  ph = (ike_payload_header_t *) & ike->payload[0];
2345  ph->nextpayload = chain->first_payload_type;
2346  ph->flags = 0;
2347  int is_aead =
2348  tr_encr->encr_type == IKEV2_TRANSFORM_ENCR_TYPE_AES_GCM_16;
2349  int iv_len = is_aead ? IKEV2_GCM_IV_SIZE : tr_encr->block_size;
2350  plen += vec_len (chain->data) + iv_len;
2351 
2352  /* add space for hmac/tag */
2353  if (tr_integ)
2354  plen += tr_integ->key_trunc;
2355  else
2356  plen += IKEV2_GCM_ICV_SIZE;
2357  tlen += plen;
2358 
2359  /* payload and total length */
2360  ph->length = clib_host_to_net_u16 (plen);
2361  ike->length = clib_host_to_net_u32 (tlen);
2362 
2363  if (is_aead)
2364  {
2365  ikev2_encrypt_aead_data (ptd, sa, tr_encr, chain->data,
2366  ph->payload, (u8 *) ike,
2367  sizeof (*ike) + sizeof (*ph),
2368  ph->payload + plen - sizeof (*ph) -
2370  }
2371  else
2372  {
2373  ikev2_encrypt_data (ptd, sa, tr_encr, chain->data, ph->payload);
2374  integ =
2375  ikev2_calc_integr (tr_integ,
2376  sa->is_initiator ? sa->sk_ai : sa->sk_ar,
2377  (u8 *) ike, tlen - tr_integ->key_trunc);
2378  clib_memcpy_fast (ike->payload + tlen - tr_integ->key_trunc -
2379  sizeof (*ike), integ, tr_integ->key_trunc);
2380  }
2381 
2382  /* store whole IKE payload - needed for retransmit */
2384  vec_add (sa->last_res_packet_data, ike, tlen);
2385  }
2386 
2387 done:
2389  vec_free (integ);
2390  return tlen;
2391 }
2392 
2393 static u32
2394 ikev2_retransmit_sa_init (ike_header_t * ike,
2396 {
2397  ikev2_main_t *km = &ikev2_main;
2398  ikev2_sa_t *sa;
2399  u32 thread_index = vlib_get_thread_index ();
2400 
2401  /* *INDENT-OFF* */
2402  pool_foreach (sa, km->per_thread_data[thread_index].sas, ({
2403  if (sa->ispi == clib_net_to_host_u64(ike->ispi) &&
2404  sa->iaddr.as_u32 == iaddr.as_u32 &&
2405  sa->raddr.as_u32 == raddr.as_u32)
2406  {
2407  int p = 0;
2408  u8 payload = ike->nextpayload;
2409 
2410  while (p < rlen && payload!= IKEV2_PAYLOAD_NONE) {
2411  ike_payload_header_t * ikep = (ike_payload_header_t *) &ike->payload[p];
2412  u32 plen = clib_net_to_host_u16(ikep->length);
2413 
2414  if (plen < sizeof(ike_payload_header_t))
2415  return -1;
2416 
2417  if (payload == IKEV2_PAYLOAD_NONCE)
2418  {
2419  if (!memcmp(sa->i_nonce, ikep->payload, plen - sizeof(*ikep)))
2420  {
2421  /* req is retransmit */
2422  if (sa->state == IKEV2_STATE_SA_INIT)
2423  {
2424  ike_header_t * tmp = (ike_header_t*)sa->last_sa_init_res_packet_data;
2425  u32 slen = clib_net_to_host_u32(tmp->length);
2426  ike->ispi = tmp->ispi;
2427  ike->rspi = tmp->rspi;
2428  ike->nextpayload = tmp->nextpayload;
2429  ike->version = tmp->version;
2430  ike->exchange = tmp->exchange;
2431  ike->flags = tmp->flags;
2432  ike->msgid = tmp->msgid;
2433  ike->length = tmp->length;
2434  clib_memcpy_fast(ike->payload, tmp->payload, slen - sizeof(*ike));
2435  ikev2_elog_uint_peers (IKEV2_LOG_DEBUG,
2436  "ispi %lx IKE_SA_INIT retransmit "
2437  "from %d.%d.%d.%d to %d.%d.%d.%d",
2438  ike->ispi,
2439  raddr.as_u32, iaddr.as_u32);
2440  return slen;
2441  }
2442  /* else ignore req */
2443  else
2444  {
2445  ikev2_elog_uint_peers (IKEV2_LOG_DEBUG,
2446  "ispi %lx IKE_SA_INIT ignore "
2447  "from %d.%d.%d.%d to %d.%d.%d.%d",
2448  ike->ispi,
2449  raddr.as_u32, iaddr.as_u32);
2450  return ~0;
2451  }
2452  }
2453  }
2454  payload = ikep->nextpayload;
2455  p+=plen;
2456  }
2457  }
2458  }));
2459  /* *INDENT-ON* */
2460 
2461  /* req is not retransmit */
2462  return 0;
2463 }
2464 
2465 static u32
2466 ikev2_retransmit_resp (ikev2_sa_t * sa, ike_header_t * ike, u32 rlen)
2467 {
2468  u32 msg_id = clib_net_to_host_u32 (ike->msgid);
2469 
2470  /* new req */
2471  if (msg_id > sa->last_msg_id)
2472  {
2473  sa->last_msg_id = msg_id;
2474  return 0;
2475  }
2476 
2477  /* retransmitted req */
2478  if (msg_id == sa->last_msg_id)
2479  {
2480  ike_header_t *tmp = (ike_header_t *) sa->last_res_packet_data;
2481  u32 slen = clib_net_to_host_u32 (tmp->length);
2482  ike->ispi = tmp->ispi;
2483  ike->rspi = tmp->rspi;
2484  ike->nextpayload = tmp->nextpayload;
2485  ike->version = tmp->version;
2486  ike->exchange = tmp->exchange;
2487  ike->flags = tmp->flags;
2488  ike->msgid = tmp->msgid;
2489  ike->length = tmp->length;
2490  clib_memcpy_fast (ike->payload, tmp->payload, slen - sizeof (*ike));
2491  ikev2_elog_uint_peers (IKEV2_LOG_DEBUG, "IKE retransmit msgid %d",
2492  msg_id, sa->raddr.as_u32, sa->iaddr.as_u32);
2493  return slen;
2494  }
2495 
2496  /* old req ignore */
2497  ikev2_elog_uint_peers (IKEV2_LOG_DEBUG, "IKE req ignore msgid %d",
2498  msg_id, sa->raddr.as_u32, sa->iaddr.as_u32);
2499  return ~0;
2500 }
2501 
2502 static void
2504 {
2505  ikev2_main_t *km = &ikev2_main;
2507  sa->profile_index = ~0;
2508 }
2509 
2510 static void
2512 {
2513  ikev2_main_t *km = &ikev2_main;
2514  uword *p = hash_get (km->sa_by_ispi, *ispi);
2515  if (p)
2516  {
2517  ikev2_sa_t *sai = pool_elt_at_index (km->sais, p[0]);
2518  hash_unset (km->sa_by_ispi, sai->ispi);
2519  ikev2_sa_free_all_vec (sai);
2520  pool_put (km->sais, sai);
2521  }
2522 }
2523 
2524 static void
2526 {
2528  sizeof (ispi));
2529 }
2530 
2531 static uword
2534 {
2535  u32 n_left_from, *from, *to_next;
2536  ikev2_next_t next_index;
2537  ikev2_main_t *km = &ikev2_main;
2538  u32 thread_index = vlib_get_thread_index ();
2539 
2540  from = vlib_frame_vector_args (frame);
2541  n_left_from = frame->n_vectors;
2542  next_index = node->cached_next_index;
2543 
2544  while (n_left_from > 0)
2545  {
2546  u32 n_left_to_next;
2547 
2548  vlib_get_next_frame (vm, node, next_index, to_next, n_left_to_next);
2549 
2550  while (n_left_from > 0 && n_left_to_next > 0)
2551  {
2552  u32 bi0;
2553  vlib_buffer_t *b0;
2554  u32 next0 = IKEV2_NEXT_ERROR_DROP;
2555  u32 sw_if_index0;
2556  ip4_header_t *ip40;
2557  udp_header_t *udp0;
2558  ike_header_t *ike0;
2559  ikev2_sa_t *sa0 = 0;
2560  ikev2_sa_t sa; /* temporary store for SA */
2561  u32 rlen, slen = 0;
2562  int is_req = 0, has_non_esp_marker = 0;
2563 
2564  /* speculatively enqueue b0 to the current next frame */
2565  bi0 = from[0];
2566  to_next[0] = bi0;
2567  from += 1;
2568  to_next += 1;
2569  n_left_from -= 1;
2570  n_left_to_next -= 1;
2571 
2572  b0 = vlib_get_buffer (vm, bi0);
2573 
2574  if (b0->punt_reason == ipsec_punt_reason[IPSEC_PUNT_IP4_SPI_UDP_0])
2575  {
2576  u8 *ptr = vlib_buffer_get_current (b0);
2577  ip40 = (ip4_header_t *) ptr;
2578  ptr += sizeof (*ip40);
2579  udp0 = (udp_header_t *) ptr;
2580  ptr += sizeof (*udp0);
2581  ike0 = (ike_header_t *) ptr;
2582  }
2583  else
2584  {
2585  ike0 = vlib_buffer_get_current (b0);
2586  vlib_buffer_advance (b0, -sizeof (*udp0));
2587  udp0 = vlib_buffer_get_current (b0);
2588  vlib_buffer_advance (b0, -sizeof (*ip40));
2589  ip40 = vlib_buffer_get_current (b0);
2590  }
2591 
2592  rlen = b0->current_length - sizeof (*ip40) - sizeof (*udp0);
2593 
2594  /* check for non-esp marker */
2595  if (*((u32 *) ike0) == 0)
2596  {
2597  ike0 =
2598  (ike_header_t *) ((u8 *) ike0 +
2599  sizeof (ikev2_non_esp_marker));
2600  rlen -= sizeof (ikev2_non_esp_marker);
2601  has_non_esp_marker = 1;
2602  }
2603 
2604  if (clib_net_to_host_u32 (ike0->length) != rlen)
2605  {
2607  IKEV2_ERROR_BAD_LENGTH, 1);
2608  goto dispatch0;
2609  }
2610 
2611  if (ike0->version != IKE_VERSION_2)
2612  {
2614  IKEV2_ERROR_NOT_IKEV2, 1);
2615  goto dispatch0;
2616  }
2617 
2618  if (ike0->exchange == IKEV2_EXCHANGE_SA_INIT)
2619  {
2620  sa0 = &sa;
2621  clib_memset (sa0, 0, sizeof (*sa0));
2622 
2623  if (ike0->flags & IKEV2_HDR_FLAG_INITIATOR)
2624  {
2625  if (ike0->rspi == 0)
2626  {
2627  sa0->raddr.as_u32 = ip40->dst_address.as_u32;
2628  sa0->iaddr.as_u32 = ip40->src_address.as_u32;
2629  sa0->dst_port = clib_net_to_host_u16 (udp0->src_port);
2630 
2631  slen =
2632  ikev2_retransmit_sa_init (ike0, sa0->iaddr,
2633  sa0->raddr, rlen);
2634  if (slen)
2635  {
2637  ~0 ==
2638  slen ?
2639  IKEV2_ERROR_IKE_SA_INIT_IGNORE
2640  :
2641  IKEV2_ERROR_IKE_SA_INIT_RETRANSMIT,
2642  1);
2643  goto dispatch0;
2644  }
2645 
2646  ikev2_process_sa_init_req (vm, sa0, ike0, udp0, rlen);
2647 
2648  if (sa0->state == IKEV2_STATE_SA_INIT)
2649  {
2651  sa0->r_proposals =
2655  }
2656 
2657  if (sa0->state == IKEV2_STATE_SA_INIT
2659  {
2660  slen = ikev2_generate_message (sa0, ike0, 0, udp0);
2661  }
2662 
2663  if (sa0->state == IKEV2_STATE_SA_INIT)
2664  {
2665  /* add SA to the pool */
2666  pool_get (km->per_thread_data[thread_index].sas,
2667  sa0);
2668  clib_memcpy_fast (sa0, &sa, sizeof (*sa0));
2669  ikev2_init_sa (vm, sa0);
2670  hash_set (km->
2671  per_thread_data[thread_index].sa_by_rspi,
2672  sa0->rspi,
2673  sa0 -
2674  km->per_thread_data[thread_index].sas);
2675  }
2676  else
2677  {
2678  ikev2_sa_free_all_vec (sa0);
2679  }
2680  }
2681  }
2682  else //received sa_init without initiator flag
2683  {
2684  sa0->raddr.as_u32 = ip40->src_address.as_u32;
2685  sa0->iaddr.as_u32 = ip40->dst_address.as_u32;
2686  ikev2_process_sa_init_resp (vm, sa0, ike0, udp0, rlen);
2687 
2688  if (sa0->state == IKEV2_STATE_SA_INIT)
2689  {
2690  is_req = 1;
2691  ike0->exchange = IKEV2_EXCHANGE_IKE_AUTH;
2692  uword *p = hash_get (km->sa_by_ispi, sa0->ispi);
2693  if (p)
2694  {
2695  ikev2_sa_t *sai =
2696  pool_elt_at_index (km->sais, p[0]);
2697 
2699  (&sai->init_response_received, 0, 1))
2700  {
2701  ikev2_complete_sa_data (sa0, sai);
2702  ikev2_calc_keys (sa0);
2703  ikev2_sa_auth_init (sa0);
2704  slen =
2705  ikev2_generate_message (sa0, ike0, 0, udp0);
2706  }
2707  else
2708  {
2709  /* we've already processed sa-init response */
2710  sa0->state = IKEV2_STATE_UNKNOWN;
2711  }
2712  }
2713  }
2714 
2715  if (sa0->state == IKEV2_STATE_SA_INIT)
2716  {
2717  /* add SA to the pool */
2718  pool_get (km->per_thread_data[thread_index].sas, sa0);
2719  clib_memcpy_fast (sa0, &sa, sizeof (*sa0));
2720  hash_set (km->per_thread_data[thread_index].sa_by_rspi,
2721  sa0->rspi,
2722  sa0 - km->per_thread_data[thread_index].sas);
2723  }
2724  else
2725  {
2726  ikev2_sa_free_all_vec (sa0);
2727  }
2728  }
2729  }
2730  else if (ike0->exchange == IKEV2_EXCHANGE_IKE_AUTH)
2731  {
2732  uword *p;
2733  p = hash_get (km->per_thread_data[thread_index].sa_by_rspi,
2734  clib_net_to_host_u64 (ike0->rspi));
2735  if (p)
2736  {
2737  sa0 =
2738  pool_elt_at_index (km->per_thread_data[thread_index].sas,
2739  p[0]);
2740 
2741  slen = ikev2_retransmit_resp (sa0, ike0, rlen);
2742  if (slen)
2743  {
2745  ~0 ==
2746  slen ?
2747  IKEV2_ERROR_IKE_REQ_IGNORE
2748  :
2749  IKEV2_ERROR_IKE_REQ_RETRANSMIT,
2750  1);
2751  goto dispatch0;
2752  }
2753 
2754  sa0->dst_port = clib_net_to_host_u16 (udp0->src_port);
2755  ikev2_process_auth_req (vm, sa0, ike0, rlen);
2756  ikev2_sa_auth (sa0);
2757  if (sa0->state == IKEV2_STATE_AUTHENTICATED)
2758  {
2760  ikev2_sa_match_ts (sa0);
2761  if (sa0->state != IKEV2_STATE_TS_UNACCEPTABLE)
2762  ikev2_create_tunnel_interface (vm, thread_index, sa0,
2763  &sa0->childs[0],
2764  p[0], 0, 0);
2765  }
2766 
2767  if (sa0->is_initiator)
2768  {
2769  ikev2_del_sa_init (sa0->ispi);
2770  }
2771  else
2772  {
2773  slen = ikev2_generate_message (sa0, ike0, 0, udp0);
2774  }
2775  }
2776  }
2777  else if (ike0->exchange == IKEV2_EXCHANGE_INFORMATIONAL)
2778  {
2779  uword *p;
2780  p = hash_get (km->per_thread_data[thread_index].sa_by_rspi,
2781  clib_net_to_host_u64 (ike0->rspi));
2782  if (p)
2783  {
2784  sa0 =
2785  pool_elt_at_index (km->per_thread_data[thread_index].sas,
2786  p[0]);
2787 
2788  slen = ikev2_retransmit_resp (sa0, ike0, rlen);
2789  if (slen)
2790  {
2792  ~0 ==
2793  slen ?
2794  IKEV2_ERROR_IKE_REQ_IGNORE
2795  :
2796  IKEV2_ERROR_IKE_REQ_RETRANSMIT,
2797  1);
2798  goto dispatch0;
2799  }
2800 
2801  ikev2_process_informational_req (vm, sa0, ike0, rlen);
2802  if (sa0->del)
2803  {
2804  if (sa0->del[0].protocol_id != IKEV2_PROTOCOL_IKE)
2805  {
2806  ikev2_delete_t *d, *tmp, *resp = 0;
2807  vec_foreach (d, sa0->del)
2808  {
2809  ikev2_child_sa_t *ch_sa;
2810  ch_sa = ikev2_sa_get_child (sa0, d->spi,
2811  d->protocol_id,
2812  !sa0->is_initiator);
2813  if (ch_sa)
2814  {
2816  sa0, ch_sa);
2817  if (!sa0->is_initiator)
2818  {
2819  vec_add2 (resp, tmp, 1);
2820  tmp->protocol_id = d->protocol_id;
2821  tmp->spi = ch_sa->r_proposals[0].spi;
2822  }
2823  ikev2_sa_del_child_sa (sa0, ch_sa);
2824  }
2825  }
2826  if (!sa0->is_initiator)
2827  {
2828  vec_free (sa0->del);
2829  sa0->del = resp;
2830  }
2831  }
2832  }
2833  if (!(ike0->flags & IKEV2_HDR_FLAG_RESPONSE))
2834  {
2835  ike0->flags |= IKEV2_HDR_FLAG_RESPONSE;
2836  slen = ikev2_generate_message (sa0, ike0, 0, udp0);
2837  }
2838  }
2839  }
2840  else if (ike0->exchange == IKEV2_EXCHANGE_CREATE_CHILD_SA)
2841  {
2842  uword *p;
2843  p = hash_get (km->per_thread_data[thread_index].sa_by_rspi,
2844  clib_net_to_host_u64 (ike0->rspi));
2845  if (p)
2846  {
2847  sa0 =
2848  pool_elt_at_index (km->per_thread_data[thread_index].sas,
2849  p[0]);
2850 
2851  slen = ikev2_retransmit_resp (sa0, ike0, rlen);
2852  if (slen)
2853  {
2855  ~0 ==
2856  slen ?
2857  IKEV2_ERROR_IKE_REQ_IGNORE
2858  :
2859  IKEV2_ERROR_IKE_REQ_RETRANSMIT,
2860  1);
2861  goto dispatch0;
2862  }
2863 
2864  ikev2_process_create_child_sa_req (vm, sa0, ike0, rlen);
2865  if (sa0->rekey)
2866  {
2867  if (sa0->rekey[0].protocol_id != IKEV2_PROTOCOL_IKE)
2868  {
2869  if (sa0->childs)
2871  ikev2_child_sa_t *child;
2872  vec_add2 (sa0->childs, child, 1);
2873  clib_memset (child, 0, sizeof (*child));
2874  child->r_proposals = sa0->rekey[0].r_proposal;
2875  child->i_proposals = sa0->rekey[0].i_proposal;
2876  child->tsi = sa0->rekey[0].tsi;
2877  child->tsr = sa0->rekey[0].tsr;
2878  ikev2_create_tunnel_interface (vm, thread_index,
2879  sa0, child, p[0],
2880  child - sa0->childs,
2881  1);
2882  }
2883  if (sa0->is_initiator)
2884  {
2885  vec_free (sa0->rekey);
2886  }
2887  else
2888  {
2889  slen = ikev2_generate_message (sa0, ike0, 0, udp0);
2890  }
2891  }
2892  }
2893  }
2894  else
2895  {
2896  ikev2_elog_uint_peers (IKEV2_LOG_WARNING, "IKEv2 exchange %d "
2897  "received from %d.%d.%d.%d to %d.%d.%d.%d",
2898  ike0->exchange,
2899  ip40->src_address.as_u32,
2900  ip40->dst_address.as_u32);
2901  }
2902 
2903  dispatch0:
2904  /* if we are sending packet back, rewrite headers */
2905  if (slen && ~0 != slen)
2906  {
2907  next0 = IKEV2_NEXT_IP4_LOOKUP;
2908  if (sa0->is_initiator)
2909  {
2910  ip40->dst_address.as_u32 = sa0->raddr.as_u32;
2911  ip40->src_address.as_u32 = sa0->iaddr.as_u32;
2912  }
2913  else
2914  {
2915  ip40->dst_address.as_u32 = sa0->iaddr.as_u32;
2916  ip40->src_address.as_u32 = sa0->raddr.as_u32;
2917  }
2918 
2919  if (is_req)
2920  {
2921  udp0->dst_port = udp0->src_port =
2922  clib_net_to_host_u16 (ikev2_get_port (sa0));
2923 
2924  if (udp0->dst_port == clib_net_to_host_u16 (IKEV2_PORT_NATT)
2925  && sa0->natt)
2926  {
2927  if (!has_non_esp_marker)
2928  slen = ikev2_insert_non_esp_marker (ike0, slen);
2929  }
2930  }
2931  else
2932  {
2933  if (has_non_esp_marker)
2934  slen += sizeof (ikev2_non_esp_marker);
2935 
2936  u16 tp = udp0->dst_port;
2937  udp0->dst_port = udp0->src_port;
2938  udp0->src_port = tp;
2939  }
2940 
2941  udp0->length =
2942  clib_host_to_net_u16 (slen + sizeof (udp_header_t));
2943  udp0->checksum = 0;
2944  b0->current_length =
2945  slen + sizeof (ip4_header_t) + sizeof (udp_header_t);
2946  ip40->length = clib_host_to_net_u16 (b0->current_length);
2947  ip40->checksum = ip4_header_checksum (ip40);
2948  }
2949  /* delete sa */
2950  if (sa0 && (sa0->state == IKEV2_STATE_DELETED ||
2952  {
2954 
2955  vec_foreach (c, sa0->childs)
2957 
2958  ikev2_delete_sa (sa0);
2959  }
2960  sw_if_index0 = vnet_buffer (b0)->sw_if_index[VLIB_RX];
2961 
2963  && (b0->flags & VLIB_BUFFER_IS_TRACED)))
2964  {
2965  ikev2_trace_t *t = vlib_add_trace (vm, node, b0, sizeof (*t));
2966  t->sw_if_index = sw_if_index0;
2967  t->next_index = next0;
2968  }
2969 
2970  vlib_validate_buffer_enqueue_x1 (vm, node, next_index, to_next,
2971  n_left_to_next, bi0, next0);
2972  }
2973 
2974  vlib_put_next_frame (vm, node, next_index, n_left_to_next);
2975  }
2976 
2978  IKEV2_ERROR_PROCESSED, frame->n_vectors);
2979  return frame->n_vectors;
2980 }
2981 
2982 /* *INDENT-OFF* */
2983 VLIB_REGISTER_NODE (ikev2_node,static) = {
2984  .function = ikev2_node_fn,
2985  .name = "ikev2",
2986  .vector_size = sizeof (u32),
2987  .format_trace = format_ikev2_trace,
2989 
2990  .n_errors = ARRAY_LEN(ikev2_error_strings),
2991  .error_strings = ikev2_error_strings,
2992 
2993  .n_next_nodes = IKEV2_N_NEXT,
2994 
2995  .next_nodes = {
2996  [IKEV2_NEXT_IP4_LOOKUP] = "ip4-lookup",
2997  [IKEV2_NEXT_ERROR_DROP] = "error-drop",
2998  },
2999 };
3000 /* *INDENT-ON* */
3001 
3002 // set ikev2 proposals when vpp is used as initiator
3003 static clib_error_t *
3005  ikev2_transforms_set * ts,
3006  ikev2_sa_proposal_t ** proposals, int is_ike)
3007 {
3008  clib_error_t *r;
3009  ikev2_main_t *km = &ikev2_main;
3010  ikev2_sa_proposal_t *proposal;
3011  vec_add2 (*proposals, proposal, 1);
3013  int error;
3014 
3015  /* Encryption */
3016  error = 1;
3018  {
3019  if (td->type == IKEV2_TRANSFORM_TYPE_ENCR
3020  && td->encr_type == ts->crypto_alg
3021  && td->key_len == ts->crypto_key_size / 8)
3022  {
3023  u16 attr[2];
3024  attr[0] = clib_host_to_net_u16 (14 | (1 << 15));
3025  attr[1] = clib_host_to_net_u16 (td->key_len << 3);
3026  vec_add (td->attrs, (u8 *) attr, 4);
3027  vec_add1 (proposal->transforms, *td);
3028  td->attrs = 0;
3029 
3030  error = 0;
3031  break;
3032  }
3033  }
3034  if (error)
3035  {
3036  r = clib_error_return (0, "Unsupported algorithm");
3037  return r;
3038  }
3039 
3040  if (IKEV2_TRANSFORM_INTEG_TYPE_NONE != ts->integ_alg)
3041  {
3042  /* Integrity */
3043  error = 1;
3045  {
3046  if (td->type == IKEV2_TRANSFORM_TYPE_INTEG
3047  && td->integ_type == ts->integ_alg)
3048  {
3049  vec_add1 (proposal->transforms, *td);
3050  error = 0;
3051  break;
3052  }
3053  }
3054  if (error)
3055  {
3057  ("Didn't find any supported algorithm for IKEV2_TRANSFORM_TYPE_INTEG");
3058  r = clib_error_return (0, "Unsupported algorithm");
3059  return r;
3060  }
3061  }
3062 
3063  /* PRF */
3064  if (is_ike)
3065  {
3066  error = 1;
3068  {
3069  if (td->type == IKEV2_TRANSFORM_TYPE_PRF
3070  && td->prf_type == IKEV2_TRANSFORM_PRF_TYPE_PRF_HMAC_SHA2_256)
3071  {
3072  vec_add1 (proposal->transforms, *td);
3073  error = 0;
3074  break;
3075  }
3076  }
3077  if (error)
3078  {
3079  r = clib_error_return (0, "Unsupported algorithm");
3080  return r;
3081  }
3082  }
3083 
3084  /* DH */
3085  if (is_ike)
3086  {
3087  error = 1;
3089  {
3090  if (td->type == IKEV2_TRANSFORM_TYPE_DH && td->dh_type == ts->dh_type)
3091  {
3092  vec_add1 (proposal->transforms, *td);
3093  if (is_ike)
3094  {
3095  sa->dh_group = td->dh_type;
3096  }
3097  error = 0;
3098  break;
3099  }
3100  }
3101  if (error)
3102  {
3103  r = clib_error_return (0, "Unsupported algorithm");
3104  return r;
3105  }
3106  }
3107 
3108  if (!is_ike)
3109  {
3110  error = 1;
3112  {
3113  if (td->type == IKEV2_TRANSFORM_TYPE_ESN)
3114  {
3115  vec_add1 (proposal->transforms, *td);
3116  error = 0;
3117  }
3118  }
3119  if (error)
3120  {
3121  r = clib_error_return (0, "Unsupported algorithm");
3122  return r;
3123  }
3124  }
3125 
3126 
3127  return 0;
3128 }
3129 
3130 static ikev2_profile_t *
3132 {
3133  ikev2_main_t *km = &ikev2_main;
3134  uword *p;
3135 
3136  p = mhash_get (&km->profile_index_by_name, name);
3137  if (!p)
3138  return 0;
3139 
3140  return pool_elt_at_index (km->profiles, p[0]);
3141 }
3142 
3143 
3144 static void
3147 {
3148  ip4_header_t *ip40;
3149  udp_header_t *udp0;
3150  vlib_buffer_t *b0;
3151  vlib_frame_t *f;
3152  u32 *to_next;
3153 
3154  b0 = vlib_get_buffer (vm, bi0);
3155  vlib_buffer_advance (b0, -sizeof (udp_header_t));
3156  udp0 = vlib_buffer_get_current (b0);
3157  vlib_buffer_advance (b0, -sizeof (ip4_header_t));
3158  ip40 = vlib_buffer_get_current (b0);
3159 
3160 
3161  ip40->ip_version_and_header_length = 0x45;
3162  ip40->tos = 0;
3163  ip40->fragment_id = 0;
3164  ip40->flags_and_fragment_offset = 0;
3165  ip40->ttl = 0xff;
3166  ip40->protocol = IP_PROTOCOL_UDP;
3167  ip40->dst_address.as_u32 = dst->as_u32;
3168  ip40->src_address.as_u32 = src->as_u32;
3169  udp0->dst_port = clib_host_to_net_u16 (dst_port);
3170  udp0->src_port = clib_host_to_net_u16 (src_port);
3171  udp0->length = clib_host_to_net_u16 (len + sizeof (udp_header_t));
3172  udp0->checksum = 0;
3173  b0->current_length = len + sizeof (ip4_header_t) + sizeof (udp_header_t);
3174  ip40->length = clib_host_to_net_u16 (b0->current_length);
3175  ip40->checksum = ip4_header_checksum (ip40);
3176 
3177  vnet_buffer (b0)->sw_if_index[VLIB_RX] = sw_if_index;
3178  vnet_buffer (b0)->sw_if_index[VLIB_TX] = ~0;
3179 
3180  /* send the request */
3181  f = vlib_get_frame_to_node (vm, ip4_lookup_node.index);
3182  to_next = vlib_frame_vector_args (f);
3183  to_next[0] = bi0;
3184  f->n_vectors = 1;
3185  vlib_put_frame_to_node (vm, ip4_lookup_node.index, f);
3186 
3187 }
3188 
3189 static u32
3191 {
3192  u32 bi0;
3193  if (vlib_buffer_alloc (vm, &bi0, 1) != 1)
3194  {
3195  *ike = 0;
3196  return 0;
3197  }
3198  vlib_buffer_t *b0 = vlib_get_buffer (vm, bi0);
3199  *ike = vlib_buffer_get_current (b0);
3200  return bi0;
3201 }
3202 
3203 clib_error_t *
3205 {
3206  ikev2_main_t *km = &ikev2_main;
3207 
3208  if (km->pkey)
3209  EVP_PKEY_free (km->pkey);
3210  km->pkey = ikev2_load_key_file (file);
3211  if (km->pkey == NULL)
3212  return clib_error_return (0, "load key '%s' failed", file);
3213 
3214  return 0;
3215 }
3216 
3219 {
3220  ikev2_main_t *km = &ikev2_main;
3221  udp_dst_port_info_t *pi;
3222 
3223  uword *v = hash_get (km->udp_ports, port);
3224  pi = udp_get_dst_port_info (&udp_main, port, UDP_IP4);
3225 
3226  if (v)
3227  {
3228  /* IKE already uses this port, only increment reference counter */
3229  ASSERT (pi);
3230  v[0]++;
3231  }
3232  else
3233  {
3234  if (pi)
3235  return VNET_API_ERROR_UDP_PORT_TAKEN;
3236 
3237  udp_register_dst_port (km->vlib_main, port,
3238  ipsec4_tun_input_node.index, 1);
3239  hash_set (km->udp_ports, port, 1);
3240  }
3242  return 0;
3243 }
3244 
3247 {
3248  ikev2_main_t *km = &ikev2_main;
3249  uword *v;
3250 
3252  return;
3253 
3254  v = hash_get (km->udp_ports, p->ipsec_over_udp_port);
3255  if (!v)
3256  return;
3257 
3258  v[0]--;
3259 
3260  if (v[0] == 0)
3261  {
3264  }
3265 
3267 }
3268 
3269 static void
3272  ikev2_sa_t * sa)
3273 {
3274  ikev2_main_t *km = &ikev2_main;
3275  ip4_address_t *src, *dst;
3276 
3277  /* Create the Initiator notification for IKE SA removal */
3278  ike_header_t *ike0;
3279  u32 bi0 = 0;
3280  int len;
3281 
3282  bi0 = ikev2_get_new_ike_header_buff (vm, &ike0);
3283  if (!bi0)
3284  {
3285  ikev2_log_error ("buffer alloc failure");
3286  return;
3287  }
3288 
3289  ike0->exchange = IKEV2_EXCHANGE_INFORMATIONAL;
3290  ike0->ispi = clib_host_to_net_u64 (sa->ispi);
3291  ike0->rspi = clib_host_to_net_u64 (sa->rspi);
3292  vec_resize (sa->del, 1);
3294  sa->del->spi = sa->ispi;
3295  ike0->msgid = clib_host_to_net_u32 (sa->last_init_msg_id + 1);
3296  sa->last_init_msg_id = clib_net_to_host_u32 (ike0->msgid);
3297  len = ikev2_generate_message (sa, ike0, 0, 0);
3298 
3299  if (sa->is_initiator)
3300  {
3301  src = &sa->iaddr;
3302  dst = &sa->raddr;
3303  }
3304  else
3305  {
3306  dst = &sa->iaddr;
3307  src = &sa->raddr;
3308  }
3309 
3310  ikev2_send_ike (vm, src, dst, bi0, len,
3311  ikev2_get_port (sa), sa->dst_port, 0);
3312 
3313  /* delete local SA */
3315  vec_foreach (c, sa->childs)
3317 
3318  u64 rspi = sa->rspi;
3319  ikev2_sa_free_all_vec (sa);
3320  uword *p = hash_get (tkm->sa_by_rspi, rspi);
3321  if (p)
3322  {
3323  hash_unset (tkm->sa_by_rspi, rspi);
3324  pool_put (tkm->sas, sa);
3325  }
3326 }
3327 
3328 static void
3330 {
3332  ikev2_sa_t *sa;
3333  u32 pi = p - km->profiles;
3334  u32 *sai;
3335  u32 *del_sai = 0;
3336 
3337  vec_foreach (tkm, km->per_thread_data)
3338  {
3339  /* *INDENT-OFF* */
3340  pool_foreach (sa, tkm->sas, ({
3341  if (sa->profile_index != ~0 && pi == sa->profile_index)
3342  vec_add1 (del_sai, sa - tkm->sas);
3343  }));
3344  /* *INDENT-ON* */
3345 
3346  vec_foreach (sai, del_sai)
3347  {
3348  sa = pool_elt_at_index (tkm->sas, sai[0]);
3350  }
3351 
3352  vec_reset_length (del_sai);
3353  }
3354 
3355  vec_free (del_sai);
3356 }
3357 
3358 static void
3360 {
3361  vec_free (p->name);
3362 
3363  vec_free (p->auth.data);
3364  if (p->auth.key)
3365  EVP_PKEY_free (p->auth.key);
3366 
3367  vec_free (p->loc_id.data);
3368  vec_free (p->rem_id.data);
3369 }
3370 
3371 clib_error_t *
3373 {
3374  ikev2_main_t *km = &ikev2_main;
3375  ikev2_profile_t *p;
3376 
3377  if (is_add)
3378  {
3379  if (ikev2_profile_index_by_name (name))
3380  return clib_error_return (0, "policy %v already exists", name);
3381 
3382  pool_get (km->profiles, p);
3383  clib_memset (p, 0, sizeof (*p));
3384  p->name = vec_dup (name);
3386  p->responder.sw_if_index = ~0;
3387  p->tun_itf = ~0;
3388  uword index = p - km->profiles;
3389  mhash_set_mem (&km->profile_index_by_name, name, &index, 0);
3390  }
3391  else
3392  {
3393  p = ikev2_profile_index_by_name (name);
3394  if (!p)
3395  return clib_error_return (0, "policy %v does not exists", name);
3396 
3399 
3400  ikev2_profile_free (p);
3401  pool_put (km->profiles, p);
3402  mhash_unset (&km->profile_index_by_name, name, 0);
3403  }
3404  return 0;
3405 }
3406 
3407 clib_error_t *
3409  u8 * auth_data, u8 data_hex_format)
3410 {
3411  ikev2_profile_t *p;
3412  clib_error_t *r;
3413 
3414  p = ikev2_profile_index_by_name (name);
3415 
3416  if (!p)
3417  {
3418  r = clib_error_return (0, "unknown profile %v", name);
3419  return r;
3420  }
3421 
3422  if (p->auth.key)
3423  EVP_PKEY_free (p->auth.key);
3424  vec_free (p->auth.data);
3425 
3426  p->auth.method = auth_method;
3427  p->auth.data = vec_dup (auth_data);
3428  p->auth.hex = data_hex_format;
3429 
3430  if (auth_method == IKEV2_AUTH_METHOD_RSA_SIG)
3431  {
3432  vec_add1 (p->auth.data, 0);
3434  if (p->auth.key == NULL)
3435  return clib_error_return (0, "load cert '%s' failed", p->auth.data);
3436  }
3437 
3438  return 0;
3439 }
3440 
3441 clib_error_t *
3443  int is_local)
3444 {
3445  ikev2_profile_t *p;
3446  clib_error_t *r;
3447 
3448  if (id_type > IKEV2_ID_TYPE_ID_RFC822_ADDR
3449  && id_type < IKEV2_ID_TYPE_ID_KEY_ID)
3450  {
3451  r = clib_error_return (0, "unsupported identity type %U",
3452  format_ikev2_id_type, id_type);
3453  return r;
3454  }
3455 
3456  p = ikev2_profile_index_by_name (name);
3457 
3458  if (!p)
3459  {
3460  r = clib_error_return (0, "unknown profile %v", name);
3461  return r;
3462  }
3463 
3464  if (is_local)
3465  {
3466  vec_free (p->loc_id.data);
3467  p->loc_id.type = id_type;
3468  p->loc_id.data = vec_dup (data);
3469  }
3470  else
3471  {
3472  vec_free (p->rem_id.data);
3473  p->rem_id.type = id_type;
3474  p->rem_id.data = vec_dup (data);
3475  }
3476 
3477  return 0;
3478 }
3479 
3480 clib_error_t *
3484 {
3485  ikev2_profile_t *p;
3486  clib_error_t *r;
3487 
3488  p = ikev2_profile_index_by_name (name);
3489 
3490  if (!p)
3491  {
3492  r = clib_error_return (0, "unknown profile %v", name);
3493  return r;
3494  }
3495 
3496  if (is_local)
3497  {
3498  p->loc_ts.start_addr.as_u32 = start_addr.as_u32;
3499  p->loc_ts.end_addr.as_u32 = end_addr.as_u32;
3501  p->loc_ts.end_port = end_port;
3503  p->loc_ts.ts_type = 7;
3504  }
3505  else
3506  {
3507  p->rem_ts.start_addr.as_u32 = start_addr.as_u32;
3508  p->rem_ts.end_addr.as_u32 = end_addr.as_u32;
3510  p->rem_ts.end_port = end_port;
3512  p->rem_ts.ts_type = 7;
3513  }
3514 
3515  return 0;
3516 }
3517 
3518 
3519 clib_error_t *
3522 {
3523  ikev2_profile_t *p;
3524  clib_error_t *r;
3525 
3526  p = ikev2_profile_index_by_name (name);
3527 
3528  if (!p)
3529  {
3530  r = clib_error_return (0, "unknown profile %v", name);
3531  return r;
3532  }
3533 
3535  p->responder.ip4 = ip4;
3536 
3537  return 0;
3538 }
3539 
3540 clib_error_t *
3542  ikev2_transform_encr_type_t crypto_alg,
3544  ikev2_transform_dh_type_t dh_type,
3546 {
3547  ikev2_profile_t *p;
3548  clib_error_t *r;
3549 
3550  p = ikev2_profile_index_by_name (name);
3551 
3552  if (!p)
3553  {
3554  r = clib_error_return (0, "unknown profile %v", name);
3555  return r;
3556  }
3557 
3558  p->ike_ts.crypto_alg = crypto_alg;
3559  p->ike_ts.integ_alg = integ_alg;
3560  p->ike_ts.dh_type = dh_type;
3562  return 0;
3563 }
3564 
3565 clib_error_t *
3567  ikev2_transform_encr_type_t crypto_alg,
3570 {
3571  ikev2_profile_t *p;
3572  clib_error_t *r;
3573 
3574  p = ikev2_profile_index_by_name (name);
3575 
3576  if (!p)
3577  {
3578  r = clib_error_return (0, "unknown profile %v", name);
3579  return r;
3580  }
3581 
3582  p->esp_ts.crypto_alg = crypto_alg;
3583  p->esp_ts.integ_alg = integ_alg;
3585  return 0;
3586 }
3587 
3588 clib_error_t *
3590  u8 * name, u32 sw_if_index)
3591 {
3592  ikev2_profile_t *p;
3593  clib_error_t *r;
3594 
3595  p = ikev2_profile_index_by_name (name);
3596 
3597  if (!p)
3598  {
3599  r = clib_error_return (0, "unknown profile %v", name);
3600  return r;
3601  }
3602 
3603  p->tun_itf = sw_if_index;
3604 
3605  return 0;
3606 }
3607 
3610  u8 is_set)
3611 {
3613  ikev2_main_t *km = &ikev2_main;
3614  vnet_api_error_t rv = 0;
3615  uword *v;
3616 
3617  if (!p)
3618  return VNET_API_ERROR_INVALID_VALUE;
3619 
3620  if (is_set)
3621  {
3623  return VNET_API_ERROR_VALUE_EXIST;
3624 
3625  rv = ikev2_register_udp_port (p, port);
3626  }
3627  else
3628  {
3629  v = hash_get (km->udp_ports, port);
3630  if (!v)
3631  return VNET_API_ERROR_IKE_NO_PORT;
3632 
3634  return VNET_API_ERROR_INVALID_VALUE;
3635 
3637  }
3638  return rv;
3639 }
3640 
3641 clib_error_t *
3643 {
3645  clib_error_t *r;
3646 
3647  if (!p)
3648  {
3649  r = clib_error_return (0, "unknown profile %v", name);
3650  return r;
3651  }
3652 
3653  p->udp_encap = 1;
3654  return 0;
3655 }
3656 
3657 clib_error_t *
3659  u64 lifetime, u32 jitter, u32 handover,
3660  u64 maxdata)
3661 {
3662  ikev2_profile_t *p;
3663  clib_error_t *r;
3664 
3665  p = ikev2_profile_index_by_name (name);
3666 
3667  if (!p)
3668  {
3669  r = clib_error_return (0, "unknown profile %v", name);
3670  return r;
3671  }
3672 
3673  p->lifetime = lifetime;
3674  p->lifetime_jitter = jitter;
3675  p->handover = handover;
3676  p->lifetime_maxdata = maxdata;
3677  return 0;
3678 }
3679 
3680 clib_error_t *
3682 {
3683  ikev2_profile_t *p;
3684  clib_error_t *r;
3685  ip4_main_t *im = &ip4_main;
3686  ikev2_main_t *km = &ikev2_main;
3687 
3688  p = ikev2_profile_index_by_name (name);
3689 
3690  if (!p)
3691  {
3692  r = clib_error_return (0, "unknown profile %v", name);
3693  return r;
3694  }
3695 
3696  if (p->responder.sw_if_index == ~0 || p->responder.ip4.data_u32 == 0)
3697  {
3698  r = clib_error_return (0, "responder not set for profile %v", name);
3699  return r;
3700  }
3701 
3702 
3703  /* Create the Initiator Request */
3704  {
3705  ike_header_t *ike0;
3706  u32 bi0 = 0;
3707  ip_lookup_main_t *lm = &im->lookup_main;
3708  u32 if_add_index0;
3709  int len = sizeof (ike_header_t);
3710 
3711  /* Get own iface IP */
3712  if_add_index0 =
3714  ip_interface_address_t *if_add =
3715  pool_elt_at_index (lm->if_address_pool, if_add_index0);
3716  ip4_address_t *if_ip = ip_interface_address_get_address (lm, if_add);
3717 
3718  bi0 = ikev2_get_new_ike_header_buff (vm, &ike0);
3719  if (!bi0)
3720  {
3721  char *errmsg = "buffer alloc failure";
3722  ikev2_log_error (errmsg);
3723  return clib_error_return (0, errmsg);
3724  }
3725 
3726  /* Prepare the SA and the IKE payload */
3727  ikev2_sa_t sa;
3728  clib_memset (&sa, 0, sizeof (ikev2_sa_t));
3729  ikev2_payload_chain_t *chain = 0;
3730  ikev2_payload_new_chain (chain);
3731 
3732  /* Build the IKE proposal payload */
3733  ikev2_sa_proposal_t *proposals = 0;
3734  ikev2_set_initiator_proposals (vm, &sa, &p->ike_ts, &proposals, 1);
3735  proposals[0].proposal_num = 1;
3736  proposals[0].protocol_id = IKEV2_PROTOCOL_IKE;
3737 
3738  /* Add and then cleanup proposal data */
3739  ikev2_payload_add_sa (chain, proposals);
3740  ikev2_sa_free_proposal_vector (&proposals);
3741 
3742  sa.is_initiator = 1;
3743  sa.profile_index = p - km->profiles;
3745  sa.tun_itf = p->tun_itf;
3746  sa.udp_encap = p->udp_encap;
3748  sa.is_tun_itf_set = 1;
3749  sa.initial_contact = 1;
3750  sa.dst_port = IKEV2_PORT;
3752  ikev2_payload_add_ke (chain, sa.dh_group, sa.i_dh_data);
3753  ikev2_payload_add_nonce (chain, sa.i_nonce);
3754 
3755  /* Build the child SA proposal */
3756  vec_resize (sa.childs, 1);
3757  ikev2_set_initiator_proposals (vm, &sa, &p->esp_ts,
3758  &sa.childs[0].i_proposals, 0);
3759  sa.childs[0].i_proposals[0].proposal_num = 1;
3761  RAND_bytes ((u8 *) & sa.childs[0].i_proposals[0].spi,
3762  sizeof (sa.childs[0].i_proposals[0].spi));
3763 
3764  /* Add NAT detection notification messages (mandatory) */
3765  u8 *nat_detection_sha1 =
3766  ikev2_compute_nat_sha1 (clib_host_to_net_u64 (sa.ispi),
3767  clib_host_to_net_u64 (sa.rspi),
3768  if_ip->as_u32,
3769  clib_host_to_net_u16 (IKEV2_PORT));
3770 
3771  ikev2_payload_add_notify (chain, IKEV2_NOTIFY_MSG_NAT_DETECTION_SOURCE_IP,
3772  nat_detection_sha1);
3773  vec_free (nat_detection_sha1);
3774  nat_detection_sha1 =
3775  ikev2_compute_nat_sha1 (clib_host_to_net_u64 (sa.ispi),
3776  clib_host_to_net_u64 (sa.rspi),
3777  p->responder.ip4.as_u32,
3778  clib_host_to_net_u16 (sa.dst_port));
3779  ikev2_payload_add_notify (chain,
3780  IKEV2_NOTIFY_MSG_NAT_DETECTION_DESTINATION_IP,
3781  nat_detection_sha1);
3782  vec_free (nat_detection_sha1);
3783 
3784  u8 *sig_hash_algo = vec_new (u8, 8);
3785  u64 tmpsig = clib_host_to_net_u64 (0x0001000200030004);
3786  clib_memcpy_fast (sig_hash_algo, &tmpsig, sizeof (tmpsig));
3787  ikev2_payload_add_notify (chain,
3788  IKEV2_NOTIFY_MSG_SIGNATURE_HASH_ALGORITHMS,
3789  sig_hash_algo);
3790  vec_free (sig_hash_algo);
3791 
3792 
3793  /* Buffer update and boilerplate */
3794  len += vec_len (chain->data);
3795  ike0->nextpayload = chain->first_payload_type;
3796  ike0->length = clib_host_to_net_u32 (len);
3797  clib_memcpy_fast (ike0->payload, chain->data, vec_len (chain->data));
3799 
3800  ike0->version = IKE_VERSION_2;
3801  ike0->flags = IKEV2_HDR_FLAG_INITIATOR;
3802  ike0->exchange = IKEV2_EXCHANGE_SA_INIT;
3803  ike0->ispi = clib_host_to_net_u64 (sa.ispi);
3804  ike0->rspi = 0;
3805  ike0->msgid = 0;
3806 
3807  /* store whole IKE payload - needed for PSK auth */
3809  vec_add (sa.last_sa_init_req_packet_data, ike0, len);
3810 
3811  /* add data to the SA then add it to the pool */
3812  sa.iaddr.as_u32 = if_ip->as_u32;
3813  sa.raddr.as_u32 = p->responder.ip4.as_u32;
3814  sa.i_id.type = p->loc_id.type;
3815  sa.i_id.data = vec_dup (p->loc_id.data);
3816  sa.r_id.type = p->rem_id.type;
3817  sa.r_id.data = vec_dup (p->rem_id.data);
3818  sa.i_auth.method = p->auth.method;
3819  sa.i_auth.hex = p->auth.hex;
3820  sa.i_auth.data = vec_dup (p->auth.data);
3822  vec_add (sa.childs[0].tsi, &p->loc_ts, 1);
3823  vec_add (sa.childs[0].tsr, &p->rem_ts, 1);
3824 
3826 
3827  /* add SA to the pool */
3828  ikev2_sa_t *sa0 = 0;
3829  pool_get (km->sais, sa0);
3830  clib_memcpy_fast (sa0, &sa, sizeof (*sa0));
3831  hash_set (km->sa_by_ispi, sa0->ispi, sa0 - km->sais);
3832 
3833  ikev2_send_ike (vm, if_ip, &p->responder.ip4, bi0, len,
3834  IKEV2_PORT, sa.dst_port, sa.sw_if_index);
3835 
3836  ikev2_elog_exchange ("ispi %lx rspi %lx IKEV2_EXCHANGE_SA_INIT sent to "
3837  "%d.%d.%d.%d", clib_host_to_net_u64 (sa0->ispi), 0,
3838  p->responder.ip4.as_u32);
3839  }
3840 
3841  return 0;
3842 }
3843 
3844 static void
3846  ikev2_child_sa_t * csa)
3847 {
3848  /* Create the Initiator notification for child SA removal */
3849  ikev2_main_t *km = &ikev2_main;
3850  ike_header_t *ike0;
3851  u32 bi0 = 0;
3852  int len;
3853 
3854  bi0 = ikev2_get_new_ike_header_buff (vm, &ike0);
3855  if (!bi0)
3856  {
3857  ikev2_log_error ("buffer alloc failure");
3858  return;
3859  }
3860 
3861  ike0->exchange = IKEV2_EXCHANGE_INFORMATIONAL;
3862  ike0->ispi = clib_host_to_net_u64 (sa->ispi);
3863  ike0->rspi = clib_host_to_net_u64 (sa->rspi);
3864  vec_resize (sa->del, 1);
3866  sa->del->spi = csa->i_proposals->spi;
3867  ike0->msgid = clib_host_to_net_u32 (sa->last_init_msg_id + 1);
3868  sa->last_init_msg_id = clib_net_to_host_u32 (ike0->msgid);
3869  len = ikev2_generate_message (sa, ike0, 0, 0);
3870  if (sa->natt)
3871  len = ikev2_insert_non_esp_marker (ike0, len);
3872  ikev2_send_ike (vm, &sa->iaddr, &sa->raddr, bi0, len,
3873  ikev2_get_port (sa), sa->dst_port, sa->sw_if_index);
3874 
3875  /* delete local child SA */
3877  ikev2_sa_del_child_sa (sa, csa);
3878 }
3879 
3880 clib_error_t *
3882 {
3883  clib_error_t *r;
3884  ikev2_main_t *km = &ikev2_main;
3886  ikev2_sa_t *fsa = 0;
3887  ikev2_child_sa_t *fchild = 0;
3888 
3889  /* Search for the child SA */
3890  vec_foreach (tkm, km->per_thread_data)
3891  {
3892  ikev2_sa_t *sa;
3893  if (fchild)
3894  break;
3895  /* *INDENT-OFF* */
3896  pool_foreach (sa, tkm->sas, ({
3897  fchild = ikev2_sa_get_child(sa, ispi, IKEV2_PROTOCOL_ESP, 1);
3898  if (fchild)
3899  {
3900  fsa = sa;
3901  break;
3902  }
3903  }));
3904  /* *INDENT-ON* */
3905  }
3906 
3907  if (!fchild || !fsa)
3908  {
3909  r = clib_error_return (0, "Child SA not found");
3910  return r;
3911  }
3912  else
3913  {
3914  ikev2_delete_child_sa_internal (vm, fsa, fchild);
3915  }
3916 
3917  return 0;
3918 }
3919 
3920 clib_error_t *
3922 {
3923  clib_error_t *r;
3924  ikev2_main_t *km = &ikev2_main;
3926  ikev2_sa_t *fsa = 0;
3927  ikev2_main_per_thread_data_t *ftkm = 0;
3928 
3929  /* Search for the IKE SA */
3930  vec_foreach (tkm, km->per_thread_data)
3931  {
3932  ikev2_sa_t *sa;
3933  if (fsa)
3934  break;
3935  /* *INDENT-OFF* */
3936  pool_foreach (sa, tkm->sas, ({
3937  if (sa->ispi == ispi)
3938  {
3939  fsa = sa;
3940  ftkm = tkm;
3941  break;
3942  }
3943  }));
3944  /* *INDENT-ON* */
3945  }
3946 
3947  if (!fsa)
3948  {
3949  r = clib_error_return (0, "IKE SA not found");
3950  return r;
3951  }
3952 
3954  return 0;
3955 }
3956 
3957 static void
3959  ikev2_child_sa_t * csa)
3960 {
3961  /* Create the Initiator request for create child SA */
3962  ike_header_t *ike0;
3963  u32 bi0 = 0;
3964  int len;
3965 
3966  bi0 = ikev2_get_new_ike_header_buff (vm, &ike0);
3967  if (!bi0)
3968  {
3969  ikev2_log_error ("buffer alloc failure");
3970  return;
3971  }
3972 
3973  ike0->version = IKE_VERSION_2;
3974  ike0->flags = IKEV2_HDR_FLAG_INITIATOR;
3975  ike0->exchange = IKEV2_EXCHANGE_CREATE_CHILD_SA;
3976  ike0->ispi = clib_host_to_net_u64 (sa->ispi);
3977  ike0->rspi = clib_host_to_net_u64 (sa->rspi);
3978  ike0->msgid = clib_host_to_net_u32 (sa->last_init_msg_id + 1);
3979  sa->last_init_msg_id = clib_net_to_host_u32 (ike0->msgid);
3980 
3981  ikev2_rekey_t *rekey;
3982  vec_add2 (sa->rekey, rekey, 1);
3983  ikev2_sa_proposal_t *proposals = vec_dup (csa->i_proposals);
3984 
3985  /*need new ispi */
3986  RAND_bytes ((u8 *) & proposals[0].spi, sizeof (proposals[0].spi));
3987  rekey->spi = proposals[0].spi;
3988  rekey->ispi = csa->i_proposals->spi;
3989  len = ikev2_generate_message (sa, ike0, proposals, 0);
3990  if (sa->natt)
3991  len = ikev2_insert_non_esp_marker (ike0, len);
3992  ikev2_send_ike (vm, &sa->iaddr, &sa->raddr, bi0, len,
3993  ikev2_get_port (sa), ikev2_get_port (sa), sa->sw_if_index);
3994  vec_free (proposals);
3995 }
3996 
3997 clib_error_t *
3999 {
4000  clib_error_t *r;
4001  ikev2_main_t *km = &ikev2_main;
4003  ikev2_sa_t *fsa = 0;
4004  ikev2_child_sa_t *fchild = 0;
4005 
4006  /* Search for the child SA */
4007  vec_foreach (tkm, km->per_thread_data)
4008  {
4009  ikev2_sa_t *sa;
4010  if (fchild)
4011  break;
4012  /* *INDENT-OFF* */
4013  pool_foreach (sa, tkm->sas, ({
4014  fchild = ikev2_sa_get_child(sa, ispi, IKEV2_PROTOCOL_ESP, 1);
4015  if (fchild)
4016  {
4017  fsa = sa;
4018  break;
4019  }
4020  }));
4021  /* *INDENT-ON* */
4022  }
4023 
4024  if (!fchild || !fsa)
4025  {
4026  r = clib_error_return (0, "Child SA not found");
4027  return r;
4028  }
4029  else
4030  {
4031  ikev2_rekey_child_sa_internal (vm, fsa, fchild);
4032  }
4033 
4034  return 0;
4035 }
4036 
4037 clib_error_t *
4039 {
4040  ikev2_main_t *km = &ikev2_main;
4042  int thread_id;
4043 
4044  clib_memset (km, 0, sizeof (ikev2_main_t));
4045  km->vnet_main = vnet_get_main ();
4046  km->vlib_main = vm;
4047 
4050  ikev2_crypto_init (km);
4051 
4053 
4056  for (thread_id = 0; thread_id < tm->n_vlib_mains; thread_id++)
4057  {
4059  vec_elt_at_index (km->per_thread_data, thread_id);
4060 
4061  ptd->sa_by_rspi = hash_create (0, sizeof (uword));
4062 
4063 #if OPENSSL_VERSION_NUMBER >= 0x10100000L
4064  ptd->evp_ctx = EVP_CIPHER_CTX_new ();
4065  ptd->hmac_ctx = HMAC_CTX_new ();
4066 #else
4067  EVP_CIPHER_CTX_init (&ptd->_evp_ctx);
4068  ptd->evp_ctx = &ptd->_evp_ctx;
4069  HMAC_CTX_init (&(ptd->_hmac_ctx));
4070  ptd->hmac_ctx = &ptd->_hmac_ctx;
4071 #endif
4072  }
4073 
4074  km->sa_by_ispi = hash_create (0, sizeof (uword));
4075  km->sw_if_indices = hash_create (0, 0);
4076  km->udp_ports = hash_create (0, sizeof (uword));
4077 
4080 
4082  vlib_punt_register (punt_hdl, ipsec_punt_reason[IPSEC_PUNT_IP4_SPI_UDP_0],
4083  "ikev2");
4085 
4086  km->log_level = IKEV2_LOG_ERROR;
4087  km->log_class = vlib_log_register_class ("ikev2", 0);
4088  return 0;
4089 }
4090 
4091 /* *INDENT-OFF* */
4093 {
4094  .runs_after = VLIB_INITS("ipsec_init", "ipsec_punt_init"),
4095 };
4096 /* *INDENT-ON* */
4097 
4098 static u8
4100  u8 del_old_ids)
4101 {
4102  ikev2_main_t *km = &ikev2_main;
4103  ikev2_profile_t *p = 0;
4104  vlib_main_t *vm = km->vlib_main;
4105  f64 now = vlib_time_now (vm);
4106  u8 res = 0;
4107 
4108  if (sa->profile_index != ~0)
4109  p = pool_elt_at_index (km->profiles, sa->profile_index);
4110 
4111  if (sa->is_initiator && p && csa->time_to_expiration
4112  && now > csa->time_to_expiration)
4113  {
4114  if (!csa->is_expired || csa->rekey_retries > 0)
4115  {
4116  ikev2_rekey_child_sa_internal (vm, sa, csa);
4117  csa->time_to_expiration = now + p->handover;
4118  csa->is_expired = 1;
4119  if (csa->rekey_retries == 0)
4120  {
4121  csa->rekey_retries = 5;
4122  }
4123  else if (csa->rekey_retries > 0)
4124  {
4125  csa->rekey_retries--;
4126  ikev2_log_debug ("Rekeying Child SA 0x%x, retries left %d",
4127  csa->i_proposals->spi, csa->rekey_retries);
4128  if (csa->rekey_retries == 0)
4129  {
4130  csa->rekey_retries = -1;
4131  }
4132  }
4133  res |= 1;
4134  }
4135  else
4136  {
4137  csa->time_to_expiration = 0;
4138  ikev2_delete_child_sa_internal (vm, sa, csa);
4139  res |= 1;
4140  return res;
4141  }
4142  }
4143 
4144  if (del_old_ids)
4145  {
4146  ipip_tunnel_t *ipip = NULL;
4147  u32 sw_if_index = sa->is_tun_itf_set ? sa->tun_itf : ~0;
4148  if (~0 == sw_if_index)
4149  {
4150  ip46_address_t local_ip;
4151  ip46_address_t remote_ip;
4152  if (sa->is_initiator)
4153  {
4154  ip46_address_set_ip4 (&local_ip, &sa->iaddr);
4155  ip46_address_set_ip4 (&remote_ip, &sa->raddr);
4156  }
4157  else
4158  {
4159  ip46_address_set_ip4 (&local_ip, &sa->raddr);
4160  ip46_address_set_ip4 (&remote_ip, &sa->iaddr);
4161  }
4162 
4163  /* *INDENT-OFF* */
4164  ipip_tunnel_key_t key = {
4165  .src = local_ip,
4166  .dst = remote_ip,
4167  .transport = IPIP_TRANSPORT_IP4,
4168  .fib_index = 0,
4169  };
4170  /* *INDENT-ON* */
4171 
4172  ipip = ipip_tunnel_db_find (&key);
4173 
4174  if (ipip)
4175  sw_if_index = ipip->sw_if_index;
4176  else
4177  return res;
4178  }
4179 
4180  u32 *sas_in = NULL;
4181  vec_add1 (sas_in, csa->remote_sa_id);
4183  ipsec_tun_protect_update (sw_if_index, NULL, csa->local_sa_id, sas_in);
4186  }
4187 
4188  return res;
4189 }
4190 
4191 int
4193 {
4194  ikev2_main_t *km = &ikev2_main;
4195 
4196  if (log_level >= IKEV2_LOG_MAX)
4197  {
4198  ikev2_log_error ("unknown logging level %d", log_level);
4199  return -1;
4200  }
4201 
4202  km->log_level = log_level;
4203  return 0;
4204 }
4205 
4206 clib_error_t *
4207 ikev2_set_liveness_params (u32 period, u32 max_retries)
4208 {
4209  ikev2_main_t *km = &ikev2_main;
4210 
4211  if (period == 0 || max_retries == 0)
4212  return clib_error_return (0, "invalid args");
4213 
4214  km->liveness_period = period;
4215  km->liveness_max_retries = max_retries;
4216  return 0;
4217 }
4218 
4219 static void
4221 {
4222  ikev2_main_t *km = &ikev2_main;
4223  vlib_main_t *vm = km->vlib_main;
4225  ikev2_sa_t *fsa = 0;
4226  ikev2_profile_t *p = 0;
4227  ikev2_child_sa_t *fchild = 0;
4228  f64 now = vlib_time_now (vm);
4229  vlib_counter_t counts;
4230 
4231  /* Search for the SA and child SA */
4232  vec_foreach (tkm, km->per_thread_data)
4233  {
4234  ikev2_sa_t *sa;
4235  if (fchild)
4236  break;
4237  /* *INDENT-OFF* */
4238  pool_foreach (sa, tkm->sas, ({
4239  fchild = ikev2_sa_get_child(sa, ipsec_sa->spi, IKEV2_PROTOCOL_ESP, 1);
4240  if (fchild)
4241  {
4242  fsa = sa;
4243  break;
4244  }
4245  }));
4246  /* *INDENT-ON* */
4247  }
4249  ipsec_sa->stat_index, &counts);
4250 
4251  if (fsa && fsa->profile_index != ~0 && fsa->is_initiator)
4252  p = pool_elt_at_index (km->profiles, fsa->profile_index);
4253 
4254  if (fchild && p && p->lifetime_maxdata)
4255  {
4256  if (!fchild->is_expired && counts.bytes > p->lifetime_maxdata)
4257  {
4258  fchild->time_to_expiration = now;
4259  }
4260  }
4261 }
4262 
4263 static void
4265 {
4266  u32 sai;
4267  u64 ispi;
4268  ikev2_sa_t *sa;
4269 
4270  /* *INDENT-OFF* */
4271  hash_foreach (ispi, sai, km->sa_by_ispi,
4272  ({
4273  sa = pool_elt_at_index (km->sais, sai);
4274  if (sa->init_response_received)
4275  continue;
4276 
4277  u32 bi0;
4278  if (vlib_buffer_alloc (km->vlib_main, &bi0, 1) != 1)
4279  return;
4280 
4281  vlib_buffer_t * b = vlib_get_buffer (km->vlib_main, bi0);
4282  clib_memcpy_fast (vlib_buffer_get_current (b),
4283  sa->last_sa_init_req_packet_data,
4284  vec_len (sa->last_sa_init_req_packet_data));
4285  ikev2_send_ike (km->vlib_main, &sa->iaddr, &sa->raddr, bi0,
4286  vec_len (sa->last_sa_init_req_packet_data),
4287  ikev2_get_port (sa), IKEV2_PORT, sa->sw_if_index);
4288  }));
4289  /* *INDENT-ON* */
4290 }
4291 
4293 
4294 static void
4296 {
4297  ikev2_main_t *km = &ikev2_main;
4298  ip4_address_t *src, *dst;
4299  ike_header_t *ike0;
4300  u32 bi0 = 0;
4301  u16 dp;
4302  int len;
4303 
4304  bi0 = ikev2_get_new_ike_header_buff (km->vlib_main, &ike0);
4305  if (!bi0)
4306  {
4307  ikev2_log_error ("buffer alloc failure");
4308  return;
4309  }
4310 
4311  ike0->exchange = IKEV2_EXCHANGE_INFORMATIONAL;
4312  ike0->ispi = clib_host_to_net_u64 (sa->ispi);
4313  ike0->rspi = clib_host_to_net_u64 (sa->rspi);
4314  ike0->msgid = clib_host_to_net_u32 (sa->last_init_msg_id + 1);
4315  sa->last_init_msg_id = clib_net_to_host_u32 (ike0->msgid);
4316  len = ikev2_generate_message (sa, ike0, 0, 0);
4317  if (sa->natt)
4318  len = ikev2_insert_non_esp_marker (ike0, len);
4319 
4320  if (sa->is_initiator)
4321  {
4322  src = &sa->iaddr;
4323  dst = &sa->raddr;
4324  }
4325  else
4326  {
4327  dst = &sa->iaddr;
4328  src = &sa->raddr;
4329  }
4330 
4331  dp = sa->dst_port ? sa->dst_port : ikev2_get_port (sa);
4332  ikev2_send_ike (km->vlib_main, src, dst, bi0, len, ikev2_get_port (sa), dp,
4333  sa->sw_if_index);
4334 }
4335 
4338 {
4339  ikev2_main_t *km = &ikev2_main;
4340  vlib_main_t *vm = km->vlib_main;
4341 
4342  if (!sa->keys_generated)
4343  return 0;
4344 
4345  if (sa->liveness_retries >= km->liveness_max_retries)
4346  return 1;
4347 
4348  f64 now = vlib_time_now (vm);
4349 
4350  if (sa->liveness_period_check < now)
4351  {
4352  sa->liveness_retries++;
4353  sa->liveness_period_check = now + km->liveness_period;
4355  }
4356  return 0;
4357 }
4358 
4359 static uword
4361  vlib_frame_t * f)
4362 {
4363  ikev2_main_t *km = &ikev2_main;
4364  ipsec_main_t *im = &ipsec_main;
4365  ikev2_profile_t *p;
4367  u32 *sai;
4368 
4369  while (1)
4370  {
4371  u8 req_sent = 0;
4373  vlib_process_get_events (vm, NULL);
4374 
4375  /* process ike child sas */
4377  vec_foreach (tkm, km->per_thread_data)
4378  {
4379  ikev2_sa_t *sa;
4380  u32 *to_be_deleted = 0;
4381 
4382  /* *INDENT-OFF* */
4383  pool_foreach (sa, tkm->sas, ({
4384  ikev2_child_sa_t *c;
4385  u8 del_old_ids = 0;
4386  if (sa->old_remote_id_present && 0 > sa->old_id_expiration)
4387  {
4388  sa->old_remote_id_present = 0;
4389  del_old_ids = 1;
4390  }
4391  else
4392  sa->old_id_expiration -= 1;
4393 
4394  vec_foreach (c, sa->childs)
4395  {
4396  req_sent |= ikev2_mngr_process_child_sa(sa, c, del_old_ids);
4397  }
4398 
4400  vec_add1 (to_be_deleted, sa - tkm->sas);
4401  }));
4402  /* *INDENT-ON* */
4403 
4404  vec_foreach (sai, to_be_deleted)
4405  {
4406  sa = pool_elt_at_index (tkm->sas, sai[0]);
4407  u8 reinitiate = (sa->is_initiator && sa->profile_index != ~0);
4408  vec_foreach (c, sa->childs)
4409  {
4411  ikev2_sa_del_child_sa (sa, c);
4412  }
4413  ikev2_sa_free_all_vec (sa);
4414  hash_unset (tkm->sa_by_rspi, sa->rspi);
4415  pool_put (tkm->sas, sa);
4416 
4417  if (reinitiate)
4418  {
4419  p = pool_elt_at_index (km->profiles, sa->profile_index);
4420  if (p)
4421  {
4422  ikev2_initiate_sa_init (vm, p->name);
4423  }
4424  }
4425  }
4426  vec_free (to_be_deleted);
4427  }
4428 
4429  /* process ipsec sas */
4430  ipsec_sa_t *sa;
4431  /* *INDENT-OFF* */
4432  pool_foreach (sa, im->sad, ({
4433  ikev2_mngr_process_ipsec_sa(sa);
4434  }));
4435  /* *INDENT-ON* */
4436 
4438 
4439  if (req_sent)
4440  {
4442  vlib_process_get_events (vm, NULL);
4443  req_sent = 0;
4444  }
4445 
4446  }
4447  return 0;
4448 }
4449 
4450 /* *INDENT-OFF* */
4452  .function = ikev2_mngr_process_fn,
4453  .type = VLIB_NODE_TYPE_PROCESS,
4454  .name =
4455  "ikev2-manager-process",
4456 };
4457 
4458 VLIB_PLUGIN_REGISTER () = {
4459  .version = VPP_BUILD_VER,
4460  .description = "Internet Key Exchange (IKEv2) Protocol",
4461 };
4462 /* *INDENT-ON* */
4463 
4464 /*
4465  * fd.io coding-style-patch-verification: ON
4466  *
4467  * Local Variables:
4468  * eval: (c-set-style "gnu")
4469  * End:
4470  */
ikev2_main_per_thread_data_t * per_thread_data
Definition: ikev2_priv.h:489
ipip_tunnel_t * ipip_tunnel_db_find(const ipip_tunnel_key_t *key)
Definition: ipip.c:484
#define ikev2_elog_exchange(_format, _ispi, _rspi, _addr)
Definition: ikev2_priv.h:84
vlib_log_class_t vlib_log_register_class(char *class, char *subclass)
Definition: log.c:209
static int ikev2_create_tunnel_interface(vlib_main_t *vm, u32 thread_index, ikev2_sa_t *sa, ikev2_child_sa_t *child, u32 sa_index, u32 child_index, u8 is_rekey)
Definition: ikev2.c:1739
u32 flags
buffer flags: VLIB_BUFFER_FREE_LIST_INDEX_MASK: bits used to store free list index, VLIB_BUFFER_IS_TRACED: trace this buffer.
Definition: buffer.h:124
udp_main_t udp_main
Definition: udp.c:22
u32 liveness_period
Definition: ikev2_priv.h:507
u8 * dh_shared_key
Definition: ikev2_priv.h:380
ikev2_sa_t * sais
Definition: ikev2_priv.h:485
void ikev2_payload_add_nonce(ikev2_payload_chain_t *c, u8 *nonce)
static u8 * format_ikev2_trace(u8 *s, va_list *args)
Definition: ikev2.c:54
static void ikev2_process_create_child_sa_req(vlib_main_t *vm, ikev2_sa_t *sa, ike_header_t *ike, u32 len)
Definition: ikev2.c:1197
u8 * dh_private_key
Definition: ikev2_priv.h:381
ikev2_transform_type_t type
Definition: ikev2_priv.h:229
vnet_api_error_t
Definition: api_errno.h:162
#define hash_set(h, key, value)
Definition: hash.h:255
#define IKEV2_PAYLOAD_NONCE
Definition: ikev2.h:107
clib_error_t * ikev2_set_profile_responder(vlib_main_t *vm, u8 *name, u32 sw_if_index, ip4_address_t ip4)
Definition: ikev2.c:3520
ikev2_id_t r_id
Definition: ikev2_priv.h:404
ikev2_id_type_t type
Definition: ikev2_priv.h:287
#define CLIB_UNUSED(x)
Definition: clib.h:87
void ikev2_payload_add_notify(ikev2_payload_chain_t *c, u16 msg_type, u8 *data)
ikev2_transforms_set ike_ts
Definition: ikev2_priv.h:354
u32 old_remote_id
Definition: ikev2_priv.h:430
static int ikev2_delete_tunnel_interface(vnet_main_t *vnm, ikev2_sa_t *sa, ikev2_child_sa_t *child)
Definition: ikev2.c:2044
static u32 ikev2_retransmit_resp(ikev2_sa_t *sa, ike_header_t *ike, u32 rlen)
Definition: ikev2.c:2466
static u8 ikev2_mngr_process_child_sa(ikev2_sa_t *sa, ikev2_child_sa_t *csa, u8 del_old_ids)
Definition: ikev2.c:4099
static f64 vlib_process_wait_for_event_or_clock(vlib_main_t *vm, f64 dt)
Suspend a cooperative multi-tasking thread Waits for an event, or for the indicated number of seconds...
Definition: node_funcs.h:751
ikev2_transform_integ_type_t
Definition: ikev2.h:276
#define hash_unset(h, key)
Definition: hash.h:261
a
Definition: bitmap.h:538
static u32 ikev2_retransmit_sa_init(ike_header_t *ike, ip4_address_t iaddr, ip4_address_t raddr, u32 rlen)
Definition: ikev2.c:2394
u16 dst_port
Definition: ikev2_priv.h:439
static void ikev2_del_sa_init(u64 ispi)
Definition: ikev2.c:2525
ip4_address_t src_address
Definition: ip4_packet.h:125
clib_error_t * ikev2_add_del_profile(vlib_main_t *vm, u8 *name, int is_add)
Definition: ikev2.c:3372
int ikev2_encrypt_data(ikev2_main_per_thread_data_t *ptd, ikev2_sa_t *sa, ikev2_sa_transform_t *tr_encr, v8 *src, u8 *dst)
Definition: ikev2_crypto.c:448
EVP_PKEY * pkey
Definition: ikev2_priv.h:478
A representation of a IPIP tunnel.
Definition: ipip.h:75
ip_interface_address_t * if_address_pool
Pool of addresses that are assigned to interfaces.
Definition: lookup.h:148
void ikev2_payload_add_sa(ikev2_payload_chain_t *c, ikev2_sa_proposal_t *proposals)
static u32 ikev2_generate_message(ikev2_sa_t *sa, ike_header_t *ike, void *user, udp_header_t *udp)
Definition: ikev2.c:2072
vnet_main_t * vnet_get_main(void)
Definition: misc.c:46
clib_error_t * ikev2_set_profile_udp_encap(vlib_main_t *vm, u8 *name)
Definition: ikev2.c:3642
static void ikev2_process_sa_init_req(vlib_main_t *vm, ikev2_sa_t *sa, ike_header_t *ike, udp_header_t *udp, u32 len)
Definition: ikev2.c:643
static void ikev2_profile_free(ikev2_profile_t *p)
Definition: ikev2.c:3359
static void ikev2_calc_keys(ikev2_sa_t *sa)
Definition: ikev2.c:469
ikev2_sa_proposal_t * ikev2_parse_sa_payload(ike_payload_header_t *ikep)
u32 last_init_msg_id
Definition: ikev2_priv.h:421
ikev2_transform_dh_type_t dh_type
Definition: ikev2_priv.h:280
ipsec_integ_alg_t
Definition: ipsec_sa.h:59
#define IKEV2_PAYLOAD_NONE
Definition: ikev2.h:99
vl_api_ikev2_auth_t auth
Definition: ikev2_types.api:87
ikev2_profile_t * profiles
Definition: ikev2_priv.h:469
unsigned long u64
Definition: types.h:89
vl_api_ip_port_and_mask_t dst_port
Definition: flow_types.api:92
u8 v8
Definition: ikev2.h:33
clib_error_t * ikev2_initiate_delete_ike_sa(vlib_main_t *vm, u64 ispi)
Definition: ikev2.c:3921
static void * ip_interface_address_get_address(ip_lookup_main_t *lm, ip_interface_address_t *a)
Definition: ip_interface.h:43
#define clib_memcpy_fast(a, b, c)
Definition: string.h:81
u32 current_remote_id_mask
Definition: ikev2_priv.h:429
ikev2_ts_t * ikev2_parse_ts_payload(ike_payload_header_t *ikep)
uword mhash_unset(mhash_t *h, void *key, uword *old_value)
Definition: mhash.c:346
clib_memset(h->entries, 0, sizeof(h->entries[0]) *entries)
static void ikev2_sa_free_child_sa(ikev2_child_sa_t *c)
Definition: ikev2.c:267
v8 * ikev2_calc_prf(ikev2_sa_transform_t *tr, v8 *key, v8 *data)
Definition: ikev2_crypto.c:257
static f64 vlib_time_now(vlib_main_t *vm)
Definition: main.h:333
void vnet_sw_interface_admin_up(vnet_main_t *vnm, u32 sw_if_index)
Definition: interface.c:516
#define ikev2_elog_peers(_level, _format, _ip1, _ip2)
Definition: ikev2_priv.h:159
static void ikev2_complete_sa_data(ikev2_sa_t *sa, ikev2_sa_t *sai)
Definition: ikev2.c:408
#define ikev2_elog_error(_msg)
Definition: ikev2_priv.h:184
static vlib_node_registration_t ikev2_mngr_process_node
(constructor) VLIB_REGISTER_NODE (ikev2_mngr_process_node)
Definition: ikev2.c:4292
#define IKEV2_EXCHANGE_SA_INIT
Definition: ikev2.h:88
static void ikev2_delete_child_sa_internal(vlib_main_t *vm, ikev2_sa_t *sa, ikev2_child_sa_t *csa)
Definition: ikev2.c:3845
ikev2_transform_esn_type_t esn_type
Definition: ikev2_priv.h:237
u16 current_length
Nbytes between current data and the end of this buffer.
Definition: buffer.h:113
VLIB_PLUGIN_REGISTER()
#define IKEV2_PAYLOAD_VENDOR
Definition: ikev2.h:110
ikev2_state_t state
Definition: ikev2_priv.h:368
#define vec_add1(V, E)
Add 1 element to end of vector (unspecified alignment).
Definition: vec.h:592
Combined counter to hold both packets and byte differences.
Definition: counter_types.h:26
vl_api_address_t src
Definition: gre.api:54
ikev2_transform_encr_type_t crypto_alg
Definition: ikev2_priv.h:278
clib_error_t * ikev2_set_profile_tunnel_interface(vlib_main_t *vm, u8 *name, u32 sw_if_index)
Definition: ikev2.c:3589
#define IKEV2_PORT_NATT
Definition: ikev2.h:25
int vlib_punt_hdl_t
Typedef for a client handle.
Definition: punt.h:47
#define vec_add2(V, P, N)
Add N elements to end of vector V, return pointer to new elements in P.
Definition: vec.h:630
u8 * sk_pi
Definition: ikev2_priv.h:395
static void mhash_init_vec_string(mhash_t *h, uword n_value_bytes)
Definition: mhash.h:84
static void ikev2_send_ike(vlib_main_t *vm, ip4_address_t *src, ip4_address_t *dst, u32 bi0, u32 len, u16 src_port, u16 dst_port, u32 sw_if_index)
Definition: ikev2.c:3145
static udp_dst_port_info_t * udp_get_dst_port_info(udp_main_t *um, udp_dst_port_t dst_port, u8 is_ip4)
Definition: udp.h:275
ip_lookup_main_t lookup_main
Definition: ip4.h:108
vl_api_ip4_address_t iaddr
ip4_address_t ip4
Definition: ikev2_priv.h:273
vlib_main_t * vm
Definition: in2out_ed.c:1582
#define IKEV2_GCM_ICV_SIZE
Definition: ikev2.h:28
clib_error_t * ikev2_set_profile_sa_lifetime(vlib_main_t *vm, u8 *name, u64 lifetime, u32 jitter, u32 handover, u64 maxdata)
Definition: ikev2.c:3658
u8 * format(u8 *s, const char *fmt,...)
Definition: format.c:424
u16 flags_and_fragment_offset
Definition: ip4_packet.h:106
void ikev2_payload_add_ke(ikev2_payload_chain_t *c, u16 dh_group, u8 *dh_data)
ikev2_next_t
Definition: ikev2.c:90
static void ikev2_generate_sa_init_data(ikev2_sa_t *sa)
Definition: ikev2.c:357
#define IKEV2_NONCE_SIZE
Definition: ikev2.h:23
u8 initial_contact
Definition: ikev2_priv.h:370
ikev2_ts_t * tsi
Definition: ikev2_priv.h:332
clib_error_t * ikev2_set_liveness_params(u32 period, u32 max_retries)
Definition: ikev2.c:4207
#define IKEV2_PAYLOAD_TSR
Definition: ikev2.h:112
#define vec_validate_aligned(V, I, A)
Make sure vector is long enough for given index (no header, specified alignment)
Definition: vec.h:520
int ipsec_sa_add_and_lock(u32 id, u32 spi, ipsec_protocol_t proto, ipsec_crypto_alg_t crypto_alg, const ipsec_key_t *ck, ipsec_integ_alg_t integ_alg, const ipsec_key_t *ik, ipsec_sa_flags_t flags, u32 tx_table_id, u32 salt, const ip46_address_t *tun_src, const ip46_address_t *tun_dst, u32 *sa_out_index, u16 src_port, u16 dst_port)
Definition: ipsec_sa.c:170
int ipip_add_tunnel(ipip_transport_t transport, u32 instance, ip46_address_t *src, ip46_address_t *dst, u32 fib_index, tunnel_encap_decap_flags_t flags, ip_dscp_t dscp, tunnel_mode_t tmode, u32 *sw_if_indexp)
Definition: ipip.c:653
ikev2_auth_t r_auth
Definition: ikev2_priv.h:400
u16 mask
Definition: flow_types.api:52
static_always_inline int ikev2_mngr_process_responder_sas(ikev2_sa_t *sa)
Definition: ikev2.c:4337
u16 start_port
Definition: ikev2_types.api:35
#define pool_get(P, E)
Allocate an object E from a pool P (unspecified alignment).
Definition: pool.h:252
static void ikev2_delete_sa(ikev2_sa_t *sa)
Definition: ikev2.c:340
u16 ipsec_over_udp_port
Definition: ikev2_priv.h:360
void ipsec_mk_key(ipsec_key_t *key, const u8 *data, u8 len)
Definition: ipsec_sa.c:56
u8 * last_sa_init_res_packet_data
Definition: ikev2_priv.h:414
unsigned char u8
Definition: types.h:56
vnet_api_error_t ikev2_set_profile_ipsec_udp_port(vlib_main_t *vm, u8 *name, u16 port, u8 is_set)
Definition: ikev2.c:3609
ikev2_notify_t * ikev2_parse_notify_payload(ike_payload_header_t *ikep)
u8 init_response_received
Definition: ikev2_priv.h:432
u8 data[128]
Definition: ipsec_types.api:89
static void ikev2_cleanup_profile_sessions(ikev2_main_t *km, ikev2_profile_t *p)
Definition: ikev2.c:3329
ikev2_sa_transform_t * ikev2_sa_get_td_for_type(ikev2_sa_proposal_t *p, ikev2_transform_type_t type)
Definition: ikev2.c:214
ikev2_auth_t auth
Definition: ikev2_priv.h:348
u8 id[64]
Definition: dhcp.api:160
static void ikev2_process_informational_req(vlib_main_t *vm, ikev2_sa_t *sa, ike_header_t *ike, u32 len)
Definition: ikev2.c:1133
#define vec_reset_length(v)
Reset vector length to zero NULL-pointer tolerant.
double f64
Definition: types.h:142
ikev2_ts_t * tsr
Definition: ikev2_priv.h:333
#define vlib_worker_thread_barrier_sync(X)
Definition: threads.h:205
u16 end_port
Definition: ikev2_types.api:36
vlib_node_registration_t ip4_lookup_node
(constructor) VLIB_REGISTER_NODE (ip4_lookup_node)
Definition: ip4_forward.c:104
u16 key_trunc
Definition: ikev2_types.api:95
#define clib_memcpy(d, s, n)
Definition: string.h:180
static void ikev2_mngr_process_ipsec_sa(ipsec_sa_t *ipsec_sa)
Definition: ikev2.c:4220
ikev2_id_t rem_id
Definition: ikev2_priv.h:350
#define vec_add(V, E, N)
Add N elements to end of vector V (no header, unspecified alignment)
Definition: vec.h:668
ikev2_transform_dh_type_t
Definition: ikev2.h:326
log_level
Definition: vpe_types.api:32
u8 * ikev2_decrypt_aead_data(ikev2_main_per_thread_data_t *ptd, ikev2_sa_t *sa, ikev2_sa_transform_t *tr_encr, u8 *data, int data_len, u8 *aad, u32 aad_len, u8 *tag)
Definition: ikev2_crypto.c:353
u64 lifetime
Definition: ikev2_types.api:80
ikev2_child_sa_t * ikev2_sa_get_child(ikev2_sa_t *sa, u32 spi, ikev2_protocol_id_t prot_id, int by_initiator)
Definition: ikev2.c:231
u32 next_index
Definition: ikev2.c:49
u32 last_msg_id
Definition: ikev2_priv.h:417
#define static_always_inline
Definition: clib.h:108
#define IKEV2_PAYLOAD_DELETE
Definition: ikev2.h:109
#define pool_foreach(VAR, POOL, BODY)
Iterate through pool.
Definition: pool.h:513
ikev2_sa_proposal_t * r_proposals
Definition: ikev2_priv.h:295
void ikev2_generate_dh(ikev2_sa_t *sa, ikev2_sa_transform_t *t)
Definition: ikev2_crypto.c:491
#define VLIB_INIT_FUNCTION(x)
Definition: init.h:173
static uword vlib_process_get_events(vlib_main_t *vm, uword **data_vector)
Return the first event type which has occurred and a vector of per-event data of that type...
Definition: node_funcs.h:579
ipsec_main_t ipsec_main
Definition: ipsec.c:28
EVP_PKEY * ikev2_load_cert_file(u8 *file)
Definition: ikev2_crypto.c:809
clib_error_t * ikev2_initiate_sa_init(vlib_main_t *vm, u8 *name)
Definition: ikev2.c:3681
#define IKEV2_LIVENESS_PERIOD_CHECK
Definition: ikev2.c:34
int ipsec_tun_protect_del(u32 sw_if_index, const ip_address_t *nh)
Definition: ipsec_tun.c:769
static ikev2_sa_transform_t * ikev2_find_transform_data(ikev2_sa_transform_t *t)
Definition: ikev2.c:114
ip4_address_t dst_address
Definition: ip4_packet.h:125
u32 liveness_max_retries
Definition: ikev2_priv.h:510
#define vec_new(T, N)
Create new vector of given type and length (unspecified alignment, no header).
Definition: vec.h:350
EVP_PKEY * ikev2_load_key_file(u8 *file)
Definition: ikev2_crypto.c:840
clib_error_t * ikev2_set_profile_auth(vlib_main_t *vm, u8 *name, u8 auth_method, u8 *auth_data, u8 data_hex_format)
Definition: ikev2.c:3408
static u8 * ikev2_decrypt_sk_payload(ikev2_sa_t *sa, ike_header_t *ike, u8 *payload, u32 len)
Definition: ikev2.c:844
ipsec_crypto_alg_t encr_type
Definition: ikev2.c:1659
void ikev2_parse_vendor_payload(ike_payload_header_t *ikep)
ip4_address_t start_addr
Definition: ikev2_priv.h:266
#define hash_foreach(key_var, value_var, h, body)
Definition: hash.h:442
#define vec_elt_at_index(v, i)
Get vector value at index i checking that i is in bounds.
static_always_inline u8 * ikev2_compute_nat_sha1(u64 ispi, u64 rspi, u32 ip, u16 port)
Definition: ikev2.c:628
ipsec_integ_alg_t integ_type
Definition: ikev2.c:1660
vlib_frame_t * vlib_get_frame_to_node(vlib_main_t *vm, u32 to_node_index)
Definition: main.c:182
#define clib_error_return(e, args...)
Definition: error.h:99
static u32 ikev2_get_new_ike_header_buff(vlib_main_t *vm, ike_header_t **ike)
Definition: ikev2.c:3190
int ipsec_sa_unlock_id(u32 id)
Definition: ipsec_sa.c:428
void ikev2_payload_add_id(ikev2_payload_chain_t *c, ikev2_id_t *id, u8 type)
#define IKEV2_PAYLOAD_NOTIFY
Definition: ikev2.h:108
void vl_api_rpc_call_main_thread(void *fp, u8 *data, u32 data_length)
Definition: vlib_api.c:619
static void ikev2_sa_match_ts(ikev2_sa_t *sa)
Definition: ikev2.c:1387
ikev2_sa_proposal_t * i_proposals
Definition: ikev2_priv.h:386
uword * sw_if_indices
Definition: ikev2_priv.h:492
static void ikev2_sa_auth(ikev2_sa_t *sa)
Definition: ikev2.c:1457
#define vec_resize(V, N)
Resize a vector (no header, unspecified alignment) Add N elements to end of given vector V...
Definition: vec.h:281
ikev2_transform_integ_type_t integ_alg
Definition: ikev2_priv.h:279
unsigned int u32
Definition: types.h:88
ikev2_auth_t i_auth
Definition: ikev2_priv.h:399
#define ikev2_set_state(sa, v)
Definition: ikev2.c:42
#define ikev2_payload_destroy_chain(V)
Definition: ikev2_priv.h:554
clib_error_t * ikev2_set_profile_esp_transforms(vlib_main_t *vm, u8 *name, ikev2_transform_encr_type_t crypto_alg, ikev2_transform_integ_type_t integ_alg, u32 crypto_key_size)
Definition: ikev2.c:3566
static void ikev2_del_sa_init_from_main(u64 *ispi)
Definition: ikev2.c:2511
ikev2_id_t loc_id
Definition: ikev2_priv.h:349
ikev2_sa_transform_t * transforms
Definition: ikev2_priv.h:256
vlib_punt_hdl_t vlib_punt_client_register(const char *who)
Register a new clinet.
Definition: punt.c:156
#define IKEV2_EXCHANGE_CREATE_CHILD_SA
Definition: ikev2.h:90
u8 * sk_ar
Definition: ikev2_priv.h:392
u8 * r_dh_data
Definition: ikev2_priv.h:383
static void ikev2_initial_contact_cleanup(ikev2_sa_t *sa)
Definition: ikev2.c:955
ip46_address_t remote_ip
Definition: ikev2.c:1662
ikev2_responder_t responder
Definition: ikev2_priv.h:353
vl_api_fib_path_type_t type
Definition: fib_types.api:123
int ikev2_set_log_level(ikev2_log_level_t log_level)
Definition: ikev2.c:4192
static ikev2_profile_t * ikev2_profile_index_by_name(u8 *name)
Definition: ikev2.c:3131
#define hash_get(h, key)
Definition: hash.h:249
clib_error_t * ikev2_set_profile_id(vlib_main_t *vm, u8 *name, u8 id_type, u8 *data, int is_local)
Definition: ikev2.c:3442
u8 * ikev2_calc_prfplus(ikev2_sa_transform_t *tr, u8 *key, u8 *seed, int len)
Definition: ikev2_crypto.c:274
static u32 ikev2_mk_local_sa_id(u32 sai, u32 ci, u32 ti)
Definition: ikev2.c:1638
static clib_error_t * ikev2_set_initiator_proposals(vlib_main_t *vm, ikev2_sa_t *sa, ikev2_transforms_set *ts, ikev2_sa_proposal_t **proposals, int is_ike)
Definition: ikev2.c:3004
#define pool_elt_at_index(p, i)
Returns pointer to element at given index.
Definition: pool.h:534
ikev2_main_t ikev2_main
Definition: ikev2.c:36
void ikev2_cli_reference(void)
Definition: ikev2_cli.c:708
u8 * last_sa_init_req_packet_data
Definition: ikev2_priv.h:413
u8 integ_alg
Definition: ikev2_types.api:59
#define IKEV2_PAYLOAD_IDR
Definition: ikev2.h:105
static_always_inline u32 ikev2_flip_alternate_sa_bit(u32 id)
Definition: ikev2.c:1990
#define IKEV2_PAYLOAD_SA
Definition: ikev2.h:102
ikev2_ts_t rem_ts
Definition: ikev2_priv.h:352
#define ikev2_log_debug(...)
Definition: ikev2_priv.h:198
u8 * i_dh_data
Definition: ikev2_priv.h:382
uword mhash_set_mem(mhash_t *h, void *key, uword *new_value, uword *old_value)
Definition: mhash.c:264
static __clib_warn_unused_result u32 vlib_buffer_alloc(vlib_main_t *vm, u32 *buffers, u32 n_buffers)
Allocate buffers into supplied array.
Definition: buffer_funcs.h:677
static void ikev2_process_auth_req(vlib_main_t *vm, ikev2_sa_t *sa, ike_header_t *ike, u32 len)
Definition: ikev2.c:993
unsigned short u16
Definition: types.h:57
ikev2_sa_proposal_t * i_proposals
Definition: ikev2_priv.h:294
EVP_CIPHER_CTX * evp_ctx
Definition: ikev2_priv.h:458
void vlib_put_frame_to_node(vlib_main_t *vm, u32 to_node_index, vlib_frame_t *f)
Definition: main.c:216
u8 * r_nonce
Definition: ikev2_priv.h:376
#define IKEV2_HDR_FLAG_RESPONSE
Definition: ikev2.h:95
static void * vlib_buffer_get_current(vlib_buffer_t *b)
Get pointer to current data to process.
Definition: buffer.h:229
mhash_t profile_index_by_name
Definition: ikev2_priv.h:475
u16 end_port
Definition: ikev2_priv.h:265
ikev2_sa_transform_t * supported_transforms
Definition: ikev2_priv.h:472
#define pool_put(P, E)
Free an object E in pool P.
Definition: pool.h:302
ikev2_rekey_t * rekey
Definition: ikev2_priv.h:410
#define vec_dup(V)
Return copy of vector (no header, no alignment)
Definition: vec.h:429
clib_error_t * ikev2_initiate_delete_child_sa(vlib_main_t *vm, u32 ispi)
Definition: ikev2.c:3881
static_always_inline int ikev2_insert_non_esp_marker(ike_header_t *ike, int len)
Definition: ikev2.c:106
static void ikev2_rekey_child_sa_internal(vlib_main_t *vm, ikev2_sa_t *sa, ikev2_child_sa_t *csa)
Definition: ikev2.c:3958
#define PREDICT_FALSE(x)
Definition: clib.h:120
#define vec_del1(v, i)
Delete the element at index I.
Definition: vec.h:875
vl_api_ip4_address_t ip4
Definition: one.api:376
#define IKEV2_PAYLOAD_FLAG_CRITICAL
Definition: ikev2.h:97
static void ikev2_sa_auth_init(ikev2_sa_t *sa)
Definition: ikev2.c:1597
static_always_inline ikev2_main_per_thread_data_t * ikev2_get_per_thread_data()
Definition: ikev2_priv.h:583
ikev2_protocol_id_t
Definition: ikev2.h:115
#define vlib_validate_buffer_enqueue_x1(vm, node, next_index, to_next, n_left_to_next, bi0, next0)
Finish enqueueing one buffer forward in the graph.
Definition: buffer_node.h:224
ipsec_sa_flags_t flags
Definition: ikev2.c:1656
vl_api_address_t dst
Definition: gre.api:55
#define vlib_get_next_frame(vm, node, next_index, vectors, n_vectors_left)
Get pointer to next frame vector data by (vlib_node_runtime_t, next_index).
Definition: node_funcs.h:391
ip4_address_t end_addr
Definition: ikev2_priv.h:267
ip4_address_t iaddr
Definition: ikev2_priv.h:371
u8 * i_nonce
Definition: ikev2_priv.h:375
clib_error_t * ikev2_set_local_key(vlib_main_t *vm, u8 *file)
Definition: ikev2.c:3204
static void vlib_node_increment_counter(vlib_main_t *vm, u32 node_index, u32 counter_index, u64 increment)
Definition: node_funcs.h:1231
clib_error_t * ikev2_set_profile_ts(vlib_main_t *vm, u8 *name, u8 protocol_id, u16 start_port, u16 end_port, ip4_address_t start_addr, ip4_address_t end_addr, int is_local)
Definition: ikev2.c:3481
u32 punt_reason
Definition: buffer.h:149
static void ikev2_process_pending_sa_init(ikev2_main_t *km)
Definition: ikev2.c:4264
u8 len
Definition: ip_types.api:92
u8 * sk_ei
Definition: ikev2_priv.h:393
u8 old_remote_id_present
Definition: ikev2_priv.h:431
static void ikev2_initiate_delete_ike_sa_internal(vlib_main_t *vm, ikev2_main_per_thread_data_t *tkm, ikev2_sa_t *sa)
Definition: ikev2.c:3270
bool is_local
Definition: ikev2_types.api:33
#define IKEV2_EXCHANGE_INFORMATIONAL
Definition: ikev2.h:91
void ikev2_payload_add_delete(ikev2_payload_chain_t *c, ikev2_delete_t *d)
static u32 ikev2_mk_remote_sa_id(u32 sai, u32 ci, u32 ti)
Definition: ikev2.c:1644
vl_api_ip_port_and_mask_t src_port
Definition: flow_types.api:91
#define IKEV2_HDR_FLAG_INITIATOR
Definition: ikev2.h:93
#define IKEV2_KEY_PAD
Definition: ikev2.h:26
u32 sw_if_index
Definition: ikev2_priv.h:440
static void ikev2_add_tunnel_from_main(ikev2_add_ipsec_tunnel_args_t *a)
Definition: ikev2.c:1672
static uword ikev2_mngr_process_fn(vlib_main_t *vm, vlib_node_runtime_t *rt, vlib_frame_t *f)
Definition: ikev2.c:4360
clib_error_t * ikev2_initiate_rekey_child_sa(vlib_main_t *vm, u32 ispi)
Definition: ikev2.c:3998
vlib_punt_reason_t ipsec_punt_reason[IPSEC_PUNT_N_REASONS]
Definition: ipsec_punt.c:24
#define VLIB_REGISTER_NODE(x,...)
Definition: node.h:169
ikev2_transform_dh_type_t dh_type
Definition: ikev2_priv.h:236
#define ikev2_elog_uint(_level, _format, _val)
Definition: ikev2_priv.h:113
svmdb_client_t * c
u16 n_vectors
Definition: node.h:396
static_always_inline uword vlib_get_thread_index(void)
Definition: threads.h:219
static void vlib_get_combined_counter(const vlib_combined_counter_main_t *cm, u32 index, vlib_counter_t *result)
Get the value of a combined counter, never called in the speed path Scrapes the entire set of per-thr...
Definition: counter.h:259
static void ikev2_sa_del_child_sa(ikev2_sa_t *sa, ikev2_child_sa_t *child)
Definition: ikev2.c:289
ikev2_auth_method_t method
Definition: ikev2_priv.h:215
ikev2_transform_encr_type_t
Definition: ikev2.h:235
ikev2_delete_t * del
Definition: ikev2_priv.h:407
ikev2_ts_t * tsi
Definition: ikev2_priv.h:298
#define clib_memcmp(s1, s2, m1)
Definition: string.h:720
sll srl srl sll sra u16x4 i
Definition: vector_sse42.h:317
static vlib_punt_hdl_t punt_hdl
Definition: ipsec_punt.c:22
#define vec_free(V)
Free vector&#39;s memory (no header).
Definition: vec.h:380
void udp_unregister_dst_port(vlib_main_t *vm, udp_dst_port_t dst_port, u8 is_ip4)
Definition: udp_local.c:506
static_always_inline vnet_api_error_t ikev2_register_udp_port(ikev2_profile_t *p, u16 port)
Definition: ikev2.c:3218
#define IKEV2_LIVENESS_RETRIES
Definition: ikev2.c:33
ip46_address_t remote_ip
Definition: ikev2.c:1983
static uword ikev2_node_fn(vlib_main_t *vm, vlib_node_runtime_t *node, vlib_frame_t *frame)
Definition: ikev2.c:2532
ip4_address_t raddr
Definition: ikev2_priv.h:372
enum ipsec_sad_flags_t_ ipsec_sa_flags_t
static_always_inline u16 ikev2_get_port(ikev2_sa_t *sa)
Definition: ikev2.c:100
uword * udp_ports
Definition: ikev2_priv.h:504
u32 spi
Definition: flow_types.api:140
u8 * sk_er
Definition: ikev2_priv.h:394
u8 is_initiator
Definition: ikev2_priv.h:420
static_always_inline void ikev2_unregister_udp_port(ikev2_profile_t *p)
Definition: ikev2.c:3246
#define ARRAY_LEN(x)
Definition: clib.h:67
#define IKEV2_PAYLOAD_KE
Definition: ikev2.h:103
void vlib_put_next_frame(vlib_main_t *vm, vlib_node_runtime_t *r, u32 next_index, u32 n_vectors_left)
Release pointer to next frame vector data.
Definition: main.c:483
string name[64]
Definition: ip.api:44
ikev2_ts_t loc_ts
Definition: ikev2_priv.h:351
#define ikev2_log_error(...)
Definition: ikev2_priv.h:194
ikev2_sa_proposal_t * r_proposals
Definition: ikev2_priv.h:387
vlib_main_t vlib_node_runtime_t * node
Definition: in2out_ed.c:1582
static u8 * ikev2_sa_generate_authmsg(ikev2_sa_t *sa, int is_responder)
Definition: ikev2.c:1332
u64 rspi
static void ikev2_calc_child_keys(ikev2_sa_t *sa, ikev2_child_sa_t *child)
Definition: ikev2.c:557
f64 old_id_expiration
Definition: ikev2_priv.h:428
#define hash_set1(h, key)
Definition: hash.h:258
enum ikev2_log_level_t_ ikev2_log_level_t
u32 * if_address_pool_index_by_sw_if_index
Head of doubly linked list of interface addresses for each software interface.
Definition: lookup.h:155
#define hash_create(elts, value_bytes)
Definition: hash.h:696
void ikev2_payload_add_auth(ikev2_payload_chain_t *c, ikev2_auth_t *auth)
ikev2_protocol_id_t protocol_id
Definition: ikev2_priv.h:254
vlib_combined_counter_main_t ipsec_sa_counters
SA packet & bytes counters.
Definition: ipsec_sa.c:27
u8 protocol_id
Definition: ikev2_priv.h:262
u16 cached_next_index
Next frame index that vector arguments were last enqueued to last time this node ran.
Definition: node.h:510
#define ASSERT(truth)
ip46_address_t local_ip
Definition: ikev2.c:1982
static_always_inline int ikev2_is_id_equal(ikev2_id_t *i1, ikev2_id_t *i2)
Definition: ikev2.c:940
v8 * ikev2_decrypt_data(ikev2_main_per_thread_data_t *ptd, ikev2_sa_t *sa, ikev2_sa_transform_t *tr_encr, u8 *data, int len)
Definition: ikev2_crypto.c:393
static uword * mhash_get(mhash_t *h, const void *key)
Definition: mhash.h:110
vnet_main_t * vnet_main
Definition: ikev2_priv.h:482
f64 liveness_period_check
Definition: ikev2_priv.h:437
ip_dscp_t tos
Definition: ip4_packet.h:96
void ikev2_sa_free_proposal_vector(ikev2_sa_proposal_t **v)
Definition: ikev2.c:247
ipsec_sa_t * sad
Definition: ipsec.h:107
#define IKEV2_PAYLOAD_AUTH
Definition: ikev2.h:106
IPv4 main type.
Definition: ip4.h:106
#define ikev2_payload_new_chain(V)
Definition: ikev2_priv.h:553
#define IKEV2_PAYLOAD_SK
Definition: ikev2.h:113
ikev2_sa_proposal_t * r_proposal
Definition: ikev2_priv.h:331
static void ikev2_process_sa_init_resp(vlib_main_t *vm, ikev2_sa_t *sa, ike_header_t *ike, udp_header_t *udp, u32 len)
Definition: ikev2.c:741
u8 * sk_ai
Definition: ikev2_priv.h:391
#define IKE_VERSION_2
Definition: ikev2.h:86
void ikev2_complete_dh(ikev2_sa_t *sa, ikev2_sa_transform_t *t)
Definition: ikev2_crypto.c:639
#define vec_append(v1, v2)
Append v2 after v1.
Definition: vec.h:890
int ikev2_encrypt_aead_data(ikev2_main_per_thread_data_t *ptd, ikev2_sa_t *sa, ikev2_sa_transform_t *tr_encr, v8 *src, u8 *dst, u8 *aad, u32 aad_len, u8 *tag)
Definition: ikev2_crypto.c:419
static void vlib_buffer_advance(vlib_buffer_t *b, word l)
Advance current data pointer by the supplied (signed!) amount.
Definition: buffer.h:248
static vlib_node_registration_t ikev2_node
(constructor) VLIB_REGISTER_NODE (ikev2_node)
Definition: ikev2.c:65
u16 dh_group
Definition: ikev2_priv.h:379
u8 is_tun_itf_set
Definition: ikev2_priv.h:423
static u8 plaintext[]
Definition: aes_cbc.c:29
ikev2_log_level_t log_level
Definition: ikev2_priv.h:501
ikev2_sa_proposal_t * i_proposal
Definition: ikev2_priv.h:330
u32 sw_if_index
Definition: ipip.h:86
vlib_node_registration_t ipsec4_tun_input_node
(constructor) VLIB_REGISTER_NODE (ipsec4_tun_input_node)
Definition: ipsec_tun_in.c:367
#define IKEV2_PAYLOAD_TSI
Definition: ikev2.h:111
EVP_PKEY * key
Definition: ikev2_priv.h:218
u8 liveness_retries
Definition: ikev2_priv.h:436
typedef key
Definition: ipsec_types.api:85
ikev2_transform_encr_type_t encr_type
Definition: ikev2_priv.h:233
struct _vlib_node_registration vlib_node_registration_t
u32 crypto_key_size
Definition: ikev2_types.api:58
u8 * last_res_packet_data
Definition: ikev2_priv.h:418
ikev2_transform_integ_type_t integ_type
Definition: ikev2_priv.h:235
static char * ikev2_error_strings[]
Definition: ikev2.c:84
Definition: defs.h:47
void vnet_sw_interface_admin_down(vnet_main_t *vnm, u32 sw_if_index)
Definition: interface.c:528
#define clib_atomic_bool_cmp_and_swap(addr, old, new)
Definition: atomics.h:38
int vlib_punt_register(vlib_punt_hdl_t client, vlib_punt_reason_t reason, const char *node_name)
Register a node to receive particular punted buffers.
Definition: punt.c:268
vl_api_address_t ip
Definition: l2.api:501
vl_api_ip4_address_t start_addr
Definition: ikev2_types.api:37
u8 protocol_id
Definition: ikev2_types.api:34
u32 ikev2_non_esp_marker
Definition: ikev2.c:97
#define IKEV2_PORT
Definition: ikev2.h:24
#define vec_len(v)
Number of elements in vector (rvalue-only, NULL tolerant)
u16 start_port
Definition: ikev2_priv.h:264
void ikev2_payload_chain_add_padding(ikev2_payload_chain_t *c, int bs)
u8 * sk_pr
Definition: ikev2_priv.h:396
vlib_main_t vlib_node_runtime_t vlib_frame_t * frame
Definition: in2out_ed.c:1583
VLIB buffer representation.
Definition: buffer.h:102
u64 uword
Definition: types.h:112
#define IKEV2_PAYLOAD_IDI
Definition: ikev2.h:104
clib_error_t * ikev2_set_profile_ike_transforms(vlib_main_t *vm, u8 *name, ikev2_transform_encr_type_t crypto_alg, ikev2_transform_integ_type_t integ_alg, ikev2_transform_dh_type_t dh_type, u32 crypto_key_size)
Definition: ikev2.c:3541
ikev2_id_t i_id
Definition: ikev2_priv.h:403
#define ikev2_elog_uint_peers(_level, _format, _val, _ip1, _ip2)
Definition: ikev2_priv.h:132
static void * vlib_frame_vector_args(vlib_frame_t *f)
Get pointer to frame vector data.
Definition: node_funcs.h:297
ipsec_crypto_alg_t
Definition: ipsec_sa.h:37
u32 index
Definition: flow_types.api:221
ikev2_ts_t * tsr
Definition: ikev2_priv.h:299
ikev2_child_sa_t * childs
Definition: ikev2_priv.h:434
vlib_log_class_t log_class
Definition: ikev2_priv.h:498
ikev2_transform_prf_type_t prf_type
Definition: ikev2_priv.h:234
int ipip_del_tunnel(u32 sw_if_index)
Definition: ipip.c:761
u16 port
Definition: lb_types.api:72
Linear Congruential Random Number Generator.
#define IKEV2_EXCHANGE_IKE_AUTH
Definition: ikev2.h:89
vl_api_ip4_address_t raddr
static int ikev2_ts_cmp(ikev2_ts_t *ts1, ikev2_ts_t *ts2)
Definition: ikev2.c:1375
#define vnet_buffer(b)
Definition: buffer.h:417
clib_error_t * ikev2_init(vlib_main_t *vm)
Definition: ikev2.c:4038
ip46_address_t local_ip
Definition: ikev2.c:1661
vl_api_ip4_address_t end_addr
Definition: ikev2_types.api:38
static u32 random_u32(u32 *seed)
32-bit random number generator
Definition: random.h:69
void vlib_worker_thread_barrier_release(vlib_main_t *vm)
Definition: threads.c:1554
ikev2_error_t
Definition: ikev2.c:76
ip4_main_t ip4_main
Global ip4 main structure.
Definition: ip4_forward.c:1144
static vlib_thread_main_t * vlib_get_thread_main()
Definition: global_funcs.h:32
u32 handover
Definition: ikev2_types.api:83
uword * sa_by_ispi
Definition: ikev2_priv.h:487
#define vec_foreach(var, vec)
Vector iterator.
u8 unsupported_cp
Definition: ikev2_priv.h:369
u64 ispi
static void ikev2_sa_free_all_child_sa(ikev2_child_sa_t **childs)
Definition: ikev2.c:280
u16 flags
Copy of main node flags.
Definition: node.h:500
void * vlib_add_trace(vlib_main_t *vm, vlib_node_runtime_t *r, vlib_buffer_t *b, u32 n_data_bytes)
Definition: trace.c:577
static ikev2_sa_proposal_t * ikev2_select_proposal(ikev2_sa_proposal_t *proposals, ikev2_protocol_id_t prot_id)
Definition: ikev2.c:142
u32 profile_index
Definition: ikev2_priv.h:422
void udp_register_dst_port(vlib_main_t *vm, udp_dst_port_t dst_port, u32 node_index, u8 is_ip4)
Definition: udp_local.c:468
u8 ip_version_and_header_length
Definition: ip4_packet.h:93
ikev2_transform_type_t
Definition: ikev2.h:211
ikev2_transforms_set esp_ts
Definition: ikev2_priv.h:355
#define VLIB_NODE_FLAG_TRACE
Definition: node.h:301
void ikev2_crypto_init(ikev2_main_t *km)
Definition: ikev2_crypto.c:862
static void ikev2_del_tunnel_from_main(ikev2_del_ipsec_tunnel_args_t *a)
Definition: ikev2.c:1999
#define CLIB_CACHE_LINE_BYTES
Definition: cache.h:59
void ikev2_payload_add_ts(ikev2_payload_chain_t *c, ikev2_ts_t *ts, u8 type)
vlib_main_t * vlib_main
Definition: ikev2_priv.h:481
static void ikev2_sa_free_all_vec(ikev2_sa_t *sa)
Definition: ikev2.c:296
u8 keys_generated
Definition: ikev2_priv.h:444
#define VLIB_INITS(...)
Definition: init.h:357
static void ikev2_send_informational_request(ikev2_sa_t *sa)
Definition: ikev2.c:4295
static vlib_buffer_t * vlib_get_buffer(vlib_main_t *vm, u32 buffer_index)
Translate buffer index into buffer pointer.
Definition: buffer_funcs.h:85
#define IPSEC_UDP_PORT_NONE
Definition: ipsec_sa.h:277
static u16 ip4_header_checksum(ip4_header_t *i)
Definition: ip4_packet.h:314
Definition: udp.h:145
u8 * ikev2_calc_sign(EVP_PKEY *pkey, u8 *data)
Definition: ikev2_crypto.c:775
v8 * ikev2_calc_integr(ikev2_sa_transform_t *tr, v8 *key, u8 *data, int len)
Definition: ikev2_crypto.c:316
static void ip46_address_set_ip4(ip46_address_t *ip46, const ip4_address_t *ip)
Definition: ip46_address.h:67
vl_api_interface_index_t sw_if_index
Definition: wireguard.api:33
u8 * format_ikev2_id_type(u8 *s, va_list *args)
Definition: defs.h:46
#define foreach_ikev2_error
Definition: ikev2.c:67
static void ikev2_init_sa(vlib_main_t *vm, ikev2_sa_t *sa)
Definition: ikev2.c:2503
u32 sw_if_index
Definition: ikev2.c:50
#define IKEV2_GCM_IV_SIZE
Definition: ikev2.h:31
u16 ipsec_over_udp_port
Definition: ikev2_priv.h:426
int ipsec_tun_protect_update(u32 sw_if_index, const ip_address_t *nh, u32 sa_out, u32 *sas_in)
Definition: ipsec_tun.c:616
void ikev2_payload_add_notify_2(ikev2_payload_chain_t *c, u16 msg_type, u8 *data, ikev2_notify_t *notify)
ikev2_delete_t * ikev2_parse_delete_payload(ike_payload_header_t *ikep)