usr/src/lib/smbsrv/libmlsvc/common/netr_auth.c
author natalie li - Sun Microsystems - Irvine United States <Natalie.Li@Sun.COM>
Tue, 28 Oct 2008 03:34:04 -0700
changeset 7961 4b5e3051f38b
parent 7619 0ad244464731
child 8334 5f1c6a3b0fad
permissions -rw-r--r--
6751647 TRANS2_FIND_NEXT continuation by filename restarts search at beginning of directory 6753904 SVCCTL server side service 6741484 Local users cannot connect to CIFS shares from MacOS 10.5 6746898 win98 can not overwrite *.files 6753310 Incorrect handling of SmbNegotiate request when invalid dialects are negotiated. 6751123 Unable to join domain, core dump generated with IPMP setting 6722437 SMB_TRANS2_FIND returns wrong status code when stream file is passed 6716578 can not delete file in extended attribute name space in cifs client when cifs server is solaris PSARC 2008/584 Correction in nbmand behavior 6734067 Long delay when viewing MS Word Read-only file properties with nbmand enabled. PSARC/2007/281 NFS share properties for Montana compatibility 6475452 Need Solaris support for Montana approve file functionality in NFS 6582170 Host-based access control (approve file) 6749075 Unable to join domain if user password exceeds 20 characters 6612716 Join domain fails if hostname is > 15 chars 6753251 server signing: wrong signature is generated for the NetShareEnum reply 6757521 SMB daemon leaks memory after displaying GSS status 6760315 Local user cannot connnect to CIFS shares if CIFS server's hostname is not specified 6757333 Share publisher thread runs into infinite loop of displaying GSS major/minor status 6757132 smbd crashes at smb_idmap_batch_getmappings 6760876 security descriptor decoding function has a glitch 6761491 Cannot open or delete a named stream on a directory file. 6741449 Cleanup list in smbns_ads module 6593958 Users with restore privilege can take ownership of files
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
5331
3047ad28a67b PSARC/2007/218 caller_context_t in all VOPs
amw
parents:
diff changeset
     1
/*
3047ad28a67b PSARC/2007/218 caller_context_t in all VOPs
amw
parents:
diff changeset
     2
 * CDDL HEADER START
3047ad28a67b PSARC/2007/218 caller_context_t in all VOPs
amw
parents:
diff changeset
     3
 *
3047ad28a67b PSARC/2007/218 caller_context_t in all VOPs
amw
parents:
diff changeset
     4
 * The contents of this file are subject to the terms of the
3047ad28a67b PSARC/2007/218 caller_context_t in all VOPs
amw
parents:
diff changeset
     5
 * Common Development and Distribution License (the "License").
3047ad28a67b PSARC/2007/218 caller_context_t in all VOPs
amw
parents:
diff changeset
     6
 * You may not use this file except in compliance with the License.
3047ad28a67b PSARC/2007/218 caller_context_t in all VOPs
amw
parents:
diff changeset
     7
 *
3047ad28a67b PSARC/2007/218 caller_context_t in all VOPs
amw
parents:
diff changeset
     8
 * You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE
3047ad28a67b PSARC/2007/218 caller_context_t in all VOPs
amw
parents:
diff changeset
     9
 * or http://www.opensolaris.org/os/licensing.
3047ad28a67b PSARC/2007/218 caller_context_t in all VOPs
amw
parents:
diff changeset
    10
 * See the License for the specific language governing permissions
3047ad28a67b PSARC/2007/218 caller_context_t in all VOPs
amw
parents:
diff changeset
    11
 * and limitations under the License.
3047ad28a67b PSARC/2007/218 caller_context_t in all VOPs
amw
parents:
diff changeset
    12
 *
3047ad28a67b PSARC/2007/218 caller_context_t in all VOPs
amw
parents:
diff changeset
    13
 * When distributing Covered Code, include this CDDL HEADER in each
3047ad28a67b PSARC/2007/218 caller_context_t in all VOPs
amw
parents:
diff changeset
    14
 * file and include the License file at usr/src/OPENSOLARIS.LICENSE.
3047ad28a67b PSARC/2007/218 caller_context_t in all VOPs
amw
parents:
diff changeset
    15
 * If applicable, add the following below this CDDL HEADER, with the
3047ad28a67b PSARC/2007/218 caller_context_t in all VOPs
amw
parents:
diff changeset
    16
 * fields enclosed by brackets "[]" replaced with your own identifying
3047ad28a67b PSARC/2007/218 caller_context_t in all VOPs
amw
parents:
diff changeset
    17
 * information: Portions Copyright [yyyy] [name of copyright owner]
3047ad28a67b PSARC/2007/218 caller_context_t in all VOPs
amw
parents:
diff changeset
    18
 *
3047ad28a67b PSARC/2007/218 caller_context_t in all VOPs
amw
parents:
diff changeset
    19
 * CDDL HEADER END
3047ad28a67b PSARC/2007/218 caller_context_t in all VOPs
amw
parents:
diff changeset
    20
 */
3047ad28a67b PSARC/2007/218 caller_context_t in all VOPs
amw
parents:
diff changeset
    21
/*
5772
237ac22142fe 6560095 SNAS shows SIDs for Built-in Groups members instead of name
as200622
parents: 5521
diff changeset
    22
 * Copyright 2008 Sun Microsystems, Inc.  All rights reserved.
5331
3047ad28a67b PSARC/2007/218 caller_context_t in all VOPs
amw
parents:
diff changeset
    23
 * Use is subject to license terms.
3047ad28a67b PSARC/2007/218 caller_context_t in all VOPs
amw
parents:
diff changeset
    24
 */
3047ad28a67b PSARC/2007/218 caller_context_t in all VOPs
amw
parents:
diff changeset
    25
3047ad28a67b PSARC/2007/218 caller_context_t in all VOPs
amw
parents:
diff changeset
    26
/*
3047ad28a67b PSARC/2007/218 caller_context_t in all VOPs
amw
parents:
diff changeset
    27
 * NETR challenge/response client functions.
3047ad28a67b PSARC/2007/218 caller_context_t in all VOPs
amw
parents:
diff changeset
    28
 *
3047ad28a67b PSARC/2007/218 caller_context_t in all VOPs
amw
parents:
diff changeset
    29
 * NT_STATUS_INVALID_PARAMETER
3047ad28a67b PSARC/2007/218 caller_context_t in all VOPs
amw
parents:
diff changeset
    30
 * NT_STATUS_NO_TRUST_SAM_ACCOUNT
3047ad28a67b PSARC/2007/218 caller_context_t in all VOPs
amw
parents:
diff changeset
    31
 * NT_STATUS_ACCESS_DENIED
3047ad28a67b PSARC/2007/218 caller_context_t in all VOPs
amw
parents:
diff changeset
    32
 */
3047ad28a67b PSARC/2007/218 caller_context_t in all VOPs
amw
parents:
diff changeset
    33
3047ad28a67b PSARC/2007/218 caller_context_t in all VOPs
amw
parents:
diff changeset
    34
#include <stdio.h>
3047ad28a67b PSARC/2007/218 caller_context_t in all VOPs
amw
parents:
diff changeset
    35
#include <stdlib.h>
3047ad28a67b PSARC/2007/218 caller_context_t in all VOPs
amw
parents:
diff changeset
    36
#include <strings.h>
3047ad28a67b PSARC/2007/218 caller_context_t in all VOPs
amw
parents:
diff changeset
    37
#include <unistd.h>
3047ad28a67b PSARC/2007/218 caller_context_t in all VOPs
amw
parents:
diff changeset
    38
#include <ctype.h>
7052
efa04b030974 6615409 Rename appropriate structures in userland
amw
parents: 6432
diff changeset
    39
#include <security/cryptoki.h>
efa04b030974 6615409 Rename appropriate structures in userland
amw
parents: 6432
diff changeset
    40
#include <security/pkcs11.h>
5331
3047ad28a67b PSARC/2007/218 caller_context_t in all VOPs
amw
parents:
diff changeset
    41
3047ad28a67b PSARC/2007/218 caller_context_t in all VOPs
amw
parents:
diff changeset
    42
#include <smbsrv/libsmb.h>
5521
cf62335046cd 6575640 rename/rmdir/remove on mixed file systems work incorrectly for mangled names
as200622
parents: 5331
diff changeset
    43
#include <smbsrv/libsmbrdr.h>
6432
98715880dd9e 6666802 Cannot copy >1023 byte readonly file from Vista client to Solaris CIFS share
as200622
parents: 6139
diff changeset
    44
#include <smbsrv/libsmbns.h>
5331
3047ad28a67b PSARC/2007/218 caller_context_t in all VOPs
amw
parents:
diff changeset
    45
#include <smbsrv/mlsvc_util.h>
3047ad28a67b PSARC/2007/218 caller_context_t in all VOPs
amw
parents:
diff changeset
    46
#include <smbsrv/ndl/netlogon.ndl>
3047ad28a67b PSARC/2007/218 caller_context_t in all VOPs
amw
parents:
diff changeset
    47
#include <smbsrv/ntstatus.h>
3047ad28a67b PSARC/2007/218 caller_context_t in all VOPs
amw
parents:
diff changeset
    48
#include <smbsrv/smbinfo.h>
3047ad28a67b PSARC/2007/218 caller_context_t in all VOPs
amw
parents:
diff changeset
    49
#include <smbsrv/mlsvc.h>
3047ad28a67b PSARC/2007/218 caller_context_t in all VOPs
amw
parents:
diff changeset
    50
#include <smbsrv/netrauth.h>
3047ad28a67b PSARC/2007/218 caller_context_t in all VOPs
amw
parents:
diff changeset
    51
7052
efa04b030974 6615409 Rename appropriate structures in userland
amw
parents: 6432
diff changeset
    52
#define	NETR_SESSKEY_ZEROBUF_SZ		4
7619
0ad244464731 6736540 ntlmv2 signing does not work in domain mode
jose borrego <Jose.Borrego@Sun.COM>
parents: 7052
diff changeset
    53
/* The DES algorithm uses a 56-bit encryption key. */
7052
efa04b030974 6615409 Rename appropriate structures in userland
amw
parents: 6432
diff changeset
    54
#define	NETR_DESKEY_LEN			7
efa04b030974 6615409 Rename appropriate structures in userland
amw
parents: 6432
diff changeset
    55
5331
3047ad28a67b PSARC/2007/218 caller_context_t in all VOPs
amw
parents:
diff changeset
    56
int netr_setup_authenticator(netr_info_t *, struct netr_authenticator *,
3047ad28a67b PSARC/2007/218 caller_context_t in all VOPs
amw
parents:
diff changeset
    57
    struct netr_authenticator *);
3047ad28a67b PSARC/2007/218 caller_context_t in all VOPs
amw
parents:
diff changeset
    58
DWORD netr_validate_chain(netr_info_t *, struct netr_authenticator *);
3047ad28a67b PSARC/2007/218 caller_context_t in all VOPs
amw
parents:
diff changeset
    59
3047ad28a67b PSARC/2007/218 caller_context_t in all VOPs
amw
parents:
diff changeset
    60
static int netr_server_req_challenge(mlsvc_handle_t *, netr_info_t *);
3047ad28a67b PSARC/2007/218 caller_context_t in all VOPs
amw
parents:
diff changeset
    61
static int netr_server_authenticate2(mlsvc_handle_t *, netr_info_t *);
3047ad28a67b PSARC/2007/218 caller_context_t in all VOPs
amw
parents:
diff changeset
    62
static int netr_gen_password(BYTE *, BYTE *, BYTE *);
3047ad28a67b PSARC/2007/218 caller_context_t in all VOPs
amw
parents:
diff changeset
    63
3047ad28a67b PSARC/2007/218 caller_context_t in all VOPs
amw
parents:
diff changeset
    64
/*
3047ad28a67b PSARC/2007/218 caller_context_t in all VOPs
amw
parents:
diff changeset
    65
 * Shared with netr_logon.c
3047ad28a67b PSARC/2007/218 caller_context_t in all VOPs
amw
parents:
diff changeset
    66
 */
