class android.util.jar.StrictJarVerifier
minor version: 0
major version: 59
flags: flags: (0x0020) ACC_SUPER
this_class: android.util.jar.StrictJarVerifier
super_class: java.lang.Object
{
private static final java.lang.String SF_ATTRIBUTE_ANDROID_APK_SIGNED_NAME;
descriptor: Ljava/lang/String;
flags: (0x001a) ACC_PRIVATE, ACC_STATIC, ACC_FINAL
ConstantValue: "X-Android-APK-Signed"
private static final java.lang.String[] DIGEST_ALGORITHMS;
descriptor: [Ljava/lang/String;
flags: (0x001a) ACC_PRIVATE, ACC_STATIC, ACC_FINAL
private final java.lang.String jarName;
descriptor: Ljava/lang/String;
flags: (0x0012) ACC_PRIVATE, ACC_FINAL
private final android.util.jar.StrictJarManifest manifest;
descriptor: Landroid/util/jar/StrictJarManifest;
flags: (0x0012) ACC_PRIVATE, ACC_FINAL
private final java.util.HashMap<java.lang.String, byte[]> metaEntries;
descriptor: Ljava/util/HashMap;
flags: (0x0012) ACC_PRIVATE, ACC_FINAL
Signature: Ljava/util/HashMap<Ljava/lang/String;[B>;
private final int mainAttributesEnd;
descriptor: I
flags: (0x0012) ACC_PRIVATE, ACC_FINAL
private final boolean signatureSchemeRollbackProtectionsEnforced;
descriptor: Z
flags: (0x0012) ACC_PRIVATE, ACC_FINAL
private final java.util.Hashtable<java.lang.String, java.util.HashMap<java.lang.String, java.util.jar.Attributes>> signatures;
descriptor: Ljava/util/Hashtable;
flags: (0x0012) ACC_PRIVATE, ACC_FINAL
Signature: Ljava/util/Hashtable<Ljava/lang/String;Ljava/util/HashMap<Ljava/lang/String;Ljava/util/jar/Attributes;>;>;
private final java.util.Hashtable<java.lang.String, java.security.cert.Certificate[]> certificates;
descriptor: Ljava/util/Hashtable;
flags: (0x0012) ACC_PRIVATE, ACC_FINAL
Signature: Ljava/util/Hashtable<Ljava/lang/String;[Ljava/security/cert/Certificate;>;
private final java.util.Hashtable<java.lang.String, java.security.cert.Certificate[][]> verifiedEntries;
descriptor: Ljava/util/Hashtable;
flags: (0x0012) ACC_PRIVATE, ACC_FINAL
Signature: Ljava/util/Hashtable<Ljava/lang/String;[[Ljava/security/cert/Certificate;>;
static void <clinit>();
descriptor: ()V
flags: (0x0008) ACC_STATIC
Code:
stack=4, locals=0, args_size=0
0: iconst_4
anewarray java.lang.String
dup
iconst_0
1: ldc "SHA-512"
aastore
dup
iconst_1
2: ldc "SHA-384"
aastore
dup
iconst_2
3: ldc "SHA-256"
aastore
dup
iconst_3
4: ldc "SHA1"
aastore
5: putstatic android.util.jar.StrictJarVerifier.DIGEST_ALGORITHMS:[Ljava/lang/String;
6: return
LocalVariableTable:
Start End Slot Name Signature
private static java.lang.SecurityException invalidDigest(java.lang.String, java.lang.String, java.lang.String);
descriptor: (Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;)Ljava/lang/SecurityException;
flags: (0x000a) ACC_PRIVATE, ACC_STATIC
Code:
stack=5, locals=3, args_size=3
start local 0 start local 1 start local 2 0: new java.lang.SecurityException
dup
new java.lang.StringBuilder
dup
aload 0
invokestatic java.lang.String.valueOf:(Ljava/lang/Object;)Ljava/lang/String;
invokespecial java.lang.StringBuilder.<init>:(Ljava/lang/String;)V
ldc " has invalid digest for "
invokevirtual java.lang.StringBuilder.append:(Ljava/lang/String;)Ljava/lang/StringBuilder;
aload 1
invokevirtual java.lang.StringBuilder.append:(Ljava/lang/String;)Ljava/lang/StringBuilder;
1: ldc " in "
invokevirtual java.lang.StringBuilder.append:(Ljava/lang/String;)Ljava/lang/StringBuilder;
aload 2
invokevirtual java.lang.StringBuilder.append:(Ljava/lang/String;)Ljava/lang/StringBuilder;
invokevirtual java.lang.StringBuilder.toString:()Ljava/lang/String;
2: invokespecial java.lang.SecurityException.<init>:(Ljava/lang/String;)V
athrow
end local 2 end local 1 end local 0 LocalVariableTable:
Start End Slot Name Signature
0 3 0 signatureFile Ljava/lang/String;
0 3 1 name Ljava/lang/String;
0 3 2 jarName Ljava/lang/String;
MethodParameters:
Name Flags
signatureFile
name
jarName
private static java.lang.SecurityException failedVerification(java.lang.String, java.lang.String);
descriptor: (Ljava/lang/String;Ljava/lang/String;)Ljava/lang/SecurityException;
flags: (0x000a) ACC_PRIVATE, ACC_STATIC
Code:
stack=5, locals=2, args_size=2
start local 0 start local 1 0: new java.lang.SecurityException
dup
new java.lang.StringBuilder
dup
aload 0
invokestatic java.lang.String.valueOf:(Ljava/lang/Object;)Ljava/lang/String;
invokespecial java.lang.StringBuilder.<init>:(Ljava/lang/String;)V
ldc " failed verification of "
invokevirtual java.lang.StringBuilder.append:(Ljava/lang/String;)Ljava/lang/StringBuilder;
aload 1
invokevirtual java.lang.StringBuilder.append:(Ljava/lang/String;)Ljava/lang/StringBuilder;
invokevirtual java.lang.StringBuilder.toString:()Ljava/lang/String;
invokespecial java.lang.SecurityException.<init>:(Ljava/lang/String;)V
athrow
end local 1 end local 0 LocalVariableTable:
Start End Slot Name Signature
0 1 0 jarName Ljava/lang/String;
0 1 1 signatureFile Ljava/lang/String;
MethodParameters:
Name Flags
jarName
signatureFile
private static java.lang.SecurityException failedVerification(java.lang.String, java.lang.String, java.lang.Throwable);
descriptor: (Ljava/lang/String;Ljava/lang/String;Ljava/lang/Throwable;)Ljava/lang/SecurityException;
flags: (0x000a) ACC_PRIVATE, ACC_STATIC
Code:
stack=5, locals=3, args_size=3
start local 0 start local 1 start local 2 0: new java.lang.SecurityException
dup
new java.lang.StringBuilder
dup
aload 0
invokestatic java.lang.String.valueOf:(Ljava/lang/Object;)Ljava/lang/String;
invokespecial java.lang.StringBuilder.<init>:(Ljava/lang/String;)V
ldc " failed verification of "
invokevirtual java.lang.StringBuilder.append:(Ljava/lang/String;)Ljava/lang/StringBuilder;
aload 1
invokevirtual java.lang.StringBuilder.append:(Ljava/lang/String;)Ljava/lang/StringBuilder;
invokevirtual java.lang.StringBuilder.toString:()Ljava/lang/String;
aload 2
invokespecial java.lang.SecurityException.<init>:(Ljava/lang/String;Ljava/lang/Throwable;)V
athrow
end local 2 end local 1 end local 0 LocalVariableTable:
Start End Slot Name Signature
0 1 0 jarName Ljava/lang/String;
0 1 1 signatureFile Ljava/lang/String;
0 1 2 e Ljava/lang/Throwable;
MethodParameters:
Name Flags
jarName
signatureFile
e
void <init>(java.lang.String, android.util.jar.StrictJarManifest, java.util.HashMap<java.lang.String, byte[]>, );
descriptor: (Ljava/lang/String;Landroid/util/jar/StrictJarManifest;Ljava/util/HashMap;Z)V
flags: (0x0000)
Code:
stack=4, locals=5, args_size=5
start local 0 start local 1 start local 2 start local 3 start local 4 0: aload 0
invokespecial java.lang.Object.<init>:()V
1: aload 0
2: new java.util.Hashtable
dup
iconst_5
invokespecial java.util.Hashtable.<init>:(I)V
putfield android.util.jar.StrictJarVerifier.signatures:Ljava/util/Hashtable;
3: aload 0
4: new java.util.Hashtable
dup
iconst_5
invokespecial java.util.Hashtable.<init>:(I)V
putfield android.util.jar.StrictJarVerifier.certificates:Ljava/util/Hashtable;
5: aload 0
6: new java.util.Hashtable
dup
invokespecial java.util.Hashtable.<init>:()V
putfield android.util.jar.StrictJarVerifier.verifiedEntries:Ljava/util/Hashtable;
7: aload 0
aload 1
putfield android.util.jar.StrictJarVerifier.jarName:Ljava/lang/String;
8: aload 0
aload 2
putfield android.util.jar.StrictJarVerifier.manifest:Landroid/util/jar/StrictJarManifest;
9: aload 0
aload 3
putfield android.util.jar.StrictJarVerifier.metaEntries:Ljava/util/HashMap;
10: aload 0
aload 2
invokevirtual android.util.jar.StrictJarManifest.getMainAttributesEnd:()I
putfield android.util.jar.StrictJarVerifier.mainAttributesEnd:I
11: aload 0
12: iload 4
13: putfield android.util.jar.StrictJarVerifier.signatureSchemeRollbackProtectionsEnforced:Z
14: return
end local 4 end local 3 end local 2 end local 1 end local 0 LocalVariableTable:
Start End Slot Name Signature
0 15 0 this Landroid/util/jar/StrictJarVerifier;
0 15 1 name Ljava/lang/String;
0 15 2 manifest Landroid/util/jar/StrictJarManifest;
0 15 3 metaEntries Ljava/util/HashMap<Ljava/lang/String;[B>;
0 15 4 signatureSchemeRollbackProtectionsEnforced Z
Signature: (Ljava/lang/String;Landroid/util/jar/StrictJarManifest;Ljava/util/HashMap<Ljava/lang/String;[B>;Z)V
MethodParameters:
Name Flags
name
manifest
metaEntries
signatureSchemeRollbackProtectionsEnforced
android.util.jar.StrictJarVerifier$VerifierEntry initEntry(java.lang.String);
descriptor: (Ljava/lang/String;)Landroid/util/jar/StrictJarVerifier$VerifierEntry;
flags: (0x0000)
Code:
stack=7, locals=10, args_size=2
start local 0 start local 1 0: aload 0
getfield android.util.jar.StrictJarVerifier.manifest:Landroid/util/jar/StrictJarManifest;
ifnull 1
aload 0
getfield android.util.jar.StrictJarVerifier.signatures:Ljava/util/Hashtable;
invokevirtual java.util.Hashtable.isEmpty:()Z
ifeq 2
1: StackMap locals:
StackMap stack:
aconst_null
areturn
2: StackMap locals:
StackMap stack:
aload 0
getfield android.util.jar.StrictJarVerifier.manifest:Landroid/util/jar/StrictJarManifest;
aload 1
invokevirtual android.util.jar.StrictJarManifest.getAttributes:(Ljava/lang/String;)Ljava/util/jar/Attributes;
astore 2
start local 2 3: aload 2
ifnonnull 5
4: aconst_null
areturn
5: StackMap locals: java.util.jar.Attributes
StackMap stack:
new java.util.ArrayList
dup
invokespecial java.util.ArrayList.<init>:()V
astore 3
start local 3 6: aload 0
getfield android.util.jar.StrictJarVerifier.signatures:Ljava/util/Hashtable;
invokevirtual java.util.Hashtable.entrySet:()Ljava/util/Set;
invokeinterface java.util.Set.iterator:()Ljava/util/Iterator;
astore 4
start local 4 7: goto 15
8: StackMap locals: java.util.ArrayList java.util.Iterator
StackMap stack:
aload 4
invokeinterface java.util.Iterator.next:()Ljava/lang/Object;
checkcast java.util.Map$Entry
astore 5
start local 5 9: aload 5
invokeinterface java.util.Map$Entry.getValue:()Ljava/lang/Object;
checkcast java.util.HashMap
astore 6
start local 6 10: aload 6
aload 1
invokevirtual java.util.HashMap.get:(Ljava/lang/Object;)Ljava/lang/Object;
ifnull 15
11: aload 5
invokeinterface java.util.Map$Entry.getKey:()Ljava/lang/Object;
checkcast java.lang.String
astore 7
start local 7 12: aload 0
getfield android.util.jar.StrictJarVerifier.certificates:Ljava/util/Hashtable;
aload 7
invokevirtual java.util.Hashtable.get:(Ljava/lang/Object;)Ljava/lang/Object;
checkcast java.security.cert.Certificate[]
astore 8
start local 8 13: aload 8
ifnull 15
14: aload 3
aload 8
invokevirtual java.util.ArrayList.add:(Ljava/lang/Object;)Z
pop
end local 8 end local 7 end local 6 end local 5 15: StackMap locals:
StackMap stack:
aload 4
invokeinterface java.util.Iterator.hasNext:()Z
ifne 8
16: aload 3
invokevirtual java.util.ArrayList.isEmpty:()Z
ifeq 18
17: aconst_null
areturn
18: StackMap locals:
StackMap stack:
aload 3
aload 3
invokevirtual java.util.ArrayList.size:()I
anewarray java.security.cert.Certificate[]
invokevirtual java.util.ArrayList.toArray:([Ljava/lang/Object;)[Ljava/lang/Object;
checkcast java.security.cert.Certificate[][]
astore 5
start local 5 19: iconst_0
istore 6
start local 6 20: goto 32
21: StackMap locals: java.security.cert.Certificate[][] int
StackMap stack:
getstatic android.util.jar.StrictJarVerifier.DIGEST_ALGORITHMS:[Ljava/lang/String;
iload 6
aaload
astore 7
start local 7 22: aload 2
new java.lang.StringBuilder
dup
aload 7
invokestatic java.lang.String.valueOf:(Ljava/lang/Object;)Ljava/lang/String;
invokespecial java.lang.StringBuilder.<init>:(Ljava/lang/String;)V
ldc "-Digest"
invokevirtual java.lang.StringBuilder.append:(Ljava/lang/String;)Ljava/lang/StringBuilder;
invokevirtual java.lang.StringBuilder.toString:()Ljava/lang/String;
invokevirtual java.util.jar.Attributes.getValue:(Ljava/lang/String;)Ljava/lang/String;
astore 8
start local 8 23: aload 8
ifnonnull 25
24: goto 31
25: StackMap locals: java.lang.String java.lang.String
StackMap stack:
aload 8
getstatic java.nio.charset.StandardCharsets.ISO_8859_1:Ljava/nio/charset/Charset;
invokevirtual java.lang.String.getBytes:(Ljava/nio/charset/Charset;)[B
astore 9
start local 9 26: new android.util.jar.StrictJarVerifier$VerifierEntry
dup
aload 1
aload 7
invokestatic java.security.MessageDigest.getInstance:(Ljava/lang/String;)Ljava/security/MessageDigest;
aload 9
27: aload 5
aload 0
getfield android.util.jar.StrictJarVerifier.verifiedEntries:Ljava/util/Hashtable;
28: invokespecial android.util.jar.StrictJarVerifier$VerifierEntry.<init>:(Ljava/lang/String;Ljava/security/MessageDigest;[B[[Ljava/security/cert/Certificate;Ljava/util/Hashtable;)V
29: areturn
30: StackMap locals: android.util.jar.StrictJarVerifier java.lang.String java.util.jar.Attributes java.util.ArrayList java.util.Iterator java.security.cert.Certificate[][] int java.lang.String java.lang.String byte[]
StackMap stack: java.security.NoSuchAlgorithmException
pop
end local 9 end local 8 end local 7 31: StackMap locals:
StackMap stack:
iinc 6 1
StackMap locals:
StackMap stack:
32: iload 6
getstatic android.util.jar.StrictJarVerifier.DIGEST_ALGORITHMS:[Ljava/lang/String;
arraylength
if_icmplt 21
end local 6 33: aconst_null
areturn
end local 5 end local 4 end local 3 end local 2 end local 1 end local 0 LocalVariableTable:
Start End Slot Name Signature
0 34 0 this Landroid/util/jar/StrictJarVerifier;
0 34 1 name Ljava/lang/String;
3 34 2 attributes Ljava/util/jar/Attributes;
6 34 3 certChains Ljava/util/ArrayList<[Ljava/security/cert/Certificate;>;
7 34 4 it Ljava/util/Iterator<Ljava/util/Map$Entry<Ljava/lang/String;Ljava/util/HashMap<Ljava/lang/String;Ljava/util/jar/Attributes;>;>;>;
9 15 5 entry Ljava/util/Map$Entry<Ljava/lang/String;Ljava/util/HashMap<Ljava/lang/String;Ljava/util/jar/Attributes;>;>;
10 15 6 hm Ljava/util/HashMap<Ljava/lang/String;Ljava/util/jar/Attributes;>;
12 15 7 signatureFile Ljava/lang/String;
13 15 8 certChain [Ljava/security/cert/Certificate;
19 34 5 certChainsArray [[Ljava/security/cert/Certificate;
20 33 6 i I
22 31 7 algorithm Ljava/lang/String;
23 31 8 hash Ljava/lang/String;
26 31 9 hashBytes [B
Exception table:
from to target type
26 29 30 Class java.security.NoSuchAlgorithmException
MethodParameters:
Name Flags
name
void addMetaEntry(java.lang.String, byte[]);
descriptor: (Ljava/lang/String;[B)V
flags: (0x0000)
Code:
stack=3, locals=3, args_size=3
start local 0 start local 1 start local 2 0: aload 0
getfield android.util.jar.StrictJarVerifier.metaEntries:Ljava/util/HashMap;
aload 1
getstatic java.util.Locale.US:Ljava/util/Locale;
invokevirtual java.lang.String.toUpperCase:(Ljava/util/Locale;)Ljava/lang/String;
aload 2
invokevirtual java.util.HashMap.put:(Ljava/lang/Object;Ljava/lang/Object;)Ljava/lang/Object;
pop
1: return
end local 2 end local 1 end local 0 LocalVariableTable:
Start End Slot Name Signature
0 2 0 this Landroid/util/jar/StrictJarVerifier;
0 2 1 name Ljava/lang/String;
0 2 2 buf [B
MethodParameters:
Name Flags
name
buf
synchronized boolean readCertificates();
descriptor: ()Z
flags: (0x0020) ACC_SYNCHRONIZED
Code:
stack=2, locals=3, args_size=1
start local 0 0: aload 0
getfield android.util.jar.StrictJarVerifier.metaEntries:Ljava/util/HashMap;
invokevirtual java.util.HashMap.isEmpty:()Z
ifeq 2
1: iconst_0
ireturn
2: StackMap locals:
StackMap stack:
aload 0
getfield android.util.jar.StrictJarVerifier.metaEntries:Ljava/util/HashMap;
invokevirtual java.util.HashMap.keySet:()Ljava/util/Set;
invokeinterface java.util.Set.iterator:()Ljava/util/Iterator;
astore 1
start local 1 3: goto 8
4: StackMap locals: java.util.Iterator
StackMap stack:
aload 1
invokeinterface java.util.Iterator.next:()Ljava/lang/Object;
checkcast java.lang.String
astore 2
start local 2 5: aload 2
ldc ".DSA"
invokevirtual java.lang.String.endsWith:(Ljava/lang/String;)Z
ifne 6
aload 2
ldc ".RSA"
invokevirtual java.lang.String.endsWith:(Ljava/lang/String;)Z
ifne 6
aload 2
ldc ".EC"
invokevirtual java.lang.String.endsWith:(Ljava/lang/String;)Z
ifeq 8
6: StackMap locals: java.lang.String
StackMap stack:
aload 0
aload 2
invokevirtual android.util.jar.StrictJarVerifier.verifyCertificate:(Ljava/lang/String;)V
7: aload 1
invokeinterface java.util.Iterator.remove:()V
end local 2 8: StackMap locals:
StackMap stack:
aload 1
invokeinterface java.util.Iterator.hasNext:()Z
ifne 4
9: iconst_1
ireturn
end local 1 end local 0 LocalVariableTable:
Start End Slot Name Signature
0 10 0 this Landroid/util/jar/StrictJarVerifier;
3 10 1 it Ljava/util/Iterator<Ljava/lang/String;>;
5 8 2 key Ljava/lang/String;
static java.security.cert.Certificate[] verifyBytes(byte[], byte[]);
descriptor: ([B[B)[Ljava/security/cert/Certificate;
flags: (0x0008) ACC_STATIC
Code:
stack=4, locals=9, args_size=2
start local 0 start local 1 0: aconst_null
astore 2
start local 2 1: invokestatic sun.security.jca.Providers.startJarVerification:()Ljava/lang/Object;
astore 2
2: new sun.security.pkcs.PKCS7
dup
aload 0
invokespecial sun.security.pkcs.PKCS7.<init>:([B)V
astore 3
start local 3 3: aload 3
aload 1
invokevirtual sun.security.pkcs.PKCS7.verify:([B)[Lsun/security/pkcs/SignerInfo;
astore 4
start local 4 4: aload 4
ifnull 5
aload 4
arraylength
ifne 8
5: StackMap locals: java.lang.Object sun.security.pkcs.PKCS7 sun.security.pkcs.SignerInfo[]
StackMap stack:
new java.security.GeneralSecurityException
dup
6: ldc "Failed to verify signature: no verified SignerInfos"
7: invokespecial java.security.GeneralSecurityException.<init>:(Ljava/lang/String;)V
athrow
8: StackMap locals:
StackMap stack:
aload 4
iconst_0
aaload
astore 5
start local 5 9: aload 5
aload 3
invokevirtual sun.security.pkcs.SignerInfo.getCertificateChain:(Lsun/security/pkcs/PKCS7;)Ljava/util/ArrayList;
10: astore 6
start local 6 11: aload 6
ifnonnull 15
12: new java.security.GeneralSecurityException
dup
13: ldc "Failed to find verified SignerInfo certificate chain"
14: invokespecial java.security.GeneralSecurityException.<init>:(Ljava/lang/String;)V
athrow
15: StackMap locals: sun.security.pkcs.SignerInfo java.util.List
StackMap stack:
aload 6
invokeinterface java.util.List.isEmpty:()Z
ifeq 19
16: new java.security.GeneralSecurityException
dup
17: ldc "Verified SignerInfo certificate chain is emtpy"
18: invokespecial java.security.GeneralSecurityException.<init>:(Ljava/lang/String;)V
athrow
19: StackMap locals:
StackMap stack:
aload 6
20: aload 6
invokeinterface java.util.List.size:()I
anewarray java.security.cert.X509Certificate
21: invokeinterface java.util.List.toArray:([Ljava/lang/Object;)[Ljava/lang/Object;
checkcast java.security.cert.Certificate[]
astore 8
22: aload 2
invokestatic sun.security.jca.Providers.stopJarVerification:(Ljava/lang/Object;)V
23: aload 8
areturn
end local 6 end local 5 end local 4 end local 3 24: StackMap locals: byte[] byte[] java.lang.Object
StackMap stack: java.io.IOException
astore 3
start local 3 25: new java.security.GeneralSecurityException
dup
ldc "IO exception verifying jar cert"
aload 3
invokespecial java.security.GeneralSecurityException.<init>:(Ljava/lang/String;Ljava/lang/Throwable;)V
athrow
end local 3 26: StackMap locals:
StackMap stack: java.lang.Throwable
astore 7
27: aload 2
invokestatic sun.security.jca.Providers.stopJarVerification:(Ljava/lang/Object;)V
28: aload 7
athrow
end local 2 end local 1 end local 0 LocalVariableTable:
Start End Slot Name Signature
0 29 0 blockBytes [B
0 29 1 sfBytes [B
1 29 2 obj Ljava/lang/Object;
3 24 3 block Lsun/security/pkcs/PKCS7;
4 24 4 verifiedSignerInfos [Lsun/security/pkcs/SignerInfo;
9 24 5 verifiedSignerInfo Lsun/security/pkcs/SignerInfo;
11 24 6 verifiedSignerCertChain Ljava/util/List<Ljava/security/cert/X509Certificate;>;
25 26 3 e Ljava/io/IOException;
Exception table:
from to target type
1 22 24 Class java.io.IOException
1 22 26 any
24 26 26 any
Exceptions:
throws java.security.GeneralSecurityException
MethodParameters:
Name Flags
blockBytes
sfBytes
private void verifyCertificate(java.lang.String);
descriptor: (Ljava/lang/String;)V
flags: (0x0002) ACC_PRIVATE
Code:
stack=8, locals=14, args_size=2
start local 0 start local 1 0: new java.lang.StringBuilder
dup
aload 1
iconst_0
aload 1
bipush 46
invokevirtual java.lang.String.lastIndexOf:(I)I
invokevirtual java.lang.String.substring:(II)Ljava/lang/String;
invokestatic java.lang.String.valueOf:(Ljava/lang/Object;)Ljava/lang/String;
invokespecial java.lang.StringBuilder.<init>:(Ljava/lang/String;)V
ldc ".SF"
invokevirtual java.lang.StringBuilder.append:(Ljava/lang/String;)Ljava/lang/StringBuilder;
invokevirtual java.lang.StringBuilder.toString:()Ljava/lang/String;
astore 2
start local 2 1: aload 0
getfield android.util.jar.StrictJarVerifier.metaEntries:Ljava/util/HashMap;
aload 2
invokevirtual java.util.HashMap.get:(Ljava/lang/Object;)Ljava/lang/Object;
checkcast byte[]
astore 3
start local 3 2: aload 3
ifnonnull 4
3: return
4: StackMap locals: java.lang.String byte[]
StackMap stack:
aload 0
getfield android.util.jar.StrictJarVerifier.metaEntries:Ljava/util/HashMap;
ldc "META-INF/MANIFEST.MF"
invokevirtual java.util.HashMap.get:(Ljava/lang/Object;)Ljava/lang/Object;
checkcast byte[]
astore 4
start local 4 5: aload 4
ifnonnull 7
6: return
7: StackMap locals: byte[]
StackMap stack:
aload 0
getfield android.util.jar.StrictJarVerifier.metaEntries:Ljava/util/HashMap;
aload 1
invokevirtual java.util.HashMap.get:(Ljava/lang/Object;)Ljava/lang/Object;
checkcast byte[]
astore 5
start local 5 8: aload 5
aload 3
invokestatic android.util.jar.StrictJarVerifier.verifyBytes:([B[B)[Ljava/security/cert/Certificate;
astore 6
start local 6 9: aload 6
ifnull 14
10: aload 0
getfield android.util.jar.StrictJarVerifier.certificates:Ljava/util/Hashtable;
aload 2
aload 6
invokevirtual java.util.Hashtable.put:(Ljava/lang/Object;Ljava/lang/Object;)Ljava/lang/Object;
pop
end local 6 11: goto 14
StackMap locals: android.util.jar.StrictJarVerifier java.lang.String java.lang.String byte[] byte[] byte[]
StackMap stack: java.security.GeneralSecurityException
12: astore 6
start local 6 13: aload 0
getfield android.util.jar.StrictJarVerifier.jarName:Ljava/lang/String;
aload 2
aload 6
invokestatic android.util.jar.StrictJarVerifier.failedVerification:(Ljava/lang/String;Ljava/lang/String;Ljava/lang/Throwable;)Ljava/lang/SecurityException;
athrow
end local 6 14: StackMap locals:
StackMap stack:
new java.util.jar.Attributes
dup
invokespecial java.util.jar.Attributes.<init>:()V
astore 6
start local 6 15: new java.util.HashMap
dup
invokespecial java.util.HashMap.<init>:()V
astore 7
start local 7 16: new android.util.jar.StrictJarManifestReader
dup
aload 3
aload 6
invokespecial android.util.jar.StrictJarManifestReader.<init>:([BLjava/util/jar/Attributes;)V
astore 8
start local 8 17: aload 8
aload 7
aconst_null
invokevirtual android.util.jar.StrictJarManifestReader.readEntries:(Ljava/util/Map;Ljava/util/Map;)V
end local 8 18: goto 21
StackMap locals: android.util.jar.StrictJarVerifier java.lang.String java.lang.String byte[] byte[] byte[] java.util.jar.Attributes java.util.HashMap
StackMap stack: java.io.IOException
19: pop
20: return
21: StackMap locals:
StackMap stack:
aload 0
getfield android.util.jar.StrictJarVerifier.signatureSchemeRollbackProtectionsEnforced:Z
ifeq 53
22: aload 6
ldc "X-Android-APK-Signed"
invokevirtual java.util.jar.Attributes.getValue:(Ljava/lang/String;)Ljava/lang/String;
23: astore 8
start local 8 24: aload 8
ifnull 53
25: iconst_0
istore 9
start local 9 26: iconst_0
istore 10
start local 10 27: new java.util.StringTokenizer
dup
aload 8
ldc ","
invokespecial java.util.StringTokenizer.<init>:(Ljava/lang/String;Ljava/lang/String;)V
astore 11
start local 11 28: goto 42
29: StackMap locals: android.util.jar.StrictJarVerifier java.lang.String java.lang.String byte[] byte[] byte[] java.util.jar.Attributes java.util.HashMap java.lang.String int int java.util.StringTokenizer
StackMap stack:
aload 11
invokevirtual java.util.StringTokenizer.nextToken:()Ljava/lang/String;
invokevirtual java.lang.String.trim:()Ljava/lang/String;
astore 12
start local 12 30: aload 12
invokevirtual java.lang.String.isEmpty:()Z
ifeq 32
31: goto 42
32: StackMap locals: java.lang.String
StackMap stack:
aload 12
invokestatic java.lang.Integer.parseInt:(Ljava/lang/String;)I
istore 13
start local 13 33: goto 36
end local 13 StackMap locals:
StackMap stack: java.lang.Exception
34: pop
35: goto 42
start local 13 36: StackMap locals: int
StackMap stack:
iload 13
iconst_2
if_icmpne 39
37: iconst_1
istore 9
38: goto 43
39: StackMap locals:
StackMap stack:
iload 13
iconst_3
if_icmpne 42
40: iconst_1
istore 10
41: goto 43
end local 13 end local 12 42: StackMap locals:
StackMap stack:
aload 11
invokevirtual java.util.StringTokenizer.hasMoreTokens:()Z
ifne 29
43: StackMap locals:
StackMap stack:
iload 9
ifeq 48
44: new java.lang.SecurityException
dup
new java.lang.StringBuilder
dup
aload 2
invokestatic java.lang.String.valueOf:(Ljava/lang/Object;)Ljava/lang/String;
invokespecial java.lang.StringBuilder.<init>:(Ljava/lang/String;)V
ldc " indicates "
invokevirtual java.lang.StringBuilder.append:(Ljava/lang/String;)Ljava/lang/StringBuilder;
aload 0
getfield android.util.jar.StrictJarVerifier.jarName:Ljava/lang/String;
invokevirtual java.lang.StringBuilder.append:(Ljava/lang/String;)Ljava/lang/StringBuilder;
45: ldc " is signed using APK Signature Scheme v2, but no such signature was"
invokevirtual java.lang.StringBuilder.append:(Ljava/lang/String;)Ljava/lang/StringBuilder;
46: ldc " found. Signature stripped?"
invokevirtual java.lang.StringBuilder.append:(Ljava/lang/String;)Ljava/lang/StringBuilder;
invokevirtual java.lang.StringBuilder.toString:()Ljava/lang/String;
47: invokespecial java.lang.SecurityException.<init>:(Ljava/lang/String;)V
athrow
48: StackMap locals:
StackMap stack:
iload 10
ifeq 53
49: new java.lang.SecurityException
dup
new java.lang.StringBuilder
dup
aload 2
invokestatic java.lang.String.valueOf:(Ljava/lang/Object;)Ljava/lang/String;
invokespecial java.lang.StringBuilder.<init>:(Ljava/lang/String;)V
ldc " indicates "
invokevirtual java.lang.StringBuilder.append:(Ljava/lang/String;)Ljava/lang/StringBuilder;
aload 0
getfield android.util.jar.StrictJarVerifier.jarName:Ljava/lang/String;
invokevirtual java.lang.StringBuilder.append:(Ljava/lang/String;)Ljava/lang/StringBuilder;
50: ldc " is signed using APK Signature Scheme v3, but no such signature was"
invokevirtual java.lang.StringBuilder.append:(Ljava/lang/String;)Ljava/lang/StringBuilder;
51: ldc " found. Signature stripped?"
invokevirtual java.lang.StringBuilder.append:(Ljava/lang/String;)Ljava/lang/StringBuilder;
invokevirtual java.lang.StringBuilder.toString:()Ljava/lang/String;
52: invokespecial java.lang.SecurityException.<init>:(Ljava/lang/String;)V
athrow
end local 11 end local 10 end local 9 end local 8 53: StackMap locals: android.util.jar.StrictJarVerifier java.lang.String java.lang.String byte[] byte[] byte[] java.util.jar.Attributes java.util.HashMap
StackMap stack:
aload 6
getstatic java.util.jar.Attributes$Name.SIGNATURE_VERSION:Ljava/util/jar/Attributes$Name;
invokevirtual java.util.jar.Attributes.get:(Ljava/lang/Object;)Ljava/lang/Object;
ifnonnull 55
54: return
55: StackMap locals:
StackMap stack:
iconst_0
istore 8
start local 8 56: aload 6
ldc "Created-By"
invokevirtual java.util.jar.Attributes.getValue:(Ljava/lang/String;)Ljava/lang/String;
astore 9
start local 9 57: aload 9
ifnull 61
58: aload 9
ldc "signtool"
invokevirtual java.lang.String.indexOf:(Ljava/lang/String;)I
iconst_m1
if_icmpeq 59
iconst_1
goto 60
StackMap locals: int java.lang.String
StackMap stack:
59: iconst_0
StackMap locals:
StackMap stack: int
60: istore 8
61: StackMap locals:
StackMap stack:
aload 0
getfield android.util.jar.StrictJarVerifier.mainAttributesEnd:I
ifle 65
iload 8
ifne 65
62: ldc "-Digest-Manifest-Main-Attributes"
astore 10
start local 10 63: aload 0
aload 6
aload 10
aload 4
iconst_0
aload 0
getfield android.util.jar.StrictJarVerifier.mainAttributesEnd:I
iconst_0
iconst_1
invokevirtual android.util.jar.StrictJarVerifier.verify:(Ljava/util/jar/Attributes;Ljava/lang/String;[BIIZZ)Z
ifne 65
64: aload 0
getfield android.util.jar.StrictJarVerifier.jarName:Ljava/lang/String;
aload 2
invokestatic android.util.jar.StrictJarVerifier.failedVerification:(Ljava/lang/String;Ljava/lang/String;)Ljava/lang/SecurityException;
athrow
end local 10 65: StackMap locals:
StackMap stack:
iload 8
ifeq 66
ldc "-Digest"
goto 67
StackMap locals:
StackMap stack:
66: ldc "-Digest-Manifest"
StackMap locals:
StackMap stack: java.lang.String
67: astore 10
start local 10 68: aload 0
aload 6
aload 10
aload 4
iconst_0
aload 4
arraylength
iconst_0
iconst_0
invokevirtual android.util.jar.StrictJarVerifier.verify:(Ljava/util/jar/Attributes;Ljava/lang/String;[BIIZZ)Z
ifne 81
69: aload 7
invokevirtual java.util.HashMap.entrySet:()Ljava/util/Set;
invokeinterface java.util.Set.iterator:()Ljava/util/Iterator;
astore 11
start local 11 70: goto 80
71: StackMap locals: java.lang.String java.util.Iterator
StackMap stack:
aload 11
invokeinterface java.util.Iterator.next:()Ljava/lang/Object;
checkcast java.util.Map$Entry
astore 12
start local 12 72: aload 0
getfield android.util.jar.StrictJarVerifier.manifest:Landroid/util/jar/StrictJarManifest;
aload 12
invokeinterface java.util.Map$Entry.getKey:()Ljava/lang/Object;
checkcast java.lang.String
invokevirtual android.util.jar.StrictJarManifest.getChunk:(Ljava/lang/String;)Landroid/util/jar/StrictJarManifest$Chunk;
astore 13
start local 13 73: aload 13
ifnonnull 75
74: return
75: StackMap locals: java.util.Map$Entry android.util.jar.StrictJarManifest$Chunk
StackMap stack:
aload 0
aload 12
invokeinterface java.util.Map$Entry.getValue:()Ljava/lang/Object;
checkcast java.util.jar.Attributes
ldc "-Digest"
aload 4
76: aload 13
getfield android.util.jar.StrictJarManifest$Chunk.start:I
aload 13
getfield android.util.jar.StrictJarManifest$Chunk.end:I
iload 8
iconst_0
77: invokevirtual android.util.jar.StrictJarVerifier.verify:(Ljava/util/jar/Attributes;Ljava/lang/String;[BIIZZ)Z
78: ifne 80
79: aload 2
aload 12
invokeinterface java.util.Map$Entry.getKey:()Ljava/lang/Object;
checkcast java.lang.String
aload 0
getfield android.util.jar.StrictJarVerifier.jarName:Ljava/lang/String;
invokestatic android.util.jar.StrictJarVerifier.invalidDigest:(Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;)Ljava/lang/SecurityException;
athrow
end local 13 end local 12 80: StackMap locals:
StackMap stack:
aload 11
invokeinterface java.util.Iterator.hasNext:()Z
ifne 71
end local 11 81: StackMap locals:
StackMap stack:
aload 0
getfield android.util.jar.StrictJarVerifier.metaEntries:Ljava/util/HashMap;
aload 2
aconst_null
invokevirtual java.util.HashMap.put:(Ljava/lang/Object;Ljava/lang/Object;)Ljava/lang/Object;
pop
82: aload 0
getfield android.util.jar.StrictJarVerifier.signatures:Ljava/util/Hashtable;
aload 2
aload 7
invokevirtual java.util.Hashtable.put:(Ljava/lang/Object;Ljava/lang/Object;)Ljava/lang/Object;
pop
83: return
end local 10 end local 9 end local 8 end local 7 end local 6 end local 5 end local 4 end local 3 end local 2 end local 1 end local 0 LocalVariableTable:
Start End Slot Name Signature
0 84 0 this Landroid/util/jar/StrictJarVerifier;
0 84 1 certFile Ljava/lang/String;
1 84 2 signatureFile Ljava/lang/String;
2 84 3 sfBytes [B
5 84 4 manifestBytes [B
8 84 5 sBlockBytes [B
9 11 6 signerCertChain [Ljava/security/cert/Certificate;
13 14 6 e Ljava/security/GeneralSecurityException;
15 84 6 attributes Ljava/util/jar/Attributes;
16 84 7 entries Ljava/util/HashMap<Ljava/lang/String;Ljava/util/jar/Attributes;>;
17 18 8 im Landroid/util/jar/StrictJarManifestReader;
24 53 8 apkSignatureSchemeIdList Ljava/lang/String;
26 53 9 v2SignatureGenerated Z
27 53 10 v3SignatureGenerated Z
28 53 11 tokenizer Ljava/util/StringTokenizer;
30 42 12 idText Ljava/lang/String;
33 34 13 id I
36 42 13 id I
56 84 8 createdBySigntool Z
57 84 9 createdBy Ljava/lang/String;
63 65 10 digestAttribute Ljava/lang/String;
68 84 10 digestAttribute Ljava/lang/String;
70 81 11 it Ljava/util/Iterator<Ljava/util/Map$Entry<Ljava/lang/String;Ljava/util/jar/Attributes;>;>;
72 80 12 entry Ljava/util/Map$Entry<Ljava/lang/String;Ljava/util/jar/Attributes;>;
73 80 13 chunk Landroid/util/jar/StrictJarManifest$Chunk;
Exception table:
from to target type
8 11 12 Class java.security.GeneralSecurityException
16 18 19 Class java.io.IOException
32 33 34 Class java.lang.Exception
MethodParameters:
Name Flags
certFile
boolean isSignedJar();
descriptor: ()Z
flags: (0x0000)
Code:
stack=1, locals=1, args_size=1
start local 0 0: aload 0
getfield android.util.jar.StrictJarVerifier.certificates:Ljava/util/Hashtable;
invokevirtual java.util.Hashtable.size:()I
ifle 1
iconst_1
ireturn
StackMap locals:
StackMap stack:
1: iconst_0
ireturn
end local 0 LocalVariableTable:
Start End Slot Name Signature
0 2 0 this Landroid/util/jar/StrictJarVerifier;
private boolean verify(java.util.jar.Attributes, java.lang.String, byte[], int, int, boolean, boolean);
descriptor: (Ljava/util/jar/Attributes;Ljava/lang/String;[BIIZZ)Z
flags: (0x0002) ACC_PRIVATE
Code:
stack=5, locals=14, args_size=8
start local 0 start local 1 start local 2 start local 3 start local 4 start local 5 start local 6 start local 7 0: iconst_0
istore 8
start local 8 1: goto 18
2: StackMap locals: int
StackMap stack:
getstatic android.util.jar.StrictJarVerifier.DIGEST_ALGORITHMS:[Ljava/lang/String;
iload 8
aaload
astore 9
start local 9 3: aload 1
new java.lang.StringBuilder
dup
aload 9
invokestatic java.lang.String.valueOf:(Ljava/lang/Object;)Ljava/lang/String;
invokespecial java.lang.StringBuilder.<init>:(Ljava/lang/String;)V
aload 2
invokevirtual java.lang.StringBuilder.append:(Ljava/lang/String;)Ljava/lang/StringBuilder;
invokevirtual java.lang.StringBuilder.toString:()Ljava/lang/String;
invokevirtual java.util.jar.Attributes.getValue:(Ljava/lang/String;)Ljava/lang/String;
astore 10
start local 10 4: aload 10
ifnonnull 6
5: goto 17
6: StackMap locals: java.lang.String java.lang.String
StackMap stack:
aload 9
invokestatic java.security.MessageDigest.getInstance:(Ljava/lang/String;)Ljava/security/MessageDigest;
astore 11
start local 11 7: goto 10
end local 11 StackMap locals:
StackMap stack: java.security.NoSuchAlgorithmException
8: pop
9: goto 17
start local 11 10: StackMap locals: java.security.MessageDigest
StackMap stack:
iload 6
ifeq 13
aload 3
iload 5
iconst_1
isub
baload
bipush 10
if_icmpne 13
aload 3
iload 5
iconst_2
isub
baload
bipush 10
if_icmpne 13
11: aload 11
aload 3
iload 4
iload 5
iconst_1
isub
iload 4
isub
invokevirtual java.security.MessageDigest.update:([BII)V
12: goto 14
13: StackMap locals:
StackMap stack:
aload 11
aload 3
iload 4
iload 5
iload 4
isub
invokevirtual java.security.MessageDigest.update:([BII)V
14: StackMap locals:
StackMap stack:
aload 11
invokevirtual java.security.MessageDigest.digest:()[B
astore 12
start local 12 15: aload 10
getstatic java.nio.charset.StandardCharsets.ISO_8859_1:Ljava/nio/charset/Charset;
invokevirtual java.lang.String.getBytes:(Ljava/nio/charset/Charset;)[B
astore 13
start local 13 16: aload 12
aload 13
invokestatic android.util.jar.StrictJarVerifier.verifyMessageDigest:([B[B)Z
ireturn
end local 13 end local 12 end local 11 end local 10 end local 9 17: StackMap locals:
StackMap stack:
iinc 8 1
StackMap locals:
StackMap stack:
18: iload 8
getstatic android.util.jar.StrictJarVerifier.DIGEST_ALGORITHMS:[Ljava/lang/String;
arraylength
if_icmplt 2
end local 8 19: iload 7
ireturn
end local 7 end local 6 end local 5 end local 4 end local 3 end local 2 end local 1 end local 0 LocalVariableTable:
Start End Slot Name Signature
0 20 0 this Landroid/util/jar/StrictJarVerifier;
0 20 1 attributes Ljava/util/jar/Attributes;
0 20 2 entry Ljava/lang/String;
0 20 3 data [B
0 20 4 start I
0 20 5 end I
0 20 6 ignoreSecondEndline Z
0 20 7 ignorable Z
1 19 8 i I
3 17 9 algorithm Ljava/lang/String;
4 17 10 hash Ljava/lang/String;
7 8 11 md Ljava/security/MessageDigest;
10 17 11 md Ljava/security/MessageDigest;
15 17 12 b [B
16 17 13 encodedHashBytes [B
Exception table:
from to target type
6 7 8 Class java.security.NoSuchAlgorithmException
MethodParameters:
Name Flags
attributes
entry
data
start
end
ignoreSecondEndline
ignorable
private static boolean verifyMessageDigest(byte[], byte[]);
descriptor: ([B[B)Z
flags: (0x000a) ACC_PRIVATE, ACC_STATIC
Code:
stack=2, locals=3, args_size=2
start local 0 start local 1 0: invokestatic java.util.Base64.getDecoder:()Ljava/util/Base64$Decoder;
aload 1
invokevirtual java.util.Base64$Decoder.decode:([B)[B
astore 2
start local 2 1: goto 4
end local 2 StackMap locals:
StackMap stack: java.lang.IllegalArgumentException
2: pop
3: iconst_0
ireturn
start local 2 4: StackMap locals: byte[]
StackMap stack:
aload 0
aload 2
invokestatic java.security.MessageDigest.isEqual:([B[B)Z
ireturn
end local 2 end local 1 end local 0 LocalVariableTable:
Start End Slot Name Signature
0 5 0 expected [B
0 5 1 encodedActual [B
1 2 2 actual [B
4 5 2 actual [B
Exception table:
from to target type
0 1 2 Class java.lang.IllegalArgumentException
MethodParameters:
Name Flags
expected
encodedActual
java.security.cert.Certificate[][] getCertificateChains(java.lang.String);
descriptor: (Ljava/lang/String;)[[Ljava/security/cert/Certificate;
flags: (0x0000)
Code:
stack=2, locals=2, args_size=2
start local 0 start local 1 0: aload 0
getfield android.util.jar.StrictJarVerifier.verifiedEntries:Ljava/util/Hashtable;
aload 1
invokevirtual java.util.Hashtable.get:(Ljava/lang/Object;)Ljava/lang/Object;
checkcast java.security.cert.Certificate[][]
areturn
end local 1 end local 0 LocalVariableTable:
Start End Slot Name Signature
0 1 0 this Landroid/util/jar/StrictJarVerifier;
0 1 1 name Ljava/lang/String;
MethodParameters:
Name Flags
name
void removeMetaEntries();
descriptor: ()V
flags: (0x0000)
Code:
stack=1, locals=1, args_size=1
start local 0 0: aload 0
getfield android.util.jar.StrictJarVerifier.metaEntries:Ljava/util/HashMap;
invokevirtual java.util.HashMap.clear:()V
1: return
end local 0 LocalVariableTable:
Start End Slot Name Signature
0 2 0 this Landroid/util/jar/StrictJarVerifier;
}
SourceFile: "StrictJarVerifier.java"
NestMembers:
android.util.jar.StrictJarVerifier$VerifierEntry
InnerClasses:
final Chunk = android.util.jar.StrictJarManifest$Chunk of android.util.jar.StrictJarManifest
VerifierEntry = android.util.jar.StrictJarVerifier$VerifierEntry of android.util.jar.StrictJarVerifier
public Decoder = java.util.Base64$Decoder of java.util.Base64
public abstract Entry = java.util.Map$Entry of java.util.Map
public Name = java.util.jar.Attributes$Name of java.util.jar.Attributes