blob: bc87905d7bc53d145501c0ef4731987c5798bf03 [file] [log] [blame]
Harald Welte393f2bd2015-09-11 17:13:51 +02001#include <stdint.h>
Harald Welte1d2c39d2015-09-11 17:49:37 +02002#include <string.h>
Harald Welte393f2bd2015-09-11 17:13:51 +02003
4#include <osmocom/core/utils.h>
5
6int decode_iu_bcd(char *out, size_t out_len, const uint8_t *in, size_t in_len)
7{
8 const uint8_t *ch;
9 char *outch = out;
10
11 for (ch = in; ch < in + in_len; ch++) {
12 char c = osmo_bcd2char(*ch & 0xF);
13 *outch++ = c;
14 if (outch + 1 >= out + out_len)
15 break;
16 c = osmo_bcd2char(*ch >> 4);
17 /* skip padding nibble at end */
18 if (c == 'F')
19 break;
20 *outch++ = c;
21 }
22 *outch++ = '\0';
23 return outch - out;
24}
25
26int encode_iu_imsi(uint8_t *out, size_t out_len, const char *in)
27{
28 unsigned int len = strlen(in);
Harald Welte208b7b02015-09-11 17:35:52 +020029 unsigned int octlen;
Harald Welte393f2bd2015-09-11 17:13:51 +020030 uint8_t odd = (len & 0x01) == 1;
31 unsigned int off = 0;
32 unsigned int i;
33
Harald Welte208b7b02015-09-11 17:35:52 +020034 octlen = len/2;
Harald Welte393f2bd2015-09-11 17:13:51 +020035 if (odd)
Harald Welte208b7b02015-09-11 17:35:52 +020036 octlen++;
Harald Welte393f2bd2015-09-11 17:13:51 +020037
Harald Welte208b7b02015-09-11 17:35:52 +020038 for (i = 0; i < octlen; i++) {
Harald Welte393f2bd2015-09-11 17:13:51 +020039 uint8_t lower, upper;
40
Harald Welte208b7b02015-09-11 17:35:52 +020041 lower = osmo_char2bcd(in[off++]) & 0x0f;
42 if (odd && off == len)
Harald Welte393f2bd2015-09-11 17:13:51 +020043 upper = 0x0f;
44 else
Harald Welte208b7b02015-09-11 17:35:52 +020045 upper = osmo_char2bcd(in[off++]) & 0x0f;
Harald Welte393f2bd2015-09-11 17:13:51 +020046
47 out[i] = (upper << 4) | lower;
48 }
49 return i;
50}