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.encKrbPrivPart; 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.encKrbPrivPart.actions.EncKrbPrivPartInit; 030import org.apache.directory.shared.kerberos.codec.encKrbPrivPart.actions.StoreRecipientAddress; 031import org.apache.directory.shared.kerberos.codec.encKrbPrivPart.actions.StoreSenderAddress; 032import org.apache.directory.shared.kerberos.codec.encKrbPrivPart.actions.StoreSeqNumber; 033import org.apache.directory.shared.kerberos.codec.encKrbPrivPart.actions.StoreTimestamp; 034import org.apache.directory.shared.kerberos.codec.encKrbPrivPart.actions.StoreUsec; 035import org.apache.directory.shared.kerberos.codec.encKrbPrivPart.actions.StoreUserData; 036import org.slf4j.Logger; 037import org.slf4j.LoggerFactory; 038 039 040/** 041 * This class implements the EncKrbPrivPart structure. All the actions are declared 042 * in this class. As it is a singleton, these declaration are only done once. If 043 * an action is to be added or modified, this is where the work is to be done ! 044 * 045 * @author <a href="mailto:dev@directory.apache.org">Apache Directory Project</a> 046 */ 047public final class EncKrbPrivPartGrammar extends AbstractGrammar<EncKrbPrivPartContainer> 048{ 049 /** The logger */ 050 static final Logger LOG = LoggerFactory.getLogger( EncKrbPrivPartGrammar.class ); 051 052 /** A speedup for logger */ 053 static final boolean IS_DEBUG = LOG.isDebugEnabled(); 054 055 /** The instance of grammar. EncKrbPrivPartGrammar is a singleton */ 056 private static Grammar<EncKrbPrivPartContainer> instance = new EncKrbPrivPartGrammar(); 057 058 059 /** 060 * Creates a new EncKrbPrivPartGrammar object. 061 */ 062 @SuppressWarnings("unchecked") 063 private EncKrbPrivPartGrammar() 064 { 065 setName( EncKrbPrivPartGrammar.class.getName() ); 066 067 // Create the transitions table 068 super.transitions = new GrammarTransition[EncKrbPrivPartStatesEnum.LAST_ENC_KRB_PRIV_PART_STATE.ordinal()][256]; 069 070 // ============================================================================================ 071 // EncKrbPrivPart 072 // ============================================================================================ 073 // -------------------------------------------------------------------------------------------- 074 // Transition from EncKrbPrivPart init to EncKrbPrivPart tag 075 // -------------------------------------------------------------------------------------------- 076 // EncKrbPrivPart ::= [APPLICATION 28] EncKrbPrivPart ::= SEQUENCE { 077 super.transitions[EncKrbPrivPartStatesEnum.START_STATE.ordinal()][KerberosConstants.ENC_KRB_PRIV_PART_TAG] = 078 new GrammarTransition<EncKrbPrivPartContainer>( 079 EncKrbPrivPartStatesEnum.START_STATE, 080 EncKrbPrivPartStatesEnum.ENC_KRB_PRIV_PART_TAG_STATE, 081 KerberosConstants.ENC_KRB_PRIV_PART_TAG, 082 new EncKrbPrivPartInit() ); 083 084 // -------------------------------------------------------------------------------------------- 085 // Transition from EncKrbPrivPart tag to EncKrbPrivPart seq 086 // -------------------------------------------------------------------------------------------- 087 // EncKrbPrivPart ::= [APPLICATION 28] SEQUENCE { 088 super.transitions[EncKrbPrivPartStatesEnum.ENC_KRB_PRIV_PART_TAG_STATE.ordinal()][UniversalTag.SEQUENCE 089 .getValue()] = 090 new GrammarTransition<EncKrbPrivPartContainer>( 091 EncKrbPrivPartStatesEnum.ENC_KRB_PRIV_PART_TAG_STATE, 092 EncKrbPrivPartStatesEnum.ENC_KRB_PRIV_PART_SEQ_TAG_STATE, 093 UniversalTag.SEQUENCE, 094 new CheckNotNullLength<EncKrbPrivPartContainer>() ); 095 096 // -------------------------------------------------------------------------------------------- 097 // Transition from EncKrbPrivPart seq to user-data tag 098 // -------------------------------------------------------------------------------------------- 099 // 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}