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