// Copyright 2013 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.

#include "remoting/protocol/pairing_client_authenticator.h"

#include "base/bind.h"
#include "base/logging.h"
#include "remoting/base/constants.h"
#include "remoting/base/rsa_key_pair.h"
#include "remoting/protocol/authentication_method.h"
#include "remoting/protocol/channel_authenticator.h"
#include "remoting/protocol/v2_authenticator.h"
#include "third_party/libjingle/source/talk/xmllite/xmlelement.h"

namespace remoting {
namespace protocol {

PairingClientAuthenticator::PairingClientAuthenticator(
    const std::string& client_id,
    const std::string& paired_secret,
    const FetchSecretCallback& fetch_pin_callback,
    const std::string& authentication_tag)
    : sent_client_id_(false),
      client_id_(client_id),
      paired_secret_(paired_secret),
      fetch_pin_callback_(fetch_pin_callback),
      authentication_tag_(authentication_tag),
      weak_factory_(this) {
  v2_authenticator_ = V2Authenticator::CreateForClient(
      paired_secret_, MESSAGE_READY);
  using_paired_secret_ = true;
}

PairingClientAuthenticator::~PairingClientAuthenticator() {
}

void PairingClientAuthenticator::CreateV2AuthenticatorWithPIN(
    State initial_state,
    const SetAuthenticatorCallback& set_authenticator_callback) {
  SecretFetchedCallback callback = base::Bind(
      &PairingClientAuthenticator::OnPinFetched,
      weak_factory_.GetWeakPtr(), initial_state, set_authenticator_callback);
  fetch_pin_callback_.Run(true, callback);
}

void PairingClientAuthenticator::AddPairingElements(buzz::XmlElement* message) {
  // If the client id and secret have not yet been sent, do so now. Note that
  // in this case the V2Authenticator is being used optimistically to send the
  // first message of the SPAKE exchange since we don't yet know whether or not
  // the host will accept the client id or request that we fall back to the PIN.
  if (!sent_client_id_) {
    buzz::XmlElement* pairing_tag = new buzz::XmlElement(kPairingInfoTag);
    pairing_tag->AddAttr(kClientIdAttribute, client_id_);
    message->AddElement(pairing_tag);
    sent_client_id_ = true;
  }
}

void PairingClientAuthenticator::OnPinFetched(
    State initial_state,
    const SetAuthenticatorCallback& callback,
    const std::string& pin) {
  callback.Run(V2Authenticator::CreateForClient(
      AuthenticationMethod::ApplyHashFunction(
          AuthenticationMethod::HMAC_SHA256,
          authentication_tag_, pin),
      initial_state));
}

}  // namespace protocol
}  // namespace remoting
