blob: 506466581ba434918a10f2197d51b82eed8db5c9 [file] [log] [blame]
Harald Welte393f2bd2015-09-11 17:13:51 +02001#include <stdint.h>
2
3#include <osmocom/core/utils.h>
4
5int decode_iu_bcd(char *out, size_t out_len, const uint8_t *in, size_t in_len)
6{
7 const uint8_t *ch;
8 char *outch = out;
9
10 for (ch = in; ch < in + in_len; ch++) {
11 char c = osmo_bcd2char(*ch & 0xF);
12 *outch++ = c;
13 if (outch + 1 >= out + out_len)
14 break;
15 c = osmo_bcd2char(*ch >> 4);
16 /* skip padding nibble at end */
17 if (c == 'F')
18 break;
19 *outch++ = c;
20 }
21 *outch++ = '\0';
22 return outch - out;
23}
24
25int encode_iu_imsi(uint8_t *out, size_t out_len, const char *in)
26{
27 unsigned int len = strlen(in);
28 uint8_t odd = (len & 0x01) == 1;
29 unsigned int off = 0;
30 unsigned int i;
31
32 len /= 2;
33 if (odd)
34 len++;
35
36 for (i = 0; i < len; i++) {
37 uint8_t lower, upper;
38
39 lower = osmo_char2bcd(in[++off]) & 0x0f;
40 if (!odd && off + 1 == len)
41 upper = 0x0f;
42 else
43 upper = osmo_char2bcd(in[++off]) & 0x0f;
44
45 out[i] = (upper << 4) | lower;
46 }
47 return i;
48}