Author: erodriguez
Date: Fri Oct  1 08:40:52 2004
New Revision: 47650

Added:
   incubator/directory/kerberos/trunk/source/main/org/apache/kerberos/io/
   
incubator/directory/kerberos/trunk/source/main/org/apache/kerberos/io/decoder/
   
incubator/directory/kerberos/trunk/source/main/org/apache/kerberos/io/decoder/ApplicationRequestDecoder.java
   
incubator/directory/kerberos/trunk/source/main/org/apache/kerberos/io/decoder/AuthenticatorDecoder.java
   
incubator/directory/kerberos/trunk/source/main/org/apache/kerberos/io/decoder/AuthorizationDataDecoder.java
   
incubator/directory/kerberos/trunk/source/main/org/apache/kerberos/io/decoder/EncTicketPartDecoder.java
   
incubator/directory/kerberos/trunk/source/main/org/apache/kerberos/io/decoder/KdcRequestDecoder.java
   
incubator/directory/kerberos/trunk/source/main/org/apache/kerberos/io/decoder/KerberosMessageDecoder.java
Log:
Kerberos ASN.1 DER decoders

Added: 
incubator/directory/kerberos/trunk/source/main/org/apache/kerberos/io/decoder/ApplicationRequestDecoder.java
==============================================================================
--- (empty file)
+++ 
incubator/directory/kerberos/trunk/source/main/org/apache/kerberos/io/decoder/ApplicationRequestDecoder.java
        Fri Oct  1 08:40:52 2004
@@ -0,0 +1,87 @@
+/*
+ *   Copyright 2004 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 org.apache.kerberos.messages.*;
+import org.apache.kerberos.messages.value.*;
+import org.bouncycastle.asn1.*;
+
+import java.io.*;
+import java.util.*;
+
+public class ApplicationRequestDecoder extends KerberosMessageDecoder {
+       
+       public ApplicationRequest decode(byte[] encodedAuthHeader) throws 
IOException {
+               
+               ByteArrayInputStream bais = new 
ByteArrayInputStream(encodedAuthHeader);
+               ASN1InputStream ais = new ASN1InputStream(bais);
+
+               DERApplicationSpecific app = (DERApplicationSpecific) 
ais.readObject();
+               
+               DERSequence apreq = (DERSequence) app.getObject();
+               return decodeApplicationRequestSequence(apreq);
+       }
+       
+       /*
+        AP-REQ ::=      [APPLICATION 14] SEQUENCE {
+        pvno[0]                       INTEGER,
+        msg-type[1]                   INTEGER,
+
+        ap-options[2]                 APOptions,
+        ticket[3]                     Ticket,
+        authenticator[4]              EncryptedData
+        }
+    */
+       private ApplicationRequest decodeApplicationRequestSequence(DERSequence 
sequence) throws IOException {
+               
+               ApplicationRequest authHeader = new ApplicationRequest();
+               
+               for (Enumeration e = sequence.getObjects(); 
e.hasMoreElements();) {
+                       DERTaggedObject object = ((DERTaggedObject) 
e.nextElement());
+                       int tag = object.getTagNo();
+                       DERObject derObject = object.getObject();
+                       System.out.println(tag);
+                       switch (tag) {
+                               case 0:
+                                       DERInteger tag0 = (DERInteger) 
derObject;
+                                       
authHeader.setProtocolVersionNumber(tag0.getValue().intValue());
+                                       break;
+                               case 1:
+                                       DERInteger tag1 = (DERInteger) 
derObject;
+                                       
authHeader.setMessageType(MessageType.getTypeByOrdinal(tag1.getValue().intValue()));
+                                       break;
+                               case 2:
+                                       DERBitString apOptions = 
(DERBitString)derObject;
+                                       authHeader.setApOptions(new 
ApOptions(apOptions.getBytes()));
+                                       break;
+                               case 3:
+                                       DERApplicationSpecific tag3 = 
(DERApplicationSpecific)derObject;
+                                       
authHeader.setTicket(decodeTicket(tag3));
+                                       break;
+                               case 4:
+                                       DERSequence tag4 = 
(DERSequence)derObject;
+                                       
authHeader.setEncPart(decodeEncryptedData(tag4));
+                                       break;
+                           default:
+                               System.out.println(derObject);
+                               break;
+                       }
+               }
+               return authHeader;
+       }
+}
+

