Coverage Report

Created: 2024-05-20 01:00

/src/openiked-portable/iked/ikev2_pld.c
Line
Count
Source (jump to first uncovered line)
1
/*  $OpenBSD: ikev2_pld.c,v 1.133 2023/09/02 18:36:30 tobhe Exp $ */
2
3
/*
4
 * Copyright (c) 2019 Tobias Heider <tobias.heider@stusta.de>
5
 * Copyright (c) 2010-2013 Reyk Floeter <reyk@openbsd.org>
6
 * Copyright (c) 2014 Hans-Joerg Hoexer
7
 *
8
 * Permission to use, copy, modify, and distribute this software for any
9
 * purpose with or without fee is hereby granted, provided that the above
10
 * copyright notice and this permission notice appear in all copies.
11
 *
12
 * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES
13
 * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF
14
 * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR
15
 * ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
16
 * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN
17
 * ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF
18
 * OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
19
 */
20
21
#include <sys/queue.h>
22
#include <sys/socket.h>
23
#include <sys/uio.h>
24
25
#include <netinet/in.h>
26
#include <arpa/inet.h>
27
28
#include <stdlib.h>
29
#include <stdio.h>
30
#include <unistd.h>
31
#include <string.h>
32
#include <signal.h>
33
#include <endian.h>
34
#include <errno.h>
35
#include <err.h>
36
#include <event.h>
37
38
#include <openssl/sha.h>
39
#include <openssl/evp.h>
40
41
#include "iked.h"
42
#include "ikev2.h"
43
#include "eap.h"
44
#include "dh.h"
45
46
int  ikev2_validate_pld(struct iked_message *, size_t, size_t,
47
      struct ikev2_payload *);
48
int  ikev2_pld_payloads(struct iked *, struct iked_message *,
49
      size_t, size_t, unsigned int);
50
int  ikev2_validate_sa(struct iked_message *, size_t, size_t,
51
      struct ikev2_sa_proposal *);
52
int  ikev2_pld_sa(struct iked *, struct ikev2_payload *,
53
      struct iked_message *, size_t, size_t);
54
int  ikev2_validate_xform(struct iked_message *, size_t, size_t,
55
      struct ikev2_transform *);
56
int  ikev2_pld_xform(struct iked *, struct iked_message *,
57
      size_t, size_t);
58
int  ikev2_validate_attr(struct iked_message *, size_t, size_t,
59
      struct ikev2_attribute *);
60
int  ikev2_pld_attr(struct iked *, struct ikev2_transform *,
61
      struct iked_message *, size_t, size_t);
62
int  ikev2_validate_ke(struct iked_message *, size_t, size_t,
63
      struct ikev2_keyexchange *);
64
int  ikev2_pld_ke(struct iked *, struct ikev2_payload *,
65
      struct iked_message *, size_t, size_t);
66
int  ikev2_validate_id(struct iked_message *, size_t, size_t,
67
      struct ikev2_id *);
68
int  ikev2_pld_id(struct iked *, struct ikev2_payload *,
69
      struct iked_message *, size_t, size_t, unsigned int);
70
int  ikev2_validate_cert(struct iked_message *, size_t, size_t,
71
      struct ikev2_cert *);
72
int  ikev2_pld_cert(struct iked *, struct ikev2_payload *,
73
      struct iked_message *, size_t, size_t);
74
int  ikev2_validate_certreq(struct iked_message *, size_t, size_t,
75
      struct ikev2_cert *);
76
int  ikev2_pld_certreq(struct iked *, struct ikev2_payload *,
77
      struct iked_message *, size_t, size_t);
78
int  ikev2_pld_nonce(struct iked *, struct ikev2_payload *,
79
      struct iked_message *, size_t, size_t);
80
int  ikev2_validate_notify(struct iked_message *, size_t, size_t,
81
      struct ikev2_notify *);
82
int  ikev2_pld_notify(struct iked *, struct ikev2_payload *,
83
      struct iked_message *, size_t, size_t);
84
int  ikev2_validate_delete(struct iked_message *, size_t, size_t,
85
      struct ikev2_delete *);
86
int  ikev2_pld_delete(struct iked *, struct ikev2_payload *,
87
      struct iked_message *, size_t, size_t);
88
int  ikev2_validate_tss(struct iked_message *, size_t, size_t,
89
      struct ikev2_tsp *);
90
int  ikev2_pld_tss(struct iked *, struct ikev2_payload *,
91
      struct iked_message *, size_t, size_t);
92
int  ikev2_validate_ts(struct iked_message *, size_t, size_t,
93
      struct ikev2_ts *);
94
int  ikev2_pld_ts(struct iked *, struct ikev2_payload *,
95
      struct iked_message *, size_t, size_t, unsigned int);
96
int  ikev2_validate_auth(struct iked_message *, size_t, size_t,
97
      struct ikev2_auth *);
98
int  ikev2_pld_auth(struct iked *, struct ikev2_payload *,
99
      struct iked_message *, size_t, size_t);
100
int  ikev2_pld_e(struct iked *, struct ikev2_payload *,
101
      struct iked_message *, size_t, size_t);
102
int  ikev2_pld_ef(struct iked *env, struct ikev2_payload *pld,
103
      struct iked_message *msg, size_t offset, size_t left);
104
int  ikev2_frags_reassemble(struct iked *env,
105
      struct ikev2_payload *pld, struct iked_message *msg);
106
int  ikev2_validate_cp(struct iked_message *, size_t, size_t,
107
      struct ikev2_cp *);
108
int  ikev2_pld_cp(struct iked *, struct ikev2_payload *,
109
      struct iked_message *, size_t, size_t);
110
int  ikev2_validate_eap(struct iked_message *, size_t, size_t,
111
      struct eap_header *);
112
int  ikev2_pld_eap(struct iked *, struct ikev2_payload *,
113
      struct iked_message *, size_t, size_t);
114
115
int
116
ikev2_pld_parse(struct iked *env, struct ike_header *hdr,
117
    struct iked_message *msg, size_t offset)
118
16.0k
{
119
16.0k
  log_debug("%s: header ispi %s rspi %s"
120
16.0k
      " nextpayload %s version 0x%02x exchange %s flags 0x%02x"
121
16.0k
      " msgid %d length %u response %d", __func__,
122
16.0k
      print_spi(betoh64(hdr->ike_ispi), 8),
123
16.0k
      print_spi(betoh64(hdr->ike_rspi), 8),
124
16.0k
      print_map(hdr->ike_nextpayload, ikev2_payload_map),
125
16.0k
      hdr->ike_version,
126
16.0k
      print_map(hdr->ike_exchange, ikev2_exchange_map),
127
16.0k
      hdr->ike_flags,
128
16.0k
      betoh32(hdr->ike_msgid),
129
16.0k
      betoh32(hdr->ike_length),
130
16.0k
      msg->msg_response);
131
132
16.0k
  if (ibuf_size(msg->msg_data) < betoh32(hdr->ike_length)) {
133
6
    log_debug("%s: short message", __func__);
134
6
    return (-1);
135
6
  }
136
137
16.0k
  offset += sizeof(*hdr);
138
139
16.0k
  return (ikev2_pld_payloads(env, msg, offset,
140
16.0k
      betoh32(hdr->ike_length), hdr->ike_nextpayload));
141
16.0k
}
142
143
int
144
ikev2_validate_pld(struct iked_message *msg, size_t offset, size_t left,
145
    struct ikev2_payload *pld)
146
325k
{
147
325k
  uint8_t   *msgbuf = ibuf_data(msg->msg_data);
148
325k
  size_t     pld_length;
149
150
  /* We need at least the generic header. */
151
325k
  if (left < sizeof(*pld)) {
152
2.09k
    log_debug("%s: malformed payload: too short for generic "
153
2.09k
        "header (%zu < %zu)", __func__, left, sizeof(*pld));
154
2.09k
    return (-1);
155
2.09k
  }
156
323k
  memcpy(pld, msgbuf + offset, sizeof(*pld));
157
158
  /*
159
   * We need at least the specified number of bytes.
160
   * pld_length is the full size of the payload including
161
   * the generic payload header.
162
   */
163
323k
  pld_length = betoh16(pld->pld_length);
164
323k
  if (left < pld_length) {
165
7.05k
    log_debug("%s: malformed payload: shorter than specified "
166
7.05k
        "(%zu < %zu)", __func__, left, pld_length);
167
7.05k
    return (-1);
168
7.05k
  }
169
  /*
170
   * Sanity check the specified payload size, it must
171
   * be at least the size of the generic payload header.
172
   */
173
316k
  if (pld_length < sizeof(*pld)) {
174
2.90k
    log_debug("%s: malformed payload: shorter than minimum "
175
2.90k
        "header size (%zu < %zu)", __func__, pld_length,
176
2.90k
        sizeof(*pld));
177
2.90k
    return (-1);
178
2.90k
  }
179
180
313k
  return (0);
181
316k
}
182
183
int
184
ikev2_pld_payloads(struct iked *env, struct iked_message *msg,
185
    size_t offset, size_t length, unsigned int payload)
186
16.0k
{
187
16.0k
  struct ikev2_payload   pld;
188
16.0k
  unsigned int     e;
189
16.0k
  int      ret;
190
16.0k
  uint8_t     *msgbuf = ibuf_data(msg->msg_data);
191
16.0k
  size_t       total, left;
192
193
  /* Check if message was decrypted in an E payload */
194
16.0k
  e = msg->msg_e ? IKED_E : 0;
195
196
  /* Bytes left in datagram. */
197
16.0k
  total = length - offset;
198
199
329k
  while (payload != 0 && offset < length) {
200
325k
    if (ikev2_validate_pld(msg, offset, total, &pld))
201
12.0k
      return (-1);
202
203
313k
    log_debug("%s: %spayload %s"
204
313k
        " nextpayload %s critical 0x%02x length %d",
205
313k
        __func__, e ? "decrypted " : "",
206
313k
        print_map(payload, ikev2_payload_map),
207
313k
        print_map(pld.pld_nextpayload, ikev2_payload_map),
208
313k
        pld.pld_reserved & IKEV2_CRITICAL_PAYLOAD,
209
313k
        betoh16(pld.pld_length));
210
211
    /* Skip over generic payload header. */
212
313k
    offset += sizeof(pld);
213
313k
    total -= sizeof(pld);
214
313k
    left = betoh16(pld.pld_length) - sizeof(pld);
215
313k
    ret = 0;
216
217
313k
    switch (payload | e) {
218
0
    case IKEV2_PAYLOAD_SA:
219
37.0k
    case IKEV2_PAYLOAD_SA | IKED_E:
220
37.0k
      ret = ikev2_pld_sa(env, &pld, msg, offset, left);
221
37.0k
      break;
222
0
    case IKEV2_PAYLOAD_KE:
223
12.9k
    case IKEV2_PAYLOAD_KE | IKED_E:
224
12.9k
      ret = ikev2_pld_ke(env, &pld, msg, offset, left);
225
12.9k
      break;
226
15.6k
    case IKEV2_PAYLOAD_IDi | IKED_E:
227
25.7k
    case IKEV2_PAYLOAD_IDr | IKED_E:
228
25.7k
      ret = ikev2_pld_id(env, &pld, msg, offset, left,
229
25.7k
          payload);
230
25.7k
      break;
231
11.3k
    case IKEV2_PAYLOAD_CERT | IKED_E:
232
11.3k
      ret = ikev2_pld_cert(env, &pld, msg, offset, left);
233
11.3k
      break;
234
0
    case IKEV2_PAYLOAD_CERTREQ:
235
16.3k
    case IKEV2_PAYLOAD_CERTREQ | IKED_E:
236
16.3k
      ret = ikev2_pld_certreq(env, &pld, msg, offset, left);
237
16.3k
      break;
238
12.6k
    case IKEV2_PAYLOAD_AUTH | IKED_E:
239
12.6k
      ret = ikev2_pld_auth(env, &pld, msg, offset, left);
240
12.6k
      break;
241
0
    case IKEV2_PAYLOAD_NONCE:
242
4.68k
    case IKEV2_PAYLOAD_NONCE | IKED_E:
243
4.68k
      ret = ikev2_pld_nonce(env, &pld, msg, offset, left);
244
4.68k
      break;
245
0
    case IKEV2_PAYLOAD_NOTIFY:
246
40.0k
    case IKEV2_PAYLOAD_NOTIFY | IKED_E:
247
40.0k
      ret = ikev2_pld_notify(env, &pld, msg, offset, left);
248
40.0k
      break;
249
10.7k
    case IKEV2_PAYLOAD_DELETE | IKED_E:
250
10.7k
      ret = ikev2_pld_delete(env, &pld, msg, offset, left);
251
10.7k
      break;
252
6.63k
    case IKEV2_PAYLOAD_TSi | IKED_E:
253
26.3k
    case IKEV2_PAYLOAD_TSr | IKED_E:
254
26.3k
      ret = ikev2_pld_tss(env, &pld, msg, offset, left);
255
26.3k
      break;
256
0
    case IKEV2_PAYLOAD_SK:
257
0
      ret = ikev2_pld_e(env, &pld, msg, offset, left);
258
0
      break;
259
0
    case IKEV2_PAYLOAD_SKF:
260
0
      ret = ikev2_pld_ef(env, &pld, msg, offset, left);
261
0
      break;
262
13.3k
    case IKEV2_PAYLOAD_CP | IKED_E:
263
13.3k
      ret = ikev2_pld_cp(env, &pld, msg, offset, left);
264
13.3k
      break;
265
26.6k
    case IKEV2_PAYLOAD_EAP | IKED_E:
266
26.6k
      ret = ikev2_pld_eap(env, &pld, msg, offset, left);
267
26.6k
      break;
268
75.8k
    default:
269
75.8k
      print_hex(msgbuf, offset,
270
75.8k
          betoh16(pld.pld_length) - sizeof(pld));
271
75.8k
      break;
272
313k
    }
273
274
313k
    if (ret != 0 && ikev2_msg_frompeer(msg)) {
275
771
      (void)ikev2_send_informational(env, msg);
276
771
      return (-1);
277
771
    }
278
279
    /* Encrypted payloads must appear last */
280
313k
    if ((payload == IKEV2_PAYLOAD_SK) ||
281
313k
        (payload == IKEV2_PAYLOAD_SKF))
282
4
      return (0);
283
284
313k
    payload = pld.pld_nextpayload;
285
313k
    offset += left;
286
313k
    total -= left;
287
313k
  }
288
289
3.24k
  return (0);
290
16.0k
}
291
292
int
293
ikev2_validate_sa(struct iked_message *msg, size_t offset, size_t left,
294
    struct ikev2_sa_proposal *sap)
