15821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Copyright (c) 2012 The Chromium Authors. All rights reserved.
25821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Use of this source code is governed by a BSD-style license that can be
35821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// found in the LICENSE file.
45821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
55821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#ifndef REMOTING_PROTOCOL_V2_AUTHENTICATOR_H_
65821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#define REMOTING_PROTOCOL_V2_AUTHENTICATOR_H_
75821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
85821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include <string>
95821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include <queue>
105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "base/compiler_specific.h"
125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "base/gtest_prod_util.h"
135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "base/memory/scoped_ptr.h"
145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "crypto/p224_spake.h"
155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "remoting/protocol/authenticator.h"
165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)namespace remoting {
182a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
192a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)class RsaKeyPair;
202a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)namespace protocol {
225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)class V2Authenticator : public Authenticator {
245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) public:
255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  static bool IsEkeMessage(const buzz::XmlElement* message);
265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  static scoped_ptr<Authenticator> CreateForClient(
285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      const std::string& shared_secret,
295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      State initial_state);
305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  static scoped_ptr<Authenticator> CreateForHost(
325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      const std::string& local_cert,
332a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      scoped_refptr<RsaKeyPair> key_pair,
345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      const std::string& shared_secret,
355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      State initial_state);
365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  virtual ~V2Authenticator();
385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Authenticator interface.
405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  virtual State state() const OVERRIDE;
41c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch  virtual bool started() const OVERRIDE;
425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  virtual RejectionReason rejection_reason() const OVERRIDE;
432a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  virtual void ProcessMessage(const buzz::XmlElement* message,
442a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                              const base::Closure& resume_callback) OVERRIDE;
455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  virtual scoped_ptr<buzz::XmlElement> GetNextMessage() OVERRIDE;
465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  virtual scoped_ptr<ChannelAuthenticator>
475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      CreateChannelAuthenticator() const OVERRIDE;
485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) private:
505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  FRIEND_TEST_ALL_PREFIXES(V2AuthenticatorTest, InvalidSecret);
515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  V2Authenticator(crypto::P224EncryptedKeyExchange::PeerType type,
535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                  const std::string& shared_secret,
545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                  State initial_state);
555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
562a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  virtual void ProcessMessageInternal(const buzz::XmlElement* message);
572a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  bool is_host_side() const;
595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Used only for host authenticators.
615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  std::string local_cert_;
622a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  scoped_refptr<RsaKeyPair> local_key_pair_;
635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  bool certificate_sent_;
645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Used only for client authenticators.
665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  std::string remote_cert_;
675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Used for both host and client authenticators.
695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  crypto::P224EncryptedKeyExchange key_exchange_impl_;
705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  State state_;
71c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch  bool started_;
725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  RejectionReason rejection_reason_;
735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  std::queue<std::string> pending_messages_;
745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  std::string auth_key_;
755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  DISALLOW_COPY_AND_ASSIGN(V2Authenticator);
775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)};
785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}  // namespace protocol
805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}  // namespace remoting
815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif  // REMOTING_PROTOCOL_V2_AUTHENTICATOR_H_
83