3047ad28a67b PSARC/2007/218 caller_context_t in all VOPs
amw
parents:
diff changeset
    67
netr_info_t netr_global_info;
3047ad28a67b PSARC/2007/218 caller_context_t in all VOPs
amw
parents:
diff changeset
    68
3047ad28a67b PSARC/2007/218 caller_context_t in all VOPs
amw
parents:
diff changeset
    69
/*
3047ad28a67b PSARC/2007/218 caller_context_t in all VOPs
amw
parents:
diff changeset
    70
 * netlogon_auth
3047ad28a67b PSARC/2007/218 caller_context_t in all VOPs
amw
parents:
diff changeset
    71
 *
3047ad28a67b PSARC/2007/218 caller_context_t in all VOPs
amw
parents:
diff changeset
    72
 * This is the core of the NETLOGON authentication protocol.
3047ad28a67b PSARC/2007/218 caller_context_t in all VOPs
amw
parents:
diff changeset
    73
 * Do the challenge response authentication.
3047ad28a67b PSARC/2007/218 caller_context_t in all VOPs
amw
parents:
diff changeset
    74
 *
3047ad28a67b PSARC/2007/218 caller_context_t in all VOPs
amw
parents:
diff changeset
    75
 * Prior to calling this function, an anonymous session to the NETLOGON
3047ad28a67b PSARC/2007/218 caller_context_t in all VOPs
amw
parents:
diff changeset
    76
 * pipe on a domain controller(server) should have already been opened.
6139
5c743b207bf9 6541120 Configuration is not propagated to SMB kernel module
jb150015
parents: 5772
diff changeset
    77
 *
5c743b207bf9 6541120 Configuration is not propagated to SMB kernel module
jb150015
parents: 5772
diff changeset
    78
 * Upon a successful NETLOGON credential chain establishment, the
5c743b207bf9 6541120 Configuration is not propagated to SMB kernel module
jb150015
parents: 5772
diff changeset
    79
 * netlogon sequence number will be set to match the kpasswd sequence
5c743b207bf9 6541120 Configuration is not propagated to SMB kernel module
jb150015
parents: 5772
diff changeset
    80
 * number.
5c743b207bf9 6541120 Configuration is not propagated to SMB kernel module
jb150015
parents: 5772
diff changeset
    81
 *
5331
3047ad28a67b PSARC/2007/218 caller_context_t in all VOPs
amw
parents:
diff changeset
    82
 */
3047ad28a67b PSARC/2007/218 caller_context_t in all VOPs
amw
parents:
diff changeset
    83
DWORD
3047ad28a67b PSARC/2007/218 caller_context_t in all VOPs
amw
parents:
diff changeset
    84
netlogon_auth(char *server, mlsvc_handle_t *netr_handle, DWORD flags)
3047ad28a67b PSARC/2007/218 caller_context_t in all VOPs
amw
parents:
diff changeset
    85
{
3047ad28a67b PSARC/2007/218 caller_context_t in all VOPs
amw
parents:
diff changeset
    86
	netr_info_t *netr_info;
3047ad28a67b PSARC/2007/218 caller_context_t in all VOPs
amw
parents:
diff changeset
    87
	int rc;
5521
cf62335046cd 6575640 rename/rmdir/remove on mixed file systems work incorrectly for mangled names
as200622
parents: 5331
diff changeset
    88
	DWORD leout_rc[2];
5331
3047ad28a67b PSARC/2007/218 caller_context_t in all VOPs
amw
parents:
diff changeset
    89
3047ad28a67b PSARC/2007/218 caller_context_t in all VOPs
amw
parents:
diff changeset
    90
	netr_info = &netr_global_info;
3047ad28a67b PSARC/2007/218 caller_context_t in all VOPs
amw
parents:
diff changeset
    91
	bzero(netr_info, sizeof (netr_info_t));
3047ad28a67b PSARC/2007/218 caller_context_t in all VOPs
amw
parents:
diff changeset
    92
3047ad28a67b PSARC/2007/218 caller_context_t in all VOPs
amw
parents:
diff changeset
    93
	netr_info->flags |= flags;
3047ad28a67b PSARC/2007/218 caller_context_t in all VOPs
amw
parents:
diff changeset
    94
7961
4b5e3051f38b 6751647 TRANS2_FIND_NEXT continuation by filename restarts search at beginning of directory
natalie li - Sun Microsystems - Irvine United States <Natalie.Li@Sun.COM>
parents: 7619
diff changeset
    95
	rc = smb_getnetbiosname(netr_info->hostname, NETBIOS_NAME_SZ);
5331
3047ad28a67b PSARC/2007/218 caller_context_t in all VOPs
amw
parents:
diff changeset
    96
	if (rc != 0)
3047ad28a67b PSARC/2007/218 caller_context_t in all VOPs
amw
parents:
diff changeset
    97
		return (NT_STATUS_UNSUCCESSFUL);
3047ad28a67b PSARC/2007/218 caller_context_t in all VOPs
amw
parents:
diff changeset
    98
3047ad28a67b PSARC/2007/218 caller_context_t in all VOPs
amw
parents:
diff changeset
    99
	(void) snprintf(netr_info->server, sizeof (netr_info->server),
3047ad28a67b PSARC/2007/218 caller_context_t in all VOPs
amw
parents:
diff changeset
   100
	    "\\\\%s", server);
3047ad28a67b PSARC/2007/218 caller_context_t in all VOPs
amw
parents:
diff changeset
   101
5521
cf62335046cd 6575640 rename/rmdir/remove on mixed file systems work incorrectly for mangled names
as200622
parents: 5331
diff changeset
   102
	LE_OUT32(&leout_rc[0], random());
cf62335046cd 6575640 rename/rmdir/remove on mixed file systems work incorrectly for mangled names
as200622
parents: 5331
diff changeset
   103
	LE_OUT32(&leout_rc[1], random());
cf62335046cd 6575640 rename/rmdir/remove on mixed file systems work incorrectly for mangled names
as200622
parents: 5331
diff changeset
   104
	(void) memcpy(&netr_info->client_challenge, leout_rc,
5331
3047ad28a67b PSARC/2007/218 caller_context_t in all VOPs
amw
parents:
diff changeset
   105
	    sizeof (struct netr_credential));
3047ad28a67b PSARC/2007/218 caller_context_t in all VOPs
amw
parents:
diff changeset
   106
3047ad28a67b PSARC/2007/218 caller_context_t in all VOPs
amw
parents:
diff changeset
   107
	if ((rc = netr_server_req_challenge(netr_handle, netr_info)) == 0) {
3047ad28a67b PSARC/2007/218 caller_context_t in all VOPs
amw
parents:
diff changeset
   108
		rc = netr_server_authenticate2(netr_handle, netr_info);
6139
5c743b207bf9 6541120 Configuration is not propagated to SMB kernel module
jb150015
parents: 5772
diff changeset
   109
		if (rc == 0) {
5c743b207bf9 6541120 Configuration is not propagated to SMB kernel module
jb150015
parents: 5772
diff changeset
   110
			smb_update_netlogon_seqnum();
5331
3047ad28a67b PSARC/2007/218 caller_context_t in all VOPs
amw
parents:
diff changeset
   111
			netr_info->flags |= NETR_FLG_VALID;
6139
5c743b207bf9 6541120 Configuration is not propagated to SMB kernel module
jb150015
parents: 5772
diff changeset
   112
5c743b207bf9 6541120 Configuration is not propagated to SMB kernel module
jb150015
parents: 5772
diff changeset
   113
		}
5331
3047ad28a67b PSARC/2007/218 caller_context_t in all VOPs
amw
parents:
diff changeset
   114
	}
3047ad28a67b PSARC/2007/218 caller_context_t in all VOPs
amw
parents:
diff changeset
   115
3047ad28a67b PSARC/2007/218 caller_context_t in all VOPs
amw
parents:
diff changeset
   116
	return ((rc) ? NT_STATUS_UNSUCCESSFUL : NT_STATUS_SUCCESS);
3047ad28a67b PSARC/2007/218 caller_context_t in all VOPs
amw
parents:
diff changeset
   117
}
3047ad28a67b PSARC/2007/218 caller_context_t in all VOPs
amw
parents:
diff changeset
   118
3047ad28a67b PSARC/2007/218 caller_context_t in all VOPs
amw
parents:
diff changeset
   119
/*
3047ad28a67b PSARC/2007/218 caller_context_t in all VOPs
amw
parents:
diff changeset
   120
 * netr_open
3047ad28a67b PSARC/2007/218 caller_context_t in all VOPs
amw
parents:
diff changeset
   121
 *
3047ad28a67b PSARC/2007/218 caller_context_t in all VOPs
amw
parents:
diff changeset
   122
 * Open an anonymous session to the NETLOGON pipe on a domain
3047ad28a67b PSARC/2007/218 caller_context_t in all VOPs
amw
parents:
diff changeset
   123
 * controller and bind to the NETR RPC interface. We store the
3047ad28a67b PSARC/2007/218 caller_context_t in all VOPs
amw
parents:
diff changeset
   124
 * remote server's native OS type - we may need it due to
3047ad28a67b PSARC/2007/218 caller_context_t in all VOPs
amw
parents:
diff changeset
   125
 * differences between versions of Windows.
3047ad28a67b PSARC/2007/218 caller_context_t in all VOPs
amw
parents:
diff changeset
   126
 */
3047ad28a67b PSARC/2007/218 caller_context_t in all VOPs
amw
parents:
diff changeset
   127
int
3047ad28a67b PSARC/2007/218 caller_context_t in all VOPs
amw
parents:
diff changeset
   128
netr_open(char *server, char *domain, mlsvc_handle_t *netr_handle)
3047ad28a67b PSARC/2007/218 caller_context_t in all VOPs
amw
parents:
diff changeset
   129
{
3047ad28a67b PSARC/2007/218 caller_context_t in all VOPs
amw
parents:
diff changeset
   130
	int fid;
3047ad28a67b PSARC/2007/218 caller_context_t in all VOPs
amw
parents:
diff changeset
   131
	int remote_os = 0;
3047ad28a67b PSARC/2007/218 caller_context_t in all VOPs
amw
parents:
diff changeset
   132
	int remote_lm = 0;
3047ad28a67b PSARC/2007/218 caller_context_t in all VOPs
amw
parents:
diff changeset
   133
	int server_pdc;
5521
cf62335046cd 6575640 rename/rmdir/remove on mixed file systems work incorrectly for mangled names
as200622
parents: 5331
diff changeset
   134
	char *user = smbrdr_ipc_get_user();
5331
3047ad28a67b PSARC/2007/218 caller_context_t in all VOPs
amw
parents:
diff changeset
   135
5521
cf62335046cd 6575640 rename/rmdir/remove on mixed file systems work incorrectly for mangled names
as200622
parents: 5331
diff changeset
   136
	if (mlsvc_logon(server, domain, user) != 0)
5331
3047ad28a67b PSARC/2007/218 caller_context_t in all VOPs
amw
parents:
diff changeset
   137
		return (-1);
3047ad28a67b PSARC/2007/218 caller_context_t in all VOPs
amw
parents:
diff changeset
   138
5521
cf62335046cd 6575640 rename/rmdir/remove on mixed file systems work incorrectly for mangled names
as200622
parents: 5331
diff changeset
   139
	fid = mlsvc_open_pipe(server, domain, user, "\\NETLOGON");
5331
3047ad28a67b PSARC/2007/218 caller_context_t in all VOPs
amw
parents:
diff changeset
   140
	if (fid < 0)
3047ad28a67b PSARC/2007/218 caller_context_t in all VOPs
amw
parents:
diff changeset
   141
		return (-1);
3047ad28a67b PSARC/2007/218 caller_context_t in all VOPs
amw
parents:
diff changeset
   142
3047ad28a67b PSARC/2007/218 caller_context_t in all VOPs
amw
parents:
diff changeset
   143
	if (mlsvc_rpc_bind(netr_handle, fid, "NETR") < 0) {
3047ad28a67b PSARC/2007/218 caller_context_t in all VOPs
amw
parents:
diff changeset
   144
		(void) mlsvc_close_pipe(fid);
3047ad28a67b PSARC/2007/218 caller_context_t in all VOPs
amw
parents:
diff changeset
   145
		return (-1);
3047ad28a67b PSARC/2007/218 caller_context_t in all VOPs
amw
parents:
diff changeset
   146
	}
3047ad28a67b PSARC/2007/218 caller_context_t in all VOPs
amw
parents:
diff changeset
   147
3047ad28a67b PSARC/2007/218 caller_context_t in all VOPs
amw
parents:
diff changeset
   148
	(void) mlsvc_session_native_values(fid, &remote_os, &remote_lm,
3047ad28a67b PSARC/2007/218 caller_context_t in all VOPs
amw
parents:
diff changeset
   149
	    &server_pdc);
3047ad28a67b PSARC/2007/218 caller_context_t in all VOPs
amw
parents:
diff changeset
   150
	netr_handle->context->server_os = remote_os;
3047ad28a67b PSARC/2007/218 caller_context_t in all VOPs
amw
parents:
diff changeset
   151
	netr_handle->context->server_pdc = server_pdc;
3047ad28a67b PSARC/2007/218 caller_context_t in all VOPs
amw
parents:
diff changeset
   152
	return (0);
3047ad28a67b PSARC/2007/218 caller_context_t in all VOPs
amw
parents:
diff changeset
   153
}
3047ad28a67b PSARC/2007/218 caller_context_t in all VOPs
amw
parents:
diff changeset
   154
