1 /*-
2 * Copyright (c) 2003 Lev Walkin <vlm@lionet.info>. All rights reserved.
3 * Redistribution and modifications are permitted subject to BSD license.
4 */
5 #include <asn_internal.h>
6 #include <IA5String.h>
7
8 /*
9 * IA5String basic type description.
10 */
11 static ber_tlv_tag_t asn_DEF_IA5String_tags[] = {
12 (ASN_TAG_CLASS_UNIVERSAL | (22 << 2)), /* [UNIVERSAL 22] IMPLICIT ...*/
13 (ASN_TAG_CLASS_UNIVERSAL | (4 << 2)) /* ... OCTET STRING */
14 };
15 static asn_per_constraints_t asn_DEF_IA5String_constraints = {
16 { APC_CONSTRAINED, 7, 7, 0, 0x7f }, /* Value */
17 { APC_SEMI_CONSTRAINED, -1, -1, 0, 0 }, /* Size */
18 0, 0
19 };
20 asn_TYPE_descriptor_t asn_DEF_IA5String = {
21 "IA5String",
22 "IA5String",
23 OCTET_STRING_free,
24 OCTET_STRING_print_utf8, /* ASCII subset */
25 IA5String_constraint, /* Constraint on the alphabet */
26 OCTET_STRING_decode_ber, /* Implemented in terms of OCTET STRING */
27 OCTET_STRING_encode_der,
28 OCTET_STRING_decode_xer_utf8,
29 OCTET_STRING_encode_xer_utf8,
30 OCTET_STRING_decode_uper,
31 OCTET_STRING_encode_uper,
32 0, /* Use generic outmost tag fetcher */
33 asn_DEF_IA5String_tags,
34 sizeof(asn_DEF_IA5String_tags)
35 / sizeof(asn_DEF_IA5String_tags[0]) - 1,
36 asn_DEF_IA5String_tags,
37 sizeof(asn_DEF_IA5String_tags)
38 / sizeof(asn_DEF_IA5String_tags[0]),
39 &asn_DEF_IA5String_constraints,
40 0, 0, /* No members */
41 0 /* No specifics */
42 };
43
44 int
IA5String_constraint(asn_TYPE_descriptor_t * td,const void * sptr,asn_app_constraint_failed_f * ctfailcb,void * app_key)45 IA5String_constraint(asn_TYPE_descriptor_t *td, const void *sptr,
46 asn_app_constraint_failed_f *ctfailcb, void *app_key) {
47 const IA5String_t *st = (const IA5String_t *)sptr;
48
49 if(st && st->buf) {
50 uint8_t *buf = st->buf;
51 uint8_t *end = buf + st->size;
52 /*
53 * IA5String is generally equivalent to 7bit ASCII.
54 * ISO/ITU-T T.50, 1963.
55 */
56 for(; buf < end; buf++) {
57 if(*buf > 0x7F) {
58 _ASN_CTFAIL(app_key, td, sptr,
59 "%s: value byte %ld out of range: "
60 "%d > 127 (%s:%d)",
61 td->name,
62 (long)((buf - st->buf) + 1),
63 *buf,
64 __FILE__, __LINE__);
65 return -1;
66 }
67 }
68 } else {
69 _ASN_CTFAIL(app_key, td, sptr,
70 "%s: value not given (%s:%d)",
71 td->name, __FILE__, __LINE__);
72 return -1;
73 }
74
75 return 0;
76 }
77
78