blob: 38907e11a8c023c55072ad3a427b343c3868569b [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>
Daniel Willmannb2548fb2015-11-30 16:24:57 +010022#include <arpa/inet.h>
Harald Welte30afef32015-08-30 12:28:29 +020023
Harald Welte27f9c4a2015-08-30 22:47:18 +020024#include <osmocom/core/utils.h>
Harald Welte30afef32015-08-30 12:28:29 +020025
26#include "asn1helpers.h"
27
Daniel Willmannb2548fb2015-11-30 16:24:57 +010028void asn1_u32_to_bitstring(BIT_STRING_t *bitstr, uint32_t *buf, uint32_t in)
Harald Welte27f9c4a2015-08-30 22:47:18 +020029{
Daniel Willmannb2548fb2015-11-30 16:24:57 +010030 *buf = htonl(in);
31 bitstr->buf = (uint8_t *) buf;
Harald Welte27f9c4a2015-08-30 22:47:18 +020032 bitstr->size = sizeof(uint32_t);
33 bitstr->bits_unused = 0;
34}
35
Daniel Willmannb2548fb2015-11-30 16:24:57 +010036void asn1_u24_to_bitstring(BIT_STRING_t *bitstr, uint32_t *buf, uint32_t in)
Harald Welte0bb12612015-10-06 22:08:54 +020037{
Daniel Willmannb2548fb2015-11-30 16:24:57 +010038 *buf = htonl(in);
39 bitstr->buf = (uint8_t *) buf;
Harald Welte0bb12612015-10-06 22:08:54 +020040 bitstr->size = 24/8;
41 bitstr->bits_unused = 0;
42}
43
Harald Welte27f9c4a2015-08-30 22:47:18 +020044
45int asn1_strncpy(char *out, const OCTET_STRING_t *in, size_t n)
Harald Welte30afef32015-08-30 12:28:29 +020046{
Daniel Willmann53018e92015-11-23 15:49:29 +010047 size_t cpylen = n-1;
Harald Welte30afef32015-08-30 12:28:29 +020048
Harald Welte27f9c4a2015-08-30 22:47:18 +020049 if (in->size < cpylen)
50 cpylen = in->size;
Harald Welte30afef32015-08-30 12:28:29 +020051
52 strncpy(out, (char *)in->buf, cpylen);
Daniel Willmann53018e92015-11-23 15:49:29 +010053 out[cpylen] = '\0';
Harald Welte30afef32015-08-30 12:28:29 +020054
55 return cpylen;
56}
Harald Welte27f9c4a2015-08-30 22:47:18 +020057
58uint16_t asn1str_to_u16(const OCTET_STRING_t *in)
59{
Daniel Willmannb2548fb2015-11-30 16:24:57 +010060 OSMO_ASSERT(in && in->size == sizeof(uint16_t));
Daniel Willmanne3adf0e2015-11-27 17:53:19 +010061 return ntohs(*(uint16_t *)in->buf);
Harald Welte27f9c4a2015-08-30 22:47:18 +020062}
63
64uint8_t asn1str_to_u8(const OCTET_STRING_t *in)
65{
Daniel Willmannb2548fb2015-11-30 16:24:57 +010066 OSMO_ASSERT(in && in->size == sizeof(uint8_t));
Harald Welte27f9c4a2015-08-30 22:47:18 +020067 return *(uint8_t *)in->buf;
68}
69
70uint32_t asn1bitstr_to_u32(const BIT_STRING_t *in)
71{
Daniel Willmannb2548fb2015-11-30 16:24:57 +010072 OSMO_ASSERT(in && in->size == sizeof(uint32_t));
Harald Welte4dd16b92015-10-06 22:08:10 +020073
Daniel Willmanne3adf0e2015-11-27 17:53:19 +010074 return ntohl(*(uint32_t *)in->buf);
75}
Daniel Willmann6e59d412015-11-23 14:03:04 +010076
Daniel Willmanne3adf0e2015-11-27 17:53:19 +010077uint32_t asn1bitstr_to_u24(const BIT_STRING_t *in)
78{
Daniel Willmannb2548fb2015-11-30 16:24:57 +010079 OSMO_ASSERT(in && in->size == 3);
Daniel Willmann6e59d412015-11-23 14:03:04 +010080
Daniel Willmanne3adf0e2015-11-27 17:53:19 +010081 return *(uint32_t *)in->buf;
Harald Welte27f9c4a2015-08-30 22:47:18 +020082}