BaseKDFBytesGenerator.smali
.class public Lorg/spongycastle/crypto/generators/BaseKDFBytesGenerator;
.super Ljava/lang/Object;
.source "BaseKDFBytesGenerator.java"
# interfaces
.implements Lorg/spongycastle/crypto/DigestDerivationFunction;
# instance fields
.field private counterStart:I
.field private digest:Lorg/spongycastle/crypto/Digest;
.field private iv:[B
.field private shared:[B
# direct methods
.method protected constructor <init>(ILorg/spongycastle/crypto/Digest;)V
.registers 3
.prologue
.line 34
invoke-direct {p0}, Ljava/lang/Object;-><init>()V
.line 35
iput p1, p0, Lorg/spongycastle/crypto/generators/BaseKDFBytesGenerator;->counterStart:I
.line 36
iput-object p2, p0, Lorg/spongycastle/crypto/generators/BaseKDFBytesGenerator;->digest:Lorg/spongycastle/crypto/Digest;
.line 37
return-void
.end method
# virtual methods
.method public generateBytes([BII)I
.registers 20
.prologue
.line 81
move-object/from16 v0, p1
array-length v2, v0
sub-int v2, v2, p3
move/from16 v0, p2
if-ge v2, v0, :cond_11
.line 83
new-instance v2, Lorg/spongycastle/crypto/DataLengthException;
const-string v3, "output buffer too small"
invoke-direct {v2, v3}, Lorg/spongycastle/crypto/DataLengthException;-><init>(Ljava/lang/String;)V
throw v2
.line 86
:cond_11
move/from16 v0, p3
int-to-long v6, v0
.line 87
move-object/from16 v0, p0
iget-object v2, v0, Lorg/spongycastle/crypto/generators/BaseKDFBytesGenerator;->digest:Lorg/spongycastle/crypto/Digest;
invoke-interface {v2}, Lorg/spongycastle/crypto/Digest;->getDigestSize()I
move-result v8
.line 95
const-wide v2, 0x1ffffffffL
cmp-long v2, v6, v2
if-lez v2, :cond_2d
.line 97
new-instance v2, Ljava/lang/IllegalArgumentException;
const-string v3, "Output length too large"
invoke-direct {v2, v3}, Ljava/lang/IllegalArgumentException;-><init>(Ljava/lang/String;)V
throw v2
.line 100
:cond_2d
int-to-long v2, v8
add-long/2addr v2, v6
const-wide/16 v4, 0x1
sub-long/2addr v2, v4
int-to-long v4, v8
div-long/2addr v2, v4
long-to-int v9, v2
.line 102
move-object/from16 v0, p0
iget-object v2, v0, Lorg/spongycastle/crypto/generators/BaseKDFBytesGenerator;->digest:Lorg/spongycastle/crypto/Digest;
invoke-interface {v2}, Lorg/spongycastle/crypto/Digest;->getDigestSize()I
move-result v2
new-array v10, v2, [B
.line 104
const/4 v2, 0x4
new-array v11, v2, [B
.line 105
move-object/from16 v0, p0
iget v2, v0, Lorg/spongycastle/crypto/generators/BaseKDFBytesGenerator;->counterStart:I
const/4 v3, 0x0
invoke-static {v2, v11, v3}, Lorg/spongycastle/util/Pack;->intToBigEndian(I[BI)V
.line 107
move-object/from16 v0, p0
iget v2, v0, Lorg/spongycastle/crypto/generators/BaseKDFBytesGenerator;->counterStart:I
and-int/lit16 v4, v2, -0x100
.line 109
const/4 v2, 0x0
move v5, v2
move/from16 v3, p2
move/from16 v2, p3
:goto_56
if-ge v5, v9, :cond_b5
.line 111
move-object/from16 v0, p0
iget-object v12, v0, Lorg/spongycastle/crypto/generators/BaseKDFBytesGenerator;->digest:Lorg/spongycastle/crypto/Digest;
move-object/from16 v0, p0
iget-object v13, v0, Lorg/spongycastle/crypto/generators/BaseKDFBytesGenerator;->shared:[B
const/4 v14, 0x0
move-object/from16 v0, p0
iget-object v15, v0, Lorg/spongycastle/crypto/generators/BaseKDFBytesGenerator;->shared:[B
array-length v15, v15
invoke-interface {v12, v13, v14, v15}, Lorg/spongycastle/crypto/Digest;->update([BII)V
.line 112
move-object/from16 v0, p0
iget-object v12, v0, Lorg/spongycastle/crypto/generators/BaseKDFBytesGenerator;->digest:Lorg/spongycastle/crypto/Digest;
const/4 v13, 0x0
const/4 v14, 0x4
invoke-interface {v12, v11, v13, v14}, Lorg/spongycastle/crypto/Digest;->update([BII)V
.line 114
move-object/from16 v0, p0
iget-object v12, v0, Lorg/spongycastle/crypto/generators/BaseKDFBytesGenerator;->iv:[B
if-eqz v12, :cond_89
.line 116
move-object/from16 v0, p0
iget-object v12, v0, Lorg/spongycastle/crypto/generators/BaseKDFBytesGenerator;->digest:Lorg/spongycastle/crypto/Digest;
move-object/from16 v0, p0
iget-object v13, v0, Lorg/spongycastle/crypto/generators/BaseKDFBytesGenerator;->iv:[B
const/4 v14, 0x0
move-object/from16 v0, p0
iget-object v15, v0, Lorg/spongycastle/crypto/generators/BaseKDFBytesGenerator;->iv:[B
array-length v15, v15
invoke-interface {v12, v13, v14, v15}, Lorg/spongycastle/crypto/Digest;->update([BII)V
.line 119
:cond_89
move-object/from16 v0, p0
iget-object v12, v0, Lorg/spongycastle/crypto/generators/BaseKDFBytesGenerator;->digest:Lorg/spongycastle/crypto/Digest;
const/4 v13, 0x0
invoke-interface {v12, v10, v13}, Lorg/spongycastle/crypto/Digest;->doFinal([BI)I
.line 121
if-le v2, v8, :cond_ae
.line 123
const/4 v12, 0x0
move-object/from16 v0, p1
invoke-static {v10, v12, v0, v3, v8}, Ljava/lang/System;->arraycopy(Ljava/lang/Object;ILjava/lang/Object;II)V
.line 124
add-int/2addr v3, v8
.line 125
sub-int/2addr v2, v8
.line 132
:goto_9b
const/4 v12, 0x3
aget-byte v13, v11, v12
add-int/lit8 v13, v13, 0x1
int-to-byte v13, v13
aput-byte v13, v11, v12
if-nez v13, :cond_ab
.line 134
add-int/lit16 v4, v4, 0x100
.line 135
const/4 v12, 0x0
invoke-static {v4, v11, v12}, Lorg/spongycastle/util/Pack;->intToBigEndian(I[BI)V
.line 109
:cond_ab
add-int/lit8 v5, v5, 0x1
goto :goto_56
.line 129
:cond_ae
const/4 v12, 0x0
move-object/from16 v0, p1
invoke-static {v10, v12, v0, v3, v2}, Ljava/lang/System;->arraycopy(Ljava/lang/Object;ILjava/lang/Object;II)V
goto :goto_9b
.line 139
:cond_b5
move-object/from16 v0, p0
iget-object v2, v0, Lorg/spongycastle/crypto/generators/BaseKDFBytesGenerator;->digest:Lorg/spongycastle/crypto/Digest;
invoke-interface {v2}, Lorg/spongycastle/crypto/Digest;->reset()V
.line 141
long-to-int v2, v6
return v2
.end method
.method public getDigest()Lorg/spongycastle/crypto/Digest;
.registers 2
.prologue
.line 66
iget-object v0, p0, Lorg/spongycastle/crypto/generators/BaseKDFBytesGenerator;->digest:Lorg/spongycastle/crypto/Digest;
return-object v0
.end method
.method public init(Lorg/spongycastle/crypto/DerivationParameters;)V
.registers 4
.prologue
.line 41
instance-of v0, p1, Lorg/spongycastle/crypto/params/KDFParameters;
if-eqz v0, :cond_13
.line 43
check-cast p1, Lorg/spongycastle/crypto/params/KDFParameters;
.line 45
invoke-virtual {p1}, Lorg/spongycastle/crypto/params/KDFParameters;->getSharedSecret()[B
move-result-object v0
iput-object v0, p0, Lorg/spongycastle/crypto/generators/BaseKDFBytesGenerator;->shared:[B
.line 46
invoke-virtual {p1}, Lorg/spongycastle/crypto/params/KDFParameters;->getIV()[B
move-result-object v0
iput-object v0, p0, Lorg/spongycastle/crypto/generators/BaseKDFBytesGenerator;->iv:[B
.line 54
:goto_12
return-void
.line 48
:cond_13
instance-of v0, p1, Lorg/spongycastle/crypto/params/ISO18033KDFParameters;
if-eqz v0, :cond_23
.line 50
check-cast p1, Lorg/spongycastle/crypto/params/ISO18033KDFParameters;
.line 52
invoke-virtual {p1}, Lorg/spongycastle/crypto/params/ISO18033KDFParameters;->getSeed()[B
move-result-object v0
iput-object v0, p0, Lorg/spongycastle/crypto/generators/BaseKDFBytesGenerator;->shared:[B
.line 53
const/4 v0, 0x0
iput-object v0, p0, Lorg/spongycastle/crypto/generators/BaseKDFBytesGenerator;->iv:[B
goto :goto_12
.line 57
:cond_23
new-instance v0, Ljava/lang/IllegalArgumentException;
const-string v1, "KDF parameters required for KDF2Generator"
invoke-direct {v0, v1}, Ljava/lang/IllegalArgumentException;-><init>(Ljava/lang/String;)V
throw v0
.end method