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.AuthorizationData;
028    import org.apache.directory.server.kerberos.shared.messages.value.AuthorizationDataEntry;
029    import org.apache.directory.server.kerberos.shared.messages.value.types.AuthorizationType;
030    import org.apache.directory.shared.asn1.der.ASN1InputStream;
031    import org.apache.directory.shared.asn1.der.DEREncodable;
032    import org.apache.directory.shared.asn1.der.DERInteger;
033    import org.apache.directory.shared.asn1.der.DEROctetString;
034    import org.apache.directory.shared.asn1.der.DERSequence;
035    import org.apache.directory.shared.asn1.der.DERTaggedObject;
036    
037    
038    /**
039     * @author <a href="mailto:dev@directory.apache.org">Apache Directory Project</a>
040     * @version $Rev: 587531 $, $Date: 2007-10-23 16:59:10 +0200 (Tue, 23 Oct 2007) $
041     */
042    public class AuthorizationDataDecoder implements Decoder, DecoderFactory
043    {
044        public Decoder getDecoder()
045        {
046            return new AuthorizationDataDecoder();
047        }
048    
049    
050        public Encodable decode( byte[] encodedAuthData ) throws IOException
051        {
052            ASN1InputStream ais = new ASN1InputStream( encodedAuthData );
053    
054            DERSequence sequence = ( DERSequence ) ais.readObject();
055    
056            return decodeSequence( sequence );
057        }
058    
059    
060        /**
061         * AuthorizationData ::=   SEQUENCE OF SEQUENCE {
062         *     ad-type[0]               INTEGER,
063         *     ad-data[1]               OCTET STRING
064         * }
065         */
066        protected static AuthorizationData decodeSequence( DERSequence sequence )
067        {
068            AuthorizationData authData = new AuthorizationData();
069    
070            for ( Enumeration<DEREncodable> e = sequence.getObjects(); e.hasMoreElements(); )
071            {
072                DERSequence object = ( DERSequence ) e.nextElement();
073                AuthorizationDataEntry entry = decodeAuthorizationEntry( object );
074                authData.add( entry );
075            }
076    
077            return authData;
078        }
079    
080    
081        protected static AuthorizationDataEntry decodeAuthorizationEntry( DERSequence sequence )
082        {
083            AuthorizationType type = AuthorizationType.NULL;
084            byte[] data = null;
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                        DERInteger tag0 = ( DERInteger ) derObject;
096                        type = AuthorizationType.getTypeByOrdinal( tag0.intValue() );
097                        break;
098                        
099                    case 1:
100                        DEROctetString tag1 = ( DEROctetString ) derObject;
101                        data = tag1.getOctets();
102                        break;
103                }
104            }
105    
106            return new AuthorizationDataEntry( type, data );
107        }
108    }