1998-03-12 00:11:04 +03:00
/*
* Unix SMB / Netbios implementation .
* Version 1.9 .
* RPC Pipe client / server routines
* Copyright ( C ) Andrew Tridgell 1992 - 1997 ,
* Copyright ( C ) Luke Kenneth Casson Leighton 1996 - 1997 ,
* Copyright ( C ) Paul Ashton 1997.
*
* This program is free software ; you can redistribute it and / or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation ; either version 2 of the License , or
* ( at your option ) any later version .
*
* This program is distributed in the hope that it will be useful ,
* but WITHOUT ANY WARRANTY ; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE . See the
* GNU General Public License for more details .
*
* You should have received a copy of the GNU General Public License
* along with this program ; if not , write to the Free Software
* Foundation , Inc . , 675 Mass Ave , Cambridge , MA 0213 9 , USA .
*/
# include "includes.h"
extern int DEBUGLEVEL ;
/*******************************************************************
interface / version dce / rpc pipe identification
* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
# define TRANS_SYNT_V2 \
{ \
{ \
0x04 , 0x5d , 0x88 , 0x8a , \
0xeb , 0x1c , 0xc9 , 0x11 , \
0x9f , 0xe8 , 0x08 , 0x00 , \
0x2b , 0x10 , 0x48 , 0x60 \
} , 0x02 \
} \
# define SYNT_NETLOGON_V2 \
{ \
{ \
0x04 , 0x5d , 0x88 , 0x8a , \
0xeb , 0x1c , 0xc9 , 0x11 , \
0x9f , 0xe8 , 0x08 , 0x00 , \
0x2b , 0x10 , 0x48 , 0x60 \
} , 0x02 \
} \
# define SYNT_WKSSVC_V1 \
{ \
{ \
0x98 , 0xd0 , 0xff , 0x6b , \
0x12 , 0xa1 , 0x10 , 0x36 , \
0x98 , 0x33 , 0x46 , 0xc3 , \
0xf8 , 0x7e , 0x34 , 0x5a \
} , 0x01 \
} \
# define SYNT_SRVSVC_V3 \
{ \
{ \
0xc8 , 0x4f , 0x32 , 0x4b , \
0x70 , 0x16 , 0xd3 , 0x01 , \
0x12 , 0x78 , 0x5a , 0x47 , \
0xbf , 0x6e , 0xe1 , 0x88 \
} , 0x03 \
} \
# define SYNT_LSARPC_V0 \
{ \
{ \
0x78 , 0x57 , 0x34 , 0x12 , \
0x34 , 0x12 , 0xcd , 0xab , \
0xef , 0x00 , 0x01 , 0x23 , \
0x45 , 0x67 , 0x89 , 0xab \
} , 0x00 \
} \
# define SYNT_SAMR_V1 \
{ \
{ \
0x78 , 0x57 , 0x34 , 0x12 , \
0x34 , 0x12 , 0xcd , 0xab , \
0xef , 0x00 , 0x01 , 0x23 , \
0x45 , 0x67 , 0x89 , 0xac \
} , 0x01 \
} \
# define SYNT_NETLOGON_V1 \
{ \
{ \
0x78 , 0x56 , 0x34 , 0x12 , \
0x34 , 0x12 , 0xcd , 0xab , \
0xef , 0x00 , 0x01 , 0x23 , \
0x45 , 0x67 , 0xcf , 0xfb \
} , 0x01 \
} \
# define SYNT_WINREG_V1 \
{ \
{ \
0x01 , 0xd0 , 0x8c , 0x33 , \
0x44 , 0x22 , 0xf1 , 0x31 , \
0xaa , 0xaa , 0x90 , 0x00 , \
0x38 , 0x00 , 0x10 , 0x03 \
} , 0x01 \
} \
# define SYNT_NONE_V0 \
{ \
{ \
0x00 , 0x00 , 0x00 , 0x00 , \
0x00 , 0x00 , 0x00 , 0x00 , \
0x00 , 0x00 , 0x00 , 0x00 , \
0x00 , 0x00 , 0x00 , 0x00 \
} , 0x00 \
} \
/* pipe string names */
# define PIPE_SRVSVC "\\PIPE\\srvsvc"
# define PIPE_SAMR "\\PIPE\\samr"
# define PIPE_WINREG "\\PIPE\\winreg"
# define PIPE_WKSSVC "\\PIPE\\wkssvc"
# define PIPE_NETLOGON "\\PIPE\\NETLOGON"
# define PIPE_NTLSA "\\PIPE\\ntlsa"
# define PIPE_NTSVCS "\\PIPE\\ntsvcs"
# define PIPE_LSASS "\\PIPE\\lsass"
# define PIPE_LSARPC "\\PIPE\\lsarpc"
struct pipe_id_info pipe_names [ ] =
{
/* client pipe , abstract syntax , server pipe , transfer syntax */
{ PIPE_LSARPC , SYNT_LSARPC_V0 , PIPE_LSASS , TRANS_SYNT_V2 } ,
{ PIPE_SAMR , SYNT_SAMR_V1 , PIPE_LSASS , TRANS_SYNT_V2 } ,
{ PIPE_NETLOGON , SYNT_NETLOGON_V1 , PIPE_LSASS , TRANS_SYNT_V2 } ,
{ PIPE_SRVSVC , SYNT_SRVSVC_V3 , PIPE_NTSVCS , TRANS_SYNT_V2 } ,
{ PIPE_WKSSVC , SYNT_WKSSVC_V1 , PIPE_NTSVCS , TRANS_SYNT_V2 } ,
{ PIPE_WINREG , SYNT_WINREG_V1 , PIPE_WINREG , TRANS_SYNT_V2 } ,
{ NULL , SYNT_NONE_V0 , NULL , SYNT_NONE_V0 }
} ;
/*******************************************************************
creates an RPC_HDR structure .
* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
void make_rpc_hdr ( RPC_HDR * hdr , enum RPC_PKT_TYPE pkt_type , uint8 flags ,
uint32 call_id , int data_len , int auth_len )
{
if ( hdr = = NULL ) return ;
hdr - > major = 5 ; /* RPC version 5 */
hdr - > minor = 0 ; /* minor version 0 */
hdr - > pkt_type = pkt_type ; /* RPC packet type */
hdr - > flags = flags ; /* dce/rpc flags */
hdr - > pack_type = 0x10 ; /* packed data representation */
hdr - > frag_len = data_len ; /* fragment length, fill in later */
hdr - > auth_len = auth_len ; /* authentication length */
hdr - > call_id = call_id ; /* call identifier - match incoming RPC */
}
/*******************************************************************
reads or writes an RPC_HDR structure .
* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
void smb_io_rpc_hdr ( char * desc , RPC_HDR * rpc , prs_struct * ps , int depth )
{
if ( rpc = = NULL ) return ;
prs_debug ( ps , depth , desc , " smb_io_rpc_hdr " ) ;
depth + + ;
prs_uint8 ( " major " , ps , depth , & ( rpc - > major ) ) ;
prs_uint8 ( " minor " , ps , depth , & ( rpc - > minor ) ) ;
prs_uint8 ( " pkt_type " , ps , depth , & ( rpc - > pkt_type ) ) ;
prs_uint8 ( " flags " , ps , depth , & ( rpc - > flags ) ) ;
prs_uint32 ( " pack_type " , ps , depth , & ( rpc - > pack_type ) ) ;
prs_uint16 ( " frag_len " , ps , depth , & ( rpc - > frag_len ) ) ;
prs_uint16 ( " auth_len " , ps , depth , & ( rpc - > auth_len ) ) ;
prs_uint32 ( " call_id " , ps , depth , & ( rpc - > call_id ) ) ;
}
/*******************************************************************
reads or writes an RPC_IFACE structure .
* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
1998-09-05 09:07:05 +04:00
static void smb_io_rpc_iface ( char * desc , RPC_IFACE * ifc , prs_struct * ps , int depth )
1998-03-12 00:11:04 +03:00
{
if ( ifc = = NULL ) return ;
prs_debug ( ps , depth , desc , " smb_io_rpc_iface " ) ;
depth + + ;
prs_align ( ps ) ;
prs_uint8s ( False , " data " , ps , depth , ifc - > data , sizeof ( ifc - > data ) ) ;
prs_uint32 ( " version " , ps , depth , & ( ifc - > version ) ) ;
}
/*******************************************************************
creates an RPC_ADDR_STR structure .
* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
1998-09-05 09:07:05 +04:00
static void make_rpc_addr_str ( RPC_ADDR_STR * str , char * name )
1998-03-12 00:11:04 +03:00
{
if ( str = = NULL | | name = = NULL ) return ;
str - > len = strlen ( name ) + 1 ;
fstrcpy ( str - > str , name ) ;
}
/*******************************************************************
reads or writes an RPC_ADDR_STR structure .
* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
1998-09-05 09:07:05 +04:00
static void smb_io_rpc_addr_str ( char * desc , RPC_ADDR_STR * str , prs_struct * ps , int depth )
1998-03-12 00:11:04 +03:00
{
if ( str = = NULL ) return ;
prs_debug ( ps , depth , desc , " smb_io_rpc_addr_str " ) ;
depth + + ;
prs_align ( ps ) ;
prs_uint16 ( " len " , ps , depth , & ( str - > len ) ) ;
prs_uint8s ( True , " str " , ps , depth , ( uchar * ) str - > str , str - > len ) ;
}
/*******************************************************************
creates an RPC_HDR_BBA structure .
* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
1998-09-05 09:07:05 +04:00
static void make_rpc_hdr_bba ( RPC_HDR_BBA * bba , uint16 max_tsize , uint16 max_rsize , uint32 assoc_gid )
1998-03-12 00:11:04 +03:00
{
if ( bba = = NULL ) return ;
bba - > max_tsize = max_tsize ; /* maximum transmission fragment size (0x1630) */
bba - > max_rsize = max_rsize ; /* max receive fragment size (0x1630) */
bba - > assoc_gid = assoc_gid ; /* associated group id (0x0) */
}
/*******************************************************************
reads or writes an RPC_HDR_BBA structure .
* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
1998-09-05 09:07:05 +04:00
static void smb_io_rpc_hdr_bba ( char * desc , RPC_HDR_BBA * rpc , prs_struct * ps , int depth )
1998-03-12 00:11:04 +03:00
{
if ( rpc = = NULL ) return ;
prs_debug ( ps , depth , desc , " smb_io_rpc_hdr_bba " ) ;
depth + + ;
prs_uint16 ( " max_tsize " , ps , depth , & ( rpc - > max_tsize ) ) ;
prs_uint16 ( " max_rsize " , ps , depth , & ( rpc - > max_rsize ) ) ;
prs_uint32 ( " assoc_gid " , ps , depth , & ( rpc - > assoc_gid ) ) ;
}
/*******************************************************************
creates an RPC_HDR_RB structure .
* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
void make_rpc_hdr_rb ( RPC_HDR_RB * rpc ,
uint16 max_tsize , uint16 max_rsize , uint32 assoc_gid ,
uint32 num_elements , uint16 context_id , uint8 num_syntaxes ,
RPC_IFACE * abstract , RPC_IFACE * transfer )
{
if ( rpc = = NULL ) return ;
make_rpc_hdr_bba ( & ( rpc - > bba ) , max_tsize , max_rsize , assoc_gid ) ;
rpc - > num_elements = num_elements ; /* the number of elements (0x1) */
rpc - > context_id = context_id ; /* presentation context identifier (0x0) */
rpc - > num_syntaxes = num_syntaxes ; /* the number of syntaxes (has always been 1?)(0x1) */
/* num and vers. of interface client is using */
memcpy ( & ( rpc - > abstract ) , abstract , sizeof ( rpc - > abstract ) ) ;
/* num and vers. of interface to use for replies */
memcpy ( & ( rpc - > transfer ) , transfer , sizeof ( rpc - > transfer ) ) ;
}
/*******************************************************************
reads or writes an RPC_HDR_RB structure .
* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
void smb_io_rpc_hdr_rb ( char * desc , RPC_HDR_RB * rpc , prs_struct * ps , int depth )
{
if ( rpc = = NULL ) return ;
prs_debug ( ps , depth , desc , " smb_io_rpc_hdr_rb " ) ;
depth + + ;
smb_io_rpc_hdr_bba ( " " , & ( rpc - > bba ) , ps , depth ) ;
prs_uint32 ( " num_elements " , ps , depth , & ( rpc - > num_elements ) ) ;
prs_uint16 ( " context_id " , ps , depth , & ( rpc - > context_id ) ) ;
prs_uint8 ( " num_syntaxes " , ps , depth , & ( rpc - > num_syntaxes ) ) ;
smb_io_rpc_iface ( " " , & ( rpc - > abstract ) , ps , depth ) ;
smb_io_rpc_iface ( " " , & ( rpc - > transfer ) , ps , depth ) ;
}
/*******************************************************************
creates an RPC_RESULTS structure .
lkclXXXX only one reason at the moment !
* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
1998-09-05 09:07:05 +04:00
static void make_rpc_results ( RPC_RESULTS * res ,
1998-03-12 00:11:04 +03:00
uint8 num_results , uint16 result , uint16 reason )
{
if ( res = = NULL ) return ;
res - > num_results = num_results ; /* the number of results (0x01) */
res - > result = result ; /* result (0x00 = accept) */
res - > reason = reason ; /* reason (0x00 = no reason specified) */
}
/*******************************************************************
reads or writes an RPC_RESULTS structure .
lkclXXXX only one reason at the moment !
* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
1998-09-05 09:07:05 +04:00
static void smb_io_rpc_results ( char * desc , RPC_RESULTS * res , prs_struct * ps , int depth )
1998-03-12 00:11:04 +03:00
{
if ( res = = NULL ) return ;
prs_debug ( ps , depth , desc , " smb_io_rpc_results " ) ;
depth + + ;
prs_align ( ps ) ;
prs_uint8 ( " num_results " , ps , depth , & ( res - > num_results ) ) ;
prs_align ( ps ) ;
prs_uint16 ( " result " , ps , depth , & ( res - > result ) ) ;
prs_uint16 ( " reason " , ps , depth , & ( res - > reason ) ) ;
}
/*******************************************************************
creates an RPC_HDR_BA structure .
lkclXXXX only one reason at the moment !
* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
void make_rpc_hdr_ba ( RPC_HDR_BA * rpc ,
uint16 max_tsize , uint16 max_rsize , uint32 assoc_gid ,
char * pipe_addr ,
uint8 num_results , uint16 result , uint16 reason ,
RPC_IFACE * transfer )
{
if ( rpc = = NULL | | transfer = = NULL | | pipe_addr = = NULL ) return ;
make_rpc_hdr_bba ( & ( rpc - > bba ) , max_tsize , max_rsize , assoc_gid ) ;
make_rpc_addr_str ( & ( rpc - > addr ) , pipe_addr ) ;
make_rpc_results ( & ( rpc - > res ) , num_results , result , reason ) ;
/* the transfer syntax from the request */
memcpy ( & ( rpc - > transfer ) , transfer , sizeof ( rpc - > transfer ) ) ;
}
/*******************************************************************
reads or writes an RPC_HDR_BA structure .
* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
void smb_io_rpc_hdr_ba ( char * desc , RPC_HDR_BA * rpc , prs_struct * ps , int depth )
{
if ( rpc = = NULL ) return ;
prs_debug ( ps , depth , desc , " smb_io_rpc_hdr_ba " ) ;
depth + + ;
smb_io_rpc_hdr_bba ( " " , & ( rpc - > bba ) , ps , depth ) ;
smb_io_rpc_addr_str ( " " , & ( rpc - > addr ) , ps , depth ) ;
smb_io_rpc_results ( " " , & ( rpc - > res ) , ps , depth ) ;
smb_io_rpc_iface ( " " , & ( rpc - > transfer ) , ps , depth ) ;
}
/*******************************************************************
1998-04-10 22:21:16 +04:00
creates an RPC_HDR_REQ structure .
1998-03-12 00:11:04 +03:00
* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
1998-04-10 22:21:16 +04:00
void make_rpc_hdr_req ( RPC_HDR_REQ * hdr , uint32 data_len , uint16 opnum )
1998-03-12 00:11:04 +03:00
{
if ( hdr = = NULL ) return ;
hdr - > alloc_hint = data_len - 0x18 ; /* allocation hint */
hdr - > context_id = 0 ; /* presentation context identifier */
hdr - > opnum = opnum ; /* opnum */
1998-04-10 22:21:16 +04:00
}
/*******************************************************************
reads or writes an RPC_HDR_REQ structure .
* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
void smb_io_rpc_hdr_req ( char * desc , RPC_HDR_REQ * rpc , prs_struct * ps , int depth )
{
if ( rpc = = NULL ) return ;
prs_debug ( ps , depth , desc , " smb_io_rpc_hdr_req " ) ;
depth + + ;
prs_uint32 ( " alloc_hint " , ps , depth , & ( rpc - > alloc_hint ) ) ;
prs_uint16 ( " context_id " , ps , depth , & ( rpc - > context_id ) ) ;
prs_uint16 ( " opnum " , ps , depth , & ( rpc - > opnum ) ) ;
}
1998-03-12 00:11:04 +03:00
/*******************************************************************
1998-04-10 22:21:16 +04:00
reads or writes an RPC_HDR_RESP structure .
1998-03-12 00:11:04 +03:00
* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
1998-04-10 22:21:16 +04:00
void smb_io_rpc_hdr_resp ( char * desc , RPC_HDR_RESP * rpc , prs_struct * ps , int depth )
1998-03-12 00:11:04 +03:00
{
if ( rpc = = NULL ) return ;
1998-04-10 22:21:16 +04:00
prs_debug ( ps , depth , desc , " smb_io_rpc_hdr_resp " ) ;
1998-03-12 00:11:04 +03:00
depth + + ;
prs_uint32 ( " alloc_hint " , ps , depth , & ( rpc - > alloc_hint ) ) ;
1998-04-10 22:21:16 +04:00
prs_uint16 ( " context_id " , ps , depth , & ( rpc - > context_id ) ) ;
1998-03-12 00:11:04 +03:00
prs_uint8 ( " cancel_ct " , ps , depth , & ( rpc - > cancel_count ) ) ;
prs_uint8 ( " reserved " , ps , depth , & ( rpc - > reserved ) ) ;
}
/*******************************************************************
1998-10-07 02:03:04 +04:00
creates an RPC_AUTH_NTLMSSP_NEG structure .
1998-03-12 00:11:04 +03:00
* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
1998-10-07 02:03:04 +04:00
void make_rpc_auth_ntlmssp_neg ( RPC_AUTH_NTLMSSP_NEG * neg ,
uint32 neg_flgs ,
fstring myname , fstring domain )
1998-03-12 00:11:04 +03:00
{
int len_myname = strlen ( myname ) ;
int len_domain = strlen ( domain ) ;
1998-10-07 02:03:04 +04:00
if ( neg = = NULL ) return ;
1998-03-12 00:11:04 +03:00
1998-10-07 02:03:04 +04:00
neg - > neg_flgs = neg_flgs ; /* 0x00b2b3 */
1998-03-12 00:11:04 +03:00
1998-10-07 02:03:04 +04:00
make_str_hdr ( & neg - > hdr_myname , len_myname , len_myname , 1 ) ;
make_str_hdr ( & neg - > hdr_domain , len_domain , len_domain , 1 ) ;
1998-03-12 00:11:04 +03:00
1998-10-07 02:03:04 +04:00
fstrcpy ( neg - > myname , myname ) ;
fstrcpy ( neg - > domain , domain ) ;
1998-03-12 00:11:04 +03:00
}
/*******************************************************************
1998-10-07 02:03:04 +04:00
reads or writes an RPC_AUTH_NTLMSSP_NEG structure .
1998-03-12 00:11:04 +03:00
* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
1998-10-07 02:03:04 +04:00
void smb_io_rpc_auth_ntlmssp_neg ( char * desc , RPC_AUTH_NTLMSSP_NEG * neg , prs_struct * ps , int depth )
1998-03-12 00:11:04 +03:00
{
1998-10-07 02:03:04 +04:00
if ( neg = = NULL ) return ;
1998-03-12 00:11:04 +03:00
1998-10-07 02:03:04 +04:00
prs_debug ( ps , depth , desc , " smb_io_rpc_auth_ntlmssp_neg " ) ;
1998-03-12 00:11:04 +03:00
depth + + ;
1998-10-07 02:03:04 +04:00
prs_uint32 ( " neg_flgs " , ps , depth , & ( neg - > neg_flgs ) ) ;
1998-03-12 00:11:04 +03:00
1998-10-07 02:03:04 +04:00
smb_io_strhdr ( " hdr_myname " , & ( neg - > hdr_myname ) , ps , depth ) ;
smb_io_strhdr ( " hdr_domain " , & ( neg - > hdr_domain ) , ps , depth ) ;
1998-03-12 00:11:04 +03:00
1998-10-07 02:03:04 +04:00
prs_string ( " myname " , ps , depth , neg - > myname , neg - > hdr_myname . str_str_len , sizeof ( neg - > myname ) ) ;
prs_string ( " domain " , ps , depth , neg - > domain , neg - > hdr_domain . str_str_len , sizeof ( neg - > domain ) ) ;
}
/*******************************************************************
creates an RPC_AUTH_VERIFIER structure .
* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
void make_rpc_auth_verifier ( RPC_AUTH_VERIFIER * rav ,
uint8 auth_type , uint8 auth_level ,
uint8 stub_type_len ,
char * signature , uint32 msg_type )
{
if ( rav = = NULL ) return ;
rav - > auth_type = auth_type ; /* nt lm ssp 0x0a */
rav - > auth_level = auth_level ; /* 0x06 */
rav - > stub_type_len = stub_type_len ; /* 0x00 */
rav - > padding = 0 ; /* padding 0x00 */
1998-10-07 19:22:49 +04:00
rav - > ptr_0 = 0x0014a0c0 ; /* non-zero pointer to something */
1998-10-07 02:03:04 +04:00
fstrcpy ( rav - > signature , signature ) ; /* "NTLMSSP" */
rav - > msg_type = msg_type ; /* NTLMSSP_MESSAGE_TYPE */
}
/*******************************************************************
reads or writes an RPC_AUTH_VERIFIER structure .
* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
void smb_io_rpc_auth_verifier ( char * desc , RPC_AUTH_VERIFIER * rav , prs_struct * ps , int depth )
{
if ( rav = = NULL ) return ;
prs_debug ( ps , depth , desc , " smb_io_rpc_auth_verifier " ) ;
depth + + ;
prs_uint8 ( " auth_type " , ps , depth , & ( rav - > auth_type ) ) ; /* nt lm ssp 0x0a */
prs_uint8 ( " auth_level " , ps , depth , & ( rav - > auth_level ) ) ; /* 0x06 */
prs_uint8 ( " stub_type_len " , ps , depth , & ( rav - > stub_type_len ) ) ;
prs_uint8 ( " padding " , ps , depth , & ( rav - > padding ) ) ;
prs_uint32 ( " ptr_0 " , ps , depth , & ( rav - > ptr_0 ) ) ; /* non-zero pointer to something */
prs_string ( " signature " , ps , depth , rav - > signature , 0 , sizeof ( rav - > signature ) ) ; /* "NTLMSSP" */
prs_uint32 ( " msg_type " , ps , depth , & ( rav - > msg_type ) ) ; /* NTLMSSP_MESSAGE_TYPE */
}
/*******************************************************************
creates an RPC_AUTH_NTLMSSP_CHAL structure .
* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
void make_rpc_auth_ntlmssp_chal ( RPC_AUTH_NTLMSSP_CHAL * chl ,
uint32 neg_flags ,
uint8 challenge [ 8 ] )
{
if ( chl = = NULL ) return ;
chl - > unknown_1 = 0x0 ;
chl - > unknown_2 = 0x00000028 ;
chl - > neg_flags = neg_flags ; /* 0x0082b1 */
memcpy ( chl - > challenge , challenge , sizeof ( chl - > challenge ) ) ;
1998-10-07 19:22:49 +04:00
/*
1998-10-07 02:03:04 +04:00
bzero ( chl - > reserved , sizeof ( chl - > reserved ) ) ;
1998-10-07 19:22:49 +04:00
*/
1998-10-07 02:03:04 +04:00
}
/*******************************************************************
reads or writes an RPC_AUTH_NTLMSSP_CHAL structure .
* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
void smb_io_rpc_auth_ntlmssp_chal ( char * desc , RPC_AUTH_NTLMSSP_CHAL * chl , prs_struct * ps , int depth )
{
if ( chl = = NULL ) return ;
prs_debug ( ps , depth , desc , " smb_io_rpc_auth_ntlmssp_chal " ) ;
depth + + ;
prs_uint32 ( " unknown_1 " , ps , depth , & ( chl - > unknown_1 ) ) ; /* 0x0000 0000 */
prs_uint32 ( " unknown_2 " , ps , depth , & ( chl - > unknown_2 ) ) ; /* 0x0000 b2b3 */
prs_uint32 ( " neg_flags " , ps , depth , & ( chl - > neg_flags ) ) ; /* 0x0000 82b1 */
prs_uint8s ( False , " challenge " , ps , depth , chl - > challenge , sizeof ( chl - > challenge ) ) ;
1998-10-07 19:22:49 +04:00
/*
1998-10-07 02:03:04 +04:00
prs_uint8s ( False , " reserved " , ps , depth , chl - > reserved , sizeof ( chl - > reserved ) ) ;
1998-10-07 19:22:49 +04:00
*/
1998-03-12 00:11:04 +03:00
}
/*******************************************************************
creates an RPC_AUTH_NTLMSSP_RESP structure .
* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
void make_rpc_auth_ntlmssp_resp ( RPC_AUTH_NTLMSSP_RESP * rsp ,
1998-10-07 02:03:04 +04:00
uchar lm_resp [ 24 ] , uchar nt_resp [ 24 ] ,
char * domain , char * user , char * wks ,
uint32 neg_flags )
1998-03-12 00:11:04 +03:00
{
1998-10-07 02:03:04 +04:00
int dom_len = strlen ( domain ) * 2 ;
int wks_len = strlen ( wks ) * 2 ;
int usr_len = strlen ( user ) * 2 ;
int lm_len = lm_resp ! = NULL ? 24 : 0 ;
int nt_len = nt_resp ! = NULL ? 24 : 0 ;
1998-03-12 00:11:04 +03:00
1998-10-07 02:03:04 +04:00
if ( rsp = = NULL ) return ;
1998-03-12 00:11:04 +03:00
1998-10-07 02:03:04 +04:00
make_str_hdr ( & rsp - > hdr_lm_resp , lm_len , lm_len , 1 ) ;
make_str_hdr ( & rsp - > hdr_nt_resp , nt_len , nt_len , 1 ) ;
make_str_hdr ( & rsp - > hdr_domain , dom_len , dom_len , 1 ) ;
make_str_hdr ( & rsp - > hdr_usr , usr_len , usr_len , 1 ) ;
make_str_hdr ( & rsp - > hdr_wks , wks_len , wks_len , 1 ) ;
make_str_hdr ( & rsp - > hdr_sess_key , 0 , 0 , 1 ) ;
1998-03-12 00:11:04 +03:00
1998-10-07 02:03:04 +04:00
rsp - > neg_flags = neg_flags ;
1998-03-12 00:11:04 +03:00
1998-10-07 02:03:04 +04:00
memcpy ( & rsp - > lm_resp , lm_resp , 24 ) ;
memcpy ( & rsp - > nt_resp , nt_resp , 24 ) ;
fstrcpy ( rsp - > domain , domain ) ;
fstrcpy ( rsp - > user , user ) ;
fstrcpy ( rsp - > wks , wks ) ;
rsp - > sess_key [ 0 ] = 0 ;
1998-10-07 19:22:49 +04:00
1998-10-07 02:03:04 +04:00
1998-03-12 00:11:04 +03:00
}
/*******************************************************************
reads or writes an RPC_AUTH_NTLMSSP_RESP structure .
* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
void smb_io_rpc_auth_ntlmssp_resp ( char * desc , RPC_AUTH_NTLMSSP_RESP * rsp , prs_struct * ps , int depth )
{
if ( rsp = = NULL ) return ;
prs_debug ( ps , depth , desc , " smb_io_rpc_auth_ntlmssp_resp " ) ;
depth + + ;
1998-10-07 02:03:04 +04:00
smb_io_strhdr ( " hdr_lm_resp " , & rsp - > hdr_lm_resp , ps , depth ) ;
smb_io_strhdr ( " hdr_nt_resp " , & rsp - > hdr_nt_resp , ps , depth ) ;
smb_io_strhdr ( " hdr_domain " , & rsp - > hdr_domain , ps , depth ) ;
smb_io_strhdr ( " hdr_user " , & rsp - > hdr_usr , ps , depth ) ;
smb_io_strhdr ( " hdr_wks " , & rsp - > hdr_wks , ps , depth ) ;
smb_io_strhdr ( " hdr_sess_key " , & rsp - > hdr_sess_key , ps , depth ) ;
prs_uint32 ( " neg_flags " , ps , depth , & ( rsp - > neg_flags ) ) ; /* 0x0000 82b1 */
prs_string ( " sess_key " , ps , depth , rsp - > sess_key , rsp - > hdr_sess_key . str_str_len , sizeof ( rsp - > sess_key ) ) ;
prs_string ( " wks " , ps , depth , rsp - > wks , rsp - > hdr_wks . str_str_len , sizeof ( rsp - > wks ) ) ;
prs_string ( " user " , ps , depth , rsp - > user , rsp - > hdr_usr . str_str_len , sizeof ( rsp - > user ) ) ;
prs_string ( " domain " , ps , depth , rsp - > domain , rsp - > hdr_domain . str_str_len , sizeof ( rsp - > domain ) ) ;
prs_string ( " nt_resp " , ps , depth , rsp - > nt_resp , rsp - > hdr_nt_resp . str_str_len , sizeof ( rsp - > nt_resp ) ) ;
prs_string ( " lm_resp " , ps , depth , rsp - > lm_resp , rsp - > hdr_lm_resp . str_str_len , sizeof ( rsp - > lm_resp ) ) ;
1998-03-12 00:11:04 +03:00
}
#if 0
/* attached to the end of encrypted rpc requests and responses */
/* RPC_AUTH_NTLMSSP_CHK */
typedef struct rpc_auth_ntlmssp_chk_info
{
uint32 ver ; /* 0x1 */
uint8 data [ 12 ] ;
} RPC_AUTH_NTLMSSP_CHK ;
# endif /* 0 */