PolarSSL v1.1.4
Data Structures | Defines
asn1.h File Reference

Generic ASN.1 parsing. More...

#include "config.h"
#include "bignum.h"
#include <string.h>
Include dependency graph for asn1.h:
This graph shows which files directly or indirectly include this file:

Go to the source code of this file.

Data Structures

struct  _asn1_buf
 Type-length-value structure that allows for ASN1 using DER. More...
struct  _asn1_bitstring
 Container for ASN1 bit strings. More...
struct  _asn1_sequence
 Container for a sequence of ASN.1 items. More...

Defines

#define OID_SIZE(x)   (sizeof(x) - 1)
 Returns the size of the binary string, without the trailing \0.
ASN1 Error codes

These error codes are OR'ed to X509 error codes for higher error granularity.

ASN1 is a standard to specify data structures.

#define POLARSSL_ERR_ASN1_OUT_OF_DATA   -0x0014
 Out of data when parsing an ASN1 data structure.
#define POLARSSL_ERR_ASN1_UNEXPECTED_TAG   -0x0016
 ASN1 tag was of an unexpected value.
#define POLARSSL_ERR_ASN1_INVALID_LENGTH   -0x0018
 Error when trying to determine the length or invalid length.
#define POLARSSL_ERR_ASN1_LENGTH_MISMATCH   -0x001A
 Actual length differs from expected length.
#define POLARSSL_ERR_ASN1_INVALID_DATA   -0x001C
 Data is invalid.
#define POLARSSL_ERR_ASN1_MALLOC_FAILED   -0x001E
 Memory allocation failed.
DER constants

These constants comply with DER encoded the ANS1 type tags.

DER encoding uses hexadecimal representation. An example DER sequence is:

  • 0x02 -- tag indicating INTEGER
  • 0x01 -- length in octets
  • 0x05 -- value Such sequences are typically read into x509_buf.
#define ASN1_BOOLEAN   0x01
#define ASN1_INTEGER   0x02
#define ASN1_BIT_STRING   0x03
#define ASN1_OCTET_STRING   0x04
#define ASN1_NULL   0x05
#define ASN1_OID   0x06
#define ASN1_UTF8_STRING   0x0C
#define ASN1_SEQUENCE   0x10
#define ASN1_SET   0x11
#define ASN1_PRINTABLE_STRING   0x13
#define ASN1_T61_STRING   0x14
#define ASN1_IA5_STRING   0x16
#define ASN1_UTC_TIME   0x17
#define ASN1_GENERALIZED_TIME   0x18
#define ASN1_UNIVERSAL_STRING   0x1C
#define ASN1_BMP_STRING   0x1E
#define ASN1_PRIMITIVE   0x00
#define ASN1_CONSTRUCTED   0x20
#define ASN1_CONTEXT_SPECIFIC   0x80

Functions to parse ASN.1 data structures

typedef struct _asn1_buf asn1_buf
 Type-length-value structure that allows for ASN1 using DER.
typedef struct _asn1_bitstring asn1_bitstring
 Container for ASN1 bit strings.
typedef struct _asn1_sequence asn1_sequence
 Container for a sequence of ASN.1 items.
int asn1_get_len (unsigned char **p, const unsigned char *end, size_t *len)
 Get the length of an ASN.1 element.
int asn1_get_tag (unsigned char **p, const unsigned char *end, size_t *len, int tag)
 Get the tag and length of the tag.
int asn1_get_bool (unsigned char **p, const unsigned char *end, int *val)
 Retrieve a boolean ASN.1 tag and its value.
int asn1_get_int (unsigned char **p, const unsigned char *end, int *val)
 Retrieve an integer ASN.1 tag and its value.
int asn1_get_bitstring (unsigned char **p, const unsigned char *end, asn1_bitstring *bs)
 Retrieve a bitstring ASN.1 tag and its value.
int asn1_get_sequence_of (unsigned char **p, const unsigned char *end, asn1_sequence *cur, int tag)
 Parses and splits an ASN.1 "SEQUENCE OF <tag>" Updated the pointer to immediately behind the full sequence tag.
