summaryrefslogtreecommitdiffstats
path: root/librpc/idl/claims.idl
blob: 618a620ef87f23280b350517611745c2162e9a2f (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
/*
  claims

  claim: An assertion about a security principal

  From MS-ADTS:

   For ease of implementation, the full IDL for the data types used for
   claims is provided

  The below was initially obtained from MS-ADTS which is
  Copyright © 2022 Microsoft Corporation as permitted
  by the Open Specifications terms reproduced in IDL_LICENCE.txt
*/

#include "idl_types.h"

[
  uuid("bba9cb76-eb0c-462c-aa1b-5d8c34415701"),
  version(1.0),
  pointer_default(unique),
  helpstring("Active Directory Claims"),
  helper("../librpc/ndr/ndr_claims.h")
]
interface claims
{
#define wchar_t uint16
#define CLAIM_ID [string, charset(UTF16)] wchar_t *

	const int CLAIM_LOWER_COMPRESSION_THRESHOLD = 368;
	const int CLAIM_UPPER_COMPRESSION_THRESHOLD = 384;

	typedef enum {
		CLAIM_TYPE_INT64 = 1,
		CLAIM_TYPE_UINT64 = 2,
		CLAIM_TYPE_STRING = 3,
		CLAIM_TYPE_BOOLEAN = 6
	} CLAIM_TYPE;

	typedef enum {
		CLAIMS_SOURCE_TYPE_AD = 1,
		CLAIMS_SOURCE_TYPE_CERTIFICATE = 2
	} CLAIMS_SOURCE_TYPE;

	typedef enum {
		CLAIMS_COMPRESSION_FORMAT_NONE = 0,
		CLAIMS_COMPRESSION_FORMAT_LZNT1 = 2,
		CLAIMS_COMPRESSION_FORMAT_XPRESS = 3,
		CLAIMS_COMPRESSION_FORMAT_XPRESS_HUFF = 4
	} CLAIMS_COMPRESSION_FORMAT;

	typedef struct {
		[range(0, 10*1024*1024)] uint32 value_count;
		[size_is(value_count)] int64 *values;
	} CLAIM_INT64;

	typedef struct {
		[range(0, 10*1024*1024)] uint32 value_count;
		[size_is(value_count)] hyper *values;
	} CLAIM_UINT64;

	typedef struct {
		[range(0, 10*1024*1024)] uint32 value_count;
		[size_is(value_count), string, charset(UTF16)] wchar_t **values;
	} CLAIM_STRING;

	typedef [switch_type(CLAIM_TYPE),flag(NDR_ALIGN8)] union {
		[case(CLAIM_TYPE_INT64)] CLAIM_INT64 claim_int64;
		[case(CLAIM_TYPE_UINT64)] CLAIM_UINT64 claim_uint64;
		[case(CLAIM_TYPE_STRING)] CLAIM_STRING claim_string;
		[case(CLAIM_TYPE_BOOLEAN)] CLAIM_UINT64 claim_boolean;
		[default];
	} CLAIM_ENTRY_VALUES;

	typedef struct {
		CLAIM_ID id;
		CLAIM_TYPE type;
		[switch_is(type)] CLAIM_ENTRY_VALUES values;
	} CLAIM_ENTRY;

	typedef struct {
		CLAIMS_SOURCE_TYPE claims_source_type;
		uint32 claims_count;
		[size_is(claims_count)] CLAIM_ENTRY *claim_entries;
	} CLAIMS_ARRAY;

	typedef struct {
		CLAIMS_SET_METADATA *metadata;
	} CLAIMS_SET_METADATA_CTR;

	typedef struct {
		CLAIMS_SET *claims;
	} CLAIMS_SET_CTR;

	/* Public structures. */

	typedef [public] struct {
		uint32 claims_array_count;
		[size_is(claims_array_count)] CLAIMS_ARRAY *claims_arrays;
		uint16 reserved_type;
		uint32 reserved_field_size;
		[size_is(reserved_field_size)] uint8 *reserved_field;
	} CLAIMS_SET;

	typedef [public, gensize] struct {
		[subcontext(0xFFFFFC01)] CLAIMS_SET_CTR claims;
	} CLAIMS_SET_NDR;

	typedef [public] struct {
		[subcontext(0xFFFFFC01)] CLAIMS_SET_METADATA_CTR claims;
	} CLAIMS_SET_METADATA_NDR;

	typedef [public] struct {
		[value(ndr_claims_compressed_size(claims_set,
						  r->compression_format,
						  ndr->flags))] uint32 claims_set_size;
		[subcontext(4),
		 compression(ndr_claims_compression_alg(compression_format),
			     claims_set_size,
			     uncompressed_claims_set_size)
			] CLAIMS_SET_NDR *claims_set;
		/*
		 * The second argument to
		 * ndr_claims_actual_wire_compression_alg() in the
		 * value() below should be
		 * uncompressed_claims_set_size but the value()
		 * handling isn't recursive (enough) so we have to
		 * specify that manually otherwise the
		 * compression_format in the above includes the struct
		 * member, not the value()
		 *
		 * The caller should set compression_format to
		 * CLAIMS_COMPRESSION_FORMAT_XPRESS_HUFF and this will
		 * be reset to CLAIMS_COMPRESSION_FORMAT_NONE if the
		 * buffer is not large enough to compress.
		 *
		 * Otherwise setting CLAIMS_COMPRESSION_FORMAT_NONE
		 * disabled compression entirely.
		 */
		[value(ndr_claims_actual_wire_compression_alg(r->compression_format,
							      ndr_size_CLAIMS_SET_NDR(claims_set,
										      ndr->flags)))] CLAIMS_COMPRESSION_FORMAT compression_format;
		[value(ndr_size_CLAIMS_SET_NDR(claims_set,
					       ndr->flags))] uint32 uncompressed_claims_set_size;
		uint16 reserved_type;
		uint32 reserved_field_size;
		[size_is(reserved_field_size)] uint8 *reserved_field;
	} CLAIMS_SET_METADATA;
}