ECDSASigner.smali
.class public Lorg/spongycastle/crypto/signers/ECDSASigner;
.super Ljava/lang/Object;
.source "ECDSASigner.java"
# interfaces
.implements Lorg/spongycastle/crypto/DSA;
.implements Lorg/spongycastle/math/ec/ECConstants;
# instance fields
.field private final kCalculator:Lorg/spongycastle/crypto/signers/DSAKCalculator;
.field private key:Lorg/spongycastle/crypto/params/ECKeyParameters;
.field private random:Ljava/security/SecureRandom;
# direct methods
.method public constructor <init>()V
.registers 2
.prologue
.line 36
invoke-direct {p0}, Ljava/lang/Object;-><init>()V
.line 37
new-instance v0, Lorg/spongycastle/crypto/signers/RandomDSAKCalculator;
invoke-direct {v0}, Lorg/spongycastle/crypto/signers/RandomDSAKCalculator;-><init>()V
iput-object v0, p0, Lorg/spongycastle/crypto/signers/ECDSASigner;->kCalculator:Lorg/spongycastle/crypto/signers/DSAKCalculator;
.line 38
return-void
.end method
.method public constructor <init>(Lorg/spongycastle/crypto/signers/DSAKCalculator;)V
.registers 2
.prologue
.line 46
invoke-direct {p0}, Ljava/lang/Object;-><init>()V
.line 47
iput-object p1, p0, Lorg/spongycastle/crypto/signers/ECDSASigner;->kCalculator:Lorg/spongycastle/crypto/signers/DSAKCalculator;
.line 48
return-void
.end method
# virtual methods
.method protected calculateE(Ljava/math/BigInteger;[B)Ljava/math/BigInteger;
.registers 7
.prologue
.line 215
invoke-virtual {p1}, Ljava/math/BigInteger;->bitLength()I
move-result v1
.line 216
array-length v0, p2
shl-int/lit8 v2, v0, 0x3
.line 218
new-instance v0, Ljava/math/BigInteger;
const/4 v3, 0x1
invoke-direct {v0, v3, p2}, Ljava/math/BigInteger;-><init>(I[B)V
.line 219
if-ge v1, v2, :cond_15
.line 221
sub-int v1, v2, v1
invoke-virtual {v0, v1}, Ljava/math/BigInteger;->shiftRight(I)Ljava/math/BigInteger;
move-result-object v0
.line 223
:cond_15
return-object v0
.end method
.method protected createBasePointMultiplier()Lorg/spongycastle/math/ec/ECMultiplier;
.registers 2
.prologue
.line 228
new-instance v0, Lorg/spongycastle/math/ec/FixedPointCombMultiplier;
invoke-direct {v0}, Lorg/spongycastle/math/ec/FixedPointCombMultiplier;-><init>()V
return-object v0
.end method
.method public generateSignature([B)[Ljava/math/BigInteger;
.registers 10
.prologue
.line 89
iget-object v0, p0, Lorg/spongycastle/crypto/signers/ECDSASigner;->key:Lorg/spongycastle/crypto/params/ECKeyParameters;
invoke-virtual {v0}, Lorg/spongycastle/crypto/params/ECKeyParameters;->getParameters()Lorg/spongycastle/crypto/params/ECDomainParameters;
move-result-object v1
.line 90
invoke-virtual {v1}, Lorg/spongycastle/crypto/params/ECDomainParameters;->getN()Ljava/math/BigInteger;
move-result-object v2
.line 91
invoke-virtual {p0, v2, p1}, Lorg/spongycastle/crypto/signers/ECDSASigner;->calculateE(Ljava/math/BigInteger;[B)Ljava/math/BigInteger;
move-result-object v3
.line 92
iget-object v0, p0, Lorg/spongycastle/crypto/signers/ECDSASigner;->key:Lorg/spongycastle/crypto/params/ECKeyParameters;
check-cast v0, Lorg/spongycastle/crypto/params/ECPrivateKeyParameters;
invoke-virtual {v0}, Lorg/spongycastle/crypto/params/ECPrivateKeyParameters;->getD()Ljava/math/BigInteger;
move-result-object v0
.line 94
iget-object v4, p0, Lorg/spongycastle/crypto/signers/ECDSASigner;->kCalculator:Lorg/spongycastle/crypto/signers/DSAKCalculator;
invoke-interface {v4}, Lorg/spongycastle/crypto/signers/DSAKCalculator;->isDeterministic()Z
move-result v4
if-eqz v4, :cond_73
.line 96
iget-object v4, p0, Lorg/spongycastle/crypto/signers/ECDSASigner;->kCalculator:Lorg/spongycastle/crypto/signers/DSAKCalculator;
invoke-interface {v4, v2, v0, p1}, Lorg/spongycastle/crypto/signers/DSAKCalculator;->init(Ljava/math/BigInteger;Ljava/math/BigInteger;[B)V
.line 105
:goto_23
invoke-virtual {p0}, Lorg/spongycastle/crypto/signers/ECDSASigner;->createBasePointMultiplier()Lorg/spongycastle/math/ec/ECMultiplier;
move-result-object v4
.line 113
:cond_27
iget-object v5, p0, Lorg/spongycastle/crypto/signers/ECDSASigner;->kCalculator:Lorg/spongycastle/crypto/signers/DSAKCalculator;
invoke-interface {v5}, Lorg/spongycastle/crypto/signers/DSAKCalculator;->nextK()Ljava/math/BigInteger;
move-result-object v5
.line 115
invoke-virtual {v1}, Lorg/spongycastle/crypto/params/ECDomainParameters;->getG()Lorg/spongycastle/math/ec/ECPoint;
move-result-object v6
invoke-interface {v4, v6, v5}, Lorg/spongycastle/math/ec/ECMultiplier;->multiply(Lorg/spongycastle/math/ec/ECPoint;Ljava/math/BigInteger;)Lorg/spongycastle/math/ec/ECPoint;
move-result-object v6
invoke-virtual {v6}, Lorg/spongycastle/math/ec/ECPoint;->normalize()Lorg/spongycastle/math/ec/ECPoint;
move-result-object v6
.line 118
invoke-virtual {v6}, Lorg/spongycastle/math/ec/ECPoint;->getAffineXCoord()Lorg/spongycastle/math/ec/ECFieldElement;
move-result-object v6
invoke-virtual {v6}, Lorg/spongycastle/math/ec/ECFieldElement;->toBigInteger()Ljava/math/BigInteger;
move-result-object v6
invoke-virtual {v6, v2}, Ljava/math/BigInteger;->mod(Ljava/math/BigInteger;)Ljava/math/BigInteger;
move-result-object v6
.line 120
sget-object v7, Lorg/spongycastle/crypto/signers/ECDSASigner;->ZERO:Ljava/math/BigInteger;
invoke-virtual {v6, v7}, Ljava/math/BigInteger;->equals(Ljava/lang/Object;)Z
move-result v7
if-nez v7, :cond_27
.line 122
invoke-virtual {v5, v2}, Ljava/math/BigInteger;->modInverse(Ljava/math/BigInteger;)Ljava/math/BigInteger;
move-result-object v5
invoke-virtual {v0, v6}, Ljava/math/BigInteger;->multiply(Ljava/math/BigInteger;)Ljava/math/BigInteger;
move-result-object v7
invoke-virtual {v3, v7}, Ljava/math/BigInteger;->add(Ljava/math/BigInteger;)Ljava/math/BigInteger;
move-result-object v7
invoke-virtual {v5, v7}, Ljava/math/BigInteger;->multiply(Ljava/math/BigInteger;)Ljava/math/BigInteger;
move-result-object v5
invoke-virtual {v5, v2}, Ljava/math/BigInteger;->mod(Ljava/math/BigInteger;)Ljava/math/BigInteger;
move-result-object v5
.line 124
sget-object v7, Lorg/spongycastle/crypto/signers/ECDSASigner;->ZERO:Ljava/math/BigInteger;
invoke-virtual {v5, v7}, Ljava/math/BigInteger;->equals(Ljava/lang/Object;)Z
move-result v7
if-nez v7, :cond_27
.line 126
const/4 v0, 0x2
new-array v0, v0, [Ljava/math/BigInteger;
const/4 v1, 0x0
aput-object v6, v0, v1
const/4 v1, 0x1
aput-object v5, v0, v1
return-object v0
.line 100
:cond_73
iget-object v4, p0, Lorg/spongycastle/crypto/signers/ECDSASigner;->kCalculator:Lorg/spongycastle/crypto/signers/DSAKCalculator;
iget-object v5, p0, Lorg/spongycastle/crypto/signers/ECDSASigner;->random:Ljava/security/SecureRandom;
invoke-interface {v4, v2, v5}, Lorg/spongycastle/crypto/signers/DSAKCalculator;->init(Ljava/math/BigInteger;Ljava/security/SecureRandom;)V
goto :goto_23
.end method
.method protected getDenominator(ILorg/spongycastle/math/ec/ECPoint;)Lorg/spongycastle/math/ec/ECFieldElement;
.registers 4
.prologue
const/4 v0, 0x0
.line 233
packed-switch p1, :pswitch_data_14
.line 244
:pswitch_4
const/4 v0, 0x0
:goto_5
return-object v0
.line 238
:pswitch_6
invoke-virtual {p2, v0}, Lorg/spongycastle/math/ec/ECPoint;->getZCoord(I)Lorg/spongycastle/math/ec/ECFieldElement;
move-result-object v0
goto :goto_5
.line 242
:pswitch_b
invoke-virtual {p2, v0}, Lorg/spongycastle/math/ec/ECPoint;->getZCoord(I)Lorg/spongycastle/math/ec/ECFieldElement;
move-result-object v0
invoke-virtual {v0}, Lorg/spongycastle/math/ec/ECFieldElement;->square()Lorg/spongycastle/math/ec/ECFieldElement;
move-result-object v0
goto :goto_5
.line 233
:pswitch_data_14
.packed-switch 0x1
:pswitch_6
:pswitch_b
:pswitch_b
:pswitch_b
:pswitch_4
:pswitch_6
:pswitch_6
.end packed-switch
.end method
.method public init(ZLorg/spongycastle/crypto/CipherParameters;)V
.registers 5
.prologue
.line 54
const/4 v0, 0x0
.line 56
if-eqz p1, :cond_2e
.line 58
instance-of v1, p2, Lorg/spongycastle/crypto/params/ParametersWithRandom;
if-eqz v1, :cond_28
.line 60
check-cast p2, Lorg/spongycastle/crypto/params/ParametersWithRandom;
.line 62
invoke-virtual {p2}, Lorg/spongycastle/crypto/params/ParametersWithRandom;->getParameters()Lorg/spongycastle/crypto/CipherParameters;
move-result-object v0
check-cast v0, Lorg/spongycastle/crypto/params/ECPrivateKeyParameters;
iput-object v0, p0, Lorg/spongycastle/crypto/signers/ECDSASigner;->key:Lorg/spongycastle/crypto/params/ECKeyParameters;
.line 63
invoke-virtual {p2}, Lorg/spongycastle/crypto/params/ParametersWithRandom;->getRandom()Ljava/security/SecureRandom;
move-result-object v0
move-object v1, v0
.line 75
:goto_16
if-eqz p1, :cond_34
iget-object v0, p0, Lorg/spongycastle/crypto/signers/ECDSASigner;->kCalculator:Lorg/spongycastle/crypto/signers/DSAKCalculator;
invoke-interface {v0}, Lorg/spongycastle/crypto/signers/DSAKCalculator;->isDeterministic()Z
move-result v0
if-nez v0, :cond_34
const/4 v0, 0x1
:goto_21
invoke-virtual {p0, v0, v1}, Lorg/spongycastle/crypto/signers/ECDSASigner;->initSecureRandom(ZLjava/security/SecureRandom;)Ljava/security/SecureRandom;
move-result-object v0
iput-object v0, p0, Lorg/spongycastle/crypto/signers/ECDSASigner;->random:Ljava/security/SecureRandom;
.line 76
return-void
.line 67
:cond_28
check-cast p2, Lorg/spongycastle/crypto/params/ECPrivateKeyParameters;
iput-object p2, p0, Lorg/spongycastle/crypto/signers/ECDSASigner;->key:Lorg/spongycastle/crypto/params/ECKeyParameters;
move-object v1, v0
goto :goto_16
.line 72
:cond_2e
check-cast p2, Lorg/spongycastle/crypto/params/ECPublicKeyParameters;
iput-object p2, p0, Lorg/spongycastle/crypto/signers/ECDSASigner;->key:Lorg/spongycastle/crypto/params/ECKeyParameters;
move-object v1, v0
goto :goto_16
.line 75
:cond_34
const/4 v0, 0x0
goto :goto_21
.end method
.method protected initSecureRandom(ZLjava/security/SecureRandom;)Ljava/security/SecureRandom;
.registers 3
.prologue
.line 250
if-nez p1, :cond_4
const/4 p2, 0x0
:cond_3
:goto_3
return-object p2
:cond_4
if-nez p2, :cond_3
new-instance p2, Ljava/security/SecureRandom;
invoke-direct {p2}, Ljava/security/SecureRandom;-><init>()V
goto :goto_3
.end method
.method public verifySignature([BLjava/math/BigInteger;Ljava/math/BigInteger;)Z
.registers 10
.prologue
const/4 v1, 0x0
.line 140
iget-object v0, p0, Lorg/spongycastle/crypto/signers/ECDSASigner;->key:Lorg/spongycastle/crypto/params/ECKeyParameters;
invoke-virtual {v0}, Lorg/spongycastle/crypto/params/ECKeyParameters;->getParameters()Lorg/spongycastle/crypto/params/ECDomainParameters;
move-result-object v0
.line 141
invoke-virtual {v0}, Lorg/spongycastle/crypto/params/ECDomainParameters;->getN()Ljava/math/BigInteger;
move-result-object v2
.line 142
invoke-virtual {p0, v2, p1}, Lorg/spongycastle/crypto/signers/ECDSASigner;->calculateE(Ljava/math/BigInteger;[B)Ljava/math/BigInteger;
move-result-object v3
.line 145
sget-object v4, Lorg/spongycastle/crypto/signers/ECDSASigner;->ONE:Ljava/math/BigInteger;
invoke-virtual {p2, v4}, Ljava/math/BigInteger;->compareTo(Ljava/math/BigInteger;)I
move-result v4
if-ltz v4, :cond_1d
invoke-virtual {p2, v2}, Ljava/math/BigInteger;->compareTo(Ljava/math/BigInteger;)I
move-result v4
if-ltz v4, :cond_1f
:cond_1d
move v0, v1
.line 210
:goto_1e
return v0
.line 151
:cond_1f
sget-object v4, Lorg/spongycastle/crypto/signers/ECDSASigner;->ONE:Ljava/math/BigInteger;
invoke-virtual {p3, v4}, Ljava/math/BigInteger;->compareTo(Ljava/math/BigInteger;)I
move-result v4
if-ltz v4, :cond_2d
invoke-virtual {p3, v2}, Ljava/math/BigInteger;->compareTo(Ljava/math/BigInteger;)I
move-result v4
if-ltz v4, :cond_2f
:cond_2d
move v0, v1
.line 153
goto :goto_1e
.line 156
:cond_2f
invoke-virtual {p3, v2}, Ljava/math/BigInteger;->modInverse(Ljava/math/BigInteger;)Ljava/math/BigInteger;
move-result-object v4
.line 158
invoke-virtual {v3, v4}, Ljava/math/BigInteger;->multiply(Ljava/math/BigInteger;)Ljava/math/BigInteger;
move-result-object v3
invoke-virtual {v3, v2}, Ljava/math/BigInteger;->mod(Ljava/math/BigInteger;)Ljava/math/BigInteger;
move-result-object v3
.line 159
invoke-virtual {p2, v4}, Ljava/math/BigInteger;->multiply(Ljava/math/BigInteger;)Ljava/math/BigInteger;
move-result-object v4
invoke-virtual {v4, v2}, Ljava/math/BigInteger;->mod(Ljava/math/BigInteger;)Ljava/math/BigInteger;
move-result-object v4
.line 161
invoke-virtual {v0}, Lorg/spongycastle/crypto/params/ECDomainParameters;->getG()Lorg/spongycastle/math/ec/ECPoint;
move-result-object v5
.line 162
iget-object v0, p0, Lorg/spongycastle/crypto/signers/ECDSASigner;->key:Lorg/spongycastle/crypto/params/ECKeyParameters;
check-cast v0, Lorg/spongycastle/crypto/params/ECPublicKeyParameters;
invoke-virtual {v0}, Lorg/spongycastle/crypto/params/ECPublicKeyParameters;->getQ()Lorg/spongycastle/math/ec/ECPoint;
move-result-object v0
.line 164
invoke-static {v5, v3, v0, v4}, Lorg/spongycastle/math/ec/ECAlgorithms;->sumOfTwoMultiplies(Lorg/spongycastle/math/ec/ECPoint;Ljava/math/BigInteger;Lorg/spongycastle/math/ec/ECPoint;Ljava/math/BigInteger;)Lorg/spongycastle/math/ec/ECPoint;
move-result-object v0
.line 167
invoke-virtual {v0}, Lorg/spongycastle/math/ec/ECPoint;->isInfinity()Z
move-result v3
if-eqz v3, :cond_5b
move v0, v1
.line 169
goto :goto_1e
.line 185
:cond_5b
invoke-virtual {v0}, Lorg/spongycastle/math/ec/ECPoint;->getCurve()Lorg/spongycastle/math/ec/ECCurve;
move-result-object v3
.line 186
if-eqz v3, :cond_a1
.line 188
invoke-virtual {v3}, Lorg/spongycastle/math/ec/ECCurve;->getCofactor()Ljava/math/BigInteger;
move-result-object v4
.line 189
if-eqz v4, :cond_a1
sget-object v5, Lorg/spongycastle/crypto/signers/ECDSASigner;->EIGHT:Ljava/math/BigInteger;
invoke-virtual {v4, v5}, Ljava/math/BigInteger;->compareTo(Ljava/math/BigInteger;)I
move-result v4
if-gtz v4, :cond_a1
.line 191
invoke-virtual {v3}, Lorg/spongycastle/math/ec/ECCurve;->getCoordinateSystem()I
move-result v4
invoke-virtual {p0, v4, v0}, Lorg/spongycastle/crypto/signers/ECDSASigner;->getDenominator(ILorg/spongycastle/math/ec/ECPoint;)Lorg/spongycastle/math/ec/ECFieldElement;
move-result-object v4
.line 192
if-eqz v4, :cond_a1
invoke-virtual {v4}, Lorg/spongycastle/math/ec/ECFieldElement;->isZero()Z
move-result v5
if-nez v5, :cond_a1
.line 194
invoke-virtual {v0}, Lorg/spongycastle/math/ec/ECPoint;->getXCoord()Lorg/spongycastle/math/ec/ECFieldElement;
move-result-object v0
.line 195
:goto_83
invoke-virtual {v3, p2}, Lorg/spongycastle/math/ec/ECCurve;->isValidFieldElement(Ljava/math/BigInteger;)Z
move-result v5
if-eqz v5, :cond_9e
.line 197
invoke-virtual {v3, p2}, Lorg/spongycastle/math/ec/ECCurve;->fromBigInteger(Ljava/math/BigInteger;)Lorg/spongycastle/math/ec/ECFieldElement;
move-result-object v5
invoke-virtual {v5, v4}, Lorg/spongycastle/math/ec/ECFieldElement;->multiply(Lorg/spongycastle/math/ec/ECFieldElement;)Lorg/spongycastle/math/ec/ECFieldElement;
move-result-object v5
.line 198
invoke-virtual {v5, v0}, Ljava/lang/Object;->equals(Ljava/lang/Object;)Z
move-result v5
if-eqz v5, :cond_99
.line 200
const/4 v0, 0x1
goto :goto_1e
.line 202
:cond_99
invoke-virtual {p2, v2}, Ljava/math/BigInteger;->add(Ljava/math/BigInteger;)Ljava/math/BigInteger;
move-result-object p2
goto :goto_83
:cond_9e
move v0, v1
.line 204
goto/16 :goto_1e
.line 209
:cond_a1
invoke-virtual {v0}, Lorg/spongycastle/math/ec/ECPoint;->normalize()Lorg/spongycastle/math/ec/ECPoint;
move-result-object v0
invoke-virtual {v0}, Lorg/spongycastle/math/ec/ECPoint;->getAffineXCoord()Lorg/spongycastle/math/ec/ECFieldElement;
move-result-object v0
invoke-virtual {v0}, Lorg/spongycastle/math/ec/ECFieldElement;->toBigInteger()Ljava/math/BigInteger;
move-result-object v0
invoke-virtual {v0, v2}, Ljava/math/BigInteger;->mod(Ljava/math/BigInteger;)Ljava/math/BigInteger;
move-result-object v0
.line 210
invoke-virtual {v0, p2}, Ljava/math/BigInteger;->equals(Ljava/lang/Object;)Z
move-result v0
goto/16 :goto_1e
.end method