TlsECDHEKeyExchange.smali
.class public Lorg/spongycastle/crypto/tls/TlsECDHEKeyExchange;
.super Lorg/spongycastle/crypto/tls/TlsECDHKeyExchange;
.source "TlsECDHEKeyExchange.java"
# instance fields
.field protected serverCredentials:Lorg/spongycastle/crypto/tls/TlsSignerCredentials;
# direct methods
.method public constructor <init>(ILjava/util/Vector;[I[S[S)V
.registers 7
.prologue
.line 23
invoke-direct/range {p0 .. p5}, Lorg/spongycastle/crypto/tls/TlsECDHKeyExchange;-><init>(ILjava/util/Vector;[I[S[S)V
.line 18
const/4 v0, 0x0
iput-object v0, p0, Lorg/spongycastle/crypto/tls/TlsECDHEKeyExchange;->serverCredentials:Lorg/spongycastle/crypto/tls/TlsSignerCredentials;
.line 24
return-void
.end method
# virtual methods
.method public generateServerKeyExchange()[B
.registers 8
.prologue
const/4 v6, 0x0
.line 42
new-instance v0, Lorg/spongycastle/crypto/tls/DigestInputBuffer;
invoke-direct {v0}, Lorg/spongycastle/crypto/tls/DigestInputBuffer;-><init>()V
.line 44
iget-object v1, p0, Lorg/spongycastle/crypto/tls/TlsECDHEKeyExchange;->context:Lorg/spongycastle/crypto/tls/TlsContext;
invoke-interface {v1}, Lorg/spongycastle/crypto/tls/TlsContext;->getSecureRandom()Ljava/security/SecureRandom;
move-result-object v1
iget-object v2, p0, Lorg/spongycastle/crypto/tls/TlsECDHEKeyExchange;->namedCurves:[I
iget-object v3, p0, Lorg/spongycastle/crypto/tls/TlsECDHEKeyExchange;->clientECPointFormats:[S
invoke-static {v1, v2, v3, v0}, Lorg/spongycastle/crypto/tls/TlsECCUtils;->generateEphemeralServerKeyExchange(Ljava/security/SecureRandom;[I[SLjava/io/OutputStream;)Lorg/spongycastle/crypto/params/ECPrivateKeyParameters;
move-result-object v1
iput-object v1, p0, Lorg/spongycastle/crypto/tls/TlsECDHEKeyExchange;->ecAgreePrivateKey:Lorg/spongycastle/crypto/params/ECPrivateKeyParameters;
.line 50
iget-object v1, p0, Lorg/spongycastle/crypto/tls/TlsECDHEKeyExchange;->context:Lorg/spongycastle/crypto/tls/TlsContext;
iget-object v2, p0, Lorg/spongycastle/crypto/tls/TlsECDHEKeyExchange;->serverCredentials:Lorg/spongycastle/crypto/tls/TlsSignerCredentials;
invoke-static {v1, v2}, Lorg/spongycastle/crypto/tls/TlsUtils;->getSignatureAndHashAlgorithm(Lorg/spongycastle/crypto/tls/TlsContext;Lorg/spongycastle/crypto/tls/TlsSignerCredentials;)Lorg/spongycastle/crypto/tls/SignatureAndHashAlgorithm;
move-result-object v1
.line 53
invoke-static {v1}, Lorg/spongycastle/crypto/tls/TlsUtils;->createHash(Lorg/spongycastle/crypto/tls/SignatureAndHashAlgorithm;)Lorg/spongycastle/crypto/Digest;
move-result-object v2
.line 55
iget-object v3, p0, Lorg/spongycastle/crypto/tls/TlsECDHEKeyExchange;->context:Lorg/spongycastle/crypto/tls/TlsContext;
invoke-interface {v3}, Lorg/spongycastle/crypto/tls/TlsContext;->getSecurityParameters()Lorg/spongycastle/crypto/tls/SecurityParameters;
move-result-object v3
.line 56
iget-object v4, v3, Lorg/spongycastle/crypto/tls/SecurityParameters;->clientRandom:[B
iget-object v5, v3, Lorg/spongycastle/crypto/tls/SecurityParameters;->clientRandom:[B
array-length v5, v5
invoke-interface {v2, v4, v6, v5}, Lorg/spongycastle/crypto/Digest;->update([BII)V
.line 57
iget-object v4, v3, Lorg/spongycastle/crypto/tls/SecurityParameters;->serverRandom:[B
iget-object v3, v3, Lorg/spongycastle/crypto/tls/SecurityParameters;->serverRandom:[B
array-length v3, v3
invoke-interface {v2, v4, v6, v3}, Lorg/spongycastle/crypto/Digest;->update([BII)V
.line 58
invoke-virtual {v0, v2}, Lorg/spongycastle/crypto/tls/DigestInputBuffer;->updateDigest(Lorg/spongycastle/crypto/Digest;)V
.line 60
invoke-interface {v2}, Lorg/spongycastle/crypto/Digest;->getDigestSize()I
move-result v3
new-array v3, v3, [B
.line 61
invoke-interface {v2, v3, v6}, Lorg/spongycastle/crypto/Digest;->doFinal([BI)I
.line 63
iget-object v2, p0, Lorg/spongycastle/crypto/tls/TlsECDHEKeyExchange;->serverCredentials:Lorg/spongycastle/crypto/tls/TlsSignerCredentials;
invoke-interface {v2, v3}, Lorg/spongycastle/crypto/tls/TlsSignerCredentials;->generateCertificateSignature([B)[B
move-result-object v2
.line 65
new-instance v3, Lorg/spongycastle/crypto/tls/DigitallySigned;
invoke-direct {v3, v1, v2}, Lorg/spongycastle/crypto/tls/DigitallySigned;-><init>(Lorg/spongycastle/crypto/tls/SignatureAndHashAlgorithm;[B)V
.line 66
invoke-virtual {v3, v0}, Lorg/spongycastle/crypto/tls/DigitallySigned;->encode(Ljava/io/OutputStream;)V
.line 68
invoke-virtual {v0}, Lorg/spongycastle/crypto/tls/DigestInputBuffer;->toByteArray()[B
move-result-object v0
return-object v0
.end method
.method protected initVerifyer(Lorg/spongycastle/crypto/tls/TlsSigner;Lorg/spongycastle/crypto/tls/SignatureAndHashAlgorithm;Lorg/spongycastle/crypto/tls/SecurityParameters;)Lorg/spongycastle/crypto/Signer;
.registers 8
.prologue
const/4 v3, 0x0
.line 135
iget-object v0, p0, Lorg/spongycastle/crypto/tls/TlsECDHEKeyExchange;->serverPublicKey:Lorg/spongycastle/crypto/params/AsymmetricKeyParameter;
invoke-interface {p1, p2, v0}, Lorg/spongycastle/crypto/tls/TlsSigner;->createVerifyer(Lorg/spongycastle/crypto/tls/SignatureAndHashAlgorithm;Lorg/spongycastle/crypto/params/AsymmetricKeyParameter;)Lorg/spongycastle/crypto/Signer;
move-result-object v0
.line 136
iget-object v1, p3, Lorg/spongycastle/crypto/tls/SecurityParameters;->clientRandom:[B
iget-object v2, p3, Lorg/spongycastle/crypto/tls/SecurityParameters;->clientRandom:[B
array-length v2, v2
invoke-interface {v0, v1, v3, v2}, Lorg/spongycastle/crypto/Signer;->update([BII)V
.line 137
iget-object v1, p3, Lorg/spongycastle/crypto/tls/SecurityParameters;->serverRandom:[B
iget-object v2, p3, Lorg/spongycastle/crypto/tls/SecurityParameters;->serverRandom:[B
array-length v2, v2
invoke-interface {v0, v1, v3, v2}, Lorg/spongycastle/crypto/Signer;->update([BII)V
.line 138
return-object v0
.end method
.method public processClientCredentials(Lorg/spongycastle/crypto/tls/TlsCredentials;)V
.registers 4
.prologue
.line 123
instance-of v0, p1, Lorg/spongycastle/crypto/tls/TlsSignerCredentials;
if-nez v0, :cond_c
.line 129
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 131
:cond_c
return-void
.end method
.method public processServerCredentials(Lorg/spongycastle/crypto/tls/TlsCredentials;)V
.registers 4
.prologue
.line 29
instance-of v0, p1, Lorg/spongycastle/crypto/tls/TlsSignerCredentials;
if-nez v0, :cond_c
.line 31
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 34
:cond_c
invoke-interface {p1}, Lorg/spongycastle/crypto/tls/TlsCredentials;->getCertificate()Lorg/spongycastle/crypto/tls/Certificate;
move-result-object v0
invoke-virtual {p0, v0}, Lorg/spongycastle/crypto/tls/TlsECDHEKeyExchange;->processServerCertificate(Lorg/spongycastle/crypto/tls/Certificate;)V
.line 36
check-cast p1, Lorg/spongycastle/crypto/tls/TlsSignerCredentials;
iput-object p1, p0, Lorg/spongycastle/crypto/tls/TlsECDHEKeyExchange;->serverCredentials:Lorg/spongycastle/crypto/tls/TlsSignerCredentials;
.line 37
return-void
.end method
.method public processServerKeyExchange(Ljava/io/InputStream;)V
.registers 9
.prologue
.line 74
iget-object v0, p0, Lorg/spongycastle/crypto/tls/TlsECDHEKeyExchange;->context:Lorg/spongycastle/crypto/tls/TlsContext;
invoke-interface {v0}, Lorg/spongycastle/crypto/tls/TlsContext;->getSecurityParameters()Lorg/spongycastle/crypto/tls/SecurityParameters;
move-result-object v0
.line 76
new-instance v1, Lorg/spongycastle/crypto/tls/SignerInputBuffer;
invoke-direct {v1}, Lorg/spongycastle/crypto/tls/SignerInputBuffer;-><init>()V
.line 77
new-instance v2, Lorg/spongycastle/util/io/TeeInputStream;
invoke-direct {v2, p1, v1}, Lorg/spongycastle/util/io/TeeInputStream;-><init>(Ljava/io/InputStream;Ljava/io/OutputStream;)V
.line 79
iget-object v3, p0, Lorg/spongycastle/crypto/tls/TlsECDHEKeyExchange;->namedCurves:[I
iget-object v4, p0, Lorg/spongycastle/crypto/tls/TlsECDHEKeyExchange;->clientECPointFormats:[S
invoke-static {v3, v4, v2}, Lorg/spongycastle/crypto/tls/TlsECCUtils;->readECParameters([I[SLjava/io/InputStream;)Lorg/spongycastle/crypto/params/ECDomainParameters;
move-result-object v3
.line 81
invoke-static {v2}, Lorg/spongycastle/crypto/tls/TlsUtils;->readOpaque8(Ljava/io/InputStream;)[B
move-result-object v2
.line 83
invoke-virtual {p0, p1}, Lorg/spongycastle/crypto/tls/TlsECDHEKeyExchange;->parseSignature(Ljava/io/InputStream;)Lorg/spongycastle/crypto/tls/DigitallySigned;
move-result-object v4
.line 85
iget-object v5, p0, Lorg/spongycastle/crypto/tls/TlsECDHEKeyExchange;->tlsSigner:Lorg/spongycastle/crypto/tls/TlsSigner;
invoke-virtual {v4}, Lorg/spongycastle/crypto/tls/DigitallySigned;->getAlgorithm()Lorg/spongycastle/crypto/tls/SignatureAndHashAlgorithm;
move-result-object v6
invoke-virtual {p0, v5, v6, v0}, Lorg/spongycastle/crypto/tls/TlsECDHEKeyExchange;->initVerifyer(Lorg/spongycastle/crypto/tls/TlsSigner;Lorg/spongycastle/crypto/tls/SignatureAndHashAlgorithm;Lorg/spongycastle/crypto/tls/SecurityParameters;)Lorg/spongycastle/crypto/Signer;
move-result-object v0
.line 86
invoke-virtual {v1, v0}, Lorg/spongycastle/crypto/tls/SignerInputBuffer;->updateSigner(Lorg/spongycastle/crypto/Signer;)V
.line 87
invoke-virtual {v4}, Lorg/spongycastle/crypto/tls/DigitallySigned;->getSignature()[B
move-result-object v1
invoke-interface {v0, v1}, Lorg/spongycastle/crypto/Signer;->verifySignature([B)Z
move-result v0
if-nez v0, :cond_3f
.line 89
new-instance v0, Lorg/spongycastle/crypto/tls/TlsFatalAlert;
const/16 v1, 0x33
invoke-direct {v0, v1}, Lorg/spongycastle/crypto/tls/TlsFatalAlert;-><init>(S)V
throw v0
.line 92
:cond_3f
iget-object v0, p0, Lorg/spongycastle/crypto/tls/TlsECDHEKeyExchange;->clientECPointFormats:[S
invoke-static {v0, v3, v2}, Lorg/spongycastle/crypto/tls/TlsECCUtils;->deserializeECPublicKey([SLorg/spongycastle/crypto/params/ECDomainParameters;[B)Lorg/spongycastle/crypto/params/ECPublicKeyParameters;
move-result-object v0
invoke-static {v0}, Lorg/spongycastle/crypto/tls/TlsECCUtils;->validateECPublicKey(Lorg/spongycastle/crypto/params/ECPublicKeyParameters;)Lorg/spongycastle/crypto/params/ECPublicKeyParameters;
move-result-object v0
iput-object v0, p0, Lorg/spongycastle/crypto/tls/TlsECDHEKeyExchange;->ecAgreePublicKey:Lorg/spongycastle/crypto/params/ECPublicKeyParameters;
.line 94
return-void
.end method
.method public validateCertificateRequest(Lorg/spongycastle/crypto/tls/CertificateRequest;)V
.registers 5
.prologue
.line 105
invoke-virtual {p1}, Lorg/spongycastle/crypto/tls/CertificateRequest;->getCertificateTypes()[S
move-result-object v1
.line 106
const/4 v0, 0x0
:goto_5
array-length v2, v1
if-ge v0, v2, :cond_18
.line 108
aget-short v2, v1, v0
sparse-switch v2, :sswitch_data_1a
.line 115
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 106
:sswitch_15
add-int/lit8 v0, v0, 0x1
goto :goto_5
.line 118
:cond_18
return-void
.line 108
nop
:sswitch_data_1a
.sparse-switch
0x1 -> :sswitch_15
0x2 -> :sswitch_15
0x40 -> :sswitch_15
.end sparse-switch
.end method