Grainv1Engine.smali

.class public Lorg/spongycastle/crypto/engines/Grainv1Engine;
.super Ljava/lang/Object;
.source "Grainv1Engine.java"

# interfaces
.implements Lorg/spongycastle/crypto/StreamCipher;


# static fields
.field private static final STATE_SIZE:I = 0x5


# instance fields
.field private index:I

.field private initialised:Z

.field private lfsr:[I

.field private nfsr:[I

.field private out:[B

.field private output:I

.field private workingIV:[B

.field private workingKey:[B


# direct methods
.method public constructor <init>()V
    .registers 2

    .prologue
    .line 14
    invoke-direct {p0}, Ljava/lang/Object;-><init>()V

    .line 33
    const/4 v0, 0x2

    iput v0, p0, Lorg/spongycastle/crypto/engines/Grainv1Engine;->index:I

    .line 35
    const/4 v0, 0x0

    iput-boolean v0, p0, Lorg/spongycastle/crypto/engines/Grainv1Engine;->initialised:Z

    return-void
.end method

.method private getKeyStream()B
    .registers 4

    .prologue
    .line 283
    iget v0, p0, Lorg/spongycastle/crypto/engines/Grainv1Engine;->index:I

    const/4 v1, 0x1

    if-le v0, v1, :cond_b

    .line 285
    invoke-direct {p0}, Lorg/spongycastle/crypto/engines/Grainv1Engine;->oneRound()V

    .line 286
    const/4 v0, 0x0

    iput v0, p0, Lorg/spongycastle/crypto/engines/Grainv1Engine;->index:I

    .line 288
    :cond_b
    iget-object v0, p0, Lorg/spongycastle/crypto/engines/Grainv1Engine;->out:[B

    iget v1, p0, Lorg/spongycastle/crypto/engines/Grainv1Engine;->index:I

    add-int/lit8 v2, v1, 0x1

    iput v2, p0, Lorg/spongycastle/crypto/engines/Grainv1Engine;->index:I

    aget-byte v0, v0, v1

    return v0
.end method

.method private getOutput()I
    .registers 15

    .prologue
    const/4 v13, 0x4

    const/4 v12, 0x3

    const/4 v11, 0x2

    const/4 v9, 0x0

    const/4 v10, 0x1

    .line 162
    iget-object v0, p0, Lorg/spongycastle/crypto/engines/Grainv1Engine;->nfsr:[I

    aget v0, v0, v9

    ushr-int/lit8 v0, v0, 0x1

    iget-object v1, p0, Lorg/spongycastle/crypto/engines/Grainv1Engine;->nfsr:[I

    aget v1, v1, v10

    shl-int/lit8 v1, v1, 0xf

    or-int/2addr v0, v1

    .line 163
    iget-object v1, p0, Lorg/spongycastle/crypto/engines/Grainv1Engine;->nfsr:[I

    aget v1, v1, v9

    ushr-int/lit8 v1, v1, 0x2

    iget-object v2, p0, Lorg/spongycastle/crypto/engines/Grainv1Engine;->nfsr:[I

    aget v2, v2, v10

    shl-int/lit8 v2, v2, 0xe

    or-int/2addr v1, v2

    .line 164
    iget-object v2, p0, Lorg/spongycastle/crypto/engines/Grainv1Engine;->nfsr:[I

    aget v2, v2, v9

    ushr-int/lit8 v2, v2, 0x4

    iget-object v3, p0, Lorg/spongycastle/crypto/engines/Grainv1Engine;->nfsr:[I

    aget v3, v3, v10

    shl-int/lit8 v3, v3, 0xc

    or-int/2addr v2, v3

    .line 165
    iget-object v3, p0, Lorg/spongycastle/crypto/engines/Grainv1Engine;->nfsr:[I

    aget v3, v3, v9

    ushr-int/lit8 v3, v3, 0xa

    iget-object v4, p0, Lorg/spongycastle/crypto/engines/Grainv1Engine;->nfsr:[I

    aget v4, v4, v10

    shl-int/lit8 v4, v4, 0x6

    or-int/2addr v3, v4

    .line 166
    iget-object v4, p0, Lorg/spongycastle/crypto/engines/Grainv1Engine;->nfsr:[I

    aget v4, v4, v10

    ushr-int/lit8 v4, v4, 0xf

    iget-object v5, p0, Lorg/spongycastle/crypto/engines/Grainv1Engine;->nfsr:[I

    aget v5, v5, v11

    shl-int/lit8 v5, v5, 0x1

    or-int/2addr v4, v5

    .line 167
    iget-object v5, p0, Lorg/spongycastle/crypto/engines/Grainv1Engine;->nfsr:[I

    aget v5, v5, v11

    ushr-int/lit8 v5, v5, 0xb

    iget-object v6, p0, Lorg/spongycastle/crypto/engines/Grainv1Engine;->nfsr:[I

    aget v6, v6, v12

    shl-int/lit8 v6, v6, 0x5

    or-int/2addr v5, v6

    .line 168
    iget-object v6, p0, Lorg/spongycastle/crypto/engines/Grainv1Engine;->nfsr:[I

    aget v6, v6, v12

    ushr-int/lit8 v6, v6, 0x8

    iget-object v7, p0, Lorg/spongycastle/crypto/engines/Grainv1Engine;->nfsr:[I

    aget v7, v7, v13

    shl-int/lit8 v7, v7, 0x8

    or-int/2addr v6, v7

    .line 169
    iget-object v7, p0, Lorg/spongycastle/crypto/engines/Grainv1Engine;->nfsr:[I

    aget v7, v7, v12

    ushr-int/lit8 v7, v7, 0xf

    iget-object v8, p0, Lorg/spongycastle/crypto/engines/Grainv1Engine;->nfsr:[I

    aget v8, v8, v13

    shl-int/lit8 v8, v8, 0x1

    or-int/2addr v7, v8

    .line 170
    iget-object v8, p0, Lorg/spongycastle/crypto/engines/Grainv1Engine;->lfsr:[I

    aget v8, v8, v9

    ushr-int/lit8 v8, v8, 0x3

    iget-object v9, p0, Lorg/spongycastle/crypto/engines/Grainv1Engine;->lfsr:[I

    aget v9, v9, v10

    shl-int/lit8 v9, v9, 0xd

    or-int/2addr v8, v9

    .line 171
    iget-object v9, p0, Lorg/spongycastle/crypto/engines/Grainv1Engine;->lfsr:[I

    aget v9, v9, v10

    ushr-int/lit8 v9, v9, 0x9

    iget-object v10, p0, Lorg/spongycastle/crypto/engines/Grainv1Engine;->lfsr:[I

    aget v10, v10, v11

    shl-int/lit8 v10, v10, 0x7

    or-int/2addr v9, v10

    .line 172
    iget-object v10, p0, Lorg/spongycastle/crypto/engines/Grainv1Engine;->lfsr:[I

    aget v10, v10, v11

    ushr-int/lit8 v10, v10, 0xe

    iget-object v11, p0, Lorg/spongycastle/crypto/engines/Grainv1Engine;->lfsr:[I

    aget v11, v11, v12

    shl-int/lit8 v11, v11, 0x2

    or-int/2addr v10, v11

    .line 173
    iget-object v11, p0, Lorg/spongycastle/crypto/engines/Grainv1Engine;->lfsr:[I

    aget v11, v11, v13

    .line 175
    xor-int v12, v9, v7

    and-int v13, v8, v11

    xor-int/2addr v12, v13

    and-int v13, v10, v11

    xor-int/2addr v12, v13

    and-int v13, v11, v7

    xor-int/2addr v12, v13

    and-int v13, v8, v9

    and-int/2addr v13, v10

    xor-int/2addr v12, v13

    and-int v13, v8, v10

    and-int/2addr v13, v11

    xor-int/2addr v12, v13

    and-int/2addr v8, v10

    and-int/2addr v8, v7

    xor-int/2addr v8, v12

    and-int/2addr v9, v10

    and-int/2addr v9, v7

    xor-int/2addr v8, v9

    and-int v9, v10, v11

    and-int/2addr v7, v9

    xor-int/2addr v7, v8

    xor-int/2addr v0, v7

    xor-int/2addr v0, v1

    xor-int/2addr v0, v2

    xor-int/2addr v0, v3

    xor-int/2addr v0, v4

    xor-int/2addr v0, v5

    xor-int/2addr v0, v6

    const v1, 0xffff

    and-int/2addr v0, v1

    return v0
.end method

.method private getOutputLFSR()I
    .registers 9

    .prologue
    const/4 v7, 0x4

    const/4 v4, 0x2

    const/4 v3, 0x1

    const/4 v2, 0x0

    const/4 v6, 0x3

    .line 145
    iget-object v0, p0, Lorg/spongycastle/crypto/engines/Grainv1Engine;->lfsr:[I

    aget v0, v0, v2

    .line 146
    iget-object v1, p0, Lorg/spongycastle/crypto/engines/Grainv1Engine;->lfsr:[I

    aget v1, v1, v2

    ushr-int/lit8 v1, v1, 0xd

    iget-object v2, p0, Lorg/spongycastle/crypto/engines/Grainv1Engine;->lfsr:[I

    aget v2, v2, v3

    shl-int/lit8 v2, v2, 0x3

    or-int/2addr v1, v2

    .line 147
    iget-object v2, p0, Lorg/spongycastle/crypto/engines/Grainv1Engine;->lfsr:[I

    aget v2, v2, v3

    ushr-int/lit8 v2, v2, 0x7

    iget-object v3, p0, Lorg/spongycastle/crypto/engines/Grainv1Engine;->lfsr:[I

    aget v3, v3, v4

    shl-int/lit8 v3, v3, 0x9

    or-int/2addr v2, v3

    .line 148
    iget-object v3, p0, Lorg/spongycastle/crypto/engines/Grainv1Engine;->lfsr:[I

    aget v3, v3, v4

    ushr-int/lit8 v3, v3, 0x6

    iget-object v4, p0, Lorg/spongycastle/crypto/engines/Grainv1Engine;->lfsr:[I

    aget v4, v4, v6

    shl-int/lit8 v4, v4, 0xa

    or-int/2addr v3, v4

    .line 149
    iget-object v4, p0, Lorg/spongycastle/crypto/engines/Grainv1Engine;->lfsr:[I

    aget v4, v4, v6

    ushr-int/lit8 v4, v4, 0x3

    iget-object v5, p0, Lorg/spongycastle/crypto/engines/Grainv1Engine;->lfsr:[I

    aget v5, v5, v7

    shl-int/lit8 v5, v5, 0xd

    or-int/2addr v4, v5

    .line 150
    iget-object v5, p0, Lorg/spongycastle/crypto/engines/Grainv1Engine;->lfsr:[I

    aget v5, v5, v6

    ushr-int/lit8 v5, v5, 0xe

    iget-object v6, p0, Lorg/spongycastle/crypto/engines/Grainv1Engine;->lfsr:[I

    aget v6, v6, v7

    shl-int/lit8 v6, v6, 0x2

    or-int/2addr v5, v6

    .line 152
    xor-int/2addr v0, v1

    xor-int/2addr v0, v2

    xor-int/2addr v0, v3

    xor-int/2addr v0, v4

    xor-int/2addr v0, v5

    const v1, 0xffff

    and-int/2addr v0, v1

    return v0
.end method

.method private getOutputNFSR()I
    .registers 16

    .prologue
    const/4 v14, 0x4

    const/4 v4, 0x0

    const/4 v9, 0x2

    const/4 v6, 0x1

    const/4 v13, 0x3

    .line 116
    iget-object v0, p0, Lorg/spongycastle/crypto/engines/Grainv1Engine;->nfsr:[I

    aget v0, v0, v4

    .line 117
    iget-object v1, p0, Lorg/spongycastle/crypto/engines/Grainv1Engine;->nfsr:[I

    aget v1, v1, v4

    ushr-int/lit8 v1, v1, 0x9

    iget-object v2, p0, Lorg/spongycastle/crypto/engines/Grainv1Engine;->nfsr:[I

    aget v2, v2, v6

    shl-int/lit8 v2, v2, 0x7

    or-int/2addr v1, v2

    .line 118
    iget-object v2, p0, Lorg/spongycastle/crypto/engines/Grainv1Engine;->nfsr:[I

    aget v2, v2, v4

    ushr-int/lit8 v2, v2, 0xe

    iget-object v3, p0, Lorg/spongycastle/crypto/engines/Grainv1Engine;->nfsr:[I

    aget v3, v3, v6

    shl-int/lit8 v3, v3, 0x2

    or-int/2addr v2, v3

    .line 119
    iget-object v3, p0, Lorg/spongycastle/crypto/engines/Grainv1Engine;->nfsr:[I

    aget v3, v3, v4

    ushr-int/lit8 v3, v3, 0xf

    iget-object v4, p0, Lorg/spongycastle/crypto/engines/Grainv1Engine;->nfsr:[I

    aget v4, v4, v6

    shl-int/lit8 v4, v4, 0x1

    or-int/2addr v3, v4

    .line 120
    iget-object v4, p0, Lorg/spongycastle/crypto/engines/Grainv1Engine;->nfsr:[I

    aget v4, v4, v6

    ushr-int/lit8 v4, v4, 0x5

    iget-object v5, p0, Lorg/spongycastle/crypto/engines/Grainv1Engine;->nfsr:[I

    aget v5, v5, v9

    shl-int/lit8 v5, v5, 0xb

    or-int/2addr v4, v5

    .line 121
    iget-object v5, p0, Lorg/spongycastle/crypto/engines/Grainv1Engine;->nfsr:[I

    aget v5, v5, v6

    ushr-int/lit8 v5, v5, 0xc

    iget-object v6, p0, Lorg/spongycastle/crypto/engines/Grainv1Engine;->nfsr:[I

    aget v6, v6, v9

    shl-int/lit8 v6, v6, 0x4

    or-int/2addr v5, v6

    .line 122
    iget-object v6, p0, Lorg/spongycastle/crypto/engines/Grainv1Engine;->nfsr:[I

    aget v6, v6, v9

    ushr-int/lit8 v6, v6, 0x1

    iget-object v7, p0, Lorg/spongycastle/crypto/engines/Grainv1Engine;->nfsr:[I

    aget v7, v7, v13

    shl-int/lit8 v7, v7, 0xf

    or-int/2addr v6, v7

    .line 123
    iget-object v7, p0, Lorg/spongycastle/crypto/engines/Grainv1Engine;->nfsr:[I

    aget v7, v7, v9

    ushr-int/lit8 v7, v7, 0x5

    iget-object v8, p0, Lorg/spongycastle/crypto/engines/Grainv1Engine;->nfsr:[I

    aget v8, v8, v13

    shl-int/lit8 v8, v8, 0xb

    or-int/2addr v7, v8

    .line 124
    iget-object v8, p0, Lorg/spongycastle/crypto/engines/Grainv1Engine;->nfsr:[I

    aget v8, v8, v9

    ushr-int/lit8 v8, v8, 0xd

    iget-object v9, p0, Lorg/spongycastle/crypto/engines/Grainv1Engine;->nfsr:[I

    aget v9, v9, v13

    shl-int/lit8 v9, v9, 0x3

    or-int/2addr v8, v9

    .line 125
    iget-object v9, p0, Lorg/spongycastle/crypto/engines/Grainv1Engine;->nfsr:[I

    aget v9, v9, v13

    ushr-int/lit8 v9, v9, 0x4

    iget-object v10, p0, Lorg/spongycastle/crypto/engines/Grainv1Engine;->nfsr:[I

    aget v10, v10, v14

    shl-int/lit8 v10, v10, 0xc

    or-int/2addr v9, v10

    .line 126
    iget-object v10, p0, Lorg/spongycastle/crypto/engines/Grainv1Engine;->nfsr:[I

    aget v10, v10, v13

    ushr-int/lit8 v10, v10, 0xc

    iget-object v11, p0, Lorg/spongycastle/crypto/engines/Grainv1Engine;->nfsr:[I

    aget v11, v11, v14

    shl-int/lit8 v11, v11, 0x4

    or-int/2addr v10, v11

    .line 127
    iget-object v11, p0, Lorg/spongycastle/crypto/engines/Grainv1Engine;->nfsr:[I

    aget v11, v11, v13

    ushr-int/lit8 v11, v11, 0xe

    iget-object v12, p0, Lorg/spongycastle/crypto/engines/Grainv1Engine;->nfsr:[I

    aget v12, v12, v14

    shl-int/lit8 v12, v12, 0x2

    or-int/2addr v11, v12

    .line 128
    iget-object v12, p0, Lorg/spongycastle/crypto/engines/Grainv1Engine;->nfsr:[I

    aget v12, v12, v13

    ushr-int/lit8 v12, v12, 0xf

    iget-object v13, p0, Lorg/spongycastle/crypto/engines/Grainv1Engine;->nfsr:[I

    aget v13, v13, v14

    shl-int/lit8 v13, v13, 0x1

    or-int/2addr v12, v13

    .line 130
    xor-int/2addr v11, v10

    xor-int/2addr v11, v9

    xor-int/2addr v11, v8

    xor-int/2addr v11, v7

    xor-int/2addr v11, v6

    xor-int/2addr v11, v5

    xor-int/2addr v11, v4

    xor-int/2addr v2, v11

    xor-int/2addr v2, v1

    xor-int/2addr v0, v2

    and-int v2, v12, v10

    xor-int/2addr v0, v2

    and-int v2, v7, v6

    xor-int/2addr v0, v2

    and-int v2, v3, v1

    xor-int/2addr v0, v2

    and-int v2, v10, v9

    and-int/2addr v2, v8

    xor-int/2addr v0, v2

    and-int v2, v6, v5

    and-int/2addr v2, v4

    xor-int/2addr v0, v2

    and-int v2, v12, v8

    and-int/2addr v2, v5

    and-int/2addr v2, v1

    xor-int/2addr v0, v2

    and-int v2, v10, v9

    and-int/2addr v2, v7

    and-int/2addr v2, v6

    xor-int/2addr v0, v2

    and-int v2, v12, v10

    and-int/2addr v2, v4

    and-int/2addr v2, v3

    xor-int/2addr v0, v2

    and-int v2, v12, v10

    and-int/2addr v2, v9

    and-int/2addr v2, v8

    and-int/2addr v2, v7

    xor-int/2addr v0, v2

    and-int v2, v6, v5

    and-int/2addr v2, v4

    and-int/2addr v2, v3

    and-int/2addr v1, v2

    xor-int/2addr v0, v1

    and-int v1, v9, v8

    and-int/2addr v1, v7

    and-int/2addr v1, v6

    and-int/2addr v1, v5

    and-int/2addr v1, v4

    xor-int/2addr v0, v1

    const v1, 0xffff

    and-int/2addr v0, v1

    return v0
.end method

.method private initGrain()V
    .registers 6

    .prologue
    const/4 v1, 0x0

    .line 100
    move v0, v1

    :goto_2
    const/16 v2, 0xa

    if-ge v0, v2, :cond_32

    .line 102
    invoke-direct {p0}, Lorg/spongycastle/crypto/engines/Grainv1Engine;->getOutput()I

    move-result v2

    iput v2, p0, Lorg/spongycastle/crypto/engines/Grainv1Engine;->output:I

    .line 103
    iget-object v2, p0, Lorg/spongycastle/crypto/engines/Grainv1Engine;->nfsr:[I

    invoke-direct {p0}, Lorg/spongycastle/crypto/engines/Grainv1Engine;->getOutputNFSR()I

    move-result v3

    iget-object v4, p0, Lorg/spongycastle/crypto/engines/Grainv1Engine;->lfsr:[I

    aget v4, v4, v1

    xor-int/2addr v3, v4

    iget v4, p0, Lorg/spongycastle/crypto/engines/Grainv1Engine;->output:I

    xor-int/2addr v3, v4

    invoke-direct {p0, v2, v3}, Lorg/spongycastle/crypto/engines/Grainv1Engine;->shift([II)[I

    move-result-object v2

    iput-object v2, p0, Lorg/spongycastle/crypto/engines/Grainv1Engine;->nfsr:[I

    .line 104
    iget-object v2, p0, Lorg/spongycastle/crypto/engines/Grainv1Engine;->lfsr:[I

    invoke-direct {p0}, Lorg/spongycastle/crypto/engines/Grainv1Engine;->getOutputLFSR()I

    move-result v3

    iget v4, p0, Lorg/spongycastle/crypto/engines/Grainv1Engine;->output:I

    xor-int/2addr v3, v4

    invoke-direct {p0, v2, v3}, Lorg/spongycastle/crypto/engines/Grainv1Engine;->shift([II)[I

    move-result-object v2

    iput-object v2, p0, Lorg/spongycastle/crypto/engines/Grainv1Engine;->lfsr:[I

    .line 100
    add-int/lit8 v0, v0, 0x1

    goto :goto_2

    .line 106
    :cond_32
    const/4 v0, 0x1

    iput-boolean v0, p0, Lorg/spongycastle/crypto/engines/Grainv1Engine;->initialised:Z

    .line 107
    return-void
.end method

.method private oneRound()V
    .registers 5

    .prologue
    const/4 v3, 0x0

    .line 263
    invoke-direct {p0}, Lorg/spongycastle/crypto/engines/Grainv1Engine;->getOutput()I

    move-result v0

    iput v0, p0, Lorg/spongycastle/crypto/engines/Grainv1Engine;->output:I

    .line 264
    iget-object v0, p0, Lorg/spongycastle/crypto/engines/Grainv1Engine;->out:[B

    iget v1, p0, Lorg/spongycastle/crypto/engines/Grainv1Engine;->output:I

    int-to-byte v1, v1

    aput-byte v1, v0, v3

    .line 265
    iget-object v0, p0, Lorg/spongycastle/crypto/engines/Grainv1Engine;->out:[B

    const/4 v1, 0x1

    iget v2, p0, Lorg/spongycastle/crypto/engines/Grainv1Engine;->output:I

    shr-int/lit8 v2, v2, 0x8

    int-to-byte v2, v2

    aput-byte v2, v0, v1

    .line 267
    iget-object v0, p0, Lorg/spongycastle/crypto/engines/Grainv1Engine;->nfsr:[I

    invoke-direct {p0}, Lorg/spongycastle/crypto/engines/Grainv1Engine;->getOutputNFSR()I

    move-result v1

    iget-object v2, p0, Lorg/spongycastle/crypto/engines/Grainv1Engine;->lfsr:[I

    aget v2, v2, v3

    xor-int/2addr v1, v2

    invoke-direct {p0, v0, v1}, Lorg/spongycastle/crypto/engines/Grainv1Engine;->shift([II)[I

    move-result-object v0

    iput-object v0, p0, Lorg/spongycastle/crypto/engines/Grainv1Engine;->nfsr:[I

    .line 268
    iget-object v0, p0, Lorg/spongycastle/crypto/engines/Grainv1Engine;->lfsr:[I

    invoke-direct {p0}, Lorg/spongycastle/crypto/engines/Grainv1Engine;->getOutputLFSR()I

    move-result v1

    invoke-direct {p0, v0, v1}, Lorg/spongycastle/crypto/engines/Grainv1Engine;->shift([II)[I

    move-result-object v0

    iput-object v0, p0, Lorg/spongycastle/crypto/engines/Grainv1Engine;->lfsr:[I

    .line 269
    return-void
.end method

.method private setKey([B[B)V
    .registers 9

    .prologue
    const v5, 0xffff

    const/4 v0, 0x0

    const/4 v2, -0x1

    .line 206
    const/16 v1, 0x8

    aput-byte v2, p2, v1

    .line 207
    const/16 v1, 0x9

    aput-byte v2, p2, v1

    .line 208
    iput-object p1, p0, Lorg/spongycastle/crypto/engines/Grainv1Engine;->workingKey:[B

    .line 209
    iput-object p2, p0, Lorg/spongycastle/crypto/engines/Grainv1Engine;->workingIV:[B

    move v1, v0

    .line 215
    :goto_12
    iget-object v2, p0, Lorg/spongycastle/crypto/engines/Grainv1Engine;->nfsr:[I

    array-length v2, v2

    if-ge v0, v2, :cond_44

    .line 217
    iget-object v2, p0, Lorg/spongycastle/crypto/engines/Grainv1Engine;->nfsr:[I

    iget-object v3, p0, Lorg/spongycastle/crypto/engines/Grainv1Engine;->workingKey:[B

    add-int/lit8 v4, v1, 0x1

    aget-byte v3, v3, v4

    shl-int/lit8 v3, v3, 0x8

    iget-object v4, p0, Lorg/spongycastle/crypto/engines/Grainv1Engine;->workingKey:[B

    aget-byte v4, v4, v1

    and-int/lit16 v4, v4, 0xff

    or-int/2addr v3, v4

    and-int/2addr v3, v5

    aput v3, v2, v0

    .line 218
    iget-object v2, p0, Lorg/spongycastle/crypto/engines/Grainv1Engine;->lfsr:[I

    iget-object v3, p0, Lorg/spongycastle/crypto/engines/Grainv1Engine;->workingIV:[B

    add-int/lit8 v4, v1, 0x1

    aget-byte v3, v3, v4

    shl-int/lit8 v3, v3, 0x8

    iget-object v4, p0, Lorg/spongycastle/crypto/engines/Grainv1Engine;->workingIV:[B

    aget-byte v4, v4, v1

    and-int/lit16 v4, v4, 0xff

    or-int/2addr v3, v4

    and-int/2addr v3, v5

    aput v3, v2, v0

    .line 219
    add-int/lit8 v1, v1, 0x2

    .line 215
    add-int/lit8 v0, v0, 0x1

    goto :goto_12

    .line 221
    :cond_44
    return-void
.end method

.method private shift([II)[I
    .registers 9

    .prologue
    const/4 v5, 0x4

    const/4 v4, 0x3

    const/4 v3, 0x2

    const/4 v2, 0x1

    .line 189
    const/4 v0, 0x0

    aget v1, p1, v2

    aput v1, p1, v0

    .line 190
    aget v0, p1, v3

    aput v0, p1, v2

    .line 191
    aget v0, p1, v4

    aput v0, p1, v3

    .line 192
    aget v0, p1, v5

    aput v0, p1, v4

    .line 193
    aput p2, p1, v5

    .line 195
    return-object p1
.end method


# virtual methods
.method public getAlgorithmName()Ljava/lang/String;
    .registers 2

    .prologue
    .line 39
    const-string v0, "Grain v1"

    return-object v0
.end method

.method public init(ZLorg/spongycastle/crypto/CipherParameters;)V
    .registers 8

    .prologue
    const/4 v3, 0x5

    const/4 v4, 0x0

    .line 56
    instance-of v0, p2, Lorg/spongycastle/crypto/params/ParametersWithIV;

    if-nez v0, :cond_e

    .line 58
    new-instance v0, Ljava/lang/IllegalArgumentException;

    const-string v1, "Grain v1 Init parameters must include an IV"

    invoke-direct {v0, v1}, Ljava/lang/IllegalArgumentException;-><init>(Ljava/lang/String;)V

    throw v0

    .line 62
    :cond_e
    check-cast p2, Lorg/spongycastle/crypto/params/ParametersWithIV;

    .line 64
    invoke-virtual {p2}, Lorg/spongycastle/crypto/params/ParametersWithIV;->getIV()[B

    move-result-object v1

    .line 66
    if-eqz v1, :cond_1b

    array-length v0, v1

    const/16 v2, 0x8

    if-eq v0, v2, :cond_23

    .line 68
    :cond_1b
    new-instance v0, Ljava/lang/IllegalArgumentException;

    const-string v1, "Grain v1 requires exactly 8 bytes of IV"

    invoke-direct {v0, v1}, Ljava/lang/IllegalArgumentException;-><init>(Ljava/lang/String;)V

    throw v0

    .line 72
    :cond_23
    invoke-virtual {p2}, Lorg/spongycastle/crypto/params/ParametersWithIV;->getParameters()Lorg/spongycastle/crypto/CipherParameters;

    move-result-object v0

    instance-of v0, v0, Lorg/spongycastle/crypto/params/KeyParameter;

    if-nez v0, :cond_33

    .line 74
    new-instance v0, Ljava/lang/IllegalArgumentException;

    const-string v1, "Grain v1 Init parameters must include a key"

    invoke-direct {v0, v1}, Ljava/lang/IllegalArgumentException;-><init>(Ljava/lang/String;)V

    throw v0

    .line 78
    :cond_33
    invoke-virtual {p2}, Lorg/spongycastle/crypto/params/ParametersWithIV;->getParameters()Lorg/spongycastle/crypto/CipherParameters;

    move-result-object v0

    check-cast v0, Lorg/spongycastle/crypto/params/KeyParameter;

    .line 83
    invoke-virtual {v0}, Lorg/spongycastle/crypto/params/KeyParameter;->getKey()[B

    move-result-object v2

    array-length v2, v2

    new-array v2, v2, [B

    iput-object v2, p0, Lorg/spongycastle/crypto/engines/Grainv1Engine;->workingIV:[B

    .line 84
    invoke-virtual {v0}, Lorg/spongycastle/crypto/params/KeyParameter;->getKey()[B

    move-result-object v2

    array-length v2, v2

    new-array v2, v2, [B

    iput-object v2, p0, Lorg/spongycastle/crypto/engines/Grainv1Engine;->workingKey:[B

    .line 85
    new-array v2, v3, [I

    iput-object v2, p0, Lorg/spongycastle/crypto/engines/Grainv1Engine;->lfsr:[I

    .line 86
    new-array v2, v3, [I

    iput-object v2, p0, Lorg/spongycastle/crypto/engines/Grainv1Engine;->nfsr:[I

    .line 87
    const/4 v2, 0x2

    new-array v2, v2, [B

    iput-object v2, p0, Lorg/spongycastle/crypto/engines/Grainv1Engine;->out:[B

    .line 89
    iget-object v2, p0, Lorg/spongycastle/crypto/engines/Grainv1Engine;->workingIV:[B

    array-length v3, v1

    invoke-static {v1, v4, v2, v4, v3}, Ljava/lang/System;->arraycopy(Ljava/lang/Object;ILjava/lang/Object;II)V

    .line 90
    invoke-virtual {v0}, Lorg/spongycastle/crypto/params/KeyParameter;->getKey()[B

    move-result-object v1

    iget-object v2, p0, Lorg/spongycastle/crypto/engines/Grainv1Engine;->workingKey:[B

    invoke-virtual {v0}, Lorg/spongycastle/crypto/params/KeyParameter;->getKey()[B

    move-result-object v0

    array-length v0, v0

    invoke-static {v1, v4, v2, v4, v0}, Ljava/lang/System;->arraycopy(Ljava/lang/Object;ILjava/lang/Object;II)V

    .line 92
    invoke-virtual {p0}, Lorg/spongycastle/crypto/engines/Grainv1Engine;->reset()V

    .line 93
    return-void
.end method

.method public processBytes([BII[BI)I
    .registers 10

    .prologue
    .line 227
    iget-boolean v0, p0, Lorg/spongycastle/crypto/engines/Grainv1Engine;->initialised:Z

    if-nez v0, :cond_21

    .line 229
    new-instance v0, Ljava/lang/IllegalStateException;

    new-instance v1, Ljava/lang/StringBuilder;

    invoke-direct {v1}, Ljava/lang/StringBuilder;-><init>()V

    invoke-virtual {p0}, Lorg/spongycastle/crypto/engines/Grainv1Engine;->getAlgorithmName()Ljava/lang/String;

    move-result-object v2

    invoke-virtual {v1, v2}, Ljava/lang/StringBuilder;->append(Ljava/lang/String;)Ljava/lang/StringBuilder;

    move-result-object v1

    const-string v2, " not initialised"

    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/IllegalStateException;-><init>(Ljava/lang/String;)V

    throw v0

    .line 233
    :cond_21
    add-int v0, p2, p3

    array-length v1, p1

    if-le v0, v1, :cond_2e

    .line 235
    new-instance v0, Lorg/spongycastle/crypto/DataLengthException;

    const-string v1, "input buffer too short"

    invoke-direct {v0, v1}, Lorg/spongycastle/crypto/DataLengthException;-><init>(Ljava/lang/String;)V

    throw v0

    .line 238
    :cond_2e
    add-int v0, p5, p3

    array-length v1, p4

    if-le v0, v1, :cond_3b

    .line 240
    new-instance v0, Lorg/spongycastle/crypto/OutputLengthException;

    const-string v1, "output buffer too short"

    invoke-direct {v0, v1}, Lorg/spongycastle/crypto/OutputLengthException;-><init>(Ljava/lang/String;)V

    throw v0

    .line 243
    :cond_3b
    const/4 v0, 0x0

    :goto_3c
    if-ge v0, p3, :cond_4f

    .line 245
    add-int v1, p5, v0

    add-int v2, p2, v0

    aget-byte v2, p1, v2

    invoke-direct {p0}, Lorg/spongycastle/crypto/engines/Grainv1Engine;->getKeyStream()B

    move-result v3

    xor-int/2addr v2, v3

    int-to-byte v2, v2

    aput-byte v2, p4, v1

    .line 243
    add-int/lit8 v0, v0, 0x1

    goto :goto_3c

    .line 248
    :cond_4f
    return p3
.end method

.method public reset()V
    .registers 3

    .prologue
    .line 253
    const/4 v0, 0x2

    iput v0, p0, Lorg/spongycastle/crypto/engines/Grainv1Engine;->index:I

    .line 254
    iget-object v0, p0, Lorg/spongycastle/crypto/engines/Grainv1Engine;->workingKey:[B

    iget-object v1, p0, Lorg/spongycastle/crypto/engines/Grainv1Engine;->workingIV:[B

    invoke-direct {p0, v0, v1}, Lorg/spongycastle/crypto/engines/Grainv1Engine;->setKey([B[B)V

    .line 255
    invoke-direct {p0}, Lorg/spongycastle/crypto/engines/Grainv1Engine;->initGrain()V

    .line 256
    return-void
.end method

.method public returnByte(B)B
    .registers 5

    .prologue
    .line 273
    iget-boolean v0, p0, Lorg/spongycastle/crypto/engines/Grainv1Engine;->initialised:Z

    if-nez v0, :cond_21

    .line 275
    new-instance v0, Ljava/lang/IllegalStateException;

    new-instance v1, Ljava/lang/StringBuilder;

    invoke-direct {v1}, Ljava/lang/StringBuilder;-><init>()V

    invoke-virtual {p0}, Lorg/spongycastle/crypto/engines/Grainv1Engine;->getAlgorithmName()Ljava/lang/String;

    move-result-object v2

    invoke-virtual {v1, v2}, Ljava/lang/StringBuilder;->append(Ljava/lang/String;)Ljava/lang/StringBuilder;

    move-result-object v1

    const-string v2, " not initialised"

    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/IllegalStateException;-><init>(Ljava/lang/String;)V

    throw v0

    .line 278
    :cond_21
    invoke-direct {p0}, Lorg/spongycastle/crypto/engines/Grainv1Engine;->getKeyStream()B

    move-result v0

    xor-int/2addr v0, p1

    int-to-byte v0, v0

    return v0
.end method