295
42.2k
{
296
42.2k
  uint8_t   *msgbuf = ibuf_data(msg->msg_data);
297
42.2k
  size_t     sap_length;
298
299
42.2k
  if (left < sizeof(*sap)) {
300
18.9k
    log_debug("%s: malformed payload: too short for header "
301
18.9k
        "(%zu < %zu)", __func__, left, sizeof(*sap));
302
18.9k
    return (-1);
303
18.9k
  }
304
23.2k
  memcpy(sap, msgbuf + offset, sizeof(*sap));
305
306
23.2k
  sap_length = betoh16(sap->sap_length);
307
23.2k
  if (sap_length < sizeof(*sap)) {
308
6.50k
    log_debug("%s: malformed payload: shorter than minimum header "
309
6.50k
        "size (%zu < %zu)", __func__, sap_length, sizeof(*sap));
310
6.50k
    return (-1);
311
6.50k
  }
312
16.7k
  if (left < sap_length) {
313
3.34k
    log_debug("%s: malformed payload: too long for actual payload "
314
3.34k
        "size (%zu < %zu)", __func__, left, sap_length);
315
3.34k
    return (-1);
316
3.34k
  }
317
  /*
318
   * If there is only one proposal, sap_length must be the
319
   * total payload size.
320
   */
321
13.3k
  if (!sap->sap_more && left != sap_length) {
322
30
    log_debug("%s: malformed payload: SA payload length mismatches "
323
30
        "single proposal substructure length (%zu != %zu)",
324
30
        __func__, left, sap_length);
325
30
    return (-1);
326
30
  }
327
  /*
328
   * If there are more than one proposal, there must be bytes
329
   * left in the payload.
330
   */
331
13.3k
  if (sap->sap_more && left <= sap_length) {
332
1.01k
    log_debug("%s: malformed payload: SA payload too small for "
333
1.01k
        "further proposals (%zu <= %zu)", __func__,
334
1.01k
        left, sap_length);
335
1.01k
    return (-1);
336
1.01k
  }
337
12.3k
  return (0);
338
13.3k
}
339
340
int
341
ikev2_pld_sa(struct iked *env, struct ikev2_payload *pld,
342
    struct iked_message *msg, size_t offset, size_t left)
343
37.0k
{
344
37.0k
  struct ikev2_sa_proposal   sap;
345
37.0k
  struct iked_proposal    *prop = NULL;
346
37.0k
  uint32_t       spi32;
347
37.0k
  uint64_t       spi = 0, spi64;
348
37.0k
  uint8_t       *msgbuf = ibuf_data(msg->msg_data);
349
37.0k
  int        r;
350
37.0k
  struct iked_proposals   *props;
351
37.0k
  size_t         total;
352
353
42.2k
  do {
354
42.2k
    if (ikev2_validate_sa(msg, offset, left, &sap))
355
29.8k
      return (-1);
356
357
    /* Assumed size of the first proposals, including SPI if present. */
358
12.3k
    total = (betoh16(sap.sap_length) - sizeof(sap));
359
360
12.3k
    props = &msg->msg_parent->msg_proposals;
361
362
12.3k
    offset += sizeof(sap);
363
12.3k
    left -= sizeof(sap);
364
365
12.3k
    if (sap.sap_spisize) {
366
1.66k
      if (left < sap.sap_spisize) {
367
759
        log_debug("%s: malformed payload: SPI larger than "
368
759
            "actual payload (%zu < %d)", __func__, left,
369
759
            sap.sap_spisize);
370
759
        return (-1);
371
759
      }
372
905
      if (total < sap.sap_spisize) {
373
183
        log_debug("%s: malformed payload: SPI larger than "
374
183
            "proposal (%zu < %d)", __func__, total,
375
183
            sap.sap_spisize);
376
183
        return (-1);
377
183
      }
378
722
      switch (sap.sap_spisize) {
379
356
      case 4:
380
356
        memcpy(&spi32, msgbuf + offset, 4);
381
356
        spi = betoh32(spi32);
382
356
        break;
383
236
      case 8:
384
236
        memcpy(&spi64, msgbuf + offset, 8);
385
236
        spi = betoh64(spi64);
386
236
        break;
387
130
      default:
388
130
        log_debug("%s: unsupported SPI size %d",
389
130
            __func__, sap.sap_spisize);
390
130
        return (-1);
391
722
      }
392
393
592
      offset += sap.sap_spisize;
394
592
      left -= sap.sap_spisize;
395
396
      /* Assumed size of the proposal, now without SPI. */
397
592
      total -= sap.sap_spisize;
398
592
    }
399
400
    /*
401
     * As we verified sanity of packet headers, this check will
402
     * be always false, but just to be sure we keep it.
403
     */
404
11.2k
    if (left < total) {
405
0
      log_debug("%s: malformed payload: too long for payload "
406
0
          "(%zu < %zu)", __func__, left, total);
407
0
      return (-1);
408
0
    }
409
410
11.2k
    log_debug("%s: more %d reserved %d length %d"
411
11.2k
        " proposal #%d protoid %s spisize %d xforms %d spi %s",
412
11.2k
        __func__, sap.sap_more, sap.sap_reserved,
413
11.2k
        betoh16(sap.sap_length), sap.sap_proposalnr,
414
11.2k
        print_map(sap.sap_protoid, ikev2_saproto_map), sap.sap_spisize,
415
11.2k
        sap.sap_transforms, print_spi(spi, sap.sap_spisize));
416
417
11.2k
    if (ikev2_msg_frompeer(msg)) {
418
69
      if ((msg->msg_parent->msg_prop = config_add_proposal(props,
419
69
          sap.sap_proposalnr, sap.sap_protoid)) == NULL) {
420
69
        log_debug("%s: invalid proposal", __func__);
421
69
        return (-1);
422
69
      }
423
0
      prop = msg->msg_parent->msg_prop;
424
0
      prop->prop_peerspi.spi = spi;
425
0
      prop->prop_peerspi.spi_protoid = sap.sap_protoid;
426
0
      prop->prop_peerspi.spi_size = sap.sap_spisize;
427
428
0
      prop->prop_localspi.spi_protoid = sap.sap_protoid;
429
0
      prop->prop_localspi.spi_size = sap.sap_spisize;
430
0
    }
431
432
    /*
433
     * Parse the attached transforms
434
     */
435
11.2k
    if (sap.sap_transforms) {
436
6.44k
      r = ikev2_pld_xform(env, msg, offset, total);
437
6.44k
      if ((r == -2) && ikev2_msg_frompeer(msg)) {
438
0
        log_debug("%s: invalid proposal transform",
439
0
            __func__);
440
441
        /* cleanup and ignore proposal */
442
0
        config_free_proposal(props, prop);
443
0
        prop = msg->msg_parent->msg_prop = NULL;
444
6.44k
      } else if (r != 0) {
445
5.20k
        log_debug("%s: invalid proposal transforms",
446
5.20k
            __func__);
447
5.20k
        return (-1);
448
5.20k
      }
449
6.44k
    }
450
451
6.00k
    offset += total;
452
6.00k
    left -= total;
453
6.00k
  } while (sap.sap_more);
454
455
870
  return (0);
456
37.0k
}
457
458
int
459
ikev2_validate_xform(struct iked_message *msg, size_t offset, size_t total,
460
    struct ikev2_transform *xfrm)
461
8.72k
{
462
8.72k
  uint8_t   *msgbuf = ibuf_data(msg->msg_data);
463
8.72k
  size_t     xfrm_length;
464
465
8.72k
  if (total < sizeof(*xfrm)) {
466
792
    log_debug("%s: malformed payload: too short for header "
467
792
        "(%zu < %zu)", __func__, total, sizeof(*xfrm));
468
792
    return (-1);
469
792
  }
470
7.92k
  memcpy(xfrm, msgbuf + offset, sizeof(*xfrm));
471
472
7.92k
  xfrm_length = betoh16(xfrm->xfrm_length);
473
7.92k
  if (xfrm_length < sizeof(*xfrm)) {
474
1.15k
    log_debug("%s: malformed payload: shorter than minimum header "
475
1.15k
        "size (%zu < %zu)", __func__, xfrm_length, sizeof(*xfrm));
476
1.15k
    return (-1);
477
1.15k
  }
478
6.77k
  if (total < xfrm_length) {
479
711
    log_debug("%s: malformed payload: too long for payload size "
480
711
        "(%zu < %zu)", __func__, total, xfrm_length);
481
711
    return (-1);
482
711
  }
483
484
6.06k
  return (0);
485
6.77k
}
486
487
int
488
ikev2_pld_xform(struct iked *env, struct iked_message *msg,
489
    size_t offset, size_t total)
