21 #include <freeradius-devel/util/dbuff.h>
23 #include <freeradius-devel/protocol/tacacs/freeradius.internal.h>
24 #include <freeradius-devel/protocol/tacacs/dictionary.h>
26 #define FR_HEADER_LENGTH sizeof(fr_tacacs_packet_hdr_t)
27 #define FR_MAX_PACKET_SIZE 4096
28 #define FR_MAX_ATTRIBUTES 255
31 #define FR_TAC_PLUS_MAJOR_VER 12
32 #define FR_TAC_PLUS_MINOR_VER_DEFAULT 0
33 #define FR_TAC_PLUS_MINOR_VER_ONE 1
49 #define packet_is_authen_start_request(p) (((p)->hdr.type == FR_TAC_PLUS_AUTHEN) && ((p)->hdr.seq_no == 1))
50 #define packet_is_authen_continue(p) (((p)->hdr.type == FR_TAC_PLUS_AUTHEN) && ((p)->hdr.seq_no > 1) && (((p)->hdr.seq_no % 2) == 1))
51 #define packet_is_authen_reply(p) (((p)->hdr.type == FR_TAC_PLUS_AUTHEN) && (((p)->hdr.seq_no % 2) == 0))
53 #define packet_is_author_request(p) (((p)->hdr.type == FR_TAC_PLUS_AUTHOR) && (((p)->hdr.seq_no % 2) == 1))
54 #define packet_is_author_reply(p) (((p)->hdr.type == FR_TAC_PLUS_AUTHOR) && (((p)->hdr.seq_no % 2) == 0))
56 #define packet_is_acct_request(p) (((p)->hdr.type == FR_TAC_PLUS_ACCT) && (((p)->hdr.seq_no % 2) == 1))
57 #define packet_is_acct_reply(p) (((p)->hdr.type == FR_TAC_PLUS_ACCT) && (((p)->hdr.seq_no % 2) == 0))
59 #define packet_has_valid_seq_no(p) ((p)->hdr.seq_no != 0)
61 #define packet_is_encrypted(p) (((p)->hdr.flags & FR_TAC_PLUS_UNENCRYPTED_FLAG) == 0)
77 typedef enum CC_HINT(flag_enum) {
84 typedef struct CC_HINT(__packed__) {
87 struct CC_HINT(__packed__) {
88 #ifdef WORDS_BIGENDIAN
139 typedef struct CC_HINT(__packed__) {
166 typedef struct CC_HINT(__packed__) {
178 typedef struct CC_HINT(__packed__) {
198 typedef struct CC_HINT(__packed__) {
218 typedef struct CC_HINT(__packed__) {
232 typedef struct CC_HINT(__packed__) {
260 typedef struct CC_HINT(__packed__) {
276 typedef struct CC_HINT(__packed__) {
321 #define FR_TACACS_PACKET_CODE_VALID(_code) (((_code) > 0) && ((_code) < FR_TACACS_CODE_MAX))
354 #define fr_tacacs_packet_log_hex(_log, _packet, _size) _fr_tacacs_packet_log_hex(_log, _packet, _size, __FILE__, __LINE__)
static int const char char buffer[256]
static size_t array[MY_ARRAY_SIZE]
fr_tacacs_author_authen_method_t authen_method
fr_tacacs_author_authen_method_t authen_method
ssize_t fr_tacacs_encode(fr_dbuff_t *dbuff, uint8_t const *original, char const *const secret, size_t secret_len, unsigned int code, fr_pair_list_t *vps)
Encode VPS into a raw TACACS packet.
void _fr_tacacs_packet_log_hex(fr_log_t const *log, fr_tacacs_packet_t const *packet, size_t packet_len, char const *file, int line)
int fr_tacacs_code_to_packet(fr_tacacs_packet_t *pkt, uint32_t code)
ssize_t fr_tacacs_length(uint8_t const *buffer, size_t buffer_len)
int fr_tacacs_body_xor(fr_tacacs_packet_t const *pkt, uint8_t *body, size_t body_len, char const *secret, size_t secret_len))
XOR the body based on the secret key.
fr_tacacs_authenservice_t
@ FR_TAC_PLUS_AUTHEN_SVC_FWPROXY
@ FR_TAC_PLUS_AUTHEN_SVC_X25
@ FR_TAC_PLUS_AUTHEN_SVC_ENABLE
@ FR_TAC_PLUS_AUTHEN_SVC_ARAP
@ FR_TAC_PLUS_AUTHEN_SVC_PPP
@ FR_TAC_PLUS_AUTHEN_SVC_RCMD
@ FR_TAC_PLUS_AUTHEN_SVC_PT
@ FR_TAC_PLUS_AUTHEN_SVC_NONE
@ FR_TAC_PLUS_AUTHEN_SVC_LOGIN
@ FR_TAC_PLUS_AUTHEN_SVC_NASI
fr_tacacs_authen_reply_flags_t
@ FR_TAC_PLUS_REPLY_FLAG_UNSET
@ FR_TAC_PLUS_REPLY_FLAG_NOECHO
fr_tacacs_authentype_t authen_type
fr_tacacs_packet_body_type_t
@ FR_PACKET_BODY_TYPE_REQUEST
@ FR_PACKET_BODY_TYPE_CONTINUE
@ FR_PACKET_BODY_TYPE_UNKNOWN
@ FR_PACKET_BODY_TYPE_RESPONSE
@ FR_PACKET_BODY_TYPE_REPLY
@ FR_PACKET_BODY_TYPE_START
fr_tacacs_authen_cont_flags_t
@ FR_TAC_PLUS_CONTINUE_FLAG_UNSET
@ FR_TAC_PLUS_CONTINUE_FLAG_ABORT
char const * fr_tacacs_packet_names[FR_TACACS_CODE_MAX]
fr_tacacs_authen_cont_flags_t flags
@ FR_TAC_PLUS_SINGLE_CONNECT_FLAG
@ FR_TAC_PLUS_UNENCRYPTED_FLAG
void fr_tacacs_global_free(void)
fr_dict_attr_t const * root
@ FR_TAC_PLUS_PRIV_LVL_USER
@ FR_TAC_PLUS_PRIV_LVL_ROOT
@ FR_TAC_PLUS_PRIV_LVL_MIN
@ FR_TAC_PLUS_PRIV_LVL_MAX
fr_tacacs_author_reply_status_t
@ FR_TAC_PLUS_AUTHOR_STATUS_PASS_ADD
@ FR_TAC_PLUS_AUTHOR_STATUS_FOLLOW
@ FR_TAC_PLUS_AUTHOR_STATUS_ERROR
@ FR_TAC_PLUS_AUTHOR_STATUS_FAIL
@ FR_TAC_PLUS_AUTHOR_STATUS_PASS_REPL
fr_tacacs_authenservice_t authen_service
ssize_t fr_tacacs_decode(TALLOC_CTX *ctx, fr_pair_list_t *out, fr_dict_attr_t const *vendor, uint8_t const *buffer, size_t buffer_len, UNUSED const uint8_t *original, char const *const secret, size_t secret_len, int *code)
int fr_tacacs_global_init(void)
fr_tacacs_authentype_t authen_type
fr_tacacs_privlvl_t priv_lvl
fr_tacacs_author_authen_method_t
@ FR_TAC_PLUS_AUTHEN_METH_KRB5
@ FR_TAC_PLUS_AUTHEN_METH_RCMD
@ FR_TAC_PLUS_AUTHEN_METH_LINE
@ FR_TAC_PLUS_AUTHEN_METH_RADIUS
@ FR_TAC_PLUS_AUTHEN_METH_KRB4
@ FR_TAC_PLUS_AUTHEN_METH_LOCAL
@ FR_TAC_PLUS_AUTHEN_METH_NONE
@ FR_TAC_PLUS_AUTHEN_METH_ENABLE
@ FR_TAC_PLUS_AUTHEN_METH_GUEST
@ FR_TAC_PLUS_AUTHEN_METH_NOT_SET
@ FR_TAC_PLUS_AUTHEN_METH_TACACSPLUS
fr_tacacs_acct_reply_status_t status
fr_tacacs_privlvl_t priv_lvl
fr_tacacs_author_reply_status_t status
@ FR_TAC_PLUS_AUTHEN_SENDAUTH
@ FR_TAC_PLUS_AUTHEN_LOGIN
@ FR_TAC_PLUS_AUTHEN_CHPASS
fr_tacacs_acct_req_flags_t
@ FR_TAC_PLUS_ACCT_FLAG_WATCHDOG
@ FR_TAC_PLUS_ACCT_FLAG_START
@ FR_TAC_PLUS_ACCT_FLAG_STOP
fr_tacacs_authenservice_t authen_service
fr_tacacs_authentype_t authen_type
fr_tacacs_packet_hdr_t hdr
fr_tacacs_authenservice_t authen_service
@ FR_TAC_PLUS_AUTHEN_TYPE_PAP
@ FR_TAC_PLUS_AUTHEN_TYPE_CHAP
@ FR_TAC_PLUS_AUTHEN_TYPE_ASCII
@ FR_TAC_PLUS_AUTHEN_TYPE_MSCHAP
@ FR_TAC_PLUS_AUTHEN_TYPE_MSCHAPV2
@ FR_TAC_PLUS_AUTHEN_TYPE_ARAP
fr_tacacs_privlvl_t priv_lvl
@ FR_TACACS_CODE_ACCT_ERROR
@ FR_TACACS_CODE_ACCT_REQUEST
@ FR_TACACS_CODE_AUTZ_REQUEST
@ FR_TACACS_CODE_AUTH_GETDATA
@ FR_TACACS_CODE_AUTH_RESTART
@ FR_TACACS_CODE_AUTZ_PASS_REPLACE
@ FR_TACACS_CODE_AUTH_GETUSER
@ FR_TACACS_CODE_AUTH_GETPASS
@ FR_TACACS_CODE_AUTZ_FAIL
@ FR_TACACS_CODE_AUTH_CONT_ABORT
@ FR_TACACS_CODE_AUTH_PASS
@ FR_TACACS_CODE_AUTH_CONT
@ FR_TACACS_CODE_AUTZ_PASS_ADD
@ FR_TACACS_CODE_AUTH_START
@ FR_TACACS_CODE_AUTH_FAIL
@ FR_TACACS_CODE_AUTH_ERROR
@ FR_TACACS_CODE_AUTZ_ERROR
@ FR_TACACS_CODE_ACCT_SUCCESS
int fr_tacacs_packet_to_code(fr_tacacs_packet_t const *pkt)
fr_tacacs_action_t action
fr_tacacs_acct_req_flags_t flags
fr_tacacs_authen_reply_status_t status
fr_tacacs_acct_reply_status_t
@ FR_TAC_PLUS_ACCT_STATUS_SUCCESS
@ FR_TAC_PLUS_ACCT_STATUS_FOLLOW
@ FR_TAC_PLUS_ACCT_STATUS_ERROR
fr_tacacs_authen_reply_status_t
@ FR_TAC_PLUS_AUTHEN_STATUS_PASS
@ FR_TAC_PLUS_AUTHEN_STATUS_GETDATA
@ FR_TAC_PLUS_AUTHEN_STATUS_ERROR
@ FR_TAC_PLUS_AUTHEN_STATUS_GETUSER
@ FR_TAC_PLUS_AUTHEN_STATUS_FAIL
@ FR_TAC_PLUS_AUTHEN_STATUS_FOLLOW
@ FR_TAC_PLUS_AUTHEN_STATUS_RESTART
@ FR_TAC_PLUS_AUTHEN_STATUS_GETPASS
fr_tacacs_authen_reply_flags_t flags
static size_t char ** out