uuid.c revision 8642b7fba54727a38f751516bcdc452fb09ef610
10dba73763a04d39faf999dcc5ef12af3c99535a7Andreas Huber/* 20dba73763a04d39faf999dcc5ef12af3c99535a7Andreas Huber * Copyright (C) 2010 The Android Open Source Project 30dba73763a04d39faf999dcc5ef12af3c99535a7Andreas Huber * 40dba73763a04d39faf999dcc5ef12af3c99535a7Andreas Huber * Licensed under the Apache License, Version 2.0 (the "License"); 50dba73763a04d39faf999dcc5ef12af3c99535a7Andreas Huber * you may not use this file except in compliance with the License. 60dba73763a04d39faf999dcc5ef12af3c99535a7Andreas Huber * You may obtain a copy of the License at 70dba73763a04d39faf999dcc5ef12af3c99535a7Andreas Huber * 80dba73763a04d39faf999dcc5ef12af3c99535a7Andreas Huber * http://www.apache.org/licenses/LICENSE-2.0 90dba73763a04d39faf999dcc5ef12af3c99535a7Andreas Huber * 100dba73763a04d39faf999dcc5ef12af3c99535a7Andreas Huber * Unless required by applicable law or agreed to in writing, software 110dba73763a04d39faf999dcc5ef12af3c99535a7Andreas Huber * distributed under the License is distributed on an "AS IS" BASIS, 120dba73763a04d39faf999dcc5ef12af3c99535a7Andreas Huber * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 130dba73763a04d39faf999dcc5ef12af3c99535a7Andreas Huber * See the License for the specific language governing permissions and 140dba73763a04d39faf999dcc5ef12af3c99535a7Andreas Huber * limitations under the License. 150dba73763a04d39faf999dcc5ef12af3c99535a7Andreas Huber */ 160dba73763a04d39faf999dcc5ef12af3c99535a7Andreas Huber 170dba73763a04d39faf999dcc5ef12af3c99535a7Andreas Huber#include <string.h> 180dba73763a04d39faf999dcc5ef12af3c99535a7Andreas Huber#include <arpa/inet.h> 190dba73763a04d39faf999dcc5ef12af3c99535a7Andreas Huber 200dba73763a04d39faf999dcc5ef12af3c99535a7Andreas Huber#include "ext4_utils.h" 210dba73763a04d39faf999dcc5ef12af3c99535a7Andreas Huber#include "sha1.h" 220dba73763a04d39faf999dcc5ef12af3c99535a7Andreas Huber#include "uuid.h" 23f1d5aa162c02a16b7195a43a9bcea4d592600ac4James Dong 240dba73763a04d39faf999dcc5ef12af3c99535a7Andreas Huberstruct uuid { 250dba73763a04d39faf999dcc5ef12af3c99535a7Andreas Huber u32 time_low; 260dba73763a04d39faf999dcc5ef12af3c99535a7Andreas Huber u32 time_mid; 270dba73763a04d39faf999dcc5ef12af3c99535a7Andreas Huber u16 time_hi_and_version; 280dba73763a04d39faf999dcc5ef12af3c99535a7Andreas Huber u8 clk_seq_hi_res; 290dba73763a04d39faf999dcc5ef12af3c99535a7Andreas Huber u8 clk_seq_low; 300dba73763a04d39faf999dcc5ef12af3c99535a7Andreas Huber u16 node0_1; 313bed68cb3d43af40475f56211869c40470c1fb4dJean-Michel Trivi u32 node2_5; 323bed68cb3d43af40475f56211869c40470c1fb4dJean-Michel Trivi}; 333bed68cb3d43af40475f56211869c40470c1fb4dJean-Michel Trivi 340dba73763a04d39faf999dcc5ef12af3c99535a7Andreas Huberstatic void sha1_hash(const char *namespace, const char *name, 350dba73763a04d39faf999dcc5ef12af3c99535a7Andreas Huber unsigned char sha1[SHA1_DIGEST_LENGTH]) 360dba73763a04d39faf999dcc5ef12af3c99535a7Andreas Huber{ 3742d66f25af9cb8089a93c6796876a6bc16e36ceaAndreas Huber SHA1_CTX ctx; 383bed68cb3d43af40475f56211869c40470c1fb4dJean-Michel Trivi SHA1Init(&ctx); 393bed68cb3d43af40475f56211869c40470c1fb4dJean-Michel Trivi SHA1Update(&ctx, (const u8*)namespace, strlen(namespace)); 403bed68cb3d43af40475f56211869c40470c1fb4dJean-Michel Trivi SHA1Update(&ctx, (const u8*)name, strlen(name)); 413bed68cb3d43af40475f56211869c40470c1fb4dJean-Michel Trivi SHA1Final(sha1, &ctx); 4242d66f25af9cb8089a93c6796876a6bc16e36ceaAndreas Huber} 430dba73763a04d39faf999dcc5ef12af3c99535a7Andreas Huber 443bed68cb3d43af40475f56211869c40470c1fb4dJean-Michel Trivivoid generate_uuid(const char *namespace, const char *name, u8 result[16]) 453bed68cb3d43af40475f56211869c40470c1fb4dJean-Michel Trivi{ 463bed68cb3d43af40475f56211869c40470c1fb4dJean-Michel Trivi unsigned char sha1[SHA1_DIGEST_LENGTH]; 470dba73763a04d39faf999dcc5ef12af3c99535a7Andreas Huber struct uuid *uuid = (struct uuid *)result; 480dba73763a04d39faf999dcc5ef12af3c99535a7Andreas Huber 490dba73763a04d39faf999dcc5ef12af3c99535a7Andreas Huber sha1_hash(namespace, name, (unsigned char*)sha1); 500dba73763a04d39faf999dcc5ef12af3c99535a7Andreas Huber memcpy(uuid, sha1, sizeof(struct uuid)); 510dba73763a04d39faf999dcc5ef12af3c99535a7Andreas Huber 520dba73763a04d39faf999dcc5ef12af3c99535a7Andreas Huber uuid->time_low = ntohl(uuid->time_low); 530dba73763a04d39faf999dcc5ef12af3c99535a7Andreas Huber uuid->time_mid = ntohs(uuid->time_mid); 540dba73763a04d39faf999dcc5ef12af3c99535a7Andreas Huber uuid->time_hi_and_version = ntohs(uuid->time_hi_and_version); 550dba73763a04d39faf999dcc5ef12af3c99535a7Andreas Huber uuid->time_hi_and_version &= 0x0FFF; 560dba73763a04d39faf999dcc5ef12af3c99535a7Andreas Huber uuid->time_hi_and_version |= (5 << 12); 570dba73763a04d39faf999dcc5ef12af3c99535a7Andreas Huber uuid->clk_seq_hi_res &= ~(1 << 6); 58f99f049dd228333e3d6f886efe373f8e461ff2daAndreas Huber uuid->clk_seq_hi_res |= 1 << 7; 5942d66f25af9cb8089a93c6796876a6bc16e36ceaAndreas Huber} 60f99f049dd228333e3d6f886efe373f8e461ff2daAndreas Huber