160c778b25972e095df8981dd41e99d161e8738f9Vlad Yasevich/* SCTP kernel implementation 21f485649f52929d9937b346a920a522a7363e202Vlad Yasevich * (C) Copyright 2007 Hewlett-Packard Development Company, L.P. 31f485649f52929d9937b346a920a522a7363e202Vlad Yasevich * 460c778b25972e095df8981dd41e99d161e8738f9Vlad Yasevich * This file is part of the SCTP kernel implementation 51f485649f52929d9937b346a920a522a7363e202Vlad Yasevich * 660c778b25972e095df8981dd41e99d161e8738f9Vlad Yasevich * This SCTP implementation is free software; 71f485649f52929d9937b346a920a522a7363e202Vlad Yasevich * you can redistribute it and/or modify it under the terms of 81f485649f52929d9937b346a920a522a7363e202Vlad Yasevich * the GNU General Public License as published by 91f485649f52929d9937b346a920a522a7363e202Vlad Yasevich * the Free Software Foundation; either version 2, or (at your option) 101f485649f52929d9937b346a920a522a7363e202Vlad Yasevich * any later version. 111f485649f52929d9937b346a920a522a7363e202Vlad Yasevich * 1260c778b25972e095df8981dd41e99d161e8738f9Vlad Yasevich * This SCTP implementation is distributed in the hope that it 131f485649f52929d9937b346a920a522a7363e202Vlad Yasevich * will be useful, but WITHOUT ANY WARRANTY; without even the implied 141f485649f52929d9937b346a920a522a7363e202Vlad Yasevich * ************************ 151f485649f52929d9937b346a920a522a7363e202Vlad Yasevich * warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. 161f485649f52929d9937b346a920a522a7363e202Vlad Yasevich * See the GNU General Public License for more details. 171f485649f52929d9937b346a920a522a7363e202Vlad Yasevich * 181f485649f52929d9937b346a920a522a7363e202Vlad Yasevich * You should have received a copy of the GNU General Public License 191f485649f52929d9937b346a920a522a7363e202Vlad Yasevich * along with GNU CC; see the file COPYING. If not, write to 201f485649f52929d9937b346a920a522a7363e202Vlad Yasevich * the Free Software Foundation, 59 Temple Place - Suite 330, 211f485649f52929d9937b346a920a522a7363e202Vlad Yasevich * Boston, MA 02111-1307, USA. 221f485649f52929d9937b346a920a522a7363e202Vlad Yasevich * 231f485649f52929d9937b346a920a522a7363e202Vlad Yasevich * Please send any bug reports or fixes you make to the 241f485649f52929d9937b346a920a522a7363e202Vlad Yasevich * email address(es): 251f485649f52929d9937b346a920a522a7363e202Vlad Yasevich * lksctp developers <lksctp-developers@lists.sourceforge.net> 261f485649f52929d9937b346a920a522a7363e202Vlad Yasevich * 271f485649f52929d9937b346a920a522a7363e202Vlad Yasevich * Or submit a bug report through the following website: 281f485649f52929d9937b346a920a522a7363e202Vlad Yasevich * http://www.sf.net/projects/lksctp 291f485649f52929d9937b346a920a522a7363e202Vlad Yasevich * 301f485649f52929d9937b346a920a522a7363e202Vlad Yasevich * Written or modified by: 311f485649f52929d9937b346a920a522a7363e202Vlad Yasevich * Vlad Yasevich <vladislav.yasevich@hp.com> 321f485649f52929d9937b346a920a522a7363e202Vlad Yasevich * 331f485649f52929d9937b346a920a522a7363e202Vlad Yasevich * Any bugs reported given to us we will try to fix... any fixes shared will 341f485649f52929d9937b346a920a522a7363e202Vlad Yasevich * be incorporated into the next SCTP release. 351f485649f52929d9937b346a920a522a7363e202Vlad Yasevich */ 361f485649f52929d9937b346a920a522a7363e202Vlad Yasevich 371f485649f52929d9937b346a920a522a7363e202Vlad Yasevich#ifndef __sctp_auth_h__ 381f485649f52929d9937b346a920a522a7363e202Vlad Yasevich#define __sctp_auth_h__ 391f485649f52929d9937b346a920a522a7363e202Vlad Yasevich 401f485649f52929d9937b346a920a522a7363e202Vlad Yasevich#include <linux/list.h> 411f485649f52929d9937b346a920a522a7363e202Vlad Yasevich#include <linux/crypto.h> 421f485649f52929d9937b346a920a522a7363e202Vlad Yasevich 431f485649f52929d9937b346a920a522a7363e202Vlad Yasevichstruct sctp_endpoint; 441f485649f52929d9937b346a920a522a7363e202Vlad Yasevichstruct sctp_association; 451f485649f52929d9937b346a920a522a7363e202Vlad Yasevichstruct sctp_authkey; 4665b07e5d0d09c77e98050b5f0146ead29e5add32Vlad Yasevichstruct sctp_hmacalgo; 471f485649f52929d9937b346a920a522a7363e202Vlad Yasevich 481f485649f52929d9937b346a920a522a7363e202Vlad Yasevich/* 491f485649f52929d9937b346a920a522a7363e202Vlad Yasevich * Define a generic struct that will hold all the info 501f485649f52929d9937b346a920a522a7363e202Vlad Yasevich * necessary for an HMAC transform 511f485649f52929d9937b346a920a522a7363e202Vlad Yasevich */ 521f485649f52929d9937b346a920a522a7363e202Vlad Yasevichstruct sctp_hmac { 531f485649f52929d9937b346a920a522a7363e202Vlad Yasevich __u16 hmac_id; /* one of the above ids */ 541f485649f52929d9937b346a920a522a7363e202Vlad Yasevich char *hmac_name; /* name for loading */ 551f485649f52929d9937b346a920a522a7363e202Vlad Yasevich __u16 hmac_len; /* length of the signature */ 561f485649f52929d9937b346a920a522a7363e202Vlad Yasevich}; 571f485649f52929d9937b346a920a522a7363e202Vlad Yasevich 581f485649f52929d9937b346a920a522a7363e202Vlad Yasevich/* This is generic structure that containst authentication bytes used 591f485649f52929d9937b346a920a522a7363e202Vlad Yasevich * as keying material. It's a what is referred to as byte-vector all 601f485649f52929d9937b346a920a522a7363e202Vlad Yasevich * over SCTP-AUTH 611f485649f52929d9937b346a920a522a7363e202Vlad Yasevich */ 621f485649f52929d9937b346a920a522a7363e202Vlad Yasevichstruct sctp_auth_bytes { 631f485649f52929d9937b346a920a522a7363e202Vlad Yasevich atomic_t refcnt; 641f485649f52929d9937b346a920a522a7363e202Vlad Yasevich __u32 len; 651f485649f52929d9937b346a920a522a7363e202Vlad Yasevich __u8 data[]; 661f485649f52929d9937b346a920a522a7363e202Vlad Yasevich}; 671f485649f52929d9937b346a920a522a7363e202Vlad Yasevich 681f485649f52929d9937b346a920a522a7363e202Vlad Yasevich/* Definition for a shared key, weather endpoint or association */ 691f485649f52929d9937b346a920a522a7363e202Vlad Yasevichstruct sctp_shared_key { 701f485649f52929d9937b346a920a522a7363e202Vlad Yasevich struct list_head key_list; 711f485649f52929d9937b346a920a522a7363e202Vlad Yasevich __u16 key_id; 721f485649f52929d9937b346a920a522a7363e202Vlad Yasevich struct sctp_auth_bytes *key; 731f485649f52929d9937b346a920a522a7363e202Vlad Yasevich}; 741f485649f52929d9937b346a920a522a7363e202Vlad Yasevich 751f485649f52929d9937b346a920a522a7363e202Vlad Yasevich#define key_for_each(__key, __list_head) \ 761f485649f52929d9937b346a920a522a7363e202Vlad Yasevich list_for_each_entry(__key, __list_head, key_list) 771f485649f52929d9937b346a920a522a7363e202Vlad Yasevich 781f485649f52929d9937b346a920a522a7363e202Vlad Yasevich#define key_for_each_safe(__key, __tmp, __list_head) \ 791f485649f52929d9937b346a920a522a7363e202Vlad Yasevich list_for_each_entry_safe(__key, __tmp, __list_head, key_list) 801f485649f52929d9937b346a920a522a7363e202Vlad Yasevich 811f485649f52929d9937b346a920a522a7363e202Vlad Yasevichstatic inline void sctp_auth_key_hold(struct sctp_auth_bytes *key) 821f485649f52929d9937b346a920a522a7363e202Vlad Yasevich{ 831f485649f52929d9937b346a920a522a7363e202Vlad Yasevich if (!key) 841f485649f52929d9937b346a920a522a7363e202Vlad Yasevich return; 851f485649f52929d9937b346a920a522a7363e202Vlad Yasevich 861f485649f52929d9937b346a920a522a7363e202Vlad Yasevich atomic_inc(&key->refcnt); 871f485649f52929d9937b346a920a522a7363e202Vlad Yasevich} 881f485649f52929d9937b346a920a522a7363e202Vlad Yasevich 891f485649f52929d9937b346a920a522a7363e202Vlad Yasevichvoid sctp_auth_key_put(struct sctp_auth_bytes *key); 901f485649f52929d9937b346a920a522a7363e202Vlad Yasevichstruct sctp_shared_key *sctp_auth_shkey_create(__u16 key_id, gfp_t gfp); 911f485649f52929d9937b346a920a522a7363e202Vlad Yasevichvoid sctp_auth_destroy_keys(struct list_head *keys); 921f485649f52929d9937b346a920a522a7363e202Vlad Yasevichint sctp_auth_asoc_init_active_key(struct sctp_association *asoc, gfp_t gfp); 931f485649f52929d9937b346a920a522a7363e202Vlad Yasevichstruct sctp_shared_key *sctp_auth_get_shkey( 941f485649f52929d9937b346a920a522a7363e202Vlad Yasevich const struct sctp_association *asoc, 951f485649f52929d9937b346a920a522a7363e202Vlad Yasevich __u16 key_id); 961f485649f52929d9937b346a920a522a7363e202Vlad Yasevichint sctp_auth_asoc_copy_shkeys(const struct sctp_endpoint *ep, 971f485649f52929d9937b346a920a522a7363e202Vlad Yasevich struct sctp_association *asoc, 981f485649f52929d9937b346a920a522a7363e202Vlad Yasevich gfp_t gfp); 991f485649f52929d9937b346a920a522a7363e202Vlad Yasevichint sctp_auth_init_hmacs(struct sctp_endpoint *ep, gfp_t gfp); 1001f485649f52929d9937b346a920a522a7363e202Vlad Yasevichvoid sctp_auth_destroy_hmacs(struct crypto_hash *auth_hmacs[]); 1011f485649f52929d9937b346a920a522a7363e202Vlad Yasevichstruct sctp_hmac *sctp_auth_get_hmac(__u16 hmac_id); 1021f485649f52929d9937b346a920a522a7363e202Vlad Yasevichstruct sctp_hmac *sctp_auth_asoc_get_hmac(const struct sctp_association *asoc); 1031f485649f52929d9937b346a920a522a7363e202Vlad Yasevichvoid sctp_auth_asoc_set_default_hmac(struct sctp_association *asoc, 1041f485649f52929d9937b346a920a522a7363e202Vlad Yasevich struct sctp_hmac_algo_param *hmacs); 1051f485649f52929d9937b346a920a522a7363e202Vlad Yasevichint sctp_auth_asoc_verify_hmac_id(const struct sctp_association *asoc, 106d06f608265d5fc41aefe2fae5b62da4893ecae35Al Viro __be16 hmac_id); 1071f485649f52929d9937b346a920a522a7363e202Vlad Yasevichint sctp_auth_send_cid(sctp_cid_t chunk, const struct sctp_association *asoc); 1081f485649f52929d9937b346a920a522a7363e202Vlad Yasevichint sctp_auth_recv_cid(sctp_cid_t chunk, const struct sctp_association *asoc); 1091f485649f52929d9937b346a920a522a7363e202Vlad Yasevichvoid sctp_auth_calculate_hmac(const struct sctp_association *asoc, 1101f485649f52929d9937b346a920a522a7363e202Vlad Yasevich struct sk_buff *skb, 1111f485649f52929d9937b346a920a522a7363e202Vlad Yasevich struct sctp_auth_chunk *auth, gfp_t gfp); 11265b07e5d0d09c77e98050b5f0146ead29e5add32Vlad Yasevich 11365b07e5d0d09c77e98050b5f0146ead29e5add32Vlad Yasevich/* API Helpers */ 11465b07e5d0d09c77e98050b5f0146ead29e5add32Vlad Yasevichint sctp_auth_ep_add_chunkid(struct sctp_endpoint *ep, __u8 chunk_id); 11565b07e5d0d09c77e98050b5f0146ead29e5add32Vlad Yasevichint sctp_auth_ep_set_hmacs(struct sctp_endpoint *ep, 11665b07e5d0d09c77e98050b5f0146ead29e5add32Vlad Yasevich struct sctp_hmacalgo *hmacs); 11765b07e5d0d09c77e98050b5f0146ead29e5add32Vlad Yasevichint sctp_auth_set_key(struct sctp_endpoint *ep, 11865b07e5d0d09c77e98050b5f0146ead29e5add32Vlad Yasevich struct sctp_association *asoc, 11965b07e5d0d09c77e98050b5f0146ead29e5add32Vlad Yasevich struct sctp_authkey *auth_key); 12065b07e5d0d09c77e98050b5f0146ead29e5add32Vlad Yasevichint sctp_auth_set_active_key(struct sctp_endpoint *ep, 12165b07e5d0d09c77e98050b5f0146ead29e5add32Vlad Yasevich struct sctp_association *asoc, 12265b07e5d0d09c77e98050b5f0146ead29e5add32Vlad Yasevich __u16 key_id); 12365b07e5d0d09c77e98050b5f0146ead29e5add32Vlad Yasevichint sctp_auth_del_key_id(struct sctp_endpoint *ep, 12465b07e5d0d09c77e98050b5f0146ead29e5add32Vlad Yasevich struct sctp_association *asoc, 12565b07e5d0d09c77e98050b5f0146ead29e5add32Vlad Yasevich __u16 key_id); 12665b07e5d0d09c77e98050b5f0146ead29e5add32Vlad Yasevich 1271f485649f52929d9937b346a920a522a7363e202Vlad Yasevich#endif 128