Coverage Report

Created: 2025-08-04 07:15

/src/wireshark/epan/dissectors/packet-dcerpc-rs_pgo.c
Line
Count
Source (jump to first uncovered line)
1
/* packet-dcerpc-rs_pgo.c
2
 *
3
 * Routines for dcerpc Afs4Int dissection
4
 * Copyright 2002, Jaime Fournier <Jaime.Fournier@hush.com>
5
 * This information is based off the released idl files from opengroup.
6
 * ftp://ftp.opengroup.org/pub/dce122/dce/src/security.tar.gz  security/idl/rs_pgo.idl
7
 *
8
 * Wireshark - Network traffic analyzer
9
 * By Gerald Combs <gerald@wireshark.org>
10
 * Copyright 1998 Gerald Combs
11
 *
12
 * SPDX-License-Identifier: GPL-2.0-or-later
13
 */
14
15
#include "config.h"
16
17
18
#include <epan/packet.h>
19
#include "packet-dcerpc.h"
20
#include "packet-dcerpc-dce122.h"
21
22
void proto_register_rs_pgo (void);
23
void proto_reg_handoff_rs_pgo (void);
24
25
/*
26
delete
27
dissect_rgy_acct_user_flags_t
28
*/
29
30
static int proto_rs_pgo;
31
static int hf_rs_pgo_opnum;
32
static int hf_rs_var1;
33
static int hf_rs_pgo_query_result_t;
34
static int hf_rs_pgo_query_t;
35
static int hf_rs_pgo_query_key_t;
36
static int hf_error_status_t;
37
static int hf_sec_rgy_pgo_flags_t;
38
static int hf_rs_sec_rgy_pgo_item_t_quota;
39
static int hf_rs_sec_rgy_pgo_item_t_unix_num;
40
static int hf_rs_timeval;
41
static int hf_rs_uuid1;
42
static int hf_sec_rgy_domain_t;
43
static int hf_sec_rgy_name_t_principalName_string;
44
static int hf_sec_rgy_name_t_size;
45
static int hf_sec_rgy_pname_t_principalName_string;
46
static int hf_sec_rgy_pname_t_size;
47
static int hf_rs_pgo_unix_num_key_t;
48
49
static int ett_rs_cache_data_t;
50
static int ett_sec_rgy_domain_t;
51
static int ett_rgy_acct_user_flags_t;
52
static int ett_sec_attr_component_name_t;
53
static int ett_sec_passwd_type_t;
54
static int ett_sec_rgy_acct_admin_flags_t;
55
static int ett_sec_rgy_acct_admin_t;
56
static int ett_sec_rgy_acct_auth_flags_t;
57
static int ett_sec_rgy_acct_key_t;
58
static int ett_sec_rgy_acct_user_t;
59
static int ett_sec_rgy_cursor_t;
60
static int ett_sec_rgy_foreign_id_t;
61
static int ett_sec_rgy_login_name_t;
62
static int ett_sec_rgy_name_t;
63
static int ett_sec_rgy_pgo_item_t;
64
static int ett_sec_rgy_pname_t;
65
static int ett_sec_rgy_sid_t;
66
static int ett_sec_rgy_unix_passwd_buf_t;
67
static int ett_sec_rgy_unix_sid_t;
68
static int ett_sec_timeval_sec_t;
69
static int ett_sec_rgy_pgo_flags_t;
70
static int ett_error_status_t;
71
static int ett_rs_pgo_query_t;
72
static int ett_rs_pgo_query_key_t;
73
static int ett_rs_pgo_id_key_t;
74
static int ett_rs_pgo_unix_num_key_t;
75
static int ett_rs_pgo_query_result_t;
76
static int ett_rs_pgo_result_t;
77
78
79
#define sec_rgy_acct_admin_valid       0x01
80
#define sec_rgy_acct_admin_audit       0x02
81
#define sec_rgy_acct_admin_server      0x04
82
0
#define sec_rgy_acct_admin_client      0x08
83
#define sec_rgy_acct_admin_flags_none  0x00
84
#define sec_rgy_acct_auth_post_dated   0x01
85
#define sec_rgy_acct_auth_forwardable  0x02
86
#define sec_rgy_acct_auth_tgt          0x04
87
#define sec_rgy_acct_auth_renewable    0x08
88
#define sec_rgy_acct_auth_proxiable    0x10
89
#define sec_rgy_acct_auth_dup_skey     0x20
90
#define sec_rgy_acct_auth_user_to_user 0x40
91
#define sec_rgy_acct_auth_flags_none   0x00
92
#define sec_rgy_acct_user_passwd_valid 0x01
93
#define sec_rgy_acct_user_flags_none   0x00
94
#define rs_acct_part_user              0x01
95
#define rs_acct_part_admin             0x02
96
#define rs_acct_part_passwd            0x04
97
#define rs_acct_part_unused            0x08
98
#define rs_acct_part_login_name        0x10
99
#define sec_rgy_pgo_is_an_alias        0x01
100
#define sec_rgy_pgo_is_required        0x02
101
#define sec_rgy_pgo_projlist_ok        0x04
102
#define sec_rgy_pgo_flags_none         0x00
103
#define sec_rgy_acct_user_passwd_valid 0x01
104
#define sec_rgy_acct_user_flags_none   0x00
105
106
static int ett_rs_pgo;
107
108
static e_guid_t uuid_rs_pgo =
109
  { 0x4c878280, 0x3000, 0x0000, {0x0d, 0x00, 0x02, 0x87, 0x14, 0x00, 0x00,
110
                                 0x00}
111
};
112
static uint16_t ver_rs_pgo = 1;
113
114
115
static int
116
dissect_error_status_t (tvbuff_t * tvb, int offset,
117
                        packet_info * pinfo, proto_tree * parent_tree,
118
                        dcerpc_info *di, uint8_t * drep)
119
0
{
120
0
  proto_item *item;
121
0
  proto_tree *tree;
122
0
  int old_offset = offset;
123
0
  uint32_t st;
124
0
  const char *st_str;
125
126
0
  if (di->conformant_run)
127
0
  {
128
0
    return offset;
129
0
  }
130
131
0
  tree = proto_tree_add_subtree(parent_tree, tvb, offset, -1, ett_error_status_t, &item, "error_status_t");
132
133
0
  offset =
134
0
    dissect_ndr_uint32 (tvb, offset, pinfo, tree, di, drep, hf_error_status_t,
135
0
                        &st);
136
0
  st_str = val_to_str_ext (st, &dce_error_vals_ext, "%u");
137
138
0
  col_append_fstr (pinfo->cinfo, COL_INFO, " st:%s ", st_str);
139
140
0
  proto_item_set_len (item, offset - old_offset);
141
0
  return offset;
142
0
}
143
144
145
static int
146
dissect_sec_rgy_pname_t (tvbuff_t * tvb, int offset,
147
                         packet_info * pinfo, proto_tree * parent_tree,
148
                         dcerpc_info *di, uint8_t * drep)
149
0
{
150
151
152
0
  proto_item *item;
153
0
  proto_tree *tree;
154
0
  int old_offset = offset;
155
0
  const uint8_t *principal;
156
0
#define    sec_rgy_pname_t_size 257
157
/*
158
dissect    sec_rgy_pname const signed32        sec_rgy_pname_t_size  = 257; * Include final '\0' *
159
          typedef [string] char sec_rgy_pname_t[sec_rgy_pname_t_size];
160
*/
161
0
  uint32_t string_size;
162
163
0
  if (di->conformant_run)
164
0
    {
165
0
      return offset;
166
0
    }
167
168
169
0
  tree = proto_tree_add_subtree(parent_tree, tvb, offset, -1, ett_sec_rgy_pname_t, &item, "sec_rgy_pname_t");
170
171
0
  offset = dissect_ndr_uint32 (tvb, offset, pinfo, tree, di, drep,
172
0
                               hf_sec_rgy_pname_t_size, &string_size);
173
0
  col_append_fstr (pinfo->cinfo, COL_INFO, " String_size:%u", string_size);
174
0
  if (string_size < sec_rgy_pname_t_size)
175
0
    {
176
/* proto_tree_add_string(tree, id, tvb, start, length, value_ptr); */
177
178
0
      proto_tree_add_item_ret_string(tree, hf_sec_rgy_pname_t_principalName_string,
179
0
                           tvb, offset, string_size, ENC_ASCII|ENC_NA, pinfo->pool, &principal);
180
0
      if (string_size > 1)
181
0
        {
182
0
          col_append_fstr (pinfo->cinfo, COL_INFO, " Principal:%s", principal);
183
0
        }
184
0
      offset += string_size;
185
0
    }
186
0
  else
187
0
    {
188
0
        col_append_fstr (pinfo->cinfo, COL_INFO,
189
0
                         " :FIXME!: Invalid string length of  %u",
190
0
                         string_size);
191
0
    }
192
193
0
  proto_item_set_len (item, offset - old_offset);
194
0
  return offset;
195
0
}
196
197
static int
198
dissect_sec_rgy_pgo_flags_t (tvbuff_t * tvb, int offset,
199
                             packet_info * pinfo, proto_tree * parent_tree,
200
                             dcerpc_info *di, uint8_t * drep)
