a4-dcerpc: another attempt at dcerpc auth padding
[metze/samba/wip.git] / 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 import "misc.idl";
12
13 interface dcerpc
14 {
15         typedef struct {
16                 uint16 context_id;
17                 uint8 num_transfer_syntaxes;
18                 ndr_syntax_id abstract_syntax;
19                 ndr_syntax_id transfer_syntaxes[num_transfer_syntaxes];
20         } dcerpc_ctx_list;
21
22         typedef struct {
23                 uint16 max_xmit_frag;
24                 uint16 max_recv_frag;
25                 uint32 assoc_group_id;
26                 uint8  num_contexts;
27                 dcerpc_ctx_list ctx_list[num_contexts];
28                 [flag(NDR_REMAINING)] DATA_BLOB auth_info;
29         } dcerpc_bind;
30
31         const uint8 DCERPC_REQUEST_LENGTH = 24;
32
33         typedef struct {
34         } dcerpc_empty;
35
36         typedef [nodiscriminant] union {
37                 [default] dcerpc_empty empty;
38                 [case(LIBNDR_FLAG_OBJECT_PRESENT)] GUID object;
39         } dcerpc_object;
40
41         typedef struct {
42                 uint32 alloc_hint;
43                 uint16 context_id;
44                 uint16 opnum;
45                 [switch_is(ndr->flags & LIBNDR_FLAG_OBJECT_PRESENT)] dcerpc_object object;
46                 [flag(NDR_ALIGN8)]    DATA_BLOB _pad;
47                 [flag(NDR_REMAINING)] DATA_BLOB stub_and_verifier;
48         } dcerpc_request;
49
50         const int DCERPC_BIND_REASON_ASYNTAX                 = 1;
51         const int DCERPC_BIND_PROVIDER_REJECT                = 2;
52         const int DECRPC_BIND_PROTOCOL_VERSION_NOT_SUPPORTED = 4;
53         const int DCERPC_BIND_REASON_INVALID_AUTH_TYPE       = 8;
54
55         typedef struct {
56                 uint16 result;
57                 uint16 reason;
58                 ndr_syntax_id syntax;
59         } dcerpc_ack_ctx;
60
61         typedef struct {
62                 uint16 max_xmit_frag;
63                 uint16 max_recv_frag;
64                 uint32 assoc_group_id;
65                 [value(strlen(secondary_address)+1)] uint16 secondary_address_size;
66                 [charset(DOS)] uint8 secondary_address[secondary_address_size];
67                 [flag(NDR_ALIGN4)]    DATA_BLOB _pad1;
68                 uint8 num_results;
69                 dcerpc_ack_ctx ctx_list[num_results];
70                 [flag(NDR_REMAINING)] DATA_BLOB auth_info;
71         } dcerpc_bind_ack;
72
73         typedef struct {
74                 uint32 num_versions;
75                 uint32 versions[num_versions];
76         } dcerpc_bind_nak_versions;
77
78         typedef [nodiscriminant] union {
79                 [case(DECRPC_BIND_PROTOCOL_VERSION_NOT_SUPPORTED)] dcerpc_bind_nak_versions v;
80                 [default] ;
81         } dcerpc_bind_nak_versions_ctr;
82
83         typedef struct {
84                 uint16 reject_reason;
85                 [switch_is(reject_reason)] dcerpc_bind_nak_versions_ctr versions;
86         } dcerpc_bind_nak;
87
88         const uint8 DCERPC_RESPONSE_LENGTH = 24;
89
90         typedef struct {
91                 uint32 alloc_hint;
92                 uint16 context_id;
93                 uint8 cancel_count;
94                 [flag(NDR_ALIGN8)]    DATA_BLOB _pad;
95                 [flag(NDR_REMAINING)] DATA_BLOB stub_and_verifier;
96         } dcerpc_response;
97
98
99         const int DCERPC_FAULT_OP_RNG_ERROR       = 0x1c010002;
100         const int DCERPC_FAULT_UNK_IF             = 0x1c010003;
101         const int DCERPC_FAULT_NDR                = 0x000006f7;
102         const int DCERPC_FAULT_INVALID_TAG        = 0x1c000006;
103         const int DCERPC_FAULT_CONTEXT_MISMATCH   = 0x1c00001a;
104         const int DCERPC_FAULT_OTHER              = 0x00000001;
105         const int DCERPC_FAULT_ACCESS_DENIED      = 0x00000005;
106         const int DCERPC_FAULT_CANT_PERFORM       = 0x000006d8;
107
108         /* we return this fault when we haven't yet run the test
109            to see what fault w2k3 returns in this case */
110         const int DCERPC_FAULT_TODO         = 0x00000042;
111
112         typedef struct {
113                 uint32 alloc_hint;
114                 uint16 context_id;
115                 uint8 cancel_count;
116                 uint32 status;
117                 [flag(NDR_REMAINING)] DATA_BLOB _pad;
118         } dcerpc_fault;
119
120         /* the auth types we know about */
121         typedef [enum8bit] enum {
122                 DCERPC_AUTH_TYPE_NONE     = 0,
123                 /* this seems to be not krb5! */
124                 DCERPC_AUTH_TYPE_KRB5_1   = 1,
125                 DCERPC_AUTH_TYPE_SPNEGO   = 9,
126                 DCERPC_AUTH_TYPE_NTLMSSP  = 10,
127                 DCERPC_AUTH_TYPE_KRB5     = 16,
128                 DCERPC_AUTH_TYPE_DPA      = 17,
129                 DCERPC_AUTH_TYPE_MSN      = 18,
130                 DCERPC_AUTH_TYPE_DIGEST   = 21,
131                 DCERPC_AUTH_TYPE_SCHANNEL = 68,
132                 DCERPC_AUTH_TYPE_MSMQ     = 100
133         } dcerpc_AuthType;
134
135         typedef [enum8bit] enum {
136                 DCERPC_AUTH_LEVEL_NONE      = 1,
137                 DCERPC_AUTH_LEVEL_CONNECT   = 2,
138                 DCERPC_AUTH_LEVEL_CALL      = 3,
139                 DCERPC_AUTH_LEVEL_PACKET    = 4,
140                 DCERPC_AUTH_LEVEL_INTEGRITY = 5,
141                 DCERPC_AUTH_LEVEL_PRIVACY   = 6
142         } dcerpc_AuthLevel;
143
144         const uint8 DCERPC_AUTH_LEVEL_DEFAULT   = DCERPC_AUTH_LEVEL_CONNECT;
145
146         typedef [public] struct {
147                 dcerpc_AuthType auth_type;
148                 dcerpc_AuthLevel auth_level;
149                 uint8  auth_pad_length;
150                 uint8  auth_reserved;
151                 uint32 auth_context_id;
152                 [flag(NDR_REMAINING)] DATA_BLOB credentials;
153         } dcerpc_auth;
154
155         const uint8 DCERPC_AUTH_TRAILER_LENGTH = 8;
156
157         typedef [public] struct {
158                 [value(0)]            uint32    _pad;
159                 [flag(NDR_REMAINING)] DATA_BLOB auth_info;
160         } dcerpc_auth3;
161
162         typedef [public] struct {
163                 [value(0)]            uint32    _pad;
164                 [flag(NDR_REMAINING)] DATA_BLOB auth_info;
165         } dcerpc_orphaned;
166
167         typedef [public] struct {
168                 [value(0)]            uint32    _pad;
169                 [flag(NDR_REMAINING)] DATA_BLOB auth_info;
170         } dcerpc_co_cancel;
171
172         typedef [public] struct {
173                 uint32 version;
174                 uint32 id;
175         } dcerpc_cl_cancel;
176
177         typedef [public] struct {
178                 uint32 version;
179                 uint32 id;
180                 boolean32 server_is_accepting;
181         } dcerpc_cancel_ack;
182
183         typedef [public] struct {
184                 uint32 version;
185                 uint8 _pad1;
186                 uint16 window_size;
187                 uint32 max_tdsu;
188                 uint32 max_frag_size;
189                 uint16 serial_no;
190                 uint16 selack_size;
191                 uint32 selack[selack_size];
192         } dcerpc_fack;
193
194         typedef [public] struct {
195         } dcerpc_ack;
196
197         typedef [public] struct {
198         } dcerpc_ping;
199
200         typedef [public] struct {
201         } dcerpc_shutdown;
202
203         typedef [public] struct {
204         } dcerpc_working;
205
206         typedef [enum8bit] enum {
207                 DCERPC_PKT_REQUEST     =  0,    /* Ordinary request. */
208                 DCERPC_PKT_PING        =  1,    /* Connectionless is server alive ? */
209                 DCERPC_PKT_RESPONSE    =  2,    /* Ordinary reply. */
210                 DCERPC_PKT_FAULT       =  3,    /* Fault in processing of call. */
211                 DCERPC_PKT_WORKING     =  4,    /* Connectionless reply to a ping when server busy. */
212                 DCERPC_PKT_NOCALL      =  5,    /* Connectionless reply to a ping when server has lost part of clients call. */
213                 DCERPC_PKT_REJECT      =  6,    /* Refuse a request with a code. */
214                 DCERPC_PKT_ACK         =  7,    /* Connectionless client to server code. */
215                 DCERPC_PKT_CL_CANCEL   =  8,    /* Connectionless cancel. */
216                 DCERPC_PKT_FACK        =  9,    /* Connectionless fragment ack. Both client and server send. */
217                 DCERPC_PKT_CANCEL_ACK  = 10,    /* Server ACK to client cancel request. */
218                 DCERPC_PKT_BIND        = 11,    /* Bind to interface. */
219                 DCERPC_PKT_BIND_ACK    = 12,    /* Server ack of bind. */
220                 DCERPC_PKT_BIND_NAK    = 13,    /* Server nack of bind. */
221                 DCERPC_PKT_ALTER       = 14,    /* Alter auth. */
222                 DCERPC_PKT_ALTER_RESP  = 15,    /* Reply to alter auth. */
223                 DCERPC_PKT_AUTH3       = 16,    /* not the real name!  this is undocumented! */
224                 DCERPC_PKT_SHUTDOWN    = 17,    /* Server to client request to shutdown. */
225                 DCERPC_PKT_CO_CANCEL   = 18,    /* Connection-oriented cancel request. */
226                 DCERPC_PKT_ORPHANED    = 19     /* Client telling server it's aborting a partially sent request or telling server to stop sending replies. */
227         } dcerpc_pkt_type;
228
229         typedef [nodiscriminant] union {
230                 [case(DCERPC_PKT_REQUEST)]    dcerpc_request  request;
231                 [case(DCERPC_PKT_PING)]           dcerpc_ping ping;
232                 [case(DCERPC_PKT_RESPONSE)]   dcerpc_response response;
233                 [case(DCERPC_PKT_FAULT)]          dcerpc_fault fault;
234                 [case(DCERPC_PKT_WORKING)]        dcerpc_working working;
235                 [case(DCERPC_PKT_NOCALL)]     dcerpc_fack nocall;
236                 [case(DCERPC_PKT_REJECT)]     dcerpc_fault reject;
237                 [case(DCERPC_PKT_ACK)]        dcerpc_ack ack;
238                 [case(DCERPC_PKT_CL_CANCEL)]  dcerpc_cl_cancel cl_cancel;
239                 [case(DCERPC_PKT_FACK)]       dcerpc_fack fack;
240                 [case(DCERPC_PKT_CANCEL_ACK)] dcerpc_cancel_ack cancel_ack;
241                 [case(DCERPC_PKT_BIND)]       dcerpc_bind     bind;
242                 [case(DCERPC_PKT_BIND_ACK)]   dcerpc_bind_ack bind_ack;
243                 [case(DCERPC_PKT_BIND_NAK)]   dcerpc_bind_nak bind_nak;
244                 [case(DCERPC_PKT_ALTER)]      dcerpc_bind     alter;
245                 [case(DCERPC_PKT_ALTER_RESP)] dcerpc_bind_ack alter_resp;
246                 [case(DCERPC_PKT_SHUTDOWN)]   dcerpc_shutdown shutdown;
247                 [case(DCERPC_PKT_CO_CANCEL)]  dcerpc_co_cancel co_cancel;
248                 [case(DCERPC_PKT_ORPHANED)]   dcerpc_orphaned orphaned;
249                 [case(DCERPC_PKT_AUTH3)]      dcerpc_auth3    auth3;
250         } dcerpc_payload;
251
252         /* pfc_flags values */
253         const uint8 DCERPC_PFC_FLAG_FIRST               = 0x01; /* First fragment */
254         const uint8 DCERPC_PFC_FLAG_LAST                = 0x02; /* Last fragment */
255         const uint8 DCERPC_PFC_FLAG_PENDING_CANCEL      = 0x04; /* Cancel was pending at sender */
256         const uint8 DCERPC_PFC_FLAG_SUPPORT_HEADER_SIGN = DCERPC_PFC_FLAG_PENDING_CANCEL; /* depends on the pdu type */
257         const uint8 DCERPC_PFC_FLAG_CONC_MPX            = 0x10; /* supports concurrent multiplexing of a single connection. */
258         const uint8 DCERPC_PFC_FLAG_DID_NOT_EXECUTE     = 0x20; /* on a fault it means the server hasn't done anything */
259         const uint8 DCERPC_PFC_FLAG_MAYBE               = 0x40; /* `maybe' call semantics requested */
260         const uint8 DCERPC_PFC_FLAG_OBJECT_UUID         = 0x80; /* on valid guid is in the optional object field */
261
262         /* these offsets are needed by the signing code */
263         const uint8 DCERPC_PFC_OFFSET      =  3;
264         const uint8 DCERPC_DREP_OFFSET     =  4;
265         const uint8 DCERPC_FRAG_LEN_OFFSET =  8;
266         const uint8 DCERPC_AUTH_LEN_OFFSET = 10;
267
268         /* little-endian flag */
269         const uint8 DCERPC_DREP_LE  = 0x10;
270
271         typedef [public] struct {
272                 uint8 rpc_vers;         /* RPC version */
273                 uint8 rpc_vers_minor;   /* Minor version */
274                 dcerpc_pkt_type ptype;  /* Packet type */
275                 uint8 pfc_flags;        /* Fragmentation flags */
276                 uint8 drep[4];          /* NDR data representation */
277                 uint16 frag_length;     /* Total length of fragment */
278                 uint16 auth_length;     /* authenticator length */
279                 uint32 call_id;         /* Call identifier */
280                 [switch_is(ptype)] dcerpc_payload u;
281         } ncacn_packet;
282
283         typedef [public] struct {
284                 uint8 rpc_vers;         /* RPC version (4) */
285                 uint8 ptype;
286                 uint8 pfc_flags;
287                 uint8 ncadg_flags;
288                 uint8 drep[3];
289                 uint8 serial_high;
290                 GUID object;
291                 GUID iface;
292                 GUID activity;
293                 uint32 server_boot; /* Server boot time */
294                 uint32 iface_version;
295                 uint32 seq_num;
296                 uint16 opnum;
297                 uint16 ihint;
298                 uint16 ahint;
299                 uint16 len;
300                 uint16 fragnum;
301                 uint8 auth_proto;
302                 uint8 serial_low;
303                 [switch_is(ptype)] dcerpc_payload u;
304         } ncadg_packet;
305 }