View Javadoc
1   /*
2    *  Licensed to the Apache Software Foundation (ASF) under one
3    *  or more contributor license agreements.  See the NOTICE file
4    *  distributed with this work for additional information
5    *  regarding copyright ownership.  The ASF licenses this file
6    *  to you under the Apache License, Version 2.0 (the
7    *  "License"); you may not use this file except in compliance
8    *  with the License.  You may obtain a copy of the License at
9    *
10   *    http://www.apache.org/licenses/LICENSE-2.0
11   *
12   *  Unless required by applicable law or agreed to in writing,
13   *  software distributed under the License is distributed on an
14   *  "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
15   *  KIND, either express or implied.  See the License for the
16   *  specific language governing permissions and limitations
17   *  under the License.
18   *
19   */
20  package org.apache.directory.shared.kerberos.codec.kdcReqBody;
21  
22  
23  import org.apache.directory.api.asn1.actions.CheckNotNullLength;
24  import org.apache.directory.api.asn1.ber.grammar.AbstractGrammar;
25  import org.apache.directory.api.asn1.ber.grammar.Grammar;
26  import org.apache.directory.api.asn1.ber.grammar.GrammarTransition;
27  import org.apache.directory.api.asn1.ber.tlv.UniversalTag;
28  import org.apache.directory.shared.kerberos.KerberosConstants;
29  import org.apache.directory.shared.kerberos.codec.kdcReqBody.actions.AddEType;
30  import org.apache.directory.shared.kerberos.codec.kdcReqBody.actions.AddTicket;
31  import org.apache.directory.shared.kerberos.codec.kdcReqBody.actions.ETypeSequence;
32  import org.apache.directory.shared.kerberos.codec.kdcReqBody.actions.KdcReqBodyInit;
33  import org.apache.directory.shared.kerberos.codec.kdcReqBody.actions.StoreAddresses;
34  import org.apache.directory.shared.kerberos.codec.kdcReqBody.actions.StoreCName;
35  import org.apache.directory.shared.kerberos.codec.kdcReqBody.actions.StoreEncAuthorizationData;
36  import org.apache.directory.shared.kerberos.codec.kdcReqBody.actions.StoreFrom;
37  import org.apache.directory.shared.kerberos.codec.kdcReqBody.actions.StoreKdcOptions;
38  import org.apache.directory.shared.kerberos.codec.kdcReqBody.actions.StoreNonce;
39  import org.apache.directory.shared.kerberos.codec.kdcReqBody.actions.StoreRTime;
40  import org.apache.directory.shared.kerberos.codec.kdcReqBody.actions.StoreRealm;
41  import org.apache.directory.shared.kerberos.codec.kdcReqBody.actions.StoreSName;
42  import org.apache.directory.shared.kerberos.codec.kdcReqBody.actions.StoreTill;
43  import org.slf4j.Logger;
44  import org.slf4j.LoggerFactory;
45  
46  
47  /**
48   * This class implements the KdcReqBody structure. All the actions are declared
49   * in this class. As it is a singleton, these declaration are only done once. If
50   * an action is to be added or modified, this is where the work is to be done !
51   *
52   * @author <a href="mailto:dev@directory.apache.org">Apache Directory Project</a>
53   */
54  public final class KdcReqBodyGrammar extends AbstractGrammar<KdcReqBodyContainer>
55  {
56      /** The logger */
57      static final Logger LOG = LoggerFactory.getLogger( KdcReqBodyGrammar.class );
58  
59      /** A speedup for logger */
60      static final boolean IS_DEBUG = LOG.isDebugEnabled();
61  
62      /** The instance of grammar. KdcReqBodyGrammar is a singleton */
63      private static Grammar<KdcReqBodyContainer> instance = new KdcReqBodyGrammar();
64  
65  
66      /**
67       * Creates a new KdcReqBodyGrammar object.
68       */
69      @SuppressWarnings("unchecked")
70      private KdcReqBodyGrammar()
71      {
72          setName( KdcReqBodyGrammar.class.getName() );
73  
74          // Create the transitions table
75          super.transitions =
76              new GrammarTransition[KdcReqBodyStatesEnum.LAST_KDC_REQ_BODY_STATE.ordinal()][256];
77  
78          // ============================================================================================
79          // KdcReqBody
80          // ============================================================================================
81          // --------------------------------------------------------------------------------------------
82          // Transition from KdcReqBody init to KdcReqBody SEQ
83          // --------------------------------------------------------------------------------------------
84          // KDC-REQ-BODY    ::= SEQUENCE {
85          super.transitions[KdcReqBodyStatesEnum.START_STATE.ordinal()][UniversalTag.SEQUENCE.getValue()] =
86              new GrammarTransition<KdcReqBodyContainer>(
87                  KdcReqBodyStatesEnum.START_STATE,
88                  KdcReqBodyStatesEnum.KDC_REQ_BODY_KDC_OPTIONS_TAG_STATE,
89                  UniversalTag.SEQUENCE,
90                  new KdcReqBodyInit() );
91  
92          // --------------------------------------------------------------------------------------------
93          // Transition from KdcReqBody SEQ to kdc-options tag
94          // --------------------------------------------------------------------------------------------
95          // KDC-REQ-BODY    ::= SEQUENCE {
96          //         kdc-options             [0]
97          super.transitions[KdcReqBodyStatesEnum.KDC_REQ_BODY_KDC_OPTIONS_TAG_STATE.ordinal()][KerberosConstants.KDC_REQ_BODY_KDC_OPTIONS_TAG] =
98              new GrammarTransition<KdcReqBodyContainer>(
99                  KdcReqBodyStatesEnum.KDC_REQ_BODY_KDC_OPTIONS_TAG_STATE,
100                 KdcReqBodyStatesEnum.KDC_REQ_BODY_KDC_OPTIONS_STATE,
101                 KerberosConstants.KDC_REQ_BODY_KDC_OPTIONS_TAG,
102                 new CheckNotNullLength<KdcReqBodyContainer>() );
103 
104         // --------------------------------------------------------------------------------------------
105         // Transition from kdc-options tag to kdc-options value
106         // --------------------------------------------------------------------------------------------
107         // KDC-REQ-BODY    ::= SEQUENCE {
108         //         kdc-options             [0] KDCOptions
109         super.transitions[KdcReqBodyStatesEnum.KDC_REQ_BODY_KDC_OPTIONS_STATE.ordinal()][UniversalTag.BIT_STRING
110             .getValue()] =
111             new GrammarTransition<KdcReqBodyContainer>(
112                 KdcReqBodyStatesEnum.KDC_REQ_BODY_KDC_OPTIONS_STATE,
113                 KdcReqBodyStatesEnum.KDC_REQ_BODY_CNAME_OR_REALM_TAG_STATE,
114                 UniversalTag.BIT_STRING,
115                 new StoreKdcOptions() );
116 
117         // --------------------------------------------------------------------------------------------
118         // Transition from kdc-options value to cname tag
119         // --------------------------------------------------------------------------------------------
120         // KDC-REQ-BODY    ::= SEQUENCE {
121         //         ...
122         //         cname                   [1]
123         super.transitions[KdcReqBodyStatesEnum.KDC_REQ_BODY_CNAME_OR_REALM_TAG_STATE.ordinal()][KerberosConstants.KDC_REQ_BODY_CNAME_TAG] =
124             new GrammarTransition<KdcReqBodyContainer>(
125                 KdcReqBodyStatesEnum.KDC_REQ_BODY_CNAME_OR_REALM_TAG_STATE,
126                 KdcReqBodyStatesEnum.KDC_REQ_BODY_CNAME_STATE,
127                 KerberosConstants.KDC_REQ_BODY_CNAME_TAG,
128                 new StoreCName() );
129 
130         // --------------------------------------------------------------------------------------------
131         // Transition from kdc-options value to realm tag (cname is empty)
132         // --------------------------------------------------------------------------------------------
133         // KDC-REQ-BODY    ::= SEQUENCE {
134         //         ...
135         //         realm                   [2]
136         super.transitions[KdcReqBodyStatesEnum.KDC_REQ_BODY_CNAME_OR_REALM_TAG_STATE.ordinal()][KerberosConstants.KDC_REQ_BODY_REALM_TAG] =
137             new GrammarTransition<KdcReqBodyContainer>(
138                 KdcReqBodyStatesEnum.KDC_REQ_BODY_CNAME_OR_REALM_TAG_STATE,
139                 KdcReqBodyStatesEnum.KDC_REQ_BODY_REALM_TAG_STATE,
140                 KerberosConstants.KDC_REQ_BODY_REALM_TAG,
141                 new CheckNotNullLength<KdcReqBodyContainer>() );
142 
143         // --------------------------------------------------------------------------------------------
144         // Transition from cname tag to realm tag
145         // --------------------------------------------------------------------------------------------
146         // KDC-REQ-BODY    ::= SEQUENCE {
147         //         ...
148         //         realm                   [2]
149         super.transitions[KdcReqBodyStatesEnum.KDC_REQ_BODY_CNAME_STATE.ordinal()][KerberosConstants.KDC_REQ_BODY_REALM_TAG] =
150             new GrammarTransition<KdcReqBodyContainer>(
151                 KdcReqBodyStatesEnum.KDC_REQ_BODY_CNAME_STATE,
152                 KdcReqBodyStatesEnum.KDC_REQ_BODY_REALM_TAG_STATE,
153                 KerberosConstants.KDC_REQ_BODY_REALM_TAG,
154                 new CheckNotNullLength<KdcReqBodyContainer>() );
155 
156         // --------------------------------------------------------------------------------------------
157         // Transition from realm tag to realm value
158         // --------------------------------------------------------------------------------------------
159         // KDC-REQ-BODY    ::= SEQUENCE {
160         //         ...
161         //         realm                   [2] Realm
162         super.transitions[KdcReqBodyStatesEnum.KDC_REQ_BODY_REALM_TAG_STATE.ordinal()][UniversalTag.GENERAL_STRING
163             .getValue()] =
164             new GrammarTransition<KdcReqBodyContainer>(
165                 KdcReqBodyStatesEnum.KDC_REQ_BODY_REALM_TAG_STATE,
166                 KdcReqBodyStatesEnum.KDC_REQ_BODY_SNAME_OR_FROM_OR_TILL_TAG_STATE,
167                 UniversalTag.GENERAL_STRING,
168                 new StoreRealm() );
169 
170         // --------------------------------------------------------------------------------------------
171         // Transition from realm value to sname tag
172         // --------------------------------------------------------------------------------------------
173         // KDC-REQ-BODY    ::= SEQUENCE {
174         //         ...
175         //         sname                   [3]
176         super.transitions[KdcReqBodyStatesEnum.KDC_REQ_BODY_SNAME_OR_FROM_OR_TILL_TAG_STATE.ordinal()][KerberosConstants.KDC_REQ_BODY_SNAME_TAG] =
177             new GrammarTransition<KdcReqBodyContainer>(
178                 KdcReqBodyStatesEnum.KDC_REQ_BODY_SNAME_OR_FROM_OR_TILL_TAG_STATE,
179                 KdcReqBodyStatesEnum.KDC_REQ_BODY_SNAME_STATE,
180                 KerberosConstants.KDC_REQ_BODY_SNAME_TAG,
181                 new StoreSName() );
182 
183         // --------------------------------------------------------------------------------------------
184         // Transition from realm value to from tag (sname is empty)
185         // --------------------------------------------------------------------------------------------
186         // KDC-REQ-BODY    ::= SEQUENCE {
187         //         ...
188         //         from                    [4]
189         super.transitions[KdcReqBodyStatesEnum.KDC_REQ_BODY_SNAME_OR_FROM_OR_TILL_TAG_STATE.ordinal()][KerberosConstants.KDC_REQ_BODY_FROM_TAG] =
190             new GrammarTransition<KdcReqBodyContainer>(
191                 KdcReqBodyStatesEnum.KDC_REQ_BODY_SNAME_OR_FROM_OR_TILL_TAG_STATE,
192                 KdcReqBodyStatesEnum.KDC_REQ_BODY_FROM_STATE,
193                 KerberosConstants.KDC_REQ_BODY_FROM_TAG,
194                 new CheckNotNullLength<KdcReqBodyContainer>() );
195 
196         // --------------------------------------------------------------------------------------------
197         // Transition from realm value to till tag (sname and from are empty)
198         // --------------------------------------------------------------------------------------------
199         // KDC-REQ-BODY    ::= SEQUENCE {
200         //         ...
201         //         till                    [5]
202         super.transitions[KdcReqBodyStatesEnum.KDC_REQ_BODY_SNAME_OR_FROM_OR_TILL_TAG_STATE.ordinal()][KerberosConstants.KDC_REQ_BODY_TILL_TAG] =
203             new GrammarTransition<KdcReqBodyContainer>(
204                 KdcReqBodyStatesEnum.KDC_REQ_BODY_SNAME_OR_FROM_OR_TILL_TAG_STATE,
205                 KdcReqBodyStatesEnum.KDC_REQ_BODY_TILL_STATE,
206                 KerberosConstants.KDC_REQ_BODY_TILL_TAG,
207                 new CheckNotNullLength<KdcReqBodyContainer>() );
208 
209         // --------------------------------------------------------------------------------------------
210         // Transition from sname tag to from tag
211         // --------------------------------------------------------------------------------------------
212         // KDC-REQ-BODY    ::= SEQUENCE {
213         //         ...
214         //         from                    [4]
215         super.transitions[KdcReqBodyStatesEnum.KDC_REQ_BODY_SNAME_STATE.ordinal()][KerberosConstants.KDC_REQ_BODY_FROM_TAG] =
216             new GrammarTransition<KdcReqBodyContainer>(
217                 KdcReqBodyStatesEnum.KDC_REQ_BODY_SNAME_STATE,
218                 KdcReqBodyStatesEnum.KDC_REQ_BODY_FROM_STATE,
219                 KerberosConstants.KDC_REQ_BODY_FROM_TAG,
220                 new CheckNotNullLength<KdcReqBodyContainer>() );
221 
222         // --------------------------------------------------------------------------------------------
223         // Transition from sname tag to till tag (from is empty)
224         // --------------------------------------------------------------------------------------------
225         // KDC-REQ-BODY    ::= SEQUENCE {
226         //         ...
227         //         till                    [5]
228         super.transitions[KdcReqBodyStatesEnum.KDC_REQ_BODY_SNAME_STATE.ordinal()][KerberosConstants.KDC_REQ_BODY_TILL_TAG] =
229             new GrammarTransition<KdcReqBodyContainer>(
230                 KdcReqBodyStatesEnum.KDC_REQ_BODY_SNAME_STATE,
231                 KdcReqBodyStatesEnum.KDC_REQ_BODY_TILL_STATE,
232                 KerberosConstants.KDC_REQ_BODY_TILL_TAG,
233                 new CheckNotNullLength<KdcReqBodyContainer>() );
234 
235         // --------------------------------------------------------------------------------------------
236         // Transition from from tag to from value
237         // --------------------------------------------------------------------------------------------
238         // KDC-REQ-BODY    ::= SEQUENCE {
239         //         ...
240         //         from                    [4] KerberosTime
241         super.transitions[KdcReqBodyStatesEnum.KDC_REQ_BODY_FROM_STATE.ordinal()][UniversalTag.GENERALIZED_TIME
242             .getValue()] =
243             new GrammarTransition<KdcReqBodyContainer>(
244                 KdcReqBodyStatesEnum.KDC_REQ_BODY_FROM_STATE,
245                 KdcReqBodyStatesEnum.KDC_REQ_BODY_TILL_TAG_STATE,
246                 UniversalTag.GENERALIZED_TIME,
247                 new StoreFrom() );
248 
249         // --------------------------------------------------------------------------------------------
250         // Transition from till tag to till value
251         // --------------------------------------------------------------------------------------------
252         // KDC-REQ-BODY    ::= SEQUENCE {
253         //         ...
254         //         till                    [5]
255         super.transitions[KdcReqBodyStatesEnum.KDC_REQ_BODY_TILL_TAG_STATE.ordinal()][KerberosConstants.KDC_REQ_BODY_TILL_TAG] =
256             new GrammarTransition<KdcReqBodyContainer>(
257                 KdcReqBodyStatesEnum.KDC_REQ_BODY_TILL_TAG_STATE,
258                 KdcReqBodyStatesEnum.KDC_REQ_BODY_TILL_STATE,
259                 KerberosConstants.KDC_REQ_BODY_TILL_TAG,
260                 new CheckNotNullLength<KdcReqBodyContainer>() );
261 
262         // --------------------------------------------------------------------------------------------
263         // Transition from till tag to till value
264         // --------------------------------------------------------------------------------------------
265         // KDC-REQ-BODY    ::= SEQUENCE {
266         //         ...
267         //         till                    [5] KerberosTime
268         super.transitions[KdcReqBodyStatesEnum.KDC_REQ_BODY_TILL_STATE.ordinal()][UniversalTag.GENERALIZED_TIME
269             .getValue()] =
270             new GrammarTransition<KdcReqBodyContainer>(
271                 KdcReqBodyStatesEnum.KDC_REQ_BODY_TILL_STATE,
272                 KdcReqBodyStatesEnum.KDC_REQ_BODY_RTIME_OR_NONCE_TAG_STATE,
273                 UniversalTag.GENERALIZED_TIME,
274                 new StoreTill() );
275 
276         // --------------------------------------------------------------------------------------------
277         // Transition from till value to rtime
278         // --------------------------------------------------------------------------------------------
279         // KDC-REQ-BODY    ::= SEQUENCE {
280         //         ...
281         //         rtime                    [6]
282         super.transitions[KdcReqBodyStatesEnum.KDC_REQ_BODY_RTIME_OR_NONCE_TAG_STATE.ordinal()][KerberosConstants.KDC_REQ_BODY_RTIME_TAG] =
283             new GrammarTransition<KdcReqBodyContainer>(
284                 KdcReqBodyStatesEnum.KDC_REQ_BODY_RTIME_OR_NONCE_TAG_STATE,
285                 KdcReqBodyStatesEnum.KDC_REQ_BODY_RTIME_STATE,
286                 KerberosConstants.KDC_REQ_BODY_RTIME_TAG,
287                 new CheckNotNullLength<KdcReqBodyContainer>() );
288 
289         // --------------------------------------------------------------------------------------------
290         // Transition from till value to nonce
291         // --------------------------------------------------------------------------------------------
292         // KDC-REQ-BODY    ::= SEQUENCE {
293         //         ...
294         //         nonce                    [7]
295         super.transitions[KdcReqBodyStatesEnum.KDC_REQ_BODY_RTIME_OR_NONCE_TAG_STATE.ordinal()][KerberosConstants.KDC_REQ_BODY_NONCE_TAG] =
296             new GrammarTransition<KdcReqBodyContainer>(
297                 KdcReqBodyStatesEnum.KDC_REQ_BODY_RTIME_OR_NONCE_TAG_STATE,
298                 KdcReqBodyStatesEnum.KDC_REQ_BODY_NONCE_STATE,
299                 KerberosConstants.KDC_REQ_BODY_NONCE_TAG,
300                 new CheckNotNullLength<KdcReqBodyContainer>() );
301 
302         // --------------------------------------------------------------------------------------------
303         // Transition from rtime to nonce tag
304         // --------------------------------------------------------------------------------------------
305         // KDC-REQ-BODY    ::= SEQUENCE {
306         //         ...
307         //         rtime                    [6] KerberosTime
308         super.transitions[KdcReqBodyStatesEnum.KDC_REQ_BODY_RTIME_STATE.ordinal()][UniversalTag.GENERALIZED_TIME
309             .getValue()] =
310             new GrammarTransition<KdcReqBodyContainer>(
311                 KdcReqBodyStatesEnum.KDC_REQ_BODY_RTIME_STATE,
312                 KdcReqBodyStatesEnum.KDC_REQ_BODY_NONCE_TAG_STATE,
313                 UniversalTag.GENERALIZED_TIME,
314                 new StoreRTime() );
315 
316         // --------------------------------------------------------------------------------------------
317         // Transition from nonce tag to nonce value
318         // --------------------------------------------------------------------------------------------
319         // KDC-REQ-BODY    ::= SEQUENCE {
320         //         ...
321         //         nonce                    [7] UInt32
322         super.transitions[KdcReqBodyStatesEnum.KDC_REQ_BODY_NONCE_TAG_STATE.ordinal()][KerberosConstants.KDC_REQ_BODY_NONCE_TAG] =
323             new GrammarTransition<KdcReqBodyContainer>(
324                 KdcReqBodyStatesEnum.KDC_REQ_BODY_NONCE_TAG_STATE,
325                 KdcReqBodyStatesEnum.KDC_REQ_BODY_NONCE_STATE,
326                 KerberosConstants.KDC_REQ_BODY_NONCE_TAG,
327                 new CheckNotNullLength<KdcReqBodyContainer>() );
328 
329         // --------------------------------------------------------------------------------------------
330         // Transition from nonce value to etype Tag
331         // --------------------------------------------------------------------------------------------
332         // KDC-REQ-BODY    ::= SEQUENCE {
333         //         ...
334         //         etype                    [8]
335         super.transitions[KdcReqBodyStatesEnum.KDC_REQ_BODY_NONCE_STATE.ordinal()][UniversalTag.INTEGER.getValue()] =
336             new GrammarTransition<KdcReqBodyContainer>(
337                 KdcReqBodyStatesEnum.KDC_REQ_BODY_NONCE_TAG_STATE,
338                 KdcReqBodyStatesEnum.KDC_REQ_BODY_ETYPE_TAG_STATE,
339                 UniversalTag.INTEGER,
340                 new StoreNonce() );
341 
342         // --------------------------------------------------------------------------------------------
343         // Transition from etype Tag to etype Tag
344         // --------------------------------------------------------------------------------------------
345         // KDC-REQ-BODY    ::= SEQUENCE {
346         //         ...
347         //         etype                    [8]
348         super.transitions[KdcReqBodyStatesEnum.KDC_REQ_BODY_ETYPE_TAG_STATE.ordinal()][KerberosConstants.KDC_REQ_BODY_ETYPE_TAG] =
349             new GrammarTransition<KdcReqBodyContainer>(
350                 KdcReqBodyStatesEnum.KDC_REQ_BODY_ETYPE_TAG_STATE,
351                 KdcReqBodyStatesEnum.KDC_REQ_BODY_ETYPE_SEQ_STATE,
352                 KerberosConstants.KDC_REQ_BODY_ETYPE_TAG,
353                 new CheckNotNullLength<KdcReqBodyContainer>() );
354 
355         // --------------------------------------------------------------------------------------------
356         // Transition from etype Tag to etype SEQ
357         // --------------------------------------------------------------------------------------------
358         // KDC-REQ-BODY    ::= SEQUENCE {
359         //         ...
360         //         etype                    [8] SEQUENCE OF
361         super.transitions[KdcReqBodyStatesEnum.KDC_REQ_BODY_ETYPE_SEQ_STATE.ordinal()][UniversalTag.SEQUENCE.getValue()] =
362             new GrammarTransition<KdcReqBodyContainer>(
363                 KdcReqBodyStatesEnum.KDC_REQ_BODY_ETYPE_SEQ_STATE,
364                 KdcReqBodyStatesEnum.KDC_REQ_BODY_ETYPE_STATE,
365                 UniversalTag.SEQUENCE,
366                 new ETypeSequence() );
367 
368         // --------------------------------------------------------------------------------------------
369         // Transition from etype SEQ to EType values
370         // --------------------------------------------------------------------------------------------
371         // KDC-REQ-BODY    ::= SEQUENCE {
372         //         ...
373         //         etype                    [8] SEQUENCE OF Int32
374         super.transitions[KdcReqBodyStatesEnum.KDC_REQ_BODY_ETYPE_STATE.ordinal()][UniversalTag.INTEGER.getValue()] =
375             new GrammarTransition<KdcReqBodyContainer>(
376                 KdcReqBodyStatesEnum.KDC_REQ_BODY_ETYPE_STATE,
377                 KdcReqBodyStatesEnum.KDC_REQ_BODY_ETYPE_STATE,
378                 UniversalTag.INTEGER,
379                 new AddEType() );
380 
381         // --------------------------------------------------------------------------------------------
382         // Transition from EType values to addresses
383         // --------------------------------------------------------------------------------------------
384         // KDC-REQ-BODY    ::= SEQUENCE {
385         //         ...
386         //         addresses               [9]
387         super.transitions[KdcReqBodyStatesEnum.KDC_REQ_BODY_ETYPE_STATE.ordinal()][KerberosConstants.KDC_REQ_BODY_ADDRESSES_TAG] =
388             new GrammarTransition<KdcReqBodyContainer>(
389                 KdcReqBodyStatesEnum.KDC_REQ_BODY_ETYPE_STATE,
390                 KdcReqBodyStatesEnum.KDC_REQ_BODY_ADDRESSES_STATE,
391                 KerberosConstants.KDC_REQ_BODY_ADDRESSES_TAG,
392                 new StoreAddresses() );
393 
394         // --------------------------------------------------------------------------------------------
395         // Transition from EType values to encAuthorizationData (addresses is empty)
396         // --------------------------------------------------------------------------------------------
397         // KDC-REQ-BODY    ::= SEQUENCE {
398         //         ...
399         //         enc-authorization-data  [10]
400         super.transitions[KdcReqBodyStatesEnum.KDC_REQ_BODY_ETYPE_STATE.ordinal()][KerberosConstants.KDC_REQ_BODY_ENC_AUTHZ_DATA_TAG] =
401             new GrammarTransition<KdcReqBodyContainer>(
402                 KdcReqBodyStatesEnum.KDC_REQ_BODY_ETYPE_STATE,
403                 KdcReqBodyStatesEnum.KDC_REQ_BODY_ENC_AUTH_DATA_STATE,
404                 KerberosConstants.KDC_REQ_BODY_ENC_AUTHZ_DATA_TAG,
405                 new StoreEncAuthorizationData() );
406 
407         // --------------------------------------------------------------------------------------------
408         // Transition from EType values to additionalTickets tag (addresses and enc-authorization data
409         // are empty)
410         // --------------------------------------------------------------------------------------------
411         // KDC-REQ-BODY    ::= SEQUENCE {
412         //         ...
413         //         additional-tickets      [11]
414         super.transitions[KdcReqBodyStatesEnum.KDC_REQ_BODY_ETYPE_STATE.ordinal()][KerberosConstants.KDC_REQ_BODY_ADDITIONAL_TICKETS_TAG] =
415             new GrammarTransition<KdcReqBodyContainer>(
416                 KdcReqBodyStatesEnum.KDC_REQ_BODY_ETYPE_STATE,
417                 KdcReqBodyStatesEnum.KDC_REQ_BODY_ADDITIONAL_TICKETS_TAG_STATE,
418                 KerberosConstants.KDC_REQ_BODY_ADDITIONAL_TICKETS_TAG,
419                 new CheckNotNullLength<KdcReqBodyContainer>() );
420 
421         // --------------------------------------------------------------------------------------------
422         // Transition from addresses values to encAuthorizationData
423         // --------------------------------------------------------------------------------------------
424         // KDC-REQ-BODY    ::= SEQUENCE {
425         //         ...
426         //         enc-authorization-data  [10]
427         super.transitions[KdcReqBodyStatesEnum.KDC_REQ_BODY_ADDRESSES_STATE.ordinal()][KerberosConstants.KDC_REQ_BODY_ENC_AUTHZ_DATA_TAG] =
428             new GrammarTransition<KdcReqBodyContainer>(
429                 KdcReqBodyStatesEnum.KDC_REQ_BODY_ADDRESSES_STATE,
430                 KdcReqBodyStatesEnum.KDC_REQ_BODY_ENC_AUTH_DATA_STATE,
431                 KerberosConstants.KDC_REQ_BODY_ENC_AUTHZ_DATA_TAG,
432                 new StoreEncAuthorizationData() );
433 
434         // --------------------------------------------------------------------------------------------
435         // Transition from addresses values to additional-tickets tag
436         // --------------------------------------------------------------------------------------------
437         // KDC-REQ-BODY    ::= SEQUENCE {
438         //         ...
439         //         additional-tickets      [11]
440         super.transitions[KdcReqBodyStatesEnum.KDC_REQ_BODY_ADDRESSES_STATE.ordinal()][KerberosConstants.KDC_REQ_BODY_ADDITIONAL_TICKETS_TAG] =
441             new GrammarTransition<KdcReqBodyContainer>(
442                 KdcReqBodyStatesEnum.KDC_REQ_BODY_ADDRESSES_STATE,
443                 KdcReqBodyStatesEnum.KDC_REQ_BODY_ADDITIONAL_TICKETS_TAG_STATE,
444                 KerberosConstants.KDC_REQ_BODY_ADDITIONAL_TICKETS_TAG,
445                 new CheckNotNullLength<KdcReqBodyContainer>() );
446 
447         // --------------------------------------------------------------------------------------------
448         // Transition from encAuthorizationData to additional-tickets tag
449         // --------------------------------------------------------------------------------------------
450         // KDC-REQ-BODY    ::= SEQUENCE {
451         //         ...
452         //         additional-tickets      [11]
453         super.transitions[KdcReqBodyStatesEnum.KDC_REQ_BODY_ENC_AUTH_DATA_STATE.ordinal()][KerberosConstants.KDC_REQ_BODY_ADDITIONAL_TICKETS_TAG] =
454             new GrammarTransition<KdcReqBodyContainer>(
455                 KdcReqBodyStatesEnum.KDC_REQ_BODY_ENC_AUTH_DATA_STATE,
456                 KdcReqBodyStatesEnum.KDC_REQ_BODY_ADDITIONAL_TICKETS_TAG_STATE,
457                 KerberosConstants.KDC_REQ_BODY_ADDITIONAL_TICKETS_TAG,
458                 new CheckNotNullLength<KdcReqBodyContainer>() );
459 
460         // --------------------------------------------------------------------------------------------
461         // Transition from additional-tickets tag to Ticket SEQUENCE
462         // --------------------------------------------------------------------------------------------
463         // KDC-REQ-BODY    ::= SEQUENCE {
464         //         ...
465         //         additional-tickets      [11] SEQUENCE OF
466         super.transitions[KdcReqBodyStatesEnum.KDC_REQ_BODY_ADDITIONAL_TICKETS_TAG_STATE.ordinal()][UniversalTag.SEQUENCE
467             .getValue()] =
468             new GrammarTransition<KdcReqBodyContainer>(
469                 KdcReqBodyStatesEnum.KDC_REQ_BODY_ADDITIONAL_TICKETS_TAG_STATE,
470                 KdcReqBodyStatesEnum.KDC_REQ_BODY_ADDITIONAL_TICKETS_SEQ_STATE,
471                 UniversalTag.SEQUENCE,
472                 new CheckNotNullLength<KdcReqBodyContainer>() );
473 
474         // --------------------------------------------------------------------------------------------
475         // Transition from Ticket SEQUENCE to Ticket
476         // --------------------------------------------------------------------------------------------
477         // KDC-REQ-BODY    ::= SEQUENCE {
478         //         ...
479         //         additional-tickets      [11] SEQUENCE OF Ticket
480         super.transitions[KdcReqBodyStatesEnum.KDC_REQ_BODY_ADDITIONAL_TICKETS_SEQ_STATE.ordinal()][KerberosConstants.TICKET_TAG] =
481             new GrammarTransition<KdcReqBodyContainer>(
482                 KdcReqBodyStatesEnum.KDC_REQ_BODY_ADDITIONAL_TICKETS_SEQ_STATE,
483                 KdcReqBodyStatesEnum.KDC_REQ_BODY_ADDITIONAL_TICKETS_STATE,
484                 KerberosConstants.TICKET_TAG,
485                 new AddTicket() );
486 
487         // --------------------------------------------------------------------------------------------
488         // Transition from Ticket to Ticket
489         // --------------------------------------------------------------------------------------------
490         // KDC-REQ-BODY    ::= SEQUENCE {
491         //         ...
492         //         additional-tickets      [11] SEQUENCE OF Ticket
493         super.transitions[KdcReqBodyStatesEnum.KDC_REQ_BODY_ADDITIONAL_TICKETS_STATE.ordinal()][KerberosConstants.TICKET_TAG] =
494             new GrammarTransition<KdcReqBodyContainer>(
495                 KdcReqBodyStatesEnum.KDC_REQ_BODY_ADDITIONAL_TICKETS_STATE,
496                 KdcReqBodyStatesEnum.KDC_REQ_BODY_ADDITIONAL_TICKETS_STATE,
497                 KerberosConstants.TICKET_TAG,
498                 new AddTicket() );
499     }
500 
501 
502     /**
503      * Get the instance of this grammar
504      *
505      * @return An instance on the KDC-REQ-BODY Grammar
506      */
507     public static Grammar<KdcReqBodyContainer> getInstance()
508     {
509         return instance;
510     }
511 }