1*14675a02SAndroid Build Coastguard Worker /*
2*14675a02SAndroid Build Coastguard Worker * Copyright 2018 Google LLC
3*14675a02SAndroid Build Coastguard Worker *
4*14675a02SAndroid Build Coastguard Worker * Licensed under the Apache License, Version 2.0 (the "License");
5*14675a02SAndroid Build Coastguard Worker * you may not use this file except in compliance with the License.
6*14675a02SAndroid Build Coastguard Worker * You may obtain a copy of the License at
7*14675a02SAndroid Build Coastguard Worker *
8*14675a02SAndroid Build Coastguard Worker * http://www.apache.org/licenses/LICENSE-2.0
9*14675a02SAndroid Build Coastguard Worker *
10*14675a02SAndroid Build Coastguard Worker * Unless required by applicable law or agreed to in writing, software
11*14675a02SAndroid Build Coastguard Worker * distributed under the License is distributed on an "AS IS" BASIS,
12*14675a02SAndroid Build Coastguard Worker * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13*14675a02SAndroid Build Coastguard Worker * See the License for the specific language governing permissions and
14*14675a02SAndroid Build Coastguard Worker * limitations under the License.
15*14675a02SAndroid Build Coastguard Worker */
16*14675a02SAndroid Build Coastguard Worker
17*14675a02SAndroid Build Coastguard Worker #include "fcp/secagg/client/secagg_client.h"
18*14675a02SAndroid Build Coastguard Worker
19*14675a02SAndroid Build Coastguard Worker #include <memory>
20*14675a02SAndroid Build Coastguard Worker #include <string>
21*14675a02SAndroid Build Coastguard Worker #include <unordered_map>
22*14675a02SAndroid Build Coastguard Worker #include <utility>
23*14675a02SAndroid Build Coastguard Worker #include <vector>
24*14675a02SAndroid Build Coastguard Worker
25*14675a02SAndroid Build Coastguard Worker #include "absl/synchronization/mutex.h"
26*14675a02SAndroid Build Coastguard Worker #include "fcp/base/monitoring.h"
27*14675a02SAndroid Build Coastguard Worker #include "fcp/secagg/client/secagg_client_r0_advertise_keys_input_not_set_state.h"
28*14675a02SAndroid Build Coastguard Worker #include "fcp/secagg/client/secagg_client_state.h"
29*14675a02SAndroid Build Coastguard Worker #include "fcp/secagg/client/send_to_server_interface.h"
30*14675a02SAndroid Build Coastguard Worker #include "fcp/secagg/client/state_transition_listener_interface.h"
31*14675a02SAndroid Build Coastguard Worker #include "fcp/secagg/shared/aes_prng_factory.h"
32*14675a02SAndroid Build Coastguard Worker #include "fcp/secagg/shared/async_abort.h"
33*14675a02SAndroid Build Coastguard Worker #include "fcp/secagg/shared/input_vector_specification.h"
34*14675a02SAndroid Build Coastguard Worker #include "fcp/secagg/shared/prng.h"
35*14675a02SAndroid Build Coastguard Worker #include "fcp/secagg/shared/secagg_messages.pb.h"
36*14675a02SAndroid Build Coastguard Worker #include "fcp/secagg/shared/secagg_vector.h"
37*14675a02SAndroid Build Coastguard Worker
38*14675a02SAndroid Build Coastguard Worker namespace fcp {
39*14675a02SAndroid Build Coastguard Worker namespace secagg {
40*14675a02SAndroid Build Coastguard Worker
SecAggClient(int max_neighbors_expected,int minimum_surviving_neighbors_for_reconstruction,std::vector<InputVectorSpecification> input_vector_specs,std::unique_ptr<SecurePrng> prng,std::unique_ptr<SendToServerInterface> sender,std::unique_ptr<StateTransitionListenerInterface> transition_listener,std::unique_ptr<AesPrngFactory> prng_factory,std::atomic<std::string * > * abort_signal_for_test)41*14675a02SAndroid Build Coastguard Worker SecAggClient::SecAggClient(
42*14675a02SAndroid Build Coastguard Worker int max_neighbors_expected,
43*14675a02SAndroid Build Coastguard Worker int minimum_surviving_neighbors_for_reconstruction,
44*14675a02SAndroid Build Coastguard Worker std::vector<InputVectorSpecification> input_vector_specs,
45*14675a02SAndroid Build Coastguard Worker std::unique_ptr<SecurePrng> prng,
46*14675a02SAndroid Build Coastguard Worker std::unique_ptr<SendToServerInterface> sender,
47*14675a02SAndroid Build Coastguard Worker std::unique_ptr<StateTransitionListenerInterface> transition_listener,
48*14675a02SAndroid Build Coastguard Worker std::unique_ptr<AesPrngFactory> prng_factory,
49*14675a02SAndroid Build Coastguard Worker std::atomic<std::string*>* abort_signal_for_test)
50*14675a02SAndroid Build Coastguard Worker : mu_(),
51*14675a02SAndroid Build Coastguard Worker abort_signal_(nullptr),
52*14675a02SAndroid Build Coastguard Worker async_abort_(abort_signal_for_test ? abort_signal_for_test
53*14675a02SAndroid Build Coastguard Worker : &abort_signal_),
54*14675a02SAndroid Build Coastguard Worker state_(std::make_unique<SecAggClientR0AdvertiseKeysInputNotSetState>(
55*14675a02SAndroid Build Coastguard Worker max_neighbors_expected,
56*14675a02SAndroid Build Coastguard Worker minimum_surviving_neighbors_for_reconstruction,
57*14675a02SAndroid Build Coastguard Worker std::make_unique<std::vector<InputVectorSpecification> >(
58*14675a02SAndroid Build Coastguard Worker std::move(input_vector_specs)),
59*14675a02SAndroid Build Coastguard Worker std::move(prng), std::move(sender), std::move(transition_listener),
60*14675a02SAndroid Build Coastguard Worker std::move(prng_factory), &async_abort_)) {}
61*14675a02SAndroid Build Coastguard Worker
Start()62*14675a02SAndroid Build Coastguard Worker Status SecAggClient::Start() {
63*14675a02SAndroid Build Coastguard Worker absl::WriterMutexLock _(&mu_);
64*14675a02SAndroid Build Coastguard Worker auto state_or_error = state_->Start();
65*14675a02SAndroid Build Coastguard Worker if (state_or_error.ok()) {
66*14675a02SAndroid Build Coastguard Worker state_ = std::move(state_or_error.value());
67*14675a02SAndroid Build Coastguard Worker }
68*14675a02SAndroid Build Coastguard Worker return state_or_error.status();
69*14675a02SAndroid Build Coastguard Worker }
70*14675a02SAndroid Build Coastguard Worker
Abort()71*14675a02SAndroid Build Coastguard Worker Status SecAggClient::Abort() { return Abort("unknown reason"); }
72*14675a02SAndroid Build Coastguard Worker
Abort(const std::string & reason)73*14675a02SAndroid Build Coastguard Worker Status SecAggClient::Abort(const std::string& reason) {
74*14675a02SAndroid Build Coastguard Worker async_abort_.Abort(reason);
75*14675a02SAndroid Build Coastguard Worker absl::WriterMutexLock _(&mu_);
76*14675a02SAndroid Build Coastguard Worker if (state_->IsAborted() || state_->IsCompletedSuccessfully())
77*14675a02SAndroid Build Coastguard Worker return FCP_STATUS(OK);
78*14675a02SAndroid Build Coastguard Worker
79*14675a02SAndroid Build Coastguard Worker auto state_or_error = state_->Abort(reason);
80*14675a02SAndroid Build Coastguard Worker if (state_or_error.ok()) {
81*14675a02SAndroid Build Coastguard Worker state_ = std::move(state_or_error.value());
82*14675a02SAndroid Build Coastguard Worker }
83*14675a02SAndroid Build Coastguard Worker return state_or_error.status();
84*14675a02SAndroid Build Coastguard Worker }
85*14675a02SAndroid Build Coastguard Worker
SetInput(std::unique_ptr<SecAggVectorMap> input_map)86*14675a02SAndroid Build Coastguard Worker Status SecAggClient::SetInput(std::unique_ptr<SecAggVectorMap> input_map) {
87*14675a02SAndroid Build Coastguard Worker absl::WriterMutexLock _(&mu_);
88*14675a02SAndroid Build Coastguard Worker auto state_or_error = state_->SetInput(std::move(input_map));
89*14675a02SAndroid Build Coastguard Worker if (state_or_error.ok()) {
90*14675a02SAndroid Build Coastguard Worker state_ = std::move(state_or_error.value());
91*14675a02SAndroid Build Coastguard Worker }
92*14675a02SAndroid Build Coastguard Worker return state_or_error.status();
93*14675a02SAndroid Build Coastguard Worker }
94*14675a02SAndroid Build Coastguard Worker
ReceiveMessage(const ServerToClientWrapperMessage & incoming)95*14675a02SAndroid Build Coastguard Worker StatusOr<bool> SecAggClient::ReceiveMessage(
96*14675a02SAndroid Build Coastguard Worker const ServerToClientWrapperMessage& incoming) {
97*14675a02SAndroid Build Coastguard Worker absl::WriterMutexLock _(&mu_);
98*14675a02SAndroid Build Coastguard Worker auto state_or_error = state_->HandleMessage(incoming);
99*14675a02SAndroid Build Coastguard Worker if (state_or_error.ok()) {
100*14675a02SAndroid Build Coastguard Worker state_ = std::move(state_or_error.value());
101*14675a02SAndroid Build Coastguard Worker // Return true iff neither aborted nor completed.
102*14675a02SAndroid Build Coastguard Worker return !(state_->IsAborted() || state_->IsCompletedSuccessfully());
103*14675a02SAndroid Build Coastguard Worker } else {
104*14675a02SAndroid Build Coastguard Worker return state_or_error.status();
105*14675a02SAndroid Build Coastguard Worker }
106*14675a02SAndroid Build Coastguard Worker }
107*14675a02SAndroid Build Coastguard Worker
ErrorMessage() const108*14675a02SAndroid Build Coastguard Worker StatusOr<std::string> SecAggClient::ErrorMessage() const {
109*14675a02SAndroid Build Coastguard Worker absl::ReaderMutexLock _(&mu_);
110*14675a02SAndroid Build Coastguard Worker return state_->ErrorMessage();
111*14675a02SAndroid Build Coastguard Worker }
112*14675a02SAndroid Build Coastguard Worker
IsAborted() const113*14675a02SAndroid Build Coastguard Worker bool SecAggClient::IsAborted() const {
114*14675a02SAndroid Build Coastguard Worker absl::ReaderMutexLock _(&mu_);
115*14675a02SAndroid Build Coastguard Worker return state_->IsAborted();
116*14675a02SAndroid Build Coastguard Worker }
117*14675a02SAndroid Build Coastguard Worker
IsCompletedSuccessfully() const118*14675a02SAndroid Build Coastguard Worker bool SecAggClient::IsCompletedSuccessfully() const {
119*14675a02SAndroid Build Coastguard Worker absl::ReaderMutexLock _(&mu_);
120*14675a02SAndroid Build Coastguard Worker return state_->IsCompletedSuccessfully();
121*14675a02SAndroid Build Coastguard Worker }
122*14675a02SAndroid Build Coastguard Worker
State() const123*14675a02SAndroid Build Coastguard Worker std::string SecAggClient::State() const {
124*14675a02SAndroid Build Coastguard Worker absl::ReaderMutexLock _(&mu_);
125*14675a02SAndroid Build Coastguard Worker return state_->StateName();
126*14675a02SAndroid Build Coastguard Worker }
127*14675a02SAndroid Build Coastguard Worker
128*14675a02SAndroid Build Coastguard Worker } // namespace secagg
129*14675a02SAndroid Build Coastguard Worker } // namespace fcp
130