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/fake_act.h"
17*a26f1301SXin Li
18*a26f1301SXin Li #include <memory>
19*a26f1301SXin Li #include <string>
20*a26f1301SXin Li #include <tuple>
21*a26f1301SXin Li #include <utility>
22*a26f1301SXin Li #include <vector>
23*a26f1301SXin Li
24*a26f1301SXin Li #include "act/act.pb.h"
25*a26f1301SXin Li #include "private_join_and_compute/crypto/context.h"
26*a26f1301SXin Li
27*a26f1301SXin Li namespace private_join_and_compute {
28*a26f1301SXin Li namespace anonymous_counting_tokens {
29*a26f1301SXin Li
30*a26f1301SXin Li // Returns an instance of FakeAnonymousCountingTokens.
Create()31*a26f1301SXin Li std::unique_ptr<AnonymousCountingTokens> FakeAnonymousCountingTokens::Create() {
32*a26f1301SXin Li return absl::WrapUnique<FakeAnonymousCountingTokens>(
33*a26f1301SXin Li new FakeAnonymousCountingTokens());
34*a26f1301SXin Li }
35*a26f1301SXin Li
36*a26f1301SXin Li // Returns empty Server parameters.
37*a26f1301SXin Li StatusOr<ServerParameters>
GenerateServerParameters(const SchemeParameters & scheme_parameters)38*a26f1301SXin Li FakeAnonymousCountingTokens::GenerateServerParameters(
39*a26f1301SXin Li const SchemeParameters& scheme_parameters) {
40*a26f1301SXin Li return ServerParameters::default_instance();
41*a26f1301SXin Li }
42*a26f1301SXin Li
43*a26f1301SXin Li // Returns empty Client parameters.
44*a26f1301SXin Li StatusOr<ClientParameters>
GenerateClientParameters(const SchemeParameters & scheme_parameters,const ServerPublicParameters & server_public_parameters)45*a26f1301SXin Li FakeAnonymousCountingTokens::GenerateClientParameters(
46*a26f1301SXin Li const SchemeParameters& scheme_parameters,
47*a26f1301SXin Li const ServerPublicParameters& server_public_parameters) {
48*a26f1301SXin Li return ClientParameters::default_instance();
49*a26f1301SXin Li }
50*a26f1301SXin Li
51*a26f1301SXin Li // Always returns "Ok".
CheckClientParameters(const SchemeParameters & scheme_parameters,const ClientPublicParameters & client_public_parameters,const ServerPublicParameters & server_public_parameters,const ServerPrivateParameters & server_private_parameters)52*a26f1301SXin Li Status FakeAnonymousCountingTokens::CheckClientParameters(
53*a26f1301SXin Li const SchemeParameters& scheme_parameters,
54*a26f1301SXin Li const ClientPublicParameters& client_public_parameters,
55*a26f1301SXin Li const ServerPublicParameters& server_public_parameters,
56*a26f1301SXin Li const ServerPrivateParameters& server_private_parameters) {
57*a26f1301SXin Li return absl::OkStatus();
58*a26f1301SXin Li }
59*a26f1301SXin Li
60*a26f1301SXin Li // For this fake implementation, the client fingerprints are the same as the
61*a26f1301SXin Li // messages (this is insecure).
62*a26f1301SXin Li StatusOr<std::tuple<std::vector<std::string>, TokensRequest,
63*a26f1301SXin Li TokensRequestPrivateState>>
GenerateTokensRequest(absl::Span<const std::string> messages,const SchemeParameters & scheme_parameters,const ClientPublicParameters & client_public_parameters,const ClientPrivateParameters & client_private_parameters,const ServerPublicParameters & server_public_parameters)64*a26f1301SXin Li FakeAnonymousCountingTokens::GenerateTokensRequest(
65*a26f1301SXin Li absl::Span<const std::string> messages,
66*a26f1301SXin Li const SchemeParameters& scheme_parameters,
67*a26f1301SXin Li const ClientPublicParameters& client_public_parameters,
68*a26f1301SXin Li const ClientPrivateParameters& client_private_parameters,
69*a26f1301SXin Li const ServerPublicParameters& server_public_parameters) {
70*a26f1301SXin Li return std::make_tuple(
71*a26f1301SXin Li std::vector<std::string>(messages.begin(), messages.end()),
72*a26f1301SXin Li TokensRequest::default_instance(),
73*a26f1301SXin Li TokensRequestPrivateState::default_instance());
74*a26f1301SXin Li }
75*a26f1301SXin Li
76*a26f1301SXin Li // Always returns "Ok".
CheckTokensRequest(absl::Span<const std::string> client_fingerprints,const TokensRequest & tokens_request,const SchemeParameters & scheme_parameters,const ClientPublicParameters & client_public_parameters,const ServerPublicParameters & server_public_parameters,const ServerPrivateParameters & server_private_parameters)77*a26f1301SXin Li Status FakeAnonymousCountingTokens::CheckTokensRequest(
78*a26f1301SXin Li absl::Span<const std::string> client_fingerprints,
79*a26f1301SXin Li const TokensRequest& tokens_request,
80*a26f1301SXin Li const SchemeParameters& scheme_parameters,
81*a26f1301SXin Li const ClientPublicParameters& client_public_parameters,
82*a26f1301SXin Li const ServerPublicParameters& server_public_parameters,
83*a26f1301SXin Li const ServerPrivateParameters& server_private_parameters) {
84*a26f1301SXin Li return absl::OkStatus();
85*a26f1301SXin Li }
86*a26f1301SXin Li
87*a26f1301SXin Li // Returns an empty TokensResponse.
GenerateTokensResponse(const TokensRequest & tokens_request,const SchemeParameters & scheme_parameters,const ClientPublicParameters & client_public_parameters,const ServerPublicParameters & server_public_parameters,const ServerPrivateParameters & server_private_parameters)88*a26f1301SXin Li StatusOr<TokensResponse> FakeAnonymousCountingTokens::GenerateTokensResponse(
89*a26f1301SXin Li const TokensRequest& tokens_request,
90*a26f1301SXin Li const SchemeParameters& scheme_parameters,
91*a26f1301SXin Li const ClientPublicParameters& client_public_parameters,
92*a26f1301SXin Li const ServerPublicParameters& server_public_parameters,
93*a26f1301SXin Li const ServerPrivateParameters& server_private_parameters) {
94*a26f1301SXin Li return TokensResponse::default_instance();
95*a26f1301SXin Li }
96*a26f1301SXin Li
97*a26f1301SXin Li // Always returns "Ok".
VerifyTokensResponse(absl::Span<const std::string> messages,const TokensRequest & tokens_request,const TokensRequestPrivateState & tokens_request_private_state,const TokensResponse & tokens_response,const SchemeParameters & scheme_parameters,const ClientPublicParameters & client_public_parameters,const ClientPrivateParameters & client_private_parameters,const ServerPublicParameters & server_public_parameters)98*a26f1301SXin Li Status FakeAnonymousCountingTokens::VerifyTokensResponse(
99*a26f1301SXin Li absl::Span<const std::string> messages, const TokensRequest& tokens_request,
100*a26f1301SXin Li const TokensRequestPrivateState& tokens_request_private_state,
101*a26f1301SXin Li const TokensResponse& tokens_response,
102*a26f1301SXin Li const SchemeParameters& scheme_parameters,
103*a26f1301SXin Li const ClientPublicParameters& client_public_parameters,
104*a26f1301SXin Li const ClientPrivateParameters& client_private_parameters,
105*a26f1301SXin Li const ServerPublicParameters& server_public_parameters) {
106*a26f1301SXin Li return absl::OkStatus();
107*a26f1301SXin Li }
108*a26f1301SXin Li
109*a26f1301SXin Li // Returns a set of tokens containing randomly generated "nonce" values, and
110*a26f1301SXin Li // all other fields empty.
RecoverTokens(absl::Span<const std::string> messages,const TokensRequest & tokens_request,const TokensRequestPrivateState & tokens_request_private_state,const TokensResponse & tokens_response,const SchemeParameters & scheme_parameters,const ClientPublicParameters & client_public_parameters,const ClientPrivateParameters & client_private_parameters,const ServerPublicParameters & server_public_parameters)111*a26f1301SXin Li StatusOr<std::vector<Token>> FakeAnonymousCountingTokens::RecoverTokens(
112*a26f1301SXin Li absl::Span<const std::string> messages, const TokensRequest& tokens_request,
113*a26f1301SXin Li const TokensRequestPrivateState& tokens_request_private_state,
114*a26f1301SXin Li const TokensResponse& tokens_response,
115*a26f1301SXin Li const SchemeParameters& scheme_parameters,
116*a26f1301SXin Li const ClientPublicParameters& client_public_parameters,
117*a26f1301SXin Li const ClientPrivateParameters& client_private_parameters,
118*a26f1301SXin Li const ServerPublicParameters& server_public_parameters) {
119*a26f1301SXin Li Context context;
120*a26f1301SXin Li BigNum nonce_bound = context.One().Lshift(kFakeTokenNonceLengthBits);
121*a26f1301SXin Li
122*a26f1301SXin Li std::vector<Token> result;
123*a26f1301SXin Li result.reserve(messages.size());
124*a26f1301SXin Li for (size_t i = 0; i < messages.size(); ++i) {
125*a26f1301SXin Li Token fake_token;
126*a26f1301SXin Li fake_token.set_nonce_bytes(
127*a26f1301SXin Li context.GenerateRandLessThan(nonce_bound).ToBytes());
128*a26f1301SXin Li result.push_back(fake_token);
129*a26f1301SXin Li }
130*a26f1301SXin Li
131*a26f1301SXin Li return std::move(result);
132*a26f1301SXin Li }
133*a26f1301SXin Li
134*a26f1301SXin Li // Always returns "Ok".
VerifyToken(std::string m,const Token & token,const SchemeParameters & scheme_parameters,const ServerPublicParameters & server_public_parameters,const ServerPrivateParameters & server_private_parameters)135*a26f1301SXin Li Status FakeAnonymousCountingTokens::VerifyToken(
136*a26f1301SXin Li std::string m, const Token& token,
137*a26f1301SXin Li const SchemeParameters& scheme_parameters,
138*a26f1301SXin Li const ServerPublicParameters& server_public_parameters,
139*a26f1301SXin Li const ServerPrivateParameters& server_private_parameters) {
140*a26f1301SXin Li return absl::OkStatus();
141*a26f1301SXin Li }
142*a26f1301SXin Li
143*a26f1301SXin Li } // namespace anonymous_counting_tokens
144*a26f1301SXin Li } // namespace private_join_and_compute
145