1ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch// Copyright 2014 The Chromium Authors. All rights reserved. 2ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch// Use of this source code is governed by a BSD-style license that can be 3ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch// found in the LICENSE file. 4ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch 5ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch#include "chrome/browser/extensions/api/networking_private/networking_private_credentials_getter.h" 6ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch 758537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)#include <Security/Security.h> 85d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 9ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch#include "base/base64.h" 105d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)#include "base/bind.h" 115d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)#include "chrome/common/extensions/api/networking_private/networking_private_crypto.h" 12ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch#include "content/public/browser/browser_thread.h" 13ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch 14ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdochconst char kErrorEncryption[] = "Error.Encryption"; 15ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch 1623730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles)using content::BrowserThread; 17ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch 1858537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)namespace extensions { 19d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles) 2058537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)class NetworkingPrivateCredentialsGetterMac 21ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch : public NetworkingPrivateCredentialsGetter { 2258537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) public: 2358537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) explicit NetworkingPrivateCredentialsGetterMac(); 2458537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) 2558537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) virtual void Start( 265d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) const std::string& network_guid, 275d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) const std::string& public_key, 2858537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) const extensions::NetworkingPrivateServiceClient::CryptoVerify:: 2958537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) VerifyAndEncryptCredentialsCallback& callback) OVERRIDE; 3058537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) 3158537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) private: 3258537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) virtual ~NetworkingPrivateCredentialsGetterMac(); 3358537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) 3458537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) DISALLOW_COPY_AND_ASSIGN(NetworkingPrivateCredentialsGetterMac); 3558537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)}; 3658537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) 3758537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)NetworkingPrivateCredentialsGetterMac::NetworkingPrivateCredentialsGetterMac() { 3858537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)} 3958537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) 4058537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)NetworkingPrivateCredentialsGetterMac:: 4158537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) ~NetworkingPrivateCredentialsGetterMac() {} 4258537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) 4358537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)void NetworkingPrivateCredentialsGetterMac::Start( 4458537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) const std::string& network_guid, 4558537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) const std::string& public_key, 4658537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) const extensions::NetworkingPrivateServiceClient::CryptoVerify:: 4758537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) VerifyAndEncryptCredentialsCallback& callback) { 4858537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) scoped_ptr<wifi::WiFiService> wifi_service(wifi::WiFiService::Create()); 4958537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) wifi_service->Initialize(NULL); 5058537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) std::string key_data; 5158537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) std::string error; 5258537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) wifi_service->GetKeyFromSystem(network_guid, &key_data, &error); 5358537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) 54ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch if (!error.empty()) { 555d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) callback.Run("", error); 565d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) return; 5723730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles) } 5823730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles) 5923730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles) std::vector<uint8> public_key_data(public_key.begin(), public_key.end()); 6023730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles) std::vector<uint8> ciphertext; 6123730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles) if (!networking_private_crypto::EncryptByteString( 625d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) public_key_data, key_data, &ciphertext)) { 635d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) callback.Run("", kErrorEncryption); 645d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) return; 6523730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles) } 665d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 675d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) std::string base64_encoded_ciphertext; 68ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch base::Base64Encode(std::string(ciphertext.begin(), ciphertext.end()), 69ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch &base64_encoded_ciphertext); 70ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch callback.Run(base64_encoded_ciphertext, ""); 71ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch} 72ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch 73ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben MurdochNetworkingPrivateCredentialsGetter* 74ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben MurdochNetworkingPrivateCredentialsGetter::Create() { 75ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch return new NetworkingPrivateCredentialsGetterMac(); 7658537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)} 77ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch 78ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch} // namespace extensions 790f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles)