aboutsummaryrefslogtreecommitdiffstats
path: root/openbsc/include/openbsc/oap_messages.h
blob: a7a254c2e0d8cfdc6c63c15c0fbbad3a4ad7828c (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
/* Osmocom Authentication Protocol message encoder/decoder */

/* (C) 2015 by Sysmocom s.f.m.c. GmbH
 * All Rights Reserved
 *
 * Author: Neels Hofmeyr
 *
 * This program is free software; you can redistribute it and/or modify
 * it under the terms of the GNU Affero General Public License as published by
 * the Free Software Foundation; either version 3 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 Affero General Public License for more details.
 *
 * You should have received a copy of the GNU Affero General Public License
 * along with this program.  If not, see <http://www.gnu.org/licenses/>.
 *
 */
#pragma once

#include <stdint.h>
#include <openbsc/gsm_04_08_gprs.h>
#include <openbsc/gsm_data.h>

/* Some numbers are out of sequence because (so far) they match gprs_gsup_iei.
 */
enum oap_iei {
	OAP_CAUSE_IE			= 0x02,
	OAP_RAND_IE			= 0x20,
	OAP_AUTN_IE			= 0x23,
	OAP_XRES_IE			= 0x24,
	OAP_AUTS_IE			= 0x25,
	OAP_CLIENT_ID_IE		= 0x30,
};

enum oap_message_type {
	OAP_MSGT_REGISTER_REQUEST	= 0b00000100,
	OAP_MSGT_REGISTER_ERROR		= 0b00000101,
	OAP_MSGT_REGISTER_RESULT	= 0b00000110,

	OAP_MSGT_CHALLENGE_REQUEST	= 0b00001000,
	OAP_MSGT_CHALLENGE_ERROR	= 0b00001001,
	OAP_MSGT_CHALLENGE_RESULT	= 0b00001010,

	OAP_MSGT_SYNC_REQUEST		= 0b00001100,
	OAP_MSGT_SYNC_ERROR		= 0b00001101,
	OAP_MSGT_SYNC_RESULT		= 0b00001110,
};

struct oap_message {
	enum oap_message_type	message_type;
	enum gsm48_gmm_cause	cause;
	uint16_t		client_id;
	int			rand_present;
	uint8_t			rand[16];
	int			autn_present;
	uint8_t			autn[16];
	int			xres_present;
	uint8_t			xres[8];
	int			auts_present;
	uint8_t			auts[16];
};

int oap_decode(const uint8_t *data, size_t data_len,
	       struct oap_message *oap_msg);
void oap_encode(struct msgb *msg, const struct oap_message *oap_msg);