490
8.72k
{
491
8.72k
  struct ikev2_transform     xfrm;
492
8.72k
  char         id[BUFSIZ];
493
8.72k
  int        ret = 0;
494
8.72k
  int        r;
495
8.72k
  size_t         xfrm_length;
496
497
8.72k
  if (ikev2_validate_xform(msg, offset, total, &xfrm))
498
2.65k
    return (-1);
499
500
6.06k
  xfrm_length = betoh16(xfrm.xfrm_length);
501
502
6.06k
  switch (xfrm.xfrm_type) {
503
1.29k
  case IKEV2_XFORMTYPE_ENCR:
504
1.29k
    strlcpy(id, print_map(betoh16(xfrm.xfrm_id),
505
1.29k
        ikev2_xformencr_map), sizeof(id));
506
1.29k
    break;
507
845
  case IKEV2_XFORMTYPE_PRF:
508
845
    strlcpy(id, print_map(betoh16(xfrm.xfrm_id),
509
845
        ikev2_xformprf_map), sizeof(id));
510
845
    break;
511
180
  case IKEV2_XFORMTYPE_INTEGR:
512
180
    strlcpy(id, print_map(betoh16(xfrm.xfrm_id),
513
180
        ikev2_xformauth_map), sizeof(id));
514
180
    break;
515
861
  case IKEV2_XFORMTYPE_DH:
516
861
    strlcpy(id, print_map(betoh16(xfrm.xfrm_id),
517
861
        ikev2_xformdh_map), sizeof(id));
518
861
    break;
519
1.11k
  case IKEV2_XFORMTYPE_ESN:
520
1.11k
    strlcpy(id, print_map(betoh16(xfrm.xfrm_id),
521
1.11k
        ikev2_xformesn_map), sizeof(id));
522
1.11k
    break;
523
1.77k
  default:
524
1.77k
    snprintf(id, sizeof(id), "<%d>", betoh16(xfrm.xfrm_id));
525
1.77k
    break;
526
6.06k
  }
527
528
6.06k
  log_debug("%s: more %d reserved %d length %zu"
529
6.06k
      " type %s id %s",
530
6.06k
      __func__, xfrm.xfrm_more, xfrm.xfrm_reserved, xfrm_length,
531
6.06k
      print_map(xfrm.xfrm_type, ikev2_xformtype_map), id);
532
533
  /*
534
   * Parse transform attributes, if available
535
   */
536
6.06k
  msg->msg_attrlength = 0;
537
6.06k
  if (xfrm_length > sizeof(xfrm)) {
538
2.92k
    if (ikev2_pld_attr(env, &xfrm, msg, offset + sizeof(xfrm),
539
2.92k
        xfrm_length - sizeof(xfrm)) != 0) {
540
2.30k
      return (-1);
541
2.30k
    }
542
2.92k
  }
543
544
3.76k
  if (ikev2_msg_frompeer(msg)) {
545
0
    r = config_add_transform(msg->msg_parent->msg_prop,
546
0
        xfrm.xfrm_type, betoh16(xfrm.xfrm_id),
547
0
        msg->msg_attrlength, msg->msg_attrlength);
548
0
    if (r == -1) {
549
0
      log_debug("%s: failed to add transform: alloc error",
550
0
          __func__);
551
0
      return (r);
552
0
    } else if (r == -2) {
553
0
      log_debug("%s: failed to add transform: unknown type",
554
0
          __func__);
555
0
      return (r);
556
0
    }
557
0
  }
558
559
  /* Next transform */
560
3.76k
  offset += xfrm_length;
561
3.76k
  total -= xfrm_length;
562
3.76k
  if (xfrm.xfrm_more == IKEV2_XFORM_MORE)
563
2.27k
    ret = ikev2_pld_xform(env, msg, offset, total);
564
1.49k
  else if (total != 0) {
565
    /* No more transforms but still some data left. */
566
247
    log_debug("%s: less data than specified, %zu bytes left",
567
247
        __func__, total);
568
247
    ret = -1;
569
247
  }
570
571
3.76k
  return (ret);
572
3.76k
}
573
574
int
575
ikev2_validate_attr(struct iked_message *msg, size_t offset, size_t total,
576
    struct ikev2_attribute *attr)
577
56.2k
{
578
56.2k
  uint8_t   *msgbuf = ibuf_data(msg->msg_data);
579
580
56.2k
  if (total < sizeof(*attr)) {
581
1.09k
    log_debug("%s: malformed payload: too short for header "
582
1.09k
        "(%zu < %zu)", __func__, total, sizeof(*attr));
583
1.09k
    return (-1);
584
1.09k
  }
585
55.1k
  memcpy(attr, msgbuf + offset, sizeof(*attr));
586
587
55.1k
  return (0);
588
56.2k
}
589
590
int
591
ikev2_pld_attr(struct iked *env, struct ikev2_transform *xfrm,
592
    struct iked_message *msg, size_t offset, size_t total)
593
56.2k
{
594
56.2k
  struct ikev2_attribute     attr;
595
56.2k
  unsigned int       type;
596
56.2k
  uint8_t       *msgbuf = ibuf_data(msg->msg_data);
597
56.2k
  int        ret = 0;
598
56.2k
  size_t         attr_length;
599
600
56.2k
  if (ikev2_validate_attr(msg, offset, total, &attr))
601
1.09k
    return (-1);
602
603
55.1k
  type = betoh16(attr.attr_type) & ~IKEV2_ATTRAF_TV;
604
605
55.1k
  log_debug("%s: attribute type %s length %d total %zu",
606
55.1k
      __func__, print_map(type, ikev2_attrtype_map),
607
55.1k
      betoh16(attr.attr_length), total);
608
609
55.1k
  if (betoh16(attr.attr_type) & IKEV2_ATTRAF_TV) {
610
    /* Type-Value attribute */
611
43.9k
    offset += sizeof(attr);
612
43.9k
    total -= sizeof(attr);
613
614
43.9k
    if (type == IKEV2_ATTRTYPE_KEY_LENGTH)
615
50
      msg->msg_attrlength = betoh16(attr.attr_length);
616
43.9k
  } else {
617
    /* Type-Length-Value attribute */
618
11.2k
    attr_length = betoh16(attr.attr_length);
619
11.2k
    if (attr_length < sizeof(attr)) {
620
649
      log_debug("%s: malformed payload: shorter than "
621
649
          "minimum header size (%zu < %zu)", __func__,
622
649
          attr_length, sizeof(attr));
623
649
      return (-1);
624
649
    }
625
10.6k
    if (total < attr_length) {
626
558
      log_debug("%s: malformed payload: attribute larger "
627
558
          "than actual payload (%zu < %zu)", __func__,
628
558
          total, attr_length);
629
558
      return (-1);
630
558
    }
631
10.0k
    print_hex(msgbuf, offset + sizeof(attr),
632
10.0k
        attr_length - sizeof(attr));
633
10.0k
    offset += attr_length;
634
10.0k
    total -= attr_length;
635
10.0k
  }
636
637
53.9k
  if (total > 0) {
638
    /* Next attribute */
639
53.3k
    ret = ikev2_pld_attr(env, xfrm, msg, offset, total);
640
53.3k
  }
641
642
53.9k
  return (ret);
643
55.1k
}
644
645
int
646
ikev2_validate_ke(struct iked_message *msg, size_t offset, size_t left,
647
    struct ikev2_keyexchange *kex)
648
12.9k
{
649
12.9k
  uint8_t   *msgbuf = ibuf_data(msg->msg_data);
650
651
12.9k
  if (left < sizeof(*kex)) {
652
7.66k
    log_debug("%s: malformed payload: too short for header "
653
7.66k
        "(%zu < %zu)", __func__, left, sizeof(*kex));
654
7.66k
    return (-1);
655
7.66k
  }
656
5.25k
  memcpy(kex, msgbuf + offset, sizeof(*kex));
657
658
5.25k
  return (0);
659
12.9k
}
660
661
int
662
ikev2_pld_ke(struct iked *env, struct ikev2_payload *pld,
663
    struct iked_message *msg, size_t offset, size_t left)
664
12.9k
{
665
12.9k
  struct ikev2_keyexchange   kex;
666
12.9k
  uint8_t       *buf;
667
12.9k
  size_t         len;
668
12.9k
  uint8_t       *msgbuf = ibuf_data(msg->msg_data);
669
670
12.9k
  if (ikev2_validate_ke(msg, offset, left, &kex))
671
7.66k
    return (-1);
672
673
5.25k
  log_debug("%s: dh group %s reserved %d", __func__,
674
5.25k
      print_map(betoh16(kex.kex_dhgroup), ikev2_xformdh_map),
675
5.25k
      betoh16(kex.kex_reserved));
676
677
5.25k
  buf = msgbuf + offset + sizeof(kex);
678
5.25k
  len = left - sizeof(kex);
679
680
5.25k
  if (len == 0) {
681
2.93k
    log_debug("%s: malformed payload: no KE data given", __func__);
682
2.93k
    return (-1);
683
2.93k
  }
684
685
2.31k
  print_hex(buf, 0, len);
686
687
2.31k
  if (ikev2_msg_frompeer(msg)) {
688
27
    if (msg->msg_parent->msg_ke != NULL) {
689
4
      log_info("%s: duplicate KE payload", __func__);
690
4
      return (-1);
691
4
    }
692
23
    if ((msg->msg_parent->msg_ke = ibuf_new(buf, len)) == NULL) {
693
0
      log_debug("%s: failed to get exchange", __func__);
694
0
      return (-1);
695
0
    }
696
23
    msg->msg_parent->msg_dhgroup = betoh16(kex.kex_dhgroup);
697
23
  }
698
699
2.31k
  return (0);
700
2.31k
}
701
702
int
703
ikev2_validate_id(struct iked_message *msg, size_t offset, size_t left,
704
    struct ikev2_id *id)
705
25.7k
{
706
25.7k
  uint8_t   *msgbuf = ibuf_data(msg->msg_data);
707
708
25.7k
  if (left < sizeof(*id)) {
709
10.7k
    log_debug("%s: malformed payload: too short for header "
710
10.7k
        "(%zu < %zu)", __func__, left, sizeof(*id));
711
10.7k
    return (-1);
712
10.7k
  }
713
15.0k
  memcpy(id, msgbuf + offset, sizeof(*id));
714
715
15.0k
  if (id->id_type == IKEV2_ID_NONE) {
716
6.65k
    log_debug("%s: malformed payload: invalid ID type.",
717
6.65k
        __func__);
718
6.65k
    return (-1);
719
6.65k
  }
720
721
8.38k
  return (0);
722
15.0k
}
723
724
int
725
ikev2_pld_id(struct iked *env, struct ikev2_payload *pld,
726
    struct iked_message *msg, size_t offset, size_t left, unsigned int payload)
727
25.7k
{
728
25.7k
  uint8_t       *ptr;
729
25.7k
  struct ikev2_id      id;
730
25.7k
  size_t         len;
731
25.7k
  struct iked_id      *idp, idb;
732
25.7k
  const struct iked_sa    *sa = msg->msg_sa;
733
25.7k
  uint8_t       *msgbuf = ibuf_data(msg->msg_data);
734
25.7k
  char         idstr[IKED_ID_SIZE];
735
736
25.7k
  if (ikev2_validate_id(msg, offset, left, &id))
737
17.4k
    return (-1);
738
739
8.38k
  bzero(&idb, sizeof(idb));
740
741
  /* Don't strip the Id payload header */
742
8.38k
  ptr = msgbuf + offset;
743
8.38k
  len = left;
744
745
8.38k
  idb.id_type = id.id_type;
746
8.38k
  idb.id_offset = sizeof(id);
747
8.38k
  if ((idb.id_buf = ibuf_new(ptr, len)) == NULL)
748
0
    return (-1);
749
750
8.38k
  if (ikev2_print_id(&idb, idstr, sizeof(idstr)) == -1) {
751
0
    ibuf_free(idb.id_buf);
752
0
    log_debug("%s: malformed id", __func__);
753
0
    return (-1);
754
0
  }
755
756
8.38k
  log_debug("%s: id %s length %zu", __func__, idstr, len);
757
758
8.38k
  if (!ikev2_msg_frompeer(msg)) {
759
8.22k
    ibuf_free(idb.id_buf);
760
8.22k
    return (0);
761
8.22k
  }
762
763
159
  if (((sa->sa_hdr.sh_initiator && payload == IKEV2_PAYLOAD_IDr) ||
764
159
      (!sa->sa_hdr.sh_initiator && payload == IKEV2_PAYLOAD_IDi)))
765
77
    idp = &msg->msg_parent->msg_peerid;
766
82
  else if (!sa->sa_hdr.sh_initiator && payload == IKEV2_PAYLOAD_IDr)
767
82
    idp = &msg->msg_parent->msg_localid;
768
0
  else {
769
0
    ibuf_free(idb.id_buf);
770
0
    log_debug("%s: unexpected id payload", __func__);
771
0
    return (0);
772
0
  }
773
774
159
  if (idp->id_type) {
775
34
    ibuf_free(idb.id_buf);
776
34
    log_debug("%s: duplicate id payload", __func__);
777
34
    return (-1);
778
34
  }
779
780
125
  idp->id_buf = idb.id_buf;
781
125
  idp->id_offset = idb.id_offset;
782
125
  idp->id_type = idb.id_type;
783
784
125
  return (0);
785
159
}
786
787
int
788
ikev2_validate_cert(struct iked_message *msg, size_t offset, size_t left,
789
    struct ikev2_cert *cert)
