1ec0a2e83dc66d67addeb90e83144187691852a3eColin Cross/* 2ec0a2e83dc66d67addeb90e83144187691852a3eColin Cross * Copyright (C) 2010 The Android Open Source Project 3ec0a2e83dc66d67addeb90e83144187691852a3eColin Cross * 4ec0a2e83dc66d67addeb90e83144187691852a3eColin Cross * Licensed under the Apache License, Version 2.0 (the "License"); 5ec0a2e83dc66d67addeb90e83144187691852a3eColin Cross * you may not use this file except in compliance with the License. 6ec0a2e83dc66d67addeb90e83144187691852a3eColin Cross * You may obtain a copy of the License at 7ec0a2e83dc66d67addeb90e83144187691852a3eColin Cross * 8ec0a2e83dc66d67addeb90e83144187691852a3eColin Cross * http://www.apache.org/licenses/LICENSE-2.0 9ec0a2e83dc66d67addeb90e83144187691852a3eColin Cross * 10ec0a2e83dc66d67addeb90e83144187691852a3eColin Cross * Unless required by applicable law or agreed to in writing, software 11ec0a2e83dc66d67addeb90e83144187691852a3eColin Cross * distributed under the License is distributed on an "AS IS" BASIS, 12ec0a2e83dc66d67addeb90e83144187691852a3eColin Cross * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 13ec0a2e83dc66d67addeb90e83144187691852a3eColin Cross * See the License for the specific language governing permissions and 14ec0a2e83dc66d67addeb90e83144187691852a3eColin Cross * limitations under the License. 15ec0a2e83dc66d67addeb90e83144187691852a3eColin Cross */ 16ec0a2e83dc66d67addeb90e83144187691852a3eColin Cross 17ec0a2e83dc66d67addeb90e83144187691852a3eColin Cross#include <string.h> 184605b3fb8a00fa37f617a8d0fe3a095d0503a845Raphael Moll 194605b3fb8a00fa37f617a8d0fe3a095d0503a845Raphael Moll#ifdef USE_MINGW 204605b3fb8a00fa37f617a8d0fe3a095d0503a845Raphael Moll#include <winsock2.h> 214605b3fb8a00fa37f617a8d0fe3a095d0503a845Raphael Moll#else 22ec0a2e83dc66d67addeb90e83144187691852a3eColin Cross#include <arpa/inet.h> 234605b3fb8a00fa37f617a8d0fe3a095d0503a845Raphael Moll#endif 24ec0a2e83dc66d67addeb90e83144187691852a3eColin Cross 25ec0a2e83dc66d67addeb90e83144187691852a3eColin Cross#include "ext4_utils.h" 26ec0a2e83dc66d67addeb90e83144187691852a3eColin Cross#include "sha1.h" 27ec0a2e83dc66d67addeb90e83144187691852a3eColin Cross#include "uuid.h" 28ec0a2e83dc66d67addeb90e83144187691852a3eColin Cross 29107a9f161babc20daf915311146b0e864d3b4157Ken Sumrall/* Definition from RFC-4122 */ 30ec0a2e83dc66d67addeb90e83144187691852a3eColin Crossstruct uuid { 31ec0a2e83dc66d67addeb90e83144187691852a3eColin Cross u32 time_low; 32107a9f161babc20daf915311146b0e864d3b4157Ken Sumrall u16 time_mid; 33ec0a2e83dc66d67addeb90e83144187691852a3eColin Cross u16 time_hi_and_version; 34ec0a2e83dc66d67addeb90e83144187691852a3eColin Cross u8 clk_seq_hi_res; 35ec0a2e83dc66d67addeb90e83144187691852a3eColin Cross u8 clk_seq_low; 36ec0a2e83dc66d67addeb90e83144187691852a3eColin Cross u16 node0_1; 37ec0a2e83dc66d67addeb90e83144187691852a3eColin Cross u32 node2_5; 38ec0a2e83dc66d67addeb90e83144187691852a3eColin Cross}; 39ec0a2e83dc66d67addeb90e83144187691852a3eColin Cross 40ec0a2e83dc66d67addeb90e83144187691852a3eColin Crossstatic void sha1_hash(const char *namespace, const char *name, 418aef66d2125af8de7672a12895276802fcc1948fColin Cross unsigned char sha1[SHA1_DIGEST_LENGTH]) 42ec0a2e83dc66d67addeb90e83144187691852a3eColin Cross{ 43ec0a2e83dc66d67addeb90e83144187691852a3eColin Cross SHA1_CTX ctx; 44ec0a2e83dc66d67addeb90e83144187691852a3eColin Cross SHA1Init(&ctx); 45ec0a2e83dc66d67addeb90e83144187691852a3eColin Cross SHA1Update(&ctx, (const u8*)namespace, strlen(namespace)); 46ec0a2e83dc66d67addeb90e83144187691852a3eColin Cross SHA1Update(&ctx, (const u8*)name, strlen(name)); 47ec0a2e83dc66d67addeb90e83144187691852a3eColin Cross SHA1Final(sha1, &ctx); 48ec0a2e83dc66d67addeb90e83144187691852a3eColin Cross} 49ec0a2e83dc66d67addeb90e83144187691852a3eColin Cross 50ec0a2e83dc66d67addeb90e83144187691852a3eColin Crossvoid generate_uuid(const char *namespace, const char *name, u8 result[16]) 51ec0a2e83dc66d67addeb90e83144187691852a3eColin Cross{ 52ec0a2e83dc66d67addeb90e83144187691852a3eColin Cross unsigned char sha1[SHA1_DIGEST_LENGTH]; 53ec0a2e83dc66d67addeb90e83144187691852a3eColin Cross struct uuid *uuid = (struct uuid *)result; 54ec0a2e83dc66d67addeb90e83144187691852a3eColin Cross 55ec0a2e83dc66d67addeb90e83144187691852a3eColin Cross sha1_hash(namespace, name, (unsigned char*)sha1); 56ec0a2e83dc66d67addeb90e83144187691852a3eColin Cross memcpy(uuid, sha1, sizeof(struct uuid)); 57ec0a2e83dc66d67addeb90e83144187691852a3eColin Cross 58ec0a2e83dc66d67addeb90e83144187691852a3eColin Cross uuid->time_low = ntohl(uuid->time_low); 59ec0a2e83dc66d67addeb90e83144187691852a3eColin Cross uuid->time_mid = ntohs(uuid->time_mid); 60ec0a2e83dc66d67addeb90e83144187691852a3eColin Cross uuid->time_hi_and_version = ntohs(uuid->time_hi_and_version); 61ec0a2e83dc66d67addeb90e83144187691852a3eColin Cross uuid->time_hi_and_version &= 0x0FFF; 62ec0a2e83dc66d67addeb90e83144187691852a3eColin Cross uuid->time_hi_and_version |= (5 << 12); 63ec0a2e83dc66d67addeb90e83144187691852a3eColin Cross uuid->clk_seq_hi_res &= ~(1 << 6); 64ec0a2e83dc66d67addeb90e83144187691852a3eColin Cross uuid->clk_seq_hi_res |= 1 << 7; 65ec0a2e83dc66d67addeb90e83144187691852a3eColin Cross} 66