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 */ findLimit(InputStream in)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 calculateBodyLength( int length)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 calculateTagLength(int tagNo)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