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.krbSafeBody;
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.krbSafeBody.actions.KrbSafeBodyInit;
30 import org.apache.directory.shared.kerberos.codec.krbSafeBody.actions.StoreRecipientAddress;
31 import org.apache.directory.shared.kerberos.codec.krbSafeBody.actions.StoreSenderAddress;
32 import org.apache.directory.shared.kerberos.codec.krbSafeBody.actions.StoreSeqNumber;
33 import org.apache.directory.shared.kerberos.codec.krbSafeBody.actions.StoreTimestamp;
34 import org.apache.directory.shared.kerberos.codec.krbSafeBody.actions.StoreUsec;
35 import org.apache.directory.shared.kerberos.codec.krbSafeBody.actions.StoreUserData;
36 import org.slf4j.Logger;
37 import org.slf4j.LoggerFactory;
38
39
40 /**
41 * This class implements the KRB-SAFE-BODY 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 KrbSafeBodyGrammar extends AbstractGrammar<KrbSafeBodyContainer>
48 {
49 /** The logger */
50 static final Logger LOG = LoggerFactory.getLogger( KrbSafeBodyGrammar.class );
51
52 /** A speedup for logger */
53 static final boolean IS_DEBUG = LOG.isDebugEnabled();
54
55 /** The instance of grammar. KrbSafeBodyGrammar is a singleton */
56 private static Grammar<KrbSafeBodyContainer> instance = new KrbSafeBodyGrammar();
57
58
59 /**
60 * Creates a new KrbSafeBodyGrammar object.
61 */
62 @SuppressWarnings("unchecked")
63 private KrbSafeBodyGrammar()
64 {
65 setName( KrbSafeBodyGrammar.class.getName() );
66
67 // Create the transitions table
68 super.transitions = new GrammarTransition[KrbSafeBodyStatesEnum.LAST_KRB_SAFE_BODY_STATE.ordinal()][256];
69
70 // ============================================================================================
71 // KrbSafeBody
72 // ============================================================================================
73 // --------------------------------------------------------------------------------------------
74 // Transition from KrbSafeBody init to KrbSafeBody seq
75 // --------------------------------------------------------------------------------------------
76 // KRB-SAFE-BODY ::= SEQUENCE {
77 super.transitions[KrbSafeBodyStatesEnum.START_STATE.ordinal()][UniversalTag.SEQUENCE.getValue()] =
78 new GrammarTransition<KrbSafeBodyContainer>(
79 KrbSafeBodyStatesEnum.START_STATE,
80 KrbSafeBodyStatesEnum.KRB_SAFE_BODY_SEQ_TAG_STATE,
81 UniversalTag.SEQUENCE,
82 new KrbSafeBodyInit() );
83
84 // --------------------------------------------------------------------------------------------
85 // Transition from KrbSafeBody seq to user-data tag
86 // --------------------------------------------------------------------------------------------
87 // KRB-SAFE-BODY ::= SEQUENCE {
88 // user-data [0]
89 super.transitions[KrbSafeBodyStatesEnum.KRB_SAFE_BODY_SEQ_TAG_STATE.ordinal()][KerberosConstants.KRB_SAFE_BODY_USER_DATA_TAG] =
90 new GrammarTransition<KrbSafeBodyContainer>(
91 KrbSafeBodyStatesEnum.KRB_SAFE_BODY_SEQ_TAG_STATE,
92 KrbSafeBodyStatesEnum.KRB_SAFE_BODY_USER_DATA_TAG_STATE,
93 KerberosConstants.KRB_SAFE_BODY_USER_DATA_TAG,
94 new CheckNotNullLength<KrbSafeBodyContainer>() );
95
96 // --------------------------------------------------------------------------------------------
97 // Transition from user-data tag to user-data value
98 // --------------------------------------------------------------------------------------------
99 // KRB-SAFE-BODY ::= SEQUENCE {
100 // user-data [0] OCTET STRING
101 super.transitions[KrbSafeBodyStatesEnum.KRB_SAFE_BODY_USER_DATA_TAG_STATE.ordinal()][UniversalTag.OCTET_STRING
102 .getValue()] =
103 new GrammarTransition<KrbSafeBodyContainer>(
104 KrbSafeBodyStatesEnum.KRB_SAFE_BODY_USER_DATA_TAG_STATE,
105 KrbSafeBodyStatesEnum.KRB_SAFE_BODY_USER_DATA_STATE,
106 UniversalTag.OCTET_STRING,
107 new StoreUserData() );
108
109 // --------------------------------------------------------------------------------------------
110 // Transition from user-data value to timestamp tag
111 // --------------------------------------------------------------------------------------------
112 // KRB-SAFE-BODY ::= SEQUENCE {
113 // timestamp [1]
114 super.transitions[KrbSafeBodyStatesEnum.KRB_SAFE_BODY_USER_DATA_STATE.ordinal()][KerberosConstants.KRB_SAFE_BODY_TIMESTAMP_TAG] =
115 new GrammarTransition<KrbSafeBodyContainer>(
116 KrbSafeBodyStatesEnum.KRB_SAFE_BODY_USER_DATA_STATE,
117 KrbSafeBodyStatesEnum.KRB_SAFE_BODY_TIMESTAMP_TAG_STATE,
118 KerberosConstants.KRB_SAFE_BODY_TIMESTAMP_TAG,
119 new CheckNotNullLength<KrbSafeBodyContainer>() );
120
121 // --------------------------------------------------------------------------------------------
122 // Transition from timestamp tag to timestamp value
123 // --------------------------------------------------------------------------------------------
124 // KRB-SAFE-BODY ::= SEQUENCE {
125 // timestamp [1] KerberosTime OPTIONAL
126 super.transitions[KrbSafeBodyStatesEnum.KRB_SAFE_BODY_TIMESTAMP_TAG_STATE.ordinal()][UniversalTag.GENERALIZED_TIME
127 .getValue()] =
128 new GrammarTransition<KrbSafeBodyContainer>(
129 KrbSafeBodyStatesEnum.KRB_SAFE_BODY_TIMESTAMP_TAG_STATE,
130 KrbSafeBodyStatesEnum.KRB_SAFE_BODY_TIMESTAMP_STATE,
131 UniversalTag.GENERALIZED_TIME,
132 new StoreTimestamp() );
133
134 // --------------------------------------------------------------------------------------------
135 // Transition from timestamp value to usec tag
136 // --------------------------------------------------------------------------------------------
137 // KRB-SAFE-BODY ::= SEQUENCE {
138 // usec [2]
139 super.transitions[KrbSafeBodyStatesEnum.KRB_SAFE_BODY_TIMESTAMP_STATE.ordinal()][KerberosConstants.KRB_SAFE_BODY_USEC_TAG] =
140 new GrammarTransition<KrbSafeBodyContainer>(
141 KrbSafeBodyStatesEnum.KRB_SAFE_BODY_TIMESTAMP_STATE,
142 KrbSafeBodyStatesEnum.KRB_SAFE_BODY_USEC_TAG_STATE,
143 KerberosConstants.KRB_SAFE_BODY_USEC_TAG,
144 new CheckNotNullLength<KrbSafeBodyContainer>() );
145
146 // --------------------------------------------------------------------------------------------
147 // Transition from usec tag to usec value
148 // --------------------------------------------------------------------------------------------
149 // KRB-SAFE-BODY ::= SEQUENCE {
150 // usec [2] Microseconds OPTIONAL
151 super.transitions[KrbSafeBodyStatesEnum.KRB_SAFE_BODY_USEC_TAG_STATE.ordinal()][UniversalTag.INTEGER.getValue()] =
152 new GrammarTransition<KrbSafeBodyContainer>(
153 KrbSafeBodyStatesEnum.KRB_SAFE_BODY_USEC_TAG_STATE,
154 KrbSafeBodyStatesEnum.KRB_SAFE_BODY_USEC_STATE,
155 UniversalTag.INTEGER,
156 new StoreUsec() );
157
158 // --------------------------------------------------------------------------------------------
159 // Transition from usec value to seq-number tag
160 // --------------------------------------------------------------------------------------------
161 // KRB-SAFE-BODY ::= SEQUENCE {
162 // seq-number [3]
163 super.transitions[KrbSafeBodyStatesEnum.KRB_SAFE_BODY_USEC_STATE.ordinal()][KerberosConstants.KRB_SAFE_BODY_SEQ_NUMBER_TAG] =
164 new GrammarTransition<KrbSafeBodyContainer>(
165 KrbSafeBodyStatesEnum.KRB_SAFE_BODY_USEC_STATE,
166 KrbSafeBodyStatesEnum.KRB_SAFE_BODY_SEQ_NUMBER_TAG_STATE,
167 KerberosConstants.KRB_SAFE_BODY_SEQ_NUMBER_TAG,
168 new CheckNotNullLength<KrbSafeBodyContainer>() );
169
170 // --------------------------------------------------------------------------------------------
171 // Transition from seq-number tag to seq-number value
172 // --------------------------------------------------------------------------------------------
173 // KRB-SAFE-BODY ::= SEQUENCE {
174 // seq-number [3] UInt32 OPTIONAL
175 super.transitions[KrbSafeBodyStatesEnum.KRB_SAFE_BODY_SEQ_NUMBER_TAG_STATE.ordinal()][UniversalTag.INTEGER
176 .getValue()] =
177 new GrammarTransition<KrbSafeBodyContainer>(
178 KrbSafeBodyStatesEnum.KRB_SAFE_BODY_SEQ_NUMBER_TAG_STATE,
179 KrbSafeBodyStatesEnum.KRB_SAFE_BODY_SEQ_NUMBER_STATE,
180 UniversalTag.INTEGER,
181 new StoreSeqNumber() );
182
183 // --------------------------------------------------------------------------------------------
184 // Transition from seq-number to s-address tag
185 // --------------------------------------------------------------------------------------------
186 // KRB-SAFE-BODY ::= SEQUENCE {
187 // s-address [4] HostAddress
188 super.transitions[KrbSafeBodyStatesEnum.KRB_SAFE_BODY_SEQ_NUMBER_STATE.ordinal()][KerberosConstants.KRB_SAFE_BODY_SENDER_ADDRESS_TAG] =
189 new GrammarTransition<KrbSafeBodyContainer>(
190 KrbSafeBodyStatesEnum.KRB_SAFE_BODY_SEQ_NUMBER_STATE,
191 KrbSafeBodyStatesEnum.KRB_SAFE_BODY_SENDER_ADDRESS_TAG_STATE,
192 KerberosConstants.KRB_SAFE_BODY_SENDER_ADDRESS_TAG,
193 new StoreSenderAddress() );
194
195 // --------------------------------------------------------------------------------------------
196 // Transition from s-address tag to r-address tag
197 // --------------------------------------------------------------------------------------------
198 // KRB-SAFE-BODY ::= SEQUENCE {
199 // r-address [5] HostAddress
200 super.transitions[KrbSafeBodyStatesEnum.KRB_SAFE_BODY_SENDER_ADDRESS_TAG_STATE.ordinal()][KerberosConstants.KRB_SAFE_BODY_RECIPIENT_ADDRESS_TAG] =
201 new GrammarTransition<KrbSafeBodyContainer>(
202 KrbSafeBodyStatesEnum.KRB_SAFE_BODY_SENDER_ADDRESS_TAG_STATE,
203 KrbSafeBodyStatesEnum.KRB_SAFE_BODY_RECIPIENT_ADDRESS_TAG_STATE,
204 KerberosConstants.KRB_SAFE_BODY_RECIPIENT_ADDRESS_TAG,
205 new StoreRecipientAddress() );
206
207 //----------------------------- OPTIONAL transitions ---------------------------
208
209 // --------------------------------------------------------------------------------------------
210 // Transition from user-data value to usec tag
211 // --------------------------------------------------------------------------------------------
212 // KRB-SAFE-BODY ::= SEQUENCE {
213 // usec [2]
214 super.transitions[KrbSafeBodyStatesEnum.KRB_SAFE_BODY_USER_DATA_STATE.ordinal()][KerberosConstants.KRB_SAFE_BODY_USEC_TAG] =
215 new GrammarTransition<KrbSafeBodyContainer>(
216 KrbSafeBodyStatesEnum.KRB_SAFE_BODY_USER_DATA_STATE,
217 KrbSafeBodyStatesEnum.KRB_SAFE_BODY_USEC_TAG_STATE,
218 KerberosConstants.KRB_SAFE_BODY_USEC_TAG,
219 new CheckNotNullLength<KrbSafeBodyContainer>() );
220
221 // --------------------------------------------------------------------------------------------
222 // Transition from user-data value to seq-number tag
223 // --------------------------------------------------------------------------------------------
224 // KRB-SAFE-BODY ::= SEQUENCE {
225 // seq-number [3]
226 super.transitions[KrbSafeBodyStatesEnum.KRB_SAFE_BODY_USER_DATA_STATE.ordinal()][KerberosConstants.KRB_SAFE_BODY_SEQ_NUMBER_TAG] =
227 new GrammarTransition<KrbSafeBodyContainer>(
228 KrbSafeBodyStatesEnum.KRB_SAFE_BODY_USER_DATA_STATE,
229 KrbSafeBodyStatesEnum.KRB_SAFE_BODY_SEQ_NUMBER_TAG_STATE,
230 KerberosConstants.KRB_SAFE_BODY_SEQ_NUMBER_TAG,
231 new CheckNotNullLength<KrbSafeBodyContainer>() );
232
233 // --------------------------------------------------------------------------------------------
234 // Transition from user-data value to s-address tag
235 // --------------------------------------------------------------------------------------------
236 // KRB-SAFE-BODY ::= SEQUENCE {
237 // s-address [4]
238 super.transitions[KrbSafeBodyStatesEnum.KRB_SAFE_BODY_USER_DATA_STATE.ordinal()][KerberosConstants.KRB_SAFE_BODY_SENDER_ADDRESS_TAG] =
239 new GrammarTransition<KrbSafeBodyContainer>(
240 KrbSafeBodyStatesEnum.KRB_SAFE_BODY_USER_DATA_STATE,
241 KrbSafeBodyStatesEnum.KRB_SAFE_BODY_SENDER_ADDRESS_TAG_STATE,
242 KerberosConstants.KRB_SAFE_BODY_SENDER_ADDRESS_TAG,
243 new StoreSenderAddress() );
244
245 // --------------------------------------------------------------------------------------------
246 // Transition from usec value to s-address tag
247 // --------------------------------------------------------------------------------------------
248 // KRB-SAFE-BODY ::= SEQUENCE {
249 // s-address [4]
250 super.transitions[KrbSafeBodyStatesEnum.KRB_SAFE_BODY_USEC_STATE.ordinal()][KerberosConstants.KRB_SAFE_BODY_SENDER_ADDRESS_TAG] =
251 new GrammarTransition<KrbSafeBodyContainer>(
252 KrbSafeBodyStatesEnum.KRB_SAFE_BODY_USEC_STATE,
253 KrbSafeBodyStatesEnum.KRB_SAFE_BODY_SENDER_ADDRESS_TAG_STATE,
254 KerberosConstants.KRB_SAFE_BODY_SENDER_ADDRESS_TAG,
255 new StoreSenderAddress() );
256 }
257
258
259 /**
260 * Get the instance of this grammar
261 *
262 * @return An instance on the KRB-SAFE-BODY Grammar
263 */
264 public static Grammar<KrbSafeBodyContainer> getInstance()
265 {
266 return instance;
267 }
268 }