[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

Re: an SPD syntax example



At 4:03 +0200 1/22/04, Tero Kivinen wrote:
>Stephen Kent writes:
>>  Comments welcome, other than those arguing for use of another syntax :-)
>>
>>  SPD ::= SEQUENCE of SPDEntry
>>
>>  SPDEntry ::= SET OF SelectorSet
>>
>>  SelectorSet ::= SEQUENCE {
>>	sourceAddr	AddrList,
>>	destAddr	AddrList,
>
>Why are these AddrList types? Why not simply AddrOrList, or actually
>even better remove AddrList, AddrOrList, IPaddr and change this to
>IPRange, and add comment to IPRange saying that if start == end then
>it is single address (==IPaddr). As this is explaining the minimal
>SPD, I think it should really be minimal, and it should not do
>optimizations where we save 4/16 bytes by not expressing IPaddr as
>IPRange constructs, or by having less SelectorSets by allowing each
>list have list of ranges, instead of having multiple SelectorSets each
>having one range. The bad thing is that now we have two different ways
>to express same thing:

Good point.  We'll just refer to ranges, and note that a single 
address is a trivial range.

>
>SPDEntry = {
>	 SelectorSet = {
>		     sourceAddr = { 10.0.0.1, 10.0.0.5 }
>		     destAddr = { 10.0.2.1 }
>		     ... rest omitted
>	 }
>}
>
>and
>
>SPDEntry = {
>	 SelectorSet = {
>		     sourceAddr = { 10.0.0.1 }
>		     destAddr = { 10.0.2.1 }
>		     ... rest omitted
>	 }
>	 SelectorSet = {
>		     sourceAddr = { 10.0.0.5 }
>		     destAddr = { 10.0.2.1 }
>		     ... rest omitted
>	 }
>}
>
>of course when the number of items in the list grows then the
>combinatory explosion will create huge number of SPDEntry items, but
>on the other hand this is simply explaining minimal format for the
>SPD, real SPDs will propably have more compressed formats anyways.

right.  My goal here is just to better explain what the text was 
trying to say, and it is not trying to optimize the representation.

>
>In IKEv2 you still need to convert the IPaddr to IPRange before using
>it in the traffic selector.

right, and the other suggestion we received pointed this out.  We'll 
remind folks that the admin interface can use various syntactic 
options to make it easier, even though a list of ranges is all one 
needs and it is precisely what IKEv2 sends.

>Also in the IKEv2 there is no construct of AddrList at all, we have
>two lists (source and destination) of Traffic Selectors (==
>SelectorSet), each having on start and end addresses (IPRange), and
>port range.
>
>Because in the IKEv2 we do have separate source and destination lists,
>it will remove the combinatory explosion, thus the same example can be
>expressed as (using the format described in the end of this email):

yes, but the SPD is also used to represent bypass and discard access 
controls.  So, maybe we need to define two classes of entries, one 
for IPsec SA creation and one for bypass/discard, where the IKE 
selector payload conventions do not apply. Also, the PFP flag is not 
in this syntax, yet, and it does need to be in the syntax for the 
former class of SPD entries, even though it is not sent in the IKE 
payload.

>SPDEntry = {
>	 source = {
>		TrafficSelector = { Addr = 10.0.0.1-10.0.0.1, ... }
>		TrafficSelector = { Addr = 10.0.0.5-10.0.0.5, ... }
>	 }
>	 destination = {
>		TrafficSelector = { Addr = 10.0.2.1-10.0.2.1, ... }
>	 }
>}
>
>>	protocol	INTEGER,	-- 8 bits
>>	next CHOICE {
>>		ports	SEQUENCE {
>>				SourcePort	INTEGER, -- 16 bits
>>				DestPort }	INTEGER, -- 16 bits
>
>This should be range of ports not single port. IKEv2 allows port
>ranges.

I'm confused. In the current version of IKE (12), section 3.13.1 
describes the Traffic Selector format. It consists of one byte for 
the protocol, not a range, with 0 being the way to indicate ANY. It 
defines a range for ports (directional) and a range for addresses 
(directional). This structure can be repeated multiple times in the 
payload. did this change in the latest version?

>
>>		mobilityHdr	INTEGER, -- 16 bits
>
>This is not yet negotiable by the IKEv2.

it needs to be, and it can be represented using the port fields.

>
>>		ICMP [0] SEQUENCE {
>  >			type	INTEGER,	-- 8 bits
>>			code	INTEGER } }	-- 8 bits
>
>This is also type and code range in IKEv2. Also one closing } is
>missing (matchintg the SelectorSet sequence).

