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