123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192 |
- /*
- * $Id$
- *
- * Copyright (C) 2012 Smile Communications, [email protected]
- * Copyright (C) 2012 Smile Communications, [email protected]
- *
- * The initial version of this code was written by Dragos Vingarzan
- * (dragos(dot)vingarzan(at)fokus(dot)fraunhofer(dot)de and the
- * Fruanhofer Institute. It was and still is maintained in a separate
- * branch of the original SER. We are therefore migrating it to
- * Kamailio/SR and look forward to maintaining it from here on out.
- * 2011/2012 Smile Communications, Pty. Ltd.
- * ported/maintained/improved by
- * Jason Penton (jason(dot)penton(at)smilecoms.com and
- * Richard Good (richard(dot)good(at)smilecoms.com) as part of an
- * effort to add full IMS support to Kamailio/SR using a new and
- * improved architecture
- *
- * NB: Alot of this code was originally part of OpenIMSCore,
- * FhG Fokus.
- * Copyright (C) 2004-2006 FhG Fokus
- * Thanks for great work! This is an effort to
- * break apart the various CSCF functions into logically separate
- * components. We hope this will drive wider use. We also feel
- * that in this way the architecture is more complete and thereby easier
- * to manage in the Kamailio/SR environment
- *
- * This file is part of Kamailio, a free SIP server.
- *
- * Kamailio is free software; you can redistribute it and/or modify
- * it under the terms of the GNU General Public License as published by
- * the Free Software Foundation; either version 2 of the License, or
- * (at your option) any later version
- *
- * Kamailio is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- * GNU General Public License for more details.
- *
- * You should have received a copy of the GNU General Public License
- * along with this program; if not, write to the Free Software
- * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
- *
- */
- #ifndef AUTHORIZE_H
- #define AUTHORIZE_H
- #include "../../parser/msg_parser.h"
- #include "api.h"
- #include "conversion.h"
- #include "rfc2617.h"
- #include "sip_messages.h"
- #include "cxdx_mar.h"
- #define NONCE_LEN 16
- #define RAND_LEN 16
- enum authorization_types {
- AUTH_UNKNOWN = 0,
- /* 3GPP */
- AUTH_AKAV1_MD5 = 1,
- AUTH_AKAV2_MD5 = 2,
- AUTH_EARLY_IMS = 3,
- /* FOKUS */
- AUTH_MD5 = 4,
- /* CableLabs */
- AUTH_DIGEST = 5,
- /* 3GPP */
- AUTH_SIP_DIGEST = 6,
- /* TISPAN */
- AUTH_HTTP_DIGEST_MD5 = 7,
- AUTH_NASS_BUNDLED = 8
- };
- /** Enumeration for the Authorization Vector status */
- enum auth_vector_status {
- AUTH_VECTOR_UNUSED = 0,
- AUTH_VECTOR_SENT = 1,
- AUTH_VECTOR_USELESS = 2, /**< invalidated, marked for deletion */
- AUTH_VECTOR_USED = 3 /**< the vector has been successfully used */
- } ;
- /** Authorization Vector storage structure */
- typedef struct _auth_vector {
- int item_number; /**< index of the auth vector */
- unsigned char type; /**< type of authentication vector */
- str authenticate; /**< challenge (rand|autn in AKA) */
- str authorization; /**< expected response */
- str ck; /**< Cypher Key */
- str ik; /**< Integrity Key */
- time_t expires;/**< expires in (after it is sent) */
- uint32_t use_nb; /**< number of use (nonce count)*/
-
- enum auth_vector_status status;/**< current status */
- struct _auth_vector *next;/**< next av in the list */
- struct _auth_vector *prev;/**< previous av in the list */
- } auth_vector;
- /** Set of auth_vectors used by a private id */
- typedef struct _auth_userdata{
- unsigned int hash; /**< hash of the auth data */
- str private_identity; /**< authorization username */
- str public_identity; /**< public identity linked to */
- time_t expires; /**< expires in */
- auth_vector *head; /**< first auth vector in list */
- auth_vector *tail; /**< last auth vector in list */
-
- struct _auth_userdata *next;/**< next element in list */
- struct _auth_userdata *prev;/**< previous element in list*/
- } auth_userdata;
- /** Authorization user data hash slot */
- typedef struct {
- auth_userdata *head; /**< first in the slot */
- auth_userdata *tail; /**< last in the slot */
- gen_lock_t *lock; /**< slot lock */
- } auth_hash_slot_t;
- int auth_db_init(const str* db_url);
- int auth_db_bind(const str* db_url);
- void auth_db_close(void);
- /*
- * Authorize using Proxy-Authorization header field
- */
- int proxy_authenticate(struct sip_msg* _msg, char* _realm, char* _table);
- int proxy_challenge(struct sip_msg* msg, char* route, char* _realm, char* str2);
- /*
- * Authorize using WWW-Authorization header field
- */
- int www_authenticate(struct sip_msg* _msg, char* _realm, char* _table);
- int www_challenge2(struct sip_msg* msg, char* route, char* _realm, char* str2);
- int www_challenge3(struct sip_msg* msg, char* route, char* _realm, char* str2);
- int www_resync_auth(struct sip_msg* msg, char* _route, char* str1, char* str2);
- /*
- * Bind to IMS_AUTH API
- */
- int bind_ims_auth(ims_auth_api_t* api);
- auth_vector* get_auth_vector(str private_identity,str public_identity,int status,str *nonce,unsigned int *hash);
- /*
- * Storage of authentication vectors
- */
- inline void auth_data_lock(unsigned int hash);
- inline void auth_data_unlock(unsigned int hash);
-
- int auth_data_init(int size);
- void auth_data_destroy();
- auth_vector *new_auth_vector(int item_number,str auth_scheme,str authenticate,
- str authorization,str ck,str ik);
- void free_auth_vector(auth_vector *av);
- auth_userdata *new_auth_userdata(str private_identity,str public_identity);
- void free_auth_userdata(auth_userdata *aud);
- inline unsigned int get_hash_auth(str private_identity,str public_identity);
- int add_auth_vector(str private_identity,str public_identity,auth_vector *av);
- auth_vector* get_auth_vector(str private_identity,str public_identity,int status,str *nonce,unsigned int *hash);
- int drop_auth_userdata(str private_identity,str public_identity);
- auth_userdata* get_auth_userdata(str private_identity,str public_identity);
- int stateful_request_reply(struct sip_msg *msg, int code, char *text);
- int stateful_request_reply_async(struct cell* t, struct sip_msg *msg, int code, char *text);
- int multimedia_auth_request(struct sip_msg *msg, str public_identity, str private_identity,
- int count,str auth_scheme,str nonce,str auts,str servername, saved_transaction_t* transaction_data);
- int pack_challenge(struct sip_msg *msg,str realm,auth_vector *av, int is_proxy_auth);
- int add_authinfo_resp_hdr(struct sip_msg *msg, str nextnonce, str qop, HASHHEX rspauth, str cnonce, str nc);
- inline void start_reg_await_timer(auth_vector *av);
- void reg_await_timer(unsigned int ticks, void* param);
- unsigned char get_algorithm_type(str algorithm);
- #endif /* AUTHORIZE_H */
|