Linux Audio

Check our new training course

Loading...
v4.17
  1/*
  2 * Unified UUID/GUID definition
  3 *
  4 * Copyright (C) 2009, 2016 Intel Corp.
  5 *	Huang Ying <ying.huang@intel.com>
  6 *
  7 * This program is free software; you can redistribute it and/or
  8 * modify it under the terms of the GNU General Public License version
  9 * 2 as published by the Free Software Foundation;
 10 *
 11 * This program is distributed in the hope that it will be useful,
 12 * but WITHOUT ANY WARRANTY; without even the implied warranty of
 13 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
 14 * GNU General Public License for more details.
 
 
 
 
 15 */
 16
 17#include <linux/kernel.h>
 18#include <linux/ctype.h>
 19#include <linux/errno.h>
 20#include <linux/export.h>
 21#include <linux/uuid.h>
 22#include <linux/random.h>
 23
 24const guid_t guid_null;
 25EXPORT_SYMBOL(guid_null);
 26const uuid_t uuid_null;
 27EXPORT_SYMBOL(uuid_null);
 28
 29const u8 guid_index[16] = {3,2,1,0,5,4,7,6,8,9,10,11,12,13,14,15};
 30const u8 uuid_index[16] = {0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15};
 31
 32/**
 33 * generate_random_uuid - generate a random UUID
 34 * @uuid: where to put the generated UUID
 35 *
 36 * Random UUID interface
 37 *
 38 * Used to create a Boot ID or a filesystem UUID/GUID, but can be
 39 * useful for other kernel drivers.
 40 */
 41void generate_random_uuid(unsigned char uuid[16])
 42{
 43	get_random_bytes(uuid, 16);
 44	/* Set UUID version to 4 --- truly random generation */
 45	uuid[6] = (uuid[6] & 0x0F) | 0x40;
 46	/* Set the UUID variant to DCE */
 47	uuid[8] = (uuid[8] & 0x3F) | 0x80;
 48}
 49EXPORT_SYMBOL(generate_random_uuid);
 50
 51static void __uuid_gen_common(__u8 b[16])
 52{
 53	prandom_bytes(b, 16);
 
 
 
 
 
 
 54	/* reversion 0b10 */
 55	b[8] = (b[8] & 0x3F) | 0x80;
 56}
 57
 58void guid_gen(guid_t *lu)
 59{
 60	__uuid_gen_common(lu->b);
 61	/* version 4 : random generation */
 62	lu->b[7] = (lu->b[7] & 0x0F) | 0x40;
 63}
 64EXPORT_SYMBOL_GPL(guid_gen);
 65
 66void uuid_gen(uuid_t *bu)
 67{
 68	__uuid_gen_common(bu->b);
 69	/* version 4 : random generation */
 70	bu->b[6] = (bu->b[6] & 0x0F) | 0x40;
 71}
 72EXPORT_SYMBOL_GPL(uuid_gen);
 73
 74/**
 75 * uuid_is_valid - checks if a UUID string is valid
 76 * @uuid:	UUID string to check
 77 *
 78 * Description:
 79 * It checks if the UUID string is following the format:
 80 *	xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx
 81 *
 82 * where x is a hex digit.
 83 *
 84 * Return: true if input is valid UUID string.
 85 */
 86bool uuid_is_valid(const char *uuid)
 87{
 88	unsigned int i;
 89
 90	for (i = 0; i < UUID_STRING_LEN; i++) {
 91		if (i == 8 || i == 13 || i == 18 || i == 23) {
 92			if (uuid[i] != '-')
 93				return false;
 94		} else if (!isxdigit(uuid[i])) {
 95			return false;
 96		}
 97	}
 98
 99	return true;
100}
101EXPORT_SYMBOL(uuid_is_valid);
102
103static int __uuid_parse(const char *uuid, __u8 b[16], const u8 ei[16])
104{
105	static const u8 si[16] = {0,2,4,6,9,11,14,16,19,21,24,26,28,30,32,34};
106	unsigned int i;
107
108	if (!uuid_is_valid(uuid))
109		return -EINVAL;
110
111	for (i = 0; i < 16; i++) {
112		int hi = hex_to_bin(uuid[si[i] + 0]);
113		int lo = hex_to_bin(uuid[si[i] + 1]);
114
115		b[ei[i]] = (hi << 4) | lo;
116	}
117
118	return 0;
119}
120
121int guid_parse(const char *uuid, guid_t *u)
122{
123	return __uuid_parse(uuid, u->b, guid_index);
124}
125EXPORT_SYMBOL(guid_parse);
126
127int uuid_parse(const char *uuid, uuid_t *u)
128{
129	return __uuid_parse(uuid, u->b, uuid_index);
130}
131EXPORT_SYMBOL(uuid_parse);
v3.1
 1/*
 2 * Unified UUID/GUID definition
 3 *
 4 * Copyright (C) 2009, Intel Corp.
 5 *	Huang Ying <ying.huang@intel.com>
 6 *
 7 * This program is free software; you can redistribute it and/or
 8 * modify it under the terms of the GNU General Public License version
 9 * 2 as published by the Free Software Foundation;
10 *
11 * This program is distributed in the hope that it will be useful,
12 * but WITHOUT ANY WARRANTY; without even the implied warranty of
13 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
14 * GNU General Public License for more details.
15 *
16 * You should have received a copy of the GNU General Public License
17 * along with this program; if not, write to the Free Software
18 * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
19 */
20
21#include <linux/kernel.h>
22#include <linux/module.h>
 
 
23#include <linux/uuid.h>
24#include <linux/random.h>
25
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
26static void __uuid_gen_common(__u8 b[16])
27{
28	int i;
29	u32 r;
30
31	for (i = 0; i < 4; i++) {
32		r = random32();
33		memcpy(b + i * 4, &r, 4);
34	}
35	/* reversion 0b10 */
36	b[8] = (b[8] & 0x3F) | 0x80;
37}
38
39void uuid_le_gen(uuid_le *lu)
40{
41	__uuid_gen_common(lu->b);
42	/* version 4 : random generation */
43	lu->b[7] = (lu->b[7] & 0x0F) | 0x40;
44}
45EXPORT_SYMBOL_GPL(uuid_le_gen);
46
47void uuid_be_gen(uuid_be *bu)
48{
49	__uuid_gen_common(bu->b);
50	/* version 4 : random generation */
51	bu->b[6] = (bu->b[6] & 0x0F) | 0x40;
52}
53EXPORT_SYMBOL_GPL(uuid_be_gen);