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     */
020    package org.apache.directory.server.kerberos.shared.io.decoder;
021    
022    
023    import java.io.IOException;
024    import java.util.Enumeration;
025    
026    import org.apache.directory.server.kerberos.shared.messages.Encodable;
027    import org.apache.directory.server.kerberos.shared.messages.components.EncKdcRepPart;
028    import org.apache.directory.server.kerberos.shared.messages.value.KerberosPrincipalModifier;
029    import org.apache.directory.server.kerberos.shared.messages.value.flags.TicketFlags;
030    import org.apache.directory.shared.asn1.der.ASN1InputStream;
031    import org.apache.directory.shared.asn1.der.DERApplicationSpecific;
032    import org.apache.directory.shared.asn1.der.DERBitString;
033    import org.apache.directory.shared.asn1.der.DEREncodable;
034    import org.apache.directory.shared.asn1.der.DERGeneralString;
035    import org.apache.directory.shared.asn1.der.DERGeneralizedTime;
036    import org.apache.directory.shared.asn1.der.DERInteger;
037    import org.apache.directory.shared.asn1.der.DERSequence;
038    import org.apache.directory.shared.asn1.der.DERTaggedObject;
039    
040    
041    /**
042     * @author <a href="mailto:dev@directory.apache.org">Apache Directory Project</a>
043     * @version $Rev: 502338 $, $Date: 2007-02-01 11:59:43 -0800 (Thu, 01 Feb 2007) $
044     */
045    public class EncKdcRepPartDecoder implements Decoder, DecoderFactory
046    {
047        public Decoder getDecoder()
048        {
049            return new EncKdcRepPartDecoder();
050        }
051    
052    
053        public Encodable decode( byte[] encoded ) throws IOException
054        {
055            ASN1InputStream ais = new ASN1InputStream( encoded );
056    
057            DERApplicationSpecific app = ( DERApplicationSpecific ) ais.readObject();
058    
059            DERSequence sequence = ( DERSequence ) app.getObject();
060    
061            return decodeEncKdcRepPartSequence( sequence );
062        }
063    
064    
065        /**
066         *    EncKDCRepPart ::=   SEQUENCE {
067         *                key[0]                       EncryptionKey,
068         *                last-req[1]                  LastReq,
069         *                nonce[2]                     INTEGER,
070         *                key-expiration[3]            KerberosTime OPTIONAL,
071         *                flags[4]                     TicketFlags,
072         *                authtime[5]                  KerberosTime,
073         *                starttime[6]                 KerberosTime OPTIONAL,
074         *                endtime[7]                   KerberosTime,
075         *                renew-till[8]                KerberosTime OPTIONAL,
076         *                srealm[9]                    Realm,
077         *                sname[10]                    PrincipalName,
078         *                caddr[11]                    HostAddresses OPTIONAL
079         * }
080         */
081        private EncKdcRepPart decodeEncKdcRepPartSequence( DERSequence sequence )
082        {
083            EncKdcRepPart modifier = new EncKdcRepPart();
084            KerberosPrincipalModifier principalModifier = new KerberosPrincipalModifier();
085    
086            for ( Enumeration<DEREncodable> e = sequence.getObjects(); e.hasMoreElements(); )
087            {
088                DERTaggedObject object = ( DERTaggedObject ) e.nextElement();
089                int tag = object.getTagNo();
090                DEREncodable derObject = object.getObject();
091    
092                switch ( tag )
093                {
094                    case 0:
095                        DERSequence tag0 = ( DERSequence ) derObject;
096                        modifier.setKey( EncryptionKeyDecoder.decode( tag0 ) );
097                        break;
098                    case 1:
099                        DERSequence tag1 = ( DERSequence ) derObject;
100                        modifier.setLastRequest( LastRequestDecoder.decodeSequence( tag1 ) );
101                        break;
102                    case 2:
103                        DERInteger tag2 = ( DERInteger ) derObject;
104                        modifier.setNonce( new Integer( tag2.intValue() ) );
105                        break;
106                    case 3:
107                        DERGeneralizedTime tag3 = ( DERGeneralizedTime ) derObject;
108                        modifier.setKeyExpiration( KerberosTimeDecoder.decode( tag3 ) );
109                        break;
110                    case 4:
111                        DERBitString tag4 = ( DERBitString ) derObject;
112                        modifier.setFlags( new TicketFlags( tag4.getOctets() ) );
113                        break;
114                    case 5:
115                        DERGeneralizedTime tag5 = ( DERGeneralizedTime ) derObject;
116                        modifier.setAuthTime( KerberosTimeDecoder.decode( tag5 ) );
117                        break;
118                    case 6:
119                        DERGeneralizedTime tag6 = ( DERGeneralizedTime ) derObject;
120                        modifier.setStartTime( KerberosTimeDecoder.decode( tag6 ) );
121                        break;
122                    case 7:
123                        DERGeneralizedTime tag7 = ( DERGeneralizedTime ) derObject;
124                        modifier.setEndTime( KerberosTimeDecoder.decode( tag7 ) );
125                        break;
126                    case 8:
127                        DERGeneralizedTime tag8 = ( DERGeneralizedTime ) derObject;
128                        modifier.setRenewTill( KerberosTimeDecoder.decode( tag8 ) );
129                        break;
130                    case 9:
131                        DERGeneralString tag9 = ( DERGeneralString ) derObject;
132                        principalModifier.setRealm( tag9.getString() );
133                        break;
134                    case 10:
135                        DERSequence tag10 = ( DERSequence ) derObject;
136                        principalModifier.setPrincipalName( PrincipalNameDecoder.decode( tag10 ) );
137                        break;
138                    case 11:
139                        DERSequence tag11 = ( DERSequence ) derObject;
140                        modifier.setClientAddresses( HostAddressDecoder.decodeSequence( tag11 ) );
141                        break;
142                }
143            }
144    
145            modifier.setServerPrincipal( principalModifier.getKerberosPrincipal() );
146    
147            return modifier;
148        }
149    }