    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    }