move asn.1 helper functions to asn1helpers.[ch]
diff --git a/src/Makefile b/src/Makefile
index 18ec5bb..8ce4186 100644
--- a/src/Makefile
+++ b/src/Makefile
@@ -5,7 +5,7 @@
 
 all: hnbgw
 
-hnbgw: hnbgw.o hnbgw_hnbap.o hnbap.o
+hnbgw: hnbgw.o hnbgw_hnbap.o hnbap.o asn1helpers.o
 	$(CC) $(LDFLAGS) -o $@ $^
 
 %.o: %.c
diff --git a/src/asn1helpers.c b/src/asn1helpers.c
new file mode 100644
index 0000000..fe886e3
--- /dev/null
+++ b/src/asn1helpers.c
@@ -0,0 +1,19 @@
+
+#include <string.h>
+
+#include <asn1defs.h>
+
+#include "asn1helpers.h"
+
+int asn1_strncpy(char *out, const ASN1String *in, size_t n)
+{
+	size_t cpylen = n;
+
+	if (in->len < cpylen)
+		cpylen = in->len;
+
+	strncpy(out, (char *)in->buf, cpylen);
+	out[n-1] = '\0';
+
+	return cpylen;
+}
diff --git a/src/asn1helpers.h b/src/asn1helpers.h
new file mode 100644
index 0000000..3861d13
--- /dev/null
+++ b/src/asn1helpers.h
@@ -0,0 +1,29 @@
+#pragma once
+
+#include <asn1defs.h>
+
+static inline uint16_t asn1str_to_u16(ASN1String *as)
+{
+	if (as->len < 2)
+		return 0;
+	else
+		return *(uint16_t *)as->buf;
+}
+
+static inline uint8_t asn1str_to_u8(ASN1String *as)
+{
+	if (as->len < 1)
+		return 0;
+	else
+		return *(uint8_t *)as->buf;
+}
+
+static inline uint8_t asn1bitstr_to_u32(ASN1BitString *as)
+{
+	if (as->len < 25)
+		return 0;
+	else
+		return *(uint32_t *)as->buf;
+}
+
+int asn1_strncpy(char *out, const ASN1String *in, size_t n);
diff --git a/src/hnbgw_hnbap.c b/src/hnbgw_hnbap.c
index fd3a328..8d9e1c8 100644
--- a/src/hnbgw_hnbap.c
+++ b/src/hnbgw_hnbap.c
@@ -4,6 +4,8 @@
 #include <unistd.h>
 #include <string.h>
 
+#include "asn1helpers.h"
+
 #include "hnbap.h"
 #include "hnbgw.h"
 #include "hnbap_const.h"
@@ -43,30 +45,6 @@
 	return NULL;
 }
 
-static inline uint16_t asn1str_to_u16(ASN1String *as)
-{
-	if (as->len < 2)
-		return 0;
-	else
-		return *(uint16_t *)as->buf;
-}
-
-static inline uint8_t asn1str_to_u8(ASN1String *as)
-{
-	if (as->len < 1)
-		return 0;
-	else
-		return *(uint8_t *)as->buf;
-}
-
-static inline uint8_t asn1bitstr_to_u32(ASN1BitString *as)
-{
-	if (as->len < 25)
-		return 0;
-	else
-		return *(uint32_t *)as->buf;
-}
-
 static int hnbgw_rx_hnb_register_req(struct hnb_context *ctx, struct HNBRegisterRequest *req)
 {
 	HNB_Identity *identity =
@@ -86,7 +64,7 @@
 		return -1;
 
 	/* copy all identity parameters from the message to ctx */
-	strncpy(ctx->identity_info, (const char *) identity->hNB_Identity_Info.buf,
+	asn1_strncpy(ctx->identity_info, &identity->hNB_Identity_Info,
 		sizeof(ctx->identity_info));
 	ctx->id.lac = asn1str_to_u16(lac);
 	ctx->id.sac = asn1str_to_u16(sac);