Author: erodriguez
Date: Fri Oct  1 11:02:24 2004
New Revision: 47656

Added:
   
incubator/directory/kerberos/trunk/source/main/org/apache/kerberos/io/encoder/
   
incubator/directory/kerberos/trunk/source/main/org/apache/kerberos/io/encoder/EncAsRepPartEncoder.java
   
incubator/directory/kerberos/trunk/source/main/org/apache/kerberos/io/encoder/EncKdcRepPartEncoder.java
   
incubator/directory/kerberos/trunk/source/main/org/apache/kerberos/io/encoder/EncTgsRepPartEncoder.java
   
incubator/directory/kerberos/trunk/source/main/org/apache/kerberos/io/encoder/EncTicketPartEncoder.java
   
incubator/directory/kerberos/trunk/source/main/org/apache/kerberos/io/encoder/KdcReplyEncoder.java
   
incubator/directory/kerberos/trunk/source/main/org/apache/kerberos/io/encoder/KdcReqBodyEncoder.java
   
incubator/directory/kerberos/trunk/source/main/org/apache/kerberos/io/encoder/KerberosMessageEncoder.java
Log:
kerberos ASN.1 encoder package

Added: 
incubator/directory/kerberos/trunk/source/main/org/apache/kerberos/io/encoder/EncAsRepPartEncoder.java
==============================================================================
--- (empty file)
+++ 
incubator/directory/kerberos/trunk/source/main/org/apache/kerberos/io/encoder/EncAsRepPartEncoder.java
      Fri Oct  1 11:02:24 2004
@@ -0,0 +1,30 @@
+/*
+ *   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.encoder;
+
+public class EncAsRepPartEncoder extends EncKdcRepPartEncoder {
+       
+       /*
+        * EncASRepPart ::=    [APPLICATION 25[25]] EncKDCRepPart
+        */
+       public static final int APPLICATION_CODE = 25;
+       
+       public EncAsRepPartEncoder() {
+               super(APPLICATION_CODE);
+       }
+}
+

Added: 
incubator/directory/kerberos/trunk/source/main/org/apache/kerberos/io/encoder/EncKdcRepPartEncoder.java
==============================================================================
--- (empty file)
+++ 
incubator/directory/kerberos/trunk/source/main/org/apache/kerberos/io/encoder/EncKdcRepPartEncoder.java
     Fri Oct  1 11:02:24 2004
