1e11938eaSJason Hobbs /* 2e11938eaSJason Hobbs * Copyright 2011 Calxeda, Inc. 3e11938eaSJason Hobbs * 4*1a459660SWolfgang Denk * SPDX-License-Identifier: GPL-2.0+ 5e11938eaSJason Hobbs */ 6e11938eaSJason Hobbs 7e11938eaSJason Hobbs #include <linux/ctype.h> 8e11938eaSJason Hobbs #include "common.h" 9e11938eaSJason Hobbs 10e11938eaSJason Hobbs /* 11e11938eaSJason Hobbs * This is what a UUID string looks like. 12e11938eaSJason Hobbs * 13e11938eaSJason Hobbs * x is a hexadecimal character. fields are separated by '-'s. When converting 14e11938eaSJason Hobbs * to a binary UUID, le means the field should be converted to little endian, 15e11938eaSJason Hobbs * and be means it should be converted to big endian. 16e11938eaSJason Hobbs * 17e11938eaSJason Hobbs * 0 9 14 19 24 18e11938eaSJason Hobbs * xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx 19e11938eaSJason Hobbs * le le le be be 20e11938eaSJason Hobbs */ 21e11938eaSJason Hobbs 22e11938eaSJason Hobbs int uuid_str_valid(const char *uuid) 23e11938eaSJason Hobbs { 24e11938eaSJason Hobbs int i, valid; 25e11938eaSJason Hobbs 26e11938eaSJason Hobbs if (uuid == NULL) 27e11938eaSJason Hobbs return 0; 28e11938eaSJason Hobbs 29e11938eaSJason Hobbs for (i = 0, valid = 1; uuid[i] && valid; i++) { 30e11938eaSJason Hobbs switch (i) { 31e11938eaSJason Hobbs case 8: case 13: case 18: case 23: 32e11938eaSJason Hobbs valid = (uuid[i] == '-'); 33e11938eaSJason Hobbs break; 34e11938eaSJason Hobbs default: 35e11938eaSJason Hobbs valid = isxdigit(uuid[i]); 36e11938eaSJason Hobbs break; 37e11938eaSJason Hobbs } 38e11938eaSJason Hobbs } 39e11938eaSJason Hobbs 40e11938eaSJason Hobbs if (i != 36 || !valid) 41e11938eaSJason Hobbs return 0; 42e11938eaSJason Hobbs 43e11938eaSJason Hobbs return 1; 44e11938eaSJason Hobbs } 45e11938eaSJason Hobbs 46e11938eaSJason Hobbs void uuid_str_to_bin(const char *uuid, unsigned char *out) 47e11938eaSJason Hobbs { 48e11938eaSJason Hobbs uint16_t tmp16; 49e11938eaSJason Hobbs uint32_t tmp32; 50e11938eaSJason Hobbs uint64_t tmp64; 51e11938eaSJason Hobbs 52e11938eaSJason Hobbs if (!uuid || !out) 53e11938eaSJason Hobbs return; 54e11938eaSJason Hobbs 55e11938eaSJason Hobbs tmp32 = cpu_to_le32(simple_strtoul(uuid, NULL, 16)); 56e11938eaSJason Hobbs memcpy(out, &tmp32, 4); 57e11938eaSJason Hobbs 58e11938eaSJason Hobbs tmp16 = cpu_to_le16(simple_strtoul(uuid + 9, NULL, 16)); 59e11938eaSJason Hobbs memcpy(out + 4, &tmp16, 2); 60e11938eaSJason Hobbs 61e11938eaSJason Hobbs tmp16 = cpu_to_le16(simple_strtoul(uuid + 14, NULL, 16)); 62e11938eaSJason Hobbs memcpy(out + 6, &tmp16, 2); 63e11938eaSJason Hobbs 64e11938eaSJason Hobbs tmp16 = cpu_to_be16(simple_strtoul(uuid + 19, NULL, 16)); 65e11938eaSJason Hobbs memcpy(out + 8, &tmp16, 2); 66e11938eaSJason Hobbs 67e11938eaSJason Hobbs tmp64 = cpu_to_be64(simple_strtoull(uuid + 24, NULL, 16)); 68e11938eaSJason Hobbs memcpy(out + 10, (char *)&tmp64 + 2, 6); 69e11938eaSJason Hobbs } 70