201
0
{
202
203
/*
204
205
*/
206
207
0
  proto_item *item = NULL;
208
0
  proto_tree *tree = NULL;
209
0
  int old_offset = offset;
210
0
  uint32_t flags;
211
212
/*
213
    typedef bitset  sec_rgy_pgo_flags_t;
214
*/
215
216
0
  if (di->conformant_run)
217
0
    {
218
0
      return offset;
219
0
    }
220
221
222
0
  if (parent_tree)
223
0
    {
224
0
      tree =
225
0
        proto_tree_add_subtree(parent_tree, tvb, offset, -1,
226
0
                             ett_sec_rgy_pgo_flags_t, &item, "sec_rgy_pgo_flags_t ");
227
0
    }
228
229
0
  offset =
230
0
    dissect_ndr_uint32(tvb, offset, pinfo, tree, di, drep,
231
0
                        hf_sec_rgy_pgo_flags_t, &flags);
232
233
/*
234
     *
235
     * s e c _ r g y _ p g o _ f l a g s _ t
236
     *
237
238
        * pgo item is an alias *
239
        const unsigned32 sec_rgy_pgo_is_an_alias  = 0x1;
240
241
        * pgo item is required - cannot be deleted *
242
        const unsigned32 sec_rgy_pgo_is_required  = 0x2;
243
244
        *
245
         * projlist_ok: on person items indicates person can have a concurrent
246
         * group set on group items indicates this group can appear on a
247
         * concurrent group set.  On org items this flag is undefined.
248
         *
249
        const unsigned32 sec_rgy_pgo_projlist_ok = 0x4;
250
251
        *
252
        * bits 4-32 unused
253
        *
254
        const unsigned32 sec_rgy_pgo_flags_none = 0;
255
*/
256
0
#define sec_rgy_pgo_is_an_alias   0x01
257
0
#define sec_rgy_pgo_is_required   0x02
258
0
#define sec_rgy_pgo_projlist_ok   0x04
259
0
#define sec_rgy_pgo_flags_none    0x00
260
261
262
0
  col_append_str (pinfo->cinfo, COL_INFO, " PgoFlags=");
263
0
  if ((flags & sec_rgy_pgo_is_an_alias) == sec_rgy_pgo_is_an_alias)
264
0
    {
265
0
      col_append_str (pinfo->cinfo, COL_INFO, ":IS_AN_ALIAS");
266
0
    }
267
0
  if ((flags & sec_rgy_pgo_is_required) == sec_rgy_pgo_is_required)
268
0
    {
269
0
      col_append_str (pinfo->cinfo, COL_INFO, ":IS_REQUIRED");
270
0
    }
271
0
  if ((flags & sec_rgy_pgo_projlist_ok) == sec_rgy_pgo_projlist_ok)
272
0
    {
273
0
      col_append_str (pinfo->cinfo, COL_INFO, ":PROJLIST_OK");
274
0
    }
275
0
  if ((flags & sec_rgy_acct_admin_client) == sec_rgy_acct_admin_client)
276
0
    {
277
0
      col_append_str (pinfo->cinfo, COL_INFO, ":NONE");
278
0
    }
279
0
  if ((flags & sec_rgy_pgo_flags_none) == sec_rgy_pgo_flags_none)
280
0
    {
281
0
      col_append_str (pinfo->cinfo, COL_INFO, ":NONE");
282
0
    }
283
284
0
  proto_item_set_len (item, offset - old_offset);
285
0
  return offset;
286
0
}
287
288
289
290
291
static int
292
dissect_rs_cache_data_t (tvbuff_t * tvb, int offset,
293
                         packet_info * pinfo, proto_tree * parent_tree,
294
                         dcerpc_info *di, uint8_t * drep)
295
0
{
296
297
/*
298
    typedef struct {
299
        uuid_t              site_id;
300
        sec_timeval_sec_t   person_dtm;
301
        sec_timeval_sec_t   group_dtm;
302
        sec_timeval_sec_t   org_dtm;
303
    } rs_cache_data_t;
304
*/
305
306
307
0
  proto_item *item = NULL;
308
0
  proto_tree *tree = NULL;
309
0
  int old_offset = offset;
310
0
  uint32_t person_dtm, group_dtm, org_dtm;
311
0
  e_guid_t uuid1;
312
313
314
0
  if (di->conformant_run)
315
0
    {
316
0
      return offset;
317
0
    }
318
319
320
0
  if (parent_tree)
321
0
    {
322
0
      tree =
323
0
        proto_tree_add_subtree(parent_tree, tvb, offset, -1, ett_rs_cache_data_t, &item, "rs_cache_data_t");
324
0
    }
325
326
327
0
  offset =
328
0
    dissect_ndr_uuid_t(tvb, offset, pinfo, tree, di, drep, hf_rs_uuid1, &uuid1);
329
0
  offset =
330
0
    dissect_dcerpc_time_t (tvb, offset, pinfo, tree, drep, hf_rs_timeval,
331
0
                           &person_dtm);
332
0
  offset =
333
0
    dissect_dcerpc_time_t (tvb, offset, pinfo, tree, drep, hf_rs_timeval,
334
0
                           &group_dtm);
335
0
  offset =
336
0
    dissect_dcerpc_time_t (tvb, offset, pinfo, tree, drep, hf_rs_timeval,
337
0
                           &org_dtm);
338
339
0
  col_append_fstr (pinfo->cinfo, COL_INFO,
340
0
                     " siteid %08x-%04x-%04x-%02x%02x-%02x%02x%02x%02x%02x%02x person_dtm:%u group_dtm:%u org_dtm:%u",
341
0
                     uuid1.data1, uuid1.data2, uuid1.data3, uuid1.data4[0],
342
0
                     uuid1.data4[1], uuid1.data4[2], uuid1.data4[3],
343
0
                     uuid1.data4[4], uuid1.data4[5], uuid1.data4[6],
344
0
                     uuid1.data4[7], person_dtm, group_dtm, org_dtm);
345
346
0
  proto_item_set_len (item, offset - old_offset);
347
0
  return offset;
348
0
}
349
350
351
352
static int
353
dissect_sec_rgy_name_t (tvbuff_t * tvb, int offset,
354
                        packet_info * pinfo, proto_tree * parent_tree,
355
                        dcerpc_info *di, uint8_t * drep)
356
0
{
357
358
359
0
  proto_item *item;
360
0
  proto_tree *tree;
361
0
  int old_offset = offset;
362
0
  const uint8_t *principal;
363
0
#define    sec_rgy_name_t_size  1025
364
/*    typedef [string] char sec_rgy_name_t[sec_rgy_name_t_size]; */
365
0
  uint32_t string_size;
366
367
0
  if (di->conformant_run)
368
0
    {
369
0
      return offset;
370
0
    }
371
372
373
0
  tree = proto_tree_add_subtree(parent_tree, tvb, offset, -1, ett_sec_rgy_name_t, &item, "sec_rgy_name_t");
374
375
0
  offset =
376
0
    dissect_ndr_uint32(tvb, offset, pinfo, tree, di, drep,
377
0
                        hf_sec_rgy_name_t_size, &string_size);
378
0
  col_append_fstr (pinfo->cinfo, COL_INFO, " String_size:%u", string_size);
379
0
  if (string_size < sec_rgy_name_t_size)
380
0
    {
381
/* proto_tree_add_string(tree, id, tvb, start, length, value_ptr); */
382
383
0
      proto_tree_add_item_ret_string(tree, hf_sec_rgy_name_t_principalName_string,
384
0
                           tvb, offset, string_size, ENC_ASCII|ENC_NA, pinfo->pool, &principal);
385
0
      if (string_size > 1)
386
0
        {
387
0
          col_append_fstr (pinfo->cinfo, COL_INFO, " Principal:%s", principal);
388
0
        }
389
0
      offset += string_size;
390
0
    }
391
0
  else
392
0
    {
393
0
        col_append_fstr (pinfo->cinfo, COL_INFO,
394
0
                         " :FIXME!: Invalid string length of  %u",
395
0
                         string_size);
396
0
    }
397
398
0
  proto_item_set_len (item, offset - old_offset);
399
0
  return offset;
400
0
}
401
402
403
static int
404
dissect_sec_rgy_domain_t (tvbuff_t * tvb, int offset,
405
                          packet_info * pinfo, proto_tree * parent_tree,
406
                          dcerpc_info *di, uint8_t * drep)
