No idea.  I may not use a printable character to zero a password.

Xuelei

On 8/23/2018 3:31 AM, Weijun Wang wrote:
I have no more comment.

As for fill(passwd, '\0'), maybe JVM can translate it to ZeroMemory() or 
memset(0). In fact, I don't know why originally it was fill(passwd, '0'). I can 
only guess that it can still be printed out as a normal string and if someone 
misuse it there won't be a NPE. Who knows?

Thanks
Max

On Aug 23, 2018, at 6:01 AM, Seán Coffey <sean.cof...@oracle.com> wrote:



On 22 August 2018 19:22:49 IST, Ivan Gerasimov <ivan.gerasi...@oracle.com> 
wrote:
Hi Seán!

Just a minor comment.

I don't know if it's even measurable in this context, but I was under
impression that filling memory with zero *bytes* might be a slightly
more efficient then filling with any other constant.

Maybe it is better to use Arrays.fill(passwd, '\0') instead of
Arrays.fill(passwd, '0') to give the JVM a chance to optimize filling
if
it's possible?

Interesting comment Ivan. I was not aware of such an effect! If you've further 
references on that, I'd appreciate it. '0' is used in other, similar, fill 
operations IIRC. Perhaps we can optimize such code across all security libs 
code via another JBS issue.

Regards,
Sean.


With kind regards,

Ivan


On 8/22/18 9:25 AM, Seán Coffey wrote:
Thanks for reviewing. comments inline..

On 22/08/18 15:50, Weijun Wang wrote:
PBES2Core.java:

  181         byte[] passwdBytes = key.getEncoded();
  182         char[] passwdChars = null;
  183         PBEKeySpec pbeSpec;
  184         try {
  185             if ((passwdBytes == null) ||
  186 !(key.getAlgorithm().regionMatches(true, 0, "PBE", 0, 3))) {
  187                 throw new InvalidKeyException("Missing
password");
  188             }
  ....
  272         } finally {
  273             if (passwdChars != null) Arrays.fill(passwdChars,
'
');
  274             Arrays.fill(passwdBytes, (byte)0x00);
  275         }

If passwdBytes == null, line 274 would throw an NPE.
Good catch. Corrected.

PBKDF2KeyImpl.java:

   87         char[] passwd = keySpec.getPassword();
   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');

If passwd == null, line 97 would throw an NPE.
Another good catch!

updated webrev :
http://cr.openjdk.java.net/~coffeys/webrev.8209129.v3/webrev/

regards,
Sean.


Otherwise fine.

Thanks
Max


On Aug 17, 2018, at 12:53 AM, Seán Coffey <sean.cof...@oracle.com>
wrote:

Find new webrev here Max :

http://cr.openjdk.java.net/~coffeys/webrev.8209129.v2/webrev/

regards :




Reply via email to