Home | History | Annotate | Download | only in asn1
      1 package org.bouncycastle.asn1;
      2 
      3 import java.io.ByteArrayInputStream;
      4 import java.io.FileInputStream;
      5 import java.io.IOException;
      6 import java.io.InputStream;
      7 import java.nio.channels.FileChannel;
      8 
      9 class StreamUtil
     10 {
     11     // BEGIN android-removed
     12     // private static final long  MAX_MEMORY = Runtime.getRuntime().maxMemory();
     13     // END android-removed
     14 
     15     /**
     16      * Find out possible longest length...
     17      *
     18      * @param in input stream of interest
     19      * @return length calculation or MAX_VALUE.
     20      */
     21     static int findLimit(InputStream in)
     22     {
     23         if (in instanceof LimitedInputStream)
     24         {
     25             return ((LimitedInputStream)in).getRemaining();
     26         }
     27         else if (in instanceof ASN1InputStream)
     28         {
     29             return ((ASN1InputStream)in).getLimit();
     30         }
     31         else if (in instanceof ByteArrayInputStream)
     32         {
     33             return ((ByteArrayInputStream)in).available();
     34         }
     35         else if (in instanceof FileInputStream)
     36         {
     37             try
     38             {
     39                 FileChannel channel = ((FileInputStream)in).getChannel();
     40                 long  size = (channel != null) ? channel.size() : Integer.MAX_VALUE;
     41 
     42                 if (size < Integer.MAX_VALUE)
     43                 {
     44                     return (int)size;
     45                 }
     46             }
     47             catch (IOException e)
     48             {
     49                 // ignore - they'll find out soon enough!
     50             }
     51         }
     52 
     53         // BEGIN android-changed
     54         long maxMemory = Runtime.getRuntime().maxMemory();
     55         if (maxMemory > Integer.MAX_VALUE)
     56         {
     57             return Integer.MAX_VALUE;
     58         }
     59 
     60         return (int) maxMemory;
     61         // END android-changed
     62     }
     63 
     64     static int calculateBodyLength(
     65         int length)
     66     {
     67         int count = 1;
     68 
     69         if (length > 127)
     70         {
     71             int size = 1;
     72             int val = length;
     73 
     74             while ((val >>>= 8) != 0)
     75             {
     76                 size++;
     77             }
     78 
     79             for (int i = (size - 1) * 8; i >= 0; i -= 8)
     80             {
     81                 count++;
     82             }
     83         }
     84 
     85         return count;
     86     }
     87 
     88     static int calculateTagLength(int tagNo)
     89         throws IOException
     90     {
     91         int length = 1;
     92 
     93         if (tagNo >= 31)
     94         {
     95             if (tagNo < 128)
     96             {
     97                 length++;
     98             }
     99             else
    100             {
    101                 byte[] stack = new byte[5];
    102                 int pos = stack.length;
    103 
    104                 stack[--pos] = (byte)(tagNo & 0x7F);
    105 
    106                 do
    107                 {
    108                     tagNo >>= 7;
    109                     stack[--pos] = (byte)(tagNo & 0x7F | 0x80);
    110                 }
    111                 while (tagNo > 127);
    112 
    113                 length += stack.length - pos;
    114             }
    115         }
    116 
    117         return length;
    118     }
    119 }
    120