- Added realracing3-community.apk (71.57 MB) - Removed 32-bit support (armeabi-v7a) - Only includes arm64-v8a libraries - Decompiled source code included - Added README-community.md with analysis
150 lines
5.3 KiB
Java
150 lines
5.3 KiB
Java
package com.google.android.gms.internal.ads;
|
|
|
|
import java.security.GeneralSecurityException;
|
|
import java.util.Arrays;
|
|
import javax.crypto.AEADBadTagException;
|
|
import javax.crypto.BadPaddingException;
|
|
import javax.crypto.Cipher;
|
|
import javax.crypto.IllegalBlockSizeException;
|
|
import javax.crypto.ShortBufferException;
|
|
import javax.crypto.spec.IvParameterSpec;
|
|
import javax.crypto.spec.SecretKeySpec;
|
|
import kotlin.jvm.internal.ByteCompanionObject;
|
|
|
|
/* loaded from: classes3.dex */
|
|
public final class zzgum implements zzgdn {
|
|
private static final ThreadLocal zza = new zzguk();
|
|
private static final ThreadLocal zzb = new zzgul();
|
|
private final byte[] zzc;
|
|
private final byte[] zzd;
|
|
private final byte[] zze;
|
|
private final SecretKeySpec zzf;
|
|
private final int zzg;
|
|
|
|
private zzgum(byte[] bArr, int i, byte[] bArr2) throws GeneralSecurityException {
|
|
if (!zzgks.zza(1)) {
|
|
throw new GeneralSecurityException("Can not use AES-EAX in FIPS-mode.");
|
|
}
|
|
if (i != 12 && i != 16) {
|
|
throw new IllegalArgumentException("IV size should be either 12 or 16 bytes");
|
|
}
|
|
this.zzg = i;
|
|
zzgvm.zza(bArr.length);
|
|
SecretKeySpec secretKeySpec = new SecretKeySpec(bArr, "AES");
|
|
this.zzf = secretKeySpec;
|
|
Cipher cipher = (Cipher) zza.get();
|
|
cipher.init(1, secretKeySpec);
|
|
byte[] zzd = zzd(cipher.doFinal(new byte[16]));
|
|
this.zzc = zzd;
|
|
this.zzd = zzd(zzd);
|
|
this.zze = bArr2;
|
|
}
|
|
|
|
public static zzgdn zzb(zzgfn zzgfnVar) throws GeneralSecurityException {
|
|
if (zzgks.zza(1)) {
|
|
return new zzgum(zzgfnVar.zzd().zzd(zzgdw.zza()), zzgfnVar.zzb().zzb(), zzgfnVar.zzc().zzc());
|
|
}
|
|
throw new GeneralSecurityException("Can not use AES-EAX in FIPS-mode.");
|
|
}
|
|
|
|
private static void zzc(byte[] bArr, byte[] bArr2) {
|
|
int length = bArr.length;
|
|
for (int i = 0; i < length; i++) {
|
|
bArr[i] = (byte) (bArr[i] ^ bArr2[i]);
|
|
}
|
|
}
|
|
|
|
private static byte[] zzd(byte[] bArr) {
|
|
byte[] bArr2 = new byte[16];
|
|
int i = 0;
|
|
while (i < 15) {
|
|
byte b = bArr[i];
|
|
int i2 = i + 1;
|
|
bArr2[i] = (byte) (((b + b) ^ ((bArr[i2] & 255) >>> 7)) & 255);
|
|
i = i2;
|
|
}
|
|
byte b2 = bArr[15];
|
|
bArr2[15] = (byte) (((bArr[0] >> 7) & 135) ^ (b2 + b2));
|
|
return bArr2;
|
|
}
|
|
|
|
private final byte[] zze(Cipher cipher, int i, byte[] bArr, int i2, int i3) throws IllegalBlockSizeException, BadPaddingException, ShortBufferException {
|
|
int length;
|
|
byte[] bArr2 = new byte[16];
|
|
bArr2[15] = (byte) i;
|
|
if (i3 == 0) {
|
|
zzc(bArr2, this.zzc);
|
|
return cipher.doFinal(bArr2);
|
|
}
|
|
byte[] bArr3 = new byte[16];
|
|
cipher.doFinal(bArr2, 0, 16, bArr3);
|
|
int i4 = 0;
|
|
while (true) {
|
|
byte[] bArr4 = bArr2;
|
|
bArr2 = bArr3;
|
|
bArr3 = bArr4;
|
|
if (i3 - i4 <= 16) {
|
|
break;
|
|
}
|
|
for (int i5 = 0; i5 < 16; i5++) {
|
|
bArr2[i5] = (byte) (bArr[(i2 + i4) + i5] ^ bArr2[i5]);
|
|
}
|
|
cipher.doFinal(bArr2, 0, 16, bArr3);
|
|
i4 += 16;
|
|
}
|
|
byte[] copyOfRange = Arrays.copyOfRange(bArr, i4 + i2, i2 + i3);
|
|
if (copyOfRange.length == 16) {
|
|
zzc(copyOfRange, this.zzc);
|
|
} else {
|
|
byte[] copyOf = Arrays.copyOf(this.zzd, 16);
|
|
int i6 = 0;
|
|
while (true) {
|
|
length = copyOfRange.length;
|
|
if (i6 >= length) {
|
|
break;
|
|
}
|
|
copyOf[i6] = (byte) (copyOf[i6] ^ copyOfRange[i6]);
|
|
i6++;
|
|
}
|
|
copyOf[length] = (byte) (copyOf[length] ^ ByteCompanionObject.MIN_VALUE);
|
|
copyOfRange = copyOf;
|
|
}
|
|
zzc(bArr2, copyOfRange);
|
|
cipher.doFinal(bArr2, 0, 16, bArr3);
|
|
return bArr3;
|
|
}
|
|
|
|
@Override // com.google.android.gms.internal.ads.zzgdn
|
|
public final byte[] zza(byte[] bArr, byte[] bArr2) throws GeneralSecurityException {
|
|
byte[] bArr3 = this.zze;
|
|
int length = bArr.length;
|
|
int length2 = ((length - bArr3.length) - this.zzg) - 16;
|
|
if (length2 < 0) {
|
|
throw new GeneralSecurityException("ciphertext too short");
|
|
}
|
|
if (!zzgnu.zzc(bArr3, bArr)) {
|
|
throw new GeneralSecurityException("Decryption failed (OutputPrefix mismatch).");
|
|
}
|
|
Cipher cipher = (Cipher) zza.get();
|
|
cipher.init(1, this.zzf);
|
|
byte[] zze = zze(cipher, 0, bArr, this.zze.length, this.zzg);
|
|
if (bArr2 == null) {
|
|
bArr2 = new byte[0];
|
|
}
|
|
byte[] bArr4 = bArr2;
|
|
byte[] zze2 = zze(cipher, 1, bArr4, 0, bArr4.length);
|
|
byte[] zze3 = zze(cipher, 2, bArr, this.zze.length + this.zzg, length2);
|
|
int i = length - 16;
|
|
byte b = 0;
|
|
for (int i2 = 0; i2 < 16; i2++) {
|
|
b = (byte) (b | (((bArr[i + i2] ^ zze2[i2]) ^ zze[i2]) ^ zze3[i2]));
|
|
}
|
|
if (b != 0) {
|
|
throw new AEADBadTagException("tag mismatch");
|
|
}
|
|
Cipher cipher2 = (Cipher) zzb.get();
|
|
cipher2.init(1, this.zzf, new IvParameterSpec(zze));
|
|
return cipher2.doFinal(bArr, this.zze.length + this.zzg, length2);
|
|
}
|
|
}
|