DSAParametersGenerator.smali

.class public Lorg/spongycastle/crypto/generators/DSAParametersGenerator;
.super Ljava/lang/Object;
.source "DSAParametersGenerator.java"


# static fields
.field private static final ONE:Ljava/math/BigInteger;

.field private static final TWO:Ljava/math/BigInteger;

.field private static final ZERO:Ljava/math/BigInteger;


# instance fields
.field private L:I

.field private N:I

.field private certainty:I

.field private digest:Lorg/spongycastle/crypto/Digest;

.field private iterations:I

.field private random:Ljava/security/SecureRandom;

.field private usageIndex:I

.field private use186_3:Z


# direct methods
.method static constructor <clinit>()V
    .registers 2

    .prologue
    .line 20
    const-wide/16 v0, 0x0

    invoke-static {v0, v1}, Ljava/math/BigInteger;->valueOf(J)Ljava/math/BigInteger;

    move-result-object v0

    sput-object v0, Lorg/spongycastle/crypto/generators/DSAParametersGenerator;->ZERO:Ljava/math/BigInteger;

    .line 21
    const-wide/16 v0, 0x1

    invoke-static {v0, v1}, Ljava/math/BigInteger;->valueOf(J)Ljava/math/BigInteger;

    move-result-object v0

    sput-object v0, Lorg/spongycastle/crypto/generators/DSAParametersGenerator;->ONE:Ljava/math/BigInteger;

    .line 22
    const-wide/16 v0, 0x2

    invoke-static {v0, v1}, Ljava/math/BigInteger;->valueOf(J)Ljava/math/BigInteger;

    move-result-object v0

    sput-object v0, Lorg/spongycastle/crypto/generators/DSAParametersGenerator;->TWO:Ljava/math/BigInteger;

    return-void
.end method

.method public constructor <init>()V
    .registers 2

    .prologue
    .line 34
    new-instance v0, Lorg/spongycastle/crypto/digests/SHA1Digest;

    invoke-direct {v0}, Lorg/spongycastle/crypto/digests/SHA1Digest;-><init>()V

    invoke-direct {p0, v0}, Lorg/spongycastle/crypto/generators/DSAParametersGenerator;-><init>(Lorg/spongycastle/crypto/Digest;)V

    .line 35
    return-void
.end method

.method public constructor <init>(Lorg/spongycastle/crypto/Digest;)V
    .registers 2

    .prologue
    .line 38
    invoke-direct {p0}, Ljava/lang/Object;-><init>()V

    .line 39
    iput-object p1, p0, Lorg/spongycastle/crypto/generators/DSAParametersGenerator;->digest:Lorg/spongycastle/crypto/Digest;

    .line 40
    return-void
.end method

.method private static calculateGenerator_FIPS186_2(Ljava/math/BigInteger;Ljava/math/BigInteger;Ljava/security/SecureRandom;)Ljava/math/BigInteger;
    .registers 8

    .prologue
    .line 201
    sget-object v0, Lorg/spongycastle/crypto/generators/DSAParametersGenerator;->ONE:Ljava/math/BigInteger;

    invoke-virtual {p0, v0}, Ljava/math/BigInteger;->subtract(Ljava/math/BigInteger;)Ljava/math/BigInteger;

    move-result-object v0

    invoke-virtual {v0, p1}, Ljava/math/BigInteger;->divide(Ljava/math/BigInteger;)Ljava/math/BigInteger;

    move-result-object v0

    .line 202
    sget-object v1, Lorg/spongycastle/crypto/generators/DSAParametersGenerator;->TWO:Ljava/math/BigInteger;

    invoke-virtual {p0, v1}, Ljava/math/BigInteger;->subtract(Ljava/math/BigInteger;)Ljava/math/BigInteger;

    move-result-object v1

    .line 206
    :cond_10
    sget-object v2, Lorg/spongycastle/crypto/generators/DSAParametersGenerator;->TWO:Ljava/math/BigInteger;

    invoke-static {v2, v1, p2}, Lorg/spongycastle/util/BigIntegers;->createRandomInRange(Ljava/math/BigInteger;Ljava/math/BigInteger;Ljava/security/SecureRandom;)Ljava/math/BigInteger;

    move-result-object v2

    .line 207
    invoke-virtual {v2, v0, p0}, Ljava/math/BigInteger;->modPow(Ljava/math/BigInteger;Ljava/math/BigInteger;)Ljava/math/BigInteger;

    move-result-object v2

    .line 208
    invoke-virtual {v2}, Ljava/math/BigInteger;->bitLength()I

    move-result v3

    const/4 v4, 0x1

    if-le v3, v4, :cond_10

    .line 210
    return-object v2
.end method