407
0
{
408
409
/*
410
    typedef signed32    sec_rgy_domain_t;
411
*/
412
413
0
  proto_item *item = NULL;
414
0
  proto_tree *tree = NULL;
415
0
  int old_offset = offset;
416
0
  uint32_t domain_t;
417
418
0
  if (di->conformant_run)
419
0
    {
420
0
      return offset;
421
0
    }
422
423
424
0
  if (parent_tree)
425
0
    {
426
0
      tree =
427
0
        proto_tree_add_subtree(parent_tree, tvb, offset, -1, ett_sec_rgy_domain_t, &item, "sec_rgy_domain_t");
428
0
    }
429
430
431
0
  offset =
432
0
    dissect_ndr_uint32(tvb, offset, pinfo, tree, di, drep, hf_sec_rgy_domain_t,
433
0
                        &domain_t);
434
435
0
  col_append_fstr (pinfo->cinfo, COL_INFO, " sec_rgy_domain_t:%u",
436
0
                     domain_t);
437
438
439
0
  proto_item_set_len (item, offset - old_offset);
440
0
  return offset;
441
0
}
442
443
static int
444
dissect_sec_rgy_pgo_item_t (tvbuff_t * tvb, int offset,
445
                            packet_info * pinfo, proto_tree * parent_tree,
446
                            dcerpc_info *di, uint8_t * drep)
447
0
{
448
449
/*
450
    typedef struct {
451
        uuid_t              id;
452
        signed32            unix_num;
453
        signed32            quota;
454
        sec_rgy_pgo_flags_t flags;
455
        sec_rgy_pname_t     fullname;
456
    }               sec_rgy_pgo_item_t;
457
458
*/
459
460
0
  proto_item *item = NULL;
461
0
  proto_tree *tree = NULL;
462
0
  int old_offset = offset;
463
0
  e_guid_t id;
464
0
  uint32_t unix_num, quota;
465
466
0
  if (di->conformant_run)
467
0
    {
468
0
      return offset;
469
0
    }
470
471
472
0
  if (parent_tree)
473
0
    {
474
0
      tree =
475
0
        proto_tree_add_subtree(parent_tree, tvb, offset, -1,
476
0
                             ett_sec_rgy_pgo_item_t, &item, " sec_rgy_pgo_item_t ");
477
0
    }
478
479
0
  offset =
480
0
    dissect_ndr_uuid_t(tvb, offset, pinfo, tree, di, drep, hf_rs_uuid1, &id);
481
0
  offset =
482
0
    dissect_ndr_uint32(tvb, offset, pinfo, tree, di, drep,
483
0
                        hf_rs_sec_rgy_pgo_item_t_unix_num, &unix_num);
484
0
  offset =
485
0
    dissect_ndr_uint32(tvb, offset, pinfo, tree, di, drep,
486
0
                        hf_rs_sec_rgy_pgo_item_t_quota, &quota);
487
0
  offset = dissect_sec_rgy_pgo_flags_t (tvb, offset, pinfo, tree, di, drep);
488
0
  offset += 4;                  /* XXX */
489
0
  offset = dissect_sec_rgy_pname_t (tvb, offset, pinfo, tree, di, drep);
490
491
0
  col_append_fstr (pinfo->cinfo, COL_INFO,
492
0
                     " sec_rgy_pgo_item_t - id %08x-%04x-%04x-%02x%02x-%02x%02x%02x%02x%02x%02x unix_num:%u quota:%u",
493
0
                     id.data1, id.data2, id.data3, id.data4[0],
494
0
                     id.data4[1], id.data4[2], id.data4[3],
495
0
                     id.data4[4], id.data4[5], id.data4[6],
496
0
                     id.data4[7], unix_num, quota);
497
498
0
  proto_item_set_len (item, offset - old_offset);
499
0
  return offset;
500
0
}
501
502
503
static int
504
dissect_sec_rgy_cursor_t (tvbuff_t * tvb, int offset,
505
                          packet_info * pinfo, proto_tree * parent_tree,
506
                          dcerpc_info *di, uint8_t * drep)
507
0
{
508
509
/*
510
     * Database cursor for iterative operations
511
     *
512
    typedef struct {
513
        uuid_t          source;
514
        signed32        handle;
515
        boolean32       valid;
516
    }               sec_rgy_cursor_t;
517
518
519
*/
520
521
0
  proto_item *item = NULL;
522
0
  proto_tree *tree = NULL;
523
0
  int old_offset = offset;
524
0
  e_guid_t source;
525
0
  uint32_t handle, valid;
526
527
0
  if (di->conformant_run)
528
0
    {
529
0
      return offset;
530
0
    }
531
532
533
0
  if (parent_tree)
534
0
    {
535
0
      tree =
536
0
        proto_tree_add_subtree(parent_tree, tvb, offset, -1,
537
0
                             ett_sec_rgy_cursor_t, &item, " sec_rgy_cursor_t ");
538
0
    }
539
540
0
  offset =
541
0
    dissect_ndr_uuid_t(tvb, offset, pinfo, tree, di, drep, hf_rs_uuid1, &source);
542
0
  offset =
543
0
    dissect_ndr_uint32(tvb, offset, pinfo, tree, di, drep,
544
0
                        hf_rs_sec_rgy_pgo_item_t_unix_num, &handle);
545
0
  offset =
546
0
    dissect_ndr_uint32(tvb, offset, pinfo, tree, di, drep,
547
0
                        hf_rs_sec_rgy_pgo_item_t_quota, &valid);
548
549
0
  col_append_fstr (pinfo->cinfo, COL_INFO,
550
0
                     " sec_rgy_cursor_t - source %08x-%04x-%04x-%02x%02x-%02x%02x%02x%02x%02x%02x handle:%u valid:%u",
551
0
                     source.data1, source.data2, source.data3,
552
0
                     source.data4[0], source.data4[1], source.data4[2],
553
0
                     source.data4[3], source.data4[4], source.data4[5],
554
0
                     source.data4[6], source.data4[7], handle, valid);
555
556
0
  proto_item_set_len (item, offset - old_offset);
557
0
  return offset;
558
0
}
559
560
static int
561
dissect_rs_pgo_query_t (tvbuff_t * tvb, int offset,
562
                        packet_info * pinfo, proto_tree * parent_tree,
563
                        dcerpc_info *di, uint8_t * drep)
564
0
{
565
566
0
  enum
567
0
  {
568
0
    rs_pgo_query_name,
569
0
    rs_pgo_query_id,
570
0
    rs_pgo_query_unix_num,
571
0
    rs_pgo_query_next,
572
0
    rs_pgo_query_none
573
0
  };
574
575
576
0
  proto_item *item = NULL;
577
0
  proto_tree *tree = NULL;
578
0
  int old_offset = offset;
579
0
  uint8_t query_t;
580
581
0
  if (di->conformant_run)
582
0
    {
583
0
      return offset;
584
0
    }
585
586
587
0
  if (parent_tree)
588
0
    {
589
0
      tree =
590
0
        proto_tree_add_subtree(parent_tree, tvb, offset, -1, ett_rs_pgo_query_t, &item, "rs_pgo_query_t ");
591
0
    }
592
0
  offset =
593
0
    dissect_ndr_uint8 (tvb, offset, pinfo, tree, di, drep, hf_rs_pgo_query_t,
594
0
                       &query_t);
595
0
  col_append_str (pinfo->cinfo, COL_INFO, " rs_pgo_query_t:");
596
597
0
  switch (query_t)
598
0
    {
599
0
    case rs_pgo_query_name:
600
0
      col_append_str (pinfo->cinfo, COL_INFO, "NAME");
601
0
      break;
602
0
    case rs_pgo_query_id:
603
0
      col_append_str (pinfo->cinfo, COL_INFO, "ID");
604
0
      break;
605
0
    case rs_pgo_query_unix_num:
606
0
      col_append_str (pinfo->cinfo, COL_INFO, "UNIX_NUM");
607
0
      break;
608
0
    case rs_pgo_query_next:
609
0
      col_append_str (pinfo->cinfo, COL_INFO, "NEXT");
610
0
      break;
611
0
    case rs_pgo_query_none:
612
0
      col_append_str (pinfo->cinfo, COL_INFO, "NONE");
613
0
      break;
614
0
    default:
615
0
          col_append_fstr (pinfo->cinfo, COL_INFO, " unknown:%u", query_t);
616
0
      break;
617
0
      ;
618
0
    }
619
620
621
0
  proto_item_set_len (item, offset - old_offset);
622
0
  return offset;
623
0
}
624
static int
625
dissect_rs_pgo_id_key_t (tvbuff_t * tvb, int offset,
626
                         packet_info * pinfo, proto_tree * parent_tree,
627
                         dcerpc_info *di, uint8_t * drep)
