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