diff options
author | wolfbeast <mcwerewolf@wolfbeast.com> | 2019-04-19 02:02:56 +0200 |
---|---|---|
committer | wolfbeast <mcwerewolf@wolfbeast.com> | 2019-04-19 02:02:56 +0200 |
commit | de75f133a7ec654d2a7c5bf628b3aee9fc109730 (patch) | |
tree | 4771e6d114249bf48d1e843167bcf393de2b98a2 /mobile/android/services/src/main/java/org/mozilla/gecko/sync/crypto/CryptoInfo.java | |
parent | cdc962dca59f2d68b82bec99beb5d67ae163f24a (diff) | |
download | UXP-de75f133a7ec654d2a7c5bf628b3aee9fc109730.tar UXP-de75f133a7ec654d2a7c5bf628b3aee9fc109730.tar.gz UXP-de75f133a7ec654d2a7c5bf628b3aee9fc109730.tar.lz UXP-de75f133a7ec654d2a7c5bf628b3aee9fc109730.tar.xz UXP-de75f133a7ec654d2a7c5bf628b3aee9fc109730.zip |
Remove Firefox Accounts service and tie-ins.
See previous commit for removal of browser identity module.
Diffstat (limited to 'mobile/android/services/src/main/java/org/mozilla/gecko/sync/crypto/CryptoInfo.java')
-rw-r--r-- | mobile/android/services/src/main/java/org/mozilla/gecko/sync/crypto/CryptoInfo.java | 232 |
1 files changed, 0 insertions, 232 deletions
diff --git a/mobile/android/services/src/main/java/org/mozilla/gecko/sync/crypto/CryptoInfo.java b/mobile/android/services/src/main/java/org/mozilla/gecko/sync/crypto/CryptoInfo.java deleted file mode 100644 index 355571c6a..000000000 --- a/mobile/android/services/src/main/java/org/mozilla/gecko/sync/crypto/CryptoInfo.java +++ /dev/null @@ -1,232 +0,0 @@ -/* This Source Code Form is subject to the terms of the Mozilla Public - * License, v. 2.0. If a copy of the MPL was not distributed with this - * file, You can obtain one at http://mozilla.org/MPL/2.0/. */ - -package org.mozilla.gecko.sync.crypto; - -import java.security.GeneralSecurityException; -import java.security.InvalidKeyException; -import java.security.NoSuchAlgorithmException; -import java.util.Arrays; - -import javax.crypto.BadPaddingException; -import javax.crypto.Cipher; -import javax.crypto.IllegalBlockSizeException; -import javax.crypto.Mac; -import javax.crypto.NoSuchPaddingException; -import javax.crypto.spec.IvParameterSpec; -import javax.crypto.spec.SecretKeySpec; - -import org.mozilla.apache.commons.codec.binary.Base64; - -/* - * All info in these objects should be decoded (i.e. not BaseXX encoded). - */ -public class CryptoInfo { - private static final String TRANSFORMATION = "AES/CBC/PKCS5Padding"; - private static final String KEY_ALGORITHM_SPEC = "AES"; - - private byte[] message; - private byte[] iv; - private byte[] hmac; - private KeyBundle keys; - - /** - * Return a CryptoInfo with given plaintext encrypted using given keys. - */ - public static CryptoInfo encrypt(byte[] plaintextBytes, KeyBundle keys) throws CryptoException { - CryptoInfo info = new CryptoInfo(plaintextBytes, keys); - info.encrypt(); - return info; - } - - /** - * Return a CryptoInfo with given plaintext encrypted using given keys and initial vector. - */ - public static CryptoInfo encrypt(byte[] plaintextBytes, byte[] iv, KeyBundle keys) throws CryptoException { - CryptoInfo info = new CryptoInfo(plaintextBytes, iv, null, keys); - info.encrypt(); - return info; - } - - /** - * Return a CryptoInfo with given ciphertext decrypted using given keys and initial vector, verifying that given HMAC validates. - */ - public static CryptoInfo decrypt(byte[] ciphertext, byte[] iv, byte[] hmac, KeyBundle keys) throws CryptoException { - CryptoInfo info = new CryptoInfo(ciphertext, iv, hmac, keys); - info.decrypt(); - return info; - } - - /* - * Constructor typically used when encrypting. - */ - public CryptoInfo(byte[] message, KeyBundle keys) { - this.setMessage(message); - this.setKeys(keys); - } - - /* - * Constructor typically used when decrypting. - */ - public CryptoInfo(byte[] message, byte[] iv, byte[] hmac, KeyBundle keys) { - this.setMessage(message); - this.setIV(iv); - this.setHMAC(hmac); - this.setKeys(keys); - } - - public byte[] getMessage() { - return message; - } - - public void setMessage(byte[] message) { - this.message = message; - } - - public byte[] getIV() { - return iv; - } - - public void setIV(byte[] iv) { - this.iv = iv; - } - - public byte[] getHMAC() { - return hmac; - } - - public void setHMAC(byte[] hmac) { - this.hmac = hmac; - } - - public KeyBundle getKeys() { - return keys; - } - - public void setKeys(KeyBundle keys) { - this.keys = keys; - } - - /* - * Generate HMAC for given cipher text. - */ - public static byte[] generatedHMACFor(byte[] message, KeyBundle keys) throws NoSuchAlgorithmException, InvalidKeyException { - Mac hmacHasher = HKDF.makeHMACHasher(keys.getHMACKey()); - return hmacHasher.doFinal(Base64.encodeBase64(message)); - } - - /* - * Return true if generated HMAC is the same as the specified HMAC. - */ - public boolean generatedHMACIsHMAC() throws NoSuchAlgorithmException, InvalidKeyException { - byte[] generatedHMAC = generatedHMACFor(getMessage(), getKeys()); - byte[] expectedHMAC = getHMAC(); - return Arrays.equals(generatedHMAC, expectedHMAC); - } - - /** - * Performs functionality common to both encryption and decryption. - * - * @param cipher - * @param inputMessage non-BaseXX-encoded message - * @return encrypted/decrypted message - * @throws CryptoException - */ - private static byte[] commonCrypto(Cipher cipher, byte[] inputMessage) - throws CryptoException { - byte[] outputMessage = null; - try { - outputMessage = cipher.doFinal(inputMessage); - } catch (IllegalBlockSizeException | BadPaddingException e) { - throw new CryptoException(e); - } - return outputMessage; - } - - /** - * Encrypt a CryptoInfo in-place. - * - * @throws CryptoException - */ - public void encrypt() throws CryptoException { - - Cipher cipher = CryptoInfo.getCipher(TRANSFORMATION); - try { - byte[] encryptionKey = getKeys().getEncryptionKey(); - SecretKeySpec spec = new SecretKeySpec(encryptionKey, KEY_ALGORITHM_SPEC); - - // If no IV is provided, we allow the cipher to provide one. - if (getIV() == null || getIV().length == 0) { - cipher.init(Cipher.ENCRYPT_MODE, spec); - } else { - cipher.init(Cipher.ENCRYPT_MODE, spec, new IvParameterSpec(getIV())); - } - } catch (GeneralSecurityException ex) { - throw new CryptoException(ex); - } - - // Encrypt. - byte[] encryptedBytes = commonCrypto(cipher, getMessage()); - byte[] iv = cipher.getIV(); - - byte[] hmac; - // Generate HMAC. - try { - hmac = generatedHMACFor(encryptedBytes, keys); - } catch (NoSuchAlgorithmException | InvalidKeyException e) { - throw new CryptoException(e); - } - - // Update in place. keys is already set. - this.setHMAC(hmac); - this.setIV(iv); - this.setMessage(encryptedBytes); - } - - /** - * Decrypt a CryptoInfo in-place. - * - * @throws CryptoException - */ - public void decrypt() throws CryptoException { - - // Check HMAC. - try { - if (!generatedHMACIsHMAC()) { - throw new HMACVerificationException(); - } - } catch (NoSuchAlgorithmException | InvalidKeyException e) { - throw new CryptoException(e); - } - - Cipher cipher = CryptoInfo.getCipher(TRANSFORMATION); - try { - byte[] encryptionKey = getKeys().getEncryptionKey(); - SecretKeySpec spec = new SecretKeySpec(encryptionKey, KEY_ALGORITHM_SPEC); - cipher.init(Cipher.DECRYPT_MODE, spec, new IvParameterSpec(getIV())); - } catch (GeneralSecurityException ex) { - throw new CryptoException(ex); - } - byte[] decryptedBytes = commonCrypto(cipher, getMessage()); - byte[] iv = cipher.getIV(); - - // Update in place. keys is already set. - this.setHMAC(null); - this.setIV(iv); - this.setMessage(decryptedBytes); - } - - /** - * Helper to get a Cipher object. - * - * @param transformation The type of Cipher to get. - */ - private static Cipher getCipher(String transformation) throws CryptoException { - try { - return Cipher.getInstance(transformation); - } catch (NoSuchAlgorithmException | NoSuchPaddingException e) { - throw new CryptoException(e); - } - } -} |