PRNGFixes.smali
.class public final Lcom/subgraph/orchid/crypto/PRNGFixes;
.super Ljava/lang/Object;
.source "PRNGFixes.java"
# static fields
.field private static final bFS:[B
.field private static final logger:Ljava/util/logging/Logger;
# direct methods
.method static constructor <clinit>()V
.registers 1
.prologue
.line 38
const-class v0, Lcom/subgraph/orchid/crypto/PRNGFixes;
invoke-virtual {v0}, Ljava/lang/Class;->getName()Ljava/lang/String;
move-result-object v0
invoke-static {v0}, Ljava/util/logging/Logger;->getLogger(Ljava/lang/String;)Ljava/util/logging/Logger;
move-result-object v0
sput-object v0, Lcom/subgraph/orchid/crypto/PRNGFixes;->logger:Ljava/util/logging/Logger;
.line 43
invoke-static {}, Lcom/subgraph/orchid/crypto/PRNGFixes;->LX()[B
move-result-object v0
sput-object v0, Lcom/subgraph/orchid/crypto/PRNGFixes;->bFS:[B
.line 42
return-void
.end method
.method private constructor <init>()V
.registers 1
.prologue
.line 46
invoke-direct {p0}, Ljava/lang/Object;-><init>()V
return-void
.end method
.method private static LS()[B
.registers 4
.prologue
.line 294
:try_start_0
new-instance v0, Ljava/io/ByteArrayOutputStream;
invoke-direct {v0}, Ljava/io/ByteArrayOutputStream;-><init>()V
.line 295
new-instance v1, Ljava/io/DataOutputStream;
invoke-direct {v1, v0}, Ljava/io/DataOutputStream;-><init>(Ljava/io/OutputStream;)V
.line 297
invoke-static {}, Ljava/lang/System;->currentTimeMillis()J
move-result-wide v2
invoke-virtual {v1, v2, v3}, Ljava/io/DataOutputStream;->writeLong(J)V
.line 298
invoke-static {}, Ljava/lang/System;->nanoTime()J
move-result-wide v2
invoke-virtual {v1, v2, v3}, Ljava/io/DataOutputStream;->writeLong(J)V
.line 301
sget-object v2, Lcom/subgraph/orchid/crypto/PRNGFixes;->bFS:[B
invoke-virtual {v1, v2}, Ljava/io/DataOutputStream;->write([B)V
.line 302
invoke-virtual {v1}, Ljava/io/DataOutputStream;->close()V
.line 303
invoke-virtual {v0}, Ljava/io/ByteArrayOutputStream;->toByteArray()[B
:try_end_23
.catch Ljava/io/IOException; {:try_start_0 .. :try_end_23} :catch_25
move-result-object v0
return-object v0
.line 304
:catch_25
move-exception v0
.line 305
new-instance v1, Ljava/lang/SecurityException;
const-string v2, "Failed to generate seed"
invoke-direct {v1, v2, v0}, Ljava/lang/SecurityException;-><init>(Ljava/lang/String;Ljava/lang/Throwable;)V
throw v1
.end method
.method private static LU()Ljava/lang/String;
.registers 3
.prologue
const/4 v1, 0x0
.line 318
:try_start_1
const-string v0, "android.os.Build"
invoke-static {v0}, Ljava/lang/Class;->forName(Ljava/lang/String;)Ljava/lang/Class;
move-result-object v0
const-string v2, "SERIAL"
invoke-virtual {v0, v2}, Ljava/lang/Class;->getField(Ljava/lang/String;)Ljava/lang/reflect/Field;
move-result-object v0
const/4 v2, 0x0
invoke-virtual {v0, v2}, Ljava/lang/reflect/Field;->get(Ljava/lang/Object;)Ljava/lang/Object;
move-result-object v0
check-cast v0, Ljava/lang/String;
:try_end_14
.catch Ljava/lang/Exception; {:try_start_1 .. :try_end_14} :catch_15
.line 321
:goto_14
return-object v0
:catch_15
move-exception v0
move-object v0, v1
goto :goto_14
.end method
.method private static LV()I
.registers 4
.prologue
.line 327
:try_start_0
const-string v0, "android.os.Build"
invoke-static {v0}, Ljava/lang/Class;->forName(Ljava/lang/String;)Ljava/lang/Class;
move-result-object v0
const-string v1, "VERSION"
invoke-virtual {v0, v1}, Ljava/lang/Class;->getField(Ljava/lang/String;)Ljava/lang/reflect/Field;
move-result-object v0
invoke-virtual {v0}, Ljava/lang/Object;->getClass()Ljava/lang/Class;
move-result-object v0
const-string v1, "SDK_INT"
invoke-virtual {v0, v1}, Ljava/lang/Class;->getField(Ljava/lang/String;)Ljava/lang/reflect/Field;
move-result-object v0
const/4 v1, 0x0
invoke-virtual {v0, v1}, Ljava/lang/reflect/Field;->getInt(Ljava/lang/Object;)I
:try_end_1a
.catch Ljava/lang/Exception; {:try_start_0 .. :try_end_1a} :catch_1c
move-result v0
.line 330
:goto_1b
return v0
.line 328
:catch_1c
move-exception v0
.line 329
sget-object v1, Lcom/subgraph/orchid/crypto/PRNGFixes;->logger:Ljava/util/logging/Logger;
new-instance v2, Ljava/lang/StringBuilder;
const-string v3, "Could not get Build.VERSION.SDK_INT value : "
invoke-direct {v2, v3}, Ljava/lang/StringBuilder;-><init>(Ljava/lang/String;)V
invoke-virtual {v2, v0}, Ljava/lang/StringBuilder;->append(Ljava/lang/Object;)Ljava/lang/StringBuilder;
move-result-object v0
invoke-virtual {v0}, Ljava/lang/StringBuilder;->toString()Ljava/lang/String;
move-result-object v0
invoke-virtual {v1, v0}, Ljava/util/logging/Logger;->warning(Ljava/lang/String;)V
.line 330
const/4 v0, 0x0
goto :goto_1b
.end method
.method private static LW()Ljava/lang/String;
.registers 4
.prologue
.line 336
:try_start_0
const-string v0, "android.os.Build"
invoke-static {v0}, Ljava/lang/Class;->forName(Ljava/lang/String;)Ljava/lang/Class;
move-result-object v0
const-string v1, "FINGERPRINT"
invoke-virtual {v0, v1}, Ljava/lang/Class;->getField(Ljava/lang/String;)Ljava/lang/reflect/Field;
move-result-object v0
const/4 v1, 0x0
invoke-virtual {v0, v1}, Ljava/lang/reflect/Field;->get(Ljava/lang/Object;)Ljava/lang/Object;
move-result-object v0
check-cast v0, Ljava/lang/String;
:try_end_13
.catch Ljava/lang/Exception; {:try_start_0 .. :try_end_13} :catch_14
.line 339
:goto_13
return-object v0
.line 337
:catch_14
move-exception v0
.line 338
sget-object v1, Lcom/subgraph/orchid/crypto/PRNGFixes;->logger:Ljava/util/logging/Logger;
new-instance v2, Ljava/lang/StringBuilder;
const-string v3, "Could not get BUILD.FINGERPRINT value : "
invoke-direct {v2, v3}, Ljava/lang/StringBuilder;-><init>(Ljava/lang/String;)V
invoke-virtual {v2, v0}, Ljava/lang/StringBuilder;->append(Ljava/lang/Object;)Ljava/lang/StringBuilder;
move-result-object v0
invoke-virtual {v0}, Ljava/lang/StringBuilder;->toString()Ljava/lang/String;
move-result-object v0
invoke-virtual {v1, v0}, Ljava/util/logging/Logger;->warning(Ljava/lang/String;)V
.line 339
const-string v0, ""
goto :goto_13
.end method
.method private static LX()[B
.registers 2
.prologue
.line 344
new-instance v0, Ljava/lang/StringBuilder;
invoke-direct {v0}, Ljava/lang/StringBuilder;-><init>()V
.line 346
invoke-static {}, Lcom/subgraph/orchid/crypto/PRNGFixes;->LW()Ljava/lang/String;
move-result-object v1
.line 347
if-eqz v1, :cond_e
.line 348
invoke-virtual {v0, v1}, Ljava/lang/StringBuilder;->append(Ljava/lang/String;)Ljava/lang/StringBuilder;
.line 350
:cond_e
invoke-static {}, Lcom/subgraph/orchid/crypto/PRNGFixes;->LU()Ljava/lang/String;
move-result-object v1
.line 351
if-eqz v1, :cond_17
.line 352
invoke-virtual {v0, v1}, Ljava/lang/StringBuilder;->append(Ljava/lang/String;)Ljava/lang/StringBuilder;
.line 355
:cond_17
:try_start_17
invoke-virtual {v0}, Ljava/lang/StringBuilder;->toString()Ljava/lang/String;
move-result-object v0
const-string v1, "UTF-8"
invoke-virtual {v0, v1}, Ljava/lang/String;->getBytes(Ljava/lang/String;)[B
:try_end_20
.catch Ljava/io/UnsupportedEncodingException; {:try_start_17 .. :try_end_20} :catch_22
move-result-object v0
return-object v0
.line 357
:catch_22
move-exception v0
new-instance v0, Ljava/lang/RuntimeException;
const-string v1, "UTF-8 encoding not supported"
invoke-direct {v0, v1}, Ljava/lang/RuntimeException;-><init>(Ljava/lang/String;)V
throw v0
.end method
.method static synthetic LY()[B
.registers 1
.prologue
.line 36
invoke-static {}, Lcom/subgraph/orchid/crypto/PRNGFixes;->LS()[B
move-result-object v0
return-object v0
.end method
.method static synthetic access$000()Ljava/util/logging/Logger;
.registers 1
.prologue
.line 36
sget-object v0, Lcom/subgraph/orchid/crypto/PRNGFixes;->logger:Ljava/util/logging/Logger;
return-object v0
.end method
.method public static apply()V
.registers 9
.prologue
const/16 v8, 0x400
const/16 v7, 0x12
const/4 v6, 0x1
const/4 v5, 0x0
.line 1065
invoke-static {}, Lcom/subgraph/orchid/crypto/PRNGFixes;->LV()I
move-result v0
.line 1066
const/16 v1, 0x10
if-lt v0, v1, :cond_10
if-le v0, v7, :cond_69
.line 1102
:cond_10
invoke-static {}, Lcom/subgraph/orchid/crypto/PRNGFixes;->LV()I
move-result v0
if-gt v0, v7, :cond_11c
.line 1109
const-string v0, "SecureRandom.SHA1PRNG"
.line 1110
invoke-static {v0}, Ljava/security/Security;->getProviders(Ljava/lang/String;)[Ljava/security/Provider;
move-result-object v0
.line 1111
if-eqz v0, :cond_2f
array-length v1, v0
if-lez v1, :cond_2f
const-class v1, Lcom/subgraph/orchid/crypto/PRNGFixes$LinuxPRNGSecureRandomProvider;
aget-object v0, v0, v5
.line 1114
invoke-virtual {v0}, Ljava/lang/Object;->getClass()Ljava/lang/Class;
move-result-object v0
.line 1113
invoke-virtual {v1, v0}, Ljava/lang/Object;->equals(Ljava/lang/Object;)Z
move-result v0
if-nez v0, :cond_37
.line 1115
:cond_2f
new-instance v0, Lcom/subgraph/orchid/crypto/PRNGFixes$LinuxPRNGSecureRandomProvider;
invoke-direct {v0}, Lcom/subgraph/orchid/crypto/PRNGFixes$LinuxPRNGSecureRandomProvider;-><init>()V
invoke-static {v0, v6}, Ljava/security/Security;->insertProviderAt(Ljava/security/Provider;I)I
.line 1121
:cond_37
new-instance v0, Ljava/security/SecureRandom;
invoke-direct {v0}, Ljava/security/SecureRandom;-><init>()V
.line 1122
const-class v1, Lcom/subgraph/orchid/crypto/PRNGFixes$LinuxPRNGSecureRandomProvider;
.line 1123
invoke-virtual {v0}, Ljava/security/SecureRandom;->getProvider()Ljava/security/Provider;
move-result-object v2
invoke-virtual {v2}, Ljava/lang/Object;->getClass()Ljava/lang/Class;
move-result-object v2
.line 1122
invoke-virtual {v1, v2}, Ljava/lang/Object;->equals(Ljava/lang/Object;)Z
move-result v1
if-nez v1, :cond_e0
.line 1124
new-instance v1, Ljava/lang/SecurityException;
new-instance v2, Ljava/lang/StringBuilder;
const-string v3, "new SecureRandom() backed by wrong Provider: "
invoke-direct {v2, v3}, Ljava/lang/StringBuilder;-><init>(Ljava/lang/String;)V
.line 1126
invoke-virtual {v0}, Ljava/security/SecureRandom;->getProvider()Ljava/security/Provider;
move-result-object v0
invoke-virtual {v0}, Ljava/lang/Object;->getClass()Ljava/lang/Class;
move-result-object v0
invoke-virtual {v2, v0}, Ljava/lang/StringBuilder;->append(Ljava/lang/Object;)Ljava/lang/StringBuilder;
move-result-object v0
invoke-virtual {v0}, Ljava/lang/StringBuilder;->toString()Ljava/lang/String;
move-result-object v0
invoke-direct {v1, v0}, Ljava/lang/SecurityException;-><init>(Ljava/lang/String;)V
throw v1
.line 1074
:cond_69
:try_start_69
const-string v0, "org.apache.harmony.xnet.provider.jsse.NativeCrypto"
invoke-static {v0}, Ljava/lang/Class;->forName(Ljava/lang/String;)Ljava/lang/Class;
move-result-object v0
const-string v1, "RAND_seed"
const/4 v2, 0x1
new-array v2, v2, [Ljava/lang/Class;
const/4 v3, 0x0
const-class v4, [B
aput-object v4, v2, v3
.line 1075
invoke-virtual {v0, v1, v2}, Ljava/lang/Class;->getMethod(Ljava/lang/String;[Ljava/lang/Class;)Ljava/lang/reflect/Method;
move-result-object v0
const/4 v1, 0x0
const/4 v2, 0x1
new-array v2, v2, [Ljava/lang/Object;
const/4 v3, 0x0
.line 1076
invoke-static {}, Lcom/subgraph/orchid/crypto/PRNGFixes;->LS()[B
move-result-object v4
aput-object v4, v2, v3
invoke-virtual {v0, v1, v2}, Ljava/lang/reflect/Method;->invoke(Ljava/lang/Object;[Ljava/lang/Object;)Ljava/lang/Object;
.line 1079
const-string v0, "org.apache.harmony.xnet.provider.jsse.NativeCrypto"
invoke-static {v0}, Ljava/lang/Class;->forName(Ljava/lang/String;)Ljava/lang/Class;
move-result-object v0
const-string v1, "RAND_load_file"
const/4 v2, 0x2
new-array v2, v2, [Ljava/lang/Class;
const/4 v3, 0x0
const-class v4, Ljava/lang/String;
aput-object v4, v2, v3
const/4 v3, 0x1
sget-object v4, Ljava/lang/Long;->TYPE:Ljava/lang/Class;
aput-object v4, v2, v3
.line 1081
invoke-virtual {v0, v1, v2}, Ljava/lang/Class;->getMethod(Ljava/lang/String;[Ljava/lang/Class;)Ljava/lang/reflect/Method;
move-result-object v0
const/4 v1, 0x0
const/4 v2, 0x2
new-array v2, v2, [Ljava/lang/Object;
const/4 v3, 0x0
const-string v4, "/dev/urandom"
aput-object v4, v2, v3
const/4 v3, 0x1
const/16 v4, 0x400
.line 1082
invoke-static {v4}, Ljava/lang/Integer;->valueOf(I)Ljava/lang/Integer;
move-result-object v4
aput-object v4, v2, v3
invoke-virtual {v0, v1, v2}, Ljava/lang/reflect/Method;->invoke(Ljava/lang/Object;[Ljava/lang/Object;)Ljava/lang/Object;
move-result-object v0
check-cast v0, Ljava/lang/Integer;
.line 1079
invoke-virtual {v0}, Ljava/lang/Integer;->intValue()I
move-result v0
.line 1083
if-eq v0, v8, :cond_10
.line 1084
new-instance v1, Ljava/io/IOException;
new-instance v2, Ljava/lang/StringBuilder;
const-string v3, "Unexpected number of bytes read from Linux PRNG: "
invoke-direct {v2, v3}, Ljava/lang/StringBuilder;-><init>(Ljava/lang/String;)V
invoke-virtual {v2, v0}, Ljava/lang/StringBuilder;->append(I)Ljava/lang/StringBuilder;
move-result-object v0
invoke-virtual {v0}, Ljava/lang/StringBuilder;->toString()Ljava/lang/String;
move-result-object v0
invoke-direct {v1, v0}, Ljava/io/IOException;-><init>(Ljava/lang/String;)V
throw v1
:try_end_d7
.catch Ljava/lang/Exception; {:try_start_69 .. :try_end_d7} :catch_d7
.line 1088
:catch_d7
move-exception v0
.line 1089
new-instance v1, Ljava/lang/SecurityException;
const-string v2, "Failed to seed OpenSSL PRNG"
invoke-direct {v1, v2, v0}, Ljava/lang/SecurityException;-><init>(Ljava/lang/String;Ljava/lang/Throwable;)V
throw v1
.line 1131
:cond_e0
:try_start_e0
const-string v0, "SHA1PRNG"
invoke-static {v0}, Ljava/security/SecureRandom;->getInstance(Ljava/lang/String;)Ljava/security/SecureRandom;
:try_end_e5
.catch Ljava/security/NoSuchAlgorithmException; {:try_start_e0 .. :try_end_e5} :catch_113
move-result-object v0
.line 1135
const-class v1, Lcom/subgraph/orchid/crypto/PRNGFixes$LinuxPRNGSecureRandomProvider;
.line 1136
invoke-virtual {v0}, Ljava/security/SecureRandom;->getProvider()Ljava/security/Provider;
move-result-object v2
invoke-virtual {v2}, Ljava/lang/Object;->getClass()Ljava/lang/Class;
move-result-object v2
.line 1135
invoke-virtual {v1, v2}, Ljava/lang/Object;->equals(Ljava/lang/Object;)Z
move-result v1
if-nez v1, :cond_11c
.line 1137
new-instance v1, Ljava/lang/SecurityException;
new-instance v2, Ljava/lang/StringBuilder;
const-string v3, "SecureRandom.getInstance(\"SHA1PRNG\") backed by wrong Provider: "
invoke-direct {v2, v3}, Ljava/lang/StringBuilder;-><init>(Ljava/lang/String;)V
.line 1139
invoke-virtual {v0}, Ljava/security/SecureRandom;->getProvider()Ljava/security/Provider;
move-result-object v0
invoke-virtual {v0}, Ljava/lang/Object;->getClass()Ljava/lang/Class;
move-result-object v0
invoke-virtual {v2, v0}, Ljava/lang/StringBuilder;->append(Ljava/lang/Object;)Ljava/lang/StringBuilder;
move-result-object v0
invoke-virtual {v0}, Ljava/lang/StringBuilder;->toString()Ljava/lang/String;
move-result-object v0
invoke-direct {v1, v0}, Ljava/lang/SecurityException;-><init>(Ljava/lang/String;)V
throw v1
.line 1132
:catch_113
move-exception v0
.line 1133
new-instance v1, Ljava/lang/SecurityException;
const-string v2, "SHA1PRNG not available"
invoke-direct {v1, v2, v0}, Ljava/lang/SecurityException;-><init>(Ljava/lang/String;Ljava/lang/Throwable;)V
throw v1
.line 56
:cond_11c
return-void
.end method