Commit f5f475dd authored by Youness Alaoui's avatar Youness Alaoui

Ported test-format to the new API

parent e2dd7d8e
...@@ -40,7 +40,7 @@ ...@@ -40,7 +40,7 @@
#include <sys/types.h> #include <sys/types.h>
#include <sys/socket.h> #include <sys/socket.h>
#include "stun/stun-msg.h" #include "stun/stunagent.h"
#include <stdio.h> #include <stdio.h>
#include <string.h> #include <string.h>
#include <stdlib.h> #include <stdlib.h>
...@@ -60,132 +60,169 @@ static void fatal (const char *msg, ...) ...@@ -60,132 +60,169 @@ static void fatal (const char *msg, ...)
exit (1); exit (1);
} }
static const char usr[] = "admin";
static const char pwd[] = "s3kr3t";
bool dynamic_check_validater (StunAgent *agent,
StunMessage *message, uint8_t *username, uint16_t username_len,
uint8_t **password, size_t *password_len, void *user_data)
{
if (username_len != strlen (usr) ||
memcmp (username, usr, strlen (usr)) != 0)
fatal ("vector test : Validater received wrong username!");
*password = (uint8_t *) pwd;
*password_len = strlen (pwd);
return true;
}
static void static void
dynamic_check (const uint8_t *msg, size_t len) dynamic_check (StunAgent *agent, StunMessage *msg, size_t len)
{ {
size_t len2 = stun_validate (msg, len); StunMessage msg2;
if ((len != len2) || (len2 & 3))
fatal ("Invalid message (%u, %u)\n", if (stun_agent_validate (agent, &msg2, msg->buffer, len, dynamic_check_validater, NULL) != STUN_VALIDATION_SUCCESS)
(unsigned)len, (unsigned)len2); fatal ("Could not validate message");
if (!stun_demux (msg))
fatal ("Invalid message multiplexing");
printf ("Built message of %u bytes\n", (unsigned)len); printf ("Built message of %u bytes\n", (unsigned)len);
} }
static size_t static size_t
finish_check (uint8_t *msg) finish_check (StunAgent *agent, StunMessage *msg)
{ {
stun_msg_t mshort; uint8_t buf[STUN_MAX_MESSAGE_SIZE + 8];
size_t len = sizeof (stun_msg_t); size_t len;
memcpy (mshort, msg, sizeof (mshort)); uint16_t plen;
StunMessage msg2;
msg2.agent = msg->agent;
msg2.buffer = buf;
msg2.buffer_len = sizeof(buf);
memcpy (msg2.buffer, msg->buffer, sizeof(buf) > msg->buffer_len ? msg->buffer_len : sizeof(buf));
len = stun_agent_finish_message (agent, msg, NULL, 0);
if (stun_finish (msg, &len, 0)) if (len <= 0)
fatal ("Cannot finish message"); fatal ("Cannot finish message");
dynamic_check (msg, len); dynamic_check (agent, msg, len);
len = sizeof (mshort); if (stun_message_find (&msg2, STUN_ATTRIBUTE_MESSAGE_INTEGRITY, &plen) != NULL)
if (stun_verify_password (mshort, "toto") != ENOENT)
fatal ("Missing HMAC test failed"); fatal ("Missing HMAC test failed");
if (stun_finish_short (mshort, &len, "ABCDE", "admin", "ABC", 0))
stun_message_append_string (&msg2, STUN_ATTRIBUTE_USERNAME, usr);
len = stun_agent_finish_message (agent, &msg2, pwd, strlen (pwd));
if (len <= 0)
fatal ("Cannot finish message with short-term creds"); fatal ("Cannot finish message with short-term creds");
dynamic_check (mshort, len); dynamic_check (agent, &msg2, len);
if (stun_verify_password (mshort, "admin") != 0)
fatal ("Valid HMAC test failed");
return len; return len;
} }
static void static void
check_af (const char *name, int family, socklen_t addrlen) check_af (const char *name, int family, socklen_t addrlen)
{ {
struct sockaddr_storage addr; struct sockaddr_storage addr;
stun_msg_t msg; uint8_t buf[100];
StunAgent agent;
StunMessage msg;
uint16_t known_attributes[] = {STUN_ATTRIBUTE_USERNAME, STUN_ATTRIBUTE_MESSAGE_INTEGRITY, STUN_ATTRIBUTE_ERROR_CODE, 0};
stun_agent_init (&agent, known_attributes,
STUN_COMPATIBILITY_3489BIS, STUN_AGENT_USAGE_USE_FINGERPRINT);
assert (addrlen <= sizeof (addr)); assert (addrlen <= sizeof (addr));
memset (&addr, 0, sizeof (addr)); memset (&addr, 0, sizeof (addr));
stun_init_request (msg, STUN_BINDING); stun_agent_init_request (&agent, &msg, buf, sizeof(buf), STUN_BINDING);
if (stun_append_addr (msg, sizeof (msg), STUN_MAPPED_ADDRESS, if (stun_message_append_addr (&msg, STUN_ATTRIBUTE_MAPPED_ADDRESS,
(struct sockaddr *)&addr, addrlen) != EAFNOSUPPORT) (struct sockaddr *)&addr, addrlen) != EAFNOSUPPORT)
fatal ("Unknown address family test failed"); fatal ("Unknown address family test failed");
if (stun_append_xor_addr (msg, sizeof (msg), STUN_XOR_MAPPED_ADDRESS, if (stun_message_append_xor_addr (&msg, STUN_ATTRIBUTE_XOR_MAPPED_ADDRESS,
(struct sockaddr *)&addr, addrlen) != EAFNOSUPPORT) (struct sockaddr *)&addr, addrlen) != EAFNOSUPPORT)
fatal ("Unknown address family xor test failed"); fatal ("Unknown address family xor test failed");
addr.ss_family = family; addr.ss_family = family;
if (stun_append_addr (msg, sizeof (msg), STUN_MAPPED_ADDRESS, if (stun_message_append_addr (&msg, STUN_ATTRIBUTE_MAPPED_ADDRESS,
(struct sockaddr *)&addr, addrlen - 1) != EINVAL) (struct sockaddr *)&addr, addrlen - 1) != EINVAL)
fatal ("Too small %s sockaddr test failed", name); fatal ("Too small %s sockaddr test failed", name);
if (stun_append_xor_addr (msg, sizeof (msg), STUN_XOR_MAPPED_ADDRESS, if (stun_message_append_xor_addr (&msg, STUN_ATTRIBUTE_XOR_MAPPED_ADDRESS,
(struct sockaddr *)&addr, addrlen - 1) != EINVAL) (struct sockaddr *)&addr, addrlen - 1) != EINVAL)
fatal ("Too small %s sockaddr xor test failed", name); fatal ("Too small %s sockaddr xor test failed", name);
if (stun_append_addr (msg, sizeof (msg), STUN_MAPPED_ADDRESS, if (stun_message_append_addr (&msg, STUN_ATTRIBUTE_MAPPED_ADDRESS,
(struct sockaddr *)&addr, addrlen)) (struct sockaddr *)&addr, addrlen))
fatal ("%s sockaddr test failed", name); fatal ("%s sockaddr test failed", name);
if (stun_append_xor_addr (msg, sizeof (msg), STUN_XOR_MAPPED_ADDRESS, if (stun_message_append_xor_addr (&msg, STUN_ATTRIBUTE_XOR_MAPPED_ADDRESS,
(struct sockaddr *)&addr, addrlen)) (struct sockaddr *)&addr, addrlen))
fatal ("%s sockaddr xor test failed", name); fatal ("%s sockaddr xor test failed", name);
} }
int main (void) int main (void)
{ {
uint8_t msg[STUN_MAXMSG + 8]; uint8_t buf[100];
size_t len; size_t len;
struct sockaddr addr; struct sockaddr addr;
StunAgent agent;
StunMessage msg;
uint16_t known_attributes[] = {STUN_ATTRIBUTE_USERNAME, STUN_ATTRIBUTE_MESSAGE_INTEGRITY, STUN_ATTRIBUTE_ERROR_CODE, 0};
stun_agent_init (&agent, known_attributes,
STUN_COMPATIBILITY_3489BIS, STUN_AGENT_USAGE_USE_FINGERPRINT);
/* Request formatting test */ /* Request formatting test */
stun_init_request (msg, STUN_BINDING); stun_agent_init_request (&agent, &msg, buf, sizeof(buf), STUN_BINDING);
finish_check (msg); finish_check (&agent, &msg);
if (memcmp (msg, "\x00\x01", 2)) if (memcmp (buf, "\x00\x01", 2))
fatal ("Request formatting test failed"); fatal ("Request formatting test failed");
/* Response formatting test */ /* Response formatting test */
stun_init_response (msg, sizeof (msg), msg, 0); stun_agent_init_response (&agent, &msg, buf, sizeof (buf), &msg);
finish_check (msg); finish_check (&agent, &msg);
if (memcmp (msg, "\x01\x01", 2)) if (memcmp (buf, "\x01\x01", 2))
fatal ("Response formatting test failed"); fatal ("Response formatting test failed");
/* Error formatting test */ /* Error formatting test */
stun_init_request (msg, STUN_BINDING); stun_agent_init_request (&agent, &msg, buf, sizeof(buf), STUN_BINDING);
if (stun_init_error (msg, sizeof (msg), msg, 400, 0)) finish_check (&agent, &msg);
if (!stun_agent_init_error (&agent, &msg, buf, sizeof (buf), &msg, 400))
fatal ("Error initialization test failed"); fatal ("Error initialization test failed");
finish_check (msg); finish_check (&agent, &msg);
if (memcmp (msg, "\x01\x11", 2)) if (memcmp (buf, "\x01\x11", 2))
fatal ("Error formatting test failed"); fatal ("Error formatting test failed");
/* Unknown error formatting test */ /* Unknown error formatting test */
stun_init_request (msg, STUN_BINDING); stun_agent_init_request (&agent, &msg, buf, sizeof(buf), STUN_BINDING);
if (stun_init_error (msg, sizeof (msg), msg, 666, 0)) finish_check (&agent, &msg);
if (!stun_agent_init_error (&agent, &msg, buf, sizeof (buf), &msg, 666))
fatal ("Unknown error initialization test failed"); fatal ("Unknown error initialization test failed");
finish_check (msg); finish_check (&agent, &msg);
if (memcmp (msg, "\x01\x11", 2)) if (memcmp (buf, "\x01\x11", 2))
fatal ("Unknown error formatting test failed"); fatal ("Unknown error formatting test failed");
/* Overflow tests */ /* Overflow tests */
stun_init_request (msg, STUN_BINDING); stun_agent_init_request (&agent, &msg, buf, sizeof(buf), STUN_BINDING);
for (len = 0; for (len = 0;
stun_append_flag (msg, sizeof (msg), 0xffff) != ENOBUFS; stun_message_append_flag (&msg, 0xffff) != ENOBUFS;
len += 4) len += 4)
{ {
if (len > 0xffff) if (len > 0xffff)
fatal ("Overflow protection test failed"); fatal ("Overflow protection test failed");
} }
if (stun_append32 (msg, sizeof (msg), 0xffff, 0x12345678) != ENOBUFS) if (stun_message_append32 (&msg, 0xffff, 0x12345678) != ENOBUFS)
fatal ("Double-word overflow test failed"); fatal ("Double-word overflow test failed");
if (stun_append64 (msg, sizeof (msg), 0xffff, if (stun_message_append64 (&msg, 0xffff,
0x123456789abcdef0) != ENOBUFS) 0x123456789abcdef0) != ENOBUFS)
fatal ("Quad-word overflow test failed"); fatal ("Quad-word overflow test failed");
if (stun_append_string (msg, sizeof (msg), 0xffff, "foobar") != ENOBUFS) if (stun_message_append_string (&msg, 0xffff, "foobar") != ENOBUFS)
fatal ("String overflow test failed"); fatal ("String overflow test failed");
memset (&addr, 0, sizeof (addr)); memset (&addr, 0, sizeof (addr));
...@@ -193,21 +230,14 @@ int main (void) ...@@ -193,21 +230,14 @@ int main (void)
#ifdef HAVE_SA_LEN #ifdef HAVE_SA_LEN
addr.sa_len = sizeof (addr); addr.sa_len = sizeof (addr);
#endif #endif
if (stun_append_xor_addr (msg, sizeof (msg), 0xffff, &addr, if (stun_message_append_xor_addr (&msg, 0xffff, &addr,
sizeof (addr)) != ENOBUFS) sizeof (addr)) != ENOBUFS)
fatal ("Address overflow test failed"); fatal ("Address overflow test failed");
len = sizeof (msg); len = sizeof (msg);
if (stun_finish (msg, &len, 0) != ENOBUFS) if (stun_agent_finish_message (&agent, &msg, NULL, 0) != 0)
fatal ("Fingerprint overflow test failed"); fatal ("Fingerprint overflow test failed");
len = sizeof (msg); if (stun_agent_finish_message (&agent, &msg, pwd, strlen (pwd)) != 0)
if (stun_finish_short (msg, &len, NULL, "secret", NULL, 0) != ENOBUFS)
fatal ("Message integrity overflow test failed"); fatal ("Message integrity overflow test failed");
len = sizeof (msg);
if (stun_finish_short (msg, &len, "login", "secret", NULL, 0) != ENOBUFS)
fatal ("Username overflow test failed");
len = sizeof (msg);
if (stun_finish_short (msg, &len, NULL, "secret", "foobar", 0) != ENOBUFS)
fatal ("Nonce overflow test failed");
/* Address attributes tests */ /* Address attributes tests */
check_af ("IPv4", AF_INET, sizeof (struct sockaddr_in)); check_af ("IPv4", AF_INET, sizeof (struct sockaddr_in));
......
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