a02559f1465adadbcd9767452279da6bd67474d3
[openafs.git] / src / rxgk / rxgk_proto.xg
1 /* hej emacs det h{r {r en -*- c -*- fil */
2
3 /*
4  * Copyright (c) 2002 - 2004, Stockholms Universitet
5  * (Stockholm University, Stockholm Sweden)
6  * All rights reserved.
7  * 
8  * Redistribution is not permitted
9  */
10
11 /* $Id$ */
12
13 package RXGK_
14
15 const RXGK_MAX_TOKEN_LEN = 65536;
16 const RXGK_MAX_AUTHTOKEN = 256;
17
18 /* ctext is limited by mtu since its part of responce */
19 const RXGK_MAX_CTEXT     = 768; 
20
21 const RXGK_SERVICE_ID   = 34567;
22
23 #define RXGK_ESTABLISH_KRB5_CONTEXT     1
24 #define RXGK_ESTABLISH_GSS_CONTEXT      2
25 #define RXGK_EXCHANGE_GSS_KEYS          3
26
27 typedef opaque RXGK_Token<RXGK_MAX_TOKEN_LEN>;
28
29 /*
30  *
31  */
32
33 const RXGK_KEY_VERSION          = 1;
34 const RXGK_KEY_MAXSIZE          = 256;
35 const RXGK_KEY_MAXPRINCIPAL     = 640;
36 const RXGK_KEY_ENCTYPES         = 32;
37
38 /*
39  * Challange token in the 
40  */
41
42 const RXGK_CR_TOKEN_VERSION     = 1;
43
44 struct RXGK_CHALLENGE_TOKEN {
45     afs_int32   ct_version;
46     afs_uint32  ct_nonce;
47     afs_uint32  ct_enctype<RXGK_KEY_ENCTYPES>;  /* listed in order of pref */
48 };
49
50 /*
51  * Reply token in the EstablishKrb5Context
52  */
53
54 struct RXGK_REPLY_TOKEN {
55     afs_int32   rt_version;
56     afs_int32   rt_flags;       /* other support ops */
57     afs_int32   rt_error;
58     afs_uint32  rt_nonce;
59     afs_uint32  rt_enctype;
60     opaque      rt_key<RXGK_KEY_MAXSIZE>;
61 };
62
63 /*
64  * Rx auth cred equivalent
65  */
66
67 struct RXGK_AUTH_CRED {
68     afs_int32   ac_version;     /* version of format of RXGK_AUTH_CRED */
69     string      ac_principal<RXGK_KEY_MAXPRINCIPAL>; /* prefixed with mech */
70     afs_int32   ac_starttime;
71     afs_int32   ac_endtime;
72     afs_int32   ac_enctype;
73     opaque      ac_key<RXGK_KEY_MAXSIZE>;
74 };
75
76 /*
77  * This is part of the rxs challange/response exchange.  Its somewhat
78  * complicated since it support rekeying of a data stream.
79  */
80
81 const RXGK_VERSION = 3;
82
83 const RXKG_OPCODE_CHALLENGE     = 1;
84 const RXKG_OPCODE_REKEY         = 2;
85
86 struct RXGK_Challenge {
87     afs_uint32  rc_version;
88     afs_uint32  rc_nonce;
89     afs_uint32  rc_opcode;
90     afs_uint32  rc_max_seq_skew;        /* packets accepted when rekey */
91     afs_uint32  rc_min_level;
92 };
93
94 /* is the auth_token EstablishKrb5Context returned */
95 struct RXGK_Response {
96     afs_uint32  rr_version;
97     afs_uint32  rr_auth_token_kvno;
98     opaque      rr_auth_token<RXGK_MAX_AUTHTOKEN>;
99     opaque      rr_ctext<RXGK_MAX_CTEXT>;
100 };
101
102 struct RXGK_Response_Crypt {
103     afs_uint32  nonce;
104     afs_uint32  epoch;
105     afs_uint32  cid;
106     afs_uint32  call_numbers[4];
107     afs_uint32  level;
108     afs_uint32  key_version;
109     afs_uint32  key_counter_hi;
110     afs_uint32  key_counter_lo;
111 };
112
113 /*
114  * Kerberos crypto framework enctypes 
115  */
116
117 const RXGK_CRYPTO_NULL                  = 0;
118 const RXGK_CRYPTO_DES_CBC_CRC           = 1;
119 const RXGK_CRYPTO_DES_CBC_MD4           = 2;
120 const RXGK_CRYPTO_DES_CBC_MD5           = 4;
121 const RXGK_CRYPTO_DES3_SHA1_KD          = 16;
122
123 const RXGK_CRYPTO_CKSUM_RSA_DES_MD5     = 8;
124
125 const RXGK_CLIENT_TO_SERVER             = 0;
126 const RXGK_SERVER_TO_CLIENT             = 1;
127
128 const RXGK_CLIENT_ENC_CHALLENGE         = 1026;
129 const RXGK_SERVER_ENC_REKEY             = 1026;
130 const RXGK_CLIENT_ENC_PACKETS           = 1027;
131 const RXGK_CLIENT_CKSUM_PACKETS         = 1028;
132 const RXGK_SERVER_ENC_PACKETS           = 1029;
133 const RXGK_SERVER_CKSUM_PACKETS         = 1030;
134
135 /*
136  * In packet protection since header isn't checksum-ed
137  */
138
139 struct rxgk_header_data {
140     uint32_t call_number;
141     uint32_t channel_and_seq;
142 };
143
144 /*
145  * rx connection key
146  */
147
148 struct RXGK_rxconn_key {
149     afs_uint32 rxk_cid;
150     afs_uint32 rxk_epoch;
151 };
152
153 #if 0
154
155 const RXGK_MAX_KEYCONTRIB= 256; /* MUST only be used from server->client */
156
157 struct RXGK_ReKey {
158     opaque      rk_ctext<RXGK_MAX_CTEXT>;
159 };
160
161 struct RXGK_ReKey_Crypt {
162     afs_int32   rkc_version;
163     afs_int32   rkc_max_seq_num;
164     afs_int32   rkc_kvno;               /* 16 bit number */
165     opaque      rkc_keycontribution<RXGK_MAX_KEYCONTRIB>;
166 };
167
168 /* rx transport key */
169
170 struct RXGK_rxtransport_key {
171     opaque      client_keycontribution<RXGK_MAX_KEYCONTRIB>;
172     opaque      server_keycontribution<RXGK_MAX_KEYCONTRIB>;
173 };
174
175 #endif
176
177 /*
178  * kerberos auth_token
179  */
180
181 EstablishKrb5Context(IN RXGK_Token *token, 
182                      IN RXGK_Token *challenge_token,
183                      OUT RXGK_Token *reply_token,
184                      OUT int32_t *auth_token_kvno,
185                      OUT RXGK_Token *auth_token) = RXGK_ESTABLISH_KRB5_CONTEXT;
186
187 /*
188  * Add gss stuff here
189  */
190
191 #if 0
192
193 EstablishGssContext(IN RXGK_Token *in_token,
194                     OUT RXGK_Token *out_token) = RXGK_ESTABLISH_GSS_CONTEXT;
195
196 ExchangeGSSKeys(IN RXGK_Token *challenge_token,
197                 OUT RXGK_Token *reply_token,
198                 OUT int32_t *auth_token_kvno,
199                 OUT RXGK_Token *auth_token) = RXGK_EXCHANGE_GSS_KEYS;
200
201 #endif
202