Added: 
incubator/directory/kerberos/trunk/source/main/org/apache/kerberos/io/decoder/AuthenticatorDecoder.java
==============================================================================
--- (empty file)
+++ 
incubator/directory/kerberos/trunk/source/main/org/apache/kerberos/io/decoder/AuthenticatorDecoder.java
     Fri Oct  1 08:40:52 2004
@@ -0,0 +1,38 @@
+/*
+ *   Copyright 2004 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 org.apache.kerberos.messages.components.*;
+import org.bouncycastle.asn1.*;
+
+import java.io.*;
+
+public class AuthenticatorDecoder extends KerberosMessageDecoder {
+       
+       public Authenticator decode(byte[] encodedAuthenticator) throws 
IOException {
+               
+               ByteArrayInputStream bais = new 
ByteArrayInputStream(encodedAuthenticator);
+               ASN1InputStream ais = new ASN1InputStream(bais);
+               
+               DERApplicationSpecific app = (DERApplicationSpecific) 
ais.readObject();
+               
+               DERSequence sequence = (DERSequence) app.getObject();
+               
+               return decodeAuthenticator(sequence);
+       }
+}
+

Added: 
incubator/directory/kerberos/trunk/source/main/org/apache/kerberos/io/decoder/AuthorizationDataDecoder.java
==============================================================================
--- (empty file)
+++ 
incubator/directory/kerberos/trunk/source/main/org/apache/kerberos/io/decoder/AuthorizationDataDecoder.java
 Fri Oct  1 08:40:52 2004
@@ -0,0 +1,36 @@
+/*
+ *   Copyright 2004 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 org.apache.kerberos.messages.value.*;
+import org.bouncycastle.asn1.*;
+
+import java.io.*;
+
+public class AuthorizationDataDecoder extends KerberosMessageDecoder {
+       
+       public AuthorizationData decode(byte[] encodedAuthData) throws 
IOException {
+               
+               ByteArrayInputStream bais = new 
ByteArrayInputStream(encodedAuthData);
+               ASN1InputStream ais = new ASN1InputStream(bais);
+
+               DERSequence sequence = (DERSequence) ais.readObject();
+               
+               return decodeAuthorizationData(sequence);
+       }
+}
+

Added: 
incubator/directory/kerberos/trunk/source/main/org/apache/kerberos/io/decoder/EncTicketPartDecoder.java
==============================================================================
--- (empty file)
+++ 
incubator/directory/kerberos/trunk/source/main/org/apache/kerberos/io/decoder/EncTicketPartDecoder.java
     Fri Oct  1 08:40:52 2004
@@ -0,0 +1,118 @@
+/*
+ *   Copyright 2004 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 org.apache.kerberos.messages.components.*;
+import org.apache.kerberos.messages.value.*;
+import org.bouncycastle.asn1.*;
+
+import java.io.*;
+import java.util.*;
+
+public class EncTicketPartDecoder extends KerberosMessageDecoder {
+       
+       public EncTicketPart decode(byte[] encodedTicket) throws IOException {
+               
+               ByteArrayInputStream bais = new 
ByteArrayInputStream(encodedTicket);
+               ASN1InputStream ais = new ASN1InputStream(bais);
+               
+               DERApplicationSpecific app = (DERApplicationSpecific) 
ais.readObject();
+               
+               DERSequence sequence = (DERSequence) app.getObject();
+               
+               return decodeEncTicketPartSequence(sequence);
+               
+       }
+       
+       /*
+       -- Encrypted part of ticket
+       EncTicketPart ::=     [APPLICATION 3] SEQUENCE {
+                             flags[0]             TicketFlags,
+                             key[1]               EncryptionKey,
+                             crealm[2]            Realm,
+                             cname[3]             PrincipalName,
+                             transited[4]         TransitedEncoding,
+                             authtime[5]          KerberosTime,
+                             starttime[6]         KerberosTime OPTIONAL,
+                             endtime[7]           KerberosTime,
+                             renew-till[8]        KerberosTime OPTIONAL,
+                             caddr[9]             HostAddresses OPTIONAL,
+                             authorization-data[10]   AuthorizationData 
OPTIONAL
+       }*/
+       private EncTicketPart decodeEncTicketPartSequence(DERSequence sequence) 
{
+               
+               EncTicketPart encPart = new EncTicketPart();
+               
+               for (Enumeration e = sequence.getObjects(); 
e.hasMoreElements();) {
+                       DERTaggedObject object = ((DERTaggedObject) 
e.nextElement());
+                       int tag = object.getTagNo();
+                       DERObject derObject = object.getObject();
+                       System.out.println(tag);
+                       switch (tag) {
+                               case 0:
+                                       DERBitString tag0 = 
(DERBitString)derObject;
+                                       encPart.setFlags(new 
TicketFlags(tag0.getBytes()));
+                                       break;
+                               case 1:
+                                       DERSequence tag1 = (DERSequence) 
derObject;
+                                       
encPart.setSessionKey(decodeEncryptionKey(tag1));
+                                       break;
+                               case 2:
+                                       DERGeneralString tag2 = 
(DERGeneralString)derObject;
+                                       encPart.setClientRealm(new 
Realm(tag2.getString()));
+                                       break;
+                               case 3:
+                                       DERSequence tag3 = 
(DERSequence)derObject;
+                                       
encPart.setClientName(decodePrincipalName(tag3));
+                                       break;
+                               case 4:
+                                       DERSequence tag4 = 
(DERSequence)derObject;
+                                       
encPart.setTransitedEncoding(decodeTransitedEncoding(tag4));
+                                       break;
+                               case 5:
+                                       DERGeneralizedTime tag5 = 
(DERGeneralizedTime)derObject;
+                                       
encPart.setAuthtime(decodeKerberosTime(tag5));
+                                       break;
+                               case 6:
+                                       DERGeneralizedTime tag6 = 
(DERGeneralizedTime)derObject;
+                                       
encPart.setStartTime(decodeKerberosTime(tag6));
+                                       break;
+                               case 7:
+                                       DERGeneralizedTime tag7 = 
(DERGeneralizedTime)derObject;
+                                       
encPart.setEndTime(decodeKerberosTime(tag7));
+                                       break;
+                               case 8:
+                                       DERGeneralizedTime tag8 = 
(DERGeneralizedTime)derObject;
+                                       
encPart.setRenewTill(decodeKerberosTime(tag8));
+                                       break;
+                               case 9:
+                                       DERSequence tag9 = 
(DERSequence)derObject;
+                                       
encPart.setClientAddresses(decodeHostAddresses(tag9));
+                                       break;
+                               case 10:
+                                       DERSequence tag10 = 
(DERSequence)derObject;
+                                       
encPart.setAuthorizationData(decodeAuthorizationData(tag10));
+                                       break;
+                           default:
+                               System.out.println(derObject);
+                               break;
+                       }
+               }
+               return encPart;
+       }
+}
+

