## shishi.h

shishi.h — main library interfaces

## Functions

void | (*shishi_alloc_fail_function) ()
Shishi * | shishi ()
Shishi * | shishi_server ()
void | shishi_done ()
int | shishi_init ()
int | shishi_init_with_paths ()
int | shishi_init_server ()
int | shishi_init_server_with_paths ()
int | shishi_cfg ()
int | shishi_cfg_from_file ()
int | shishi_cfg_print ()
const char * | shishi_cfg_default_systemfile ()
const char * | shishi_cfg_default_userdirectory ()
const char * | shishi_cfg_default_userfile ()
char * | shishi_cfg_userdirectory_file ()
int | shishi_cfg_clientkdcetype ()
int32_t | shishi_cfg_clientkdcetype_fast ()
int | shishi_cfg_clientkdcetype_set ()
int | shishi_cfg_authorizationtype_set ()
const char * | shishi_strerror ()
const char * | shishi_error ()
void | shishi_error_clear ()
void | shishi_error_set ()
void | shishi_error_printf ()
int | shishi_error_outputtype ()
void | shishi_error_set_outputtype ()
void | shishi_info ()
void | shishi_warn ()
void | shishi_verbose ()
char * | shishi_realm_default_guess ()
const char * | shishi_realm_default ()
void | shishi_realm_default_set ()
char * | shishi_realm_for_server_file ()
char * | shishi_realm_for_server_dns ()
char * | shishi_realm_for_server ()
char * | shishi_principal_default_guess ()
const char * | shishi_principal_default ()
void | shishi_principal_default_set ()
int | shishi_principal_name ()
int | shishi_principal_name_realm ()
int | shishi_principal_name_set ()
int | shishi_principal_set ()
int | shishi_parse_name ()
int | shishi_derive_default_salt ()
char * | shishi_server_for_local_service ()
Shishi_asn1 | shishi_ticket ()
int | shishi_ticket_server ()
int | shishi_ticket_sname_set ()
int | shishi_ticket_srealmserver_set ()
int | shishi_ticket_set_server ()
int | shishi_ticket_realm_get ()
int | shishi_ticket_realm_set ()
int | shishi_ticket_get_enc_part_etype ()
int | shishi_ticket_set_enc_part ()
int | shishi_ticket_add_enc_part ()
int | shishi_ticket_decrypt ()
Shishi_asn1 | shishi_tkt_ticket ()
void | shishi_tkt_ticket_set ()
Shishi_asn1 | shishi_tkt_kdcrep ()
Shishi_asn1 | shishi_tkt_enckdcreppart ()
void | shishi_tkt_enckdcreppart_set ()
Shishi_asn1 | shishi_tkt_encticketpart ()
void | shishi_tkt_encticketpart_set ()
Shishi_key * | shishi_tkt_key ()
int | shishi_tkt_key_set ()
int | shishi_tkt ()
Shishi_tkt * | shishi_tkt2 ()
void | shishi_tkt_pretty_print ()
int | shishi_tkt_realm ()
int | shishi_tkt_client ()
int | shishi_tkt_client_p ()
int | shishi_tkt_clientrealm ()
int | shishi_tkt_clientrealm_p ()
int | shishi_tkt_clientrealm_set ()
int | shishi_tkt_serverrealm_set ()
int | shishi_tkt_build ()
int | shishi_tkt_lastreq ()
time_t | shishi_tkt_lastreqc ()
void | shishi_tkt_lastreq_pretty_print ()
int | shishi_tkt_authtime ()
time_t | shishi_tkt_authctime ()
int | shishi_tkt_starttime ()
time_t | shishi_tkt_startctime ()
int | shishi_tkt_endtime ()
time_t | shishi_tkt_endctime ()
int | shishi_tkt_renew_till ()
time_t | shishi_tkt_renew_tillc ()
int | shishi_tkt_keytype ()
int32_t | shishi_tkt_keytype_fast ()
int | shishi_tkt_keytype_p ()
int | shishi_tkt_server ()
int | shishi_tkt_server_p ()
int | shishi_tkt_valid_at_time_p ()
int | shishi_tkt_valid_now_p ()
int | shishi_tkt_expired_p ()
int | shishi_tkt_decrypt ()
void | shishi_tkt_done ()
int | shishi_tkt_flags ()
int | shishi_tkt_flags_set ()
int | shishi_tkt_flags_add ()
int | shishi_tkt_forwardable_p ()
int | shishi_tkt_forwarded_p ()
int | shishi_tkt_proxiable_p ()
int | shishi_tkt_proxy_p ()
int | shishi_tkt_may_postdate_p ()
int | shishi_tkt_postdated_p ()
int | shishi_tkt_invalid_p ()
int | shishi_tkt_renewable_p ()
int | shishi_tkt_initial_p ()
int | shishi_tkt_pre_authent_p ()
int | shishi_tkt_hw_authent_p ()
int | shishi_tkt_transited_policy_checked_p ()
int | shishi_tkt_ok_as_delegate_p ()
char * | shishi_tkts_default_file_guess ()
const char * | shishi_tkts_default_file ()
void | shishi_tkts_default_file_set ()
Shishi_tkts * | shishi_tkts_default ()
int | shishi_tkts_default_to_file ()
int | shishi_tkts ()
Shishi_tkt * | shishi_tkts_nth ()
int | shishi_tkts_size ()
int | shishi_tkts_add ()
int | shishi_tkts_new ()
int | shishi_tkts_remove ()
int | shishi_tkts_expire ()
int | shishi_tkts_print_for_service ()
int | shishi_tkts_print ()
int | shishi_tkts_write ()
int | shishi_tkts_to_file ()
int | shishi_tkts_read ()
int | shishi_tkts_from_file ()
void | shishi_tkts_done ()
int | shishi_tkt_match_p ()
Shishi_tkt * | shishi_tkts_find ()
Shishi_tkt * | shishi_tkts_find_for_clientserver ()
Shishi_tkt * | shishi_tkts_find_for_server ()
Shishi_tkt * | shishi_tkts_get ()
Shishi_tkt * | shishi_tkts_get_tgt ()
Shishi_tkt * | shishi_tkts_get_tgs ()
Shishi_tkt * | shishi_tkts_get_for_clientserver ()
Shishi_tkt * | shishi_tkts_get_for_server ()
Shishi_tkt * | shishi_tkts_get_for_localservicepasswd ()
char * | shishi_tkts_default_ccache_guess ()
const char * | shishi_tkts_default_ccache ()
void | shishi_tkts_default_ccache_set ()
int | shishi_tkts_add_ccache_mem ()
int | shishi_tkts_add_ccache_file ()
int | shishi_tkts_from_ccache_mem ()
int | shishi_tkts_from_ccache_file ()
int | shishi_enckdcreppart_print ()
int | shishi_enckdcreppart_save ()
int | shishi_enckdcreppart_parse ()
int | shishi_enckdcreppart_read ()
int | shishi_ticket_save ()
int | shishi_ticket_print ()
int | shishi_kdc_print ()
int | shishi_ticket_parse ()
int | shishi_ticket_read ()
int | shishi_etype_info_print ()
int | shishi_etype_info2_print ()
int | shishi_padata_print ()
int | shishi_methoddata_print ()
Shishi_asn1 | shishi_authenticator ()
int | shishi_authenticator_set_crealm ()
int | shishi_authenticator_set_cname ()
int | shishi_authenticator_client_set ()
int | shishi_authenticator_ctime ()
int | shishi_authenticator_ctime_set ()
int | shishi_authenticator_cusec_get ()
int | shishi_authenticator_cusec_set ()
int | shishi_authenticator_seqnumber_get ()
int | shishi_authenticator_seqnumber_remove ()
int | shishi_authenticator_seqnumber_set ()
int | shishi_authenticator_client ()
int | shishi_authenticator_clientrealm ()
int | shishi_authenticator_remove_cksum ()
int | shishi_authenticator_cksum ()
int | shishi_authenticator_set_cksum ()
int | shishi_authenticator_add_cksum ()
int | shishi_authenticator_add_cksum_type ()
int | shishi_authenticator_remove_subkey ()
Shishi_asn1 | shishi_authenticator_subkey ()
int | shishi_authenticator_get_subkey ()
int | shishi_authenticator_set_subkey ()
int | shishi_authenticator_add_random_subkey ()
int | shishi_authenticator_add_random_subkey_etype ()
int | shishi_authenticator_add_subkey ()
int | shishi_authenticator_clear_authorizationdata ()
int | shishi_authenticator_add_authorizationdata ()
int | shishi_authenticator_authorizationdata ()
int | shishi_authenticator_read ()
int | shishi_authenticator_parse ()
int | shishi_authenticator_from_file ()
int | shishi_authenticator_print ()
int | shishi_authenticator_to_file ()
int | shishi_authenticator_save ()
int | shishi_as ()
void | shishi_as_done ()
Shishi_asn1 | shishi_as_req ()
int | shishi_as_req_build ()
void | shishi_as_req_set ()
int | shishi_as_req_der ()
int | shishi_as_req_der_set ()
Shishi_asn1 | shishi_as_rep ()
void | shishi_as_rep_set ()
int | shishi_as_rep_build ()
int | shishi_as_rep_der ()
int | shishi_as_rep_der_set ()
Shishi_asn1 | shishi_as_krberror ()
int | shishi_as_krberror_der ()
void | shishi_as_krberror_set ()
Shishi_tkt * | shishi_as_tkt ()
void | shishi_as_tkt_set ()
int | shishi_as_sendrecv ()
int | shishi_as_sendrecv_hint ()
int | shishi_as_rep_process ()
int | shishi_tgs ()
void | shishi_tgs_done ()
Shishi_tkt * | shishi_tgs_tgtkt ()
void | shishi_tgs_tgtkt_set ()
Shishi_ap * | shishi_tgs_ap ()
Shishi_asn1 | shishi_tgs_req ()
int | shishi_tgs_req_der ()
int | shishi_tgs_req_der_set ()
void | shishi_tgs_req_set ()
int | shishi_tgs_req_build ()
int | shishi_tgs_req_process ()
Shishi_asn1 | shishi_tgs_rep ()
int | shishi_tgs_rep_der ()
int | shishi_tgs_rep_build ()
int | shishi_tgs_rep_process ()
Shishi_asn1 | shishi_tgs_krberror ()
int | shishi_tgs_krberror_der ()
void | shishi_tgs_krberror_set ()
Shishi_tkt * | shishi_tgs_tkt ()
void | shishi_tgs_tkt_set ()
int | shishi_tgs_sendrecv ()
int | shishi_tgs_sendrecv_hint ()
int | shishi_tgs_set_server ()
int | shishi_tgs_set_realm ()
int | shishi_tgs_set_realmserver ()
int | shishi_kdcreq ()
Shishi_asn1 | shishi_asreq ()
Shishi_asn1 | shishi_asreq_rsc ()
Shishi_asn1 | shishi_tgsreq ()
Shishi_asn1 | shishi_tgsreq_rst ()
int | shishi_kdcreq_save ()
int | shishi_kdcreq_print ()
int | shishi_kdcreq_to_file ()
int | shishi_kdcreq_parse ()
int | shishi_kdcreq_read ()
int | shishi_kdcreq_from_file ()
int | shishi_asreq_clientrealm ()
int | shishi_kdcreq_nonce ()
int | shishi_kdcreq_nonce_set ()
int | shishi_kdcreq_client ()
int | shishi_kdcreq_set_cname ()
int | shishi_kdcreq_server ()
int | shishi_kdcreq_set_sname ()
int | shishi_kdcreq_realm ()
int | shishi_kdcreq_realm_get ()
int | shishi_kdcreq_set_realm ()
int | shishi_kdcreq_set_server ()
int | shishi_kdcreq_set_realmserver ()
int | shishi_kdcreq_till ()
time_t | shishi_kdcreq_tillc ()
int | shishi_kdcreq_etype ()
int | shishi_kdcreq_set_etype ()
int | shishi_kdcreq_options ()
int | shishi_kdcreq_forwardable_p ()
int | shishi_kdcreq_forwarded_p ()
int | shishi_kdcreq_proxiable_p ()
int | shishi_kdcreq_proxy_p ()
int | shishi_kdcreq_allow_postdate_p ()
int | shishi_kdcreq_postdated_p ()
int | shishi_kdcreq_renewable_p ()
int | shishi_kdcreq_disable_transited_check_p ()
int | shishi_kdcreq_renewable_ok_p ()
int | shishi_kdcreq_enc_tkt_in_skey_p ()
int | shishi_kdcreq_renew_p ()
int | shishi_kdcreq_validate_p ()
int | shishi_kdcreq_options_set ()
int | shishi_kdcreq_options_add ()
int | shishi_kdcreq_clear_padata ()
int | shishi_kdcreq_get_padata ()
int | shishi_kdcreq_get_padata_tgs ()
int | shishi_kdcreq_add_padata ()
int | shishi_kdcreq_add_padata_tgs ()
int | shishi_kdcreq_add_padata_preauth ()
int | shishi_kdcreq_build ()
int | shishi_as_derive_salt ()
int | shishi_tgs_process ()
int | shishi_as_process ()
int | shishi_kdc_process ()
int | shishi_kdcreq_sendrecv ()
int | shishi_kdcreq_sendrecv_hint ()
int | shishi_kdc_copy_crealm ()
int | shishi_as_check_crealm ()
int | shishi_kdc_copy_cname ()
int | shishi_as_check_cname ()
int | shishi_kdc_copy_nonce ()
int | shishi_kdc_check_nonce ()
Shishi_asn1 | shishi_asrep ()
Shishi_asn1 | shishi_tgsrep ()
int | shishi_kdcrep_save ()
int | shishi_kdcrep_print ()
int | shishi_kdcrep_to_file ()
int | shishi_kdcrep_parse ()
int | shishi_kdcrep_read ()
int | shishi_kdcrep_from_file ()
int | shishi_kdcrep_clear_padata ()
int | shishi_kdcrep_get_enc_part_etype ()
int | shishi_kdcrep_add_enc_part ()
int | shishi_kdcrep_get_ticket ()
int | shishi_kdcrep_set_ticket ()
int | shishi_kdcrep_crealm_set ()
int | shishi_kdcrep_cname_set ()
int | shishi_kdcrep_client_set ()
int | shishi_kdcrep_crealmserver_set ()
int | shishi_kdcrep_set_enc_part ()
int | shishi_kdcrep_decrypt ()
Shishi_asn1 | shishi_enckdcreppart ()
Shishi_asn1 | shishi_encasreppart ()
int | shishi_enckdcreppart_get_key ()
int | shishi_enckdcreppart_key_set ()
int | shishi_enckdcreppart_nonce_set ()
int | shishi_enckdcreppart_flags_set ()
int | shishi_enckdcreppart_authtime_set ()
int | shishi_enckdcreppart_starttime_set ()
int | shishi_enckdcreppart_endtime_set ()
int | shishi_enckdcreppart_renew_till_set ()
int | shishi_enckdcreppart_srealm_set ()
int | shishi_enckdcreppart_sname_set ()
int | shishi_enckdcreppart_server_set ()
int | shishi_enckdcreppart_srealmserver_set ()
int | shishi_enckdcreppart_populate_encticketpart ()
Shishi_asn1 | shishi_krberror ()
int | shishi_krberror_print ()
int | shishi_krberror_save ()
int | shishi_krberror_to_file ()
int | shishi_krberror_parse ()
int | shishi_krberror_read ()
int | shishi_krberror_from_file ()
int | shishi_krberror_build ()
int | shishi_krberror_der ()
int | shishi_krberror_crealm ()
int | shishi_krberror_remove_crealm ()
int | shishi_krberror_set_crealm ()
int | shishi_krberror_client ()
int | shishi_krberror_set_cname ()
int | shishi_krberror_remove_cname ()
int | shishi_krberror_client_set ()
int | shishi_krberror_realm ()
int | shishi_krberror_set_realm ()
int | shishi_krberror_server ()
int | shishi_krberror_remove_sname ()
int | shishi_krberror_set_sname ()
int | shishi_krberror_server_set ()
int | shishi_krberror_ctime ()
int | shishi_krberror_ctime_set ()
int | shishi_krberror_remove_ctime ()
int | shishi_krberror_cusec ()
int | shishi_krberror_cusec_set ()
int | shishi_krberror_remove_cusec ()
int | shishi_krberror_stime ()
int | shishi_krberror_stime_set ()
int | shishi_krberror_susec ()
int | shishi_krberror_susec_set ()
int | shishi_krberror_errorcode_set ()
int | shishi_krberror_etext ()
int | shishi_krberror_set_etext ()
int | shishi_krberror_remove_etext ()
int | shishi_krberror_edata ()
int | shishi_krberror_set_edata ()
int | shishi_krberror_remove_edata ()
int | shishi_krberror_errorcode ()
int | shishi_krberror_errorcode_fast ()
int | shishi_krberror_pretty_print ()
const char * | shishi_krberror_errorcode_message ()
const char * | shishi_krberror_message ()
int | shishi_krberror_methoddata ()
const char * | shishi_generalize_time ()
const char * | shishi_generalize_now ()
time_t | shishi_generalize_ctime ()
int | shishi_time ()
int | shishi_ctime ()
int | shishi_randomize ()
int | shishi_crc ()
int | shishi_md4 ()
int | shishi_md5 ()
int | shishi_hmac_md5 ()
int | shishi_hmac_sha1 ()
int | shishi_des_cbc_mac ()
int | shishi_arcfour ()
int | shishi_des ()
int | shishi_3des ()
int | shishi_aes_cts ()
int | shishi_cipher_supported_p ()
const char * | shishi_cipher_name ()
int | shishi_cipher_blocksize ()
int | shishi_cipher_confoundersize ()
size_t | shishi_cipher_keylen ()
size_t | shishi_cipher_randomlen ()
int | shishi_cipher_defaultcksumtype ()
int | shishi_cipher_parse ()
int | shishi_checksum_supported_p ()
const char * | shishi_checksum_name ()
size_t | shishi_checksum_cksumlen ()
int | shishi_checksum_parse ()
int | shishi_string_to_key ()
int | shishi_random_to_key ()
int | shishi_encrypt_ivupdate_etype ()
int | shishi_encrypt_iv_etype ()
int | shishi_encrypt_etype ()
int | shishi_encrypt_ivupdate ()
int | shishi_encrypt_iv ()
int | shishi_encrypt ()
int | shishi_decrypt_ivupdate_etype ()
int | shishi_decrypt_iv_etype ()
int | shishi_decrypt_etype ()
int | shishi_decrypt_ivupdate ()
int | shishi_decrypt_iv ()
int | shishi_decrypt ()
int | shishi_checksum ()
int | shishi_verify ()
int | shishi_dk ()
int | shishi_dr ()
int | shishi_n_fold ()
int | shishi_pbkdf2_sha1 ()
Shishi_crypto * | shishi_crypto ()
void | shishi_crypto_close ()
int | shishi_crypto_encrypt ()
int | shishi_crypto_decrypt ()
const char * | shishi_check_version ()
int | (*shishi_prompt_password_func) ()
void | shishi_prompt_password_callback_set ()
shishi_prompt_password_func | shishi_prompt_password_callback_get ()
int | shishi_prompt_password ()
int | shishi_asn1_number_of_elements ()
int | shishi_asn1_empty_p ()
int | shishi_asn1_read ()
int | shishi_asn1_read_inline ()
int | shishi_asn1_read_integer ()
int | shishi_asn1_read_int32 ()
int | shishi_asn1_read_uint32 ()
int | shishi_asn1_read_bitstring ()
int | shishi_asn1_read_optional ()
int | shishi_asn1_write ()
int | shishi_asn1_write_integer ()
int | shishi_asn1_write_int32 ()
int | shishi_asn1_write_uint32 ()
int | shishi_asn1_write_bitstring ()
void | shishi_asn1_done ()
Shishi_asn1 | shishi_asn1_pa_enc_ts_enc ()
Shishi_asn1 | shishi_asn1_encrypteddata ()
Shishi_asn1 | shishi_asn1_padata ()
Shishi_asn1 | shishi_asn1_methoddata ()
Shishi_asn1 | shishi_asn1_etype_info ()
Shishi_asn1 | shishi_asn1_etype_info2 ()
Shishi_asn1 | shishi_asn1_asreq ()
Shishi_asn1 | shishi_asn1_asrep ()
Shishi_asn1 | shishi_asn1_tgsreq ()
Shishi_asn1 | shishi_asn1_tgsrep ()
Shishi_asn1 | shishi_asn1_apreq ()
Shishi_asn1 | shishi_asn1_aprep ()
Shishi_asn1 | shishi_asn1_ticket ()
Shishi_asn1 | shishi_asn1_encapreppart ()
Shishi_asn1 | shishi_asn1_encticketpart ()
Shishi_asn1 | shishi_asn1_authenticator ()
Shishi_asn1 | shishi_asn1_enckdcreppart ()
Shishi_asn1 | shishi_asn1_encasreppart ()
Shishi_asn1 | shishi_asn1_krberror ()
Shishi_asn1 | shishi_asn1_krbsafe ()
Shishi_asn1 | shishi_asn1_priv ()
Shishi_asn1 | shishi_asn1_encprivpart ()
int | shishi_asn1_to_der ()
int | shishi_asn1_to_der_field ()
Shishi_msgtype | shishi_asn1_msgtype ()
Shishi_msgtype | shishi_der_msgtype ()
void | shishi_asn1_print ()
Shishi_asn1 | shishi_der2asn1 ()
Shishi_asn1 | shishi_der2asn1_padata ()
Shishi_asn1 | shishi_der2asn1_methoddata ()
Shishi_asn1 | shishi_der2asn1_etype_info ()
Shishi_asn1 | shishi_der2asn1_etype_info2 ()
Shishi_asn1 | shishi_der2asn1_ticket ()
Shishi_asn1 | shishi_der2asn1_encticketpart ()
Shishi_asn1 | shishi_der2asn1_asreq ()
Shishi_asn1 | shishi_der2asn1_tgsreq ()
Shishi_asn1 | shishi_der2asn1_asrep ()
Shishi_asn1 | shishi_der2asn1_tgsrep ()
Shishi_asn1 | shishi_der2asn1_kdcrep ()
Shishi_asn1 | shishi_der2asn1_kdcreq ()
Shishi_asn1 | shishi_der2asn1_apreq ()
Shishi_asn1 | shishi_der2asn1_aprep ()
Shishi_asn1 | shishi_der2asn1_authenticator ()
Shishi_asn1 | shishi_der2asn1_krberror ()
Shishi_asn1 | shishi_der2asn1_krbsafe ()
Shishi_asn1 | shishi_der2asn1_priv ()
Shishi_asn1 | shishi_der2asn1_encasreppart ()
Shishi_asn1 | shishi_der2asn1_enctgsreppart ()
Shishi_asn1 | shishi_der2asn1_enckdcreppart ()
Shishi_asn1 | shishi_der2asn1_encapreppart ()
Shishi_asn1 | shishi_der2asn1_encprivpart ()
int | shishi_ap ()
int | shishi_ap_etype ()
int | shishi_ap_nosubkey ()
void | shishi_ap_done ()
int | shishi_ap_set_tktoptions ()
int | shishi_ap_tktoptions ()
int | shishi_ap_etype_tktoptionsdata ()
int | shishi_ap_set_tktoptionsdata ()
int | shishi_ap_tktoptionsdata ()
int | shishi_ap_set_tktoptionsraw ()
int | shishi_ap_tktoptionsraw ()
int | shishi_ap_set_tktoptionsasn1usage ()
int | shishi_ap_tktoptionsasn1usage ()
Shishi_tkt * | shishi_ap_tkt ()
void | shishi_ap_tkt_set ()
int | shishi_ap_authenticator_cksumdata ()
void | shishi_ap_authenticator_cksumdata_set ()
void | shishi_ap_authenticator_cksumraw_set ()
int32_t | shishi_ap_authenticator_cksumtype ()
void | shishi_ap_authenticator_cksumtype_set ()
Shishi_asn1 | shishi_ap_authenticator ()
void | shishi_ap_authenticator_set ()
Shishi_asn1 | shishi_ap_req ()
void | shishi_ap_req_set ()
int | shishi_ap_req_der ()
int | shishi_ap_req_der_set ()
int | shishi_ap_req_build ()
int | shishi_ap_req_asn1 ()
Shishi_key * | shishi_ap_key ()
int | shishi_ap_req_decode ()
int | shishi_ap_req_process ()
int | shishi_ap_req_process_keyusage ()
Shishi_asn1 | shishi_ap_rep ()
void | shishi_ap_rep_set ()
int | shishi_ap_rep_der ()
int | shishi_ap_rep_der_set ()
int | shishi_ap_rep_verify ()
int | shishi_ap_rep_verify_der ()
int | shishi_ap_rep_verify_asn1 ()
int | shishi_ap_rep_asn1 ()
int | shishi_ap_rep_build ()
Shishi_asn1 | shishi_ap_encapreppart ()
void | shishi_ap_encapreppart_set ()
const char * | shishi_ap_option2string ()
Shishi_apoptions | shishi_ap_string2option ()
const char * | shishi_key_principal ()
void | shishi_key_principal_set ()
const char * | shishi_key_realm ()
void | shishi_key_realm_set ()
int | shishi_key_type ()
void | shishi_key_type_set ()
const char * | shishi_key_value ()
void | shishi_key_value_set ()
const char * | shishi_key_name ()
size_t | shishi_key_length ()
uint32_t | shishi_key_version ()
void | shishi_key_version_set ()
time_t | shishi_key_timestamp ()
void | shishi_key_timestamp_set ()
int | shishi_key ()
void | shishi_key_done ()
void | shishi_key_copy ()
int | shishi_key_print ()
int | shishi_key_to_file ()
int | shishi_key_parse ()
int | shishi_key_random ()
int | shishi_key_from_value ()
int | shishi_key_from_base64 ()
int | shishi_key_from_random ()
int | shishi_key_from_string ()
int | shishi_key_from_name ()
int | shishi_keys ()
void | shishi_keys_done ()
int | shishi_keys_size ()
const Shishi_key * | shishi_keys_nth ()
void | shishi_keys_remove ()
int | shishi_keys_add ()
int | shishi_keys_print ()
int | shishi_keys_from_file ()
int | shishi_keys_to_file ()
Shishi_key * | shishi_keys_for_serverrealm_in_file ()
Shishi_key * | shishi_keys_for_server_in_file ()
Shishi_key * | shishi_keys_for_localservicerealm_in_file ()
int | shishi_keys_add_keytab_mem ()
int | shishi_keys_add_keytab_file ()
int | shishi_keys_from_keytab_mem ()
int | shishi_keys_from_keytab_file ()
int | shishi_keys_to_keytab_mem ()
int | shishi_keys_to_keytab_file ()
const char * | shishi_hostkeys_default_file ()
void | shishi_hostkeys_default_file_set ()
Shishi_key * | shishi_hostkeys_for_server ()
Shishi_key * | shishi_hostkeys_for_serverrealm ()
Shishi_key * | shishi_hostkeys_for_localservicerealm ()
Shishi_key * | shishi_hostkeys_for_localservice ()
Shishi_asn1 | shishi_encapreppart ()
int | shishi_encapreppart_time_copy ()
int | shishi_encapreppart_ctime ()
int | shishi_encapreppart_ctime_set ()
int | shishi_encapreppart_cusec_get ()
int | shishi_encapreppart_cusec_set ()
int | shishi_encapreppart_print ()
int | shishi_encapreppart_save ()
int | shishi_encapreppart_to_file ()
int | shishi_encapreppart_read ()
int | shishi_encapreppart_parse ()
int | shishi_encapreppart_from_file ()
int | shishi_encapreppart_get_key ()
int | shishi_encapreppart_seqnumber_get ()
int | shishi_encapreppart_seqnumber_remove ()
int | shishi_encapreppart_seqnumber_set ()
Shishi_asn1 | shishi_apreq ()
int | shishi_apreq_parse ()
int | shishi_apreq_from_file ()
int | shishi_apreq_print ()
int | shishi_apreq_to_file ()
int | shishi_apreq_read ()
int | shishi_apreq_save ()
int | shishi_apreq_set_ticket ()
int | shishi_apreq_set_authenticator ()
int | shishi_apreq_add_authenticator ()
int | shishi_apreq_options ()
int | shishi_apreq_use_session_key_p ()
int | shishi_apreq_mutual_required_p ()
int | shishi_apreq_options_set ()
int | shishi_apreq_options_add ()
int | shishi_apreq_options_remove ()
int | shishi_apreq_get_ticket ()
int | shishi_apreq_get_authenticator_etype ()
int | shishi_apreq_decrypt ()
Shishi_asn1 | shishi_aprep ()
int | shishi_aprep_print ()
int | shishi_aprep_save ()
int | shishi_aprep_to_file ()
int | shishi_aprep_read ()
int | shishi_aprep_parse ()
int | shishi_aprep_from_file ()
int | shishi_aprep_decrypt ()
int | shishi_aprep_verify ()
int | shishi_aprep_enc_part_set ()
int | shishi_aprep_enc_part_add ()
int | shishi_aprep_enc_part_make ()
int | shishi_aprep_get_enc_part_etype ()
int | shishi_kdc_sendrecv ()
int | shishi_kdc_sendrecv_hint ()
Shishi_asn1 | shishi_encticketpart ()
int | shishi_encticketpart_key_set ()
int | shishi_encticketpart_get_key ()
int | shishi_encticketpart_crealm ()
int | shishi_encticketpart_crealm_set ()
int | shishi_encticketpart_client ()
int | shishi_encticketpart_clientrealm ()
int | shishi_encticketpart_cname_set ()
int | shishi_encticketpart_print ()
int | shishi_encticketpart_flags_set ()
int | shishi_encticketpart_transited_set ()
int | shishi_encticketpart_authtime_set ()
int | shishi_encticketpart_endtime_set ()
int | shishi_encticketpart_authtime ()
time_t | shishi_encticketpart_authctime ()
int | shishi_safe ()
void | shishi_safe_done ()
Shishi_key * | shishi_safe_key ()
void | shishi_safe_key_set ()
Shishi_asn1 | shishi_safe_safe ()
void | shishi_safe_safe_set ()
int | shishi_safe_safe_der ()
int | shishi_safe_safe_der_set ()
int | shishi_safe_print ()
int | shishi_safe_save ()
int | shishi_safe_to_file ()
int | shishi_safe_parse ()
int | shishi_safe_read ()
int | shishi_safe_from_file ()
int | shishi_safe_cksum ()
int | shishi_safe_set_cksum ()
int | shishi_safe_user_data ()
int | shishi_safe_set_user_data ()
int | shishi_safe_build ()
int | shishi_safe_verify ()
int | shishi_priv ()
void | shishi_priv_done ()
Shishi_key * | shishi_priv_key ()
void | shishi_priv_key_set ()
Shishi_asn1 | shishi_priv_priv ()
void | shishi_priv_priv_set ()
int | shishi_priv_priv_der ()
int | shishi_priv_priv_der_set ()
Shishi_asn1 | shishi_priv_encprivpart ()
void | shishi_priv_encprivpart_set ()
int | shishi_priv_encprivpart_der ()
int | shishi_priv_encprivpart_der_set ()
int | shishi_priv_print ()
int | shishi_priv_save ()
int | shishi_priv_to_file ()
int | shishi_priv_parse ()
int | shishi_priv_read ()
int | shishi_priv_from_file ()
int | shishi_priv_enc_part_etype ()
int | shishi_priv_set_enc_part ()
int | shishi_encprivpart_user_data ()
int | shishi_encprivpart_set_user_data ()
int | shishi_priv_build ()
int | shishi_priv_process ()
int | shishi_authorized_p ()
int | shishi_authorization_parse ()
int | shishi_authorize_strcmp ()
int | shishi_authorize_k5login ()
char * | shishi_x509ca_default_file_guess ()
void | shishi_x509ca_default_file_set ()
const char * | shishi_x509ca_default_file ()
char * | shishi_x509cert_default_file_guess ()
void | shishi_x509cert_default_file_set ()
const char * | shishi_x509cert_default_file ()
char * | shishi_x509key_default_file_guess ()
void | shishi_x509key_default_file_set ()
const char * | shishi_x509key_default_file ()
time_t | shishi_get_date ()
void | shishi_xalloc_die ()
Shishi_dns | shishi_resolv ()
void | shishi_resolv_free ()

## Types and Values

enum | Shishi_rc
enum | Shishi_name_type
enum | Shishi_padata_type
enum | Shishi_tr_type
enum | Shishi_apoptions
enum | Shishi_ticketflags
enum | Shishi_KDCOptions
enum | Shishi_msgtype
enum | Shishi_lrtype
enum | Shishi_etype
enum | Shishi_cksumtype
enum | Shishi_filetype
enum | Shishi_outputtype
enum | Shishi_authorization
enum | Shishi_keyusage
enum | Shishi_krb_error
enum | Shishi_tkts_hintflags
struct | Shishi_tkts_hint
struct | Shishi_dns_st
struct | Shishi_dns_srv_st
#define | SHISHI_DNS_IN
#define | SHISHI_DNS_TXT
#define | SHISHI_DNS_SRV
typedef | Shishi_dns
typedef | Shishi_dns_srv
typedef | Shishi
typedef | Shishi_tkt
typedef | Shishi_tkts
typedef | Shishi_as
typedef | Shishi_tgs
typedef | Shishi_ap
typedef | Shishi_key
typedef | Shishi_keys
typedef | Shishi_safe
typedef | Shishi_priv
typedef | Shishi_asn1
typedef | Shishi_crypto
#define | SHISHI_GENERALIZEDTIME_LENGTH
#define | SHISHI_GENERALIZEDTIMEZ_LENGTH

## Description

The main library interfaces are declared in shishi.h.

## Functions

### shishi_alloc_fail_function ()

    void
    (*shishi_alloc_fail_function) (void);

### shishi ()

    Shishi *
    shishi (void);

Initializes the Shishi library, and primes logging so that future warnings and informational messages are printed on `stderr`. If this function fails, it may send its own diagnostic errors to `stderr`.

#### Returns

Returns a Shishi library handle, or `NULL` on error.

### shishi_server ()

    Shishi *
    shishi_server (void);

Initializes the Shishi library, and primes logging so that future warnings and informational messages are sent to the syslog system. If this function fails, it may print diagnostic errors in the syslog.

#### Returns

Returns a Shishi library handle, or `NULL` on error.

### shishi_done ()

    void
    shishi_done (Shishi *handle);

Deallocates the Shishi library handle. The handle must not be used in any call to a shishi function after an execution of `shishi_done()`.

If there is a default tkts, it is written to the default tkts file. If you do not wish to write the default tkts file, close the default file before calling this function. It is closed with a simple shishi_tkts_done(`handle` , `NULL`). For related information, see `shishi_tkts_default_file_set()`.

#### Parameters

handle | Shishi handle as allocated by `shishi_init()`. |

### shishi_init ()

    int
    shishi_init (Shishi **handle);

Creates a Shishi library handle, using `shishi()`, and reads the system configuration file, user configuration file and user tickets from their default locations. The paths to the system configuration file is decided at compile time, and is $sysconfdir/shishi.conf. The user configuration file is $HOME/.shishi/config, and the user ticket file is $HOME/.shishi/ticket.

The handle is allocated regardless of return value. The single exception being `SHISHI_HANDLE_ERROR`, which indicates a problem in allocating the handle. Other error conditions could arise while reading files.

#### Parameters

handle | Pointer to a Shishi handle created by this call. |

#### Returns

Returns `SHISHI_OK` iff successful.

### shishi_init_with_paths ()

    int
    shishi_init_with_paths (Shishi **handle,
                            const char *tktsfile,
                            const char *systemcfgfile,
                            const char *usercfgfile);

Creates a Shishi library handle, using `shishi()`, and reads the system configuration file, user configuration file, and user tickets at the specified locations. If any of `usercfgfile` or `systemcfgfile` is `NULL`, the file is read from its default location, which for the system configuration is decided at compile time, and is $sysconfdir/shishi.conf, and for the user configuration it is $HOME/.shishi/config. If the ticket file name is `NULL`, a ticket file is not read at all.

The handle is allocated regardless of return value. The single exception being `SHISHI_HANDLE_ERROR`, which indicates a problem in allocating the handle. Other error conditions could arise while reading files.

#### Parameters

handle | Pointer to a Shishi handle created by this call. |
tktsfile | Filename of ticket file, or `NULL`. |
systemcfgfile | Filename of system configuration, or `NULL`. |
usercfgfile | Filename of user configuration, or `NULL`. |

#### Returns

Returns `SHISHI_OK` iff successful.

### shishi_init_server ()

    int
    shishi_init_server (Shishi **handle);

Creates a Shishi library handle, using `shishi_server()`, and reads the system configuration file. The path to the system configuration file is decided at compile time, and is $sysconfdir/shishi.conf.

The handle is allocated regardless of return value. The single exception being `SHISHI_HANDLE_ERROR`, which indicates a problem in allocating the handle. Other error conditions could arise while reading the file.

#### Parameters

handle | Pointer to a Shishi handle created by this call. |

#### Returns

Returns `SHISHI_OK` iff successful.

### shishi_init_server_with_paths ()

    int
    shishi_init_server_with_paths (Shishi **handle,
                                   const char *systemcfgfile);

Creates a Shishi library handle, using `shishi_server()`, and reads the system configuration file from the specified location. The path to the system configuration file is decided at compile time, and is $sysconfdir/shishi.conf.

The handle is allocated regardless of return value. The single exception being `SHISHI_HANDLE_ERROR`, which indicates a problem in allocating the handle. Other error conditions could arise while reading the file.

#### Parameters

handle | Pointer to a Shishi handle created by this call. |
systemcfgfile | Filename of system configuration, or `NULL`. |

#### Returns

Returns `SHISHI_OK` iff successful.

### shishi_cfg ()

    int
    shishi_cfg (Shishi *handle,
                const char *option);

Configures the shishi library according to the options given in `option` .

#### Parameters

handle | Shishi library handle created by `shishi_init()`. |
option | String containing shishi library options. |

#### Returns

Returns `SHISHI_OK` if `option` is valid and configuration was successful.

### shishi_cfg_from_file ()

    int
    shishi_cfg_from_file (Shishi *handle,
                          const char *cfg);

Configures the shishi library using a configuration file located at `cfg` .

#### Parameters

handle | Shishi library handle created by `shishi_init()`. |
cfg | Name of configuration file. |

#### Returns

Returns `SHISHI_OK` if successful.

### shishi_cfg_print ()

    int
    shishi_cfg_print (Shishi *handle,
                      FILE *fh);

Prints library configuration status to `fh` . This function is mostly intended for debugging purposes.

#### Parameters

handle | Shishi library handle created by `shishi_init()`. |
fh | File stream handle opened for writing. |

#### Returns

Always returns `SHISHI_OK`.

### shishi_cfg_default_systemfile ()

    const char *
    shishi_cfg_default_systemfile (Shishi *handle);

The system configuration file name is decided at compile time, but is replaced by assigning another file name to the environment variable $SHISHI_CONFIG. This call offers a single interface for determining the file name, to which the library turns for its settings.

#### Parameters

handle | Shishi library handle created by `shishi_init()`. |

#### Returns

Returns file name of present system configuration.

### shishi_cfg_default_userdirectory ()

    const char *
    shishi_cfg_default_userdirectory (Shishi *handle);

The default user directory, referred to for Shishi ticket cache and other purposes, is normally computed by appending the fixed string "/.shishi" to the content of the environment variable $HOME.

This hard coded directory, i.e., "$HOME/.shishi/", can be replaced by whatever complete path is stored in the environment variable $SHISHI_HOME.

#### Parameters

handle | Shishi library handle created by `shishi_init()`. |

#### Returns

Returns the user's directory name where the Shishi library will search for configuration files, ticket caches, etcetera.

### shishi_cfg_default_userfile ()

    const char *
    shishi_cfg_default_userfile (Shishi *handle);

Reports the absolute filename of the default user configuration file. This is typically "$HOME/.shishi/shishi.conf".

The value of $SHISHI_HOME will change the directory part, as stated regarding `shishi_cfg_default_userdirectory()`.

#### Parameters

handle | Shishi library handle created by `shishi_init()`. |

#### Returns

Returns the user's configuration filename.

### shishi_cfg_userdirectory_file ()

    char *
    shishi_cfg_userdirectory_file (Shishi *handle,
                                   const char *file);

Reports the full path to the file where the Shishi library expects to find the user's library configuration, given that the file itself is named by the parameter `file` .

The answer is composed from the value of `file` and the directory returned by `shishi_cfg_default_userdirectory()`. Typically, the returned string would be expanded from "$HOME/.shishi/`file` ".

#### Parameters

handle | Shishi library handle created by `shishi_init()`. |
file | Basename of file to use for the user's configuration settings of the library. |

#### Returns

Returns the absolute filename to the argument `file` , relative to the user specific Shishi configuration directory.

### shishi_cfg_clientkdcetype ()

    int
    shishi_cfg_clientkdcetype (Shishi *handle,
                               int32_t **etypes);

Sets the variable `etypes` to a static array of preferred encryption types applicable to clients.

#### Parameters

handle | Shishi library handle created by `shishi_init()`. |
etypes | Pointer to an array of encryption types. |

#### Returns

Returns the number of encryption types referred to by the updated array pointer, or zero, should no type exist.

### shishi_cfg_clientkdcetype_fast ()

    int32_t
    shishi_cfg_clientkdcetype_fast (Shishi *handle);

Extracts the default encryption type from the list of preferred encryption types acceptable to the client.

When the preferred list is empty, `SHISHI_AES256_CTS_HMAC_SHA1_96` is returned as a sensible default type.

#### Parameters

handle | Shishi library handle created by `shishi_init()`. |

#### Returns

Returns the default encryption type.

### shishi_cfg_clientkdcetype_set ()

    int
    shishi_cfg_clientkdcetype_set (Shishi *handle,
                                   char *value);

Sets the configuration option "client-kdc-etypes" from `value` . The string contains encryption types, integers or names, separated by comma or by whitespace. An example naming three encryption types could be:

aes256-cts-hmac-sha1-96 des3-cbc-sha1-kd des-cbc-md5

#### Parameters

handle | Shishi library handle created by `shishi_init()`. |
value | String naming acceptable encryption types. |

#### Returns

Returns `SHISHI_OK` if successful, and `SHISHI_INVALID_ARGUMENT` otherwise.

### shishi_cfg_authorizationtype_set ()

    int
    shishi_cfg_authorizationtype_set (Shishi *handle,
                                      char *value);

Sets the configuration option "authorization-types" from `value` . The string contains authorization types, integers or names, separated by comma or whitespace.

As an example, "k5login basic" would first check Kerberos5 authentication based on preset principals, and then fall back to the basic test of identical principal names.

#### Parameters

handle | Shishi library handle created by `shishi_init()`. |
value | String listing acceptable authorization types. |

#### Returns

Returns `SHISHI_OK` if successful, and `SHISHI_INVALID_ARGUMENT` otherwise.

### shishi_strerror ()

    const char *
    shishi_strerror (int err);

Converts the return code in `err` to a human readable string.

#### Parameters

err | shishi error code. |

#### Returns

Returns a pointer to a statically allocated string containing a description of the error with code `err` . This string can be used to output a diagnostic message to the user.

### shishi_error ()

    const char *
    shishi_error (Shishi *handle);

Extracts detailed information on the most recently occurred error condition. Note that memory is managed by the Shishi library, so the returned string must not be deallocated.

#### Parameters

handle | shishi handle as allocated by `shishi_init()`. |

#### Returns

Returns a pointer to a string describing an error. The string must not be deallocated by the caller.

### shishi_error_clear ()

    void
    shishi_error_clear (Shishi *handle);

Clears the internal error description. See `shishi_error()` on how to access the error string, and `shishi_error_set()` as well as `shishi_error_printf()` on how to set the error string.

This function is mostly for Shishi's internal use, but if you develop an extension of Shishi, it may be useful to support the same error handling infrastructure.

#### Parameters

handle | shishi handle as allocated by `shishi_init()`. |

### shishi_error_set ()

    void
    shishi_error_set (Shishi *handle,
                      const char *errstr);

Sets the error description to the content of `errstr` . The string is copied into the Shishi internal structure, so you can deallocate any string passed to this function.

This function is mostly for Shishi's internal use, but if you develop an extension of Shishi, it may be useful to support the same error handling infrastructure.

#### Parameters

handle | shishi handle as allocated by `shishi_init()`. |
errstr | A null-terminated character string holding a description, or `NULL` to clear the internal error string. |

### shishi_error_printf ()

    void
    shishi_error_printf (Shishi *handle,
                         const char *format,
                         ...);

Sets the internal error description to a printf(3) formatted string. This function is mostly for Shishi's internal use, but if you develop an extension of Shishi, it may be useful to support the same infrastructure for error handling.

#### Parameters

handle | shishi handle as allocated by `shishi_init()`. |
format | printf style format string. |
... | printf style arguments. |

### shishi_error_outputtype ()

    int
    shishi_error_outputtype (Shishi *handle);

Reports the current output type used in message logging.

#### Parameters

handle | shishi handle as allocated by `shishi_init()`. |

#### Returns

Returns the output type. `SHISHI_OUTPUTTYPE_NULL` means no output. `SHISHI_OUTPUTTYPE_STDERR` and `SHISHI_OUTPUTTYPE_SYSLOG` direct text to the console, or to the syslog system.

### shishi_error_set_outputtype ()

    void
    shishi_error_set_outputtype (Shishi *handle,
                                 int type);

Sets the output type (`NULL`, `stderr` or `syslog`) used for information and warning messages. Intended values are `SHISHI_OUTPUTTYPE_NULL`, for no output at all, `SHISHI_OUTPUTTYPE_STDERR` for output to the console, and `SHISHI_OUTPUTTYPE_SYSLOG` for syslog messaging. The first value covers everything different from the latter two values.

#### Parameters

handle | shishi handle as allocated by `shishi_init()`. |
type | output type, of enum type Shishi_outputtype. |

### shishi_info ()

    void
    shishi_info (Shishi *handle,
                 const char *format,
                 ...);

Prints an informational message, composed from the arguments, to the output stream set in `handle` .

#### Parameters

handle | shishi handle as allocated by `shishi_init()`. |
format | printf style format string. |
... | printf style arguments. |

### shishi_warn ()

    void
    shishi_warn (Shishi *handle,
                 const char *format,
                 ...);

Prints a warning, composed from the arguments, to the output stream set in `handle` .

#### Parameters

handle | shishi handle as allocated by `shishi_init()`. |
format | printf style format string. |
... | printf style arguments. |

### shishi_verbose ()

    void
    shishi_verbose (Shishi *handle,
                    const char *format,
                    ...);

Prints a diagnostic message, composed from the arguments, to the output stream set in `handle` . The current verbosity setting determines whether the message is actually printed, or is suppressed due to low significance.

#### Parameters

handle | shishi handle as allocated by `shishi_init()`. |
format | printf style format string. |
... | printf style arguments. |

### shishi_realm_default_guess ()

    char *
    shishi_realm_default_guess (void);

Guesses a realm based on `getdomainname()`, which really responds with a NIS/YP domain, but if set properly, it might be a good first guess. If this NIS query fails, call `gethostname()`, and on its failure, fall back to returning the artificial string "could-not-guess-default-realm".

Note that the hostname is not trimmed off of the string returned by `gethostname()`, thus pretending the local host name is a valid realm name. The resulting corner case could merit a check that the suggested realm is distinct from the fully qualifies host, and if not, simply strip the host name from the returned string before it is used in an application. One reason for sticking with the present behaviour, is that some systems respond with a non-qualified host name as reply from `gethostname()`.

#### Returns

Returns a guessed realm for the running host, containing a string that has to be deallocated with `free()` by the caller.

### shishi_realm_default ()

    const char *
    shishi_realm_default (Shishi *handle);

Determines name of default realm, i.e., the name of whatever realm the library will use whenever an explicit realm is not stated during a library call.

#### Parameters

handle | Shishi library handle created by `shishi_init()`. |

#### Returns

Returns the default realm in use by the library. Not a copy, so do not modify or deallocate the returned string.

### shishi_realm_default_set ()

    void
    shishi_realm_default_set (Shishi *handle,
                              const char *realm);

Sets the default realm used by the library; or, with `realm` set to `NULL`, resets the library realm setting to that name selected by configuration for default value.

The string is copied into the library, so you can dispose of the content in `realm` immediately after calling this function.

#### Parameters

handle | Shishi library handle created by `shishi_init()`. |
realm | String stating a new default realm name, or `NULL`. |

### shishi_realm_for_server_file ()

    char *
    shishi_realm_for_server_file (Shishi *handle,
                                  char *server);

Finds the realm applicable to a host `server` , using the standard configuration file.

#### Parameters

handle | Shishi library handle created by `shishi_init()`. |
server | Hostname to determine realm for. |

#### Returns

Returns realm for host, or `NULL` if not known.

### shishi_realm_for_server_dns ()

    char *
    shishi_realm_for_server_dns (Shishi *handle,
                                 char *server);

Finds the realm for a host `server` using DNS lookup, as is prescribed in "draft-ietf-krb-wg-krb-dns-locate-03.txt".

Since DNS lookup can be spoofed, relying on the realm information may result in a redirection attack. In a single-realm scenario, this only achieves a denial of service, but with trust across multiple realms the attack may redirect you to a compromised realm. For this reason, Shishi prints a warning, suggesting that the user should instead add a proper 'server-realm' configuration token.

To illustrate the DNS information used, here is an extract from a zone file for the domain ASDF.COM:

_kerberos.asdf.com. IN TXT "ASDF.COM" _kerberos.mrkserver.asdf.com. IN TXT "MARKETING.ASDF.COM" _kerberos.salesserver.asdf.com. IN TXT "SALES.ASDF.COM"

Let us suppose that in this case, a client wishes to use a service on the host "foo.asdf.com". It would first query for

_kerberos.foo.asdf.com. IN TXT

Finding no match, it would then query for

_kerberos.asdf.com. IN TXT

With the resource records stated above, the latter query returns a positive answer.

#### Parameters

handle | Shishi library handle created by `shishi_init()`. |
server | Hostname to find realm for. |

#### Returns

Returns realm for the indicated host, or `NULL` if no relevant TXT record could be found.

### shishi_realm_for_server ()

    char *
    shishi_realm_for_server (Shishi *handle,
                             char *server);

Finds a realm for the host `server` , using various methods.

Currently this includes static configuration files, using the library call `shishi_realm_for_server_file()`, and DNS lookup using `shishi_realm_for_server_dns()`. They are attempted in the stated order. See the documentation of either function for more information.

#### Parameters

handle | Shishi library handle created by `shishi_init()`. |
server | Hostname to find realm for. |

#### Returns

Returns realm for the indicated host, or `NULL` if nothing is known about `server` .

### shishi_principal_default_guess ()

    char *
    shishi_principal_default_guess (void);

Guesses the principal name for the user, looking at environment variables SHISHI_USER, USER and LOGNAME, or if that fails, returns the string "user".

#### Returns

Returns guessed default principal for user as a string that has to be deallocated by the caller with `free()`.

### shishi_principal_default ()

    const char *
    shishi_principal_default (Shishi *handle);

The default principal name is the name in the environment variable USER, or LOGNAME for some systems, but it can be overridden by specifying the environment variable SHISHI_USER.

#### Parameters

handle | Shishi library handle created by `shishi_init()`. |

#### Returns

Returns the default principal name used by the library. (Not a copy of it, so don't modify or deallocate it.)

### shishi_principal_default_set ()

    void
    shishi_principal_default_set (Shishi *handle,
                                  const char *principal);

Set the default principal used by the library. The string is copied into the library, so you can dispose of the variable immediately after calling this function.

#### Parameters

handle | Shishi library handle created by `shishi_init()`. |
principal | string with new default principal name, or NULL to reset to default. |

### shishi_principal_name ()

    int
    shishi_principal_name (Shishi *handle,
                           Shishi_asn1 namenode,
                           const char *namefield,
                           char **out,
                           size_t *outlen);

Represent principal name in ASN.1 structure as null-terminated string. The string is allocated by this function, and it is the responsibility of the caller to deallocate it. Note that the output length `outlen` does not include the terminating null.

#### Parameters

handle | Shishi library handle created by `shishi_init()`. |
namenode | ASN.1 structure with principal in `namefield` . |
namefield | name of field in `namenode` containing principal name. |
out | pointer to newly allocated, null terminated, string containing principal name. May be `NULL` (to only populate `outlen` ). |
outlen | pointer to length of `out` on output, excluding terminating null. May be `NULL` (to only populate `out` ). |

#### Returns

Returns SHISHI_OK if successful.

### shishi_principal_name_realm ()

    int
    shishi_principal_name_realm (Shishi *handle,
                                 Shishi_asn1 namenode,
                                 const char *namefield,
                                 Shishi_asn1 realmnode,
                                 const char *realmfield,
                                 char **out,
                                 size_t *outlen);

Represent principal name and realm in ASN.1 structure as null-terminated string. The string is allocated by this function. It is the responsibility of the caller to deallocate it. Note that the output length `outlen` does not include the terminating null character.

#### Parameters

handle | Shishi library handle created by `shishi_init()`. |
namenode | ASN.1 structure with principal name in `namefield` . |
namefield | name of field in `namenode` containing principal name. |
realmnode | ASN.1 structure with principal realm in `realmfield` . |
realmfield | name of field in `realmnode` containing principal realm. |
out | pointer to newly allocated null terminated string containing principal name. May be `NULL` (to only populate `outlen` ). |
outlen | pointer to length of `out` on output, excluding terminating null. May be `NULL` (to only populate `out` ). |

#### Returns

Returns SHISHI_OK if successful.

### shishi_principal_name_set ()

    int
    shishi_principal_name_set (Shishi *handle,
                               Shishi_asn1 namenode,
                               const char *namefield,
                               Shishi_name_type name_type,
                               const char *name[]);

Set the given principal name field to the given name.

#### Parameters

handle | shishi handle as allocated by `shishi_init()`. |
namenode | ASN.1 structure with principal in `namefield` . |
namefield | name of field in `namenode` containing principal name. |
name_type | type of principal, see Shishi_name_type, usually SHISHI_NT_UNKNOWN. |
name | null-terminated input array with principal name. |

#### Returns

Returns SHISHI_OK if successful.

### shishi_principal_set ()

    int
    shishi_principal_set (Shishi *handle,
                          Shishi_asn1 namenode,
                          const char *namefield,
                          const char *name);

Set principal name field in an ASN.1 structure to the given name.

#### Parameters

handle | shishi handle as allocated by `shishi_init()`. |
namenode | ASN.1 structure with principal in `namefield` . |
namefield | name of field in `namenode` containing principal name. |
name | null-terminated string with principal name in RFC 1964 form. |

#### Returns

Returns SHISHI_OK if successful.

### shishi_parse_name ()

    int
    shishi_parse_name (Shishi *handle,
                       const char *name,
                       char **principal,
                       char **realm);

Split principal name (e.g., "simon@JOSEFSSON.ORG") into two newly allocated strings, the `principal` ("simon"), and the `realm` ("JOSEFSSON.ORG"). If there is no realm part in `name` , `realm` is set to NULL.

#### Parameters

handle | Shishi library handle created by `shishi_init()`. |
name | input principal name string, e.g. imap/mail.gnu.org@GNU.ORG. |
principal | newly allocated output string with principal name. |
realm | newly allocated output string with realm name. |

#### Returns

Returns SHISHI_INVALID_PRINCIPAL_NAME if `name` is NULL or ends with the escape character "\", and SHISHI_OK if successful.

### shishi_derive_default_salt ()

    int
    shishi_derive_default_salt (Shishi *handle,
                                const char *name,
                                char **salt);

Derive the default salt from a principal. The default salt is the concatenation of the decoded realm and the principal.

#### Parameters

handle | shishi handle as allocated by `shishi_init()`. |
name | principal name of user. |
salt | output variable with newly allocated salt string. |

#### Returns

Return SHISHI_OK if successful.

### shishi_server_for_local_service ()

    char *
    shishi_server_for_local_service (Shishi *handle,
                                     const char *service);

Construct a service principal (e.g., "imap/yxa.extuno.com") based on supplied service name (i.e., "imap") and the system's hostname as returned by `hostname()` (i.e., "yxa.extundo.com"). The string must be deallocated by the caller.

#### Parameters

handle | shishi handle as allocated by `shishi_init()`. |
service | null terminated string with name of service, e.g., "host". |

#### Returns

Return newly allocated service name string.

### shishi_ticket ()

    Shishi_asn1
    shishi_ticket (Shishi *handle);

This function creates a new ASN.1 Ticket, populated with some default values.

#### Parameters

handle | shishi handle as allocated by `shishi_init()`. |

#### Returns

Returns the ticket or NULL on failure.

### shishi_ticket_server ()

    int
    shishi_ticket_server (Shishi *handle,
                          Shishi_asn1 ticket,
                          char **server,
                          size_t *serverlen);

Represent server principal name in Ticket as zero-terminated string. The string is allocate by this function, and it is the responsibility of the caller to deallocate it. Note that the output length `serverlen` does not include the terminating zero.

#### Parameters

handle | Shishi library handle create by `shishi_init()`. |
ticket | ASN.1 Ticket variable to get server name from. |
server | pointer to newly allocated zero terminated string containing principal name. May be `NULL` (to only populate `serverlen` ). |
serverlen | pointer to length of `server` on output, excluding terminating zero. May be `NULL` (to only populate `server` ). |

#### Returns

Returns SHISHI_OK iff successful.

### shishi_ticket_sname_set ()

    int
    shishi_ticket_sname_set (Shishi *handle,
                             Shishi_asn1 ticket,
                             Shishi_name_type name_type,
                             char *sname[]);

Set the server name field in the Ticket.

#### Parameters

handle | shishi handle as allocated by `shishi_init()`. |
ticket | Ticket variable to set server name field in. |
name_type | type of principial, see Shishi_name_type, usually SHISHI_NT_UNKNOWN. |
sname | input array with principal name. |

#### Returns

Returns SHISHI_OK iff successful.

### shishi_ticket_srealmserver_set ()

    int
    shishi_ticket_srealmserver_set (Shishi *handle,
                                    Shishi_asn1 ticket,
                                    const char *realm,
                                    const char *server);

### shishi_ticket_set_server ()

    int
    shishi_ticket_set_server (Shishi *handle,
                              Shishi_asn1 ticket,
                              const char *server);

### shishi_ticket_realm_get ()

    int
    shishi_ticket_realm_get (Shishi *handle,
                             Shishi_asn1 ticket,
                             char **realm,
                             size_t *realmlen);

Extract realm from ticket.

#### Parameters

handle | shishi handle as allocated by `shishi_init()`. |
ticket | input variable with ticket info. |
realm | output array with newly allocated name of realm in ticket. |
realmlen | size of output array. |

#### Returns

Returns SHISHI_OK iff successful.

### shishi_ticket_realm_set ()

    int
    shishi_ticket_realm_set (Shishi *handle,
                             Shishi_asn1 ticket,
                             const char *realm);

Set the realm field in the Ticket.

#### Parameters

handle | shishi handle as allocated by `shishi_init()`. |
ticket | input variable with ticket info. |
realm | input array with name of realm. |

#### Returns

Returns SHISHI_OK iff successful.

### shishi_ticket_get_enc_part_etype ()

    int
    shishi_ticket_get_enc_part_etype (Shishi *handle,
                                      Shishi_asn1 ticket,
                                      int32_t *etype);

Extract Ticket.enc-part.etype.

#### Parameters

handle | shishi handle as allocated by `shishi_init()`. |
ticket | Ticket variable to get value from. |
etype | output variable that holds the value. |

#### Returns

Returns SHISHI_OK iff successful.

### shishi_ticket_set_enc_part ()

    int
    shishi_ticket_set_enc_part (Shishi *handle,
                                Shishi_asn1 ticket,
                                int32_t etype,
                                uint32_t kvno,
                                const char *buf,
                                size_t buflen);

Set the encrypted enc-part field in the Ticket. The encrypted data is usually created by calling `shishi_encrypt()` on the DER encoded enc-part. To save time, you may want to use `shishi_ticket_add_enc_part()` instead, which calculates the encrypted data and calls this function in one step.

#### Parameters

handle | shishi handle as allocated by `shishi_init()`. |
ticket | Ticket to add enc-part field to. |
etype | encryption type used to encrypt enc-part. |
kvno | key version number. |
buf | input array with encrypted enc-part. |
buflen | size of input array with encrypted enc-part. |

#### Returns

Returns SHISHI_OK iff successful.

### shishi_ticket_add_enc_part ()

    int
    shishi_ticket_add_enc_part (Shishi *handle,
                                Shishi_asn1 ticket,
                                Shishi_key *key,
                                Shishi_asn1 encticketpart);

Encrypts DER encoded EncTicketPart using key and stores it in the Ticket.

#### Parameters

handle | shishi handle as allocated by `shishi_init()`. |
ticket | Ticket to add enc-part field to. |
key | key used to encrypt enc-part. |
encticketpart | EncTicketPart to add. |

#### Returns

Returns SHISHI_OK iff successful.

### shishi_ticket_decrypt ()

    int
    shishi_ticket_decrypt (Shishi *handle,
                           Shishi_asn1 ticket,
                           Shishi_key *key,
                           Shishi_asn1 *encticketpart);

### shishi_tkt_ticket ()

    Shishi_asn1
    shishi_tkt_ticket (Shishi_tkt *tkt);

Get ASN.1 Ticket structure from ticket.

#### Parameters

tkt | input variable with ticket info. |

#### Returns

Returns actual ticket.

### shishi_tkt_ticket_set ()

    void
    shishi_tkt_ticket_set (Shishi_tkt *tkt,
                           Shishi_asn1 ticket);

Set the ASN.1 Ticket in the Ticket.

#### Parameters

tkt | input variable with ticket info. |
ticket | ASN.1 Ticket to store in ticket. |

### shishi_tkt_kdcrep ()

    Shishi_asn1
    shishi_tkt_kdcrep (Shishi_tkt *tkt);

Get ASN.1 KDCRep structure from ticket.

#### Parameters

tkt | input variable with ticket info. |

#### Returns

Returns KDC-REP information.

### shishi_tkt_enckdcreppart ()

    Shishi_asn1
    shishi_tkt_enckdcreppart (Shishi_tkt *tkt);

Get ASN.1 EncKDCRepPart structure from ticket.

#### Parameters

tkt | input variable with ticket info. |

#### Returns

Returns auxiliary ticket information.

### shishi_tkt_enckdcreppart_set ()

    void
    shishi_tkt_enckdcreppart_set (Shishi_tkt *tkt,
                                  Shishi_asn1 enckdcreppart);

Set the EncKDCRepPart in the Ticket.

#### Parameters

tkt | structure that holds information about Ticket exchange |
enckdcreppart | EncKDCRepPart to store in Ticket. |

### shishi_tkt_encticketpart ()

    Shishi_asn1
    shishi_tkt_encticketpart (Shishi_tkt *tkt);

Get ASN.1 EncTicketPart structure from ticket.

#### Parameters

tkt | input variable with ticket info. |

#### Returns

Returns EncTicketPart information.

### shishi_tkt_encticketpart_set ()

    void
    shishi_tkt_encticketpart_set (Shishi_tkt *tkt,
                                  Shishi_asn1 encticketpart);

Set the EncTicketPart in the Ticket.

#### Parameters

tkt | input variable with ticket info. |
encticketpart | encticketpart to store in ticket. |

### shishi_tkt_key ()

    Shishi_key *
    shishi_tkt_key (Shishi_tkt *tkt);

Get key used in ticket, by looking first in EncKDCRepPart and then in EncTicketPart. If key is already populated, it is not extracted again.

#### Parameters

tkt | input variable with ticket info. |

#### Returns

Returns key extracted from EncKDCRepPart or EncTicketPart.

### shishi_tkt_key_set ()

    int
    shishi_tkt_key_set (Shishi_tkt *tkt,
                        Shishi_key *key);

Set the key in the EncTicketPart.

#### Parameters

tkt | input variable with ticket info. |
key | key to store in ticket. |

#### Returns

Returns SHISHI_OK iff successful.

### shishi_tkt ()

    int
    shishi_tkt (Shishi *handle,
                Shishi_tkt **tkt);

Create a new ticket handle.

#### Parameters

handle | shishi handle as allocated by `shishi_init()`. |
tkt | output variable with newly allocated ticket. |

#### Returns

Returns SHISHI_OK iff successful.

### shishi_tkt2 ()

    Shishi_tkt *
    shishi_tkt2 (Shishi *handle,
                 Shishi_asn1 ticket,
                 Shishi_asn1 enckdcreppart,
                 Shishi_asn1 kdcrep);

Create a new ticket handle.

#### Parameters

handle | shishi handle as allocated by `shishi_init()`. |
ticket | input variable with ticket. |
enckdcreppart | input variable with auxiliary ticket information. |
kdcrep | input variable with KDC-REP ticket information. |

#### Returns

Returns new ticket handle, or `NULL` on error.

### shishi_tkt_pretty_print ()

    void
    shishi_tkt_pretty_print (Shishi_tkt *tkt,
                             FILE *fh);

Print a human readable representation of a ticket to file handle.

#### Parameters

tkt | input variable with ticket info. |
fh | file handle open for writing. |

### shishi_tkt_realm ()

    int
    shishi_tkt_realm (Shishi_tkt *tkt,
                      char **realm,
                      size_t *realmlen);

Extract realm of server in ticket.

#### Parameters

tkt | input variable with ticket info. |
realm | pointer to newly allocated character array with realm name. |
realmlen | length of newly allocated character array with realm name. |

#### Returns

Returns SHISHI_OK iff successful.

### shishi_tkt_client ()

    int
    shishi_tkt_client (Shishi_tkt *tkt,
                       char **client,
                       size_t *clientlen);

Represent client principal name in Ticket KDC-REP as zero-terminated string. The string is allocate by this function, and it is the responsibility of the caller to deallocate it. Note that the output length `clientlen` does not include the terminating zero.

#### Parameters

tkt | input variable with ticket info. |
client | pointer to newly allocated zero terminated string containing principal name. May be `NULL` (to only populate `clientlen` ). |
clientlen | pointer to length of `client` on output, excluding terminating zero. May be `NULL` (to only populate `client` ). |

#### Returns

Returns SHISHI_OK iff successful.

### shishi_tkt_client_p ()

    int
    shishi_tkt_client_p (Shishi_tkt *tkt,
                         const char *client);

Determine if ticket is for specified client.

#### Parameters

tkt | input variable with ticket info. |
client | client name of ticket. |

#### Returns

Returns non-0 iff ticket is for specified client.

### shishi_tkt_clientrealm ()

    int
    shishi_tkt_clientrealm (Shishi_tkt *tkt,
                            char **client,
                            size_t *clientlen);

Convert cname and realm fields from AS-REQ to printable principal name format. The string is allocate by this function, and it is the responsibility of the caller to deallocate it. Note that the output length `clientlen` does not include the terminating zero.

#### Parameters

tkt | input variable with ticket info. |
client | pointer to newly allocated zero terminated string containing principal name and realm. May be `NULL` (to only populate `clientlen` ). |
clientlen | pointer to length of `client` on output, excluding terminating zero. May be `NULL` (to only populate `client` ). |

#### Returns

Returns SHISHI_OK iff successful.

### shishi_tkt_clientrealm_p ()

    int
    shishi_tkt_clientrealm_p (Shishi_tkt *tkt,
                              const char *client);

Determine if ticket is for specified client principal.

#### Parameters

tkt | input variable with ticket info. |
client | principal name (client name and realm) of ticket. |

#### Returns

Returns non-0 iff ticket is for specified client principal.

### shishi_tkt_clientrealm_set ()

    int
    shishi_tkt_clientrealm_set (Shishi_tkt *tkt,
                                const char *realm,
                                const char *client);

### shishi_tkt_serverrealm_set ()

    int
    shishi_tkt_serverrealm_set (Shishi_tkt *tkt,
                                const char *realm,
                                const char *server);

### shishi_tkt_build ()

    int
    shishi_tkt_build (Shishi_tkt *tkt,
                      Shishi_key *key);

### shishi_tkt_lastreq ()

    int
    shishi_tkt_lastreq (Shishi_tkt *tkt,
                        char **lrtime,
                        size_t *lrtimelen,
                        int32_t lrtype);

### shishi_tkt_lastreqc ()

    time_t
    shishi_tkt_lastreqc (Shishi_tkt *tkt,
                         Shishi_lrtype lrtype);

Extract C time corresponding to given lastreq type field in the ticket.

#### Parameters

tkt | input variable with ticket info. |
lrtype | lastreq type to extract, see Shishi_lrtype. E.g., SHISHI_LRTYPE_LAST_REQUEST. |

#### Returns

Returns C time interpretation of the specified lastreq field, or (time_t) -1.

### shishi_tkt_lastreq_pretty_print ()

    void
    shishi_tkt_lastreq_pretty_print (Shishi_tkt *tkt,
                                     FILE *fh);

Print a human readable representation of the various lastreq fields in the ticket (really EncKDCRepPart).

#### Parameters

tkt | input variable with ticket info. |
fh | file handle open for writing. |

### shishi_tkt_authtime ()

    int
    shishi_tkt_authtime (Shishi_tkt *tkt,
                         char **authtime,
                         size_t *authtimelen);

### shishi_tkt_authctime ()

    time_t
    shishi_tkt_authctime (Shishi_tkt *tkt);

Extract C time corresponding to the authtime field. The field holds the time when the original authentication took place that later resulted in this ticket.

#### Parameters

tkt | input variable with ticket info. |

#### Returns

Returns C time interpretation of the endtime in ticket.

### shishi_tkt_starttime ()

    int
    shishi_tkt_starttime (Shishi_tkt *tkt,
                          char **starttime,
                          size_t *starttimelen);

### shishi_tkt_startctime ()

    time_t
    shishi_tkt_startctime (Shishi_tkt *tkt);

Extract C time corresponding to the starttime field. The field holds the time where the ticket start to be valid (typically in the past).

#### Parameters

tkt | input variable with ticket info. |

#### Returns

Returns C time interpretation of the endtime in ticket.

### shishi_tkt_endtime ()

    int
    shishi_tkt_endtime (Shishi_tkt *tkt,
                        char **endtime,
                        size_t *endtimelen);

### shishi_tkt_endctime ()

    time_t
    shishi_tkt_endctime (Shishi_tkt *tkt);

Extract C time corresponding to the endtime field. The field holds the time where the ticket stop being valid.

#### Parameters

tkt | input variable with ticket info. |

#### Returns

Returns C time interpretation of the endtime in ticket.

### shishi_tkt_renew_till ()

    int
    shishi_tkt_renew_till (Shishi_tkt *tkt,
                           char **renewtilltime,
                           size_t *renewtilllen);

### shishi_tkt_renew_tillc ()

    time_t
    shishi_tkt_renew_tillc (Shishi_tkt *tkt);

Extract C time corresponding to the renew-till field. The field holds the time where the ticket stop being valid for renewal.

#### Parameters

tkt | input variable with ticket info. |

#### Returns

Returns C time interpretation of the renew-till in ticket.

### shishi_tkt_keytype ()

    int
    shishi_tkt_keytype (Shishi_tkt *tkt,
                        int32_t *etype);

Extract encryption type of key in ticket (really EncKDCRepPart).

#### Parameters

tkt | input variable with ticket info. |
etype | pointer to encryption type that is set, see Shishi_etype. |

#### Returns

Returns SHISHI_OK iff successful.

### shishi_tkt_keytype_fast ()

    int32_t
    shishi_tkt_keytype_fast (Shishi_tkt *tkt);

Extract encryption type of key in ticket (really EncKDCRepPart).

#### Parameters

tkt | input variable with ticket info. |

#### Returns

Returns encryption type of session key in ticket (really EncKDCRepPart), or -1 on error.

### shishi_tkt_keytype_p ()

    int
    shishi_tkt_keytype_p (Shishi_tkt *tkt,
                          int32_t etype);

Determine if key in ticket (really EncKDCRepPart) is of specified key type (really encryption type).

#### Parameters

tkt | input variable with ticket info. |
etype | encryption type, see Shishi_etype. |

#### Returns

Returns non-0 iff key in ticket is of specified encryption type.

### shishi_tkt_server ()

    int
    shishi_tkt_server (Shishi_tkt *tkt,
                       char **server,
                       size_t *serverlen);

Represent server principal name in Ticket as zero-terminated string. The string is allocate by this function, and it is the responsibility of the caller to deallocate it. Note that the output length `serverlen` does not include the terminating zero.

#### Parameters

tkt | input variable with ticket info. |
server | pointer to newly allocated zero terminated string containing principal name. May be `NULL` (to only populate `serverlen` ). |
serverlen | pointer to length of `server` on output, excluding terminating zero. May be `NULL` (to only populate `server` ). |

#### Returns

Returns SHISHI_OK iff successful.

### shishi_tkt_server_p ()

    int
    shishi_tkt_server_p (Shishi_tkt *tkt,
                         const char *server);

Determine if ticket is for specified server.

#### Parameters

tkt | input variable with ticket info. |
server | server name of ticket. |

#### Returns

Returns non-0 iff ticket is for specified server.

### shishi_tkt_valid_at_time_p ()

    int
    shishi_tkt_valid_at_time_p (Shishi_tkt *tkt,
                                time_t now);

Determine if ticket is valid at a specific point in time.

#### Parameters

tkt | input variable with ticket info. |
now | time to check for. |

#### Returns

Returns non-0 iff ticket is valid (not expired and after starttime) at specified time.

### shishi_tkt_valid_now_p ()

    int
    shishi_tkt_valid_now_p (Shishi_tkt *tkt);

Determine if ticket is valid now.

#### Parameters

tkt | input variable with ticket info. |

#### Returns

Returns 0 iff ticket is invalid (expired or not yet valid).

### shishi_tkt_expired_p ()

    int
    shishi_tkt_expired_p (Shishi_tkt *tkt);

Determine if ticket has expired (i.e., endtime is in the past).

#### Parameters

tkt | input variable with ticket info. |

#### Returns

Returns 0 iff ticket has expired.

### shishi_tkt_decrypt ()

    int
    shishi_tkt_decrypt (Shishi_tkt *tkt,
                        Shishi_key *key);

### shishi_tkt_done ()

    void
    shishi_tkt_done (Shishi_tkt *tkt);

Deallocate resources associated with ticket. The ticket must not be used again after this call.

#### Parameters

tkt | input variable with ticket info. |

### shishi_tkt_flags ()

    int
    shishi_tkt_flags (Shishi_tkt *tkt,
                      uint32_t *flags);

Extract flags in ticket (i.e., EncKDCRepPart).

#### Parameters

tkt | input variable with ticket info. |
flags | pointer to output integer with flags. |

#### Returns

Returns SHISHI_OK iff successful.

### shishi_tkt_flags_set ()

    int
    shishi_tkt_flags_set (Shishi_tkt *tkt,
                          uint32_t flags);

Set flags in ticket, i.e., both EncTicketPart and EncKDCRepPart. Note that this reset any already existing flags.

#### Parameters

tkt | input variable with ticket info. |
flags | integer with flags to store in ticket. |

#### Returns

Returns SHISHI_OK iff successful.

### shishi_tkt_flags_add ()

    int
    shishi_tkt_flags_add (Shishi_tkt *tkt,
                          uint32_t flag);

Add ticket flags to Ticket and EncKDCRepPart. This preserves all existing options.

#### Parameters

tkt | input variable with ticket info. |
flag | integer with flags to store in ticket. |

#### Returns

Returns SHISHI_OK iff successful.

### shishi_tkt_forwardable_p ()

    int
    shishi_tkt_forwardable_p (Shishi_tkt *tkt);

Determine if ticket is forwardable.

The FORWARDABLE flag in a ticket is normally only interpreted by the ticket-granting service. It can be ignored by application servers. The FORWARDABLE flag has an interpretation similar to that of the PROXIABLE flag, except ticket-granting tickets may also be issued with different network addresses. This flag is reset by default, but users MAY request that it be set by setting the FORWARDABLE option in the AS request when they request their initial ticket-granting ticket.

#### Parameters

tkt | input variable with ticket info. |

#### Returns

Returns non-0 iff forwardable flag is set in ticket.

### shishi_tkt_forwarded_p ()

    int
    shishi_tkt_forwarded_p (Shishi_tkt *tkt);

Determine if ticket is forwarded.

The FORWARDED flag is set by the TGS when a client presents a ticket with the FORWARDABLE flag set and requests a forwarded ticket by specifying the FORWARDED KDC option and supplying a set of addresses for the new ticket. It is also set in all tickets issued based on tickets with the FORWARDED flag set. Application servers may choose to process FORWARDED tickets differently than non-FORWARDED tickets.

#### Parameters

tkt | input variable with ticket info. |

#### Returns

Returns non-0 iff forwarded flag is set in ticket.

### shishi_tkt_proxiable_p ()

    int
    shishi_tkt_proxiable_p (Shishi_tkt *tkt);

Determine if ticket is proxiable.

The PROXIABLE flag in a ticket is normally only interpreted by the ticket-granting service. It can be ignored by application servers. When set, this flag tells the ticket-granting server that it is OK to issue a new ticket (but not a ticket-granting ticket) with a different network address based on this ticket. This flag is set if requested by the client on initial authentication. By default, the client will request that it be set when requesting a ticket-granting ticket, and reset when requesting any other ticket.

#### Parameters

tkt | input variable with ticket info. |

#### Returns

Returns non-0 iff proxiable flag is set in ticket.

### shishi_tkt_proxy_p ()

    int
    shishi_tkt_proxy_p (Shishi_tkt *tkt);

Determine if ticket is proxy ticket.

The PROXY flag is set in a ticket by the TGS when it issues a proxy ticket. Application servers MAY check this flag and at their option they MAY require additional authentication from the agent presenting the proxy in order to provide an audit trail.

#### Parameters

tkt | input variable with ticket info. |

#### Returns

Returns non-0 iff proxy flag is set in ticket.

### shishi_tkt_may_postdate_p ()

    int
    shishi_tkt_may_postdate_p (Shishi_tkt *tkt);

Determine if ticket may be used to grant postdated tickets.

The MAY-POSTDATE flag in a ticket is normally only interpreted by the ticket-granting service. It can be ignored by application servers. This flag MUST be set in a ticket-granting ticket in order to issue a postdated ticket based on the presented ticket. It is reset by default; it MAY be requested by a client by setting the ALLOW- POSTDATE option in the KRB_AS_REQ message. This flag does not allow a client to obtain a postdated ticket-granting ticket; postdated ticket-granting tickets can only by obtained by requesting the postdating in the KRB_AS_REQ message. The life (endtime-starttime) of a postdated ticket will be the remaining life of the ticket-granting ticket at the time of the request, unless the RENEWABLE option is also set, in which case it can be the full life (endtime-starttime) of the ticket-granting ticket. The KDC MAY limit how far in the future a ticket may be postdated.

#### Parameters

tkt | input variable with ticket info. |

#### Returns

Returns non-0 iff may-postdate flag is set in ticket.

### shishi_tkt_postdated_p ()

    int
    shishi_tkt_postdated_p (Shishi_tkt *tkt);

Determine if ticket is postdated.

The POSTDATED flag indicates that a ticket has been postdated. The application server can check the authtime field in the ticket to see when the original authentication occurred. Some services MAY choose to reject postdated tickets, or they may only accept them within a certain period after the original authentication. When the KDC issues a POSTDATED ticket, it will also be marked as INVALID, so that the application client MUST present the ticket to the KDC to be validated before use.

#### Parameters

tkt | input variable with ticket info. |

#### Returns

Returns non-0 iff postdated flag is set in ticket.

### shishi_tkt_invalid_p ()

    int
    shishi_tkt_invalid_p (Shishi_tkt *tkt);

Determine if ticket is invalid.

The INVALID flag indicates that a ticket is invalid. Application servers MUST reject tickets which have this flag set. A postdated ticket will be issued in this form. Invalid tickets MUST be validated by the KDC before use, by presenting them to the KDC in a TGS request with the VALIDATE option specified. The KDC will only validate tickets after their starttime has passed. The validation is required so that postdated tickets which have been stolen before their starttime can be rendered permanently invalid (through a hot-list mechanism).

#### Parameters

tkt | input variable with ticket info. |

#### Returns

Returns non-0 iff invalid flag is set in ticket.

### shishi_tkt_renewable_p ()

    int
    shishi_tkt_renewable_p (Shishi_tkt *tkt);

Determine if ticket is renewable.

The RENEWABLE flag in a ticket is normally only interpreted by the ticket-granting service (discussed below in section 3.3). It can usually be ignored by application servers. However, some particularly careful application servers MAY disallow renewable tickets.

#### Parameters

tkt | input variable with ticket info. |

#### Returns

Returns non-0 iff renewable flag is set in ticket.

### shishi_tkt_initial_p ()

    int
    shishi_tkt_initial_p (Shishi_tkt *tkt);

Determine if ticket was issued using AS exchange.

The INITIAL flag indicates that a ticket was issued using the AS protocol, rather than issued based on a ticket-granting ticket. Application servers that want to require the demonstrated knowledge of a client's secret key (e.g. a password-changing program) can insist that this flag be set in any tickets they accept, and thus be assured that the client's key was recently presented to the application client.

#### Parameters

tkt | input variable with ticket info. |

#### Returns

Returns non-0 iff initial flag is set in ticket.

### shishi_tkt_pre_authent_p ()

    int
    shishi_tkt_pre_authent_p (Shishi_tkt *tkt);

Determine if ticket was pre-authenticated.

The PRE-AUTHENT and HW-AUTHENT flags provide additional information about the initial authentication, regardless of whether the current ticket was issued directly (in which case INITIAL will also be set) or issued on the basis of a ticket-granting ticket (in which case the INITIAL flag is clear, but the PRE-AUTHENT and HW-AUTHENT flags are carried forward from the ticket-granting ticket).

#### Parameters

tkt | input variable with ticket info. |

#### Returns

Returns non-0 iff pre-authent flag is set in ticket.

### shishi_tkt_hw_authent_p ()

    int
    shishi_tkt_hw_authent_p (Shishi_tkt *tkt);

Determine if ticket is authenticated using a hardware token.

The PRE-AUTHENT and HW-AUTHENT flags provide additional information about the initial authentication, regardless of whether the current ticket was issued directly (in which case INITIAL will also be set) or issued on the basis of a ticket-granting ticket (in which case the INITIAL flag is clear, but the PRE-AUTHENT and HW-AUTHENT flags are carried forward from the ticket-granting ticket).

#### Parameters

tkt | input variable with ticket info. |

#### Returns

Returns non-0 iff hw-authent flag is set in ticket.

### shishi_tkt_transited_policy_checked_p ()

    int
    shishi_tkt_transited_policy_checked_p (Shishi_tkt *tkt);

Determine if ticket has been policy checked for transit.

The application server is ultimately responsible for accepting or rejecting authentication and SHOULD check that only suitably trusted KDCs are relied upon to authenticate a principal. The transited field in the ticket identifies which realms (and thus which KDCs) were involved in the authentication process and an application server would normally check this field. If any of these are untrusted to authenticate the indicated client principal (probably determined by a realm-based policy), the authentication attempt MUST be rejected. The presence of trusted KDCs in this list does not provide any guarantee; an untrusted KDC may have fabricated the list.

While the end server ultimately decides whether authentication is valid, the KDC for the end server's realm MAY apply a realm specific policy for validating the transited field and accepting credentials for cross-realm authentication. When the KDC applies such checks and accepts such cross-realm authentication it will set the TRANSITED-POLICY-CHECKED flag in the service tickets it issues based on the cross-realm TGT. A client MAY request that the KDCs not check the transited field by setting the DISABLE-TRANSITED-CHECK flag. KDCs are encouraged but not required to honor this flag.

Application servers MUST either do the transited-realm checks themselves, or reject cross-realm tickets without TRANSITED-POLICY- CHECKED set.

#### Parameters

tkt | input variable with ticket info. |

#### Returns

Returns non-0 iff transited-policy-checked flag is set in ticket.

### shishi_tkt_ok_as_delegate_p ()

    int
    shishi_tkt_ok_as_delegate_p (Shishi_tkt *tkt);

Determine if ticket is ok as delegated ticket.

The copy of the ticket flags in the encrypted part of the KDC reply may have the OK-AS-DELEGATE flag set to indicates to the client that the server specified in the ticket has been determined by policy of the realm to be a suitable recipient of delegation. A client can use the presence of this flag to help it make a decision whether to delegate credentials (either grant a proxy or a forwarded ticket- granting ticket) to this server. It is acceptable to ignore the value of this flag. When setting this flag, an administrator should consider the security and placement of the server on which the service will run, as well as whether the service requires the use of delegated credentials.

#### Parameters

tkt | input variable with ticket info. |

#### Returns

Returns non-0 iff ok-as-delegate flag is set in ticket.

### shishi_tkts_default_file_guess ()

    char *
    shishi_tkts_default_file_guess (Shishi *handle);

Guesses the default ticket filename; it is $SHISHI_TICKETS, $SHISHI_HOME/tickets, or $HOME/.shishi/tickets.

#### Parameters

handle | Shishi library handle create by `shishi_init()`. |

#### Returns

Returns default tkts filename as a string that has to be deallocated with `free()` by the caller.

### shishi_tkts_default_file ()

    const char *
    shishi_tkts_default_file (Shishi *handle);

Get filename of default ticket set.

#### Parameters

handle | Shishi library handle create by `shishi_init()`. |

#### Returns

Returns the default ticket set filename used in the library. The string is not a copy, so don't modify or deallocate it.

### shishi_tkts_default_file_set ()

    void
    shishi_tkts_default_file_set (Shishi *handle,
                                  const char *tktsfile);

Set the default ticket set filename used in the library. The string is copied into the library, so you can dispose of the variable immediately after calling this function.

#### Parameters

handle | Shishi library handle create by `shishi_init()`. |
tktsfile | string with new default tkts file name, or NULL to reset to default. |

### shishi_tkts_default ()

    Shishi_tkts *
    shishi_tkts_default (Shishi *handle);

Get the default ticket set for library handle.

#### Parameters

handle | Shishi library handle create by `shishi_init()`. |

#### Returns

Return the handle global ticket set.

### shishi_tkts_default_to_file ()

    int
    shishi_tkts_default_to_file (Shishi_tkts *tkts);

### shishi_tkts ()

    int
    shishi_tkts (Shishi *handle,
                 Shishi_tkts **tkts);

Get a new ticket set handle.

#### Parameters

handle | shishi handle as allocated by `shishi_init()`. |
tkts | output pointer to newly allocated tkts handle. |

#### Returns

Returns `SHISHI_OK` iff successful.

### shishi_tkts_nth ()

    Shishi_tkt *
    shishi_tkts_nth (Shishi_tkts *tkts,
                     int ticketno);

Get the n:th ticket in ticket set.

#### Parameters

tkts | ticket set handle as allocated by `shishi_tkts()`. |
ticketno | integer indicating requested ticket in ticket set. |

#### Returns

Returns a ticket handle to the ticketno:th ticket in the ticket set, or NULL if ticket set is invalid or ticketno is out of bounds. The first ticket is ticketno 0, the second ticketno 1, and so on.

### shishi_tkts_size ()

    int
    shishi_tkts_size (Shishi_tkts *tkts);

Get size of ticket set.

#### Parameters

tkts | ticket set handle as allocated by `shishi_tkts()`. |

#### Returns

Returns number of tickets stored in ticket set.

### shishi_tkts_add ()

    int
    shishi_tkts_add (Shishi_tkts *tkts,
                     Shishi_tkt *tkt);

Add a ticket to the ticket set. Only the pointer is stored, so if you modify `tkt` , the ticket in the ticket set will also be modified.

#### Parameters

tkts | ticket set handle as allocated by `shishi_tkts()`. |
tkt | ticket to be added to ticket set. |

#### Returns

Returns `SHISHI_OK` iff successful.

### shishi_tkts_new ()

    int
    shishi_tkts_new (Shishi_tkts *tkts,
                     Shishi_asn1 ticket,
                     Shishi_asn1 enckdcreppart,
                     Shishi_asn1 kdcrep);

Allocate a new ticket and add it to the ticket set.

Note that `ticket` , `enckdcreppart` and `kdcrep` are stored by reference, so you must not de-allocate them before the ticket is removed from the ticket set and de-allocated.

#### Parameters

tkts | ticket set handle as allocated by `shishi_tkts()`. |
ticket | input ticket variable. |
enckdcreppart | input ticket detail variable. |
kdcrep | input KDC-REP variable. |

#### Returns

Returns `SHISHI_OK` iff successful.

### shishi_tkts_remove ()

    int
    shishi_tkts_remove (Shishi_tkts *tkts,
                        int ticketno);

Remove a ticket, indexed by `ticketno` , in ticket set.

#### Parameters

tkts | ticket set handle as allocated by `shishi_tkts()`. |
ticketno | ticket number of ticket in the set to remove. The first ticket is ticket number 0. |

#### Returns

`SHISHI_OK` if successful or if `ticketno` larger than size of ticket set.

### shishi_tkts_expire ()

    int
    shishi_tkts_expire (Shishi_tkts *tkts);

Remove expired tickets from ticket set.

#### Parameters

tkts | ticket set handle as allocated by `shishi_tkts()`. |

#### Returns

Returns `SHISHI_OK` iff successful.

### shishi_tkts_print_for_service ()

    int
    shishi_tkts_print_for_service (Shishi_tkts *tkts,
                                   FILE *fh,
                                   const char *service);

Print description of tickets for specified service to file descriptor. If service is NULL, all tickets are printed.

#### Parameters

tkts | ticket set handle as allocated by `shishi_tkts()`. |
fh | file descriptor to print to. |
service | service to limit tickets printed to, or NULL. |

#### Returns

Returns `SHISHI_OK` iff successful.

### shishi_tkts_print ()

    int
    shishi_tkts_print (Shishi_tkts *tkts,
                       FILE *fh);

Print description of all tickets to file descriptor.

#### Parameters

tkts | ticket set handle as allocated by `shishi_tkts()`. |
fh | file descriptor to print to. |

#### Returns

Returns `SHISHI_OK` iff successful.

### shishi_tkts_write ()

    int
    shishi_tkts_write (Shishi_tkts *tkts,
                       FILE *fh);

Write tickets in set to file descriptor.

#### Parameters

tkts | ticket set handle as allocated by `shishi_tkts()`. |
fh | file descriptor to write tickets to. |

#### Returns

Returns `SHISHI_OK` iff successful.

### shishi_tkts_to_file ()

    int
    shishi_tkts_to_file (Shishi_tkts *tkts,
                         const char *filename);

Write tickets in set to file.

#### Parameters

tkts | ticket set handle as allocated by `shishi_tkts()`. |
filename | filename to write tickets to. |

#### Returns

Returns `SHISHI_OK` iff successful.

### shishi_tkts_read ()

    int
    shishi_tkts_read (Shishi_tkts *tkts,
                      FILE *fh);

Read tickets from file descriptor and add them to the ticket set.

#### Parameters

tkts | ticket set handle as allocated by `shishi_tkts()`. |
fh | file descriptor to read from. |

#### Returns

Returns `SHISHI_OK` iff successful.

### shishi_tkts_from_file ()

    int
    shishi_tkts_from_file (Shishi_tkts *tkts,
                           const char *filename);

Read tickets from file and add them to the ticket set.

#### Parameters

tkts | ticket set handle as allocated by `shishi_tkts()`. |
filename | filename to read tickets from. |

#### Returns

Returns `SHISHI_OK` iff successful.

### shishi_tkts_done ()

    void
    shishi_tkts_done (Shishi_tkts **tkts);

Deallocates all resources associated with ticket set. The ticket set handle must not be used in calls to other shishi_tkts_*() functions after this.

#### Parameters

tkts | ticket set handle as allocated by `shishi_tkts()`. |

### shishi_tkt_match_p ()

    int
    shishi_tkt_match_p (Shishi_tkt *tkt,
                        Shishi_tkts_hint *hint);

Test if a ticket matches specified hints.

#### Parameters

tkt | ticket to test hints on. |
hint | structure with characteristics of ticket to be found. |

#### Returns

Returns 0 iff ticket fails to match given criteria.

### shishi_tkts_find ()

    Shishi_tkt *
    shishi_tkts_find (Shishi_tkts *tkts,
                      Shishi_tkts_hint *hint);

Search the ticketset sequentially (from ticket number 0 through all tickets in the set) for a ticket that fits the given characteristics. If a ticket is found, the hint->startpos field is updated to point to the next ticket in the set, so this function can be called repeatedly with the same hint argument in order to find all tickets matching a certain criterium. Note that if tickets are added to, or removed from, the ticketset during a query with the same hint argument, the hint->startpos field must be updated appropriately.

Here is how you would typically use this function:

Shishi_tkts_hint hint;

Shishi_tkt tkt;

memset(&hint, 0, sizeof(hint));

hint.server = "imap/mail.example.org";

tkt = shishi_tkts_find (shishi_tkts_default(handle), &hint);

if (!tkt)

printf("No ticket found...\n");

else

do_something_with_ticket (tkt);

#### Parameters

tkts | ticket set handle as allocated by `shishi_tkts()`. |
hint | structure with characteristics of ticket to be found. |

#### Returns

Returns a ticket if found, or NULL if no further matching tickets could be found.

### shishi_tkts_find_for_clientserver ()

    Shishi_tkt *
    shishi_tkts_find_for_clientserver (Shishi_tkts *tkts,
                                       const char *client,
                                       const char *server);

Short-hand function for searching the ticket set for a ticket for the given client and server. See `shishi_tkts_find()`.

#### Parameters

tkts | ticket set handle as allocated by `shishi_tkts()`. |
client | client name to find ticket for. |
server | server name to find ticket for. |

#### Returns

Returns a ticket if found, or NULL.

### shishi_tkts_find_for_server ()

    Shishi_tkt *
    shishi_tkts_find_for_server (Shishi_tkts *tkts,
                                 const char *server);

Short-hand function for searching the ticket set for a ticket for the given server using the default client principal. See `shishi_tkts_find_for_clientserver()` and `shishi_tkts_find()`.

#### Parameters

tkts | ticket set handle as allocated by `shishi_tkts()`. |
server | server name to find ticket for. |

#### Returns

Returns a ticket if found, or NULL.

### shishi_tkts_get ()

    Shishi_tkt *
    shishi_tkts_get (Shishi_tkts *tkts,
                     Shishi_tkts_hint *hint);

Get a ticket matching given characteristics. This function first looks in the ticket set for a ticket, then tries to find a suitable TGT, possibly via an AS exchange, using `shishi_tkts_get_tgt()`, and then uses that TGT in a TGS exchange to get the ticket.

Currently this function does not implement cross realm logic.

#### Parameters

tkts | ticket set handle as allocated by `shishi_tkts()`. |
hint | structure with characteristics of ticket to be found. |

#### Returns

Returns a ticket if found, or NULL if this function is unable to get the ticket.

### shishi_tkts_get_tgt ()

    Shishi_tkt *
    shishi_tkts_get_tgt (Shishi_tkts *tkts,
                         Shishi_tkts_hint *hint);

Get a ticket granting ticket (TGT) suitable for acquiring ticket matching the hint. I.e., get a TGT for the server realm in the hint structure (hint->serverrealm), or the default realm if the serverrealm field is NULL. Can result in AS exchange.

Currently this function do not implement cross realm logic.

This function is used by `shishi_tkts_get()`, which is probably what you really want to use unless you have special needs.

#### Parameters

tkts | ticket set handle as allocated by `shishi_tkts()`. |
hint | structure with characteristics of ticket to begot. |

#### Returns

Returns a ticket granting ticket if successful, or NULL if this function is unable to acquire on.

### shishi_tkts_get_tgs ()

    Shishi_tkt *
    shishi_tkts_get_tgs (Shishi_tkts *tkts,
                         Shishi_tkts_hint *hint,
                         Shishi_tkt *tgt);

Get a ticket via TGS exchange using specified ticket granting ticket.

This function is used by `shishi_tkts_get()`, which is probably what you really want to use unless you have special needs.

#### Parameters

tkts | ticket set handle as allocated by `shishi_tkts()`. |
hint | structure with characteristics of ticket to begot. |
tgt | ticket granting ticket to use. |

#### Returns

Returns a ticket if successful, or NULL if this function is unable to acquire on.

### shishi_tkts_get_for_clientserver ()

    Shishi_tkt *
    shishi_tkts_get_for_clientserver (Shishi_tkts *tkts,
                                      const char *client,
                                      const char *server);

Short-hand function for getting a ticket for the given client and server. See `shishi_tkts_get()`.

#### Parameters

tkts | ticket set handle as allocated by `shishi_tkts()`. |
client | client name to get ticket for. |
server | server name to get ticket for. |

#### Returns

Returns a ticket if found, or NULL.

### shishi_tkts_get_for_server ()

    Shishi_tkt *
    shishi_tkts_get_for_server (Shishi_tkts *tkts,
                                const char *server);

Short-hand function for getting a ticket to the given server and for the default principal client. See `shishi_tkts_get()`.

#### Parameters

tkts | ticket set handle as allocated by `shishi_tkts()`. |
server | server name to get ticket for. |

#### Returns

Returns a ticket if found, or NULL.

### shishi_tkts_get_for_localservicepasswd ()

    Shishi_tkt *
    shishi_tkts_get_for_localservicepasswd
                                   (Shishi_tkts *tkts,
                                    const char *service,
                                    const char *passwd);

Short-hand function for getting a ticket to the given local service, and for the default principal client. The latter's password is given as argument. See `shishi_tkts_get()`.

#### Parameters

tkts | ticket set handle as allocated by `shishi_tkts()`. |
service | service name to get ticket for. |
passwd | password for the default client principal. |

#### Returns

Returns a ticket if found, or NULL otherwise.

### shishi_tkts_default_ccache_guess ()

    char *
    shishi_tkts_default_ccache_guess (Shishi *handle);

Guesses the default ccache ticket filename; it is the contents of the environment variable KRB5CCNAME or /tmp/krb5cc_UID where UID is the user's identity in decimal, as returned by `getuid()`.

#### Parameters

handle | Shishi library handle create by `shishi_init()`. |

#### Returns

Returns default ccache filename as a string that has to be deallocated with `free()` by the caller.

### shishi_tkts_default_ccache ()

    const char *
    shishi_tkts_default_ccache (Shishi *handle);

Get filename of default ccache filename.

#### Parameters

handle | Shishi library handle create by `shishi_init()`. |

#### Returns

Returns the default ccache filename used in the library. The string is not a copy, so don't modify or deallocate it.

### shishi_tkts_default_ccache_set ()

    void
    shishi_tkts_default_ccache_set (Shishi *handle,
                                    const char *ccache);

Set the default ccache filename used in the library. The string is copied into the library, so you can dispose of the variable immediately after calling this function.

#### Parameters

handle | Shishi library handle create by `shishi_init()`. |
ccache | string with new default ccache filename, or NULL to reset to default. |

### shishi_tkts_add_ccache_mem ()

    int
    shishi_tkts_add_ccache_mem (Shishi *handle,
                                const char *data,
                                size_t len,
                                Shishi_tkts *tkts);

Read tickets from a ccache data structure, and add them to the ticket set.

The ccache format is proprietary, and this function support (at least) the 0x0504 format. See the section The Credential Cache Binary File Format in the Shishi manual for a description of the file format.

#### Parameters

handle | shishi handle as allocated by `shishi_init()`. |
data | constant memory buffer with ccache of `len` size. |
len | size of memory buffer with ccache data. |
tkts | allocated key set to store tickets in. |

#### Returns

Returns `SHISHI_CCACHE_ERROR` if the data does not represent a valid ccache structure, and `SHISHI_OK` on success.

### shishi_tkts_add_ccache_file ()

    int
    shishi_tkts_add_ccache_file (Shishi *handle,
                                 const char *filename,
                                 Shishi_tkts *tkts);

Read tickets from a ccache data structure, and add them to the ticket set.

The ccache format is proprietary, and this function support (at least) the 0x0504 format. See the section The Credential Cache Binary File Format in the Shishi manual for a description of the file format.

#### Parameters

handle | shishi handle as allocated by `shishi_init()`. |
filename | name of file to read. |
tkts | allocated ticket set to store tickets in. |

#### Returns

Returns `SHISHI_IO_ERROR` if the file cannot be read, `SHISHI_CCACHE_ERROR` if the data cannot be parsed as a valid ccache structure, and `SHISHI_OK` on success.

### shishi_tkts_from_ccache_mem ()

    int
    shishi_tkts_from_ccache_mem (Shishi *handle,
                                 const char *data,
                                 size_t len,
                                 Shishi_tkts **outtkts);

Read tickets from a ccache data structure, and add them to the ticket set.

The ccache format is proprietary, and this function support (at least) the 0x0504 format. See the section The Credential Cache Binary File Format in the Shishi manual for a description of the file format.

#### Parameters

handle | shishi handle as allocated by `shishi_init()`. |
data | constant memory buffer with ccache of `len` size. |
len | size of memory buffer with ccache data. |
outtkts | pointer to ticket set that will be allocated and populated, must be deallocated by caller on succes. |

#### Returns

Returns `SHISHI_CCACHE_ERROR` if the data does not represent a valid ccache structure, and `SHISHI_OK` on success.

### shishi_tkts_from_ccache_file ()

    int
    shishi_tkts_from_ccache_file (Shishi *handle,
                                  const char *filename,
                                  Shishi_tkts **outtkts);

Read tickets from a ccache data structure, and add them to the ticket set.

The ccache format is proprietary, and this function support (at least) the 0x0504 format. See the section The Credential Cache Binary File Format in the Shishi manual for a description of the file format.

#### Parameters

handle | shishi handle as allocated by `shishi_init()`. |
filename | name of file to read. |
outtkts | pointer to ticket set that will be allocated and populated, must be deallocated by caller on succes. |

#### Returns

Returns `SHISHI_IO_ERROR` if the file cannot be read, `SHISHI_CCACHE_ERROR` if the data cannot be parsed as a valid ccache structure, and `SHISHI_OK` on success.

### shishi_enckdcreppart_print ()

    int
    shishi_enckdcreppart_print (Shishi *handle,
                                FILE *fh,
                                Shishi_asn1 enckdcreppart);

### shishi_enckdcreppart_save ()

    int
    shishi_enckdcreppart_save (Shishi *handle,
                               FILE *fh,
                               Shishi_asn1 enckdcreppart);

### shishi_enckdcreppart_parse ()

    int
    shishi_enckdcreppart_parse (Shishi *handle,
                                FILE *fh,
                                Shishi_asn1 *enckdcreppart);

### shishi_enckdcreppart_read ()

    int
    shishi_enckdcreppart_read (Shishi *handle,
                               FILE *fh,
                               Shishi_asn1 *enckdcreppart);

### shishi_ticket_save ()

    int
    shishi_ticket_save (Shishi *handle,
                        FILE *fh,
                        Shishi_asn1 ticket);

### shishi_ticket_print ()

    int
    shishi_ticket_print (Shishi *handle,
                         FILE *fh,
                         Shishi_asn1 ticket);

### shishi_kdc_print ()

    int
    shishi_kdc_print (Shishi *handle,
                      FILE *fh,
                      Shishi_asn1 asreq,
                      Shishi_asn1 asrep,
                      Shishi_asn1 encasreppart);

### shishi_ticket_parse ()

    int
    shishi_ticket_parse (Shishi *handle,
                         FILE *fh,
                         Shishi_asn1 *ticket);

### shishi_ticket_read ()

    int
    shishi_ticket_read (Shishi *handle,
                        FILE *fh,
                        Shishi_asn1 *ticket);

### shishi_etype_info_print ()

    int
    shishi_etype_info_print (Shishi *handle,
                             FILE *fh,
                             Shishi_asn1 etypeinfo);

### shishi_etype_info2_print ()

    int
    shishi_etype_info2_print (Shishi *handle,
                              FILE *fh,
                              Shishi_asn1 etypeinfo2);

### shishi_padata_print ()

    int
    shishi_padata_print (Shishi *handle,
                         FILE *fh,
                         Shishi_asn1 padata);

### shishi_methoddata_print ()

    int
    shishi_methoddata_print (Shishi *handle,
                             FILE *fh,
                             Shishi_asn1 methoddata);

### shishi_authenticator ()

    Shishi_asn1
    shishi_authenticator (Shishi *handle);

This function creates a new Authenticator, populated with some default values. It uses the current time as returned by the system for the ctime and cusec fields.

#### Parameters

handle | shishi handle as allocated by `shishi_init()`. |

#### Returns

Returns the authenticator or NULL on failure.

### shishi_authenticator_set_crealm ()

    int
    shishi_authenticator_set_crealm (Shishi *handle,
                                     Shishi_asn1 authenticator,
                                     const char *crealm);

Set realm field in authenticator to specified value.

#### Parameters

handle | shishi handle as allocated by `shishi_init()`. |
authenticator | authenticator as allocated by `shishi_authenticator()`. |
crealm | input array with realm. |

#### Returns

Returns SHISHI_OK iff successful.

### shishi_authenticator_set_cname ()

    int
    shishi_authenticator_set_cname (Shishi *handle,
                                    Shishi_asn1 authenticator,
                                    Shishi_name_type name_type,
                                    const char *cname[]);

Set principal field in authenticator to specified value.

#### Parameters

handle | shishi handle as allocated by `shishi_init()`. |
authenticator | authenticator as allocated by `shishi_authenticator()`. |
name_type | type of principial, see Shishi_name_type, usually SHISHI_NT_UNKNOWN. |
cname | input array with principal name. |

#### Returns

Returns SHISHI_OK iff successful.

### shishi_authenticator_client_set ()

    int
    shishi_authenticator_client_set (Shishi *handle,
                                     Shishi_asn1 authenticator,
                                     const char *client);

Set the client name field in the Authenticator.

#### Parameters

handle | shishi handle as allocated by `shishi_init()`. |
authenticator | Authenticator to set client name field in. |
client | zero-terminated string with principal name on RFC 1964 form. |

#### Returns

Returns SHISHI_OK iff successful.

### shishi_authenticator_ctime ()

    int
    shishi_authenticator_ctime (Shishi *handle,
                                Shishi_asn1 authenticator,
                                char **t);

Extract client time from Authenticator.

#### Parameters

handle | shishi handle as allocated by `shishi_init()`. |
authenticator | Authenticator as allocated by `shishi_authenticator()`. |
t | newly allocated zero-terminated character array with client time. |

#### Returns

Returns SHISHI_OK iff successful.

### shishi_authenticator_ctime_set ()

    int
    shishi_authenticator_ctime_set (Shishi *handle,
                                    Shishi_asn1 authenticator,
                                    const char *t);

Store client time in Authenticator.

#### Parameters

handle | shishi handle as allocated by `shishi_init()`. |
authenticator | Authenticator as allocated by `shishi_authenticator()`. |
t | string with generalized time value to store in Authenticator. |

#### Returns

Returns SHISHI_OK iff successful.

### shishi_authenticator_cusec_get ()

    int
    shishi_authenticator_cusec_get (Shishi *handle,
                                    Shishi_asn1 authenticator,
                                    uint32_t *cusec);

Extract client microseconds field from Authenticator.

#### Parameters

handle | shishi handle as allocated by `shishi_init()`. |
authenticator | Authenticator as allocated by `shishi_authenticator()`. |
cusec | output integer with client microseconds field. |

#### Returns

Returns SHISHI_OK iff successful.

### shishi_authenticator_cusec_set ()

    int
    shishi_authenticator_cusec_set (Shishi *handle,
                                    Shishi_asn1 authenticator,
                                    uint32_t cusec);

Set the cusec field in the Authenticator.

#### Parameters

handle | shishi handle as allocated by `shishi_init()`. |
authenticator | authenticator as allocated by `shishi_authenticator()`. |
cusec | client microseconds to set in authenticator, 0-999999. |

#### Returns

Returns SHISHI_OK iff successful.

### shishi_authenticator_seqnumber_get ()

    int
    shishi_authenticator_seqnumber_get (Shishi *handle,
                                        Shishi_asn1 authenticator,
                                        uint32_t *seqnumber);

Extract sequence number field from Authenticator.

#### Parameters

handle | shishi handle as allocated by `shishi_init()`. |
authenticator | authenticator as allocated by `shishi_authenticator()`. |
seqnumber | output integer with sequence number field. |

#### Returns

Returns `SHISHI_OK` iff successful.

### shishi_authenticator_seqnumber_remove ()

    int
    shishi_authenticator_seqnumber_remove (Shishi *handle,
                                           Shishi_asn1 authenticator);

Remove sequence number field in Authenticator.

#### Parameters

handle | shishi handle as allocated by `shishi_init()`. |
authenticator | authenticator as allocated by `shishi_authenticator()`. |

#### Returns

Returns `SHISHI_OK` iff successful.

### shishi_authenticator_seqnumber_set ()

    int
    shishi_authenticator_seqnumber_set (Shishi *handle,
                                        Shishi_asn1 authenticator,
                                        uint32_t seqnumber);

Store sequence number field in Authenticator.

#### Parameters

handle | shishi handle as allocated by `shishi_init()`. |
authenticator | authenticator as allocated by `shishi_authenticator()`. |
seqnumber | integer with sequence number field to store in Authenticator. |

#### Returns

Returns `SHISHI_OK` iff successful.

### shishi_authenticator_client ()

    int
    shishi_authenticator_client (Shishi *handle,
                                 Shishi_asn1 authenticator,
                                 char **client,
                                 size_t *clientlen);

Represent client principal name in Authenticator as zero-terminated string. The string is allocate by this function, and it is the responsibility of the caller to deallocate it. Note that the output length `clientlen` does not include the terminating zero.

#### Parameters

handle | Shishi library handle create by `shishi_init()`. |
authenticator | Authenticator variable to get client name from. |
client | pointer to newly allocated zero terminated string containing principal name. May be `NULL` (to only populate `clientlen` ). |
clientlen | pointer to length of `client` on output, excluding terminating zero. May be `NULL` (to only populate `client` ). |

#### Returns

Returns SHISHI_OK iff successful.

### shishi_authenticator_clientrealm ()

    int
    shishi_authenticator_clientrealm (Shishi *handle,
                                      Shishi_asn1 authenticator,
                                      char **client,
                                      size_t *clientlen);

Convert cname and realm fields from Authenticator to printable principal name format. The string is allocate by this function, and it is the responsibility of the caller to deallocate it. Note that the output length `clientlen` does not include the terminating zero.

#### Parameters

handle | Shishi library handle create by `shishi_init()`. |
authenticator | Authenticator variable to get client name and realm from. |
client | pointer to newly allocated zero terminated string containing principal name and realm. May be `NULL` (to only populate `clientlen` ). |
clientlen | pointer to length of `client` on output, excluding terminating zero. May be `NULL` (to only populate `client` ). |

#### Returns

Returns SHISHI_OK iff successful.

### shishi_authenticator_remove_cksum ()

    int
    shishi_authenticator_remove_cksum (Shishi *handle,
                                       Shishi_asn1 authenticator);

### shishi_authenticator_cksum ()

    int
    shishi_authenticator_cksum (Shishi *handle,
                                Shishi_asn1 authenticator,
                                int32_t *cksumtype,
                                char **cksum,
                                size_t *cksumlen);

Read checksum value from authenticator. `cksum` is allocated by this function, and it is the responsibility of caller to deallocate it.

#### Parameters

handle | shishi handle as allocated by `shishi_init()`. |
authenticator | authenticator as allocated by `shishi_authenticator()`. |
cksumtype | output checksum type. |
cksum | newly allocated output checksum data from authenticator. |
cksumlen | on output, actual size of allocated output checksum data buffer. |

#### Returns

Returns SHISHI_OK iff successful.

### shishi_authenticator_set_cksum ()

    int
    shishi_authenticator_set_cksum (Shishi *handle,
                                    Shishi_asn1 authenticator,
                                    int cksumtype,
                                    char *cksum,
                                    size_t cksumlen);

Store checksum value in authenticator. A checksum is usually created by calling `shishi_checksum()` on some application specific data using the key from the ticket that is being used. To save time, you may want to use `shishi_authenticator_add_cksum()` instead, which calculates the checksum and calls this function in one step.

#### Parameters

handle | shishi handle as allocated by `shishi_init()`. |
authenticator | authenticator as allocated by `shishi_authenticator()`. |
cksumtype | input checksum type to store in authenticator. |
cksum | input checksum data to store in authenticator. |
cksumlen | size of input checksum data to store in authenticator. |

#### Returns

Returns SHISHI_OK iff successful.

### shishi_authenticator_add_cksum ()

    int
    shishi_authenticator_add_cksum (Shishi *handle,
                                    Shishi_asn1 authenticator,
                                    Shishi_key *key,
                                    int keyusage,
                                    char *data,
                                    size_t datalen);

Calculate checksum for data and store it in the authenticator.

#### Parameters

handle | shishi handle as allocated by `shishi_init()`. |
authenticator | authenticator as allocated by `shishi_authenticator()`. |
key | key to to use for encryption. |
keyusage | cryptographic key usage value to use in encryption. |
data | input array with data to calculate checksum on. |
datalen | size of input array with data to calculate checksum on. |

#### Returns

Returns SHISHI_OK iff successful.

### shishi_authenticator_add_cksum_type ()

    int
    shishi_authenticator_add_cksum_type (Shishi *handle,
                                         Shishi_asn1 authenticator,
                                         Shishi_key *key,
                                         int keyusage,
                                         int cksumtype,
                                         char *data,
                                         size_t datalen);

Calculate checksum for data and store it in the authenticator.

#### Parameters

handle | shishi handle as allocated by `shishi_init()`. |
authenticator | authenticator as allocated by `shishi_authenticator()`. |
key | key to to use for encryption. |
keyusage | cryptographic key usage value to use in encryption. |
cksumtype | checksum to type to calculate checksum. |
data | input array with data to calculate checksum on. |
datalen | size of input array with data to calculate checksum on. |

#### Returns

Returns SHISHI_OK iff successful.

### shishi_authenticator_remove_subkey ()

    int
    shishi_authenticator_remove_subkey (Shishi *handle,
                                        Shishi_asn1 authenticator);

Remove subkey from the authenticator.

#### Parameters

handle | shishi handle as allocated by `shishi_init()`. |
authenticator | authenticator as allocated by `shishi_authenticator()`. |

#### Returns

Returns SHISHI_OK iff successful.

### shishi_authenticator_subkey ()

    Shishi_asn1
    shishi_authenticator_subkey (Shishi *handle);

This function creates a new Authenticator, populated with some default values. It uses the current time as returned by the system for the ctime and cusec fields. It adds a random subkey.

#### Parameters

handle | shishi handle as allocated by `shishi_init()`. |

#### Returns

Returns the authenticator or NULL on failure.

### shishi_authenticator_get_subkey ()

    int
    shishi_authenticator_get_subkey (Shishi *handle,
                                     Shishi_asn1 authenticator,
                                     Shishi_key **subkey);

Read subkey value from authenticator.

#### Parameters

handle | shishi handle as allocated by `shishi_init()`. |
authenticator | authenticator as allocated by `shishi_authenticator()`. |
subkey | output newly allocated subkey from authenticator. |

#### Returns

Returns SHISHI_OK if successful or SHISHI_ASN1_NO_ELEMENT if subkey is not present.

### shishi_authenticator_set_subkey ()

    int
    shishi_authenticator_set_subkey (Shishi *handle,
                                     Shishi_asn1 authenticator,
                                     int32_t subkeytype,
                                     const char *subkey,
                                     size_t subkeylen);

Store subkey value in authenticator. A subkey is usually created by calling `shishi_key_random()` using the default encryption type of the key from the ticket that is being used. To save time, you may want to use `shishi_authenticator_add_subkey()` instead, which calculates the subkey and calls this function in one step.

#### Parameters

handle | shishi handle as allocated by `shishi_init()`. |
authenticator | authenticator as allocated by `shishi_authenticator()`. |
subkeytype | input subkey type to store in authenticator. |
subkey | input subkey data to store in authenticator. |
subkeylen | size of input subkey data to store in authenticator. |

#### Returns

Returns SHISHI_OK iff successful.

### shishi_authenticator_add_random_subkey ()

    int
    shishi_authenticator_add_random_subkey
                                   (Shishi *handle,
                                    Shishi_asn1 authenticator);

Generate random subkey, of the default encryption type from configuration, and store it in the authenticator.

#### Parameters

handle | shishi handle as allocated by `shishi_init()`. |
authenticator | authenticator as allocated by `shishi_authenticator()`. |

#### Returns

Returns SHISHI_OK iff successful.

### shishi_authenticator_add_random_subkey_etype ()

    int
    shishi_authenticator_add_random_subkey_etype
                                   (Shishi *handle,
                                    Shishi_asn1 authenticator,
                                    int etype);

Generate random subkey of indicated encryption type, and store it in the authenticator.

#### Parameters

handle | shishi handle as allocated by `shishi_init()`. |
authenticator | authenticator as allocated by `shishi_authenticator()`. |
etype | encryption type of random key to generate. |

#### Returns

Returns SHISHI_OK iff successful.

### shishi_authenticator_add_subkey ()

    int
    shishi_authenticator_add_subkey (Shishi *handle,
                                     Shishi_asn1 authenticator,
                                     Shishi_key *subkey);

Store subkey in the authenticator.

#### Parameters

handle | shishi handle as allocated by `shishi_init()`. |
authenticator | authenticator as allocated by `shishi_authenticator()`. |
subkey | subkey to add to authenticator. |

#### Returns

Returns SHISHI_OK iff successful.

### shishi_authenticator_clear_authorizationdata ()

    int
    shishi_authenticator_clear_authorizationdata
                                   (Shishi *handle,
                                    Shishi_asn1 authenticator);

Remove the authorization-data field from Authenticator.

#### Parameters

handle | shishi handle as allocated by `shishi_init()`. |
authenticator | Authenticator as allocated by `shishi_authenticator()`. |

#### Returns

Returns SHISHI_OK iff successful.

### shishi_authenticator_add_authorizationdata ()

    int
    shishi_authenticator_add_authorizationdata
                                   (Shishi *handle,
                                    Shishi_asn1 authenticator,
                                    int32_t adtype,
                                    const char *addata,
                                    size_t addatalen);

Add authorization data to authenticator.

#### Parameters

handle | shishi handle as allocated by `shishi_init()`. |
authenticator | authenticator as allocated by `shishi_authenticator()`. |
adtype | input authorization data type to add. |
addata | input authorization data to add. |
addatalen | size of input authorization data to add. |

#### Returns

Returns SHISHI_OK iff successful.

### shishi_authenticator_authorizationdata ()

    int
    shishi_authenticator_authorizationdata
                                   (Shishi *handle,
                                    Shishi_asn1 authenticator,
                                    int32_t *adtype,
                                    char **addata,
                                    size_t *addatalen,
                                    size_t nth);

Extract n:th authorization data from authenticator. The first field is 1.

#### Parameters

handle | shishi handle as allocated by `shishi_init()`. |
authenticator | authenticator as allocated by `shishi_authenticator()`. |
adtype | output authorization data type. |
addata | newly allocated output authorization data. |
addatalen | on output, actual size of newly allocated authorization data. |
nth | element number of authorization-data to extract. |

#### Returns

Returns SHISHI_OK iff successful.

### shishi_authenticator_read ()

    int
    shishi_authenticator_read (Shishi *handle,
                               FILE *fh,
                               Shishi_asn1 *authenticator);

Read DER encoded authenticator from file and populate given authenticator variable.

#### Parameters

handle | shishi handle as allocated by `shishi_init()`. |
fh | file handle open for reading. |
authenticator | output variable with newly allocated authenticator. |

#### Returns

Returns SHISHI_OK iff successful.

### shishi_authenticator_parse ()

    int
    shishi_authenticator_parse (Shishi *handle,
                                FILE *fh,
                                Shishi_asn1 *authenticator);

Read ASCII armored DER encoded authenticator from file and populate given authenticator variable.

#### Parameters

handle | shishi handle as allocated by `shishi_init()`. |
fh | file handle open for reading. |
authenticator | output variable with newly allocated authenticator. |

#### Returns

Returns SHISHI_OK iff successful.

### shishi_authenticator_from_file ()

    int
    shishi_authenticator_from_file (Shishi *handle,
                                    Shishi_asn1 *authenticator,
                                    int filetype,
                                    const char *filename);

Read Authenticator from file in specified TYPE.

#### Parameters

handle | shishi handle as allocated by `shishi_init()`. |
authenticator | output variable with newly allocated Authenticator. |
filetype | input variable specifying type of file to be read, see Shishi_filetype. |
filename | input variable with filename to read from. |

#### Returns

Returns SHISHI_OK iff successful.

### shishi_authenticator_print ()

    int
    shishi_authenticator_print (Shishi *handle,
                                FILE *fh,
                                Shishi_asn1 authenticator);

Print ASCII armored DER encoding of authenticator to file.

#### Parameters

handle | shishi handle as allocated by `shishi_init()`. |
fh | file handle open for writing. |
authenticator | authenticator as allocated by `shishi_authenticator()`. |

#### Returns

Returns SHISHI_OK iff successful.

### shishi_authenticator_to_file ()

    int
    shishi_authenticator_to_file (Shishi *handle,
                                  Shishi_asn1 authenticator,
                                  int filetype,
                                  const char *filename);

Write Authenticator to file in specified TYPE. The file will be truncated if it exists.

#### Parameters

handle | shishi handle as allocated by `shishi_init()`. |
authenticator | Authenticator to save. |
filetype | input variable specifying type of file to be written, see Shishi_filetype. |
filename | input variable with filename to write to. |

#### Returns

Returns SHISHI_OK iff successful.

### shishi_authenticator_save ()

    int
    shishi_authenticator_save (Shishi *handle,
                               FILE *fh,
                               Shishi_asn1 authenticator);

Save DER encoding of authenticator to file.

#### Parameters

handle | shishi handle as allocated by `shishi_init()`. |
fh | file handle open for writing. |
authenticator | authenticator as allocated by `shishi_authenticator()`. |

#### Returns

Returns SHISHI_OK iff successful.

### shishi_as ()

    int
    shishi_as (Shishi *handle,
               Shishi_as **as);

Allocate a new AS exchange variable.

#### Parameters

handle | shishi handle as allocated by `shishi_init()`. |
as | holds pointer to newly allocate Shishi_as structure. |

#### Returns

Returns SHISHI_OK iff successful.

### shishi_as_done ()

    void
    shishi_as_done (Shishi_as *as);

Deallocate resources associated with AS exchange. This should be called by the application when it no longer need to utilize the AS exchange handle.

#### Parameters

as | structure that holds information about AS exchange |

### shishi_as_req ()

    Shishi_asn1
    shishi_as_req (Shishi_as *as);

Get ASN.1 AS-REQ structure from AS exchange.

#### Parameters

as | structure that holds information about AS exchange |

#### Returns

Returns the generated AS-REQ packet from the AS exchange, or NULL if not yet set or an error occured.

### shishi_as_req_build ()

    int
    shishi_as_req_build (Shishi_as *as);

Possibly remove unset fields (e.g., rtime).

#### Parameters

as | structure that holds information about AS exchange |

#### Returns

Returns SHISHI_OK iff successful.

### shishi_as_req_set ()

    void
    shishi_as_req_set (Shishi_as *as,
                       Shishi_asn1 asreq);

Set the AS-REQ in the AS exchange.

#### Parameters

as | structure that holds information about AS exchange |
asreq | asreq to store in AS. |

### shishi_as_req_der ()

    int
    shishi_as_req_der (Shishi_as *as,
                       char **out,
                       size_t *outlen);

DER encode AS-REQ. `out` is allocated by this function, and it is the responsibility of caller to deallocate it.

#### Parameters

as | structure that holds information about AS exchange |
out | output array with newly allocated DER encoding of AS-REQ. |
outlen | length of output array with DER encoding of AS-REQ. |

#### Returns

Returns SHISHI_OK iff successful.

### shishi_as_req_der_set ()

    int
    shishi_as_req_der_set (Shishi_as *as,
                           char *der,
                           size_t derlen);

DER decode AS-REQ and set it AS exchange. If decoding fails, the AS-REQ in the AS exchange remains.

#### Parameters

as | structure that holds information about AS exchange |
der | input array with DER encoded AP-REQ. |
derlen | length of input array with DER encoded AP-REQ. |

#### Returns

Returns SHISHI_OK.

### shishi_as_rep ()

    Shishi_asn1
    shishi_as_rep (Shishi_as *as);

Get ASN.1 AS-REP structure from AS exchange.

#### Parameters

as | structure that holds information about AS exchange |

#### Returns

Returns the received AS-REP packet from the AS exchange, or NULL if not yet set or an error occured.

### shishi_as_rep_set ()

    void
    shishi_as_rep_set (Shishi_as *as,
                       Shishi_asn1 asrep);

Set the AS-REP in the AS exchange.

#### Parameters

as | structure that holds information about AS exchange |
asrep | asrep to store in AS. |

### shishi_as_rep_build ()

    int
    shishi_as_rep_build (Shishi_as *as,
                         Shishi_key *key);

Build AS-REP.

#### Parameters

as | structure that holds information about AS exchange |
key | user's key, used to encrypt the encrypted part of the AS-REP. |

#### Returns

Returns SHISHI_OK iff successful.

### shishi_as_rep_der ()

    int
    shishi_as_rep_der (Shishi_as *as,
                       char **out,
                       size_t *outlen);

DER encode AS-REP. `out` is allocated by this function, and it is the responsibility of caller to deallocate it.

#### Parameters

as | structure that holds information about AS exchange |
out | output array with newly allocated DER encoding of AS-REP. |
outlen | length of output array with DER encoding of AS-REP. |

#### Returns

Returns SHISHI_OK iff successful.

### shishi_as_rep_der_set ()

    int
    shishi_as_rep_der_set (Shishi_as *as,
                           char *der,
                           size_t derlen);

DER decode AS-REP and set it AS exchange. If decoding fails, the AS-REP in the AS exchange remains.

#### Parameters

as | structure that holds information about AS exchange |
der | input array with DER encoded AP-REP. |
derlen | length of input array with DER encoded AP-REP. |

#### Returns

Returns SHISHI_OK.

### shishi_as_krberror ()

    Shishi_asn1
    shishi_as_krberror (Shishi_as *as);

Get ASN.1 KRB-ERROR structure from AS exchange.

#### Parameters

as | structure that holds information about AS exchange |

#### Returns

Returns the received KRB-ERROR packet from the AS exchange, or NULL if not yet set or an error occured.

### shishi_as_krberror_der ()

    int
    shishi_as_krberror_der (Shishi_as *as,
                            char **out,
                            size_t *outlen);

DER encode KRB-ERROR. `out` is allocated by this function, and it is the responsibility of caller to deallocate it.

#### Parameters

as | structure that holds information about AS exchange |
out | output array with newly allocated DER encoding of KRB-ERROR. |
outlen | length of output array with DER encoding of KRB-ERROR. |

#### Returns

Returns SHISHI_OK iff successful.

### shishi_as_krberror_set ()

    void
    shishi_as_krberror_set (Shishi_as *as,
                            Shishi_asn1 krberror);

Set the KRB-ERROR in the AS exchange.

#### Parameters

as | structure that holds information about AS exchange |
krberror | krberror to store in AS. |

### shishi_as_tkt ()

    Shishi_tkt *
    shishi_as_tkt (Shishi_as *as);

Get Ticket in AS exchange.

#### Parameters

as | structure that holds information about AS exchange |

#### Returns

Returns the newly acquired tkt from the AS exchange, or NULL if not yet set or an error occured.

### shishi_as_tkt_set ()

    void
    shishi_as_tkt_set (Shishi_as *as,
                       Shishi_tkt *tkt);

Set the Tkt in the AS exchange.

#### Parameters

as | structure that holds information about AS exchange |
tkt | tkt to store in AS. |

### shishi_as_sendrecv ()

    int
    shishi_as_sendrecv (Shishi_as *as);

Send AS-REQ and receive AS-REP or KRB-ERROR. This is the initial authentication, usually used to acquire a Ticket Granting Ticket.

#### Parameters

as | structure that holds information about AS exchange |

#### Returns

Returns SHISHI_OK iff successful.

### shishi_as_sendrecv_hint ()

    int
    shishi_as_sendrecv_hint (Shishi_as *as,
                             Shishi_tkts_hint *hint);

Send AS-REQ and receive AS-REP or KRB-ERROR. This is the initial authentication, usually used to acquire a Ticket Granting Ticket. The `hint` structure can be used to set, e.g., parameters for TLS authentication.

#### Parameters

as | structure that holds information about AS exchange |
hint | additional parameters that modify connection behaviour, or `NULL`. |

#### Returns

Returns SHISHI_OK iff successful.

### shishi_as_rep_process ()

    int
    shishi_as_rep_process (Shishi_as *as,
                           Shishi_key *key,
                           const char *password);

Process new AS-REP and set ticket. The key is used to decrypt the AP-REP. If both key and password is NULL, the user is queried for it.

#### Parameters

as | structure that holds information about AS exchange |
key | user's key, used to encrypt the encrypted part of the AS-REP. |
password | user's password, used if key is NULL. |

#### Returns

Returns SHISHI_OK iff successful.

### shishi_tgs ()

    int
    shishi_tgs (Shishi *handle,
                Shishi_tgs **tgs);

Allocate a new TGS exchange variable.

#### Parameters

handle | shishi handle as allocated by `shishi_init()`. |
tgs | holds pointer to newly allocate Shishi_tgs structure. |

#### Returns

Returns SHISHI_OK iff successful.

### shishi_tgs_done ()

    void
    shishi_tgs_done (Shishi_tgs *tgs);

Deallocate resources associated with TGS exchange. This should be called by the application when it no longer need to utilize the TGS exchange handle.

#### Parameters

tgs | structure that holds information about AS exchange |

### shishi_tgs_tgtkt ()

    Shishi_tkt *
    shishi_tgs_tgtkt (Shishi_tgs *tgs);

Get Ticket-granting-ticket from TGS exchange.

#### Parameters

tgs | structure that holds information about TGS exchange |

#### Returns

Returns the ticket-granting-ticket used in the TGS exchange, or NULL if not yet set or an error occured.

### shishi_tgs_tgtkt_set ()

    void
    shishi_tgs_tgtkt_set (Shishi_tgs *tgs,
                          Shishi_tkt *tgtkt);

Set the Ticket in the TGS exchange.

#### Parameters

tgs | structure that holds information about TGS exchange |
tgtkt | ticket granting ticket to store in TGS. |

### shishi_tgs_ap ()

    Shishi_ap *
    shishi_tgs_ap (Shishi_tgs *tgs);

Get the AP from TGS exchange.

#### Parameters

tgs | structure that holds information about TGS exchange |

#### Returns

Returns the AP exchange (part of TGS-REQ) from the TGS exchange, or NULL if not yet set or an error occured.

### shishi_tgs_req ()

    Shishi_asn1
    shishi_tgs_req (Shishi_tgs *tgs);

Get the TGS-REQ from TGS exchange.

#### Parameters

tgs | structure that holds information about TGS exchange |

#### Returns

Returns the generated TGS-REQ from the TGS exchange, or NULL if not yet set or an error occured.

### shishi_tgs_req_der ()

    int
    shishi_tgs_req_der (Shishi_tgs *tgs,
                        char **out,
                        size_t *outlen);

DER encode TGS-REQ. `out` is allocated by this function, and it is the responsibility of caller to deallocate it.

#### Parameters

tgs | structure that holds information about TGS exchange |
out | output array with newly allocated DER encoding of TGS-REQ. |
outlen | length of output array with DER encoding of TGS-REQ. |

#### Returns

Returns SHISHI_OK iff successful.

### shishi_tgs_req_der_set ()

    int
    shishi_tgs_req_der_set (Shishi_tgs *tgs,
                            char *der,
                            size_t derlen);

DER decode TGS-REQ and set it TGS exchange. If decoding fails, the TGS-REQ in the TGS exchange remains.

#### Parameters

tgs | structure that holds information about TGS exchange |
der | input array with DER encoded AP-REQ. |
derlen | length of input array with DER encoded AP-REQ. |

#### Returns

Returns SHISHI_OK.

### shishi_tgs_req_set ()

    void
    shishi_tgs_req_set (Shishi_tgs *tgs,
                        Shishi_asn1 tgsreq);

Set the TGS-REQ in the TGS exchange.

#### Parameters

tgs | structure that holds information about TGS exchange |
tgsreq | tgsreq to store in TGS. |

### shishi_tgs_req_build ()

    int
    shishi_tgs_req_build (Shishi_tgs *tgs);

Checksum data in authenticator and add ticket and authenticator to TGS-REQ.

#### Parameters

tgs | structure that holds information about TGS exchange |

#### Returns

Returns SHISHI_OK iff successful.

### shishi_tgs_req_process ()

    int
    shishi_tgs_req_process (Shishi_tgs *tgs);

Process new TGS-REQ and set ticket. The key to decrypt the TGS-REQ is taken from the EncKDCReqPart of the TGS tgticket.

#### Parameters

tgs | structure that holds information about TGS exchange |

#### Returns

Returns SHISHI_OK iff successful.

### shishi_tgs_rep ()

    Shishi_asn1
    shishi_tgs_rep (Shishi_tgs *tgs);

Get TGS-REP from TGS exchange.

#### Parameters

tgs | structure that holds information about TGS exchange |

#### Returns

Returns the received TGS-REP from the TGS exchange, or NULL if not yet set or an error occured.

### shishi_tgs_rep_der ()

    int
    shishi_tgs_rep_der (Shishi_tgs *tgs,
                        char **out,
                        size_t *outlen);

DER encode TGS-REP. `out` is allocated by this function, and it is the responsibility of caller to deallocate it.

#### Parameters

tgs | structure that holds information about TGS exchange |
out | output array with newly allocated DER encoding of TGS-REP. |
outlen | length of output array with DER encoding of TGS-REP. |

#### Returns

Returns SHISHI_OK iff successful.

### shishi_tgs_rep_build ()

    int
    shishi_tgs_rep_build (Shishi_tgs *tgs,
                          int keyusage,
                          Shishi_key *key);

Build TGS-REP.

#### Parameters

tgs | structure that holds information about TGS exchange |
keyusage | keyusage integer. |
key | user's key, used to encrypt the encrypted part of the TGS-REP. |

#### Returns

Returns SHISHI_OK iff successful.

### shishi_tgs_rep_process ()

    int
    shishi_tgs_rep_process (Shishi_tgs *tgs);

Process new TGS-REP and set ticket. The key to decrypt the TGS-REP is taken from the EncKDCRepPart of the TGS tgticket.

#### Parameters

tgs | structure that holds information about TGS exchange |

#### Returns

Returns SHISHI_OK iff successful.

### shishi_tgs_krberror ()

    Shishi_asn1
    shishi_tgs_krberror (Shishi_tgs *tgs);

Get KRB-ERROR from TGS exchange.

#### Parameters

tgs | structure that holds information about TGS exchange |

#### Returns

Returns the received TGS-REP from the TGS exchange, or NULL if not yet set or an error occured.

### shishi_tgs_krberror_der ()

    int
    shishi_tgs_krberror_der (Shishi_tgs *tgs,
                             char **out,
                             size_t *outlen);

DER encode KRB-ERROR. `out` is allocated by this function, and it is the responsibility of caller to deallocate it.

#### Parameters

tgs | structure that holds information about TGS exchange |
out | output array with newly allocated DER encoding of KRB-ERROR. |
outlen | length of output array with DER encoding of KRB-ERROR. |

#### Returns

Returns SHISHI_OK iff successful.

### shishi_tgs_krberror_set ()

    void
    shishi_tgs_krberror_set (Shishi_tgs *tgs,
                             Shishi_asn1 krberror);

Set the KRB-ERROR in the TGS exchange.

#### Parameters

tgs | structure that holds information about TGS exchange |
krberror | krberror to store in TGS. |

### shishi_tgs_tkt ()

    Shishi_tkt *
    shishi_tgs_tkt (Shishi_tgs *tgs);

Get Ticket from TGS exchange.

#### Parameters

tgs | structure that holds information about TGS exchange |

#### Returns

Returns the newly acquired ticket from the TGS exchange, or NULL if not yet set or an error occured.

### shishi_tgs_tkt_set ()

    void
    shishi_tgs_tkt_set (Shishi_tgs *tgs,
                        Shishi_tkt *tkt);

Set the Ticket in the TGS exchange.

#### Parameters

tgs | structure that holds information about TGS exchange |
tkt | ticket to store in TGS. |

### shishi_tgs_sendrecv ()

    int
    shishi_tgs_sendrecv (Shishi_tgs *tgs);

Send TGS-REQ and receive TGS-REP or KRB-ERROR. This is the subsequent authentication, usually used to acquire server tickets.

#### Parameters

tgs | structure that holds information about TGS exchange |

#### Returns

Returns SHISHI_OK iff successful.

### shishi_tgs_sendrecv_hint ()

    int
    shishi_tgs_sendrecv_hint (Shishi_tgs *tgs,
                              Shishi_tkts_hint *hint);

Send TGS-REQ and receive TGS-REP or KRB-ERROR. This is the subsequent authentication, usually used to acquire server tickets. The `hint` structure can be used to set, e.g., parameters for TLS authentication.

#### Parameters

tgs | structure that holds information about TGS exchange |
hint | additional parameters that modify connection behaviour, or `NULL`. |

#### Returns

Returns SHISHI_OK iff successful.

### shishi_tgs_set_server ()

    int
    shishi_tgs_set_server (Shishi_tgs *tgs,
                           const char *server);

Set the server in the TGS-REQ.

#### Parameters

tgs | structure that holds information about TGS exchange |
server | indicates the server to acquire ticket for. |

#### Returns

Returns SHISHI_OK iff successful.

### shishi_tgs_set_realm ()

    int
    shishi_tgs_set_realm (Shishi_tgs *tgs,
                          const char *realm);

Set the server in the TGS-REQ.

#### Parameters

tgs | structure that holds information about TGS exchange |
realm | indicates the realm to acquire ticket for. |

#### Returns

Returns SHISHI_OK iff successful.

### shishi_tgs_set_realmserver ()

    int
    shishi_tgs_set_realmserver (Shishi_tgs *tgs,
                                const char *realm,
                                const char *server);

Set the realm and server in the TGS-REQ.

#### Parameters

tgs | structure that holds information about TGS exchange |
realm | indicates the realm to acquire ticket for. |
server | indicates the server to acquire ticket for. |

#### Returns

Returns SHISHI_OK iff successful.

### shishi_kdcreq ()

    int
    shishi_kdcreq (Shishi *handle,
                   char *realm,
                   char *service,
                   Shishi_asn1 *req);

### shishi_asreq ()

    Shishi_asn1
    shishi_asreq (Shishi *handle);

This function creates a new AS-REQ, populated with some default values.

#### Parameters

handle | shishi handle as allocated by `shishi_init()`. |

#### Returns

Returns the AS-REQ or NULL on failure.

### shishi_asreq_rsc ()

    Shishi_asn1
    shishi_asreq_rsc (Shishi *handle,
                      char *realm,
                      char *server,
                      char *client);

### shishi_tgsreq ()

    Shishi_asn1
    shishi_tgsreq (Shishi *handle);

This function creates a new TGS-REQ, populated with some default values.

#### Parameters

handle | shishi handle as allocated by `shishi_init()`. |

#### Returns

Returns the TGS-REQ or NULL on failure.

### shishi_tgsreq_rst ()

    Shishi_asn1
    shishi_tgsreq_rst (Shishi *handle,
                       char *realm,
                       char *server,
                       Shishi_tkt *tkt);

### shishi_kdcreq_save ()

    int
    shishi_kdcreq_save (Shishi *handle,
                        FILE *fh,
                        Shishi_asn1 kdcreq);

Print DER encoding of KDC-REQ to file.

#### Parameters

handle | shishi handle as allocated by `shishi_init()`. |
fh | file handle open for writing. |
kdcreq | KDC-REQ to save. |

#### Returns

Returns SHISHI_OK iff successful.

### shishi_kdcreq_print ()

    int
    shishi_kdcreq_print (Shishi *handle,
                         FILE *fh,
                         Shishi_asn1 kdcreq);

Print ASCII armored DER encoding of KDC-REQ to file.

#### Parameters

handle | shishi handle as allocated by `shishi_init()`. |
fh | file handle open for writing. |
kdcreq | KDC-REQ to print. |

#### Returns

Returns SHISHI_OK iff successful.

### shishi_kdcreq_to_file ()

    int
    shishi_kdcreq_to_file (Shishi *handle,
                           Shishi_asn1 kdcreq,
                           int filetype,
                           const char *filename);

Write KDC-REQ to file in specified TYPE. The file will be truncated if it exists.

#### Parameters

handle | shishi handle as allocated by `shishi_init()`. |
kdcreq | KDC-REQ to save. |
filetype | input variable specifying type of file to be written, see Shishi_filetype. |
filename | input variable with filename to write to. |

#### Returns

Returns SHISHI_OK iff successful.

### shishi_kdcreq_parse ()

    int
    shishi_kdcreq_parse (Shishi *handle,
                         FILE *fh,
                         Shishi_asn1 *kdcreq);

Read ASCII armored DER encoded KDC-REQ from file and populate given variable.

#### Parameters

handle | shishi handle as allocated by `shishi_init()`. |
fh | file handle open for reading. |
kdcreq | output variable with newly allocated KDC-REQ. |

#### Returns

Returns SHISHI_OK iff successful.

### shishi_kdcreq_read ()

    int
    shishi_kdcreq_read (Shishi *handle,
                        FILE *fh,
                        Shishi_asn1 *kdcreq);

Read DER encoded KDC-REQ from file and populate given variable.

#### Parameters

handle | shishi handle as allocated by `shishi_init()`. |
fh | file handle open for reading. |
kdcreq | output variable with newly allocated KDC-REQ. |

#### Returns

Returns SHISHI_OK iff successful.

### shishi_kdcreq_from_file ()

    int
    shishi_kdcreq_from_file (Shishi *handle,
                             Shishi_asn1 *kdcreq,
                             int filetype,
                             const char *filename);

Read KDC-REQ from file in specified TYPE.

#### Parameters

handle | shishi handle as allocated by `shishi_init()`. |
kdcreq | output variable with newly allocated KDC-REQ. |
filetype | input variable specifying type of file to be read, see Shishi_filetype. |
filename | input variable with filename to read from. |

#### Returns

Returns SHISHI_OK iff successful.

### shishi_asreq_clientrealm ()

    int
    shishi_asreq_clientrealm (Shishi *handle,
                              Shishi_asn1 asreq,
                              char **client,
                              size_t *clientlen);

Convert cname and realm fields from AS-REQ to printable principal name format. The string is allocate by this function, and it is the responsibility of the caller to deallocate it. Note that the output length `clientlen` does not include the terminating zero.

#### Parameters

handle | Shishi library handle create by `shishi_init()`. |
asreq | AS-REQ variable to get client name and realm from. |
client | pointer to newly allocated zero terminated string containing principal name and realm. May be `NULL` (to only populate `clientlen` ). |
clientlen | pointer to length of `client` on output, excluding terminating zero. May be `NULL` (to only populate `client` ). |

#### Returns

Returns SHISHI_OK iff successful.

### shishi_kdcreq_nonce ()

    int
    shishi_kdcreq_nonce (Shishi *handle,
                         Shishi_asn1 kdcreq,
                         uint32_t *nonce);

### shishi_kdcreq_nonce_set ()

    int
    shishi_kdcreq_nonce_set (Shishi *handle,
                             Shishi_asn1 kdcreq,
                             uint32_t nonce);

Store nonce number field in KDC-REQ.

#### Parameters

handle | shishi handle as allocated by `shishi_init()`. |
kdcreq | KDC-REQ variable to set client name field in. |
nonce | integer nonce to store in KDC-REQ. |

#### Returns

Returns `SHISHI_OK` iff successful.

### shishi_kdcreq_client ()

    int
    shishi_kdcreq_client (Shishi *handle,
                          Shishi_asn1 kdcreq,
                          char **client,
                          size_t *clientlen);

Represent client principal name in KDC-REQ as zero-terminated string. The string is allocate by this function, and it is the responsibility of the caller to deallocate it. Note that the output length `clientlen` does not include the terminating zero.

#### Parameters

handle | Shishi library handle create by `shishi_init()`. |
kdcreq | KDC-REQ variable to get client name from. |
client | pointer to newly allocated zero terminated string containing principal name. May be `NULL` (to only populate `clientlen` ). |
clientlen | pointer to length of `client` on output, excluding terminating zero. May be `NULL` (to only populate `client` ). |

#### Returns

Returns SHISHI_OK iff successful.

### shishi_kdcreq_set_cname ()

    int
    shishi_kdcreq_set_cname (Shishi *handle,
                             Shishi_asn1 kdcreq,
                             Shishi_name_type name_type,
                             const char *principal);

Set the client name field in the KDC-REQ.

#### Parameters

handle | shishi handle as allocated by `shishi_init()`. |
kdcreq | KDC-REQ variable to set client name field in. |
name_type | type of principial, see Shishi_name_type, usually SHISHI_NT_UNKNOWN. |
principal | input array with principal name. |

#### Returns

Returns SHISHI_OK iff successful.

### shishi_kdcreq_server ()

    int
    shishi_kdcreq_server (Shishi *handle,
                          Shishi_asn1 kdcreq,
                          char **server,
                          size_t *serverlen);

Represent server principal name in KDC-REQ as zero-terminated string. The string is allocate by this function, and it is the responsibility of the caller to deallocate it. Note that the output length `serverlen` does not include the terminating zero.

#### Parameters

handle | Shishi library handle create by `shishi_init()`. |
kdcreq | KDC-REQ variable to get server name from. |
server | pointer to newly allocated zero terminated string containing principal name. May be `NULL` (to only populate `serverlen` ). |
serverlen | pointer to length of `server` on output, excluding terminating zero. May be `NULL` (to only populate `server` ). |

#### Returns

Returns SHISHI_OK iff successful.

### shishi_kdcreq_set_sname ()

    int
    shishi_kdcreq_set_sname (Shishi *handle,
                             Shishi_asn1 kdcreq,
                             Shishi_name_type name_type,
                             const char *sname[]);

Set the server name field in the KDC-REQ.

#### Parameters

handle | shishi handle as allocated by `shishi_init()`. |
kdcreq | KDC-REQ variable to set server name field in. |
name_type | type of principial, see Shishi_name_type, usually SHISHI_NT_UNKNOWN. |
sname | input array with principal name. |

#### Returns

Returns SHISHI_OK iff successful.

### shishi_kdcreq_realm ()

    int
    shishi_kdcreq_realm (Shishi *handle,
                         Shishi_asn1 kdcreq,
                         char **realm,
                         size_t *realmlen);

Get realm field in KDC-REQ as zero-terminated string. The string is allocate by this function, and it is the responsibility of the caller to deallocate it. Note that the output length `realmlen` does not include the terminating zero.

#### Parameters

handle | Shishi library handle create by `shishi_init()`. |
kdcreq | KDC-REQ variable to get client name from. |
realm | pointer to newly allocated zero terminated string containing realm. May be `NULL` (to only populate `realmlen` ). |
realmlen | pointer to length of `realm` on output, excluding terminating zero. May be `NULL` (to only populate `realmlen` ). |

#### Returns

Returns SHISHI_OK iff successful.

### shishi_kdcreq_realm_get ()

    int
    shishi_kdcreq_realm_get (Shishi *handle,
                             Shishi_asn1 kdcreq,
                             char **realm,
                             size_t *realmlen);

### shishi_kdcreq_set_realm ()

    int
    shishi_kdcreq_set_realm (Shishi *handle,
                             Shishi_asn1 kdcreq,
                             const char *realm);

Set the realm field in the KDC-REQ.

#### Parameters

handle | shishi handle as allocated by `shishi_init()`. |
kdcreq | KDC-REQ variable to set realm field in. |
realm | input array with name of realm. |

#### Returns

Returns SHISHI_OK iff successful.

### shishi_kdcreq_set_server ()

    int
    shishi_kdcreq_set_server (Shishi *handle,
                              Shishi_asn1 req,
                              const char *service);

### shishi_kdcreq_set_realmserver ()

    int
    shishi_kdcreq_set_realmserver (Shishi *handle,
                                   Shishi_asn1 req,
                                   char *realm,
                                   char *service);

### shishi_kdcreq_till ()

    int
    shishi_kdcreq_till (Shishi *handle,
                        Shishi_asn1 kdcreq,
                        char **till,
                        size_t *tilllen);

Get "till" field, i.e., "endtime", in KDC-REQ as a null-terminated string. The string is typically 15 characters long and is allocated by this function. It is the responsibility of the caller to deallocate it. Note that the output length `tilllen` does not include the terminating zero.

#### Parameters

handle | Shishi library handle created by `shishi_init()`. |
kdcreq | KDC-REQ variable to get endtime from. |
till | pointer to newly allocated null terminated string containing "till" field with generalized time. May be passed as `NULL` to only populate `tilllen` . |
tilllen | pointer to length of `till` for output, excluding the terminating null. Set to `NULL`, only `till` is populated. |

#### Returns

Returns SHISHI_OK iff successful.

### shishi_kdcreq_tillc ()

    time_t
    shishi_kdcreq_tillc (Shishi *handle,
                         Shishi_asn1 kdcreq);

Extract C time corresponding to the "till" field.

#### Parameters

handle | Shishi library handle created by `shishi_init()`. |
kdcreq | KDC-REQ variable to get "till" field from. |

#### Returns

Returns the C time interpretation of the "till" field in KDC-REQ.

### shishi_kdcreq_etype ()

    int
    shishi_kdcreq_etype (Shishi *handle,
                         Shishi_asn1 kdcreq,
                         int32_t *etype,
                         int netype);

Return the netype:th encryption type from KDC-REQ. The first etype is number 1.

#### Parameters

handle | shishi handle as allocated by `shishi_init()`. |
kdcreq | KDC-REQ variable to get etype field from. |
etype | output encryption type. |
netype | element number to return. |

#### Returns

Returns SHISHI_OK iff etype successful set.

### shishi_kdcreq_set_etype ()

    int
    shishi_kdcreq_set_etype (Shishi *handle,
                             Shishi_asn1 kdcreq,
                             int32_t *etype,
                             int netype);

Set the list of supported or wanted encryption types in the request. The list should be sorted in priority order.

#### Parameters

handle | shishi handle as allocated by `shishi_init()`. |
kdcreq | KDC-REQ variable to set etype field in. |
etype | input array with encryption types. |
netype | number of elements in input array with encryption types. |

#### Returns

Returns SHISHI_OK iff successful.

### shishi_kdcreq_options ()

    int
    shishi_kdcreq_options (Shishi *handle,
                           Shishi_asn1 kdcreq,
                           uint32_t *flags);

Extract KDC-Options from KDC-REQ.

#### Parameters

handle | shishi handle as allocated by `shishi_init()`. |
kdcreq | KDC-REQ variable to get kdc-options field from. |
flags | pointer to output integer with flags. |

#### Returns

Returns SHISHI_OK iff successful.

### shishi_kdcreq_forwardable_p ()

    int
    shishi_kdcreq_forwardable_p (Shishi *handle,
                                 Shishi_asn1 kdcreq);

Determine if KDC-Option forwardable flag is set.

The FORWARDABLE option indicates that the ticket to be issued is to have its forwardable flag set. It may only be set on the initial request, or in a subsequent request if the ticket-granting ticket on which it is based is also forwardable.

#### Parameters

handle | shishi handle as allocated by `shishi_init()`. |
kdcreq | KDC-REQ variable to get kdc-options field from. |

#### Returns

Returns non-0 iff forwardable flag is set in KDC-REQ.

### shishi_kdcreq_forwarded_p ()

    int
    shishi_kdcreq_forwarded_p (Shishi *handle,
                               Shishi_asn1 kdcreq);

Determine if KDC-Option forwarded flag is set.

The FORWARDED option is only specified in a request to the ticket-granting server and will only be honored if the ticket-granting ticket in the request has its FORWARDABLE bit set. This option indicates that this is a request for forwarding. The address(es) of the host from which the resulting ticket is to be valid are included in the addresses field of the request.

#### Parameters

handle | shishi handle as allocated by `shishi_init()`. |
kdcreq | KDC-REQ variable to get kdc-options field from. |

#### Returns

Returns non-0 iff forwarded flag is set in KDC-REQ.

### shishi_kdcreq_proxiable_p ()

    int
    shishi_kdcreq_proxiable_p (Shishi *handle,
                               Shishi_asn1 kdcreq);

Determine if KDC-Option proxiable flag is set.

The PROXIABLE option indicates that the ticket to be issued is to have its proxiable flag set. It may only be set on the initial request, or in a subsequent request if the ticket-granting ticket on which it is based is also proxiable.

#### Parameters

handle | shishi handle as allocated by `shishi_init()`. |
kdcreq | KDC-REQ variable to get kdc-options field from. |

#### Returns

Returns non-0 iff proxiable flag is set in KDC-REQ.

### shishi_kdcreq_proxy_p ()

    int
    shishi_kdcreq_proxy_p (Shishi *handle,
                           Shishi_asn1 kdcreq);

Determine if KDC-Option proxy flag is set.

The PROXY option indicates that this is a request for a proxy. This option will only be honored if the ticket-granting ticket in the request has its PROXIABLE bit set. The address(es) of the host from which the resulting ticket is to be valid are included in the addresses field of the request.

#### Parameters

handle | shishi handle as allocated by `shishi_init()`. |
kdcreq | KDC-REQ variable to get kdc-options field from. |

#### Returns

Returns non-0 iff proxy flag is set in KDC-REQ.

### shishi_kdcreq_allow_postdate_p ()

    int
    shishi_kdcreq_allow_postdate_p (Shishi *handle,
                                    Shishi_asn1 kdcreq);

Determine if KDC-Option allow-postdate flag is set.

The ALLOW-POSTDATE option indicates that the ticket to be issued is to have its MAY-POSTDATE flag set. It may only be set on the initial request, or in a subsequent request if the ticket-granting ticket on which it is based also has its MAY-POSTDATE flag set.

#### Parameters

handle | shishi handle as allocated by `shishi_init()`. |
kdcreq | KDC-REQ variable to get kdc-options field from. |

#### Returns

Returns non-0 iff allow-postdate flag is set in KDC-REQ.

### shishi_kdcreq_postdated_p ()

    int
    shishi_kdcreq_postdated_p (Shishi *handle,
                               Shishi_asn1 kdcreq);

Determine if KDC-Option postdated flag is set.

The POSTDATED option indicates that this is a request for a postdated ticket. This option will only be honored if the ticket-granting ticket on which it is based has its MAY-POSTDATE flag set. The resulting ticket will also have its INVALID flag set, and that flag may be reset by a subsequent request to the KDC after the starttime in the ticket has been reached.

#### Parameters

handle | shishi handle as allocated by `shishi_init()`. |
kdcreq | KDC-REQ variable to get kdc-options field from. |

#### Returns

Returns non-0 iff postdated flag is set in KDC-REQ.

### shishi_kdcreq_renewable_p ()

    int
    shishi_kdcreq_renewable_p (Shishi *handle,
                               Shishi_asn1 kdcreq);

Determine if KDC-Option renewable flag is set.

The RENEWABLE option indicates that the ticket to be issued is to have its RENEWABLE flag set. It may only be set on the initial request, or when the ticket-granting ticket on which the request is based is also renewable. If this option is requested, then the rtime field in the request contains the desired absolute expiration time for the ticket.

#### Parameters

handle | shishi handle as allocated by `shishi_init()`. |
kdcreq | KDC-REQ variable to get kdc-options field from. |

#### Returns

Returns non-0 iff renewable flag is set in KDC-REQ.

### shishi_kdcreq_disable_transited_check_p ()

    int
    shishi_kdcreq_disable_transited_check_p
                                   (Shishi *handle,
                                    Shishi_asn1 kdcreq);

Determine if KDC-Option disable-transited-check flag is set.

By default the KDC will check the transited field of a ticket-granting-ticket against the policy of the local realm before it will issue derivative tickets based on the ticket-granting ticket. If this flag is set in the request, checking of the transited field is disabled. Tickets issued without the performance of this check will be noted by the reset (0) value of the TRANSITED-POLICY-CHECKED flag, indicating to the application server that the tranisted field must be checked locally. KDCs are encouraged but not required to honor the DISABLE-TRANSITED-CHECK option.

This flag is new since RFC 1510

#### Parameters

handle | shishi handle as allocated by `shishi_init()`. |
kdcreq | KDC-REQ variable to get kdc-options field from. |

#### Returns

Returns non-0 iff disable-transited-check flag is set in KDC-REQ.

### shishi_kdcreq_renewable_ok_p ()

    int
    shishi_kdcreq_renewable_ok_p (Shishi *handle,
                                  Shishi_asn1 kdcreq);

Determine if KDC-Option renewable-ok flag is set.

The RENEWABLE-OK option indicates that a renewable ticket will be acceptable if a ticket with the requested life cannot otherwise be provided. If a ticket with the requested life cannot be provided, then a renewable ticket may be issued with a renew-till equal to the requested endtime. The value of the renew-till field may still be limited by local limits, or limits selected by the individual principal or server.

#### Parameters

handle | shishi handle as allocated by `shishi_init()`. |
kdcreq | KDC-REQ variable to get kdc-options field from. |

#### Returns

Returns non-0 iff renewable-ok flag is set in KDC-REQ.

### shishi_kdcreq_enc_tkt_in_skey_p ()

    int
    shishi_kdcreq_enc_tkt_in_skey_p (Shishi *handle,
                                     Shishi_asn1 kdcreq);

Determine if KDC-Option enc-tkt-in-skey flag is set.

This option is used only by the ticket-granting service. The ENC-TKT-IN-SKEY option indicates that the ticket for the end server is to be encrypted in the session key from the additional ticket-granting ticket provided.

#### Parameters

handle | shishi handle as allocated by `shishi_init()`. |
kdcreq | KDC-REQ variable to get kdc-options field from. |

#### Returns

Returns non-0 iff enc-tkt-in-skey flag is set in KDC-REQ.

### shishi_kdcreq_renew_p ()

    int
    shishi_kdcreq_renew_p (Shishi *handle,
                           Shishi_asn1 kdcreq);

Determine if KDC-Option renew flag is set.

This option is used only by the ticket-granting service. The RENEW option indicates that the present request is for a renewal. The ticket provided is encrypted in the secret key for the server on which it is valid. This option will only be honored if the ticket to be renewed has its RENEWABLE flag set and if the time in its renew-till field has not passed. The ticket to be renewed is passed in the padata field as part of the authentication header.

#### Parameters

handle | shishi handle as allocated by `shishi_init()`. |
kdcreq | KDC-REQ variable to get kdc-options field from. |

#### Returns

Returns non-0 iff renew flag is set in KDC-REQ.

### shishi_kdcreq_validate_p ()

    int
    shishi_kdcreq_validate_p (Shishi *handle,
                              Shishi_asn1 kdcreq);

Determine if KDC-Option validate flag is set.

This option is used only by the ticket-granting service. The VALIDATE option indicates that the request is to validate a postdated ticket. It will only be honored if the ticket presented is postdated, presently has its INVALID flag set, and would be otherwise usable at this time. A ticket cannot be validated before its starttime. The ticket presented for validation is encrypted in the key of the server for which it is valid and is passed in the padata field as part of the authentication header.

#### Parameters

handle | shishi handle as allocated by `shishi_init()`. |
kdcreq | KDC-REQ variable to get kdc-options field from. |

#### Returns

Returns non-0 iff validate flag is set in KDC-REQ.

### shishi_kdcreq_options_set ()

    int
    shishi_kdcreq_options_set (Shishi *handle,
                               Shishi_asn1 kdcreq,
                               uint32_t options);

Set options in KDC-REQ. Note that this reset any already existing flags.

#### Parameters

handle | shishi handle as allocated by `shishi_init()`. |
kdcreq | KDC-REQ variable to set etype field in. |
options | integer with flags to store in KDC-REQ. |

#### Returns

Returns SHISHI_OK iff successful.

### shishi_kdcreq_options_add ()

    int
    shishi_kdcreq_options_add (Shishi *handle,
                               Shishi_asn1 kdcreq,
                               uint32_t option);

Add KDC-Option to KDC-REQ. This preserves all existing options.

#### Parameters

handle | shishi handle as allocated by `shishi_init()`. |
kdcreq | KDC-REQ variable to set etype field in. |
option | integer with options to add in KDC-REQ. |

#### Returns

Returns SHISHI_OK iff successful.

### shishi_kdcreq_clear_padata ()

    int
    shishi_kdcreq_clear_padata (Shishi *handle,
                                Shishi_asn1 kdcreq);

Remove the padata field from KDC-REQ.

#### Parameters

handle | shishi handle as allocated by `shishi_init()`. |
kdcreq | KDC-REQ to remove PA-DATA from. |

#### Returns

Returns SHISHI_OK iff successful.

### shishi_kdcreq_get_padata ()

    int
    shishi_kdcreq_get_padata (Shishi *handle,
                              Shishi_asn1 kdcreq,
                              Shishi_padata_type padatatype,
                              char **out,
                              size_t *outlen);

Get pre authentication data (PA-DATA) from KDC-REQ. Pre authentication data is used to pass various information to KDC, such as in case of a SHISHI_PA_TGS_REQ padatatype the AP-REQ that authenticates the user to get the ticket.

#### Parameters

handle | shishi handle as allocated by `shishi_init()`. |
kdcreq | KDC-REQ to get PA-DATA from. |
padatatype | type of PA-DATA, see Shishi_padata_type. |
out | output array with newly allocated PA-DATA value. |
outlen | size of output array with PA-DATA value. |

#### Returns

Returns SHISHI_OK iff successful.

### shishi_kdcreq_get_padata_tgs ()

    int
    shishi_kdcreq_get_padata_tgs (Shishi *handle,
                                  Shishi_asn1 kdcreq,
                                  Shishi_asn1 *apreq);

Extract TGS pre-authentication data from KDC-REQ. The data is an AP-REQ that authenticates the request. This function call `shishi_kdcreq_get_padata()` with a SHISHI_PA_TGS_REQ padatatype and DER decode the result (if any).

#### Parameters

handle | shishi handle as allocated by `shishi_init()`. |
kdcreq | KDC-REQ to get PA-TGS-REQ from. |
apreq | Output variable with newly allocated AP-REQ. |

#### Returns

Returns SHISHI_OK iff successful.

### shishi_kdcreq_add_padata ()

    int
    shishi_kdcreq_add_padata (Shishi *handle,
                              Shishi_asn1 kdcreq,
                              int padatatype,
                              const char *data,
                              size_t datalen);

Add new pre authentication data (PA-DATA) to KDC-REQ. This is used to pass various information to KDC, such as in case of a SHISHI_PA_TGS_REQ padatatype the AP-REQ that authenticates the user to get the ticket. (But also see `shishi_kdcreq_add_padata_tgs()` which takes an AP-REQ directly.)

#### Parameters

handle | shishi handle as allocated by `shishi_init()`. |
kdcreq | KDC-REQ to add PA-DATA to. |
padatatype | type of PA-DATA, see Shishi_padata_type. |
data | input array with PA-DATA value. |
datalen | size of input array with PA-DATA value. |

#### Returns

Returns SHISHI_OK iff successful.

### shishi_kdcreq_add_padata_tgs ()

    int
    shishi_kdcreq_add_padata_tgs (Shishi *handle,
                                  Shishi_asn1 kdcreq,
                                  Shishi_asn1 apreq);

Add TGS pre-authentication data to KDC-REQ. The data is an AP-REQ that authenticates the request. This functions simply DER encodes the AP-REQ and calls `shishi_kdcreq_add_padata()` with a SHISHI_PA_TGS_REQ padatatype.

#### Parameters

handle | shishi handle as allocated by `shishi_init()`. |
kdcreq | KDC-REQ to add PA-DATA to. |
apreq | AP-REQ to add as PA-DATA. |

#### Returns

Returns SHISHI_OK iff successful.

### shishi_kdcreq_add_padata_preauth ()

    int
    shishi_kdcreq_add_padata_preauth (Shishi *handle,
                                      Shishi_asn1 kdcreq,
                                      Shishi_key *key);

Add pre-authentication data to KDC-REQ.

#### Parameters

handle | shishi handle as allocated by `shishi_init()`. |
kdcreq | KDC-REQ to add pre-authentication data to. |
key | Key used to encrypt pre-auth data. |

#### Returns

Returns SHISHI_OK iff successful.

### shishi_kdcreq_build ()

    int
    shishi_kdcreq_build (Shishi *handle,
                         Shishi_asn1 kdcreq);

### shishi_as_derive_salt ()

    int
    shishi_as_derive_salt (Shishi *handle,
                           Shishi_asn1 asreq,
                           Shishi_asn1 asrep,
                           char **salt,
                           size_t *saltlen);

Computes the salt that should be used when deriving a key via `shishi_string_to_key()` for an AS exchange. Currently this searches for PA-DATA of type `SHISHI_PA_PW_SALT` in the AS-REP provided by `asrep` , and if present returns it. Otherwise the salt is composed from the client name and the realm, both are extracted from the request `asreq` .

#### Parameters

handle | Shishi handle as allocated by `shishi_init()`. |
asreq | Input AS-REQ variable. |
asrep | Input AS-REP variable. |
salt | Returned pointer to newly allocated output array. |
saltlen | Pointer to integer, returning size of output array. |

#### Returns

Returns `SHISHI_OK` if successful. Failure conditions include various ASN.1 issues.

### shishi_tgs_process ()

    int
    shishi_tgs_process (Shishi *handle,
                        Shishi_asn1 tgsreq,
                        Shishi_asn1 tgsrep,
                        Shishi_asn1 authenticator,
                        Shishi_asn1 oldenckdcreppart,
                        Shishi_asn1 *enckdcreppart);

Processes a TGS client exchange and outputs the decrypted EncKDCRepPart, holding details about the received ticket. This function simply derives the encryption key from the ticket used to construct the original TGS request, and then calls `shishi_kdc_process()`.

#### Parameters

handle | Shishi handle as allocated by `shishi_init()`. |
tgsreq | Input variable holding the transmitted KDC-REQ. |
tgsrep | Input variable holding the received KDC-REP. |
authenticator | Input variable with an authenticator extracted from the AP-REQ part of `tgsreq` . |
oldenckdcreppart | Input variable with EncKDCRepPart used in the request. |
enckdcreppart | Output variable holding the new EncKDCRepPart. |

#### Returns

Returns `SHISHI_OK` if the TGS client exchange was successful. Failures include ASN.1 and TGS conditions.

### shishi_as_process ()

    int
    shishi_as_process (Shishi *handle,
                       Shishi_asn1 asreq,
                       Shishi_asn1 asrep,
                       const char *string,
                       Shishi_asn1 *enckdcreppart);

Processes an AS client exchange and returns the decrypted EncKDCRepPart, holding details about the received ticket. This function simply derives the encryption key from the password, and then calls `shishi_kdc_process()`.

#### Parameters

handle | Shishi handle as allocated by `shishi_init()`. |
asreq | Input variable holding the transmitted KDC-REQ. |
asrep | Input variable holding the received KDC-REP. |
string | Input variable with a null terminated password. |
enckdcreppart | Output variable returning a new EncKDCRepPart. |

#### Returns

Returns `SHISHI_OK` if the AS client exchange was successful. Multiple failure conditions are possible.

### shishi_kdc_process ()

    int
    shishi_kdc_process (Shishi *handle,
                        Shishi_asn1 kdcreq,
                        Shishi_asn1 kdcrep,
                        Shishi_key *key,
                        int keyusage,
                        Shishi_asn1 *enckdcreppart);

Processes a KDC client exchange and extracts a decrypted EncKDCRepPart, holding details about the received ticket. Use `shishi_kdcrep_get_ticket()` to extract the ticket itself. This function verifies the various conditions that must hold if the response is to be considered valid. In particular, it compares nonces (using `shishi_kdc_check_nonce()`), and if the exchange was an AS exchange, it also checks cname and crealm (using `shishi_as_check_cname()`, `shishi_as_check_crealm()`).

Usually `shishi_as_process()` and `shishi_tgs_process()` should be used instead of this call, since they simplify computation of the decryption key.

#### Parameters

handle | Shishi handle as allocated by `shishi_init()`. |
kdcreq | Input variable holding the transmitted KDC-REQ. |
kdcrep | Input variable holding the received KDC-REP. |
key | Input pointet to key for decrypting parts of `kdcrep` . |
keyusage | Kerberos key usage code. |
enckdcreppart | Output pointer for the extracted EncKDCRepPart. |

#### Returns

Returns `SHISHI_OK` if the KDC client exchange was successful. Multiple failure conditions are possible.

### shishi_kdcreq_sendrecv ()

    int
    shishi_kdcreq_sendrecv (Shishi *handle,
                            Shishi_asn1 kdcreq,
                            Shishi_asn1 *kdcrep);

Sends a request to KDC, and receives the response. The provided AS-REQ, in `kdcreq` , sets all data for the request. On reception the reply is decoded as AS-REP into `kdcrep` .

#### Parameters

handle | Shishi library handle created by `shishi_init()`. |
kdcreq | Input variable with a prepared AS-REQ. |
kdcrep | Output pointer variable returning received AS-REP. |

#### Returns

Return code is `SHISHI_OK` on success, `SHISHI_KDC_TIMEOUT` on timeouts, `SHISHI_ASN1_ERROR` on translation errors, and `SHISHI_GOT_KRBERROR` for other corruptions.

### shishi_kdcreq_sendrecv_hint ()

    int
    shishi_kdcreq_sendrecv_hint (Shishi *handle,
                                 Shishi_asn1 kdcreq,
                                 Shishi_asn1 *kdcrep,
                                 Shishi_tkts_hint *hint);

Sends a request to KDC, and receives the response. The provided request `kdcreq` and the hints structure `hint` , together determine transmitted data. On reception the reply is decoded as AS-REP into `kdcrep` .

#### Parameters

handle | Shishi library handle created by `shishi_init()`. |
kdcreq | Input variable with a prepared AS-REQ. |
kdcrep | Output pointer variable for decoded AS-REP. |
hint | Input Shishi_tkts_hint structure with flags. |

#### Returns

Return code is `SHISHI_OK` on success, `SHISHI_KDC_TIMEOUT` on timeouts, `SHISHI_ASN1_ERROR` on translation errors, and `SHISHI_GOT_KRBERROR` for other corruptions.

### shishi_kdc_copy_crealm ()

    int
    shishi_kdc_copy_crealm (Shishi *handle,
                            Shishi_asn1 kdcrep,
                            Shishi_asn1 encticketpart);

Reads the field "crealm" from the ticket `encticketpart` and copies the value into the reply `kdcrep` .

#### Parameters

handle | Shishi handle as allocated by `shishi_init()`. |
kdcrep | KDC-REP where the field "crealm" is updated. |
encticketpart | EncTicketPart providing "crealm" field. |

#### Returns

Returns `SHISHI_OK` if successful, and ASN.1 failures otherwise.

### shishi_as_check_crealm ()

    int
    shishi_as_check_crealm (Shishi *handle,
                            Shishi_asn1 asreq,
                            Shishi_asn1 asrep);

Verifies that the fields `asreq.req` -body.realm and `asrep.crealm` contain identical realm names. This is one of the steps that has to be performed when processing an exchange of AS-REQ and AS-REP; see `shishi_kdc_process()` for more details.

#### Parameters

handle | Shishi handle as allocated by `shishi_init()`. |
asreq | Request of type AS-REQ. |
asrep | Reply structure of type AS-REP. |

#### Returns

Returns `SHISHI_OK` if successful, `SHISHI_REALM_MISMATCH` whenever the realm names differ, and an error code otherwise.

### shishi_kdc_copy_cname ()

    int
    shishi_kdc_copy_cname (Shishi *handle,
                           Shishi_asn1 kdcrep,
                           Shishi_asn1 encticketpart);

Reads the field "cname" from the ticket `encticketpart` and copies the value into the reply `kdcrep` .

#### Parameters

handle | Shishi handle as allocated by `shishi_init()`. |
kdcrep | KDC-REP where the field "cname" is updated. |
encticketpart | EncTicketPart providing "cname" field. |

#### Returns

Returns `SHISHI_OK` if successful, and ASN.1 failures otherwise.

### shishi_as_check_cname ()

    int
    shishi_as_check_cname (Shishi *handle,
                           Shishi_asn1 asreq,
                           Shishi_asn1 asrep);

Verifies that the fields `asreq.req` -body.cname and `asrep.cname` contain identical names. This is one of the steps that has to be performed when processing an exchange of AS-REQ and AS-REP; see `shishi_kdc_process()` for more details.

#### Parameters

handle | Shishi handle as allocated by `shishi_init()`. |
asreq | Request of type AS-REQ. |
asrep | Reply structure of type AS-REP. |

#### Returns

Returns `SHISHI_OK` if successful, `SHISHI_CNAME_MISMATCH` if the names differ, and an error code otherwise.

### shishi_kdc_copy_nonce ()

    int
    shishi_kdc_copy_nonce (Shishi *handle,
                           Shishi_asn1 kdcreq,
                           Shishi_asn1 enckdcreppart);

Sets the field "nonce" in `enckdcreppart` to a value retreived from the corresponding field in `kdcreq` .

#### Parameters

handle | Shishi handle as allocated by `shishi_init()`. |
kdcreq | KDC-REQ providing "nonce" field. |
enckdcreppart | EncKDCRepPart where "nonce" field is updated. |

#### Returns

Returns `SHISHI_OK` if successful.

### shishi_kdc_check_nonce ()

    int
    shishi_kdc_check_nonce (Shishi *handle,
                            Shishi_asn1 kdcreq,
                            Shishi_asn1 enckdcreppart);

Verifies that `kdcreq.req` -body.nonce and `enckdcreppart.nonce` contain matching values. This is one of the steps that has to be performed when processing an exchange of KDC-REQ and KDC-REP.

#### Parameters

handle | Shishi handle as allocated by `shishi_init()`. |
kdcreq | Request of type KDC-REQ. |
enckdcreppart | Encrypted KDC-REP part. |

#### Returns

Returns `SHISHI_OK` if successful, `SHISHI_NONCE_MISMATCH` whenever the nonces are of differing lengths (usually a sign that a buggy server truncates the nonce to 4 bytes) and the same code if the nonce values differ, or an error code otherwise.

### shishi_asrep ()

    Shishi_asn1
    shishi_asrep (Shishi *handle);

This function creates a new AS-REP, populated with some default values.

#### Parameters

handle | shishi handle as allocated by `shishi_init()`. |

#### Returns

Returns the AS-REP or NULL on failure.

### shishi_tgsrep ()

    Shishi_asn1
    shishi_tgsrep (Shishi *handle);

This function creates a new TGS-REP, populated with some default values.

#### Parameters

handle | shishi handle as allocated by `shishi_init()`. |

#### Returns

Returns the TGS-REP or NULL on failure.

### shishi_kdcrep_save ()

    int
    shishi_kdcrep_save (Shishi *handle,
                        FILE *fh,
                        Shishi_asn1 kdcrep);

Print DER encoding of KDC-REP to file.

#### Parameters

handle | shishi handle as allocated by `shishi_init()`. |
fh | file handle open for writing. |
kdcrep | KDC-REP to save. |

#### Returns

Returns SHISHI_OK iff successful.

### shishi_kdcrep_print ()

    int
    shishi_kdcrep_print (Shishi *handle,
                         FILE *fh,
                         Shishi_asn1 kdcrep);

Print ASCII armored DER encoding of KDC-REP to file.

#### Parameters

handle | shishi handle as allocated by `shishi_init()`. |
fh | file handle open for writing. |
kdcrep | KDC-REP to print. |

#### Returns

Returns SHISHI_OK iff successful.

### shishi_kdcrep_to_file ()

    int
    shishi_kdcrep_to_file (Shishi *handle,
                           Shishi_asn1 kdcrep,
                           int filetype,
                           const char *filename);

Write KDC-REP to file in specified TYPE. The file will be truncated if it exists.

#### Parameters

handle | shishi handle as allocated by `shishi_init()`. |
kdcrep | KDC-REP to save. |
filetype | input variable specifying type of file to be written, see Shishi_filetype. |
filename | input variable with filename to write to. |

#### Returns

Returns SHISHI_OK iff successful.

### shishi_kdcrep_parse ()

    int
    shishi_kdcrep_parse (Shishi *handle,
                         FILE *fh,
                         Shishi_asn1 *kdcrep);

Read ASCII armored DER encoded KDC-REP from file and populate given variable.

#### Parameters

handle | shishi handle as allocated by `shishi_init()`. |
fh | file handle open for reading. |
kdcrep | output variable with newly allocated KDC-REP. |

#### Returns

Returns SHISHI_OK iff successful.

### shishi_kdcrep_read ()

    int
    shishi_kdcrep_read (Shishi *handle,
                        FILE *fh,
                        Shishi_asn1 *kdcrep);

Read DER encoded KDC-REP from file and populate given variable.

#### Parameters

handle | shishi handle as allocated by `shishi_init()`. |
fh | file handle open for reading. |
kdcrep | output variable with newly allocated KDC-REP. |

#### Returns

Returns SHISHI_OK iff successful.

### shishi_kdcrep_from_file ()

    int
    shishi_kdcrep_from_file (Shishi *handle,
                             Shishi_asn1 *kdcrep,
                             int filetype,
                             const char *filename);

Read KDC-REP from file in specified TYPE.

#### Parameters

handle | shishi handle as allocated by `shishi_init()`. |
kdcrep | output variable with newly allocated KDC-REP. |
filetype | input variable specifying type of file to be read, see Shishi_filetype. |
filename | input variable with filename to read from. |

#### Returns

Returns SHISHI_OK iff successful.

### shishi_kdcrep_clear_padata ()

    int
    shishi_kdcrep_clear_padata (Shishi *handle,
                                Shishi_asn1 kdcrep);

Remove the padata field from KDC-REP.

#### Parameters

handle | shishi handle as allocated by `shishi_init()`. |
kdcrep | KDC-REP to remove PA-DATA from. |

#### Returns

Returns SHISHI_OK iff successful.

### shishi_kdcrep_get_enc_part_etype ()

    int
    shishi_kdcrep_get_enc_part_etype (Shishi *handle,
                                      Shishi_asn1 kdcrep,
                                      int32_t *etype);

Extract KDC-REP.enc-part.etype.

#### Parameters

handle | shishi handle as allocated by `shishi_init()`. |
kdcrep | KDC-REP variable to get value from. |
etype | output variable that holds the value. |

#### Returns

Returns SHISHI_OK iff successful.

### shishi_kdcrep_add_enc_part ()

    int
    shishi_kdcrep_add_enc_part (Shishi *handle,
                                Shishi_asn1 kdcrep,
                                Shishi_key *key,
                                int keyusage,
                                Shishi_asn1 enckdcreppart);

Encrypts DER encoded EncKDCRepPart using key and stores it in the KDC-REP.

#### Parameters

handle | shishi handle as allocated by `shishi_init()`. |
kdcrep | KDC-REP to add enc-part field to. |
key | key used to encrypt enc-part. |
keyusage | key usage to use, normally SHISHI_KEYUSAGE_ENCASREPPART, SHISHI_KEYUSAGE_ENCTGSREPPART_SESSION_KEY or SHISHI_KEYUSAGE_ENCTGSREPPART_AUTHENTICATOR_KEY. |
enckdcreppart | EncKDCRepPart to add. |

#### Returns

Returns SHISHI_OK iff successful.

### shishi_kdcrep_get_ticket ()

    int
    shishi_kdcrep_get_ticket (Shishi *handle,
                              Shishi_asn1 kdcrep,
                              Shishi_asn1 *ticket);

Extract ticket from KDC-REP.

#### Parameters

handle | shishi handle as allocated by `shishi_init()`. |
kdcrep | KDC-REP variable to get ticket from. |
ticket | output variable to hold extracted ticket. |

#### Returns

Returns SHISHI_OK iff successful.

### shishi_kdcrep_set_ticket ()

    int
    shishi_kdcrep_set_ticket (Shishi *handle,
                              Shishi_asn1 kdcrep,
                              Shishi_asn1 ticket);

Copy ticket into KDC-REP.

#### Parameters

handle | shishi handle as allocated by `shishi_init()`. |
kdcrep | KDC-REP to add ticket field to. |
ticket | input ticket to copy into KDC-REP ticket field. |

#### Returns

Returns SHISHI_OK iff successful.

### shishi_kdcrep_crealm_set ()

    int
    shishi_kdcrep_crealm_set (Shishi *handle,
                              Shishi_asn1 kdcrep,
                              const char *crealm);

Set the client realm field in the KDC-REP.

#### Parameters

handle | shishi handle as allocated by `shishi_init()`. |
kdcrep | Kdcrep variable to set realm field in. |
crealm | input array with name of realm. |

#### Returns

Returns SHISHI_OK iff successful.

### shishi_kdcrep_cname_set ()

    int
    shishi_kdcrep_cname_set (Shishi *handle,
                             Shishi_asn1 kdcrep,
                             Shishi_name_type name_type,
                             const char *cname[]);

Set the client name field in the KDC-REP.

#### Parameters

handle | shishi handle as allocated by `shishi_init()`. |
kdcrep | Kdcrep variable to set server name field in. |
name_type | type of principial, see Shishi_name_type, usually SHISHI_NT_UNKNOWN. |
cname | input array with principal name. |

#### Returns

Returns SHISHI_OK iff successful.

### shishi_kdcrep_client_set ()

    int
    shishi_kdcrep_client_set (Shishi *handle,
                              Shishi_asn1 kdcrep,
                              const char *client);

Set the client name field in the KDC-REP.

#### Parameters

handle | shishi handle as allocated by `shishi_init()`. |
kdcrep | Kdcrep variable to set server name field in. |
client | zero-terminated string with principal name on RFC 1964 form. |

#### Returns

Returns SHISHI_OK iff successful.

### shishi_kdcrep_crealmserver_set ()

    int
    shishi_kdcrep_crealmserver_set (Shishi *handle,
                                    Shishi_asn1 kdcrep,
                                    const char *crealm,
                                    const char *client);

### shishi_kdcrep_set_enc_part ()

    int
    shishi_kdcrep_set_enc_part (Shishi *handle,
                                Shishi_asn1 kdcrep,
                                int32_t etype,
                                uint32_t kvno,
                                const char *buf,
                                size_t buflen);

Set the encrypted enc-part field in the KDC-REP. The encrypted data is usually created by calling `shishi_encrypt()` on the DER encoded enc-part. To save time, you may want to use `shishi_kdcrep_add_enc_part()` instead, which calculates the encrypted data and calls this function in one step.

#### Parameters

handle | shishi handle as allocated by `shishi_init()`. |
kdcrep | KDC-REP to add enc-part field to. |
etype | encryption type used to encrypt enc-part. |
kvno | key version number. |
buf | input array with encrypted enc-part. |
buflen | size of input array with encrypted enc-part. |

#### Returns

Returns SHISHI_OK iff successful.

### shishi_kdcrep_decrypt ()

    int
    shishi_kdcrep_decrypt (Shishi *handle,
                           Shishi_asn1 kdcrep,
                           Shishi_key *key,
                           int keyusage,
                           Shishi_asn1 *enckdcreppart);

### shishi_enckdcreppart ()

    Shishi_asn1
    shishi_enckdcreppart (Shishi *handle);

### shishi_encasreppart ()

    Shishi_asn1
    shishi_encasreppart (Shishi *handle);

### shishi_enckdcreppart_get_key ()

    int
    shishi_enckdcreppart_get_key (Shishi *handle,
                                  Shishi_asn1 enckdcreppart,
                                  Shishi_key **key);

Extract the key to use with the ticket sent in the KDC-REP associated with the EncKDCRepPart input variable.

#### Parameters

handle | shishi handle as allocated by `shishi_init()`. |
enckdcreppart | input EncKDCRepPart variable. |
key | newly allocated encryption key handle. |

#### Returns

Returns `SHISHI_OK` iff successful.

### shishi_enckdcreppart_key_set ()

    int
    shishi_enckdcreppart_key_set (Shishi *handle,
                                  Shishi_asn1 enckdcreppart,
                                  Shishi_key *key);

Set the EncKDCRepPart.key field to key type and value of supplied key.

#### Parameters

handle | shishi handle as allocated by `shishi_init()`. |
enckdcreppart | input EncKDCRepPart variable. |
key | key handle with information to store in enckdcreppart. |

#### Returns

Returns `SHISHI_OK` iff successful.

### shishi_enckdcreppart_nonce_set ()

    int
    shishi_enckdcreppart_nonce_set (Shishi *handle,
                                    Shishi_asn1 enckdcreppart,
                                    uint32_t nonce);

Set the EncKDCRepPart.nonce field.

#### Parameters

handle | shishi handle as allocated by `shishi_init()`. |
enckdcreppart | input EncKDCRepPart variable. |
nonce | nonce to set in EncKDCRepPart. |

#### Returns

Returns `SHISHI_OK` iff successful.

### shishi_enckdcreppart_flags_set ()

    int
    shishi_enckdcreppart_flags_set (Shishi *handle,
                                    Shishi_asn1 enckdcreppart,
                                    int flags);

Set the EncKDCRepPart.flags field.

#### Parameters

handle | shishi handle as allocated by `shishi_init()`. |
enckdcreppart | input EncKDCRepPart variable. |
flags | flags to set in EncKDCRepPart. |

#### Returns

Returns `SHISHI_OK` iff successful.

### shishi_enckdcreppart_authtime_set ()

    int
    shishi_enckdcreppart_authtime_set (Shishi *handle,
                                       Shishi_asn1 enckdcreppart,
                                       const char *authtime);

Set the EncTicketPart.authtime to supplied value.

#### Parameters

handle | shishi handle as allocated by `shishi_init()`. |
enckdcreppart | input EncKDCRepPart variable. |
authtime | character buffer containing a generalized time string. |

#### Returns

Returns `SHISHI_OK` iff successful.

### shishi_enckdcreppart_starttime_set ()

    int
    shishi_enckdcreppart_starttime_set (Shishi *handle,
                                        Shishi_asn1 enckdcreppart,
                                        const char *starttime);

Set the EncTicketPart.starttime to supplied value. Use a NULL value for `starttime` to remove the field.

#### Parameters

handle | shishi handle as allocated by `shishi_init()`. |
enckdcreppart | input EncKDCRepPart variable. |
starttime | character buffer containing a generalized time string. |

#### Returns

Returns `SHISHI_OK` iff successful.

### shishi_enckdcreppart_endtime_set ()

    int
    shishi_enckdcreppart_endtime_set (Shishi *handle,
                                      Shishi_asn1 enckdcreppart,
                                      const char *endtime);

Set the EncTicketPart.endtime to supplied value.

#### Parameters

handle | shishi handle as allocated by `shishi_init()`. |
enckdcreppart | input EncKDCRepPart variable. |
endtime | character buffer containing a generalized time string. |

#### Returns

Returns `SHISHI_OK` iff successful.

### shishi_enckdcreppart_renew_till_set ()

    int
    shishi_enckdcreppart_renew_till_set (Shishi *handle,
                                         Shishi_asn1 enckdcreppart,
                                         const char *renew_till);

Set the EncTicketPart.renew-till to supplied value. Use a NULL value for `renew_till` to remove the field.

#### Parameters

handle | shishi handle as allocated by `shishi_init()`. |
enckdcreppart | input EncKDCRepPart variable. |
renew_till | character buffer containing a generalized time string. |

#### Returns

Returns `SHISHI_OK` iff successful.

### shishi_enckdcreppart_srealm_set ()

    int
    shishi_enckdcreppart_srealm_set (Shishi *handle,
                                     Shishi_asn1 enckdcreppart,
                                     const char *srealm);

Set the server realm field in the EncKDCRepPart.

#### Parameters

handle | shishi handle as allocated by `shishi_init()`. |
enckdcreppart | EncKDCRepPart variable to set realm field in. |
srealm | input array with name of realm. |

#### Returns

Returns SHISHI_OK iff successful.

### shishi_enckdcreppart_sname_set ()

    int
    shishi_enckdcreppart_sname_set (Shishi *handle,
                                    Shishi_asn1 enckdcreppart,
                                    Shishi_name_type name_type,
                                    char *sname[]);

Set the server name field in the EncKDCRepPart.

#### Parameters

handle | shishi handle as allocated by `shishi_init()`. |
enckdcreppart | EncKDCRepPart variable to set server name field in. |
name_type | type of principial, see Shishi_name_type, usually SHISHI_NT_UNKNOWN. |
sname | input array with principal name. |

#### Returns

Returns SHISHI_OK iff successful.

### shishi_enckdcreppart_server_set ()

    int
    shishi_enckdcreppart_server_set (Shishi *handle,
                                     Shishi_asn1 enckdcreppart,
                                     const char *server);

### shishi_enckdcreppart_srealmserver_set ()

    int
    shishi_enckdcreppart_srealmserver_set (Shishi *handle,
                                           Shishi_asn1 enckdcreppart,
                                           const char *srealm,
                                           const char *server);

### shishi_enckdcreppart_populate_encticketpart ()

    int
    shishi_enckdcreppart_populate_encticketpart
                                   (Shishi *handle,
                                    Shishi_asn1 enckdcreppart,
                                    Shishi_asn1 encticketpart);

Set the flags, authtime, starttime, endtime, renew-till and caddr fields of the EncKDCRepPart to the corresponding values in the EncTicketPart.

#### Parameters

handle | shishi handle as allocated by `shishi_init()`. |
enckdcreppart | input EncKDCRepPart variable. |
encticketpart | input EncTicketPart variable. |

#### Returns

Returns `SHISHI_OK` iff successful.

### shishi_krberror ()

    Shishi_asn1
    shishi_krberror (Shishi *handle);

This function creates a new KRB-ERROR, populated with some default values.

#### Parameters

handle | shishi handle as allocated by `shishi_init()`. |

#### Returns

Returns the KRB-ERROR or NULL on failure.

### shishi_krberror_print ()

    int
    shishi_krberror_print (Shishi *handle,
                           FILE *fh,
                           Shishi_asn1 krberror);

Print ASCII armored DER encoding of KRB-ERROR to file.

#### Parameters

handle | shishi handle as allocated by `shishi_init()`. |
fh | file handle open for writing. |
krberror | KRB-ERROR to print. |

#### Returns

Returns SHISHI_OK iff successful.

### shishi_krberror_save ()

    int
    shishi_krberror_save (Shishi *handle,
                          FILE *fh,
                          Shishi_asn1 krberror);

Save DER encoding of KRB-ERROR to file.

#### Parameters

handle | shishi handle as allocated by `shishi_init()`. |
fh | file handle open for writing. |
krberror | KRB-ERROR to save. |

#### Returns

Returns SHISHI_OK iff successful.

### shishi_krberror_to_file ()

    int
    shishi_krberror_to_file (Shishi *handle,
                             Shishi_asn1 krberror,
                             int filetype,
                             const char *filename);

Write KRB-ERROR to file in specified TYPE. The file will be truncated if it exists.

#### Parameters

handle | shishi handle as allocated by `shishi_init()`. |
krberror | KRB-ERROR to save. |
filetype | input variable specifying type of file to be written, see Shishi_filetype. |
filename | input variable with filename to write to. |

#### Returns

Returns SHISHI_OK iff successful.

### shishi_krberror_parse ()

    int
    shishi_krberror_parse (Shishi *handle,
                           FILE *fh,
                           Shishi_asn1 *krberror);

Read ASCII armored DER encoded KRB-ERROR from file and populate given variable.

#### Parameters

handle | shishi handle as allocated by `shishi_init()`. |
fh | file handle open for reading. |
krberror | output variable with newly allocated KRB-ERROR. |

#### Returns

Returns SHISHI_OK iff successful.

### shishi_krberror_read ()

    int
    shishi_krberror_read (Shishi *handle,
                          FILE *fh,
                          Shishi_asn1 *krberror);

Read DER encoded KRB-ERROR from file and populate given variable.

#### Parameters

handle | shishi handle as allocated by `shishi_init()`. |
fh | file handle open for reading. |
krberror | output variable with newly allocated KRB-ERROR. |

#### Returns

Returns SHISHI_OK iff successful.

### shishi_krberror_from_file ()

    int
    shishi_krberror_from_file (Shishi *handle,
                               Shishi_asn1 *krberror,
                               int filetype,
                               const char *filename);

Read KRB-ERROR from file in specified TYPE.

#### Parameters

handle | shishi handle as allocated by `shishi_init()`. |
krberror | output variable with newly allocated KRB-ERROR. |
filetype | input variable specifying type of file to be read, see Shishi_filetype. |
filename | input variable with filename to read from. |

#### Returns

Returns SHISHI_OK iff successful.

### shishi_krberror_build ()

    int
    shishi_krberror_build (Shishi *handle,
                           Shishi_asn1 krberror);

Finish KRB-ERROR, called before e.g. shishi_krberror_der. This function removes empty but OPTIONAL fields (such as cname), and

#### Parameters

handle | shishi handle as allocated by `shishi_init()`. |
krberror | krberror as allocated by `shishi_krberror()`. |

#### Returns

Returns SHISHI_OK iff successful.

### shishi_krberror_der ()

    int
    shishi_krberror_der (Shishi *handle,
                         Shishi_asn1 krberror,
                         char **out,
                         size_t *outlen);

DER encode KRB-ERROR. The caller must deallocate the OUT buffer.

#### Parameters

handle | shishi handle as allocated by `shishi_init()`. |
krberror | krberror as allocated by `shishi_krberror()`. |
out | output array with newly allocated DER encoding of KRB-ERROR. |
outlen | length of output array with DER encoding of KRB-ERROR. |

#### Returns

Returns SHISHI_OK iff successful.

### shishi_krberror_crealm ()

    int
    shishi_krberror_crealm (Shishi *handle,
                            Shishi_asn1 krberror,
                            char **realm,
                            size_t *realmlen);

Extract client realm from KRB-ERROR.

#### Parameters

handle | shishi handle as allocated by `shishi_init()`. |
krberror | krberror as allocated by `shishi_krberror()`. |
realm | output array with newly allocated name of realm in KRB-ERROR. |
realmlen | size of output array. |

#### Returns

Returns SHISHI_OK iff successful.

### shishi_krberror_remove_crealm ()

    int
    shishi_krberror_remove_crealm (Shishi *handle,
                                   Shishi_asn1 krberror);

Remove client realm field in KRB-ERROR.

#### Parameters

handle | shishi handle as allocated by `shishi_init()`. |
krberror | krberror as allocated by `shishi_krberror()`. |

#### Returns

Returns SHISHI_OK iff successful.

### shishi_krberror_set_crealm ()

    int
    shishi_krberror_set_crealm (Shishi *handle,
                                Shishi_asn1 krberror,
                                const char *crealm);

Set realm field in krberror to specified value.

#### Parameters

handle | shishi handle as allocated by `shishi_init()`. |
krberror | krberror as allocated by `shishi_krberror()`. |
crealm | input array with realm. |

#### Returns

Returns SHISHI_OK iff successful.

### shishi_krberror_client ()

    int
    shishi_krberror_client (Shishi *handle,
                            Shishi_asn1 krberror,
                            char **client,
                            size_t *clientlen);

Return client principal name in KRB-ERROR.

#### Parameters

handle | shishi handle as allocated by `shishi_init()`. |
krberror | krberror as allocated by `shishi_krberror()`. |
client | pointer to newly allocated zero terminated string containing principal name. May be `NULL` (to only populate `clientlen` ). |
clientlen | pointer to length of `client` on output, excluding terminating zero. May be `NULL` (to only populate `client` ). |

#### Returns

Returns SHISHI_OK iff successful.

### shishi_krberror_set_cname ()

    int
    shishi_krberror_set_cname (Shishi *handle,
                               Shishi_asn1 krberror,
                               Shishi_name_type name_type,
                               const char *cname[]);

Set principal field in krberror to specified value.

#### Parameters

handle | shishi handle as allocated by `shishi_init()`. |
krberror | krberror as allocated by `shishi_krberror()`. |
name_type | type of principial, see Shishi_name_type, usually SHISHI_NT_UNKNOWN. |
cname | input array with principal name. |

#### Returns

Returns SHISHI_OK iff successful.

### shishi_krberror_remove_cname ()

    int
    shishi_krberror_remove_cname (Shishi *handle,
                                  Shishi_asn1 krberror);

Remove client realm field in KRB-ERROR.

#### Parameters

handle | shishi handle as allocated by `shishi_init()`. |
krberror | krberror as allocated by `shishi_krberror()`. |

#### Returns

Returns SHISHI_OK iff successful.

### shishi_krberror_client_set ()

    int
    shishi_krberror_client_set (Shishi *handle,
                                Shishi_asn1 krberror,
                                const char *client);

Set the client name field in the Krberror.

#### Parameters

handle | shishi handle as allocated by `shishi_init()`. |
krberror | Krberror to set client name field in. |
client | zero-terminated string with principal name on RFC 1964 form. |

#### Returns

Returns SHISHI_OK iff successful.

### shishi_krberror_realm ()

    int
    shishi_krberror_realm (Shishi *handle,
                           Shishi_asn1 krberror,
                           char **realm,
                           size_t *realmlen);

Extract (server) realm from KRB-ERROR.

#### Parameters

handle | shishi handle as allocated by `shishi_init()`. |
krberror | krberror as allocated by `shishi_krberror()`. |
realm | output array with newly allocated name of realm in KRB-ERROR. |
realmlen | size of output array. |

#### Returns

Returns SHISHI_OK iff successful.

### shishi_krberror_set_realm ()

    int
    shishi_krberror_set_realm (Shishi *handle,
                               Shishi_asn1 krberror,
                               const char *realm);

Set (server) realm field in krberror to specified value.

#### Parameters

handle | shishi handle as allocated by `shishi_init()`. |
krberror | krberror as allocated by `shishi_krberror()`. |
realm | input array with (server) realm. |

#### Returns

Returns SHISHI_OK iff successful.

### shishi_krberror_server ()

    int
    shishi_krberror_server (Shishi *handle,
                            Shishi_asn1 krberror,
                            char **server,
                            size_t *serverlen);

Return server principal name in KRB-ERROR.

#### Parameters

handle | shishi handle as allocated by `shishi_init()`. |
krberror | krberror as allocated by `shishi_krberror()`. |
server | pointer to newly allocated zero terminated string containing server name. May be `NULL` (to only populate `serverlen` ). |
serverlen | pointer to length of `server` on output, excluding terminating zero. May be `NULL` (to only populate `server` ). |

#### Returns

Returns SHISHI_OK iff successful.

### shishi_krberror_remove_sname ()

    int
    shishi_krberror_remove_sname (Shishi *handle,
                                  Shishi_asn1 krberror);

Remove server name field in KRB-ERROR. (Since it is not marked OPTIONAL in the ASN.1 profile, what is done is to set the name-type to UNKNOWN and make sure the name-string sequence is empty.)

#### Parameters

handle | shishi handle as allocated by `shishi_init()`. |
krberror | Krberror to set server name field in. |

#### Returns

Returns SHISHI_OK iff successful.

### shishi_krberror_set_sname ()

    int
    shishi_krberror_set_sname (Shishi *handle,
                               Shishi_asn1 krberror,
                               Shishi_name_type name_type,
                               const char *sname[]);

Set principal field in krberror to specified value.

#### Parameters

handle | shishi handle as allocated by `shishi_init()`. |
krberror | krberror as allocated by `shishi_krberror()`. |
name_type | type of principial, see Shishi_name_type, usually SHISHI_NT_UNKNOWN. |
sname | input array with principal name. |

#### Returns

Returns SHISHI_OK iff successful.

### shishi_krberror_server_set ()

    int
    shishi_krberror_server_set (Shishi *handle,
                                Shishi_asn1 krberror,
                                const char *server);

Set the server name field in the Krberror.

#### Parameters

handle | shishi handle as allocated by `shishi_init()`. |
krberror | Krberror to set server name field in. |
server | zero-terminated string with principal name on RFC 1964 form. |

#### Returns

Returns SHISHI_OK iff successful.

### shishi_krberror_ctime ()

    int
    shishi_krberror_ctime (Shishi *handle,
                           Shishi_asn1 krberror,
                           char **t);

Extract client time from KRB-ERROR.

#### Parameters

handle | shishi handle as allocated by `shishi_init()`. |
krberror | Krberror to set client name field in. |
t | newly allocated zero-terminated output array with client time. |

#### Returns

Returns SHISHI_OK iff successful.

### shishi_krberror_ctime_set ()

    int
    shishi_krberror_ctime_set (Shishi *handle,
                               Shishi_asn1 krberror,
                               const char *t);

Store client time in Krberror.

#### Parameters

handle | shishi handle as allocated by `shishi_init()`. |
krberror | Krberror as allocated by `shishi_krberror()`. |
t | string with generalized time value to store in Krberror. |

#### Returns

Returns SHISHI_OK iff successful.

### shishi_krberror_remove_ctime ()

    int
    shishi_krberror_remove_ctime (Shishi *handle,
                                  Shishi_asn1 krberror);

Remove client time field in Krberror.

#### Parameters

handle | shishi handle as allocated by `shishi_init()`. |
krberror | Krberror as allocated by `shishi_krberror()`. |

#### Returns

Returns SHISHI_OK iff successful.

### shishi_krberror_cusec ()

    int
    shishi_krberror_cusec (Shishi *handle,
                           Shishi_asn1 krberror,
                           uint32_t *cusec);

Extract client microseconds field from Krberror.

#### Parameters

handle | shishi handle as allocated by `shishi_init()`. |
krberror | Krberror as allocated by `shishi_krberror()`. |
cusec | output integer with client microseconds field. |

#### Returns

Returns SHISHI_OK iff successful.

### shishi_krberror_cusec_set ()

    int
    shishi_krberror_cusec_set (Shishi *handle,
                               Shishi_asn1 krberror,
                               uint32_t cusec);

Set the cusec field in the Krberror.

#### Parameters

handle | shishi handle as allocated by `shishi_init()`. |
krberror | krberror as allocated by `shishi_krberror()`. |
cusec | client microseconds to set in krberror, 0-999999. |

#### Returns

Returns SHISHI_OK iff successful.

### shishi_krberror_remove_cusec ()

    int
    shishi_krberror_remove_cusec (Shishi *handle,
                                  Shishi_asn1 krberror);

Remove client usec field in Krberror.

#### Parameters

handle | shishi handle as allocated by `shishi_init()`. |
krberror | Krberror as allocated by `shishi_krberror()`. |

#### Returns

Returns SHISHI_OK iff successful.

### shishi_krberror_stime ()

    int
    shishi_krberror_stime (Shishi *handle,
                           Shishi_asn1 krberror,
                           char **t);

Extract server time from KRB-ERROR.

#### Parameters

handle | shishi handle as allocated by `shishi_init()`. |
krberror | Krberror to set client name field in. |
t | newly allocated zero-terminated output array with server time. |

#### Returns

Returns SHISHI_OK iff successful.

### shishi_krberror_stime_set ()

    int
    shishi_krberror_stime_set (Shishi *handle,
                               Shishi_asn1 krberror,
                               const char *t);

Store server time in Krberror.

#### Parameters

handle | shishi handle as allocated by `shishi_init()`. |
krberror | Krberror as allocated by `shishi_krberror()`. |
t | string with generalized time value to store in Krberror. |

#### Returns

Returns SHISHI_OK iff successful.

### shishi_krberror_susec ()

    int
    shishi_krberror_susec (Shishi *handle,
                           Shishi_asn1 krberror,
                           uint32_t *susec);

Extract server microseconds field from Krberror.

#### Parameters

handle | shishi handle as allocated by `shishi_init()`. |
krberror | Krberror as allocated by `shishi_krberror()`. |
susec | output integer with server microseconds field. |

#### Returns

Returns SHISHI_OK iff successful.

### shishi_krberror_susec_set ()

    int
    shishi_krberror_susec_set (Shishi *handle,
                               Shishi_asn1 krberror,
                               uint32_t susec);

Set the susec field in the Krberror.

#### Parameters

handle | shishi handle as allocated by `shishi_init()`. |
krberror | krberror as allocated by `shishi_krberror()`. |
susec | server microseconds to set in krberror, 0-999999. |

#### Returns

Returns SHISHI_OK iff successful.

### shishi_krberror_errorcode_set ()

    int
    shishi_krberror_errorcode_set (Shishi *handle,
                                   Shishi_asn1 krberror,
                                   int errorcode);

Set the error-code field to a new error code.

#### Parameters

handle | shishi handle as allocated by `shishi_init()`. |
krberror | KRB-ERROR structure with error code to set. |
errorcode | new error code to set in krberror. |

#### Returns

Returns SHISHI_OK iff successful.

### shishi_krberror_etext ()

    int
    shishi_krberror_etext (Shishi *handle,
                           Shishi_asn1 krberror,
                           char **etext,
                           size_t *etextlen);

Extract additional error text from server (possibly empty).

#### Parameters

handle | shishi handle as allocated by `shishi_init()`. |
krberror | KRB-ERROR structure with error code. |
etext | output array with newly allocated error text. |
etextlen | output length of error text. |

#### Returns

Returns SHISHI_OK iff successful.

### shishi_krberror_set_etext ()

    int
    shishi_krberror_set_etext (Shishi *handle,
                               Shishi_asn1 krberror,
                               const char *etext);

Set error text (e-text) field in KRB-ERROR to specified value.

#### Parameters

handle | shishi handle as allocated by `shishi_init()`. |
krberror | krberror as allocated by `shishi_krberror()`. |
etext | input array with error text to set. |

#### Returns

Returns SHISHI_OK iff successful.

### shishi_krberror_remove_etext ()

    int
    shishi_krberror_remove_etext (Shishi *handle,
                                  Shishi_asn1 krberror);

Remove error text (e-text) field in KRB-ERROR.

#### Parameters

handle | shishi handle as allocated by `shishi_init()`. |
krberror | krberror as allocated by `shishi_krberror()`. |

#### Returns

Returns SHISHI_OK iff successful.

### shishi_krberror_edata ()

    int
    shishi_krberror_edata (Shishi *handle,
                           Shishi_asn1 krberror,
                           char **edata,
                           size_t *edatalen);

Extract additional error data from server (possibly empty).

#### Parameters

handle | shishi handle as allocated by `shishi_init()`. |
krberror | KRB-ERROR structure with error code. |
edata | output array with newly allocated error data. |
edatalen | output length of error data. |

#### Returns

Returns SHISHI_OK iff successful.

### shishi_krberror_set_edata ()

    int
    shishi_krberror_set_edata (Shishi *handle,
                               Shishi_asn1 krberror,
                               const char *edata);

Set error text (e-data) field in KRB-ERROR to specified value.

#### Parameters

handle | shishi handle as allocated by `shishi_init()`. |
krberror | krberror as allocated by `shishi_krberror()`. |
edata | input array with error text to set. |

#### Returns

Returns SHISHI_OK iff successful.

### shishi_krberror_remove_edata ()

    int
    shishi_krberror_remove_edata (Shishi *handle,
                                  Shishi_asn1 krberror);

Remove error text (e-data) field in KRB-ERROR.

#### Parameters

handle | shishi handle as allocated by `shishi_init()`. |
krberror | krberror as allocated by `shishi_krberror()`. |

#### Returns

Returns SHISHI_OK iff successful.

### shishi_krberror_errorcode ()

    int
    shishi_krberror_errorcode (Shishi *handle,
                               Shishi_asn1 krberror,
                               int *errorcode);

Extract error code from KRB-ERROR.

#### Parameters

handle | shishi handle as allocated by `shishi_init()`. |
krberror | KRB-ERROR structure with error code. |
errorcode | output integer KRB-ERROR error code. |

#### Returns

Returns SHISHI_OK iff successful.

### shishi_krberror_errorcode_fast ()

    int
    shishi_krberror_errorcode_fast (Shishi *handle,
                                    Shishi_asn1 krberror);

Get error code from KRB-ERROR, without error checking.

#### Parameters

handle | shishi handle as allocated by `shishi_init()`. |
krberror | KRB-ERROR structure with error code. |

#### Returns

Return error code (see `shishi_krberror_errorcode()`) directly, or -1 on error.

### shishi_krberror_pretty_print ()

    int
    shishi_krberror_pretty_print (Shishi *handle,
                                  FILE *fh,
                                  Shishi_asn1 krberror);

Print KRB-ERROR error condition and some explanatory text to file descriptor.

#### Parameters

handle | shishi handle as allocated by `shishi_init()`. |
fh | file handle opened for writing. |
krberror | KRB-ERROR structure with error code. |

#### Returns

Returns SHISHI_OK iff successful.

### shishi_krberror_errorcode_message ()

    const char *
    shishi_krberror_errorcode_message (Shishi *handle,
                                       int errorcode);

Get human readable string describing KRB-ERROR code.

#### Parameters

handle | shishi handle as allocated by `shishi_init()`. |
errorcode | integer KRB-ERROR error code. |

#### Returns

Return a string describing error code. This function will always return a string even if the error code isn't known.

### shishi_krberror_message ()

    const char *
    shishi_krberror_message (Shishi *handle,
                             Shishi_asn1 krberror);

Extract error code (see `shishi_krberror_errorcode_fast()`) and return error message (see `shishi_krberror_errorcode_message()`).

#### Parameters

handle | shishi handle as allocated by `shishi_init()`. |
krberror | KRB-ERROR structure with error code. |

#### Returns

Return a string describing error code. This function will always return a string even if the error code isn't known.

### shishi_krberror_methoddata ()

    int
    shishi_krberror_methoddata (Shishi *handle,
                                Shishi_asn1 krberror,
                                Shishi_asn1 *methoddata);

Extract METHOD-DATA ASN.1 object from the e-data field. The e-data field will only contain a METHOD-DATA if the krberror error code is `SHISHI_KDC_ERR_PREAUTH_REQUIRED`.

#### Parameters

handle | shishi handle as allocated by `shishi_init()`. |
krberror | KRB-ERROR structure with error code. |
methoddata | output ASN.1 METHOD-DATA. |

#### Returns

Returns SHISHI_OK iff successful.

### shishi_generalize_time ()

    const char *
    shishi_generalize_time (Shishi *handle,
                            time_t t);

Converts C time `t` to a KerberosTime string representation. The returned string must not be deallocated by the caller.

#### Parameters

handle | Shishi handle as allocated by `shishi_init()`. |
t | C time to convert. |

#### Returns

Returns a KerberosTime formatted string corresponding to the input parameter.

### shishi_generalize_now ()

    const char *
    shishi_generalize_now (Shishi *handle);

Converts the current time to a KerberosTime string. The returned string must not be deallocated by the caller.

#### Parameters

handle | Shishi handle as allocated by `shishi_init()`. |

#### Returns

Returns a KerberosTime formatted string corresponding to the current time.

### shishi_generalize_ctime ()

    time_t
    shishi_generalize_ctime (Shishi *handle,
                             const char *t);

Converts a KerberosTime formatted string in `t` to integral C time representation.

#### Parameters

handle | Shishi handle as allocated by `shishi_init()`. |
t | KerberosTime string to convert. |

#### Returns

Returns the C time corresponding to the input argument.

### shishi_time ()

    int
    shishi_time (Shishi *handle,
                 Shishi_asn1 node,
                 const char *field,
                 char **t);

Extracts time information from an ASN.1 structure, and to be precise, does so from the named field `field` within the structure `node` .

#### Parameters

handle | Shishi handle as allocated by `shishi_init()`. |
node | ASN.1 structure to get time from. |
field | Name of the field in the ASN.1 node carrying time. |
t | Returned pointer to an allocated char array containing a null-terminated time string. |

#### Returns

Returns `SHISHI_OK` if successful, or an error.

### shishi_ctime ()

    int
    shishi_ctime (Shishi *handle,
                  Shishi_asn1 node,
                  const char *field,
                  time_t *t);

Extracts time information from an ASN.1 structure `node` , and from an arbitrary element `field` of that structure.

#### Parameters

handle | Shishi handle as allocated by `shishi_init()`. |
node | ASN.1 structure to read field from. |
field | Name of field in `node` to read. |
t | Pointer to a C-time valued integer, being updated with the time value to be extracted. |

#### Returns

Returns `SHISHI_OK` if successful, `SHISHI_ASN1_NO_ELEMENT` if the element does not exist, `SHISHI_ASN1_NO_VALUE` if the field has no value. In all other cases, `SHISHI_ASN1_ERROR` is returned.

### shishi_randomize ()

    int
    shishi_randomize (Shishi *handle,
                      int strong,
                      void *data,
                      size_t datalen);

Store cryptographically random data of given size in the provided buffer.

#### Parameters

handle | shishi handle as allocated by `shishi_init()`. |
strong | 0 iff operation should not block, non-0 for very strong randomness. |
data | output array to be filled with random data. |
datalen | size of output array. |

#### Returns

Returns `SHISHI_OK` iff successful.

### shishi_crc ()

    int
    shishi_crc (Shishi *handle,
                const char *in,
                size_t inlen,
                char *out[4]);

Compute checksum of data using CRC32 modified according to RFC

1. The `out` buffer must be deallocated by the caller.

The modifications compared to standard CRC32 is that no initial and final XOR is performed, and that the output is returned in LSB-first order.

#### Parameters

handle | shishi handle as allocated by `shishi_init()`. |
in | input character array of data to checksum. |
inlen | length of input character array of data to checksum. |
out | newly allocated character array with checksum of data. |

#### Returns

Returns SHISHI_OK iff successful.

### shishi_md4 ()

    int
    shishi_md4 (Shishi *handle,
                const char *in,
                size_t inlen,
                char *out[16]);

Compute hash of data using MD4. The `out` buffer must be deallocated by the caller.

#### Parameters

handle | shishi handle as allocated by `shishi_init()`. |
in | input character array of data to hash. |
inlen | length of input character array of data to hash. |
out | newly allocated character array with hash of data. |

#### Returns

Returns SHISHI_OK iff successful.

### shishi_md5 ()

    int
    shishi_md5 (Shishi *handle,
                const char *in,
                size_t inlen,
                char *out[16]);

Compute hash of data using MD5. The `out` buffer must be deallocated by the caller.

#### Parameters

handle | shishi handle as allocated by `shishi_init()`. |
in | input character array of data to hash. |
inlen | length of input character array of data to hash. |
out | newly allocated character array with hash of data. |

#### Returns

Returns SHISHI_OK iff successful.

### shishi_hmac_md5 ()

    int
    shishi_hmac_md5 (Shishi *handle,
                     const char *key,
                     size_t keylen,
                     const char *in,
                     size_t inlen,
                     char *outhash[16]);

Compute keyed checksum of data using HMAC-MD5. The `outhash` buffer must be deallocated by the caller.

#### Parameters

handle | shishi handle as allocated by `shishi_init()`. |
key | input character array with key to use. |
keylen | length of input character array with key to use. |
in | input character array of data to hash. |
inlen | length of input character array of data to hash. |
outhash | newly allocated character array with keyed hash of data. |

#### Returns

Returns SHISHI_OK iff successful.

### shishi_hmac_sha1 ()

    int
    shishi_hmac_sha1 (Shishi *handle,
                      const char *key,
                      size_t keylen,
                      const char *in,
                      size_t inlen,
                      char *outhash[20]);

Compute keyed checksum of data using HMAC-SHA1. The `outhash` buffer must be deallocated by the caller.

#### Parameters

handle | shishi handle as allocated by `shishi_init()`. |
key | input character array with key to use. |
keylen | length of input character array with key to use. |
in | input character array of data to hash. |
inlen | length of input character array of data to hash. |
outhash | newly allocated character array with keyed hash of data. |

#### Returns

Returns SHISHI_OK iff successful.

### shishi_des_cbc_mac ()

    int
    shishi_des_cbc_mac (Shishi *handle,
                        const char key[8],
                        const char iv[8],
                        const char *in,
                        size_t inlen,
                        char *out[8]);

Computed keyed checksum of data using DES-CBC-MAC. The `out` buffer must be deallocated by the caller.

#### Parameters

handle | shishi handle as allocated by `shishi_init()`. |
key | input character array with key to use. |
iv | input character array with initialization vector to use, can be NULL. |
in | input character array of data to hash. |
inlen | length of input character array of data to hash. |
out | newly allocated character array with keyed hash of data. |

#### Returns

Returns SHISHI_OK iff successful.

### shishi_arcfour ()

    int
    shishi_arcfour (Shishi *handle,
                    int decryptp,
                    const char *key,
                    size_t keylen,
                    const char iv[258],
                    char *ivout[258],
                    const char *in,
                    size_t inlen,
                    char **out);

Encrypt or decrypt data (depending on `decryptp` ) using ARCFOUR. The `out` buffer must be deallocated by the caller.

The "initialization vector" used here is the concatenation of the sbox and i and j, and is thus always of size 256 + 1 + 1. This is a slight abuse of terminology, and assumes you know what you are doing. Don't use it if you can avoid to.

#### Parameters

handle | shishi handle as allocated by `shishi_init()`. |
decryptp | 0 to indicate encryption, non-0 to indicate decryption. |
key | input character array with key to use. |
keylen | length of input key array. |
iv | input character array with initialization vector to use, or NULL. |
ivout | output character array with updated initialization vector, or NULL. |
in | input character array of data to encrypt/decrypt. |
inlen | length of input character array of data to encrypt/decrypt. |
out | newly allocated character array with encrypted/decrypted data. |

#### Returns

Returns SHISHI_OK iff successful.

### shishi_des ()

    int
    shishi_des (Shishi *handle,
                int decryptp,
                const char key[8],
                const char iv[8],
                char *ivout[8],
                const char *in,
                size_t inlen,
                char **out);

Encrypt or decrypt data (depending on `decryptp` ) using DES in CBC mode. The `out` buffer must be deallocated by the caller.

#### Parameters

handle | shishi handle as allocated by `shishi_init()`. |
decryptp | 0 to indicate encryption, non-0 to indicate decryption. |
key | input character array with key to use. |
iv | input character array with initialization vector to use, or NULL. |
ivout | output character array with updated initialization vector, or NULL. |
in | input character array of data to encrypt/decrypt. |
inlen | length of input character array of data to encrypt/decrypt. |
out | newly allocated character array with encrypted/decrypted data. |

#### Returns

Returns SHISHI_OK iff successful.

### shishi_3des ()

    int
    shishi_3des (Shishi *handle,
                 int decryptp,
                 const char key[24],
                 const char iv[8],
                 char *ivout[8],
                 const char *in,
                 size_t inlen,
                 char **out);

Encrypt or decrypt data (depending on `decryptp` ) using 3DES in CBC mode. The `out` buffer must be deallocated by the caller.

#### Parameters

handle | shishi handle as allocated by `shishi_init()`. |
decryptp | 0 to indicate encryption, non-0 to indicate decryption. |
key | input character array with key to use. |
iv | input character array with initialization vector to use, or NULL. |
ivout | output character array with updated initialization vector, or NULL. |
in | input character array of data to encrypt/decrypt. |
inlen | length of input character array of data to encrypt/decrypt. |
out | newly allocated character array with encrypted/decrypted data. |

#### Returns

Returns SHISHI_OK iff successful.

### shishi_aes_cts ()

    int
    shishi_aes_cts (Shishi *handle,
                    int decryptp,
                    const char *key,
                    size_t keylen,
                    const char iv[16],
                    char *ivout[16],
                    const char *in,
                    size_t inlen,
                    char **out);

Encrypt or decrypt data (depending on `decryptp` ) using AES in CBC-CTS mode. The length of the key, `keylen` , decide if AES 128 or AES 256 should be used. The `out` buffer must be deallocated by the caller.

#### Parameters

handle | shishi handle as allocated by `shishi_init()`. |
decryptp | 0 to indicate encryption, non-0 to indicate decryption. |
key | input character array with key to use. |
keylen | length of input character array with key to use. |
iv | input character array with initialization vector to use, or NULL. |
ivout | output character array with updated initialization vector, or NULL. |
in | input character array of data to encrypt/decrypt. |
inlen | length of input character array of data to encrypt/decrypt. |
out | newly allocated character array with encrypted/decrypted data. |

#### Returns

Returns SHISHI_OK iff successful.

### shishi_cipher_supported_p ()

    int
    shishi_cipher_supported_p (int type);

Find out if cipher is supported.

#### Parameters

type | encryption type, see Shishi_etype. |

#### Returns

Return 0 iff cipher is unsupported.

### shishi_cipher_name ()

    const char *
    shishi_cipher_name (int type);

Read humanly readable string for cipher.

#### Parameters

type | encryption type, see Shishi_etype. |

#### Returns

Return name of encryption type, e.g. "des3-cbc-sha1-kd", as defined in the standards.

### shishi_cipher_blocksize ()

    int
    shishi_cipher_blocksize (int type);

Get block size for cipher.

#### Parameters

type | encryption type, see Shishi_etype. |

#### Returns

Return block size for encryption type, as defined in the standards.

### shishi_cipher_confoundersize ()

    int
    shishi_cipher_confoundersize (int type);

Get length of confounder for cipher.

#### Parameters

type | encryption type, see Shishi_etype. |

#### Returns

Returns the size of the confounder (random data) for encryption type, as defined in the standards, or (size_t)-1 on error (e.g., unsupported encryption type).

### shishi_cipher_keylen ()

    size_t
    shishi_cipher_keylen (int type);

Get key length for cipher.

#### Parameters

type | encryption type, see Shishi_etype. |

#### Returns

Return length of key used for the encryption type, as defined in the standards.

### shishi_cipher_randomlen ()

    size_t
    shishi_cipher_randomlen (int type);

Get length of random data for cipher.

#### Parameters

type | encryption type, see Shishi_etype. |

#### Returns

Return length of random used for the encryption type, as defined in the standards, or (size_t)-1 on error (e.g., unsupported encryption type).

### shishi_cipher_defaultcksumtype ()

    int
    shishi_cipher_defaultcksumtype (int32_t type);

Get the default checksum associated with cipher.

#### Parameters

type | encryption type, see Shishi_etype. |

#### Returns

Return associated checksum mechanism for the encryption type, as defined in the standards.

### shishi_cipher_parse ()

    int
    shishi_cipher_parse (const char *cipher);

Get cipher number by parsing string.

#### Parameters

cipher | name of encryption type, e.g. "des3-cbc-sha1-kd". |

#### Returns

Return encryption type corresponding to a string.

### shishi_checksum_supported_p ()

    int
    shishi_checksum_supported_p (int32_t type);

Find out whether checksum is supported.

#### Parameters

type | checksum type, see Shishi_cksumtype. |

#### Returns

Return 0 iff checksum is unsupported.

### shishi_checksum_name ()

    const char *
    shishi_checksum_name (int32_t type);

Get name of checksum.

#### Parameters

type | checksum type, see Shishi_cksumtype. |

#### Returns

Return name of checksum type, e.g. "hmac-sha1-96-aes256", as defined in the standards.

### shishi_checksum_cksumlen ()

    size_t
    shishi_checksum_cksumlen (int32_t type);

Get length of checksum output.

#### Parameters

type | checksum type, see Shishi_cksumtype. |

#### Returns

Return length of checksum used for the checksum type, as defined in the standards.

### shishi_checksum_parse ()

    int
    shishi_checksum_parse (const char *checksum);

Get checksum number by parsing a string.

#### Parameters

checksum | name of checksum type, e.g. "hmac-sha1-96-aes256". |

#### Returns

Return checksum type, see Shishi_cksumtype, corresponding to a string.

### shishi_string_to_key ()

    int
    shishi_string_to_key (Shishi *handle,
                          int32_t keytype,
                          const char *password,
                          size_t passwordlen,
                          const char *salt,
                          size_t saltlen,
                          const char *parameter,
                          Shishi_key *outkey);

Derive key from a string (password) and salt (commonly concatenation of realm and principal) for specified key type, and set the type and value in the given key to the computed values. The parameter value is specific for each keytype, and can be set if the parameter information is not available.

#### Parameters

handle | shishi handle as allocated by `shishi_init()`. |
keytype | cryptographic encryption type, see Shishi_etype. |
password | input array with password. |
passwordlen | length of input array with password. |
salt | input array with salt. |
saltlen | length of input array with salt. |
parameter | input array with opaque encryption type specific information. |
outkey | allocated key handle that will contain new key. |

#### Returns

Returns `SHISHI_OK` iff successful.

### shishi_random_to_key ()

    int
    shishi_random_to_key (Shishi *handle,
                          int32_t keytype,
                          const char *rnd,
                          size_t rndlen,
                          Shishi_key *outkey);

Derive key from random data for specified key type, and set the type and value in the given key to the computed values.

#### Parameters

handle | shishi handle as allocated by `shishi_init()`. |
keytype | cryptographic encryption type, see Shishi_etype. |
rnd | input array with random data. |
rndlen | length of input array with random data. |
outkey | allocated key handle that will contain new key. |

#### Returns

Returns `SHISHI_OK` iff successful.

### shishi_encrypt_ivupdate_etype ()

    int
    shishi_encrypt_ivupdate_etype (Shishi *handle,
                                   Shishi_key *key,
                                   int keyusage,
                                   int32_t etype,
                                   const char *iv,
                                   size_t ivlen,
                                   char **ivout,
                                   size_t *ivoutlen,
                                   const char *in,
                                   size_t inlen,
                                   char **out,
                                   size_t *outlen);

Encrypts data as per encryption method using specified initialization vector and key. The key actually used is derived using the key usage. If key usage is 0, no key derivation is used. The OUT buffer must be deallocated by the caller. If IVOUT or IVOUTLEN is NULL, the updated IV is not saved anywhere.

Note that DECRYPT(ENCRYPT(data)) does not necessarily yield data exactly. Some encryption types add pad to make the data fit into the block size of the encryption algorithm. Furthermore, the pad is not guaranteed to look in any special way, although existing implementations often pad with the zero byte. This means that you may have to "frame" data, so it is possible to infer the original length after decryption. Compare ASN.1 DER which contains such information.

#### Parameters

handle | shishi handle as allocated by `shishi_init()`. |
key | key to encrypt with. |
keyusage | integer specifying what this key is encrypting. |
etype | integer specifying what cipher to use. |
iv | input array with initialization vector |
ivlen | size of input array with initialization vector. |
ivout | output array with newly allocated updated initialization vector. |
ivoutlen | size of output array with updated initialization vector. |
in | input array with data to encrypt. |
inlen | size of input array with data to encrypt. |
out | output array with newly allocated encrypted data. |
outlen | output variable with size of newly allocated output array. |

#### Returns

Returns `SHISHI_OK` iff successful.

### shishi_encrypt_iv_etype ()

    int
    shishi_encrypt_iv_etype (Shishi *handle,
                             Shishi_key *key,
                             int keyusage,
                             int32_t etype,
                             const char *iv,
                             size_t ivlen,
                             const char *in,
                             size_t inlen,
                             char **out,
                             size_t *outlen);

Encrypts data as per encryption method using specified initialization vector and key. The key actually used is derived using the key usage. If key usage is 0, no key derivation is used. The OUT buffer must be deallocated by the caller. The next IV is lost, see shishi_encrypt_ivupdate_etype if you need it.

Note that DECRYPT(ENCRYPT(data)) does not necessarily yield data exactly. Some encryption types add pad to make the data fit into the block size of the encryption algorithm. Furthermore, the pad is not guaranteed to look in any special way, although existing implementations often pad with the zero byte. This means that you may have to "frame" data, so it is possible to infer the original length after decryption. Compare ASN.1 DER which contains such information.

#### Parameters

handle | shishi handle as allocated by `shishi_init()`. |
key | key to encrypt with. |
keyusage | integer specifying what this key is encrypting. |
etype | integer specifying what cipher to use. |
iv | input array with initialization vector |
ivlen | size of input array with initialization vector. |
in | input array with data to encrypt. |
inlen | size of input array with data to encrypt. |
out | output array with newly allocated encrypted data. |
outlen | output variable with size of newly allocated output array. |

#### Returns

Returns `SHISHI_OK` iff successful.

### shishi_encrypt_etype ()

    int
    shishi_encrypt_etype (Shishi *handle,
                          Shishi_key *key,
                          int keyusage,
                          int32_t etype,
                          const char *in,
                          size_t inlen,
                          char **out,
                          size_t *outlen);

Encrypts data as per encryption method using specified initialization vector and key. The key actually used is derived using the key usage. If key usage is 0, no key derivation is used. The OUT buffer must be deallocated by the caller. The default IV is used, see shishi_encrypt_iv_etype if you need to alter it. The next IV is lost, see shishi_encrypt_ivupdate_etype if you need it.

Note that DECRYPT(ENCRYPT(data)) does not necessarily yield data exactly. Some encryption types add pad to make the data fit into the block size of the encryption algorithm. Furthermore, the pad is not guaranteed to look in any special way, although existing implementations often pad with the zero byte. This means that you may have to "frame" data, so it is possible to infer the original length after decryption. Compare ASN.1 DER which contains such information.

#### Parameters

handle | shishi handle as allocated by `shishi_init()`. |
key | key to encrypt with. |
keyusage | integer specifying what this key is encrypting. |
etype | integer specifying what cipher to use. |
in | input array with data to encrypt. |
inlen | size of input array with data to encrypt. |
out | output array with newly allocated encrypted data. |
outlen | output variable with size of newly allocated output array. |

#### Returns

Returns `SHISHI_OK` iff successful.

### shishi_encrypt_ivupdate ()

    int
    shishi_encrypt_ivupdate (Shishi *handle,
                             Shishi_key *key,
                             int keyusage,
                             const char *iv,
                             size_t ivlen,
                             char **ivout,
                             size_t *ivoutlen,
                             const char *in,
                             size_t inlen,
                             char **out,
                             size_t *outlen);

Encrypts data using specified initialization vector and key. The key actually used is derived using the key usage. If key usage is 0, no key derivation is used. The OUT buffer must be deallocated by the caller. If IVOUT or IVOUTLEN is NULL, the updated IV is not saved anywhere.

Note that DECRYPT(ENCRYPT(data)) does not necessarily yield data exactly. Some encryption types add pad to make the data fit into the block size of the encryption algorithm. Furthermore, the pad is not guaranteed to look in any special way, although existing implementations often pad with the zero byte. This means that you may have to "frame" data, so it is possible to infer the original length after decryption. Compare ASN.1 DER which contains such information.

#### Parameters

handle | shishi handle as allocated by `shishi_init()`. |
key | key to encrypt with. |
keyusage | integer specifying what this key is encrypting. |
iv | input array with initialization vector |
ivlen | size of input array with initialization vector. |
ivout | output array with newly allocated updated initialization vector. |
ivoutlen | size of output array with updated initialization vector. |
in | input array with data to encrypt. |
inlen | size of input array with data to encrypt. |
out | output array with newly allocated encrypted data. |
outlen | output variable with size of newly allocated output array. |

#### Returns

Returns `SHISHI_OK` iff successful.

### shishi_encrypt_iv ()

    int
    shishi_encrypt_iv (Shishi *handle,
                       Shishi_key *key,
                       int keyusage,
                       const char *iv,
                       size_t ivlen,
                       const char *in,
                       size_t inlen,
                       char **out,
                       size_t *outlen);

Encrypts data using specified initialization vector and key. The key actually used is derived using the key usage. If key usage is 0, no key derivation is used. The OUT buffer must be deallocated by the caller. The next IV is lost, see shishi_encrypt_ivupdate if you need it.

Note that DECRYPT(ENCRYPT(data)) does not necessarily yield data exactly. Some encryption types add pad to make the data fit into the block size of the encryption algorithm. Furthermore, the pad is not guaranteed to look in any special way, although existing implementations often pad with the zero byte. This means that you may have to "frame" data, so it is possible to infer the original length after decryption. Compare ASN.1 DER which contains such information.

#### Parameters

handle | shishi handle as allocated by `shishi_init()`. |
key | key to encrypt with. |
keyusage | integer specifying what this key is encrypting. |
iv | input array with initialization vector |
ivlen | size of input array with initialization vector. |
in | input array with data to encrypt. |
inlen | size of input array with data to encrypt. |
out | output array with newly allocated encrypted data. |
outlen | output variable with size of newly allocated output array. |

#### Returns

Returns `SHISHI_OK` iff successful.

### shishi_encrypt ()

    int
    shishi_encrypt (Shishi *handle,
                    Shishi_key *key,
                    int keyusage,
                    char *in,
                    size_t inlen,
                    char **out,
                    size_t *outlen);

Encrypts data using specified key. The key actually used is derived using the key usage. If key usage is 0, no key derivation is used. The OUT buffer must be deallocated by the caller. The default IV is used, see shishi_encrypt_iv if you need to alter it. The next IV is lost, see shishi_encrypt_ivupdate if you need it.

Note that DECRYPT(ENCRYPT(data)) does not necessarily yield data exactly. Some encryption types add pad to make the data fit into the block size of the encryption algorithm. Furthermore, the pad is not guaranteed to look in any special way, although existing implementations often pad with the zero byte. This means that you may have to "frame" data, so it is possible to infer the original length after decryption. Compare ASN.1 DER which contains such information.

#### Parameters

handle | shishi handle as allocated by `shishi_init()`. |
key | key to encrypt with. |
keyusage | integer specifying what this key is encrypting. |
in | input array with data to encrypt. |
inlen | size of input array with data to encrypt. |
out | output array with newly allocated encrypted data. |
outlen | output variable with size of newly allocated output array. |

#### Returns

Returns `SHISHI_OK` iff successful.

### shishi_decrypt_ivupdate_etype ()

    int
    shishi_decrypt_ivupdate_etype (Shishi *handle,
                                   Shishi_key *key,
                                   int keyusage,
                                   int32_t etype,
                                   const char *iv,
                                   size_t ivlen,
                                   char **ivout,
                                   size_t *ivoutlen,
                                   const char *in,
                                   size_t inlen,
                                   char **out,
                                   size_t *outlen);

Decrypts data as per encryption method using specified initialization vector and key. The key actually used is derived using the key usage. If key usage is 0, no key derivation is used. The OUT buffer must be deallocated by the caller. If IVOUT or IVOUTLEN is NULL, the updated IV is not saved anywhere.

Note that DECRYPT(ENCRYPT(data)) does not necessarily yield data exactly. Some encryption types add pad to make the data fit into the block size of the encryption algorithm. Furthermore, the pad is not guaranteed to look in any special way, although existing implementations often pad with the zero byte. This means that you may have to "frame" data, so it is possible to infer the original length after decryption. Compare ASN.1 DER which contains such information.

#### Parameters

handle | shishi handle as allocated by `shishi_init()`. |
key | key to decrypt with. |
keyusage | integer specifying what this key is decrypting. |
etype | integer specifying what cipher to use. |
iv | input array with initialization vector |
ivlen | size of input array with initialization vector. |
ivout | output array with newly allocated updated initialization vector. |
ivoutlen | size of output array with updated initialization vector. |
in | input array with data to decrypt. |
inlen | size of input array with data to decrypt. |
out | output array with newly allocated decrypted data. |
outlen | output variable with size of newly allocated output array. |

#### Returns

Returns `SHISHI_OK` iff successful.

### shishi_decrypt_iv_etype ()

    int
    shishi_decrypt_iv_etype (Shishi *handle,
                             Shishi_key *key,
                             int keyusage,
                             int32_t etype,
                             const char *iv,
                             size_t ivlen,
                             const char *in,
                             size_t inlen,
                             char **out,
                             size_t *outlen);

Decrypts data as per encryption method using specified initialization vector and key. The key actually used is derived using the key usage. If key usage is 0, no key derivation is used. The OUT buffer must be deallocated by the caller. The next IV is lost, see shishi_decrypt_ivupdate_etype if you need it.

Note that DECRYPT(ENCRYPT(data)) does not necessarily yield data exactly. Some encryption types add pad to make the data fit into the block size of the encryption algorithm. Furthermore, the pad is not guaranteed to look in any special way, although existing implementations often pad with the zero byte. This means that you may have to "frame" data, so it is possible to infer the original length after decryption. Compare ASN.1 DER which contains such information.

#### Parameters

handle | shishi handle as allocated by `shishi_init()`. |
key | key to decrypt with. |
keyusage | integer specifying what this key is decrypting. |
etype | integer specifying what cipher to use. |
iv | input array with initialization vector |
ivlen | size of input array with initialization vector. |
in | input array with data to decrypt. |
inlen | size of input array with data to decrypt. |
out | output array with newly allocated decrypted data. |
outlen | output variable with size of newly allocated output array. |

#### Returns

Returns `SHISHI_OK` iff successful.

### shishi_decrypt_etype ()

    int
    shishi_decrypt_etype (Shishi *handle,
                          Shishi_key *key,
                          int keyusage,
                          int32_t etype,
                          const char *in,
                          size_t inlen,
                          char **out,
                          size_t *outlen);

Decrypts data as per encryption method using specified key. The key actually used is derived using the key usage. If key usage is 0, no key derivation is used. The OUT buffer must be deallocated by the caller. The default IV is used, see shishi_decrypt_iv_etype if you need to alter it. The next IV is lost, see shishi_decrypt_ivupdate_etype if you need it.

Note that DECRYPT(ENCRYPT(data)) does not necessarily yield data exactly. Some encryption types add pad to make the data fit into the block size of the encryption algorithm. Furthermore, the pad is not guaranteed to look in any special way, although existing implementations often pad with the zero byte. This means that you may have to "frame" data, so it is possible to infer the original length after decryption. Compare ASN.1 DER which contains such information.

#### Parameters

handle | shishi handle as allocated by `shishi_init()`. |
key | key to decrypt with. |
keyusage | integer specifying what this key is decrypting. |
etype | integer specifying what cipher to use. |
in | input array with data to decrypt. |
inlen | size of input array with data to decrypt. |
out | output array with newly allocated decrypted data. |
outlen | output variable with size of newly allocated output array. |

#### Returns

Returns `SHISHI_OK` iff successful.

### shishi_decrypt_ivupdate ()

    int
    shishi_decrypt_ivupdate (Shishi *handle,
                             Shishi_key *key,
                             int keyusage,
                             const char *iv,
                             size_t ivlen,
                             char **ivout,
                             size_t *ivoutlen,
                             const char *in,
                             size_t inlen,
                             char **out,
                             size_t *outlen);

Decrypts data using specified initialization vector and key. The key actually used is derived using the key usage. If key usage is 0, no key derivation is used. The OUT buffer must be deallocated by the caller. If IVOUT or IVOUTLEN is NULL, the updated IV is not saved anywhere.

Note that DECRYPT(ENCRYPT(data)) does not necessarily yield data exactly. Some encryption types add pad to make the data fit into the block size of the encryption algorithm. Furthermore, the pad is not guaranteed to look in any special way, although existing implementations often pad with the zero byte. This means that you may have to "frame" data, so it is possible to infer the original length after decryption. Compare ASN.1 DER which contains such information.

#### Parameters

handle | shishi handle as allocated by `shishi_init()`. |
key | key to decrypt with. |
keyusage | integer specifying what this key is decrypting. |
iv | input array with initialization vector |
ivlen | size of input array with initialization vector. |
ivout | output array with newly allocated updated initialization vector. |
ivoutlen | size of output array with updated initialization vector. |
in | input array with data to decrypt. |
inlen | size of input array with data to decrypt. |
out | output array with newly allocated decrypted data. |
outlen | output variable with size of newly allocated output array. |

#### Returns

Returns `SHISHI_OK` iff successful.

### shishi_decrypt_iv ()

    int
    shishi_decrypt_iv (Shishi *handle,
                       Shishi_key *key,
                       int keyusage,
                       const char *iv,
                       size_t ivlen,
                       const char *in,
                       size_t inlen,
                       char **out,
                       size_t *outlen);

Decrypts data using specified initialization vector and key. The key actually used is derived using the key usage. If key usage is 0, no key derivation is used. The OUT buffer must be deallocated by the caller. The next IV is lost, see shishi_decrypt_ivupdate_etype if you need it.

Note that DECRYPT(ENCRYPT(data)) does not necessarily yield data exactly. Some encryption types add pad to make the data fit into the block size of the encryption algorithm. Furthermore, the pad is not guaranteed to look in any special way, although existing implementations often pad with the zero byte. This means that you may have to "frame" data, so it is possible to infer the original length after decryption. Compare ASN.1 DER which contains such information.

#### Parameters

handle | shishi handle as allocated by `shishi_init()`. |
key | key to decrypt with. |
keyusage | integer specifying what this key is decrypting. |
iv | input array with initialization vector |
ivlen | size of input array with initialization vector. |
in | input array with data to decrypt. |
inlen | size of input array with data to decrypt. |
out | output array with newly allocated decrypted data. |
outlen | output variable with size of newly allocated output array. |

#### Returns

Returns `SHISHI_OK` iff successful.

### shishi_decrypt ()

    int
    shishi_decrypt (Shishi *handle,
                    Shishi_key *key,
                    int keyusage,
                    const char *in,
                    size_t inlen,
                    char **out,
                    size_t *outlen);

Decrypts data specified key. The key actually used is derived using the key usage. If key usage is 0, no key derivation is used. The OUT buffer must be deallocated by the caller. The default IV is used, see shishi_decrypt_iv if you need to alter it. The next IV is lost, see shishi_decrypt_ivupdate if you need it.

Note that DECRYPT(ENCRYPT(data)) does not necessarily yield data exactly. Some encryption types add pad to make the data fit into the block size of the encryption algorithm. Furthermore, the pad is not guaranteed to look in any special way, although existing implementations often pad with the zero byte. This means that you may have to "frame" data, so it is possible to infer the original length after decryption. Compare ASN.1 DER which contains such information.

#### Parameters

handle | shishi handle as allocated by `shishi_init()`. |
key | key to decrypt with. |
keyusage | integer specifying what this key is decrypting. |
in | input array with data to decrypt. |
inlen | size of input array with data to decrypt. |
out | output array with newly allocated decrypted data. |
outlen | output variable with size of newly allocated output array. |

#### Returns

Returns `SHISHI_OK` iff successful.

### shishi_checksum ()

    int
    shishi_checksum (Shishi *handle,
                     Shishi_key *key,
                     int keyusage,
                     int32_t cksumtype,
                     const char *in,
                     size_t inlen,
                     char **out,
                     size_t *outlen);

Integrity protect data using key, possibly altered by supplied key usage. If key usage is 0, no key derivation is used. The OUT buffer must be deallocated by the caller.

#### Parameters

handle | shishi handle as allocated by `shishi_init()`. |
key | key to compute checksum with. |
keyusage | integer specifying what this key is used for. |
cksumtype | the checksum algorithm to use. |
in | input array with data to integrity protect. |
inlen | size of input array with data to integrity protect. |
out | output array with newly allocated integrity protected data. |
outlen | output variable with length of output array with checksum. |

#### Returns

Returns `SHISHI_OK` iff successful.

### shishi_verify ()

    int
    shishi_verify (Shishi *handle,
                   Shishi_key *key,
                   int keyusage,
                   int cksumtype,
                   const char *in,
                   size_t inlen,
                   const char *cksum,
                   size_t cksumlen);

Verify checksum of data using key, possibly altered by supplied key usage. If key usage is 0, no key derivation is used.

#### Parameters

handle | shishi handle as allocated by `shishi_init()`. |
key | key to verify checksum with. |
keyusage | integer specifying what this key is used for. |
cksumtype | the checksum algorithm to use. |
in | input array with data that was integrity protected. |
inlen | size of input array with data that was integrity protected. |
cksum | input array with alleged checksum of data. |
cksumlen | size of input array with alleged checksum of data. |

#### Returns

Returns `SHISHI_OK` iff successful.

### shishi_dk ()

    int
    shishi_dk (Shishi *handle,
               Shishi_key *key,
               const char *prfconstant,
               size_t prfconstantlen,
               Shishi_key *derivedkey);

Derive a key from a key and a constant thusly: DK(KEY, PRFCONSTANT) = SHISHI_RANDOM-TO-KEY(SHISHI_DR(KEY, PRFCONSTANT)).

#### Parameters

handle | shishi handle as allocated by `shishi_init()`. |
key | input cryptographic key to use. |
prfconstant | input array with the constant string. |
prfconstantlen | size of input array with the constant string. |
derivedkey | pointer to derived key (allocated by caller). |

#### Returns

Returns `SHISHI_OK` iff successful.

### shishi_dr ()

    int
    shishi_dr (Shishi *handle,
               Shishi_key *key,
               const char *prfconstant,
               size_t prfconstantlen,
               char *derivedrandom,
               size_t derivedrandomlen);

Derive "random" data from a key and a constant thusly: DR(KEY, PRFCONSTANT) = TRUNCATE(DERIVEDRANDOMLEN, SHISHI_ENCRYPT(KEY, PRFCONSTANT)).

#### Parameters

handle | shishi handle as allocated by `shishi_init()`. |
key | input array with cryptographic key to use. |
prfconstant | input array with the constant string. |
prfconstantlen | size of input array with the constant string. |
derivedrandom | output array with derived random data. |
derivedrandomlen | size of output array with derived random data. |

#### Returns

Returns `SHISHI_OK` iff successful.

### shishi_n_fold ()

    int
    shishi_n_fold (Shishi *handle,
                   const char *in,
                   size_t inlen,
                   char *out,
                   size_t outlen);

Fold data into a fixed length output array, with the intent to give each input bit approximately equal weight in determining the value of each output bit.

The algorithm is from "A Better Key Schedule For DES-like Ciphers" by Uri Blumenthal and Steven M. Bellovin, http://www.research.att.com/~smb/papers/ides.pdf, although the sample vectors provided by the paper are incorrect.

#### Parameters

handle | shishi handle as allocated by `shishi_init()`. |
in | input array with data to decrypt. |
inlen | size of input array with data to decrypt ("M"). |
out | output array with decrypted data. |
outlen | size of output array ("N"). |

#### Returns

Returns `SHISHI_OK` iff successful.

### shishi_pbkdf2_sha1 ()

    int
    shishi_pbkdf2_sha1 (Shishi *handle,
                        const char *P,
                        size_t Plen,
                        const char *S,
                        size_t Slen,
                        unsigned int c,
                        unsigned int dkLen,
                        char *DK);

Derive key using the PBKDF2 defined in PKCS5. PBKDF2 applies a pseudorandom function to derive keys. The length of the derived key is essentially unbounded. (However, the maximum effective search space for the derived key may be limited by the structure of the underlying pseudorandom function, which is this function is always SHA1.)

#### Parameters

handle | shishi handle as allocated by `shishi_init()`. |
P | input password, an octet string |
Plen | length of password, an octet string |
S | input salt, an octet string |
Slen | length of salt, an octet string |
c | iteration count, a positive integer |
dkLen | intended length in octets of the derived key, a positive integer, at most (2^32 - 1) * hLen. The DK array must have room for this many characters. |
DK | output derived key, a dkLen-octet string |

#### Returns

Returns SHISHI_OK iff successful.

### shishi_crypto ()

    Shishi_crypto *
    shishi_crypto (Shishi *handle,
                   Shishi_key *key,
                   int keyusage,
                   int32_t etype,
                   const char *iv,
                   size_t ivlen);

Initialize a crypto context. This store a key, keyusage, encryption type and initialization vector in a "context", and the caller can then use this context to perform encryption via `shishi_crypto_encrypt()` and decryption via `shishi_crypto_encrypt()` without supplying all those details again. The functions also takes care of propagating the IV between calls.

When the application no longer need to use the context, it should deallocate resources associated with it by calling `shishi_crypto_close()`.

#### Parameters

handle | shishi handle as allocated by `shishi_init()`. |
key | key to encrypt with. |
keyusage | integer specifying what this key will encrypt/decrypt. |
etype | integer specifying what cipher to use. |
iv | input array with initialization vector |
ivlen | size of input array with initialization vector. |

#### Returns

Return a newly allocated crypto context.

### shishi_crypto_close ()

    void
    shishi_crypto_close (Shishi_crypto *ctx);

Deallocate resources associated with the crypto context.

#### Parameters

ctx | crypto context as returned by `shishi_crypto()`. |

### shishi_crypto_encrypt ()

    int
    shishi_crypto_encrypt (Shishi_crypto *ctx,
                           const char *in,
                           size_t inlen,
                           char **out,
                           size_t *outlen);

Encrypt data, using information (e.g., key and initialization vector) from context. The IV is updated inside the context after this call.

When the application no longer need to use the context, it should deallocate resources associated with it by calling `shishi_crypto_close()`.

#### Parameters

ctx | crypto context as returned by `shishi_crypto()`. |
in | input array with data to encrypt. |
inlen | size of input array with data to encrypt. |
out | output array with newly allocated encrypted data. |
outlen | output variable with size of newly allocated output array. |

#### Returns

Returns `SHISHI_OK` iff successful.

### shishi_crypto_decrypt ()

    int
    shishi_crypto_decrypt (Shishi_crypto *ctx,
                           const char *in,
                           size_t inlen,
                           char **out,
                           size_t *outlen);

Decrypt data, using information (e.g., key and initialization vector) from context. The IV is updated inside the context after this call.

When the application no longer need to use the context, it should deallocate resources associated with it by calling `shishi_crypto_close()`.

#### Parameters

ctx | crypto context as returned by `shishi_crypto()`. |
in | input array with data to decrypt. |
inlen | size of input array with data to decrypt. |
out | output array with newly allocated decrypted data. |
outlen | output variable with size of newly allocated output array. |

#### Returns

Returns `SHISHI_OK` iff successful.

### shishi_check_version ()

    const char *
    shishi_check_version (const char *req_version);

Checks that the installed library version is at least as recent as the one provided in `req_version` . The version string is formatted like "1.0.2".

Whenever `NULL` is passed to this function, the check is suppressed, but the library version is still returned.

#### Parameters

req_version | Oldest acceptable version, or `NULL`. |

#### Returns

Returns the active library version, or `NULL`, should the running library be too old.

### shishi_prompt_password_func ()

    int
    (*shishi_prompt_password_func) (Shishi *handle,
                                    char **s,
                                    const char *format,
                                    va_list ap);

### shishi_prompt_password_callback_set ()

    void
    shishi_prompt_password_callback_set (Shishi *handle,
                                         shishi_prompt_password_func cb);

Set a callback function that will be used by `shishi_prompt_password()` to query the user for a password. The function pointer can be retrieved using `shishi_prompt_password_callback_get()`.

The `cb` function should follow the `shishi_prompt_password_func` prototype:

int prompt_password (Shishi * `handle` , char **`s` , const char *`format` , va_list `ap` );

If the function returns 0, the `s` variable should contain a newly allocated string with the password read from the user.

#### Parameters

handle | shishi handle as allocated by `shishi_init()`. |
cb | function pointer to application password callback, a shishi_prompt_password_func type. |

### shishi_prompt_password_callback_get ()

    shishi_prompt_password_func
    shishi_prompt_password_callback_get (Shishi *handle);

Get the application password prompt function callback as set by `shishi_prompt_password_callback_set()`.

#### Parameters

handle | shishi handle as allocated by `shishi_init()`. |

#### Returns

Returns the callback, a shishi_prompt_password_func type, or `NULL`.

### shishi_prompt_password ()

    int
    shishi_prompt_password (Shishi *handle,
                            char **s,
                            const char *format,
                            ...);

Format and print a prompt, and read a password from user. The password is possibly converted (e.g., converted from Latin-1 to UTF-8, or processed using Stringprep profile) following any "stringprocess" keywords in configuration files.

#### Parameters

handle | shishi handle as allocated by `shishi_init()`. |
s | pointer to newly allocated output string with read password. |
format | printf(3) style format string. |
... | printf(3) style arguments. |

#### Returns

Returns SHISHI_OK iff successful.

### shishi_asn1_number_of_elements ()

    int
    shishi_asn1_number_of_elements (Shishi *handle,
                                    Shishi_asn1 node,
                                    const char *field,
                                    size_t *n);

### shishi_asn1_empty_p ()

    int
    shishi_asn1_empty_p (Shishi *handle,
                         Shishi_asn1 node,
                         const char *field);

### shishi_asn1_read ()

    int
    shishi_asn1_read (Shishi *handle,
                      Shishi_asn1 node,
                      const char *field,
                      char **data,
                      size_t *datalen);

Extract data stored in a ASN.1 field into a newly allocated buffer. The buffer will always be zero terminated, even though `datalen` will not include the added zero.

#### Parameters

handle | shishi handle as allocated by `shishi_init()`. |
node | ASN.1 variable to read field from. |
field | name of field in `node` to read. |
data | newly allocated output buffer that will hold ASN.1 field data. |
datalen | actual size of output buffer. |

#### Returns

Returns SHISHI_OK if successful, SHISHI_ASN1_NO_ELEMENT if the element do not exist, SHISHI_ASN1_NO_VALUE if the field has no value, ot SHISHI_ASN1_ERROR otherwise.

### shishi_asn1_read_inline ()

    int
    shishi_asn1_read_inline (Shishi *handle,
                             Shishi_asn1 node,
                             const char *field,
                             char *data,
                             size_t *datalen);

Extract data stored in a ASN.1 field into a fixed size buffer allocated by caller.

Note that since it is difficult to predict the length of the field, it is often better to use `shishi_asn1_read()` instead.

#### Parameters

handle | shishi handle as allocated by `shishi_init()`. |
node | ASN.1 variable to read field from. |
field | name of field in `node` to read. |
data | pre-allocated output buffer that will hold ASN.1 field data. |
datalen | on input, maximum size of output buffer, on output, actual size of output buffer. |

#### Returns

Returns SHISHI_OK if successful, SHISHI_ASN1_NO_ELEMENT if the element do not exist, SHISHI_ASN1_NO_VALUE if the field has no value, ot SHISHI_ASN1_ERROR otherwise.

### shishi_asn1_read_integer ()

    int
    shishi_asn1_read_integer (Shishi *handle,
                              Shishi_asn1 node,
                              const char *field,
                              int *i);

### shishi_asn1_read_int32 ()

    int
    shishi_asn1_read_int32 (Shishi *handle,
                            Shishi_asn1 node,
                            const char *field,
                            int32_t *i);

### shishi_asn1_read_uint32 ()

    int
    shishi_asn1_read_uint32 (Shishi *handle,
                             Shishi_asn1 node,
                             const char *field,
                             uint32_t *i);

### shishi_asn1_read_bitstring ()

    int
    shishi_asn1_read_bitstring (Shishi *handle,
                                Shishi_asn1 node,
                                const char *field,
                                uint32_t *flags);

### shishi_asn1_read_optional ()

    int
    shishi_asn1_read_optional (Shishi *handle,
                               Shishi_asn1 node,
                               const char *field,
                               char **data,
                               size_t *datalen);

Extract data stored in a ASN.1 field into a newly allocated buffer. If the field does not exist (i.e., SHISHI_ASN1_NO_ELEMENT), this function set datalen to 0 and succeeds. Can be useful to read ASN.1 fields which are marked OPTIONAL in the grammar, if you want to avoid special error handling in your code.

#### Parameters

handle | shishi handle as allocated by `shishi_init()`. |
node | ASN.1 variable to read field from. |
field | name of field in `node` to read. |
data | newly allocated output buffer that will hold ASN.1 field data. |
datalen | actual size of output buffer. |

#### Returns

Returns SHISHI_OK if successful, SHISHI_ASN1_NO_VALUE if the field has no value, ot SHISHI_ASN1_ERROR otherwise.

### shishi_asn1_write ()

    int
    shishi_asn1_write (Shishi *handle,
                       Shishi_asn1 node,
                       const char *field,
                       const char *data,
                       size_t datalen);

### shishi_asn1_write_integer ()

    int
    shishi_asn1_write_integer (Shishi *handle,
                               Shishi_asn1 node,
                               const char *field,
                               int n);

### shishi_asn1_write_int32 ()

    int
    shishi_asn1_write_int32 (Shishi *handle,
                             Shishi_asn1 node,
                             const char *field,
                             int32_t n);

### shishi_asn1_write_uint32 ()

    int
    shishi_asn1_write_uint32 (Shishi *handle,
                              Shishi_asn1 node,
                              const char *field,
                              uint32_t n);

### shishi_asn1_write_bitstring ()

    int
    shishi_asn1_write_bitstring (Shishi *handle,
                                 Shishi_asn1 node,
                                 const char *field,
                                 uint32_t flags);

### shishi_asn1_done ()

    void
    shishi_asn1_done (Shishi *handle,
                      Shishi_asn1 node);

Deallocate resources associated with ASN.1 structure. Note that the node must not be used after this call.

#### Parameters

handle | shishi handle as allocated by `shishi_init()`. |
node | ASN.1 node to deallocate. |

### shishi_asn1_pa_enc_ts_enc ()

    Shishi_asn1
    shishi_asn1_pa_enc_ts_enc (Shishi *handle);

Create new ASN.1 structure for PA-ENC-TS-ENC.

#### Parameters

handle | shishi handle as allocated by `shishi_init()`. |

#### Returns

Returns ASN.1 structure.

### shishi_asn1_encrypteddata ()

    Shishi_asn1
    shishi_asn1_encrypteddata (Shishi *handle);

Create new ASN.1 structure for EncryptedData

#### Parameters

handle | shishi handle as allocated by `shishi_init()`. |

#### Returns

Returns ASN.1 structure.

### shishi_asn1_padata ()

    Shishi_asn1
    shishi_asn1_padata (Shishi *handle);

Create new ASN.1 structure for PA-DATA.

#### Parameters

handle | shishi handle as allocated by `shishi_init()`. |

#### Returns

Returns ASN.1 structure.

### shishi_asn1_methoddata ()

    Shishi_asn1
    shishi_asn1_methoddata (Shishi *handle);

Create new ASN.1 structure for METHOD-DATA.

#### Parameters

handle | shishi handle as allocated by `shishi_init()`. |

#### Returns

Returns ASN.1 structure.

### shishi_asn1_etype_info ()

    Shishi_asn1
    shishi_asn1_etype_info (Shishi *handle);

Create new ASN.1 structure for ETYPE-INFO.

#### Parameters

handle | shishi handle as allocated by `shishi_init()`. |

#### Returns

Returns ASN.1 structure.

### shishi_asn1_etype_info2 ()

    Shishi_asn1
    shishi_asn1_etype_info2 (Shishi *handle);

Create new ASN.1 structure for ETYPE-INFO2.

#### Parameters

handle | shishi handle as allocated by `shishi_init()`. |

#### Returns

Returns ASN.1 structure.

### shishi_asn1_asreq ()

    Shishi_asn1
    shishi_asn1_asreq (Shishi *handle);

Create new ASN.1 structure for AS-REQ.

#### Parameters

handle | shishi handle as allocated by `shishi_init()`. |

#### Returns

Returns ASN.1 structure.

### shishi_asn1_asrep ()

    Shishi_asn1
    shishi_asn1_asrep (Shishi *handle);

Create new ASN.1 structure for AS-REP.

#### Parameters

handle | shishi handle as allocated by `shishi_init()`. |

#### Returns

Returns ASN.1 structure.

### shishi_asn1_tgsreq ()

    Shishi_asn1
    shishi_asn1_tgsreq (Shishi *handle);

Create new ASN.1 structure for TGS-REQ.

#### Parameters

handle | shishi handle as allocated by `shishi_init()`. |

#### Returns

Returns ASN.1 structure.

### shishi_asn1_tgsrep ()

    Shishi_asn1
    shishi_asn1_tgsrep (Shishi *handle);

Create new ASN.1 structure for TGS-REP.

#### Parameters

handle | shishi handle as allocated by `shishi_init()`. |

#### Returns

Returns ASN.1 structure.

### shishi_asn1_apreq ()

    Shishi_asn1
    shishi_asn1_apreq (Shishi *handle);

Create new ASN.1 structure for AP-REQ.

#### Parameters

handle | shishi handle as allocated by `shishi_init()`. |

#### Returns

Returns ASN.1 structure.

### shishi_asn1_aprep ()

    Shishi_asn1
    shishi_asn1_aprep (Shishi *handle);

Create new ASN.1 structure for AP-REP.

#### Parameters

handle | shishi handle as allocated by `shishi_init()`. |

#### Returns

Returns ASN.1 structure.

### shishi_asn1_ticket ()

    Shishi_asn1
    shishi_asn1_ticket (Shishi *handle);

Create new ASN.1 structure for Ticket.

#### Parameters

handle | shishi handle as allocated by `shishi_init()`. |

#### Returns

Returns ASN.1 structure.

### shishi_asn1_encapreppart ()

    Shishi_asn1
    shishi_asn1_encapreppart (Shishi *handle);

Create new ASN.1 structure for AP-REP.

#### Parameters

handle | shishi handle as allocated by `shishi_init()`. |

#### Returns

Returns ASN.1 structure.

### shishi_asn1_encticketpart ()

    Shishi_asn1
    shishi_asn1_encticketpart (Shishi *handle);

Create new ASN.1 structure for EncTicketPart.

#### Parameters

handle | shishi handle as allocated by `shishi_init()`. |

#### Returns

Returns ASN.1 structure.

### shishi_asn1_authenticator ()

    Shishi_asn1
    shishi_asn1_authenticator (Shishi *handle);

Create new ASN.1 structure for Authenticator.

#### Parameters

handle | shishi handle as allocated by `shishi_init()`. |

#### Returns

Returns ASN.1 structure.

### shishi_asn1_enckdcreppart ()

    Shishi_asn1
    shishi_asn1_enckdcreppart (Shishi *handle);

Create new ASN.1 structure for EncKDCRepPart.

#### Parameters

handle | shishi handle as allocated by `shishi_init()`. |

#### Returns

Returns ASN.1 structure.

### shishi_asn1_encasreppart ()

    Shishi_asn1
    shishi_asn1_encasreppart (Shishi *handle);

Create new ASN.1 structure for EncASRepPart.

#### Parameters

handle | shishi handle as allocated by `shishi_init()`. |

#### Returns

Returns ASN.1 structure.

### shishi_asn1_krberror ()

    Shishi_asn1
    shishi_asn1_krberror (Shishi *handle);

Create new ASN.1 structure for KRB-ERROR.

#### Parameters

handle | shishi handle as allocated by `shishi_init()`. |

#### Returns

Returns ASN.1 structure.

### shishi_asn1_krbsafe ()

    Shishi_asn1
    shishi_asn1_krbsafe (Shishi *handle);

Create new ASN.1 structure for KRB-SAFE.

#### Parameters

handle | shishi handle as allocated by `shishi_init()`. |

#### Returns

Returns ASN.1 structure.

### shishi_asn1_priv ()

    Shishi_asn1
    shishi_asn1_priv (Shishi *handle);

Create new ASN.1 structure for KRB-PRIV.

#### Parameters

handle | shishi handle as allocated by `shishi_init()`. |

#### Returns

Returns ASN.1 structure.

### shishi_asn1_encprivpart ()

    Shishi_asn1
    shishi_asn1_encprivpart (Shishi *handle);

Create new ASN.1 structure for EncKrbPrivPart.

#### Parameters

handle | shishi handle as allocated by `shishi_init()`. |

#### Returns

Returns ASN.1 structure.

### shishi_asn1_to_der ()

    int
    shishi_asn1_to_der (Shishi *handle,
                        Shishi_asn1 node,
                        char **der,
                        size_t *len);

Extract newly allocated DER representation of specified ASN.1 data.

#### Parameters

handle | shishi handle as allocated by `shishi_init()`. |
node | ASN.1 data to convert to DER. |
der | output array that holds DER encoding of `node` . |
len | output variable with length of `der` output array. |

#### Returns

Returns SHISHI_OK if successful, or SHISHI_ASN1_ERROR if DER encoding fails (common reasons for this is that the ASN.1 is missing required values).

### shishi_asn1_to_der_field ()

    int
    shishi_asn1_to_der_field (Shishi *handle,
                              Shishi_asn1 node,
                              const char *field,
                              char **der,
                              size_t *len);

Extract newly allocated DER representation of specified ASN.1 field.

#### Parameters

handle | shishi handle as allocated by `shishi_init()`. |
node | ASN.1 data that have field to extract. |
field | name of field in `node` to extract. |
der | output array that holds DER encoding of `field` in `node` . |
len | output variable with length of `der` output array. |

#### Returns

Returns SHISHI_OK if successful, or SHISHI_ASN1_ERROR if DER encoding fails (common reasons for this is that the ASN.1 is missing required values).

### shishi_asn1_msgtype ()

    Shishi_msgtype
    shishi_asn1_msgtype (Shishi *handle,
                         Shishi_asn1 node);

Determine msg-type of ASN.1 type of a packet. Currently this uses the msg-type field instead of the APPLICATION tag, but this may be changed in the future.

#### Parameters

handle | shishi handle as allocated by `shishi_init()`. |
node | ASN.1 type to get msg type for. |

#### Returns

Returns msg-type of ASN.1 type, 0 on failure.

### shishi_der_msgtype ()

    Shishi_msgtype
    shishi_der_msgtype (Shishi *handle,
                        const char *der,
                        size_t derlen);

Determine msg-type of DER coded data of a packet.

#### Parameters

handle | shishi handle as allocated by `shishi_init()`. |
der | input character array with DER encoding. |
derlen | length of input character array with DER encoding. |

#### Returns

Returns msg-type of DER data, 0 on failure.

### shishi_asn1_print ()

    void
    shishi_asn1_print (Shishi *handle,
                       Shishi_asn1 node,
                       FILE *fh);

Print ASN.1 structure in human readable form, typically for debugging purposes.

#### Parameters

handle | shishi handle as allocated by `shishi_init()`. |
node | ASN.1 data that have field to extract. |
fh | file descriptor to print to, e.g. stdout. |

### shishi_der2asn1 ()

    Shishi_asn1
    shishi_der2asn1 (Shishi *handle,
                     const char *der,
                     size_t derlen);

Convert arbitrary DER data of a packet to a ASN.1 type.

#### Parameters

handle | shishi handle as allocated by `shishi_init()`. |
der | input character array with DER encoding. |
derlen | length of input character array with DER encoding. |

#### Returns

Returns newly allocate ASN.1 corresponding to DER data, or `NULL` on failure.

### shishi_der2asn1_padata ()

    Shishi_asn1
    shishi_der2asn1_padata (Shishi *handle,
                            const char *der,
                            size_t derlen);

Decode DER encoding of PA-DATA and create a ASN.1 structure.

#### Parameters

handle | shishi handle as allocated by `shishi_init()`. |
der | input character array with DER encoding. |
derlen | length of input character array with DER encoding. |

#### Returns

Returns ASN.1 structure corresponding to DER data.

### shishi_der2asn1_methoddata ()

    Shishi_asn1
    shishi_der2asn1_methoddata (Shishi *handle,
                                const char *der,
                                size_t derlen);

Decode DER encoding of METHOD-DATA and create a ASN.1 structure.

#### Parameters

handle | shishi handle as allocated by `shishi_init()`. |
der | input character array with DER encoding. |
derlen | length of input character array with DER encoding. |

#### Returns

Returns ASN.1 structure corresponding to DER data.

### shishi_der2asn1_etype_info ()

    Shishi_asn1
    shishi_der2asn1_etype_info (Shishi *handle,
                                const char *der,
                                size_t derlen);

Decode DER encoding of ETYPE-INFO and create a ASN.1 structure.

#### Parameters

handle | shishi handle as allocated by `shishi_init()`. |
der | input character array with DER encoding. |
derlen | length of input character array with DER encoding. |

#### Returns

Returns ASN.1 structure corresponding to DER data.

### shishi_der2asn1_etype_info2 ()

    Shishi_asn1
    shishi_der2asn1_etype_info2 (Shishi *handle,
                                 const char *der,
                                 size_t derlen);

Decode DER encoding of ETYPE-INFO2 and create a ASN.1 structure.

#### Parameters

handle | shishi handle as allocated by `shishi_init()`. |
der | input character array with DER encoding. |
derlen | length of input character array with DER encoding. |

#### Returns

Returns ASN.1 structure corresponding to DER data.

### shishi_der2asn1_ticket ()

    Shishi_asn1
    shishi_der2asn1_ticket (Shishi *handle,
                            const char *der,
                            size_t derlen);

Decode DER encoding of Ticket and create a ASN.1 structure.

#### Parameters

handle | shishi handle as allocated by `shishi_init()`. |
der | input character array with DER encoding. |
derlen | length of input character array with DER encoding. |

#### Returns

Returns ASN.1 structure corresponding to DER data.

### shishi_der2asn1_encticketpart ()

    Shishi_asn1
    shishi_der2asn1_encticketpart (Shishi *handle,
                                   const char *der,
                                   size_t derlen);

Decode DER encoding of EncTicketPart and create a ASN.1 structure.

#### Parameters

handle | shishi handle as allocated by `shishi_init()`. |
der | input character array with DER encoding. |
derlen | length of input character array with DER encoding. |

#### Returns

Returns ASN.1 structure corresponding to DER data.

### shishi_der2asn1_asreq ()

    Shishi_asn1
    shishi_der2asn1_asreq (Shishi *handle,
                           const char *der,
                           size_t derlen);

Decode DER encoding of AS-REQ and create a ASN.1 structure.

#### Parameters

handle | shishi handle as allocated by `shishi_init()`. |
der | input character array with DER encoding. |
derlen | length of input character array with DER encoding. |

#### Returns

Returns ASN.1 structure corresponding to DER data.

### shishi_der2asn1_tgsreq ()

    Shishi_asn1
    shishi_der2asn1_tgsreq (Shishi *handle,
                            const char *der,
                            size_t derlen);

Decode DER encoding of TGS-REQ and create a ASN.1 structure.

#### Parameters

handle | shishi handle as allocated by `shishi_init()`. |
der | input character array with DER encoding. |
derlen | length of input character array with DER encoding. |

#### Returns

Returns ASN.1 structure corresponding to DER data.

### shishi_der2asn1_asrep ()

    Shishi_asn1
    shishi_der2asn1_asrep (Shishi *handle,
                           const char *der,
                           size_t derlen);

Decode DER encoding of AS-REP and create a ASN.1 structure.

#### Parameters

handle | shishi handle as allocated by `shishi_init()`. |
der | input character array with DER encoding. |
derlen | length of input character array with DER encoding. |

#### Returns

Returns ASN.1 structure corresponding to DER data.

### shishi_der2asn1_tgsrep ()

    Shishi_asn1
    shishi_der2asn1_tgsrep (Shishi *handle,
                            const char *der,
                            size_t derlen);

Decode DER encoding of TGS-REP and create a ASN.1 structure.

#### Parameters

handle | shishi handle as allocated by `shishi_init()`. |
der | input character array with DER encoding. |
derlen | length of input character array with DER encoding. |

#### Returns

Returns ASN.1 structure corresponding to DER data.

### shishi_der2asn1_kdcrep ()

    Shishi_asn1
    shishi_der2asn1_kdcrep (Shishi *handle,
                            const char *der,
                            size_t derlen);

Decode DER encoding of KDC-REP and create a ASN.1 structure.

#### Parameters

handle | shishi handle as allocated by `shishi_init()`. |
der | input character array with DER encoding. |
derlen | length of input character array with DER encoding. |

#### Returns

Returns ASN.1 structure corresponding to DER data.

### shishi_der2asn1_kdcreq ()

    Shishi_asn1
    shishi_der2asn1_kdcreq (Shishi *handle,
                            const char *der,
                            size_t derlen);

Decode DER encoding of AS-REQ, TGS-REQ or KDC-REQ and create a ASN.1 structure.

#### Parameters

handle | shishi handle as allocated by `shishi_init()`. |
der | input character array with DER encoding. |
derlen | length of input character array with DER encoding. |

#### Returns

Returns ASN.1 structure corresponding to DER data.

### shishi_der2asn1_apreq ()

    Shishi_asn1
    shishi_der2asn1_apreq (Shishi *handle,
                           const char *der,
                           size_t derlen);

Decode DER encoding of AP-REQ and create a ASN.1 structure.

#### Parameters

handle | shishi handle as allocated by `shishi_init()`. |
der | input character array with DER encoding. |
derlen | length of input character array with DER encoding. |

#### Returns

Returns ASN.1 structure corresponding to DER data.

### shishi_der2asn1_aprep ()

    Shishi_asn1
    shishi_der2asn1_aprep (Shishi *handle,
                           const char *der,
                           size_t derlen);

Decode DER encoding of AP-REP and create a ASN.1 structure.

#### Parameters

handle | shishi handle as allocated by `shishi_init()`. |
der | input character array with DER encoding. |
derlen | length of input character array with DER encoding. |

#### Returns

Returns ASN.1 structure corresponding to DER data.

### shishi_der2asn1_authenticator ()

    Shishi_asn1
    shishi_der2asn1_authenticator (Shishi *handle,
                                   const char *der,
                                   size_t derlen);

Decode DER encoding of Authenticator and create a ASN.1 structure.

#### Parameters

handle | shishi handle as allocated by `shishi_init()`. |
der | input character array with DER encoding. |
derlen | length of input character array with DER encoding. |

#### Returns

Returns ASN.1 structure corresponding to DER data.

### shishi_der2asn1_krberror ()

    Shishi_asn1
    shishi_der2asn1_krberror (Shishi *handle,
                              const char *der,
                              size_t derlen);

Decode DER encoding of KRB-ERROR and create a ASN.1 structure.

#### Parameters

handle | shishi handle as allocated by `shishi_init()`. |
der | input character array with DER encoding. |
derlen | length of input character array with DER encoding. |

#### Returns

Returns ASN.1 structure corresponding to DER data.

### shishi_der2asn1_krbsafe ()

    Shishi_asn1
    shishi_der2asn1_krbsafe (Shishi *handle,
                             const char *der,
                             size_t derlen);

Decode DER encoding of KRB-SAFE and create a ASN.1 structure.

#### Parameters

handle | shishi handle as allocated by `shishi_init()`. |
der | input character array with DER encoding. |
derlen | length of input character array with DER encoding. |

#### Returns

Returns ASN.1 structure corresponding to DER data.

### shishi_der2asn1_priv ()

    Shishi_asn1
    shishi_der2asn1_priv (Shishi *handle,
                          const char *der,
                          size_t derlen);

Decode DER encoding of KRB-PRIV and create a ASN.1 structure.

#### Parameters

handle | shishi handle as allocated by `shishi_init()`. |
der | input character array with DER encoding. |
derlen | length of input character array with DER encoding. |

#### Returns

Returns ASN.1 structure corresponding to DER data.

### shishi_der2asn1_encasreppart ()

    Shishi_asn1
    shishi_der2asn1_encasreppart (Shishi *handle,
                                  const char *der,
                                  size_t derlen);

Decode DER encoding of EncASRepPart and create a ASN.1 structure.

#### Parameters

handle | shishi handle as allocated by `shishi_init()`. |
der | input character array with DER encoding. |
derlen | length of input character array with DER encoding. |

#### Returns

Returns ASN.1 structure corresponding to DER data.

### shishi_der2asn1_enctgsreppart ()

    Shishi_asn1
    shishi_der2asn1_enctgsreppart (Shishi *handle,
                                   const char *der,
                                   size_t derlen);

Decode DER encoding of EncTGSRepPart and create a ASN.1 structure.

#### Parameters

handle | shishi handle as allocated by `shishi_init()`. |
der | input character array with DER encoding. |
derlen | length of input character array with DER encoding. |

#### Returns

Returns ASN.1 structure corresponding to DER data.

### shishi_der2asn1_enckdcreppart ()

    Shishi_asn1
    shishi_der2asn1_enckdcreppart (Shishi *handle,
                                   const char *der,
                                   size_t derlen);

Decode DER encoding of EncKDCRepPart and create a ASN.1 structure.

#### Parameters

handle | shishi handle as allocated by `shishi_init()`. |
der | input character array with DER encoding. |
derlen | length of input character array with DER encoding. |

#### Returns

Returns ASN.1 structure corresponding to DER data.

### shishi_der2asn1_encapreppart ()

    Shishi_asn1
    shishi_der2asn1_encapreppart (Shishi *handle,
                                  const char *der,
                                  size_t derlen);

Decode DER encoding of EncAPRepPart and create a ASN.1 structure.

#### Parameters

handle | shishi handle as allocated by `shishi_init()`. |
der | input character array with DER encoding. |
derlen | length of input character array with DER encoding. |

#### Returns

Returns ASN.1 structure corresponding to DER data.

### shishi_der2asn1_encprivpart ()

    Shishi_asn1
    shishi_der2asn1_encprivpart (Shishi *handle,
                                 const char *der,
                                 size_t derlen);

Decode DER encoding of EncKrbPrivPart and create a ASN.1 structure.

#### Parameters

handle | shishi handle as allocated by `shishi_init()`. |
der | input character array with DER encoding. |
derlen | length of input character array with DER encoding. |

#### Returns

Returns ASN.1 structure corresponding to DER data.

### shishi_ap ()

    int
    shishi_ap (Shishi *handle,
               Shishi_ap **ap);

Create a new AP exchange with a random subkey of the default encryption type from configuration. Note that there is no guarantee that the receiver will understand that key type, you should probably use `shishi_ap_etype()` or `shishi_ap_nosubkey()` instead. In the future, this function will likely behave as `shishi_ap_nosubkey()` and `shishi_ap_nosubkey()` will be removed.

#### Parameters

handle | shishi handle as allocated by `shishi_init()`. |
ap | pointer to new structure that holds information about AP exchange |

#### Returns

Returns SHISHI_OK iff successful.

### shishi_ap_etype ()

    int
    shishi_ap_etype (Shishi *handle,
                     Shishi_ap **ap,
                     int etype);

Create a new AP exchange with a random subkey of indicated encryption type.

#### Parameters

handle | shishi handle as allocated by `shishi_init()`. |
ap | pointer to new structure that holds information about AP exchange |
etype | encryption type of newly generated random subkey. |

#### Returns

Returns SHISHI_OK iff successful.

### shishi_ap_nosubkey ()

    int
    shishi_ap_nosubkey (Shishi *handle,
                        Shishi_ap **ap);

Create a new AP exchange without subkey in authenticator.

#### Parameters

handle | shishi handle as allocated by `shishi_init()`. |
ap | pointer to new structure that holds information about AP exchange |

#### Returns

Returns SHISHI_OK iff successful.

### shishi_ap_done ()

    void
    shishi_ap_done (Shishi_ap *ap);

Deallocate resources associated with AP exchange. This should be called by the application when it no longer need to utilize the AP exchange handle.

#### Parameters

ap | structure that holds information about AP exchange |

### shishi_ap_set_tktoptions ()

    int
    shishi_ap_set_tktoptions (Shishi_ap *ap,
                              Shishi_tkt *tkt,
                              int options);

Set the ticket (see `shishi_ap_tkt_set()`) and set the AP-REQ apoptions (see `shishi_apreq_options_set()`).

#### Parameters

ap | structure that holds information about AP exchange |
tkt | ticket to set in AP. |
options | AP-REQ options to set in AP. |

#### Returns

Returns SHISHI_OK iff successful.

### shishi_ap_tktoptions ()

    int
    shishi_ap_tktoptions (Shishi *handle,
                          Shishi_ap **ap,
                          Shishi_tkt *tkt,
                          int options);

Create a new AP exchange using `shishi_ap()`, and set the ticket and AP-REQ apoptions using `shishi_ap_set_tktoptions()`. A random session key is added to the authenticator, using the same keytype as the ticket.

#### Parameters

handle | shishi handle as allocated by `shishi_init()`. |
ap | pointer to new structure that holds information about AP exchange |
tkt | ticket to set in newly created AP. |
options | AP-REQ options to set in newly created AP. |

#### Returns

Returns SHISHI_OK iff successful.

### shishi_ap_etype_tktoptionsdata ()

    int
    shishi_ap_etype_tktoptionsdata (Shishi *handle,
                                    Shishi_ap **ap,
                                    int32_t etype,
                                    Shishi_tkt *tkt,
                                    int options,
                                    const char *data,
                                    size_t len);

Create a new AP exchange using `shishi_ap()`, and set the ticket, AP-REQ apoptions and the Authenticator checksum data using `shishi_ap_set_tktoptionsdata()`. A random session key is added to the authenticator, using the same keytype as the ticket.

#### Parameters

handle | shishi handle as allocated by `shishi_init()`. |
ap | pointer to new structure that holds information about AP exchange |
etype | encryption type of newly generated random subkey. |
tkt | ticket to set in newly created AP. |
options | AP-REQ options to set in newly created AP. |
data | input array with data to checksum in Authenticator. |
len | length of input array with data to checksum in Authenticator. |

#### Returns

Returns SHISHI_OK iff successful.

### shishi_ap_set_tktoptionsdata ()

    int
    shishi_ap_set_tktoptionsdata (Shishi_ap *ap,
                                  Shishi_tkt *tkt,
                                  int options,
                                  const char *data,
                                  size_t len);

Set the ticket (see `shishi_ap_tkt_set()`) and set the AP-REQ apoptions (see `shishi_apreq_options_set()`) and set the Authenticator checksum data.

#### Parameters

ap | structure that holds information about AP exchange |
tkt | ticket to set in AP. |
options | AP-REQ options to set in AP. |
data | input array with data to checksum in Authenticator. |
len | length of input array with data to checksum in Authenticator. |

#### Returns

Returns SHISHI_OK iff successful.

### shishi_ap_tktoptionsdata ()

    int
    shishi_ap_tktoptionsdata (Shishi *handle,
                              Shishi_ap **ap,
                              Shishi_tkt *tkt,
                              int options,
                              const char *data,
                              size_t len);

Create a new AP exchange using `shishi_ap()`, and set the ticket, AP-REQ apoptions and the Authenticator checksum data using `shishi_ap_set_tktoptionsdata()`. A random session key is added to the authenticator, using the same keytype as the ticket.

#### Parameters

handle | shishi handle as allocated by `shishi_init()`. |
ap | pointer to new structure that holds information about AP exchange |
tkt | ticket to set in newly created AP. |
options | AP-REQ options to set in newly created AP. |
data | input array with data to checksum in Authenticator. |
len | length of input array with data to checksum in Authenticator. |

#### Returns

Returns SHISHI_OK iff successful.

### shishi_ap_set_tktoptionsraw ()

    int
    shishi_ap_set_tktoptionsraw (Shishi_ap *ap,
                                 Shishi_tkt *tkt,
                                 int options,
                                 int32_t cksumtype,
                                 const char *data,
                                 size_t len);

Set the ticket (see `shishi_ap_tkt_set()`) and set the AP-REQ apoptions (see `shishi_apreq_options_set()`) and set the raw Authenticator checksum data.

#### Parameters

ap | structure that holds information about AP exchange |
tkt | ticket to set in AP. |
options | AP-REQ options to set in AP. |
cksumtype | authenticator checksum type to set in AP. |
data | input array with data to store in checksum field in Authenticator. |
len | length of input array with data to store in checksum field in Authenticator. |

#### Returns

Returns SHISHI_OK iff successful.

### shishi_ap_tktoptionsraw ()

    int
    shishi_ap_tktoptionsraw (Shishi *handle,
                             Shishi_ap **ap,
                             Shishi_tkt *tkt,
                             int options,
                             int32_t cksumtype,
                             const char *data,
                             size_t len);

Create a new AP exchange using `shishi_ap()`, and set the ticket, AP-REQ apoptions and the raw Authenticator checksum data field using `shishi_ap_set_tktoptionsraw()`. A random session key is added to the authenticator, using the same keytype as the ticket.

#### Parameters

handle | shishi handle as allocated by `shishi_init()`. |
ap | pointer to new structure that holds information about AP exchange |
tkt | ticket to set in newly created AP. |
options | AP-REQ options to set in newly created AP. |
cksumtype | authenticator checksum type to set in AP. |
data | input array with data to store in checksum field in Authenticator. |
len | length of input array with data to store in checksum field in Authenticator. |

#### Returns

Returns SHISHI_OK iff successful.

### shishi_ap_set_tktoptionsasn1usage ()

    int
    shishi_ap_set_tktoptionsasn1usage (Shishi_ap *ap,
                                       Shishi_tkt *tkt,
                                       int options,
                                       Shishi_asn1 node,
                                       const char *field,
                                       int authenticatorcksumkeyusage,
                                       int authenticatorkeyusage);

Set ticket, options and authenticator checksum data using `shishi_ap_set_tktoptionsdata()`. The authenticator checksum data is the DER encoding of the ASN.1 field provided.

#### Parameters

ap | structure that holds information about AP exchange |
tkt | ticket to set in AP. |
options | AP-REQ options to set in AP. |
node | input ASN.1 structure to store as authenticator checksum data. |
field | field in ASN.1 structure to use. |
authenticatorcksumkeyusage | key usage for checksum in authenticator. |
authenticatorkeyusage | key usage for authenticator. |

#### Returns

Returns SHISHI_OK iff successful.

### shishi_ap_tktoptionsasn1usage ()

    int
    shishi_ap_tktoptionsasn1usage (Shishi *handle,
                                   Shishi_ap **ap,
                                   Shishi_tkt *tkt,
                                   int options,
                                   Shishi_asn1 node,
                                   const char *field,
                                   int authenticatorcksumkeyusage,
                                   int authenticatorkeyusage);

Create a new AP exchange using `shishi_ap()`, and set ticket, options and authenticator checksum data from the DER encoding of the ASN.1 field using `shishi_ap_set_tktoptionsasn1usage()`. A random session key is added to the authenticator, using the same keytype as the ticket.

#### Parameters

handle | shishi handle as allocated by `shishi_init()`. |
ap | pointer to new structure that holds information about AP exchange |
tkt | ticket to set in newly created AP. |
options | AP-REQ options to set in newly created AP. |
node | input ASN.1 structure to store as authenticator checksum data. |
field | field in ASN.1 structure to use. |
authenticatorcksumkeyusage | key usage for checksum in authenticator. |
authenticatorkeyusage | key usage for authenticator. |

#### Returns

Returns SHISHI_OK iff successful.

### shishi_ap_tkt ()

    Shishi_tkt *
    shishi_ap_tkt (Shishi_ap *ap);

Get Ticket from AP exchange.

#### Parameters

ap | structure that holds information about AP exchange |

#### Returns

Returns the ticket from the AP exchange, or NULL if not yet set or an error occured.

### shishi_ap_tkt_set ()

    void
    shishi_ap_tkt_set (Shishi_ap *ap,
                       Shishi_tkt *tkt);

Set the Ticket in the AP exchange.

#### Parameters

ap | structure that holds information about AP exchange |
tkt | ticket to store in AP. |

### shishi_ap_authenticator_cksumdata ()

    int
    shishi_ap_authenticator_cksumdata (Shishi_ap *ap,
                                       char *out,
                                       size_t *len);

Get checksum data from Authenticator.

#### Parameters

ap | structure that holds information about AP exchange |
out | output array that holds authenticator checksum data. |
len | on input, maximum length of output array that holds authenticator checksum data, on output actual length of output array that holds authenticator checksum data. |

#### Returns

Returns `SHISHI_OK` if successful, or `SHISHI_TOO_SMALL_BUFFER` if buffer provided was too small (then `len` will hold necessary buffer size).

### shishi_ap_authenticator_cksumdata_set ()

    void
    shishi_ap_authenticator_cksumdata_set (Shishi_ap *ap,
                                           const char *authenticatorcksumdata,
                                           size_t authenticatorcksumdatalen);

Set the Authenticator Checksum Data in the AP exchange. This is the data that will be checksumed, and the checksum placed in the checksum field. It is not the actual checksum field. See also shishi_ap_authenticator_cksumraw_set.

#### Parameters

ap | structure that holds information about AP exchange |
authenticatorcksumdata | input array with data to compute checksum on and store in Authenticator in AP-REQ. |
authenticatorcksumdatalen | length of input array with data to compute checksum on and store in Authenticator in AP-REQ. |

### shishi_ap_authenticator_cksumraw_set ()

    void
    shishi_ap_authenticator_cksumraw_set (Shishi_ap *ap,
                                          int32_t authenticatorcksumtype,
                                          const char *authenticatorcksumraw,
                                          size_t authenticatorcksumrawlen);

Set the Authenticator Checksum Data in the AP exchange. This is the actual checksum field, not data to compute checksum on and then store in the checksum field. See also shishi_ap_authenticator_cksumdata_set.

#### Parameters

ap | structure that holds information about AP exchange |
authenticatorcksumtype | authenticator checksum type to set in AP. |
authenticatorcksumraw | input array with authenticator checksum field value to set in Authenticator in AP-REQ. |
authenticatorcksumrawlen | length of input array with authenticator checksum field value to set in Authenticator in AP-REQ. |

### shishi_ap_authenticator_cksumtype ()

    int32_t
    shishi_ap_authenticator_cksumtype (Shishi_ap *ap);

Get the Authenticator Checksum Type in the AP exchange.

#### Parameters

ap | structure that holds information about AP exchange |

#### Returns

Return the authenticator checksum type.

### shishi_ap_authenticator_cksumtype_set ()

    void
    shishi_ap_authenticator_cksumtype_set (Shishi_ap *ap,
                                           int32_t cksumtype);

Set the Authenticator Checksum Type in the AP exchange.

#### Parameters

ap | structure that holds information about AP exchange |
cksumtype | authenticator checksum type to set in AP. |

### shishi_ap_authenticator ()

    Shishi_asn1
    shishi_ap_authenticator (Shishi_ap *ap);

Get ASN.1 Authenticator structure from AP exchange.

#### Parameters

ap | structure that holds information about AP exchange |

#### Returns

Returns the Authenticator from the AP exchange, or NULL if not yet set or an error occured.

### shishi_ap_authenticator_set ()

    void
    shishi_ap_authenticator_set (Shishi_ap *ap,
                                 Shishi_asn1 authenticator);

Set the Authenticator in the AP exchange.

#### Parameters

ap | structure that holds information about AP exchange |
authenticator | authenticator to store in AP. |

### shishi_ap_req ()

    Shishi_asn1
    shishi_ap_req (Shishi_ap *ap);

Get ASN.1 AP-REQ structure from AP exchange.

#### Parameters

ap | structure that holds information about AP exchange |

#### Returns

Returns the AP-REQ from the AP exchange, or NULL if not yet set or an error occured.

### shishi_ap_req_set ()

    void
    shishi_ap_req_set (Shishi_ap *ap,
                       Shishi_asn1 apreq);

Set the AP-REQ in the AP exchange.

#### Parameters

ap | structure that holds information about AP exchange |
apreq | apreq to store in AP. |

### shishi_ap_req_der ()

    int
    shishi_ap_req_der (Shishi_ap *ap,
                       char **out,
                       size_t *outlen);

Build AP-REQ using `shishi_ap_req_build()` and DER encode it. `out` is allocated by this function, and it is the responsibility of caller to deallocate it.

#### Parameters

ap | structure that holds information about AP exchange |
out | pointer to output array with der encoding of AP-REQ. |
outlen | pointer to length of output array with der encoding of AP-REQ. |

#### Returns

Returns SHISHI_OK iff successful.

### shishi_ap_req_der_set ()

    int
    shishi_ap_req_der_set (Shishi_ap *ap,
                           char *der,
                           size_t derlen);

DER decode AP-REQ and set it AP exchange. If decoding fails, the AP-REQ in the AP exchange is lost.

#### Parameters

ap | structure that holds information about AP exchange |
der | input array with DER encoded AP-REQ. |
derlen | length of input array with DER encoded AP-REQ. |

#### Returns

Returns SHISHI_OK.

### shishi_ap_req_build ()

    int
    shishi_ap_req_build (Shishi_ap *ap);

Checksum data in authenticator and add ticket and authenticator to AP-REQ.

#### Parameters

ap | structure that holds information about AP exchange |

#### Returns

Returns SHISHI_OK iff successful.

### shishi_ap_req_asn1 ()

    int
    shishi_ap_req_asn1 (Shishi_ap *ap,
                        Shishi_asn1 *apreq);

Build AP-REQ using `shishi_ap_req_build()` and return it.

#### Parameters

ap | structure that holds information about AP exchange |
apreq | output AP-REQ variable. |

#### Returns

Returns SHISHI_OK iff successful.

### shishi_ap_key ()

    Shishi_key *
    shishi_ap_key (Shishi_ap *ap);

Extract the application key from AP. If subkeys are used, it is taken from the Authenticator, otherwise the session key is used.

#### Parameters

ap | structure that holds information about AP exchange |

#### Returns

Return application key from AP.

### shishi_ap_req_decode ()

    int
    shishi_ap_req_decode (Shishi_ap *ap);

Decode ticket in AP-REQ and set the Ticket fields in the AP exchange.

#### Parameters

ap | structure that holds information about AP exchange |

#### Returns

Returns SHISHI_OK iff successful.

### shishi_ap_req_process ()

    int
    shishi_ap_req_process (Shishi_ap *ap,
                           Shishi_key *key);

Decrypt ticket in AP-REQ using supplied key and decrypt Authenticator in AP-REQ using key in decrypted ticket, and on success set the Ticket and Authenticator fields in the AP exchange.

#### Parameters

ap | structure that holds information about AP exchange |
key | cryptographic key used to decrypt ticket in AP-REQ. |

#### Returns

Returns SHISHI_OK iff successful.

### shishi_ap_req_process_keyusage ()

    int
    shishi_ap_req_process_keyusage (Shishi_ap *ap,
                                    Shishi_key *key,
                                    int32_t keyusage);

Decrypt ticket in AP-REQ using supplied key and decrypt Authenticator in AP-REQ using key in decrypted ticket, and on success set the Ticket and Authenticator fields in the AP exchange.

#### Parameters

ap | structure that holds information about AP exchange |
key | cryptographic key used to decrypt ticket in AP-REQ. |
keyusage | key usage to use during decryption, for normal AP-REQ's this is normally SHISHI_KEYUSAGE_APREQ_AUTHENTICATOR, for AP-REQ's part of TGS-REQ's, this is normally SHISHI_KEYUSAGE_TGSREQ_APREQ_AUTHENTICATOR. |

#### Returns

Returns SHISHI_OK iff successful.

### shishi_ap_rep ()

    Shishi_asn1
    shishi_ap_rep (Shishi_ap *ap);

Get ASN.1 AP-REP structure from AP exchange.

#### Parameters

ap | structure that holds information about AP exchange |

#### Returns

Returns the AP-REP from the AP exchange, or NULL if not yet set or an error occured.

### shishi_ap_rep_set ()

    void
    shishi_ap_rep_set (Shishi_ap *ap,
                       Shishi_asn1 aprep);

Set the AP-REP in the AP exchange.

#### Parameters

ap | structure that holds information about AP exchange |
aprep | aprep to store in AP. |

### shishi_ap_rep_der ()

    int
    shishi_ap_rep_der (Shishi_ap *ap,
                       char **out,
                       size_t *outlen);

Build AP-REP using `shishi_ap_rep_build()` and DER encode it. `out` is allocated by this function, and it is the responsibility of caller to deallocate it.

#### Parameters

ap | structure that holds information about AP exchange |
out | output array with newly allocated DER encoding of AP-REP. |
outlen | length of output array with DER encoding of AP-REP. |

#### Returns

Returns SHISHI_OK iff successful.

### shishi_ap_rep_der_set ()

    int
    shishi_ap_rep_der_set (Shishi_ap *ap,
                           char *der,
                           size_t derlen);

DER decode AP-REP and set it AP exchange. If decoding fails, the AP-REP in the AP exchange remains.

#### Parameters

ap | structure that holds information about AP exchange |
der | input array with DER encoded AP-REP. |
derlen | length of input array with DER encoded AP-REP. |

#### Returns

Returns SHISHI_OK.

### shishi_ap_rep_verify ()

    int
    shishi_ap_rep_verify (Shishi_ap *ap);

Verify AP-REP compared to Authenticator.

#### Parameters

ap | structure that holds information about AP exchange |

#### Returns

Returns SHISHI_OK, SHISHI_APREP_VERIFY_FAILED or an error.

### shishi_ap_rep_verify_der ()

    int
    shishi_ap_rep_verify_der (Shishi_ap *ap,
                              char *der,
                              size_t derlen);

DER decode AP-REP and set it in AP exchange using `shishi_ap_rep_der_set()` and verify it using `shishi_ap_rep_verify()`.

#### Parameters

ap | structure that holds information about AP exchange |
der | input array with DER encoded AP-REP. |
derlen | length of input array with DER encoded AP-REP. |

#### Returns

Returns SHISHI_OK, SHISHI_APREP_VERIFY_FAILED or an error.

### shishi_ap_rep_verify_asn1 ()

    int
    shishi_ap_rep_verify_asn1 (Shishi_ap *ap,
                               Shishi_asn1 aprep);

Set the AP-REP in the AP exchange using `shishi_ap_rep_set()` and verify it using `shishi_ap_rep_verify()`.

#### Parameters

ap | structure that holds information about AP exchange |
aprep | input AP-REP. |

#### Returns

Returns SHISHI_OK, SHISHI_APREP_VERIFY_FAILED or an error.

### shishi_ap_rep_asn1 ()

    int
    shishi_ap_rep_asn1 (Shishi_ap *ap,
                        Shishi_asn1 *aprep);

Build AP-REP using `shishi_ap_rep_build()` and return it.

#### Parameters

ap | structure that holds information about AP exchange |
aprep | output AP-REP variable. |

#### Returns

Returns SHISHI_OK iff successful.

### shishi_ap_rep_build ()

    int
    shishi_ap_rep_build (Shishi_ap *ap);

Checksum data in authenticator and add ticket and authenticator to AP-REP.

#### Parameters

ap | structure that holds information about AP exchange |

#### Returns

Returns SHISHI_OK iff successful.

### shishi_ap_encapreppart ()

    Shishi_asn1
    shishi_ap_encapreppart (Shishi_ap *ap);

Get ASN.1 EncAPRepPart structure from AP exchange.

#### Parameters

ap | structure that holds information about AP exchange |

#### Returns

Returns the EncAPREPPart from the AP exchange, or NULL if not yet set or an error occured.

### shishi_ap_encapreppart_set ()

    void
    shishi_ap_encapreppart_set (Shishi_ap *ap,
                                Shishi_asn1 encapreppart);

Set the EncAPRepPart in the AP exchange.

#### Parameters

ap | structure that holds information about AP exchange |
encapreppart | EncAPRepPart to store in AP. |

### shishi_ap_option2string ()

    const char *
    shishi_ap_option2string (Shishi_apoptions option);

Convert AP-Option type to AP-Option name string. Note that `option` must be just one of the AP-Option types, it cannot be an binary ORed indicating several AP-Options.

#### Parameters

option | enumerated AP-Option type, see Shishi_apoptions. |

#### Returns

Returns static string with name of AP-Option that must not be deallocated, or "unknown" if AP-Option was not understood.

### shishi_ap_string2option ()

    Shishi_apoptions
    shishi_ap_string2option (const char *str);

Convert AP-Option name to AP-Option type.

#### Parameters

str | zero terminated character array with name of AP-Option, e.g. "use-session-key". |

#### Returns

Returns enumerated type member corresponding to AP-Option, or 0 if string was not understood.

### shishi_key_principal ()

    const char *
    shishi_key_principal (const Shishi_key *key);

Get the principal part of the key owner principal name, i.e., except the realm.

#### Parameters

key | structure that holds key information |

#### Returns

Returns the principal owning the key. (Not a copy of it, so don't modify or deallocate it.)

### shishi_key_principal_set ()

    void
    shishi_key_principal_set (Shishi_key *key,
                              const char *principal);

Set the principal owning the key. The string is copied into the key, so you can dispose of the variable immediately after calling this function.

#### Parameters

key | structure that holds key information |
principal | string with new principal name. |

### shishi_key_realm ()

    const char *
    shishi_key_realm (const Shishi_key *key);

Get the realm part of the key owner principal name.

#### Parameters

key | structure that holds key information |

#### Returns

Returns the realm for the principal owning the key. (Not a copy of it, so don't modify or deallocate it.)

### shishi_key_realm_set ()

    void
    shishi_key_realm_set (Shishi_key *key,
                          const char *realm);

Set the realm for the principal owning the key. The string is copied into the key, so you can dispose of the variable immediately after calling this function.

#### Parameters

key | structure that holds key information |
realm | string with new realm name. |

### shishi_key_type ()

    int
    shishi_key_type (const Shishi_key *key);

Get key type.

#### Parameters

key | structure that holds key information |

#### Returns

Returns the type of key as an integer as described in the standard.

### shishi_key_type_set ()

    void
    shishi_key_type_set (Shishi_key *key,
                         int32_t type);

Set the type of key in key structure.

#### Parameters

key | structure that holds key information |
type | type to set in key. |

### shishi_key_value ()

    const char *
    shishi_key_value (const Shishi_key *key);

Get the raw key bytes.

#### Parameters

key | structure that holds key information |

#### Returns

Returns the key value as a pointer which is valid throughout the lifetime of the key structure.

### shishi_key_value_set ()

    void
    shishi_key_value_set (Shishi_key *key,
                          const char *value);

Set the key value and length in key structure. The value is copied into the key (in other words, you can deallocate `value` right after calling this function without modifying the value inside the key).

#### Parameters

key | structure that holds key information |
value | input array with key data. |

### shishi_key_name ()

    const char *
    shishi_key_name (Shishi_key *key);

Calls shishi_cipher_name for key type.

#### Parameters

key | structure that holds key information |

#### Returns

Return name of key.

### shishi_key_length ()

    size_t
    shishi_key_length (const Shishi_key *key);

Calls shishi_cipher_keylen for key type.

#### Parameters

key | structure that holds key information |

#### Returns

Returns the length of the key value.

### shishi_key_version ()

    uint32_t
    shishi_key_version (const Shishi_key *key);

Get the "kvno" (key version) of key. It will be UINT32_MAX if the key is not long-lived.

#### Parameters

key | structure that holds key information |

#### Returns

Returns the version of key ("kvno").

### shishi_key_version_set ()

    void
    shishi_key_version_set (Shishi_key *key,
                            uint32_t kvno);

Set the version of key ("kvno") in key structure. Use UINT32_MAX for non-ptermanent keys.

#### Parameters

key | structure that holds key information |
kvno | new version integer. |

### shishi_key_timestamp ()

    time_t
    shishi_key_timestamp (const Shishi_key *key);

Get the time the key was established. Typically only present when the key was imported from a keytab format.

#### Parameters

key | structure that holds key information |

#### Returns

Returns the time the key was established, or (time_t)-1 if not available.

Since: 0.0.42

### shishi_key_timestamp_set ()

    void
    shishi_key_timestamp_set (Shishi_key *key,
                              time_t timestamp);

Set the time the key was established. Typically only relevant when exporting the key to keytab format.

#### Parameters

key | structure that holds key information |
timestamp | new timestamp. |

Since: 0.0.42

### shishi_key ()

    int
    shishi_key (Shishi *handle,
                Shishi_key **key);

Create a new Key information structure.

#### Parameters

handle | Shishi library handle create by `shishi_init()`. |
key | pointer to structure that will hold newly created key information |

#### Returns

Returns SHISHI_OK iff successful.

### shishi_key_done ()

    void
    shishi_key_done (Shishi_key *key);

Deallocates key information structure.

#### Parameters

key | pointer to structure that holds key information. |

### shishi_key_copy ()

    void
    shishi_key_copy (Shishi_key *dstkey,
                     Shishi_key *srckey);

Copies source key into existing allocated destination key.

#### Parameters

dstkey | structure that holds destination key information |
srckey | structure that holds source key information |

### shishi_key_print ()

    int
    shishi_key_print (Shishi *handle,
                      FILE *fh,
                      const Shishi_key *key);

Prints an ASCII representation of a key structure `key` to the file descriptor `fh` . Example output:

-----BEGIN SHISHI KEY----- Keytype: 18 (aes256-cts-hmac-sha1-96) Principal: host/latte.josefsson.org Realm: JOSEFSSON.ORG Key-Version-Number: 1 Timestamp: 20130420150337Z

P1QdeW/oSiag/bTyVEBAY2msiGSTmgLXlopuCKoppDs= -----END SHISHI KEY-----

#### Parameters

handle | Shishi handle as allocated by `shishi_init()`. |
fh | File handle open for writing. |
key | Key to print. |

#### Returns

Returns `SHISHI_OK` if successful. The only failure is `SHISHI_MALLOC_ERROR`.

### shishi_key_to_file ()

    int
    shishi_key_to_file (Shishi *handle,
                        const char *filename,
                        Shishi_key *key);

Prints an ASCII representation of a key structure `key` to the file `filename` . The text is appended if the file exists. See `shishi_key_print()` for an example of output text.

#### Parameters

handle | Shishi handle as allocated by `shishi_init()`. |
filename | Name of file, to which the key text is appended. |
key | Key to print. |

#### Returns

Returns `SHISHI_OK` if successful. Failures are due to I/O issues, or to allocation.

### shishi_key_parse ()

    int
    shishi_key_parse (Shishi *handle,
                      FILE *fh,
                      Shishi_key **key);

### shishi_key_random ()

    int
    shishi_key_random (Shishi *handle,
                       int32_t type,
                       Shishi_key **key);

Create a new Key information structure for the key type and some random data. KEY contains a newly allocated structure only if this function is successful.

#### Parameters

handle | Shishi library handle create by `shishi_init()`. |
type | type of key. |
key | pointer to structure that will hold newly created key information |

#### Returns

Returns SHISHI_OK iff successful.

### shishi_key_from_value ()

    int
    shishi_key_from_value (Shishi *handle,
                           int32_t type,
                           const char *value,
                           Shishi_key **key);

Create a new Key information structure, and set the key type and key value. KEY contains a newly allocated structure only if this function is successful.

#### Parameters

handle | Shishi library handle create by `shishi_init()`. |
type | type of key. |
value | input array with key value, or NULL. |
key | pointer to structure that will hold newly created key information |

#### Returns

Returns SHISHI_OK iff successful.

### shishi_key_from_base64 ()

    int
    shishi_key_from_base64 (Shishi *handle,
                            int32_t type,
                            const char *value,
                            Shishi_key **key);

Create a new Key information structure, and set the key type and key value. KEY contains a newly allocated structure only if this function is successful.

#### Parameters

handle | Shishi library handle create by `shishi_init()`. |
type | type of key. |
value | input string with base64 encoded key value, or NULL. |
key | pointer to structure that will hold newly created key information |

#### Returns

Returns SHISHI_INVALID_KEY if the base64 encoded key length doesn't match the key type, and SHISHI_OK on success.

### shishi_key_from_random ()

    int
    shishi_key_from_random (Shishi *handle,
                            int32_t type,
                            const char *rnd,
                            size_t rndlen,
                            Shishi_key **outkey);

Create a new Key information structure, and set the key type and key value using `shishi_random_to_key()`. KEY contains a newly allocated structure only if this function is successful.

#### Parameters

handle | Shishi library handle create by `shishi_init()`. |
type | type of key. |
rnd | random data. |
rndlen | length of random data. |
outkey | pointer to structure that will hold newly created key information |

#### Returns

Returns SHISHI_OK iff successful.

### shishi_key_from_string ()

    int
    shishi_key_from_string (Shishi *handle,
                            int32_t type,
                            const char *password,
                            size_t passwordlen,
                            const char *salt,
                            size_t saltlen,
                            const char *parameter,
                            Shishi_key **outkey);

Create a new Key information structure, and set the key type and key value using `shishi_string_to_key()`. KEY contains a newly allocated structure only if this function is successful.

#### Parameters

handle | Shishi library handle create by `shishi_init()`. |
type | type of key. |
password | input array containing password. |
passwordlen | length of input array containing password. |
salt | input array containing salt. |
saltlen | length of input array containing salt. |
parameter | input array with opaque encryption type specific information. |
outkey | pointer to structure that will hold newly created key information |

#### Returns

Returns SHISHI_OK iff successful.

### shishi_key_from_name ()

    int
    shishi_key_from_name (Shishi *handle,
                          int32_t type,
                          const char *name,
                          const char *password,
                          size_t passwordlen,
                          const char *parameter,
                          Shishi_key **outkey);

Create a new Key information structure, and derive the key from principal name and password using `shishi_key_from_name()`. The salt is derived from the principal name by concatenating the decoded realm and principal.

#### Parameters

handle | Shishi library handle create by `shishi_init()`. |
type | type of key. |
name | principal name of user. |
password | input array containing password. |
passwordlen | length of input array containing password. |
parameter | input array with opaque encryption type specific information. |
outkey | pointer to structure that will hold newly created key information |

#### Returns

Returns SHISHI_OK iff successful.

### shishi_keys ()

    int
    shishi_keys (Shishi *handle,
                 Shishi_keys **keys);

Get a new key set handle.

#### Parameters

handle | shishi handle as allocated by `shishi_init()`. |
keys | output pointer to newly allocated keys handle. |

#### Returns

Returns `SHISHI_OK` iff successful.

### shishi_keys_done ()

    void
    shishi_keys_done (Shishi_keys **keys);

Deallocates all resources associated with key set. The key set handle must not be used in calls to other shishi_keys_*() functions after this.

#### Parameters

keys | key set handle as allocated by `shishi_keys()`. |

### shishi_keys_size ()

    int
    shishi_keys_size (Shishi_keys *keys);

Get size of key set.

#### Parameters

keys | key set handle as allocated by `shishi_keys()`. |

#### Returns

Returns number of keys stored in key set.

### shishi_keys_nth ()

    const Shishi_key *
    shishi_keys_nth (Shishi_keys *keys,
                     int keyno);

Get the n:th ticket in key set.

#### Parameters

keys | key set handle as allocated by `shishi_keys()`. |
keyno | integer indicating requested key in key set. |

#### Returns

Returns a key handle to the keyno:th key in the key set, or NULL if `keys` is invalid or `keyno` is out of bounds. The first key is `keyno` 0, the second key `keyno` 1, and so on.

### shishi_keys_remove ()

    void
    shishi_keys_remove (Shishi_keys *keys,
                        int keyno);

Remove a key, indexed by `keyno` , in given key set.

#### Parameters

keys | key set handle as allocated by `shishi_keys()`. |
keyno | key number of key in the set to remove. The first key is key number 0. |

### shishi_keys_add ()

    int
    shishi_keys_add (Shishi_keys *keys,
                     Shishi_key *key);

Add a key to the key set. A deep copy of the key is stored, so changing `key` , or deallocating it, will not modify the value stored in the key set.

#### Parameters

keys | key set handle as allocated by `shishi_keys()`. |
key | key to be added to key set. |

#### Returns

Returns `SHISHI_OK` iff successful.

### shishi_keys_print ()

    int
    shishi_keys_print (Shishi_keys *keys,
                       FILE *fh);

Print all keys in set using shishi_key_print.

#### Parameters

keys | key set to print. |
fh | file handle, open for writing, to print keys to. |

#### Returns

Returns `SHISHI_OK` on success.

### shishi_keys_from_file ()

    int
    shishi_keys_from_file (Shishi_keys *keys,
                           const char *filename);

Read zero or more keys from file `filename` and append them to the keyset `keys` . See `shishi_key_print()` for the format of the input.

#### Parameters

keys | key set handle as allocated by `shishi_keys()`. |
filename | filename to read keys from. |

#### Returns

Returns `SHISHI_OK` iff successful.

Since: 0.0.42

### shishi_keys_to_file ()

    int
    shishi_keys_to_file (Shishi *handle,
                         const char *filename,
                         Shishi_keys *keys);

Print an ASCII representation of a key structure to a file, for each key in the key set. The file is appended to if it exists. See `shishi_key_print()` for the format of the output.

#### Parameters

handle | shishi handle as allocated by `shishi_init()`. |
filename | filename to append key to. |
keys | set of keys to print. |

#### Returns

Returns `SHISHI_OK` iff successful.

### shishi_keys_for_serverrealm_in_file ()

    Shishi_key *
    shishi_keys_for_serverrealm_in_file (Shishi *handle,
                                         const char *filename,
                                         const char *server,
                                         const char *realm);

Get keys that match specified `server` and `realm` from the key set file `filename` .

#### Parameters

handle | Shishi library handle create by `shishi_init()`. |
filename | file to read keys from. |
server | server name to get key for. |
realm | realm of server to get key for. |

#### Returns

Returns the key for specific server and realm, read from the indicated file, or NULL if no key could be found or an error encountered.

### shishi_keys_for_server_in_file ()

    Shishi_key *
    shishi_keys_for_server_in_file (Shishi *handle,
                                    const char *filename,
                                    const char *server);

Get key for specified `server` from `filename` .

#### Parameters

handle | Shishi library handle create by `shishi_init()`. |
filename | file to read keys from. |
server | server name to get key for. |

#### Returns

Returns the key for specific server, read from the indicated file, or NULL if no key could be found or an error encountered.

### shishi_keys_for_localservicerealm_in_file ()

    Shishi_key *
    shishi_keys_for_localservicerealm_in_file
                                   (Shishi *handle,
                                    const char *filename,
                                    const char *service,
                                    const char *realm);

Get key for specified `service` and `realm` from `filename` .

#### Parameters

handle | Shishi library handle create by `shishi_init()`. |
filename | file to read keys from. |
service | service to get key for. |
realm | realm of server to get key for, or NULL for default realm. |

#### Returns

Returns the key for the server "SERVICE/HOSTNAME`REALM` " (where HOSTNAME is the current system's hostname), read from the default host keys file (see `shishi_hostkeys_default_file()`), or NULL if no key could be found or an error encountered.

### shishi_keys_add_keytab_mem ()

    int
    shishi_keys_add_keytab_mem (Shishi *handle,
                                const char *data,
                                size_t len,
                                Shishi_keys *keys);

Read keys from a MIT keytab data structure, and add them to the key set.

The format of keytab's is proprietary, and this function support the 0x0501 and 0x0502 formats. See the section The MIT Kerberos Keytab Binary File Format in the Shishi manual for a description of the reverse-engineered format.

#### Parameters

handle | shishi handle as allocated by `shishi_init()`. |
data | constant memory buffer with keytab of `len` size. |
len | size of memory buffer with keytab data. |
keys | allocated key set to store keys in. |

#### Returns

Returns `SHISHI_KEYTAB_ERROR` if the data does not represent a valid keytab structure, and `SHISHI_OK` on success.

### shishi_keys_add_keytab_file ()

    int
    shishi_keys_add_keytab_file (Shishi *handle,
                                 const char *filename,
                                 Shishi_keys *keys);

Read keys from a MIT keytab data structure from a file, and add the keys to the key set.

The format of keytab's is proprietary, and this function support the 0x0501 and 0x0502 formats. See the section The MIT Kerberos Keytab Binary File Format in the Shishi manual for a description of the reverse-engineered format.

#### Parameters

handle | shishi handle as allocated by `shishi_init()`. |
filename | name of file to read. |
keys | allocated key set to store keys in. |

#### Returns

Returns `SHISHI_IO_ERROR` if the file cannot be read, `SHISHI_KEYTAB_ERROR` if the data cannot be parsed as a valid keytab structure, and `SHISHI_OK` on success.

### shishi_keys_from_keytab_mem ()

    int
    shishi_keys_from_keytab_mem (Shishi *handle,
                                 const char *data,
                                 size_t len,
                                 Shishi_keys **outkeys);

Create a new key set populated with keys from a MIT keytab data structure read from a memory block.

The format of keytab's is proprietary, and this function support the 0x0501 and 0x0502 formats. See the section The MIT Kerberos Keytab Binary File Format in the Shishi manual for a description of the reverse-engineered format.

#### Parameters

handle | shishi handle as allocated by `shishi_init()`. |
data | constant memory buffer with keytab of `len` size. |
len | size of memory buffer with keytab data. |
outkeys | pointer to key set that will be allocated and populated, must be deallocated by caller on succes. |

#### Returns

Returns `SHISHI_KEYTAB_ERROR` if the data does not represent a valid keytab structure, and `SHISHI_OK` on success.

### shishi_keys_from_keytab_file ()

    int
    shishi_keys_from_keytab_file (Shishi *handle,
                                  const char *filename,
                                  Shishi_keys **outkeys);

Create a new key set populated with keys from a MIT keytab data structure read from a file.

The format of keytab's is proprietary, and this function support the 0x0501 and 0x0502 formats. See the section The MIT Kerberos Keytab Binary File Format in the Shishi manual for a description of the reverse-engineered format.

#### Parameters

handle | shishi handle as allocated by `shishi_init()`. |
filename | name of file to read. |
outkeys | pointer to key set that will be allocated and populated, must be deallocated by caller on succes. |

#### Returns

Returns `SHISHI_IO_ERROR` if the file cannot be read, `SHISHI_KEYTAB_ERROR` if the data cannot be parsed as a valid keytab structure, and `SHISHI_OK` on success.

### shishi_keys_to_keytab_mem ()

    int
    shishi_keys_to_keytab_mem (Shishi *handle,
                               Shishi_keys *keys,
                               char **out,
                               size_t *len);

Write keys to a MIT keytab data structure.

The format of keytab's is proprietary, and this function writes the 0x0502 format. See the section The MIT Kerberos Keytab Binary File Format in the Shishi manual for a description of the reverse-engineered format.

#### Parameters

handle | shishi handle as allocated by `shishi_init()`. |
keys | key set to convert to keytab format. |
out | constant memory buffer with keytab of `len` size. |
len | size of memory buffer with keytab data. |

#### Returns

On success `SHISHI_OK` is returned, otherwise an error code.

Since: 0.0.42

### shishi_keys_to_keytab_file ()

    int
    shishi_keys_to_keytab_file (Shishi *handle,
                                Shishi_keys *keys,
                                const char *filename);

Write keys to a MIT keytab data structure.

The format of keytab's is proprietary, and this function writes the 0x0502 format. See the section The MIT Kerberos Keytab Binary File Format in the Shishi manual for a description of the reverse-engineered format.

#### Parameters

handle | shishi handle as allocated by `shishi_init()`. |
keys | keyset to write. |
filename | name of file to write. |

#### Returns

`SHISHI_FOPEN_ERROR` if there is a problem opening `filename` for writing, `SHISHI_IO_ERROR` if there is problem writing the file, and `SHISHI_OK` on success.

Since: 0.0.42

### shishi_hostkeys_default_file ()

    const char *
    shishi_hostkeys_default_file (Shishi *handle);

Get file name of default host key file.

#### Parameters

handle | Shishi library handle create by `shishi_init()`. |

#### Returns

Returns the default host key filename used in the library. (Not a copy of it, so don't modify or deallocate it.)

### shishi_hostkeys_default_file_set ()

    void
    shishi_hostkeys_default_file_set (Shishi *handle,
                                      const char *hostkeysfile);

Set the default host key filename used in the library. The string is copied into the library, so you can dispose of the variable immediately after calling this function.

#### Parameters

handle | Shishi library handle create by `shishi_init()`. |
hostkeysfile | string with new default hostkeys file name, or NULL to reset to default. |

### shishi_hostkeys_for_server ()

    Shishi_key *
    shishi_hostkeys_for_server (Shishi *handle,
                                const char *server);

Get host key for `server` .

#### Parameters

handle | Shishi library handle create by `shishi_init()`. |
server | server name to get key for |

#### Returns

Returns the key for specific server, read from the default host keys file (see `shishi_hostkeys_default_file()`), or NULL if no key could be found or an error encountered.

### shishi_hostkeys_for_serverrealm ()

    Shishi_key *
    shishi_hostkeys_for_serverrealm (Shishi *handle,
                                     const char *server,
                                     const char *realm);

Get host key for `server` in `realm` .

#### Parameters

handle | Shishi library handle create by `shishi_init()`. |
server | server name to get key for |
realm | realm of server to get key for. |

#### Returns

Returns the key for specific server and realm, read from the default host keys file (see `shishi_hostkeys_default_file()`), or NULL if no key could be found or an error encountered.

### shishi_hostkeys_for_localservicerealm ()

    Shishi_key *
    shishi_hostkeys_for_localservicerealm (Shishi *handle,
                                           const char *service,
                                           const char *realm);

Get host key for `service` on current host in `realm` .

#### Parameters

handle | Shishi library handle create by `shishi_init()`. |
service | service to get key for. |
realm | realm of server to get key for, or NULL for default realm. |

#### Returns

Returns the key for the server "SERVICE/HOSTNAME`REALM` " (where HOSTNAME is the current system's hostname), read from the default host keys file (see `shishi_hostkeys_default_file()`), or NULL if no key could be found or an error encountered.

### shishi_hostkeys_for_localservice ()

    Shishi_key *
    shishi_hostkeys_for_localservice (Shishi *handle,
                                      const char *service);

Get host key for `service` on current host in default realm.

#### Parameters

handle | Shishi library handle create by `shishi_init()`. |
service | service to get key for. |

#### Returns

Returns the key for the server "SERVICE/HOSTNAME" (where HOSTNAME is the current system's hostname), read from the default host keys file (see `shishi_hostkeys_default_file()`), or NULL if no key could be found or an error encountered.

### shishi_encapreppart ()

    Shishi_asn1
    shishi_encapreppart (Shishi *handle);

This function creates a new EncAPRepPart, populated with some default values. It uses the current time as returned by the system for the ctime and cusec fields.

#### Parameters

handle | shishi handle as allocated by `shishi_init()`. |

#### Returns

Returns the encapreppart or NULL on failure.

### shishi_encapreppart_time_copy ()

    int
    shishi_encapreppart_time_copy (Shishi *handle,
                                   Shishi_asn1 encapreppart,
                                   Shishi_asn1 authenticator);

Copy time fields from Authenticator into EncAPRepPart.

#### Parameters

handle | shishi handle as allocated by `shishi_init()`. |
encapreppart | EncAPRepPart as allocated by `shishi_encapreppart()`. |
authenticator | Authenticator to copy time fields from. |

#### Returns

Returns SHISHI_OK iff successful.

### shishi_encapreppart_ctime ()

    int
    shishi_encapreppart_ctime (Shishi *handle,
                               Shishi_asn1 encapreppart,
                               char **t);

Extract client time from EncAPRepPart.

#### Parameters

handle | shishi handle as allocated by `shishi_init()`. |
encapreppart | EncAPRepPart as allocated by `shishi_encapreppart()`. |
t | newly allocated zero-terminated character array with client time. |

#### Returns

Returns SHISHI_OK iff successful.

### shishi_encapreppart_ctime_set ()

    int
    shishi_encapreppart_ctime_set (Shishi *handle,
                                   Shishi_asn1 encapreppart,
                                   const char *t);

Store client time in EncAPRepPart.

#### Parameters

handle | shishi handle as allocated by `shishi_init()`. |
encapreppart | EncAPRepPart as allocated by `shishi_encapreppart()`. |
t | string with generalized time value to store in EncAPRepPart. |

#### Returns

Returns SHISHI_OK iff successful.

### shishi_encapreppart_cusec_get ()

    int
    shishi_encapreppart_cusec_get (Shishi *handle,
                                   Shishi_asn1 encapreppart,
                                   uint32_t *cusec);

Extract client microseconds field from EncAPRepPart.

#### Parameters

handle | shishi handle as allocated by `shishi_init()`. |
encapreppart | EncAPRepPart as allocated by `shishi_encapreppart()`. |
cusec | output integer with client microseconds field. |

#### Returns

Returns SHISHI_OK iff successful.

### shishi_encapreppart_cusec_set ()

    int
    shishi_encapreppart_cusec_set (Shishi *handle,
                                   Shishi_asn1 encapreppart,
                                   uint32_t cusec);

Set the cusec field in the Authenticator.

#### Parameters

handle | shishi handle as allocated by `shishi_init()`. |
encapreppart | EncAPRepPart as allocated by `shishi_encapreppart()`. |
cusec | client microseconds to set in authenticator, 0-999999. |

#### Returns

Returns SHISHI_OK iff successful.

### shishi_encapreppart_print ()

    int
    shishi_encapreppart_print (Shishi *handle,
                               FILE *fh,
                               Shishi_asn1 encapreppart);

Print ASCII armored DER encoding of EncAPRepPart to file.

#### Parameters

handle | shishi handle as allocated by `shishi_init()`. |
fh | file handle open for writing. |
encapreppart | EncAPRepPart to print. |

#### Returns

Returns SHISHI_OK iff successful.

### shishi_encapreppart_save ()

    int
    shishi_encapreppart_save (Shishi *handle,
                              FILE *fh,
                              Shishi_asn1 encapreppart);

Save DER encoding of EncAPRepPart to file.

#### Parameters

handle | shishi handle as allocated by `shishi_init()`. |
fh | file handle open for writing. |
encapreppart | EncAPRepPart to save. |

#### Returns

Returns SHISHI_OK iff successful.

### shishi_encapreppart_to_file ()

    int
    shishi_encapreppart_to_file (Shishi *handle,
                                 Shishi_asn1 encapreppart,
                                 int filetype,
                                 const char *filename);

Write EncAPRepPart to file in specified TYPE. The file will be truncated if it exists.

#### Parameters

handle | shishi handle as allocated by `shishi_init()`. |
encapreppart | EncAPRepPart to save. |
filetype | input variable specifying type of file to be written, see Shishi_filetype. |
filename | input variable with filename to write to. |

#### Returns

Returns SHISHI_OK iff successful.

### shishi_encapreppart_read ()

    int
    shishi_encapreppart_read (Shishi *handle,
                              FILE *fh,
                              Shishi_asn1 *encapreppart);

Read DER encoded EncAPRepPart from file and populate given variable.

#### Parameters

handle | shishi handle as allocated by `shishi_init()`. |
fh | file handle open for reading. |
encapreppart | output variable with newly allocated EncAPRepPart. |

#### Returns

Returns SHISHI_OK iff successful.

### shishi_encapreppart_parse ()

    int
    shishi_encapreppart_parse (Shishi *handle,
                               FILE *fh,
                               Shishi_asn1 *encapreppart);

Read ASCII armored DER encoded EncAPRepPart from file and populate given variable.

#### Parameters

handle | shishi handle as allocated by `shishi_init()`. |
fh | file handle open for reading. |
encapreppart | output variable with newly allocated EncAPRepPart. |

#### Returns

Returns SHISHI_OK iff successful.

### shishi_encapreppart_from_file ()

    int
    shishi_encapreppart_from_file (Shishi *handle,
                                   Shishi_asn1 *encapreppart,
                                   int filetype,
                                   const char *filename);

Read EncAPRepPart from file in specified TYPE.

#### Parameters

handle | shishi handle as allocated by `shishi_init()`. |
encapreppart | output variable with newly allocated EncAPRepPart. |
filetype | input variable specifying type of file to be read, see Shishi_filetype. |
filename | input variable with filename to read from. |

#### Returns

Returns SHISHI_OK iff successful.

### shishi_encapreppart_get_key ()

    int
    shishi_encapreppart_get_key (Shishi *handle,
                                 Shishi_asn1 encapreppart,
                                 Shishi_key **key);

Extract the subkey from the encrypted AP-REP part.

#### Parameters

handle | shishi handle as allocated by `shishi_init()`. |
encapreppart | input EncAPRepPart variable. |
key | newly allocated key. |

#### Returns

Returns `SHISHI_OK` iff successful.

### shishi_encapreppart_seqnumber_get ()

    int
    shishi_encapreppart_seqnumber_get (Shishi *handle,
                                       Shishi_asn1 encapreppart,
                                       uint32_t *seqnumber);

Extract sequence number field from EncAPRepPart.

#### Parameters

handle | shishi handle as allocated by `shishi_init()`. |
encapreppart | EncAPRepPart as allocated by `shishi_encapreppart()`. |
seqnumber | output integer with sequence number field. |

#### Returns

Returns SHISHI_OK iff successful.

### shishi_encapreppart_seqnumber_remove ()

    int
    shishi_encapreppart_seqnumber_remove (Shishi *handle,
                                          Shishi_asn1 encapreppart);

Remove sequence number field in EncAPRepPart.

#### Parameters

handle | shishi handle as allocated by `shishi_init()`. |
encapreppart | encapreppart as allocated by `shishi_encapreppart()`. |

#### Returns

Returns `SHISHI_OK` iff successful.

### shishi_encapreppart_seqnumber_set ()

    int
    shishi_encapreppart_seqnumber_set (Shishi *handle,
                                       Shishi_asn1 encapreppart,
                                       uint32_t seqnumber);

Store sequence number field in EncAPRepPart.

#### Parameters

handle | shishi handle as allocated by `shishi_init()`. |
encapreppart | encapreppart as allocated by `shishi_encapreppart()`. |
seqnumber | integer with sequence number field to store in encapreppart. |

#### Returns

Returns `SHISHI_OK` iff successful.

### shishi_apreq ()

    Shishi_asn1
    shishi_apreq (Shishi *handle);

This function creates a new AP-REQ, populated with some default values.

#### Parameters

handle | shishi handle as allocated by `shishi_init()`. |

#### Returns

Returns the AP-REQ or NULL on failure.

### shishi_apreq_parse ()

    int
    shishi_apreq_parse (Shishi *handle,
                        FILE *fh,
                        Shishi_asn1 *apreq);

Read ASCII armored DER encoded AP-REQ from file and populate given variable.

#### Parameters

handle | shishi handle as allocated by `shishi_init()`. |
fh | file handle open for reading. |
apreq | output variable with newly allocated AP-REQ. |

#### Returns

Returns SHISHI_OK iff successful.

### shishi_apreq_from_file ()

    int
    shishi_apreq_from_file (Shishi *handle,
                            Shishi_asn1 *apreq,
                            int filetype,
                            const char *filename);

Read AP-REQ from file in specified TYPE.

#### Parameters

handle | shishi handle as allocated by `shishi_init()`. |
apreq | output variable with newly allocated AP-REQ. |
filetype | input variable specifying type of file to be read, see Shishi_filetype. |
filename | input variable with filename to read from. |

#### Returns

Returns SHISHI_OK iff successful.

### shishi_apreq_print ()

    int
    shishi_apreq_print (Shishi *handle,
                        FILE *fh,
                        Shishi_asn1 apreq);

Print ASCII armored DER encoding of AP-REQ to file.

#### Parameters

handle | shishi handle as allocated by `shishi_init()`. |
fh | file handle open for writing. |
apreq | AP-REQ to print. |

#### Returns

Returns SHISHI_OK iff successful.

### shishi_apreq_to_file ()

    int
    shishi_apreq_to_file (Shishi *handle,
                          Shishi_asn1 apreq,
                          int filetype,
                          const char *filename);

Write AP-REQ to file in specified TYPE. The file will be truncated if it exists.

#### Parameters

handle | shishi handle as allocated by `shishi_init()`. |
apreq | AP-REQ to save. |
filetype | input variable specifying type of file to be written, see Shishi_filetype. |
filename | input variable with filename to write to. |

#### Returns

Returns SHISHI_OK iff successful.

### shishi_apreq_read ()

    int
    shishi_apreq_read (Shishi *handle,
                       FILE *fh,
                       Shishi_asn1 *apreq);

Read DER encoded AP-REQ from file and populate given variable.

#### Parameters

handle | shishi handle as allocated by `shishi_init()`. |
fh | file handle open for reading. |
apreq | output variable with newly allocated AP-REQ. |

#### Returns

Returns SHISHI_OK iff successful.

### shishi_apreq_save ()

    int
    shishi_apreq_save (Shishi *handle,
                       FILE *fh,
                       Shishi_asn1 apreq);

Save DER encoding of AP-REQ to file.

#### Parameters

handle | shishi handle as allocated by `shishi_init()`. |
fh | file handle open for writing. |
apreq | AP-REQ to save. |

#### Returns

Returns SHISHI_OK iff successful.

### shishi_apreq_set_ticket ()

    int
    shishi_apreq_set_ticket (Shishi *handle,
                             Shishi_asn1 apreq,
                             Shishi_asn1 ticket);

Copy ticket into AP-REQ.

#### Parameters

handle | shishi handle as allocated by `shishi_init()`. |
apreq | AP-REQ to add ticket field to. |
ticket | input ticket to copy into AP-REQ ticket field. |

#### Returns

Returns SHISHI_OK iff successful.

### shishi_apreq_set_authenticator ()

    int
    shishi_apreq_set_authenticator (Shishi *handle,
                                    Shishi_asn1 apreq,
                                    int32_t etype,
                                    uint32_t kvno,
                                    const char *buf,
                                    size_t buflen);

Set the encrypted authenticator field in the AP-REP. The encrypted data is usually created by calling `shishi_encrypt()` on the DER encoded authenticator. To save time, you may want to use `shishi_apreq_add_authenticator()` instead, which calculates the encrypted data and calls this function in one step.

#### Parameters

handle | shishi handle as allocated by `shishi_init()`. |
apreq | AP-REQ to add authenticator field to. |
etype | encryption type used to encrypt authenticator. |
kvno | version of the key used to encrypt authenticator. |
buf | input array with encrypted authenticator. |
buflen | size of input array with encrypted authenticator. |

#### Returns

Returns SHISHI_OK on success.

### shishi_apreq_add_authenticator ()

    int
    shishi_apreq_add_authenticator (Shishi *handle,
                                    Shishi_asn1 apreq,
                                    Shishi_key *key,
                                    int keyusage,
                                    Shishi_asn1 authenticator);

Encrypts DER encoded authenticator using key and store it in the AP-REQ.

#### Parameters

handle | shishi handle as allocated by `shishi_init()`. |
apreq | AP-REQ to add authenticator field to. |
key | key to to use for encryption. |
keyusage | cryptographic key usage value to use in encryption. |
authenticator | authenticator as allocated by `shishi_authenticator()`. |

#### Returns

Returns SHISHI_OK iff successful.

### shishi_apreq_options ()

    int
    shishi_apreq_options (Shishi *handle,
                          Shishi_asn1 apreq,
                          uint32_t *flags);

Extract the AP-Options from AP-REQ into output integer.

#### Parameters

handle | shishi handle as allocated by `shishi_init()`. |
apreq | AP-REQ to get options from. |
flags | Output integer containing options from AP-REQ. |

#### Returns

Returns SHISHI_OK iff successful.

### shishi_apreq_use_session_key_p ()

    int
    shishi_apreq_use_session_key_p (Shishi *handle,
                                    Shishi_asn1 apreq);

Return non-0 iff the "Use session key" option is set in the AP-REQ.

#### Parameters

handle | shishi handle as allocated by `shishi_init()`. |
apreq | AP-REQ as allocated by `shishi_apreq()`. |

#### Returns

Returns SHISHI_OK iff successful.

### shishi_apreq_mutual_required_p ()

    int
    shishi_apreq_mutual_required_p (Shishi *handle,
                                    Shishi_asn1 apreq);

Return non-0 iff the "Mutual required" option is set in the AP-REQ.

#### Parameters

handle | shishi handle as allocated by `shishi_init()`. |
apreq | AP-REQ as allocated by `shishi_apreq()`. |

#### Returns

Returns SHISHI_OK iff successful.

### shishi_apreq_options_set ()

    int
    shishi_apreq_options_set (Shishi *handle,
                              Shishi_asn1 apreq,
                              uint32_t options);

Set the AP-Options in AP-REQ to indicate integer.

#### Parameters

handle | shishi handle as allocated by `shishi_init()`. |
apreq | AP-REQ as allocated by `shishi_apreq()`. |
options | Options to set in AP-REQ. |

#### Returns

Returns SHISHI_OK iff successful.

### shishi_apreq_options_add ()

    int
    shishi_apreq_options_add (Shishi *handle,
                              Shishi_asn1 apreq,
                              uint32_t option);

Add the AP-Options in AP-REQ. Options not set in input parameter `option` are preserved in the AP-REQ.

#### Parameters

handle | shishi handle as allocated by `shishi_init()`. |
apreq | AP-REQ as allocated by `shishi_apreq()`. |
option | Options to add in AP-REQ. |

#### Returns

Returns SHISHI_OK iff successful.

### shishi_apreq_options_remove ()

    int
    shishi_apreq_options_remove (Shishi *handle,
                                 Shishi_asn1 apreq,
                                 uint32_t option);

Remove the AP-Options from AP-REQ. Options not set in input parameter `option` are preserved in the AP-REQ.

#### Parameters

handle | shishi handle as allocated by `shishi_init()`. |
apreq | AP-REQ as allocated by `shishi_apreq()`. |
option | Options to remove from AP-REQ. |

#### Returns

Returns SHISHI_OK iff successful.

### shishi_apreq_get_ticket ()

    int
    shishi_apreq_get_ticket (Shishi *handle,
                             Shishi_asn1 apreq,
                             Shishi_asn1 *ticket);

Extract ticket from AP-REQ.

#### Parameters

handle | shishi handle as allocated by `shishi_init()`. |
apreq | AP-REQ variable to get ticket from. |
ticket | output variable to hold extracted ticket. |

#### Returns

Returns SHISHI_OK iff successful.

### shishi_apreq_get_authenticator_etype ()

    int
    shishi_apreq_get_authenticator_etype (Shishi *handle,
                                          Shishi_asn1 apreq,
                                          int32_t *etype);

Extract AP-REQ.authenticator.etype.

#### Parameters

handle | shishi handle as allocated by `shishi_init()`. |
apreq | AP-REQ variable to get value from. |
etype | output variable that holds the value. |

#### Returns

Returns SHISHI_OK iff successful.

### shishi_apreq_decrypt ()

    int
    shishi_apreq_decrypt (Shishi *handle,
                          Shishi_asn1 apreq,
                          Shishi_key *key,
                          int keyusage,
                          Shishi_asn1 *authenticator);

### shishi_aprep ()

    Shishi_asn1
    shishi_aprep (Shishi *handle);

This function creates a new AP-REP, populated with some default values.

#### Parameters

handle | shishi handle as allocated by `shishi_init()`. |

#### Returns

Returns the authenticator or NULL on failure.

### shishi_aprep_print ()

    int
    shishi_aprep_print (Shishi *handle,
                        FILE *fh,
                        Shishi_asn1 aprep);

Print ASCII armored DER encoding of AP-REP to file.

#### Parameters

handle | shishi handle as allocated by `shishi_init()`. |
fh | file handle open for writing. |
aprep | AP-REP to print. |

#### Returns

Returns SHISHI_OK iff successful.

### shishi_aprep_save ()

    int
    shishi_aprep_save (Shishi *handle,
                       FILE *fh,
                       Shishi_asn1 aprep);

Save DER encoding of AP-REP to file.

#### Parameters

handle | shishi handle as allocated by `shishi_init()`. |
fh | file handle open for writing. |
aprep | AP-REP to save. |

#### Returns

Returns SHISHI_OK iff successful.

### shishi_aprep_to_file ()

    int
    shishi_aprep_to_file (Shishi *handle,
                          Shishi_asn1 aprep,
                          int filetype,
                          const char *filename);

Write AP-REP to file in specified TYPE. The file will be truncated if it exists.

#### Parameters

handle | shishi handle as allocated by `shishi_init()`. |
aprep | AP-REP to save. |
filetype | input variable specifying type of file to be written, see Shishi_filetype. |
filename | input variable with filename to write to. |

#### Returns

Returns SHISHI_OK iff successful.

### shishi_aprep_read ()

    int
    shishi_aprep_read (Shishi *handle,
                       FILE *fh,
                       Shishi_asn1 *aprep);

Read DER encoded AP-REP from file and populate given variable.

#### Parameters

handle | shishi handle as allocated by `shishi_init()`. |
fh | file handle open for reading. |
aprep | output variable with newly allocated AP-REP. |

#### Returns

Returns SHISHI_OK iff successful.

### shishi_aprep_parse ()

    int
    shishi_aprep_parse (Shishi *handle,
                        FILE *fh,
                        Shishi_asn1 *aprep);

Read ASCII armored DER encoded AP-REP from file and populate given variable.

#### Parameters

handle | shishi handle as allocated by `shishi_init()`. |
fh | file handle open for reading. |
aprep | output variable with newly allocated AP-REP. |

#### Returns

Returns SHISHI_OK iff successful.

### shishi_aprep_from_file ()

    int
    shishi_aprep_from_file (Shishi *handle,
                            Shishi_asn1 *aprep,
                            int filetype,
                            const char *filename);

Read AP-REP from file in specified TYPE.

#### Parameters

handle | shishi handle as allocated by `shishi_init()`. |
aprep | output variable with newly allocated AP-REP. |
filetype | input variable specifying type of file to be read, see Shishi_filetype. |
filename | input variable with filename to read from. |

#### Returns

Returns SHISHI_OK iff successful.

### shishi_aprep_decrypt ()

    int
    shishi_aprep_decrypt (Shishi *handle,
                          Shishi_asn1 aprep,
                          Shishi_key *key,
                          int keyusage,
                          Shishi_asn1 *encapreppart);

### shishi_aprep_verify ()

    int
    shishi_aprep_verify (Shishi *handle,
                         Shishi_asn1 authenticator,
                         Shishi_asn1 encapreppart);

### shishi_aprep_enc_part_set ()

    int
    shishi_aprep_enc_part_set (Shishi *handle,
                               Shishi_asn1 aprep,
                               int etype,
                               const char *buf,
                               size_t buflen);

### shishi_aprep_enc_part_add ()

    int
    shishi_aprep_enc_part_add (Shishi *handle,
                               Shishi_asn1 aprep,
                               Shishi_asn1 encticketpart,
                               Shishi_asn1 encapreppart);

### shishi_aprep_enc_part_make ()

    int
    shishi_aprep_enc_part_make (Shishi *handle,
                                Shishi_asn1 aprep,
                                Shishi_asn1 encapreppart,
                                Shishi_asn1 authenticator,
                                Shishi_asn1 encticketpart);

### shishi_aprep_get_enc_part_etype ()

    int
    shishi_aprep_get_enc_part_etype (Shishi *handle,
                                     Shishi_asn1 aprep,
                                     int32_t *etype);

Extract AP-REP.enc-part.etype.

#### Parameters

handle | shishi handle as allocated by `shishi_init()`. |
aprep | AP-REP variable to get value from. |
etype | output variable that holds the value. |

#### Returns

Returns SHISHI_OK iff successful.

### shishi_kdc_sendrecv ()

    int
    shishi_kdc_sendrecv (Shishi *handle,
                         const char *realm,
                         const char *indata,
                         size_t inlen,
                         char **outdata,
                         size_t *outlen);

Send packet to KDC for realm and receive response. The code finds KDC addresses from configuration file, then by querying for SRV records for the realm, and finally by using the realm name as a hostname.

#### Parameters

handle | Shishi library handle create by `shishi_init()`. |
realm | string with realm name. |
indata | Packet to send to KDC. |
inlen | Length of `indata` . |
outdata | Newly allocated string with data returned from KDC. |
outlen | Length of `outdata` . |

#### Returns

`SHISHI_OK` on success, `SHISHI_KDC_TIMEOUT` if a timeout was reached, or other errors.

### shishi_kdc_sendrecv_hint ()

    int
    shishi_kdc_sendrecv_hint (Shishi *handle,
                              const char *realm,
                              const char *indata,
                              size_t inlen,
                              char **outdata,
                              size_t *outlen,
                              Shishi_tkts_hint *hint);

Send packet to KDC for realm and receive response. The code finds KDC addresses from configuration file, then by querying for SRV records for the realm, and finally by using the realm name as a hostname.

#### Parameters

handle | Shishi library handle create by `shishi_init()`. |
realm | string with realm name. |
indata | Packet to send to KDC. |
inlen | Length of `indata` . |
outdata | Newly allocated string with data returned from KDC. |
outlen | Length of `outdata` . |
hint | a Shishi_tkts_hint structure with flags. |

#### Returns

`SHISHI_OK` on success, `SHISHI_KDC_TIMEOUT` if a timeout was reached, or other errors.

### shishi_encticketpart ()

    Shishi_asn1
    shishi_encticketpart (Shishi *handle);

### shishi_encticketpart_key_set ()

    int
    shishi_encticketpart_key_set (Shishi *handle,
                                  Shishi_asn1 encticketpart,
                                  Shishi_key *key);

Set the EncTicketPart.key field to key type and value of supplied key.

#### Parameters

handle | shishi handle as allocated by `shishi_init()`. |
encticketpart | input EncTicketPart variable. |
key | key handle with information to store in encticketpart. |

#### Returns

Returns `SHISHI_OK` iff successful.

### shishi_encticketpart_get_key ()

    int
    shishi_encticketpart_get_key (Shishi *handle,
                                  Shishi_asn1 encticketpart,
                                  Shishi_key **key);

Extract the session key in the Ticket.

#### Parameters

handle | shishi handle as allocated by `shishi_init()`. |
encticketpart | input EncTicketPart variable. |
key | newly allocated key. |

#### Returns

Returns `SHISHI_OK` iff successful.

### shishi_encticketpart_crealm ()

    int
    shishi_encticketpart_crealm (Shishi *handle,
                                 Shishi_asn1 encticketpart,
                                 char **crealm,
                                 size_t *crealmlen);

### shishi_encticketpart_crealm_set ()

    int
    shishi_encticketpart_crealm_set (Shishi *handle,
                                     Shishi_asn1 encticketpart,
                                     const char *realm);

Set the realm field in the KDC-REQ.

#### Parameters

handle | shishi handle as allocated by `shishi_init()`. |
encticketpart | input EncTicketPart variable. |
realm | input array with name of realm. |

#### Returns

Returns SHISHI_OK iff successful.

### shishi_encticketpart_client ()

    int
    shishi_encticketpart_client (Shishi *handle,
                                 Shishi_asn1 encticketpart,
                                 char **client,
                                 size_t *clientlen);

Represent client principal name in EncTicketPart as zero-terminated string. The string is allocate by this function, and it is the responsibility of the caller to deallocate it. Note that the output length `clientlen` does not include the terminating zero.

#### Parameters

handle | Shishi library handle create by `shishi_init()`. |
encticketpart | EncTicketPart variable to get client name from. |
client | pointer to newly allocated zero terminated string containing principal name. May be `NULL` (to only populate `clientlen` ). |
clientlen | pointer to length of `client` on output, excluding terminating zero. May be `NULL` (to only populate `client` ). |

#### Returns

Returns SHISHI_OK iff successful.

### shishi_encticketpart_clientrealm ()

    int
    shishi_encticketpart_clientrealm (Shishi *handle,
                                      Shishi_asn1 encticketpart,
                                      char **client,
                                      size_t *clientlen);

Convert cname and realm fields from EncTicketPart to printable principal name format. The string is allocate by this function, and it is the responsibility of the caller to deallocate it. Note that the output length `clientlen` does not include the terminating zero.

#### Parameters

handle | Shishi library handle create by `shishi_init()`. |
encticketpart | EncTicketPart variable to get client name and realm from. |
client | pointer to newly allocated zero terminated string containing principal name and realm. May be `NULL` (to only populate `clientlen` ). |
clientlen | pointer to length of `client` on output, excluding terminating zero. May be `NULL` (to only populate `client` ). |

#### Returns

Returns SHISHI_OK iff successful.

### shishi_encticketpart_cname_set ()

    int
    shishi_encticketpart_cname_set (Shishi *handle,
                                    Shishi_asn1 encticketpart,
                                    Shishi_name_type name_type,
                                    const char *principal);

Set the client name field in the EncTicketPart.

#### Parameters

handle | shishi handle as allocated by `shishi_init()`. |
encticketpart | input EncTicketPart variable. |
name_type | type of principial, see Shishi_name_type, usually SHISHI_NT_UNKNOWN. |
principal | input array with principal name. |

#### Returns

Returns SHISHI_OK iff successful.

### shishi_encticketpart_print ()

    int
    shishi_encticketpart_print (Shishi *handle,
                                FILE *fh,
                                Shishi_asn1 encticketpart);

### shishi_encticketpart_flags_set ()

    int
    shishi_encticketpart_flags_set (Shishi *handle,
                                    Shishi_asn1 encticketpart,
                                    int flags);

Set the EncTicketPart.flags to supplied value.

#### Parameters

handle | shishi handle as allocated by `shishi_init()`. |
encticketpart | input EncTicketPart variable. |
flags | flags to set in encticketpart. |

#### Returns

Returns `SHISHI_OK` iff successful.

### shishi_encticketpart_transited_set ()

    int
    shishi_encticketpart_transited_set (Shishi *handle,
                                        Shishi_asn1 encticketpart,
                                        int32_t trtype,
                                        const char *trdata,
                                        size_t trdatalen);

Set the EncTicketPart.transited field to supplied value.

#### Parameters

handle | shishi handle as allocated by `shishi_init()`. |
encticketpart | input EncTicketPart variable. |
trtype | transitedencoding type, e.g. SHISHI_TR_DOMAIN_X500_COMPRESS. |
trdata | actual transited realm data. |
trdatalen | length of actual transited realm data. |

#### Returns

Returns `SHISHI_OK` iff successful.

### shishi_encticketpart_authtime_set ()

    int
    shishi_encticketpart_authtime_set (Shishi *handle,
                                       Shishi_asn1 encticketpart,
                                       const char *authtime);

Set the EncTicketPart.authtime to supplied value.

#### Parameters

handle | shishi handle as allocated by `shishi_init()`. |
encticketpart | input EncTicketPart variable. |
authtime | character buffer containing a generalized time string. |

#### Returns

Returns `SHISHI_OK` iff successful.

### shishi_encticketpart_endtime_set ()

    int
    shishi_encticketpart_endtime_set (Shishi *handle,
                                      Shishi_asn1 encticketpart,
                                      const char *endtime);

Set the EncTicketPart.endtime to supplied value.

#### Parameters

handle | shishi handle as allocated by `shishi_init()`. |
encticketpart | input EncTicketPart variable. |
endtime | character buffer containing a generalized time string. |

#### Returns

Returns `SHISHI_OK` iff successful.

### shishi_encticketpart_authtime ()

    int
    shishi_encticketpart_authtime (Shishi *handle,
                                   Shishi_asn1 encticketpart,
                                   char *authtime,
                                   size_t *authtimelen);

### shishi_encticketpart_authctime ()

    time_t
    shishi_encticketpart_authctime (Shishi *handle,
                                    Shishi_asn1 encticketpart);

### shishi_safe ()

    int
    shishi_safe (Shishi *handle,
                 Shishi_safe **safe);

Create a new SAFE exchange.

#### Parameters

handle | shishi handle as allocated by `shishi_init()`. |
safe | pointer to new structure that holds information about SAFE exchange |

#### Returns

Returns SHISHI_OK iff successful.

### shishi_safe_done ()

    void
    shishi_safe_done (Shishi_safe *safe);

Deallocate resources associated with SAFE exchange. This should be called by the application when it no longer need to utilize the SAFE exchange handle.

#### Parameters

safe | structure that holds information about SAFE exchange |

### shishi_safe_key ()

    Shishi_key *
    shishi_safe_key (Shishi_safe *safe);

Get key structured from SAFE exchange.

#### Parameters

safe | structure that holds information about SAFE exchange |

#### Returns

Returns the key used in the SAFE exchange, or NULL if not yet set or an error occured.

### shishi_safe_key_set ()

    void
    shishi_safe_key_set (Shishi_safe *safe,
                         Shishi_key *key);

Set the Key in the SAFE exchange.

#### Parameters

safe | structure that holds information about SAFE exchange |
key | key to store in SAFE. |

### shishi_safe_safe ()

    Shishi_asn1
    shishi_safe_safe (Shishi_safe *safe);

Get ASN.1 SAFE structured from SAFE exchange.

#### Parameters

safe | structure that holds information about SAFE exchange |

#### Returns

Returns the ASN.1 safe in the SAFE exchange, or NULL if not yet set or an error occured.

### shishi_safe_safe_set ()

    void
    shishi_safe_safe_set (Shishi_safe *safe,
                          Shishi_asn1 asn1safe);

Set the KRB-SAFE in the SAFE exchange.

#### Parameters

safe | structure that holds information about SAFE exchange |
asn1safe | KRB-SAFE to store in SAFE exchange. |

### shishi_safe_safe_der ()

    int
    shishi_safe_safe_der (Shishi_safe *safe,
                          char **out,
                          size_t *outlen);

DER encode SAFE structure. Typically `shishi_safe_build()` is used to build the SAFE structure first. `out` is allocated by this function, and it is the responsibility of caller to deallocate it.

#### Parameters

safe | safe as allocated by `shishi_safe()`. |
out | output array with newly allocated DER encoding of SAFE. |
outlen | length of output array with DER encoding of SAFE. |

#### Returns

Returns SHISHI_OK iff successful.

### shishi_safe_safe_der_set ()

    int
    shishi_safe_safe_der_set (Shishi_safe *safe,
                              char *der,
                              size_t derlen);

DER decode KRB-SAFE and set it SAFE exchange. If decoding fails, the KRB-SAFE in the SAFE exchange remains.

#### Parameters

safe | safe as allocated by `shishi_safe()`. |
der | input array with DER encoded KRB-SAFE. |
derlen | length of input array with DER encoded KRB-SAFE. |

#### Returns

Returns SHISHI_OK.

### shishi_safe_print ()

    int
    shishi_safe_print (Shishi *handle,
                       FILE *fh,
                       Shishi_asn1 safe);

Print ASCII armored DER encoding of SAFE to file.

#### Parameters

handle | shishi handle as allocated by `shishi_init()`. |
fh | file handle open for writing. |
safe | SAFE to print. |

#### Returns

Returns SHISHI_OK iff successful.

### shishi_safe_save ()

    int
    shishi_safe_save (Shishi *handle,
                      FILE *fh,
                      Shishi_asn1 safe);

Save DER encoding of SAFE to file.

#### Parameters

handle | shishi handle as allocated by `shishi_init()`. |
fh | file handle open for writing. |
safe | SAFE to save. |

#### Returns

Returns SHISHI_OK iff successful.

### shishi_safe_to_file ()

    int
    shishi_safe_to_file (Shishi *handle,
                         Shishi_asn1 safe,
                         int filetype,
                         const char *filename);

Write SAFE to file in specified TYPE. The file will be truncated if it exists.

#### Parameters

handle | shishi handle as allocated by `shishi_init()`. |
safe | SAFE to save. |
filetype | input variable specifying type of file to be written, see Shishi_filetype. |
filename | input variable with filename to write to. |

#### Returns

Returns SHISHI_OK iff successful.

### shishi_safe_parse ()

    int
    shishi_safe_parse (Shishi *handle,
                       FILE *fh,
                       Shishi_asn1 *safe);

Read ASCII armored DER encoded SAFE from file and populate given variable.

#### Parameters

handle | shishi handle as allocated by `shishi_init()`. |
fh | file handle open for reading. |
safe | output variable with newly allocated SAFE. |

#### Returns

Returns SHISHI_OK iff successful.

### shishi_safe_read ()

    int
    shishi_safe_read (Shishi *handle,
                      FILE *fh,
                      Shishi_asn1 *safe);

Read DER encoded SAFE from file and populate given variable.

#### Parameters

handle | shishi handle as allocated by `shishi_init()`. |
fh | file handle open for reading. |
safe | output variable with newly allocated SAFE. |

#### Returns

Returns SHISHI_OK iff successful.

### shishi_safe_from_file ()

    int
    shishi_safe_from_file (Shishi *handle,
                           Shishi_asn1 *safe,
                           int filetype,
                           const char *filename);

Read SAFE from file in specified TYPE.

#### Parameters

handle | shishi handle as allocated by `shishi_init()`. |
safe | output variable with newly allocated SAFE. |
filetype | input variable specifying type of file to be read, see Shishi_filetype. |
filename | input variable with filename to read from. |

#### Returns

Returns SHISHI_OK iff successful.

### shishi_safe_cksum ()

    int
    shishi_safe_cksum (Shishi *handle,
                       Shishi_asn1 safe,
                       int32_t *cksumtype,
                       char **cksum,
                       size_t *cksumlen);

Read checksum value from KRB-SAFE. `cksum` is allocated by this function, and it is the responsibility of caller to deallocate it.

#### Parameters

handle | shishi handle as allocated by `shishi_init()`. |
safe | safe as allocated by `shishi_safe()`. |
cksumtype | output checksum type. |
cksum | output array with newly allocated checksum data from SAFE. |
cksumlen | output size of output checksum data buffer. |

#### Returns

Returns SHISHI_OK iff successful.

### shishi_safe_set_cksum ()

    int
    shishi_safe_set_cksum (Shishi *handle,
                           Shishi_asn1 safe,
                           int32_t cksumtype,
                           const char *cksum,
                           size_t cksumlen);

Store checksum value in SAFE. A checksum is usually created by calling `shishi_checksum()` on some application specific data using the key from the ticket that is being used. To save time, you may want to use `shishi_safe_build()` instead, which calculates the checksum and calls this function in one step.

#### Parameters

handle | shishi handle as allocated by `shishi_init()`. |
safe | safe as allocated by `shishi_safe()`. |
cksumtype | input checksum type to store in SAFE. |
cksum | input checksum data to store in SAFE. |
cksumlen | size of input checksum data to store in SAFE. |

#### Returns

Returns SHISHI_OK iff successful.

### shishi_safe_user_data ()

    int
    shishi_safe_user_data (Shishi *handle,
                           Shishi_asn1 safe,
                           char **userdata,
                           size_t *userdatalen);

Read user data value from KRB-SAFE. `userdata` is allocated by this function, and it is the responsibility of caller to deallocate it.

#### Parameters

handle | shishi handle as allocated by `shishi_init()`. |
safe | safe as allocated by `shishi_safe()`. |
userdata | output array with newly allocated user data from KRB-SAFE. |
userdatalen | output size of output user data buffer. |

#### Returns

Returns SHISHI_OK iff successful.

### shishi_safe_set_user_data ()

    int
    shishi_safe_set_user_data (Shishi *handle,
                               Shishi_asn1 safe,
                               const char *userdata,
                               size_t userdatalen);

Set the application data in SAFE.

#### Parameters

handle | shishi handle as allocated by `shishi_init()`. |
safe | safe as allocated by `shishi_safe()`. |
userdata | input user application to store in SAFE. |
userdatalen | size of input user application to store in SAFE. |

#### Returns

Returns SHISHI_OK iff successful.

### shishi_safe_build ()

    int
    shishi_safe_build (Shishi_safe *safe,
                       Shishi_key *key);

Build checksum and set it in KRB-SAFE. Note that this follows RFC 1510bis and is incompatible with RFC 1510, although presumably few implementations use the RFC1510 algorithm.

#### Parameters

safe | safe as allocated by `shishi_safe()`. |
key | key for session, used to compute checksum. |

#### Returns

Returns SHISHI_OK iff successful.

### shishi_safe_verify ()

    int
    shishi_safe_verify (Shishi_safe *safe,
                        Shishi_key *key);

Verify checksum in KRB-SAFE. Note that this follows RFC 1510bis and is incompatible with RFC 1510, although presumably few implementations use the RFC1510 algorithm.

#### Parameters

safe | safe as allocated by `shishi_safe()`. |
key | key for session, used to verify checksum. |

#### Returns

Returns SHISHI_OK iff successful, SHISHI_SAFE_BAD_KEYTYPE if an incompatible key type is used, or SHISHI_SAFE_VERIFY_FAILED if the actual verification failed.

### shishi_priv ()

    int
    shishi_priv (Shishi *handle,
                 Shishi_priv **priv);

Create a new PRIV exchange.

#### Parameters

handle | shishi handle as allocated by `shishi_init()`. |
priv | pointer to new structure that holds information about PRIV exchange |

#### Returns

Returns SHISHI_OK iff successful.

### shishi_priv_done ()

    void
    shishi_priv_done (Shishi_priv *priv);

Deallocate resources associated with PRIV exchange. This should be called by the application when it no longer need to utilize the PRIV exchange handle.

#### Parameters

priv | structure that holds information about PRIV exchange |

### shishi_priv_key ()

    Shishi_key *
    shishi_priv_key (Shishi_priv *priv);

Get key from PRIV exchange.

#### Parameters

priv | structure that holds information about PRIV exchange |

#### Returns

Returns the key used in the PRIV exchange, or NULL if not yet set or an error occured.

### shishi_priv_key_set ()

    void
    shishi_priv_key_set (Shishi_priv *priv,
                         Shishi_key *key);

Set the Key in the PRIV exchange.

#### Parameters

priv | structure that holds information about PRIV exchange |
key | key to store in PRIV. |

### shishi_priv_priv ()

    Shishi_asn1
    shishi_priv_priv (Shishi_priv *priv);

Get ASN.1 PRIV structure in PRIV exchange.

#### Parameters

priv | structure that holds information about PRIV exchange |

#### Returns

Returns the ASN.1 priv in the PRIV exchange, or NULL if not yet set or an error occured.

### shishi_priv_priv_set ()

    void
    shishi_priv_priv_set (Shishi_priv *priv,
                          Shishi_asn1 asn1priv);

Set the KRB-PRIV in the PRIV exchange.

#### Parameters

priv | structure that holds information about PRIV exchange |
asn1priv | KRB-PRIV to store in PRIV exchange. |

### shishi_priv_priv_der ()

    int
    shishi_priv_priv_der (Shishi_priv *priv,
                          char **out,
                          size_t *outlen);

DER encode PRIV structure. Typically `shishi_priv_build()` is used to build the PRIV structure first. `out` is allocated by this function, and it is the responsibility of caller to deallocate it.

#### Parameters

priv | priv as allocated by `shishi_priv()`. |
out | output array with newly allocated DER encoding of PRIV. |
outlen | length of output array with DER encoding of PRIV. |

#### Returns

Returns SHISHI_OK iff successful.

### shishi_priv_priv_der_set ()

    int
    shishi_priv_priv_der_set (Shishi_priv *priv,
                              char *der,
                              size_t derlen);

DER decode KRB-PRIV and set it PRIV exchange. If decoding fails, the KRB-PRIV in the PRIV exchange remains.

#### Parameters

priv | priv as allocated by `shishi_priv()`. |
der | input array with DER encoded KRB-PRIV. |
derlen | length of input array with DER encoded KRB-PRIV. |

#### Returns

Returns SHISHI_OK.

### shishi_priv_encprivpart ()

    Shishi_asn1
    shishi_priv_encprivpart (Shishi_priv *priv);

Get ASN.1 EncPrivPart structure from PRIV exchange.

#### Parameters

priv | structure that holds information about PRIV exchange |

#### Returns

Returns the ASN.1 encprivpart in the PRIV exchange, or NULL if not yet set or an error occured.

### shishi_priv_encprivpart_set ()

    void
    shishi_priv_encprivpart_set (Shishi_priv *priv,
                                 Shishi_asn1 asn1encprivpart);

Set the ENCPRIVPART in the PRIV exchange.

#### Parameters

priv | structure that holds information about PRIV exchange |
asn1encprivpart | ENCPRIVPART to store in PRIV exchange. |

### shishi_priv_encprivpart_der ()

    int
    shishi_priv_encprivpart_der (Shishi_priv *priv,
                                 char **out,
                                 size_t *outlen);

DER encode ENCPRIVPART structure. `out` is allocated by this function, and it is the responsibility of caller to deallocate it.

#### Parameters

priv | priv as allocated by `shishi_priv()`. |
out | output array with newly allocated DER encoding of ENCPRIVPART. |
outlen | length of output array with DER encoding of ENCPRIVPART. |

#### Returns

Returns SHISHI_OK iff successful.

### shishi_priv_encprivpart_der_set ()

    int
    shishi_priv_encprivpart_der_set (Shishi_priv *priv,
                                     char *der,
                                     size_t derlen);

DER decode ENCPRIVPART and set it PRIV exchange. If decoding fails, the ENCPRIVPART in the PRIV exchange remains.

#### Parameters

priv | priv as allocated by `shishi_priv()`. |
der | input array with DER encoded ENCPRIVPART. |
derlen | length of input array with DER encoded ENCPRIVPART. |

#### Returns

Returns SHISHI_OK.

### shishi_priv_print ()

    int
    shishi_priv_print (Shishi *handle,
                       FILE *fh,
                       Shishi_asn1 priv);

Print ASCII armored DER encoding of PRIV to file.

#### Parameters

handle | shishi handle as allocated by `shishi_init()`. |
fh | file handle open for writing. |
priv | PRIV to print. |

#### Returns

Returns SHISHI_OK iff successful.

### shishi_priv_save ()

    int
    shishi_priv_save (Shishi *handle,
                      FILE *fh,
                      Shishi_asn1 priv);

Save DER encoding of PRIV to file.

#### Parameters

handle | shishi handle as allocated by `shishi_init()`. |
fh | file handle open for writing. |
priv | PRIV to save. |

#### Returns

Returns SHISHI_OK iff successful.

### shishi_priv_to_file ()

    int
    shishi_priv_to_file (Shishi *handle,
                         Shishi_asn1 priv,
                         int filetype,
                         const char *filename);

Write PRIV to file in specified TYPE. The file will be truncated if it exists.

#### Parameters

handle | shishi handle as allocated by `shishi_init()`. |
priv | PRIV to save. |
filetype | input variable specifying type of file to be written, see Shishi_filetype. |
filename | input variable with filename to write to. |

#### Returns

Returns SHISHI_OK iff successful.

### shishi_priv_parse ()

    int
    shishi_priv_parse (Shishi *handle,
                       FILE *fh,
                       Shishi_asn1 *priv);

Read ASCII armored DER encoded PRIV from file and populate given variable.

#### Parameters

handle | shishi handle as allocated by `shishi_init()`. |
fh | file handle open for reading. |
priv | output variable with newly allocated PRIV. |

#### Returns

Returns SHISHI_OK iff successful.

### shishi_priv_read ()

    int
    shishi_priv_read (Shishi *handle,
                      FILE *fh,
                      Shishi_asn1 *priv);

Read DER encoded PRIV from file and populate given variable.

#### Parameters

handle | shishi handle as allocated by `shishi_init()`. |
fh | file handle open for reading. |
priv | output variable with newly allocated PRIV. |

#### Returns

Returns SHISHI_OK iff successful.

### shishi_priv_from_file ()

    int
    shishi_priv_from_file (Shishi *handle,
                           Shishi_asn1 *priv,
                           int filetype,
                           const char *filename);

Read PRIV from file in specified TYPE.

#### Parameters

handle | shishi handle as allocated by `shishi_init()`. |
priv | output variable with newly allocated PRIV. |
filetype | input variable specifying type of file to be read, see Shishi_filetype. |
filename | input variable with filename to read from. |

#### Returns

Returns SHISHI_OK iff successful.

### shishi_priv_enc_part_etype ()

    int
    shishi_priv_enc_part_etype (Shishi *handle,
                                Shishi_asn1 priv,
                                int32_t *etype);

Extract PRIV.enc-part.etype.

#### Parameters

handle | shishi handle as allocated by `shishi_init()`. |
priv | PRIV variable to get value from. |
etype | output variable that holds the value. |

#### Returns

Returns SHISHI_OK iff successful.

### shishi_priv_set_enc_part ()

    int
    shishi_priv_set_enc_part (Shishi *handle,
                              Shishi_asn1 priv,
                              int32_t etype,
                              const char *encpart,
                              size_t encpartlen);

Store encrypted data in PRIV. The encrypted data is usually created by calling `shishi_encrypt()` on some application specific data using the key from the ticket that is being used. To save time, you may want to use `shishi_priv_build()` instead, which encryptes the data and calls this function in one step.

#### Parameters

handle | shishi handle as allocated by `shishi_init()`. |
priv | priv as allocated by `shishi_priv()`. |
etype | input encryption type to store in PRIV. |
encpart | input encrypted data to store in PRIV. |
encpartlen | size of input encrypted data to store in PRIV. |

#### Returns

Returns SHISHI_OK iff successful.

### shishi_encprivpart_user_data ()

    int
    shishi_encprivpart_user_data (Shishi *handle,
                                  Shishi_asn1 encprivpart,
                                  char **userdata,
                                  size_t *userdatalen);

Read user data value from KRB-PRIV. `userdata` is allocated by this function, and it is the responsibility of caller to deallocate it.

#### Parameters

handle | shishi handle as allocated by `shishi_init()`. |
encprivpart | encprivpart as allocated by `shishi_priv()`. |
userdata | output array with newly allocated user data from KRB-PRIV. |
userdatalen | output size of output user data buffer. |

#### Returns

Returns SHISHI_OK iff successful.

### shishi_encprivpart_set_user_data ()

    int
    shishi_encprivpart_set_user_data (Shishi *handle,
                                      Shishi_asn1 encprivpart,
                                      const char *userdata,
                                      size_t userdatalen);

Set the application data in PRIV.

#### Parameters

handle | shishi handle as allocated by `shishi_init()`. |
encprivpart | encprivpart as allocated by `shishi_priv()`. |
userdata | input user application to store in PRIV. |
userdatalen | size of input user application to store in PRIV. |

#### Returns

Returns SHISHI_OK iff successful.

### shishi_priv_build ()

    int
    shishi_priv_build (Shishi_priv *priv,
                       Shishi_key *key);

Build checksum and set it in KRB-PRIV. Note that this follows RFC 1510bis and is incompatible with RFC 1510, although presumably few implementations use the RFC1510 algorithm.

#### Parameters

priv | priv as allocated by `shishi_priv()`. |
key | key for session, used to encrypt data. |

#### Returns

Returns SHISHI_OK iff successful.

### shishi_priv_process ()

    int
    shishi_priv_process (Shishi_priv *priv,
                         Shishi_key *key);

Decrypt encrypted data in KRB-PRIV and set the EncPrivPart in the PRIV exchange.

#### Parameters

priv | priv as allocated by `shishi_priv()`. |
key | key to use to decrypt EncPrivPart. |

#### Returns

Returns SHISHI_OK iff successful, SHISHI_PRIV_BAD_KEYTYPE if an incompatible key type is used, or SHISHI_CRYPTO_ERROR if the actual decryption failed.

### shishi_authorized_p ()

    int
    shishi_authorized_p (Shishi *handle,
                         Shishi_tkt *tkt,
                         const char *authzname);

Simplistic authorization of `authzname` against encrypted client principal name inside ticket. For "basic" authentication type, the principal name must coincide with `authzname` . The "k5login" authentication type attempts the MIT/Heimdal method of parsing the file "~/.k5login" for additional equivalence names.

#### Parameters

handle | shishi handle allocated by `shishi_init()`. |
tkt | input variable with ticket info. |
authzname | authorization name. |

#### Returns

Returns 1 if `authzname` is authorized for services by the encrypted principal, and 0 otherwise.

### shishi_authorization_parse ()

    int
    shishi_authorization_parse (const char *authorization);

Parse authorization type name.

#### Parameters

authorization | name of authorization type, "basic" or "k5login". |

#### Returns

Returns authorization type corresponding to a string.

### shishi_authorize_strcmp ()

    int
    shishi_authorize_strcmp (Shishi *handle,
                             const char *principal,
                             const char *authzname);

Authorization of `authzname` against desired `principal` according to "basic" authentication, i.e., testing for identical strings.

#### Parameters

handle | shishi handle allocated by `shishi_init()`. |
principal | string with desired principal name. |
authzname | authorization name. |

#### Returns

Returns 1 if `authzname` is authorized for services by the encrypted principal, and 0 otherwise.

### shishi_authorize_k5login ()

    int
    shishi_authorize_k5login (Shishi *handle,
                              const char *principal,
                              const char *authzname);

Authorization of `authzname` against desired `principal` in accordance with the MIT/Heimdal authorization method.

#### Parameters

handle | shishi handle allocated by `shishi_init()`. |
principal | string with desired principal name and realm. |
authzname | authorization name. |

#### Returns

Returns 1 if `authzname` is authorized for services by `principal` , and returns 0 otherwise.

### shishi_x509ca_default_file_guess ()

    char *
    shishi_x509ca_default_file_guess (Shishi *handle);

Guesses the default X.509 CA certificate filename; it is $HOME/.shishi/client.ca.

#### Parameters

handle | Shishi library handle create by `shishi_init()`. |

#### Returns

Returns default X.509 client certificate filename as a string that has to be deallocated with `free()` by the caller.

### shishi_x509ca_default_file_set ()

    void
    shishi_x509ca_default_file_set (Shishi *handle,
                                    const char *x509cafile);

Set the default X.509 CA certificate filename used in the library. The certificate is used during TLS connections with the KDC to authenticate the KDC. The string is copied into the library, so you can dispose of the variable immediately after calling this function.

#### Parameters

handle | Shishi library handle create by `shishi_init()`. |
x509cafile | string with new default x509 client certificate file name, or NULL to reset to default. |

### shishi_x509ca_default_file ()

    const char *
    shishi_x509ca_default_file (Shishi *handle);

Get filename for default X.509 CA certificate.

#### Parameters

handle | Shishi library handle create by `shishi_init()`. |

#### Returns

Returns the default X.509 CA certificate filename used in the library. The certificate is used during TLS connections with the KDC to authenticate the KDC. The string is not a copy, so don't modify or deallocate it.

### shishi_x509cert_default_file_guess ()

    char *
    shishi_x509cert_default_file_guess (Shishi *handle);

Guesses the default X.509 client certificate filename; it is $HOME/.shishi/client.certs.

#### Parameters

handle | Shishi library handle create by `shishi_init()`. |

#### Returns

Returns default X.509 client certificate filename as a string that has to be deallocated with `free()` by the caller.

### shishi_x509cert_default_file_set ()

    void
    shishi_x509cert_default_file_set (Shishi *handle,
                                      const char *x509certfile);

Set the default X.509 client certificate filename used in the library. The certificate is used during TLS connections with the KDC to authenticate the client. The string is copied into the library, so you can dispose of the variable immediately after calling this function.

#### Parameters

handle | Shishi library handle create by `shishi_init()`. |
x509certfile | string with new default x509 client certificate file name, or NULL to reset to default. |

### shishi_x509cert_default_file ()

    const char *
    shishi_x509cert_default_file (Shishi *handle);

Get filename for default X.509 certificate.

#### Parameters

handle | Shishi library handle create by `shishi_init()`. |

#### Returns

Returns the default X.509 client certificate filename used in the library. The certificate is used during TLS connections with the KDC to authenticate the client. The string is not a copy, so don't modify or deallocate it.

### shishi_x509key_default_file_guess ()

    char *
    shishi_x509key_default_file_guess (Shishi *handle);

Guesses the default X.509 client key filename; it is $HOME/.shishi/client.key.

#### Parameters

handle | Shishi library handle create by `shishi_init()`. |

#### Returns

Returns default X.509 client key filename as a string that has to be deallocated with `free()` by the caller.

### shishi_x509key_default_file_set ()

    void
    shishi_x509key_default_file_set (Shishi *handle,
                                     const char *x509keyfile);

Set the default X.509 client key filename used in the library. The key is used during TLS connections with the KDC to authenticate the client. The string is copied into the library, so you can dispose of the variable immediately after calling this function.

#### Parameters

handle | Shishi library handle create by `shishi_init()`. |
x509keyfile | string with new default x509 client key file name, or NULL to reset to default. |

### shishi_x509key_default_file ()

    const char *
    shishi_x509key_default_file (Shishi *handle);

Get filename for default X.509 key.

#### Parameters

handle | Shishi library handle create by `shishi_init()`. |

#### Returns

Returns the default X.509 client key filename used in the library. The key is used during TLS connections with the KDC to authenticate the client. The string is not a copy, so don't modify or deallocate it.

### shishi_get_date ()

    time_t
    shishi_get_date (const char *p,
                     const time_t *now);

### shishi_xalloc_die ()

    void
    shishi_xalloc_die (void);

### shishi_resolv ()

    Shishi_dns
    shishi_resolv (const char *zone,
                   uint16_t querytype);

Queries the DNS resolver for data of type `querytype` about the domain name `zone` . Currently, the types `SHISHI_DNS_TXT` and `SHISHI_DNS_SRV` are the only supported kinds.

After its use, the returned list should be deallocated by a call to `shishi_resolv_free()`.

#### Parameters

zone | Domain name of authentication zone, e.g. "EXAMPLE.ORG" |
querytype | Type of domain data to query for. |

#### Returns

Returns a linked list of DNS resource records, or `NULL` if the query failed.

### shishi_resolv_free ()

    void
    shishi_resolv_free (Shishi_dns rrs);

Deallocates a list of DNS resource records returned by a call to `shishi_resolv()`.

#### Parameters

rrs | List of DNS RRs as returned by `shishi_resolv()`. |

## Types and Values

### enum Shishi_rc

#### Members

SHISHI_OK |  |
SHISHI_ASN1_ERROR |  |
SHISHI_FOPEN_ERROR |  |
SHISHI_IO_ERROR |  |
SHISHI_MALLOC_ERROR |  |
SHISHI_BASE64_ERROR |  |
SHISHI_REALM_MISMATCH |  |
SHISHI_CNAME_MISMATCH |  |
SHISHI_NONCE_MISMATCH |  |
SHISHI_TGSREP_BAD_KEYTYPE |  |
SHISHI_KDCREP_BAD_KEYTYPE |  |
SHISHI_APREP_BAD_KEYTYPE |  |
SHISHI_APREP_VERIFY_FAILED |  |
SHISHI_APREQ_BAD_KEYTYPE |  |
SHISHI_TOO_SMALL_BUFFER |  |
SHISHI_DERIVEDKEY_TOO_SMALL |  |
SHISHI_KEY_TOO_LARGE |  |
SHISHI_CRYPTO_ERROR |  |
SHISHI_CRYPTO_INTERNAL_ERROR |  |
SHISHI_SOCKET_ERROR |  |
SHISHI_BIND_ERROR |  |
SHISHI_SENDTO_ERROR |  |
SHISHI_RECVFROM_ERROR |  |
SHISHI_CLOSE_ERROR |  |
SHISHI_KDC_TIMEOUT |  |
SHISHI_KDC_NOT_KNOWN_FOR_REALM |  |
SHISHI_TTY_ERROR |  |
SHISHI_GOT_KRBERROR |  |
SHISHI_HANDLE_ERROR |  |
SHISHI_INVALID_TKTS |  |
SHISHI_TICKET_BAD_KEYTYPE |  |
SHISHI_INVALID_KEY |  |
SHISHI_APREQ_DECRYPT_FAILED |  |
SHISHI_TICKET_DECRYPT_FAILED |  |
SHISHI_INVALID_TICKET |  |
SHISHI_OUT_OF_RANGE |  |
SHISHI_ASN1_NO_ELEMENT |  |
SHISHI_SAFE_BAD_KEYTYPE |  |
SHISHI_SAFE_VERIFY_FAILED |  |
SHISHI_PKCS5_INVALID_PRF |  |
SHISHI_PKCS5_INVALID_ITERATION_COUNT |  |
SHISHI_PKCS5_INVALID_DERIVED_KEY_LENGTH |  |
SHISHI_PKCS5_DERIVED_KEY_TOO_LONG |  |
SHISHI_INVALID_PRINCIPAL_NAME |  |
SHISHI_INVALID_ARGUMENT |  |
SHISHI_ASN1_NO_VALUE |  |
SHISHI_CONNECT_ERROR |  |
SHISHI_VERIFY_FAILED |  |
SHISHI_PRIV_BAD_KEYTYPE |  |
SHISHI_FILE_ERROR |  |
SHISHI_ENCAPREPPART_BAD_KEYTYPE |  |
SHISHI_GETTIMEOFDAY_ERROR |  |
SHISHI_KEYTAB_ERROR |  |
SHISHI_CCACHE_ERROR |  |
SHISHI_LAST_ERROR |  |

### enum Shishi_name_type

#### Members

SHISHI_NT_UNKNOWN |  |
SHISHI_NT_PRINCIPAL |  |
SHISHI_NT_SRV_INST |  |
SHISHI_NT_SRV_HST |  |
SHISHI_NT_SRV_XHST |  |
SHISHI_NT_UID |  |
SHISHI_NT_X500_PRINCIPAL |  |
SHISHI_NT_SMTP_NAME |  |
SHISHI_NT_ENTERPRISE |  |

### enum Shishi_padata_type

#### Members

SHISHI_PA_TGS_REQ |  |
SHISHI_PA_ENC_TIMESTAMP |  |
SHISHI_PA_PW_SALT |  |
SHISHI_PA_RESERVED |  |
SHISHI_PA_ENC_UNIX_TIME |  |
SHISHI_PA_SANDIA_SECUREID |  |
SHISHI_PA_SESAME |  |
SHISHI_PA_OSF_DCE |  |
SHISHI_PA_CYBERSAFE_SECUREID |  |
SHISHI_PA_AFS3_SALT |  |
SHISHI_PA_ETYPE_INFO |  |
SHISHI_PA_SAM_CHALLENGE |  |
SHISHI_PA_SAM_RESPONSE |  |
SHISHI_PA_PK_AS_REQ |  |
SHISHI_PA_PK_AS_REP |  |
SHISHI_PA_ETYPE_INFO2 |  |
SHISHI_PA_USE_SPECIFIED_KVNO |  |
SHISHI_PA_SAM_REDIRECT |  |
SHISHI_PA_GET_FROM_TYPED_DATA |  |
SHISHI_TD_PADATA |  |
SHISHI_PA_SAM_ETYPE_INFO |  |
SHISHI_PA_ALT_PRINC |  |
SHISHI_PA_SAM_CHALLENGE2 |  |
SHISHI_PA_SAM_RESPONSE2 |  |
SHISHI_PA_EXTRA_TGT |  |
SHISHI_TD_PKINIT_CMS_CERTIFICATES |  |
SHISHI_TD_KRB_PRINCIPAL |  |
SHISHI_TD_KRB_REALM |  |
SHISHI_TD_TRUSTED_CERTIFIERS |  |
SHISHI_TD_CERTIFICATE_INDEX |  |
SHISHI_TD_APP_DEFINED_ERROR |  |
SHISHI_TD_REQ_NONCE |  |
SHISHI_TD_REQ_SEQ |  |
SHISHI_PA_PAC_REQUEST |  |

### enum Shishi_tr_type

#### Members

SHISHI_TR_DOMAIN_X500_COMPRESS |  |

### enum Shishi_apoptions

#### Members

SHISHI_APOPTIONS_RESERVED |  |
SHISHI_APOPTIONS_USE_SESSION_KEY |  |
SHISHI_APOPTIONS_MUTUAL_REQUIRED |  |

### enum Shishi_ticketflags

#### Members

SHISHI_TICKETFLAGS_RESERVED |  |
SHISHI_TICKETFLAGS_FORWARDABLE |  |
SHISHI_TICKETFLAGS_FORWARDED |  |
SHISHI_TICKETFLAGS_PROXIABLE |  |
SHISHI_TICKETFLAGS_PROXY |  |
SHISHI_TICKETFLAGS_MAY_POSTDATE |  |
SHISHI_TICKETFLAGS_POSTDATED |  |
SHISHI_TICKETFLAGS_INVALID |  |
SHISHI_TICKETFLAGS_RENEWABLE |  |
SHISHI_TICKETFLAGS_INITIAL |  |
SHISHI_TICKETFLAGS_PRE_AUTHENT |  |
SHISHI_TICKETFLAGS_HW_AUTHENT |  |
SHISHI_TICKETFLAGS_TRANSITED_POLICY_CHECKED |  |
SHISHI_TICKETFLAGS_OK_AS_DELEGATE |  |

### enum Shishi_KDCOptions

#### Members

SHISHI_KDCOPTIONS_RESERVED |  |
SHISHI_KDCOPTIONS_FORWARDABLE |  |
SHISHI_KDCOPTIONS_FORWARDED |  |
SHISHI_KDCOPTIONS_PROXIABLE |  |
SHISHI_KDCOPTIONS_PROXY |  |
SHISHI_KDCOPTIONS_ALLOW_POSTDATE |  |
SHISHI_KDCOPTIONS_POSTDATED |  |
SHISHI_KDCOPTIONS_UNUSED7 |  |
SHISHI_KDCOPTIONS_RENEWABLE |  |
SHISHI_KDCOPTIONS_UNUSED9 |  |
SHISHI_KDCOPTIONS_UNUSED10 |  |
SHISHI_KDCOPTIONS_UNUSED11 |  |

### enum Shishi_msgtype

#### Members

SHISHI_MSGTYPE_AS_REQ |  |
SHISHI_MSGTYPE_AS_REP |  |
SHISHI_MSGTYPE_TGS_REQ |  |
SHISHI_MSGTYPE_TGS_REP |  |
SHISHI_MSGTYPE_AP_REQ |  |
SHISHI_MSGTYPE_AP_REP |  |
SHISHI_MSGTYPE_RESERVED16 |  |
SHISHI_MSGTYPE_RESERVED17 |  |
SHISHI_MSGTYPE_SAFE |  |
SHISHI_MSGTYPE_PRIV |  |
SHISHI_MSGTYPE_CRED |  |
SHISHI_MSGTYPE_ERROR |  |

### enum Shishi_lrtype

#### Members

SHISHI_LRTYPE_LAST_INITIAL_TGT_REQUEST |  |
SHISHI_LRTYPE_LAST_INITIAL_REQUEST |  |
SHISHI_LRTYPE_NEWEST_TGT_ISSUE |  |
SHISHI_LRTYPE_LAST_RENEWAL |  |
SHISHI_LRTYPE_LAST_REQUEST |  |

### enum Shishi_etype

#### Members

SHISHI_NULL |  |
SHISHI_DES_CBC_CRC |  |
SHISHI_DES_CBC_MD4 |  |
SHISHI_DES_CBC_MD5 |  |
SHISHI_DES_CBC_NONE |  |
SHISHI_DES3_CBC_NONE |  |
SHISHI_DES3_CBC_HMAC_SHA1_KD |  |
SHISHI_AES128_CTS_HMAC_SHA1_96 |  |
SHISHI_AES256_CTS_HMAC_SHA1_96 |  |
SHISHI_ARCFOUR_HMAC |  |
SHISHI_ARCFOUR_HMAC_EXP |  |

### enum Shishi_cksumtype

#### Members

SHISHI_CRC32 |  |
SHISHI_RSA_MD4 |  |
SHISHI_RSA_MD4_DES |  |
SHISHI_DES_MAC |  |
SHISHI_DES_MAC_K |  |
SHISHI_RSA_MD4_DES_K |  |
SHISHI_RSA_MD5 |  |
SHISHI_RSA_MD5_DES |  |
SHISHI_RSA_MD5_DES_GSS |  |
SHISHI_HMAC_SHA1_DES3_KD |  |
SHISHI_HMAC_SHA1_96_AES128 |  |
SHISHI_HMAC_SHA1_96_AES256 |  |
SHISHI_ARCFOUR_HMAC_MD5 |  |
SHISHI_KRB5_GSSAPI_CKSUM |  |
SHISHI_NO_CKSUMTYPE |  |

### enum Shishi_filetype

#### Members

SHISHI_FILETYPE_TEXT |  |
SHISHI_FILETYPE_DER |  |
SHISHI_FILETYPE_HEX |  |
SHISHI_FILETYPE_BASE64 |  |
SHISHI_FILETYPE_BINARY |  |

### enum Shishi_outputtype

#### Members

SHISHI_OUTPUTTYPE_NULL |  |
SHISHI_OUTPUTTYPE_STDERR |  |
SHISHI_OUTPUTTYPE_SYSLOG |  |

### enum Shishi_authorization

#### Members

SHISHI_AUTHORIZATION_BASIC |  |
SHISHI_AUTHORIZATION_K5LOGIN |  |

### enum Shishi_keyusage

#### Members

SHISHI_KEYUSAGE_ASREQ_PA_ENC_TIMESTAMP |  |
SHISHI_KEYUSAGE_ENCTICKETPART |  |
SHISHI_KEYUSAGE_ENCASREPPART |  |
SHISHI_KEYUSAGE_TGSREQ_AUTHORIZATIONDATA_TGS_SESSION_KEY |  |
SHISHI_KEYUSAGE_TGSREQ_AUTHORIZATIONDATA_TGS_AUTHENTICATOR_KEY |  |
SHISHI_KEYUSAGE_TGSREQ_APREQ_AUTHENTICATOR_CKSUM |  |
SHISHI_KEYUSAGE_TGSREQ_APREQ_AUTHENTICATOR |  |
SHISHI_KEYUSAGE_ENCTGSREPPART_SESSION_KEY |  |
SHISHI_KEYUSAGE_ENCTGSREPPART_AUTHENTICATOR_KEY |  |
SHISHI_KEYUSAGE_APREQ_AUTHENTICATOR_CKSUM |  |
SHISHI_KEYUSAGE_APREQ_AUTHENTICATOR |  |
SHISHI_KEYUSAGE_ENCAPREPPART |  |
SHISHI_KEYUSAGE_KRB_PRIV |  |
SHISHI_KEYUSAGE_KRB_CRED |  |
SHISHI_KEYUSAGE_KRB_SAFE |  |
SHISHI_KEYUSAGE_KRB_ERROR |  |
SHISHI_KEYUSAGE_AD_KDCISSUED |  |
SHISHI_KEYUSAGE_TICKET_EXTENSION |  |
SHISHI_KEYUSAGE_TICKET_EXTENSION_AUTHORIZATION |  |
SHISHI_KEYUSAGE_GSS_R1 |  |
SHISHI_KEYUSAGE_GSS_R2 |  |
SHISHI_KEYUSAGE_GSS_R3 |  |
SHISHI_KEYUSAGE_ACCEPTOR_SEAL |  |
SHISHI_KEYUSAGE_ACCEPTOR_SIGN |  |
SHISHI_KEYUSAGE_INITIATOR_SEAL |  |
SHISHI_KEYUSAGE_INITIATOR_SIGN |  |
SHISHI_KEYUSAGE_KCMD_DES |  |
SHISHI_KEYUSAGE_KCMD_INPUT |  |
SHISHI_KEYUSAGE_KCMD_OUTPUT |  |
SHISHI_KEYUSAGE_KCMD_STDERR_INPUT |  |
SHISHI_KEYUSAGE_KCMD_STDERR_OUTPUT |  |

### enum Shishi_krb_error

#### Members

SHISHI_KDC_ERR_NONE |  |
SHISHI_KDC_ERR_NAME_EXP |  |
SHISHI_KDC_ERR_SERVICE_EXP |  |
SHISHI_KDC_ERR_BAD_PVNO |  |
SHISHI_KDC_ERR_C_OLD_MAST_KVNO |  |
SHISHI_KDC_ERR_S_OLD_MAST_KVNO |  |
SHISHI_KDC_ERR_C_PRINCIPAL_UNKNOWN |  |
SHISHI_KDC_ERR_S_PRINCIPAL_UNKNOWN |  |
SHISHI_KDC_ERR_PRINCIPAL_NOT_UNIQUE |  |
SHISHI_KDC_ERR_NULL_KEY |  |
SHISHI_KDC_ERR_CANNOT_POSTDATE |  |
SHISHI_KDC_ERR_NEVER_VALID |  |
SHISHI_KDC_ERR_POLICY |  |
SHISHI_KDC_ERR_BADOPTION |  |
SHISHI_KDC_ERR_ETYPE_NOSUPP |  |
SHISHI_KDC_ERR_SUMTYPE_NOSUPP |  |
SHISHI_KDC_ERR_PADATA_TYPE_NOSUPP |  |
SHISHI_KDC_ERR_TRTYPE_NOSUPP |  |
SHISHI_KDC_ERR_CLIENT_REVOKED |  |
SHISHI_KDC_ERR_SERVICE_REVOKED |  |
SHISHI_KDC_ERR_TGT_REVOKED |  |
SHISHI_KDC_ERR_CLIENT_NOTYET |  |
SHISHI_KDC_ERR_SERVICE_NOTYET |  |
SHISHI_KDC_ERR_KEY_EXPIRED |  |
SHISHI_KDC_ERR_PREAUTH_FAILED |  |
SHISHI_KDC_ERR_PREAUTH_REQUIRED |  |
SHISHI_KDC_ERR_SERVER_NOMATCH |  |
SHISHI_KDC_ERR_MUST_USE_USER2USER |  |
SHISHI_KDC_ERR_PATH_NOT_ACCPETED |  |
SHISHI_KDC_ERR_SVC_UNAVAILABLE |  |
SHISHI_KRB_AP_ERR_BAD_INTEGRITY |  |
SHISHI_KRB_AP_ERR_TKT_EXPIRED |  |
SHISHI_KRB_AP_ERR_TKT_NYV |  |
SHISHI_KRB_AP_ERR_REPEAT |  |
SHISHI_KRB_AP_ERR_NOT_US |  |
SHISHI_KRB_AP_ERR_BADMATCH |  |
SHISHI_KRB_AP_ERR_SKEW |  |
SHISHI_KRB_AP_ERR_BADADDR |  |
SHISHI_KRB_AP_ERR_BADVERSION |  |
SHISHI_KRB_AP_ERR_MSG_TYPE |  |
SHISHI_KRB_AP_ERR_MODIFIED |  |
SHISHI_KRB_AP_ERR_BADORDER |  |
SHISHI_KRB_AP_ERR_BADKEYVER |  |
SHISHI_KRB_AP_ERR_NOKEY |  |
SHISHI_KRB_AP_ERR_MUT_FAIL |  |
SHISHI_KRB_AP_ERR_BADDIRECTION |  |
SHISHI_KRB_AP_ERR_METHOD |  |
SHISHI_KRB_AP_ERR_BADSEQ |  |
SHISHI_KRB_AP_ERR_INAPP_CKSUM |  |
SHISHI_KRB_AP_PATH_NOT_ACCEPTED |  |
SHISHI_KRB_ERR_RESPONSE_TOO_BIG |  |
SHISHI_KRB_ERR_GENERIC |  |
SHISHI_KRB_ERR_FIELD_TOOLONG |  |
SHISHI_KDC_ERROR_CLIENT_NOT_TRUSTED |  |
SHISHI_KDC_ERROR_KDC_NOT_TRUSTED |  |
SHISHI_KDC_ERROR_INVALID_SIG |  |
SHISHI_KDC_ERR_KEY_TOO_WEAK |  |
SHISHI_KDC_ERR_CERTIFICATE_MISMATCH |  |
SHISHI_KRB_AP_ERR_NO_TGT |  |
SHISHI_KDC_ERR_WRONG_REALM |  |
SHISHI_KRB_AP_ERR_USER_TO_USER_REQUIRED |  |
SHISHI_KDC_ERR_CANT_VERIFY_CERTIFICATE |  |
SHISHI_KDC_ERR_INVALID_CERTIFICATE |  |
SHISHI_KDC_ERR_REVOKED_CERTIFICATE |  |
SHISHI_KDC_ERR_REVOCATION_STATUS_UNKNOWN |  |
SHISHI_KDC_ERR_REVOCATION_STATUS_UNAVAILABLE |  |
SHISHI_KDC_ERR_CLIENT_NAME_MISMATCH |  |
SHISHI_KDC_ERR_KDC_NAME_MISMATCH |  |
SHISHI_LAST_ERROR_CODE |  |

### enum Shishi_tkts_hintflags

#### Members

SHISHI_TKTSHINTFLAGS_ACCEPT_EXPIRED |  |
SHISHI_TKTSHINTFLAGS_NON_INTERACTIVE |  |

### struct Shishi_tkts_hint

    struct Shishi_tkts_hint {
        int startpos;
        char *server;
        char *serverrealm;
        char *client;
        char *clientrealm;
        int flags;
        Shishi_ticketflags tktflags;
        Shishi_KDCOptions kdcoptions;
        int32_t etype;
        char *passwd;
        time_t starttime;
        time_t endtime;
        time_t renew_till;
        int32_t preauthetype;
        char *preauthsalt;
        size_t preauthsaltlen;
        char *preauths2kparams;
        size_t preauths2kparamslen;
    };

### struct Shishi_dns_st

    struct Shishi_dns_st {
        struct Shishi_dns_st *next;

        uint16_t class;
        uint16_t type;
        uint32_t ttl;

        void *rr;
    };

### struct Shishi_dns_srv_st

    struct Shishi_dns_srv_st {
        uint16_t priority;
        uint16_t weight;
        uint16_t port;

        char name[256];
    };

### SHISHI_DNS_IN

    # define SHISHI_DNS_IN 1

### SHISHI_DNS_TXT

    # define SHISHI_DNS_TXT 16

### SHISHI_DNS_SRV

    # define SHISHI_DNS_SRV 33

### Shishi_dns

      typedef struct Shishi_dns_st *Shishi_dns;

### Shishi_dns_srv

      typedef struct Shishi_dns_srv_st *Shishi_dns_srv;

### Shishi

      typedef struct Shishi Shishi;

### Shishi_tkt

      typedef struct Shishi_tkt Shishi_tkt;

### Shishi_tkts

      typedef struct Shishi_tkts Shishi_tkts;

### Shishi_as

      typedef struct Shishi_as Shishi_as;

### Shishi_tgs

      typedef struct Shishi_tgs Shishi_tgs;

### Shishi_ap

      typedef struct Shishi_ap Shishi_ap;

### Shishi_key

      typedef struct Shishi_key Shishi_key;

### Shishi_keys

      typedef struct Shishi_keys Shishi_keys;

### Shishi_safe

      typedef struct Shishi_safe Shishi_safe;

### Shishi_priv

      typedef struct Shishi_priv Shishi_priv;

### Shishi_asn1

      typedef ASN1_TYPE Shishi_asn1;

### Shishi_crypto

      typedef struct Shishi_crypto Shishi_crypto;

### SHISHI_GENERALIZEDTIME_LENGTH

    # define SHISHI_GENERALIZEDTIME_LENGTH 15

### SHISHI_GENERALIZEDTIMEZ_LENGTH

    # define SHISHI_GENERALIZEDTIMEZ_LENGTH (SHISHI_GENERALIZEDTIME_LENGTH + 1)