google / google/conscrypt

[Android] Conscrypt provider causes AndroidKeyStore < api23 to fail generating EC keys

Open
#679 10 comments 0 reactions 0 assignees View on GitHub
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

Open the contributing guide

Assessment

This issue has not been assessed yet.

Get new issues in your inbox

A short digest of beginner-friendly GitHub issues.