3047ad28a67b PSARC/2007/218 caller_context_t in all VOPs
amw
parents:
diff changeset
   155
/*
3047ad28a67b PSARC/2007/218 caller_context_t in all VOPs
amw
parents:
diff changeset
   156
 * netr_close
3047ad28a67b PSARC/2007/218 caller_context_t in all VOPs
amw
parents:
diff changeset
   157
 *
3047ad28a67b PSARC/2007/218 caller_context_t in all VOPs
amw
parents:
diff changeset
   158
 * Close a NETLOGON pipe and free the RPC context.
3047ad28a67b PSARC/2007/218 caller_context_t in all VOPs
amw
parents:
diff changeset
   159
 */
3047ad28a67b PSARC/2007/218 caller_context_t in all VOPs
amw
parents:
diff changeset
   160
int
3047ad28a67b PSARC/2007/218 caller_context_t in all VOPs
amw
parents:
diff changeset
   161
netr_close(mlsvc_handle_t *netr_handle)
3047ad28a67b PSARC/2007/218 caller_context_t in all VOPs
amw
parents:
diff changeset
   162
{
3047ad28a67b PSARC/2007/218 caller_context_t in all VOPs
amw
parents:
diff changeset
   163
	(void) mlsvc_close_pipe(netr_handle->context->fid);
3047ad28a67b PSARC/2007/218 caller_context_t in all VOPs
amw
parents:
diff changeset
   164
	free(netr_handle->context);
3047ad28a67b PSARC/2007/218 caller_context_t in all VOPs
amw
parents:
diff changeset
   165
	return (0);
3047ad28a67b PSARC/2007/218 caller_context_t in all VOPs
amw
parents:
diff changeset
   166
}
3047ad28a67b PSARC/2007/218 caller_context_t in all VOPs
amw
parents:
diff changeset
   167
3047ad28a67b PSARC/2007/218 caller_context_t in all VOPs
amw
parents:
diff changeset
   168
/*
3047ad28a67b PSARC/2007/218 caller_context_t in all VOPs
amw
parents:
diff changeset
   169
 * netr_server_req_challenge
3047ad28a67b PSARC/2007/218 caller_context_t in all VOPs
amw
parents:
diff changeset
   170
 */
3047ad28a67b PSARC/2007/218 caller_context_t in all VOPs
amw
parents:
diff changeset
   171
static int
3047ad28a67b PSARC/2007/218 caller_context_t in all VOPs
amw
parents:
diff changeset
   172
netr_server_req_challenge(mlsvc_handle_t *netr_handle, netr_info_t *netr_info)
3047ad28a67b PSARC/2007/218 caller_context_t in all VOPs
amw
parents:
diff changeset
   173
{
3047ad28a67b PSARC/2007/218 caller_context_t in all VOPs
amw
parents:
diff changeset
   174
	struct netr_ServerReqChallenge arg;
3047ad28a67b PSARC/2007/218 caller_context_t in all VOPs
amw
parents:
diff changeset
   175
	mlrpc_heapref_t heap;
3047ad28a67b PSARC/2007/218 caller_context_t in all VOPs
amw
parents:
diff changeset
   176
	int opnum;
3047ad28a67b PSARC/2007/218 caller_context_t in all VOPs
amw
parents:
diff changeset
   177
	int rc;
3047ad28a67b PSARC/2007/218 caller_context_t in all VOPs
amw
parents:
diff changeset
   178
3047ad28a67b PSARC/2007/218 caller_context_t in all VOPs
amw
parents:
diff changeset
   179
	bzero(&arg, sizeof (struct netr_ServerReqChallenge));
3047ad28a67b PSARC/2007/218 caller_context_t in all VOPs
amw
parents:
diff changeset
   180
	opnum = NETR_OPNUM_ServerReqChallenge;
3047ad28a67b PSARC/2007/218 caller_context_t in all VOPs
amw
parents:
diff changeset
   181
3047ad28a67b PSARC/2007/218 caller_context_t in all VOPs
amw
parents:
diff changeset
   182
	arg.servername = (unsigned char *)netr_info->server;
3047ad28a67b PSARC/2007/218 caller_context_t in all VOPs
amw
parents:
diff changeset
   183
	arg.hostname = (unsigned char *)netr_info->hostname;
3047ad28a67b PSARC/2007/218 caller_context_t in all VOPs
amw
parents:
diff changeset
   184
3047ad28a67b PSARC/2007/218 caller_context_t in all VOPs
amw
parents:
diff changeset
   185
	(void) memcpy(&arg.client_challenge, &netr_info->client_challenge,
3047ad28a67b PSARC/2007/218 caller_context_t in all VOPs
amw
parents:
diff changeset
   186
	    sizeof (struct netr_credential));
3047ad28a67b PSARC/2007/218 caller_context_t in all VOPs
amw
parents:
diff changeset
   187
3047ad28a67b PSARC/2007/218 caller_context_t in all VOPs
amw
parents:
diff changeset
   188
	(void) mlsvc_rpc_init(&heap);
3047ad28a67b PSARC/2007/218 caller_context_t in all VOPs
amw
parents:
diff changeset
   189
	rc = mlsvc_rpc_call(netr_handle->context, opnum, &arg, &heap);
3047ad28a67b PSARC/2007/218 caller_context_t in all VOPs
amw
parents:
diff changeset
   190
	if (rc == 0) {
3047ad28a67b PSARC/2007/218 caller_context_t in all VOPs
amw
parents:
diff changeset
   191
		if (arg.status != 0) {
3047ad28a67b PSARC/2007/218 caller_context_t in all VOPs
amw
parents:
diff changeset
   192
			mlsvc_rpc_report_status(opnum, arg.status);
3047ad28a67b PSARC/2007/218 caller_context_t in all VOPs
amw
parents:
diff changeset
   193
			rc = -1;
3047ad28a67b PSARC/2007/218 caller_context_t in all VOPs
amw
parents:
diff changeset
   194
		} else {
3047ad28a67b PSARC/2007/218 caller_context_t in all VOPs
amw
parents:
diff changeset
   195
			(void) memcpy(&netr_info->server_challenge,
3047ad28a67b PSARC/2007/218 caller_context_t in all VOPs
amw
parents:
diff changeset
   196
			    &arg.server_challenge,
3047ad28a67b PSARC/2007/218 caller_context_t in all VOPs
amw
parents:
diff changeset
   197
			    sizeof (struct netr_credential));
3047ad28a67b PSARC/2007/218 caller_context_t in all VOPs
amw
parents:
diff changeset
   198
		}
3047ad28a67b PSARC/2007/218 caller_context_t in all VOPs
amw
parents:
diff changeset
   199
	}
3047ad28a67b PSARC/2007/218 caller_context_t in all VOPs
amw
parents:
diff changeset
   200
3047ad28a67b PSARC/2007/218 caller_context_t in all VOPs
amw
parents:
diff changeset
   201
	mlsvc_rpc_free(netr_handle->context, &heap);
3047ad28a67b PSARC/2007/218 caller_context_t in all VOPs
amw
parents:
diff changeset
   202
	return (rc);
3047ad28a67b PSARC/2007/218 caller_context_t in all VOPs
amw
parents:
diff changeset
   203
}
3047ad28a67b PSARC/2007/218 caller_context_t in all VOPs
amw
parents:
diff changeset
   204
3047ad28a67b PSARC/2007/218 caller_context_t in all VOPs
amw
parents:
diff changeset
   205
/*
3047ad28a67b PSARC/2007/218 caller_context_t in all VOPs
amw
parents:
diff changeset
   206
 * netr_server_authenticate2
3047ad28a67b PSARC/2007/218 caller_context_t in all VOPs
amw
parents:
diff changeset
   207
 */
3047ad28a67b PSARC/2007/218 caller_context_t in all VOPs
amw
parents:
diff changeset
   208
static int
3047ad28a67b PSARC/2007/218 caller_context_t in all VOPs
amw
parents:
diff changeset
   209
