Coverage Report

Created: 2025-12-03 06:26

next uncovered line (L), next uncovered region (R), next uncovered branch (B)
/src/rtpproxy/external/libre/src/stun/addr.c
Line
Count
Source
1
/**
2
 * @file stun/addr.c  STUN Address encoding
3
 *
4
 * Copyright (C) 2010 Creytiv.com
5
 */
6
#include <re_types.h>
7
#include <re_mbuf.h>
8
#include <re_sa.h>
9
#include <re_list.h>
10
#include <re_stun.h>
11
#include "stun.h"
12
13
14
static void in6_xor_tid(uint8_t *in6, const uint8_t *tid)
15
133
{
16
133
  int i;
17
18
  /* XOR with Magic Cookie (alignment safe) */
19
133
  in6[0] ^= 0x21;
20
133
  in6[1] ^= 0x12;
21
133
  in6[2] ^= 0xa4;
22
133
  in6[3] ^= 0x42;
23
24
1.72k
  for (i=0; i<STUN_TID_SIZE; i++)
25
1.59k
    in6[4+i] ^= tid[i];
26
133
}
27
28
29
int stun_addr_encode(struct mbuf *mb, const struct sa *addr,
30
         const uint8_t *tid)
31
0
{
32
0
#ifdef HAVE_INET6
33
0
  uint8_t addr6[16];
34
0
#endif
35
0
  uint16_t port;
36
0
  uint32_t addr4;
37
0
  int err = 0;
38
39
0
  if (!mb || !addr)
40
0
    return EINVAL;
41
42
0
  port = tid ? sa_port(addr)^(STUN_MAGIC_COOKIE>>16) : sa_port(addr);
43
44
0
  switch (sa_af(addr)) {
45
46
0
  case AF_INET:
47
0
    addr4 = tid ? sa_in(addr)^STUN_MAGIC_COOKIE : sa_in(addr);
48
49
0
    err |= mbuf_write_u8(mb, 0);
50
0
    err |= mbuf_write_u8(mb, STUN_AF_IPv4);
51
0
    err |= mbuf_write_u16(mb, htons(port));
52
0
    err |= mbuf_write_u32(mb, htonl(addr4));
53
0
    break;
54
55
0
#ifdef HAVE_INET6
56
0
  case AF_INET6:
57
0
    sa_in6(addr, addr6);
58
0
    if (tid)
59
0
      in6_xor_tid(addr6, tid);
60
61
0
    err |= mbuf_write_u8(mb, 0);
62
0
    err |= mbuf_write_u8(mb, STUN_AF_IPv6);
63
0
    err |= mbuf_write_u16(mb, htons(port));
64
0
    err |= mbuf_write_mem(mb, addr6, 16);
65
0
    break;
66
0
#endif
67
0
  default:
68
0
    err = EAFNOSUPPORT;
69
0
    break;
70
0
  }
71
72
0
  return err;
73
0
}
74
75
76
int stun_addr_decode(struct mbuf *mb, struct sa *addr, const uint8_t *tid)
77
1.66k
{
78
1.66k
  uint8_t family, addr6[16];
79
1.66k
  uint32_t addr4;
80
1.66k
  uint16_t port;
81
82
1.66k
  if (!mb || !addr)
83
0
    return EINVAL;
84
85
1.66k
  if (mbuf_get_left(mb) < 4)
86
41
    return EBADMSG;
87
88
1.62k
  (void)mbuf_read_u8(mb);
89
1.62k
  family = mbuf_read_u8(mb);
90
1.62k
  port = ntohs(mbuf_read_u16(mb));
91
92
1.62k
  if (tid)
93
878
    port ^= STUN_MAGIC_COOKIE>>16;
94
95
1.62k
  switch (family) {
96
97
1.17k
  case STUN_AF_IPv4:
98
1.17k
    if (mbuf_get_left(mb) < 4)
99
271
      return EBADMSG;
100
101
901
    addr4 = ntohl(mbuf_read_u32(mb));
102
901
    if (tid)
103
288
      addr4 ^= STUN_MAGIC_COOKIE;
104
105
901
    sa_set_in(addr, addr4, port);
106
901
    break;
107
108
303
  case STUN_AF_IPv6:
109
303
    if (mbuf_get_left(mb) < 16)
110
80
      return EBADMSG;
111
112
223
    (void)mbuf_read_mem(mb, addr6, 16);
113
223
    if (tid)
114
133
      in6_xor_tid(addr6, tid);
115
116
223
    sa_set_in6(addr, addr6, port);
117
223
    break;
118
119
150
  default:
120
150
    return EAFNOSUPPORT;
121
1.62k
  }
122
123
1.12k
  return 0;
124
1.62k
}