@@ -0,0 +1,93 @@
+/*
+ *   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.encoder;
+
+import org.apache.kerberos.messages.*;
+import org.bouncycastle.asn1.*;
+
+import java.io.*;
+
+public abstract class EncKdcRepPartEncoder extends KerberosMessageEncoder {
+       
+       private int _applicationCode;
+       
+       protected EncKdcRepPartEncoder(int applicationCode) {
+               _applicationCode = applicationCode;
+       }
+       
+       public byte[] encode(KdcReply app) throws IOException {
+               ByteArrayOutputStream baos = new ByteArrayOutputStream();
+               ASN1OutputStream aos = new ASN1OutputStream(baos);
+               
+               DERSequence initialSequence = encodeInitialSequence(app);
+               aos.writeObject(new DERApplicationSpecific(_applicationCode, 
initialSequence));
+               
+               return baos.toByteArray();
+       }
+       
+       /*
+          EncKDCRepPart ::=   SEQUENCE {
+                      key[0]                       EncryptionKey,
+                      last-req[1]                  LastReq,
+
+                      nonce[2]                     INTEGER,
+                      key-expiration[3]            KerberosTime OPTIONAL,
+                      flags[4]                     TicketFlags,
+                      authtime[5]                  KerberosTime,
+                      starttime[6]                 KerberosTime OPTIONAL,
+                      endtime[7]                   KerberosTime,
+                      renew-till[8]                KerberosTime OPTIONAL,
+                      srealm[9]                    Realm,
+                      sname[10]                    PrincipalName,
+                      caddr[11]                    HostAddresses OPTIONAL
+       }*/
+       protected DERSequence encodeInitialSequence(KdcReply reply) {
+
+               ASN1EncodableVector vector = new ASN1EncodableVector();
+               
+               vector.add(new DERTaggedObject(0, 
encodeEncryptionKey(reply.getKey())));
+               vector.add(new DERTaggedObject(1, 
encodeLastRequest(reply.getLastRequest())));
+               vector.add(new DERTaggedObject(2, new 
DERInteger(reply.getNonce())));
+               
+               // OPTIONAL
+               if (reply.getKeyExpiration() != null)
+                       vector.add(new DERTaggedObject(3, 
encodeKerberosTime(reply.getKeyExpiration())));
+               
+               vector.add(new DERTaggedObject(4, 
encodeTicketFlags(reply.getFlags())));
+               vector.add(new DERTaggedObject(5, 
encodeKerberosTime(reply.getAuthTime())));
+               
+               // OPTIONAL
+               if (reply.getStartTime() != null)
+                       vector.add(new DERTaggedObject(6, 
encodeKerberosTime(reply.getStartTime())));
+               
+               vector.add(new DERTaggedObject(7, 
encodeKerberosTime(reply.getEndTime())));
+               
+               // OPTIONAL
+               if (reply.getRenewTill() != null)
+                       vector.add(new DERTaggedObject(8, 
encodeKerberosTime(reply.getRenewTill())));
+               
+               vector.add(new DERTaggedObject(9, 
encodeRealm(reply.getServerRealm())));
+               vector.add(new DERTaggedObject(10, 
encodePrincipalName(reply.getServerName())));
+               
+               // OPTIONAL
+               if (reply.getClientAddresses() != null)
+                       vector.add(new DERTaggedObject(11, 
encodeHostAddresses(reply.getClientAddresses())));
+               
+               return new DERSequence(vector);
+       }
+}
+

Added: 
incubator/directory/kerberos/trunk/source/main/org/apache/kerberos/io/encoder/EncTgsRepPartEncoder.java
==============================================================================
--- (empty file)
+++ 
incubator/directory/kerberos/trunk/source/main/org/apache/kerberos/io/encoder/EncTgsRepPartEncoder.java
     Fri Oct  1 11:02:24 2004
@@ -0,0 +1,30 @@
+/*
+ *   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.encoder;
+
+public class EncTgsRepPartEncoder extends EncKdcRepPartEncoder {
+       
+       /*
+        * EncTGSRepPart ::=   [APPLICATION 26] EncKDCRepPart
+        */
+       public static final int APPLICATION_CODE = 26;
+       
+       public EncTgsRepPartEncoder() {
+               super(APPLICATION_CODE);
+       }
+}
+

Added: 
incubator/directory/kerberos/trunk/source/main/org/apache/kerberos/io/encoder/EncTicketPartEncoder.java
==============================================================================
--- (empty file)
+++ 
incubator/directory/kerberos/trunk/source/main/org/apache/kerberos/io/encoder/EncTicketPartEncoder.java
     Fri Oct  1 11:02:24 2004
