absl::StatusOr KmsClient::AsymmetricSign()

in common/kms_client.cc [156:206]


absl::StatusOr<kms_v1::AsymmetricSignResponse> KmsClient::AsymmetricSign(
    kms_v1::AsymmetricSignRequest& request) const {
  grpc::ClientContext ctx;
  AddContextSettings(&ctx, "name", request.name());

  bool use_data = false;
  if (!request.data().empty()) {
    use_data = true;
    request.mutable_data_crc32c()->set_value(ComputeCRC32C(request.data()));
  } else {
    absl::StatusOr<std::string> digest_string =
        GetDigestString(request.digest());
    if (!digest_string.ok()) {
      absl::Status status = digest_string.status();
      return DecorateStatus(status);
    }
    request.mutable_digest_crc32c()->set_value(ComputeCRC32C(*digest_string));
  }

  kms_v1::AsymmetricSignResponse response;
  absl::Status rpc_result =
      ToStatus(kms_stub_->AsymmetricSign(&ctx, request, &response));
  if (!rpc_result.ok()) {
    return DecorateStatus(rpc_result);
  }

  if (!CRC32CMatches(response.signature(),
                     response.signature_crc32c().value())) {
    rpc_result = absl::InternalError(absl::StrFormat(
        "at %s: the response crc32c did not match the expected checksum value",
        SOURCE_LOCATION.ToString()));
    return DecorateStatus(rpc_result);
  }

  if (use_data && !response.verified_data_crc32c()) {
    rpc_result = absl::InternalError(
        absl::StrFormat("at %s: the server did not verify the checksum values "
                        "provided in the request",
                        SOURCE_LOCATION.ToString()));
    return DecorateStatus(rpc_result);
  }
  if (!use_data && !response.verified_digest_crc32c()) {
    rpc_result = absl::InternalError(
        absl::StrFormat("at %s: the server did not verify the checksum values "
                        "provided in the request",
                        SOURCE_LOCATION.ToString()));
    return DecorateStatus(rpc_result);
  }

  return response;
}