TlsClientProtocol.smali
.class public Lorg/spongycastle/crypto/tls/TlsClientProtocol;
.super Lorg/spongycastle/crypto/tls/TlsProtocol;
.source "TlsClientProtocol.java"
# instance fields
.field protected authentication:Lorg/spongycastle/crypto/tls/TlsAuthentication;
.field protected certificateRequest:Lorg/spongycastle/crypto/tls/CertificateRequest;
.field protected certificateStatus:Lorg/spongycastle/crypto/tls/CertificateStatus;
.field protected keyExchange:Lorg/spongycastle/crypto/tls/TlsKeyExchange;
.field protected selectedSessionID:[B
.field protected tlsClient:Lorg/spongycastle/crypto/tls/TlsClient;
.field tlsClientContext:Lorg/spongycastle/crypto/tls/TlsClientContextImpl;
# direct methods
.method public constructor <init>(Ljava/io/InputStream;Ljava/io/OutputStream;Ljava/security/SecureRandom;)V
.registers 5
.prologue
const/4 v0, 0x0
.line 36
invoke-direct {p0, p1, p2, p3}, Lorg/spongycastle/crypto/tls/TlsProtocol;-><init>(Ljava/io/InputStream;Ljava/io/OutputStream;Ljava/security/SecureRandom;)V
.line 17
iput-object v0, p0, Lorg/spongycastle/crypto/tls/TlsClientProtocol;->tlsClient:Lorg/spongycastle/crypto/tls/TlsClient;
.line 18
iput-object v0, p0, Lorg/spongycastle/crypto/tls/TlsClientProtocol;->tlsClientContext:Lorg/spongycastle/crypto/tls/TlsClientContextImpl;
.line 20
iput-object v0, p0, Lorg/spongycastle/crypto/tls/TlsClientProtocol;->selectedSessionID:[B
.line 22
iput-object v0, p0, Lorg/spongycastle/crypto/tls/TlsClientProtocol;->keyExchange:Lorg/spongycastle/crypto/tls/TlsKeyExchange;
.line 23
iput-object v0, p0, Lorg/spongycastle/crypto/tls/TlsClientProtocol;->authentication:Lorg/spongycastle/crypto/tls/TlsAuthentication;
.line 25
iput-object v0, p0, Lorg/spongycastle/crypto/tls/TlsClientProtocol;->certificateStatus:Lorg/spongycastle/crypto/tls/CertificateStatus;
.line 26
iput-object v0, p0, Lorg/spongycastle/crypto/tls/TlsClientProtocol;->certificateRequest:Lorg/spongycastle/crypto/tls/CertificateRequest;
.line 37
return-void
.end method
.method public constructor <init>(Ljava/security/SecureRandom;)V
.registers 3
.prologue
const/4 v0, 0x0
.line 56
invoke-direct {p0, p1}, Lorg/spongycastle/crypto/tls/TlsProtocol;-><init>(Ljava/security/SecureRandom;)V
.line 17
iput-object v0, p0, Lorg/spongycastle/crypto/tls/TlsClientProtocol;->tlsClient:Lorg/spongycastle/crypto/tls/TlsClient;
.line 18
iput-object v0, p0, Lorg/spongycastle/crypto/tls/TlsClientProtocol;->tlsClientContext:Lorg/spongycastle/crypto/tls/TlsClientContextImpl;
.line 20
iput-object v0, p0, Lorg/spongycastle/crypto/tls/TlsClientProtocol;->selectedSessionID:[B
.line 22
iput-object v0, p0, Lorg/spongycastle/crypto/tls/TlsClientProtocol;->keyExchange:Lorg/spongycastle/crypto/tls/TlsKeyExchange;
.line 23
iput-object v0, p0, Lorg/spongycastle/crypto/tls/TlsClientProtocol;->authentication:Lorg/spongycastle/crypto/tls/TlsAuthentication;
.line 25
iput-object v0, p0, Lorg/spongycastle/crypto/tls/TlsClientProtocol;->certificateStatus:Lorg/spongycastle/crypto/tls/CertificateStatus;
.line 26
iput-object v0, p0, Lorg/spongycastle/crypto/tls/TlsClientProtocol;->certificateRequest:Lorg/spongycastle/crypto/tls/CertificateRequest;
.line 57
return-void
.end method
# virtual methods
.method protected cleanupHandshake()V
.registers 2
.prologue
const/4 v0, 0x0
.line 112
invoke-super {p0}, Lorg/spongycastle/crypto/tls/TlsProtocol;->cleanupHandshake()V
.line 114
iput-object v0, p0, Lorg/spongycastle/crypto/tls/TlsClientProtocol;->selectedSessionID:[B
.line 115
iput-object v0, p0, Lorg/spongycastle/crypto/tls/TlsClientProtocol;->keyExchange:Lorg/spongycastle/crypto/tls/TlsKeyExchange;
.line 116
iput-object v0, p0, Lorg/spongycastle/crypto/tls/TlsClientProtocol;->authentication:Lorg/spongycastle/crypto/tls/TlsAuthentication;
.line 117
iput-object v0, p0, Lorg/spongycastle/crypto/tls/TlsClientProtocol;->certificateStatus:Lorg/spongycastle/crypto/tls/CertificateStatus;
.line 118
iput-object v0, p0, Lorg/spongycastle/crypto/tls/TlsClientProtocol;->certificateRequest:Lorg/spongycastle/crypto/tls/CertificateRequest;
.line 119
return-void
.end method
.method public connect(Lorg/spongycastle/crypto/tls/TlsClient;)V
.registers 6
.prologue
const/4 v3, 0x1
.line 71
if-nez p1, :cond_b
.line 73
new-instance v0, Ljava/lang/IllegalArgumentException;
const-string v1, "\'tlsClient\' cannot be null"
invoke-direct {v0, v1}, Ljava/lang/IllegalArgumentException;-><init>(Ljava/lang/String;)V
throw v0
.line 75
:cond_b
iget-object v0, p0, Lorg/spongycastle/crypto/tls/TlsClientProtocol;->tlsClient:Lorg/spongycastle/crypto/tls/TlsClient;
if-eqz v0, :cond_17
.line 77
new-instance v0, Ljava/lang/IllegalStateException;
const-string v1, "\'connect\' can only be called once"
invoke-direct {v0, v1}, Ljava/lang/IllegalStateException;-><init>(Ljava/lang/String;)V
throw v0
.line 80
:cond_17
iput-object p1, p0, Lorg/spongycastle/crypto/tls/TlsClientProtocol;->tlsClient:Lorg/spongycastle/crypto/tls/TlsClient;
.line 82
new-instance v0, Lorg/spongycastle/crypto/tls/SecurityParameters;
invoke-direct {v0}, Lorg/spongycastle/crypto/tls/SecurityParameters;-><init>()V
iput-object v0, p0, Lorg/spongycastle/crypto/tls/TlsClientProtocol;->securityParameters:Lorg/spongycastle/crypto/tls/SecurityParameters;
.line 83
iget-object v0, p0, Lorg/spongycastle/crypto/tls/TlsClientProtocol;->securityParameters:Lorg/spongycastle/crypto/tls/SecurityParameters;
iput v3, v0, Lorg/spongycastle/crypto/tls/SecurityParameters;->entity:I
.line 85
new-instance v0, Lorg/spongycastle/crypto/tls/TlsClientContextImpl;
iget-object v1, p0, Lorg/spongycastle/crypto/tls/TlsClientProtocol;->secureRandom:Ljava/security/SecureRandom;
iget-object v2, p0, Lorg/spongycastle/crypto/tls/TlsClientProtocol;->securityParameters:Lorg/spongycastle/crypto/tls/SecurityParameters;
invoke-direct {v0, v1, v2}, Lorg/spongycastle/crypto/tls/TlsClientContextImpl;-><init>(Ljava/security/SecureRandom;Lorg/spongycastle/crypto/tls/SecurityParameters;)V
iput-object v0, p0, Lorg/spongycastle/crypto/tls/TlsClientProtocol;->tlsClientContext:Lorg/spongycastle/crypto/tls/TlsClientContextImpl;
.line 87
iget-object v0, p0, Lorg/spongycastle/crypto/tls/TlsClientProtocol;->securityParameters:Lorg/spongycastle/crypto/tls/SecurityParameters;
invoke-interface {p1}, Lorg/spongycastle/crypto/tls/TlsClient;->shouldUseGMTUnixTime()Z
move-result v1
iget-object v2, p0, Lorg/spongycastle/crypto/tls/TlsClientProtocol;->tlsClientContext:Lorg/spongycastle/crypto/tls/TlsClientContextImpl;
.line 88
invoke-virtual {v2}, Lorg/spongycastle/crypto/tls/TlsClientContextImpl;->getNonceRandomGenerator()Lorg/spongycastle/crypto/prng/RandomGenerator;
move-result-object v2
.line 87
invoke-static {v1, v2}, Lorg/spongycastle/crypto/tls/TlsClientProtocol;->createRandomBlock(ZLorg/spongycastle/crypto/prng/RandomGenerator;)[B
move-result-object v1
iput-object v1, v0, Lorg/spongycastle/crypto/tls/SecurityParameters;->clientRandom:[B
.line 90
iget-object v0, p0, Lorg/spongycastle/crypto/tls/TlsClientProtocol;->tlsClient:Lorg/spongycastle/crypto/tls/TlsClient;
iget-object v1, p0, Lorg/spongycastle/crypto/tls/TlsClientProtocol;->tlsClientContext:Lorg/spongycastle/crypto/tls/TlsClientContextImpl;
invoke-interface {v0, v1}, Lorg/spongycastle/crypto/tls/TlsClient;->init(Lorg/spongycastle/crypto/tls/TlsClientContext;)V
.line 91
iget-object v0, p0, Lorg/spongycastle/crypto/tls/TlsClientProtocol;->recordStream:Lorg/spongycastle/crypto/tls/RecordStream;
iget-object v1, p0, Lorg/spongycastle/crypto/tls/TlsClientProtocol;->tlsClientContext:Lorg/spongycastle/crypto/tls/TlsClientContextImpl;
invoke-virtual {v0, v1}, Lorg/spongycastle/crypto/tls/RecordStream;->init(Lorg/spongycastle/crypto/tls/TlsContext;)V
.line 93
invoke-interface {p1}, Lorg/spongycastle/crypto/tls/TlsClient;->getSessionToResume()Lorg/spongycastle/crypto/tls/TlsSession;
move-result-object v0
.line 94
if-eqz v0, :cond_65
invoke-interface {v0}, Lorg/spongycastle/crypto/tls/TlsSession;->isResumable()Z
move-result v1
if-eqz v1, :cond_65
.line 96
invoke-interface {v0}, Lorg/spongycastle/crypto/tls/TlsSession;->exportSessionParameters()Lorg/spongycastle/crypto/tls/SessionParameters;
move-result-object v1
.line 97
if-eqz v1, :cond_65
.line 99
iput-object v0, p0, Lorg/spongycastle/crypto/tls/TlsClientProtocol;->tlsSession:Lorg/spongycastle/crypto/tls/TlsSession;
.line 100
iput-object v1, p0, Lorg/spongycastle/crypto/tls/TlsClientProtocol;->sessionParameters:Lorg/spongycastle/crypto/tls/SessionParameters;
.line 104
:cond_65
invoke-virtual {p0}, Lorg/spongycastle/crypto/tls/TlsClientProtocol;->sendClientHelloMessage()V
.line 105
iput-short v3, p0, Lorg/spongycastle/crypto/tls/TlsClientProtocol;->connection_state:S
.line 107
invoke-virtual {p0}, Lorg/spongycastle/crypto/tls/TlsClientProtocol;->blockForHandshake()V
.line 108
return-void
.end method
.method protected getContext()Lorg/spongycastle/crypto/tls/TlsContext;
.registers 2
.prologue
.line 123
iget-object v0, p0, Lorg/spongycastle/crypto/tls/TlsClientProtocol;->tlsClientContext:Lorg/spongycastle/crypto/tls/TlsClientContextImpl;
return-object v0
.end method
.method getContextAdmin()Lorg/spongycastle/crypto/tls/AbstractTlsContext;
.registers 2
.prologue
.line 128
iget-object v0, p0, Lorg/spongycastle/crypto/tls/TlsClientProtocol;->tlsClientContext:Lorg/spongycastle/crypto/tls/TlsClientContextImpl;
return-object v0
.end method
.method protected getPeer()Lorg/spongycastle/crypto/tls/TlsPeer;
.registers 2
.prologue
.line 133
iget-object v0, p0, Lorg/spongycastle/crypto/tls/TlsClientProtocol;->tlsClient:Lorg/spongycastle/crypto/tls/TlsClient;
return-object v0
.end method
.method protected handleHandshakeMessage(S[B)V
.registers 10
.prologue
const/16 v6, 0xd
const/4 v5, 0x2
const/16 v4, 0x10
const/4 v1, 0x0
const/16 v3, 0xa
.line 139
new-instance v0, Ljava/io/ByteArrayInputStream;
invoke-direct {v0, p2}, Ljava/io/ByteArrayInputStream;-><init>([B)V
.line 141
iget-boolean v2, p0, Lorg/spongycastle/crypto/tls/TlsClientProtocol;->resumedSession:Z
if-eqz v2, :cond_31
.line 143
const/16 v1, 0x14
if-ne p1, v1, :cond_19
iget-short v1, p0, Lorg/spongycastle/crypto/tls/TlsClientProtocol;->connection_state:S
if-eq v1, v5, :cond_1f
.line 145
:cond_19
new-instance v0, Lorg/spongycastle/crypto/tls/TlsFatalAlert;
invoke-direct {v0, v3}, Lorg/spongycastle/crypto/tls/TlsFatalAlert;-><init>(S)V
throw v0
.line 148
:cond_1f
invoke-virtual {p0, v0}, Lorg/spongycastle/crypto/tls/TlsClientProtocol;->processFinishedMessage(Ljava/io/ByteArrayInputStream;)V
.line 149
const/16 v0, 0xf
iput-short v0, p0, Lorg/spongycastle/crypto/tls/TlsClientProtocol;->connection_state:S
.line 151
invoke-virtual {p0}, Lorg/spongycastle/crypto/tls/TlsClientProtocol;->sendFinishedMessage()V
.line 152
iput-short v6, p0, Lorg/spongycastle/crypto/tls/TlsClientProtocol;->connection_state:S
.line 153
iput-short v4, p0, Lorg/spongycastle/crypto/tls/TlsClientProtocol;->connection_state:S
.line 155
invoke-virtual {p0}, Lorg/spongycastle/crypto/tls/TlsClientProtocol;->completeHandshake()V
.line 564
:cond_30
:goto_30
return-void
.line 159
:cond_31
packed-switch p1, :pswitch_data_29a
.line 562
:pswitch_34
new-instance v0, Lorg/spongycastle/crypto/tls/TlsFatalAlert;
invoke-direct {v0, v3}, Lorg/spongycastle/crypto/tls/TlsFatalAlert;-><init>(S)V
throw v0
.line 163
:pswitch_3a
iget-short v2, p0, Lorg/spongycastle/crypto/tls/TlsClientProtocol;->connection_state:S
packed-switch v2, :pswitch_data_2ce
.line 192
new-instance v0, Lorg/spongycastle/crypto/tls/TlsFatalAlert;
invoke-direct {v0, v3}, Lorg/spongycastle/crypto/tls/TlsFatalAlert;-><init>(S)V
throw v0
.line 167
:pswitch_45
invoke-virtual {p0, v1}, Lorg/spongycastle/crypto/tls/TlsClientProtocol;->handleSupplementalData(Ljava/util/Vector;)V
.line 174
:pswitch_48
invoke-static {v0}, Lorg/spongycastle/crypto/tls/Certificate;->parse(Ljava/io/InputStream;)Lorg/spongycastle/crypto/tls/Certificate;
move-result-object v1
iput-object v1, p0, Lorg/spongycastle/crypto/tls/TlsClientProtocol;->peerCertificate:Lorg/spongycastle/crypto/tls/Certificate;
.line 176
invoke-static {v0}, Lorg/spongycastle/crypto/tls/TlsClientProtocol;->assertEmpty(Ljava/io/ByteArrayInputStream;)V
.line 179
iget-object v0, p0, Lorg/spongycastle/crypto/tls/TlsClientProtocol;->peerCertificate:Lorg/spongycastle/crypto/tls/Certificate;
if-eqz v0, :cond_5d
iget-object v0, p0, Lorg/spongycastle/crypto/tls/TlsClientProtocol;->peerCertificate:Lorg/spongycastle/crypto/tls/Certificate;
invoke-virtual {v0}, Lorg/spongycastle/crypto/tls/Certificate;->isEmpty()Z
move-result v0
if-eqz v0, :cond_60
.line 181
:cond_5d
const/4 v0, 0x0
iput-boolean v0, p0, Lorg/spongycastle/crypto/tls/TlsClientProtocol;->allowCertificateStatus:Z
.line 184
:cond_60
iget-object v0, p0, Lorg/spongycastle/crypto/tls/TlsClientProtocol;->keyExchange:Lorg/spongycastle/crypto/tls/TlsKeyExchange;
iget-object v1, p0, Lorg/spongycastle/crypto/tls/TlsClientProtocol;->peerCertificate:Lorg/spongycastle/crypto/tls/Certificate;
invoke-interface {v0, v1}, Lorg/spongycastle/crypto/tls/TlsKeyExchange;->processServerCertificate(Lorg/spongycastle/crypto/tls/Certificate;)V
.line 186
iget-object v0, p0, Lorg/spongycastle/crypto/tls/TlsClientProtocol;->tlsClient:Lorg/spongycastle/crypto/tls/TlsClient;
invoke-interface {v0}, Lorg/spongycastle/crypto/tls/TlsClient;->getAuthentication()Lorg/spongycastle/crypto/tls/TlsAuthentication;
move-result-object v0
iput-object v0, p0, Lorg/spongycastle/crypto/tls/TlsClientProtocol;->authentication:Lorg/spongycastle/crypto/tls/TlsAuthentication;
.line 187
iget-object v0, p0, Lorg/spongycastle/crypto/tls/TlsClientProtocol;->authentication:Lorg/spongycastle/crypto/tls/TlsAuthentication;
iget-object v1, p0, Lorg/spongycastle/crypto/tls/TlsClientProtocol;->peerCertificate:Lorg/spongycastle/crypto/tls/Certificate;
invoke-interface {v0, v1}, Lorg/spongycastle/crypto/tls/TlsAuthentication;->notifyServerCertificate(Lorg/spongycastle/crypto/tls/Certificate;)V
.line 195
const/4 v0, 0x4
iput-short v0, p0, Lorg/spongycastle/crypto/tls/TlsClientProtocol;->connection_state:S
goto :goto_30
.line 200
:pswitch_7a
iget-short v1, p0, Lorg/spongycastle/crypto/tls/TlsClientProtocol;->connection_state:S
packed-switch v1, :pswitch_data_2d6
.line 224
new-instance v0, Lorg/spongycastle/crypto/tls/TlsFatalAlert;
invoke-direct {v0, v3}, Lorg/spongycastle/crypto/tls/TlsFatalAlert;-><init>(S)V
throw v0
.line 204
:pswitch_85
iget-boolean v1, p0, Lorg/spongycastle/crypto/tls/TlsClientProtocol;->allowCertificateStatus:Z
if-nez v1, :cond_8f
.line 211
new-instance v0, Lorg/spongycastle/crypto/tls/TlsFatalAlert;
invoke-direct {v0, v3}, Lorg/spongycastle/crypto/tls/TlsFatalAlert;-><init>(S)V
throw v0
.line 214
:cond_8f
invoke-static {v0}, Lorg/spongycastle/crypto/tls/CertificateStatus;->parse(Ljava/io/InputStream;)Lorg/spongycastle/crypto/tls/CertificateStatus;
move-result-object v1
iput-object v1, p0, Lorg/spongycastle/crypto/tls/TlsClientProtocol;->certificateStatus:Lorg/spongycastle/crypto/tls/CertificateStatus;
.line 216
invoke-static {v0}, Lorg/spongycastle/crypto/tls/TlsClientProtocol;->assertEmpty(Ljava/io/ByteArrayInputStream;)V
.line 220
const/4 v0, 0x5
iput-short v0, p0, Lorg/spongycastle/crypto/tls/TlsClientProtocol;->connection_state:S
goto :goto_30
.line 230
:pswitch_9c
iget-short v1, p0, Lorg/spongycastle/crypto/tls/TlsClientProtocol;->connection_state:S
packed-switch v1, :pswitch_data_2dc
.line 255
new-instance v0, Lorg/spongycastle/crypto/tls/TlsFatalAlert;
invoke-direct {v0, v3}, Lorg/spongycastle/crypto/tls/TlsFatalAlert;-><init>(S)V
throw v0
.line 234
:pswitch_a7
iget-boolean v1, p0, Lorg/spongycastle/crypto/tls/TlsClientProtocol;->expectSessionTicket:Z
if-eqz v1, :cond_b1
.line 240
new-instance v0, Lorg/spongycastle/crypto/tls/TlsFatalAlert;
invoke-direct {v0, v3}, Lorg/spongycastle/crypto/tls/TlsFatalAlert;-><init>(S)V
throw v0
.line 247
:cond_b1
:pswitch_b1
invoke-virtual {p0, v0}, Lorg/spongycastle/crypto/tls/TlsClientProtocol;->processFinishedMessage(Ljava/io/ByteArrayInputStream;)V
.line 248
const/16 v0, 0xf
iput-short v0, p0, Lorg/spongycastle/crypto/tls/TlsClientProtocol;->connection_state:S
.line 249
iput-short v4, p0, Lorg/spongycastle/crypto/tls/TlsClientProtocol;->connection_state:S
.line 251
invoke-virtual {p0}, Lorg/spongycastle/crypto/tls/TlsClientProtocol;->completeHandshake()V
goto/16 :goto_30
.line 261
:pswitch_bf
iget-short v2, p0, Lorg/spongycastle/crypto/tls/TlsClientProtocol;->connection_state:S
packed-switch v2, :pswitch_data_2e4
.line 292
new-instance v0, Lorg/spongycastle/crypto/tls/TlsFatalAlert;
invoke-direct {v0, v3}, Lorg/spongycastle/crypto/tls/TlsFatalAlert;-><init>(S)V
throw v0
.line 265
:pswitch_ca
invoke-virtual {p0, v0}, Lorg/spongycastle/crypto/tls/TlsClientProtocol;->receiveServerHelloMessage(Ljava/io/ByteArrayInputStream;)V
.line 266
iput-short v5, p0, Lorg/spongycastle/crypto/tls/TlsClientProtocol;->connection_state:S
.line 268
iget-object v0, p0, Lorg/spongycastle/crypto/tls/TlsClientProtocol;->recordStream:Lorg/spongycastle/crypto/tls/RecordStream;
invoke-virtual {v0}, Lorg/spongycastle/crypto/tls/RecordStream;->notifyHelloComplete()V
.line 270
invoke-virtual {p0}, Lorg/spongycastle/crypto/tls/TlsClientProtocol;->applyMaxFragmentLengthExtension()V
.line 272
iget-boolean v0, p0, Lorg/spongycastle/crypto/tls/TlsClientProtocol;->resumedSession:Z
if-eqz v0, :cond_103
.line 274
iget-object v0, p0, Lorg/spongycastle/crypto/tls/TlsClientProtocol;->securityParameters:Lorg/spongycastle/crypto/tls/SecurityParameters;
iget-object v1, p0, Lorg/spongycastle/crypto/tls/TlsClientProtocol;->sessionParameters:Lorg/spongycastle/crypto/tls/SessionParameters;
invoke-virtual {v1}, Lorg/spongycastle/crypto/tls/SessionParameters;->getMasterSecret()[B
move-result-object v1
invoke-static {v1}, Lorg/spongycastle/util/Arrays;->clone([B)[B
move-result-object v1
iput-object v1, v0, Lorg/spongycastle/crypto/tls/SecurityParameters;->masterSecret:[B
.line 275
iget-object v0, p0, Lorg/spongycastle/crypto/tls/TlsClientProtocol;->recordStream:Lorg/spongycastle/crypto/tls/RecordStream;
invoke-virtual {p0}, Lorg/spongycastle/crypto/tls/TlsClientProtocol;->getPeer()Lorg/spongycastle/crypto/tls/TlsPeer;
move-result-object v1
invoke-interface {v1}, Lorg/spongycastle/crypto/tls/TlsPeer;->getCompression()Lorg/spongycastle/crypto/tls/TlsCompression;
move-result-object v1
invoke-virtual {p0}, Lorg/spongycastle/crypto/tls/TlsClientProtocol;->getPeer()Lorg/spongycastle/crypto/tls/TlsPeer;
move-result-object v2
invoke-interface {v2}, Lorg/spongycastle/crypto/tls/TlsPeer;->getCipher()Lorg/spongycastle/crypto/tls/TlsCipher;
move-result-object v2
invoke-virtual {v0, v1, v2}, Lorg/spongycastle/crypto/tls/RecordStream;->setPendingConnectionState(Lorg/spongycastle/crypto/tls/TlsCompression;Lorg/spongycastle/crypto/tls/TlsCipher;)V
.line 277
invoke-virtual {p0}, Lorg/spongycastle/crypto/tls/TlsClientProtocol;->sendChangeCipherSpecMessage()V
goto/16 :goto_30
.line 281
:cond_103
invoke-virtual {p0}, Lorg/spongycastle/crypto/tls/TlsClientProtocol;->invalidateSession()V
.line 283
iget-object v0, p0, Lorg/spongycastle/crypto/tls/TlsClientProtocol;->selectedSessionID:[B
array-length v0, v0
if-lez v0, :cond_30
.line 285
new-instance v0, Lorg/spongycastle/crypto/tls/TlsSessionImpl;
iget-object v2, p0, Lorg/spongycastle/crypto/tls/TlsClientProtocol;->selectedSessionID:[B
invoke-direct {v0, v2, v1}, Lorg/spongycastle/crypto/tls/TlsSessionImpl;-><init>([BLorg/spongycastle/crypto/tls/SessionParameters;)V
iput-object v0, p0, Lorg/spongycastle/crypto/tls/TlsClientProtocol;->tlsSession:Lorg/spongycastle/crypto/tls/TlsSession;
goto/16 :goto_30
.line 298
:pswitch_116
iget-short v1, p0, Lorg/spongycastle/crypto/tls/TlsClientProtocol;->connection_state:S
packed-switch v1, :pswitch_data_2ea
.line 306
new-instance v0, Lorg/spongycastle/crypto/tls/TlsFatalAlert;
invoke-direct {v0, v3}, Lorg/spongycastle/crypto/tls/TlsFatalAlert;-><init>(S)V
throw v0
.line 302
:pswitch_121
invoke-static {v0}, Lorg/spongycastle/crypto/tls/TlsClientProtocol;->readSupplementalDataMessage(Ljava/io/ByteArrayInputStream;)Ljava/util/Vector;
move-result-object v0
invoke-virtual {p0, v0}, Lorg/spongycastle/crypto/tls/TlsClientProtocol;->handleSupplementalData(Ljava/util/Vector;)V
goto/16 :goto_30
.line 312
:pswitch_12a
iget-short v2, p0, Lorg/spongycastle/crypto/tls/TlsClientProtocol;->connection_state:S
packed-switch v2, :pswitch_data_2f0
.line 427
new-instance v0, Lorg/spongycastle/crypto/tls/TlsFatalAlert;
const/16 v1, 0x28
invoke-direct {v0, v1}, Lorg/spongycastle/crypto/tls/TlsFatalAlert;-><init>(S)V
throw v0
.line 316
:pswitch_137
invoke-virtual {p0, v1}, Lorg/spongycastle/crypto/tls/TlsClientProtocol;->handleSupplementalData(Ljava/util/Vector;)V
.line 322
:pswitch_13a
iget-object v2, p0, Lorg/spongycastle/crypto/tls/TlsClientProtocol;->keyExchange:Lorg/spongycastle/crypto/tls/TlsKeyExchange;
invoke-interface {v2}, Lorg/spongycastle/crypto/tls/TlsKeyExchange;->skipServerCredentials()V
.line 323
iput-object v1, p0, Lorg/spongycastle/crypto/tls/TlsClientProtocol;->authentication:Lorg/spongycastle/crypto/tls/TlsAuthentication;
.line 331
:pswitch_141
iget-object v2, p0, Lorg/spongycastle/crypto/tls/TlsClientProtocol;->keyExchange:Lorg/spongycastle/crypto/tls/TlsKeyExchange;
invoke-interface {v2}, Lorg/spongycastle/crypto/tls/TlsKeyExchange;->skipServerKeyExchange()V
.line 338
:pswitch_146
invoke-static {v0}, Lorg/spongycastle/crypto/tls/TlsClientProtocol;->assertEmpty(Ljava/io/ByteArrayInputStream;)V
.line 340
const/16 v0, 0x8
iput-short v0, p0, Lorg/spongycastle/crypto/tls/TlsClientProtocol;->connection_state:S
.line 342
iget-object v0, p0, Lorg/spongycastle/crypto/tls/TlsClientProtocol;->recordStream:Lorg/spongycastle/crypto/tls/RecordStream;
invoke-virtual {v0}, Lorg/spongycastle/crypto/tls/RecordStream;->getHandshakeHash()Lorg/spongycastle/crypto/tls/TlsHandshakeHash;
move-result-object v0
invoke-interface {v0}, Lorg/spongycastle/crypto/tls/TlsHandshakeHash;->sealHashAlgorithms()V
.line 344
iget-object v0, p0, Lorg/spongycastle/crypto/tls/TlsClientProtocol;->tlsClient:Lorg/spongycastle/crypto/tls/TlsClient;
invoke-interface {v0}, Lorg/spongycastle/crypto/tls/TlsClient;->getClientSupplementalData()Ljava/util/Vector;
move-result-object v0
.line 345
if-eqz v0, :cond_161
.line 347
invoke-virtual {p0, v0}, Lorg/spongycastle/crypto/tls/TlsClientProtocol;->sendSupplementalDataMessage(Ljava/util/Vector;)V
.line 349
:cond_161
const/16 v0, 0x9
iput-short v0, p0, Lorg/spongycastle/crypto/tls/TlsClientProtocol;->connection_state:S
.line 352
iget-object v0, p0, Lorg/spongycastle/crypto/tls/TlsClientProtocol;->certificateRequest:Lorg/spongycastle/crypto/tls/CertificateRequest;
if-nez v0, :cond_1da
.line 354
iget-object v0, p0, Lorg/spongycastle/crypto/tls/TlsClientProtocol;->keyExchange:Lorg/spongycastle/crypto/tls/TlsKeyExchange;
invoke-interface {v0}, Lorg/spongycastle/crypto/tls/TlsKeyExchange;->skipClientCredentials()V
move-object v0, v1
.line 380
:goto_16f
iput-short v3, p0, Lorg/spongycastle/crypto/tls/TlsClientProtocol;->connection_state:S
.line 386
invoke-virtual {p0}, Lorg/spongycastle/crypto/tls/TlsClientProtocol;->sendClientKeyExchangeMessage()V
.line 387
const/16 v2, 0xb
iput-short v2, p0, Lorg/spongycastle/crypto/tls/TlsClientProtocol;->connection_state:S
.line 389
iget-object v2, p0, Lorg/spongycastle/crypto/tls/TlsClientProtocol;->recordStream:Lorg/spongycastle/crypto/tls/RecordStream;
invoke-virtual {v2}, Lorg/spongycastle/crypto/tls/RecordStream;->prepareToFinish()Lorg/spongycastle/crypto/tls/TlsHandshakeHash;
move-result-object v2
.line 390
iget-object v3, p0, Lorg/spongycastle/crypto/tls/TlsClientProtocol;->securityParameters:Lorg/spongycastle/crypto/tls/SecurityParameters;
invoke-virtual {p0}, Lorg/spongycastle/crypto/tls/TlsClientProtocol;->getContext()Lorg/spongycastle/crypto/tls/TlsContext;
move-result-object v4
invoke-static {v4, v2, v1}, Lorg/spongycastle/crypto/tls/TlsClientProtocol;->getCurrentPRFHash(Lorg/spongycastle/crypto/tls/TlsContext;Lorg/spongycastle/crypto/tls/TlsHandshakeHash;[B)[B
move-result-object v1
iput-object v1, v3, Lorg/spongycastle/crypto/tls/SecurityParameters;->sessionHash:[B
.line 392
invoke-virtual {p0}, Lorg/spongycastle/crypto/tls/TlsClientProtocol;->getContext()Lorg/spongycastle/crypto/tls/TlsContext;
move-result-object v1
iget-object v3, p0, Lorg/spongycastle/crypto/tls/TlsClientProtocol;->keyExchange:Lorg/spongycastle/crypto/tls/TlsKeyExchange;
invoke-static {v1, v3}, Lorg/spongycastle/crypto/tls/TlsClientProtocol;->establishMasterSecret(Lorg/spongycastle/crypto/tls/TlsContext;Lorg/spongycastle/crypto/tls/TlsKeyExchange;)V
.line 393
iget-object v1, p0, Lorg/spongycastle/crypto/tls/TlsClientProtocol;->recordStream:Lorg/spongycastle/crypto/tls/RecordStream;
invoke-virtual {p0}, Lorg/spongycastle/crypto/tls/TlsClientProtocol;->getPeer()Lorg/spongycastle/crypto/tls/TlsPeer;
move-result-object v3
invoke-interface {v3}, Lorg/spongycastle/crypto/tls/TlsPeer;->getCompression()Lorg/spongycastle/crypto/tls/TlsCompression;
move-result-object v3
invoke-virtual {p0}, Lorg/spongycastle/crypto/tls/TlsClientProtocol;->getPeer()Lorg/spongycastle/crypto/tls/TlsPeer;
move-result-object v4
invoke-interface {v4}, Lorg/spongycastle/crypto/tls/TlsPeer;->getCipher()Lorg/spongycastle/crypto/tls/TlsCipher;
move-result-object v4
invoke-virtual {v1, v3, v4}, Lorg/spongycastle/crypto/tls/RecordStream;->setPendingConnectionState(Lorg/spongycastle/crypto/tls/TlsCompression;Lorg/spongycastle/crypto/tls/TlsCipher;)V
.line 395
if-eqz v0, :cond_1d0
instance-of v1, v0, Lorg/spongycastle/crypto/tls/TlsSignerCredentials;
if-eqz v1, :cond_1d0
.line 397
check-cast v0, Lorg/spongycastle/crypto/tls/TlsSignerCredentials;
.line 403
invoke-virtual {p0}, Lorg/spongycastle/crypto/tls/TlsClientProtocol;->getContext()Lorg/spongycastle/crypto/tls/TlsContext;
move-result-object v1
.line 402
invoke-static {v1, v0}, Lorg/spongycastle/crypto/tls/TlsUtils;->getSignatureAndHashAlgorithm(Lorg/spongycastle/crypto/tls/TlsContext;Lorg/spongycastle/crypto/tls/TlsSignerCredentials;)Lorg/spongycastle/crypto/tls/SignatureAndHashAlgorithm;
move-result-object v3
.line 406
if-nez v3, :cond_1fd
.line 408
iget-object v1, p0, Lorg/spongycastle/crypto/tls/TlsClientProtocol;->securityParameters:Lorg/spongycastle/crypto/tls/SecurityParameters;
invoke-virtual {v1}, Lorg/spongycastle/crypto/tls/SecurityParameters;->getSessionHash()[B
move-result-object v1
.line 415
:goto_1c0
invoke-interface {v0, v1}, Lorg/spongycastle/crypto/tls/TlsSignerCredentials;->generateCertificateSignature([B)[B
move-result-object v0
.line 416
new-instance v1, Lorg/spongycastle/crypto/tls/DigitallySigned;
invoke-direct {v1, v3, v0}, Lorg/spongycastle/crypto/tls/DigitallySigned;-><init>(Lorg/spongycastle/crypto/tls/SignatureAndHashAlgorithm;[B)V
.line 417
invoke-virtual {p0, v1}, Lorg/spongycastle/crypto/tls/TlsClientProtocol;->sendCertificateVerifyMessage(Lorg/spongycastle/crypto/tls/DigitallySigned;)V
.line 419
const/16 v0, 0xc
iput-short v0, p0, Lorg/spongycastle/crypto/tls/TlsClientProtocol;->connection_state:S
.line 422
:cond_1d0
invoke-virtual {p0}, Lorg/spongycastle/crypto/tls/TlsClientProtocol;->sendChangeCipherSpecMessage()V
.line 423
invoke-virtual {p0}, Lorg/spongycastle/crypto/tls/TlsClientProtocol;->sendFinishedMessage()V
.line 430
iput-short v6, p0, Lorg/spongycastle/crypto/tls/TlsClientProtocol;->connection_state:S
goto/16 :goto_30
.line 358
:cond_1da
iget-object v0, p0, Lorg/spongycastle/crypto/tls/TlsClientProtocol;->authentication:Lorg/spongycastle/crypto/tls/TlsAuthentication;
iget-object v2, p0, Lorg/spongycastle/crypto/tls/TlsClientProtocol;->certificateRequest:Lorg/spongycastle/crypto/tls/CertificateRequest;
invoke-interface {v0, v2}, Lorg/spongycastle/crypto/tls/TlsAuthentication;->getClientCredentials(Lorg/spongycastle/crypto/tls/CertificateRequest;)Lorg/spongycastle/crypto/tls/TlsCredentials;
move-result-object v0
.line 360
if-nez v0, :cond_1ef
.line 362
iget-object v2, p0, Lorg/spongycastle/crypto/tls/TlsClientProtocol;->keyExchange:Lorg/spongycastle/crypto/tls/TlsKeyExchange;
invoke-interface {v2}, Lorg/spongycastle/crypto/tls/TlsKeyExchange;->skipClientCredentials()V
.line 370
sget-object v2, Lorg/spongycastle/crypto/tls/Certificate;->EMPTY_CHAIN:Lorg/spongycastle/crypto/tls/Certificate;
invoke-virtual {p0, v2}, Lorg/spongycastle/crypto/tls/TlsClientProtocol;->sendCertificateMessage(Lorg/spongycastle/crypto/tls/Certificate;)V
goto :goto_16f
.line 374
:cond_1ef
iget-object v2, p0, Lorg/spongycastle/crypto/tls/TlsClientProtocol;->keyExchange:Lorg/spongycastle/crypto/tls/TlsKeyExchange;
invoke-interface {v2, v0}, Lorg/spongycastle/crypto/tls/TlsKeyExchange;->processClientCredentials(Lorg/spongycastle/crypto/tls/TlsCredentials;)V
.line 376
invoke-interface {v0}, Lorg/spongycastle/crypto/tls/TlsCredentials;->getCertificate()Lorg/spongycastle/crypto/tls/Certificate;
move-result-object v2
invoke-virtual {p0, v2}, Lorg/spongycastle/crypto/tls/TlsClientProtocol;->sendCertificateMessage(Lorg/spongycastle/crypto/tls/Certificate;)V
goto/16 :goto_16f
.line 412
:cond_1fd
invoke-virtual {v3}, Lorg/spongycastle/crypto/tls/SignatureAndHashAlgorithm;->getHash()S
move-result v1
invoke-interface {v2, v1}, Lorg/spongycastle/crypto/tls/TlsHandshakeHash;->getFinalHash(S)[B
move-result-object v1
goto :goto_1c0
.line 435
:pswitch_206
iget-short v2, p0, Lorg/spongycastle/crypto/tls/TlsClientProtocol;->connection_state:S
packed-switch v2, :pswitch_data_300
.line 459
new-instance v0, Lorg/spongycastle/crypto/tls/TlsFatalAlert;
invoke-direct {v0, v3}, Lorg/spongycastle/crypto/tls/TlsFatalAlert;-><init>(S)V
throw v0
.line 439
:pswitch_211
invoke-virtual {p0, v1}, Lorg/spongycastle/crypto/tls/TlsClientProtocol;->handleSupplementalData(Ljava/util/Vector;)V
.line 445
:pswitch_214
iget-object v2, p0, Lorg/spongycastle/crypto/tls/TlsClientProtocol;->keyExchange:Lorg/spongycastle/crypto/tls/TlsKeyExchange;
invoke-interface {v2}, Lorg/spongycastle/crypto/tls/TlsKeyExchange;->skipServerCredentials()V
.line 446
iput-object v1, p0, Lorg/spongycastle/crypto/tls/TlsClientProtocol;->authentication:Lorg/spongycastle/crypto/tls/TlsAuthentication;
.line 453
:pswitch_21b
iget-object v1, p0, Lorg/spongycastle/crypto/tls/TlsClientProtocol;->keyExchange:Lorg/spongycastle/crypto/tls/TlsKeyExchange;
invoke-interface {v1, v0}, Lorg/spongycastle/crypto/tls/TlsKeyExchange;->processServerKeyExchange(Ljava/io/InputStream;)V
.line 455
invoke-static {v0}, Lorg/spongycastle/crypto/tls/TlsClientProtocol;->assertEmpty(Ljava/io/ByteArrayInputStream;)V
.line 462
const/4 v0, 0x6
iput-short v0, p0, Lorg/spongycastle/crypto/tls/TlsClientProtocol;->connection_state:S
goto/16 :goto_30
.line 467
:pswitch_228
iget-short v1, p0, Lorg/spongycastle/crypto/tls/TlsClientProtocol;->connection_state:S
packed-switch v1, :pswitch_data_30c
.line 504
new-instance v0, Lorg/spongycastle/crypto/tls/TlsFatalAlert;
invoke-direct {v0, v3}, Lorg/spongycastle/crypto/tls/TlsFatalAlert;-><init>(S)V
throw v0
.line 473
:pswitch_233
iget-object v1, p0, Lorg/spongycastle/crypto/tls/TlsClientProtocol;->keyExchange:Lorg/spongycastle/crypto/tls/TlsKeyExchange;
invoke-interface {v1}, Lorg/spongycastle/crypto/tls/TlsKeyExchange;->skipServerKeyExchange()V
.line 479
:pswitch_238
iget-object v1, p0, Lorg/spongycastle/crypto/tls/TlsClientProtocol;->authentication:Lorg/spongycastle/crypto/tls/TlsAuthentication;
if-nez v1, :cond_244
.line 485
new-instance v0, Lorg/spongycastle/crypto/tls/TlsFatalAlert;
const/16 v1, 0x28
invoke-direct {v0, v1}, Lorg/spongycastle/crypto/tls/TlsFatalAlert;-><init>(S)V
throw v0
.line 488
:cond_244
invoke-virtual {p0}, Lorg/spongycastle/crypto/tls/TlsClientProtocol;->getContext()Lorg/spongycastle/crypto/tls/TlsContext;
move-result-object v1
invoke-static {v1, v0}, Lorg/spongycastle/crypto/tls/CertificateRequest;->parse(Lorg/spongycastle/crypto/tls/TlsContext;Ljava/io/InputStream;)Lorg/spongycastle/crypto/tls/CertificateRequest;
move-result-object v1
iput-object v1, p0, Lorg/spongycastle/crypto/tls/TlsClientProtocol;->certificateRequest:Lorg/spongycastle/crypto/tls/CertificateRequest;
.line 490
invoke-static {v0}, Lorg/spongycastle/crypto/tls/TlsClientProtocol;->assertEmpty(Ljava/io/ByteArrayInputStream;)V
.line 492
iget-object v0, p0, Lorg/spongycastle/crypto/tls/TlsClientProtocol;->keyExchange:Lorg/spongycastle/crypto/tls/TlsKeyExchange;
iget-object v1, p0, Lorg/spongycastle/crypto/tls/TlsClientProtocol;->certificateRequest:Lorg/spongycastle/crypto/tls/CertificateRequest;
invoke-interface {v0, v1}, Lorg/spongycastle/crypto/tls/TlsKeyExchange;->validateCertificateRequest(Lorg/spongycastle/crypto/tls/CertificateRequest;)V
.line 498
iget-object v0, p0, Lorg/spongycastle/crypto/tls/TlsClientProtocol;->recordStream:Lorg/spongycastle/crypto/tls/RecordStream;
invoke-virtual {v0}, Lorg/spongycastle/crypto/tls/RecordStream;->getHandshakeHash()Lorg/spongycastle/crypto/tls/TlsHandshakeHash;
move-result-object v0
iget-object v1, p0, Lorg/spongycastle/crypto/tls/TlsClientProtocol;->certificateRequest:Lorg/spongycastle/crypto/tls/CertificateRequest;
.line 499
invoke-virtual {v1}, Lorg/spongycastle/crypto/tls/CertificateRequest;->getSupportedSignatureAlgorithms()Ljava/util/Vector;
move-result-object v1
.line 498
invoke-static {v0, v1}, Lorg/spongycastle/crypto/tls/TlsUtils;->trackHashAlgorithms(Lorg/spongycastle/crypto/tls/TlsHandshakeHash;Ljava/util/Vector;)V
.line 507
const/4 v0, 0x7
iput-short v0, p0, Lorg/spongycastle/crypto/tls/TlsClientProtocol;->connection_state:S
goto/16 :goto_30
.line 512
:pswitch_26c
iget-short v1, p0, Lorg/spongycastle/crypto/tls/TlsClientProtocol;->connection_state:S
packed-switch v1, :pswitch_data_316
.line 535
new-instance v0, Lorg/spongycastle/crypto/tls/TlsFatalAlert;
invoke-direct {v0, v3}, Lorg/spongycastle/crypto/tls/TlsFatalAlert;-><init>(S)V
throw v0
.line 516
:pswitch_277
iget-boolean v1, p0, Lorg/spongycastle/crypto/tls/TlsClientProtocol;->expectSessionTicket:Z
if-nez v1, :cond_281
.line 522
new-instance v0, Lorg/spongycastle/crypto/tls/TlsFatalAlert;
invoke-direct {v0, v3}, Lorg/spongycastle/crypto/tls/TlsFatalAlert;-><init>(S)V
throw v0
.line 529
:cond_281
invoke-virtual {p0}, Lorg/spongycastle/crypto/tls/TlsClientProtocol;->invalidateSession()V
.line 531
invoke-virtual {p0, v0}, Lorg/spongycastle/crypto/tls/TlsClientProtocol;->receiveNewSessionTicketMessage(Ljava/io/ByteArrayInputStream;)V
.line 538
const/16 v0, 0xe
iput-short v0, p0, Lorg/spongycastle/crypto/tls/TlsClientProtocol;->connection_state:S
goto/16 :goto_30
.line 543
:pswitch_28d
invoke-static {v0}, Lorg/spongycastle/crypto/tls/TlsClientProtocol;->assertEmpty(Ljava/io/ByteArrayInputStream;)V
.line 551
iget-short v0, p0, Lorg/spongycastle/crypto/tls/TlsClientProtocol;->connection_state:S
if-ne v0, v4, :cond_30
.line 553
invoke-virtual {p0}, Lorg/spongycastle/crypto/tls/TlsClientProtocol;->refuseRenegotiation()V
goto/16 :goto_30
.line 159
nop
:pswitch_data_29a
.packed-switch 0x0
:pswitch_28d
:pswitch_34
:pswitch_bf
:pswitch_34
:pswitch_26c
:pswitch_34
:pswitch_34
:pswitch_34
:pswitch_34
:pswitch_34
:pswitch_34
:pswitch_3a
:pswitch_206
:pswitch_228
:pswitch_12a
:pswitch_34
:pswitch_34
:pswitch_34
:pswitch_34
:pswitch_34
:pswitch_9c
:pswitch_34
:pswitch_7a
:pswitch_116
.end packed-switch
.line 163
:pswitch_data_2ce
.packed-switch 0x2
:pswitch_45
:pswitch_48
.end packed-switch
.line 200
:pswitch_data_2d6
.packed-switch 0x4
:pswitch_85
.end packed-switch
.line 230
:pswitch_data_2dc
.packed-switch 0xd
:pswitch_a7
:pswitch_b1
.end packed-switch
.line 261
:pswitch_data_2e4
.packed-switch 0x1
:pswitch_ca
.end packed-switch
.line 298
:pswitch_data_2ea
.packed-switch 0x2
:pswitch_121
.end packed-switch
.line 312
:pswitch_data_2f0
.packed-switch 0x2
:pswitch_137
:pswitch_13a
:pswitch_141
:pswitch_141
:pswitch_146
:pswitch_146
.end packed-switch
.line 435
:pswitch_data_300
.packed-switch 0x2
:pswitch_211
:pswitch_214
:pswitch_21b
:pswitch_21b
.end packed-switch
.line 467
:pswitch_data_30c
.packed-switch 0x4
:pswitch_233
:pswitch_233
:pswitch_238
.end packed-switch
.line 512
:pswitch_data_316
.packed-switch 0xd
:pswitch_277
.end packed-switch
.end method
.method protected handleSupplementalData(Ljava/util/Vector;)V
.registers 4
.prologue
.line 569
iget-object v0, p0, Lorg/spongycastle/crypto/tls/TlsClientProtocol;->tlsClient:Lorg/spongycastle/crypto/tls/TlsClient;
invoke-interface {v0, p1}, Lorg/spongycastle/crypto/tls/TlsClient;->processServerSupplementalData(Ljava/util/Vector;)V
.line 570
const/4 v0, 0x3
iput-short v0, p0, Lorg/spongycastle/crypto/tls/TlsClientProtocol;->connection_state:S
.line 572
iget-object v0, p0, Lorg/spongycastle/crypto/tls/TlsClientProtocol;->tlsClient:Lorg/spongycastle/crypto/tls/TlsClient;
invoke-interface {v0}, Lorg/spongycastle/crypto/tls/TlsClient;->getKeyExchange()Lorg/spongycastle/crypto/tls/TlsKeyExchange;
move-result-object v0
iput-object v0, p0, Lorg/spongycastle/crypto/tls/TlsClientProtocol;->keyExchange:Lorg/spongycastle/crypto/tls/TlsKeyExchange;
.line 573
iget-object v0, p0, Lorg/spongycastle/crypto/tls/TlsClientProtocol;->keyExchange:Lorg/spongycastle/crypto/tls/TlsKeyExchange;
invoke-virtual {p0}, Lorg/spongycastle/crypto/tls/TlsClientProtocol;->getContext()Lorg/spongycastle/crypto/tls/TlsContext;
move-result-object v1
invoke-interface {v0, v1}, Lorg/spongycastle/crypto/tls/TlsKeyExchange;->init(Lorg/spongycastle/crypto/tls/TlsContext;)V
.line 574
return-void
.end method
.method protected receiveNewSessionTicketMessage(Ljava/io/ByteArrayInputStream;)V
.registers 4
.prologue
.line 579
invoke-static {p1}, Lorg/spongycastle/crypto/tls/NewSessionTicket;->parse(Ljava/io/InputStream;)Lorg/spongycastle/crypto/tls/NewSessionTicket;
move-result-object v0
.line 581
invoke-static {p1}, Lorg/spongycastle/crypto/tls/TlsClientProtocol;->assertEmpty(Ljava/io/ByteArrayInputStream;)V
.line 583
iget-object v1, p0, Lorg/spongycastle/crypto/tls/TlsClientProtocol;->tlsClient:Lorg/spongycastle/crypto/tls/TlsClient;
invoke-interface {v1, v0}, Lorg/spongycastle/crypto/tls/TlsClient;->notifyNewSessionTicket(Lorg/spongycastle/crypto/tls/NewSessionTicket;)V
.line 584
return-void
.end method
.method protected receiveServerHelloMessage(Ljava/io/ByteArrayInputStream;)V
.registers 10
.prologue
const/16 v4, 0x20
const/4 v2, 0x0
const/4 v1, 0x1
const/16 v7, 0x2f
.line 590
invoke-static {p1}, Lorg/spongycastle/crypto/tls/TlsUtils;->readVersion(Ljava/io/InputStream;)Lorg/spongycastle/crypto/tls/ProtocolVersion;
move-result-object v0
.line 591
invoke-virtual {v0}, Lorg/spongycastle/crypto/tls/ProtocolVersion;->isDTLS()Z
move-result v3
if-eqz v3, :cond_16
.line 593
new-instance v0, Lorg/spongycastle/crypto/tls/TlsFatalAlert;
invoke-direct {v0, v7}, Lorg/spongycastle/crypto/tls/TlsFatalAlert;-><init>(S)V
throw v0
.line 597
:cond_16
iget-object v3, p0, Lorg/spongycastle/crypto/tls/TlsClientProtocol;->recordStream:Lorg/spongycastle/crypto/tls/RecordStream;
invoke-virtual {v3}, Lorg/spongycastle/crypto/tls/RecordStream;->getReadVersion()Lorg/spongycastle/crypto/tls/ProtocolVersion;
move-result-object v3
invoke-virtual {v0, v3}, Lorg/spongycastle/crypto/tls/ProtocolVersion;->equals(Lorg/spongycastle/crypto/tls/ProtocolVersion;)Z
move-result v3
if-nez v3, :cond_28
.line 599
new-instance v0, Lorg/spongycastle/crypto/tls/TlsFatalAlert;
invoke-direct {v0, v7}, Lorg/spongycastle/crypto/tls/TlsFatalAlert;-><init>(S)V
throw v0
.line 602
:cond_28
invoke-virtual {p0}, Lorg/spongycastle/crypto/tls/TlsClientProtocol;->getContext()Lorg/spongycastle/crypto/tls/TlsContext;
move-result-object v3
invoke-interface {v3}, Lorg/spongycastle/crypto/tls/TlsContext;->getClientVersion()Lorg/spongycastle/crypto/tls/ProtocolVersion;
move-result-object v3
.line 603
invoke-virtual {v0, v3}, Lorg/spongycastle/crypto/tls/ProtocolVersion;->isEqualOrEarlierVersionOf(Lorg/spongycastle/crypto/tls/ProtocolVersion;)Z
move-result v3
if-nez v3, :cond_3c
.line 605
new-instance v0, Lorg/spongycastle/crypto/tls/TlsFatalAlert;
invoke-direct {v0, v7}, Lorg/spongycastle/crypto/tls/TlsFatalAlert;-><init>(S)V
throw v0
.line 608
:cond_3c
iget-object v3, p0, Lorg/spongycastle/crypto/tls/TlsClientProtocol;->recordStream:Lorg/spongycastle/crypto/tls/RecordStream;
invoke-virtual {v3, v0}, Lorg/spongycastle/crypto/tls/RecordStream;->setWriteVersion(Lorg/spongycastle/crypto/tls/ProtocolVersion;)V
.line 609
invoke-virtual {p0}, Lorg/spongycastle/crypto/tls/TlsClientProtocol;->getContextAdmin()Lorg/spongycastle/crypto/tls/AbstractTlsContext;
move-result-object v3
invoke-virtual {v3, v0}, Lorg/spongycastle/crypto/tls/AbstractTlsContext;->setServerVersion(Lorg/spongycastle/crypto/tls/ProtocolVersion;)V
.line 610
iget-object v3, p0, Lorg/spongycastle/crypto/tls/TlsClientProtocol;->tlsClient:Lorg/spongycastle/crypto/tls/TlsClient;
invoke-interface {v3, v0}, Lorg/spongycastle/crypto/tls/TlsClient;->notifyServerVersion(Lorg/spongycastle/crypto/tls/ProtocolVersion;)V
.line 616
iget-object v0, p0, Lorg/spongycastle/crypto/tls/TlsClientProtocol;->securityParameters:Lorg/spongycastle/crypto/tls/SecurityParameters;
invoke-static {v4, p1}, Lorg/spongycastle/crypto/tls/TlsUtils;->readFully(ILjava/io/InputStream;)[B
move-result-object v3
iput-object v3, v0, Lorg/spongycastle/crypto/tls/SecurityParameters;->serverRandom:[B
.line 618
invoke-static {p1}, Lorg/spongycastle/crypto/tls/TlsUtils;->readOpaque8(Ljava/io/InputStream;)[B
move-result-object v0
iput-object v0, p0, Lorg/spongycastle/crypto/tls/TlsClientProtocol;->selectedSessionID:[B
.line 619
iget-object v0, p0, Lorg/spongycastle/crypto/tls/TlsClientProtocol;->selectedSessionID:[B
array-length v0, v0
if-le v0, v4, :cond_66
.line 621
new-instance v0, Lorg/spongycastle/crypto/tls/TlsFatalAlert;
invoke-direct {v0, v7}, Lorg/spongycastle/crypto/tls/TlsFatalAlert;-><init>(S)V
throw v0
.line 623
:cond_66
iget-object v0, p0, Lorg/spongycastle/crypto/tls/TlsClientProtocol;->tlsClient:Lorg/spongycastle/crypto/tls/TlsClient;
iget-object v3, p0, Lorg/spongycastle/crypto/tls/TlsClientProtocol;->selectedSessionID:[B
invoke-interface {v0, v3}, Lorg/spongycastle/crypto/tls/TlsClient;->notifySessionID([B)V
.line 624
iget-object v0, p0, Lorg/spongycastle/crypto/tls/TlsClientProtocol;->selectedSessionID:[B
array-length v0, v0
if-lez v0, :cond_af
iget-object v0, p0, Lorg/spongycastle/crypto/tls/TlsClientProtocol;->tlsSession:Lorg/spongycastle/crypto/tls/TlsSession;
if-eqz v0, :cond_af
iget-object v0, p0, Lorg/spongycastle/crypto/tls/TlsClientProtocol;->selectedSessionID:[B
iget-object v3, p0, Lorg/spongycastle/crypto/tls/TlsClientProtocol;->tlsSession:Lorg/spongycastle/crypto/tls/TlsSession;
.line 625
invoke-interface {v3}, Lorg/spongycastle/crypto/tls/TlsSession;->getSessionID()[B
move-result-object v3
invoke-static {v0, v3}, Lorg/spongycastle/util/Arrays;->areEqual([B[B)Z
move-result v0
if-eqz v0, :cond_af
move v0, v1
:goto_85
iput-boolean v0, p0, Lorg/spongycastle/crypto/tls/TlsClientProtocol;->resumedSession:Z
.line 631
invoke-static {p1}, Lorg/spongycastle/crypto/tls/TlsUtils;->readUint16(Ljava/io/InputStream;)I
move-result v4
.line 632
iget-object v0, p0, Lorg/spongycastle/crypto/tls/TlsClientProtocol;->offeredCipherSuites:[I
invoke-static {v0, v4}, Lorg/spongycastle/util/Arrays;->contains([II)Z
move-result v0
if-eqz v0, :cond_a9
if-eqz v4, :cond_a9
.line 634
invoke-static {v4}, Lorg/spongycastle/crypto/tls/CipherSuite;->isSCSV(I)Z
move-result v0
if-nez v0, :cond_a9
.line 635
invoke-virtual {p0}, Lorg/spongycastle/crypto/tls/TlsClientProtocol;->getContext()Lorg/spongycastle/crypto/tls/TlsContext;
move-result-object v0
invoke-interface {v0}, Lorg/spongycastle/crypto/tls/TlsContext;->getServerVersion()Lorg/spongycastle/crypto/tls/ProtocolVersion;
move-result-object v0
invoke-static {v4, v0}, Lorg/spongycastle/crypto/tls/TlsUtils;->isValidCipherSuiteForVersion(ILorg/spongycastle/crypto/tls/ProtocolVersion;)Z
move-result v0
if-nez v0, :cond_b1
.line 637
:cond_a9
new-instance v0, Lorg/spongycastle/crypto/tls/TlsFatalAlert;
invoke-direct {v0, v7}, Lorg/spongycastle/crypto/tls/TlsFatalAlert;-><init>(S)V
throw v0
:cond_af
move v0, v2
.line 625
goto :goto_85
.line 639
:cond_b1
iget-object v0, p0, Lorg/spongycastle/crypto/tls/TlsClientProtocol;->tlsClient:Lorg/spongycastle/crypto/tls/TlsClient;
invoke-interface {v0, v4}, Lorg/spongycastle/crypto/tls/TlsClient;->notifySelectedCipherSuite(I)V
.line 645
invoke-static {p1}, Lorg/spongycastle/crypto/tls/TlsUtils;->readUint8(Ljava/io/InputStream;)S
move-result v5
.line 646
iget-object v0, p0, Lorg/spongycastle/crypto/tls/TlsClientProtocol;->offeredCompressionMethods:[S
invoke-static {v0, v5}, Lorg/spongycastle/util/Arrays;->contains([SS)Z
move-result v0
if-nez v0, :cond_c8
.line 648
new-instance v0, Lorg/spongycastle/crypto/tls/TlsFatalAlert;
invoke-direct {v0, v7}, Lorg/spongycastle/crypto/tls/TlsFatalAlert;-><init>(S)V
throw v0
.line 650
:cond_c8
iget-object v0, p0, Lorg/spongycastle/crypto/tls/TlsClientProtocol;->tlsClient:Lorg/spongycastle/crypto/tls/TlsClient;
invoke-interface {v0, v5}, Lorg/spongycastle/crypto/tls/TlsClient;->notifySelectedCompressionMethod(S)V
.line 660
invoke-static {p1}, Lorg/spongycastle/crypto/tls/TlsClientProtocol;->readExtensions(Ljava/io/ByteArrayInputStream;)Ljava/util/Hashtable;
move-result-object v0
iput-object v0, p0, Lorg/spongycastle/crypto/tls/TlsClientProtocol;->serverExtensions:Ljava/util/Hashtable;
.line 669
iget-object v0, p0, Lorg/spongycastle/crypto/tls/TlsClientProtocol;->serverExtensions:Ljava/util/Hashtable;
if-eqz v0, :cond_101
.line 671
iget-object v0, p0, Lorg/spongycastle/crypto/tls/TlsClientProtocol;->serverExtensions:Ljava/util/Hashtable;
invoke-virtual {v0}, Ljava/util/Hashtable;->keys()Ljava/util/Enumeration;
move-result-object v3
.line 672
:cond_dd
invoke-interface {v3}, Ljava/util/Enumeration;->hasMoreElements()Z
move-result v0
if-eqz v0, :cond_101
.line 674
invoke-interface {v3}, Ljava/util/Enumeration;->nextElement()Ljava/lang/Object;
move-result-object v0
check-cast v0, Ljava/lang/Integer;
.line 683
sget-object v6, Lorg/spongycastle/crypto/tls/TlsClientProtocol;->EXT_RenegotiationInfo:Ljava/lang/Integer;
invoke-virtual {v0, v6}, Ljava/lang/Integer;->equals(Ljava/lang/Object;)Z
move-result v6
if-nez v6, :cond_dd
.line 695
iget-object v6, p0, Lorg/spongycastle/crypto/tls/TlsClientProtocol;->clientExtensions:Ljava/util/Hashtable;
invoke-static {v6, v0}, Lorg/spongycastle/crypto/tls/TlsUtils;->getExtensionData(Ljava/util/Hashtable;Ljava/lang/Integer;)[B
move-result-object v0
if-nez v0, :cond_dd
.line 697
new-instance v0, Lorg/spongycastle/crypto/tls/TlsFatalAlert;
const/16 v1, 0x6e
invoke-direct {v0, v1}, Lorg/spongycastle/crypto/tls/TlsFatalAlert;-><init>(S)V
throw v0
.line 723
:cond_101
iget-object v0, p0, Lorg/spongycastle/crypto/tls/TlsClientProtocol;->serverExtensions:Ljava/util/Hashtable;
sget-object v3, Lorg/spongycastle/crypto/tls/TlsClientProtocol;->EXT_RenegotiationInfo:Ljava/lang/Integer;
invoke-static {v0, v3}, Lorg/spongycastle/crypto/tls/TlsUtils;->getExtensionData(Ljava/util/Hashtable;Ljava/lang/Integer;)[B
move-result-object v0
.line 724
if-eqz v0, :cond_121
.line 732
iput-boolean v1, p0, Lorg/spongycastle/crypto/tls/TlsClientProtocol;->secure_renegotiation:Z
.line 734
sget-object v3, Lorg/spongycastle/crypto/tls/TlsUtils;->EMPTY_BYTES:[B
invoke-static {v3}, Lorg/spongycastle/crypto/tls/TlsClientProtocol;->createRenegotiationInfo([B)[B
move-result-object v3
invoke-static {v0, v3}, Lorg/spongycastle/util/Arrays;->constantTimeAreEqual([B[B)Z
move-result v0
if-nez v0, :cond_121
.line 736
new-instance v0, Lorg/spongycastle/crypto/tls/TlsFatalAlert;
const/16 v1, 0x28
invoke-direct {v0, v1}, Lorg/spongycastle/crypto/tls/TlsFatalAlert;-><init>(S)V
throw v0
.line 742
:cond_121
iget-object v0, p0, Lorg/spongycastle/crypto/tls/TlsClientProtocol;->tlsClient:Lorg/spongycastle/crypto/tls/TlsClient;
iget-boolean v3, p0, Lorg/spongycastle/crypto/tls/TlsClientProtocol;->secure_renegotiation:Z
invoke-interface {v0, v3}, Lorg/spongycastle/crypto/tls/TlsClient;->notifySecureRenegotiation(Z)V
.line 744
iget-object v3, p0, Lorg/spongycastle/crypto/tls/TlsClientProtocol;->clientExtensions:Ljava/util/Hashtable;
iget-object v0, p0, Lorg/spongycastle/crypto/tls/TlsClientProtocol;->serverExtensions:Ljava/util/Hashtable;
.line 745
iget-boolean v6, p0, Lorg/spongycastle/crypto/tls/TlsClientProtocol;->resumedSession:Z
if-eqz v6, :cond_14d
.line 747
iget-object v0, p0, Lorg/spongycastle/crypto/tls/TlsClientProtocol;->sessionParameters:Lorg/spongycastle/crypto/tls/SessionParameters;
invoke-virtual {v0}, Lorg/spongycastle/crypto/tls/SessionParameters;->getCipherSuite()I
move-result v0
if-ne v4, v0, :cond_140
iget-object v0, p0, Lorg/spongycastle/crypto/tls/TlsClientProtocol;->sessionParameters:Lorg/spongycastle/crypto/tls/SessionParameters;
.line 748
invoke-virtual {v0}, Lorg/spongycastle/crypto/tls/SessionParameters;->getCompressionAlgorithm()S
move-result v0
if-eq v5, v0, :cond_146
.line 750
:cond_140
new-instance v0, Lorg/spongycastle/crypto/tls/TlsFatalAlert;
invoke-direct {v0, v7}, Lorg/spongycastle/crypto/tls/TlsFatalAlert;-><init>(S)V
throw v0
.line 753
:cond_146
const/4 v3, 0x0
.line 754
iget-object v0, p0, Lorg/spongycastle/crypto/tls/TlsClientProtocol;->sessionParameters:Lorg/spongycastle/crypto/tls/SessionParameters;
invoke-virtual {v0}, Lorg/spongycastle/crypto/tls/SessionParameters;->readServerExtensions()Ljava/util/Hashtable;
move-result-object v0
.line 757
:cond_14d
iget-object v6, p0, Lorg/spongycastle/crypto/tls/TlsClientProtocol;->securityParameters:Lorg/spongycastle/crypto/tls/SecurityParameters;
iput v4, v6, Lorg/spongycastle/crypto/tls/SecurityParameters;->cipherSuite:I
.line 758
iget-object v6, p0, Lorg/spongycastle/crypto/tls/TlsClientProtocol;->securityParameters:Lorg/spongycastle/crypto/tls/SecurityParameters;
iput-short v5, v6, Lorg/spongycastle/crypto/tls/SecurityParameters;->compressionAlgorithm:S
.line 760
if-eqz v0, :cond_1a2
.line 769
invoke-static {v0}, Lorg/spongycastle/crypto/tls/TlsExtensionsUtils;->hasEncryptThenMACExtension(Ljava/util/Hashtable;)Z
move-result v5
.line 770
if-eqz v5, :cond_169
invoke-static {v4}, Lorg/spongycastle/crypto/tls/TlsUtils;->isBlockCipherSuite(I)Z
move-result v4
if-nez v4, :cond_169
.line 772
new-instance v0, Lorg/spongycastle/crypto/tls/TlsFatalAlert;
invoke-direct {v0, v7}, Lorg/spongycastle/crypto/tls/TlsFatalAlert;-><init>(S)V
throw v0
.line 774
:cond_169
iget-object v4, p0, Lorg/spongycastle/crypto/tls/TlsClientProtocol;->securityParameters:Lorg/spongycastle/crypto/tls/SecurityParameters;
iput-boolean v5, v4, Lorg/spongycastle/crypto/tls/SecurityParameters;->encryptThenMAC:Z
.line 777
iget-object v4, p0, Lorg/spongycastle/crypto/tls/TlsClientProtocol;->securityParameters:Lorg/spongycastle/crypto/tls/SecurityParameters;
invoke-static {v0}, Lorg/spongycastle/crypto/tls/TlsExtensionsUtils;->hasExtendedMasterSecretExtension(Ljava/util/Hashtable;)Z
move-result v5
iput-boolean v5, v4, Lorg/spongycastle/crypto/tls/SecurityParameters;->extendedMasterSecret:Z
.line 779
iget-object v4, p0, Lorg/spongycastle/crypto/tls/TlsClientProtocol;->securityParameters:Lorg/spongycastle/crypto/tls/SecurityParameters;
invoke-virtual {p0, v3, v0, v7}, Lorg/spongycastle/crypto/tls/TlsClientProtocol;->processMaxFragmentLengthExtension(Ljava/util/Hashtable;Ljava/util/Hashtable;S)S
move-result v5
iput-short v5, v4, Lorg/spongycastle/crypto/tls/SecurityParameters;->maxFragmentLength:S
.line 782
iget-object v4, p0, Lorg/spongycastle/crypto/tls/TlsClientProtocol;->securityParameters:Lorg/spongycastle/crypto/tls/SecurityParameters;
invoke-static {v0}, Lorg/spongycastle/crypto/tls/TlsExtensionsUtils;->hasTruncatedHMacExtension(Ljava/util/Hashtable;)Z
move-result v5
iput-boolean v5, v4, Lorg/spongycastle/crypto/tls/SecurityParameters;->truncatedHMac:Z
.line 788
iget-boolean v4, p0, Lorg/spongycastle/crypto/tls/TlsClientProtocol;->resumedSession:Z
if-nez v4, :cond_1c2
sget-object v4, Lorg/spongycastle/crypto/tls/TlsExtensionsUtils;->EXT_status_request:Ljava/lang/Integer;
.line 789
invoke-static {v0, v4, v7}, Lorg/spongycastle/crypto/tls/TlsUtils;->hasExpectedEmptyExtensionData(Ljava/util/Hashtable;Ljava/lang/Integer;S)Z
move-result v4
if-eqz v4, :cond_1c2
move v4, v1
:goto_192
iput-boolean v4, p0, Lorg/spongycastle/crypto/tls/TlsClientProtocol;->allowCertificateStatus:Z
.line 792
iget-boolean v4, p0, Lorg/spongycastle/crypto/tls/TlsClientProtocol;->resumedSession:Z
if-nez v4, :cond_1c4
sget-object v4, Lorg/spongycastle/crypto/tls/TlsProtocol;->EXT_SessionTicket:Ljava/lang/Integer;
.line 793
invoke-static {v0, v4, v7}, Lorg/spongycastle/crypto/tls/TlsUtils;->hasExpectedEmptyExtensionData(Ljava/util/Hashtable;Ljava/lang/Integer;S)Z
move-result v4
if-eqz v4, :cond_1c4
:goto_1a0
iput-boolean v1, p0, Lorg/spongycastle/crypto/tls/TlsClientProtocol;->expectSessionTicket:Z
.line 804
:cond_1a2
if-eqz v3, :cond_1a9
.line 806
iget-object v1, p0, Lorg/spongycastle/crypto/tls/TlsClientProtocol;->tlsClient:Lorg/spongycastle/crypto/tls/TlsClient;
invoke-interface {v1, v0}, Lorg/spongycastle/crypto/tls/TlsClient;->processServerExtensions(Ljava/util/Hashtable;)V
.line 809
:cond_1a9
iget-object v0, p0, Lorg/spongycastle/crypto/tls/TlsClientProtocol;->securityParameters:Lorg/spongycastle/crypto/tls/SecurityParameters;
invoke-virtual {p0}, Lorg/spongycastle/crypto/tls/TlsClientProtocol;->getContext()Lorg/spongycastle/crypto/tls/TlsContext;
move-result-object v1
iget-object v2, p0, Lorg/spongycastle/crypto/tls/TlsClientProtocol;->securityParameters:Lorg/spongycastle/crypto/tls/SecurityParameters;
.line 810
invoke-virtual {v2}, Lorg/spongycastle/crypto/tls/SecurityParameters;->getCipherSuite()I
move-result v2
.line 809
invoke-static {v1, v2}, Lorg/spongycastle/crypto/tls/TlsClientProtocol;->getPRFAlgorithm(Lorg/spongycastle/crypto/tls/TlsContext;I)I
move-result v1
iput v1, v0, Lorg/spongycastle/crypto/tls/SecurityParameters;->prfAlgorithm:I
.line 817
iget-object v0, p0, Lorg/spongycastle/crypto/tls/TlsClientProtocol;->securityParameters:Lorg/spongycastle/crypto/tls/SecurityParameters;
const/16 v1, 0xc
iput v1, v0, Lorg/spongycastle/crypto/tls/SecurityParameters;->verifyDataLength:I
.line 818
return-void
:cond_1c2
move v4, v2
.line 789
goto :goto_192
:cond_1c4
move v1, v2
.line 793
goto :goto_1a0
.end method
.method protected sendCertificateVerifyMessage(Lorg/spongycastle/crypto/tls/DigitallySigned;)V
.registers 4
.prologue
.line 823
new-instance v0, Lorg/spongycastle/crypto/tls/TlsProtocol$HandshakeMessage;
const/16 v1, 0xf
invoke-direct {v0, p0, v1}, Lorg/spongycastle/crypto/tls/TlsProtocol$HandshakeMessage;-><init>(Lorg/spongycastle/crypto/tls/TlsProtocol;S)V
.line 825
invoke-virtual {p1, v0}, Lorg/spongycastle/crypto/tls/DigitallySigned;->encode(Ljava/io/OutputStream;)V
.line 827
invoke-virtual {v0}, Lorg/spongycastle/crypto/tls/TlsProtocol$HandshakeMessage;->writeToRecordStream()V
.line 828
return-void
.end method
.method protected sendClientHelloMessage()V
.registers 10
.prologue
const/16 v8, 0x5600
const/16 v7, 0xff
const/4 v2, 0x0
const/4 v1, 0x1
.line 833
iget-object v0, p0, Lorg/spongycastle/crypto/tls/TlsClientProtocol;->recordStream:Lorg/spongycastle/crypto/tls/RecordStream;
iget-object v3, p0, Lorg/spongycastle/crypto/tls/TlsClientProtocol;->tlsClient:Lorg/spongycastle/crypto/tls/TlsClient;
invoke-interface {v3}, Lorg/spongycastle/crypto/tls/TlsClient;->getClientHelloRecordLayerVersion()Lorg/spongycastle/crypto/tls/ProtocolVersion;
move-result-object v3
invoke-virtual {v0, v3}, Lorg/spongycastle/crypto/tls/RecordStream;->setWriteVersion(Lorg/spongycastle/crypto/tls/ProtocolVersion;)V
.line 835
iget-object v0, p0, Lorg/spongycastle/crypto/tls/TlsClientProtocol;->tlsClient:Lorg/spongycastle/crypto/tls/TlsClient;
invoke-interface {v0}, Lorg/spongycastle/crypto/tls/TlsClient;->getClientVersion()Lorg/spongycastle/crypto/tls/ProtocolVersion;
move-result-object v3
.line 836
invoke-virtual {v3}, Lorg/spongycastle/crypto/tls/ProtocolVersion;->isDTLS()Z
move-result v0
if-eqz v0, :cond_25
.line 838
new-instance v0, Lorg/spongycastle/crypto/tls/TlsFatalAlert;
const/16 v1, 0x50
invoke-direct {v0, v1}, Lorg/spongycastle/crypto/tls/TlsFatalAlert;-><init>(S)V
throw v0
.line 841
:cond_25
invoke-virtual {p0}, Lorg/spongycastle/crypto/tls/TlsClientProtocol;->getContextAdmin()Lorg/spongycastle/crypto/tls/AbstractTlsContext;
move-result-object v0
invoke-virtual {v0, v3}, Lorg/spongycastle/crypto/tls/AbstractTlsContext;->setClientVersion(Lorg/spongycastle/crypto/tls/ProtocolVersion;)V
.line 847
sget-object v0, Lorg/spongycastle/crypto/tls/TlsUtils;->EMPTY_BYTES:[B
.line 848
iget-object v4, p0, Lorg/spongycastle/crypto/tls/TlsClientProtocol;->tlsSession:Lorg/spongycastle/crypto/tls/TlsSession;
if-eqz v4, :cond_41
.line 850
iget-object v0, p0, Lorg/spongycastle/crypto/tls/TlsClientProtocol;->tlsSession:Lorg/spongycastle/crypto/tls/TlsSession;
invoke-interface {v0}, Lorg/spongycastle/crypto/tls/TlsSession;->getSessionID()[B
move-result-object v0
.line 851
if-eqz v0, :cond_3f
array-length v4, v0
const/16 v5, 0x20
if-le v4, v5, :cond_41
.line 853
:cond_3f
sget-object v0, Lorg/spongycastle/crypto/tls/TlsUtils;->EMPTY_BYTES:[B
.line 857
:cond_41
iget-object v4, p0, Lorg/spongycastle/crypto/tls/TlsClientProtocol;->tlsClient:Lorg/spongycastle/crypto/tls/TlsClient;
invoke-interface {v4}, Lorg/spongycastle/crypto/tls/TlsClient;->isFallback()Z
move-result v4
.line 859
iget-object v5, p0, Lorg/spongycastle/crypto/tls/TlsClientProtocol;->tlsClient:Lorg/spongycastle/crypto/tls/TlsClient;
invoke-interface {v5}, Lorg/spongycastle/crypto/tls/TlsClient;->getCipherSuites()[I
move-result-object v5
iput-object v5, p0, Lorg/spongycastle/crypto/tls/TlsClientProtocol;->offeredCipherSuites:[I
.line 861
iget-object v5, p0, Lorg/spongycastle/crypto/tls/TlsClientProtocol;->tlsClient:Lorg/spongycastle/crypto/tls/TlsClient;
invoke-interface {v5}, Lorg/spongycastle/crypto/tls/TlsClient;->getCompressionMethods()[S
move-result-object v5
iput-object v5, p0, Lorg/spongycastle/crypto/tls/TlsClientProtocol;->offeredCompressionMethods:[S
.line 863
array-length v5, v0
if-lez v5, :cond_7c
iget-object v5, p0, Lorg/spongycastle/crypto/tls/TlsClientProtocol;->sessionParameters:Lorg/spongycastle/crypto/tls/SessionParameters;
if-eqz v5, :cond_7c
.line 865
iget-object v5, p0, Lorg/spongycastle/crypto/tls/TlsClientProtocol;->offeredCipherSuites:[I
iget-object v6, p0, Lorg/spongycastle/crypto/tls/TlsClientProtocol;->sessionParameters:Lorg/spongycastle/crypto/tls/SessionParameters;
invoke-virtual {v6}, Lorg/spongycastle/crypto/tls/SessionParameters;->getCipherSuite()I
move-result v6
invoke-static {v5, v6}, Lorg/spongycastle/util/Arrays;->contains([II)Z
move-result v5
if-eqz v5, :cond_7a
iget-object v5, p0, Lorg/spongycastle/crypto/tls/TlsClientProtocol;->offeredCompressionMethods:[S
iget-object v6, p0, Lorg/spongycastle/crypto/tls/TlsClientProtocol;->sessionParameters:Lorg/spongycastle/crypto/tls/SessionParameters;
.line 866
invoke-virtual {v6}, Lorg/spongycastle/crypto/tls/SessionParameters;->getCompressionAlgorithm()S
move-result v6
invoke-static {v5, v6}, Lorg/spongycastle/util/Arrays;->contains([SS)Z
move-result v5
if-nez v5, :cond_7c
.line 868
:cond_7a
sget-object v0, Lorg/spongycastle/crypto/tls/TlsUtils;->EMPTY_BYTES:[B
.line 872
:cond_7c
iget-object v5, p0, Lorg/spongycastle/crypto/tls/TlsClientProtocol;->tlsClient:Lorg/spongycastle/crypto/tls/TlsClient;
invoke-interface {v5}, Lorg/spongycastle/crypto/tls/TlsClient;->getClientExtensions()Ljava/util/Hashtable;
move-result-object v5
iput-object v5, p0, Lorg/spongycastle/crypto/tls/TlsClientProtocol;->clientExtensions:Ljava/util/Hashtable;
.line 874
new-instance v5, Lorg/spongycastle/crypto/tls/TlsProtocol$HandshakeMessage;
invoke-direct {v5, p0, v1}, Lorg/spongycastle/crypto/tls/TlsProtocol$HandshakeMessage;-><init>(Lorg/spongycastle/crypto/tls/TlsProtocol;S)V
.line 876
invoke-static {v3, v5}, Lorg/spongycastle/crypto/tls/TlsUtils;->writeVersion(Lorg/spongycastle/crypto/tls/ProtocolVersion;Ljava/io/OutputStream;)V
.line 878
iget-object v3, p0, Lorg/spongycastle/crypto/tls/TlsClientProtocol;->securityParameters:Lorg/spongycastle/crypto/tls/SecurityParameters;
invoke-virtual {v3}, Lorg/spongycastle/crypto/tls/SecurityParameters;->getClientRandom()[B
move-result-object v3
invoke-virtual {v5, v3}, Lorg/spongycastle/crypto/tls/TlsProtocol$HandshakeMessage;->write([B)V
.line 880
invoke-static {v0, v5}, Lorg/spongycastle/crypto/tls/TlsUtils;->writeOpaque8([BLjava/io/OutputStream;)V
.line 889
iget-object v0, p0, Lorg/spongycastle/crypto/tls/TlsClientProtocol;->clientExtensions:Ljava/util/Hashtable;
sget-object v3, Lorg/spongycastle/crypto/tls/TlsClientProtocol;->EXT_RenegotiationInfo:Ljava/lang/Integer;
invoke-static {v0, v3}, Lorg/spongycastle/crypto/tls/TlsUtils;->getExtensionData(Ljava/util/Hashtable;Ljava/lang/Integer;)[B
move-result-object v0
.line 890
if-nez v0, :cond_e0
move v0, v1
.line 892
:goto_a3
iget-object v3, p0, Lorg/spongycastle/crypto/tls/TlsClientProtocol;->offeredCipherSuites:[I
invoke-static {v3, v7}, Lorg/spongycastle/util/Arrays;->contains([II)Z
move-result v3
if-nez v3, :cond_e2
.line 894
:goto_ab
if-eqz v0, :cond_b7
if-eqz v1, :cond_b7
.line 899
iget-object v0, p0, Lorg/spongycastle/crypto/tls/TlsClientProtocol;->offeredCipherSuites:[I
invoke-static {v0, v7}, Lorg/spongycastle/util/Arrays;->append([II)[I
move-result-object v0
iput-object v0, p0, Lorg/spongycastle/crypto/tls/TlsClientProtocol;->offeredCipherSuites:[I
.line 908
:cond_b7
if-eqz v4, :cond_c9
iget-object v0, p0, Lorg/spongycastle/crypto/tls/TlsClientProtocol;->offeredCipherSuites:[I
invoke-static {v0, v8}, Lorg/spongycastle/util/Arrays;->contains([II)Z
move-result v0
if-nez v0, :cond_c9
.line 910
iget-object v0, p0, Lorg/spongycastle/crypto/tls/TlsClientProtocol;->offeredCipherSuites:[I
invoke-static {v0, v8}, Lorg/spongycastle/util/Arrays;->append([II)[I
move-result-object v0
iput-object v0, p0, Lorg/spongycastle/crypto/tls/TlsClientProtocol;->offeredCipherSuites:[I
.line 913
:cond_c9
iget-object v0, p0, Lorg/spongycastle/crypto/tls/TlsClientProtocol;->offeredCipherSuites:[I
invoke-static {v0, v5}, Lorg/spongycastle/crypto/tls/TlsUtils;->writeUint16ArrayWithUint16Length([ILjava/io/OutputStream;)V
.line 916
iget-object v0, p0, Lorg/spongycastle/crypto/tls/TlsClientProtocol;->offeredCompressionMethods:[S
invoke-static {v0, v5}, Lorg/spongycastle/crypto/tls/TlsUtils;->writeUint8ArrayWithUint8Length([SLjava/io/OutputStream;)V
.line 918
iget-object v0, p0, Lorg/spongycastle/crypto/tls/TlsClientProtocol;->clientExtensions:Ljava/util/Hashtable;
if-eqz v0, :cond_dc
.line 920
iget-object v0, p0, Lorg/spongycastle/crypto/tls/TlsClientProtocol;->clientExtensions:Ljava/util/Hashtable;
invoke-static {v5, v0}, Lorg/spongycastle/crypto/tls/TlsClientProtocol;->writeExtensions(Ljava/io/OutputStream;Ljava/util/Hashtable;)V
.line 923
:cond_dc
invoke-virtual {v5}, Lorg/spongycastle/crypto/tls/TlsProtocol$HandshakeMessage;->writeToRecordStream()V
.line 924
return-void
:cond_e0
move v0, v2
.line 890
goto :goto_a3
:cond_e2
move v1, v2
.line 892
goto :goto_ab
.end method
.method protected sendClientKeyExchangeMessage()V
.registers 3
.prologue
.line 929
new-instance v0, Lorg/spongycastle/crypto/tls/TlsProtocol$HandshakeMessage;
const/16 v1, 0x10
invoke-direct {v0, p0, v1}, Lorg/spongycastle/crypto/tls/TlsProtocol$HandshakeMessage;-><init>(Lorg/spongycastle/crypto/tls/TlsProtocol;S)V
.line 931
iget-object v1, p0, Lorg/spongycastle/crypto/tls/TlsClientProtocol;->keyExchange:Lorg/spongycastle/crypto/tls/TlsKeyExchange;
invoke-interface {v1, v0}, Lorg/spongycastle/crypto/tls/TlsKeyExchange;->generateClientKeyExchange(Ljava/io/OutputStream;)V
.line 933
invoke-virtual {v0}, Lorg/spongycastle/crypto/tls/TlsProtocol$HandshakeMessage;->writeToRecordStream()V
.line 934
return-void
.end method