I agree that IKE allows this, but I think it is a bad idea. In 
general it does not make sense to list a range of types for which a 
range of codes is applicable, since codes are interpreted for each 
type differently. It's not like UDP, TCP, and SCTP, where all the 
well known ports are interpreted in the same way for each protocol. 
Yes, it is syntactically possible to list ranges here, but is it a 
good idea? We do have a problem in that the value 0 is assigned to 
echo reply, so we can't use that value to indicate ANY. maybe the 
best solution here is to say that the ICMP Type and Code range MUST 
be trivial, unless we want to signal ANY, in which case the range 
MUST be 0-255.

>
>>  AddrList ::=  SET OF AddrOrList
>
>This is not possible in the IKEv2. I assume this is union of all
>ranges, and this can be combined with any source and destination
>pairs?
>
>>  AddrOrList ::= CHOICE {
>>			iPAddr	IPaddr	-- individual IP address
>>			range	IPRange} -- IP address range
>>
>>  IPaddr	::= CHOICE {
>>			v4Addr		INTEGER, -- 32 bits
>>			v6Addr [0]	INTEGER } -- 128 bits
>  >
>>  IPRange	::=	CHOICE {
>>			v4range		SEQUENCE {
>>						start	INTEGER, -- 32 bits
>>						end	INTEGER } -- 32 bits
>>			v6range [0]	SEQUENCE {
>>						start	INTEGER, -- 128 bits
>>						end	INTEGER } } -- 128 bits
>
>Using same syntax the actual TrafficSelector which can be expressed in
>the IKEv2 is:
>
>SPD ::= SEQUENCE of SPDEntry			-- List of SPD Entries
>
>SPDEntry ::= SEQUENCE {				-- Each entry 
>consist of
>	source		TrafficSelectorList,	-- source and
>	destination	TrafficSelectorList }	-- destination selectorlists
>
>TrafficSelectorList ::= SET OF TrafficSelector	-- Each selectorList
>						-- is list of selectors
>
>TrafficSelector ::= SEQUENCE {			-- either source or
>						-- destination selector
>	Addr		IPRange,
>	protocol	INTEGER,	-- 8 bits
>	next CHOICE {
>		ports	SEQUENCE {
>				portStart	INTEGER, -- 16 bits
>				portEnd }	INTEGER, -- 16 bits
>		ICMP [0] SEQUENCE {
>			typeStart	INTEGER,	-- 8 bits
>			codeStart	INTEGER,	-- 8 bits
>			typeEnd		INTEGER,	-- 8 bits
>			codeEnd		INTEGER } } }	-- 8 bits
>
>IPRange	::=	CHOICE {
>			v4range		SEQUENCE {
>						start	INTEGER, -- 32 bits
>						end	INTEGER } -- 32 bits
>			v6range [0]	SEQUENCE {
>						start	INTEGER, -- 128 bits
>						end	INTEGER } } -- 128 bits

I like the more compact syntax, but we need to resolve the 
disagreement about the protocol field representation in IKE, and 
maybe adopt the conventions re ICMP type/code values. We also need 
text to accommodate the mobility header support. Plus, I need to add 
in the PFP flag, and create a separate entry type for bypass/discard.

I'll take another cut at this at the start of next week.

Thanks for all the feedback.

Steve