Annotation of embedaddon/strongswan/src/libsimaka/simaka_message.h, revision 1.1.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>