const unsigned long ITTAbsent = 0;
    const unsigned long ITTAnonymous = 1;
    const unsigned long ITTDistinguishedName = 8;
    const unsigned long ITTPrincipalName = 2;
    const unsigned long ITTX509CertChain = 4;
    const short MTCompleteEstablishContext = 1;
    const short MTContextError = 4;
    const short MTEstablishContext = 0;
    const short MTMessageInContext = 5;
    const unsigned long OMGVMCID = 324816;
    const unsigned long X509AttributeCertChain = 324817;
    struct AuthorizationElement
    {
        CSI::AuthorizationElementType the_type;
        CSI::AuthorizationElementContents the_element;
    };
    
    typedef sequence < octet > AuthorizationElementContents;
    typedef unsigned long AuthorizationElementType;
    typedef sequence < CSI::AuthorizationElement > AuthorizationToken;
    struct CompleteEstablishContext
    {
        CSI::ContextId client_context_id;
        boolean context_stateful;
        CSI::GSSToken final_context_token;
    };
    
    struct ContextError
    {
        CSI::ContextId client_context_id;
        long major_status;
        long minor_status;
        CSI::GSSToken error_token;
    };
    
    typedef unsigned long long ContextId;
    struct EstablishContext
    {
        CSI::ContextId client_context_id;
        CSI::AuthorizationToken authorization_token;
        CSI::IdentityToken identity_token;
        CSI::GSSToken client_authentication_token;
    };
    
    typedef sequence < octet > GSS_NT_ExportedName;
    typedef sequence < CSI::GSS_NT_ExportedName > GSS_NT_ExportedNameList;
    typedef sequence < octet > GSSToken;
    typedef sequence < octet > IdentityExtension;
    union IdentityToken switch (CSI::IdentityTokenType)
    {
        case ITTAbsent: boolean absent;
        case ITTAnonymous: boolean anonymous;
        case ITTPrincipalName: CSI::GSS_NT_ExportedName principal_name;
        case ITTX509CertChain: CSI::X509CertificateChain certificate_chain;
        case ITTDistinguishedName: CSI::X501DistinguishedName dn;
        default: CSI::IdentityExtension id;
    };
    
    typedef unsigned long IdentityTokenType;
    struct MessageInContext
    {
        CSI::ContextId client_context_id;
        boolean discard_context;
    };
    
    typedef short MsgType;
    typedef sequence < octet > OID;
    typedef sequence < CSI::OID > OIDList;
    union SASContextBody switch (CSI::MsgType)
    {
        case MTEstablishContext: CSI::EstablishContext establish_msg;
        case MTCompleteEstablishContext: CSI::CompleteEstablishContext complete_msg;
        case MTContextError: CSI::ContextError error_msg;
        case MTMessageInContext: CSI::MessageInContext in_context_msg;
    };
    
    typedef string StringOID;
    typedef sequence < octet > UTF8String;
    typedef sequence < octet > X501DistinguishedName;
    typedef sequence < octet > X509CertificateChain;