r644: add SPNEGO auth type
[jelmer/samba4-debian.git] / source / librpc / idl / dcerpc.idl
1 #include "idl_types.h"
2
3 /*
4   the base dcerpc packet definitions - not traditionally coded as IDL,
5   but given that pidl can handle it nicely it simplifies things a lot
6   to do it this way
7
8   see http://www.opengroup.org/onlinepubs/9629399/chap12.htm for packet
9   layouts
10 */
11 [] 
12 interface dcerpc
13 {
14         typedef [public] struct {
15                 GUID uuid;
16                 uint32 if_version;
17         } dcerpc_syntax_id;
18
19         typedef struct {
20                 uint16 context_id;
21                 uint8 num_transfer_syntaxes;
22                 dcerpc_syntax_id abstract_syntax;
23                 dcerpc_syntax_id transfer_syntaxes[num_transfer_syntaxes];
24         } dcerpc_ctx_list;
25
26         typedef struct {
27                 uint16 max_xmit_frag;
28                 uint16 max_recv_frag;
29                 uint32 assoc_group_id;
30                 uint8  num_contexts;
31                 dcerpc_ctx_list ctx_list[num_contexts];
32                 [flag(NDR_ALIGN8)]    DATA_BLOB _pad;
33                 [flag(NDR_REMAINING)] DATA_BLOB auth_info;
34         } dcerpc_bind;
35
36
37         const uint8 DCERPC_REQUEST_LENGTH = 24;
38         const uint8 DCERPC_MAX_SIGN_SIZE  = 32;
39
40         typedef struct {
41                 uint32 alloc_hint;
42                 uint16 context_id;
43                 uint16 opnum;
44                 [flag(NDR_ALIGN8)]    DATA_BLOB _pad;
45                 [flag(NDR_REMAINING)] DATA_BLOB stub_and_verifier;
46         } dcerpc_request;
47
48         const int DCERPC_BIND_PROVIDER_REJECT = 2;
49         const int DCERPC_BIND_REASON_ASYNTAX  = 1;
50
51         typedef struct {
52                 uint16 result;
53                 uint16 reason;
54                 dcerpc_syntax_id syntax;
55         } dcerpc_ack_ctx;
56
57         typedef struct {
58                 uint16 max_xmit_frag;
59                 uint16 max_recv_frag;
60                 uint32 assoc_group_id;
61                 ascstr3 secondary_address;
62                 [flag(NDR_ALIGN4)]    DATA_BLOB _pad1;
63                 uint8 num_results;
64                 dcerpc_ack_ctx ctx_list[num_results];
65                 [flag(NDR_REMAINING)] DATA_BLOB auth_info;
66         } dcerpc_bind_ack;
67
68         typedef struct {
69                 uint16 reject_reason;
70                 uint32 num_versions;
71                 uint32 versions[num_versions];
72         } dcerpc_bind_nak;
73
74         const uint8 DCERPC_RESPONSE_LENGTH = 24;
75
76         typedef struct {
77                 uint32 alloc_hint;
78                 uint16 context_id;
79                 uint8 cancel_count;
80                 [flag(NDR_ALIGN8)]    DATA_BLOB _pad;
81                 [flag(NDR_REMAINING)] DATA_BLOB stub_and_verifier;
82         } dcerpc_response;
83
84
85         const int DCERPC_FAULT_OP_RNG_ERROR       = 0x1c010002;
86         const int DCERPC_FAULT_NDR                = 0x000006f7;
87         const int DCERPC_FAULT_INVALID_TAG        = 0x1c000006;
88         const int DCERPC_FAULT_CONTEXT_MISMATCH   = 0x1c00001a;
89         const int DCERPC_FAULT_OTHER              = 0x00000001;
90
91         /* we return this fault when we haven't yet run the test
92            to see what fault w2k3 returns in this case */
93         const int DCERPC_FAULT_TODO         = 0x00000042;
94
95         typedef struct {
96                 uint32 alloc_hint;
97                 uint16 context_id;
98                 uint8 cancel_count;
99                 uint32 status;
100         } dcerpc_fault;
101
102
103         const uint8 DCERPC_AUTH_TYPE_NONE     = 0;
104         const uint8 DCERPC_AUTH_TYPE_KRB5     = 1;
105         const uint8 DCERPC_AUTH_TYPE_SPNEGO   = 9;
106         const uint8 DCERPC_AUTH_TYPE_NTLMSSP  = 10;
107         const uint8 DCERPC_AUTH_TYPE_SCHANNEL = 68;
108         
109         const uint8 DCERPC_AUTH_LEVEL_NONE      = 1;
110         const uint8 DCERPC_AUTH_LEVEL_CONNECT   = 2;
111         const uint8 DCERPC_AUTH_LEVEL_CALL      = 3;
112         const uint8 DCERPC_AUTH_LEVEL_PACKET    = 4;
113         const uint8 DCERPC_AUTH_LEVEL_INTEGRITY = 5;
114         const uint8 DCERPC_AUTH_LEVEL_PRIVACY   = 6;
115
116         typedef [public] struct {
117                 uint8  auth_type; 
118                 uint8  auth_level;
119                 uint8  auth_pad_length;
120                 uint8  auth_reserved;
121                 uint32 auth_context_id;
122                 [flag(NDR_REMAINING)] DATA_BLOB credentials;
123         } dcerpc_auth;
124
125         typedef [public] struct {
126                 uint32 _pad;
127                 [flag(NDR_REMAINING)] DATA_BLOB auth_info;
128         } dcerpc_auth3;
129
130         typedef enum {
131                 DCERPC_PKT_REQUEST     =  0,
132                 DCERPC_PKT_PING        =  1,
133                 DCERPC_PKT_RESPONSE    =  2,
134                 DCERPC_PKT_FAULT       =  3,
135                 DCERPC_PKT_WORKING     =  4,
136                 DCERPC_PKT_NOCALL      =  5,
137                 DCERPC_PKT_REJECT      =  6,
138                 DCERPC_PKT_ACK         =  7,
139                 DCERPC_PKT_CL_CANCEL   =  8,
140                 DCERPC_PKT_FACK        =  9,
141                 DCERPC_PKT_CANCEL_ACK  = 10,
142                 DCERPC_PKT_BIND        = 11,
143                 DCERPC_PKT_BIND_ACK    = 12,
144                 DCERPC_PKT_BIND_NAK    = 13,
145                 DCERPC_PKT_ALTER       = 14,
146                 DCERPC_PKT_ALTER_ACK   = 15,
147                 DCERPC_PKT_AUTH3       = 16,
148                 DCERPC_PKT_SHUTDOWN    = 17,
149                 DCERPC_PKT_CO_CANCEL   = 18,
150                 DCERPC_PKT_ORPHANED    = 19
151         } dcerpc_pkt_type;
152
153         typedef [nodiscriminant] union {
154                 [case(DCERPC_PKT_REQUEST)]   dcerpc_request  request;
155                 [case(DCERPC_PKT_RESPONSE)]  dcerpc_response response;
156                 [case(DCERPC_PKT_BIND)]      dcerpc_bind     bind;
157                 [case(DCERPC_PKT_BIND_ACK)]  dcerpc_bind_ack bind_ack;
158                 [case(DCERPC_PKT_ALTER)]     dcerpc_bind     alter;
159                 [case(DCERPC_PKT_ALTER_ACK)] dcerpc_bind_ack alter_ack;
160                 [case(DCERPC_PKT_FAULT)]     dcerpc_fault    fault;
161                 [case(DCERPC_PKT_AUTH3)]     dcerpc_auth3    auth;
162                 [case(DCERPC_PKT_BIND_NAK)]  dcerpc_bind_nak bind_nak;
163         } dcerpc_payload;
164
165
166         /* pfc_flags values */
167         const uint8 DCERPC_PFC_FLAG_FIRST  = 0x01;
168         const uint8 DCERPC_PFC_FLAG_LAST   = 0x02;
169         const uint8 DCERPC_PFC_FLAG_NOCALL = 0x20;
170
171         /* these offsets are needed by the signing code */
172         const uint8 DCERPC_DREP_OFFSET     =  4;
173         const uint8 DCERPC_FRAG_LEN_OFFSET =  8;
174         const uint8 DCERPC_AUTH_LEN_OFFSET = 10;
175
176         /* little-endian flag */
177         const uint8 DCERPC_DREP_LE  = 0x10;
178
179         typedef [public] struct {
180                 uint8 rpc_vers;         /* RPC version */
181                 uint8 rpc_vers_minor;   /* Minor version */
182                 uint8 ptype;            /* Packet type */
183                 uint8 pfc_flags;        /* Fragmentation flags */
184                 uint8 drep[4];          /* NDR data representation */
185                 uint16 frag_length;     /* Total length of fragment */
186                 uint16 auth_length;     /* authenticator length */
187                 uint32 call_id;         /* Call identifier */
188                 
189                 [switch_is(ptype)] dcerpc_payload u;
190         } dcerpc_packet;
191 }