790
11.3k
{
791
11.3k
  uint8_t   *msgbuf = ibuf_data(msg->msg_data);
792
793
11.3k
  if (left < sizeof(*cert)) {
794
1.53k
    log_debug("%s: malformed payload: too short for header "
795
1.53k
        "(%zu < %zu)", __func__, left, sizeof(*cert));
796
1.53k
    return (-1);
797
1.53k
  }
798
9.81k
  memcpy(cert, msgbuf + offset, sizeof(*cert));
799
9.81k
  if (cert->cert_type == IKEV2_CERT_NONE) {
800
1.07k
    log_debug("%s: malformed payload: invalid cert type", __func__);
801
1.07k
    return (-1);
802
1.07k
  }
803
804
8.74k
  return (0);
805
9.81k
}
806
807
int
808
ikev2_pld_cert(struct iked *env, struct ikev2_payload *pld,
809
    struct iked_message *msg, size_t offset, size_t left)
810
11.3k
{
811
11.3k
  struct ikev2_cert    cert;
812
11.3k
  uint8_t       *buf;
813
11.3k
  size_t         len;
814
11.3k
  struct iked_id      *certid;
815
11.3k
  uint8_t       *msgbuf = ibuf_data(msg->msg_data);
816
11.3k
  const struct iked_sa    *sa = msg->msg_sa;
817
11.3k
  int        i;
818
819
11.3k
  if (ikev2_validate_cert(msg, offset, left, &cert))
820
2.60k
    return (-1);
821
8.74k
  offset += sizeof(cert);
822
823
8.74k
  buf = msgbuf + offset;
824
8.74k
  len = left - sizeof(cert);
825
826
8.74k
  log_debug("%s: type %s length %zu",
827
8.74k
      __func__, print_map(cert.cert_type, ikev2_cert_map), len);
828
829
8.74k
  print_hex(buf, 0, len);
830
831
8.74k
  if (!ikev2_msg_frompeer(msg))
832
2.47k
    return (0);
833
834
  /* do not accept internal encoding in the wire */
835
6.26k
  if (cert.cert_type == IKEV2_CERT_BUNDLE) {
836
290
    log_debug("%s: ignoring IKEV2_CERT_BUNDLE",
837
290
       SPI_SA(sa, __func__));
838
290
    return (0);
839
290
  }
840
841
5.97k
  certid = &msg->msg_parent->msg_cert;
842
5.97k
  if (certid->id_type) {
843
    /* try to set supplemental certs */
844
20.3k
    for (i = 0; i < IKED_SCERT_MAX; i++) {
845
15.7k
      certid = &msg->msg_parent->msg_scert[i];
846
15.7k
      if (!certid->id_type)
847
901
        break;
848
15.7k
    }
849
5.57k
    if (certid->id_type) {
850
4.67k
      log_debug("%s: too many cert payloads, ignoring",
851
4.67k
         SPI_SA(sa, __func__));
852
4.67k
      return (0);
853
4.67k
    }
854
5.57k
  }
855
856
1.30k
  if ((certid->id_buf = ibuf_new(buf, len)) == NULL) {
857
0
    log_debug("%s: failed to save cert", __func__);
858
0
    return (-1);
859
0
  }
860
1.30k
  certid->id_type = cert.cert_type;
861
1.30k
  certid->id_offset = 0;
862
863
1.30k
  return (0);
864
1.30k
}
865
866
int
867
ikev2_validate_certreq(struct iked_message *msg, size_t offset, size_t left,
868
    struct ikev2_cert *cert)
869
16.3k
{
870
16.3k
  uint8_t   *msgbuf = ibuf_data(msg->msg_data);
871
872
16.3k
  if (left < sizeof(*cert)) {
873
3.77k
    log_debug("%s: malformed payload: too short for header "
874
3.77k
        "(%zu < %zu)", __func__, left, sizeof(*cert));
875
3.77k
    return (-1);
876
3.77k
  }
877
12.5k
  memcpy(cert, msgbuf + offset, sizeof(*cert));
878
879
12.5k
  return (0);
880
16.3k
}
881
882
int
883
ikev2_pld_certreq(struct iked *env, struct ikev2_payload *pld,
884
    struct iked_message *msg, size_t offset, size_t left)
885
16.3k
{
886
16.3k
  struct ikev2_cert    cert;
887
16.3k
  struct iked_certreq   *cr;
888
16.3k
  uint8_t       *buf;
889
16.3k
  ssize_t        len;
890
16.3k
  uint8_t       *msgbuf = ibuf_data(msg->msg_data);
891
892
16.3k
  if (ikev2_validate_certreq(msg, offset, left, &cert))
893
3.77k
    return (-1);
894
12.5k
  offset += sizeof(cert);
895
896
12.5k
  buf = msgbuf + offset;
897
12.5k
  len = left - sizeof(cert);
898
899
12.5k
  log_debug("%s: type %s length %zd",
900
12.5k
      __func__, print_map(cert.cert_type, ikev2_cert_map), len);
901
902
12.5k
  print_hex(buf, 0, len);
903
904
12.5k
  if (!ikev2_msg_frompeer(msg))
905
10.9k
    return (0);
906
907
1.58k
  if (cert.cert_type == IKEV2_CERT_X509_CERT) {
908
557
    if (len == 0) {
909
515
      log_info("%s: invalid length 0", __func__);
910
515
      return (0);
911
515
    }
912
42
    if ((len % SHA_DIGEST_LENGTH) != 0) {
913
9
      log_info("%s: invalid certificate request",
914
9
          __func__);
915
9
      return (-1);
916
9
    }
917
42
  }
918
919
1.06k
  if ((cr = calloc(1, sizeof(struct iked_certreq))) == NULL) {
920
0
    log_info("%s: failed to allocate certreq.", __func__);
921
0
    return (-1);
922
0
  }
923
1.06k
  if ((cr->cr_data = ibuf_new(buf, len)) == NULL) {
924
0
    log_info("%s: failed to allocate buffer.", __func__);
925
0
    free(cr);
926
0
    return (-1);
927
0
  }
928
1.06k
  cr->cr_type = cert.cert_type;
929
1.06k
  SIMPLEQ_INSERT_TAIL(&msg->msg_parent->msg_certreqs, cr, cr_entry);
930
931
1.06k
  return (0);
932
1.06k
}
933
934
int
935
ikev2_validate_auth(struct iked_message *msg, size_t offset, size_t left,
936
    struct ikev2_auth *auth)
937
12.6k
{
938
12.6k
  uint8_t   *msgbuf = ibuf_data(msg->msg_data);
939
940
12.6k
  if (left < sizeof(*auth)) {
941
2.24k
    log_debug("%s: malformed payload: too short for header "
942
2.24k
        "(%zu < %zu)", __func__, left, sizeof(*auth));
943
2.24k
    return (-1);
944
2.24k
  }
945
10.3k
  memcpy(auth, msgbuf + offset, sizeof(*auth));
946
947
10.3k
  if (auth->auth_method == 0) {
948
5.12k
    log_info("%s: malformed payload: invalid auth method",
949
5.12k
        __func__);
950
5.12k
    return (-1);
951
5.12k
  }
952
953
5.25k
  return (0);
954
10.3k
}
955
956
int
957
ikev2_pld_auth(struct iked *env, struct ikev2_payload *pld,
958
    struct iked_message *msg, size_t offset, size_t left)
959
12.6k
{
960
12.6k
  struct ikev2_auth    auth;
961
12.6k
  struct iked_id      *idp;
962
12.6k
  uint8_t       *buf;
963
12.6k
  size_t         len;
964
12.6k
  uint8_t       *msgbuf = ibuf_data(msg->msg_data);
965
966
12.6k
  if (ikev2_validate_auth(msg, offset, left, &auth))
967
7.36k
    return (-1);
968
5.25k
  offset += sizeof(auth);
969
970
5.25k
  buf = msgbuf + offset;
971
5.25k
  len = left - sizeof(auth);
972
973
5.25k
  log_debug("%s: method %s length %zu",
974
5.25k
      __func__, print_map(auth.auth_method, ikev2_auth_map), len);
975
976
5.25k
  print_hex(buf, 0, len);
977
978
5.25k
  if (!ikev2_msg_frompeer(msg))
979
5.21k
    return (0);
980
981
42
  idp = &msg->msg_parent->msg_auth;
982
42
  if (idp->id_type) {
983
1
    log_debug("%s: duplicate auth payload", __func__);
984
1
    return (-1);
985
1
  }
986
987
41
  ibuf_free(idp->id_buf);
988
41
  idp->id_type = auth.auth_method;
989
41
  idp->id_offset = 0;
990
41
  if ((idp->id_buf = ibuf_new(buf, len)) == NULL)
991
0
    return (-1);
992
993
41
  return (0);
994
41
}
995
996
int
997
ikev2_pld_nonce(struct iked *env, struct ikev2_payload *pld,
998
    struct iked_message *msg, size_t offset, size_t left)
999
4.68k
{
1000
4.68k
  size_t     len;
1001
4.68k
  uint8_t   *buf;
1002
4.68k
  uint8_t   *msgbuf = ibuf_data(msg->msg_data);
1003
1004
4.68k
  buf = msgbuf + offset;
1005
4.68k
  len = left;
1006
1007
4.68k
  if (len == 0) {
1008
3.82k
    log_debug("%s: malformed payload: no NONCE given", __func__);
1009
3.82k
    return (-1);
1010
3.82k
  }
1011
1012
861
  print_hex(buf, 0, len);
1013
1014
861
  if (ikev2_msg_frompeer(msg)) {
1015
62
    if (msg->msg_parent->msg_nonce != NULL) {
1016
19
      log_info("%s: duplicate NONCE payload", __func__);
1017
19
      return (-1);
1018
19
    }
1019
43
    if ((msg->msg_nonce = ibuf_new(buf, len)) == NULL) {
1020
0
      log_debug("%s: failed to get peer nonce", __func__);
1021
0
      return (-1);
1022
0
    }
1023
43
    msg->msg_parent->msg_nonce = msg->msg_nonce;
1024
43
  }
1025
1026
842
  return (0);
1027
861
}
1028
1029
int
1030
ikev2_validate_notify(struct iked_message *msg, size_t offset, size_t left,
1031
    struct ikev2_notify *n)
1032
40.0k
{
1033
40.0k
  uint8_t   *msgbuf = ibuf_data(msg->msg_data);
1034
1035
40.0k
  if (left < sizeof(*n)) {
1036
5.44k
    log_debug("%s: malformed payload: too short for header "
1037
5.44k
        "(%zu < %zu)", __func__, left, sizeof(*n));
1038
5.44k
    return (-1);
1039
5.44k
  }
1040
34.5k
  memcpy(n, msgbuf + offset, sizeof(*n));
1041
1042
34.5k
  return (0);
1043
40.0k
}
1044
1045
int
1046
ikev2_pld_notify(struct iked *env, struct ikev2_payload *pld,
1047
    struct iked_message *msg, size_t offset, size_t left)
