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