netr_server_authenticate2(mlsvc_handle_t *netr_handle, netr_info_t *netr_info)
3047ad28a67b PSARC/2007/218 caller_context_t in all VOPs
amw
parents:
diff changeset
   210
{
3047ad28a67b PSARC/2007/218 caller_context_t in all VOPs
amw
parents:
diff changeset
   211
	struct netr_ServerAuthenticate2 arg;
3047ad28a67b PSARC/2007/218 caller_context_t in all VOPs
amw
parents:
diff changeset
   212
	mlrpc_heapref_t heap;
3047ad28a67b PSARC/2007/218 caller_context_t in all VOPs
amw
parents:
diff changeset
   213
	int opnum;
3047ad28a67b PSARC/2007/218 caller_context_t in all VOPs
amw
parents:
diff changeset
   214
	int rc;
7961
4b5e3051f38b 6751647 TRANS2_FIND_NEXT continuation by filename restarts search at beginning of directory
natalie li - Sun Microsystems - Irvine United States <Natalie.Li@Sun.COM>
parents: 7619
diff changeset
   215
	char account_name[NETBIOS_NAME_SZ * 2];
5331
3047ad28a67b PSARC/2007/218 caller_context_t in all VOPs
amw
parents:
diff changeset
   216
3047ad28a67b PSARC/2007/218 caller_context_t in all VOPs
amw
parents:
diff changeset
   217
	bzero(&arg, sizeof (struct netr_ServerAuthenticate2));
3047ad28a67b PSARC/2007/218 caller_context_t in all VOPs
amw
parents:
diff changeset
   218
	opnum = NETR_OPNUM_ServerAuthenticate2;
3047ad28a67b PSARC/2007/218 caller_context_t in all VOPs
amw
parents:
diff changeset
   219
3047ad28a67b PSARC/2007/218 caller_context_t in all VOPs
amw
parents:
diff changeset
   220
	(void) snprintf(account_name, sizeof (account_name), "%s$",
3047ad28a67b PSARC/2007/218 caller_context_t in all VOPs
amw
parents:
diff changeset
   221
	    netr_info->hostname);
3047ad28a67b PSARC/2007/218 caller_context_t in all VOPs
amw
parents:
diff changeset
   222
7619
0ad244464731 6736540 ntlmv2 signing does not work in domain mode
jose borrego <Jose.Borrego@Sun.COM>
parents: 7052
diff changeset
   223
	smb_tracef("server=[%s] account_name=[%s] hostname=[%s]\n",
0ad244464731 6736540 ntlmv2 signing does not work in domain mode
jose borrego <Jose.Borrego@Sun.COM>
parents: 7052
diff changeset
   224
	    netr_info->server, account_name, netr_info->hostname);
0ad244464731 6736540 ntlmv2 signing does not work in domain mode
jose borrego <Jose.Borrego@Sun.COM>
parents: 7052
diff changeset
   225
5331
3047ad28a67b PSARC/2007/218 caller_context_t in all VOPs
amw
parents:
diff changeset
   226
	arg.servername = (unsigned char *)netr_info->server;
3047ad28a67b PSARC/2007/218 caller_context_t in all VOPs
amw
parents:
diff changeset
   227
	arg.account_name = (unsigned char *)account_name;
3047ad28a67b PSARC/2007/218 caller_context_t in all VOPs
amw
parents:
diff changeset
   228
	arg.account_type = NETR_WKSTA_TRUST_ACCOUNT_TYPE;
3047ad28a67b PSARC/2007/218 caller_context_t in all VOPs
amw
parents:
diff changeset
   229
	arg.hostname = (unsigned char *)netr_info->hostname;
7619
0ad244464731 6736540 ntlmv2 signing does not work in domain mode
jose borrego <Jose.Borrego@Sun.COM>
parents: 7052
diff changeset
   230
	arg.negotiate_flags = NETR_NEGOTIATE_BASE_FLAGS;
5331
3047ad28a67b PSARC/2007/218 caller_context_t in all VOPs
amw
parents:
diff changeset
   231
7619
0ad244464731 6736540 ntlmv2 signing does not work in domain mode
jose borrego <Jose.Borrego@Sun.COM>
parents: 7052
diff changeset
   232
	if (netr_handle->context->server_os != NATIVE_OS_WINNT) {
0ad244464731 6736540 ntlmv2 signing does not work in domain mode
jose borrego <Jose.Borrego@Sun.COM>
parents: 7052
diff changeset
   233
		arg.negotiate_flags |= NETR_NEGOTIATE_STRONGKEY_FLAG;
0ad244464731 6736540 ntlmv2 signing does not work in domain mode
jose borrego <Jose.Borrego@Sun.COM>
parents: 7052
diff changeset
   234
		if (netr_gen_skey128(netr_info) != SMBAUTH_SUCCESS)
0ad244464731 6736540 ntlmv2 signing does not work in domain mode
jose borrego <Jose.Borrego@Sun.COM>
parents: 7052
diff changeset
   235
			return (-1);
0ad244464731 6736540 ntlmv2 signing does not work in domain mode
jose borrego <Jose.Borrego@Sun.COM>
parents: 7052
diff changeset
   236
	} else {
0ad244464731 6736540 ntlmv2 signing does not work in domain mode
jose borrego <Jose.Borrego@Sun.COM>
parents: 7052
diff changeset
   237
		if (netr_gen_skey64(netr_info) != SMBAUTH_SUCCESS)
0ad244464731 6736540 ntlmv2 signing does not work in domain mode
jose borrego <Jose.Borrego@Sun.COM>
parents: 7052
diff changeset
   238
			return (-1);
0ad244464731 6736540 ntlmv2 signing does not work in domain mode
jose borrego <Jose.Borrego@Sun.COM>
parents: 7052
diff changeset
   239
	}
5331
3047ad28a67b PSARC/2007/218 caller_context_t in all VOPs
amw
parents:
diff changeset
   240
7619
0ad244464731 6736540 ntlmv2 signing does not work in domain mode
jose borrego <Jose.Borrego@Sun.COM>
parents: 7052
diff changeset
   241
	if (netr_gen_credentials(netr_info->session_key.key,
0ad244464731 6736540 ntlmv2 signing does not work in domain mode
jose borrego <Jose.Borrego@Sun.COM>
parents: 7052
diff changeset
   242
	    &netr_info->client_challenge, 0,
5331
3047ad28a67b PSARC/2007/218 caller_context_t in all VOPs
amw
parents:
diff changeset
   243
	    &netr_info->client_credential) != SMBAUTH_SUCCESS) {
3047ad28a67b PSARC/2007/218 caller_context_t in all VOPs
amw
parents:
diff changeset
   244
		return (-1);
3047ad28a67b PSARC/2007/218 caller_context_t in all VOPs
amw
parents:
diff changeset
   245
	}
3047ad28a67b PSARC/2007/218 caller_context_t in all VOPs
amw
parents:
diff changeset
   246
7619
0ad244464731 6736540 ntlmv2 signing does not work in domain mode
jose borrego <Jose.Borrego@Sun.COM>
parents: 7052
diff changeset
   247
	if (netr_gen_credentials(netr_info->session_key.key,
0ad244464731 6736540 ntlmv2 signing does not work in domain mode
jose borrego <Jose.Borrego@Sun.COM>
parents: 7052
diff changeset
   248
	    &netr_info->server_challenge, 0,
5331
3047ad28a67b PSARC/2007/218 caller_context_t in all VOPs
amw
parents:
diff changeset
   249
	    &netr_info->server_credential) != SMBAUTH_SUCCESS) {
3047ad28a67b PSARC/2007/218 caller_context_t in all VOPs
amw
parents:
diff changeset
   250
		return (-1);
3047ad28a67b PSARC/2007/218 caller_context_t in all VOPs
amw
parents:
diff changeset
   251
	}
3047ad28a67b PSARC/2007/218 caller_context_t in all VOPs
amw
parents:
diff changeset
   252
3047ad28a67b PSARC/2007/218 caller_context_t in all VOPs
amw
parents:
diff changeset
   253
	(void) memcpy(&arg.client_credential, &netr_info->client_credential,
3047ad28a67b PSARC/2007/218 caller_context_t in all VOPs
amw
parents:
diff changeset
   254
	    sizeof (struct netr_credential));
3047ad28a67b PSARC/2007/218 caller_context_t in all VOPs
amw
parents:
diff changeset
   255
3047ad28a67b PSARC/2007/218 caller_context_t in all VOPs
amw
parents:
diff changeset
   256
	(void) mlsvc_rpc_init(&heap);
3047ad28a67b PSARC/2007/218 caller_context_t in all VOPs
amw
parents:
diff changeset
   257
3047ad28a67b PSARC/2007/218 caller_context_t in all VOPs
amw
parents:
diff changeset
   258
	rc = mlsvc_rpc_call(netr_handle->context, opnum, &arg, &heap);
3047ad28a67b PSARC/2007/218 caller_context_t in all VOPs
amw
parents:
diff changeset
   259
	if (rc == 0) {
3047ad28a67b PSARC/2007/218 caller_context_t in all VOPs
amw
parents:
diff changeset
   260
		if (arg.status != 0) {
3047ad28a67b PSARC/2007/218 caller_context_t in all VOPs
amw
parents:
diff changeset
   261
			mlsvc_rpc_report_status(opnum, arg.status);
3047ad28a67b PSARC/2007/218 caller_context_t in all VOPs
amw
parents:
diff changeset
   262
			rc = -1;
3047ad28a67b PSARC/2007/218 caller_context_t in all VOPs
amw
parents:
diff changeset
   263
		} else {
3047ad28a67b PSARC/2007/218 caller_context_t in all VOPs
amw
parents:
diff changeset
   264
			rc = memcmp(&netr_info->server_credential,
3047ad28a67b PSARC/2007/218 caller_context_t in all VOPs
amw
parents:
diff changeset
   265
			    &arg.server_credential,
3047ad28a67b PSARC/2007/218 caller_context_t in all VOPs
amw
parents:
diff changeset
   266
			    sizeof (struct netr_credential));
3047ad28a67b PSARC/2007/218 caller_context_t in all VOPs
amw
parents:
diff changeset
   267
		}
3047ad28a67b PSARC/2007/218 caller_context_t in all VOPs
amw
parents:
diff changeset
   268
	}
3047ad28a67b PSARC/2007/218 caller_context_t in all VOPs
amw
parents:
diff changeset
   269
3047ad28a67b PSARC/2007/218 caller_context_t in all VOPs
amw
parents:
diff changeset
   270
	mlsvc_rpc_free(netr_handle->context, &heap);
3047ad28a67b PSARC/2007/218 caller_context_t in all VOPs
amw
parents:
diff changeset
   271
	return (rc);
3047ad28a67b PSARC/2007/218 caller_context_t in all VOPs
amw
parents:
diff changeset
   272
}
3047ad28a67b PSARC/2007/218 caller_context_t in all VOPs
amw
parents:
diff changeset
   273
3047ad28a67b PSARC/2007/218 caller_context_t in all VOPs
amw
parents:
diff changeset
   274
/*
7619
0ad244464731 6736540 ntlmv2 signing does not work in domain mode
jose borrego <Jose.Borrego@Sun.COM>
parents: 7052
diff changeset
   275
 * netr_gen_skey128
5331
3047ad28a67b PSARC/2007/218 caller_context_t in all VOPs
amw
parents:
diff changeset
   276
 *
7619
0ad244464731 6736540 ntlmv2 signing does not work in domain mode
jose borrego <Jose.Borrego@Sun.COM>
parents: 7052
diff changeset
   277
 * Generate a 128-bit session key from the client and server challenges.
0ad244464731 6736540 ntlmv2 signing does not work in domain mode
jose borrego <Jose.Borrego@Sun.COM>
parents: 7052
diff changeset
   278
 * See "Session-Key Computation" section of MS-NRPC document.
5331
3047ad28a67b PSARC/2007/218 caller_context_t in all VOPs
amw
parents:
diff changeset
   279
 */
7052
efa04b030974 6615409 Rename appropriate structures in userland
amw
parents: 6432
diff changeset
   280
int
7619
0ad244464731 6736540 ntlmv2 signing does not work in domain mode
jose borrego <Jose.Borrego@Sun.COM>
parents: 7052
diff changeset
   281