1048
40.0k
{
1049
40.0k
  struct ikev2_notify  n;
1050
40.0k
  const struct iked_sa  *sa = msg->msg_sa;
1051
40.0k
  uint8_t     *buf, md[SHA_DIGEST_LENGTH];
1052
40.0k
  uint32_t     spi32;
1053
40.0k
  uint64_t     spi64;
1054
40.0k
  struct iked_spi   *rekey;
1055
40.0k
  uint16_t     type;
1056
40.0k
  uint16_t     signature_hash;
1057
1058
40.0k
  if (ikev2_validate_notify(msg, offset, left, &n))
1059
5.44k
    return (-1);
1060
34.5k
  type = betoh16(n.n_type);
1061
1062
34.5k
  log_debug("%s: protoid %s spisize %d type %s",
1063
34.5k
      __func__,
1064
34.5k
      print_map(n.n_protoid, ikev2_saproto_map), n.n_spisize,
1065
34.5k
      print_map(type, ikev2_n_map));
1066
1067
34.5k
  left -= sizeof(n);
1068
34.5k
  if ((buf = ibuf_seek(msg->msg_data, offset + sizeof(n), left)) == NULL)
1069
0
    return (-1);
1070
1071
34.5k
  print_hex(buf, 0, left);
1072
1073
34.5k
  if (!ikev2_msg_frompeer(msg))
1074
2.01k
    return (0);
1075
1076
32.5k
  switch (type) {
1077
3.34k
  case IKEV2_N_NAT_DETECTION_SOURCE_IP:
1078
26.0k
  case IKEV2_N_NAT_DETECTION_DESTINATION_IP:
1079
26.0k
    if (left != sizeof(md)) {
1080
17
      log_debug("%s: malformed payload: hash size mismatch"
1081
17
          " (%zu != %zu)", __func__, left, sizeof(md));
1082
17
      return (-1);
1083
17
    }
1084
26.0k
    if (ikev2_nat_detection(env, msg, md, sizeof(md), type,
1085
26.0k
        ikev2_msg_frompeer(msg)) == -1)
1086
0
      return (-1);
1087
26.0k
    if (memcmp(buf, md, left) != 0) {
1088
25.8k
      log_debug("%s: %s detected NAT", __func__,
1089
25.8k
          print_map(type, ikev2_n_map));
1090
25.8k
      if (type == IKEV2_N_NAT_DETECTION_SOURCE_IP)
1091
3.34k
        msg->msg_parent->msg_nat_detected
1092
3.34k
            |= IKED_MSG_NAT_SRC_IP;
1093
22.5k
      else
1094
22.5k
        msg->msg_parent->msg_nat_detected
1095
22.5k
            |= IKED_MSG_NAT_DST_IP;
1096
25.8k
    }
1097
26.0k
    print_hex(md, 0, sizeof(md));
1098
    /* remember for MOBIKE */
1099
26.0k
    msg->msg_parent->msg_natt_rcvd = 1;
1100
26.0k
    break;
1101
6
  case IKEV2_N_AUTHENTICATION_FAILED:
1102
6
    if (!msg->msg_e) {
1103
0
      log_debug("%s: AUTHENTICATION_FAILED not encrypted",
1104
0
          __func__);
1105
0
      return (-1);
1106
0
    }
1107
    /*
1108
     * If we are the responder, then we only accept
1109
     * AUTHENTICATION_FAILED from authenticated peers.
1110
     * If we are the initiator, the peer cannot be authenticated.
1111
     */
1112
6
    if (!sa->sa_hdr.sh_initiator) {
1113
6
      if (!sa_stateok(sa, IKEV2_STATE_VALID)) {
1114
6
        log_debug("%s: ignoring AUTHENTICATION_FAILED"
1115
6
            " from unauthenticated initiator",
1116
6
            __func__);
1117
6
        return (-1);
1118
6
      }
1119
6
    } else {
1120
0
      if (sa_stateok(sa, IKEV2_STATE_VALID)) {
1121
0
        log_debug("%s: ignoring AUTHENTICATION_FAILED"
1122
0
            " from authenticated responder",
1123
0
            __func__);
1124
0
        return (-1);
1125
0
      }
1126
0
    }
1127
0
    msg->msg_parent->msg_flags
1128
0
        |= IKED_MSG_FLAGS_AUTHENTICATION_FAILED;
1129
0
    break;
1130
143
  case IKEV2_N_INVALID_KE_PAYLOAD:
1131
143
    if (sa_stateok(sa, IKEV2_STATE_VALID) &&
1132
143
        !msg->msg_e) {
1133
0
      log_debug("%s: INVALID_KE_PAYLOAD not encrypted",
1134
0
          __func__);
1135
0
      return (-1);
1136
0
    }
1137
143
    if (left != sizeof(msg->msg_parent->msg_group)) {
1138
4
      log_debug("%s: malformed payload: group size mismatch"
1139
4
          " (%zu != %zu)", __func__, left,
1140
4
          sizeof(msg->msg_parent->msg_group));
1141
4
      return (-1);
1142
4
    }
1143
139
    memcpy(&msg->msg_parent->msg_group, buf, left);
1144
139
    msg->msg_parent->msg_flags |= IKED_MSG_FLAGS_INVALID_KE;
1145
139
    break;
1146
273
  case IKEV2_N_NO_ADDITIONAL_SAS:
1147
273
    if (!msg->msg_e) {
1148
0
      log_debug("%s: NO_ADDITIONAL_SAS not encrypted",
1149
0
          __func__);
1150
0
      return (-1);
1151
0
    }
1152
273
    msg->msg_parent->msg_flags |= IKED_MSG_FLAGS_NO_ADDITIONAL_SAS;
1153
273
    break;
1154
82
  case IKEV2_N_REKEY_SA:
1155
82
    if (!msg->msg_e) {
1156
0
      log_debug("%s: N_REKEY_SA not encrypted", __func__);
1157
0
      return (-1);
1158
0
    }
1159
82
    if (left != n.n_spisize) {
1160
5
      log_debug("%s: malformed notification", __func__);
1161
5
      return (-1);
1162
5
    }
1163
77
    rekey = &msg->msg_parent->msg_rekey;
1164
77
    if (rekey->spi != 0) {
1165
5
      log_debug("%s: rekeying of multiple SAs not supported",
1166
5
          __func__);
1167
5
      return (-1);
1168
5
    }
1169
72
    switch (n.n_spisize) {
1170
65
    case 4:
1171
65
      memcpy(&spi32, buf, left);
1172
65
      rekey->spi = betoh32(spi32);
1173
65
      break;
1174
4
    case 8:
1175
4
      memcpy(&spi64, buf, left);
1176
4
      rekey->spi = betoh64(spi64);
1177
4
      break;
1178
3
    default:
1179
3
      log_debug("%s: invalid spi size %d", __func__,
1180
3
          n.n_spisize);
1181
3
      return (-1);
1182
72
    }
1183
69
    rekey->spi_size = n.n_spisize;
1184
69
    rekey->spi_protoid = n.n_protoid;
1185
1186
69
    log_debug("%s: rekey %s spi %s", __func__,
1187
69
        print_map(n.n_protoid, ikev2_saproto_map),
1188
69
        print_spi(rekey->spi, n.n_spisize));
1189
69
    break;
1190
354
  case IKEV2_N_TEMPORARY_FAILURE:
1191
354
    if (!msg->msg_e) {
1192
0
      log_debug("%s: IKEV2_N_TEMPORARY_FAILURE not encrypted",
1193
0
          __func__);
1194
0
      return (-1);
1195
0
    }
1196
354
    msg->msg_parent->msg_flags |= IKED_MSG_FLAGS_TEMPORARY_FAILURE;
1197
354
    break;
1198
258
  case IKEV2_N_IPCOMP_SUPPORTED:
1199
258
    if (!msg->msg_e) {
1200
0
      log_debug("%s: N_IPCOMP_SUPPORTED not encrypted",
1201
0
          __func__);
1202
0
      return (-1);
1203
0
    }
1204
258
    if (left < sizeof(msg->msg_parent->msg_cpi) +
1205
258
        sizeof(msg->msg_parent->msg_transform)) {
1206
129
      log_debug("%s: ignoring malformed ipcomp notification",
1207
129
          __func__);
1208
129
      return (0);
1209
129
    }
1210
129
    memcpy(&msg->msg_parent->msg_cpi, buf,
1211
129
        sizeof(msg->msg_parent->msg_cpi));
1212
129
    memcpy(&msg->msg_parent->msg_transform,
1213
129
        buf + sizeof(msg->msg_parent->msg_cpi),
1214
129
        sizeof(msg->msg_parent->msg_transform));
1215
1216
129
    log_debug("%s: %s cpi 0x%x, transform %s, length %zu", __func__,
1217
129
        msg->msg_parent->msg_response ? "res" : "req",
1218
129
        betoh16(msg->msg_parent->msg_cpi),
1219
129
        print_map(msg->msg_parent->msg_transform,
1220
129
        ikev2_ipcomp_map), left);
1221
1222
129
    msg->msg_parent->msg_flags |= IKED_MSG_FLAGS_IPCOMP_SUPPORTED;
1223
129
    break;
1224
73
  case IKEV2_N_CHILD_SA_NOT_FOUND:
1225
73
    if (!msg->msg_e) {
1226
0
      log_debug("%s: N_CHILD_SA_NOT_FOUND not encrypted",
1227
0
          __func__);
1228
0
      return (-1);
1229
0
    }
1230
73
    msg->msg_parent->msg_flags |= IKED_MSG_FLAGS_CHILD_SA_NOT_FOUND;
1231
73
    break;
1232
36
  case IKEV2_N_NO_PROPOSAL_CHOSEN:
1233
36
    msg->msg_parent->msg_flags |= IKED_MSG_FLAGS_NO_PROPOSAL_CHOSEN;
1234
36
    break;
1235
1.81k
  case IKEV2_N_MOBIKE_SUPPORTED:
1236
1.81k
    if (!msg->msg_e) {
1237
0
      log_debug("%s: N_MOBIKE_SUPPORTED not encrypted",
1238
0
          __func__);
1239
0
      return (-1);
1240
0
    }
1241
1.81k
    if (left != 0) {
1242
1.65k
      log_debug("%s: ignoring malformed mobike"
1243
1.65k
          " notification: %zu", __func__, left);
1244
1.65k
      return (0);
1245
1.65k
    }
1246
159
    msg->msg_parent->msg_flags |= IKED_MSG_FLAGS_MOBIKE;
1247
159
    break;
1248
398
  case IKEV2_N_USE_TRANSPORT_MODE:
1249
398
    if (!msg->msg_e) {
1250
0
      log_debug("%s: N_USE_TRANSPORT_MODE not encrypted",
1251
0
          __func__);
1252
0
      return (-1);
1253
0
    }
1254
398
    if (left != 0) {
1255
84
      log_debug("%s: ignoring malformed transport mode"
1256
84
          " notification: %zu", __func__, left);
1257
84
      return (0);
1258
84
    }
1259
314
    if (msg->msg_parent->msg_response) {
1260
0
      if (!(msg->msg_policy->pol_flags & IKED_POLICY_TRANSPORT)) {
1261
0
        log_debug("%s: ignoring transport mode"
1262
0
            " notification (policy)", __func__);
1263
0
        return (0);
1264
0
      }
1265
0
    }
1266
314
    msg->msg_parent->msg_flags |= IKED_MSG_FLAGS_USE_TRANSPORT;
1267
314
    break;
1268
410
  case IKEV2_N_UPDATE_SA_ADDRESSES:
1269
410
    if (!msg->msg_e) {
1270
0
      log_debug("%s: N_UPDATE_SA_ADDRESSES not encrypted",
1271
0
          __func__);
1272
0
      return (-1);
1273
0
    }
1274
410
    if (!sa->sa_mobike) {
1275
410
      log_debug("%s: ignoring update sa addresses"
1276
410
          " notification w/o mobike: %zu", __func__, left);
1277
410
      return (0);
1278
410
    }
1279
0
    if (left != 0) {
1280
0
      log_debug("%s: ignoring malformed update sa addresses"
1281
0
          " notification: %zu", __func__, left);
1282
0
      return (0);
1283
0
    }
1284
0
    msg->msg_parent->msg_update_sa_addresses = 1;
1285
0
    break;
1286
242
  case IKEV2_N_COOKIE2:
1287
242
    if (!msg->msg_e) {
1288
0
      log_debug("%s: N_COOKIE2 not encrypted",
1289
0
          __func__);
1290
0
      return (-1);
1291
0
    }
1292
242
    if (!sa->sa_mobike) {
1293
242
      log_debug("%s: ignoring cookie2 notification"
1294
242
          " w/o mobike: %zu", __func__, left);
1295
242
      return (0);
1296
242
    }
1297
0
    if (left < IKED_COOKIE2_MIN || left > IKED_COOKIE2_MAX) {
1298
0
      log_debug("%s: ignoring malformed cookie2"
1299
0
          " notification: %zu", __func__, left);
1300
0
      return (0);
1301
0
    }
1302
0
    ibuf_free(msg->msg_cookie2);  /* should not happen */
1303
0
    if ((msg->msg_cookie2 = ibuf_new(buf, left)) == NULL) {
1304
0
      log_debug("%s: failed to get peer cookie2", __func__);
1305
0
      return (-1);
1306
0
    }
1307
0
    msg->msg_parent->msg_cookie2 = msg->msg_cookie2;
1308
0
    break;
1309
2
  case IKEV2_N_COOKIE:
1310
2
    if (msg->msg_e) {
1311
2
      log_debug("%s: N_COOKIE encrypted",
1312
2
          __func__);
1313
2
      return (-1);
1314
2
    }
1315
0
    if (left < IKED_COOKIE_MIN || left > IKED_COOKIE_MAX) {
1316
0
      log_debug("%s: ignoring malformed cookie"
1317
0
          " notification: %zu", __func__, left);
1318
0
      return (0);
1319
0
    }
1320
0
    log_debug("%s: received cookie, len %zu", __func__, left);
1321
0
    print_hex(buf, 0, left);
1322
1323
0
    ibuf_free(msg->msg_cookie);
1324
0
    if ((msg->msg_cookie = ibuf_new(buf, left)) == NULL) {
1325
0
      log_debug("%s: failed to get peer cookie", __func__);
1326
0
      return (-1);
1327
0
    }
1328
0
    msg->msg_parent->msg_cookie = msg->msg_cookie;
1329
0
    break;
1330
14
  case IKEV2_N_FRAGMENTATION_SUPPORTED:
1331
14
    if (msg->msg_e) {
1332
14
      log_debug("%s: N_FRAGMENTATION_SUPPORTED encrypted",
1333
14
          __func__);
1334
14
      return (-1);
1335
14
    }
1336
0
    if (left != 0) {
1337
0
      log_debug("%s: ignoring malformed fragmentation"
1338
0
          " notification: %zu", __func__, left);
1339
0
      return (0);
1340
0
    }
1341
0
    msg->msg_parent->msg_flags |= IKED_MSG_FLAGS_FRAGMENTATION;
1342
0
    break;
1343
7
  case IKEV2_N_SIGNATURE_HASH_ALGORITHMS:
1344
7
    if (msg->msg_e) {
1345
7
      log_debug("%s: SIGNATURE_HASH_ALGORITHMS: encrypted",
1346
7
          __func__);
1347
7
      return (-1);
1348
7
    }
1349
0
    if (sa == NULL) {
1350
0
      log_debug("%s: SIGNATURE_HASH_ALGORITHMS: no SA",
1351
0
          __func__);
1352
0
      return (-1);
1353
0
    }
1354
0
    if (sa->sa_sigsha2) {
1355
0
      log_debug("%s: SIGNATURE_HASH_ALGORITHMS: "
1356
0
          "duplicate notify", __func__);
1357
0
      return (0);
1358
0
    }
1359
0
    if (left < sizeof(signature_hash) ||
1360
0
        left % sizeof(signature_hash)) {
1361
0
      log_debug("%s: malformed signature hash notification"
1362
0
          "(%zu bytes)", __func__, left);
1363
0
      return (0);
1364
0
    }
1365
0
    while (left >= sizeof(signature_hash)) {
1366
0
      memcpy(&signature_hash, buf, sizeof(signature_hash));
1367
0
      signature_hash = betoh16(signature_hash);
1368
0
      log_debug("%s: signature hash %s (%x)", __func__,
1369
0
          print_map(signature_hash, ikev2_sighash_map),
1370
0
          signature_hash);
1371
0
      left -= sizeof(signature_hash);
1372
0
      buf += sizeof(signature_hash);
1373
0
      if (signature_hash == IKEV2_SIGHASH_SHA2_256)
1374
0
        msg->msg_parent->msg_flags
1375
0
            |= IKED_MSG_FLAGS_SIGSHA2;
1376
0
    }
1377
0
    break;
1378
32.5k
  }
1379
1380
29.9k
  return (0);
1381
32.5k
}
1382
1383
int
1384
ikev2_validate_delete(struct iked_message *msg, size_t offset, size_t left,
1385
    struct ikev2_delete *del)
