18d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt/*
28d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * Universally Unique IDentifier (UUID)
38d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * Copyright (c) 2008, Jouni Malinen <j@w1.fi>
48d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt *
5c5ec7f57ead87efa365800228aa0b09a12d9e6c4Dmitry Shmidt * This software may be distributed under the terms of the BSD license.
6c5ec7f57ead87efa365800228aa0b09a12d9e6c4Dmitry Shmidt * See README for more details.
78d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt */
88d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
98d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt#include "includes.h"
108d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
118d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt#include "common.h"
128d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt#include "uuid.h"
138d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
148d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidtint uuid_str2bin(const char *str, u8 *bin)
158d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt{
168d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	const char *pos;
178d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	u8 *opos;
188d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
198d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	pos = str;
208d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	opos = bin;
218d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
228d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	if (hexstr2bin(pos, opos, 4))
238d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		return -1;
248d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	pos += 8;
258d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	opos += 4;
268d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
278d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	if (*pos++ != '-' || hexstr2bin(pos, opos, 2))
288d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		return -1;
298d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	pos += 4;
308d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	opos += 2;
318d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
328d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	if (*pos++ != '-' || hexstr2bin(pos, opos, 2))
338d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		return -1;
348d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	pos += 4;
358d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	opos += 2;
368d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
378d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	if (*pos++ != '-' || hexstr2bin(pos, opos, 2))
388d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		return -1;
398d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	pos += 4;
408d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	opos += 2;
418d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
428d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	if (*pos++ != '-' || hexstr2bin(pos, opos, 6))
438d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		return -1;
448d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
458d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	return 0;
468d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt}
478d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
488d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
498d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidtint uuid_bin2str(const u8 *bin, char *str, size_t max_len)
508d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt{
518d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	int len;
528d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	len = os_snprintf(str, max_len, "%02x%02x%02x%02x-%02x%02x-%02x%02x-"
538d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt			  "%02x%02x-%02x%02x%02x%02x%02x%02x",
548d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt			  bin[0], bin[1], bin[2], bin[3],
558d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt			  bin[4], bin[5], bin[6], bin[7],
568d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt			  bin[8], bin[9], bin[10], bin[11],
578d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt			  bin[12], bin[13], bin[14], bin[15]);
588d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	if (len < 0 || (size_t) len >= max_len)
598d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		return -1;
608d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	return 0;
618d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt}
628d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
638d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
648d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidtint is_nil_uuid(const u8 *uuid)
658d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt{
668d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	int i;
678d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	for (i = 0; i < UUID_LEN; i++)
688d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		if (uuid[i])
698d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt			return 0;
708d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	return 1;
718d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt}
72