# Copyright 2017 syzkaller project authors. All rights reserved. # Use of this source code is governed by Apache 2 LICENSE that can be found in the LICENSE file. # AF_NETLINK/NETLINK_XFRM support. include <linux/net.h> include <uapi/linux/netlink.h> include <uapi/linux/in.h> include <uapi/linux/xfrm.h> include <uapi/linux/ipsec.h> resource sock_nl_xfrm[sock_netlink] type xfrm_req_id int32[13567:13575, opt] type xfrm_policy_index int32[7236528:7236544, opt] type xfrm_spi int32be[1234:1238] socket$nl_xfrm(domain const[AF_NETLINK], type const[SOCK_RAW], proto const[NETLINK_XFRM]) sock_nl_xfrm sendmsg$nl_xfrm(fd sock_nl_xfrm, msg ptr[in, msghdr_nl_xfrm], f flags[send_flags]) type msghdr_nl_xfrm msghdr_netlink[netlink_msg_xfrm] type xfrm_msg[TYPE, PAYLOAD] netlink_msg[TYPE, PAYLOAD, xfrm_attrs] netlink_msg_xfrm [ newsa xfrm_msg[XFRM_MSG_NEWSA, xfrm_usersa_info] updsa xfrm_msg[XFRM_MSG_UPDSA, xfrm_usersa_info] delsa xfrm_msg[XFRM_MSG_DELSA, xfrm_usersa_id] getsa xfrm_msg[XFRM_MSG_GETSA, xfrm_usersa_id] newpolicy xfrm_msg[XFRM_MSG_NEWPOLICY, xfrm_userpolicy_info] updpolicy xfrm_msg[XFRM_MSG_UPDPOLICY, xfrm_userpolicy_info] delpolicy xfrm_msg[XFRM_MSG_DELPOLICY, xfrm_userpolicy_id] getpolicy xfrm_msg[XFRM_MSG_GETPOLICY, xfrm_userpolicy_id] migrate xfrm_msg[XFRM_MSG_MIGRATE, xfrm_userpolicy_id] allocspi xfrm_msg[XFRM_MSG_ALLOCSPI, xfrm_userspi_info] acquire xfrm_msg[XFRM_MSG_ACQUIRE, xfrm_user_acquire] expire xfrm_msg[XFRM_MSG_EXPIRE, xfrm_user_expire] polexpire xfrm_msg[XFRM_MSG_POLEXPIRE, xfrm_user_polexpire] flushsa xfrm_msg[XFRM_MSG_FLUSHSA, xfrm_usersa_flush] report xfrm_msg[XFRM_MSG_REPORT, xfrm_user_report] flushpolicy xfrm_msg[XFRM_MSG_FLUSHPOLICY, void] newae xfrm_msg[XFRM_MSG_NEWAE, xfrm_aevent_id] getae xfrm_msg[XFRM_MSG_GETAE, xfrm_aevent_id] getsadinfo xfrm_msg[XFRM_MSG_GETSADINFO, const[0, int32]] newspdinfo xfrm_msg[XFRM_MSG_NEWSPDINFO, int32] getspdinfo xfrm_msg[XFRM_MSG_GETSPDINFO, int32] ] [varlen] xfrm_usersa_info { sel xfrm_selector id xfrm_id saddr xfrm_address lft xfrm_lifetime_cfg curlft xfrm_lifetime_cur stats xfrm_stats seq netlink_seq reqid xfrm_req_id family flags[xfrm_family, int16] mode flags[xfrm_mode, int8] replay_window int8 flags flags[xfrm_state, int8] } xfrm_usersa_id { daddr xfrm_address spi xfrm_spi family flags[xfrm_family, int16] proto flags[xfrm_proto, int8] } xfrm_userpolicy_id { sel xfrm_selector index xfrm_policy_index dir flags[xfrm_policy_dir, int8] } xfrm_userspi_info { info xfrm_usersa_info min int32 max int32 } xfrm_user_acquire { id xfrm_id saddr xfrm_address sel xfrm_selector policy xfrm_userpolicy_info aalgos int32 ealgos int32 calgo int32 seq netlink_seq } xfrm_user_expire { state xfrm_usersa_info hard int8 } xfrm_user_polexpire { pol xfrm_userpolicy_info hard int8 } xfrm_usersa_flush { proto flags[xfrm_proto, int8] } xfrm_user_report { proto flags[xfrm_proto, int8] sel xfrm_selector } xfrm_aevent_id { sa_id xfrm_usersa_id saddr xfrm_address flags int32 reqid xfrm_req_id } xfrm_attrs [ sa nlattr[XFRMA_SA, xfrm_usersa_info] policy nlattr[XFRMA_POLICY, xfrm_userpolicy_info] lastused nlattr[XFRMA_LASTUSED, int64] algo_auth_trunc nlattr[XFRMA_ALG_AUTH_TRUNC, xfrm_algo_auth] algo_aead nlattr[XFRMA_ALG_AEAD, xfrm_algo_aead] algo_auth nlattr[XFRMA_ALG_AUTH, xfrm_algo_hash] algo_crypt nlattr[XFRMA_ALG_CRYPT, xfrm_algo_blkcipher] algo_comp nlattr[XFRMA_ALG_COMP, xfrm_algo_compress] srcaddr nlattr[XFRMA_SRCADDR, xfrm_address] coaddr nlattr[XFRMA_COADDR, xfrm_address] extra_flags nlattr[XFRMA_SA_EXTRA_FLAGS, int32] tfcpad nlattr[XFRMA_TFCPAD, int32] replay_thresh nlattr[XFRMA_REPLAY_THRESH, int32] etimer_thresh nlattr[XFRMA_ETIMER_THRESH, int32] output_mark nlattr[XFRMA_OUTPUT_MARK, int32] encap nlattr[XFRMA_ENCAP, xfrm_encap_tmpl] offload nlattr[XFRMA_OFFLOAD_DEV, xfrm_user_offload] sec_ctx nlattr[XFRMA_SEC_CTX, xfrm_user_sec_ctx] lifetime_val nlattr[XFRMA_LTIME_VAL, xfrm_lifetime_cur] tmpl nlattr[XFRMA_TMPL, array[xfrm_user_tmpl]] replay_val nlattr[XFRMA_REPLAY_VAL, xfrm_replay_state] replay_esn_val nlattr[XFRMA_REPLAY_ESN_VAL, xfrm_replay_state_esn] policy_type nlattr[XFRMA_POLICY_TYPE, xfrm_userpolicy_type] migrate nlattr[XFRMA_MIGRATE, array[xfrm_user_migrate]] user_kmaddress nlattr[XFRMA_KMADDRESS, xfrm_user_kmaddress] mark nlattr[XFRMA_MARK, xfrm_mark] proto nlattr[XFRMA_PROTO, flags[xfrm_proto, int8]] address_filter nlattr[XFRMA_ADDRESS_FILTER, xfrm_address_filter] ipv4_hthresh nlattr[XFRMA_SPD_IPV4_HTHRESH, xfrmu_spdhthresh4] ipv6_hthresh nlattr[XFRMA_SPD_IPV6_HTHRESH, xfrmu_spdhthresh6] ] [varlen] xfrm_encap_tmpl { encap_type flags[xfrm_encap_type, int16] encap_sport sock_port encap_dport sock_port encap_oa xfrm_address } xfrm_user_offload { ifindex ifindex[opt] flags flags[xfrm_offload_flags, int8] } xfrm_offload_flags = XFRM_OFFLOAD_IPV6, XFRM_OFFLOAD_INBOUND xfrm_user_sec_ctx { len len[parent, int16] exttype const[XFRMA_SEC_CTX, int16] ctx_alg flags[xfrm_sec_ctx_alg, int8] ctx_doi int8 ctx_len len[payload, int16] # TODO: what's this? looks intersting. payload array[int8] } xfrm_sec_ctx_alg = XFRM_SC_ALG_SELINUX xfrm_replay_state { oseq netlink_seq seq netlink_seq bitmap int32 } xfrm_replay_state_esn { bmp_len len[bmp, int32] oseq netlink_seq seq netlink_seq oseq_hi netlink_seq seq_hi netlink_seq replay_window int32 bmp array[int32] } xfrm_userpolicy_type { type flags[xfrm_policy_types, int8] reserved1 const[0, int16] reserved2 const[0, int8] } xfrm_user_migrate { old_daddr xfrm_address new_saddr xfrm_address proto flags[xfrm_proto, int8] mode flags[xfrm_mode, int8] reserved const[0, int16] reqid xfrm_req_id old_family flags[xfrm_family, int16] new_family flags[xfrm_family, int16] } xfrm_user_kmaddress { local xfrm_address remote xfrm_address reserved const[0, int32] family flags[xfrm_family, int16] } xfrm_mark { v int32[3475289:3475293] m int32 } xfrm_address_filter { saddr xfrm_address daddr xfrm_address family flags[xfrm_family, int16] splen int8 dplen int8 } xfrmu_spdhthresh4 { lbits int8[0:32] rbits int8[0:32] } xfrmu_spdhthresh6 { lbits int8[0:128] rbits int8[0:128] } xfrm_selector { daddr xfrm_address saddr xfrm_address dport sock_port dport_mask int16be[opt] sport sock_port sport_mask int16be[opt] family flags[xfrm_family, int16] prefixlen_d flags[xfrm_prefixlens, int8] prefixlen_s flags[xfrm_prefixlens, int8] proto flags[ipv6_types, int8] ifindex ifindex[opt] user uid } xfrm_lifetime_cfg { soft_byte_limit int64 hard_byte_limit int64 soft_packet_limit int64 hard_packet_limit int64 soft_add_expires_seconds int64 hard_add_expires_seconds int64 soft_use_expires_seconds int64 hard_use_expires_seconds int64 } xfrm_lifetime_cur { bytes int64 packets int64 add_time int64 use_time int64 } xfrm_stats { replay_window int32 replay int32 integrity_failed int32 } xfrm_algo_hash { alg_name alg_hash_name alg_key_len bitsize[alg_key, int32] alg_key array[int8] } xfrm_algo_blkcipher { alg_name alg_blkcipher_name alg_key_len bitsize[alg_key, int32] alg_key array[int8] } xfrm_algo_compress { alg_name alg_compress_name alg_key_len bitsize[alg_key, int32] alg_key array[int8] } xfrm_algo_auth { alg_name alg_hash_name alg_key_len bitsize[alg_key, int32] alg_icv_len flags[xfrm_algo_truncbits, int32] alg_key array[int8] } xfrm_algo_aead { alg_name alg_aead_name alg_key_len bitsize[alg_key, int32] alg_icv_len flags[xfrm_algo_truncbits, int32] alg_key array[int8] } xfrm_algo_truncbits = 0, 64, 96, 128, 160, 192, 256, 384, 512 xfrm_id { daddr xfrm_address spi xfrm_spi proto flags[xfrm_proto, int8] } xfrm_address [ in ipv4_addr in6 ipv6_addr ] xfrm_filter { info xfrm_userpolicy_info tmpl xfrm_user_tmpl } xfrm_userpolicy_info { sel xfrm_selector lft xfrm_lifetime_cfg curlft xfrm_lifetime_cur priority int32 index xfrm_policy_index dir flags[xfrm_policy_dir, int8] action flags[xfrm_policy_actions, int8] flags flags[xfrm_policy_flags, int8] share flags[xfrm_policy_shares, int8] } xfrm_user_tmpl { id xfrm_id family flags[xfrm_family, int16] saddr xfrm_address reqid xfrm_req_id mode flags[xfrm_mode, int8] share flags[xfrm_policy_shares, int8] optional int8 aalgos int32 ealgos int32 calgos int32 } xfrm_mode = XFRM_MODE_TRANSPORT, XFRM_MODE_TUNNEL, XFRM_MODE_ROUTEOPTIMIZATION, XFRM_MODE_IN_TRIGGER, XFRM_MODE_BEET xfrm_state = XFRM_STATE_NOECN, XFRM_STATE_DECAP_DSCP, XFRM_STATE_NOPMTUDISC, XFRM_STATE_WILDRECV, XFRM_STATE_ICMP, XFRM_STATE_AF_UNSPEC, XFRM_STATE_ALIGN4, XFRM_STATE_ESN xfrm_family = AF_INET, AF_INET6 xfrm_proto = IPPROTO_AH, IPPROTO_ESP, IPPROTO_COMP, IPPROTO_DSTOPTS, IPPROTO_ROUTING, IPSEC_PROTO_ANY xfrm_policy_types = XFRM_POLICY_TYPE_MAIN, XFRM_POLICY_TYPE_SUB xfrm_policy_actions = XFRM_POLICY_ALLOW, XFRM_POLICY_BLOCK xfrm_policy_flags = XFRM_POLICY_LOCALOK, XFRM_POLICY_ICMP xfrm_policy_shares = XFRM_SHARE_ANY, XFRM_SHARE_SESSION, XFRM_SHARE_USER, XFRM_SHARE_UNIQUE xfrm_policy_dir = XFRM_POLICY_IN, XFRM_POLICY_OUT, XFRM_POLICY_FWD xfrm_prefixlens = 32, 128 xfrm_encap_type = -3, -2, -1, 0, 1, 2, 3