Coverage Report

Created: 2026-11-12 07:13

next uncovered line (L), next uncovered region (R), next uncovered branch (B)
/src/openiked-portable/regress/parser-libfuzzer/test_parser_fuzz.c
Line
Count
Source
1
/*  $OpenBSD$ */
2
/*
3
 * Fuzz tests for payload parsing
4
 *
5
 * Placed in the public domain
6
 */
7
8
#include <sys/socket.h>
9
#include <sys/queue.h>
10
#include <sys/uio.h>
11
12
#include <event.h>
13
#include <imsg.h>
14
#include <string.h>
15
16
#include "iked.h"
17
#include "ikev2.h"
18
19
u_int8_t cookies[] = {
20
  0xde, 0xad, 0xbe, 0xef, 0xca, 0xfe, 0x00, 0x01, /* initator cookie */
21
  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00  /* responder cookie */
22
};
23
24
u_int8_t genhdr[] = {
25
  0x00, 0x20, 0x22, 0x08, /* next, major/minor, exchange type, flags */
26
  0x00, 0x00, 0x00, 0x00, /* message ID */
27
  0x00, 0x00, 0x00, 0x00  /* total length */
28
};
29
30
2.53k
#define OFFSET_ICOOKIE    0
31
2.53k
#define OFFSET_RCOOKIE    8
32
2.53k
#define OFFSET_NEXTPAYLOAD  (0 + sizeof(cookies))
33
2.53k
#define OFFSET_VERSION    (1 + sizeof(cookies))
34
2.53k
#define OFFSET_EXCHANGE   (2 + sizeof(cookies))
35
2.53k
#define OFFSET_LENGTH   (8 + sizeof(cookies))
36
37
static u_int8_t *
38
get_icookie(u_int8_t *data)
39
2.53k
{
40
2.53k
  return &data[OFFSET_ICOOKIE];
41
2.53k
}
42
43
static u_int8_t *
44
get_rcookie(u_int8_t *data)
45
2.53k
{
46
2.53k
  return &data[OFFSET_RCOOKIE];
47
2.53k
}
48
49
static u_int8_t
50
get_nextpayload(u_int8_t *data)
51
2.53k
{
52
2.53k
  return data[OFFSET_NEXTPAYLOAD];
53
2.53k
}
54
55
static u_int8_t
56
get_version(u_int8_t *data)
57
2.53k
{
58
2.53k
  return data[OFFSET_VERSION];
59
2.53k
}
60
61
static u_int8_t
62
get_exchange(u_int8_t *data)
63
2.53k
{
64
2.53k
  return data[OFFSET_EXCHANGE];
65
2.53k
}
66
67
static u_int32_t
68
get_length(u_int8_t *data)
69
2.53k
{
70
2.53k
  return *(u_int32_t *)&data[OFFSET_LENGTH];
71
2.53k
}
72
73
static void
74
prepare_header(struct ike_header *hdr, struct ibuf *data)
75
2.53k
{
76
2.53k
  bzero(hdr, sizeof(*hdr));
77
2.53k
  bcopy(get_icookie(ibuf_data(data)), &hdr->ike_ispi,
78
2.53k
      sizeof(hdr->ike_ispi));
79
2.53k
  bcopy(get_rcookie(ibuf_data(data)), &hdr->ike_rspi,
80
2.53k
      sizeof(hdr->ike_rspi));
81
2.53k
  hdr->ike_nextpayload = get_nextpayload(ibuf_data(data));
82
2.53k
  hdr->ike_version = get_version(ibuf_data(data));
83
2.53k
  hdr->ike_exchange = get_exchange(ibuf_data(data));
84
2.53k
  hdr->ike_length = get_length(ibuf_data(data));
85
2.53k
}
86
87
static void
88
prepare_message(struct iked_message *msg, struct ibuf *data)
89
2.53k
{
90
2.53k
  static struct iked_sa sa;
91
92
2.53k
  config_free_fragments(&sa.sa_fragments);
93
2.53k
  bzero(&sa, sizeof(sa));
94
2.53k
  bzero(msg, sizeof(*msg));
95
96
2.53k
  msg->msg_sa = &sa;
97
2.53k
  msg->msg_data = data;
98
2.53k
  msg->msg_parent = msg;
99
100
2.53k
  TAILQ_INIT(&msg->msg_proposals);
101
2.53k
  SIMPLEQ_INIT(&msg->msg_certreqs);
102
2.53k
}
103
104
/* Entry-Point for libFuzzer */
105
int
106
LLVMFuzzerTestOneInput(const char *data, size_t size)
107
2.54k
{
108
2.54k
  static struct iked   env;
109
2.54k
  struct ibuf   *fuzzed;
110
2.54k
  struct ike_header  hdr;
111
2.54k
  struct iked_message  msg;
112
113
2.54k
  bzero(&env, sizeof(env));
114
2.54k
  bzero(&hdr, sizeof(hdr));
115
2.54k
  bzero(&msg, sizeof(msg));
116
117
2.54k
  fuzzed = ibuf_new(data, size);
118
2.54k
  if (fuzzed == NULL){
119
0
    fprintf(stderr, "%s\n", "ERROR: fuzzed == NULL! "
120
0
        "(hint: fuzz-input too long?)");
121
0
    return -1;
122
0
  }  
123
  
124
  /* size too small? */
125
2.54k
  if (size < sizeof(cookies) + sizeof(genhdr)){
126
11
    ibuf_free(fuzzed);
127
11
    return 0;
128
11
  }         
129
130
2.53k
  prepare_header(&hdr, fuzzed);
131
2.53k
  prepare_message(&msg, fuzzed);
132
133
2.53k
  ikev2_pld_parse(&env, &hdr, &msg, 0);
134
135
2.53k
  ikev2_msg_cleanup(&env, &msg);
136
137
2.53k
  return 0;
138
2.54k
}