xref: /aosp_15_r20/external/anonymous-counting-tokens/act/act_v0/testing/generate_transcript.cc (revision a26f13018b999b025c962678da434c0a5aec4dae)
1 /*
2  * Copyright 2023 Google LLC.
3  * Licensed under the Apache License, Version 2.0 (the "License");
4  * you may not use this file except in compliance with the License.
5  * You may obtain a copy of the License at
6  *
7  *     https://www.apache.org/licenses/LICENSE-2.0
8  *
9  * Unless required by applicable law or agreed to in writing, software
10  * distributed under the License is distributed on an "AS IS" BASIS,
11  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
12  * See the License for the specific language governing permissions and
13  * limitations under the License.
14  */
15 
16 #include <cstddef>
17 #include <string>
18 #include <tuple>
19 #include <vector>
20 
21 #include "absl/flags/flag.h"
22 #include "absl/flags/parse.h"
23 #include "absl/log/check.h"
24 #include "absl/log/log.h"
25 #include "absl/strings/str_cat.h"
26 #include "absl/strings/string_view.h"
27 #include "act/act.h"
28 #include "act/act.pb.h"
29 #include "act/act_v0/act_v0.h"
30 #include "act/act_v0/act_v0.pb.h"
31 #include "act/act_v0/parameters.h"
32 #include "act/act_v0/testing/transcript.pb.h"
33 #include "private_join_and_compute/util/proto_util.h"
34 #include "private_join_and_compute/util/status.inc"
35 
36 ABSL_FLAG(std::string, transcript_path, "",
37           "Prefix of file to which the generated transcript will be "
38           "written/read from.");
39 
40 ABSL_FLAG(bool, verify, false,
41           "If true, will attempt to read the transcript from the specified "
42           "path to verify it.");
43 
44 namespace private_join_and_compute {
45 namespace anonymous_counting_tokens {
46 namespace {
47 
GenerateTranscript(absl::string_view transcript_path)48 absl::Status GenerateTranscript(absl::string_view transcript_path) {
49   SchemeParameters scheme_parameters =
50       private_join_and_compute::anonymous_counting_tokens::
51           ActV0SchemeParametersPedersen32Modulus2048CamenischShoupVector2();
52   auto act = AnonymousCountingTokensV0::Create();
53 
54   ASSIGN_OR_RETURN(ServerParameters server_parameters,
55                    act->GenerateServerParameters(scheme_parameters));
56   ASSIGN_OR_RETURN(
57       ClientParameters client_parameters,
58       act->GenerateClientParameters(scheme_parameters,
59                                     server_parameters.public_parameters()));
60   std::vector<std::string> messages;
61   size_t num_messages =
62       scheme_parameters.scheme_parameters_v0().pedersen_batch_size();
63   messages.reserve(num_messages);
64   for (int i = 0; i < num_messages; ++i) {
65     messages.push_back(absl::StrCat("message", i));
66   }
67   std::vector<std::string> client_fingerprints;
68   TokensRequest tokens_request;
69   TokensRequestPrivateState tokens_request_private_state;
70   ASSIGN_OR_RETURN(
71       std::tie(client_fingerprints, tokens_request,
72                tokens_request_private_state),
73       act->GenerateTokensRequest(messages, scheme_parameters,
74                                  client_parameters.public_parameters(),
75                                  client_parameters.private_parameters(),
76                                  server_parameters.public_parameters()));
77 
78   ASSIGN_OR_RETURN(
79       TokensResponse tokens_response,
80       act->GenerateTokensResponse(tokens_request, scheme_parameters,
81                                   client_parameters.public_parameters(),
82                                   server_parameters.public_parameters(),
83                                   server_parameters.private_parameters()));
84 
85   ASSIGN_OR_RETURN(
86       std::vector<Token> tokens,
87       act->RecoverTokens(messages, tokens_request, tokens_request_private_state,
88                          tokens_response, scheme_parameters,
89                          client_parameters.public_parameters(),
90                          client_parameters.private_parameters(),
91                          server_parameters.public_parameters()));
92 
93   Transcript transcript;
94   *transcript.mutable_scheme_parameters() = scheme_parameters;
95   *transcript.mutable_server_parameters() = server_parameters;
96   *transcript.mutable_client_parameters() = client_parameters;
97   *transcript.mutable_messages() = {messages.begin(), messages.end()};
98   *transcript.mutable_fingerprints() = {client_fingerprints.begin(),
99                                         client_fingerprints.end()};
100   *transcript.mutable_tokens_request() = tokens_request;
101   *transcript.mutable_tokens_request_private_state() =
102       tokens_request_private_state;
103   *transcript.mutable_tokens_response() = tokens_response;
104   *transcript.mutable_tokens() = {tokens.begin(), tokens.end()};
105 
106   return ProtoUtils::WriteProtoToFile(transcript, transcript_path);
107 }
108 
VerifyTranscript(absl::string_view transcript_path)109 absl::Status VerifyTranscript(absl::string_view transcript_path) {
110   ASSIGN_OR_RETURN(Transcript transcript,
111                    ProtoUtils::ReadProtoFromFile<Transcript>(transcript_path));
112 
113   auto act = AnonymousCountingTokensV0::Create();
114 
115   if (!transcript.has_scheme_parameters() ||
116       !transcript.scheme_parameters().has_scheme_parameters_v0() ||
117       transcript.scheme_parameters()
118               .scheme_parameters_v0()
119               .pedersen_batch_size() <= 0) {
120     return InvalidArgumentError(
121         "VerifyTranscript: transcript should have a SchemeParametersV0 with a "
122         "positive pedersen_batch_size.");
123   }
124 
125   RETURN_IF_ERROR(act->CheckClientParameters(
126       transcript.scheme_parameters(),
127       transcript.client_parameters().public_parameters(),
128       transcript.server_parameters().public_parameters(),
129       transcript.server_parameters().private_parameters()));
130 
131   std::vector<std::string> client_fingerprints(
132       transcript.fingerprints().begin(), transcript.fingerprints().end());
133   RETURN_IF_ERROR(act->CheckTokensRequest(
134       client_fingerprints, transcript.tokens_request(),
135       transcript.scheme_parameters(),
136       transcript.client_parameters().public_parameters(),
137       transcript.server_parameters().public_parameters(),
138       transcript.server_parameters().private_parameters()));
139 
140   std::vector<std::string> messages(transcript.messages().begin(),
141                                     transcript.messages().end());
142   RETURN_IF_ERROR(act->VerifyTokensResponse(
143       messages, transcript.tokens_request(),
144       transcript.tokens_request_private_state(), transcript.tokens_response(),
145       transcript.scheme_parameters(),
146       transcript.client_parameters().public_parameters(),
147       transcript.client_parameters().private_parameters(),
148       transcript.server_parameters().public_parameters()));
149 
150   return OkStatus();
151 }
152 
153 }  // namespace
154 }  // namespace anonymous_counting_tokens
155 }  // namespace private_join_and_compute
156 
main(int argc,char ** argv)157 int main(int argc, char** argv) {
158   absl::ParseCommandLine(argc, argv);
159   std::string transcript_path = absl::GetFlag(FLAGS_transcript_path);
160 
161   bool verify = absl::GetFlag(FLAGS_verify);
162   if (verify) {
163     CHECK_OK(
164         private_join_and_compute::anonymous_counting_tokens::VerifyTranscript(
165             transcript_path));
166     LOG(INFO) << "Successfully verified transcript.";
167   } else {
168     CHECK_OK(
169         private_join_and_compute::anonymous_counting_tokens::GenerateTranscript(
170             transcript_path));
171     LOG(INFO) << "Successfully generated transcript.";
172   }
173 
174   return 0;
175 }
176