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

CA认证

开发平台:

Java

  1. package org.bouncycastle.asn1;
  2. import java.io.*;
  3. import java.util.*;
  4. public class BERConstructedOctetString
  5.     extends DEROctetString
  6. {
  7.     /**
  8.      * convert a vector of octet strings into a single byte string
  9.      */
  10.     static private byte[] toBytes(
  11.         Vector  octs)
  12.     {
  13.         ByteArrayOutputStream   bOut = new ByteArrayOutputStream();
  14.         for (int i = 0; i != octs.size(); i++)
  15.         {
  16.             DEROctetString  o = (DEROctetString)octs.elementAt(i);
  17.             try
  18.             {
  19.                 bOut.write(o.getOctets());
  20.             }
  21.             catch (IOException e)
  22.             {
  23.                 throw new RuntimeException("exception converting octets " + e.toString());
  24.             }
  25.         }
  26.         return bOut.toByteArray();
  27.     }
  28.     private Vector  octs;
  29.     /**
  30.      * @param string the octets making up the octet string.
  31.      */
  32.     public BERConstructedOctetString(
  33.         byte[]  string)
  34.     {
  35. super(string);
  36.     }
  37.     public BERConstructedOctetString(
  38.         Vector  octs)
  39.     {
  40. super(toBytes(octs));
  41.         this.octs = octs;
  42.     }
  43.     public BERConstructedOctetString(
  44.         DERObject  obj)
  45.     {
  46. super(obj);
  47.     }
  48.     public BERConstructedOctetString(
  49.         DEREncodable  obj)
  50.     {
  51.         super(obj.getDERObject());
  52.     }
  53.     public byte[] getOctets()
  54.     {
  55.         return string;
  56.     }
  57.     /**
  58.      * return the DER octets that make up this string.
  59.      */
  60.     public Enumeration getObjects()
  61.     {
  62.         if (octs == null)
  63.         {
  64.             octs = generateOcts();
  65.         }
  66.         return octs.elements();
  67.     }
  68.     private Vector generateOcts()
  69.     {
  70.         int     start = 0;
  71.         int     end = 0;
  72.         Vector  vec = new Vector();
  73.         while ((end + 1) < string.length)
  74.         {
  75.             if (string[end] == 0 && string[end + 1] == 0)
  76.             {
  77.                 byte[]  nStr = new byte[end - start + 1];
  78.                 for (int i = 0; i != nStr.length; i++)
  79.                 {
  80.                     nStr[i] = string[start + i];
  81.                 }
  82.                 vec.addElement(new DEROctetString(nStr));
  83.                 start = end + 1;
  84.             }
  85.             end++;
  86.         }
  87.         byte[]  nStr = new byte[string.length - start];
  88.         for (int i = 0; i != nStr.length; i++)
  89.         {
  90.             nStr[i] = string[start + i];
  91.         }
  92.         vec.addElement(new DEROctetString(nStr));
  93.         return vec;
  94.     }
  95.     public void encode(
  96.         DEROutputStream out)
  97.         throws IOException
  98.     {
  99.         if (out instanceof ASN1OutputStream || out instanceof BEROutputStream)
  100.         {
  101.             out.write(CONSTRUCTED | OCTET_STRING);
  102.             out.write(0x80);
  103.             if (octs == null)
  104.             {
  105.                 octs = generateOcts();
  106.             }
  107.             for (int i = 0; i != octs.size(); i++)
  108.             {
  109.                 out.writeObject(octs.elementAt(i));
  110.             }
  111.             out.write(0x00);
  112.             out.write(0x00);
  113.         }
  114.         else
  115.         {
  116.             super.encode(out);
  117.         }
  118.     }
  119. }