You cannot select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
Aegis/app/src/main/java/me/impy/aegis/DerivationTask.java

58 lines
1.5 KiB
Java

package me.impy.aegis;
import android.app.ProgressDialog;
import android.content.Context;
import android.os.AsyncTask;
import javax.crypto.SecretKey;
import me.impy.aegis.crypto.CryptoUtils;
import me.impy.aegis.crypto.slots.PasswordSlot;
public class DerivationTask extends AsyncTask<DerivationTask.Params, Void, SecretKey> {
private Callback _cb;
private ProgressDialog _dialog;
public DerivationTask(Context context, Callback cb) {
_cb = cb;
_dialog = new ProgressDialog(context);
_dialog.setCancelable(false);
}
@Override
protected SecretKey doInBackground(DerivationTask.Params... args) {
DerivationTask.Params params = args[0];
try {
byte[] salt = CryptoUtils.generateSalt();
SecretKey key = params.Slot.deriveKey(params.Password, salt, CryptoUtils.CRYPTO_SCRYPT_N, CryptoUtils.CRYPTO_SCRYPT_r, CryptoUtils.CRYPTO_SCRYPT_p);
CryptoUtils.zero(params.Password);
return key;
} catch (Exception e) {
return null;
}
}
@Override
protected void onPreExecute() {
_dialog.setMessage("Deriving key from password");
_dialog.show();
}
@Override
protected void onPostExecute(SecretKey key) {
if (_dialog.isShowing()) {
_dialog.dismiss();
}
_cb.onTaskFinished(key);
}
static class Params {
public PasswordSlot Slot;
public char[] Password;
}
interface Callback {
void onTaskFinished(SecretKey key);
}
}