Send cert ids with BindingRequest message.

PiperOrigin-RevId: 949855518
This commit is contained in:
Francis Tsui
2026-07-17 18:18:15 -07:00
committed by Copybara-Service
parent 664513121d
commit bc15d624ac
9 changed files with 82 additions and 16 deletions
@@ -17,6 +17,7 @@
#include <stdint.h>
#include <optional>
#include <string>
#include <vector>
#include "absl/types/span.h"
@@ -73,6 +74,15 @@ NearbyShareCertificateManager::EncryptPrivateCertificateMetadataKey(
return encrypted_key;
}
std::optional<std::string>
NearbyShareCertificateManager::GetPrivateCertificateId(
DeviceVisibility visibility) {
std::optional<NearbySharePrivateCertificate> cert =
GetValidPrivateCertificate(visibility);
if (!cert) return std::nullopt;
return std::string(cert->id().begin(), cert->id().end());
}
std::optional<std::vector<uint8_t>>
NearbyShareCertificateManager::SignWithPrivateCertificate(
DeviceVisibility visibility, absl::Span<const uint8_t> payload) const {
@@ -81,6 +81,12 @@ class NearbyShareCertificateManager {
std::optional<NearbyShareEncryptedMetadataKey>
EncryptPrivateCertificateMetadataKey(proto::DeviceVisibility visibility);
// Returns the id of the currently valid private certificate with
// |visibility|, or absl::nullopt if there is no valid private certificate
// with |visibility|.
std::optional<std::string> GetPrivateCertificateId(
proto::DeviceVisibility visibility);
// Signs the input |payload| using the currently valid private certificate
// with |visibility|. Returns absl::nullopt if there is no valid private
// certificate with |visibility| or if the signing was unsuccessful.
@@ -636,6 +636,31 @@ TEST_F(NearbyShareCertificateManagerImplTest,
DeviceVisibility::DEVICE_VISIBILITY_ALL_CONTACTS));
}
TEST_F(NearbyShareCertificateManagerImplTest,
GetPrivateCertificateIdWithNoCertificates) {
Initialize();
cert_store_->ReplacePrivateCertificates({});
EXPECT_FALSE(cert_manager_->GetPrivateCertificateId(
DeviceVisibility::DEVICE_VISIBILITY_ALL_CONTACTS).has_value());
}
TEST_F(NearbyShareCertificateManagerImplTest,
GetPrivateCertificateIdWithValidCertificate) {
Initialize();
NearbySharePrivateCertificate private_certificate =
GetNearbyShareTestPrivateCertificate(
DeviceVisibility::DEVICE_VISIBILITY_ALL_CONTACTS);
cert_store_->ReplacePrivateCertificates({private_certificate});
FastForward(GetNearbyShareTestNotBefore() +
kNearbyShareCertificateValidityPeriod * 0.5 - Now());
ASSERT_TRUE(cert_manager_->GetPrivateCertificateId(
DeviceVisibility::DEVICE_VISIBILITY_ALL_CONTACTS).has_value());
EXPECT_EQ(cert_manager_->GetPrivateCertificateId(
DeviceVisibility::DEVICE_VISIBILITY_ALL_CONTACTS).value(),
std::string(private_certificate.id().begin(),
private_certificate.id().end()));
}
TEST_F(NearbyShareCertificateManagerImplTest, SignWithPrivateCertificate) {
Initialize();
NearbySharePrivateCertificate private_certificate =
+15 -1
View File
@@ -2761,6 +2761,20 @@ void NearbySharingServiceImpl::BeginOutgoingPairing(
});
}
std::vector<std::string> NearbySharingServiceImpl::GetCertIdsForSyncBinding() {
std::vector<std::string> cert_ids;
cert_ids.reserve(2);
if (auto id = certificate_manager_->GetPrivateCertificateId(
proto::DeviceVisibility::DEVICE_VISIBILITY_SELF_SHARE)) {
cert_ids.push_back(*id);
}
if (auto id = certificate_manager_->GetPrivateCertificateId(
proto::DeviceVisibility::DEVICE_VISIBILITY_ALL_CONTACTS)) {
cert_ids.push_back(*id);
}
return cert_ids;
}
void NearbySharingServiceImpl::OnInitiateSyncBindingResponse(
int64_t share_target_id, absl::StatusOr<std::string> binding_status) {
RunOnNearbySharingServiceThread(
@@ -2779,7 +2793,7 @@ void NearbySharingServiceImpl::OnInitiateSyncBindingResponse(
LOG(INFO) << __func__
<< ": Sync binding rpc succeeded: id=" << binding_id;
session->StartPeerBinding(
binding_id, BindingRequest::FILESYNC,
binding_id, BindingRequest::FILESYNC, GetCertIdsForSyncBinding(),
[this, share_target_id,
binding_id](BindingResponse::Status status) {
OnPeerSyncBindingComplete(share_target_id, binding_id, status);
+1
View File
@@ -409,6 +409,7 @@ class NearbySharingServiceImpl
bool OutgoingSessionAccept(OutgoingShareSession& session);
void OnIncomingFilesMetadataUpdated(int64_t share_target_id,
TransferMetadata metadata, bool success);
std::vector<std::string> GetCertIdsForSyncBinding();
// Called when InitiateBinding rpc returns.
void OnInitiateSyncBindingResponse(
int64_t share_target_id, absl::StatusOr<std::string> binding_status);
@@ -5179,6 +5179,7 @@ TEST_F(NearbySharingServiceImplTest,
EXPECT_EQ(frame->v1().bindings().binding_request().binding_id(), kBindingId);
EXPECT_EQ(frame->v1().bindings().binding_request().type(),
service::proto::BindingRequest::FILESYNC);
EXPECT_EQ(frame->v1().bindings().binding_request().cert_ids_size(), 2);
// BindingResponse frame timeout.
FastForward(absl::Seconds(60));
+3
View File
@@ -27,6 +27,7 @@
#include "absl/functional/any_invocable.h"
#include "absl/strings/string_view.h"
#include "absl/time/time.h"
#include "absl/types/span.h"
#include "internal/base/file_path.h"
#include "internal/base/files.h"
#include "internal/platform/clock.h"
@@ -647,6 +648,7 @@ OutgoingShareSession::ProcessPayloadTransferUpdates() {
void OutgoingShareSession::StartPeerBinding(
std::string binding_id, BindingRequest::Type binding_type,
absl::Span<const std::string> cert_ids,
absl::AnyInvocable<void(BindingResponse::Status)> callback) {
Frame frame;
frame.set_version(Frame::V1);
@@ -656,6 +658,7 @@ void OutgoingShareSession::StartPeerBinding(
v1_frame->mutable_bindings()->mutable_binding_request();
binding_request->set_binding_id(binding_id);
binding_request->set_type(binding_type);
binding_request->mutable_cert_ids()->Add(cert_ids.begin(), cert_ids.end());
WriteFrame(frame);
LOG(INFO) << "Waiting for bindings response frame from " << share_target().id;
UpdateTransferMetadata(
+4
View File
@@ -26,6 +26,7 @@
#include "absl/functional/any_invocable.h"
#include "absl/strings/string_view.h"
#include "absl/time/time.h"
#include "absl/types/span.h"
#include "internal/platform/clock.h"
#include "internal/platform/task_runner.h"
#include "sharing/analytics/analytics_recorder.h"
@@ -164,11 +165,14 @@ class OutgoingShareSession : public ShareSession {
// Initiates the peer binding message exchange with the remote device.
// `binding_id` is the result of a successful call to InitiateBinding rpc.
// `cert_ids` are the public certificate ids that can be used to identify this
// device.
// `callback` is called when either a BindingResponse frame is received or a
// timeout occurs.
void StartPeerBinding(
std::string binding_id,
nearby::sharing::service::proto::BindingRequest::Type binding_type,
absl::Span<const std::string> cert_ids,
absl::AnyInvocable<
void(nearby::sharing::service::proto::BindingResponse::Status)>
callback);
+17 -15
View File
@@ -928,6 +928,8 @@ TEST_F(OutgoingShareSessionTest, StartPeerBindingSuccess) {
binding_request {
binding_id: "test_binding_id"
type: FILESYNC
cert_ids: "cert_id_1"
cert_ids: "cert_id_2"
}
}
}
@@ -946,11 +948,11 @@ TEST_F(OutgoingShareSessionTest, StartPeerBindingSuccess) {
HasUsage(ShareSessionUsage::kPairing))));
BindingResponse::Status binding_response_status = BindingResponse::FAILURE;
session_.StartPeerBinding("test_binding_id", BindingRequest::FILESYNC,
[&binding_response_status](
BindingResponse::Status status) {
binding_response_status = status;
});
session_.StartPeerBinding(
"test_binding_id", BindingRequest::FILESYNC, {"cert_id_1", "cert_id_2"},
[&binding_response_status](BindingResponse::Status status) {
binding_response_status = status;
});
Frame frame;
ASSERT_THAT(frame.ParseFromArray(frame_data.data(), frame_data.size()),
@@ -1014,11 +1016,11 @@ TEST_F(OutgoingShareSessionTest, StartPeerBindingTimeout) {
HasUsage(ShareSessionUsage::kPairing))));
BindingResponse::Status binding_response_status = BindingResponse::FAILURE;
session_.StartPeerBinding("test_binding_id", BindingRequest::FILESYNC,
[&binding_response_status](
BindingResponse::Status status) {
binding_response_status = status;
});
session_.StartPeerBinding(
"test_binding_id", BindingRequest::FILESYNC, {},
[&binding_response_status](BindingResponse::Status status) {
binding_response_status = status;
});
Frame frame;
ASSERT_THAT(frame.ParseFromArray(frame_data.data(), frame_data.size()),
@@ -1065,11 +1067,11 @@ TEST_F(OutgoingShareSessionTest, StartPeerBindingFailure) {
HasUsage(ShareSessionUsage::kPairing))));
BindingResponse::Status binding_response_status = BindingResponse::FAILURE;
session_.StartPeerBinding("test_binding_id", BindingRequest::FILESYNC,
[&binding_response_status](
BindingResponse::Status status) {
binding_response_status = status;
});
session_.StartPeerBinding(
"test_binding_id", BindingRequest::FILESYNC, {},
[&binding_response_status](BindingResponse::Status status) {
binding_response_status = status;
});
Frame frame;
ASSERT_THAT(frame.ParseFromArray(frame_data.data(), frame_data.size()),