SRPHelper.smali
.class public Lim/tpelyyftgw/messenger/SRPHelper;
.super Ljava/lang/Object;
.source "SRPHelper.java"
# direct methods
.method static constructor <clinit>()V
.registers 1
return-void
.end method
.method public constructor <init>()V
.registers 1
.line 7
invoke-direct {p0}, Ljava/lang/Object;-><init>()V
return-void
.end method
.method public static getBigIntegerBytes(Ljava/math/BigInteger;)[B
.registers 7
.param p0, "value" # Ljava/math/BigInteger;
.line 10
invoke-virtual {p0}, Ljava/math/BigInteger;->toByteArray()[B
move-result-object v0
.line 11
.local v0, "bytes":[B
array-length v1, v0
const/4 v2, 0x0
const/16 v3, 0x100
if-le v1, v3, :cond_11
.line 12
new-array v1, v3, [B
.line 13
.local v1, "correctedAuth":[B
const/4 v4, 0x1
invoke-static {v0, v4, v1, v2, v3}, Ljava/lang/System;->arraycopy(Ljava/lang/Object;ILjava/lang/Object;II)V
.line 14
return-object v1
.line 15
.end local v1 # "correctedAuth":[B
:cond_11
array-length v1, v0
if-ge v1, v3, :cond_29
.line 16
new-array v1, v3, [B
.line 17
.restart local v1 # "correctedAuth":[B
array-length v4, v0
rsub-int v4, v4, 0x100
array-length v5, v0
invoke-static {v0, v2, v1, v4, v5}, Ljava/lang/System;->arraycopy(Ljava/lang/Object;ILjava/lang/Object;II)V
.line 18
const/4 v4, 0x0
.local v4, "a":I
:goto_1e
array-length v5, v0
rsub-int v5, v5, 0x100
if-ge v4, v5, :cond_28
.line 19
aput-byte v2, v1, v4
.line 18
add-int/lit8 v4, v4, 0x1
goto :goto_1e
.line 21
.end local v4 # "a":I
:cond_28
return-object v1
.line 23
.end local v1 # "correctedAuth":[B
:cond_29
return-object v0
.end method
.method public static getV([BLim/tpelyyftgw/tgnet/TLRPC$TL_passwordKdfAlgoSHA256SHA256PBKDF2HMACSHA512iter100000SHA256ModPow;)Ljava/math/BigInteger;
.registers 8
.param p0, "passwordBytes" # [B
.param p1, "algo" # Lim/tpelyyftgw/tgnet/TLRPC$TL_passwordKdfAlgoSHA256SHA256PBKDF2HMACSHA512iter100000SHA256ModPow;
.line 34
iget v0, p1, Lim/tpelyyftgw/tgnet/TLRPC$TL_passwordKdfAlgoSHA256SHA256PBKDF2HMACSHA512iter100000SHA256ModPow;->g:I
int-to-long v0, v0
invoke-static {v0, v1}, Ljava/math/BigInteger;->valueOf(J)Ljava/math/BigInteger;
move-result-object v0
.line 35
.local v0, "g":Ljava/math/BigInteger;
invoke-static {v0}, Lim/tpelyyftgw/messenger/SRPHelper;->getBigIntegerBytes(Ljava/math/BigInteger;)[B
move-result-object v1
.line 36
.local v1, "g_bytes":[B
new-instance v2, Ljava/math/BigInteger;
iget-object v3, p1, Lim/tpelyyftgw/tgnet/TLRPC$TL_passwordKdfAlgoSHA256SHA256PBKDF2HMACSHA512iter100000SHA256ModPow;->p:[B
const/4 v4, 0x1
invoke-direct {v2, v4, v3}, Ljava/math/BigInteger;-><init>(I[B)V
.line 38
.local v2, "p":Ljava/math/BigInteger;
invoke-static {p0, p1}, Lim/tpelyyftgw/messenger/SRPHelper;->getX([BLim/tpelyyftgw/tgnet/TLRPC$TL_passwordKdfAlgoSHA256SHA256PBKDF2HMACSHA512iter100000SHA256ModPow;)[B
move-result-object v3
.line 39
.local v3, "x_bytes":[B
new-instance v5, Ljava/math/BigInteger;
invoke-direct {v5, v4, v3}, Ljava/math/BigInteger;-><init>(I[B)V
move-object v4, v5
.line 40
.local v4, "x":Ljava/math/BigInteger;
invoke-virtual {v0, v4, v2}, Ljava/math/BigInteger;->modPow(Ljava/math/BigInteger;Ljava/math/BigInteger;)Ljava/math/BigInteger;
move-result-object v5
return-object v5
.end method
.method public static getVBytes([BLim/tpelyyftgw/tgnet/TLRPC$TL_passwordKdfAlgoSHA256SHA256PBKDF2HMACSHA512iter100000SHA256ModPow;)[B
.registers 4
.param p0, "passwordBytes" # [B
.param p1, "algo" # Lim/tpelyyftgw/tgnet/TLRPC$TL_passwordKdfAlgoSHA256SHA256PBKDF2HMACSHA512iter100000SHA256ModPow;
.line 44
iget-object v0, p1, Lim/tpelyyftgw/tgnet/TLRPC$TL_passwordKdfAlgoSHA256SHA256PBKDF2HMACSHA512iter100000SHA256ModPow;->p:[B
iget v1, p1, Lim/tpelyyftgw/tgnet/TLRPC$TL_passwordKdfAlgoSHA256SHA256PBKDF2HMACSHA512iter100000SHA256ModPow;->g:I
invoke-static {v0, v1}, Lim/tpelyyftgw/messenger/Utilities;->isGoodPrime([BI)Z
move-result v0
if-nez v0, :cond_c
.line 45
const/4 v0, 0x0
return-object v0
.line 47
:cond_c
invoke-static {p0, p1}, Lim/tpelyyftgw/messenger/SRPHelper;->getV([BLim/tpelyyftgw/tgnet/TLRPC$TL_passwordKdfAlgoSHA256SHA256PBKDF2HMACSHA512iter100000SHA256ModPow;)Ljava/math/BigInteger;
move-result-object v0
invoke-static {v0}, Lim/tpelyyftgw/messenger/SRPHelper;->getBigIntegerBytes(Ljava/math/BigInteger;)[B
move-result-object v0
return-object v0
.end method
.method public static getX([BLim/tpelyyftgw/tgnet/TLRPC$TL_passwordKdfAlgoSHA256SHA256PBKDF2HMACSHA512iter100000SHA256ModPow;)[B
.registers 9
.param p0, "passwordBytes" # [B
.param p1, "algo" # Lim/tpelyyftgw/tgnet/TLRPC$TL_passwordKdfAlgoSHA256SHA256PBKDF2HMACSHA512iter100000SHA256ModPow;
.line 27
const/4 v0, 0x3
new-array v1, v0, [[B
iget-object v2, p1, Lim/tpelyyftgw/tgnet/TLRPC$TL_passwordKdfAlgoSHA256SHA256PBKDF2HMACSHA512iter100000SHA256ModPow;->salt1:[B
const/4 v3, 0x0
aput-object v2, v1, v3
const/4 v2, 0x1
aput-object p0, v1, v2
iget-object v4, p1, Lim/tpelyyftgw/tgnet/TLRPC$TL_passwordKdfAlgoSHA256SHA256PBKDF2HMACSHA512iter100000SHA256ModPow;->salt1:[B
const/4 v5, 0x2
aput-object v4, v1, v5
invoke-static {v1}, Lim/tpelyyftgw/messenger/Utilities;->computeSHA256([[B)[B
move-result-object v1
.line 28
.local v1, "x_bytes":[B
new-array v4, v0, [[B
iget-object v6, p1, Lim/tpelyyftgw/tgnet/TLRPC$TL_passwordKdfAlgoSHA256SHA256PBKDF2HMACSHA512iter100000SHA256ModPow;->salt2:[B
aput-object v6, v4, v3
aput-object v1, v4, v2
iget-object v6, p1, Lim/tpelyyftgw/tgnet/TLRPC$TL_passwordKdfAlgoSHA256SHA256PBKDF2HMACSHA512iter100000SHA256ModPow;->salt2:[B
aput-object v6, v4, v5
invoke-static {v4}, Lim/tpelyyftgw/messenger/Utilities;->computeSHA256([[B)[B
move-result-object v1
.line 29
iget-object v4, p1, Lim/tpelyyftgw/tgnet/TLRPC$TL_passwordKdfAlgoSHA256SHA256PBKDF2HMACSHA512iter100000SHA256ModPow;->salt1:[B
invoke-static {v1, v4}, Lim/tpelyyftgw/messenger/Utilities;->computePBKDF2([B[B)[B
move-result-object v1
.line 30
new-array v0, v0, [[B
iget-object v4, p1, Lim/tpelyyftgw/tgnet/TLRPC$TL_passwordKdfAlgoSHA256SHA256PBKDF2HMACSHA512iter100000SHA256ModPow;->salt2:[B
aput-object v4, v0, v3
aput-object v1, v0, v2
iget-object v2, p1, Lim/tpelyyftgw/tgnet/TLRPC$TL_passwordKdfAlgoSHA256SHA256PBKDF2HMACSHA512iter100000SHA256ModPow;->salt2:[B
aput-object v2, v0, v5
invoke-static {v0}, Lim/tpelyyftgw/messenger/Utilities;->computeSHA256([[B)[B
move-result-object v0
return-object v0
.end method
.method public static startCheck([BJ[BLim/tpelyyftgw/tgnet/TLRPC$TL_passwordKdfAlgoSHA256SHA256PBKDF2HMACSHA512iter100000SHA256ModPow;)Lim/tpelyyftgw/tgnet/TLRPC$TL_inputCheckPasswordSRP;
.registers 31
.param p0, "x_bytes" # [B
.param p1, "srp_id" # J
.param p3, "srp_B" # [B
.param p4, "algo" # Lim/tpelyyftgw/tgnet/TLRPC$TL_passwordKdfAlgoSHA256SHA256PBKDF2HMACSHA512iter100000SHA256ModPow;
.line 51
move-object/from16 v0, p0
move-object/from16 v1, p3
move-object/from16 v2, p4
if-eqz v0, :cond_136
if-eqz v1, :cond_136
array-length v4, v1
if-eqz v4, :cond_136
iget-object v4, v2, Lim/tpelyyftgw/tgnet/TLRPC$TL_passwordKdfAlgoSHA256SHA256PBKDF2HMACSHA512iter100000SHA256ModPow;->p:[B
iget v5, v2, Lim/tpelyyftgw/tgnet/TLRPC$TL_passwordKdfAlgoSHA256SHA256PBKDF2HMACSHA512iter100000SHA256ModPow;->g:I
invoke-static {v4, v5}, Lim/tpelyyftgw/messenger/Utilities;->isGoodPrime([BI)Z
move-result v4
if-nez v4, :cond_1c
move-wide/from16 v2, p1
const/4 v1, 0x0
goto/16 :goto_139
.line 54
:cond_1c
iget v4, v2, Lim/tpelyyftgw/tgnet/TLRPC$TL_passwordKdfAlgoSHA256SHA256PBKDF2HMACSHA512iter100000SHA256ModPow;->g:I
int-to-long v4, v4
invoke-static {v4, v5}, Ljava/math/BigInteger;->valueOf(J)Ljava/math/BigInteger;
move-result-object v4
.line 55
.local v4, "g":Ljava/math/BigInteger;
invoke-static {v4}, Lim/tpelyyftgw/messenger/SRPHelper;->getBigIntegerBytes(Ljava/math/BigInteger;)[B
move-result-object v5
.line 56
.local v5, "g_bytes":[B
new-instance v6, Ljava/math/BigInteger;
iget-object v7, v2, Lim/tpelyyftgw/tgnet/TLRPC$TL_passwordKdfAlgoSHA256SHA256PBKDF2HMACSHA512iter100000SHA256ModPow;->p:[B
const/4 v8, 0x1
invoke-direct {v6, v8, v7}, Ljava/math/BigInteger;-><init>(I[B)V
.line 58
.local v6, "p":Ljava/math/BigInteger;
const/4 v7, 0x2
new-array v9, v7, [[B
iget-object v10, v2, Lim/tpelyyftgw/tgnet/TLRPC$TL_passwordKdfAlgoSHA256SHA256PBKDF2HMACSHA512iter100000SHA256ModPow;->p:[B
const/4 v11, 0x0
aput-object v10, v9, v11
aput-object v5, v9, v8
invoke-static {v9}, Lim/tpelyyftgw/messenger/Utilities;->computeSHA256([[B)[B
move-result-object v9
.line 59
.local v9, "k_bytes":[B
new-instance v10, Ljava/math/BigInteger;
invoke-direct {v10, v8, v9}, Ljava/math/BigInteger;-><init>(I[B)V
.line 61
.local v10, "k":Ljava/math/BigInteger;
new-instance v12, Ljava/math/BigInteger;
invoke-direct {v12, v8, v0}, Ljava/math/BigInteger;-><init>(I[B)V
.line 63
.local v12, "x":Ljava/math/BigInteger;
const/16 v13, 0x100
new-array v13, v13, [B
.line 64
.local v13, "a_bytes":[B
sget-object v14, Lim/tpelyyftgw/messenger/Utilities;->random:Ljava/security/SecureRandom;
invoke-virtual {v14, v13}, Ljava/security/SecureRandom;->nextBytes([B)V
.line 65
new-instance v14, Ljava/math/BigInteger;
invoke-direct {v14, v8, v13}, Ljava/math/BigInteger;-><init>(I[B)V
.line 67
.local v14, "a":Ljava/math/BigInteger;
invoke-virtual {v4, v14, v6}, Ljava/math/BigInteger;->modPow(Ljava/math/BigInteger;Ljava/math/BigInteger;)Ljava/math/BigInteger;
move-result-object v15
.line 68
.local v15, "A":Ljava/math/BigInteger;
invoke-static {v15}, Lim/tpelyyftgw/messenger/SRPHelper;->getBigIntegerBytes(Ljava/math/BigInteger;)[B
move-result-object v3
.line 70
.local v3, "A_bytes":[B
new-instance v11, Ljava/math/BigInteger;
invoke-direct {v11, v8, v1}, Ljava/math/BigInteger;-><init>(I[B)V
.line 71
.local v11, "B":Ljava/math/BigInteger;
sget-object v8, Ljava/math/BigInteger;->ZERO:Ljava/math/BigInteger;
invoke-virtual {v11, v8}, Ljava/math/BigInteger;->compareTo(Ljava/math/BigInteger;)I
move-result v8
if-lez v8, :cond_12f
invoke-virtual {v11, v6}, Ljava/math/BigInteger;->compareTo(Ljava/math/BigInteger;)I
move-result v8
if-ltz v8, :cond_77
move-object v0, v3
move-object/from16 v23, v4
move-wide/from16 v2, p1
goto/16 :goto_134
.line 74
:cond_77
invoke-static {v11}, Lim/tpelyyftgw/messenger/SRPHelper;->getBigIntegerBytes(Ljava/math/BigInteger;)[B
move-result-object v8
.line 76
.local v8, "B_bytes":[B
new-array v0, v7, [[B
const/16 v17, 0x0
aput-object v3, v0, v17
const/4 v7, 0x1
aput-object v8, v0, v7
invoke-static {v0}, Lim/tpelyyftgw/messenger/Utilities;->computeSHA256([[B)[B
move-result-object v0
.line 77
.local v0, "u_bytes":[B
new-instance v1, Ljava/math/BigInteger;
invoke-direct {v1, v7, v0}, Ljava/math/BigInteger;-><init>(I[B)V
.line 78
.local v1, "u":Ljava/math/BigInteger;
sget-object v7, Ljava/math/BigInteger;->ZERO:Ljava/math/BigInteger;
invoke-virtual {v1, v7}, Ljava/math/BigInteger;->compareTo(Ljava/math/BigInteger;)I
move-result v7
if-nez v7, :cond_97
.line 79
const/4 v7, 0x0
return-object v7
.line 82
:cond_97
invoke-virtual {v4, v12, v6}, Ljava/math/BigInteger;->modPow(Ljava/math/BigInteger;Ljava/math/BigInteger;)Ljava/math/BigInteger;
move-result-object v7
invoke-virtual {v10, v7}, Ljava/math/BigInteger;->multiply(Ljava/math/BigInteger;)Ljava/math/BigInteger;
move-result-object v7
invoke-virtual {v7, v6}, Ljava/math/BigInteger;->mod(Ljava/math/BigInteger;)Ljava/math/BigInteger;
move-result-object v7
invoke-virtual {v11, v7}, Ljava/math/BigInteger;->subtract(Ljava/math/BigInteger;)Ljava/math/BigInteger;
move-result-object v7
.line 83
.local v7, "B_kgx":Ljava/math/BigInteger;
move-object/from16 v19, v0
.end local v0 # "u_bytes":[B
.local v19, "u_bytes":[B
sget-object v0, Ljava/math/BigInteger;->ZERO:Ljava/math/BigInteger;
invoke-virtual {v7, v0}, Ljava/math/BigInteger;->compareTo(Ljava/math/BigInteger;)I
move-result v0
if-gez v0, :cond_b5
.line 84
invoke-virtual {v7, v6}, Ljava/math/BigInteger;->add(Ljava/math/BigInteger;)Ljava/math/BigInteger;
move-result-object v7
.line 86
:cond_b5
invoke-static {v7, v6}, Lim/tpelyyftgw/messenger/Utilities;->isGoodGaAndGb(Ljava/math/BigInteger;Ljava/math/BigInteger;)Z
move-result v0
if-nez v0, :cond_bd
.line 87
const/4 v0, 0x0
return-object v0
.line 90
:cond_bd
invoke-virtual {v1, v12}, Ljava/math/BigInteger;->multiply(Ljava/math/BigInteger;)Ljava/math/BigInteger;
move-result-object v0
invoke-virtual {v14, v0}, Ljava/math/BigInteger;->add(Ljava/math/BigInteger;)Ljava/math/BigInteger;
move-result-object v0
invoke-virtual {v7, v0, v6}, Ljava/math/BigInteger;->modPow(Ljava/math/BigInteger;Ljava/math/BigInteger;)Ljava/math/BigInteger;
move-result-object v0
.line 91
.local v0, "S":Ljava/math/BigInteger;
invoke-static {v0}, Lim/tpelyyftgw/messenger/SRPHelper;->getBigIntegerBytes(Ljava/math/BigInteger;)[B
move-result-object v16
.line 93
.local v16, "S_bytes":[B
invoke-static/range {v16 .. v16}, Lim/tpelyyftgw/messenger/Utilities;->computeSHA256([B)[B
move-result-object v20
.line 95
.local v20, "K_bytes":[B
move-object/from16 v21, v0
.end local v0 # "S":Ljava/math/BigInteger;
.local v21, "S":Ljava/math/BigInteger;
iget-object v0, v2, Lim/tpelyyftgw/tgnet/TLRPC$TL_passwordKdfAlgoSHA256SHA256PBKDF2HMACSHA512iter100000SHA256ModPow;->p:[B
invoke-static {v0}, Lim/tpelyyftgw/messenger/Utilities;->computeSHA256([B)[B
move-result-object v0
.line 96
.local v0, "p_hash":[B
invoke-static {v5}, Lim/tpelyyftgw/messenger/Utilities;->computeSHA256([B)[B
move-result-object v22
.line 97
.local v22, "g_hash":[B
const/16 v23, 0x0
move-object/from16 v24, v1
move/from16 v1, v23
.local v1, "i":I
.local v24, "u":Ljava/math/BigInteger;
:goto_e3
move-object/from16 v23, v4
.end local v4 # "g":Ljava/math/BigInteger;
.local v23, "g":Ljava/math/BigInteger;
array-length v4, v0
if-ge v1, v4, :cond_f6
.line 98
aget-byte v4, v22, v1
aget-byte v25, v0, v1
xor-int v4, v4, v25
int-to-byte v4, v4
aput-byte v4, v0, v1
.line 97
add-int/lit8 v1, v1, 0x1
move-object/from16 v4, v23
goto :goto_e3
.line 101
.end local v1 # "i":I
:cond_f6
new-instance v1, Lim/tpelyyftgw/tgnet/TLRPC$TL_inputCheckPasswordSRP;
invoke-direct {v1}, Lim/tpelyyftgw/tgnet/TLRPC$TL_inputCheckPasswordSRP;-><init>()V
.line 102
.local v1, "result":Lim/tpelyyftgw/tgnet/TLRPC$TL_inputCheckPasswordSRP;
const/4 v4, 0x6
new-array v4, v4, [[B
const/16 v17, 0x0
aput-object v0, v4, v17
move-object/from16 v17, v0
.end local v0 # "p_hash":[B
.local v17, "p_hash":[B
iget-object v0, v2, Lim/tpelyyftgw/tgnet/TLRPC$TL_passwordKdfAlgoSHA256SHA256PBKDF2HMACSHA512iter100000SHA256ModPow;->salt1:[B
invoke-static {v0}, Lim/tpelyyftgw/messenger/Utilities;->computeSHA256([B)[B
move-result-object v0
const/16 v18, 0x1
aput-object v0, v4, v18
iget-object v0, v2, Lim/tpelyyftgw/tgnet/TLRPC$TL_passwordKdfAlgoSHA256SHA256PBKDF2HMACSHA512iter100000SHA256ModPow;->salt2:[B
invoke-static {v0}, Lim/tpelyyftgw/messenger/Utilities;->computeSHA256([B)[B
move-result-object v0
const/16 v18, 0x2
aput-object v0, v4, v18
const/4 v0, 0x3
aput-object v3, v4, v0
const/4 v0, 0x4
aput-object v8, v4, v0
const/4 v0, 0x5
aput-object v20, v4, v0
invoke-static {v4}, Lim/tpelyyftgw/messenger/Utilities;->computeSHA256([[B)[B
move-result-object v0
iput-object v0, v1, Lim/tpelyyftgw/tgnet/TLRPC$TL_inputCheckPasswordSRP;->M1:[B
.line 103
iput-object v3, v1, Lim/tpelyyftgw/tgnet/TLRPC$TL_inputCheckPasswordSRP;->A:[B
.line 104
move-object v0, v3
move-wide/from16 v2, p1
.end local v3 # "A_bytes":[B
.local v0, "A_bytes":[B
iput-wide v2, v1, Lim/tpelyyftgw/tgnet/TLRPC$TL_inputCheckPasswordSRP;->srp_id:J
.line 105
return-object v1
.line 71
.end local v0 # "A_bytes":[B
.end local v1 # "result":Lim/tpelyyftgw/tgnet/TLRPC$TL_inputCheckPasswordSRP;
.end local v7 # "B_kgx":Ljava/math/BigInteger;
.end local v8 # "B_bytes":[B
.end local v16 # "S_bytes":[B
.end local v17 # "p_hash":[B
.end local v19 # "u_bytes":[B
.end local v20 # "K_bytes":[B
.end local v21 # "S":Ljava/math/BigInteger;
.end local v22 # "g_hash":[B
.end local v23 # "g":Ljava/math/BigInteger;
.end local v24 # "u":Ljava/math/BigInteger;
.restart local v3 # "A_bytes":[B
.restart local v4 # "g":Ljava/math/BigInteger;
:cond_12f
move-object v0, v3
move-object/from16 v23, v4
move-wide/from16 v2, p1
.line 72
.end local v3 # "A_bytes":[B
.end local v4 # "g":Ljava/math/BigInteger;
.restart local v0 # "A_bytes":[B
.restart local v23 # "g":Ljava/math/BigInteger;
:goto_134
const/4 v1, 0x0
return-object v1
.line 51
.end local v0 # "A_bytes":[B
.end local v5 # "g_bytes":[B
.end local v6 # "p":Ljava/math/BigInteger;
.end local v9 # "k_bytes":[B
.end local v10 # "k":Ljava/math/BigInteger;
.end local v11 # "B":Ljava/math/BigInteger;
.end local v12 # "x":Ljava/math/BigInteger;
.end local v13 # "a_bytes":[B
.end local v14 # "a":Ljava/math/BigInteger;
.end local v15 # "A":Ljava/math/BigInteger;
.end local v23 # "g":Ljava/math/BigInteger;
:cond_136
move-wide/from16 v2, p1
const/4 v1, 0x0
.line 52
:goto_139
return-object v1
.end method