summaryrefslogtreecommitdiffstats
path: root/librpc/idl/krb5ccache.idl
blob: 1f0cfa752a9326ed0d590f50fd586847142d750e (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
/*
  krb5 credentials cache (version 3 or 4)
  specification: https://web.mit.edu/kerberos/krb5-devel/doc/formats/ccache_file_format.html
*/

#include "idl_types.h"

[
  uuid("1702b695-99ca-4f32-93e4-1e1c4d5ddb53"),
  version(0.0),
  pointer_default(unique),
  helpstring("KRB5 credentials cache")
]
interface krb5ccache
{
	typedef struct {
		uint32 name_type;
		uint32 component_count;
		[flag(STR_SIZE4|STR_NOTERM|STR_UTF8)] string realm;
		[flag(STR_SIZE4|STR_NOTERM|STR_UTF8)] string components[component_count];
	} PRINCIPAL;

	typedef struct {
		uint16 enctype;
		DATA_BLOB data;
	} KEYBLOCK;

	typedef struct {
		uint16 addrtype;
		DATA_BLOB data;
	} ADDRESS;

	typedef struct {
		uint32 count;
		ADDRESS data[count];
	} ADDRESSES;

	typedef struct {
		uint16 ad_type;
		DATA_BLOB data;
	} AUTHDATUM;

	typedef struct {
		uint32 count;
		AUTHDATUM data[count];
	} AUTHDATA;

	typedef struct {
		PRINCIPAL client;
		PRINCIPAL server;
		KEYBLOCK keyblock;
		uint32 authtime;
		uint32 starttime;
		uint32 endtime;
		uint32 renew_till;
		uint8 is_skey;
		uint32 ticket_flags;
		ADDRESSES addresses;
		AUTHDATA authdata;
		DATA_BLOB ticket;
		DATA_BLOB second_ticket;
	} CREDENTIAL;

	typedef struct {
		[value(0)] int32 kdc_sec_offset;
		[value(0)] int32 kdc_usec_offset;
	} DELTATIME_TAG;

	typedef [nodiscriminant] union {
		[case(1)] DELTATIME_TAG deltatime_tag;
	} FIELD;

	typedef struct {
		[value(1)] uint16 tag;
		[subcontext(2),switch_is(tag)] FIELD field;
	} V4TAG;

	typedef struct {
		V4TAG tag;
		/*
		 * We should allow for more than one tag to be properly parsed, but that
		 * would require manual parsing.
		 */
		[flag(NDR_REMAINING)] DATA_BLOB further_tags;
	} V4TAGS;

	typedef struct {
		[subcontext(2)] V4TAGS v4tags;
	} V4HEADER;

	typedef [nodiscriminant] union {
		/*
		 * We don't attempt to support file format versions 1 and 2 as they
		 * assume native CPU byte order, which makes no sense in PIDL.
		 */
		[case(3)] ;
		[case(4)] V4HEADER v4header;
	} OPTIONAL_HEADER;

	/* Public structures. */

	typedef [flag(NDR_NOALIGN|NDR_BIG_ENDIAN|NDR_PAHEX),public] struct {
		[value(5)] uint8 pvno;
		[value(4)] uint8 version;
		[switch_is(version)] OPTIONAL_HEADER optional_header;
		PRINCIPAL principal;
		CREDENTIAL cred;
		[flag(NDR_REMAINING)] DATA_BLOB further_creds;
	} CCACHE;

	typedef [flag(NDR_NOALIGN|NDR_BIG_ENDIAN|NDR_PAHEX),public] struct {
		CREDENTIAL cred;
		[flag(NDR_REMAINING)] DATA_BLOB further_creds;
	} MULTIPLE_CREDENTIALS;
}