xref: /illumos-gate/usr/src/uts/common/smbsrv/ndl/netlogon.ndl (revision 0bb073995ac5a95bd35f2dd790df1ea3d8c2d507)
1/*
2 * CDDL HEADER START
3 *
4 * The contents of this file are subject to the terms of the
5 * Common Development and Distribution License (the "License").
6 * You may not use this file except in compliance with the License.
7 *
8 * You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE
9 * or http://www.opensolaris.org/os/licensing.
10 * See the License for the specific language governing permissions
11 * and limitations under the License.
12 *
13 * When distributing Covered Code, include this CDDL HEADER in each
14 * file and include the License file at usr/src/OPENSOLARIS.LICENSE.
15 * If applicable, add the following below this CDDL HEADER, with the
16 * fields enclosed by brackets "[]" replaced with your own identifying
17 * information: Portions Copyright [yyyy] [name of copyright owner]
18 *
19 * CDDL HEADER END
20 */
21/*
22 * Copyright 2008 Sun Microsystems, Inc.  All rights reserved.
23 * Use is subject to license terms.
24 */
25
26#ifndef _MLSVC_NETR_NDL_
27#define _MLSVC_NETR_NDL_
28
29/*
30 ***********************************************************************
31 *
32 * NetLogon RPC (NETR) interface definition.
33 *
34 ***********************************************************************
35 */
36
37#include "ndrtypes.ndl"
38
39
40#define NETR_OPNUM_UasLogon			0x00
41#define NETR_OPNUM_UasLogoff			0x01
42#define NETR_OPNUM_SamLogon			0x02
43#define NETR_OPNUM_SamLogoff			0x03
44#define NETR_OPNUM_ServerReqChallenge		0x04
45#define NETR_OPNUM_ServerAuthenticate		0x05
46#define NETR_OPNUM_ServerPasswordSet		0x06
47#define NETR_OPNUM_DatabaseDeltas		0x07
48#define NETR_OPNUM_DatabaseSync			0x08
49#define NETR_OPNUM_AccountDeltas		0x09
50#define NETR_OPNUM_AccountSync			0x0a
51#define NETR_OPNUM_GetDCName			0x0b
52#define NETR_OPNUM_LogonControl			0x0c
53#define NETR_OPNUM_GetAnyDCName			0x0d
54#define NETR_OPNUM_LogonControl2		0x0E
55#define NETR_OPNUM_ServerAuthenticate2		0x0F
56#define NETR_OPNUM_DatabaseSync2		0x10
57#define NETR_OPNUM_DatabaseRedo			0x11
58#define NETR_OPNUM_LogonControl2Ex		0x12
59#define NETR_OPNUM_TrustDomainList		0x13
60
61
62struct netr_sid {
63	BYTE		Revision;
64	BYTE		SubAuthCount;
65	BYTE		Authority[6];
66  SIZE_IS(SubAuthCount)
67	DWORD		SubAuthority[ANY_SIZE_ARRAY];
68};
69
70
71struct netr_string {
72	WORD		length;
73	WORD		allosize;
74	LPTSTR		str;
75};
76typedef struct netr_string netr_string_t;
77
78
79/*
80 * Alternative varying/conformant string definition - for
81 * non-null terminated strings. This definition must match
82 * mlrpc_vcbuf_t.
83 */
84struct netr_vcs {
85	/*
86	 * size_is (actually a copy of length_is) will
87	 * be inserted here by the marshalling library.
88	 */
89	DWORD vc_first_is;
90	DWORD vc_length_is;
91  SIZE_IS(vc_length_is)
92	WORD buffer[ANY_SIZE_ARRAY];
93};
94
95struct netr_vcstr {
96	WORD wclen;
97	WORD wcsize;
98	struct netr_vcs *vcs;
99};
100typedef struct netr_vcstr netr_vcstr_t;
101
102struct netr_vcb {
103	/*
104	 * size_is (actually a copy of length_is) will
105	 * be inserted here by the marshalling library.
106	 */
107	DWORD vc_first_is;
108	DWORD vc_length_is;
109  SIZE_IS(vc_length_is)
110	BYTE buffer[ANY_SIZE_ARRAY];
111};
112
113struct netr_vcbuf {
114	WORD len;
115	WORD size;
116	struct netr_vcb *vcb;
117};
118typedef struct netr_vcbuf netr_vcbuf_t;
119
120struct netr_credential {
121	BYTE data[8];
122};
123
124struct netr_authenticator {
125	struct netr_credential credential;
126	DWORD timestamp;
127};
128typedef struct netr_authenticator netr_auth_t;
129
130
131struct OLD_LARGE_INTEGER {
132	DWORD LowPart;
133	DWORD HighPart;
134};
135typedef struct OLD_LARGE_INTEGER netr_int64_t;
136
137
138struct OWF_PASSWORD {
139	BYTE data[16];
140};
141typedef struct OWF_PASSWORD netr_owf_password_t;
142
143
144struct CYPHER_BLOCK {
145	BYTE data[8];
146};
147
148
149struct USER_SESSION_KEY {
150	struct CYPHER_BLOCK data[2];
151};
152
153
154
155
156/*
157 ***********************************************************************
158 * ServerReqChallenge
159 ***********************************************************************
160 */
161ALIGN(2)
162OPERATION(NETR_OPNUM_ServerReqChallenge)
163struct netr_ServerReqChallenge {
164	IN		LPTSTR servername;
165	IN REFERENCE	LPTSTR hostname;
166	IN		struct netr_credential client_challenge;
167	OUT		struct netr_credential server_challenge;
168	OUT		DWORD status;
169};
170
171
172/*
173 ***********************************************************************
174 * ServerAuthenticate2
175 ***********************************************************************
176 */
177ALIGN(2)
178OPERATION(NETR_OPNUM_ServerAuthenticate2)
179struct netr_ServerAuthenticate2 {
180	IN		LPTSTR servername;
181	IN REFERENCE	LPTSTR account_name;
182	IN		WORD account_type;
183	IN REFERENCE	LPTSTR hostname;
184	IN		struct netr_credential client_credential;
185	OUT		struct netr_credential server_credential;
186	INOUT	DWORD negotiate_flags;
187	OUT		DWORD status;
188};
189
190
191/*
192 ***********************************************************************
193 * ServerPasswordSet
194 ***********************************************************************
195 */
196ALIGN(2)
197OPERATION(NETR_OPNUM_ServerPasswordSet)
198struct netr_PasswordSet {
199	IN		LPTSTR servername;
200	IN REFERENCE	LPTSTR account_name;
201	IN		WORD account_type;
202	IN REFERENCE	LPTSTR hostname;
203	INOUT	struct netr_authenticator auth;
204	IN		netr_owf_password_t uas_new_password;
205	OUT		DWORD status;
206};
207
208
209/*
210 ***********************************************************************
211 * SamLogon
212 ***********************************************************************
213 */
214
215/*
216 * The challenge-response data should always be 24 bytes.
217 */
218#define NETR_CR_PASSWORD_SIZE			24
219
220
221struct lm_challenge {
222	BYTE data[8];
223};
224typedef struct lm_challenge lm_challenge_t;
225
226/*
227 * Input data
228 */
229struct netr_logon_identity_info {
230	netr_vcstr_t domain_name;
231	DWORD parameter_control;
232	struct OLD_LARGE_INTEGER logon_id;
233	netr_vcstr_t username;
234	netr_vcstr_t workstation;
235};
236typedef struct netr_logon_identity_info netr_logon_id_t;
237
238
239/*
240 * Level 1: interactive logon
241 */
242struct netr_logon_info1 {
243	netr_logon_id_t identity;
244	netr_owf_password_t lm_owf_password;
245	netr_owf_password_t nt_owf_password;
246};
247
248
249/*
250 * Level 2: network logon.
251 */
252struct netr_logon_info2 {
253	netr_logon_id_t identity;
254	lm_challenge_t lm_challenge;
255	netr_vcbuf_t nt_response;
256	netr_vcbuf_t lm_response;
257};
258
259
260union netr_logon_info_u {
261	UNION_INFO_PTR(1,netr_logon_info);
262	UNION_INFO_PTR(2,netr_logon_info);
263	DEFAULT	DWORD nothing;
264};
265
266
267struct netr_login_info {
268	WORD logon_level;
269	WORD switch_value;
270  SWITCH(switch_value)
271	union netr_logon_info_u ru;
272};
273
274
275/*
276 * Output data
277 */
278struct netr_group_membership {
279	DWORD rid;
280	DWORD attributes;
281};
282
283
284struct netr_sid_and_attributes {
285	struct netr_sid *sid;
286	DWORD attributes;
287};
288
289
290struct netr_validation_info3 {
291	struct OLD_LARGE_INTEGER LogonTime;
292	struct OLD_LARGE_INTEGER LogoffTime;
293	struct OLD_LARGE_INTEGER KickOffTime;
294	struct OLD_LARGE_INTEGER PasswordLastSet;
295	struct OLD_LARGE_INTEGER PasswordCanChange;
296	struct OLD_LARGE_INTEGER PasswordMustChange;
297	netr_string_t EffectiveName;
298	netr_string_t FullName;
299	netr_string_t LogonScript;
300	netr_string_t ProfilePath;
301	netr_string_t HomeDirectory;
302	netr_string_t HomeDirectoryDrive;
303	WORD LogonCount;
304	WORD BadPasswordCount;
305	DWORD UserId;
306	DWORD PrimaryGroupId;
307	DWORD GroupCount;
308  SIZE_IS(GroupCount)
309	struct netr_group_membership *GroupIds;
310	DWORD UserFlags;
311	struct USER_SESSION_KEY UserSessionKey;
312	netr_string_t LogonServer;
313	netr_string_t LogonDomainName;
314	struct netr_sid *LogonDomainId;
315	DWORD ExpansionRoom[10];
316	DWORD SidCount;
317  SIZE_IS(SidCount)
318	struct netr_sid_and_attributes *ExtraSids;
319};
320
321
322union netr_validation_u {
323	CASE(3) struct netr_validation_info3 *info3;
324	DEFAULT	DWORD nothing;
325};
326
327
328/*
329 * This structure needs to be declared, even though it can't be used
330 * in netr_SamLogon, in order to get the appropriate size to calculate
331 * the correct fixup offsets.  If ndrgen did the right thing,
332 * netr_validation_info would be one of the out parameters. However,
333 * if we do it that way, the switch_value isn't known early enough to
334 * do the fixup calculation. So it all has to go in netr_SamLogon.
335 */
336struct netr_validation_info {
337	WORD validation_level;
338  SWITCH(validation_level)
339	union netr_validation_u ru;
340};
341
342
343/*
344 * WARNING
345 *
346 * Validation_level is really a WORD and authoritative is really a
347 * BYTE. They are declared as DWORD here due to the way things are
348 * unmarshalled. NT does not clear out the unused bytes in the
349 * DWORD so they must be cast to get the correct value.
350 */
351OPERATION(NETR_OPNUM_SamLogon)
352struct netr_SamLogon {
353	IN		LPTSTR servername;
354	IN		LPTSTR hostname;
355	IN		struct netr_authenticator *auth;
356	INOUT	struct netr_authenticator *ret_auth;
357	IN		struct netr_login_info logon_info;
358	INOUT	WORD validation_level;
359  SWITCH(validation_level)
360	OUT		union netr_validation_u ru;
361	OUT		DWORD authoritative;
362	OUT		DWORD status;
363};
364
365
366/*
367 ***********************************************************************
368 * SamLogoff
369 ***********************************************************************
370 */
371OPERATION(NETR_OPNUM_SamLogoff)
372struct netr_SamLogoff {
373	IN		LPTSTR servername;
374	IN REFERENCE	LPTSTR hostname;
375	IN		struct netr_authenticator auth;
376	INOUT	struct netr_authenticator ret_auth;
377	IN		DWORD logon_level;
378  SWITCH(logon_level)
379	IN		union netr_logon_info_u ru;
380	OUT		DWORD status;
381};
382
383
384/*
385 ***********************************************************************
386 * The NETR interface definition.
387 ***********************************************************************
388 */
389INTERFACE(0)
390union netr_interface {
391	CASE(NETR_OPNUM_ServerReqChallenge)
392		struct netr_ServerReqChallenge		ServerReqChallenge;
393	CASE(NETR_OPNUM_ServerAuthenticate2)
394		struct netr_ServerAuthenticate2		ServerAuthenticate2;
395	CASE(NETR_OPNUM_SamLogon)
396		struct netr_SamLogon			SamLogon;
397	CASE(NETR_OPNUM_SamLogoff)
398		struct netr_SamLogoff			SamLogoff;
399	CASE(NETR_OPNUM_ServerPasswordSet)
400		struct netr_PasswordSet			PasswordSet;
401};
402typedef union netr_interface netr_interface_t;
403EXTERNTYPEINFO(netr_interface)
404
405#endif /* _MLSVC_NETR_NDL_ */
406