// Copyright IBM Corp. 2020, 2026
// SPDX-License-Identifier: BUSL-1.1

syntax = "proto3";

package controller.servers.services.v1;

option go_package = "github.com/hashicorp/boundary/internal/gen/controller/servers/services;services";

message Credential {
  reserved 1;
  reserved "user_password";

  oneof credential {
    UsernamePassword username_password = 2;
    SshPrivateKey ssh_private_key = 3;
    SshCertificate ssh_certificate = 4;
    UsernamePasswordDomain username_password_domain = 5;
  }
}

// UsernamePassword is a credential containing a username and a password.
message UsernamePassword {
  // The username of the credential
  string username = 10; // @gotags: `class:"sensitive"`

  // The password of the credential
  string password = 20; // @gotags: `class:"secret"`
}

// UsernamePasswordDomain is a credential containing a username, password, and domain.
message UsernamePasswordDomain {
  // The username of the credential
  string username = 10; // @gotags: `class:"sensitive"`

  // The password of the credential
  string password = 20; // @gotags: `class:"secret"`

  // The domain of the credential
  string domain = 30; // @gotags: `class:"public"`
}

// SshPrivateKey is a credential containing a username a private key and an optional
// private key passphrase.
message SshPrivateKey {
  // The username of the credential
  string username = 10; // @gotags: `class:"public"`

  // The private key of the credential
  string private_key = 20; // @gotags: `class:"secret"`

  // The optional passphrase of the private_key
  string private_key_passphrase = 30; // @gotags: `class:"secret"`
}

// SshCertificate is a credential containing a username, private key, and
// client certificate.
message SshCertificate {
  // The username of the credential
  string username = 10; // @gotags: `class:"public"`

  // The private key of the credential
  string private_key = 20; // @gotags: `class:"secret"`

  // The client certificate signed by a CA to establish trust of the private key.
  string certificate = 30; // @gotags: `class:"public"`
}
