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/05/09 23:20:27 UTC
svn commit: r169360 -
/directory/sandbox/trunk/asn1-new-codec/src/java/org/apache/asn1/primitives/OID.java
Author: elecharny
Date: Mon May 9 14:20:26 2005
New Revision: 169360
URL: http://svn.apache.org/viewcvs?rev=169360&view=rev
Log:
- Added a getOIDLength() method
- implemented the getOID() method that send back a bytes[] representing the OID
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=169360&r1=169359&r2=169360&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 Mon May 9 14:20:26 2005
@@ -231,6 +231,10 @@
int pos = 0;
int intPos = 0;
+
+ // This flag is used to forbid a second value above 39 if the
+ // first value is 0 or 1 (itu_t or iso arcs)
+ boolean ituOrIso = false;
// The first value
switch ( bytes[pos] )
@@ -238,6 +242,9 @@
case '0' : // itu-t
case '1' : // iso
+ ituOrIso = true;
+ // fallthrough
+
case '2' : // joint-iso-itu-t
oidValues[intPos++] = bytes[pos++] - '0';
break;
@@ -269,6 +276,15 @@
throw new DecoderException( "Invalid OID : " + oid );
}
+ if (ituOrIso && value > 39)
+ {
+ throw new DecoderException( "Invalid OID : " + oid );
+ }
+ else
+ {
+ ituOrIso = false;
+ }
+
nbInts++;
dotSeen = true;
oidValues[intPos++] = value;
@@ -278,6 +294,7 @@
{
dotSeen = false;
value = ( ( value * 10 ) + bytes[i] ) - '0';
+
}
else
{
@@ -303,11 +320,150 @@
* Get an array of bytes from the OID
* @return An array of int representing the OID
*/
- public byte[] getOID()
+ public int getOIDLength()
{
+ int value = oidValues[0] * 40 + oidValues[1];
+ int firstValues = value;
+ int nbBytes = 0;
+
+ if (value < 128)
+ {
+ nbBytes += 1;
+ }
+ else if (value < 16384)
+ {
+ nbBytes += 2;
+ }
+ else if (value < 2097152)
+ {
+ nbBytes += 3;
+ }
+ else if (value < 268435456)
+ {
+ nbBytes += 4;
+ }
+ else
+ {
+ nbBytes += 5;
+ }
+
+ for (int i = 2; i < oidValues.length; i++ )
+ {
+ value = oidValues[i];
+
+ if (value < 128)
+ {
+ nbBytes += 1;
+ }
+ else if (value < 16384)
+ {
+ nbBytes += 2;
+ }
+ else if (value < 2097152)
+ {
+ nbBytes += 3;
+ }
+ else if (value < 268435456)
+ {
+ nbBytes += 4;
+ }
+ else
+ {
+ nbBytes += 5;
+ }
+ }
+
+ return nbBytes;
+ }
- //byte[] bytes = new byte[oidValues]
- return null;
+ /**
+ * Get an array of bytes from the OID
+ * @return An array of int representing the OID
+ */
+ public byte[] getOID()
+ {
+ int value = oidValues[0] * 40 + oidValues[1];
+ int firstValues = value;
+
+ byte[] bytes = new byte[getOIDLength()];
+ int pos = 0;
+ int posInt = 0;
+
+ if (oidValues[0] < 2)
+ {
+ bytes[pos++] = (byte)(oidValues[0] * 40 + oidValues[1]);
+ }
+ else
+ {
+ if (firstValues < 128)
+ {
+ bytes[pos++] = (byte)(firstValues);
+ }
+ else if (firstValues < 16384)
+ {
+ bytes[pos++] = (byte)( ( firstValues >> 7 ) | 0x0080 );
+ bytes[pos++] = (byte)( firstValues & 0x007F);
+ }
+ else if (value < 2097152)
+ {
+ bytes[pos++] = (byte)( ( firstValues >> 14 ) | 0x0080);
+ bytes[pos++] = (byte)( ( ( firstValues >> 7 ) & 0x007F) | 0x0080);
+ bytes[pos++] = (byte)( firstValues & 0x007F);
+ }
+ else if (value < 268435456)
+ {
+ bytes[pos++] = (byte)( ( firstValues >> 21 ) | 0x0080);
+ bytes[pos++] = (byte)( ( ( firstValues >> 14 ) & 0x007F) | 0x0080);
+ bytes[pos++] = (byte)( ( ( firstValues >> 7 ) & 0x007F) | 0x0080);
+ bytes[pos++] = (byte)( firstValues & 0x007F);
+ }
+ else
+ {
+ bytes[pos++] = (byte)( ( firstValues >> 28 ) | 0x0080);
+ bytes[pos++] = (byte)( ( ( firstValues >> 21 ) & 0x007F) | 0x0080);
+ bytes[pos++] = (byte)( ( ( firstValues >> 14 ) & 0x007F) | 0x0080);
+ bytes[pos++] = (byte)( ( ( firstValues >> 7 ) & 0x007F) | 0x0080);
+ bytes[pos++] = (byte)( firstValues & 0x007F);
+ }
+ }
+
+ for (int i = 2; i < oidValues.length; i++ )
+ {
+ value = oidValues[i];
+
+ if (value < 128)
+ {
+ bytes[pos++] = (byte)(value);
+ }
+ else if (value < 16384)
+ {
+ bytes[pos++] = (byte)( ( value >> 7 ) | 0x0080 );
+ bytes[pos++] = (byte)( value & 0x007F);
+ }
+ else if (value < 2097152)
+ {
+ bytes[pos++] = (byte)( ( value >> 14 ) | 0x0080);
+ bytes[pos++] = (byte)( ( ( value >> 7 ) & 0x007F) | 0x0080);
+ bytes[pos++] = (byte)( value & 0x007F);
+ }
+ else if (value < 268435456)
+ {
+ bytes[pos++] = (byte)( ( value >> 21 ) | 0x0080);
+ bytes[pos++] = (byte)( ( ( value >> 14 ) & 0x007F) | 0x0080);
+ bytes[pos++] = (byte)( ( ( value >> 7 ) & 0x007F) | 0x0080);
+ bytes[pos++] = (byte)( value & 0x007F);
+ }
+ else
+ {
+ bytes[pos++] = (byte)( ( value >> 28 ) | 0x0080);
+ bytes[pos++] = (byte)( ( ( value >> 21 ) & 0x007F) | 0x0080);
+ bytes[pos++] = (byte)( ( ( value >> 14 ) & 0x007F) | 0x0080);
+ bytes[pos++] = (byte)( ( ( value >> 7 ) & 0x007F) | 0x0080);
+ bytes[pos++] = (byte)( value & 0x007F);
+ }
+ }
+
+ return bytes;
}
/**