NativeSecp256k1.smali
.class public Lorg/bitcoin/NativeSecp256k1;
.super Ljava/lang/Object;
.source "NativeSecp256k1.java"
# static fields
.field private static nativeECDSABuffer:Ljava/lang/ThreadLocal;
.annotation system Ldalvik/annotation/Signature;
value = {
"Ljava/lang/ThreadLocal",
"<",
"Ljava/nio/ByteBuffer;",
">;"
}
.end annotation
.end field
.field private static final r:Ljava/util/concurrent/locks/Lock;
.field private static final rwl:Ljava/util/concurrent/locks/ReentrantReadWriteLock;
.field private static final w:Ljava/util/concurrent/locks/Lock;
# direct methods
.method static constructor <clinit>()V
.registers 1
.prologue
.line 42
new-instance v0, Ljava/util/concurrent/locks/ReentrantReadWriteLock;
invoke-direct {v0}, Ljava/util/concurrent/locks/ReentrantReadWriteLock;-><init>()V
.line 43
sput-object v0, Lorg/bitcoin/NativeSecp256k1;->rwl:Ljava/util/concurrent/locks/ReentrantReadWriteLock;
invoke-virtual {v0}, Ljava/util/concurrent/locks/ReentrantReadWriteLock;->readLock()Ljava/util/concurrent/locks/ReentrantReadWriteLock$ReadLock;
move-result-object v0
sput-object v0, Lorg/bitcoin/NativeSecp256k1;->r:Ljava/util/concurrent/locks/Lock;
.line 44
sget-object v0, Lorg/bitcoin/NativeSecp256k1;->rwl:Ljava/util/concurrent/locks/ReentrantReadWriteLock;
invoke-virtual {v0}, Ljava/util/concurrent/locks/ReentrantReadWriteLock;->writeLock()Ljava/util/concurrent/locks/ReentrantReadWriteLock$WriteLock;
move-result-object v0
sput-object v0, Lorg/bitcoin/NativeSecp256k1;->w:Ljava/util/concurrent/locks/Lock;
.line 45
new-instance v0, Ljava/lang/ThreadLocal;
invoke-direct {v0}, Ljava/lang/ThreadLocal;-><init>()V
sput-object v0, Lorg/bitcoin/NativeSecp256k1;->nativeECDSABuffer:Ljava/lang/ThreadLocal;
return-void
.end method
.method public constructor <init>()V
.registers 1
.prologue
.line 40
invoke-direct {p0}, Ljava/lang/Object;-><init>()V
return-void
.end method
.method public static declared-synchronized cleanup()V
.registers 4
.prologue
.line 182
const-class v1, Lorg/bitcoin/NativeSecp256k1;
monitor-enter v1
:try_start_3
sget-object v0, Lorg/bitcoin/NativeSecp256k1;->w:Ljava/util/concurrent/locks/Lock;
invoke-interface {v0}, Ljava/util/concurrent/locks/Lock;->lock()V
:try_end_8
.catchall {:try_start_3 .. :try_end_8} :catchall_1d
.line 184
:try_start_8
invoke-static {}, Lorg/bitcoin/Secp256k1Context;->getContext()J
move-result-wide v2
invoke-static {v2, v3}, Lorg/bitcoin/NativeSecp256k1;->secp256k1_destroy_context(J)V
:try_end_f
.catchall {:try_start_8 .. :try_end_f} :catchall_16
.line 186
:try_start_f
sget-object v0, Lorg/bitcoin/NativeSecp256k1;->w:Ljava/util/concurrent/locks/Lock;
invoke-interface {v0}, Ljava/util/concurrent/locks/Lock;->unlock()V
:try_end_14
.catchall {:try_start_f .. :try_end_14} :catchall_1d
.line 187
monitor-exit v1
return-void
.line 186
:catchall_16
move-exception v0
:try_start_17
sget-object v2, Lorg/bitcoin/NativeSecp256k1;->w:Ljava/util/concurrent/locks/Lock;
invoke-interface {v2}, Ljava/util/concurrent/locks/Lock;->unlock()V
throw v0
:try_end_1d
.catchall {:try_start_17 .. :try_end_1d} :catchall_1d
.line 182
:catchall_1d
move-exception v0
monitor-exit v1
throw v0
.end method
.method public static cloneContext()J
.registers 3
.prologue
.line 191
sget-object v0, Lorg/bitcoin/NativeSecp256k1;->r:Ljava/util/concurrent/locks/Lock;
invoke-interface {v0}, Ljava/util/concurrent/locks/Lock;->lock()V
.line 193
:try_start_5
invoke-static {}, Lorg/bitcoin/Secp256k1Context;->getContext()J
move-result-wide v0
invoke-static {v0, v1}, Lorg/bitcoin/NativeSecp256k1;->secp256k1_ctx_clone(J)J
:try_end_c
.catchall {:try_start_5 .. :try_end_c} :catchall_13
move-result-wide v0
.line 195
sget-object v2, Lorg/bitcoin/NativeSecp256k1;->r:Ljava/util/concurrent/locks/Lock;
invoke-interface {v2}, Ljava/util/concurrent/locks/Lock;->unlock()V
.line 193
return-wide v0
.line 195
:catchall_13
move-exception v0
sget-object v1, Lorg/bitcoin/NativeSecp256k1;->r:Ljava/util/concurrent/locks/Lock;
invoke-interface {v1}, Ljava/util/concurrent/locks/Lock;->unlock()V
throw v0
.end method
.method public static computePubkey([B)[B
.registers 8
.prologue
const/4 v1, 0x1
const/4 v2, 0x0
.line 148
array-length v0, p0
const/16 v3, 0x20
if-ne v0, v3, :cond_74
move v0, v1
:goto_8
invoke-static {v0}, Lcom/google/common/base/n;->checkArgument(Z)V
.line 150
sget-object v0, Lorg/bitcoin/NativeSecp256k1;->nativeECDSABuffer:Ljava/lang/ThreadLocal;
invoke-virtual {v0}, Ljava/lang/ThreadLocal;->get()Ljava/lang/Object;
move-result-object v0
check-cast v0, Ljava/nio/ByteBuffer;
.line 151
if-eqz v0, :cond_1c
invoke-virtual {v0}, Ljava/nio/ByteBuffer;->capacity()I
move-result v3
array-length v4, p0
if-ge v3, v4, :cond_2d
.line 152
:cond_1c
array-length v0, p0
invoke-static {v0}, Ljava/nio/ByteBuffer;->allocateDirect(I)Ljava/nio/ByteBuffer;
move-result-object v0
.line 153
invoke-static {}, Ljava/nio/ByteOrder;->nativeOrder()Ljava/nio/ByteOrder;
move-result-object v3
invoke-virtual {v0, v3}, Ljava/nio/ByteBuffer;->order(Ljava/nio/ByteOrder;)Ljava/nio/ByteBuffer;
.line 154
sget-object v3, Lorg/bitcoin/NativeSecp256k1;->nativeECDSABuffer:Ljava/lang/ThreadLocal;
invoke-virtual {v3, v0}, Ljava/lang/ThreadLocal;->set(Ljava/lang/Object;)V
.line 156
:cond_2d
invoke-virtual {v0}, Ljava/nio/ByteBuffer;->rewind()Ljava/nio/Buffer;
.line 157
invoke-virtual {v0, p0}, Ljava/nio/ByteBuffer;->put([B)Ljava/nio/ByteBuffer;
.line 161
sget-object v3, Lorg/bitcoin/NativeSecp256k1;->r:Ljava/util/concurrent/locks/Lock;
invoke-interface {v3}, Ljava/util/concurrent/locks/Lock;->lock()V
.line 163
:try_start_38
invoke-static {}, Lorg/bitcoin/Secp256k1Context;->getContext()J
move-result-wide v4
invoke-static {v0, v4, v5}, Lorg/bitcoin/NativeSecp256k1;->secp256k1_ec_pubkey_create(Ljava/nio/ByteBuffer;J)[[B
:try_end_3f
.catchall {:try_start_38 .. :try_end_3f} :catchall_76
move-result-object v3
.line 165
sget-object v0, Lorg/bitcoin/NativeSecp256k1;->r:Ljava/util/concurrent/locks/Lock;
invoke-interface {v0}, Ljava/util/concurrent/locks/Lock;->unlock()V
.line 168
aget-object v0, v3, v2
.line 169
new-instance v4, Ljava/math/BigInteger;
new-array v5, v1, [B
aget-object v6, v3, v1
aget-byte v6, v6, v2
aput-byte v6, v5, v2
invoke-direct {v4, v5}, Ljava/math/BigInteger;-><init>([B)V
invoke-virtual {v4}, Ljava/math/BigInteger;->intValue()I
move-result v4
.line 170
new-instance v5, Ljava/math/BigInteger;
new-array v6, v1, [B
aget-object v3, v3, v1
aget-byte v1, v3, v1
aput-byte v1, v6, v2
invoke-direct {v5, v6}, Ljava/math/BigInteger;-><init>([B)V
invoke-virtual {v5}, Ljava/math/BigInteger;->intValue()I
move-result v1
.line 172
array-length v3, v0
const-string v5, "Got bad pubkey length."
invoke-static {v3, v4, v5}, Lorg/bitcoin/NativeSecp256k1Util;->assertEquals(IILjava/lang/String;)V
.line 174
if-nez v1, :cond_73
new-array v0, v2, [B
:cond_73
return-object v0
:cond_74
move v0, v2
.line 148
goto :goto_8
.line 165
:catchall_76
move-exception v0
sget-object v1, Lorg/bitcoin/NativeSecp256k1;->r:Ljava/util/concurrent/locks/Lock;
invoke-interface {v1}, Ljava/util/concurrent/locks/Lock;->unlock()V
throw v0
.end method
.method public static createECDHSecret([B[B)[B
.registers 9
.prologue
const/16 v6, 0x20
const/4 v1, 0x1
const/4 v2, 0x0
.line 362
array-length v0, p0
if-gt v0, v6, :cond_71
array-length v0, p1
const/16 v3, 0x41
if-gt v0, v3, :cond_71
move v0, v1
:goto_d
invoke-static {v0}, Lcom/google/common/base/n;->checkArgument(Z)V
.line 364
sget-object v0, Lorg/bitcoin/NativeSecp256k1;->nativeECDSABuffer:Ljava/lang/ThreadLocal;
invoke-virtual {v0}, Ljava/lang/ThreadLocal;->get()Ljava/lang/Object;
move-result-object v0
check-cast v0, Ljava/nio/ByteBuffer;
.line 365
if-eqz v0, :cond_23
invoke-virtual {v0}, Ljava/nio/ByteBuffer;->capacity()I
move-result v3
array-length v4, p1
add-int/lit8 v4, v4, 0x20
if-ge v3, v4, :cond_36
.line 366
:cond_23
array-length v0, p1
add-int/lit8 v0, v0, 0x20
invoke-static {v0}, Ljava/nio/ByteBuffer;->allocateDirect(I)Ljava/nio/ByteBuffer;
move-result-object v0
.line 367
invoke-static {}, Ljava/nio/ByteOrder;->nativeOrder()Ljava/nio/ByteOrder;
move-result-object v3
invoke-virtual {v0, v3}, Ljava/nio/ByteBuffer;->order(Ljava/nio/ByteOrder;)Ljava/nio/ByteBuffer;
.line 368
sget-object v3, Lorg/bitcoin/NativeSecp256k1;->nativeECDSABuffer:Ljava/lang/ThreadLocal;
invoke-virtual {v3, v0}, Ljava/lang/ThreadLocal;->set(Ljava/lang/Object;)V
.line 370
:cond_36
invoke-virtual {v0}, Ljava/nio/ByteBuffer;->rewind()Ljava/nio/Buffer;
.line 371
invoke-virtual {v0, p0}, Ljava/nio/ByteBuffer;->put([B)Ljava/nio/ByteBuffer;
.line 372
invoke-virtual {v0, p1}, Ljava/nio/ByteBuffer;->put([B)Ljava/nio/ByteBuffer;
.line 375
sget-object v3, Lorg/bitcoin/NativeSecp256k1;->r:Ljava/util/concurrent/locks/Lock;
invoke-interface {v3}, Ljava/util/concurrent/locks/Lock;->lock()V
.line 377
:try_start_44
invoke-static {}, Lorg/bitcoin/Secp256k1Context;->getContext()J
move-result-wide v4
array-length v3, p1
invoke-static {v0, v4, v5, v3}, Lorg/bitcoin/NativeSecp256k1;->secp256k1_ecdh(Ljava/nio/ByteBuffer;JI)[[B
:try_end_4c
.catchall {:try_start_44 .. :try_end_4c} :catchall_73
move-result-object v0
.line 379
sget-object v3, Lorg/bitcoin/NativeSecp256k1;->r:Ljava/util/concurrent/locks/Lock;
invoke-interface {v3}, Ljava/util/concurrent/locks/Lock;->unlock()V
.line 382
aget-object v3, v0, v2
.line 383
new-instance v4, Ljava/math/BigInteger;
new-array v5, v1, [B
aget-object v0, v0, v1
aget-byte v0, v0, v2
aput-byte v0, v5, v2
invoke-direct {v4, v5}, Ljava/math/BigInteger;-><init>([B)V
invoke-virtual {v4}, Ljava/math/BigInteger;->intValue()I
move-result v0
.line 385
array-length v2, v3
const-string v4, "Got bad result length."
invoke-static {v2, v6, v4}, Lorg/bitcoin/NativeSecp256k1Util;->assertEquals(IILjava/lang/String;)V
.line 386
const-string v2, "Failed return value check."
invoke-static {v0, v1, v2}, Lorg/bitcoin/NativeSecp256k1Util;->assertEquals(IILjava/lang/String;)V
.line 388
return-object v3
:cond_71
move v0, v2
.line 362
goto :goto_d
.line 379
:catchall_73
move-exception v0
sget-object v1, Lorg/bitcoin/NativeSecp256k1;->r:Ljava/util/concurrent/locks/Lock;
invoke-interface {v1}, Ljava/util/concurrent/locks/Lock;->unlock()V
throw v0
.end method
.method public static privKeyTweakAdd([B[B)[B
.registers 9
.prologue
const/4 v2, 0x0
const/4 v1, 0x1
.line 245
array-length v0, p0
const/16 v3, 0x20
if-ne v0, v3, :cond_7f
move v0, v1
:goto_8
invoke-static {v0}, Lcom/google/common/base/n;->checkArgument(Z)V
.line 247
sget-object v0, Lorg/bitcoin/NativeSecp256k1;->nativeECDSABuffer:Ljava/lang/ThreadLocal;
invoke-virtual {v0}, Ljava/lang/ThreadLocal;->get()Ljava/lang/Object;
move-result-object v0
check-cast v0, Ljava/nio/ByteBuffer;
.line 248
if-eqz v0, :cond_1e
invoke-virtual {v0}, Ljava/nio/ByteBuffer;->capacity()I
move-result v3
array-length v4, p0
array-length v5, p1
add-int/2addr v4, v5
if-ge v3, v4, :cond_31
.line 249
:cond_1e
array-length v0, p0
array-length v3, p1
add-int/2addr v0, v3
invoke-static {v0}, Ljava/nio/ByteBuffer;->allocateDirect(I)Ljava/nio/ByteBuffer;
move-result-object v0
.line 250
invoke-static {}, Ljava/nio/ByteOrder;->nativeOrder()Ljava/nio/ByteOrder;
move-result-object v3
invoke-virtual {v0, v3}, Ljava/nio/ByteBuffer;->order(Ljava/nio/ByteOrder;)Ljava/nio/ByteBuffer;
.line 251
sget-object v3, Lorg/bitcoin/NativeSecp256k1;->nativeECDSABuffer:Ljava/lang/ThreadLocal;
invoke-virtual {v3, v0}, Ljava/lang/ThreadLocal;->set(Ljava/lang/Object;)V
.line 253
:cond_31
invoke-virtual {v0}, Ljava/nio/ByteBuffer;->rewind()Ljava/nio/Buffer;
.line 254
invoke-virtual {v0, p0}, Ljava/nio/ByteBuffer;->put([B)Ljava/nio/ByteBuffer;
.line 255
invoke-virtual {v0, p1}, Ljava/nio/ByteBuffer;->put([B)Ljava/nio/ByteBuffer;
.line 258
sget-object v3, Lorg/bitcoin/NativeSecp256k1;->r:Ljava/util/concurrent/locks/Lock;
invoke-interface {v3}, Ljava/util/concurrent/locks/Lock;->lock()V
.line 260
:try_start_3f
invoke-static {}, Lorg/bitcoin/Secp256k1Context;->getContext()J
move-result-wide v4
invoke-static {v0, v4, v5}, Lorg/bitcoin/NativeSecp256k1;->secp256k1_privkey_tweak_add(Ljava/nio/ByteBuffer;J)[[B
:try_end_46
.catchall {:try_start_3f .. :try_end_46} :catchall_81
move-result-object v0
.line 262
sget-object v3, Lorg/bitcoin/NativeSecp256k1;->r:Ljava/util/concurrent/locks/Lock;
invoke-interface {v3}, Ljava/util/concurrent/locks/Lock;->unlock()V
.line 265
aget-object v3, v0, v2
.line 267
new-instance v4, Ljava/math/BigInteger;
new-array v5, v1, [B
aget-object v6, v0, v1
aget-byte v6, v6, v2
aput-byte v6, v5, v2
invoke-direct {v4, v5}, Ljava/math/BigInteger;-><init>([B)V
invoke-virtual {v4}, Ljava/math/BigInteger;->intValue()I
move-result v4
int-to-byte v4, v4
and-int/lit16 v4, v4, 0xff
.line 268
new-instance v5, Ljava/math/BigInteger;
new-array v6, v1, [B
aget-object v0, v0, v1
aget-byte v0, v0, v1
aput-byte v0, v6, v2
invoke-direct {v5, v6}, Ljava/math/BigInteger;-><init>([B)V
invoke-virtual {v5}, Ljava/math/BigInteger;->intValue()I
move-result v0
.line 270
array-length v2, v3
const-string v5, "Got bad pubkey length."
invoke-static {v2, v4, v5}, Lorg/bitcoin/NativeSecp256k1Util;->assertEquals(IILjava/lang/String;)V
.line 272
const-string v2, "Failed return value check."
invoke-static {v0, v1, v2}, Lorg/bitcoin/NativeSecp256k1Util;->assertEquals(IILjava/lang/String;)V
.line 274
return-object v3
:cond_7f
move v0, v2
.line 245
goto :goto_8
.line 262
:catchall_81
move-exception v0
sget-object v1, Lorg/bitcoin/NativeSecp256k1;->r:Ljava/util/concurrent/locks/Lock;
invoke-interface {v1}, Ljava/util/concurrent/locks/Lock;->unlock()V
throw v0
.end method
.method public static privKeyTweakMul([B[B)[B
.registers 9
.prologue
const/4 v2, 0x0
const/4 v1, 0x1
.line 206
array-length v0, p0
const/16 v3, 0x20
if-ne v0, v3, :cond_7f
move v0, v1
:goto_8
invoke-static {v0}, Lcom/google/common/base/n;->checkArgument(Z)V
.line 208
sget-object v0, Lorg/bitcoin/NativeSecp256k1;->nativeECDSABuffer:Ljava/lang/ThreadLocal;
invoke-virtual {v0}, Ljava/lang/ThreadLocal;->get()Ljava/lang/Object;
move-result-object v0
check-cast v0, Ljava/nio/ByteBuffer;
.line 209
if-eqz v0, :cond_1e
invoke-virtual {v0}, Ljava/nio/ByteBuffer;->capacity()I
move-result v3
array-length v4, p0
array-length v5, p1
add-int/2addr v4, v5
if-ge v3, v4, :cond_31
.line 210
:cond_1e
array-length v0, p0
array-length v3, p1
add-int/2addr v0, v3
invoke-static {v0}, Ljava/nio/ByteBuffer;->allocateDirect(I)Ljava/nio/ByteBuffer;
move-result-object v0
.line 211
invoke-static {}, Ljava/nio/ByteOrder;->nativeOrder()Ljava/nio/ByteOrder;
move-result-object v3
invoke-virtual {v0, v3}, Ljava/nio/ByteBuffer;->order(Ljava/nio/ByteOrder;)Ljava/nio/ByteBuffer;
.line 212
sget-object v3, Lorg/bitcoin/NativeSecp256k1;->nativeECDSABuffer:Ljava/lang/ThreadLocal;
invoke-virtual {v3, v0}, Ljava/lang/ThreadLocal;->set(Ljava/lang/Object;)V
.line 214
:cond_31
invoke-virtual {v0}, Ljava/nio/ByteBuffer;->rewind()Ljava/nio/Buffer;
.line 215
invoke-virtual {v0, p0}, Ljava/nio/ByteBuffer;->put([B)Ljava/nio/ByteBuffer;
.line 216
invoke-virtual {v0, p1}, Ljava/nio/ByteBuffer;->put([B)Ljava/nio/ByteBuffer;
.line 219
sget-object v3, Lorg/bitcoin/NativeSecp256k1;->r:Ljava/util/concurrent/locks/Lock;
invoke-interface {v3}, Ljava/util/concurrent/locks/Lock;->lock()V
.line 221
:try_start_3f
invoke-static {}, Lorg/bitcoin/Secp256k1Context;->getContext()J
move-result-wide v4
invoke-static {v0, v4, v5}, Lorg/bitcoin/NativeSecp256k1;->secp256k1_privkey_tweak_mul(Ljava/nio/ByteBuffer;J)[[B
:try_end_46
.catchall {:try_start_3f .. :try_end_46} :catchall_81
move-result-object v0
.line 223
sget-object v3, Lorg/bitcoin/NativeSecp256k1;->r:Ljava/util/concurrent/locks/Lock;
invoke-interface {v3}, Ljava/util/concurrent/locks/Lock;->unlock()V
.line 226
aget-object v3, v0, v2
.line 228
new-instance v4, Ljava/math/BigInteger;
new-array v5, v1, [B
aget-object v6, v0, v1
aget-byte v6, v6, v2
aput-byte v6, v5, v2
invoke-direct {v4, v5}, Ljava/math/BigInteger;-><init>([B)V
invoke-virtual {v4}, Ljava/math/BigInteger;->intValue()I
move-result v4
int-to-byte v4, v4
and-int/lit16 v4, v4, 0xff
.line 229
new-instance v5, Ljava/math/BigInteger;
new-array v6, v1, [B
aget-object v0, v0, v1
aget-byte v0, v0, v1
aput-byte v0, v6, v2
invoke-direct {v5, v6}, Ljava/math/BigInteger;-><init>([B)V
invoke-virtual {v5}, Ljava/math/BigInteger;->intValue()I
move-result v0
.line 231
array-length v2, v3
const-string v5, "Got bad pubkey length."
invoke-static {v2, v4, v5}, Lorg/bitcoin/NativeSecp256k1Util;->assertEquals(IILjava/lang/String;)V
.line 233
const-string v2, "Failed return value check."
invoke-static {v0, v1, v2}, Lorg/bitcoin/NativeSecp256k1Util;->assertEquals(IILjava/lang/String;)V
.line 235
return-object v3
:cond_7f
move v0, v2
.line 206
goto :goto_8
.line 223
:catchall_81
move-exception v0
sget-object v1, Lorg/bitcoin/NativeSecp256k1;->r:Ljava/util/concurrent/locks/Lock;
invoke-interface {v1}, Ljava/util/concurrent/locks/Lock;->unlock()V
throw v0
.end method
.method public static pubKeyTweakAdd([B[B)[B
.registers 9
.prologue
const/4 v1, 0x0
const/4 v2, 0x1
.line 284
array-length v0, p0
const/16 v3, 0x21
if-eq v0, v3, :cond_c
array-length v0, p0
const/16 v3, 0x41
if-ne v0, v3, :cond_85
:cond_c
move v0, v2
:goto_d
invoke-static {v0}, Lcom/google/common/base/n;->checkArgument(Z)V
.line 286
sget-object v0, Lorg/bitcoin/NativeSecp256k1;->nativeECDSABuffer:Ljava/lang/ThreadLocal;
invoke-virtual {v0}, Ljava/lang/ThreadLocal;->get()Ljava/lang/Object;
move-result-object v0
check-cast v0, Ljava/nio/ByteBuffer;
.line 287
if-eqz v0, :cond_23
invoke-virtual {v0}, Ljava/nio/ByteBuffer;->capacity()I
move-result v3
array-length v4, p0
array-length v5, p1
add-int/2addr v4, v5
if-ge v3, v4, :cond_36
.line 288
:cond_23
array-length v0, p0
array-length v3, p1
add-int/2addr v0, v3
invoke-static {v0}, Ljava/nio/ByteBuffer;->allocateDirect(I)Ljava/nio/ByteBuffer;
move-result-object v0
.line 289
invoke-static {}, Ljava/nio/ByteOrder;->nativeOrder()Ljava/nio/ByteOrder;
move-result-object v3
invoke-virtual {v0, v3}, Ljava/nio/ByteBuffer;->order(Ljava/nio/ByteOrder;)Ljava/nio/ByteBuffer;
.line 290
sget-object v3, Lorg/bitcoin/NativeSecp256k1;->nativeECDSABuffer:Ljava/lang/ThreadLocal;
invoke-virtual {v3, v0}, Ljava/lang/ThreadLocal;->set(Ljava/lang/Object;)V
.line 292
:cond_36
invoke-virtual {v0}, Ljava/nio/ByteBuffer;->rewind()Ljava/nio/Buffer;
.line 293
invoke-virtual {v0, p0}, Ljava/nio/ByteBuffer;->put([B)Ljava/nio/ByteBuffer;
.line 294
invoke-virtual {v0, p1}, Ljava/nio/ByteBuffer;->put([B)Ljava/nio/ByteBuffer;
.line 297
sget-object v3, Lorg/bitcoin/NativeSecp256k1;->r:Ljava/util/concurrent/locks/Lock;
invoke-interface {v3}, Ljava/util/concurrent/locks/Lock;->lock()V
.line 299
:try_start_44
invoke-static {}, Lorg/bitcoin/Secp256k1Context;->getContext()J
move-result-wide v4
array-length v3, p0
invoke-static {v0, v4, v5, v3}, Lorg/bitcoin/NativeSecp256k1;->secp256k1_pubkey_tweak_add(Ljava/nio/ByteBuffer;JI)[[B
:try_end_4c
.catchall {:try_start_44 .. :try_end_4c} :catchall_87
move-result-object v0
.line 301
sget-object v3, Lorg/bitcoin/NativeSecp256k1;->r:Ljava/util/concurrent/locks/Lock;
invoke-interface {v3}, Ljava/util/concurrent/locks/Lock;->unlock()V
.line 304
aget-object v3, v0, v1
.line 306
new-instance v4, Ljava/math/BigInteger;
new-array v5, v2, [B
aget-object v6, v0, v2
aget-byte v6, v6, v1
aput-byte v6, v5, v1
invoke-direct {v4, v5}, Ljava/math/BigInteger;-><init>([B)V
invoke-virtual {v4}, Ljava/math/BigInteger;->intValue()I
move-result v4
int-to-byte v4, v4
and-int/lit16 v4, v4, 0xff
.line 307
new-instance v5, Ljava/math/BigInteger;
new-array v6, v2, [B
aget-object v0, v0, v2
aget-byte v0, v0, v2
aput-byte v0, v6, v1
invoke-direct {v5, v6}, Ljava/math/BigInteger;-><init>([B)V
invoke-virtual {v5}, Ljava/math/BigInteger;->intValue()I
move-result v0
.line 309
array-length v1, v3
const-string v5, "Got bad pubkey length."
invoke-static {v1, v4, v5}, Lorg/bitcoin/NativeSecp256k1Util;->assertEquals(IILjava/lang/String;)V
.line 311
const-string v1, "Failed return value check."
invoke-static {v0, v2, v1}, Lorg/bitcoin/NativeSecp256k1Util;->assertEquals(IILjava/lang/String;)V
.line 313
return-object v3
:cond_85
move v0, v1
.line 284
goto :goto_d
.line 301
:catchall_87
move-exception v0
sget-object v1, Lorg/bitcoin/NativeSecp256k1;->r:Ljava/util/concurrent/locks/Lock;
invoke-interface {v1}, Ljava/util/concurrent/locks/Lock;->unlock()V
throw v0
.end method
.method public static pubKeyTweakMul([B[B)[B
.registers 9
.prologue
const/4 v1, 0x0
const/4 v2, 0x1
.line 323
array-length v0, p0
const/16 v3, 0x21
if-eq v0, v3, :cond_c
array-length v0, p0
const/16 v3, 0x41
if-ne v0, v3, :cond_85
:cond_c
move v0, v2
:goto_d
invoke-static {v0}, Lcom/google/common/base/n;->checkArgument(Z)V
.line 325
sget-object v0, Lorg/bitcoin/NativeSecp256k1;->nativeECDSABuffer:Ljava/lang/ThreadLocal;
invoke-virtual {v0}, Ljava/lang/ThreadLocal;->get()Ljava/lang/Object;
move-result-object v0
check-cast v0, Ljava/nio/ByteBuffer;
.line 326
if-eqz v0, :cond_23
invoke-virtual {v0}, Ljava/nio/ByteBuffer;->capacity()I
move-result v3
array-length v4, p0
array-length v5, p1
add-int/2addr v4, v5
if-ge v3, v4, :cond_36
.line 327
:cond_23
array-length v0, p0
array-length v3, p1
add-int/2addr v0, v3
invoke-static {v0}, Ljava/nio/ByteBuffer;->allocateDirect(I)Ljava/nio/ByteBuffer;
move-result-object v0
.line 328
invoke-static {}, Ljava/nio/ByteOrder;->nativeOrder()Ljava/nio/ByteOrder;
move-result-object v3
invoke-virtual {v0, v3}, Ljava/nio/ByteBuffer;->order(Ljava/nio/ByteOrder;)Ljava/nio/ByteBuffer;
.line 329
sget-object v3, Lorg/bitcoin/NativeSecp256k1;->nativeECDSABuffer:Ljava/lang/ThreadLocal;
invoke-virtual {v3, v0}, Ljava/lang/ThreadLocal;->set(Ljava/lang/Object;)V
.line 331
:cond_36
invoke-virtual {v0}, Ljava/nio/ByteBuffer;->rewind()Ljava/nio/Buffer;
.line 332
invoke-virtual {v0, p0}, Ljava/nio/ByteBuffer;->put([B)Ljava/nio/ByteBuffer;
.line 333
invoke-virtual {v0, p1}, Ljava/nio/ByteBuffer;->put([B)Ljava/nio/ByteBuffer;
.line 336
sget-object v3, Lorg/bitcoin/NativeSecp256k1;->r:Ljava/util/concurrent/locks/Lock;
invoke-interface {v3}, Ljava/util/concurrent/locks/Lock;->lock()V
.line 338
:try_start_44
invoke-static {}, Lorg/bitcoin/Secp256k1Context;->getContext()J
move-result-wide v4
array-length v3, p0
invoke-static {v0, v4, v5, v3}, Lorg/bitcoin/NativeSecp256k1;->secp256k1_pubkey_tweak_mul(Ljava/nio/ByteBuffer;JI)[[B
:try_end_4c
.catchall {:try_start_44 .. :try_end_4c} :catchall_87
move-result-object v0
.line 340
sget-object v3, Lorg/bitcoin/NativeSecp256k1;->r:Ljava/util/concurrent/locks/Lock;
invoke-interface {v3}, Ljava/util/concurrent/locks/Lock;->unlock()V
.line 343
aget-object v3, v0, v1
.line 345
new-instance v4, Ljava/math/BigInteger;
new-array v5, v2, [B
aget-object v6, v0, v2
aget-byte v6, v6, v1
aput-byte v6, v5, v1
invoke-direct {v4, v5}, Ljava/math/BigInteger;-><init>([B)V
invoke-virtual {v4}, Ljava/math/BigInteger;->intValue()I
move-result v4
int-to-byte v4, v4
and-int/lit16 v4, v4, 0xff
.line 346
new-instance v5, Ljava/math/BigInteger;
new-array v6, v2, [B
aget-object v0, v0, v2
aget-byte v0, v0, v2
aput-byte v0, v6, v1
invoke-direct {v5, v6}, Ljava/math/BigInteger;-><init>([B)V
invoke-virtual {v5}, Ljava/math/BigInteger;->intValue()I
move-result v0
.line 348
array-length v1, v3
const-string v5, "Got bad pubkey length."
invoke-static {v1, v4, v5}, Lorg/bitcoin/NativeSecp256k1Util;->assertEquals(IILjava/lang/String;)V
.line 350
const-string v1, "Failed return value check."
invoke-static {v0, v2, v1}, Lorg/bitcoin/NativeSecp256k1Util;->assertEquals(IILjava/lang/String;)V
.line 352
return-object v3
:cond_85
move v0, v1
.line 323
goto :goto_d
.line 340
:catchall_87
move-exception v0
sget-object v1, Lorg/bitcoin/NativeSecp256k1;->r:Ljava/util/concurrent/locks/Lock;
invoke-interface {v1}, Ljava/util/concurrent/locks/Lock;->unlock()V
throw v0
.end method
.method public static declared-synchronized randomize([B)Z
.registers 7
.prologue
const/4 v2, 0x0
const/4 v1, 0x1
.line 397
const-class v3, Lorg/bitcoin/NativeSecp256k1;
monitor-enter v3
:try_start_5
array-length v0, p0
const/16 v4, 0x20
if-eq v0, v4, :cond_c
if-nez p0, :cond_4f
:cond_c
move v0, v1
:goto_d
invoke-static {v0}, Lcom/google/common/base/n;->checkArgument(Z)V
.line 399
sget-object v0, Lorg/bitcoin/NativeSecp256k1;->nativeECDSABuffer:Ljava/lang/ThreadLocal;
invoke-virtual {v0}, Ljava/lang/ThreadLocal;->get()Ljava/lang/Object;
move-result-object v0
check-cast v0, Ljava/nio/ByteBuffer;
.line 400
if-eqz v0, :cond_21
invoke-virtual {v0}, Ljava/nio/ByteBuffer;->capacity()I
move-result v4
array-length v5, p0
if-ge v4, v5, :cond_32
.line 401
:cond_21
array-length v0, p0
invoke-static {v0}, Ljava/nio/ByteBuffer;->allocateDirect(I)Ljava/nio/ByteBuffer;
move-result-object v0
.line 402
invoke-static {}, Ljava/nio/ByteOrder;->nativeOrder()Ljava/nio/ByteOrder;
move-result-object v4
invoke-virtual {v0, v4}, Ljava/nio/ByteBuffer;->order(Ljava/nio/ByteOrder;)Ljava/nio/ByteBuffer;
.line 403
sget-object v4, Lorg/bitcoin/NativeSecp256k1;->nativeECDSABuffer:Ljava/lang/ThreadLocal;
invoke-virtual {v4, v0}, Ljava/lang/ThreadLocal;->set(Ljava/lang/Object;)V
.line 405
:cond_32
invoke-virtual {v0}, Ljava/nio/ByteBuffer;->rewind()Ljava/nio/Buffer;
.line 406
invoke-virtual {v0, p0}, Ljava/nio/ByteBuffer;->put([B)Ljava/nio/ByteBuffer;
.line 408
sget-object v4, Lorg/bitcoin/NativeSecp256k1;->w:Ljava/util/concurrent/locks/Lock;
invoke-interface {v4}, Ljava/util/concurrent/locks/Lock;->lock()V
:try_end_3d
.catchall {:try_start_5 .. :try_end_3d} :catchall_5a
.line 410
:try_start_3d
invoke-static {}, Lorg/bitcoin/Secp256k1Context;->getContext()J
move-result-wide v4
invoke-static {v0, v4, v5}, Lorg/bitcoin/NativeSecp256k1;->secp256k1_context_randomize(Ljava/nio/ByteBuffer;J)I
:try_end_44
.catchall {:try_start_3d .. :try_end_44} :catchall_53
move-result v0
if-ne v0, v1, :cond_51
move v0, v1
.line 412
:goto_48
:try_start_48
sget-object v1, Lorg/bitcoin/NativeSecp256k1;->w:Ljava/util/concurrent/locks/Lock;
invoke-interface {v1}, Ljava/util/concurrent/locks/Lock;->unlock()V
:try_end_4d
.catchall {:try_start_48 .. :try_end_4d} :catchall_5a
.line 410
monitor-exit v3
return v0
:cond_4f
move v0, v2
.line 397
goto :goto_d
:cond_51
move v0, v2
.line 410
goto :goto_48
.line 412
:catchall_53
move-exception v0
:try_start_54
sget-object v1, Lorg/bitcoin/NativeSecp256k1;->w:Ljava/util/concurrent/locks/Lock;
invoke-interface {v1}, Ljava/util/concurrent/locks/Lock;->unlock()V
throw v0
:try_end_5a
.catchall {:try_start_54 .. :try_end_5a} :catchall_5a
.line 397
:catchall_5a
move-exception v0
monitor-exit v3
throw v0
.end method
.method public static schnorrSign([B[B)[B
.registers 9
.prologue
const/16 v6, 0x40
const/16 v3, 0x20
const/4 v1, 0x1
const/4 v2, 0x0
.line 417
array-length v0, p0
if-ne v0, v3, :cond_63
array-length v0, p1
if-gt v0, v3, :cond_63
move v0, v1
:goto_d
invoke-static {v0}, Lcom/google/common/base/n;->checkArgument(Z)V
.line 419
sget-object v0, Lorg/bitcoin/NativeSecp256k1;->nativeECDSABuffer:Ljava/lang/ThreadLocal;
invoke-virtual {v0}, Ljava/lang/ThreadLocal;->get()Ljava/lang/Object;
move-result-object v0
check-cast v0, Ljava/nio/ByteBuffer;
.line 420
if-nez v0, :cond_2a
.line 421
invoke-static {v6}, Ljava/nio/ByteBuffer;->allocateDirect(I)Ljava/nio/ByteBuffer;
move-result-object v0
.line 422
invoke-static {}, Ljava/nio/ByteOrder;->nativeOrder()Ljava/nio/ByteOrder;
move-result-object v3
invoke-virtual {v0, v3}, Ljava/nio/ByteBuffer;->order(Ljava/nio/ByteOrder;)Ljava/nio/ByteBuffer;
.line 423
sget-object v3, Lorg/bitcoin/NativeSecp256k1;->nativeECDSABuffer:Ljava/lang/ThreadLocal;
invoke-virtual {v3, v0}, Ljava/lang/ThreadLocal;->set(Ljava/lang/Object;)V
.line 425
:cond_2a
invoke-virtual {v0}, Ljava/nio/ByteBuffer;->rewind()Ljava/nio/Buffer;
.line 426
invoke-virtual {v0, p0}, Ljava/nio/ByteBuffer;->put([B)Ljava/nio/ByteBuffer;
.line 427
invoke-virtual {v0, p1}, Ljava/nio/ByteBuffer;->put([B)Ljava/nio/ByteBuffer;
.line 431
sget-object v3, Lorg/bitcoin/NativeSecp256k1;->r:Ljava/util/concurrent/locks/Lock;
invoke-interface {v3}, Ljava/util/concurrent/locks/Lock;->lock()V
.line 433
:try_start_38
invoke-static {}, Lorg/bitcoin/Secp256k1Context;->getContext()J
move-result-wide v4
invoke-static {v0, v4, v5}, Lorg/bitcoin/NativeSecp256k1;->secp256k1_schnorr_sign(Ljava/nio/ByteBuffer;J)[[B
:try_end_3f
.catchall {:try_start_38 .. :try_end_3f} :catchall_65
move-result-object v3
.line 435
sget-object v0, Lorg/bitcoin/NativeSecp256k1;->r:Ljava/util/concurrent/locks/Lock;
invoke-interface {v0}, Ljava/util/concurrent/locks/Lock;->unlock()V
.line 438
aget-object v0, v3, v2
.line 439
new-instance v4, Ljava/math/BigInteger;
new-array v5, v1, [B
aget-object v1, v3, v1
aget-byte v1, v1, v2
aput-byte v1, v5, v2
invoke-direct {v4, v5}, Ljava/math/BigInteger;-><init>([B)V
invoke-virtual {v4}, Ljava/math/BigInteger;->intValue()I
move-result v1
.line 441
array-length v3, v0
const-string v4, "Got bad signature length."
invoke-static {v3, v6, v4}, Lorg/bitcoin/NativeSecp256k1Util;->assertEquals(IILjava/lang/String;)V
.line 443
if-nez v1, :cond_62
new-array v0, v2, [B
:cond_62
return-object v0
:cond_63
move v0, v2
.line 417
goto :goto_d
.line 435
:catchall_65
move-exception v0
sget-object v1, Lorg/bitcoin/NativeSecp256k1;->r:Ljava/util/concurrent/locks/Lock;
invoke-interface {v1}, Ljava/util/concurrent/locks/Lock;->unlock()V
throw v0
.end method
.method public static secKeyVerify([B)Z
.registers 7
.prologue
const/4 v2, 0x0
const/4 v1, 0x1
.line 121
array-length v0, p0
const/16 v3, 0x20
if-ne v0, v3, :cond_48
move v0, v1
:goto_8
invoke-static {v0}, Lcom/google/common/base/n;->checkArgument(Z)V
.line 123
sget-object v0, Lorg/bitcoin/NativeSecp256k1;->nativeECDSABuffer:Ljava/lang/ThreadLocal;
invoke-virtual {v0}, Ljava/lang/ThreadLocal;->get()Ljava/lang/Object;
move-result-object v0
check-cast v0, Ljava/nio/ByteBuffer;
.line 124
if-eqz v0, :cond_1c
invoke-virtual {v0}, Ljava/nio/ByteBuffer;->capacity()I
move-result v3
array-length v4, p0
if-ge v3, v4, :cond_2d
.line 125
:cond_1c
array-length v0, p0
invoke-static {v0}, Ljava/nio/ByteBuffer;->allocateDirect(I)Ljava/nio/ByteBuffer;
move-result-object v0
.line 126
invoke-static {}, Ljava/nio/ByteOrder;->nativeOrder()Ljava/nio/ByteOrder;
move-result-object v3
invoke-virtual {v0, v3}, Ljava/nio/ByteBuffer;->order(Ljava/nio/ByteOrder;)Ljava/nio/ByteBuffer;
.line 127
sget-object v3, Lorg/bitcoin/NativeSecp256k1;->nativeECDSABuffer:Ljava/lang/ThreadLocal;
invoke-virtual {v3, v0}, Ljava/lang/ThreadLocal;->set(Ljava/lang/Object;)V
.line 129
:cond_2d
invoke-virtual {v0}, Ljava/nio/ByteBuffer;->rewind()Ljava/nio/Buffer;
.line 130
invoke-virtual {v0, p0}, Ljava/nio/ByteBuffer;->put([B)Ljava/nio/ByteBuffer;
.line 132
sget-object v3, Lorg/bitcoin/NativeSecp256k1;->r:Ljava/util/concurrent/locks/Lock;
invoke-interface {v3}, Ljava/util/concurrent/locks/Lock;->lock()V
.line 134
:try_start_38
invoke-static {}, Lorg/bitcoin/Secp256k1Context;->getContext()J
move-result-wide v4
invoke-static {v0, v4, v5}, Lorg/bitcoin/NativeSecp256k1;->secp256k1_ec_seckey_verify(Ljava/nio/ByteBuffer;J)I
:try_end_3f
.catchall {:try_start_38 .. :try_end_3f} :catchall_4c
move-result v0
if-ne v0, v1, :cond_4a
.line 136
:goto_42
sget-object v0, Lorg/bitcoin/NativeSecp256k1;->r:Ljava/util/concurrent/locks/Lock;
invoke-interface {v0}, Ljava/util/concurrent/locks/Lock;->unlock()V
.line 134
return v1
:cond_48
move v0, v2
.line 121
goto :goto_8
:cond_4a
move v1, v2
.line 134
goto :goto_42
.line 136
:catchall_4c
move-exception v0
sget-object v1, Lorg/bitcoin/NativeSecp256k1;->r:Ljava/util/concurrent/locks/Lock;
invoke-interface {v1}, Ljava/util/concurrent/locks/Lock;->unlock()V
throw v0
.end method
.method private static native secp256k1_context_randomize(Ljava/nio/ByteBuffer;J)I
.end method
.method private static native secp256k1_ctx_clone(J)J
.end method
.method private static native secp256k1_destroy_context(J)V
.end method
.method private static native secp256k1_ec_pubkey_create(Ljava/nio/ByteBuffer;J)[[B
.end method
.method private static native secp256k1_ec_pubkey_parse(Ljava/nio/ByteBuffer;JI)[[B
.end method
.method private static native secp256k1_ec_seckey_verify(Ljava/nio/ByteBuffer;J)I
.end method
.method private static native secp256k1_ecdh(Ljava/nio/ByteBuffer;JI)[[B
.end method
.method private static native secp256k1_ecdsa_sign(Ljava/nio/ByteBuffer;J)[[B
.end method
.method private static native secp256k1_ecdsa_verify(Ljava/nio/ByteBuffer;JII)I
.end method
.method private static native secp256k1_privkey_tweak_add(Ljava/nio/ByteBuffer;J)[[B
.end method
.method private static native secp256k1_privkey_tweak_mul(Ljava/nio/ByteBuffer;J)[[B
.end method
.method private static native secp256k1_pubkey_tweak_add(Ljava/nio/ByteBuffer;JI)[[B
.end method
.method private static native secp256k1_pubkey_tweak_mul(Ljava/nio/ByteBuffer;JI)[[B
.end method
.method private static native secp256k1_schnorr_sign(Ljava/nio/ByteBuffer;J)[[B
.end method
.method public static sign([B[B)[B
.registers 9
.prologue
const/16 v4, 0x40
const/16 v3, 0x20
const/4 v1, 0x1
const/4 v2, 0x0
.line 85
array-length v0, p0
if-ne v0, v3, :cond_7a
array-length v0, p1
if-gt v0, v3, :cond_7a
move v0, v1
:goto_d
invoke-static {v0}, Lcom/google/common/base/n;->checkArgument(Z)V
.line 87
sget-object v0, Lorg/bitcoin/NativeSecp256k1;->nativeECDSABuffer:Ljava/lang/ThreadLocal;
invoke-virtual {v0}, Ljava/lang/ThreadLocal;->get()Ljava/lang/Object;
move-result-object v0
check-cast v0, Ljava/nio/ByteBuffer;
.line 88
if-eqz v0, :cond_20
invoke-virtual {v0}, Ljava/nio/ByteBuffer;->capacity()I
move-result v3
if-ge v3, v4, :cond_30
.line 89
:cond_20
invoke-static {v4}, Ljava/nio/ByteBuffer;->allocateDirect(I)Ljava/nio/ByteBuffer;
move-result-object v0
.line 90
invoke-static {}, Ljava/nio/ByteOrder;->nativeOrder()Ljava/nio/ByteOrder;
move-result-object v3
invoke-virtual {v0, v3}, Ljava/nio/ByteBuffer;->order(Ljava/nio/ByteOrder;)Ljava/nio/ByteBuffer;
.line 91
sget-object v3, Lorg/bitcoin/NativeSecp256k1;->nativeECDSABuffer:Ljava/lang/ThreadLocal;
invoke-virtual {v3, v0}, Ljava/lang/ThreadLocal;->set(Ljava/lang/Object;)V
.line 93
:cond_30
invoke-virtual {v0}, Ljava/nio/ByteBuffer;->rewind()Ljava/nio/Buffer;
.line 94
invoke-virtual {v0, p0}, Ljava/nio/ByteBuffer;->put([B)Ljava/nio/ByteBuffer;
.line 95
invoke-virtual {v0, p1}, Ljava/nio/ByteBuffer;->put([B)Ljava/nio/ByteBuffer;
.line 99
sget-object v3, Lorg/bitcoin/NativeSecp256k1;->r:Ljava/util/concurrent/locks/Lock;
invoke-interface {v3}, Ljava/util/concurrent/locks/Lock;->lock()V
.line 101
:try_start_3e
invoke-static {}, Lorg/bitcoin/Secp256k1Context;->getContext()J
move-result-wide v4
invoke-static {v0, v4, v5}, Lorg/bitcoin/NativeSecp256k1;->secp256k1_ecdsa_sign(Ljava/nio/ByteBuffer;J)[[B
:try_end_45
.catchall {:try_start_3e .. :try_end_45} :catchall_7c
move-result-object v3
.line 103
sget-object v0, Lorg/bitcoin/NativeSecp256k1;->r:Ljava/util/concurrent/locks/Lock;
invoke-interface {v0}, Ljava/util/concurrent/locks/Lock;->unlock()V
.line 106
aget-object v0, v3, v2
.line 107
new-instance v4, Ljava/math/BigInteger;
new-array v5, v1, [B
aget-object v6, v3, v1
aget-byte v6, v6, v2
aput-byte v6, v5, v2
invoke-direct {v4, v5}, Ljava/math/BigInteger;-><init>([B)V
invoke-virtual {v4}, Ljava/math/BigInteger;->intValue()I
move-result v4
.line 108
new-instance v5, Ljava/math/BigInteger;
new-array v6, v1, [B
aget-object v3, v3, v1
aget-byte v1, v3, v1
aput-byte v1, v6, v2
invoke-direct {v5, v6}, Ljava/math/BigInteger;-><init>([B)V
invoke-virtual {v5}, Ljava/math/BigInteger;->intValue()I
move-result v1
.line 110
array-length v3, v0
const-string v5, "Got bad signature length."
invoke-static {v3, v4, v5}, Lorg/bitcoin/NativeSecp256k1Util;->assertEquals(IILjava/lang/String;)V
.line 112
if-nez v1, :cond_79
new-array v0, v2, [B
:cond_79
return-object v0
:cond_7a
move v0, v2
.line 85
goto :goto_d
.line 103
:catchall_7c
move-exception v0
sget-object v1, Lorg/bitcoin/NativeSecp256k1;->r:Ljava/util/concurrent/locks/Lock;
invoke-interface {v1}, Ljava/util/concurrent/locks/Lock;->unlock()V
throw v0
.end method
.method public static verify([B[B[B)Z
.registers 10
.prologue
const/4 v2, 0x0
const/4 v1, 0x1
const/16 v4, 0x208
.line 56
array-length v0, p0
const/16 v3, 0x20
if-ne v0, v3, :cond_56
array-length v0, p1
if-gt v0, v4, :cond_56
array-length v0, p2
if-gt v0, v4, :cond_56
move v0, v1
:goto_10
invoke-static {v0}, Lcom/google/common/base/n;->checkArgument(Z)V
.line 58
sget-object v0, Lorg/bitcoin/NativeSecp256k1;->nativeECDSABuffer:Ljava/lang/ThreadLocal;
invoke-virtual {v0}, Ljava/lang/ThreadLocal;->get()Ljava/lang/Object;
move-result-object v0
check-cast v0, Ljava/nio/ByteBuffer;
.line 59
if-eqz v0, :cond_23
invoke-virtual {v0}, Ljava/nio/ByteBuffer;->capacity()I
move-result v3
if-ge v3, v4, :cond_33
.line 60
:cond_23
invoke-static {v4}, Ljava/nio/ByteBuffer;->allocateDirect(I)Ljava/nio/ByteBuffer;
move-result-object v0
.line 61
invoke-static {}, Ljava/nio/ByteOrder;->nativeOrder()Ljava/nio/ByteOrder;
move-result-object v3
invoke-virtual {v0, v3}, Ljava/nio/ByteBuffer;->order(Ljava/nio/ByteOrder;)Ljava/nio/ByteBuffer;
.line 62
sget-object v3, Lorg/bitcoin/NativeSecp256k1;->nativeECDSABuffer:Ljava/lang/ThreadLocal;
invoke-virtual {v3, v0}, Ljava/lang/ThreadLocal;->set(Ljava/lang/Object;)V
.line 64
:cond_33
invoke-virtual {v0}, Ljava/nio/ByteBuffer;->rewind()Ljava/nio/Buffer;
.line 65
invoke-virtual {v0, p0}, Ljava/nio/ByteBuffer;->put([B)Ljava/nio/ByteBuffer;
.line 66
invoke-virtual {v0, p1}, Ljava/nio/ByteBuffer;->put([B)Ljava/nio/ByteBuffer;
.line 67
invoke-virtual {v0, p2}, Ljava/nio/ByteBuffer;->put([B)Ljava/nio/ByteBuffer;
.line 69
sget-object v3, Lorg/bitcoin/NativeSecp256k1;->r:Ljava/util/concurrent/locks/Lock;
invoke-interface {v3}, Ljava/util/concurrent/locks/Lock;->lock()V
.line 71
:try_start_44
invoke-static {}, Lorg/bitcoin/Secp256k1Context;->getContext()J
move-result-wide v4
array-length v3, p1
array-length v6, p2
invoke-static {v0, v4, v5, v3, v6}, Lorg/bitcoin/NativeSecp256k1;->secp256k1_ecdsa_verify(Ljava/nio/ByteBuffer;JII)I
:try_end_4d
.catchall {:try_start_44 .. :try_end_4d} :catchall_5a
move-result v0
if-ne v0, v1, :cond_58
.line 73
:goto_50
sget-object v0, Lorg/bitcoin/NativeSecp256k1;->r:Ljava/util/concurrent/locks/Lock;
invoke-interface {v0}, Ljava/util/concurrent/locks/Lock;->unlock()V
.line 71
return v1
:cond_56
move v0, v2
.line 56
goto :goto_10
:cond_58
move v1, v2
.line 71
goto :goto_50
.line 73
:catchall_5a
move-exception v0
sget-object v1, Lorg/bitcoin/NativeSecp256k1;->r:Ljava/util/concurrent/locks/Lock;
invoke-interface {v1}, Ljava/util/concurrent/locks/Lock;->unlock()V
throw v0
.end method