diff options
author | Linus Nordberg <linus@nordu.net> | 2011-09-27 18:03:12 +0200 |
---|---|---|
committer | Linus Nordberg <linus@nordu.net> | 2011-09-27 18:03:12 +0200 |
commit | 7f4c1aa892a4f42748aa7c6bbd99f200ef7f8674 (patch) | |
tree | 8c9d8ab2b00e0ce7035f99618e9bfae0e9432926 /fticks.c | |
parent | 8eeb47547e346475e7cf27a20c949a49d3e54116 (diff) |
Sanitise MAC address before hashing it.
Almost closes RADSECPROXY-16.
Diffstat (limited to 'fticks.c')
-rw-r--r-- | fticks.c | 37 |
1 files changed, 31 insertions, 6 deletions
@@ -4,6 +4,8 @@ #include <stdio.h> /* For sprintf(). */ #include <string.h> +#include <ctype.h> +#include <errno.h> #include <nettle/sha.h> #include <nettle/hmac.h> @@ -129,18 +131,41 @@ out: by lowercasing it, removing all but [0-9a-f] and truncating it at the first ';' found. The truncation is done because RADIUS supposedly has a praxis of tacking on SSID to the MAC address in - Calling-Station-Id. */ -void + Calling-Station-Id. + + \return 0 on success, -ENOMEM on out of memory. +*/ +int fticks_hashmac(const uint8_t *in, const uint8_t *key, size_t out_len, uint8_t *out) { - /* TODO: lowercase */ - /* TODO: s/[!0-9a-f]//1 */ - /* TODO: truncate after first ';', if any */ + uint8_t *in_copy = NULL; + uint8_t *p = NULL; + int i; + + in_copy = calloc(1, strlen(in) + 1); + if (in_copy == NULL) + return -ENOMEM; + + /* Sanitise and lowercase 'in' into 'in_copy'. */ + for (i = 0, p = in_copy; in[i] != '\0'; i++) { + if (in[i] == ';') { + *p++ = '\0'; + break; + } + if (in[i] >= '0' && in[i] <= '9') { + *p++ = in[i]; + } + else if (tolower(in[i]) >= 'a' && tolower(in[i]) <= 'f') { + *p++ = tolower(in[i]); + } + } - _hash(in, key, out_len, out); + _hash(in_copy, key, out_len, out); + free(in_copy); + return 0; } void |