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.encryptedData;
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.encryptedData.actions.EncryptedDataInit;
30 import org.apache.directory.shared.kerberos.codec.encryptedData.actions.StoreCipher;
31 import org.apache.directory.shared.kerberos.codec.encryptedData.actions.StoreEType;
32 import org.apache.directory.shared.kerberos.codec.encryptedData.actions.StoreKvno;
33 import org.slf4j.Logger;
34 import org.slf4j.LoggerFactory;
35
36
37 /**
38 * This class implements the EncryptedData structure. All the actions are declared
39 * in this class. As it is a singleton, these declaration are only done once. If
40 * an action is to be added or modified, this is where the work is to be done !
41 *
42 * @author <a href="mailto:dev@directory.apache.org">Apache Directory Project</a>
43 */
44 public final class EncryptedDataGrammar extends AbstractGrammar<EncryptedDataContainer>
45 {
46 /** The logger */
47 static final Logger LOG = LoggerFactory.getLogger( EncryptedDataGrammar.class );
48
49 /** A speedup for logger */
50 static final boolean IS_DEBUG = LOG.isDebugEnabled();
51
52 /** The instance of grammar. EncryptedDataGrammar is a singleton */
53 private static Grammar<EncryptedDataContainer> instance = new EncryptedDataGrammar();
54
55
56 /**
57 * Creates a new EncryptedDataGrammar object.
58 */
59 @SuppressWarnings("unchecked")
60 private EncryptedDataGrammar()
61 {
62 setName( EncryptedDataGrammar.class.getName() );
63
64 // Create the transitions table
65 super.transitions = new GrammarTransition[EncryptedDataStatesEnum.LAST_ENCRYPTED_DATA_STATE.ordinal()][256];
66
67 // ============================================================================================
68 // EncryptedData
69 // ============================================================================================
70 // --------------------------------------------------------------------------------------------
71 // Transition from EncryptedData init to EncryptedData SEQ
72 // --------------------------------------------------------------------------------------------
73 // EncryptedData ::= SEQUENCE
74 super.transitions[EncryptedDataStatesEnum.START_STATE.ordinal()][UniversalTag.SEQUENCE.getValue()] =
75 new GrammarTransition<EncryptedDataContainer>(
76 EncryptedDataStatesEnum.START_STATE,
77 EncryptedDataStatesEnum.ENCRYPTED_DATA_SEQ_STATE,
78 UniversalTag.SEQUENCE,
79 new EncryptedDataInit() );
80
81 // --------------------------------------------------------------------------------------------
82 // Transition from EncryptedData SEQ to etype tag
83 // --------------------------------------------------------------------------------------------
84 // EncryptedData ::= SEQUENCE {
85 // etype [0]
86 super.transitions[EncryptedDataStatesEnum.ENCRYPTED_DATA_SEQ_STATE.ordinal()][KerberosConstants.ENCRYPTED_DATA_ETYPE_TAG] =
87 new GrammarTransition<EncryptedDataContainer>(
88 EncryptedDataStatesEnum.ENCRYPTED_DATA_SEQ_STATE,
89 EncryptedDataStatesEnum.ENCRYPTED_DATA_ETYPE_TAG_STATE,
90 KerberosConstants.ENCRYPTED_DATA_ETYPE_TAG,
91 new CheckNotNullLength<EncryptedDataContainer>() );
92
93 // --------------------------------------------------------------------------------------------
94 // Transition from etype tag to etype value
95 // --------------------------------------------------------------------------------------------
96 // EncryptedData ::= SEQUENCE {
97 // etype [0] Int32,
98 super.transitions[EncryptedDataStatesEnum.ENCRYPTED_DATA_ETYPE_TAG_STATE.ordinal()][UniversalTag.INTEGER
99 .getValue()] =
100 new GrammarTransition<EncryptedDataContainer>(
101 EncryptedDataStatesEnum.ENCRYPTED_DATA_ETYPE_TAG_STATE,
102 EncryptedDataStatesEnum.ENCRYPTED_DATA_ETYPE_STATE,
103 UniversalTag.INTEGER,
104 new StoreEType() );
105
106 // --------------------------------------------------------------------------------------------
107 // Transition from etype value to kvno tag
108 // --------------------------------------------------------------------------------------------
109 // EncryptedData ::= SEQUENCE {
110 // ...
111 // kvno [1]
112 super.transitions[EncryptedDataStatesEnum.ENCRYPTED_DATA_ETYPE_STATE.ordinal()][KerberosConstants.ENCRYPTED_DATA_KVNO_TAG] =
113 new GrammarTransition<EncryptedDataContainer>(
114 EncryptedDataStatesEnum.ENCRYPTED_DATA_ETYPE_STATE,
115 EncryptedDataStatesEnum.ENCRYPTED_DATA_KVNO_TAG_STATE,
116 KerberosConstants.ENCRYPTED_DATA_KVNO_TAG,
117 new CheckNotNullLength<EncryptedDataContainer>() );
118
119 // --------------------------------------------------------------------------------------------
120 // Transition from etype value to cipher tag (kvno is missing)
121 // --------------------------------------------------------------------------------------------
122 // EncryptedData ::= SEQUENCE {
123 // ...
124 // cipher [2]
125 super.transitions[EncryptedDataStatesEnum.ENCRYPTED_DATA_ETYPE_STATE.ordinal()][KerberosConstants.ENCRYPTED_DATA_CIPHER_TAG] =
126 new GrammarTransition<EncryptedDataContainer>(
127 EncryptedDataStatesEnum.ENCRYPTED_DATA_ETYPE_STATE,
128 EncryptedDataStatesEnum.ENCRYPTED_DATA_CIPHER_TAG_STATE,
129 KerberosConstants.ENCRYPTED_DATA_CIPHER_TAG,
130 new CheckNotNullLength<EncryptedDataContainer>() );
131
132 // --------------------------------------------------------------------------------------------
133 // Transition from kvno tag to kvno value
134 // --------------------------------------------------------------------------------------------
135 // EncryptedData ::= SEQUENCE {
136 // ...
137 // kvno [1] UInt32
138 super.transitions[EncryptedDataStatesEnum.ENCRYPTED_DATA_KVNO_TAG_STATE.ordinal()][UniversalTag.INTEGER
139 .getValue()] =
140 new GrammarTransition<EncryptedDataContainer>(
141 EncryptedDataStatesEnum.ENCRYPTED_DATA_KVNO_TAG_STATE,
142 EncryptedDataStatesEnum.ENCRYPTED_DATA_KVNO_STATE,
143 UniversalTag.INTEGER,
144 new StoreKvno() );
145
146 // --------------------------------------------------------------------------------------------
147 // Transition from kvno value value to cipher tag
148 // --------------------------------------------------------------------------------------------
149 // EncryptedData ::= SEQUENCE {
150 // ...
151 // cipher [2]
152 super.transitions[EncryptedDataStatesEnum.ENCRYPTED_DATA_KVNO_STATE.ordinal()][KerberosConstants.ENCRYPTED_DATA_CIPHER_TAG] =
153 new GrammarTransition<EncryptedDataContainer>(
154 EncryptedDataStatesEnum.ENCRYPTED_DATA_KVNO_STATE,
155 EncryptedDataStatesEnum.ENCRYPTED_DATA_CIPHER_TAG_STATE,
156 KerberosConstants.ENCRYPTED_DATA_CIPHER_TAG,
157 new CheckNotNullLength<EncryptedDataContainer>() );
158
159 // --------------------------------------------------------------------------------------------
160 // Transition from cipher tag to cipher value
161 // --------------------------------------------------------------------------------------------
162 // EncryptedData ::= SEQUENCE {
163 // ...
164 // cipher [2] OCTET STRING
165 super.transitions[EncryptedDataStatesEnum.ENCRYPTED_DATA_CIPHER_TAG_STATE.ordinal()][UniversalTag.OCTET_STRING
166 .getValue()] =
167 new GrammarTransition<EncryptedDataContainer>(
168 EncryptedDataStatesEnum.ENCRYPTED_DATA_CIPHER_TAG_STATE,
169 EncryptedDataStatesEnum.ENCRYPTED_DATA_CIPHER_STATE,
170 UniversalTag.OCTET_STRING,
171 new StoreCipher() );
172 }
173
174
175 /**
176 * Get the instance of this grammar
177 *
178 * @return An instance on the EncryptedData Grammar
179 */
180 public static Grammar<EncryptedDataContainer> getInstance()
181 {
182 return instance;
183 }
184 }