Implement get public & private credentials.

PiperOrigin-RevId: 478522128
This commit is contained in:
Anthony Rueda
2022-10-03 09:18:19 -07:00
committed by Copybara-Service
parent 7350643c36
commit 1443f3a135
5 changed files with 316 additions and 118 deletions
@@ -39,9 +39,9 @@ using ::testing::status::StatusIs;
class MockCredentialManager : public CredentialManagerImpl {
public:
MOCK_METHOD(absl::StatusOr<std::string>, GetBaseEncryptedMetadataKey,
(const IdentityType& identity), (override));
(IdentityType identity), (override));
MOCK_METHOD(absl::StatusOr<std::string>, EncryptDataElements,
(const IdentityType& identity, absl::string_view salt,
(IdentityType identity, absl::string_view salt,
absl::string_view data_elements),
(override));
};
@@ -70,9 +70,9 @@ TEST(AdvertisementFactory, CreateAdvertisementFromPrivateIdentity) {
absl::StatusOr<BleAdvertisementData> result =
factory.CreateAdvertisement(request);
EXPECT_OK(result);
ASSERT_OK(result);
auto service_data = result->service_data;
EXPECT_EQ(service_data.size(), 1);
ASSERT_EQ(service_data.size(), 1);
for (auto i : service_data) {
EXPECT_EQ(i.first.Get16BitAsString(), "FCF1");
auto advertisement = absl::BytesToHexString(i.second.AsStringView());
+13 -11
View File
@@ -44,34 +44,36 @@ class CredentialManager {
// The users own public credentials wont be saved on local credential
// storage.
virtual void GenerateCredentials(
nearby::internal::DeviceMetadata device_metadata,
std::string manager_app_id,
std::vector<nearby::internal::IdentityType> identity_types,
const nearby::internal::DeviceMetadata& device_metadata,
absl::string_view manager_app_id,
const std::vector<nearby::internal::IdentityType>& identity_types,
int credential_life_cycle_days, int contiguous_copy_of_credentials,
GenerateCredentialsCallback credentials_generated_cb) = 0;
// Update remote public credentials.
virtual void UpdateRemotePublicCredentials(
std::string manager_app_id, std::string account_name,
std::vector<nearby::internal::PublicCredential> remote_public_creds,
absl::string_view manager_app_id, absl::string_view account_name,
const std::vector<nearby::internal::PublicCredential>&
remote_public_creds,
UpdateRemotePublicCredentialsCallback credentials_updated_cb) = 0;
// Used to fetch private creds when broadcasting.
virtual void GetPrivateCredentials(
CredentialSelector credential_selector,
const CredentialSelector& credential_selector,
GetPrivateCredentialsResultCallback callback) = 0;
// Used to fetch remote public creds when scanning.
virtual void GetPublicCredentials(
CredentialSelector credential_selector,
const CredentialSelector& credential_selector,
PublicCredentialType public_credential_type,
GetPublicCredentialsResultCallback callback) = 0;
// Decrypts the device metadata from a public credential.
// Returns an empty string if decryption fails.
virtual std::string DecryptDeviceMetadata(
std::string device_metadata_encryption_key, std::string authenticity_key,
std::string device_metadata_string) = 0;
absl::string_view device_metadata_encryption_key,
absl::string_view authenticity_key,
absl::string_view device_metadata_string) = 0;
// Decrypts Data Elements from an NP advertisement.
// Returns an error if `metadata_key` is not associated with any known
@@ -83,12 +85,12 @@ class CredentialManager {
// Returns encrypted metadata key associated with `identity` for Base NP
// advertisement.
virtual absl::StatusOr<std::string> GetBaseEncryptedMetadataKey(
const nearby::internal::IdentityType& identity) = 0;
nearby::internal::IdentityType identity) = 0;
// Encrypts `data_elements` using certificate associated with `identity` and
// `salt`.
virtual absl::StatusOr<std::string> EncryptDataElements(
const nearby::internal::IdentityType& identity, absl::string_view salt,
nearby::internal::IdentityType identity, absl::string_view salt,
absl::string_view data_elements) = 0;
};
@@ -19,12 +19,14 @@
#include <utility>
#include <vector>
#include "absl/strings/string_view.h"
#include "internal/crypto/aead.h"
#include "internal/crypto/ec_private_key.h"
#include "internal/crypto/hkdf.h"
#include "internal/platform/base64_utils.h"
#include "internal/platform/implementation/crypto.h"
#include "internal/platform/logging.h"
#include "internal/proto/credential.proto.h"
#include "presence/implementation/encryption.h"
namespace nearby {
@@ -43,9 +45,9 @@ constexpr char kPairedKeyAliasPrefix[] = "nearby_presence_paired_key_alias_";
} // namespace
void CredentialManagerImpl::GenerateCredentials(
DeviceMetadata device_metadata, std::string manager_app_id,
std::vector<IdentityType> identity_types, int credential_life_cycle_days,
int contiguous_copy_of_credentials,
const DeviceMetadata& device_metadata, absl::string_view manager_app_id,
const std::vector<IdentityType>& identity_types,
int credential_life_cycle_days, int contiguous_copy_of_credentials,
GenerateCredentialsCallback credentials_generated_cb) {
std::vector<PublicCredential> public_credentials;
std::vector<PrivateCredential> private_credentials;
@@ -59,9 +61,10 @@ void CredentialManagerImpl::GenerateCredentials(
for (int index = 0; index < contiguous_copy_of_credentials; index++) {
auto public_private_credentials = CreatePrivateCredential(
device_metadata, identity_type, start_time_millis, end_time_millis);
if (public_private_credentials.first != nullptr) {
private_credentials.push_back(*public_private_credentials.first);
public_credentials.push_back(*public_private_credentials.second);
if (public_private_credentials.second.identity_type() !=
IdentityType::IDENTITY_TYPE_UNSPECIFIED) {
private_credentials.push_back(public_private_credentials.first);
public_credentials.push_back(public_private_credentials.second);
}
start_time_millis += gap_millis;
end_time_millis += gap_millis;
@@ -75,20 +78,19 @@ void CredentialManagerImpl::GenerateCredentials(
std::move(credentials_generated_cb));
}
std::pair<std::unique_ptr<PrivateCredential>, std::unique_ptr<PublicCredential>>
CredentialManagerImpl::CreatePrivateCredential(DeviceMetadata device_metadata,
IdentityType identity_type,
uint64_t start_time_ms,
uint64_t end_time_ms) {
auto private_credential_ptr = std::make_unique<PrivateCredential>();
private_credential_ptr->set_start_time_millis(start_time_ms);
private_credential_ptr->set_end_time_millis(end_time_ms);
private_credential_ptr->set_identity_type(identity_type);
std::pair<PrivateCredential, PublicCredential>
CredentialManagerImpl::CreatePrivateCredential(
const DeviceMetadata& device_metadata, IdentityType identity_type,
uint64_t start_time_ms, uint64_t end_time_ms) {
PrivateCredential private_credential;
private_credential.set_start_time_millis(start_time_ms);
private_credential.set_end_time_millis(end_time_ms);
private_credential.set_identity_type(identity_type);
// Creates an AES key to encrypt the whole broadcast.
std::string secret_key =
Encryption::GenerateRandomByteArray(kAuthenticityKeyByteSize);
private_credential_ptr->set_authenticity_key(secret_key);
private_credential.set_authenticity_key(secret_key);
// Uses SHA-256 algorithm to generate the credential ID from the authenticity
// key
@@ -97,7 +99,7 @@ CredentialManagerImpl::CreatePrivateCredential(DeviceMetadata device_metadata,
// ByteArray.
CHECK(!secret_id.Empty()) << "Crypto::Sha256 failed!";
private_credential_ptr->set_secret_id(secret_id.AsStringView());
private_credential.set_secret_id(secret_id.AsStringView());
std::string alias = Base64Utils::Encode(secret_id);
auto prefixedAlias = kPairedKeyAliasPrefix + alias;
@@ -106,67 +108,66 @@ CredentialManagerImpl::CreatePrivateCredential(DeviceMetadata device_metadata,
auto key_pair = crypto::ECPrivateKey::Create();
std::vector<uint8_t> private_key;
key_pair->ExportPrivateKey(&private_key);
private_credential_ptr->set_verification_key(
private_credential.set_verification_key(
std::string(private_key.begin(), private_key.end()));
// Create an AES key to encrypt the device metadata.
auto metadata_key =
Encryption::GenerateRandomByteArray(kAuthenticityKeyByteSize);
private_credential_ptr->set_metadata_encryption_key(metadata_key);
private_credential.set_metadata_encryption_key(metadata_key);
// set device meta data
*(private_credential_ptr->mutable_device_metadata()) = device_metadata;
*(private_credential.mutable_device_metadata()) = device_metadata;
// Generate the public credential
std::vector<uint8_t> public_key;
key_pair->ExportPublicKey(&public_key);
auto public_credential_ptr =
CreatePublicCredential(private_credential_ptr.get(), &public_key);
return std::pair<std::unique_ptr<PrivateCredential>,
std::unique_ptr<PublicCredential>>(
std::move(private_credential_ptr), std::move(public_credential_ptr));
return std::pair<PrivateCredential, PublicCredential>(
private_credential,
CreatePublicCredential(private_credential, public_key));
}
std::unique_ptr<PublicCredential> CredentialManagerImpl::CreatePublicCredential(
PrivateCredential* private_credential, std::vector<uint8_t>* public_key) {
auto public_credential_ptr = std::make_unique<PublicCredential>();
public_credential_ptr->set_identity_type(private_credential->identity_type());
public_credential_ptr->set_secret_id(private_credential->secret_id());
public_credential_ptr->set_authenticity_key(
private_credential->authenticity_key());
public_credential_ptr->set_start_time_millis(
private_credential->start_time_millis());
public_credential_ptr->set_end_time_millis(
private_credential->end_time_millis());
PublicCredential CredentialManagerImpl::CreatePublicCredential(
const PrivateCredential& private_credential,
const std::vector<uint8_t>& public_key) {
PublicCredential public_credential;
public_credential.set_identity_type(private_credential.identity_type());
public_credential.set_secret_id(private_credential.secret_id());
public_credential.set_authenticity_key(private_credential.authenticity_key());
public_credential.set_start_time_millis(
private_credential.start_time_millis());
public_credential.set_end_time_millis(private_credential.end_time_millis());
// set up the public key
public_credential_ptr->set_verification_key(
std::string(public_key->begin(), public_key->end()));
public_credential.set_verification_key(
std::string(public_key.begin(), public_key.end()));
auto metadata_encryption_key_tag =
Crypto::Sha256(private_credential->metadata_encryption_key());
public_credential_ptr->set_metadata_encryption_key_tag(
Crypto::Sha256(private_credential.metadata_encryption_key());
public_credential.set_metadata_encryption_key_tag(
metadata_encryption_key_tag.AsStringView());
// Encrypt the device metadata
auto encrypted_meta_data = EncryptDeviceMetadata(
private_credential->metadata_encryption_key(),
private_credential->authenticity_key(),
private_credential->device_metadata().SerializeAsString());
private_credential.metadata_encryption_key(),
private_credential.authenticity_key(),
private_credential.device_metadata().SerializeAsString());
if (encrypted_meta_data.empty()) {
NEARBY_LOGS(ERROR) << "Fails to encrypt the device metadata.";
return std::unique_ptr<PublicCredential>(nullptr);
public_credential.set_identity_type(
IdentityType::IDENTITY_TYPE_UNSPECIFIED);
return public_credential;
}
public_credential_ptr->set_encrypted_metadata_bytes(encrypted_meta_data);
return public_credential_ptr;
public_credential.set_encrypted_metadata_bytes(encrypted_meta_data);
return public_credential;
}
std::string CredentialManagerImpl::DecryptDeviceMetadata(
std::string device_metadata_encryption_key, std::string authenticity_key,
std::string device_metadata_string) {
absl::string_view device_metadata_encryption_key,
absl::string_view authenticity_key,
absl::string_view device_metadata_string) {
crypto::Aead aead(crypto::Aead::AeadAlgorithm::AES_256_GCM);
std::vector<uint8_t> derived_key =
@@ -188,8 +189,9 @@ std::string CredentialManagerImpl::DecryptDeviceMetadata(
}
std::string CredentialManagerImpl::EncryptDeviceMetadata(
std::string device_metadata_encryption_key, std::string authenticity_key,
std::string device_metadata_string) {
absl::string_view device_metadata_encryption_key,
absl::string_view authenticity_key,
absl::string_view device_metadata_string) {
crypto::Aead aead(crypto::Aead::AeadAlgorithm::AES_256_GCM);
std::vector<uint8_t> derived_key =
@@ -213,7 +215,7 @@ std::string CredentialManagerImpl::EncryptDeviceMetadata(
}
std::vector<uint8_t> CredentialManagerImpl::ExtendMetadataEncryptionKey(
std::string device_metadata_encryption_key) {
absl::string_view device_metadata_encryption_key) {
return crypto::HkdfSha256(
std::vector<uint8_t>(device_metadata_encryption_key.begin(),
device_metadata_encryption_key.end()),
@@ -221,5 +223,20 @@ std::vector<uint8_t> CredentialManagerImpl::ExtendMetadataEncryptionKey(
/*info=*/absl::Span<uint8_t>(), kNearbyPresenceNumBytesAesGcmKeySize);
}
void CredentialManagerImpl::GetPrivateCredentials(
const CredentialSelector& credential_selector,
GetPrivateCredentialsResultCallback callback) {
credential_storage_ptr_->GetPrivateCredentials(credential_selector,
std::move(callback));
}
void CredentialManagerImpl::GetPublicCredentials(
const CredentialSelector& credential_selector,
PublicCredentialType public_credential_type,
GetPublicCredentialsResultCallback callback) {
credential_storage_ptr_->GetPublicCredentials(
credential_selector, public_credential_type, std::move(callback));
}
} // namespace presence
} // namespace nearby
@@ -54,31 +54,32 @@ class CredentialManagerImpl : public CredentialManager {
static constexpr int kAesGcmIVSize = 12;
void GenerateCredentials(
nearby::internal::DeviceMetadata device_metadata,
std::string manager_app_id,
std::vector<nearby::internal::IdentityType> identity_types,
int credential_life_cycle_days,
int contiguous_copy_of_credentials,
const nearby::internal::DeviceMetadata& device_metadata,
absl::string_view manager_app_id,
const std::vector<nearby::internal::IdentityType>& identity_types,
int credential_life_cycle_days, int contiguous_copy_of_credentials,
GenerateCredentialsCallback credentials_generated_cb) override;
void UpdateRemotePublicCredentials(
std::string manager_app_id, std::string account_name,
std::vector<nearby::internal::PublicCredential> remote_public_creds,
absl::string_view manager_app_id, absl::string_view account_name,
const std::vector<nearby::internal::PublicCredential>&
remote_public_creds,
UpdateRemotePublicCredentialsCallback credentials_updated_cb) override{};
void GetPrivateCredentials(
CredentialSelector credential_selector,
GetPrivateCredentialsResultCallback callback) override{};
const CredentialSelector& credential_selector,
GetPrivateCredentialsResultCallback callback) override;
// Used to fetch remote public creds when scanning.
void GetPublicCredentials(
CredentialSelector credential_selector,
const CredentialSelector& credential_selector,
PublicCredentialType public_credential_type,
GetPublicCredentialsResultCallback callback) override{};
GetPublicCredentialsResultCallback callback) override;
std::string DecryptDeviceMetadata(
std::string device_metadata_encryption_key, std::string authenticity_key,
std::string device_metadata_string) override;
absl::string_view device_metadata_encryption_key,
absl::string_view authenticity_key,
absl::string_view device_metadata_string) override;
absl::StatusOr<std::string> DecryptDataElements(
absl::string_view metadata_key, absl::string_view salt,
@@ -87,34 +88,36 @@ class CredentialManagerImpl : public CredentialManager {
}
absl::StatusOr<std::string> GetBaseEncryptedMetadataKey(
const nearby::internal::IdentityType& identity) override {
nearby::internal::IdentityType identity) override {
return absl::UnimplementedError(
"GetBaseEncryptedMetadataKey unimplemented");
}
absl::StatusOr<std::string> EncryptDataElements(
const nearby::internal::IdentityType& identity, absl::string_view salt,
nearby::internal::IdentityType identity, absl::string_view salt,
absl::string_view data_elements) override {
return absl::UnimplementedError("EncryptDataElements unimplemented");
}
std::pair<std::unique_ptr<nearby::internal::PrivateCredential>,
std::unique_ptr<nearby::internal::PublicCredential>>
CreatePrivateCredential(nearby::internal::DeviceMetadata device_metadata,
nearby::internal::IdentityType identity_type,
uint64_t start_time_ms, uint64_t end_time_ms);
std::pair<nearby::internal::PrivateCredential,
nearby::internal::PublicCredential>
CreatePrivateCredential(
const nearby::internal::DeviceMetadata& device_metadata,
nearby::internal::IdentityType identity_type, uint64_t start_time_ms,
uint64_t end_time_ms);
std::unique_ptr<nearby::internal::PublicCredential> CreatePublicCredential(
nearby::internal::PrivateCredential* private_credential_ptr,
std::vector<uint8_t>* public_key);
nearby::internal::PublicCredential CreatePublicCredential(
const nearby::internal::PrivateCredential& private_credential,
const std::vector<uint8_t>& public_key);
std::string EncryptDeviceMetadata(std::string device_metadata_encryption_key,
std::string authenticity_key,
std::string device_metadata_string);
virtual std::string EncryptDeviceMetadata(
absl::string_view device_metadata_encryption_key,
absl::string_view authenticity_key,
absl::string_view device_metadata_string);
// Extend the key from 16 bytes to 32 bytes.
std::vector<uint8_t> ExtendMetadataEncryptionKey(
std::string device_metadata_encryption_key);
absl::string_view device_metadata_encryption_key);
private:
std::unique_ptr<location::nearby::CredentialStorageImpl>
@@ -15,6 +15,7 @@
#include "presence/implementation/credential_manager_impl.h"
#include <memory>
#include <string>
#include <utility>
#include <vector>
@@ -50,6 +51,14 @@ DeviceMetadata CreateTestDeviceMetadata() {
return device_metadata;
}
CredentialSelector BuildDefaultCredentialSelector() {
CredentialSelector credential_selector;
credential_selector.manager_app_id = "TEST_MANAGER_APP";
credential_selector.account_name = "test_account";
credential_selector.identity_type = IDENTITY_TYPE_PRIVATE;
return credential_selector;
}
class CredentialManagerImplTest : public ::testing::Test {
public:
class MockCredentialStorage : public location::nearby::CredentialStorageImpl {
@@ -66,12 +75,23 @@ class CredentialManagerImplTest : public ::testing::Test {
(override));
};
class MockCredentialManager : public CredentialManagerImpl {
public:
MOCK_METHOD(std::string, EncryptDeviceMetadata,
(absl::string_view device_metadata_encryption_key,
absl::string_view authenticity_key,
absl::string_view device_metadata_string),
(override));
};
CredentialManagerImplTest() {
mock_credential_storage_ptr_ = std::make_unique<MockCredentialStorage>();
mock_credential_manager_ptr_ = std::make_unique<MockCredentialManager>();
}
protected:
std::unique_ptr<MockCredentialStorage> mock_credential_storage_ptr_;
std::unique_ptr<MockCredentialManager> mock_credential_manager_ptr_;
};
TEST(CredentialManagerImpl, CreateOneCredentialSuccessfully) {
@@ -82,43 +102,43 @@ TEST(CredentialManagerImpl, CreateOneCredentialSuccessfully) {
device_metadata, IDENTITY_TYPE_PRIVATE, /* start_time_ms= */ 0,
/* end_time_ms= */ 1000);
PrivateCredential* private_credential = credentials.first.get();
PrivateCredential private_credential = credentials.first;
// Verify the private credential.
EXPECT_THAT(private_credential->device_metadata(),
EXPECT_THAT(private_credential.device_metadata(),
EqualsProto(device_metadata));
EXPECT_EQ(private_credential->identity_type(), IDENTITY_TYPE_PRIVATE);
EXPECT_FALSE(private_credential->secret_id().empty());
EXPECT_EQ(private_credential->start_time_millis(), 0);
EXPECT_EQ(private_credential->end_time_millis(), 1000);
EXPECT_EQ(private_credential->authenticity_key().size(),
EXPECT_EQ(private_credential.identity_type(), IDENTITY_TYPE_PRIVATE);
EXPECT_FALSE(private_credential.secret_id().empty());
EXPECT_EQ(private_credential.start_time_millis(), 0);
EXPECT_EQ(private_credential.end_time_millis(), 1000);
EXPECT_EQ(private_credential.authenticity_key().size(),
CredentialManagerImpl::kAuthenticityKeyByteSize);
EXPECT_FALSE(private_credential->verification_key().empty());
EXPECT_EQ(private_credential->metadata_encryption_key().size(),
EXPECT_FALSE(private_credential.verification_key().empty());
EXPECT_EQ(private_credential.metadata_encryption_key().size(),
CredentialManagerImpl::kAuthenticityKeyByteSize);
PublicCredential* public_credential = credentials.second.get();
PublicCredential public_credential = credentials.second;
// Verify the public credential.
EXPECT_EQ(public_credential->identity_type(), IDENTITY_TYPE_PRIVATE);
EXPECT_FALSE(public_credential->secret_id().empty());
EXPECT_EQ(private_credential->authenticity_key(),
public_credential->authenticity_key());
EXPECT_EQ(public_credential->start_time_millis(), 0);
EXPECT_EQ(public_credential->end_time_millis(), 1000);
EXPECT_EQ(Crypto::Sha256(private_credential->metadata_encryption_key())
EXPECT_EQ(public_credential.identity_type(), IDENTITY_TYPE_PRIVATE);
EXPECT_FALSE(public_credential.secret_id().empty());
EXPECT_EQ(private_credential.authenticity_key(),
public_credential.authenticity_key());
EXPECT_EQ(public_credential.start_time_millis(), 0);
EXPECT_EQ(public_credential.end_time_millis(), 1000);
EXPECT_EQ(Crypto::Sha256(private_credential.metadata_encryption_key())
.AsStringView(),
public_credential->metadata_encryption_key_tag());
EXPECT_FALSE(public_credential->verification_key().empty());
EXPECT_FALSE(public_credential->encrypted_metadata_bytes().empty());
public_credential.metadata_encryption_key_tag());
EXPECT_FALSE(public_credential.verification_key().empty());
EXPECT_FALSE(public_credential.encrypted_metadata_bytes().empty());
// Decrypt the device metadata
auto decrypted_device_metadata = credential_manager.DecryptDeviceMetadata(
private_credential->metadata_encryption_key(),
public_credential->authenticity_key(),
public_credential->encrypted_metadata_bytes());
private_credential.metadata_encryption_key(),
public_credential.authenticity_key(),
public_credential.encrypted_metadata_bytes());
EXPECT_EQ(private_credential->device_metadata().SerializeAsString(),
EXPECT_EQ(private_credential.device_metadata().SerializeAsString(),
decrypted_device_metadata);
}
@@ -189,6 +209,162 @@ TEST(CredentialManagerImpl, GenerateCredentialsSuccessfullyButStoreFailed) {
credentials_generated_cb);
EXPECT_TRUE(publicCredentials.empty());
}
TEST(CredentialManagerImpl, GetPrivateCredentialsFailed) {
std::vector<PrivateCredential> private_credentials;
auto get_credentials_fetched_cb =
[&private_credentials](std::vector<PrivateCredential> credentials) {
private_credentials = credentials;
};
CredentialOperationStatus get_credentials_status =
CredentialOperationStatus::kSucceeded;
auto get_credentials_failed_cb =
[&get_credentials_status](CredentialOperationStatus status) {
get_credentials_status = status;
};
GetPrivateCredentialsResultCallback get_private_credentials_result_callback;
get_private_credentials_result_callback.get_credentials_failed_cb =
get_credentials_failed_cb;
get_private_credentials_result_callback.credentials_fetched_cb =
get_credentials_fetched_cb;
CredentialSelector credential_selector;
credential_selector.manager_app_id = "TEST_MANAGER_APP";
credential_selector.account_name = "test_account";
credential_selector.identity_type = IDENTITY_TYPE_PRIVATE;
CredentialManagerImpl credential_manager;
credential_manager.GetPrivateCredentials(
credential_selector, get_private_credentials_result_callback);
EXPECT_EQ(get_credentials_status, CredentialOperationStatus::kFailed);
EXPECT_TRUE(private_credentials.empty());
}
TEST(CredentialManagerImpl, GetPublicCredentialsFailed) {
std::vector<PublicCredential> public_credentials;
auto get_credentials_fetched_cb =
[&public_credentials](std::vector<PublicCredential> credentials) {
public_credentials = credentials;
};
CredentialOperationStatus get_credentials_status =
CredentialOperationStatus::kSucceeded;
auto get_credentials_failed_cb =
[&get_credentials_status](CredentialOperationStatus status) {
get_credentials_status = status;
};
GetPublicCredentialsResultCallback get_public_credentials_result_callback;
get_public_credentials_result_callback.get_credentials_failed_cb =
get_credentials_failed_cb;
get_public_credentials_result_callback.credentials_fetched_cb =
get_credentials_fetched_cb;
CredentialSelector credential_selector;
credential_selector.manager_app_id = "TEST_MANAGER_APP";
credential_selector.account_name = "test_account";
credential_selector.identity_type = IDENTITY_TYPE_PRIVATE;
CredentialManagerImpl credential_manager;
credential_manager.GetPublicCredentials(
credential_selector, PublicCredentialType::kLocalPublicCredential,
get_public_credentials_result_callback);
EXPECT_EQ(get_credentials_status, CredentialOperationStatus::kFailed);
EXPECT_TRUE(public_credentials.empty());
}
TEST(CredentialManagerImpl, GetCredentialsSuccessfully) {
DeviceMetadata device_metadata = CreateTestDeviceMetadata();
std::vector<nearby::internal::PublicCredential> publicCredentials;
auto create_creds_callback_lambda =
[&publicCredentials](
std::vector<nearby::internal::PublicCredential> credentials) {
publicCredentials = credentials;
};
GenerateCredentialsCallback generate_credentials_callback;
generate_credentials_callback.credentials_generated_cb =
create_creds_callback_lambda;
CredentialManagerImpl credential_manager;
std::vector<IdentityType> identity_types{IDENTITY_TYPE_PRIVATE};
credential_manager.GenerateCredentials(
device_metadata, "TEST_MANAGER_APP", identity_types, 1, 1,
std::move(generate_credentials_callback));
EXPECT_EQ(publicCredentials.size(), 1);
std::vector<PrivateCredential> private_credentials;
auto get_credentials_fetched_cb =
[&private_credentials](std::vector<PrivateCredential> credentials) {
private_credentials = credentials;
};
CredentialOperationStatus get_credentials_status =
CredentialOperationStatus::kSucceeded;
auto get_credentials_failed_cb =
[&get_credentials_status](CredentialOperationStatus status) {
get_credentials_status = status;
};
GetPrivateCredentialsResultCallback get_private_credentials_result_callback;
get_private_credentials_result_callback.get_credentials_failed_cb =
get_credentials_failed_cb;
get_private_credentials_result_callback.credentials_fetched_cb =
get_credentials_fetched_cb;
CredentialSelector credential_selector = BuildDefaultCredentialSelector();
credential_manager.GetPrivateCredentials(
credential_selector, std::move(get_private_credentials_result_callback));
EXPECT_EQ(get_credentials_status, CredentialOperationStatus::kSucceeded);
EXPECT_FALSE(private_credentials.empty());
}
TEST(CredentialManagerImpl, PublicCredentialsFailEncryption) {
DeviceMetadata device_metadata = CreateTestDeviceMetadata();
std::vector<nearby::internal::PublicCredential> publicCredentials;
GenerateCredentialsCallback generate_credentials_callback;
generate_credentials_callback.credentials_generated_cb =
[&publicCredentials](
std::vector<nearby::internal::PublicCredential> credentials) {
publicCredentials = credentials;
};
auto credential_manager_ptr =
std::make_unique<CredentialManagerImplTest::MockCredentialManager>();
EXPECT_CALL(*credential_manager_ptr, EncryptDeviceMetadata)
.WillOnce(::testing::Invoke(
[](absl::string_view device_metadata_encryption_key,
absl::string_view authenticity_key,
absl::string_view device_metadata_string) { return ""; }));
std::vector<IdentityType> identity_types{IDENTITY_TYPE_PRIVATE};
credential_manager_ptr->GenerateCredentials(
device_metadata, "TEST_MANAGER_APP", identity_types, 1, 1,
std::move(generate_credentials_callback));
EXPECT_TRUE(publicCredentials.empty());
}
TEST(CredentialManagerImpl, UnimplementedFunctions) {
CredentialManagerImpl credential_manager;
constexpr absl::string_view metadata_key = "metadata_key";
constexpr absl::string_view salt = "salt";
constexpr absl::string_view data_elements = "data_elements";
IdentityType identity = IDENTITY_TYPE_PRIVATE;
EXPECT_THAT(
credential_manager.EncryptDataElements(identity, salt, data_elements),
absl::Status(absl::StatusCode::kUnimplemented,
"EncryptDataElements unimplemented"));
EXPECT_THAT(
credential_manager.DecryptDataElements(metadata_key, salt, data_elements),
absl::Status(absl::StatusCode::kUnimplemented,
"DecryptDataElements unimplemented"));
EXPECT_THAT(credential_manager.GetBaseEncryptedMetadataKey(identity),
absl::Status(absl::StatusCode::kUnimplemented,
"GetBaseEncryptedMetadataKey unimplemented"));
}
} // namespace
} // namespace presence