On 3/20/2021 2:46 PM, SalusaSecondus wrote:
On Sat, 20 Mar 2021 17:52:00 GMT, SalusaSecondus 
<github.com+829871+salusasecon...@openjdk.org> wrote:

@valeriepeng Sorry for the delay. There were unknown Windows build failure 
during the pre-submit tests that I have to rebase my commits on top of the  
master tip. This new revision should cover all comments you left before. Thank 
you!
Mike,

 From what I can find, if you try to get a spec from a non-extractable key 
you'll get an `InvalidKeySpecException`.
1. `C_GetAttributeValue`will throw a `PKCS11Exception`
2. The `PKCS11Exception` gets caught in 
[P11KeyFactory](https://github.com/openjdk/jdk/blob/master/src/jdk.crypto.cryptoki/share/classes/sun/security/pkcs11/P11KeyFactory.java#L98-L99)
 which rethrows it as an `InvalidKeySpecException`.
We seem to have a choice and I'm not sure the best way to approach this.

1. We trust the properties in `P11Key` and just ask it if the values are both 
sensitive and extractable. [1]
2. But if we already trust P11Key, why not also trust that it properly 
implements the RSAPrivateKey interfaces [2]. This is the strategy used by the 
snippet I posted earlier (delegating to `implGetSoftwareFactory()`)
3. We don't trust P11Key except to use getKeyId(), this yields the current 
design where we pull the attributes every time the factory needs them.

We should probably reduce calls to `C_GetAttributeValue` as they may be very 
slow. At the least they cross the JNI boundary and at worst they interact with 
a slow piece of hardware (possibly over a network). The current design will 
have two calls in a worst case, but is likely to have only one call the vast 
majority of the time.

[1] 
https://github.com/openjdk/jdk/blob/master/src/jdk.crypto.cryptoki/share/classes/sun/security/pkcs11/P11Key.java#L92
[2] 
https://github.com/openjdk/jdk/blob/master/src/jdk.crypto.cryptoki/share/classes/sun/security/pkcs11/P11Key.java#L375-L406

-------------

PR: https://git.openjdk.java.net/jdk/pull/2949

Actually, the important lines are 63-66 and 365-373:

 * If the components are not accessible, we use a generic class that
 * only implements PrivateKey (or SecretKey). Whether the components of a
 * key are extractable is automatically determined when the key object is
 * created.

attributes = getAttributes(session, keyID, attributes, new CK_ATTRIBUTE[] {
            new CK_ATTRIBUTE(CKA_TOKEN),
            new CK_ATTRIBUTE(CKA_SENSITIVE),
            new CK_ATTRIBUTE(CKA_EXTRACTABLE),
        });
        if (attributes[1].getBoolean() || (attributes[2].getBoolean() == false)) {
            return new P11PrivateKey
                (session, keyID, algorithm, keyLength, attributes);
        }

If the key is non-extractable, then the only attributes will be these three and the underlying type will be P11Key.P11PrivateKey rather than one of the RSA variants.

Simple check at the top.

Mike


Reply via email to