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);
|
2015-02-15 12:56:51 +00:00
|
|
|
|
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
|
|
|
|
2012-10-14 12:35:46 +00:00
|
|
|
int sc_asn1_read_tag(const u8 ** buf, size_t buflen, unsigned int *cla_out,
|
|
|
|
unsigned int *tag_out, size_t *taglen);
|
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.
|
2014-10-28 08:05:02 +00:00
|
|
|
* If NULL, no action on 'ptr' is performed.
|
|
|
|
* If out is NULL or outlen is zero, the length that would be written is returned.
|
|
|
|
* If data is NULL, the data field will not be written. This is helpful for constructed structures. */
|
|
|
|
int sc_asn1_put_tag(unsigned 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,
|
2021-02-07 17:25:48 +00:00
|
|
|
void *outbuf, size_t outlen, const int strict);
|
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,
|
2021-02-07 17:25:48 +00:00
|
|
|
void *outbuf, size_t outlen, const int strict);
|
2019-11-05 12:34:07 +00:00
|
|
|
int sc_asn1_decode_integer(const u8 * inbuf, size_t inlen, int *out, int strict);
|
2002-01-01 18:25:11 +00:00
|
|
|
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);
|
2015-02-15 12:56:51 +00:00
|
|
|
int sc_asn1_encode_object_id(u8 **buf, size_t *buflen,
|
2010-03-22 14:14:51 +00:00
|
|
|
const 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 *);
|
|
|
|
|
2012-07-29 10:56:03 +00:00
|
|
|
|
|
|
|
/* ASN.1 object encoding functions */
|
|
|
|
int sc_asn1_write_element(sc_context_t *ctx, unsigned int tag,
|
|
|
|
const u8 * data, size_t datalen, u8 ** out, size_t * outlen);
|
|
|
|
|
2015-02-15 12:56:51 +00:00
|
|
|
int sc_asn1_sig_value_rs_to_sequence(struct sc_context *ctx,
|
|
|
|
unsigned char *in, size_t inlen,
|
|
|
|
unsigned char **buf, size_t *buflen);
|
|
|
|
int sc_asn1_sig_value_sequence_to_rs(struct sc_context *ctx,
|
2019-06-04 06:23:42 +00:00
|
|
|
const unsigned char *in, size_t inlen,
|
2015-03-07 20:36:16 +00:00
|
|
|
unsigned char *buf, size_t buflen);
|
2015-02-15 12:56:51 +00:00
|
|
|
|
ASN1 cleanup part 1
ASN1 tags are represented in two many ways within OpenSC.
This is a trivial change to simplify one aspect of this.
It also makes the code more readable.
SC_ASN1_CLASS_MASK, SC_ASN1_APP, SC_ASN1_CTX, SC_ASN1_PRV,
SC_ASN1_CONS are changed, and SC_ASN1_CLASS_MASK is added.
These then align with the bits defined by SC_ASN1_TAG_CLASS,
SC_ASN1_TAG_APPLICATION, SC_ASN1_TAG_CONTEXT, SC_ASN1_TAG_PRIVATE,
and SC_ASN1_TAG_CONSTRUCTED.
(SC_ASN1_UNI and SC_ASN1_TAG_UNIVERSAL are both 0x00 thus no change
is needed).
(No sign of a right shift of SC_ASN1_CTX or SC_ASN1_PRV causeing
problems has been seen in the code.) If found, can be solved.)
Close examination of the OpenSC code base shows all uses of tags
used by routines and sc_asn1_entry use the defines.
This could allows 26 lines of code in sc_asn1_skip_tag used to test
the 3 CLASS and CONSTRUCTED bits to be replaced by:
if (((cla << 24) | tag) != tag_in)
return NULL;
The 26 lines still work as will any other code in OpenSC
that tests the bits using the defines. It also allows new code
to be simplified.
Problem identified while looking at better way to check response
on GET_DATA (0xCB) that returns TLV as used in card-piv.c
Changes tested using pkcs11-tool --test --login with PIV, SC_HSM
and OpenPGP cards.
2020-07-21 15:42:26 +00:00
|
|
|
/* long form tags use these */
|
|
|
|
/* Same as SC_ASN1_TAG_* shifted left by 24 bits */
|
|
|
|
#define SC_ASN1_CLASS_MASK 0xC0000000
|
2001-12-16 18:46:32 +00:00
|
|
|
#define SC_ASN1_UNI 0x00000000 /* Universal */
|
ASN1 cleanup part 1
ASN1 tags are represented in two many ways within OpenSC.
This is a trivial change to simplify one aspect of this.
It also makes the code more readable.
SC_ASN1_CLASS_MASK, SC_ASN1_APP, SC_ASN1_CTX, SC_ASN1_PRV,
SC_ASN1_CONS are changed, and SC_ASN1_CLASS_MASK is added.
These then align with the bits defined by SC_ASN1_TAG_CLASS,
SC_ASN1_TAG_APPLICATION, SC_ASN1_TAG_CONTEXT, SC_ASN1_TAG_PRIVATE,
and SC_ASN1_TAG_CONSTRUCTED.
(SC_ASN1_UNI and SC_ASN1_TAG_UNIVERSAL are both 0x00 thus no change
is needed).
(No sign of a right shift of SC_ASN1_CTX or SC_ASN1_PRV causeing
problems has been seen in the code.) If found, can be solved.)
Close examination of the OpenSC code base shows all uses of tags
used by routines and sc_asn1_entry use the defines.
This could allows 26 lines of code in sc_asn1_skip_tag used to test
the 3 CLASS and CONSTRUCTED bits to be replaced by:
if (((cla << 24) | tag) != tag_in)
return NULL;
The 26 lines still work as will any other code in OpenSC
that tests the bits using the defines. It also allows new code
to be simplified.
Problem identified while looking at better way to check response
on GET_DATA (0xCB) that returns TLV as used in card-piv.c
Changes tested using pkcs11-tool --test --login with PIV, SC_HSM
and OpenPGP cards.
2020-07-21 15:42:26 +00:00
|
|
|
#define SC_ASN1_APP 0x40000000 /* Application */
|
|
|
|
#define SC_ASN1_CTX 0x80000000 /* Context */
|
|
|
|
#define SC_ASN1_PRV 0xC0000000 /* Private */
|
|
|
|
#define SC_ASN1_CONS 0x20000000
|
2001-12-16 18:46:32 +00:00
|
|
|
|
ASN1 cleanup part 1
ASN1 tags are represented in two many ways within OpenSC.
This is a trivial change to simplify one aspect of this.
It also makes the code more readable.
SC_ASN1_CLASS_MASK, SC_ASN1_APP, SC_ASN1_CTX, SC_ASN1_PRV,
SC_ASN1_CONS are changed, and SC_ASN1_CLASS_MASK is added.
These then align with the bits defined by SC_ASN1_TAG_CLASS,
SC_ASN1_TAG_APPLICATION, SC_ASN1_TAG_CONTEXT, SC_ASN1_TAG_PRIVATE,
and SC_ASN1_TAG_CONSTRUCTED.
(SC_ASN1_UNI and SC_ASN1_TAG_UNIVERSAL are both 0x00 thus no change
is needed).
(No sign of a right shift of SC_ASN1_CTX or SC_ASN1_PRV causeing
problems has been seen in the code.) If found, can be solved.)
Close examination of the OpenSC code base shows all uses of tags
used by routines and sc_asn1_entry use the defines.
This could allows 26 lines of code in sc_asn1_skip_tag used to test
the 3 CLASS and CONSTRUCTED bits to be replaced by:
if (((cla << 24) | tag) != tag_in)
return NULL;
The 26 lines still work as will any other code in OpenSC
that tests the bits using the defines. It also allows new code
to be simplified.
Problem identified while looking at better way to check response
on GET_DATA (0xCB) that returns TLV as used in card-piv.c
Changes tested using pkcs11-tool --test --login with PIV, SC_HSM
and OpenPGP cards.
2020-07-21 15:42:26 +00:00
|
|
|
#define SC_ASN1_CLASS_CONS 0xE0000000 /* CLASS and CONS */
|
2001-12-16 18:46:32 +00:00
|
|
|
#define SC_ASN1_TAG_MASK 0x00FFFFFF
|
2016-03-09 17:38:31 +00:00
|
|
|
#define SC_ASN1_TAGNUM_SIZE 3
|
2001-12-16 18:46:32 +00:00
|
|
|
|
|
|
|
#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
|
2010-07-05 13:29:10 +00:00
|
|
|
#define SC_ASN1_EMPTY_ALLOWED 0x00000010
|
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
|
|
|
|
|
ASN1 cleanup part 1
ASN1 tags are represented in two many ways within OpenSC.
This is a trivial change to simplify one aspect of this.
It also makes the code more readable.
SC_ASN1_CLASS_MASK, SC_ASN1_APP, SC_ASN1_CTX, SC_ASN1_PRV,
SC_ASN1_CONS are changed, and SC_ASN1_CLASS_MASK is added.
These then align with the bits defined by SC_ASN1_TAG_CLASS,
SC_ASN1_TAG_APPLICATION, SC_ASN1_TAG_CONTEXT, SC_ASN1_TAG_PRIVATE,
and SC_ASN1_TAG_CONSTRUCTED.
(SC_ASN1_UNI and SC_ASN1_TAG_UNIVERSAL are both 0x00 thus no change
is needed).
(No sign of a right shift of SC_ASN1_CTX or SC_ASN1_PRV causeing
problems has been seen in the code.) If found, can be solved.)
Close examination of the OpenSC code base shows all uses of tags
used by routines and sc_asn1_entry use the defines.
This could allows 26 lines of code in sc_asn1_skip_tag used to test
the 3 CLASS and CONSTRUCTED bits to be replaced by:
if (((cla << 24) | tag) != tag_in)
return NULL;
The 26 lines still work as will any other code in OpenSC
that tests the bits using the defines. It also allows new code
to be simplified.
Problem identified while looking at better way to check response
on GET_DATA (0xCB) that returns TLV as used in card-piv.c
Changes tested using pkcs11-tool --test --login with PIV, SC_HSM
and OpenPGP cards.
2020-07-21 15:42:26 +00:00
|
|
|
/* use with short one byte tags */
|
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
|
ASN1 cleanup part 1
ASN1 tags are represented in two many ways within OpenSC.
This is a trivial change to simplify one aspect of this.
It also makes the code more readable.
SC_ASN1_CLASS_MASK, SC_ASN1_APP, SC_ASN1_CTX, SC_ASN1_PRV,
SC_ASN1_CONS are changed, and SC_ASN1_CLASS_MASK is added.
These then align with the bits defined by SC_ASN1_TAG_CLASS,
SC_ASN1_TAG_APPLICATION, SC_ASN1_TAG_CONTEXT, SC_ASN1_TAG_PRIVATE,
and SC_ASN1_TAG_CONSTRUCTED.
(SC_ASN1_UNI and SC_ASN1_TAG_UNIVERSAL are both 0x00 thus no change
is needed).
(No sign of a right shift of SC_ASN1_CTX or SC_ASN1_PRV causeing
problems has been seen in the code.) If found, can be solved.)
Close examination of the OpenSC code base shows all uses of tags
used by routines and sc_asn1_entry use the defines.
This could allows 26 lines of code in sc_asn1_skip_tag used to test
the 3 CLASS and CONSTRUCTED bits to be replaced by:
if (((cla << 24) | tag) != tag_in)
return NULL;
The 26 lines still work as will any other code in OpenSC
that tests the bits using the defines. It also allows new code
to be simplified.
Problem identified while looking at better way to check response
on GET_DATA (0xCB) that returns TLV as used in card-piv.c
Changes tested using pkcs11-tool --test --login with PIV, SC_HSM
and OpenPGP cards.
2020-07-21 15:42:26 +00:00
|
|
|
#define SC_ASN1_TAG_CLASS_CONS 0xE0
|
2006-01-20 20:52:36 +00:00
|
|
|
|
|
|
|
#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
|
2011-01-13 13:59:22 +00:00
|
|
|
#define SC_ASN1_TAG_ESCAPE_MARKER 31
|
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
|