StreamUtil.java revision ebe7111e889aaa6efd076e1205f2dd669d6df690
1package org.bouncycastle.asn1;
2
3import java.io.ByteArrayInputStream;
4import java.io.FileInputStream;
5import java.io.IOException;
6import java.io.InputStream;
7import java.nio.channels.FileChannel;
8
9class 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