1386
10.7k
{
1387
10.7k
  uint8_t   *msgbuf = ibuf_data(msg->msg_data);
1388
1389
10.7k
  if (left < sizeof(*del)) {
1390
2.22k
    log_debug("%s: malformed payload: too short for header "
1391
2.22k
        "(%zu < %zu)", __func__, left, sizeof(*del));
1392
2.22k
    return (-1);
1393
2.22k
  }
1394
8.51k
  memcpy(del, msgbuf + offset, sizeof(*del));
1395
1396
8.51k
  if (del->del_protoid == 0) {
1397
84
    log_info("%s: malformed payload: invalid protoid", __func__);
1398
84
    return (-1);
1399
84
  }
1400
1401
8.42k
  return (0);
1402
8.51k
}
1403
1404
int
1405
ikev2_pld_delete(struct iked *env, struct ikev2_payload *pld,
1406
    struct iked_message *msg, size_t offset, size_t left)
1407
10.7k
{
1408
10.7k
  struct ikev2_delete  del;
1409
10.7k
  uint8_t     *buf, *msgbuf = ibuf_data(msg->msg_data);
1410
10.7k
  size_t       cnt, sz, len;
1411
1412
10.7k
  if (ikev2_validate_delete(msg, offset, left, &del))
1413
2.30k
    return (-1);
1414
1415
  /* Skip if it's a response, then we don't have to deal with it */
1416
8.42k
  if (ikev2_msg_frompeer(msg) &&
1417
8.42k
      msg->msg_parent->msg_response)
1418
0
    return (0);
1419
1420
8.42k
  cnt = betoh16(del.del_nspi);
1421
8.42k
  sz = del.del_spisize;
1422
1423
8.42k
  log_debug("%s: proto %s spisize %zu nspi %zu",
1424
8.42k
      __func__, print_map(del.del_protoid, ikev2_saproto_map),
1425
8.42k
      sz, cnt);
1426
1427
8.42k
  if (msg->msg_parent->msg_del_protoid) {
1428
7.93k
    log_debug("%s: duplicate delete payload", __func__);
1429
7.93k
    return (0);
1430
7.93k
  }
1431
1432
489
  msg->msg_parent->msg_del_protoid = del.del_protoid;
1433
489
  msg->msg_parent->msg_del_cnt = cnt;
1434
489
  msg->msg_parent->msg_del_spisize = sz;
1435
1436
489
  buf = msgbuf + offset + sizeof(del);
1437
489
  len = left - sizeof(del);
1438
489
  if (len == 0 || sz == 0 || cnt == 0)
1439
463
    return (0);
1440
1441
26
  if ((len / sz) != cnt) {
1442
24
    log_debug("%s: invalid payload length %zu/%zu != %zu",
1443
24
        __func__, len, sz, cnt);
1444
24
    return (-1);
1445
24
  }
1446
1447
2
  print_hex(buf, 0, len);
1448
1449
2
  msg->msg_parent->msg_del_buf = ibuf_new(buf, len);
1450
1451
2
  return (0);
1452
26
}
1453
1454
int
1455
ikev2_validate_tss(struct iked_message *msg, size_t offset, size_t left,
1456
    struct ikev2_tsp *tsp)
1457
26.3k
{
1458
26.3k
  uint8_t   *msgbuf = ibuf_data(msg->msg_data);
1459
1460
26.3k
  if (left < sizeof(*tsp)) {
1461
2.93k
    log_debug("%s: malformed payload: too short for header "
1462
2.93k
        "(%zu < %zu)", __func__, left, sizeof(*tsp));
1463
2.93k
    return (-1);
1464
2.93k
  }
1465
23.4k
  memcpy(tsp, msgbuf + offset, sizeof(*tsp));
1466
1467
23.4k
  return (0);
1468
26.3k
}
1469
1470
int
1471
ikev2_pld_tss(struct iked *env, struct ikev2_payload *pld,
1472
    struct iked_message *msg, size_t offset, size_t left)
1473
26.3k
{
1474
26.3k
  struct ikev2_tsp     tsp;
1475
26.3k
  struct ikev2_ts      ts;
1476
26.3k
  size_t         ts_len, i;
1477
1478
26.3k
  if (ikev2_validate_tss(msg, offset, left, &tsp))
1479
2.93k
    return (-1);
1480
1481
23.4k
  offset += sizeof(tsp);
1482
23.4k
  left -= sizeof(tsp);
1483
1484
23.4k
  log_debug("%s: count %d length %zu", __func__,
1485
23.4k
      tsp.tsp_count, left);
1486
1487
43.8k
  for (i = 0; i < tsp.tsp_count; i++) {
1488
42.0k
    if (ikev2_validate_ts(msg, offset, left, &ts))
1489
18.8k
      return (-1);
1490
1491
23.2k
    log_debug("%s: type %s protoid %u length %d "
1492
23.2k
        "startport %u endport %u", __func__,
1493
23.2k
        print_map(ts.ts_type, ikev2_ts_map),
1494
23.2k
        ts.ts_protoid, betoh16(ts.ts_length),
1495
23.2k
        betoh16(ts.ts_startport),
1496
23.2k
        betoh16(ts.ts_endport));
1497
1498
23.2k
    offset += sizeof(ts);
1499
23.2k
    left -= sizeof(ts);
1500
1501
23.2k
    ts_len = betoh16(ts.ts_length) - sizeof(ts);
1502
23.2k
    if (ikev2_pld_ts(env, pld, msg, offset, ts_len, ts.ts_type))
1503
2.84k
      return (-1);
1504
1505
20.3k
    offset += ts_len;
1506
20.3k
    left -= ts_len;
1507
20.3k
  }
1508
1509
1.72k
  return (0);
1510
23.4k
}
1511
1512
int
1513
ikev2_validate_ts(struct iked_message *msg, size_t offset, size_t left,
1514
    struct ikev2_ts *ts)
1515
42.0k
{
1516
42.0k
  uint8_t   *msgbuf = ibuf_data(msg->msg_data);
1517
42.0k
  size_t     ts_length;
1518
1519
42.0k
  if (left < sizeof(*ts)) {
1520
17.0k
    log_debug("%s: malformed payload: too short for header "
1521
17.0k
        "(%zu < %zu)", __func__, left, sizeof(*ts));
1522
17.0k
    return (-1);
1523
17.0k
  }
1524
25.0k
  memcpy(ts, msgbuf + offset, sizeof(*ts));
1525
1526
25.0k
  ts_length = betoh16(ts->ts_length);
1527
25.0k
  if (ts_length < sizeof(*ts)) {
1528
438
    log_debug("%s: malformed payload: shorter than minimum header "
1529
438
        "size (%zu < %zu)", __func__, ts_length, sizeof(*ts));
1530
438
    return (-1);
1531
438
  }
1532
24.5k
  if (left < ts_length) {
1533
1.32k
    log_debug("%s: malformed payload: too long for payload size "
1534
1.32k
        "(%zu < %zu)", __func__, left, ts_length);
1535
1.32k
    return (-1);
1536
1.32k
  }
1537
1538
23.2k
  return (0);
1539
24.5k
}
1540
1541
int
1542
ikev2_pld_ts(struct iked *env, struct ikev2_payload *pld,
1543
    struct iked_message *msg, size_t offset, size_t left, unsigned int type)
1544
23.2k
{
1545
23.2k
  struct sockaddr_in     start4, end4;
1546
23.2k
  struct sockaddr_in6    start6, end6;
1547
23.2k
  uint8_t       *msgbuf = ibuf_data(msg->msg_data);
1548
23.2k
  uint8_t       *ptr;
1549
1550
23.2k
  ptr = msgbuf + offset;
1551
1552
23.2k
  switch (type) {
1553
9.91k
  case IKEV2_TS_IPV4_ADDR_RANGE:
1554
9.91k
    if (left < 2 * 4) {
1555
1.25k
      log_debug("%s: malformed payload: too short "
1556
1.25k
          "for ipv4 addr range (%zu < %u)",
1557
1.25k
          __func__, left, 2 * 4);
1558
1.25k
      return (-1);
1559
1.25k
    }
1560
1561
8.65k
    bzero(&start4, sizeof(start4));
1562
8.65k
    start4.sin_family = AF_INET;
1563
#ifdef HAVE_SOCKADDR_SA_LEN
1564
    start4.sin_len = sizeof(start4);
1565
#endif
1566
8.65k
    memcpy(&start4.sin_addr.s_addr, ptr, 4);
1567
8.65k
    ptr += 4;
1568
8.65k
    left -= 4;
1569
1570
8.65k
    bzero(&end4, sizeof(end4));
1571
8.65k
    end4.sin_family = AF_INET;
1572
#ifdef HAVE_SOCKADDR_SA_LEN
1573
    end4.sin_len = sizeof(end4);
1574
#endif
1575
8.65k
    memcpy(&end4.sin_addr.s_addr, ptr, 4);
1576
8.65k
    left -= 4;
1577
1578
8.65k
    log_debug("%s: start %s end %s", __func__,
1579
8.65k
        print_addr(&start4), print_addr(&end4));
1580
8.65k
    break;
1581
1.58k
  case IKEV2_TS_IPV6_ADDR_RANGE:
1582
1.58k
    if (left < 2 * 16) {
1583
260
      log_debug("%s: malformed payload: too short "
1584
260
          "for ipv6 addr range (%zu < %u)",
1585
260
          __func__, left, 2 * 16);
1586
260
      return (-1);
1587
260
    }
1588
1.32k
    bzero(&start6, sizeof(start6));
1589
1.32k
    start6.sin6_family = AF_INET6;
1590
#ifdef HAVE_SOCKADDR_SA_LEN
1591
    start6.sin6_len = sizeof(start6);
1592
#endif
1593
1.32k
    memcpy(&start6.sin6_addr, ptr, 16);
1594
1.32k
    ptr += 16;
1595
1.32k
    left -= 16;
1596
1597
1.32k
    bzero(&end6, sizeof(end6));
1598
1.32k
    end6.sin6_family = AF_INET6;
1599
#ifdef HAVE_SOCKADDR_SA_LEN
1600
    end6.sin6_len = sizeof(end6);
1601
#endif
1602
1.32k
    memcpy(&end6.sin6_addr, ptr, 16);
1603
1.32k
    left -= 16;
1604
1605
1.32k
    log_debug("%s: start %s end %s", __func__,
1606
1.32k
        print_addr(&start6), print_addr(&end6));
1607
1.32k
    break;
1608
11.7k
  default:
1609
11.7k
    log_debug("%s: ignoring unknown TS type %u", __func__, type);
1610
11.7k
    return (0);
1611
23.2k
  }
1612
1613
9.97k
  if (left > 0) {
1614
1.33k
    log_debug("%s: malformed payload: left (%zu) > 0",
1615
1.33k
        __func__, left);
1616
1.33k
    return (-1);
1617
1.33k
  }
1618
1619
8.64k
  return (0);
1620
9.97k
}
1621
1622
int
1623
ikev2_pld_ef(struct iked *env, struct ikev2_payload *pld,
1624
    struct iked_message *msg, size_t offset, size_t left)
