libosmogsm  0.9.6.269-c2af
Osmocom GSM library
 All Data Structures Files Functions Variables Enumerations Enumerator Modules Pages
Auth

GSM/GPRS/3G authentication core infrastructure. More...

Files

file  comp128.c
 COMP128 v1; common/old GSM Authentication Algorithm (A3/A8)
 
file  comp128v23.c
 COMP128 v2 / v3; Common Algorithm used for GSM Authentication (A3/A8)
 

Functions

static int c128v1_gen_vec (struct osmo_auth_vector *vec, struct osmo_sub_auth_data *aud, const uint8_t *_rand)
 
static __attribute__ ((constructor))
 
static int c128v2_gen_vec (struct osmo_auth_vector *vec, struct osmo_sub_auth_data *aud, const uint8_t *_rand)
 
static int c128v3_gen_vec (struct osmo_auth_vector *vec, struct osmo_sub_auth_data *aud, const uint8_t *_rand)
 
static LLIST_HEAD (osmo_auths)
 
int osmo_auth_register (struct osmo_auth_impl *impl)
 Register an authentication algorithm implementation with the core. More...
 
int osmo_auth_load (const char *path)
 Load all available authentication plugins from the given path. More...
 
int osmo_auth_supported (enum osmo_auth_algo algo)
 Determine if a given authentication algorithm is supported. More...
 
static void c5_function (uint8_t *ik, const uint8_t *kc)
 
void osmo_c4 (uint8_t *ck, const uint8_t *kc)
 
int osmo_auth_3g_from_2g (struct osmo_auth_vector *vec)
 Generate 3G CK + IK from 2G authentication vector. More...
 
int osmo_auth_gen_vec (struct osmo_auth_vector *vec, struct osmo_sub_auth_data *aud, const uint8_t *_rand)
 Generate authentication vector. More...
 
int osmo_auth_gen_vec_auts (struct osmo_auth_vector *vec, struct osmo_sub_auth_data *aud, const uint8_t *auts, const uint8_t *rand_auts, const uint8_t *_rand)
 Generate authentication vector and re-sync sequence. More...
 
const char * osmo_auth_alg_name (enum osmo_auth_algo alg)
 Get human-readable name of authentication algorithm.
 
enum osmo_auth_algo osmo_auth_alg_parse (const char *name)
 Parse human-readable name of authentication algorithm.
 
static int milenage_gen_vec (struct osmo_auth_vector *vec, struct osmo_sub_auth_data *aud, const uint8_t *_rand)
 
static int milenage_gen_vec_auts (struct osmo_auth_vector *vec, struct osmo_sub_auth_data *aud, const uint8_t *auts, const uint8_t *rand_auts, const uint8_t *_rand)
 
static void _comp128_compression_round (uint8_t *x, int n, const uint8_t *tbl)
 
static void _comp128_compression (uint8_t *x)
 
static void _comp128_bitsfrombytes (uint8_t *x, uint8_t *bits)
 
static void _comp128_permutation (uint8_t *x, uint8_t *bits)
 
void comp128v1 (const uint8_t *ki, const uint8_t *rand, uint8_t *sres, uint8_t *kc)
 Perform COMP128v1 algorithm. More...
 
void comp128 (const uint8_t *ki, const uint8_t *rand, uint8_t *sres, uint8_t *kc)
 Perform COMP128v1 algorithm. More...
 
static void _comp128v23_internal (uint8_t *output, const uint8_t *kxor, const uint8_t *rand)
 
int comp128v3 (const uint8_t *ki, const uint8_t *rand, uint8_t *sres, uint8_t *kc)
 Perform COMP128v3 algorithm. More...
 
int comp128v2 (const uint8_t *ki, const uint8_t *rand, uint8_t *sres, uint8_t *kc)
 Perform COMP128v2 algorithm. More...
 

Variables

static struct osmo_auth_impl c128v1_alg
 
static struct osmo_auth_impl c128v2_alg
 
static struct osmo_auth_impl c128v3_alg
 
static struct osmo_auth_impl * selected_auths [_OSMO_AUTH_ALG_NUM]
 
static const struct value_string auth_alg_vals []
 
static struct osmo_auth_impl milenage_alg
 
static const uint8_t table_0 [512]
 
static const uint8_t table_1 [256]
 
static const uint8_t table_2 [128]
 
static const uint8_t table_3 [64]
 
static const uint8_t table_4 [32]
 
static const uint8_t * _comp128_table [5] = { table_0, table_1, table_2, table_3, table_4 }
 
static const uint8_t table0 [256]
 
static const uint8_t table1 [256]
 

Detailed Description

GSM/GPRS/3G authentication core infrastructure.

