#include "EXTERN.h" #include "perl.h" #include "XSUB.h" #define __KRB5_MECHTYPE_OID &mygss_mech_krb5 #define __KRB5_OLD_MECHTYPE_OID &mygss_mech_krb5_old #define __SPNEGO_MECHTYPE_OID &myspnego_oid_desc #define __GSS_KRB5_NT_USER_NAME &mygss_nt_krb5_name #define __GSS_KRB5_NT_PRINCIPAL_NAME &mygss_nt_krb5_principal #define __gss_mech_krb5_v2 &mygss_mech_krb5_v2 #if defined(HEIMDAL) #include #endif #if !defined(HEIMDAL) #include #include #include #if defined(MITKERB12) /* symbols not defined in MIT Kerberos 1.2.x */ #define GSS_C_NT_USER_NAME gss_nt_user_name #define GSS_C_NT_MACHINE_UID_NAME gss_nt_machine_uid_name #define GSS_C_NT_STRING_UID_NAME gss_nt_string_uid_name #define GSS_C_NT_HOSTBASED_SERVICE gss_nt_service_name #define GSS_C_NT_EXPORT_NAME gss_nt_exported_name #endif #endif /* See http://mailman.mit.edu/pipermail/krbdev/2005-February/003193.html " */ static gss_OID_desc mygss_mech_krb5 = {9, (void *) "\x2a\x86\x48\x86\xf7\x12\x01\x02\x02"}; static gss_OID_desc mygss_mech_krb5_old = {5, (void *) "\x2b\x05\x01\x05\x02"}; static gss_OID_desc myspnego_oid_desc = {6, (void *) "\x2b\x06\x01\x05\x05\x02"}; static gss_OID_desc mygss_nt_krb5_name = {10, (void *) "\052\206\110\206\367\022\001\002\002\001"}; static gss_OID_desc mygss_nt_krb5_principal = {10, (void *) "\052\206\110\206\367\022\001\002\002\002"}; static gss_OID_desc mygss_mech_krb5_v2 = {9, (void *) "\052\206\110\206\367\022\001\002\003"}; static double constant(char *name, int len, int arg) { warn("GSSAPI.xs - function constant() should never be called"); return 0; } /* * These are not part of the GSSAPI C bindings, so we can't count on * them being defined. They are part of the Kerberos 1.2 GSSAPI binding * so we'll provide them */ #ifndef GSS_CALLING_ERROR_FIELD #define GSS_CALLING_ERROR_FIELD(x) \ (((x) >> GSS_C_CALLING_ERROR_OFFSET) & GSS_C_CALLING_ERROR_MASK) #endif #ifndef GSS_ROUTINE_ERROR_FIELD #define GSS_ROUTINE_ERROR_FIELD(x) \ (((x) >> GSS_C_ROUTINE_ERROR_OFFSET) & GSS_C_ROUTINE_ERROR_MASK) #endif #ifndef GSS_SUPPLEMENTARY_INFO_FIELD #define GSS_SUPPLEMENTARY_INFO_FIELD(x) \ (((x) >> GSS_C_SUPPLEMENTARY_OFFSET) & GSS_C_SUPPLEMENTARY_MASK) #endif typedef struct { OM_uint32 major, minor; } gss_status_desc; typedef gss_status_desc GSSAPI__Status; typedef gss_name_t GSSAPI__Name; typedef gss_OID GSSAPI__OID; typedef gss_OID_set GSSAPI__OID__Set; typedef gss_cred_id_t GSSAPI__Cred; typedef gss_ctx_id_t GSSAPI__Context; typedef gss_channel_bindings_t GSSAPI__Binding; typedef const gss_OID_desc * GSSAPI__OID_const; typedef const gss_OID_set_desc * GSSAPI__OID__Set_const; typedef gss_ctx_id_t GSSAPI__Context_Iopt; typedef gss_name_t GSSAPI__Name_out; typedef gss_OID GSSAPI__OID_out; typedef gss_OID_set GSSAPI__OID__Set_out; typedef gss_cred_id_t GSSAPI__Cred_out; typedef gss_ctx_id_t GSSAPI__Context_out; typedef gss_channel_bindings_t GSSAPI__Binding_out; typedef I32 I32_out; typedef int int_out; typedef gss_cred_usage_t gss_cred_usage_t_out; typedef U32 U32_out; typedef OM_uint32 OM_uint32_out; typedef gss_name_t * GSSAPI__Name_optout; typedef gss_OID * GSSAPI__OID_optout; typedef gss_OID_set * GSSAPI__OID__Set_optout; typedef gss_cred_id_t * GSSAPI__Cred_optout; typedef I32 * I32_optout; typedef int * int_optout; typedef gss_cred_usage_t * gss_cred_usage_t_optout; typedef U32 * U32_optout; typedef OM_uint32 * OM_uint32_optout; typedef gss_name_t GSSAPI__Name_opt; typedef gss_OID GSSAPI__OID_opt; typedef gss_OID_set GSSAPI__OID__Set_opt; typedef gss_channel_bindings_t GSSAPI__Binding_opt; typedef gss_cred_id_t GSSAPI__Cred_opt; typedef gss_ctx_id_t GSSAPI__Context_opt; typedef gss_buffer_desc gss_buffer_desc_out; typedef gss_buffer_desc gss_buffer_desc_copy; typedef gss_buffer_desc gss_buffer_str; typedef gss_buffer_desc gss_buffer_str_out; typedef void * GSSAPI_obj; int oid_set_is_dynamic(GSSAPI__OID__Set oidset) { return 1; /* 2006-02-13 all static sets are deleted */ } MODULE = GSSAPI PACKAGE = GSSAPI BOOT: { HV *stash = gv_stashpvn ("GSSAPI", 6, TRUE ); #if defined( GSS_C_ACCEPT ) newCONSTSUB( stash, "GSS_C_ACCEPT", newSVuv( GSS_C_ACCEPT ) ); #endif #if defined( GSS_C_AF_APPLETALK ) newCONSTSUB( stash, "GSS_C_AF_APPLETALK", newSVuv( GSS_C_AF_APPLETALK ) ); #endif #if defined( GSS_C_AF_BSC ) newCONSTSUB( stash, "GSS_C_AF_BSC", newSVuv( GSS_C_AF_BSC ) ); #endif #if defined( GSS_C_AF_CCITT ) newCONSTSUB( stash, "GSS_C_AF_CCITT", newSVuv( GSS_C_AF_CCITT ) ); #endif #if defined( GSS_C_AF_CHAOS ) newCONSTSUB( stash, "GSS_C_AF_CHAOS", newSVuv( GSS_C_AF_CHAOS ) ); #endif #if defined( GSS_C_AF_DATAKIT ) newCONSTSUB( stash, "GSS_C_AF_DATAKIT", newSVuv( GSS_C_AF_DATAKIT ) ); #endif #if defined( GSS_C_AF_DECnet ) newCONSTSUB( stash, "GSS_C_AF_DECnet", newSVuv( GSS_C_AF_DECnet ) ); #endif #if defined( GSS_C_AF_DLI ) newCONSTSUB( stash, "GSS_C_AF_DLI", newSVuv( GSS_C_AF_DLI ) ); #endif #if defined( GSS_C_AF_DSS ) newCONSTSUB( stash, "GSS_C_AF_DSS", newSVuv( GSS_C_AF_DSS ) ); #endif #if defined( GSS_C_AF_ECMA ) newCONSTSUB( stash, "GSS_C_AF_ECMA", newSVuv( GSS_C_AF_ECMA ) ); #endif #if defined( GSS_C_AF_HYLINK ) newCONSTSUB( stash, "GSS_C_AF_HYLINK", newSVuv( GSS_C_AF_HYLINK ) ); #endif #if defined( GSS_C_AF_IMPLINK ) newCONSTSUB( stash, "GSS_C_AF_IMPLINK", newSVuv( GSS_C_AF_IMPLINK ) ); #endif #if defined( GSS_C_AF_INET ) newCONSTSUB( stash, "GSS_C_AF_INET", newSVuv( GSS_C_AF_INET ) ); #endif #if defined( GSS_C_AF_LAT ) newCONSTSUB( stash, "GSS_C_AF_LAT", newSVuv( GSS_C_AF_LAT ) ); #endif #if defined( GSS_C_AF_LOCAL ) newCONSTSUB( stash, "GSS_C_AF_LOCAL", newSVuv( GSS_C_AF_LOCAL ) ); #endif #if defined( GSS_C_AF_NBS ) newCONSTSUB( stash, "GSS_C_AF_NBS", newSVuv( GSS_C_AF_NBS ) ); #endif #if defined( GSS_C_AF_NS ) newCONSTSUB( stash, "GSS_C_AF_NS", newSVuv( GSS_C_AF_NS ) ); #endif #if defined( GSS_C_AF_NULLADDR ) newCONSTSUB( stash, "GSS_C_AF_NULLADDR", newSVuv( GSS_C_AF_NULLADDR ) ); #endif #if defined( GSS_C_AF_OSI ) newCONSTSUB( stash, "GSS_C_AF_OSI", newSVuv( GSS_C_AF_OSI ) ); #endif #if defined( GSS_C_AF_PUP ) newCONSTSUB( stash, "GSS_C_AF_PUP", newSVuv( GSS_C_AF_PUP ) ); #endif #if defined( GSS_C_AF_SNA ) newCONSTSUB( stash, "GSS_C_AF_SNA", newSVuv( GSS_C_AF_SNA ) ); #endif #if defined( GSS_C_AF_UNSPEC ) newCONSTSUB( stash, "GSS_C_AF_UNSPEC", newSVuv( GSS_C_AF_UNSPEC ) ); #endif #if defined( GSS_C_AF_X25 ) newCONSTSUB( stash, "GSS_C_AF_X25", newSVuv( GSS_C_AF_X25 ) ); #endif #if defined( GSS_C_ANON_FLAG ) newCONSTSUB( stash, "GSS_C_ANON_FLAG", newSVuv( GSS_C_ANON_FLAG ) ); #endif #if defined( GSS_C_BOTH ) newCONSTSUB( stash, "GSS_C_BOTH", newSVuv( GSS_C_BOTH ) ); #endif #if defined( GSS_C_CALLING_ERROR_MASK ) newCONSTSUB( stash, "GSS_C_CALLING_ERROR_MASK", newSVuv( GSS_C_CALLING_ERROR_MASK ) ); #endif #if defined( GSS_C_CALLING_ERROR_OFFSET ) newCONSTSUB( stash, "GSS_C_CALLING_ERROR_OFFSET", newSVuv( GSS_C_CALLING_ERROR_OFFSET ) ); #endif #if defined( GSS_C_CONF_FLAG ) newCONSTSUB( stash, "GSS_C_CONF_FLAG", newSVuv( GSS_C_CONF_FLAG ) ); #endif #if defined( GSS_C_DELEG_FLAG ) newCONSTSUB( stash, "GSS_C_DELEG_FLAG", newSVuv( GSS_C_DELEG_FLAG ) ); #endif #if defined( GSS_C_GSS_CODE ) newCONSTSUB( stash, "GSS_C_GSS_CODE", newSVuv( GSS_C_GSS_CODE ) ); #endif #if defined( GSS_C_INDEFINITE ) newCONSTSUB( stash, "GSS_C_INDEFINITE", newSVuv( GSS_C_INDEFINITE ) ); #endif #if defined( GSS_C_INITIATE ) newCONSTSUB( stash, "GSS_C_INITIATE", newSVuv( GSS_C_INITIATE ) ); #endif #if defined( GSS_C_INTEG_FLAG ) newCONSTSUB( stash, "GSS_C_INTEG_FLAG", newSVuv( GSS_C_INTEG_FLAG ) ); #endif #if defined( GSS_C_MECH_CODE ) newCONSTSUB( stash, "GSS_C_MECH_CODE", newSVuv( GSS_C_MECH_CODE ) ); #endif #if defined( GSS_C_MUTUAL_FLAG ) newCONSTSUB( stash, "GSS_C_MUTUAL_FLAG", newSVuv( GSS_C_MUTUAL_FLAG ) ); #endif #if defined( GSS_C_PROT_READY_FLAG ) newCONSTSUB( stash, "GSS_C_PROT_READY_FLAG", newSVuv( GSS_C_PROT_READY_FLAG ) ); #endif #if defined( GSS_C_QOP_DEFAULT ) newCONSTSUB( stash, "GSS_C_QOP_DEFAULT", newSVuv( GSS_C_QOP_DEFAULT ) ); #endif #if defined( GSS_C_REPLAY_FLAG ) newCONSTSUB( stash, "GSS_C_REPLAY_FLAG", newSVuv( GSS_C_REPLAY_FLAG ) ); #endif #if defined( GSS_C_ROUTINE_ERROR_MASK ) newCONSTSUB( stash, "GSS_C_ROUTINE_ERROR_MASK", newSVuv( GSS_C_ROUTINE_ERROR_MASK ) ); #endif #if defined( GSS_C_ROUTINE_ERROR_OFFSET ) newCONSTSUB( stash, "GSS_C_ROUTINE_ERROR_OFFSET", newSVuv( GSS_C_ROUTINE_ERROR_OFFSET ) ); #endif #if defined( GSS_C_SEQUENCE_FLAG ) newCONSTSUB( stash, "GSS_C_SEQUENCE_FLAG", newSVuv( GSS_C_SEQUENCE_FLAG ) ); #endif #if defined( GSS_C_SUPPLEMENTARY_MASK ) newCONSTSUB( stash, "GSS_C_SUPPLEMENTARY_MASK", newSVuv( GSS_C_SUPPLEMENTARY_MASK ) ); #endif #if defined( GSS_C_SUPPLEMENTARY_OFFSET ) newCONSTSUB( stash, "GSS_C_SUPPLEMENTARY_OFFSET", newSVuv( GSS_C_SUPPLEMENTARY_OFFSET ) ); #endif #if defined( GSS_C_TRANS_FLAG ) newCONSTSUB( stash, "GSS_C_TRANS_FLAG", newSVuv( GSS_C_TRANS_FLAG ) ); #endif #if defined( GSS_S_BAD_BINDINGS ) newCONSTSUB( stash, "GSS_S_BAD_BINDINGS", newSVuv( GSS_S_BAD_BINDINGS ) ); #endif #if defined( GSS_S_BAD_MECH ) newCONSTSUB( stash, "GSS_S_BAD_MECH", newSVuv( GSS_S_BAD_MECH ) ); #endif #if defined( GSS_S_BAD_NAME ) newCONSTSUB( stash, "GSS_S_BAD_NAME", newSVuv( GSS_S_BAD_NAME ) ); #endif #if defined( GSS_S_BAD_NAMETYPE ) newCONSTSUB( stash, "GSS_S_BAD_NAMETYPE", newSVuv( GSS_S_BAD_NAMETYPE ) ); #endif #if defined( GSS_S_BAD_QOP ) newCONSTSUB( stash, "GSS_S_BAD_QOP", newSVuv( GSS_S_BAD_QOP ) ); #endif #if defined( GSS_S_BAD_SIG ) newCONSTSUB( stash, "GSS_S_BAD_SIG", newSVuv( GSS_S_BAD_SIG ) ); #endif #if defined( GSS_S_BAD_STATUS ) newCONSTSUB( stash, "GSS_S_BAD_STATUS", newSVuv( GSS_S_BAD_STATUS ) ); #endif #if defined( GSS_S_CALL_BAD_STRUCTURE ) newCONSTSUB( stash, "GSS_S_CALL_BAD_STRUCTURE", newSVuv( GSS_S_CALL_BAD_STRUCTURE ) ); #endif #if defined( GSS_S_CALL_INACCESSIBLE_READ ) newCONSTSUB( stash, "GSS_S_CALL_INACCESSIBLE_READ", newSVuv( GSS_S_CALL_INACCESSIBLE_READ ) ); #endif #if defined( GSS_S_CALL_INACCESSIBLE_WRITE ) newCONSTSUB( stash, "GSS_S_CALL_INACCESSIBLE_WRITE", newSVuv( GSS_S_CALL_INACCESSIBLE_WRITE ) ); #endif #if defined( GSS_S_COMPLETE ) newCONSTSUB( stash, "GSS_S_COMPLETE", newSVuv( GSS_S_COMPLETE ) ); #endif #if defined( GSS_S_CONTEXT_EXPIRED ) newCONSTSUB( stash, "GSS_S_CONTEXT_EXPIRED", newSVuv( GSS_S_CONTEXT_EXPIRED ) ); #endif #if defined( GSS_S_CONTINUE_NEEDED ) newCONSTSUB( stash, "GSS_S_CONTINUE_NEEDED", newSVuv( GSS_S_CONTINUE_NEEDED ) ); #endif #if defined( GSS_S_CREDENTIALS_EXPIRED ) newCONSTSUB( stash, "GSS_S_CREDENTIALS_EXPIRED", newSVuv( GSS_S_CREDENTIALS_EXPIRED ) ); #endif #if defined( GSS_S_CRED_UNAVAIL ) newCONSTSUB( stash, "GSS_S_CRED_UNAVAIL", newSVuv( GSS_S_CRED_UNAVAIL ) ); #endif #if defined( GSS_S_DEFECTIVE_CREDENTIAL ) newCONSTSUB( stash, "GSS_S_DEFECTIVE_CREDENTIAL", newSVuv( GSS_S_DEFECTIVE_CREDENTIAL ) ); #endif #if defined( GSS_S_DEFECTIVE_TOKEN ) newCONSTSUB( stash, "GSS_S_DEFECTIVE_TOKEN", newSVuv( GSS_S_DEFECTIVE_TOKEN ) ); #endif #if defined( GSS_S_DUPLICATE_ELEMENT ) newCONSTSUB( stash, "GSS_S_DUPLICATE_ELEMENT", newSVuv( GSS_S_DUPLICATE_ELEMENT ) ); #endif #if defined( GSS_S_DUPLICATE_TOKEN ) newCONSTSUB( stash, "GSS_S_DUPLICATE_TOKEN", newSVuv( GSS_S_DUPLICATE_TOKEN ) ); #endif #if defined( GSS_S_FAILURE ) newCONSTSUB( stash, "GSS_S_FAILURE", newSVuv( GSS_S_FAILURE ) ); #endif #if defined( GSS_S_GAP_TOKEN ) newCONSTSUB( stash, "GSS_S_GAP_TOKEN", newSVuv( GSS_S_GAP_TOKEN ) ); #endif #if defined( GSS_S_NAME_NOT_MN ) newCONSTSUB( stash, "GSS_S_NAME_NOT_MN", newSVuv( GSS_S_NAME_NOT_MN ) ); #endif #if defined( GSS_S_NO_CONTEXT ) newCONSTSUB( stash, "GSS_S_NO_CONTEXT", newSVuv( GSS_S_NO_CONTEXT ) ); #endif #if defined( GSS_S_NO_CRED ) newCONSTSUB( stash, "GSS_S_NO_CRED", newSVuv( GSS_S_NO_CRED ) ); #endif #if defined( GSS_S_OLD_TOKEN ) newCONSTSUB( stash, "GSS_S_OLD_TOKEN", newSVuv( GSS_S_OLD_TOKEN ) ); #endif #if defined( GSS_S_UNAUTHORIZED ) newCONSTSUB( stash, "GSS_S_UNAUTHORIZED", newSVuv( GSS_S_UNAUTHORIZED ) ); #endif #if defined( GSS_S_UNAVAILABLE ) newCONSTSUB( stash, "GSS_S_UNAVAILABLE", newSVuv( GSS_S_UNAVAILABLE ) ); #endif #if defined( GSS_S_UNSEQ_TOKEN ) newCONSTSUB( stash, "GSS_S_UNSEQ_TOKEN", newSVuv( GSS_S_UNSEQ_TOKEN ) ); #endif } PROTOTYPES: ENABLE int gssapi_implementation_is_heimdal() CODE: #if defined(HEIMDAL) RETVAL = 1; #endif #if !defined(HEIMDAL) RETVAL = 0; #endif OUTPUT: RETVAL double constant(sv,arg) PREINIT: STRLEN len; INPUT: SV * sv char * s = SvPV(sv, len); int arg CODE: RETVAL = constant(s,len,arg); OUTPUT: RETVAL GSSAPI::Status indicate_mechs(oidset) GSSAPI::OID::Set_out oidset CODE: RETVAL.major = gss_indicate_mechs(&RETVAL.minor, &oidset); OUTPUT: RETVAL oidset bool is_valid(object) GSSAPI_obj object CODE: RETVAL = (object != NULL); OUTPUT: RETVAL MODULE = GSSAPI PACKAGE = GSSAPI::Status INCLUDE: xs/Status.xs MODULE = GSSAPI PACKAGE = GSSAPI::Name INCLUDE: xs/Name.xs MODULE = GSSAPI PACKAGE = GSSAPI::OID INCLUDE: xs/OID.xs MODULE = GSSAPI PACKAGE = GSSAPI::OID::Set INCLUDE: xs/OID__Set.xs MODULE = GSSAPI PACKAGE = GSSAPI::Cred INCLUDE: xs/Cred.xs MODULE = GSSAPI PACKAGE = GSSAPI::Binding INCLUDE: xs/Binding.xs MODULE = GSSAPI PACKAGE = GSSAPI::Context INCLUDE: xs/Context.xs