Author: erodriguez Date: Wed Feb 2 21:55:46 2005 New Revision: 151128 URL: http://svn.apache.org/viewcvs?view=rev&rev=151128 Log: Moved Kerberos decoders to use object composition. Added: incubator/directory/kerberos/trunk/core/src/java/org/apache/kerberos/io/decoder/ChecksumDecoder.java incubator/directory/kerberos/trunk/core/src/java/org/apache/kerberos/io/decoder/EncryptionKeyDecoder.java incubator/directory/kerberos/trunk/core/src/java/org/apache/kerberos/io/decoder/EncryptionTypeDecoder.java incubator/directory/kerberos/trunk/core/src/java/org/apache/kerberos/io/decoder/HostAddressDecoder.java incubator/directory/kerberos/trunk/core/src/java/org/apache/kerberos/io/decoder/KerberosTimeDecoder.java incubator/directory/kerberos/trunk/core/src/java/org/apache/kerberos/io/decoder/LastRequestDecoder.java incubator/directory/kerberos/trunk/core/src/java/org/apache/kerberos/io/decoder/PrincipalNameDecoder.java incubator/directory/kerberos/trunk/core/src/java/org/apache/kerberos/io/decoder/TicketDecoder.java Removed: incubator/directory/kerberos/trunk/core/src/java/org/apache/kerberos/io/decoder/KerberosMessageDecoder.java Modified: incubator/directory/kerberos/trunk/core/src/java/org/apache/kerberos/io/decoder/ApplicationRequestDecoder.java incubator/directory/kerberos/trunk/core/src/java/org/apache/kerberos/io/decoder/AuthenticatorDecoder.java incubator/directory/kerberos/trunk/core/src/java/org/apache/kerberos/io/decoder/AuthorizationDataDecoder.java incubator/directory/kerberos/trunk/core/src/java/org/apache/kerberos/io/decoder/EncKrbPrivPartDecoder.java incubator/directory/kerberos/trunk/core/src/java/org/apache/kerberos/io/decoder/EncTicketPartDecoder.java incubator/directory/kerberos/trunk/core/src/java/org/apache/kerberos/io/decoder/EncryptedDataDecoder.java incubator/directory/kerberos/trunk/core/src/java/org/apache/kerberos/io/decoder/EncryptedTimestampDecoder.java incubator/directory/kerberos/trunk/core/src/java/org/apache/kerberos/io/decoder/KdcRequestDecoder.java incubator/directory/kerberos/trunk/core/src/java/org/apache/kerberos/io/decoder/PrivateMessageDecoder.java Modified: incubator/directory/kerberos/trunk/core/src/java/org/apache/kerberos/io/decoder/ApplicationRequestDecoder.java URL: http://svn.apache.org/viewcvs/incubator/directory/kerberos/trunk/core/src/java/org/apache/kerberos/io/decoder/ApplicationRequestDecoder.java?view=diff&r1=151127&r2=151128 ============================================================================== --- incubator/directory/kerberos/trunk/core/src/java/org/apache/kerberos/io/decoder/ApplicationRequestDecoder.java (original) +++ incubator/directory/kerberos/trunk/core/src/java/org/apache/kerberos/io/decoder/ApplicationRequestDecoder.java Wed Feb 2 21:55:46 2005 @@ -32,7 +32,7 @@ import org.apache.kerberos.messages.value.ApOptions; -public class ApplicationRequestDecoder extends KerberosMessageDecoder +public class ApplicationRequestDecoder { public ApplicationRequest decode( byte[] encodedAuthHeader ) throws IOException { @@ -80,17 +80,15 @@ break; case 3: DERApplicationSpecific tag3 = (DERApplicationSpecific)derObject; - authHeader.setTicket( decodeTicket( tag3 ) ); + authHeader.setTicket( TicketDecoder.decode( tag3 ) ); break; case 4: DERSequence tag4 = (DERSequence)derObject; - authHeader.setEncPart( decodeEncryptedData( tag4 ) ); + authHeader.setEncPart( EncryptedDataDecoder.decode( tag4 ) ); break; - default: - System.out.println( derObject ); - break; } } + return authHeader; } } Modified: incubator/directory/kerberos/trunk/core/src/java/org/apache/kerberos/io/decoder/AuthenticatorDecoder.java URL: http://svn.apache.org/viewcvs/incubator/directory/kerberos/trunk/core/src/java/org/apache/kerberos/io/decoder/AuthenticatorDecoder.java?view=diff&r1=151127&r2=151128 ============================================================================== --- incubator/directory/kerberos/trunk/core/src/java/org/apache/kerberos/io/decoder/AuthenticatorDecoder.java (original) +++ incubator/directory/kerberos/trunk/core/src/java/org/apache/kerberos/io/decoder/AuthenticatorDecoder.java Wed Feb 2 21:55:46 2005 @@ -32,7 +32,7 @@ import org.apache.kerberos.messages.components.AuthenticatorModifier; -public class AuthenticatorDecoder extends KerberosMessageDecoder +public class AuthenticatorDecoder { public Authenticator decode( byte[] encodedAuthenticator ) throws IOException { @@ -42,7 +42,7 @@ DERSequence sequence = (DERSequence) app.getObject(); - return decodeAuthenticator( sequence ); + return decode( sequence ); } /** @@ -61,7 +61,7 @@ * authorization-data[8] AuthorizationData OPTIONAL * } */ - private Authenticator decodeAuthenticator( DERSequence sequence ) + protected static Authenticator decode( DERSequence sequence ) { AuthenticatorModifier modifier = new AuthenticatorModifier(); @@ -83,11 +83,11 @@ break; case 2: DERSequence tag2 = (DERSequence)derObject; - modifier.setClientName( decodePrincipalName( tag2 ) ); + modifier.setClientName( PrincipalNameDecoder.decode( tag2 ) ); break; case 3: DERSequence tag3 = (DERSequence)derObject; - modifier.setChecksum( decodeChecksum( tag3 ) ); + modifier.setChecksum( ChecksumDecoder.decode( tag3 ) ); break; case 4: DERInteger tag4 = (DERInteger)derObject; @@ -95,11 +95,11 @@ break; case 5: DERGeneralizedTime tag5 = (DERGeneralizedTime)derObject; - modifier.setClientTime( decodeKerberosTime( tag5 ) ); + modifier.setClientTime( KerberosTimeDecoder.decode( tag5 ) ); break; case 6: DERSequence tag6 = (DERSequence) derObject; - modifier.setSubSessionKey( decodeEncryptionKey( tag6 ) ); + modifier.setSubSessionKey( EncryptionKeyDecoder.decode( tag6 ) ); break; case 7: DERInteger tag7 = (DERInteger)derObject; @@ -107,11 +107,8 @@ break; case 8: DERSequence tag8 = (DERSequence)derObject; - modifier.setAuthorizationData( decodeAuthorizationData( tag8 ) ); + modifier.setAuthorizationData( AuthorizationDataDecoder.decodeSequence( tag8 ) ); break; - default: - System.out.println( derObject ); - break; } } Modified: incubator/directory/kerberos/trunk/core/src/java/org/apache/kerberos/io/decoder/AuthorizationDataDecoder.java URL: http://svn.apache.org/viewcvs/incubator/directory/kerberos/trunk/core/src/java/org/apache/kerberos/io/decoder/AuthorizationDataDecoder.java?view=diff&r1=151127&r2=151128 ============================================================================== --- incubator/directory/kerberos/trunk/core/src/java/org/apache/kerberos/io/decoder/AuthorizationDataDecoder.java (original) +++ incubator/directory/kerberos/trunk/core/src/java/org/apache/kerberos/io/decoder/AuthorizationDataDecoder.java Wed Feb 2 21:55:46 2005 @@ -18,13 +18,20 @@ package org.apache.kerberos.io.decoder; import java.io.IOException; +import java.util.Enumeration; import org.apache.asn1.der.ASN1InputStream; +import org.apache.asn1.der.DEREncodable; +import org.apache.asn1.der.DERInteger; +import org.apache.asn1.der.DEROctetString; import org.apache.asn1.der.DERSequence; +import org.apache.asn1.der.DERTaggedObject; import org.apache.kerberos.messages.value.AuthorizationData; +import org.apache.kerberos.messages.value.AuthorizationDataEntry; +import org.apache.kerberos.messages.value.AuthorizationType; -public class AuthorizationDataDecoder extends KerberosMessageDecoder +public class AuthorizationDataDecoder { public AuthorizationData decode( byte[] encodedAuthData ) throws IOException { @@ -32,7 +39,54 @@ DERSequence sequence = (DERSequence) ais.readObject(); - return decodeAuthorizationData( sequence ); + return decodeSequence( sequence ); + } + + /** + * AuthorizationData ::= SEQUENCE OF SEQUENCE { + * ad-type[0] INTEGER, + * ad-data[1] OCTET STRING + * } + */ + protected static AuthorizationData decodeSequence( DERSequence sequence ) + { + AuthorizationData authData = new AuthorizationData(); + + for ( Enumeration e = sequence.getObjects(); e.hasMoreElements(); ) + { + DERSequence object = (DERSequence) e.nextElement(); + AuthorizationDataEntry entry = decodeAuthorizationEntry( object ); + authData.add( entry ); + } + + return authData; + } + + protected static AuthorizationDataEntry decodeAuthorizationEntry( DERSequence sequence ) + { + AuthorizationType type = AuthorizationType.NULL; + byte[] data = null; + + for ( Enumeration e = sequence.getObjects(); e.hasMoreElements(); ) + { + DERTaggedObject object = (DERTaggedObject) e.nextElement(); + int tag = object.getTagNo(); + DEREncodable derObject = object.getObject(); + + switch ( tag ) + { + case 0: + DERInteger tag0 = (DERInteger)derObject; + type = AuthorizationType.getTypeByOrdinal( tag0.intValue() ); + break; + case 1: + DEROctetString tag1 = (DEROctetString)derObject; + data = tag1.getOctets(); + break; + } + } + + return new AuthorizationDataEntry( type, data ); } } Added: incubator/directory/kerberos/trunk/core/src/java/org/apache/kerberos/io/decoder/ChecksumDecoder.java URL: http://svn.apache.org/viewcvs/incubator/directory/kerberos/trunk/core/src/java/org/apache/kerberos/io/decoder/ChecksumDecoder.java?view=auto&rev=151128 ============================================================================== --- incubator/directory/kerberos/trunk/core/src/java/org/apache/kerberos/io/decoder/ChecksumDecoder.java (added) +++ incubator/directory/kerberos/trunk/core/src/java/org/apache/kerberos/io/decoder/ChecksumDecoder.java Wed Feb 2 21:55:46 2005 @@ -0,0 +1,66 @@ +/* + * Copyright 2005 The Apache Software Foundation + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * + */ + +package org.apache.kerberos.io.decoder; + +import java.util.Enumeration; + +import org.apache.asn1.der.DEREncodable; +import org.apache.asn1.der.DERInteger; +import org.apache.asn1.der.DEROctetString; +import org.apache.asn1.der.DERSequence; +import org.apache.asn1.der.DERTaggedObject; +import org.apache.kerberos.crypto.checksum.ChecksumType; +import org.apache.kerberos.messages.value.Checksum; + + +public class ChecksumDecoder +{ + /** + * Checksum ::= SEQUENCE { + * cksumtype[0] INTEGER, + * checksum[1] OCTET STRING + * } + */ + protected static Checksum decode( DERSequence sequence ) + { + ChecksumType type = ChecksumType.NULL; + byte[] data = null; + + for ( Enumeration e = sequence.getObjects(); e.hasMoreElements(); ) + { + DERTaggedObject object = (DERTaggedObject) e.nextElement(); + int tag = object.getTagNo(); + DEREncodable derObject = object.getObject(); + + switch ( tag ) + { + case 0: + DERInteger tag0 = (DERInteger)derObject; + type = ChecksumType.getTypeByOrdinal( tag0.intValue() ); + break; + case 1: + DEROctetString tag1 = (DEROctetString)derObject; + data = tag1.getOctets(); + break; + } + } + + return new Checksum( type, data ); + } +} + Modified: incubator/directory/kerberos/trunk/core/src/java/org/apache/kerberos/io/decoder/EncKrbPrivPartDecoder.java URL: http://svn.apache.org/viewcvs/incubator/directory/kerberos/trunk/core/src/java/org/apache/kerberos/io/decoder/EncKrbPrivPartDecoder.java?view=diff&r1=151127&r2=151128 ============================================================================== --- incubator/directory/kerberos/trunk/core/src/java/org/apache/kerberos/io/decoder/EncKrbPrivPartDecoder.java (original) +++ incubator/directory/kerberos/trunk/core/src/java/org/apache/kerberos/io/decoder/EncKrbPrivPartDecoder.java Wed Feb 2 21:55:46 2005 @@ -32,7 +32,7 @@ import org.apache.kerberos.messages.components.EncKrbPrivPartModifier; -public class EncKrbPrivPartDecoder extends KerberosMessageDecoder +public class EncKrbPrivPartDecoder { public EncKrbPrivPart decode( byte[] encodedPrivatePart ) throws IOException { @@ -62,7 +62,7 @@ break; case 1: DERGeneralizedTime tag1 = (DERGeneralizedTime) derObject; - modifier.setTimestamp( decodeKerberosTime( tag1 ) ); + modifier.setTimestamp( KerberosTimeDecoder.decode( tag1 ) ); break; case 2: DERInteger tag2 = (DERInteger)derObject; @@ -74,15 +74,12 @@ break; case 4: DERSequence tag4 = (DERSequence)derObject; - modifier.setSenderAddress( decodeHostAddress( tag4 ) ); + modifier.setSenderAddress( HostAddressDecoder.decode( tag4 ) ); break; case 5: DERSequence tag5 = (DERSequence)derObject; - modifier.setRecipientAddress( decodeHostAddress( tag5 ) ); + modifier.setRecipientAddress( HostAddressDecoder.decode( tag5 ) ); break; - default: - System.out.println( derObject ); - break; } } return modifier.getEncKrbPrivPart(); Modified: incubator/directory/kerberos/trunk/core/src/java/org/apache/kerberos/io/decoder/EncTicketPartDecoder.java URL: http://svn.apache.org/viewcvs/incubator/directory/kerberos/trunk/core/src/java/org/apache/kerberos/io/decoder/EncTicketPartDecoder.java?view=diff&r1=151127&r2=151128 ============================================================================== --- incubator/directory/kerberos/trunk/core/src/java/org/apache/kerberos/io/decoder/EncTicketPartDecoder.java (original) +++ incubator/directory/kerberos/trunk/core/src/java/org/apache/kerberos/io/decoder/EncTicketPartDecoder.java Wed Feb 2 21:55:46 2005 @@ -26,14 +26,18 @@ import org.apache.asn1.der.DEREncodable; import org.apache.asn1.der.DERGeneralString; import org.apache.asn1.der.DERGeneralizedTime; +import org.apache.asn1.der.DERInteger; +import org.apache.asn1.der.DEROctetString; import org.apache.asn1.der.DERSequence; import org.apache.asn1.der.DERTaggedObject; import org.apache.kerberos.messages.components.EncTicketPart; import org.apache.kerberos.messages.components.EncTicketPartModifier; import org.apache.kerberos.messages.value.TicketFlags; +import org.apache.kerberos.messages.value.TransitedEncoding; +import org.apache.kerberos.messages.value.TransitedEncodingType; -public class EncTicketPartDecoder extends KerberosMessageDecoder +public class EncTicketPartDecoder { public EncTicketPart decode( byte[] encodedTicket ) throws IOException { @@ -61,23 +65,25 @@ caddr[9] HostAddresses OPTIONAL, authorization-data[10] AuthorizationData OPTIONAL }*/ - private EncTicketPart decodeEncTicketPartSequence( DERSequence sequence ) { - + private EncTicketPart decodeEncTicketPartSequence( DERSequence sequence ) + { EncTicketPartModifier modifier = new EncTicketPartModifier(); - for ( Enumeration e = sequence.getObjects(); e.hasMoreElements(); ) { + for ( Enumeration e = sequence.getObjects(); e.hasMoreElements(); ) + { DERTaggedObject object = (DERTaggedObject) e.nextElement(); int tag = object.getTagNo(); DEREncodable derObject = object.getObject(); - switch ( tag ) { + switch ( tag ) + { case 0: DERBitString tag0 = (DERBitString)derObject; modifier.setFlags( new TicketFlags( tag0.getOctets() ) ); break; case 1: DERSequence tag1 = (DERSequence) derObject; - modifier.setSessionKey( decodeEncryptionKey( tag1 ) ); + modifier.setSessionKey( EncryptionKeyDecoder.decode( tag1 ) ); break; case 2: DERGeneralString tag2 = (DERGeneralString)derObject; @@ -85,7 +91,7 @@ break; case 3: DERSequence tag3 = (DERSequence)derObject; - modifier.setClientName( decodePrincipalName( tag3 ) ); + modifier.setClientName( PrincipalNameDecoder.decode( tag3 ) ); break; case 4: DERSequence tag4 = (DERSequence)derObject; @@ -93,34 +99,62 @@ break; case 5: DERGeneralizedTime tag5 = (DERGeneralizedTime)derObject; - modifier.setAuthTime( decodeKerberosTime( tag5 ) ); + modifier.setAuthTime( KerberosTimeDecoder.decode( tag5 ) ); break; case 6: DERGeneralizedTime tag6 = (DERGeneralizedTime)derObject; - modifier.setStartTime( decodeKerberosTime( tag6 ) ); + modifier.setStartTime( KerberosTimeDecoder.decode( tag6 ) ); break; case 7: DERGeneralizedTime tag7 = (DERGeneralizedTime)derObject; - modifier.setEndTime( decodeKerberosTime( tag7 ) ); + modifier.setEndTime( KerberosTimeDecoder.decode( tag7 ) ); break; case 8: DERGeneralizedTime tag8 = (DERGeneralizedTime)derObject; - modifier.setRenewTill( decodeKerberosTime( tag8 ) ); + modifier.setRenewTill( KerberosTimeDecoder.decode( tag8 ) ); break; case 9: DERSequence tag9 = (DERSequence)derObject; - modifier.setClientAddresses( decodeHostAddresses( tag9 ) ); + modifier.setClientAddresses( HostAddressDecoder.decodeSequence( tag9 ) ); break; case 10: DERSequence tag10 = (DERSequence)derObject; - modifier.setAuthorizationData( decodeAuthorizationData( tag10 ) ); + modifier.setAuthorizationData( AuthorizationDataDecoder.decodeSequence( tag10 ) ); break; - default: - System.out.println( derObject ); - break; } } return modifier.getEncTicketPart(); + } + + /* + * TransitedEncoding ::= SEQUENCE { tr-type[0] INTEGER, -- must be + * registered contents[1] OCTET STRING } + */ + protected TransitedEncoding decodeTransitedEncoding( DERSequence sequence ) + { + TransitedEncodingType type = TransitedEncodingType.NULL; + byte[] contents = null; + + for ( Enumeration e = sequence.getObjects(); e.hasMoreElements(); ) + { + DERTaggedObject object = (DERTaggedObject) e.nextElement(); + int tag = object.getTagNo(); + DEREncodable derObject = object.getObject(); + + switch ( tag ) + { + case 0: + DERInteger tag0 = (DERInteger) derObject; + type = TransitedEncodingType.getTypeByOrdinal( tag0.intValue() ); + break; + case 1: + DEROctetString tag1 = (DEROctetString) derObject; + contents = tag1.getOctets(); + break; + } + } + + return new TransitedEncoding( type, contents ); } } Modified: incubator/directory/kerberos/trunk/core/src/java/org/apache/kerberos/io/decoder/EncryptedDataDecoder.java URL: http://svn.apache.org/viewcvs/incubator/directory/kerberos/trunk/core/src/java/org/apache/kerberos/io/decoder/EncryptedDataDecoder.java?view=diff&r1=151127&r2=151128 ============================================================================== --- incubator/directory/kerberos/trunk/core/src/java/org/apache/kerberos/io/decoder/EncryptedDataDecoder.java (original) +++ incubator/directory/kerberos/trunk/core/src/java/org/apache/kerberos/io/decoder/EncryptedDataDecoder.java Wed Feb 2 21:55:46 2005 @@ -18,21 +18,65 @@ package org.apache.kerberos.io.decoder; import java.io.IOException; +import java.util.Enumeration; import org.apache.asn1.der.ASN1InputStream; +import org.apache.asn1.der.DEREncodable; +import org.apache.asn1.der.DERInteger; +import org.apache.asn1.der.DEROctetString; import org.apache.asn1.der.DERSequence; +import org.apache.asn1.der.DERTaggedObject; +import org.apache.kerberos.crypto.encryption.EncryptionType; import org.apache.kerberos.messages.value.EncryptedData; +import org.apache.kerberos.messages.value.EncryptedDataModifier; -public class EncryptedDataDecoder extends KerberosMessageDecoder +public class EncryptedDataDecoder { - public EncryptedData decode( byte[] encodedEncryptedData ) throws IOException + public static EncryptedData decode( byte[] encodedEncryptedData ) throws IOException { ASN1InputStream ais = new ASN1InputStream( encodedEncryptedData ); DERSequence sequence = (DERSequence) ais.readObject(); - return decodeEncryptedData( sequence ); + return decode( sequence ); + } + + /** + * EncryptedData ::= SEQUENCE { + * etype[0] INTEGER, -- EncryptionEngine + * kvno[1] INTEGER OPTIONAL, + * cipher[2] OCTET STRING -- ciphertext + * } + */ + protected static EncryptedData decode( DERSequence sequence ) + { + EncryptedDataModifier modifier = new EncryptedDataModifier(); + + for ( Enumeration e = sequence.getObjects(); e.hasMoreElements(); ) + { + DERTaggedObject object = (DERTaggedObject) e.nextElement(); + int tag = object.getTagNo(); + DEREncodable derObject = object.getObject(); + + switch ( tag ) + { + case 0: + DERInteger etype = (DERInteger)derObject; + modifier.setEncryptionType( EncryptionType.getTypeByOrdinal( etype.intValue() ) ); + break; + case 1: + DERInteger kvno = (DERInteger)derObject; + modifier.setKeyVersion( kvno.intValue() ); + break; + case 2: + DEROctetString cipher = (DEROctetString)derObject; + modifier.setCipherText( cipher.getOctets() ); + break; + } + } + + return modifier.getEncryptedData(); } } Modified: incubator/directory/kerberos/trunk/core/src/java/org/apache/kerberos/io/decoder/EncryptedTimestampDecoder.java URL: http://svn.apache.org/viewcvs/incubator/directory/kerberos/trunk/core/src/java/org/apache/kerberos/io/decoder/EncryptedTimestampDecoder.java?view=diff&r1=151127&r2=151128 ============================================================================== --- incubator/directory/kerberos/trunk/core/src/java/org/apache/kerberos/io/decoder/EncryptedTimestampDecoder.java (original) +++ incubator/directory/kerberos/trunk/core/src/java/org/apache/kerberos/io/decoder/EncryptedTimestampDecoder.java Wed Feb 2 21:55:46 2005 @@ -38,7 +38,7 @@ * pausec[1] INTEGER OPTIONAL * } */ -public class EncryptedTimestampDecoder extends KerberosMessageDecoder +public class EncryptedTimestampDecoder { public EncryptedTimeStamp decode( byte[] encodedEncryptedTimestamp ) throws IOException { @@ -63,15 +63,12 @@ { case 0: DERGeneralizedTime tag0 = (DERGeneralizedTime)derObject; - modifier.setKerberosTime( decodeKerberosTime( tag0 ) ); + modifier.setKerberosTime( KerberosTimeDecoder.decode( tag0 ) ); break; case 1: DERInteger tag1 = (DERInteger)derObject; modifier.setMicroSecond( tag1.intValue() ); break; - default: - System.out.println( object.getObject() ); - break; } } Added: incubator/directory/kerberos/trunk/core/src/java/org/apache/kerberos/io/decoder/EncryptionKeyDecoder.java URL: http://svn.apache.org/viewcvs/incubator/directory/kerberos/trunk/core/src/java/org/apache/kerberos/io/decoder/EncryptionKeyDecoder.java?view=auto&rev=151128 ============================================================================== --- incubator/directory/kerberos/trunk/core/src/java/org/apache/kerberos/io/decoder/EncryptionKeyDecoder.java (added) +++ incubator/directory/kerberos/trunk/core/src/java/org/apache/kerberos/io/decoder/EncryptionKeyDecoder.java Wed Feb 2 21:55:46 2005 @@ -0,0 +1,66 @@ +/* + * Copyright 2005 The Apache Software Foundation + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * + */ + +package org.apache.kerberos.io.decoder; + +import java.util.Enumeration; + +import org.apache.asn1.der.DEREncodable; +import org.apache.asn1.der.DERInteger; +import org.apache.asn1.der.DEROctetString; +import org.apache.asn1.der.DERSequence; +import org.apache.asn1.der.DERTaggedObject; +import org.apache.kerberos.crypto.encryption.EncryptionType; +import org.apache.kerberos.messages.value.EncryptionKey; + + +public class EncryptionKeyDecoder +{ + /** + * EncryptionKey ::= SEQUENCE { + * keytype[0] INTEGER, + * keyvalue[1] OCTET STRING + * } + */ + protected static EncryptionKey decode( DERSequence sequence ) + { + EncryptionType type = EncryptionType.NULL; + byte[] data = null; + + for ( Enumeration e = sequence.getObjects(); e.hasMoreElements(); ) + { + DERTaggedObject object = (DERTaggedObject) e.nextElement(); + int tag = object.getTagNo(); + DEREncodable derObject = object.getObject(); + + switch ( tag ) + { + case 0: + DERInteger tag0 = (DERInteger)derObject; + type = EncryptionType.getTypeByOrdinal( tag0.intValue() ); + break; + case 1: + DEROctetString tag1 = (DEROctetString)derObject; + data = tag1.getOctets(); + break; + } + } + + return new EncryptionKey( type, data ); + } +} + Added: incubator/directory/kerberos/trunk/core/src/java/org/apache/kerberos/io/decoder/EncryptionTypeDecoder.java URL: http://svn.apache.org/viewcvs/incubator/directory/kerberos/trunk/core/src/java/org/apache/kerberos/io/decoder/EncryptionTypeDecoder.java?view=auto&rev=151128 ============================================================================== --- incubator/directory/kerberos/trunk/core/src/java/org/apache/kerberos/io/decoder/EncryptionTypeDecoder.java (added) +++ incubator/directory/kerberos/trunk/core/src/java/org/apache/kerberos/io/decoder/EncryptionTypeDecoder.java Wed Feb 2 21:55:46 2005 @@ -0,0 +1,48 @@ +/* + * Copyright 2005 The Apache Software Foundation + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * + */ + +package org.apache.kerberos.io.decoder; + +import java.util.Enumeration; + +import org.apache.asn1.der.DERInteger; +import org.apache.asn1.der.DERSequence; +import org.apache.kerberos.crypto.encryption.EncryptionType; + + +public class EncryptionTypeDecoder +{ + /** + * etype[8] SEQUENCE OF INTEGER, -- EncryptionEngine, + * -- in preference order + */ + protected static EncryptionType[] decode( DERSequence sequence ) + { + EncryptionType[] eTypes = new EncryptionType[ sequence.size() ]; + + int ii = 0; + for ( Enumeration e = sequence.getObjects(); e.hasMoreElements(); ) + { + DERInteger object = (DERInteger) e.nextElement(); + eTypes[ii] = EncryptionType.getTypeByOrdinal( object.intValue() ); + ii++; + } + + return eTypes; + } +} + Added: incubator/directory/kerberos/trunk/core/src/java/org/apache/kerberos/io/decoder/HostAddressDecoder.java URL: http://svn.apache.org/viewcvs/incubator/directory/kerberos/trunk/core/src/java/org/apache/kerberos/io/decoder/HostAddressDecoder.java?view=auto&rev=151128 ============================================================================== --- incubator/directory/kerberos/trunk/core/src/java/org/apache/kerberos/io/decoder/HostAddressDecoder.java (added) +++ incubator/directory/kerberos/trunk/core/src/java/org/apache/kerberos/io/decoder/HostAddressDecoder.java Wed Feb 2 21:55:46 2005 @@ -0,0 +1,89 @@ +/* + * Copyright 2005 The Apache Software Foundation + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * + */ + +package org.apache.kerberos.io.decoder; + +import java.util.Enumeration; + +import org.apache.asn1.der.DEREncodable; +import org.apache.asn1.der.DERInteger; +import org.apache.asn1.der.DEROctetString; +import org.apache.asn1.der.DERSequence; +import org.apache.asn1.der.DERTaggedObject; +import org.apache.kerberos.messages.value.HostAddress; +import org.apache.kerberos.messages.value.HostAddressType; +import org.apache.kerberos.messages.value.HostAddresses; + + +public class HostAddressDecoder +{ + /** + * HostAddress ::= SEQUENCE { + * addr-type[0] INTEGER, + * address[1] OCTET STRING + * } + */ + protected static HostAddress decode( DERSequence sequence ) + { + HostAddressType type = HostAddressType.NULL; + byte[] value = null; + + for ( Enumeration e = sequence.getObjects(); e.hasMoreElements(); ) + { + DERTaggedObject object = (DERTaggedObject) e.nextElement(); + int tag = object.getTagNo(); + DEREncodable derObject = object.getObject(); + + switch ( tag ) + { + case 0: + DERInteger addressType = (DERInteger)derObject; + type = HostAddressType.getTypeByOrdinal( addressType.intValue() ); + break; + case 1: + DEROctetString address = (DEROctetString)derObject; + value = address.getOctets(); + break; + } + } + + return new HostAddress( type, value ); + } + + /** + * HostAddresses ::= SEQUENCE OF SEQUENCE { + * addr-type[0] INTEGER, + * address[1] OCTET STRING + * } + */ + protected static HostAddresses decodeSequence( DERSequence sequence ) + { + HostAddress[] addresses = new HostAddress[ sequence.size() ]; + + int ii = 0; + for ( Enumeration e = sequence.getObjects(); e.hasMoreElements(); ) + { + DERSequence object = (DERSequence) e.nextElement(); + HostAddress address = decode( object ); + addresses[ii] = address; + ii++; + } + + return new HostAddresses( addresses ); + } +} + Modified: incubator/directory/kerberos/trunk/core/src/java/org/apache/kerberos/io/decoder/KdcRequestDecoder.java URL: http://svn.apache.org/viewcvs/incubator/directory/kerberos/trunk/core/src/java/org/apache/kerberos/io/decoder/KdcRequestDecoder.java?view=diff&r1=151127&r2=151128 ============================================================================== --- incubator/directory/kerberos/trunk/core/src/java/org/apache/kerberos/io/decoder/KdcRequestDecoder.java (original) +++ incubator/directory/kerberos/trunk/core/src/java/org/apache/kerberos/io/decoder/KdcRequestDecoder.java Wed Feb 2 21:55:46 2005 @@ -32,14 +32,13 @@ import org.apache.asn1.der.DERTaggedObject; import org.apache.kerberos.messages.KdcRequest; import org.apache.kerberos.messages.MessageType; -import org.apache.kerberos.messages.components.Ticket; import org.apache.kerberos.messages.value.KdcOptions; import org.apache.kerberos.messages.value.PreAuthenticationData; import org.apache.kerberos.messages.value.RequestBody; import org.apache.kerberos.messages.value.RequestBodyModifier; -public class KdcRequestDecoder extends KerberosMessageDecoder +public class KdcRequestDecoder { public KdcRequest decode( ByteBuffer in ) throws IOException { @@ -62,27 +61,29 @@ padata[3] SEQUENCE OF PA-DATA OPTIONAL, req-body[4] KDC-REQ-BODY }*/ - private KdcRequest decodeKdcRequestSequence(DERSequence sequence) throws IOException { - + private KdcRequest decodeKdcRequestSequence( DERSequence sequence ) throws IOException + { int pvno = 5; MessageType msgType = MessageType.NULL; PreAuthenticationData[] paData = null; RequestBody requestBody = null; - for (Enumeration e = sequence.getObjects(); e.hasMoreElements();) { - DERTaggedObject object = ((DERTaggedObject) e.nextElement()); + for ( Enumeration e = sequence.getObjects(); e.hasMoreElements(); ) + { + DERTaggedObject object = (DERTaggedObject) e.nextElement(); int tag = object.getTagNo(); DEREncodable derObject = object.getObject(); - switch (tag) { + switch ( tag ) + { case 1: DERInteger tag1 = (DERInteger)derObject; pvno = tag1.intValue(); break; case 2: DERInteger tag2 = (DERInteger)derObject; - msgType = MessageType.getTypeByOrdinal(tag2.intValue()); + msgType = MessageType.getTypeByOrdinal( tag2.intValue() ); break; case 3: DERSequence tag3 = (DERSequence)derObject; @@ -90,15 +91,12 @@ break; case 4: DERSequence tag4 = (DERSequence)derObject; - requestBody = decodeRequestBody(tag4); + requestBody = decodeRequestBody( tag4 ); break; - default: - System.out.println(derObject); - break; } } - return new KdcRequest(pvno, msgType, paData, requestBody); + return new KdcRequest( pvno, msgType, paData, requestBody ); } /* @@ -120,83 +118,70 @@ -- Encrypted AuthorizationData encoding additional-tickets[11] SEQUENCE OF Ticket OPTIONAL }*/ - private RequestBody decodeRequestBody(DERSequence sequence) throws IOException { - + private RequestBody decodeRequestBody( DERSequence sequence ) throws IOException + { RequestBodyModifier modifier = new RequestBodyModifier(); - for (Enumeration e = sequence.getObjects(); e.hasMoreElements();) { - DERTaggedObject object = ((DERTaggedObject) e.nextElement()); + for ( Enumeration e = sequence.getObjects(); e.hasMoreElements(); ) + { + DERTaggedObject object = (DERTaggedObject) e.nextElement(); int tag = object.getTagNo(); DEREncodable derObject = object.getObject(); - switch (tag) { + switch ( tag ) + { case 0: DERBitString kdcOptions = (DERBitString)derObject; - modifier.setKdcOptions(new KdcOptions(kdcOptions.getOctets())); + modifier.setKdcOptions( new KdcOptions( kdcOptions.getOctets() ) ); break; case 1: DERSequence cName = (DERSequence)derObject; - modifier.setClientName(decodePrincipalName(cName)); + modifier.setClientName( PrincipalNameDecoder.decode( cName ) ); break; case 2: DERGeneralString realm = (DERGeneralString)derObject; - modifier.setRealm(realm.getString()); + modifier.setRealm( realm.getString() ); break; case 3: DERSequence sname = (DERSequence)derObject; - modifier.setServerName(decodePrincipalName(sname)); + modifier.setServerName( PrincipalNameDecoder.decode( sname ) ); break; case 4: DERGeneralizedTime from = (DERGeneralizedTime)derObject; - modifier.setFrom(decodeKerberosTime(from)); + modifier.setFrom( KerberosTimeDecoder.decode( from ) ); break; case 5: DERGeneralizedTime till = (DERGeneralizedTime)derObject; - modifier.setTill(decodeKerberosTime(till)); + modifier.setTill( KerberosTimeDecoder.decode( till ) ); break; case 6: DERGeneralizedTime rtime = (DERGeneralizedTime)derObject; - modifier.setRtime(decodeKerberosTime(rtime)); + modifier.setRtime( KerberosTimeDecoder.decode( rtime ) ); break; case 7: DERInteger nonce = (DERInteger)derObject; - modifier.setNonce(nonce.intValue()); + modifier.setNonce( nonce.intValue() ); break; case 8: DERSequence etype = (DERSequence)derObject; - modifier.setEType(decodeEncryptionType(etype)); + modifier.setEType( EncryptionTypeDecoder.decode( etype ) ); break; case 9: DERSequence hostAddresses = (DERSequence)derObject; - modifier.setAddresses(decodeHostAddresses(hostAddresses)); + modifier.setAddresses( HostAddressDecoder.decodeSequence( hostAddresses ) ); break; case 10: DERSequence encryptedData = (DERSequence)derObject; - modifier.setEncAuthorizationData(decodeEncryptedData(encryptedData)); + modifier.setEncAuthorizationData( EncryptedDataDecoder.decode( encryptedData ) ); break; case 11: DERSequence tag11 = (DERSequence)derObject; - modifier.setAdditionalTickets(decodeTickets(tag11)); + modifier.setAdditionalTickets( TicketDecoder.decodeSequence( tag11 ) ); break; - default: - System.out.println(derObject); - break; } } return modifier.getRequestBody(); - } - - protected Ticket[] decodeTickets(DERSequence sequence) throws IOException { - - Ticket[] tickets = new Ticket[sequence.size()]; - - int i = 0; - for (Enumeration e = sequence.getObjects(); e.hasMoreElements();) { - DERApplicationSpecific object = ((DERApplicationSpecific) e.nextElement()); - tickets[i] = decodeTicket(object); - } - return tickets; } } Added: incubator/directory/kerberos/trunk/core/src/java/org/apache/kerberos/io/decoder/KerberosTimeDecoder.java URL: http://svn.apache.org/viewcvs/incubator/directory/kerberos/trunk/core/src/java/org/apache/kerberos/io/decoder/KerberosTimeDecoder.java?view=auto&rev=151128 ============================================================================== --- incubator/directory/kerberos/trunk/core/src/java/org/apache/kerberos/io/decoder/KerberosTimeDecoder.java (added) +++ incubator/directory/kerberos/trunk/core/src/java/org/apache/kerberos/io/decoder/KerberosTimeDecoder.java Wed Feb 2 21:55:46 2005 @@ -0,0 +1,49 @@ +/* + * Copyright 2005 The Apache Software Foundation + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * + */ + +package org.apache.kerberos.io.decoder; + +import java.text.ParseException; +import java.util.Date; + +import org.apache.asn1.der.DERGeneralizedTime; +import org.apache.kerberos.messages.value.KerberosTime; + + +public class KerberosTimeDecoder +{ + /** + * KerberosTime ::= GeneralizedTime + * -- Specifying UTC time zone (Z) + */ + protected static KerberosTime decode( DERGeneralizedTime time ) + { + Date date = null; + + try + { + date = time.getDate(); + } + catch (ParseException pe) + { + pe.printStackTrace(); + } + + return new KerberosTime( date ); + } +} + Added: incubator/directory/kerberos/trunk/core/src/java/org/apache/kerberos/io/decoder/LastRequestDecoder.java URL: http://svn.apache.org/viewcvs/incubator/directory/kerberos/trunk/core/src/java/org/apache/kerberos/io/decoder/LastRequestDecoder.java?view=auto&rev=151128 ============================================================================== --- incubator/directory/kerberos/trunk/core/src/java/org/apache/kerberos/io/decoder/LastRequestDecoder.java (added) +++ incubator/directory/kerberos/trunk/core/src/java/org/apache/kerberos/io/decoder/LastRequestDecoder.java Wed Feb 2 21:55:46 2005 @@ -0,0 +1,84 @@ +/* + * Copyright 2005 The Apache Software Foundation + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * + */ + +package org.apache.kerberos.io.decoder; + +import java.util.Enumeration; + +import org.apache.asn1.der.DEREncodable; +import org.apache.asn1.der.DERGeneralizedTime; +import org.apache.asn1.der.DERInteger; +import org.apache.asn1.der.DERSequence; +import org.apache.asn1.der.DERTaggedObject; +import org.apache.kerberos.messages.value.KerberosTime; +import org.apache.kerberos.messages.value.LastRequest; +import org.apache.kerberos.messages.value.LastRequestEntry; +import org.apache.kerberos.messages.value.LastRequestType; + + +public class LastRequestDecoder +{ + /** + * LastReq ::= SEQUENCE OF SEQUENCE { + * lr-type[0] INTEGER, + * lr-value[1] KerberosTime + * } + */ + protected LastRequest decodeSequence( DERSequence sequence ) + { + LastRequestEntry[] entries = new LastRequestEntry[ sequence.size() ]; + + int ii = 0; + for ( Enumeration e = sequence.getObjects(); e.hasMoreElements(); ) + { + DERSequence object = (DERSequence) e.nextElement(); + LastRequestEntry entry = decode( object ); + entries[ii] = entry; + ii++; + } + + return new LastRequest( entries ); + } + + protected LastRequestEntry decode( DERSequence sequence ) + { + LastRequestType type = LastRequestType.NONE; + KerberosTime value = null; + + for ( Enumeration e = sequence.getObjects(); e.hasMoreElements(); ) + { + DERTaggedObject object = (DERTaggedObject) e.nextElement(); + int tag = object.getTagNo(); + DEREncodable derObject = object.getObject(); + + switch ( tag ) + { + case 0: + DERInteger tag0 = (DERInteger)derObject; + type = LastRequestType.getTypeByOrdinal( tag0.intValue() ); + break; + case 1: + DERGeneralizedTime tag1 = (DERGeneralizedTime)derObject; + value = KerberosTimeDecoder.decode( tag1 ); + break; + } + } + + return new LastRequestEntry( type, value ); + } +} + Added: incubator/directory/kerberos/trunk/core/src/java/org/apache/kerberos/io/decoder/PrincipalNameDecoder.java URL: http://svn.apache.org/viewcvs/incubator/directory/kerberos/trunk/core/src/java/org/apache/kerberos/io/decoder/PrincipalNameDecoder.java?view=auto&rev=151128 ============================================================================== --- incubator/directory/kerberos/trunk/core/src/java/org/apache/kerberos/io/decoder/PrincipalNameDecoder.java (added) +++ incubator/directory/kerberos/trunk/core/src/java/org/apache/kerberos/io/decoder/PrincipalNameDecoder.java Wed Feb 2 21:55:46 2005 @@ -0,0 +1,74 @@ +/* + * Copyright 2005 The Apache Software Foundation + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * + */ + +package org.apache.kerberos.io.decoder; + +import java.util.Enumeration; + +import org.apache.asn1.der.DEREncodable; +import org.apache.asn1.der.DERGeneralString; +import org.apache.asn1.der.DERInteger; +import org.apache.asn1.der.DERSequence; +import org.apache.asn1.der.DERTaggedObject; +import org.apache.kerberos.messages.value.PrincipalName; +import org.apache.kerberos.messages.value.PrincipalNameModifier; + + +public class PrincipalNameDecoder +{ + /** + * PrincipalName ::= SEQUENCE { + * name-type[0] INTEGER, + * name-string[1] SEQUENCE OF GeneralString + * } + */ + public static PrincipalName decode( DERSequence sequence ) + { + PrincipalNameModifier modifier = new PrincipalNameModifier(); + + for ( Enumeration e = sequence.getObjects(); e.hasMoreElements(); ) + { + DERTaggedObject object = (DERTaggedObject) e.nextElement(); + int tag = object.getTagNo(); + DEREncodable derObject = object.getObject(); + + switch ( tag ) + { + case 0: + DERInteger nameType = (DERInteger)derObject; + modifier.setType( nameType.intValue() ); + break; + case 1: + DERSequence nameString = (DERSequence)derObject; + decodeNameString( nameString, modifier ); + break; + } + } + + return modifier.getPrincipalName(); + } + + private static void decodeNameString( DERSequence sequence, PrincipalNameModifier modifier ) + { + for ( Enumeration e = sequence.getObjects(); e.hasMoreElements(); ) + { + DERGeneralString object = (DERGeneralString) e.nextElement(); + modifier.addName( object.getString() ); + } + } +} + Modified: incubator/directory/kerberos/trunk/core/src/java/org/apache/kerberos/io/decoder/PrivateMessageDecoder.java URL: http://svn.apache.org/viewcvs/incubator/directory/kerberos/trunk/core/src/java/org/apache/kerberos/io/decoder/PrivateMessageDecoder.java?view=diff&r1=151127&r2=151128 ============================================================================== --- incubator/directory/kerberos/trunk/core/src/java/org/apache/kerberos/io/decoder/PrivateMessageDecoder.java (original) +++ incubator/directory/kerberos/trunk/core/src/java/org/apache/kerberos/io/decoder/PrivateMessageDecoder.java Wed Feb 2 21:55:46 2005 @@ -30,7 +30,7 @@ import org.apache.kerberos.messages.application.PrivateMessage; -public class PrivateMessageDecoder extends KerberosMessageDecoder +public class PrivateMessageDecoder { public PrivateMessage decode( byte[] encodedPrivateMessage ) throws IOException { @@ -43,7 +43,7 @@ return decodePrivateMessageSequence( privateMessage ); } - private PrivateMessage decodePrivateMessageSequence(DERSequence sequence) + private PrivateMessage decodePrivateMessageSequence( DERSequence sequence ) { PrivateMessage message = new PrivateMessage(); @@ -53,7 +53,8 @@ int tag = object.getTagNo(); DEREncodable derObject = object.getObject(); - switch ( tag ) { + switch ( tag ) + { case 0: DERInteger tag0 = (DERInteger) derObject; message.setProtocolVersionNumber( tag0.intValue() ); @@ -64,11 +65,8 @@ break; case 3: DERSequence tag3 = (DERSequence)derObject; - message.setEncryptedPart( decodeEncryptedData( tag3 ) ); + message.setEncryptedPart( EncryptedDataDecoder.decode( tag3 ) ); break; - default: - System.out.println( derObject ); - break; } } Added: incubator/directory/kerberos/trunk/core/src/java/org/apache/kerberos/io/decoder/TicketDecoder.java URL: http://svn.apache.org/viewcvs/incubator/directory/kerberos/trunk/core/src/java/org/apache/kerberos/io/decoder/TicketDecoder.java?view=auto&rev=151128 ============================================================================== --- incubator/directory/kerberos/trunk/core/src/java/org/apache/kerberos/io/decoder/TicketDecoder.java (added) +++ incubator/directory/kerberos/trunk/core/src/java/org/apache/kerberos/io/decoder/TicketDecoder.java Wed Feb 2 21:55:46 2005 @@ -0,0 +1,93 @@ +/* + * Copyright 2005 The Apache Software Foundation + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * + */ + +package org.apache.kerberos.io.decoder; + +import java.io.IOException; +import java.util.Enumeration; + +import org.apache.asn1.der.DERApplicationSpecific; +import org.apache.asn1.der.DEREncodable; +import org.apache.asn1.der.DERGeneralString; +import org.apache.asn1.der.DERInteger; +import org.apache.asn1.der.DERSequence; +import org.apache.asn1.der.DERTaggedObject; +import org.apache.kerberos.messages.components.Ticket; +import org.apache.kerberos.messages.components.TicketModifier; + + +public class TicketDecoder +{ + public static Ticket[] decodeSequence( DERSequence sequence ) throws IOException + { + Ticket[] tickets = new Ticket[ sequence.size() ]; + + int ii = 0; + for ( Enumeration e = sequence.getObjects(); e.hasMoreElements(); ) + { + DERApplicationSpecific object = (DERApplicationSpecific) e.nextElement(); + tickets[ii] = decode( object ); + } + + return tickets; + } + + /** + * Ticket ::= [APPLICATION 1] SEQUENCE { + * tkt-vno[0] INTEGER, + * realm[1] Realm, + * sname[2] PrincipalName, + * enc-part[3] EncryptedData + * } + */ + protected static Ticket decode( DERApplicationSpecific app ) throws IOException + { + DERSequence sequence = (DERSequence) app.getObject(); + + TicketModifier modifier = new TicketModifier(); + + for ( Enumeration e = sequence.getObjects(); e.hasMoreElements(); ) + { + DERTaggedObject object = (DERTaggedObject) e.nextElement(); + int tag = object.getTagNo(); + DEREncodable derObject = object.getObject(); + + switch ( tag ) + { + case 0: + DERInteger tag0 = (DERInteger)derObject; + modifier.setTicketVersionNumber( tag0.intValue() ); + break; + case 1: + DERGeneralString tag1 = (DERGeneralString)derObject; + modifier.setServerRealm( tag1.getString() ); + break; + case 2: + DERSequence tag2 = (DERSequence)derObject; + modifier.setServerName( PrincipalNameDecoder.decode( tag2 ) ); + break; + case 3: + DERSequence tag3 = (DERSequence)derObject; + modifier.setEncPart( EncryptedDataDecoder.decode( tag3 ) ); + break; + } + } + + return modifier.getTicket(); + } +} +