[Android] Conscrypt provider causes AndroidKeyStore < api23 to fail generating EC keys
- Dominant language
- Java
- Stars
- 1.4k
- Forks
- 326
- Avg merge
- 16h 22m
- Merged PRs (30d)
- 17
Description
It seems that by setting Conscrypt as the provider at index `1` causes the AndroidKeyStore for devices < api23 to fail when generating EC key pair.
Here is how i set the conscrypt provider
```
Security.insertProviderAt(Conscrypt.newProvider(), 1)
```
And here is how i am generating an EC keypair via the `AndroidKeyStore` provider
```
val ecGenParameterSpec = ECGenParameterSpec("P-256")
val spec = KeyPairGeneratorSpec.Builder(context)
.setAlias(ALIAS)
.setSubject(X500Principal("CN=example"))
.setSerialNumber(BigInteger.ONE)
.setKeyType("EC")
.setAlgorithmParameterSpec(ecGenParameterSpec)
.setStartDate(start)
.setEndDate(end)
.build()
val keyGen = KeyPairGenerator.getInstance("RSA", androidKeyStoreProvider)
keyGen.initialize(spec, SecureRandom())
keyGen.generateKeyPair()
```
And the stack trace i get below, it seems that it is invoking `com.android.org.conscrypt.OpenSSLECPrivateKey.getS()` which fails since private key vaule cannot be extracted i presume on `AndroidKeyStore`
```
No pending exception expected: java.lang.UnsupportedOperationException: private key value S cannot be extracted
at java.math.BigInteger com.android.org.conscrypt.OpenSSLECPrivateKey.getS() (OpenSSLECPrivateKey.java:141)
at com.android.org.bouncycastle.crypto.params.AsymmetricKeyParameter com.android.org.bouncycastle.jcajce.provider.asymmetric.util.ECUtil.gen
eratePrivateKeyParameter(java.security.PrivateKey) (ECUtil.java:188)
at void com.android.org.bouncycastle.jcajce.provider.asymmetric.ec.SignatureSpi.engineInitSign(java.security.PrivateKey) (SignatureSpi.java:
61)
at void java.security.Signature$SignatureImpl.engineInitSign(java.security.PrivateKey) (Signature.java:679)
at void java.security.Signature.initSign(java.security.PrivateKey) (Signature.java:330)
at byte[] org.conscrypt.CryptoUpcalls.signDigestWithPrivateKey(java.security.PrivateKey, byte[], java.lang.String) (SourceFile:101)
at byte[] org.conscrypt.CryptoUpcalls.ecSignDigestWithPrivateKey(java.security.PrivateKey, byte[]) (SourceFile:67)
at byte[] org.conscrypt.NativeCrypto.EVP_DigestSignFinal(org.conscrypt.NativeRef$EVP_MD_CTX) (SourceFile:-2)
at byte[] org.conscrypt.OpenSSLSignature.engineSign() (SourceFile:226)
at byte[] java.security.Signature$SignatureImpl.engineSign() (Signature.java:659)
at byte[] java.security.Signature.sign() (Signature.java:368)
at byte[] com.android.org.bouncycastle.x509.X509Util.calculateSignature(com.android.org.bouncycastle.asn1.DERObjectIdentifier, java.lang.Str
ing, java.security.PrivateKey, java.security.SecureRandom, com.android.org.bouncycastle.asn1.ASN1Encodable) (X509Util.java:248)
at java.security.cert.X509Certificate com.android.org.bouncycastle.x509.X509V3CertificateGenerator.generate(java.security.PrivateKey, java.s
ecurity.SecureRandom) (X509V3CertificateGenerator.java:434)
at java.security.cert.X509Certificate com.android.org.bouncycastle.x509.X509V3CertificateGenerator.generate(java.security.PrivateKey) (X509V
3CertificateGenerator.java:412)
at java.security.KeyPair android.security.AndroidKeyPairGenerator.generateKeyPair() (AndroidKeyPairGenerator.java:133)
at java.security.KeyPair java.security.KeyPairGenerator$KeyPairGeneratorImpl.generateKeyPair() (KeyPairGenerator.java:276)
```
Tested on multiple devices
Nexus 4 android 5.1.1 api 22
Asus zenfone android 5.0 api 21
Redmi Note 2 android 5.0 api 21
One plus one android 5.1.1 api 22
Contributor guide
Assessment
This issue has not been assessed yet.