/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 | 140k | { |
28 | 140k | ndr_print_struct(ndr, name, "negoex_BYTE_VECTOR"); |
29 | 140k | if (r == NULL) { ndr_print_null(ndr); return; } |
30 | 140k | ndr->depth++; |
31 | 140k | ndr_print_DATA_BLOB(ndr, "blob", r->blob); |
32 | 140k | ndr->depth--; |
33 | 140k | } |
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 | 562k | { |
37 | 562k | NDR_PUSH_CHECK_FLAGS(ndr, ndr_flags); |
38 | 562k | if (ndr_flags & NDR_SCALARS) { |
39 | 281k | NDR_CHECK(ndr_push_align(ndr, 5)); |
40 | 281k | NDR_CHECK(ndr_push_relative_ptr1(ndr, r->blob.data)); |
41 | 281k | NDR_CHECK(ndr_push_uint32(ndr, NDR_SCALARS, r->blob.length)); |
42 | 281k | NDR_CHECK(ndr_push_trailer_align(ndr, 5)); |
43 | 281k | } |
44 | 562k | if (ndr_flags & NDR_BUFFERS) { |
45 | 281k | if (r->blob.data) { |
46 | 67.3k | 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 | 67.3k | NDR_CHECK(ndr_push_array_uint8(ndr, NDR_SCALARS, r->blob.data, r->blob.length)); |
51 | 67.3k | NDR_CHECK(ndr_push_relative_ptr2_end(ndr, r->blob.data)); |
52 | 67.3k | } |
53 | 281k | } |
54 | 562k | return NDR_ERR_SUCCESS; |
55 | 562k | } |
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 | 294k | { |
59 | 294k | uint32_t _ptr_data; |
60 | 294k | uint32_t size_data_1 = 0; |
61 | 294k | TALLOC_CTX *_mem_save_data_0 = NULL; |
62 | 294k | NDR_PULL_CHECK_FLAGS(ndr, ndr_flags); |
63 | 294k | r->_dummy = NULL; |
64 | 294k | if (ndr_flags & NDR_SCALARS) { |
65 | 152k | NDR_CHECK(ndr_pull_align(ndr, 5)); |
66 | 152k | NDR_CHECK(ndr_pull_generic_ptr(ndr, &_ptr_data)); |
67 | 152k | if (_ptr_data) { |
68 | 39.6k | NDR_PULL_ALLOC(ndr, r->blob.data); |
69 | 39.6k | NDR_CHECK(ndr_pull_relative_ptr1(ndr, r->blob.data, _ptr_data)); |
70 | 113k | } else { |
71 | 113k | r->blob.data = NULL; |
72 | 113k | } |
73 | 152k | r->blob.length = 0; |
74 | 152k | NDR_CHECK(ndr_pull_uint32(ndr, NDR_SCALARS, &size_data_1)); |
75 | 152k | r->_length = size_data_1; |
76 | 152k | NDR_CHECK(ndr_pull_trailer_align(ndr, 5)); |
77 | 152k | } |
78 | 294k | if (ndr_flags & NDR_BUFFERS) { |
79 | 141k | if (r->blob.data) { |
80 | 34.5k | uint32_t _relative_save_offset; |
81 | 34.5k | _relative_save_offset = ndr->offset; |
82 | 34.5k | NDR_CHECK(ndr_pull_relative_ptr2(ndr, r->blob.data)); |
83 | 34.5k | _mem_save_data_0 = NDR_PULL_GET_MEM_CTX(ndr); |
84 | 34.5k | 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 | 34.5k | size_data_1 = r->_length; |
90 | 34.5k | #endif |
91 | 34.5k | NDR_PULL_ALLOC_N(ndr, r->blob.data, size_data_1); |
92 | 34.5k | NDR_CHECK(ndr_pull_array_uint8(ndr, NDR_SCALARS, r->blob.data, size_data_1)); |
93 | 34.4k | r->blob.length = size_data_1; |
94 | 34.4k | NDR_PULL_SET_MEM_CTX(ndr, _mem_save_data_0, 0); |
95 | 34.4k | if (ndr->offset > ndr->relative_highest_offset) { |
96 | 10.8k | ndr->relative_highest_offset = ndr->offset; |
97 | 10.8k | } |
98 | 34.4k | ndr->offset = _relative_save_offset; |
99 | 34.4k | } |
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 | 141k | } |
106 | 294k | return NDR_ERR_SUCCESS; |
107 | 294k | } |
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.62k | { |
111 | 8.62k | uint32_t cntr_array_1; |
112 | 8.62k | NDR_PUSH_CHECK_FLAGS(ndr, ndr_flags); |
113 | 8.62k | if (ndr_flags & NDR_SCALARS) { |
114 | 4.31k | NDR_CHECK(ndr_push_align(ndr, 5)); |
115 | 4.31k | NDR_CHECK(ndr_push_relative_ptr1(ndr, r->array)); |
116 | 4.31k | NDR_CHECK(ndr_push_uint32(ndr, NDR_SCALARS, r->count)); |
117 | 4.31k | NDR_CHECK(ndr_push_trailer_align(ndr, 5)); |
118 | 4.31k | } |
119 | 8.62k | if (ndr_flags & NDR_BUFFERS) { |
120 | 4.31k | if (r->array) { |
121 | 3.92k | 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 | 128k | for (cntr_array_1 = 0; cntr_array_1 < (r->count); cntr_array_1++) { |
126 | 124k | NDR_CHECK(ndr_push_negoex_AUTH_SCHEME(ndr, NDR_SCALARS, &r->array[cntr_array_1])); |
127 | 124k | } |
128 | 3.92k | NDR_CHECK(ndr_push_relative_ptr2_end(ndr, r->array)); |
129 | 3.92k | } |
130 | 4.31k | } |
131 | 8.62k | return NDR_ERR_SUCCESS; |
132 | 8.62k | } |
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.90k | { |
136 | 4.90k | uint32_t _ptr_array; |
137 | 4.90k | uint32_t size_array_1 = 0; |
138 | 4.90k | uint32_t cntr_array_1; |
139 | 4.90k | TALLOC_CTX *_mem_save_array_0 = NULL; |
140 | 4.90k | TALLOC_CTX *_mem_save_array_1 = NULL; |
141 | 4.90k | NDR_PULL_CHECK_FLAGS(ndr, ndr_flags); |
142 | 4.90k | if (ndr_flags & NDR_SCALARS) { |
143 | 2.50k | NDR_CHECK(ndr_pull_align(ndr, 5)); |
144 | 2.50k | NDR_CHECK(ndr_pull_generic_ptr(ndr, &_ptr_array)); |
145 | 2.49k | if (_ptr_array) { |
146 | 2.20k | NDR_PULL_ALLOC(ndr, r->array); |
147 | 2.20k | NDR_CHECK(ndr_pull_relative_ptr1(ndr, r->array, _ptr_array)); |
148 | 2.20k | } else { |
149 | 295 | r->array = NULL; |
150 | 295 | } |
151 | 2.45k | NDR_CHECK(ndr_pull_uint32(ndr, NDR_SCALARS, &r->count)); |
152 | 2.44k | NDR_CHECK(ndr_pull_trailer_align(ndr, 5)); |
153 | 2.44k | } |
154 | 4.84k | if (ndr_flags & NDR_BUFFERS) { |
155 | 2.39k | if (r->array) { |
156 | 2.13k | uint32_t _relative_save_offset; |
157 | 2.13k | _relative_save_offset = ndr->offset; |
158 | 2.13k | NDR_CHECK(ndr_pull_relative_ptr2(ndr, r->array)); |
159 | 2.13k | _mem_save_array_0 = NDR_PULL_GET_MEM_CTX(ndr); |
160 | 2.13k | 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.13k | size_array_1 = r->count; |
166 | 2.13k | #endif |
167 | 2.13k | NDR_PULL_ALLOC_N(ndr, r->array, size_array_1); |
168 | 2.13k | _mem_save_array_1 = NDR_PULL_GET_MEM_CTX(ndr); |
169 | 2.13k | NDR_PULL_SET_MEM_CTX(ndr, r->array, 0); |
170 | 262k | for (cntr_array_1 = 0; cntr_array_1 < (size_array_1); cntr_array_1++) { |
171 | 260k | NDR_CHECK(ndr_pull_negoex_AUTH_SCHEME(ndr, NDR_SCALARS, &r->array[cntr_array_1])); |
172 | 260k | } |
173 | 2.07k | NDR_PULL_SET_MEM_CTX(ndr, _mem_save_array_1, 0); |
174 | 2.07k | NDR_PULL_SET_MEM_CTX(ndr, _mem_save_array_0, 0); |
175 | 2.07k | if (ndr->offset > ndr->relative_highest_offset) { |
176 | 2.07k | ndr->relative_highest_offset = ndr->offset; |
177 | 2.07k | } |
178 | 2.07k | ndr->offset = _relative_save_offset; |
179 | 2.07k | } |
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.39k | } |
186 | 4.78k | return NDR_ERR_SUCCESS; |
187 | 4.84k | } |
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.62k | { |
191 | 8.62k | uint32_t cntr_array_1; |
192 | 8.62k | NDR_PUSH_CHECK_FLAGS(ndr, ndr_flags); |
193 | 8.62k | if (ndr_flags & NDR_SCALARS) { |
194 | 4.31k | NDR_CHECK(ndr_push_align(ndr, 5)); |
195 | 4.31k | NDR_CHECK(ndr_push_relative_ptr1(ndr, r->array)); |
196 | 4.31k | NDR_CHECK(ndr_push_uint32(ndr, NDR_SCALARS, r->count)); |
197 | 4.31k | NDR_CHECK(ndr_push_trailer_align(ndr, 5)); |
198 | 4.31k | } |
199 | 8.62k | if (ndr_flags & NDR_BUFFERS) { |
200 | 4.31k | if (r->array) { |
201 | 3.95k | 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 | 199k | for (cntr_array_1 = 0; cntr_array_1 < (r->count); cntr_array_1++) { |
206 | 195k | NDR_CHECK(ndr_push_negoex_EXTENSION(ndr, NDR_SCALARS, &r->array[cntr_array_1])); |
207 | 195k | } |
208 | 199k | for (cntr_array_1 = 0; cntr_array_1 < (r->count); cntr_array_1++) { |
209 | 195k | NDR_CHECK(ndr_push_negoex_EXTENSION(ndr, NDR_BUFFERS, &r->array[cntr_array_1])); |
210 | 195k | } |
211 | 3.95k | NDR_CHECK(ndr_push_relative_ptr2_end(ndr, r->array)); |
212 | 3.95k | } |
213 | 4.31k | } |
214 | 8.62k | return NDR_ERR_SUCCESS; |
215 | 8.62k | } |
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.78k | { |
219 | 4.78k | uint32_t _ptr_array; |
220 | 4.78k | uint32_t size_array_1 = 0; |
221 | 4.78k | uint32_t cntr_array_1; |
222 | 4.78k | TALLOC_CTX *_mem_save_array_0 = NULL; |
223 | 4.78k | TALLOC_CTX *_mem_save_array_1 = NULL; |
224 | 4.78k | NDR_PULL_CHECK_FLAGS(ndr, ndr_flags); |
225 | 4.78k | if (ndr_flags & NDR_SCALARS) { |
226 | 2.44k | NDR_CHECK(ndr_pull_align(ndr, 5)); |
227 | 2.44k | NDR_CHECK(ndr_pull_generic_ptr(ndr, &_ptr_array)); |
228 | 2.43k | if (_ptr_array) { |
229 | 2.20k | NDR_PULL_ALLOC(ndr, r->array); |
230 | 2.20k | NDR_CHECK(ndr_pull_relative_ptr1(ndr, r->array, _ptr_array)); |
231 | 2.20k | } else { |
232 | 230 | r->array = NULL; |
233 | 230 | } |
234 | 2.40k | NDR_CHECK(ndr_pull_uint32(ndr, NDR_SCALARS, &r->count)); |
235 | 2.39k | NDR_CHECK(ndr_pull_trailer_align(ndr, 5)); |
236 | 2.39k | } |
237 | 4.73k | if (ndr_flags & NDR_BUFFERS) { |
238 | 2.34k | if (r->array) { |
239 | 2.14k | uint32_t _relative_save_offset; |
240 | 2.14k | _relative_save_offset = ndr->offset; |
241 | 2.14k | NDR_CHECK(ndr_pull_relative_ptr2(ndr, r->array)); |
242 | 2.14k | _mem_save_array_0 = NDR_PULL_GET_MEM_CTX(ndr); |
243 | 2.14k | 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.14k | size_array_1 = r->count; |
249 | 2.14k | #endif |
250 | 2.14k | NDR_PULL_ALLOC_N(ndr, r->array, size_array_1); |
251 | 2.14k | _mem_save_array_1 = NDR_PULL_GET_MEM_CTX(ndr); |
252 | 2.14k | NDR_PULL_SET_MEM_CTX(ndr, r->array, 0); |
253 | 110k | for (cntr_array_1 = 0; cntr_array_1 < (size_array_1); cntr_array_1++) { |
254 | 108k | NDR_CHECK(ndr_pull_negoex_EXTENSION(ndr, NDR_SCALARS, &r->array[cntr_array_1])); |
255 | 108k | } |
256 | 100k | for (cntr_array_1 = 0; cntr_array_1 < (size_array_1); cntr_array_1++) { |
257 | 98.1k | NDR_CHECK(ndr_pull_negoex_EXTENSION(ndr, NDR_BUFFERS, &r->array[cntr_array_1])); |
258 | 98.1k | } |
259 | 2.09k | NDR_PULL_SET_MEM_CTX(ndr, _mem_save_array_1, 0); |
260 | 2.09k | NDR_PULL_SET_MEM_CTX(ndr, _mem_save_array_0, 0); |
261 | 2.09k | if (ndr->offset > ndr->relative_highest_offset) { |
262 | 131 | ndr->relative_highest_offset = ndr->offset; |
263 | 131 | } |
264 | 2.09k | ndr->offset = _relative_save_offset; |
265 | 2.09k | } |
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.68k | return NDR_ERR_SUCCESS; |
273 | 4.73k | } |
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 | 340k | { |
277 | 340k | uint32_t cntr_array_1; |
278 | 340k | NDR_PUSH_CHECK_FLAGS(ndr, ndr_flags); |
279 | 340k | if (ndr_flags & NDR_SCALARS) { |
280 | 170k | NDR_CHECK(ndr_push_align(ndr, 5)); |
281 | 170k | NDR_CHECK(ndr_push_relative_ptr1(ndr, r->array)); |
282 | 170k | NDR_CHECK(ndr_push_uint32(ndr, NDR_SCALARS, r->count)); |
283 | 170k | NDR_CHECK(ndr_push_trailer_align(ndr, 5)); |
284 | 170k | } |
285 | 340k | if (ndr_flags & NDR_BUFFERS) { |
286 | 170k | if (r->array) { |
287 | 111k | 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 | 192k | for (cntr_array_1 = 0; cntr_array_1 < (r->count); cntr_array_1++) { |
292 | 81.0k | NDR_CHECK(ndr_push_negoex_ALERT(ndr, NDR_SCALARS, &r->array[cntr_array_1])); |
293 | 81.0k | } |
294 | 192k | for (cntr_array_1 = 0; cntr_array_1 < (r->count); cntr_array_1++) { |
295 | 81.0k | NDR_CHECK(ndr_push_negoex_ALERT(ndr, NDR_BUFFERS, &r->array[cntr_array_1])); |
296 | 81.0k | } |
297 | 111k | NDR_CHECK(ndr_push_relative_ptr2_end(ndr, r->array)); |
298 | 111k | } |
299 | 170k | } |
300 | 340k | return NDR_ERR_SUCCESS; |
301 | 340k | } |
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 | 171k | { |
305 | 171k | uint32_t _ptr_array; |
306 | 171k | uint32_t size_array_1 = 0; |
307 | 171k | uint32_t cntr_array_1; |
308 | 171k | TALLOC_CTX *_mem_save_array_0 = NULL; |
309 | 171k | TALLOC_CTX *_mem_save_array_1 = NULL; |
310 | 171k | NDR_PULL_CHECK_FLAGS(ndr, ndr_flags); |
311 | 171k | if (ndr_flags & NDR_SCALARS) { |
312 | 85.6k | NDR_CHECK(ndr_pull_align(ndr, 5)); |
313 | 85.6k | NDR_CHECK(ndr_pull_generic_ptr(ndr, &_ptr_array)); |
314 | 85.6k | if (_ptr_array) { |
315 | 56.0k | NDR_PULL_ALLOC(ndr, r->array); |
316 | 56.0k | NDR_CHECK(ndr_pull_relative_ptr1(ndr, r->array, _ptr_array)); |
317 | 56.0k | } else { |
318 | 29.5k | r->array = NULL; |
319 | 29.5k | } |
320 | 85.6k | NDR_CHECK(ndr_pull_uint32(ndr, NDR_SCALARS, &r->count)); |
321 | 85.6k | NDR_CHECK(ndr_pull_trailer_align(ndr, 5)); |
322 | 85.6k | } |
323 | 171k | if (ndr_flags & NDR_BUFFERS) { |
324 | 85.6k | if (r->array) { |
325 | 56.0k | uint32_t _relative_save_offset; |
326 | 56.0k | _relative_save_offset = ndr->offset; |
327 | 56.0k | NDR_CHECK(ndr_pull_relative_ptr2(ndr, r->array)); |
328 | 56.0k | _mem_save_array_0 = NDR_PULL_GET_MEM_CTX(ndr); |
329 | 56.0k | 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 | 56.0k | size_array_1 = r->count; |
335 | 56.0k | #endif |
336 | 56.0k | NDR_PULL_ALLOC_N(ndr, r->array, size_array_1); |
337 | 56.0k | _mem_save_array_1 = NDR_PULL_GET_MEM_CTX(ndr); |
338 | 56.0k | NDR_PULL_SET_MEM_CTX(ndr, r->array, 0); |
339 | 97.2k | for (cntr_array_1 = 0; cntr_array_1 < (size_array_1); cntr_array_1++) { |
340 | 41.1k | NDR_CHECK(ndr_pull_negoex_ALERT(ndr, NDR_SCALARS, &r->array[cntr_array_1])); |
341 | 41.1k | } |
342 | 96.7k | for (cntr_array_1 = 0; cntr_array_1 < (size_array_1); cntr_array_1++) { |
343 | 40.7k | NDR_CHECK(ndr_pull_negoex_ALERT(ndr, NDR_BUFFERS, &r->array[cntr_array_1])); |
344 | 40.7k | } |
345 | 56.0k | NDR_PULL_SET_MEM_CTX(ndr, _mem_save_array_1, 0); |
346 | 56.0k | NDR_PULL_SET_MEM_CTX(ndr, _mem_save_array_0, 0); |
347 | 56.0k | if (ndr->offset > ndr->relative_highest_offset) { |
348 | 50.2k | ndr->relative_highest_offset = ndr->offset; |
349 | 50.2k | } |
350 | 56.0k | ndr->offset = _relative_save_offset; |
351 | 56.0k | } |
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 | 85.6k | } |
358 | 171k | return NDR_ERR_SUCCESS; |
359 | 171k | } |
360 | | |
361 | | size_t ndr_negoex_MESSAGE_header_length(const struct negoex_MESSAGE *r) |
362 | 179k | { |
363 | 179k | size_t size = 0; |
364 | | |
365 | 179k | size += 8; /* signature */ |
366 | 179k | size += 4; /* type */ |
367 | 179k | size += 4; /* sequence_number */ |
368 | 179k | size += 4; /* header_length */ |
369 | 179k | size += 4; /* message_length */ |
370 | 179k | size += 16; /* conversation_id */ |
371 | | |
372 | 179k | switch (r->type) { |
373 | 1.63k | case NEGOEX_MESSAGE_TYPE_INITIATOR_NEGO: |
374 | 4.31k | case NEGOEX_MESSAGE_TYPE_ACCEPTOR_NEGO: |
375 | 4.31k | size += 32; /* random */ |
376 | 4.31k | size += 8; /* protocol_version */ |
377 | 4.31k | size += 8; /* auth_schemes */ |
378 | 4.31k | size += 8; /* extensions */ |
379 | 4.31k | break; |
380 | | |
381 | 1.17k | 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.37k | case NEGOEX_MESSAGE_TYPE_AP_REQUEST: |
385 | 3.37k | size += 16; /* auth_scheme */ |
386 | 3.37k | size += 8; /* exchange */ |
387 | 3.37k | break; |
388 | | |
389 | 1.18k | case NEGOEX_MESSAGE_TYPE_VERIFY: |
390 | 1.18k | size += 16; /* auth_scheme */ |
391 | 1.18k | size += 4; /* checksum.header_length */ |
392 | 1.18k | size += 4; /* checksum.scheme */ |
393 | 1.18k | size += 4; /* checksum.type */ |
394 | 1.18k | size += 8; /* checksum.value */ |
395 | 1.18k | break; |
396 | | |
397 | 170k | case NEGOEX_MESSAGE_TYPE_ALERT: |
398 | 170k | size += 16; /* auth_scheme */ |
399 | 170k | size += 4; /* status */ |
400 | 170k | size += 8; /* alerts */ |
401 | 170k | break; |
402 | 179k | } |
403 | | |
404 | 179k | return size; |
405 | 179k | } |
406 | | |
407 | | enum ndr_err_code ndr_pull_negoex_MESSAGE(struct ndr_pull *ndr, ndr_flags_type ndr_flags, struct negoex_MESSAGE *r) |
408 | 91.1k | { |
409 | 91.1k | uint32_t _save_relative_base_offset = ndr_pull_get_relative_base_offset(ndr); |
410 | 91.1k | uint32_t size_signature_0 = 0; |
411 | 91.1k | uint32_t start_data_size = ndr->data_size; |
412 | 91.1k | uint32_t saved_offset = 0; |
413 | 91.1k | NDR_PULL_CHECK_FLAGS(ndr, ndr_flags); |
414 | 91.1k | if (ndr_flags & NDR_SCALARS) { |
415 | 91.1k | NDR_CHECK(ndr_pull_align(ndr, 5)); |
416 | 91.1k | NDR_CHECK(ndr_pull_setup_relative_base_offset1(ndr, r, ndr->offset)); |
417 | 91.1k | size_signature_0 = 8; |
418 | 91.1k | NDR_CHECK(ndr_pull_charset(ndr, NDR_SCALARS, &r->signature, size_signature_0, sizeof(uint8_t), CH_DOS)); |
419 | 91.1k | NDR_CHECK(ndr_pull_negoex_MESSAGE_TYPE(ndr, NDR_SCALARS, &r->type)); |
420 | 91.1k | NDR_CHECK(ndr_pull_uint32(ndr, NDR_SCALARS, &r->sequence_number)); |
421 | 91.1k | NDR_CHECK(ndr_pull_uint32(ndr, NDR_SCALARS, &r->header_length)); |
422 | 91.1k | NDR_CHECK(ndr_pull_uint32(ndr, NDR_SCALARS, &r->message_length)); |
423 | 91.1k | saved_offset = ndr->offset; |
424 | 91.1k | ndr->offset = ndr->relative_base_offset; |
425 | 91.1k | NDR_PULL_NEED_BYTES(ndr, r->message_length); |
426 | 91.0k | ndr->data_size = ndr->offset + r->message_length; |
427 | 91.0k | ndr->offset = saved_offset; |
428 | 91.0k | NDR_CHECK(ndr_pull_GUID(ndr, NDR_SCALARS, &r->conversation_id)); |
429 | 91.0k | NDR_CHECK(ndr_pull_set_switch_value(ndr, &r->p, r->type)); |
430 | 91.0k | NDR_CHECK(ndr_pull_negoex_PAYLOAD(ndr, NDR_SCALARS, &r->p)); |
431 | 90.7k | NDR_CHECK(ndr_pull_trailer_align(ndr, 5)); |
432 | 90.7k | ndr->offset = ndr->data_size; |
433 | 90.7k | ndr->data_size = start_data_size; |
434 | 90.7k | } |
435 | 90.7k | if (ndr_flags & NDR_BUFFERS) { |
436 | 90.7k | NDR_CHECK(ndr_pull_setup_relative_base_offset2(ndr, r)); |
437 | 90.7k | saved_offset = ndr->offset; |
438 | 90.7k | ndr->offset = ndr->relative_base_offset; |
439 | 90.7k | NDR_PULL_NEED_BYTES(ndr, r->message_length); |
440 | 90.7k | ndr->data_size = ndr->offset + r->message_length; |
441 | 90.7k | ndr->offset = saved_offset; |
442 | 90.7k | NDR_CHECK(ndr_pull_set_switch_value(ndr, &r->p, r->type)); |
443 | 90.7k | NDR_CHECK(ndr_pull_negoex_PAYLOAD(ndr, NDR_BUFFERS, &r->p)); |
444 | 90.6k | ndr->offset = ndr->data_size; |
445 | 90.6k | ndr->data_size = start_data_size; |
446 | 90.6k | } |
447 | 90.6k | ndr_pull_restore_relative_base_offset(ndr, _save_relative_base_offset); |
448 | 90.6k | return NDR_ERR_SUCCESS; |
449 | 90.7k | } |
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.8k | { |
453 | 15.8k | uint32_t cntr_messages_0; |
454 | 15.8k | { |
455 | 15.8k | libndr_flags _flags_save_STRUCT = ndr->flags; |
456 | 15.8k | ndr_set_flags(&ndr->flags, LIBNDR_FLAG_NOALIGN); |
457 | 15.8k | NDR_PUSH_CHECK_FLAGS(ndr, ndr_flags); |
458 | 15.8k | if (ndr_flags & NDR_SCALARS) { |
459 | 15.8k | NDR_CHECK(ndr_push_align(ndr, 5)); |
460 | 104k | for (cntr_messages_0 = 0; cntr_messages_0 < (r->count); cntr_messages_0++) { |
461 | 88.9k | NDR_CHECK(ndr_push_negoex_MESSAGE(ndr, NDR_SCALARS|NDR_BUFFERS, &r->messages[cntr_messages_0])); |
462 | 88.9k | } |
463 | 15.8k | NDR_CHECK(ndr_push_trailer_align(ndr, 5)); |
464 | 15.8k | } |
465 | 15.8k | ndr->flags = _flags_save_STRUCT; |
466 | 15.8k | } |
467 | 0 | return NDR_ERR_SUCCESS; |
468 | 15.8k | } |
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.1k | { |
472 | 16.1k | uint32_t size_messages_0 = 0; |
473 | 16.1k | uint32_t cntr_messages_0; |
474 | 16.1k | TALLOC_CTX *_mem_save_messages_0 = NULL; |
475 | 16.1k | { |
476 | 16.1k | libndr_flags _flags_save_STRUCT = ndr->flags; |
477 | 16.1k | ndr_set_flags(&ndr->flags, LIBNDR_FLAG_NOALIGN); |
478 | 16.1k | NDR_PULL_CHECK_FLAGS(ndr, ndr_flags); |
479 | 16.1k | if (ndr_flags & NDR_SCALARS) { |
480 | 16.1k | uint32_t saved_offset = ndr->offset; |
481 | 16.1k | uint32_t available = 0; |
482 | 16.1k | NDR_CHECK(ndr_pull_align(ndr, 5)); |
483 | 16.1k | r->count = 0; |
484 | 16.1k | available = ndr->data_size - ndr->offset; |
485 | 244k | while (available > 0) { |
486 | 228k | uint32_t length; |
487 | | |
488 | | /* |
489 | | * The common header is 40 bytes |
490 | | * and message_length is at offset 20 |
491 | | */ |
492 | 228k | 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 | 136k | length = 40; |
501 | 136k | } |
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.0k | ndr->offset = saved_offset; |
508 | 16.0k | size_messages_0 = r->count; |
509 | 16.0k | NDR_PULL_ALLOC_N(ndr, r->messages, size_messages_0); |
510 | 16.0k | _mem_save_messages_0 = NDR_PULL_GET_MEM_CTX(ndr); |
511 | 16.0k | NDR_PULL_SET_MEM_CTX(ndr, r->messages, 0); |
512 | 105k | for (cntr_messages_0 = 0; cntr_messages_0 < (size_messages_0); cntr_messages_0++) { |
513 | 90.0k | NDR_CHECK(ndr_pull_negoex_MESSAGE(ndr, NDR_SCALARS|NDR_BUFFERS, &r->messages[cntr_messages_0])); |
514 | 90.0k | } |
515 | 15.8k | NDR_PULL_SET_MEM_CTX(ndr, _mem_save_messages_0, 0); |
516 | 15.8k | NDR_CHECK(ndr_pull_trailer_align(ndr, 5)); |
517 | 15.8k | } |
518 | 15.8k | ndr->flags = _flags_save_STRUCT; |
519 | 15.8k | } |
520 | 0 | return NDR_ERR_SUCCESS; |
521 | 16.1k | } |