| 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..51f7af5a6823c00d8db11638b5ac6c160a3a627a
|
| --- /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/hmac.h"
|
| +#include "crypto/sha2.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";
|
| + }
|
| + 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";
|
| + 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
|
|
|