Lines Matching refs:sec

32 void mac802154_llsec_init(struct mac802154_llsec *sec)  in mac802154_llsec_init()  argument
34 memset(sec, 0, sizeof(*sec)); in mac802154_llsec_init()
36 memset(&sec->params.default_key_source, 0xFF, IEEE802154_ADDR_LEN); in mac802154_llsec_init()
38 INIT_LIST_HEAD(&sec->table.security_levels); in mac802154_llsec_init()
39 INIT_LIST_HEAD(&sec->table.devices); in mac802154_llsec_init()
40 INIT_LIST_HEAD(&sec->table.keys); in mac802154_llsec_init()
41 hash_init(sec->devices_short); in mac802154_llsec_init()
42 hash_init(sec->devices_hw); in mac802154_llsec_init()
43 rwlock_init(&sec->lock); in mac802154_llsec_init()
46 void mac802154_llsec_destroy(struct mac802154_llsec *sec) in mac802154_llsec_destroy() argument
52 list_for_each_entry_safe(sl, sn, &sec->table.security_levels, list) { in mac802154_llsec_destroy()
60 list_for_each_entry_safe(dev, dn, &sec->table.devices, list) { in mac802154_llsec_destroy()
68 list_for_each_entry_safe(key, kn, &sec->table.keys, list) { in mac802154_llsec_destroy()
78 int mac802154_llsec_get_params(struct mac802154_llsec *sec, in mac802154_llsec_get_params() argument
81 read_lock_bh(&sec->lock); in mac802154_llsec_get_params()
82 *params = sec->params; in mac802154_llsec_get_params()
83 read_unlock_bh(&sec->lock); in mac802154_llsec_get_params()
88 int mac802154_llsec_set_params(struct mac802154_llsec *sec, in mac802154_llsec_set_params() argument
92 write_lock_bh(&sec->lock); in mac802154_llsec_set_params()
95 sec->params.enabled = params->enabled; in mac802154_llsec_set_params()
97 sec->params.frame_counter = params->frame_counter; in mac802154_llsec_set_params()
99 sec->params.out_level = params->out_level; in mac802154_llsec_set_params()
101 sec->params.out_key = params->out_key; in mac802154_llsec_set_params()
103 sec->params.default_key_source = params->default_key_source; in mac802154_llsec_set_params()
105 sec->params.pan_id = params->pan_id; in mac802154_llsec_set_params()
107 sec->params.hwaddr = params->hwaddr; in mac802154_llsec_set_params()
109 sec->params.coord_hwaddr = params->coord_hwaddr; in mac802154_llsec_set_params()
111 sec->params.coord_shortaddr = params->coord_shortaddr; in mac802154_llsec_set_params()
113 write_unlock_bh(&sec->lock); in mac802154_llsec_set_params()
217 int mac802154_llsec_key_add(struct mac802154_llsec *sec, in mac802154_llsec_key_add() argument
228 list_for_each_entry(pos, &sec->table.keys, list) { in mac802154_llsec_key_add()
264 list_add_rcu(&new->list, &sec->table.keys); in mac802154_llsec_key_add()
273 int mac802154_llsec_key_del(struct mac802154_llsec *sec, in mac802154_llsec_key_del() argument
278 list_for_each_entry(pos, &sec->table.keys, list) { in mac802154_llsec_key_del()
310 llsec_dev_find_short(struct mac802154_llsec *sec, __le16 short_addr, in llsec_dev_find_short() argument
316 hash_for_each_possible_rcu(sec->devices_short, dev, bucket_s, key) { in llsec_dev_find_short()
326 llsec_dev_find_long(struct mac802154_llsec *sec, __le64 hwaddr) in llsec_dev_find_long() argument
331 hash_for_each_possible_rcu(sec->devices_hw, dev, bucket_hw, key) { in llsec_dev_find_long()
355 int mac802154_llsec_dev_add(struct mac802154_llsec *sec, in mac802154_llsec_dev_add() argument
365 llsec_dev_find_short(sec, dev->short_addr, dev->pan_id)) || in mac802154_llsec_dev_add()
366 llsec_dev_find_long(sec, dev->hwaddr)) in mac802154_llsec_dev_add()
378 hash_add_rcu(sec->devices_short, &entry->bucket_s, skey); in mac802154_llsec_dev_add()
382 hash_add_rcu(sec->devices_hw, &entry->bucket_hw, hwkey); in mac802154_llsec_dev_add()
383 list_add_tail_rcu(&entry->dev.list, &sec->table.devices); in mac802154_llsec_dev_add()
393 int mac802154_llsec_dev_del(struct mac802154_llsec *sec, __le64 device_addr) in mac802154_llsec_dev_del() argument
397 pos = llsec_dev_find_long(sec, device_addr); in mac802154_llsec_dev_del()
425 int mac802154_llsec_devkey_add(struct mac802154_llsec *sec, in mac802154_llsec_devkey_add() argument
432 dev = llsec_dev_find_long(sec, dev_addr); in mac802154_llsec_devkey_add()
449 int mac802154_llsec_devkey_del(struct mac802154_llsec *sec, in mac802154_llsec_devkey_del() argument
456 dev = llsec_dev_find_long(sec, dev_addr); in mac802154_llsec_devkey_del()
471 llsec_find_seclevel(const struct mac802154_llsec *sec, in llsec_find_seclevel() argument
476 list_for_each_entry(pos, &sec->table.security_levels, list) { in llsec_find_seclevel()
491 int mac802154_llsec_seclevel_add(struct mac802154_llsec *sec, in mac802154_llsec_seclevel_add() argument
496 if (llsec_find_seclevel(sec, sl)) in mac802154_llsec_seclevel_add()
505 list_add_tail_rcu(&entry->level.list, &sec->table.security_levels); in mac802154_llsec_seclevel_add()
510 int mac802154_llsec_seclevel_del(struct mac802154_llsec *sec, in mac802154_llsec_seclevel_del() argument
515 pos = llsec_find_seclevel(sec, sl); in mac802154_llsec_seclevel_del()
525 static int llsec_recover_addr(struct mac802154_llsec *sec, in llsec_recover_addr() argument
528 __le16 caddr = sec->params.coord_shortaddr; in llsec_recover_addr()
530 addr->pan_id = sec->params.pan_id; in llsec_recover_addr()
535 addr->extended_addr = sec->params.coord_hwaddr; in llsec_recover_addr()
538 addr->short_addr = sec->params.coord_shortaddr; in llsec_recover_addr()
546 llsec_lookup_key(struct mac802154_llsec *sec, in llsec_lookup_key() argument
552 u8 key_id_mode = hdr->sec.key_id_mode; in llsec_lookup_key()
559 devaddr.extended_addr = sec->params.coord_hwaddr; in llsec_lookup_key()
561 } else if (llsec_recover_addr(sec, &devaddr) < 0) { in llsec_lookup_key()
566 list_for_each_entry_rcu(key_entry, &sec->table.keys, list) { in llsec_lookup_key()
579 if (id->id != hdr->sec.key_id) in llsec_lookup_key()
584 id->short_source == hdr->sec.short_src) || in llsec_lookup_key()
586 id->extended_source == hdr->sec.extended_src)) in llsec_lookup_key()
601 const struct ieee802154_sechdr *sec) in llsec_geniv() argument
604 __be32 frame_counter = (__force __be32) swab32((__force u32) sec->frame_counter); in llsec_geniv()
609 iv[13] = sec->level; in llsec_geniv()
615 llsec_do_encrypt_unauth(struct sk_buff *skb, const struct mac802154_llsec *sec, in llsec_do_encrypt_unauth() argument
627 llsec_geniv(iv, sec->params.hwaddr, &hdr->sec); in llsec_do_encrypt_unauth()
645 llsec_do_encrypt_auth(struct sk_buff *skb, const struct mac802154_llsec *sec, in llsec_do_encrypt_auth() argument
655 authlen = ieee802154_sechdr_authtag_len(&hdr->sec); in llsec_do_encrypt_auth()
656 llsec_geniv(iv, sec->params.hwaddr, &hdr->sec); in llsec_do_encrypt_auth()
669 if (hdr->sec.level & IEEE802154_SCF_SECLEVEL_ENC) { in llsec_do_encrypt_auth()
695 const struct mac802154_llsec *sec, in llsec_do_encrypt() argument
699 if (hdr->sec.level == IEEE802154_SCF_SECLEVEL_ENC) in llsec_do_encrypt()
700 return llsec_do_encrypt_unauth(skb, sec, hdr, key); in llsec_do_encrypt()
702 return llsec_do_encrypt_auth(skb, sec, hdr, key); in llsec_do_encrypt()
705 int mac802154_llsec_encrypt(struct mac802154_llsec *sec, struct sk_buff *skb) in mac802154_llsec_encrypt() argument
717 if (!hdr.fc.security_enabled || hdr.sec.level == 0) { in mac802154_llsec_encrypt()
722 authlen = ieee802154_sechdr_authtag_len(&hdr.sec); in mac802154_llsec_encrypt()
729 read_lock_bh(&sec->lock); in mac802154_llsec_encrypt()
731 if (!sec->params.enabled) { in mac802154_llsec_encrypt()
736 key = llsec_lookup_key(sec, &hdr, &hdr.dest, NULL); in mac802154_llsec_encrypt()
742 read_unlock_bh(&sec->lock); in mac802154_llsec_encrypt()
744 write_lock_bh(&sec->lock); in mac802154_llsec_encrypt()
746 frame_ctr = be32_to_cpu(sec->params.frame_counter); in mac802154_llsec_encrypt()
747 hdr.sec.frame_counter = cpu_to_le32(frame_ctr); in mac802154_llsec_encrypt()
749 write_unlock_bh(&sec->lock); in mac802154_llsec_encrypt()
755 sec->params.frame_counter = cpu_to_be32(frame_ctr + 1); in mac802154_llsec_encrypt()
757 write_unlock_bh(&sec->lock); in mac802154_llsec_encrypt()
764 rc = llsec_do_encrypt(skb, sec, &hdr, key); in mac802154_llsec_encrypt()
770 read_unlock_bh(&sec->lock); in mac802154_llsec_encrypt()
777 llsec_lookup_dev(struct mac802154_llsec *sec, in llsec_lookup_dev() argument
784 llsec_recover_addr(sec, &devaddr) < 0) in llsec_lookup_dev()
791 hash_for_each_possible_rcu(sec->devices_short, dev, in llsec_lookup_dev()
800 hash_for_each_possible_rcu(sec->devices_hw, dev, in llsec_lookup_dev()
811 llsec_lookup_seclevel(const struct mac802154_llsec *sec, in llsec_lookup_seclevel() argument
817 list_for_each_entry_rcu(level, &sec->table.security_levels, list) { in llsec_lookup_seclevel()
830 llsec_do_decrypt_unauth(struct sk_buff *skb, const struct mac802154_llsec *sec, in llsec_do_decrypt_unauth() argument
844 llsec_geniv(iv, dev_addr, &hdr->sec); in llsec_do_decrypt_unauth()
854 llsec_do_decrypt_auth(struct sk_buff *skb, const struct mac802154_llsec *sec, in llsec_do_decrypt_auth() argument
864 authlen = ieee802154_sechdr_authtag_len(&hdr->sec); in llsec_do_decrypt_auth()
865 llsec_geniv(iv, dev_addr, &hdr->sec); in llsec_do_decrypt_auth()
878 if (hdr->sec.level & IEEE802154_SCF_SECLEVEL_ENC) { in llsec_do_decrypt_auth()
902 llsec_do_decrypt(struct sk_buff *skb, const struct mac802154_llsec *sec, in llsec_do_decrypt() argument
906 if (hdr->sec.level == IEEE802154_SCF_SECLEVEL_ENC) in llsec_do_decrypt()
907 return llsec_do_decrypt_unauth(skb, sec, hdr, key, dev_addr); in llsec_do_decrypt()
909 return llsec_do_decrypt_auth(skb, sec, hdr, key, dev_addr); in llsec_do_decrypt()
981 int mac802154_llsec_decrypt(struct mac802154_llsec *sec, struct sk_buff *skb) in mac802154_llsec_decrypt() argument
999 read_lock_bh(&sec->lock); in mac802154_llsec_decrypt()
1000 if (!sec->params.enabled) { in mac802154_llsec_decrypt()
1001 read_unlock_bh(&sec->lock); in mac802154_llsec_decrypt()
1004 read_unlock_bh(&sec->lock); in mac802154_llsec_decrypt()
1008 key = llsec_lookup_key(sec, &hdr, &hdr.source, &key_id); in mac802154_llsec_decrypt()
1014 dev = llsec_lookup_dev(sec, &hdr.source); in mac802154_llsec_decrypt()
1020 if (llsec_lookup_seclevel(sec, hdr.fc.type, 0, &seclevel) < 0) { in mac802154_llsec_decrypt()
1025 if (!(seclevel.sec_levels & BIT(hdr.sec.level)) && in mac802154_llsec_decrypt()
1026 (hdr.sec.level == 0 && seclevel.device_override && in mac802154_llsec_decrypt()
1032 frame_ctr = le32_to_cpu(hdr.sec.frame_counter); in mac802154_llsec_decrypt()
1047 err = llsec_do_decrypt(skb, sec, &hdr, key, dev_addr); in mac802154_llsec_decrypt()