I get your point, but the Google example isn't a good one, because it's not 
actually a JWK in one other important way as well - the values are base64 
encoded, rather than base64url encoded.  (Note the presence of '+' and '/' 
characters.)

To me this topic seems like a fine place for Postel's Law: "Be liberal in what 
you accept, and conservative in what you send."  I have no problem with JWT 
readers that can read malformed input prefixed with extra zeros.  But anyone 
emitting a key representation should do it in the standard representation.

The standard one is that way both for compactness but also for simplicity.  It 
would be more complicated to specify rules for when extra zeros need to be 
prefixed than to not prefix them at all.

<hack>For what it's worth, if you're worried about your implementation of a JWK 
reader treating the high-order bit incorrectly and you're willing to parse 
extra zeros, you could always prefix anything received with three bytes of 
zeros by prefixing the content with "AAAA".</hack>

                                Cheers,
                                -- Mike

-----Original Message-----
From: jose [mailto:[email protected]] On Behalf Of Berry, Matt
Sent: Monday, April 14, 2014 3:53 PM
To: [email protected]
Subject: Re: [jose] Question about minimual unsigned big endian representation 
of JWK parameters

I wholly agree that the value is both unsigned and should have a one in the 
highest bit. The trick of it is, when working with unsigned integers, there is 
a tendency to put and extra zero byte in front so it is not incorrectly 
interpreted by signed libraries. This was the point in adding the OpenSSL 
output. These are unsigned values, but OpenSSL still adds a zero to any value 
with a one in the highest bit.

Although the minimal unsigned representation of a 1024 bit RSA modulus is 
always 1024 bits, many libraries will encode either 1024 bits or 1032 bits in 
the case that the highest byte is 8 through f. I argue that following suit 
costs only a few bytes and that consistency trumps efficiency in this case. It 
will also reduce the number accidentally incorrect JWKs found in the wild. If 
an implementer doesn't carefully read and implement the spec, they will likely 
encode 1032 bits in some cases, an example of which is Google.

> modulus:
>   00:ba:5c:82:f9:26:34:e3:4b:e3:d2:d4:81:5a:c6:

> https://www.googleapis.com/oauth2/v2/certs

-Matt

-----Original Message-----
From: Mike Jones [mailto:[email protected]]
Sent: Monday, April 14, 2014 2:49 PM
To: Berry, Matt; [email protected]
Subject: RE: Question about minimual unsigned big endian representation of JWK 
parameters

According to a crypto expert who spoke up at an in-person JOSE meeting when 
this was discussed (I think it was Russ Housley), the high-order bit of a 
correctly formed RSA mantissa must always be 1.  (If it weren't then the key 
pair would contain less than the required number of bits of information.)  
Thus, there are no leading zeroes to strip, for what it's worth.

Also the value is unsigned, not signed.

                                Best wishes,
                                -- Mike

-----Original Message-----
From: jose [mailto:[email protected]] On Behalf Of Berry, Matt
Sent: Monday, April 14, 2014 2:36 PM
To: [email protected]
Subject: [jose] Question about minimual unsigned big endian representation of 
JWK parameters

Throughout JWA Section 6.3 "Parameters for RSA Keys" the following phase occurs 
repeatedly:

> The octet sequence MUST utilize the minimum number of octets to represent the 
> value.

I understand the rationale for such a phase, which is to minimize the overall 
size of JWKs. 
This is a core tenant of the JSOE working group. However I have concerns about 
the practice of striping leading zeroes from RSA parameters.

The benefit of stripping these leading zeroes is likely negligible. Consider 
this RSA key I just generated (included below). The total benefit of stripping 
the leading zeroes is 5 bytes before base64 encoding.

Although I believe the attempt to reduce the overall size of the JWK is 
commendable, I think this will introduce more confusion and non-compliance than 
anything. An example would be Google, who currently does not strip the leading 
zeroes (or even base64url-encodes).

> https://www.googleapis.com/oauth2/v2/certs

I suggest rewording relevant sections to the following, to allow for the 
minimum amount of padding octets required to make the keys unambiguous.

> The octet sequence MUST utilize the minimum number of octets to 
> represent the value as if it was a signed integer.

Sincerely,
Matt Berry

== The referenced RSA Private key. ==

Generating RSA private key, 2048 bit long modulus 
.........................................................+++
..................................+++
e is 65537 (0x10001)
Private-Key: (2048 bit)
modulus:
    00:ba:5c:82:f9:26:34:e3:4b:e3:d2:d4:81:5a:c6:
    ...
publicExponent: 65537 (0x10001)
privateExponent:
    00:9d:23:3c:5c:90:d6:af:81:62:0c:77:9a:ca:cb:
    ...
prime1:
    00:ee:b8:c9:5f:ca:8d:9e:1a:a8:9b:6c:34:2f:c4:
    ...
prime2:
    00:c7:d9:8d:57:17:6c:a4:46:1a:9a:c0:2d:93:da:
    ...
exponent1:
    54:c8:b4:5c:9d:27:e6:fb:38:de:da:73:3e:74:08:
    ...
exponent2:
    00:c7:7f:c6:f6:5f:ad:d6:37:1d:2b:ca:18:35:76:
    ...
coefficient:
    74:a4:07:7c:4f:04:be:40:62:2e:af:ff:37:b5:9d:
    ...
writing RSA key
-----BEGIN RSA PRIVATE KEY-----
...
-----END RSA PRIVATE KEY-----

_______________________________________________
jose mailing list
[email protected]
https://www.ietf.org/mailman/listinfo/jose

_______________________________________________
jose mailing list
[email protected]
https://www.ietf.org/mailman/listinfo/jose

_______________________________________________
jose mailing list
[email protected]
https://www.ietf.org/mailman/listinfo/jose

Reply via email to