Re: #481, was: WGLC: p7 MUSTs

Alex Rousskov <> Sun, 09 June 2013 18:52 UTC

Return-Path: <>
Received: from localhost (localhost []) by (Postfix) with ESMTP id B3B1121F880F for <>; Sun, 9 Jun 2013 11:52:40 -0700 (PDT)
X-Virus-Scanned: amavisd-new at
X-Spam-Flag: NO
X-Spam-Score: -10.599
X-Spam-Status: No, score=-10.599 tagged_above=-999 required=5 tests=[BAYES_00=-2.599, RCVD_IN_DNSWL_HI=-8]
Received: from ([]) by localhost ( []) (amavisd-new, port 10024) with ESMTP id KeJ3wpfKW+80 for <>; Sun, 9 Jun 2013 11:52:34 -0700 (PDT)
Received: from ( []) by (Postfix) with ESMTP id 2C93A21F87B7 for <>; Sun, 9 Jun 2013 11:52:33 -0700 (PDT)
Received: from lists by with local (Exim 4.72) (envelope-from <>) id 1UlkhW-000557-5H for; Sun, 09 Jun 2013 18:50:50 +0000
Resent-Date: Sun, 09 Jun 2013 18:50:50 +0000
Resent-Message-Id: <>
Received: from ([]) by with esmtp (Exim 4.72) (envelope-from <>) id 1UlkhI-00054O-B4 for; Sun, 09 Jun 2013 18:50:36 +0000
Received: from ([]) by with esmtps (TLS1.0:DHE_RSA_AES_256_CBC_SHA1:32) (Exim 4.72) (envelope-from <>) id 1UlkhH-0001RD-Jm for; Sun, 09 Jun 2013 18:50:36 +0000
Received: from [] (localhost []) (authenticated bits=0) by (8.14.3/8.14.3) with ESMTP id r59Io7ZZ047110 (version=TLSv1/SSLv3 cipher=DHE-RSA-AES256-SHA bits=256 verify=NOT); Sun, 9 Jun 2013 12:50:08 -0600 (MDT) (envelope-from
Message-ID: <>
Date: Sun, 09 Jun 2013 12:49:55 -0600
From: Alex Rousskov <>
User-Agent: Mozilla/5.0 (X11; Linux i686; rv:17.0) Gecko/20130510 Thunderbird/17.0.6
MIME-Version: 1.0
CC: Julian Reschke <>
References: <> <> <>
In-Reply-To: <>
X-Enigmail-Version: 1.5.1
Content-Type: text/plain; charset=windows-1252
Content-Transfer-Encoding: 7bit
Received-SPF: pass client-ip=;;
X-W3C-Hub-Spam-Status: No, score=-4.5
X-W3C-Hub-Spam-Report: AWL=-2.437, BAYES_00=-1.9, RP_MATCHES_RCVD=-0.125, SPF_HELO_PASS=-0.001, SPF_PASS=-0.001
X-W3C-Scan-Sig: 1UlkhH-0001RD-Jm 3d363ed20b06e68533cebb94eb6b0edd
Subject: Re: #481, was: WGLC: p7 MUSTs
Archived-At: <>
X-Mailing-List: <> archive/latest/18205
Precedence: list
List-Id: <>
List-Help: <>
List-Post: <>
List-Unsubscribe: <>

On 06/09/2013 10:57 AM, Julian Reschke wrote:
> On 2013-05-01 07:09, Alex Rousskov wrote:
>> And here is a list of requirements that are missing an explicit actor on
>> which the requirement is placed. Even though it is often possible to
>> guess the actor, most of these should be easy to rephrase to place the
>> requirement on the intended actor explicitly (e.g., "A proxy MUST"
>> instead of "a header field MUST":
>>> each parameter name MUST only occur once per challenge
> That's a requirement on the validity of a challenge. 

Yes. We need to make clear which actors that requirement applies to.

> As such it does not depend on the actor.

It does. When I originally complained that lots of RFC 2616 MUSTs may be
interpreted as if they apply to proxies when they should not and
suggested a general rule to excuse proxies from policing traffic, I was
told that a better approach is to check each and every MUST to make sure
it is clear whether it applies to blind forwarding situations or not.
The current HTTPbis specs use that overall approach via the introduction
of "sends" vs "generates" difference (thank you!).

However, to enable such checks, each MUST has to have an actor with
"sends", "generates", or another appropriate keyword. Otherwise, it is
not clear whether the proxy is responsible for policing things like
challenges with duplicate parameter names. The overhead of checking and
adjusting each requirement comes with the approach. You cannot have it
both ways.

>>> This response MUST include a WWW-Authenticate header
>>> The 407 (Proxy Authentication Required) response message [...] MUST
>>> include a Proxy-Authenticate header field
>>> information necessary to authenticate a request MUST be provided in
>>> the request
>>> It MUST be included as part of a 407 (Proxy Authentication Required)
>>> response.
>>> It MUST be included in 401 (Unauthorized) response messages
> Similar things can be said about these.

Yes, the flaw is similar.

> What you seem to ask for is information about what a proxy should do
> when it receives a message that already violates a MUST level
> requirement.

No, I am not asking for that. I am asking to make it possible to
determine whether a proxy forwarding a malformed message is in violation
of the specs. As discussed above, each requirement has to be clear on
that by using appropriate actors and verbs.

If you say "server MUST NOT send X", the proxy becomes responsible for
not forwarding X. If you say "server MUST NOT generate X", the proxy
forwarding behavior is not restricted by that specific requirement. When
you say "request MUST NOT have X", the specs become ambiguous: some will
claim that a proxy forwarding X is in violation and some will claim that
the requirement is not applicable to proxies.

Hope this clarifies,