OLD | NEW |
1 // Copyright (c) 2012 The Chromium Authors. All rights reserved. | 1 // Copyright (c) 2012 The Chromium Authors. All rights reserved. |
2 // Use of this source code is governed by a BSD-style license that can be | 2 // Use of this source code is governed by a BSD-style license that can be |
3 // found in the LICENSE file. | 3 // found in the LICENSE file. |
4 | 4 |
5 #include "remoting/protocol/negotiating_authenticator.h" | 5 #include "remoting/protocol/negotiating_authenticator.h" |
6 | 6 |
7 #include <algorithm> | 7 #include <algorithm> |
8 #include <sstream> | 8 #include <sstream> |
9 | 9 |
10 #include "base/bind.h" | 10 #include "base/bind.h" |
(...skipping 31 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
42 DCHECK(!methods.empty()); | 42 DCHECK(!methods.empty()); |
43 for (std::vector<AuthenticationMethod>::const_iterator it = methods.begin(); | 43 for (std::vector<AuthenticationMethod>::const_iterator it = methods.begin(); |
44 it != methods.end(); ++it) { | 44 it != methods.end(); ++it) { |
45 result->AddMethod(*it); | 45 result->AddMethod(*it); |
46 } | 46 } |
47 | 47 |
48 return scoped_ptr<Authenticator>(result.Pass()); | 48 return scoped_ptr<Authenticator>(result.Pass()); |
49 } | 49 } |
50 | 50 |
51 // static | 51 // static |
52 scoped_ptr<Authenticator> NegotiatingAuthenticator::CreateForHost( | 52 scoped_ptr<Authenticator> NegotiatingAuthenticator::CreateForHostSharedSecret( |
53 const std::string& local_cert, | 53 const std::string& local_cert, |
54 scoped_refptr<RsaKeyPair> key_pair, | 54 scoped_refptr<RsaKeyPair> key_pair, |
55 const std::string& shared_secret_hash, | 55 const std::string& shared_secret_hash, |
56 AuthenticationMethod::HashFunction hash_function) { | 56 AuthenticationMethod::HashFunction hash_function) { |
57 scoped_ptr<NegotiatingAuthenticator> result( | 57 scoped_ptr<NegotiatingAuthenticator> result( |
58 new NegotiatingAuthenticator(WAITING_MESSAGE)); | 58 new NegotiatingAuthenticator(WAITING_MESSAGE)); |
59 result->local_cert_ = local_cert; | 59 result->local_cert_ = local_cert; |
60 result->local_key_pair_ = key_pair; | 60 result->local_key_pair_ = key_pair; |
61 result->shared_secret_hash_ = shared_secret_hash; | 61 result->shared_secret_hash_ = shared_secret_hash; |
| 62 result->AddMethod(AuthenticationMethod::Spake2(hash_function)); |
62 | 63 |
63 result->AddMethod(AuthenticationMethod::Spake2(hash_function)); | 64 return scoped_ptr<Authenticator>(result.Pass()); |
| 65 } |
| 66 |
| 67 // static |
| 68 scoped_ptr<Authenticator> NegotiatingAuthenticator::CreateForHostThirdParty( |
| 69 const std::string& local_cert, |
| 70 scoped_refptr<RsaKeyPair> key_pair, |
| 71 const std::string& local_jid, |
| 72 const std::string& remote_jid, |
| 73 scoped_refptr<ThirdPartyHostAuthenticator::TokenValidatorFactory> |
| 74 token_validator_factory) { |
| 75 scoped_ptr<NegotiatingAuthenticator> result( |
| 76 new NegotiatingAuthenticator(WAITING_MESSAGE)); |
| 77 result->local_jid_ = local_jid; |
| 78 result->remote_jid_ = remote_jid; |
| 79 result->local_cert_ = local_cert; |
| 80 result->local_key_pair_ = key_pair; |
| 81 result->AddMethod(AuthenticationMethod::ThirdParty()); |
64 | 82 |
65 return scoped_ptr<Authenticator>(result.Pass()); | 83 return scoped_ptr<Authenticator>(result.Pass()); |
66 } | 84 } |
67 | 85 |
68 NegotiatingAuthenticator::NegotiatingAuthenticator( | 86 NegotiatingAuthenticator::NegotiatingAuthenticator( |
69 Authenticator::State initial_state) | 87 Authenticator::State initial_state) |
70 : current_method_(AuthenticationMethod::Invalid()), | 88 : current_method_(AuthenticationMethod::Invalid()), |
71 state_(initial_state), | 89 state_(initial_state), |
72 rejection_reason_(INVALID_CREDENTIALS), | 90 rejection_reason_(INVALID_CREDENTIALS), |
73 weak_factory_(ALLOW_THIS_IN_INITIALIZER_LIST(this)) { | 91 weak_factory_(ALLOW_THIS_IN_INITIALIZER_LIST(this)) { |
(...skipping 140 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
214 return current_authenticator_->CreateChannelAuthenticator(); | 232 return current_authenticator_->CreateChannelAuthenticator(); |
215 } | 233 } |
216 | 234 |
217 bool NegotiatingAuthenticator::is_host_side() const { | 235 bool NegotiatingAuthenticator::is_host_side() const { |
218 return local_key_pair_.get() != NULL; | 236 return local_key_pair_.get() != NULL; |
219 } | 237 } |
220 | 238 |
221 void NegotiatingAuthenticator::CreateAuthenticator( | 239 void NegotiatingAuthenticator::CreateAuthenticator( |
222 Authenticator::State preferred_initial_state, | 240 Authenticator::State preferred_initial_state, |
223 const base::Closure& resume_callback) { | 241 const base::Closure& resume_callback) { |
| 242 DCHECK(current_method_.is_valid()); |
224 if (is_host_side()) { | 243 if (is_host_side()) { |
225 current_authenticator_ = V2Authenticator::CreateForHost( | 244 if (current_method_.type() == AuthenticationMethod::THIRD_PARTY) { |
226 local_cert_, local_key_pair_, shared_secret_hash_, | 245 current_authenticator_.reset(new ThirdPartyHostAuthenticator( |
227 preferred_initial_state); | 246 local_cert_, local_key_pair_, |
| 247 token_validator_factory_->CreateTokenValidator( |
| 248 local_jid_, remote_jid_))); |
| 249 } else { |
| 250 DCHECK_EQ(current_method_.type(), AuthenticationMethod::SPAKE2); |
| 251 current_authenticator_ = V2Authenticator::CreateForHost( |
| 252 local_cert_, local_key_pair_, shared_secret_hash_, |
| 253 preferred_initial_state); |
| 254 } |
228 resume_callback.Run(); | 255 resume_callback.Run(); |
229 } else { | 256 } else { |
230 fetch_secret_callback_.Run(base::Bind( | 257 fetch_secret_callback_.Run(base::Bind( |
231 &NegotiatingAuthenticator::CreateV2AuthenticatorWithSecret, | 258 &NegotiatingAuthenticator::CreateV2AuthenticatorWithSecret, |
232 weak_factory_.GetWeakPtr(), preferred_initial_state, resume_callback)); | 259 weak_factory_.GetWeakPtr(), preferred_initial_state, resume_callback)); |
233 } | 260 } |
234 } | 261 } |
235 | 262 |
236 void NegotiatingAuthenticator::ProcessMessageInternal( | 263 void NegotiatingAuthenticator::ProcessMessageInternal( |
237 const buzz::XmlElement* message, | 264 const buzz::XmlElement* message, |
(...skipping 14 matching lines...) Expand all Loading... |
252 const std::string& shared_secret) { | 279 const std::string& shared_secret) { |
253 current_authenticator_ = V2Authenticator::CreateForClient( | 280 current_authenticator_ = V2Authenticator::CreateForClient( |
254 AuthenticationMethod::ApplyHashFunction( | 281 AuthenticationMethod::ApplyHashFunction( |
255 current_method_.hash_function(), authentication_tag_, shared_secret), | 282 current_method_.hash_function(), authentication_tag_, shared_secret), |
256 initial_state); | 283 initial_state); |
257 resume_callback.Run(); | 284 resume_callback.Run(); |
258 } | 285 } |
259 | 286 |
260 } // namespace protocol | 287 } // namespace protocol |
261 } // namespace remoting | 288 } // namespace remoting |
OLD | NEW |