~ [ source navigation ] ~ [ diff markup ] ~ [ identifier search ] ~

TOMOYO Linux Cross Reference
Linux/lib/uuid.c

Version: ~ [ linux-5.6-rc3 ] ~ [ linux-5.5.6 ] ~ [ linux-5.4.22 ] ~ [ linux-5.3.18 ] ~ [ linux-5.2.21 ] ~ [ linux-5.1.21 ] ~ [ linux-5.0.21 ] ~ [ linux-4.20.17 ] ~ [ linux-4.19.106 ] ~ [ linux-4.18.20 ] ~ [ linux-4.17.19 ] ~ [ linux-4.16.18 ] ~ [ linux-4.15.18 ] ~ [ linux-4.14.171 ] ~ [ linux-4.13.16 ] ~ [ linux-4.12.14 ] ~ [ linux-4.11.12 ] ~ [ linux-4.10.17 ] ~ [ linux-4.9.214 ] ~ [ linux-4.8.17 ] ~ [ linux-4.7.10 ] ~ [ linux-4.6.7 ] ~ [ linux-4.5.7 ] ~ [ linux-4.4.214 ] ~ [ linux-4.3.6 ] ~ [ linux-4.2.8 ] ~ [ linux-4.1.52 ] ~ [ linux-4.0.9 ] ~ [ linux-3.19.8 ] ~ [ linux-3.18.140 ] ~ [ linux-3.17.8 ] ~ [ linux-3.16.82 ] ~ [ linux-3.15.10 ] ~ [ linux-3.14.79 ] ~ [ linux-3.13.11 ] ~ [ linux-3.12.74 ] ~ [ linux-3.11.10 ] ~ [ linux-3.10.108 ] ~ [ linux-3.9.11 ] ~ [ linux-3.8.13 ] ~ [ linux-3.7.10 ] ~ [ linux-3.6.11 ] ~ [ linux-3.5.7 ] ~ [ linux-3.4.113 ] ~ [ linux-3.3.8 ] ~ [ linux-3.2.102 ] ~ [ linux-3.1.10 ] ~ [ linux-3.0.101 ] ~ [ linux-2.6.32.71 ] ~ [ linux-2.6.0 ] ~ [ linux-2.4.37.11 ] ~ [ unix-v6-master ] ~ [ ccs-tools-1.8.5 ] ~ [ policy-sample ] ~
Architecture: ~ [ i386 ] ~ [ alpha ] ~ [ m68k ] ~ [ mips ] ~ [ ppc ] ~ [ sparc ] ~ [ sparc64 ] ~

  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 
 24 const guid_t guid_null;
 25 EXPORT_SYMBOL(guid_null);
 26 const uuid_t uuid_null;
 27 EXPORT_SYMBOL(uuid_null);
 28 
 29 const u8 guid_index[16] = {3,2,1,0,5,4,7,6,8,9,10,11,12,13,14,15};
 30 const 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  */
 41 void 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 }
 49 EXPORT_SYMBOL(generate_random_uuid);
 50 
 51 static 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 
 58 void 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 }
 64 EXPORT_SYMBOL_GPL(guid_gen);
 65 
 66 void 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 }
 72 EXPORT_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  */
 86 bool 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 }
101 EXPORT_SYMBOL(uuid_is_valid);
102 
103 static 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 
121 int guid_parse(const char *uuid, guid_t *u)
122 {
123         return __uuid_parse(uuid, u->b, guid_index);
124 }
125 EXPORT_SYMBOL(guid_parse);
126 
127 int uuid_parse(const char *uuid, uuid_t *u)
128 {
129         return __uuid_parse(uuid, u->b, uuid_index);
130 }
131 EXPORT_SYMBOL(uuid_parse);
132 

~ [ source navigation ] ~ [ diff markup ] ~ [ identifier search ] ~

kernel.org | git.kernel.org | LWN.net | Project Home | Wiki (Japanese) | Wiki (English) | SVN repository | Mail admin

Linux® is a registered trademark of Linus Torvalds in the United States and other countries.
TOMOYO® is a registered trademark of NTT DATA CORPORATION.

osdn.jp