// Copyright 2023 Google LLC
//
// Licensed under the Apache License, Version 2.0 (the "License");
// you may not use this file except in compliance with the License.
// You may obtain a copy of the License at
//
//     https://www.apache.org/licenses/LICENSE-2.0
//
// Unless required by applicable law or agreed to in writing, software
// distributed under the License is distributed on an "AS-IS" BASIS,
// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
// See the License for the specific language governing permissions and
// limitations under the License.

syntax = "proto3";

package privacy.ppn;

import "quiche/blind_sign_auth/proto/attestation.proto";
import "quiche/blind_sign_auth/proto/public_metadata.proto";
import "quiche/blind_sign_auth/anonymous_tokens/proto/anonymous_tokens.proto";

option java_multiple_files = true;

// Request data needed to prepare for AuthAndSign.
message GetInitialDataRequest {
  // Whether the client wants to use attestation as part of authentication.
  bool use_attestation = 1 ;

  // A string uniquely identifying the strategy this client should be
  // authenticated with.
  string service_type = 2 ;

  enum LocationGranularity {
    UNKNOWN = 0;
    COUNTRY = 1;
    // Geographic area with population greater than 1 million.
    CITY_GEOS = 2;
  }
  // The user selected granularity of exit IP location.
  LocationGranularity location_granularity = 3
      ;

  // Indicates what validation rules the client uses for public metadata.
  int64 validation_version = 4 ;
}

// Contains data needed to perform blind signing and prepare for calling
// AuthAndSign.
message GetInitialDataResponse {
  private_membership.anonymous_tokens.RSABlindSignaturePublicKey
      at_public_metadata_public_key = 1;

  // Version will match the validation version in the request.
  privacy.ppn.PublicMetadataInfo public_metadata_info = 2;

  // Data needed to set up attestation, included if use_attestation is true or
  // if the service_type input requires it.
  privacy.ppn.PrepareAttestationData attestation = 3;

  // General public metadata. Use metadata deserializer to inspect. Only set one
  // of this or public_metadata_info.
  bytes binary_public_metadata = 4 ;
}
