blob: ac81265b68ce7b28279aa4a2cd3b16d24d7582e4 [file] [log] [blame]
// Copyright (c) 2012 The Chromium Authors. All rights reserved.
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.
// Dial requires some system information exposed to the world, for example
// the device name, etc. This class lets it be configurable, but throw default
// values from implementation.
#include "net/dial/dial_system_config.h"
#include <openssl/evp.h>
#include "base/logging.h"
#include "net/base/ip_endpoint.h"
#include "net/base/net_util.h"
namespace net {
namespace {
const char* kSecret = "v=8FpigqfcvlM";
char s_dial_uuid[23] = {};
} // namespace
DialSystemConfig* DialSystemConfig::GetInstance() {
return Singleton<DialSystemConfig>::get();
}
DialSystemConfig::DialSystemConfig()
: friendly_name_(GetFriendlyName()),
manufacturer_name_(GetManufacturerName()),
model_name_(GetModelName()) {}
const char* DialSystemConfig::model_uuid() const {
base::AutoLock lock(lock_);
if (!strlen(s_dial_uuid)) {
CreateDialUuid();
}
return s_dial_uuid;
}
// static
void DialSystemConfig::CreateDialUuid() {
unsigned char md_value[EVP_MAX_MD_SIZE];
unsigned int md_len;
std::string platform_uuid = GeneratePlatformUuid();
DCHECK_NE(0, platform_uuid.size());
EVP_MD_CTX* mdctx;
mdctx = EVP_MD_CTX_create();
EVP_DigestInit_ex(mdctx, EVP_sha1(), NULL);
EVP_DigestUpdate(mdctx, kSecret, strlen(kSecret));
EVP_DigestUpdate(mdctx, platform_uuid.data(), platform_uuid.size());
EVP_DigestFinal_ex(mdctx, md_value, &md_len);
EVP_MD_CTX_destroy(mdctx);
// Now format the uuid as xxxxxxxx-yyyy-zzzzzzzz.
// SHA-1 has a digest of 160 bits = 20bytes.
// For full representation we need 40 hex chars, but we reduce
// it down to 20 hex chars and then print it out.
DCHECK_EQ(20, md_len);
for (unsigned int i = 0; i < md_len / 2; ++i) {
md_value[i] ^= md_value[i + md_len / 2];
}
snprintf(s_dial_uuid, sizeof(s_dial_uuid),
"%02x%02x%02x%02x-%02x%02x-%02x%02x%02x%02x",
md_value[0], md_value[1], md_value[2], md_value[3], md_value[4],
md_value[5], md_value[6], md_value[7], md_value[8], md_value[9]);
DCHECK_EQ(22, strlen(s_dial_uuid));
}
} // namespace net