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_DomInfo2(struct samr_DomInfo2
*r
,
45 NTTIME force_logoff_time
,
47 const char *domain_name
,
49 uint64_t sequence_num
,
57 r
->force_logoff_time
= force_logoff_time
;
58 init_lsa_String(&r
->comment
, comment
);
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_DomInfo4(struct samr_DomInfo4
*r
,
87 init_lsa_String(&r
->comment
, comment
);
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_UserInfo7 structure.
256 ********************************************************************/
258 void init_samr_user_info7(struct samr_UserInfo7
*r
,
259 const char *account_name
)
261 DEBUG(5, ("init_samr_user_info7\n"));
263 init_lsa_String(&r
->account_name
, account_name
);
266 /*******************************************************************
267 inits a samr_UserInfo9 structure.
268 ********************************************************************/
270 void init_samr_user_info9(struct samr_UserInfo9
*r
,
271 uint32_t primary_gid
)
273 DEBUG(5, ("init_samr_user_info9\n"));
275 r
->primary_gid
= primary_gid
;
278 /*******************************************************************
279 inits a SAM_USER_INFO_16 structure.
280 ********************************************************************/
282 void init_samr_user_info16(struct samr_UserInfo16
*r
,
285 DEBUG(5, ("init_samr_user_info16\n"));
287 r
->acct_flags
= acct_flags
;
290 /*******************************************************************
291 inits a samr_UserInfo18 structure.
292 ********************************************************************/
294 void init_samr_user_info18(struct samr_UserInfo18
*r
,
295 const uint8 lm_pwd
[16],
296 const uint8 nt_pwd
[16])
298 DEBUG(5, ("init_samr_user_info18\n"));
301 memcpy(r
->lm_pwd
.hash
, lm_pwd
, sizeof(r
->lm_pwd
.hash
)) ? true : false;
303 memcpy(r
->nt_pwd
.hash
, nt_pwd
, sizeof(r
->nt_pwd
.hash
)) ? true : false;
306 /*******************************************************************
307 inits a samr_UserInfo20 structure.
308 ********************************************************************/
310 void init_samr_user_info20(struct samr_UserInfo20
*r
,
311 struct lsa_BinaryString
*parameters
)
313 r
->parameters
= *parameters
;
316 /*************************************************************************
317 inits a samr_UserInfo21 structure
318 *************************************************************************/
320 void init_samr_user_info21(struct samr_UserInfo21
*r
,
323 NTTIME last_password_change
,
325 NTTIME allow_password_change
,
326 NTTIME force_password_change
,
327 const char *account_name
,
328 const char *full_name
,
329 const char *home_directory
,
330 const char *home_drive
,
331 const char *logon_script
,
332 const char *profile_path
,
333 const char *description
,
334 const char *workstations
,
336 struct lsa_BinaryString
*parameters
,
338 uint32_t primary_gid
,
340 uint32_t fields_present
,
341 struct samr_LogonHours logon_hours
,
342 uint16_t bad_password_count
,
343 uint16_t logon_count
,
344 uint16_t country_code
,
346 uint8_t nt_password_set
,
347 uint8_t lm_password_set
,
348 uint8_t password_expired
)
350 r
->last_logon
= last_logon
;
351 r
->last_logoff
= last_logoff
;
352 r
->last_password_change
= last_password_change
;
353 r
->acct_expiry
= acct_expiry
;
354 r
->allow_password_change
= allow_password_change
;
355 r
->force_password_change
= force_password_change
;
356 init_lsa_String(&r
->account_name
, account_name
);
357 init_lsa_String(&r
->full_name
, full_name
);
358 init_lsa_String(&r
->home_directory
, home_directory
);
359 init_lsa_String(&r
->home_drive
, home_drive
);
360 init_lsa_String(&r
->logon_script
, logon_script
);
361 init_lsa_String(&r
->profile_path
, profile_path
);
362 init_lsa_String(&r
->description
, description
);
363 init_lsa_String(&r
->workstations
, workstations
);
364 init_lsa_String(&r
->comment
, comment
);
365 r
->parameters
= *parameters
;
367 r
->primary_gid
= primary_gid
;
368 r
->acct_flags
= acct_flags
;
369 r
->fields_present
= fields_present
;
370 r
->logon_hours
= logon_hours
;
371 r
->bad_password_count
= bad_password_count
;
372 r
->logon_count
= logon_count
;
373 r
->country_code
= country_code
;
374 r
->code_page
= code_page
;
375 r
->nt_password_set
= nt_password_set
;
376 r
->lm_password_set
= lm_password_set
;
377 r
->password_expired
= password_expired
;
380 /*************************************************************************
381 init_samr_user_info23
382 *************************************************************************/
384 void init_samr_user_info23(struct samr_UserInfo23
*r
,
387 NTTIME last_password_change
,
389 NTTIME allow_password_change
,
390 NTTIME force_password_change
,
391 const char *account_name
,
392 const char *full_name
,
393 const char *home_directory
,
394 const char *home_drive
,
395 const char *logon_script
,
396 const char *profile_path
,
397 const char *description
,
398 const char *workstations
,
400 struct lsa_BinaryString
*parameters
,
402 uint32_t primary_gid
,
404 uint32_t fields_present
,
405 struct samr_LogonHours logon_hours
,
406 uint16_t bad_password_count
,
407 uint16_t logon_count
,
408 uint16_t country_code
,
410 uint8_t nt_password_set
,
411 uint8_t lm_password_set
,
412 uint8_t password_expired
,
413 struct samr_CryptPassword
*pwd_buf
)
415 memset(r
, '\0', sizeof(*r
));
416 init_samr_user_info21(&r
->info
,
419 last_password_change
,
421 allow_password_change
,
422 force_password_change
,
446 r
->password
= *pwd_buf
;
449 /*************************************************************************
450 init_samr_user_info24
451 *************************************************************************/
453 void init_samr_user_info24(struct samr_UserInfo24
*r
,
454 struct samr_CryptPassword
*pwd_buf
,
455 uint8_t password_expired
)
457 DEBUG(10, ("init_samr_user_info24:\n"));
459 r
->password
= *pwd_buf
;
460 r
->password_expired
= password_expired
;
463 /*************************************************************************
464 init_samr_user_info25
465 *************************************************************************/
467 void init_samr_user_info25(struct samr_UserInfo25
*r
,
470 NTTIME last_password_change
,
472 NTTIME allow_password_change
,
473 NTTIME force_password_change
,
474 const char *account_name
,
475 const char *full_name
,
476 const char *home_directory
,
477 const char *home_drive
,
478 const char *logon_script
,
479 const char *profile_path
,
480 const char *description
,
481 const char *workstations
,
483 struct lsa_BinaryString
*parameters
,
485 uint32_t primary_gid
,
487 uint32_t fields_present
,
488 struct samr_LogonHours logon_hours
,
489 uint16_t bad_password_count
,
490 uint16_t logon_count
,
491 uint16_t country_code
,
493 uint8_t nt_password_set
,
494 uint8_t lm_password_set
,
495 uint8_t password_expired
,
496 struct samr_CryptPasswordEx
*pwd_buf
)
498 DEBUG(10, ("init_samr_user_info25:\n"));
500 memset(r
, '\0', sizeof(*r
));
501 init_samr_user_info21(&r
->info
,
504 last_password_change
,
506 allow_password_change
,
507 force_password_change
,
531 r
->password
= *pwd_buf
;
534 /*************************************************************************
535 init_samr_user_info26
536 *************************************************************************/
538 void init_samr_user_info26(struct samr_UserInfo26
*r
,
539 struct samr_CryptPasswordEx
*pwd_buf
,
540 uint8_t password_expired
)
542 DEBUG(10, ("init_samr_user_info26:\n"));
544 r
->password
= *pwd_buf
;
545 r
->password_expired
= password_expired
;
548 /*************************************************************************
549 inits a samr_CryptPasswordEx structure
550 *************************************************************************/
552 void init_samr_CryptPasswordEx(const char *pwd
,
553 DATA_BLOB
*session_key
,
554 struct samr_CryptPasswordEx
*pwd_buf
)
556 /* samr_CryptPasswordEx */
559 struct MD5Context md5_ctx
;
560 uint8_t confounder
[16];
561 DATA_BLOB confounded_session_key
= data_blob(NULL
, 16);
563 encode_pw_buffer(pwbuf
, pwd
, STR_UNICODE
);
565 generate_random_buffer((uint8_t *)confounder
, 16);
568 MD5Update(&md5_ctx
, confounder
, 16);
569 MD5Update(&md5_ctx
, session_key
->data
,
570 session_key
->length
);
571 MD5Final(confounded_session_key
.data
, &md5_ctx
);
573 SamOEMhashBlob(pwbuf
, 516, &confounded_session_key
);
574 memcpy(&pwbuf
[516], confounder
, 16);
576 memcpy(pwd_buf
->data
, pwbuf
, sizeof(pwbuf
));
577 data_blob_free(&confounded_session_key
);
580 /*************************************************************************
581 inits a samr_CryptPassword structure
582 *************************************************************************/
584 void init_samr_CryptPassword(const char *pwd
,
585 DATA_BLOB
*session_key
,
586 struct samr_CryptPassword
*pwd_buf
)
588 /* samr_CryptPassword */
590 encode_pw_buffer(pwd_buf
->data
, pwd
, STR_UNICODE
);
591 SamOEMhashBlob(pwd_buf
->data
, 516, session_key
);