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
52a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "chrome/browser/local_discovery/privetv3_crypto_provider.h"
62a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
768043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)#include "base/logging.h"
82a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
92a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)namespace local_discovery {
102a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
112a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)namespace {
122a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
132a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// A stub session type used for development/debugging.
1468043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)const char kAuthMethodEmpty[] = "empty";
152a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
162a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)const char kHandshakeStateComplete[] = "complete";
1768043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)const char kStubVerificationCode[] = "SAMPLE";
1868043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)}
1968043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)
202a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)class PrivetV3CryptoProviderEmpty : public PrivetV3CryptoProvider {
212a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) public:
225d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  PrivetV3CryptoProviderEmpty();
2368043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)  virtual ~PrivetV3CryptoProviderEmpty();
243551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)
2568043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)  // PrivetV3CryptoProvider implementation.
262a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  virtual HandshakeState GetState() OVERRIDE;
275d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  virtual std::string GetAuthMethod() OVERRIDE;
2868043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)  virtual HandshakeState GetNextStep(int* step, std::string* package) OVERRIDE;
293551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)  virtual HandshakeState SetStepResponse(int step,
303551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)                                         const std::string& state,
313551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)                                         const std::string& package) OVERRIDE;
3268043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)  virtual std::string GetVerificationCode() OVERRIDE;
333551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)  virtual HandshakeState AcceptVerificationCode() OVERRIDE;
345d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  virtual bool EncryptData(const std::string& input,
3568043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)                           std::string* output) OVERRIDE;
362a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
372a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) private:
382a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  HandshakeState state_;
392a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)};
402a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
412a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)scoped_ptr<PrivetV3CryptoProvider> Create(
422a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    const std::vector<std::string>& available_auth_methods) {
432a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  for (size_t i = 0; i < available_auth_methods.size(); i++) {
442a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    if (available_auth_methods[i] == kAuthMethodEmpty) {
452a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      return scoped_ptr<PrivetV3CryptoProvider>(
462a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)          new PrivetV3CryptoProviderEmpty());
472a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    }
482a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  }
492a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
5068043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)  return scoped_ptr<PrivetV3CryptoProvider>();
512a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}
525d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)
5368043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)PrivetV3CryptoProviderEmpty::PrivetV3CryptoProviderEmpty()
542a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    : state_(IN_PROGRESS) {
552a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}
562a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
572a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)PrivetV3CryptoProviderEmpty::~PrivetV3CryptoProviderEmpty() {
582a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}
59868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)
60868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)PrivetV3CryptoProvider::HandshakeState PrivetV3CryptoProviderEmpty::GetState() {
61c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  return state_;
62c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)}
635d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)
645d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)std::string PrivetV3CryptoProviderEmpty::GetAuthMethod() {
6568043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)  return kAuthMethodEmpty;
662a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}
675d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)
6868043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)PrivetV3CryptoProvider::HandshakeState PrivetV3CryptoProviderEmpty::GetNextStep(
69c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    int* step,
70cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)    std::string* package) {
712a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  DCHECK(state_ == IN_PROGRESS);
722a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  *step = 0;
732a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  package->clear();
742a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  state_ = AWAITING_RESPONSE;
7568043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)
7668043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)  return state_;
775d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)}
7868043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)
7968043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)PrivetV3CryptoProvider::HandshakeState
8068043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)PrivetV3CryptoProviderEmpty::SetStepResponse(int step,
8168043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)                                             const std::string& state,
8268043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)                                             const std::string& package) {
8368043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)  DCHECK(state_ == AWAITING_RESPONSE);
8468043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)
8568043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)  bool success =
8668043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)      (step == 0 && package.empty() && state == kHandshakeStateComplete);
8768043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)
8868043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)  if (success) {
8968043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)    state_ = AWAITING_USER_VERIFICATION;
905d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  } else {
9168043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)    state_ = HANDSHAKE_ERROR;
9268043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)  }
933551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)
9468043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)  return state_;
952a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}
965d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)
975d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)std::string PrivetV3CryptoProviderEmpty::GetVerificationCode() {
985d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  DCHECK(state_ == AWAITING_USER_VERIFICATION);
995d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  return kStubVerificationCode;
1005d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)}
1015d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)
1025d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)PrivetV3CryptoProvider::HandshakeState
1035d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)PrivetV3CryptoProviderEmpty::AcceptVerificationCode() {
1045d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  DCHECK(state_ == AWAITING_USER_VERIFICATION);
1055d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  return (state_ = HANDSHAKE_COMPLETE);
1065d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)}
1075d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)
1085d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)bool PrivetV3CryptoProviderEmpty::EncryptData(const std::string& input,
1095d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)                                              std::string* output) {
1105d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  *output = input;
1115d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  return true;
1125d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)}
1135d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)
1145d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)}  // namespace local_discovery
1150529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch