blob: d04298f8319257f55f6a6f3474348bc505635e6d [file] [log] [blame]
Harald Welte77847ad2015-10-06 22:07:04 +02001/* helper functions to dela with asn1c data types */
2
3/* (C) 2014-2015 by Harald Welte <laforge@gnumonks.org>
4 * All Rights Reserved
5 *
6 * This program is free software; you can redistribute it and/or modify
7 * it under the terms of the GNU Affero General Public License as published by
8 * the Free Software Foundation; either version 3 of the License, or
9 * (at your option) any later version.
10 *
11 * This program is distributed in the hope that it will be useful,
12 * but WITHOUT ANY WARRANTY; without even the implied warranty of
13 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
14 * GNU Affero General Public License for more details.
15 *
16 * You should have received a copy of the GNU Affero General Public License
17 * along with this program. If not, see <http://www.gnu.org/licenses/>.
18 *
19 */
Harald Welte30afef32015-08-30 12:28:29 +020020
21#include <string.h>
22
Harald Welte27f9c4a2015-08-30 22:47:18 +020023#include <osmocom/core/utils.h>
Harald Welte30afef32015-08-30 12:28:29 +020024
25#include "asn1helpers.h"
26
Harald Welte27f9c4a2015-08-30 22:47:18 +020027void asn1_u32_to_bitstring(BIT_STRING_t *bitstr, uint32_t *in)
28{
29 bitstr->buf = (uint8_t *) in;
30 bitstr->size = sizeof(uint32_t);
31 bitstr->bits_unused = 0;
32}
33
Harald Welte0bb12612015-10-06 22:08:54 +020034void asn1_u24_to_bitstring(BIT_STRING_t *bitstr, uint32_t *in)
35{
36 bitstr->buf = (uint8_t *) in;
37 bitstr->size = 24/8;
38 bitstr->bits_unused = 0;
39}
40
Harald Welte27f9c4a2015-08-30 22:47:18 +020041
42int asn1_strncpy(char *out, const OCTET_STRING_t *in, size_t n)
Harald Welte30afef32015-08-30 12:28:29 +020043{
Daniel Willmann53018e92015-11-23 15:49:29 +010044 size_t cpylen = n-1;
Harald Welte30afef32015-08-30 12:28:29 +020045
Harald Welte27f9c4a2015-08-30 22:47:18 +020046 if (in->size < cpylen)
47 cpylen = in->size;
Harald Welte30afef32015-08-30 12:28:29 +020048
49 strncpy(out, (char *)in->buf, cpylen);
Daniel Willmann53018e92015-11-23 15:49:29 +010050 out[cpylen] = '\0';
Harald Welte30afef32015-08-30 12:28:29 +020051
52 return cpylen;
53}
Harald Welte27f9c4a2015-08-30 22:47:18 +020054
55uint16_t asn1str_to_u16(const OCTET_STRING_t *in)
56{
57 OSMO_ASSERT(in && in->size >= sizeof(uint16_t));
Daniel Willmanne3adf0e2015-11-27 17:53:19 +010058 return ntohs(*(uint16_t *)in->buf);
Harald Welte27f9c4a2015-08-30 22:47:18 +020059}
60
61uint8_t asn1str_to_u8(const OCTET_STRING_t *in)
62{
63 OSMO_ASSERT(in && in->size >= sizeof(uint8_t));
64 return *(uint8_t *)in->buf;
65}
66
67uint32_t asn1bitstr_to_u32(const BIT_STRING_t *in)
68{
Daniel Willmanne3adf0e2015-11-27 17:53:19 +010069 OSMO_ASSERT(in && in->size >= sizeof(uint32_t) && in->bits_unused == 0);
Harald Welte4dd16b92015-10-06 22:08:10 +020070
Daniel Willmanne3adf0e2015-11-27 17:53:19 +010071 return ntohl(*(uint32_t *)in->buf);
72}
Daniel Willmann6e59d412015-11-23 14:03:04 +010073
Daniel Willmanne3adf0e2015-11-27 17:53:19 +010074uint32_t asn1bitstr_to_u24(const BIT_STRING_t *in)
75{
76 OSMO_ASSERT(in && in->size >= 3 && in->bits_unused == 0);
Daniel Willmann6e59d412015-11-23 14:03:04 +010077
Daniel Willmanne3adf0e2015-11-27 17:53:19 +010078 return *(uint32_t *)in->buf;
Harald Welte27f9c4a2015-08-30 22:47:18 +020079}