package com.bytedance.pangle.f; import android.util.ArrayMap; import android.util.Pair; import android.util.SparseArray; import java.io.FileDescriptor; import java.io.IOException; import java.io.RandomAccessFile; import java.nio.BufferUnderflowException; import java.nio.ByteBuffer; import java.nio.ByteOrder; import java.security.DigestException; import java.security.MessageDigest; import java.security.NoSuchAlgorithmException; import java.security.spec.AlgorithmParameterSpec; import java.security.spec.MGF1ParameterSpec; import java.security.spec.PSSParameterSpec; import java.util.Arrays; import java.util.HashMap; import java.util.HashSet; import java.util.Map; /* access modifiers changed from: package-private */ public final class f { static final HashMap<String, SparseArray<m>> a = new HashMap<>(); static void a(Map<Integer, byte[]> map, RandomAccessFile randomAccessFile, m mVar) { if (!map.isEmpty()) { ArrayMap arrayMap = new ArrayMap(); boolean z = true; if (map.containsKey(1)) { arrayMap.put(1, map.get(1)); } if (map.containsKey(2)) { arrayMap.put(2, map.get(2)); } boolean z2 = false; if (!arrayMap.isEmpty()) { try { a(arrayMap, randomAccessFile.getFD(), mVar); z = false; } catch (IOException e) { throw new SecurityException("Cannot get FD", e); } } if (map.containsKey(3)) { try { if (!Arrays.equals(a(map.get(3), randomAccessFile.length(), mVar), g.a(randomAccessFile, mVar, new i() { /* class com.bytedance.pangle.f.f.AnonymousClass1 */ @Override // com.bytedance.pangle.f.i public final ByteBuffer a(int i) { return ByteBuffer.allocate(i); } }).b)) { throw new SecurityException("APK verity digest of contents did not verify"); } } catch (IOException | DigestException | NoSuchAlgorithmException e2) { throw new SecurityException("Error during verification", e2); } } else { z2 = z; } if (z2) { throw new SecurityException("No known digest exists for integrity check"); } return; } throw new SecurityException("No digests provided"); } private static void a(Map<Integer, byte[]> map, FileDescriptor fileDescriptor, m mVar) { l lVar = new l(fileDescriptor, 0, mVar.b); l lVar2 = new l(fileDescriptor, mVar.c, mVar.d - mVar.c); ByteBuffer duplicate = mVar.e.duplicate(); duplicate.order(ByteOrder.LITTLE_ENDIAN); long j = mVar.b; s.a(duplicate); int position = duplicate.position() + 16; if (j < 0 || j > 4294967295L) { throw new IllegalArgumentException("uint32 value of out range: ".concat(String.valueOf(j))); } duplicate.putInt(duplicate.position() + position, (int) j); h hVar = new h(duplicate); int size = map.size(); int[] iArr = new int[size]; int i = 0; for (Integer num : map.keySet()) { iArr[i] = num.intValue(); i++; } try { byte[][] a2 = a(iArr, new k[]{lVar, lVar2, hVar}); for (int i2 = 0; i2 < size; i2++) { int i3 = iArr[i2]; if (!MessageDigest.isEqual(map.get(Integer.valueOf(i3)), a2[i2])) { throw new SecurityException(b(i3) + " digest of contents did not verify"); } } } catch (DigestException e) { throw new SecurityException("Failed to compute digest(s) of contents", e); } } private static byte[][] a(int[] iArr, k[] kVarArr) { int i; long j; long j2 = 0; long j3 = 0; int i2 = 0; while (true) { i = 3; j = 1048576; if (i2 >= 3) { break; } j3 += ((kVarArr[i2].a() + 1048576) - 1) / 1048576; i2++; } if (j3 < 2097151) { int i3 = (int) j3; byte[][] bArr = new byte[iArr.length][]; for (int i4 = 0; i4 < iArr.length; i4++) { byte[] bArr2 = new byte[((e(iArr[i4]) * i3) + 5)]; bArr2[0] = 90; a(i3, bArr2); bArr[i4] = bArr2; } byte[] bArr3 = new byte[5]; bArr3[0] = -91; int length = iArr.length; MessageDigest[] messageDigestArr = new MessageDigest[length]; for (int i5 = 0; i5 < iArr.length; i5++) { String b = b(iArr[i5]); try { messageDigestArr[i5] = MessageDigest.getInstance(b); } catch (NoSuchAlgorithmException e) { throw new RuntimeException(b + " digest not supported", e); } } a aVar = new a(messageDigestArr); int i6 = 0; int i7 = 0; int i8 = 0; while (i6 < i) { k kVar = kVarArr[i6]; long j4 = j2; int i9 = i8; a aVar2 = aVar; long a2 = kVar.a(); while (a2 > j2) { int min = (int) Math.min(a2, j); a(min, bArr3); for (int i10 = 0; i10 < length; i10++) { messageDigestArr[i10].update(bArr3); } try { kVar.a(aVar2, j4, min); aVar2 = aVar2; int i11 = 0; while (i11 < iArr.length) { int i12 = iArr[i11]; byte[] bArr4 = bArr[i11]; int e2 = e(i12); MessageDigest messageDigest = messageDigestArr[i11]; int digest = messageDigest.digest(bArr4, (i9 * e2) + 5, e2); if (digest == e2) { i11++; bArr3 = bArr3; length = length; messageDigestArr = messageDigestArr; } else { throw new RuntimeException("Unexpected output size of " + messageDigest.getAlgorithm() + " digest: " + digest); } } long j5 = (long) min; long j6 = j4 + j5; a2 -= j5; i9++; j2 = 0; j = 1048576; kVar = kVar; bArr3 = bArr3; j4 = j6; } catch (IOException e3) { throw new DigestException("Failed to digest chunk #" + i9 + " of section #" + i7, e3); } } i7++; i6++; i8 = i9; aVar = aVar2; j2 = 0; i = 3; j = 1048576; } byte[][] bArr5 = new byte[iArr.length][]; for (int i13 = 0; i13 < iArr.length; i13++) { int i14 = iArr[i13]; byte[] bArr6 = bArr[i13]; String b2 = b(i14); try { bArr5[i13] = MessageDigest.getInstance(b2).digest(bArr6); } catch (NoSuchAlgorithmException e4) { throw new RuntimeException(b2 + " digest not supported", e4); } } return bArr5; } throw new DigestException("Too many chunks: ".concat(String.valueOf(j3))); } static byte[] a(byte[] bArr, long j, m mVar) { if (bArr.length == 40) { ByteBuffer order = ByteBuffer.wrap(bArr).order(ByteOrder.LITTLE_ENDIAN); order.position(32); if (order.getLong() == j - (mVar.c - mVar.b)) { return Arrays.copyOfRange(bArr, 0, 32); } throw new SecurityException("APK content size did not verify"); } throw new SecurityException("Verity digest size is wrong: " + bArr.length); } static int a(int i, int i2) { int a2 = a(i); int a3 = a(i2); if (a2 != 1) { if (a2 == 2) { if (a3 != 1) { if (a3 == 2) { return 0; } if (a3 != 3) { throw new IllegalArgumentException("Unknown digestAlgorithm2: ".concat(String.valueOf(a3))); } } return 1; } else if (a2 != 3) { throw new IllegalArgumentException("Unknown digestAlgorithm1: ".concat(String.valueOf(a2))); } else if (a3 == 1) { return 1; } else { if (a3 == 2) { return -1; } if (a3 == 3) { return 0; } throw new IllegalArgumentException("Unknown digestAlgorithm2: ".concat(String.valueOf(a3))); } } else if (a3 == 1) { return 0; } else { if (a3 == 2 || a3 == 3) { return -1; } throw new IllegalArgumentException("Unknown digestAlgorithm2: ".concat(String.valueOf(a3))); } } static int a(int i) { if (i == 513) { return 1; } if (i == 514) { return 2; } if (i == 769) { return 1; } if (i == 1057 || i == 1059 || i == 1061) { return 3; } switch (i) { case 257: case 259: return 1; case 258: case 260: return 2; default: throw new IllegalArgumentException("Unknown signature algorithm: 0x" + Long.toHexString((long) (i & -1))); } } static String b(int i) { if (i == 1) { return "SHA-256"; } if (i == 2) { return "SHA-512"; } if (i == 3) { return "SHA-256"; } throw new IllegalArgumentException("Unknown content digest algorthm: ".concat(String.valueOf(i))); } private static int e(int i) { if (i == 1) { return 32; } if (i == 2) { return 64; } if (i == 3) { return 32; } throw new IllegalArgumentException("Unknown content digest algorthm: ".concat(String.valueOf(i))); } static String c(int i) { if (i == 513 || i == 514) { return "EC"; } if (i == 769) { return "DSA"; } if (i == 1057) { return "RSA"; } if (i == 1059) { return "EC"; } if (i == 1061) { return "DSA"; } switch (i) { case 257: case 258: case 259: case 260: return "RSA"; default: throw new IllegalArgumentException("Unknown signature algorithm: 0x" + Long.toHexString((long) (i & -1))); } } static Pair<String, ? extends AlgorithmParameterSpec> d(int i) { if (i != 513) { if (i == 514) { return Pair.create("SHA512withECDSA", null); } if (i != 769) { if (i != 1057) { if (i != 1059) { if (i != 1061) { switch (i) { case 257: return Pair.create("SHA256withRSA/PSS", new PSSParameterSpec("SHA-256", "MGF1", MGF1ParameterSpec.SHA256, 32, 1)); case 258: return Pair.create("SHA512withRSA/PSS", new PSSParameterSpec("SHA-512", "MGF1", MGF1ParameterSpec.SHA512, 64, 1)); case 259: break; case 260: return Pair.create("SHA512withRSA", null); default: throw new IllegalArgumentException("Unknown signature algorithm: 0x" + Long.toHexString((long) (i & -1))); } } } } return Pair.create("SHA256withRSA", null); } return Pair.create("SHA256withDSA", null); } return Pair.create("SHA256withECDSA", null); } /* JADX INFO: finally extract failed */ private static ByteBuffer a(ByteBuffer byteBuffer, int i) { if (i >= 8) { int capacity = byteBuffer.capacity(); if (i <= byteBuffer.capacity()) { int limit = byteBuffer.limit(); int position = byteBuffer.position(); try { byteBuffer.position(0); byteBuffer.limit(i); byteBuffer.position(8); ByteBuffer slice = byteBuffer.slice(); slice.order(byteBuffer.order()); byteBuffer.position(0); byteBuffer.limit(limit); byteBuffer.position(position); return slice; } catch (Throwable th) { byteBuffer.position(0); byteBuffer.limit(limit); byteBuffer.position(position); throw th; } } else { throw new IllegalArgumentException("end > capacity: " + i + " > " + capacity); } } else { throw new IllegalArgumentException("end < start: " + i + " < 8"); } } private static ByteBuffer b(ByteBuffer byteBuffer, int i) { if (i >= 0) { int limit = byteBuffer.limit(); int position = byteBuffer.position(); int i2 = i + position; if (i2 < position || i2 > limit) { throw new BufferUnderflowException(); } byteBuffer.limit(i2); try { ByteBuffer slice = byteBuffer.slice(); slice.order(byteBuffer.order()); byteBuffer.position(i2); return slice; } finally { byteBuffer.limit(limit); } } else { throw new IllegalArgumentException("size: ".concat(String.valueOf(i))); } } static ByteBuffer a(ByteBuffer byteBuffer) { if (byteBuffer.remaining() >= 4) { int i = byteBuffer.getInt(); if (i < 0) { throw new IllegalArgumentException("Negative length"); } else if (i <= byteBuffer.remaining()) { return b(byteBuffer, i); } else { throw new IOException("Length-prefixed field longer than remaining buffer. Field length: " + i + ", remaining: " + byteBuffer.remaining()); } } else { throw new IOException("Remaining buffer too short to contain length of length-prefixed field. Remaining: " + byteBuffer.remaining()); } } static byte[] b(ByteBuffer byteBuffer) { int i = byteBuffer.getInt(); if (i < 0) { throw new IOException("Negative length"); } else if (i <= byteBuffer.remaining()) { byte[] bArr = new byte[i]; byteBuffer.get(bArr); return bArr; } else { throw new IOException("Underflow while reading length-prefixed value. Length: " + i + ", available: " + byteBuffer.remaining()); } } private static void a(int i, byte[] bArr) { bArr[1] = (byte) (i & 255); bArr[2] = (byte) ((i >>> 8) & 255); bArr[3] = (byte) ((i >>> 16) & 255); bArr[4] = (byte) ((i >>> 24) & 255); } /* JADX WARNING: Removed duplicated region for block: B:14:0x0052 */ /* JADX WARNING: Removed duplicated region for block: B:73:0x0237 */ static void a(String str, RandomAccessFile randomAccessFile, int... iArr) { Pair<ByteBuffer, Long> pair; boolean z; ByteBuffer byteBuffer; Pair pair2; long j; long j2; String str2 = str; a.put(str2, new SparseArray<>()); if (randomAccessFile.length() < 22) { pair = null; } else { pair = s.a(randomAccessFile, 0); if (pair == null) { pair = s.a(randomAccessFile, 65535); } } if (pair != null) { ByteBuffer byteBuffer2 = (ByteBuffer) pair.first; long longValue = ((Long) pair.second).longValue(); long j3 = longValue - 20; if (j3 >= 0) { randomAccessFile.seek(j3); if (randomAccessFile.readInt() == 1347094023) { z = true; if (z) { s.a(byteBuffer2); long a2 = s.a(byteBuffer2, byteBuffer2.position() + 16); if (a2 <= longValue) { s.a(byteBuffer2); if (s.a(byteBuffer2, byteBuffer2.position() + 12) + a2 != longValue) { throw new n("ZIP Central Directory is not immediately followed by End of Central Directory"); } else if (a2 >= 32) { ByteBuffer allocate = ByteBuffer.allocate(24); allocate.order(ByteOrder.LITTLE_ENDIAN); randomAccessFile.seek(a2 - ((long) allocate.capacity())); randomAccessFile.readFully(allocate.array(), allocate.arrayOffset(), allocate.capacity()); int i = 8; if (allocate.getLong(8) == 2334950737559900225L && allocate.getLong(16) == 3617552046287187010L) { long j4 = allocate.getLong(0); if (j4 < ((long) allocate.capacity()) || j4 > 2147483639) { throw new n("APK Signing Block size out of range: ".concat(String.valueOf(j4))); } int i2 = (int) (8 + j4); byteBuffer = byteBuffer2; long j5 = a2 - ((long) i2); if (j5 >= 0) { ByteBuffer allocate2 = ByteBuffer.allocate(i2); allocate2.order(ByteOrder.LITTLE_ENDIAN); randomAccessFile.seek(j5); randomAccessFile.readFully(allocate2.array(), allocate2.arrayOffset(), allocate2.capacity()); long j6 = allocate2.getLong(0); if (j6 == j4) { pair2 = Pair.create(allocate2, Long.valueOf(j5)); } else { throw new n("APK Signing Block sizes in header and footer do not match: " + j6 + " vs " + j4); } } else { throw new n("APK Signing Block offset out of range: ".concat(String.valueOf(j5))); } } else { byteBuffer = byteBuffer2; pair2 = null; } if (pair2 != null) { ByteBuffer byteBuffer3 = (ByteBuffer) pair2.first; long longValue2 = ((Long) pair2.second).longValue(); if (byteBuffer3.order() == ByteOrder.LITTLE_ENDIAN) { ByteBuffer a3 = a(byteBuffer3, byteBuffer3.capacity() - 24); HashSet hashSet = new HashSet(); for (int i3 = 0; i3 < 2; i3++) { hashSet.add(Integer.valueOf(iArr[i3])); } while (a3.hasRemaining() && a3.remaining() >= i) { long j7 = a3.getLong(); if (j7 >= 4 && j7 <= 2147483647L) { int i4 = (int) j7; int position = a3.position() + i4; if (i4 <= a3.remaining()) { int i5 = a3.getInt(); if (hashSet.contains(Integer.valueOf(i5))) { j = a2; j2 = longValue; a.get(str2).put(i5, new m(b(a3, i4 - 4), longValue2, a2, longValue, byteBuffer)); } else { j = a2; j2 = longValue; } a3.position(position); str2 = str; a2 = j; longValue = j2; i = 8; } else { return; } } else { return; } } return; } throw new IllegalArgumentException("ByteBuffer byte order must be little endian"); } return; } else { throw new n("APK too small for APK Signing Block. ZIP Central Directory offset: ".concat(String.valueOf(a2))); } } else { throw new n("ZIP Central Directory offset out of range: " + a2 + ". ZIP End of Central Directory offset: " + longValue); } } else { throw new n("ZIP64 APK not supported"); } } } z = false; if (z) { } } else { throw new n("Not an APK file: ZIP End of Central Directory record not found"); } } /* access modifiers changed from: package-private */ public static class a implements j { private final MessageDigest[] a; a(MessageDigest[] messageDigestArr) { this.a = messageDigestArr; } @Override // com.bytedance.pangle.f.j public final void a(ByteBuffer byteBuffer) { ByteBuffer slice = byteBuffer.slice(); MessageDigest[] messageDigestArr = this.a; for (MessageDigest messageDigest : messageDigestArr) { slice.position(0); messageDigest.update(slice); } } } }