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