Primes.smali
.class public abstract Lorg/spongycastle/math/Primes;
.super Ljava/lang/Object;
.source "Primes.java"
# static fields
.field private static final ONE:Ljava/math/BigInteger;
.field public static final SMALL_FACTOR_LIMIT:I = 0xd3
.field private static final THREE:Ljava/math/BigInteger;
.field private static final TWO:Ljava/math/BigInteger;
# direct methods
.method static constructor <clinit>()V
.registers 2
.prologue
.line 17
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/math/Primes;->ONE:Ljava/math/BigInteger;
.line 18
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/math/Primes;->TWO:Ljava/math/BigInteger;
.line 19
const-wide/16 v0, 0x3
invoke-static {v0, v1}, Ljava/math/BigInteger;->valueOf(J)Ljava/math/BigInteger;
move-result-object v0
sput-object v0, Lorg/spongycastle/math/Primes;->THREE:Ljava/math/BigInteger;
return-void
.end method
.method public constructor <init>()V
.registers 1
.prologue
.line 13
invoke-direct {p0}, Ljava/lang/Object;-><init>()V
return-void
.end method
.method private static checkCandidate(Ljava/math/BigInteger;Ljava/lang/String;)V
.registers 5
.prologue
.line 356
if-eqz p0, :cond_f
invoke-virtual {p0}, Ljava/math/BigInteger;->signum()I
move-result v0
if-lez v0, :cond_f
invoke-virtual {p0}, Ljava/math/BigInteger;->bitLength()I
move-result v0
const/4 v1, 0x2
if-ge v0, v1, :cond_2a
.line 358
:cond_f
new-instance v0, Ljava/lang/IllegalArgumentException;
new-instance v1, Ljava/lang/StringBuilder;
const-string v2, "\'"
invoke-direct {v1, v2}, Ljava/lang/StringBuilder;-><init>(Ljava/lang/String;)V
invoke-virtual {v1, p1}, Ljava/lang/StringBuilder;->append(Ljava/lang/String;)Ljava/lang/StringBuilder;
move-result-object v1
const-string v2, "\' must be non-null and >= 2"
invoke-virtual {v1, v2}, Ljava/lang/StringBuilder;->append(Ljava/lang/String;)Ljava/lang/StringBuilder;
move-result-object v1
invoke-virtual {v1}, Ljava/lang/StringBuilder;->toString()Ljava/lang/String;
move-result-object v1
invoke-direct {v0, v1}, Ljava/lang/IllegalArgumentException;-><init>(Ljava/lang/String;)V
throw v0
.line 360
:cond_2a
return-void
.end method
.method public static enhancedMRProbablePrimeTest(Ljava/math/BigInteger;Ljava/security/SecureRandom;I)Lorg/spongycastle/math/Primes$MROutput;
.registers 14
.prologue
const/4 v3, 0x1
const/4 v4, 0x0
.line 152
const-string v0, "candidate"
invoke-static {p0, v0}, Lorg/spongycastle/math/Primes;->checkCandidate(Ljava/math/BigInteger;Ljava/lang/String;)V
.line 154
if-nez p1, :cond_11
.line 156
new-instance v0, Ljava/lang/IllegalArgumentException;
const-string v1, "\'random\' cannot be null"
invoke-direct {v0, v1}, Ljava/lang/IllegalArgumentException;-><init>(Ljava/lang/String;)V
throw v0
.line 158
:cond_11
if-gtz p2, :cond_1b
.line 160
new-instance v0, Ljava/lang/IllegalArgumentException;
const-string v1, "\'iterations\' must be > 0"
invoke-direct {v0, v1}, Ljava/lang/IllegalArgumentException;-><init>(Ljava/lang/String;)V
throw v0
.line 163
:cond_1b
invoke-virtual {p0}, Ljava/math/BigInteger;->bitLength()I
move-result v0
const/4 v1, 0x2
if-ne v0, v1, :cond_27
.line 165
# invokes: Lorg/spongycastle/math/Primes$MROutput;->probablyPrime()Lorg/spongycastle/math/Primes$MROutput;
invoke-static {}, Lorg/spongycastle/math/Primes$MROutput;->access$000()Lorg/spongycastle/math/Primes$MROutput;
move-result-object v0
.line 241
:goto_26
return-object v0
.line 167
:cond_27
invoke-virtual {p0, v4}, Ljava/math/BigInteger;->testBit(I)Z
move-result v0
if-nez v0, :cond_34
.line 169
sget-object v0, Lorg/spongycastle/math/Primes;->TWO:Ljava/math/BigInteger;
# invokes: Lorg/spongycastle/math/Primes$MROutput;->provablyCompositeWithFactor(Ljava/math/BigInteger;)Lorg/spongycastle/math/Primes$MROutput;
invoke-static {v0}, Lorg/spongycastle/math/Primes$MROutput;->access$100(Ljava/math/BigInteger;)Lorg/spongycastle/math/Primes$MROutput;
move-result-object v0
goto :goto_26
.line 173
:cond_34
sget-object v0, Lorg/spongycastle/math/Primes;->ONE:Ljava/math/BigInteger;
invoke-virtual {p0, v0}, Ljava/math/BigInteger;->subtract(Ljava/math/BigInteger;)Ljava/math/BigInteger;
move-result-object v6
.line 174
sget-object v0, Lorg/spongycastle/math/Primes;->TWO:Ljava/math/BigInteger;
invoke-virtual {p0, v0}, Ljava/math/BigInteger;->subtract(Ljava/math/BigInteger;)Ljava/math/BigInteger;
move-result-object v7
.line 176
invoke-virtual {v6}, Ljava/math/BigInteger;->getLowestSetBit()I
move-result v8
.line 177
invoke-virtual {v6, v8}, Ljava/math/BigInteger;->shiftRight(I)Ljava/math/BigInteger;
move-result-object v9
move v5, v4
.line 179
:goto_49
if-ge v5, p2, :cond_cd
.line 181
sget-object v0, Lorg/spongycastle/math/Primes;->TWO:Ljava/math/BigInteger;
invoke-static {v0, v7, p1}, Lorg/spongycastle/util/BigIntegers;->createRandomInRange(Ljava/math/BigInteger;Ljava/math/BigInteger;Ljava/security/SecureRandom;)Ljava/math/BigInteger;
move-result-object v0
.line 182
invoke-virtual {v0, p0}, Ljava/math/BigInteger;->gcd(Ljava/math/BigInteger;)Ljava/math/BigInteger;
move-result-object v1
.line 184
sget-object v2, Lorg/spongycastle/math/Primes;->ONE:Ljava/math/BigInteger;
invoke-virtual {v1, v2}, Ljava/math/BigInteger;->compareTo(Ljava/math/BigInteger;)I
move-result v2
if-lez v2, :cond_62
.line 186
# invokes: Lorg/spongycastle/math/Primes$MROutput;->provablyCompositeWithFactor(Ljava/math/BigInteger;)Lorg/spongycastle/math/Primes$MROutput;
invoke-static {v1}, Lorg/spongycastle/math/Primes$MROutput;->access$100(Ljava/math/BigInteger;)Lorg/spongycastle/math/Primes$MROutput;
move-result-object v0
goto :goto_26
.line 189
:cond_62
invoke-virtual {v0, v9, p0}, Ljava/math/BigInteger;->modPow(Ljava/math/BigInteger;Ljava/math/BigInteger;)Ljava/math/BigInteger;
move-result-object v0
.line 191
sget-object v1, Lorg/spongycastle/math/Primes;->ONE:Ljava/math/BigInteger;
invoke-virtual {v0, v1}, Ljava/math/BigInteger;->equals(Ljava/lang/Object;)Z
move-result v1
if-nez v1, :cond_c8
invoke-virtual {v0, v6}, Ljava/math/BigInteger;->equals(Ljava/lang/Object;)Z
move-result v1
if-nez v1, :cond_c8
move v2, v3
move-object v1, v0
.line 199
:goto_76
if-ge v2, v8, :cond_d5
.line 201
sget-object v10, Lorg/spongycastle/math/Primes;->TWO:Ljava/math/BigInteger;
invoke-virtual {v1, v10, p0}, Ljava/math/BigInteger;->modPow(Ljava/math/BigInteger;Ljava/math/BigInteger;)Ljava/math/BigInteger;
move-result-object v1
.line 203
invoke-virtual {v1, v6}, Ljava/math/BigInteger;->equals(Ljava/lang/Object;)Z
move-result v10
if-eqz v10, :cond_b5
move v2, v3
.line 217
:goto_85
if-nez v2, :cond_c8
.line 219
sget-object v2, Lorg/spongycastle/math/Primes;->ONE:Ljava/math/BigInteger;
invoke-virtual {v1, v2}, Ljava/math/BigInteger;->equals(Ljava/lang/Object;)Z
move-result v2
if-nez v2, :cond_9d
.line 222
sget-object v0, Lorg/spongycastle/math/Primes;->TWO:Ljava/math/BigInteger;
invoke-virtual {v1, v0, p0}, Ljava/math/BigInteger;->modPow(Ljava/math/BigInteger;Ljava/math/BigInteger;)Ljava/math/BigInteger;
move-result-object v0
.line 224
sget-object v2, Lorg/spongycastle/math/Primes;->ONE:Ljava/math/BigInteger;
invoke-virtual {v0, v2}, Ljava/math/BigInteger;->equals(Ljava/lang/Object;)Z
move-result v2
if-nez v2, :cond_d3
.line 230
:cond_9d
:goto_9d
sget-object v1, Lorg/spongycastle/math/Primes;->ONE:Ljava/math/BigInteger;
invoke-virtual {v0, v1}, Ljava/math/BigInteger;->subtract(Ljava/math/BigInteger;)Ljava/math/BigInteger;
move-result-object v0
invoke-virtual {v0, p0}, Ljava/math/BigInteger;->gcd(Ljava/math/BigInteger;)Ljava/math/BigInteger;
move-result-object v0
.line 232
sget-object v1, Lorg/spongycastle/math/Primes;->ONE:Ljava/math/BigInteger;
invoke-virtual {v0, v1}, Ljava/math/BigInteger;->compareTo(Ljava/math/BigInteger;)I
move-result v1
if-lez v1, :cond_c2
.line 234
# invokes: Lorg/spongycastle/math/Primes$MROutput;->provablyCompositeWithFactor(Ljava/math/BigInteger;)Lorg/spongycastle/math/Primes$MROutput;
invoke-static {v0}, Lorg/spongycastle/math/Primes$MROutput;->access$100(Ljava/math/BigInteger;)Lorg/spongycastle/math/Primes$MROutput;
move-result-object v0
goto/16 :goto_26
.line 209
:cond_b5
sget-object v10, Lorg/spongycastle/math/Primes;->ONE:Ljava/math/BigInteger;
invoke-virtual {v1, v10}, Ljava/math/BigInteger;->equals(Ljava/lang/Object;)Z
move-result v10
if-nez v10, :cond_d5
.line 199
add-int/lit8 v0, v2, 0x1
move v2, v0
move-object v0, v1
goto :goto_76
.line 237
:cond_c2
# invokes: Lorg/spongycastle/math/Primes$MROutput;->provablyCompositeNotPrimePower()Lorg/spongycastle/math/Primes$MROutput;
invoke-static {}, Lorg/spongycastle/math/Primes$MROutput;->access$200()Lorg/spongycastle/math/Primes$MROutput;
move-result-object v0
goto/16 :goto_26
.line 179
:cond_c8
add-int/lit8 v0, v5, 0x1
move v5, v0
goto/16 :goto_49
.line 241
:cond_cd
# invokes: Lorg/spongycastle/math/Primes$MROutput;->probablyPrime()Lorg/spongycastle/math/Primes$MROutput;
invoke-static {}, Lorg/spongycastle/math/Primes$MROutput;->access$000()Lorg/spongycastle/math/Primes$MROutput;
move-result-object v0
goto/16 :goto_26
:cond_d3
move-object v0, v1
goto :goto_9d
:cond_d5
move v2, v4
goto :goto_85
.end method
.method private static extract32([B)I
.registers 6
.prologue
const/4 v0, 0x0
.line 585
.line 587
const/4 v1, 0x4
array-length v2, p0
invoke-static {v1, v2}, Ljava/lang/Math;->min(II)I
move-result v2
move v1, v0
.line 588
:goto_8
if-ge v0, v2, :cond_19
.line 590
array-length v3, p0
add-int/lit8 v4, v0, 0x1
sub-int/2addr v3, v4
aget-byte v3, p0, v3
and-int/lit16 v3, v3, 0xff
.line 591
shl-int/lit8 v4, v0, 0x3
shl-int/2addr v3, v4
or-int/2addr v1, v3
.line 588
add-int/lit8 v0, v0, 0x1
goto :goto_8
.line 594
:cond_19
return v1
.end method
.method public static generateSTRandomPrime(Lorg/spongycastle/crypto/Digest;I[B)Lorg/spongycastle/math/Primes$STOutput;
.registers 5
.prologue
.line 118
if-nez p0, :cond_a
.line 120
new-instance v0, Ljava/lang/IllegalArgumentException;
const-string v1, "\'hash\' cannot be null"
invoke-direct {v0, v1}, Ljava/lang/IllegalArgumentException;-><init>(Ljava/lang/String;)V
throw v0
.line 122
:cond_a
const/4 v0, 0x2
if-ge p1, v0, :cond_15
.line 124
new-instance v0, Ljava/lang/IllegalArgumentException;
const-string v1, "\'length\' must be >= 2"
invoke-direct {v0, v1}, Ljava/lang/IllegalArgumentException;-><init>(Ljava/lang/String;)V
throw v0
.line 126
:cond_15
if-eqz p2, :cond_1a
array-length v0, p2
if-nez v0, :cond_22
.line 128
:cond_1a
new-instance v0, Ljava/lang/IllegalArgumentException;
const-string v1, "\'inputSeed\' cannot be null or empty"
invoke-direct {v0, v1}, Ljava/lang/IllegalArgumentException;-><init>(Ljava/lang/String;)V
throw v0
.line 131
:cond_22
invoke-static {p2}, Lorg/spongycastle/util/Arrays;->clone([B)[B
move-result-object v0
invoke-static {p0, p1, v0}, Lorg/spongycastle/math/Primes;->implSTRandomPrime(Lorg/spongycastle/crypto/Digest;I[B)Lorg/spongycastle/math/Primes$STOutput;
move-result-object v0
return-object v0
.end method
.method public static hasAnySmallFactors(Ljava/math/BigInteger;)Z
.registers 2
.prologue
.line 255
const-string v0, "candidate"
invoke-static {p0, v0}, Lorg/spongycastle/math/Primes;->checkCandidate(Ljava/math/BigInteger;Ljava/lang/String;)V
.line 257
invoke-static {p0}, Lorg/spongycastle/math/Primes;->implHasAnySmallFactors(Ljava/math/BigInteger;)Z
move-result v0
return v0
.end method
.method private static hash(Lorg/spongycastle/crypto/Digest;[B[BI)V
.registers 6
.prologue
.line 599
const/4 v0, 0x0
array-length v1, p1
invoke-interface {p0, p1, v0, v1}, Lorg/spongycastle/crypto/Digest;->update([BII)V
.line 600
invoke-interface {p0, p2, p3}, Lorg/spongycastle/crypto/Digest;->doFinal([BI)I
.line 601
return-void
.end method
.method private static hashGen(Lorg/spongycastle/crypto/Digest;[BI)Ljava/math/BigInteger;
.registers 8
.prologue
const/4 v4, 0x1
.line 605
invoke-interface {p0}, Lorg/spongycastle/crypto/Digest;->getDigestSize()I
move-result v2
.line 606
mul-int v1, p2, v2
.line 607
new-array v3, v1, [B
.line 608
const/4 v0, 0x0
:goto_a
if-ge v0, p2, :cond_16
.line 610
sub-int/2addr v1, v2
.line 611
invoke-static {p0, p1, v3, v1}, Lorg/spongycastle/math/Primes;->hash(Lorg/spongycastle/crypto/Digest;[B[BI)V
.line 612
invoke-static {p1, v4}, Lorg/spongycastle/math/Primes;->inc([BI)V
.line 608
add-int/lit8 v0, v0, 0x1
goto :goto_a
.line 614
:cond_16
new-instance v0, Ljava/math/BigInteger;
invoke-direct {v0, v4, v3}, Ljava/math/BigInteger;-><init>(I[B)V
return-object v0
.end method
.method private static implHasAnySmallFactors(Ljava/math/BigInteger;)Z
.registers 5
.prologue
const/4 v0, 0x1
.line 368
const-wide/32 v2, 0xd4c2086
invoke-static {v2, v3}, Ljava/math/BigInteger;->valueOf(J)Ljava/math/BigInteger;
move-result-object v1
invoke-virtual {p0, v1}, Ljava/math/BigInteger;->mod(Ljava/math/BigInteger;)Ljava/math/BigInteger;
move-result-object v1
invoke-virtual {v1}, Ljava/math/BigInteger;->intValue()I
move-result v1
.line 369
rem-int/lit8 v2, v1, 0x2
if-eqz v2, :cond_34
rem-int/lit8 v2, v1, 0x3
if-eqz v2, :cond_34
rem-int/lit8 v2, v1, 0x5
if-eqz v2, :cond_34
rem-int/lit8 v2, v1, 0x7
if-eqz v2, :cond_34
rem-int/lit8 v2, v1, 0xb
if-eqz v2, :cond_34
rem-int/lit8 v2, v1, 0xd
if-eqz v2, :cond_34
rem-int/lit8 v2, v1, 0x11
if-eqz v2, :cond_34
rem-int/lit8 v2, v1, 0x13
if-eqz v2, :cond_34
rem-int/lit8 v1, v1, 0x17
if-nez v1, :cond_35
.line 442
:cond_34
:goto_34
return v0
.line 376
:cond_35
const-wide/32 v2, 0x37ed0ed
invoke-static {v2, v3}, Ljava/math/BigInteger;->valueOf(J)Ljava/math/BigInteger;
move-result-object v1
invoke-virtual {p0, v1}, Ljava/math/BigInteger;->mod(Ljava/math/BigInteger;)Ljava/math/BigInteger;
move-result-object v1
invoke-virtual {v1}, Ljava/math/BigInteger;->intValue()I
move-result v1
.line 377
rem-int/lit8 v2, v1, 0x1d
if-eqz v2, :cond_34
rem-int/lit8 v2, v1, 0x1f
if-eqz v2, :cond_34
rem-int/lit8 v2, v1, 0x25
if-eqz v2, :cond_34
rem-int/lit8 v2, v1, 0x29
if-eqz v2, :cond_34
rem-int/lit8 v1, v1, 0x2b
if-eqz v1, :cond_34
.line 383
const-wide/32 v2, 0x23cd611f
invoke-static {v2, v3}, Ljava/math/BigInteger;->valueOf(J)Ljava/math/BigInteger;
move-result-object v1
invoke-virtual {p0, v1}, Ljava/math/BigInteger;->mod(Ljava/math/BigInteger;)Ljava/math/BigInteger;
move-result-object v1
invoke-virtual {v1}, Ljava/math/BigInteger;->intValue()I
move-result v1
.line 384
rem-int/lit8 v2, v1, 0x2f
if-eqz v2, :cond_34
rem-int/lit8 v2, v1, 0x35
if-eqz v2, :cond_34
rem-int/lit8 v2, v1, 0x3b
if-eqz v2, :cond_34
rem-int/lit8 v2, v1, 0x3d
if-eqz v2, :cond_34
rem-int/lit8 v1, v1, 0x43
if-eqz v1, :cond_34
.line 390
const-wide/32 v2, 0x20691a3
invoke-static {v2, v3}, Ljava/math/BigInteger;->valueOf(J)Ljava/math/BigInteger;
move-result-object v1
invoke-virtual {p0, v1}, Ljava/math/BigInteger;->mod(Ljava/math/BigInteger;)Ljava/math/BigInteger;
move-result-object v1
invoke-virtual {v1}, Ljava/math/BigInteger;->intValue()I
move-result v1
.line 391
rem-int/lit8 v2, v1, 0x47
if-eqz v2, :cond_34
rem-int/lit8 v2, v1, 0x49
if-eqz v2, :cond_34
rem-int/lit8 v2, v1, 0x4f
if-eqz v2, :cond_34
rem-int/lit8 v1, v1, 0x53
if-eqz v1, :cond_34
.line 397
const-wide/32 v2, 0x55a60cb
invoke-static {v2, v3}, Ljava/math/BigInteger;->valueOf(J)Ljava/math/BigInteger;
move-result-object v1
invoke-virtual {p0, v1}, Ljava/math/BigInteger;->mod(Ljava/math/BigInteger;)Ljava/math/BigInteger;
move-result-object v1
invoke-virtual {v1}, Ljava/math/BigInteger;->intValue()I
move-result v1
.line 398
rem-int/lit8 v2, v1, 0x59
if-eqz v2, :cond_34
rem-int/lit8 v2, v1, 0x61
if-eqz v2, :cond_34
rem-int/lit8 v2, v1, 0x65
if-eqz v2, :cond_34
rem-int/lit8 v1, v1, 0x67
if-eqz v1, :cond_34
.line 404
const-wide/32 v2, 0x9f9f361
invoke-static {v2, v3}, Ljava/math/BigInteger;->valueOf(J)Ljava/math/BigInteger;
move-result-object v1
invoke-virtual {p0, v1}, Ljava/math/BigInteger;->mod(Ljava/math/BigInteger;)Ljava/math/BigInteger;
move-result-object v1
invoke-virtual {v1}, Ljava/math/BigInteger;->intValue()I
move-result v1
.line 405
rem-int/lit8 v2, v1, 0x6b
if-eqz v2, :cond_34
rem-int/lit8 v2, v1, 0x6d
if-eqz v2, :cond_34
rem-int/lit8 v2, v1, 0x71
if-eqz v2, :cond_34
rem-int/lit8 v1, v1, 0x7f
if-eqz v1, :cond_34
.line 411
const-wide/32 v2, 0x1627b25d
invoke-static {v2, v3}, Ljava/math/BigInteger;->valueOf(J)Ljava/math/BigInteger;
move-result-object v1
invoke-virtual {p0, v1}, Ljava/math/BigInteger;->mod(Ljava/math/BigInteger;)Ljava/math/BigInteger;
move-result-object v1
invoke-virtual {v1}, Ljava/math/BigInteger;->intValue()I
move-result v1
.line 412
rem-int/lit16 v2, v1, 0x83
if-eqz v2, :cond_34
rem-int/lit16 v2, v1, 0x89
if-eqz v2, :cond_34
rem-int/lit16 v2, v1, 0x8b
if-eqz v2, :cond_34
rem-int/lit16 v1, v1, 0x95
if-eqz v1, :cond_34
.line 418
const-wide/32 v2, 0x2676ed77
invoke-static {v2, v3}, Ljava/math/BigInteger;->valueOf(J)Ljava/math/BigInteger;
move-result-object v1
invoke-virtual {p0, v1}, Ljava/math/BigInteger;->mod(Ljava/math/BigInteger;)Ljava/math/BigInteger;
move-result-object v1
invoke-virtual {v1}, Ljava/math/BigInteger;->intValue()I
move-result v1
.line 419
rem-int/lit16 v2, v1, 0x97
if-eqz v2, :cond_34
rem-int/lit16 v2, v1, 0x9d
if-eqz v2, :cond_34
rem-int/lit16 v2, v1, 0xa3
if-eqz v2, :cond_34
rem-int/lit16 v1, v1, 0xa7
if-eqz v1, :cond_34
.line 425
const-wide/32 v2, 0x3fcf739d
invoke-static {v2, v3}, Ljava/math/BigInteger;->valueOf(J)Ljava/math/BigInteger;
move-result-object v1
invoke-virtual {p0, v1}, Ljava/math/BigInteger;->mod(Ljava/math/BigInteger;)Ljava/math/BigInteger;
move-result-object v1
invoke-virtual {v1}, Ljava/math/BigInteger;->intValue()I
move-result v1
.line 426
rem-int/lit16 v2, v1, 0xad
if-eqz v2, :cond_34
rem-int/lit16 v2, v1, 0xb3
if-eqz v2, :cond_34
rem-int/lit16 v2, v1, 0xb5
if-eqz v2, :cond_34
rem-int/lit16 v1, v1, 0xbf
if-eqz v1, :cond_34
.line 432
const-wide/32 v2, 0x5f281a99
invoke-static {v2, v3}, Ljava/math/BigInteger;->valueOf(J)Ljava/math/BigInteger;
move-result-object v1
invoke-virtual {p0, v1}, Ljava/math/BigInteger;->mod(Ljava/math/BigInteger;)Ljava/math/BigInteger;
move-result-object v1
invoke-virtual {v1}, Ljava/math/BigInteger;->intValue()I
move-result v1
.line 433
rem-int/lit16 v2, v1, 0xc1
if-eqz v2, :cond_34
rem-int/lit16 v2, v1, 0xc5
if-eqz v2, :cond_34
rem-int/lit16 v2, v1, 0xc7
if-eqz v2, :cond_34
rem-int/lit16 v1, v1, 0xd3
if-eqz v1, :cond_34
.line 442
const/4 v0, 0x0
goto/16 :goto_34
.end method
.method private static implMRProbablePrimeToBase(Ljava/math/BigInteger;Ljava/math/BigInteger;Ljava/math/BigInteger;ILjava/math/BigInteger;)Z
.registers 10
.prologue
const/4 v1, 0x0
const/4 v0, 0x1
.line 447
invoke-virtual {p4, p2, p0}, Ljava/math/BigInteger;->modPow(Ljava/math/BigInteger;Ljava/math/BigInteger;)Ljava/math/BigInteger;
move-result-object v2
.line 449
sget-object v3, Lorg/spongycastle/math/Primes;->ONE:Ljava/math/BigInteger;
invoke-virtual {v2, v3}, Ljava/math/BigInteger;->equals(Ljava/lang/Object;)Z
move-result v3
if-nez v3, :cond_14
invoke-virtual {v2, p1}, Ljava/math/BigInteger;->equals(Ljava/lang/Object;)Z
move-result v3
if-eqz v3, :cond_15
.line 472
:cond_14
:goto_14
return v0
:cond_15
move-object v3, v2
move v2, v0
.line 456
:goto_17
if-ge v2, p3, :cond_32
.line 458
sget-object v4, Lorg/spongycastle/math/Primes;->TWO:Ljava/math/BigInteger;
invoke-virtual {v3, v4, p0}, Ljava/math/BigInteger;->modPow(Ljava/math/BigInteger;Ljava/math/BigInteger;)Ljava/math/BigInteger;
move-result-object v3
.line 460
invoke-virtual {v3, p1}, Ljava/math/BigInteger;->equals(Ljava/lang/Object;)Z
move-result v4
if-nez v4, :cond_14
.line 466
sget-object v4, Lorg/spongycastle/math/Primes;->ONE:Ljava/math/BigInteger;
invoke-virtual {v3, v4}, Ljava/math/BigInteger;->equals(Ljava/lang/Object;)Z
move-result v4
if-eqz v4, :cond_2f
move v0, v1
.line 468
goto :goto_14
.line 456
:cond_2f
add-int/lit8 v2, v2, 0x1
goto :goto_17
:cond_32
move v0, v1
goto :goto_14
.end method
.method private static implSTRandomPrime(Lorg/spongycastle/crypto/Digest;I[B)Lorg/spongycastle/math/Primes$STOutput;
.registers 15
.prologue
.line 477
invoke-interface {p0}, Lorg/spongycastle/crypto/Digest;->getDigestSize()I
move-result v1
.line 479
const/16 v0, 0x21
if-ge p1, v0, :cond_59
.line 481
const/4 v0, 0x0
.line 483
new-array v2, v1, [B
.line 484
new-array v1, v1, [B
.line 488
:cond_d
const/4 v3, 0x0
invoke-static {p0, p2, v2, v3}, Lorg/spongycastle/math/Primes;->hash(Lorg/spongycastle/crypto/Digest;[B[BI)V
.line 489
const/4 v3, 0x1
invoke-static {p2, v3}, Lorg/spongycastle/math/Primes;->inc([BI)V
.line 491
const/4 v3, 0x0
invoke-static {p0, p2, v1, v3}, Lorg/spongycastle/math/Primes;->hash(Lorg/spongycastle/crypto/Digest;[B[BI)V
.line 492
const/4 v3, 0x1
invoke-static {p2, v3}, Lorg/spongycastle/math/Primes;->inc([BI)V
.line 494
invoke-static {v2}, Lorg/spongycastle/math/Primes;->extract32([B)I
move-result v3
invoke-static {v1}, Lorg/spongycastle/math/Primes;->extract32([B)I
move-result v4
xor-int/2addr v3, v4
.line 495
const/4 v4, -0x1
rsub-int/lit8 v5, p1, 0x20
ushr-int/2addr v4, v5
and-int/2addr v3, v4
.line 496
const/4 v4, 0x1
add-int/lit8 v5, p1, -0x1
shl-int/2addr v4, v5
or-int/lit8 v4, v4, 0x1
or-int/2addr v3, v4
.line 498
add-int/lit8 v0, v0, 0x1
.line 500
int-to-long v4, v3
const-wide v6, 0xffffffffL
and-long/2addr v4, v6
.line 501
invoke-static {v4, v5}, Lorg/spongycastle/math/Primes;->isPrime32(J)Z
move-result v3
if-eqz v3, :cond_4d
.line 503
new-instance v1, Lorg/spongycastle/math/Primes$STOutput;
invoke-static {v4, v5}, Ljava/math/BigInteger;->valueOf(J)Ljava/math/BigInteger;
move-result-object v2
const/4 v3, 0x0
invoke-direct {v1, v2, p2, v0, v3}, Lorg/spongycastle/math/Primes$STOutput;-><init>(Ljava/math/BigInteger;[BILorg/spongycastle/math/Primes$1;)V
move-object v0, v1
.line 565
:goto_4c
return-object v0
.line 506
:cond_4d
mul-int/lit8 v3, p1, 0x4
if-le v0, v3, :cond_d
.line 508
new-instance v0, Ljava/lang/IllegalStateException;
const-string v1, "Too many iterations in Shawe-Taylor Random_Prime Routine"
invoke-direct {v0, v1}, Ljava/lang/IllegalStateException;-><init>(Ljava/lang/String;)V
throw v0
.line 513
:cond_59
add-int/lit8 v0, p1, 0x3
div-int/lit8 v0, v0, 0x2
invoke-static {p0, v0, p2}, Lorg/spongycastle/math/Primes;->implSTRandomPrime(Lorg/spongycastle/crypto/Digest;I[B)Lorg/spongycastle/math/Primes$STOutput;
move-result-object v0
.line 515
invoke-virtual {v0}, Lorg/spongycastle/math/Primes$STOutput;->getPrime()Ljava/math/BigInteger;
move-result-object v5
.line 516
invoke-virtual {v0}, Lorg/spongycastle/math/Primes$STOutput;->getPrimeSeed()[B
move-result-object v6
.line 517
invoke-virtual {v0}, Lorg/spongycastle/math/Primes$STOutput;->getPrimeGenCounter()I
move-result v3
.line 519
shl-int/lit8 v0, v1, 0x3
.line 520
add-int/lit8 v1, p1, -0x1
div-int v7, v1, v0
.line 524
add-int/lit8 v0, v7, 0x1
invoke-static {p0, v6, v0}, Lorg/spongycastle/math/Primes;->hashGen(Lorg/spongycastle/crypto/Digest;[BI)Ljava/math/BigInteger;
move-result-object v0
.line 525
sget-object v1, Lorg/spongycastle/math/Primes;->ONE:Ljava/math/BigInteger;
add-int/lit8 v2, p1, -0x1
invoke-virtual {v1, v2}, Ljava/math/BigInteger;->shiftLeft(I)Ljava/math/BigInteger;
move-result-object v1
invoke-virtual {v0, v1}, Ljava/math/BigInteger;->mod(Ljava/math/BigInteger;)Ljava/math/BigInteger;
move-result-object v0
add-int/lit8 v1, p1, -0x1
invoke-virtual {v0, v1}, Ljava/math/BigInteger;->setBit(I)Ljava/math/BigInteger;
move-result-object v0
.line 527
const/4 v1, 0x1
invoke-virtual {v5, v1}, Ljava/math/BigInteger;->shiftLeft(I)Ljava/math/BigInteger;
move-result-object v8
.line 528
sget-object v1, Lorg/spongycastle/math/Primes;->ONE:Ljava/math/BigInteger;
invoke-virtual {v0, v1}, Ljava/math/BigInteger;->subtract(Ljava/math/BigInteger;)Ljava/math/BigInteger;
move-result-object v0
invoke-virtual {v0, v8}, Ljava/math/BigInteger;->divide(Ljava/math/BigInteger;)Ljava/math/BigInteger;
move-result-object v0
sget-object v1, Lorg/spongycastle/math/Primes;->ONE:Ljava/math/BigInteger;
invoke-virtual {v0, v1}, Ljava/math/BigInteger;->add(Ljava/math/BigInteger;)Ljava/math/BigInteger;
move-result-object v0
const/4 v1, 0x1
invoke-virtual {v0, v1}, Ljava/math/BigInteger;->shiftLeft(I)Ljava/math/BigInteger;
move-result-object v2
.line 529
const/4 v1, 0x0
.line 531
invoke-virtual {v2, v5}, Ljava/math/BigInteger;->multiply(Ljava/math/BigInteger;)Ljava/math/BigInteger;
move-result-object v0
sget-object v4, Lorg/spongycastle/math/Primes;->ONE:Ljava/math/BigInteger;
invoke-virtual {v0, v4}, Ljava/math/BigInteger;->add(Ljava/math/BigInteger;)Ljava/math/BigInteger;
move-result-object v0
move-object v4, v2
move v2, v3
.line 539
:goto_b2
invoke-virtual {v0}, Ljava/math/BigInteger;->bitLength()I
move-result v9
if-le v9, p1, :cond_df
.line 541
sget-object v0, Lorg/spongycastle/math/Primes;->ONE:Ljava/math/BigInteger;
add-int/lit8 v4, p1, -0x1
invoke-virtual {v0, v4}, Ljava/math/BigInteger;->shiftLeft(I)Ljava/math/BigInteger;
move-result-object v0
sget-object v4, Lorg/spongycastle/math/Primes;->ONE:Ljava/math/BigInteger;
invoke-virtual {v0, v4}, Ljava/math/BigInteger;->subtract(Ljava/math/BigInteger;)Ljava/math/BigInteger;
move-result-object v0
invoke-virtual {v0, v8}, Ljava/math/BigInteger;->divide(Ljava/math/BigInteger;)Ljava/math/BigInteger;
move-result-object v0
sget-object v4, Lorg/spongycastle/math/Primes;->ONE:Ljava/math/BigInteger;
invoke-virtual {v0, v4}, Ljava/math/BigInteger;->add(Ljava/math/BigInteger;)Ljava/math/BigInteger;
move-result-object v0
const/4 v4, 0x1
invoke-virtual {v0, v4}, Ljava/math/BigInteger;->shiftLeft(I)Ljava/math/BigInteger;
move-result-object v4
.line 542
invoke-virtual {v4, v5}, Ljava/math/BigInteger;->multiply(Ljava/math/BigInteger;)Ljava/math/BigInteger;
move-result-object v0
sget-object v9, Lorg/spongycastle/math/Primes;->ONE:Ljava/math/BigInteger;
invoke-virtual {v0, v9}, Ljava/math/BigInteger;->add(Ljava/math/BigInteger;)Ljava/math/BigInteger;
move-result-object v0
.line 545
:cond_df
add-int/lit8 v2, v2, 0x1
.line 553
invoke-static {v0}, Lorg/spongycastle/math/Primes;->implHasAnySmallFactors(Ljava/math/BigInteger;)Z
move-result v9
if-nez v9, :cond_132
.line 555
add-int/lit8 v9, v7, 0x1
invoke-static {p0, v6, v9}, Lorg/spongycastle/math/Primes;->hashGen(Lorg/spongycastle/crypto/Digest;[BI)Ljava/math/BigInteger;
move-result-object v9
.line 556
sget-object v10, Lorg/spongycastle/math/Primes;->THREE:Ljava/math/BigInteger;
invoke-virtual {v0, v10}, Ljava/math/BigInteger;->subtract(Ljava/math/BigInteger;)Ljava/math/BigInteger;
move-result-object v10
invoke-virtual {v9, v10}, Ljava/math/BigInteger;->mod(Ljava/math/BigInteger;)Ljava/math/BigInteger;
move-result-object v9
sget-object v10, Lorg/spongycastle/math/Primes;->TWO:Ljava/math/BigInteger;
invoke-virtual {v9, v10}, Ljava/math/BigInteger;->add(Ljava/math/BigInteger;)Ljava/math/BigInteger;
move-result-object v9
.line 558
int-to-long v10, v1
invoke-static {v10, v11}, Ljava/math/BigInteger;->valueOf(J)Ljava/math/BigInteger;
move-result-object v1
invoke-virtual {v4, v1}, Ljava/math/BigInteger;->add(Ljava/math/BigInteger;)Ljava/math/BigInteger;
move-result-object v4
.line 559
const/4 v1, 0x0
.line 561
invoke-virtual {v9, v4, v0}, Ljava/math/BigInteger;->modPow(Ljava/math/BigInteger;Ljava/math/BigInteger;)Ljava/math/BigInteger;
move-result-object v9
.line 563
sget-object v10, Lorg/spongycastle/math/Primes;->ONE:Ljava/math/BigInteger;
invoke-virtual {v9, v10}, Ljava/math/BigInteger;->subtract(Ljava/math/BigInteger;)Ljava/math/BigInteger;
move-result-object v10
invoke-virtual {v0, v10}, Ljava/math/BigInteger;->gcd(Ljava/math/BigInteger;)Ljava/math/BigInteger;
move-result-object v10
sget-object v11, Lorg/spongycastle/math/Primes;->ONE:Ljava/math/BigInteger;
invoke-virtual {v10, v11}, Ljava/math/BigInteger;->equals(Ljava/lang/Object;)Z
move-result v10
if-eqz v10, :cond_137
invoke-virtual {v9, v5, v0}, Ljava/math/BigInteger;->modPow(Ljava/math/BigInteger;Ljava/math/BigInteger;)Ljava/math/BigInteger;
move-result-object v9
sget-object v10, Lorg/spongycastle/math/Primes;->ONE:Ljava/math/BigInteger;
invoke-virtual {v9, v10}, Ljava/math/BigInteger;->equals(Ljava/lang/Object;)Z
move-result v9
if-eqz v9, :cond_137
.line 565
new-instance v1, Lorg/spongycastle/math/Primes$STOutput;
const/4 v3, 0x0
invoke-direct {v1, v0, v6, v2, v3}, Lorg/spongycastle/math/Primes$STOutput;-><init>(Ljava/math/BigInteger;[BILorg/spongycastle/math/Primes$1;)V
move-object v0, v1
goto/16 :goto_4c
.line 570
:cond_132
add-int/lit8 v9, v7, 0x1
invoke-static {v6, v9}, Lorg/spongycastle/math/Primes;->inc([BI)V
.line 573
:cond_137
mul-int/lit8 v9, p1, 0x4
add-int/2addr v9, v3
if-lt v2, v9, :cond_144
.line 575
new-instance v0, Ljava/lang/IllegalStateException;
const-string v1, "Too many iterations in Shawe-Taylor Random_Prime Routine"
invoke-direct {v0, v1}, Ljava/lang/IllegalStateException;-><init>(Ljava/lang/String;)V
throw v0
.line 578
:cond_144
add-int/lit8 v1, v1, 0x2
.line 579
invoke-virtual {v0, v8}, Ljava/math/BigInteger;->add(Ljava/math/BigInteger;)Ljava/math/BigInteger;
move-result-object v0
goto/16 :goto_b2
.end method
.method private static inc([BI)V
.registers 5
.prologue
.line 619
array-length v0, p0
.line 620
:goto_1
if-lez p1, :cond_12
add-int/lit8 v0, v0, -0x1
if-ltz v0, :cond_12
.line 622
aget-byte v1, p0, v0
and-int/lit16 v1, v1, 0xff
add-int/2addr v1, p1
.line 623
int-to-byte v2, v1
aput-byte v2, p0, v0
.line 624
ushr-int/lit8 p1, v1, 0x8
goto :goto_1
.line 626
:cond_12
return-void
.end method
.method public static isMRProbablePrime(Ljava/math/BigInteger;Ljava/security/SecureRandom;I)Z
.registers 11
.prologue
const/4 v0, 0x1
const/4 v1, 0x0
.line 278
const-string v2, "candidate"
invoke-static {p0, v2}, Lorg/spongycastle/math/Primes;->checkCandidate(Ljava/math/BigInteger;Ljava/lang/String;)V
.line 280
if-nez p1, :cond_11
.line 282
new-instance v0, Ljava/lang/IllegalArgumentException;
const-string v1, "\'random\' cannot be null"
invoke-direct {v0, v1}, Ljava/lang/IllegalArgumentException;-><init>(Ljava/lang/String;)V
throw v0
.line 284
:cond_11
if-gtz p2, :cond_1b
.line 286
new-instance v0, Ljava/lang/IllegalArgumentException;
const-string v1, "\'iterations\' must be > 0"
invoke-direct {v0, v1}, Ljava/lang/IllegalArgumentException;-><init>(Ljava/lang/String;)V
throw v0
.line 289
:cond_1b
invoke-virtual {p0}, Ljava/math/BigInteger;->bitLength()I
move-result v2
const/4 v3, 0x2
if-ne v2, v3, :cond_23
.line 315
:cond_22
:goto_22
return v0
.line 293
:cond_23
invoke-virtual {p0, v1}, Ljava/math/BigInteger;->testBit(I)Z
move-result v2
if-nez v2, :cond_2b
move v0, v1
.line 295
goto :goto_22
.line 299
:cond_2b
sget-object v2, Lorg/spongycastle/math/Primes;->ONE:Ljava/math/BigInteger;
invoke-virtual {p0, v2}, Ljava/math/BigInteger;->subtract(Ljava/math/BigInteger;)Ljava/math/BigInteger;
move-result-object v3
.line 300
sget-object v2, Lorg/spongycastle/math/Primes;->TWO:Ljava/math/BigInteger;
invoke-virtual {p0, v2}, Ljava/math/BigInteger;->subtract(Ljava/math/BigInteger;)Ljava/math/BigInteger;
move-result-object v4
.line 302
invoke-virtual {v3}, Ljava/math/BigInteger;->getLowestSetBit()I
move-result v5
.line 303
invoke-virtual {v3, v5}, Ljava/math/BigInteger;->shiftRight(I)Ljava/math/BigInteger;
move-result-object v6
move v2, v1
.line 305
:goto_40
if-ge v2, p2, :cond_22
.line 307
sget-object v7, Lorg/spongycastle/math/Primes;->TWO:Ljava/math/BigInteger;
invoke-static {v7, v4, p1}, Lorg/spongycastle/util/BigIntegers;->createRandomInRange(Ljava/math/BigInteger;Ljava/math/BigInteger;Ljava/security/SecureRandom;)Ljava/math/BigInteger;
move-result-object v7
.line 309
invoke-static {p0, v3, v6, v5, v7}, Lorg/spongycastle/math/Primes;->implMRProbablePrimeToBase(Ljava/math/BigInteger;Ljava/math/BigInteger;Ljava/math/BigInteger;ILjava/math/BigInteger;)Z
move-result v7
if-nez v7, :cond_50
move v0, v1
.line 311
goto :goto_22
.line 305
:cond_50
add-int/lit8 v2, v2, 0x1
goto :goto_40
.end method
.method public static isMRProbablePrimeToBase(Ljava/math/BigInteger;Ljava/math/BigInteger;)Z
.registers 5
.prologue
.line 332
const-string v0, "candidate"
invoke-static {p0, v0}, Lorg/spongycastle/math/Primes;->checkCandidate(Ljava/math/BigInteger;Ljava/lang/String;)V
.line 333
const-string v0, "base"
invoke-static {p1, v0}, Lorg/spongycastle/math/Primes;->checkCandidate(Ljava/math/BigInteger;Ljava/lang/String;)V
.line 335
sget-object v0, Lorg/spongycastle/math/Primes;->ONE:Ljava/math/BigInteger;
invoke-virtual {p0, v0}, Ljava/math/BigInteger;->subtract(Ljava/math/BigInteger;)Ljava/math/BigInteger;
move-result-object v0
invoke-virtual {p1, v0}, Ljava/math/BigInteger;->compareTo(Ljava/math/BigInteger;)I
move-result v0
if-ltz v0, :cond_1e
.line 337
new-instance v0, Ljava/lang/IllegalArgumentException;
const-string v1, "\'base\' must be < (\'candidate\' - 1)"
invoke-direct {v0, v1}, Ljava/lang/IllegalArgumentException;-><init>(Ljava/lang/String;)V
throw v0
.line 340
:cond_1e
invoke-virtual {p0}, Ljava/math/BigInteger;->bitLength()I
move-result v0
const/4 v1, 0x2
if-ne v0, v1, :cond_27
.line 342
const/4 v0, 0x1
.line 351
:goto_26
return v0
.line 346
:cond_27
sget-object v0, Lorg/spongycastle/math/Primes;->ONE:Ljava/math/BigInteger;
invoke-virtual {p0, v0}, Ljava/math/BigInteger;->subtract(Ljava/math/BigInteger;)Ljava/math/BigInteger;
move-result-object v0
.line 348
invoke-virtual {v0}, Ljava/math/BigInteger;->getLowestSetBit()I
move-result v1
.line 349
invoke-virtual {v0, v1}, Ljava/math/BigInteger;->shiftRight(I)Ljava/math/BigInteger;
move-result-object v2
.line 351
invoke-static {p0, v0, v2, v1, p1}, Lorg/spongycastle/math/Primes;->implMRProbablePrimeToBase(Ljava/math/BigInteger;Ljava/math/BigInteger;Ljava/math/BigInteger;ILjava/math/BigInteger;)Z
move-result v0
goto :goto_26
.end method
.method private static isPrime32(J)Z
.registers 14
.prologue
const/16 v9, 0x8
const-wide/16 v4, 0x5
const/4 v1, 0x1
const/4 v0, 0x0
const-wide/16 v6, 0x0
.line 630
const/16 v2, 0x20
ushr-long v2, p0, v2
cmp-long v2, v2, v6
if-eqz v2, :cond_18
.line 632
new-instance v0, Ljava/lang/IllegalArgumentException;
const-string v1, "Size limit exceeded"
invoke-direct {v0, v1}, Ljava/lang/IllegalArgumentException;-><init>(Ljava/lang/String;)V
throw v0
.line 639
:cond_18
cmp-long v2, p0, v4
if-gtz v2, :cond_2e
.line 641
const-wide/16 v2, 0x2
cmp-long v2, p0, v2
if-eqz v2, :cond_2c
const-wide/16 v2, 0x3
cmp-long v2, p0, v2
if-eqz v2, :cond_2c
cmp-long v2, p0, v4
if-nez v2, :cond_2d
:cond_2c
move v0, v1
.line 670
:cond_2d
:goto_2d
return v0
.line 644
:cond_2e
const-wide/16 v2, 0x1
and-long/2addr v2, p0
cmp-long v2, v2, v6
if-eqz v2, :cond_2d
const-wide/16 v2, 0x3
rem-long v2, p0, v2
cmp-long v2, v2, v6
if-eqz v2, :cond_2d
rem-long v2, p0, v4
cmp-long v2, v2, v6
if-eqz v2, :cond_2d
.line 649
new-array v8, v9, [J
fill-array-data v8, :array_6e
move v2, v1
move-wide v4, v6
.line 656
:goto_4a
if-ge v2, v9, :cond_60
.line 658
aget-wide v10, v8, v2
add-long/2addr v10, v4
.line 659
rem-long v10, p0, v10
cmp-long v3, v10, v6
if-nez v3, :cond_5d
.line 661
const-wide/16 v2, 0x1e
cmp-long v2, p0, v2
if-gez v2, :cond_2d
move v0, v1
goto :goto_2d
.line 663
:cond_5d
add-int/lit8 v2, v2, 0x1
.line 664
goto :goto_4a
.line 666
:cond_60
const-wide/16 v2, 0x1e
add-long/2addr v2, v4
.line 668
mul-long v4, v2, v2
cmp-long v4, v4, p0
if-ltz v4, :cond_6b
move v0, v1
.line 670
goto :goto_2d
:cond_6b
move-wide v4, v2
move v2, v0
.line 651
goto :goto_4a
.line 649
:array_6e
.array-data 8
0x1
0x7
0xb
0xd
0x11
0x13
0x17
0x1d
.end array-data
.end method