netr_gen_skey128(netr_info_t *netr_info)
7052
efa04b030974 6615409 Rename appropriate structures in userland
amw
parents: 6432
diff changeset
   282
{
efa04b030974 6615409 Rename appropriate structures in userland
amw
parents: 6432
diff changeset
   283
	unsigned char ntlmhash[SMBAUTH_HASH_SZ];
efa04b030974 6615409 Rename appropriate structures in userland
amw
parents: 6432
diff changeset
   284
	int rc = SMBAUTH_FAILURE;
efa04b030974 6615409 Rename appropriate structures in userland
amw
parents: 6432
diff changeset
   285
	CK_RV rv;
efa04b030974 6615409 Rename appropriate structures in userland
amw
parents: 6432
diff changeset
   286
	CK_MECHANISM mechanism;
efa04b030974 6615409 Rename appropriate structures in userland
amw
parents: 6432
diff changeset
   287
	CK_SESSION_HANDLE hSession;
efa04b030974 6615409 Rename appropriate structures in userland
amw
parents: 6432
diff changeset
   288
	CK_ULONG diglen = MD_DIGEST_LEN;
efa04b030974 6615409 Rename appropriate structures in userland
amw
parents: 6432
diff changeset
   289
	unsigned char md5digest[MD_DIGEST_LEN];
efa04b030974 6615409 Rename appropriate structures in userland
amw
parents: 6432
diff changeset
   290
	unsigned char zerobuf[NETR_SESSKEY_ZEROBUF_SZ];
efa04b030974 6615409 Rename appropriate structures in userland
amw
parents: 6432
diff changeset
   291
efa04b030974 6615409 Rename appropriate structures in userland
amw
parents: 6432
diff changeset
   292
	bzero(ntlmhash, SMBAUTH_HASH_SZ);
efa04b030974 6615409 Rename appropriate structures in userland
amw
parents: 6432
diff changeset
   293
	/*
efa04b030974 6615409 Rename appropriate structures in userland
amw
parents: 6432
diff changeset
   294
	 * We should check (netr_info->flags & NETR_FLG_INIT) and use
efa04b030974 6615409 Rename appropriate structures in userland
amw
parents: 6432
diff changeset
   295
	 * the appropriate password but it isn't working yet.  So we
efa04b030974 6615409 Rename appropriate structures in userland
amw
parents: 6432
diff changeset
   296
	 * always use the default one for now.
efa04b030974 6615409 Rename appropriate structures in userland
amw
parents: 6432
diff changeset
   297
	 */
efa04b030974 6615409 Rename appropriate structures in userland
amw
parents: 6432
diff changeset
   298
	bzero(netr_info->password, sizeof (netr_info->password));
efa04b030974 6615409 Rename appropriate structures in userland
amw
parents: 6432
diff changeset
   299
	rc = smb_config_getstr(SMB_CI_MACHINE_PASSWD,
efa04b030974 6615409 Rename appropriate structures in userland
amw
parents: 6432
diff changeset
   300
	    (char *)netr_info->password, sizeof (netr_info->password));
efa04b030974 6615409 Rename appropriate structures in userland
amw
parents: 6432
diff changeset
   301
efa04b030974 6615409 Rename appropriate structures in userland
amw
parents: 6432
diff changeset
   302
	if ((rc != SMBD_SMF_OK) || *netr_info->password == '\0') {
efa04b030974 6615409 Rename appropriate structures in userland
amw
parents: 6432
diff changeset
   303
		return (SMBAUTH_FAILURE);
efa04b030974 6615409 Rename appropriate structures in userland
amw
parents: 6432
diff changeset
   304
	}
efa04b030974 6615409 Rename appropriate structures in userland
amw
parents: 6432
diff changeset
   305
efa04b030974 6615409 Rename appropriate structures in userland
amw
parents: 6432
diff changeset
   306
	rc = smb_auth_ntlm_hash((char *)netr_info->password, ntlmhash);
efa04b030974 6615409 Rename appropriate structures in userland
amw
parents: 6432
diff changeset
   307
	if (rc != SMBAUTH_SUCCESS)
efa04b030974 6615409 Rename appropriate structures in userland
amw
parents: 6432
diff changeset
   308
		return (SMBAUTH_FAILURE);
efa04b030974 6615409 Rename appropriate structures in userland
amw
parents: 6432
diff changeset
   309
efa04b030974 6615409 Rename appropriate structures in userland
amw
parents: 6432
diff changeset
   310
	bzero(zerobuf, NETR_SESSKEY_ZEROBUF_SZ);
efa04b030974 6615409 Rename appropriate structures in userland
amw
parents: 6432
diff changeset
   311
efa04b030974 6615409 Rename appropriate structures in userland
amw
parents: 6432
diff changeset
   312
	mechanism.mechanism = CKM_MD5;
efa04b030974 6615409 Rename appropriate structures in userland
amw
parents: 6432
diff changeset
   313
	mechanism.pParameter = 0;
efa04b030974 6615409 Rename appropriate structures in userland
amw
parents: 6432
diff changeset
   314
	mechanism.ulParameterLen = 0;
efa04b030974 6615409 Rename appropriate structures in userland
amw
parents: 6432
diff changeset
   315
efa04b030974 6615409 Rename appropriate structures in userland
amw
parents: 6432
diff changeset
   316
	rv = SUNW_C_GetMechSession(mechanism.mechanism, &hSession);
efa04b030974 6615409 Rename appropriate structures in userland
amw
parents: 6432
diff changeset
   317
	if (rv != CKR_OK)
efa04b030974 6615409 Rename appropriate structures in userland
amw
parents: 6432
diff changeset
   318
		return (SMBAUTH_FAILURE);
efa04b030974 6615409 Rename appropriate structures in userland
amw
parents: 6432
diff changeset
   319
efa04b030974 6615409 Rename appropriate structures in userland
amw
parents: 6432
diff changeset
   320
	rv = C_DigestInit(hSession, &mechanism);
efa04b030974 6615409 Rename appropriate structures in userland
amw
parents: 6432
diff changeset
   321
	if (rv != CKR_OK)
efa04b030974 6615409 Rename appropriate structures in userland
amw
parents: 6432
diff changeset
   322
		goto cleanup;
efa04b030974 6615409 Rename appropriate structures in userland
amw
parents: 6432
diff changeset
   323
efa04b030974 6615409 Rename appropriate structures in userland
amw
parents: 6432
diff changeset
   324
	rv = C_DigestUpdate(hSession, (CK_BYTE_PTR)zerobuf,
efa04b030974 6615409 Rename appropriate structures in userland
amw
parents: 6432
diff changeset
   325
	    NETR_SESSKEY_ZEROBUF_SZ);
efa04b030974 6615409 Rename appropriate structures in userland
amw
parents: 6432
diff changeset
   326
	if (rv != CKR_OK)
efa04b030974 6615409 Rename appropriate structures in userland
amw
parents: 6432
diff changeset
   327
		goto cleanup;
efa04b030974 6615409 Rename appropriate structures in userland
amw
parents: 6432
diff changeset
   328
efa04b030974 6615409 Rename appropriate structures in userland
amw
parents: 6432
diff changeset
   329
	rv = C_DigestUpdate(hSession,
efa04b030974 6615409 Rename appropriate structures in userland
amw
parents: 6432
diff changeset
   330
	    (CK_BYTE_PTR)netr_info->client_challenge.data, NETR_CRED_DATA_SZ);
efa04b030974 6615409 Rename appropriate structures in userland
amw
parents: 6432
diff changeset
   331
	if (rv != CKR_OK)
efa04b030974 6615409 Rename appropriate structures in userland
amw
parents: 6432
diff changeset
   332
		goto cleanup;
efa04b030974 6615409 Rename appropriate structures in userland
amw
parents: 6432
diff changeset
   333
efa04b030974 6615409 Rename appropriate structures in userland
amw
parents: 6432
diff changeset
   334
	rv = C_DigestUpdate(hSession,
efa04b030974 6615409 Rename appropriate structures in userland
amw
parents: 6432
diff changeset
   335
	    (CK_BYTE_PTR)netr_info->server_challenge.data, NETR_CRED_DATA_SZ);
efa04b030974 6615409 Rename appropriate structures in userland
amw
parents: 6432
diff changeset
   336
	if (rv != CKR_OK)
efa04b030974 6615409 Rename appropriate structures in userland
amw
parents: 6432
diff changeset
   337
		goto cleanup;
efa04b030974 6615409 Rename appropriate structures in userland
amw
parents: 6432
diff changeset
   338
efa04b030974 6615409 Rename appropriate structures in userland
amw
parents: 6432
diff changeset
   339
	rv = C_DigestFinal(hSession, (CK_BYTE_PTR)md5digest, &diglen);
efa04b030974 6615409 Rename appropriate structures in userland
amw
parents: 6432
diff changeset
   340
	if (rv != CKR_OK)
efa04b030974 6615409 Rename appropriate structures in userland
amw
parents: 6432
diff changeset
   341
		goto cleanup;
efa04b030974 6615409 Rename appropriate structures in userland
amw
parents: 6432
diff changeset
   342
efa04b030974 6615409 Rename appropriate structures in userland
amw
parents: 6432
diff changeset
   343
	rc = smb_auth_hmac_md5(md5digest, diglen, ntlmhash, SMBAUTH_HASH_SZ,
7619
0ad244464731 6736540 ntlmv2 signing does not work in domain mode
jose borrego <Jose.Borrego@Sun.COM>
parents: 7052
diff changeset
   344
	    netr_info->session_key.key);
7052
efa04b030974 6615409 Rename appropriate structures in userland
amw
parents: 6432
diff changeset
   345
7619
0ad244464731 6736540 ntlmv2 signing does not work in domain mode
jose borrego <Jose.Borrego@Sun.COM>
parents: 7052
diff changeset
   346
	netr_info->session_key.len = NETR_SESSKEY128_SZ;
7052
efa04b030974 6615409 Rename appropriate structures in userland
amw
parents: 6432
diff changeset
   347
cleanup:
efa04b030974 6615409 Rename appropriate structures in userland
amw
parents: 6432
diff changeset
   348
	(void) C_CloseSession(hSession);
efa04b030974 6615409 Rename appropriate structures in userland
amw
parents: 6432
diff changeset
   349
	return (rc);
efa04b030974 6615409 Rename appropriate structures in userland
amw
parents: 6432
diff changeset
   350
efa04b030974 6615409 Rename appropriate structures in userland
amw
parents: 6432
diff changeset
   351
}
7619
0ad244464731 6736540 ntlmv2 signing does not work in domain mode
jose borrego <Jose.Borrego@Sun.COM>
parents: 7052
diff changeset
   352
/*
0ad244464731 6736540 ntlmv2 signing does not work in domain mode
jose borrego <Jose.Borrego@Sun.COM>
parents: 7052
diff changeset
   353
 * netr_gen_skey64
0ad244464731 6736540 ntlmv2 signing does not work in domain mode
jose borrego <Jose.Borrego@Sun.COM>
parents: 7052
diff changeset
   354
 *
0ad244464731 6736540 ntlmv2 signing does not work in domain mode
jose borrego <Jose.Borrego@Sun.COM>
parents: 7052
diff changeset
   355
 * Generate a 64-bit session key from the client and server challenges.
0ad244464731 6736540 ntlmv2 signing does not work in domain mode
jose borrego <Jose.Borrego@Sun.COM>
parents: 7052
diff changeset
   356
 * See "Session-Key Computation" section of MS-NRPC document.
0ad244464731 6736540 ntlmv2 signing does not work in domain mode
jose borrego <Jose.Borrego@Sun.COM>
parents: 7052
diff changeset
   357
 *
0ad244464731 6736540 ntlmv2 signing does not work in domain mode
jose borrego <Jose.Borrego@Sun.COM>
parents: 7052
diff changeset
   358
 * The algorithm is a two stage hash. For the first hash, the input is
0ad244464731 6736540 ntlmv2 signing does not work in domain mode
jose borrego <Jose.Borrego@Sun.COM>
parents: 7052
diff changeset
   359
 * the combination of the client and server challenges, the key is
0ad244464731 6736540 ntlmv2 signing does not work in domain mode
jose borrego <Jose.Borrego@Sun.COM>
parents: 7052
diff changeset
   360
 * the first 7 bytes of the password. The initial password is formed
0ad244464731 6736540 ntlmv2 signing does not work in domain mode
jose borrego <Jose.Borrego@Sun.COM>
parents: 7052
diff changeset
   361
 * using the NT password hash on the local hostname in lower case.
0ad244464731 6736540 ntlmv2 signing does not work in domain mode
jose borrego <Jose.Borrego@Sun.COM>
parents: 7052
diff changeset
   362
 * The result is stored in a temporary buffer.
0ad244464731 6736540 ntlmv2 signing does not work in domain mode
jose borrego <Jose.Borrego@Sun.COM>
parents: 7052
diff changeset
   363
 *
0ad244464731 6736540 ntlmv2 signing does not work in domain mode
jose borrego <Jose.Borrego@Sun.COM>
parents: 7052
diff changeset
   364
 *		input:	challenge
0ad244464731 6736540 ntlmv2 signing does not work in domain mode
jose borrego <Jose.Borrego@Sun.COM>
parents: 7052
diff changeset
   365
 *		key:	passwd lower 7 bytes
0ad244464731 6736540 ntlmv2 signing does not work in domain mode
jose borrego <Jose.Borrego@Sun.COM>
parents: 7052
diff changeset
   366
 *		output:	intermediate result
0ad244464731 6736540 ntlmv2 signing does not work in domain mode
jose borrego <Jose.Borrego@Sun.COM>
parents: 7052
diff changeset
   367
 *
0ad244464731 6736540 ntlmv2 signing does not work in domain mode
jose borrego <Jose.Borrego@Sun.COM>
parents: 7052
diff changeset
   368
 * For the second hash, the input is the result of the first hash and
0ad244464731 6736540 ntlmv2 signing does not work in domain mode
jose borrego <Jose.Borrego@Sun.COM>
parents: 7052
diff changeset
   369
 * the key is the last 7 bytes of the password.
0ad244464731 6736540 ntlmv2 signing does not work in domain mode
jose borrego <Jose.Borrego@Sun.COM>
parents: 7052
diff changeset
   370
 *
0ad244464731 6736540 ntlmv2 signing does not work in domain mode
jose borrego <Jose.Borrego@Sun.COM>
parents: 7052
diff changeset
   371
 *		input:	result of first hash
0ad244464731 6736540 ntlmv2 signing does not work in domain mode
jose borrego <Jose.Borrego@Sun.COM>
parents: 7052
diff changeset
   372
 *		key:	passwd upper 7 bytes
0ad244464731 6736540 ntlmv2 signing does not work in domain mode
jose borrego <Jose.Borrego@Sun.COM>
parents: 7052
diff changeset
   373
 *		output:	session_key
0ad244464731 6736540 ntlmv2 signing does not work in domain mode
jose borrego <Jose.Borrego@Sun.COM>
parents: 7052
diff changeset
   374
 *
0ad244464731 6736540 ntlmv2 signing does not work in domain mode
jose borrego <Jose.Borrego@Sun.COM>
parents: 7052
diff changeset
   375
 * The final output should be the session key.
0ad244464731 6736540 ntlmv2 signing does not work in domain mode
jose borrego <Jose.Borrego@Sun.COM>
parents: 7052
diff changeset
   376
 *
0ad244464731 6736540 ntlmv2 signing does not work in domain mode
jose borrego <Jose.Borrego@Sun.COM>
parents: 7052
diff changeset
   377
 *		FYI: smb_auth_DES(output, key, input)
0ad244464731 6736540 ntlmv2 signing does not work in domain mode
jose borrego <Jose.Borrego@Sun.COM>
parents: 7052
diff changeset
   378
 *
0ad244464731 6736540 ntlmv2 signing does not work in domain mode
jose borrego <Jose.Borrego@Sun.COM>
parents: 7052
diff changeset
   379
 * If any difficulties occur using the cryptographic framework, the
0ad244464731 6736540 ntlmv2 signing does not work in domain mode
jose borrego <Jose.Borrego@Sun.COM>
parents: 7052
diff changeset
   380
 * function returns SMBAUTH_FAILURE.  Otherwise SMBAUTH_SUCCESS is
0ad244464731 6736540 ntlmv2 signing does not work in domain mode
jose borrego <Jose.Borrego@Sun.COM>
parents: 7052
diff changeset
   381
 * returned.
0ad244464731 6736540 ntlmv2 signing does not work in domain mode
jose borrego <Jose.Borrego@Sun.COM>
parents: 7052
diff changeset
   382
 */
