public static MasterSecret changeMasterSecretPassphrase( Context context, MasterSecret masterSecret, String newPassphrase) { try { byte[] combinedSecrets = Util.combine( masterSecret.getEncryptionKey().getEncoded(), masterSecret.getMacKey().getEncoded()); byte[] encryptionSalt = generateSalt(); int iterations = generateIterationCount(newPassphrase, encryptionSalt); byte[] encryptedMasterSecret = encryptWithPassphrase(encryptionSalt, iterations, combinedSecrets, newPassphrase); byte[] macSalt = generateSalt(); byte[] encryptedAndMacdMasterSecret = macWithPassphrase(macSalt, iterations, encryptedMasterSecret, newPassphrase); save(context, "encryption_salt", encryptionSalt); save(context, "mac_salt", macSalt); save(context, "passphrase_iterations", iterations); save(context, "master_secret", encryptedAndMacdMasterSecret); save(context, "passphrase_initialized", true); return masterSecret; } catch (GeneralSecurityException gse) { throw new AssertionError(gse); } }
public static MasterSecret generateMasterSecret(Context context, String passphrase) { try { byte[] encryptionSecret = generateEncryptionSecret(); byte[] macSecret = generateMacSecret(); byte[] masterSecret = Util.combine(encryptionSecret, macSecret); byte[] encryptionSalt = generateSalt(); int iterations = generateIterationCount(passphrase, encryptionSalt); byte[] encryptedMasterSecret = encryptWithPassphrase(encryptionSalt, iterations, masterSecret, passphrase); byte[] macSalt = generateSalt(); byte[] encryptedAndMacdMasterSecret = macWithPassphrase(macSalt, iterations, encryptedMasterSecret, passphrase); save(context, "encryption_salt", encryptionSalt); save(context, "mac_salt", macSalt); save(context, "passphrase_iterations", iterations); save(context, "master_secret", encryptedAndMacdMasterSecret); save(context, "passphrase_initialized", true); return new MasterSecret( new SecretKeySpec(encryptionSecret, "AES"), new SecretKeySpec(macSecret, "HmacSHA1")); } catch (GeneralSecurityException e) { Log.w("keyutil", e); return null; } }