2 Unix SMB/Netbios implementation.
4 SMB parameters and setup
5 Copyright (C) Andrew Tridgell 1992-1997
6 Copyright (C) Luke Kenneth Casson Leighton 1996-1997
7 Copyright (C) Paul Ashton 1997
9 This program is free software; you can redistribute it and/or modify
10 it under the terms of the GNU General Public License as published by
11 the Free Software Foundation; either version 2 of the License, or
12 (at your option) any later version.
14 This program is distributed in the hope that it will be useful,
15 but WITHOUT ANY WARRANTY; without even the implied warranty of
16 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
17 GNU General Public License for more details.
19 You should have received a copy of the GNU General Public License
20 along with this program; if not, write to the Free Software
21 Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
24 #ifndef _DCE_RPC_H /* _DCE_RPC_H */
27 #include "rpc_misc.h" /* this only pulls in STRHDR */
30 /* DCE/RPC packet types */
41 #define RPC_FLG_FIRST 0x01
42 #define RPC_FLG_LAST 0x02
44 /* NTLMSSP message types */
45 enum NTLM_MESSAGE_TYPE
47 NTLMSSP_NEGOTIATE = 1,
48 NTLMSSP_CHALLENGE = 2,
53 /* NTLMSSP negotiation flags */
54 #define NTLMSSP_NEGOTIATE_UNICODE 0x00000001
55 #define NTLMSSP_NEGOTIATE_OEM 0x00000002
56 #define NTLMSSP_REQUEST_TARGET 0x00000004
57 #define NTLMSSP_NEGOTIATE_SIGN 0x00000010
58 #define NTLMSSP_NEGOTIATE_SEAL 0x00000020
59 #define NTLMSSP_NEGOTIATE_LM_KEY 0x00000080
60 #define NTLMSSP_NEGOTIATE_NTLM 0x00000200
61 #define NTLMSSP_NEGOTIATE_ALWAYS_SIGN 0x00008000
62 #define NTLMSSP_NEGOTIATE_NTLM2 0x00080000
63 #define NTLMSSP_NEGOTIATE_TARGET_INFO 0x00800000
64 #define NTLMSSP_NEGOTIATE_128 0x20000000
65 #define NTLMSSP_NEGOTIATE_KEY_EXCH 0x40000000
68 typedef struct rpc_iface_info
70 uint8 data[16]; /* 16 bytes of rpc interface identification */
71 uint32 version; /* the interface version number */
77 /* the names appear not to matter: the syntaxes _do_ matter */
80 RPC_IFACE abstr_syntax; /* this one is the abstract syntax id */
82 char *server_pipe; /* this one is the secondary syntax name */
83 RPC_IFACE trans_syntax; /* this one is the primary syntax id */
86 /* RPC_HDR - dce rpc header */
87 typedef struct rpc_hdr_info
89 uint8 major; /* 5 - RPC major version */
90 uint8 minor; /* 0 - RPC minor version */
91 uint8 pkt_type; /* RPC_PKT_TYPE - RPC response packet */
92 uint8 flags; /* DCE/RPC flags */
93 uint32 pack_type; /* 0x1000 0000 - packed data representation */
94 uint16 frag_len; /* fragment length - data size (bytes) inc header and tail. */
95 uint16 auth_len; /* 0 - authentication length */
96 uint32 call_id; /* call identifier. matches 12th uint32 of incoming RPC data. */
100 /* RPC_HDR_REQ - ms request rpc header */
101 typedef struct rpc_hdr_req_info
103 uint32 alloc_hint; /* allocation hint - data size (bytes) minus header and tail. */
104 uint16 context_id; /* 0 - presentation context identifier */
105 uint16 opnum; /* opnum */
109 /* RPC_HDR_RESP - ms response rpc header */
110 typedef struct rpc_hdr_resp_info
112 uint32 alloc_hint; /* allocation hint - data size (bytes) minus header and tail. */
113 uint16 context_id; /* 0 - presentation context identifier */
114 uint8 cancel_count; /* 0 - cancel count */
115 uint8 reserved; /* 0 - reserved. */
119 /* this seems to be the same string name depending on the name of the pipe,
120 * but is more likely to be linked to the interface name
121 * "srvsvc", "\\PIPE\\ntsvcs"
122 * "samr", "\\PIPE\\lsass"
123 * "wkssvc", "\\PIPE\\wksvcs"
124 * "NETLOGON", "\\PIPE\\NETLOGON"
127 typedef struct rpc_addr_info
129 uint16 len; /* length of the string including null terminator */
130 fstring str; /* the string above in single byte, null terminated form */
135 typedef struct rpc_hdr_bba_info
137 uint16 max_tsize; /* maximum transmission fragment size (0x1630) */
138 uint16 max_rsize; /* max receive fragment size (0x1630) */
139 uint32 assoc_gid; /* associated group id (0x0) */
143 /* RPC_BIND_REQ - ms req bind */
144 typedef struct rpc_bind_req_info
148 uint32 num_elements; /* the number of elements (0x1) */
149 uint16 context_id; /* presentation context identifier (0x0) */
150 uint8 num_syntaxes; /* the number of syntaxes (has always been 1?)(0x1) */
152 RPC_IFACE abstract; /* num and vers. of interface client is using */
153 RPC_IFACE transfer; /* num and vers. of interface to use for replies */
157 /* RPC_RESULTS - can only cope with one reason, right now... */
158 typedef struct rpc_results_info
160 /* uint8[] # 4-byte alignment padding, against SMB header */
162 uint8 num_results; /* the number of results (0x01) */
164 /* uint8[] # 4-byte alignment padding, against SMB header */
166 uint16 result; /* result (0x00 = accept) */
167 uint16 reason; /* reason (0x00 = no reason specified) */
172 typedef struct rpc_hdr_ba_info
176 RPC_ADDR_STR addr ; /* the secondary address string, as described earlier */
177 RPC_RESULTS res ; /* results and reasons */
178 RPC_IFACE transfer; /* the transfer syntax from the request */
182 /* this is TEMPORARY */
183 /* RPC_AUTH_VERIFIER */
184 typedef struct rpc_auth_verif_info
186 uint8 auth_type; /* 0x0a */
187 uint8 auth_level; /* 0x06 */
188 uint8 stub_type_len; /* don't know */
189 uint8 padding; /* padding */
191 uint32 ptr_0; /* non-zero pointer to something */
193 fstring signature; /* "NTLMSSP" */
194 uint32 msg_type; /* NTLMSSP_MESSAGE_TYPE (1,2,3) */
198 /* this is TEMPORARILY coded up as a specific structure */
199 /* this structure comes after the bind request */
200 /* RPC_AUTH_NTLMSSP_NEG */
201 typedef struct rpc_auth_ntlmssp_neg_info
203 uint32 neg_flgs; /* 0x0000 b2b3 */
205 STRHDR hdr_myname; /* offset is against START of this structure */
206 STRHDR hdr_domain; /* offset is against START of this structure */
208 fstring myname; /* calling workstation's name */
209 fstring domain; /* calling workstations's domain */
211 } RPC_AUTH_NTLMSSP_NEG;
213 /* this is TEMPORARILY coded up as a specific structure */
214 /* this structure comes after the bind acknowledgement */
215 /* RPC_AUTH_NTLMSSP_CHAL */
216 typedef struct rpc_auth_ntlmssp_chal_info
218 uint32 unknown_1; /* 0x0000 0000 */
219 uint32 unknown_2; /* 0x0000 0028 */
220 uint32 neg_flags; /* 0x0000 82b1 */
222 uint8 challenge[8]; /* ntlm challenge */
224 uint8 reserved [8]; /* zeros */
227 } RPC_AUTH_NTLMSSP_CHAL;
230 /* RPC_AUTH_NTLMSSP_RESP */
231 typedef struct rpc_auth_ntlmssp_resp_info
233 STRHDR hdr_lm_resp; /* 24 byte response */
234 STRHDR hdr_nt_resp; /* 24 byte response */
238 STRHDR hdr_sess_key; /* NULL unless negotiated */
239 uint32 neg_flags; /* 0x0000 82b1 */
248 } RPC_AUTH_NTLMSSP_RESP;
251 /* attached to the end of encrypted rpc requests and responses */
252 /* RPC_AUTH_NTLMSSP_CHK */
253 typedef struct rpc_auth_ntlmssp_chk_info
255 uint32 ver; /* 0x0000 0001 */
256 uint8 crc32[8]; /* checksum using 0xEDB8 8320 as a polynomial */
259 } RPC_AUTH_NTLMSSP_CHK;
261 #endif /* _DCE_RPC_H */