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  * Copyright 2014 Nexenta Systems, Inc.  All rights reserved.
  26  */
  27 
  28 #ifndef _MLSVC_NETR_NDL_
  29 #define _MLSVC_NETR_NDL_
  30 
  31 /*
  32  ***********************************************************************
  33  *
  34  * NetLogon RPC (NETR) interface definition.
  35  *
  36  ***********************************************************************
  37  */
  38 
  39 #include <libmlrpc/ndrtypes.ndl>
  40 
  41 
  42 #define NETR_OPNUM_UasLogon                     0x00
  43 #define NETR_OPNUM_UasLogoff                    0x01
  44 #define NETR_OPNUM_SamLogon                     0x02
  45 #define NETR_OPNUM_SamLogoff                    0x03
  46 #define NETR_OPNUM_ServerReqChallenge           0x04
  47 #define NETR_OPNUM_ServerAuthenticate           0x05
  48 #define NETR_OPNUM_ServerPasswordSet            0x06
  49 #define NETR_OPNUM_DatabaseDeltas               0x07
  50 #define NETR_OPNUM_DatabaseSync                 0x08
  51 #define NETR_OPNUM_AccountDeltas                0x09
  52 #define NETR_OPNUM_AccountSync                  0x0a
  53 #define NETR_OPNUM_GetDCName                    0x0b
  54 #define NETR_OPNUM_LogonControl                 0x0c
  55 #define NETR_OPNUM_GetAnyDCName                 0x0d
  56 #define NETR_OPNUM_LogonControl2                0x0E
  57 #define NETR_OPNUM_ServerAuthenticate2          0x0F
  58 #define NETR_OPNUM_DatabaseSync2                0x10
  59 #define NETR_OPNUM_DatabaseRedo                 0x11
  60 #define NETR_OPNUM_LogonControl2Ex              0x12
  61 #define NETR_OPNUM_TrustDomainList              0x13
  62 #define NETR_OPNUM_DsrGetDcName                 0x14
  63 #define NETR_OPNUM_LogonGetCapabilities         0x15
  64 #define NETR_OPNUM_LogonSetServiceBits          0x16
  65 #define NETR_OPNUM_LogonGetTrustRid             0x17
  66 #define NETR_OPNUM_LogonComputeServerDigest     0x18
  67 #define NETR_OPNUM_LogonComputeClientDigest     0x19
  68 #define NETR_OPNUM_ServerAuthenticate3          0x1A
  69 #define NETR_OPNUM_DsrGetDcNameEx               0x1B
  70 #define NETR_OPNUM_DsrGetSiteName               0x1C
  71 #define NETR_OPNUM_LogonGetDomainInfo           0x1D
  72 #define NETR_OPNUM_ServerPasswordSet2           0x1E
  73 
  74 /*
  75  * This is not a real NETR OPNUM.  It's used to unpack the
  76  * struct krb5_validation_info found in the Kerberos PAC.
  77  */
  78 #define NETR_OPNUM_decode_krb5_pac              1000
  79 
  80 
  81 struct netr_sid {
  82         BYTE            Revision;
  83         BYTE            SubAuthCount;
  84         BYTE            Authority[6];
  85   SIZE_IS(SubAuthCount)
  86         DWORD           SubAuthority[ANY_SIZE_ARRAY];
  87 };
  88 
  89 
  90 struct netr_string {
  91         WORD            length;
  92         WORD            allosize;
  93         LPTSTR          str;
  94 };
  95 typedef struct netr_string netr_string_t;
  96 
  97 
  98 /*
  99  * Alternative varying/conformant string definition - for
 100  * non-null terminated strings. This definition must match
 101  * ndr_vcbuf_t.
 102  */
 103 struct netr_vcs {
 104         /*
 105          * size_is (actually a copy of length_is) will
 106          * be inserted here by the marshalling library.
 107          */
 108         DWORD vc_first_is;
 109         DWORD vc_length_is;
 110   SIZE_IS(vc_length_is)
 111         WORD buffer[ANY_SIZE_ARRAY];
 112 };
 113 
 114 struct netr_vcstr {
 115         WORD wclen;
 116         WORD wcsize;
 117         struct netr_vcs *vcs;
 118 };
 119 typedef struct netr_vcstr netr_vcstr_t;
 120 
 121 struct netr_vcb {
 122         /*
 123          * size_is (actually a copy of length_is) will
 124          * be inserted here by the marshalling library.
 125          */
 126         DWORD vc_first_is;
 127         DWORD vc_length_is;
 128   SIZE_IS(vc_length_is)
 129         BYTE buffer[ANY_SIZE_ARRAY];
 130 };
 131 
 132 struct netr_vcbuf {
 133         WORD len;
 134         WORD size;
 135         struct netr_vcb *vcb;
 136 };
 137 typedef struct netr_vcbuf netr_vcbuf_t;
 138 
 139 struct netr_credential {
 140         BYTE data[8];
 141 };
 142 
 143 struct netr_authenticator {
 144         struct netr_credential credential;
 145         DWORD timestamp;
 146 };
 147 typedef struct netr_authenticator netr_auth_t;
 148 
 149 
 150 struct OLD_LARGE_INTEGER {
 151         DWORD LowPart;
 152         DWORD HighPart;
 153 };
 154 typedef struct OLD_LARGE_INTEGER netr_int64_t;
 155 
 156 struct CYPHER_BLOCK {
 157         BYTE data[8];
 158 };
 159 
 160 struct OWF_PASSWORD {
 161         BYTE data[16];
 162 };
 163 typedef struct OWF_PASSWORD netr_owf_password_t;
 164 
 165 /*
 166  * NL_TRUST_PASSWORD
 167  * See also: samr_user_password
 168  */
 169 #define NETR_TRUST_PWLEN        256
 170 struct netr_trust_password {
 171         WORD    Buffer[NETR_TRUST_PWLEN];
 172         DWORD   Length;
 173 };
 174 typedef struct netr_trust_password netr_trust_password_t;
 175 
 176 struct USER_SESSION_KEY {
 177         struct CYPHER_BLOCK data[2];
 178 };
 179 
 180 
 181 
 182 
 183 /*
 184  ***********************************************************************
 185  * ServerReqChallenge
 186  ***********************************************************************
 187  */
 188 ALIGN(2)
 189 OPERATION(NETR_OPNUM_ServerReqChallenge)
 190 struct netr_ServerReqChallenge {
 191         IN              LPTSTR servername;
 192         IN REFERENCE    LPTSTR hostname;
 193         IN              struct netr_credential client_challenge;
 194         OUT             struct netr_credential server_challenge;
 195         OUT             DWORD status;
 196 };
 197 
 198 
 199 /*
 200  ***********************************************************************
 201  * ServerAuthenticate2
 202  ***********************************************************************
 203  */
 204 ALIGN(2)
 205 OPERATION(NETR_OPNUM_ServerAuthenticate2)
 206 struct netr_ServerAuthenticate2 {
 207         IN              LPTSTR servername;
 208         IN REFERENCE    LPTSTR account_name;
 209         IN              WORD account_type;
 210         IN REFERENCE    LPTSTR hostname;
 211         IN              struct netr_credential client_credential;
 212         OUT             struct netr_credential server_credential;
 213         INOUT   DWORD negotiate_flags;
 214         OUT             DWORD status;
 215 };
 216 
 217 
 218 /*
 219  ***********************************************************************
 220  * ServerPasswordSet
 221  ***********************************************************************
 222  */
 223 ALIGN(2)
 224 OPERATION(NETR_OPNUM_ServerPasswordSet)
 225 struct netr_PasswordSet {
 226         IN              LPTSTR servername;
 227         IN REFERENCE    LPTSTR account_name;
 228         IN              WORD sec_chan_type;
 229         IN REFERENCE    LPTSTR hostname;
 230         INOUT   struct netr_authenticator auth;
 231         IN              netr_owf_password_t owf_password;
 232         OUT             DWORD status;
 233 };
 234 
 235 OPERATION(NETR_OPNUM_ServerPasswordSet2)
 236 struct netr_PasswordSet2 {
 237         IN              LPTSTR servername;
 238         IN REFERENCE    LPTSTR account_name;
 239         IN              WORD sec_chan_type;
 240         IN REFERENCE    LPTSTR hostname;
 241         INOUT   struct netr_authenticator auth;
 242         IN              netr_trust_password_t trust_password;
 243         OUT             DWORD status;
 244 };
 245 
 246 
 247 /*
 248  ***********************************************************************
 249  * SamLogon
 250  ***********************************************************************
 251  */
 252 
 253 /*
 254  * The challenge-response data should always be 24 bytes.
 255  */
 256 #define NETR_CR_PASSWORD_SIZE                   24
 257 
 258 
 259 struct lm_challenge {
 260         BYTE data[8];
 261 };
 262 typedef struct lm_challenge lm_challenge_t;
 263 
 264 /*
 265  * Input data
 266  */
 267 struct netr_logon_identity_info {
 268         netr_vcstr_t domain_name;
 269         DWORD parameter_control;
 270         struct OLD_LARGE_INTEGER logon_id;
 271         netr_vcstr_t username;
 272         netr_vcstr_t workstation;
 273 };
 274 typedef struct netr_logon_identity_info netr_logon_id_t;
 275 
 276 
 277 /*
 278  * Level 1: interactive logon
 279  */
 280 struct netr_logon_info1 {
 281         netr_logon_id_t identity;
 282         netr_owf_password_t lm_owf_password;
 283         netr_owf_password_t nt_owf_password;
 284 };
 285 
 286 
 287 /*
 288  * Level 2: network logon.
 289  */
 290 struct netr_logon_info2 {
 291         netr_logon_id_t identity;
 292         lm_challenge_t lm_challenge;
 293         netr_vcbuf_t nt_response;
 294         netr_vcbuf_t lm_response;
 295 };
 296 
 297 
 298 union netr_logon_info_u {
 299         UNION_INFO_PTR(1,netr_logon_info);
 300         UNION_INFO_PTR(2,netr_logon_info);
 301         DEFAULT DWORD nothing;
 302 };
 303 
 304 
 305 struct netr_login_info {
 306         WORD logon_level;
 307         WORD switch_value;
 308   SWITCH(switch_value)
 309         union netr_logon_info_u ru;
 310 };
 311 
 312 
 313 /*
 314  * Output data
 315  */
 316 struct netr_group_membership {
 317         DWORD rid;
 318         DWORD attributes;
 319 };
 320 
 321 
 322 struct netr_sid_and_attributes {
 323         struct netr_sid *sid;
 324         DWORD attributes;
 325 };
 326 
 327 
 328 struct netr_validation_info3 {
 329         struct OLD_LARGE_INTEGER LogonTime;
 330         struct OLD_LARGE_INTEGER LogoffTime;
 331         struct OLD_LARGE_INTEGER KickOffTime;
 332         struct OLD_LARGE_INTEGER PasswordLastSet;
 333         struct OLD_LARGE_INTEGER PasswordCanChange;
 334         struct OLD_LARGE_INTEGER PasswordMustChange;
 335         netr_string_t EffectiveName;
 336         netr_string_t FullName;
 337         netr_string_t LogonScript;
 338         netr_string_t ProfilePath;
 339         netr_string_t HomeDirectory;
 340         netr_string_t HomeDirectoryDrive;
 341         WORD LogonCount;
 342         WORD BadPasswordCount;
 343         DWORD UserId;
 344         DWORD PrimaryGroupId;
 345         DWORD GroupCount;
 346   SIZE_IS(GroupCount)
 347         struct netr_group_membership *GroupIds;
 348         DWORD UserFlags;
 349         struct USER_SESSION_KEY UserSessionKey;
 350         netr_string_t LogonServer;
 351         netr_string_t LogonDomainName;
 352         struct netr_sid *LogonDomainId;
 353         DWORD ExpansionRoom[10];
 354         DWORD SidCount;
 355   SIZE_IS(SidCount)
 356         struct netr_sid_and_attributes *ExtraSids;
 357 };
 358 
 359 /* NETR_OPNUM_decode_krb5_pac */
 360 struct krb5_validation_info {
 361         struct netr_validation_info3 info3;
 362         /* Kerberos PAC "resource group" stuff. */
 363         struct netr_sid *rg_dom_sid;
 364         DWORD rg_rid_cnt;
 365   SIZE_IS(rg_rid_cnt)
 366         struct netr_group_membership *rg_rids;
 367 };
 368 
 369 union netr_validation_u {
 370         CASE(3) struct netr_validation_info3 *info3;
 371         DEFAULT DWORD nothing;
 372 };
 373 
 374 
 375 /*
 376  * This structure needs to be declared, even though it can't be used
 377  * in netr_SamLogon, in order to get the appropriate size to calculate
 378  * the correct fixup offsets.  If ndrgen did the right thing,
 379  * netr_validation_info would be one of the out parameters. However,
 380  * if we do it that way, the switch_value isn't known early enough to
 381  * do the fixup calculation. So it all has to go in netr_SamLogon.
 382  */
 383 struct netr_validation_info {
 384         WORD validation_level;
 385   SWITCH(validation_level)
 386         union netr_validation_u ru;
 387 };
 388 
 389 
 390 /*
 391  * WARNING
 392  *
 393  * Validation_level is really a WORD and authoritative is really a
 394  * BYTE. They are declared as DWORD here due to the way things are
 395  * unmarshalled. NT does not clear out the unused bytes in the
 396  * DWORD so they must be cast to get the correct value.
 397  */
 398 OPERATION(NETR_OPNUM_SamLogon)
 399 struct netr_SamLogon {
 400         IN              LPTSTR servername;
 401         IN              LPTSTR hostname;
 402         IN              struct netr_authenticator *auth;
 403         INOUT   struct netr_authenticator *ret_auth;
 404         IN              struct netr_login_info logon_info;
 405         INOUT   WORD validation_level;
 406   SWITCH(validation_level)
 407         OUT             union netr_validation_u ru;
 408         OUT             DWORD authoritative;
 409         OUT             DWORD status;
 410 };
 411 
 412 
 413 /*
 414  ***********************************************************************
 415  * SamLogoff
 416  ***********************************************************************
 417  */
 418 OPERATION(NETR_OPNUM_SamLogoff)
 419 struct netr_SamLogoff {
 420         IN              LPTSTR servername;
 421         IN REFERENCE    LPTSTR hostname;
 422         IN              struct netr_authenticator auth;
 423         INOUT   struct netr_authenticator ret_auth;
 424         IN              DWORD logon_level;
 425   SWITCH(logon_level)
 426         IN              union netr_logon_info_u ru;
 427         OUT             DWORD status;
 428 };
 429 
 430 
 431 /*
 432  ***********************************************************************
 433  * The NETR interface definition.
 434  ***********************************************************************
 435  */
 436 INTERFACE(0)
 437 union netr_interface {
 438         CASE(NETR_OPNUM_ServerReqChallenge)
 439                 struct netr_ServerReqChallenge          ServerReqChallenge;
 440         CASE(NETR_OPNUM_ServerAuthenticate2)
 441                 struct netr_ServerAuthenticate2         ServerAuthenticate2;
 442         CASE(NETR_OPNUM_SamLogon)
 443                 struct netr_SamLogon                    SamLogon;
 444         CASE(NETR_OPNUM_SamLogoff)
 445                 struct netr_SamLogoff                   SamLogoff;
 446         CASE(NETR_OPNUM_ServerPasswordSet)
 447                 struct netr_PasswordSet                 PasswordSet;
 448         CASE(NETR_OPNUM_ServerPasswordSet2)
 449                 struct netr_PasswordSet2                PasswordSet2;
 450 
 451         /* Special, for smb_decode_krb5_pac() */
 452         CASE(NETR_OPNUM_decode_krb5_pac)
 453                 struct krb5_validation_info             krb5pac;
 454 };
 455 typedef union netr_interface netr_interface_t;
 456 EXTERNTYPEINFO(netr_interface)
 457 
 458 #endif /* _MLSVC_NETR_NDL_ */