5331
3047ad28a67b PSARC/2007/218 caller_context_t in all VOPs
amw
parents:
diff changeset
   383
int
7619
0ad244464731 6736540 ntlmv2 signing does not work in domain mode
jose borrego <Jose.Borrego@Sun.COM>
parents: 7052
diff changeset
   384
netr_gen_skey64(netr_info_t *netr_info)
5331
3047ad28a67b PSARC/2007/218 caller_context_t in all VOPs
amw
parents:
diff changeset
   385
{
3047ad28a67b PSARC/2007/218 caller_context_t in all VOPs
amw
parents:
diff changeset
   386
	unsigned char md4hash[32];
3047ad28a67b PSARC/2007/218 caller_context_t in all VOPs
amw
parents:
diff changeset
   387
	unsigned char buffer[8];
3047ad28a67b PSARC/2007/218 caller_context_t in all VOPs
amw
parents:
diff changeset
   388
	DWORD data[2];
3047ad28a67b PSARC/2007/218 caller_context_t in all VOPs
amw
parents:
diff changeset
   389
	DWORD *client_challenge;
3047ad28a67b PSARC/2007/218 caller_context_t in all VOPs
amw
parents:
diff changeset
   390
	DWORD *server_challenge;
3047ad28a67b PSARC/2007/218 caller_context_t in all VOPs
amw
parents:
diff changeset
   391
	int rc;
5521
cf62335046cd 6575640 rename/rmdir/remove on mixed file systems work incorrectly for mangled names
as200622
parents: 5331
diff changeset
   392
	DWORD le_data[2];
5331
3047ad28a67b PSARC/2007/218 caller_context_t in all VOPs
amw
parents:
diff changeset
   393
3047ad28a67b PSARC/2007/218 caller_context_t in all VOPs
amw
parents:
diff changeset
   394
	client_challenge = (DWORD *)(uintptr_t)&netr_info->client_challenge;
3047ad28a67b PSARC/2007/218 caller_context_t in all VOPs
amw
parents:
diff changeset
   395
	server_challenge = (DWORD *)(uintptr_t)&netr_info->server_challenge;
3047ad28a67b PSARC/2007/218 caller_context_t in all VOPs
amw
parents:
diff changeset
   396
	bzero(md4hash, 32);
3047ad28a67b PSARC/2007/218 caller_context_t in all VOPs
amw
parents:
diff changeset
   397
3047ad28a67b PSARC/2007/218 caller_context_t in all VOPs
amw
parents:
diff changeset
   398
	/*
3047ad28a67b PSARC/2007/218 caller_context_t in all VOPs
amw
parents:
diff changeset
   399
	 * We should check (netr_info->flags & NETR_FLG_INIT) and use
3047ad28a67b PSARC/2007/218 caller_context_t in all VOPs
amw
parents:
diff changeset
   400
	 * the appropriate password but it isn't working yet.  So we
3047ad28a67b PSARC/2007/218 caller_context_t in all VOPs
amw
parents:
diff changeset
   401
	 * always use the default one for now.
3047ad28a67b PSARC/2007/218 caller_context_t in all VOPs
amw
parents:
diff changeset
   402
	 */
5772
237ac22142fe 6560095 SNAS shows SIDs for Built-in Groups members instead of name
as200622
parents: 5521
diff changeset
   403
	bzero(netr_info->password, sizeof (netr_info->password));
237ac22142fe 6560095 SNAS shows SIDs for Built-in Groups members instead of name
as200622
parents: 5521
diff changeset
   404
	rc = smb_config_getstr(SMB_CI_MACHINE_PASSWD,
237ac22142fe 6560095 SNAS shows SIDs for Built-in Groups members instead of name
as200622
parents: 5521
diff changeset
   405
	    (char *)netr_info->password, sizeof (netr_info->password));
5331
3047ad28a67b PSARC/2007/218 caller_context_t in all VOPs
amw
parents:
diff changeset
   406
5772
237ac22142fe 6560095 SNAS shows SIDs for Built-in Groups members instead of name
as200622
parents: 5521
diff changeset
   407
	if ((rc != SMBD_SMF_OK) || *netr_info->password == '\0') {
7052
efa04b030974 6615409 Rename appropriate structures in userland
amw
parents: 6432
diff changeset
   408
		return (SMBAUTH_FAILURE);
5331
3047ad28a67b PSARC/2007/218 caller_context_t in all VOPs
amw
parents:
diff changeset
   409
	}
3047ad28a67b PSARC/2007/218 caller_context_t in all VOPs
amw
parents:
diff changeset
   410
5772
237ac22142fe 6560095 SNAS shows SIDs for Built-in Groups members instead of name
as200622
parents: 5521
diff changeset
   411
	rc = smb_auth_ntlm_hash((char *)netr_info->password, md4hash);
5331
3047ad28a67b PSARC/2007/218 caller_context_t in all VOPs
amw
parents:
diff changeset
   412
3047ad28a67b PSARC/2007/218 caller_context_t in all VOPs
amw
parents:
diff changeset
   413
	if (rc != SMBAUTH_SUCCESS)
3047ad28a67b PSARC/2007/218 caller_context_t in all VOPs
amw
parents:
diff changeset
   414
		return (SMBAUTH_FAILURE);
3047ad28a67b PSARC/2007/218 caller_context_t in all VOPs
amw
parents:
diff changeset
   415
3047ad28a67b PSARC/2007/218 caller_context_t in all VOPs
amw
parents:
diff changeset
   416
	data[0] = LE_IN32(&client_challenge[0]) + LE_IN32(&server_challenge[0]);
3047ad28a67b PSARC/2007/218 caller_context_t in all VOPs
amw
parents:
diff changeset
   417
	data[1] = LE_IN32(&client_challenge[1]) + LE_IN32(&server_challenge[1]);
5521
cf62335046cd 6575640 rename/rmdir/remove on mixed file systems work incorrectly for mangled names
as200622
parents: 5331
diff changeset
   418
	LE_OUT32(&le_data[0], data[0]);
cf62335046cd 6575640 rename/rmdir/remove on mixed file systems work incorrectly for mangled names
as200622
parents: 5331
diff changeset
   419
	LE_OUT32(&le_data[1], data[1]);
7619
0ad244464731 6736540 ntlmv2 signing does not work in domain mode
jose borrego <Jose.Borrego@Sun.COM>
parents: 7052
diff changeset
   420
	rc = smb_auth_DES(buffer, 8, md4hash, NETR_DESKEY_LEN,
0ad244464731 6736540 ntlmv2 signing does not work in domain mode
jose borrego <Jose.Borrego@Sun.COM>
parents: 7052
diff changeset
   421
	    (unsigned char *)le_data, 8);
5331
3047ad28a67b PSARC/2007/218 caller_context_t in all VOPs
amw
parents:
diff changeset
   422
3047ad28a67b PSARC/2007/218 caller_context_t in all VOPs
amw
parents:
diff changeset
   423
	if (rc != SMBAUTH_SUCCESS)
3047ad28a67b PSARC/2007/218 caller_context_t in all VOPs
amw
parents:
diff changeset
   424
		return (rc);
3047ad28a67b PSARC/2007/218 caller_context_t in all VOPs
amw
parents:
diff changeset
   425
7619
0ad244464731 6736540 ntlmv2 signing does not work in domain mode
jose borrego <Jose.Borrego@Sun.COM>
parents: 7052
diff changeset
   426
	netr_info->session_key.len = NETR_SESSKEY64_SZ;
0ad244464731 6736540 ntlmv2 signing does not work in domain mode
jose borrego <Jose.Borrego@Sun.COM>
parents: 7052
diff changeset
   427
	rc = smb_auth_DES(netr_info->session_key.key,
0ad244464731 6736540 ntlmv2 signing does not work in domain mode
jose borrego <Jose.Borrego@Sun.COM>
parents: 7052
diff changeset
   428
	    netr_info->session_key.len, &md4hash[9], NETR_DESKEY_LEN, buffer,
0ad244464731 6736540 ntlmv2 signing does not work in domain mode
jose borrego <Jose.Borrego@Sun.COM>
parents: 7052
diff changeset
   429
	    8);
0ad244464731 6736540 ntlmv2 signing does not work in domain mode
jose borrego <Jose.Borrego@Sun.COM>
parents: 7052
diff changeset
   430
5331
3047ad28a67b PSARC/2007/218 caller_context_t in all VOPs
amw
parents:
diff changeset
   431
	return (rc);
3047ad28a67b PSARC/2007/218 caller_context_t in all VOPs
amw
parents:
diff changeset
   432
}
3047ad28a67b PSARC/2007/218 caller_context_t in all VOPs
amw
parents:
diff changeset
   433
3047ad28a67b PSARC/2007/218 caller_context_t in all VOPs
amw
parents:
diff changeset
   434
