rxgk CombineTokens and enctypes (was Re: [AFS3-std] Re: afs3-rxgk-updates for 03)

Benjamin Kaduk kaduk@MIT.EDU
Sat, 3 Nov 2012 15:28:25 -0400 (EDT)


On Sat, 3 Nov 2012, Simon Wilkinson wrote:

>>> 1) Whichever one the server picks from the client-provided list.
>>
>> Okay.  I would pick (1) from that, and prefer that the client indicates its preferences.
>
> If we're doing this (and I have no objection to doing so, as it's

I think this is the least bad way to get to a fully/usefully specified 
CombineTokens operation.  (That is, I think we should do it.)

> necessary for AFSCombineTokens, in any case) then we need to change the 
> signature of CombineTokens to something like:
>
> struct RXGK_CombineOptions {
>    RXGK_Enctypes enctypes;
>    RXGK_Levels levels;

I don't think we have an array RXGK_Levels typedef in the document at the 
moment, and adding one in addition to the non-plural RXGK_Level enum might 
be confusing.  So I would put this as 'RXGK_Level levels<>' to 
match StartParams.  (Sorry, nitpicking.)

> };
>
> struct RXGK_TokenInfo {
>    RXGK_Enctype enctype;
>    RXGK_Level   level;
>    uint32  	 lifetime;
>    uint32  	 bytelife;
>    rxgkTime   	 expirationtime;
> };
>
> CombineTokens(IN RXGK_Data *token0, IN RXGK_Data *token1,
>              IN RXGK_CombineOptions *options,
> 	      OUT RXGK_Data *new_token,
> 	      OUT RXGK_TokenInfo *info);

Do we want a way for the server to indicate a problem with the request? A 
zero-length new_token would indicate failure, but there might be some 
sense in reusing the RXGK_ClientInfo errorcodes here.  It would give the 
server a way to explicitly indicate that the client's suggested values are 
not acceptable, which seems useful.

>
> This is roughly similar to what is done with AFSCombineTokens in order 
> to support departmental fileservers and solve the first packet problem. 
> Strictly speaking, I don't think we need lifetime and bytelife in 
> CombineTokens, as they can be programatically determined - but we do 
> need them for AFSCombineTokens, so I'm leaving them here.

I don't mind leaving them here.  (When I am writing an application, I 
will sanity-check such returned values, of course.)

That said, I don't think that the rxgk-afs printout I have handy reflects 
the quoted text.

>
> The question here is whether the TokenInfo structure needs to be 
> protected in some way. If the enctype is wrong, then the PRF will fail, 
> and we won't be able to use the token. If the level is faked, then we 
> won't be able to use the token to establish a security context. If the 
> lifetime and bytelife are false, then the server will still rekey the 
> connection, although the client won't (or may rekey too frequently). If 
> the expirationTime is faked, then the client won't realise that the 
> token is going to expire ahead of time - but the server will still 
> reject attempts to use expired tokens. So, I'm leaning towards the 
> protection that's provided by performing this operation over an AUTH (or 
> higher) connection being sufficient.

I don't see any flaws in this reasoning at first reading, but note that it 
would be easy to mic with Kn if desired.  I'm not suggesting adding a mic 
at this time, though.

-Ben