2 * Unix SMB/CIFS implementation.
3 * RPC Pipe client / server routines
4 * Copyright (C) Guenther Deschner 2008.
6 * This program is free software; you can redistribute it and/or modify
7 * it under the terms of the GNU General Public License as published by
8 * the Free Software Foundation; either version 3 of the License, or
9 * (at your option) any later version.
11 * This program is distributed in the hope that it will be useful,
12 * but WITHOUT ANY WARRANTY; without even the implied warranty of
13 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
14 * GNU General Public License for more details.
16 * You should have received a copy of the GNU General Public License
17 * along with this program; if not, see <http://www.gnu.org/licenses/>.
22 /*******************************************************************
24 ********************************************************************/
26 void init_samr_DomInfo1(struct samr_DomInfo1
*r
,
27 uint16_t min_password_length
,
28 uint16_t password_history_length
,
29 uint32_t password_properties
,
30 int64_t max_password_age
,
31 int64_t min_password_age
)
33 r
->min_password_length
= min_password_length
;
34 r
->password_history_length
= password_history_length
;
35 r
->password_properties
= password_properties
;
36 r
->max_password_age
= max_password_age
;
37 r
->min_password_age
= min_password_age
;
40 /*******************************************************************
42 ********************************************************************/
44 void init_samr_DomGeneralInformation(struct samr_DomGeneralInformation
*r
,
45 NTTIME force_logoff_time
,
46 const char *oem_information
,
47 const char *domain_name
,
49 uint64_t sequence_num
,
57 r
->force_logoff_time
= force_logoff_time
;
58 init_lsa_String(&r
->oem_information
, oem_information
);
59 init_lsa_String(&r
->domain_name
, domain_name
);
60 init_lsa_String(&r
->primary
, primary
);
61 r
->sequence_num
= sequence_num
;
62 r
->unknown2
= unknown2
;
64 r
->unknown3
= unknown3
;
65 r
->num_users
= num_users
;
66 r
->num_groups
= num_groups
;
67 r
->num_aliases
= num_aliases
;
70 /*******************************************************************
72 ********************************************************************/
74 void init_samr_DomInfo3(struct samr_DomInfo3
*r
,
75 NTTIME force_logoff_time
)
77 r
->force_logoff_time
= force_logoff_time
;
80 /*******************************************************************
82 ********************************************************************/
84 void init_samr_DomOEMInformation(struct samr_DomOEMInformation
*r
,
85 const char *oem_information
)
87 init_lsa_String(&r
->oem_information
, oem_information
);
90 /*******************************************************************
92 ********************************************************************/
94 void init_samr_DomInfo5(struct samr_DomInfo5
*r
,
95 const char *domain_name
)
97 init_lsa_String(&r
->domain_name
, domain_name
);
100 /*******************************************************************
102 ********************************************************************/
104 void init_samr_DomInfo6(struct samr_DomInfo6
*r
,
107 init_lsa_String(&r
->primary
, primary
);
110 /*******************************************************************
112 ********************************************************************/
114 void init_samr_DomInfo7(struct samr_DomInfo7
*r
,
120 /*******************************************************************
122 ********************************************************************/
124 void init_samr_DomInfo8(struct samr_DomInfo8
*r
,
125 uint64_t sequence_num
,
126 NTTIME domain_create_time
)
128 r
->sequence_num
= sequence_num
;
129 r
->domain_create_time
= domain_create_time
;
132 /*******************************************************************
134 ********************************************************************/
136 void init_samr_DomInfo9(struct samr_DomInfo9
*r
,
139 r
->unknown
= unknown
;
142 /*******************************************************************
144 ********************************************************************/
146 void init_samr_DomInfo12(struct samr_DomInfo12
*r
,
147 uint64_t lockout_duration
,
148 uint64_t lockout_window
,
149 uint16_t lockout_threshold
)
151 r
->lockout_duration
= lockout_duration
;
152 r
->lockout_window
= lockout_window
;
153 r
->lockout_threshold
= lockout_threshold
;
156 /*******************************************************************
157 inits a samr_GroupInfoAll structure.
158 ********************************************************************/
160 void init_samr_group_info1(struct samr_GroupInfoAll
*r
,
163 uint32_t num_members
,
164 const char *description
)
166 DEBUG(5, ("init_samr_group_info1\n"));
168 init_lsa_String(&r
->name
, name
);
169 r
->attributes
= attributes
;
170 r
->num_members
= num_members
;
171 init_lsa_String(&r
->description
, description
);
174 /*******************************************************************
175 inits a lsa_String structure
176 ********************************************************************/
178 void init_samr_group_info2(struct lsa_String
*r
, const char *group_name
)
180 DEBUG(5, ("init_samr_group_info2\n"));
182 init_lsa_String(r
, group_name
);
185 /*******************************************************************
186 inits a samr_GroupInfoAttributes structure.
187 ********************************************************************/
189 void init_samr_group_info3(struct samr_GroupInfoAttributes
*r
,
192 DEBUG(5, ("init_samr_group_info3\n"));
194 r
->attributes
= attributes
;
197 /*******************************************************************
198 inits a lsa_String structure
199 ********************************************************************/
201 void init_samr_group_info4(struct lsa_String
*r
, const char *description
)
203 DEBUG(5, ("init_samr_group_info4\n"));
205 init_lsa_String(r
, description
);
208 /*******************************************************************
209 inits a samr_GroupInfoAll structure.
210 ********************************************************************/
212 void init_samr_group_info5(struct samr_GroupInfoAll
*r
,
215 uint32_t num_members
,
216 const char *description
)
218 DEBUG(5, ("init_samr_group_info5\n"));
220 init_lsa_String(&r
->name
, name
);
221 r
->attributes
= attributes
;
222 r
->num_members
= num_members
;
223 init_lsa_String(&r
->description
, description
);
226 /*******************************************************************
227 inits a samr_AliasInfoAll structure.
228 ********************************************************************/
230 void init_samr_alias_info1(struct samr_AliasInfoAll
*r
,
232 uint32_t num_members
,
233 const char *description
)
235 DEBUG(5, ("init_samr_alias_info1\n"));
237 init_lsa_String(&r
->name
, name
);
238 r
->num_members
= num_members
;
239 init_lsa_String(&r
->description
, description
);
242 /*******************************************************************
243 inits a lsa_String structure.
244 ********************************************************************/
246 void init_samr_alias_info3(struct lsa_String
*r
,
247 const char *description
)
249 DEBUG(5, ("init_samr_alias_info3\n"));
251 init_lsa_String(r
, description
);
254 /*******************************************************************
255 inits a samr_UserInfo5 structure.
256 ********************************************************************/
258 void init_samr_user_info5(struct samr_UserInfo5
*r
,
259 const char *account_name
,
260 const char *full_name
,
262 uint32_t primary_gid
,
263 const char *home_directory
,
264 const char *home_drive
,
265 const char *logon_script
,
266 const char *profile_path
,
267 const char *description
,
268 const char *workstations
,
271 struct samr_LogonHours logon_hours
,
272 uint16_t bad_password_count
,
273 uint16_t logon_count
,
274 NTTIME last_password_change
,
278 DEBUG(5, ("init_samr_user_info5\n"));
280 init_lsa_String(&r
->account_name
, account_name
);
281 init_lsa_String(&r
->full_name
, full_name
);
283 r
->primary_gid
= primary_gid
;
284 init_lsa_String(&r
->home_directory
, home_directory
);
285 init_lsa_String(&r
->home_drive
, home_drive
);
286 init_lsa_String(&r
->logon_script
, logon_script
);
287 init_lsa_String(&r
->profile_path
, profile_path
);
288 init_lsa_String(&r
->description
, description
);
289 init_lsa_String(&r
->workstations
, workstations
);
290 r
->last_logon
= last_logon
;
291 r
->last_logoff
= last_logoff
;
292 r
->logon_hours
= logon_hours
;
293 r
->bad_password_count
= bad_password_count
;
294 r
->logon_count
= logon_count
;
295 r
->last_password_change
= last_password_change
;
296 r
->acct_expiry
= acct_expiry
;
297 r
->acct_flags
= acct_flags
;
301 /*******************************************************************
302 inits a samr_UserInfo7 structure.
303 ********************************************************************/
305 void init_samr_user_info7(struct samr_UserInfo7
*r
,
306 const char *account_name
)
308 DEBUG(5, ("init_samr_user_info7\n"));
310 init_lsa_String(&r
->account_name
, account_name
);
313 /*******************************************************************
314 inits a samr_UserInfo9 structure.
315 ********************************************************************/
317 void init_samr_user_info9(struct samr_UserInfo9
*r
,
318 uint32_t primary_gid
)
320 DEBUG(5, ("init_samr_user_info9\n"));
322 r
->primary_gid
= primary_gid
;
325 /*******************************************************************
326 inits a SAM_USER_INFO_16 structure.
327 ********************************************************************/
329 void init_samr_user_info16(struct samr_UserInfo16
*r
,
332 DEBUG(5, ("init_samr_user_info16\n"));
334 r
->acct_flags
= acct_flags
;
337 /*******************************************************************
338 inits a samr_UserInfo18 structure.
339 ********************************************************************/
341 void init_samr_user_info18(struct samr_UserInfo18
*r
,
342 const uint8 lm_pwd
[16],
343 const uint8 nt_pwd
[16])
345 DEBUG(5, ("init_samr_user_info18\n"));
348 memcpy(r
->lm_pwd
.hash
, lm_pwd
, sizeof(r
->lm_pwd
.hash
)) ? true : false;
350 memcpy(r
->nt_pwd
.hash
, nt_pwd
, sizeof(r
->nt_pwd
.hash
)) ? true : false;
353 /*******************************************************************
354 inits a samr_UserInfo20 structure.
355 ********************************************************************/
357 void init_samr_user_info20(struct samr_UserInfo20
*r
,
358 struct lsa_BinaryString
*parameters
)
360 r
->parameters
= *parameters
;
363 /*************************************************************************
364 inits a samr_UserInfo21 structure
365 *************************************************************************/
367 void init_samr_user_info21(struct samr_UserInfo21
*r
,
370 NTTIME last_password_change
,
372 NTTIME allow_password_change
,
373 NTTIME force_password_change
,
374 const char *account_name
,
375 const char *full_name
,
376 const char *home_directory
,
377 const char *home_drive
,
378 const char *logon_script
,
379 const char *profile_path
,
380 const char *description
,
381 const char *workstations
,
383 struct lsa_BinaryString
*parameters
,
385 uint32_t primary_gid
,
387 uint32_t fields_present
,
388 struct samr_LogonHours logon_hours
,
389 uint16_t bad_password_count
,
390 uint16_t logon_count
,
391 uint16_t country_code
,
393 uint8_t nt_password_set
,
394 uint8_t lm_password_set
,
395 uint8_t password_expired
)
397 r
->last_logon
= last_logon
;
398 r
->last_logoff
= last_logoff
;
399 r
->last_password_change
= last_password_change
;
400 r
->acct_expiry
= acct_expiry
;
401 r
->allow_password_change
= allow_password_change
;
402 r
->force_password_change
= force_password_change
;
403 init_lsa_String(&r
->account_name
, account_name
);
404 init_lsa_String(&r
->full_name
, full_name
);
405 init_lsa_String(&r
->home_directory
, home_directory
);
406 init_lsa_String(&r
->home_drive
, home_drive
);
407 init_lsa_String(&r
->logon_script
, logon_script
);
408 init_lsa_String(&r
->profile_path
, profile_path
);
409 init_lsa_String(&r
->description
, description
);
410 init_lsa_String(&r
->workstations
, workstations
);
411 init_lsa_String(&r
->comment
, comment
);
412 r
->parameters
= *parameters
;
414 r
->primary_gid
= primary_gid
;
415 r
->acct_flags
= acct_flags
;
416 r
->fields_present
= fields_present
;
417 r
->logon_hours
= logon_hours
;
418 r
->bad_password_count
= bad_password_count
;
419 r
->logon_count
= logon_count
;
420 r
->country_code
= country_code
;
421 r
->code_page
= code_page
;
422 r
->nt_password_set
= nt_password_set
;
423 r
->lm_password_set
= lm_password_set
;
424 r
->password_expired
= password_expired
;
427 /*************************************************************************
428 init_samr_user_info23
429 *************************************************************************/
431 void init_samr_user_info23(struct samr_UserInfo23
*r
,
434 NTTIME last_password_change
,
436 NTTIME allow_password_change
,
437 NTTIME force_password_change
,
438 const char *account_name
,
439 const char *full_name
,
440 const char *home_directory
,
441 const char *home_drive
,
442 const char *logon_script
,
443 const char *profile_path
,
444 const char *description
,
445 const char *workstations
,
447 struct lsa_BinaryString
*parameters
,
449 uint32_t primary_gid
,
451 uint32_t fields_present
,
452 struct samr_LogonHours logon_hours
,
453 uint16_t bad_password_count
,
454 uint16_t logon_count
,
455 uint16_t country_code
,
457 uint8_t nt_password_set
,
458 uint8_t lm_password_set
,
459 uint8_t password_expired
,
460 struct samr_CryptPassword
*pwd_buf
)
462 memset(r
, '\0', sizeof(*r
));
463 init_samr_user_info21(&r
->info
,
466 last_password_change
,
468 allow_password_change
,
469 force_password_change
,
493 r
->password
= *pwd_buf
;
496 /*************************************************************************
497 init_samr_user_info24
498 *************************************************************************/
500 void init_samr_user_info24(struct samr_UserInfo24
*r
,
501 struct samr_CryptPassword
*pwd_buf
,
502 uint8_t password_expired
)
504 DEBUG(10, ("init_samr_user_info24:\n"));
506 r
->password
= *pwd_buf
;
507 r
->password_expired
= password_expired
;
510 /*************************************************************************
511 init_samr_user_info25
512 *************************************************************************/
514 void init_samr_user_info25(struct samr_UserInfo25
*r
,
517 NTTIME last_password_change
,
519 NTTIME allow_password_change
,
520 NTTIME force_password_change
,
521 const char *account_name
,
522 const char *full_name
,
523 const char *home_directory
,
524 const char *home_drive
,
525 const char *logon_script
,
526 const char *profile_path
,
527 const char *description
,
528 const char *workstations
,
530 struct lsa_BinaryString
*parameters
,
532 uint32_t primary_gid
,
534 uint32_t fields_present
,
535 struct samr_LogonHours logon_hours
,
536 uint16_t bad_password_count
,
537 uint16_t logon_count
,
538 uint16_t country_code
,
540 uint8_t nt_password_set
,
541 uint8_t lm_password_set
,
542 uint8_t password_expired
,
543 struct samr_CryptPasswordEx
*pwd_buf
)
545 DEBUG(10, ("init_samr_user_info25:\n"));
547 memset(r
, '\0', sizeof(*r
));
548 init_samr_user_info21(&r
->info
,
551 last_password_change
,
553 allow_password_change
,
554 force_password_change
,
578 r
->password
= *pwd_buf
;
581 /*************************************************************************
582 init_samr_user_info26
583 *************************************************************************/
585 void init_samr_user_info26(struct samr_UserInfo26
*r
,
586 struct samr_CryptPasswordEx
*pwd_buf
,
587 uint8_t password_expired
)
589 DEBUG(10, ("init_samr_user_info26:\n"));
591 r
->password
= *pwd_buf
;
592 r
->password_expired
= password_expired
;
595 /*************************************************************************
596 inits a samr_CryptPasswordEx structure
597 *************************************************************************/
599 void init_samr_CryptPasswordEx(const char *pwd
,
600 DATA_BLOB
*session_key
,
601 struct samr_CryptPasswordEx
*pwd_buf
)
603 /* samr_CryptPasswordEx */
606 struct MD5Context md5_ctx
;
607 uint8_t confounder
[16];
608 DATA_BLOB confounded_session_key
= data_blob(NULL
, 16);
610 encode_pw_buffer(pwbuf
, pwd
, STR_UNICODE
);
612 generate_random_buffer((uint8_t *)confounder
, 16);
615 MD5Update(&md5_ctx
, confounder
, 16);
616 MD5Update(&md5_ctx
, session_key
->data
,
617 session_key
->length
);
618 MD5Final(confounded_session_key
.data
, &md5_ctx
);
620 SamOEMhashBlob(pwbuf
, 516, &confounded_session_key
);
621 memcpy(&pwbuf
[516], confounder
, 16);
623 memcpy(pwd_buf
->data
, pwbuf
, sizeof(pwbuf
));
624 data_blob_free(&confounded_session_key
);
627 /*************************************************************************
628 inits a samr_CryptPassword structure
629 *************************************************************************/
631 void init_samr_CryptPassword(const char *pwd
,
632 DATA_BLOB
*session_key
,
633 struct samr_CryptPassword
*pwd_buf
)
635 /* samr_CryptPassword */
637 encode_pw_buffer(pwd_buf
->data
, pwd
, STR_UNICODE
);
638 SamOEMhashBlob(pwd_buf
->data
, 516, session_key
);