mlsvc.h   [plain text]


/*
 * CDDL HEADER START
 *
 * The contents of this file are subject to the terms of the
 * Common Development and Distribution License (the "License").
 * You may not use this file except in compliance with the License.
 *
 * You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE
 * or http://www.opensolaris.org/os/licensing.
 * See the License for the specific language governing permissions
 * and limitations under the License.
 *
 * When distributing Covered Code, include this CDDL HEADER in each
 * file and include the License file at usr/src/OPENSOLARIS.LICENSE.
 * If applicable, add the following below this CDDL HEADER, with the
 * fields enclosed by brackets "[]" replaced with your own identifying
 * information: Portions Copyright [yyyy] [name of copyright owner]
 *
 * CDDL HEADER END
 */
/*
 * Copyright 2008 Sun Microsystems, Inc.  All rights reserved.
 * Use is subject to license terms.
 */
/*
 * Portions Copyright 2008 Apple, Inc.  All rights reserved.
 * Use is subject to license terms.
 */

#ifndef _SMBSRV_MLSVC_H
#define	_SMBSRV_MLSVC_H

/*
 * MLSVC RPC layer public interface definitions.
 */

#include "ndl/ndrtypes.ndl"


#ifdef __cplusplus
extern "C" {
#endif

/*
 * RPC strings
 *
 * DCE RPC strings (CAE section 14.3.4) are represented as varying or
 * varying and conformant one-dimensional arrays. Characters can be
 * single-byte or multi-byte as long as all characters conform to a
 * fixed element size, i.e. UCS-2 is okay but UTF-8 is not a valid
 * DCE RPC string format. The string is terminated by a null character
 * of the appropriate element size.
 *
 * MSRPC strings are always varying and conformant format and not null
 * terminated. This format uses the size_is, first_is and length_is
 * attributes (CAE section 4.2.18).
 *
 *	typedef struct mlrpc_string {
 *		DWORD size_is;
 *		DWORD first_is;
 *		DWORD length_is;
 *		wchar_t string[ANY_SIZE_ARRAY];
 *  } mlrpc_string_t;
 *
 * The size_is attribute is used to specify the number of data elements
 * in each dimension of an array.
 *
 * The first_is attribute is used to define the lower bound for
 * significant elements in each dimension of an array. For strings
 * this is always 0.
 *
 * The length_is attribute is used to define the number of significant
 * elements in each dimension of an array. For strings this is typically
 * the same as size_is. Although it might be (size_is - 1) if the string
 * is null terminated.
 *
 * In MSRPC, Unicode strings are not null terminated. This means
 * that the recipient has to manually null-terminate the string after
 * it has been unmarshalled. Note that there is often a wide-char pad
 * following a string. Although the padding sometimes contains zero,
 * it's not guaranteed.
 *
 *   4 bytes   4 bytes   4 bytes  2bytes 2bytes 2bytes 2bytes
 * +---------+---------+---------+------+------+------+------+
 * |size_is  |first_is |length_is| char | char | char | char |
 * +---------+---------+---------+------+------+------+------+
 *
 * The problem is that some strings are null terminated. This seems
 * to conflict with the statement above that Unicode strings are not
 * null terminated, which may be a historical thing from earlier
 * implementations or it may be that different services do different
 * things. So there is an additional string wrapper with two more
 * fields used in some RPC structures as shown below (LPTSTR is
 * automatically converted to mlrpc_string by the NDR marshalling).
 *
 * typedef struct ms_string {
 *		WORD length;
 *		WORD maxlen;
 *		LPTSTR str;
 * } ms_string_t;
 *
 * Here, length is the array length in bytes excluding any terminating
 * null bytes and maxlen is the array length in bytes including null
 * terminator bytes.
 */
typedef struct mlsvc_string {
	WORD length;
	WORD maxlen;
	LPTSTR str;
} mlsvc_string_t;

/*
 * The maximum number of domains (NT limit).
 */
#define	MLSVC_DOMAIN_MAX		32

/*
 * Some buffer size limits. I don't know if these are definitive
 * limits for NT but these numbers appear in various places.
 */
#define	MLSVC_DOMAIN_NAME_MAX		32
#define	MLSVC_ACCOUNT_NAME_MAX		32
#define	MLSVC_CLIENT_NAME_MAX		48

/* 32-byte machine account password (null-terminated) */
#define	MLSVC_MACHINE_ACCT_PASSWD_MAX	32 + 1

/*
 * Status code returned from enumeration RPCs to indicate
 * that the server has no more data. Normally returned at
 * severity level ERROR_SEVERITY_WARNING.
 */
#define	MLSVC_NO_MORE_DATA		0x1A

#define	MLSVC_ANON_USER			"IPC$"

char *mlsvc_ipc_name(int ipc_type, char *username);

/*
 * Passthrough negotiation and authentication interface.
 *
 * NT supports two forms of password: a Lanman (case-insensitive)
 * password and an NT (case-sensitive) password. If either of the
 * passwords is not available its pointer and length should be set
 * to zero. The session key and vc number are required to validate
 * the encrypted passwords.
 */

void mlsvc_nt_password_hash(char *result, char *password);
int mlsvc_encrypt_nt_password(char *password, char *key, int keylen, char *out,
    int outmax);
DWORD mlsvc_join(char *server, char *domain, char *username, char *password);

/*
 * RPC request processing interface (mlsvc_server.c).
 */
#define	MLSVC_MAX_IOVEC			512

#if NOTNEY
typedef struct mlrpc_frag {
	struct mlrpc_frag *next;
	struct mbuf *mhead;
	uint32_t length;
} mlrpc_frag_t;

typedef struct mlsvc_stream {
	mlrpc_frag_t *head;
	mlrpc_frag_t *tail;
	mlrpc_frag_t *pending;
	unsigned int nfrag;
	struct uio uio;
	struct iovec iovec[MLSVC_MAX_IOVEC];
} mlsvc_stream_t;

typedef struct mlsvc_pipe {
	kmutex_t mutex;
	kcondvar_t cv;
	uint32_t busy;
	uint32_t fid;
	char *pipe_name;
	mlsvc_stream_t input;
	uchar_t *output;
	int32_t outlen;
} mlsvc_pipe_t;

struct mlsvc_rpc_context *mlrpc_process(int, smb_dr_user_ctx_t *);
struct mlsvc_rpc_context *mlrpc_lookup(int fid);
void mlrpc_release(int);
void mlsvc_rpc_report_status(int opnum, DWORD status);
#endif

#ifdef __cplusplus
}
#endif


#endif /* _SMBSRV_MLSVC_H */