xref: /aosp_15_r20/external/anonymous-counting-tokens/act/act_v0/parameters_test.cc (revision a26f13018b999b025c962678da434c0a5aec4dae)
1*a26f1301SXin Li /*
2*a26f1301SXin Li  * Copyright 2023 Google LLC.
3*a26f1301SXin Li  * Licensed under the Apache License, Version 2.0 (the "License");
4*a26f1301SXin Li  * you may not use this file except in compliance with the License.
5*a26f1301SXin Li  * You may obtain a copy of the License at
6*a26f1301SXin Li  *
7*a26f1301SXin Li  *     https://www.apache.org/licenses/LICENSE-2.0
8*a26f1301SXin Li  *
9*a26f1301SXin Li  * Unless required by applicable law or agreed to in writing, software
10*a26f1301SXin Li  * distributed under the License is distributed on an "AS IS" BASIS,
11*a26f1301SXin Li  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
12*a26f1301SXin Li  * See the License for the specific language governing permissions and
13*a26f1301SXin Li  * limitations under the License.
14*a26f1301SXin Li  */
15*a26f1301SXin Li 
16*a26f1301SXin Li #include "act/act_v0/parameters.h"
17*a26f1301SXin Li 
18*a26f1301SXin Li #include <gmock/gmock.h>
19*a26f1301SXin Li #include <gtest/gtest.h>
20*a26f1301SXin Li 
21*a26f1301SXin Li #include <memory>
22*a26f1301SXin Li #include <string>
23*a26f1301SXin Li #include <utility>
24*a26f1301SXin Li #include <vector>
25*a26f1301SXin Li 
26*a26f1301SXin Li #include "act/act.h"
27*a26f1301SXin Li #include "act/act.pb.h"
28*a26f1301SXin Li #include "act/act_v0/act_v0.h"
29*a26f1301SXin Li #include "private_join_and_compute/util/status.inc"
30*a26f1301SXin Li #include "private_join_and_compute/util/status_testing.inc"
31*a26f1301SXin Li 
32*a26f1301SXin Li namespace private_join_and_compute {
33*a26f1301SXin Li namespace anonymous_counting_tokens {
34*a26f1301SXin Li namespace {
35*a26f1301SXin Li 
36*a26f1301SXin Li 
EndToEndTest(SchemeParameters scheme_parameters,int num_messages)37*a26f1301SXin Li Status EndToEndTest(SchemeParameters scheme_parameters, int num_messages) {
38*a26f1301SXin Li   std::unique_ptr<AnonymousCountingTokens> act =
39*a26f1301SXin Li       AnonymousCountingTokensV0::Create();
40*a26f1301SXin Li 
41*a26f1301SXin Li   // Generate server parameters.
42*a26f1301SXin Li   ASSIGN_OR_RETURN(ServerParameters server_parameters,
43*a26f1301SXin Li                    act->GenerateServerParameters(scheme_parameters));
44*a26f1301SXin Li 
45*a26f1301SXin Li 
46*a26f1301SXin Li   // Generate client parameters and check them.
47*a26f1301SXin Li   ASSIGN_OR_RETURN(
48*a26f1301SXin Li       ClientParameters client_parameters,
49*a26f1301SXin Li       act->GenerateClientParameters(scheme_parameters,
50*a26f1301SXin Li                                     server_parameters.public_parameters()));
51*a26f1301SXin Li 
52*a26f1301SXin Li   RETURN_IF_ERROR(act->CheckClientParameters(
53*a26f1301SXin Li       scheme_parameters, client_parameters.public_parameters(),
54*a26f1301SXin Li       server_parameters.public_parameters(),
55*a26f1301SXin Li       server_parameters.private_parameters()));
56*a26f1301SXin Li 
57*a26f1301SXin Li   // Generate messages.
58*a26f1301SXin Li   std::vector<std::string> messages;
59*a26f1301SXin Li   messages.reserve(num_messages);
60*a26f1301SXin Li   for (int i = 0; i < num_messages; ++i) {
61*a26f1301SXin Li     messages.push_back(absl::StrCat("message", i));
62*a26f1301SXin Li   }
63*a26f1301SXin Li 
64*a26f1301SXin Li   // Generate Tokens Request and check it.
65*a26f1301SXin Li   std::vector<std::string> client_fingerprints;
66*a26f1301SXin Li   TokensRequest tokens_request;
67*a26f1301SXin Li   TokensRequestPrivateState tokens_request_private_state;
68*a26f1301SXin Li   ASSIGN_OR_RETURN(
69*a26f1301SXin Li       std::tie(client_fingerprints, tokens_request,
70*a26f1301SXin Li                tokens_request_private_state),
71*a26f1301SXin Li       act->GenerateTokensRequest(messages, scheme_parameters,
72*a26f1301SXin Li                                  client_parameters.public_parameters(),
73*a26f1301SXin Li                                  client_parameters.private_parameters(),
74*a26f1301SXin Li                                  server_parameters.public_parameters()));
75*a26f1301SXin Li 
76*a26f1301SXin Li   RETURN_IF_ERROR(act->CheckTokensRequest(
77*a26f1301SXin Li       client_fingerprints, tokens_request, scheme_parameters,
78*a26f1301SXin Li       client_parameters.public_parameters(),
79*a26f1301SXin Li       server_parameters.public_parameters(),
80*a26f1301SXin Li       server_parameters.private_parameters()));
81*a26f1301SXin Li 
82*a26f1301SXin Li   // Generate Tokens Response and check it.
83*a26f1301SXin Li   ASSIGN_OR_RETURN(
84*a26f1301SXin Li       TokensResponse tokens_response,
85*a26f1301SXin Li       act->GenerateTokensResponse(tokens_request, scheme_parameters,
86*a26f1301SXin Li                                   client_parameters.public_parameters(),
87*a26f1301SXin Li                                   server_parameters.public_parameters(),
88*a26f1301SXin Li                                   server_parameters.private_parameters()));
89*a26f1301SXin Li 
90*a26f1301SXin Li   RETURN_IF_ERROR(act->VerifyTokensResponse(
91*a26f1301SXin Li       messages, tokens_request, tokens_request_private_state, tokens_response,
92*a26f1301SXin Li       scheme_parameters, client_parameters.public_parameters(),
93*a26f1301SXin Li       client_parameters.private_parameters(),
94*a26f1301SXin Li       server_parameters.public_parameters()));
95*a26f1301SXin Li 
96*a26f1301SXin Li   // Extract Tokens.
97*a26f1301SXin Li   ASSIGN_OR_RETURN(
98*a26f1301SXin Li       std::vector<Token> tokens,
99*a26f1301SXin Li       act->RecoverTokens(messages, tokens_request, tokens_request_private_state,
100*a26f1301SXin Li                          tokens_response, scheme_parameters,
101*a26f1301SXin Li                          client_parameters.public_parameters(),
102*a26f1301SXin Li                          client_parameters.private_parameters(),
103*a26f1301SXin Li                          server_parameters.public_parameters()));
104*a26f1301SXin Li 
105*a26f1301SXin Li   // Verify Tokens.
106*a26f1301SXin Li   if (tokens.size() != num_messages) {
107*a26f1301SXin Li     return absl::InvalidArgumentError("Wrong number of tokens produced");
108*a26f1301SXin Li   }
109*a26f1301SXin Li   for (int i = 0; i < num_messages; ++i) {
110*a26f1301SXin Li     RETURN_IF_ERROR(act->VerifyToken(messages[i], tokens[i], scheme_parameters,
111*a26f1301SXin Li                                      server_parameters.public_parameters(),
112*a26f1301SXin Li                                      server_parameters.private_parameters()));
113*a26f1301SXin Li   }
114*a26f1301SXin Li   return absl::OkStatus();
115*a26f1301SXin Li }
116*a26f1301SXin Li 
TEST(ActV0ParametersTest,EndToEndWithTestParameters)117*a26f1301SXin Li TEST(ActV0ParametersTest, EndToEndWithTestParameters) {
118*a26f1301SXin Li   EXPECT_OK(EndToEndTest(ActV0TestSchemeParameters(), 3));
119*a26f1301SXin Li }
120*a26f1301SXin Li 
TEST(ActV0ParametersTest,EndToEndWithBatch16Parameters)121*a26f1301SXin Li TEST(ActV0ParametersTest, EndToEndWithBatch16Parameters) {
122*a26f1301SXin Li   EXPECT_OK(EndToEndTest(ActV0Batch16SchemeParameters(), 16));
123*a26f1301SXin Li }
124*a26f1301SXin Li 
TEST(ActV0ParametersTest,EndToEndWithBatch32Parameters)125*a26f1301SXin Li TEST(ActV0ParametersTest, EndToEndWithBatch32Parameters) {
126*a26f1301SXin Li   EXPECT_OK(EndToEndTest(ActV0Batch32SchemeParameters(), 32));
127*a26f1301SXin Li }
128*a26f1301SXin Li 
TEST(ActV0ParametersTest,EndToEndWithBatch32Cs2Modulus2048Parameters)129*a26f1301SXin Li TEST(ActV0ParametersTest, EndToEndWithBatch32Cs2Modulus2048Parameters) {
130*a26f1301SXin Li   EXPECT_OK(EndToEndTest(
131*a26f1301SXin Li       ActV0SchemeParametersPedersen32Modulus2048CamenischShoupVector2(), 32));
132*a26f1301SXin Li }
133*a26f1301SXin Li 
TEST(ActV0ParametersTest,EndToEndWithCustomParameters)134*a26f1301SXin Li TEST(ActV0ParametersTest, EndToEndWithCustomParameters) {
135*a26f1301SXin Li   int pedersen_batch_size = 32;
136*a26f1301SXin Li   int modulus_length_bits = 1576;
137*a26f1301SXin Li   int camenisch_shoup_vector_length = 2;
138*a26f1301SXin Li   EXPECT_OK(EndToEndTest(
139*a26f1301SXin Li       ActV0SchemeParameters(pedersen_batch_size, modulus_length_bits,
140*a26f1301SXin Li                             camenisch_shoup_vector_length),
141*a26f1301SXin Li       32));
142*a26f1301SXin Li }
143*a26f1301SXin Li 
144*a26f1301SXin Li // More extensive tests are in act_v0_test.cc. These tests simply ensure that
145*a26f1301SXin Li // the parameters are functional.
146*a26f1301SXin Li 
147*a26f1301SXin Li }  // namespace
148*a26f1301SXin Li }  // namespace anonymous_counting_tokens
149*a26f1301SXin Li }  // namespace private_join_and_compute
150