628
0
{
629
630
/*
631
    typedef struct {
632
        uuid_t          id;
633
        sec_rgy_name_t  scope;
634
    } rs_pgo_id_key_t;
635
636
*/
637
638
0
  proto_item *item = NULL;
639
0
  proto_tree *tree = NULL;
640
0
  int old_offset = offset;
641
0
  e_guid_t id;
642
643
0
  if (di->conformant_run)
644
0
    {
645
0
      return offset;
646
0
    }
647
648
649
0
  if (parent_tree)
650
0
    {
651
0
      tree =
652
0
        proto_tree_add_subtree(parent_tree, tvb, offset, -1,
653
0
                             ett_rs_pgo_id_key_t, &item, "rs_pgo_id_key_t ");
654
0
    }
655
656
0
  offset =
657
0
    dissect_ndr_uuid_t(tvb, offset, pinfo, tree, di, drep, hf_rs_uuid1, &id);
658
0
  offset = dissect_sec_rgy_name_t (tvb, offset, pinfo, tree, di, drep);
659
660
0
  col_append_fstr (pinfo->cinfo, COL_INFO,
661
0
                     " rs_pgo_id_key_t - id %08x-%04x-%04x-%02x%02x-%02x%02x%02x%02x%02x%02x",
662
0
                     id.data1, id.data2, id.data3, id.data4[0],
663
0
                     id.data4[1], id.data4[2], id.data4[3],
664
0
                     id.data4[4], id.data4[5], id.data4[6], id.data4[7]);
665
666
0
  proto_item_set_len (item, offset - old_offset);
667
0
  return offset;
668
0
}
669
670
671
static int
672
dissect_rs_pgo_result_t (tvbuff_t * tvb, int offset,
673
                         packet_info * pinfo, proto_tree * parent_tree,
674
                         dcerpc_info *di, uint8_t * drep)
675
0
{
676
677
/*
678
    typedef struct {
679
        sec_rgy_name_t      name;
680
        sec_rgy_pgo_item_t  item;
681
    } rs_pgo_result_t;
682
683
684
*/
685
686
0
  proto_item *item = NULL;
687
0
  proto_tree *tree = NULL;
688
0
  int old_offset = offset;
689
690
0
  if (di->conformant_run)
691
0
    {
692
0
      return offset;
693
0
    }
694
695
0
  if (parent_tree)
696
0
    {
697
0
      tree =
698
0
        proto_tree_add_subtree(parent_tree, tvb, offset, -1,
699
0
                             ett_rs_pgo_result_t, &item, "rs_pgo_result_t ");
700
0
    }
701
702
0
  offset = dissect_sec_rgy_name_t (tvb, offset, pinfo, tree, di, drep);
703
0
  offset = dissect_sec_rgy_pgo_item_t (tvb, offset, pinfo, tree, di, drep);
704
705
0
  proto_item_set_len (item, offset - old_offset);
706
0
  return offset;
707
0
}
708
709
710
711
static int
712
dissect_rs_pgo_unix_num_key_t (tvbuff_t * tvb, int offset,
713
                               packet_info * pinfo, proto_tree * parent_tree,
714
                               dcerpc_info *di, uint8_t * drep)
715
0
{
716
717
/*
718
    typedef struct {
719
        signed32        unix_num;
720
        sec_rgy_name_t  scope;
721
    } rs_pgo_unix_num_key_t;
722
723
724
r
725
726
*/
727
728
0
  proto_item *item = NULL;
729
0
  proto_tree *tree = NULL;
730
0
  int old_offset = offset;
731
0
  uint32_t rs_pgo_unix_num_key_t;
732
733
0
  if (di->conformant_run)
734
0
    {
735
0
      return offset;
736
0
    }
737
738
739
0
  if (parent_tree)
740
0
    {
741
0
      tree =
742
0
        proto_tree_add_subtree(parent_tree, tvb, offset, -1,
743
0
                             ett_rs_pgo_unix_num_key_t, &item, " rs_pgo_unix_num_key_t ");
744
0
    }
745
746
0
  offset =
747
0
    dissect_ndr_uint32(tvb, offset, pinfo, tree, di, drep,
748
0
                        hf_rs_pgo_unix_num_key_t, &rs_pgo_unix_num_key_t);
749
0
  offset = dissect_sec_rgy_name_t (tvb, offset, pinfo, tree, di, drep);
750
751
0
  col_append_fstr (pinfo->cinfo, COL_INFO,
752
0
                     " rs_pgo_unix_num_key_t:%u", rs_pgo_unix_num_key_t);
753
754
0
  proto_item_set_len (item, offset - old_offset);
755
0
  return offset;
756
0
}
757
758
759
static int
760
dissect_rs_pgo_query_key_t (tvbuff_t * tvb, int offset,
761
                            packet_info * pinfo, proto_tree * parent_tree,
762
                            dcerpc_info *di, uint8_t * drep)
763
0
{
764
765
0
  enum
766
0
  {
767
0
    rs_pgo_query_name,
768
0
    rs_pgo_query_id,
769
0
    rs_pgo_query_unix_num,
770
0
    rs_pgo_query_next,
771
0
    rs_pgo_query_none
772
0
  };
773
/*
774
    typedef union switch (rs_pgo_query_t query) tagged_union {
775
        case rs_pgo_query_name:
776
            sec_rgy_name_t              name;
777
778
        case rs_pgo_query_id:
779
            rs_pgo_id_key_t             id_key;
780
781
        case rs_pgo_query_unix_num:
782
            rs_pgo_unix_num_key_t       unix_num_key;
783
784
        case rs_pgo_query_next:
785
            sec_rgy_name_t              scope;
786
787
        default:
788
            ;                       * empty branch of union *
789
790
    } rs_pgo_query_key_t;
791
*/
792
793
794
0
  proto_item *item = NULL;
795
0
  proto_tree *tree = NULL;
796
0
  int old_offset = offset;
797
0
  uint16_t query_t;
798
799
0
  if (di->conformant_run)
800
0
    {
801
0
      return offset;
802
0
    }
803
804
805
0
  if (parent_tree)
806
0
    {
807
0
      tree =
808
0
        proto_tree_add_subtree(parent_tree, tvb, offset, -1,
809
0
                             ett_rs_pgo_query_key_t, &item, "rs_pgo_query_key_t ");
810
0
    }
811
0
  offset =
812
0
    dissect_ndr_uint16 (tvb, offset, pinfo, tree, di, drep, hf_rs_pgo_query_key_t,
813
0
                        &query_t);
814
0
  col_append_str (pinfo->cinfo, COL_INFO, " rs_pgo_query_key_t:");
815
0
  offset += 4;
816
0
  switch (query_t)
817
0
    {
818
0
    case rs_pgo_query_name:
819
0
      col_append_str (pinfo->cinfo, COL_INFO, "NAME");
820
0
      offset = dissect_sec_rgy_name_t (tvb, offset, pinfo, tree, di, drep);
821
0
      break;
822
0
    case rs_pgo_query_id:
823
0
      col_append_str (pinfo->cinfo, COL_INFO, "ID");
824
0
      offset = dissect_rs_pgo_id_key_t (tvb, offset, pinfo, tree, di, drep);
825
0
      break;
826
0
    case rs_pgo_query_unix_num:
827
0
      col_append_str (pinfo->cinfo, COL_INFO, "UNIX_NUM");
828
0
      offset = dissect_rs_pgo_unix_num_key_t (tvb, offset, pinfo, tree, di, drep);
829
0
      break;
830
0
    case rs_pgo_query_next:
831
0
      col_append_str (pinfo->cinfo, COL_INFO, "NEXT");
832
0
      offset = dissect_sec_rgy_name_t (tvb, offset, pinfo, tree, di, drep);
833
0
      break;
834
0
    case rs_pgo_query_none:
835
0
      col_append_str (pinfo->cinfo, COL_INFO, "NONE");
836
0
      break;
837
838
0
    default:
839
0
      col_append_fstr (pinfo->cinfo, COL_INFO, " unknown:%u", query_t);
840
0
      break;
841
0
    }
842
843
0
  proto_item_set_len (item, offset - old_offset);
844
0
  return offset;
845
0
}
846
847
848
static int
849
dissect_rs_pgo_query_result_t (tvbuff_t * tvb, int offset,
850
                               packet_info * pinfo, proto_tree * parent_tree,
851
                               dcerpc_info *di, uint8_t * drep)
