syntax = "proto3";

package ca;
option go_package = "github.com/letsencrypt/boulder/ca/proto";

import "core/proto/core.proto";
import "google/protobuf/timestamp.proto";

// CertificateAuthority issues certificates.
service CertificateAuthority {
  rpc IssuePrecertificate(IssueCertificateRequest) returns (IssuePrecertificateResponse) {}
  rpc IssueCertificateForPrecertificate(IssueCertificateForPrecertificateRequest) returns (core.Certificate) {}
}

message IssueCertificateRequest {
  // Next unused field number: 6
  bytes csr = 1;
  int64 registrationID = 2;
  int64 orderID = 3;
  reserved 4; // Previously issuerNameID

  // certProfileName is a human readable name provided by the RA and used to
  // determine if the CA can issue for that profile. A default name will be
  // assigned inside the CA during *Profile construction if no name is provided.
  // The value of this field should not be relied upon inside the RA.
  string certProfileName = 5;
}

message IssuePrecertificateResponse {
  // Next unused field number: 4
  bytes DER = 1;

  // certProfileHash is a hash over the exported fields of a certificate profile
  // to ensure that the profile remains unchanged after multiple roundtrips
  // through the RA and CA.
  bytes certProfileHash = 2;

  // certProfileName is a human readable name returned back to the RA for later
  // use. If IssueCertificateRequest.certProfileName was an empty string, the
  // CAs default profile name will be assigned.
  string certProfileName = 3;
}

message IssueCertificateForPrecertificateRequest {
  // Next unused field number: 6
  bytes DER = 1;
  repeated bytes SCTs = 2;
  int64 registrationID = 3;
  int64 orderID = 4;

  // certProfileHash is a hash over the exported fields of a certificate profile
  // to ensure that the profile remains unchanged after multiple roundtrips
  // through the RA and CA.
  bytes certProfileHash = 5;
}

// OCSPGenerator generates OCSP. We separate this out from
// CertificateAuthority so that we can restrict access to a different subset of
// hosts, so the hosts that need to request OCSP generation don't need to be
// able to request certificate issuance.
service OCSPGenerator {
  rpc GenerateOCSP(GenerateOCSPRequest) returns (OCSPResponse) {}
}

// Exactly one of certDER or [serial and issuerID] must be set.
message GenerateOCSPRequest {
  // Next unused field number: 8
  string status = 2;
  int32 reason = 3;
  reserved 4; // Previously revokedAtNS
  google.protobuf.Timestamp revokedAt = 7;
  string serial = 5;
  int64 issuerID = 6;
}

message OCSPResponse {
  bytes response = 1;
}

// CRLGenerator signs CRLs. It is separated for the same reason as OCSPGenerator.
service CRLGenerator {
  rpc GenerateCRL(stream GenerateCRLRequest) returns (stream GenerateCRLResponse) {}
}

message GenerateCRLRequest {
  oneof payload {
    CRLMetadata metadata = 1;
    core.CRLEntry entry = 2;
  }
}

message CRLMetadata {
  // Next unused field number: 5
  int64 issuerNameID = 1;
  reserved 2; // Previously thisUpdateNS
  google.protobuf.Timestamp thisUpdate = 4;
  int64 shardIdx = 3;
}

message GenerateCRLResponse {
  bytes chunk = 1;
}
