翰林优商.apk(点击下载) / f.java


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);
            }
        }
    }
}