Project

General

Profile

AKA socket SIM interface » History » Version 1

laforge, 03/25/2022 11:00 AM

1 1 laforge
h1. AKA socket SIM interface
2
3
4
h2. Protocol / Data structures
5
6
The interface is based on a unix domain socke with a very simplistic binary message format as outlined below:
7
8
<pre>
9
#pragma once
10
11
/* Definitions regarding the "AKA authentication socket", a mechanism
12
 * by which various client programs can request the 3G AKA procedure to be performed
13
 * against a card.
14
 *
15
 * This is intended as a very simple, low-level interface.  Security/access control is
16
 * managed by file system permissions, i.e. which processes can access the unix domain
17
 * socket path.
18
 *
19
 * (C) 2022 by Harald Welte <laforge@osmocom.org>
20
 */
21
 
22
#include <stdint.h>
23
24
#define AKASOCK_MAGIC           0x51FC43D5
25
#define AKASOCK_VERSION         1
26
27
enum akasock_msg_type {
28
        AKASOCK_MSGT_AKA_REQ            = 0x01,
29
        AKASOCK_MSGT_AKA_RES_OK         = 0x02,
30
        AKASOCK_MSGT_AKA_RES_SYNC       = 0x03,
31
        AKASOCK_MSGT_AKA_RES_ERR        = 0x04,
32
        AKASOCK_MSGT_IMSI_REQ           = 0x05,
33
        AKASOCK_MSGT_IMSI_RES           = 0x06,
34
};
35
36
struct akasock_msg_hdr {
37
        uint32_t magic;         /* AKASOCK_MAGIC */
38
        uint8_t version;        /* AKASOCK_VERSION */
39
        uint8_t msg_type;       /* akasock_msg_type */
40
        uint8_t channel;        /* 0=first SIM, 1=2nd, ... */
41
        uint8_t tag;            /* to match request with response */
42
        uint8_t data[0];        /* any of the structs below */
43
} __attribute__ ((packed));
44
45
struct akasock_aka_req {
46
        uint8_t isim_instead_of_usim; /* 0=USIM, 1=ISIM */
47
        uint8_t rand_len;
48
        uint8_t rand[32];
49
        uint8_t autn_len;
50
        uint8_t autn[32];
51
} __attribute__ ((packed));
52
53
struct akasock_aka_resp_success {
54
        uint8_t res_len;
55
        uint8_t res[32];
56
        uint8_t ck_len;
57
        uint8_t ck[32];
58
        uint8_t ik_len;
59
        uint8_t ik[32];
60
        uint8_t kc_len;
61
        uint8_t kc[32];
62
} __attribute__ ((packed));
63
64
struct akasock_aka_resp_sync {
65
        uint8_t auts_len;
66
        uint8_t auts[32];
67
} __attribute__ ((packed));
68
69
struct akasock_aka_resp_err {
70
        uint16_t sw;
71
} __attribute__ ((packed));
72
73
struct akasock_imsi_resp {
74
        uint8_t imsi_len;
75
        char imsi[32];          /* IMSI As ASCII string */
76
} __attribute__ ((packed));
77
</pre>
78
79
80
h2. Message flow
81
82
The client programs (doubango, strongswan, ...) will typically perform the following exchanges:
83
84
{{mscgen_link
85
msc {
86
  hscale=2;
87
  pcscf [label="P-CSCF"], client [label="AKASOCK client (e.g. doubango)"], server [label="AKASOCK server"], sim [label="SIM card"];
88
  client => server [label="AKASOCK_MSGT_IMSI_REQ"];
89
  server => sim [label="SELECT ADF.USIM/EF.IMSI"];
90
  server => sim [label="READ BINARY"];
91
  server box server [label="convert from binary to string"];
92
  client <= server [label="AKASOCK_MSGT_IMSI_RES"];
93
  client box client [label="Client can now start first SIP REGISTER with IPUI=IMSI"];
94
  pcscf <= client [label="SIP REGISTER (first one)"];
95
  pcscf => client [label="Unauthorized (contains RAND,AUTN)"];
96
  client => server [label="AKASOCK_MSGT_AKA_REQ (RAND, AUTN)"];
97
  client => sim [label="AUTHENTICATE"];
98
  client <= sim [label="Result"];
99
  client <= server [label="AKASOCK_MSGT_AKA_RES_OK (RES, CK, IK)"];
100
  client box client [label="Derive IPsec keys from CK, IK, create SAs"];
101
  pcscf <= client [label="Start new TCP connection inside IPsec SA"];
102
  pcscf <= client [label="SIP REGISTER (second, with RES)"];
103
  pcscf box pcscf [label="Verify RES"];
104
  pcscf => client [label="200 OK"];
105
}
106
}}
107
108
AKA socket
Add picture from clipboard (Maximum size: 48.8 MB)