.method private static calculateGenerator_FIPS186_3_Unverifiable(Ljava/math/BigInteger;Ljava/math/BigInteger;Ljava/security/SecureRandom;)Ljava/math/BigInteger;
    .registers 4

    .prologue
    .line 345
    invoke-static {p0, p1, p2}, Lorg/spongycastle/crypto/generators/DSAParametersGenerator;->calculateGenerator_FIPS186_2(Ljava/math/BigInteger;Ljava/math/BigInteger;Ljava/security/SecureRandom;)Ljava/math/BigInteger;

    move-result-object v0

    return-object v0
.end method

.method private static calculateGenerator_FIPS186_3_Verifiable(Lorg/spongycastle/crypto/Digest;Ljava/math/BigInteger;Ljava/math/BigInteger;[BI)Ljava/math/BigInteger;
    .registers 13

    .prologue
    const/4 v2, 0x1

    const/4 v7, 0x0

    .line 352
    sget-object v0, Lorg/spongycastle/crypto/generators/DSAParametersGenerator;->ONE:Ljava/math/BigInteger;

    invoke-virtual {p1, v0}, Ljava/math/BigInteger;->subtract(Ljava/math/BigInteger;)Ljava/math/BigInteger;

    move-result-object v0

    invoke-virtual {v0, p2}, Ljava/math/BigInteger;->divide(Ljava/math/BigInteger;)Ljava/math/BigInteger;

    move-result-object v3

    .line 353
    const-string v0, "6767656E"

    invoke-static {v0}, Lorg/spongycastle/util/encoders/Hex;->decode(Ljava/lang/String;)[B

    move-result-object v0

    .line 356
    array-length v1, p3

    array-length v4, v0

    add-int/2addr v1, v4

    add-int/lit8 v1, v1, 0x1

    add-int/lit8 v1, v1, 0x2

    new-array v4, v1, [B

    .line 357
    array-length v1, p3

    invoke-static {p3, v7, v4, v7, v1}, Ljava/lang/System;->arraycopy(Ljava/lang/Object;ILjava/lang/Object;II)V

    .line 358
    array-length v1, p3

    array-length v5, v0

    invoke-static {v0, v7, v4, v1, v5}, Ljava/lang/System;->arraycopy(Ljava/lang/Object;ILjava/lang/Object;II)V

    .line 359
    array-length v0, v4

    add-int/lit8 v0, v0, -0x3

    int-to-byte v1, p4

    aput-byte v1, v4, v0

    .line 361
    invoke-interface {p0}, Lorg/spongycastle/crypto/Digest;->getDigestSize()I

    move-result v0

    new-array v5, v0, [B

    move v1, v2

    .line 362
    :goto_31
    const/high16 v0, 0x10000

    if-ge v1, v0, :cond_51

    .line 364
    invoke-static {v4}, Lorg/spongycastle/crypto/generators/DSAParametersGenerator;->inc([B)V

    .line 365
    invoke-static {p0, v4, v5, v7}, Lorg/spongycastle/crypto/generators/DSAParametersGenerator;->hash(Lorg/spongycastle/crypto/Digest;[B[BI)V

    .line 366
    new-instance v0, Ljava/math/BigInteger;

    invoke-direct {v0, v2, v5}, Ljava/math/BigInteger;-><init>(I[B)V

    .line 367
    invoke-virtual {v0, v3, p1}, Ljava/math/BigInteger;->modPow(Ljava/math/BigInteger;Ljava/math/BigInteger;)Ljava/math/BigInteger;

    move-result-object v0

    .line 368
    sget-object v6, Lorg/spongycastle/crypto/generators/DSAParametersGenerator;->TWO:Ljava/math/BigInteger;

    invoke-virtual {v0, v6}, Ljava/math/BigInteger;->compareTo(Ljava/math/BigInteger;)I

    move-result v6

    if-ltz v6, :cond_4d

    .line 374
    :goto_4c
    return-object v0

    .line 362
    :cond_4d
    add-int/lit8 v0, v1, 0x1

    move v1, v0

    goto :goto_31

    .line 374
    :cond_51
    const/4 v0, 0x0

    goto :goto_4c
.end method

.method private generateParameters_FIPS186_2()Lorg/spongycastle/crypto/params/DSAParameters;
    .registers 14

    .prologue
    .line 122
    const/16 v0, 0x14

    new-array v2, v0, [B

    .line 123
    const/16 v0, 0x14

    new-array v3, v0, [B

    .line 124
    const/16 v0, 0x14

    new-array v4, v0, [B

    .line 125
    const/16 v0, 0x14

    new-array v5, v0, [B

    .line 126
    iget v0, p0, Lorg/spongycastle/crypto/generators/DSAParametersGenerator;->L:I

    add-int/lit8 v0, v0, -0x1

    div-int/lit16 v6, v0, 0xa0

    .line 127
    iget v0, p0, Lorg/spongycastle/crypto/generators/DSAParametersGenerator;->L:I

    div-int/lit8 v0, v0, 0x8

    new-array v7, v0, [B

    .line 129
    iget-object v0, p0, Lorg/spongycastle/crypto/generators/DSAParametersGenerator;->digest:Lorg/spongycastle/crypto/Digest;

    instance-of v0, v0, Lorg/spongycastle/crypto/digests/SHA1Digest;

    if-nez v0, :cond_2a

    .line 131
    new-instance v0, Ljava/lang/IllegalStateException;

    const-string v1, "can only use SHA-1 for generating FIPS 186-2 parameters"

    invoke-direct {v0, v1}, Ljava/lang/IllegalStateException;-><init>(Ljava/lang/String;)V

    throw v0

    .line 136
    :cond_2a
    iget-object v0, p0, Lorg/spongycastle/crypto/generators/DSAParametersGenerator;->random:Ljava/security/SecureRandom;

    invoke-virtual {v0, v2}, Ljava/security/SecureRandom;->nextBytes([B)V

    .line 138
    iget-object v0, p0, Lorg/spongycastle/crypto/generators/DSAParametersGenerator;->digest:Lorg/spongycastle/crypto/Digest;

    const/4 v1, 0x0

    invoke-static {v0, v2, v3, v1}, Lorg/spongycastle/crypto/generators/DSAParametersGenerator;->hash(Lorg/spongycastle/crypto/Digest;[B[BI)V

    .line 139
    const/4 v0, 0x0

    const/4 v1, 0x0

    const/16 v8, 0x14

    invoke-static {v2, v0, v4, v1, v8}, Ljava/lang/System;->arraycopy(Ljava/lang/Object;ILjava/lang/Object;II)V

    .line 140
    invoke-static {v4}, Lorg/spongycastle/crypto/generators/DSAParametersGenerator;->inc([B)V

    .line 141
    iget-object v0, p0, Lorg/spongycastle/crypto/generators/DSAParametersGenerator;->digest:Lorg/spongycastle/crypto/Digest;

    const/4 v1, 0x0

    invoke-static {v0, v4, v4, v1}, Lorg/spongycastle/crypto/generators/DSAParametersGenerator;->hash(Lorg/spongycastle/crypto/Digest;[B[BI)V

    .line 143
    const/4 v0, 0x0

    :goto_46
    const/16 v1, 0x14

    if-eq v0, v1, :cond_55

    .line 145
    aget-byte v1, v3, v0

    aget-byte v8, v4, v0

    xor-int/2addr v1, v8

    int-to-byte v1, v1

    aput-byte v1, v5, v0

    .line 143
    add-int/lit8 v0, v0, 0x1

    goto :goto_46

    .line 148
    :cond_55
    const/4 v0, 0x0

    aget-byte v1, v5, v0

    or-int/lit8 v1, v1, -0x80

    int-to-byte v1, v1

    aput-byte v1, v5, v0

    .line 149
    const/16 v0, 0x13

    aget-byte v1, v5, v0

    or-int/lit8 v1, v1, 0x1

    int-to-byte v1, v1

    aput-byte v1, v5, v0

    .line 151
    new-instance v8, Ljava/math/BigInteger;

    const/4 v0, 0x1

    invoke-direct {v8, v0, v5}, Ljava/math/BigInteger;-><init>(I[B)V

    .line 153
    invoke-direct {p0, v8}, Lorg/spongycastle/crypto/generators/DSAParametersGenerator;->isProbablePrime(Ljava/math/BigInteger;)Z

    move-result v0

    if-eqz v0, :cond_2a

    .line 158
    invoke-static {v2}, Lorg/spongycastle/util/Arrays;->clone([B)[B

    move-result-object v9

    .line 159
    invoke-static {v9}, Lorg/spongycastle/crypto/generators/DSAParametersGenerator;->inc([B)V

    .line 161
    const/4 v0, 0x0

    move v1, v0

    :goto_7b
    const/16 v0, 0x1000

    if-ge v1, v0, :cond_2a

    .line 164
    const/4 v0, 0x1

    :goto_80
    if-gt v0, v6, :cond_91

    .line 166
    invoke-static {v9}, Lorg/spongycastle/crypto/generators/DSAParametersGenerator;->inc([B)V

    .line 167
    iget-object v10, p0, Lorg/spongycastle/crypto/generators/DSAParametersGenerator;->digest:Lorg/spongycastle/crypto/Digest;

    array-length v11, v7

    mul-int/lit8 v12, v0, 0x14

    sub-int/2addr v11, v12

    invoke-static {v10, v9, v7, v11}, Lorg/spongycastle/crypto/generators/DSAParametersGenerator;->hash(Lorg/spongycastle/crypto/Digest;[B[BI)V

    .line 164
    add-int/lit8 v0, v0, 0x1

    goto :goto_80

    .line 170
    :cond_91
    array-length v0, v7

    mul-int/lit8 v10, v6, 0x14

    sub-int/2addr v0, v10

    .line 171
    invoke-static {v9}, Lorg/spongycastle/crypto/generators/DSAParametersGenerator;->inc([B)V

    .line 172
    iget-object v10, p0, Lorg/spongycastle/crypto/generators/DSAParametersGenerator;->digest:Lorg/spongycastle/crypto/Digest;

    const/4 v11, 0x0

    invoke-static {v10, v9, v3, v11}, Lorg/spongycastle/crypto/generators/DSAParametersGenerator;->hash(Lorg/spongycastle/crypto/Digest;[B[BI)V

    .line 173
    rsub-int/lit8 v10, v0, 0x14

    const/4 v11, 0x0

    invoke-static {v3, v10, v7, v11, v0}, Ljava/lang/System;->arraycopy(Ljava/lang/Object;ILjava/lang/Object;II)V

    .line 175
    const/4 v0, 0x0

    aget-byte v10, v7, v0

    or-int/lit8 v10, v10, -0x80

    int-to-byte v10, v10

    aput-byte v10, v7, v0

    .line 178
    new-instance v0, Ljava/math/BigInteger;

    const/4 v10, 0x1

    invoke-direct {v0, v10, v7}, Ljava/math/BigInteger;-><init>(I[B)V

    .line 180
    const/4 v10, 0x1

    invoke-virtual {v8, v10}, Ljava/math/BigInteger;->shiftLeft(I)Ljava/math/BigInteger;

    move-result-object v10

    invoke-virtual {v0, v10}, Ljava/math/BigInteger;->mod(Ljava/math/BigInteger;)Ljava/math/BigInteger;

    move-result-object v10

    .line 182
    sget-object v11, Lorg/spongycastle/crypto/generators/DSAParametersGenerator;->ONE:Ljava/math/BigInteger;

    invoke-virtual {v10, v11}, Ljava/math/BigInteger;->subtract(Ljava/math/BigInteger;)Ljava/math/BigInteger;

    move-result-object v10

    invoke-virtual {v0, v10}, Ljava/math/BigInteger;->subtract(Ljava/math/BigInteger;)Ljava/math/BigInteger;

    move-result-object v0

    .line 184
    invoke-virtual {v0}, Ljava/math/BigInteger;->bitLength()I

    move-result v10

    iget v11, p0, Lorg/spongycastle/crypto/generators/DSAParametersGenerator;->L:I

    if-ne v10, v11, :cond_e4

    .line 189
    invoke-direct {p0, v0}, Lorg/spongycastle/crypto/generators/DSAParametersGenerator;->isProbablePrime(Ljava/math/BigInteger;)Z

    move-result v10

    if-eqz v10, :cond_e4

    .line 191
    iget-object v3, p0, Lorg/spongycastle/crypto/generators/DSAParametersGenerator;->random:Ljava/security/SecureRandom;

    invoke-static {v0, v8, v3}, Lorg/spongycastle/crypto/generators/DSAParametersGenerator;->calculateGenerator_FIPS186_2(Ljava/math/BigInteger;Ljava/math/BigInteger;Ljava/security/SecureRandom;)Ljava/math/BigInteger;

    move-result-object v3

    .line 193
    new-instance v4, Lorg/spongycastle/crypto/params/DSAParameters;

    new-instance v5, Lorg/spongycastle/crypto/params/DSAValidationParameters;

    invoke-direct {v5, v2, v1}, Lorg/spongycastle/crypto/params/DSAValidationParameters;-><init>([BI)V

    invoke-direct {v4, v0, v8, v3, v5}, Lorg/spongycastle/crypto/params/DSAParameters;-><init>(Ljava/math/BigInteger;Ljava/math/BigInteger;Ljava/math/BigInteger;Lorg/spongycastle/crypto/params/DSAValidationParameters;)V

    return-object v4

    .line 161
    :cond_e4
    add-int/lit8 v0, v1, 0x1

    move v1, v0

    goto :goto_7b
.end method

.method private generateParameters_FIPS186_3()Lorg/spongycastle/crypto/params/DSAParameters;
    .registers 15

    .prologue
    const/4 v1, 0x1

    const/4 v3, 0x0

    .line 223
    iget-object v4, p0, Lorg/spongycastle/crypto/generators/DSAParametersGenerator;->digest:Lorg/spongycastle/crypto/Digest;

    .line 224
    invoke-interface {v4}, Lorg/spongycastle/crypto/Digest;->getDigestSize()I

    move-result v0

    shl-int/lit8 v0, v0, 0x3

    .line 232
    iget v2, p0, Lorg/spongycastle/crypto/generators/DSAParametersGenerator;->N:I

    .line 233
    div-int/lit8 v2, v2, 0x8

    new-array v5, v2, [B

    .line 236
    iget v2, p0, Lorg/spongycastle/crypto/generators/DSAParametersGenerator;->L:I

    add-int/lit8 v2, v2, -0x1

    div-int v6, v2, v0

    .line 241
    iget v0, p0, Lorg/spongycastle/crypto/generators/DSAParametersGenerator;->L:I

    div-int/lit8 v0, v0, 0x8

    new-array v7, v0, [B

    .line 242
    invoke-interface {v4}, Lorg/spongycastle/crypto/Digest;->getDigestSize()I

    move-result v0

    new-array v8, v0, [B

    .line 246
    :cond_22
    iget-object v0, p0, Lorg/spongycastle/crypto/generators/DSAParametersGenerator;->random:Ljava/security/SecureRandom;

    invoke-virtual {v0, v5}, Ljava/security/SecureRandom;->nextBytes([B)V

    .line 249
    invoke-static {v4, v5, v8, v3}, Lorg/spongycastle/crypto/generators/DSAParametersGenerator;->hash(Lorg/spongycastle/crypto/Digest;[B[BI)V

    .line 251
    new-instance v0, Ljava/math/BigInteger;

    invoke-direct {v0, v1, v8}, Ljava/math/BigInteger;-><init>(I[B)V

    sget-object v2, Lorg/spongycastle/crypto/generators/DSAParametersGenerator;->ONE:Ljava/math/BigInteger;

    iget v9, p0, Lorg/spongycastle/crypto/generators/DSAParametersGenerator;->N:I

    add-int/lit8 v9, v9, -0x1

    invoke-virtual {v2, v9}, Ljava/math/BigInteger;->shiftLeft(I)Ljava/math/BigInteger;

    move-result-object v2

    invoke-virtual {v0, v2}, Ljava/math/BigInteger;->mod(Ljava/math/BigInteger;)Ljava/math/BigInteger;

    move-result-object v0

    .line 254
    invoke-virtual {v0, v3}, Ljava/math/BigInteger;->setBit(I)Ljava/math/BigInteger;

    move-result-object v0

    iget v2, p0, Lorg/spongycastle/crypto/generators/DSAParametersGenerator;->N:I

    add-int/lit8 v2, v2, -0x1

    invoke-virtual {v0, v2}, Ljava/math/BigInteger;->setBit(I)Ljava/math/BigInteger;

    move-result-object v9

    .line 257
    invoke-direct {p0, v9}, Lorg/spongycastle/crypto/generators/DSAParametersGenerator;->isProbablePrime(Ljava/math/BigInteger;)Z

    move-result v0

    if-eqz v0, :cond_22

    .line 265
    invoke-static {v5}, Lorg/spongycastle/util/Arrays;->clone([B)[B

    move-result-object v10

    .line 268
    iget v0, p0, Lorg/spongycastle/crypto/generators/DSAParametersGenerator;->L:I

    mul-int/lit8 v11, v0, 0x4

    move v2, v3

    .line 269
    :goto_58
    if-ge v2, v11, :cond_22

    move v0, v1

    .line 275
    :goto_5b
    if-gt v0, v6, :cond_6a

    .line 277
    invoke-static {v10}, Lorg/spongycastle/crypto/generators/DSAParametersGenerator;->inc([B)V

    .line 278
    array-length v12, v7

    array-length v13, v8

    mul-int/2addr v13, v0

    sub-int/2addr v12, v13

    invoke-static {v4, v10, v7, v12}, Lorg/spongycastle/crypto/generators/DSAParametersGenerator;->hash(Lorg/spongycastle/crypto/Digest;[B[BI)V

    .line 275
    add-int/lit8 v0, v0, 0x1

    goto :goto_5b

    .line 281
    :cond_6a
    array-length v0, v7

    array-length v12, v8

    mul-int/2addr v12, v6

    sub-int/2addr v0, v12

    .line 282
    invoke-static {v10}, Lorg/spongycastle/crypto/generators/DSAParametersGenerator;->inc([B)V

    .line 283
    invoke-static {v4, v10, v8, v3}, Lorg/spongycastle/crypto/generators/DSAParametersGenerator;->hash(Lorg/spongycastle/crypto/Digest;[B[BI)V

    .line 284
    array-length v12, v8

    sub-int/2addr v12, v0

    invoke-static {v8, v12, v7, v3, v0}, Ljava/lang/System;->arraycopy(Ljava/lang/Object;ILjava/lang/Object;II)V

    .line 287
    aget-byte v0, v7, v3

    or-int/lit8 v0, v0, -0x80

    int-to-byte v0, v0

    aput-byte v0, v7, v3

    .line 290
    new-instance v0, Ljava/math/BigInteger;

    invoke-direct {v0, v1, v7}, Ljava/math/BigInteger;-><init>(I[B)V

    .line 293
    invoke-virtual {v9, v1}, Ljava/math/BigInteger;->shiftLeft(I)Ljava/math/BigInteger;

    move-result-object v12

    invoke-virtual {v0, v12}, Ljava/math/BigInteger;->mod(Ljava/math/BigInteger;)Ljava/math/BigInteger;

    move-result-object v12

    .line 296
    sget-object v13, Lorg/spongycastle/crypto/generators/DSAParametersGenerator;->ONE:Ljava/math/BigInteger;

    invoke-virtual {v12, v13}, Ljava/math/BigInteger;->subtract(Ljava/math/BigInteger;)Ljava/math/BigInteger;

    move-result-object v12

    invoke-virtual {v0, v12}, Ljava/math/BigInteger;->subtract(Ljava/math/BigInteger;)Ljava/math/BigInteger;

    move-result-object v12

    .line 299
    invoke-virtual {v12}, Ljava/math/BigInteger;->bitLength()I

    move-result v0

    iget v13, p0, Lorg/spongycastle/crypto/generators/DSAParametersGenerator;->L:I

    if-ne v0, v13, :cond_cf

    .line 305
    invoke-direct {p0, v12}, Lorg/spongycastle/crypto/generators/DSAParametersGenerator;->isProbablePrime(Ljava/math/BigInteger;)Z

    move-result v0

    if-eqz v0, :cond_cf

    .line 309
    iget v0, p0, Lorg/spongycastle/crypto/generators/DSAParametersGenerator;->usageIndex:I

    if-ltz v0, :cond_be

    .line 311
    iget v0, p0, Lorg/spongycastle/crypto/generators/DSAParametersGenerator;->usageIndex:I

    invoke-static {v4, v12, v9, v5, v0}, Lorg/spongycastle/crypto/generators/DSAParametersGenerator;->calculateGenerator_FIPS186_3_Verifiable(Lorg/spongycastle/crypto/Digest;Ljava/math/BigInteger;Ljava/math/BigInteger;[BI)Ljava/math/BigInteger;

    move-result-object v1

    .line 312
    if-eqz v1, :cond_be

    .line 314
    new-instance v0, Lorg/spongycastle/crypto/params/DSAParameters;

    new-instance v3, Lorg/spongycastle/crypto/params/DSAValidationParameters;

    iget v4, p0, Lorg/spongycastle/crypto/generators/DSAParametersGenerator;->usageIndex:I

    invoke-direct {v3, v5, v2, v4}, Lorg/spongycastle/crypto/params/DSAValidationParameters;-><init>([BII)V

    invoke-direct {v0, v12, v9, v1, v3}, Lorg/spongycastle/crypto/params/DSAParameters;-><init>(Ljava/math/BigInteger;Ljava/math/BigInteger;Ljava/math/BigInteger;Lorg/spongycastle/crypto/params/DSAValidationParameters;)V

    .line 320
    :goto_bd
    return-object v0

    .line 318
    :cond_be
    iget-object v0, p0, Lorg/spongycastle/crypto/generators/DSAParametersGenerator;->random:Ljava/security/SecureRandom;

    invoke-static {v12, v9, v0}, Lorg/spongycastle/crypto/generators/DSAParametersGenerator;->calculateGenerator_FIPS186_3_Unverifiable(Ljava/math/BigInteger;Ljava/math/BigInteger;Ljava/security/SecureRandom;)Ljava/math/BigInteger;

    move-result-object v1

    .line 320
    new-instance v0, Lorg/spongycastle/crypto/params/DSAParameters;

    new-instance v3, Lorg/spongycastle/crypto/params/DSAValidationParameters;

    invoke-direct {v3, v5, v2}, Lorg/spongycastle/crypto/params/DSAValidationParameters;-><init>([BI)V

    invoke-direct {v0, v12, v9, v1, v3}, Lorg/spongycastle/crypto/params/DSAParameters;-><init>(Ljava/math/BigInteger;Ljava/math/BigInteger;Ljava/math/BigInteger;Lorg/spongycastle/crypto/params/DSAValidationParameters;)V

    goto :goto_bd

    .line 269
    :cond_cf
    add-int/lit8 v0, v2, 0x1

    move v2, v0

    goto :goto_58
.end method

.method private static getDefaultN(I)I
    .registers 2

    .prologue
    .line 385
    const/16 v0, 0x400

    if-le p0, v0, :cond_7

    const/16 v0, 0x100

    :goto_6
    return v0

    :cond_7
    const/16 v0, 0xa0

    goto :goto_6
.end method

.method private static getMinimumIterations(I)I
    .registers 2

    .prologue
    .line 391
    const/16 v0, 0x400

    if-gt p0, v0, :cond_7

    const/16 v0, 0x28

    :goto_6
    return v0

    :cond_7
    add-int/lit8 v0, p0, -0x1

    div-int/lit16 v0, v0, 0x400

    mul-int/lit8 v0, v0, 0x8

    add-int/lit8 v0, v0, 0x30

    goto :goto_6
.end method

.method private static hash(Lorg/spongycastle/crypto/Digest;[B[BI)V
    .registers 6

    .prologue
    .line 379
    const/4 v0, 0x0

    array-length v1, p1

    invoke-interface {p0, p1, v0, v1}, Lorg/spongycastle/crypto/Digest;->update([BII)V

    .line 380
    invoke-interface {p0, p2, p3}, Lorg/spongycastle/crypto/Digest;->doFinal([BI)I

    .line 381
    return-void
.end method

.method private static inc([B)V
    .registers 3

    .prologue
    .line 396
    array-length v0, p0

    add-int/lit8 v0, v0, -0x1

    :goto_3
    if-ltz v0, :cond_11

    .line 398
    aget-byte v1, p0, v0

    add-int/lit8 v1, v1, 0x1

    int-to-byte v1, v1

    .line 399
    aput-byte v1, p0, v0

    .line 401
    if-nez v1, :cond_11

    .line 396
    add-int/lit8 v0, v0, -0x1

    goto :goto_3

    .line 406
    :cond_11
    return-void
.end method

.method private isProbablePrime(Ljava/math/BigInteger;)Z
    .registers 3

    .prologue
    .line 339
    iget v0, p0, Lorg/spongycastle/crypto/generators/DSAParametersGenerator;->certainty:I

    invoke-virtual {p1, v0}, Ljava/math/BigInteger;->isProbablePrime(I)Z

    move-result v0

    return v0
.end method


# virtual methods
.method public generateParameters()Lorg/spongycastle/crypto/params/DSAParameters;
    .registers 2

    .prologue
    .line 115
    iget-boolean v0, p0, Lorg/spongycastle/crypto/generators/DSAParametersGenerator;->use186_3:Z

    if-eqz v0, :cond_9

    .line 116
    invoke-direct {p0}, Lorg/spongycastle/crypto/generators/DSAParametersGenerator;->generateParameters_FIPS186_3()Lorg/spongycastle/crypto/params/DSAParameters;

    move-result-object v0

    .line 117
    :goto_8
    return-object v0

    :cond_9
    invoke-direct {p0}, Lorg/spongycastle/crypto/generators/DSAParametersGenerator;->generateParameters_FIPS186_2()Lorg/spongycastle/crypto/params/DSAParameters;

    move-result-object v0

    goto :goto_8
.end method

.method public init(IILjava/security/SecureRandom;)V
    .registers 6

    .prologue
    .line 54
    iput p1, p0, Lorg/spongycastle/crypto/generators/DSAParametersGenerator;->L:I

    .line 55
    invoke-static {p1}, Lorg/spongycastle/crypto/generators/DSAParametersGenerator;->getDefaultN(I)I

    move-result v0

    iput v0, p0, Lorg/spongycastle/crypto/generators/DSAParametersGenerator;->N:I

    .line 56
    iput p2, p0, Lorg/spongycastle/crypto/generators/DSAParametersGenerator;->certainty:I

    .line 57
    iget v0, p0, Lorg/spongycastle/crypto/generators/DSAParametersGenerator;->L:I

    invoke-static {v0}, Lorg/spongycastle/crypto/generators/DSAParametersGenerator;->getMinimumIterations(I)I

    move-result v0

    add-int/lit8 v1, p2, 0x1

    div-int/lit8 v1, v1, 0x2

    invoke-static {v0, v1}, Ljava/lang/Math;->max(II)I

    move-result v0

    iput v0, p0, Lorg/spongycastle/crypto/generators/DSAParametersGenerator;->iterations:I

    .line 58
    iput-object p3, p0, Lorg/spongycastle/crypto/generators/DSAParametersGenerator;->random:Ljava/security/SecureRandom;

    .line 59
    const/4 v0, 0x0

    iput-boolean v0, p0, Lorg/spongycastle/crypto/generators/DSAParametersGenerator;->use186_3:Z

    .line 60
    const/4 v0, -0x1

    iput v0, p0, Lorg/spongycastle/crypto/generators/DSAParametersGenerator;->usageIndex:I

    .line 61
    return-void
.end method

.method public init(Lorg/spongycastle/crypto/params/DSAParameterGenerationParameters;)V
    .registers 8

    .prologue
    const/16 v5, 0xc00

    const/16 v4, 0x400

    const/16 v3, 0x100

    .line 74
    invoke-virtual {p1}, Lorg/spongycastle/crypto/params/DSAParameterGenerationParameters;->getL()I

    move-result v0

    invoke-virtual {p1}, Lorg/spongycastle/crypto/params/DSAParameterGenerationParameters;->getN()I

    move-result v1

    .line 76
    if-lt v0, v4, :cond_16

    if-gt v0, v5, :cond_16

    rem-int/lit16 v2, v0, 0x400

    if-eqz v2, :cond_1e

    .line 78
    :cond_16
    new-instance v0, Ljava/lang/IllegalArgumentException;

    const-string v1, "L values must be between 1024 and 3072 and a multiple of 1024"

    invoke-direct {v0, v1}, Ljava/lang/IllegalArgumentException;-><init>(Ljava/lang/String;)V

    throw v0

    .line 80
    :cond_1e
    if-ne v0, v4, :cond_2c

    const/16 v2, 0xa0

    if-eq v1, v2, :cond_2c

    .line 82
    new-instance v0, Ljava/lang/IllegalArgumentException;

    const-string v1, "N must be 160 for L = 1024"

    invoke-direct {v0, v1}, Ljava/lang/IllegalArgumentException;-><init>(Ljava/lang/String;)V

    throw v0

    .line 84
    :cond_2c
    const/16 v2, 0x800

    if-ne v0, v2, :cond_3e

    const/16 v2, 0xe0

    if-eq v1, v2, :cond_3e

    if-eq v1, v3, :cond_3e

    .line 86
    new-instance v0, Ljava/lang/IllegalArgumentException;

    const-string v1, "N must be 224 or 256 for L = 2048"

    invoke-direct {v0, v1}, Ljava/lang/IllegalArgumentException;-><init>(Ljava/lang/String;)V

    throw v0

    .line 88
    :cond_3e
    if-ne v0, v5, :cond_4a

    if-eq v1, v3, :cond_4a

    .line 90
    new-instance v0, Ljava/lang/IllegalArgumentException;

    const-string v1, "N must be 256 for L = 3072"

    invoke-direct {v0, v1}, Ljava/lang/IllegalArgumentException;-><init>(Ljava/lang/String;)V

    throw v0

    .line 93
    :cond_4a
    iget-object v2, p0, Lorg/spongycastle/crypto/generators/DSAParametersGenerator;->digest:Lorg/spongycastle/crypto/Digest;

    invoke-interface {v2}, Lorg/spongycastle/crypto/Digest;->getDigestSize()I

    move-result v2

    shl-int/lit8 v2, v2, 0x3

    if-ge v2, v1, :cond_5c

    .line 95
    new-instance v0, Ljava/lang/IllegalStateException;

    const-string v1, "Digest output size too small for value of N"

    invoke-direct {v0, v1}, Ljava/lang/IllegalStateException;-><init>(Ljava/lang/String;)V

    throw v0

    .line 98
    :cond_5c
    iput v0, p0, Lorg/spongycastle/crypto/generators/DSAParametersGenerator;->L:I

    .line 99
    iput v1, p0, Lorg/spongycastle/crypto/generators/DSAParametersGenerator;->N:I

    .line 100
    invoke-virtual {p1}, Lorg/spongycastle/crypto/params/DSAParameterGenerationParameters;->getCertainty()I

    move-result v1

    iput v1, p0, Lorg/spongycastle/crypto/generators/DSAParametersGenerator;->certainty:I

    .line 101
    invoke-static {v0}, Lorg/spongycastle/crypto/generators/DSAParametersGenerator;->getMinimumIterations(I)I

    move-result v0

    iget v1, p0, Lorg/spongycastle/crypto/generators/DSAParametersGenerator;->certainty:I

    add-int/lit8 v1, v1, 0x1

    div-int/lit8 v1, v1, 0x2

    invoke-static {v0, v1}, Ljava/lang/Math;->max(II)I

    move-result v0

    iput v0, p0, Lorg/spongycastle/crypto/generators/DSAParametersGenerator;->iterations:I

    .line 102
    invoke-virtual {p1}, Lorg/spongycastle/crypto/params/DSAParameterGenerationParameters;->getRandom()Ljava/security/SecureRandom;

    move-result-object v0

    iput-object v0, p0, Lorg/spongycastle/crypto/generators/DSAParametersGenerator;->random:Ljava/security/SecureRandom;

    .line 103
    const/4 v0, 0x1

    iput-boolean v0, p0, Lorg/spongycastle/crypto/generators/DSAParametersGenerator;->use186_3:Z

    .line 104
    invoke-virtual {p1}, Lorg/spongycastle/crypto/params/DSAParameterGenerationParameters;->getUsageIndex()I

    move-result v0

    iput v0, p0, Lorg/spongycastle/crypto/generators/DSAParametersGenerator;->usageIndex:I

    .line 105
    return-void
.end method