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