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)