1625
0
{
1626
0
  struct iked_sa      *sa = msg->msg_sa;
1627
0
  struct iked_frag    *sa_frag = &sa->sa_fragments;
1628
0
  struct iked_frag_entry    *el;
1629
0
  struct ikev2_frag_payload  frag;
1630
0
  uint8_t       *msgbuf = ibuf_data(msg->msg_data);
1631
0
  uint8_t       *buf;
1632
0
  struct ibuf     *e = NULL;
1633
0
  size_t         frag_num, frag_total;
1634
0
  size_t         len;
1635
0
  int        ret = -1;
1636
0
  int        processed = 0;
1637
0
  ssize_t        elen;
1638
1639
0
  buf = msgbuf + offset;
1640
0
  memcpy(&frag, buf, sizeof(frag));
1641
0
  frag_num = betoh16(frag.frag_num);
1642
0
  frag_total = betoh16(frag.frag_total);
1643
1644
0
  offset += sizeof(frag);
1645
0
  buf = msgbuf + offset;
1646
0
  len = left - sizeof(frag);
1647
1648
0
  ikestat_inc(env, ikes_frag_rcvd);
1649
1650
  /* Limit number of total fragments to avoid DOS */
1651
0
  if (frag_total > IKED_FRAG_TOTAL_MAX ) {
1652
0
    log_debug("%s: Total Fragments too big  %zu",
1653
0
        __func__, frag_total);
1654
0
    goto dropall;
1655
0
  }
1656
1657
  /* Check sanity of fragment header */
1658
0
  if (frag_num == 0 || frag_total == 0) {
1659
0
    log_debug("%s: Malformed fragment received: %zu of %zu",
1660
0
        __func__, frag_num, frag_total);
1661
0
    goto done;
1662
0
  }
1663
0
  log_debug("%s: Received fragment: %zu of %zu",
1664
0
      __func__, frag_num, frag_total);
1665
1666
  /* Drop fragment if frag_num and frag_total don't match */
1667
0
  if (frag_num > frag_total)
1668
0
    goto done;
1669
1670
  /* Decrypt fragment */
1671
0
  if ((e = ibuf_new(buf, len)) == NULL)
1672
0
    goto done;
1673
1674
0
  if ((e = ikev2_msg_decrypt(env, msg->msg_sa, msg->msg_data, e))
1675
0
      == NULL ) {
1676
0
    log_debug("%s: Failed to decrypt fragment: %zu of %zu",
1677
0
        __func__, frag_num, frag_total);
1678
0
    goto done;
1679
0
  }
1680
0
  elen = ibuf_size(e);
1681
1682
  /* Check new fragmented message */
1683
0
  if (sa_frag->frag_arr == NULL) {
1684
0
    sa_frag->frag_arr = recallocarray(NULL, 0, frag_total,
1685
0
        sizeof(struct iked_frag_entry*));
1686
0
    if (sa_frag->frag_arr == NULL) {
1687
0
      log_info("%s: recallocarray sa_frag->frag_arr.", __func__);
1688
0
      goto done;
1689
0
    }
1690
0
    sa_frag->frag_total = frag_total;
1691
0
  } else {
1692
    /* Drop all fragments if frag_total doesn't match previous */
1693
0
    if (frag_total != sa_frag->frag_total)
1694
0
      goto dropall;
1695
1696
    /* Silent drop if fragment already stored */
1697
0
    if (sa_frag->frag_arr[frag_num-1] != NULL)
1698
0
      goto done;
1699
0
  }
1700
1701
  /* The first fragments IKE header determines pld_nextpayload */
1702
0
  if (frag_num == 1)
1703
0
    sa_frag->frag_nextpayload = pld->pld_nextpayload;
1704
1705
  /* Insert new list element */
1706
0
  el = calloc(1, sizeof(struct iked_frag_entry));
1707
0
  if (el == NULL) {
1708
0
    log_info("%s: Failed allocating new fragment: %zu of %zu",
1709
0
        __func__, frag_num, frag_total);
1710
0
    goto done;
1711
0
  }
1712
1713
0
  sa_frag->frag_arr[frag_num-1] = el;
1714
0
  el->frag_size = elen;
1715
0
  el->frag_data = calloc(1, elen);
1716
0
  if (el->frag_data == NULL) {
1717
0
    log_debug("%s: Failed allocating new fragment data: %zu of %zu",
1718
0
        __func__, frag_num, frag_total);
1719
0
    goto done;
1720
0
  }
1721
1722
  /* Copy plaintext to fragment */
1723
0
  memcpy(el->frag_data, ibuf_seek(e, 0, 0), elen);
1724
0
  sa_frag->frag_total_size += elen;
1725
0
  sa_frag->frag_count++;
1726
1727
  /* If all frags are received start reassembly */
1728
0
  if (sa_frag->frag_count == sa_frag->frag_total) {
1729
0
    log_debug("%s: All fragments received: %zu of %zu",
1730
0
        __func__, frag_num, frag_total);
1731
0
    ret = ikev2_frags_reassemble(env, pld, msg);
1732
0
  } else {
1733
0
    ret = 0;
1734
0
  }
1735
0
  processed = 1;
1736
1737
0
done:
1738
0
  if (!processed)
1739
0
    ikestat_inc(env, ikes_frag_rcvd_drop);
1740
0
  ibuf_free(e);
1741
0
  return (ret);
1742
0
dropall:
1743
0
  ikestat_add(env, ikes_frag_rcvd_drop, sa_frag->frag_count + 1);
1744
0
  config_free_fragments(sa_frag);
1745
0
  ibuf_free(e);
1746
0
  return -1;
1747
0
}
1748
1749
int
1750
ikev2_frags_reassemble(struct iked *env, struct ikev2_payload *pld,
1751
    struct iked_message *msg)
1752
0
{
1753
0
  struct iked_frag    *sa_frag = &msg->msg_sa->sa_fragments;
1754
0
  struct ibuf     *e = NULL;
1755
0
  struct iked_frag_entry    *el;
1756
0
  uint8_t       *ptr;
1757
0
  size_t         offset;
1758
0
  size_t         i;
1759
0
  struct iked_message    emsg;
1760
0
  int        ret = -1;
1761
0
  int        processed = 0;
1762
1763
  /* Reassemble fragments to single buffer */
1764
0
  if ((e = ibuf_new(NULL, sa_frag->frag_total_size)) == NULL) {
1765
0
    log_debug("%s: Failed allocating SK buffer.", __func__);
1766
0
    goto done;
1767
0
  }
1768
1769
  /* Empty queue to new buffer */
1770
0
  offset = 0;
1771
0
  for (i = 0; i < sa_frag->frag_total; i++) {
1772
0
    if ((el = sa_frag->frag_arr[i]) == NULL)
1773
0
      fatalx("Tried to reassemble shallow frag_arr");
1774
0
    ptr = ibuf_seek(e, offset, el->frag_size);
1775
0
    if (ptr == NULL) {
1776
0
      log_info("%s: failed to reassemble fragments", __func__);
1777
0
      goto done;
1778
0
    }
1779
0
    memcpy(ptr, el->frag_data, el->frag_size);
1780
0
    offset += el->frag_size;
1781
0
  }
1782
1783
0
  log_debug("%s: Defragmented length %zd", __func__,
1784
0
      sa_frag->frag_total_size);
1785
0
  print_hex(ibuf_data(e), 0,  sa_frag->frag_total_size);
1786
1787
  /* Drop the original request's packets from the retransmit queue */
1788
0
  if (msg->msg_response)
1789
0
    ikev2_msg_dispose(env, &msg->msg_sa->sa_requests,
1790
0
        ikev2_msg_lookup(env, &msg->msg_sa->sa_requests, msg,
1791
0
        msg->msg_exchange));
1792
1793
  /*
1794
   * Parse decrypted payload
1795
   */
1796
0
  bzero(&emsg, sizeof(emsg));
1797
0
  memcpy(&emsg, msg, sizeof(*msg));
1798
0
  emsg.msg_data = e;
1799
0
  emsg.msg_e = 1;
1800
0
  emsg.msg_parent = msg;
1801
0
  TAILQ_INIT(&emsg.msg_proposals);
1802
1803
0
  ret = ikev2_pld_payloads(env, &emsg, 0, ibuf_size(e),
1804
0
      sa_frag->frag_nextpayload);
1805
0
  processed = 1;
1806
0
done:
1807
0
  if (processed)
1808
0
    ikestat_add(env, ikes_frag_reass_ok, sa_frag->frag_total);
1809
0
  else
1810
0
    ikestat_add(env, ikes_frag_reass_drop, sa_frag->frag_total);
1811
0
  config_free_fragments(sa_frag);
1812
0
  ibuf_free(e);
1813
1814
0
  return (ret);
1815
0
}
1816
1817
int
1818
ikev2_pld_e(struct iked *env, struct ikev2_payload *pld,
1819
    struct iked_message *msg, size_t offset, size_t left)
1820
0
{
1821
0
  struct iked_sa    *sa = msg->msg_sa;
1822
0
  struct ibuf   *e = NULL;
1823
0
  uint8_t     *msgbuf = ibuf_data(msg->msg_data);
1824
0
  struct iked_message  emsg;
1825
0
  uint8_t     *buf;
1826
0
  size_t       len;
1827
0
  int      ret = -1;
1828
1829
0
  if (sa->sa_fragments.frag_arr != NULL) {
1830
0
    log_warn("%s: Received SK payload when SKFs are in queue.",
1831
0
        __func__);
1832
0
    config_free_fragments(&sa->sa_fragments);
1833
0
    return (ret);
1834
0
  }
1835
1836
0
  buf = msgbuf + offset;
1837
0
  len = left;
1838
1839
0
  if ((e = ibuf_new(buf, len)) == NULL)
1840
0
    goto done;
1841
1842
0
  if (ikev2_msg_frompeer(msg)) {
1843
0
    e = ikev2_msg_decrypt(env, msg->msg_sa, msg->msg_data, e);
1844
0
  } else {
1845
0
    sa->sa_hdr.sh_initiator = sa->sa_hdr.sh_initiator ? 0 : 1;
1846
0
    e = ikev2_msg_decrypt(env, msg->msg_sa, msg->msg_data, e);
1847
0
    sa->sa_hdr.sh_initiator = sa->sa_hdr.sh_initiator ? 0 : 1;
1848
0
  }
1849
1850
0
  if (e == NULL)
1851
0
    goto done;
1852
1853
  /*
1854
   * Parse decrypted payload
1855
   */
1856
0
  bzero(&emsg, sizeof(emsg));
1857
0
  memcpy(&emsg, msg, sizeof(*msg));
1858
0
  emsg.msg_data = e;
1859
0
  emsg.msg_e = 1;
1860
0
  emsg.msg_parent = msg;
1861
0
  TAILQ_INIT(&emsg.msg_proposals);
1862
1863
0
  ret = ikev2_pld_payloads(env, &emsg, 0, ibuf_size(e),
1864
0
      pld->pld_nextpayload);
1865
1866
0
 done:
1867
0
  ibuf_free(e);
1868
1869
0
  return (ret);
1870
0
}
1871
1872
int
1873
ikev2_validate_cp(struct iked_message *msg, size_t offset, size_t left,
1874
    struct ikev2_cp *cp)
