ConscryptEngine.smali
.class final Lorg/conscrypt/ConscryptEngine;
.super Lorg/conscrypt/AbstractConscryptEngine;
.source ""
# interfaces
.implements Lorg/conscrypt/NativeCrypto$SSLHandshakeCallbacks;
.implements Lorg/conscrypt/SSLParametersImpl$AliasChooser;
.implements Lorg/conscrypt/SSLParametersImpl$PSKCallbacks;
# static fields
.field private static final CLOSED_NOT_HANDSHAKING:Ljavax/net/ssl/SSLEngineResult;
.field private static final NEED_UNWRAP_CLOSED:Ljavax/net/ssl/SSLEngineResult;
.field private static final NEED_UNWRAP_OK:Ljavax/net/ssl/SSLEngineResult;
.field private static final NEED_WRAP_CLOSED:Ljavax/net/ssl/SSLEngineResult;
.field private static final NEED_WRAP_OK:Ljavax/net/ssl/SSLEngineResult;
.field private static defaultBufferAllocator:Lorg/conscrypt/BufferAllocator;
# instance fields
.field private activeSession:Lorg/conscrypt/ActiveSession;
.field private bufferAllocator:Lorg/conscrypt/BufferAllocator;
.field private channelIdPrivateKey:Lorg/conscrypt/OpenSSLKey;
.field private closedSession:Lorg/conscrypt/SessionSnapshot;
.field private final externalSession:Ljavax/net/ssl/SSLSession;
.field private handshakeFinished:Z
.field private handshakeListener:Lorg/conscrypt/HandshakeListener;
.field private lazyDirectBuffer:Ljava/nio/ByteBuffer;
.field private maxSealOverhead:I
.field private final networkBio:Lorg/conscrypt/NativeSsl$BioWrapper;
.field private peerHostname:Ljava/lang/String;
.field private final peerInfoProvider:Lorg/conscrypt/PeerInfoProvider;
.field private final singleDstBuffer:[Ljava/nio/ByteBuffer;
.field private final singleSrcBuffer:[Ljava/nio/ByteBuffer;
.field private final ssl:Lorg/conscrypt/NativeSsl;
.field private final sslParameters:Lorg/conscrypt/SSLParametersImpl;
.field private state:I
# direct methods
.method static constructor <clinit>()V
.registers 4
new-instance v0, Ljavax/net/ssl/SSLEngineResult;
sget-object v1, Ljavax/net/ssl/SSLEngineResult$Status;->OK:Ljavax/net/ssl/SSLEngineResult$Status;
sget-object v2, Ljavax/net/ssl/SSLEngineResult$HandshakeStatus;->NEED_UNWRAP:Ljavax/net/ssl/SSLEngineResult$HandshakeStatus;
const/4 v3, 0x0
invoke-direct {v0, v1, v2, v3, v3}, Ljavax/net/ssl/SSLEngineResult;-><init>(Ljavax/net/ssl/SSLEngineResult$Status;Ljavax/net/ssl/SSLEngineResult$HandshakeStatus;II)V
sput-object v0, Lorg/conscrypt/ConscryptEngine;->NEED_UNWRAP_OK:Ljavax/net/ssl/SSLEngineResult;
new-instance v0, Ljavax/net/ssl/SSLEngineResult;
sget-object v1, Ljavax/net/ssl/SSLEngineResult$Status;->CLOSED:Ljavax/net/ssl/SSLEngineResult$Status;
sget-object v2, Ljavax/net/ssl/SSLEngineResult$HandshakeStatus;->NEED_UNWRAP:Ljavax/net/ssl/SSLEngineResult$HandshakeStatus;
invoke-direct {v0, v1, v2, v3, v3}, Ljavax/net/ssl/SSLEngineResult;-><init>(Ljavax/net/ssl/SSLEngineResult$Status;Ljavax/net/ssl/SSLEngineResult$HandshakeStatus;II)V
sput-object v0, Lorg/conscrypt/ConscryptEngine;->NEED_UNWRAP_CLOSED:Ljavax/net/ssl/SSLEngineResult;
new-instance v0, Ljavax/net/ssl/SSLEngineResult;
sget-object v1, Ljavax/net/ssl/SSLEngineResult$Status;->OK:Ljavax/net/ssl/SSLEngineResult$Status;
sget-object v2, Ljavax/net/ssl/SSLEngineResult$HandshakeStatus;->NEED_WRAP:Ljavax/net/ssl/SSLEngineResult$HandshakeStatus;
invoke-direct {v0, v1, v2, v3, v3}, Ljavax/net/ssl/SSLEngineResult;-><init>(Ljavax/net/ssl/SSLEngineResult$Status;Ljavax/net/ssl/SSLEngineResult$HandshakeStatus;II)V
sput-object v0, Lorg/conscrypt/ConscryptEngine;->NEED_WRAP_OK:Ljavax/net/ssl/SSLEngineResult;
new-instance v0, Ljavax/net/ssl/SSLEngineResult;
sget-object v1, Ljavax/net/ssl/SSLEngineResult$Status;->CLOSED:Ljavax/net/ssl/SSLEngineResult$Status;
sget-object v2, Ljavax/net/ssl/SSLEngineResult$HandshakeStatus;->NEED_WRAP:Ljavax/net/ssl/SSLEngineResult$HandshakeStatus;
invoke-direct {v0, v1, v2, v3, v3}, Ljavax/net/ssl/SSLEngineResult;-><init>(Ljavax/net/ssl/SSLEngineResult$Status;Ljavax/net/ssl/SSLEngineResult$HandshakeStatus;II)V
sput-object v0, Lorg/conscrypt/ConscryptEngine;->NEED_WRAP_CLOSED:Ljavax/net/ssl/SSLEngineResult;
new-instance v0, Ljavax/net/ssl/SSLEngineResult;
sget-object v1, Ljavax/net/ssl/SSLEngineResult$Status;->CLOSED:Ljavax/net/ssl/SSLEngineResult$Status;
sget-object v2, Ljavax/net/ssl/SSLEngineResult$HandshakeStatus;->NOT_HANDSHAKING:Ljavax/net/ssl/SSLEngineResult$HandshakeStatus;
invoke-direct {v0, v1, v2, v3, v3}, Ljavax/net/ssl/SSLEngineResult;-><init>(Ljavax/net/ssl/SSLEngineResult$Status;Ljavax/net/ssl/SSLEngineResult$HandshakeStatus;II)V
sput-object v0, Lorg/conscrypt/ConscryptEngine;->CLOSED_NOT_HANDSHAKING:Ljavax/net/ssl/SSLEngineResult;
const/4 v0, 0x0
sput-object v0, Lorg/conscrypt/ConscryptEngine;->defaultBufferAllocator:Lorg/conscrypt/BufferAllocator;
return-void
.end method
.method constructor <init>(Ljava/lang/String;ILorg/conscrypt/SSLParametersImpl;)V
.registers 6
invoke-direct {p0}, Lorg/conscrypt/AbstractConscryptEngine;-><init>()V
sget-object v0, Lorg/conscrypt/ConscryptEngine;->defaultBufferAllocator:Lorg/conscrypt/BufferAllocator;
iput-object v0, p0, Lorg/conscrypt/ConscryptEngine;->bufferAllocator:Lorg/conscrypt/BufferAllocator;
const/4 v0, 0x0
iput v0, p0, Lorg/conscrypt/ConscryptEngine;->state:I
new-instance v0, Lorg/conscrypt/ExternalSession;
new-instance v1, Lorg/conscrypt/ConscryptEngine$1;
invoke-direct {v1, p0}, Lorg/conscrypt/ConscryptEngine$1;-><init>(Lorg/conscrypt/ConscryptEngine;)V
invoke-direct {v0, v1}, Lorg/conscrypt/ExternalSession;-><init>(Lorg/conscrypt/ExternalSession$Provider;)V
invoke-static {v0}, Lorg/conscrypt/Platform;->wrapSSLSession(Lorg/conscrypt/ExternalSession;)Ljavax/net/ssl/SSLSession;
move-result-object v0
iput-object v0, p0, Lorg/conscrypt/ConscryptEngine;->externalSession:Ljavax/net/ssl/SSLSession;
const/4 v0, 0x1
new-array v1, v0, [Ljava/nio/ByteBuffer;
iput-object v1, p0, Lorg/conscrypt/ConscryptEngine;->singleSrcBuffer:[Ljava/nio/ByteBuffer;
new-array v0, v0, [Ljava/nio/ByteBuffer;
iput-object v0, p0, Lorg/conscrypt/ConscryptEngine;->singleDstBuffer:[Ljava/nio/ByteBuffer;
iput-object p3, p0, Lorg/conscrypt/ConscryptEngine;->sslParameters:Lorg/conscrypt/SSLParametersImpl;
invoke-static {p1, p2}, Lorg/conscrypt/PeerInfoProvider;->forHostAndPort(Ljava/lang/String;I)Lorg/conscrypt/PeerInfoProvider;
move-result-object p1
iput-object p1, p0, Lorg/conscrypt/ConscryptEngine;->peerInfoProvider:Lorg/conscrypt/PeerInfoProvider;
invoke-static {p3, p0, p0}, Lorg/conscrypt/ConscryptEngine;->newSsl(Lorg/conscrypt/SSLParametersImpl;Lorg/conscrypt/ConscryptEngine;Lorg/conscrypt/SSLParametersImpl$AliasChooser;)Lorg/conscrypt/NativeSsl;
move-result-object p1
iput-object p1, p0, Lorg/conscrypt/ConscryptEngine;->ssl:Lorg/conscrypt/NativeSsl;
invoke-virtual {p1}, Lorg/conscrypt/NativeSsl;->newBio()Lorg/conscrypt/NativeSsl$BioWrapper;
move-result-object p1
iput-object p1, p0, Lorg/conscrypt/ConscryptEngine;->networkBio:Lorg/conscrypt/NativeSsl$BioWrapper;
return-void
.end method
.method constructor <init>(Lorg/conscrypt/SSLParametersImpl;)V
.registers 4
invoke-direct {p0}, Lorg/conscrypt/AbstractConscryptEngine;-><init>()V
sget-object v0, Lorg/conscrypt/ConscryptEngine;->defaultBufferAllocator:Lorg/conscrypt/BufferAllocator;
iput-object v0, p0, Lorg/conscrypt/ConscryptEngine;->bufferAllocator:Lorg/conscrypt/BufferAllocator;
const/4 v0, 0x0
iput v0, p0, Lorg/conscrypt/ConscryptEngine;->state:I
new-instance v0, Lorg/conscrypt/ExternalSession;
new-instance v1, Lorg/conscrypt/ConscryptEngine$1;
invoke-direct {v1, p0}, Lorg/conscrypt/ConscryptEngine$1;-><init>(Lorg/conscrypt/ConscryptEngine;)V
invoke-direct {v0, v1}, Lorg/conscrypt/ExternalSession;-><init>(Lorg/conscrypt/ExternalSession$Provider;)V
invoke-static {v0}, Lorg/conscrypt/Platform;->wrapSSLSession(Lorg/conscrypt/ExternalSession;)Ljavax/net/ssl/SSLSession;
move-result-object v0
iput-object v0, p0, Lorg/conscrypt/ConscryptEngine;->externalSession:Ljavax/net/ssl/SSLSession;
const/4 v0, 0x1
new-array v1, v0, [Ljava/nio/ByteBuffer;
iput-object v1, p0, Lorg/conscrypt/ConscryptEngine;->singleSrcBuffer:[Ljava/nio/ByteBuffer;
new-array v0, v0, [Ljava/nio/ByteBuffer;
iput-object v0, p0, Lorg/conscrypt/ConscryptEngine;->singleDstBuffer:[Ljava/nio/ByteBuffer;
iput-object p1, p0, Lorg/conscrypt/ConscryptEngine;->sslParameters:Lorg/conscrypt/SSLParametersImpl;
invoke-static {}, Lorg/conscrypt/PeerInfoProvider;->nullProvider()Lorg/conscrypt/PeerInfoProvider;
move-result-object v0
iput-object v0, p0, Lorg/conscrypt/ConscryptEngine;->peerInfoProvider:Lorg/conscrypt/PeerInfoProvider;
invoke-static {p1, p0, p0}, Lorg/conscrypt/ConscryptEngine;->newSsl(Lorg/conscrypt/SSLParametersImpl;Lorg/conscrypt/ConscryptEngine;Lorg/conscrypt/SSLParametersImpl$AliasChooser;)Lorg/conscrypt/NativeSsl;
move-result-object p1
iput-object p1, p0, Lorg/conscrypt/ConscryptEngine;->ssl:Lorg/conscrypt/NativeSsl;
invoke-virtual {p1}, Lorg/conscrypt/NativeSsl;->newBio()Lorg/conscrypt/NativeSsl$BioWrapper;
move-result-object p1
iput-object p1, p0, Lorg/conscrypt/ConscryptEngine;->networkBio:Lorg/conscrypt/NativeSsl$BioWrapper;
return-void
.end method
.method constructor <init>(Lorg/conscrypt/SSLParametersImpl;Lorg/conscrypt/PeerInfoProvider;Lorg/conscrypt/SSLParametersImpl$AliasChooser;)V
.registers 6
invoke-direct {p0}, Lorg/conscrypt/AbstractConscryptEngine;-><init>()V
sget-object v0, Lorg/conscrypt/ConscryptEngine;->defaultBufferAllocator:Lorg/conscrypt/BufferAllocator;
iput-object v0, p0, Lorg/conscrypt/ConscryptEngine;->bufferAllocator:Lorg/conscrypt/BufferAllocator;
const/4 v0, 0x0
iput v0, p0, Lorg/conscrypt/ConscryptEngine;->state:I
new-instance v0, Lorg/conscrypt/ExternalSession;
new-instance v1, Lorg/conscrypt/ConscryptEngine$1;
invoke-direct {v1, p0}, Lorg/conscrypt/ConscryptEngine$1;-><init>(Lorg/conscrypt/ConscryptEngine;)V
invoke-direct {v0, v1}, Lorg/conscrypt/ExternalSession;-><init>(Lorg/conscrypt/ExternalSession$Provider;)V
invoke-static {v0}, Lorg/conscrypt/Platform;->wrapSSLSession(Lorg/conscrypt/ExternalSession;)Ljavax/net/ssl/SSLSession;
move-result-object v0
iput-object v0, p0, Lorg/conscrypt/ConscryptEngine;->externalSession:Ljavax/net/ssl/SSLSession;
const/4 v0, 0x1
new-array v1, v0, [Ljava/nio/ByteBuffer;
iput-object v1, p0, Lorg/conscrypt/ConscryptEngine;->singleSrcBuffer:[Ljava/nio/ByteBuffer;
new-array v0, v0, [Ljava/nio/ByteBuffer;
iput-object v0, p0, Lorg/conscrypt/ConscryptEngine;->singleDstBuffer:[Ljava/nio/ByteBuffer;
iput-object p1, p0, Lorg/conscrypt/ConscryptEngine;->sslParameters:Lorg/conscrypt/SSLParametersImpl;
const-string v0, "peerInfoProvider"
invoke-static {p2, v0}, Lorg/conscrypt/Preconditions;->checkNotNull(Ljava/lang/Object;Ljava/lang/String;)Ljava/lang/Object;
move-result-object p2
check-cast p2, Lorg/conscrypt/PeerInfoProvider;
iput-object p2, p0, Lorg/conscrypt/ConscryptEngine;->peerInfoProvider:Lorg/conscrypt/PeerInfoProvider;
invoke-static {p1, p0, p3}, Lorg/conscrypt/ConscryptEngine;->newSsl(Lorg/conscrypt/SSLParametersImpl;Lorg/conscrypt/ConscryptEngine;Lorg/conscrypt/SSLParametersImpl$AliasChooser;)Lorg/conscrypt/NativeSsl;
move-result-object p1
iput-object p1, p0, Lorg/conscrypt/ConscryptEngine;->ssl:Lorg/conscrypt/NativeSsl;
invoke-virtual {p1}, Lorg/conscrypt/NativeSsl;->newBio()Lorg/conscrypt/NativeSsl$BioWrapper;
move-result-object p1
iput-object p1, p0, Lorg/conscrypt/ConscryptEngine;->networkBio:Lorg/conscrypt/NativeSsl$BioWrapper;
return-void
.end method
.method static synthetic access$000(Lorg/conscrypt/ConscryptEngine;)Lorg/conscrypt/ConscryptSession;
.registers 1
invoke-direct {p0}, Lorg/conscrypt/ConscryptEngine;->provideSession()Lorg/conscrypt/ConscryptSession;
move-result-object p0
return-object p0
.end method
.method static synthetic access$100(Lorg/conscrypt/ConscryptEngine;)Lorg/conscrypt/ConscryptSession;
.registers 1
invoke-direct {p0}, Lorg/conscrypt/ConscryptEngine;->provideHandshakeSession()Lorg/conscrypt/ConscryptSession;
move-result-object p0
return-object p0
.end method
.method private beginHandshakeInternal()V
.registers 6
iget v0, p0, Lorg/conscrypt/ConscryptEngine;->state:I
if-eqz v0, :cond_81
const/4 v1, 0x1
if-eq v0, v1, :cond_1a
const/4 v1, 0x6
if-eq v0, v1, :cond_12
const/4 v1, 0x7
if-eq v0, v1, :cond_12
const/16 v1, 0x8
if-eq v0, v1, :cond_12
return-void
:cond_12
new-instance v0, Ljavax/net/ssl/SSLHandshakeException;
const-string v1, "Engine has already been closed"
invoke-direct {v0, v1}, Ljavax/net/ssl/SSLHandshakeException;-><init>(Ljava/lang/String;)V
throw v0
:cond_1a
const/4 v0, 0x2
invoke-direct {p0, v0}, Lorg/conscrypt/ConscryptEngine;->transitionTo(I)V
:try_start_1e
iget-object v0, p0, Lorg/conscrypt/ConscryptEngine;->ssl:Lorg/conscrypt/NativeSsl;
invoke-virtual {p0}, Lorg/conscrypt/ConscryptEngine;->getHostname()Ljava/lang/String;
move-result-object v2
iget-object v3, p0, Lorg/conscrypt/ConscryptEngine;->channelIdPrivateKey:Lorg/conscrypt/OpenSSLKey;
invoke-virtual {v0, v2, v3}, Lorg/conscrypt/NativeSsl;->initialize(Ljava/lang/String;Lorg/conscrypt/OpenSSLKey;)V
invoke-virtual {p0}, Lorg/conscrypt/ConscryptEngine;->getUseClientMode()Z
move-result v0
if-eqz v0, :cond_48
invoke-direct {p0}, Lorg/conscrypt/ConscryptEngine;->clientSessionContext()Lorg/conscrypt/ClientSessionContext;
move-result-object v0
invoke-virtual {p0}, Lorg/conscrypt/ConscryptEngine;->getHostname()Ljava/lang/String;
move-result-object v2
invoke-virtual {p0}, Lorg/conscrypt/ConscryptEngine;->getPeerPort()I
move-result v3
iget-object v4, p0, Lorg/conscrypt/ConscryptEngine;->sslParameters:Lorg/conscrypt/SSLParametersImpl;
invoke-virtual {v0, v2, v3, v4}, Lorg/conscrypt/ClientSessionContext;->getCachedSession(Ljava/lang/String;ILorg/conscrypt/SSLParametersImpl;)Lorg/conscrypt/NativeSslSession;
move-result-object v0
if-eqz v0, :cond_48
iget-object v2, p0, Lorg/conscrypt/ConscryptEngine;->ssl:Lorg/conscrypt/NativeSsl;
invoke-virtual {v0, v2}, Lorg/conscrypt/NativeSslSession;->offerToResume(Lorg/conscrypt/NativeSsl;)V
:cond_48
iget-object v0, p0, Lorg/conscrypt/ConscryptEngine;->ssl:Lorg/conscrypt/NativeSsl;
invoke-virtual {v0}, Lorg/conscrypt/NativeSsl;->getMaxSealOverhead()I
move-result v0
iput v0, p0, Lorg/conscrypt/ConscryptEngine;->maxSealOverhead:I
invoke-direct {p0}, Lorg/conscrypt/ConscryptEngine;->handshake()Ljavax/net/ssl/SSLEngineResult$HandshakeStatus;
:try_end_53
.catch Ljava/io/IOException; {:try_start_1e .. :try_end_53} :catch_56
.catchall {:try_start_1e .. :try_end_53} :catchall_54
return-void
:catchall_54
move-exception v0
goto :goto_7d
:catch_56
move-exception v0
:try_start_57
invoke-virtual {v0}, Ljava/io/IOException;->getMessage()Ljava/lang/String;
move-result-object v2
const-string v3, "unexpected CCS"
invoke-virtual {v2, v3}, Ljava/lang/String;->contains(Ljava/lang/CharSequence;)Z
move-result v2
if-eqz v2, :cond_75
const-string v2, "ssl_unexpected_ccs: host=%s"
new-array v1, v1, [Ljava/lang/Object;
const/4 v3, 0x0
invoke-virtual {p0}, Lorg/conscrypt/ConscryptEngine;->getPeerHost()Ljava/lang/String;
move-result-object v4
aput-object v4, v1, v3
invoke-static {v2, v1}, Ljava/lang/String;->format(Ljava/lang/String;[Ljava/lang/Object;)Ljava/lang/String;
move-result-object v1
invoke-static {v1}, Lorg/conscrypt/Platform;->logEvent(Ljava/lang/String;)V
:cond_75
invoke-direct {p0}, Lorg/conscrypt/ConscryptEngine;->closeAll()V
invoke-static {v0}, Lorg/conscrypt/SSLUtils;->toSSLHandshakeException(Ljava/lang/Throwable;)Ljavax/net/ssl/SSLHandshakeException;
move-result-object v0
throw v0
:try_end_7d
.catchall {:try_start_57 .. :try_end_7d} :catchall_54
:goto_7d
invoke-direct {p0}, Lorg/conscrypt/ConscryptEngine;->closeAndFreeResources()V
throw v0
:cond_81
new-instance v0, Ljava/lang/IllegalStateException;
const-string v1, "Client/server mode must be set before handshake"
invoke-direct {v0, v1}, Ljava/lang/IllegalStateException;-><init>(Ljava/lang/String;)V
throw v0
.end method
.method private static calcDstsLength([Ljava/nio/ByteBuffer;II)I
.registers 10
const/4 v0, 0x0
const/4 v1, 0x0
const/4 v2, 0x0
:goto_3
array-length v3, p0
if-ge v1, v3, :cond_30
aget-object v3, p0, v1
if-eqz v3, :cond_c
const/4 v4, 0x1
goto :goto_d
:cond_c
const/4 v4, 0x0
:goto_d
invoke-static {v1}, Ljava/lang/Integer;->valueOf(I)Ljava/lang/Integer;
move-result-object v5
const-string v6, "dsts[%d] is null"
invoke-static {v4, v6, v5}, Lorg/conscrypt/Preconditions;->checkArgument(ZLjava/lang/String;Ljava/lang/Object;)V
invoke-virtual {v3}, Ljava/nio/ByteBuffer;->isReadOnly()Z
move-result v4
if-nez v4, :cond_2a
if-lt v1, p1, :cond_27
add-int v4, p1, p2
if-ge v1, v4, :cond_27
invoke-virtual {v3}, Ljava/nio/ByteBuffer;->remaining()I
move-result v3
add-int/2addr v2, v3
:cond_27
add-int/lit8 v1, v1, 0x1
goto :goto_3
:cond_2a
new-instance p0, Ljava/nio/ReadOnlyBufferException;
invoke-direct {p0}, Ljava/nio/ReadOnlyBufferException;-><init>()V
throw p0
:cond_30
return v2
.end method
.method private static calcSrcsLength([Ljava/nio/ByteBuffer;II)J
.registers 7
const-wide/16 v0, 0x0
:goto_2
if-ge p1, p2, :cond_2d
aget-object v2, p0, p1
if-eqz v2, :cond_11
invoke-virtual {v2}, Ljava/nio/ByteBuffer;->remaining()I
move-result v2
int-to-long v2, v2
add-long/2addr v0, v2
add-int/lit8 p1, p1, 0x1
goto :goto_2
:cond_11
new-instance p0, Ljava/lang/IllegalArgumentException;
new-instance p2, Ljava/lang/StringBuilder;
invoke-direct {p2}, Ljava/lang/StringBuilder;-><init>()V
const-string v0, "srcs["
invoke-virtual {p2, v0}, Ljava/lang/StringBuilder;->append(Ljava/lang/String;)Ljava/lang/StringBuilder;
invoke-virtual {p2, p1}, Ljava/lang/StringBuilder;->append(I)Ljava/lang/StringBuilder;
const-string p1, "] is null"
invoke-virtual {p2, p1}, Ljava/lang/StringBuilder;->append(Ljava/lang/String;)Ljava/lang/StringBuilder;
invoke-virtual {p2}, Ljava/lang/StringBuilder;->toString()Ljava/lang/String;
move-result-object p1
invoke-direct {p0, p1}, Ljava/lang/IllegalArgumentException;-><init>(Ljava/lang/String;)V
throw p0
:cond_2d
return-wide v0
.end method
.method private clientSessionContext()Lorg/conscrypt/ClientSessionContext;
.registers 2
iget-object v0, p0, Lorg/conscrypt/ConscryptEngine;->sslParameters:Lorg/conscrypt/SSLParametersImpl;
invoke-virtual {v0}, Lorg/conscrypt/SSLParametersImpl;->getClientSessionContext()Lorg/conscrypt/ClientSessionContext;
move-result-object v0
return-object v0
.end method
.method private closeAll()V
.registers 1
invoke-virtual {p0}, Lorg/conscrypt/ConscryptEngine;->closeOutbound()V
invoke-virtual {p0}, Lorg/conscrypt/ConscryptEngine;->closeInbound()V
return-void
.end method
.method private closeAndFreeResources()V
.registers 2
const/16 v0, 0x8
invoke-direct {p0, v0}, Lorg/conscrypt/ConscryptEngine;->transitionTo(I)V
iget-object v0, p0, Lorg/conscrypt/ConscryptEngine;->ssl:Lorg/conscrypt/NativeSsl;
if-eqz v0, :cond_c
invoke-virtual {v0}, Lorg/conscrypt/NativeSsl;->close()V
:cond_c
iget-object v0, p0, Lorg/conscrypt/ConscryptEngine;->networkBio:Lorg/conscrypt/NativeSsl$BioWrapper;
if-eqz v0, :cond_13
invoke-virtual {v0}, Lorg/conscrypt/NativeSsl$BioWrapper;->close()V
:cond_13
return-void
.end method
.method private convertException(Ljava/lang/Throwable;)Ljavax/net/ssl/SSLException;
.registers 3
instance-of v0, p1, Ljavax/net/ssl/SSLHandshakeException;
if-nez v0, :cond_e
iget-boolean v0, p0, Lorg/conscrypt/ConscryptEngine;->handshakeFinished:Z
if-nez v0, :cond_9
goto :goto_e
:cond_9
invoke-static {p1}, Lorg/conscrypt/SSLUtils;->toSSLException(Ljava/lang/Throwable;)Ljavax/net/ssl/SSLException;
move-result-object p1
return-object p1
:cond_e
:goto_e
invoke-static {p1}, Lorg/conscrypt/SSLUtils;->toSSLHandshakeException(Ljava/lang/Throwable;)Ljavax/net/ssl/SSLHandshakeException;
move-result-object p1
return-object p1
.end method
.method private directByteBufferAddress(Ljava/nio/ByteBuffer;I)J
.registers 5
invoke-static {p1}, Lorg/conscrypt/NativeCrypto;->getDirectBufferAddress(Ljava/nio/Buffer;)J
move-result-wide v0
int-to-long p1, p2
add-long/2addr v0, p1
return-wide v0
.end method
.method private finishHandshake()V
.registers 2
const/4 v0, 0x1
iput-boolean v0, p0, Lorg/conscrypt/ConscryptEngine;->handshakeFinished:Z
iget-object v0, p0, Lorg/conscrypt/ConscryptEngine;->handshakeListener:Lorg/conscrypt/HandshakeListener;
if-eqz v0, :cond_a
invoke-virtual {v0}, Lorg/conscrypt/HandshakeListener;->onHandshakeFinished()V
:cond_a
return-void
.end method
.method private freeIfDone()V
.registers 2
invoke-virtual {p0}, Lorg/conscrypt/ConscryptEngine;->isInboundDone()Z
move-result v0
if-eqz v0, :cond_f
invoke-virtual {p0}, Lorg/conscrypt/ConscryptEngine;->isOutboundDone()Z
move-result v0
if-eqz v0, :cond_f
invoke-direct {p0}, Lorg/conscrypt/ConscryptEngine;->closeAndFreeResources()V
:cond_f
return-void
.end method
.method static getDefaultBufferAllocator()Lorg/conscrypt/BufferAllocator;
.registers 1
sget-object v0, Lorg/conscrypt/ConscryptEngine;->defaultBufferAllocator:Lorg/conscrypt/BufferAllocator;
return-object v0
.end method
.method private getEngineStatus()Ljavax/net/ssl/SSLEngineResult$Status;
.registers 3
iget v0, p0, Lorg/conscrypt/ConscryptEngine;->state:I
const/4 v1, 0x6
if-eq v0, v1, :cond_f
const/4 v1, 0x7
if-eq v0, v1, :cond_f
const/16 v1, 0x8
if-eq v0, v1, :cond_f
sget-object v0, Ljavax/net/ssl/SSLEngineResult$Status;->OK:Ljavax/net/ssl/SSLEngineResult$Status;
return-object v0
:cond_f
sget-object v0, Ljavax/net/ssl/SSLEngineResult$Status;->CLOSED:Ljavax/net/ssl/SSLEngineResult$Status;
return-object v0
.end method
.method private getHandshakeStatus(I)Ljavax/net/ssl/SSLEngineResult$HandshakeStatus;
.registers 3
iget-boolean v0, p0, Lorg/conscrypt/ConscryptEngine;->handshakeFinished:Z
if-nez v0, :cond_9
invoke-static {p1}, Lorg/conscrypt/ConscryptEngine;->pendingStatus(I)Ljavax/net/ssl/SSLEngineResult$HandshakeStatus;
move-result-object p1
goto :goto_b
:cond_9
sget-object p1, Ljavax/net/ssl/SSLEngineResult$HandshakeStatus;->NOT_HANDSHAKING:Ljavax/net/ssl/SSLEngineResult$HandshakeStatus;
:goto_b
return-object p1
.end method
.method private getHandshakeStatusInternal()Ljavax/net/ssl/SSLEngineResult$HandshakeStatus;
.registers 4
iget-boolean v0, p0, Lorg/conscrypt/ConscryptEngine;->handshakeFinished:Z
if-eqz v0, :cond_7
sget-object v0, Ljavax/net/ssl/SSLEngineResult$HandshakeStatus;->NOT_HANDSHAKING:Ljavax/net/ssl/SSLEngineResult$HandshakeStatus;
return-object v0
:cond_7
iget v0, p0, Lorg/conscrypt/ConscryptEngine;->state:I
packed-switch v0, :pswitch_data_34
new-instance v0, Ljava/lang/IllegalStateException;
new-instance v1, Ljava/lang/StringBuilder;
invoke-direct {v1}, Ljava/lang/StringBuilder;-><init>()V
const-string v2, "Unexpected engine state: "
invoke-virtual {v1, v2}, Ljava/lang/StringBuilder;->append(Ljava/lang/String;)Ljava/lang/StringBuilder;
iget v2, p0, Lorg/conscrypt/ConscryptEngine;->state:I
invoke-virtual {v1, v2}, Ljava/lang/StringBuilder;->append(I)Ljava/lang/StringBuilder;
invoke-virtual {v1}, Ljava/lang/StringBuilder;->toString()Ljava/lang/String;
move-result-object v1
invoke-direct {v0, v1}, Ljava/lang/IllegalStateException;-><init>(Ljava/lang/String;)V
throw v0
:pswitch_25
sget-object v0, Ljavax/net/ssl/SSLEngineResult$HandshakeStatus;->NEED_WRAP:Ljavax/net/ssl/SSLEngineResult$HandshakeStatus;
return-object v0
:pswitch_28
invoke-virtual {p0}, Lorg/conscrypt/ConscryptEngine;->pendingOutboundEncryptedBytes()I
move-result v0
invoke-static {v0}, Lorg/conscrypt/ConscryptEngine;->pendingStatus(I)Ljavax/net/ssl/SSLEngineResult$HandshakeStatus;
move-result-object v0
return-object v0
:pswitch_31
sget-object v0, Ljavax/net/ssl/SSLEngineResult$HandshakeStatus;->NOT_HANDSHAKING:Ljavax/net/ssl/SSLEngineResult$HandshakeStatus;
return-object v0
:pswitch_data_34
.packed-switch 0x0
:pswitch_31
:pswitch_31
:pswitch_28
:pswitch_25
:pswitch_31
:pswitch_31
:pswitch_31
:pswitch_31
:pswitch_31
.end packed-switch
.end method
.method private getOrCreateLazyDirectBuffer()Ljava/nio/ByteBuffer;
.registers 3
iget-object v0, p0, Lorg/conscrypt/ConscryptEngine;->lazyDirectBuffer:Ljava/nio/ByteBuffer;
if-nez v0, :cond_12
const/16 v0, 0x4000
const/16 v1, 0x4145
invoke-static {v0, v1}, Ljava/lang/Math;->max(II)I
move-result v0
invoke-static {v0}, Ljava/nio/ByteBuffer;->allocateDirect(I)Ljava/nio/ByteBuffer;
move-result-object v0
iput-object v0, p0, Lorg/conscrypt/ConscryptEngine;->lazyDirectBuffer:Ljava/nio/ByteBuffer;
:cond_12
iget-object v0, p0, Lorg/conscrypt/ConscryptEngine;->lazyDirectBuffer:Ljava/nio/ByteBuffer;
invoke-virtual {v0}, Ljava/nio/ByteBuffer;->clear()Ljava/nio/Buffer;
iget-object v0, p0, Lorg/conscrypt/ConscryptEngine;->lazyDirectBuffer:Ljava/nio/ByteBuffer;
return-object v0
.end method
.method private handshake()Ljavax/net/ssl/SSLEngineResult$HandshakeStatus;
.registers 4
:try_start_0
iget-object v0, p0, Lorg/conscrypt/ConscryptEngine;->ssl:Lorg/conscrypt/NativeSsl;
invoke-virtual {v0}, Lorg/conscrypt/NativeSsl;->doHandshake()I
move-result v0
:try_end_6
.catch Ljava/io/IOException; {:try_start_0 .. :try_end_6} :catch_2d
.catch Ljava/lang/Exception; {:try_start_0 .. :try_end_6} :catch_2b
const/4 v1, 0x2
if-eq v0, v1, :cond_22
const/4 v1, 0x3
if-eq v0, v1, :cond_1f
:try_start_c
iget-object v0, p0, Lorg/conscrypt/ConscryptEngine;->activeSession:Lorg/conscrypt/ActiveSession;
invoke-virtual {p0}, Lorg/conscrypt/ConscryptEngine;->getPeerHost()Ljava/lang/String;
move-result-object v1
invoke-virtual {p0}, Lorg/conscrypt/ConscryptEngine;->getPeerPort()I
move-result v2
invoke-virtual {v0, v1, v2}, Lorg/conscrypt/ActiveSession;->onPeerCertificateAvailable(Ljava/lang/String;I)V
invoke-direct {p0}, Lorg/conscrypt/ConscryptEngine;->finishHandshake()V
sget-object v0, Ljavax/net/ssl/SSLEngineResult$HandshakeStatus;->FINISHED:Ljavax/net/ssl/SSLEngineResult$HandshakeStatus;
:try_end_1e
.catch Ljava/lang/Exception; {:try_start_c .. :try_end_1e} :catch_2b
return-object v0
:cond_1f
:try_start_1f
sget-object v0, Ljavax/net/ssl/SSLEngineResult$HandshakeStatus;->NEED_WRAP:Ljavax/net/ssl/SSLEngineResult$HandshakeStatus;
return-object v0
:cond_22
invoke-virtual {p0}, Lorg/conscrypt/ConscryptEngine;->pendingOutboundEncryptedBytes()I
move-result v0
invoke-static {v0}, Lorg/conscrypt/ConscryptEngine;->pendingStatus(I)Ljavax/net/ssl/SSLEngineResult$HandshakeStatus;
move-result-object v0
:try_end_2a
.catch Ljava/io/IOException; {:try_start_1f .. :try_end_2a} :catch_2d
.catch Ljava/lang/Exception; {:try_start_1f .. :try_end_2a} :catch_2b
return-object v0
:catch_2b
move-exception v0
goto :goto_32
:catch_2d
move-exception v0
:try_start_2e
invoke-direct {p0}, Lorg/conscrypt/ConscryptEngine;->closeAll()V
throw v0
:try_end_32
.catch Ljava/lang/Exception; {:try_start_2e .. :try_end_32} :catch_2b
:goto_32
invoke-static {v0}, Lorg/conscrypt/SSLUtils;->toSSLHandshakeException(Ljava/lang/Throwable;)Ljavax/net/ssl/SSLHandshakeException;
move-result-object v0
throw v0
.end method
.method private isHandshakeStarted()Z
.registers 3
iget v0, p0, Lorg/conscrypt/ConscryptEngine;->state:I
if-eqz v0, :cond_8
const/4 v1, 0x1
if-eq v0, v1, :cond_8
return v1
:cond_8
const/4 v0, 0x0
return v0
.end method
.method private mayFinishHandshake(Ljavax/net/ssl/SSLEngineResult$HandshakeStatus;)Ljavax/net/ssl/SSLEngineResult$HandshakeStatus;
.registers 3
iget-boolean v0, p0, Lorg/conscrypt/ConscryptEngine;->handshakeFinished:Z
if-nez v0, :cond_c
sget-object v0, Ljavax/net/ssl/SSLEngineResult$HandshakeStatus;->NOT_HANDSHAKING:Ljavax/net/ssl/SSLEngineResult$HandshakeStatus;
if-ne p1, v0, :cond_c
invoke-direct {p0}, Lorg/conscrypt/ConscryptEngine;->handshake()Ljavax/net/ssl/SSLEngineResult$HandshakeStatus;
move-result-object p1
:cond_c
return-object p1
.end method
.method private newResult(IILjavax/net/ssl/SSLEngineResult$HandshakeStatus;)Ljavax/net/ssl/SSLEngineResult;
.registers 7
new-instance v0, Ljavax/net/ssl/SSLEngineResult;
invoke-direct {p0}, Lorg/conscrypt/ConscryptEngine;->getEngineStatus()Ljavax/net/ssl/SSLEngineResult$Status;
move-result-object v1
sget-object v2, Ljavax/net/ssl/SSLEngineResult$HandshakeStatus;->FINISHED:Ljavax/net/ssl/SSLEngineResult$HandshakeStatus;
if-ne p3, v2, :cond_b
goto :goto_f
:cond_b
invoke-direct {p0}, Lorg/conscrypt/ConscryptEngine;->getHandshakeStatusInternal()Ljavax/net/ssl/SSLEngineResult$HandshakeStatus;
move-result-object p3
:goto_f
invoke-direct {p0, p3}, Lorg/conscrypt/ConscryptEngine;->mayFinishHandshake(Ljavax/net/ssl/SSLEngineResult$HandshakeStatus;)Ljavax/net/ssl/SSLEngineResult$HandshakeStatus;
move-result-object p3
invoke-direct {v0, v1, p3, p1, p2}, Ljavax/net/ssl/SSLEngineResult;-><init>(Ljavax/net/ssl/SSLEngineResult$Status;Ljavax/net/ssl/SSLEngineResult$HandshakeStatus;II)V
return-object v0
.end method
.method private static newSsl(Lorg/conscrypt/SSLParametersImpl;Lorg/conscrypt/ConscryptEngine;Lorg/conscrypt/SSLParametersImpl$AliasChooser;)Lorg/conscrypt/NativeSsl;
.registers 3
:try_start_0
invoke-static {p0, p1, p2, p1}, Lorg/conscrypt/NativeSsl;->newInstance(Lorg/conscrypt/SSLParametersImpl;Lorg/conscrypt/NativeCrypto$SSLHandshakeCallbacks;Lorg/conscrypt/SSLParametersImpl$AliasChooser;Lorg/conscrypt/SSLParametersImpl$PSKCallbacks;)Lorg/conscrypt/NativeSsl;
move-result-object p0
:try_end_4
.catch Ljavax/net/ssl/SSLException; {:try_start_0 .. :try_end_4} :catch_5
return-object p0
:catch_5
move-exception p0
new-instance p1, Ljava/lang/RuntimeException;
invoke-direct {p1, p0}, Ljava/lang/RuntimeException;-><init>(Ljava/lang/Throwable;)V
throw p1
.end method
.method private newSslExceptionWithMessage(Ljava/lang/String;)Ljavax/net/ssl/SSLException;
.registers 3
iget-boolean v0, p0, Lorg/conscrypt/ConscryptEngine;->handshakeFinished:Z
if-nez v0, :cond_a
new-instance v0, Ljavax/net/ssl/SSLException;
invoke-direct {v0, p1}, Ljavax/net/ssl/SSLException;-><init>(Ljava/lang/String;)V
return-object v0
:cond_a
new-instance v0, Ljavax/net/ssl/SSLHandshakeException;
invoke-direct {v0, p1}, Ljavax/net/ssl/SSLHandshakeException;-><init>(Ljava/lang/String;)V
return-object v0
.end method
.method private pendingInboundCleartextBytes()I
.registers 2
iget-object v0, p0, Lorg/conscrypt/ConscryptEngine;->ssl:Lorg/conscrypt/NativeSsl;
invoke-virtual {v0}, Lorg/conscrypt/NativeSsl;->getPendingReadableBytes()I
move-result v0
return v0
.end method
.method private static pendingStatus(I)Ljavax/net/ssl/SSLEngineResult$HandshakeStatus;
.registers 1
if-lez p0, :cond_5
sget-object p0, Ljavax/net/ssl/SSLEngineResult$HandshakeStatus;->NEED_WRAP:Ljavax/net/ssl/SSLEngineResult$HandshakeStatus;
goto :goto_7
:cond_5
sget-object p0, Ljavax/net/ssl/SSLEngineResult$HandshakeStatus;->NEED_UNWRAP:Ljavax/net/ssl/SSLEngineResult$HandshakeStatus;
:goto_7
return-object p0
.end method
.method private provideAfterHandshakeSession()Lorg/conscrypt/ConscryptSession;
.registers 3
iget v0, p0, Lorg/conscrypt/ConscryptEngine;->state:I
const/4 v1, 0x2
if-ge v0, v1, :cond_a
invoke-static {}, Lorg/conscrypt/SSLNullSession;->getNullSession()Lorg/conscrypt/ConscryptSession;
move-result-object v0
goto :goto_e
:cond_a
invoke-direct {p0}, Lorg/conscrypt/ConscryptEngine;->provideSession()Lorg/conscrypt/ConscryptSession;
move-result-object v0
:goto_e
return-object v0
.end method
.method private provideHandshakeSession()Lorg/conscrypt/ConscryptSession;
.registers 4
iget-object v0, p0, Lorg/conscrypt/ConscryptEngine;->ssl:Lorg/conscrypt/NativeSsl;
monitor-enter v0
:try_start_3
iget v1, p0, Lorg/conscrypt/ConscryptEngine;->state:I
const/4 v2, 0x2
if-ne v1, v2, :cond_b
iget-object v1, p0, Lorg/conscrypt/ConscryptEngine;->activeSession:Lorg/conscrypt/ActiveSession;
goto :goto_f
:cond_b
invoke-static {}, Lorg/conscrypt/SSLNullSession;->getNullSession()Lorg/conscrypt/ConscryptSession;
move-result-object v1
:goto_f
monitor-exit v0
return-object v1
:catchall_11
move-exception v1
monitor-exit v0
:try_end_13
.catchall {:try_start_3 .. :try_end_13} :catchall_11
throw v1
.end method
.method private provideSession()Lorg/conscrypt/ConscryptSession;
.registers 4
iget-object v0, p0, Lorg/conscrypt/ConscryptEngine;->ssl:Lorg/conscrypt/NativeSsl;
monitor-enter v0
:try_start_3
iget v1, p0, Lorg/conscrypt/ConscryptEngine;->state:I
const/16 v2, 0x8
if-ne v1, v2, :cond_14
iget-object v1, p0, Lorg/conscrypt/ConscryptEngine;->closedSession:Lorg/conscrypt/SessionSnapshot;
if-eqz v1, :cond_e
goto :goto_12
:cond_e
invoke-static {}, Lorg/conscrypt/SSLNullSession;->getNullSession()Lorg/conscrypt/ConscryptSession;
move-result-object v1
:goto_12
monitor-exit v0
return-object v1
:cond_14
const/4 v2, 0x3
if-ge v1, v2, :cond_1d
invoke-static {}, Lorg/conscrypt/SSLNullSession;->getNullSession()Lorg/conscrypt/ConscryptSession;
move-result-object v1
monitor-exit v0
return-object v1
:cond_1d
iget-object v1, p0, Lorg/conscrypt/ConscryptEngine;->activeSession:Lorg/conscrypt/ActiveSession;
monitor-exit v0
return-object v1
:catchall_21
move-exception v1
monitor-exit v0
:try_end_23
.catchall {:try_start_3 .. :try_end_23} :catchall_21
throw v1
.end method
.method private readEncryptedData(Ljava/nio/ByteBuffer;I)I
.registers 6
const/4 v0, 0x0
:try_start_1
invoke-virtual {p1}, Ljava/nio/ByteBuffer;->position()I
move-result v1
invoke-virtual {p1}, Ljava/nio/ByteBuffer;->remaining()I
move-result v2
if-lt v2, p2, :cond_29
invoke-virtual {p1}, Ljava/nio/ByteBuffer;->limit()I
move-result v0
sub-int/2addr v0, v1
invoke-static {p2, v0}, Ljava/lang/Math;->min(II)I
move-result p2
invoke-virtual {p1}, Ljava/nio/ByteBuffer;->isDirect()Z
move-result v0
if-eqz v0, :cond_25
invoke-direct {p0, p1, v1, p2}, Lorg/conscrypt/ConscryptEngine;->readEncryptedDataDirect(Ljava/nio/ByteBuffer;II)I
move-result v0
if-lez v0, :cond_29
add-int/2addr v1, v0
invoke-virtual {p1, v1}, Ljava/nio/ByteBuffer;->position(I)Ljava/nio/Buffer;
goto :goto_29
:cond_25
invoke-direct {p0, p1, p2}, Lorg/conscrypt/ConscryptEngine;->readEncryptedDataHeap(Ljava/nio/ByteBuffer;I)I
move-result v0
:try_end_29
.catch Ljava/lang/Exception; {:try_start_1 .. :try_end_29} :catch_2a
:cond_29
:goto_29
return v0
:catch_2a
move-exception p1
invoke-direct {p0, p1}, Lorg/conscrypt/ConscryptEngine;->convertException(Ljava/lang/Throwable;)Ljavax/net/ssl/SSLException;
move-result-object p1
throw p1
.end method
.method private readEncryptedDataDirect(Ljava/nio/ByteBuffer;II)I
.registers 5
iget-object v0, p0, Lorg/conscrypt/ConscryptEngine;->networkBio:Lorg/conscrypt/NativeSsl$BioWrapper;
invoke-direct {p0, p1, p2}, Lorg/conscrypt/ConscryptEngine;->directByteBufferAddress(Ljava/nio/ByteBuffer;I)J
move-result-wide p1
invoke-virtual {v0, p1, p2, p3}, Lorg/conscrypt/NativeSsl$BioWrapper;->readDirectByteBuffer(JI)I
move-result p1
return p1
.end method
.method private readEncryptedDataHeap(Ljava/nio/ByteBuffer;I)I
.registers 6
const/4 v0, 0x0
:try_start_1
iget-object v1, p0, Lorg/conscrypt/ConscryptEngine;->bufferAllocator:Lorg/conscrypt/BufferAllocator;
if-eqz v1, :cond_e
invoke-virtual {v1, p2}, Lorg/conscrypt/BufferAllocator;->allocateDirectBuffer(I)Lorg/conscrypt/AllocatedBuffer;
move-result-object v0
invoke-virtual {v0}, Lorg/conscrypt/AllocatedBuffer;->nioBuffer()Ljava/nio/ByteBuffer;
move-result-object v1
goto :goto_12
:cond_e
invoke-direct {p0}, Lorg/conscrypt/ConscryptEngine;->getOrCreateLazyDirectBuffer()Ljava/nio/ByteBuffer;
move-result-object v1
:goto_12
invoke-virtual {v1}, Ljava/nio/ByteBuffer;->remaining()I
move-result v2
invoke-static {p2, v2}, Ljava/lang/Math;->min(II)I
move-result p2
const/4 v2, 0x0
invoke-direct {p0, v1, v2, p2}, Lorg/conscrypt/ConscryptEngine;->readEncryptedDataDirect(Ljava/nio/ByteBuffer;II)I
move-result p2
if-lez p2, :cond_2a
invoke-virtual {v1, p2}, Ljava/nio/ByteBuffer;->position(I)Ljava/nio/Buffer;
invoke-virtual {v1}, Ljava/nio/ByteBuffer;->flip()Ljava/nio/Buffer;
invoke-virtual {p1, v1}, Ljava/nio/ByteBuffer;->put(Ljava/nio/ByteBuffer;)Ljava/nio/ByteBuffer;
:try_end_2a
.catchall {:try_start_1 .. :try_end_2a} :catchall_30
:cond_2a
if-eqz v0, :cond_2f
invoke-virtual {v0}, Lorg/conscrypt/AllocatedBuffer;->release()Lorg/conscrypt/AllocatedBuffer;
:cond_2f
return p2
:catchall_30
move-exception p1
if-eqz v0, :cond_36
invoke-virtual {v0}, Lorg/conscrypt/AllocatedBuffer;->release()Lorg/conscrypt/AllocatedBuffer;
:cond_36
throw p1
.end method
.method private readPendingBytesFromBIO(Ljava/nio/ByteBuffer;IILjavax/net/ssl/SSLEngineResult$HandshakeStatus;)Ljavax/net/ssl/SSLEngineResult;
.registers 8
:try_start_0
invoke-virtual {p0}, Lorg/conscrypt/ConscryptEngine;->pendingOutboundEncryptedBytes()I
move-result v0
if-lez v0, :cond_44
invoke-virtual {p1}, Ljava/nio/ByteBuffer;->remaining()I
move-result v1
if-ge v1, v0, :cond_21
new-instance p1, Ljavax/net/ssl/SSLEngineResult;
sget-object v1, Ljavax/net/ssl/SSLEngineResult$Status;->BUFFER_OVERFLOW:Ljavax/net/ssl/SSLEngineResult$Status;
sget-object v2, Ljavax/net/ssl/SSLEngineResult$HandshakeStatus;->FINISHED:Ljavax/net/ssl/SSLEngineResult$HandshakeStatus;
if-ne p4, v2, :cond_15
goto :goto_19
:cond_15
invoke-direct {p0, v0}, Lorg/conscrypt/ConscryptEngine;->getHandshakeStatus(I)Ljavax/net/ssl/SSLEngineResult$HandshakeStatus;
move-result-object p4
:goto_19
invoke-direct {p0, p4}, Lorg/conscrypt/ConscryptEngine;->mayFinishHandshake(Ljavax/net/ssl/SSLEngineResult$HandshakeStatus;)Ljavax/net/ssl/SSLEngineResult$HandshakeStatus;
move-result-object p4
invoke-direct {p1, v1, p4, p2, p3}, Ljavax/net/ssl/SSLEngineResult;-><init>(Ljavax/net/ssl/SSLEngineResult$Status;Ljavax/net/ssl/SSLEngineResult$HandshakeStatus;II)V
return-object p1
:cond_21
invoke-direct {p0, p1, v0}, Lorg/conscrypt/ConscryptEngine;->readEncryptedData(Ljava/nio/ByteBuffer;I)I
move-result p1
if-gtz p1, :cond_2b
invoke-static {}, Lorg/conscrypt/NativeCrypto;->SSL_clear_error()V
goto :goto_2d
:cond_2b
add-int/2addr p3, p1
sub-int/2addr v0, p1
:goto_2d
new-instance p1, Ljavax/net/ssl/SSLEngineResult;
invoke-direct {p0}, Lorg/conscrypt/ConscryptEngine;->getEngineStatus()Ljavax/net/ssl/SSLEngineResult$Status;
move-result-object v1
sget-object v2, Ljavax/net/ssl/SSLEngineResult$HandshakeStatus;->FINISHED:Ljavax/net/ssl/SSLEngineResult$HandshakeStatus;
if-ne p4, v2, :cond_38
goto :goto_3c
:cond_38
invoke-direct {p0, v0}, Lorg/conscrypt/ConscryptEngine;->getHandshakeStatus(I)Ljavax/net/ssl/SSLEngineResult$HandshakeStatus;
move-result-object p4
:goto_3c
invoke-direct {p0, p4}, Lorg/conscrypt/ConscryptEngine;->mayFinishHandshake(Ljavax/net/ssl/SSLEngineResult$HandshakeStatus;)Ljavax/net/ssl/SSLEngineResult$HandshakeStatus;
move-result-object p4
invoke-direct {p1, v1, p4, p2, p3}, Ljavax/net/ssl/SSLEngineResult;-><init>(Ljavax/net/ssl/SSLEngineResult$Status;Ljavax/net/ssl/SSLEngineResult$HandshakeStatus;II)V
:try_end_43
.catch Ljava/lang/Exception; {:try_start_0 .. :try_end_43} :catch_46
return-object p1
:cond_44
const/4 p1, 0x0
return-object p1
:catch_46
move-exception p1
invoke-direct {p0, p1}, Lorg/conscrypt/ConscryptEngine;->convertException(Ljava/lang/Throwable;)Ljavax/net/ssl/SSLException;
move-result-object p1
throw p1
.end method
.method private readPlaintextData(Ljava/nio/ByteBuffer;)I
.registers 5
:try_start_0
invoke-virtual {p1}, Ljava/nio/ByteBuffer;->position()I
move-result v0
invoke-virtual {p1}, Ljava/nio/ByteBuffer;->limit()I
move-result v1
const/16 v2, 0x4145
sub-int/2addr v1, v0
invoke-static {v2, v1}, Ljava/lang/Math;->min(II)I
move-result v1
invoke-virtual {p1}, Ljava/nio/ByteBuffer;->isDirect()Z
move-result v2
if-eqz v2, :cond_20
invoke-direct {p0, p1, v0, v1}, Lorg/conscrypt/ConscryptEngine;->readPlaintextDataDirect(Ljava/nio/ByteBuffer;II)I
move-result v1
if-lez v1, :cond_1f
add-int/2addr v0, v1
invoke-virtual {p1, v0}, Ljava/nio/ByteBuffer;->position(I)Ljava/nio/Buffer;
:cond_1f
return v1
:cond_20
invoke-direct {p0, p1, v1}, Lorg/conscrypt/ConscryptEngine;->readPlaintextDataHeap(Ljava/nio/ByteBuffer;I)I
move-result p1
:try_end_24
.catch Ljava/security/cert/CertificateException; {:try_start_0 .. :try_end_24} :catch_25
return p1
:catch_25
move-exception p1
invoke-direct {p0, p1}, Lorg/conscrypt/ConscryptEngine;->convertException(Ljava/lang/Throwable;)Ljavax/net/ssl/SSLException;
move-result-object p1
throw p1
.end method
.method private readPlaintextDataDirect(Ljava/nio/ByteBuffer;II)I
.registers 5
iget-object v0, p0, Lorg/conscrypt/ConscryptEngine;->ssl:Lorg/conscrypt/NativeSsl;
invoke-direct {p0, p1, p2}, Lorg/conscrypt/ConscryptEngine;->directByteBufferAddress(Ljava/nio/ByteBuffer;I)J
move-result-wide p1
invoke-virtual {v0, p1, p2, p3}, Lorg/conscrypt/NativeSsl;->readDirectByteBuffer(JI)I
move-result p1
return p1
.end method
.method private readPlaintextDataHeap(Ljava/nio/ByteBuffer;I)I
.registers 6
const/4 v0, 0x0
:try_start_1
iget-object v1, p0, Lorg/conscrypt/ConscryptEngine;->bufferAllocator:Lorg/conscrypt/BufferAllocator;
if-eqz v1, :cond_e
invoke-virtual {v1, p2}, Lorg/conscrypt/BufferAllocator;->allocateDirectBuffer(I)Lorg/conscrypt/AllocatedBuffer;
move-result-object v0
invoke-virtual {v0}, Lorg/conscrypt/AllocatedBuffer;->nioBuffer()Ljava/nio/ByteBuffer;
move-result-object v1
goto :goto_12
:cond_e
invoke-direct {p0}, Lorg/conscrypt/ConscryptEngine;->getOrCreateLazyDirectBuffer()Ljava/nio/ByteBuffer;
move-result-object v1
:goto_12
invoke-virtual {v1}, Ljava/nio/ByteBuffer;->remaining()I
move-result v2
invoke-static {p2, v2}, Ljava/lang/Math;->min(II)I
move-result p2
const/4 v2, 0x0
invoke-direct {p0, v1, v2, p2}, Lorg/conscrypt/ConscryptEngine;->readPlaintextDataDirect(Ljava/nio/ByteBuffer;II)I
move-result p2
if-lez p2, :cond_2a
invoke-virtual {v1, p2}, Ljava/nio/ByteBuffer;->position(I)Ljava/nio/Buffer;
invoke-virtual {v1}, Ljava/nio/ByteBuffer;->flip()Ljava/nio/Buffer;
invoke-virtual {p1, v1}, Ljava/nio/ByteBuffer;->put(Ljava/nio/ByteBuffer;)Ljava/nio/ByteBuffer;
:try_end_2a
.catchall {:try_start_1 .. :try_end_2a} :catchall_30
:cond_2a
if-eqz v0, :cond_2f
invoke-virtual {v0}, Lorg/conscrypt/AllocatedBuffer;->release()Lorg/conscrypt/AllocatedBuffer;
:cond_2f
return p2
:catchall_30
move-exception p1
if-eqz v0, :cond_36
invoke-virtual {v0}, Lorg/conscrypt/AllocatedBuffer;->release()Lorg/conscrypt/AllocatedBuffer;
:cond_36
throw p1
.end method
.method private resetSingleDstBuffer()V
.registers 4
iget-object v0, p0, Lorg/conscrypt/ConscryptEngine;->singleDstBuffer:[Ljava/nio/ByteBuffer;
const/4 v1, 0x0
const/4 v2, 0x0
aput-object v2, v0, v1
return-void
.end method
.method private resetSingleSrcBuffer()V
.registers 4
iget-object v0, p0, Lorg/conscrypt/ConscryptEngine;->singleSrcBuffer:[Ljava/nio/ByteBuffer;
const/4 v1, 0x0
const/4 v2, 0x0
aput-object v2, v0, v1
return-void
.end method
.method private sendSSLShutdown()V
.registers 2
:try_start_0
iget-object v0, p0, Lorg/conscrypt/ConscryptEngine;->ssl:Lorg/conscrypt/NativeSsl;
invoke-virtual {v0}, Lorg/conscrypt/NativeSsl;->shutdown()V
:try_end_5
.catch Ljava/io/IOException; {:try_start_0 .. :try_end_5} :catch_5
:catch_5
return-void
.end method
.method private sessionContext()Lorg/conscrypt/AbstractSessionContext;
.registers 2
iget-object v0, p0, Lorg/conscrypt/ConscryptEngine;->sslParameters:Lorg/conscrypt/SSLParametersImpl;
invoke-virtual {v0}, Lorg/conscrypt/SSLParametersImpl;->getSessionContext()Lorg/conscrypt/AbstractSessionContext;
move-result-object v0
return-object v0
.end method
.method static setDefaultBufferAllocator(Lorg/conscrypt/BufferAllocator;)V
.registers 1
sput-object p0, Lorg/conscrypt/ConscryptEngine;->defaultBufferAllocator:Lorg/conscrypt/BufferAllocator;
return-void
.end method
.method private singleDstBuffer(Ljava/nio/ByteBuffer;)[Ljava/nio/ByteBuffer;
.registers 4
iget-object v0, p0, Lorg/conscrypt/ConscryptEngine;->singleDstBuffer:[Ljava/nio/ByteBuffer;
const/4 v1, 0x0
aput-object p1, v0, v1
return-object v0
.end method
.method private singleSrcBuffer(Ljava/nio/ByteBuffer;)[Ljava/nio/ByteBuffer;
.registers 4
iget-object v0, p0, Lorg/conscrypt/ConscryptEngine;->singleSrcBuffer:[Ljava/nio/ByteBuffer;
const/4 v1, 0x0
aput-object p1, v0, v1
return-object v0
.end method
.method private transitionTo(I)V
.registers 5
const/4 v0, 0x2
if-eq p1, v0, :cond_20
const/16 v1, 0x8
if-eq p1, v1, :cond_8
goto :goto_32
:cond_8
iget-object v2, p0, Lorg/conscrypt/ConscryptEngine;->ssl:Lorg/conscrypt/NativeSsl;
invoke-virtual {v2}, Lorg/conscrypt/NativeSsl;->isClosed()Z
move-result v2
if-nez v2, :cond_32
iget v2, p0, Lorg/conscrypt/ConscryptEngine;->state:I
if-lt v2, v0, :cond_32
if-ge v2, v1, :cond_32
new-instance v0, Lorg/conscrypt/SessionSnapshot;
iget-object v1, p0, Lorg/conscrypt/ConscryptEngine;->activeSession:Lorg/conscrypt/ActiveSession;
invoke-direct {v0, v1}, Lorg/conscrypt/SessionSnapshot;-><init>(Lorg/conscrypt/ConscryptSession;)V
iput-object v0, p0, Lorg/conscrypt/ConscryptEngine;->closedSession:Lorg/conscrypt/SessionSnapshot;
goto :goto_32
:cond_20
const/4 v0, 0x0
iput-boolean v0, p0, Lorg/conscrypt/ConscryptEngine;->handshakeFinished:Z
new-instance v0, Lorg/conscrypt/ActiveSession;
iget-object v1, p0, Lorg/conscrypt/ConscryptEngine;->ssl:Lorg/conscrypt/NativeSsl;
iget-object v2, p0, Lorg/conscrypt/ConscryptEngine;->sslParameters:Lorg/conscrypt/SSLParametersImpl;
invoke-virtual {v2}, Lorg/conscrypt/SSLParametersImpl;->getSessionContext()Lorg/conscrypt/AbstractSessionContext;
move-result-object v2
invoke-direct {v0, v1, v2}, Lorg/conscrypt/ActiveSession;-><init>(Lorg/conscrypt/NativeSsl;Lorg/conscrypt/AbstractSessionContext;)V
iput-object v0, p0, Lorg/conscrypt/ConscryptEngine;->activeSession:Lorg/conscrypt/ActiveSession;
:cond_32
:goto_32
iput p1, p0, Lorg/conscrypt/ConscryptEngine;->state:I
return-void
.end method
.method private writeEncryptedData(Ljava/nio/ByteBuffer;I)I
.registers 5
:try_start_0
invoke-virtual {p1}, Ljava/nio/ByteBuffer;->position()I
move-result v0
invoke-virtual {p1}, Ljava/nio/ByteBuffer;->isDirect()Z
move-result v1
if-eqz v1, :cond_f
invoke-direct {p0, p1, v0, p2}, Lorg/conscrypt/ConscryptEngine;->writeEncryptedDataDirect(Ljava/nio/ByteBuffer;II)I
move-result p2
goto :goto_13
:cond_f
invoke-direct {p0, p1, v0, p2}, Lorg/conscrypt/ConscryptEngine;->writeEncryptedDataHeap(Ljava/nio/ByteBuffer;II)I
move-result p2
:goto_13
if-lez p2, :cond_19
add-int/2addr v0, p2
invoke-virtual {p1, v0}, Ljava/nio/ByteBuffer;->position(I)Ljava/nio/Buffer;
:try_end_19
.catch Ljava/io/IOException; {:try_start_0 .. :try_end_19} :catch_1a
:cond_19
return p2
:catch_1a
move-exception p1
invoke-direct {p0}, Lorg/conscrypt/ConscryptEngine;->closeAll()V
new-instance p2, Ljavax/net/ssl/SSLException;
invoke-direct {p2, p1}, Ljavax/net/ssl/SSLException;-><init>(Ljava/lang/Throwable;)V
throw p2
.end method
.method private writeEncryptedDataDirect(Ljava/nio/ByteBuffer;II)I
.registers 5
iget-object v0, p0, Lorg/conscrypt/ConscryptEngine;->networkBio:Lorg/conscrypt/NativeSsl$BioWrapper;
invoke-direct {p0, p1, p2}, Lorg/conscrypt/ConscryptEngine;->directByteBufferAddress(Ljava/nio/ByteBuffer;I)J
move-result-wide p1
invoke-virtual {v0, p1, p2, p3}, Lorg/conscrypt/NativeSsl$BioWrapper;->writeDirectByteBuffer(JI)I
move-result p1
return p1
.end method
.method private writeEncryptedDataHeap(Ljava/nio/ByteBuffer;II)I
.registers 8
const/4 v0, 0x0
:try_start_1
iget-object v1, p0, Lorg/conscrypt/ConscryptEngine;->bufferAllocator:Lorg/conscrypt/BufferAllocator;
if-eqz v1, :cond_e
invoke-virtual {v1, p3}, Lorg/conscrypt/BufferAllocator;->allocateDirectBuffer(I)Lorg/conscrypt/AllocatedBuffer;
move-result-object v0
invoke-virtual {v0}, Lorg/conscrypt/AllocatedBuffer;->nioBuffer()Ljava/nio/ByteBuffer;
move-result-object v1
goto :goto_12
:cond_e
invoke-direct {p0}, Lorg/conscrypt/ConscryptEngine;->getOrCreateLazyDirectBuffer()Ljava/nio/ByteBuffer;
move-result-object v1
:goto_12
invoke-virtual {p1}, Ljava/nio/ByteBuffer;->limit()I
move-result v2
sub-int v3, v2, p2
invoke-static {v3, p3}, Ljava/lang/Math;->min(II)I
move-result p3
invoke-virtual {v1}, Ljava/nio/ByteBuffer;->remaining()I
move-result v3
invoke-static {p3, v3}, Ljava/lang/Math;->min(II)I
move-result p3
add-int v3, p2, p3
invoke-virtual {p1, v3}, Ljava/nio/ByteBuffer;->limit(I)Ljava/nio/Buffer;
invoke-virtual {v1, p1}, Ljava/nio/ByteBuffer;->put(Ljava/nio/ByteBuffer;)Ljava/nio/ByteBuffer;
invoke-virtual {p1, v2}, Ljava/nio/ByteBuffer;->limit(I)Ljava/nio/Buffer;
invoke-virtual {p1, p2}, Ljava/nio/ByteBuffer;->position(I)Ljava/nio/Buffer;
const/4 v2, 0x0
invoke-direct {p0, v1, v2, p3}, Lorg/conscrypt/ConscryptEngine;->writeEncryptedDataDirect(Ljava/nio/ByteBuffer;II)I
move-result p3
invoke-virtual {p1, p2}, Ljava/nio/ByteBuffer;->position(I)Ljava/nio/Buffer;
:try_end_3a
.catchall {:try_start_1 .. :try_end_3a} :catchall_40
if-eqz v0, :cond_3f
invoke-virtual {v0}, Lorg/conscrypt/AllocatedBuffer;->release()Lorg/conscrypt/AllocatedBuffer;
:cond_3f
return p3
:catchall_40
move-exception p1
if-eqz v0, :cond_46
invoke-virtual {v0}, Lorg/conscrypt/AllocatedBuffer;->release()Lorg/conscrypt/AllocatedBuffer;
:cond_46
throw p1
.end method
.method private writePlaintextData(Ljava/nio/ByteBuffer;I)I
.registers 5
:try_start_0
invoke-virtual {p1}, Ljava/nio/ByteBuffer;->position()I
move-result v0
invoke-virtual {p1}, Ljava/nio/ByteBuffer;->isDirect()Z
move-result v1
if-eqz v1, :cond_f
invoke-direct {p0, p1, v0, p2}, Lorg/conscrypt/ConscryptEngine;->writePlaintextDataDirect(Ljava/nio/ByteBuffer;II)I
move-result p2
goto :goto_13
:cond_f
invoke-direct {p0, p1, v0, p2}, Lorg/conscrypt/ConscryptEngine;->writePlaintextDataHeap(Ljava/nio/ByteBuffer;II)I
move-result p2
:goto_13
if-lez p2, :cond_19
add-int/2addr v0, p2
invoke-virtual {p1, v0}, Ljava/nio/ByteBuffer;->position(I)Ljava/nio/Buffer;
:try_end_19
.catch Ljava/lang/Exception; {:try_start_0 .. :try_end_19} :catch_1a
:cond_19
return p2
:catch_1a
move-exception p1
invoke-direct {p0, p1}, Lorg/conscrypt/ConscryptEngine;->convertException(Ljava/lang/Throwable;)Ljavax/net/ssl/SSLException;
move-result-object p1
throw p1
.end method
.method private writePlaintextDataDirect(Ljava/nio/ByteBuffer;II)I
.registers 5
iget-object v0, p0, Lorg/conscrypt/ConscryptEngine;->ssl:Lorg/conscrypt/NativeSsl;
invoke-direct {p0, p1, p2}, Lorg/conscrypt/ConscryptEngine;->directByteBufferAddress(Ljava/nio/ByteBuffer;I)J
move-result-wide p1
invoke-virtual {v0, p1, p2, p3}, Lorg/conscrypt/NativeSsl;->writeDirectByteBuffer(JI)I
move-result p1
return p1
.end method
.method private writePlaintextDataHeap(Ljava/nio/ByteBuffer;II)I
.registers 8
const/4 v0, 0x0
:try_start_1
iget-object v1, p0, Lorg/conscrypt/ConscryptEngine;->bufferAllocator:Lorg/conscrypt/BufferAllocator;
if-eqz v1, :cond_e
invoke-virtual {v1, p3}, Lorg/conscrypt/BufferAllocator;->allocateDirectBuffer(I)Lorg/conscrypt/AllocatedBuffer;
move-result-object v0
invoke-virtual {v0}, Lorg/conscrypt/AllocatedBuffer;->nioBuffer()Ljava/nio/ByteBuffer;
move-result-object v1
goto :goto_12
:cond_e
invoke-direct {p0}, Lorg/conscrypt/ConscryptEngine;->getOrCreateLazyDirectBuffer()Ljava/nio/ByteBuffer;
move-result-object v1
:goto_12
invoke-virtual {p1}, Ljava/nio/ByteBuffer;->limit()I
move-result v2
invoke-virtual {v1}, Ljava/nio/ByteBuffer;->remaining()I
move-result v3
invoke-static {p3, v3}, Ljava/lang/Math;->min(II)I
move-result p3
add-int v3, p2, p3
invoke-virtual {p1, v3}, Ljava/nio/ByteBuffer;->limit(I)Ljava/nio/Buffer;
invoke-virtual {v1, p1}, Ljava/nio/ByteBuffer;->put(Ljava/nio/ByteBuffer;)Ljava/nio/ByteBuffer;
invoke-virtual {v1}, Ljava/nio/ByteBuffer;->flip()Ljava/nio/Buffer;
invoke-virtual {p1, v2}, Ljava/nio/ByteBuffer;->limit(I)Ljava/nio/Buffer;
invoke-virtual {p1, p2}, Ljava/nio/ByteBuffer;->position(I)Ljava/nio/Buffer;
const/4 p1, 0x0
invoke-direct {p0, v1, p1, p3}, Lorg/conscrypt/ConscryptEngine;->writePlaintextDataDirect(Ljava/nio/ByteBuffer;II)I
move-result p1
:try_end_34
.catchall {:try_start_1 .. :try_end_34} :catchall_3a
if-eqz v0, :cond_39
invoke-virtual {v0}, Lorg/conscrypt/AllocatedBuffer;->release()Lorg/conscrypt/AllocatedBuffer;
:cond_39
return p1
:catchall_3a
move-exception p1
if-eqz v0, :cond_40
invoke-virtual {v0}, Lorg/conscrypt/AllocatedBuffer;->release()Lorg/conscrypt/AllocatedBuffer;
:cond_40
throw p1
.end method
# virtual methods
.method public beginHandshake()V
.registers 3
iget-object v0, p0, Lorg/conscrypt/ConscryptEngine;->ssl:Lorg/conscrypt/NativeSsl;
monitor-enter v0
:try_start_3
invoke-direct {p0}, Lorg/conscrypt/ConscryptEngine;->beginHandshakeInternal()V
monitor-exit v0
return-void
:catchall_8
move-exception v1
monitor-exit v0
:try_end_a
.catchall {:try_start_3 .. :try_end_a} :catchall_8
throw v1
.end method
.method public chooseClientAlias(Ljavax/net/ssl/X509KeyManager;[Ljavax/security/auth/x500/X500Principal;[Ljava/lang/String;)Ljava/lang/String;
.registers 5
instance-of v0, p1, Ljavax/net/ssl/X509ExtendedKeyManager;
if-eqz v0, :cond_b
check-cast p1, Ljavax/net/ssl/X509ExtendedKeyManager;
invoke-virtual {p1, p3, p2, p0}, Ljavax/net/ssl/X509ExtendedKeyManager;->chooseEngineClientAlias([Ljava/lang/String;[Ljava/security/Principal;Ljavax/net/ssl/SSLEngine;)Ljava/lang/String;
move-result-object p1
return-object p1
:cond_b
const/4 v0, 0x0
invoke-interface {p1, p3, p2, v0}, Ljavax/net/ssl/X509KeyManager;->chooseClientAlias([Ljava/lang/String;[Ljava/security/Principal;Ljava/net/Socket;)Ljava/lang/String;
move-result-object p1
return-object p1
.end method
.method public chooseClientPSKIdentity(Lorg/conscrypt/PSKKeyManager;Ljava/lang/String;)Ljava/lang/String;
.registers 3
invoke-interface {p1, p2, p0}, Lorg/conscrypt/PSKKeyManager;->chooseClientKeyIdentity(Ljava/lang/String;Ljavax/net/ssl/SSLEngine;)Ljava/lang/String;
move-result-object p1
return-object p1
.end method
.method public chooseServerAlias(Ljavax/net/ssl/X509KeyManager;Ljava/lang/String;)Ljava/lang/String;
.registers 5
instance-of v0, p1, Ljavax/net/ssl/X509ExtendedKeyManager;
const/4 v1, 0x0
if-eqz v0, :cond_c
check-cast p1, Ljavax/net/ssl/X509ExtendedKeyManager;
invoke-virtual {p1, p2, v1, p0}, Ljavax/net/ssl/X509ExtendedKeyManager;->chooseEngineServerAlias(Ljava/lang/String;[Ljava/security/Principal;Ljavax/net/ssl/SSLEngine;)Ljava/lang/String;
move-result-object p1
return-object p1
:cond_c
invoke-interface {p1, p2, v1, v1}, Ljavax/net/ssl/X509KeyManager;->chooseServerAlias(Ljava/lang/String;[Ljava/security/Principal;Ljava/net/Socket;)Ljava/lang/String;
move-result-object p1
return-object p1
.end method
.method public chooseServerPSKIdentityHint(Lorg/conscrypt/PSKKeyManager;)Ljava/lang/String;
.registers 2
invoke-interface {p1, p0}, Lorg/conscrypt/PSKKeyManager;->chooseServerKeyIdentityHint(Ljavax/net/ssl/SSLEngine;)Ljava/lang/String;
move-result-object p1
return-object p1
.end method
.method public clientCertificateRequested([B[I[[B)V
.registers 5
iget-object v0, p0, Lorg/conscrypt/ConscryptEngine;->ssl:Lorg/conscrypt/NativeSsl;
invoke-virtual {v0, p1, p2, p3}, Lorg/conscrypt/NativeSsl;->chooseClientCertificate([B[I[[B)V
return-void
.end method
.method public clientPSKKeyRequested(Ljava/lang/String;[B[B)I
.registers 5
iget-object v0, p0, Lorg/conscrypt/ConscryptEngine;->ssl:Lorg/conscrypt/NativeSsl;
invoke-virtual {v0, p1, p2, p3}, Lorg/conscrypt/NativeSsl;->clientPSKKeyRequested(Ljava/lang/String;[B[B)I
move-result p1
return p1
.end method
.method public closeInbound()V
.registers 6
iget-object v0, p0, Lorg/conscrypt/ConscryptEngine;->ssl:Lorg/conscrypt/NativeSsl;
monitor-enter v0
:try_start_3
iget v1, p0, Lorg/conscrypt/ConscryptEngine;->state:I
const/16 v2, 0x8
if-eq v1, v2, :cond_28
const/4 v3, 0x6
if-ne v1, v3, :cond_d
goto :goto_28
:cond_d
invoke-direct {p0}, Lorg/conscrypt/ConscryptEngine;->isHandshakeStarted()Z
move-result v1
if-eqz v1, :cond_23
iget v1, p0, Lorg/conscrypt/ConscryptEngine;->state:I
const/4 v4, 0x7
if-ne v1, v4, :cond_1c
invoke-direct {p0, v2}, Lorg/conscrypt/ConscryptEngine;->transitionTo(I)V
goto :goto_1f
:cond_1c
invoke-direct {p0, v3}, Lorg/conscrypt/ConscryptEngine;->transitionTo(I)V
:goto_1f
invoke-direct {p0}, Lorg/conscrypt/ConscryptEngine;->freeIfDone()V
goto :goto_26
:cond_23
invoke-direct {p0}, Lorg/conscrypt/ConscryptEngine;->closeAndFreeResources()V
:goto_26
monitor-exit v0
return-void
:cond_28
:goto_28
monitor-exit v0
return-void
:catchall_2a
move-exception v1
monitor-exit v0
:try_end_2c
.catchall {:try_start_3 .. :try_end_2c} :catchall_2a
throw v1
.end method
.method public closeOutbound()V
.registers 6
iget-object v0, p0, Lorg/conscrypt/ConscryptEngine;->ssl:Lorg/conscrypt/NativeSsl;
monitor-enter v0
:try_start_3
iget v1, p0, Lorg/conscrypt/ConscryptEngine;->state:I
const/16 v2, 0x8
if-eq v1, v2, :cond_2b
const/4 v3, 0x7
if-ne v1, v3, :cond_d
goto :goto_2b
:cond_d
invoke-direct {p0}, Lorg/conscrypt/ConscryptEngine;->isHandshakeStarted()Z
move-result v1
if-eqz v1, :cond_26
iget v1, p0, Lorg/conscrypt/ConscryptEngine;->state:I
const/4 v4, 0x6
if-ne v1, v4, :cond_1c
invoke-direct {p0, v2}, Lorg/conscrypt/ConscryptEngine;->transitionTo(I)V
goto :goto_1f
:cond_1c
invoke-direct {p0, v3}, Lorg/conscrypt/ConscryptEngine;->transitionTo(I)V
:goto_1f
invoke-direct {p0}, Lorg/conscrypt/ConscryptEngine;->sendSSLShutdown()V
invoke-direct {p0}, Lorg/conscrypt/ConscryptEngine;->freeIfDone()V
goto :goto_29
:cond_26
invoke-direct {p0}, Lorg/conscrypt/ConscryptEngine;->closeAndFreeResources()V
:goto_29
monitor-exit v0
return-void
:cond_2b
:goto_2b
monitor-exit v0
return-void
:catchall_2d
move-exception v1
monitor-exit v0
:try_end_2f
.catchall {:try_start_3 .. :try_end_2f} :catchall_2d
throw v1
.end method
.method exportKeyingMaterial(Ljava/lang/String;[BI)[B
.registers 7
iget-object v0, p0, Lorg/conscrypt/ConscryptEngine;->ssl:Lorg/conscrypt/NativeSsl;
monitor-enter v0
:try_start_3
iget v1, p0, Lorg/conscrypt/ConscryptEngine;->state:I
const/4 v2, 0x3
if-lt v1, v2, :cond_15
const/16 v2, 0x8
if-ne v1, v2, :cond_d
goto :goto_15
:cond_d
monitor-exit v0
:try_end_e
.catchall {:try_start_3 .. :try_end_e} :catchall_18
iget-object v0, p0, Lorg/conscrypt/ConscryptEngine;->ssl:Lorg/conscrypt/NativeSsl;
invoke-virtual {v0, p1, p2, p3}, Lorg/conscrypt/NativeSsl;->exportKeyingMaterial(Ljava/lang/String;[BI)[B
move-result-object p1
return-object p1
:cond_15
:goto_15
const/4 p1, 0x0
:try_start_16
monitor-exit v0
return-object p1
:catchall_18
move-exception p1
monitor-exit v0
:try_end_1a
.catchall {:try_start_16 .. :try_end_1a} :catchall_18
throw p1
.end method
.method protected finalize()V
.registers 2
:try_start_0
invoke-direct {p0}, Lorg/conscrypt/ConscryptEngine;->closeAndFreeResources()V
:try_end_3
.catchall {:try_start_0 .. :try_end_3} :catchall_7
invoke-super {p0}, Ljava/lang/Object;->finalize()V
return-void
:catchall_7
move-exception v0
invoke-super {p0}, Ljava/lang/Object;->finalize()V
throw v0
.end method
.method public getApplicationProtocol()Ljava/lang/String;
.registers 2
invoke-direct {p0}, Lorg/conscrypt/ConscryptEngine;->provideAfterHandshakeSession()Lorg/conscrypt/ConscryptSession;
move-result-object v0
invoke-interface {v0}, Lorg/conscrypt/ConscryptSession;->getApplicationProtocol()Ljava/lang/String;
move-result-object v0
return-object v0
.end method
.method getApplicationProtocols()[Ljava/lang/String;
.registers 2
iget-object v0, p0, Lorg/conscrypt/ConscryptEngine;->sslParameters:Lorg/conscrypt/SSLParametersImpl;
invoke-virtual {v0}, Lorg/conscrypt/SSLParametersImpl;->getApplicationProtocols()[Ljava/lang/String;
move-result-object v0
return-object v0
.end method
.method getChannelId()[B
.registers 4
iget-object v0, p0, Lorg/conscrypt/ConscryptEngine;->ssl:Lorg/conscrypt/NativeSsl;
monitor-enter v0
:try_start_3
invoke-virtual {p0}, Lorg/conscrypt/ConscryptEngine;->getUseClientMode()Z
move-result v1
if-nez v1, :cond_1f
invoke-direct {p0}, Lorg/conscrypt/ConscryptEngine;->isHandshakeStarted()Z
move-result v1
if-nez v1, :cond_17
iget-object v1, p0, Lorg/conscrypt/ConscryptEngine;->ssl:Lorg/conscrypt/NativeSsl;
invoke-virtual {v1}, Lorg/conscrypt/NativeSsl;->getTlsChannelId()[B
move-result-object v1
monitor-exit v0
return-object v1
:cond_17
new-instance v1, Ljava/lang/IllegalStateException;
const-string v2, "Channel ID is only available after handshake completes"
invoke-direct {v1, v2}, Ljava/lang/IllegalStateException;-><init>(Ljava/lang/String;)V
throw v1
:cond_1f
new-instance v1, Ljava/lang/IllegalStateException;
const-string v2, "Not allowed in client mode"
invoke-direct {v1, v2}, Ljava/lang/IllegalStateException;-><init>(Ljava/lang/String;)V
throw v1
:catchall_27
move-exception v1
monitor-exit v0
:try_end_29
.catchall {:try_start_3 .. :try_end_29} :catchall_27
throw v1
.end method
.method public getDelegatedTask()Ljava/lang/Runnable;
.registers 2
const/4 v0, 0x0
return-object v0
.end method
.method public getEnableSessionCreation()Z
.registers 2
iget-object v0, p0, Lorg/conscrypt/ConscryptEngine;->sslParameters:Lorg/conscrypt/SSLParametersImpl;
invoke-virtual {v0}, Lorg/conscrypt/SSLParametersImpl;->getEnableSessionCreation()Z
move-result v0
return v0
.end method
.method public getEnabledCipherSuites()[Ljava/lang/String;
.registers 2
iget-object v0, p0, Lorg/conscrypt/ConscryptEngine;->sslParameters:Lorg/conscrypt/SSLParametersImpl;
invoke-virtual {v0}, Lorg/conscrypt/SSLParametersImpl;->getEnabledCipherSuites()[Ljava/lang/String;
move-result-object v0
return-object v0
.end method
.method public getEnabledProtocols()[Ljava/lang/String;
.registers 2
iget-object v0, p0, Lorg/conscrypt/ConscryptEngine;->sslParameters:Lorg/conscrypt/SSLParametersImpl;
invoke-virtual {v0}, Lorg/conscrypt/SSLParametersImpl;->getEnabledProtocols()[Ljava/lang/String;
move-result-object v0
return-object v0
.end method
.method public getHandshakeApplicationProtocol()Ljava/lang/String;
.registers 4
iget-object v0, p0, Lorg/conscrypt/ConscryptEngine;->ssl:Lorg/conscrypt/NativeSsl;
monitor-enter v0
:try_start_3
iget v1, p0, Lorg/conscrypt/ConscryptEngine;->state:I
const/4 v2, 0x2
if-lt v1, v2, :cond_d
invoke-virtual {p0}, Lorg/conscrypt/ConscryptEngine;->getApplicationProtocol()Ljava/lang/String;
move-result-object v1
goto :goto_e
:cond_d
const/4 v1, 0x0
:goto_e
monitor-exit v0
return-object v1
:catchall_10
move-exception v1
monitor-exit v0
:try_end_12
.catchall {:try_start_3 .. :try_end_12} :catchall_10
throw v1
.end method
.method public getHandshakeStatus()Ljavax/net/ssl/SSLEngineResult$HandshakeStatus;
.registers 3
iget-object v0, p0, Lorg/conscrypt/ConscryptEngine;->ssl:Lorg/conscrypt/NativeSsl;
monitor-enter v0
:try_start_3
invoke-direct {p0}, Lorg/conscrypt/ConscryptEngine;->getHandshakeStatusInternal()Ljavax/net/ssl/SSLEngineResult$HandshakeStatus;
move-result-object v1
monitor-exit v0
return-object v1
:catchall_9
move-exception v1
monitor-exit v0
:try_end_b
.catchall {:try_start_3 .. :try_end_b} :catchall_9
throw v1
.end method
.method getHostname()Ljava/lang/String;
.registers 2
iget-object v0, p0, Lorg/conscrypt/ConscryptEngine;->peerHostname:Ljava/lang/String;
if-eqz v0, :cond_5
goto :goto_b
:cond_5
iget-object v0, p0, Lorg/conscrypt/ConscryptEngine;->peerInfoProvider:Lorg/conscrypt/PeerInfoProvider;
invoke-virtual {v0}, Lorg/conscrypt/PeerInfoProvider;->getHostname()Ljava/lang/String;
move-result-object v0
:goto_b
return-object v0
.end method
.method public getNeedClientAuth()Z
.registers 2
iget-object v0, p0, Lorg/conscrypt/ConscryptEngine;->sslParameters:Lorg/conscrypt/SSLParametersImpl;
invoke-virtual {v0}, Lorg/conscrypt/SSLParametersImpl;->getNeedClientAuth()Z
move-result v0
return v0
.end method
.method public getPSKKey(Lorg/conscrypt/PSKKeyManager;Ljava/lang/String;Ljava/lang/String;)Ljavax/crypto/SecretKey;
.registers 4
invoke-interface {p1, p2, p3, p0}, Lorg/conscrypt/PSKKeyManager;->getKey(Ljava/lang/String;Ljava/lang/String;Ljavax/net/ssl/SSLEngine;)Ljavax/crypto/SecretKey;
move-result-object p1
return-object p1
.end method
.method public getPeerHost()Ljava/lang/String;
.registers 2
iget-object v0, p0, Lorg/conscrypt/ConscryptEngine;->peerHostname:Ljava/lang/String;
if-eqz v0, :cond_5
goto :goto_b
:cond_5
iget-object v0, p0, Lorg/conscrypt/ConscryptEngine;->peerInfoProvider:Lorg/conscrypt/PeerInfoProvider;
invoke-virtual {v0}, Lorg/conscrypt/PeerInfoProvider;->getHostnameOrIP()Ljava/lang/String;
move-result-object v0
:goto_b
return-object v0
.end method
.method public getPeerPort()I
.registers 2
iget-object v0, p0, Lorg/conscrypt/ConscryptEngine;->peerInfoProvider:Lorg/conscrypt/PeerInfoProvider;
invoke-virtual {v0}, Lorg/conscrypt/PeerInfoProvider;->getPort()I
move-result v0
return v0
.end method
.method public getSSLParameters()Ljavax/net/ssl/SSLParameters;
.registers 3
invoke-super {p0}, Ljavax/net/ssl/SSLEngine;->getSSLParameters()Ljavax/net/ssl/SSLParameters;
move-result-object v0
iget-object v1, p0, Lorg/conscrypt/ConscryptEngine;->sslParameters:Lorg/conscrypt/SSLParametersImpl;
invoke-static {v0, v1, p0}, Lorg/conscrypt/Platform;->getSSLParameters(Ljavax/net/ssl/SSLParameters;Lorg/conscrypt/SSLParametersImpl;Lorg/conscrypt/ConscryptEngine;)V
return-object v0
.end method
.method public getSession()Ljavax/net/ssl/SSLSession;
.registers 2
iget-object v0, p0, Lorg/conscrypt/ConscryptEngine;->externalSession:Ljavax/net/ssl/SSLSession;
return-object v0
.end method
.method public getSupportedCipherSuites()[Ljava/lang/String;
.registers 2
invoke-static {}, Lorg/conscrypt/NativeCrypto;->getSupportedCipherSuites()[Ljava/lang/String;
move-result-object v0
return-object v0
.end method
.method public getSupportedProtocols()[Ljava/lang/String;
.registers 2
invoke-static {}, Lorg/conscrypt/NativeCrypto;->getSupportedProtocols()[Ljava/lang/String;
move-result-object v0
return-object v0
.end method
.method getTlsUnique()[B
.registers 2
iget-object v0, p0, Lorg/conscrypt/ConscryptEngine;->ssl:Lorg/conscrypt/NativeSsl;
invoke-virtual {v0}, Lorg/conscrypt/NativeSsl;->getTlsUnique()[B
move-result-object v0
return-object v0
.end method
.method public getUseClientMode()Z
.registers 2
iget-object v0, p0, Lorg/conscrypt/ConscryptEngine;->sslParameters:Lorg/conscrypt/SSLParametersImpl;
invoke-virtual {v0}, Lorg/conscrypt/SSLParametersImpl;->getUseClientMode()Z
move-result v0
return v0
.end method
.method public getWantClientAuth()Z
.registers 2
iget-object v0, p0, Lorg/conscrypt/ConscryptEngine;->sslParameters:Lorg/conscrypt/SSLParametersImpl;
invoke-virtual {v0}, Lorg/conscrypt/SSLParametersImpl;->getWantClientAuth()Z
move-result v0
return v0
.end method
.method handshakeSession()Ljavax/net/ssl/SSLSession;
.registers 4
iget-object v0, p0, Lorg/conscrypt/ConscryptEngine;->ssl:Lorg/conscrypt/NativeSsl;
monitor-enter v0
:try_start_3
iget v1, p0, Lorg/conscrypt/ConscryptEngine;->state:I
const/4 v2, 0x2
if-ne v1, v2, :cond_18
new-instance v1, Lorg/conscrypt/ExternalSession;
new-instance v2, Lorg/conscrypt/ConscryptEngine$2;
invoke-direct {v2, p0}, Lorg/conscrypt/ConscryptEngine$2;-><init>(Lorg/conscrypt/ConscryptEngine;)V
invoke-direct {v1, v2}, Lorg/conscrypt/ExternalSession;-><init>(Lorg/conscrypt/ExternalSession$Provider;)V
invoke-static {v1}, Lorg/conscrypt/Platform;->wrapSSLSession(Lorg/conscrypt/ExternalSession;)Ljavax/net/ssl/SSLSession;
move-result-object v1
monitor-exit v0
return-object v1
:cond_18
const/4 v1, 0x0
monitor-exit v0
return-object v1
:catchall_1b
move-exception v1
monitor-exit v0
:try_end_1d
.catchall {:try_start_3 .. :try_end_1d} :catchall_1b
throw v1
.end method
.method public isInboundDone()Z
.registers 4
iget-object v0, p0, Lorg/conscrypt/ConscryptEngine;->ssl:Lorg/conscrypt/NativeSsl;
monitor-enter v0
:try_start_3
iget v1, p0, Lorg/conscrypt/ConscryptEngine;->state:I
const/16 v2, 0x8
if-eq v1, v2, :cond_14
const/4 v2, 0x6
if-eq v1, v2, :cond_14
iget-object v1, p0, Lorg/conscrypt/ConscryptEngine;->ssl:Lorg/conscrypt/NativeSsl;
invoke-virtual {v1}, Lorg/conscrypt/NativeSsl;->wasShutdownReceived()Z
move-result v1
if-eqz v1, :cond_1c
:cond_14
invoke-direct {p0}, Lorg/conscrypt/ConscryptEngine;->pendingInboundCleartextBytes()I
move-result v1
if-nez v1, :cond_1c
const/4 v1, 0x1
goto :goto_1d
:cond_1c
const/4 v1, 0x0
:goto_1d
monitor-exit v0
return v1
:catchall_1f
move-exception v1
monitor-exit v0
:try_end_21
.catchall {:try_start_3 .. :try_end_21} :catchall_1f
throw v1
.end method
.method public isOutboundDone()Z
.registers 4
iget-object v0, p0, Lorg/conscrypt/ConscryptEngine;->ssl:Lorg/conscrypt/NativeSsl;
monitor-enter v0
:try_start_3
iget v1, p0, Lorg/conscrypt/ConscryptEngine;->state:I
const/16 v2, 0x8
if-eq v1, v2, :cond_14
const/4 v2, 0x7
if-eq v1, v2, :cond_14
iget-object v1, p0, Lorg/conscrypt/ConscryptEngine;->ssl:Lorg/conscrypt/NativeSsl;
invoke-virtual {v1}, Lorg/conscrypt/NativeSsl;->wasShutdownSent()Z
move-result v1
if-eqz v1, :cond_1c
:cond_14
invoke-virtual {p0}, Lorg/conscrypt/ConscryptEngine;->pendingOutboundEncryptedBytes()I
move-result v1
if-nez v1, :cond_1c
const/4 v1, 0x1
goto :goto_1d
:cond_1c
const/4 v1, 0x0
:goto_1d
monitor-exit v0
return v1
:catchall_1f
move-exception v1
monitor-exit v0
:try_end_21
.catchall {:try_start_3 .. :try_end_21} :catchall_1f
throw v1
.end method
.method maxSealOverhead()I
.registers 2
iget v0, p0, Lorg/conscrypt/ConscryptEngine;->maxSealOverhead:I
return v0
.end method
.method public onNewSessionEstablished(J)V
.registers 4
:try_start_0
invoke-static {p1, p2}, Lorg/conscrypt/NativeCrypto;->SSL_SESSION_up_ref(J)V
new-instance v0, Lorg/conscrypt/NativeRef$SSL_SESSION;
invoke-direct {v0, p1, p2}, Lorg/conscrypt/NativeRef$SSL_SESSION;-><init>(J)V
iget-object p1, p0, Lorg/conscrypt/ConscryptEngine;->activeSession:Lorg/conscrypt/ActiveSession;
invoke-static {v0, p1}, Lorg/conscrypt/NativeSslSession;->newInstance(Lorg/conscrypt/NativeRef$SSL_SESSION;Lorg/conscrypt/ConscryptSession;)Lorg/conscrypt/NativeSslSession;
move-result-object p1
invoke-direct {p0}, Lorg/conscrypt/ConscryptEngine;->sessionContext()Lorg/conscrypt/AbstractSessionContext;
move-result-object p2
invoke-virtual {p2, p1}, Lorg/conscrypt/AbstractSessionContext;->cacheSession(Lorg/conscrypt/NativeSslSession;)V
:try_end_15
.catch Ljava/lang/Exception; {:try_start_0 .. :try_end_15} :catch_15
:catch_15
return-void
.end method
.method public onSSLStateChange(II)V
.registers 5
iget-object p2, p0, Lorg/conscrypt/ConscryptEngine;->ssl:Lorg/conscrypt/NativeSsl;
monitor-enter p2
const/16 v0, 0x10
const/4 v1, 0x2
if-eq p1, v0, :cond_33
const/16 v0, 0x20
if-eq p1, v0, :cond_d
goto :goto_36
:cond_d
:try_start_d
iget p1, p0, Lorg/conscrypt/ConscryptEngine;->state:I
if-eq p1, v1, :cond_2e
const/4 v0, 0x4
if-ne p1, v0, :cond_15
goto :goto_2e
:cond_15
new-instance p1, Ljava/lang/IllegalStateException;
new-instance v0, Ljava/lang/StringBuilder;
invoke-direct {v0}, Ljava/lang/StringBuilder;-><init>()V
const-string v1, "Completed handshake while in mode "
invoke-virtual {v0, v1}, Ljava/lang/StringBuilder;->append(Ljava/lang/String;)Ljava/lang/StringBuilder;
iget v1, p0, Lorg/conscrypt/ConscryptEngine;->state:I
invoke-virtual {v0, v1}, Ljava/lang/StringBuilder;->append(I)Ljava/lang/StringBuilder;
invoke-virtual {v0}, Ljava/lang/StringBuilder;->toString()Ljava/lang/String;
move-result-object v0
invoke-direct {p1, v0}, Ljava/lang/IllegalStateException;-><init>(Ljava/lang/String;)V
throw p1
:cond_2e
:goto_2e
const/4 p1, 0x3
invoke-direct {p0, p1}, Lorg/conscrypt/ConscryptEngine;->transitionTo(I)V
goto :goto_36
:cond_33
invoke-direct {p0, v1}, Lorg/conscrypt/ConscryptEngine;->transitionTo(I)V
:goto_36
monitor-exit p2
return-void
:catchall_38
move-exception p1
monitor-exit p2
:try_end_3a
.catchall {:try_start_d .. :try_end_3a} :catchall_38
throw p1
.end method
.method pendingOutboundEncryptedBytes()I
.registers 2
iget-object v0, p0, Lorg/conscrypt/ConscryptEngine;->networkBio:Lorg/conscrypt/NativeSsl$BioWrapper;
invoke-virtual {v0}, Lorg/conscrypt/NativeSsl$BioWrapper;->getPendingWrittenBytes()I
move-result v0
return v0
.end method
.method public selectApplicationProtocol([B)I
.registers 3
iget-object v0, p0, Lorg/conscrypt/ConscryptEngine;->sslParameters:Lorg/conscrypt/SSLParametersImpl;
invoke-virtual {v0}, Lorg/conscrypt/SSLParametersImpl;->getApplicationProtocolSelector()Lorg/conscrypt/ApplicationProtocolSelectorAdapter;
move-result-object v0
if-nez v0, :cond_a
const/4 p1, 0x3
return p1
:cond_a
invoke-virtual {v0, p1}, Lorg/conscrypt/ApplicationProtocolSelectorAdapter;->selectApplicationProtocol([B)I
move-result p1
return p1
.end method
.method public serverCertificateRequested()V
.registers 3
iget-object v0, p0, Lorg/conscrypt/ConscryptEngine;->ssl:Lorg/conscrypt/NativeSsl;
monitor-enter v0
:try_start_3
iget-object v1, p0, Lorg/conscrypt/ConscryptEngine;->ssl:Lorg/conscrypt/NativeSsl;
invoke-virtual {v1}, Lorg/conscrypt/NativeSsl;->configureServerCertificate()V
monitor-exit v0
return-void
:catchall_a
move-exception v1
monitor-exit v0
:try_end_c
.catchall {:try_start_3 .. :try_end_c} :catchall_a
throw v1
.end method
.method public serverPSKKeyRequested(Ljava/lang/String;Ljava/lang/String;[B)I
.registers 5
iget-object v0, p0, Lorg/conscrypt/ConscryptEngine;->ssl:Lorg/conscrypt/NativeSsl;
invoke-virtual {v0, p1, p2, p3}, Lorg/conscrypt/NativeSsl;->serverPSKKeyRequested(Ljava/lang/String;Ljava/lang/String;[B)I
move-result p1
return p1
.end method
.method public serverSessionRequested([B)J
.registers 4
const-wide/16 v0, 0x0
return-wide v0
.end method
.method setApplicationProtocolSelector(Lorg/conscrypt/ApplicationProtocolSelector;)V
.registers 3
if-nez p1, :cond_4
const/4 p1, 0x0
goto :goto_a
:cond_4
new-instance v0, Lorg/conscrypt/ApplicationProtocolSelectorAdapter;
invoke-direct {v0, p0, p1}, Lorg/conscrypt/ApplicationProtocolSelectorAdapter;-><init>(Ljavax/net/ssl/SSLEngine;Lorg/conscrypt/ApplicationProtocolSelector;)V
move-object p1, v0
:goto_a
invoke-virtual {p0, p1}, Lorg/conscrypt/ConscryptEngine;->setApplicationProtocolSelector(Lorg/conscrypt/ApplicationProtocolSelectorAdapter;)V
return-void
.end method
.method setApplicationProtocolSelector(Lorg/conscrypt/ApplicationProtocolSelectorAdapter;)V
.registers 3
iget-object v0, p0, Lorg/conscrypt/ConscryptEngine;->sslParameters:Lorg/conscrypt/SSLParametersImpl;
invoke-virtual {v0, p1}, Lorg/conscrypt/SSLParametersImpl;->setApplicationProtocolSelector(Lorg/conscrypt/ApplicationProtocolSelectorAdapter;)V
return-void
.end method
.method setApplicationProtocols([Ljava/lang/String;)V
.registers 3
iget-object v0, p0, Lorg/conscrypt/ConscryptEngine;->sslParameters:Lorg/conscrypt/SSLParametersImpl;
invoke-virtual {v0, p1}, Lorg/conscrypt/SSLParametersImpl;->setApplicationProtocols([Ljava/lang/String;)V
return-void
.end method
.method setBufferAllocator(Lorg/conscrypt/BufferAllocator;)V
.registers 4
iget-object v0, p0, Lorg/conscrypt/ConscryptEngine;->ssl:Lorg/conscrypt/NativeSsl;
monitor-enter v0
:try_start_3
invoke-direct {p0}, Lorg/conscrypt/ConscryptEngine;->isHandshakeStarted()Z
move-result v1
if-nez v1, :cond_d
iput-object p1, p0, Lorg/conscrypt/ConscryptEngine;->bufferAllocator:Lorg/conscrypt/BufferAllocator;
monitor-exit v0
return-void
:cond_d
new-instance p1, Ljava/lang/IllegalStateException;
const-string v1, "Could not set buffer allocator after the initial handshake has begun."
invoke-direct {p1, v1}, Ljava/lang/IllegalStateException;-><init>(Ljava/lang/String;)V
throw p1
:catchall_15
move-exception p1
monitor-exit v0
:try_end_17
.catchall {:try_start_3 .. :try_end_17} :catchall_15
throw p1
.end method
.method setChannelIdEnabled(Z)V
.registers 4
iget-object v0, p0, Lorg/conscrypt/ConscryptEngine;->ssl:Lorg/conscrypt/NativeSsl;
monitor-enter v0
:try_start_3
invoke-virtual {p0}, Lorg/conscrypt/ConscryptEngine;->getUseClientMode()Z
move-result v1
if-nez v1, :cond_1d
invoke-direct {p0}, Lorg/conscrypt/ConscryptEngine;->isHandshakeStarted()Z
move-result v1
if-nez v1, :cond_15
iget-object v1, p0, Lorg/conscrypt/ConscryptEngine;->sslParameters:Lorg/conscrypt/SSLParametersImpl;
iput-boolean p1, v1, Lorg/conscrypt/SSLParametersImpl;->channelIdEnabled:Z
monitor-exit v0
return-void
:cond_15
new-instance p1, Ljava/lang/IllegalStateException;
const-string v1, "Could not enable/disable Channel ID after the initial handshake has begun."
invoke-direct {p1, v1}, Ljava/lang/IllegalStateException;-><init>(Ljava/lang/String;)V
throw p1
:cond_1d
new-instance p1, Ljava/lang/IllegalStateException;
const-string v1, "Not allowed in client mode"
invoke-direct {p1, v1}, Ljava/lang/IllegalStateException;-><init>(Ljava/lang/String;)V
throw p1
:catchall_25
move-exception p1
monitor-exit v0
:try_end_27
.catchall {:try_start_3 .. :try_end_27} :catchall_25
throw p1
.end method
.method setChannelIdPrivateKey(Ljava/security/PrivateKey;)V
.registers 6
invoke-virtual {p0}, Lorg/conscrypt/ConscryptEngine;->getUseClientMode()Z
move-result v0
if-eqz v0, :cond_4a
iget-object v0, p0, Lorg/conscrypt/ConscryptEngine;->ssl:Lorg/conscrypt/NativeSsl;
monitor-enter v0
:try_start_9
invoke-direct {p0}, Lorg/conscrypt/ConscryptEngine;->isHandshakeStarted()Z
move-result v1
if-nez v1, :cond_3f
const/4 v1, 0x0
if-nez p1, :cond_1b
iget-object p1, p0, Lorg/conscrypt/ConscryptEngine;->sslParameters:Lorg/conscrypt/SSLParametersImpl;
const/4 v2, 0x0
iput-boolean v2, p1, Lorg/conscrypt/SSLParametersImpl;->channelIdEnabled:Z
iput-object v1, p0, Lorg/conscrypt/ConscryptEngine;->channelIdPrivateKey:Lorg/conscrypt/OpenSSLKey;
monitor-exit v0
return-void
:cond_1b
iget-object v2, p0, Lorg/conscrypt/ConscryptEngine;->sslParameters:Lorg/conscrypt/SSLParametersImpl;
const/4 v3, 0x1
iput-boolean v3, v2, Lorg/conscrypt/SSLParametersImpl;->channelIdEnabled:Z
:try_end_20
.catchall {:try_start_9 .. :try_end_20} :catchall_47
:try_start_20
instance-of v2, p1, Ljava/security/interfaces/ECKey;
if-eqz v2, :cond_2b
move-object v1, p1
check-cast v1, Ljava/security/interfaces/ECKey;
invoke-interface {v1}, Ljava/security/interfaces/ECKey;->getParams()Ljava/security/spec/ECParameterSpec;
move-result-object v1
:cond_2b
if-nez v1, :cond_37
const-string v1, "prime256v1"
invoke-static {v1}, Lorg/conscrypt/OpenSSLECGroupContext;->getCurveByName(Ljava/lang/String;)Lorg/conscrypt/OpenSSLECGroupContext;
move-result-object v1
invoke-virtual {v1}, Lorg/conscrypt/OpenSSLECGroupContext;->getECParameterSpec()Ljava/security/spec/ECParameterSpec;
move-result-object v1
:cond_37
invoke-static {p1, v1}, Lorg/conscrypt/OpenSSLKey;->fromECPrivateKeyForTLSStackOnly(Ljava/security/PrivateKey;Ljava/security/spec/ECParameterSpec;)Lorg/conscrypt/OpenSSLKey;
move-result-object p1
iput-object p1, p0, Lorg/conscrypt/ConscryptEngine;->channelIdPrivateKey:Lorg/conscrypt/OpenSSLKey;
:try_end_3d
.catch Ljava/security/InvalidKeyException; {:try_start_20 .. :try_end_3d} :catch_3d
.catchall {:try_start_20 .. :try_end_3d} :catchall_47
:catch_3d
:try_start_3d
monitor-exit v0
return-void
:cond_3f
new-instance p1, Ljava/lang/IllegalStateException;
const-string v1, "Could not change Channel ID private key after the initial handshake has begun."
invoke-direct {p1, v1}, Ljava/lang/IllegalStateException;-><init>(Ljava/lang/String;)V
throw p1
:catchall_47
move-exception p1
monitor-exit v0
:try_end_49
.catchall {:try_start_3d .. :try_end_49} :catchall_47
throw p1
:cond_4a
new-instance p1, Ljava/lang/IllegalStateException;
const-string v0, "Not allowed in server mode"
invoke-direct {p1, v0}, Ljava/lang/IllegalStateException;-><init>(Ljava/lang/String;)V
throw p1
.end method
.method public setEnableSessionCreation(Z)V
.registers 3
iget-object v0, p0, Lorg/conscrypt/ConscryptEngine;->sslParameters:Lorg/conscrypt/SSLParametersImpl;
invoke-virtual {v0, p1}, Lorg/conscrypt/SSLParametersImpl;->setEnableSessionCreation(Z)V
return-void
.end method
.method public setEnabledCipherSuites([Ljava/lang/String;)V
.registers 3
iget-object v0, p0, Lorg/conscrypt/ConscryptEngine;->sslParameters:Lorg/conscrypt/SSLParametersImpl;
invoke-virtual {v0, p1}, Lorg/conscrypt/SSLParametersImpl;->setEnabledCipherSuites([Ljava/lang/String;)V
return-void
.end method
.method public setEnabledProtocols([Ljava/lang/String;)V
.registers 3
iget-object v0, p0, Lorg/conscrypt/ConscryptEngine;->sslParameters:Lorg/conscrypt/SSLParametersImpl;
invoke-virtual {v0, p1}, Lorg/conscrypt/SSLParametersImpl;->setEnabledProtocols([Ljava/lang/String;)V
return-void
.end method
.method setHandshakeListener(Lorg/conscrypt/HandshakeListener;)V
.registers 4
iget-object v0, p0, Lorg/conscrypt/ConscryptEngine;->ssl:Lorg/conscrypt/NativeSsl;
monitor-enter v0
:try_start_3
invoke-direct {p0}, Lorg/conscrypt/ConscryptEngine;->isHandshakeStarted()Z
move-result v1
if-nez v1, :cond_d
iput-object p1, p0, Lorg/conscrypt/ConscryptEngine;->handshakeListener:Lorg/conscrypt/HandshakeListener;
monitor-exit v0
return-void
:cond_d
new-instance p1, Ljava/lang/IllegalStateException;
const-string v1, "Handshake listener must be set before starting the handshake."
invoke-direct {p1, v1}, Ljava/lang/IllegalStateException;-><init>(Ljava/lang/String;)V
throw p1
:catchall_15
move-exception p1
monitor-exit v0
:try_end_17
.catchall {:try_start_3 .. :try_end_17} :catchall_15
throw p1
.end method
.method setHostname(Ljava/lang/String;)V
.registers 4
iget-object v0, p0, Lorg/conscrypt/ConscryptEngine;->sslParameters:Lorg/conscrypt/SSLParametersImpl;
if-eqz p1, :cond_6
const/4 v1, 0x1
goto :goto_7
:cond_6
const/4 v1, 0x0
:goto_7
invoke-virtual {v0, v1}, Lorg/conscrypt/SSLParametersImpl;->setUseSni(Z)V
iput-object p1, p0, Lorg/conscrypt/ConscryptEngine;->peerHostname:Ljava/lang/String;
return-void
.end method
.method public setNeedClientAuth(Z)V
.registers 3
iget-object v0, p0, Lorg/conscrypt/ConscryptEngine;->sslParameters:Lorg/conscrypt/SSLParametersImpl;
invoke-virtual {v0, p1}, Lorg/conscrypt/SSLParametersImpl;->setNeedClientAuth(Z)V
return-void
.end method
.method public setSSLParameters(Ljavax/net/ssl/SSLParameters;)V
.registers 3
invoke-super {p0, p1}, Ljavax/net/ssl/SSLEngine;->setSSLParameters(Ljavax/net/ssl/SSLParameters;)V
iget-object v0, p0, Lorg/conscrypt/ConscryptEngine;->sslParameters:Lorg/conscrypt/SSLParametersImpl;
invoke-static {p1, v0, p0}, Lorg/conscrypt/Platform;->setSSLParameters(Ljavax/net/ssl/SSLParameters;Lorg/conscrypt/SSLParametersImpl;Lorg/conscrypt/ConscryptEngine;)V
return-void
.end method
.method public setUseClientMode(Z)V
.registers 5
iget-object v0, p0, Lorg/conscrypt/ConscryptEngine;->ssl:Lorg/conscrypt/NativeSsl;
monitor-enter v0
:try_start_3
invoke-direct {p0}, Lorg/conscrypt/ConscryptEngine;->isHandshakeStarted()Z
move-result v1
if-nez v1, :cond_14
const/4 v1, 0x1
invoke-direct {p0, v1}, Lorg/conscrypt/ConscryptEngine;->transitionTo(I)V
iget-object v1, p0, Lorg/conscrypt/ConscryptEngine;->sslParameters:Lorg/conscrypt/SSLParametersImpl;
invoke-virtual {v1, p1}, Lorg/conscrypt/SSLParametersImpl;->setUseClientMode(Z)V
monitor-exit v0
return-void
:cond_14
new-instance p1, Ljava/lang/IllegalArgumentException;
new-instance v1, Ljava/lang/StringBuilder;
invoke-direct {v1}, Ljava/lang/StringBuilder;-><init>()V
const-string v2, "Can not change mode after handshake: state == "
invoke-virtual {v1, v2}, Ljava/lang/StringBuilder;->append(Ljava/lang/String;)Ljava/lang/StringBuilder;
iget v2, p0, Lorg/conscrypt/ConscryptEngine;->state:I
invoke-virtual {v1, v2}, Ljava/lang/StringBuilder;->append(I)Ljava/lang/StringBuilder;
invoke-virtual {v1}, Ljava/lang/StringBuilder;->toString()Ljava/lang/String;
move-result-object v1
invoke-direct {p1, v1}, Ljava/lang/IllegalArgumentException;-><init>(Ljava/lang/String;)V
throw p1
:catchall_2d
move-exception p1
monitor-exit v0
:try_end_2f
.catchall {:try_start_3 .. :try_end_2f} :catchall_2d
throw p1
.end method
.method setUseSessionTickets(Z)V
.registers 3
iget-object v0, p0, Lorg/conscrypt/ConscryptEngine;->sslParameters:Lorg/conscrypt/SSLParametersImpl;
invoke-virtual {v0, p1}, Lorg/conscrypt/SSLParametersImpl;->setUseSessionTickets(Z)V
return-void
.end method
.method public setWantClientAuth(Z)V
.registers 3
iget-object v0, p0, Lorg/conscrypt/ConscryptEngine;->sslParameters:Lorg/conscrypt/SSLParametersImpl;
invoke-virtual {v0, p1}, Lorg/conscrypt/SSLParametersImpl;->setWantClientAuth(Z)V
return-void
.end method
.method public unwrap(Ljava/nio/ByteBuffer;Ljava/nio/ByteBuffer;)Ljavax/net/ssl/SSLEngineResult;
.registers 4
iget-object v0, p0, Lorg/conscrypt/ConscryptEngine;->ssl:Lorg/conscrypt/NativeSsl;
monitor-enter v0
:try_start_3
invoke-direct {p0, p1}, Lorg/conscrypt/ConscryptEngine;->singleSrcBuffer(Ljava/nio/ByteBuffer;)[Ljava/nio/ByteBuffer;
move-result-object p1
invoke-direct {p0, p2}, Lorg/conscrypt/ConscryptEngine;->singleDstBuffer(Ljava/nio/ByteBuffer;)[Ljava/nio/ByteBuffer;
move-result-object p2
invoke-virtual {p0, p1, p2}, Lorg/conscrypt/ConscryptEngine;->unwrap([Ljava/nio/ByteBuffer;[Ljava/nio/ByteBuffer;)Ljavax/net/ssl/SSLEngineResult;
move-result-object p1
:try_end_f
.catchall {:try_start_3 .. :try_end_f} :catchall_17
:try_start_f
invoke-direct {p0}, Lorg/conscrypt/ConscryptEngine;->resetSingleSrcBuffer()V
invoke-direct {p0}, Lorg/conscrypt/ConscryptEngine;->resetSingleDstBuffer()V
monitor-exit v0
return-object p1
:catchall_17
move-exception p1
invoke-direct {p0}, Lorg/conscrypt/ConscryptEngine;->resetSingleSrcBuffer()V
invoke-direct {p0}, Lorg/conscrypt/ConscryptEngine;->resetSingleDstBuffer()V
throw p1
:catchall_1f
move-exception p1
monitor-exit v0
:try_end_21
.catchall {:try_start_f .. :try_end_21} :catchall_1f
throw p1
.end method
.method public unwrap(Ljava/nio/ByteBuffer;[Ljava/nio/ByteBuffer;)Ljavax/net/ssl/SSLEngineResult;
.registers 4
iget-object v0, p0, Lorg/conscrypt/ConscryptEngine;->ssl:Lorg/conscrypt/NativeSsl;
monitor-enter v0
:try_start_3
invoke-direct {p0, p1}, Lorg/conscrypt/ConscryptEngine;->singleSrcBuffer(Ljava/nio/ByteBuffer;)[Ljava/nio/ByteBuffer;
move-result-object p1
invoke-virtual {p0, p1, p2}, Lorg/conscrypt/ConscryptEngine;->unwrap([Ljava/nio/ByteBuffer;[Ljava/nio/ByteBuffer;)Ljavax/net/ssl/SSLEngineResult;
move-result-object p1
:try_end_b
.catchall {:try_start_3 .. :try_end_b} :catchall_10
:try_start_b
invoke-direct {p0}, Lorg/conscrypt/ConscryptEngine;->resetSingleSrcBuffer()V
monitor-exit v0
return-object p1
:catchall_10
move-exception p1
invoke-direct {p0}, Lorg/conscrypt/ConscryptEngine;->resetSingleSrcBuffer()V
throw p1
:catchall_15
move-exception p1
monitor-exit v0
:try_end_17
.catchall {:try_start_b .. :try_end_17} :catchall_15
throw p1
.end method
.method public unwrap(Ljava/nio/ByteBuffer;[Ljava/nio/ByteBuffer;II)Ljavax/net/ssl/SSLEngineResult;
.registers 13
iget-object v0, p0, Lorg/conscrypt/ConscryptEngine;->ssl:Lorg/conscrypt/NativeSsl;
monitor-enter v0
:try_start_3
invoke-direct {p0, p1}, Lorg/conscrypt/ConscryptEngine;->singleSrcBuffer(Ljava/nio/ByteBuffer;)[Ljava/nio/ByteBuffer;
move-result-object v2
const/4 v3, 0x0
const/4 v4, 0x1
move-object v1, p0
move-object v5, p2
move v6, p3
move v7, p4
invoke-virtual/range {v1 .. v7}, Lorg/conscrypt/ConscryptEngine;->unwrap([Ljava/nio/ByteBuffer;II[Ljava/nio/ByteBuffer;II)Ljavax/net/ssl/SSLEngineResult;
move-result-object p1
:try_end_11
.catchall {:try_start_3 .. :try_end_11} :catchall_16
:try_start_11
invoke-direct {p0}, Lorg/conscrypt/ConscryptEngine;->resetSingleSrcBuffer()V
monitor-exit v0
return-object p1
:catchall_16
move-exception p1
invoke-direct {p0}, Lorg/conscrypt/ConscryptEngine;->resetSingleSrcBuffer()V
throw p1
:catchall_1b
move-exception p1
monitor-exit v0
:try_end_1d
.catchall {:try_start_11 .. :try_end_1d} :catchall_1b
throw p1
.end method
.method unwrap([Ljava/nio/ByteBuffer;II[Ljava/nio/ByteBuffer;II)Ljavax/net/ssl/SSLEngineResult;
.registers 24
move-object/from16 v1, p0
move-object/from16 v0, p1
move/from16 v2, p2
move-object/from16 v3, p4
move/from16 v4, p5
const/4 v5, 0x1
const/4 v6, 0x0
if-eqz v0, :cond_10
const/4 v7, 0x1
goto :goto_11
:cond_10
const/4 v7, 0x0
:goto_11
const-string v8, "srcs is null"
invoke-static {v7, v8}, Lorg/conscrypt/Preconditions;->checkArgument(ZLjava/lang/String;)V
if-eqz v3, :cond_1a
const/4 v7, 0x1
goto :goto_1b
:cond_1a
const/4 v7, 0x0
:goto_1b
const-string v8, "dsts is null"
invoke-static {v7, v8}, Lorg/conscrypt/Preconditions;->checkArgument(ZLjava/lang/String;)V
add-int v7, v2, p3
array-length v8, v0
invoke-static {v2, v7, v8}, Lorg/conscrypt/Preconditions;->checkPositionIndexes(III)V
add-int v8, v4, p6
array-length v9, v3
invoke-static {v4, v8, v9}, Lorg/conscrypt/Preconditions;->checkPositionIndexes(III)V
invoke-static/range {p4 .. p6}, Lorg/conscrypt/ConscryptEngine;->calcDstsLength([Ljava/nio/ByteBuffer;II)I
move-result v9
invoke-static {v0, v2, v7}, Lorg/conscrypt/ConscryptEngine;->calcSrcsLength([Ljava/nio/ByteBuffer;II)J
move-result-wide v10
iget-object v12, v1, Lorg/conscrypt/ConscryptEngine;->ssl:Lorg/conscrypt/NativeSsl;
monitor-enter v12
:try_start_37
iget v13, v1, Lorg/conscrypt/ConscryptEngine;->state:I
if-eqz v13, :cond_17c
const/16 v14, 0x8
if-eq v13, v5, :cond_55
const/4 v15, 0x6
if-eq v13, v15, :cond_45
if-eq v13, v14, :cond_45
goto :goto_58
:cond_45
invoke-direct/range {p0 .. p0}, Lorg/conscrypt/ConscryptEngine;->freeIfDone()V
new-instance v0, Ljavax/net/ssl/SSLEngineResult;
sget-object v2, Ljavax/net/ssl/SSLEngineResult$Status;->CLOSED:Ljavax/net/ssl/SSLEngineResult$Status;
invoke-direct/range {p0 .. p0}, Lorg/conscrypt/ConscryptEngine;->getHandshakeStatusInternal()Ljavax/net/ssl/SSLEngineResult$HandshakeStatus;
move-result-object v3
invoke-direct {v0, v2, v3, v6, v6}, Ljavax/net/ssl/SSLEngineResult;-><init>(Ljavax/net/ssl/SSLEngineResult$Status;Ljavax/net/ssl/SSLEngineResult$HandshakeStatus;II)V
monitor-exit v12
return-object v0
:cond_55
invoke-direct/range {p0 .. p0}, Lorg/conscrypt/ConscryptEngine;->beginHandshakeInternal()V
:goto_58
sget-object v13, Ljavax/net/ssl/SSLEngineResult$HandshakeStatus;->NOT_HANDSHAKING:Ljavax/net/ssl/SSLEngineResult$HandshakeStatus;
iget-boolean v15, v1, Lorg/conscrypt/ConscryptEngine;->handshakeFinished:Z
if-nez v15, :cond_72
invoke-direct/range {p0 .. p0}, Lorg/conscrypt/ConscryptEngine;->handshake()Ljavax/net/ssl/SSLEngineResult$HandshakeStatus;
move-result-object v13
sget-object v15, Ljavax/net/ssl/SSLEngineResult$HandshakeStatus;->NEED_WRAP:Ljavax/net/ssl/SSLEngineResult$HandshakeStatus;
if-ne v13, v15, :cond_6a
sget-object v0, Lorg/conscrypt/ConscryptEngine;->NEED_WRAP_OK:Ljavax/net/ssl/SSLEngineResult;
monitor-exit v12
return-object v0
:cond_6a
iget v15, v1, Lorg/conscrypt/ConscryptEngine;->state:I
if-ne v15, v14, :cond_72
sget-object v0, Lorg/conscrypt/ConscryptEngine;->NEED_WRAP_CLOSED:Ljavax/net/ssl/SSLEngineResult;
monitor-exit v12
return-object v0
:cond_72
invoke-direct/range {p0 .. p0}, Lorg/conscrypt/ConscryptEngine;->pendingInboundCleartextBytes()I
move-result v14
if-gtz v14, :cond_79
goto :goto_7a
:cond_79
const/4 v5, 0x0
:goto_7a
const-wide/16 v14, 0x0
cmp-long v16, v10, v14
if-lez v16, :cond_b5
if-eqz v5, :cond_b5
const-wide/16 v14, 0x5
cmp-long v5, v10, v14
if-gez v5, :cond_95
new-instance v0, Ljavax/net/ssl/SSLEngineResult;
sget-object v2, Ljavax/net/ssl/SSLEngineResult$Status;->BUFFER_UNDERFLOW:Ljavax/net/ssl/SSLEngineResult$Status;
invoke-virtual/range {p0 .. p0}, Lorg/conscrypt/ConscryptEngine;->getHandshakeStatus()Ljavax/net/ssl/SSLEngineResult$HandshakeStatus;
move-result-object v3
invoke-direct {v0, v2, v3, v6, v6}, Ljavax/net/ssl/SSLEngineResult;-><init>(Ljavax/net/ssl/SSLEngineResult$Status;Ljavax/net/ssl/SSLEngineResult$HandshakeStatus;II)V
monitor-exit v12
return-object v0
:cond_95
invoke-static/range {p1 .. p2}, Lorg/conscrypt/SSLUtils;->getEncryptedPacketLength([Ljava/nio/ByteBuffer;I)I
move-result v5
if-ltz v5, :cond_ad
int-to-long v14, v5
cmp-long v16, v10, v14
if-gez v16, :cond_c5
new-instance v0, Ljavax/net/ssl/SSLEngineResult;
sget-object v2, Ljavax/net/ssl/SSLEngineResult$Status;->BUFFER_UNDERFLOW:Ljavax/net/ssl/SSLEngineResult$Status;
invoke-virtual/range {p0 .. p0}, Lorg/conscrypt/ConscryptEngine;->getHandshakeStatus()Ljavax/net/ssl/SSLEngineResult$HandshakeStatus;
move-result-object v3
invoke-direct {v0, v2, v3, v6, v6}, Ljavax/net/ssl/SSLEngineResult;-><init>(Ljavax/net/ssl/SSLEngineResult$Status;Ljavax/net/ssl/SSLEngineResult$HandshakeStatus;II)V
monitor-exit v12
return-object v0
:cond_ad
new-instance v0, Ljavax/net/ssl/SSLException;
const-string v2, "Unable to parse TLS packet header"
invoke-direct {v0, v2}, Ljavax/net/ssl/SSLException;-><init>(Ljava/lang/String;)V
throw v0
:cond_b5
if-eqz v5, :cond_c4
new-instance v0, Ljavax/net/ssl/SSLEngineResult;
sget-object v2, Ljavax/net/ssl/SSLEngineResult$Status;->BUFFER_UNDERFLOW:Ljavax/net/ssl/SSLEngineResult$Status;
invoke-virtual/range {p0 .. p0}, Lorg/conscrypt/ConscryptEngine;->getHandshakeStatus()Ljavax/net/ssl/SSLEngineResult$HandshakeStatus;
move-result-object v3
invoke-direct {v0, v2, v3, v6, v6}, Ljavax/net/ssl/SSLEngineResult;-><init>(Ljavax/net/ssl/SSLEngineResult$Status;Ljavax/net/ssl/SSLEngineResult$HandshakeStatus;II)V
monitor-exit v12
return-object v0
:cond_c4
const/4 v5, 0x0
:cond_c5
if-lez v5, :cond_ee
if-ge v2, v7, :cond_ee
const/4 v10, 0x0
:cond_ca
aget-object v11, v0, v2
invoke-virtual {v11}, Ljava/nio/ByteBuffer;->remaining()I
move-result v14
if-nez v14, :cond_d5
:goto_d2
add-int/lit8 v2, v2, 0x1
goto :goto_e7
:cond_d5
invoke-static {v5, v14}, Ljava/lang/Math;->min(II)I
move-result v15
invoke-direct {v1, v11, v15}, Lorg/conscrypt/ConscryptEngine;->writeEncryptedData(Ljava/nio/ByteBuffer;I)I
move-result v11
if-lez v11, :cond_ea
add-int/2addr v10, v11
sub-int/2addr v5, v11
if-nez v5, :cond_e4
goto :goto_ef
:cond_e4
if-ne v11, v14, :cond_ef
goto :goto_d2
:goto_e7
if-lt v2, v7, :cond_ca
goto :goto_ef
:cond_ea
invoke-static {}, Lorg/conscrypt/NativeCrypto;->SSL_clear_error()V
:try_end_ed
.catchall {:try_start_37 .. :try_end_ed} :catchall_184
goto :goto_ef
:cond_ee
const/4 v10, 0x0
:cond_ef
:goto_ef
if-lez v9, :cond_141
const/4 v0, 0x0
:goto_f2
if-ge v4, v8, :cond_147
:try_start_f4
aget-object v2, v3, v4
invoke-virtual {v2}, Ljava/nio/ByteBuffer;->hasRemaining()Z
move-result v5
if-nez v5, :cond_fd
goto :goto_10b
:cond_fd
invoke-direct {v1, v2}, Lorg/conscrypt/ConscryptEngine;->readPlaintextData(Ljava/nio/ByteBuffer;)I
move-result v5
if-lez v5, :cond_10e
add-int/2addr v0, v5
invoke-virtual {v2}, Ljava/nio/ByteBuffer;->hasRemaining()Z
move-result v2
if-eqz v2, :cond_10b
goto :goto_147
:cond_10b
:goto_10b
add-int/lit8 v4, v4, 0x1
goto :goto_f2
:cond_10e
const/4 v2, -0x6
if-eq v5, v2, :cond_128
const/4 v2, -0x3
if-eq v5, v2, :cond_122
const/4 v2, -0x2
if-ne v5, v2, :cond_118
goto :goto_122
:cond_118
invoke-direct/range {p0 .. p0}, Lorg/conscrypt/ConscryptEngine;->closeAll()V
const-string v2, "SSL_read"
invoke-direct {v1, v2}, Lorg/conscrypt/ConscryptEngine;->newSslExceptionWithMessage(Ljava/lang/String;)Ljavax/net/ssl/SSLException;
move-result-object v2
throw v2
:cond_122
:goto_122
invoke-direct {v1, v10, v0, v13}, Lorg/conscrypt/ConscryptEngine;->newResult(IILjavax/net/ssl/SSLEngineResult$HandshakeStatus;)Ljavax/net/ssl/SSLEngineResult;
move-result-object v0
:try_end_126
.catch Ljava/io/InterruptedIOException; {:try_start_f4 .. :try_end_126} :catch_13f
.catch Ljava/io/IOException; {:try_start_f4 .. :try_end_126} :catch_16d
.catchall {:try_start_f4 .. :try_end_126} :catchall_184
:try_start_126
monitor-exit v12
:try_end_127
.catchall {:try_start_126 .. :try_end_127} :catchall_184
return-object v0
:cond_128
:try_start_128
invoke-direct/range {p0 .. p0}, Lorg/conscrypt/ConscryptEngine;->closeAll()V
new-instance v2, Ljavax/net/ssl/SSLEngineResult;
sget-object v3, Ljavax/net/ssl/SSLEngineResult$Status;->CLOSED:Ljavax/net/ssl/SSLEngineResult$Status;
invoke-virtual/range {p0 .. p0}, Lorg/conscrypt/ConscryptEngine;->pendingOutboundEncryptedBytes()I
move-result v4
if-lez v4, :cond_138
sget-object v4, Ljavax/net/ssl/SSLEngineResult$HandshakeStatus;->NEED_WRAP:Ljavax/net/ssl/SSLEngineResult$HandshakeStatus;
goto :goto_13a
:cond_138
sget-object v4, Ljavax/net/ssl/SSLEngineResult$HandshakeStatus;->NOT_HANDSHAKING:Ljavax/net/ssl/SSLEngineResult$HandshakeStatus;
:goto_13a
invoke-direct {v2, v3, v4, v10, v0}, Ljavax/net/ssl/SSLEngineResult;-><init>(Ljavax/net/ssl/SSLEngineResult$Status;Ljavax/net/ssl/SSLEngineResult$HandshakeStatus;II)V
:try_end_13d
.catch Ljava/io/InterruptedIOException; {:try_start_128 .. :try_end_13d} :catch_13f
.catch Ljava/io/IOException; {:try_start_128 .. :try_end_13d} :catch_16d
.catchall {:try_start_128 .. :try_end_13d} :catchall_184
:try_start_13d
monitor-exit v12
:try_end_13e
.catchall {:try_start_13d .. :try_end_13e} :catchall_184
return-object v2
:catch_13f
move v6, v0
goto :goto_176
:cond_141
:try_start_141
iget-object v0, v1, Lorg/conscrypt/ConscryptEngine;->ssl:Lorg/conscrypt/NativeSsl;
invoke-virtual {v0}, Lorg/conscrypt/NativeSsl;->forceRead()V
:try_end_146
.catch Ljava/io/InterruptedIOException; {:try_start_141 .. :try_end_146} :catch_176
.catch Ljava/io/IOException; {:try_start_141 .. :try_end_146} :catch_16d
.catchall {:try_start_141 .. :try_end_146} :catchall_184
const/4 v0, 0x0
:cond_147
:goto_147
:try_start_147
iget-boolean v2, v1, Lorg/conscrypt/ConscryptEngine;->handshakeFinished:Z
if-eqz v2, :cond_14f
invoke-direct/range {p0 .. p0}, Lorg/conscrypt/ConscryptEngine;->pendingInboundCleartextBytes()I
move-result v6
:cond_14f
if-lez v6, :cond_167
new-instance v2, Ljavax/net/ssl/SSLEngineResult;
sget-object v3, Ljavax/net/ssl/SSLEngineResult$Status;->BUFFER_OVERFLOW:Ljavax/net/ssl/SSLEngineResult$Status;
sget-object v4, Ljavax/net/ssl/SSLEngineResult$HandshakeStatus;->FINISHED:Ljavax/net/ssl/SSLEngineResult$HandshakeStatus;
if-ne v13, v4, :cond_15a
goto :goto_15e
:cond_15a
invoke-direct/range {p0 .. p0}, Lorg/conscrypt/ConscryptEngine;->getHandshakeStatusInternal()Ljavax/net/ssl/SSLEngineResult$HandshakeStatus;
move-result-object v13
:goto_15e
invoke-direct {v1, v13}, Lorg/conscrypt/ConscryptEngine;->mayFinishHandshake(Ljavax/net/ssl/SSLEngineResult$HandshakeStatus;)Ljavax/net/ssl/SSLEngineResult$HandshakeStatus;
move-result-object v4
invoke-direct {v2, v3, v4, v10, v0}, Ljavax/net/ssl/SSLEngineResult;-><init>(Ljavax/net/ssl/SSLEngineResult$Status;Ljavax/net/ssl/SSLEngineResult$HandshakeStatus;II)V
monitor-exit v12
return-object v2
:cond_167
invoke-direct {v1, v10, v0, v13}, Lorg/conscrypt/ConscryptEngine;->newResult(IILjavax/net/ssl/SSLEngineResult$HandshakeStatus;)Ljavax/net/ssl/SSLEngineResult;
move-result-object v0
monitor-exit v12
return-object v0
:catch_16d
move-exception v0
invoke-direct/range {p0 .. p0}, Lorg/conscrypt/ConscryptEngine;->closeAll()V
invoke-direct {v1, v0}, Lorg/conscrypt/ConscryptEngine;->convertException(Ljava/lang/Throwable;)Ljavax/net/ssl/SSLException;
move-result-object v0
throw v0
:catch_176
:goto_176
invoke-direct {v1, v10, v6, v13}, Lorg/conscrypt/ConscryptEngine;->newResult(IILjavax/net/ssl/SSLEngineResult$HandshakeStatus;)Ljavax/net/ssl/SSLEngineResult;
move-result-object v0
monitor-exit v12
return-object v0
:cond_17c
new-instance v0, Ljava/lang/IllegalStateException;
const-string v2, "Client/server mode must be set before calling unwrap"
invoke-direct {v0, v2}, Ljava/lang/IllegalStateException;-><init>(Ljava/lang/String;)V
throw v0
:catchall_184
move-exception v0
monitor-exit v12
:try_end_186
.catchall {:try_start_147 .. :try_end_186} :catchall_184
goto :goto_188
:goto_187
throw v0
:goto_188
goto :goto_187
.end method
.method unwrap([Ljava/nio/ByteBuffer;[Ljava/nio/ByteBuffer;)Ljavax/net/ssl/SSLEngineResult;
.registers 12
const/4 v0, 0x1
const/4 v1, 0x0
if-eqz p1, :cond_6
const/4 v2, 0x1
goto :goto_7
:cond_6
const/4 v2, 0x0
:goto_7
const-string v3, "srcs is null"
invoke-static {v2, v3}, Lorg/conscrypt/Preconditions;->checkArgument(ZLjava/lang/String;)V
if-eqz p2, :cond_f
goto :goto_10
:cond_f
const/4 v0, 0x0
:goto_10
const-string v1, "dsts is null"
invoke-static {v0, v1}, Lorg/conscrypt/Preconditions;->checkArgument(ZLjava/lang/String;)V
const/4 v4, 0x0
array-length v5, p1
const/4 v7, 0x0
array-length v8, p2
move-object v2, p0
move-object v3, p1
move-object v6, p2
invoke-virtual/range {v2 .. v8}, Lorg/conscrypt/ConscryptEngine;->unwrap([Ljava/nio/ByteBuffer;II[Ljava/nio/ByteBuffer;II)Ljavax/net/ssl/SSLEngineResult;
move-result-object p1
return-object p1
.end method
.method public verifyCertificateChain([[BLjava/lang/String;)V
.registers 7
if-eqz p1, :cond_3f
:try_start_2
array-length v0, p1
if-eqz v0, :cond_3f
invoke-static {p1}, Lorg/conscrypt/SSLUtils;->decodeX509CertificateChain([[B)[Ljava/security/cert/X509Certificate;
move-result-object p1
iget-object v0, p0, Lorg/conscrypt/ConscryptEngine;->sslParameters:Lorg/conscrypt/SSLParametersImpl;
invoke-virtual {v0}, Lorg/conscrypt/SSLParametersImpl;->getX509TrustManager()Ljavax/net/ssl/X509TrustManager;
move-result-object v0
if-eqz v0, :cond_37
iget-object v1, p0, Lorg/conscrypt/ConscryptEngine;->activeSession:Lorg/conscrypt/ActiveSession;
invoke-virtual {p0}, Lorg/conscrypt/ConscryptEngine;->getPeerHost()Ljava/lang/String;
move-result-object v2
invoke-virtual {p0}, Lorg/conscrypt/ConscryptEngine;->getPeerPort()I
move-result v3
invoke-virtual {v1, v2, v3, p1}, Lorg/conscrypt/ActiveSession;->onPeerCertificatesReceived(Ljava/lang/String;I[Ljava/security/cert/X509Certificate;)V
invoke-virtual {p0}, Lorg/conscrypt/ConscryptEngine;->getUseClientMode()Z
move-result v1
if-eqz v1, :cond_28
invoke-static {v0, p1, p2, p0}, Lorg/conscrypt/Platform;->checkServerTrusted(Ljavax/net/ssl/X509TrustManager;[Ljava/security/cert/X509Certificate;Ljava/lang/String;Lorg/conscrypt/ConscryptEngine;)V
goto :goto_36
:cond_28
const/4 p2, 0x0
aget-object p2, p1, p2
invoke-virtual {p2}, Ljava/security/cert/X509Certificate;->getPublicKey()Ljava/security/PublicKey;
move-result-object p2
invoke-interface {p2}, Ljava/security/PublicKey;->getAlgorithm()Ljava/lang/String;
move-result-object p2
invoke-static {v0, p1, p2, p0}, Lorg/conscrypt/Platform;->checkClientTrusted(Ljavax/net/ssl/X509TrustManager;[Ljava/security/cert/X509Certificate;Ljava/lang/String;Lorg/conscrypt/ConscryptEngine;)V
:goto_36
return-void
:cond_37
new-instance p1, Ljava/security/cert/CertificateException;
const-string p2, "No X.509 TrustManager"
invoke-direct {p1, p2}, Ljava/security/cert/CertificateException;-><init>(Ljava/lang/String;)V
throw p1
:cond_3f
new-instance p1, Ljava/security/cert/CertificateException;
const-string p2, "Peer sent no certificate"
invoke-direct {p1, p2}, Ljava/security/cert/CertificateException;-><init>(Ljava/lang/String;)V
throw p1
:try_end_47
.catch Ljava/security/cert/CertificateException; {:try_start_2 .. :try_end_47} :catch_4e
.catch Ljava/lang/Exception; {:try_start_2 .. :try_end_47} :catch_47
:catch_47
move-exception p1
new-instance p2, Ljava/security/cert/CertificateException;
invoke-direct {p2, p1}, Ljava/security/cert/CertificateException;-><init>(Ljava/lang/Throwable;)V
throw p2
:catch_4e
move-exception p1
throw p1
.end method
.method public wrap(Ljava/nio/ByteBuffer;Ljava/nio/ByteBuffer;)Ljavax/net/ssl/SSLEngineResult;
.registers 4
iget-object v0, p0, Lorg/conscrypt/ConscryptEngine;->ssl:Lorg/conscrypt/NativeSsl;
monitor-enter v0
:try_start_3
invoke-direct {p0, p1}, Lorg/conscrypt/ConscryptEngine;->singleSrcBuffer(Ljava/nio/ByteBuffer;)[Ljava/nio/ByteBuffer;
move-result-object p1
invoke-virtual {p0, p1, p2}, Ljavax/net/ssl/SSLEngine;->wrap([Ljava/nio/ByteBuffer;Ljava/nio/ByteBuffer;)Ljavax/net/ssl/SSLEngineResult;
move-result-object p1
:try_end_b
.catchall {:try_start_3 .. :try_end_b} :catchall_10
:try_start_b
invoke-direct {p0}, Lorg/conscrypt/ConscryptEngine;->resetSingleSrcBuffer()V
monitor-exit v0
return-object p1
:catchall_10
move-exception p1
invoke-direct {p0}, Lorg/conscrypt/ConscryptEngine;->resetSingleSrcBuffer()V
throw p1
:catchall_15
move-exception p1
monitor-exit v0
:try_end_17
.catchall {:try_start_b .. :try_end_17} :catchall_15
throw p1
.end method
.method public wrap([Ljava/nio/ByteBuffer;IILjava/nio/ByteBuffer;)Ljavax/net/ssl/SSLEngineResult;
.registers 11
const/4 v0, 0x1
const/4 v1, 0x0
if-eqz p1, :cond_6
const/4 v2, 0x1
goto :goto_7
:cond_6
const/4 v2, 0x0
:goto_7
const-string v3, "srcs is null"
invoke-static {v2, v3}, Lorg/conscrypt/Preconditions;->checkArgument(ZLjava/lang/String;)V
if-eqz p4, :cond_10
const/4 v2, 0x1
goto :goto_11
:cond_10
const/4 v2, 0x0
:goto_11
const-string v3, "dst is null"
invoke-static {v2, v3}, Lorg/conscrypt/Preconditions;->checkArgument(ZLjava/lang/String;)V
add-int v2, p2, p3
array-length v3, p1
invoke-static {p2, v2, v3}, Lorg/conscrypt/Preconditions;->checkPositionIndexes(III)V
invoke-virtual {p4}, Ljava/nio/ByteBuffer;->isReadOnly()Z
move-result v3
if-nez v3, :cond_14a
if-nez p2, :cond_27
array-length v3, p1
if-eq p3, v3, :cond_2d
:cond_27
invoke-static {p1, p2, v2}, Ljava/util/Arrays;->copyOfRange([Ljava/lang/Object;II)[Ljava/lang/Object;
move-result-object p1
check-cast p1, [Ljava/nio/ByteBuffer;
:cond_2d
invoke-static {p1}, Lorg/conscrypt/BufferUtils;->checkNotNull([Ljava/nio/ByteBuffer;)V
iget-object p2, p0, Lorg/conscrypt/ConscryptEngine;->ssl:Lorg/conscrypt/NativeSsl;
monitor-enter p2
:try_start_33
iget p3, p0, Lorg/conscrypt/ConscryptEngine;->state:I
if-eqz p3, :cond_13f
const/16 v2, 0x8
if-eq p3, v0, :cond_5b
const/4 v3, 0x7
if-eq p3, v3, :cond_41
if-eq p3, v2, :cond_41
goto :goto_5e
:cond_41
sget-object p1, Ljavax/net/ssl/SSLEngineResult$HandshakeStatus;->NOT_HANDSHAKING:Ljavax/net/ssl/SSLEngineResult$HandshakeStatus;
invoke-direct {p0, p4, v1, v1, p1}, Lorg/conscrypt/ConscryptEngine;->readPendingBytesFromBIO(Ljava/nio/ByteBuffer;IILjavax/net/ssl/SSLEngineResult$HandshakeStatus;)Ljavax/net/ssl/SSLEngineResult;
move-result-object p1
if-eqz p1, :cond_4e
invoke-direct {p0}, Lorg/conscrypt/ConscryptEngine;->freeIfDone()V
monitor-exit p2
return-object p1
:cond_4e
new-instance p1, Ljavax/net/ssl/SSLEngineResult;
sget-object p3, Ljavax/net/ssl/SSLEngineResult$Status;->CLOSED:Ljavax/net/ssl/SSLEngineResult$Status;
invoke-direct {p0}, Lorg/conscrypt/ConscryptEngine;->getHandshakeStatusInternal()Ljavax/net/ssl/SSLEngineResult$HandshakeStatus;
move-result-object p4
invoke-direct {p1, p3, p4, v1, v1}, Ljavax/net/ssl/SSLEngineResult;-><init>(Ljavax/net/ssl/SSLEngineResult$Status;Ljavax/net/ssl/SSLEngineResult$HandshakeStatus;II)V
monitor-exit p2
return-object p1
:cond_5b
invoke-direct {p0}, Lorg/conscrypt/ConscryptEngine;->beginHandshakeInternal()V
:goto_5e
sget-object p3, Ljavax/net/ssl/SSLEngineResult$HandshakeStatus;->NOT_HANDSHAKING:Ljavax/net/ssl/SSLEngineResult$HandshakeStatus;
iget-boolean v3, p0, Lorg/conscrypt/ConscryptEngine;->handshakeFinished:Z
if-nez v3, :cond_78
invoke-direct {p0}, Lorg/conscrypt/ConscryptEngine;->handshake()Ljavax/net/ssl/SSLEngineResult$HandshakeStatus;
move-result-object p3
sget-object v3, Ljavax/net/ssl/SSLEngineResult$HandshakeStatus;->NEED_UNWRAP:Ljavax/net/ssl/SSLEngineResult$HandshakeStatus;
if-ne p3, v3, :cond_70
sget-object p1, Lorg/conscrypt/ConscryptEngine;->NEED_UNWRAP_OK:Ljavax/net/ssl/SSLEngineResult;
monitor-exit p2
return-object p1
:cond_70
iget v3, p0, Lorg/conscrypt/ConscryptEngine;->state:I
if-ne v3, v2, :cond_78
sget-object p1, Lorg/conscrypt/ConscryptEngine;->NEED_UNWRAP_CLOSED:Ljavax/net/ssl/SSLEngineResult;
monitor-exit p2
return-object p1
:cond_78
invoke-static {p1}, Lorg/conscrypt/BufferUtils;->remaining([Ljava/nio/ByteBuffer;)J
move-result-wide v2
const-wide/16 v4, 0x4000
invoke-static {v2, v3, v4, v5}, Ljava/lang/Math;->min(JJ)J
move-result-wide v2
long-to-int v3, v2
invoke-virtual {p4}, Ljava/nio/ByteBuffer;->remaining()I
move-result v2
invoke-static {v3}, Lorg/conscrypt/SSLUtils;->calculateOutNetBufSize(I)I
move-result v4
if-ge v2, v4, :cond_9a
new-instance p1, Ljavax/net/ssl/SSLEngineResult;
sget-object p3, Ljavax/net/ssl/SSLEngineResult$Status;->BUFFER_OVERFLOW:Ljavax/net/ssl/SSLEngineResult$Status;
invoke-direct {p0}, Lorg/conscrypt/ConscryptEngine;->getHandshakeStatusInternal()Ljavax/net/ssl/SSLEngineResult$HandshakeStatus;
move-result-object p4
invoke-direct {p1, p3, p4, v1, v1}, Ljavax/net/ssl/SSLEngineResult;-><init>(Ljavax/net/ssl/SSLEngineResult$Status;Ljavax/net/ssl/SSLEngineResult$HandshakeStatus;II)V
monitor-exit p2
return-object p1
:cond_9a
if-lez v3, :cond_12d
const/16 v2, 0x4000
invoke-static {p1, v2}, Lorg/conscrypt/BufferUtils;->getBufferLargerThan([Ljava/nio/ByteBuffer;I)Ljava/nio/ByteBuffer;
move-result-object v3
if-nez v3, :cond_ad
invoke-direct {p0}, Lorg/conscrypt/ConscryptEngine;->getOrCreateLazyDirectBuffer()Ljava/nio/ByteBuffer;
move-result-object v3
invoke-static {p1, v3, v2}, Lorg/conscrypt/BufferUtils;->copyNoConsume([Ljava/nio/ByteBuffer;Ljava/nio/ByteBuffer;I)Ljava/nio/ByteBuffer;
move-result-object v3
goto :goto_ae
:cond_ad
const/4 v0, 0x0
:goto_ae
invoke-virtual {v3}, Ljava/nio/ByteBuffer;->remaining()I
move-result v4
invoke-static {v2, v4}, Ljava/lang/Math;->min(II)I
move-result v2
invoke-direct {p0, v3, v2}, Lorg/conscrypt/ConscryptEngine;->writePlaintextData(Ljava/nio/ByteBuffer;I)I
move-result v2
if-lez v2, :cond_d8
if-eqz v0, :cond_c1
invoke-static {p1, v2}, Lorg/conscrypt/BufferUtils;->consume([Ljava/nio/ByteBuffer;I)V
:cond_c1
invoke-direct {p0, p4, v2, v1, p3}, Lorg/conscrypt/ConscryptEngine;->readPendingBytesFromBIO(Ljava/nio/ByteBuffer;IILjavax/net/ssl/SSLEngineResult$HandshakeStatus;)Ljavax/net/ssl/SSLEngineResult;
move-result-object p1
if-eqz p1, :cond_d6
invoke-virtual {p1}, Ljavax/net/ssl/SSLEngineResult;->getStatus()Ljavax/net/ssl/SSLEngineResult$Status;
move-result-object v0
sget-object v3, Ljavax/net/ssl/SSLEngineResult$Status;->OK:Ljavax/net/ssl/SSLEngineResult$Status;
if-eq v0, v3, :cond_d1
monitor-exit p2
return-object p1
:cond_d1
invoke-virtual {p1}, Ljavax/net/ssl/SSLEngineResult;->bytesProduced()I
move-result p1
goto :goto_12f
:cond_d6
const/4 p1, 0x0
goto :goto_12f
:cond_d8
iget-object p1, p0, Lorg/conscrypt/ConscryptEngine;->ssl:Lorg/conscrypt/NativeSsl;
invoke-virtual {p1, v2}, Lorg/conscrypt/NativeSsl;->getError(I)I
move-result p1
const/4 v0, 0x2
if-eq p1, v0, :cond_119
const/4 v0, 0x3
if-eq p1, v0, :cond_10e
const/4 v0, 0x6
if-ne p1, v0, :cond_f5
invoke-direct {p0}, Lorg/conscrypt/ConscryptEngine;->closeAll()V
invoke-direct {p0, p4, v1, v1, p3}, Lorg/conscrypt/ConscryptEngine;->readPendingBytesFromBIO(Ljava/nio/ByteBuffer;IILjavax/net/ssl/SSLEngineResult$HandshakeStatus;)Ljavax/net/ssl/SSLEngineResult;
move-result-object p1
if-eqz p1, :cond_f1
goto :goto_f3
:cond_f1
sget-object p1, Lorg/conscrypt/ConscryptEngine;->CLOSED_NOT_HANDSHAKING:Ljavax/net/ssl/SSLEngineResult;
:goto_f3
monitor-exit p2
return-object p1
:cond_f5
invoke-direct {p0}, Lorg/conscrypt/ConscryptEngine;->closeAll()V
new-instance p3, Ljava/lang/StringBuilder;
invoke-direct {p3}, Ljava/lang/StringBuilder;-><init>()V
const-string p4, "SSL_write: error "
invoke-virtual {p3, p4}, Ljava/lang/StringBuilder;->append(Ljava/lang/String;)Ljava/lang/StringBuilder;
invoke-virtual {p3, p1}, Ljava/lang/StringBuilder;->append(I)Ljava/lang/StringBuilder;
invoke-virtual {p3}, Ljava/lang/StringBuilder;->toString()Ljava/lang/String;
move-result-object p1
invoke-direct {p0, p1}, Lorg/conscrypt/ConscryptEngine;->newSslExceptionWithMessage(Ljava/lang/String;)Ljavax/net/ssl/SSLException;
move-result-object p1
throw p1
:cond_10e
invoke-direct {p0, p4, v1, v1, p3}, Lorg/conscrypt/ConscryptEngine;->readPendingBytesFromBIO(Ljava/nio/ByteBuffer;IILjavax/net/ssl/SSLEngineResult$HandshakeStatus;)Ljavax/net/ssl/SSLEngineResult;
move-result-object p1
if-eqz p1, :cond_115
goto :goto_117
:cond_115
sget-object p1, Lorg/conscrypt/ConscryptEngine;->NEED_WRAP_CLOSED:Ljavax/net/ssl/SSLEngineResult;
:goto_117
monitor-exit p2
return-object p1
:cond_119
invoke-direct {p0, p4, v1, v1, p3}, Lorg/conscrypt/ConscryptEngine;->readPendingBytesFromBIO(Ljava/nio/ByteBuffer;IILjavax/net/ssl/SSLEngineResult$HandshakeStatus;)Ljavax/net/ssl/SSLEngineResult;
move-result-object p1
if-eqz p1, :cond_120
goto :goto_12b
:cond_120
new-instance p1, Ljavax/net/ssl/SSLEngineResult;
invoke-direct {p0}, Lorg/conscrypt/ConscryptEngine;->getEngineStatus()Ljavax/net/ssl/SSLEngineResult$Status;
move-result-object p3
sget-object p4, Ljavax/net/ssl/SSLEngineResult$HandshakeStatus;->NEED_UNWRAP:Ljavax/net/ssl/SSLEngineResult$HandshakeStatus;
invoke-direct {p1, p3, p4, v1, v1}, Ljavax/net/ssl/SSLEngineResult;-><init>(Ljavax/net/ssl/SSLEngineResult$Status;Ljavax/net/ssl/SSLEngineResult$HandshakeStatus;II)V
:goto_12b
monitor-exit p2
return-object p1
:cond_12d
const/4 p1, 0x0
const/4 v2, 0x0
:goto_12f
if-nez v2, :cond_139
invoke-direct {p0, p4, v1, p1, p3}, Lorg/conscrypt/ConscryptEngine;->readPendingBytesFromBIO(Ljava/nio/ByteBuffer;IILjavax/net/ssl/SSLEngineResult$HandshakeStatus;)Ljavax/net/ssl/SSLEngineResult;
move-result-object p4
if-eqz p4, :cond_139
monitor-exit p2
return-object p4
:cond_139
invoke-direct {p0, v2, p1, p3}, Lorg/conscrypt/ConscryptEngine;->newResult(IILjavax/net/ssl/SSLEngineResult$HandshakeStatus;)Ljavax/net/ssl/SSLEngineResult;
move-result-object p1
monitor-exit p2
return-object p1
:cond_13f
new-instance p1, Ljava/lang/IllegalStateException;
const-string p3, "Client/server mode must be set before calling wrap"
invoke-direct {p1, p3}, Ljava/lang/IllegalStateException;-><init>(Ljava/lang/String;)V
throw p1
:catchall_147
move-exception p1
monitor-exit p2
:try_end_149
.catchall {:try_start_33 .. :try_end_149} :catchall_147
throw p1
:cond_14a
new-instance p1, Ljava/nio/ReadOnlyBufferException;
invoke-direct {p1}, Ljava/nio/ReadOnlyBufferException;-><init>()V
throw p1
.end method