Skip to content
Projects
Groups
Snippets
Help
Loading...
Help
Support
Keyboard shortcuts
?
Submit feedback
Contribute to GitLab
Sign in / Register
Toggle navigation
A
asn1c
Project overview
Project overview
Details
Activity
Releases
Repository
Repository
Files
Commits
Branches
Tags
Contributors
Graph
Compare
Issues
0
Issues
0
List
Boards
Labels
Milestones
Merge Requests
0
Merge Requests
0
CI / CD
CI / CD
Pipelines
Jobs
Schedules
Analytics
Analytics
CI / CD
Repository
Value Stream
Wiki
Wiki
Snippets
Snippets
Members
Members
Collapse sidebar
Close sidebar
Activity
Graph
Create a new issue
Jobs
Commits
Issue Boards
Open sidebar
Libraries
asn1c
Commits
9a1736da
Commit
9a1736da
authored
Aug 27, 2017
by
Lev Walkin
Browse files
Options
Browse Files
Download
Email Patches
Plain Diff
CHOICE stub for OER
parent
2535bd58
Changes
5
Hide whitespace changes
Inline
Side-by-side
Showing
5 changed files
with
270 additions
and
2 deletions
+270
-2
skeletons/Makefile.am
skeletons/Makefile.am
+1
-0
skeletons/constr_CHOICE.c
skeletons/constr_CHOICE.c
+2
-2
skeletons/constr_CHOICE.h
skeletons/constr_CHOICE.h
+2
-0
skeletons/constr_CHOICE_oer.c
skeletons/constr_CHOICE_oer.c
+264
-0
skeletons/file-dependencies
skeletons/file-dependencies
+1
-0
No files found.
skeletons/Makefile.am
View file @
9a1736da
...
@@ -66,6 +66,7 @@ libasn1cskeletons_la_SOURCES = \
...
@@ -66,6 +66,7 @@ libasn1cskeletons_la_SOURCES = \
ber_tlv_length.c ber_tlv_length.h
\
ber_tlv_length.c ber_tlv_length.h
\
ber_tlv_tag.c ber_tlv_tag.h
\
ber_tlv_tag.c ber_tlv_tag.h
\
constr_CHOICE.c constr_CHOICE.h
\
constr_CHOICE.c constr_CHOICE.h
\
constr_CHOICE_oer.c
\
constr_SEQUENCE.c constr_SEQUENCE.h
\
constr_SEQUENCE.c constr_SEQUENCE.h
\
constr_SEQUENCE_oer.c
\
constr_SEQUENCE_oer.c
\
constr_SEQUENCE_OF.c constr_SEQUENCE_OF.h
\
constr_SEQUENCE_OF.c constr_SEQUENCE_OF.h
\
...
...
skeletons/constr_CHOICE.c
View file @
9a1736da
...
@@ -1252,8 +1252,8 @@ asn_TYPE_operation_t asn_OP_CHOICE = {
...
@@ -1252,8 +1252,8 @@ asn_TYPE_operation_t asn_OP_CHOICE = {
0
,
0
,
0
,
0
,
#else
#else
0
,
CHOICE_decode_oer
,
0
,
CHOICE_encode_oer
,
#endif
/* ASN_DISABLE_OER_SUPPORT */
#endif
/* ASN_DISABLE_OER_SUPPORT */
#ifdef ASN_DISABLE_PER_SUPPORT
#ifdef ASN_DISABLE_PER_SUPPORT
0
,
0
,
...
...
skeletons/constr_CHOICE.h
View file @
9a1736da
...
@@ -47,6 +47,8 @@ ber_type_decoder_f CHOICE_decode_ber;
...
@@ -47,6 +47,8 @@ ber_type_decoder_f CHOICE_decode_ber;
der_type_encoder_f
CHOICE_encode_der
;
der_type_encoder_f
CHOICE_encode_der
;
xer_type_decoder_f
CHOICE_decode_xer
;
xer_type_decoder_f
CHOICE_decode_xer
;
xer_type_encoder_f
CHOICE_encode_xer
;
xer_type_encoder_f
CHOICE_encode_xer
;
oer_type_decoder_f
CHOICE_decode_oer
;
oer_type_encoder_f
CHOICE_encode_oer
;
per_type_decoder_f
CHOICE_decode_uper
;
per_type_decoder_f
CHOICE_decode_uper
;
per_type_encoder_f
CHOICE_encode_uper
;
per_type_encoder_f
CHOICE_encode_uper
;
asn_outmost_tag_f
CHOICE_outmost_tag
;
asn_outmost_tag_f
CHOICE_outmost_tag
;
...
...
skeletons/constr_CHOICE_oer.c
0 → 100644
View file @
9a1736da
/*
* Copyright (c) 2017 Lev Walkin <vlm@lionet.info>.
* All rights reserved.
* Redistribution and modifications are permitted subject to BSD license.
*/
#ifndef ASN_DISABLE_OER_SUPPORT
#include <asn_internal.h>
#include <constr_CHOICE.h>
#include <errno.h>
/*
* Return a standardized complex structure.
*/
#undef RETURN
#define RETURN(_code) \
do { \
rval.code = _code; \
rval.consumed = consumed_myself; \
return rval; \
} while(0)
#undef ADVANCE
#define ADVANCE(num_bytes) \
do { \
size_t num = num_bytes; \
ptr = ((const char *)ptr) + num; \
size -= num; \
consumed_myself += num; \
} while(0)
/*
* Switch to the next phase of parsing.
*/
#undef NEXT_PHASE
#define NEXT_PHASE(ctx) \
do { \
ctx->phase++; \
ctx->step = 0; \
} while(0)
/*
* Tags are canonically sorted in the tag to member table.
*/
static
int
_search4tag
(
const
void
*
ap
,
const
void
*
bp
)
{
const
asn_TYPE_tag2member_t
*
a
=
(
const
asn_TYPE_tag2member_t
*
)
ap
;
const
asn_TYPE_tag2member_t
*
b
=
(
const
asn_TYPE_tag2member_t
*
)
bp
;
int
a_class
=
BER_TAG_CLASS
(
a
->
el_tag
);
int
b_class
=
BER_TAG_CLASS
(
b
->
el_tag
);
if
(
a_class
==
b_class
)
{
ber_tlv_tag_t
a_value
=
BER_TAG_VALUE
(
a
->
el_tag
);
ber_tlv_tag_t
b_value
=
BER_TAG_VALUE
(
b
->
el_tag
);
if
(
a_value
==
b_value
)
return
0
;
else
if
(
a_value
<
b_value
)
return
-
1
;
else
return
1
;
}
else
if
(
a_class
<
b_class
)
{
return
-
1
;
}
else
{
return
1
;
}
}
/*
* X.696 (08/2015) #8.7 Encoding of tags
*/
static
ssize_t
oer_fetch_tag
(
const
void
*
ptr
,
size_t
size
,
ber_tlv_tag_t
*
tag_r
)
{
ber_tlv_tag_t
val
;
ber_tlv_tag_t
tclass
;
size_t
skipped
;
if
(
size
==
0
)
return
0
;
val
=
*
(
const
uint8_t
*
)
ptr
;
tclass
=
(
val
>>
6
);
if
((
val
&
0x3F
)
!=
0x3F
)
{
/* #8.7.1 */
*
tag_r
=
((
val
&
0x3F
)
<<
2
)
|
tclass
;
fprintf
(
stderr
,
"byte %02x, tag_r = %d, %s"
,
*
(
const
uint8_t
*
)
ptr
,
*
tag_r
,
ber_tlv_tag_string
(
*
tag_r
));
return
1
;
}
/*
* Each octet contains 7 bits of useful information.
* The MSB is 0 if it is the last octet of the tag.
*/
for
(
val
=
0
,
ptr
=
((
const
char
*
)
ptr
)
+
1
,
skipped
=
2
;
skipped
<=
size
;
ptr
=
((
const
char
*
)
ptr
)
+
1
,
skipped
++
)
{
unsigned
int
oct
=
*
(
const
uint8_t
*
)
ptr
;
if
(
oct
&
0x80
)
{
val
=
(
val
<<
7
)
|
(
oct
&
0x7F
);
/*
* Make sure there are at least 9 bits spare
* at the MS side of a value.
*/
if
(
val
>>
((
8
*
sizeof
(
val
))
-
9
))
{
/*
* We would not be able to accomodate
* any more tag bits.
*/
return
-
1
;
}
}
else
{
val
=
(
val
<<
7
)
|
oct
;
*
tag_r
=
(
val
<<
2
)
|
tclass
;
return
skipped
;
}
}
return
0
;
/* Want more */
}
asn_dec_rval_t
CHOICE_decode_oer
(
asn_codec_ctx_t
*
opt_codec_ctx
,
asn_TYPE_descriptor_t
*
td
,
const
asn_oer_constraints_t
*
constraints
,
void
**
struct_ptr
,
const
void
*
ptr
,
size_t
size
)
{
/*
* Bring closer parts of structure description.
*/
asn_CHOICE_specifics_t
*
specs
=
(
asn_CHOICE_specifics_t
*
)
td
->
specifics
;
asn_TYPE_member_t
*
elements
=
td
->
elements
;
/*
* Parts of the structure being constructed.
*/
void
*
st
=
*
struct_ptr
;
/* Target structure. */
asn_struct_ctx_t
*
ctx
;
/* Decoder context */
asn_dec_rval_t
rval
;
/* Return code from subparsers */
ssize_t
consumed_myself
=
0
;
/* Consumed bytes from ptr */
(
void
)
constraints
;
ASN_DEBUG
(
"Decoding %s as CHOICE"
,
td
->
name
);
/*
* Create the target structure if it is not present already.
*/
if
(
st
==
0
)
{
st
=
*
struct_ptr
=
CALLOC
(
1
,
specs
->
struct_size
);
if
(
st
==
0
)
{
RETURN
(
RC_FAIL
);
}
}
/*
* Restore parsing context.
*/
ctx
=
(
asn_struct_ctx_t
*
)((
char
*
)
st
+
specs
->
ctx_offset
);
switch
(
ctx
->
phase
)
{
case
0
:
{
/*
* Discover the tag.
*/
ber_tlv_tag_t
tlv_tag
;
/* T from TLV */
ssize_t
tag_len
;
/* Length of TLV's T */
tag_len
=
oer_fetch_tag
(
ptr
,
size
,
&
tlv_tag
);
switch
(
tag_len
)
{
case
0
:
ASN__DECODE_STARVED
;
case
-
1
:
ASN__DECODE_FAILED
;
}
do
{
const
asn_TYPE_tag2member_t
*
t2m
;
asn_TYPE_tag2member_t
key
=
{
tlv_tag
,
0
,
0
,
0
};
t2m
=
(
const
asn_TYPE_tag2member_t
*
)
bsearch
(
&
key
,
specs
->
tag2el
,
specs
->
tag2el_count
,
sizeof
(
specs
->
tag2el
[
0
]),
_search4tag
);
if
(
t2m
)
{
/*
* Found the element corresponding to the tag.
*/
NEXT_PHASE
(
ctx
);
ctx
->
step
=
t2m
->
el_no
;
break
;
}
else
if
(
specs
->
ext_start
==
-
1
)
{
ASN_DEBUG
(
"Unexpected tag %s "
"in non-extensible CHOICE %s"
,
ber_tlv_tag_string
(
tlv_tag
),
td
->
name
);
RETURN
(
RC_FAIL
);
}
else
{
/* Skip open type extension */
RETURN
(
RC_FAIL
);
}
}
while
(
0
);
ADVANCE
(
tag_len
);
}
case
1
:
{
asn_TYPE_member_t
*
elm
=
&
elements
[
ctx
->
step
];
/* CHOICE's element */
void
*
memb_ptr
;
/* Pointer to the member */
void
**
memb_ptr2
;
/* Pointer to that pointer */
/*
* Compute the position of the member inside a structure,
* and also a type of containment (it may be contained
* as pointer or using inline inclusion).
*/
if
(
elm
->
flags
&
ATF_POINTER
)
{
/* Member is a pointer to another structure */
memb_ptr2
=
(
void
**
)((
char
*
)
st
+
elm
->
memb_offset
);
}
else
{
/*
* A pointer to a pointer
* holding the start of the structure
*/
memb_ptr
=
(
char
*
)
st
+
elm
->
memb_offset
;
memb_ptr2
=
&
memb_ptr
;
}
/* Set presence to be able to free it properly at any time */
(
void
)
CHOICE_variant_set_presence
(
td
,
st
,
ctx
->
step
+
1
);
if
(
specs
->
ext_start
<=
ctx
->
step
)
{
/* We're in the extensions group. #20.2 requires Open Type */
RETURN
(
RC_FAIL
);
}
rval
=
elm
->
type
->
op
->
oer_decoder
(
opt_codec_ctx
,
elm
->
type
,
elm
->
oer_constraints
,
memb_ptr2
,
ptr
,
size
);
rval
.
consumed
+=
consumed_myself
;
return
rval
;
}
}
RETURN
(
RC_FAIL
);
}
/*
* Encode as Canonical OER.
*/
asn_enc_rval_t
CHOICE_encode_oer
(
asn_TYPE_descriptor_t
*
td
,
const
asn_oer_constraints_t
*
constraints
,
void
*
sptr
,
asn_app_consume_bytes_f
*
cb
,
void
*
app_key
)
{
(
void
)
constraints
;
(
void
)
cb
;
(
void
)
app_key
;
ASN__ENCODE_FAILED
;
}
#endif
/* ASN_DISABLE_OER_SUPPORT */
skeletons/file-dependencies
View file @
9a1736da
...
@@ -77,5 +77,6 @@ OCTET_STRING_oer.c
...
@@ -77,5 +77,6 @@ OCTET_STRING_oer.c
NativeInteger_oer.c
NativeInteger_oer.c
NativeEnumerated_oer.c
NativeEnumerated_oer.c
constr_SEQUENCE_oer.c
constr_SEQUENCE_oer.c
constr_CHOICE_oer.c
CODEC-PER: # THIS IS A SPECIAL SECTION
CODEC-PER: # THIS IS A SPECIAL SECTION
Write
Preview
Markdown
is supported
0%
Try again
or
attach a new file
Attach a file
Cancel
You are about to add
0
people
to the discussion. Proceed with caution.
Finish editing this message first!
Cancel
Please
register
or
sign in
to comment