| // 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 |