Merge "Use Keymaster-friendly validity dates."

This commit is contained in:
Alex Klyubin
2015-04-01 20:01:00 +00:00
committed by Gerrit Code Review
3 changed files with 41 additions and 27 deletions

View File

@@ -544,17 +544,15 @@ public class AndroidKeyStore extends KeyStoreSpi {
args.addInt(KeymasterDefs.KM_TAG_AUTH_TIMEOUT, args.addInt(KeymasterDefs.KM_TAG_AUTH_TIMEOUT,
params.getUserAuthenticationValidityDurationSeconds()); params.getUserAuthenticationValidityDurationSeconds());
} }
if (params.getKeyValidityStart() != null) { args.addDate(KeymasterDefs.KM_TAG_ACTIVE_DATETIME,
args.addDate(KeymasterDefs.KM_TAG_ACTIVE_DATETIME, params.getKeyValidityStart()); (params.getKeyValidityStart() != null)
} ? params.getKeyValidityStart() : new Date(0));
if (params.getKeyValidityForOriginationEnd() != null) {
args.addDate(KeymasterDefs.KM_TAG_ORIGINATION_EXPIRE_DATETIME, args.addDate(KeymasterDefs.KM_TAG_ORIGINATION_EXPIRE_DATETIME,
params.getKeyValidityForOriginationEnd()); (params.getKeyValidityForOriginationEnd() != null)
} ? params.getKeyValidityForOriginationEnd() : new Date(Long.MAX_VALUE));
if (params.getKeyValidityForConsumptionEnd() != null) {
args.addDate(KeymasterDefs.KM_TAG_USAGE_EXPIRE_DATETIME, args.addDate(KeymasterDefs.KM_TAG_USAGE_EXPIRE_DATETIME,
params.getKeyValidityForConsumptionEnd()); (params.getKeyValidityForConsumptionEnd() != null)
} ? params.getKeyValidityForConsumptionEnd() : new Date(Long.MAX_VALUE));
// TODO: Remove this once keymaster does not require us to specify the size of imported key. // TODO: Remove this once keymaster does not require us to specify the size of imported key.
args.addInt(KeymasterDefs.KM_TAG_KEY_SIZE, keyMaterial.length * 8); args.addInt(KeymasterDefs.KM_TAG_KEY_SIZE, keyMaterial.length * 8);

View File

