DERObjectIdentifier.java
上传用户:lior1029
上传日期:2013-05-07
资源大小:209k
文件大小:4k
源码类别:

CA认证

开发平台:

Java

  1. package org.bouncycastle.asn1;
  2. import java.io.*;
  3. public class DERObjectIdentifier
  4.     extends DERObject
  5. {
  6.     String      identifier;
  7.     /**
  8.      * return an OID from the passed in object
  9.      *
  10.      * @exception IllegalArgumentException if the object cannot be converted.
  11.      */
  12.     public static DERObjectIdentifier getInstance(
  13.         Object  obj)
  14.     {
  15.         if (obj == null || obj instanceof DERObjectIdentifier)
  16.         {
  17.             return (DERObjectIdentifier)obj;
  18.         }
  19.         if (obj instanceof ASN1OctetString)
  20.         {
  21.             return new DERObjectIdentifier(((ASN1OctetString)obj).getOctets());
  22.         }
  23.         if (obj instanceof ASN1TaggedObject)
  24.         {
  25.             return getInstance(((ASN1TaggedObject)obj).getObject());
  26.         }
  27.         throw new IllegalArgumentException("illegal object in getInstance: " + obj.getClass().getName());
  28.     }
  29.     /**
  30.      * return an Object Identifier from a tagged object.
  31.      *
  32.      * @param obj the tagged object holding the object we want
  33.      * @param explicit true if the object is meant to be explicitly
  34.      *              tagged false otherwise.
  35.      * @exception IllegalArgumentException if the tagged object cannot
  36.      *               be converted.
  37.      */
  38.     public static DERObjectIdentifier getInstance(
  39.         ASN1TaggedObject obj,
  40.         boolean          explicit)
  41.     {
  42.         return getInstance(obj.getObject());
  43.     }
  44.     
  45.     DERObjectIdentifier(
  46.         byte[]  bytes)
  47.     {
  48.         int             head = bytes[0] & 0xff;
  49.         StringBuffer    objId = new StringBuffer();
  50.         int             value = 0;
  51.         boolean         first = true;
  52.         for (int i = 0; i != bytes.length; i++)
  53.         {
  54.             int b = bytes[i] & 0xff;
  55.             value = value * 128 + (b & 0x7f);
  56.             if ((b & 0x80) == 0)             // end of number reached
  57.             {
  58.                 if (first)
  59.                 {
  60.                     switch (value / 40)
  61.                     {
  62.                     case 0:
  63.                         objId.append('0');
  64.                         break;
  65.                     case 1:
  66.                         objId.append('1');
  67.                         value -= 40;
  68.                         break;
  69.                     default:
  70.                         objId.append('2');
  71.                         value -= 80;
  72.                     }
  73.                     first = false;
  74.                 }
  75.                 objId.append('.');
  76.                 objId.append(Integer.toString(value));
  77.                 value = 0;
  78.             }
  79.         }
  80.         this.identifier = objId.toString();
  81.     }
  82.     public DERObjectIdentifier(
  83.         String  identifier)
  84.     {
  85.         this.identifier = identifier;
  86.     }
  87.     public String getId()
  88.     {
  89.         return identifier;
  90.     }
  91.     private void writeField(
  92.         OutputStream    out,
  93.         int             fieldValue)
  94.         throws IOException
  95.     {
  96.         if (fieldValue >= (1 << 7))
  97.         {
  98.             if (fieldValue >= (1 << 14))
  99.             {
  100.                 if (fieldValue >= (1 << 21))
  101.                 {
  102.                     if (fieldValue >= (1 << 28))
  103.                     {
  104.                         out.write((fieldValue >> 28) | 0x80);
  105.                     }
  106.                     out.write((fieldValue >> 21) | 0x80);
  107.                 }
  108.                 out.write((fieldValue >> 14) | 0x80);
  109.             }
  110.             out.write((fieldValue >> 7) | 0x80);
  111.         }
  112.         out.write(fieldValue & 0x7f);
  113.     }
  114.     void encode(
  115.         DEROutputStream out)
  116.         throws IOException
  117.     {
  118.         OIDTokenizer            tok = new OIDTokenizer(identifier);
  119.         ByteArrayOutputStream   bOut = new ByteArrayOutputStream();
  120.         DEROutputStream         dOut = new DEROutputStream(bOut);
  121.         writeField(bOut, 
  122.                     Integer.parseInt(tok.nextToken()) * 40
  123.                     + Integer.parseInt(tok.nextToken()));
  124.         while (tok.hasMoreTokens())
  125.         {
  126.             writeField(bOut, Integer.parseInt(tok.nextToken()));
  127.         }
  128.         dOut.close();
  129.         byte[]  bytes = bOut.toByteArray();
  130.         out.writeEncoded(OBJECT_IDENTIFIER, bytes);
  131.     }
  132.     public int hashCode()
  133.     {
  134.         return identifier.hashCode();
  135.     }
  136.     public boolean equals(
  137.         Object  o)
  138.     {
  139.         if ((o == null) || !(o instanceof DERObjectIdentifier))
  140.         {
  141.             return false;
  142.         }
  143.         return identifier.equals(((DERObjectIdentifier)o).identifier);
  144.     }
  145. }