auth_milenage/osmo-auc-gen: compute OPC in case only OP is known

This commit is contained in:
Harald Welte 2012-03-21 09:03:16 +01:00
parent 5fb795e972
commit a72e47b8a0
3 changed files with 26 additions and 2 deletions

View File

@ -33,6 +33,7 @@ struct osmo_sub_auth_data {
uint8_t k[16];
uint8_t amf[2];
uint64_t sqn;
int opc_is_op;
} umts;
struct {
uint8_t ki[16];

View File

@ -83,10 +83,21 @@ static int milenage_gen_vec_auts(struct osmo_auth_vector *vec,
const uint8_t *_rand)
{
uint8_t sqn_out[6];
uint8_t gen_opc[16];
uint8_t *opc;
int rc;
rc = milenage_auts(aud->u.umts.opc, aud->u.umts.k,
rand_auts, auts, sqn_out);
/* Check if we only know OP and compute OPC if required */
if (aud->type == OSMO_AUTH_TYPE_UMTS && aud->u.umts.opc_is_op) {
rc = milenage_opc_gen(gen_opc, aud->u.umts.k,
aud->u.umts.opc);
if (rc < 0)
return rc;
opc = gen_opc;
} else
opc = aud->u.umts.opc;
rc = milenage_auts(opc, aud->u.umts.k, rand_auts, auts, sqn_out);
if (rc < 0)
return rc;

View File

@ -59,6 +59,7 @@ static void help()
"-a --algorithm\tSpecify name of the algorithm\n"
"-k --key\tSpecify Ki / K\n"
"-o --opc\tSpecify OPC (only for 3G)\n"
"-O --op\tSpecify OP (only for 3G)\n"
"-a --amf\tSpecify AMF (only for 3G)\n"
"-s --sqn\tSpecify SQN (only for 3G)\n"
"-r --rand\tSpecify random value\n");
@ -84,6 +85,7 @@ int main(int argc, char **argv)
{ "algorithm", 1, 0, 'a' },
{ "key", 1, 0, 'k' },
{ "opc", 1, 0, 'o' },
{ "op", 1, 0, 'O' },
{ "amf", 1, 0, 'f' },
{ "sqn", 1, 0, 's' },
{ "rand", 1, 0, 'r' },
@ -133,6 +135,16 @@ int main(int argc, char **argv)
}
rc = osmo_hexparse(optarg, test_aud.u.umts.opc,
sizeof(test_aud.u.umts.opc));
test_aud.u.umts.opc_is_op = 0;
break;
case 'O':
if (test_aud.type != OSMO_AUTH_TYPE_UMTS) {
fprintf(stderr, "Only UMTS has OP\n");
exit(2);
}
rc = osmo_hexparse(optarg, test_aud.u.umts.opc,
sizeof(test_aud.u.umts.opc));
test_aud.u.umts.opc_is_op = 1;
break;
case 'f':
if (test_aud.type != OSMO_AUTH_TYPE_UMTS) {