CTRSP800DRBG.smali
.class public Lorg/spongycastle/crypto/prng/drbg/CTRSP800DRBG;
.super Ljava/lang/Object;
.source "CTRSP800DRBG.java"
# interfaces
.implements Lorg/spongycastle/crypto/prng/drbg/SP80090DRBG;
# static fields
.field private static final AES_MAX_BITS_REQUEST:I = 0x40000
.field private static final AES_RESEED_MAX:J = 0x800000000000L
.field private static final K_BITS:[B
.field private static final TDEA_MAX_BITS_REQUEST:I = 0x1000
.field private static final TDEA_RESEED_MAX:J = 0x80000000L
# instance fields
.field private _Key:[B
.field private _V:[B
.field private _engine:Lorg/spongycastle/crypto/BlockCipher;
.field private _entropySource:Lorg/spongycastle/crypto/prng/EntropySource;
.field private _isTDEA:Z
.field private _keySizeInBits:I
.field private _reseedCounter:J
.field private _securityStrength:I
.field private _seedLength:I
# direct methods
.method static constructor <clinit>()V
.registers 1
.prologue
.line 160
const-string v0, "000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F"
invoke-static {v0}, Lorg/spongycastle/util/encoders/Hex;->decode(Ljava/lang/String;)[B
move-result-object v0
sput-object v0, Lorg/spongycastle/crypto/prng/drbg/CTRSP800DRBG;->K_BITS:[B
return-void
.end method
.method public constructor <init>(Lorg/spongycastle/crypto/BlockCipher;IILorg/spongycastle/crypto/prng/EntropySource;[B[B)V
.registers 9
.prologue
.line 45
invoke-direct {p0}, Ljava/lang/Object;-><init>()V
.line 29
const-wide/16 v0, 0x0
iput-wide v0, p0, Lorg/spongycastle/crypto/prng/drbg/CTRSP800DRBG;->_reseedCounter:J
.line 30
const/4 v0, 0x0
iput-boolean v0, p0, Lorg/spongycastle/crypto/prng/drbg/CTRSP800DRBG;->_isTDEA:Z
.line 46
iput-object p4, p0, Lorg/spongycastle/crypto/prng/drbg/CTRSP800DRBG;->_entropySource:Lorg/spongycastle/crypto/prng/EntropySource;
.line 47
iput-object p1, p0, Lorg/spongycastle/crypto/prng/drbg/CTRSP800DRBG;->_engine:Lorg/spongycastle/crypto/BlockCipher;
.line 49
iput p2, p0, Lorg/spongycastle/crypto/prng/drbg/CTRSP800DRBG;->_keySizeInBits:I
.line 50
iput p3, p0, Lorg/spongycastle/crypto/prng/drbg/CTRSP800DRBG;->_securityStrength:I
.line 51
invoke-interface {p1}, Lorg/spongycastle/crypto/BlockCipher;->getBlockSize()I
move-result v0
shl-int/lit8 v0, v0, 0x3
add-int/2addr v0, p2
iput v0, p0, Lorg/spongycastle/crypto/prng/drbg/CTRSP800DRBG;->_seedLength:I
.line 52
invoke-direct {p0, p1}, Lorg/spongycastle/crypto/prng/drbg/CTRSP800DRBG;->isTDEA(Lorg/spongycastle/crypto/BlockCipher;)Z
move-result v0
iput-boolean v0, p0, Lorg/spongycastle/crypto/prng/drbg/CTRSP800DRBG;->_isTDEA:Z
.line 54
const/16 v0, 0x100
if-le p3, v0, :cond_2d
.line 56
new-instance v0, Ljava/lang/IllegalArgumentException;
const-string v1, "Requested security strength is not supported by the derivation function"
invoke-direct {v0, v1}, Ljava/lang/IllegalArgumentException;-><init>(Ljava/lang/String;)V
throw v0
.line 59
:cond_2d
invoke-direct {p0, p1, p2}, Lorg/spongycastle/crypto/prng/drbg/CTRSP800DRBG;->getMaxSecurityStrength(Lorg/spongycastle/crypto/BlockCipher;I)I
move-result v0
if-ge v0, p3, :cond_3b
.line 61
new-instance v0, Ljava/lang/IllegalArgumentException;
const-string v1, "Requested security strength is not supported by block cipher and key size"
invoke-direct {v0, v1}, Ljava/lang/IllegalArgumentException;-><init>(Ljava/lang/String;)V
throw v0
.line 64
:cond_3b
invoke-interface {p4}, Lorg/spongycastle/crypto/prng/EntropySource;->entropySize()I
move-result v0
if-ge v0, p3, :cond_49
.line 66
new-instance v0, Ljava/lang/IllegalArgumentException;
const-string v1, "Not enough entropy for security strength required"
invoke-direct {v0, v1}, Ljava/lang/IllegalArgumentException;-><init>(Ljava/lang/String;)V
throw v0
.line 69
:cond_49
invoke-direct {p0}, Lorg/spongycastle/crypto/prng/drbg/CTRSP800DRBG;->getEntropy()[B
move-result-object v0
.line 71
invoke-direct {p0, v0, p6, p5}, Lorg/spongycastle/crypto/prng/drbg/CTRSP800DRBG;->CTR_DRBG_Instantiate_algorithm([B[B[B)V
.line 72
return-void
.end method
.method private BCC([B[B[B[B)V
.registers 14
.prologue
const/4 v1, 0x0
.line 297
iget-object v0, p0, Lorg/spongycastle/crypto/prng/drbg/CTRSP800DRBG;->_engine:Lorg/spongycastle/crypto/BlockCipher;
invoke-interface {v0}, Lorg/spongycastle/crypto/BlockCipher;->getBlockSize()I
move-result v2
.line 298
new-array v3, v2, [B
.line 299
array-length v0, p4
div-int v4, v0, v2
.line 301
new-array v5, v2, [B
.line 303
iget-object v0, p0, Lorg/spongycastle/crypto/prng/drbg/CTRSP800DRBG;->_engine:Lorg/spongycastle/crypto/BlockCipher;
const/4 v6, 0x1
new-instance v7, Lorg/spongycastle/crypto/params/KeyParameter;
invoke-virtual {p0, p2}, Lorg/spongycastle/crypto/prng/drbg/CTRSP800DRBG;->expandKey([B)[B
move-result-object v8
invoke-direct {v7, v8}, Lorg/spongycastle/crypto/params/KeyParameter;-><init>([B)V
invoke-interface {v0, v6, v7}, Lorg/spongycastle/crypto/BlockCipher;->init(ZLorg/spongycastle/crypto/CipherParameters;)V
.line 305
iget-object v0, p0, Lorg/spongycastle/crypto/prng/drbg/CTRSP800DRBG;->_engine:Lorg/spongycastle/crypto/BlockCipher;
invoke-interface {v0, p3, v1, v3, v1}, Lorg/spongycastle/crypto/BlockCipher;->processBlock([BI[BI)I
move v0, v1
.line 307
:goto_23
if-ge v0, v4, :cond_32
.line 309
mul-int v6, v0, v2
invoke-direct {p0, v5, v3, p4, v6}, Lorg/spongycastle/crypto/prng/drbg/CTRSP800DRBG;->XOR([B[B[BI)V
.line 310
iget-object v6, p0, Lorg/spongycastle/crypto/prng/drbg/CTRSP800DRBG;->_engine:Lorg/spongycastle/crypto/BlockCipher;
invoke-interface {v6, v5, v1, v3, v1}, Lorg/spongycastle/crypto/BlockCipher;->processBlock([BI[BI)I
.line 307
add-int/lit8 v0, v0, 0x1
goto :goto_23
.line 313
:cond_32
array-length v0, p1
invoke-static {v3, v1, p1, v1, v0}, Ljava/lang/System;->arraycopy(Ljava/lang/Object;ILjava/lang/Object;II)V
.line 314
return-void
.end method
.method private Block_Cipher_df([BI)[B
.registers 14
.prologue
const/4 v1, 0x0
.line 224
iget-object v0, p0, Lorg/spongycastle/crypto/prng/drbg/CTRSP800DRBG;->_engine:Lorg/spongycastle/crypto/BlockCipher;
invoke-interface {v0}, Lorg/spongycastle/crypto/BlockCipher;->getBlockSize()I
move-result v3
.line 225
array-length v0, p1
.line 226
div-int/lit8 v2, p2, 0x8
.line 228
add-int/lit8 v4, v0, 0x8
add-int/lit8 v4, v4, 0x1
.line 229
add-int/2addr v4, v3
add-int/lit8 v4, v4, -0x1
div-int/2addr v4, v3
mul-int/2addr v4, v3
.line 230
new-array v4, v4, [B
.line 231
invoke-direct {p0, v4, v0, v1}, Lorg/spongycastle/crypto/prng/drbg/CTRSP800DRBG;->copyIntToByteArray([BII)V
.line 232
const/4 v5, 0x4
invoke-direct {p0, v4, v2, v5}, Lorg/spongycastle/crypto/prng/drbg/CTRSP800DRBG;->copyIntToByteArray([BII)V
.line 233
const/16 v2, 0x8
invoke-static {p1, v1, v4, v2, v0}, Ljava/lang/System;->arraycopy(Ljava/lang/Object;ILjava/lang/Object;II)V
.line 234
add-int/lit8 v0, v0, 0x8
const/16 v2, -0x80
aput-byte v2, v4, v0
.line 237
iget v0, p0, Lorg/spongycastle/crypto/prng/drbg/CTRSP800DRBG;->_keySizeInBits:I
div-int/lit8 v0, v0, 0x8
add-int/2addr v0, v3
new-array v5, v0, [B
.line 238
new-array v6, v3, [B
.line 240
new-array v7, v3, [B
.line 243
iget v0, p0, Lorg/spongycastle/crypto/prng/drbg/CTRSP800DRBG;->_keySizeInBits:I
div-int/lit8 v0, v0, 0x8
new-array v8, v0, [B
.line 244
sget-object v0, Lorg/spongycastle/crypto/prng/drbg/CTRSP800DRBG;->K_BITS:[B
array-length v2, v8
invoke-static {v0, v1, v8, v1, v2}, Ljava/lang/System;->arraycopy(Ljava/lang/Object;ILjava/lang/Object;II)V
move v0, v1
.line 246
:goto_3f
mul-int v2, v0, v3
shl-int/lit8 v2, v2, 0x3
iget v9, p0, Lorg/spongycastle/crypto/prng/drbg/CTRSP800DRBG;->_keySizeInBits:I
shl-int/lit8 v10, v3, 0x3
add-int/2addr v9, v10
if-ge v2, v9, :cond_64
.line 248
invoke-direct {p0, v7, v0, v1}, Lorg/spongycastle/crypto/prng/drbg/CTRSP800DRBG;->copyIntToByteArray([BII)V
.line 249
invoke-direct {p0, v6, v8, v7, v4}, Lorg/spongycastle/crypto/prng/drbg/CTRSP800DRBG;->BCC([B[B[B[B)V
.line 251
array-length v2, v5
mul-int v9, v0, v3
sub-int/2addr v2, v9
if-le v2, v3, :cond_5f
move v2, v3
.line 255
:goto_57
mul-int v9, v0, v3
invoke-static {v6, v1, v5, v9, v2}, Ljava/lang/System;->arraycopy(Ljava/lang/Object;ILjava/lang/Object;II)V
.line 256
add-int/lit8 v0, v0, 0x1
.line 257
goto :goto_3f
.line 251
:cond_5f
array-length v2, v5
mul-int v9, v0, v3
sub-int/2addr v2, v9
goto :goto_57
.line 259
:cond_64
new-array v4, v3, [B
.line 260
array-length v0, v8
invoke-static {v5, v1, v8, v1, v0}, Ljava/lang/System;->arraycopy(Ljava/lang/Object;ILjava/lang/Object;II)V
.line 261
array-length v0, v8
invoke-static {v5, v0, v4, v1, v3}, Ljava/lang/System;->arraycopy(Ljava/lang/Object;ILjava/lang/Object;II)V
.line 263
div-int/lit8 v0, p2, 0x2
new-array v5, v0, [B
.line 266
iget-object v0, p0, Lorg/spongycastle/crypto/prng/drbg/CTRSP800DRBG;->_engine:Lorg/spongycastle/crypto/BlockCipher;
const/4 v2, 0x1
new-instance v6, Lorg/spongycastle/crypto/params/KeyParameter;
invoke-virtual {p0, v8}, Lorg/spongycastle/crypto/prng/drbg/CTRSP800DRBG;->expandKey([B)[B
move-result-object v7
invoke-direct {v6, v7}, Lorg/spongycastle/crypto/params/KeyParameter;-><init>([B)V
invoke-interface {v0, v2, v6}, Lorg/spongycastle/crypto/BlockCipher;->init(ZLorg/spongycastle/crypto/CipherParameters;)V
move v0, v1
.line 268
:goto_82
mul-int v2, v0, v3
array-length v6, v5
if-ge v2, v6, :cond_a0
.line 270
iget-object v2, p0, Lorg/spongycastle/crypto/prng/drbg/CTRSP800DRBG;->_engine:Lorg/spongycastle/crypto/BlockCipher;
invoke-interface {v2, v4, v1, v4, v1}, Lorg/spongycastle/crypto/BlockCipher;->processBlock([BI[BI)I
.line 272
array-length v2, v5
mul-int v6, v0, v3
sub-int/2addr v2, v6
if-le v2, v3, :cond_9b
move v2, v3
.line 276
:goto_93
mul-int v6, v0, v3
invoke-static {v4, v1, v5, v6, v2}, Ljava/lang/System;->arraycopy(Ljava/lang/Object;ILjava/lang/Object;II)V
.line 277
add-int/lit8 v0, v0, 0x1
.line 278
goto :goto_82
.line 272
:cond_9b
array-length v2, v5
mul-int v6, v0, v3
sub-int/2addr v2, v6
goto :goto_93
.line 280
:cond_a0
return-object v5
.end method
.method private CTR_DRBG_Instantiate_algorithm([B[B[B)V
.registers 7
.prologue
.line 77
invoke-static {p1, p2, p3}, Lorg/spongycastle/util/Arrays;->concatenate([B[B[B)[B
move-result-object v0
.line 78
iget v1, p0, Lorg/spongycastle/crypto/prng/drbg/CTRSP800DRBG;->_seedLength:I
invoke-direct {p0, v0, v1}, Lorg/spongycastle/crypto/prng/drbg/CTRSP800DRBG;->Block_Cipher_df([BI)[B
move-result-object v0
.line 80
iget-object v1, p0, Lorg/spongycastle/crypto/prng/drbg/CTRSP800DRBG;->_engine:Lorg/spongycastle/crypto/BlockCipher;
invoke-interface {v1}, Lorg/spongycastle/crypto/BlockCipher;->getBlockSize()I
move-result v1
.line 82
iget v2, p0, Lorg/spongycastle/crypto/prng/drbg/CTRSP800DRBG;->_keySizeInBits:I
add-int/lit8 v2, v2, 0x7
div-int/lit8 v2, v2, 0x8
new-array v2, v2, [B
iput-object v2, p0, Lorg/spongycastle/crypto/prng/drbg/CTRSP800DRBG;->_Key:[B
.line 83
new-array v1, v1, [B
iput-object v1, p0, Lorg/spongycastle/crypto/prng/drbg/CTRSP800DRBG;->_V:[B
.line 86
iget-object v1, p0, Lorg/spongycastle/crypto/prng/drbg/CTRSP800DRBG;->_Key:[B
iget-object v2, p0, Lorg/spongycastle/crypto/prng/drbg/CTRSP800DRBG;->_V:[B
invoke-direct {p0, v0, v1, v2}, Lorg/spongycastle/crypto/prng/drbg/CTRSP800DRBG;->CTR_DRBG_Update([B[B[B)V
.line 88
const-wide/16 v0, 0x1
iput-wide v0, p0, Lorg/spongycastle/crypto/prng/drbg/CTRSP800DRBG;->_reseedCounter:J
.line 89
return-void
.end method
.method private CTR_DRBG_Reseed_algorithm([B)V
.registers 5
.prologue
.line 120
invoke-direct {p0}, Lorg/spongycastle/crypto/prng/drbg/CTRSP800DRBG;->getEntropy()[B
move-result-object v0
invoke-static {v0, p1}, Lorg/spongycastle/util/Arrays;->concatenate([B[B)[B
move-result-object v0
.line 122
iget v1, p0, Lorg/spongycastle/crypto/prng/drbg/CTRSP800DRBG;->_seedLength:I
invoke-direct {p0, v0, v1}, Lorg/spongycastle/crypto/prng/drbg/CTRSP800DRBG;->Block_Cipher_df([BI)[B
move-result-object v0
.line 124
iget-object v1, p0, Lorg/spongycastle/crypto/prng/drbg/CTRSP800DRBG;->_Key:[B
iget-object v2, p0, Lorg/spongycastle/crypto/prng/drbg/CTRSP800DRBG;->_V:[B
invoke-direct {p0, v0, v1, v2}, Lorg/spongycastle/crypto/prng/drbg/CTRSP800DRBG;->CTR_DRBG_Update([B[B[B)V
.line 126
const-wide/16 v0, 0x1
iput-wide v0, p0, Lorg/spongycastle/crypto/prng/drbg/CTRSP800DRBG;->_reseedCounter:J
.line 127
return-void
.end method
.method private CTR_DRBG_Update([B[B[B)V
.registers 12
.prologue
const/4 v1, 0x0
.line 93
array-length v0, p1
new-array v4, v0, [B
.line 94
iget-object v0, p0, Lorg/spongycastle/crypto/prng/drbg/CTRSP800DRBG;->_engine:Lorg/spongycastle/crypto/BlockCipher;
invoke-interface {v0}, Lorg/spongycastle/crypto/BlockCipher;->getBlockSize()I
move-result v0
new-array v5, v0, [B
.line 97
iget-object v0, p0, Lorg/spongycastle/crypto/prng/drbg/CTRSP800DRBG;->_engine:Lorg/spongycastle/crypto/BlockCipher;
invoke-interface {v0}, Lorg/spongycastle/crypto/BlockCipher;->getBlockSize()I
move-result v3
.line 99
iget-object v0, p0, Lorg/spongycastle/crypto/prng/drbg/CTRSP800DRBG;->_engine:Lorg/spongycastle/crypto/BlockCipher;
const/4 v2, 0x1
new-instance v6, Lorg/spongycastle/crypto/params/KeyParameter;
invoke-virtual {p0, p2}, Lorg/spongycastle/crypto/prng/drbg/CTRSP800DRBG;->expandKey([B)[B
move-result-object v7
invoke-direct {v6, v7}, Lorg/spongycastle/crypto/params/KeyParameter;-><init>([B)V
invoke-interface {v0, v2, v6}, Lorg/spongycastle/crypto/BlockCipher;->init(ZLorg/spongycastle/crypto/CipherParameters;)V
move v0, v1
.line 100
:goto_22
mul-int v2, v0, v3
array-length v6, p1
if-ge v2, v6, :cond_43
.line 102
invoke-direct {p0, p3}, Lorg/spongycastle/crypto/prng/drbg/CTRSP800DRBG;->addOneTo([B)V
.line 103
iget-object v2, p0, Lorg/spongycastle/crypto/prng/drbg/CTRSP800DRBG;->_engine:Lorg/spongycastle/crypto/BlockCipher;
invoke-interface {v2, p3, v1, v5, v1}, Lorg/spongycastle/crypto/BlockCipher;->processBlock([BI[BI)I
.line 105
array-length v2, v4
mul-int v6, v0, v3
sub-int/2addr v2, v6
if-le v2, v3, :cond_3e
move v2, v3
.line 108
:goto_36
mul-int v6, v0, v3
invoke-static {v5, v1, v4, v6, v2}, Ljava/lang/System;->arraycopy(Ljava/lang/Object;ILjava/lang/Object;II)V
.line 109
add-int/lit8 v0, v0, 0x1
.line 110
goto :goto_22
.line 105
:cond_3e
array-length v2, v4
mul-int v6, v0, v3
sub-int/2addr v2, v6
goto :goto_36
.line 112
:cond_43
invoke-direct {p0, v4, p1, v4, v1}, Lorg/spongycastle/crypto/prng/drbg/CTRSP800DRBG;->XOR([B[B[BI)V
.line 114
array-length v0, p2
invoke-static {v4, v1, p2, v1, v0}, Ljava/lang/System;->arraycopy(Ljava/lang/Object;ILjava/lang/Object;II)V
.line 115
array-length v0, p2
array-length v2, p3
invoke-static {v4, v0, p3, v1, v2}, Ljava/lang/System;->arraycopy(Ljava/lang/Object;ILjava/lang/Object;II)V
.line 116
return-void
.end method
.method private XOR([B[B[BI)V
.registers 8
.prologue
.line 131
const/4 v0, 0x0
:goto_1
array-length v1, p1
if-ge v0, v1, :cond_11
.line 133
aget-byte v1, p2, v0
add-int v2, v0, p4
aget-byte v2, p3, v2
xor-int/2addr v1, v2
int-to-byte v1, v1
aput-byte v1, p1, v0
.line 131
add-int/lit8 v0, v0, 0x1
goto :goto_1
.line 135
:cond_11
return-void
.end method
.method private addOneTo([B)V
.registers 7
.prologue
const/4 v1, 0x1
.line 139
move v0, v1
move v2, v1
.line 140
:goto_3
array-length v3, p1
if-gt v0, v3, :cond_1c
.line 142
array-length v3, p1
sub-int/2addr v3, v0
aget-byte v3, p1, v3
and-int/lit16 v3, v3, 0xff
add-int/2addr v3, v2
.line 143
const/16 v2, 0xff
if-le v3, v2, :cond_1a
move v2, v1
.line 144
:goto_12
array-length v4, p1
sub-int/2addr v4, v0
int-to-byte v3, v3
aput-byte v3, p1, v4
.line 140
add-int/lit8 v0, v0, 0x1
goto :goto_3
.line 143
:cond_1a
const/4 v2, 0x0
goto :goto_12
.line 146
:cond_1c
return-void
.end method
.method private copyIntToByteArray([BII)V
.registers 6
.prologue
.line 318
shr-int/lit8 v0, p2, 0x18
aput-byte v0, p1, p3
.line 319
add-int/lit8 v0, p3, 0x1
shr-int/lit8 v1, p2, 0x10
int-to-byte v1, v1
aput-byte v1, p1, v0
.line 320
add-int/lit8 v0, p3, 0x2
shr-int/lit8 v1, p2, 0x8
int-to-byte v1, v1
aput-byte v1, p1, v0
.line 321
add-int/lit8 v0, p3, 0x3
int-to-byte v1, p2
aput-byte v1, p1, v0
.line 322
return-void
.end method
.method private getEntropy()[B
.registers 4
.prologue
.line 150
iget-object v0, p0, Lorg/spongycastle/crypto/prng/drbg/CTRSP800DRBG;->_entropySource:Lorg/spongycastle/crypto/prng/EntropySource;
invoke-interface {v0}, Lorg/spongycastle/crypto/prng/EntropySource;->getEntropy()[B
move-result-object v0
.line 151
array-length v1, v0
iget v2, p0, Lorg/spongycastle/crypto/prng/drbg/CTRSP800DRBG;->_securityStrength:I
add-int/lit8 v2, v2, 0x7
div-int/lit8 v2, v2, 0x8
if-ge v1, v2, :cond_17
.line 153
new-instance v0, Ljava/lang/IllegalStateException;
const-string v1, "Insufficient entropy provided by entropy source"
invoke-direct {v0, v1}, Ljava/lang/IllegalStateException;-><init>(Ljava/lang/String;)V
throw v0
.line 155
:cond_17
return-object v0
.end method
.method private getMaxSecurityStrength(Lorg/spongycastle/crypto/BlockCipher;I)I
.registers 5
.prologue
.line 430
invoke-direct {p0, p1}, Lorg/spongycastle/crypto/prng/drbg/CTRSP800DRBG;->isTDEA(Lorg/spongycastle/crypto/BlockCipher;)Z
move-result v0
if-eqz v0, :cond_d
const/16 v0, 0xa8
if-ne p2, v0, :cond_d
.line 432
const/16 p2, 0x70
.line 439
:cond_c
:goto_c
return p2
.line 434
:cond_d
invoke-interface {p1}, Lorg/spongycastle/crypto/BlockCipher;->getAlgorithmName()Ljava/lang/String;
move-result-object v0
const-string v1, "AES"
invoke-virtual {v0, v1}, Ljava/lang/String;->equals(Ljava/lang/Object;)Z
move-result v0
if-nez v0, :cond_c
.line 439
const/4 p2, -0x1
goto :goto_c
.end method
.method private isTDEA(Lorg/spongycastle/crypto/BlockCipher;)Z
.registers 4
.prologue
.line 425
invoke-interface {p1}, Lorg/spongycastle/crypto/BlockCipher;->getAlgorithmName()Ljava/lang/String;
move-result-object v0
const-string v1, "DESede"
invoke-virtual {v0, v1}, Ljava/lang/String;->equals(Ljava/lang/Object;)Z
move-result v0
if-nez v0, :cond_18
invoke-interface {p1}, Lorg/spongycastle/crypto/BlockCipher;->getAlgorithmName()Ljava/lang/String;
move-result-object v0
const-string v1, "TDEA"
invoke-virtual {v0, v1}, Ljava/lang/String;->equals(Ljava/lang/Object;)Z
move-result v0
if-eqz v0, :cond_1a
:cond_18
const/4 v0, 0x1
:goto_19
return v0
:cond_1a
const/4 v0, 0x0
goto :goto_19
.end method
.method private padKey([BI[BI)V
.registers 10
.prologue
.line 471
aget-byte v0, p1, p2
and-int/lit16 v0, v0, 0xfe
int-to-byte v0, v0
aput-byte v0, p3, p4
.line 472
add-int/lit8 v0, p4, 0x1
aget-byte v1, p1, p2
shl-int/lit8 v1, v1, 0x7
add-int/lit8 v2, p2, 0x1
aget-byte v2, p1, v2
and-int/lit16 v2, v2, 0xfc
ushr-int/lit8 v2, v2, 0x1
or-int/2addr v1, v2
int-to-byte v1, v1
aput-byte v1, p3, v0
.line 473
add-int/lit8 v0, p4, 0x2
add-int/lit8 v1, p2, 0x1
aget-byte v1, p1, v1
shl-int/lit8 v1, v1, 0x6
add-int/lit8 v2, p2, 0x2
aget-byte v2, p1, v2
and-int/lit16 v2, v2, 0xf8
ushr-int/lit8 v2, v2, 0x2
or-int/2addr v1, v2
int-to-byte v1, v1
aput-byte v1, p3, v0
.line 474
add-int/lit8 v0, p4, 0x3
add-int/lit8 v1, p2, 0x2
aget-byte v1, p1, v1
shl-int/lit8 v1, v1, 0x5
add-int/lit8 v2, p2, 0x3
aget-byte v2, p1, v2
and-int/lit16 v2, v2, 0xf0
ushr-int/lit8 v2, v2, 0x3
or-int/2addr v1, v2
int-to-byte v1, v1
aput-byte v1, p3, v0
.line 475
add-int/lit8 v0, p4, 0x4
add-int/lit8 v1, p2, 0x3
aget-byte v1, p1, v1
shl-int/lit8 v1, v1, 0x4
add-int/lit8 v2, p2, 0x4
aget-byte v2, p1, v2
and-int/lit16 v2, v2, 0xe0
ushr-int/lit8 v2, v2, 0x4
or-int/2addr v1, v2
int-to-byte v1, v1
aput-byte v1, p3, v0
.line 476
add-int/lit8 v0, p4, 0x5
add-int/lit8 v1, p2, 0x4
aget-byte v1, p1, v1
shl-int/lit8 v1, v1, 0x3
add-int/lit8 v2, p2, 0x5
aget-byte v2, p1, v2
and-int/lit16 v2, v2, 0xc0
ushr-int/lit8 v2, v2, 0x5
or-int/2addr v1, v2
int-to-byte v1, v1
aput-byte v1, p3, v0
.line 477
add-int/lit8 v0, p4, 0x6
add-int/lit8 v1, p2, 0x5
aget-byte v1, p1, v1
shl-int/lit8 v1, v1, 0x2
add-int/lit8 v2, p2, 0x6
aget-byte v2, p1, v2
and-int/lit16 v2, v2, 0x80
ushr-int/lit8 v2, v2, 0x6
or-int/2addr v1, v2
int-to-byte v1, v1
aput-byte v1, p3, v0
.line 478
add-int/lit8 v0, p4, 0x7
add-int/lit8 v1, p2, 0x6
aget-byte v1, p1, v1
shl-int/lit8 v1, v1, 0x1
int-to-byte v1, v1
aput-byte v1, p3, v0
move v0, p4
.line 480
:goto_89
add-int/lit8 v1, p4, 0x7
if-gt v0, v1, :cond_b0
.line 482
aget-byte v1, p3, v0
.line 483
and-int/lit16 v2, v1, 0xfe
shr-int/lit8 v3, v1, 0x1
shr-int/lit8 v4, v1, 0x2
xor-int/2addr v3, v4
shr-int/lit8 v4, v1, 0x3
xor-int/2addr v3, v4
shr-int/lit8 v4, v1, 0x4
xor-int/2addr v3, v4
shr-int/lit8 v4, v1, 0x5
xor-int/2addr v3, v4
shr-int/lit8 v4, v1, 0x6
xor-int/2addr v3, v4
shr-int/lit8 v1, v1, 0x7
xor-int/2addr v1, v3
xor-int/lit8 v1, v1, 0x1
and-int/lit8 v1, v1, 0x1
or-int/2addr v1, v2
int-to-byte v1, v1
aput-byte v1, p3, v0
.line 480
add-int/lit8 v0, v0, 0x1
goto :goto_89
.line 492
:cond_b0
return-void
.end method
# virtual methods
.method expandKey([B)[B
.registers 5
.prologue
const/4 v1, 0x0
.line 444
iget-boolean v0, p0, Lorg/spongycastle/crypto/prng/drbg/CTRSP800DRBG;->_isTDEA:Z
if-eqz v0, :cond_1a
.line 447
const/16 v0, 0x18
new-array v0, v0, [B
.line 449
invoke-direct {p0, p1, v1, v0, v1}, Lorg/spongycastle/crypto/prng/drbg/CTRSP800DRBG;->padKey([BI[BI)V
.line 450
const/4 v1, 0x7
const/16 v2, 0x8
invoke-direct {p0, p1, v1, v0, v2}, Lorg/spongycastle/crypto/prng/drbg/CTRSP800DRBG;->padKey([BI[BI)V
.line 451
const/16 v1, 0xe
const/16 v2, 0x10
invoke-direct {p0, p1, v1, v0, v2}, Lorg/spongycastle/crypto/prng/drbg/CTRSP800DRBG;->padKey([BI[BI)V
move-object p1, v0
.line 457
:cond_1a
return-object p1
.end method
.method public generate([B[BZ)I
.registers 12
.prologue
const/4 v0, -0x1
const/4 v2, 0x0
.line 345
iget-boolean v1, p0, Lorg/spongycastle/crypto/prng/drbg/CTRSP800DRBG;->_isTDEA:Z
if-eqz v1, :cond_22
.line 347
iget-wide v4, p0, Lorg/spongycastle/crypto/prng/drbg/CTRSP800DRBG;->_reseedCounter:J
const-wide v6, 0x80000000L
cmp-long v1, v4, v6
if-lez v1, :cond_12
.line 410
:cond_11
:goto_11
return v0
.line 352
:cond_12
const/16 v0, 0x200
invoke-static {p1, v0}, Lorg/spongycastle/crypto/prng/drbg/Utils;->isTooLarge([BI)Z
move-result v0
if-eqz v0, :cond_3e
.line 354
new-instance v0, Ljava/lang/IllegalArgumentException;
const-string v1, "Number of bits per request limited to 4096"
invoke-direct {v0, v1}, Ljava/lang/IllegalArgumentException;-><init>(Ljava/lang/String;)V
throw v0
.line 359
:cond_22
iget-wide v4, p0, Lorg/spongycastle/crypto/prng/drbg/CTRSP800DRBG;->_reseedCounter:J
const-wide v6, 0x800000000000L
cmp-long v1, v4, v6
if-gtz v1, :cond_11
.line 364
const v0, 0x8000
invoke-static {p1, v0}, Lorg/spongycastle/crypto/prng/drbg/Utils;->isTooLarge([BI)Z
move-result v0
if-eqz v0, :cond_3e
.line 366
new-instance v0, Ljava/lang/IllegalArgumentException;
const-string v1, "Number of bits per request limited to 262144"
invoke-direct {v0, v1}, Ljava/lang/IllegalArgumentException;-><init>(Ljava/lang/String;)V
throw v0
.line 370
:cond_3e
if-eqz p3, :cond_44
.line 372
invoke-direct {p0, p2}, Lorg/spongycastle/crypto/prng/drbg/CTRSP800DRBG;->CTR_DRBG_Reseed_algorithm([B)V
.line 373
const/4 p2, 0x0
.line 376
:cond_44
if-eqz p2, :cond_8d
.line 378
iget v0, p0, Lorg/spongycastle/crypto/prng/drbg/CTRSP800DRBG;->_seedLength:I
invoke-direct {p0, p2, v0}, Lorg/spongycastle/crypto/prng/drbg/CTRSP800DRBG;->Block_Cipher_df([BI)[B
move-result-object v0
.line 379
iget-object v1, p0, Lorg/spongycastle/crypto/prng/drbg/CTRSP800DRBG;->_Key:[B
iget-object v3, p0, Lorg/spongycastle/crypto/prng/drbg/CTRSP800DRBG;->_V:[B
invoke-direct {p0, v0, v1, v3}, Lorg/spongycastle/crypto/prng/drbg/CTRSP800DRBG;->CTR_DRBG_Update([B[B[B)V
.line 386
:goto_53
iget-object v1, p0, Lorg/spongycastle/crypto/prng/drbg/CTRSP800DRBG;->_V:[B
array-length v1, v1
new-array v4, v1, [B
.line 388
iget-object v1, p0, Lorg/spongycastle/crypto/prng/drbg/CTRSP800DRBG;->_engine:Lorg/spongycastle/crypto/BlockCipher;
const/4 v3, 0x1
new-instance v5, Lorg/spongycastle/crypto/params/KeyParameter;
iget-object v6, p0, Lorg/spongycastle/crypto/prng/drbg/CTRSP800DRBG;->_Key:[B
invoke-virtual {p0, v6}, Lorg/spongycastle/crypto/prng/drbg/CTRSP800DRBG;->expandKey([B)[B
move-result-object v6
invoke-direct {v5, v6}, Lorg/spongycastle/crypto/params/KeyParameter;-><init>([B)V
invoke-interface {v1, v3, v5}, Lorg/spongycastle/crypto/BlockCipher;->init(ZLorg/spongycastle/crypto/CipherParameters;)V
move v1, v2
.line 390
:goto_6a
array-length v3, p1
array-length v5, v4
div-int/2addr v3, v5
if-gt v1, v3, :cond_99
.line 392
array-length v3, p1
array-length v5, v4
mul-int/2addr v5, v1
sub-int/2addr v3, v5
array-length v5, v4
if-le v3, v5, :cond_92
array-length v3, v4
.line 396
:goto_77
if-eqz v3, :cond_8a
.line 398
iget-object v5, p0, Lorg/spongycastle/crypto/prng/drbg/CTRSP800DRBG;->_V:[B
invoke-direct {p0, v5}, Lorg/spongycastle/crypto/prng/drbg/CTRSP800DRBG;->addOneTo([B)V
.line 400
iget-object v5, p0, Lorg/spongycastle/crypto/prng/drbg/CTRSP800DRBG;->_engine:Lorg/spongycastle/crypto/BlockCipher;
iget-object v6, p0, Lorg/spongycastle/crypto/prng/drbg/CTRSP800DRBG;->_V:[B
invoke-interface {v5, v6, v2, v4, v2}, Lorg/spongycastle/crypto/BlockCipher;->processBlock([BI[BI)I
.line 402
array-length v5, v4
mul-int/2addr v5, v1
invoke-static {v4, v2, p1, v5, v3}, Ljava/lang/System;->arraycopy(Ljava/lang/Object;ILjava/lang/Object;II)V
.line 390
:cond_8a
add-int/lit8 v1, v1, 0x1
goto :goto_6a
.line 383
:cond_8d
iget v0, p0, Lorg/spongycastle/crypto/prng/drbg/CTRSP800DRBG;->_seedLength:I
new-array v0, v0, [B
goto :goto_53
.line 392
:cond_92
array-length v3, p1
iget-object v5, p0, Lorg/spongycastle/crypto/prng/drbg/CTRSP800DRBG;->_V:[B
array-length v5, v5
mul-int/2addr v5, v1
sub-int/2addr v3, v5
goto :goto_77
.line 406
:cond_99
iget-object v1, p0, Lorg/spongycastle/crypto/prng/drbg/CTRSP800DRBG;->_Key:[B
iget-object v2, p0, Lorg/spongycastle/crypto/prng/drbg/CTRSP800DRBG;->_V:[B
invoke-direct {p0, v0, v1, v2}, Lorg/spongycastle/crypto/prng/drbg/CTRSP800DRBG;->CTR_DRBG_Update([B[B[B)V
.line 408
iget-wide v0, p0, Lorg/spongycastle/crypto/prng/drbg/CTRSP800DRBG;->_reseedCounter:J
const-wide/16 v2, 0x1
add-long/2addr v0, v2
iput-wide v0, p0, Lorg/spongycastle/crypto/prng/drbg/CTRSP800DRBG;->_reseedCounter:J
.line 410
array-length v0, p1
shl-int/lit8 v0, v0, 0x3
goto/16 :goto_11
.end method
.method public getBlockSize()I
.registers 2
.prologue
.line 331
iget-object v0, p0, Lorg/spongycastle/crypto/prng/drbg/CTRSP800DRBG;->_V:[B
array-length v0, v0
shl-int/lit8 v0, v0, 0x3
return v0
.end method
.method public reseed([B)V
.registers 2
.prologue
.line 420
invoke-direct {p0, p1}, Lorg/spongycastle/crypto/prng/drbg/CTRSP800DRBG;->CTR_DRBG_Reseed_algorithm([B)V
.line 421
return-void
.end method