package com.huawei.secure.android.common.encrypt.aes; import com.huawei.secure.android.common.encrypt.utils.EncryptUtil; import com.huawei.secure.android.common.encrypt.utils.HexUtil; import com.huawei.secure.android.common.encrypt.utils.b; import java.security.GeneralSecurityException; import java.security.spec.AlgorithmParameterSpec; 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; public class CipherUtil { private static final String a = "CipherUtil"; private static final String b = "AES/GCM/NoPadding"; private static final String c = "AES/CBC/PKCS5Padding"; private static final String d = "AES"; private static final String e = ""; private static final int f = 16; private static final int g = 12; private static final int h = 16; private static Cipher a(byte[] bArr, byte[] bArr2, int i) { return a(bArr, bArr2, i, c); } private static Cipher b(byte[] bArr, byte[] bArr2, int i) { return a(bArr, bArr2, i, b); } public static Cipher getAesCbcDecryptCipher(byte[] bArr, Cipher cipher) { return getAesCbcDecryptCipher(bArr, cipher.getIV()); } public static Cipher getAesCbcEncryptCipher(byte[] bArr) { return getAesCbcEncryptCipher(bArr, EncryptUtil.generateSecureRandom(16)); } public static int getAesCbcEncryptContentLen(byte[] bArr, byte[] bArr2) { return getAesCbcEncryptContentLen(bArr, bArr2, EncryptUtil.generateSecureRandom(16)); } public static Cipher getAesGcmDecryptCipher(byte[] bArr, Cipher cipher) { return getAesGcmDecryptCipher(bArr, cipher.getIV()); } public static Cipher getAesGcmEncryptCipher(byte[] bArr) { byte[] generateSecureRandom = EncryptUtil.generateSecureRandom(12); b.a(a, "getEncryptCipher: iv is : " + HexUtil.byteArray2HexStr(generateSecureRandom)); return getAesGcmEncryptCipher(bArr, generateSecureRandom); } public static int getAesGcmEncryptContentLen(byte[] bArr, byte[] bArr2) { return getAesGcmEncryptContentLen(bArr, bArr2, EncryptUtil.generateSecureRandom(12)); } public static int getContent(Cipher cipher, byte[] bArr, byte[] bArr2) { if (cipher == null || bArr == null) { b.b(a, "getEncryptCOntent: cipher is null or content is null"); return -1; } try { return cipher.doFinal(bArr, 0, bArr.length, bArr2); } catch (BadPaddingException unused) { b.b(a, "getContent: BadPaddingException"); return -1; } catch (IllegalBlockSizeException unused2) { b.b(a, "getContent: IllegalBlockSizeException"); return -1; } catch (ShortBufferException unused3) { b.b(a, "getContent: ShortBufferException"); return -1; } } private static Cipher a(byte[] bArr, byte[] bArr2, int i, String str) { AlgorithmParameterSpec algorithmParameterSpec; if (bArr == null || bArr.length < 16 || bArr2 == null || bArr2.length < 12 || !AesGcm.isBuildVersionHigherThan19()) { b.b(a, "gcm encrypt param is not right"); return null; } try { SecretKeySpec secretKeySpec = new SecretKeySpec(bArr, d); Cipher instance = Cipher.getInstance(str); if (b.equals(str)) { algorithmParameterSpec = AesGcm.getGcmAlgorithmParams(bArr2); } else { algorithmParameterSpec = new IvParameterSpec(bArr2); } instance.init(i, secretKeySpec, algorithmParameterSpec); return instance; } catch (GeneralSecurityException e2) { b.b(a, "GCM encrypt data error" + e2.getMessage()); return null; } } public static Cipher getAesCbcDecryptCipher(byte[] bArr, byte[] bArr2) { return a(bArr, bArr2, 2); } public static Cipher getAesCbcEncryptCipher(byte[] bArr, byte[] bArr2) { return a(bArr, bArr2, 1); } public static int getAesCbcEncryptContentLen(byte[] bArr, byte[] bArr2, byte[] bArr3) { return a(getAesCbcEncryptCipher(bArr2, bArr3), bArr); } public static Cipher getAesGcmDecryptCipher(byte[] bArr, byte[] bArr2) { return b(bArr, bArr2, 2); } public static int getAesGcmEncryptContentLen(byte[] bArr, byte[] bArr2, byte[] bArr3) { return a(getAesGcmEncryptCipher(bArr2, bArr3), bArr); } public static Cipher getAesGcmEncryptCipher(byte[] bArr, byte[] bArr2) { return b(bArr, bArr2, 1); } public static int getContent(Cipher cipher, byte[] bArr, int i, int i2, byte[] bArr2, int i3) throws BadPaddingException, IllegalBlockSizeException, ShortBufferException { if (cipher != null && bArr != null) { return cipher.doFinal(bArr, i, i2, bArr2, i3); } b.b(a, "getEncryptCOntent: cipher is null or content is null"); return -1; } public static byte[] getContent(Cipher cipher, byte[] bArr) { if (cipher == null || bArr == null) { b.b(a, "getEncryptCOntent: cipher is null or content is null"); return new byte[0]; } try { return cipher.doFinal(bArr, 0, bArr.length); } catch (BadPaddingException unused) { b.b(a, "getContent: BadPaddingException"); return new byte[0]; } catch (IllegalBlockSizeException unused2) { b.b(a, "getContent: IllegalBlockSizeException"); return new byte[0]; } } private static int a(Cipher cipher, byte[] bArr) { if (cipher == null || bArr == null) { return -1; } return cipher.getOutputSize(bArr.length); } }