00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
00021
00022
00023
00024
00025
00026
00027
00028
00029
00030
00031
00032
00033
00034
00035
00036
00037
00038
00039
00040
00041
00042
00043
00044
00045
00046
00047
00048
00049
00050
00051
00052
00053
00054
00055
00056
00057
00058
00059
00060
00061
00062
00063
00064
00065
00066
00067
00068
00069
00070
00071 #ifndef __STUN_H__
00072 #define __STUN_H__
00073
00074 #include <stdio.h>
00075 #include <time.h>
00076 #include <ortp/port.h>
00077 #include <ortp/stun_udp.h>
00078
00079 #ifdef __APPLE__
00080 #include "TargetConditionals.h"
00081 #endif
00082
00083 #ifdef __cplusplus
00084 extern "C"
00085 {
00086 #endif
00087
00088
00089 #define STUN_VERSION "0.99"
00090
00091 #define STUN_MAX_STRING 256
00092 #define STUN_MAX_UNKNOWN_ATTRIBUTES 8
00093 #define STUN_MAX_MESSAGE_SIZE 2048
00094
00095 #define STUN_PORT 3478
00096
00097
00098 #if 0
00099 typedef unsigned char uint8_t;
00100 typedef unsigned short uint16_t;
00101 typedef unsigned int uint32_t;
00102
00103 #if defined(WIN32) || defined(_WIN32_WCE)
00104 typedef unsigned __int64 uint64_t;
00105 #else
00106 typedef unsigned long long uint64_t;
00107 #endif
00108 #endif
00109 typedef struct { unsigned char octet[12]; } UInt96;
00110
00111
00112 #define IPv4Family 0x01
00113 #define IPv6Family 0x02
00114
00115
00116 #define ChangeIpFlag 0x04
00117 #define ChangePortFlag 0x02
00118
00119
00120 #define SA_MAPPEDADDRESS 0x0001
00121 #define SA_RESPONSEADDRESS 0x0002
00122 #define SA_CHANGEREQUEST 0x0003
00123 #define SA_SOURCEADDRESS 0x0004
00124 #define SA_CHANGEDADDRESS 0x0005
00125 #define SA_USERNAME 0x0006
00126 #define SA_PASSWORD 0x0007
00127 #define SA_MESSAGEINTEGRITY 0x0008
00128 #define SA_ERRORCODE 0x0009
00129 #define SA_UNKNOWNATTRIBUTE 0x000A
00130 #define SA_REFLECTEDFROM 0x000B
00131 #define SA_REALM 0x0014
00132 #define SA_NONCE 0x0015
00133 #define SA_XORMAPPEDADDRESS 0x0020
00134
00135 #define SA_XORMAPPEDADDRESS2 0x8020
00136 #define SA_XORONLY 0x0021
00137 #define SA_SECONDARYADDRESS 0x0050
00138
00139 #define SA_SOFTWARE 0x8022
00140 #define SA_ALTERNATESERVER 0x8023
00141 #define SA_FINGERPRINT 0x8028
00142
00143
00144 #define TA_CHANNELNUMBER 0x000C
00145 #define TA_LIFETIME 0x000D
00146 #define TA_DEPRECATEDBANDWIDTH 0x0010
00147 #define TA_XORPEERADDRESS 0x0012
00148 #define TA_DATA 0x0013
00149 #define TA_XORRELAYEDADDRESS 0x0016
00150 #define TA_EVENPORT 0x0018
00151 #define TA_REQUESTEDTRANSPORT 0x0019
00152 #define TA_DONTFRAGMENT 0x001A
00153 #define TA_DEPRECATEDTIMERVAL 0x0021
00154 #define TA_RESERVATIONTOKEN 0x0022
00155
00156 #define ICEA_PRIORITY 0x0024
00157 #define ICEA_USECANDIDATE 0x0025
00158 #define ICEA_ICECONTROLLED 0x8029
00159 #define ICEA_ICECONTROLLING 0x802a
00160
00161 #define STUN_REQUEST 0x0000
00162 #define STUN_INDICATION 0x0010
00163 #define STUN_SUCCESS_RESP 0x0100
00164 #define STUN_ERR_RESP 0x0110
00165
00166 #define STUN_IS_REQUEST(msg_type) (((msg_type) & 0x0110) == 0x0000)
00167 #define STUN_IS_INDICATION(msg_type) (((msg_type) & 0x0110) == 0x0010)
00168 #define STUN_IS_SUCCESS_RESP(msg_type) (((msg_type) & 0x0110) == 0x0100)
00169 #define STUN_IS_ERR_RESP(msg_type) (((msg_type) & 0x0110) == 0x0110)
00170
00171
00172 #define STUN_METHOD_BINDING 0x0001
00173 #define TURN_MEDHOD_ALLOCATE 0x0003 //(only request/response semantics defined)
00174 #define TURN_METHOD_REFRESH 0x0004 //(only request/response semantics defined)
00175 #define TURN_METHOD_CREATEPERMISSION 0x0008 //(only request/response semantics defined
00176 #define TURN_METHOD_CHANNELBIND 0x0009 //(only request/response semantics defined)
00177
00178
00179
00180 #define SharedSecretRequestMsg 0x0002
00181 #define SharedSecretResponseMsg 0x0102
00182 #define SharedSecretErrorResponseMsg 0x0112
00183
00184 #define TURN_INDICATION_SEND 0x0006 //(only indication semantics defined)
00185 #define TURN_INDICATION_DATA 0x0007 //(only indication semantics defined)
00186
00187 typedef struct
00188 {
00189 uint16_t msgType;
00190 uint16_t msgLength;
00191 uint32_t magic_cookie;
00192 UInt96 tr_id;
00193 } StunMsgHdr;
00194
00195
00196 typedef struct
00197 {
00198 uint16_t type;
00199 uint16_t length;
00200 } StunAtrHdr;
00201
00202 typedef struct
00203 {
00204 uint16_t port;
00205 uint32_t addr;
00206 } StunAddress4;
00207
00208 typedef struct
00209 {
00210 uint8_t pad;
00211 uint8_t family;
00212 StunAddress4 ipv4;
00213 } StunAtrAddress4;
00214
00215 typedef struct
00216 {
00217 uint32_t value;
00218 } StunAtrChangeRequest;
00219
00220 typedef struct
00221 {
00222 uint16_t pad;
00223 uint8_t errorClass;
00224 uint8_t number;
00225 char reason[STUN_MAX_STRING];
00226 uint16_t sizeReason;
00227 } StunAtrError;
00228
00229 typedef struct
00230 {
00231 uint16_t attrType[STUN_MAX_UNKNOWN_ATTRIBUTES];
00232 uint16_t numAttributes;
00233 } StunAtrUnknown;
00234
00235 typedef struct
00236 {
00237 uint16_t channelNumber;
00238 uint16_t rffu;
00239 } TurnAtrChannelNumber;
00240
00241 typedef struct
00242 {
00243 uint32_t lifetime;
00244 } TurnAtrLifetime;
00245
00246 typedef struct
00247 {
00248 char value[1500];
00249 uint16_t sizeValue;
00250 } TurnAtrData;
00251
00252 typedef struct
00253 {
00254 uint8_t proto;
00255 uint8_t pad1;
00256 uint8_t pad2;
00257 uint8_t pad3;
00258 } TurnAtrRequestedTransport;
00259
00260 typedef struct
00261 {
00262 uint64_t value;
00263 } TurnAtrReservationToken;
00264
00265 typedef struct
00266 {
00267 uint32_t fingerprint;
00268 } StunAtrFingerprint;
00269
00270
00271 typedef struct
00272 {
00273 char value[STUN_MAX_STRING];
00274 uint16_t sizeValue;
00275 } StunAtrString;
00276
00277 typedef struct
00278 {
00279 uint32_t priority;
00280 } IceAtrPriority;
00281
00282 typedef struct
00283 {
00284 uint64_t value;
00285 } IceAtrIceControll;
00286
00287 typedef struct
00288 {
00289 char hash[20];
00290 } StunAtrIntegrity;
00291
00292 typedef enum
00293 {
00294 HmacUnkown=0,
00295 HmacOK,
00296 HmacBadUserName,
00297 HmacUnkownUserName,
00298 HmacFailed
00299 } StunHmacStatus;
00300
00301
00302 typedef struct
00303 {
00304 uint16_t attrType[STUN_MAX_UNKNOWN_ATTRIBUTES];
00305 uint16_t numAttributes;
00306 } TurnAtrUnknown;
00307
00308 typedef struct
00309 {
00310 StunMsgHdr msgHdr;
00311
00312 bool_t hasMappedAddress;
00313 StunAtrAddress4 mappedAddress;
00314
00315 bool_t hasResponseAddress;
00316 StunAtrAddress4 responseAddress;
00317
00318 bool_t hasChangeRequest;
00319 StunAtrChangeRequest changeRequest;
00320
00321 bool_t hasSourceAddress;
00322 StunAtrAddress4 sourceAddress;
00323
00324 bool_t hasChangedAddress;
00325 StunAtrAddress4 changedAddress;
00326
00327 bool_t hasUsername;
00328 StunAtrString username;
00329
00330 bool_t hasPassword;
00331 StunAtrString password;
00332
00333 bool_t hasMessageIntegrity;
00334 StunAtrIntegrity messageIntegrity;
00335
00336 bool_t hasErrorCode;
00337 StunAtrError errorCode;
00338
00339 bool_t hasUnknownAttributes;
00340 StunAtrUnknown unknownAttributes;
00341
00342 bool_t hasReflectedFrom;
00343 StunAtrAddress4 reflectedFrom;
00344
00345 bool_t hasRealm;
00346 StunAtrString realmName;
00347
00348 bool_t hasNonce;
00349 StunAtrString nonceName;
00350
00351 bool_t hasXorMappedAddress;
00352 StunAtrAddress4 xorMappedAddress;
00353
00354 bool_t hasSoftware;
00355 StunAtrString softwareName;
00356
00357 bool_t hasXorPeerAddress;
00358 StunAtrAddress4 xorPeerAddress;
00359
00360 bool_t hasXorRelayedAddress;
00361 StunAtrAddress4 xorRelayedAddress;
00362
00363 bool_t hasFingerprint;
00364 StunAtrFingerprint fingerprint;
00365
00366
00367 bool_t hasChannelNumberAttributes;
00368 TurnAtrChannelNumber channelNumberAttributes;
00369
00370 bool_t hasLifetimeAttributes;
00371 TurnAtrLifetime lifetimeAttributes;
00372
00373 bool_t hasData;
00374 TurnAtrData data;
00375
00376 bool_t hasRequestedTransport;
00377 TurnAtrRequestedTransport requestedTransport;
00378
00379 bool_t hasDontFragment;
00380
00381 bool_t hasReservationToken;
00382 TurnAtrReservationToken reservationToken;
00383
00384 bool_t hasPriority;
00385 IceAtrPriority priority;
00386
00387 bool_t hasUseCandidate;
00388
00389 bool_t hasIceControlled;
00390 IceAtrIceControll iceControlled;
00391
00392 bool_t hasIceControlling;
00393 IceAtrIceControll iceControlling;
00394 } StunMessage;
00395
00396
00397
00398 typedef enum
00399 {
00400 StunTypeUnknown=0,
00401 StunTypeOpen,
00402 StunTypeConeNat,
00403 StunTypeRestrictedNat,
00404 StunTypePortRestrictedNat,
00405 StunTypeSymNat,
00406 StunTypeSymFirewall,
00407 StunTypeBlocked,
00408 StunTypeFailure
00409 } NatType;
00410
00411
00412 #define MAX_MEDIA_RELAYS 500
00413 #define MAX_RTP_MSG_SIZE 1500
00414 #define MEDIA_RELAY_TIMEOUT 3*60
00415
00416 typedef struct
00417 {
00418 int relayPort;
00419 int fd;
00420 StunAddress4 destination;
00421 time_t expireTime;
00422 } StunMediaRelay;
00423
00424 typedef struct
00425 {
00426 StunAddress4 myAddr;
00427 StunAddress4 altAddr;
00428 Socket myFd;
00429 Socket altPortFd;
00430 Socket altIpFd;
00431 Socket altIpPortFd;
00432 bool_t relay;
00433 StunMediaRelay relays[MAX_MEDIA_RELAYS];
00434 } StunServerInfo;
00435
00436 void
00437 stunCalculateIntegrity_longterm(char* hmac, const char* input, int length,
00438 const char *username, const char *realm, const char *password);
00439 void
00440 stunCalculateIntegrity_shortterm(char* hmac, const char* input, int length, const char* key);
00441 uint32_t
00442 stunCalculateFingerprint(const char* input, int length);
00443
00444 bool_t
00445 stunParseMessage( char* buf,
00446 unsigned int bufLen,
00447 StunMessage *message);
00448
00449 void
00450 stunBuildReqSimple( StunMessage* msg,
00451 const StunAtrString *username,
00452 bool_t changePort, bool_t changeIp, unsigned int id );
00453
00454 unsigned int
00455 stunEncodeMessage( const StunMessage *message,
00456 char* buf,
00457 unsigned int bufLen,
00458 const StunAtrString *password);
00459
00460 void
00461 stunCreateUserName(const StunAddress4 *addr, StunAtrString* username);
00462
00463 void
00464 stunGetUserNameAndPassword( const StunAddress4 *dest,
00465 StunAtrString* username,
00466 StunAtrString* password);
00467
00468 void
00469 stunCreatePassword(const StunAtrString *username, StunAtrString* password);
00470
00471 int
00472 stunRand(void);
00473
00474 uint64_t
00475 stunGetSystemTimeSecs(void);
00476
00477
00478 bool_t
00479 stunParseServerName( const char* serverName, StunAddress4 *stunServerAddr);
00480
00481 bool_t
00482 stunParseHostName( const char* peerName,
00483 uint32_t *ip,
00484 uint16_t *portVal,
00485 uint16_t defaultPort );
00486
00487
00488
00489 bool_t
00490 stunInitServer(StunServerInfo *info,
00491 const StunAddress4 *myAddr,
00492 const StunAddress4 *altAddr,
00493 int startMediaPort);
00494
00495 void
00496 stunStopServer(StunServerInfo *info);
00497
00498
00499 int
00500 stunFindLocalInterfaces(uint32_t* addresses, int maxSize );
00501
00502 int
00503 stunTest( StunAddress4 *dest, int testNum, StunAddress4* srcAddr, StunAddress4 *sMappedAddr, StunAddress4* sChangedAddr);
00504
00505 NatType
00506 stunNatType( StunAddress4 *dest,
00507 bool_t* preservePort,
00508 bool_t* hairpin ,
00509 int port,
00510 StunAddress4* sAddr
00511 );
00512
00513 bool_t
00514 stunServerProcessMsg( char* buf,
00515 unsigned int bufLen,
00516 StunAddress4 *from,
00517 StunAddress4 *myAddr,
00518 StunAddress4 *altAddr,
00519 StunMessage *resp,
00520 StunAddress4 *destination,
00521 StunAtrString *hmacPassword,
00522 bool_t* changePort,
00523 bool_t* changeIp);
00524
00525 int
00526 stunOpenSocket( StunAddress4 *dest,
00527 StunAddress4* mappedAddr,
00528 int port,
00529 StunAddress4* srcAddr);
00530
00531 bool_t
00532 stunOpenSocketPair(StunAddress4 *dest,
00533 StunAddress4* mapAddr_rtp,
00534 StunAddress4* mapAddr_rtcp,
00535 int* fd1, int* fd2,
00536 int srcPort, StunAddress4* srcAddr);
00537
00538 bool_t
00539 turnAllocateSocketPair(StunAddress4 *dest,
00540 StunAddress4* mapAddr_rtp,
00541 StunAddress4* mapAddr_rtcp,
00542 int* fd1, int* fd2,
00543 int srcPort, StunAddress4* srcAddr);
00544
00545 #ifdef __cplusplus
00546 }
00547 #endif
00548
00549 #endif
00550