Coverage Report

Created: 2026-11-12 07:13

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