type t
type sub_auths = Stdint.Uint32.t array
val create_unsafe : Stdint.Uint32.t array -> Stdint.Uint64.t -> t
val create : ?sa:Stdint.Uint32.t array -> Stdint.Uint64.t -> t
val equal_sub_auths : Stdint.Uint32.t array -> Stdint.Uint32.t array -> bool
val equal : t -> t -> bool
val get_ident_auth : t -> Stdint.Uint64.t
val get_sub_auths : t -> sub_auths

module StringFmt :
  sig
    val decode : string -> t
    val from_string_res : string -> (t, string) result
    val from_string_opt : string -> t option
    val encode : t -> string
  end

module PacketRep :
  sig
    val encode : t -> bytes
    val decode : bytes -> (t, string) result
  end

module WellKnown :
  sig
    val null : t
    val everyone : t
    val world : t
    val local : t
    val creator_owner_id : t
    val creator_group_id : t
    val elite : t

    module Prefix :
      sig
        val security_null_sid_authority    : ?sa:sub_auths -> unit -> t
        val security_world_sid_authority   : ?sa:sub_auths -> unit -> t
        val security_local_sid_authority   : ?sa:sub_auths -> unit -> t
        val security_creator_sid_authority : ?sa:sub_auths -> unit -> t
        val security_nt_authority          : ?sa:sub_auths -> unit -> t
      end
  end

val of_string : string -> t
val to_string : t -> string