Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(245)

Unified Diff: extensions/browser/api/cast_channel/cast_auth_util.cc

Issue 792353002: Refactoring of Cast-related crypto code (Closed) Base URL: https://chromium.googlesource.com/chromium/src.git@master
Patch Set: Fixed ChromeOS unit tests. Created 6 years ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View side-by-side diff with in-line comments
Download patch
Index: extensions/browser/api/cast_channel/cast_auth_util.cc
diff --git a/extensions/browser/api/cast_channel/cast_auth_util.cc b/extensions/browser/api/cast_channel/cast_auth_util.cc
index 68cb9f321fccacae26cb9724966405155d1c8735..97fff647066b357cf3f8ca4c010df3e1d26dfa78 100644
--- a/extensions/browser/api/cast_channel/cast_auth_util.cc
+++ b/extensions/browser/api/cast_channel/cast_auth_util.cc
@@ -4,11 +4,14 @@
#include "extensions/browser/api/cast_channel/cast_auth_util.h"
+#include <vector>
+
#include "base/logging.h"
#include "base/strings/string_number_conversions.h"
#include "base/strings/stringprintf.h"
#include "extensions/browser/api/cast_channel/cast_message_util.h"
#include "extensions/common/api/cast_channel/cast_channel.pb.h"
+#include "extensions/common/cast/cast_cert_validator.h"
namespace extensions {
namespace core_api {
@@ -17,6 +20,8 @@ namespace {
const char* const kParseErrorPrefix = "Failed to parse auth message: ";
+namespace cast_crypto = ::extensions::core_api::cast_crypto;
+
// Extracts an embedded DeviceAuthMessage payload from an auth challenge reply
// message.
AuthResult ParseAuthMessage(const CastMessage& challenge_reply,
@@ -52,6 +57,27 @@ AuthResult ParseAuthMessage(const CastMessage& challenge_reply,
return AuthResult();
}
+AuthResult TranslateVerificationError(cast_crypto::VerificationResult error) {
mark a. foltz 2014/12/18 00:43:41 Better named TranslateVerificationResult since it'
sheretov 2015/01/03 03:18:02 Done.
+ AuthResult result;
+ result.error_message = error.error_message;
+
+ static AuthResult::ErrorType error_type_map[] = {
mark a. foltz 2014/12/18 00:43:41 We generally use switch statements for this type o
sheretov 2015/01/03 03:18:02 Done.
+ AuthResult::ERROR_NONE,
+ AuthResult::ERROR_CERT_PARSING_FAILED,
+ AuthResult::ERROR_CERT_NOT_SIGNED_BY_TRUSTED_CA,
+ AuthResult::ERROR_SIGNED_BLOBS_MISMATCH,
+ AuthResult::ERROR_UNEXPECTED_AUTH_LIBRARY_RESULT};
+ int idx = static_cast<int>(error.error_type);
+ result.error_type =
+ (idx < 0 || idx > cast_crypto::VerificationResult::ERROR_TYPE_MAX)
+ ? AuthResult::ERROR_UNEXPECTED_AUTH_LIBRARY_RESULT
mark a. foltz 2014/12/18 00:43:41 How will AuthResult::ErrorType and error.error_typ
sheretov 2015/01/03 03:18:02 Done in cast_cert_validator.h, but I think the com
+ : error_type_map[idx];
+
+ result.nss_error_code = error.library_error_code;
+
+ return result;
+}
+
} // namespace
AuthResult::AuthResult() : error_type(ERROR_NONE), nss_error_code(0) {
@@ -104,6 +130,31 @@ AuthResult AuthenticateChallengeReply(const CastMessage& challenge_reply,
return AuthResult();
}
+// This function does the following
+// * Verifies that the trusted CA |response.intermediate_certificate| is
+// whitelisted for use.
+// * Verifies that |response.client_auth_certificate| is signed
+// by the trusted CA certificate.
+// * Verifies that |response.signature| matches the signature
+// of |peer_cert| by |response.client_auth_certificate|'s public
+// key.
+AuthResult VerifyCredentials(const AuthResponse& response,
+ const std::string& peer_cert) {
+ // Verify the certificate
+ scoped_ptr<cast_crypto::CertVerificationContext> verification_context;
+ cast_crypto::VerificationResult ret = cast_crypto::VerifyDeviceCert(
+ response.client_auth_certificate(),
+ std::vector<std::string>(response.intermediate_certificate().begin(),
+ response.intermediate_certificate().end()),
+ &verification_context);
+
+ if (ret.Success())
+ ret = verification_context->VerifySignatureOverData(response.signature(),
+ peer_cert);
+
+ return TranslateVerificationError(ret);
+}
+
} // namespace cast_channel
} // namespace core_api
} // namespace extensions

Powered by Google App Engine
This is Rietveld 408576698