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.EncKrbPrivPart;
028    import org.apache.directory.server.kerberos.shared.messages.components.EncKrbPrivPartModifier;
029    import org.apache.directory.shared.asn1.der.ASN1InputStream;
030    import org.apache.directory.shared.asn1.der.DERApplicationSpecific;
031    import org.apache.directory.shared.asn1.der.DEREncodable;
032    import org.apache.directory.shared.asn1.der.DERGeneralizedTime;
033    import org.apache.directory.shared.asn1.der.DERInteger;
034    import org.apache.directory.shared.asn1.der.DEROctetString;
035    import org.apache.directory.shared.asn1.der.DERSequence;
036    import org.apache.directory.shared.asn1.der.DERTaggedObject;
037    
038    
039    /**
040     * @author <a href="mailto:dev@directory.apache.org">Apache Directory Project</a>
041     * @version $Rev: 502338 $, $Date: 2007-02-01 20:59:43 +0100 (Thu, 01 Feb 2007) $
042     */
043    public class EncKrbPrivPartDecoder implements Decoder, DecoderFactory
044    {
045        public Decoder getDecoder()
046        {
047            return new EncKrbPrivPartDecoder();
048        }
049    
050    
051        public Encodable decode( byte[] encodedPrivatePart ) throws IOException
052        {
053            ASN1InputStream ais = new ASN1InputStream( encodedPrivatePart );
054    
055            DERApplicationSpecific app = ( DERApplicationSpecific ) ais.readObject();
056    
057            DERSequence privatePart = ( DERSequence ) app.getObject();
058    
059            return decodePrivatePartSequence( privatePart );
060        }
061    
062    
063        private EncKrbPrivPart decodePrivatePartSequence( DERSequence sequence )
064        {
065            EncKrbPrivPartModifier modifier = new EncKrbPrivPartModifier();
066    
067            for ( Enumeration e = sequence.getObjects(); e.hasMoreElements(); )
068            {
069                DERTaggedObject object = ( DERTaggedObject ) e.nextElement();
070                int tag = object.getTagNo();
071                DEREncodable derObject = object.getObject();
072    
073                switch ( tag )
074                {
075                    case 0:
076                        DEROctetString tag0 = ( DEROctetString ) derObject;
077                        modifier.setUserData( tag0.getOctets() );
078                        break;
079                    case 1:
080                        DERGeneralizedTime tag1 = ( DERGeneralizedTime ) derObject;
081                        modifier.setTimestamp( KerberosTimeDecoder.decode( tag1 ) );
082                        break;
083                    case 2:
084                        DERInteger tag2 = ( DERInteger ) derObject;
085                        modifier.setMicroSecond( new Integer( tag2.intValue() ) );
086                        break;
087                    case 3:
088                        DERInteger tag3 = ( DERInteger ) derObject;
089                        modifier.setSequenceNumber( new Integer( tag3.intValue() ) );
090                        break;
091                    case 4:
092                        DERSequence tag4 = ( DERSequence ) derObject;
093                        modifier.setSenderAddress( HostAddressDecoder.decode( tag4 ) );
094                        break;
095                    case 5:
096                        DERSequence tag5 = ( DERSequence ) derObject;
097                        modifier.setRecipientAddress( HostAddressDecoder.decode( tag5 ) );
098                        break;
099                }
100            }
101            return modifier.getEncKrbPrivPart();
102        }
103    }