diff options
-rw-r--r-- | source3/include/proto.h | 6 | ||||
-rw-r--r-- | source3/rpc_client/init_samr.c | 46 |
2 files changed, 52 insertions, 0 deletions
diff --git a/source3/include/proto.h b/source3/include/proto.h index bf3adb556b..7e70f3ced3 100644 --- a/source3/include/proto.h +++ b/source3/include/proto.h @@ -7574,6 +7574,12 @@ void init_samr_user_info23(struct samr_UserInfo23 *r, void init_samr_user_info24(struct samr_UserInfo24 *r, uint8_t data[516], uint8_t pw_len); +void init_samr_CryptPasswordEx(const char *pwd, + DATA_BLOB *session_key, + struct samr_CryptPasswordEx *pwd_buf); +void init_samr_CryptPassword(const char *pwd, + DATA_BLOB *session_key, + struct samr_CryptPassword *pwd_buf); /* The following definitions come from rpc_client/init_srvsvc.c */ diff --git a/source3/rpc_client/init_samr.c b/source3/rpc_client/init_samr.c index c5d7dcdb13..2e757531ce 100644 --- a/source3/rpc_client/init_samr.c +++ b/source3/rpc_client/init_samr.c @@ -460,3 +460,49 @@ void init_samr_user_info24(struct samr_UserInfo24 *r, memcpy(r->password.data, data, sizeof(r->password.data)); r->pw_len = pw_len; } + +/************************************************************************* + inits a samr_CryptPasswordEx structure + *************************************************************************/ + +void init_samr_CryptPasswordEx(const char *pwd, + DATA_BLOB *session_key, + struct samr_CryptPasswordEx *pwd_buf) +{ + /* samr_CryptPasswordEx */ + + uchar pwbuf[532]; + struct MD5Context md5_ctx; + uint8_t confounder[16]; + DATA_BLOB confounded_session_key = data_blob(NULL, 16); + + encode_pw_buffer(pwbuf, pwd, STR_UNICODE); + + generate_random_buffer((uint8_t *)confounder, 16); + + MD5Init(&md5_ctx); + MD5Update(&md5_ctx, confounder, 16); + MD5Update(&md5_ctx, session_key->data, + session_key->length); + MD5Final(confounded_session_key.data, &md5_ctx); + + SamOEMhashBlob(pwbuf, 516, &confounded_session_key); + memcpy(&pwbuf[516], confounder, 16); + + memcpy(pwd_buf->data, pwbuf, sizeof(pwbuf)); + data_blob_free(&confounded_session_key); +} + +/************************************************************************* + inits a samr_CryptPassword structure + *************************************************************************/ + +void init_samr_CryptPassword(const char *pwd, + DATA_BLOB *session_key, + struct samr_CryptPassword *pwd_buf) +{ + /* samr_CryptPassword */ + + encode_pw_buffer(pwd_buf->data, pwd, STR_UNICODE); + SamOEMhashBlob(pwd_buf->data, 516, session_key); +} |