Annotation of embedaddon/strongswan/src/libsimaka/simaka_manager.h, revision 1.1
1.1 ! misho 1: /*
! 2: * Copyright (C) 2008-2011 Martin Willi
! 3: * HSR Hochschule fuer Technik Rapperswil
! 4: *
! 5: * This program is free software; you can redistribute it and/or modify it
! 6: * under the terms of the GNU General Public License as published by the
! 7: * Free Software Foundation; either version 2 of the License, or (at your
! 8: * option) any later version. See <http://www.fsf.org/copyleft/gpl.txt>.
! 9: *
! 10: * This program is distributed in the hope that it will be useful, but
! 11: * WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY
! 12: * or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
! 13: * for more details.
! 14: */
! 15:
! 16: /**
! 17: * @defgroup simaka_manager simaka_manager
! 18: * @{ @ingroup libsimaka
! 19: */
! 20:
! 21: #ifndef SIMAKA_MANAGER_H_
! 22: #define SIMAKA_MANAGER_H_
! 23:
! 24: #include <crypto/hashers/hasher.h>
! 25: #include <utils/identification.h>
! 26: #include <collections/enumerator.h>
! 27: #include <plugins/plugin.h>
! 28:
! 29: typedef struct simaka_manager_t simaka_manager_t;
! 30:
! 31: #define SIM_RAND_LEN 16
! 32: #define SIM_SRES_LEN 4
! 33: #define SIM_KC_LEN 8
! 34:
! 35: #define AKA_RAND_LEN 16
! 36: #define AKA_RES_MAX 16
! 37: #define AKA_CK_LEN 16
! 38: #define AKA_IK_LEN 16
! 39: #define AKA_AUTN_LEN 16
! 40: #define AKA_AUTS_LEN 14
! 41:
! 42: #include "simaka_card.h"
! 43: #include "simaka_provider.h"
! 44: #include "simaka_hooks.h"
! 45:
! 46: /**
! 47: * The SIM manager handles multiple (U)SIM cards/providers and hooks.
! 48: */
! 49: struct simaka_manager_t {
! 50:
! 51: /**
! 52: * Register a SIM card (client) at the manager.
! 53: *
! 54: * @param card sim card to register
! 55: */
! 56: void (*add_card)(simaka_manager_t *this, simaka_card_t *card);
! 57:
! 58: /**
! 59: * Unregister a previously registered card from the manager.
! 60: *
! 61: * @param card sim card to unregister
! 62: */
! 63: void (*remove_card)(simaka_manager_t *this, simaka_card_t *card);
! 64:
! 65: /**
! 66: * Calculate SIM triplets on one of the registered SIM cards.
! 67: *
! 68: * @param id permanent identity to get a triplet for
! 69: * @param rand RAND input buffer, fixed size 16 bytes
! 70: * @param sres SRES output buffer, fixed size 4 byte
! 71: * @param kc KC output buffer, fixed size 8 bytes
! 72: * @return TRUE if calculated, FALSE if no matching card found
! 73: */
! 74: bool (*card_get_triplet)(simaka_manager_t *this, identification_t *id,
! 75: char rand[SIM_RAND_LEN], char sres[SIM_SRES_LEN],
! 76: char kc[SIM_KC_LEN]);
! 77:
! 78: /**
! 79: * Calculate AKA quintuplets on one of the registered SIM cards.
! 80: *
! 81: * @param id permanent identity to request quintuplet for
! 82: * @param rand random value rand
! 83: * @param autn authentication token autn
! 84: * @param ck buffer receiving encryption key ck
! 85: * @param ik buffer receiving integrity key ik
! 86: * @param res buffer receiving authentication result res
! 87: * @param res_len number of bytes written to res buffer
! 88: * @return SUCCESS, FAILED, or INVALID_STATE if out of sync
! 89: */
! 90: status_t (*card_get_quintuplet)(simaka_manager_t *this, identification_t *id,
! 91: char rand[AKA_RAND_LEN], char autn[AKA_AUTN_LEN],
! 92: char ck[AKA_CK_LEN], char ik[AKA_IK_LEN],
! 93: char res[AKA_RES_MAX], int *res_len);
! 94:
! 95: /**
! 96: * Calculate resynchronization data on one of the registered SIM cards.
! 97: *
! 98: * @param id permanent identity to request quintuplet for
! 99: * @param rand random value rand
! 100: * @param auts resynchronization parameter auts
! 101: * @return TRUE if calculated, FALSE if no matching card found
! 102: */
! 103: bool (*card_resync)(simaka_manager_t *this, identification_t *id,
! 104: char rand[AKA_RAND_LEN], char auts[AKA_AUTS_LEN]);
! 105:
! 106: /**
! 107: * Store a received pseudonym on one of the registered SIM cards.
! 108: *
! 109: * @param id permanent identity of the peer
! 110: * @param pseudonym pseudonym identity received from the server
! 111: */
! 112: void (*card_set_pseudonym)(simaka_manager_t *this, identification_t *id,
! 113: identification_t *pseudonym);
! 114:
! 115: /**
! 116: * Get a stored pseudonym from one of the registered SIM cards.
! 117: *
! 118: * @param id permanent identity of the peer
! 119: * @return associated pseudonym identity, NULL if none found
! 120: */
! 121: identification_t* (*card_get_pseudonym)(simaka_manager_t *this,
! 122: identification_t *id);
! 123:
! 124: /**
! 125: * Store fast reauthentication parameters on one of the registered cards.
! 126: *
! 127: * @param id permanent identity of the peer
! 128: * @param next next fast reauthentication identity to use
! 129: * @param mk master key MK to store for reauthentication
! 130: * @param counter counter value to store, host order
! 131: */
! 132: void (*card_set_reauth)(simaka_manager_t *this, identification_t *id,
! 133: identification_t *next, char mk[HASH_SIZE_SHA1],
! 134: uint16_t counter);
! 135:
! 136: /**
! 137: * Retrieve fast reauthentication parameters from one of the registered cards.
! 138: *
! 139: * @param id permanent identity of the peer
! 140: * @param mk buffer receiving master key MK
! 141: * @param counter pointer receiving counter value, in host order
! 142: * @return fast reauthentication identity, NULL if none found
! 143: */
! 144: identification_t* (*card_get_reauth)(simaka_manager_t *this,
! 145: identification_t *id, char mk[HASH_SIZE_SHA1],
! 146: uint16_t *counter);
! 147:
! 148: /**
! 149: * Register a triplet provider (server) at the manager.
! 150: *
! 151: * @param card sim card to register
! 152: */
! 153: void (*add_provider)(simaka_manager_t *this, simaka_provider_t *provider);
! 154:
! 155: /**
! 156: * Unregister a previously registered provider from the manager.
! 157: *
! 158: * @param card sim card to unregister
! 159: */
! 160: void (*remove_provider)(simaka_manager_t *this, simaka_provider_t *provider);
! 161:
! 162: /**
! 163: * Get a SIM triplet from one of the registered providers.
! 164: *
! 165: * @param id permanent identity of peer to gen triplet for
! 166: * @param rand RAND output buffer, fixed size 16 bytes
! 167: * @param sres SRES output buffer, fixed size 4 byte
! 168: * @param kc KC output buffer, fixed size 8 bytes
! 169: * @return TRUE if triplet received, FALSE if no match found
! 170: */
! 171: bool (*provider_get_triplet)(simaka_manager_t *this, identification_t *id,
! 172: char rand[SIM_RAND_LEN], char sres[SIM_SRES_LEN],
! 173: char kc[SIM_KC_LEN]);
! 174:
! 175: /**
! 176: * Get a AKA quintuplet from one of the registered providers.
! 177: *
! 178: * @param id permanent identity of peer to create challenge for
! 179: * @param rand buffer receiving random value rand
! 180: * @param xres buffer receiving expected authentication result xres
! 181: * @param ck buffer receiving encryption key ck
! 182: * @param ik buffer receiving integrity key ik
! 183: * @param autn authentication token autn
! 184: * @return TRUE if quintuplet received, FALSE if no match found
! 185: */
! 186: bool (*provider_get_quintuplet)(simaka_manager_t *this, identification_t *id,
! 187: char rand[AKA_RAND_LEN],
! 188: char xres[AKA_RES_MAX], int *xres_len,
! 189: char ck[AKA_CK_LEN], char ik[AKA_IK_LEN],
! 190: char autn[AKA_AUTN_LEN]);
! 191:
! 192: /**
! 193: * Pass AKA resynchronization data to one of the registered providers.
! 194: *
! 195: * @param id permanent identity of peer requesting resynchronization
! 196: * @param rand random value rand
! 197: * @param auts synchronization parameter auts
! 198: * @return TRUE if resynchronized, FALSE if not handled
! 199: */
! 200: bool (*provider_resync)(simaka_manager_t *this, identification_t *id,
! 201: char rand[AKA_RAND_LEN], char auts[AKA_AUTS_LEN]);
! 202:
! 203: /**
! 204: * Check if a peer uses a pseudonym using one of the registered providers.
! 205: *
! 206: * @param id pseudonym identity candidate
! 207: * @return permanent identity, NULL if id not a pseudonym
! 208: */
! 209: identification_t* (*provider_is_pseudonym)(simaka_manager_t *this,
! 210: identification_t *id);
! 211:
! 212: /**
! 213: * Generate a new pseudonym using one of the registered providers.
! 214: *
! 215: * @param id permanent identity to generate a pseudonym for
! 216: * @return generated pseudonym, NULL to not use a pseudonym identity
! 217: */
! 218: identification_t* (*provider_gen_pseudonym)(simaka_manager_t *this,
! 219: identification_t *id);
! 220:
! 221: /**
! 222: * Check if a peer uses a reauth id using one of the registered providers.
! 223: *
! 224: * @param id reauthentication identity (candidate)
! 225: * @param mk buffer receiving master key MK
! 226: * @param counter pointer receiving current counter value, host order
! 227: * @return permanent identity, NULL if not a known reauth identity
! 228: */
! 229: identification_t* (*provider_is_reauth)(simaka_manager_t *this,
! 230: identification_t *id, char mk[HASH_SIZE_SHA1],
! 231: uint16_t *counter);
! 232:
! 233: /**
! 234: * Generate a fast reauth id using one of the registered providers.
! 235: *
! 236: * @param id permanent peer identity
! 237: * @param mk master key to store along with generated identity
! 238: * @return fast reauthentication identity, NULL to not use reauth
! 239: */
! 240: identification_t* (*provider_gen_reauth)(simaka_manager_t *this,
! 241: identification_t *id, char mk[HASH_SIZE_SHA1]);
! 242:
! 243: /**
! 244: * Register a set of hooks to the manager.
! 245: *
! 246: * @param hooks hook interface implementation to register
! 247: */
! 248: void (*add_hooks)(simaka_manager_t *this, simaka_hooks_t *hooks);
! 249:
! 250: /**
! 251: * Unregister a set of hooks from the manager.
! 252: *
! 253: * @param hooks hook interface implementation to unregister
! 254: */
! 255: void (*remove_hooks)(simaka_manager_t *this, simaka_hooks_t *hooks);
! 256:
! 257: /**
! 258: * Invoke SIM/AKA message hook.
! 259: *
! 260: * @param message SIM message
! 261: * @param inbound TRUE for incoming messages, FALSE for outgoing
! 262: * @param decrypted TRUE if AT_ENCR_DATA has been decrypted
! 263: */
! 264: void (*message_hook)(simaka_manager_t *this, simaka_message_t *message,
! 265: bool inbound, bool decrypted);
! 266:
! 267: /**
! 268: * Invoke SIM/AKA key hook.
! 269: *
! 270: * @param k_encr SIM/AKA encryption key k_encr
! 271: * @param k_auth SIM/AKA authentication key k_auth
! 272: */
! 273: void (*key_hook)(simaka_manager_t *this, chunk_t k_encr, chunk_t k_auth);
! 274:
! 275: /**
! 276: * Destroy a manager instance.
! 277: */
! 278: void (*destroy)(simaka_manager_t *this);
! 279: };
! 280:
! 281: /**
! 282: * Create an SIM/AKA manager to handle multiple (U)SIM cards/providers.
! 283: *
! 284: * @return simaka_t object
! 285: */
! 286: simaka_manager_t *simaka_manager_create();
! 287:
! 288: /**
! 289: * Callback for the simaka_manager_register_cb_t, provides backend to register.
! 290: *
! 291: * @param plugin plugin registering a backend (card or provider)
! 292: * @return a simaka_card_t* or simaka_provider_t*, NULL on failure
! 293: */
! 294: typedef void* (*simaka_manager_register_cb_t)(plugin_t *plugin);
! 295:
! 296: /**
! 297: * Helper function to (un-)register SIM/AKA backend plugin features.
! 298: *
! 299: * This function is a plugin_feature_callback_t and can be used with the
! 300: * PLUGIN_CALLBACK macro to register a SIM/AKA backend.
! 301: *
! 302: * @param plugin plugin registering the SIM/AKA backend
! 303: * @param feature associated plugin feature
! 304: * @param reg TRUE to register, FALSE to unregister.
! 305: * @param data data passed to callback, an simaka_manager_register_cb_t
! 306: */
! 307: bool simaka_manager_register(plugin_t *plugin, plugin_feature_t *feature,
! 308: bool reg, void *data);
! 309:
! 310: /**
! 311: * @}
! 312: * @addtogroup libsimaka
! 313: * @{
! 314: *
! 315: * Dummy libsimaka initialization function needed for integrity test
! 316: */
! 317: void libsimaka_init(void);
! 318:
! 319: #endif /** SIMAKA_MANAGER_H_ @}*/
FreeBSD-CVSweb <freebsd-cvsweb@FreeBSD.org>