/* GSM/GPRS/3G authentication core infrastructure */

/* (C) 2011 by Harald Welte <laforge@gnumonks.org>
 *
 * All Rights Reserved
 *
 * This program is free software; you can redistribute it and/or modify
 * it under the terms of the GNU General Public License as published by
 * the Free Software Foundation; either version 2 of the License, or
 * (at your option) any later version.
 *
 * This program is distributed in the hope that it will be useful,
 * but WITHOUT ANY WARRANTY; without even the implied warranty of
 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
 * GNU General Public License for more details.
 *
 * You should have received a copy of the GNU General Public License along
 * with this program; if not, write to the Free Software Foundation, Inc.,
 * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
 *
 */

#include <osmocom/crypt/auth.h>
#include "milenage/common.h"
#include "milenage/milenage.h"

static void sqn_u64_to_48bit(uint8_t *sqn, const uint64_t sqn64)
{
	sqn[5] = (sqn64 >>  0) & 0xff;
	sqn[4] = (sqn64 >>  8) & 0xff;
	sqn[3] = (sqn64 >> 16) & 0xff;
	sqn[2] = (sqn64 >> 24) & 0xff;
	sqn[1] = (sqn64 >> 32) & 0xff;
	sqn[0] = (sqn64 >> 40) & 0xff;
}

static uint64_t sqn_48bit_to_u64(const uint8_t *sqn)
{
	uint64_t sqn64;

	sqn64 = sqn[0];
	sqn64 <<= 8;
	sqn64 |= sqn[1];
	sqn64 <<= 8;
	sqn64 |= sqn[2];
	sqn64 <<= 8;
	sqn64 |= sqn[3];
	sqn64 <<= 8;
	sqn64 |= sqn[4];
	sqn64 <<= 8;
	sqn64 |= sqn[5];

	return sqn64;
}


static int milenage_gen_vec(struct osmo_auth_vector *vec,
			    struct osmo_sub_auth_data *aud,
			    const uint8_t *_rand)
{
	size_t res_len = sizeof(vec->res);
	uint8_t sqn[6];
	int rc;

	sqn_u64_to_48bit(sqn, aud->umts.sqn);
	milenage_generate(aud->umts.opc, aud->umts.amf, aud->umts.k,
			  sqn, _rand,
			  vec->autn, vec->ik, vec->ck, vec->res, &res_len);
	vec->res_len = res_len;
	rc = gsm_milenage(aud->umts.opc, aud->umts.k, _rand, vec->sres, vec->kc);
	if (rc < 0)
		return rc;

	vec->auth_types = OSMO_AUTH_TYPE_UMTS | OSMO_AUTH_TYPE_GSM;
	aud->umts.sqn++;

	return 0;
}

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)
{
	uint8_t sqn_out[6];
	int rc;

	rc = milenage_auts(aud->umts.opc, aud->umts.k,
			   rand_auts, auts, sqn_out);
	if (rc < 0)
		return rc;

	aud->umts.sqn = sqn_48bit_to_u64(sqn_out) + 1;

	return milenage_gen_vec(vec, aud, _rand);
}

static struct osmo_auth_impl milenage_alg = {
	.algo = OSMO_AUTH_ALG_MILENAGE,
	.name = "MILENAGE (libosmogsm built-in)",
	.priority = 1000,
	.gen_vec = &milenage_gen_vec,
	.gen_vec_auts = &milenage_gen_vec_auts,
};

static __attribute__((constructor)) void on_dso_load_milenage(void)
{
	osmo_auth_register(&milenage_alg);
}