852
0
{
853
0
  proto_item *item = NULL;
854
0
  proto_tree *tree = NULL;
855
0
  int old_offset = offset;
856
0
  uint32_t st;
857
0
  const char *status;
858
0
#define error_status_ok 0
859
860
  /*
861
     typedef union switch (signed32 status) tagged_union {
862
     case error_status_ok:
863
     rs_pgo_result_t     result;
864
865
     default:
866
     ;                      * empty branch of union *
867
868
     } rs_pgo_query_result_t;
869
   */
870
871
0
  if (di->conformant_run)
872
0
    {
873
0
      return offset;
874
0
    }
875
876
0
  if (parent_tree)
877
0
    {
878
0
      tree = proto_tree_add_subtree(parent_tree, tvb, offset, -1,
879
0
                                  ett_rs_pgo_query_result_t, &item, "rs_pgo_query_result_t");
880
0
    }
881
882
0
  offset =
883
0
    dissect_ndr_uint32(tvb, offset, pinfo, tree, di, drep,
884
0
                        hf_rs_pgo_query_result_t, &st);
885
0
  status = val_to_str_ext (st, &dce_error_vals_ext, "%u");
886
887
0
  col_append_fstr (pinfo->cinfo, COL_INFO, " status:%s ", status);
888
889
0
  offset += 4;                  /* XXX */
890
891
0
  switch (st)
892
0
    {
893
0
    case error_status_ok:
894
0
      offset = dissect_rs_pgo_result_t (tvb, offset, pinfo, tree, di, drep);
895
0
      break;
896
0
    default:
897
0
      ;
898
899
0
    }
900
901
0
  proto_item_set_len (item, offset - old_offset);
902
0
  return offset;
903
0
}
904
905
906
907
static int
908
rs_pgo_dissect_add_rqst (tvbuff_t * tvb, int offset,
909
                         packet_info * pinfo, proto_tree * tree,
910
                         dcerpc_info *di, uint8_t * drep)
911
0
{
912
0
  if (di->conformant_run)
913
0
    {
914
0
      return offset;
915
0
    }
916
917
/*
918
        [in]        sec_rgy_domain_t    name_domain,
919
        [in]        sec_rgy_name_t      pgo_name,
920
        [in]        sec_rgy_pgo_item_t  *pgo_item,
921
*/
922
923
0
  offset = dissect_sec_rgy_domain_t (tvb, offset, pinfo, tree, di, drep);
924
0
  offset += 4;
925
0
  offset = dissect_sec_rgy_name_t (tvb, offset, pinfo, tree, di, drep);
926
0
  offset =
927
0
    dissect_ndr_pointer(tvb, offset, pinfo, tree, di, drep,
928
0
                         dissect_sec_rgy_pgo_item_t, NDR_POINTER_REF,
929
0
                         "sec_rgy_pgo_item_t: ", -1);
930
931
0
  return offset;
932
0
}
933
static int
934
rs_pgo_dissect_add_resp (tvbuff_t * tvb, int offset,
935
                         packet_info * pinfo, proto_tree * tree,
936
                         dcerpc_info *di, uint8_t * drep)
937
0
{
938
0
  int          buff_remain;
939
940
0
  if (di->conformant_run)
941
0
    {
942
0
      return offset;
943
0
    }
944
945
/*
946
        [out]       rs_cache_data_t     *cache_info,
947
        [out]       error_status_t      *status
948
*/
949
950
0
 buff_remain = tvb_captured_length_remaining(tvb, offset);
951
952
/* found several add_member responses that had 8 bytes of data. first was 4 0's and last was 3 zeros and a 1 */
953
0
if (buff_remain > 8) {
954
0
  offset =
955
0
    dissect_ndr_pointer(tvb, offset, pinfo, tree, di, drep,
956
0
                         dissect_rs_cache_data_t, NDR_POINTER_REF,
957
0
                         "cache_info: ", -1);
958
0
}
959
0
  offset =
960
0
    dissect_ndr_pointer(tvb, offset, pinfo, tree, di, drep,
961
0
                         dissect_error_status_t, NDR_POINTER_REF, "status: ",
962
0
                         -1);
963
0
  return offset;
964
0
}
965
966
static int
967
rs_pgo_dissect_delete_rqst (tvbuff_t * tvb, int offset,
968
                            packet_info * pinfo, proto_tree * tree,
969
                            dcerpc_info *di, uint8_t * drep)
970
0
{
971
0
  if (di->conformant_run)
972
0
    {
973
0
      return offset;
974
0
    }
975
976
/*
977
        [in]        sec_rgy_domain_t    name_domain,
978
        [in]        sec_rgy_name_t      pgo_name,
979
*/
980
0
  offset = dissect_sec_rgy_domain_t (tvb, offset, pinfo, tree, di, drep);
981
0
  offset = dissect_sec_rgy_name_t (tvb, offset, pinfo, tree, di, drep);
982
983
0
  return offset;
984
0
}
985
986
static int
987
rs_pgo_dissect_delete_resp (tvbuff_t * tvb, int offset,
988
                            packet_info * pinfo, proto_tree * tree,
989
                            dcerpc_info *di, uint8_t * drep)
990
0
{
991
0
  int          buff_remain;
992
993
0
  if (di->conformant_run)
994
0
    {
995
0
      return offset;
996
0
    }
997
998
/*
999
        [out]       rs_cache_data_t     *cache_info,
1000
        [out]       error_status_t      *status
1001
*/
1002
0
 buff_remain = tvb_captured_length_remaining(tvb, offset);
1003
1004
/* found several add_member responses that had 8 bytes of data. first was 4 0's and last was 3 zeros and a 1 */
1005
1006
0
  if (buff_remain > 8) {
1007
0
  offset =
1008
0
    dissect_ndr_pointer(tvb, offset, pinfo, tree, di, drep,
1009
0
                         dissect_rs_cache_data_t, NDR_POINTER_REF,
1010
0
                         "cache_info:", -1);
1011
0
  }
1012
1013
0
  offset =
1014
0
    dissect_ndr_pointer(tvb, offset, pinfo, tree, di, drep,
1015
0
                         dissect_error_status_t, NDR_POINTER_REF, "status:",
1016
0
                         -1);
1017
1018
0
  return offset;
1019
0
}
1020
1021
static int
1022
rs_pgo_dissect_replace_rqst (tvbuff_t * tvb, int offset,
1023
                             packet_info * pinfo, proto_tree * tree,
1024
                             dcerpc_info *di, uint8_t * drep)
1025
0
{
1026
0
  if (di->conformant_run)
1027
0
    {
1028
0
      return offset;
1029
0
    }
1030
1031
/*
1032
        [in]        sec_rgy_domain_t    name_domain,
1033
        [in]        sec_rgy_name_t      pgo_name,
1034
        [in]        sec_rgy_pgo_item_t  *pgo_item,
1035
*/
1036
0
  offset = dissect_sec_rgy_domain_t (tvb, offset, pinfo, tree, di, drep);
1037
0
  offset = dissect_sec_rgy_name_t (tvb, offset, pinfo, tree, di, drep);
1038
0
  offset =
1039
0
    dissect_ndr_pointer(tvb, offset, pinfo, tree, di, drep,
1040
0
                         dissect_sec_rgy_pgo_item_t, NDR_POINTER_REF,
1041
0
                         "pgo_item:", -1);
1042
1043
0
  return offset;
1044
0
}
1045
1046
static int
1047
rs_pgo_dissect_replace_resp (tvbuff_t * tvb, int offset,
1048
                             packet_info * pinfo, proto_tree * tree,
1049
                             dcerpc_info *di, uint8_t * drep)
