tor-browser

The Tor Browser
git clone https://git.dasho.dev/tor-browser.git
Log | Files | Refs | README | LICENSE

stun.h (9120B)


      1 /*
      2 Copyright (c) 2007, Adobe Systems, Incorporated
      3 All rights reserved.
      4 
      5 Redistribution and use in source and binary forms, with or without
      6 modification, are permitted provided that the following conditions are
      7 met:
      8 
      9 * Redistributions of source code must retain the above copyright
     10  notice, this list of conditions and the following disclaimer.
     11 
     12 * Redistributions in binary form must reproduce the above copyright
     13  notice, this list of conditions and the following disclaimer in the
     14  documentation and/or other materials provided with the distribution.
     15 
     16 * Neither the name of Adobe Systems, Network Resonance nor the names of its
     17  contributors may be used to endorse or promote products derived from
     18  this software without specific prior written permission.
     19 
     20 THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
     21 "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
     22 LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
     23 A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
     24 OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
     25 SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
     26 LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
     27 DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
     28 THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
     29 (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
     30 OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
     31 */
     32 
     33 
     34 #ifndef _STUN_H
     35 #define _STUN_H
     36 
     37 #ifdef WIN32
     38 #include <winsock2.h>
     39 #else
     40 #include <sys/param.h>
     41 #include <sys/socket.h>
     42 #ifndef LINUX
     43 #include <net/if.h>
     44 #ifdef DARWIN
     45 #include <net/if_var.h>
     46 #endif
     47 #include <net/if_dl.h>
     48 #include <net/if_types.h>
     49 #else
     50 #include <linux/if.h>
     51 #endif
     52 #ifndef BSD
     53 #include <net/route.h>
     54 #endif
     55 #include <netinet/in.h>
     56 #ifndef LINUX
     57 #include <netinet/in_var.h>
     58 #endif
     59 #include <arpa/inet.h>
     60 #include <netdb.h>
     61 #endif
     62 #include <time.h>
     63 
     64 #include "nr_api.h"
     65 #include "stun_msg.h"
     66 #include "stun_build.h"
     67 #include "stun_codec.h"
     68 #include "stun_hint.h"
     69 #include "stun_util.h"
     70 #include "nr_socket.h"
     71 #include "stun_client_ctx.h"
     72 #include "stun_server_ctx.h"
     73 #include "stun_proc.h"
     74 
     75 #define NR_STUN_VERSION                 "rfc3489bis-11"
     76 #define NR_STUN_PORT                    3478
     77 
     78 /* STUN attributes */
     79 #define NR_STUN_ATTR_MAPPED_ADDRESS          0x0001
     80 #define NR_STUN_ATTR_USERNAME                0x0006
     81 #define NR_STUN_ATTR_MESSAGE_INTEGRITY       0x0008
     82 #define NR_STUN_ATTR_ERROR_CODE              0x0009
     83 #define NR_STUN_ATTR_UNKNOWN_ATTRIBUTES      0x000A
     84 #define NR_STUN_ATTR_REALM                   0x0014
     85 #define NR_STUN_ATTR_NONCE                   0x0015
     86 #define NR_STUN_ATTR_XOR_MAPPED_ADDRESS      0x0020
     87 #define NR_STUN_ATTR_SERVER                  0x8022
     88 #define NR_STUN_ATTR_ALTERNATE_SERVER        0x8023
     89 #define NR_STUN_ATTR_FINGERPRINT             0x8028
     90 
     91 /* for backwards compatibility with obsolete versions of the STUN spec */
     92 #define NR_STUN_ATTR_OLD_XOR_MAPPED_ADDRESS  0x8020
     93 
     94 #ifdef USE_STUND_0_96
     95 #define NR_STUN_ATTR_OLD_CHANGE_REQUEST      0x0003
     96 #endif /* USE_STUND_0_96 */
     97 
     98 #ifdef USE_RFC_3489_BACKWARDS_COMPATIBLE
     99 /* for backwards compatibility with obsolete versions of the STUN spec */
    100 #define NR_STUN_ATTR_OLD_PASSWORD            0x0007
    101 #define NR_STUN_ATTR_OLD_RESPONSE_ADDRESS    0x0002
    102 #define NR_STUN_ATTR_OLD_SOURCE_ADDRESS      0x0004
    103 #define NR_STUN_ATTR_OLD_CHANGED_ADDRESS     0x0005
    104 #endif /* USE_RFC_3489_BACKWARDS_COMPATIBLE */
    105 
    106 #ifdef USE_ICE
    107 /* ICE attributes */
    108 #define NR_STUN_ATTR_PRIORITY                0x0024
    109 #define NR_STUN_ATTR_USE_CANDIDATE           0x0025
    110 #define NR_STUN_ATTR_ICE_CONTROLLED          0x8029
    111 #define NR_STUN_ATTR_ICE_CONTROLLING         0x802A
    112 #endif /* USE_ICE */
    113 
    114 #ifdef USE_TURN
    115 /* TURN attributes */
    116 #define NR_STUN_ATTR_LIFETIME                0x000d
    117 /* from an expired draft defined as optional, but in the required range */
    118 #define NR_STUN_ATTR_BANDWIDTH               0x0010
    119 #define NR_STUN_ATTR_XOR_PEER_ADDRESS        0x0012
    120 #define NR_STUN_ATTR_DATA                    0x0013
    121 #define NR_STUN_ATTR_XOR_RELAY_ADDRESS       0x0016
    122 #define NR_STUN_ATTR_REQUESTED_TRANSPORT     0x0019
    123 
    124 #define NR_STUN_ATTR_REQUESTED_TRANSPORT_UDP     17
    125 #endif /* USE_TURN */
    126 
    127 /*
    128 *                +-+-+-+-+-+-+-+-+-+-+-+-+-+-+
    129 *                |M|M|M|M|M|C|M|M|M|C|M|M|M|M|
    130 *                |1|1|9|8|7|1|6|5|4|0|3|2|1|0|
    131 *                |1|0| | | | | | | | | | | | |
    132 *                +-+-+-+-+-+-+-+-+-+-+-+-+-+-+
    133 *
    134 *      Figure 3: Format of STUN Message Type Field
    135 */
    136 #define NR_STUN_METHOD_TYPE_BITS(m) \
    137        ((((m) & 0xf80) << 2) | (((m) & 0x070) << 1) | ((m) & 0x00f))
    138 
    139 #define NR_STUN_CLASS_TYPE_BITS(c) \
    140        ((((c) & 0x002) << 7) | (((c) & 0x001) << 4))
    141 
    142 #define NR_STUN_GET_TYPE_METHOD(t) \
    143        ((((t) >> 2) & 0xf80) | (((t) >> 1) & 0x070) | ((t) & 0x00f))
    144 
    145 #define NR_STUN_GET_TYPE_CLASS(t) \
    146        ((((t) >> 7) & 0x002) | (((t) >> 4) & 0x001))
    147 
    148 #define NR_STUN_TYPE(m,c)  (NR_STUN_METHOD_TYPE_BITS((m)) | NR_STUN_CLASS_TYPE_BITS((c)))
    149 
    150 /* building blocks for message types */
    151 #define NR_METHOD_BINDING          0x001
    152 #define NR_CLASS_REQUEST           0x0
    153 #define NR_CLASS_INDICATION        0x1
    154 #define NR_CLASS_RESPONSE          0x2
    155 #define NR_CLASS_ERROR_RESPONSE    0x3
    156 
    157 /* define types for STUN messages */
    158 #define NR_STUN_MSG_BINDING_REQUEST                 NR_STUN_TYPE(NR_METHOD_BINDING, \
    159                                                                 NR_CLASS_REQUEST)
    160 #define NR_STUN_MSG_BINDING_INDICATION              NR_STUN_TYPE(NR_METHOD_BINDING, \
    161                                                                 NR_CLASS_INDICATION)
    162 #define NR_STUN_MSG_BINDING_RESPONSE                NR_STUN_TYPE(NR_METHOD_BINDING, \
    163                                                                 NR_CLASS_RESPONSE)
    164 #define NR_STUN_MSG_BINDING_ERROR_RESPONSE          NR_STUN_TYPE(NR_METHOD_BINDING, \
    165                                                                 NR_CLASS_ERROR_RESPONSE)
    166 
    167 #ifdef USE_TURN
    168 /* building blocks for TURN message types */
    169 #define NR_METHOD_ALLOCATE                 0x003
    170 #define NR_METHOD_REFRESH                  0x004
    171 
    172 #define NR_METHOD_SEND                     0x006
    173 #define NR_METHOD_DATA                     0x007
    174 #define NR_METHOD_CREATE_PERMISSION        0x008
    175 #define NR_METHOD_CHANNEL_BIND             0x009
    176 
    177 /* define types for a TURN message */
    178 #define NR_STUN_MSG_ALLOCATE_REQUEST                NR_STUN_TYPE(NR_METHOD_ALLOCATE, \
    179                                                                 NR_CLASS_REQUEST)
    180 #define NR_STUN_MSG_ALLOCATE_RESPONSE               NR_STUN_TYPE(NR_METHOD_ALLOCATE, \
    181                                                                 NR_CLASS_RESPONSE)
    182 #define NR_STUN_MSG_ALLOCATE_ERROR_RESPONSE         NR_STUN_TYPE(NR_METHOD_ALLOCATE, \
    183                                                                 NR_CLASS_ERROR_RESPONSE)
    184 #define NR_STUN_MSG_REFRESH_REQUEST                 NR_STUN_TYPE(NR_METHOD_REFRESH, \
    185                                                                 NR_CLASS_REQUEST)
    186 #define NR_STUN_MSG_REFRESH_RESPONSE                NR_STUN_TYPE(NR_METHOD_REFRESH, \
    187                                                                 NR_CLASS_RESPONSE)
    188 #define NR_STUN_MSG_REFRESH_ERROR_RESPONSE          NR_STUN_TYPE(NR_METHOD_REFRESH, \
    189                                                                 NR_CLASS_ERROR_RESPONSE)
    190 
    191 #define NR_STUN_MSG_SEND_INDICATION                 NR_STUN_TYPE(NR_METHOD_SEND, \
    192                                                                 NR_CLASS_INDICATION)
    193 #define NR_STUN_MSG_DATA_INDICATION                 NR_STUN_TYPE(NR_METHOD_DATA, \
    194                                                                 NR_CLASS_INDICATION)
    195 
    196 #define NR_STUN_MSG_PERMISSION_REQUEST                 NR_STUN_TYPE(NR_METHOD_CREATE_PERMISSION, \
    197                                                                    NR_CLASS_REQUEST)
    198 #define NR_STUN_MSG_PERMISSION_RESPONSE                NR_STUN_TYPE(NR_METHOD_CREATE_PERMISSION, \
    199                                                                    NR_CLASS_RESPONSE)
    200 #define NR_STUN_MSG_PERMISSION_ERROR_RESPONSE          NR_STUN_TYPE(NR_METHOD_CREATE_PERMISSION, \
    201                                                                    NR_CLASS_ERROR_RESPONSE)
    202 
    203 #define NR_STUN_MSG_CHANNEL_BIND_REQUEST                 NR_STUN_TYPE(NR_METHOD_CHANNEL_BIND, \
    204                                                                      NR_CLASS_REQUEST)
    205 #define NR_STUN_MSG_CHANNEL_BIND_RESPONSE                NR_STUN_TYPE(NR_METHOD_CHANNEL_BIND, \
    206                                                                      NR_CLASS_RESPONSE)
    207 #define NR_STUN_MSG_CHANNEL_BIND_ERROR_RESPONSE          NR_STUN_TYPE(NR_METHOD_CHANNEL_BIND, \
    208                                                                      NR_CLASS_ERROR_RESPONSE)
    209 
    210 
    211 #endif /* USE_TURN */
    212 
    213 
    214 #define NR_STUN_AUTH_RULE_OPTIONAL      (1<<0)
    215 #define NR_STUN_AUTH_RULE_SHORT_TERM    (1<<8)
    216 #define NR_STUN_AUTH_RULE_LONG_TERM     (1<<9)
    217 
    218 #endif