prohibit encoding universalstring of non-modulo-multiplier size
diff --git a/skeletons/OCTET_STRING.c b/skeletons/OCTET_STRING.c
index 9d6bc9f..c1bc88f 100644
--- a/skeletons/OCTET_STRING.c
+++ b/skeletons/OCTET_STRING.c
@@ -1572,14 +1572,22 @@
 		if(cval->flags & APC_CONSTRAINED)
 			unit_bits = cval->range_bits;
 		bpc = OS__BPC_U16;
-		sizeinunits = st->size / 2;
+		sizeinunits = st->size >> 1;
+		if(st->size & 1) {
+			ASN_DEBUG("%s string size is not modulo 2", td->name);
+			ASN__ENCODE_FAILED;
+		}
 		break;
 	case ASN_OSUBV_U32:
 		canonical_unit_bits = unit_bits = 32;
 		if(cval->flags & APC_CONSTRAINED)
 			unit_bits = cval->range_bits;
 		bpc = OS__BPC_U32;
-		sizeinunits = st->size / 4;
+		sizeinunits = st->size >> 2;
+		if(st->size & 3) {
+			ASN_DEBUG("%s string size is not modulo 4", td->name);
+			ASN__ENCODE_FAILED;
+		}
 		break;
 	}
 
@@ -1599,8 +1607,9 @@
 				csiz = &asn_DEF_OCTET_STRING_constraints.size;
 				unit_bits = canonical_unit_bits;
 				inext = 1;
-			} else
+			} else {
 				ASN__ENCODE_FAILED;
+			}
 		}
 	} else {
 		inext = 0;
diff --git a/tests/tests-skeletons/Makefile.am b/tests/tests-skeletons/Makefile.am
index 2562443..ce74b65 100644
--- a/tests/tests-skeletons/Makefile.am
+++ b/tests/tests-skeletons/Makefile.am
@@ -13,6 +13,7 @@
     check-XER               \
     check-OER-INTEGER       \
     check-OER-NativeEnumerated \
+    check-PER-UniversalString  \
     check-PER               \
     check-PER-INTEGER
 
diff --git a/tests/tests-skeletons/check-PER-UniversalString.c b/tests/tests-skeletons/check-PER-UniversalString.c
new file mode 100644
index 0000000..1513fc2
--- /dev/null
+++ b/tests/tests-skeletons/check-PER-UniversalString.c
@@ -0,0 +1,68 @@
+#include <stdio.h>
+#include <assert.h>
+#include <sys/time.h>
+
+#include <UniversalString.h>
+#include <per_support.h>
+
+static void
+check_encode_failed(asn_TYPE_descriptor_t *td, const char *buf, size_t buflen) {
+    uint8_t uper_output_buffer[32];
+    UniversalString_t *st_in;
+
+    st_in = OCTET_STRING_new_fromBuf(td, buf, buflen);
+    assert(st_in);
+    assert(st_in->size == buflen);
+    asn_enc_rval_t enc =
+        uper_encode_to_buffer(&asn_DEF_UniversalString, st_in,
+                              uper_output_buffer, sizeof(uper_output_buffer));
+    assert(enc.encoded == -1);
+
+    ASN_STRUCT_FREE(*td, st_in);
+}
+
+static void
+check_round_trip_OK(asn_TYPE_descriptor_t *td, const char *buf, size_t buflen) {
+    uint8_t uper_output_buffer[32];
+    UniversalString_t *st_in;
+    UniversalString_t *st_out = 0;
+
+    st_in = OCTET_STRING_new_fromBuf(td, buf, buflen);
+    assert(st_in);
+    assert(st_in->size == buflen);
+
+    asn_enc_rval_t enc =
+        uper_encode_to_buffer(&asn_DEF_UniversalString, st_in,
+                              uper_output_buffer, sizeof(uper_output_buffer));
+    assert(enc.encoded > 0);
+
+    asn_dec_rval_t dec =
+        uper_decode(0, &asn_DEF_UniversalString, (void **)&st_out,
+                    uper_output_buffer, (enc.encoded + 7) / 8, 0, 0);
+    assert(dec.consumed == enc.encoded);
+    assert(st_in->size == st_out->size);
+    assert(memcmp(st_in->buf, st_out->buf, st_in->size) == 0);
+    assert(st_out->size == buflen);
+    assert(memcmp(st_out->buf, buf, buflen) == 0);
+
+    ASN_STRUCT_FREE(*td, st_in);
+    ASN_STRUCT_FREE(*td, st_out);
+}
+
+int
+main() {
+    static char UniversalString_data[] = { 0, 0, 0, 65, 0, 0, 0, 65 };
+
+    check_round_trip_OK(&asn_DEF_UniversalString, UniversalString_data, 0);
+    check_encode_failed(&asn_DEF_UniversalString, UniversalString_data, 1);
+    check_encode_failed(&asn_DEF_UniversalString, UniversalString_data, 2);
+    check_encode_failed(&asn_DEF_UniversalString, UniversalString_data, 3);
+    check_round_trip_OK(&asn_DEF_UniversalString, UniversalString_data, 4);
+    check_encode_failed(&asn_DEF_UniversalString, UniversalString_data, 5);
+    check_encode_failed(&asn_DEF_UniversalString, UniversalString_data, 6);
+    check_encode_failed(&asn_DEF_UniversalString, UniversalString_data, 7);
+    check_round_trip_OK(&asn_DEF_UniversalString, UniversalString_data, 8);
+
+	return 0;
+}
+