1875
13.3k
{
1876
13.3k
  uint8_t   *msgbuf = ibuf_data(msg->msg_data);
1877
1878
13.3k
  if (left < sizeof(*cp)) {
1879
3.86k
    log_debug("%s: malformed payload: too short for header "
1880
3.86k
        "(%zu < %zu)", __func__, left, sizeof(*cp));
1881
3.86k
    return (-1);
1882
3.86k
  }
1883
9.48k
  memcpy(cp, msgbuf + offset, sizeof(*cp));
1884
1885
9.48k
  return (0);
1886
13.3k
}
1887
1888
int
1889
ikev2_pld_cp(struct iked *env, struct ikev2_payload *pld,
1890
    struct iked_message *msg, size_t offset, size_t left)
1891
13.3k
{
1892
13.3k
  struct ikev2_cp    cp;
1893
13.3k
  struct ikev2_cfg  *cfg;
1894
13.3k
  struct iked_addr  *addr;
1895
13.3k
  struct sockaddr_in  *in4;
1896
13.3k
  struct sockaddr_in6 *in6;
1897
13.3k
  uint8_t     *msgbuf = ibuf_data(msg->msg_data);
1898
13.3k
  uint8_t     *ptr;
1899
13.3k
  size_t       len;
1900
13.3k
  int      cfg_type;
1901
1902
13.3k
  if (ikev2_validate_cp(msg, offset, left, &cp))
1903
3.86k
    return (-1);
1904
1905
9.48k
  ptr = msgbuf + offset + sizeof(cp);
1906
9.48k
  len = left - sizeof(cp);
1907
1908
9.48k
  log_debug("%s: type %s length %zu",
1909
9.48k
      __func__, print_map(cp.cp_type, ikev2_cp_map), len);
1910
9.48k
  print_hex(ptr, 0, len);
1911
1912
21.9k
  while (len > 0) {
1913
15.4k
    if (len < sizeof(*cfg)) {
1914
369
      log_debug("%s: malformed payload: too short for cfg "
1915
369
          "(%zu < %zu)", __func__, len, sizeof(*cfg));
1916
369
      return (-1);
1917
369
    }
1918
15.0k
    cfg = (struct ikev2_cfg *)ptr;
1919
1920
15.0k
    log_debug("%s: %s 0x%04x length %d", __func__,
1921
15.0k
        print_map(betoh16(cfg->cfg_type), ikev2_cfg_map),
1922
15.0k
        betoh16(cfg->cfg_type),
1923
15.0k
        betoh16(cfg->cfg_length));
1924
1925
15.0k
    ptr += sizeof(*cfg);
1926
15.0k
    len -= sizeof(*cfg);
1927
1928
15.0k
    if (len < betoh16(cfg->cfg_length)) {
1929
2.58k
      log_debug("%s: malformed payload: too short for "
1930
2.58k
          "cfg_length (%zu < %u)", __func__, len,
1931
2.58k
          betoh16(cfg->cfg_length));
1932
2.58k
      return (-1);
1933
2.58k
    }
1934
1935
12.4k
    print_hex(ptr, sizeof(*cfg), betoh16(cfg->cfg_length));
1936
1937
12.4k
    cfg_type = betoh16(cfg->cfg_type);
1938
12.4k
    switch (cfg_type) {
1939
897
    case IKEV2_CFG_INTERNAL_IP4_ADDRESS:
1940
2.11k
    case IKEV2_CFG_INTERNAL_IP4_DNS:
1941
2.11k
      if (!ikev2_msg_frompeer(msg))
1942
1.32k
        break;
1943
789
      if (betoh16(cfg->cfg_length) == 0)
1944
316
        break;
1945
      /* XXX multiple-valued */
1946
473
      if (betoh16(cfg->cfg_length) < 4) {
1947
6
        log_debug("%s: malformed payload: too short "
1948
6
            "for ipv4 addr (%u < %u)",
1949
6
            __func__, betoh16(cfg->cfg_length), 4);
1950
6
        return (-1);
1951
6
      }
1952
467
      switch(cfg_type) {
1953
359
      case IKEV2_CFG_INTERNAL_IP4_ADDRESS:
1954
359
        if (msg->msg_parent->msg_cp_addr != NULL) {
1955
240
          log_debug("%s: address already set", __func__);
1956
240
          goto skip;
1957
240
        }
1958
119
        break;
1959
119
      case IKEV2_CFG_INTERNAL_IP4_DNS:
1960
108
        if (msg->msg_parent->msg_cp_dns != NULL) {
1961
53
          log_debug("%s: dns already set", __func__);
1962
53
          goto skip;
1963
53
        }
1964
55
        break;
1965
55
      default:
1966
0
        break;
1967
467
      }
1968
174
      if ((addr = calloc(1, sizeof(*addr))) == NULL) {
1969
0
        log_debug("%s: malloc failed", __func__);
1970
0
        break;
1971
0
      }
1972
174
      addr->addr_af = AF_INET;
1973
174
      in4 = (struct sockaddr_in *)&addr->addr;
1974
174
      in4->sin_family = AF_INET;
1975
#ifdef HAVE_SOCKADDR_SA_LEN
1976
      in4->sin_len = sizeof(*in4);
1977
#endif
1978
174
      memcpy(&in4->sin_addr.s_addr, ptr, 4);
1979
174
      switch(cfg_type) {
1980
119
      case IKEV2_CFG_INTERNAL_IP4_ADDRESS:
1981
119
        msg->msg_parent->msg_cp_addr = addr;
1982
119
        log_debug("%s: IP4_ADDRESS %s", __func__,
1983
119
            print_addr(&addr->addr));
1984
119
        break;
1985
55
      case IKEV2_CFG_INTERNAL_IP4_DNS:
1986
55
        msg->msg_parent->msg_cp_dns = addr;
1987
55
        log_debug("%s: IP4_DNS %s", __func__,
1988
55
            print_addr(&addr->addr));
1989
55
        break;
1990
0
      default:
1991
0
        log_debug("%s: cfg %s", __func__,
1992
0
            print_addr(&addr->addr));
1993
0
        break;
1994
174
      }
1995
174
      break;
1996
4.40k
    case IKEV2_CFG_INTERNAL_IP6_ADDRESS:
1997
5.27k
    case IKEV2_CFG_INTERNAL_IP6_DNS:
1998
5.27k
      if (!ikev2_msg_frompeer(msg))
1999
5.04k
        break;
2000
235
      if (betoh16(cfg->cfg_length) == 0)
2001
94
        break;
2002
      /* XXX multiple-valued */
2003
141
      if (betoh16(cfg->cfg_length) < 16) {
2004
5
        log_debug("%s: malformed payload: too short "
2005
5
            "for ipv6 addr w/prefixlen (%u < %u)",
2006
5
            __func__, betoh16(cfg->cfg_length), 16);
2007
5
        return (-1);
2008
5
      }
2009
136
      switch(cfg_type) {
2010
89
      case IKEV2_CFG_INTERNAL_IP6_ADDRESS:
2011
89
        if (msg->msg_parent->msg_cp_addr6 != NULL) {
2012
47
          log_debug("%s: address6 already set", __func__);
2013
47
          goto skip;
2014
47
        }
2015
42
        break;
2016
47
      case IKEV2_CFG_INTERNAL_IP6_DNS:
2017
47
        if (msg->msg_parent->msg_cp_dns != NULL) {
2018
41
          log_debug("%s: dns already set", __func__);
2019
41
          goto skip;
2020
41
        }
2021
6
        break;
2022
136
      }
2023
48
      if ((addr = calloc(1, sizeof(*addr))) == NULL) {
2024
0
        log_debug("%s: malloc failed", __func__);
2025
0
        break;
2026
0
      }
2027
48
      addr->addr_af = AF_INET6;
2028
48
      in6 = (struct sockaddr_in6 *)&addr->addr;
2029
48
      in6->sin6_family = AF_INET6;
2030
#ifdef HAVE_SOCKADDR_SA_LEN
2031
      in6->sin6_len = sizeof(*in6);
2032
#endif
2033
48
      memcpy(&in6->sin6_addr, ptr, 16);
2034
48
      switch(cfg_type) {
2035
42
      case IKEV2_CFG_INTERNAL_IP6_ADDRESS:
2036
42
        msg->msg_parent->msg_cp_addr6 = addr;
2037
42
        log_debug("%s: IP6_ADDRESS %s", __func__,
2038
42
            print_addr(&addr->addr));
2039
42
        break;
2040
6
      case IKEV2_CFG_INTERNAL_IP6_DNS:
2041
6
        msg->msg_parent->msg_cp_dns = addr;
2042
6
        log_debug("%s: IP6_DNS %s", __func__,
2043
6
            print_addr(&addr->addr));
2044
6
        break;
2045
0
      default:
2046
0
        log_debug("%s: cfg %s/%d", __func__,
2047
0
            print_addr(&addr->addr), ptr[16]);
2048
0
        break;
2049
48
      }
2050
48
      break;
2051
12.4k
    }
2052
2053
12.4k
 skip:
2054
12.4k
    ptr += betoh16(cfg->cfg_length);
2055
12.4k
    len -= betoh16(cfg->cfg_length);
2056
12.4k
  }
2057
2058
6.52k
  if (!ikev2_msg_frompeer(msg))
2059
6.31k
    return (0);
2060
2061
207
  msg->msg_parent->msg_cp = cp.cp_type;
2062
2063
207
  return (0);
2064
6.52k
}
2065
2066
int
2067
ikev2_validate_eap(struct iked_message *msg, size_t offset, size_t left,
2068
    struct eap_header *hdr)
2069
26.6k
{
2070
26.6k
  uint8_t   *msgbuf = ibuf_data(msg->msg_data);
2071
2072
26.6k
  if (left < sizeof(*hdr)) {
2073
11.2k
    log_debug("%s: malformed payload: too short for header "
2074
11.2k
        "(%zu < %zu)", __func__, left, sizeof(*hdr));
2075
11.2k
    return (-1);
2076
11.2k
  }
2077
15.4k
  memcpy(hdr, msgbuf + offset, sizeof(*hdr));
2078
2079
15.4k
  return (0);
2080
26.6k
}
2081
2082
int
2083
ikev2_pld_eap(struct iked *env, struct ikev2_payload *pld,
2084
    struct iked_message *msg, size_t offset, size_t left)
2085
26.6k
{
2086
26.6k
  struct eap_header    hdr;
2087
26.6k
  struct eap_message    *eap = NULL;
2088
26.6k
  const struct iked_sa    *sa = msg->msg_sa;
2089
26.6k
  size_t         len;
2090
2091
26.6k
  if (ikev2_validate_eap(msg, offset, left, &hdr))
2092
11.2k
    return (-1);
2093
15.4k
  len = betoh16(hdr.eap_length);
2094
2095
15.4k
  if (len < sizeof(*eap)) {
2096
5.45k
    log_info("%s: %s id %d length %d", SPI_SA(sa, __func__),
2097
5.45k
        print_map(hdr.eap_code, eap_code_map),
2098
5.45k
        hdr.eap_id, betoh16(hdr.eap_length));
2099
9.99k
  } else {
2100
    /* Now try to get the indicated length */
2101
9.99k
    if ((eap = ibuf_seek(msg->msg_data, offset, len)) == NULL) {
2102
4.90k
      log_debug("%s: invalid EAP length", __func__);
2103
4.90k
      return (-1);
2104
4.90k
    }
2105
2106
5.09k
    log_info("%s: %s id %d length %d EAP-%s", SPI_SA(sa, __func__),
2107
5.09k
        print_map(eap->eap_code, eap_code_map),
2108
5.09k
        eap->eap_id, betoh16(eap->eap_length),
2109
5.09k
        print_map(eap->eap_type, eap_type_map));
2110
2111
5.09k
    if (eap_parse(env, sa, msg, eap, msg->msg_response) == -1)
2112
0
      return (-1);
2113
5.09k
    msg->msg_parent->msg_eap.eam_found = 1;
2114
5.09k
  }
2115
2116
10.5k
  return (0);
2117
15.4k
}