| # 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 |