@@ -0,0 +1,81 @@
+/*
+ *   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.encoder;
+
+import org.apache.kerberos.messages.components.*;
+import org.bouncycastle.asn1.*;
+
+import java.io.*;
+
+public class EncTicketPartEncoder extends KerberosMessageEncoder {
+       
+       public static final int APPLICATION_CODE = 3;
+       
+       public byte[] encode(Ticket ticket) throws IOException {
+               ByteArrayOutputStream baos = new ByteArrayOutputStream();
+               ASN1OutputStream aos = new ASN1OutputStream(baos);
+               
+               DERSequence ticketSequence = encodeInitialSequence(ticket);
+               aos.writeObject(new DERApplicationSpecific(APPLICATION_CODE, 
ticketSequence));
+               aos.close();
+               
+               return baos.toByteArray();
+       }
+       
+       /*
+       -- 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
+       }*/
+       public DERSequence encodeInitialSequence(Ticket ticket) {
+               ASN1EncodableVector vector = new ASN1EncodableVector();
+               
+               vector.add(new DERTaggedObject(0, 
encodeTicketFlags(ticket.getFlags())));
+               vector.add(new DERTaggedObject(1, 
encodeEncryptionKey(ticket.getSessionKey())));
+               vector.add(new DERTaggedObject(2, 
encodeRealm(ticket.getClientRealm())));
+               vector.add(new DERTaggedObject(3, 
encodePrincipalName(ticket.getClientName())));
+               vector.add(new DERTaggedObject(4, 
encodeTransitedEncoding(ticket.getTransitedEncoding())));
+               vector.add(new DERTaggedObject(5, 
encodeKerberosTime(ticket.getAuthtime())));
+               
+               // OPTIONAL
+               if (ticket.getStartTime() != null)
+                       vector.add(new DERTaggedObject(6, 
encodeKerberosTime(ticket.getStartTime())));
+               
+               vector.add(new DERTaggedObject(7, 
encodeKerberosTime(ticket.getEndTime())));
+               
+               // OPTIONAL
+               if (ticket.getRenewTill() != null)
+                       vector.add(new DERTaggedObject(8, 
encodeKerberosTime(ticket.getRenewTill())));
+               if (ticket.getClientAddresses() != null)
+                       vector.add(new DERTaggedObject(9, 
encodeHostAddresses(ticket.getClientAddresses())));
+               if (ticket.getAuthorizationData() != null)
+                       vector.add(new DERTaggedObject(10, 
encodeAuthorizationData(ticket.getAuthorizationData())));
+               
+               return new DERSequence(vector);
+       }
+}
+

Added: 
incubator/directory/kerberos/trunk/source/main/org/apache/kerberos/io/encoder/KdcReplyEncoder.java
==============================================================================
--- (empty file)
+++ 
incubator/directory/kerberos/trunk/source/main/org/apache/kerberos/io/encoder/KdcReplyEncoder.java
  Fri Oct  1 11:02:24 2004
@@ -0,0 +1,89 @@
+/*
+ *   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.encoder;
+
+import org.apache.kerberos.messages.*;
+import org.apache.kerberos.messages.value.*;
+import org.bouncycastle.asn1.*;
+
+import java.io.*;
+
+public class KdcReplyEncoder extends KerberosMessageEncoder {
+       /*
+       AS-REP ::=    [APPLICATION 11] KDC-REP
+       TGS-REP ::=   [APPLICATION 13] KDC-REP
+        */
+       public OutputStream encode(KdcReply app, OutputStream os) throws 
IOException {
+               
+               ASN1OutputStream aos = new ASN1OutputStream(os);
+               
+               DERSequence kdcrep = encodeKdcReplySequence(app);
+               aos.writeObject(new 
DERApplicationSpecific(app.getMessageType().getOrdinal(), kdcrep));
+               
+               aos.close();
+               
+               return aos;
+       }
+
+       /*
+       KDC-REP ::=   SEQUENCE {
+                     pvno[0]                    INTEGER,
+                     msg-type[1]                INTEGER,
+                     padata[2]                  SEQUENCE OF PA-DATA OPTIONAL,
+                     crealm[3]                  Realm,
+                     cname[4]                   PrincipalName,
+                     ticket[5]                  Ticket,
+                     enc-part[6]                EncryptedData
+       }*/
+       private DERSequence encodeKdcReplySequence(KdcReply app) {
+               
+               ASN1EncodableVector vector = new ASN1EncodableVector();
+               
+               vector.add(new DERTaggedObject(0, new 
DERInteger(app.getProtocolVersionNumber())));
+               vector.add(new DERTaggedObject(1, new 
DERInteger(app.getMessageType().getOrdinal())));
+               if (app.getPaData() != null)
+                       vector.add(new DERTaggedObject(2, 
encodePaData(app.getPaData())));
+               vector.add(new DERTaggedObject(3, 
encodeRealm(app.getCrealm())));
+               vector.add(new DERTaggedObject(4, 
encodePrincipalName(app.getCname())));
+               vector.add(new DERTaggedObject(5, 
encodeTicket(app.getTicket())));
+               vector.add(new DERTaggedObject(6, 
encodeEncryptedData(app.getEncPart())));
+               
+               return new DERSequence(vector);
+       }
+
+       /*
+       PA-DATA ::=        SEQUENCE {
+                  padata-type[1]        INTEGER,
+                  padata-value[2]       OCTET STRING,
+                                -- might be encoded AP-REQ
+       }*/
+       private DERSequence encodePaData(PreAuthenticationData[] paData) {
+               
+               ASN1EncodableVector pa = new ASN1EncodableVector();
+               
+               for (int i = 0; i < paData.length; i++) {
+                       ASN1EncodableVector vector = new ASN1EncodableVector();
+
+                       vector.add(new DERTaggedObject(1, new 
DERInteger(paData[i].getDataType())));
+                       vector.add(new DERTaggedObject(2, new 
DEROctetString(paData[i].getDataValue())));
+                       pa.add(new DERSequence(vector));
+               }
+               
+               return new DERSequence(pa);
+       }
+}
+