@@ -23,6 +23,7 @@ import android.security.keymaster.KeymasterDefs;
import java.security.InvalidAlgorithmParameterException; import java.security.InvalidAlgorithmParameterException;
import java.security.SecureRandom; import java.security.SecureRandom;
import java.security.spec.AlgorithmParameterSpec; import java.security.spec.AlgorithmParameterSpec;
import java.util.Date;
import javax.crypto.KeyGeneratorSpi; import javax.crypto.KeyGeneratorSpi;
import javax.crypto.SecretKey; import javax.crypto.SecretKey;
@@ -144,17 +145,15 @@ public abstract class KeyStoreKeyGeneratorSpi extends KeyGeneratorSpi {
args.addInt(KeymasterDefs.KM_TAG_AUTH_TIMEOUT, args.addInt(KeymasterDefs.KM_TAG_AUTH_TIMEOUT,
spec.getUserAuthenticationValidityDurationSeconds()); spec.getUserAuthenticationValidityDurationSeconds());
} }
if (spec.getKeyValidityStart() != null) { args.addDate(KeymasterDefs.KM_TAG_ACTIVE_DATETIME,
args.addDate(KeymasterDefs.KM_TAG_ACTIVE_DATETIME, spec.getKeyValidityStart()); (spec.getKeyValidityStart() != null)
} ? spec.getKeyValidityStart() : new Date(0));
if (spec.getKeyValidityForOriginationEnd() != null) {
args.addDate(KeymasterDefs.KM_TAG_ORIGINATION_EXPIRE_DATETIME, args.addDate(KeymasterDefs.KM_TAG_ORIGINATION_EXPIRE_DATETIME,
spec.getKeyValidityForOriginationEnd()); (spec.getKeyValidityForOriginationEnd() != null)
} ? spec.getKeyValidityForOriginationEnd() : new Date(Long.MAX_VALUE));
if (spec.getKeyValidityForConsumptionEnd() != null) {
args.addDate(KeymasterDefs.KM_TAG_USAGE_EXPIRE_DATETIME, args.addDate(KeymasterDefs.KM_TAG_USAGE_EXPIRE_DATETIME,
spec.getKeyValidityForConsumptionEnd()); (spec.getKeyValidityForConsumptionEnd() != null)
} ? spec.getKeyValidityForConsumptionEnd() : new Date(Long.MAX_VALUE));
if (((purposes & KeyStoreKeyConstraints.Purpose.ENCRYPT) != 0) if (((purposes & KeyStoreKeyConstraints.Purpose.ENCRYPT) != 0)
|| ((purposes & KeyStoreKeyConstraints.Purpose.DECRYPT) != 0)) { || ((purposes & KeyStoreKeyConstraints.Purpose.DECRYPT) != 0)) {

View File

@@ -22,6 +22,7 @@ import android.security.keymaster.KeymasterDefs;
import java.security.InvalidKeyException; import java.security.InvalidKeyException;
import java.security.spec.InvalidKeySpecException; import java.security.spec.InvalidKeySpecException;
import java.security.spec.KeySpec; import java.security.spec.KeySpec;
import java.util.Date;
import java.util.Set; import java.util.Set;
import javax.crypto.SecretKey; import javax.crypto.SecretKey;
@@ -112,6 +113,24 @@ public class KeyStoreSecretKeyFactorySpi extends SecretKeyFactorySpi {
throw new InvalidKeySpecException("Unsupported key characteristic", e); throw new InvalidKeySpecException("Unsupported key characteristic", e);
} }
Date keyValidityStart =
KeymasterUtils.getDate(keyCharacteristics, KeymasterDefs.KM_TAG_ACTIVE_DATETIME);
if ((keyValidityStart != null) && (keyValidityStart.getTime() <= 0)) {
keyValidityStart = null;
}
Date keyValidityForOriginationEnd = KeymasterUtils.getDate(keyCharacteristics,
KeymasterDefs.KM_TAG_ORIGINATION_EXPIRE_DATETIME);
if ((keyValidityForOriginationEnd != null)
&& (keyValidityForOriginationEnd.getTime() == Long.MAX_VALUE)) {
keyValidityForOriginationEnd = null;
}
Date keyValidityForConsumptionEnd = KeymasterUtils.getDate(keyCharacteristics,
KeymasterDefs.KM_TAG_USAGE_EXPIRE_DATETIME);
if ((keyValidityForConsumptionEnd != null)
&& (keyValidityForConsumptionEnd.getTime() == Long.MAX_VALUE)) {
keyValidityForConsumptionEnd = null;
}
int swEnforcedUserAuthenticatorIds = int swEnforcedUserAuthenticatorIds =
keyCharacteristics.swEnforced.getInt(KeymasterDefs.KM_TAG_USER_AUTH_TYPE, 0); keyCharacteristics.swEnforced.getInt(KeymasterDefs.KM_TAG_USER_AUTH_TYPE, 0);
int hwEnforcedUserAuthenticatorIds = int hwEnforcedUserAuthenticatorIds =
@@ -126,11 +145,9 @@ public class KeyStoreSecretKeyFactorySpi extends SecretKeyFactorySpi {
return new KeyStoreKeySpec(entryAlias, return new KeyStoreKeySpec(entryAlias,
origin, origin,
keySize, keySize,
KeymasterUtils.getDate(keyCharacteristics, KeymasterDefs.KM_TAG_ACTIVE_DATETIME), keyValidityStart,
KeymasterUtils.getDate(keyCharacteristics, keyValidityForOriginationEnd,
KeymasterDefs.KM_TAG_ORIGINATION_EXPIRE_DATETIME), keyValidityForConsumptionEnd,
KeymasterUtils.getDate(keyCharacteristics,
KeymasterDefs.KM_TAG_USAGE_EXPIRE_DATETIME),
purposes, purposes,
algorithm, algorithm,
padding, padding,