diff options
author | sergeyu@chromium.org <sergeyu@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98> | 2011-11-23 05:55:02 +0000 |
---|---|---|
committer | sergeyu@chromium.org <sergeyu@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98> | 2011-11-23 05:55:02 +0000 |
commit | 4aa41f22d029f0d163f30d2b259301c9c479dfc3 (patch) | |
tree | 64856bb49b56b278503893c6161607b69e2d09b4 /remoting/protocol/v1_authenticator.cc | |
parent | 34a43dba701101a39624b488a821666643088e35 (diff) | |
download | chromium_src-4aa41f22d029f0d163f30d2b259301c9c479dfc3.zip chromium_src-4aa41f22d029f0d163f30d2b259301c9c479dfc3.tar.gz chromium_src-4aa41f22d029f0d163f30d2b259301c9c479dfc3.tar.bz2 |
Add implementation for current IT2Me auth.
The new SimpleClientAuthenticator and SimpleHostAuthenticator implement
the current IT2Me authentication mechanism.
Review URL: http://codereview.chromium.org/8647001
git-svn-id: svn://svn.chromium.org/chrome/trunk/src@111321 0039d316-1c4b-4281-b951-d872f2087c98
Diffstat (limited to 'remoting/protocol/v1_authenticator.cc')
-rw-r--r-- | remoting/protocol/v1_authenticator.cc | 174 |
1 files changed, 174 insertions, 0 deletions
diff --git a/remoting/protocol/v1_authenticator.cc b/remoting/protocol/v1_authenticator.cc new file mode 100644 index 0000000..2daf246 --- /dev/null +++ b/remoting/protocol/v1_authenticator.cc @@ -0,0 +1,174 @@ +// Copyright (c) 2011 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/v1_authenticator.h" + +#include "base/base64.h" +#include "base/logging.h" +#include "crypto/rsa_private_key.h" +#include "remoting/base/constants.h" +#include "remoting/protocol/auth_util.h" +#include "remoting/protocol/v1_client_channel_authenticator.h" +#include "remoting/protocol/v1_host_channel_authenticator.h" +#include "third_party/libjingle/source/talk/xmllite/xmlelement.h" + +using buzz::QName; +using buzz::XmlElement; + +namespace remoting { +namespace protocol { + +namespace { +const char kAuthenticationTag[] = "authentication"; +const char kAuthTokenTag[] = "auth-token"; +const char kCertificateTag[] = "certificate"; +} // namespace + +V1ClientAuthenticator::V1ClientAuthenticator( + const std::string& local_jid, + const std::string& shared_secret) + : local_jid_(local_jid), + shared_secret_(shared_secret), + state_(MESSAGE_READY) { +} + +V1ClientAuthenticator::~V1ClientAuthenticator() { +} + +Authenticator::State V1ClientAuthenticator::state() const { + return state_; +} + +void V1ClientAuthenticator::ProcessMessage(const XmlElement* message) { + DCHECK_EQ(state_, WAITING_MESSAGE); + + // Parse the certificate. + const XmlElement* cert_tag = + message->FirstNamed(QName(kChromotingXmlNamespace, kCertificateTag)); + if (cert_tag) { + std::string base64_cert = cert_tag->BodyText(); + if (!base::Base64Decode(base64_cert, &remote_cert_)) { + LOG(ERROR) << "Failed to decode certificate received from the peer."; + remote_cert_.clear(); + } + } + + if (remote_cert_.empty()) { + state_ = REJECTED; + } else { + state_ = ACCEPTED; + } +} + +XmlElement* V1ClientAuthenticator::GetNextMessage() { + DCHECK_EQ(state_, MESSAGE_READY); + + XmlElement* authentication_tag = new XmlElement( + QName(kChromotingXmlNamespace, kAuthenticationTag)); + + std::string token = + protocol::GenerateSupportAuthToken(local_jid_, shared_secret_); + + XmlElement* auth_token_tag = new XmlElement( + QName(kChromotingXmlNamespace, kAuthTokenTag)); + auth_token_tag->SetBodyText(token); + authentication_tag->AddElement(auth_token_tag); + + state_ = WAITING_MESSAGE; + return authentication_tag; +} + +ChannelAuthenticator* +V1ClientAuthenticator::CreateChannelAuthenticator() const { + DCHECK_EQ(state_, ACCEPTED); + return new V1ClientChannelAuthenticator(remote_cert_, shared_secret_); +}; + +V1HostAuthenticator::V1HostAuthenticator( + const std::string& local_cert, + crypto::RSAPrivateKey* local_private_key, + const std::string& shared_secret, + const std::string& remote_jid) + : local_cert_(local_cert), + local_private_key_(local_private_key), + shared_secret_(shared_secret), + remote_jid_(remote_jid), + state_(WAITING_MESSAGE) { +} + +V1HostAuthenticator::~V1HostAuthenticator() { +} + +Authenticator::State V1HostAuthenticator::state() const { + return state_; +} + +void V1HostAuthenticator::ProcessMessage(const XmlElement* message) { + DCHECK_EQ(state_, WAITING_MESSAGE); + + std::string auth_token = + message->TextNamed(buzz::QName(kChromotingXmlNamespace, kAuthTokenTag)); + + if (!protocol::VerifySupportAuthToken( + remote_jid_, shared_secret_, auth_token)) { + state_ = REJECTED; + } else { + state_ = MESSAGE_READY; + } +} + +XmlElement* V1HostAuthenticator::GetNextMessage() { + DCHECK_EQ(state_, MESSAGE_READY); + + XmlElement* message = new XmlElement( + QName(kChromotingXmlNamespace, kAuthenticationTag)); + + buzz::XmlElement* certificate_tag = new XmlElement( + buzz::QName(kChromotingXmlNamespace, kCertificateTag)); + std::string base64_cert; + if (!base::Base64Encode(local_cert_, &base64_cert)) { + LOG(DFATAL) << "Cannot perform base64 encode on certificate"; + } + certificate_tag->SetBodyText(base64_cert); + message->AddElement(certificate_tag); + + state_ = ACCEPTED; + return message; +} + +ChannelAuthenticator* +V1HostAuthenticator::CreateChannelAuthenticator() const { + DCHECK_EQ(state_, ACCEPTED); + return new V1HostChannelAuthenticator( + local_cert_, local_private_key_, shared_secret_); +}; + +V1HostAuthenticatorFactory::V1HostAuthenticatorFactory( + const std::string& local_cert, + crypto::RSAPrivateKey* local_private_key, + const std::string& shared_secret) + : local_cert_(local_cert), + shared_secret_(shared_secret) { + DCHECK(local_private_key); + + // TODO(hclam): Need a better way to clone a key. See crbug.com/105220 . + std::vector<uint8> key_bytes; + CHECK(local_private_key->ExportPrivateKey(&key_bytes)); + local_private_key_.reset( + crypto::RSAPrivateKey::CreateFromPrivateKeyInfo(key_bytes)); + CHECK(local_private_key_.get()); +} + +V1HostAuthenticatorFactory::~V1HostAuthenticatorFactory() { +} + +Authenticator* V1HostAuthenticatorFactory::CreateAuthenticator( + const std::string& remote_jid, + const buzz::XmlElement* first_message) { + return new V1HostAuthenticator(local_cert_, local_private_key_.get(), + shared_secret_, remote_jid); +} + +} // namespace remoting +} // namespace protocol |