1050
0
{
1051
0
  if (di->conformant_run)
1052
0
    {
1053
0
      return offset;
1054
0
    }
1055
1056
/*
1057
        [out]       rs_cache_data_t     *cache_info,
1058
        [out]       error_status_t      *status
1059
1060
*/
1061
1062
0
  offset =
1063
0
    dissect_ndr_pointer(tvb, offset, pinfo, tree, di, drep,
1064
0
                         dissect_rs_cache_data_t, NDR_POINTER_REF,
1065
0
                         "cache_info:", -1);
1066
0
  offset =
1067
0
    dissect_ndr_pointer(tvb, offset, pinfo, tree, di, drep,
1068
0
                         dissect_error_status_t, NDR_POINTER_REF, "status:",
1069
0
                         -1);
1070
1071
0
  return offset;
1072
0
}
1073
1074
1075
static int
1076
rs_pgo_dissect_add_member_rqst (tvbuff_t * tvb, int offset,
1077
                                packet_info * pinfo, proto_tree * tree,
1078
                                dcerpc_info *di, uint8_t * drep)
1079
0
{
1080
0
  if (di->conformant_run)
1081
0
    {
1082
0
      return offset;
1083
0
    }
1084
1085
1086
1087
/*
1088
        [in]        sec_rgy_domain_t    name_domain,
1089
        [in]        sec_rgy_name_t      go_name,
1090
        [in]        sec_rgy_name_t      person_name,
1091
*/
1092
1093
0
  offset = dissect_sec_rgy_domain_t (tvb, offset, pinfo, tree, di, drep);
1094
0
  offset = dissect_sec_rgy_name_t (tvb, offset, pinfo, tree, di, drep);
1095
0
  offset = dissect_sec_rgy_name_t (tvb, offset, pinfo, tree, di, drep);
1096
1097
1098
0
  return offset;
1099
1100
0
}
1101
static int
1102
rs_pgo_dissect_rename_rqst (tvbuff_t * tvb, int offset,
1103
                            packet_info * pinfo, proto_tree * tree,
1104
                            dcerpc_info *di, uint8_t * drep)
1105
0
{
1106
0
  if (di->conformant_run)
1107
0
    {
1108
0
      return offset;
1109
0
    }
1110
1111
/*
1112
        [in]        sec_rgy_domain_t    name_domain,
1113
        [in]        sec_rgy_name_t      old_name,
1114
        [in]        sec_rgy_name_t      new_name,
1115
*/
1116
0
  offset = dissect_sec_rgy_domain_t (tvb, offset, pinfo, tree, di, drep);
1117
0
  offset = dissect_sec_rgy_name_t (tvb, offset, pinfo, tree, di, drep);
1118
0
  offset = dissect_sec_rgy_name_t (tvb, offset, pinfo, tree, di, drep);
1119
1120
1121
0
  return offset;
1122
0
}
1123
1124
static int
1125
rs_pgo_dissect_rename_resp (tvbuff_t * tvb, int offset,
1126
                            packet_info * pinfo, proto_tree * tree,
1127
                            dcerpc_info *di, uint8_t * drep)
1128
0
{
1129
0
  if (di->conformant_run)
1130
0
    {
1131
0
      return offset;
1132
0
    }
1133
1134
/*
1135
        [out]       rs_cache_data_t     *cache_info,
1136
        [out]       error_status_t      *status
1137
*/
1138
0
  offset =
1139
0
    dissect_ndr_pointer(tvb, offset, pinfo, tree, di, drep,
1140
0
                         dissect_rs_cache_data_t, NDR_POINTER_REF,
1141
0
                         "cache_info:", -1);
1142
0
  offset =
1143
0
    dissect_ndr_pointer(tvb, offset, pinfo, tree, di, drep,
1144
0
                         dissect_error_status_t, NDR_POINTER_REF, "status:",
1145
0
                         -1);
1146
1147
0
  return offset;
1148
0
}
1149
1150
1151
static int
1152
rs_pgo_dissect_add_member_resp (tvbuff_t * tvb, int offset,
1153
                                packet_info * pinfo, proto_tree * tree,
1154
                                dcerpc_info *di, uint8_t * drep)
1155
0
{
1156
0
  int          buff_remain;
1157
1158
0
  if (di->conformant_run)
1159
0
    {
1160
0
      return offset;
1161
0
    }
1162
1163
/*
1164
        [out]       rs_cache_data_t     *cache_info,
1165
        [out]       error_status_t      *status
1166
*/
1167
1168
0
 buff_remain = tvb_captured_length_remaining(tvb, offset);
1169
1170
/* found several add responses that had 8 bytes of data. first was 4 0's and last was 3 zeros and a 1 */
1171
0
if (buff_remain > 8) {
1172
1173
0
  offset =
1174
0
    dissect_ndr_pointer(tvb, offset, pinfo, tree, di, drep,
1175
0
                         dissect_rs_cache_data_t, NDR_POINTER_REF,
1176
0
                         "cache_info:", -1);
1177
0
}
1178
0
  offset =
1179
0
    dissect_ndr_pointer(tvb, offset, pinfo, tree, di, drep,
1180
0
                         dissect_error_status_t, NDR_POINTER_REF, "status:",
1181
0
                         -1);
1182
1183
1184
0
  return offset;
1185
0
}
1186
1187
static int
1188
rs_pgo_dissect_delete_member_rqst (tvbuff_t * tvb, int offset,
1189
                                   packet_info * pinfo, proto_tree * tree,
1190
                                   dcerpc_info *di, uint8_t * drep)
1191
0
{
1192
0
  if (di->conformant_run)
1193
0
    {
1194
0
      return offset;
1195
0
    }
1196
1197
/*
1198
    void rs_pgo_delete_member (
1199
        [in]        sec_rgy_domain_t    name_domain,
1200
        [in]        sec_rgy_name_t      go_name,
1201
        [in]        sec_rgy_name_t      person_name,
1202
    );
1203
*/
1204
1205
0
  offset = dissect_sec_rgy_domain_t (tvb, offset, pinfo, tree, di, drep);
1206
0
  offset = dissect_sec_rgy_name_t (tvb, offset, pinfo, tree, di, drep);
1207
0
  offset = dissect_sec_rgy_name_t (tvb, offset, pinfo, tree, di, drep);
1208
1209
0
  return offset;
1210
1211
0
}
1212
1213
1214
static int
1215
rs_pgo_dissect_get_members_rqst (tvbuff_t * tvb, int offset,
1216
                                 packet_info * pinfo, proto_tree * tree,
1217
                                 dcerpc_info *di, uint8_t * drep)
1218
0
{
1219
1220
0
  uint32_t max_members;
1221
1222
0
  if (di->conformant_run)
1223
0
    {
1224
0
      return offset;
1225
0
    }
1226
1227
/*
1228
        [in]        sec_rgy_domain_t        name_domain,
1229
        [in]        sec_rgy_name_t          go_name,
1230
        [in, out]   sec_rgy_cursor_t        *member_cursor,
1231
        [in]        signed32                max_members,
1232
*/
1233
1234
0
  offset = dissect_sec_rgy_domain_t (tvb, offset, pinfo, tree, di, drep);
1235
0
  offset += 4;
1236
0
  offset = dissect_sec_rgy_name_t (tvb, offset, pinfo, tree, di, drep);
1237
0
  offset =
1238
0
    dissect_ndr_pointer(tvb, offset, pinfo, tree, di, drep,
1239
0
                         dissect_sec_rgy_cursor_t, NDR_POINTER_REF,
1240
0
                         "member_cursor:", -1);
1241
0
  offset =
1242
0
    dissect_ndr_uint32(tvb, offset, pinfo, tree, di, drep, hf_rs_var1,
1243
0
                        &max_members);
1244
1245
0
  col_append_fstr (pinfo->cinfo, COL_INFO, " :max_members:%u", max_members);
1246
1247
0
  return offset;
1248
0
}
1249
1250
static int
1251
rs_pgo_dissect_key_transfer_rqst (tvbuff_t * tvb, int offset,
1252
                                  packet_info * pinfo, proto_tree * tree,
1253
                                  dcerpc_info *di, uint8_t * drep)
