2 Unix SMB/CIFS implementation.
4 routines for marshalling/unmarshalling special ntlmssp structures
6 Copyright (C) Guenther Deschner 2009
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.
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.
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/>.
23 #include "../librpc/gen_ndr/ndr_ntlmssp.h"
25 _PUBLIC_
size_t ndr_ntlmssp_string_length(uint32_t negotiate_flags
, const char *s
)
31 if (negotiate_flags
& NTLMSSP_NEGOTIATE_UNICODE
) {
38 _PUBLIC_
uint32_t ndr_ntlmssp_negotiated_string_flags(uint32_t negotiate_flags
)
40 uint32_t flags
= LIBNDR_FLAG_STR_NOTERM
|
41 LIBNDR_FLAG_STR_CHARLEN
|
42 LIBNDR_FLAG_REMAINING
;
44 if (!(negotiate_flags
& NTLMSSP_NEGOTIATE_UNICODE
)) {
45 flags
|= LIBNDR_FLAG_STR_ASCII
;
51 _PUBLIC_
enum ndr_err_code
ndr_push_AV_PAIR_LIST(struct ndr_push
*ndr
, int ndr_flags
, const struct AV_PAIR_LIST
*r
)
54 if (ndr_flags
& NDR_SCALARS
) {
55 NDR_CHECK(ndr_push_align(ndr
, 4));
56 for (cntr_pair_0
= 0; cntr_pair_0
< r
->count
; cntr_pair_0
++) {
57 NDR_CHECK(ndr_push_AV_PAIR(ndr
, NDR_SCALARS
, &r
->pair
[cntr_pair_0
]));
60 if (ndr_flags
& NDR_BUFFERS
) {
61 for (cntr_pair_0
= 0; cntr_pair_0
< r
->count
; cntr_pair_0
++) {
62 NDR_CHECK(ndr_push_AV_PAIR(ndr
, NDR_BUFFERS
, &r
->pair
[cntr_pair_0
]));
65 return NDR_ERR_SUCCESS
;
68 _PUBLIC_
enum ndr_err_code
ndr_pull_AV_PAIR_LIST(struct ndr_pull
*ndr
, int ndr_flags
, struct AV_PAIR_LIST
*r
)
71 TALLOC_CTX
*_mem_save_pair_0
;
72 if (ndr_flags
& NDR_SCALARS
) {
74 NDR_CHECK(ndr_pull_align(ndr
, 4));
76 if (ndr
->data_size
> 0) {
77 NDR_PULL_NEED_BYTES(ndr
, 4);
79 while (offset
+ 4 <= ndr
->data_size
) {
82 type
= SVAL(ndr
->data
+ offset
, 0);
83 if (type
== MsvAvEOL
) {
87 length
= SVAL(ndr
->data
+ offset
, 2);
91 NDR_PULL_ALLOC_N(ndr
, r
->pair
, r
->count
);
92 _mem_save_pair_0
= NDR_PULL_GET_MEM_CTX(ndr
);
93 NDR_PULL_SET_MEM_CTX(ndr
, r
->pair
, 0);
94 for (cntr_pair_0
= 0; cntr_pair_0
< r
->count
; cntr_pair_0
++) {
95 NDR_CHECK(ndr_pull_AV_PAIR(ndr
, NDR_SCALARS
, &r
->pair
[cntr_pair_0
]));
97 NDR_PULL_SET_MEM_CTX(ndr
, _mem_save_pair_0
, 0);
99 if (ndr_flags
& NDR_BUFFERS
) {
100 _mem_save_pair_0
= NDR_PULL_GET_MEM_CTX(ndr
);
101 NDR_PULL_SET_MEM_CTX(ndr
, r
->pair
, 0);
102 for (cntr_pair_0
= 0; cntr_pair_0
< r
->count
; cntr_pair_0
++) {
103 NDR_CHECK(ndr_pull_AV_PAIR(ndr
, NDR_BUFFERS
, &r
->pair
[cntr_pair_0
]));
105 NDR_PULL_SET_MEM_CTX(ndr
, _mem_save_pair_0
, 0);
107 return NDR_ERR_SUCCESS
;
110 _PUBLIC_
void ndr_print_ntlmssp_nt_response(TALLOC_CTX
*mem_ctx
,
111 const DATA_BLOB
*nt_response
,
114 enum ndr_err_code ndr_err
;
117 struct NTLMv2_RESPONSE nt
;
118 if (nt_response
->length
> 24) {
119 ndr_err
= ndr_pull_struct_blob(nt_response
, mem_ctx
, &nt
,
120 (ndr_pull_flags_fn_t
)ndr_pull_NTLMv2_RESPONSE
);
121 if (NDR_ERR_CODE_IS_SUCCESS(ndr_err
)) {
122 NDR_PRINT_DEBUG(NTLMv2_RESPONSE
, &nt
);
126 struct NTLM_RESPONSE nt
;
127 if (nt_response
->length
== 24) {
128 ndr_err
= ndr_pull_struct_blob(nt_response
, mem_ctx
, &nt
,
129 (ndr_pull_flags_fn_t
)ndr_pull_NTLM_RESPONSE
);
130 if (NDR_ERR_CODE_IS_SUCCESS(ndr_err
)) {
131 NDR_PRINT_DEBUG(NTLM_RESPONSE
, &nt
);
137 _PUBLIC_
void ndr_print_ntlmssp_lm_response(TALLOC_CTX
*mem_ctx
,
138 const DATA_BLOB
*lm_response
,
141 enum ndr_err_code ndr_err
;
144 struct LMv2_RESPONSE lm
;
145 if (lm_response
->length
== 24) {
146 ndr_err
= ndr_pull_struct_blob(lm_response
, mem_ctx
, &lm
,
147 (ndr_pull_flags_fn_t
)ndr_pull_LMv2_RESPONSE
);
148 if (NDR_ERR_CODE_IS_SUCCESS(ndr_err
)) {
149 NDR_PRINT_DEBUG(LMv2_RESPONSE
, &lm
);
153 struct LM_RESPONSE lm
;
154 if (lm_response
->length
== 24) {
155 ndr_err
= ndr_pull_struct_blob(lm_response
, mem_ctx
, &lm
,
156 (ndr_pull_flags_fn_t
)ndr_pull_LM_RESPONSE
);
157 if (NDR_ERR_CODE_IS_SUCCESS(ndr_err
)) {
158 NDR_PRINT_DEBUG(LM_RESPONSE
, &lm
);
164 _PUBLIC_
void ndr_print_ntlmssp_Version(struct ndr_print
*ndr
, const char *name
, const union ntlmssp_Version
*r
)
167 level
= ndr_print_get_switch_value(ndr
, r
);
169 case NTLMSSP_NEGOTIATE_VERSION
:
170 ndr_print_ntlmssp_VERSION(ndr
, name
, &r
->version
);
179 _PUBLIC_
struct AV_PAIR
*ndr_ntlmssp_find_av(const struct AV_PAIR_LIST
*av_list
,
180 enum ntlmssp_AvId AvId
)
182 struct AV_PAIR
*res
= NULL
;
185 for (i
= 0; i
< av_list
->count
; i
++) {
186 if (av_list
->pair
[i
].AvId
!= AvId
) {
190 res
= discard_const_p(struct AV_PAIR
, &av_list
->pair
[i
]);