RFR: JDK-8209129 :Further improvements to cipher buffer management

Seán Coffey sean.coffey at oracle.com
Wed Aug 22 14:01:47 UTC 2018


Ping. I'd like to push on with this review.

Regards,
Sean.

On 16/08/18 17:53, Seán Coffey wrote:
> Find new webrev here Max :
>
> http://cr.openjdk.java.net/~coffeys/webrev.8209129.v2/webrev/
>
> regards :
>
>> MD4.java:
>>
>>   110     void implReset() {
>>
>>   Add @Override. 
> There's a whole bunch of annotations missing in these files, I'd 
> prefer if it was fixed up with different bug ID.
>
> another thing we're to be cautious about is the nulling out of values 
> returned from some Key's such as PBEKey subclasses. We're assuming 
> that getPassword() returns cloned copies. That should be the case for 
> any production fit code.
>
> Edit to test/jdk/com/sun/crypto/provider/Cipher/PBE/PKCS12Cipher.java 
> was necessary as a result.
>
> regards,
> Sean.
>
>
> On 10/08/2018 15:18, Seán Coffey wrote:
>> Thanks for the review Max - comments inline..
>>
>> Regards,
>> Sean.
>>
>> On 10/08/18 11:53, Weijun Wang wrote:
>>> HmacPKCS12PBESHA1.java:
>>>
>>>    76             byte[] passwdBytes = key.getEncoded();
>>>    77             if ((passwdBytes == null) ||
>>>    78                 !(key.getAlgorithm().regionMatches(true, 0, 
>>> "PBE", 0, 3))) {
>>>    79                 throw new InvalidKeyException("Missing 
>>> password");
>>>    80             }
>>>
>>>   Please also cleanup passwdBytes. Maybe divide the if check above 
>>> into 2 to avoid passwdBytes being assigned but algorithm is not PBE.
>> Yes - I had thought about refactoring this code during edits. Will 
>> make that change.
>>>
>>>   132         Arrays.fill(passwdChars, '0');
>>>
>>>   In a finally block?
>>>
>>> PBES1Core.java:
>>>
>>>   250         Arrays.fill(passwdBytes, (byte) 0x00);
>>>
>>>   In a finally block?
>>>
>>> PBES2Core.java:
>>>
>>>   273         Arrays.fill(passwdChars, ' ');
>>>   274         Arrays.fill(passwdBytes, (byte)0x00);
>>>
>>>   In a finally block?
>> Yes - makes sense to capture above in finally blocks. Will re-factor.
>>>
>>> PBKDF2KeyImpl.java:
>>>
>>>    88         if (passwd == null) {
>>>    89             // Should allow an empty password.
>>>    90             this.passwd = new char[0];
>>>    91         } else {
>>>    92             this.passwd = passwd.clone();
>>>    93         }
>>>    94         // Convert the password from char[] to byte[]
>>>    95         byte[] passwdBytes = getPasswordBytes(this.passwd);
>>>    96         // remove local copy
>>>    97         Arrays.fill(passwd, '0');
>>>
>>>   Strange, why passwd.clone()?
>> Not sure - it's original behaviour. I'll check if it makes sense to 
>> change.
>>>
>>>   129         Arrays.fill(passwdBytes, (byte)0x00);
>>>
>>>   In a finally block?
>>>
>>> PBMAC1Core.java:
>>>
>>>   111             byte[] passwdBytes = key.getEncoded();
>>>   112             if ((passwdBytes == null) ||
>>>   113                 !(key.getAlgorithm().regionMatches(true, 0, 
>>> "PBE", 0, 3))) {
>>>   114                 throw new InvalidKeyException("Missing 
>>> password");
>>>   115             }
>>>
>>>   170         Arrays.fill(passwdChars, ' ');
>>>
>>>   Same comments as for HmacPKCS12PBESHA1.java.
>>>
>>> PKCS12PBECipherCore.java:
>>>
>>>   262         char[] passwdChars = null;
>>>
>>>   Deal with the same way as in PBMAC1Core.java?
>>>
>>> MD4.java:
>>>
>>>   110     void implReset() {
>>>
>>>   Add @Override.
>> All above comments make sense. I've come across one other possible 
>> issue in MessageDigest functionality. I'm debugging that to be sure. 
>> Will get a new webrev out once that's done.
>>
>> regards,
>> Sean.
>>>
>>> Thanks
>>> Max
>>>
>>>
>>>> On Aug 9, 2018, at 6:42 PM, Seán Coffey <sean.coffey at oracle.com> 
>>>> wrote:
>>>>
>>>> Adding RFR to title..
>>>>
>>>> On 09/08/2018 11:37, Seán Coffey wrote:
>>>>> I've been looking further at how private/temporary buffers are 
>>>>> used in cipher/keystore management and identified some more areas 
>>>>> that could benefit with a more aggressive nulling out of contents.
>>>>>
>>>>> I've been testing through use of stepping through debugging 
>>>>> sessions while setting/getting keys and capturing process memory 
>>>>> via tooling like gcore.
>>>>>
>>>>> JBS report : https://bugs.openjdk.java.net/browse/JDK-8209129
>>>>>
>>>>> webrev : 
>>>>> http://cr.openjdk.java.net/~coffeys/webrev.8209129.v1/webrev/index.html 
>>>>>
>>>>>
>>>>> TCK and regression tests are green.
>>>>>
>>>>> regards,
>>>>> Sean.
>>>>>
>>
>




More information about the security-dev mailing list