int asn1_get_mpi (unsigned char **p, const unsigned char *end, mpi *X)
 Retrieve a MPI value from an integer ASN.1 tag.

Detailed Description

Generic ASN.1 parsing.

Copyright (C) 2006-2011, Brainspark B.V.

This file is part of PolarSSL (http://www.polarssl.org) Lead Maintainer: Paul Bakker <polarssl_maintainer at polarssl.org>

All rights reserved.

This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation; either version 2 of the License, or (at your option) any later version.

This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details.

You should have received a copy of the GNU General Public License along with this program; if not, write to the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.

Definition in file asn1.h.


Define Documentation

#define OID_SIZE (   x)    (sizeof(x) - 1)

Returns the size of the binary string, without the trailing \0.

Definition at line 92 of file asn1.h.


Typedef Documentation

Container for ASN1 bit strings.

typedef struct _asn1_buf asn1_buf

Type-length-value structure that allows for ASN1 using DER.

typedef struct _asn1_sequence asn1_sequence

Container for a sequence of ASN.1 items.


Function Documentation

int asn1_get_bitstring ( unsigned char **  p,
const unsigned char *  end,
asn1_bitstring bs 
)

Retrieve a bitstring ASN.1 tag and its value.

Updates the pointer to immediately behind the full tag.

Parameters:
pThe position in the ASN.1 data
endEnd of data
bsThe variable that will receive the value
Returns:
0 if successful or a specific ASN.1 error code.
int asn1_get_bool ( unsigned char **  p,
const unsigned char *  end,
int *  val 
)

Retrieve a boolean ASN.1 tag and its value.

Updates the pointer to immediately behind the full tag.

Parameters:
pThe position in the ASN.1 data
endEnd of data
valThe variable that will receive the value
Returns:
0 if successful or a specific ASN.1 error code.
int asn1_get_int ( unsigned char **  p,
const unsigned char *  end,
int *  val 
)

Retrieve an integer ASN.1 tag and its value.

Updates the pointer to immediately behind the full tag.

Parameters:
pThe position in the ASN.1 data
endEnd of data
valThe variable that will receive the value
Returns:
0 if successful or a specific ASN.1 error code.
int asn1_get_len ( unsigned char **  p,
const unsigned char *  end,
size_t *  len 
)

Get the length of an ASN.1 element.

Updates the pointer to immediately behind the length.

Parameters:
pThe position in the ASN.1 data
endEnd of data
lenThe variable that will receive the value
Returns:
0 if successful, POLARSSL_ERR_ASN1_OUT_OF_DATA on reaching end of data, POLARSSL_ERR_ASN1_INVALID_LENGTH if length is unparseable.
int asn1_get_mpi ( unsigned char **  p,
const unsigned char *  end,
mpi X 
)

Retrieve a MPI value from an integer ASN.1 tag.

Updates the pointer to immediately behind the full tag.

Parameters:
pThe position in the ASN.1 data
endEnd of data
XThe MPI that will receive the value
Returns:
0 if successful or a specific ASN.1 or MPI error code.
int asn1_get_sequence_of ( unsigned char **  p,
const unsigned char *  end,
asn1_sequence cur,
int  tag 
)

Parses and splits an ASN.1 "SEQUENCE OF <tag>" Updated the pointer to immediately behind the full sequence tag.

Parameters:
pThe position in the ASN.1 data
endEnd of data
curFirst variable in the chain to fill
tagType of sequence
Returns:
0 if successful or a specific ASN.1 error code.
int asn1_get_tag ( unsigned char **  p,
const unsigned char *  end,
size_t *  len,
int  tag 
)

Get the tag and length of the tag.

Check for the requested tag. Updates the pointer to immediately behind the tag and length.

Parameters:
pThe position in the ASN.1 data
endEnd of data
lenThe variable that will receive the length
tagThe expected tag
Returns:
0 if successful, POLARSSL_ERR_ASN1_UNEXPECTED_TAG if tag did not match requested tag, or another specific ASN.1 error code.