xref: /onnv-gate/usr/src/lib/smbsrv/libsmb/common/libsmb.h (revision 13138:89c014c50a5f)
15331Samw /*
25331Samw  * CDDL HEADER START
35331Samw  *
45331Samw  * The contents of this file are subject to the terms of the
55331Samw  * Common Development and Distribution License (the "License").
65331Samw  * You may not use this file except in compliance with the License.
75331Samw  *
85331Samw  * You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE
95331Samw  * or http://www.opensolaris.org/os/licensing.
105331Samw  * See the License for the specific language governing permissions
115331Samw  * and limitations under the License.
125331Samw  *
135331Samw  * When distributing Covered Code, include this CDDL HEADER in each
145331Samw  * file and include the License file at usr/src/OPENSOLARIS.LICENSE.
155331Samw  * If applicable, add the following below this CDDL HEADER, with the
165331Samw  * fields enclosed by brackets "[]" replaced with your own identifying
175331Samw  * information: Portions Copyright [yyyy] [name of copyright owner]
185331Samw  *
195331Samw  * CDDL HEADER END
205331Samw  */
2112508Samw@Sun.COM 
225331Samw /*
2312065SKeyur.Desai@Sun.COM  * Copyright (c) 2007, 2010, Oracle and/or its affiliates. All rights reserved.
245331Samw  */
255331Samw 
265331Samw #ifndef	_LIBSMB_H
275331Samw #define	_LIBSMB_H
285331Samw 
295331Samw #ifdef	__cplusplus
305331Samw extern "C" {
315331Samw #endif
325331Samw 
335331Samw #include <sys/types.h>
346030Sjb150015 #include <sys/list.h>
3511963SAfshin.Ardakani@Sun.COM #include <sys/avl.h>
365331Samw #include <arpa/inet.h>
376030Sjb150015 #include <net/if.h>
388670SJose.Borrego@Sun.COM #include <inet/tcp.h>
399832Samw@Sun.COM #include <uuid/uuid.h>
405772Sas200622 #include <netdb.h>
415331Samw #include <stdlib.h>
425331Samw #include <libscf.h>
435331Samw #include <libshare.h>
445772Sas200622 #include <sqlite/sqlite.h>
4510122SJordan.Brown@Sun.COM #include <uuid/uuid.h>
4611963SAfshin.Ardakani@Sun.COM #include <synch.h>
475331Samw 
485772Sas200622 #include <smbsrv/string.h>
495331Samw #include <smbsrv/smb_idmap.h>
506030Sjb150015 #include <smbsrv/netbios.h>
517052Samw #include <smbsrv/smb_share.h>
5212508Samw@Sun.COM #include <smb/nterror.h>
5312508Samw@Sun.COM #include <smb/ntstatus.h>
5411963SAfshin.Ardakani@Sun.COM #include <smbsrv/smb_door.h>
555331Samw #include <smbsrv/alloc.h>
565331Samw #include <smbsrv/hash_table.h>
575331Samw #include <smbsrv/msgbuf.h>
585331Samw #include <smbsrv/wintypes.h>
595331Samw #include <smbsrv/smb_xdr.h>
605331Samw #include <smbsrv/smbinfo.h>
619832Samw@Sun.COM #include <smbsrv/ntifs.h>
625331Samw 
6312508Samw@Sun.COM #define	SMB_VARSMB_DIR "/var/smb"
646139Sjb150015 #define	SMB_VARRUN_DIR "/var/run/smb"
656139Sjb150015 #define	SMB_CCACHE_FILE "ccache"
666139Sjb150015 #define	SMB_CCACHE_PATH SMB_VARRUN_DIR "/" SMB_CCACHE_FILE
676139Sjb150015 
688334SJose.Borrego@Sun.COM 
695331Samw /* Max value length of all SMB properties */
705331Samw #define	MAX_VALUE_BUFLEN	512
715331Samw 
725331Samw #define	SMBD_FMRI_PREFIX		"network/smb/server"
735331Samw #define	SMBD_DEFAULT_INSTANCE_FMRI	"svc:/network/smb/server:default"
745331Samw #define	SMBD_PG_NAME			"smbd"
755331Samw #define	SMBD_PROTECTED_PG_NAME		"read"
769832Samw@Sun.COM #define	SMBD_EXEC_PG_NAME		"exec"
775331Samw 
785331Samw #define	SMBD_SMF_OK		0
795331Samw #define	SMBD_SMF_NO_MEMORY	1	/* no memory for data structures */
805331Samw #define	SMBD_SMF_SYSTEM_ERR	2	/* system error, use errno */
815331Samw #define	SMBD_SMF_NO_PERMISSION	3	/* no permission for operation */
825772Sas200622 #define	SMBD_SMF_INVALID_ARG	4
835331Samw 
845331Samw #define	SCH_STATE_UNINIT	0
855331Samw #define	SCH_STATE_INITIALIZING	1
865331Samw #define	SCH_STATE_INIT		2
875331Samw 
885331Samw typedef struct smb_scfhandle {
895331Samw 	scf_handle_t		*scf_handle;
905331Samw 	int			scf_state;
915331Samw 	scf_service_t		*scf_service;
925331Samw 	scf_scope_t		*scf_scope;
935331Samw 	scf_transaction_t	*scf_trans;
945331Samw 	scf_transaction_entry_t	*scf_entry;
955331Samw 	scf_propertygroup_t	*scf_pg;
965331Samw 	scf_instance_t		*scf_instance;
975331Samw 	scf_iter_t		*scf_inst_iter;
985331Samw 	scf_iter_t		*scf_pg_iter;
995331Samw } smb_scfhandle_t;
1005331Samw 
1015331Samw /*
1025331Samw  * CIFS Configuration Management
1035331Samw  */
1045331Samw typedef enum {
10511963SAfshin.Ardakani@Sun.COM 	SMB_CI_VERSION = 0,
10611963SAfshin.Ardakani@Sun.COM 	SMB_CI_OPLOCK_ENABLE,
1075331Samw 
1085331Samw 	SMB_CI_AUTOHOME_MAP,
1095331Samw 
1105331Samw 	SMB_CI_DOMAIN_SID,
1115331Samw 	SMB_CI_DOMAIN_MEMB,
1125331Samw 	SMB_CI_DOMAIN_NAME,
1138334SJose.Borrego@Sun.COM 	SMB_CI_DOMAIN_FQDN,
1148334SJose.Borrego@Sun.COM 	SMB_CI_DOMAIN_FOREST,
1158334SJose.Borrego@Sun.COM 	SMB_CI_DOMAIN_GUID,
1165331Samw 	SMB_CI_DOMAIN_SRV,
1175331Samw 
1185331Samw 	SMB_CI_WINS_SRV1,
1195331Samw 	SMB_CI_WINS_SRV2,
1205331Samw 	SMB_CI_WINS_EXCL,
1215331Samw 
1225331Samw 	SMB_CI_MAX_WORKERS,
1235331Samw 	SMB_CI_MAX_CONNECTIONS,
1245331Samw 	SMB_CI_KEEPALIVE,
1255331Samw 	SMB_CI_RESTRICT_ANON,
1265331Samw 
1275331Samw 	SMB_CI_SIGNING_ENABLE,
1285331Samw 	SMB_CI_SIGNING_REQD,
1295331Samw 
1305331Samw 	SMB_CI_SYNC_ENABLE,
1315331Samw 
1325331Samw 	SMB_CI_SECURITY,
1335331Samw 	SMB_CI_NBSCOPE,
1345331Samw 	SMB_CI_SYS_CMNT,
1355331Samw 	SMB_CI_LM_LEVEL,
1365331Samw 
1375331Samw 	SMB_CI_ADS_SITE,
1385331Samw 
1395331Samw 	SMB_CI_DYNDNS_ENABLE,
1405331Samw 
1415331Samw 	SMB_CI_MACHINE_PASSWD,
1426139Sjb150015 	SMB_CI_KPASSWD_SRV,
1436139Sjb150015 	SMB_CI_KPASSWD_DOMAIN,
1446139Sjb150015 	SMB_CI_KPASSWD_SEQNUM,
1456139Sjb150015 	SMB_CI_NETLOGON_SEQNUM,
1468670SJose.Borrego@Sun.COM 	SMB_CI_IPV6_ENABLE,
14712890SJoyce.McIntosh@Sun.COM 	SMB_CI_PRINT_ENABLE,
1489832Samw@Sun.COM 	SMB_CI_MAP,
1499832Samw@Sun.COM 	SMB_CI_UNMAP,
1509832Samw@Sun.COM 	SMB_CI_DISPOSITION,
15112508Samw@Sun.COM 	SMB_CI_DFS_STDROOT_NUM,
1525331Samw 	SMB_CI_MAX
1535331Samw } smb_cfg_id_t;
1545331Samw 
1555331Samw /* SMF helper functions */
1565331Samw extern smb_scfhandle_t *smb_smf_scf_init(char *);
1575331Samw extern void smb_smf_scf_fini(smb_scfhandle_t *);
1585331Samw extern int smb_smf_start_transaction(smb_scfhandle_t *);
1595331Samw extern int smb_smf_end_transaction(smb_scfhandle_t *);
1605331Samw extern int smb_smf_set_string_property(smb_scfhandle_t *, char *, char *);
1615331Samw extern int smb_smf_get_string_property(smb_scfhandle_t *, char *,
1625331Samw     char *, size_t);
1635331Samw extern int smb_smf_set_integer_property(smb_scfhandle_t *, char *, int64_t);
1645331Samw extern int smb_smf_get_integer_property(smb_scfhandle_t *, char *, int64_t *);
1655331Samw extern int smb_smf_set_boolean_property(smb_scfhandle_t *, char *, uint8_t);
1665331Samw extern int smb_smf_get_boolean_property(smb_scfhandle_t *, char *, uint8_t *);
1675331Samw extern int smb_smf_set_opaque_property(smb_scfhandle_t *, char *,
1685331Samw     void *, size_t);
1695331Samw extern int smb_smf_get_opaque_property(smb_scfhandle_t *, char *,
1705331Samw     void *, size_t);
1715331Samw extern int smb_smf_create_service_pgroup(smb_scfhandle_t *, char *);
1727348SJose.Borrego@Sun.COM extern int smb_smf_restart_service(void);
1738334SJose.Borrego@Sun.COM extern int smb_smf_maintenance_mode(void);
1745331Samw 
1758871Samw@Sun.COM /* ZFS interface */
1768871Samw@Sun.COM int smb_getdataset(const char *, char *, size_t);
1778871Samw@Sun.COM 
1785331Samw /* Configuration management functions  */
1795772Sas200622 extern int smb_config_get(smb_cfg_id_t, char *, int);
1805772Sas200622 extern char *smb_config_getname(smb_cfg_id_t);
1815772Sas200622 extern int smb_config_getstr(smb_cfg_id_t, char *, int);
1825772Sas200622 extern int smb_config_getnum(smb_cfg_id_t, int64_t *);
1835772Sas200622 extern boolean_t smb_config_getbool(smb_cfg_id_t);
1845331Samw 
1855331Samw extern int smb_config_set(smb_cfg_id_t, char *);
1865772Sas200622 extern int smb_config_setstr(smb_cfg_id_t, char *);
1875772Sas200622 extern int smb_config_setnum(smb_cfg_id_t, int64_t);
1885772Sas200622 extern int smb_config_setbool(smb_cfg_id_t, boolean_t);
1895772Sas200622 
1905331Samw extern uint8_t smb_config_get_fg_flag(void);
1915331Samw extern char *smb_config_get_localsid(void);
1926139Sjb150015 extern int smb_config_secmode_fromstr(char *);
1936139Sjb150015 extern char *smb_config_secmode_tostr(int);
1945331Samw extern int smb_config_get_secmode(void);
1956139Sjb150015 extern int smb_config_set_secmode(int);
1966139Sjb150015 extern int smb_config_set_idmap_domain(char *);
1975331Samw extern int smb_config_refresh_idmap(void);
1988670SJose.Borrego@Sun.COM extern int smb_config_getip(smb_cfg_id_t, smb_inaddr_t *);
19911963SAfshin.Ardakani@Sun.COM extern void smb_config_get_version(smb_version_t *);
20012508Samw@Sun.COM uint32_t smb_config_get_execinfo(char *, char *, size_t);
20112508Samw@Sun.COM 
2028334SJose.Borrego@Sun.COM 
2036771Sjb150015 extern void smb_load_kconfig(smb_kmod_cfg_t *kcfg);
2048167Samw@Sun.COM extern uint32_t smb_crc_gen(uint8_t *, size_t);
2056771Sjb150015 
2066139Sjb150015 extern boolean_t smb_match_netlogon_seqnum(void);
2076139Sjb150015 extern int smb_setdomainprops(char *, char *, char *);
2086139Sjb150015 extern void smb_update_netlogon_seqnum(void);
2095331Samw 
2107961SNatalie.Li@Sun.COM /* maximum password length on Windows 2000 and above */
2117961SNatalie.Li@Sun.COM #define	SMB_PASSWD_MAXLEN	127
2127961SNatalie.Li@Sun.COM #define	SMB_USERNAME_MAXLEN	40
2137961SNatalie.Li@Sun.COM 
2145331Samw typedef struct smb_joininfo {
2155772Sas200622 	char domain_name[MAXHOSTNAMELEN];
2167961SNatalie.Li@Sun.COM 	char domain_username[SMB_USERNAME_MAXLEN + 1];
2177961SNatalie.Li@Sun.COM 	char domain_passwd[SMB_PASSWD_MAXLEN + 1];
2185331Samw 	uint32_t mode;
2195331Samw } smb_joininfo_t;
2205331Samw 
2215331Samw /* APIs to communicate with SMB daemon via door calls */
22211963SAfshin.Ardakani@Sun.COM uint32_t smb_join(smb_joininfo_t *info);
22311963SAfshin.Ardakani@Sun.COM bool_t smb_joininfo_xdr(XDR *, smb_joininfo_t *);
22411963SAfshin.Ardakani@Sun.COM boolean_t smb_find_ads_server(char *, char *, int);
2255331Samw 
2269832Samw@Sun.COM extern void smb_config_getdomaininfo(char *, char *, char *, char *, char *);
2279832Samw@Sun.COM extern void smb_config_setdomaininfo(char *, char *, char *, char *, char *);
2288670SJose.Borrego@Sun.COM extern uint32_t smb_get_dcinfo(char *, uint32_t, smb_inaddr_t *);
2295331Samw 
2305331Samw /*
2315331Samw  * buffer context structure. This is used to keep track of the buffer
2325331Samw  * context.
2335331Samw  *
2345331Samw  * basep:  points to the beginning of the buffer
2355331Samw  * curp:   points to the current offset
2365331Samw  * endp:   points to the limit of the buffer
2375331Samw  */
2385331Samw typedef struct {
2395331Samw 	unsigned char *basep;
2405331Samw 	unsigned char *curp;
2415331Samw 	unsigned char *endp;
2425331Samw } smb_ctxbuf_t;
2435331Samw 
2445331Samw extern int smb_ctxbuf_init(smb_ctxbuf_t *ctx, unsigned char *buf,
2455331Samw     size_t buflen);
2465331Samw extern int smb_ctxbuf_len(smb_ctxbuf_t *ctx);
2475331Samw extern int smb_ctxbuf_printf(smb_ctxbuf_t *ctx, const char *fmt, ...);
2485331Samw 
24911963SAfshin.Ardakani@Sun.COM void smb_idmap_check(const char *, idmap_stat);
2505331Samw 
2515331Samw /* Miscellaneous functions */
2525331Samw extern void hexdump(unsigned char *, int);
2535331Samw extern size_t bintohex(const char *, size_t, char *, size_t);
2545331Samw extern size_t hextobin(const char *, size_t, char *, size_t);
2558334SJose.Borrego@Sun.COM extern char *strstrip(char *, const char *);
2568334SJose.Borrego@Sun.COM extern char *strtrim(char *, const char *);
2578334SJose.Borrego@Sun.COM extern char *trim_whitespace(char *);
2585331Samw extern void randomize(char *, unsigned);
2595331Samw extern void rand_hash(unsigned char *, size_t, unsigned char *, size_t);
2605331Samw 
2615331Samw extern int smb_getdomainname(char *, size_t);
2625772Sas200622 extern int smb_getfqdomainname(char *, size_t);
26311963SAfshin.Ardakani@Sun.COM 
26411963SAfshin.Ardakani@Sun.COM typedef enum smb_caseconv {
26511963SAfshin.Ardakani@Sun.COM 	SMB_CASE_PRESERVE = 0,
26611963SAfshin.Ardakani@Sun.COM 	SMB_CASE_UPPER,
26711963SAfshin.Ardakani@Sun.COM 	SMB_CASE_LOWER
26811963SAfshin.Ardakani@Sun.COM } smb_caseconv_t;
26911963SAfshin.Ardakani@Sun.COM 
27011963SAfshin.Ardakani@Sun.COM extern int smb_gethostname(char *, size_t, smb_caseconv_t);
2715331Samw extern int smb_getfqhostname(char *, size_t);
2725331Samw extern int smb_getnetbiosname(char *, size_t);
2738334SJose.Borrego@Sun.COM extern struct hostent *smb_gethostbyname(const char *, int *);
2748334SJose.Borrego@Sun.COM extern struct hostent *smb_gethostbyaddr(const char *, int, int, int *);
2757961SNatalie.Li@Sun.COM 
2767961SNatalie.Li@Sun.COM #define	SMB_SAMACCT_MAXLEN	(NETBIOS_NAME_SZ + 1)
2777961SNatalie.Li@Sun.COM extern int smb_getsamaccount(char *, size_t);
2787961SNatalie.Li@Sun.COM 
2798670SJose.Borrego@Sun.COM extern int smb_get_nameservers(smb_inaddr_t *, int);
2806030Sjb150015 extern void smb_tonetbiosname(char *, char *, char);
2816030Sjb150015 
2828670SJose.Borrego@Sun.COM extern int smb_chk_hostaccess(smb_inaddr_t *, char *);
2836030Sjb150015 
2849832Samw@Sun.COM extern int smb_getnameinfo(smb_inaddr_t *, char *, int, int);
2859832Samw@Sun.COM 
2865331Samw void smb_trace(const char *s);
2875331Samw void smb_tracef(const char *fmt, ...);
2885331Samw 
28912508Samw@Sun.COM const char *xlate_nt_status(unsigned int);
29012508Samw@Sun.COM 
2915331Samw /*
2925331Samw  * Authentication
2935331Samw  */
2945331Samw 
2955331Samw #define	SMBAUTH_LM_MAGIC_STR	"KGS!@#$%"
2965331Samw 
2975331Samw #define	SMBAUTH_HASH_SZ		16	/* also LM/NTLM/NTLMv2 Hash size */
2985331Samw #define	SMBAUTH_LM_RESP_SZ	24	/* also NTLM Response size */
2995331Samw #define	SMBAUTH_LM_PWD_SZ	14	/* LM password size */
3005331Samw #define	SMBAUTH_V2_CLNT_CHALLENGE_SZ 8	/* both LMv2 and NTLMv2 */
3015331Samw #define	SMBAUTH_SESSION_KEY_SZ	SMBAUTH_HASH_SZ
3025331Samw #define	SMBAUTH_HEXHASH_SZ	(SMBAUTH_HASH_SZ * 2)
3035331Samw 
3045331Samw #define	SMBAUTH_FAILURE		1
3055331Samw #define	SMBAUTH_SUCCESS		0
3065331Samw #define	MD_DIGEST_LEN		16
3075331Samw 
3085331Samw /*
3095331Samw  * Name Types
3105331Samw  *
3115331Samw  * The list of names near the end of the data blob (i.e. the ndb_names
3125331Samw  * field of the smb_auth_data_blob_t data structure) can be classify into
3135331Samw  * the following types:
3145331Samw  *
3155331Samw  * 0x0000 Indicates the end of the list.
3165331Samw  * 0x0001 The name is a NetBIOS machine name (e.g. server name)
3175331Samw  * 0x0002 The name is an NT Domain NetBIOS name.
3185331Samw  * 0x0003 The name is the server's DNS hostname.
3195331Samw  * 0x0004 The name is a W2K Domain name (a DNS name).
3205331Samw  */
3215331Samw #define	SMBAUTH_NAME_TYPE_LIST_END		0x0000
3225331Samw #define	SMBAUTH_NAME_TYPE_SERVER_NETBIOS 	0x0001
3235331Samw #define	SMBAUTH_NAME_TYPE_DOMAIN_NETBIOS 	0x0002
3245331Samw #define	SMBAUTH_NAME_TYPE_SERVER_DNS		0x0003
3255331Samw #define	SMBAUTH_NAME_TYPE_DOMAIN_DNS 		0x0004
3265331Samw 
3275331Samw /*
3285331Samw  * smb_auth_name_entry_t
3295331Samw  *
3305331Samw  * Each name entry in the data blob consists of the following 3 fields:
3315331Samw  *
3325331Samw  * nne_type - name type
3335331Samw  * nne_len  - the length of the name
3345331Samw  * nne_name - the name, in uppercase UCS-2LE Unicode format
3355331Samw  */
3365331Samw typedef struct smb_auth_name_entry {
3375331Samw 	unsigned short nne_type;
3385331Samw 	unsigned short nne_len;
33910966SJordan.Brown@Sun.COM 	smb_wchar_t nne_name[SMB_PI_MAX_DOMAIN * 2];
3405331Samw } smb_auth_name_entry_t;
3415331Samw 
3425331Samw /*
3435331Samw  * smb_auth_data_blob
3445331Samw  *
3455331Samw  * The format of this NTLMv2 data blob structure is as follow:
3465331Samw  *
3475331Samw  *	- Blob Signature 0x01010000 (4 bytes)
3485331Samw  * - Reserved (0x00000000) (4 bytes)
3495331Samw  * - Timestamp Little-endian, 64-bit signed value representing
3505331Samw  *   the number of tenths of a microsecond since January 1, 1601.
3515331Samw  *   (8 bytes)
3525331Samw  * - Client Challenge (8 bytes)
3535331Samw  * - Unknown1 (4 bytes)
3545331Samw  * - List of Target Information (variable length)
3555331Samw  * - Unknown2 (4 bytes)
3565331Samw  */
3575331Samw typedef struct smb_auth_data_blob {
3585331Samw 	unsigned char ndb_signature[4];
3595331Samw 	unsigned char ndb_reserved[4];
3605331Samw 	uint64_t ndb_timestamp;
3615331Samw 	unsigned char ndb_clnt_challenge[SMBAUTH_V2_CLNT_CHALLENGE_SZ];
3625331Samw 	unsigned char ndb_unknown[4];
3635331Samw 	smb_auth_name_entry_t ndb_names[2];
3645331Samw 	unsigned char ndb_unknown2[4];
3655331Samw } smb_auth_data_blob_t;
3665331Samw 
3675331Samw #define	SMBAUTH_BLOB_MAXLEN (sizeof (smb_auth_data_blob_t))
3685331Samw #define	SMBAUTH_CI_MAXLEN   SMBAUTH_LM_RESP_SZ
3695331Samw #define	SMBAUTH_CS_MAXLEN   (SMBAUTH_BLOB_MAXLEN + SMBAUTH_HASH_SZ)
3705331Samw 
3715331Samw /*
3725331Samw  * smb_auth_info_t
3735331Samw  *
3745331Samw  * The structure contains all the authentication information
3755331Samw  * needed for the preparaton of the SMBSessionSetupAndx request
3765331Samw  * and the user session key.
3775331Samw  *
3785331Samw  * hash      - NTLM hash
3795331Samw  * hash_v2   - NTLMv2 hash
3805331Samw  * ci_len    - the length of the case-insensitive password
3815331Samw  * ci        - case-insensitive password
3825331Samw  *             (If NTLMv2 authentication mechanism is used, it
3835331Samw  *              represents the LMv2 response. Otherwise, it
3845331Samw  *              is empty.)
3855331Samw  * cs_len    - the length of the case-sensitive password
3865331Samw  * cs        - case-sensitive password
3875331Samw  *             (If NTLMv2 authentication mechanism is used, it
3885331Samw  *              represents the NTLMv2 response. Otherwise, it
3895331Samw  *              represents the NTLM response.)
3905331Samw  * data_blob - NTLMv2 data blob
3915331Samw  */
3925331Samw typedef struct smb_auth_info {
3935331Samw 	unsigned char hash[SMBAUTH_HASH_SZ];
3945331Samw 	unsigned char hash_v2[SMBAUTH_HASH_SZ];
3955331Samw 	unsigned short ci_len;
3965331Samw 	unsigned char ci[SMBAUTH_CI_MAXLEN];
3975331Samw 	unsigned short cs_len;
3985331Samw 	unsigned char cs[SMBAUTH_CS_MAXLEN];
3995331Samw 	int lmcompatibility_lvl;
4005331Samw 	smb_auth_data_blob_t data_blob;
4015331Samw } smb_auth_info_t;
4025331Samw 
4035331Samw /*
4045331Samw  * SMB password management
4055331Samw  */
4065331Samw 
4075331Samw #define	SMB_PWF_LM	0x01	/* LM hash is present */
4085331Samw #define	SMB_PWF_NT	0x02	/* NT hash is present */
4095331Samw #define	SMB_PWF_DISABLE	0x04	/* Account is disabled */
4105331Samw 
4115331Samw typedef struct smb_passwd {
4128474SJose.Borrego@Sun.COM 	uid_t		pw_uid;
4138474SJose.Borrego@Sun.COM 	uint32_t	pw_flags;
4148474SJose.Borrego@Sun.COM 	char		pw_name[SMB_USERNAME_MAXLEN];
4158474SJose.Borrego@Sun.COM 	uint8_t		pw_lmhash[SMBAUTH_HASH_SZ];
4168474SJose.Borrego@Sun.COM 	uint8_t		pw_nthash[SMBAUTH_HASH_SZ];
4175331Samw } smb_passwd_t;
4185331Samw 
4195331Samw /*
4205331Samw  * Control flags passed to smb_pwd_setcntl
4215331Samw  */
4225331Samw #define	SMB_PWC_DISABLE	0x01
4235331Samw #define	SMB_PWC_ENABLE	0x02
4245331Samw #define	SMB_PWC_NOLM	0x04
4255331Samw 
4265331Samw #define	SMB_PWE_SUCCESS		0
4275331Samw #define	SMB_PWE_USER_UNKNOWN	1
4285331Samw #define	SMB_PWE_USER_DISABLE	2
4295331Samw #define	SMB_PWE_CLOSE_FAILED	3
4305331Samw #define	SMB_PWE_OPEN_FAILED	4
4315331Samw #define	SMB_PWE_WRITE_FAILED	6
4325331Samw #define	SMB_PWE_UPDATE_FAILED	7
4335331Samw #define	SMB_PWE_STAT_FAILED	8
4345331Samw #define	SMB_PWE_BUSY		9
4355331Samw #define	SMB_PWE_DENIED		10
4365331Samw #define	SMB_PWE_SYSTEM_ERROR	11
4377052Samw #define	SMB_PWE_INVALID_PARAM	12
4387052Samw #define	SMB_PWE_NO_MEMORY	13
4397052Samw #define	SMB_PWE_MAX		14
4407052Samw 
4417052Samw typedef struct smb_pwditer {
4427052Samw 	void *spi_next;
4437052Samw } smb_pwditer_t;
4445331Samw 
4457052Samw typedef struct smb_luser {
4467052Samw 	char *su_name;
4477052Samw 	char *su_fullname;
4487052Samw 	char *su_desc;
4497052Samw 	uint32_t su_rid;
4507052Samw 	uint32_t su_ctrl;
4517052Samw } smb_luser_t;
4527052Samw 
4537052Samw extern void smb_pwd_init(boolean_t);
4546030Sjb150015 extern void smb_pwd_fini(void);
4558474SJose.Borrego@Sun.COM extern smb_passwd_t *smb_pwd_getpwnam(const char *, smb_passwd_t *);
4568474SJose.Borrego@Sun.COM extern smb_passwd_t *smb_pwd_getpwuid(uid_t, smb_passwd_t *);
4575331Samw extern int smb_pwd_setpasswd(const char *, const char *);
4585331Samw extern int smb_pwd_setcntl(const char *, int);
4597052Samw 
4607052Samw extern int smb_pwd_iteropen(smb_pwditer_t *);
4617052Samw extern smb_luser_t *smb_pwd_iterate(smb_pwditer_t *);
4627052Samw extern void smb_pwd_iterclose(smb_pwditer_t *);
4635331Samw 
46410966SJordan.Brown@Sun.COM extern int smb_auth_qnd_unicode(smb_wchar_t *, const char *, int);
4659832Samw@Sun.COM extern int smb_auth_hmac_md5(unsigned char *, int, unsigned char *, int,
4669832Samw@Sun.COM     unsigned char *);
4675331Samw 
4685331Samw /*
4695331Samw  * A variation on HMAC-MD5 known as HMACT64 is used by Windows systems.
4705331Samw  * The HMACT64() function is the same as the HMAC-MD5() except that
4715331Samw  * it truncates the input key to 64 bytes rather than hashing it down
4725331Samw  * to 16 bytes using the MD5() function.
4735331Samw  */
4745331Samw #define	SMBAUTH_HMACT64(D, Ds, K, Ks, digest) \
4755331Samw 	smb_auth_hmac_md5(D, Ds, K, (Ks > 64) ? 64 : Ks, digest)
4765331Samw 
4775331Samw extern int smb_auth_DES(unsigned char *, int, unsigned char *, int,
4785331Samw     unsigned char *, int);
4795331Samw 
4805331Samw extern int smb_auth_md4(unsigned char *, unsigned char *, int);
4819832Samw@Sun.COM extern int smb_auth_lm_hash(const char *, unsigned char *);
4829832Samw@Sun.COM extern int smb_auth_ntlm_hash(const char *, unsigned char *);
4835331Samw 
4845331Samw extern int smb_auth_set_info(char *, char *,
4855331Samw     unsigned char *, char *, unsigned char *,
4865331Samw     int, int, smb_auth_info_t *);
4875331Samw 
4886600Sas200622 extern int smb_auth_ntlmv2_hash(unsigned char *,
4896600Sas200622 	char *, char *, unsigned char *);
4906600Sas200622 
4915331Samw extern int smb_auth_gen_session_key(smb_auth_info_t *, unsigned char *);
4925331Samw 
4935331Samw boolean_t smb_auth_validate_lm(unsigned char *, uint32_t, smb_passwd_t *,
4945772Sas200622     unsigned char *, int, char *, char *);
4955331Samw boolean_t smb_auth_validate_nt(unsigned char *, uint32_t, smb_passwd_t *,
4967348SJose.Borrego@Sun.COM     unsigned char *, int, char *, char *, uchar_t *);
4975331Samw 
4985331Samw /*
49910717Samw@Sun.COM  * SMB authenticated IPC
50010717Samw@Sun.COM  */
50110717Samw@Sun.COM extern void smb_ipc_commit(void);
50210717Samw@Sun.COM extern void smb_ipc_get_user(char *, size_t);
50310717Samw@Sun.COM extern void smb_ipc_get_passwd(uint8_t *, size_t);
50410717Samw@Sun.COM extern void smb_ipc_init(void);
50510717Samw@Sun.COM extern void smb_ipc_rollback(void);
50610717Samw@Sun.COM extern void smb_ipc_set(char *, uint8_t *);
50710717Samw@Sun.COM 
50810717Samw@Sun.COM /*
5095331Samw  * SMB MAC Signing
5105331Samw  */
5115331Samw 
5125331Samw #define	SMB_MAC_KEY_SZ	(SMBAUTH_SESSION_KEY_SZ + SMBAUTH_CS_MAXLEN)
5135331Samw #define	SMB_SIG_OFFS	14	/* signature field offset within header */
5145331Samw #define	SMB_SIG_SIZE	8	/* SMB signature size */
5155331Samw 
5165331Samw /*
5175331Samw  * Signing flags:
5185331Samw  *
5195331Samw  * SMB_SCF_ENABLE                 Signing is enabled.
5205331Samw  *
5215331Samw  * SMB_SCF_REQUIRED               Signing is enabled and required.
5225331Samw  *                                This flag shouldn't be set if
5235331Samw  *                                SMB_SCF_ENABLE isn't set.
5245331Samw  *
5255331Samw  * SMB_SCF_STARTED                Signing will start after receiving
5265331Samw  *                                the first non-anonymous SessionSetup
5275331Samw  *                                request.
5285331Samw  *
5295331Samw  * SMB_SCF_KEY_ISSET_THIS_LOGON   Indicates whether the MAC key has just
5305331Samw  *                                been set for this logon. (prior to
5315331Samw  *                                sending the SMBSessionSetup request)
5325331Samw  *
5335331Samw  */
5345331Samw #define	SMB_SCF_ENABLE		0x01
5355331Samw #define	SMB_SCF_REQUIRED	0x02
5365331Samw #define	SMB_SCF_STARTED		0x04
5375331Samw #define	SMB_SCF_KEY_ISSET_THIS_LOGON	0x08
5385331Samw 
5395331Samw /*
5405331Samw  * smb_sign_ctx
5415331Samw  *
5425331Samw  * SMB signing context.
5435331Samw  *
5445331Samw  *	ssc_seqnum				sequence number
5455331Samw  *	ssc_keylen				mac key length
5465331Samw  *	ssc_mid					multiplex id - reserved
5475331Samw  *	ssc_flags				flags
5485331Samw  *	ssc_mackey				mac key
5495331Samw  *	ssc_sign				mac signature
5505331Samw  *
5515331Samw  */
5525331Samw typedef struct smb_sign_ctx {
5535331Samw 	unsigned int ssc_seqnum;
5545331Samw 	unsigned short ssc_keylen;
5555331Samw 	unsigned short ssc_mid;
5565331Samw 	unsigned int ssc_flags;
5575331Samw 	unsigned char ssc_mackey[SMB_MAC_KEY_SZ];
5585331Samw 	unsigned char ssc_sign[SMB_SIG_SIZE];
5595331Samw } smb_sign_ctx_t;
5605331Samw 
5615331Samw extern int smb_mac_init(smb_sign_ctx_t *sign_ctx, smb_auth_info_t *auth);
5625331Samw extern int smb_mac_calc(smb_sign_ctx_t *sign_ctx,
5635331Samw     const unsigned char *buf, size_t buf_len, unsigned char *mac_sign);
5645331Samw extern int smb_mac_chk(smb_sign_ctx_t *sign_ctx,
5655331Samw     const unsigned char *buf, size_t buf_len);
5665331Samw extern int smb_mac_sign(smb_sign_ctx_t *sign_ctx,
5675331Samw     unsigned char *buf, size_t buf_len);
5685331Samw extern void smb_mac_inc_seqnum(smb_sign_ctx_t *sign_ctx);
5695331Samw extern void smb_mac_dec_seqnum(smb_sign_ctx_t *sign_ctx);
5705331Samw 
5715331Samw /*
5725331Samw  * Each domain is categorized using the enum values below.
5735331Samw  * The local domain refers to the local machine and is named
5745331Samw  * after the local hostname. The primary domain is the domain
5755331Samw  * that the system joined. All other domains are either
5765331Samw  * trusted or untrusted, as defined by the primary domain PDC.
5775331Samw  */
57810717Samw@Sun.COM typedef enum smb_domain_type {
57910717Samw@Sun.COM 	SMB_DOMAIN_NULL,
58010717Samw@Sun.COM 	SMB_DOMAIN_BUILTIN,
58110717Samw@Sun.COM 	SMB_DOMAIN_LOCAL,
58210717Samw@Sun.COM 	SMB_DOMAIN_PRIMARY,
58310717Samw@Sun.COM 	SMB_DOMAIN_ACCOUNT,
58410717Samw@Sun.COM 	SMB_DOMAIN_TRUSTED,
58510717Samw@Sun.COM 	SMB_DOMAIN_UNTRUSTED,
58610717Samw@Sun.COM 	SMB_DOMAIN_NUM_TYPES
58710717Samw@Sun.COM } smb_domain_type_t;
5885331Samw 
5899832Samw@Sun.COM /*
5909832Samw@Sun.COM  * Information specific to trusted domains
5919832Samw@Sun.COM  */
5929832Samw@Sun.COM typedef struct smb_domain_trust {
5939832Samw@Sun.COM 	uint32_t		dti_trust_direction;
5949832Samw@Sun.COM 	uint32_t		dti_trust_type;
5959832Samw@Sun.COM 	uint32_t		dti_trust_attrs;
5969832Samw@Sun.COM } smb_domain_trust_t;
5975331Samw 
5985331Samw /*
5999832Samw@Sun.COM  * DNS information for domain types that this info is
6009832Samw@Sun.COM  * obtained/available. Currently this is only obtained
6019832Samw@Sun.COM  * for the primary domain.
6029832Samw@Sun.COM  */
6039832Samw@Sun.COM typedef struct smb_domain_dns {
6049832Samw@Sun.COM 	char			ddi_forest[MAXHOSTNAMELEN];
6059832Samw@Sun.COM 	char			ddi_guid[UUID_PRINTABLE_STRING_LENGTH];
6069832Samw@Sun.COM } smb_domain_dns_t;
6079832Samw@Sun.COM 
6089832Samw@Sun.COM /*
6099832Samw@Sun.COM  * This is the information that is held about each domain.
6105331Samw  */
61110717Samw@Sun.COM typedef struct smb_domain {
6129832Samw@Sun.COM 	list_node_t		di_lnd;
61310717Samw@Sun.COM 	smb_domain_type_t	di_type;
6149832Samw@Sun.COM 	char			di_sid[SMB_SID_STRSZ];
6159832Samw@Sun.COM 	char			di_nbname[NETBIOS_NAME_SZ];
6169832Samw@Sun.COM 	char			di_fqname[MAXHOSTNAMELEN];
6179832Samw@Sun.COM 	smb_sid_t		*di_binsid;
6189832Samw@Sun.COM 	union {
6199832Samw@Sun.COM 		smb_domain_dns_t	di_dns;
6209832Samw@Sun.COM 		smb_domain_trust_t	di_trust;
6219832Samw@Sun.COM 	} di_u;
62210717Samw@Sun.COM } smb_domain_t;
6235331Samw 
6249832Samw@Sun.COM typedef struct smb_trusted_domains {
6259832Samw@Sun.COM 	uint32_t	td_num;
62610717Samw@Sun.COM 	smb_domain_t	*td_domains;
6279832Samw@Sun.COM } smb_trusted_domains_t;
6289832Samw@Sun.COM 
6299832Samw@Sun.COM #define	SMB_DOMAIN_SUCCESS		0
6309832Samw@Sun.COM #define	SMB_DOMAIN_NOMACHINE_SID	1
6319832Samw@Sun.COM #define	SMB_DOMAIN_NODOMAIN_SID		2
6329832Samw@Sun.COM #define	SMB_DOMAIN_NODOMAIN_NAME	3
6339832Samw@Sun.COM #define	SMB_DOMAIN_INTERNAL_ERR		4
6349832Samw@Sun.COM #define	SMB_DOMAIN_INVALID_ARG		5
6359832Samw@Sun.COM #define	SMB_DOMAIN_NO_MEMORY		6
63610717Samw@Sun.COM #define	SMB_DOMAIN_NO_CACHE		7
6379832Samw@Sun.COM 
63810717Samw@Sun.COM /*
63910717Samw@Sun.COM  * This structure could contain information about
64010717Samw@Sun.COM  * the primary domain the name of selected domain controller
64110717Samw@Sun.COM  * for the primary domain and a list of trusted domains if
64210717Samw@Sun.COM  * any. The "ex" in the structure name stands for extended.
64310717Samw@Sun.COM  * This is to differentiate this structure from smb_domain_t
64410717Samw@Sun.COM  * which only contains information about a single domain.
64510717Samw@Sun.COM  */
64610717Samw@Sun.COM typedef struct smb_domainex {
6479832Samw@Sun.COM 	char			d_dc[MAXHOSTNAMELEN];
64810717Samw@Sun.COM 	smb_domain_t		d_primary;
6499832Samw@Sun.COM 	smb_trusted_domains_t	d_trusted;
65010717Samw@Sun.COM } smb_domainex_t;
6519832Samw@Sun.COM 
65210717Samw@Sun.COM int smb_domain_init(uint32_t);
65310717Samw@Sun.COM void smb_domain_fini(void);
65410717Samw@Sun.COM void smb_domain_show(void);
65510717Samw@Sun.COM void smb_domain_save(void);
65610717Samw@Sun.COM boolean_t smb_domain_lookup_name(char *, smb_domain_t *);
65710717Samw@Sun.COM boolean_t smb_domain_lookup_sid(smb_sid_t *, smb_domain_t *);
65810717Samw@Sun.COM boolean_t smb_domain_lookup_type(smb_domain_type_t, smb_domain_t *);
65910717Samw@Sun.COM boolean_t smb_domain_getinfo(smb_domainex_t *);
66010717Samw@Sun.COM void smb_domain_update(smb_domainex_t *);
66110717Samw@Sun.COM uint32_t smb_domain_start_update(void);
66210717Samw@Sun.COM void smb_domain_end_update(void);
66310717Samw@Sun.COM void smb_domain_set_basic_info(char *, char *, char *, smb_domain_t *);
66410717Samw@Sun.COM void smb_domain_set_dns_info(char *, char *, char *, char *, char *,
66510717Samw@Sun.COM     smb_domain_t *);
66610717Samw@Sun.COM void smb_domain_set_trust_info(char *, char *, char *,
66710717Samw@Sun.COM     uint32_t, uint32_t, uint32_t, smb_domain_t *);
6685331Samw 
6695772Sas200622 typedef struct smb_gsid {
6706432Sas200622 	smb_sid_t *gs_sid;
6715772Sas200622 	uint16_t gs_type;
6725772Sas200622 } smb_gsid_t;
6735331Samw 
6745772Sas200622 typedef struct smb_giter {
6755772Sas200622 	sqlite_vm	*sgi_vm;
6765772Sas200622 	sqlite		*sgi_db;
67711963SAfshin.Ardakani@Sun.COM 	uint32_t	sgi_nerr;
6785772Sas200622 } smb_giter_t;
6795331Samw 
6805772Sas200622 typedef struct smb_group {
6815772Sas200622 	char			*sg_name;
6825772Sas200622 	char			*sg_cmnt;
6835772Sas200622 	uint32_t		sg_attr;
6845772Sas200622 	uint32_t		sg_rid;
6855772Sas200622 	smb_gsid_t		sg_id;
68611963SAfshin.Ardakani@Sun.COM 	smb_domain_type_t	sg_domain;
6875772Sas200622 	smb_privset_t		*sg_privs;
6885772Sas200622 	uint32_t		sg_nmembers;
6895772Sas200622 	smb_gsid_t		*sg_members;
6905772Sas200622 } smb_group_t;
6915331Samw 
6925772Sas200622 int smb_lgrp_start(void);
6935772Sas200622 void smb_lgrp_stop(void);
6945772Sas200622 int smb_lgrp_add(char *, char *);
6955772Sas200622 int smb_lgrp_rename(char *, char *);
6965772Sas200622 int smb_lgrp_delete(char *);
6975772Sas200622 int smb_lgrp_setcmnt(char *, char *);
6985772Sas200622 int smb_lgrp_getcmnt(char *, char **);
6995772Sas200622 int smb_lgrp_getpriv(char *, uint8_t, boolean_t *);
7005772Sas200622 int smb_lgrp_setpriv(char *, uint8_t, boolean_t);
7016432Sas200622 int smb_lgrp_add_member(char *, smb_sid_t *, uint16_t);
7026432Sas200622 int smb_lgrp_del_member(char *, smb_sid_t *, uint16_t);
7035772Sas200622 int smb_lgrp_getbyname(char *, smb_group_t *);
70411963SAfshin.Ardakani@Sun.COM int smb_lgrp_getbyrid(uint32_t, smb_domain_type_t, smb_group_t *);
7055772Sas200622 void smb_lgrp_free(smb_group_t *);
70612065SKeyur.Desai@Sun.COM uint32_t smb_lgrp_err_to_ntstatus(uint32_t);
7076432Sas200622 boolean_t smb_lgrp_is_member(smb_group_t *, smb_sid_t *);
7085772Sas200622 char *smb_lgrp_strerror(int);
7095772Sas200622 int smb_lgrp_iteropen(smb_giter_t *);
7105772Sas200622 void smb_lgrp_iterclose(smb_giter_t *);
71111963SAfshin.Ardakani@Sun.COM boolean_t smb_lgrp_itererror(smb_giter_t *);
7125772Sas200622 int smb_lgrp_iterate(smb_giter_t *, smb_group_t *);
7135331Samw 
71411337SWilliam.Krier@Sun.COM int smb_lookup_sid(const char *, lsa_account_t *);
71511337SWilliam.Krier@Sun.COM int smb_lookup_name(const char *, sid_type_t, lsa_account_t *);
7165331Samw 
7175772Sas200622 #define	SMB_LGRP_SUCCESS		0
7185772Sas200622 #define	SMB_LGRP_INVALID_ARG		1
7195772Sas200622 #define	SMB_LGRP_INVALID_MEMBER		2
7205772Sas200622 #define	SMB_LGRP_INVALID_NAME		3
7215772Sas200622 #define	SMB_LGRP_NOT_FOUND		4
7225772Sas200622 #define	SMB_LGRP_EXISTS			5
7235772Sas200622 #define	SMB_LGRP_NO_SID			6
7245772Sas200622 #define	SMB_LGRP_NO_LOCAL_SID		7
7255772Sas200622 #define	SMB_LGRP_SID_NOTLOCAL		8
7265772Sas200622 #define	SMB_LGRP_WKSID			9
7275772Sas200622 #define	SMB_LGRP_NO_MEMORY		10
7285772Sas200622 #define	SMB_LGRP_DB_ERROR		11
7295772Sas200622 #define	SMB_LGRP_DBINIT_ERROR		12
7305772Sas200622 #define	SMB_LGRP_INTERNAL_ERROR		13
7315772Sas200622 #define	SMB_LGRP_MEMBER_IN_GROUP	14
7325772Sas200622 #define	SMB_LGRP_MEMBER_NOT_IN_GROUP	15
7335772Sas200622 #define	SMB_LGRP_NO_SUCH_PRIV		16
7345772Sas200622 #define	SMB_LGRP_NO_SUCH_DOMAIN		17
7355772Sas200622 #define	SMB_LGRP_PRIV_HELD		18
7365772Sas200622 #define	SMB_LGRP_PRIV_NOT_HELD		19
7375772Sas200622 #define	SMB_LGRP_BAD_DATA		20
7385772Sas200622 #define	SMB_LGRP_NO_MORE		21
7395772Sas200622 #define	SMB_LGRP_DBOPEN_FAILED		22
7405772Sas200622 #define	SMB_LGRP_DBEXEC_FAILED		23
7415772Sas200622 #define	SMB_LGRP_DBINIT_FAILED		24
7425772Sas200622 #define	SMB_LGRP_DOMLKP_FAILED		25
7435772Sas200622 #define	SMB_LGRP_DOMINS_FAILED		26
7445772Sas200622 #define	SMB_LGRP_INSERT_FAILED		27
7455772Sas200622 #define	SMB_LGRP_DELETE_FAILED		28
7465772Sas200622 #define	SMB_LGRP_UPDATE_FAILED		29
7475772Sas200622 #define	SMB_LGRP_LOOKUP_FAILED		30
7485772Sas200622 #define	SMB_LGRP_NOT_SUPPORTED		31
74911963SAfshin.Ardakani@Sun.COM #define	SMB_LGRP_OFFLINE		32
75012508Samw@Sun.COM #define	SMB_LGRP_POSIXCREATE_FAILED	33
7515331Samw 
7525772Sas200622 #define	SMB_LGRP_COMMENT_MAX	256
7535331Samw 
7546030Sjb150015 /*
7556030Sjb150015  * values for smb_nic_t.smbflags
7566030Sjb150015  */
7576030Sjb150015 #define	SMB_NICF_NBEXCL		0x01	/* Excluded from Netbios activities */
7586030Sjb150015 #define	SMB_NICF_ALIAS		0x02	/* This is an alias */
7596030Sjb150015 
7606030Sjb150015 /*
7616030Sjb150015  * smb_nic_t
7626030Sjb150015  *     nic_host		actual host name
7636030Sjb150015  *     nic_nbname	16-byte NetBIOS host name
7646030Sjb150015  */
7656030Sjb150015 typedef struct {
7666030Sjb150015 	char		nic_host[MAXHOSTNAMELEN];
7676030Sjb150015 	char		nic_nbname[NETBIOS_NAME_SZ];
7686030Sjb150015 	char		nic_cmnt[SMB_PI_MAX_COMMENT];
7696030Sjb150015 	char		nic_ifname[LIFNAMSIZ];
7708670SJose.Borrego@Sun.COM 	smb_inaddr_t	nic_ip;
7716030Sjb150015 	uint32_t	nic_mask;
7726030Sjb150015 	uint32_t	nic_bcast;
7736030Sjb150015 	uint32_t	nic_smbflags;
7746030Sjb150015 	uint64_t	nic_sysflags;
7756030Sjb150015 } smb_nic_t;
7766030Sjb150015 
7776030Sjb150015 typedef struct smb_niciter {
7786030Sjb150015 	smb_nic_t ni_nic;
7796030Sjb150015 	int ni_cookie;
7806030Sjb150015 	int ni_seqnum;
7816030Sjb150015 } smb_niciter_t;
7826030Sjb150015 
7836030Sjb150015 /* NIC config functions */
7846030Sjb150015 int smb_nic_init(void);
7856030Sjb150015 void smb_nic_fini(void);
7866030Sjb150015 int smb_nic_getnum(char *);
7876030Sjb150015 int smb_nic_addhost(const char *, const char *, int, const char **);
7886030Sjb150015 int smb_nic_delhost(const char *);
7896030Sjb150015 int smb_nic_getfirst(smb_niciter_t *);
7906030Sjb150015 int smb_nic_getnext(smb_niciter_t *);
7919021Samw@Sun.COM boolean_t smb_nic_is_local(smb_inaddr_t *);
7929021Samw@Sun.COM boolean_t smb_nic_is_same_subnet(smb_inaddr_t *);
7936030Sjb150015 
79411963SAfshin.Ardakani@Sun.COM #define	SMB_NIC_SUCCESS			0
79511963SAfshin.Ardakani@Sun.COM #define	SMB_NIC_INVALID_ARG		1
79611963SAfshin.Ardakani@Sun.COM #define	SMB_NIC_NOT_FOUND		2
79711963SAfshin.Ardakani@Sun.COM #define	SMB_NIC_NO_HOST			3
79811963SAfshin.Ardakani@Sun.COM #define	SMB_NIC_NO_MEMORY		4
79911963SAfshin.Ardakani@Sun.COM #define	SMB_NIC_DB_ERROR		5
80011963SAfshin.Ardakani@Sun.COM #define	SMB_NIC_DBINIT_ERROR		6
80111963SAfshin.Ardakani@Sun.COM #define	SMB_NIC_BAD_DATA		7
80211963SAfshin.Ardakani@Sun.COM #define	SMB_NIC_NO_MORE			8
80311963SAfshin.Ardakani@Sun.COM #define	SMB_NIC_DBOPEN_FAILED		9
80411963SAfshin.Ardakani@Sun.COM #define	SMB_NIC_DBEXEC_FAILED		10
80511963SAfshin.Ardakani@Sun.COM #define	SMB_NIC_DBINIT_FAILED		11
80611963SAfshin.Ardakani@Sun.COM #define	SMB_NIC_INSERT_FAILED		12
80711963SAfshin.Ardakani@Sun.COM #define	SMB_NIC_DELETE_FAILED		13
80811963SAfshin.Ardakani@Sun.COM #define	SMB_NIC_SOCK			14
80911963SAfshin.Ardakani@Sun.COM #define	SMB_NIC_IOCTL			15
81011963SAfshin.Ardakani@Sun.COM #define	SMB_NIC_CHANGED			16
81111963SAfshin.Ardakani@Sun.COM 
8128474SJose.Borrego@Sun.COM /*
8138474SJose.Borrego@Sun.COM  * Well-known account structure
8148474SJose.Borrego@Sun.COM  *
8158474SJose.Borrego@Sun.COM  * A security identifier (SID) is a unique value of variable length that
8168474SJose.Borrego@Sun.COM  * is used to identify a security principal or security group in
8178474SJose.Borrego@Sun.COM  * Windows. Well-known SIDs are a group of SIDs that identify generic
8188474SJose.Borrego@Sun.COM  * users or generic groups. Their values remain constant across all
8198474SJose.Borrego@Sun.COM  * operating systems.
8208474SJose.Borrego@Sun.COM  *
8218474SJose.Borrego@Sun.COM  * This structure is defined to store these SIDs and other related
8228474SJose.Borrego@Sun.COM  * information about them (e.g. account and domain names) in a
8238474SJose.Borrego@Sun.COM  * predefined table.
8248474SJose.Borrego@Sun.COM  */
8258474SJose.Borrego@Sun.COM typedef struct smb_wka {
8268474SJose.Borrego@Sun.COM 	uint8_t		wka_domidx;
8278474SJose.Borrego@Sun.COM 	char		*wka_sid;
8288474SJose.Borrego@Sun.COM 	char		*wka_name;
8298474SJose.Borrego@Sun.COM 	uint16_t	wka_type;
8308474SJose.Borrego@Sun.COM 	uint16_t	wka_flags;
8318474SJose.Borrego@Sun.COM 	char		*wka_desc;
8328474SJose.Borrego@Sun.COM 	smb_sid_t	*wka_binsid;
8338474SJose.Borrego@Sun.COM } smb_wka_t;
8348474SJose.Borrego@Sun.COM 
8358474SJose.Borrego@Sun.COM /*
8368474SJose.Borrego@Sun.COM  * Defined values for smb_wka.wka_flags
8378474SJose.Borrego@Sun.COM  *
8388474SJose.Borrego@Sun.COM  * SMB_WKAFLG_LGRP_ENABLE		Can be added as local group
8398474SJose.Borrego@Sun.COM  */
8408474SJose.Borrego@Sun.COM #define	SMB_WKAFLG_LGRP_ENABLE	0x1
8418474SJose.Borrego@Sun.COM 
8428474SJose.Borrego@Sun.COM /*
8438474SJose.Borrego@Sun.COM  * Well-known account interfaces
8448474SJose.Borrego@Sun.COM  */
84511447Samw@Sun.COM smb_wka_t *smb_wka_lookup_builtin(const char *);
84611447Samw@Sun.COM smb_wka_t *smb_wka_lookup_name(const char *);
8478670SJose.Borrego@Sun.COM smb_wka_t *smb_wka_lookup_sid(smb_sid_t *);
84811447Samw@Sun.COM smb_sid_t *smb_wka_get_sid(const char *);
8498474SJose.Borrego@Sun.COM char *smb_wka_get_domain(int);
8509832Samw@Sun.COM uint32_t smb_wka_token_groups(uint32_t, smb_ids_t *);
8518670SJose.Borrego@Sun.COM 
8528670SJose.Borrego@Sun.COM /*
8538670SJose.Borrego@Sun.COM  * In memory account representation
8548670SJose.Borrego@Sun.COM  */
8558670SJose.Borrego@Sun.COM typedef struct smb_account {
8568670SJose.Borrego@Sun.COM 	char		*a_name;
8578670SJose.Borrego@Sun.COM 	char		*a_domain;
8588670SJose.Borrego@Sun.COM 	uint16_t	a_type;
8598670SJose.Borrego@Sun.COM 	smb_sid_t	*a_sid;
8608670SJose.Borrego@Sun.COM 	smb_sid_t	*a_domsid;
8618670SJose.Borrego@Sun.COM 	uint32_t	a_rid;
8628670SJose.Borrego@Sun.COM } smb_account_t;
8638670SJose.Borrego@Sun.COM 
8648670SJose.Borrego@Sun.COM uint32_t smb_sam_lookup_name(char *, char *, uint16_t, smb_account_t *);
8658670SJose.Borrego@Sun.COM uint32_t smb_sam_lookup_sid(smb_sid_t *, smb_account_t *);
8668670SJose.Borrego@Sun.COM int smb_sam_usr_cnt(void);
8678670SJose.Borrego@Sun.COM uint32_t smb_sam_usr_groups(smb_sid_t *, smb_ids_t *);
86810717Samw@Sun.COM int smb_sam_grp_cnt(smb_domain_type_t);
8698670SJose.Borrego@Sun.COM void smb_account_free(smb_account_t *);
8708670SJose.Borrego@Sun.COM boolean_t smb_account_validate(smb_account_t *);
8718474SJose.Borrego@Sun.COM 
8729832Samw@Sun.COM /*
8739832Samw@Sun.COM  * Security Descriptor functions.
8749832Samw@Sun.COM  */
8759832Samw@Sun.COM uint32_t smb_sd_read(char *path, smb_sd_t *, uint32_t);
8769832Samw@Sun.COM uint32_t smb_sd_write(char *path, smb_sd_t *, uint32_t);
87711337SWilliam.Krier@Sun.COM uint32_t smb_sd_fromfs(smb_fssd_t *, smb_sd_t *);
8789832Samw@Sun.COM 
8799832Samw@Sun.COM /* Kernel Module Interface */
8809832Samw@Sun.COM int smb_kmod_bind(void);
881*13082SJoyce.McIntosh@Sun.COM boolean_t smb_kmod_isbound(void);
8829832Samw@Sun.COM int smb_kmod_setcfg(smb_kmod_cfg_t *);
8839832Samw@Sun.COM int smb_kmod_setgmtoff(int32_t);
8849832Samw@Sun.COM int smb_kmod_start(int, int, int);
88511963SAfshin.Ardakani@Sun.COM void smb_kmod_stop(void);
88611963SAfshin.Ardakani@Sun.COM int smb_kmod_event_notify(uint32_t);
8879832Samw@Sun.COM void smb_kmod_unbind(void);
88812508Samw@Sun.COM int smb_kmod_share(nvlist_t *);
88912508Samw@Sun.COM int smb_kmod_unshare(nvlist_t *);
89012890SJoyce.McIntosh@Sun.COM int smb_kmod_shareinfo(char *, boolean_t *);
89110122SJordan.Brown@Sun.COM int smb_kmod_get_open_num(smb_opennum_t *);
89210122SJordan.Brown@Sun.COM int smb_kmod_enum(smb_netsvc_t *);
89310122SJordan.Brown@Sun.COM smb_netsvc_t *smb_kmod_enum_init(smb_svcenum_t *);
89410122SJordan.Brown@Sun.COM void smb_kmod_enum_fini(smb_netsvc_t *);
89510122SJordan.Brown@Sun.COM int smb_kmod_session_close(const char *, const char *);
89610122SJordan.Brown@Sun.COM int smb_kmod_file_close(uint32_t);
897*13082SJoyce.McIntosh@Sun.COM int smb_kmod_get_spool_doc(uint32_t *, char *, char *, smb_inaddr_t *);
89810122SJordan.Brown@Sun.COM 
89911337SWilliam.Krier@Sun.COM void smb_name_parse(char *, char **, char **);
90011337SWilliam.Krier@Sun.COM uint32_t smb_name_validate_share(const char *);
90111337SWilliam.Krier@Sun.COM uint32_t smb_name_validate_account(const char *);
90211337SWilliam.Krier@Sun.COM uint32_t smb_name_validate_domain(const char *);
90311337SWilliam.Krier@Sun.COM uint32_t smb_name_validate_nbdomain(const char *);
90411337SWilliam.Krier@Sun.COM uint32_t smb_name_validate_workgroup(const char *);
90511963SAfshin.Ardakani@Sun.COM uint32_t smb_name_validate_rpath(const char *);
90611337SWilliam.Krier@Sun.COM 
90710122SJordan.Brown@Sun.COM /*
90810122SJordan.Brown@Sun.COM  * Interposer library validation
90910122SJordan.Brown@Sun.COM  */
91010122SJordan.Brown@Sun.COM #define	SMBEX_VERSION	1
91110122SJordan.Brown@Sun.COM #define	SMBEX_KEY	"82273fdc-e32a-18c3-3f78-827929dc23ea"
91210122SJordan.Brown@Sun.COM typedef struct smbex_version {
91310122SJordan.Brown@Sun.COM 	uint32_t v_version;
91410122SJordan.Brown@Sun.COM 	uuid_t v_uuid;
91510122SJordan.Brown@Sun.COM } smbex_version_t;
91610122SJordan.Brown@Sun.COM void *smb_dlopen(void);
91710122SJordan.Brown@Sun.COM void smb_dlclose(void *);
9189832Samw@Sun.COM 
91911963SAfshin.Ardakani@Sun.COM /*
92011963SAfshin.Ardakani@Sun.COM  * General purpose multi-thread safe cache based on
92111963SAfshin.Ardakani@Sun.COM  * AVL tree
92211963SAfshin.Ardakani@Sun.COM  */
92311963SAfshin.Ardakani@Sun.COM typedef struct smb_cache {
92411963SAfshin.Ardakani@Sun.COM 	avl_tree_t	ch_cache;
92511963SAfshin.Ardakani@Sun.COM 	rwlock_t	ch_cache_lck;
92611963SAfshin.Ardakani@Sun.COM 	uint32_t	ch_state;
92711963SAfshin.Ardakani@Sun.COM 	uint32_t	ch_nops;
92811963SAfshin.Ardakani@Sun.COM 	uint32_t	ch_wait;
92911963SAfshin.Ardakani@Sun.COM 	uint32_t	ch_sequence;
93011963SAfshin.Ardakani@Sun.COM 	size_t		ch_datasz;
93111963SAfshin.Ardakani@Sun.COM 	mutex_t		ch_mtx;
93211963SAfshin.Ardakani@Sun.COM 	cond_t		ch_cv;
93311963SAfshin.Ardakani@Sun.COM 	void		(*ch_free)(void *);
93411963SAfshin.Ardakani@Sun.COM 	void		(*ch_copy)(const void *, void *, size_t);
93511963SAfshin.Ardakani@Sun.COM } smb_cache_t;
93611963SAfshin.Ardakani@Sun.COM 
93711963SAfshin.Ardakani@Sun.COM typedef struct smb_cache_node {
93811963SAfshin.Ardakani@Sun.COM 	avl_node_t	cn_link;
93911963SAfshin.Ardakani@Sun.COM 	void		*cn_data;
94011963SAfshin.Ardakani@Sun.COM } smb_cache_node_t;
94111963SAfshin.Ardakani@Sun.COM 
94211963SAfshin.Ardakani@Sun.COM typedef struct smb_cache_cursor {
94311963SAfshin.Ardakani@Sun.COM 	void		*cc_next;
94411963SAfshin.Ardakani@Sun.COM 	uint32_t	cc_sequence;
94511963SAfshin.Ardakani@Sun.COM } smb_cache_cursor_t;
94611963SAfshin.Ardakani@Sun.COM 
94711963SAfshin.Ardakani@Sun.COM /*
94811963SAfshin.Ardakani@Sun.COM  * flags used with smb_cache_add()
94911963SAfshin.Ardakani@Sun.COM  *
95011963SAfshin.Ardakani@Sun.COM  * SMB_CACHE_ADD	If object doesn't exist add, otherwise fail
95111963SAfshin.Ardakani@Sun.COM  * SMB_CACHE_REPLACE	If object doesn't exist add, otherwise replace
95211963SAfshin.Ardakani@Sun.COM  */
95311963SAfshin.Ardakani@Sun.COM #define	SMB_CACHE_ADD		1
95411963SAfshin.Ardakani@Sun.COM #define	SMB_CACHE_REPLACE	2
95511963SAfshin.Ardakani@Sun.COM 
95611963SAfshin.Ardakani@Sun.COM void smb_cache_create(smb_cache_t *, uint32_t,
95711963SAfshin.Ardakani@Sun.COM     int (*cmpfn) (const void *, const void *), void (*freefn)(void *),
95811963SAfshin.Ardakani@Sun.COM     void (*copyfn)(const void *, void *, size_t), size_t);
95911963SAfshin.Ardakani@Sun.COM void smb_cache_destroy(smb_cache_t *);
96011963SAfshin.Ardakani@Sun.COM void smb_cache_flush(smb_cache_t *);
96111963SAfshin.Ardakani@Sun.COM uint32_t smb_cache_num(smb_cache_t *);
96211963SAfshin.Ardakani@Sun.COM int smb_cache_refreshing(smb_cache_t *);
96311963SAfshin.Ardakani@Sun.COM void smb_cache_ready(smb_cache_t *);
96411963SAfshin.Ardakani@Sun.COM int smb_cache_add(smb_cache_t *, const void *, int);
96511963SAfshin.Ardakani@Sun.COM void smb_cache_remove(smb_cache_t *, const void *);
96611963SAfshin.Ardakani@Sun.COM void smb_cache_iterinit(smb_cache_t *, smb_cache_cursor_t *);
96711963SAfshin.Ardakani@Sun.COM boolean_t smb_cache_iterate(smb_cache_t *, smb_cache_cursor_t *, void *);
96811963SAfshin.Ardakani@Sun.COM 
96911963SAfshin.Ardakani@Sun.COM /*
97011963SAfshin.Ardakani@Sun.COM  * Values returned by smb_reparse_stat()
97111963SAfshin.Ardakani@Sun.COM  */
97211963SAfshin.Ardakani@Sun.COM #define	SMB_REPARSE_NOTFOUND	1	/* object does not exist */
97311963SAfshin.Ardakani@Sun.COM #define	SMB_REPARSE_NOTREPARSE	2	/* object is NOT a reparse point */
97411963SAfshin.Ardakani@Sun.COM #define	SMB_REPARSE_ISREPARSE	3	/* object is a reparse point */
97511963SAfshin.Ardakani@Sun.COM 
97611963SAfshin.Ardakani@Sun.COM /*
97711963SAfshin.Ardakani@Sun.COM  * Reparse Point API
97811963SAfshin.Ardakani@Sun.COM  */
97911963SAfshin.Ardakani@Sun.COM int smb_reparse_stat(const char *, uint32_t *);
98011963SAfshin.Ardakani@Sun.COM int smb_reparse_svcadd(const char *, const char *, const char *);
98111963SAfshin.Ardakani@Sun.COM int smb_reparse_svcdel(const char *, const char *);
98211963SAfshin.Ardakani@Sun.COM int smb_reparse_svcget(const char *, const char *, char **);
98311963SAfshin.Ardakani@Sun.COM 
98412508Samw@Sun.COM uint32_t smb_get_txid(void);
98512508Samw@Sun.COM 
98612508Samw@Sun.COM #define	SMB_LOG_LINE_SZ		256
98712508Samw@Sun.COM 
98812508Samw@Sun.COM typedef uint32_t	smb_log_hdl_t;
98912508Samw@Sun.COM 
99012508Samw@Sun.COM typedef struct smb_log_item {
99112508Samw@Sun.COM 	list_node_t	li_lnd;
99212508Samw@Sun.COM 	char		li_msg[SMB_LOG_LINE_SZ];
99312508Samw@Sun.COM } smb_log_item_t;
99412508Samw@Sun.COM 
99512508Samw@Sun.COM typedef struct smb_log {
99612508Samw@Sun.COM 	smb_log_hdl_t	l_handle;
99712508Samw@Sun.COM 	int		l_cnt;
99812508Samw@Sun.COM 	int		l_max_cnt;
99912508Samw@Sun.COM 	mutex_t		l_mtx;
100012508Samw@Sun.COM 	list_t		l_list;
100112508Samw@Sun.COM 	char		l_file[MAXPATHLEN];
100212508Samw@Sun.COM } smb_log_t;
100312508Samw@Sun.COM 
100412508Samw@Sun.COM typedef struct smb_loglist_item {
100512508Samw@Sun.COM 	list_node_t	lli_lnd;
100612508Samw@Sun.COM 	smb_log_t	lli_log;
100712508Samw@Sun.COM } smb_loglist_item_t;
100812508Samw@Sun.COM 
100912508Samw@Sun.COM typedef struct smb_loglist {
101012508Samw@Sun.COM 	mutex_t		ll_mtx;
101112508Samw@Sun.COM 	list_t		ll_list;
101212508Samw@Sun.COM } smb_loglist_t;
101312508Samw@Sun.COM 
101412508Samw@Sun.COM smb_log_hdl_t smb_log_create(int, char *);
101512508Samw@Sun.COM void smb_log(smb_log_hdl_t, int, const char *, ...);
101612508Samw@Sun.COM void smb_log_dumpall(void);
101712508Samw@Sun.COM 
10185331Samw #ifdef	__cplusplus
10195331Samw }
10205331Samw #endif
10215331Samw 
10225331Samw #endif	/* _LIBSMB_H */
1023