Is Entry.Attribute meant to be encrypted for a PrivateKeyEntry?

Michael StJohns mstjohns at comcast.net
Tue Jun 4 01:21:47 UTC 2019


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