RainbowSigner.smali
.class public Lorg/spongycastle/pqc/crypto/rainbow/RainbowSigner;
.super Ljava/lang/Object;
.source "RainbowSigner.java"
# interfaces
.implements Lorg/spongycastle/pqc/crypto/MessageSigner;
# instance fields
.field private cf:Lorg/spongycastle/pqc/crypto/rainbow/util/ComputeInField;
.field key:Lorg/spongycastle/pqc/crypto/rainbow/RainbowKeyParameters;
.field private random:Ljava/security/SecureRandom;
.field signableDocumentLength:I
.field private x:[S
# direct methods
.method public constructor <init>()V
.registers 2
.prologue
.line 21
invoke-direct {p0}, Ljava/lang/Object;-><init>()V
.line 33
new-instance v0, Lorg/spongycastle/pqc/crypto/rainbow/util/ComputeInField;
invoke-direct {v0}, Lorg/spongycastle/pqc/crypto/rainbow/util/ComputeInField;-><init>()V
iput-object v0, p0, Lorg/spongycastle/pqc/crypto/rainbow/RainbowSigner;->cf:Lorg/spongycastle/pqc/crypto/rainbow/util/ComputeInField;
return-void
.end method
.method private initSign([Lorg/spongycastle/pqc/crypto/rainbow/Layer;[S)[S
.registers 8
.prologue
const/4 v1, 0x0
.line 81
iget-object v2, p0, Lorg/spongycastle/pqc/crypto/rainbow/RainbowSigner;->cf:Lorg/spongycastle/pqc/crypto/rainbow/util/ComputeInField;
iget-object v0, p0, Lorg/spongycastle/pqc/crypto/rainbow/RainbowSigner;->key:Lorg/spongycastle/pqc/crypto/rainbow/RainbowKeyParameters;
check-cast v0, Lorg/spongycastle/pqc/crypto/rainbow/RainbowPrivateKeyParameters;
invoke-virtual {v0}, Lorg/spongycastle/pqc/crypto/rainbow/RainbowPrivateKeyParameters;->getB1()[S
move-result-object v0
invoke-virtual {v2, v0, p2}, Lorg/spongycastle/pqc/crypto/rainbow/util/ComputeInField;->addVect([S[S)[S
move-result-object v2
.line 84
iget-object v3, p0, Lorg/spongycastle/pqc/crypto/rainbow/RainbowSigner;->cf:Lorg/spongycastle/pqc/crypto/rainbow/util/ComputeInField;
iget-object v0, p0, Lorg/spongycastle/pqc/crypto/rainbow/RainbowSigner;->key:Lorg/spongycastle/pqc/crypto/rainbow/RainbowKeyParameters;
check-cast v0, Lorg/spongycastle/pqc/crypto/rainbow/RainbowPrivateKeyParameters;
invoke-virtual {v0}, Lorg/spongycastle/pqc/crypto/rainbow/RainbowPrivateKeyParameters;->getInvA1()[[S
move-result-object v0
invoke-virtual {v3, v0, v2}, Lorg/spongycastle/pqc/crypto/rainbow/util/ComputeInField;->multiplyMatrix([[S[S)[S
move-result-object v2
move v0, v1
.line 87
:goto_1e
aget-object v3, p1, v1
invoke-virtual {v3}, Lorg/spongycastle/pqc/crypto/rainbow/Layer;->getVi()I
move-result v3
if-ge v0, v3, :cond_3f
.line 89
iget-object v3, p0, Lorg/spongycastle/pqc/crypto/rainbow/RainbowSigner;->x:[S
iget-object v4, p0, Lorg/spongycastle/pqc/crypto/rainbow/RainbowSigner;->random:Ljava/security/SecureRandom;
invoke-virtual {v4}, Ljava/security/SecureRandom;->nextInt()I
move-result v4
int-to-short v4, v4
aput-short v4, v3, v0
.line 90
iget-object v3, p0, Lorg/spongycastle/pqc/crypto/rainbow/RainbowSigner;->x:[S
iget-object v4, p0, Lorg/spongycastle/pqc/crypto/rainbow/RainbowSigner;->x:[S
aget-short v4, v4, v0
and-int/lit16 v4, v4, 0xff
int-to-short v4, v4
aput-short v4, v3, v0
.line 87
add-int/lit8 v0, v0, 0x1
goto :goto_1e
.line 93
:cond_3f
return-object v2
.end method
.method private makeMessageRepresentative([B)[S
.registers 6
.prologue
const/4 v0, 0x0
.line 282
iget v1, p0, Lorg/spongycastle/pqc/crypto/rainbow/RainbowSigner;->signableDocumentLength:I
new-array v2, v1, [S
move v1, v0
.line 288
:cond_6
array-length v3, p1
if-ge v0, v3, :cond_1c
.line 292
aget-byte v3, p1, v1
int-to-short v3, v3
aput-short v3, v2, v0
.line 293
aget-short v3, v2, v0
and-int/lit16 v3, v3, 0xff
int-to-short v3, v3
aput-short v3, v2, v0
.line 294
add-int/lit8 v1, v1, 0x1
.line 295
add-int/lit8 v0, v0, 0x1
.line 297
array-length v3, v2
if-lt v0, v3, :cond_6
.line 299
:cond_1c
return-object v2
.end method
.method private verifySignatureIntern([S)[S
.registers 15
.prologue
const/4 v1, 0x0
.line 239
iget-object v0, p0, Lorg/spongycastle/pqc/crypto/rainbow/RainbowSigner;->key:Lorg/spongycastle/pqc/crypto/rainbow/RainbowKeyParameters;
check-cast v0, Lorg/spongycastle/pqc/crypto/rainbow/RainbowPublicKeyParameters;
invoke-virtual {v0}, Lorg/spongycastle/pqc/crypto/rainbow/RainbowPublicKeyParameters;->getCoeffQuadratic()[[S
move-result-object v5
.line 240
iget-object v0, p0, Lorg/spongycastle/pqc/crypto/rainbow/RainbowSigner;->key:Lorg/spongycastle/pqc/crypto/rainbow/RainbowKeyParameters;
check-cast v0, Lorg/spongycastle/pqc/crypto/rainbow/RainbowPublicKeyParameters;
invoke-virtual {v0}, Lorg/spongycastle/pqc/crypto/rainbow/RainbowPublicKeyParameters;->getCoeffSingular()[[S
move-result-object v6
.line 241
iget-object v0, p0, Lorg/spongycastle/pqc/crypto/rainbow/RainbowSigner;->key:Lorg/spongycastle/pqc/crypto/rainbow/RainbowKeyParameters;
check-cast v0, Lorg/spongycastle/pqc/crypto/rainbow/RainbowPublicKeyParameters;
invoke-virtual {v0}, Lorg/spongycastle/pqc/crypto/rainbow/RainbowPublicKeyParameters;->getCoeffScalar()[S
move-result-object v7
.line 243
array-length v0, v5
new-array v8, v0, [S
.line 244
aget-object v0, v6, v1
array-length v9, v0
move v0, v1
.line 248
:goto_20
array-length v2, v5
if-ge v0, v2, :cond_6b
move v3, v1
move v2, v1
.line 251
:goto_25
if-ge v3, v9, :cond_5e
move v4, v2
move v2, v3
.line 254
:goto_29
if-ge v2, v9, :cond_48
.line 256
aget-object v10, v5, v0
aget-short v10, v10, v4
aget-short v11, p1, v3
aget-short v12, p1, v2
.line 257
invoke-static {v11, v12}, Lorg/spongycastle/pqc/crypto/rainbow/util/GF2Field;->multElem(SS)S
move-result v11
.line 256
invoke-static {v10, v11}, Lorg/spongycastle/pqc/crypto/rainbow/util/GF2Field;->multElem(SS)S
move-result v10
.line 258
aget-short v11, v8, v0
invoke-static {v11, v10}, Lorg/spongycastle/pqc/crypto/rainbow/util/GF2Field;->addElem(SS)S
move-result v10
aput-short v10, v8, v0
.line 259
add-int/lit8 v4, v4, 0x1
.line 254
add-int/lit8 v2, v2, 0x1
goto :goto_29
.line 262
:cond_48
aget-object v2, v6, v0
aget-short v2, v2, v3
aget-short v10, p1, v3
invoke-static {v2, v10}, Lorg/spongycastle/pqc/crypto/rainbow/util/GF2Field;->multElem(SS)S
move-result v2
.line 263
aget-short v10, v8, v0
invoke-static {v10, v2}, Lorg/spongycastle/pqc/crypto/rainbow/util/GF2Field;->addElem(SS)S
move-result v2
aput-short v2, v8, v0
.line 251
add-int/lit8 v3, v3, 0x1
move v2, v4
goto :goto_25
.line 266
:cond_5e
aget-short v2, v8, v0
aget-short v3, v7, v0
invoke-static {v2, v3}, Lorg/spongycastle/pqc/crypto/rainbow/util/GF2Field;->addElem(SS)S
move-result v2
aput-short v2, v8, v0
.line 248
add-int/lit8 v0, v0, 0x1
goto :goto_20
.line 269
:cond_6b
return-object v8
.end method
# virtual methods
.method public generateSignature([B)[B
.registers 16
.prologue
const/4 v2, 0x0
.line 110
iget-object v0, p0, Lorg/spongycastle/pqc/crypto/rainbow/RainbowSigner;->key:Lorg/spongycastle/pqc/crypto/rainbow/RainbowKeyParameters;
check-cast v0, Lorg/spongycastle/pqc/crypto/rainbow/RainbowPrivateKeyParameters;
invoke-virtual {v0}, Lorg/spongycastle/pqc/crypto/rainbow/RainbowPrivateKeyParameters;->getLayers()[Lorg/spongycastle/pqc/crypto/rainbow/Layer;
move-result-object v5
.line 111
array-length v6, v5
.line 113
iget-object v0, p0, Lorg/spongycastle/pqc/crypto/rainbow/RainbowSigner;->key:Lorg/spongycastle/pqc/crypto/rainbow/RainbowKeyParameters;
check-cast v0, Lorg/spongycastle/pqc/crypto/rainbow/RainbowPrivateKeyParameters;
invoke-virtual {v0}, Lorg/spongycastle/pqc/crypto/rainbow/RainbowPrivateKeyParameters;->getInvA2()[[S
move-result-object v0
array-length v0, v0
new-array v0, v0, [S
iput-object v0, p0, Lorg/spongycastle/pqc/crypto/rainbow/RainbowSigner;->x:[S
.line 125
add-int/lit8 v0, v6, -0x1
aget-object v0, v5, v0
invoke-virtual {v0}, Lorg/spongycastle/pqc/crypto/rainbow/Layer;->getViNext()I
move-result v0
new-array v7, v0, [B
.line 127
invoke-direct {p0, p1}, Lorg/spongycastle/pqc/crypto/rainbow/RainbowSigner;->makeMessageRepresentative([B)[S
move-result-object v8
.line 133
:cond_25
const/4 v1, 0x1
.line 137
:try_start_26
invoke-direct {p0, v5, v8}, Lorg/spongycastle/pqc/crypto/rainbow/RainbowSigner;->initSign([Lorg/spongycastle/pqc/crypto/rainbow/Layer;[S)[S
move-result-object v9
move v4, v2
move v0, v2
.line 139
:goto_2c
if-ge v4, v6, :cond_84
.line 142
aget-object v3, v5, v4
invoke-virtual {v3}, Lorg/spongycastle/pqc/crypto/rainbow/Layer;->getOi()I
move-result v3
new-array v10, v3, [S
.line 143
aget-object v3, v5, v4
invoke-virtual {v3}, Lorg/spongycastle/pqc/crypto/rainbow/Layer;->getOi()I
move v3, v0
move v0, v2
.line 146
:goto_3d
aget-object v11, v5, v4
invoke-virtual {v11}, Lorg/spongycastle/pqc/crypto/rainbow/Layer;->getOi()I
move-result v11
if-ge v0, v11, :cond_4e
.line 148
aget-short v11, v9, v3
aput-short v11, v10, v0
.line 149
add-int/lit8 v3, v3, 0x1
.line 146
add-int/lit8 v0, v0, 0x1
goto :goto_3d
.line 156
:cond_4e
iget-object v0, p0, Lorg/spongycastle/pqc/crypto/rainbow/RainbowSigner;->cf:Lorg/spongycastle/pqc/crypto/rainbow/util/ComputeInField;
aget-object v11, v5, v4
iget-object v12, p0, Lorg/spongycastle/pqc/crypto/rainbow/RainbowSigner;->x:[S
invoke-virtual {v11, v12}, Lorg/spongycastle/pqc/crypto/rainbow/Layer;->plugInVinegars([S)[[S
move-result-object v11
invoke-virtual {v0, v11, v10}, Lorg/spongycastle/pqc/crypto/rainbow/util/ComputeInField;->solveEquation([[S[S)[S
move-result-object v10
.line 158
if-nez v10, :cond_6b
.line 160
new-instance v0, Ljava/lang/Exception;
const-string v1, "LES is not solveable!"
invoke-direct {v0, v1}, Ljava/lang/Exception;-><init>(Ljava/lang/String;)V
throw v0
.line 183
:catch_66
move-exception v0
move v0, v2
.line 186
:goto_68
if-eqz v0, :cond_25
.line 188
return-object v7
:cond_6b
move v0, v2
.line 164
:goto_6c
array-length v11, v10
if-ge v0, v11, :cond_7f
.line 166
iget-object v11, p0, Lorg/spongycastle/pqc/crypto/rainbow/RainbowSigner;->x:[S
aget-object v12, v5, v4
invoke-virtual {v12}, Lorg/spongycastle/pqc/crypto/rainbow/Layer;->getVi()I
move-result v12
add-int/2addr v12, v0
aget-short v13, v10, v0
aput-short v13, v11, v12
.line 164
add-int/lit8 v0, v0, 0x1
goto :goto_6c
.line 139
:cond_7f
add-int/lit8 v0, v4, 0x1
move v4, v0
move v0, v3
goto :goto_2c
.line 171
:cond_84
iget-object v3, p0, Lorg/spongycastle/pqc/crypto/rainbow/RainbowSigner;->cf:Lorg/spongycastle/pqc/crypto/rainbow/util/ComputeInField;
iget-object v0, p0, Lorg/spongycastle/pqc/crypto/rainbow/RainbowSigner;->key:Lorg/spongycastle/pqc/crypto/rainbow/RainbowKeyParameters;
check-cast v0, Lorg/spongycastle/pqc/crypto/rainbow/RainbowPrivateKeyParameters;
invoke-virtual {v0}, Lorg/spongycastle/pqc/crypto/rainbow/RainbowPrivateKeyParameters;->getB2()[S
move-result-object v0
iget-object v4, p0, Lorg/spongycastle/pqc/crypto/rainbow/RainbowSigner;->x:[S
invoke-virtual {v3, v0, v4}, Lorg/spongycastle/pqc/crypto/rainbow/util/ComputeInField;->addVect([S[S)[S
move-result-object v3
.line 172
iget-object v4, p0, Lorg/spongycastle/pqc/crypto/rainbow/RainbowSigner;->cf:Lorg/spongycastle/pqc/crypto/rainbow/util/ComputeInField;
iget-object v0, p0, Lorg/spongycastle/pqc/crypto/rainbow/RainbowSigner;->key:Lorg/spongycastle/pqc/crypto/rainbow/RainbowKeyParameters;
check-cast v0, Lorg/spongycastle/pqc/crypto/rainbow/RainbowPrivateKeyParameters;
invoke-virtual {v0}, Lorg/spongycastle/pqc/crypto/rainbow/RainbowPrivateKeyParameters;->getInvA2()[[S
move-result-object v0
invoke-virtual {v4, v0, v3}, Lorg/spongycastle/pqc/crypto/rainbow/util/ComputeInField;->multiplyMatrix([[S[S)[S
move-result-object v3
move v0, v2
.line 175
:goto_a3
array-length v4, v7
if-ge v0, v4, :cond_ae
.line 177
aget-short v4, v3, v0
int-to-byte v4, v4
aput-byte v4, v7, v0
:try_end_ab
.catch Ljava/lang/Exception; {:try_start_26 .. :try_end_ab} :catch_66
.line 175
add-int/lit8 v0, v0, 0x1
goto :goto_a3
:cond_ae
move v0, v1
.line 184
goto :goto_68
.end method
.method public init(ZLorg/spongycastle/crypto/CipherParameters;)V
.registers 4
.prologue
.line 40
if-eqz p1, :cond_2b
.line 42
instance-of v0, p2, Lorg/spongycastle/crypto/params/ParametersWithRandom;
if-eqz v0, :cond_1f
.line 44
check-cast p2, Lorg/spongycastle/crypto/params/ParametersWithRandom;
.line 46
invoke-virtual {p2}, Lorg/spongycastle/crypto/params/ParametersWithRandom;->getRandom()Ljava/security/SecureRandom;
move-result-object v0
iput-object v0, p0, Lorg/spongycastle/pqc/crypto/rainbow/RainbowSigner;->random:Ljava/security/SecureRandom;
.line 47
invoke-virtual {p2}, Lorg/spongycastle/crypto/params/ParametersWithRandom;->getParameters()Lorg/spongycastle/crypto/CipherParameters;
move-result-object v0
check-cast v0, Lorg/spongycastle/pqc/crypto/rainbow/RainbowPrivateKeyParameters;
iput-object v0, p0, Lorg/spongycastle/pqc/crypto/rainbow/RainbowSigner;->key:Lorg/spongycastle/pqc/crypto/rainbow/RainbowKeyParameters;
.line 62
:goto_16
iget-object v0, p0, Lorg/spongycastle/pqc/crypto/rainbow/RainbowSigner;->key:Lorg/spongycastle/pqc/crypto/rainbow/RainbowKeyParameters;
invoke-virtual {v0}, Lorg/spongycastle/pqc/crypto/rainbow/RainbowKeyParameters;->getDocLength()I
move-result v0
iput v0, p0, Lorg/spongycastle/pqc/crypto/rainbow/RainbowSigner;->signableDocumentLength:I
.line 63
return-void
.line 53
:cond_1f
new-instance v0, Ljava/security/SecureRandom;
invoke-direct {v0}, Ljava/security/SecureRandom;-><init>()V
iput-object v0, p0, Lorg/spongycastle/pqc/crypto/rainbow/RainbowSigner;->random:Ljava/security/SecureRandom;
.line 54
check-cast p2, Lorg/spongycastle/pqc/crypto/rainbow/RainbowPrivateKeyParameters;
iput-object p2, p0, Lorg/spongycastle/pqc/crypto/rainbow/RainbowSigner;->key:Lorg/spongycastle/pqc/crypto/rainbow/RainbowKeyParameters;
goto :goto_16
.line 59
:cond_2b
check-cast p2, Lorg/spongycastle/pqc/crypto/rainbow/RainbowPublicKeyParameters;
iput-object p2, p0, Lorg/spongycastle/pqc/crypto/rainbow/RainbowSigner;->key:Lorg/spongycastle/pqc/crypto/rainbow/RainbowKeyParameters;
goto :goto_16
.end method
.method public verifySignature([B[B)Z
.registers 10
.prologue
const/4 v3, 0x1
const/4 v1, 0x0
.line 201
array-length v0, p2
new-array v2, v0, [S
move v0, v1
.line 204
:goto_6
array-length v4, p2
if-ge v0, v4, :cond_14
.line 206
aget-byte v4, p2, v0
int-to-short v4, v4
.line 207
and-int/lit16 v4, v4, 0xff
int-to-short v4, v4
.line 208
aput-short v4, v2, v0
.line 204
add-int/lit8 v0, v0, 0x1
goto :goto_6
.line 211
:cond_14
invoke-direct {p0, p1}, Lorg/spongycastle/pqc/crypto/rainbow/RainbowSigner;->makeMessageRepresentative([B)[S
move-result-object v4
.line 214
invoke-direct {p0, v2}, Lorg/spongycastle/pqc/crypto/rainbow/RainbowSigner;->verifySignatureIntern([S)[S
move-result-object v5
.line 218
array-length v0, v4
array-length v2, v5
if-eq v0, v2, :cond_21
.line 227
:goto_20
return v1
:cond_21
move v0, v1
move v2, v3
.line 222
:goto_23
array-length v6, v4
if-ge v0, v6, :cond_34
.line 224
if-eqz v2, :cond_32
aget-short v2, v4, v0
aget-short v6, v5, v0
if-ne v2, v6, :cond_32
move v2, v3
.line 222
:goto_2f
add-int/lit8 v0, v0, 0x1
goto :goto_23
:cond_32
move v2, v1
.line 224
goto :goto_2f
:cond_34
move v1, v2
.line 227
goto :goto_20
.end method