Ctrl K
ComunidadGuías…

server/src/http_pairing_policy.h

Rama main · réplica de lectura del repositorio original.

Archivo original ↗Preguntar a KiBot
/**
 * @file src/http_pairing_policy.h
 * @brief Data-only pairing protocol decisions shared by NVHTTP and unit tests.
 */
#pragma once

#include <cstddef>
#include <optional>
#include <span>
#include <string>
#include <string_view>

namespace nvhttp::pairing_policy {

  // The legacy GameStream PIN flow does not carry a server-generated request
  // identity into the administrator approval action. Exactly one immutable
  // pending session is therefore the only unambiguous safe admission model.
  inline constexpr std::size_t max_pending_sessions = 1;
  inline constexpr std::size_t max_unique_id_length = 128;
  inline constexpr std::size_t max_paired_clients = 256;
  inline constexpr std::size_t max_paired_client_name_length = 1024;
  inline constexpr std::size_t max_paired_certificate_length = 65536;
  inline constexpr std::size_t max_pairing_hex_field_length = 65536;

  enum class phase_e {
    none,
    get_server_cert,
    client_challenge,
    server_challenge_response,
    client_pairing_secret,
  };

  struct session_state_t {
    phase_e phase = phase_e::none;
    bool has_cipher_key = false;
    bool has_server_secret = false;
  };

  struct decision_t {
    bool accepted = false;
    phase_e next_phase = phase_e::none;
    std::string_view failure_message;
  };

  struct paired_client_record_view_t {
    std::string_view uuid;
    std::string_view certificate_identity;
    bool enabled = false;
  };

  enum class paired_client_resolution_e {
    authorized,
    unknown_certificate,
    disabled,
    invalid_state,
  };

  struct paired_client_resolution_t {
    paired_client_resolution_e status = paired_client_resolution_e::unknown_certificate;
    std::size_t index = 0;
  };

  struct admission_decision_t {
    bool accepted = false;
    std::string_view failure_message;
  };

  /**
   * Preserve the certificate subject string across the crypto/HTTP boundary.
   * A missing certificate subject is an empty identity, rather than an error.
   */
  std::string certificate_subject_name(std::optional<std::string_view> subject_name);

  bool is_placeholder_client_name(std::string_view name);
  std::string display_client_name(std::string_view paired_name, std::string_view device_name, std::string_view host_name);

  bool valid_unique_id(std::string_view value);
  bool valid_hex_field(std::string_view value, std::size_t minimum, std::size_t maximum = max_pairing_hex_field_length);
  bool valid_paired_client_uuid(std::string_view value);
  bool paired_client_state_valid(std::span<const paired_client_record_view_t> clients);
  paired_client_resolution_t resolve_paired_client(
    std::span<const paired_client_record_view_t> clients,
    std::string_view presented_certificate_identity
  );
  admission_decision_t admit_pending_session(
    std::string_view unique_id,
    std::string_view client_certificate_hex,
    std::string_view salt_hex,
    std::size_t pending_sessions,
    bool replacing_existing,
    bool same_identity
  );

  decision_t begin_get_server_certificate(session_state_t state, std::size_t salt_size);
  decision_t begin_client_challenge(session_state_t state);
  decision_t begin_server_challenge_response(session_state_t state);
  decision_t begin_client_pairing_secret(session_state_t state, std::size_t payload_size);
  decision_t decide_client_pairing_secret(
    session_state_t state,
    bool client_certificate_valid,
    bool client_hash_matches,
    bool client_secret_signature_valid
  );

}  // namespace nvhttp::pairing_policy