Blame view

lib/uuid.c 2.92 KB
1802d0bee   Thomas Gleixner   treewide: Replace...
1
  // SPDX-License-Identifier: GPL-2.0-only
fab1c2324   Huang Ying   Unified UUID/GUID...
2
3
4
  /*
   * Unified UUID/GUID definition
   *
e3a93bce6   Andy Shevchenko   lib/uuid.c: remov...
5
   * Copyright (C) 2009, 2016 Intel Corp.
fab1c2324   Huang Ying   Unified UUID/GUID...
6
   *	Huang Ying <ying.huang@intel.com>
fab1c2324   Huang Ying   Unified UUID/GUID...
7
8
9
   */
  
  #include <linux/kernel.h>
2b1b0d667   Andy Shevchenko   lib/uuid.c: intro...
10
11
  #include <linux/ctype.h>
  #include <linux/errno.h>
8bc3bcc93   Paul Gortmaker   lib: reduce the u...
12
  #include <linux/export.h>
fab1c2324   Huang Ying   Unified UUID/GUID...
13
14
  #include <linux/uuid.h>
  #include <linux/random.h>
ef40dda5b   Christoph Hellwig   uuid: hoist uuid_...
15
16
17
18
  const guid_t guid_null;
  EXPORT_SYMBOL(guid_null);
  const uuid_t uuid_null;
  EXPORT_SYMBOL(uuid_null);
f9727a17d   Christoph Hellwig   uuid: rename uuid...
19
  const u8 guid_index[16] = {3,2,1,0,5,4,7,6,8,9,10,11,12,13,14,15};
f9727a17d   Christoph Hellwig   uuid: rename uuid...
20
  const u8 uuid_index[16] = {0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15};
2b1b0d667   Andy Shevchenko   lib/uuid.c: intro...
21

d063623b6   Randy Dunlap   Documentation: ad...
22
23
24
25
  /**
   * generate_random_uuid - generate a random UUID
   * @uuid: where to put the generated UUID
   *
8da4b8c48   Andy Shevchenko   lib/uuid.c: move ...
26
27
   * Random UUID interface
   *
d063623b6   Randy Dunlap   Documentation: ad...
28
29
   * Used to create a Boot ID or a filesystem UUID/GUID, but can be
   * useful for other kernel drivers.
8da4b8c48   Andy Shevchenko   lib/uuid.c: move ...
30
31
32
33
34
35
36
37
38
39
   */
  void generate_random_uuid(unsigned char uuid[16])
  {
  	get_random_bytes(uuid, 16);
  	/* Set UUID version to 4 --- truly random generation */
  	uuid[6] = (uuid[6] & 0x0F) | 0x40;
  	/* Set the UUID variant to DCE */
  	uuid[8] = (uuid[8] & 0x3F) | 0x80;
  }
  EXPORT_SYMBOL(generate_random_uuid);
48a2e88f5   Andy Shevchenko   uuid: Provide a G...
40
41
42
43
44
45
46
47
48
  void generate_random_guid(unsigned char guid[16])
  {
  	get_random_bytes(guid, 16);
  	/* Set GUID version to 4 --- truly random generation */
  	guid[7] = (guid[7] & 0x0F) | 0x40;
  	/* Set the GUID variant to DCE */
  	guid[8] = (guid[8] & 0x3F) | 0x80;
  }
  EXPORT_SYMBOL(generate_random_guid);
fab1c2324   Huang Ying   Unified UUID/GUID...
49
50
  static void __uuid_gen_common(__u8 b[16])
  {
cedddb000   Akinobu Mita   uuid: use prandom...
51
  	prandom_bytes(b, 16);
fab1c2324   Huang Ying   Unified UUID/GUID...
52
53
54
  	/* reversion 0b10 */
  	b[8] = (b[8] & 0x3F) | 0x80;
  }
f9727a17d   Christoph Hellwig   uuid: rename uuid...
55
  void guid_gen(guid_t *lu)
fab1c2324   Huang Ying   Unified UUID/GUID...
56
57
58
59
60
  {
  	__uuid_gen_common(lu->b);
  	/* version 4 : random generation */
  	lu->b[7] = (lu->b[7] & 0x0F) | 0x40;
  }
