RC6Engine.smali
.class public Lorg/spongycastle/crypto/engines/RC6Engine;
.super Ljava/lang/Object;
.source "RC6Engine.java"
# interfaces
.implements Lorg/spongycastle/crypto/BlockCipher;
# static fields
.field private static final LGW:I = 0x5
.field private static final P32:I = -0x481eae9d
.field private static final Q32:I = -0x61c88647
.field private static final _noRounds:I = 0x14
.field private static final bytesPerWord:I = 0x4
.field private static final wordSize:I = 0x20
# instance fields
.field private _S:[I
.field private forEncryption:Z
# direct methods
.method public constructor <init>()V
.registers 2
.prologue
.line 49
invoke-direct {p0}, Ljava/lang/Object;-><init>()V
.line 50
const/4 v0, 0x0
iput-object v0, p0, Lorg/spongycastle/crypto/engines/RC6Engine;->_S:[I
.line 51
return-void
.end method
.method private bytesToWord([BI)I
.registers 6
.prologue
.line 342
const/4 v1, 0x0
.line 344
const/4 v0, 0x3
:goto_2
if-ltz v0, :cond_10
.line 346
shl-int/lit8 v1, v1, 0x8
add-int v2, v0, p2
aget-byte v2, p1, v2
and-int/lit16 v2, v2, 0xff
add-int/2addr v1, v2
.line 344
add-int/lit8 v0, v0, -0x1
goto :goto_2
.line 349
:cond_10
return v1
.end method
.method private decryptBlock([BI[BI)I
.registers 16
.prologue
const/4 v9, 0x5
.line 254
invoke-direct {p0, p1, p2}, Lorg/spongycastle/crypto/engines/RC6Engine;->bytesToWord([BI)I
move-result v2
.line 255
add-int/lit8 v0, p2, 0x4
invoke-direct {p0, p1, v0}, Lorg/spongycastle/crypto/engines/RC6Engine;->bytesToWord([BI)I
move-result v1
.line 256
add-int/lit8 v0, p2, 0x8
invoke-direct {p0, p1, v0}, Lorg/spongycastle/crypto/engines/RC6Engine;->bytesToWord([BI)I
move-result v0
.line 257
add-int/lit8 v3, p2, 0xc
invoke-direct {p0, p1, v3}, Lorg/spongycastle/crypto/engines/RC6Engine;->bytesToWord([BI)I
move-result v4
.line 260
iget-object v3, p0, Lorg/spongycastle/crypto/engines/RC6Engine;->_S:[I
const/16 v5, 0x2b
aget v3, v3, v5
sub-int/2addr v0, v3
.line 261
iget-object v3, p0, Lorg/spongycastle/crypto/engines/RC6Engine;->_S:[I
const/16 v5, 0x2a
aget v3, v3, v5
sub-int/2addr v2, v3
.line 264
const/16 v3, 0x14
move v10, v3
move v3, v4
move v4, v10
:goto_2a
if-lez v4, :cond_60
.line 274
mul-int/lit8 v5, v2, 0x2
add-int/lit8 v5, v5, 0x1
mul-int/2addr v5, v2
.line 275
invoke-direct {p0, v5, v9}, Lorg/spongycastle/crypto/engines/RC6Engine;->rotateLeft(II)I
move-result v5
.line 277
mul-int/lit8 v6, v0, 0x2
add-int/lit8 v6, v6, 0x1
mul-int/2addr v6, v0
.line 278
invoke-direct {p0, v6, v9}, Lorg/spongycastle/crypto/engines/RC6Engine;->rotateLeft(II)I
move-result v6
.line 280
iget-object v7, p0, Lorg/spongycastle/crypto/engines/RC6Engine;->_S:[I
mul-int/lit8 v8, v4, 0x2
add-int/lit8 v8, v8, 0x1
aget v7, v7, v8
sub-int/2addr v1, v7
.line 281
invoke-direct {p0, v1, v5}, Lorg/spongycastle/crypto/engines/RC6Engine;->rotateRight(II)I
move-result v1
.line 282
xor-int/2addr v1, v6
.line 284
iget-object v7, p0, Lorg/spongycastle/crypto/engines/RC6Engine;->_S:[I
mul-int/lit8 v8, v4, 0x2
aget v7, v7, v8
sub-int/2addr v3, v7
.line 285
invoke-direct {p0, v3, v6}, Lorg/spongycastle/crypto/engines/RC6Engine;->rotateRight(II)I
move-result v3
.line 286
xor-int/2addr v3, v5
.line 264
add-int/lit8 v4, v4, -0x1
move v10, v1
move v1, v2
move v2, v3
move v3, v0
move v0, v10
goto :goto_2a
.line 290
:cond_60
iget-object v4, p0, Lorg/spongycastle/crypto/engines/RC6Engine;->_S:[I
const/4 v5, 0x1
aget v4, v4, v5
sub-int/2addr v3, v4
.line 291
iget-object v4, p0, Lorg/spongycastle/crypto/engines/RC6Engine;->_S:[I
const/4 v5, 0x0
aget v4, v4, v5
sub-int/2addr v1, v4
.line 293
invoke-direct {p0, v2, p3, p4}, Lorg/spongycastle/crypto/engines/RC6Engine;->wordToBytes(I[BI)V
.line 294
add-int/lit8 v2, p4, 0x4
invoke-direct {p0, v1, p3, v2}, Lorg/spongycastle/crypto/engines/RC6Engine;->wordToBytes(I[BI)V
.line 295
add-int/lit8 v1, p4, 0x8
invoke-direct {p0, v0, p3, v1}, Lorg/spongycastle/crypto/engines/RC6Engine;->wordToBytes(I[BI)V
.line 296
add-int/lit8 v0, p4, 0xc
invoke-direct {p0, v3, p3, v0}, Lorg/spongycastle/crypto/engines/RC6Engine;->wordToBytes(I[BI)V
.line 298
const/16 v0, 0x10
return v0
.end method
.method private encryptBlock([BI[BI)I
.registers 16
.prologue
const/4 v9, 0x5
const/4 v3, 0x1
.line 200
invoke-direct {p0, p1, p2}, Lorg/spongycastle/crypto/engines/RC6Engine;->bytesToWord([BI)I
move-result v2
.line 201
add-int/lit8 v0, p2, 0x4
invoke-direct {p0, p1, v0}, Lorg/spongycastle/crypto/engines/RC6Engine;->bytesToWord([BI)I
move-result v1
.line 202
add-int/lit8 v0, p2, 0x8
invoke-direct {p0, p1, v0}, Lorg/spongycastle/crypto/engines/RC6Engine;->bytesToWord([BI)I
move-result v0
.line 203
add-int/lit8 v4, p2, 0xc
invoke-direct {p0, p1, v4}, Lorg/spongycastle/crypto/engines/RC6Engine;->bytesToWord([BI)I
move-result v4
.line 206
iget-object v5, p0, Lorg/spongycastle/crypto/engines/RC6Engine;->_S:[I
const/4 v6, 0x0
aget v5, v5, v6
add-int/2addr v1, v5
.line 207
iget-object v5, p0, Lorg/spongycastle/crypto/engines/RC6Engine;->_S:[I
aget v5, v5, v3
add-int/2addr v4, v5
move v10, v1
move v1, v4
move v4, v3
move v3, v2
move v2, v10
.line 210
:goto_28
const/16 v5, 0x14
if-gt v4, v5, :cond_60
.line 214
mul-int/lit8 v5, v2, 0x2
add-int/lit8 v5, v5, 0x1
mul-int/2addr v5, v2
.line 215
invoke-direct {p0, v5, v9}, Lorg/spongycastle/crypto/engines/RC6Engine;->rotateLeft(II)I
move-result v6
.line 217
mul-int/lit8 v5, v1, 0x2
add-int/lit8 v5, v5, 0x1
mul-int/2addr v5, v1
.line 218
invoke-direct {p0, v5, v9}, Lorg/spongycastle/crypto/engines/RC6Engine;->rotateLeft(II)I
move-result v7
.line 220
xor-int/2addr v3, v6
.line 221
invoke-direct {p0, v3, v7}, Lorg/spongycastle/crypto/engines/RC6Engine;->rotateLeft(II)I
move-result v3
.line 222
iget-object v5, p0, Lorg/spongycastle/crypto/engines/RC6Engine;->_S:[I
mul-int/lit8 v8, v4, 0x2
aget v5, v5, v8
add-int/2addr v5, v3
.line 224
xor-int/2addr v0, v7
.line 225
invoke-direct {p0, v0, v6}, Lorg/spongycastle/crypto/engines/RC6Engine;->rotateLeft(II)I
move-result v0
.line 226
iget-object v3, p0, Lorg/spongycastle/crypto/engines/RC6Engine;->_S:[I
mul-int/lit8 v6, v4, 0x2
add-int/lit8 v6, v6, 0x1
aget v3, v3, v6
add-int/2addr v0, v3
.line 210
add-int/lit8 v3, v4, 0x1
move v4, v3
move v3, v2
move v2, v0
move v0, v1
move v1, v5
goto :goto_28
.line 235
:cond_60
iget-object v4, p0, Lorg/spongycastle/crypto/engines/RC6Engine;->_S:[I
const/16 v5, 0x2a
aget v4, v4, v5
add-int/2addr v3, v4
.line 236
iget-object v4, p0, Lorg/spongycastle/crypto/engines/RC6Engine;->_S:[I
const/16 v5, 0x2b
aget v4, v4, v5
add-int/2addr v0, v4
.line 239
invoke-direct {p0, v3, p3, p4}, Lorg/spongycastle/crypto/engines/RC6Engine;->wordToBytes(I[BI)V
.line 240
add-int/lit8 v3, p4, 0x4
invoke-direct {p0, v2, p3, v3}, Lorg/spongycastle/crypto/engines/RC6Engine;->wordToBytes(I[BI)V
.line 241
add-int/lit8 v2, p4, 0x8
invoke-direct {p0, v0, p3, v2}, Lorg/spongycastle/crypto/engines/RC6Engine;->wordToBytes(I[BI)V
.line 242
add-int/lit8 v0, p4, 0xc
invoke-direct {p0, v1, p3, v0}, Lorg/spongycastle/crypto/engines/RC6Engine;->wordToBytes(I[BI)V
.line 244
const/16 v0, 0x10
return v0
.end method
.method private rotateLeft(II)I
.registers 5
.prologue
.line 320
shl-int v0, p1, p2
neg-int v1, p2
ushr-int v1, p1, v1
or-int/2addr v0, v1
return v0
.end method
.method private rotateRight(II)I
.registers 5
.prologue
.line 335
ushr-int v0, p1, p2
neg-int v1, p2
shl-int v1, p1, v1
or-int/2addr v0, v1
return v0
.end method
.method private setKey([B)V
.registers 11
.prologue
const/4 v1, 0x0
.line 141
array-length v0, p1
add-int/lit8 v0, v0, 0x4
add-int/lit8 v0, v0, -0x1
div-int/lit8 v0, v0, 0x4
new-array v6, v0, [I
.line 144
array-length v0, p1
add-int/lit8 v0, v0, -0x1
:goto_d
if-ltz v0, :cond_21
.line 146
div-int/lit8 v2, v0, 0x4
div-int/lit8 v3, v0, 0x4
aget v3, v6, v3
shl-int/lit8 v3, v3, 0x8
aget-byte v4, p1, v0
and-int/lit16 v4, v4, 0xff
add-int/2addr v3, v4
aput v3, v6, v2
.line 144
add-int/lit8 v0, v0, -0x1
goto :goto_d
.line 156
:cond_21
const/16 v0, 0x2c
new-array v0, v0, [I
iput-object v0, p0, Lorg/spongycastle/crypto/engines/RC6Engine;->_S:[I
.line 158
iget-object v0, p0, Lorg/spongycastle/crypto/engines/RC6Engine;->_S:[I
const v2, -0x481eae9d
aput v2, v0, v1
.line 159
const/4 v0, 0x1
:goto_2f
iget-object v2, p0, Lorg/spongycastle/crypto/engines/RC6Engine;->_S:[I
array-length v2, v2
if-ge v0, v2, :cond_45
.line 161
iget-object v2, p0, Lorg/spongycastle/crypto/engines/RC6Engine;->_S:[I
iget-object v3, p0, Lorg/spongycastle/crypto/engines/RC6Engine;->_S:[I
add-int/lit8 v4, v0, -0x1
aget v3, v3, v4
const v4, -0x61c88647
add-int/2addr v3, v4
aput v3, v2, v0
.line 159
add-int/lit8 v0, v0, 0x1
goto :goto_2f
.line 171
:cond_45
array-length v0, v6
iget-object v2, p0, Lorg/spongycastle/crypto/engines/RC6Engine;->_S:[I
array-length v2, v2
if-le v0, v2, :cond_7b
.line 173
array-length v0, v6
mul-int/lit8 v0, v0, 0x3
:goto_4e
move v2, v1
move v3, v1
move v4, v1
move v5, v1
.line 184
:goto_52
if-ge v1, v0, :cond_81
.line 186
iget-object v7, p0, Lorg/spongycastle/crypto/engines/RC6Engine;->_S:[I
iget-object v8, p0, Lorg/spongycastle/crypto/engines/RC6Engine;->_S:[I
aget v8, v8, v3
add-int/2addr v5, v8
add-int/2addr v5, v4
const/4 v8, 0x3
invoke-direct {p0, v5, v8}, Lorg/spongycastle/crypto/engines/RC6Engine;->rotateLeft(II)I
move-result v5
aput v5, v7, v3
.line 187
aget v7, v6, v2
add-int/2addr v7, v5
add-int/2addr v7, v4
add-int/2addr v4, v5
invoke-direct {p0, v7, v4}, Lorg/spongycastle/crypto/engines/RC6Engine;->rotateLeft(II)I
move-result v4
aput v4, v6, v2
.line 188
add-int/lit8 v3, v3, 0x1
iget-object v7, p0, Lorg/spongycastle/crypto/engines/RC6Engine;->_S:[I
array-length v7, v7
rem-int/2addr v3, v7
.line 189
add-int/lit8 v2, v2, 0x1
array-length v7, v6
rem-int/2addr v2, v7
.line 184
add-int/lit8 v1, v1, 0x1
goto :goto_52
.line 177
:cond_7b
iget-object v0, p0, Lorg/spongycastle/crypto/engines/RC6Engine;->_S:[I
array-length v0, v0
mul-int/lit8 v0, v0, 0x3
goto :goto_4e
.line 191
:cond_81
return-void
.end method
.method private wordToBytes(I[BI)V
.registers 7
.prologue
.line 357
const/4 v0, 0x0
:goto_1
const/4 v1, 0x4
if-ge v0, v1, :cond_e
.line 359
add-int v1, v0, p3
int-to-byte v2, p1
aput-byte v2, p2, v1
.line 360
ushr-int/lit8 p1, p1, 0x8
.line 357
add-int/lit8 v0, v0, 0x1
goto :goto_1
.line 362
:cond_e
return-void
.end method
# virtual methods
.method public getAlgorithmName()Ljava/lang/String;
.registers 2
.prologue
.line 55
const-string v0, "RC6"
return-object v0
.end method
.method public getBlockSize()I
.registers 2
.prologue
.line 60
const/16 v0, 0x10
return v0
.end method
.method public init(ZLorg/spongycastle/crypto/CipherParameters;)V
.registers 6
.prologue
.line 75
instance-of v0, p2, Lorg/spongycastle/crypto/params/KeyParameter;
if-nez v0, :cond_21
.line 77
new-instance v0, Ljava/lang/IllegalArgumentException;
new-instance v1, Ljava/lang/StringBuilder;
const-string v2, "invalid parameter passed to RC6 init - "
invoke-direct {v1, v2}, Ljava/lang/StringBuilder;-><init>(Ljava/lang/String;)V
invoke-virtual {p2}, Ljava/lang/Object;->getClass()Ljava/lang/Class;
move-result-object v2
invoke-virtual {v2}, Ljava/lang/Class;->getName()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
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 80
:cond_21
check-cast p2, Lorg/spongycastle/crypto/params/KeyParameter;
.line 81
iput-boolean p1, p0, Lorg/spongycastle/crypto/engines/RC6Engine;->forEncryption:Z
.line 82
invoke-virtual {p2}, Lorg/spongycastle/crypto/params/KeyParameter;->getKey()[B
move-result-object v0
invoke-direct {p0, v0}, Lorg/spongycastle/crypto/engines/RC6Engine;->setKey([B)V
.line 83
return-void
.end method
.method public processBlock([BI[BI)I
.registers 8
.prologue
.line 91
invoke-virtual {p0}, Lorg/spongycastle/crypto/engines/RC6Engine;->getBlockSize()I
move-result v0
.line 92
iget-object v1, p0, Lorg/spongycastle/crypto/engines/RC6Engine;->_S:[I
if-nez v1, :cond_10
.line 94
new-instance v0, Ljava/lang/IllegalStateException;
const-string v1, "RC6 engine not initialised"
invoke-direct {v0, v1}, Ljava/lang/IllegalStateException;-><init>(Ljava/lang/String;)V
throw v0
.line 96
:cond_10
add-int v1, p2, v0
array-length v2, p1
if-le v1, v2, :cond_1d
.line 98
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 100
:cond_1d
add-int/2addr v0, p4
array-length v1, p3
if-le v0, v1, :cond_29
.line 102
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 105
:cond_29
iget-boolean v0, p0, Lorg/spongycastle/crypto/engines/RC6Engine;->forEncryption:Z
if-eqz v0, :cond_32
.line 106
invoke-direct {p0, p1, p2, p3, p4}, Lorg/spongycastle/crypto/engines/RC6Engine;->encryptBlock([BI[BI)I
move-result v0
.line 107
:goto_31
return v0
:cond_32
invoke-direct {p0, p1, p2, p3, p4}, Lorg/spongycastle/crypto/engines/RC6Engine;->decryptBlock([BI[BI)I
move-result v0
goto :goto_31
.end method
.method public reset()V
.registers 1
.prologue
.line 112
return-void
.end method