1/* 2 * net/key/af_key.c An implementation of PF_KEYv2 sockets. 3 * 4 * This program is free software; you can redistribute it and/or 5 * modify it under the terms of the GNU General Public License 6 * as published by the Free Software Foundation; either version 7 * 2 of the License, or (at your option) any later version. 8 * 9 * Authors: Maxim Giryaev <gem@asplinux.ru> 10 * David S. Miller <davem@redhat.com> 11 * Alexey Kuznetsov <kuznet@ms2.inr.ac.ru> 12 * Kunihiro Ishiguro <kunihiro@ipinfusion.com> 13 * Kazunori MIYAZAWA / USAGI Project <miyazawa@linux-ipv6.org> 14 * Derek Atkins <derek@ihtfp.com> 15 */ 16 17#include <linux/capability.h> 18#include <linux/module.h> 19#include <linux/kernel.h> 20#include <linux/socket.h> 21#include <linux/pfkeyv2.h> 22#include <linux/ipsec.h> 23#include <linux/skbuff.h> 24#include <linux/rtnetlink.h> 25#include <linux/in.h> 26#include <linux/in6.h> 27#include <linux/proc_fs.h> 28#include <linux/init.h> 29#include <linux/slab.h> 30#include <net/net_namespace.h> 31#include <net/netns/generic.h> 32#include <net/xfrm.h> 33 34#include <net/sock.h> 35 36#define _X2KEY(x) ((x) == XFRM_INF ? 0 : (x)) 37#define _KEY2X(x) ((x) == 0 ? XFRM_INF : (x)) 38 39static int pfkey_net_id __read_mostly; 40struct netns_pfkey { 41 /* List of all pfkey sockets. */ 42 struct hlist_head table; 43 atomic_t socks_nr; 44}; 45static DEFINE_MUTEX(pfkey_mutex); 46 47#define DUMMY_MARK 0 48static const struct xfrm_mark dummy_mark = {0, 0}; 49struct pfkey_sock { 50 /* struct sock must be the first member of struct pfkey_sock */ 51 struct sock sk; 52 int registered; 53 int promisc; 54 55 struct { 56 uint8_t msg_version; 57 uint32_t msg_portid; 58 int (*dump)(struct pfkey_sock *sk); 59 void (*done)(struct pfkey_sock *sk); 60 union { 61 struct xfrm_policy_walk policy; 62 struct xfrm_state_walk state; 63 } u; 64 struct sk_buff *skb; 65 } dump; 66}; 67 68static inline struct pfkey_sock *pfkey_sk(struct sock *sk) 69{ 70 return (struct pfkey_sock *)sk; 71} 72 73static int pfkey_can_dump(const struct sock *sk) 74{ 75 if (3 * atomic_read(&sk->sk_rmem_alloc) <= 2 * sk->sk_rcvbuf) 76 return 1; 77 return 0; 78} 79 80static void pfkey_terminate_dump(struct pfkey_sock *pfk) 81{ 82 if (pfk->dump.dump) { 83 if (pfk->dump.skb) { 84 kfree_skb(pfk->dump.skb); 85 pfk->dump.skb = NULL; 86 } 87 pfk->dump.done(pfk); 88 pfk->dump.dump = NULL; 89 pfk->dump.done = NULL; 90 } 91} 92 93static void pfkey_sock_destruct(struct sock *sk) 94{ 95 struct net *net = sock_net(sk); 96 struct netns_pfkey *net_pfkey = net_generic(net, pfkey_net_id); 97 98 pfkey_terminate_dump(pfkey_sk(sk)); 99 skb_queue_purge(&sk->sk_receive_queue); 100 101 if (!sock_flag(sk, SOCK_DEAD)) { 102 pr_err("Attempt to release alive pfkey socket: %p\n", sk); 103 return; 104 } 105 106 WARN_ON(atomic_read(&sk->sk_rmem_alloc)); 107 WARN_ON(atomic_read(&sk->sk_wmem_alloc)); 108 109 atomic_dec(&net_pfkey->socks_nr); 110} 111 112static const struct proto_ops pfkey_ops; 113 114static void pfkey_insert(struct sock *sk) 115{ 116 struct net *net = sock_net(sk); 117 struct netns_pfkey *net_pfkey = net_generic(net, pfkey_net_id); 118 119 mutex_lock(&pfkey_mutex); 120 sk_add_node_rcu(sk, &net_pfkey->table); 121 mutex_unlock(&pfkey_mutex); 122} 123 124static void pfkey_remove(struct sock *sk) 125{ 126 mutex_lock(&pfkey_mutex); 127 sk_del_node_init_rcu(sk); 128 mutex_unlock(&pfkey_mutex); 129} 130 131static struct proto key_proto = { 132 .name = "KEY", 133 .owner = THIS_MODULE, 134 .obj_size = sizeof(struct pfkey_sock), 135}; 136 137static int pfkey_create(struct net *net, struct socket *sock, int protocol, 138 int kern) 139{ 140 struct netns_pfkey *net_pfkey = net_generic(net, pfkey_net_id); 141 struct sock *sk; 142 int err; 143 144 if (!ns_capable(net->user_ns, CAP_NET_ADMIN)) 145 return -EPERM; 146 if (sock->type != SOCK_RAW) 147 return -ESOCKTNOSUPPORT; 148 if (protocol != PF_KEY_V2) 149 return -EPROTONOSUPPORT; 150 151 err = -ENOMEM; 152 sk = sk_alloc(net, PF_KEY, GFP_KERNEL, &key_proto, kern); 153 if (sk == NULL) 154 goto out; 155 156 sock->ops = &pfkey_ops; 157 sock_init_data(sock, sk); 158 159 sk->sk_family = PF_KEY; 160 sk->sk_destruct = pfkey_sock_destruct; 161 162 atomic_inc(&net_pfkey->socks_nr); 163 164 pfkey_insert(sk); 165 166 return 0; 167out: 168 return err; 169} 170 171static int pfkey_release(struct socket *sock) 172{ 173 struct sock *sk = sock->sk; 174 175 if (!sk) 176 return 0; 177 178 pfkey_remove(sk); 179 180 sock_orphan(sk); 181 sock->sk = NULL; 182 skb_queue_purge(&sk->sk_write_queue); 183 184 synchronize_rcu(); 185 sock_put(sk); 186 187 return 0; 188} 189 190static int pfkey_broadcast_one(struct sk_buff *skb, struct sk_buff **skb2, 191 gfp_t allocation, struct sock *sk) 192{ 193 int err = -ENOBUFS; 194 195 sock_hold(sk); 196 if (*skb2 == NULL) { 197 if (atomic_read(&skb->users) != 1) { 198 *skb2 = skb_clone(skb, allocation); 199 } else { 200 *skb2 = skb; 201 atomic_inc(&skb->users); 202 } 203 } 204 if (*skb2 != NULL) { 205 if (atomic_read(&sk->sk_rmem_alloc) <= sk->sk_rcvbuf) { 206 skb_set_owner_r(*skb2, sk); 207 skb_queue_tail(&sk->sk_receive_queue, *skb2); 208 sk->sk_data_ready(sk); 209 *skb2 = NULL; 210 err = 0; 211 } 212 } 213 sock_put(sk); 214 return err; 215} 216 217/* Send SKB to all pfkey sockets matching selected criteria. */ 218#define BROADCAST_ALL 0 219#define BROADCAST_ONE 1 220#define BROADCAST_REGISTERED 2 221#define BROADCAST_PROMISC_ONLY 4 222static int pfkey_broadcast(struct sk_buff *skb, 223 int broadcast_flags, struct sock *one_sk, 224 struct net *net) 225{ 226 struct netns_pfkey *net_pfkey = net_generic(net, pfkey_net_id); 227 struct sock *sk; 228 struct sk_buff *skb2 = NULL; 229 int err = -ESRCH; 230 231 /* XXX Do we need something like netlink_overrun? I think 232 * XXX PF_KEY socket apps will not mind current behavior. 233 */ 234 if (!skb) 235 return -ENOMEM; 236 237 rcu_read_lock(); 238 sk_for_each_rcu(sk, &net_pfkey->table) { 239 struct pfkey_sock *pfk = pfkey_sk(sk); 240 int err2; 241 242 /* Yes, it means that if you are meant to receive this 243 * pfkey message you receive it twice as promiscuous 244 * socket. 245 */ 246 if (pfk->promisc) 247 pfkey_broadcast_one(skb, &skb2, GFP_ATOMIC, sk); 248 249 /* the exact target will be processed later */ 250 if (sk == one_sk) 251 continue; 252 if (broadcast_flags != BROADCAST_ALL) { 253 if (broadcast_flags & BROADCAST_PROMISC_ONLY) 254 continue; 255 if ((broadcast_flags & BROADCAST_REGISTERED) && 256 !pfk->registered) 257 continue; 258 if (broadcast_flags & BROADCAST_ONE) 259 continue; 260 } 261 262 err2 = pfkey_broadcast_one(skb, &skb2, GFP_ATOMIC, sk); 263 264 /* Error is cleared after successful sending to at least one 265 * registered KM */ 266 if ((broadcast_flags & BROADCAST_REGISTERED) && err) 267 err = err2; 268 } 269 rcu_read_unlock(); 270 271 if (one_sk != NULL) 272 err = pfkey_broadcast_one(skb, &skb2, GFP_KERNEL, one_sk); 273 274 kfree_skb(skb2); 275 kfree_skb(skb); 276 return err; 277} 278 279static int pfkey_do_dump(struct pfkey_sock *pfk) 280{ 281 struct sadb_msg *hdr; 282 int rc; 283 284 rc = pfk->dump.dump(pfk); 285 if (rc == -ENOBUFS) 286 return 0; 287 288 if (pfk->dump.skb) { 289 if (!pfkey_can_dump(&pfk->sk)) 290 return 0; 291 292 hdr = (struct sadb_msg *) pfk->dump.skb->data; 293 hdr->sadb_msg_seq = 0; 294 hdr->sadb_msg_errno = rc; 295 pfkey_broadcast(pfk->dump.skb, BROADCAST_ONE, 296 &pfk->sk, sock_net(&pfk->sk)); 297 pfk->dump.skb = NULL; 298 } 299 300 pfkey_terminate_dump(pfk); 301 return rc; 302} 303 304static inline void pfkey_hdr_dup(struct sadb_msg *new, 305 const struct sadb_msg *orig) 306{ 307 *new = *orig; 308} 309 310static int pfkey_error(const struct sadb_msg *orig, int err, struct sock *sk) 311{ 312 struct sk_buff *skb = alloc_skb(sizeof(struct sadb_msg) + 16, GFP_KERNEL); 313 struct sadb_msg *hdr; 314 315 if (!skb) 316 return -ENOBUFS; 317 318 /* Woe be to the platform trying to support PFKEY yet 319 * having normal errnos outside the 1-255 range, inclusive. 320 */ 321 err = -err; 322 if (err == ERESTARTSYS || 323 err == ERESTARTNOHAND || 324 err == ERESTARTNOINTR) 325 err = EINTR; 326 if (err >= 512) 327 err = EINVAL; 328 BUG_ON(err <= 0 || err >= 256); 329 330 hdr = (struct sadb_msg *) skb_put(skb, sizeof(struct sadb_msg)); 331 pfkey_hdr_dup(hdr, orig); 332 hdr->sadb_msg_errno = (uint8_t) err; 333 hdr->sadb_msg_len = (sizeof(struct sadb_msg) / 334 sizeof(uint64_t)); 335 336 pfkey_broadcast(skb, BROADCAST_ONE, sk, sock_net(sk)); 337 338 return 0; 339} 340 341static const u8 sadb_ext_min_len[] = { 342 [SADB_EXT_RESERVED] = (u8) 0, 343 [SADB_EXT_SA] = (u8) sizeof(struct sadb_sa), 344 [SADB_EXT_LIFETIME_CURRENT] = (u8) sizeof(struct sadb_lifetime), 345 [SADB_EXT_LIFETIME_HARD] = (u8) sizeof(struct sadb_lifetime), 346 [SADB_EXT_LIFETIME_SOFT] = (u8) sizeof(struct sadb_lifetime), 347 [SADB_EXT_ADDRESS_SRC] = (u8) sizeof(struct sadb_address), 348 [SADB_EXT_ADDRESS_DST] = (u8) sizeof(struct sadb_address), 349 [SADB_EXT_ADDRESS_PROXY] = (u8) sizeof(struct sadb_address), 350 [SADB_EXT_KEY_AUTH] = (u8) sizeof(struct sadb_key), 351 [SADB_EXT_KEY_ENCRYPT] = (u8) sizeof(struct sadb_key), 352 [SADB_EXT_IDENTITY_SRC] = (u8) sizeof(struct sadb_ident), 353 [SADB_EXT_IDENTITY_DST] = (u8) sizeof(struct sadb_ident), 354 [SADB_EXT_SENSITIVITY] = (u8) sizeof(struct sadb_sens), 355 [SADB_EXT_PROPOSAL] = (u8) sizeof(struct sadb_prop), 356 [SADB_EXT_SUPPORTED_AUTH] = (u8) sizeof(struct sadb_supported), 357 [SADB_EXT_SUPPORTED_ENCRYPT] = (u8) sizeof(struct sadb_supported), 358 [SADB_EXT_SPIRANGE] = (u8) sizeof(struct sadb_spirange), 359 [SADB_X_EXT_KMPRIVATE] = (u8) sizeof(struct sadb_x_kmprivate), 360 [SADB_X_EXT_POLICY] = (u8) sizeof(struct sadb_x_policy), 361 [SADB_X_EXT_SA2] = (u8) sizeof(struct sadb_x_sa2), 362 [SADB_X_EXT_NAT_T_TYPE] = (u8) sizeof(struct sadb_x_nat_t_type), 363 [SADB_X_EXT_NAT_T_SPORT] = (u8) sizeof(struct sadb_x_nat_t_port), 364 [SADB_X_EXT_NAT_T_DPORT] = (u8) sizeof(struct sadb_x_nat_t_port), 365 [SADB_X_EXT_NAT_T_OA] = (u8) sizeof(struct sadb_address), 366 [SADB_X_EXT_SEC_CTX] = (u8) sizeof(struct sadb_x_sec_ctx), 367 [SADB_X_EXT_KMADDRESS] = (u8) sizeof(struct sadb_x_kmaddress), 368 [SADB_X_EXT_FILTER] = (u8) sizeof(struct sadb_x_filter), 369}; 370 371/* Verify sadb_address_{len,prefixlen} against sa_family. */ 372static int verify_address_len(const void *p) 373{ 374 const struct sadb_address *sp = p; 375 const struct sockaddr *addr = (const struct sockaddr *)(sp + 1); 376 const struct sockaddr_in *sin; 377#if IS_ENABLED(CONFIG_IPV6) 378 const struct sockaddr_in6 *sin6; 379#endif 380 int len; 381 382 switch (addr->sa_family) { 383 case AF_INET: 384 len = DIV_ROUND_UP(sizeof(*sp) + sizeof(*sin), sizeof(uint64_t)); 385 if (sp->sadb_address_len != len || 386 sp->sadb_address_prefixlen > 32) 387 return -EINVAL; 388 break; 389#if IS_ENABLED(CONFIG_IPV6) 390 case AF_INET6: 391 len = DIV_ROUND_UP(sizeof(*sp) + sizeof(*sin6), sizeof(uint64_t)); 392 if (sp->sadb_address_len != len || 393 sp->sadb_address_prefixlen > 128) 394 return -EINVAL; 395 break; 396#endif 397 default: 398 /* It is user using kernel to keep track of security 399 * associations for another protocol, such as 400 * OSPF/RSVP/RIPV2/MIP. It is user's job to verify 401 * lengths. 402 * 403 * XXX Actually, association/policy database is not yet 404 * XXX able to cope with arbitrary sockaddr families. 405 * XXX When it can, remove this -EINVAL. -DaveM 406 */ 407 return -EINVAL; 408 } 409 410 return 0; 411} 412 413static inline int pfkey_sec_ctx_len(const struct sadb_x_sec_ctx *sec_ctx) 414{ 415 return DIV_ROUND_UP(sizeof(struct sadb_x_sec_ctx) + 416 sec_ctx->sadb_x_ctx_len, 417 sizeof(uint64_t)); 418} 419 420static inline int verify_sec_ctx_len(const void *p) 421{ 422 const struct sadb_x_sec_ctx *sec_ctx = p; 423 int len = sec_ctx->sadb_x_ctx_len; 424 425 if (len > PAGE_SIZE) 426 return -EINVAL; 427 428 len = pfkey_sec_ctx_len(sec_ctx); 429 430 if (sec_ctx->sadb_x_sec_len != len) 431 return -EINVAL; 432 433 return 0; 434} 435 436static inline struct xfrm_user_sec_ctx *pfkey_sadb2xfrm_user_sec_ctx(const struct sadb_x_sec_ctx *sec_ctx, 437 gfp_t gfp) 438{ 439 struct xfrm_user_sec_ctx *uctx = NULL; 440 int ctx_size = sec_ctx->sadb_x_ctx_len; 441 442 uctx = kmalloc((sizeof(*uctx)+ctx_size), gfp); 443 444 if (!uctx) 445 return NULL; 446 447 uctx->len = pfkey_sec_ctx_len(sec_ctx); 448 uctx->exttype = sec_ctx->sadb_x_sec_exttype; 449 uctx->ctx_doi = sec_ctx->sadb_x_ctx_doi; 450 uctx->ctx_alg = sec_ctx->sadb_x_ctx_alg; 451 uctx->ctx_len = sec_ctx->sadb_x_ctx_len; 452 memcpy(uctx + 1, sec_ctx + 1, 453 uctx->ctx_len); 454 455 return uctx; 456} 457 458static int present_and_same_family(const struct sadb_address *src, 459 const struct sadb_address *dst) 460{ 461 const struct sockaddr *s_addr, *d_addr; 462 463 if (!src || !dst) 464 return 0; 465 466 s_addr = (const struct sockaddr *)(src + 1); 467 d_addr = (const struct sockaddr *)(dst + 1); 468 if (s_addr->sa_family != d_addr->sa_family) 469 return 0; 470 if (s_addr->sa_family != AF_INET 471#if IS_ENABLED(CONFIG_IPV6) 472 && s_addr->sa_family != AF_INET6 473#endif 474 ) 475 return 0; 476 477 return 1; 478} 479 480static int parse_exthdrs(struct sk_buff *skb, const struct sadb_msg *hdr, void **ext_hdrs) 481{ 482 const char *p = (char *) hdr; 483 int len = skb->len; 484 485 len -= sizeof(*hdr); 486 p += sizeof(*hdr); 487 while (len > 0) { 488 const struct sadb_ext *ehdr = (const struct sadb_ext *) p; 489 uint16_t ext_type; 490 int ext_len; 491 492 ext_len = ehdr->sadb_ext_len; 493 ext_len *= sizeof(uint64_t); 494 ext_type = ehdr->sadb_ext_type; 495 if (ext_len < sizeof(uint64_t) || 496 ext_len > len || 497 ext_type == SADB_EXT_RESERVED) 498 return -EINVAL; 499 500 if (ext_type <= SADB_EXT_MAX) { 501 int min = (int) sadb_ext_min_len[ext_type]; 502 if (ext_len < min) 503 return -EINVAL; 504 if (ext_hdrs[ext_type-1] != NULL) 505 return -EINVAL; 506 if (ext_type == SADB_EXT_ADDRESS_SRC || 507 ext_type == SADB_EXT_ADDRESS_DST || 508 ext_type == SADB_EXT_ADDRESS_PROXY || 509 ext_type == SADB_X_EXT_NAT_T_OA) { 510 if (verify_address_len(p)) 511 return -EINVAL; 512 } 513 if (ext_type == SADB_X_EXT_SEC_CTX) { 514 if (verify_sec_ctx_len(p)) 515 return -EINVAL; 516 } 517 ext_hdrs[ext_type-1] = (void *) p; 518 } 519 p += ext_len; 520 len -= ext_len; 521 } 522 523 return 0; 524} 525 526static uint16_t 527pfkey_satype2proto(uint8_t satype) 528{ 529 switch (satype) { 530 case SADB_SATYPE_UNSPEC: 531 return IPSEC_PROTO_ANY; 532 case SADB_SATYPE_AH: 533 return IPPROTO_AH; 534 case SADB_SATYPE_ESP: 535 return IPPROTO_ESP; 536 case SADB_X_SATYPE_IPCOMP: 537 return IPPROTO_COMP; 538 default: 539 return 0; 540 } 541 /* NOTREACHED */ 542} 543 544static uint8_t 545pfkey_proto2satype(uint16_t proto) 546{ 547 switch (proto) { 548 case IPPROTO_AH: 549 return SADB_SATYPE_AH; 550 case IPPROTO_ESP: 551 return SADB_SATYPE_ESP; 552 case IPPROTO_COMP: 553 return SADB_X_SATYPE_IPCOMP; 554 default: 555 return 0; 556 } 557 /* NOTREACHED */ 558} 559 560/* BTW, this scheme means that there is no way with PFKEY2 sockets to 561 * say specifically 'just raw sockets' as we encode them as 255. 562 */ 563 564static uint8_t pfkey_proto_to_xfrm(uint8_t proto) 565{ 566 return proto == IPSEC_PROTO_ANY ? 0 : proto; 567} 568 569static uint8_t pfkey_proto_from_xfrm(uint8_t proto) 570{ 571 return proto ? proto : IPSEC_PROTO_ANY; 572} 573 574static inline int pfkey_sockaddr_len(sa_family_t family) 575{ 576 switch (family) { 577 case AF_INET: 578 return sizeof(struct sockaddr_in); 579#if IS_ENABLED(CONFIG_IPV6) 580 case AF_INET6: 581 return sizeof(struct sockaddr_in6); 582#endif 583 } 584 return 0; 585} 586 587static 588int pfkey_sockaddr_extract(const struct sockaddr *sa, xfrm_address_t *xaddr) 589{ 590 switch (sa->sa_family) { 591 case AF_INET: 592 xaddr->a4 = 593 ((struct sockaddr_in *)sa)->sin_addr.s_addr; 594 return AF_INET; 595#if IS_ENABLED(CONFIG_IPV6) 596 case AF_INET6: 597 memcpy(xaddr->a6, 598 &((struct sockaddr_in6 *)sa)->sin6_addr, 599 sizeof(struct in6_addr)); 600 return AF_INET6; 601#endif 602 } 603 return 0; 604} 605 606static 607int pfkey_sadb_addr2xfrm_addr(const struct sadb_address *addr, xfrm_address_t *xaddr) 608{ 609 return pfkey_sockaddr_extract((struct sockaddr *)(addr + 1), 610 xaddr); 611} 612 613static struct xfrm_state *pfkey_xfrm_state_lookup(struct net *net, const struct sadb_msg *hdr, void * const *ext_hdrs) 614{ 615 const struct sadb_sa *sa; 616 const struct sadb_address *addr; 617 uint16_t proto; 618 unsigned short family; 619 xfrm_address_t *xaddr; 620 621 sa = ext_hdrs[SADB_EXT_SA - 1]; 622 if (sa == NULL) 623 return NULL; 624 625 proto = pfkey_satype2proto(hdr->sadb_msg_satype); 626 if (proto == 0) 627 return NULL; 628 629 /* sadb_address_len should be checked by caller */ 630 addr = ext_hdrs[SADB_EXT_ADDRESS_DST - 1]; 631 if (addr == NULL) 632 return NULL; 633 634 family = ((const struct sockaddr *)(addr + 1))->sa_family; 635 switch (family) { 636 case AF_INET: 637 xaddr = (xfrm_address_t *)&((const struct sockaddr_in *)(addr + 1))->sin_addr; 638 break; 639#if IS_ENABLED(CONFIG_IPV6) 640 case AF_INET6: 641 xaddr = (xfrm_address_t *)&((const struct sockaddr_in6 *)(addr + 1))->sin6_addr; 642 break; 643#endif 644 default: 645 xaddr = NULL; 646 } 647 648 if (!xaddr) 649 return NULL; 650 651 return xfrm_state_lookup(net, DUMMY_MARK, xaddr, sa->sadb_sa_spi, proto, family); 652} 653 654#define PFKEY_ALIGN8(a) (1 + (((a) - 1) | (8 - 1))) 655 656static int 657pfkey_sockaddr_size(sa_family_t family) 658{ 659 return PFKEY_ALIGN8(pfkey_sockaddr_len(family)); 660} 661 662static inline int pfkey_mode_from_xfrm(int mode) 663{ 664 switch(mode) { 665 case XFRM_MODE_TRANSPORT: 666 return IPSEC_MODE_TRANSPORT; 667 case XFRM_MODE_TUNNEL: 668 return IPSEC_MODE_TUNNEL; 669 case XFRM_MODE_BEET: 670 return IPSEC_MODE_BEET; 671 default: 672 return -1; 673 } 674} 675 676static inline int pfkey_mode_to_xfrm(int mode) 677{ 678 switch(mode) { 679 case IPSEC_MODE_ANY: /*XXX*/ 680 case IPSEC_MODE_TRANSPORT: 681 return XFRM_MODE_TRANSPORT; 682 case IPSEC_MODE_TUNNEL: 683 return XFRM_MODE_TUNNEL; 684 case IPSEC_MODE_BEET: 685 return XFRM_MODE_BEET; 686 default: 687 return -1; 688 } 689} 690 691static unsigned int pfkey_sockaddr_fill(const xfrm_address_t *xaddr, __be16 port, 692 struct sockaddr *sa, 693 unsigned short family) 694{ 695 switch (family) { 696 case AF_INET: 697 { 698 struct sockaddr_in *sin = (struct sockaddr_in *)sa; 699 sin->sin_family = AF_INET; 700 sin->sin_port = port; 701 sin->sin_addr.s_addr = xaddr->a4; 702 memset(sin->sin_zero, 0, sizeof(sin->sin_zero)); 703 return 32; 704 } 705#if IS_ENABLED(CONFIG_IPV6) 706 case AF_INET6: 707 { 708 struct sockaddr_in6 *sin6 = (struct sockaddr_in6 *)sa; 709 sin6->sin6_family = AF_INET6; 710 sin6->sin6_port = port; 711 sin6->sin6_flowinfo = 0; 712 sin6->sin6_addr = xaddr->in6; 713 sin6->sin6_scope_id = 0; 714 return 128; 715 } 716#endif 717 } 718 return 0; 719} 720 721static struct sk_buff *__pfkey_xfrm_state2msg(const struct xfrm_state *x, 722 int add_keys, int hsc) 723{ 724 struct sk_buff *skb; 725 struct sadb_msg *hdr; 726 struct sadb_sa *sa; 727 struct sadb_lifetime *lifetime; 728 struct sadb_address *addr; 729 struct sadb_key *key; 730 struct sadb_x_sa2 *sa2; 731 struct sadb_x_sec_ctx *sec_ctx; 732 struct xfrm_sec_ctx *xfrm_ctx; 733 int ctx_size = 0; 734 int size; 735 int auth_key_size = 0; 736 int encrypt_key_size = 0; 737 int sockaddr_size; 738 struct xfrm_encap_tmpl *natt = NULL; 739 int mode; 740 741 /* address family check */ 742 sockaddr_size = pfkey_sockaddr_size(x->props.family); 743 if (!sockaddr_size) 744 return ERR_PTR(-EINVAL); 745 746 /* base, SA, (lifetime (HSC),) address(SD), (address(P),) 747 key(AE), (identity(SD),) (sensitivity)> */ 748 size = sizeof(struct sadb_msg) +sizeof(struct sadb_sa) + 749 sizeof(struct sadb_lifetime) + 750 ((hsc & 1) ? sizeof(struct sadb_lifetime) : 0) + 751 ((hsc & 2) ? sizeof(struct sadb_lifetime) : 0) + 752 sizeof(struct sadb_address)*2 + 753 sockaddr_size*2 + 754 sizeof(struct sadb_x_sa2); 755 756 if ((xfrm_ctx = x->security)) { 757 ctx_size = PFKEY_ALIGN8(xfrm_ctx->ctx_len); 758 size += sizeof(struct sadb_x_sec_ctx) + ctx_size; 759 } 760 761 /* identity & sensitivity */ 762 if (!xfrm_addr_equal(&x->sel.saddr, &x->props.saddr, x->props.family)) 763 size += sizeof(struct sadb_address) + sockaddr_size; 764 765 if (add_keys) { 766 if (x->aalg && x->aalg->alg_key_len) { 767 auth_key_size = 768 PFKEY_ALIGN8((x->aalg->alg_key_len + 7) / 8); 769 size += sizeof(struct sadb_key) + auth_key_size; 770 } 771 if (x->ealg && x->ealg->alg_key_len) { 772 encrypt_key_size = 773 PFKEY_ALIGN8((x->ealg->alg_key_len+7) / 8); 774 size += sizeof(struct sadb_key) + encrypt_key_size; 775 } 776 } 777 if (x->encap) 778 natt = x->encap; 779 780 if (natt && natt->encap_type) { 781 size += sizeof(struct sadb_x_nat_t_type); 782 size += sizeof(struct sadb_x_nat_t_port); 783 size += sizeof(struct sadb_x_nat_t_port); 784 } 785 786 skb = alloc_skb(size + 16, GFP_ATOMIC); 787 if (skb == NULL) 788 return ERR_PTR(-ENOBUFS); 789 790 /* call should fill header later */ 791 hdr = (struct sadb_msg *) skb_put(skb, sizeof(struct sadb_msg)); 792 memset(hdr, 0, size); /* XXX do we need this ? */ 793 hdr->sadb_msg_len = size / sizeof(uint64_t); 794 795 /* sa */ 796 sa = (struct sadb_sa *) skb_put(skb, sizeof(struct sadb_sa)); 797 sa->sadb_sa_len = sizeof(struct sadb_sa)/sizeof(uint64_t); 798 sa->sadb_sa_exttype = SADB_EXT_SA; 799 sa->sadb_sa_spi = x->id.spi; 800 sa->sadb_sa_replay = x->props.replay_window; 801 switch (x->km.state) { 802 case XFRM_STATE_VALID: 803 sa->sadb_sa_state = x->km.dying ? 804 SADB_SASTATE_DYING : SADB_SASTATE_MATURE; 805 break; 806 case XFRM_STATE_ACQ: 807 sa->sadb_sa_state = SADB_SASTATE_LARVAL; 808 break; 809 default: 810 sa->sadb_sa_state = SADB_SASTATE_DEAD; 811 break; 812 } 813 sa->sadb_sa_auth = 0; 814 if (x->aalg) { 815 struct xfrm_algo_desc *a = xfrm_aalg_get_byname(x->aalg->alg_name, 0); 816 sa->sadb_sa_auth = (a && a->pfkey_supported) ? 817 a->desc.sadb_alg_id : 0; 818 } 819 sa->sadb_sa_encrypt = 0; 820 BUG_ON(x->ealg && x->calg); 821 if (x->ealg) { 822 struct xfrm_algo_desc *a = xfrm_ealg_get_byname(x->ealg->alg_name, 0); 823 sa->sadb_sa_encrypt = (a && a->pfkey_supported) ? 824 a->desc.sadb_alg_id : 0; 825 } 826 /* KAME compatible: sadb_sa_encrypt is overloaded with calg id */ 827 if (x->calg) { 828 struct xfrm_algo_desc *a = xfrm_calg_get_byname(x->calg->alg_name, 0); 829 sa->sadb_sa_encrypt = (a && a->pfkey_supported) ? 830 a->desc.sadb_alg_id : 0; 831 } 832 833 sa->sadb_sa_flags = 0; 834 if (x->props.flags & XFRM_STATE_NOECN) 835 sa->sadb_sa_flags |= SADB_SAFLAGS_NOECN; 836 if (x->props.flags & XFRM_STATE_DECAP_DSCP) 837 sa->sadb_sa_flags |= SADB_SAFLAGS_DECAP_DSCP; 838 if (x->props.flags & XFRM_STATE_NOPMTUDISC) 839 sa->sadb_sa_flags |= SADB_SAFLAGS_NOPMTUDISC; 840 841 /* hard time */ 842 if (hsc & 2) { 843 lifetime = (struct sadb_lifetime *) skb_put(skb, 844 sizeof(struct sadb_lifetime)); 845 lifetime->sadb_lifetime_len = 846 sizeof(struct sadb_lifetime)/sizeof(uint64_t); 847 lifetime->sadb_lifetime_exttype = SADB_EXT_LIFETIME_HARD; 848 lifetime->sadb_lifetime_allocations = _X2KEY(x->lft.hard_packet_limit); 849 lifetime->sadb_lifetime_bytes = _X2KEY(x->lft.hard_byte_limit); 850 lifetime->sadb_lifetime_addtime = x->lft.hard_add_expires_seconds; 851 lifetime->sadb_lifetime_usetime = x->lft.hard_use_expires_seconds; 852 } 853 /* soft time */ 854 if (hsc & 1) { 855 lifetime = (struct sadb_lifetime *) skb_put(skb, 856 sizeof(struct sadb_lifetime)); 857 lifetime->sadb_lifetime_len = 858 sizeof(struct sadb_lifetime)/sizeof(uint64_t); 859 lifetime->sadb_lifetime_exttype = SADB_EXT_LIFETIME_SOFT; 860 lifetime->sadb_lifetime_allocations = _X2KEY(x->lft.soft_packet_limit); 861 lifetime->sadb_lifetime_bytes = _X2KEY(x->lft.soft_byte_limit); 862 lifetime->sadb_lifetime_addtime = x->lft.soft_add_expires_seconds; 863 lifetime->sadb_lifetime_usetime = x->lft.soft_use_expires_seconds; 864 } 865 /* current time */ 866 lifetime = (struct sadb_lifetime *) skb_put(skb, 867 sizeof(struct sadb_lifetime)); 868 lifetime->sadb_lifetime_len = 869 sizeof(struct sadb_lifetime)/sizeof(uint64_t); 870 lifetime->sadb_lifetime_exttype = SADB_EXT_LIFETIME_CURRENT; 871 lifetime->sadb_lifetime_allocations = x->curlft.packets; 872 lifetime->sadb_lifetime_bytes = x->curlft.bytes; 873 lifetime->sadb_lifetime_addtime = x->curlft.add_time; 874 lifetime->sadb_lifetime_usetime = x->curlft.use_time; 875 /* src address */ 876 addr = (struct sadb_address*) skb_put(skb, 877 sizeof(struct sadb_address)+sockaddr_size); 878 addr->sadb_address_len = 879 (sizeof(struct sadb_address)+sockaddr_size)/ 880 sizeof(uint64_t); 881 addr->sadb_address_exttype = SADB_EXT_ADDRESS_SRC; 882 /* "if the ports are non-zero, then the sadb_address_proto field, 883 normally zero, MUST be filled in with the transport 884 protocol's number." - RFC2367 */ 885 addr->sadb_address_proto = 0; 886 addr->sadb_address_reserved = 0; 887 888 addr->sadb_address_prefixlen = 889 pfkey_sockaddr_fill(&x->props.saddr, 0, 890 (struct sockaddr *) (addr + 1), 891 x->props.family); 892 if (!addr->sadb_address_prefixlen) 893 BUG(); 894 895 /* dst address */ 896 addr = (struct sadb_address*) skb_put(skb, 897 sizeof(struct sadb_address)+sockaddr_size); 898 addr->sadb_address_len = 899 (sizeof(struct sadb_address)+sockaddr_size)/ 900 sizeof(uint64_t); 901 addr->sadb_address_exttype = SADB_EXT_ADDRESS_DST; 902 addr->sadb_address_proto = 0; 903 addr->sadb_address_reserved = 0; 904 905 addr->sadb_address_prefixlen = 906 pfkey_sockaddr_fill(&x->id.daddr, 0, 907 (struct sockaddr *) (addr + 1), 908 x->props.family); 909 if (!addr->sadb_address_prefixlen) 910 BUG(); 911 912 if (!xfrm_addr_equal(&x->sel.saddr, &x->props.saddr, 913 x->props.family)) { 914 addr = (struct sadb_address*) skb_put(skb, 915 sizeof(struct sadb_address)+sockaddr_size); 916 addr->sadb_address_len = 917 (sizeof(struct sadb_address)+sockaddr_size)/ 918 sizeof(uint64_t); 919 addr->sadb_address_exttype = SADB_EXT_ADDRESS_PROXY; 920 addr->sadb_address_proto = 921 pfkey_proto_from_xfrm(x->sel.proto); 922 addr->sadb_address_prefixlen = x->sel.prefixlen_s; 923 addr->sadb_address_reserved = 0; 924 925 pfkey_sockaddr_fill(&x->sel.saddr, x->sel.sport, 926 (struct sockaddr *) (addr + 1), 927 x->props.family); 928 } 929 930 /* auth key */ 931 if (add_keys && auth_key_size) { 932 key = (struct sadb_key *) skb_put(skb, 933 sizeof(struct sadb_key)+auth_key_size); 934 key->sadb_key_len = (sizeof(struct sadb_key) + auth_key_size) / 935 sizeof(uint64_t); 936 key->sadb_key_exttype = SADB_EXT_KEY_AUTH; 937 key->sadb_key_bits = x->aalg->alg_key_len; 938 key->sadb_key_reserved = 0; 939 memcpy(key + 1, x->aalg->alg_key, (x->aalg->alg_key_len+7)/8); 940 } 941 /* encrypt key */ 942 if (add_keys && encrypt_key_size) { 943 key = (struct sadb_key *) skb_put(skb, 944 sizeof(struct sadb_key)+encrypt_key_size); 945 key->sadb_key_len = (sizeof(struct sadb_key) + 946 encrypt_key_size) / sizeof(uint64_t); 947 key->sadb_key_exttype = SADB_EXT_KEY_ENCRYPT; 948 key->sadb_key_bits = x->ealg->alg_key_len; 949 key->sadb_key_reserved = 0; 950 memcpy(key + 1, x->ealg->alg_key, 951 (x->ealg->alg_key_len+7)/8); 952 } 953 954 /* sa */ 955 sa2 = (struct sadb_x_sa2 *) skb_put(skb, sizeof(struct sadb_x_sa2)); 956 sa2->sadb_x_sa2_len = sizeof(struct sadb_x_sa2)/sizeof(uint64_t); 957 sa2->sadb_x_sa2_exttype = SADB_X_EXT_SA2; 958 if ((mode = pfkey_mode_from_xfrm(x->props.mode)) < 0) { 959 kfree_skb(skb); 960 return ERR_PTR(-EINVAL); 961 } 962 sa2->sadb_x_sa2_mode = mode; 963 sa2->sadb_x_sa2_reserved1 = 0; 964 sa2->sadb_x_sa2_reserved2 = 0; 965 sa2->sadb_x_sa2_sequence = 0; 966 sa2->sadb_x_sa2_reqid = x->props.reqid; 967 968 if (natt && natt->encap_type) { 969 struct sadb_x_nat_t_type *n_type; 970 struct sadb_x_nat_t_port *n_port; 971 972 /* type */ 973 n_type = (struct sadb_x_nat_t_type*) skb_put(skb, sizeof(*n_type)); 974 n_type->sadb_x_nat_t_type_len = sizeof(*n_type)/sizeof(uint64_t); 975 n_type->sadb_x_nat_t_type_exttype = SADB_X_EXT_NAT_T_TYPE; 976 n_type->sadb_x_nat_t_type_type = natt->encap_type; 977 n_type->sadb_x_nat_t_type_reserved[0] = 0; 978 n_type->sadb_x_nat_t_type_reserved[1] = 0; 979 n_type->sadb_x_nat_t_type_reserved[2] = 0; 980 981 /* source port */ 982 n_port = (struct sadb_x_nat_t_port*) skb_put(skb, sizeof (*n_port)); 983 n_port->sadb_x_nat_t_port_len = sizeof(*n_port)/sizeof(uint64_t); 984 n_port->sadb_x_nat_t_port_exttype = SADB_X_EXT_NAT_T_SPORT; 985 n_port->sadb_x_nat_t_port_port = natt->encap_sport; 986 n_port->sadb_x_nat_t_port_reserved = 0; 987 988 /* dest port */ 989 n_port = (struct sadb_x_nat_t_port*) skb_put(skb, sizeof (*n_port)); 990 n_port->sadb_x_nat_t_port_len = sizeof(*n_port)/sizeof(uint64_t); 991 n_port->sadb_x_nat_t_port_exttype = SADB_X_EXT_NAT_T_DPORT; 992 n_port->sadb_x_nat_t_port_port = natt->encap_dport; 993 n_port->sadb_x_nat_t_port_reserved = 0; 994 } 995 996 /* security context */ 997 if (xfrm_ctx) { 998 sec_ctx = (struct sadb_x_sec_ctx *) skb_put(skb, 999 sizeof(struct sadb_x_sec_ctx) + ctx_size); 1000 sec_ctx->sadb_x_sec_len = 1001 (sizeof(struct sadb_x_sec_ctx) + ctx_size) / sizeof(uint64_t); 1002 sec_ctx->sadb_x_sec_exttype = SADB_X_EXT_SEC_CTX; 1003 sec_ctx->sadb_x_ctx_doi = xfrm_ctx->ctx_doi; 1004 sec_ctx->sadb_x_ctx_alg = xfrm_ctx->ctx_alg; 1005 sec_ctx->sadb_x_ctx_len = xfrm_ctx->ctx_len; 1006 memcpy(sec_ctx + 1, xfrm_ctx->ctx_str, 1007 xfrm_ctx->ctx_len); 1008 } 1009 1010 return skb; 1011} 1012 1013 1014static inline struct sk_buff *pfkey_xfrm_state2msg(const struct xfrm_state *x) 1015{ 1016 struct sk_buff *skb; 1017 1018 skb = __pfkey_xfrm_state2msg(x, 1, 3); 1019 1020 return skb; 1021} 1022 1023static inline struct sk_buff *pfkey_xfrm_state2msg_expire(const struct xfrm_state *x, 1024 int hsc) 1025{ 1026 return __pfkey_xfrm_state2msg(x, 0, hsc); 1027} 1028 1029static struct xfrm_state * pfkey_msg2xfrm_state(struct net *net, 1030 const struct sadb_msg *hdr, 1031 void * const *ext_hdrs) 1032{ 1033 struct xfrm_state *x; 1034 const struct sadb_lifetime *lifetime; 1035 const struct sadb_sa *sa; 1036 const struct sadb_key *key; 1037 const struct sadb_x_sec_ctx *sec_ctx; 1038 uint16_t proto; 1039 int err; 1040 1041 1042 sa = ext_hdrs[SADB_EXT_SA - 1]; 1043 if (!sa || 1044 !present_and_same_family(ext_hdrs[SADB_EXT_ADDRESS_SRC-1], 1045 ext_hdrs[SADB_EXT_ADDRESS_DST-1])) 1046 return ERR_PTR(-EINVAL); 1047 if (hdr->sadb_msg_satype == SADB_SATYPE_ESP && 1048 !ext_hdrs[SADB_EXT_KEY_ENCRYPT-1]) 1049 return ERR_PTR(-EINVAL); 1050 if (hdr->sadb_msg_satype == SADB_SATYPE_AH && 1051 !ext_hdrs[SADB_EXT_KEY_AUTH-1]) 1052 return ERR_PTR(-EINVAL); 1053 if (!!ext_hdrs[SADB_EXT_LIFETIME_HARD-1] != 1054 !!ext_hdrs[SADB_EXT_LIFETIME_SOFT-1]) 1055 return ERR_PTR(-EINVAL); 1056 1057 proto = pfkey_satype2proto(hdr->sadb_msg_satype); 1058 if (proto == 0) 1059 return ERR_PTR(-EINVAL); 1060 1061 /* default error is no buffer space */ 1062 err = -ENOBUFS; 1063 1064 /* RFC2367: 1065 1066 Only SADB_SASTATE_MATURE SAs may be submitted in an SADB_ADD message. 1067 SADB_SASTATE_LARVAL SAs are created by SADB_GETSPI and it is not 1068 sensible to add a new SA in the DYING or SADB_SASTATE_DEAD state. 1069 Therefore, the sadb_sa_state field of all submitted SAs MUST be 1070 SADB_SASTATE_MATURE and the kernel MUST return an error if this is 1071 not true. 1072 1073 However, KAME setkey always uses SADB_SASTATE_LARVAL. 1074 Hence, we have to _ignore_ sadb_sa_state, which is also reasonable. 1075 */ 1076 if (sa->sadb_sa_auth > SADB_AALG_MAX || 1077 (hdr->sadb_msg_satype == SADB_X_SATYPE_IPCOMP && 1078 sa->sadb_sa_encrypt > SADB_X_CALG_MAX) || 1079 sa->sadb_sa_encrypt > SADB_EALG_MAX) 1080 return ERR_PTR(-EINVAL); 1081 key = ext_hdrs[SADB_EXT_KEY_AUTH - 1]; 1082 if (key != NULL && 1083 sa->sadb_sa_auth != SADB_X_AALG_NULL && 1084 ((key->sadb_key_bits+7) / 8 == 0 || 1085 (key->sadb_key_bits+7) / 8 > key->sadb_key_len * sizeof(uint64_t))) 1086 return ERR_PTR(-EINVAL); 1087 key = ext_hdrs[SADB_EXT_KEY_ENCRYPT-1]; 1088 if (key != NULL && 1089 sa->sadb_sa_encrypt != SADB_EALG_NULL && 1090 ((key->sadb_key_bits+7) / 8 == 0 || 1091 (key->sadb_key_bits+7) / 8 > key->sadb_key_len * sizeof(uint64_t))) 1092 return ERR_PTR(-EINVAL); 1093 1094 x = xfrm_state_alloc(net); 1095 if (x == NULL) 1096 return ERR_PTR(-ENOBUFS); 1097 1098 x->id.proto = proto; 1099 x->id.spi = sa->sadb_sa_spi; 1100 x->props.replay_window = min_t(unsigned int, sa->sadb_sa_replay, 1101 (sizeof(x->replay.bitmap) * 8)); 1102 if (sa->sadb_sa_flags & SADB_SAFLAGS_NOECN) 1103 x->props.flags |= XFRM_STATE_NOECN; 1104 if (sa->sadb_sa_flags & SADB_SAFLAGS_DECAP_DSCP) 1105 x->props.flags |= XFRM_STATE_DECAP_DSCP; 1106 if (sa->sadb_sa_flags & SADB_SAFLAGS_NOPMTUDISC) 1107 x->props.flags |= XFRM_STATE_NOPMTUDISC; 1108 1109 lifetime = ext_hdrs[SADB_EXT_LIFETIME_HARD - 1]; 1110 if (lifetime != NULL) { 1111 x->lft.hard_packet_limit = _KEY2X(lifetime->sadb_lifetime_allocations); 1112 x->lft.hard_byte_limit = _KEY2X(lifetime->sadb_lifetime_bytes); 1113 x->lft.hard_add_expires_seconds = lifetime->sadb_lifetime_addtime; 1114 x->lft.hard_use_expires_seconds = lifetime->sadb_lifetime_usetime; 1115 } 1116 lifetime = ext_hdrs[SADB_EXT_LIFETIME_SOFT - 1]; 1117 if (lifetime != NULL) { 1118 x->lft.soft_packet_limit = _KEY2X(lifetime->sadb_lifetime_allocations); 1119 x->lft.soft_byte_limit = _KEY2X(lifetime->sadb_lifetime_bytes); 1120 x->lft.soft_add_expires_seconds = lifetime->sadb_lifetime_addtime; 1121 x->lft.soft_use_expires_seconds = lifetime->sadb_lifetime_usetime; 1122 } 1123 1124 sec_ctx = ext_hdrs[SADB_X_EXT_SEC_CTX - 1]; 1125 if (sec_ctx != NULL) { 1126 struct xfrm_user_sec_ctx *uctx = pfkey_sadb2xfrm_user_sec_ctx(sec_ctx, GFP_KERNEL); 1127 1128 if (!uctx) 1129 goto out; 1130 1131 err = security_xfrm_state_alloc(x, uctx); 1132 kfree(uctx); 1133 1134 if (err) 1135 goto out; 1136 } 1137 1138 key = ext_hdrs[SADB_EXT_KEY_AUTH - 1]; 1139 if (sa->sadb_sa_auth) { 1140 int keysize = 0; 1141 struct xfrm_algo_desc *a = xfrm_aalg_get_byid(sa->sadb_sa_auth); 1142 if (!a || !a->pfkey_supported) { 1143 err = -ENOSYS; 1144 goto out; 1145 } 1146 if (key) 1147 keysize = (key->sadb_key_bits + 7) / 8; 1148 x->aalg = kmalloc(sizeof(*x->aalg) + keysize, GFP_KERNEL); 1149 if (!x->aalg) 1150 goto out; 1151 strcpy(x->aalg->alg_name, a->name); 1152 x->aalg->alg_key_len = 0; 1153 if (key) { 1154 x->aalg->alg_key_len = key->sadb_key_bits; 1155 memcpy(x->aalg->alg_key, key+1, keysize); 1156 } 1157 x->aalg->alg_trunc_len = a->uinfo.auth.icv_truncbits; 1158 x->props.aalgo = sa->sadb_sa_auth; 1159 /* x->algo.flags = sa->sadb_sa_flags; */ 1160 } 1161 if (sa->sadb_sa_encrypt) { 1162 if (hdr->sadb_msg_satype == SADB_X_SATYPE_IPCOMP) { 1163 struct xfrm_algo_desc *a = xfrm_calg_get_byid(sa->sadb_sa_encrypt); 1164 if (!a || !a->pfkey_supported) { 1165 err = -ENOSYS; 1166 goto out; 1167 } 1168 x->calg = kmalloc(sizeof(*x->calg), GFP_KERNEL); 1169 if (!x->calg) 1170 goto out; 1171 strcpy(x->calg->alg_name, a->name); 1172 x->props.calgo = sa->sadb_sa_encrypt; 1173 } else { 1174 int keysize = 0; 1175 struct xfrm_algo_desc *a = xfrm_ealg_get_byid(sa->sadb_sa_encrypt); 1176 if (!a || !a->pfkey_supported) { 1177 err = -ENOSYS; 1178 goto out; 1179 } 1180 key = (struct sadb_key*) ext_hdrs[SADB_EXT_KEY_ENCRYPT-1]; 1181 if (key) 1182 keysize = (key->sadb_key_bits + 7) / 8; 1183 x->ealg = kmalloc(sizeof(*x->ealg) + keysize, GFP_KERNEL); 1184 if (!x->ealg) 1185 goto out; 1186 strcpy(x->ealg->alg_name, a->name); 1187 x->ealg->alg_key_len = 0; 1188 if (key) { 1189 x->ealg->alg_key_len = key->sadb_key_bits; 1190 memcpy(x->ealg->alg_key, key+1, keysize); 1191 } 1192 x->props.ealgo = sa->sadb_sa_encrypt; 1193 x->geniv = a->uinfo.encr.geniv; 1194 } 1195 } 1196 /* x->algo.flags = sa->sadb_sa_flags; */ 1197 1198 x->props.family = pfkey_sadb_addr2xfrm_addr((struct sadb_address *) ext_hdrs[SADB_EXT_ADDRESS_SRC-1], 1199 &x->props.saddr); 1200 pfkey_sadb_addr2xfrm_addr((struct sadb_address *) ext_hdrs[SADB_EXT_ADDRESS_DST-1], 1201 &x->id.daddr); 1202 1203 if (ext_hdrs[SADB_X_EXT_SA2-1]) { 1204 const struct sadb_x_sa2 *sa2 = ext_hdrs[SADB_X_EXT_SA2-1]; 1205 int mode = pfkey_mode_to_xfrm(sa2->sadb_x_sa2_mode); 1206 if (mode < 0) { 1207 err = -EINVAL; 1208 goto out; 1209 } 1210 x->props.mode = mode; 1211 x->props.reqid = sa2->sadb_x_sa2_reqid; 1212 } 1213 1214 if (ext_hdrs[SADB_EXT_ADDRESS_PROXY-1]) { 1215 const struct sadb_address *addr = ext_hdrs[SADB_EXT_ADDRESS_PROXY-1]; 1216 1217 /* Nobody uses this, but we try. */ 1218 x->sel.family = pfkey_sadb_addr2xfrm_addr(addr, &x->sel.saddr); 1219 x->sel.prefixlen_s = addr->sadb_address_prefixlen; 1220 } 1221 1222 if (!x->sel.family) 1223 x->sel.family = x->props.family; 1224 1225 if (ext_hdrs[SADB_X_EXT_NAT_T_TYPE-1]) { 1226 const struct sadb_x_nat_t_type* n_type; 1227 struct xfrm_encap_tmpl *natt; 1228 1229 x->encap = kmalloc(sizeof(*x->encap), GFP_KERNEL); 1230 if (!x->encap) 1231 goto out; 1232 1233 natt = x->encap; 1234 n_type = ext_hdrs[SADB_X_EXT_NAT_T_TYPE-1]; 1235 natt->encap_type = n_type->sadb_x_nat_t_type_type; 1236 1237 if (ext_hdrs[SADB_X_EXT_NAT_T_SPORT-1]) { 1238 const struct sadb_x_nat_t_port *n_port = 1239 ext_hdrs[SADB_X_EXT_NAT_T_SPORT-1]; 1240 natt->encap_sport = n_port->sadb_x_nat_t_port_port; 1241 } 1242 if (ext_hdrs[SADB_X_EXT_NAT_T_DPORT-1]) { 1243 const struct sadb_x_nat_t_port *n_port = 1244 ext_hdrs[SADB_X_EXT_NAT_T_DPORT-1]; 1245 natt->encap_dport = n_port->sadb_x_nat_t_port_port; 1246 } 1247 memset(&natt->encap_oa, 0, sizeof(natt->encap_oa)); 1248 } 1249 1250 err = xfrm_init_state(x); 1251 if (err) 1252 goto out; 1253 1254 x->km.seq = hdr->sadb_msg_seq; 1255 return x; 1256 1257out: 1258 x->km.state = XFRM_STATE_DEAD; 1259 xfrm_state_put(x); 1260 return ERR_PTR(err); 1261} 1262 1263static int pfkey_reserved(struct sock *sk, struct sk_buff *skb, const struct sadb_msg *hdr, void * const *ext_hdrs) 1264{ 1265 return -EOPNOTSUPP; 1266} 1267 1268static int pfkey_getspi(struct sock *sk, struct sk_buff *skb, const struct sadb_msg *hdr, void * const *ext_hdrs) 1269{ 1270 struct net *net = sock_net(sk); 1271 struct sk_buff *resp_skb; 1272 struct sadb_x_sa2 *sa2; 1273 struct sadb_address *saddr, *daddr; 1274 struct sadb_msg *out_hdr; 1275 struct sadb_spirange *range; 1276 struct xfrm_state *x = NULL; 1277 int mode; 1278 int err; 1279 u32 min_spi, max_spi; 1280 u32 reqid; 1281 u8 proto; 1282 unsigned short family; 1283 xfrm_address_t *xsaddr = NULL, *xdaddr = NULL; 1284 1285 if (!present_and_same_family(ext_hdrs[SADB_EXT_ADDRESS_SRC-1], 1286 ext_hdrs[SADB_EXT_ADDRESS_DST-1])) 1287 return -EINVAL; 1288 1289 proto = pfkey_satype2proto(hdr->sadb_msg_satype); 1290 if (proto == 0) 1291 return -EINVAL; 1292 1293 if ((sa2 = ext_hdrs[SADB_X_EXT_SA2-1]) != NULL) { 1294 mode = pfkey_mode_to_xfrm(sa2->sadb_x_sa2_mode); 1295 if (mode < 0) 1296 return -EINVAL; 1297 reqid = sa2->sadb_x_sa2_reqid; 1298 } else { 1299 mode = 0; 1300 reqid = 0; 1301 } 1302 1303 saddr = ext_hdrs[SADB_EXT_ADDRESS_SRC-1]; 1304 daddr = ext_hdrs[SADB_EXT_ADDRESS_DST-1]; 1305 1306 family = ((struct sockaddr *)(saddr + 1))->sa_family; 1307 switch (family) { 1308 case AF_INET: 1309 xdaddr = (xfrm_address_t *)&((struct sockaddr_in *)(daddr + 1))->sin_addr.s_addr; 1310 xsaddr = (xfrm_address_t *)&((struct sockaddr_in *)(saddr + 1))->sin_addr.s_addr; 1311 break; 1312#if IS_ENABLED(CONFIG_IPV6) 1313 case AF_INET6: 1314 xdaddr = (xfrm_address_t *)&((struct sockaddr_in6 *)(daddr + 1))->sin6_addr; 1315 xsaddr = (xfrm_address_t *)&((struct sockaddr_in6 *)(saddr + 1))->sin6_addr; 1316 break; 1317#endif 1318 } 1319 1320 if (hdr->sadb_msg_seq) { 1321 x = xfrm_find_acq_byseq(net, DUMMY_MARK, hdr->sadb_msg_seq); 1322 if (x && !xfrm_addr_equal(&x->id.daddr, xdaddr, family)) { 1323 xfrm_state_put(x); 1324 x = NULL; 1325 } 1326 } 1327 1328 if (!x) 1329 x = xfrm_find_acq(net, &dummy_mark, mode, reqid, proto, xdaddr, xsaddr, 1, family); 1330 1331 if (x == NULL) 1332 return -ENOENT; 1333 1334 min_spi = 0x100; 1335 max_spi = 0x0fffffff; 1336 1337 range = ext_hdrs[SADB_EXT_SPIRANGE-1]; 1338 if (range) { 1339 min_spi = range->sadb_spirange_min; 1340 max_spi = range->sadb_spirange_max; 1341 } 1342 1343 err = verify_spi_info(x->id.proto, min_spi, max_spi); 1344 if (err) { 1345 xfrm_state_put(x); 1346 return err; 1347 } 1348 1349 err = xfrm_alloc_spi(x, min_spi, max_spi); 1350 resp_skb = err ? ERR_PTR(err) : pfkey_xfrm_state2msg(x); 1351 1352 if (IS_ERR(resp_skb)) { 1353 xfrm_state_put(x); 1354 return PTR_ERR(resp_skb); 1355 } 1356 1357 out_hdr = (struct sadb_msg *) resp_skb->data; 1358 out_hdr->sadb_msg_version = hdr->sadb_msg_version; 1359 out_hdr->sadb_msg_type = SADB_GETSPI; 1360 out_hdr->sadb_msg_satype = pfkey_proto2satype(proto); 1361 out_hdr->sadb_msg_errno = 0; 1362 out_hdr->sadb_msg_reserved = 0; 1363 out_hdr->sadb_msg_seq = hdr->sadb_msg_seq; 1364 out_hdr->sadb_msg_pid = hdr->sadb_msg_pid; 1365 1366 xfrm_state_put(x); 1367 1368 pfkey_broadcast(resp_skb, BROADCAST_ONE, sk, net); 1369 1370 return 0; 1371} 1372 1373static int pfkey_acquire(struct sock *sk, struct sk_buff *skb, const struct sadb_msg *hdr, void * const *ext_hdrs) 1374{ 1375 struct net *net = sock_net(sk); 1376 struct xfrm_state *x; 1377 1378 if (hdr->sadb_msg_len != sizeof(struct sadb_msg)/8) 1379 return -EOPNOTSUPP; 1380 1381 if (hdr->sadb_msg_seq == 0 || hdr->sadb_msg_errno == 0) 1382 return 0; 1383 1384 x = xfrm_find_acq_byseq(net, DUMMY_MARK, hdr->sadb_msg_seq); 1385 if (x == NULL) 1386 return 0; 1387 1388 spin_lock_bh(&x->lock); 1389 if (x->km.state == XFRM_STATE_ACQ) 1390 x->km.state = XFRM_STATE_ERROR; 1391 1392 spin_unlock_bh(&x->lock); 1393 xfrm_state_put(x); 1394 return 0; 1395} 1396 1397static inline int event2poltype(int event) 1398{ 1399 switch (event) { 1400 case XFRM_MSG_DELPOLICY: 1401 return SADB_X_SPDDELETE; 1402 case XFRM_MSG_NEWPOLICY: 1403 return SADB_X_SPDADD; 1404 case XFRM_MSG_UPDPOLICY: 1405 return SADB_X_SPDUPDATE; 1406 case XFRM_MSG_POLEXPIRE: 1407 // return SADB_X_SPDEXPIRE; 1408 default: 1409 pr_err("pfkey: Unknown policy event %d\n", event); 1410 break; 1411 } 1412 1413 return 0; 1414} 1415 1416static inline int event2keytype(int event) 1417{ 1418 switch (event) { 1419 case XFRM_MSG_DELSA: 1420 return SADB_DELETE; 1421 case XFRM_MSG_NEWSA: 1422 return SADB_ADD; 1423 case XFRM_MSG_UPDSA: 1424 return SADB_UPDATE; 1425 case XFRM_MSG_EXPIRE: 1426 return SADB_EXPIRE; 1427 default: 1428 pr_err("pfkey: Unknown SA event %d\n", event); 1429 break; 1430 } 1431 1432 return 0; 1433} 1434 1435/* ADD/UPD/DEL */ 1436static int key_notify_sa(struct xfrm_state *x, const struct km_event *c) 1437{ 1438 struct sk_buff *skb; 1439 struct sadb_msg *hdr; 1440 1441 skb = pfkey_xfrm_state2msg(x); 1442 1443 if (IS_ERR(skb)) 1444 return PTR_ERR(skb); 1445 1446 hdr = (struct sadb_msg *) skb->data; 1447 hdr->sadb_msg_version = PF_KEY_V2; 1448 hdr->sadb_msg_type = event2keytype(c->event); 1449 hdr->sadb_msg_satype = pfkey_proto2satype(x->id.proto); 1450 hdr->sadb_msg_errno = 0; 1451 hdr->sadb_msg_reserved = 0; 1452 hdr->sadb_msg_seq = c->seq; 1453 hdr->sadb_msg_pid = c->portid; 1454 1455 pfkey_broadcast(skb, BROADCAST_ALL, NULL, xs_net(x)); 1456 1457 return 0; 1458} 1459 1460static int pfkey_add(struct sock *sk, struct sk_buff *skb, const struct sadb_msg *hdr, void * const *ext_hdrs) 1461{ 1462 struct net *net = sock_net(sk); 1463 struct xfrm_state *x; 1464 int err; 1465 struct km_event c; 1466 1467 x = pfkey_msg2xfrm_state(net, hdr, ext_hdrs); 1468 if (IS_ERR(x)) 1469 return PTR_ERR(x); 1470 1471 xfrm_state_hold(x); 1472 if (hdr->sadb_msg_type == SADB_ADD) 1473 err = xfrm_state_add(x); 1474 else 1475 err = xfrm_state_update(x); 1476 1477 xfrm_audit_state_add(x, err ? 0 : 1, true); 1478 1479 if (err < 0) { 1480 x->km.state = XFRM_STATE_DEAD; 1481 __xfrm_state_put(x); 1482 goto out; 1483 } 1484 1485 if (hdr->sadb_msg_type == SADB_ADD) 1486 c.event = XFRM_MSG_NEWSA; 1487 else 1488 c.event = XFRM_MSG_UPDSA; 1489 c.seq = hdr->sadb_msg_seq; 1490 c.portid = hdr->sadb_msg_pid; 1491 km_state_notify(x, &c); 1492out: 1493 xfrm_state_put(x); 1494 return err; 1495} 1496 1497static int pfkey_delete(struct sock *sk, struct sk_buff *skb, const struct sadb_msg *hdr, void * const *ext_hdrs) 1498{ 1499 struct net *net = sock_net(sk); 1500 struct xfrm_state *x; 1501 struct km_event c; 1502 int err; 1503 1504 if (!ext_hdrs[SADB_EXT_SA-1] || 1505 !present_and_same_family(ext_hdrs[SADB_EXT_ADDRESS_SRC-1], 1506 ext_hdrs[SADB_EXT_ADDRESS_DST-1])) 1507 return -EINVAL; 1508 1509 x = pfkey_xfrm_state_lookup(net, hdr, ext_hdrs); 1510 if (x == NULL) 1511 return -ESRCH; 1512 1513 if ((err = security_xfrm_state_delete(x))) 1514 goto out; 1515 1516 if (xfrm_state_kern(x)) { 1517 err = -EPERM; 1518 goto out; 1519 } 1520 1521 err = xfrm_state_delete(x); 1522 1523 if (err < 0) 1524 goto out; 1525 1526 c.seq = hdr->sadb_msg_seq; 1527 c.portid = hdr->sadb_msg_pid; 1528 c.event = XFRM_MSG_DELSA; 1529 km_state_notify(x, &c); 1530out: 1531 xfrm_audit_state_delete(x, err ? 0 : 1, true); 1532 xfrm_state_put(x); 1533 1534 return err; 1535} 1536 1537static int pfkey_get(struct sock *sk, struct sk_buff *skb, const struct sadb_msg *hdr, void * const *ext_hdrs) 1538{ 1539 struct net *net = sock_net(sk); 1540 __u8 proto; 1541 struct sk_buff *out_skb; 1542 struct sadb_msg *out_hdr; 1543 struct xfrm_state *x; 1544 1545 if (!ext_hdrs[SADB_EXT_SA-1] || 1546 !present_and_same_family(ext_hdrs[SADB_EXT_ADDRESS_SRC-1], 1547 ext_hdrs[SADB_EXT_ADDRESS_DST-1])) 1548 return -EINVAL; 1549 1550 x = pfkey_xfrm_state_lookup(net, hdr, ext_hdrs); 1551 if (x == NULL) 1552 return -ESRCH; 1553 1554 out_skb = pfkey_xfrm_state2msg(x); 1555 proto = x->id.proto; 1556 xfrm_state_put(x); 1557 if (IS_ERR(out_skb)) 1558 return PTR_ERR(out_skb); 1559 1560 out_hdr = (struct sadb_msg *) out_skb->data; 1561 out_hdr->sadb_msg_version = hdr->sadb_msg_version; 1562 out_hdr->sadb_msg_type = SADB_GET; 1563 out_hdr->sadb_msg_satype = pfkey_proto2satype(proto); 1564 out_hdr->sadb_msg_errno = 0; 1565 out_hdr->sadb_msg_reserved = 0; 1566 out_hdr->sadb_msg_seq = hdr->sadb_msg_seq; 1567 out_hdr->sadb_msg_pid = hdr->sadb_msg_pid; 1568 pfkey_broadcast(out_skb, BROADCAST_ONE, sk, sock_net(sk)); 1569 1570 return 0; 1571} 1572 1573static struct sk_buff *compose_sadb_supported(const struct sadb_msg *orig, 1574 gfp_t allocation) 1575{ 1576 struct sk_buff *skb; 1577 struct sadb_msg *hdr; 1578 int len, auth_len, enc_len, i; 1579 1580 auth_len = xfrm_count_pfkey_auth_supported(); 1581 if (auth_len) { 1582 auth_len *= sizeof(struct sadb_alg); 1583 auth_len += sizeof(struct sadb_supported); 1584 } 1585 1586 enc_len = xfrm_count_pfkey_enc_supported(); 1587 if (enc_len) { 1588 enc_len *= sizeof(struct sadb_alg); 1589 enc_len += sizeof(struct sadb_supported); 1590 } 1591 1592 len = enc_len + auth_len + sizeof(struct sadb_msg); 1593 1594 skb = alloc_skb(len + 16, allocation); 1595 if (!skb) 1596 goto out_put_algs; 1597 1598 hdr = (struct sadb_msg *) skb_put(skb, sizeof(*hdr)); 1599 pfkey_hdr_dup(hdr, orig); 1600 hdr->sadb_msg_errno = 0; 1601 hdr->sadb_msg_len = len / sizeof(uint64_t); 1602 1603 if (auth_len) { 1604 struct sadb_supported *sp; 1605 struct sadb_alg *ap; 1606 1607 sp = (struct sadb_supported *) skb_put(skb, auth_len); 1608 ap = (struct sadb_alg *) (sp + 1); 1609 1610 sp->sadb_supported_len = auth_len / sizeof(uint64_t); 1611 sp->sadb_supported_exttype = SADB_EXT_SUPPORTED_AUTH; 1612 1613 for (i = 0; ; i++) { 1614 struct xfrm_algo_desc *aalg = xfrm_aalg_get_byidx(i); 1615 if (!aalg) 1616 break; 1617 if (!aalg->pfkey_supported) 1618 continue; 1619 if (aalg->available) 1620 *ap++ = aalg->desc; 1621 } 1622 } 1623 1624 if (enc_len) { 1625 struct sadb_supported *sp; 1626 struct sadb_alg *ap; 1627 1628 sp = (struct sadb_supported *) skb_put(skb, enc_len); 1629 ap = (struct sadb_alg *) (sp + 1); 1630 1631 sp->sadb_supported_len = enc_len / sizeof(uint64_t); 1632 sp->sadb_supported_exttype = SADB_EXT_SUPPORTED_ENCRYPT; 1633 1634 for (i = 0; ; i++) { 1635 struct xfrm_algo_desc *ealg = xfrm_ealg_get_byidx(i); 1636 if (!ealg) 1637 break; 1638 if (!ealg->pfkey_supported) 1639 continue; 1640 if (ealg->available) 1641 *ap++ = ealg->desc; 1642 } 1643 } 1644 1645out_put_algs: 1646 return skb; 1647} 1648 1649static int pfkey_register(struct sock *sk, struct sk_buff *skb, const struct sadb_msg *hdr, void * const *ext_hdrs) 1650{ 1651 struct pfkey_sock *pfk = pfkey_sk(sk); 1652 struct sk_buff *supp_skb; 1653 1654 if (hdr->sadb_msg_satype > SADB_SATYPE_MAX) 1655 return -EINVAL; 1656 1657 if (hdr->sadb_msg_satype != SADB_SATYPE_UNSPEC) { 1658 if (pfk->registered&(1<<hdr->sadb_msg_satype)) 1659 return -EEXIST; 1660 pfk->registered |= (1<<hdr->sadb_msg_satype); 1661 } 1662 1663 xfrm_probe_algs(); 1664 1665 supp_skb = compose_sadb_supported(hdr, GFP_KERNEL); 1666 if (!supp_skb) { 1667 if (hdr->sadb_msg_satype != SADB_SATYPE_UNSPEC) 1668 pfk->registered &= ~(1<<hdr->sadb_msg_satype); 1669 1670 return -ENOBUFS; 1671 } 1672 1673 pfkey_broadcast(supp_skb, BROADCAST_REGISTERED, sk, sock_net(sk)); 1674 1675 return 0; 1676} 1677 1678static int unicast_flush_resp(struct sock *sk, const struct sadb_msg *ihdr) 1679{ 1680 struct sk_buff *skb; 1681 struct sadb_msg *hdr; 1682 1683 skb = alloc_skb(sizeof(struct sadb_msg) + 16, GFP_ATOMIC); 1684 if (!skb) 1685 return -ENOBUFS; 1686 1687 hdr = (struct sadb_msg *) skb_put(skb, sizeof(struct sadb_msg)); 1688 memcpy(hdr, ihdr, sizeof(struct sadb_msg)); 1689 hdr->sadb_msg_errno = (uint8_t) 0; 1690 hdr->sadb_msg_len = (sizeof(struct sadb_msg) / sizeof(uint64_t)); 1691 1692 return pfkey_broadcast(skb, BROADCAST_ONE, sk, sock_net(sk)); 1693} 1694 1695static int key_notify_sa_flush(const struct km_event *c) 1696{ 1697 struct sk_buff *skb; 1698 struct sadb_msg *hdr; 1699 1700 skb = alloc_skb(sizeof(struct sadb_msg) + 16, GFP_ATOMIC); 1701 if (!skb) 1702 return -ENOBUFS; 1703 hdr = (struct sadb_msg *) skb_put(skb, sizeof(struct sadb_msg)); 1704 hdr->sadb_msg_satype = pfkey_proto2satype(c->data.proto); 1705 hdr->sadb_msg_type = SADB_FLUSH; 1706 hdr->sadb_msg_seq = c->seq; 1707 hdr->sadb_msg_pid = c->portid; 1708 hdr->sadb_msg_version = PF_KEY_V2; 1709 hdr->sadb_msg_errno = (uint8_t) 0; 1710 hdr->sadb_msg_len = (sizeof(struct sadb_msg) / sizeof(uint64_t)); 1711 hdr->sadb_msg_reserved = 0; 1712 1713 pfkey_broadcast(skb, BROADCAST_ALL, NULL, c->net); 1714 1715 return 0; 1716} 1717 1718static int pfkey_flush(struct sock *sk, struct sk_buff *skb, const struct sadb_msg *hdr, void * const *ext_hdrs) 1719{ 1720 struct net *net = sock_net(sk); 1721 unsigned int proto; 1722 struct km_event c; 1723 int err, err2; 1724 1725 proto = pfkey_satype2proto(hdr->sadb_msg_satype); 1726 if (proto == 0) 1727 return -EINVAL; 1728 1729 err = xfrm_state_flush(net, proto, true); 1730 err2 = unicast_flush_resp(sk, hdr); 1731 if (err || err2) { 1732 if (err == -ESRCH) /* empty table - go quietly */ 1733 err = 0; 1734 return err ? err : err2; 1735 } 1736 1737 c.data.proto = proto; 1738 c.seq = hdr->sadb_msg_seq; 1739 c.portid = hdr->sadb_msg_pid; 1740 c.event = XFRM_MSG_FLUSHSA; 1741 c.net = net; 1742 km_state_notify(NULL, &c); 1743 1744 return 0; 1745} 1746 1747static int dump_sa(struct xfrm_state *x, int count, void *ptr) 1748{ 1749 struct pfkey_sock *pfk = ptr; 1750 struct sk_buff *out_skb; 1751 struct sadb_msg *out_hdr; 1752 1753 if (!pfkey_can_dump(&pfk->sk)) 1754 return -ENOBUFS; 1755 1756 out_skb = pfkey_xfrm_state2msg(x); 1757 if (IS_ERR(out_skb)) 1758 return PTR_ERR(out_skb); 1759 1760 out_hdr = (struct sadb_msg *) out_skb->data; 1761 out_hdr->sadb_msg_version = pfk->dump.msg_version; 1762 out_hdr->sadb_msg_type = SADB_DUMP; 1763 out_hdr->sadb_msg_satype = pfkey_proto2satype(x->id.proto); 1764 out_hdr->sadb_msg_errno = 0; 1765 out_hdr->sadb_msg_reserved = 0; 1766 out_hdr->sadb_msg_seq = count + 1; 1767 out_hdr->sadb_msg_pid = pfk->dump.msg_portid; 1768 1769 if (pfk->dump.skb) 1770 pfkey_broadcast(pfk->dump.skb, BROADCAST_ONE, 1771 &pfk->sk, sock_net(&pfk->sk)); 1772 pfk->dump.skb = out_skb; 1773 1774 return 0; 1775} 1776 1777static int pfkey_dump_sa(struct pfkey_sock *pfk) 1778{ 1779 struct net *net = sock_net(&pfk->sk); 1780 return xfrm_state_walk(net, &pfk->dump.u.state, dump_sa, (void *) pfk); 1781} 1782 1783static void pfkey_dump_sa_done(struct pfkey_sock *pfk) 1784{ 1785 struct net *net = sock_net(&pfk->sk); 1786 1787 xfrm_state_walk_done(&pfk->dump.u.state, net); 1788} 1789 1790static int pfkey_dump(struct sock *sk, struct sk_buff *skb, const struct sadb_msg *hdr, void * const *ext_hdrs) 1791{ 1792 u8 proto; 1793 struct xfrm_address_filter *filter = NULL; 1794 struct pfkey_sock *pfk = pfkey_sk(sk); 1795 1796 if (pfk->dump.dump != NULL) 1797 return -EBUSY; 1798 1799 proto = pfkey_satype2proto(hdr->sadb_msg_satype); 1800 if (proto == 0) 1801 return -EINVAL; 1802 1803 if (ext_hdrs[SADB_X_EXT_FILTER - 1]) { 1804 struct sadb_x_filter *xfilter = ext_hdrs[SADB_X_EXT_FILTER - 1]; 1805 1806 filter = kmalloc(sizeof(*filter), GFP_KERNEL); 1807 if (filter == NULL) 1808 return -ENOMEM; 1809 1810 memcpy(&filter->saddr, &xfilter->sadb_x_filter_saddr, 1811 sizeof(xfrm_address_t)); 1812 memcpy(&filter->daddr, &xfilter->sadb_x_filter_daddr, 1813 sizeof(xfrm_address_t)); 1814 filter->family = xfilter->sadb_x_filter_family; 1815 filter->splen = xfilter->sadb_x_filter_splen; 1816 filter->dplen = xfilter->sadb_x_filter_dplen; 1817 } 1818 1819 pfk->dump.msg_version = hdr->sadb_msg_version; 1820 pfk->dump.msg_portid = hdr->sadb_msg_pid; 1821 pfk->dump.dump = pfkey_dump_sa; 1822 pfk->dump.done = pfkey_dump_sa_done; 1823 xfrm_state_walk_init(&pfk->dump.u.state, proto, filter); 1824 1825 return pfkey_do_dump(pfk); 1826} 1827 1828static int pfkey_promisc(struct sock *sk, struct sk_buff *skb, const struct sadb_msg *hdr, void * const *ext_hdrs) 1829{ 1830 struct pfkey_sock *pfk = pfkey_sk(sk); 1831 int satype = hdr->sadb_msg_satype; 1832 bool reset_errno = false; 1833 1834 if (hdr->sadb_msg_len == (sizeof(*hdr) / sizeof(uint64_t))) { 1835 reset_errno = true; 1836 if (satype != 0 && satype != 1) 1837 return -EINVAL; 1838 pfk->promisc = satype; 1839 } 1840 if (reset_errno && skb_cloned(skb)) 1841 skb = skb_copy(skb, GFP_KERNEL); 1842 else 1843 skb = skb_clone(skb, GFP_KERNEL); 1844 1845 if (reset_errno && skb) { 1846 struct sadb_msg *new_hdr = (struct sadb_msg *) skb->data; 1847 new_hdr->sadb_msg_errno = 0; 1848 } 1849 1850 pfkey_broadcast(skb, BROADCAST_ALL, NULL, sock_net(sk)); 1851 return 0; 1852} 1853 1854static int check_reqid(struct xfrm_policy *xp, int dir, int count, void *ptr) 1855{ 1856 int i; 1857 u32 reqid = *(u32*)ptr; 1858 1859 for (i=0; i<xp->xfrm_nr; i++) { 1860 if (xp->xfrm_vec[i].reqid == reqid) 1861 return -EEXIST; 1862 } 1863 return 0; 1864} 1865 1866static u32 gen_reqid(struct net *net) 1867{ 1868 struct xfrm_policy_walk walk; 1869 u32 start; 1870 int rc; 1871 static u32 reqid = IPSEC_MANUAL_REQID_MAX; 1872 1873 start = reqid; 1874 do { 1875 ++reqid; 1876 if (reqid == 0) 1877 reqid = IPSEC_MANUAL_REQID_MAX+1; 1878 xfrm_policy_walk_init(&walk, XFRM_POLICY_TYPE_MAIN); 1879 rc = xfrm_policy_walk(net, &walk, check_reqid, (void*)&reqid); 1880 xfrm_policy_walk_done(&walk, net); 1881 if (rc != -EEXIST) 1882 return reqid; 1883 } while (reqid != start); 1884 return 0; 1885} 1886 1887static int 1888parse_ipsecrequest(struct xfrm_policy *xp, struct sadb_x_ipsecrequest *rq) 1889{ 1890 struct net *net = xp_net(xp); 1891 struct xfrm_tmpl *t = xp->xfrm_vec + xp->xfrm_nr; 1892 int mode; 1893 1894 if (xp->xfrm_nr >= XFRM_MAX_DEPTH) 1895 return -ELOOP; 1896 1897 if (rq->sadb_x_ipsecrequest_mode == 0) 1898 return -EINVAL; 1899 1900 t->id.proto = rq->sadb_x_ipsecrequest_proto; /* XXX check proto */ 1901 if ((mode = pfkey_mode_to_xfrm(rq->sadb_x_ipsecrequest_mode)) < 0) 1902 return -EINVAL; 1903 t->mode = mode; 1904 if (rq->sadb_x_ipsecrequest_level == IPSEC_LEVEL_USE) 1905 t->optional = 1; 1906 else if (rq->sadb_x_ipsecrequest_level == IPSEC_LEVEL_UNIQUE) { 1907 t->reqid = rq->sadb_x_ipsecrequest_reqid; 1908 if (t->reqid > IPSEC_MANUAL_REQID_MAX) 1909 t->reqid = 0; 1910 if (!t->reqid && !(t->reqid = gen_reqid(net))) 1911 return -ENOBUFS; 1912 } 1913 1914 /* addresses present only in tunnel mode */ 1915 if (t->mode == XFRM_MODE_TUNNEL) { 1916 u8 *sa = (u8 *) (rq + 1); 1917 int family, socklen; 1918 1919 family = pfkey_sockaddr_extract((struct sockaddr *)sa, 1920 &t->saddr); 1921 if (!family) 1922 return -EINVAL; 1923 1924 socklen = pfkey_sockaddr_len(family); 1925 if (pfkey_sockaddr_extract((struct sockaddr *)(sa + socklen), 1926 &t->id.daddr) != family) 1927 return -EINVAL; 1928 t->encap_family = family; 1929 } else 1930 t->encap_family = xp->family; 1931 1932 /* No way to set this via kame pfkey */ 1933 t->allalgs = 1; 1934 xp->xfrm_nr++; 1935 return 0; 1936} 1937 1938static int 1939parse_ipsecrequests(struct xfrm_policy *xp, struct sadb_x_policy *pol) 1940{ 1941 int err; 1942 int len = pol->sadb_x_policy_len*8 - sizeof(struct sadb_x_policy); 1943 struct sadb_x_ipsecrequest *rq = (void*)(pol+1); 1944 1945 if (pol->sadb_x_policy_len * 8 < sizeof(struct sadb_x_policy)) 1946 return -EINVAL; 1947 1948 while (len >= sizeof(struct sadb_x_ipsecrequest)) { 1949 if ((err = parse_ipsecrequest(xp, rq)) < 0) 1950 return err; 1951 len -= rq->sadb_x_ipsecrequest_len; 1952 rq = (void*)((u8*)rq + rq->sadb_x_ipsecrequest_len); 1953 } 1954 return 0; 1955} 1956 1957static inline int pfkey_xfrm_policy2sec_ctx_size(const struct xfrm_policy *xp) 1958{ 1959 struct xfrm_sec_ctx *xfrm_ctx = xp->security; 1960 1961 if (xfrm_ctx) { 1962 int len = sizeof(struct sadb_x_sec_ctx); 1963 len += xfrm_ctx->ctx_len; 1964 return PFKEY_ALIGN8(len); 1965 } 1966 return 0; 1967} 1968 1969static int pfkey_xfrm_policy2msg_size(const struct xfrm_policy *xp) 1970{ 1971 const struct xfrm_tmpl *t; 1972 int sockaddr_size = pfkey_sockaddr_size(xp->family); 1973 int socklen = 0; 1974 int i; 1975 1976 for (i=0; i<xp->xfrm_nr; i++) { 1977 t = xp->xfrm_vec + i; 1978 socklen += pfkey_sockaddr_len(t->encap_family); 1979 } 1980 1981 return sizeof(struct sadb_msg) + 1982 (sizeof(struct sadb_lifetime) * 3) + 1983 (sizeof(struct sadb_address) * 2) + 1984 (sockaddr_size * 2) + 1985 sizeof(struct sadb_x_policy) + 1986 (xp->xfrm_nr * sizeof(struct sadb_x_ipsecrequest)) + 1987 (socklen * 2) + 1988 pfkey_xfrm_policy2sec_ctx_size(xp); 1989} 1990 1991static struct sk_buff * pfkey_xfrm_policy2msg_prep(const struct xfrm_policy *xp) 1992{ 1993 struct sk_buff *skb; 1994 int size; 1995 1996 size = pfkey_xfrm_policy2msg_size(xp); 1997 1998 skb = alloc_skb(size + 16, GFP_ATOMIC); 1999 if (skb == NULL) 2000 return ERR_PTR(-ENOBUFS); 2001 2002 return skb; 2003} 2004 2005static int pfkey_xfrm_policy2msg(struct sk_buff *skb, const struct xfrm_policy *xp, int dir) 2006{ 2007 struct sadb_msg *hdr; 2008 struct sadb_address *addr; 2009 struct sadb_lifetime *lifetime; 2010 struct sadb_x_policy *pol; 2011 struct sadb_x_sec_ctx *sec_ctx; 2012 struct xfrm_sec_ctx *xfrm_ctx; 2013 int i; 2014 int size; 2015 int sockaddr_size = pfkey_sockaddr_size(xp->family); 2016 int socklen = pfkey_sockaddr_len(xp->family); 2017 2018 size = pfkey_xfrm_policy2msg_size(xp); 2019 2020 /* call should fill header later */ 2021 hdr = (struct sadb_msg *) skb_put(skb, sizeof(struct sadb_msg)); 2022 memset(hdr, 0, size); /* XXX do we need this ? */ 2023 2024 /* src address */ 2025 addr = (struct sadb_address*) skb_put(skb, 2026 sizeof(struct sadb_address)+sockaddr_size); 2027 addr->sadb_address_len = 2028 (sizeof(struct sadb_address)+sockaddr_size)/ 2029 sizeof(uint64_t); 2030 addr->sadb_address_exttype = SADB_EXT_ADDRESS_SRC; 2031 addr->sadb_address_proto = pfkey_proto_from_xfrm(xp->selector.proto); 2032 addr->sadb_address_prefixlen = xp->selector.prefixlen_s; 2033 addr->sadb_address_reserved = 0; 2034 if (!pfkey_sockaddr_fill(&xp->selector.saddr, 2035 xp->selector.sport, 2036 (struct sockaddr *) (addr + 1), 2037 xp->family)) 2038 BUG(); 2039 2040 /* dst address */ 2041 addr = (struct sadb_address*) skb_put(skb, 2042 sizeof(struct sadb_address)+sockaddr_size); 2043 addr->sadb_address_len = 2044 (sizeof(struct sadb_address)+sockaddr_size)/ 2045 sizeof(uint64_t); 2046 addr->sadb_address_exttype = SADB_EXT_ADDRESS_DST; 2047 addr->sadb_address_proto = pfkey_proto_from_xfrm(xp->selector.proto); 2048 addr->sadb_address_prefixlen = xp->selector.prefixlen_d; 2049 addr->sadb_address_reserved = 0; 2050 2051 pfkey_sockaddr_fill(&xp->selector.daddr, xp->selector.dport, 2052 (struct sockaddr *) (addr + 1), 2053 xp->family); 2054 2055 /* hard time */ 2056 lifetime = (struct sadb_lifetime *) skb_put(skb, 2057 sizeof(struct sadb_lifetime)); 2058 lifetime->sadb_lifetime_len = 2059 sizeof(struct sadb_lifetime)/sizeof(uint64_t); 2060 lifetime->sadb_lifetime_exttype = SADB_EXT_LIFETIME_HARD; 2061 lifetime->sadb_lifetime_allocations = _X2KEY(xp->lft.hard_packet_limit); 2062 lifetime->sadb_lifetime_bytes = _X2KEY(xp->lft.hard_byte_limit); 2063 lifetime->sadb_lifetime_addtime = xp->lft.hard_add_expires_seconds; 2064 lifetime->sadb_lifetime_usetime = xp->lft.hard_use_expires_seconds; 2065 /* soft time */ 2066 lifetime = (struct sadb_lifetime *) skb_put(skb, 2067 sizeof(struct sadb_lifetime)); 2068 lifetime->sadb_lifetime_len = 2069 sizeof(struct sadb_lifetime)/sizeof(uint64_t); 2070 lifetime->sadb_lifetime_exttype = SADB_EXT_LIFETIME_SOFT; 2071 lifetime->sadb_lifetime_allocations = _X2KEY(xp->lft.soft_packet_limit); 2072 lifetime->sadb_lifetime_bytes = _X2KEY(xp->lft.soft_byte_limit); 2073 lifetime->sadb_lifetime_addtime = xp->lft.soft_add_expires_seconds; 2074 lifetime->sadb_lifetime_usetime = xp->lft.soft_use_expires_seconds; 2075 /* current time */ 2076 lifetime = (struct sadb_lifetime *) skb_put(skb, 2077 sizeof(struct sadb_lifetime)); 2078 lifetime->sadb_lifetime_len = 2079 sizeof(struct sadb_lifetime)/sizeof(uint64_t); 2080 lifetime->sadb_lifetime_exttype = SADB_EXT_LIFETIME_CURRENT; 2081 lifetime->sadb_lifetime_allocations = xp->curlft.packets; 2082 lifetime->sadb_lifetime_bytes = xp->curlft.bytes; 2083 lifetime->sadb_lifetime_addtime = xp->curlft.add_time; 2084 lifetime->sadb_lifetime_usetime = xp->curlft.use_time; 2085 2086 pol = (struct sadb_x_policy *) skb_put(skb, sizeof(struct sadb_x_policy)); 2087 pol->sadb_x_policy_len = sizeof(struct sadb_x_policy)/sizeof(uint64_t); 2088 pol->sadb_x_policy_exttype = SADB_X_EXT_POLICY; 2089 pol->sadb_x_policy_type = IPSEC_POLICY_DISCARD; 2090 if (xp->action == XFRM_POLICY_ALLOW) { 2091 if (xp->xfrm_nr) 2092 pol->sadb_x_policy_type = IPSEC_POLICY_IPSEC; 2093 else 2094 pol->sadb_x_policy_type = IPSEC_POLICY_NONE; 2095 } 2096 pol->sadb_x_policy_dir = dir+1; 2097 pol->sadb_x_policy_reserved = 0; 2098 pol->sadb_x_policy_id = xp->index; 2099 pol->sadb_x_policy_priority = xp->priority; 2100 2101 for (i=0; i<xp->xfrm_nr; i++) { 2102 const struct xfrm_tmpl *t = xp->xfrm_vec + i; 2103 struct sadb_x_ipsecrequest *rq; 2104 int req_size; 2105 int mode; 2106 2107 req_size = sizeof(struct sadb_x_ipsecrequest); 2108 if (t->mode == XFRM_MODE_TUNNEL) { 2109 socklen = pfkey_sockaddr_len(t->encap_family); 2110 req_size += socklen * 2; 2111 } else { 2112 size -= 2*socklen; 2113 } 2114 rq = (void*)skb_put(skb, req_size); 2115 pol->sadb_x_policy_len += req_size/8; 2116 memset(rq, 0, sizeof(*rq)); 2117 rq->sadb_x_ipsecrequest_len = req_size; 2118 rq->sadb_x_ipsecrequest_proto = t->id.proto; 2119 if ((mode = pfkey_mode_from_xfrm(t->mode)) < 0) 2120 return -EINVAL; 2121 rq->sadb_x_ipsecrequest_mode = mode; 2122 rq->sadb_x_ipsecrequest_level = IPSEC_LEVEL_REQUIRE; 2123 if (t->reqid) 2124 rq->sadb_x_ipsecrequest_level = IPSEC_LEVEL_UNIQUE; 2125 if (t->optional) 2126 rq->sadb_x_ipsecrequest_level = IPSEC_LEVEL_USE; 2127 rq->sadb_x_ipsecrequest_reqid = t->reqid; 2128 2129 if (t->mode == XFRM_MODE_TUNNEL) { 2130 u8 *sa = (void *)(rq + 1); 2131 pfkey_sockaddr_fill(&t->saddr, 0, 2132 (struct sockaddr *)sa, 2133 t->encap_family); 2134 pfkey_sockaddr_fill(&t->id.daddr, 0, 2135 (struct sockaddr *) (sa + socklen), 2136 t->encap_family); 2137 } 2138 } 2139 2140 /* security context */ 2141 if ((xfrm_ctx = xp->security)) { 2142 int ctx_size = pfkey_xfrm_policy2sec_ctx_size(xp); 2143 2144 sec_ctx = (struct sadb_x_sec_ctx *) skb_put(skb, ctx_size); 2145 sec_ctx->sadb_x_sec_len = ctx_size / sizeof(uint64_t); 2146 sec_ctx->sadb_x_sec_exttype = SADB_X_EXT_SEC_CTX; 2147 sec_ctx->sadb_x_ctx_doi = xfrm_ctx->ctx_doi; 2148 sec_ctx->sadb_x_ctx_alg = xfrm_ctx->ctx_alg; 2149 sec_ctx->sadb_x_ctx_len = xfrm_ctx->ctx_len; 2150 memcpy(sec_ctx + 1, xfrm_ctx->ctx_str, 2151 xfrm_ctx->ctx_len); 2152 } 2153 2154 hdr->sadb_msg_len = size / sizeof(uint64_t); 2155 hdr->sadb_msg_reserved = atomic_read(&xp->refcnt); 2156 2157 return 0; 2158} 2159 2160static int key_notify_policy(struct xfrm_policy *xp, int dir, const struct km_event *c) 2161{ 2162 struct sk_buff *out_skb; 2163 struct sadb_msg *out_hdr; 2164 int err; 2165 2166 out_skb = pfkey_xfrm_policy2msg_prep(xp); 2167 if (IS_ERR(out_skb)) 2168 return PTR_ERR(out_skb); 2169 2170 err = pfkey_xfrm_policy2msg(out_skb, xp, dir); 2171 if (err < 0) 2172 return err; 2173 2174 out_hdr = (struct sadb_msg *) out_skb->data; 2175 out_hdr->sadb_msg_version = PF_KEY_V2; 2176 2177 if (c->data.byid && c->event == XFRM_MSG_DELPOLICY) 2178 out_hdr->sadb_msg_type = SADB_X_SPDDELETE2; 2179 else 2180 out_hdr->sadb_msg_type = event2poltype(c->event); 2181 out_hdr->sadb_msg_errno = 0; 2182 out_hdr->sadb_msg_seq = c->seq; 2183 out_hdr->sadb_msg_pid = c->portid; 2184 pfkey_broadcast(out_skb, BROADCAST_ALL, NULL, xp_net(xp)); 2185 return 0; 2186 2187} 2188 2189static int pfkey_spdadd(struct sock *sk, struct sk_buff *skb, const struct sadb_msg *hdr, void * const *ext_hdrs) 2190{ 2191 struct net *net = sock_net(sk); 2192 int err = 0; 2193 struct sadb_lifetime *lifetime; 2194 struct sadb_address *sa; 2195 struct sadb_x_policy *pol; 2196 struct xfrm_policy *xp; 2197 struct km_event c; 2198 struct sadb_x_sec_ctx *sec_ctx; 2199 2200 if (!present_and_same_family(ext_hdrs[SADB_EXT_ADDRESS_SRC-1], 2201 ext_hdrs[SADB_EXT_ADDRESS_DST-1]) || 2202 !ext_hdrs[SADB_X_EXT_POLICY-1]) 2203 return -EINVAL; 2204 2205 pol = ext_hdrs[SADB_X_EXT_POLICY-1]; 2206 if (pol->sadb_x_policy_type > IPSEC_POLICY_IPSEC) 2207 return -EINVAL; 2208 if (!pol->sadb_x_policy_dir || pol->sadb_x_policy_dir >= IPSEC_DIR_MAX) 2209 return -EINVAL; 2210 2211 xp = xfrm_policy_alloc(net, GFP_KERNEL); 2212 if (xp == NULL) 2213 return -ENOBUFS; 2214 2215 xp->action = (pol->sadb_x_policy_type == IPSEC_POLICY_DISCARD ? 2216 XFRM_POLICY_BLOCK : XFRM_POLICY_ALLOW); 2217 xp->priority = pol->sadb_x_policy_priority; 2218 2219 sa = ext_hdrs[SADB_EXT_ADDRESS_SRC-1]; 2220 xp->family = pfkey_sadb_addr2xfrm_addr(sa, &xp->selector.saddr); 2221 xp->selector.family = xp->family; 2222 xp->selector.prefixlen_s = sa->sadb_address_prefixlen; 2223 xp->selector.proto = pfkey_proto_to_xfrm(sa->sadb_address_proto); 2224 xp->selector.sport = ((struct sockaddr_in *)(sa+1))->sin_port; 2225 if (xp->selector.sport) 2226 xp->selector.sport_mask = htons(0xffff); 2227 2228 sa = ext_hdrs[SADB_EXT_ADDRESS_DST-1]; 2229 pfkey_sadb_addr2xfrm_addr(sa, &xp->selector.daddr); 2230 xp->selector.prefixlen_d = sa->sadb_address_prefixlen; 2231 2232 /* Amusing, we set this twice. KAME apps appear to set same value 2233 * in both addresses. 2234 */ 2235 xp->selector.proto = pfkey_proto_to_xfrm(sa->sadb_address_proto); 2236 2237 xp->selector.dport = ((struct sockaddr_in *)(sa+1))->sin_port; 2238 if (xp->selector.dport) 2239 xp->selector.dport_mask = htons(0xffff); 2240 2241 sec_ctx = ext_hdrs[SADB_X_EXT_SEC_CTX - 1]; 2242 if (sec_ctx != NULL) { 2243 struct xfrm_user_sec_ctx *uctx = pfkey_sadb2xfrm_user_sec_ctx(sec_ctx, GFP_KERNEL); 2244 2245 if (!uctx) { 2246 err = -ENOBUFS; 2247 goto out; 2248 } 2249 2250 err = security_xfrm_policy_alloc(&xp->security, uctx, GFP_KERNEL); 2251 kfree(uctx); 2252 2253 if (err) 2254 goto out; 2255 } 2256 2257 xp->lft.soft_byte_limit = XFRM_INF; 2258 xp->lft.hard_byte_limit = XFRM_INF; 2259 xp->lft.soft_packet_limit = XFRM_INF; 2260 xp->lft.hard_packet_limit = XFRM_INF; 2261 if ((lifetime = ext_hdrs[SADB_EXT_LIFETIME_HARD-1]) != NULL) { 2262 xp->lft.hard_packet_limit = _KEY2X(lifetime->sadb_lifetime_allocations); 2263 xp->lft.hard_byte_limit = _KEY2X(lifetime->sadb_lifetime_bytes); 2264 xp->lft.hard_add_expires_seconds = lifetime->sadb_lifetime_addtime; 2265 xp->lft.hard_use_expires_seconds = lifetime->sadb_lifetime_usetime; 2266 } 2267 if ((lifetime = ext_hdrs[SADB_EXT_LIFETIME_SOFT-1]) != NULL) { 2268 xp->lft.soft_packet_limit = _KEY2X(lifetime->sadb_lifetime_allocations); 2269 xp->lft.soft_byte_limit = _KEY2X(lifetime->sadb_lifetime_bytes); 2270 xp->lft.soft_add_expires_seconds = lifetime->sadb_lifetime_addtime; 2271 xp->lft.soft_use_expires_seconds = lifetime->sadb_lifetime_usetime; 2272 } 2273 xp->xfrm_nr = 0; 2274 if (pol->sadb_x_policy_type == IPSEC_POLICY_IPSEC && 2275 (err = parse_ipsecrequests(xp, pol)) < 0) 2276 goto out; 2277 2278 err = xfrm_policy_insert(pol->sadb_x_policy_dir-1, xp, 2279 hdr->sadb_msg_type != SADB_X_SPDUPDATE); 2280 2281 xfrm_audit_policy_add(xp, err ? 0 : 1, true); 2282 2283 if (err) 2284 goto out; 2285 2286 if (hdr->sadb_msg_type == SADB_X_SPDUPDATE) 2287 c.event = XFRM_MSG_UPDPOLICY; 2288 else 2289 c.event = XFRM_MSG_NEWPOLICY; 2290 2291 c.seq = hdr->sadb_msg_seq; 2292 c.portid = hdr->sadb_msg_pid; 2293 2294 km_policy_notify(xp, pol->sadb_x_policy_dir-1, &c); 2295 xfrm_pol_put(xp); 2296 return 0; 2297 2298out: 2299 xp->walk.dead = 1; 2300 xfrm_policy_destroy(xp); 2301 return err; 2302} 2303 2304static int pfkey_spddelete(struct sock *sk, struct sk_buff *skb, const struct sadb_msg *hdr, void * const *ext_hdrs) 2305{ 2306 struct net *net = sock_net(sk); 2307 int err; 2308 struct sadb_address *sa; 2309 struct sadb_x_policy *pol; 2310 struct xfrm_policy *xp; 2311 struct xfrm_selector sel; 2312 struct km_event c; 2313 struct sadb_x_sec_ctx *sec_ctx; 2314 struct xfrm_sec_ctx *pol_ctx = NULL; 2315 2316 if (!present_and_same_family(ext_hdrs[SADB_EXT_ADDRESS_SRC-1], 2317 ext_hdrs[SADB_EXT_ADDRESS_DST-1]) || 2318 !ext_hdrs[SADB_X_EXT_POLICY-1]) 2319 return -EINVAL; 2320 2321 pol = ext_hdrs[SADB_X_EXT_POLICY-1]; 2322 if (!pol->sadb_x_policy_dir || pol->sadb_x_policy_dir >= IPSEC_DIR_MAX) 2323 return -EINVAL; 2324 2325 memset(&sel, 0, sizeof(sel)); 2326 2327 sa = ext_hdrs[SADB_EXT_ADDRESS_SRC-1]; 2328 sel.family = pfkey_sadb_addr2xfrm_addr(sa, &sel.saddr); 2329 sel.prefixlen_s = sa->sadb_address_prefixlen; 2330 sel.proto = pfkey_proto_to_xfrm(sa->sadb_address_proto); 2331 sel.sport = ((struct sockaddr_in *)(sa+1))->sin_port; 2332 if (sel.sport) 2333 sel.sport_mask = htons(0xffff); 2334 2335 sa = ext_hdrs[SADB_EXT_ADDRESS_DST-1]; 2336 pfkey_sadb_addr2xfrm_addr(sa, &sel.daddr); 2337 sel.prefixlen_d = sa->sadb_address_prefixlen; 2338 sel.proto = pfkey_proto_to_xfrm(sa->sadb_address_proto); 2339 sel.dport = ((struct sockaddr_in *)(sa+1))->sin_port; 2340 if (sel.dport) 2341 sel.dport_mask = htons(0xffff); 2342 2343 sec_ctx = ext_hdrs[SADB_X_EXT_SEC_CTX - 1]; 2344 if (sec_ctx != NULL) { 2345 struct xfrm_user_sec_ctx *uctx = pfkey_sadb2xfrm_user_sec_ctx(sec_ctx, GFP_KERNEL); 2346 2347 if (!uctx) 2348 return -ENOMEM; 2349 2350 err = security_xfrm_policy_alloc(&pol_ctx, uctx, GFP_KERNEL); 2351 kfree(uctx); 2352 if (err) 2353 return err; 2354 } 2355 2356 xp = xfrm_policy_bysel_ctx(net, DUMMY_MARK, XFRM_POLICY_TYPE_MAIN, 2357 pol->sadb_x_policy_dir - 1, &sel, pol_ctx, 2358 1, &err); 2359 security_xfrm_policy_free(pol_ctx); 2360 if (xp == NULL) 2361 return -ENOENT; 2362 2363 xfrm_audit_policy_delete(xp, err ? 0 : 1, true); 2364 2365 if (err) 2366 goto out; 2367 2368 c.seq = hdr->sadb_msg_seq; 2369 c.portid = hdr->sadb_msg_pid; 2370 c.data.byid = 0; 2371 c.event = XFRM_MSG_DELPOLICY; 2372 km_policy_notify(xp, pol->sadb_x_policy_dir-1, &c); 2373 2374out: 2375 xfrm_pol_put(xp); 2376 if (err == 0) 2377 xfrm_garbage_collect(net); 2378 return err; 2379} 2380 2381static int key_pol_get_resp(struct sock *sk, struct xfrm_policy *xp, const struct sadb_msg *hdr, int dir) 2382{ 2383 int err; 2384 struct sk_buff *out_skb; 2385 struct sadb_msg *out_hdr; 2386 err = 0; 2387 2388 out_skb = pfkey_xfrm_policy2msg_prep(xp); 2389 if (IS_ERR(out_skb)) { 2390 err = PTR_ERR(out_skb); 2391 goto out; 2392 } 2393 err = pfkey_xfrm_policy2msg(out_skb, xp, dir); 2394 if (err < 0) 2395 goto out; 2396 2397 out_hdr = (struct sadb_msg *) out_skb->data; 2398 out_hdr->sadb_msg_version = hdr->sadb_msg_version; 2399 out_hdr->sadb_msg_type = hdr->sadb_msg_type; 2400 out_hdr->sadb_msg_satype = 0; 2401 out_hdr->sadb_msg_errno = 0; 2402 out_hdr->sadb_msg_seq = hdr->sadb_msg_seq; 2403 out_hdr->sadb_msg_pid = hdr->sadb_msg_pid; 2404 pfkey_broadcast(out_skb, BROADCAST_ONE, sk, xp_net(xp)); 2405 err = 0; 2406 2407out: 2408 return err; 2409} 2410 2411#ifdef CONFIG_NET_KEY_MIGRATE 2412static int pfkey_sockaddr_pair_size(sa_family_t family) 2413{ 2414 return PFKEY_ALIGN8(pfkey_sockaddr_len(family) * 2); 2415} 2416 2417static int parse_sockaddr_pair(struct sockaddr *sa, int ext_len, 2418 xfrm_address_t *saddr, xfrm_address_t *daddr, 2419 u16 *family) 2420{ 2421 int af, socklen; 2422 2423 if (ext_len < pfkey_sockaddr_pair_size(sa->sa_family)) 2424 return -EINVAL; 2425 2426 af = pfkey_sockaddr_extract(sa, saddr); 2427 if (!af) 2428 return -EINVAL; 2429 2430 socklen = pfkey_sockaddr_len(af); 2431 if (pfkey_sockaddr_extract((struct sockaddr *) (((u8 *)sa) + socklen), 2432 daddr) != af) 2433 return -EINVAL; 2434 2435 *family = af; 2436 return 0; 2437} 2438 2439static int ipsecrequests_to_migrate(struct sadb_x_ipsecrequest *rq1, int len, 2440 struct xfrm_migrate *m) 2441{ 2442 int err; 2443 struct sadb_x_ipsecrequest *rq2; 2444 int mode; 2445 2446 if (len <= sizeof(struct sadb_x_ipsecrequest) || 2447 len < rq1->sadb_x_ipsecrequest_len) 2448 return -EINVAL; 2449 2450 /* old endoints */ 2451 err = parse_sockaddr_pair((struct sockaddr *)(rq1 + 1), 2452 rq1->sadb_x_ipsecrequest_len, 2453 &m->old_saddr, &m->old_daddr, 2454 &m->old_family); 2455 if (err) 2456 return err; 2457 2458 rq2 = (struct sadb_x_ipsecrequest *)((u8 *)rq1 + rq1->sadb_x_ipsecrequest_len); 2459 len -= rq1->sadb_x_ipsecrequest_len; 2460 2461 if (len <= sizeof(struct sadb_x_ipsecrequest) || 2462 len < rq2->sadb_x_ipsecrequest_len) 2463 return -EINVAL; 2464 2465 /* new endpoints */ 2466 err = parse_sockaddr_pair((struct sockaddr *)(rq2 + 1), 2467 rq2->sadb_x_ipsecrequest_len, 2468 &m->new_saddr, &m->new_daddr, 2469 &m->new_family); 2470 if (err) 2471 return err; 2472 2473 if (rq1->sadb_x_ipsecrequest_proto != rq2->sadb_x_ipsecrequest_proto || 2474 rq1->sadb_x_ipsecrequest_mode != rq2->sadb_x_ipsecrequest_mode || 2475 rq1->sadb_x_ipsecrequest_reqid != rq2->sadb_x_ipsecrequest_reqid) 2476 return -EINVAL; 2477 2478 m->proto = rq1->sadb_x_ipsecrequest_proto; 2479 if ((mode = pfkey_mode_to_xfrm(rq1->sadb_x_ipsecrequest_mode)) < 0) 2480 return -EINVAL; 2481 m->mode = mode; 2482 m->reqid = rq1->sadb_x_ipsecrequest_reqid; 2483 2484 return ((int)(rq1->sadb_x_ipsecrequest_len + 2485 rq2->sadb_x_ipsecrequest_len)); 2486} 2487 2488static int pfkey_migrate(struct sock *sk, struct sk_buff *skb, 2489 const struct sadb_msg *hdr, void * const *ext_hdrs) 2490{ 2491 int i, len, ret, err = -EINVAL; 2492 u8 dir; 2493 struct sadb_address *sa; 2494 struct sadb_x_kmaddress *kma; 2495 struct sadb_x_policy *pol; 2496 struct sadb_x_ipsecrequest *rq; 2497 struct xfrm_selector sel; 2498 struct xfrm_migrate m[XFRM_MAX_DEPTH]; 2499 struct xfrm_kmaddress k; 2500 struct net *net = sock_net(sk); 2501 2502 if (!present_and_same_family(ext_hdrs[SADB_EXT_ADDRESS_SRC - 1], 2503 ext_hdrs[SADB_EXT_ADDRESS_DST - 1]) || 2504 !ext_hdrs[SADB_X_EXT_POLICY - 1]) { 2505 err = -EINVAL; 2506 goto out; 2507 } 2508 2509 kma = ext_hdrs[SADB_X_EXT_KMADDRESS - 1]; 2510 pol = ext_hdrs[SADB_X_EXT_POLICY - 1]; 2511 2512 if (pol->sadb_x_policy_dir >= IPSEC_DIR_MAX) { 2513 err = -EINVAL; 2514 goto out; 2515 } 2516 2517 if (kma) { 2518 /* convert sadb_x_kmaddress to xfrm_kmaddress */ 2519 k.reserved = kma->sadb_x_kmaddress_reserved; 2520 ret = parse_sockaddr_pair((struct sockaddr *)(kma + 1), 2521 8*(kma->sadb_x_kmaddress_len) - sizeof(*kma), 2522 &k.local, &k.remote, &k.family); 2523 if (ret < 0) { 2524 err = ret; 2525 goto out; 2526 } 2527 } 2528 2529 dir = pol->sadb_x_policy_dir - 1; 2530 memset(&sel, 0, sizeof(sel)); 2531 2532 /* set source address info of selector */ 2533 sa = ext_hdrs[SADB_EXT_ADDRESS_SRC - 1]; 2534 sel.family = pfkey_sadb_addr2xfrm_addr(sa, &sel.saddr); 2535 sel.prefixlen_s = sa->sadb_address_prefixlen; 2536 sel.proto = pfkey_proto_to_xfrm(sa->sadb_address_proto); 2537 sel.sport = ((struct sockaddr_in *)(sa + 1))->sin_port; 2538 if (sel.sport) 2539 sel.sport_mask = htons(0xffff); 2540 2541 /* set destination address info of selector */ 2542 sa = ext_hdrs[SADB_EXT_ADDRESS_DST - 1]; 2543 pfkey_sadb_addr2xfrm_addr(sa, &sel.daddr); 2544 sel.prefixlen_d = sa->sadb_address_prefixlen; 2545 sel.proto = pfkey_proto_to_xfrm(sa->sadb_address_proto); 2546 sel.dport = ((struct sockaddr_in *)(sa + 1))->sin_port; 2547 if (sel.dport) 2548 sel.dport_mask = htons(0xffff); 2549 2550 rq = (struct sadb_x_ipsecrequest *)(pol + 1); 2551 2552 /* extract ipsecrequests */ 2553 i = 0; 2554 len = pol->sadb_x_policy_len * 8 - sizeof(struct sadb_x_policy); 2555 2556 while (len > 0 && i < XFRM_MAX_DEPTH) { 2557 ret = ipsecrequests_to_migrate(rq, len, &m[i]); 2558 if (ret < 0) { 2559 err = ret; 2560 goto out; 2561 } else { 2562 rq = (struct sadb_x_ipsecrequest *)((u8 *)rq + ret); 2563 len -= ret; 2564 i++; 2565 } 2566 } 2567 2568 if (!i || len > 0) { 2569 err = -EINVAL; 2570 goto out; 2571 } 2572 2573 return xfrm_migrate(&sel, dir, XFRM_POLICY_TYPE_MAIN, m, i, 2574 kma ? &k : NULL, net); 2575 2576 out: 2577 return err; 2578} 2579#else 2580static int pfkey_migrate(struct sock *sk, struct sk_buff *skb, 2581 const struct sadb_msg *hdr, void * const *ext_hdrs) 2582{ 2583 return -ENOPROTOOPT; 2584} 2585#endif 2586 2587 2588static int pfkey_spdget(struct sock *sk, struct sk_buff *skb, const struct sadb_msg *hdr, void * const *ext_hdrs) 2589{ 2590 struct net *net = sock_net(sk); 2591 unsigned int dir; 2592 int err = 0, delete; 2593 struct sadb_x_policy *pol; 2594 struct xfrm_policy *xp; 2595 struct km_event c; 2596 2597 if ((pol = ext_hdrs[SADB_X_EXT_POLICY-1]) == NULL) 2598 return -EINVAL; 2599 2600 dir = xfrm_policy_id2dir(pol->sadb_x_policy_id); 2601 if (dir >= XFRM_POLICY_MAX) 2602 return -EINVAL; 2603 2604 delete = (hdr->sadb_msg_type == SADB_X_SPDDELETE2); 2605 xp = xfrm_policy_byid(net, DUMMY_MARK, XFRM_POLICY_TYPE_MAIN, 2606 dir, pol->sadb_x_policy_id, delete, &err); 2607 if (xp == NULL) 2608 return -ENOENT; 2609 2610 if (delete) { 2611 xfrm_audit_policy_delete(xp, err ? 0 : 1, true); 2612 2613 if (err) 2614 goto out; 2615 c.seq = hdr->sadb_msg_seq; 2616 c.portid = hdr->sadb_msg_pid; 2617 c.data.byid = 1; 2618 c.event = XFRM_MSG_DELPOLICY; 2619 km_policy_notify(xp, dir, &c); 2620 } else { 2621 err = key_pol_get_resp(sk, xp, hdr, dir); 2622 } 2623 2624out: 2625 xfrm_pol_put(xp); 2626 if (delete && err == 0) 2627 xfrm_garbage_collect(net); 2628 return err; 2629} 2630 2631static int dump_sp(struct xfrm_policy *xp, int dir, int count, void *ptr) 2632{ 2633 struct pfkey_sock *pfk = ptr; 2634 struct sk_buff *out_skb; 2635 struct sadb_msg *out_hdr; 2636 int err; 2637 2638 if (!pfkey_can_dump(&pfk->sk)) 2639 return -ENOBUFS; 2640 2641 out_skb = pfkey_xfrm_policy2msg_prep(xp); 2642 if (IS_ERR(out_skb)) 2643 return PTR_ERR(out_skb); 2644 2645 err = pfkey_xfrm_policy2msg(out_skb, xp, dir); 2646 if (err < 0) 2647 return err; 2648 2649 out_hdr = (struct sadb_msg *) out_skb->data; 2650 out_hdr->sadb_msg_version = pfk->dump.msg_version; 2651 out_hdr->sadb_msg_type = SADB_X_SPDDUMP; 2652 out_hdr->sadb_msg_satype = SADB_SATYPE_UNSPEC; 2653 out_hdr->sadb_msg_errno = 0; 2654 out_hdr->sadb_msg_seq = count + 1; 2655 out_hdr->sadb_msg_pid = pfk->dump.msg_portid; 2656 2657 if (pfk->dump.skb) 2658 pfkey_broadcast(pfk->dump.skb, BROADCAST_ONE, 2659 &pfk->sk, sock_net(&pfk->sk)); 2660 pfk->dump.skb = out_skb; 2661 2662 return 0; 2663} 2664 2665static int pfkey_dump_sp(struct pfkey_sock *pfk) 2666{ 2667 struct net *net = sock_net(&pfk->sk); 2668 return xfrm_policy_walk(net, &pfk->dump.u.policy, dump_sp, (void *) pfk); 2669} 2670 2671static void pfkey_dump_sp_done(struct pfkey_sock *pfk) 2672{ 2673 struct net *net = sock_net((struct sock *)pfk); 2674 2675 xfrm_policy_walk_done(&pfk->dump.u.policy, net); 2676} 2677 2678static int pfkey_spddump(struct sock *sk, struct sk_buff *skb, const struct sadb_msg *hdr, void * const *ext_hdrs) 2679{ 2680 struct pfkey_sock *pfk = pfkey_sk(sk); 2681 2682 if (pfk->dump.dump != NULL) 2683 return -EBUSY; 2684 2685 pfk->dump.msg_version = hdr->sadb_msg_version; 2686 pfk->dump.msg_portid = hdr->sadb_msg_pid; 2687 pfk->dump.dump = pfkey_dump_sp; 2688 pfk->dump.done = pfkey_dump_sp_done; 2689 xfrm_policy_walk_init(&pfk->dump.u.policy, XFRM_POLICY_TYPE_MAIN); 2690 2691 return pfkey_do_dump(pfk); 2692} 2693 2694static int key_notify_policy_flush(const struct km_event *c) 2695{ 2696 struct sk_buff *skb_out; 2697 struct sadb_msg *hdr; 2698 2699 skb_out = alloc_skb(sizeof(struct sadb_msg) + 16, GFP_ATOMIC); 2700 if (!skb_out) 2701 return -ENOBUFS; 2702 hdr = (struct sadb_msg *) skb_put(skb_out, sizeof(struct sadb_msg)); 2703 hdr->sadb_msg_type = SADB_X_SPDFLUSH; 2704 hdr->sadb_msg_seq = c->seq; 2705 hdr->sadb_msg_pid = c->portid; 2706 hdr->sadb_msg_version = PF_KEY_V2; 2707 hdr->sadb_msg_errno = (uint8_t) 0; 2708 hdr->sadb_msg_satype = SADB_SATYPE_UNSPEC; 2709 hdr->sadb_msg_len = (sizeof(struct sadb_msg) / sizeof(uint64_t)); 2710 hdr->sadb_msg_reserved = 0; 2711 pfkey_broadcast(skb_out, BROADCAST_ALL, NULL, c->net); 2712 return 0; 2713 2714} 2715 2716static int pfkey_spdflush(struct sock *sk, struct sk_buff *skb, const struct sadb_msg *hdr, void * const *ext_hdrs) 2717{ 2718 struct net *net = sock_net(sk); 2719 struct km_event c; 2720 int err, err2; 2721 2722 err = xfrm_policy_flush(net, XFRM_POLICY_TYPE_MAIN, true); 2723 err2 = unicast_flush_resp(sk, hdr); 2724 if (err || err2) { 2725 if (err == -ESRCH) /* empty table - old silent behavior */ 2726 return 0; 2727 return err; 2728 } 2729 2730 c.data.type = XFRM_POLICY_TYPE_MAIN; 2731 c.event = XFRM_MSG_FLUSHPOLICY; 2732 c.portid = hdr->sadb_msg_pid; 2733 c.seq = hdr->sadb_msg_seq; 2734 c.net = net; 2735 km_policy_notify(NULL, 0, &c); 2736 2737 return 0; 2738} 2739 2740typedef int (*pfkey_handler)(struct sock *sk, struct sk_buff *skb, 2741 const struct sadb_msg *hdr, void * const *ext_hdrs); 2742static const pfkey_handler pfkey_funcs[SADB_MAX + 1] = { 2743 [SADB_RESERVED] = pfkey_reserved, 2744 [SADB_GETSPI] = pfkey_getspi, 2745 [SADB_UPDATE] = pfkey_add, 2746 [SADB_ADD] = pfkey_add, 2747 [SADB_DELETE] = pfkey_delete, 2748 [SADB_GET] = pfkey_get, 2749 [SADB_ACQUIRE] = pfkey_acquire, 2750 [SADB_REGISTER] = pfkey_register, 2751 [SADB_EXPIRE] = NULL, 2752 [SADB_FLUSH] = pfkey_flush, 2753 [SADB_DUMP] = pfkey_dump, 2754 [SADB_X_PROMISC] = pfkey_promisc, 2755 [SADB_X_PCHANGE] = NULL, 2756 [SADB_X_SPDUPDATE] = pfkey_spdadd, 2757 [SADB_X_SPDADD] = pfkey_spdadd, 2758 [SADB_X_SPDDELETE] = pfkey_spddelete, 2759 [SADB_X_SPDGET] = pfkey_spdget, 2760 [SADB_X_SPDACQUIRE] = NULL, 2761 [SADB_X_SPDDUMP] = pfkey_spddump, 2762 [SADB_X_SPDFLUSH] = pfkey_spdflush, 2763 [SADB_X_SPDSETIDX] = pfkey_spdadd, 2764 [SADB_X_SPDDELETE2] = pfkey_spdget, 2765 [SADB_X_MIGRATE] = pfkey_migrate, 2766}; 2767 2768static int pfkey_process(struct sock *sk, struct sk_buff *skb, const struct sadb_msg *hdr) 2769{ 2770 void *ext_hdrs[SADB_EXT_MAX]; 2771 int err; 2772 2773 pfkey_broadcast(skb_clone(skb, GFP_KERNEL), 2774 BROADCAST_PROMISC_ONLY, NULL, sock_net(sk)); 2775 2776 memset(ext_hdrs, 0, sizeof(ext_hdrs)); 2777 err = parse_exthdrs(skb, hdr, ext_hdrs); 2778 if (!err) { 2779 err = -EOPNOTSUPP; 2780 if (pfkey_funcs[hdr->sadb_msg_type]) 2781 err = pfkey_funcs[hdr->sadb_msg_type](sk, skb, hdr, ext_hdrs); 2782 } 2783 return err; 2784} 2785 2786static struct sadb_msg *pfkey_get_base_msg(struct sk_buff *skb, int *errp) 2787{ 2788 struct sadb_msg *hdr = NULL; 2789 2790 if (skb->len < sizeof(*hdr)) { 2791 *errp = -EMSGSIZE; 2792 } else { 2793 hdr = (struct sadb_msg *) skb->data; 2794 if (hdr->sadb_msg_version != PF_KEY_V2 || 2795 hdr->sadb_msg_reserved != 0 || 2796 (hdr->sadb_msg_type <= SADB_RESERVED || 2797 hdr->sadb_msg_type > SADB_MAX)) { 2798 hdr = NULL; 2799 *errp = -EINVAL; 2800 } else if (hdr->sadb_msg_len != (skb->len / 2801 sizeof(uint64_t)) || 2802 hdr->sadb_msg_len < (sizeof(struct sadb_msg) / 2803 sizeof(uint64_t))) { 2804 hdr = NULL; 2805 *errp = -EMSGSIZE; 2806 } else { 2807 *errp = 0; 2808 } 2809 } 2810 return hdr; 2811} 2812 2813static inline int aalg_tmpl_set(const struct xfrm_tmpl *t, 2814 const struct xfrm_algo_desc *d) 2815{ 2816 unsigned int id = d->desc.sadb_alg_id; 2817 2818 if (id >= sizeof(t->aalgos) * 8) 2819 return 0; 2820 2821 return (t->aalgos >> id) & 1; 2822} 2823 2824static inline int ealg_tmpl_set(const struct xfrm_tmpl *t, 2825 const struct xfrm_algo_desc *d) 2826{ 2827 unsigned int id = d->desc.sadb_alg_id; 2828 2829 if (id >= sizeof(t->ealgos) * 8) 2830 return 0; 2831 2832 return (t->ealgos >> id) & 1; 2833} 2834 2835static int count_ah_combs(const struct xfrm_tmpl *t) 2836{ 2837 int i, sz = 0; 2838 2839 for (i = 0; ; i++) { 2840 const struct xfrm_algo_desc *aalg = xfrm_aalg_get_byidx(i); 2841 if (!aalg) 2842 break; 2843 if (!aalg->pfkey_supported) 2844 continue; 2845 if (aalg_tmpl_set(t, aalg) && aalg->available) 2846 sz += sizeof(struct sadb_comb); 2847 } 2848 return sz + sizeof(struct sadb_prop); 2849} 2850 2851static int count_esp_combs(const struct xfrm_tmpl *t) 2852{ 2853 int i, k, sz = 0; 2854 2855 for (i = 0; ; i++) { 2856 const struct xfrm_algo_desc *ealg = xfrm_ealg_get_byidx(i); 2857 if (!ealg) 2858 break; 2859 2860 if (!ealg->pfkey_supported) 2861 continue; 2862 2863 if (!(ealg_tmpl_set(t, ealg) && ealg->available)) 2864 continue; 2865 2866 for (k = 1; ; k++) { 2867 const struct xfrm_algo_desc *aalg = xfrm_aalg_get_byidx(k); 2868 if (!aalg) 2869 break; 2870 2871 if (!aalg->pfkey_supported) 2872 continue; 2873 2874 if (aalg_tmpl_set(t, aalg) && aalg->available) 2875 sz += sizeof(struct sadb_comb); 2876 } 2877 } 2878 return sz + sizeof(struct sadb_prop); 2879} 2880 2881static void dump_ah_combs(struct sk_buff *skb, const struct xfrm_tmpl *t) 2882{ 2883 struct sadb_prop *p; 2884 int i; 2885 2886 p = (struct sadb_prop*)skb_put(skb, sizeof(struct sadb_prop)); 2887 p->sadb_prop_len = sizeof(struct sadb_prop)/8; 2888 p->sadb_prop_exttype = SADB_EXT_PROPOSAL; 2889 p->sadb_prop_replay = 32; 2890 memset(p->sadb_prop_reserved, 0, sizeof(p->sadb_prop_reserved)); 2891 2892 for (i = 0; ; i++) { 2893 const struct xfrm_algo_desc *aalg = xfrm_aalg_get_byidx(i); 2894 if (!aalg) 2895 break; 2896 2897 if (!aalg->pfkey_supported) 2898 continue; 2899 2900 if (aalg_tmpl_set(t, aalg) && aalg->available) { 2901 struct sadb_comb *c; 2902 c = (struct sadb_comb*)skb_put(skb, sizeof(struct sadb_comb)); 2903 memset(c, 0, sizeof(*c)); 2904 p->sadb_prop_len += sizeof(struct sadb_comb)/8; 2905 c->sadb_comb_auth = aalg->desc.sadb_alg_id; 2906 c->sadb_comb_auth_minbits = aalg->desc.sadb_alg_minbits; 2907 c->sadb_comb_auth_maxbits = aalg->desc.sadb_alg_maxbits; 2908 c->sadb_comb_hard_addtime = 24*60*60; 2909 c->sadb_comb_soft_addtime = 20*60*60; 2910 c->sadb_comb_hard_usetime = 8*60*60; 2911 c->sadb_comb_soft_usetime = 7*60*60; 2912 } 2913 } 2914} 2915 2916static void dump_esp_combs(struct sk_buff *skb, const struct xfrm_tmpl *t) 2917{ 2918 struct sadb_prop *p; 2919 int i, k; 2920 2921 p = (struct sadb_prop*)skb_put(skb, sizeof(struct sadb_prop)); 2922 p->sadb_prop_len = sizeof(struct sadb_prop)/8; 2923 p->sadb_prop_exttype = SADB_EXT_PROPOSAL; 2924 p->sadb_prop_replay = 32; 2925 memset(p->sadb_prop_reserved, 0, sizeof(p->sadb_prop_reserved)); 2926 2927 for (i=0; ; i++) { 2928 const struct xfrm_algo_desc *ealg = xfrm_ealg_get_byidx(i); 2929 if (!ealg) 2930 break; 2931 2932 if (!ealg->pfkey_supported) 2933 continue; 2934 2935 if (!(ealg_tmpl_set(t, ealg) && ealg->available)) 2936 continue; 2937 2938 for (k = 1; ; k++) { 2939 struct sadb_comb *c; 2940 const struct xfrm_algo_desc *aalg = xfrm_aalg_get_byidx(k); 2941 if (!aalg) 2942 break; 2943 if (!aalg->pfkey_supported) 2944 continue; 2945 if (!(aalg_tmpl_set(t, aalg) && aalg->available)) 2946 continue; 2947 c = (struct sadb_comb*)skb_put(skb, sizeof(struct sadb_comb)); 2948 memset(c, 0, sizeof(*c)); 2949 p->sadb_prop_len += sizeof(struct sadb_comb)/8; 2950 c->sadb_comb_auth = aalg->desc.sadb_alg_id; 2951 c->sadb_comb_auth_minbits = aalg->desc.sadb_alg_minbits; 2952 c->sadb_comb_auth_maxbits = aalg->desc.sadb_alg_maxbits; 2953 c->sadb_comb_encrypt = ealg->desc.sadb_alg_id; 2954 c->sadb_comb_encrypt_minbits = ealg->desc.sadb_alg_minbits; 2955 c->sadb_comb_encrypt_maxbits = ealg->desc.sadb_alg_maxbits; 2956 c->sadb_comb_hard_addtime = 24*60*60; 2957 c->sadb_comb_soft_addtime = 20*60*60; 2958 c->sadb_comb_hard_usetime = 8*60*60; 2959 c->sadb_comb_soft_usetime = 7*60*60; 2960 } 2961 } 2962} 2963 2964static int key_notify_policy_expire(struct xfrm_policy *xp, const struct km_event *c) 2965{ 2966 return 0; 2967} 2968 2969static int key_notify_sa_expire(struct xfrm_state *x, const struct km_event *c) 2970{ 2971 struct sk_buff *out_skb; 2972 struct sadb_msg *out_hdr; 2973 int hard; 2974 int hsc; 2975 2976 hard = c->data.hard; 2977 if (hard) 2978 hsc = 2; 2979 else 2980 hsc = 1; 2981 2982 out_skb = pfkey_xfrm_state2msg_expire(x, hsc); 2983 if (IS_ERR(out_skb)) 2984 return PTR_ERR(out_skb); 2985 2986 out_hdr = (struct sadb_msg *) out_skb->data; 2987 out_hdr->sadb_msg_version = PF_KEY_V2; 2988 out_hdr->sadb_msg_type = SADB_EXPIRE; 2989 out_hdr->sadb_msg_satype = pfkey_proto2satype(x->id.proto); 2990 out_hdr->sadb_msg_errno = 0; 2991 out_hdr->sadb_msg_reserved = 0; 2992 out_hdr->sadb_msg_seq = 0; 2993 out_hdr->sadb_msg_pid = 0; 2994 2995 pfkey_broadcast(out_skb, BROADCAST_REGISTERED, NULL, xs_net(x)); 2996 return 0; 2997} 2998 2999static int pfkey_send_notify(struct xfrm_state *x, const struct km_event *c) 3000{ 3001 struct net *net = x ? xs_net(x) : c->net; 3002 struct netns_pfkey *net_pfkey = net_generic(net, pfkey_net_id); 3003 3004 if (atomic_read(&net_pfkey->socks_nr) == 0) 3005 return 0; 3006 3007 switch (c->event) { 3008 case XFRM_MSG_EXPIRE: 3009 return key_notify_sa_expire(x, c); 3010 case XFRM_MSG_DELSA: 3011 case XFRM_MSG_NEWSA: 3012 case XFRM_MSG_UPDSA: 3013 return key_notify_sa(x, c); 3014 case XFRM_MSG_FLUSHSA: 3015 return key_notify_sa_flush(c); 3016 case XFRM_MSG_NEWAE: /* not yet supported */ 3017 break; 3018 default: 3019 pr_err("pfkey: Unknown SA event %d\n", c->event); 3020 break; 3021 } 3022 3023 return 0; 3024} 3025 3026static int pfkey_send_policy_notify(struct xfrm_policy *xp, int dir, const struct km_event *c) 3027{ 3028 if (xp && xp->type != XFRM_POLICY_TYPE_MAIN) 3029 return 0; 3030 3031 switch (c->event) { 3032 case XFRM_MSG_POLEXPIRE: 3033 return key_notify_policy_expire(xp, c); 3034 case XFRM_MSG_DELPOLICY: 3035 case XFRM_MSG_NEWPOLICY: 3036 case XFRM_MSG_UPDPOLICY: 3037 return key_notify_policy(xp, dir, c); 3038 case XFRM_MSG_FLUSHPOLICY: 3039 if (c->data.type != XFRM_POLICY_TYPE_MAIN) 3040 break; 3041 return key_notify_policy_flush(c); 3042 default: 3043 pr_err("pfkey: Unknown policy event %d\n", c->event); 3044 break; 3045 } 3046 3047 return 0; 3048} 3049 3050static u32 get_acqseq(void) 3051{ 3052 u32 res; 3053 static atomic_t acqseq; 3054 3055 do { 3056 res = atomic_inc_return(&acqseq); 3057 } while (!res); 3058 return res; 3059} 3060 3061static bool pfkey_is_alive(const struct km_event *c) 3062{ 3063 struct netns_pfkey *net_pfkey = net_generic(c->net, pfkey_net_id); 3064 struct sock *sk; 3065 bool is_alive = false; 3066 3067 rcu_read_lock(); 3068 sk_for_each_rcu(sk, &net_pfkey->table) { 3069 if (pfkey_sk(sk)->registered) { 3070 is_alive = true; 3071 break; 3072 } 3073 } 3074 rcu_read_unlock(); 3075 3076 return is_alive; 3077} 3078 3079static int pfkey_send_acquire(struct xfrm_state *x, struct xfrm_tmpl *t, struct xfrm_policy *xp) 3080{ 3081 struct sk_buff *skb; 3082 struct sadb_msg *hdr; 3083 struct sadb_address *addr; 3084 struct sadb_x_policy *pol; 3085 int sockaddr_size; 3086 int size; 3087 struct sadb_x_sec_ctx *sec_ctx; 3088 struct xfrm_sec_ctx *xfrm_ctx; 3089 int ctx_size = 0; 3090 3091 sockaddr_size = pfkey_sockaddr_size(x->props.family); 3092 if (!sockaddr_size) 3093 return -EINVAL; 3094 3095 size = sizeof(struct sadb_msg) + 3096 (sizeof(struct sadb_address) * 2) + 3097 (sockaddr_size * 2) + 3098 sizeof(struct sadb_x_policy); 3099 3100 if (x->id.proto == IPPROTO_AH) 3101 size += count_ah_combs(t); 3102 else if (x->id.proto == IPPROTO_ESP) 3103 size += count_esp_combs(t); 3104 3105 if ((xfrm_ctx = x->security)) { 3106 ctx_size = PFKEY_ALIGN8(xfrm_ctx->ctx_len); 3107 size += sizeof(struct sadb_x_sec_ctx) + ctx_size; 3108 } 3109 3110 skb = alloc_skb(size + 16, GFP_ATOMIC); 3111 if (skb == NULL) 3112 return -ENOMEM; 3113 3114 hdr = (struct sadb_msg *) skb_put(skb, sizeof(struct sadb_msg)); 3115 hdr->sadb_msg_version = PF_KEY_V2; 3116 hdr->sadb_msg_type = SADB_ACQUIRE; 3117 hdr->sadb_msg_satype = pfkey_proto2satype(x->id.proto); 3118 hdr->sadb_msg_len = size / sizeof(uint64_t); 3119 hdr->sadb_msg_errno = 0; 3120 hdr->sadb_msg_reserved = 0; 3121 hdr->sadb_msg_seq = x->km.seq = get_acqseq(); 3122 hdr->sadb_msg_pid = 0; 3123 3124 /* src address */ 3125 addr = (struct sadb_address*) skb_put(skb, 3126 sizeof(struct sadb_address)+sockaddr_size); 3127 addr->sadb_address_len = 3128 (sizeof(struct sadb_address)+sockaddr_size)/ 3129 sizeof(uint64_t); 3130 addr->sadb_address_exttype = SADB_EXT_ADDRESS_SRC; 3131 addr->sadb_address_proto = 0; 3132 addr->sadb_address_reserved = 0; 3133 addr->sadb_address_prefixlen = 3134 pfkey_sockaddr_fill(&x->props.saddr, 0, 3135 (struct sockaddr *) (addr + 1), 3136 x->props.family); 3137 if (!addr->sadb_address_prefixlen) 3138 BUG(); 3139 3140 /* dst address */ 3141 addr = (struct sadb_address*) skb_put(skb, 3142 sizeof(struct sadb_address)+sockaddr_size); 3143 addr->sadb_address_len = 3144 (sizeof(struct sadb_address)+sockaddr_size)/ 3145 sizeof(uint64_t); 3146 addr->sadb_address_exttype = SADB_EXT_ADDRESS_DST; 3147 addr->sadb_address_proto = 0; 3148 addr->sadb_address_reserved = 0; 3149 addr->sadb_address_prefixlen = 3150 pfkey_sockaddr_fill(&x->id.daddr, 0, 3151 (struct sockaddr *) (addr + 1), 3152 x->props.family); 3153 if (!addr->sadb_address_prefixlen) 3154 BUG(); 3155 3156 pol = (struct sadb_x_policy *) skb_put(skb, sizeof(struct sadb_x_policy)); 3157 pol->sadb_x_policy_len = sizeof(struct sadb_x_policy)/sizeof(uint64_t); 3158 pol->sadb_x_policy_exttype = SADB_X_EXT_POLICY; 3159 pol->sadb_x_policy_type = IPSEC_POLICY_IPSEC; 3160 pol->sadb_x_policy_dir = XFRM_POLICY_OUT + 1; 3161 pol->sadb_x_policy_reserved = 0; 3162 pol->sadb_x_policy_id = xp->index; 3163 pol->sadb_x_policy_priority = xp->priority; 3164 3165 /* Set sadb_comb's. */ 3166 if (x->id.proto == IPPROTO_AH) 3167 dump_ah_combs(skb, t); 3168 else if (x->id.proto == IPPROTO_ESP) 3169 dump_esp_combs(skb, t); 3170 3171 /* security context */ 3172 if (xfrm_ctx) { 3173 sec_ctx = (struct sadb_x_sec_ctx *) skb_put(skb, 3174 sizeof(struct sadb_x_sec_ctx) + ctx_size); 3175 sec_ctx->sadb_x_sec_len = 3176 (sizeof(struct sadb_x_sec_ctx) + ctx_size) / sizeof(uint64_t); 3177 sec_ctx->sadb_x_sec_exttype = SADB_X_EXT_SEC_CTX; 3178 sec_ctx->sadb_x_ctx_doi = xfrm_ctx->ctx_doi; 3179 sec_ctx->sadb_x_ctx_alg = xfrm_ctx->ctx_alg; 3180 sec_ctx->sadb_x_ctx_len = xfrm_ctx->ctx_len; 3181 memcpy(sec_ctx + 1, xfrm_ctx->ctx_str, 3182 xfrm_ctx->ctx_len); 3183 } 3184 3185 return pfkey_broadcast(skb, BROADCAST_REGISTERED, NULL, xs_net(x)); 3186} 3187 3188static struct xfrm_policy *pfkey_compile_policy(struct sock *sk, int opt, 3189 u8 *data, int len, int *dir) 3190{ 3191 struct net *net = sock_net(sk); 3192 struct xfrm_policy *xp; 3193 struct sadb_x_policy *pol = (struct sadb_x_policy*)data; 3194 struct sadb_x_sec_ctx *sec_ctx; 3195 3196 switch (sk->sk_family) { 3197 case AF_INET: 3198 if (opt != IP_IPSEC_POLICY) { 3199 *dir = -EOPNOTSUPP; 3200 return NULL; 3201 } 3202 break; 3203#if IS_ENABLED(CONFIG_IPV6) 3204 case AF_INET6: 3205 if (opt != IPV6_IPSEC_POLICY) { 3206 *dir = -EOPNOTSUPP; 3207 return NULL; 3208 } 3209 break; 3210#endif 3211 default: 3212 *dir = -EINVAL; 3213 return NULL; 3214 } 3215 3216 *dir = -EINVAL; 3217 3218 if (len < sizeof(struct sadb_x_policy) || 3219 pol->sadb_x_policy_len*8 > len || 3220 pol->sadb_x_policy_type > IPSEC_POLICY_BYPASS || 3221 (!pol->sadb_x_policy_dir || pol->sadb_x_policy_dir > IPSEC_DIR_OUTBOUND)) 3222 return NULL; 3223 3224 xp = xfrm_policy_alloc(net, GFP_ATOMIC); 3225 if (xp == NULL) { 3226 *dir = -ENOBUFS; 3227 return NULL; 3228 } 3229 3230 xp->action = (pol->sadb_x_policy_type == IPSEC_POLICY_DISCARD ? 3231 XFRM_POLICY_BLOCK : XFRM_POLICY_ALLOW); 3232 3233 xp->lft.soft_byte_limit = XFRM_INF; 3234 xp->lft.hard_byte_limit = XFRM_INF; 3235 xp->lft.soft_packet_limit = XFRM_INF; 3236 xp->lft.hard_packet_limit = XFRM_INF; 3237 xp->family = sk->sk_family; 3238 3239 xp->xfrm_nr = 0; 3240 if (pol->sadb_x_policy_type == IPSEC_POLICY_IPSEC && 3241 (*dir = parse_ipsecrequests(xp, pol)) < 0) 3242 goto out; 3243 3244 /* security context too */ 3245 if (len >= (pol->sadb_x_policy_len*8 + 3246 sizeof(struct sadb_x_sec_ctx))) { 3247 char *p = (char *)pol; 3248 struct xfrm_user_sec_ctx *uctx; 3249 3250 p += pol->sadb_x_policy_len*8; 3251 sec_ctx = (struct sadb_x_sec_ctx *)p; 3252 if (len < pol->sadb_x_policy_len*8 + 3253 sec_ctx->sadb_x_sec_len) { 3254 *dir = -EINVAL; 3255 goto out; 3256 } 3257 if ((*dir = verify_sec_ctx_len(p))) 3258 goto out; 3259 uctx = pfkey_sadb2xfrm_user_sec_ctx(sec_ctx, GFP_ATOMIC); 3260 *dir = security_xfrm_policy_alloc(&xp->security, uctx, GFP_ATOMIC); 3261 kfree(uctx); 3262 3263 if (*dir) 3264 goto out; 3265 } 3266 3267 *dir = pol->sadb_x_policy_dir-1; 3268 return xp; 3269 3270out: 3271 xp->walk.dead = 1; 3272 xfrm_policy_destroy(xp); 3273 return NULL; 3274} 3275 3276static int pfkey_send_new_mapping(struct xfrm_state *x, xfrm_address_t *ipaddr, __be16 sport) 3277{ 3278 struct sk_buff *skb; 3279 struct sadb_msg *hdr; 3280 struct sadb_sa *sa; 3281 struct sadb_address *addr; 3282 struct sadb_x_nat_t_port *n_port; 3283 int sockaddr_size; 3284 int size; 3285 __u8 satype = (x->id.proto == IPPROTO_ESP ? SADB_SATYPE_ESP : 0); 3286 struct xfrm_encap_tmpl *natt = NULL; 3287 3288 sockaddr_size = pfkey_sockaddr_size(x->props.family); 3289 if (!sockaddr_size) 3290 return -EINVAL; 3291 3292 if (!satype) 3293 return -EINVAL; 3294 3295 if (!x->encap) 3296 return -EINVAL; 3297 3298 natt = x->encap; 3299 3300 /* Build an SADB_X_NAT_T_NEW_MAPPING message: 3301 * 3302 * HDR | SA | ADDRESS_SRC (old addr) | NAT_T_SPORT (old port) | 3303 * ADDRESS_DST (new addr) | NAT_T_DPORT (new port) 3304 */ 3305 3306 size = sizeof(struct sadb_msg) + 3307 sizeof(struct sadb_sa) + 3308 (sizeof(struct sadb_address) * 2) + 3309 (sockaddr_size * 2) + 3310 (sizeof(struct sadb_x_nat_t_port) * 2); 3311 3312 skb = alloc_skb(size + 16, GFP_ATOMIC); 3313 if (skb == NULL) 3314 return -ENOMEM; 3315 3316 hdr = (struct sadb_msg *) skb_put(skb, sizeof(struct sadb_msg)); 3317 hdr->sadb_msg_version = PF_KEY_V2; 3318 hdr->sadb_msg_type = SADB_X_NAT_T_NEW_MAPPING; 3319 hdr->sadb_msg_satype = satype; 3320 hdr->sadb_msg_len = size / sizeof(uint64_t); 3321 hdr->sadb_msg_errno = 0; 3322 hdr->sadb_msg_reserved = 0; 3323 hdr->sadb_msg_seq = x->km.seq = get_acqseq(); 3324 hdr->sadb_msg_pid = 0; 3325 3326 /* SA */ 3327 sa = (struct sadb_sa *) skb_put(skb, sizeof(struct sadb_sa)); 3328 sa->sadb_sa_len = sizeof(struct sadb_sa)/sizeof(uint64_t); 3329 sa->sadb_sa_exttype = SADB_EXT_SA; 3330 sa->sadb_sa_spi = x->id.spi; 3331 sa->sadb_sa_replay = 0; 3332 sa->sadb_sa_state = 0; 3333 sa->sadb_sa_auth = 0; 3334 sa->sadb_sa_encrypt = 0; 3335 sa->sadb_sa_flags = 0; 3336 3337 /* ADDRESS_SRC (old addr) */ 3338 addr = (struct sadb_address*) 3339 skb_put(skb, sizeof(struct sadb_address)+sockaddr_size); 3340 addr->sadb_address_len = 3341 (sizeof(struct sadb_address)+sockaddr_size)/ 3342 sizeof(uint64_t); 3343 addr->sadb_address_exttype = SADB_EXT_ADDRESS_SRC; 3344 addr->sadb_address_proto = 0; 3345 addr->sadb_address_reserved = 0; 3346 addr->sadb_address_prefixlen = 3347 pfkey_sockaddr_fill(&x->props.saddr, 0, 3348 (struct sockaddr *) (addr + 1), 3349 x->props.family); 3350 if (!addr->sadb_address_prefixlen) 3351 BUG(); 3352 3353 /* NAT_T_SPORT (old port) */ 3354 n_port = (struct sadb_x_nat_t_port*) skb_put(skb, sizeof (*n_port)); 3355 n_port->sadb_x_nat_t_port_len = sizeof(*n_port)/sizeof(uint64_t); 3356 n_port->sadb_x_nat_t_port_exttype = SADB_X_EXT_NAT_T_SPORT; 3357 n_port->sadb_x_nat_t_port_port = natt->encap_sport; 3358 n_port->sadb_x_nat_t_port_reserved = 0; 3359 3360 /* ADDRESS_DST (new addr) */ 3361 addr = (struct sadb_address*) 3362 skb_put(skb, sizeof(struct sadb_address)+sockaddr_size); 3363 addr->sadb_address_len = 3364 (sizeof(struct sadb_address)+sockaddr_size)/ 3365 sizeof(uint64_t); 3366 addr->sadb_address_exttype = SADB_EXT_ADDRESS_DST; 3367 addr->sadb_address_proto = 0; 3368 addr->sadb_address_reserved = 0; 3369 addr->sadb_address_prefixlen = 3370 pfkey_sockaddr_fill(ipaddr, 0, 3371 (struct sockaddr *) (addr + 1), 3372 x->props.family); 3373 if (!addr->sadb_address_prefixlen) 3374 BUG(); 3375 3376 /* NAT_T_DPORT (new port) */ 3377 n_port = (struct sadb_x_nat_t_port*) skb_put(skb, sizeof (*n_port)); 3378 n_port->sadb_x_nat_t_port_len = sizeof(*n_port)/sizeof(uint64_t); 3379 n_port->sadb_x_nat_t_port_exttype = SADB_X_EXT_NAT_T_DPORT; 3380 n_port->sadb_x_nat_t_port_port = sport; 3381 n_port->sadb_x_nat_t_port_reserved = 0; 3382 3383 return pfkey_broadcast(skb, BROADCAST_REGISTERED, NULL, xs_net(x)); 3384} 3385 3386#ifdef CONFIG_NET_KEY_MIGRATE 3387static int set_sadb_address(struct sk_buff *skb, int sasize, int type, 3388 const struct xfrm_selector *sel) 3389{ 3390 struct sadb_address *addr; 3391 addr = (struct sadb_address *)skb_put(skb, sizeof(struct sadb_address) + sasize); 3392 addr->sadb_address_len = (sizeof(struct sadb_address) + sasize)/8; 3393 addr->sadb_address_exttype = type; 3394 addr->sadb_address_proto = sel->proto; 3395 addr->sadb_address_reserved = 0; 3396 3397 switch (type) { 3398 case SADB_EXT_ADDRESS_SRC: 3399 addr->sadb_address_prefixlen = sel->prefixlen_s; 3400 pfkey_sockaddr_fill(&sel->saddr, 0, 3401 (struct sockaddr *)(addr + 1), 3402 sel->family); 3403 break; 3404 case SADB_EXT_ADDRESS_DST: 3405 addr->sadb_address_prefixlen = sel->prefixlen_d; 3406 pfkey_sockaddr_fill(&sel->daddr, 0, 3407 (struct sockaddr *)(addr + 1), 3408 sel->family); 3409 break; 3410 default: 3411 return -EINVAL; 3412 } 3413 3414 return 0; 3415} 3416 3417 3418static int set_sadb_kmaddress(struct sk_buff *skb, const struct xfrm_kmaddress *k) 3419{ 3420 struct sadb_x_kmaddress *kma; 3421 u8 *sa; 3422 int family = k->family; 3423 int socklen = pfkey_sockaddr_len(family); 3424 int size_req; 3425 3426 size_req = (sizeof(struct sadb_x_kmaddress) + 3427 pfkey_sockaddr_pair_size(family)); 3428 3429 kma = (struct sadb_x_kmaddress *)skb_put(skb, size_req); 3430 memset(kma, 0, size_req); 3431 kma->sadb_x_kmaddress_len = size_req / 8; 3432 kma->sadb_x_kmaddress_exttype = SADB_X_EXT_KMADDRESS; 3433 kma->sadb_x_kmaddress_reserved = k->reserved; 3434 3435 sa = (u8 *)(kma + 1); 3436 if (!pfkey_sockaddr_fill(&k->local, 0, (struct sockaddr *)sa, family) || 3437 !pfkey_sockaddr_fill(&k->remote, 0, (struct sockaddr *)(sa+socklen), family)) 3438 return -EINVAL; 3439 3440 return 0; 3441} 3442 3443static int set_ipsecrequest(struct sk_buff *skb, 3444 uint8_t proto, uint8_t mode, int level, 3445 uint32_t reqid, uint8_t family, 3446 const xfrm_address_t *src, const xfrm_address_t *dst) 3447{ 3448 struct sadb_x_ipsecrequest *rq; 3449 u8 *sa; 3450 int socklen = pfkey_sockaddr_len(family); 3451 int size_req; 3452 3453 size_req = sizeof(struct sadb_x_ipsecrequest) + 3454 pfkey_sockaddr_pair_size(family); 3455 3456 rq = (struct sadb_x_ipsecrequest *)skb_put(skb, size_req); 3457 memset(rq, 0, size_req); 3458 rq->sadb_x_ipsecrequest_len = size_req; 3459 rq->sadb_x_ipsecrequest_proto = proto; 3460 rq->sadb_x_ipsecrequest_mode = mode; 3461 rq->sadb_x_ipsecrequest_level = level; 3462 rq->sadb_x_ipsecrequest_reqid = reqid; 3463 3464 sa = (u8 *) (rq + 1); 3465 if (!pfkey_sockaddr_fill(src, 0, (struct sockaddr *)sa, family) || 3466 !pfkey_sockaddr_fill(dst, 0, (struct sockaddr *)(sa + socklen), family)) 3467 return -EINVAL; 3468 3469 return 0; 3470} 3471#endif 3472 3473#ifdef CONFIG_NET_KEY_MIGRATE 3474static int pfkey_send_migrate(const struct xfrm_selector *sel, u8 dir, u8 type, 3475 const struct xfrm_migrate *m, int num_bundles, 3476 const struct xfrm_kmaddress *k) 3477{ 3478 int i; 3479 int sasize_sel; 3480 int size = 0; 3481 int size_pol = 0; 3482 struct sk_buff *skb; 3483 struct sadb_msg *hdr; 3484 struct sadb_x_policy *pol; 3485 const struct xfrm_migrate *mp; 3486 3487 if (type != XFRM_POLICY_TYPE_MAIN) 3488 return 0; 3489 3490 if (num_bundles <= 0 || num_bundles > XFRM_MAX_DEPTH) 3491 return -EINVAL; 3492 3493 if (k != NULL) { 3494 /* addresses for KM */ 3495 size += PFKEY_ALIGN8(sizeof(struct sadb_x_kmaddress) + 3496 pfkey_sockaddr_pair_size(k->family)); 3497 } 3498 3499 /* selector */ 3500 sasize_sel = pfkey_sockaddr_size(sel->family); 3501 if (!sasize_sel) 3502 return -EINVAL; 3503 size += (sizeof(struct sadb_address) + sasize_sel) * 2; 3504 3505 /* policy info */ 3506 size_pol += sizeof(struct sadb_x_policy); 3507 3508 /* ipsecrequests */ 3509 for (i = 0, mp = m; i < num_bundles; i++, mp++) { 3510 /* old locator pair */ 3511 size_pol += sizeof(struct sadb_x_ipsecrequest) + 3512 pfkey_sockaddr_pair_size(mp->old_family); 3513 /* new locator pair */ 3514 size_pol += sizeof(struct sadb_x_ipsecrequest) + 3515 pfkey_sockaddr_pair_size(mp->new_family); 3516 } 3517 3518 size += sizeof(struct sadb_msg) + size_pol; 3519 3520 /* alloc buffer */ 3521 skb = alloc_skb(size, GFP_ATOMIC); 3522 if (skb == NULL) 3523 return -ENOMEM; 3524 3525 hdr = (struct sadb_msg *)skb_put(skb, sizeof(struct sadb_msg)); 3526 hdr->sadb_msg_version = PF_KEY_V2; 3527 hdr->sadb_msg_type = SADB_X_MIGRATE; 3528 hdr->sadb_msg_satype = pfkey_proto2satype(m->proto); 3529 hdr->sadb_msg_len = size / 8; 3530 hdr->sadb_msg_errno = 0; 3531 hdr->sadb_msg_reserved = 0; 3532 hdr->sadb_msg_seq = 0; 3533 hdr->sadb_msg_pid = 0; 3534 3535 /* Addresses to be used by KM for negotiation, if ext is available */ 3536 if (k != NULL && (set_sadb_kmaddress(skb, k) < 0)) 3537 goto err; 3538 3539 /* selector src */ 3540 set_sadb_address(skb, sasize_sel, SADB_EXT_ADDRESS_SRC, sel); 3541 3542 /* selector dst */ 3543 set_sadb_address(skb, sasize_sel, SADB_EXT_ADDRESS_DST, sel); 3544 3545 /* policy information */ 3546 pol = (struct sadb_x_policy *)skb_put(skb, sizeof(struct sadb_x_policy)); 3547 pol->sadb_x_policy_len = size_pol / 8; 3548 pol->sadb_x_policy_exttype = SADB_X_EXT_POLICY; 3549 pol->sadb_x_policy_type = IPSEC_POLICY_IPSEC; 3550 pol->sadb_x_policy_dir = dir + 1; 3551 pol->sadb_x_policy_reserved = 0; 3552 pol->sadb_x_policy_id = 0; 3553 pol->sadb_x_policy_priority = 0; 3554 3555 for (i = 0, mp = m; i < num_bundles; i++, mp++) { 3556 /* old ipsecrequest */ 3557 int mode = pfkey_mode_from_xfrm(mp->mode); 3558 if (mode < 0) 3559 goto err; 3560 if (set_ipsecrequest(skb, mp->proto, mode, 3561 (mp->reqid ? IPSEC_LEVEL_UNIQUE : IPSEC_LEVEL_REQUIRE), 3562 mp->reqid, mp->old_family, 3563 &mp->old_saddr, &mp->old_daddr) < 0) 3564 goto err; 3565 3566 /* new ipsecrequest */ 3567 if (set_ipsecrequest(skb, mp->proto, mode, 3568 (mp->reqid ? IPSEC_LEVEL_UNIQUE : IPSEC_LEVEL_REQUIRE), 3569 mp->reqid, mp->new_family, 3570 &mp->new_saddr, &mp->new_daddr) < 0) 3571 goto err; 3572 } 3573 3574 /* broadcast migrate message to sockets */ 3575 pfkey_broadcast(skb, BROADCAST_ALL, NULL, &init_net); 3576 3577 return 0; 3578 3579err: 3580 kfree_skb(skb); 3581 return -EINVAL; 3582} 3583#else 3584static int pfkey_send_migrate(const struct xfrm_selector *sel, u8 dir, u8 type, 3585 const struct xfrm_migrate *m, int num_bundles, 3586 const struct xfrm_kmaddress *k) 3587{ 3588 return -ENOPROTOOPT; 3589} 3590#endif 3591 3592static int pfkey_sendmsg(struct socket *sock, struct msghdr *msg, size_t len) 3593{ 3594 struct sock *sk = sock->sk; 3595 struct sk_buff *skb = NULL; 3596 struct sadb_msg *hdr = NULL; 3597 int err; 3598 struct net *net = sock_net(sk); 3599 3600 err = -EOPNOTSUPP; 3601 if (msg->msg_flags & MSG_OOB) 3602 goto out; 3603 3604 err = -EMSGSIZE; 3605 if ((unsigned int)len > sk->sk_sndbuf - 32) 3606 goto out; 3607 3608 err = -ENOBUFS; 3609 skb = alloc_skb(len, GFP_KERNEL); 3610 if (skb == NULL) 3611 goto out; 3612 3613 err = -EFAULT; 3614 if (memcpy_from_msg(skb_put(skb,len), msg, len)) 3615 goto out; 3616 3617 hdr = pfkey_get_base_msg(skb, &err); 3618 if (!hdr) 3619 goto out; 3620 3621 mutex_lock(&net->xfrm.xfrm_cfg_mutex); 3622 err = pfkey_process(sk, skb, hdr); 3623 mutex_unlock(&net->xfrm.xfrm_cfg_mutex); 3624 3625out: 3626 if (err && hdr && pfkey_error(hdr, err, sk) == 0) 3627 err = 0; 3628 kfree_skb(skb); 3629 3630 return err ? : len; 3631} 3632 3633static int pfkey_recvmsg(struct socket *sock, struct msghdr *msg, size_t len, 3634 int flags) 3635{ 3636 struct sock *sk = sock->sk; 3637 struct pfkey_sock *pfk = pfkey_sk(sk); 3638 struct sk_buff *skb; 3639 int copied, err; 3640 3641 err = -EINVAL; 3642 if (flags & ~(MSG_PEEK|MSG_DONTWAIT|MSG_TRUNC|MSG_CMSG_COMPAT)) 3643 goto out; 3644 3645 skb = skb_recv_datagram(sk, flags, flags & MSG_DONTWAIT, &err); 3646 if (skb == NULL) 3647 goto out; 3648 3649 copied = skb->len; 3650 if (copied > len) { 3651 msg->msg_flags |= MSG_TRUNC; 3652 copied = len; 3653 } 3654 3655 skb_reset_transport_header(skb); 3656 err = skb_copy_datagram_msg(skb, 0, msg, copied); 3657 if (err) 3658 goto out_free; 3659 3660 sock_recv_ts_and_drops(msg, sk, skb); 3661 3662 err = (flags & MSG_TRUNC) ? skb->len : copied; 3663 3664 if (pfk->dump.dump != NULL && 3665 3 * atomic_read(&sk->sk_rmem_alloc) <= sk->sk_rcvbuf) 3666 pfkey_do_dump(pfk); 3667 3668out_free: 3669 skb_free_datagram(sk, skb); 3670out: 3671 return err; 3672} 3673 3674static const struct proto_ops pfkey_ops = { 3675 .family = PF_KEY, 3676 .owner = THIS_MODULE, 3677 /* Operations that make no sense on pfkey sockets. */ 3678 .bind = sock_no_bind, 3679 .connect = sock_no_connect, 3680 .socketpair = sock_no_socketpair, 3681 .accept = sock_no_accept, 3682 .getname = sock_no_getname, 3683 .ioctl = sock_no_ioctl, 3684 .listen = sock_no_listen, 3685 .shutdown = sock_no_shutdown, 3686 .setsockopt = sock_no_setsockopt, 3687 .getsockopt = sock_no_getsockopt, 3688 .mmap = sock_no_mmap, 3689 .sendpage = sock_no_sendpage, 3690 3691 /* Now the operations that really occur. */ 3692 .release = pfkey_release, 3693 .poll = datagram_poll, 3694 .sendmsg = pfkey_sendmsg, 3695 .recvmsg = pfkey_recvmsg, 3696}; 3697 3698static const struct net_proto_family pfkey_family_ops = { 3699 .family = PF_KEY, 3700 .create = pfkey_create, 3701 .owner = THIS_MODULE, 3702}; 3703 3704#ifdef CONFIG_PROC_FS 3705static int pfkey_seq_show(struct seq_file *f, void *v) 3706{ 3707 struct sock *s = sk_entry(v); 3708 3709 if (v == SEQ_START_TOKEN) 3710 seq_printf(f ,"sk RefCnt Rmem Wmem User Inode\n"); 3711 else 3712 seq_printf(f, "%pK %-6d %-6u %-6u %-6u %-6lu\n", 3713 s, 3714 atomic_read(&s->sk_refcnt), 3715 sk_rmem_alloc_get(s), 3716 sk_wmem_alloc_get(s), 3717 from_kuid_munged(seq_user_ns(f), sock_i_uid(s)), 3718 sock_i_ino(s) 3719 ); 3720 return 0; 3721} 3722 3723static void *pfkey_seq_start(struct seq_file *f, loff_t *ppos) 3724 __acquires(rcu) 3725{ 3726 struct net *net = seq_file_net(f); 3727 struct netns_pfkey *net_pfkey = net_generic(net, pfkey_net_id); 3728 3729 rcu_read_lock(); 3730 return seq_hlist_start_head_rcu(&net_pfkey->table, *ppos); 3731} 3732 3733static void *pfkey_seq_next(struct seq_file *f, void *v, loff_t *ppos) 3734{ 3735 struct net *net = seq_file_net(f); 3736 struct netns_pfkey *net_pfkey = net_generic(net, pfkey_net_id); 3737 3738 return seq_hlist_next_rcu(v, &net_pfkey->table, ppos); 3739} 3740 3741static void pfkey_seq_stop(struct seq_file *f, void *v) 3742 __releases(rcu) 3743{ 3744 rcu_read_unlock(); 3745} 3746 3747static const struct seq_operations pfkey_seq_ops = { 3748 .start = pfkey_seq_start, 3749 .next = pfkey_seq_next, 3750 .stop = pfkey_seq_stop, 3751 .show = pfkey_seq_show, 3752}; 3753 3754static int pfkey_seq_open(struct inode *inode, struct file *file) 3755{ 3756 return seq_open_net(inode, file, &pfkey_seq_ops, 3757 sizeof(struct seq_net_private)); 3758} 3759 3760static const struct file_operations pfkey_proc_ops = { 3761 .open = pfkey_seq_open, 3762 .read = seq_read, 3763 .llseek = seq_lseek, 3764 .release = seq_release_net, 3765}; 3766 3767static int __net_init pfkey_init_proc(struct net *net) 3768{ 3769 struct proc_dir_entry *e; 3770 3771 e = proc_create("pfkey", 0, net->proc_net, &pfkey_proc_ops); 3772 if (e == NULL) 3773 return -ENOMEM; 3774 3775 return 0; 3776} 3777 3778static void __net_exit pfkey_exit_proc(struct net *net) 3779{ 3780 remove_proc_entry("pfkey", net->proc_net); 3781} 3782#else 3783static inline int pfkey_init_proc(struct net *net) 3784{ 3785 return 0; 3786} 3787 3788static inline void pfkey_exit_proc(struct net *net) 3789{ 3790} 3791#endif 3792 3793static struct xfrm_mgr pfkeyv2_mgr = 3794{ 3795 .id = "pfkeyv2", 3796 .notify = pfkey_send_notify, 3797 .acquire = pfkey_send_acquire, 3798 .compile_policy = pfkey_compile_policy, 3799 .new_mapping = pfkey_send_new_mapping, 3800 .notify_policy = pfkey_send_policy_notify, 3801 .migrate = pfkey_send_migrate, 3802 .is_alive = pfkey_is_alive, 3803}; 3804 3805static int __net_init pfkey_net_init(struct net *net) 3806{ 3807 struct netns_pfkey *net_pfkey = net_generic(net, pfkey_net_id); 3808 int rv; 3809 3810 INIT_HLIST_HEAD(&net_pfkey->table); 3811 atomic_set(&net_pfkey->socks_nr, 0); 3812 3813 rv = pfkey_init_proc(net); 3814 3815 return rv; 3816} 3817 3818static void __net_exit pfkey_net_exit(struct net *net) 3819{ 3820 struct netns_pfkey *net_pfkey = net_generic(net, pfkey_net_id); 3821 3822 pfkey_exit_proc(net); 3823 BUG_ON(!hlist_empty(&net_pfkey->table)); 3824} 3825 3826static struct pernet_operations pfkey_net_ops = { 3827 .init = pfkey_net_init, 3828 .exit = pfkey_net_exit, 3829 .id = &pfkey_net_id, 3830 .size = sizeof(struct netns_pfkey), 3831}; 3832 3833static void __exit ipsec_pfkey_exit(void) 3834{ 3835 xfrm_unregister_km(&pfkeyv2_mgr); 3836 sock_unregister(PF_KEY); 3837 unregister_pernet_subsys(&pfkey_net_ops); 3838 proto_unregister(&key_proto); 3839} 3840 3841static int __init ipsec_pfkey_init(void) 3842{ 3843 int err = proto_register(&key_proto, 0); 3844 3845 if (err != 0) 3846 goto out; 3847 3848 err = register_pernet_subsys(&pfkey_net_ops); 3849 if (err != 0) 3850 goto out_unregister_key_proto; 3851 err = sock_register(&pfkey_family_ops); 3852 if (err != 0) 3853 goto out_unregister_pernet; 3854 err = xfrm_register_km(&pfkeyv2_mgr); 3855 if (err != 0) 3856 goto out_sock_unregister; 3857out: 3858 return err; 3859 3860out_sock_unregister: 3861 sock_unregister(PF_KEY); 3862out_unregister_pernet: 3863 unregister_pernet_subsys(&pfkey_net_ops); 3864out_unregister_key_proto: 3865 proto_unregister(&key_proto); 3866 goto out; 3867} 3868 3869module_init(ipsec_pfkey_init); 3870module_exit(ipsec_pfkey_exit); 3871MODULE_LICENSE("GPL"); 3872MODULE_ALIAS_NETPROTO(PF_KEY); 3873