f9727a17d   Christoph Hellwig   uuid: rename uuid...
61
  EXPORT_SYMBOL_GPL(guid_gen);
fab1c2324   Huang Ying   Unified UUID/GUID...
62

f9727a17d   Christoph Hellwig   uuid: rename uuid...
63
  void uuid_gen(uuid_t *bu)
fab1c2324   Huang Ying   Unified UUID/GUID...
64
65
66
67
68
  {
  	__uuid_gen_common(bu->b);
  	/* version 4 : random generation */
  	bu->b[6] = (bu->b[6] & 0x0F) | 0x40;
  }
f9727a17d   Christoph Hellwig   uuid: rename uuid...
69
  EXPORT_SYMBOL_GPL(uuid_gen);
2b1b0d667   Andy Shevchenko   lib/uuid.c: intro...
70
71
  
  /**
d063623b6   Randy Dunlap   Documentation: ad...
72
73
74
75
76
77
78
79
80
81
82
   * uuid_is_valid - checks if a UUID string is valid
   * @uuid:	UUID string to check
   *
   * Description:
   * It checks if the UUID string is following the format:
   *	xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx
   *
   * where x is a hex digit.
   *
   * Return: true if input is valid UUID string.
   */
2b1b0d667   Andy Shevchenko   lib/uuid.c: intro...
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
  bool uuid_is_valid(const char *uuid)
  {
  	unsigned int i;
  
  	for (i = 0; i < UUID_STRING_LEN; i++) {
  		if (i == 8 || i == 13 || i == 18 || i == 23) {
  			if (uuid[i] != '-')
  				return false;
  		} else if (!isxdigit(uuid[i])) {
  			return false;
  		}
  	}
  
  	return true;
  }
  EXPORT_SYMBOL(uuid_is_valid);
f9727a17d   Christoph Hellwig   uuid: rename uuid...
99
  static int __uuid_parse(const char *uuid, __u8 b[16], const u8 ei[16])
2b1b0d667   Andy Shevchenko   lib/uuid.c: intro...
100
101
102
103
104
105
106
107
  {
  	static const u8 si[16] = {0,2,4,6,9,11,14,16,19,21,24,26,28,30,32,34};
  	unsigned int i;
  
  	if (!uuid_is_valid(uuid))
  		return -EINVAL;
  
  	for (i = 0; i < 16; i++) {
bc9dc9d5e   Bjørn Mork   lib/uuid.c: use c...
108
109
  		int hi = hex_to_bin(uuid[si[i] + 0]);
  		int lo = hex_to_bin(uuid[si[i] + 1]);
2b1b0d667   Andy Shevchenko   lib/uuid.c: intro...
110
111
112
113
114
115
  
  		b[ei[i]] = (hi << 4) | lo;
  	}
  
  	return 0;
  }
f9727a17d   Christoph Hellwig   uuid: rename uuid...
116
  int guid_parse(const char *uuid, guid_t *u)
2b1b0d667   Andy Shevchenko   lib/uuid.c: intro...
117
  {
f9727a17d   Christoph Hellwig   uuid: rename uuid...
118
  	return __uuid_parse(uuid, u->b, guid_index);
2b1b0d667   Andy Shevchenko   lib/uuid.c: intro...
119
  }
f9727a17d   Christoph Hellwig   uuid: rename uuid...
120
  EXPORT_SYMBOL(guid_parse);
2b1b0d667   Andy Shevchenko   lib/uuid.c: intro...
121

f9727a17d   Christoph Hellwig   uuid: rename uuid...
122
  int uuid_parse(const char *uuid, uuid_t *u)
2b1b0d667   Andy Shevchenko   lib/uuid.c: intro...
123
  {
f9727a17d   Christoph Hellwig   uuid: rename uuid...
124
  	return __uuid_parse(uuid, u->b, uuid_index);
2b1b0d667   Andy Shevchenko   lib/uuid.c: intro...
125
  }
f9727a17d   Christoph Hellwig   uuid: rename uuid...
126
  EXPORT_SYMBOL(uuid_parse);