JCA design for RFC 7748
Adam Petcher
adam.petcher at oracle.com
Wed Aug 16 15:18:13 UTC 2017
On 8/15/2017 7:05 PM, Michael StJohns wrote:
> On 8/15/2017 1:43 PM, Xuelei Fan wrote:
>> On 8/11/2017 7:57 AM, Adam Petcher wrote:
>>>
>>> I'm also coming to the conclusion that using X.509 encoding for this
>>> sort of interoperability is too onerous, and we should come up with
>>> something better. Maybe we should add a new general-purpose
>>> interface that exposes some structure in an algorithm-independent
>>> way. Something like this:
>>>
>>> package java.security.interfaces;
>>> public interface ByteArrayValue {
>>>
>>> String getAlgorithm();
>>> AlgorithmParameterSpec getParams();
>>> byte[] getValue();
>>> }
>>>
>> I'm not sure how to use the above interface in an application.
>
> This is sort of the moral equivalent of using the TXT RR record in DNS
> and the arguments are similar.
>
> This is a bad idea.
I'm not a DNS expert, so I apologize in advance if I misunderstood your
argument. What I think you are saying is that it is bad to store
something in a string or byte array which has no semantics, and it is
better to store information in a more structured way that has a clear
semantics. I agree with this.
My intention with this ByteArrayValue is to only use it for information
that has a clear semantics when represented as a byte array, and a byte
array is a convenient and appropriate representation for the algorithms
involved (so there isn't a lot of unnecessary conversion). This is the
case for public/private keys in RFC 7748/8032:
1) RFC 8032: "An EdDSA private key is a b-bit string k." "The EdDSA
public key is ENC(A)." (ENC is a function from integers to little-endian
bit strings.
2) RFC 7748: "Alice generates 32 random bytes in a[0] to a[31] and
transmits K_A =X25519(a, 9) to Bob..." The X25519 and X448 functions, as
described in the RFC, take bit strings as input and produce bit strings
as output.
So I think that a byte array is the correct representation for
public/private keys in these two RFCs.
>
>>
>> I don't worry about this issue any more. At present, each
>> java.security.Key has three characters (see the API Java doc):
>> . an algorithm
>> . an encoded form
>> . a format
>>
>> The format could be "X.509", and could be "RAW" (like
>> ByteArrayValue.getValue()). I would suggest have the named curve in
>> the algorithm characters, and use "RAW" as the encode format.
>> If X.509 encoding is required, KeyFactory.getKeySpec() could do it.
> Um... I think that doesn't make a lot of sense. The default contract
> for public keys is X.509 and the default for private keys is PKCS#8.
> Almost all uses of the encoded formats are related to PKIX related
> functions. (See for info the javadoc for PublicKey).
I'm concerned about this, too. Ideally, we want PKI code to handle these
new keys without modification. The javadoc wording makes it a little
unclear whether public keys *must* use X.509 encoding, but using other
encodings for public keys would probably be surprising.
>
> To be JCA compliant you need all of: <snip>
>
Are you describing hard compliance requirements or more informal
expectations? If it's the former, where are these requirements documented?
More information about the security-dev
mailing list