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.value.EncryptedTimeStamp;
028    import org.apache.directory.server.kerberos.shared.messages.value.EncryptedTimeStampModifier;
029    import org.apache.directory.shared.asn1.der.ASN1InputStream;
030    import org.apache.directory.shared.asn1.der.DEREncodable;
031    import org.apache.directory.shared.asn1.der.DERGeneralizedTime;
032    import org.apache.directory.shared.asn1.der.DERInteger;
033    import org.apache.directory.shared.asn1.der.DERSequence;
034    import org.apache.directory.shared.asn1.der.DERTaggedObject;
035    
036    
037    /**
038     * padata-type     ::= PA-ENC-TIMESTAMP
039     * padata-value    ::= EncryptedData -- PA-ENC-TS-ENC
040     * 
041     * PA-ENC-TS-ENC   ::= SEQUENCE {
042     *         patimestamp[0]               KerberosTime, -- client's time
043     *         pausec[1]                    INTEGER OPTIONAL
044     * }
045     * 
046     * @author <a href="mailto:dev@directory.apache.org">Apache Directory Project</a>
047     * @version $Rev: 502338 $, $Date: 2007-02-01 20:59:43 +0100 (Thu, 01 Feb 2007) $
048     */
049    public class EncryptedTimestampDecoder implements Decoder, DecoderFactory
050    {
051        public Decoder getDecoder()
052        {
053            return new EncryptedTimestampDecoder();
054        }
055    
056    
057        public Encodable decode( byte[] encodedEncryptedTimestamp ) throws IOException
058        {
059            ASN1InputStream ais = new ASN1InputStream( encodedEncryptedTimestamp );
060    
061            DERSequence sequence = ( DERSequence ) ais.readObject();
062    
063            return decodeEncryptedTimestamp( sequence );
064        }
065    
066    
067        protected EncryptedTimeStamp decodeEncryptedTimestamp( DERSequence sequence )
068        {
069            EncryptedTimeStampModifier modifier = new EncryptedTimeStampModifier();
070    
071            for ( Enumeration e = sequence.getObjects(); e.hasMoreElements(); )
072            {
073                DERTaggedObject object = ( DERTaggedObject ) e.nextElement();
074                int tag = object.getTagNo();
075                DEREncodable derObject = object.getObject();
076    
077                switch ( tag )
078                {
079                    case 0:
080                        DERGeneralizedTime tag0 = ( DERGeneralizedTime ) derObject;
081                        modifier.setKerberosTime( KerberosTimeDecoder.decode( tag0 ) );
082                        break;
083                    case 1:
084                        DERInteger tag1 = ( DERInteger ) derObject;
085                        modifier.setMicroSecond( tag1.intValue() );
086                        break;
087                }
088            }
089    
090            return modifier.getEncryptedTimestamp();
091        }
092    }