syntax = "proto3";

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

import "core/proto/core.proto";
import "ca/proto/ca.proto";
import "google/protobuf/empty.proto";
import "google/protobuf/duration.proto";

service RegistrationAuthority {
  rpc NewRegistration(core.Registration) returns (core.Registration) {}
  rpc UpdateRegistrationContact(UpdateRegistrationContactRequest) returns (core.Registration) {}
  rpc UpdateRegistrationKey(UpdateRegistrationKeyRequest) returns (core.Registration) {}
  rpc DeactivateRegistration(DeactivateRegistrationRequest) returns (core.Registration) {}
  rpc PerformValidation(PerformValidationRequest) returns (core.Authorization) {}
  rpc DeactivateAuthorization(core.Authorization) returns (google.protobuf.Empty) {}
  rpc RevokeCertByApplicant(RevokeCertByApplicantRequest) returns (google.protobuf.Empty) {}
  rpc RevokeCertByKey(RevokeCertByKeyRequest) returns (google.protobuf.Empty) {}
  rpc AdministrativelyRevokeCertificate(AdministrativelyRevokeCertificateRequest) returns (google.protobuf.Empty) {}
  rpc NewOrder(NewOrderRequest) returns (core.Order) {}
  rpc GetAuthorization(GetAuthorizationRequest) returns (core.Authorization) {}
  rpc FinalizeOrder(FinalizeOrderRequest) returns (core.Order) {}
  // Generate an OCSP response based on the DB's current status and reason code.
  rpc GenerateOCSP(GenerateOCSPRequest) returns (ca.OCSPResponse) {}
  rpc UnpauseAccount(UnpauseAccountRequest) returns (UnpauseAccountResponse) {}
  rpc AddRateLimitOverride(AddRateLimitOverrideRequest) returns (AddRateLimitOverrideResponse) {}
}

service SCTProvider {
  rpc GetSCTs(SCTRequest) returns (SCTResponse) {}
}

message SCTRequest {
  bytes precertDER = 1;
}

message SCTResponse {
  repeated bytes sctDER = 1;
}

message GenerateOCSPRequest {
  string serial = 1;
}

message UpdateRegistrationContactRequest {
  int64 registrationID = 1;
  repeated string contacts = 2;
}

message UpdateRegistrationKeyRequest {
  int64 registrationID = 1;
  bytes jwk = 2;
}

message DeactivateRegistrationRequest {
  int64 registrationID = 1;
}

message UpdateAuthorizationRequest {
  core.Authorization authz = 1;
  int64 challengeIndex = 2;
  core.Challenge response = 3;
}

message PerformValidationRequest {
  core.Authorization authz = 1;
  int64 challengeIndex = 2;
}

message RevokeCertByApplicantRequest {
  bytes cert = 1;
  int64 code = 2;
  int64 regID = 3;
}

message RevokeCertByKeyRequest {
  bytes cert = 1;
  reserved 2; // previously code
}

message AdministrativelyRevokeCertificateRequest {
  // Deprecated: this field is ignored.
  bytes cert = 1;
  // The `serial` field is required.
  string serial = 4;
  int64 code = 2;
  string adminName = 3;
  bool skipBlockKey = 5;
  // If the malformed flag is set, the RA will not attempt to parse the
  // certificate in question. In this case, the keyCompromise reason cannot be
  // specified, because the key cannot be blocked.
  bool malformed = 6;
  // The CRL shard to store the revocation in.
  //
  // This is used when revoking malformed certificates, to allow human judgement
  // in setting the CRL shard instead of automatically determining it by parsing
  // the certificate.
  //
  // Passing a nonzero crlShard with malformed=false returns error.
  int64 crlShard = 7;
}

message NewOrderRequest {
  // Next unused field number: 9
  int64 registrationID = 1;
  reserved 2; // previously dnsNames
  repeated core.Identifier identifiers = 8;
  string certificateProfileName = 5;
  // Replaces is the ARI certificate Id that this order replaces.
  string replaces = 7;
  // ReplacesSerial is the serial number of the certificate that this order replaces.
  string replacesSerial = 3;
  reserved 4; // previously isARIRenewal
  reserved 6; // previously isRenewal
}

message GetAuthorizationRequest {
  int64 id = 1;
}

message FinalizeOrderRequest {
  core.Order order = 1;
  bytes csr = 2;
}

message UnpauseAccountRequest {
  // Next unused field number: 2

  // The registrationID to be unpaused so issuance can be resumed.
  int64 registrationID = 1;
}

message UnpauseAccountResponse {
  // Next unused field number: 2

  // Count is the number of identifiers which were unpaused for the input regid.
  int64 count = 1;
}

message AddRateLimitOverrideRequest {
  int64 limitEnum      = 1;
  string bucketKey = 2;
  string comment    = 3;
  google.protobuf.Duration period = 4;
  int64 count      = 5;
  int64 burst      = 6;
}

message AddRateLimitOverrideResponse {
  bool inserted = 1;
  bool enabled = 2;
}
