xref: /freebsd/contrib/wpa/src/utils/uuid.c (revision 39beb93c3f8bdbf72a61fda42300b5ebed7390c8)
139beb93cSSam Leffler /*
239beb93cSSam Leffler  * Universally Unique IDentifier (UUID)
339beb93cSSam Leffler  * Copyright (c) 2008, Jouni Malinen <j@w1.fi>
439beb93cSSam Leffler  *
539beb93cSSam Leffler  * This program is free software; you can redistribute it and/or modify
639beb93cSSam Leffler  * it under the terms of the GNU General Public License version 2 as
739beb93cSSam Leffler  * published by the Free Software Foundation.
839beb93cSSam Leffler  *
939beb93cSSam Leffler  * Alternatively, this software may be distributed under the terms of BSD
1039beb93cSSam Leffler  * license.
1139beb93cSSam Leffler  *
1239beb93cSSam Leffler  * See README and COPYING for more details.
1339beb93cSSam Leffler  */
1439beb93cSSam Leffler 
1539beb93cSSam Leffler #include "includes.h"
1639beb93cSSam Leffler 
1739beb93cSSam Leffler #include "common.h"
1839beb93cSSam Leffler #include "crypto.h"
1939beb93cSSam Leffler #include "sha1.h"
2039beb93cSSam Leffler #include "uuid.h"
2139beb93cSSam Leffler 
2239beb93cSSam Leffler int uuid_str2bin(const char *str, u8 *bin)
2339beb93cSSam Leffler {
2439beb93cSSam Leffler 	const char *pos;
2539beb93cSSam Leffler 	u8 *opos;
2639beb93cSSam Leffler 
2739beb93cSSam Leffler 	pos = str;
2839beb93cSSam Leffler 	opos = bin;
2939beb93cSSam Leffler 
3039beb93cSSam Leffler 	if (hexstr2bin(pos, opos, 4))
3139beb93cSSam Leffler 		return -1;
3239beb93cSSam Leffler 	pos += 8;
3339beb93cSSam Leffler 	opos += 4;
3439beb93cSSam Leffler 
3539beb93cSSam Leffler 	if (*pos++ != '-' || hexstr2bin(pos, opos, 2))
3639beb93cSSam Leffler 		return -1;
3739beb93cSSam Leffler 	pos += 4;
3839beb93cSSam Leffler 	opos += 2;
3939beb93cSSam Leffler 
4039beb93cSSam Leffler 	if (*pos++ != '-' || hexstr2bin(pos, opos, 2))
4139beb93cSSam Leffler 		return -1;
4239beb93cSSam Leffler 	pos += 4;
4339beb93cSSam Leffler 	opos += 2;
4439beb93cSSam Leffler 
4539beb93cSSam Leffler 	if (*pos++ != '-' || hexstr2bin(pos, opos, 2))
4639beb93cSSam Leffler 		return -1;
4739beb93cSSam Leffler 	pos += 4;
4839beb93cSSam Leffler 	opos += 2;
4939beb93cSSam Leffler 
5039beb93cSSam Leffler 	if (*pos++ != '-' || hexstr2bin(pos, opos, 6))
5139beb93cSSam Leffler 		return -1;
5239beb93cSSam Leffler 
5339beb93cSSam Leffler 	return 0;
5439beb93cSSam Leffler }
5539beb93cSSam Leffler 
5639beb93cSSam Leffler 
5739beb93cSSam Leffler int uuid_bin2str(const u8 *bin, char *str, size_t max_len)
5839beb93cSSam Leffler {
5939beb93cSSam Leffler 	int len;
6039beb93cSSam Leffler 	len = os_snprintf(str, max_len, "%02x%02x%02x%02x-%02x%02x-%02x%02x-"
6139beb93cSSam Leffler 			  "%02x%02x-%02x%02x%02x%02x%02x%02x",
6239beb93cSSam Leffler 			  bin[0], bin[1], bin[2], bin[3],
6339beb93cSSam Leffler 			  bin[4], bin[5], bin[6], bin[7],
6439beb93cSSam Leffler 			  bin[8], bin[9], bin[10], bin[11],
6539beb93cSSam Leffler 			  bin[12], bin[13], bin[14], bin[15]);
6639beb93cSSam Leffler 	if (len < 0 || (size_t) len >= max_len)
6739beb93cSSam Leffler 		return -1;
6839beb93cSSam Leffler 	return 0;
6939beb93cSSam Leffler }
7039beb93cSSam Leffler 
7139beb93cSSam Leffler 
7239beb93cSSam Leffler int is_nil_uuid(const u8 *uuid)
7339beb93cSSam Leffler {
7439beb93cSSam Leffler 	int i;
7539beb93cSSam Leffler 	for (i = 0; i < UUID_LEN; i++)
7639beb93cSSam Leffler 		if (uuid[i])
7739beb93cSSam Leffler 			return 0;
7839beb93cSSam Leffler 	return 1;
7939beb93cSSam Leffler }
8039beb93cSSam Leffler 
8139beb93cSSam Leffler 
8239beb93cSSam Leffler void uuid_gen_mac_addr(const u8 *mac_addr, u8 *uuid)
8339beb93cSSam Leffler {
8439beb93cSSam Leffler 	const u8 *addr[2];
8539beb93cSSam Leffler 	size_t len[2];
8639beb93cSSam Leffler 	u8 hash[SHA1_MAC_LEN];
8739beb93cSSam Leffler 	u8 nsid[16] = {
8839beb93cSSam Leffler 		0x52, 0x64, 0x80, 0xf8,
8939beb93cSSam Leffler 		0xc9, 0x9b,
9039beb93cSSam Leffler 		0x4b, 0xe5,
9139beb93cSSam Leffler 		0xa6, 0x55,
9239beb93cSSam Leffler 		0x58, 0xed, 0x5f, 0x5d, 0x60, 0x84
9339beb93cSSam Leffler 	};
9439beb93cSSam Leffler 
9539beb93cSSam Leffler 	addr[0] = nsid;
9639beb93cSSam Leffler 	len[0] = sizeof(nsid);
9739beb93cSSam Leffler 	addr[1] = mac_addr;
9839beb93cSSam Leffler 	len[1] = 6;
9939beb93cSSam Leffler 	sha1_vector(2, addr, len, hash);
10039beb93cSSam Leffler 	os_memcpy(uuid, hash, 16);
10139beb93cSSam Leffler 
10239beb93cSSam Leffler 	/* Version: 5 = named-based version using SHA-1 */
10339beb93cSSam Leffler 	uuid[6] = (5 << 4) | (uuid[6] & 0x0f);
10439beb93cSSam Leffler 
10539beb93cSSam Leffler 	/* Variant specified in RFC 4122 */
10639beb93cSSam Leffler 	uuid[8] = 0x80 | (uuid[8] & 0x3f);
10739beb93cSSam Leffler }
108