Handle PRF failures in eap-aka-3gpp2
[strongswan.git] / src / libcharon / plugins / eap_aka_3gpp2 / eap_aka_3gpp2_functions.h
1 /*
2 * Copyright (C) 2008-2009 Martin Willi
3 * 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 eap_aka_3gpp2_functions eap_aka_3gpp2_functions
18 * @{ @ingroup eap_aka_3gpp2
19 */
20
21 #ifndef EAP_AKA_3GPP2_FUNCTIONS_H_
22 #define EAP_AKA_3GPP2_FUNCTIONS_H_
23
24 #include <simaka_manager.h>
25
26 #define AKA_SQN_LEN 6
27 #define AKA_K_LEN 16
28 #define AKA_MAC_LEN 8
29 #define AKA_AK_LEN 6
30 #define AKA_AMF_LEN 2
31 #define AKA_FMK_LEN 4
32
33 typedef struct eap_aka_3gpp2_functions_t eap_aka_3gpp2_functions_t;
34
35 /**
36 * f1-f5(), f1*() and f5*() functions from the 3GPP2 (S.S0055) standard.
37 */
38 struct eap_aka_3gpp2_functions_t {
39
40 /**
41 * Calculate MAC from RAND, SQN, AMF using K.
42 *
43 * @param k secret key K
44 * @param rand random value rand
45 * @param sqn sequence number
46 * @param amf authentication management field
47 * @param mac buffer receiving mac MAC
48 * @return TRUE if calculations successful
49 */
50 bool (*f1)(eap_aka_3gpp2_functions_t *this, u_char k[AKA_K_LEN],
51 u_char rand[AKA_RAND_LEN], u_char sqn[AKA_SQN_LEN],
52 u_char amf[AKA_AMF_LEN], u_char mac[AKA_MAC_LEN]);
53
54 /**
55 * Calculate MACS from RAND, SQN, AMF using K
56 *
57 * @param k secret key K
58 * @param rand random value RAND
59 * @param sqn sequence number
60 * @param amf authentication management field
61 * @param macs buffer receiving resynchronization mac MACS
62 * @return TRUE if calculations successful
63 */
64 bool (*f1star)(eap_aka_3gpp2_functions_t *this, u_char k[AKA_K_LEN],
65 u_char rand[AKA_RAND_LEN], u_char sqn[AKA_SQN_LEN],
66 u_char amf[AKA_AMF_LEN], u_char macs[AKA_MAC_LEN]);
67
68 /**
69 * Calculate RES from RAND using K
70 *
71 * @param k secret key K
72 * @param rand random value RAND
73 * @param res buffer receiving result RES, uses full 128 bit
74 * @return TRUE if calculations successful
75 */
76 bool (*f2)(eap_aka_3gpp2_functions_t *this, u_char k[AKA_K_LEN],
77 u_char rand[AKA_RAND_LEN], u_char res[AKA_RES_MAX]);
78 /**
79 * Calculate CK from RAND using K
80 *
81 * @param k secret key K
82 * @param rand random value RAND
83 * @param macs buffer receiving encryption key CK
84 * @return TRUE if calculations successful
85 */
86 bool (*f3)(eap_aka_3gpp2_functions_t *this, u_char k[AKA_K_LEN],
87 u_char rand[AKA_RAND_LEN], u_char ck[AKA_CK_LEN]);
88 /**
89 * Calculate IK from RAND using K
90 *
91 * @param k secret key K
92 * @param rand random value RAND
93 * @param macs buffer receiving integrity key IK
94 * @return TRUE if calculations successful
95 */
96 bool (*f4)(eap_aka_3gpp2_functions_t *this, u_char k[AKA_K_LEN],
97 u_char rand[AKA_RAND_LEN], u_char ik[AKA_IK_LEN]);
98 /**
99 * Calculate AK from a RAND using K
100 *
101 * @param k secret key K
102 * @param rand random value RAND
103 * @param macs buffer receiving anonymity key AK
104 * @return TRUE if calculations successful
105 */
106 bool (*f5)(eap_aka_3gpp2_functions_t *this, u_char k[AKA_K_LEN],
107 u_char rand[AKA_RAND_LEN], u_char ak[AKA_AK_LEN]);
108 /**
109 * Calculate AKS from a RAND using K
110 *
111 * @param k secret key K
112 * @param rand random value RAND
113 * @param macs buffer receiving resynchronization anonymity key AKS
114 * @return TRUE if calculations successful
115 */
116 bool (*f5star)(eap_aka_3gpp2_functions_t *this, u_char k[AKA_K_LEN],
117 u_char rand[AKA_RAND_LEN], u_char aks[AKA_AK_LEN]);
118
119 /**
120 * Destroy a eap_aka_3gpp2_functions_t.
121 */
122 void (*destroy)(eap_aka_3gpp2_functions_t *this);
123 };
124
125 /**
126 * Create a eap_aka_3gpp2_functions instance.
127 *
128 * @return function set, NULL on error
129 */
130 eap_aka_3gpp2_functions_t *eap_aka_3gpp2_functions_create();
131
132 #endif /** EAP_AKA_3GPP2_FUNCTIONS_H_ @}*/