asn1c/doc/asn1c-usage.lyx

4258 lines
73 KiB
Plaintext
Raw Normal View History

2004-06-03 03:49:45 +00:00
#LyX 1.3 created this file. For more info see http://www.lyx.org/
\lyxformat 221
\textclass book
2004-08-23 15:12:04 +00:00
\begin_preamble
\usepackage{extramarks}
\lhead{\firstxmark}
\rfoot{\lastxmark}
2004-09-30 22:26:19 +00:00
\usepackage{color}
\definecolor{gray40}{gray}{.4}
\definecolor{urlblue}{rgb}{0,0,.6}
\usepackage[colorlinks=true,
linkcolor={gray40},
urlcolor={urlblue},
pdfauthor={Lev Walkin},
2005-02-02 09:53:46 +00:00
pdftitle={Using the Open Source ASN.1 Compiler},
2004-09-30 22:26:19 +00:00
pdfkeywords={ASN.1,asn1c,compiler}
]{hyperref}
%\fancyhf{}
%\fancyhead[LE,RO]{\thepage}
%\fancyhead[LO]{\rightmark}
%\fancyhead[RE]{\leftmark}
%\fancyfoot[R]{\lastxmark}
2004-08-23 15:12:04 +00:00
\end_preamble
2004-06-03 03:49:45 +00:00
\language english
\inputencoding latin1
2004-08-23 15:12:04 +00:00
\fontscheme times
2004-06-03 03:49:45 +00:00
\graphics default
\paperfontsize default
\spacing single
\papersize Default
\paperpackage a4
\use_geometry 0
\use_amsmath 0
\use_natbib 0
\use_numerical_citations 0
\paperorientation portrait
2004-09-30 22:26:19 +00:00
\secnumdepth 2
\tocdepth 2
2004-06-03 03:49:45 +00:00
\paragraph_separation indent
\defskip medskip
\quotes_language swedish
\quotes_times 2
\papercolumns 1
2004-08-23 15:12:04 +00:00
\papersides 2
\paperpagestyle fancy
2004-06-03 03:49:45 +00:00
\layout Title
2005-02-02 09:53:46 +00:00
Using the Open Source ASN.1 Compiler
2004-06-03 03:49:45 +00:00
\layout Author
Lev Walkin <
2004-09-30 22:26:19 +00:00
\begin_inset ERT
status Collapsed
\layout Standard
2004-06-03 03:49:45 +00:00
2004-09-30 22:26:19 +00:00
\backslash
href{mailto:vlm@lionet.info?Subject=asn1c}{vlm@lionet.info}
2004-06-03 03:49:45 +00:00
\end_inset
>
\layout Standard
2004-08-23 15:12:04 +00:00
\begin_inset ERT
status Open
\layout Standard
\backslash
2005-02-22 07:28:26 +00:00
lhead{This document describes
2004-09-30 22:26:19 +00:00
\backslash
2005-07-24 08:28:39 +00:00
href{http://lionet.info/asn1c}{asn1c-0.9.17}}
2004-09-30 22:26:19 +00:00
\layout Standard
\backslash
rhead{$Revision$}
2004-08-23 15:12:04 +00:00
\end_inset
\layout Standard
2004-06-03 03:49:45 +00:00
\begin_inset LatexCommand \tableofcontents{}
\end_inset
2004-08-23 15:12:04 +00:00
\layout Standard
\begin_inset ERT
2004-09-30 22:26:19 +00:00
status Open
2004-08-23 15:12:04 +00:00
\layout Standard
\backslash
pagestyle{headings}
\end_inset
2004-08-07 05:00:07 +00:00
\layout Part
2005-02-21 14:16:10 +00:00
Using the ASN.1 Compiler
2004-06-03 03:49:45 +00:00
\layout Chapter
2005-02-21 14:16:10 +00:00
Introduction to the ASN.1 Compiler
2004-06-03 03:49:45 +00:00
\layout Standard
2005-02-21 14:16:10 +00:00
The purpose of the ASN.1 compiler, of which this document is part, is to
2005-02-22 07:28:26 +00:00
convert the specifications in ASN.1 notation into some other language.
2005-02-21 14:16:10 +00:00
At this moment, only C and C++ target languages are supported, the latter
2005-02-22 07:28:26 +00:00
is in upward compatibility mode.
2004-06-03 03:49:45 +00:00
\layout Standard
2005-02-21 14:16:10 +00:00
The compiler reads the specification and emits a series of target language
structures (C's structs, unions, enums) describing the corresponding ASN.1
types.
2005-02-22 07:28:26 +00:00
The compiler also creates the code which allows automatic serialization
and deserialization of these structures using several standardized encoding
rules (BER, DER, XER).
2004-06-03 03:49:45 +00:00
\layout Standard
2005-02-21 14:16:10 +00:00
For example, suppose the following ASN.1 module is given
\begin_inset Foot
collapsed true
2004-06-03 03:49:45 +00:00
\layout Standard
2005-02-21 14:16:10 +00:00
Please look into Part
\begin_inset LatexCommand \vref{par:ASN.1-Basics}
2004-06-03 03:49:45 +00:00
\end_inset
2005-02-21 14:16:10 +00:00
for a quick reference on how to understand the ASN.1 notation.
2004-06-03 03:49:45 +00:00
\end_inset
2005-02-21 14:16:10 +00:00
:
2004-06-03 03:49:45 +00:00
\layout LyX-Code
2005-02-21 14:16:10 +00:00
RectangleTest DEFINITIONS ::=
2004-06-03 03:49:45 +00:00
\layout LyX-Code
BEGIN
\layout LyX-Code
\layout LyX-Code
Rectangle ::= SEQUENCE {
\layout LyX-Code
height INTEGER, -- Height of the rectangle
\layout LyX-Code
2004-08-23 15:12:04 +00:00
width INTEGER -- Width of the rectangle
2004-06-03 03:49:45 +00:00
\layout LyX-Code
}
\layout LyX-Code
\layout LyX-Code
END
\layout Standard
2005-02-21 14:16:10 +00:00
The compiler would read this ASN.1 definition and produce the following C
type
\begin_inset Foot
2005-07-24 08:28:39 +00:00
collapsed false
2004-06-03 03:49:45 +00:00
2005-02-21 14:16:10 +00:00
\layout Standard
2004-08-23 15:12:04 +00:00
2005-02-21 14:16:10 +00:00
\emph on
-fnative-types
\emph default
compiler option is used to produce basic C
\emph on
int
\emph default
types instead of infinite width INTEGER_t structures.
2005-07-24 08:28:39 +00:00
See Section
\begin_inset LatexCommand \vref{sec:Command-line-options}
2004-06-03 03:49:45 +00:00
\end_inset
2005-02-21 14:16:10 +00:00
.
2004-06-03 03:49:45 +00:00
\end_inset
2005-02-21 14:16:10 +00:00
:
2004-06-03 03:49:45 +00:00
\layout LyX-Code
2005-02-21 14:16:10 +00:00
typedef struct Rectangle_s {
2004-06-03 03:49:45 +00:00
\layout LyX-Code
2005-02-21 14:16:10 +00:00
int height;
2004-08-23 15:12:04 +00:00
\layout LyX-Code
2005-02-21 14:16:10 +00:00
int width;
2004-06-03 03:49:45 +00:00
\layout LyX-Code
2005-02-21 14:16:10 +00:00
} Rectangle_t;
\layout Standard
2004-06-03 03:49:45 +00:00
2005-02-21 14:16:10 +00:00
It would also create the code for converting this structure into platform-indepe
ndent wire representation (a serializer API) and the decoder of such wire
representation back into local, machine-specific type (a deserializer API).
\layout Section
2004-08-23 15:12:04 +00:00
2005-02-21 14:16:10 +00:00
Quick start with asn1c
\layout Standard
2004-06-03 03:49:45 +00:00
2005-02-21 14:16:10 +00:00
After building and installing the compiler, the
\emph on
asn1c
\begin_inset Foot
collapsed false
2004-06-03 03:49:45 +00:00
\layout Standard
2005-02-21 14:16:10 +00:00
The 1 symbol in asn
\series bold
1
\series default
c is a digit, not an
\begin_inset Quotes sld
\end_inset
2004-06-03 03:49:45 +00:00
2005-02-21 14:16:10 +00:00
ell
\begin_inset Quotes srd
\end_inset
2004-06-03 03:49:45 +00:00
2005-02-21 14:16:10 +00:00
letter.
\end_inset
2004-08-23 15:12:04 +00:00
2004-06-03 03:49:45 +00:00
2005-02-21 14:16:10 +00:00
\emph default
command may be used to compile the ASN.1 module
\begin_inset Foot
2005-07-24 08:28:39 +00:00
collapsed false
2004-06-03 03:49:45 +00:00
2005-02-21 14:16:10 +00:00
\layout Standard
2004-06-03 03:49:45 +00:00
2005-02-21 14:16:10 +00:00
This is probably
\series bold
not
\series default
what you want to try out right now -- read through the rest of this chapter
2005-07-24 08:28:39 +00:00
and check the Section
\begin_inset LatexCommand \vref{sec:Command-line-options}
2004-06-03 03:49:45 +00:00
2005-02-21 14:16:10 +00:00
\end_inset
2004-06-03 03:49:45 +00:00
2005-02-21 14:16:10 +00:00
to find out about
\series bold
-P
\series default
and
\series bold
-R
\series default
options.
\end_inset
2004-06-03 03:49:45 +00:00
2005-02-21 14:16:10 +00:00
:
2004-06-03 03:49:45 +00:00
\layout LyX-Code
2005-02-21 14:16:10 +00:00
asn1c
\emph on
<module.asn1>
\layout Standard
2004-06-03 03:49:45 +00:00
2005-02-21 14:16:10 +00:00
If several ASN.1 modules contain interdependencies, all of the files must
be specified altogether:
2004-06-03 03:49:45 +00:00
\layout LyX-Code
2005-02-21 14:16:10 +00:00
asn1c
\emph on
<module1.asn1> <module2.asn1> ...
2004-06-03 03:49:45 +00:00
\layout Standard
2005-02-21 14:16:10 +00:00
The compiler
\series bold
-E
\series default
and
\series bold
-EF
\series default
options are used for testing the parser and the semantic fixer, respectively.
These options will instruct the compiler to dump out the parsed (and fixed,
if
\series bold
-F
\series default
is involved) ASN.1 specification as it was "understood" by the compiler.
It might be useful to check whether a particular syntactic construction
is properly supported by the compiler.
2004-06-03 03:49:45 +00:00
\layout LyX-Code
2005-02-21 14:16:10 +00:00
asn1c
\series bold
-EF
\series default
2004-08-23 15:12:04 +00:00
2005-02-21 14:16:10 +00:00
\emph on
<module-to-test.asn1>
2004-06-03 03:49:45 +00:00
\layout Standard
2005-02-21 14:16:10 +00:00
The
\series bold
-P
\series default
option is used to dump the compiled output on the screen instead of creating
a bunch of .c and .h files on disk in the current directory.
You would probably want to start with
\series bold
-P
\series default
option instead of creating a mess in your current directory.
Another option,
\series bold
-R
\series default
, asks compiler to only generate the files which need to be generated, and
supress linking in the numerous support files.
2004-06-03 03:49:45 +00:00
\layout Standard
2005-02-21 14:16:10 +00:00
Print the compiled output instead of creating multiple source files:
2004-06-03 03:49:45 +00:00
\layout LyX-Code
2005-02-21 14:16:10 +00:00
asn1c
\series bold
-P
\series default
2004-08-23 15:12:04 +00:00
2005-02-21 14:16:10 +00:00
\emph on
<module-to-compile-and-print.asn1>
\layout Section
2004-08-23 15:12:04 +00:00
2005-02-21 14:16:10 +00:00
Recognizing compiler output
\layout Standard
2004-06-03 03:49:45 +00:00
2005-02-21 14:16:10 +00:00
After compiling, the following entities will be created in your current
directory:
\layout Itemize
2004-06-03 03:49:45 +00:00
2005-02-21 14:16:10 +00:00
A set of .c and .h files, generally a single pair for each type defined in
the ASN.1 specifications.
These files will be named similarly to the ASN.1 types (
\emph on
Rectangle.c
\emph default
and
\emph on
Rectangle.h
\emph default
for the RectangleTest ASN.1 module defined in the beginning of this document).
\layout Itemize
2004-06-03 03:49:45 +00:00
2005-02-21 14:16:10 +00:00
A set of helper .c and .h files which contain generic encoders, decoders and
other useful routines.
There will be quite a few of them, some of them even are not always necessary,
but the overall amount of code after compilation will be rather small anyway.
\layout Itemize
2004-06-03 03:49:45 +00:00
2005-02-21 14:16:10 +00:00
A
\emph on
Makefile.am.sample
\emph default
file mentioning all the files created at the earlier steps.
This file is suitable for either automake suite or the plain `make` utility.
\layout Standard
2004-06-03 03:49:45 +00:00
2005-02-21 14:16:10 +00:00
It is your responsibility to create .c file with the
\emph on
int main()
\emph default
routine.
2004-06-03 03:49:45 +00:00
\layout Standard
2005-02-21 14:16:10 +00:00
In other words, after compiling the Rectangle module, you have the following
set of files: { Makefile.am.sample, Rectangle.c, Rectangle.h,
\series bold
\SpecialChar \ldots{}
2004-06-03 03:49:45 +00:00
2005-02-21 14:16:10 +00:00
\series default
}, where
\series bold
2004-06-03 03:49:45 +00:00
\begin_inset Quotes sld
\end_inset
2005-02-21 14:16:10 +00:00
\SpecialChar \ldots{}
2004-06-03 03:49:45 +00:00
\begin_inset Quotes srd
\end_inset
2005-02-21 14:16:10 +00:00
\series default
stands for the set of additional
2004-06-03 03:49:45 +00:00
\begin_inset Quotes sld
\end_inset
2005-02-21 14:16:10 +00:00
helper
2004-06-03 03:49:45 +00:00
\begin_inset Quotes srd
\end_inset
2005-02-21 14:16:10 +00:00
files created by the compiler.
If you add a simple file with the
\emph on
int main()
\emph default
routine, it would even be possible to compile everything with the single
instruction:
\layout LyX-Code
2004-06-03 03:49:45 +00:00
2005-02-21 14:16:10 +00:00
cc -I.
-o rectangle.exe *.c # It could be
\emph on
that
\emph default
simple
2004-06-03 03:49:45 +00:00
\layout Standard
2005-02-21 14:16:10 +00:00
Refer to the Chapter
\begin_inset LatexCommand \vref{cha:Step-by-step-examples}
2004-06-03 03:49:45 +00:00
\end_inset
2005-02-21 14:16:10 +00:00
for a sample
\emph on
int main()
\emph default
routine.
\layout Section
2004-06-03 03:49:45 +00:00
2005-07-24 08:28:39 +00:00
\begin_inset LatexCommand \label{sec:Command-line-options}
2004-06-03 03:49:45 +00:00
\end_inset
2005-07-24 08:28:39 +00:00
Command line options
2005-02-21 14:16:10 +00:00
\layout Standard
2004-06-03 03:49:45 +00:00
2005-07-24 08:28:39 +00:00
The following table summarizes the asn1c command line options.
2005-02-21 14:16:10 +00:00
\layout Standard
2004-06-03 03:49:45 +00:00
2005-02-21 14:16:10 +00:00
\begin_inset Tabular
2005-07-24 08:28:39 +00:00
<lyxtabular version="3" rows="26" columns="2">
2005-02-21 14:16:10 +00:00
<features islongtable="true">
<column alignment="left" valignment="top" leftline="true" width="0">
<column alignment="block" valignment="top" leftline="true" rightline="true" width="3in">
<row topline="true" bottomline="true">
<cell alignment="center" valignment="top" topline="true" leftline="true" usebox="none">
\begin_inset Text
2004-06-03 03:49:45 +00:00
2005-02-21 14:16:10 +00:00
\layout Standard
2004-06-03 03:49:45 +00:00
\series bold
2005-03-05 01:07:04 +00:00
\size small
2005-02-21 14:16:10 +00:00
Overall Options
2004-06-03 03:49:45 +00:00
\end_inset
2005-02-21 14:16:10 +00:00
</cell>
<cell alignment="center" valignment="top" topline="true" leftline="true" rightline="true" usebox="none">
\begin_inset Text
2004-06-03 03:49:45 +00:00
2005-02-21 14:16:10 +00:00
\layout Standard
2004-06-03 03:49:45 +00:00
\series bold
2005-03-05 01:07:04 +00:00
\size small
2005-02-21 14:16:10 +00:00
Description
2004-06-03 03:49:45 +00:00
\end_inset
2005-02-21 14:16:10 +00:00
</cell>
</row>
<row topline="true">
<cell alignment="center" valignment="top" topline="true" leftline="true" usebox="none">
\begin_inset Text
2004-06-03 03:49:45 +00:00
2005-02-21 14:16:10 +00:00
\layout Standard
2005-03-05 01:07:04 +00:00
\size small
2005-02-21 14:16:10 +00:00
-E
2004-06-03 03:49:45 +00:00
\end_inset
2005-02-21 14:16:10 +00:00
</cell>
<cell alignment="center" valignment="top" topline="true" leftline="true" rightline="true" usebox="none">
\begin_inset Text
2004-06-03 03:49:45 +00:00
2005-02-21 14:16:10 +00:00
\layout Standard
2004-06-03 03:49:45 +00:00
2005-02-21 14:16:10 +00:00
\size small
Stop after the parsing stage and print the reconstructed ASN.1 specification
code to the standard output.
2004-06-03 03:49:45 +00:00
\end_inset
2005-02-21 14:16:10 +00:00
</cell>
</row>
<row topline="true">
<cell alignment="center" valignment="top" topline="true" leftline="true" usebox="none">
\begin_inset Text
2004-06-03 03:49:45 +00:00
2005-02-21 14:16:10 +00:00
\layout Standard
2005-03-05 01:07:04 +00:00
\size small
2005-02-21 14:16:10 +00:00
-F
2004-06-03 03:49:45 +00:00
\end_inset
2005-02-21 14:16:10 +00:00
</cell>
<cell alignment="center" valignment="top" topline="true" leftline="true" rightline="true" usebox="none">
\begin_inset Text
2004-06-03 03:49:45 +00:00
2005-02-21 14:16:10 +00:00
\layout Standard
2004-06-03 03:49:45 +00:00
2005-02-21 14:16:10 +00:00
\size small
Used together with -E, instructs the compiler to stop after the ASN.1 syntax
tree fixing stage and dump the reconstructed ASN.1 specification to the
standard output.
2004-06-03 03:49:45 +00:00
\end_inset
2005-02-21 14:16:10 +00:00
</cell>
</row>
<row topline="true">
<cell alignment="center" valignment="top" topline="true" leftline="true" usebox="none">
\begin_inset Text
2004-06-03 03:49:45 +00:00
2005-02-21 14:16:10 +00:00
\layout Standard
2005-03-05 01:07:04 +00:00
\size small
2005-02-21 14:16:10 +00:00
-P
2004-06-03 03:49:45 +00:00
\end_inset
2005-02-21 14:16:10 +00:00
</cell>
<cell alignment="center" valignment="top" topline="true" leftline="true" rightline="true" usebox="none">
\begin_inset Text
2004-06-03 03:49:45 +00:00
2005-02-21 14:16:10 +00:00
\layout Standard
2004-06-03 03:49:45 +00:00
2005-02-21 14:16:10 +00:00
\size small
Dump the compiled output to the standard output instead of cre- ating the
target language files on disk.
2004-06-03 03:49:45 +00:00
\end_inset
2005-02-21 14:16:10 +00:00
</cell>
</row>
<row topline="true">
<cell alignment="center" valignment="top" topline="true" leftline="true" usebox="none">
\begin_inset Text
2004-06-03 03:49:45 +00:00
2005-02-21 14:16:10 +00:00
\layout Standard
2004-06-03 03:49:45 +00:00
2005-03-05 01:07:04 +00:00
\size small
2005-02-21 14:16:10 +00:00
-R
2004-06-03 03:49:45 +00:00
\end_inset
2005-02-21 14:16:10 +00:00
</cell>
<cell alignment="center" valignment="top" topline="true" leftline="true" rightline="true" usebox="none">
\begin_inset Text
2004-06-03 03:49:45 +00:00
2005-02-21 14:16:10 +00:00
\layout Standard
2004-06-03 03:49:45 +00:00
2005-02-21 14:16:10 +00:00
\size small
Restrict the compiler to generate only the ASN.1 tables, omit- ting the usual
support code.
2004-06-03 03:49:45 +00:00
\end_inset
2005-02-21 14:16:10 +00:00
</cell>
</row>
<row topline="true">
<cell alignment="center" valignment="top" topline="true" leftline="true" usebox="none">
\begin_inset Text
2004-06-03 03:49:45 +00:00
2005-02-21 14:16:10 +00:00
\layout Standard
2005-03-05 01:07:04 +00:00
\size small
2005-02-21 14:16:10 +00:00
-S
\emph on
<directory>
2004-06-03 03:49:45 +00:00
\end_inset
2005-02-21 14:16:10 +00:00
</cell>
<cell alignment="center" valignment="top" topline="true" leftline="true" rightline="true" usebox="none">
\begin_inset Text
2004-06-03 03:49:45 +00:00
2005-02-21 14:16:10 +00:00
\layout Standard
2004-06-03 03:49:45 +00:00
2005-02-21 14:16:10 +00:00
\size small
Use the specified directory with ASN.1 skeleton files.
2004-06-03 03:49:45 +00:00
\end_inset
2005-02-21 14:16:10 +00:00
</cell>
</row>
<row topline="true" bottomline="true">
<cell alignment="center" valignment="top" topline="true" leftline="true" usebox="none">
\begin_inset Text
2004-06-03 03:49:45 +00:00
2005-02-21 14:16:10 +00:00
\layout Standard
2004-06-03 03:49:45 +00:00
2005-03-05 01:07:04 +00:00
\size small
2005-02-21 14:16:10 +00:00
-X
\end_inset
</cell>
<cell alignment="center" valignment="top" topline="true" leftline="true" rightline="true" usebox="none">
\begin_inset Text
2004-06-03 03:49:45 +00:00
2005-02-21 14:16:10 +00:00
\layout Standard
2004-06-03 03:49:45 +00:00
2005-03-05 01:07:04 +00:00
\size small
2005-02-21 14:16:10 +00:00
Generate the XML DTD for the specified ASN.1 modules.
2004-06-03 03:49:45 +00:00
\end_inset
2005-02-21 14:16:10 +00:00
</cell>
</row>
<row topline="true">
<cell alignment="center" valignment="top" topline="true" leftline="true" usebox="none">
\begin_inset Text
2004-06-03 03:49:45 +00:00
2005-02-21 14:16:10 +00:00
\layout Standard
2004-06-03 03:49:45 +00:00
\series bold
2005-03-05 01:07:04 +00:00
\size small
2005-02-21 14:16:10 +00:00
Warning Options
2004-06-03 03:49:45 +00:00
\end_inset
2005-02-21 14:16:10 +00:00
</cell>
<cell alignment="center" valignment="top" topline="true" leftline="true" rightline="true" usebox="none">
\begin_inset Text
2004-06-03 03:49:45 +00:00
2005-02-21 14:16:10 +00:00
\layout Standard
2004-06-03 03:49:45 +00:00
2005-02-21 14:16:10 +00:00
\series bold
2005-03-05 01:07:04 +00:00
\size small
2005-02-21 14:16:10 +00:00
Description
2004-06-03 03:49:45 +00:00
\end_inset
2005-02-21 14:16:10 +00:00
</cell>
</row>
<row topline="true">
<cell alignment="center" valignment="top" topline="true" leftline="true" usebox="none">
\begin_inset Text
2004-06-03 03:49:45 +00:00
2005-02-21 14:16:10 +00:00
\layout Standard
2004-06-03 03:49:45 +00:00
2005-03-05 01:07:04 +00:00
\size small
2005-02-21 14:16:10 +00:00
-Werror
2004-06-03 03:49:45 +00:00
\end_inset
2005-02-21 14:16:10 +00:00
</cell>
<cell alignment="center" valignment="top" topline="true" leftline="true" rightline="true" usebox="none">
\begin_inset Text
2004-06-03 03:49:45 +00:00
2005-02-21 14:16:10 +00:00
\layout Standard
2004-06-03 03:49:45 +00:00
2005-02-21 14:16:10 +00:00
\size small
Treat warnings as errors; abort if any warning is produced.
2004-06-03 03:49:45 +00:00
\end_inset
2005-02-21 14:16:10 +00:00
</cell>
</row>
<row topline="true">
<cell alignment="center" valignment="top" topline="true" leftline="true" usebox="none">
\begin_inset Text
2004-06-03 03:49:45 +00:00
\layout Standard
2005-03-05 01:07:04 +00:00
\size small
2005-02-21 14:16:10 +00:00
-Wdebug-lexer
2004-06-03 03:49:45 +00:00
\end_inset
2005-02-21 14:16:10 +00:00
</cell>
<cell alignment="center" valignment="top" topline="true" leftline="true" rightline="true" usebox="none">
\begin_inset Text
2004-06-03 03:49:45 +00:00
2005-02-21 14:16:10 +00:00
\layout Standard
2004-08-23 15:12:04 +00:00
2005-02-21 14:16:10 +00:00
\size small
Enable lexer debugging during the ASN.1 parsing stage.
2004-06-03 03:49:45 +00:00
\end_inset
2005-02-21 14:16:10 +00:00
</cell>
</row>
<row topline="true">
<cell alignment="center" valignment="top" topline="true" leftline="true" usebox="none">
\begin_inset Text
2004-06-03 03:49:45 +00:00
\layout Standard
2005-03-05 01:07:04 +00:00
\size small
2005-02-21 14:16:10 +00:00
-Wdebug-fixer
2004-06-03 03:49:45 +00:00
\end_inset
2005-02-21 14:16:10 +00:00
</cell>
<cell alignment="center" valignment="top" topline="true" leftline="true" rightline="true" usebox="none">
\begin_inset Text
2004-06-03 03:49:45 +00:00
2005-02-21 14:16:10 +00:00
\layout Standard
2004-06-03 03:49:45 +00:00
2005-02-21 14:16:10 +00:00
\size small
Enable ASN.1 syntax tree fixer debugging during the fixing stage.
2004-06-03 03:49:45 +00:00
\end_inset
2005-02-21 14:16:10 +00:00
</cell>
</row>
2005-07-24 08:28:39 +00:00
<row topline="true" bottomline="true" newpage="true">
2005-02-21 14:16:10 +00:00
<cell alignment="center" valignment="top" topline="true" leftline="true" usebox="none">
\begin_inset Text
2004-06-03 03:49:45 +00:00
2005-02-21 14:16:10 +00:00
\layout Standard
2005-03-05 01:07:04 +00:00
\size small
2005-02-21 14:16:10 +00:00
-Wdebug-compiler
2004-06-03 03:49:45 +00:00
\end_inset
2005-02-21 14:16:10 +00:00
</cell>
<cell alignment="center" valignment="top" topline="true" leftline="true" rightline="true" usebox="none">
\begin_inset Text
2004-06-03 03:49:45 +00:00
2005-02-21 14:16:10 +00:00
\layout Standard
2004-06-03 03:49:45 +00:00
2005-02-21 14:16:10 +00:00
\size small
Enable debugging during the actual compile time.
2004-06-03 03:49:45 +00:00
\end_inset
2005-02-21 14:16:10 +00:00
</cell>
</row>
<row topline="true">
<cell alignment="center" valignment="top" topline="true" leftline="true" usebox="none">
\begin_inset Text
2004-06-03 03:49:45 +00:00
2005-02-21 14:16:10 +00:00
\layout Standard
2004-06-03 03:49:45 +00:00
2005-02-21 14:16:10 +00:00
\series bold
2005-03-05 01:07:04 +00:00
\size small
2005-02-21 14:16:10 +00:00
Language Options
2004-06-03 03:49:45 +00:00
\end_inset
2005-02-21 14:16:10 +00:00
</cell>
<cell alignment="center" valignment="top" topline="true" leftline="true" rightline="true" usebox="none">
\begin_inset Text
2004-06-03 03:49:45 +00:00
2005-02-21 14:16:10 +00:00
\layout Standard
2004-06-03 03:49:45 +00:00
\series bold
2005-03-05 01:07:04 +00:00
\size small
2005-02-21 14:16:10 +00:00
Description
2004-06-03 03:49:45 +00:00
\end_inset
2005-02-21 14:16:10 +00:00
</cell>
</row>
<row topline="true">
<cell alignment="center" valignment="top" topline="true" leftline="true" usebox="none">
\begin_inset Text
2004-06-03 03:49:45 +00:00
2005-02-21 14:16:10 +00:00
\layout Standard
2004-06-03 03:49:45 +00:00
2005-03-05 01:07:04 +00:00
\size small
2005-02-21 14:16:10 +00:00
-fall-defs-global
2004-06-03 03:49:45 +00:00
\end_inset
2005-02-21 14:16:10 +00:00
</cell>
<cell alignment="center" valignment="top" topline="true" leftline="true" rightline="true" usebox="none">
\begin_inset Text
2004-06-03 03:49:45 +00:00
2005-02-21 14:16:10 +00:00
\layout Standard
2004-06-03 03:49:45 +00:00
2005-03-05 01:07:04 +00:00
\size small
2005-02-21 14:16:10 +00:00
Normally the compiler hides the definitions (asn_DEF_xxx) of the inner structure
elements (members of SEQUENCE, SET and other types).
This option makes all such definitions global.
Enabling this option may pollute the namespace by making lots of asn_DEF_xxx
structures globally visible, but will allow you to manipulate (encode and
decode) the individual members of any complex ASN.1 structure.
2004-06-03 03:49:45 +00:00
\end_inset
2005-02-21 14:16:10 +00:00
</cell>
</row>
<row topline="true">
<cell alignment="center" valignment="top" topline="true" leftline="true" usebox="none">
\begin_inset Text
2004-06-03 03:49:45 +00:00
2005-02-21 14:16:10 +00:00
\layout Standard
2005-03-05 01:07:04 +00:00
\size small
2005-02-21 14:16:10 +00:00
-fbless-SIZE
2004-06-03 03:49:45 +00:00
\end_inset
2005-02-21 14:16:10 +00:00
</cell>
<cell alignment="center" valignment="top" topline="true" leftline="true" rightline="true" usebox="none">
\begin_inset Text
2004-06-03 03:49:45 +00:00
2005-02-21 14:16:10 +00:00
\layout Standard
2004-06-03 03:49:45 +00:00
2005-02-21 14:16:10 +00:00
\size small
Allow SIZE() constraint for INTEGER, ENUMERATED, and other types for which
this constraint is normally prohibited by the standard.
This is a violation of an ASN.1 standard and compiler may fail to produce
the meaningful code.
2004-06-03 03:49:45 +00:00
\end_inset
2005-02-21 14:16:10 +00:00
</cell>
</row>
<row topline="true">
<cell alignment="center" valignment="top" topline="true" leftline="true" usebox="none">
\begin_inset Text
2004-06-03 03:49:45 +00:00
2005-02-21 14:16:10 +00:00
\layout Standard
2005-03-05 01:07:04 +00:00
\size small
-fcompound-names
\end_inset
</cell>
<cell alignment="center" valignment="top" topline="true" leftline="true" rightline="true" usebox="none">
\begin_inset Text
\layout Standard
\size small
Use complex names for C structures.
Using complex names prevents name clashes in case the module reuses the
same identifiers in multiple contexts.
\end_inset
</cell>
</row>
<row topline="true">
<cell alignment="center" valignment="top" topline="true" leftline="true" usebox="none">
\begin_inset Text
\layout Standard
2005-07-24 08:28:39 +00:00
-findirect-choice
\end_inset
</cell>
<cell alignment="center" valignment="top" topline="true" leftline="true" rightline="true" usebox="none">
\begin_inset Text
\layout Standard
When generating code for a CHOICE type, compile the CHOICE members as indirect
pointers instead of declaring them inline.
Consider using this option together with
\series bold
-fno-include-deps
\series default
to prevent circular references.
\end_inset
</cell>
</row>
<row topline="true">
<cell alignment="center" valignment="top" topline="true" leftline="true" usebox="none">
\begin_inset Text
\layout Standard
-fknown-extern-type=
\emph on
<name>
\end_inset
</cell>
<cell alignment="center" valignment="top" topline="true" leftline="true" rightline="true" usebox="none">
\begin_inset Text
\layout Standard
Pretend the specified type is known.
The compiler will assume the target language source files for the given
type have been provided manually.
\end_inset
</cell>
</row>
<row topline="true">
<cell alignment="center" valignment="top" topline="true" leftline="true" usebox="none">
\begin_inset Text
\layout Standard
2005-03-05 01:07:04 +00:00
\size small
2005-02-21 14:16:10 +00:00
-fnative-types
2004-06-03 03:49:45 +00:00
\end_inset
2005-02-21 14:16:10 +00:00
</cell>
<cell alignment="center" valignment="top" topline="true" leftline="true" rightline="true" usebox="none">
\begin_inset Text
2004-06-03 03:49:45 +00:00
2005-02-21 14:16:10 +00:00
\layout Standard
2004-06-03 03:49:45 +00:00
2005-02-21 14:16:10 +00:00
\size small
Use the native machine's data types (int, double) whenever possible, instead
of the compound INTEGER_t, ENUMERATED_t and REAL_t types.
2004-06-03 03:49:45 +00:00
\end_inset
2005-02-21 14:16:10 +00:00
</cell>
</row>
<row topline="true">
<cell alignment="center" valignment="top" topline="true" leftline="true" usebox="none">
\begin_inset Text
2004-06-03 03:49:45 +00:00
2005-02-21 14:16:10 +00:00
\layout Standard
2004-06-03 03:49:45 +00:00
2005-03-05 01:07:04 +00:00
\size small
2005-02-21 14:16:10 +00:00
-fno-constraints
\end_inset
</cell>
<cell alignment="center" valignment="top" topline="true" leftline="true" rightline="true" usebox="none">
\begin_inset Text
2004-06-03 03:49:45 +00:00
2005-02-21 14:16:10 +00:00
\layout Standard
2004-06-03 03:49:45 +00:00
2005-03-05 01:07:04 +00:00
\size small
2005-02-21 14:16:10 +00:00
Do not generate ASN.1 subtype constraint checking code.
2005-03-05 01:07:04 +00:00
This may produce a shorter executable.
2004-06-03 03:49:45 +00:00
\end_inset
2005-02-21 14:16:10 +00:00
</cell>
</row>
<row topline="true">
<cell alignment="center" valignment="top" topline="true" leftline="true" usebox="none">
\begin_inset Text
2004-06-03 03:49:45 +00:00
2005-02-21 14:16:10 +00:00
\layout Standard
2005-03-05 01:07:04 +00:00
\size small
-fno-include-deps
\end_inset
</cell>
<cell alignment="center" valignment="top" topline="true" leftline="true" rightline="true" usebox="none">
\begin_inset Text
\layout Standard
\size small
Do not generate courtesy #include lines for non-critical dependencies.
\end_inset
</cell>
</row>
<row topline="true">
<cell alignment="center" valignment="top" topline="true" leftline="true" usebox="none">
\begin_inset Text
\layout Standard
\size small
2005-02-21 14:16:10 +00:00
-funnamed-unions
2004-06-03 03:49:45 +00:00
\end_inset
2005-02-21 14:16:10 +00:00
</cell>
<cell alignment="center" valignment="top" topline="true" leftline="true" rightline="true" usebox="none">
\begin_inset Text
2004-06-03 03:49:45 +00:00
2005-02-21 14:16:10 +00:00
\layout Standard
2004-06-03 03:49:45 +00:00
2005-02-21 14:16:10 +00:00
\size small
Enable unnamed unions in the definitions of target language's structures.
2004-06-03 03:49:45 +00:00
\end_inset
2005-02-21 14:16:10 +00:00
</cell>
</row>
<row topline="true" bottomline="true">
<cell alignment="center" valignment="top" topline="true" leftline="true" usebox="none">
\begin_inset Text
2004-06-03 03:49:45 +00:00
2005-02-21 14:16:10 +00:00
\layout Standard
2005-03-05 01:07:04 +00:00
\size small
2005-02-21 14:16:10 +00:00
-ftypes88
2004-06-03 03:49:45 +00:00
\end_inset
2005-02-21 14:16:10 +00:00
</cell>
<cell alignment="center" valignment="top" topline="true" leftline="true" rightline="true" usebox="none">
\begin_inset Text
2004-06-03 03:49:45 +00:00
2005-02-21 14:16:10 +00:00
\layout Standard
2004-06-03 03:49:45 +00:00
2005-02-21 14:16:10 +00:00
\size small
Pretend to support only ASN.1:1988 embedded types.
Certain reserved words, such as UniversalString and BMPString, become ordinary
type references and may be redefined by the specification.
2004-06-03 03:49:45 +00:00
\end_inset
2005-02-21 14:16:10 +00:00
</cell>
</row>
2005-07-24 08:28:39 +00:00
<row topline="true">
2005-02-21 14:16:10 +00:00
<cell alignment="center" valignment="top" topline="true" leftline="true" usebox="none">
\begin_inset Text
2004-06-03 03:49:45 +00:00
2005-02-21 14:16:10 +00:00
\layout Standard
2004-06-03 03:49:45 +00:00
\series bold
2005-03-05 01:07:04 +00:00
\size small
2005-02-21 14:16:10 +00:00
Output Options
2004-06-03 03:49:45 +00:00
\end_inset
2005-02-21 14:16:10 +00:00
</cell>
<cell alignment="center" valignment="top" topline="true" leftline="true" rightline="true" usebox="none">
\begin_inset Text
2004-06-03 03:49:45 +00:00
2005-02-21 14:16:10 +00:00
\layout Standard
2004-06-03 03:49:45 +00:00
\series bold
2005-03-05 01:07:04 +00:00
\size small
2005-02-21 14:16:10 +00:00
Description
2004-06-03 03:49:45 +00:00
\end_inset
2005-02-21 14:16:10 +00:00
</cell>
</row>
<row topline="true">
<cell alignment="center" valignment="top" topline="true" leftline="true" usebox="none">
\begin_inset Text
2004-06-03 03:49:45 +00:00
2005-02-21 14:16:10 +00:00
\layout Standard
2005-03-05 01:07:04 +00:00
\size small
2005-02-21 14:16:10 +00:00
-print-constraints
2004-06-03 03:49:45 +00:00
\end_inset
2005-02-21 14:16:10 +00:00
</cell>
<cell alignment="center" valignment="top" topline="true" leftline="true" rightline="true" usebox="none">
\begin_inset Text
2004-06-03 03:49:45 +00:00
2005-02-21 14:16:10 +00:00
\layout Standard
2004-06-03 03:49:45 +00:00
2005-02-21 14:16:10 +00:00
\size small
When -EF are also specified, this option forces the compiler to explain
its internal understanding of subtype constraints.
2004-06-03 03:49:45 +00:00
\end_inset
2005-02-21 14:16:10 +00:00
</cell>
</row>
<row topline="true" bottomline="true">
<cell alignment="center" valignment="top" topline="true" leftline="true" usebox="none">
\begin_inset Text
2004-06-03 03:49:45 +00:00
2005-02-21 14:16:10 +00:00
\layout Standard
2005-03-05 01:07:04 +00:00
\size small
2005-02-21 14:16:10 +00:00
-print-lines
2004-06-03 03:49:45 +00:00
\end_inset
2005-02-21 14:16:10 +00:00
</cell>
<cell alignment="center" valignment="top" topline="true" leftline="true" rightline="true" usebox="none">
\begin_inset Text
2004-06-03 03:49:45 +00:00
2005-02-21 14:16:10 +00:00
\layout Standard
2004-06-03 03:49:45 +00:00
2005-02-21 14:16:10 +00:00
\size small
Generate "-- #line" comments in -E output.
2004-06-03 03:49:45 +00:00
\end_inset
2005-02-21 14:16:10 +00:00
</cell>
</row>
</lyxtabular>
2004-06-03 03:49:45 +00:00
\end_inset
2005-02-21 14:16:10 +00:00
\layout Chapter
2004-06-03 03:49:45 +00:00
2005-02-21 14:16:10 +00:00
Using the ASN.1 Compiler
\layout Section
2004-06-03 03:49:45 +00:00
2005-02-21 14:16:10 +00:00
Invoking the ASN.1 helper code
\begin_inset OptArg
collapsed true
2004-06-03 03:49:45 +00:00
2005-02-21 14:16:10 +00:00
\layout Standard
2004-06-03 03:49:45 +00:00
2005-02-21 14:16:10 +00:00
Invoking the helper code
2004-06-03 03:49:45 +00:00
\end_inset
2005-02-21 14:16:10 +00:00
\layout Standard
2004-06-03 03:49:45 +00:00
2005-02-22 07:28:26 +00:00
First of all, you should include one or more header files into your application.
Typically, it is enough to include the header file of the main PDU type.
For our Rectangle module, including the Rectangle.h file is sufficient:
2005-02-21 14:16:10 +00:00
\layout LyX-Code
2004-06-03 03:49:45 +00:00
2005-02-21 14:16:10 +00:00
#include <Rectangle.h>
\layout Standard
2004-06-03 03:49:45 +00:00
2005-02-21 14:16:10 +00:00
The header files defines the C structure corresponding to the ASN.1 definition
of a rectangle and the declaration of the ASN.1 type descriptor, which is
used as an argument to most of the functions provided by the ASN.1 module.
For example, here is the code which frees the Rectangle_t structure:
\layout LyX-Code
2004-06-03 03:49:45 +00:00
2005-02-21 14:16:10 +00:00
Rectangle_t *rect = ...;
\layout LyX-Code
2004-08-23 15:12:04 +00:00
2005-02-21 14:16:10 +00:00
\layout LyX-Code
2004-08-23 15:12:04 +00:00
2005-02-21 14:16:10 +00:00
asn_DEF_Rectangle->free_struct(&asn_DEF_Rectangle,
\layout LyX-Code
2004-06-03 03:49:45 +00:00
2005-02-21 14:16:10 +00:00
rect, 0);
\layout Standard
2004-06-03 03:49:45 +00:00
2005-02-21 14:16:10 +00:00
This code defines a
\emph on
rect
\emph default
pointer which points to the Rectangle_t structure which needs to be freed.
2005-02-22 07:28:26 +00:00
The second line invokes the generic
\emph on
free_struct()
\emph default
routine created specifically for this Rectangle_t structure.
2005-02-21 14:16:10 +00:00
The
\emph on
asn_DEF_Rectangle
\emph default
2005-02-22 07:28:26 +00:00
is the type descriptor, which holds a collection of routines to deal with
the Rectangle_t structure.
2005-02-21 14:16:10 +00:00
\layout Standard
2005-02-22 07:28:26 +00:00
The following member functions of the asn_DEF_Rectangle type descriptor
are of interest:
2005-02-21 14:16:10 +00:00
\layout Description
ber_decoder This is the generic
\emph on
restartable
\begin_inset Foot
collapsed false
2004-06-03 03:49:45 +00:00
\layout Standard
2005-02-21 14:16:10 +00:00
Restartable means that if the decoder encounters the end of the buffer,
it will fail, but may later be invoked again with the rest of the buffer
to continue decoding.
2004-06-03 03:49:45 +00:00
\end_inset
2005-02-21 14:16:10 +00:00
\emph default
BER decoder (Basic Encoding Rules).
This decoder would create and/or fill the target structure for you.
Please refer to Section
\begin_inset LatexCommand \vref{sub:Decoding-BER}
2004-06-03 03:49:45 +00:00
\end_inset
2005-02-21 14:16:10 +00:00
.
\layout Description
2004-06-03 03:49:45 +00:00
2005-02-21 14:16:10 +00:00
der_encoder This is the generic DER encoder (Distinguished Encoding Rules).
This encoder will take the target structure and encode it into a series
of bytes.
Please refer to Section
\begin_inset LatexCommand \vref{sub:Encoding-DER}
2004-06-03 03:49:45 +00:00
2005-02-21 14:16:10 +00:00
\end_inset
2004-06-03 03:49:45 +00:00
2005-02-21 14:16:10 +00:00
.
\layout Description
2004-06-03 03:49:45 +00:00
2005-02-21 14:16:10 +00:00
xer_encoder This is the XER encoder (XML Encoding Rules).
This encoder will take the target structure and represent it as an XML
(text) document using either BASIC-XER or CANONICAL-XER encoding rules.
Please refer to Section
\begin_inset LatexCommand \vref{sub:Encoding-XER}
2004-06-03 03:49:45 +00:00
2005-02-21 14:16:10 +00:00
\end_inset
2004-06-03 03:49:45 +00:00
2005-02-21 14:16:10 +00:00
.
\layout Description
2004-06-03 03:49:45 +00:00
2005-02-21 14:16:10 +00:00
xer_decoder This is the generic XER decoder.
It takes both BASIC-XER or CANONICAL-XER encodings and deserializes the
data into a local, machine-dependent representation.
Please refer to Section
\begin_inset LatexCommand \vref{sub:Decoding-XER}
2004-06-03 03:49:45 +00:00
2005-02-21 14:16:10 +00:00
\end_inset
2004-06-03 03:49:45 +00:00
2005-02-21 14:16:10 +00:00
.
\layout Description
2004-06-03 03:49:45 +00:00
2005-02-21 14:16:10 +00:00
check_constraints Check that the contents of the target structure are semantical
ly valid and constrained to appropriate implicit or explicit subtype constraints.
Please refer to Section
\begin_inset LatexCommand \vref{sub:Validating-the-target}
2004-06-03 03:49:45 +00:00
2005-02-21 14:16:10 +00:00
\end_inset
2004-06-03 03:49:45 +00:00
2005-02-21 14:16:10 +00:00
.
\layout Description
print_struct This function convert the contents of the passed target structure
into human readable form.
This form is not formal and cannot be converted back into the structure,
but it may turn out to be useful for debugging or quick-n-dirty printing.
Please refer to Section
\begin_inset LatexCommand \vref{sub:Printing-the-target}
2004-06-03 03:49:45 +00:00
\end_inset
2005-02-21 14:16:10 +00:00
.
\layout Description
free_struct This is a generic disposal which frees the target structure.
Please refer to Section
\begin_inset LatexCommand \vref{sub:Freeing-the-target}
2004-06-03 03:49:45 +00:00
\end_inset
2005-02-21 14:16:10 +00:00
.
2004-06-03 03:49:45 +00:00
\layout Standard
2005-02-21 14:16:10 +00:00
Each of the above function takes the type descriptor (
\emph on
asn_DEF_\SpecialChar \ldots{}
2004-06-03 03:49:45 +00:00
2005-02-21 14:16:10 +00:00
\emph default
) and the target structure (
\emph on
rect
\emph default
, in the above example).
\layout Subsection
2004-06-03 03:49:45 +00:00
2005-02-21 14:16:10 +00:00
\begin_inset LatexCommand \label{sub:Decoding-BER}
2004-06-03 03:49:45 +00:00
\end_inset
2005-02-21 14:16:10 +00:00
Decoding BER
\layout Standard
2004-06-03 03:49:45 +00:00
2005-02-21 14:16:10 +00:00
The Basic Encoding Rules describe the most widely used (by the ASN.1 community)
2005-02-22 07:28:26 +00:00
way to encode and decode a given structure in a machine-independent way.
2005-02-21 14:16:10 +00:00
Several other encoding rules (CER, DER) define a more restrictive versions
of BER, so the generic BER parser is also capable of decoding the data
encoded by CER and DER encoders.
The opposite is not true.
\layout Standard
2004-06-03 03:49:45 +00:00
2005-02-22 07:28:26 +00:00
\emph on
2005-02-21 14:16:10 +00:00
The ASN.1 compiler provides the generic BER decoder which is implicitly capable
of decoding BER, CER and DER encoded data.
\layout Standard
2004-06-03 03:49:45 +00:00
2005-02-21 14:16:10 +00:00
The decoder is restartable (stream-oriented), which means that in case the
buffer has less data than it is expected, the decoder will process whatever
there is available and ask for more data to be provided.
Please note that the decoder may actually process less data than it was
given in the buffer, which means that you must be able to make the next
buffer contain the unprocessed part of the previous buffer.
\layout Standard
2004-06-03 03:49:45 +00:00
2005-02-21 14:16:10 +00:00
Suppose, you have two buffers of encoded data: 100 bytes and 200 bytes.
\layout Itemize
2004-06-03 03:49:45 +00:00
2005-02-21 14:16:10 +00:00
You may concatenate these buffers and feed the BER decoder with 300 bytes
of data, or
\layout Itemize
2004-06-03 03:49:45 +00:00
2005-02-21 14:16:10 +00:00
You may feed it the first buffer of 100 bytes of data, realize that the
ber_decoder consumed only 95 bytes from it and later feed the decoder with
205 bytes buffer which consists of 5 unprocessed bytes from the first buffer
2005-02-22 07:28:26 +00:00
and the additional 200 bytes from the second buffer.
2004-06-03 03:49:45 +00:00
\layout Standard
2005-02-22 07:28:26 +00:00
This is not as convenient as it could be (like, the BER encoder could consume
2005-02-21 14:16:10 +00:00
the whole 100 bytes and keep these 5 bytes in some temporary storage),
2005-02-22 07:28:26 +00:00
but in case of existing stream based processing it might actually fit well
into existing algorithm.
2005-02-21 14:16:10 +00:00
Suggestions are welcome.
\layout Standard
2004-06-03 03:49:45 +00:00
2005-02-22 07:28:26 +00:00
Here is the simplest example of BER decoding.
2004-06-03 03:49:45 +00:00
\layout LyX-Code
2005-02-21 14:16:10 +00:00
Rectangle_t *
2004-06-03 03:49:45 +00:00
\layout LyX-Code
2005-02-21 14:16:10 +00:00
simple_deserializer(const void *buffer, size_t buf_size) {
2004-08-23 15:12:04 +00:00
\layout LyX-Code
2005-02-21 14:16:10 +00:00
Rectangle_t *rect = 0; /* Note this 0! */
2004-06-03 03:49:45 +00:00
\layout LyX-Code
2005-02-21 14:16:10 +00:00
asn_dec_rval_t rval;
2004-06-03 03:49:45 +00:00
\layout LyX-Code
2004-08-23 15:12:04 +00:00
\layout LyX-Code
2005-02-21 14:16:10 +00:00
rval =
\series bold
asn_DEF_Rectangle->ber_decoder
\series default
(0,
2004-06-03 03:49:45 +00:00
\layout LyX-Code
2005-02-21 14:16:10 +00:00
&asn_DEF_Rectangle,
2004-06-03 03:49:45 +00:00
\layout LyX-Code
2005-02-21 14:16:10 +00:00
(void **)&rect,
2004-06-03 03:49:45 +00:00
\layout LyX-Code
2005-02-21 14:16:10 +00:00
buffer, buf_size,
2004-06-03 03:49:45 +00:00
\layout LyX-Code
2005-02-21 14:16:10 +00:00
0);
2004-06-03 03:49:45 +00:00
\layout LyX-Code
2005-02-21 14:16:10 +00:00
2004-06-03 03:49:45 +00:00
\layout LyX-Code
2005-02-21 14:16:10 +00:00
if(rval
\series bold
.code
\series default
== RC_OK) {
2004-08-23 15:12:04 +00:00
\layout LyX-Code
2005-02-21 14:16:10 +00:00
return rect; /* Decoding succeeded */
2004-06-03 03:49:45 +00:00
\layout LyX-Code
2005-02-21 14:16:10 +00:00
} else {
\layout LyX-Code
2004-08-07 05:00:07 +00:00
2005-02-21 14:16:10 +00:00
/* Free partially decoded rect */
\layout LyX-Code
2004-06-03 03:49:45 +00:00
2005-02-21 14:16:10 +00:00
asn_DEF_Rectangle->free_struct(
\layout LyX-Code
2004-06-03 03:49:45 +00:00
2005-02-21 14:16:10 +00:00
&asn_DEF_Rectangle, rect, 0);
\layout LyX-Code
2004-06-03 03:49:45 +00:00
2005-02-21 14:16:10 +00:00
return 0;
\layout LyX-Code
2004-06-03 03:49:45 +00:00
2005-02-21 14:16:10 +00:00
}
\layout LyX-Code
2004-06-03 03:49:45 +00:00
2005-02-21 14:16:10 +00:00
}
\layout Standard
2004-06-03 03:49:45 +00:00
2005-02-21 14:16:10 +00:00
The code above defines a function,
\emph on
simple_deserializer
\emph default
2005-02-22 07:28:26 +00:00
, which takes a buffer and its length and is expected to return a pointer
to the Rectangle_t structure.
2005-02-21 14:16:10 +00:00
Inside, it tries to convert the bytes passed into the target structure
2005-02-22 07:28:26 +00:00
(rect) using the BER decoder and returns the rect pointer afterwards.
2005-02-21 14:16:10 +00:00
If the structure cannot be deserialized, it frees the memory which might
be left allocated by the unfinished
\emph on
ber_decoder
\emph default
routine and returns 0 (no data).
2005-02-22 07:28:26 +00:00
(This
2005-02-21 14:16:10 +00:00
\series bold
freeing is necessary
\series default
because the ber_decoder is a restartable procedure, and may fail just because
2005-02-22 07:28:26 +00:00
there is more data needs to be provided before decoding could be finalized).
2005-02-21 14:16:10 +00:00
The code above obviously does not take into account the way the
\emph on
2005-02-22 07:28:26 +00:00
ber_decoder()
2005-02-21 14:16:10 +00:00
\emph default
failed, so the freeing is necessary because the part of the buffer may
already be decoded into the structure by the time something goes wrong.
\layout Standard
2004-06-03 03:49:45 +00:00
2005-02-22 07:28:26 +00:00
A little less wordy would be to invoke a globally available
2004-06-03 03:49:45 +00:00
\emph on
2005-02-22 07:28:26 +00:00
ber_decode()
2004-06-03 03:49:45 +00:00
\emph default
2005-02-22 07:28:26 +00:00
function instead of dereferencing the asn_DEF_Rectangle type descriptor:
2005-02-21 14:16:10 +00:00
\layout LyX-Code
rval = ber_decode(0, &asn_DEF_Rectangle, (void **)&rect,
\layout LyX-Code
buffer, buf_size);
\layout Standard
2004-06-03 03:49:45 +00:00
2005-02-21 14:16:10 +00:00
Note that the initial (asn_DEF_Rectangle->ber_decoder) reference is gone,
and also the last argument (0) is no longer necessary.
2004-06-03 03:49:45 +00:00
\layout Standard
2005-02-21 14:16:10 +00:00
These two ways of BER decoder invocations are fully equivalent.
\layout Standard
2004-06-03 03:49:45 +00:00
2005-02-21 14:16:10 +00:00
The BER de
2004-06-03 03:49:45 +00:00
\emph on
2005-02-21 14:16:10 +00:00
coder
2004-06-03 03:49:45 +00:00
\emph default
2005-02-21 14:16:10 +00:00
may fail because of (
2004-06-03 03:49:45 +00:00
\emph on
2005-02-21 14:16:10 +00:00
the following RC_\SpecialChar \ldots{}
codes are defined in ber_decoder.h
2004-06-03 03:49:45 +00:00
\emph default
2005-02-21 14:16:10 +00:00
):
\layout Itemize
2004-08-23 15:12:04 +00:00
2005-02-21 14:16:10 +00:00
RC_WMORE: There is more data expected than it is provided (stream mode continuat
ion feature);
\layout Itemize
RC_FAIL: General failure to decode the buffer;
\layout Itemize
\SpecialChar \ldots{}
other codes may be defined as well.
\layout Standard
Together with the return code (.code) the asn_dec_rval_t type contains the
number of bytes which is consumed from the buffer.
In the previous hypothetical example of two buffers (of 100 and 200 bytes),
the first call to ber_decode() would return with .code = RC_WMORE and .consumed
= 95.
The .consumed field of the BER decoder return value is
\series bold
always
\series default
valid, even if the decoder succeeds or fails with any other return code.
\layout Standard
Please look into ber_decoder.h for the precise definition of ber_decode()
and related types.
\layout Subsection
\begin_inset LatexCommand \label{sub:Encoding-DER}
2004-08-23 15:12:04 +00:00
2004-06-03 03:49:45 +00:00
\end_inset
2005-02-21 14:16:10 +00:00
Encoding DER
\layout Standard
The Distinguished Encoding Rules is the
\emph on
canonical
\emph default
variant of BER encoding rules.
The DER is best suited to encode the structures where all the lengths are
known beforehand.
This is probably exactly how you want to encode: either after a BER decoding
or after a manual fill-up, the target structure contains the data which
size is implicitly known before encoding.
Among other uses, the DER encoding is used to encode X.509 certificates.
\layout Standard
As with BER decoder, the DER encoder may be invoked either directly from
the ASN.1 type descriptor (asn_DEF_Rectangle) or from the stand-alone function,
which is somewhat simpler:
2004-06-03 03:49:45 +00:00
\layout LyX-Code
2005-02-21 14:16:10 +00:00
2004-06-03 03:49:45 +00:00
\layout LyX-Code
2005-02-21 14:16:10 +00:00
/*
2004-06-03 03:49:45 +00:00
\layout LyX-Code
2005-02-21 14:16:10 +00:00
* This is the serializer itself,
2004-06-03 03:49:45 +00:00
\layout LyX-Code
2005-02-21 14:16:10 +00:00
* it supplies the DER encoder with the
\layout LyX-Code
2004-06-03 03:49:45 +00:00
2005-02-21 14:16:10 +00:00
* pointer to the custom output function.
\layout LyX-Code
2004-06-03 03:49:45 +00:00
2005-02-21 14:16:10 +00:00
*/
\layout LyX-Code
2004-06-03 03:49:45 +00:00
2005-02-21 14:16:10 +00:00
ssize_t
\layout LyX-Code
2004-06-03 03:49:45 +00:00
2005-02-21 14:16:10 +00:00
simple_serializer(FILE *ostream, Rectangle_t *rect) {
\layout LyX-Code
2004-06-03 03:49:45 +00:00
2005-02-21 14:16:10 +00:00
asn_enc_rval_t er; /* Encoder return value */
\layout LyX-Code
2004-06-03 03:49:45 +00:00
2005-02-21 14:16:10 +00:00
\layout LyX-Code
2004-08-23 15:12:04 +00:00
2005-02-21 14:16:10 +00:00
er = der_encode(&asn_DEF_Rect, rect,
\layout LyX-Code
2004-08-23 15:12:04 +00:00
2005-02-21 14:16:10 +00:00
write_stream, ostream);
\layout LyX-Code
if(er.
2004-08-23 15:12:04 +00:00
\series bold
2005-02-21 14:16:10 +00:00
encoded
2004-08-23 15:12:04 +00:00
\series default
2005-02-21 14:16:10 +00:00
== -1) {
\layout LyX-Code
/*
\layout LyX-Code
* Failed to encode the rectangle data.
\layout LyX-Code
*/
\layout LyX-Code
fprintf(stderr,
2004-08-23 15:12:04 +00:00
\begin_inset Quotes sld
\end_inset
2005-02-21 14:16:10 +00:00
Cannot encode %s: %s
\backslash
n
2004-08-23 15:12:04 +00:00
\begin_inset Quotes srd
\end_inset
2005-02-21 14:16:10 +00:00
,
\layout LyX-Code
2004-08-23 15:12:04 +00:00
2005-02-21 14:16:10 +00:00
er.
\series bold
failed_type
\series default
->name,
\layout LyX-Code
2004-08-23 15:12:04 +00:00
2005-02-21 14:16:10 +00:00
strerror(errno));
\layout LyX-Code
2004-06-03 03:49:45 +00:00
2005-02-21 14:16:10 +00:00
return -1;
\layout LyX-Code
2004-06-03 03:49:45 +00:00
2005-02-21 14:16:10 +00:00
} else {
\layout LyX-Code
2004-06-03 03:49:45 +00:00
2005-02-21 14:16:10 +00:00
/* Return the number of bytes */
2004-06-03 03:49:45 +00:00
\layout LyX-Code
2005-02-21 14:16:10 +00:00
return er.encoded;
\layout LyX-Code
2004-06-03 03:49:45 +00:00
2005-02-21 14:16:10 +00:00
}
2004-06-03 03:49:45 +00:00
\layout LyX-Code
2005-02-21 14:16:10 +00:00
}
2004-06-03 03:49:45 +00:00
\layout Standard
2005-02-21 14:16:10 +00:00
As you see, the DER encoder does not write into some sort of buffer or something.
It just invokes the custom function (possible, multiple times) which would
save the data into appropriate storage.
The optional argument
\emph on
app_key
\emph default
is opaque for the DER encoder code and just used by
2004-06-03 03:49:45 +00:00
\emph on
2005-02-21 14:16:10 +00:00
_write_stream()
\emph default
as the pointer to the appropriate output stream to be used.
2004-06-03 03:49:45 +00:00
\layout Standard
2005-02-21 14:16:10 +00:00
If the custom write function is not given (passed as 0), then the DER encoder
will essentially do the same thing (i.e., encode the data) but no callbacks
will be invoked (so the data goes nowhere).
It may prove useful to determine the size of the structure's encoding before
actually doing the encoding
\begin_inset Foot
collapsed false
2004-08-23 15:12:04 +00:00
\layout Standard
2005-02-21 14:16:10 +00:00
It is actually faster too: the encoder might skip over some computations
which aren't important for the size determination.
\end_inset
.
\layout Standard
Please look into der_encoder.h for the precise definition of der_encode()
and related types.
\layout Subsection
\begin_inset LatexCommand \label{sub:Encoding-XER}
\end_inset
Encoding XER
\layout Standard
The XER stands for XML Encoding Rules, where XML, in turn, is eXtensible
Markup Language, a text-based format for information exchange.
The encoder routine API comes in two flavors: stdio-based and callback-based.
With the callback-based encoder, the encoding process is very similar to
the DER one, described in Section
\begin_inset LatexCommand \vref{sub:Encoding-DER}
\end_inset
.
The following example uses the definition of write_stream() from up there.
\layout LyX-Code
/*
\layout LyX-Code
* This procedure generates the XML document
\layout LyX-Code
* by invoking the XER encoder.
\layout LyX-Code
* NOTE: Do not copy this code verbatim!
\layout LyX-Code
* If the stdio output is necessary,
\layout LyX-Code
* use the xer_fprint() procedure instead.
\layout LyX-Code
* See Section
\begin_inset LatexCommand \vref{sub:Printing-the-target}
\end_inset
.
\layout LyX-Code
*/
\layout LyX-Code
int
\layout LyX-Code
print_as_XML(FILE *ostream, Rectangle_t *rect) {
\layout LyX-Code
asn_enc_rval_t er; /* Encoder return value */
2004-08-23 15:12:04 +00:00
\layout LyX-Code
\layout LyX-Code
2005-02-21 14:16:10 +00:00
er = xer_encode(&asn_DEF_Rectangle, rect,
\layout LyX-Code
2004-08-23 15:12:04 +00:00
2005-02-21 14:16:10 +00:00
XER_F_BASIC, /* BASIC-XER or CANONICAL-XER */
\layout LyX-Code
write_stream, ostream);
\layout LyX-Code
\layout LyX-Code
return (er.encoded == -1) ? -1 : 0;
\layout LyX-Code
2004-06-03 03:49:45 +00:00
2005-02-21 14:16:10 +00:00
}
2004-08-23 15:12:04 +00:00
\layout Standard
2005-02-21 14:16:10 +00:00
Please look into xer_encoder.h for the precise definition of xer_encode()
and related types.
\layout Standard
See Section
\begin_inset LatexCommand \ref{sub:Printing-the-target}
2004-08-23 15:12:04 +00:00
\end_inset
2005-02-21 14:16:10 +00:00
for the example of stdio-based XML encoder and other pretty-printing suggestion
s.
\layout Subsection
2004-08-23 15:12:04 +00:00
2005-02-21 14:16:10 +00:00
\begin_inset LatexCommand \label{sub:Decoding-XER}
2004-08-23 15:12:04 +00:00
2005-02-21 14:16:10 +00:00
\end_inset
Decoding XER
2004-08-23 15:12:04 +00:00
\layout Standard
2005-02-21 14:16:10 +00:00
The data encoded using the XER rules can be subsequently decoded using the
xer_decode() API call:
\layout LyX-Code
2004-08-23 15:12:04 +00:00
2005-02-21 14:16:10 +00:00
Rectangle_t *
\layout LyX-Code
2004-08-23 15:12:04 +00:00
2005-02-21 14:16:10 +00:00
XML_to_Rectangle(const void *buffer, size_t buf_size) {
\layout LyX-Code
Rectangle_t *rect = 0; /* Note this 0! */
\layout LyX-Code
asn_dec_rval_t rval;
\layout LyX-Code
\layout LyX-Code
rval = xer_decode(0, &asn_DEF_Rectangle, (void **)&rect,
\layout LyX-Code
2004-08-23 15:12:04 +00:00
2005-02-21 14:16:10 +00:00
buffer, buf_size);
\layout LyX-Code
2004-08-23 15:12:04 +00:00
2005-02-21 14:16:10 +00:00
if(rval
2004-08-23 15:12:04 +00:00
\series bold
2005-02-21 14:16:10 +00:00
.code
\series default
== RC_OK) {
\layout LyX-Code
return rect; /* Decoding succeeded */
\layout LyX-Code
2004-08-23 15:12:04 +00:00
2005-02-21 14:16:10 +00:00
} else {
\layout LyX-Code
/* Free partially decoded rect */
\layout LyX-Code
asn_DEF_Rectangle->free_struct(
\layout LyX-Code
&asn_DEF_Rectangle, rect, 0);
\layout LyX-Code
return 0;
\layout LyX-Code
}
\layout LyX-Code
}
2004-08-23 15:12:04 +00:00
\layout Standard
2005-02-21 14:16:10 +00:00
The decoder takes both BASIC-XER and CANONICAL-XER encodings.
\layout Standard
2005-02-22 07:28:26 +00:00
The decoder shares its data consumption properties with BER decoder; please
read the Section
\begin_inset LatexCommand \vref{sub:Decoding-BER}
\end_inset
to know more.
\layout Standard
2005-02-21 14:16:10 +00:00
Please look into xer_decoder.h for the precise definition of xer_decode()
and related types.
\layout Subsection
\begin_inset LatexCommand \label{sub:Validating-the-target}
2004-08-23 15:12:04 +00:00
\end_inset
2005-02-21 14:16:10 +00:00
Validating the target structure
2004-08-23 15:12:04 +00:00
\layout Standard
2005-02-21 14:16:10 +00:00
Sometimes the target structure needs to be validated.
For example, if the structure was created by the application (as opposed
to being decoded from some external source), some important information
required by the ASN.1 specification might be missing.
On the other hand, the successful decoding of the data from some external
source does not necessarily mean that the data is fully valid either.
It might well be the case that the specification describes some subtype
constraints that were not taken into account during decoding, and it would
actually be useful to perform the last check when the data is ready to
be encoded or when the data has just been decoded to ensure its validity
according to some stricter rules.
\layout Standard
2004-08-23 15:12:04 +00:00
2005-02-21 14:16:10 +00:00
The asn_check_constraints() function checks the type for various implicit
and explicit constraints.
It is recommended to use asn_check_constraints() function after each decoding
and before each encoding.
2004-08-23 15:12:04 +00:00
\layout Standard
2005-02-21 14:16:10 +00:00
Please look into constraints.h for the precise definition of asn_check_constraint
s() and related types.
\layout Subsection
\begin_inset LatexCommand \label{sub:Printing-the-target}
2004-08-23 15:12:04 +00:00
\end_inset
2005-02-21 14:16:10 +00:00
Printing the target structure
2004-08-23 15:12:04 +00:00
\layout Standard
2005-02-21 14:16:10 +00:00
There are two ways to print the target structure: either invoke the print_struct
member of the ASN.1 type descriptor, or using the asn_fprint() function,
which is a simpler wrapper of the former:
\layout LyX-Code
2004-08-23 15:12:04 +00:00
2005-02-21 14:16:10 +00:00
asn_fprint(stdout, &asn_DEF_Rectangle, rect);
2004-08-23 15:12:04 +00:00
\layout Standard
2005-02-21 14:16:10 +00:00
Please look into constr_TYPE.h for the precise definition of asn_fprint()
and related types.
\layout Standard
2004-08-23 15:12:04 +00:00
2005-02-21 14:16:10 +00:00
Another practical alternative to this custom format printing would be to
invoke XER encoder.
The default BASIC-XER encoder performs reasonable formatting for the output
to be useful and human readable.
To invoke the XER decoder in a manner similar to asn_fprint(), use the
xer_fprint() call:
\layout LyX-Code
2004-08-23 15:12:04 +00:00
2005-02-21 14:16:10 +00:00
xer_fprint(stdout, &asn_DEF_Rectangle, rect);
2004-08-23 15:12:04 +00:00
\layout Standard
2005-02-21 14:16:10 +00:00
See Section
\begin_inset LatexCommand \vref{sub:Encoding-XER}
2004-08-23 15:12:04 +00:00
\end_inset
2005-02-21 14:16:10 +00:00
for XML-related details.
\layout Subsection
2004-08-23 15:12:04 +00:00
2005-02-21 14:16:10 +00:00
\begin_inset LatexCommand \label{sub:Freeing-the-target}
2004-08-23 15:12:04 +00:00
\end_inset
2005-02-21 14:16:10 +00:00
Freeing the target structure
2004-08-23 15:12:04 +00:00
\layout Standard
2005-02-21 14:16:10 +00:00
Freeing the structure is slightly more complex than it may seem to.
When the ASN.1 structure is freed, all the members of the structure and
their submembers etc etc are recursively freed too.
But it might not be feasible to free the structure itself.
Consider the following case:
\layout LyX-Code
struct my_figure { /* The custom structure */
\layout LyX-Code
2004-08-23 15:12:04 +00:00
2005-02-21 14:16:10 +00:00
int flags; /* <some custom member> */
\layout LyX-Code
/* The type is generated by the ASN.1 compiler */
\layout LyX-Code
\emph on
Rectangle_t rect;
\layout LyX-Code
/* other members of the structure */
\layout LyX-Code
};
2004-08-23 15:12:04 +00:00
\layout Standard
2005-02-21 14:16:10 +00:00
In this example, the application programmer defined a custom structure with
one ASN.1-derived member (rect).
This member is not a reference to the Rectangle_t, but an in-place inclusion
of the Rectangle_t structure.
If the freeing is necessary, the usual procedure of freeing everything
must not be applied to the &rect pointer itself, because it does not point
2005-02-22 07:28:26 +00:00
to the memory block directly allocated by the memory allocation routine,
but instead lies within a block allocated for the my_figure structure.
2005-02-21 14:16:10 +00:00
\layout Standard
2004-08-23 15:12:04 +00:00
2005-02-21 14:16:10 +00:00
To solve this problem, the free_struct routine has the additional argument
2005-02-22 07:28:26 +00:00
(besides the obvious type descriptor and target structure pointers), which
is the flag specifying whether the outer pointer itself must be freed (0,
default) or it should be left intact (non-zero value).
2005-02-21 14:16:10 +00:00
\layout LyX-Code
\series bold
/* 1.
Rectangle_t is defined within my_figure */
\layout LyX-Code
struct my_figure {
\layout LyX-Code
Rectangle_t rect;
\layout LyX-Code
} *mf =
\series bold
...
\series default
;
\layout LyX-Code
/*
\layout LyX-Code
* Freeing the Rectangle_t
\layout LyX-Code
* without freeing the mf->rect area
\layout LyX-Code
*/
\layout LyX-Code
asn_DEF_Rectangle->free_struct(
\layout LyX-Code
&asn_DEF_Rectangle, &mf->rect,
\series bold
1
\emph on
\emph default
/* !free */
\series default
);
\layout LyX-Code
\layout LyX-Code
\layout LyX-Code
\series bold
/* 2.
Rectangle_t is a stand-alone pointer */
\layout LyX-Code
Rectangle_t *rect =
\series bold
...
\series default
;
\layout LyX-Code
/*
\layout LyX-Code
* Freeing the Rectangle_t
\layout LyX-Code
* and freeing the rect pointer
\layout LyX-Code
*/
\layout LyX-Code
2004-08-23 15:12:04 +00:00
2005-02-21 14:16:10 +00:00
asn_DEF_Rectangle->free_struct(
\layout LyX-Code
&asn_DEF_Rectangle, rect,
\series bold
0
\emph on
\emph default
/* free the pointer too */
\series default
);
2004-08-23 15:12:04 +00:00
\layout Standard
2005-02-21 14:16:10 +00:00
It is safe to invoke the
2004-08-23 15:12:04 +00:00
\emph on
2005-02-21 14:16:10 +00:00
free_struct
\emph default
function with the target structure pointer set to 0 (NULL), the function
will do nothing.
\layout Chapter
2004-08-23 15:12:04 +00:00
2005-02-21 14:16:10 +00:00
\begin_inset LatexCommand \label{cha:Step-by-step-examples}
2004-08-23 15:12:04 +00:00
\end_inset
2004-10-13 09:13:56 +00:00
2005-02-21 14:16:10 +00:00
Step by step examples
\layout Section
2004-10-13 09:13:56 +00:00
2005-02-21 14:16:10 +00:00
A
\begin_inset Quotes sld
\end_inset
Rectangle
\begin_inset Quotes srd
2004-10-13 09:13:56 +00:00
\end_inset
2005-02-21 14:16:10 +00:00
Encoder
2004-10-13 09:13:56 +00:00
\layout Standard
2005-02-21 14:16:10 +00:00
This example will help you to create a simple BER and XER encoder of a
\begin_inset Quotes sld
2004-10-13 09:13:56 +00:00
\end_inset
2004-08-23 15:12:04 +00:00
2005-02-21 14:16:10 +00:00
Rectangle
\begin_inset Quotes srd
\end_inset
2004-08-23 15:12:04 +00:00
2005-02-21 14:16:10 +00:00
type used throughout this document.
\layout Enumerate
2004-08-23 15:12:04 +00:00
2005-02-21 14:16:10 +00:00
Create a file named
2004-08-23 15:12:04 +00:00
\series bold
2005-02-21 14:16:10 +00:00
rectangle.asn1
\series default
with the following contents:
\begin_deeper
\layout LyX-Code
2004-08-23 15:12:04 +00:00
2005-02-21 14:16:10 +00:00
RectangleModule1 DEFINITIONS ::=
\layout LyX-Code
BEGIN
\layout LyX-Code
2004-08-23 15:12:04 +00:00
2005-02-21 14:16:10 +00:00
\layout LyX-Code
2004-08-23 15:12:04 +00:00
2005-02-21 14:16:10 +00:00
Rectangle ::= SEQUENCE {
\layout LyX-Code
2004-08-23 15:12:04 +00:00
2005-02-21 14:16:10 +00:00
height INTEGER,
\layout LyX-Code
2004-08-23 15:12:04 +00:00
2005-02-21 14:16:10 +00:00
width INTEGER
\layout LyX-Code
2004-08-23 15:12:04 +00:00
2005-02-21 14:16:10 +00:00
}
\layout LyX-Code
2004-08-23 15:12:04 +00:00
2005-02-21 14:16:10 +00:00
\layout LyX-Code
2004-08-23 15:12:04 +00:00
2005-02-21 14:16:10 +00:00
END
\end_deeper
\layout Enumerate
2004-08-23 15:12:04 +00:00
2005-02-21 14:16:10 +00:00
Compile it into the set of .c and .h files using asn1c compiler
\begin_inset LatexCommand \cite{ASN1C}
2004-08-23 15:12:04 +00:00
\end_inset
2005-02-21 14:16:10 +00:00
:
\begin_deeper
\layout LyX-Code
2004-08-23 15:12:04 +00:00
2005-02-21 14:16:10 +00:00
\emph on
asn1c -fnative-types
\series bold
\emph default
rectangle.asn1
\end_deeper
\layout Enumerate
2004-08-23 15:12:04 +00:00
2005-02-21 14:16:10 +00:00
Alternatively, use the Online ASN.1 compiler
\begin_inset LatexCommand \cite{AONL}
2004-08-23 15:12:04 +00:00
\end_inset
2005-02-21 14:16:10 +00:00
by uploading the
\series bold
rectangle.asn1
\series default
file into the Web form and unpacking the produced archive on your computer.
\layout Enumerate
2004-08-23 15:12:04 +00:00
2005-02-21 14:16:10 +00:00
By this time, you should have gotten multiple files in the current directory,
including the
\series bold
Rectangle.c
\series default
and
\series bold
Rectangle.h
\series default
.
\layout Enumerate
2004-08-23 15:12:04 +00:00
2005-02-21 14:16:10 +00:00
Create a main() routine which creates the Rectangle_t structure in memory
and encodes it using BER and XER encoding rules.
Let's name the file
\series bold
main.c
\series default
:
\begin_inset ERT
status Open
2004-08-23 15:12:04 +00:00
\layout Standard
2005-02-21 14:16:10 +00:00
\backslash
clearpage{}
2004-08-23 15:12:04 +00:00
\end_inset
2005-02-21 14:16:10 +00:00
\begin_deeper
\layout LyX-Code
2004-08-23 15:12:04 +00:00
\size small
2005-02-21 14:16:10 +00:00
#include <stdio.h>
\layout LyX-Code
2004-08-23 15:12:04 +00:00
2005-02-21 14:16:10 +00:00
\size small
#include <sys/types.h>
\layout LyX-Code
2004-08-23 15:12:04 +00:00
2005-02-21 14:16:10 +00:00
\size small
#include <Rectangle.h> /* Rectangle ASN.1 type */
\layout LyX-Code
2004-08-23 15:12:04 +00:00
2005-02-21 14:16:10 +00:00
\layout LyX-Code
2004-08-23 15:12:04 +00:00
2005-02-21 14:16:10 +00:00
\size small
/*
\layout LyX-Code
2004-08-23 15:12:04 +00:00
2005-02-21 14:16:10 +00:00
\size small
* This is a custom function which writes the
\layout LyX-Code
2004-09-06 08:07:29 +00:00
2005-02-21 14:16:10 +00:00
\size small
* encoded output into some FILE stream.
\layout LyX-Code
2004-09-06 08:07:29 +00:00
2005-02-21 14:16:10 +00:00
\size small
*/
\layout LyX-Code
2004-08-23 15:12:04 +00:00
2005-02-21 14:16:10 +00:00
\size small
static int
\layout LyX-Code
2004-08-23 15:12:04 +00:00
\size small
2005-02-21 14:16:10 +00:00
write_out(const void *buffer, size_t size, void *app_key) {
\layout LyX-Code
2004-08-23 15:12:04 +00:00
2005-02-21 14:16:10 +00:00
\size small
FILE *out_fp = app_key;
\layout LyX-Code
2004-08-23 15:12:04 +00:00
2005-02-21 14:16:10 +00:00
\size small
size_t wrote;
\layout LyX-Code
2004-08-23 15:12:04 +00:00
\size small
2005-02-21 14:16:10 +00:00
\layout LyX-Code
2004-08-23 15:12:04 +00:00
2004-09-26 13:13:13 +00:00
2005-02-21 14:16:10 +00:00
\size small
wrote = fwrite(buffer, 1, size, out_fp);
\layout LyX-Code
2004-09-26 13:13:13 +00:00
2005-02-21 14:16:10 +00:00
\size small
\layout LyX-Code
2004-09-26 13:13:13 +00:00
2004-08-23 15:12:04 +00:00
2005-02-21 14:16:10 +00:00
\size small
return (wrote == size) ? 0 : -1;
\layout LyX-Code
2004-08-23 15:12:04 +00:00
\size small
2005-02-21 14:16:10 +00:00
}
\layout LyX-Code
2004-08-23 15:12:04 +00:00
2005-02-21 14:16:10 +00:00
\layout LyX-Code
2004-08-23 15:12:04 +00:00
2005-02-21 14:16:10 +00:00
\size small
int main(int ac, char **av) {
\layout LyX-Code
2004-08-23 15:12:04 +00:00
\size small
2005-02-21 14:16:10 +00:00
Rectangle_t *rectangle; /* Type to encode */
\layout LyX-Code
2004-08-23 15:12:04 +00:00
2005-02-21 14:16:10 +00:00
\size small
asn_enc_rval_t ec; /* Encoder return value */
\layout LyX-Code
2004-08-23 15:12:04 +00:00
2005-02-21 14:16:10 +00:00
\size small
\layout LyX-Code
2004-08-23 15:12:04 +00:00
2005-02-21 14:16:10 +00:00
\size small
/* Allocate the Rectangle_t */
\layout LyX-Code
2004-08-23 15:12:04 +00:00
2005-02-21 14:16:10 +00:00
\size small
rectangle = calloc(1, sizeof(Rectangle_t)); /* not malloc! */
\layout LyX-Code
2004-08-23 15:12:04 +00:00
2005-02-21 14:16:10 +00:00
\size small
if(!rectangle) {
\layout LyX-Code
2004-08-23 15:12:04 +00:00
\size small
2005-02-21 14:16:10 +00:00
perror(
\begin_inset Quotes sld
2004-08-23 15:12:04 +00:00
\end_inset
2005-02-21 14:16:10 +00:00
calloc() failed
\begin_inset Quotes srd
2004-08-23 15:12:04 +00:00
\end_inset
2005-02-21 14:16:10 +00:00
);
\layout LyX-Code
2004-08-23 15:12:04 +00:00
\size small
2005-02-21 14:16:10 +00:00
exit(71); /* better, EX_OSERR */
\layout LyX-Code
2004-08-23 15:12:04 +00:00
2005-02-21 14:16:10 +00:00
\size small
}
\layout LyX-Code
2004-08-23 15:12:04 +00:00
2005-02-21 14:16:10 +00:00
\size small
\layout LyX-Code
2004-08-23 15:12:04 +00:00
2005-02-21 14:16:10 +00:00
\size small
/* Initialize the Rectangle members */
\layout LyX-Code
2004-08-23 15:12:04 +00:00
2005-02-21 14:16:10 +00:00
\size small
rectangle->height = 42; /* any random value */
\layout LyX-Code
2004-08-23 15:12:04 +00:00
2004-06-03 03:49:45 +00:00
2005-02-21 14:16:10 +00:00
\size small
rectangle->width = 23; /* any random value */
\layout LyX-Code
2004-06-03 03:49:45 +00:00
2005-02-21 14:16:10 +00:00
\size small
\layout LyX-Code
2004-06-03 03:49:45 +00:00
2005-02-21 14:16:10 +00:00
\size small
/* BER encode the data if filename is given */
\layout LyX-Code
2004-06-03 03:49:45 +00:00
2005-02-21 14:16:10 +00:00
\size small
if(ac < 2) {
\layout LyX-Code
2004-06-03 03:49:45 +00:00
2005-02-21 14:16:10 +00:00
\size small
fprintf(stderr,
2004-06-03 03:49:45 +00:00
\begin_inset Quotes sld
\end_inset
2005-02-21 14:16:10 +00:00
Specify filename for BER output
\backslash
n
2004-06-03 03:49:45 +00:00
\begin_inset Quotes srd
\end_inset
2005-02-21 14:16:10 +00:00
);
\layout LyX-Code
2004-06-03 03:49:45 +00:00
2005-02-21 14:16:10 +00:00
\size small
} else {
\layout LyX-Code
\size small
const char *filename = av[1];
\layout LyX-Code
\size small
FILE *fp = fopen(filename,
2004-06-03 03:49:45 +00:00
\begin_inset Quotes sld
\end_inset
2005-07-21 18:45:37 +00:00
wb
2004-06-03 03:49:45 +00:00
\begin_inset Quotes srd
\end_inset
2005-02-21 14:16:10 +00:00
); /* for BER output */
2004-06-03 03:49:45 +00:00
\layout LyX-Code
2005-02-21 14:16:10 +00:00
\layout LyX-Code
2004-06-03 03:49:45 +00:00
2005-02-21 14:16:10 +00:00
\size small
if(!fp) {
\layout LyX-Code
2004-06-03 03:49:45 +00:00
2005-02-21 14:16:10 +00:00
\size small
perror(filename);
\layout LyX-Code
2004-06-03 03:49:45 +00:00
2004-09-30 22:26:19 +00:00
2005-02-21 14:16:10 +00:00
\size small
exit(71); /* better, EX_OSERR */
\layout LyX-Code
2004-09-30 22:26:19 +00:00
2005-02-21 14:16:10 +00:00
\size small
}
\layout LyX-Code
2004-09-30 22:26:19 +00:00
2004-06-03 03:49:45 +00:00
2005-02-21 14:16:10 +00:00
\size small
2004-06-03 03:49:45 +00:00
\layout LyX-Code
2005-02-21 14:16:10 +00:00
\size small
/* Encode the Rectangle type as BER (DER) */
2004-06-03 03:49:45 +00:00
\layout LyX-Code
2005-02-21 14:16:10 +00:00
\size small
ec = der_encode(&asn_DEF_Rectangle,
2004-08-23 15:12:04 +00:00
\layout LyX-Code
2005-02-21 14:16:10 +00:00
\size small
rectangle, write_out, fp);
2004-06-03 03:49:45 +00:00
\layout LyX-Code
2005-02-21 14:16:10 +00:00
\size small
fclose(fp);
2004-06-03 03:49:45 +00:00
\layout LyX-Code
2005-02-21 14:16:10 +00:00
\size small
if(ec.encoded == -1) {
\layout LyX-Code
2004-06-03 03:49:45 +00:00
2005-02-21 14:16:10 +00:00
\size small
fprintf(stderr,
\layout LyX-Code
2004-06-03 03:49:45 +00:00
2005-02-21 14:16:10 +00:00
\size small
\begin_inset Quotes sld
2004-06-03 03:49:45 +00:00
\end_inset
2005-02-21 14:16:10 +00:00
Could not encode Rectangle (at %s)
\backslash
n
\begin_inset Quotes srd
2004-06-03 03:49:45 +00:00
\end_inset
2005-02-21 14:16:10 +00:00
,
\layout LyX-Code
2004-06-03 03:49:45 +00:00
2005-02-21 14:16:10 +00:00
\size small
ec.failed_type ? ec.failed_type->name :
\begin_inset Quotes sld
2004-06-03 03:49:45 +00:00
\end_inset
2005-02-21 14:16:10 +00:00
unknown
\begin_inset Quotes srd
\end_inset
2004-06-03 03:49:45 +00:00
2005-02-21 14:16:10 +00:00
);
\layout LyX-Code
2004-09-24 20:56:07 +00:00
2005-02-21 14:16:10 +00:00
\size small
exit(65); /* better, EX_DATAERR */
\layout LyX-Code
2004-09-24 20:56:07 +00:00
2005-02-21 14:16:10 +00:00
\size small
} else {
\layout LyX-Code
2004-09-24 20:56:07 +00:00
2005-02-21 14:16:10 +00:00
\size small
fprintf(stderr,
\begin_inset Quotes sld
\end_inset
2004-06-03 03:49:45 +00:00
2005-02-21 14:16:10 +00:00
Created %s with BER encoded Rectangle
\backslash
n
\begin_inset Quotes srd
2004-06-03 03:49:45 +00:00
\end_inset
2005-02-21 14:16:10 +00:00
,
\layout LyX-Code
2004-06-03 03:49:45 +00:00
2005-02-21 14:16:10 +00:00
\size small
filename);
\layout LyX-Code
2004-06-03 03:49:45 +00:00
2005-02-21 14:16:10 +00:00
\size small
}
\layout LyX-Code
2004-09-24 20:56:07 +00:00
2005-02-21 14:16:10 +00:00
\size small
}
\layout LyX-Code
2004-09-24 20:56:07 +00:00
2004-06-03 03:49:45 +00:00
2005-02-21 14:16:10 +00:00
\size small
\layout LyX-Code
2004-06-03 03:49:45 +00:00
2005-02-21 14:16:10 +00:00
\size small
/* Also print the constructed Rectangle XER encoded (XML) */
2004-06-03 03:49:45 +00:00
\layout LyX-Code
2005-02-21 14:16:10 +00:00
\size small
xer_fprint(stdout, &asn_DEF_Rectangle, rectangle);
2004-06-03 03:49:45 +00:00
\layout LyX-Code
2005-02-21 14:16:10 +00:00
\size small
2004-06-03 03:49:45 +00:00
\layout LyX-Code
2005-02-21 14:16:10 +00:00
\size small
return 0; /* Encoding finished successfully */
\layout LyX-Code
\size small
}
\end_deeper
\layout Enumerate
Compile all files together using C compiler (varies by platform):
\begin_deeper
2004-06-03 03:49:45 +00:00
\layout LyX-Code
2005-02-21 14:16:10 +00:00
\emph on
cc -I.
-o
\series bold
rencode
\series default
*.c
\end_deeper
\layout Enumerate
Voila! You have just created the BER and XER encoder of a Rectangle type,
named
\series bold
rencode
\series default
!
\layout Standard
\begin_inset ERT
status Collapsed
\layout Standard
\backslash
clearpage{}
\end_inset
\layout Section
\begin_inset LatexCommand \label{sec:A-Rectangle-Decoder}
2004-06-03 03:49:45 +00:00
2005-02-21 14:16:10 +00:00
\end_inset
2004-06-03 03:49:45 +00:00
2005-02-21 14:16:10 +00:00
A
\begin_inset Quotes sld
\end_inset
2004-06-03 03:49:45 +00:00
2005-02-21 14:16:10 +00:00
Rectangle
\begin_inset Quotes srd
\end_inset
2004-06-03 03:49:45 +00:00
2005-02-21 14:16:10 +00:00
Decoder
\layout Standard
2004-06-03 03:49:45 +00:00
2005-02-21 14:16:10 +00:00
This example will help you to create a simple BER decoder of a simple
\begin_inset Quotes sld
\end_inset
2004-06-03 03:49:45 +00:00
2005-02-21 14:16:10 +00:00
Rectangle
\begin_inset Quotes srd
\end_inset
2004-06-03 03:49:45 +00:00
2005-02-21 14:16:10 +00:00
type used throughout this document.
\layout Enumerate
Create a file named
2004-06-03 03:49:45 +00:00
\series bold
2005-02-21 14:16:10 +00:00
rectangle.asn1
2004-06-03 03:49:45 +00:00
\series default
2005-02-21 14:16:10 +00:00
with the following contents:
\begin_deeper
2004-06-03 03:49:45 +00:00
\layout LyX-Code
2005-02-21 14:16:10 +00:00
RectangleModule1 DEFINITIONS ::=
2004-06-03 03:49:45 +00:00
\layout LyX-Code
2005-02-21 14:16:10 +00:00
BEGIN
2004-08-23 15:12:04 +00:00
\layout LyX-Code
2005-02-21 14:16:10 +00:00
2004-06-03 03:49:45 +00:00
\layout LyX-Code
2005-02-21 14:16:10 +00:00
Rectangle ::= SEQUENCE {
2004-06-03 03:49:45 +00:00
\layout LyX-Code
2005-02-21 14:16:10 +00:00
height INTEGER,
2004-06-03 03:49:45 +00:00
\layout LyX-Code
2005-02-21 14:16:10 +00:00
width INTEGER
2004-06-03 03:49:45 +00:00
\layout LyX-Code
}
2005-02-21 14:16:10 +00:00
\layout LyX-Code
2004-06-03 03:49:45 +00:00
2005-02-21 14:16:10 +00:00
\layout LyX-Code
2004-06-03 03:49:45 +00:00
2005-02-21 14:16:10 +00:00
END
\end_deeper
\layout Enumerate
Compile it into the set of .c and .h files using asn1c compiler
\begin_inset LatexCommand \cite{ASN1C}
2004-06-03 03:49:45 +00:00
\end_inset
2005-02-21 14:16:10 +00:00
:
\begin_deeper
\layout LyX-Code
2004-06-03 03:49:45 +00:00
2005-02-21 14:16:10 +00:00
\emph on
asn1c -fnative-types
\series bold
\emph default
rectangle.asn1
\end_deeper
\layout Enumerate
2004-06-03 03:49:45 +00:00
2005-02-21 14:16:10 +00:00
Alternatively, use the Online ASN.1 compiler
\begin_inset LatexCommand \cite{AONL}
2004-06-03 03:49:45 +00:00
\end_inset
2005-02-21 14:16:10 +00:00
by uploading the
\series bold
rectangle.asn1
\series default
file into the Web form and unpacking the produced archive on your computer.
\layout Enumerate
2004-06-03 03:49:45 +00:00
2005-02-21 14:16:10 +00:00
By this time, you should have gotten multiple files in the current directory,
including the
\series bold
Rectangle.c
\series default
and
\series bold
Rectangle.h
\series default
.
\layout Enumerate
2004-06-03 03:49:45 +00:00
2005-02-21 14:16:10 +00:00
Create a main() routine which takes the binary input file, decodes it as
it were a BER-encoded Rectangle type, and prints out the text (XML) representat
ion of the Rectangle type.
Let's name the file
\series bold
main.c
\series default
:
\begin_inset ERT
status Collapsed
2004-06-03 03:49:45 +00:00
\layout Standard
2005-02-21 14:16:10 +00:00
\backslash
clearpage{}
\end_inset
2004-06-03 03:49:45 +00:00
2005-02-21 14:16:10 +00:00
\begin_deeper
2004-06-03 03:49:45 +00:00
\layout LyX-Code
2005-02-21 14:16:10 +00:00
\size small
#include <stdio.h>
\layout LyX-Code
2004-06-03 03:49:45 +00:00
2005-02-21 14:16:10 +00:00
\size small
#include <sys/types.h>
\layout LyX-Code
2004-06-03 03:49:45 +00:00
2005-02-21 14:16:10 +00:00
\size small
#include <Rectangle.h> /* Rectangle ASN.1 type */
\layout LyX-Code
2004-06-03 03:49:45 +00:00
2005-02-21 14:16:10 +00:00
\size small
\layout LyX-Code
2004-06-03 03:49:45 +00:00
2005-02-21 14:16:10 +00:00
\size small
int main(int ac, char **av) {
\layout LyX-Code
2004-06-03 03:49:45 +00:00
2005-02-21 14:16:10 +00:00
\size small
char buf[1024]; /* Temporary buffer */
2004-06-03 03:49:45 +00:00
\layout LyX-Code
2005-02-21 14:16:10 +00:00
\size small
Rectangle_t *rectangle = 0; /* Type to decode */
2004-06-03 03:49:45 +00:00
\layout LyX-Code
2005-02-21 14:16:10 +00:00
\size small
asn_dec_rval_t rval; /* Decoder return value */
2004-06-03 03:49:45 +00:00
\layout LyX-Code
2005-02-21 14:16:10 +00:00
\size small
FILE *fp; /* Input file handler */
2004-06-03 03:49:45 +00:00
\layout LyX-Code
2005-02-21 14:16:10 +00:00
\size small
size_t size; /* Number of bytes read */
2004-06-03 03:49:45 +00:00
\layout LyX-Code
2005-02-21 14:16:10 +00:00
\size small
char *filename; /* Input file name */
2004-06-03 03:49:45 +00:00
\layout LyX-Code
2005-02-21 14:16:10 +00:00
\size small
2004-06-03 03:49:45 +00:00
\layout LyX-Code
2005-02-21 14:16:10 +00:00
\size small
/* Require a single filename argument */
2004-06-03 03:49:45 +00:00
\layout LyX-Code
2005-02-21 14:16:10 +00:00
\size small
if(ac != 2) {
2004-06-03 03:49:45 +00:00
\layout LyX-Code
2005-02-21 14:16:10 +00:00
\size small
fprintf(stderr,
2004-06-03 03:49:45 +00:00
\begin_inset Quotes sld
\end_inset
2005-02-21 14:16:10 +00:00
Usage: %s <file.ber>
2004-06-03 03:49:45 +00:00
\backslash
n
\begin_inset Quotes srd
\end_inset
2005-02-21 14:16:10 +00:00
, av[0]);
2004-06-03 03:49:45 +00:00
\layout LyX-Code
2005-02-21 14:16:10 +00:00
\size small
exit(64); /* better, EX_USAGE */
2004-06-03 03:49:45 +00:00
\layout LyX-Code
2005-02-21 14:16:10 +00:00
\size small
2004-06-03 03:49:45 +00:00
} else {
\layout LyX-Code
2005-02-21 14:16:10 +00:00
\size small
filename = av[1];
2004-06-03 03:49:45 +00:00
\layout LyX-Code
2005-02-21 14:16:10 +00:00
\size small
2004-06-03 03:49:45 +00:00
}
\layout LyX-Code
2005-02-21 14:16:10 +00:00
\size small
\layout LyX-Code
2004-06-03 03:49:45 +00:00
2005-02-21 14:16:10 +00:00
\size small
/* Open input file as read-only binary */
\layout LyX-Code
2004-06-03 03:49:45 +00:00
2004-09-24 20:56:07 +00:00
2005-02-21 14:16:10 +00:00
\size small
fp = fopen(filename,
\begin_inset Quotes sld
2004-09-24 20:56:07 +00:00
\end_inset
2005-02-21 14:16:10 +00:00
rb
\begin_inset Quotes srd
2004-09-24 20:56:07 +00:00
\end_inset
2005-02-21 14:16:10 +00:00
);
2004-09-24 20:56:07 +00:00
\layout LyX-Code
2005-02-21 14:16:10 +00:00
\size small
if(!fp) {
2004-09-24 20:56:07 +00:00
\layout LyX-Code
2005-02-21 14:16:10 +00:00
\size small
perror(filename);
2004-09-24 20:56:07 +00:00
\layout LyX-Code
2005-02-21 14:16:10 +00:00
\size small
exit(66); /* better, EX_NOINPUT */
2004-09-24 20:56:07 +00:00
\layout LyX-Code
2005-02-21 14:16:10 +00:00
\size small
}
2004-09-24 20:56:07 +00:00
\layout LyX-Code
2005-02-21 14:16:10 +00:00
\size small
2004-09-24 20:56:07 +00:00
\layout LyX-Code
2005-02-21 14:16:10 +00:00
\size small
/* Read up to the buffer size */
2004-09-24 20:56:07 +00:00
\layout LyX-Code
2005-02-21 14:16:10 +00:00
\size small
size = fread(buf, 1, sizeof(buf), fp);
2004-09-24 20:56:07 +00:00
\layout LyX-Code
2005-02-21 14:16:10 +00:00
\size small
fclose(fp);
2004-09-24 20:56:07 +00:00
\layout LyX-Code
2005-02-21 14:16:10 +00:00
\size small
if(!size) {
2004-09-24 20:56:07 +00:00
\layout LyX-Code
2004-06-03 03:49:45 +00:00
2005-02-21 14:16:10 +00:00
\size small
fprintf(stderr,
\begin_inset Quotes sld
2004-06-03 03:49:45 +00:00
\end_inset
2005-02-21 14:16:10 +00:00
%s: Empty or broken
\backslash
n
\begin_inset Quotes srd
2004-06-03 03:49:45 +00:00
\end_inset
2005-02-21 14:16:10 +00:00
, filename);
2004-06-03 03:49:45 +00:00
\layout LyX-Code
2004-09-24 20:56:07 +00:00
2005-02-21 14:16:10 +00:00
\size small
exit(65); /* better, EX_DATAERR */
2004-09-24 20:56:07 +00:00
\layout LyX-Code
2005-02-21 14:16:10 +00:00
\size small
}
\layout LyX-Code
2004-09-24 20:56:07 +00:00
2004-06-03 03:49:45 +00:00
2005-02-21 14:16:10 +00:00
\size small
\layout LyX-Code
2004-06-03 03:49:45 +00:00
2005-02-21 14:16:10 +00:00
\size small
/* Decode the input buffer as Rectangle type */
\layout LyX-Code
2004-06-03 03:49:45 +00:00
2005-02-21 14:16:10 +00:00
\size small
rval = ber_decode(0, &asn_DEF_Rectangle,
2004-06-03 03:49:45 +00:00
\layout LyX-Code
2005-02-21 14:16:10 +00:00
\size small
(void **)&rectangle, buf, size);
2004-06-03 03:49:45 +00:00
\layout LyX-Code
2005-02-21 14:16:10 +00:00
\size small
if(rval.code != RC_OK) {
2004-06-03 03:49:45 +00:00
\layout LyX-Code
2005-02-21 14:16:10 +00:00
\size small
fprintf(stderr,
2004-06-03 03:49:45 +00:00
\layout LyX-Code
2005-02-21 14:16:10 +00:00
\size small
\begin_inset Quotes sld
\end_inset
2004-06-03 03:49:45 +00:00
2005-02-21 14:16:10 +00:00
%s: Broken Rectangle encoding at byte %ld
\backslash
n
\begin_inset Quotes srd
\end_inset
2004-06-03 03:49:45 +00:00
2005-02-21 14:16:10 +00:00
,
2004-06-03 03:49:45 +00:00
\layout LyX-Code
2005-02-21 14:16:10 +00:00
\size small
filename, (long)rval.consumed);
2004-06-03 03:49:45 +00:00
\layout LyX-Code
2005-02-21 14:16:10 +00:00
\size small
exit(65); /* better, EX_DATAERR */
2004-06-03 03:49:45 +00:00
\layout LyX-Code
2005-02-21 14:16:10 +00:00
\size small
}
2004-06-03 03:49:45 +00:00
\layout LyX-Code
2005-02-21 14:16:10 +00:00
\size small
2004-06-03 03:49:45 +00:00
\layout LyX-Code
2005-02-21 14:16:10 +00:00
\size small
/* Print the decoded Rectangle type as XML */
2004-06-03 03:49:45 +00:00
\layout LyX-Code
2005-02-21 14:16:10 +00:00
\size small
xer_fprint(stdout, &asn_DEF_Rectangle, rectangle);
2004-06-03 03:49:45 +00:00
\layout LyX-Code
2005-02-21 14:16:10 +00:00
\size small
2004-06-03 03:49:45 +00:00
\layout LyX-Code
2005-02-21 14:16:10 +00:00
\size small
return 0; /* Decoding finished successfully */
2004-06-03 03:49:45 +00:00
\layout LyX-Code
2005-02-21 14:16:10 +00:00
\size small
}
\end_deeper
\layout Enumerate
Compile all files together using C compiler (varies by platform):
\begin_deeper
2004-06-03 03:49:45 +00:00
\layout LyX-Code
\emph on
2005-02-21 14:16:10 +00:00
cc -I.
-o
\series bold
rdecode
\series default
*.c
\end_deeper
\layout Enumerate
2005-01-14 11:38:49 +00:00
2005-02-21 14:16:10 +00:00
Voila! You have just created the BER decoder of a Rectangle type, named
\series bold
rdecode
\series default
!
2005-01-31 10:10:04 +00:00
\layout Chapter
2005-02-21 14:16:10 +00:00
Constraint validation examples
\layout Standard
2005-02-02 09:53:46 +00:00
2005-02-21 14:16:10 +00:00
This chapter shows how to define ASN.1 constraints and use the generated
validation code.
2005-01-31 10:10:04 +00:00
\layout Section
2005-01-14 11:38:49 +00:00
2005-02-21 14:16:10 +00:00
Adding constraints into
2005-01-14 11:38:49 +00:00
\begin_inset Quotes sld
\end_inset
Rectangle
\begin_inset Quotes srd
\end_inset
2005-02-21 14:16:10 +00:00
type
2005-01-14 11:38:49 +00:00
\layout Standard
2005-02-21 14:16:10 +00:00
This example shows how to add basic constraints to the ASN.1 specification
and how to invoke the constraints validation code in your application.
2005-01-14 11:38:49 +00:00
\layout Enumerate
Create a file named
\series bold
rectangle.asn1
\series default
with the following contents:
\begin_deeper
\layout LyX-Code
2005-02-21 14:16:10 +00:00
RectangleModuleWithConstraints DEFINITIONS ::=
2005-01-14 11:38:49 +00:00
\layout LyX-Code
BEGIN
\layout LyX-Code
\layout LyX-Code
Rectangle ::= SEQUENCE {
\layout LyX-Code
2005-02-21 14:16:10 +00:00
height INTEGER (0..100), -- Value range constraint
2005-01-14 11:38:49 +00:00
\layout LyX-Code
2005-02-21 14:16:10 +00:00
width INTEGER (0..MAX) -- Makes width non-negative
2005-01-14 11:38:49 +00:00
\layout LyX-Code
}
\layout LyX-Code
\layout LyX-Code
END
\end_deeper
\layout Enumerate
2005-02-21 14:16:10 +00:00
Compile the file according to procedures shown in the previous chapter.
\layout Enumerate
Modify the Rectangle type processing routine (you can start with the main()
routine shown in the Section
\begin_inset LatexCommand \vref{sec:A-Rectangle-Decoder}
2005-01-14 11:38:49 +00:00
\end_inset
2005-02-21 14:16:10 +00:00
) by placing the following snippet of code
\emph on
before
\emph default
encoding and/or
\emph on
after
\emph default
decoding the Rectangle type
\begin_inset Foot
collapsed true
2005-01-14 11:38:49 +00:00
2005-02-21 14:16:10 +00:00
\layout Standard
2005-01-14 11:38:49 +00:00
2005-02-21 14:16:10 +00:00
Placing the constraint checking code
2005-01-14 11:38:49 +00:00
\emph on
2005-02-21 14:16:10 +00:00
before
2005-01-14 11:38:49 +00:00
\emph default
2005-02-21 14:16:10 +00:00
encoding helps to make sure you know the data is correct and within constraints
before sharing the data with anyone else.
\layout Standard
2005-01-14 11:38:49 +00:00
2005-02-21 14:16:10 +00:00
Placing the constraint checking code
\emph on
after
\emph default
decoding, but before any further action depending on the decoded data,
helps to make sure the application got the valid contents before making
use of it.
2005-01-14 11:38:49 +00:00
\end_inset
:
2005-01-17 11:05:04 +00:00
\begin_inset ERT
2005-02-21 14:16:10 +00:00
status Collapsed
2005-01-17 11:05:04 +00:00
\layout Standard
\backslash
clearpage{}
\end_inset
2005-01-14 11:38:49 +00:00
\begin_deeper
\layout LyX-Code
\size small
2005-02-21 14:16:10 +00:00
int ret; /* Return value */
2005-01-14 11:38:49 +00:00
\layout LyX-Code
\size small
2005-02-21 14:16:10 +00:00
char errbuf[128]; /* Buffer for error message */
2005-01-14 11:38:49 +00:00
\layout LyX-Code
\size small
2005-02-21 14:16:10 +00:00
size_t errlen = sizeof(errbuf); /* Size of the buffer */
\layout LyX-Code
\size small
\layout LyX-Code
\size small
/* ...
here may go Rectangle decoding code ...
*/
2005-01-14 11:38:49 +00:00
\layout LyX-Code
2005-02-21 14:16:10 +00:00
\size small
2005-01-31 10:10:04 +00:00
\layout LyX-Code
2005-01-14 11:38:49 +00:00
\size small
2005-02-21 14:16:10 +00:00
ret = asn_check_constraints(asn_DEF_Rectangle,
2005-01-14 11:38:49 +00:00
\layout LyX-Code
\size small
2005-02-21 14:16:10 +00:00
rectangle, errbuf, &errlen);
2005-01-14 11:38:49 +00:00
\layout LyX-Code
\size small
2005-02-21 14:16:10 +00:00
/* assert(errlen < sizeof(errbuf)); // you may rely on that */
2005-01-14 11:38:49 +00:00
\layout LyX-Code
\size small
2005-02-21 14:16:10 +00:00
if(ret) {
2005-01-14 11:38:49 +00:00
\layout LyX-Code
\size small
2005-02-21 14:16:10 +00:00
fprintf(stderr,
\begin_inset Quotes sld
\end_inset
2005-01-14 11:38:49 +00:00
2005-02-21 14:16:10 +00:00
Constraint validation failed: %s
\backslash
n
\begin_inset Quotes srd
\end_inset
2005-01-14 11:38:49 +00:00
2005-02-21 14:16:10 +00:00
,
2005-01-14 11:38:49 +00:00
\layout LyX-Code
\size small
2005-02-21 14:16:10 +00:00
errbuf /* errbuf is properly nul-terminated */
2005-01-14 11:38:49 +00:00
\layout LyX-Code
\size small
2005-02-21 14:16:10 +00:00
);
2005-01-14 11:38:49 +00:00
\layout LyX-Code
\size small
2005-02-21 14:16:10 +00:00
/* exit(...); // Replace with appropriate action */
2005-01-14 11:38:49 +00:00
\layout LyX-Code
\size small
2005-02-21 14:16:10 +00:00
}
2005-01-14 11:38:49 +00:00
\layout LyX-Code
\size small
2005-01-31 10:10:04 +00:00
2005-01-14 11:38:49 +00:00
\layout LyX-Code
\size small
2005-02-21 14:16:10 +00:00
/* ...
here may go Rectangle encoding code ...
*/
\end_deeper
\layout Enumerate
2005-01-14 11:38:49 +00:00
2005-02-21 14:16:10 +00:00
Compile the resulting C code as shown in the previous chapters.
\layout Enumerate
2005-01-14 11:38:49 +00:00
2005-02-21 14:16:10 +00:00
Try to test the constraints checking code by assigning integer value 101
to the
\series bold
.height
\series default
member of the Rectangle structure, or a negative value to the
\series bold
.width
\series default
member.
In either case, the program should print
\begin_inset Quotes sld
\end_inset
2005-01-31 10:10:04 +00:00
2005-02-21 14:16:10 +00:00
Constraint validation failed
\begin_inset Quotes srd
\end_inset
2005-01-14 11:38:49 +00:00
2005-02-21 14:16:10 +00:00
message, followed by the short explanation why validation did not succeed.
\layout Enumerate
2005-01-14 11:38:49 +00:00
2005-02-21 14:16:10 +00:00
Done.
\layout Part
2005-01-14 11:38:49 +00:00
2005-02-21 14:16:10 +00:00
\begin_inset LatexCommand \label{par:ASN.1-Basics}
2005-01-14 11:38:49 +00:00
2005-02-21 14:16:10 +00:00
\end_inset
2005-01-14 11:38:49 +00:00
2005-02-21 14:16:10 +00:00
ASN.1 Basics
\layout Chapter
2005-01-14 11:38:49 +00:00
2005-02-21 14:16:10 +00:00
\begin_inset LatexCommand \label{cha:Abstract-Syntax-Notation:}
2005-01-14 11:38:49 +00:00
2005-02-21 14:16:10 +00:00
\end_inset
2005-01-14 11:38:49 +00:00
2005-02-21 14:16:10 +00:00
Abstract Syntax Notation: ASN.1
\layout Standard
2005-01-14 11:38:49 +00:00
2005-02-21 14:16:10 +00:00
\emph on
This chapter defines some basic ASN.1 concepts and describes several most
widely used types.
It is by no means an authoritative or complete reference.
For more complete ASN.1 description, please refer to Olivier Dubuisson's
book
\begin_inset LatexCommand \cite{Dub00}
\end_inset
or the ASN.1 body of standards itself
\begin_inset LatexCommand \cite{ITU-T/ASN.1}
\end_inset
.
\layout Standard
The Abstract Syntax Notation One is used to formally describe the semantics
of data transmitted across the network.
Two communicating parties may have different formats of their native data
types (i.e.
number of bits in the integer type), thus it is important to have a way
to describe the data in a manner which is independent from the particular
machine's representation.
The ASN.1 specifications are used to achieve the following:
\layout Itemize
The specification expressed in the ASN.1 notation is a formal and precise
way to communicate the data semantics to human readers;
\layout Itemize
The ASN.1 specifications may be used as input for automatic compilers which
produce the code for some target language (C, C++, Java, etc) to encode
and decode the data according to some encoding rules (which are also defined
by the ASN.1 standard).
\layout Standard
Consider the following example:
\layout LyX-Code
Rectangle ::= SEQUENCE {
2005-01-14 11:38:49 +00:00
\layout LyX-Code
2005-02-21 14:16:10 +00:00
height INTEGER,
\layout LyX-Code
2005-01-14 11:38:49 +00:00
2005-02-21 14:16:10 +00:00
width INTEGER
2005-01-31 10:10:04 +00:00
\layout LyX-Code
2005-02-21 14:16:10 +00:00
}
\layout Standard
2005-01-31 10:10:04 +00:00
2005-02-21 14:16:10 +00:00
This ASN.1 specification describes a constructed type,
\emph on
Rectangle
\emph default
, containing two integer fields.
This specification may tell the reader that there exists this kind of data
structure and that some entity may be prepared to send or receive it.
The question on
\emph on
how
\emph default
that entity is going to send or receive the
\emph on
encoded data
\emph default
is outside the scope of ASN.1.
For example, this data structure may be encoded according to some encoding
rules and sent to the destination using the TCP protocol.
The ASN.1 specifies several ways of encoding (or
2005-01-14 11:38:49 +00:00
\begin_inset Quotes sld
\end_inset
2005-02-21 14:16:10 +00:00
serializing
2005-01-14 11:38:49 +00:00
\begin_inset Quotes srd
\end_inset
2005-02-21 14:16:10 +00:00
, or
\begin_inset Quotes sld
\end_inset
marshaling
\begin_inset Quotes srd
\end_inset
2005-01-14 11:38:49 +00:00
2005-02-21 14:16:10 +00:00
) the data: BER, PER, XER and others, including CER and DER derivatives
from BER.
\layout Standard
2005-01-14 11:38:49 +00:00
2005-02-21 14:16:10 +00:00
The complete specification must be wrapped in a module, which looks like
this:
2005-01-14 11:38:49 +00:00
\layout LyX-Code
2005-02-21 14:16:10 +00:00
RectangleModule1
2005-01-14 11:38:49 +00:00
\layout LyX-Code
2005-02-21 14:16:10 +00:00
{ iso org(3) dod(6) internet(1) private(4)
\layout LyX-Code
2005-01-14 11:38:49 +00:00
2005-02-21 14:16:10 +00:00
enterprise(1) spelio(9363) software(1)
2005-01-14 11:38:49 +00:00
\layout LyX-Code
2005-02-21 14:16:10 +00:00
asn1c(5) docs(2) rectangle(1) 1 }
\layout LyX-Code
2005-01-14 11:38:49 +00:00
2005-02-21 14:16:10 +00:00
DEFINITIONS AUTOMATIC TAGS ::=
2005-01-14 11:38:49 +00:00
\layout LyX-Code
2005-02-21 14:16:10 +00:00
BEGIN
\layout LyX-Code
2005-01-14 11:38:49 +00:00
2005-02-21 14:16:10 +00:00
2005-01-14 11:38:49 +00:00
\layout LyX-Code
2005-02-21 14:16:10 +00:00
-- This is a comment which describes nothing.
\layout LyX-Code
2005-01-14 11:38:49 +00:00
2005-02-21 14:16:10 +00:00
Rectangle ::= SEQUENCE {
2005-01-14 11:38:49 +00:00
\layout LyX-Code
2005-02-21 14:16:10 +00:00
height INTEGER, -- Height of the rectangle
\layout LyX-Code
2005-01-14 11:38:49 +00:00
2005-02-21 14:16:10 +00:00
width INTEGER -- Width of the rectangle
2005-01-14 11:38:49 +00:00
\layout LyX-Code
2005-02-21 14:16:10 +00:00
}
\layout LyX-Code
2005-01-14 11:38:49 +00:00
2005-02-21 14:16:10 +00:00
2005-01-14 11:38:49 +00:00
\layout LyX-Code
2005-02-21 14:16:10 +00:00
END
\layout Standard
2005-01-14 11:38:49 +00:00
2005-02-21 14:16:10 +00:00
The module header consists of module name (RectangleModule1), the module
object identifier ({...}), a keyword
\begin_inset Quotes sld
\end_inset
2005-01-14 11:38:49 +00:00
2005-02-21 14:16:10 +00:00
DEFINITIONS
\begin_inset Quotes srd
\end_inset
2005-01-14 11:38:49 +00:00
2005-02-21 14:16:10 +00:00
, a set of module flags (AUTOMATIC TAGS) and
2005-01-14 11:38:49 +00:00
\begin_inset Quotes sld
\end_inset
2005-02-21 14:16:10 +00:00
::= BEGIN
2005-01-14 11:38:49 +00:00
\begin_inset Quotes srd
\end_inset
2005-02-21 14:16:10 +00:00
.
The module ends with an
\begin_inset Quotes sld
\end_inset
2005-01-14 11:38:49 +00:00
2005-02-21 14:16:10 +00:00
END
\begin_inset Quotes srd
\end_inset
2005-01-14 11:38:49 +00:00
2005-02-21 14:16:10 +00:00
statement.
\layout Section
2005-01-14 11:38:49 +00:00
2005-02-21 14:16:10 +00:00
Some of the ASN.1 Basic Types
\layout Subsection
2005-01-14 11:38:49 +00:00
2005-02-21 14:16:10 +00:00
The BOOLEAN type
\layout Standard
2005-01-14 11:38:49 +00:00
2005-02-21 14:16:10 +00:00
The BOOLEAN type models the simple binary TRUE/FALSE, YES/NO, ON/OFF or
a similar kind of two-way choice.
\layout Subsection
2005-01-14 11:38:49 +00:00
2005-02-21 14:16:10 +00:00
The INTEGER type
\layout Standard
2005-01-31 10:10:04 +00:00
2005-02-21 14:16:10 +00:00
The INTEGER type is a signed natural number type without any restrictions
on its size.
If the automatic checking on INTEGER value bounds are necessary, the subtype
constraints must be used.
\layout LyX-Code
2005-01-31 10:10:04 +00:00
2005-02-21 14:16:10 +00:00
SimpleInteger ::= INTEGER
2005-01-31 10:10:04 +00:00
\layout LyX-Code
2005-01-14 11:38:49 +00:00
\layout LyX-Code
2005-02-21 14:16:10 +00:00
-- An integer with a very limited range
2005-01-14 11:38:49 +00:00
\layout LyX-Code
2005-02-21 14:16:10 +00:00
SmallPositiveInt ::= INTEGER (0..127)
2005-01-14 11:38:49 +00:00
\layout LyX-Code
2005-02-21 14:16:10 +00:00
2005-01-14 11:38:49 +00:00
\layout LyX-Code
2005-02-21 14:16:10 +00:00
-- Integer, negative
2005-01-14 11:38:49 +00:00
\layout LyX-Code
2005-02-21 14:16:10 +00:00
NegativeInt ::= INTEGER (MIN..0)
\layout Subsection
2005-01-14 11:38:49 +00:00
2005-02-21 14:16:10 +00:00
The ENUMERATED type
\layout Standard
2005-01-14 11:38:49 +00:00
2005-02-21 14:16:10 +00:00
The ENUMERATED type is semantically equivalent to the INTEGER type with
some integer values explicitly named.
2005-01-31 10:10:04 +00:00
\layout LyX-Code
2005-02-21 14:16:10 +00:00
FruitId ::= ENUMERATED { apple(1), orange(2) }
2005-01-31 10:10:04 +00:00
\layout LyX-Code
2005-02-21 14:16:10 +00:00
2005-01-31 10:10:04 +00:00
\layout LyX-Code
2005-02-21 14:16:10 +00:00
-- The numbers in braces are optional,
2005-01-31 10:10:04 +00:00
\layout LyX-Code
2005-02-21 14:16:10 +00:00
-- the enumeration can be performed
2005-01-31 10:10:04 +00:00
\layout LyX-Code
2005-02-21 14:16:10 +00:00
-- automatically by the compiler
2005-01-31 10:10:04 +00:00
\layout LyX-Code
2005-02-21 14:16:10 +00:00
ComputerOSType ::= ENUMERATED {
\layout LyX-Code
2005-01-31 10:10:04 +00:00
2005-02-21 14:16:10 +00:00
FreeBSD, -- acquires value 0
2005-01-14 11:38:49 +00:00
\layout LyX-Code
2005-02-21 14:16:10 +00:00
Windows, -- acquires value 1
\layout LyX-Code
2005-01-14 11:38:49 +00:00
2005-02-21 14:16:10 +00:00
Solaris(5), -- remains 5
\layout LyX-Code
2005-01-31 10:10:04 +00:00
2005-02-21 14:16:10 +00:00
Linux, -- becomes 6
\layout LyX-Code
2005-01-31 10:10:04 +00:00
2005-02-21 14:16:10 +00:00
MacOS -- becomes 7
2005-01-14 11:38:49 +00:00
\layout LyX-Code
2005-02-21 14:16:10 +00:00
}
\layout Subsection
2005-01-14 11:38:49 +00:00
2005-02-21 14:16:10 +00:00
The OCTET STRING type
\layout Standard
2005-01-31 10:10:04 +00:00
2005-02-21 14:16:10 +00:00
This type models the sequence of 8-bit bytes.
This may be used to transmit some opaque data or data serialized by other
types of encoders (i.e.
video file, photo picture, etc).
\layout Subsection
2005-01-31 10:10:04 +00:00
2005-02-21 14:16:10 +00:00
The OBJECT IDENTIFIER type
\layout Standard
2005-01-31 10:10:04 +00:00
2005-02-21 14:16:10 +00:00
The OBJECT IDENTIFIER is used to represent the unique identifier of any
object, starting from the very root of the registration tree.
If your organization needs to uniquely identify something (a router, a
room, a person, a standard, or whatever), you are encouraged to get your
own identification subtree at
\begin_inset LatexCommand \htmlurl{http://www.iana.org/protocols/forms.htm}
2005-01-31 10:10:04 +00:00
\end_inset
2005-02-21 14:16:10 +00:00
.
\layout Standard
2005-01-31 10:10:04 +00:00
2005-02-21 14:16:10 +00:00
For example, the very first ASN.1 module in this Chapter (RectangleModule1)
has the following OBJECT IDENTIFIER: 1 3 6 1 4 1 9363 1 5 2 1 1.
2005-01-31 10:10:04 +00:00
\layout LyX-Code
2005-02-21 14:16:10 +00:00
ExampleOID ::= OBJECT IDENTIFIER
2005-01-31 10:10:04 +00:00
\layout LyX-Code
2005-02-21 14:16:10 +00:00
2005-01-14 11:38:49 +00:00
\layout LyX-Code
2005-02-21 14:16:10 +00:00
rectangleModule1-oid ExampleOID
2005-01-14 11:38:49 +00:00
\layout LyX-Code
2005-02-21 14:16:10 +00:00
::= { 1 3 6 1 4 1 9363 1 5 2 1 1 }
\layout LyX-Code
2005-01-14 11:38:49 +00:00
\layout LyX-Code
2005-02-21 14:16:10 +00:00
-- An identifier of the Internet.
2005-01-14 11:38:49 +00:00
\layout LyX-Code
2005-02-21 14:16:10 +00:00
internet-id OBJECT IDENTIFIER
\layout LyX-Code
2005-01-14 11:38:49 +00:00
2005-02-21 14:16:10 +00:00
::= { iso(1) identified-organization(3)
2005-01-14 11:38:49 +00:00
\layout LyX-Code
2005-02-21 14:16:10 +00:00
dod(6) internet(1) }
\layout Standard
2005-01-14 11:38:49 +00:00
2005-02-21 14:16:10 +00:00
As you see, names are optional.
\layout Subsection
2005-01-14 11:38:49 +00:00
2005-02-21 14:16:10 +00:00
The RELATIVE-OID type
\layout Standard
2005-01-14 11:38:49 +00:00
2005-02-21 14:16:10 +00:00
The RELATIVE-OID type has the semantics of a subtree of an OBJECT IDENTIFIER.
There may be no need to repeat the whole sequence of numbers from the root
of the registration tree where the only thing of interest is some of the
tree's subsequence.
2005-01-14 11:38:49 +00:00
\layout LyX-Code
2005-02-21 14:16:10 +00:00
this-document RELATIVE-OID ::= { docs(2) usage(1) }
\layout LyX-Code
2005-01-14 11:38:49 +00:00
2005-02-21 14:16:10 +00:00
\layout LyX-Code
2005-01-14 11:38:49 +00:00
2005-02-21 14:16:10 +00:00
this-example RELATIVE-OID ::= {
2005-01-14 11:38:49 +00:00
\layout LyX-Code
2005-02-21 14:16:10 +00:00
this-document assorted-examples(0) this-example(1) }
\layout Section
2005-01-14 11:38:49 +00:00
2005-02-21 14:16:10 +00:00
Some of the ASN.1 String Types
\layout Subsection
2005-01-14 11:38:49 +00:00
2005-02-21 14:16:10 +00:00
The IA5String type
2005-01-31 10:10:04 +00:00
\layout Standard
2005-02-21 14:16:10 +00:00
This is essentially the ASCII, with 128 character codes available (7 lower
bits of an 8-bit byte).
\layout Subsection
2005-01-31 10:10:04 +00:00
2005-02-21 14:16:10 +00:00
The UTF8String type
2005-01-31 10:10:04 +00:00
\layout Standard
2005-02-21 14:16:10 +00:00
This is the character string which encodes the full Unicode range (4 bytes)
using multibyte character sequences.
\layout Subsection
2005-02-02 09:53:46 +00:00
2005-02-21 14:16:10 +00:00
The NumericString type
\layout Standard
2005-02-02 09:53:46 +00:00
2005-02-21 14:16:10 +00:00
This type represents the character string with the alphabet consisting of
numbers (
2005-01-31 10:10:04 +00:00
\begin_inset Quotes sld
\end_inset
2005-02-21 14:16:10 +00:00
0
2005-01-31 10:10:04 +00:00
\begin_inset Quotes srd
\end_inset
2005-02-21 14:16:10 +00:00
to
2005-01-31 10:10:04 +00:00
\begin_inset Quotes sld
\end_inset
2005-02-21 14:16:10 +00:00
9
2005-01-31 10:10:04 +00:00
\begin_inset Quotes srd
\end_inset
2005-02-21 14:16:10 +00:00
) and a space.
\layout Subsection
2005-01-31 10:10:04 +00:00
2005-02-21 14:16:10 +00:00
The PrintableString type
\layout Standard
2005-01-31 10:10:04 +00:00
2005-02-21 14:16:10 +00:00
The character string with the following alphabet: space,
\begin_inset Quotes sld
\end_inset
2005-01-31 10:10:04 +00:00
2005-02-21 14:16:10 +00:00
\series bold
'
\series default
\begin_inset Quotes srd
2005-01-31 10:10:04 +00:00
\end_inset
2005-02-21 14:16:10 +00:00
(single quote),
\begin_inset Quotes sld
\end_inset
2005-01-31 10:10:04 +00:00
\series bold
2005-02-21 14:16:10 +00:00
(
\series default
2005-01-31 10:10:04 +00:00
2005-02-21 14:16:10 +00:00
\begin_inset Quotes sld
\end_inset
2005-01-31 10:10:04 +00:00
2005-02-21 14:16:10 +00:00
,
\begin_inset Quotes sld
2005-01-31 10:10:04 +00:00
\end_inset
\series bold
2005-02-21 14:16:10 +00:00
)
2005-01-31 10:10:04 +00:00
\series default
2005-02-21 14:16:10 +00:00
\begin_inset Quotes srd
\end_inset
,
\begin_inset Quotes sld
\end_inset
2005-01-31 10:10:04 +00:00
\series bold
2005-02-21 14:16:10 +00:00
+
2005-01-31 10:10:04 +00:00
\series default
2005-02-21 14:16:10 +00:00
\begin_inset Quotes srd
\end_inset
,
\begin_inset Quotes sld
\end_inset
2005-01-31 10:10:04 +00:00
\series bold
2005-02-21 14:16:10 +00:00
,
2005-01-31 10:10:04 +00:00
\series default
2005-02-21 14:16:10 +00:00
\begin_inset Quotes srd
\end_inset
2005-01-31 10:10:04 +00:00
2005-02-21 14:16:10 +00:00
(comma),
\begin_inset Quotes sld
2005-01-31 10:10:04 +00:00
\end_inset
2005-02-21 14:16:10 +00:00
\series bold
-
\series default
2005-01-31 10:10:04 +00:00
2005-02-21 14:16:10 +00:00
\begin_inset Quotes srd
\end_inset
2005-01-31 10:10:04 +00:00
2005-02-21 14:16:10 +00:00
,
\begin_inset Quotes sld
\end_inset
2005-01-31 10:10:04 +00:00
2005-02-21 14:16:10 +00:00
\series bold
.
\series default
2005-01-31 10:10:04 +00:00
2005-02-21 14:16:10 +00:00
\begin_inset Quotes srd
\end_inset
2005-01-31 10:10:04 +00:00
2005-02-21 14:16:10 +00:00
,
\begin_inset Quotes sld
\end_inset
2005-01-31 10:10:04 +00:00
2005-02-21 14:16:10 +00:00
\series bold
/
\series default
2005-01-31 10:10:04 +00:00
2005-02-21 14:16:10 +00:00
\begin_inset Quotes srd
\end_inset
2005-01-31 10:10:04 +00:00
2005-02-21 14:16:10 +00:00
, digits (
\begin_inset Quotes sld
\end_inset
2005-01-31 10:10:04 +00:00
2005-02-21 14:16:10 +00:00
0
\begin_inset Quotes srd
\end_inset
2005-01-31 10:10:04 +00:00
2005-02-21 14:16:10 +00:00
to
\begin_inset Quotes sld
\end_inset
2005-01-31 10:10:04 +00:00
2005-02-21 14:16:10 +00:00
9
\begin_inset Quotes srd
\end_inset
2005-01-31 10:10:04 +00:00
2005-02-21 14:16:10 +00:00
),
\begin_inset Quotes sld
\end_inset
2005-01-31 10:10:04 +00:00
2005-02-21 14:16:10 +00:00
\series bold
:
\series default
2005-01-31 10:10:04 +00:00
2005-02-21 14:16:10 +00:00
\begin_inset Quotes srd
\end_inset
2005-01-31 10:10:04 +00:00
2005-02-21 14:16:10 +00:00
,
\begin_inset Quotes sld
\end_inset
2005-01-31 10:10:04 +00:00
2005-02-21 14:16:10 +00:00
\series bold
=
\series default
2005-01-31 10:10:04 +00:00
2005-02-21 14:16:10 +00:00
\begin_inset Quotes srd
\end_inset
2005-01-31 10:10:04 +00:00
2005-02-21 14:16:10 +00:00
,
\begin_inset Quotes sld
\end_inset
2005-01-31 10:10:04 +00:00
2005-02-21 14:16:10 +00:00
\series bold
?
\series default
\begin_inset Quotes srd
\end_inset
2005-01-31 10:10:04 +00:00
2005-02-21 14:16:10 +00:00
, upper-case and lower-case letters (
\begin_inset Quotes sld
\end_inset
2005-01-31 10:10:04 +00:00
2005-02-21 14:16:10 +00:00
A
\begin_inset Quotes srd
\end_inset
2005-01-31 10:10:04 +00:00
2005-02-21 14:16:10 +00:00
to
\begin_inset Quotes sld
\end_inset
2005-01-31 10:10:04 +00:00
2005-02-21 14:16:10 +00:00
Z
\begin_inset Quotes srd
\end_inset
2005-01-31 10:10:04 +00:00
2005-02-21 14:16:10 +00:00
and
\begin_inset Quotes sld
\end_inset
2005-01-31 10:10:04 +00:00
2005-02-21 14:16:10 +00:00
a
\begin_inset Quotes srd
\end_inset
to
2005-01-31 10:10:04 +00:00
\begin_inset Quotes sld
\end_inset
2005-02-21 14:16:10 +00:00
z
2005-01-31 10:10:04 +00:00
\begin_inset Quotes srd
\end_inset
2005-02-21 14:16:10 +00:00
).
\layout Subsection
2005-01-31 10:10:04 +00:00
2005-02-21 14:16:10 +00:00
The VisibleString type
\layout Standard
2005-01-31 10:10:04 +00:00
2005-02-21 14:16:10 +00:00
The character string with the alphabet which is more or less a subset of
ASCII between the space and the
\begin_inset Quotes sld
\end_inset
2005-01-31 10:10:04 +00:00
2005-02-21 14:16:10 +00:00
\series bold
~
\series default
2005-01-31 10:10:04 +00:00
2005-02-21 14:16:10 +00:00
\begin_inset Quotes srd
\end_inset
2005-01-31 10:10:04 +00:00
2005-02-21 14:16:10 +00:00
symbol (tilde).
\layout Standard
2005-01-31 10:10:04 +00:00
2005-02-21 14:16:10 +00:00
Alternatively, the alphabet may be described as the PrintableString alphabet
presented earlier, plus the following characters:
\begin_inset Quotes sld
\end_inset
2005-01-31 10:10:04 +00:00
2005-02-21 14:16:10 +00:00
\series bold
!
\series default
\begin_inset Quotes srd
\end_inset
,
\begin_inset Quotes sld
\end_inset
2005-01-31 10:10:04 +00:00
2005-02-21 14:16:10 +00:00
\series bold
2005-01-31 10:10:04 +00:00
2005-02-21 14:16:10 +00:00
\begin_inset Quotes srd
\end_inset
2005-01-31 10:10:04 +00:00
2005-02-21 14:16:10 +00:00
\series default
2005-01-31 10:10:04 +00:00
\begin_inset Quotes srd
\end_inset
2005-02-21 14:16:10 +00:00
,
\begin_inset Quotes sld
\end_inset
2005-01-31 10:10:04 +00:00
2005-02-21 14:16:10 +00:00
\series bold
#
\series default
2005-01-31 10:10:04 +00:00
2005-02-21 14:16:10 +00:00
\begin_inset Quotes srd
\end_inset
2005-01-31 10:10:04 +00:00
2005-02-21 14:16:10 +00:00
,
\begin_inset Quotes sld
\end_inset
2005-01-31 10:10:04 +00:00
2005-02-21 14:16:10 +00:00
\series bold
$
\series default
2005-01-31 10:10:04 +00:00
2005-02-21 14:16:10 +00:00
\begin_inset Quotes srd
\end_inset
2005-01-31 10:10:04 +00:00
2005-02-21 14:16:10 +00:00
,
\begin_inset Quotes sld
\end_inset
2005-01-31 10:10:04 +00:00
2005-02-21 14:16:10 +00:00
\series bold
%
\series default
2005-01-31 10:10:04 +00:00
2005-02-21 14:16:10 +00:00
\begin_inset Quotes srd
\end_inset
2005-01-31 10:10:04 +00:00
2005-02-21 14:16:10 +00:00
,
\begin_inset Quotes sld
\end_inset
2005-01-31 10:10:04 +00:00
2005-02-21 14:16:10 +00:00
\series bold
&
\series default
2005-01-31 10:10:04 +00:00
2005-02-21 14:16:10 +00:00
\begin_inset Quotes srd
\end_inset
2005-01-31 10:10:04 +00:00
2005-02-21 14:16:10 +00:00
,
\begin_inset Quotes sld
\end_inset
2005-01-31 10:10:04 +00:00
2005-02-21 14:16:10 +00:00
\series bold
*
\series default
2005-01-31 10:10:04 +00:00
2005-02-21 14:16:10 +00:00
\begin_inset Quotes srd
\end_inset
2005-01-31 10:10:04 +00:00
2005-02-21 14:16:10 +00:00
,
2005-01-31 10:10:04 +00:00
\begin_inset Quotes sld
\end_inset
2005-02-21 14:16:10 +00:00
\series bold
;
\series default
2005-01-31 10:10:04 +00:00
\begin_inset Quotes srd
\end_inset
2005-02-21 14:16:10 +00:00
,
\begin_inset Quotes sld
\end_inset
2005-01-31 10:10:04 +00:00
2005-02-21 14:16:10 +00:00
\series bold
<
\series default
2005-01-31 10:10:04 +00:00
2005-02-21 14:16:10 +00:00
\begin_inset Quotes srd
\end_inset
2005-01-31 10:10:04 +00:00
2005-02-21 14:16:10 +00:00
,
\begin_inset Quotes sld
\end_inset
2005-01-31 10:10:04 +00:00
2005-02-21 14:16:10 +00:00
\series bold
>
\series default
2005-01-31 10:10:04 +00:00
2005-02-21 14:16:10 +00:00
\begin_inset Quotes srd
\end_inset
2005-01-31 10:10:04 +00:00
2005-02-21 14:16:10 +00:00
,
\begin_inset Quotes sld
\end_inset
2005-01-31 10:10:04 +00:00
2005-02-21 14:16:10 +00:00
\series bold
[
\series default
2005-01-31 10:10:04 +00:00
2005-02-21 14:16:10 +00:00
\begin_inset Quotes srd
\end_inset
2005-01-31 10:10:04 +00:00
2005-02-21 14:16:10 +00:00
,
\begin_inset Quotes sld
\end_inset
2005-01-31 10:10:04 +00:00
2005-02-21 14:16:10 +00:00
\series bold
2005-01-31 10:10:04 +00:00
2005-02-21 14:16:10 +00:00
\backslash
2005-01-31 10:10:04 +00:00
2005-02-21 14:16:10 +00:00
\series default
2005-01-31 10:10:04 +00:00
2005-02-21 14:16:10 +00:00
\begin_inset Quotes srd
\end_inset
2005-01-31 10:10:04 +00:00
2005-02-21 14:16:10 +00:00
,
2005-01-31 10:10:04 +00:00
\begin_inset Quotes sld
\end_inset
2005-02-21 14:16:10 +00:00
\series bold
]
\series default
2005-01-31 10:10:04 +00:00
\begin_inset Quotes srd
\end_inset
2005-02-21 14:16:10 +00:00
,
\begin_inset Quotes sld
\end_inset
2005-01-31 10:10:04 +00:00
2005-02-21 14:16:10 +00:00
\series bold
^
\series default
2005-01-31 10:10:04 +00:00
2005-02-21 14:16:10 +00:00
\begin_inset Quotes srd
\end_inset
2005-01-31 10:10:04 +00:00
2005-02-21 14:16:10 +00:00
,
\begin_inset Quotes sld
\end_inset
2005-01-31 10:10:04 +00:00
2005-02-21 14:16:10 +00:00
\series bold
_
\series default
2005-01-31 10:10:04 +00:00
2005-02-21 14:16:10 +00:00
\begin_inset Quotes srd
\end_inset
2005-01-31 10:10:04 +00:00
2005-02-21 14:16:10 +00:00
,
\begin_inset Quotes sld
\end_inset
2005-01-31 10:10:04 +00:00
2005-02-21 14:16:10 +00:00
\series bold
`
\series default
2005-01-31 10:10:04 +00:00
2005-02-21 14:16:10 +00:00
\begin_inset Quotes srd
\end_inset
2005-01-31 10:10:04 +00:00
2005-02-21 14:16:10 +00:00
(single left quote),
\begin_inset Quotes sld
\end_inset
2005-01-31 10:10:04 +00:00
2005-02-21 14:16:10 +00:00
\series bold
{
\series default
2005-01-31 10:10:04 +00:00
2005-02-21 14:16:10 +00:00
\begin_inset Quotes srd
\end_inset
2005-01-31 10:10:04 +00:00
2005-02-21 14:16:10 +00:00
,
\begin_inset Quotes sld
\end_inset
2005-01-31 10:10:04 +00:00
2005-02-21 14:16:10 +00:00
\series bold
|
\series default
2005-01-31 10:10:04 +00:00
2005-02-21 14:16:10 +00:00
\begin_inset Quotes srd
\end_inset
,
\begin_inset Quotes sld
\end_inset
2005-01-31 10:10:04 +00:00
\series bold
2005-02-21 14:16:10 +00:00
}
2005-01-31 10:10:04 +00:00
\series default
2005-02-21 14:16:10 +00:00
\begin_inset Quotes srd
\end_inset
,
\begin_inset Quotes sld
\end_inset
2005-01-14 11:38:49 +00:00
\series bold
2005-02-21 14:16:10 +00:00
~
2005-01-14 11:38:49 +00:00
\series default
2005-02-02 09:53:46 +00:00
2005-02-21 14:16:10 +00:00
\begin_inset Quotes srd
\end_inset
2005-02-02 09:53:46 +00:00
2005-02-21 14:16:10 +00:00
.
2005-02-02 09:53:46 +00:00
\layout Section
2005-02-21 14:16:10 +00:00
ASN.1 Constructed Types
\layout Subsection
The SEQUENCE type
\layout Standard
This is an ordered collection of other simple or constructed types.
The SEQUENCE constructed type resembles the C
2005-02-02 09:53:46 +00:00
\begin_inset Quotes sld
\end_inset
2005-02-21 14:16:10 +00:00
struct
2005-02-02 09:53:46 +00:00
\begin_inset Quotes srd
\end_inset
2005-02-21 14:16:10 +00:00
statement.
2005-02-02 09:53:46 +00:00
\layout LyX-Code
2005-02-21 14:16:10 +00:00
Address ::= SEQUENCE {
2005-02-02 09:53:46 +00:00
\layout LyX-Code
2005-02-21 14:16:10 +00:00
-- The apartment number may be omitted
2005-02-02 09:53:46 +00:00
\layout LyX-Code
2005-02-21 14:16:10 +00:00
apartmentNumber NumericString OPTIONAL,
2005-02-02 09:53:46 +00:00
\layout LyX-Code
2005-02-21 14:16:10 +00:00
streetName PrintableString,
2005-02-02 09:53:46 +00:00
\layout LyX-Code
2005-02-21 14:16:10 +00:00
cityName PrintableString,
2005-02-02 09:53:46 +00:00
\layout LyX-Code
2005-02-21 14:16:10 +00:00
stateName PrintableString,
2005-02-02 09:53:46 +00:00
\layout LyX-Code
2005-02-21 14:16:10 +00:00
-- This one may be omitted too
2005-02-02 09:53:46 +00:00
\layout LyX-Code
2005-02-21 14:16:10 +00:00
zipNo NumericString OPTIONAL
2005-02-02 09:53:46 +00:00
\layout LyX-Code
2005-02-21 14:16:10 +00:00
}
\layout Subsection
2005-02-02 09:53:46 +00:00
2005-02-21 14:16:10 +00:00
The SET type
2005-02-02 09:53:46 +00:00
\layout Standard
2005-02-21 14:16:10 +00:00
This is a collection of other simple or constructed types.
Ordering is not important.
The data may arrive in the order which is different from the order of specifica
tion.
Data is encoded in the order not necessarily corresponding to the order
of specification.
\layout Subsection
The CHOICE type
2005-02-02 09:53:46 +00:00
\layout Standard
2005-02-21 14:16:10 +00:00
This type is just a choice between the subtypes specified in it.
The CHOICE type contains at most one of the subtypes specified, and it
is always implicitly known which choice is being decoded or encoded.
This one resembles the C
\begin_inset Quotes sld
2005-02-02 09:53:46 +00:00
\end_inset
2005-02-21 14:16:10 +00:00
union
\begin_inset Quotes srd
\end_inset
2005-02-02 09:53:46 +00:00
2005-02-21 14:16:10 +00:00
statement.
2005-02-02 09:53:46 +00:00
\layout Standard
2005-02-21 14:16:10 +00:00
The following type defines a response code, which may be either an integer
code or a boolean
\begin_inset Quotes sld
2005-02-02 09:53:46 +00:00
\end_inset
2005-02-21 14:16:10 +00:00
true
\begin_inset Quotes srd
\end_inset
2005-02-02 09:53:46 +00:00
2005-02-21 14:16:10 +00:00
/
\begin_inset Quotes srd
\end_inset
2005-02-02 09:53:46 +00:00
2005-02-21 14:16:10 +00:00
false
\begin_inset Quotes srd
\end_inset
2005-02-02 09:53:46 +00:00
2005-02-21 14:16:10 +00:00
code.
2005-02-02 09:53:46 +00:00
\layout LyX-Code
2005-02-21 14:16:10 +00:00
ResponseCode ::= CHOICE {
\layout LyX-Code
2005-02-02 09:53:46 +00:00
2005-02-21 14:16:10 +00:00
intCode INTEGER,
2005-02-02 09:53:46 +00:00
\layout LyX-Code
2005-02-21 14:16:10 +00:00
boolCode BOOLEAN
\layout LyX-Code
2005-02-02 09:53:46 +00:00
2005-02-21 14:16:10 +00:00
}
2005-02-02 09:53:46 +00:00
\layout LyX-Code
2005-02-21 14:16:10 +00:00
\layout Subsection
2005-02-02 09:53:46 +00:00
2005-02-21 14:16:10 +00:00
The SEQUENCE OF type
\layout Standard
2005-02-02 09:53:46 +00:00
2005-02-21 14:16:10 +00:00
This one is the list (array) of simple or constructed types:
\layout LyX-Code
2005-02-02 09:53:46 +00:00
2005-02-21 14:16:10 +00:00
-- Example 1
2005-02-02 09:53:46 +00:00
\layout LyX-Code
2005-02-21 14:16:10 +00:00
ManyIntegers ::= SEQUENCE OF INTEGER
\layout LyX-Code
2005-02-02 09:53:46 +00:00
\layout LyX-Code
2005-02-21 14:16:10 +00:00
-- Example 2
2005-02-02 09:53:46 +00:00
\layout LyX-Code
2005-02-21 14:16:10 +00:00
ManyRectangles ::= SEQUENCE OF Rectangle
2005-02-02 09:53:46 +00:00
\layout LyX-Code
2005-02-21 14:16:10 +00:00
2005-02-02 09:53:46 +00:00
\layout LyX-Code
2005-02-21 14:16:10 +00:00
-- More complex example:
2005-02-02 09:53:46 +00:00
\layout LyX-Code
2005-02-21 14:16:10 +00:00
-- an array of structures defined in place.
2005-02-02 09:53:46 +00:00
\layout LyX-Code
2005-02-21 14:16:10 +00:00
ManyCircles ::= SEQUENCE OF SEQUENCE {
2005-02-02 09:53:46 +00:00
\layout LyX-Code
2005-02-21 14:16:10 +00:00
radius INTEGER
2005-02-02 09:53:46 +00:00
\layout LyX-Code
2005-02-21 14:16:10 +00:00
}
\layout Subsection
2005-02-02 09:53:46 +00:00
2005-02-21 14:16:10 +00:00
The SET OF type
\layout Standard
2005-02-02 09:53:46 +00:00
2005-02-21 14:16:10 +00:00
The SET OF type models the bag of structures.
It resembles the SEQUENCE OF type, but the order is not important: i.e.
the elements may arrive in the order which is not necessarily the same
as the in-memory order on the remote machines.
\layout LyX-Code
2005-02-02 09:53:46 +00:00
2005-02-21 14:16:10 +00:00
-- A set of structures defined elsewhere
2005-02-02 09:53:46 +00:00
\layout LyX-Code
2005-02-21 14:16:10 +00:00
SetOfApples :: SET OF Apple
\layout LyX-Code
2005-02-02 09:53:46 +00:00
\layout LyX-Code
2005-02-21 14:16:10 +00:00
-- Set of integers encoding the kind of a fruit
\layout LyX-Code
2005-02-02 09:53:46 +00:00
2005-02-21 14:16:10 +00:00
FruitBag ::= SET OF ENUMERATED { apple, orange }
2004-08-23 15:12:04 +00:00
\layout Bibliography
\bibitem [ASN1C]{ASN1C}
2005-02-02 09:53:46 +00:00
The Open Source ASN.1 Compiler.
2004-08-23 15:12:04 +00:00
2005-02-02 09:53:46 +00:00
\begin_inset LatexCommand \htmlurl{http://lionet.info/asn1c}
2004-08-23 15:12:04 +00:00
\end_inset
2005-01-14 11:38:49 +00:00
\layout Bibliography
\bibitem [AONL]{AONL}
Online ASN.1 Compiler.
\begin_inset LatexCommand \htmlurl{http://lionet.info/asn1c/asn1c.cgi}
\end_inset
2004-06-03 03:49:45 +00:00
\layout Bibliography
\bibitem [Dub00]{Dub00}
2004-10-20 15:48:55 +00:00
Olivier Dubuisson ---
2004-06-03 03:49:45 +00:00
\emph on
ASN.1 Communication between heterogeneous systems
\emph default
2004-10-20 15:48:55 +00:00
--- Morgan Kaufmann Publishers, 2000.
2004-06-03 03:49:45 +00:00
\begin_inset LatexCommand \htmlurl{http://asn1.elibel.tm.fr/en/book/}
\end_inset
.
ISBN:0-12-6333361-0.
\layout Bibliography
\bibitem [ITU-T/ASN.1]{ITU-T/ASN.1}
ITU-T Study Group 17 -- Languages for Telecommunication Systems
\begin_inset LatexCommand \url{http://www.itu.int/ITU-T/studygroups/com17/languages/}
\end_inset
\the_end