xref: /titanic_44/usr/src/lib/libsmbfs/smb/private.h (revision 613a2f6ba31e891e3d947a356daf5e563d43c1ce)
19c9af259SGordon Ross /*
29c9af259SGordon Ross  * Copyright (c) 2000-2001 Boris Popov
39c9af259SGordon Ross  * All rights reserved.
49c9af259SGordon Ross  *
59c9af259SGordon Ross  * Redistribution and use in source and binary forms, with or without
69c9af259SGordon Ross  * modification, are permitted provided that the following conditions
79c9af259SGordon Ross  * are met:
89c9af259SGordon Ross  * 1. Redistributions of source code must retain the above copyright
99c9af259SGordon Ross  *    notice, this list of conditions and the following disclaimer.
109c9af259SGordon Ross  * 2. Redistributions in binary form must reproduce the above copyright
119c9af259SGordon Ross  *    notice, this list of conditions and the following disclaimer in the
129c9af259SGordon Ross  *    documentation and/or other materials provided with the distribution.
139c9af259SGordon Ross  * 3. All advertising materials mentioning features or use of this software
149c9af259SGordon Ross  *    must display the following acknowledgement:
159c9af259SGordon Ross  *    This product includes software developed by Boris Popov.
169c9af259SGordon Ross  * 4. Neither the name of the author nor the names of any co-contributors
179c9af259SGordon Ross  *    may be used to endorse or promote products derived from this software
189c9af259SGordon Ross  *    without specific prior written permission.
199c9af259SGordon Ross  *
209c9af259SGordon Ross  * THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND
219c9af259SGordon Ross  * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
229c9af259SGordon Ross  * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
239c9af259SGordon Ross  * ARE DISCLAIMED.  IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE
249c9af259SGordon Ross  * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
259c9af259SGordon Ross  * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
269c9af259SGordon Ross  * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
279c9af259SGordon Ross  * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
289c9af259SGordon Ross  * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
299c9af259SGordon Ross  * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
309c9af259SGordon Ross  * SUCH DAMAGE.
319c9af259SGordon Ross  */
329c9af259SGordon Ross 
339c9af259SGordon Ross /*
34*613a2f6bSGordon Ross  * Copyright 2009 Sun Microsystems, Inc.  All rights reserved.
359c9af259SGordon Ross  * Use is subject to license terms.
369c9af259SGordon Ross  */
379c9af259SGordon Ross 
389c9af259SGordon Ross #ifndef _PRIVATE_H
399c9af259SGordon Ross #define	_PRIVATE_H
409c9af259SGordon Ross 
419c9af259SGordon Ross /*
429c9af259SGordon Ross  * Private declarations for this library.
439c9af259SGordon Ross  * Moved from smb_lib.h
449c9af259SGordon Ross  */
459c9af259SGordon Ross 
469c9af259SGordon Ross #include <inttypes.h>
47*613a2f6bSGordon Ross #include <sys/byteorder.h>
48*613a2f6bSGordon Ross #include <sys/ccompile.h>
49*613a2f6bSGordon Ross 
50*613a2f6bSGordon Ross #include <netsmb/netbios.h>
51*613a2f6bSGordon Ross 
52*613a2f6bSGordon Ross extern void dprint(const char *, const char *, ...)
53*613a2f6bSGordon Ross 	__PRINTFLIKE(2);
54*613a2f6bSGordon Ross 
55*613a2f6bSGordon Ross #if defined(DEBUG) || defined(__lint)
56*613a2f6bSGordon Ross #define	DPRINT(...) dprint(__func__, __VA_ARGS__)
57*613a2f6bSGordon Ross #else
58*613a2f6bSGordon Ross #define	DPRINT(...) ((void)0)
59*613a2f6bSGordon Ross #endif
60*613a2f6bSGordon Ross 
61*613a2f6bSGordon Ross /*
62*613a2f6bSGordon Ross  * Flags bits in ct_vcflags (copied from smb_conn.h)
63*613a2f6bSGordon Ross  * Pass these to the driver?
64*613a2f6bSGordon Ross  */
65*613a2f6bSGordon Ross #define	SMBV_RECONNECTING	0x0002	/* conn in process of reconnection */
66*613a2f6bSGordon Ross #define	SMBV_LONGNAMES		0x0004	/* conn configured to use long names */
67*613a2f6bSGordon Ross #define	SMBV_ENCRYPT		0x0008	/* server demands encrypted password */
68*613a2f6bSGordon Ross #define	SMBV_WIN95		0x0010	/* used to apply bugfixes for this OS */
69*613a2f6bSGordon Ross #define	SMBV_NT4		0x0020	/* used when NT4 issues invalid resp */
70*613a2f6bSGordon Ross #define	SMBV_UNICODE		0x0040	/* conn configured to use Unicode */
71*613a2f6bSGordon Ross #define	SMBV_EXT_SEC		0x0080	/* conn to use extended security */
72*613a2f6bSGordon Ross #define	SMBV_WILL_SIGN		0x0100	/* negotiated signing */
73*613a2f6bSGordon Ross 
749c9af259SGordon Ross 
759c9af259SGordon Ross /*
769c9af259SGordon Ross  * BSD-style mbuf simulation
779c9af259SGordon Ross  */
789c9af259SGordon Ross struct mbuf {
799c9af259SGordon Ross 	int		m_len;
809c9af259SGordon Ross 	int		m_maxlen;
819c9af259SGordon Ross 	char		*m_data;
829c9af259SGordon Ross 	struct mbuf	*m_next;
839c9af259SGordon Ross };
849c9af259SGordon Ross typedef struct mbuf mbuf_t;
859c9af259SGordon Ross 
869c9af259SGordon Ross struct mbdata {
879c9af259SGordon Ross 	struct mbuf	*mb_top;
889c9af259SGordon Ross 	struct mbuf	*mb_cur;
899c9af259SGordon Ross 	char		*mb_pos;
909c9af259SGordon Ross 	int		mb_count;
919c9af259SGordon Ross };
929c9af259SGordon Ross typedef struct mbdata mbdata_t;
939c9af259SGordon Ross 
94*613a2f6bSGordon Ross /*
95*613a2f6bSGordon Ross  * Note: Leaving a little space (8 bytes) between the
96*613a2f6bSGordon Ross  * mbuf header and the start of the data so we can
97*613a2f6bSGordon Ross  * prepend a NetBIOS header in that space.
98*613a2f6bSGordon Ross  */
999c9af259SGordon Ross #define	M_ALIGNFACTOR	(sizeof (long))
1009c9af259SGordon Ross #define	M_ALIGN(len)	(((len) + M_ALIGNFACTOR - 1) & ~(M_ALIGNFACTOR - 1))
101*613a2f6bSGordon Ross #define	M_BASESIZE	(sizeof (struct mbuf) + 8)
102*613a2f6bSGordon Ross #define	M_MINSIZE	(1024 - M_BASESIZE)
1039c9af259SGordon Ross #define	M_TOP(m)	((char *)(m) + M_BASESIZE)
1049c9af259SGordon Ross #define	M_TRAILINGSPACE(m) ((m)->m_maxlen - (m)->m_len)
1059c9af259SGordon Ross #define	mtod(m, t)	((t)(m)->m_data)
1069c9af259SGordon Ross 
1079c9af259SGordon Ross /*
1089c9af259SGordon Ross  * request handling structures
1099c9af259SGordon Ross  */
1109c9af259SGordon Ross struct smb_rq {
111*613a2f6bSGordon Ross 	struct smb_ctx *rq_ctx;
1129c9af259SGordon Ross 	struct mbdata	rq_rq;
1139c9af259SGordon Ross 	struct mbdata	rq_rp;
114*613a2f6bSGordon Ross 	int		rq_rpbufsz;
115*613a2f6bSGordon Ross 	uint8_t		rq_cmd;
116*613a2f6bSGordon Ross 	uint8_t		rq_hflags;
117*613a2f6bSGordon Ross 	uint16_t	rq_hflags2;
118*613a2f6bSGordon Ross 	uint32_t	rq_status;
119*613a2f6bSGordon Ross 	uint16_t	rq_uid;
120*613a2f6bSGordon Ross 	uint16_t	rq_tid;
121*613a2f6bSGordon Ross 	uint16_t	rq_mid;
122*613a2f6bSGordon Ross 	uint32_t	rq_seqno;
123*613a2f6bSGordon Ross 	/* See rq_[bw]{start,end} functions */
124*613a2f6bSGordon Ross 	char		*rq_wcntp;
125*613a2f6bSGordon Ross 	int		rq_wcbase;
126*613a2f6bSGordon Ross 	char		*rq_bcntp;
127*613a2f6bSGordon Ross 	int		rq_bcbase;
1289c9af259SGordon Ross };
1299c9af259SGordon Ross typedef struct smb_rq smb_rq_t;
1309c9af259SGordon Ross 
1319c9af259SGordon Ross #define	smb_rq_getrequest(rqp)	(&(rqp)->rq_rq)
1329c9af259SGordon Ross #define	smb_rq_getreply(rqp)	(&(rqp)->rq_rp)
1339c9af259SGordon Ross 
134*613a2f6bSGordon Ross int  smb_rq_init(struct smb_ctx *, uchar_t, struct smb_rq **);
1359c9af259SGordon Ross void smb_rq_done(struct smb_rq *);
136*613a2f6bSGordon Ross void smb_rq_bstart(struct smb_rq *);
137*613a2f6bSGordon Ross void smb_rq_bend(struct smb_rq *);
138*613a2f6bSGordon Ross void smb_rq_wstart(struct smb_rq *);
1399c9af259SGordon Ross void smb_rq_wend(struct smb_rq *);
1409c9af259SGordon Ross int  smb_rq_simple(struct smb_rq *);
1419c9af259SGordon Ross int  smb_rq_dmem(struct mbdata *, const char *, size_t);
142*613a2f6bSGordon Ross int  smb_rq_internal(struct smb_ctx *, struct smb_rq *);
143*613a2f6bSGordon Ross int  smb_rq_sign(struct smb_rq *);
144*613a2f6bSGordon Ross int  smb_rq_verify(struct smb_rq *);
1459c9af259SGordon Ross 
1469c9af259SGordon Ross 
1479c9af259SGordon Ross /*
1489c9af259SGordon Ross  * Message compose/parse
1499c9af259SGordon Ross  */
1509c9af259SGordon Ross 
151*613a2f6bSGordon Ross void m_freem(struct mbuf *);
1529c9af259SGordon Ross int  m_getm(struct mbuf *, size_t, struct mbuf **);
1539c9af259SGordon Ross int  m_lineup(struct mbuf *, struct mbuf **);
154*613a2f6bSGordon Ross size_t m_totlen(struct mbuf *);
155*613a2f6bSGordon Ross 
1569c9af259SGordon Ross int  mb_init(struct mbdata *, size_t);
1579c9af259SGordon Ross int  mb_initm(struct mbdata *, struct mbuf *);
1589c9af259SGordon Ross int  mb_done(struct mbdata *);
1599c9af259SGordon Ross int  mb_fit(struct mbdata *mbp, size_t size, char **pp);
1609c9af259SGordon Ross int  mb_put_uint8(struct mbdata *, uint8_t);
1619c9af259SGordon Ross int  mb_put_uint16be(struct mbdata *, uint16_t);
1629c9af259SGordon Ross int  mb_put_uint16le(struct mbdata *, uint16_t);
1639c9af259SGordon Ross int  mb_put_uint32be(struct mbdata *, uint32_t);
1649c9af259SGordon Ross int  mb_put_uint32le(struct mbdata *, uint32_t);
1659c9af259SGordon Ross int  mb_put_uint64be(struct mbdata *, uint64_t);
1669c9af259SGordon Ross int  mb_put_uint64le(struct mbdata *, uint64_t);
167*613a2f6bSGordon Ross int  mb_put_mem(struct mbdata *, const void *, size_t);
1689c9af259SGordon Ross int  mb_put_mbuf(struct mbdata *, struct mbuf *);
169*613a2f6bSGordon Ross int  mb_put_astring(struct mbdata *mbp, const char *s);
170*613a2f6bSGordon Ross int  mb_put_dstring(struct mbdata *mbp, const char *s, int);
171*613a2f6bSGordon Ross int  mb_put_ustring(struct mbdata *mbp, const char *s);
1729c9af259SGordon Ross 
1739c9af259SGordon Ross int  mb_get_uint8(struct mbdata *, uint8_t *);
1749c9af259SGordon Ross int  mb_get_uint16(struct mbdata *, uint16_t *);
1759c9af259SGordon Ross int  mb_get_uint16le(struct mbdata *, uint16_t *);
1769c9af259SGordon Ross int  mb_get_uint16be(struct mbdata *, uint16_t *);
1779c9af259SGordon Ross int  mb_get_uint32(struct mbdata *, uint32_t *);
1789c9af259SGordon Ross int  mb_get_uint32be(struct mbdata *, uint32_t *);
1799c9af259SGordon Ross int  mb_get_uint32le(struct mbdata *, uint32_t *);
1809c9af259SGordon Ross int  mb_get_uint64(struct mbdata *, uint64_t *);
1819c9af259SGordon Ross int  mb_get_uint64be(struct mbdata *, uint64_t *);
1829c9af259SGordon Ross int  mb_get_uint64le(struct mbdata *, uint64_t *);
183*613a2f6bSGordon Ross int  mb_get_mem(struct mbdata *, void *, size_t);
184*613a2f6bSGordon Ross int  mb_get_mbuf(struct mbdata *, int, struct mbuf **);
185*613a2f6bSGordon Ross int  mb_get_string(struct mbdata *, char **, int);
186*613a2f6bSGordon Ross int  mb_get_astring(struct mbdata *, char **);
187*613a2f6bSGordon Ross int  mb_get_ustring(struct mbdata *, char **);
188*613a2f6bSGordon Ross 
1899c9af259SGordon Ross 
1909c9af259SGordon Ross /*
1919c9af259SGordon Ross  * Network stuff (NetBIOS and otherwise)
1929c9af259SGordon Ross  */
193*613a2f6bSGordon Ross struct nb_name;
194*613a2f6bSGordon Ross struct sockaddr_nb;
195*613a2f6bSGordon Ross 
196*613a2f6bSGordon Ross extern int smb_recv_timeout; /* seconds */
197*613a2f6bSGordon Ross 
198*613a2f6bSGordon Ross void dump_ctx(char *, struct smb_ctx *);
199*613a2f6bSGordon Ross void dump_addrinfo(struct addrinfo *);
200*613a2f6bSGordon Ross void dump_sockaddr(struct sockaddr *);
201*613a2f6bSGordon Ross int nb_ssn_request(struct smb_ctx *, char *);
2029c9af259SGordon Ross 
2039c9af259SGordon Ross int nb_name_len(struct nb_name *);
204*613a2f6bSGordon Ross int nb_name_encode(struct mbdata *, struct nb_name *);
2059c9af259SGordon Ross int nb_encname_len(const uchar_t *);
2069c9af259SGordon Ross 
207*613a2f6bSGordon Ross int  nb_snballoc(struct sockaddr_nb **);
2089c9af259SGordon Ross void nb_snbfree(struct sockaddr *);
2099c9af259SGordon Ross int  nb_sockaddr(struct sockaddr *, struct nb_name *, struct sockaddr_nb **);
2109c9af259SGordon Ross 
211*613a2f6bSGordon Ross int nbns_getaddrinfo(const char *name, struct nb_ctx *nbc,
212*613a2f6bSGordon Ross 	struct addrinfo **res);
2139c9af259SGordon Ross int  nbns_resolvename(const char *, struct nb_ctx *, struct sockaddr **);
214*613a2f6bSGordon Ross int  get_xti_err(int);
2159c9af259SGordon Ross 
216*613a2f6bSGordon Ross 
217*613a2f6bSGordon Ross /*
218*613a2f6bSGordon Ross  * Private SMB stuff
219*613a2f6bSGordon Ross  */
220*613a2f6bSGordon Ross 
221*613a2f6bSGordon Ross struct smb_bitname {
222*613a2f6bSGordon Ross 	uint_t	bn_bit;
223*613a2f6bSGordon Ross 	char	*bn_name;
224*613a2f6bSGordon Ross };
225*613a2f6bSGordon Ross typedef struct smb_bitname smb_bitname_t;
226*613a2f6bSGordon Ross char *smb_printb(char *, int, const struct smb_bitname *);
227*613a2f6bSGordon Ross 
228*613a2f6bSGordon Ross int smb_ctx_getaddr(struct smb_ctx *ctx);
229*613a2f6bSGordon Ross int smb_ctx_gethandle(struct smb_ctx *ctx);
230*613a2f6bSGordon Ross 
231*613a2f6bSGordon Ross int smb_ssn_send(struct smb_ctx *, struct mbdata *);
232*613a2f6bSGordon Ross int smb_ssn_recv(struct smb_ctx *, struct mbdata *);
233*613a2f6bSGordon Ross 
234*613a2f6bSGordon Ross int smb_negprot(struct smb_ctx *, struct mbdata *);
235*613a2f6bSGordon Ross 
236*613a2f6bSGordon Ross int smb_ssnsetup_null(struct smb_ctx *);
237*613a2f6bSGordon Ross int smb_ssnsetup_ntlm1(struct smb_ctx *);
238*613a2f6bSGordon Ross int smb_ssnsetup_ntlm2(struct smb_ctx *);
239*613a2f6bSGordon Ross int smb_ssnsetup_spnego(struct smb_ctx *, struct mbdata *);
240*613a2f6bSGordon Ross 
241*613a2f6bSGordon Ross void smb_time_local2server(struct timeval *, int, long *);
242*613a2f6bSGordon Ross void smb_time_server2local(ulong_t, int, struct timeval *);
243*613a2f6bSGordon Ross void smb_time_NT2local(uint64_t, int, struct timeval *);
244*613a2f6bSGordon Ross void smb_time_local2NT(struct timeval *, int, uint64_t *);
245*613a2f6bSGordon Ross 
246*613a2f6bSGordon Ross int smb_getlocalname(char **);
247*613a2f6bSGordon Ross int smb_get_authentication(struct smb_ctx *);
248*613a2f6bSGordon Ross int smb_get_keychain(struct smb_ctx *ctx);
249*613a2f6bSGordon Ross void smb_hexdump(const void *buf, int len);
250*613a2f6bSGordon Ross 
251*613a2f6bSGordon Ross /* See ssp.c */
252*613a2f6bSGordon Ross int ssp_ctx_create_client(struct smb_ctx *, struct mbdata *);
253*613a2f6bSGordon Ross int ssp_ctx_next_token(struct smb_ctx *, struct mbdata *, struct mbdata *);
254*613a2f6bSGordon Ross void ssp_ctx_destroy(struct smb_ctx *);
255*613a2f6bSGordon Ross 
256*613a2f6bSGordon Ross #ifdef KICONV_SUPPORT
257*613a2f6bSGordon Ross /* See nls.c (get rid of this?) */
2589c9af259SGordon Ross extern uchar_t nls_lower[256], nls_upper[256];
259*613a2f6bSGordon Ross #endif	/* KICONV_SUPPORT */
2609c9af259SGordon Ross 
2619c9af259SGordon Ross #endif /* _PRIVATE_H */
262