Function Documentation

void comp128 ( const uint8_t *  ki,
const uint8_t *  rand,
uint8_t *  sres,
uint8_t *  kc 
)

Perform COMP128v1 algorithm.

Parameters
[in]kiSecret Key K(i) of subscriber
[in]randRandom Challenge
[out]sresuser-supplied buffer for storing computed SRES value
[out]kcuser-supplied buffer for storing computed Kc value

References comp128v1().

void comp128v1 ( const uint8_t *  ki,
const uint8_t *  rand,
uint8_t *  sres,
uint8_t *  kc 
)

Perform COMP128v1 algorithm.

Parameters
[in]kiSecret Key K(i) of subscriber
[in]randRandom Challenge
[out]sresuser-supplied buffer for storing computed SRES value
[out]kcuser-supplied buffer for storing computed Kc value

Referenced by comp128().

int comp128v2 ( const uint8_t *  ki,
const uint8_t *  rand,
uint8_t *  sres,
uint8_t *  kc 
)

Perform COMP128v2 algorithm.

Parameters
[in]kiSecret Key K(i) of subscriber
[in]randRandom Challenge
[out]sresuser-supplied buffer for storing computed SRES value
[out]kcuser-supplied buffer for storing computed Kc value
Returns
0

References comp128v3().

int comp128v3 ( const uint8_t *  ki,
const uint8_t *  rand,
uint8_t *  sres,
uint8_t *  kc 
)

Perform COMP128v3 algorithm.

Parameters
[in]kiSecret Key K(i) of subscriber
[in]randRandom Challenge
[out]sresuser-supplied buffer for storing computed SRES value
[out]kcuser-supplied buffer for storing computed Kc value
Returns
0

Referenced by comp128v2().

int osmo_auth_3g_from_2g ( struct osmo_auth_vector *  vec)

Generate 3G CK + IK from 2G authentication vector.

Parameters
vecAuthentication Vector to be modified
Returns
1 if the vector was changed, 0 otherwise

This function performs the C5 and C4 functions to derive the UMTS key material from the GSM key material in the supplied vector, if the input vector doesn't yet have UMTS authentication capability.

int osmo_auth_gen_vec ( struct osmo_auth_vector *  vec,
struct osmo_sub_auth_data *  aud,
const uint8_t *  _rand 
)

Generate authentication vector.

Parameters
[out]vecGenerated authentication vector
[in]audSubscriber-specific key material
[in]_randRandom challenge to be used
Returns
0 on success, negative error on failure

This function performs the core cryptographic function of the AUC, computing authentication triples/quintuples based on the permanent subscriber data and a random value. The result is what is forwarded by the AUC via HLR and VLR to the MSC which will then be able to invoke authentication with the MS

int osmo_auth_gen_vec_auts ( struct osmo_auth_vector *  vec,
struct osmo_sub_auth_data *  aud,
const uint8_t *  auts,
const uint8_t *  rand_auts,
const uint8_t *  _rand 
)

Generate authentication vector and re-sync sequence.

Parameters
[out]vecGenerated authentication vector
[in]audSubscriber-specific key material
[in]autsAUTS value sent by the SIM/MS
[in]rand_autsRAND value sent by the SIM/MS
[in]_randRandom challenge to be used to generate vector
Returns
0 on success, negative error on failure

This function performs a special variant of the core cryptographic function of the AUC: computing authentication triples/quintuples based on the permanent subscriber data, a random value as well as the AUTS and RAND values returned by the SIM/MS. This special variant is needed if the sequence numbers between MS and AUC have for some reason become different.

int osmo_auth_load ( const char *  path)

Load all available authentication plugins from the given path.

Parameters
[in]pathPath name of the directory containing the plugins
Returns
number of plugins loaded in case of success, negative in case of error

This function will load all plugins contained in the specified path.

int osmo_auth_register ( struct osmo_auth_impl *  impl)

Register an authentication algorithm implementation with the core.

Parameters
[in]implStructure describing implementation and it's callbacks
Returns
0 on success, or a negative error code on failure

This function is called by an authentication implementation plugin to register itself with the authentication core.

int osmo_auth_supported ( enum osmo_auth_algo  algo)

Determine if a given authentication algorithm is supported.

Parameters
[in]algoAlgorithm which should be checked
Returns
1 if algo is supported, 0 if not, negative error on failure

This function is used by an application to determine at runtime if a given authentication algorithm is supported or not.

Variable Documentation

