Harald Welte | 393f2bd | 2015-09-11 17:13:51 +0200 | [diff] [blame] | 1 | #include <stdint.h> |
Harald Welte | 1d2c39d | 2015-09-11 17:49:37 +0200 | [diff] [blame] | 2 | #include <string.h> |
Harald Welte | 393f2bd | 2015-09-11 17:13:51 +0200 | [diff] [blame] | 3 | |
| 4 | #include <osmocom/core/utils.h> |
| 5 | |
| 6 | int 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 | |
| 26 | int encode_iu_imsi(uint8_t *out, size_t out_len, const char *in) |
| 27 | { |
| 28 | unsigned int len = strlen(in); |
Harald Welte | 208b7b0 | 2015-09-11 17:35:52 +0200 | [diff] [blame] | 29 | unsigned int octlen; |
Harald Welte | 393f2bd | 2015-09-11 17:13:51 +0200 | [diff] [blame] | 30 | uint8_t odd = (len & 0x01) == 1; |
| 31 | unsigned int off = 0; |
| 32 | unsigned int i; |
| 33 | |
Harald Welte | 208b7b0 | 2015-09-11 17:35:52 +0200 | [diff] [blame] | 34 | octlen = len/2; |
Harald Welte | 393f2bd | 2015-09-11 17:13:51 +0200 | [diff] [blame] | 35 | if (odd) |
Harald Welte | 208b7b0 | 2015-09-11 17:35:52 +0200 | [diff] [blame] | 36 | octlen++; |
Harald Welte | 393f2bd | 2015-09-11 17:13:51 +0200 | [diff] [blame] | 37 | |
Harald Welte | 208b7b0 | 2015-09-11 17:35:52 +0200 | [diff] [blame] | 38 | for (i = 0; i < octlen; i++) { |
Harald Welte | 393f2bd | 2015-09-11 17:13:51 +0200 | [diff] [blame] | 39 | uint8_t lower, upper; |
| 40 | |
Harald Welte | 208b7b0 | 2015-09-11 17:35:52 +0200 | [diff] [blame] | 41 | lower = osmo_char2bcd(in[off++]) & 0x0f; |
| 42 | if (odd && off == len) |
Harald Welte | 393f2bd | 2015-09-11 17:13:51 +0200 | [diff] [blame] | 43 | upper = 0x0f; |
| 44 | else |
Harald Welte | 208b7b0 | 2015-09-11 17:35:52 +0200 | [diff] [blame] | 45 | upper = osmo_char2bcd(in[off++]) & 0x0f; |
Harald Welte | 393f2bd | 2015-09-11 17:13:51 +0200 | [diff] [blame] | 46 | |
| 47 | out[i] = (upper << 4) | lower; |
| 48 | } |
| 49 | return i; |
| 50 | } |