Added: 
incubator/directory/kerberos/trunk/source/main/org/apache/kerberos/io/decoder/KdcRequestDecoder.java
==============================================================================
--- (empty file)
+++ 
incubator/directory/kerberos/trunk/source/main/org/apache/kerberos/io/decoder/KdcRequestDecoder.java
        Fri Oct  1 08:40:52 2004
@@ -0,0 +1,227 @@
+/*
+ *   Copyright 2004 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 org.apache.kerberos.messages.*;
+import org.apache.kerberos.messages.components.*;
+import org.apache.kerberos.messages.value.*;
+import org.bouncycastle.asn1.*;
+
+import java.io.*;
+import java.util.*;
+
+public class KdcRequestDecoder extends KerberosMessageDecoder {
+
+       public KdcRequest decode(InputStream is) throws IOException {
+               
+               ASN1InputStream ais = new ASN1InputStream(is);
+               
+               DERApplicationSpecific app = (DERApplicationSpecific) 
ais.readObject();
+               
+               DERSequence kdcreq = (DERSequence) app.getObject();
+               return decodeKdcRequestSequence(kdcreq);
+       }
+       
+       /*
+       AS-REQ ::=         [APPLICATION 10] KDC-REQ
+       TGS-REQ ::=        [APPLICATION 12] KDC-REQ
+       
+       KDC-REQ ::=        SEQUENCE {
+                  pvno[1]               INTEGER,
+                  msg-type[2]           INTEGER,
+                  padata[3]             SEQUENCE OF PA-DATA OPTIONAL,
+                  req-body[4]           KDC-REQ-BODY
+       }*/
+       private KdcRequest decodeKdcRequestSequence(DERSequence sequence) 
throws IOException {
+               
+               int pvno = 5;
+               MessageType msgType = MessageType.NULL;
+               
+               PreAuthenticationData[] paData = null;
+               KdcReqBody reqBody = null;
+               
+               for (Enumeration e = sequence.getObjects(); 
e.hasMoreElements();) {
+                       DERTaggedObject object = ((DERTaggedObject) 
e.nextElement());
+                       int tag = object.getTagNo();
+                       DERObject derObject = object.getObject();
+                       System.out.println(tag);
+                       switch (tag) {
+                               case 1:
+                                       DERInteger tag1 = (DERInteger)derObject;
+                                       pvno = tag1.getValue().intValue();
+                                       break;
+                               case 2:
+                                       DERInteger tag2 = (DERInteger)derObject;
+                                       msgType = 
MessageType.getTypeByOrdinal(tag2.getValue().intValue());
+                                       break;
+                               case 3:
+                                       DERSequence tag3 = 
(DERSequence)derObject;
+                                       paData = decodePaData(tag3);
+                                       break;
+                               case 4:
+                                       DERSequence tag4 = 
(DERSequence)derObject;
+                                       reqBody = decodeKdcRequestBody(tag4);
+                                       break;
+                           default:
+                               System.out.println(derObject);
+                               break;
+                       }
+               }
+               
+               return new KdcRequest(pvno, msgType, paData, reqBody);
+       }
+
+       /*
+       PA-DATA ::=        SEQUENCE {
+                  padata-type[1]        INTEGER,
+                  padata-value[2]       OCTET STRING,
+                                -- might be encoded AP-REQ
+       }*/
+       private PreAuthenticationData[] decodePaData(DERSequence sequence) {
+
+               PreAuthenticationData[] paDataSequence = new 
PreAuthenticationData[2];
+               int i = 0;
+
+               for (Enumeration e = sequence.getObjects(); 
e.hasMoreElements();) {
+                       DERSequence pa = (DERSequence) e.nextElement();
+                       
+                       paDataSequence[i] = new PreAuthenticationData();
+                       
+                       for (Enumeration e2 = pa.getObjects(); 
e2.hasMoreElements();) {
+                               DERTaggedObject object = ((DERTaggedObject) 
e2.nextElement());
+                               int tag = object.getTagNo();
+                               DERObject derObject = object.getObject();
+                               System.out.println(tag);
+                               switch (tag) {
+                                       case 1:
+                                               DERInteger padataType = 
(DERInteger) derObject;
+                                               
paDataSequence[i].setDataType(padataType.getValue().intValue());
+                                               break;
+                                       case 2:
+                                               DEROctetString padataValue = 
(DEROctetString) derObject;
+                                               
paDataSequence[i].setDataValue(padataValue.getOctets());
+                                               break;
+                                       default:
+                                               System.out.println(derObject);
+                                               break;
+                               }
+                       }
+                       
+                       i++;
+               }
+               return paDataSequence;
+       }
+
+       /*
+       KDC-REQ-BODY ::=   SEQUENCE {
+                   kdc-options[0]       KdcOptions,
+                   cname[1]             PrincipalName OPTIONAL,
+                                -- Used only in AS-REQ
+                   realm[2]             Realm, -- Server's realm
+                                -- Also client's in AS-REQ
+                   sname[3]             PrincipalName OPTIONAL,
+                   from[4]              KerberosTime OPTIONAL,
+                   till[5]              KerberosTime,
+                   rtime[6]             KerberosTime OPTIONAL,
+                   nonce[7]             INTEGER,
+                   etype[8]             SEQUENCE OF INTEGER, -- 
EncryptionEngine,
+                                -- in preference order
+                   addresses[9]         HostAddresses OPTIONAL,
+                   enc-authorization-data[10]   EncryptedData OPTIONAL,
+                                -- Encrypted AuthorizationData encoding
+                   additional-tickets[11]       SEQUENCE OF Ticket OPTIONAL
+       }*/
+       private KdcReqBody decodeKdcRequestBody(DERSequence sequence) throws 
IOException {
+               
+               KdcReqBody reqBody = new KdcReqBody();
+               
+               for (Enumeration e = sequence.getObjects(); 
e.hasMoreElements();) {
+                       DERTaggedObject object = ((DERTaggedObject) 
e.nextElement());
+                       int tag = object.getTagNo();
+                       DERObject derObject = object.getObject();
+                       System.out.println(tag);
+                       switch (tag) {
+                               case 0:
+                                       DERBitString kdcOptions = 
(DERBitString)derObject;
+                                       reqBody.setKdcOptions(new 
KdcOptions(kdcOptions.getBytes()));
+                                       break;
+                               case 1:
+                                       DERSequence cName = 
(DERSequence)derObject;
+                                       
reqBody.setCname(decodePrincipalName(cName));
+                                       break;
+                               case 2:
+                                       DERGeneralString realm = 
(DERGeneralString)derObject;
+                                       reqBody.setRealm(new 
Realm(realm.getString()));
+                                       break;
+                               case 3:
+                                       DERSequence sname = 
(DERSequence)derObject;
+                                       
reqBody.setSname(decodePrincipalName(sname));
+                                       break;
+                               case 4:
+                                       DERGeneralizedTime from = 
(DERGeneralizedTime)derObject;
+                                       
reqBody.setFrom(decodeKerberosTime(from));
+                                       break;
+                               case 5:
+                                       DERGeneralizedTime till = 
(DERGeneralizedTime)derObject;
+                                       
reqBody.setTill(decodeKerberosTime(till));
+                                       break;
+                               case 6:
+                                       DERGeneralizedTime rtime = 
(DERGeneralizedTime)derObject;
+                                       
reqBody.setRtime(decodeKerberosTime(rtime));
+                                       break;
+                               case 7:
+                                       DERInteger nonce = 
(DERInteger)derObject;
+                                       
reqBody.setNonce(nonce.getValue().intValue());
+                                       break;
+                               case 8:
+                                       DERSequence etype = 
(DERSequence)derObject;
+                                       
reqBody.setEType(decodeEncryptionType(etype));
+                                       break;
+                               case 9:
+                                       DERSequence hostAddresses = 
(DERSequence)derObject;
+                                       
reqBody.setAddresses(decodeHostAddresses(hostAddresses));
+                                       break;
+                               case 10:
+                                       DERSequence encryptedData = 
(DERSequence)derObject;
+                                       
reqBody.setEncAuthorizationData(decodeEncryptedData(encryptedData));
+                                       break;
+                               case 11:
+                                       DERSequence tag11 = 
(DERSequence)derObject;
+                                       
reqBody.setAdditionalTickets(decodeTickets(tag11));
+                                       break;
+                           default:
+                               System.out.println("****** " + 
object.getObject());
+                               break;
+                       }
+               }
+               
+               return reqBody;
+       }
+       
+       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/source/main/org/apache/kerberos/io/decoder/KerberosMessageDecoder.java
==============================================================================
--- (empty file)
+++ 
incubator/directory/kerberos/trunk/source/main/org/apache/kerberos/io/decoder/KerberosMessageDecoder.java
   Fri Oct  1 08:40:52 2004
