diff options
| author | 2022-05-17 15:37:24 +0000 | |
|---|---|---|
| committer | 2022-05-17 15:37:24 +0000 | |
| commit | bf73616e2347d822031121cd550b16fae2cf4342 (patch) | |
| tree | ad437cc04c305d5b9f3e6211f183238947e6eda1 | |
| parent | 92ce74409b095c3e653f91f2a5a77e57fe8cae66 (diff) | |
| parent | b51dd0387837cf97bba4fbb4f2cc012da5c17bfe (diff) | |
Merge "Ensure key generation retries after remote key provisioning"
| -rw-r--r-- | keystore/java/android/security/keystore2/AndroidKeyStoreKeyPairGeneratorSpi.java | 13 | 
1 files changed, 8 insertions, 5 deletions
diff --git a/keystore/java/android/security/keystore2/AndroidKeyStoreKeyPairGeneratorSpi.java b/keystore/java/android/security/keystore2/AndroidKeyStoreKeyPairGeneratorSpi.java index 40659f5dbfb0..cdc1085a5015 100644 --- a/keystore/java/android/security/keystore2/AndroidKeyStoreKeyPairGeneratorSpi.java +++ b/keystore/java/android/security/keystore2/AndroidKeyStoreKeyPairGeneratorSpi.java @@ -712,7 +712,7 @@ public abstract class AndroidKeyStoreKeyPairGeneratorSpi extends KeyPairGenerato                  case KeymasterDefs.KM_ERROR_HARDWARE_TYPE_UNAVAILABLE:                      throw new StrongBoxUnavailableException("Failed to generated key pair.", e);                  case ResponseCode.OUT_OF_KEYS: -                    throw makeOutOfKeysException(e, securityLevel); +                    return checkIfRetryableOrThrow(e, securityLevel);                  default:                      ProviderException p = new ProviderException("Failed to generate key pair.", e);                      if ((mSpec.getPurposes() & KeyProperties.PURPOSE_WRAP_KEY) != 0) { @@ -740,7 +740,7 @@ public abstract class AndroidKeyStoreKeyPairGeneratorSpi extends KeyPairGenerato      // In case keystore reports OUT_OF_KEYS, call this handler in an attempt to remotely provision      // some keys. -    private ProviderException makeOutOfKeysException(KeyStoreException e, int securityLevel) { +    GenerateKeyPairHelperResult checkIfRetryableOrThrow(KeyStoreException e, int securityLevel) {          GenerateRkpKey keyGen = new GenerateRkpKey(ActivityThread                  .currentApplication());          KeyStoreException ksException; @@ -757,8 +757,11 @@ public abstract class AndroidKeyStoreKeyPairGeneratorSpi extends KeyPairGenerato                      rkpStatus = KeyStoreException.RKP_SERVER_REFUSED_ISSUANCE;                      break;                  case IGenerateRkpKeyService.Status.OK: -                    // This will actually retry once immediately, so on "OK" go ahead and return -                    // "temporarily unavailable". @see generateKeyPair +                    // Explicitly return not-OK here so we retry in generateKeyPair. All other cases +                    // should throw because a retry doesn't make sense if we didn't actually +                    // provision fresh keys. +                    return new GenerateKeyPairHelperResult( +                            KeyStoreException.RKP_TEMPORARILY_UNAVAILABLE, null);                  case IGenerateRkpKeyService.Status.NETWORK_COMMUNICATION_ERROR:                  case IGenerateRkpKeyService.Status.HTTP_CLIENT_ERROR:                  case IGenerateRkpKeyService.Status.HTTP_SERVER_ERROR: @@ -781,7 +784,7 @@ public abstract class AndroidKeyStoreKeyPairGeneratorSpi extends KeyPairGenerato                      KeyStoreException.RKP_TEMPORARILY_UNAVAILABLE);          }          ksException.initCause(e); -        return new ProviderException("Failed to talk to RemoteProvisioner", ksException); +        throw new ProviderException("Failed to provision new attestation keys.", ksException);      }      private void addAttestationParameters(@NonNull List<KeyParameter> params)  |