/****************************************************************************** * * Copyright 2018 Google, Inc. * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at: * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. * ******************************************************************************/ #pragma once #include #include #include #include "raw_address.h" namespace bluetooth { namespace common { class AddressObfuscator { public: static constexpr unsigned int kOctet32Length = 32; using Octet32 = std::array; static AddressObfuscator* GetInstance() { static auto instance = new AddressObfuscator(); return instance; } /** * Return true if the input salt is valid * Criteria: * - Salt must be non-zero * * @param salt_256bit * @return true if the salt is valid */ static bool IsSaltValid(const Octet32& salt_256bit); /** * Initialize this obfuscator with necessary parameters * * @param salt_256bit a 256 bit salt used to hash the fixed length address */ void Initialize(const Octet32& salt_256bit); /** * Return true if Initialize() was called earlier */ bool IsInitialized(); /** * Obfuscate Bluetooth MAC address into an anonymous ID string * * @param address Bluetooth MAC address to be obfuscated * @return the obfuscated MAC address in 256 bit */ std::string Obfuscate(const RawAddress& address); private: AddressObfuscator() : salt_256bit_({0}) {} Octet32 salt_256bit_; std::recursive_mutex instance_mutex_; }; } // namespace common } // namespace bluetooth