blob: 7949a2ff75aaf1a11e41c016ffd22d42c31213ce [file] [log] [blame]
// Copyright 2020 The Chromium Authors
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.
#ifndef COMPONENTS_REPORTING_ENCRYPTION_ENCRYPTION_MODULE_INTERFACE_H_
#define COMPONENTS_REPORTING_ENCRYPTION_ENCRYPTION_MODULE_INTERFACE_H_
#include <atomic>
#include "base/feature_list.h"
#include "base/functional/callback.h"
#include "base/memory/ref_counted.h"
#include "base/strings/string_piece.h"
#include "base/time/time.h"
#include "components/reporting/proto/synced/record.pb.h"
#include "components/reporting/util/status.h"
#include "components/reporting/util/statusor.h"
namespace reporting {
// Feature to enable/disable encryption.
// By default encryption is enabled and supported by server.
// Disabled only for testing/stress purposes.
BASE_DECLARE_FEATURE(kEncryptedReportingFeature);
class EncryptionModuleInterface
: public base::RefCountedThreadSafe<EncryptionModuleInterface> {
public:
// Public key id, as defined by Keystore.
using PublicKeyId = int32_t;
explicit EncryptionModuleInterface(
base::TimeDelta renew_encryption_key_period = base::Days(1));
EncryptionModuleInterface(const EncryptionModuleInterface& other) = delete;
EncryptionModuleInterface& operator=(const EncryptionModuleInterface& other) =
delete;
// EncryptRecord will attempt to encrypt the provided |record| and respond
// with the callback. On success the returned EncryptedRecord will contain
// the encrypted string and encryption information. EncryptedRecord then can
// be further updated by the caller.
void EncryptRecord(
std::string_view record,
base::OnceCallback<void(StatusOr<EncryptedRecord>)> cb) const;
// Records current public asymmetric key. Makes a not about last update time.
void UpdateAsymmetricKey(std::string_view new_public_key,
PublicKeyId new_public_key_id,
base::OnceCallback<void(Status)> response_cb);
// Returns `false` if encryption key has not been set yet, and `true`
// otherwise. The result is lazy: the method may return `false` for some time
// even after the key has already been set - this is harmless, since resetting
// or even changing the key is OK at any time.
bool has_encryption_key() const;
// Returns `true` if encryption key has not been set yet or it is too old
// (received more than |renew_encryption_key_period| ago).
bool need_encryption_key() const;
// Returns 'true' if |kEncryptedReporting| feature is enabled.
static bool is_enabled();
protected:
virtual ~EncryptionModuleInterface();
private:
friend base::RefCountedThreadSafe<EncryptionModuleInterface>;
// Implements EncryptRecord for the actual module.
virtual void EncryptRecordImpl(
std::string_view record,
base::OnceCallback<void(StatusOr<EncryptedRecord>)> cb) const = 0;
// Implements UpdateAsymmetricKey for the actual module.
virtual void UpdateAsymmetricKeyImpl(
std::string_view new_public_key,
PublicKeyId new_public_key_id,
base::OnceCallback<void(Status)> response_cb) = 0;
// Timestamp of the last public asymmetric key update by
// |UpdateAsymmetricKey|. Initial value base::TimeTicks() indicates key is not
// set yet.
std::atomic<base::TimeTicks> last_encryption_key_update_{base::TimeTicks()};
// Period of encryption key update.
const base::TimeDelta renew_encryption_key_period_;
};
} // namespace reporting
#endif // COMPONENTS_REPORTING_ENCRYPTION_ENCRYPTION_MODULE_INTERFACE_H_