/*
3047ad28a67b PSARC/2007/218 caller_context_t in all VOPs
amw
parents:
diff changeset
   435
 * netr_gen_credentials
3047ad28a67b PSARC/2007/218 caller_context_t in all VOPs
amw
parents:
diff changeset
   436
 *
3047ad28a67b PSARC/2007/218 caller_context_t in all VOPs
amw
parents:
diff changeset
   437
 * Generate a set of credentials from a challenge and a session key.
3047ad28a67b PSARC/2007/218 caller_context_t in all VOPs
amw
parents:
diff changeset
   438
 * The algorithm is a two stage hash. For the first hash, the
3047ad28a67b PSARC/2007/218 caller_context_t in all VOPs
amw
parents:
diff changeset
   439
 * timestamp is added to the challenge and the result is stored in a
3047ad28a67b PSARC/2007/218 caller_context_t in all VOPs
amw
parents:
diff changeset
   440
 * temporary buffer:
3047ad28a67b PSARC/2007/218 caller_context_t in all VOPs
amw
parents:
diff changeset
   441
 *
3047ad28a67b PSARC/2007/218 caller_context_t in all VOPs
amw
parents:
diff changeset
   442
 *		input:	challenge (including timestamp)
3047ad28a67b PSARC/2007/218 caller_context_t in all VOPs
amw
parents:
diff changeset
   443
 *		key:	session_key
3047ad28a67b PSARC/2007/218 caller_context_t in all VOPs
amw
parents:
diff changeset
   444
 *		output:	intermediate result
3047ad28a67b PSARC/2007/218 caller_context_t in all VOPs
amw
parents:
diff changeset
   445
 *
3047ad28a67b PSARC/2007/218 caller_context_t in all VOPs
amw
parents:
diff changeset
   446
 * For the second hash, the input is the result of the first hash and
3047ad28a67b PSARC/2007/218 caller_context_t in all VOPs
amw
parents:
diff changeset
   447
 * a strange partial key is used:
3047ad28a67b PSARC/2007/218 caller_context_t in all VOPs
amw
parents:
diff changeset
   448
 *
3047ad28a67b PSARC/2007/218 caller_context_t in all VOPs
amw
parents:
diff changeset
   449
 *		input:	result of first hash
3047ad28a67b PSARC/2007/218 caller_context_t in all VOPs
amw
parents:
diff changeset
   450
 *		key:	funny partial key
3047ad28a67b PSARC/2007/218 caller_context_t in all VOPs
amw
parents:
diff changeset
   451
 *		output:	credentiails
3047ad28a67b PSARC/2007/218 caller_context_t in all VOPs
amw
parents:
diff changeset
   452
 *
3047ad28a67b PSARC/2007/218 caller_context_t in all VOPs
amw
parents:
diff changeset
   453
 * The final output should be an encrypted set of credentials.
3047ad28a67b PSARC/2007/218 caller_context_t in all VOPs
amw
parents:
diff changeset
   454
 *
3047ad28a67b PSARC/2007/218 caller_context_t in all VOPs
amw
parents:
diff changeset
   455
 *		FYI: smb_auth_DES(output, key, input)
3047ad28a67b PSARC/2007/218 caller_context_t in all VOPs
amw
parents:
diff changeset
   456
 *
3047ad28a67b PSARC/2007/218 caller_context_t in all VOPs
amw
parents:
diff changeset
   457
 * If any difficulties occur using the cryptographic framework, the
3047ad28a67b PSARC/2007/218 caller_context_t in all VOPs
amw
parents:
diff changeset
   458
 * function returns SMBAUTH_FAILURE.  Otherwise SMBAUTH_SUCCESS is
3047ad28a67b PSARC/2007/218 caller_context_t in all VOPs
amw
parents:
diff changeset
   459
 * returned.
3047ad28a67b PSARC/2007/218 caller_context_t in all VOPs
amw
parents:
diff changeset
   460
 */
3047ad28a67b PSARC/2007/218 caller_context_t in all VOPs
amw
parents:
diff changeset
   461
int
3047ad28a67b PSARC/2007/218 caller_context_t in all VOPs
amw
parents:
diff changeset
   462
netr_gen_credentials(BYTE *session_key, netr_cred_t *challenge,
3047ad28a67b PSARC/2007/218 caller_context_t in all VOPs
amw
parents:
diff changeset
   463
    DWORD timestamp, netr_cred_t *out_cred)
3047ad28a67b PSARC/2007/218 caller_context_t in all VOPs
amw
parents:
diff changeset
   464
{
3047ad28a67b PSARC/2007/218 caller_context_t in all VOPs
amw
parents:
diff changeset
   465
	unsigned char buffer[8];
3047ad28a67b PSARC/2007/218 caller_context_t in all VOPs
amw
parents:
diff changeset
   466
	DWORD data[2];
5521
cf62335046cd 6575640 rename/rmdir/remove on mixed file systems work incorrectly for mangled names
as200622
parents: 5331
diff changeset
   467
	DWORD le_data[2];
5331
3047ad28a67b PSARC/2007/218 caller_context_t in all VOPs
amw
parents:
diff changeset
   468
	DWORD *p;
3047ad28a67b PSARC/2007/218 caller_context_t in all VOPs
amw
parents:
diff changeset
   469
	int rc;
3047ad28a67b PSARC/2007/218 caller_context_t in all VOPs
amw
parents:
diff changeset
   470
3047ad28a67b PSARC/2007/218 caller_context_t in all VOPs
amw
parents:
diff changeset
   471
	p = (DWORD *)(uintptr_t)challenge;
5521
cf62335046cd 6575640 rename/rmdir/remove on mixed file systems work incorrectly for mangled names
as200622
parents: 5331
diff changeset
   472
	data[0] = LE_IN32(&p[0]) + timestamp;
cf62335046cd 6575640 rename/rmdir/remove on mixed file systems work incorrectly for mangled names
as200622
parents: 5331
diff changeset
   473
	data[1] = LE_IN32(&p[1]);
cf62335046cd 6575640 rename/rmdir/remove on mixed file systems work incorrectly for mangled names
as200622
parents: 5331
diff changeset
   474
cf62335046cd 6575640 rename/rmdir/remove on mixed file systems work incorrectly for mangled names
as200622
parents: 5331
diff changeset
   475
	LE_OUT32(&le_data[0], data[0]);
cf62335046cd 6575640 rename/rmdir/remove on mixed file systems work incorrectly for mangled names
as200622
parents: 5331
diff changeset
   476
	LE_OUT32(&le_data[1], data[1]);
5331
3047ad28a67b PSARC/2007/218 caller_context_t in all VOPs
amw
parents:
diff changeset
   477
7052
efa04b030974 6615409 Rename appropriate structures in userland
amw
parents: 6432
diff changeset
   478
	if (smb_auth_DES(buffer, 8, session_key, NETR_DESKEY_LEN,
5521
cf62335046cd 6575640 rename/rmdir/remove on mixed file systems work incorrectly for mangled names
as200622
parents: 5331
diff changeset
   479
	    (unsigned char *)le_data, 8) != SMBAUTH_SUCCESS)
5331
3047ad28a67b PSARC/2007/218 caller_context_t in all VOPs
amw
parents:
diff changeset
   480
		return (SMBAUTH_FAILURE);
3047ad28a67b PSARC/2007/218 caller_context_t in all VOPs
amw
parents:
diff changeset
   481
7052
efa04b030974 6615409 Rename appropriate structures in userland
amw
parents: 6432
diff changeset
   482
	rc = smb_auth_DES(out_cred->data, 8, &session_key[NETR_DESKEY_LEN],
efa04b030974 6615409 Rename appropriate structures in userland
amw
parents: 6432
diff changeset
   483
	    NETR_DESKEY_LEN, buffer, 8);
5331
3047ad28a67b PSARC/2007/218 caller_context_t in all VOPs
amw
parents:
diff changeset
   484
3047ad28a67b PSARC/2007/218 caller_context_t in all VOPs
amw
parents:
diff changeset
   485
	return (rc);
3047ad28a67b PSARC/2007/218 caller_context_t in all VOPs
amw
parents:
diff changeset
   486
}
3047ad28a67b PSARC/2007/218 caller_context_t in all VOPs
amw
parents:
diff changeset
   487
3047ad28a67b PSARC/2007/218 caller_context_t in all VOPs
amw
parents:
diff changeset
   488
/*
3047ad28a67b PSARC/2007/218 caller_context_t in all VOPs
amw
parents:
diff changeset
   489
 * netr_server_password_set
3047ad28a67b PSARC/2007/218 caller_context_t in all VOPs
amw
parents:
diff changeset
   490
 *
3047ad28a67b PSARC/2007/218 caller_context_t in all VOPs
amw
parents:
diff changeset
   491
 * Attempt to change the trust account password for this system.
3047ad28a67b PSARC/2007/218 caller_context_t in all VOPs
amw
parents:
diff changeset
   492
 *
3047ad28a67b PSARC/2007/218 caller_context_t in all VOPs
amw
parents:
diff changeset
   493
 * Note that this call may legitimately fail if the registry on the
3047ad28a67b PSARC/2007/218 caller_context_t in all VOPs
amw
parents:
diff changeset
   494
 * domain controller has been setup to deny attempts to change the
3047ad28a67b PSARC/2007/218 caller_context_t in all VOPs
amw
parents:
diff changeset
   495
 * trust account password. In this case we should just continue to
3047ad28a67b PSARC/2007/218 caller_context_t in all VOPs
amw
parents:
diff changeset
   496
 * use the original password.
3047ad28a67b PSARC/2007/218 caller_context_t in all VOPs
amw
parents:
diff changeset
   497
 *
3047ad28a67b PSARC/2007/218 caller_context_t in all VOPs
amw
parents:
diff changeset
   498
 * Possible status values:
3047ad28a67b PSARC/2007/218 caller_context_t in all VOPs
amw
parents:
diff changeset
   499
 *	NT_STATUS_ACCESS_DENIED
3047ad28a67b PSARC/2007/218 caller_context_t in all VOPs
amw
parents:
diff changeset
   500
 */
3047ad28a67b PSARC/2007/218 caller_context_t in all VOPs
amw
parents:
diff changeset
   501
int
3047ad28a67b PSARC/2007/218 caller_context_t in all VOPs
amw
parents:
diff changeset
   502