1254
0
{
1255
1256
0
  if (di->conformant_run)
1257
0
    {
1258
0
      return offset;
1259
0
    }
1260
1261
/*
1262
        [in]        sec_rgy_domain_t    name_domain,
1263
        [in]        rs_pgo_query_t      requested_result_type,
1264
        [in, out]   rs_pgo_query_key_t  *key,
1265
*/
1266
1267
0
  offset += 4;
1268
0
  offset = dissect_sec_rgy_domain_t (tvb, offset, pinfo, tree, di, drep);
1269
0
  offset = dissect_rs_pgo_query_t (tvb, offset, pinfo, tree, di, drep);
1270
0
  offset =
1271
0
    dissect_ndr_pointer(tvb, offset, pinfo, tree, di, drep,
1272
0
                         dissect_rs_pgo_query_key_t, NDR_POINTER_REF, "key:",
1273
0
                         -1);
1274
1275
0
  return offset;
1276
0
}
1277
1278
static int
1279
rs_pgo_dissect_key_transfer_resp (tvbuff_t * tvb, int offset,
1280
                                  packet_info * pinfo, proto_tree * tree,
1281
                                  dcerpc_info *di, uint8_t * drep)
1282
0
{
1283
0
  if (di->conformant_run)
1284
0
    {
1285
0
      return offset;
1286
0
    }
1287
1288
/*
1289
        [in, out]   rs_pgo_query_key_t  *key,
1290
        [out]       rs_cache_data_t     *cache_info,
1291
        [out]       error_status_t      *status
1292
*/
1293
1294
0
  offset =
1295
0
    dissect_ndr_pointer(tvb, offset, pinfo, tree, di, drep,
1296
0
                         dissect_rs_pgo_query_key_t, NDR_POINTER_REF, "key:",
1297
0
                         -1);
1298
0
  offset =
1299
0
    dissect_ndr_pointer(tvb, offset, pinfo, tree, di, drep,
1300
0
                         dissect_rs_cache_data_t, NDR_POINTER_REF,
1301
0
                         "cache_info:", -1);
1302
0
  offset =
1303
0
    dissect_ndr_pointer(tvb, offset, pinfo, tree, di, drep,
1304
0
                         dissect_error_status_t, NDR_POINTER_REF, "status:",
1305
0
                         -1);
1306
1307
0
  return offset;
1308
0
}
1309
1310
1311
static int
1312
rs_pgo_dissect_is_member_resp (tvbuff_t * tvb, int offset,
1313
                               packet_info * pinfo, proto_tree * tree,
1314
                               dcerpc_info *di, uint8_t * drep)
1315
0
{
1316
1317
0
  if (di->conformant_run)
1318
0
    {
1319
0
      return offset;
1320
0
    }
1321
1322
/*
1323
        [out]       rs_cache_data_t     *cache_info,
1324
        [out]       error_status_t      *status
1325
*/
1326
0
  offset =
1327
0
    dissect_ndr_pointer(tvb, offset, pinfo, tree, di, drep,
1328
0
                         dissect_rs_cache_data_t, NDR_POINTER_REF,
1329
0
                         "cache_info:", -1);
1330
0
  offset =
1331
0
    dissect_ndr_pointer(tvb, offset, pinfo, tree, di, drep,
1332
0
                         dissect_error_status_t, NDR_POINTER_REF, "status:",
1333
0
                         -1);
1334
1335
0
  return offset;
1336
0
}
1337
1338
static int
1339
rs_pgo_dissect_is_member_rqst (tvbuff_t * tvb, int offset,
1340
                               packet_info * pinfo, proto_tree * tree,
1341
                               dcerpc_info *di, uint8_t * drep)
1342
0
{
1343
/*
1344
        [in]        sec_rgy_domain_t    name_domain,
1345
        [in]        sec_rgy_name_t      go_name,
1346
        [in]        sec_rgy_name_t      person_name,
1347
*/
1348
1349
0
  if (di->conformant_run)
1350
0
    {
1351
0
      return offset;
1352
0
    }
1353
1354
0
  offset += 4;
1355
0
  offset = dissect_sec_rgy_domain_t (tvb, offset, pinfo, tree, di, drep);
1356
0
  offset = dissect_sec_rgy_name_t (tvb, offset, pinfo, tree, di, drep);
1357
0
  offset += 4;
1358
0
  offset = dissect_sec_rgy_name_t (tvb, offset, pinfo, tree, di, drep);
1359
1360
1361
0
  return offset;
1362
1363
0
}
1364
1365
1366
static int
1367
rs_pgo_dissect_get_rqst (tvbuff_t * tvb, int offset,
1368
                         packet_info * pinfo, proto_tree * tree,
1369
                         dcerpc_info *di, uint8_t * drep)
1370
0
{
1371
0
  uint32_t allow_aliases;
1372
1373
0
  if (di->conformant_run)
1374
0
    {
1375
0
      return offset;
1376
0
    }
1377
1378
/*
1379
        [in]        sec_rgy_domain_t        name_domain,
1380
        [in]        rs_pgo_query_key_t      *key,
1381
        [in]        boolean32               allow_aliases,
1382
        [in, out]   sec_rgy_cursor_t        *item_cursor,
1383
*/
1384
1385
0
  offset = dissect_sec_rgy_domain_t (tvb, offset, pinfo, tree, di, drep);
1386
0
  offset =
1387
0
    dissect_ndr_pointer(tvb, offset, pinfo, tree, di, drep,
1388
0
                         dissect_rs_pgo_query_key_t, NDR_POINTER_REF, "key:",
1389
0
                         -1);
1390
0
  offset =
1391
0
    dissect_ndr_uint32(tvb, offset, pinfo, tree, di, drep, hf_rs_var1,
1392
0
                        &allow_aliases);
1393
1394
0
  col_append_fstr (pinfo->cinfo, COL_INFO, " :allow_aliases:%u",
1395
0
                     allow_aliases);
1396
1397
1398
0
  offset += 4;                  /* XXX */
1399
1400
0
  offset =
1401
0
    dissect_ndr_pointer(tvb, offset, pinfo, tree, di, drep,
1402
0
                         dissect_sec_rgy_cursor_t, NDR_POINTER_REF,
1403
0
                         "item_cursor:", -1);
1404
0
  return offset;
1405
1406
0
}
1407
1408
static int
1409
rs_pgo_dissect_get_resp (tvbuff_t * tvb, int offset,
1410
                         packet_info * pinfo, proto_tree * tree,
1411
                         dcerpc_info *di, uint8_t * drep)
1412
0
{
1413
0
  if (di->conformant_run)
1414
0
    {
1415
0
      return offset;
1416
0
    }
1417
1418
/*
1419
        [in, out]   sec_rgy_cursor_t        *item_cursor,
1420
        [out]       rs_cache_data_t         *cache_info,
1421
        [out]       rs_pgo_query_result_t   *result
1422
*/
1423
1424
0
  offset =
1425
0
    dissect_ndr_pointer(tvb, offset, pinfo, tree, di, drep,
1426
0
                         dissect_sec_rgy_cursor_t, NDR_POINTER_REF,
1427
0
                         "item_cursor:", -1);
1428
0
  offset =
1429
0
    dissect_ndr_pointer(tvb, offset, pinfo, tree, di, drep,
1430
0
                         dissect_rs_cache_data_t, NDR_POINTER_REF,
1431
0
                         "cache_info:", -1);
1432
0
  offset =
1433
0
    dissect_ndr_pointer(tvb, offset, pinfo, tree, di, drep,
1434
0
                         dissect_rs_pgo_query_result_t, NDR_POINTER_REF,
1435
0
                         "result:", -1);
1436
1437
0
  return offset;
1438
1439
0
}
1440
1441
static int
1442
rs_pgo_dissect_delete_member_resp (tvbuff_t * tvb, int offset,
1443
                                   packet_info * pinfo, proto_tree * tree,
1444
                                   dcerpc_info *di, uint8_t * drep)
