001/* 002 * Licensed to the Apache Software Foundation (ASF) under one 003 * or more contributor license agreements. See the NOTICE file 004 * distributed with this work for additional information 005 * regarding copyright ownership. The ASF licenses this file 006 * to you under the Apache License, Version 2.0 (the 007 * "License"); you may not use this file except in compliance 008 * with the License. You may obtain a copy of the License at 009 * 010 * http://www.apache.org/licenses/LICENSE-2.0 011 * 012 * Unless required by applicable law or agreed to in writing, 013 * software distributed under the License is distributed on an 014 * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY 015 * KIND, either express or implied. See the License for the 016 * specific language governing permissions and limitations 017 * under the License. 018 * 019 */ 020package org.apache.directory.shared.kerberos.codec.ticket; 021 022 023import org.apache.directory.api.asn1.actions.CheckNotNullLength; 024import org.apache.directory.api.asn1.ber.grammar.AbstractGrammar; 025import org.apache.directory.api.asn1.ber.grammar.Grammar; 026import org.apache.directory.api.asn1.ber.grammar.GrammarTransition; 027import org.apache.directory.api.asn1.ber.tlv.UniversalTag; 028import org.apache.directory.shared.kerberos.KerberosConstants; 029import org.apache.directory.shared.kerberos.codec.ticket.actions.StoreEncPart; 030import org.apache.directory.shared.kerberos.codec.ticket.actions.StoreRealm; 031import org.apache.directory.shared.kerberos.codec.ticket.actions.StoreSName; 032import org.apache.directory.shared.kerberos.codec.ticket.actions.StoreTktVno; 033import org.apache.directory.shared.kerberos.codec.ticket.actions.TicketInit; 034 035 036/** 037 * This class implements the Ticket message. All the actions are declared 038 * in this class. As it is a singleton, these declaration are only done once. If 039 * an action is to be added or modified, this is where the work is to be done ! 040 * 041 * @author <a href="mailto:dev@directory.apache.org">Apache Directory Project</a> 042 */ 043public final class TicketGrammar extends AbstractGrammar<TicketContainer> 044{ 045 /** The instance of grammar. TicketGrammar is a singleton */ 046 private static Grammar<TicketContainer> instance = new TicketGrammar(); 047 048 049 /** 050 * Creates a new TicketGrammar object. 051 */ 052 @SuppressWarnings("unchecked") 053 private TicketGrammar() 054 { 055 setName( TicketGrammar.class.getName() ); 056 057 // Create the transitions table 058 super.transitions = new GrammarTransition[TicketStatesEnum.LAST_TICKET_STATE.ordinal()][256]; 059 060 // ============================================================================================ 061 // Ticket 062 // ============================================================================================ 063 // -------------------------------------------------------------------------------------------- 064 // Transition from START to Ticket 065 // -------------------------------------------------------------------------------------------- 066 // This is the starting state : 067 // Ticket ::= [APPLICATION 1] ... 068 super.transitions[TicketStatesEnum.START_STATE.ordinal()][KerberosConstants.TICKET_TAG] = 069 new GrammarTransition<TicketContainer>( 070 TicketStatesEnum.START_STATE, 071 TicketStatesEnum.TICKET_STATE, 072 KerberosConstants.TICKET_TAG, 073 new TicketInit() ); 074 075 // -------------------------------------------------------------------------------------------- 076 // Transition from Ticket to Ticket-SEQ 077 // -------------------------------------------------------------------------------------------- 078 // Ticket ::= [APPLICATION 1] SEQUENCE { 079 super.transitions[TicketStatesEnum.TICKET_STATE.ordinal()][UniversalTag.SEQUENCE.getValue()] = 080 new GrammarTransition<TicketContainer>( 081 TicketStatesEnum.TICKET_STATE, 082 TicketStatesEnum.TICKET_SEQ_STATE, 083 UniversalTag.SEQUENCE, 084 new CheckNotNullLength<TicketContainer>() ); 085 086 // -------------------------------------------------------------------------------------------- 087 // Transition from Ticket-SEQ to tkt-vno tag 088 // -------------------------------------------------------------------------------------------- 089 // Ticket ::= [APPLICATION 1] SEQUENCE { 090 // tkt-vno [0] 091 super.transitions[TicketStatesEnum.TICKET_SEQ_STATE.ordinal()][KerberosConstants.TICKET_TKT_VNO_TAG] = 092 new GrammarTransition<TicketContainer>( 093 TicketStatesEnum.TICKET_SEQ_STATE, 094 TicketStatesEnum.TICKET_VNO_TAG_STATE, 095 KerberosConstants.TICKET_TKT_VNO_TAG, 096 new CheckNotNullLength<TicketContainer>() ); 097 098 // -------------------------------------------------------------------------------------------- 099 // 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}