diff --git a/api/system-current.txt b/api/system-current.txt index fa323830bd402..d602b566c1ab5 100644 --- a/api/system-current.txt +++ b/api/system-current.txt @@ -4349,11 +4349,14 @@ package android.security.keystore.recovery { } public final class KeyDerivationParams implements android.os.Parcelable { + method public static android.security.keystore.recovery.KeyDerivationParams createScryptParams(byte[], int); method public static android.security.keystore.recovery.KeyDerivationParams createSha256Params(byte[]); method public int describeContents(); method public int getAlgorithm(); + method public int getMemoryDifficulty(); method public byte[] getSalt(); method public void writeToParcel(android.os.Parcel, int); + field public static final int ALGORITHM_SCRYPT = 2; // 0x2 field public static final int ALGORITHM_SHA256 = 1; // 0x1 field public static final android.os.Parcelable.Creator CREATOR; } diff --git a/core/java/android/security/keystore/recovery/KeyDerivationParams.java b/core/java/android/security/keystore/recovery/KeyDerivationParams.java index 428eaaa0079e4..8cb8e5162f160 100644 --- a/core/java/android/security/keystore/recovery/KeyDerivationParams.java +++ b/core/java/android/security/keystore/recovery/KeyDerivationParams.java @@ -38,7 +38,7 @@ import java.lang.annotation.RetentionPolicy; public final class KeyDerivationParams implements Parcelable { private final int mAlgorithm; private final byte[] mSalt; - private final int mDifficulty; + private final int mMemoryDifficulty; /** @hide */ @Retention(RetentionPolicy.SOURCE) @@ -53,25 +53,32 @@ public final class KeyDerivationParams implements Parcelable { /** * SCRYPT. - * - * @hide */ public static final int ALGORITHM_SCRYPT = 2; /** - * Creates instance of the class to to derive key using salted SHA256 hash. + * Creates instance of the class to to derive keys using salted SHA256 hash. + * + *

The salted SHA256 hash is computed over the concatenation of four byte strings, salt_len + + * salt + key_material_len + key_material, where salt_len and key_material_len are one-byte, and + * denote the number of bytes for salt and key_material, respectively. */ public static KeyDerivationParams createSha256Params(@NonNull byte[] salt) { return new KeyDerivationParams(ALGORITHM_SHA256, salt); } /** - * Creates instance of the class to to derive key using the password hashing algorithm SCRYPT. + * Creates instance of the class to to derive keys using the password hashing algorithm SCRYPT. * - * @hide + *

We expose only one tuning parameter of SCRYPT, which is the memory cost parameter (i.e. N + * in the SCRYPT paper). Regular/default + * values are used for the other parameters, to keep the overall running time low. Specifically, + * the parallelization parameter p is 1, the block size parameter r is 8, and the hashing output + * length is 32-byte. */ - public static KeyDerivationParams createScryptParams(@NonNull byte[] salt, int difficulty) { - return new KeyDerivationParams(ALGORITHM_SCRYPT, salt, difficulty); + public static KeyDerivationParams createScryptParams( + @NonNull byte[] salt, int memoryDifficulty) { + return new KeyDerivationParams(ALGORITHM_SCRYPT, salt, memoryDifficulty); } /** @@ -79,17 +86,17 @@ public final class KeyDerivationParams implements Parcelable { */ // TODO: Make private once legacy API is removed public KeyDerivationParams(@KeyDerivationAlgorithm int algorithm, @NonNull byte[] salt) { - this(algorithm, salt, /*difficulty=*/ 0); + this(algorithm, salt, /*memoryDifficulty=*/ -1); } /** * @hide */ KeyDerivationParams(@KeyDerivationAlgorithm int algorithm, @NonNull byte[] salt, - int difficulty) { + int memoryDifficulty) { mAlgorithm = algorithm; mSalt = Preconditions.checkNotNull(salt); - mDifficulty = difficulty; + mMemoryDifficulty = memoryDifficulty; } /** @@ -107,12 +114,16 @@ public final class KeyDerivationParams implements Parcelable { } /** - * Gets hashing difficulty. + * Gets the memory difficulty parameter for the hashing algorithm. * - * @hide + *

The effect of this parameter depends on the algorithm in use. For example, please see + * {@link #createScryptParams(byte[], int)} for choosing the parameter for SCRYPT. + * + *

If the specific algorithm does not support such a memory difficulty parameter, its value + * should be -1. */ - public int getDifficulty() { - return mDifficulty; + public int getMemoryDifficulty() { + return mMemoryDifficulty; } public static final Parcelable.Creator CREATOR = @@ -130,7 +141,7 @@ public final class KeyDerivationParams implements Parcelable { public void writeToParcel(Parcel out, int flags) { out.writeInt(mAlgorithm); out.writeByteArray(mSalt); - out.writeInt(mDifficulty); + out.writeInt(mMemoryDifficulty); } /** @@ -139,7 +150,7 @@ public final class KeyDerivationParams implements Parcelable { protected KeyDerivationParams(Parcel in) { mAlgorithm = in.readInt(); mSalt = in.createByteArray(); - mDifficulty = in.readInt(); + mMemoryDifficulty = in.readInt(); } @Override