summaryrefslogtreecommitdiff
path: root/stun/stunhmac.c
diff options
context:
space:
mode:
authorYouness Alaoui <kakaroto@kakaroto.(none)>2008-08-06 18:49:32 -0400
committerYouness Alaoui <kakaroto@kakaroto.(none)>2008-08-06 18:49:32 -0400
commitc395f5c6fc7d609174b3981fd74341b84a7844d7 (patch)
tree2f7fb175f40e710fa0ffb21bee9f087318639d82 /stun/stunhmac.c
parent8338ac59ae180516e7c20812e364f6a6df524ac2 (diff)
downloadlibnice-c395f5c6fc7d609174b3981fd74341b84a7844d7.tar.gz
Add proper long term credentials support
Diffstat (limited to 'stun/stunhmac.c')
-rw-r--r--stun/stunhmac.c33
1 files changed, 26 insertions, 7 deletions
diff --git a/stun/stunhmac.c b/stun/stunhmac.c
index 563d805..6b205a2 100644
--- a/stun/stunhmac.c
+++ b/stun/stunhmac.c
@@ -81,21 +81,40 @@ void stun_sha1 (const uint8_t *msg, size_t len, uint8_t *sha,
HMAC_CTX_cleanup (&ctx);
}
+static const uint8_t *priv_trim_var (const uint8_t *var, size_t *var_len)
+{
+ const uint8_t *ptr = var;
+
+ while (*ptr == '"') {
+ ptr++;
+ (*var_len)--;
+ }
+ while(ptr[*var_len] == '"' ||
+ ptr[*var_len] == 0) {
+ (*var_len)--;
+ }
-void stun_hash_creds (const char *realm, const char *login, const char *pw,
- unsigned char md5[16])
+ return ptr;
+}
+
+
+void stun_hash_creds (const uint8_t *realm, size_t realm_len,
+ const uint8_t *username, size_t username_len,
+ const uint8_t *password, size_t password_len,
+ unsigned char md5[16])
{
EVP_MD_CTX ctx;
-
- assert (realm && login && pw && md5);
+ const uint8_t *username_trimmed = priv_trim_var (username, &username_len);
+ const uint8_t *password_trimmed = priv_trim_var (password, &password_len);;
+ const uint8_t *realm_trimmed = priv_trim_var (realm, &realm_len);;
EVP_MD_CTX_init (&ctx);
EVP_DigestInit_ex (&ctx, EVP_md5 (), NULL);
- EVP_DigestUpdate (&ctx, realm, strlen (realm));
+ EVP_DigestUpdate (&ctx, username_trimmed, username_len);
EVP_DigestUpdate (&ctx, ":", 1);
- EVP_DigestUpdate (&ctx, login, strlen (login));
+ EVP_DigestUpdate (&ctx, realm_trimmed, realm_len);
EVP_DigestUpdate (&ctx, ":", 1);
- EVP_DigestUpdate (&ctx, pw, strlen (pw));
+ EVP_DigestUpdate (&ctx, password_trimmed, password_len);
EVP_DigestFinal (&ctx, md5, NULL);
}