libimcv: Moved REST API from imv_swid and imv_swima to libimcv
[strongswan.git] / src / libsimaka / simaka_message.h
index a09d72f..2393d34 100644 (file)
  */
 
 /**
+ * @defgroup libsimaka libsimaka
+ *
+ * @addtogroup libsimaka
+ * Library providing functions shared between EAP-SIM and EAP-AKA plugins.
+ *
  * @defgroup simaka_message simaka_message
  * @{ @ingroup libsimaka
  */
 #ifndef SIMAKA_MESSAGE_H_
 #define SIMAKA_MESSAGE_H_
 
-#include <enum.h>
-#include <daemon.h>
+#include <utils/utils.h>
+#include <eap/eap.h>
 
 #include "simaka_crypto.h"
 
-typedef struct simaka_message_t simaka_message_t;
 typedef enum simaka_attribute_t simaka_attribute_t;
 typedef enum simaka_subtype_t simaka_subtype_t;
+typedef enum simaka_notification_t simaka_notification_t;
+typedef enum simaka_client_error_t simaka_client_error_t;
+typedef struct simaka_message_t simaka_message_t;
 
 /**
  * Subtypes of EAP-SIM/AKA messages
@@ -89,6 +96,66 @@ enum simaka_attribute_t {
 extern enum_name_t *simaka_attribute_names;
 
 /**
+ * Notification codes used within AT_NOTIFICATION attribute.
+ */
+enum simaka_notification_t {
+       /** SIM General failure after authentication. (Implies failure) */
+       SIM_GENERAL_FAILURE_AA = 0,
+       /** AKA General failure after authentication. (Implies failure) */
+       AKA_GENERAL_FAILURE_AA = 0,
+       /** SIM General failure. (Implies failure, used before authentication) */
+       SIM_GENERAL_FAILURE = 16384,
+       /** AKA General failure. (Implies failure, used before authentication) */
+       AKA_GENERAL_FAILURE = 16384,
+       /** SIM User has been temporarily denied access to the requested service. */
+       SIM_TEMP_DENIED = 1026,
+       /** AKA User has been temporarily denied access to the requested service. */
+       AKA_TEMP_DENIED = 1026,
+       /** SIM User has not subscribed to the requested service. */
+       SIM_NOT_SUBSCRIBED = 1031,
+       /** AKA User has not subscribed to the requested service. */
+       AKA_NOT_SUBSCRIBED = 1031,
+       /** SIM Success. User has been successfully authenticated. */
+       SIM_SUCCESS = 32768,
+       /** AKA Success. User has been successfully authenticated. */
+       AKA_SUCCESS = 32768,
+};
+
+/**
+ * Enum names for simaka_notification_t
+ */
+extern enum_name_t *simaka_notification_names;
+
+/**
+ * Error codes sent in AT_CLIENT_ERROR_CODE attribute
+ */
+enum simaka_client_error_t {
+       /** AKA unable to process packet */
+       AKA_UNABLE_TO_PROCESS = 0,
+       /** SIM unable to process packet */
+       SIM_UNABLE_TO_PROCESS = 0,
+       /** SIM unsupported version */
+       SIM_UNSUPPORTED_VERSION = 1,
+       /** SIM insufficient number of challenges */
+       SIM_INSUFFICIENT_CHALLENGES = 2,
+       /** SIM RANDs are not fresh */
+       SIM_RANDS_NOT_FRESH = 3,
+};
+
+/**
+ * Enum names for simaka_client_error_t
+ */
+extern enum_name_t *simaka_client_error_names;
+
+/**
+ * Check if an EAP-SIM/AKA attribute is "skippable".
+ *
+ * @param attribute            attribute to check
+ * @return                             TRUE if attribute skippable, FALSE if non-skippable
+ */
+bool simaka_attribute_skippable(simaka_attribute_t attribute);
+
+/**
  * EAP-SIM and EAP-AKA message abstraction.
  *
  * Messages for EAP-SIM and EAP-AKA share a common format, this class
@@ -109,7 +176,7 @@ struct simaka_message_t {
         *
         * @return                      EAP message identifier
         */
-       u_int8_t (*get_identifier)(simaka_message_t *this);
+       uint8_t (*get_identifier)(simaka_message_t *this);
 
        /**
         * Get the EAP type of the message.
@@ -147,12 +214,14 @@ struct simaka_message_t {
         * Parse a message, with optional attribute decryption.
         *
         * This method does not verify message integrity, as the key is available
-        * only after the payload has been parsed.
+        * only after the payload has been parsed. It might be necessary to call
+        * parse twice, as key derivation data in EAP-SIM/AKA is in the same
+        * packet as encrypted data.
         *
         * @param crypto        EAP-SIM/AKA crypto helper
         * @return                      TRUE if message parsed successfully
         */
-       bool (*parse)(simaka_message_t *this, simaka_crypto_t *crypto);
+       bool (*parse)(simaka_message_t *this);
 
        /**
         * Verify the message integrity of a parsed message.
@@ -161,18 +230,16 @@ struct simaka_message_t {
         * @param sigdata       additional data to include in signature, if any
         * @return                      TRUE if message integrity check successful
         */
-       bool (*verify)(simaka_message_t *this, simaka_crypto_t *crypto,
-                                  chunk_t sigdata);
+       bool (*verify)(simaka_message_t *this, chunk_t sigdata);
 
        /**
         * Generate a message, optionally encrypt attributes and create a MAC.
         *
-        * @param crypto        EAP-SIM/AKA crypto helper
         * @param sigdata       additional data to include in signature, if any
-        * @return                      generated eap payload, NULL if failed
+        * @param gen           allocated generated data, if successful
+        * @return                      TRUE if successful
         */
-       eap_payload_t* (*generate)(simaka_message_t *this, simaka_crypto_t *crypto,
-                                                          chunk_t sigdata);
+       bool (*generate)(simaka_message_t *this, chunk_t sigdata, chunk_t *gen);
 
        /**
         * Destroy a simaka_message_t.
@@ -185,18 +252,23 @@ struct simaka_message_t {
  *
  * @param request              TRUE for a request message, FALSE for a response
  * @param identifier   EAP message identifier
- * @param type                 EAP subtype of the message
+ * @param type                 EAP type: EAP-SIM or EAP-AKA
+ * @param subtype              subtype of the EAP message
+ * @param crypto               EAP-SIM/AKA crypto helper
  * @return                             empty message of requested kind, NULL on error
  */
-simaka_message_t *simaka_message_create(bool request, u_int8_t identifier,
-                                                               eap_type_t type, simaka_subtype_t subtype);
+simaka_message_t *simaka_message_create(bool request, uint8_t identifier,
+                                                                       eap_type_t type, simaka_subtype_t subtype,
+                                                                       simaka_crypto_t *crypto);
 
 /**
  * Create an simaka_message from a chunk of data.
  *
- * @param payload              payload to create message from
+ * @param data                 message data to parse
+ * @param crypto               EAP-SIM/AKA crypto helper
  * @return                             EAP message, NULL on error
  */
-simaka_message_t *simaka_message_create_from_payload(eap_payload_t *payload);
+simaka_message_t *simaka_message_create_from_payload(chunk_t data,
+                                                                                                        simaka_crypto_t *crypto);
 
-#endif /* SIMAKA_MESSAGE_H_ @}*/
+#endif /** SIMAKA_MESSAGE_H_ @}*/