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 #ifndef PRIVATE_JOIN_AND_COMPUTE_ANONYMOUS_COUNTING_TOKENS_ACT_V0_ACT_V0_H_ 17*a26f1301SXin Li #define PRIVATE_JOIN_AND_COMPUTE_ANONYMOUS_COUNTING_TOKENS_ACT_V0_ACT_V0_H_ 18*a26f1301SXin Li 19*a26f1301SXin Li #include <memory> 20*a26f1301SXin Li #include <string> 21*a26f1301SXin Li #include <tuple> 22*a26f1301SXin Li #include <vector> 23*a26f1301SXin Li 24*a26f1301SXin Li #include "act/act.h" 25*a26f1301SXin Li #include "act/act.pb.h" 26*a26f1301SXin Li #include "private_join_and_compute/util/status.inc" 27*a26f1301SXin Li 28*a26f1301SXin Li namespace private_join_and_compute { 29*a26f1301SXin Li namespace anonymous_counting_tokens { 30*a26f1301SXin Li 31*a26f1301SXin Li // An implementation of vO Anonymous Counting Tokens. 32*a26f1301SXin Li class AnonymousCountingTokensV0 : public AnonymousCountingTokens { 33*a26f1301SXin Li public: 34*a26f1301SXin Li static std::unique_ptr<AnonymousCountingTokens> Create(); 35*a26f1301SXin Li 36*a26f1301SXin Li // Returns a fresh set of Server parameters corresponding to these 37*a26f1301SXin Li // SchemeParameters. Fails with InvalidArgument if the parameters don't 38*a26f1301SXin Li // correspond to ACT v0. 39*a26f1301SXin Li StatusOr<ServerParameters> GenerateServerParameters( 40*a26f1301SXin Li const SchemeParameters& scheme_parameters) override; 41*a26f1301SXin Li 42*a26f1301SXin Li // Returns a fresh set of Client parameters corresponding to these 43*a26f1301SXin Li // SchemeParameters and ServerPublicParameters. Fails with InvalidArgument if 44*a26f1301SXin Li // the parameters don't correspond to ACT v0. 45*a26f1301SXin Li StatusOr<ClientParameters> GenerateClientParameters( 46*a26f1301SXin Li const SchemeParameters& scheme_parameters, 47*a26f1301SXin Li const ServerPublicParameters& server_public_parameters) override; 48*a26f1301SXin Li 49*a26f1301SXin Li // Verifies the consistency of the ClientPublicParameters with the Server and 50*a26f1301SXin Li // scheme parameters. Fails with InvalidArgument if the parameters don't 51*a26f1301SXin Li // correspond to ACT v0. 52*a26f1301SXin Li Status 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) override; 57*a26f1301SXin Li 58*a26f1301SXin Li // Returns a tuple of client_fingerprints, TokensRequest and 59*a26f1301SXin Li // TokensRequestPrivateState for the given set of messages. Fails with 60*a26f1301SXin Li // InvalidArgument if the parameters don't correspond to ACT v0. 61*a26f1301SXin Li StatusOr<std::tuple<std::vector<std::string>, TokensRequest, 62*a26f1301SXin Li TokensRequestPrivateState>> 63*a26f1301SXin Li GenerateTokensRequest( 64*a26f1301SXin Li absl::Span<const std::string> messages, 65*a26f1301SXin Li const SchemeParameters& scheme_parameters, 66*a26f1301SXin Li const ClientPublicParameters& client_public_parameters, 67*a26f1301SXin Li const ClientPrivateParameters& client_private_parameters, 68*a26f1301SXin Li const ServerPublicParameters& server_public_parameters) override; 69*a26f1301SXin Li 70*a26f1301SXin Li // Returns OkStatus on a valid request. Fails with InvalidArgument if the 71*a26f1301SXin Li // parameters don't correspond to ACT v0. 72*a26f1301SXin Li Status CheckTokensRequest( 73*a26f1301SXin Li absl::Span<const std::string> client_fingerprints, 74*a26f1301SXin Li const TokensRequest& tokens_request, 75*a26f1301SXin Li const SchemeParameters& scheme_parameters, 76*a26f1301SXin Li const ClientPublicParameters& client_public_parameters, 77*a26f1301SXin Li const ServerPublicParameters& server_public_parameters, 78*a26f1301SXin Li const ServerPrivateParameters& server_private_parameters) override; 79*a26f1301SXin Li 80*a26f1301SXin Li // Returns the TokensResponse. Fails with InvalidArgument if the parameters 81*a26f1301SXin Li // don't correspond to ACT v0. 82*a26f1301SXin Li StatusOr<TokensResponse> GenerateTokensResponse( 83*a26f1301SXin Li const TokensRequest& tokens_request, 84*a26f1301SXin Li const SchemeParameters& scheme_parameters, 85*a26f1301SXin Li const ClientPublicParameters& client_public_parameters, 86*a26f1301SXin Li const ServerPublicParameters& server_public_parameters, 87*a26f1301SXin Li const ServerPrivateParameters& server_private_parameters) override; 88*a26f1301SXin Li 89*a26f1301SXin Li // Returns OkStatus on a valid response. Fails with InvalidArgument if the 90*a26f1301SXin Li // parameters don't correspond to ACT v0. 91*a26f1301SXin Li Status VerifyTokensResponse( 92*a26f1301SXin Li absl::Span<const std::string> messages, 93*a26f1301SXin Li const TokensRequest& tokens_request, 94*a26f1301SXin Li const TokensRequestPrivateState& tokens_request_private_state, 95*a26f1301SXin Li const TokensResponse& tokens_response, 96*a26f1301SXin Li const SchemeParameters& scheme_parameters, 97*a26f1301SXin Li const ClientPublicParameters& client_public_parameters, 98*a26f1301SXin Li const ClientPrivateParameters& client_private_parameters, 99*a26f1301SXin Li const ServerPublicParameters& server_public_parameters) override; 100*a26f1301SXin Li 101*a26f1301SXin Li // Returns a vector of tokens corresponding to the supplied messages. Fails 102*a26f1301SXin Li // with InvalidArgument if the parameters don't correspond to ACT v0. 103*a26f1301SXin Li StatusOr<std::vector<Token>> RecoverTokens( 104*a26f1301SXin Li absl::Span<const std::string> messages, 105*a26f1301SXin Li const TokensRequest& tokens_request, 106*a26f1301SXin Li const TokensRequestPrivateState& tokens_request_private_state, 107*a26f1301SXin Li const TokensResponse& tokens_response, 108*a26f1301SXin Li const SchemeParameters& scheme_parameters, 109*a26f1301SXin Li const ClientPublicParameters& client_public_parameters, 110*a26f1301SXin Li const ClientPrivateParameters& client_private_parameters, 111*a26f1301SXin Li const ServerPublicParameters& server_public_parameters) override; 112*a26f1301SXin Li 113*a26f1301SXin Li // Returns OkStatus on valid tokens. Fails with InvalidArgument if the 114*a26f1301SXin Li // parameters don't correspond to ACT v0. 115*a26f1301SXin Li Status VerifyToken( 116*a26f1301SXin Li std::string m, const Token& token, 117*a26f1301SXin Li const SchemeParameters& scheme_parameters, 118*a26f1301SXin Li const ServerPublicParameters& server_public_parameters, 119*a26f1301SXin Li const ServerPrivateParameters& server_private_parameters) override; 120*a26f1301SXin Li 121*a26f1301SXin Li protected: 122*a26f1301SXin Li AnonymousCountingTokensV0() = default; 123*a26f1301SXin Li }; 124*a26f1301SXin Li 125*a26f1301SXin Li } // namespace anonymous_counting_tokens 126*a26f1301SXin Li } // namespace private_join_and_compute 127*a26f1301SXin Li 128*a26f1301SXin Li #endif // PRIVATE_JOIN_AND_COMPUTE_ANONYMOUS_COUNTING_TOKENS_ACT_V0_ACT_V0_H_ 129