Annotation of embedaddon/strongswan/src/libsimaka/simaka_message.h, revision 1.1
1.1 ! misho 1: /*
! 2: * Copyright (C) 2009 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 libsimaka libsimaka
! 18: *
! 19: * @addtogroup libsimaka
! 20: * Library providing functions shared between EAP-SIM and EAP-AKA plugins.
! 21: *
! 22: * @defgroup simaka_message simaka_message
! 23: * @{ @ingroup libsimaka
! 24: */
! 25:
! 26: #ifndef SIMAKA_MESSAGE_H_
! 27: #define SIMAKA_MESSAGE_H_
! 28:
! 29: #include <utils/utils.h>
! 30: #include <eap/eap.h>
! 31:
! 32: #include "simaka_crypto.h"
! 33:
! 34: typedef enum simaka_attribute_t simaka_attribute_t;
! 35: typedef enum simaka_subtype_t simaka_subtype_t;
! 36: typedef enum simaka_notification_t simaka_notification_t;
! 37: typedef enum simaka_client_error_t simaka_client_error_t;
! 38: typedef struct simaka_message_t simaka_message_t;
! 39:
! 40: /**
! 41: * Subtypes of EAP-SIM/AKA messages
! 42: */
! 43: enum simaka_subtype_t {
! 44: AKA_CHALLENGE = 1,
! 45: AKA_AUTHENTICATION_REJECT = 2,
! 46: AKA_SYNCHRONIZATION_FAILURE = 4,
! 47: AKA_IDENTITY = 5,
! 48: SIM_START = 10,
! 49: SIM_CHALLENGE = 11,
! 50: SIM_NOTIFICATION = 12,
! 51: AKA_NOTIFICATION = 12,
! 52: SIM_REAUTHENTICATION = 13,
! 53: AKA_REAUTHENTICATION = 13,
! 54: SIM_CLIENT_ERROR = 14,
! 55: AKA_CLIENT_ERROR = 14,
! 56: };
! 57:
! 58: /**
! 59: * Enum names for simaka_subtype_t
! 60: */
! 61: extern enum_name_t *simaka_subtype_names;
! 62:
! 63: /**
! 64: * Attributes in EAP-SIM/AKA messages
! 65: */
! 66: enum simaka_attribute_t {
! 67: AT_RAND = 1,
! 68: AT_AUTN = 2,
! 69: AT_RES = 3,
! 70: AT_AUTS = 4,
! 71: AT_PADDING = 6,
! 72: AT_NONCE_MT = 7,
! 73: AT_PERMANENT_ID_REQ = 10,
! 74: AT_MAC = 11,
! 75: AT_NOTIFICATION = 12,
! 76: AT_ANY_ID_REQ = 13,
! 77: AT_IDENTITY = 14,
! 78: AT_VERSION_LIST = 15,
! 79: AT_SELECTED_VERSION = 16,
! 80: AT_FULLAUTH_ID_REQ = 17,
! 81: AT_COUNTER = 19,
! 82: AT_COUNTER_TOO_SMALL = 20,
! 83: AT_NONCE_S = 21,
! 84: AT_CLIENT_ERROR_CODE = 22,
! 85: AT_IV = 129,
! 86: AT_ENCR_DATA = 130,
! 87: AT_NEXT_PSEUDONYM = 132,
! 88: AT_NEXT_REAUTH_ID = 133,
! 89: AT_CHECKCODE = 134,
! 90: AT_RESULT_IND = 135,
! 91: };
! 92:
! 93: /**
! 94: * Enum names for simaka_attribute_t
! 95: */
! 96: extern enum_name_t *simaka_attribute_names;
! 97:
! 98: /**
! 99: * Notification codes used within AT_NOTIFICATION attribute.
! 100: */
! 101: enum simaka_notification_t {
! 102: /** SIM General failure after authentication. (Implies failure) */
! 103: SIM_GENERAL_FAILURE_AA = 0,
! 104: /** AKA General failure after authentication. (Implies failure) */
! 105: AKA_GENERAL_FAILURE_AA = 0,
! 106: /** SIM General failure. (Implies failure, used before authentication) */
! 107: SIM_GENERAL_FAILURE = 16384,
! 108: /** AKA General failure. (Implies failure, used before authentication) */
! 109: AKA_GENERAL_FAILURE = 16384,
! 110: /** SIM User has been temporarily denied access to the requested service. */
! 111: SIM_TEMP_DENIED = 1026,
! 112: /** AKA User has been temporarily denied access to the requested service. */
! 113: AKA_TEMP_DENIED = 1026,
! 114: /** SIM User has not subscribed to the requested service. */
! 115: SIM_NOT_SUBSCRIBED = 1031,
! 116: /** AKA User has not subscribed to the requested service. */
! 117: AKA_NOT_SUBSCRIBED = 1031,
! 118: /** SIM Success. User has been successfully authenticated. */
! 119: SIM_SUCCESS = 32768,
! 120: /** AKA Success. User has been successfully authenticated. */
! 121: AKA_SUCCESS = 32768,
! 122: };
! 123:
! 124: /**
! 125: * Enum names for simaka_notification_t
! 126: */
! 127: extern enum_name_t *simaka_notification_names;
! 128:
! 129: /**
! 130: * Error codes sent in AT_CLIENT_ERROR_CODE attribute
! 131: */
! 132: enum simaka_client_error_t {
! 133: /** AKA unable to process packet */
! 134: AKA_UNABLE_TO_PROCESS = 0,
! 135: /** SIM unable to process packet */
! 136: SIM_UNABLE_TO_PROCESS = 0,
! 137: /** SIM unsupported version */
! 138: SIM_UNSUPPORTED_VERSION = 1,
! 139: /** SIM insufficient number of challenges */
! 140: SIM_INSUFFICIENT_CHALLENGES = 2,
! 141: /** SIM RANDs are not fresh */
! 142: SIM_RANDS_NOT_FRESH = 3,
! 143: };
! 144:
! 145: /**
! 146: * Enum names for simaka_client_error_t
! 147: */
! 148: extern enum_name_t *simaka_client_error_names;
! 149:
! 150: /**
! 151: * Check if an EAP-SIM/AKA attribute is "skippable".
! 152: *
! 153: * @param attribute attribute to check
! 154: * @return TRUE if attribute skippable, FALSE if non-skippable
! 155: */
! 156: bool simaka_attribute_skippable(simaka_attribute_t attribute);
! 157:
! 158: /**
! 159: * EAP-SIM and EAP-AKA message abstraction.
! 160: *
! 161: * Messages for EAP-SIM and EAP-AKA share a common format, this class
! 162: * abstracts such a message and provides encoding/encryption/signing
! 163: * functionality.
! 164: */
! 165: struct simaka_message_t {
! 166:
! 167: /**
! 168: * Check if the given message is a request or response.
! 169: *
! 170: * @return TRUE if request, FALSE if response
! 171: */
! 172: bool (*is_request)(simaka_message_t *this);
! 173:
! 174: /**
! 175: * Get the EAP message identifier.
! 176: *
! 177: * @return EAP message identifier
! 178: */
! 179: uint8_t (*get_identifier)(simaka_message_t *this);
! 180:
! 181: /**
! 182: * Get the EAP type of the message.
! 183: *
! 184: * @return EAP type: EAP-SIM or EAP-AKA
! 185: */
! 186: eap_type_t (*get_type)(simaka_message_t *this);
! 187:
! 188: /**
! 189: * Get the subtype of an EAP-SIM message.
! 190: *
! 191: * @return subtype of message
! 192: */
! 193: simaka_subtype_t (*get_subtype)(simaka_message_t *this);
! 194:
! 195: /**
! 196: * Create an enumerator over message attributes.
! 197: *
! 198: * @return enumerator over (simaka_attribute_t, chunk_t)
! 199: */
! 200: enumerator_t* (*create_attribute_enumerator)(simaka_message_t *this);
! 201:
! 202: /**
! 203: * Append an attribute to the EAP-SIM message.
! 204: *
! 205: * Make sure to pass only data of correct length for the given attribute.
! 206: *
! 207: * @param type type of attribute to add to message
! 208: * @param data unpadded attribute data to add
! 209: */
! 210: void (*add_attribute)(simaka_message_t *this, simaka_attribute_t type,
! 211: chunk_t data);
! 212:
! 213: /**
! 214: * Parse a message, with optional attribute decryption.
! 215: *
! 216: * This method does not verify message integrity, as the key is available
! 217: * only after the payload has been parsed. It might be necessary to call
! 218: * parse twice, as key derivation data in EAP-SIM/AKA is in the same
! 219: * packet as encrypted data.
! 220: *
! 221: * @param crypto EAP-SIM/AKA crypto helper
! 222: * @return TRUE if message parsed successfully
! 223: */
! 224: bool (*parse)(simaka_message_t *this);
! 225:
! 226: /**
! 227: * Verify the message integrity of a parsed message.
! 228: *
! 229: * @param crypto EAP-SIM/AKA crypto helper
! 230: * @param sigdata additional data to include in signature, if any
! 231: * @return TRUE if message integrity check successful
! 232: */
! 233: bool (*verify)(simaka_message_t *this, chunk_t sigdata);
! 234:
! 235: /**
! 236: * Generate a message, optionally encrypt attributes and create a MAC.
! 237: *
! 238: * @param sigdata additional data to include in signature, if any
! 239: * @param gen allocated generated data, if successful
! 240: * @return TRUE if successful
! 241: */
! 242: bool (*generate)(simaka_message_t *this, chunk_t sigdata, chunk_t *gen);
! 243:
! 244: /**
! 245: * Destroy a simaka_message_t.
! 246: */
! 247: void (*destroy)(simaka_message_t *this);
! 248: };
! 249:
! 250: /**
! 251: * Create an empty simaka_message.
! 252: *
! 253: * @param request TRUE for a request message, FALSE for a response
! 254: * @param identifier EAP message identifier
! 255: * @param type EAP type: EAP-SIM or EAP-AKA
! 256: * @param subtype subtype of the EAP message
! 257: * @param crypto EAP-SIM/AKA crypto helper
! 258: * @return empty message of requested kind, NULL on error
! 259: */
! 260: simaka_message_t *simaka_message_create(bool request, uint8_t identifier,
! 261: eap_type_t type, simaka_subtype_t subtype,
! 262: simaka_crypto_t *crypto);
! 263:
! 264: /**
! 265: * Create an simaka_message from a chunk of data.
! 266: *
! 267: * @param data message data to parse
! 268: * @param crypto EAP-SIM/AKA crypto helper
! 269: * @return EAP message, NULL on error
! 270: */
! 271: simaka_message_t *simaka_message_create_from_payload(chunk_t data,
! 272: simaka_crypto_t *crypto);
! 273:
! 274: #endif /** SIMAKA_MESSAGE_H_ @}*/
FreeBSD-CVSweb <freebsd-cvsweb@FreeBSD.org>