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

CA认证

开发平台:

Java

  1. package org.bouncycastle.asn1;
  2. import java.io.*;
  3. public class DERBitString
  4.     extends DERObject
  5. {
  6.     protected byte[]      data;
  7.     protected int         padBits;
  8.     /**
  9.      * return the correct number of pad bits for a bit string defined in
  10.      * a 16 bit constant
  11.      */
  12.     static protected int getPadBits(
  13.         int bitString)
  14.     {
  15.         int val;
  16.         if (bitString == 0)
  17.         {
  18.             return 7;
  19.         }
  20.         if (bitString > 255)
  21.         {
  22.             val = ((bitString >> 8) & 0xFF);
  23.         }
  24.         else
  25.         {
  26.             val = (bitString & 0xFF);
  27.         }
  28.         int bits = 1;
  29.         while (((val <<= 1) & 0xFF) != 0)
  30.         {
  31.             bits++;
  32.         }
  33.         return 8 - bits;
  34.     }
  35.     /**
  36.      * return the correct number of bytes for a bit string defined in
  37.      * a 16 bit constant
  38.      */
  39.     static protected byte[] getBytes(
  40.         int bitString)
  41.     {
  42.         if (bitString > 255)
  43.         {
  44.             byte[]  bytes = new byte[2];
  45.             bytes[0] = (byte)(bitString & 0xFF);
  46.             bytes[1] = (byte)((bitString >> 8) & 0xFF);
  47.             return bytes;
  48.         }
  49.         else
  50.         {
  51.             byte[]  bytes = new byte[1];
  52.             bytes[0] = (byte)(bitString & 0xFF);
  53.             return bytes;
  54.         }
  55.     }
  56.     /**
  57.      * return a Bit String from the passed in object
  58.      *
  59.      * @exception IllegalArgumentException if the object cannot be converted.
  60.      */
  61.     public static DERBitString getInstance(
  62.         Object  obj)
  63.     {
  64.         if (obj == null || obj instanceof DERBitString)
  65.         {
  66.             return (DERBitString)obj;
  67.         }
  68.         if (obj instanceof ASN1OctetString)
  69.         {
  70.             byte[]  bytes = ((ASN1OctetString)obj).getOctets();
  71.             int     padBits = bytes[0];
  72.             byte[]  data = new byte[bytes.length - 1];
  73.             System.arraycopy(bytes, 1, data, 0, bytes.length - 1);
  74.             return new DERBitString(data, padBits);
  75.         }
  76.         if (obj instanceof ASN1TaggedObject)
  77.         {
  78.             return getInstance(((ASN1TaggedObject)obj).getObject());
  79.         }
  80.         throw new IllegalArgumentException("illegal object in getInstance: " + obj.getClass().getName());
  81.     }
  82.     /**
  83.      * return a Bit String from a tagged object.
  84.      *
  85.      * @param obj the tagged object holding the object we want
  86.      * @param explicit true if the object is meant to be explicitly
  87.      *              tagged false otherwise.
  88.      * @exception IllegalArgumentException if the tagged object cannot
  89.      *               be converted.
  90.      */
  91.     public static DERBitString getInstance(
  92.         ASN1TaggedObject obj,
  93.         boolean          explicit)
  94.     {
  95.         return getInstance(obj.getObject());
  96.     }
  97.     
  98.     protected DERBitString(
  99.         byte    data,
  100.         int     padBits)
  101.     {
  102.         this.data = new byte[1];
  103.         this.data[0] = data;
  104.         this.padBits = padBits;
  105.     }
  106.     /**
  107.      * @param data the octets making up the bit string.
  108.      * @param padBits the number of extra bits at the end of the string.
  109.      */
  110.     public DERBitString(
  111.         byte[]  data,
  112.         int     padBits)
  113.     {
  114.         this.data = data;
  115.         this.padBits = padBits;
  116.     }
  117.     public DERBitString(
  118.         byte[]  data)
  119.     {
  120.         this(data, 0);
  121.     }
  122.     public DERBitString(
  123.         DEREncodable  obj)
  124.     {
  125.         try
  126.         {
  127.             ByteArrayOutputStream   bOut = new ByteArrayOutputStream();
  128.             DEROutputStream         dOut = new DEROutputStream(bOut);
  129.             dOut.writeObject(obj);
  130.             dOut.close();
  131.             this.data = bOut.toByteArray();
  132.             this.padBits = 0;
  133.         }
  134.         catch (IOException e)
  135.         {
  136.             throw new IllegalArgumentException("Error processing object : " + e.toString());
  137.         }
  138.     }
  139.     public byte[] getBytes()
  140.     {
  141.         return data;
  142.     }
  143.     public int getPadBits()
  144.     {
  145.         return padBits;
  146.     }
  147.     void encode(
  148.         DEROutputStream  out)
  149.         throws IOException
  150.     {
  151.         byte[]  bytes = new byte[getBytes().length + 1];
  152.         bytes[0] = (byte)getPadBits();
  153.         System.arraycopy(getBytes(), 0, bytes, 1, bytes.length - 1);
  154.         out.writeEncoded(BIT_STRING, bytes);
  155.     }
  156.     
  157.     public boolean equals(
  158.         Object  o)
  159.     {
  160.         if (o == null || !(o instanceof DERBitString))
  161.         {
  162.             return false;
  163.         }
  164.         DERBitString  other = (DERBitString)o;
  165.         if (data.length != other.data.length)
  166.         {
  167.             return false;
  168.         }
  169.         for (int i = 0; i != data.length; i++)
  170.         {
  171.             if (data[i] != other.data[i])
  172.             {
  173.                 return false;
  174.             }
  175.         }
  176.         return (padBits == other.padBits);
  177.     }
  178. }