PBKDF2SHA512.smali
.class public Lorg/bitcoinj/crypto/PBKDF2SHA512;
.super Ljava/lang/Object;
.source "PBKDF2SHA512.java"
# direct methods
.method public constructor <init>()V
.registers 1
.prologue
.line 42
invoke-direct {p0}, Ljava/lang/Object;-><init>()V
return-void
.end method
.method private static F(Ljava/lang/String;Ljava/lang/String;II)[B
.registers 12
.prologue
const/4 v0, 0x0
const/4 v3, 0x0
.line 71
.line 74
new-instance v1, Ljavax/crypto/spec/SecretKeySpec;
const-string v2, "UTF-8"
invoke-virtual {p0, v2}, Ljava/lang/String;->getBytes(Ljava/lang/String;)[B
move-result-object v2
const-string v4, "HmacSHA512"
invoke-direct {v1, v2, v4}, Ljavax/crypto/spec/SecretKeySpec;-><init>([BLjava/lang/String;)V
.line 75
invoke-virtual {v1}, Ljavax/crypto/spec/SecretKeySpec;->getAlgorithm()Ljava/lang/String;
move-result-object v2
invoke-static {v2}, Ljavax/crypto/Mac;->getInstance(Ljava/lang/String;)Ljavax/crypto/Mac;
move-result-object v5
.line 76
invoke-virtual {v5, v1}, Ljavax/crypto/Mac;->init(Ljava/security/Key;)V
move-object v1, v0
move v4, v3
.line 78
:goto_1c
if-ge v4, p2, :cond_5a
.line 79
if-nez v4, :cond_44
.line 80
const-string v0, "UTF-8"
invoke-virtual {p1, v0}, Ljava/lang/String;->getBytes(Ljava/lang/String;)[B
move-result-object v0
.line 81
invoke-static {p3}, Lorg/bitcoinj/crypto/PBKDF2SHA512;->INT(I)[B
move-result-object v1
.line 82
array-length v2, v0
array-length v6, v1
add-int/2addr v2, v6
new-array v2, v2, [B
.line 84
array-length v6, v0
invoke-static {v0, v3, v2, v3, v6}, Ljava/lang/System;->arraycopy(Ljava/lang/Object;ILjava/lang/Object;II)V
.line 85
array-length v0, v0
array-length v6, v1
invoke-static {v1, v3, v2, v0, v6}, Ljava/lang/System;->arraycopy(Ljava/lang/Object;ILjava/lang/Object;II)V
.line 87
invoke-virtual {v5, v2}, Ljavax/crypto/Mac;->doFinal([B)[B
move-result-object v0
.line 89
invoke-virtual {v5}, Ljavax/crypto/Mac;->reset()V
move-object v1, v0
.line 78
:cond_40
add-int/lit8 v2, v4, 0x1
move v4, v2
goto :goto_1c
.line 91
:cond_44
invoke-virtual {v5, v1}, Ljavax/crypto/Mac;->doFinal([B)[B
move-result-object v1
.line 92
invoke-virtual {v5}, Ljavax/crypto/Mac;->reset()V
move v2, v3
.line 94
:goto_4c
array-length v6, v0
if-ge v2, v6, :cond_40
.line 95
aget-byte v6, v0, v2
aget-byte v7, v1, v2
xor-int/2addr v6, v7
int-to-byte v6, v6
aput-byte v6, v0, v2
.line 94
add-int/lit8 v2, v2, 0x1
goto :goto_4c
.line 102
:cond_5a
return-object v0
.end method
.method private static INT(I)[B
.registers 3
.prologue
.line 106
const/4 v0, 0x4
invoke-static {v0}, Ljava/nio/ByteBuffer;->allocate(I)Ljava/nio/ByteBuffer;
move-result-object v0
.line 107
sget-object v1, Ljava/nio/ByteOrder;->BIG_ENDIAN:Ljava/nio/ByteOrder;
invoke-virtual {v0, v1}, Ljava/nio/ByteBuffer;->order(Ljava/nio/ByteOrder;)Ljava/nio/ByteBuffer;
.line 108
invoke-virtual {v0, p0}, Ljava/nio/ByteBuffer;->putInt(I)Ljava/nio/ByteBuffer;
.line 110
invoke-virtual {v0}, Ljava/nio/ByteBuffer;->array()[B
move-result-object v0
return-object v0
.end method
.method public static derive(Ljava/lang/String;Ljava/lang/String;II)[B
.registers 15
.prologue
const/4 v10, 0x0
const-wide/high16 v8, 0x4034000000000000L # 20.0
.line 44
new-instance v1, Ljava/io/ByteArrayOutputStream;
invoke-direct {v1}, Ljava/io/ByteArrayOutputStream;-><init>()V
.line 49
int-to-double v2, p3
const-wide/high16 v4, 0x4000000000000000L # 2.0
const-wide/high16 v6, 0x4040000000000000L # 32.0
:try_start_d
invoke-static {v4, v5, v6, v7}, Ljava/lang/Math;->pow(DD)D
move-result-wide v4
const-wide/high16 v6, 0x3ff0000000000000L # 1.0
sub-double/2addr v4, v6
mul-double/2addr v4, v8
cmpl-double v0, v2, v4
if-lez v0, :cond_28
.line 50
new-instance v0, Ljava/lang/IllegalArgumentException;
const-string v1, "derived key too long"
invoke-direct {v0, v1}, Ljava/lang/IllegalArgumentException;-><init>(Ljava/lang/String;)V
throw v0
:try_end_21
.catch Ljava/lang/Exception; {:try_start_d .. :try_end_21} :catch_21
.line 60
:catch_21
move-exception v0
.line 61
new-instance v1, Ljava/lang/RuntimeException;
invoke-direct {v1, v0}, Ljava/lang/RuntimeException;-><init>(Ljava/lang/Throwable;)V
throw v1
.line 52
:cond_28
int-to-double v2, p3
div-double/2addr v2, v8
:try_start_2a
invoke-static {v2, v3}, Ljava/lang/Math;->ceil(D)D
move-result-wide v2
double-to-int v2, v2
.line 55
const/4 v0, 0x1
:goto_30
if-gt v0, v2, :cond_3c
.line 56
invoke-static {p0, p1, p2, v0}, Lorg/bitcoinj/crypto/PBKDF2SHA512;->F(Ljava/lang/String;Ljava/lang/String;II)[B
move-result-object v3
.line 57
invoke-virtual {v1, v3}, Ljava/io/ByteArrayOutputStream;->write([B)V
:try_end_39
.catch Ljava/lang/Exception; {:try_start_2a .. :try_end_39} :catch_21
.line 55
add-int/lit8 v0, v0, 0x1
goto :goto_30
.line 64
:cond_3c
new-array v0, p3, [B
.line 65
invoke-virtual {v1}, Ljava/io/ByteArrayOutputStream;->toByteArray()[B
move-result-object v1
invoke-static {v1, v10, v0, v10, p3}, Ljava/lang/System;->arraycopy(Ljava/lang/Object;ILjava/lang/Object;II)V
.line 67
return-object v0
.end method