Index: components/policy/core/common/cloud/cloud_policy_validator.h |
diff --git a/components/policy/core/common/cloud/cloud_policy_validator.h b/components/policy/core/common/cloud/cloud_policy_validator.h |
index 3d2f2aacf70d59f6da5e1d1fd08417d1bd38b9a8..541fa789ea608fd1808129bc95a123c6c590ac68 100644 |
--- a/components/policy/core/common/cloud/cloud_policy_validator.h |
+++ b/components/policy/core/common/cloud/cloud_policy_validator.h |
@@ -46,9 +46,9 @@ namespace policy { |
// RunValidation() can be used to perform validation on the current thread. |
class POLICY_EXPORT CloudPolicyValidatorBase { |
public: |
- // Validation result codes. These values are also used for UMA histograms; |
- // they must stay stable, and the UMA counters must be updated if new elements |
- // are appended at the end. |
+ // Validation result codes. These values are also used for UMA histograms by |
+ // UserCloudPolicyStoreChromeOS and must stay stable - new elements should |
+ // be added at the end before VALIDATION_STATUS_SIZE. |
enum Status { |
// Indicates successful validation. |
VALIDATION_OK, |
@@ -72,6 +72,10 @@ class POLICY_EXPORT CloudPolicyValidatorBase { |
VALIDATION_BAD_USERNAME, |
// Policy payload protobuf parse error. |
VALIDATION_POLICY_PARSE_ERROR, |
+ // Policy key signature could not be verified using the hard-coded |
+ // verification key. |
+ VALIDATION_BAD_KEY_VERIFICATION_SIGNATURE, |
+ VALIDATION_STATUS_SIZE // MUST BE LAST |
}; |
enum ValidateDMTokenOption { |
@@ -143,19 +147,25 @@ class POLICY_EXPORT CloudPolicyValidatorBase { |
// Validates that the payload can be decoded successfully. |
void ValidatePayload(); |
- // Verifies that the signature on the policy blob verifies against |key|. If | |
+ // Verifies that the signature on the policy blob verifies against |key|. If |
// |allow_key_rotation| is true and there is a key rotation present in the |
// policy blob, this checks the signature on the new key against |key| and the |
- // policy blob against the new key. |
- void ValidateSignature(const std::vector<uint8>& key, |
+ // policy blob against the new key. New key is also validated using the passed |
+ // |verification_key| and the |new_public_key_verification_signature| field. |
+ // If |key_signature| is non-empty, then |key| is also verified against that |
+ // signature (useful when dealing with cached keys from untrusted sources). |
+ void ValidateSignature(const std::string& key, |
+ const std::string& verification_key, |
+ const std::string& key_signature, |
bool allow_key_rotation); |
- // Similar to StartSignatureVerification(), this checks the signature on the |
+ // Similar to ValidateSignature(), this checks the signature on the |
// policy blob. However, this variant expects a new policy key set in the |
// policy blob and makes sure the policy is signed using that key. This should |
// be called at setup time when there is no existing policy key present to |
- // check against. |
- void ValidateInitialKey(); |
+ // check against. New key is validated using the passed |verification_key| and |
+ // the new_public_key_verification_signature field. |
+ void ValidateInitialKey(const std::string& verification_key); |
// Convenience helper that configures timestamp and token validation based on |
// the current policy blob. |policy_data| may be NULL, in which case the |
@@ -195,6 +205,7 @@ class POLICY_EXPORT CloudPolicyValidatorBase { |
VALIDATE_PAYLOAD = 1 << 6, |
VALIDATE_SIGNATURE = 1 << 7, |
VALIDATE_INITIAL_KEY = 1 << 8, |
+ VALIDATE_SIGNED_KEY = 1 << 9, |
}; |
// Performs validation, called on a background thread. |
@@ -210,6 +221,21 @@ class POLICY_EXPORT CloudPolicyValidatorBase { |
// Invokes all the checks and reports the result. |
void RunChecks(); |
+ // Helper routine that verifies that the new public key in the policy blob |
+ // is properly signed by the |verification_key_|. |
+ bool CheckNewPublicKeyVerificationSignature(); |
+ |
+ // Helper routine that performs a verification-key-based signature check, |
+ // which includes the domain name associated with this policy. Returns true |
+ // if the verification succeeds, or if |signature| is empty. |
+ bool CheckVerificationKeySignature(const std::string& key_to_verify, |
+ const std::string& server_key, |
+ const std::string& signature); |
+ |
+ // Sets the key used to verify new public keys, and ensures that callers |
+ // don't try to set conflicting keys. |
+ void set_verification_key(const std::string& verification_key); |
+ |
// Helper functions implementing individual checks. |
Status CheckTimestamp(); |
Status CheckUsername(); |
@@ -242,6 +268,8 @@ class POLICY_EXPORT CloudPolicyValidatorBase { |
std::string policy_type_; |
std::string settings_entity_id_; |
std::string key_; |
+ std::string key_signature_; |
+ std::string verification_key_; |
bool allow_key_rotation_; |
scoped_refptr<base::SequencedTaskRunner> background_task_runner_; |