blob: fee51bc7a9f6f0366e44cf624b38beb13211b301 [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);
Harald Welte208b7b02015-09-11 17:35:52 +020028 unsigned int octlen;
Harald Welte393f2bd2015-09-11 17:13:51 +020029 uint8_t odd = (len & 0x01) == 1;
30 unsigned int off = 0;
31 unsigned int i;
32
Harald Welte208b7b02015-09-11 17:35:52 +020033 octlen = len/2;
Harald Welte393f2bd2015-09-11 17:13:51 +020034 if (odd)
Harald Welte208b7b02015-09-11 17:35:52 +020035 octlen++;
Harald Welte393f2bd2015-09-11 17:13:51 +020036
Harald Welte208b7b02015-09-11 17:35:52 +020037 for (i = 0; i < octlen; i++) {
Harald Welte393f2bd2015-09-11 17:13:51 +020038 uint8_t lower, upper;
39
Harald Welte208b7b02015-09-11 17:35:52 +020040 lower = osmo_char2bcd(in[off++]) & 0x0f;
41 if (odd && off == len)
Harald Welte393f2bd2015-09-11 17:13:51 +020042 upper = 0x0f;
43 else
Harald Welte208b7b02015-09-11 17:35:52 +020044 upper = osmo_char2bcd(in[off++]) & 0x0f;
Harald Welte393f2bd2015-09-11 17:13:51 +020045
46 out[i] = (upper << 4) | lower;
47 }
48 return i;
49}