@@ -0,0 +1,444 @@
+/*
+ *   Copyright 2004 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 org.apache.kerberos.crypto.checksum.*;
+import org.apache.kerberos.crypto.encryption.*;
+import org.apache.kerberos.messages.components.*;
+import org.apache.kerberos.messages.value.*;
+import org.bouncycastle.asn1.*;
+
+import java.io.*;
+import java.text.*;
+import java.util.*;
+
+public abstract class KerberosMessageDecoder {
+       
+       /*
+       Ticket ::=                    [APPLICATION 1] SEQUENCE {
+        tkt-vno[0]                   INTEGER,
+        realm[1]                     Realm,
+        sname[2]                     PrincipalName,
+        enc-part[3]                  EncryptedData
+    }*/
+       protected Ticket decodeTicket(DERApplicationSpecific app) throws 
IOException{
+               
+               DERSequence sequence = (DERSequence) app.getObject();
+               
+               Ticket ticket = new Ticket();
+               
+               for (Enumeration e = sequence.getObjects(); 
e.hasMoreElements();) {
+                       DERTaggedObject object = ((DERTaggedObject) 
e.nextElement());
+                       int tag = object.getTagNo();
+                       DERObject derObject = object.getObject();
+                       System.out.println(tag + " " + derObject);
+                       switch (tag) {
+                               case 0:
+                                       DERInteger etype = 
(DERInteger)derObject;
+                                       
ticket.setTicketVersionNumber(etype.getValue().intValue());
+                                       break;
+                               case 1:
+                                       DERGeneralString tag1 = 
(DERGeneralString)derObject;
+                                       ticket.setRealm(new 
Realm(tag1.getString()));
+                                       break;
+                               case 2:
+                                       DERSequence tag2 = 
(DERSequence)derObject;
+                                       
ticket.setServerName(decodePrincipalName(tag2));
+                                       break;
+                               case 3:
+                                       DERSequence tag3 = 
(DERSequence)derObject;
+                                       
ticket.setEncPart(decodeEncryptedData(tag3));
+                                       break;
+                           default:
+                               System.out.println(object.getObject());
+                               break;
+                       }
+               }
+               return ticket;
+       }
+       
+       /*
+       EncryptedData ::=   SEQUENCE {
+                   etype[0]     INTEGER, -- EncryptionEngine
+                   kvno[1]      INTEGER OPTIONAL,
+                   cipher[2]    OCTET STRING -- ciphertext
+       }*/
+       protected EncryptedData decodeEncryptedData(DERSequence sequence) {
+               
+               EncryptedData data = new EncryptedData();
+               
+               for (Enumeration e = sequence.getObjects(); 
e.hasMoreElements();) {
+                       DERTaggedObject object = ((DERTaggedObject) 
e.nextElement());
+                       int tag = object.getTagNo();
+                       DERObject derObject = object.getObject();
+                       System.out.println(tag + " " + derObject);
+                       switch (tag) {
+                               case 0:
+                                       DERInteger etype = 
(DERInteger)derObject;
+                                       
data.setEncryptionType(EncryptionType.getTypeByOrdinal(etype.getValue().intValue()));
+                                       break;
+                               case 1:
+                                       DERInteger kvno = (DERInteger)derObject;
+                                       
data.setKeyVersion(kvno.getValue().intValue());
+                                       break;
+                               case 2:
+                                       DEROctetString cipher = 
(DEROctetString)derObject;
+                                       data.setCipherText(cipher.getOctets());
+                                       break;
+                           default:
+                               System.out.println(object.getObject());
+                               break;
+                       }
+               }
+               return data;
+       }
+       
+       /*
+       PrincipalName ::=   SEQUENCE {
+                     name-type[0]     INTEGER,
+                     name-string[1]   SEQUENCE OF GeneralString
+       }*/
+       protected PrincipalName decodePrincipalName(DERSequence sequence) {
+               
+               PrincipalName name = new PrincipalName();
+               
+               for (Enumeration e = sequence.getObjects(); 
e.hasMoreElements();) {
+                       DERTaggedObject object = ((DERTaggedObject) 
e.nextElement());
+                       int tag = object.getTagNo();
+                       DERObject derObject = object.getObject();
+                       System.out.println(tag);
+                       switch (tag) {
+                               case 0:
+                                       DERInteger nameType = 
(DERInteger)derObject;
+                                       
name.setNameType(nameType.getValue().intValue());
+                                       break;
+                               case 1:
+                                       DERSequence nameString = 
(DERSequence)derObject;
+                                       decodeNameString(nameString, name);
+                                       break;
+                           default:
+                               System.out.println(derObject);
+                               break;
+                       }
+               }
+               return name;
+       }
+       
+       private void decodeNameString(DERSequence sequence, PrincipalName name) 
{
+               for (Enumeration e = sequence.getObjects(); 
e.hasMoreElements();) {
+                       DERGeneralString object = ((DERGeneralString) 
e.nextElement());
+                       name.addName(object.getString());
+               }
+       }
+       
+       /*
+       KerberosTime ::=   GeneralizedTime
+                   -- Specifying UTC time zone (Z)
+       */
+       protected KerberosTime decodeKerberosTime(DERGeneralizedTime time) {
+               Date date = null;
+               try {
+                       date = time.getDate();
+               } catch (ParseException pe) {
+                       pe.printStackTrace();
+               }
+               return new KerberosTime(date);
+       }
+       
+       /*
+    etype[8]             SEQUENCE OF INTEGER, -- EncryptionEngine,
+                -- in preference order
+    */
+       protected EncryptionType[] decodeEncryptionType(DERSequence sequence) {
+               
+               EncryptionType[] eTypes = new EncryptionType[sequence.size()];
+               int i = 0;
+               
+               for (Enumeration e = sequence.getObjects(); 
e.hasMoreElements();) {
+                       DERInteger object = ((DERInteger) e.nextElement());
+                       eTypes[i] = 
EncryptionType.getTypeByOrdinal(object.getValue().intValue());
+                       i++;
+               }
+               return eTypes;
+       }
+       
+       /*
+        HostAddress ::=     SEQUENCE  {
+                        addr-type[0]             INTEGER,
+                        address[1]               OCTET STRING
+    }*/
+       protected HostAddress decodeHostAddress(DERSequence sequence) {
+               
+               int type = 0;
+               byte[] value = new byte[0];
+               
+               for (Enumeration e = sequence.getObjects(); 
e.hasMoreElements();) {
+                       DERTaggedObject object = ((DERTaggedObject) 
e.nextElement());
+                       int tag = object.getTagNo();
+                       DERObject derObject = object.getObject();
+                       System.out.println(tag);
+                       switch (tag) {
+                               case 0:
+                                       DERInteger addressType = 
(DERInteger)derObject;
+                                       type = 
addressType.getValue().intValue();
+                                       break;
+                               case 1:
+                                       DEROctetString address = 
(DEROctetString)derObject;
+                                       value = address.getOctets();
+                                       break;
+                           default:
+                               System.out.println(derObject);
+                               break;
+                       }
+               }
+               return new HostAddress(type, value);
+       }
+       
+       /*
+       HostAddresses ::=   SEQUENCE OF SEQUENCE {
+                           addr-type[0]             INTEGER,
+                           address[1]               OCTET STRING
+       }*/
+       protected HostAddresses decodeHostAddresses(DERSequence sequence) {
+               
+               HostAddress[] addresses = new HostAddress[sequence.size()];
+               int i = 0;
+               for (Enumeration e = sequence.getObjects(); 
e.hasMoreElements();) {
+                       DERSequence object = ((DERSequence) e.nextElement());
+                       HostAddress address = decodeHostAddress(object);
+                       addresses[i] = address;
+                       i++;
+               }
+               return new HostAddresses(addresses);
+       }
+       
+       /*
+       Checksum ::=   SEQUENCE {
+             cksumtype[0]   INTEGER,
+             checksum[1]    OCTET STRING
+    }
+       */
+       protected Checksum decodeChecksum(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();
+                       DERObject derObject = object.getObject();
+                       System.out.println(tag);
+                       switch (tag) {
+                               case 0:
+                                       DERInteger tag0 = (DERInteger)derObject;
+                                       type = 
ChecksumType.getTypeByOrdinal(tag0.getValue().intValue());
+                                       break;
+                               case 1:
+                                       DEROctetString tag1 = 
(DEROctetString)derObject;
+                                       data = tag1.getOctets();
+                                       break;
+                           default:
+                               System.out.println(derObject);
+                               break;
+                       }
+               }
+               return new Checksum(type, data);
+       }
+       
+       /*
+    EncryptionKey ::=   SEQUENCE {
+        keytype[0]    INTEGER,
+        keyvalue[1]   OCTET STRING
+    }*/
+       protected EncryptionKey decodeEncryptionKey(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();
+                       DERObject derObject = object.getObject();
+                       System.out.println(tag);
+                       switch (tag) {
+                               case 0:
+                                       DERInteger tag0 = (DERInteger)derObject;
+                                       type = 
EncryptionType.getTypeByOrdinal(tag0.getValue().intValue());
+                                       break;
+                               case 1:
+                                       DEROctetString tag1 = 
(DEROctetString)derObject;
+                                       data = tag1.getOctets();
+                                       break;
+                           default:
+                               System.out.println(derObject);
+                               break;
+                       }
+               }
+               return new EncryptionKey(type, data);
+       }
+       
+       /*
+       LastReq ::=   SEQUENCE OF SEQUENCE {
+       lr-type[0]               INTEGER,
+       lr-value[1]              KerberosTime
+       }*/
+       protected void decodeLastRequest() {};
+       
+       /*
+       TransitedEncoding ::=         SEQUENCE {
+        tr-type[0]  INTEGER, -- must be registered
+        contents[1]          OCTET STRING
+    }*/
+       protected TransitedEncoding decodeTransitedEncoding(DERSequence 
sequence) {
+               int type = 0;
+               byte[] contents = null;
+
+               for (Enumeration e = sequence.getObjects(); 
e.hasMoreElements();) {
+                       DERTaggedObject object = ((DERTaggedObject) 
e.nextElement());
+                       int tag = object.getTagNo();
+                       DERObject derObject = object.getObject();
+                       System.out.println(tag);
+                       switch (tag) {
+                               case 0:
+                                       DERInteger tag0 = (DERInteger) 
derObject;
+                                       type = tag0.getValue().intValue();
+                                       break;
+                               case 1:
+                                       DEROctetString tag1 = (DEROctetString) 
derObject;
+                                       contents = tag1.getOctets();
+                                       break;
+                               default:
+                                       System.out.println(derObject);
+                                       break;
+                       }
+               }
+               return new TransitedEncoding(type, contents);
+       }
+       
+       /*
+       AuthorizationData ::=   SEQUENCE OF SEQUENCE {
+        ad-type[0]               INTEGER,
+        ad-data[1]               OCTET STRING
+    }*/
+       protected AuthorizationData decodeAuthorizationData(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 AuthorizationDataEntry decodeAuthorizationEntry(DERSequence 
sequence) {
+               
+               int type = 0;
+               byte[] data = null;
+               
+               for (Enumeration e = sequence.getObjects(); 
e.hasMoreElements();) {
+                       DERTaggedObject object = ((DERTaggedObject) 
e.nextElement());
+                       int tag = object.getTagNo();
+                       DERObject derObject = object.getObject();
+                       System.out.println(tag);
+                       switch (tag) {
+                               case 0:
+                                       DERInteger tag0 = (DERInteger)derObject;
+                                       type = tag0.getValue().intValue();
+                                       break;
+                               case 1:
+                                       DEROctetString tag1 = 
(DEROctetString)derObject;
+                                       data = tag1.getOctets();
+                                       break;
+                           default:
+                               System.out.println(derObject);
+                               break;
+                       }
+               }
+               return new AuthorizationDataEntry(type, data);
+       }
+       
+       /*
+       -- Unencrypted authenticator
+       Authenticator ::=    [APPLICATION 2] SEQUENCE    {
+                      authenticator-vno[0]          INTEGER,
+                      crealm[1]                     Realm,
+                      cname[2]                      PrincipalName,
+                      cksum[3]                      Checksum OPTIONAL,
+                      cusec[4]                      INTEGER,
+                      ctime[5]                      KerberosTime,
+                      subkey[6]                     EncryptionKey OPTIONAL,
+                      seq-number[7]                 INTEGER OPTIONAL,
+
+                      authorization-data[8]         AuthorizationData OPTIONAL
+       }
+       */
+       protected Authenticator decodeAuthenticator(DERSequence sequence) {
+               
+               Authenticator auth = new Authenticator();
+               
+               for (Enumeration e = sequence.getObjects(); 
e.hasMoreElements();) {
+                       DERTaggedObject object = ((DERTaggedObject) 
e.nextElement());
+                       int tag = object.getTagNo();
+                       DERObject derObject = object.getObject();
+                       System.out.println(tag);
+                       switch (tag) {
+                               case 0:
+                                       DERInteger tag0 = (DERInteger)derObject;
+                                       
auth.setVersionNumber(tag0.getValue().intValue());
+                                       break;
+                               case 1:
+                                       DERGeneralString tag1 = 
(DERGeneralString)derObject;
+                                       auth.setClientRealm(new 
Realm(tag1.getString()));
+                                       break;
+                               case 2:
+                                       DERSequence tag2 = 
(DERSequence)derObject;
+                                       
auth.setClientName(decodePrincipalName(tag2));
+                                       break;
+                               case 3:
+                                       DERSequence tag3 = 
(DERSequence)derObject;
+                                       auth.setChecksum(decodeChecksum(tag3));
+                                       break;
+                               case 4:
+                                       DERInteger tag4 = (DERInteger)derObject;
+                                       
auth.setClientMicroSecond(tag4.getValue().intValue());
+                                       break;
+                               case 5:
+                                       DERGeneralizedTime tag5 = 
(DERGeneralizedTime)derObject;
+                                       
auth.setClientTime(decodeKerberosTime(tag5));
+                                       break;
+                               case 6:
+                                       DERSequence tag6 = (DERSequence) 
derObject;
+                                       
auth.setSubSessionKey(decodeEncryptionKey(tag6));
+                                       break;
+                               case 7:
+                                       DERInteger tag7 = (DERInteger)derObject;
+                                       
auth.setSequenceNumber(tag7.getValue().intValue());
+                                       break;
+                               case 8:
+                                       DERSequence tag8 = 
(DERSequence)derObject;
+                                       
auth.setAuthorizationData(decodeAuthorizationData(tag8));
+                                       break;
+                           default:
+                               System.out.println(derObject);
+                               break;
+                       }
+               }
+               return auth;
+       }
+}
+

Reply via email to