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