001    package org.bouncycastle.crypto.io;
002    
003    import java.io.FilterInputStream;
004    import java.io.IOException;
005    import java.io.InputStream;
006    import org.bouncycastle.crypto.BufferedBlockCipher;
007    import org.bouncycastle.crypto.StreamCipher;
008    
009    public class CipherInputStream extends FilterInputStream
010    {
011        private BufferedBlockCipher field_74859_a;
012        private StreamCipher field_74857_b;
013        private byte[] field_74858_c;
014        private byte[] field_74855_d;
015        private int field_74856_e;
016        private int field_74853_f;
017        private boolean field_74854_g;
018    
019        public CipherInputStream(InputStream par1InputStream, BufferedBlockCipher par2BufferedBlockCipher)
020        {
021            super(par1InputStream);
022            this.field_74859_a = par2BufferedBlockCipher;
023            this.field_74858_c = new byte[par2BufferedBlockCipher.func_71789_b(2048)];
024            this.field_74855_d = new byte[2048];
025        }
026    
027        private int func_74852_a() throws IOException
028        {
029            int var1 = super.available();
030    
031            if (var1 <= 0)
032            {
033                var1 = 1;
034            }
035    
036            if (var1 > this.field_74855_d.length)
037            {
038                var1 = super.read(this.field_74855_d, 0, this.field_74855_d.length);
039            }
040            else
041            {
042                var1 = super.read(this.field_74855_d, 0, var1);
043            }
044    
045            if (var1 < 0)
046            {
047                if (this.field_74854_g)
048                {
049                    return -1;
050                }
051    
052                try
053                {
054                    if (this.field_74859_a != null)
055                    {
056                        this.field_74853_f = this.field_74859_a.func_71790_a(this.field_74858_c, 0);
057                    }
058                    else
059                    {
060                        this.field_74853_f = 0;
061                    }
062                }
063                catch (Exception var4)
064                {
065                    throw new IOException("error processing stream: " + var4.toString());
066                }
067    
068                this.field_74856_e = 0;
069                this.field_74854_g = true;
070    
071                if (this.field_74856_e == this.field_74853_f)
072                {
073                    return -1;
074                }
075            }
076            else
077            {
078                this.field_74856_e = 0;
079    
080                try
081                {
082                    if (this.field_74859_a != null)
083                    {
084                        this.field_74853_f = this.field_74859_a.func_71791_a(this.field_74855_d, 0, var1, this.field_74858_c, 0);
085                    }
086                    else
087                    {
088                        this.field_74857_b.func_74850_a(this.field_74855_d, 0, var1, this.field_74858_c, 0);
089                        this.field_74853_f = var1;
090                    }
091                }
092                catch (Exception var3)
093                {
094                    throw new IOException("error processing stream: " + var3.toString());
095                }
096    
097                if (this.field_74853_f == 0)
098                {
099                    return this.func_74852_a();
100                }
101            }
102    
103            return this.field_74853_f;
104        }
105    
106        public int read() throws IOException
107        {
108            return this.field_74856_e == this.field_74853_f && this.func_74852_a() < 0 ? -1 : this.field_74858_c[this.field_74856_e++] & 255;
109        }
110    
111        public int read(byte[] par1ArrayOfByte) throws IOException
112        {
113            return this.read(par1ArrayOfByte, 0, par1ArrayOfByte.length);
114        }
115    
116        public int read(byte[] par1ArrayOfByte, int par2, int par3) throws IOException
117        {
118            if (this.field_74856_e == this.field_74853_f && this.func_74852_a() < 0)
119            {
120                return -1;
121            }
122            else
123            {
124                int var4 = this.field_74853_f - this.field_74856_e;
125    
126                if (par3 > var4)
127                {
128                    System.arraycopy(this.field_74858_c, this.field_74856_e, par1ArrayOfByte, par2, var4);
129                    this.field_74856_e = this.field_74853_f;
130                    return var4;
131                }
132                else
133                {
134                    System.arraycopy(this.field_74858_c, this.field_74856_e, par1ArrayOfByte, par2, par3);
135                    this.field_74856_e += par3;
136                    return par3;
137                }
138            }
139        }
140    
141        public long skip(long par1) throws IOException
142        {
143            if (par1 <= 0L)
144            {
145                return 0L;
146            }
147            else
148            {
149                int var3 = this.field_74853_f - this.field_74856_e;
150    
151                if (par1 > (long)var3)
152                {
153                    this.field_74856_e = this.field_74853_f;
154                    return (long)var3;
155                }
156                else
157                {
158                    this.field_74856_e += (int)par1;
159                    return (long)((int)par1);
160                }
161            }
162        }
163    
164        public int available() throws IOException
165        {
166            return this.field_74853_f - this.field_74856_e;
167        }
168    
169        public void close() throws IOException
170        {
171            super.close();
172        }
173    
174        public boolean markSupported()
175        {
176            return false;
177        }
178    }