Chromium Code Reviews| Index: remoting/protocol/auth_util.cc |
| diff --git a/remoting/protocol/auth_util.cc b/remoting/protocol/auth_util.cc |
| new file mode 100644 |
| index 0000000000000000000000000000000000000000..1daa6007da7fc50c155be43dbaac9d98bf0a63c5 |
| --- /dev/null |
| +++ b/remoting/protocol/auth_util.cc |
| @@ -0,0 +1,60 @@ |
| +// 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/auth_util.h" |
| + |
| +#include "base/base64.h" |
| +#include "base/logging.h" |
| +#include "base/string_util.h" |
| +#include "crypto/sha2.h" |
|
Wez
2011/11/22 22:29:48
This should come after crypto/hmac.h
Sergey Ulanov
2011/11/23 01:23:42
Done.
|
| +#include "crypto/hmac.h" |
| + |
| +namespace remoting { |
| +namespace protocol { |
| + |
| +const char kClientAuthSslExporterLabel[] = |
| + "EXPORTER-remoting-channel-auth-client"; |
| + |
| +const char kSslFakeHostName[] = "chromoting"; |
| + |
| +std::string GenerateSupportAuthToken(const std::string& jid, |
| + const std::string& access_code) { |
| + std::string sha256 = crypto::SHA256HashString(jid + " " + access_code); |
| + std::string sha256_base64; |
| + if (!base::Base64Encode(sha256, &sha256_base64)) { |
| + LOG(FATAL) << "Failed to encode auth token"; |
|
Wez
2011/11/22 22:29:48
Out of interest, how on earth can that ever fail??
Sergey Ulanov
2011/11/23 01:23:42
It should not, that's why we have LOG(FATAL) here,
|
| + } |
| + return sha256_base64; |
| +} |
| + |
| +bool VerifySupportAuthToken(const std::string& jid, |
| + const std::string& access_code, |
| + const std::string& auth_token) { |
| + std::string expected_token = |
| + GenerateSupportAuthToken(jid, access_code); |
| + return expected_token == auth_token; |
| +} |
| + |
| +// static |
| +bool GetAuthBytes(const std::string& shared_secret, |
| + const std::string& key_material, |
| + std::string* auth_bytes) { |
| + // Generate auth digest based on the keying material and shared secret. |
| + crypto::HMAC response(crypto::HMAC::SHA256); |
| + if (!response.Init(key_material)) { |
| + NOTREACHED() << "HMAC::Init failed"; |
|
Wez
2011/11/22 22:29:48
Would it be cleaner to get rid of the return code
Sergey Ulanov
2011/11/23 01:23:42
This method may fail, for example, if key_material
|
| + return false; |
| + } |
| + unsigned char out_bytes[kAuthDigestLength]; |
| + if (!response.Sign(shared_secret, out_bytes, kAuthDigestLength)) { |
| + NOTREACHED() << "HMAC::Sign failed"; |
| + return false; |
| + } |
| + |
| + auth_bytes->assign(out_bytes, out_bytes + kAuthDigestLength); |
| + return true; |
| +} |
| + |
| +} // namespace protocol |
| +} // namespace remoting |