Fix the certificate pairing issue when the visibility is set to everyone

PiperOrigin-RevId: 617873950
This commit is contained in:
hai007
2024-03-21 09:47:54 -07:00
committed by Copybara-Service
parent ca0cb7dc91
commit 30e0b25743
5 changed files with 81 additions and 16 deletions
@@ -470,6 +470,17 @@ void NearbyShareCertificateManagerImpl::OnStop() {
std::optional<NearbySharePrivateCertificate>
NearbyShareCertificateManagerImpl::GetValidPrivateCertificate(
DeviceVisibility visibility) const {
if (visibility == DeviceVisibility::DEVICE_VISIBILITY_UNSPECIFIED ||
visibility == DeviceVisibility::DEVICE_VISIBILITY_HIDDEN) {
return std::nullopt;
}
// If the user already signed in, setup contacts certificate for everyone
// mode to show correct user icon on remote device.
if (visibility == DeviceVisibility::DEVICE_VISIBILITY_EVERYONE) {
visibility = DeviceVisibility::DEVICE_VISIBILITY_ALL_CONTACTS;
}
std::optional<std::vector<NearbySharePrivateCertificate>> certs =
*certificate_storage_->GetPrivateCertificates();
for (auto& cert : *certs) {
@@ -465,6 +465,12 @@ class NearbyShareCertificateManagerImplTest
TEST_F(NearbyShareCertificateManagerImplTest,
EncryptPrivateCertificateMetadataKey) {
// No certificates exist for hidden or unspecified visibility.
EXPECT_FALSE(cert_manager_->EncryptPrivateCertificateMetadataKey(
DeviceVisibility::DEVICE_VISIBILITY_HIDDEN));
EXPECT_FALSE(cert_manager_->EncryptPrivateCertificateMetadataKey(
DeviceVisibility::DEVICE_VISIBILITY_UNSPECIFIED));
// No valid certificates exist.
cert_store_->ReplacePrivateCertificates({});
EXPECT_FALSE(cert_manager_->EncryptPrivateCertificateMetadataKey(
@@ -500,6 +506,21 @@ TEST_F(NearbyShareCertificateManagerImplTest,
EXPECT_NE(cert_store_->GetPrivateCertificates()->at(0).ToCertificateData(),
private_certificate.ToCertificateData());
// Set up valid all-contacts visibility certificate. Then test with everyone
// visibility.
cert_store_->ReplacePrivateCertificates({private_certificate});
FastForward(GetNearbyShareTestNotBefore() +
kNearbyShareCertificateValidityPeriod * 0.5 - Now());
std::optional<NearbyShareEncryptedMetadataKey> encrypted_metadata_key_everyone
=
cert_manager_->EncryptPrivateCertificateMetadataKey(
DeviceVisibility::DEVICE_VISIBILITY_EVERYONE);
EXPECT_EQ(GetNearbyShareTestEncryptedMetadataKey().encrypted_key(),
encrypted_metadata_key_everyone->encrypted_key());
EXPECT_EQ(GetNearbyShareTestEncryptedMetadataKey().salt(),
encrypted_metadata_key_everyone->salt());
// No valid certificates exist.
FastForward(kNearbyShareCertificateValidityPeriod);
EXPECT_FALSE(cert_manager_->EncryptPrivateCertificateMetadataKey(
@@ -523,10 +544,32 @@ TEST_F(NearbyShareCertificateManagerImplTest, SignWithPrivateCertificate) {
DeviceVisibility::DEVICE_VISIBILITY_ALL_CONTACTS,
GetNearbyShareTestPayloadToSign())));
// Set up valid all-contacts visibility certificate. Then test with everyone
// visibility.
cert_store_->ReplacePrivateCertificates({private_certificate});
FastForward(GetNearbyShareTestNotBefore() +
kNearbyShareCertificateValidityPeriod * 0.5 - Now());
// Perform sign/verify round trip.
EXPECT_TRUE(GetNearbyShareTestDecryptedPublicCertificate().VerifySignature(
GetNearbyShareTestPayloadToSign(),
*cert_manager_->SignWithPrivateCertificate(
DeviceVisibility::DEVICE_VISIBILITY_EVERYONE,
GetNearbyShareTestPayloadToSign())));
// No selected-contact visibility certificate in storage.
EXPECT_FALSE(cert_manager_->SignWithPrivateCertificate(
DeviceVisibility::DEVICE_VISIBILITY_SELECTED_CONTACTS,
GetNearbyShareTestPayloadToSign()));
// No certificates exist for hidden or unspecified visibility.
EXPECT_FALSE(cert_manager_->SignWithPrivateCertificate(
DeviceVisibility::DEVICE_VISIBILITY_HIDDEN,
GetNearbyShareTestPayloadToSign()));
EXPECT_FALSE(cert_manager_->SignWithPrivateCertificate(
DeviceVisibility::DEVICE_VISIBILITY_UNSPECIFIED,
GetNearbyShareTestPayloadToSign()));
}
TEST_F(NearbyShareCertificateManagerImplTest,
@@ -544,10 +587,31 @@ TEST_F(NearbyShareCertificateManagerImplTest,
DeviceVisibility::DEVICE_VISIBILITY_ALL_CONTACTS,
GetNearbyShareTestPayloadToSign()));
// Set up valid all-contacts visibility certificate. Then test with everyone
// visibility.
cert_store_->ReplacePrivateCertificates({private_certificate});
FastForward(GetNearbyShareTestNotBefore() +
kNearbyShareCertificateValidityPeriod * 0.5 - Now());
EXPECT_EQ(private_certificate.HashAuthenticationToken(
GetNearbyShareTestPayloadToSign()),
cert_manager_->HashAuthenticationTokenWithPrivateCertificate(
DeviceVisibility::DEVICE_VISIBILITY_EVERYONE,
GetNearbyShareTestPayloadToSign()));
// No selected-contact visibility certificate in storage.
EXPECT_FALSE(cert_manager_->HashAuthenticationTokenWithPrivateCertificate(
DeviceVisibility::DEVICE_VISIBILITY_SELECTED_CONTACTS,
GetNearbyShareTestPayloadToSign()));
// No certificates exist for hidden or unspecified visibility.
EXPECT_FALSE(cert_manager_->HashAuthenticationTokenWithPrivateCertificate(
DeviceVisibility::DEVICE_VISIBILITY_HIDDEN,
GetNearbyShareTestPayloadToSign()));
EXPECT_FALSE(cert_manager_->HashAuthenticationTokenWithPrivateCertificate(
DeviceVisibility::DEVICE_VISIBILITY_UNSPECIFIED,
GetNearbyShareTestPayloadToSign()));
}
TEST_F(NearbyShareCertificateManagerImplTest,
-6
View File
@@ -1571,13 +1571,7 @@ NearbySharingServiceImpl::CreateEndpointInfo(
std::vector<uint8_t> encrypted_key;
if (account_manager_.GetCurrentAccount().has_value()) {
// If the user already signed in, setup contacts certificate for everyone
// mode to show correct user icon on remote device.
DeviceVisibility visibility = settings_->GetVisibility();
if (visibility == proto::DEVICE_VISIBILITY_EVERYONE) {
// Make sure using all contacts certificate for everyone mode
visibility = proto::DEVICE_VISIBILITY_ALL_CONTACTS;
}
std::optional<NearbyShareEncryptedMetadataKey> encrypted_metadata_key =
certificate_manager_->EncryptPrivateCertificateMetadataKey(visibility);
+6 -8
View File
@@ -331,9 +331,12 @@ void PairedKeyVerificationRunner::SendCertificateInfo() {
}
void PairedKeyVerificationRunner::SendPairedKeyEncryptionFrame() {
// This matches the behavior of CertificateManagerImpl.getFileNameByVisibility
// in Android. Sender always return all contacts visibility certificates.
std::optional<std::vector<uint8_t>> signature =
certificate_manager_->SignWithPrivateCertificate(
GetSignningVisibility(), PadPrefix(local_prefix_, raw_token_));
DeviceVisibility::DEVICE_VISIBILITY_ALL_CONTACTS,
PadPrefix(local_prefix_, raw_token_));
if (!signature.has_value() || signature->empty()) {
signature = GenerateRandomBytes(kNearbyShareNumBytesRandomSignature);
}
@@ -359,7 +362,8 @@ void PairedKeyVerificationRunner::SendPairedKeyEncryptionFrame() {
<< "Attempts to sign authentication token with a previous private key.";
std::optional<std::vector<uint8_t>> optional_signature =
certificate_manager_->SignWithPrivateCertificate(
GetSignningVisibility(), PadPrefix(local_prefix_, raw_token_));
DeviceVisibility::DEVICE_VISIBILITY_ALL_CONTACTS,
PadPrefix(local_prefix_, raw_token_));
if (optional_signature.has_value()) {
encryption_frame->set_optional_signed_data(optional_signature->data(),
@@ -490,11 +494,5 @@ bool PairedKeyVerificationRunner::RelaxRestrictToContactsIfNeeded() const {
kRelaxAfterSetVisibilityTimeout);
}
DeviceVisibility PairedKeyVerificationRunner::GetSignningVisibility() const {
// This matches the behavior of CertificateManagerImpl.getFileNameByVisibility
// in Android.
return DeviceVisibility::DEVICE_VISIBILITY_ALL_CONTACTS;
}
} // namespace sharing
} // namespace nearby
-2
View File
@@ -99,8 +99,6 @@ class PairedKeyVerificationRunner
void SendCertificateInfo();
bool RelaxRestrictToContactsIfNeeded() const;
proto::DeviceVisibility GetSignningVisibility() const;
nearby::Clock* const clock_;
nearby::DeviceInfo& device_info_;
NearbyShareSettings* nearby_share_settings_;