1445
0
{
1446
1447
0
  if (di->conformant_run)
1448
0
    {
1449
0
      return offset;
1450
0
    }
1451
1452
/*
1453
        [out]       rs_cache_data_t     *cache_info,
1454
        [out]       error_status_t      *status
1455
1456
*/
1457
1458
0
  offset =
1459
0
    dissect_ndr_pointer(tvb, offset, pinfo, tree, di, drep,
1460
0
                         dissect_rs_cache_data_t, NDR_POINTER_REF,
1461
0
                         "cache_info:", -1);
1462
0
  offset =
1463
0
    dissect_ndr_pointer(tvb, offset, pinfo, tree, di, drep,
1464
0
                         dissect_error_status_t, NDR_POINTER_REF, "status:",
1465
0
                         -1);
1466
1467
0
  return offset;
1468
1469
0
}
1470
1471
1472
static const dcerpc_sub_dissector rs_pgo_dissectors[] = {
1473
  {0, "add", rs_pgo_dissect_add_rqst, rs_pgo_dissect_add_resp},
1474
  {1, "delete", rs_pgo_dissect_delete_rqst, rs_pgo_dissect_delete_resp},
1475
  {2, "replace", rs_pgo_dissect_replace_rqst, rs_pgo_dissect_replace_resp},
1476
  {3, "rename", rs_pgo_dissect_rename_rqst, rs_pgo_dissect_rename_resp},
1477
  {4, "get", rs_pgo_dissect_get_rqst, rs_pgo_dissect_get_resp},
1478
  {5, "key_transfer", rs_pgo_dissect_key_transfer_rqst,
1479
   rs_pgo_dissect_key_transfer_resp},
1480
  {6, "add_member", rs_pgo_dissect_add_member_rqst,
1481
   rs_pgo_dissect_add_member_resp},
1482
  {7, "delete_member", rs_pgo_dissect_delete_member_rqst,
1483
   rs_pgo_dissect_delete_member_resp},
1484
  {8, "is_member", rs_pgo_dissect_is_member_rqst,
1485
   rs_pgo_dissect_is_member_resp},
1486
  {9, "get_members", rs_pgo_dissect_get_members_rqst, NULL},
1487
  {0, NULL, NULL, NULL},
1488
};
1489
1490
1491
void
1492
proto_register_rs_pgo (void)
1493
14
{
1494
14
  static hf_register_info hf[] = {
1495
14
    {&hf_rs_pgo_opnum,
1496
14
     {"Operation", "rs_pgo.opnum", FT_UINT16, BASE_DEC, NULL, 0x0,
1497
14
      NULL, HFILL}},
1498
14
    {&hf_error_status_t,
1499
14
     {"Error status", "rs_pgo.error_status", FT_UINT32, BASE_DEC, NULL,
1500
14
      0x0, NULL, HFILL}},
1501
14
    {&hf_rs_pgo_query_key_t,
1502
14
     {"Query key", "rs_pgo.query_key", FT_UINT32, BASE_DEC,
1503
14
      NULL, 0x0, NULL, HFILL}},
1504
14
    {&hf_rs_pgo_query_result_t,
1505
14
     {"Query result", "rs_pgo.query_result", FT_UINT32,
1506
14
      BASE_DEC, NULL, 0x0, NULL, HFILL}},
1507
14
    {&hf_rs_pgo_query_t,
1508
14
     {"Query", "rs_pgo.query", FT_UINT32, BASE_DEC, NULL,
1509
14
      0x0, NULL, HFILL}},
1510
14
    {&hf_rs_sec_rgy_pgo_item_t_quota,
1511
14
     {"Quota", "rs_pgo.quota",
1512
14
      FT_UINT32, BASE_DEC, NULL, 0x0, NULL, HFILL}},
1513
14
    {&hf_rs_sec_rgy_pgo_item_t_unix_num,
1514
14
     {"Unix num",
1515
14
      "rs_pgo.unix_num", FT_UINT32, BASE_DEC, NULL, 0x0, NULL,
1516
14
      HFILL}},
1517
14
    {&hf_rs_timeval,
1518
14
     {"Timeval", "rs_pgo.timeval", FT_RELATIVE_TIME, BASE_NONE, NULL,
1519
14
      0x0, NULL, HFILL}},
1520
14
    {&hf_rs_uuid1,
1521
14
     {"Uuid1", "rs_pgo.uuid1", FT_GUID, BASE_NONE, NULL, 0x0, NULL, HFILL}},
1522
14
    {&hf_rs_var1,
1523
14
     {"Var1", "rs_pgo.var1", FT_UINT32, BASE_DEC, NULL, 0x0, NULL,
1524
14
      HFILL}},
1525
14
    {&hf_sec_rgy_domain_t,
1526
14
     {"Domain", "rs_pgo.domain", FT_UINT32, BASE_DEC,
1527
14
      NULL, 0x0, NULL, HFILL}},
1528
14
    {&hf_sec_rgy_name_t_principalName_string,
1529
14
     {"Name principalName", "rs_pgo.name_principalName", FT_STRING, BASE_NONE, NULL,
1530
14
      0x0, NULL, HFILL}},
1531
14
    {&hf_sec_rgy_name_t_size,
1532
14
     {"Name_t size", "rs_pgo.name_t_size", FT_UINT32,
1533
14
      BASE_DEC, NULL, 0x0, NULL, HFILL}},
1534
14
    {&hf_sec_rgy_pgo_flags_t,
1535
14
     {"Flags", "rs_pgo.flags", FT_UINT32,
1536
14
      BASE_HEX, NULL, 0x0, NULL, HFILL}},
1537
14
    {&hf_sec_rgy_pname_t_size,
1538
14
     {"Pname_t size", "rs_pgo.pname_t_size", FT_UINT32, BASE_DEC, NULL,
1539
14
      0x0, NULL, HFILL}},
1540
14
    {&hf_sec_rgy_pname_t_principalName_string,
1541
14
     {"Pname principalName", "rs_pgo.pname_principalName", FT_STRING,
1542
14
      BASE_NONE, NULL, 0x0, NULL, HFILL}},
1543
14
    {&hf_rs_pgo_unix_num_key_t,
1544
14
     {"Unix num key", "rs_pgo.unix_num_key_t", FT_UINT32,
1545
14
      BASE_DEC,
1546
14
      NULL, 0x0, NULL, HFILL}}
1547
14
  };
1548
1549
14
  static int *ett[] = {
1550
14
    &ett_error_status_t,
1551
14
    &ett_rgy_acct_user_flags_t,
1552
14
    &ett_rs_pgo,
1553
14
    &ett_rs_pgo_id_key_t,
1554
14
    &ett_rs_pgo_query_key_t,
1555
14
    &ett_rs_pgo_query_result_t,
1556
14
    &ett_rs_pgo_query_t,
1557
14
    &ett_rs_pgo_result_t,
1558
14
    &ett_rs_pgo_unix_num_key_t,
1559
14
    &ett_sec_attr_component_name_t,
1560
14
    &ett_sec_passwd_type_t,
1561
14
    &ett_sec_rgy_acct_admin_flags_t,
1562
14
    &ett_sec_rgy_acct_admin_t,
1563
14
    &ett_sec_rgy_acct_auth_flags_t,
1564
14
    &ett_sec_rgy_acct_key_t,
1565
14
    &ett_sec_rgy_acct_user_t,
1566
14
    &ett_sec_rgy_cursor_t,
1567
14
    &ett_sec_rgy_foreign_id_t,
1568
14
    &ett_sec_rgy_login_name_t,
1569
14
    &ett_sec_rgy_name_t,
1570
14
    &ett_sec_rgy_domain_t,
1571
14
    &ett_sec_rgy_pgo_flags_t,
1572
14
    &ett_sec_rgy_pgo_item_t,
1573
14
    &ett_sec_rgy_pname_t,
1574
14
    &ett_sec_rgy_sid_t,
1575
14
    &ett_sec_rgy_unix_passwd_buf_t,
1576
14
    &ett_sec_rgy_unix_sid_t,
1577
14
    &ett_sec_timeval_sec_t,
1578
14
    &ett_rs_cache_data_t,
1579
14
  };
1580
14
  proto_rs_pgo =
1581
14
    proto_register_protocol ("DCE Name Service", "RS_PGO", "rs_pgo");
1582
14
  proto_register_field_array (proto_rs_pgo, hf, array_length (hf));
1583
14
  proto_register_subtree_array (ett, array_length (ett));
1584
14
}
1585
1586
void
1587
proto_reg_handoff_rs_pgo (void)
1588
14
{
1589
  /* Register the protocol as dcerpc */
1590
14
  dcerpc_init_uuid (proto_rs_pgo, ett_rs_pgo, &uuid_rs_pgo, ver_rs_pgo,
1591
14
                    rs_pgo_dissectors, hf_rs_pgo_opnum);
1592
14
}
1593
1594
/*
1595
 * Editor modelines  -  https://www.wireshark.org/tools/modelines.html
1596
 *
1597
 * Local Variables:
1598
 * c-basic-offset: 2
1599
 * tab-width: 8
1600
 * indent-tabs-mode: nil
1601
 * End:
1602
 *
1603
 * ex: set shiftwidth=2 tabstop=8 expandtab:
1604
 * :indentSize=2:tabSize=8:noTabs=true:
1605
 */