TlsStreamCipher.smali
.class public Lorg/spongycastle/crypto/tls/TlsStreamCipher;
.super Ljava/lang/Object;
.source "TlsStreamCipher.java"
# interfaces
.implements Lorg/spongycastle/crypto/tls/TlsCipher;
# instance fields
.field protected context:Lorg/spongycastle/crypto/tls/TlsContext;
.field protected decryptCipher:Lorg/spongycastle/crypto/StreamCipher;
.field protected encryptCipher:Lorg/spongycastle/crypto/StreamCipher;
.field protected readMac:Lorg/spongycastle/crypto/tls/TlsMac;
.field protected usesNonce:Z
.field protected writeMac:Lorg/spongycastle/crypto/tls/TlsMac;
# direct methods
.method public constructor <init>(Lorg/spongycastle/crypto/tls/TlsContext;Lorg/spongycastle/crypto/StreamCipher;Lorg/spongycastle/crypto/StreamCipher;Lorg/spongycastle/crypto/Digest;Lorg/spongycastle/crypto/Digest;IZ)V
.registers 22
.prologue
.line 28
invoke-direct {p0}, Ljava/lang/Object;-><init>()V
.line 29
invoke-interface {p1}, Lorg/spongycastle/crypto/tls/TlsContext;->isServer()Z
move-result v11
.line 31
iput-object p1, p0, Lorg/spongycastle/crypto/tls/TlsStreamCipher;->context:Lorg/spongycastle/crypto/tls/TlsContext;
.line 32
move/from16 v0, p7
iput-boolean v0, p0, Lorg/spongycastle/crypto/tls/TlsStreamCipher;->usesNonce:Z
.line 34
move-object/from16 v0, p2
iput-object v0, p0, Lorg/spongycastle/crypto/tls/TlsStreamCipher;->encryptCipher:Lorg/spongycastle/crypto/StreamCipher;
.line 35
move-object/from16 v0, p3
iput-object v0, p0, Lorg/spongycastle/crypto/tls/TlsStreamCipher;->decryptCipher:Lorg/spongycastle/crypto/StreamCipher;
.line 37
mul-int/lit8 v1, p6, 0x2
invoke-interface/range {p4 .. p4}, Lorg/spongycastle/crypto/Digest;->getDigestSize()I
move-result v2
add-int/2addr v1, v2
.line 38
invoke-interface/range {p5 .. p5}, Lorg/spongycastle/crypto/Digest;->getDigestSize()I
move-result v2
add-int v12, v1, v2
.line 40
invoke-static {p1, v12}, Lorg/spongycastle/crypto/tls/TlsUtils;->calculateKeyBlock(Lorg/spongycastle/crypto/tls/TlsContext;I)[B
move-result-object v4
.line 45
new-instance v1, Lorg/spongycastle/crypto/tls/TlsMac;
const/4 v5, 0x0
.line 46
invoke-interface/range {p4 .. p4}, Lorg/spongycastle/crypto/Digest;->getDigestSize()I
move-result v6
move-object v2, p1
move-object/from16 v3, p4
invoke-direct/range {v1 .. v6}, Lorg/spongycastle/crypto/tls/TlsMac;-><init>(Lorg/spongycastle/crypto/tls/TlsContext;Lorg/spongycastle/crypto/Digest;[BII)V
.line 47
invoke-interface/range {p4 .. p4}, Lorg/spongycastle/crypto/Digest;->getDigestSize()I
move-result v2
add-int/lit8 v9, v2, 0x0
.line 48
new-instance v5, Lorg/spongycastle/crypto/tls/TlsMac;
.line 49
invoke-interface/range {p5 .. p5}, Lorg/spongycastle/crypto/Digest;->getDigestSize()I
move-result v10
move-object v6, p1
move-object/from16 v7, p5
move-object v8, v4
invoke-direct/range {v5 .. v10}, Lorg/spongycastle/crypto/tls/TlsMac;-><init>(Lorg/spongycastle/crypto/tls/TlsContext;Lorg/spongycastle/crypto/Digest;[BII)V
.line 50
invoke-interface/range {p5 .. p5}, Lorg/spongycastle/crypto/Digest;->getDigestSize()I
move-result v2
add-int v3, v9, v2
.line 53
new-instance v2, Lorg/spongycastle/crypto/params/KeyParameter;
move/from16 v0, p6
invoke-direct {v2, v4, v3, v0}, Lorg/spongycastle/crypto/params/KeyParameter;-><init>([BII)V
.line 54
add-int v6, v3, p6
.line 55
new-instance v3, Lorg/spongycastle/crypto/params/KeyParameter;
move/from16 v0, p6
invoke-direct {v3, v4, v6, v0}, Lorg/spongycastle/crypto/params/KeyParameter;-><init>([BII)V
.line 56
add-int v4, v6, p6
.line 58
if-eq v4, v12, :cond_68
.line 60
new-instance v1, Lorg/spongycastle/crypto/tls/TlsFatalAlert;
const/16 v2, 0x50
invoke-direct {v1, v2}, Lorg/spongycastle/crypto/tls/TlsFatalAlert;-><init>(S)V
throw v1
.line 64
:cond_68
if-eqz v11, :cond_95
.line 66
iput-object v5, p0, Lorg/spongycastle/crypto/tls/TlsStreamCipher;->writeMac:Lorg/spongycastle/crypto/tls/TlsMac;
.line 67
iput-object v1, p0, Lorg/spongycastle/crypto/tls/TlsStreamCipher;->readMac:Lorg/spongycastle/crypto/tls/TlsMac;
.line 68
move-object/from16 v0, p3
iput-object v0, p0, Lorg/spongycastle/crypto/tls/TlsStreamCipher;->encryptCipher:Lorg/spongycastle/crypto/StreamCipher;
.line 69
move-object/from16 v0, p2
iput-object v0, p0, Lorg/spongycastle/crypto/tls/TlsStreamCipher;->decryptCipher:Lorg/spongycastle/crypto/StreamCipher;
move-object v1, v3
.line 83
:goto_77
if-eqz p7, :cond_a4
.line 85
const/16 v3, 0x8
new-array v4, v3, [B
.line 86
new-instance v3, Lorg/spongycastle/crypto/params/ParametersWithIV;
invoke-direct {v3, v1, v4}, Lorg/spongycastle/crypto/params/ParametersWithIV;-><init>(Lorg/spongycastle/crypto/CipherParameters;[B)V
.line 87
new-instance v1, Lorg/spongycastle/crypto/params/ParametersWithIV;
invoke-direct {v1, v2, v4}, Lorg/spongycastle/crypto/params/ParametersWithIV;-><init>(Lorg/spongycastle/crypto/CipherParameters;[B)V
move-object v2, v3
.line 90
:goto_88
iget-object v3, p0, Lorg/spongycastle/crypto/tls/TlsStreamCipher;->encryptCipher:Lorg/spongycastle/crypto/StreamCipher;
const/4 v4, 0x1
invoke-interface {v3, v4, v2}, Lorg/spongycastle/crypto/StreamCipher;->init(ZLorg/spongycastle/crypto/CipherParameters;)V
.line 91
iget-object v2, p0, Lorg/spongycastle/crypto/tls/TlsStreamCipher;->decryptCipher:Lorg/spongycastle/crypto/StreamCipher;
const/4 v3, 0x0
invoke-interface {v2, v3, v1}, Lorg/spongycastle/crypto/StreamCipher;->init(ZLorg/spongycastle/crypto/CipherParameters;)V
.line 92
return-void
.line 75
:cond_95
iput-object v1, p0, Lorg/spongycastle/crypto/tls/TlsStreamCipher;->writeMac:Lorg/spongycastle/crypto/tls/TlsMac;
.line 76
iput-object v5, p0, Lorg/spongycastle/crypto/tls/TlsStreamCipher;->readMac:Lorg/spongycastle/crypto/tls/TlsMac;
.line 77
move-object/from16 v0, p2
iput-object v0, p0, Lorg/spongycastle/crypto/tls/TlsStreamCipher;->encryptCipher:Lorg/spongycastle/crypto/StreamCipher;
.line 78
move-object/from16 v0, p3
iput-object v0, p0, Lorg/spongycastle/crypto/tls/TlsStreamCipher;->decryptCipher:Lorg/spongycastle/crypto/StreamCipher;
move-object v1, v2
move-object v2, v3
.line 80
goto :goto_77
:cond_a4
move-object v13, v2
move-object v2, v1
move-object v1, v13
goto :goto_88
.end method
# virtual methods
.method protected checkMAC(JS[BII[BII)V
.registers 19
.prologue
.line 153
invoke-static {p4, p5, p6}, Lorg/spongycastle/util/Arrays;->copyOfRange([BII)[B
move-result-object v0
.line 154
iget-object v1, p0, Lorg/spongycastle/crypto/tls/TlsStreamCipher;->readMac:Lorg/spongycastle/crypto/tls/TlsMac;
move-wide v2, p1
move v4, p3
move-object/from16 v5, p7
move/from16 v6, p8
move/from16 v7, p9
invoke-virtual/range {v1 .. v7}, Lorg/spongycastle/crypto/tls/TlsMac;->calculateMac(JS[BII)[B
move-result-object v1
.line 156
invoke-static {v0, v1}, Lorg/spongycastle/util/Arrays;->constantTimeAreEqual([B[B)Z
move-result v0
if-nez v0, :cond_20
.line 158
new-instance v0, Lorg/spongycastle/crypto/tls/TlsFatalAlert;
const/16 v1, 0x14
invoke-direct {v0, v1}, Lorg/spongycastle/crypto/tls/TlsFatalAlert;-><init>(S)V
throw v0
.line 160
:cond_20
return-void
.end method
.method public decodeCiphertext(JS[BII)[B
.registers 20
.prologue
.line 131
iget-boolean v1, p0, Lorg/spongycastle/crypto/tls/TlsStreamCipher;->usesNonce:Z
if-eqz v1, :cond_a
.line 133
iget-object v1, p0, Lorg/spongycastle/crypto/tls/TlsStreamCipher;->decryptCipher:Lorg/spongycastle/crypto/StreamCipher;
const/4 v2, 0x0
invoke-virtual {p0, v1, v2, p1, p2}, Lorg/spongycastle/crypto/tls/TlsStreamCipher;->updateIV(Lorg/spongycastle/crypto/StreamCipher;ZJ)V
.line 136
:cond_a
iget-object v1, p0, Lorg/spongycastle/crypto/tls/TlsStreamCipher;->readMac:Lorg/spongycastle/crypto/tls/TlsMac;
invoke-virtual {v1}, Lorg/spongycastle/crypto/tls/TlsMac;->getSize()I
move-result v1
.line 137
move/from16 v0, p6
if-ge v0, v1, :cond_1c
.line 139
new-instance v1, Lorg/spongycastle/crypto/tls/TlsFatalAlert;
const/16 v2, 0x32
invoke-direct {v1, v2}, Lorg/spongycastle/crypto/tls/TlsFatalAlert;-><init>(S)V
throw v1
.line 142
:cond_1c
sub-int v11, p6, v1
.line 144
move/from16 v0, p6
new-array v5, v0, [B
.line 145
iget-object v1, p0, Lorg/spongycastle/crypto/tls/TlsStreamCipher;->decryptCipher:Lorg/spongycastle/crypto/StreamCipher;
const/4 v6, 0x0
move-object/from16 v2, p4
move/from16 v3, p5
move/from16 v4, p6
invoke-interface/range {v1 .. v6}, Lorg/spongycastle/crypto/StreamCipher;->processBytes([BII[BI)I
.line 146
const/4 v9, 0x0
move-object v1, p0
move-wide v2, p1
move/from16 v4, p3
move v6, v11
move/from16 v7, p6
move-object v8, v5
move v10, v11
invoke-virtual/range {v1 .. v10}, Lorg/spongycastle/crypto/tls/TlsStreamCipher;->checkMAC(JS[BII[BII)V
.line 147
const/4 v1, 0x0
invoke-static {v5, v1, v11}, Lorg/spongycastle/util/Arrays;->copyOfRange([BII)[B
move-result-object v1
return-object v1
.end method
.method public encodePlaintext(JS[BII)[B
.registers 20
.prologue
.line 107
iget-boolean v0, p0, Lorg/spongycastle/crypto/tls/TlsStreamCipher;->usesNonce:Z
if-eqz v0, :cond_a
.line 109
iget-object v0, p0, Lorg/spongycastle/crypto/tls/TlsStreamCipher;->encryptCipher:Lorg/spongycastle/crypto/StreamCipher;
const/4 v1, 0x1
invoke-virtual {p0, v0, v1, p1, p2}, Lorg/spongycastle/crypto/tls/TlsStreamCipher;->updateIV(Lorg/spongycastle/crypto/StreamCipher;ZJ)V
.line 112
:cond_a
iget-object v0, p0, Lorg/spongycastle/crypto/tls/TlsStreamCipher;->writeMac:Lorg/spongycastle/crypto/tls/TlsMac;
invoke-virtual {v0}, Lorg/spongycastle/crypto/tls/TlsMac;->getSize()I
move-result v0
add-int v0, v0, p6
new-array v4, v0, [B
.line 114
iget-object v0, p0, Lorg/spongycastle/crypto/tls/TlsStreamCipher;->encryptCipher:Lorg/spongycastle/crypto/StreamCipher;
const/4 v5, 0x0
move-object/from16 v1, p4
move/from16 v2, p5
move/from16 v3, p6
invoke-interface/range {v0 .. v5}, Lorg/spongycastle/crypto/StreamCipher;->processBytes([BII[BI)I
.line 116
iget-object v5, p0, Lorg/spongycastle/crypto/tls/TlsStreamCipher;->writeMac:Lorg/spongycastle/crypto/tls/TlsMac;
move-wide v6, p1
move/from16 v8, p3
move-object/from16 v9, p4
move/from16 v10, p5
move/from16 v11, p6
invoke-virtual/range {v5 .. v11}, Lorg/spongycastle/crypto/tls/TlsMac;->calculateMac(JS[BII)[B
move-result-object v1
.line 117
iget-object v0, p0, Lorg/spongycastle/crypto/tls/TlsStreamCipher;->encryptCipher:Lorg/spongycastle/crypto/StreamCipher;
const/4 v2, 0x0
array-length v3, v1
move/from16 v5, p6
invoke-interface/range {v0 .. v5}, Lorg/spongycastle/crypto/StreamCipher;->processBytes([BII[BI)I
.line 119
return-object v4
.end method
.method public getPlaintextLimit(I)I
.registers 3
.prologue
.line 96
iget-object v0, p0, Lorg/spongycastle/crypto/tls/TlsStreamCipher;->writeMac:Lorg/spongycastle/crypto/tls/TlsMac;
invoke-virtual {v0}, Lorg/spongycastle/crypto/tls/TlsMac;->getSize()I
move-result v0
sub-int v0, p1, v0
return v0
.end method
.method protected updateIV(Lorg/spongycastle/crypto/StreamCipher;ZJ)V
.registers 8
.prologue
.line 164
const/16 v0, 0x8
new-array v0, v0, [B
.line 165
const/4 v1, 0x0
invoke-static {p3, p4, v0, v1}, Lorg/spongycastle/crypto/tls/TlsUtils;->writeUint64(J[BI)V
.line 166
new-instance v1, Lorg/spongycastle/crypto/params/ParametersWithIV;
const/4 v2, 0x0
invoke-direct {v1, v2, v0}, Lorg/spongycastle/crypto/params/ParametersWithIV;-><init>(Lorg/spongycastle/crypto/CipherParameters;[B)V
invoke-interface {p1, p2, v1}, Lorg/spongycastle/crypto/StreamCipher;->init(ZLorg/spongycastle/crypto/CipherParameters;)V
.line 167
return-void
.end method