netr_server_password_set(mlsvc_handle_t *netr_handle, netr_info_t *netr_info)
3047ad28a67b PSARC/2007/218 caller_context_t in all VOPs
amw
parents:
diff changeset
   503
{
3047ad28a67b PSARC/2007/218 caller_context_t in all VOPs
amw
parents:
diff changeset
   504
	struct netr_PasswordSet  arg;
3047ad28a67b PSARC/2007/218 caller_context_t in all VOPs
amw
parents:
diff changeset
   505
	mlrpc_heapref_t heap;
3047ad28a67b PSARC/2007/218 caller_context_t in all VOPs
amw
parents:
diff changeset
   506
	int opnum;
3047ad28a67b PSARC/2007/218 caller_context_t in all VOPs
amw
parents:
diff changeset
   507
	int rc;
3047ad28a67b PSARC/2007/218 caller_context_t in all VOPs
amw
parents:
diff changeset
   508
	BYTE new_password[NETR_OWF_PASSWORD_SZ];
7961
4b5e3051f38b 6751647 TRANS2_FIND_NEXT continuation by filename restarts search at beginning of directory
natalie li - Sun Microsystems - Irvine United States <Natalie.Li@Sun.COM>
parents: 7619
diff changeset
   509
	char account_name[NETBIOS_NAME_SZ * 2];
5331
3047ad28a67b PSARC/2007/218 caller_context_t in all VOPs
amw
parents:
diff changeset
   510
3047ad28a67b PSARC/2007/218 caller_context_t in all VOPs
amw
parents:
diff changeset
   511
	bzero(&arg, sizeof (struct netr_PasswordSet));
3047ad28a67b PSARC/2007/218 caller_context_t in all VOPs
amw
parents:
diff changeset
   512
	opnum = NETR_OPNUM_ServerPasswordSet;
3047ad28a67b PSARC/2007/218 caller_context_t in all VOPs
amw
parents:
diff changeset
   513
3047ad28a67b PSARC/2007/218 caller_context_t in all VOPs
amw
parents:
diff changeset
   514
	(void) snprintf(account_name, sizeof (account_name), "%s$",
3047ad28a67b PSARC/2007/218 caller_context_t in all VOPs
amw
parents:
diff changeset
   515
	    netr_info->hostname);
3047ad28a67b PSARC/2007/218 caller_context_t in all VOPs
amw
parents:
diff changeset
   516
3047ad28a67b PSARC/2007/218 caller_context_t in all VOPs
amw
parents:
diff changeset
   517
	arg.servername = (unsigned char *)netr_info->server;
3047ad28a67b PSARC/2007/218 caller_context_t in all VOPs
amw
parents:
diff changeset
   518
	arg.account_name = (unsigned char *)account_name;
3047ad28a67b PSARC/2007/218 caller_context_t in all VOPs
amw
parents:
diff changeset
   519
	arg.account_type = NETR_WKSTA_TRUST_ACCOUNT_TYPE;
3047ad28a67b PSARC/2007/218 caller_context_t in all VOPs
amw
parents:
diff changeset
   520
	arg.hostname = (unsigned char *)netr_info->hostname;
3047ad28a67b PSARC/2007/218 caller_context_t in all VOPs
amw
parents:
diff changeset
   521
3047ad28a67b PSARC/2007/218 caller_context_t in all VOPs
amw
parents:
diff changeset
   522
	/*
3047ad28a67b PSARC/2007/218 caller_context_t in all VOPs
amw
parents:
diff changeset
   523
	 * Set up the client side authenticator.
3047ad28a67b PSARC/2007/218 caller_context_t in all VOPs
amw
parents:
diff changeset
   524
	 */
3047ad28a67b PSARC/2007/218 caller_context_t in all VOPs
amw
parents:
diff changeset
   525
	if (netr_setup_authenticator(netr_info, &arg.auth, 0) !=
3047ad28a67b PSARC/2007/218 caller_context_t in all VOPs
amw
parents:
diff changeset
   526
	    SMBAUTH_SUCCESS) {
3047ad28a67b PSARC/2007/218 caller_context_t in all VOPs
amw
parents:
diff changeset
   527
		return (-1);
3047ad28a67b PSARC/2007/218 caller_context_t in all VOPs
amw
parents:
diff changeset
   528
	}
3047ad28a67b PSARC/2007/218 caller_context_t in all VOPs
amw
parents:
diff changeset
   529
3047ad28a67b PSARC/2007/218 caller_context_t in all VOPs
amw
parents:
diff changeset
   530
	/*
3047ad28a67b PSARC/2007/218 caller_context_t in all VOPs
amw
parents:
diff changeset
   531
	 * Generate a new password from the old password.
3047ad28a67b PSARC/2007/218 caller_context_t in all VOPs
amw
parents:
diff changeset
   532
	 */
7619
0ad244464731 6736540 ntlmv2 signing does not work in domain mode
jose borrego <Jose.Borrego@Sun.COM>
parents: 7052
diff changeset
   533
	if (netr_gen_password(netr_info->session_key.key,
5331
3047ad28a67b PSARC/2007/218 caller_context_t in all VOPs
amw
parents:
diff changeset
   534
	    netr_info->password, new_password) == SMBAUTH_FAILURE) {
3047ad28a67b PSARC/2007/218 caller_context_t in all VOPs
amw
parents:
diff changeset
   535
		return (-1);
3047ad28a67b PSARC/2007/218 caller_context_t in all VOPs
amw
parents:
diff changeset
   536
	}
3047ad28a67b PSARC/2007/218 caller_context_t in all VOPs
amw
parents:
diff changeset
   537
3047ad28a67b PSARC/2007/218 caller_context_t in all VOPs
amw
parents:
diff changeset
   538
	(void) memcpy(&arg.uas_new_password, &new_password,
3047ad28a67b PSARC/2007/218 caller_context_t in all VOPs
amw
parents:
diff changeset
   539
	    NETR_OWF_PASSWORD_SZ);
3047ad28a67b PSARC/2007/218 caller_context_t in all VOPs
amw
parents:
diff changeset
   540
3047ad28a67b PSARC/2007/218 caller_context_t in all VOPs
amw
parents:
diff changeset
   541
	(void) mlsvc_rpc_init(&heap);
3047ad28a67b PSARC/2007/218 caller_context_t in all VOPs
amw
parents:
diff changeset
   542
	rc = mlsvc_rpc_call(netr_handle->context, opnum, &arg, &heap);
3047ad28a67b PSARC/2007/218 caller_context_t in all VOPs
amw
parents:
diff changeset
   543
	if ((rc != 0) || (arg.status != 0)) {
3047ad28a67b PSARC/2007/218 caller_context_t in all VOPs
amw
parents:
diff changeset
   544
		mlsvc_rpc_report_status(opnum, arg.status);
3047ad28a67b PSARC/2007/218 caller_context_t in all VOPs
amw
parents:
diff changeset
   545
		mlsvc_rpc_free(netr_handle->context, &heap);
3047ad28a67b PSARC/2007/218 caller_context_t in all VOPs
amw
parents:
diff changeset
   546
		return (-1);
3047ad28a67b PSARC/2007/218 caller_context_t in all VOPs
amw
parents:
diff changeset
   547
	}
3047ad28a67b PSARC/2007/218 caller_context_t in all VOPs
amw
parents:
diff changeset
   548
3047ad28a67b PSARC/2007/218 caller_context_t in all VOPs
amw
parents:
diff changeset
   549
	/*
3047ad28a67b PSARC/2007/218 caller_context_t in all VOPs
amw
parents:
diff changeset
   550
	 * Check the returned credentials.  The server returns the new
3047ad28a67b PSARC/2007/218 caller_context_t in all VOPs
amw
parents:
diff changeset
   551
	 * client credential rather than the new server credentiali,
3047ad28a67b PSARC/2007/218 caller_context_t in all VOPs
amw
parents:
diff changeset
   552
	 * as documented elsewhere.
3047ad28a67b PSARC/2007/218 caller_context_t in all VOPs
amw
parents:
diff changeset
   553
	 *
3047ad28a67b PSARC/2007/218 caller_context_t in all VOPs
amw
parents:
diff changeset
   554
	 * Generate the new seed for the credential chain.  Increment
3047ad28a67b PSARC/2007/218 caller_context_t in all VOPs
amw
parents:
diff changeset
   555
	 * the timestamp and add it to the client challenge.  Then we
3047ad28a67b PSARC/2007/218 caller_context_t in all VOPs
amw
parents:
diff changeset
   556
	 * need to copy the challenge to the credential field in
3047ad28a67b PSARC/2007/218 caller_context_t in all VOPs
amw
parents:
diff changeset
   557
	 * preparation for the next cycle.
3047ad28a67b PSARC/2007/218 caller_context_t in all VOPs
amw
parents:
diff changeset
   558
	 */
3047ad28a67b PSARC/2007/218 caller_context_t in all VOPs
amw
parents:
diff changeset
   559
	if (netr_validate_chain(netr_info, &arg.auth) == 0) {
3047ad28a67b PSARC/2007/218 caller_context_t in all VOPs
amw
parents:
diff changeset
   560
		/*
3047ad28a67b PSARC/2007/218 caller_context_t in all VOPs
amw
parents:
diff changeset
   561
		 * Save the new password.
3047ad28a67b PSARC/2007/218 caller_context_t in all VOPs
amw
parents:
diff changeset
   562
		 */
3047ad28a67b PSARC/2007/218 caller_context_t in all VOPs
amw
parents:
diff changeset
   563
		(void) memcpy(netr_info->password, new_password,
3047ad28a67b PSARC/2007/218 caller_context_t in all VOPs
amw
parents:
diff changeset
   564
		    NETR_OWF_PASSWORD_SZ);
3047ad28a67b PSARC/2007/218 caller_context_t in all VOPs
amw
parents:
diff changeset
   565
	}
3047ad28a67b PSARC/2007/218 caller_context_t in all VOPs
amw
parents:
diff changeset
   566
3047ad28a67b PSARC/2007/218 caller_context_t in all VOPs
amw
parents:
diff changeset
   567
	mlsvc_rpc_free(netr_handle->context, &heap);
3047ad28a67b PSARC/2007/218 caller_context_t in all VOPs
amw
parents:
diff changeset
   568
	return (0);
3047ad28a67b PSARC/2007/218 caller_context_t in all VOPs
amw
parents:
diff changeset
   569
}
3047ad28a67b PSARC/2007/218 caller_context_t in all VOPs
amw
parents:
diff changeset
   570
3047ad28a67b PSARC/2007/218 caller_context_t in all VOPs
amw
parents:
diff changeset
   571
/*
3047ad28a67b PSARC/2007/218 caller_context_t in all VOPs
amw
parents:
diff changeset
   572
 * netr_gen_password
3047ad28a67b PSARC/2007/218 caller_context_t in all VOPs
amw
parents:
diff changeset
   573
 *
3047ad28a67b PSARC/2007/218 caller_context_t in all VOPs
amw
parents:
diff changeset
   574
 * Generate a new pasword from the old password  and the session key.
3047ad28a67b PSARC/2007/218 caller_context_t in all VOPs
amw
parents:
diff changeset
   575
 * The algorithm is a two stage hash. The session key is used in the
3047ad28a67b PSARC/2007/218 caller_context_t in all VOPs
amw
parents:
diff changeset
   576
 * first hash but only part of the session key is used in the second
3047ad28a67b PSARC/2007/218 caller_context_t in all VOPs
amw
parents:
diff changeset
   577
 * hash.
3047ad28a67b PSARC/2007/218 caller_context_t in all VOPs
amw
parents:
diff changeset
   578
 *
3047ad28a67b PSARC/2007/218 caller_context_t in all VOPs
amw
parents:
diff changeset
   579
 * If any difficulties occur using the cryptographic framework, the
3047ad28a67b PSARC/2007/218 caller_context_t in all VOPs
amw
parents:
diff changeset
   580
 * function returns SMBAUTH_FAILURE.  Otherwise SMBAUTH_SUCCESS is
3047ad28a67b PSARC/2007/218 caller_context_t in all VOPs
amw
parents:
diff changeset
   581
 * returned.
3047ad28a67b PSARC/2007/218 caller_context_t in all VOPs
amw
parents:
diff changeset
   582
 */
3047ad28a67b PSARC/2007/218 caller_context_t in all VOPs
amw
parents:
diff changeset
   583
static int
3047ad28a67b PSARC/2007/218 caller_context_t in all VOPs
amw
parents:
diff changeset
   584
netr_gen_password(BYTE *session_key, BYTE *old_password, BYTE *new_password)
3047ad28a67b PSARC/2007/218 caller_context_t in all VOPs
amw
parents:
diff changeset
   585
{
3047ad28a67b PSARC/2007/218 caller_context_t in all VOPs
amw
parents:
diff changeset
   586
	int rv;
3047ad28a67b PSARC/2007/218 caller_context_t in all VOPs
amw
parents:
diff changeset
   587
7052
efa04b030974 6615409 Rename appropriate structures in userland
amw
parents: 6432
diff changeset
   588
	rv = smb_auth_DES(new_password, 8, session_key, NETR_DESKEY_LEN,
efa04b030974 6615409 Rename appropriate structures in userland
amw
parents: 6432
diff changeset
   589
	    old_password, 8);
5331
3047ad28a67b PSARC/2007/218 caller_context_t in all VOPs
amw
parents:
diff changeset
   590
	if (rv != SMBAUTH_SUCCESS)
3047ad28a67b PSARC/2007/218 caller_context_t in all VOPs
amw
parents:
diff changeset
   591
		return (rv);
3047ad28a67b PSARC/2007/218 caller_context_t in all VOPs
amw
parents:
diff changeset
   592
7052
efa04b030974 6615409 Rename appropriate structures in userland
amw
parents: 6432
diff changeset
   593
	rv = smb_auth_DES(&new_password[8], 8, &session_key[NETR_DESKEY_LEN],
efa04b030974 6615409 Rename appropriate structures in userland
amw
parents: 6432
diff changeset
   594
	    NETR_DESKEY_LEN, &old_password[8], 8);
5331
3047ad28a67b PSARC/2007/218 caller_context_t in all VOPs
amw
parents:
diff changeset
   595
	return (rv);
3047ad28a67b PSARC/2007/218 caller_context_t in all VOPs
amw
parents:
diff changeset
   596
}