2019-05-27 09:55:21 +03:00
// SPDX-License-Identifier: GPL-2.0-only
2010-05-18 10:35:18 +04:00
/*
* Unified UUID / GUID definition
*
2016-05-21 03:01:07 +03:00
* Copyright ( C ) 2009 , 2016 Intel Corp .
2010-05-18 10:35:18 +04:00
* Huang Ying < ying . huang @ intel . com >
*/
# include <linux/kernel.h>
2016-05-21 03:01:04 +03:00
# include <linux/ctype.h>
# include <linux/errno.h>
2011-11-17 06:29:17 +04:00
# include <linux/export.h>
2010-05-18 10:35:18 +04:00
# include <linux/uuid.h>
# include <linux/random.h>
2017-05-11 10:01:42 +03:00
const guid_t guid_null ;
EXPORT_SYMBOL ( guid_null ) ;
const uuid_t uuid_null ;
EXPORT_SYMBOL ( uuid_null ) ;
2017-05-17 11:02:48 +03:00
const u8 guid_index [ 16 ] = { 3 , 2 , 1 , 0 , 5 , 4 , 7 , 6 , 8 , 9 , 10 , 11 , 12 , 13 , 14 , 15 } ;
const u8 uuid_index [ 16 ] = { 0 , 1 , 2 , 3 , 4 , 5 , 6 , 7 , 8 , 9 , 10 , 11 , 12 , 13 , 14 , 15 } ;
2016-05-21 03:01:04 +03:00
2017-11-29 23:32:42 +03:00
/**
* generate_random_uuid - generate a random UUID
* @ uuid : where to put the generated UUID
*
2016-05-21 03:01:00 +03:00
* Random UUID interface
*
2017-11-29 23:32:42 +03:00
* Used to create a Boot ID or a filesystem UUID / GUID , but can be
* useful for other kernel drivers .
2016-05-21 03:01:00 +03:00
*/
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 ) ;
2020-02-24 18:37:50 +03:00
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 ) ;
2010-05-18 10:35:18 +04:00
static void __uuid_gen_common ( __u8 b [ 16 ] )
{
2013-04-30 03:21:25 +04:00
prandom_bytes ( b , 16 ) ;
2010-05-18 10:35:18 +04:00
/* reversion 0b10 */
b [ 8 ] = ( b [ 8 ] & 0x3F ) | 0x80 ;
}
2017-05-17 11:02:48 +03:00
void guid_gen ( guid_t * lu )
2010-05-18 10:35:18 +04:00
{
__uuid_gen_common ( lu - > b ) ;
/* version 4 : random generation */
lu - > b [ 7 ] = ( lu - > b [ 7 ] & 0x0F ) | 0x40 ;
}
2017-05-17 11:02:48 +03:00
EXPORT_SYMBOL_GPL ( guid_gen ) ;
2010-05-18 10:35:18 +04:00
2017-05-17 11:02:48 +03:00
void uuid_gen ( uuid_t * bu )
2010-05-18 10:35:18 +04:00
{
__uuid_gen_common ( bu - > b ) ;
/* version 4 : random generation */
bu - > b [ 6 ] = ( bu - > b [ 6 ] & 0x0F ) | 0x40 ;
}
2017-05-17 11:02:48 +03:00
EXPORT_SYMBOL_GPL ( uuid_gen ) ;
2016-05-21 03:01:04 +03:00
/**
2017-11-29 23:32:42 +03:00
* 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 .
*/
2016-05-21 03:01:04 +03:00
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 ) ;
2017-05-17 11:02:48 +03:00
static int __uuid_parse ( const char * uuid , __u8 b [ 16 ] , const u8 ei [ 16 ] )
2016-05-21 03:01:04 +03:00
{
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 + + ) {
2016-05-30 17:40:42 +03:00
int hi = hex_to_bin ( uuid [ si [ i ] + 0 ] ) ;
int lo = hex_to_bin ( uuid [ si [ i ] + 1 ] ) ;
2016-05-21 03:01:04 +03:00
b [ ei [ i ] ] = ( hi < < 4 ) | lo ;
}
return 0 ;
}
2017-05-17 11:02:48 +03:00
int guid_parse ( const char * uuid , guid_t * u )
2016-05-21 03:01:04 +03:00
{
2017-05-17 11:02:48 +03:00
return __uuid_parse ( uuid , u - > b , guid_index ) ;
2016-05-21 03:01:04 +03:00
}
2017-05-17 11:02:48 +03:00
EXPORT_SYMBOL ( guid_parse ) ;
2016-05-21 03:01:04 +03:00
2017-05-17 11:02:48 +03:00
int uuid_parse ( const char * uuid , uuid_t * u )
2016-05-21 03:01:04 +03:00
{
2017-05-17 11:02:48 +03:00
return __uuid_parse ( uuid , u - > b , uuid_index ) ;
2016-05-21 03:01:04 +03:00
}
2017-05-17 11:02:48 +03:00
EXPORT_SYMBOL ( uuid_parse ) ;