Coverage Report

Created: 2025-12-31 06:20

next uncovered line (L), next uncovered region (R), next uncovered branch (B)
/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
}