Commit 1b76e28f authored by Youness Alaoui's avatar Youness Alaoui

Adding the ability to change the XOR value for the XOR-MAPPED-ADDRESS

parent 77ff1d20
...@@ -266,7 +266,19 @@ stun_message_find_xor_addr (const StunMessage *msg, stun_attr_type_t type, ...@@ -266,7 +266,19 @@ stun_message_find_xor_addr (const StunMessage *msg, stun_attr_type_t type,
if (val) if (val)
return val; return val;
return stun_xor_address (msg, addr, *addrlen); return stun_xor_address (msg, addr, *addrlen, STUN_MAGIC_COOKIE);
}
int
stun_message_find_xor_addr_full (const StunMessage *msg, stun_attr_type_t type,
struct sockaddr *restrict addr, socklen_t *restrict addrlen,
uint32_t magic_cookie)
{
int val = stun_message_find_addr (msg, type, addr, addrlen);
if (val)
return val;
return stun_xor_address (msg, addr, *addrlen, magic_cookie);
} }
int stun_message_find_error (const StunMessage *msg, int *restrict code) int stun_message_find_error (const StunMessage *msg, int *restrict code)
...@@ -444,7 +456,28 @@ int stun_message_append_xor_addr (StunMessage *msg, stun_attr_type_t type, ...@@ -444,7 +456,28 @@ int stun_message_append_xor_addr (StunMessage *msg, stun_attr_type_t type,
addrlen = sizeof (xor); addrlen = sizeof (xor);
memcpy (&xor, addr, addrlen); memcpy (&xor, addr, addrlen);
val = stun_xor_address (msg, (struct sockaddr *)&xor, addrlen); val = stun_xor_address (msg, (struct sockaddr *)&xor, addrlen,
STUN_MAGIC_COOKIE);
if (val)
return val;
return stun_message_append_addr (msg, type, (struct sockaddr *)&xor,
addrlen);
}
int stun_message_append_xor_addr_full (StunMessage *msg, stun_attr_type_t type,
const struct sockaddr *restrict addr, socklen_t addrlen,
uint32_t magic_cookie)
{
int val;
/* Must be big enough to hold any supported address: */
struct sockaddr_storage xor;
if (addrlen > sizeof (xor))
addrlen = sizeof (xor);
memcpy (&xor, addr, addrlen);
val = stun_xor_address (msg, (struct sockaddr *)&xor, addrlen, magic_cookie);
if (val) if (val)
return val; return val;
......
...@@ -317,6 +317,10 @@ int stun_message_find_addr (const StunMessage *msg, stun_attr_type_t type, ...@@ -317,6 +317,10 @@ int stun_message_find_addr (const StunMessage *msg, stun_attr_type_t type,
int stun_message_find_xor_addr (const StunMessage *msg, stun_attr_type_t type, int stun_message_find_xor_addr (const StunMessage *msg, stun_attr_type_t type,
struct sockaddr *restrict addr, socklen_t *restrict addrlen); struct sockaddr *restrict addr, socklen_t *restrict addrlen);
int stun_message_find_xor_addr_full (const StunMessage *msg,
stun_attr_type_t type, struct sockaddr *restrict addr,
socklen_t *restrict addrlen, uint32_t magic_cookie);
int stun_message_find_error (const StunMessage *msg, int *restrict code); int stun_message_find_error (const StunMessage *msg, int *restrict code);
...@@ -396,6 +400,10 @@ int stun_message_append_addr (StunMessage * msg, stun_attr_type_t type, ...@@ -396,6 +400,10 @@ int stun_message_append_addr (StunMessage * msg, stun_attr_type_t type,
int stun_message_append_xor_addr (StunMessage * msg, stun_attr_type_t type, int stun_message_append_xor_addr (StunMessage * msg, stun_attr_type_t type,
const struct sockaddr *restrict addr, socklen_t addrlen); const struct sockaddr *restrict addr, socklen_t addrlen);
int stun_message_append_xor_addr_full (StunMessage * msg, stun_attr_type_t type,
const struct sockaddr *restrict addr, socklen_t addrlen,
uint32_t magic_cookie);
/** /**
* Appends an ERROR-CODE attribute. * Appends an ERROR-CODE attribute.
* @param msg STUN message buffer * @param msg STUN message buffer
......
...@@ -149,7 +149,8 @@ void stun_debug_bytes (const void *data, size_t len) ...@@ -149,7 +149,8 @@ void stun_debug_bytes (const void *data, size_t len)
} }
int stun_xor_address (const StunMessage *msg, int stun_xor_address (const StunMessage *msg,
struct sockaddr *restrict addr, socklen_t addrlen) struct sockaddr *restrict addr, socklen_t addrlen,
uint32_t magic_cookie)
{ {
switch (addr->sa_family) switch (addr->sa_family)
{ {
...@@ -159,8 +160,8 @@ int stun_xor_address (const StunMessage *msg, ...@@ -159,8 +160,8 @@ int stun_xor_address (const StunMessage *msg,
if (addrlen < sizeof (*ip4)) if (addrlen < sizeof (*ip4))
return EINVAL; return EINVAL;
ip4->sin_port ^= htons (STUN_MAGIC_COOKIE >> 16); ip4->sin_port ^= htons (magic_cookie >> 16);
ip4->sin_addr.s_addr ^= htonl (STUN_MAGIC_COOKIE); ip4->sin_addr.s_addr ^= htonl (magic_cookie);
return 0; return 0;
} }
...@@ -172,7 +173,7 @@ int stun_xor_address (const StunMessage *msg, ...@@ -172,7 +173,7 @@ int stun_xor_address (const StunMessage *msg,
if (addrlen < sizeof (*ip6)) if (addrlen < sizeof (*ip6))
return EINVAL; return EINVAL;
ip6->sin6_port ^= htons (STUN_MAGIC_COOKIE >> 16); ip6->sin6_port ^= htons (magic_cookie >> 16);
for (i = 0; i < 16; i++) for (i = 0; i < 16; i++)
ip6->sin6_addr.s6_addr[i] ^= msg->buffer[4 + i]; ip6->sin6_addr.s6_addr[i] ^= msg->buffer[4 + i];
return 0; return 0;
......
...@@ -63,7 +63,8 @@ void stun_debug (const char *fmt, ...); ...@@ -63,7 +63,8 @@ void stun_debug (const char *fmt, ...);
void stun_debug_bytes (const void *data, size_t len); void stun_debug_bytes (const void *data, size_t len);
int stun_xor_address (const StunMessage *msg, int stun_xor_address (const StunMessage *msg,
struct sockaddr *restrict addr, socklen_t addrlen); struct sockaddr *restrict addr, socklen_t addrlen,
uint32_t magic_cookie);
int stun_memcmp (const StunMessage *msg, stun_attr_type_t type, int stun_memcmp (const StunMessage *msg, stun_attr_type_t type,
const void *data, size_t len); const void *data, size_t len);
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment