\input texinfo   @c -*-texinfo-*-
@comment %**start of header
@setfilename libtasn1.info
@include version.texi
@settitle GNU Libtasn1 @value{VERSION}

@c Unify some of the indices.
@syncodeindex tp fn
@syncodeindex pg fn

@comment %**end of header
@copying
This manual is for GNU Libtasn1
(version @value{VERSION}, @value{UPDATED}),
which is a library for Abstract Syntax Notation One (ASN.1) and
Distinguished Encoding Rules (DER) manipulation.

Copyright @copyright{} 2001-2020 Free Software Foundation, Inc.

@quotation
Permission is granted to copy, distribute and/or modify this document
under the terms of the GNU Free Documentation License, Version 1.3 or
any later version published by the Free Software Foundation; with no
Invariant Sections, no Front-Cover Texts, and no Back-Cover Texts.  A
copy of the license is included in the section entitled ``GNU Free
Documentation License''.
@end quotation
@end copying

@dircategory Software libraries
@direntry
* libtasn1: (libtasn1). Library for Abstract Syntax Notation One (ASN.1).
@end direntry

@titlepage
@title Libtasn1
@subtitle Abstract Syntax Notation One (ASN.1) library for the GNU system
@subtitle for version @value{VERSION}, @value{UPDATED}
@author Fabio Fiorina
@author Simon Josefsson
@author Nikos Mavrogiannopoulos (@email{help-libtasn1@@gnu.org})
@page
@vskip 0pt plus 1filll
@insertcopying
@end titlepage

@contents

@ifnottex
@node Top
@top Libtasn1

@insertcopying
@end ifnottex

@menu
* Introduction::
* ASN.1 structure handling::
* Utilities::
* Function reference::
* Copying Information::

Indices

* Concept Index::               Index of concepts and programs.
* Function and Data Index::     Index of functions, variables and data types.
@end menu

@node Introduction
@chapter Introduction

This document describes the Libtasn1 library that provides
Abstract Syntax Notation One (ASN.1, as specified by the X.680 ITU-T
recommendation) parsing and structures management,
and Distinguished Encoding Rules (DER, as per X.690) encoding and
decoding functions.

The main features of this library are:

@itemize @bullet

@item On-line ASN.1 structure management that doesn't require any
C code file generation.

@item Off-line ASN.1 structure management with C code file generation
containing an array.

@item Distinguished Encoding Rules (DER) encoding support.

@item No limits for INTEGER and ENUMERATED values.

@item It's Free Software.
Anybody can use, modify, and redistribute the library under the terms
of the GNU Lesser General Public License version 2.1 or later.  The
command line tools, self-tests and build infrastructure are licensed
under the GNU General Public License version 3.0 or later.

@item Thread-safety.
@cindex threads
No global variables are used and multiple library handles and session
handles may be used in parallel.

@item Portability.
@cindex Porting
The code should work on all Unix like operating systems, and Windows.
The library itself should be portable to any C89 system, not even
POSIX is required.
@end itemize

@node ASN.1 structure handling
@chapter ASN.1 structure handling

@menu
* ASN.1 syntax::
* Naming::
* Simple parsing::
* Library Notes::
* Future developments::
@end menu

@node ASN.1 syntax
@section ASN.1 syntax

@cindex ASN.1 schema

The parser is case sensitive.  The comments begin with @code{--} and
end either with another @code{--}, or at the end of the respective
line, whichever comes first.  The C-style @code{/*}, @code{*/}
comments are not supported.

For an example of the syntax, check the @file{pkix.asn} file
distributed with the library.

ASN.1 definitions must follow the syntax below:

@verbatim
      definitions_name {<object definition>}

      DEFINITIONS <EXPLICIT or IMPLICIT> TAGS ::=

      BEGIN

      <type and constants definitions>

      END
@end verbatim

The @code{::=} token must be separate from other elements, so the
following declaration is invalid:

@example
   -- INCORRECT
   Version ::=INTEGER
@end example

The correct form is:

@example
   Version ::= INTEGER
@end example

Here is the list of types that the parser can manage:

@cindex Supported ASN.1 types, list of

@itemize @bullet

@item @code{INTEGER};
@item @code{ENUMERATED};
@item @code{BOOLEAN};
@item @code{OBJECT IDENTIFIER};
@item @code{NULL};
@item @code{BIT STRING};
@item @code{OCTET STRING};
@item @code{UTCTime};
@item @code{GeneralizedTime};
@item @code{GeneralString};
@item @code{NumericString};
@item @code{IA5String};
@item @code{TeletexString};
@item @code{PrintableString};
@item @code{UniversalString};
@item @code{BMPString};
@item @code{UTF8String};
@item @code{VisibleString};
@item @code{SEQUENCE};
@item @code{SEQUENCE OF};
@item @code{SET};
@item @code{SET OF};
@item @code{CHOICE};
@item @code{ANY};
@item @code{ANY DEFINED BY}.

@end itemize

This version doesn't handle the @code{REAL} type.  It doesn't support
the @code{AUTOMATIC TAGS} option, and the @code{EXPORT} and
@code{IMPORT} sections, either.

The @code{SIZE} constraints are allowed, but no check is done on them.

@node Naming
@section Naming

Consider this definition:

@verbatim
      Example { 1 2 3 4 }

      DEFINITIONS EXPLICIT TAGS ::=

      BEGIN

      Group ::= SEQUENCE {
         id   OBJECT IDENTIFIER,
         value  Value
      }

      Value ::= SEQUENCE {
         value1  INTEGER,
         value2  BOOLEAN
      }

      END
@end verbatim

The notation to access the @samp{Group} type of the @samp{Example}
definition above is @samp{Example.Group} (as a NUL-terminated string.)
Such strings are used in the functions described below.

Others examples:

@itemize @bullet

@item field @samp{id} of the @samp{Group} type: @samp{Example.Group.id};

@item field @samp{value1} of the @samp{value} field of the @samp{Group}
type: @samp{Example.Group.value.value1}.

@end itemize

Elements of structured types unnamed by the respective definition
receive the names @code{?1}, @code{?2}, and so on.

The @code{?LAST} name indicates the last element of a @code{SET OF} or
@code{SEQUENCE OF}.

@node Simple parsing
@section Simple parsing

For simple types like @code{OCTET STRING} the simple parsing functions listed
below may be used instead.

@itemize
@item @ref{asn1_decode_simple_der}
@item @ref{asn1_encode_simple_der}
@end itemize

@node Library Notes
@section Library Notes

@cindex Header file libtasn1.h

The header file of this library is @file{libtasn1.h}.

@cindex Main type asn1_node

The main type used in it is @code{asn1_node}, and it's used to store
the ASN.1 definitions and structures (instances).

The @code{NULL} constant can be used for the variable
initialization.  For example:

@example
 asn1_node definitions = NULL;
@end example

Some functions require an @code{errorDescription} argument of type
@code{char *}, pointing to a pre-allocated buffer of at least
@code{ASN1_MAX_ERROR_DESCRIPTION_SIZE} bytes size (e.g., as in
@samp{char description[ASN1_MAX_ERROR_DESCRIPTION_SIZE];}).

@code{ASN1_MAX_NAME_SIZE} is the maximum number of characters allowed
for an ASN.1 identifier.

@node Future developments
@section Future developments
@cindex Future developments

@itemize @bullet

@item Add functions for a C code file generation containing equivalent
data structures (not a single array like now).

@item The @code{REAL} type.

@end itemize

@node Utilities
@chapter Utilities

@menu
* Invoking asn1Parser::
* Invoking asn1Coding::
* Invoking asn1Decoding::
@end menu

@node Invoking asn1Parser
@section Invoking asn1Parser
@cindex asn1Parser program

@command{asn1Parser} reads a single file with ASN.1 definitions and
generates a
file with an array to use with libtasn1 functions.

@verbatim
Usage:  asn1Parser [options] file

Options:
 -h : shows the help message.
 -v : shows version information and exit.
 -c : checks the syntax only.
 -o file : output file.
 -n name : array name.
