This will be needed when we implement netr_ServerAuthenticateKerberos...
BUG: https://bugzilla.samba.org/show_bug.cgi?id=15425
Signed-off-by: Stefan Metzmacher <metze@samba.org>
Reviewed-by: Douglas Bagnall <douglas.bagnall@catalyst.net.nz>
static NTSTATUS netlogon_creds_crypt_samlogon_validation(struct netlogon_creds_CredentialState *creds,
uint16_t validation_level,
union netr_Validation *validation,
+ enum dcerpc_AuthType auth_type,
+ enum dcerpc_AuthLevel auth_level,
bool do_encrypt)
{
struct netr_SamBaseInfo *base = NULL;
NTSTATUS netlogon_creds_decrypt_samlogon_validation(struct netlogon_creds_CredentialState *creds,
uint16_t validation_level,
- union netr_Validation *validation)
+ union netr_Validation *validation,
+ enum dcerpc_AuthType auth_type,
+ enum dcerpc_AuthLevel auth_level)
{
return netlogon_creds_crypt_samlogon_validation(creds,
validation_level,
validation,
+ auth_type,
+ auth_level,
false);
}
NTSTATUS netlogon_creds_encrypt_samlogon_validation(struct netlogon_creds_CredentialState *creds,
uint16_t validation_level,
- union netr_Validation *validation)
+ union netr_Validation *validation,
+ enum dcerpc_AuthType auth_type,
+ enum dcerpc_AuthLevel auth_level)
{
return netlogon_creds_crypt_samlogon_validation(creds,
validation_level,
validation,
+ auth_type,
+ auth_level,
true);
}
#ifndef __LIBCLI_AUTH_H__
#define __LIBCLI_AUTH_H__
+#include "librpc/gen_ndr/dcerpc.h"
#include "librpc/gen_ndr/netlogon.h"
#include "librpc/gen_ndr/wkssvc.h"
#include "librpc/gen_ndr/schannel.h"
struct netlogon_creds_cli_LogonSamLogon_state *state =
tevent_req_data(req,
struct netlogon_creds_cli_LogonSamLogon_state);
+ enum dcerpc_AuthType auth_type;
+ enum dcerpc_AuthLevel auth_level;
NTSTATUS status;
NTSTATUS result;
bool ok;
+ dcerpc_binding_handle_auth_info(state->binding_handle,
+ &auth_type,
+ &auth_level);
+
if (state->try_logon_ex) {
status = dcerpc_netr_LogonSamLogonEx_recv(subreq,
state->validation,
status = netlogon_creds_decrypt_samlogon_validation(state->ro_creds,
state->validation_level,
- state->validation);
+ state->validation,
+ auth_type,
+ auth_level);
if (tevent_req_nterror(req, status)) {
netlogon_creds_cli_LogonSamLogon_cleanup(req, status);
return;
status = netlogon_creds_decrypt_samlogon_validation(&state->tmp_creds,
state->validation_level,
- state->validation);
+ state->validation,
+ auth_type,
+ auth_level);
if (tevent_req_nterror(req, status)) {
netlogon_creds_cli_LogonSamLogon_cleanup(req, result);
return;
struct netr_Authenticator *return_authenticator) ;
NTSTATUS netlogon_creds_decrypt_samlogon_validation(struct netlogon_creds_CredentialState *creds,
uint16_t validation_level,
- union netr_Validation *validation);
+ union netr_Validation *validation,
+ enum dcerpc_AuthType auth_type,
+ enum dcerpc_AuthLevel auth_level);
NTSTATUS netlogon_creds_encrypt_samlogon_validation(struct netlogon_creds_CredentialState *creds,
uint16_t validation_level,
- union netr_Validation *validation);
+ union netr_Validation *validation,
+ enum dcerpc_AuthType auth_type,
+ enum dcerpc_AuthLevel auth_level);
NTSTATUS netlogon_creds_decrypt_samlogon_logon(struct netlogon_creds_CredentialState *creds,
enum netr_LogonInfoClass level,
union netr_LogonLevel *logon);
status = netlogon_creds_encrypt_samlogon_validation(creds,
r->in.validation_level,
- r->out.validation);
+ r->out.validation,
+ auth_type,
+ auth_level);
return status;
}
NTSTATUS status;
if (NT_STATUS_IS_OK(r->out.result)) {
+ enum dcerpc_AuthType auth_type = DCERPC_AUTH_TYPE_NONE;
+ enum dcerpc_AuthLevel auth_level = DCERPC_AUTH_LEVEL_NONE;
+
+ dcesrv_call_auth_info(state->dce_call, &auth_type, &auth_level);
+
status = netlogon_creds_encrypt_samlogon_validation(state->creds,
r->in.validation_level,
- r->out.validation);
+ r->out.validation,
+ auth_type,
+ auth_level);
if (!NT_STATUS_IS_OK(status)) {
DBG_ERR("netlogon_creds_encrypt_samlogon_validation() "
"failed - %s\n",
struct netr_NetworkInfo ninfo;
struct netr_SamBaseInfo *base = NULL;
uint16_t validation_level = 0;
+ enum dcerpc_AuthType auth_type;
+ enum dcerpc_AuthLevel auth_level;
+
+ dcerpc_binding_handle_auth_info(samlogon_state->p->binding_handle,
+ &auth_type,
+ &auth_level);
samlogon_state->r.in.logon->network = &ninfo;
samlogon_state->r_ex.in.logon->network = &ninfo;
status = netlogon_creds_decrypt_samlogon_validation(samlogon_state->creds,
validation_level,
- r->out.validation);
+ r->out.validation,
+ auth_type,
+ auth_level);
if (!NT_STATUS_IS_OK(status)) {
if (error_string) {
*error_string = strdup(nt_errstr(status));
status = netlogon_creds_decrypt_samlogon_validation(samlogon_state->creds,
validation_level,
- r_ex->out.validation);
+ r_ex->out.validation,
+ auth_type,
+ auth_level);
if (!NT_STATUS_IS_OK(status)) {
if (error_string) {
*error_string = strdup(nt_errstr(status));
status = netlogon_creds_decrypt_samlogon_validation(samlogon_state->creds,
validation_level,
- r_flags->out.validation);
+ r_flags->out.validation,
+ auth_type,
+ auth_level);
if (!NT_STATUS_IS_OK(status)) {
if (error_string) {
*error_string = strdup(nt_errstr(status));