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.encKrbPrivPart;
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.encKrbPrivPart.actions.EncKrbPrivPartInit;
30  import org.apache.directory.shared.kerberos.codec.encKrbPrivPart.actions.StoreRecipientAddress;
31  import org.apache.directory.shared.kerberos.codec.encKrbPrivPart.actions.StoreSenderAddress;
32  import org.apache.directory.shared.kerberos.codec.encKrbPrivPart.actions.StoreSeqNumber;
33  import org.apache.directory.shared.kerberos.codec.encKrbPrivPart.actions.StoreTimestamp;
34  import org.apache.directory.shared.kerberos.codec.encKrbPrivPart.actions.StoreUsec;
35  import org.apache.directory.shared.kerberos.codec.encKrbPrivPart.actions.StoreUserData;
36  import org.slf4j.Logger;
37  import org.slf4j.LoggerFactory;
38  
39  
40  /**
41   * This class implements the EncKrbPrivPart structure. All the actions are declared
42   * in this class. As it is a singleton, these declaration are only done once. If
43   * an action is to be added or modified, this is where the work is to be done !
44   *
45   * @author <a href="mailto:dev@directory.apache.org">Apache Directory Project</a>
46   */
47  public final class EncKrbPrivPartGrammar extends AbstractGrammar<EncKrbPrivPartContainer>
48  {
49      /** The logger */
50      static final Logger LOG = LoggerFactory.getLogger( EncKrbPrivPartGrammar.class );
51  
52      /** A speedup for logger */
53      static final boolean IS_DEBUG = LOG.isDebugEnabled();
54  
55      /** The instance of grammar. EncKrbPrivPartGrammar is a singleton */
56      private static Grammar<EncKrbPrivPartContainer> instance = new EncKrbPrivPartGrammar();
57  
58  
59      /**
60       * Creates a new EncKrbPrivPartGrammar object.
61       */
62      @SuppressWarnings("unchecked")
63      private EncKrbPrivPartGrammar()
64      {
65          setName( EncKrbPrivPartGrammar.class.getName() );
66  
67          // Create the transitions table
68          super.transitions = new GrammarTransition[EncKrbPrivPartStatesEnum.LAST_ENC_KRB_PRIV_PART_STATE.ordinal()][256];
69  
70          // ============================================================================================
71          // EncKrbPrivPart
72          // ============================================================================================
73          // --------------------------------------------------------------------------------------------
74          // Transition from EncKrbPrivPart init to EncKrbPrivPart tag
75          // --------------------------------------------------------------------------------------------
76          // EncKrbPrivPart  ::= [APPLICATION 28] EncKrbPrivPart   ::= SEQUENCE {
77          super.transitions[EncKrbPrivPartStatesEnum.START_STATE.ordinal()][KerberosConstants.ENC_KRB_PRIV_PART_TAG] =
78              new GrammarTransition<EncKrbPrivPartContainer>(
79                  EncKrbPrivPartStatesEnum.START_STATE,
80                  EncKrbPrivPartStatesEnum.ENC_KRB_PRIV_PART_TAG_STATE,
81                  KerberosConstants.ENC_KRB_PRIV_PART_TAG,
82                  new EncKrbPrivPartInit() );
83  
84          // --------------------------------------------------------------------------------------------
85          // Transition from EncKrbPrivPart tag to EncKrbPrivPart seq
86          // --------------------------------------------------------------------------------------------
87          // EncKrbPrivPart  ::= [APPLICATION 28] SEQUENCE {
88          super.transitions[EncKrbPrivPartStatesEnum.ENC_KRB_PRIV_PART_TAG_STATE.ordinal()][UniversalTag.SEQUENCE
89              .getValue()] =
90              new GrammarTransition<EncKrbPrivPartContainer>(
91                  EncKrbPrivPartStatesEnum.ENC_KRB_PRIV_PART_TAG_STATE,
92                  EncKrbPrivPartStatesEnum.ENC_KRB_PRIV_PART_SEQ_TAG_STATE,
93                  UniversalTag.SEQUENCE,
94                  new CheckNotNullLength<EncKrbPrivPartContainer>() );
95  
96          // --------------------------------------------------------------------------------------------
97          // Transition from EncKrbPrivPart seq to user-data tag
98          // --------------------------------------------------------------------------------------------
99          // EncKrbPrivPart   ::= SEQUENCE {
100         // user-data       [0]
101         super.transitions[EncKrbPrivPartStatesEnum.ENC_KRB_PRIV_PART_SEQ_TAG_STATE.ordinal()][KerberosConstants.ENC_KRB_PRIV_PART_USER_DATA_TAG] =
102             new GrammarTransition<EncKrbPrivPartContainer>(
103                 EncKrbPrivPartStatesEnum.ENC_KRB_PRIV_PART_SEQ_TAG_STATE,
104                 EncKrbPrivPartStatesEnum.ENC_KRB_PRIV_PART_USER_DATA_TAG_STATE,
105                 KerberosConstants.ENC_KRB_PRIV_PART_USER_DATA_TAG,
106                 new CheckNotNullLength<EncKrbPrivPartContainer>() );
107 
108         // --------------------------------------------------------------------------------------------
109         // Transition from user-data tag to user-data value
110         // --------------------------------------------------------------------------------------------
111         // EncKrbPrivPart   ::= SEQUENCE {
112         // user-data       [0] OCTET STRING
113         super.transitions[EncKrbPrivPartStatesEnum.ENC_KRB_PRIV_PART_USER_DATA_TAG_STATE.ordinal()][UniversalTag.OCTET_STRING
114             .getValue()] =
115             new GrammarTransition<EncKrbPrivPartContainer>(
116                 EncKrbPrivPartStatesEnum.ENC_KRB_PRIV_PART_USER_DATA_TAG_STATE,
117                 EncKrbPrivPartStatesEnum.ENC_KRB_PRIV_PART_USER_DATA_STATE,
118                 UniversalTag.OCTET_STRING,
119                 new StoreUserData() );
120 
121         // --------------------------------------------------------------------------------------------
122         // Transition from user-data value to timestamp tag
123         // --------------------------------------------------------------------------------------------
124         // EncKrbPrivPart   ::= SEQUENCE {
125         // timestamp       [1]
126         super.transitions[EncKrbPrivPartStatesEnum.ENC_KRB_PRIV_PART_USER_DATA_STATE.ordinal()][KerberosConstants.ENC_KRB_PRIV_PART_TIMESTAMP_TAG] =
127             new GrammarTransition<EncKrbPrivPartContainer>(
128                 EncKrbPrivPartStatesEnum.ENC_KRB_PRIV_PART_USER_DATA_STATE,
129                 EncKrbPrivPartStatesEnum.ENC_KRB_PRIV_PART_TIMESTAMP_TAG_STATE,
130                 KerberosConstants.ENC_KRB_PRIV_PART_TIMESTAMP_TAG,
131                 new CheckNotNullLength<EncKrbPrivPartContainer>() );
132 
133         // --------------------------------------------------------------------------------------------
134         // Transition from timestamp tag to timestamp value
135         // --------------------------------------------------------------------------------------------
136         // EncKrbPrivPart   ::= SEQUENCE {
137         // timestamp       [1] KerberosTime OPTIONAL
138         super.transitions[EncKrbPrivPartStatesEnum.ENC_KRB_PRIV_PART_TIMESTAMP_TAG_STATE.ordinal()][UniversalTag.GENERALIZED_TIME
139             .getValue()] =
140             new GrammarTransition<EncKrbPrivPartContainer>(
141                 EncKrbPrivPartStatesEnum.ENC_KRB_PRIV_PART_TIMESTAMP_TAG_STATE,
142                 EncKrbPrivPartStatesEnum.ENC_KRB_PRIV_PART_TIMESTAMP_STATE,
143                 UniversalTag.GENERALIZED_TIME,
144                 new StoreTimestamp() );
145 
146         // --------------------------------------------------------------------------------------------
147         // Transition from timestamp value to usec tag
148         // --------------------------------------------------------------------------------------------
149         // EncKrbPrivPart   ::= SEQUENCE {
150         // usec            [2]
151         super.transitions[EncKrbPrivPartStatesEnum.ENC_KRB_PRIV_PART_TIMESTAMP_STATE.ordinal()][KerberosConstants.ENC_KRB_PRIV_PART_USEC_TAG] =
152             new GrammarTransition<EncKrbPrivPartContainer>(
153                 EncKrbPrivPartStatesEnum.ENC_KRB_PRIV_PART_TIMESTAMP_STATE,
154                 EncKrbPrivPartStatesEnum.ENC_KRB_PRIV_PART_USEC_TAG_STATE,
155                 KerberosConstants.ENC_KRB_PRIV_PART_USEC_TAG,
156                 new CheckNotNullLength<EncKrbPrivPartContainer>() );
157 
158         // --------------------------------------------------------------------------------------------
159         // Transition from usec tag to usec value
160         // --------------------------------------------------------------------------------------------
161         // EncKrbPrivPart   ::= SEQUENCE {
162         // usec            [2] Microseconds OPTIONAL
163         super.transitions[EncKrbPrivPartStatesEnum.ENC_KRB_PRIV_PART_USEC_TAG_STATE.ordinal()][UniversalTag.INTEGER
164             .getValue()] =
165             new GrammarTransition<EncKrbPrivPartContainer>(
166                 EncKrbPrivPartStatesEnum.ENC_KRB_PRIV_PART_USEC_TAG_STATE,
167                 EncKrbPrivPartStatesEnum.ENC_KRB_PRIV_PART_USEC_STATE,
168                 UniversalTag.INTEGER,
169                 new StoreUsec() );
170 
171         // --------------------------------------------------------------------------------------------
172         // Transition from usec value to seq-number tag
173         // --------------------------------------------------------------------------------------------
174         // EncKrbPrivPart   ::= SEQUENCE {
175         // seq-number      [3]
176         super.transitions[EncKrbPrivPartStatesEnum.ENC_KRB_PRIV_PART_USEC_STATE.ordinal()][KerberosConstants.ENC_KRB_PRIV_PART_SEQ_NUMBER_TAG] =
177             new GrammarTransition<EncKrbPrivPartContainer>(
178                 EncKrbPrivPartStatesEnum.ENC_KRB_PRIV_PART_USEC_STATE,
179                 EncKrbPrivPartStatesEnum.ENC_KRB_PRIV_PART_SEQ_NUMBER_TAG_STATE,
180                 KerberosConstants.ENC_KRB_PRIV_PART_SEQ_NUMBER_TAG,
181                 new CheckNotNullLength<EncKrbPrivPartContainer>() );
182 
183         // --------------------------------------------------------------------------------------------
184         // Transition from seq-number tag to seq-number value
185         // --------------------------------------------------------------------------------------------
186         // EncKrbPrivPart   ::= SEQUENCE {
187         // seq-number      [3] UInt32 OPTIONAL
188         super.transitions[EncKrbPrivPartStatesEnum.ENC_KRB_PRIV_PART_SEQ_NUMBER_TAG_STATE.ordinal()][UniversalTag.INTEGER
189             .getValue()] =
190             new GrammarTransition<EncKrbPrivPartContainer>(
191                 EncKrbPrivPartStatesEnum.ENC_KRB_PRIV_PART_SEQ_NUMBER_TAG_STATE,
192                 EncKrbPrivPartStatesEnum.ENC_KRB_PRIV_PART_SEQ_NUMBER_STATE,
193                 UniversalTag.INTEGER,
194                 new StoreSeqNumber() );
195 
196         // --------------------------------------------------------------------------------------------
197         // Transition from seq-number to s-address tag
198         // --------------------------------------------------------------------------------------------
199         // EncKrbPrivPart   ::= SEQUENCE {
200         // s-address       [4] HostAddress
201         super.transitions[EncKrbPrivPartStatesEnum.ENC_KRB_PRIV_PART_SEQ_NUMBER_STATE.ordinal()][KerberosConstants.ENC_KRB_PRIV_PART_SENDER_ADDRESS_TAG] =
202             new GrammarTransition<EncKrbPrivPartContainer>(
203                 EncKrbPrivPartStatesEnum.ENC_KRB_PRIV_PART_SEQ_NUMBER_STATE,
204                 EncKrbPrivPartStatesEnum.ENC_KRB_PRIV_PART_SENDER_ADDRESS_TAG_STATE,
205                 KerberosConstants.ENC_KRB_PRIV_PART_SENDER_ADDRESS_TAG,
206                 new StoreSenderAddress() );
207 
208         // --------------------------------------------------------------------------------------------
209         // Transition from s-address tag to r-address tag
210         // --------------------------------------------------------------------------------------------
211         // EncKrbPrivPart   ::= SEQUENCE {
212         // r-address       [5] HostAddress
213         super.transitions[EncKrbPrivPartStatesEnum.ENC_KRB_PRIV_PART_SENDER_ADDRESS_TAG_STATE.ordinal()][KerberosConstants.ENC_KRB_PRIV_PART_RECIPIENT_ADDRESS_TAG] =
214             new GrammarTransition<EncKrbPrivPartContainer>(
215                 EncKrbPrivPartStatesEnum.ENC_KRB_PRIV_PART_SENDER_ADDRESS_TAG_STATE,
216                 EncKrbPrivPartStatesEnum.ENC_KRB_PRIV_PART_RECIPIENT_ADDRESS_TAG_STATE,
217                 KerberosConstants.ENC_KRB_PRIV_PART_RECIPIENT_ADDRESS_TAG,
218                 new StoreRecipientAddress() );
219 
220         //----------------------------- OPTIONAL transitions ---------------------------
221 
222         // --------------------------------------------------------------------------------------------
223         // Transition from user-data value to usec tag
224         // --------------------------------------------------------------------------------------------
225         // EncKrbPrivPart   ::= SEQUENCE {
226         // usec       [2]
227         super.transitions[EncKrbPrivPartStatesEnum.ENC_KRB_PRIV_PART_USER_DATA_STATE.ordinal()][KerberosConstants.ENC_KRB_PRIV_PART_USEC_TAG] =
228             new GrammarTransition<EncKrbPrivPartContainer>(
229                 EncKrbPrivPartStatesEnum.ENC_KRB_PRIV_PART_USER_DATA_STATE,
230                 EncKrbPrivPartStatesEnum.ENC_KRB_PRIV_PART_USEC_TAG_STATE,
231                 KerberosConstants.ENC_KRB_PRIV_PART_USEC_TAG,
232                 new CheckNotNullLength<EncKrbPrivPartContainer>() );
233 
234         // --------------------------------------------------------------------------------------------
235         // Transition from user-data value to seq-number tag
236         // --------------------------------------------------------------------------------------------
237         // EncKrbPrivPart   ::= SEQUENCE {
238         // seq-number       [3]
239         super.transitions[EncKrbPrivPartStatesEnum.ENC_KRB_PRIV_PART_USER_DATA_STATE.ordinal()][KerberosConstants.ENC_KRB_PRIV_PART_SEQ_NUMBER_TAG] =
240             new GrammarTransition<EncKrbPrivPartContainer>(
241                 EncKrbPrivPartStatesEnum.ENC_KRB_PRIV_PART_USER_DATA_STATE,
242                 EncKrbPrivPartStatesEnum.ENC_KRB_PRIV_PART_SEQ_NUMBER_TAG_STATE,
243                 KerberosConstants.ENC_KRB_PRIV_PART_SEQ_NUMBER_TAG,
244                 new CheckNotNullLength<EncKrbPrivPartContainer>() );
245 
246         // --------------------------------------------------------------------------------------------
247         // Transition from user-data value to s-address tag
248         // --------------------------------------------------------------------------------------------
249         // EncKrbPrivPart   ::= SEQUENCE {
250         // s-address       [4]
251         super.transitions[EncKrbPrivPartStatesEnum.ENC_KRB_PRIV_PART_USER_DATA_STATE.ordinal()][KerberosConstants.ENC_KRB_PRIV_PART_SENDER_ADDRESS_TAG] =
252             new GrammarTransition<EncKrbPrivPartContainer>(
253                 EncKrbPrivPartStatesEnum.ENC_KRB_PRIV_PART_USER_DATA_STATE,
254                 EncKrbPrivPartStatesEnum.ENC_KRB_PRIV_PART_SENDER_ADDRESS_TAG_STATE,
255                 KerberosConstants.ENC_KRB_PRIV_PART_SENDER_ADDRESS_TAG,
256                 new StoreSenderAddress() );
257 
258         // --------------------------------------------------------------------------------------------
259         // Transition from timestamp value to seq-number tag
260         // --------------------------------------------------------------------------------------------
261         // EncKrbPrivPart   ::= SEQUENCE {
262         // seq-number       [3]
263         super.transitions[EncKrbPrivPartStatesEnum.ENC_KRB_PRIV_PART_TIMESTAMP_STATE.ordinal()][KerberosConstants.ENC_KRB_PRIV_PART_SEQ_NUMBER_TAG] =
264             new GrammarTransition<EncKrbPrivPartContainer>(
265                 EncKrbPrivPartStatesEnum.ENC_KRB_PRIV_PART_TIMESTAMP_STATE,
266                 EncKrbPrivPartStatesEnum.ENC_KRB_PRIV_PART_SEQ_NUMBER_TAG_STATE,
267                 KerberosConstants.ENC_KRB_PRIV_PART_SEQ_NUMBER_TAG,
268                 new CheckNotNullLength<EncKrbPrivPartContainer>() );
269         
270         // --------------------------------------------------------------------------------------------
271         // Transition from timestamp value to s-address tag
272         // --------------------------------------------------------------------------------------------
273         // EncKrbPrivPart   ::= SEQUENCE {
274         // s-address       [4]
275         super.transitions[EncKrbPrivPartStatesEnum.ENC_KRB_PRIV_PART_TIMESTAMP_STATE.ordinal()][KerberosConstants.ENC_KRB_PRIV_PART_SENDER_ADDRESS_TAG] =
276             new GrammarTransition<EncKrbPrivPartContainer>(
277                 EncKrbPrivPartStatesEnum.ENC_KRB_PRIV_PART_TIMESTAMP_STATE,
278                 EncKrbPrivPartStatesEnum.ENC_KRB_PRIV_PART_SENDER_ADDRESS_TAG_STATE,
279                 KerberosConstants.ENC_KRB_PRIV_PART_SENDER_ADDRESS_TAG,
280                 new StoreSenderAddress() );
281 
282         // --------------------------------------------------------------------------------------------
283         // Transition from usec value to s-address tag
284         // --------------------------------------------------------------------------------------------
285         // EncKrbPrivPart   ::= SEQUENCE {
286         // s-address       [4]
287         super.transitions[EncKrbPrivPartStatesEnum.ENC_KRB_PRIV_PART_USEC_STATE.ordinal()][KerberosConstants.ENC_KRB_PRIV_PART_SENDER_ADDRESS_TAG] =
288             new GrammarTransition<EncKrbPrivPartContainer>(
289                 EncKrbPrivPartStatesEnum.ENC_KRB_PRIV_PART_USEC_STATE,
290                 EncKrbPrivPartStatesEnum.ENC_KRB_PRIV_PART_SENDER_ADDRESS_TAG_STATE,
291                 KerberosConstants.ENC_KRB_PRIV_PART_SENDER_ADDRESS_TAG,
292                 new StoreSenderAddress() );
293     }
294 
295 
296     /**
297      * Get the instance of this grammar
298      *
299      * @return An instance on the EncKrbPrivPart Grammar
300      */
301     public static Grammar<EncKrbPrivPartContainer> getInstance()
302     {
303         return instance;
304     }
305 }