Commit 2d13729d authored by Youness Alaoui's avatar Youness Alaoui

Allow specifying the fakelen for stun_sha1 and make the WLM2009 compatibility...

Allow specifying the fakelen for stun_sha1 and make the WLM2009 compatibility mode use the fakelen including the fingerprint length
parent 966fc22a
...@@ -252,11 +252,27 @@ StunValidationStatus stun_agent_validate (StunAgent *agent, StunMessage *msg, ...@@ -252,11 +252,27 @@ StunValidationStatus stun_agent_validate (StunAgent *agent, StunMessage *msg,
memcpy (msg->long_term_key, md5, sizeof(md5)); memcpy (msg->long_term_key, md5, sizeof(md5));
msg->long_term_valid = TRUE; msg->long_term_valid = TRUE;
stun_sha1 (msg->buffer, hash + 20 - msg->buffer, sha, md5, sizeof(md5), if (agent->compatibility == STUN_COMPATIBILITY_RFC3489) {
agent->compatibility == STUN_COMPATIBILITY_RFC3489 ? TRUE : FALSE); stun_sha1 (msg->buffer, hash + 20 - msg->buffer, hash - msg->buffer,
sha, md5, sizeof(md5), TRUE);
} else if (agent->compatibility == STUN_COMPATIBILITY_WLM2009) {
stun_sha1 (msg->buffer, hash + 20 - msg->buffer,
stun_message_length (msg) - 20, sha, md5, sizeof(md5), TRUE);
} else {
stun_sha1 (msg->buffer, hash + 20 - msg->buffer,
hash - msg->buffer, sha, md5, sizeof(md5), FALSE);
}
} else { } else {
stun_sha1 (msg->buffer, hash + 20 - msg->buffer, sha, key, key_len, if (agent->compatibility == STUN_COMPATIBILITY_RFC3489) {
agent->compatibility == STUN_COMPATIBILITY_RFC3489 ? TRUE : FALSE); stun_sha1 (msg->buffer, hash + 20 - msg->buffer, hash - msg->buffer,
sha, key, key_len, TRUE);
} else if (agent->compatibility == STUN_COMPATIBILITY_WLM2009) {
stun_sha1 (msg->buffer, hash + 20 - msg->buffer,
stun_message_length (msg) - 20, sha, key, key_len, TRUE);
} else {
stun_sha1 (msg->buffer, hash + 20 - msg->buffer,
hash - msg->buffer, sha, key, key_len, FALSE);
}
} }
stun_debug (" Message HMAC-SHA1 fingerprint:"); stun_debug (" Message HMAC-SHA1 fingerprint:");
...@@ -509,11 +525,35 @@ size_t stun_agent_finish_message (StunAgent *agent, StunMessage *msg, ...@@ -509,11 +525,35 @@ size_t stun_agent_finish_message (StunAgent *agent, StunMessage *msg,
return 0; return 0;
} }
if (agent->usage_flags & STUN_AGENT_USAGE_LONG_TERM_CREDENTIALS) { if (agent->usage_flags & STUN_AGENT_USAGE_LONG_TERM_CREDENTIALS) {
stun_sha1 (msg->buffer, stun_message_length (msg), ptr, md5, sizeof(md5), if (agent->compatibility == STUN_COMPATIBILITY_RFC3489) {
agent->compatibility == STUN_COMPATIBILITY_RFC3489 ? TRUE : FALSE); stun_sha1 (msg->buffer, stun_message_length (msg),
stun_message_length (msg) - 20, ptr, md5, sizeof(md5), TRUE);
} else if (agent->compatibility == STUN_COMPATIBILITY_WLM2009) {
size_t minus = 20;
if (agent->usage_flags & STUN_AGENT_USAGE_USE_FINGERPRINT)
minus -= 8;
stun_sha1 (msg->buffer, stun_message_length (msg),
stun_message_length (msg) - minus, ptr, md5, sizeof(md5), TRUE);
} else {
stun_sha1 (msg->buffer, stun_message_length (msg),
stun_message_length (msg) - 20, ptr, md5, sizeof(md5), FALSE);
}
} else { } else {
stun_sha1 (msg->buffer, stun_message_length (msg), ptr, key, key_len, if (agent->compatibility == STUN_COMPATIBILITY_RFC3489) {
agent->compatibility == STUN_COMPATIBILITY_RFC3489 ? TRUE : FALSE); stun_sha1 (msg->buffer, stun_message_length (msg),
stun_message_length (msg) - 20, ptr, key, key_len, TRUE);
} else if (agent->compatibility == STUN_COMPATIBILITY_WLM2009) {
size_t minus = 20;
if (agent->usage_flags & STUN_AGENT_USAGE_USE_FINGERPRINT)
minus -= 8;
stun_sha1 (msg->buffer, stun_message_length (msg),
stun_message_length (msg) - minus, ptr, key, key_len, TRUE);
} else {
stun_sha1 (msg->buffer, stun_message_length (msg),
stun_message_length (msg) - 20, ptr, key, key_len, FALSE);
}
} }
stun_debug (" Message HMAC-SHA1 message integrity:" stun_debug (" Message HMAC-SHA1 message integrity:"
......
...@@ -47,10 +47,10 @@ ...@@ -47,10 +47,10 @@
#include <string.h> #include <string.h>
#include <assert.h> #include <assert.h>
void stun_sha1 (const uint8_t *msg, size_t len, uint8_t *sha, void stun_sha1 (const uint8_t *msg, size_t len, size_t msg_len, uint8_t *sha,
const void *key, size_t keylen, int padding) const void *key, size_t keylen, int padding)
{ {
uint16_t fakelen = htons (len - 20u); uint16_t fakelen = htons (msg_len);
const uint8_t *vector[4]; const uint8_t *vector[4];
size_t lengths[4]; size_t lengths[4];
uint8_t pad_char[64] = {0}; uint8_t pad_char[64] = {0};
......
...@@ -48,7 +48,7 @@ ...@@ -48,7 +48,7 @@
* *
* @return fingerprint value in <b>host</b> byte order. * @return fingerprint value in <b>host</b> byte order.
*/ */
void stun_sha1 (const uint8_t *msg, size_t len, void stun_sha1 (const uint8_t *msg, size_t len, size_t msg_len,
uint8_t *sha, const void *key, size_t keylen, int padding); uint8_t *sha, const void *key, size_t keylen, int padding);
/** /**
......
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