RE: AlgorithmIdentifier in encrypt/decrypt/sign/verify operations

I agree that we shouldn't require that the key size be the size of the hash output in the low-level API - especially when the HMAC specs themselves don't contain this requirement.  I'd be fine with recommendations about key size, but I don't think it's appropriate in the low-level API to require particular key sizes (other than possibly requiring that they be sufficiently long to be meet minimum security requirements).

				-- Mike

-----Original Message-----
From: Mark Watson [mailto:watsonm@netflix.com] 
Sent: Tuesday, April 02, 2013 7:26 AM
To: Richard Barnes
Cc: Vijay Bharadwaj; public-webcrypto@w3.org
Subject: Re: AlgorithmIdentifier in encrypt/decrypt/sign/verify operations

Sent from my iPhone

On Apr 2, 2013, at 7:16 AM, Richard Barnes <rbarnes@bbn.com> wrote:

>
> On Apr 2, 2013, at 10:00 AM, Mark Watson <watsonm@netflix.com> wrote:
>
>>
>>
>> Sent from my iPhone
>>
>> On Apr 2, 2013, at 1:46 AM, Vijay Bharadwaj <Vijay.Bharadwaj@microsoft.com> wrote:
>>
>>> This was raised as issue #12 back in August. FWIW I think it's a good idea to separate operation-specific parameters from algorithm parameters. At the time we did not have strong use cases that would argue for such separation. Now that the API is taking shape, it does seem like combining them may be adding confusion. So it may be a good idea to try separating them out.
>>>
>>> IMO redundant specifications of the algorithm in different parameters are trouble for implementers - you need to define precedence rules for who wins if they conflict. Better to keep things simple by only requiring the algorithm to be specified in one place.
>>>
>>> I'm not sure that we need a parameter for specifying the length of an HMAC key, though. HMAC is specified to always use a key that is the size of the hash output - if the key is longer it gets hashed to reduce it to the right size. So it should be fine to always generate a key of the size of the hash output, since there is no security advantage to making it longer.
>>
>> That would be a reasonable simplification. We would have to say that in our spec, since as you say the input to the HMAC algorithm as defined in the RFC and FIPS PUB can be any length.
>>
>> ...Mark
>
> The only objection that I can think of is if people wanted to use MAC keys shorter than the full hash length, to save space.  For example, some of the JOSE use cases involve putting a MAC-protected object in an HTTP request URI, which places some limits on how long they can be.

So, then, this really does look like an example where there is an obvious default, but some use-cases where you might want to specify something different ;-)

...Mark
>
> --Richard
>
>
>
>
>
>
>>>
>>>
>>> From: Mark Watson [mailto:watsonm@netflix.com]
>>> Sent: Saturday, March 30, 2013 9:52 AM
>>> To: Richard Barnes
>>> Cc: public-webcrypto@w3.org
>>> Subject: Re: AlgorithmIdentifier in encrypt/decrypt/sign/verify 
>>> operations
>>>
>>>
>>> On Fri, Mar 29, 2013 at 11:22 AM, Richard Barnes <rbarnes@bbn.com> wrote:
>>>
>>> On Mar 27, 2013, at 9:10 PM, Mark Watson <watsonm@netflix.com> wrote:
>>>
>>>> This may be related to ISSUE-12 and apologies again if this has been discussed before - it is coming up now frequently in implementation discussions.
>>>>
>>>> In the encrypt/decrypt/sign/verify operations, two AlgorithmIdentifier objects are provided as input, one as an explicit parameter and one which is associated with the Key object (and appears as the Key.algorithm attribute). Presumably it is an error if the "name" member of the dictionary does not match (after normalization), though I am not sure if this is clearly specified.
>>>>
>>>> In some cases, it is specified that the params member will have different types in these two places (I'm assuming that the Key.algorithm attribute takes the value that was provided to generateKey). For example for AES-CTR, the params in Key.algorithm contains the key length and params in encrypt/decrypt contains the IV.
>>>>
>>>> But for other cases things are very unclear. For example, for HMAC, the same AlgorithmParameters type is used, containing the hash algorithm. In this case it seems completely redundant to provide the same object twice to the sign/verify call (once in the method parameters and again in the Key.algorithm attribute).
>>>>
>>>> Am I missing something ? Does anyone else find this confusing ?
>>>>
>>>> I think the confusion could be resolved by
>>>> (i) replacing the AlgorithmIdentifier argument to sign/verify/encrypt/decrypt with AlgorithmParameters.
>>>> (ii) for HMAC, the params provided to sign/verify must be null, as 
>>>> the hash algorithm should have been provided when the Key was 
>>>> created/imported/unwrapped
>>>
>>> I agree that it could be made clearer.
>>>
>>> When I was implementing PolyCrypt, my read of the specification was as follows:
>>> 1. The algorithm provided as a parameter to encrypt() specifies the 
>>> encryption (and parameters) 2. Throw an error if the 
>>> Key.algorithm.name != algorithm.name
>>>
>>> That is, for the algorithm in the Key, everything besides the name is ignored.  This seems right to first order, but might be wrong, e.g., for HMAC, where you might want to compare the hash algorithm as well.
>>>
>>> It seems ambiguous to me whether the hash algorithm is a property of the key or a parameter to the operation. Another source of confusion.
>>>
>>>
>>> I'm leery of removing the algorithm parameter from encrypt(), if only because it seems really confusing and non-idiomatic.
>>>
>>> What idiom, and why do you say it's confusing ? The algorithm is a property of the key, so it's confusing that I need to re-specify it as a method parameter. That only seems to introduce an unnecessary failure path and give the incorrect impression to developer that they have some choice about the algorithm here. They don't. It's implicit in the Key.
>>>
>>> I don't think it's terrible to have the algorithm specified in two 
>>> places, as long as its clear how those two specifications relate to 
>>> each other
>>>
>>> It's not clear now. IIUC, anything in the method AlgorithmIdentifier that is also a property of the Key must match. Anything else is a method parameter.
>>>
>>> A particularly confusing case is when there are both algorithm and 
>>> method parameters. For example, suppose a create an AES-CBC key with 
>>> { name : "AES-CBC", params: { length: 128 } }. Am I supposed to 
>>> write
>>>
>>> encrypt( { name: "AES-CBC", { "length" : 128, "iv" : iv } }, ... )
>>>
>>> ?
>>>
>>> If I'm allowed to miss out the length here, why is it that it makes sense to miss out some of the Key properties and not others (the algorithm name itself) ?
>>>
>>> This could be completely cleaned up by only specifying the "params" member in the methods. Specifically by defining an OperationParameters for that thing and derving the operation parameters objects from that. This would provide a clear separation between algorithm and operation parameters.
>>>
>>> ...Mark
>>>
>>>
>>>
>>>> As a side note, I believe that to generate a HMAC key we need to specify the key length. At least according to FIPS 198-1 the key, K, can be of any length. So, either we require in WebCrypto that it is a particular length (say, the same size as the hash function), or we need a length parameter to generateKey for HMAC.
>>>
>>> +1 on adding a length parameter.
>>>
>>> --Richard
>>>
>>>>
>>>> ...Mark
>

Received on Tuesday, 2 April 2013 17:43:59 UTC