// 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/key_services.proto";
import "quiche/blind_sign_auth/proto/proxy_layer.proto";
import "quiche/blind_sign_auth/proto/public_metadata.proto";

option java_multiple_files = true;
option java_package = "com.google.privacy.ppn.proto";

// Client is requesting to auth using the provided auth token.
// Next ID: 17
message AuthAndSignRequest {
  reserved 3, 13;

  // A 'bearer' oauth token to be validated.
  // https://datatracker.ietf.org/doc/html/rfc6750#section-6.1.1
  string oauth_token = 1;

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

  // A set of blinded tokens to be signed by zinc. b64 encoded.
  repeated string blinded_token = 4;

  // A sha256 of the public key PEM used in generated `blinded_token`. This
  // Ensures the signer signs with the matching key. Only required if key_type
  // is ZINC_KEY_TYPE.
  string public_key_hash = 5;

  oneof attestation_data {
    AndroidAttestationData android_attestation_data = 6;
    IosAttestationData ios_attestation_data = 7;
  }
  privacy.ppn.AttestationData attestation = 8;

  privacy.ppn.KeyType key_type = 10;

  privacy.ppn.PublicMetadataInfo public_metadata_info = 11;

  // Indicates which key to use for signing. Only set if key type is
  // PUBLIC_METADATA.
  uint64 key_version = 12;

  // Only set one of this or public_metadata_info. Uses IETF privacy pass
  // extensions spec for format.
  bytes public_metadata_extensions = 14;

  // For PUBLIC_METADATA key types, if this value is set to false, the
  // final public exponent is derived by using the RSA public exponent, the
  // RSA modulus and the public metadata. If this value is set to true, only
  // the RSA modulus and the public metadata will be used.
  bool do_not_use_rsa_public_exponent = 15;

  // Only set for some service types where multi layer proxies are supported.
  ProxyLayer proxy_layer = 16;
}

message AuthAndSignResponse {
  reserved 1, 2, 3;

  // A set of signatures corresponding by index to `blinded_token` in the
  // request. b64 encoded.
  repeated string blinded_token_signature = 4;

  // The marconi server hostname bridge-proxy used to set up tunnel.
  string copper_controller_hostname = 5;

  // The base64 encoding of override_region token and signature for white listed
  // users in the format of "${Region}.${timestamp}.${signature}".
  string region_token_and_signature = 6;

  // The APN type bridge-proxy use to deside which APN to use for connecting.
  string apn_type = 7;
}
