00001
00016 #include "includes.h"
00017
00018 #include "common.h"
00019 #include "crypto.h"
00020 #include "sha1.h"
00021 #include "uuid.h"
00022
00023 int uuid_str2bin(const char *str, u8 *bin)
00024 {
00025 const char *pos;
00026 u8 *opos;
00027
00028 pos = str;
00029 opos = bin;
00030
00031 if (hexstr2bin(pos, opos, 4))
00032 return -1;
00033 pos += 8;
00034 opos += 4;
00035
00036 if (*pos++ != '-' || hexstr2bin(pos, opos, 2))
00037 return -1;
00038 pos += 4;
00039 opos += 2;
00040
00041 if (*pos++ != '-' || hexstr2bin(pos, opos, 2))
00042 return -1;
00043 pos += 4;
00044 opos += 2;
00045
00046 if (*pos++ != '-' || hexstr2bin(pos, opos, 2))
00047 return -1;
00048 pos += 4;
00049 opos += 2;
00050
00051 if (*pos++ != '-' || hexstr2bin(pos, opos, 6))
00052 return -1;
00053
00054 return 0;
00055 }
00056
00057
00058 int uuid_bin2str(const u8 *bin, char *str, size_t max_len)
00059 {
00060 int len;
00061 len = os_snprintf(str, max_len, "%02x%02x%02x%02x-%02x%02x-%02x%02x-"
00062 "%02x%02x-%02x%02x%02x%02x%02x%02x",
00063 bin[0], bin[1], bin[2], bin[3],
00064 bin[4], bin[5], bin[6], bin[7],
00065 bin[8], bin[9], bin[10], bin[11],
00066 bin[12], bin[13], bin[14], bin[15]);
00067 if (len < 0 || (size_t) len >= max_len)
00068 return -1;
00069 return 0;
00070 }
00071
00072
00073 int is_nil_uuid(const u8 *uuid)
00074 {
00075 int i;
00076 for (i = 0; i < UUID_LEN; i++)
00077 if (uuid[i])
00078 return 0;
00079 return 1;
00080 }
00081
00082
00083 void uuid_gen_mac_addr(const u8 *mac_addr, u8 *uuid)
00084 {
00085 const u8 *addr[2];
00086 size_t len[2];
00087 u8 hash[SHA1_MAC_LEN];
00088 u8 nsid[16] = {
00089 0x52, 0x64, 0x80, 0xf8,
00090 0xc9, 0x9b,
00091 0x4b, 0xe5,
00092 0xa6, 0x55,
00093 0x58, 0xed, 0x5f, 0x5d, 0x60, 0x84
00094 };
00095
00096 addr[0] = nsid;
00097 len[0] = sizeof(nsid);
00098 addr[1] = mac_addr;
00099 len[1] = 6;
00100 sha1_vector(2, addr, len, hash);
00101 os_memcpy(uuid, hash, 16);
00102
00103
00104 uuid[6] = (5 << 4) | (uuid[6] & 0x0f);
00105
00106
00107 uuid[8] = 0x80 | (uuid[8] & 0x3f);
00108 }
00109