@end verbatim

@node Invoking asn1Coding
@section Invoking asn1Coding
@cindex asn1Coding program

@command{asn1Coding} generates a DER encoding from a file with ASN.1
definitions and another one with assignments.

The file with assignments must have this syntax:

@verbatim
InstanceName  Asn1Definition

nameString  value

nameString  value
...
@end verbatim

To specify the field of a @code{CHOICE} to be used, specify its name
as a value to the @code{CHOICE} element itself.  Use @code{''} to
denote the root element itself.
(as in the example below.)

The output file is a binary file with the DER encoding.

@verbatim
Usage:  asn1Coding [options] file1 file2
 file1 : file with ASN1 definitions.
 file2 : file with assignments.
Options:
 -h : shows the help message.
 -v : shows version information and exit.
 -c : checks the syntax only.
 -o file : output file.
@end verbatim

For example, consider an ASN.1 definitions file as follows:

@verbatim
MYPKIX1 { }

DEFINITIONS IMPLICIT TAGS ::=

BEGIN

OtherStruct := SEQUENCE {
     x       INTEGER,
     y       CHOICE {
         y1 INTEGER,
         y2 OCTET STRING },
}

Dss-Sig-Value ::= SEQUENCE {
     r       INTEGER,
     s       INTEGER,
     other   OtherStruct
     z       INTEGER OPTIONAL,
}

END
@end verbatim

And a assignments file as follows:

@verbatim
dp MYPKIX1.Dss-Sig-Value

r 42
s 47
other.x 66
other.y y1
other.y.y1 15
z (NULL)
@end verbatim

Running the command below will generate a @file{assign.out} file,
containing the DER encoding of @code{PKIX1.Dss-Sig-Value}.

@verbatim
$ asn1Coding pkix.asn assign.asn1
@end verbatim

If the root element is of the @code{CHOICE} type, the assignment file
may be like (using the types defined in @file{pkix.asn}):
@verbatim
elt PKIX1Implicit88.GeneralName

''      dNSName
dNSName example.org
@end verbatim

@node Invoking asn1Decoding
@section Invoking asn1Decoding
@cindex asn1Decoding program

@command{asn1Decoding} generates an ASN.1 structure from a file with
ASN.1
definitions and a binary file with a DER encoding.

@verbatim
Usage:  asn1Decoding [options] file1 file2 type
 file1 : file with ASN1 definitions.
 file2 : binary file with a DER encoding.
 type : ASN1 definition name.
Options:
 -h : shows the help message.
 -v : shows version information and exit.
 -o file : output file.
@end verbatim

For example, after generating the @file{assign.out} file from the
example section of the @command{asn1Coding} command above, the
following
invocation will decode the DER data.

@verbatim
$ asn1Decoding pkix.asn assign.out PKIX1.Dss-Sig-Value
@end verbatim

@node Function reference
@chapter Function reference

@menu
* ASN.1 schema functions::
* ASN.1 field functions::
* DER functions::
* Error handling functions::
* Auxilliary functions::
@end menu

@node ASN.1 schema functions
@section ASN.1 schema functions

@include texi/ASN1.c.texi

@node ASN.1 field functions
@section ASN.1 field functions

@include texi/structure.c.texi
@include texi/element.c.texi

@node DER functions
@section DER functions

@include texi/coding.c.texi
@include texi/decoding.c.texi

@node Error handling functions
@section Error handling functions

@include texi/errors.c.texi

@node Auxilliary functions
@section Auxilliary functions

@include texi/parser_aux.c.texi
@include texi/version.c.texi

@node Copying Information
@appendix Copying Information

@menu
* GNU Free Documentation License::   License for copying this manual.
@end menu

@node GNU Free Documentation License
@appendixsec GNU Free Documentation License

@cindex FDL, GNU Free Documentation License

@include fdl-1.3.texi

@node Concept Index
@unnumbered Concept Index

@printindex cp

@node Function and Data Index
@unnumbered Function and Data Index

@printindex fn

@bye
