* [NAT-T] NON-IKE encapsulation
@ 2004-06-24 12:36 Herbert Xu
2004-06-24 19:46 ` David S. Miller
2004-06-25 17:12 ` David S. Miller
0 siblings, 2 replies; 10+ messages in thread
From: Herbert Xu @ 2004-06-24 12:36 UTC (permalink / raw)
To: agruen, David S. Miller, netdev
[-- Attachment #1: Type: text/plain, Size: 536 bytes --]
Hi:
I'm having trouble understanding why we need to increase alen by
two bytes for NON-IKE. As far as I can see it's adding two bytes
of random data to the end of the packet. Is there something
obvious that I'm missing?
If not then we'll need this patch.
Signed-off-by: Herbert Xu <herbert@gondor.apana.org.au>
Cheers,
--
Visit Openswan at http://www.openswan.org/
Email: Herbert Xu ~{PmV>HI~} <herbert@gondor.apana.org.au>
Home Page: http://gondor.apana.org.au/~herbert/
PGP Key: http://gondor.apana.org.au/~herbert/pubkey.txt
[-- Attachment #2: p --]
[-- Type: text/plain, Size: 579 bytes --]
===== net/ipv4/esp4.c 1.41 vs edited =====
--- 1.41/net/ipv4/esp4.c 2004-06-23 06:53:57 +10:00
+++ edited/net/ipv4/esp4.c 2004-06-24 22:26:50 +10:00
@@ -106,7 +106,6 @@
udpdata32 = (u32*)(uh+1);
udpdata32[0] = udpdata32[1] = 0;
esph = (struct ip_esp_hdr*)(udpdata32+2);
- alen += 2;
top_iph->protocol = IPPROTO_UDP;
break;
default:
@@ -149,7 +148,6 @@
udpdata32 = (u32*)(uh+1);
udpdata32[0] = udpdata32[1] = 0;
esph = (struct ip_esp_hdr*)(udpdata32+2);
- alen += 2;
top_iph->protocol = IPPROTO_UDP;
break;
default:
^ permalink raw reply [flat|nested] 10+ messages in thread* Re: [NAT-T] NON-IKE encapsulation 2004-06-24 12:36 [NAT-T] NON-IKE encapsulation Herbert Xu @ 2004-06-24 19:46 ` David S. Miller 2004-06-24 21:41 ` Herbert Xu 2004-06-25 17:12 ` David S. Miller 1 sibling, 1 reply; 10+ messages in thread From: David S. Miller @ 2004-06-24 19:46 UTC (permalink / raw) To: Herbert Xu; +Cc: agruen, netdev On Thu, 24 Jun 2004 22:36:03 +1000 Herbert Xu <herbert@gondor.apana.org.au> wrote: > I'm having trouble understanding why we need to increase alen by > two bytes for NON-IKE. As far as I can see it's adding two bytes > of random data to the end of the packet. Is there something > obvious that I'm missing? It is intentional as far as I remember. If it's any other length, then the other side implementing this non-IKE encap stuff won't accept the packet, it must be that length. ^ permalink raw reply [flat|nested] 10+ messages in thread
* Re: [NAT-T] NON-IKE encapsulation 2004-06-24 19:46 ` David S. Miller @ 2004-06-24 21:41 ` Herbert Xu 0 siblings, 0 replies; 10+ messages in thread From: Herbert Xu @ 2004-06-24 21:41 UTC (permalink / raw) To: David S. Miller; +Cc: agruen, netdev On Thu, Jun 24, 2004 at 12:46:54PM -0700, David S. Miller wrote: > > > I'm having trouble understanding why we need to increase alen by > > two bytes for NON-IKE. As far as I can see it's adding two bytes > > of random data to the end of the packet. Is there something > > obvious that I'm missing? > > It is intentional as far as I remember. If it's any other length, > then the other side implementing this non-IKE encap stuff won't > accept the packet, it must be that length. Which impelementation does that? The implementation in FreeS/WAN certainly doesn't and it has talked to many commercial NAT-T software using NON-IKE. There is also nothing like this in the draft for NON-IKE. Even if we do need this, we should fill those two bytes with some data. Cheers, -- Visit Openswan at http://www.openswan.org/ Email: Herbert Xu ~{PmV>HI~} <herbert@gondor.apana.org.au> Home Page: http://gondor.apana.org.au/~herbert/ PGP Key: http://gondor.apana.org.au/~herbert/pubkey.txt ^ permalink raw reply [flat|nested] 10+ messages in thread
* Re: [NAT-T] NON-IKE encapsulation 2004-06-24 12:36 [NAT-T] NON-IKE encapsulation Herbert Xu 2004-06-24 19:46 ` David S. Miller @ 2004-06-25 17:12 ` David S. Miller 2004-06-25 21:57 ` Herbert Xu 1 sibling, 1 reply; 10+ messages in thread From: David S. Miller @ 2004-06-25 17:12 UTC (permalink / raw) To: Herbert Xu; +Cc: agruen, netdev On Thu, 24 Jun 2004 22:36:03 +1000 Herbert Xu <herbert@gondor.apana.org.au> wrote: > I'm having trouble understanding why we need to increase alen by > two bytes for NON-IKE. As far as I can see it's adding two bytes > of random data to the end of the packet. Is there something > obvious that I'm missing? I now think it's trying to account for the udpdata32[] header area. But that's not 2 bytes, it's (2 * sizeof(u32)) or 8 bytes. The ESP added headers amount to esp->auth.icv_trunc_len + 8 in this case, so changing the "alen += 2;" into "alen += 8;" seems more appropriate. What do you think Herbert? Does it make sense now? ^ permalink raw reply [flat|nested] 10+ messages in thread
* Re: [NAT-T] NON-IKE encapsulation 2004-06-25 17:12 ` David S. Miller @ 2004-06-25 21:57 ` Herbert Xu 2004-06-25 22:09 ` David S. Miller ` (2 more replies) 0 siblings, 3 replies; 10+ messages in thread From: Herbert Xu @ 2004-06-25 21:57 UTC (permalink / raw) To: David S. Miller; +Cc: agruen, netdev On Fri, Jun 25, 2004 at 10:12:31AM -0700, David S. Miller wrote: > > I now think it's trying to account for the udpdata32[] header area. > But that's not 2 bytes, it's (2 * sizeof(u32)) or 8 bytes. That's what I thought too, but that is already accounted by x->props.header_len in init_state. In any case, just increasing alen like that is wrong. It needs to do at least three other things: 1. Allocate memory for it in skb_cow_data. 2. Fill in those bytes with data so we don't leak information. 3. Teach get_max_size about it. Andreas, can you please clarify for us as to what those two bytes are for? Cheers, -- Visit Openswan at http://www.openswan.org/ Email: Herbert Xu ~{PmV>HI~} <herbert@gondor.apana.org.au> Home Page: http://gondor.apana.org.au/~herbert/ PGP Key: http://gondor.apana.org.au/~herbert/pubkey.txt ^ permalink raw reply [flat|nested] 10+ messages in thread
* Re: [NAT-T] NON-IKE encapsulation 2004-06-25 21:57 ` Herbert Xu @ 2004-06-25 22:09 ` David S. Miller 2004-06-25 22:13 ` Andreas Gruenbacher 2004-06-25 23:30 ` Andreas Gruenbacher 2 siblings, 0 replies; 10+ messages in thread From: David S. Miller @ 2004-06-25 22:09 UTC (permalink / raw) To: Herbert Xu; +Cc: agruen, netdev On Sat, 26 Jun 2004 07:57:47 +1000 Herbert Xu <herbert@gondor.apana.org.au> wrote: > Andreas, can you please clarify for us as to what those two bytes > are for? Yes, Andrea please do. You've been very quiet and it is possible that you posses the key to unlock this mystery :-) ^ permalink raw reply [flat|nested] 10+ messages in thread
* Re: [NAT-T] NON-IKE encapsulation 2004-06-25 21:57 ` Herbert Xu 2004-06-25 22:09 ` David S. Miller @ 2004-06-25 22:13 ` Andreas Gruenbacher 2004-06-25 22:12 ` David S. Miller 2004-06-25 23:30 ` Andreas Gruenbacher 2 siblings, 1 reply; 10+ messages in thread From: Andreas Gruenbacher @ 2004-06-25 22:13 UTC (permalink / raw) To: Herbert Xu; +Cc: David S. Miller, netdev Hello, On Fri, 2004-06-25 at 23:57, Herbert Xu wrote: > On Fri, Jun 25, 2004 at 10:12:31AM -0700, David S. Miller wrote: > > > > I now think it's trying to account for the udpdata32[] header area. > > But that's not 2 bytes, it's (2 * sizeof(u32)) or 8 bytes. > > That's what I thought too, but that is already accounted by > x->props.header_len in init_state. > > In any case, just increasing alen like that is wrong. It needs to > do at least three other things: > > 1. Allocate memory for it in skb_cow_data. > 2. Fill in those bytes with data so we don't leak information. > 3. Teach get_max_size about it. > > Andreas, can you please clarify for us as to what those two bytes > are for? I think I'm not the right person to address this question to .Did you mean to ask Dave? I'm also missing the context here I'm afraid; is there an archive of the whole thread somewhere? Cheers, -- Andreas Gruenbacher <agruen@suse.de> SUSE Labs, SUSE LINUX AG ^ permalink raw reply [flat|nested] 10+ messages in thread
* Re: [NAT-T] NON-IKE encapsulation 2004-06-25 22:13 ` Andreas Gruenbacher @ 2004-06-25 22:12 ` David S. Miller 0 siblings, 0 replies; 10+ messages in thread From: David S. Miller @ 2004-06-25 22:12 UTC (permalink / raw) To: Andreas Gruenbacher; +Cc: herbert, netdev On Sat, 26 Jun 2004 00:13:42 +0200 Andreas Gruenbacher <agruen@suse.de> wrote: > I think I'm not the right person to address this question to .Did you > mean to ask Dave? I'm also missing the context here I'm afraid; is there > an archive of the whole thread somewhere? Andreas, it was your non-IKE encapsulation patch from the SUSE kernel tree that I integrated into the 2.5.x sources long ago. That is why we are asking you, the code came from you :-) ^ permalink raw reply [flat|nested] 10+ messages in thread
* Re: [NAT-T] NON-IKE encapsulation 2004-06-25 21:57 ` Herbert Xu 2004-06-25 22:09 ` David S. Miller 2004-06-25 22:13 ` Andreas Gruenbacher @ 2004-06-25 23:30 ` Andreas Gruenbacher 2004-06-26 0:47 ` Herbert Xu 2 siblings, 1 reply; 10+ messages in thread From: Andreas Gruenbacher @ 2004-06-25 23:30 UTC (permalink / raw) To: Herbert Xu; +Cc: David S. Miller, netdev [-- Attachment #1: Type: text/plain, Size: 1226 bytes --] Hello, On Fri, 2004-06-25 at 23:57, Herbert Xu wrote: > On Fri, Jun 25, 2004 at 10:12:31AM -0700, David S. Miller wrote: > > > > I now think it's trying to account for the udpdata32[] header area. > > But that's not 2 bytes, it's (2 * sizeof(u32)) or 8 bytes. > > That's what I thought too, but that is already accounted by > x->props.header_len in init_state. > > In any case, just increasing alen like that is wrong. It needs to > do at least three other things: > > 1. Allocate memory for it in skb_cow_data. > 2. Fill in those bytes with data so we don't leak information. > 3. Teach get_max_size about it. > > Andreas, can you please clarify for us as to what those two bytes > are for? Your analyses are entirely correct. The two instances of ``alen += 2'' are indeed complete nonsense. The extra 8 bytes required are already accounted for in header_len; nothing other than the two zero-filled words is required for this encapsulation mode. Attached is a new version of the original patch, and a relative diff for reference. Thanks for reviewing and for reporting. (And sorry for the confusion; I'm a bit stressed out at the moment.) Cheers, -- Andreas Gruenbacher <agruen@suse.de> SUSE Labs, SUSE LINUX AG [-- Attachment #2: ipsec-nat-t-old --] [-- Type: text/plain, Size: 4169 bytes --] This adds support for the old NAT Traversal packet format described in draft-ietf-ipsec-udp-encaps-00/01. More recent Internet Drafts define an improved format, but some ipsec implementations still don't support that. Andreas Gruenbacher <agruen@suse.de>, SUSE Labs, 2004. Index: linux-2.6.5/net/ipv4/udp.c =================================================================== --- linux-2.6.5.orig/net/ipv4/udp.c +++ linux-2.6.5/net/ipv4/udp.c @@ -975,6 +975,7 @@ static int udp_encap_rcv(struct sock * s /* Must be an IKE packet.. pass it through */ return 1; + decaps: /* At this point we are sure that this is an ESPinUDP packet, * so we need to remove 'len' bytes from the packet (the UDP * header and optional ESP marker bytes) and then modify the @@ -1002,6 +1003,20 @@ static int udp_encap_rcv(struct sock * s /* and let the caller know to send this into the ESP processor... */ return -1; + case UDP_ENCAP_ESPINUDP_NON_IKE: + /* Check if this is a keepalive packet. If so, eat it. */ + if (len == 1 && udpdata[0] == 0xff) { + return 0; + } else if (len > 2 * sizeof(u32) + sizeof(struct ip_esp_hdr) && + udpdata32[0] == 0 && udpdata32[1] == 0) { + + /* ESP Packet with Non-IKE marker */ + len = sizeof(struct udphdr) + 2 * sizeof(u32); + goto decaps; + } else + /* Must be an IKE packet.. pass it through */ + return 1; + default: if (net_ratelimit()) printk(KERN_INFO "udp_encap_rcv(): Unhandled UDP encap type: %u\n", Index: linux-2.6.5/net/ipv4/esp4.c =================================================================== --- linux-2.6.5.orig/net/ipv4/esp4.c +++ linux-2.6.5/net/ipv4/esp4.c @@ -31,6 +31,7 @@ int esp_output(struct sk_buff *skb) struct esp_data *esp; struct sk_buff *trailer; struct udphdr *uh = NULL; + u32 *udpdata32; struct xfrm_encap_tmpl *encap = NULL; int blksize; int clen; @@ -97,6 +98,13 @@ int esp_output(struct sk_buff *skb) esph = (struct ip_esp_hdr*)(uh+1); top_iph->protocol = IPPROTO_UDP; break; + case UDP_ENCAP_ESPINUDP_NON_IKE: + uh = (struct udphdr*) esph; + udpdata32 = (u32*)(uh+1); + udpdata32[0] = udpdata32[1] = 0; + esph = (struct ip_esp_hdr*)(udpdata32+2); + top_iph->protocol = IPPROTO_UDP; + break; default: printk(KERN_INFO "esp_output(): Unhandled encap: %u\n", @@ -132,6 +140,13 @@ int esp_output(struct sk_buff *skb) esph = (struct ip_esp_hdr*)(uh+1); top_iph->protocol = IPPROTO_UDP; break; + case UDP_ENCAP_ESPINUDP_NON_IKE: + uh = (struct udphdr*) esph; + udpdata32 = (u32*)(uh+1); + udpdata32[0] = udpdata32[1] = 0; + esph = (struct ip_esp_hdr*)(udpdata32+2); + top_iph->protocol = IPPROTO_UDP; + break; default: printk(KERN_INFO "esp_output(): Unhandled encap: %u\n", @@ -294,6 +309,7 @@ int esp_input(struct xfrm_state *x, stru switch (decap->decap_type) { case UDP_ENCAP_ESPINUDP: + case UDP_ENCAP_ESPINUDP_NON_IKE: if ((void*)uh == (void*)esph) { printk(KERN_DEBUG @@ -354,6 +370,7 @@ int esp_post_input(struct xfrm_state *x, switch (encap->encap_type) { case UDP_ENCAP_ESPINUDP: + case UDP_ENCAP_ESPINUDP_NON_IKE: /* * 1) if the NAT-T peer's IP or port changed then * advertize the change to the keying daemon. @@ -534,6 +551,9 @@ int esp_init_state(struct xfrm_state *x, case UDP_ENCAP_ESPINUDP: x->props.header_len += sizeof(struct udphdr); break; + case UDP_ENCAP_ESPINUDP_NON_IKE: + x->props.header_len += sizeof(struct udphdr) + 2 * sizeof(u32); + break; default: printk (KERN_INFO "esp_init_state(): Unhandled encap type: %u\n", Index: linux-2.6.5/include/linux/udp.h =================================================================== --- linux-2.6.5.orig/include/linux/udp.h +++ linux-2.6.5/include/linux/udp.h @@ -31,6 +31,7 @@ struct udphdr { #define UDP_ENCAP 100 /* Set the socket to accept encapsulated packets */ /* UDP encapsulation types */ +#define UDP_ENCAP_ESPINUDP_NON_IKE 1 /* draft-ietf-ipsec-nat-t-ike-00/01 */ #define UDP_ENCAP_ESPINUDP 2 /* draft-ietf-ipsec-udp-encaps-06 */ #ifdef __KERNEL__ [-- Attachment #3: delta.diff --] [-- Type: text/x-patch, Size: 674 bytes --] Index: linux-2.6.5/net/ipv4/esp4.c =================================================================== --- linux-2.6.5.orig/net/ipv4/esp4.c +++ linux-2.6.5/net/ipv4/esp4.c @@ -103,7 +103,6 @@ int esp_output(struct sk_buff *skb) udpdata32 = (u32*)(uh+1); udpdata32[0] = udpdata32[1] = 0; esph = (struct ip_esp_hdr*)(udpdata32+2); - alen += 2; top_iph->protocol = IPPROTO_UDP; break; default: @@ -146,7 +145,6 @@ int esp_output(struct sk_buff *skb) udpdata32 = (u32*)(uh+1); udpdata32[0] = udpdata32[1] = 0; esph = (struct ip_esp_hdr*)(udpdata32+2); - alen += 2; top_iph->protocol = IPPROTO_UDP; break; default: ^ permalink raw reply [flat|nested] 10+ messages in thread
* Re: [NAT-T] NON-IKE encapsulation 2004-06-25 23:30 ` Andreas Gruenbacher @ 2004-06-26 0:47 ` Herbert Xu 0 siblings, 0 replies; 10+ messages in thread From: Herbert Xu @ 2004-06-26 0:47 UTC (permalink / raw) To: Andreas Gruenbacher; +Cc: David S. Miller, netdev On Sat, Jun 26, 2004 at 01:30:29AM +0200, Andreas Gruenbacher wrote: > > Attached is a new version of the original patch, and a relative diff for > reference. Thanks for reviewing and for reporting. (And sorry for the > confusion; I'm a bit stressed out at the moment.) Thank you for taking the time. Dave, I'll assume that this patch has been applied in my subsequent work that touches esp4.c. Cheers, -- Visit Openswan at http://www.openswan.org/ Email: Herbert Xu ~{PmV>HI~} <herbert@gondor.apana.org.au> Home Page: http://gondor.apana.org.au/~herbert/ PGP Key: http://gondor.apana.org.au/~herbert/pubkey.txt ^ permalink raw reply [flat|nested] 10+ messages in thread
end of thread, other threads:[~2004-06-26 0:47 UTC | newest] Thread overview: 10+ messages (download: mbox.gz follow: Atom feed -- links below jump to the message on this page -- 2004-06-24 12:36 [NAT-T] NON-IKE encapsulation Herbert Xu 2004-06-24 19:46 ` David S. Miller 2004-06-24 21:41 ` Herbert Xu 2004-06-25 17:12 ` David S. Miller 2004-06-25 21:57 ` Herbert Xu 2004-06-25 22:09 ` David S. Miller 2004-06-25 22:13 ` Andreas Gruenbacher 2004-06-25 22:12 ` David S. Miller 2004-06-25 23:30 ` Andreas Gruenbacher 2004-06-26 0:47 ` Herbert Xu
This is a public inbox, see mirroring instructions for how to clone and mirror all data and code used for this inbox; as well as URLs for NNTP newsgroup(s).