Hi Martin,
Thanks for the reply! Please see inline below.
On Mon, Sep 16, 2019, at 6:26 PM, Martin Thomson wrote:
> There are two points here to consider:
>
> 1. Whether the key that we are feeding into this process is going to be
> used exclusively for that purpose, or whether it might be used for
> something else.
>
> 2. How the key that is output from this process might need diversification.
>
> What we learned from TLS 1.3 is that HKDF is effectively a completely
> different KDF when it is used with a different hash function. And that
> taking the same key into two different functions was not advisable
> because there isn't a lot of analysis to support that particular usage
> pattern.
>
> In thinking about the first point, we might want to consider whether
> the KDF that is used in the importer might need to be used in other
> ways.
To be clear, you're referring to HKDF and its role in deriving ipsk from epsk,
right?
> Personally, when I see the question formulated this way, I am
> inclined to suggest that this key should be used exclusively for key
> import. If that's the decision, that should be made very clear.
I agree. We can state something along the lines of "clients MUST NOT use an
external TLS PSK for any other purpose." And also say that external PSKs can
only be associated with a single hash function. As you mention above and in
your followup message, if this isn't done, then a client may import the same
IKM using different hash functions.
Is this what you had in mind?
> If we decide that we're gaining exclusive access, then the only other
> consideration I'm aware of on the input side is the binding to the
> origination of the key, as raised by Jonathan. That is something we
> might gain by integrating something into the identity, or by adding a
> context attribute to the expansion (which might carry a session hash).
> That concern is not reflected in the proposal here though.
>
> If you have exclusive access to the input keying material, then you can
> very easily restrict this to HKDF. If not, then I'd suggest that you
> need to use the more general form. But then you also need to ensure
> that whatever inputs you feed into the KDF can't collide with inputs
> for the other usages. That's tricky.
Right. Tricky and likely impossible. There's nothing stopping someone from
crafting a PSK with an identity which matches an ImportedIdentity, and then
advertising that on the wire.
> Then the question is how we identify the diversification parameters.
> Right now, we want to diversify outputs based on TLS version and the
> hash algorithm associated with the cipher suite. If this is only ever
> used for TLS, then we have a simple process: we identify the specific
> type of TLS PRF somehow and bake that into the KDF label.
>
> How we do that is simple mechanics: each version of TLS we care about
> has a template KDF, which is parameterized by hash function. As Chris
> proposes, we could include a TLS version and a hash function
> identifier. That seems enough.
I suspect you meant "KDF identifier" here? (The proposal below uses the TLS
version and a KDF identifier. It could also use the TLS version and a
HashAlgorithm value. Using a KDF identifier is probably more future proof,
though.)
> The final question is about multiple PRFs in TLS 1.2. We never
> restricted input PSKs in TLS 1.2 to a single KDF, so in theory we could
> use a single output of this importer function for TLS 1.2. However,
> I'm not sure that this is necessary if we allow for the possibility of
> an importer. We could use different keys depending on the final
> selection of cipher suite (and therefore hash function). I don't see
> any reason not to fix TLS 1.2 PSK usage at the same time as TLS 1.3.
Sure, it's possible, though I think that's already done? Was there something
below or in the draft that made you think otherwise?
Thanks again!
Chris
>
> On Sun, Sep 15, 2019, at 00:53, Christopher Wood wrote:
> > Hi folks,
> >
> > Martin reviewed the external PSK draft [1] and filed a couple issues
> > [2,3] that are worth discussion here. I’d like to call attention to #16
> > [3] in particular.
> >
> > TL;DR: Should we bind the importer to a KDF rather than a hash function?
> >
> > Currently, the importer draft assumes that an external PSK is
> > optionally associated with some hash function, and, if not, assumes
> > SHA256. The importer uses this hash function when deriving the imported
> > key. In particular, it’s the hash function used for HKDF-Extract and
> > HKDF-Expand, which runs over the external PSK blob and the constructed
> > ImportedIdentity to produce a unique, imported PSK. ImportedIdentity is
> > the structure that contains the external PSK identity, a protocol
> > label, and target hash function:
> >
> > ~~~
> > struct {
> > opaque external_identity<1...2^16-1>;
> > opaque label<0..2^8-1>;
> > HashAlgorithm hash;
> > } ImportedIdentity;
> > ~~~
> >
> > The issue raised pointed out that the (protocol label, hash) tuple
> > effectively identifies a KDF. (Martin, please correct me if I’m
> > misinterpreting your comments!) Thus, perhaps it makes sense to replace
> > this with something simpler, e.g.,
> >
> > ~~~
> > struct {
> > opaque external_identity<1...2^16-1>;
> > uint16 protocol_version;
> > uint16 kdf_identifier;
> > } ImportedIdentity;
> > ~~~
> >
> > Where ImportedIdentity.protocol_version is a code point (e.g., 0x0304
> > for TLS 1.3) and ImportedIdentity.kdf_identifier is a unique
> > (registry-defined) KDF function (e.g., 0x0001 for HKDF-SHA256). If we
> > did this, a couple interesting questions arise.
> >
> > First, should we keep using HKDF as the importer KDF? Note that the
> > current ImportedIdentity.hash field is what diversifies imported PSKs
> > by hash function. The actual key derivation still uses HKDF with the
> > hash function associated with the external PSK. (SHA-256 is assumed if
> > none is specified.) If we replaced ImportedIdentity.hash with
> > ImportedIdentity.kdf_identifier, we would still get this
> > diversification, since each target KDF is bound to one hash function.
> > However, should the KDF corresponding to
> > ImportedIdentity.kdf_identifier be the KDF used by the importer for
> > derivation? That is, let’s say I have an external PSK "epsk" that's
> > associated with SHA-512. Moreover, let's assume
> > ImportedIdentity.kdf_identifier = 0xFEFE, which corresponds to some KDF
> > called MySpecialKDF. Should the derivation step be this?
> >
> > ~~~
> > epskx = HKDF-SHA512-Extract(0, epsk)
> > ipskx = HKDFSHA512-Expand-Label(epskx, "derived psk",
> > Hash(ImportedIdentity), Hash.length)
> > ~~~
> >
> > Or this?
> >
> > ~~~
> > epskx = MySpecialKDF-Extract(0, epsk)
> > ipskx = MySpecialKDF-Label(epskx, "derived psk",
> > MySpecialKDF.Hash(ImportedIdentity), MySpecialKDF.length)
> > ~~~
> >
> > Or something else entirely?
> >
> > Second, keys need to be imported for each supported ciphersuite and
> > corresponding hash function. How would we specify that if we now speak
> > of importers in terms of a target KDF?
> >
> > Thanks,
> > Chris (no hat)
> >
> > [1] https://github.com/tlswg/draft-ietf-tls-external-psk-importer
> > [2] https://github.com/tlswg/draft-ietf-tls-external-psk-importer/issues/15
> > [3] https://github.com/tlswg/draft-ietf-tls-external-psk-importer/issues/16
> >
> > _______________________________________________
> > TLS mailing list
> > [email protected]
> > https://www.ietf.org/mailman/listinfo/tls
> >
>
> _______________________________________________
> TLS mailing list
> [email protected]
> https://www.ietf.org/mailman/listinfo/tls
>
_______________________________________________
TLS mailing list
[email protected]
https://www.ietf.org/mailman/listinfo/tls