1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145
  
     | 
    
      /*
   Unix SMB/Netbios implementation.
   NTLMSSP ndr functions
   Copyright (C) Guenther Deschner 2009
   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 3 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, see <http://www.gnu.org/licenses/>.
*/
#include "includes.h"
#include "../librpc/gen_ndr/ndr_ntlmssp.h"
#include "libsmb/ntlmssp_ndr.h"
#define NTLMSSP_PULL_MESSAGE(type, blob, mem_ctx, ic, r) \
do { \
	enum ndr_err_code __ndr_err; \
	__ndr_err = ndr_pull_struct_blob(blob, mem_ctx, ic, r, \
			(ndr_pull_flags_fn_t)ndr_pull_ ##type); \
	if (!NDR_ERR_CODE_IS_SUCCESS(__ndr_err)) { \
		return ndr_map_error2ntstatus(__ndr_err); \
	} \
	if (memcmp(r->Signature, "NTLMSSP\0", 8)) {\
		return NT_STATUS_INVALID_PARAMETER; \
	} \
	return NT_STATUS_OK; \
} while(0);
#define NTLMSSP_PUSH_MESSAGE(type, blob, mem_ctx, ic, r) \
do { \
	enum ndr_err_code __ndr_err; \
	__ndr_err = ndr_push_struct_blob(blob, mem_ctx, ic, r, \
			(ndr_push_flags_fn_t)ndr_push_ ##type); \
	if (!NDR_ERR_CODE_IS_SUCCESS(__ndr_err)) { \
		return ndr_map_error2ntstatus(__ndr_err); \
	} \
	return NT_STATUS_OK; \
} while(0);
/**
 * Pull NTLMSSP NEGOTIATE_MESSAGE struct from a blob
 * @param blob The plain packet blob
 * @param mem_ctx A talloc context
 * @param ic Iconv convenience structure
 * @param r Pointer to a NTLMSSP NEGOTIATE_MESSAGE structure
 */
NTSTATUS ntlmssp_pull_NEGOTIATE_MESSAGE(const DATA_BLOB *blob,
					TALLOC_CTX *mem_ctx,
					struct smb_iconv_convenience *ic,
					struct NEGOTIATE_MESSAGE *r)
{
	NTLMSSP_PULL_MESSAGE(NEGOTIATE_MESSAGE, blob, mem_ctx, ic, r);
}
/**
 * Pull NTLMSSP CHALLENGE_MESSAGE struct from a blob
 * @param blob The plain packet blob
 * @param mem_ctx A talloc context
 * @param ic Iconv convenience structure
 * @param r Pointer to a NTLMSSP CHALLENGE_MESSAGE structure
 */
NTSTATUS ntlmssp_pull_CHALLENGE_MESSAGE(const DATA_BLOB *blob,
					TALLOC_CTX *mem_ctx,
					struct smb_iconv_convenience *ic,
					struct CHALLENGE_MESSAGE *r)
{
	NTLMSSP_PULL_MESSAGE(CHALLENGE_MESSAGE, blob, mem_ctx, ic, r);
}
/**
 * Pull NTLMSSP AUTHENTICATE_MESSAGE struct from a blob
 * @param blob The plain packet blob
 * @param mem_ctx A talloc context
 * @param ic Iconv convenience structure
 * @param r Pointer to a NTLMSSP AUTHENTICATE_MESSAGE structure
 */
NTSTATUS ntlmssp_pull_AUTHENTICATE_MESSAGE(const DATA_BLOB *blob,
					   TALLOC_CTX *mem_ctx,
					   struct smb_iconv_convenience *ic,
					   struct AUTHENTICATE_MESSAGE *r)
{
	NTLMSSP_PULL_MESSAGE(AUTHENTICATE_MESSAGE, blob, mem_ctx, ic, r);
}
/**
 * Push NTLMSSP NEGOTIATE_MESSAGE struct into a blob
 * @param blob The plain packet blob
 * @param mem_ctx A talloc context
 * @param ic Iconv convenience structure
 * @param r Pointer to a NTLMSSP NEGOTIATE_MESSAGE structure
 */
NTSTATUS ntlmssp_push_NEGOTIATE_MESSAGE(DATA_BLOB *blob,
					TALLOC_CTX *mem_ctx,
					struct smb_iconv_convenience *ic,
					const struct NEGOTIATE_MESSAGE *r)
{
	NTLMSSP_PUSH_MESSAGE(NEGOTIATE_MESSAGE, blob, mem_ctx, ic, r);
}
/**
 * Push NTLMSSP CHALLENGE_MESSAGE struct into a blob
 * @param blob The plain packet blob
 * @param mem_ctx A talloc context
 * @param ic Iconv convenience structure
 * @param r Pointer to a NTLMSSP CHALLENGE_MESSAGE structure
 */
NTSTATUS ntlmssp_push_CHALLENGE_MESSAGE(DATA_BLOB *blob,
					TALLOC_CTX *mem_ctx,
					struct smb_iconv_convenience *ic,
					const struct CHALLENGE_MESSAGE *r)
{
	NTLMSSP_PUSH_MESSAGE(CHALLENGE_MESSAGE, blob, mem_ctx, ic, r);
}
/**
 * Push NTLMSSP AUTHENTICATE_MESSAGE struct into a blob
 * @param blob The plain packet blob
 * @param mem_ctx A talloc context
 * @param ic Iconv convenience structure
 * @param r Pointer to a NTLMSSP AUTHENTICATE_MESSAGE structure
 */
NTSTATUS ntlmssp_push_AUTHENTICATE_MESSAGE(DATA_BLOB *blob,
					   TALLOC_CTX *mem_ctx,
					   struct smb_iconv_convenience *ic,
					   const struct AUTHENTICATE_MESSAGE *r)
{
	NTLMSSP_PUSH_MESSAGE(AUTHENTICATE_MESSAGE, blob, mem_ctx, ic, r);
}
 
     |