TlsDHKeyExchange.smali
.class public Lorg/spongycastle/crypto/tls/TlsDHKeyExchange;
.super Lorg/spongycastle/crypto/tls/AbstractTlsKeyExchange;
.source "TlsDHKeyExchange.java"
# instance fields
.field protected agreementCredentials:Lorg/spongycastle/crypto/tls/TlsAgreementCredentials;
.field protected dhAgreePrivateKey:Lorg/spongycastle/crypto/params/DHPrivateKeyParameters;
.field protected dhAgreePublicKey:Lorg/spongycastle/crypto/params/DHPublicKeyParameters;
.field protected dhParameters:Lorg/spongycastle/crypto/params/DHParameters;
.field protected serverPublicKey:Lorg/spongycastle/crypto/params/AsymmetricKeyParameter;
.field protected tlsSigner:Lorg/spongycastle/crypto/tls/TlsSigner;
# direct methods
.method public constructor <init>(ILjava/util/Vector;Lorg/spongycastle/crypto/params/DHParameters;)V
.registers 6
.prologue
.line 34
invoke-direct {p0, p1, p2}, Lorg/spongycastle/crypto/tls/AbstractTlsKeyExchange;-><init>(ILjava/util/Vector;)V
.line 36
packed-switch p1, :pswitch_data_24
.line 49
:pswitch_6
new-instance v0, Ljava/lang/IllegalArgumentException;
const-string v1, "unsupported key exchange algorithm"
invoke-direct {v0, v1}, Ljava/lang/IllegalArgumentException;-><init>(Ljava/lang/String;)V
throw v0
.line 40
:pswitch_e
const/4 v0, 0x0
iput-object v0, p0, Lorg/spongycastle/crypto/tls/TlsDHKeyExchange;->tlsSigner:Lorg/spongycastle/crypto/tls/TlsSigner;
.line 52
:goto_11
iput-object p3, p0, Lorg/spongycastle/crypto/tls/TlsDHKeyExchange;->dhParameters:Lorg/spongycastle/crypto/params/DHParameters;
.line 53
return-void
.line 43
:pswitch_14
new-instance v0, Lorg/spongycastle/crypto/tls/TlsRSASigner;
invoke-direct {v0}, Lorg/spongycastle/crypto/tls/TlsRSASigner;-><init>()V
iput-object v0, p0, Lorg/spongycastle/crypto/tls/TlsDHKeyExchange;->tlsSigner:Lorg/spongycastle/crypto/tls/TlsSigner;
goto :goto_11
.line 46
:pswitch_1c
new-instance v0, Lorg/spongycastle/crypto/tls/TlsDSSSigner;
invoke-direct {v0}, Lorg/spongycastle/crypto/tls/TlsDSSSigner;-><init>()V
iput-object v0, p0, Lorg/spongycastle/crypto/tls/TlsDHKeyExchange;->tlsSigner:Lorg/spongycastle/crypto/tls/TlsSigner;
goto :goto_11
.line 36
:pswitch_data_24
.packed-switch 0x3
:pswitch_1c
:pswitch_6
:pswitch_14
:pswitch_6
:pswitch_e
:pswitch_6
:pswitch_e
.end packed-switch
.end method
# virtual methods
.method public generateClientKeyExchange(Ljava/io/OutputStream;)V
.registers 4
.prologue
.line 178
iget-object v0, p0, Lorg/spongycastle/crypto/tls/TlsDHKeyExchange;->agreementCredentials:Lorg/spongycastle/crypto/tls/TlsAgreementCredentials;
if-nez v0, :cond_12
.line 180
iget-object v0, p0, Lorg/spongycastle/crypto/tls/TlsDHKeyExchange;->context:Lorg/spongycastle/crypto/tls/TlsContext;
invoke-interface {v0}, Lorg/spongycastle/crypto/tls/TlsContext;->getSecureRandom()Ljava/security/SecureRandom;
move-result-object v0
iget-object v1, p0, Lorg/spongycastle/crypto/tls/TlsDHKeyExchange;->dhParameters:Lorg/spongycastle/crypto/params/DHParameters;
invoke-static {v0, v1, p1}, Lorg/spongycastle/crypto/tls/TlsDHUtils;->generateEphemeralClientKeyExchange(Ljava/security/SecureRandom;Lorg/spongycastle/crypto/params/DHParameters;Ljava/io/OutputStream;)Lorg/spongycastle/crypto/params/DHPrivateKeyParameters;
move-result-object v0
iput-object v0, p0, Lorg/spongycastle/crypto/tls/TlsDHKeyExchange;->dhAgreePrivateKey:Lorg/spongycastle/crypto/params/DHPrivateKeyParameters;
.line 183
:cond_12
return-void
.end method
.method public generatePremasterSecret()[B
.registers 3
.prologue
.line 211
iget-object v0, p0, Lorg/spongycastle/crypto/tls/TlsDHKeyExchange;->agreementCredentials:Lorg/spongycastle/crypto/tls/TlsAgreementCredentials;
if-eqz v0, :cond_d
.line 213
iget-object v0, p0, Lorg/spongycastle/crypto/tls/TlsDHKeyExchange;->agreementCredentials:Lorg/spongycastle/crypto/tls/TlsAgreementCredentials;
iget-object v1, p0, Lorg/spongycastle/crypto/tls/TlsDHKeyExchange;->dhAgreePublicKey:Lorg/spongycastle/crypto/params/DHPublicKeyParameters;
invoke-interface {v0, v1}, Lorg/spongycastle/crypto/tls/TlsAgreementCredentials;->generateAgreement(Lorg/spongycastle/crypto/params/AsymmetricKeyParameter;)[B
move-result-object v0
.line 218
:goto_c
return-object v0
.line 216
:cond_d
iget-object v0, p0, Lorg/spongycastle/crypto/tls/TlsDHKeyExchange;->dhAgreePrivateKey:Lorg/spongycastle/crypto/params/DHPrivateKeyParameters;
if-eqz v0, :cond_1a
.line 218
iget-object v0, p0, Lorg/spongycastle/crypto/tls/TlsDHKeyExchange;->dhAgreePublicKey:Lorg/spongycastle/crypto/params/DHPublicKeyParameters;
iget-object v1, p0, Lorg/spongycastle/crypto/tls/TlsDHKeyExchange;->dhAgreePrivateKey:Lorg/spongycastle/crypto/params/DHPrivateKeyParameters;
invoke-static {v0, v1}, Lorg/spongycastle/crypto/tls/TlsDHUtils;->calculateDHBasicAgreement(Lorg/spongycastle/crypto/params/DHPublicKeyParameters;Lorg/spongycastle/crypto/params/DHPrivateKeyParameters;)[B
move-result-object v0
goto :goto_c
.line 221
:cond_1a
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
.end method
.method protected getMinimumPrimeBits()I
.registers 2
.prologue
.line 226
const/16 v0, 0x400
return v0
.end method
.method public init(Lorg/spongycastle/crypto/tls/TlsContext;)V
.registers 3
.prologue
.line 57
invoke-super {p0, p1}, Lorg/spongycastle/crypto/tls/AbstractTlsKeyExchange;->init(Lorg/spongycastle/crypto/tls/TlsContext;)V
.line 59
iget-object v0, p0, Lorg/spongycastle/crypto/tls/TlsDHKeyExchange;->tlsSigner:Lorg/spongycastle/crypto/tls/TlsSigner;
if-eqz v0, :cond_c
.line 61
iget-object v0, p0, Lorg/spongycastle/crypto/tls/TlsDHKeyExchange;->tlsSigner:Lorg/spongycastle/crypto/tls/TlsSigner;
invoke-interface {v0, p1}, Lorg/spongycastle/crypto/tls/TlsSigner;->init(Lorg/spongycastle/crypto/tls/TlsContext;)V
.line 63
:cond_c
return-void
.end method
.method public processClientCertificate(Lorg/spongycastle/crypto/tls/Certificate;)V
.registers 2
.prologue
.line 193
return-void
.end method
.method public processClientCredentials(Lorg/spongycastle/crypto/tls/TlsCredentials;)V
.registers 4
.prologue
.line 154
instance-of v0, p1, Lorg/spongycastle/crypto/tls/TlsAgreementCredentials;
if-eqz v0, :cond_9
.line 158
check-cast p1, Lorg/spongycastle/crypto/tls/TlsAgreementCredentials;
iput-object p1, p0, Lorg/spongycastle/crypto/tls/TlsDHKeyExchange;->agreementCredentials:Lorg/spongycastle/crypto/tls/TlsAgreementCredentials;
.line 168
:cond_8
return-void
.line 160
:cond_9
instance-of v0, p1, Lorg/spongycastle/crypto/tls/TlsSignerCredentials;
if-nez v0, :cond_8
.line 166
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
.end method
.method public processClientKeyExchange(Ljava/io/InputStream;)V
.registers 5
.prologue
.line 197
iget-object v0, p0, Lorg/spongycastle/crypto/tls/TlsDHKeyExchange;->dhAgreePublicKey:Lorg/spongycastle/crypto/params/DHPublicKeyParameters;
if-eqz v0, :cond_5
.line 206
:goto_4
return-void
.line 203
:cond_5
invoke-static {p1}, Lorg/spongycastle/crypto/tls/TlsDHUtils;->readDHParameter(Ljava/io/InputStream;)Ljava/math/BigInteger;
move-result-object v0
.line 205
new-instance v1, Lorg/spongycastle/crypto/params/DHPublicKeyParameters;
iget-object v2, p0, Lorg/spongycastle/crypto/tls/TlsDHKeyExchange;->dhParameters:Lorg/spongycastle/crypto/params/DHParameters;
invoke-direct {v1, v0, v2}, Lorg/spongycastle/crypto/params/DHPublicKeyParameters;-><init>(Ljava/math/BigInteger;Lorg/spongycastle/crypto/params/DHParameters;)V
invoke-static {v1}, Lorg/spongycastle/crypto/tls/TlsDHUtils;->validateDHPublicKey(Lorg/spongycastle/crypto/params/DHPublicKeyParameters;)Lorg/spongycastle/crypto/params/DHPublicKeyParameters;
move-result-object v0
iput-object v0, p0, Lorg/spongycastle/crypto/tls/TlsDHKeyExchange;->dhAgreePublicKey:Lorg/spongycastle/crypto/params/DHPublicKeyParameters;
goto :goto_4
.end method
.method public processServerCertificate(Lorg/spongycastle/crypto/tls/Certificate;)V
.registers 6
.prologue
const/16 v3, 0x2e
.line 74
invoke-virtual {p1}, Lorg/spongycastle/crypto/tls/Certificate;->isEmpty()Z
move-result v0
if-eqz v0, :cond_10
.line 76
new-instance v0, Lorg/spongycastle/crypto/tls/TlsFatalAlert;
const/16 v1, 0x2a
invoke-direct {v0, v1}, Lorg/spongycastle/crypto/tls/TlsFatalAlert;-><init>(S)V
throw v0
.line 79
:cond_10
const/4 v0, 0x0
invoke-virtual {p1, v0}, Lorg/spongycastle/crypto/tls/Certificate;->getCertificateAt(I)Lorg/spongycastle/asn1/x509/Certificate;
move-result-object v1
.line 81
invoke-virtual {v1}, Lorg/spongycastle/asn1/x509/Certificate;->getSubjectPublicKeyInfo()Lorg/spongycastle/asn1/x509/SubjectPublicKeyInfo;
move-result-object v0
.line 84
:try_start_19
invoke-static {v0}, Lorg/spongycastle/crypto/util/PublicKeyFactory;->createKey(Lorg/spongycastle/asn1/x509/SubjectPublicKeyInfo;)Lorg/spongycastle/crypto/params/AsymmetricKeyParameter;
move-result-object v0
iput-object v0, p0, Lorg/spongycastle/crypto/tls/TlsDHKeyExchange;->serverPublicKey:Lorg/spongycastle/crypto/params/AsymmetricKeyParameter;
:try_end_1f
.catch Ljava/lang/RuntimeException; {:try_start_19 .. :try_end_1f} :catch_42
.line 91
iget-object v0, p0, Lorg/spongycastle/crypto/tls/TlsDHKeyExchange;->tlsSigner:Lorg/spongycastle/crypto/tls/TlsSigner;
if-nez v0, :cond_52
.line 95
:try_start_23
iget-object v0, p0, Lorg/spongycastle/crypto/tls/TlsDHKeyExchange;->serverPublicKey:Lorg/spongycastle/crypto/params/AsymmetricKeyParameter;
check-cast v0, Lorg/spongycastle/crypto/params/DHPublicKeyParameters;
invoke-static {v0}, Lorg/spongycastle/crypto/tls/TlsDHUtils;->validateDHPublicKey(Lorg/spongycastle/crypto/params/DHPublicKeyParameters;)Lorg/spongycastle/crypto/params/DHPublicKeyParameters;
move-result-object v0
iput-object v0, p0, Lorg/spongycastle/crypto/tls/TlsDHKeyExchange;->dhAgreePublicKey:Lorg/spongycastle/crypto/params/DHPublicKeyParameters;
.line 96
iget-object v0, p0, Lorg/spongycastle/crypto/tls/TlsDHKeyExchange;->dhAgreePublicKey:Lorg/spongycastle/crypto/params/DHPublicKeyParameters;
invoke-virtual {v0}, Lorg/spongycastle/crypto/params/DHPublicKeyParameters;->getParameters()Lorg/spongycastle/crypto/params/DHParameters;
move-result-object v0
invoke-virtual {p0, v0}, Lorg/spongycastle/crypto/tls/TlsDHKeyExchange;->validateDHParameters(Lorg/spongycastle/crypto/params/DHParameters;)Lorg/spongycastle/crypto/params/DHParameters;
move-result-object v0
iput-object v0, p0, Lorg/spongycastle/crypto/tls/TlsDHKeyExchange;->dhParameters:Lorg/spongycastle/crypto/params/DHParameters;
:try_end_39
.catch Ljava/lang/ClassCastException; {:try_start_23 .. :try_end_39} :catch_4b
.line 103
const/16 v0, 0x8
invoke-static {v1, v0}, Lorg/spongycastle/crypto/tls/TlsUtils;->validateKeyUsage(Lorg/spongycastle/asn1/x509/Certificate;I)V
.line 115
:goto_3e
invoke-super {p0, p1}, Lorg/spongycastle/crypto/tls/AbstractTlsKeyExchange;->processServerCertificate(Lorg/spongycastle/crypto/tls/Certificate;)V
.line 116
return-void
.line 86
:catch_42
move-exception v0
.line 88
new-instance v1, Lorg/spongycastle/crypto/tls/TlsFatalAlert;
const/16 v2, 0x2b
invoke-direct {v1, v2, v0}, Lorg/spongycastle/crypto/tls/TlsFatalAlert;-><init>(SLjava/lang/Throwable;)V
throw v1
.line 98
:catch_4b
move-exception v0
.line 100
new-instance v1, Lorg/spongycastle/crypto/tls/TlsFatalAlert;
invoke-direct {v1, v3, v0}, Lorg/spongycastle/crypto/tls/TlsFatalAlert;-><init>(SLjava/lang/Throwable;)V
throw v1
.line 107
:cond_52
iget-object v0, p0, Lorg/spongycastle/crypto/tls/TlsDHKeyExchange;->tlsSigner:Lorg/spongycastle/crypto/tls/TlsSigner;
iget-object v2, p0, Lorg/spongycastle/crypto/tls/TlsDHKeyExchange;->serverPublicKey:Lorg/spongycastle/crypto/params/AsymmetricKeyParameter;
invoke-interface {v0, v2}, Lorg/spongycastle/crypto/tls/TlsSigner;->isValidPublicKey(Lorg/spongycastle/crypto/params/AsymmetricKeyParameter;)Z
move-result v0
if-nez v0, :cond_62
.line 109
new-instance v0, Lorg/spongycastle/crypto/tls/TlsFatalAlert;
invoke-direct {v0, v3}, Lorg/spongycastle/crypto/tls/TlsFatalAlert;-><init>(S)V
throw v0
.line 112
:cond_62
const/16 v0, 0x80
invoke-static {v1, v0}, Lorg/spongycastle/crypto/tls/TlsUtils;->validateKeyUsage(Lorg/spongycastle/asn1/x509/Certificate;I)V
goto :goto_3e
.end method
.method public requiresServerKeyExchange()Z
.registers 2
.prologue
.line 120
iget v0, p0, Lorg/spongycastle/crypto/tls/TlsDHKeyExchange;->keyExchange:I
sparse-switch v0, :sswitch_data_a
.line 127
const/4 v0, 0x0
:goto_6
return v0
.line 125
:sswitch_7
const/4 v0, 0x1
goto :goto_6
.line 120
nop
:sswitch_data_a
.sparse-switch
0x3 -> :sswitch_7
0x5 -> :sswitch_7
0xb -> :sswitch_7
.end sparse-switch
.end method
.method public skipServerCredentials()V
.registers 3
.prologue
.line 68
new-instance v0, Lorg/spongycastle/crypto/tls/TlsFatalAlert;
const/16 v1, 0xa
invoke-direct {v0, v1}, Lorg/spongycastle/crypto/tls/TlsFatalAlert;-><init>(S)V
throw v0
.end method
.method public validateCertificateRequest(Lorg/spongycastle/crypto/tls/CertificateRequest;)V
.registers 5
.prologue
.line 134
invoke-virtual {p1}, Lorg/spongycastle/crypto/tls/CertificateRequest;->getCertificateTypes()[S
move-result-object v1
.line 135
const/4 v0, 0x0
:goto_5
array-length v2, v1
if-ge v0, v2, :cond_18
.line 137
aget-short v2, v1, v0
sparse-switch v2, :sswitch_data_1a
.line 146
new-instance v0, Lorg/spongycastle/crypto/tls/TlsFatalAlert;
const/16 v1, 0x2f
invoke-direct {v0, v1}, Lorg/spongycastle/crypto/tls/TlsFatalAlert;-><init>(S)V
throw v0
.line 135
:sswitch_15
add-int/lit8 v0, v0, 0x1
goto :goto_5
.line 149
:cond_18
return-void
.line 137
nop
:sswitch_data_1a
.sparse-switch
0x1 -> :sswitch_15
0x2 -> :sswitch_15
0x3 -> :sswitch_15
0x4 -> :sswitch_15
0x40 -> :sswitch_15
.end sparse-switch
.end method
.method protected validateDHParameters(Lorg/spongycastle/crypto/params/DHParameters;)Lorg/spongycastle/crypto/params/DHParameters;
.registers 4
.prologue
.line 231
invoke-virtual {p1}, Lorg/spongycastle/crypto/params/DHParameters;->getP()Ljava/math/BigInteger;
move-result-object v0
invoke-virtual {v0}, Ljava/math/BigInteger;->bitLength()I
move-result v0
invoke-virtual {p0}, Lorg/spongycastle/crypto/tls/TlsDHKeyExchange;->getMinimumPrimeBits()I
move-result v1
if-ge v0, v1, :cond_16
.line 233
new-instance v0, Lorg/spongycastle/crypto/tls/TlsFatalAlert;
const/16 v1, 0x47
invoke-direct {v0, v1}, Lorg/spongycastle/crypto/tls/TlsFatalAlert;-><init>(S)V
throw v0
.line 236
:cond_16
invoke-static {p1}, Lorg/spongycastle/crypto/tls/TlsDHUtils;->validateDHParameters(Lorg/spongycastle/crypto/params/DHParameters;)Lorg/spongycastle/crypto/params/DHParameters;
move-result-object v0
return-object v0
.end method