You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@directory.apache.org by el...@apache.org on 2005/04/30 15:01:21 UTC

svn commit: r165406 - /directory/sandbox/trunk/asn1-new-codec/src/java/org/apache/asn1/primitives/OID.java

Author: elecharny
Date: Sat Apr 30 06:01:19 2005
New Revision: 165406

URL: http://svn.apache.org/viewcvs?rev=165406&view=rev
Log:
Completed the OID primitive class. It's needed for SPNEGO decoder

Modified:
    directory/sandbox/trunk/asn1-new-codec/src/java/org/apache/asn1/primitives/OID.java

Modified: directory/sandbox/trunk/asn1-new-codec/src/java/org/apache/asn1/primitives/OID.java
URL: http://svn.apache.org/viewcvs/directory/sandbox/trunk/asn1-new-codec/src/java/org/apache/asn1/primitives/OID.java?rev=165406&r1=165405&r2=165406&view=diff
==============================================================================
--- directory/sandbox/trunk/asn1-new-codec/src/java/org/apache/asn1/primitives/OID.java (original)
+++ directory/sandbox/trunk/asn1-new-codec/src/java/org/apache/asn1/primitives/OID.java Sat Apr 30 06:01:19 2005
@@ -16,9 +16,162 @@
  */
 package org.apache.asn1.primitives;
 
+import org.apache.asn1.DecoderException;
+import org.apache.asn1.util.pools.PoolObject;
+
 /**
+ * This class implement an OID (Object Identifier).
+ * 
+ * An OID is encoded as a list of bytes representing integers. 
+ * 
+ * An OID has a numeric representation where number are separated with dots :
+ * SPNEGO Oid = 1.3.6.1.5.5.2
+ * 
+ * Translating from a byte list to a dot separated list of number follows the rules :
+ * - the first number is in [0..2]
+ * - the second number is in [0..39] if the first number is 0 or 1
+ * - the first byte has a value equal to : number 1 * 40 + number two
+ * - the upper bit of a byte is set if the next byte is a part of the number
+ * 
+ * For instance, the SPNEGO Oid (1.3.6.1.5.5.2) will be encoded : 
+ * 1.3 -> 0x2B (1*40 + 3 = 43 = 0x2B) 
+ * .6  -> 0x06 
+ * .1  -> 0x01 
+ * .5  -> 0x05 
+ * .5  -> 0x05 
+ * .2  -> 0x02 
+ * 
+ * The Kerberos V5 Oid (1.2.840.48018.1.2.2)  will be encoded :
+ * 1.2   -> 0x2A (1*40 + 2 = 42 = 0x2A) 
+ * 840   -> 0x86 0x48 (840 = 6 * 128 + 72 = (0x06 | 0x80) 0x48 = 0x86 0x48
+ * 48018 -> 0x82 0xF7 0x12 (2 * 128 * 128 + 119 * 128 + 18 = (0x02 | 0x80) (0x77 | 0x80) 0x12
+ * 
  * @author <a href="mailto:dev@directory.apache.org">Apache Directory Project</a>
  */
-public class OID {
+public class OID extends PoolObject {
+    /** The OID as a array of int */
+    private int[] oidValues;
+
+    /**
+     * Creates a new OID object.
+     */
+    public OID()
+    {
+        // We should not create this kind of object directly, it must
+        // be created through the factory.
+    }
+    
+    /**
+     * Set the OID. It will be translated from a byte array to a string.
+     * @param oid
+     */
+    public void setOID(byte[] oid) throws DecoderException
+    {
+        if ( oid == null )
+        {
+            throw new DecoderException("Null OID");
+        }
+        
+        if ( oid == null | oid.length < 1 )
+        {
+            throw new DecoderException("Invalid OID : " + oid);
+        }
+        
+        // First, we have to calculate the number of int to allocate
+        int nbValues = 2;
+        
+        int pos = 1;
+
+        while ( pos < oid.length )
+        {
+            if ( oid[pos] >= 0 )
+            {
+                nbValues++;
+            }
+            
+            pos++;
+        }
+        
+        oidValues = new int[nbValues];
+        
+        nbValues = 0;
+        pos = 0;
+        int accumulator = 0;
+        
+
+        if ( oid[0] < 40 )
+        {
+            oidValues[nbValues++] = 0;
+            oidValues[nbValues++] = oid[pos++] ; // itu-t
+        } 
+        else if ( oid[0] < 80 ) 
+        {
+            oidValues[nbValues++] = 1;
+            oidValues[nbValues++] = oid[pos++] - 40 ; // iso
+        }
+        else 
+        {
+            oidValues[nbValues++] = 2;
+            
+            while ( pos < oid.length )
+            {
+                if ( oid[pos] >= 0 )
+                {
+                    oidValues[nbValues++]  = (( accumulator << 7 ) + oid[pos]) - 80; 
+                    accumulator = 0;
+                    pos++;
+                    break;
+                }
+                else
+                {
+                    accumulator = ( accumulator << 7 ) + ( oid[pos] & 0x007F ); 
+                }
+                
+                pos++;
+            }
+        }
+
+        while ( pos < oid.length )
+        {
+            
+            if ( oid[pos] >= 0 )
+            {
+                oidValues[nbValues++]  = ( accumulator << 7 ) + oid[pos]; 
+                accumulator = 0;
+            }
+            else
+            {
+                accumulator = ( accumulator << 7 ) + ( oid[pos] & 0x007F ); 
+            }
+            
+            pos++;
+        }
+    }
+    
+    /**
+     * Get an array of int from the OID
+     * @return An array of int representing the OID
+     */
+    public int[] getOIDValues()
+    {
+        return oidValues;
+    }
+
+    /**
+     * Get the OID as a String
+     * @return A String representing the OID
+     */
+    public String getOID()
+    {
+        StringBuffer sb = new StringBuffer();
+        sb.append(oidValues[0]);
+        int pos = 1;
 
+        for ( int i = 1 ; i < oidValues.length ; i++ )
+        {
+            sb.append('.').append(oidValues[i]);
+        }
+        
+        return sb.toString();
+    }
 }