/src/samba/librpc/ndr/ndr_negoex.c
Line | Count | Source |
1 | | /* |
2 | | Unix SMB/CIFS implementation. |
3 | | |
4 | | routines for marshalling/unmarshalling special NEGOEX structures |
5 | | |
6 | | Copyright (C) Stefan Metzmacher 2015 |
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 | | #include "includes.h" |
22 | | #include "librpc/gen_ndr/ndr_negoex.h" |
23 | | #include "librpc/gen_ndr/ndr_misc.h" |
24 | | #include "librpc/ndr/ndr_negoex.h" |
25 | | |
26 | | void ndr_print_negoex_BYTE_VECTOR(struct ndr_print *ndr, const char *name, const struct negoex_BYTE_VECTOR *r) |
27 | 144k | { |
28 | 144k | ndr_print_struct(ndr, name, "negoex_BYTE_VECTOR"); |
29 | 144k | if (r == NULL) { ndr_print_null(ndr); return; } |
30 | 144k | ndr->depth++; |
31 | 144k | ndr_print_DATA_BLOB(ndr, "blob", r->blob); |
32 | 144k | ndr->depth--; |
33 | 144k | } |
34 | | |
35 | | enum ndr_err_code ndr_push_negoex_BYTE_VECTOR(struct ndr_push *ndr, ndr_flags_type ndr_flags, const struct negoex_BYTE_VECTOR *r) |
36 | 579k | { |
37 | 579k | NDR_PUSH_CHECK_FLAGS(ndr, ndr_flags); |
38 | 579k | if (ndr_flags & NDR_SCALARS) { |
39 | 289k | NDR_CHECK(ndr_push_align(ndr, 5)); |
40 | 289k | NDR_CHECK(ndr_push_relative_ptr1(ndr, r->blob.data)); |
41 | 289k | NDR_CHECK(ndr_push_uint32(ndr, NDR_SCALARS, r->blob.length)); |
42 | 289k | NDR_CHECK(ndr_push_trailer_align(ndr, 5)); |
43 | 289k | } |
44 | 579k | if (ndr_flags & NDR_BUFFERS) { |
45 | 289k | if (r->blob.data) { |
46 | 70.5k | NDR_CHECK(ndr_push_relative_ptr2_start(ndr, r->blob.data)); |
47 | | #if 0 |
48 | | NDR_CHECK(ndr_push_uint3264(ndr, NDR_SCALARS, r->blob.length)); |
49 | | #endif |
50 | 70.5k | NDR_CHECK(ndr_push_array_uint8(ndr, NDR_SCALARS, r->blob.data, r->blob.length)); |
51 | 70.5k | NDR_CHECK(ndr_push_relative_ptr2_end(ndr, r->blob.data)); |
52 | 70.5k | } |
53 | 289k | } |
54 | 579k | return NDR_ERR_SUCCESS; |
55 | 579k | } |
56 | | |
57 | | enum ndr_err_code ndr_pull_negoex_BYTE_VECTOR(struct ndr_pull *ndr, ndr_flags_type ndr_flags, struct negoex_BYTE_VECTOR *r) |
58 | 302k | { |
59 | 302k | uint32_t _ptr_data; |
60 | 302k | uint32_t size_data_1 = 0; |
61 | 302k | TALLOC_CTX *_mem_save_data_0 = NULL; |
62 | 302k | NDR_PULL_CHECK_FLAGS(ndr, ndr_flags); |
63 | 302k | r->_dummy = NULL; |
64 | 302k | if (ndr_flags & NDR_SCALARS) { |
65 | 156k | NDR_CHECK(ndr_pull_align(ndr, 5)); |
66 | 156k | NDR_CHECK(ndr_pull_generic_ptr(ndr, &_ptr_data)); |
67 | 156k | if (_ptr_data) { |
68 | 41.1k | NDR_PULL_ALLOC(ndr, r->blob.data); |
69 | 41.1k | NDR_CHECK(ndr_pull_relative_ptr1(ndr, r->blob.data, _ptr_data)); |
70 | 115k | } else { |
71 | 115k | r->blob.data = NULL; |
72 | 115k | } |
73 | 156k | r->blob.length = 0; |
74 | 156k | NDR_CHECK(ndr_pull_uint32(ndr, NDR_SCALARS, &size_data_1)); |
75 | 156k | r->_length = size_data_1; |
76 | 156k | NDR_CHECK(ndr_pull_trailer_align(ndr, 5)); |
77 | 156k | } |
78 | 302k | if (ndr_flags & NDR_BUFFERS) { |
79 | 146k | if (r->blob.data) { |
80 | 36.1k | uint32_t _relative_save_offset; |
81 | 36.1k | _relative_save_offset = ndr->offset; |
82 | 36.1k | NDR_CHECK(ndr_pull_relative_ptr2(ndr, r->blob.data)); |
83 | 36.1k | _mem_save_data_0 = NDR_PULL_GET_MEM_CTX(ndr); |
84 | 36.1k | NDR_PULL_SET_MEM_CTX(ndr, r->blob.data, 0); |
85 | | #if 0 |
86 | | NDR_CHECK(ndr_pull_array_size(ndr, &r->blob.data)); |
87 | | size_data_1 = ndr_get_array_size(ndr, &r->blob.data); |
88 | | #else |
89 | 36.1k | size_data_1 = r->_length; |
90 | 36.1k | #endif |
91 | 36.1k | NDR_PULL_ALLOC_N(ndr, r->blob.data, size_data_1); |
92 | 36.1k | NDR_CHECK(ndr_pull_array_uint8(ndr, NDR_SCALARS, r->blob.data, size_data_1)); |
93 | 36.0k | r->blob.length = size_data_1; |
94 | 36.0k | NDR_PULL_SET_MEM_CTX(ndr, _mem_save_data_0, 0); |
95 | 36.0k | if (ndr->offset > ndr->relative_highest_offset) { |
96 | 11.1k | ndr->relative_highest_offset = ndr->offset; |
97 | 11.1k | } |
98 | 36.0k | ndr->offset = _relative_save_offset; |
99 | 36.0k | } |
100 | | #if 0 |
101 | | if (r->blob.data) { |
102 | | NDR_CHECK(ndr_check_steal_array_size(ndr, (void*)&r->blob.data, r->blob.length)); |
103 | | } |
104 | | #endif |
105 | 146k | } |
106 | 302k | return NDR_ERR_SUCCESS; |
107 | 302k | } |
108 | | |
109 | | enum ndr_err_code ndr_push_negoex_AUTH_SCHEME_VECTOR(struct ndr_push *ndr, ndr_flags_type ndr_flags, const struct negoex_AUTH_SCHEME_VECTOR *r) |
110 | 8.65k | { |
111 | 8.65k | uint32_t cntr_array_1; |
112 | 8.65k | NDR_PUSH_CHECK_FLAGS(ndr, ndr_flags); |
113 | 8.65k | if (ndr_flags & NDR_SCALARS) { |
114 | 4.32k | NDR_CHECK(ndr_push_align(ndr, 5)); |
115 | 4.32k | NDR_CHECK(ndr_push_relative_ptr1(ndr, r->array)); |
116 | 4.32k | NDR_CHECK(ndr_push_uint32(ndr, NDR_SCALARS, r->count)); |
117 | 4.32k | NDR_CHECK(ndr_push_trailer_align(ndr, 5)); |
118 | 4.32k | } |
119 | 8.65k | if (ndr_flags & NDR_BUFFERS) { |
120 | 4.32k | if (r->array) { |
121 | 3.93k | NDR_CHECK(ndr_push_relative_ptr2_start(ndr, r->array)); |
122 | | #if 0 |
123 | | NDR_CHECK(ndr_push_uint3264(ndr, NDR_SCALARS, r->count)); |
124 | | #endif |
125 | 195k | for (cntr_array_1 = 0; cntr_array_1 < (r->count); cntr_array_1++) { |
126 | 191k | NDR_CHECK(ndr_push_negoex_AUTH_SCHEME(ndr, NDR_SCALARS, &r->array[cntr_array_1])); |
127 | 191k | } |
128 | 3.93k | NDR_CHECK(ndr_push_relative_ptr2_end(ndr, r->array)); |
129 | 3.93k | } |
130 | 4.32k | } |
131 | 8.65k | return NDR_ERR_SUCCESS; |
132 | 8.65k | } |
133 | | |
134 | | enum ndr_err_code ndr_pull_negoex_AUTH_SCHEME_VECTOR(struct ndr_pull *ndr, ndr_flags_type ndr_flags, struct negoex_AUTH_SCHEME_VECTOR *r) |
135 | 4.95k | { |
136 | 4.95k | uint32_t _ptr_array; |
137 | 4.95k | uint32_t size_array_1 = 0; |
138 | 4.95k | uint32_t cntr_array_1; |
139 | 4.95k | TALLOC_CTX *_mem_save_array_0 = NULL; |
140 | 4.95k | TALLOC_CTX *_mem_save_array_1 = NULL; |
141 | 4.95k | NDR_PULL_CHECK_FLAGS(ndr, ndr_flags); |
142 | 4.95k | if (ndr_flags & NDR_SCALARS) { |
143 | 2.53k | NDR_CHECK(ndr_pull_align(ndr, 5)); |
144 | 2.53k | NDR_CHECK(ndr_pull_generic_ptr(ndr, &_ptr_array)); |
145 | 2.52k | if (_ptr_array) { |
146 | 2.22k | NDR_PULL_ALLOC(ndr, r->array); |
147 | 2.22k | NDR_CHECK(ndr_pull_relative_ptr1(ndr, r->array, _ptr_array)); |
148 | 2.22k | } else { |
149 | 297 | r->array = NULL; |
150 | 297 | } |
151 | 2.47k | NDR_CHECK(ndr_pull_uint32(ndr, NDR_SCALARS, &r->count)); |
152 | 2.46k | NDR_CHECK(ndr_pull_trailer_align(ndr, 5)); |
153 | 2.46k | } |
154 | 4.88k | if (ndr_flags & NDR_BUFFERS) { |
155 | 2.42k | if (r->array) { |
156 | 2.15k | uint32_t _relative_save_offset; |
157 | 2.15k | _relative_save_offset = ndr->offset; |
158 | 2.15k | NDR_CHECK(ndr_pull_relative_ptr2(ndr, r->array)); |
159 | 2.15k | _mem_save_array_0 = NDR_PULL_GET_MEM_CTX(ndr); |
160 | 2.15k | NDR_PULL_SET_MEM_CTX(ndr, r->array, 0); |
161 | | #if 0 |
162 | | NDR_CHECK(ndr_pull_array_size(ndr, &r->array)); |
163 | | size_array_1 = ndr_get_array_size(ndr, &r->array); |
164 | | #else |
165 | 2.15k | size_array_1 = r->count; |
166 | 2.15k | #endif |
167 | 2.15k | NDR_PULL_ALLOC_N(ndr, r->array, size_array_1); |
168 | 2.15k | _mem_save_array_1 = NDR_PULL_GET_MEM_CTX(ndr); |
169 | 2.15k | NDR_PULL_SET_MEM_CTX(ndr, r->array, 0); |
170 | 293k | for (cntr_array_1 = 0; cntr_array_1 < (size_array_1); cntr_array_1++) { |
171 | 291k | NDR_CHECK(ndr_pull_negoex_AUTH_SCHEME(ndr, NDR_SCALARS, &r->array[cntr_array_1])); |
172 | 291k | } |
173 | 2.08k | NDR_PULL_SET_MEM_CTX(ndr, _mem_save_array_1, 0); |
174 | 2.08k | NDR_PULL_SET_MEM_CTX(ndr, _mem_save_array_0, 0); |
175 | 2.08k | if (ndr->offset > ndr->relative_highest_offset) { |
176 | 2.08k | ndr->relative_highest_offset = ndr->offset; |
177 | 2.08k | } |
178 | 2.08k | ndr->offset = _relative_save_offset; |
179 | 2.08k | } |
180 | | #if 0 |
181 | | if (r->array) { |
182 | | NDR_CHECK(ndr_check_steal_array_size(ndr, (void*)&r->array, r->count)); |
183 | | } |
184 | | #endif |
185 | 2.42k | } |
186 | 4.81k | return NDR_ERR_SUCCESS; |
187 | 4.88k | } |
188 | | |
189 | | enum ndr_err_code ndr_push_negoex_EXTENSION_VECTOR(struct ndr_push *ndr, ndr_flags_type ndr_flags, const struct negoex_EXTENSION_VECTOR *r) |
190 | 8.65k | { |
191 | 8.65k | uint32_t cntr_array_1; |
192 | 8.65k | NDR_PUSH_CHECK_FLAGS(ndr, ndr_flags); |
193 | 8.65k | if (ndr_flags & NDR_SCALARS) { |
194 | 4.32k | NDR_CHECK(ndr_push_align(ndr, 5)); |
195 | 4.32k | NDR_CHECK(ndr_push_relative_ptr1(ndr, r->array)); |
196 | 4.32k | NDR_CHECK(ndr_push_uint32(ndr, NDR_SCALARS, r->count)); |
197 | 4.32k | NDR_CHECK(ndr_push_trailer_align(ndr, 5)); |
198 | 4.32k | } |
199 | 8.65k | if (ndr_flags & NDR_BUFFERS) { |
200 | 4.32k | if (r->array) { |
201 | 4.01k | NDR_CHECK(ndr_push_relative_ptr2_start(ndr, r->array)); |
202 | | #if 0 |
203 | | NDR_CHECK(ndr_push_uint3264(ndr, NDR_SCALARS, r->count)); |
204 | | #endif |
205 | 200k | for (cntr_array_1 = 0; cntr_array_1 < (r->count); cntr_array_1++) { |
206 | 196k | NDR_CHECK(ndr_push_negoex_EXTENSION(ndr, NDR_SCALARS, &r->array[cntr_array_1])); |
207 | 196k | } |
208 | 200k | for (cntr_array_1 = 0; cntr_array_1 < (r->count); cntr_array_1++) { |
209 | 196k | NDR_CHECK(ndr_push_negoex_EXTENSION(ndr, NDR_BUFFERS, &r->array[cntr_array_1])); |
210 | 196k | } |
211 | 4.01k | NDR_CHECK(ndr_push_relative_ptr2_end(ndr, r->array)); |
212 | 4.01k | } |
213 | 4.32k | } |
214 | 8.65k | return NDR_ERR_SUCCESS; |
215 | 8.65k | } |
216 | | |
217 | | enum ndr_err_code ndr_pull_negoex_EXTENSION_VECTOR(struct ndr_pull *ndr, ndr_flags_type ndr_flags, struct negoex_EXTENSION_VECTOR *r) |
218 | 4.81k | { |
219 | 4.81k | uint32_t _ptr_array; |
220 | 4.81k | uint32_t size_array_1 = 0; |
221 | 4.81k | uint32_t cntr_array_1; |
222 | 4.81k | TALLOC_CTX *_mem_save_array_0 = NULL; |
223 | 4.81k | TALLOC_CTX *_mem_save_array_1 = NULL; |
224 | 4.81k | NDR_PULL_CHECK_FLAGS(ndr, ndr_flags); |
225 | 4.81k | if (ndr_flags & NDR_SCALARS) { |
226 | 2.46k | NDR_CHECK(ndr_pull_align(ndr, 5)); |
227 | 2.46k | NDR_CHECK(ndr_pull_generic_ptr(ndr, &_ptr_array)); |
228 | 2.46k | if (_ptr_array) { |
229 | 2.24k | NDR_PULL_ALLOC(ndr, r->array); |
230 | 2.24k | NDR_CHECK(ndr_pull_relative_ptr1(ndr, r->array, _ptr_array)); |
231 | 2.24k | } else { |
232 | 216 | r->array = NULL; |
233 | 216 | } |
234 | 2.42k | NDR_CHECK(ndr_pull_uint32(ndr, NDR_SCALARS, &r->count)); |
235 | 2.42k | NDR_CHECK(ndr_pull_trailer_align(ndr, 5)); |
236 | 2.42k | } |
237 | 4.76k | if (ndr_flags & NDR_BUFFERS) { |
238 | 2.34k | if (r->array) { |
239 | 2.17k | uint32_t _relative_save_offset; |
240 | 2.17k | _relative_save_offset = ndr->offset; |
241 | 2.17k | NDR_CHECK(ndr_pull_relative_ptr2(ndr, r->array)); |
242 | 2.17k | _mem_save_array_0 = NDR_PULL_GET_MEM_CTX(ndr); |
243 | 2.17k | NDR_PULL_SET_MEM_CTX(ndr, r->array, 0); |
244 | | #if 0 |
245 | | NDR_CHECK(ndr_pull_array_size(ndr, &r->array)); |
246 | | size_array_1 = ndr_get_array_size(ndr, &r->array); |
247 | | #else |
248 | 2.17k | size_array_1 = r->count; |
249 | 2.17k | #endif |
250 | 2.17k | NDR_PULL_ALLOC_N(ndr, r->array, size_array_1); |
251 | 2.17k | _mem_save_array_1 = NDR_PULL_GET_MEM_CTX(ndr); |
252 | 2.17k | NDR_PULL_SET_MEM_CTX(ndr, r->array, 0); |
253 | 111k | for (cntr_array_1 = 0; cntr_array_1 < (size_array_1); cntr_array_1++) { |
254 | 109k | NDR_CHECK(ndr_pull_negoex_EXTENSION(ndr, NDR_SCALARS, &r->array[cntr_array_1])); |
255 | 109k | } |
256 | 100k | for (cntr_array_1 = 0; cntr_array_1 < (size_array_1); cntr_array_1++) { |
257 | 98.7k | NDR_CHECK(ndr_pull_negoex_EXTENSION(ndr, NDR_BUFFERS, &r->array[cntr_array_1])); |
258 | 98.7k | } |
259 | 2.12k | NDR_PULL_SET_MEM_CTX(ndr, _mem_save_array_1, 0); |
260 | 2.12k | NDR_PULL_SET_MEM_CTX(ndr, _mem_save_array_0, 0); |
261 | 2.12k | if (ndr->offset > ndr->relative_highest_offset) { |
262 | 136 | ndr->relative_highest_offset = ndr->offset; |
263 | 136 | } |
264 | 2.12k | ndr->offset = _relative_save_offset; |
265 | 2.12k | } |
266 | | #if 0 |
267 | | if (r->array) { |
268 | | NDR_CHECK(ndr_check_steal_array_size(ndr, (void*)&r->array, r->count)); |
269 | | } |
270 | | #endif |
271 | 2.34k | } |
272 | 4.71k | return NDR_ERR_SUCCESS; |
273 | 4.76k | } |
274 | | |
275 | | enum ndr_err_code ndr_push_negoex_ALERT_VECTOR(struct ndr_push *ndr, ndr_flags_type ndr_flags, const struct negoex_ALERT_VECTOR *r) |
276 | 351k | { |
277 | 351k | uint32_t cntr_array_1; |
278 | 351k | NDR_PUSH_CHECK_FLAGS(ndr, ndr_flags); |
279 | 351k | if (ndr_flags & NDR_SCALARS) { |
280 | 175k | NDR_CHECK(ndr_push_align(ndr, 5)); |
281 | 175k | NDR_CHECK(ndr_push_relative_ptr1(ndr, r->array)); |
282 | 175k | NDR_CHECK(ndr_push_uint32(ndr, NDR_SCALARS, r->count)); |
283 | 175k | NDR_CHECK(ndr_push_trailer_align(ndr, 5)); |
284 | 175k | } |
285 | 351k | if (ndr_flags & NDR_BUFFERS) { |
286 | 175k | if (r->array) { |
287 | 114k | NDR_CHECK(ndr_push_relative_ptr2_start(ndr, r->array)); |
288 | | #if 0 |
289 | | NDR_CHECK(ndr_push_uint3264(ndr, NDR_SCALARS, r->count)); |
290 | | #endif |
291 | 202k | for (cntr_array_1 = 0; cntr_array_1 < (r->count); cntr_array_1++) { |
292 | 88.0k | NDR_CHECK(ndr_push_negoex_ALERT(ndr, NDR_SCALARS, &r->array[cntr_array_1])); |
293 | 88.0k | } |
294 | 202k | for (cntr_array_1 = 0; cntr_array_1 < (r->count); cntr_array_1++) { |
295 | 88.0k | NDR_CHECK(ndr_push_negoex_ALERT(ndr, NDR_BUFFERS, &r->array[cntr_array_1])); |
296 | 88.0k | } |
297 | 114k | NDR_CHECK(ndr_push_relative_ptr2_end(ndr, r->array)); |
298 | 114k | } |
299 | 175k | } |
300 | 351k | return NDR_ERR_SUCCESS; |
301 | 351k | } |
302 | | |
303 | | enum ndr_err_code ndr_pull_negoex_ALERT_VECTOR(struct ndr_pull *ndr, ndr_flags_type ndr_flags, struct negoex_ALERT_VECTOR *r) |
304 | 176k | { |
305 | 176k | uint32_t _ptr_array; |
306 | 176k | uint32_t size_array_1 = 0; |
307 | 176k | uint32_t cntr_array_1; |
308 | 176k | TALLOC_CTX *_mem_save_array_0 = NULL; |
309 | 176k | TALLOC_CTX *_mem_save_array_1 = NULL; |
310 | 176k | NDR_PULL_CHECK_FLAGS(ndr, ndr_flags); |
311 | 176k | if (ndr_flags & NDR_SCALARS) { |
312 | 88.2k | NDR_CHECK(ndr_pull_align(ndr, 5)); |
313 | 88.2k | NDR_CHECK(ndr_pull_generic_ptr(ndr, &_ptr_array)); |
314 | 88.2k | if (_ptr_array) { |
315 | 57.4k | NDR_PULL_ALLOC(ndr, r->array); |
316 | 57.4k | NDR_CHECK(ndr_pull_relative_ptr1(ndr, r->array, _ptr_array)); |
317 | 57.4k | } else { |
318 | 30.8k | r->array = NULL; |
319 | 30.8k | } |
320 | 88.2k | NDR_CHECK(ndr_pull_uint32(ndr, NDR_SCALARS, &r->count)); |
321 | 88.2k | NDR_CHECK(ndr_pull_trailer_align(ndr, 5)); |
322 | 88.2k | } |
323 | 176k | if (ndr_flags & NDR_BUFFERS) { |
324 | 88.2k | if (r->array) { |
325 | 57.4k | uint32_t _relative_save_offset; |
326 | 57.4k | _relative_save_offset = ndr->offset; |
327 | 57.4k | NDR_CHECK(ndr_pull_relative_ptr2(ndr, r->array)); |
328 | 57.4k | _mem_save_array_0 = NDR_PULL_GET_MEM_CTX(ndr); |
329 | 57.4k | NDR_PULL_SET_MEM_CTX(ndr, r->array, 0); |
330 | | #if 0 |
331 | | NDR_CHECK(ndr_pull_array_size(ndr, &r->array)); |
332 | | size_array_1 = ndr_get_array_size(ndr, &r->array); |
333 | | #else |
334 | 57.4k | size_array_1 = r->count; |
335 | 57.4k | #endif |
336 | 57.4k | NDR_PULL_ALLOC_N(ndr, r->array, size_array_1); |
337 | 57.4k | _mem_save_array_1 = NDR_PULL_GET_MEM_CTX(ndr); |
338 | 57.4k | NDR_PULL_SET_MEM_CTX(ndr, r->array, 0); |
339 | 102k | for (cntr_array_1 = 0; cntr_array_1 < (size_array_1); cntr_array_1++) { |
340 | 44.6k | NDR_CHECK(ndr_pull_negoex_ALERT(ndr, NDR_SCALARS, &r->array[cntr_array_1])); |
341 | 44.6k | } |
342 | 101k | for (cntr_array_1 = 0; cntr_array_1 < (size_array_1); cntr_array_1++) { |
343 | 44.2k | NDR_CHECK(ndr_pull_negoex_ALERT(ndr, NDR_BUFFERS, &r->array[cntr_array_1])); |
344 | 44.2k | } |
345 | 57.3k | NDR_PULL_SET_MEM_CTX(ndr, _mem_save_array_1, 0); |
346 | 57.3k | NDR_PULL_SET_MEM_CTX(ndr, _mem_save_array_0, 0); |
347 | 57.3k | if (ndr->offset > ndr->relative_highest_offset) { |
348 | 51.5k | ndr->relative_highest_offset = ndr->offset; |
349 | 51.5k | } |
350 | 57.3k | ndr->offset = _relative_save_offset; |
351 | 57.3k | } |
352 | | #if 0 |
353 | | if (r->array) { |
354 | | NDR_CHECK(ndr_check_steal_array_size(ndr, (void*)&r->array, r->count)); |
355 | | } |
356 | | #endif |
357 | 88.2k | } |
358 | 176k | return NDR_ERR_SUCCESS; |
359 | 176k | } |
360 | | |
361 | | size_t ndr_negoex_MESSAGE_header_length(const struct negoex_MESSAGE *r) |
362 | 184k | { |
363 | 184k | size_t size = 0; |
364 | | |
365 | 184k | size += 8; /* signature */ |
366 | 184k | size += 4; /* type */ |
367 | 184k | size += 4; /* sequence_number */ |
368 | 184k | size += 4; /* header_length */ |
369 | 184k | size += 4; /* message_length */ |
370 | 184k | size += 16; /* conversation_id */ |
371 | | |
372 | 184k | switch (r->type) { |
373 | 1.61k | case NEGOEX_MESSAGE_TYPE_INITIATOR_NEGO: |
374 | 4.32k | case NEGOEX_MESSAGE_TYPE_ACCEPTOR_NEGO: |
375 | 4.32k | size += 32; /* random */ |
376 | 4.32k | size += 8; /* protocol_version */ |
377 | 4.32k | size += 8; /* auth_schemes */ |
378 | 4.32k | size += 8; /* extensions */ |
379 | 4.32k | break; |
380 | | |
381 | 1.12k | case NEGOEX_MESSAGE_TYPE_INITIATOR_META_DATA: |
382 | 2.23k | case NEGOEX_MESSAGE_TYPE_ACCEPTOR_META_DATA: |
383 | 2.84k | case NEGOEX_MESSAGE_TYPE_CHALLENGE: |
384 | 3.36k | case NEGOEX_MESSAGE_TYPE_AP_REQUEST: |
385 | 3.36k | size += 16; /* auth_scheme */ |
386 | 3.36k | size += 8; /* exchange */ |
387 | 3.36k | break; |
388 | | |
389 | 1.17k | case NEGOEX_MESSAGE_TYPE_VERIFY: |
390 | 1.17k | size += 16; /* auth_scheme */ |
391 | 1.17k | size += 4; /* checksum.header_length */ |
392 | 1.17k | size += 4; /* checksum.scheme */ |
393 | 1.17k | size += 4; /* checksum.type */ |
394 | 1.17k | size += 8; /* checksum.value */ |
395 | 1.17k | break; |
396 | | |
397 | 175k | case NEGOEX_MESSAGE_TYPE_ALERT: |
398 | 175k | size += 16; /* auth_scheme */ |
399 | 175k | size += 4; /* status */ |
400 | 175k | size += 8; /* alerts */ |
401 | 175k | break; |
402 | 184k | } |
403 | | |
404 | 184k | return size; |
405 | 184k | } |
406 | | |
407 | | enum ndr_err_code ndr_pull_negoex_MESSAGE(struct ndr_pull *ndr, ndr_flags_type ndr_flags, struct negoex_MESSAGE *r) |
408 | 93.7k | { |
409 | 93.7k | uint32_t _save_relative_base_offset = ndr_pull_get_relative_base_offset(ndr); |
410 | 93.7k | uint32_t size_signature_0 = 0; |
411 | 93.7k | uint32_t start_data_size = ndr->data_size; |
412 | 93.7k | uint32_t saved_offset = 0; |
413 | 93.7k | NDR_PULL_CHECK_FLAGS(ndr, ndr_flags); |
414 | 93.7k | if (ndr_flags & NDR_SCALARS) { |
415 | 93.7k | NDR_CHECK(ndr_pull_align(ndr, 5)); |
416 | 93.7k | NDR_CHECK(ndr_pull_setup_relative_base_offset1(ndr, r, ndr->offset)); |
417 | 93.7k | size_signature_0 = 8; |
418 | 93.7k | NDR_CHECK(ndr_pull_charset(ndr, NDR_SCALARS, &r->signature, size_signature_0, sizeof(uint8_t), CH_DOS)); |
419 | 93.7k | NDR_CHECK(ndr_pull_negoex_MESSAGE_TYPE(ndr, NDR_SCALARS, &r->type)); |
420 | 93.7k | NDR_CHECK(ndr_pull_uint32(ndr, NDR_SCALARS, &r->sequence_number)); |
421 | 93.7k | NDR_CHECK(ndr_pull_uint32(ndr, NDR_SCALARS, &r->header_length)); |
422 | 93.7k | NDR_CHECK(ndr_pull_uint32(ndr, NDR_SCALARS, &r->message_length)); |
423 | 93.7k | saved_offset = ndr->offset; |
424 | 93.7k | ndr->offset = ndr->relative_base_offset; |
425 | 93.7k | NDR_PULL_NEED_BYTES(ndr, r->message_length); |
426 | 93.6k | ndr->data_size = ndr->offset + r->message_length; |
427 | 93.6k | ndr->offset = saved_offset; |
428 | 93.6k | NDR_CHECK(ndr_pull_GUID(ndr, NDR_SCALARS, &r->conversation_id)); |
429 | 93.6k | NDR_CHECK(ndr_pull_set_switch_value(ndr, &r->p, r->type)); |
430 | 93.6k | NDR_CHECK(ndr_pull_negoex_PAYLOAD(ndr, NDR_SCALARS, &r->p)); |
431 | 93.3k | NDR_CHECK(ndr_pull_trailer_align(ndr, 5)); |
432 | 93.3k | ndr->offset = ndr->data_size; |
433 | 93.3k | ndr->data_size = start_data_size; |
434 | 93.3k | } |
435 | 93.3k | if (ndr_flags & NDR_BUFFERS) { |
436 | 93.3k | NDR_CHECK(ndr_pull_setup_relative_base_offset2(ndr, r)); |
437 | 93.3k | saved_offset = ndr->offset; |
438 | 93.3k | ndr->offset = ndr->relative_base_offset; |
439 | 93.3k | NDR_PULL_NEED_BYTES(ndr, r->message_length); |
440 | 93.3k | ndr->data_size = ndr->offset + r->message_length; |
441 | 93.3k | ndr->offset = saved_offset; |
442 | 93.3k | NDR_CHECK(ndr_pull_set_switch_value(ndr, &r->p, r->type)); |
443 | 93.3k | NDR_CHECK(ndr_pull_negoex_PAYLOAD(ndr, NDR_BUFFERS, &r->p)); |
444 | 93.2k | ndr->offset = ndr->data_size; |
445 | 93.2k | ndr->data_size = start_data_size; |
446 | 93.2k | } |
447 | 93.2k | ndr_pull_restore_relative_base_offset(ndr, _save_relative_base_offset); |
448 | 93.2k | return NDR_ERR_SUCCESS; |
449 | 93.3k | } |
450 | | |
451 | | enum ndr_err_code ndr_push_negoex_MESSAGE_ARRAY(struct ndr_push *ndr, ndr_flags_type ndr_flags, const struct negoex_MESSAGE_ARRAY *r) |
452 | 15.9k | { |
453 | 15.9k | uint32_t cntr_messages_0; |
454 | 15.9k | { |
455 | 15.9k | libndr_flags _flags_save_STRUCT = ndr->flags; |
456 | 15.9k | ndr_set_flags(&ndr->flags, LIBNDR_FLAG_NOALIGN); |
457 | 15.9k | NDR_PUSH_CHECK_FLAGS(ndr, ndr_flags); |
458 | 15.9k | if (ndr_flags & NDR_SCALARS) { |
459 | 15.9k | NDR_CHECK(ndr_push_align(ndr, 5)); |
460 | 107k | for (cntr_messages_0 = 0; cntr_messages_0 < (r->count); cntr_messages_0++) { |
461 | 91.5k | NDR_CHECK(ndr_push_negoex_MESSAGE(ndr, NDR_SCALARS|NDR_BUFFERS, &r->messages[cntr_messages_0])); |
462 | 91.5k | } |
463 | 15.9k | NDR_CHECK(ndr_push_trailer_align(ndr, 5)); |
464 | 15.9k | } |
465 | 15.9k | ndr->flags = _flags_save_STRUCT; |
466 | 15.9k | } |
467 | 0 | return NDR_ERR_SUCCESS; |
468 | 15.9k | } |
469 | | |
470 | | enum ndr_err_code ndr_pull_negoex_MESSAGE_ARRAY(struct ndr_pull *ndr, ndr_flags_type ndr_flags, struct negoex_MESSAGE_ARRAY *r) |
471 | 16.3k | { |
472 | 16.3k | uint32_t size_messages_0 = 0; |
473 | 16.3k | uint32_t cntr_messages_0; |
474 | 16.3k | TALLOC_CTX *_mem_save_messages_0 = NULL; |
475 | 16.3k | { |
476 | 16.3k | libndr_flags _flags_save_STRUCT = ndr->flags; |
477 | 16.3k | ndr_set_flags(&ndr->flags, LIBNDR_FLAG_NOALIGN); |
478 | 16.3k | NDR_PULL_CHECK_FLAGS(ndr, ndr_flags); |
479 | 16.3k | if (ndr_flags & NDR_SCALARS) { |
480 | 16.3k | uint32_t saved_offset = ndr->offset; |
481 | 16.3k | uint32_t available = 0; |
482 | 16.3k | NDR_CHECK(ndr_pull_align(ndr, 5)); |
483 | 16.3k | r->count = 0; |
484 | 16.3k | available = ndr->data_size - ndr->offset; |
485 | 245k | while (available > 0) { |
486 | 229k | uint32_t length; |
487 | | |
488 | | /* |
489 | | * The common header is 40 bytes |
490 | | * and message_length is at offset 20 |
491 | | */ |
492 | 229k | NDR_PULL_NEED_BYTES(ndr, 40); |
493 | 228k | ndr->offset += 20; |
494 | 228k | NDR_CHECK(ndr_pull_uint32(ndr, NDR_SCALARS, &length)); |
495 | 228k | ndr->offset -= 24; |
496 | 228k | if (length < 40) { |
497 | | /* |
498 | | * let the pull function catch the error |
499 | | */ |
500 | 134k | length = 40; |
501 | 134k | } |
502 | 228k | NDR_PULL_NEED_BYTES(ndr, length); |
503 | 228k | ndr->offset += length; |
504 | 228k | available -= length; |
505 | 228k | r->count++; |
506 | 228k | } |
507 | 16.1k | ndr->offset = saved_offset; |
508 | 16.1k | size_messages_0 = r->count; |
509 | 16.1k | NDR_PULL_ALLOC_N(ndr, r->messages, size_messages_0); |
510 | 16.1k | _mem_save_messages_0 = NDR_PULL_GET_MEM_CTX(ndr); |
511 | 16.1k | NDR_PULL_SET_MEM_CTX(ndr, r->messages, 0); |
512 | 108k | for (cntr_messages_0 = 0; cntr_messages_0 < (size_messages_0); cntr_messages_0++) { |
513 | 92.7k | NDR_CHECK(ndr_pull_negoex_MESSAGE(ndr, NDR_SCALARS|NDR_BUFFERS, &r->messages[cntr_messages_0])); |
514 | 92.7k | } |
515 | 15.9k | NDR_PULL_SET_MEM_CTX(ndr, _mem_save_messages_0, 0); |
516 | 15.9k | NDR_CHECK(ndr_pull_trailer_align(ndr, 5)); |
517 | 15.9k | } |
518 | 15.9k | ndr->flags = _flags_save_STRUCT; |
519 | 15.9k | } |
520 | 0 | return NDR_ERR_SUCCESS; |
521 | 16.3k | } |