CipherOutputStream.smali
.class public Lorg/spongycastle/crypto/io/CipherOutputStream;
.super Ljava/io/FilterOutputStream;
.source "CipherOutputStream.java"
# instance fields
.field private aeadBlockCipher:Lorg/spongycastle/crypto/modes/AEADBlockCipher;
.field private buf:[B
.field private bufferedBlockCipher:Lorg/spongycastle/crypto/BufferedBlockCipher;
.field private final oneByte:[B
.field private streamCipher:Lorg/spongycastle/crypto/StreamCipher;
# direct methods
.method public constructor <init>(Ljava/io/OutputStream;Lorg/spongycastle/crypto/BufferedBlockCipher;)V
.registers 4
.prologue
.line 39
invoke-direct {p0, p1}, Ljava/io/FilterOutputStream;-><init>(Ljava/io/OutputStream;)V
.line 28
const/4 v0, 0x1
new-array v0, v0, [B
iput-object v0, p0, Lorg/spongycastle/crypto/io/CipherOutputStream;->oneByte:[B
.line 40
iput-object p2, p0, Lorg/spongycastle/crypto/io/CipherOutputStream;->bufferedBlockCipher:Lorg/spongycastle/crypto/BufferedBlockCipher;
.line 41
return-void
.end method
.method public constructor <init>(Ljava/io/OutputStream;Lorg/spongycastle/crypto/StreamCipher;)V
.registers 4
.prologue
.line 51
invoke-direct {p0, p1}, Ljava/io/FilterOutputStream;-><init>(Ljava/io/OutputStream;)V
.line 28
const/4 v0, 0x1
new-array v0, v0, [B
iput-object v0, p0, Lorg/spongycastle/crypto/io/CipherOutputStream;->oneByte:[B
.line 52
iput-object p2, p0, Lorg/spongycastle/crypto/io/CipherOutputStream;->streamCipher:Lorg/spongycastle/crypto/StreamCipher;
.line 53
return-void
.end method
.method public constructor <init>(Ljava/io/OutputStream;Lorg/spongycastle/crypto/modes/AEADBlockCipher;)V
.registers 4
.prologue
.line 60
invoke-direct {p0, p1}, Ljava/io/FilterOutputStream;-><init>(Ljava/io/OutputStream;)V
.line 28
const/4 v0, 0x1
new-array v0, v0, [B
iput-object v0, p0, Lorg/spongycastle/crypto/io/CipherOutputStream;->oneByte:[B
.line 61
iput-object p2, p0, Lorg/spongycastle/crypto/io/CipherOutputStream;->aeadBlockCipher:Lorg/spongycastle/crypto/modes/AEADBlockCipher;
.line 62
return-void
.end method
.method private ensureCapacity(IZ)V
.registers 4
.prologue
.line 157
.line 158
if-eqz p2, :cond_25
.line 160
iget-object v0, p0, Lorg/spongycastle/crypto/io/CipherOutputStream;->bufferedBlockCipher:Lorg/spongycastle/crypto/BufferedBlockCipher;
if-eqz v0, :cond_1a
.line 162
iget-object v0, p0, Lorg/spongycastle/crypto/io/CipherOutputStream;->bufferedBlockCipher:Lorg/spongycastle/crypto/BufferedBlockCipher;
invoke-virtual {v0, p1}, Lorg/spongycastle/crypto/BufferedBlockCipher;->getOutputSize(I)I
move-result p1
.line 181
:cond_c
:goto_c
iget-object v0, p0, Lorg/spongycastle/crypto/io/CipherOutputStream;->buf:[B
if-eqz v0, :cond_15
iget-object v0, p0, Lorg/spongycastle/crypto/io/CipherOutputStream;->buf:[B
array-length v0, v0
if-ge v0, p1, :cond_19
.line 183
:cond_15
new-array v0, p1, [B
iput-object v0, p0, Lorg/spongycastle/crypto/io/CipherOutputStream;->buf:[B
.line 185
:cond_19
return-void
.line 164
:cond_1a
iget-object v0, p0, Lorg/spongycastle/crypto/io/CipherOutputStream;->aeadBlockCipher:Lorg/spongycastle/crypto/modes/AEADBlockCipher;
if-eqz v0, :cond_c
.line 166
iget-object v0, p0, Lorg/spongycastle/crypto/io/CipherOutputStream;->aeadBlockCipher:Lorg/spongycastle/crypto/modes/AEADBlockCipher;
invoke-interface {v0, p1}, Lorg/spongycastle/crypto/modes/AEADBlockCipher;->getOutputSize(I)I
move-result p1
goto :goto_c
.line 171
:cond_25
iget-object v0, p0, Lorg/spongycastle/crypto/io/CipherOutputStream;->bufferedBlockCipher:Lorg/spongycastle/crypto/BufferedBlockCipher;
if-eqz v0, :cond_30
.line 173
iget-object v0, p0, Lorg/spongycastle/crypto/io/CipherOutputStream;->bufferedBlockCipher:Lorg/spongycastle/crypto/BufferedBlockCipher;
invoke-virtual {v0, p1}, Lorg/spongycastle/crypto/BufferedBlockCipher;->getUpdateOutputSize(I)I
move-result p1
goto :goto_c
.line 175
:cond_30
iget-object v0, p0, Lorg/spongycastle/crypto/io/CipherOutputStream;->aeadBlockCipher:Lorg/spongycastle/crypto/modes/AEADBlockCipher;
if-eqz v0, :cond_c
.line 177
iget-object v0, p0, Lorg/spongycastle/crypto/io/CipherOutputStream;->aeadBlockCipher:Lorg/spongycastle/crypto/modes/AEADBlockCipher;
invoke-interface {v0, p1}, Lorg/spongycastle/crypto/modes/AEADBlockCipher;->getUpdateOutputSize(I)I
move-result p1
goto :goto_c
.end method
# virtual methods
.method public close()V
.registers 6
.prologue
const/4 v1, 0x0
.line 226
const/4 v0, 0x1
invoke-direct {p0, v1, v0}, Lorg/spongycastle/crypto/io/CipherOutputStream;->ensureCapacity(IZ)V
.line 227
const/4 v1, 0x0
.line 230
:try_start_6
iget-object v0, p0, Lorg/spongycastle/crypto/io/CipherOutputStream;->bufferedBlockCipher:Lorg/spongycastle/crypto/BufferedBlockCipher;
if-eqz v0, :cond_29
.line 232
iget-object v0, p0, Lorg/spongycastle/crypto/io/CipherOutputStream;->bufferedBlockCipher:Lorg/spongycastle/crypto/BufferedBlockCipher;
iget-object v2, p0, Lorg/spongycastle/crypto/io/CipherOutputStream;->buf:[B
const/4 v3, 0x0
invoke-virtual {v0, v2, v3}, Lorg/spongycastle/crypto/BufferedBlockCipher;->doFinal([BI)I
move-result v0
.line 234
if-eqz v0, :cond_1d
.line 236
iget-object v2, p0, Lorg/spongycastle/crypto/io/CipherOutputStream;->out:Ljava/io/OutputStream;
iget-object v3, p0, Lorg/spongycastle/crypto/io/CipherOutputStream;->buf:[B
const/4 v4, 0x0
invoke-virtual {v2, v3, v4, v0}, Ljava/io/OutputStream;->write([BII)V
:try_end_1d
.catch Lorg/spongycastle/crypto/InvalidCipherTextException; {:try_start_6 .. :try_end_1d} :catch_41
.catch Ljava/lang/Exception; {:try_start_6 .. :try_end_1d} :catch_54
.line 264
:cond_1d
:goto_1d
:try_start_1d
invoke-virtual {p0}, Lorg/spongycastle/crypto/io/CipherOutputStream;->flush()V
.line 265
iget-object v0, p0, Lorg/spongycastle/crypto/io/CipherOutputStream;->out:Ljava/io/OutputStream;
invoke-virtual {v0}, Ljava/io/OutputStream;->close()V
:try_end_25
.catch Ljava/io/IOException; {:try_start_1d .. :try_end_25} :catch_5d
move-object v0, v1
.line 275
:cond_26
:goto_26
if-eqz v0, :cond_62
.line 277
throw v0
.line 239
:cond_29
:try_start_29
iget-object v0, p0, Lorg/spongycastle/crypto/io/CipherOutputStream;->aeadBlockCipher:Lorg/spongycastle/crypto/modes/AEADBlockCipher;
if-eqz v0, :cond_4a
.line 241
iget-object v0, p0, Lorg/spongycastle/crypto/io/CipherOutputStream;->aeadBlockCipher:Lorg/spongycastle/crypto/modes/AEADBlockCipher;
iget-object v2, p0, Lorg/spongycastle/crypto/io/CipherOutputStream;->buf:[B
const/4 v3, 0x0
invoke-interface {v0, v2, v3}, Lorg/spongycastle/crypto/modes/AEADBlockCipher;->doFinal([BI)I
move-result v0
.line 243
if-eqz v0, :cond_1d
.line 245
iget-object v2, p0, Lorg/spongycastle/crypto/io/CipherOutputStream;->out:Ljava/io/OutputStream;
iget-object v3, p0, Lorg/spongycastle/crypto/io/CipherOutputStream;->buf:[B
const/4 v4, 0x0
invoke-virtual {v2, v3, v4, v0}, Ljava/io/OutputStream;->write([BII)V
:try_end_40
.catch Lorg/spongycastle/crypto/InvalidCipherTextException; {:try_start_29 .. :try_end_40} :catch_41
.catch Ljava/lang/Exception; {:try_start_29 .. :try_end_40} :catch_54
goto :goto_1d
.line 253
:catch_41
move-exception v0
.line 255
new-instance v1, Lorg/spongycastle/crypto/io/InvalidCipherTextIOException;
const-string v2, "Error finalising cipher data"
invoke-direct {v1, v2, v0}, Lorg/spongycastle/crypto/io/InvalidCipherTextIOException;-><init>(Ljava/lang/String;Ljava/lang/Throwable;)V
goto :goto_1d
.line 248
:cond_4a
:try_start_4a
iget-object v0, p0, Lorg/spongycastle/crypto/io/CipherOutputStream;->streamCipher:Lorg/spongycastle/crypto/StreamCipher;
if-eqz v0, :cond_1d
.line 250
iget-object v0, p0, Lorg/spongycastle/crypto/io/CipherOutputStream;->streamCipher:Lorg/spongycastle/crypto/StreamCipher;
invoke-interface {v0}, Lorg/spongycastle/crypto/StreamCipher;->reset()V
:try_end_53
.catch Lorg/spongycastle/crypto/InvalidCipherTextException; {:try_start_4a .. :try_end_53} :catch_41
.catch Ljava/lang/Exception; {:try_start_4a .. :try_end_53} :catch_54
goto :goto_1d
.line 257
:catch_54
move-exception v0
.line 259
new-instance v1, Lorg/spongycastle/crypto/io/CipherIOException;
const-string v2, "Error closing stream: "
invoke-direct {v1, v2, v0}, Lorg/spongycastle/crypto/io/CipherIOException;-><init>(Ljava/lang/String;Ljava/lang/Throwable;)V
goto :goto_1d
.line 267
:catch_5d
move-exception v0
.line 270
if-eqz v1, :cond_26
move-object v0, v1
goto :goto_26
.line 279
:cond_62
return-void
.end method
.method public flush()V
.registers 2
.prologue
.line 203
iget-object v0, p0, Lorg/spongycastle/crypto/io/CipherOutputStream;->out:Ljava/io/OutputStream;
invoke-virtual {v0}, Ljava/io/OutputStream;->flush()V
.line 204
return-void
.end method
.method public write(I)V
.registers 5
.prologue
const/4 v2, 0x0
.line 74
iget-object v0, p0, Lorg/spongycastle/crypto/io/CipherOutputStream;->oneByte:[B
int-to-byte v1, p1
aput-byte v1, v0, v2
.line 76
iget-object v0, p0, Lorg/spongycastle/crypto/io/CipherOutputStream;->streamCipher:Lorg/spongycastle/crypto/StreamCipher;
if-eqz v0, :cond_17
.line 78
iget-object v0, p0, Lorg/spongycastle/crypto/io/CipherOutputStream;->out:Ljava/io/OutputStream;
iget-object v1, p0, Lorg/spongycastle/crypto/io/CipherOutputStream;->streamCipher:Lorg/spongycastle/crypto/StreamCipher;
int-to-byte v2, p1
invoke-interface {v1, v2}, Lorg/spongycastle/crypto/StreamCipher;->returnByte(B)B
move-result v1
invoke-virtual {v0, v1}, Ljava/io/OutputStream;->write(I)V
.line 84
:goto_16
return-void
.line 82
:cond_17
iget-object v0, p0, Lorg/spongycastle/crypto/io/CipherOutputStream;->oneByte:[B
const/4 v1, 0x1
invoke-virtual {p0, v0, v2, v1}, Lorg/spongycastle/crypto/io/CipherOutputStream;->write([BII)V
goto :goto_16
.end method
.method public write([B)V
.registers 4
.prologue
.line 103
const/4 v0, 0x0
array-length v1, p1
invoke-virtual {p0, p1, v0, v1}, Lorg/spongycastle/crypto/io/CipherOutputStream;->write([BII)V
.line 104
return-void
.end method
.method public write([BII)V
.registers 10
.prologue
const/4 v5, 0x0
.line 121
invoke-direct {p0, p3, v5}, Lorg/spongycastle/crypto/io/CipherOutputStream;->ensureCapacity(IZ)V
.line 123
iget-object v0, p0, Lorg/spongycastle/crypto/io/CipherOutputStream;->bufferedBlockCipher:Lorg/spongycastle/crypto/BufferedBlockCipher;
if-eqz v0, :cond_1d
.line 125
iget-object v0, p0, Lorg/spongycastle/crypto/io/CipherOutputStream;->bufferedBlockCipher:Lorg/spongycastle/crypto/BufferedBlockCipher;
iget-object v4, p0, Lorg/spongycastle/crypto/io/CipherOutputStream;->buf:[B
move-object v1, p1
move v2, p2
move v3, p3
invoke-virtual/range {v0 .. v5}, Lorg/spongycastle/crypto/BufferedBlockCipher;->processBytes([BII[BI)I
move-result v0
.line 127
if-eqz v0, :cond_1c
.line 129
iget-object v1, p0, Lorg/spongycastle/crypto/io/CipherOutputStream;->out:Ljava/io/OutputStream;
iget-object v2, p0, Lorg/spongycastle/crypto/io/CipherOutputStream;->buf:[B
invoke-virtual {v1, v2, v5, v0}, Ljava/io/OutputStream;->write([BII)V
.line 147
:cond_1c
:goto_1c
return-void
.line 132
:cond_1d
iget-object v0, p0, Lorg/spongycastle/crypto/io/CipherOutputStream;->aeadBlockCipher:Lorg/spongycastle/crypto/modes/AEADBlockCipher;
if-eqz v0, :cond_36
.line 134
iget-object v0, p0, Lorg/spongycastle/crypto/io/CipherOutputStream;->aeadBlockCipher:Lorg/spongycastle/crypto/modes/AEADBlockCipher;
iget-object v4, p0, Lorg/spongycastle/crypto/io/CipherOutputStream;->buf:[B
move-object v1, p1
move v2, p2
move v3, p3
invoke-interface/range {v0 .. v5}, Lorg/spongycastle/crypto/modes/AEADBlockCipher;->processBytes([BII[BI)I
move-result v0
.line 136
if-eqz v0, :cond_1c
.line 138
iget-object v1, p0, Lorg/spongycastle/crypto/io/CipherOutputStream;->out:Ljava/io/OutputStream;
iget-object v2, p0, Lorg/spongycastle/crypto/io/CipherOutputStream;->buf:[B
invoke-virtual {v1, v2, v5, v0}, Ljava/io/OutputStream;->write([BII)V
goto :goto_1c
.line 143
:cond_36
iget-object v0, p0, Lorg/spongycastle/crypto/io/CipherOutputStream;->streamCipher:Lorg/spongycastle/crypto/StreamCipher;
iget-object v4, p0, Lorg/spongycastle/crypto/io/CipherOutputStream;->buf:[B
move-object v1, p1
move v2, p2
move v3, p3
invoke-interface/range {v0 .. v5}, Lorg/spongycastle/crypto/StreamCipher;->processBytes([BII[BI)I
.line 145
iget-object v0, p0, Lorg/spongycastle/crypto/io/CipherOutputStream;->out:Ljava/io/OutputStream;
iget-object v1, p0, Lorg/spongycastle/crypto/io/CipherOutputStream;->buf:[B
invoke-virtual {v0, v1, v5, p3}, Ljava/io/OutputStream;->write([BII)V
goto :goto_1c
.end method