Added: 
incubator/directory/kerberos/trunk/source/main/org/apache/kerberos/io/encoder/KdcReqBodyEncoder.java
==============================================================================
--- (empty file)
+++ 
incubator/directory/kerberos/trunk/source/main/org/apache/kerberos/io/encoder/KdcReqBodyEncoder.java
        Fri Oct  1 11:02:24 2004
@@ -0,0 +1,90 @@
+/*
+ *   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.encoder;
+
+import org.apache.kerberos.messages.*;
+import org.bouncycastle.asn1.*;
+
+import java.io.*;
+
+public class KdcReqBodyEncoder extends KerberosMessageEncoder {
+
+       public byte[] encode(KdcRequest request) throws IOException {
+               ByteArrayOutputStream baos = new ByteArrayOutputStream();
+               ASN1OutputStream aos = new ASN1OutputStream(baos);
+               
+               aos.writeObject(encodeInitialSequence(request));
+               aos.flush();
+               aos.close();
+
+               return baos.toByteArray();
+       }
+       
+       /*
+       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 DERSequence encodeInitialSequence(KdcRequest request) {
+               ASN1EncodableVector vector = new ASN1EncodableVector();
+               
+               vector.add(new DERTaggedObject(0, 
encodeKdcOptions(request.getKdcOptions())));
+               // OPTIONAL
+               if (request.getCname() != null)
+                       vector.add(new DERTaggedObject(1, 
encodePrincipalName(request.getCname())));
+               vector.add(new DERTaggedObject(2, 
encodeRealm(request.getRealm())));
+               // OPTIONAL
+               if (request.getSname() != null)
+                       vector.add(new DERTaggedObject(3, 
encodePrincipalName(request.getSname())));
+               // OPTIONAL
+               if (request.getFrom() != null)
+                       vector.add(new DERTaggedObject(4, 
encodeKerberosTime(request.getFrom())));
+               vector.add(new DERTaggedObject(5, 
encodeKerberosTime(request.getTill())));
+               // OPTIONAL
+               if (request.getRtime() != null)
+                       vector.add(new DERTaggedObject(6, 
encodeKerberosTime(request.getRtime())));
+               vector.add(new DERTaggedObject(7, new 
DERInteger(request.getNonce())));
+               vector.add(new DERTaggedObject(8, 
encodeEncryptionType(request.getEType())));
+               // OPTIONAL
+               if (request.getAddresses() != null)
+                       vector.add(new DERTaggedObject(9, 
encodeHostAddresses(request.getAddresses())));
+               // OPTIONAL
+               if (request.getEncAuthorizationData() != null)
+                       vector.add(new DERTaggedObject(10, 
encodeEncryptedData(request.getEncAuthorizationData())));
+               // OPTIONAL
+               if (request.getAdditionalTickets() != null)
+                       vector.add(new DERTaggedObject(11, 
encodeAdditionalTickets(request.getAdditionalTickets())));
+
+               return new DERSequence(vector);
+       }
+}
+

Added: 
incubator/directory/kerberos/trunk/source/main/org/apache/kerberos/io/encoder/KerberosMessageEncoder.java
==============================================================================
--- (empty file)
+++ 
incubator/directory/kerberos/trunk/source/main/org/apache/kerberos/io/encoder/KerberosMessageEncoder.java
   Fri Oct  1 11:02:24 2004
@@ -0,0 +1,299 @@
+/*
+ *   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.encoder;
+
+import org.apache.kerberos.crypto.encryption.*;
+import org.apache.kerberos.messages.components.*;
+import org.apache.kerberos.messages.value.*;
+import org.bouncycastle.asn1.*;
+
+import java.util.*;
+
+public abstract class KerberosMessageEncoder {
+       
+       /*
+       PrincipalName ::=   SEQUENCE {
+                     name-type[0]     INTEGER,
+                     name-string[1]   SEQUENCE OF GeneralString
+       }*/
+       protected DERSequence encodePrincipalName(PrincipalName name) {
+               
+               ASN1EncodableVector vector = new ASN1EncodableVector();
+               
+               vector.add(new DERTaggedObject(0, new 
DERInteger(name.getNameType())));
+               vector.add(new DERTaggedObject(1, encodeNameSequence(name)));
+               
+               return new DERSequence(vector);
+       }
+       
+       protected DERSequence encodeNameSequence(PrincipalName name) {
+               Iterator it = name.getNameStrings().iterator();
+               
+               ASN1EncodableVector vector = new ASN1EncodableVector();
+               
+               while (it.hasNext())
+                       vector.add(new DERGeneralString((String)it.next()));
+               
+               return new DERSequence(vector);
+               
+       }
+       
+       /*
+       Ticket ::=                    [APPLICATION 1] SEQUENCE {
+        tkt-vno[0]                   INTEGER,
+        realm[1]                     Realm,
+        sname[2]                     PrincipalName,
+        enc-part[3]                  EncryptedData
+    }*/
+    protected DERApplicationSpecific encodeTicket(Ticket ticket) {
+       
+               ASN1EncodableVector vector = new ASN1EncodableVector();
+               
+               vector.add(new DERTaggedObject(0, new 
DERInteger(ticket.getTicketVersionNumber())));
+               vector.add(new DERTaggedObject(1, new 
DERGeneralString(ticket.getRealm().toString())));
+               vector.add(new DERTaggedObject(2, 
encodePrincipalName(ticket.getServerName())));
+               vector.add(new DERTaggedObject(3, 
encodeEncryptedData(ticket.getEncPart())));
+               
+               DERApplicationSpecific ticketSequence = null;
+               try {
+                       ticketSequence = new DERApplicationSpecific(1, new 
DERSequence(vector));
+               } catch (Exception e) {
+                       e.printStackTrace();
+               }
+               return ticketSequence;
+    }
+    
+       /*
+       KerberosTime ::=   GeneralizedTime
+                   -- Specifying UTC time zone (Z)
+       */
+    protected DERGeneralizedTime encodeKerberosTime(KerberosTime time) {
+       return new DERGeneralizedTime(time.toDate());
+    }
+       
+       /*
+    etype[8]             SEQUENCE OF INTEGER, -- EncryptionEngine,
+                -- in preference order
+    */
+       protected DERSequence encodeEncryptionType(EncryptionType[] eType) {
+               
+               ASN1EncodableVector outerVector = new ASN1EncodableVector();
+               
+               for (int i = 0; i < eType.length; i++) {
+                       outerVector.add(new DERInteger(eType[i].getOrdinal()));
+               }
+               return new DERSequence(outerVector);
+       }
+       
+       /*
+        HostAddress ::=     SEQUENCE  {
+                        addr-type[0]             INTEGER,
+                        address[1]               OCTET STRING
+    }*/
+       protected DERSequence encodeHostAddress(HostAddress host) {
+               ASN1EncodableVector vector = new ASN1EncodableVector();
+               
+               vector.add(new DERTaggedObject(0, new 
DERInteger(host.getAddrType())));
+               vector.add(new DERTaggedObject(1, new 
DEROctetString(host.getAddress())));
+               
+               return new DERSequence(vector);
+       }
+       
+       /*
+       HostAddresses ::=   SEQUENCE OF SEQUENCE {
+                           addr-type[0]             INTEGER,
+                           address[1]               OCTET STRING
+       }*/
+       protected DERSequence encodeHostAddresses(HostAddresses hosts) {
+               
+               HostAddress[] addresses = hosts.getAddresses();
+               ASN1EncodableVector outerVector = new ASN1EncodableVector();
+               
+               for (int i = 0; i < addresses.length; i++) {
+                       ASN1EncodableVector vector = new ASN1EncodableVector();
+                       vector.add(new DERTaggedObject(0, new 
DERInteger(addresses[i].getAddrType())));
+                       vector.add(new DERTaggedObject(1, new 
DEROctetString(addresses[i].getAddress())));
+                       outerVector.add(new DERSequence(vector));
+               }
+               return new DERSequence(outerVector);
+       }
+       
+       /*
+       EncryptedData ::=   SEQUENCE {
+                   etype[0]     INTEGER, -- EncryptionEngine
+                   kvno[1]      INTEGER OPTIONAL,
+                   cipher[2]    OCTET STRING -- ciphertext
+       }*/
+       protected DERSequence encodeEncryptedData(EncryptedData encPart) {
+               ASN1EncodableVector vector = new ASN1EncodableVector();
+               
+               vector.add(new DERTaggedObject(0, new 
DERInteger(encPart.getEncryptionType().getOrdinal())));
+               if (encPart.getKeyVersion() > 0)
+                       vector.add(new DERTaggedObject(1, new 
DERInteger(encPart.getKeyVersion())));
+               vector.add(new DERTaggedObject(2, new 
DEROctetString(encPart.getCipherText())));
+               
+               return new DERSequence(vector);
+       }
+       
+       protected DERGeneralString encodeRealm(Realm realm) {
+               return new DERGeneralString(realm.toString());
+       }
+       
+       protected DERSequence encodeEncryptionKey(EncryptionKey key) {
+               ASN1EncodableVector vector = new ASN1EncodableVector();
+               
+               vector.add(new DERTaggedObject(0, new 
DERInteger(key.getKeyType().getOrdinal())));
+               vector.add(new DERTaggedObject(1, new 
DEROctetString(key.getKeyValue())));
+               
+               return new DERSequence(vector);
+       }
+       
+       /*
+       Checksum ::=   SEQUENCE {
+             cksumtype[0]   INTEGER,
+             checksum[1]    OCTET STRING
+    }
+       */
+       protected DERSequence encodeChecksum(Checksum checksum) {
+               ASN1EncodableVector vector = new ASN1EncodableVector();
+               
+               vector.add(new DERTaggedObject(0, new 
DERInteger(checksum.getChecksumType().getOrdinal())));
+               vector.add(new DERTaggedObject(1, new 
DEROctetString(checksum.getChecksumValue())));
+               
+               return new DERSequence(vector);
+       }
+       
+       /*
+       LastReq ::=   SEQUENCE OF SEQUENCE {
+       lr-type[0]               INTEGER,
+       lr-value[1]              KerberosTime
+       }*/
+       protected DERSequence encodeLastRequest(LastRequest lastReq) {
+
+               LastRequestEntry[] entries = lastReq.getEntries();
+               ASN1EncodableVector outerVector = new ASN1EncodableVector();
+               for (int i = 0; i < entries.length; i++) {
+                       ASN1EncodableVector vector = new ASN1EncodableVector();
+                       vector.add(new DERTaggedObject(0, new 
DERInteger(entries[i].getLastRequestType())));
+                       vector.add(new DERTaggedObject(1, new 
DERGeneralizedTime(entries[i].getLastRequestValue().toDate())));
+                       outerVector.add(new DERSequence(vector));
+                       }
+               
+               return new DERSequence(outerVector);
+       }
+       
+       /*
+       APOptions ::=   BIT STRING {
+           reserved(0),
+           use-session-key(1),
+           mutual-required(2)
+       }*/
+       protected DERBitString encodeApOptions(ApOptions options) {
+               return new DERBitString(options.getBytes());
+       }
+       
+       /*
+       TicketFlags ::=   BIT STRING {
+             reserved(0),
+             forwardable(1),
+             forwarded(2),
+             proxiable(3),
+             proxy(4),
+             may-postdate(5),
+             postdated(6),
+             invalid(7),
+             renewable(8),
+             initial(9),
+             pre-authent(10),
+             hw-authent(11)
+       }*/
+       protected DERBitString encodeTicketFlags(TicketFlags flags) {
+               return new DERBitString(flags.getBytes());
+       }
+       
+       /*
+    KDCOptions ::=   BIT STRING {
+        reserved(0),
+        forwardable(1),
+        forwarded(2),
+        proxiable(3),
+        proxy(4),
+        allow-postdate(5),
+        postdated(6),
+
+        unused7(7),
+        renewable(8),
+        unused9(9),
+        unused10(10),
+        unused11(11),
+        renewable-ok(27),
+        enc-tkt-in-skey(28),
+        renew(30),
+        validate(31)
+        }*/
+       protected DERBitString encodeKdcOptions(KdcOptions options) {
+               return new DERBitString(options.getBytes());
+       }
+       
+       /*
+       TransitedEncoding ::=         SEQUENCE {
+        tr-type[0]  INTEGER, -- must be registered
+        contents[1]          OCTET STRING
+    }*/
+       protected DERSequence encodeTransitedEncoding(TransitedEncoding te) {
+               
+               ASN1EncodableVector vector = new ASN1EncodableVector();
+               
+               vector.add(new DERTaggedObject(0, new 
DERInteger(te.getType())));
+               vector.add(new DERTaggedObject(1, new 
DEROctetString(te.getContents())));
+               
+               return new DERSequence(vector);
+       }
+       
+       /*
+       AuthorizationData ::=   SEQUENCE OF SEQUENCE {
+        ad-type[0]               INTEGER,
+        ad-data[1]               OCTET STRING
+    }*/
+       protected DERSequence encodeAuthorizationData(AuthorizationData data) {
+               
+               Iterator it = data.iterator();
+               ASN1EncodableVector outerVector = new ASN1EncodableVector();
+               
+               while (it.hasNext()) {
+                       AuthorizationDataEntry entry = 
(AuthorizationDataEntry)it.next();
+                       ASN1EncodableVector vector = new ASN1EncodableVector();
+                       vector.add(new DERTaggedObject(0, new 
DERInteger(entry.getAuthorizationDataType())));
+                       vector.add(new DERTaggedObject(1, new 
DEROctetString(entry.getAuthorizationData())));
+                       outerVector.add(new DERSequence(vector));
+               }
+               return new DERSequence(outerVector);
+       }
+       
+       protected DERSequence encodeAdditionalTickets(Ticket[] tickets) {
+
+               ASN1EncodableVector outerVector = new ASN1EncodableVector();
+
+               for (int i = 0; i < tickets.length; i++) {
+                       ASN1EncodableVector vector = new ASN1EncodableVector();
+                       vector.add(encodeTicket(tickets[i]));
+                       outerVector.add(new DERSequence(vector));
+               }
+               return new DERSequence(outerVector);
+       }
+}
+

Reply via email to