I thought about this too when I noticed that other security sources also
have codes just simply remove the leading sign byte without checking the
overall length.
I will make an utility function for this in one of my other JDK 8 fixes
which cover more providers.
For this bug, the current changes work, so I will proceed as planned.
Thanks for the feedback,
Valerie
On 03/14/12 18:58, Michael StJohns wrote:
Sorry for the late comment here -
It may make sense to make a utility function with the calling sequence similar
to
static byte[] getBytesFixedLength (BigInteger x, int numBits)
throws IllegalArgumentException
some where in the security utility code.
The length of the returned byte array is ceiling(numBits/8).
Throws IAE if x is negative or zero or numBits is< x.bitLength().
Put the various comments in the utility function instead of spreading them
throughout the code.
This function should be used for both ECDH and DH.
Rethrow the IAE as a ProviderException if it occurs (it shouldn't for DH or
ECDH generated secrets).
Mike
At 07:01 PM 3/14/2012, Brad Wetmore wrote:
Here's the comment I was trying to suggest in your office yesterday:
/*
* NOTE: BigInteger.toByteArray() returns a byte array containing
* the two's-complement representation of this BigInteger with
* the most significant byte in the zero-th element. This
* contains the minimum number of bytes required to represent
* this BigInteger, including at least one sign bit whose value
* is always 0.
*
* Keys are always positive, and the above sign bit isn't
* actually used when representing keys. (i.e. key = new
* BigInteger(1, byteArray)) To obtain an array containing
* exactly expectedLen bytes of magnitude, we strip any extra
* leading 0's, or pad with 0's in case of a "short" secret.
*/
Hope this helps,
Brad
On 3/9/2012 12:57 PM, Valerie (Yu-Ching) Peng wrote:
Ok, more comments/changes added as suggested.
Webrev updated at:
http://cr.openjdk.java.net/~valeriep/7146728/webrev.02/
Thanks,
Valerie
On 03/08/12 17:15, Brad Wetmore wrote:
DHKeyAgreement:
===============
I added more comments to both code blocks to explain what's going on.
A couple more requested comments.
Around line 299, could please add that the sign bit is always 0.
Around line 303, could you put in a comment that since there is enough
room here for the sign bit in this array, it just becomes a leading zero.
Good point, I modified the engineGenerateSecret() to leverage
engineGenerateSecret(byte[], int) method.
Great, thanks!
P11KeyAgreement.java
====================
// Solaris
Shouldn't this be "// Solaris/NSS", for the case in which there isn't
a leading zero?
Well, I think putting NSS in both places seems somewhat confusing. What
I tried to point out is that NSS (at least in the older versions, I have
not tried the newer version to see if they switched behavior) trims off
the leading 0s whenever possible. I've made some modification hoping to
make it clearer.
Much better, thanks!
Minor nit (take or leave) you could adjust the logic around 208 to
only create newSecret if secret.length< secretLen.
if (secret.length> secretLen) {
throw new ProviderException(...
}
byte [] newSecret = new byte[secretLen];
System.arraycopy(...);
return newSecret;
TestShort.java
==============
New bugid
@bug 4942494 7146728
Done.
Indention problem around the try.
Fixed.
Thanks for taking out the commented out code, I almost mentioned it
and then didn't.
Brad