Coverage Report

Created: 2026-01-16 06:47

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
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
}