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.ticket;
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.ticket.actions.StoreEncPart;
30 import org.apache.directory.shared.kerberos.codec.ticket.actions.StoreRealm;
31 import org.apache.directory.shared.kerberos.codec.ticket.actions.StoreSName;
32 import org.apache.directory.shared.kerberos.codec.ticket.actions.StoreTktVno;
33 import org.apache.directory.shared.kerberos.codec.ticket.actions.TicketInit;
34
35
36 /**
37 * This class implements the Ticket message. All the actions are declared
38 * in this class. As it is a singleton, these declaration are only done once. If
39 * an action is to be added or modified, this is where the work is to be done !
40 *
41 * @author <a href="mailto:dev@directory.apache.org">Apache Directory Project</a>
42 */
43 public final class TicketGrammar extends AbstractGrammar<TicketContainer>
44 {
45 /** The instance of grammar. TicketGrammar is a singleton */
46 private static Grammar<TicketContainer> instance = new TicketGrammar();
47
48
49 /**
50 * Creates a new TicketGrammar object.
51 */
52 @SuppressWarnings("unchecked")
53 private TicketGrammar()
54 {
55 setName( TicketGrammar.class.getName() );
56
57 // Create the transitions table
58 super.transitions = new GrammarTransition[TicketStatesEnum.LAST_TICKET_STATE.ordinal()][256];
59
60 // ============================================================================================
61 // Ticket
62 // ============================================================================================
63 // --------------------------------------------------------------------------------------------
64 // Transition from START to Ticket
65 // --------------------------------------------------------------------------------------------
66 // This is the starting state :
67 // Ticket ::= [APPLICATION 1] ...
68 super.transitions[TicketStatesEnum.START_STATE.ordinal()][KerberosConstants.TICKET_TAG] =
69 new GrammarTransition<TicketContainer>(
70 TicketStatesEnum.START_STATE,
71 TicketStatesEnum.TICKET_STATE,
72 KerberosConstants.TICKET_TAG,
73 new TicketInit() );
74
75 // --------------------------------------------------------------------------------------------
76 // Transition from Ticket to Ticket-SEQ
77 // --------------------------------------------------------------------------------------------
78 // Ticket ::= [APPLICATION 1] SEQUENCE {
79 super.transitions[TicketStatesEnum.TICKET_STATE.ordinal()][UniversalTag.SEQUENCE.getValue()] =
80 new GrammarTransition<TicketContainer>(
81 TicketStatesEnum.TICKET_STATE,
82 TicketStatesEnum.TICKET_SEQ_STATE,
83 UniversalTag.SEQUENCE,
84 new CheckNotNullLength<TicketContainer>() );
85
86 // --------------------------------------------------------------------------------------------
87 // Transition from Ticket-SEQ to tkt-vno tag
88 // --------------------------------------------------------------------------------------------
89 // Ticket ::= [APPLICATION 1] SEQUENCE {
90 // tkt-vno [0]
91 super.transitions[TicketStatesEnum.TICKET_SEQ_STATE.ordinal()][KerberosConstants.TICKET_TKT_VNO_TAG] =
92 new GrammarTransition<TicketContainer>(
93 TicketStatesEnum.TICKET_SEQ_STATE,
94 TicketStatesEnum.TICKET_VNO_TAG_STATE,
95 KerberosConstants.TICKET_TKT_VNO_TAG,
96 new CheckNotNullLength<TicketContainer>() );
97
98 // --------------------------------------------------------------------------------------------
99 // Transition from tkt-vno tag to tkt-vno
100 // --------------------------------------------------------------------------------------------
101 // Ticket ::= [APPLICATION 1] SEQUENCE {
102 // tkt-vno [0] INTEGER (5),
103 super.transitions[TicketStatesEnum.TICKET_VNO_TAG_STATE.ordinal()][UniversalTag.INTEGER.getValue()] =
104 new GrammarTransition<TicketContainer>(
105 TicketStatesEnum.TICKET_VNO_TAG_STATE,
106 TicketStatesEnum.TICKET_VNO_STATE,
107 UniversalTag.INTEGER,
108 new StoreTktVno() );
109
110 // --------------------------------------------------------------------------------------------
111 // Transition from tkt-vno to realm tag
112 // --------------------------------------------------------------------------------------------
113 // Ticket ::= [APPLICATION 1] SEQUENCE {
114 // tkt-vno [0] INTEGER (5),
115 // realm [1]
116 super.transitions[TicketStatesEnum.TICKET_VNO_STATE.ordinal()][KerberosConstants.TICKET_REALM_TAG] =
117 new GrammarTransition<TicketContainer>(
118 TicketStatesEnum.TICKET_VNO_STATE,
119 TicketStatesEnum.TICKET_REALM_TAG_STATE,
120 KerberosConstants.TICKET_REALM_TAG,
121 new CheckNotNullLength<TicketContainer>() );
122
123 // --------------------------------------------------------------------------------------------
124 // Transition from realm tag to realm value
125 // --------------------------------------------------------------------------------------------
126 // Ticket ::= [APPLICATION 1] SEQUENCE {
127 // tkt-vno [0] INTEGER (5),
128 // realm [1] Realm,
129 super.transitions[TicketStatesEnum.TICKET_REALM_TAG_STATE.ordinal()][UniversalTag.GENERAL_STRING.getValue()] =
130 new GrammarTransition<TicketContainer>(
131 TicketStatesEnum.TICKET_REALM_TAG_STATE,
132 TicketStatesEnum.TICKET_REALM_STATE,
133 UniversalTag.GENERAL_STRING,
134 new StoreRealm() );
135
136 // --------------------------------------------------------------------------------------------
137 // Transition from realm value to sname tag
138 // --------------------------------------------------------------------------------------------
139 // Ticket ::= [APPLICATION 1] SEQUENCE {
140 // tkt-vno [0] INTEGER (5),
141 // realm [1] Realm,
142 // sname [2]
143 super.transitions[TicketStatesEnum.TICKET_REALM_STATE.ordinal()][KerberosConstants.TICKET_SNAME_TAG] =
144 new GrammarTransition<TicketContainer>(
145 TicketStatesEnum.TICKET_REALM_STATE,
146 TicketStatesEnum.TICKET_SNAME_TAG_STATE,
147 KerberosConstants.TICKET_SNAME_TAG,
148 new StoreSName() );
149
150 // --------------------------------------------------------------------------------------------
151 // Transition from sname tag to enc-part tag
152 // --------------------------------------------------------------------------------------------
153 // Ticket ::= [APPLICATION 1] SEQUENCE {
154 // ...
155 // sname [2] PrincipalName,
156 // enc-part [3]
157 //
158 super.transitions[TicketStatesEnum.TICKET_SNAME_TAG_STATE.ordinal()][KerberosConstants.TICKET_ENC_PART_TAG] =
159 new GrammarTransition<TicketContainer>(
160 TicketStatesEnum.TICKET_SNAME_TAG_STATE,
161 TicketStatesEnum.TICKET_ENC_PART_TAG_STATE,
162 KerberosConstants.TICKET_ENC_PART_TAG,
163 new CheckNotNullLength<TicketContainer>() );
164
165 // --------------------------------------------------------------------------------------------
166 // Transition from enc-part tag to enc-part value
167 // --------------------------------------------------------------------------------------------
168 // Ticket ::= [APPLICATION 1] SEQUENCE {
169 // ...
170 // enc-part [3] EncryptedData
171 //
172 super.transitions[TicketStatesEnum.TICKET_SNAME_TAG_STATE.ordinal()][KerberosConstants.TICKET_ENC_PART_TAG] =
173 new GrammarTransition<TicketContainer>(
174 TicketStatesEnum.TICKET_SNAME_TAG_STATE,
175 TicketStatesEnum.TICKET_ENC_PART_TAG_STATE,
176 KerberosConstants.TICKET_ENC_PART_TAG,
177 new StoreEncPart() );
178 }
179
180
181 /**
182 * Get the instance of this grammar
183 *
184 * @return An instance on the Ticket Grammar
185 */
186 public static Grammar<TicketContainer> getInstance()
187 {
188 return instance;
189 }
190 }