summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--source3/include/proto.h6
-rw-r--r--source3/rpc_client/init_samr.c46
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);
+}