2001-11-06 18:34:19 +00:00
|
|
|
/*
|
2002-04-05 10:44:51 +00:00
|
|
|
* asn1.h: ASN.1 header file
|
2001-11-06 18:34:19 +00:00
|
|
|
*
|
2006-12-19 21:31:17 +00:00
|
|
|
* Copyright (C) 2001, 2002 Juha Yrjölä <juha.yrjola@iki.fi>
|
2001-11-06 18:34:19 +00:00
|
|
|
*
|
|
|
|
* This library is free software; you can redistribute it and/or
|
|
|
|
* modify it under the terms of the GNU Lesser General Public
|
|
|
|
* License as published by the Free Software Foundation; either
|
|
|
|
* version 2.1 of the License, or (at your option) any later version.
|
|
|
|
*
|
|
|
|
* This library 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
|
|
|
|
* Lesser General Public License for more details.
|
|
|
|
*
|
|
|
|
* You should have received a copy of the GNU Lesser General Public
|
|
|
|
* License along with this library; if not, write to the Free Software
|
|
|
|
* Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
|
2001-11-01 15:43:20 +00:00
|
|
|
*/
|
|
|
|
|
2003-09-03 17:59:08 +00:00
|
|
|
#ifndef _OPENSC_ASN1_H
|
|
|
|
#define _OPENSC_ASN1_H
|
2001-11-01 15:43:20 +00:00
|
|
|
|
2005-02-02 10:21:10 +00:00
|
|
|
#ifdef __cplusplus
|
2002-04-19 14:23:31 +00:00
|
|
|
extern "C" {
|
|
|
|
#endif
|
|
|
|
|
2010-03-04 08:14:36 +00:00
|
|
|
#include "libopensc/opensc.h"
|
|
|
|
#include "libopensc/pkcs15.h"
|
2001-12-16 18:46:32 +00:00
|
|
|
|
2002-01-10 12:33:56 +00:00
|
|
|
struct sc_asn1_entry {
|
2001-12-16 18:46:32 +00:00
|
|
|
const char *name;
|
|
|
|
unsigned int type;
|
|
|
|
unsigned int tag;
|
|
|
|
unsigned int flags;
|
|
|
|
void *parm;
|
2001-12-29 19:03:46 +00:00
|
|
|
void *arg;
|
2001-12-16 18:46:32 +00:00
|
|
|
};
|
|
|
|
|
2002-01-16 23:59:18 +00:00
|
|
|
struct sc_asn1_pkcs15_object {
|
2002-03-03 00:32:28 +00:00
|
|
|
struct sc_pkcs15_object *p15_obj;
|
2002-01-10 12:33:56 +00:00
|
|
|
struct sc_asn1_entry *asn1_class_attr;
|
|
|
|
struct sc_asn1_entry *asn1_subclass_attr;
|
|
|
|
struct sc_asn1_entry *asn1_type_attr;
|
2001-12-19 21:58:04 +00:00
|
|
|
};
|
|
|
|
|
2002-04-17 08:54:36 +00:00
|
|
|
struct sc_asn1_pkcs15_algorithm_info {
|
|
|
|
int id;
|
|
|
|
struct sc_object_id oid;
|
|
|
|
int (*decode)(struct sc_context *, void **, const u8 *, size_t, int);
|
|
|
|
int (*encode)(struct sc_context *, void *, u8 **, size_t *, int);
|
|
|
|
void (*free)(void *);
|
|
|
|
};
|
|
|
|
|
|
|
|
|
2002-01-10 12:33:56 +00:00
|
|
|
/* Utility functions */
|
|
|
|
void sc_format_asn1_entry(struct sc_asn1_entry *entry, void *parm, void *arg,
|
|
|
|
int set_present);
|
|
|
|
void sc_copy_asn1_entry(const struct sc_asn1_entry *src,
|
|
|
|
struct sc_asn1_entry *dest);
|
|
|
|
|
2001-11-06 18:34:19 +00:00
|
|
|
/* DER tag and length parsing */
|
2002-01-10 12:33:56 +00:00
|
|
|
int sc_asn1_decode(struct sc_context *ctx, struct sc_asn1_entry *asn1,
|
2002-01-07 18:23:34 +00:00
|
|
|
const u8 *in, size_t len, const u8 **newp, size_t *left);
|
2002-01-10 12:33:56 +00:00
|
|
|
int sc_asn1_decode_choice(struct sc_context *ctx, struct sc_asn1_entry *asn1,
|
2002-01-07 18:23:34 +00:00
|
|
|
const u8 *in, size_t len, const u8 **newp, size_t *left);
|
2002-01-10 12:33:56 +00:00
|
|
|
int sc_asn1_encode(struct sc_context *ctx, const struct sc_asn1_entry *asn1,
|
|
|
|
u8 **buf, size_t *bufsize);
|
2002-04-17 08:54:36 +00:00
|
|
|
int _sc_asn1_decode(struct sc_context *, struct sc_asn1_entry *,
|
|
|
|
const u8 *, size_t, const u8 **, size_t *,
|
|
|
|
int, int);
|
|
|
|
int _sc_asn1_encode(struct sc_context *, const struct sc_asn1_entry *,
|
|
|
|
u8 **, size_t *, int);
|
2001-12-16 18:46:32 +00:00
|
|
|
|
2001-12-29 19:03:46 +00:00
|
|
|
const u8 *sc_asn1_find_tag(struct sc_context *ctx, const u8 * buf,
|
|
|
|
size_t buflen, unsigned int tag, size_t *taglen);
|
|
|
|
const u8 *sc_asn1_verify_tag(struct sc_context *ctx, const u8 * buf,
|
|
|
|
size_t buflen, unsigned int tag, size_t *taglen);
|
|
|
|
const u8 *sc_asn1_skip_tag(struct sc_context *ctx, const u8 ** buf,
|
|
|
|
size_t *buflen, unsigned int tag, size_t *taglen);
|
2001-11-06 18:34:19 +00:00
|
|
|
|
2001-11-17 00:11:29 +00:00
|
|
|
/* DER encoding */
|
|
|
|
|
|
|
|
/* Argument 'ptr' is set to the location of the next possible ASN.1 object.
|
|
|
|
* If NULL, no action on 'ptr' is performed. */
|
2005-08-08 10:22:14 +00:00
|
|
|
int sc_asn1_put_tag(int tag, const u8 * data, size_t datalen, u8 * out, size_t outlen, u8 ** ptr);
|
2001-11-17 00:11:29 +00:00
|
|
|
|
2001-11-06 18:34:19 +00:00
|
|
|
/* ASN.1 printing functions */
|
2002-01-01 18:25:11 +00:00
|
|
|
void sc_asn1_print_tags(const u8 * buf, size_t buflen);
|
2001-11-06 18:34:19 +00:00
|
|
|
|
|
|
|
/* ASN.1 object decoding functions */
|
2002-01-01 18:25:11 +00:00
|
|
|
int sc_asn1_utf8string_to_ascii(const u8 * buf, size_t buflen,
|
|
|
|
u8 * outbuf, size_t outlen);
|
|
|
|
int sc_asn1_decode_bit_string(const u8 * inbuf, size_t inlen,
|
|
|
|
void *outbuf, size_t outlen);
|
2001-11-06 18:34:19 +00:00
|
|
|
/* non-inverting version */
|
2002-01-01 18:25:11 +00:00
|
|
|
int sc_asn1_decode_bit_string_ni(const u8 * inbuf, size_t inlen,
|
|
|
|
void *outbuf, size_t outlen);
|
|
|
|
int sc_asn1_decode_integer(const u8 * inbuf, size_t inlen, int *out);
|
|
|
|
int sc_asn1_decode_object_id(const u8 * inbuf, size_t inlen,
|
2001-11-06 18:34:19 +00:00
|
|
|
struct sc_object_id *id);
|
2002-01-01 18:25:11 +00:00
|
|
|
|
2002-04-17 08:54:36 +00:00
|
|
|
/* algorithm encoding/decoding */
|
|
|
|
int sc_asn1_decode_algorithm_id(struct sc_context *,
|
|
|
|
const u8 *, size_t,
|
|
|
|
struct sc_algorithm_id *, int);
|
|
|
|
int sc_asn1_encode_algorithm_id(struct sc_context *,
|
|
|
|
u8 **, size_t *,
|
|
|
|
const struct sc_algorithm_id *, int);
|
|
|
|
void sc_asn1_clear_algorithm_id(struct sc_algorithm_id *);
|
|
|
|
|
2001-12-16 18:46:32 +00:00
|
|
|
#define SC_ASN1_CLASS_MASK 0x30000000
|
|
|
|
#define SC_ASN1_UNI 0x00000000 /* Universal */
|
|
|
|
#define SC_ASN1_APP 0x10000000 /* Application */
|
|
|
|
#define SC_ASN1_CTX 0x20000000 /* Context */
|
|
|
|
#define SC_ASN1_PRV 0x30000000 /* Private */
|
|
|
|
#define SC_ASN1_CONS 0x01000000
|
|
|
|
|
|
|
|
#define SC_ASN1_TAG_MASK 0x00FFFFFF
|
|
|
|
|
|
|
|
#define SC_ASN1_PRESENT 0x00000001
|
|
|
|
#define SC_ASN1_OPTIONAL 0x00000002
|
2001-12-29 19:03:46 +00:00
|
|
|
#define SC_ASN1_ALLOC 0x00000004
|
2003-02-03 12:17:12 +00:00
|
|
|
#define SC_ASN1_UNSIGNED 0x00000008
|
2001-12-16 18:46:32 +00:00
|
|
|
|
2001-12-19 21:58:04 +00:00
|
|
|
#define SC_ASN1_BOOLEAN 1
|
|
|
|
#define SC_ASN1_INTEGER 2
|
|
|
|
#define SC_ASN1_BIT_STRING 3
|
2001-12-29 19:03:46 +00:00
|
|
|
#define SC_ASN1_BIT_STRING_NI 128
|
2001-12-19 21:58:04 +00:00
|
|
|
#define SC_ASN1_OCTET_STRING 4
|
|
|
|
#define SC_ASN1_NULL 5
|
|
|
|
#define SC_ASN1_OBJECT 6
|
|
|
|
#define SC_ASN1_ENUMERATED 10
|
|
|
|
#define SC_ASN1_UTF8STRING 12
|
|
|
|
#define SC_ASN1_SEQUENCE 16
|
|
|
|
#define SC_ASN1_SET 17
|
|
|
|
#define SC_ASN1_PRINTABLESTRING 19
|
|
|
|
#define SC_ASN1_UTCTIME 23
|
|
|
|
#define SC_ASN1_GENERALIZEDTIME 24
|
2001-12-16 18:46:32 +00:00
|
|
|
|
|
|
|
/* internal structures */
|
2001-12-29 19:03:46 +00:00
|
|
|
#define SC_ASN1_STRUCT 129
|
|
|
|
#define SC_ASN1_CHOICE 130
|
2003-04-16 20:52:26 +00:00
|
|
|
#define SC_ASN1_BIT_FIELD 131 /* bit string as integer */
|
2001-12-16 18:46:32 +00:00
|
|
|
|
2001-12-19 21:58:04 +00:00
|
|
|
/* 'complex' structures */
|
|
|
|
#define SC_ASN1_PATH 256
|
|
|
|
#define SC_ASN1_PKCS15_ID 257
|
|
|
|
#define SC_ASN1_PKCS15_OBJECT 258
|
2002-03-08 05:59:57 +00:00
|
|
|
#define SC_ASN1_ALGORITHM_ID 259
|
2006-10-30 18:51:48 +00:00
|
|
|
#define SC_ASN1_SE_INFO 260
|
2001-11-06 18:34:19 +00:00
|
|
|
|
2001-12-29 19:03:46 +00:00
|
|
|
/* use callback function */
|
|
|
|
#define SC_ASN1_CALLBACK 384
|
|
|
|
|
2006-01-20 20:52:36 +00:00
|
|
|
#define SC_ASN1_TAG_CLASS 0xC0
|
|
|
|
#define SC_ASN1_TAG_UNIVERSAL 0x00
|
|
|
|
#define SC_ASN1_TAG_APPLICATION 0x40
|
|
|
|
#define SC_ASN1_TAG_CONTEXT 0x80
|
|
|
|
#define SC_ASN1_TAG_PRIVATE 0xC0
|
|
|
|
|
|
|
|
#define SC_ASN1_TAG_CONSTRUCTED 0x20
|
|
|
|
#define SC_ASN1_TAG_PRIMITIVE 0x1F
|
|
|
|
|
|
|
|
#define SC_ASN1_TAG_EOC 0
|
|
|
|
#define SC_ASN1_TAG_BOOLEAN 1
|
|
|
|
#define SC_ASN1_TAG_INTEGER 2
|
|
|
|
#define SC_ASN1_TAG_BIT_STRING 3
|
|
|
|
#define SC_ASN1_TAG_OCTET_STRING 4
|
|
|
|
#define SC_ASN1_TAG_NULL 5
|
|
|
|
#define SC_ASN1_TAG_OBJECT 6
|
|
|
|
#define SC_ASN1_TAG_OBJECT_DESCRIPTOR 7
|
|
|
|
#define SC_ASN1_TAG_EXTERNAL 8
|
|
|
|
#define SC_ASN1_TAG_REAL 9
|
|
|
|
#define SC_ASN1_TAG_ENUMERATED 10
|
|
|
|
#define SC_ASN1_TAG_UTF8STRING 12
|
|
|
|
#define SC_ASN1_TAG_SEQUENCE 16
|
|
|
|
#define SC_ASN1_TAG_SET 17
|
|
|
|
#define SC_ASN1_TAG_NUMERICSTRING 18
|
|
|
|
#define SC_ASN1_TAG_PRINTABLESTRING 19
|
|
|
|
#define SC_ASN1_TAG_T61STRING 20
|
|
|
|
#define SC_ASN1_TAG_TELETEXSTRING 20
|
|
|
|
#define SC_ASN1_TAG_VIDEOTEXSTRING 21
|
|
|
|
#define SC_ASN1_TAG_IA5STRING 22
|
|
|
|
#define SC_ASN1_TAG_UTCTIME 23
|
|
|
|
#define SC_ASN1_TAG_GENERALIZEDTIME 24
|
|
|
|
#define SC_ASN1_TAG_GRAPHICSTRING 25
|
|
|
|
#define SC_ASN1_TAG_ISO64STRING 26
|
|
|
|
#define SC_ASN1_TAG_VISIBLESTRING 26
|
|
|
|
#define SC_ASN1_TAG_GENERALSTRING 27
|
|
|
|
#define SC_ASN1_TAG_UNIVERSALSTRING 28
|
|
|
|
#define SC_ASN1_TAG_BMPSTRING 30
|
2001-11-06 18:34:19 +00:00
|
|
|
|
2005-02-02 10:21:10 +00:00
|
|
|
#ifdef __cplusplus
|
2002-04-19 14:23:31 +00:00
|
|
|
}
|
|
|
|
#endif
|
|
|
|
|
2001-11-01 15:43:20 +00:00
|
|
|
#endif
|