Is Entry.Attribute meant to be encrypted for a PrivateKeyEntry?
Weijun Wang
weijun.wang at oracle.com
Tue Jun 4 02:00:22 UTC 2019
I think you're worried about if KeyStore::getAttributes and Entry::getAttributes would return different values before a provider has the chance to implement the former. This is something we need to be very care of. Maybe the default implementation of KeyStoreSpi::engineGetAttributes should throw an UnsupportedOperationException. When Entry::getAttributes was introduced it was a new concept in KeyStore, so it made sense to return an empty collection. But now, it's not and it's worth thinking of a different default behavior.
--Max
> On Jun 4, 2019, at 9:21 AM, Michael StJohns <mstjohns at comcast.net> wrote:
>
> On 6/3/2019 7:27 PM, Weijun Wang wrote:
>>
>>> On Jun 4, 2019, at 1:34 AM, Michael StJohns <mstjohns at comcast.net> wrote:
>>>
>>> On 6/3/2019 11:05 AM, Weijun Wang wrote:
>>>> The storepass and the keypass are usually the same but they are independent. If the Mac is there and a non-null storepass is provided at loading, then integrity checking is performed. We do allow storepass being null in KeyStore::load and the method spec says:
>>>>
>>>> * @param password the password used to check the integrity of
>>>> * the keystore, the password used to unlock the keystore,
>>>> * or {@code null}
>>>>
>>>> And now we support password-less pkcs12, i.e. key is protected, by cert is not, and there is no Mac.
>>> Right - and compare and contrast to PKCS11, you don't generally have a password on the private key entry, but you do on the key store. Hmm...
>>>
>>> Rather than change the API for KeyStore, or maybe in addition to changing the API, you do:
>>>
>>> If you pass in a null password (0 length password, known password 'attributesonly'?) in a PasswordProtection class in getEntry() for a PKCS12 key store, you (optionally) get a KeyStore.Entry of an internal concrete type that contains only the attributes.
>> This looks a little too hackish to me. We'll need to describe how PrivateKeyEntry::getPrivateKey behaves and apps would need to check for the result, etc.
>
> Well, you'd need to describe how the JDK implementation of PKCS12 behaves. Which is going to possibly be different than another provider's implementation. But I take your point about hackish.
>
>
>>
>>> This allows you not to have to retrofit other KeyStore implementations to support a getAttributes() method.
>>>
>>> And I *think* that works well with PKCS11.
>> It always works. The Entry::getAttributes will still be there.
>
> KeyStore depends on KeyStoreSpi and that's going to need the change too - but it's going to need to be a concrete method there - correct - or it breaks other implementations? But Entry.Attribute is defined in KeyStore and KeyStore references KeyStoreSpi and I kind of hate circular dependencies even if java can work around them.
>
> so
>
> public Set<KeyStore.Entry.Attribute> KeyStoreSpi::engineGetAttributes(String alias) {
>
> return containsAlias(alias) ? Collections.emptySet() : return null; }
>
>
> and
>
> public final Set<Entry.Attribute> KeyStore::getAttributes(String alias) {
>
> if (!initialized) {
> throw new KeyStoreException ("Uninitialized keystore");
> }
>
> return keyStoreSpi.engine.getAttributes(alias);
>
> }
>
>
> WFM.
>
> Mike
More information about the security-dev
mailing list