root/source4/libcli/smb2/negprot.c

/* [<][>][^][v][top][bottom][index][help] */

DEFINITIONS

This source file includes following definitions.
  1. smb2_negprot_send
  2. smb2_negprot_recv
  3. smb2_negprot

   1 /* 
   2    Unix SMB/CIFS implementation.
   3 
   4    SMB2 client negprot handling
   5 
   6    Copyright (C) Andrew Tridgell 2005
   7    
   8    This program is free software; you can redistribute it and/or modify
   9    it under the terms of the GNU General Public License as published by
  10    the Free Software Foundation; either version 3 of the License, or
  11    (at your option) any later version.
  12    
  13    This program is distributed in the hope that it will be useful,
  14    but WITHOUT ANY WARRANTY; without even the implied warranty of
  15    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
  16    GNU General Public License for more details.
  17    
  18    You should have received a copy of the GNU General Public License
  19    along with this program.  If not, see <http://www.gnu.org/licenses/>.
  20 */
  21 
  22 #include "includes.h"
  23 #include "libcli/raw/libcliraw.h"
  24 #include "libcli/raw/raw_proto.h"
  25 #include "libcli/smb2/smb2.h"
  26 #include "libcli/smb2/smb2_calls.h"
  27 #include "librpc/ndr/libndr.h"
  28 
  29 /*
  30   send a negprot request
  31 */
  32 struct smb2_request *smb2_negprot_send(struct smb2_transport *transport, 
     /* [<][>][^][v][top][bottom][index][help] */
  33                                        struct smb2_negprot *io)
  34 {
  35         struct smb2_request *req;
  36         uint16_t size = 0x24 + io->in.dialect_count*2;
  37         enum ndr_err_code ndr_err;
  38         int i;
  39 
  40         req = smb2_request_init(transport, SMB2_OP_NEGPROT, size, false, 0);
  41         if (req == NULL) return NULL;
  42 
  43 
  44         SSVAL(req->out.body, 0x00, 0x24);
  45         SSVAL(req->out.body, 0x02, io->in.dialect_count);
  46         SSVAL(req->out.body, 0x04, io->in.security_mode);
  47         SSVAL(req->out.body, 0x06, io->in.reserved);
  48         SIVAL(req->out.body, 0x08, io->in.capabilities);
  49         ndr_err = smbcli_push_guid(req->out.body, 0x0C, &io->in.client_guid);
  50         if (!NDR_ERR_CODE_IS_SUCCESS(ndr_err)) {
  51                 talloc_free(req);
  52                 return NULL;
  53         }
  54         smbcli_push_nttime(req->out.body, 0x1C, io->in.start_time);
  55         for (i=0;i<io->in.dialect_count;i++) {
  56                 SSVAL(req->out.body, 0x24 + i*2, io->in.dialects[i]);           
  57         }
  58 
  59         smb2_transport_send(req);
  60 
  61         return req;
  62 }
  63 
  64 /*
  65   recv a negprot reply
  66 */
  67 NTSTATUS smb2_negprot_recv(struct smb2_request *req, TALLOC_CTX *mem_ctx, 
     /* [<][>][^][v][top][bottom][index][help] */
  68                            struct smb2_negprot *io)
  69 {
  70         NTSTATUS status;
  71         enum ndr_err_code ndr_err;
  72 
  73         if (!smb2_request_receive(req) ||
  74             smb2_request_is_error(req)) {
  75                 return smb2_request_destroy(req);
  76         }
  77 
  78         SMB2_CHECK_PACKET_RECV(req, 0x40, true);
  79 
  80         io->out.security_mode      = SVAL(req->in.body, 0x02);
  81         io->out.dialect_revision   = SVAL(req->in.body, 0x04);
  82         io->out.reserved           = SVAL(req->in.body, 0x06);
  83         ndr_err = smbcli_pull_guid(req->in.body, 0x08, &io->in.client_guid);
  84         if (!NDR_ERR_CODE_IS_SUCCESS(ndr_err)) {
  85                 smb2_request_destroy(req);
  86                 return NT_STATUS_INTERNAL_ERROR;
  87         }
  88         io->out.capabilities       = IVAL(req->in.body, 0x18);
  89         io->out.max_transact_size  = IVAL(req->in.body, 0x1C);
  90         io->out.max_read_size      = IVAL(req->in.body, 0x20);
  91         io->out.max_write_size     = IVAL(req->in.body, 0x24);
  92         io->out.system_time        = smbcli_pull_nttime(req->in.body, 0x28);
  93         io->out.server_start_time  = smbcli_pull_nttime(req->in.body, 0x30);
  94         io->out.reserved2          = IVAL(req->in.body, 0x3C);
  95 
  96         status = smb2_pull_o16s16_blob(&req->in, mem_ctx, req->in.body+0x38, &io->out.secblob);
  97         if (!NT_STATUS_IS_OK(status)) {
  98                 smb2_request_destroy(req);
  99                 return status;
 100         }
 101 
 102         return smb2_request_destroy(req);
 103 }
 104 
 105 /*
 106   sync negprot request
 107 */
 108 NTSTATUS smb2_negprot(struct smb2_transport *transport, 
     /* [<][>][^][v][top][bottom][index][help] */
 109                       TALLOC_CTX *mem_ctx, struct smb2_negprot *io)
 110 {
 111         struct smb2_request *req = smb2_negprot_send(transport, io);
 112         return smb2_negprot_recv(req, mem_ctx, io);
 113 }

/* [<][>][^][v][top][bottom][index][help] */