const struct value_string auth_alg_vals[]
static
Initial value:
= {
{ OSMO_AUTH_ALG_NONE, "None" },
{ OSMO_AUTH_ALG_COMP128v1, "COMP128v1" },
{ OSMO_AUTH_ALG_COMP128v2, "COMP128v2" },
{ OSMO_AUTH_ALG_COMP128v3, "COMP128v3" },
{ OSMO_AUTH_ALG_XOR, "XOR" },
{ OSMO_AUTH_ALG_MILENAGE, "MILENAGE" },
{ 0, NULL }
}
struct osmo_auth_impl c128v1_alg
static
Initial value:
= {
.algo = OSMO_AUTH_ALG_COMP128v1,
.name = "COMP128v1 (libosmogsm built-in)",
.priority = 1000,
.gen_vec = &c128v1_gen_vec,
}
struct osmo_auth_impl c128v2_alg
static
Initial value:
= {
.algo = OSMO_AUTH_ALG_COMP128v2,
.name = "COMP128v2 (libosmogsm built-in)",
.priority = 1000,
.gen_vec = &c128v2_gen_vec,
}
struct osmo_auth_impl c128v3_alg
static
Initial value:
= {
.algo = OSMO_AUTH_ALG_COMP128v3,
.name = "COMP128v3 (libosmogsm built-in)",
.priority = 1000,
.gen_vec = &c128v3_gen_vec,
}
struct osmo_auth_impl milenage_alg
static
Initial value:
= {
.algo = OSMO_AUTH_ALG_MILENAGE,
.name = "MILENAGE (libosmogsm built-in)",
.priority = 1000,
.gen_vec = &milenage_gen_vec,
.gen_vec_auts = &milenage_gen_vec_auts,
}
const uint8_t table0[256]
static
Initial value:
= {
197, 235, 60, 151, 98, 96, 3, 100, 248, 118, 42, 117, 172, 211, 181, 203, 61,
126, 156, 87, 149, 224, 55, 132, 186, 63, 238, 255, 85, 83, 152, 33, 160,
184, 210, 219, 159, 11, 180, 194, 130, 212, 147, 5, 215, 92, 27, 46, 113,
187, 52, 25, 185, 79, 221, 48, 70, 31, 101, 15, 195, 201, 50, 222, 137,
233, 229, 106, 122, 183, 178, 177, 144, 207, 234, 182, 37, 254, 227, 231, 54,
209, 133, 65, 202, 69, 237, 220, 189, 146, 120, 68, 21, 125, 38, 30, 2,
155, 53, 196, 174, 176, 51, 246, 167, 76, 110, 20, 82, 121, 103, 112, 56,
173, 49, 217, 252, 0, 114, 228, 123, 12, 93, 161, 253, 232, 240, 175, 67,
128, 22, 158, 89, 18, 77, 109, 190, 17, 62, 4, 153, 163, 59, 145, 138,
7, 74, 205, 10, 162, 80, 45, 104, 111, 150, 214, 154, 28, 191, 169, 213,
88, 193, 198, 200, 245, 39, 164, 124, 84, 78, 1, 188, 170, 23, 86, 226,
141, 32, 6, 131, 127, 199, 40, 135, 16, 57, 71, 91, 225, 168, 242, 206,
97, 166, 44, 14, 90, 236, 239, 230, 244, 223, 108, 102, 119, 148, 251, 29,
216, 8, 9, 249, 208, 24, 105, 94, 34, 64, 95, 115, 72, 134, 204, 43,
247, 243, 218, 47, 58, 73, 107, 241, 179, 116, 66, 36, 143, 81, 250, 139,
19, 13, 142, 140, 129, 192, 99, 171, 157, 136, 41, 75, 35, 165, 26
}
const uint8_t table1[256]
static
Initial value:
= {
170, 42, 95, 141, 109, 30, 71, 89, 26, 147, 231, 205, 239, 212, 124, 129, 216,
79, 15, 185, 153, 14, 251, 162, 0, 241, 172, 197, 43, 10, 194, 235, 6,
20, 72, 45, 143, 104, 161, 119, 41, 136, 38, 189, 135, 25, 93, 18, 224,
171, 252, 195, 63, 19, 58, 165, 23, 55, 133, 254, 214, 144, 220, 178, 156,
52, 110, 225, 97, 183, 140, 39, 53, 88, 219, 167, 16, 198, 62, 222, 76,
139, 175, 94, 51, 134, 115, 22, 67, 1, 249, 217, 3, 5, 232, 138, 31,
56, 116, 163, 70, 128, 234, 132, 229, 184, 244, 13, 34, 73, 233, 154, 179,
131, 215, 236, 142, 223, 27, 57, 246, 108, 211, 8, 253, 85, 66, 245, 193,
78, 190, 4, 17, 7, 150, 127, 152, 213, 37, 186, 2, 243, 46, 169, 68,
101, 60, 174, 208, 158, 176, 69, 238, 191, 90, 83, 166, 125, 77, 59, 21,
92, 49, 151, 168, 99, 9, 50, 146, 113, 117, 228, 65, 230, 40, 82, 54,
237, 227, 102, 28, 36, 107, 24, 44, 126, 206, 201, 61, 114, 164, 207, 181,
29, 91, 64, 221, 255, 48, 155, 192, 111, 180, 210, 182, 247, 203, 148, 209,
98, 173, 11, 75, 123, 250, 118, 32, 47, 240, 202, 74, 177, 100, 80, 196,
33, 248, 86, 157, 137, 120, 130, 84, 204, 122, 81, 242, 188, 200, 149, 226,
218, 160, 187, 106, 35, 87, 105, 96, 145, 199, 159, 12, 121, 103, 112
}
const uint8_t table_1[256]
static
Initial value:
= {
19, 11, 80, 114, 43, 1, 69, 94, 39, 18, 127, 117, 97, 3, 85, 43,
27, 124, 70, 83, 47, 71, 63, 10, 47, 89, 79, 4, 14, 59, 11, 5,
35, 107, 103, 68, 21, 86, 36, 91, 85, 126, 32, 50, 109, 94, 120, 6,
53, 79, 28, 45, 99, 95, 41, 34, 88, 68, 93, 55, 110, 125, 105, 20,
90, 80, 76, 96, 23, 60, 89, 64, 121, 56, 14, 74, 101, 8, 19, 78,
76, 66, 104, 46, 111, 50, 32, 3, 39, 0, 58, 25, 92, 22, 18, 51,
57, 65, 119, 116, 22, 109, 7, 86, 59, 93, 62, 110, 78, 99, 77, 67,
12, 113, 87, 98, 102, 5, 88, 33, 38, 56, 23, 8, 75, 45, 13, 75,
95, 63, 28, 49, 123, 120, 20, 112, 44, 30, 15, 98, 106, 2, 103, 29,
82, 107, 42, 124, 24, 30, 41, 16, 108, 100, 117, 40, 73, 40, 7, 114,
82, 115, 36, 112, 12, 102, 100, 84, 92, 48, 72, 97, 9, 54, 55, 74,
113, 123, 17, 26, 53, 58, 4, 9, 69, 122, 21, 118, 42, 60, 27, 73,
118, 125, 34, 15, 65, 115, 84, 64, 62, 81, 70, 1, 24, 111, 121, 83,
104, 81, 49, 127, 48, 105, 31, 10, 6, 91, 87, 37, 16, 54, 116, 126,
31, 38, 13, 0, 72, 106, 77, 61, 26, 67, 46, 29, 96, 37, 61, 52,
101, 17, 44, 108, 71, 52, 66, 57, 33, 51, 25, 90, 2, 119, 122, 35,
}
const uint8_t table_2[128]
static
Initial value:
= {
52, 50, 44, 6, 21, 49, 41, 59, 39, 51, 25, 32, 51, 47, 52, 43,
37, 4, 40, 34, 61, 12, 28, 4, 58, 23, 8, 15, 12, 22, 9, 18,
55, 10, 33, 35, 50, 1, 43, 3, 57, 13, 62, 14, 7, 42, 44, 59,
62, 57, 27, 6, 8, 31, 26, 54, 41, 22, 45, 20, 39, 3, 16, 56,
48, 2, 21, 28, 36, 42, 60, 33, 34, 18, 0, 11, 24, 10, 17, 61,
29, 14, 45, 26, 55, 46, 11, 17, 54, 46, 9, 24, 30, 60, 32, 0,
20, 38, 2, 30, 58, 35, 1, 16, 56, 40, 23, 48, 13, 19, 19, 27,
31, 53, 47, 38, 63, 15, 49, 5, 37, 53, 25, 36, 63, 29, 5, 7,
}
const uint8_t table_3[64]
static
Initial value:
= {
1, 5, 29, 6, 25, 1, 18, 23, 17, 19, 0, 9, 24, 25, 6, 31,
28, 20, 24, 30, 4, 27, 3, 13, 15, 16, 14, 18, 4, 3, 8, 9,
20, 0, 12, 26, 21, 8, 28, 2, 29, 2, 15, 7, 11, 22, 14, 10,
17, 21, 12, 30, 26, 27, 16, 31, 11, 7, 13, 23, 10, 5, 22, 19,
}
const uint8_t table_4[32]
static
Initial value:
= {
15, 12, 10, 4, 1, 14, 11, 7, 5, 0, 14, 7, 1, 2, 13, 8,
10, 3, 4, 9, 6, 0, 3, 2, 5, 6, 8, 9, 11, 13, 15, 12,
}