📄 certattr.h
字号:
( ( ( value ) >> 4 ) & ( FL_LEVEL_MASK >> 4 ) )
/* Some fields have an intrinsic value but no explicitly set value (that is,
their mere presence communicates the information they are intended to
convey but the fields themselves contain no actual data). This applies
for fields that contain OIDs that denote certain things (for example
certificate policies or key usage). To denote these identifier fields
the field type is set to FIELDTYPE_IDENTIFIER (note that we start at -2
rather than -1, which is the CRYPT_ERROR value). When a field of this
type is encountered no data value is recorded but the OID for the field
is written to the certificate when the field is encoded */
#define FIELDTYPE_IDENTIFIER -2
/* Some fields have no set value (these arise from ANY DEFINED BY
definitions) or an opaque value (typically fixed parameters for type-and-
value pairs). To denote these fields the field type is set to
FIELDTYPE_BLOB */
#define FIELDTYPE_BLOB -3
/* When a field contains a CHOICE it can contain any one of the CHOICE
fields, as opposed to a FL_SETOF which can contain any of the fields that
follow it. Currently the only CHOICE fields contain OIDs as choices, the
CHOICE fieldtype indicates that the value is stored in the field itself
but the encoding is handled via a separate encoding table pointed to by
extraData that maps the value to an OID */
#define FIELDTYPE_CHOICE -4
/* Some fields are composite fields that contain complete certificate data
structures. To denote these fields the field type is a special code that
specifies the type and the value member contains the handle or the data
member contains a pointer to the composite object */
#define FIELDTYPE_DN -5
/* As an extension of the above, some fields are complex enough to require
complete alternative encoding tables. The most obvious one is
GeneralName, but this is also used for some CHOICE types where the value
selects a particular OID or entry from an alternative encoding table. In
this case the extraData member is a pointer to the alternative encoding
table */
#define FIELDTYPE_SUBTYPED -6
/* Another variant of FIELDTYPE_DN is one where the field can contain one of
a number of string types chosen from the ASN.1 string menagerie. Rather
than adding a list of the different string types marked as optional to
the en/decoding tables we provide a single DisplayString meta-type which
has a custom decoding routine that makes the appropriate choice */
#define FIELDTYPE_DISPLAYSTRING -7
/* Usually the field ID for the first field in an entry (the one containing
the OID) is the overall attribute ID, however there are one or two
exceptions in which the attribute ID and field ID are the same but are
given in separate fields (examples of this are the altNames, which have
a single field ID SUBJECT/ISSUERALTNAME that applies to the attribute as
a whole but also to the one and only field in it.
If this happens the field ID for the attribute as a whole is given the
value FIELDID_FOLLOWS to indicate that the actual ID is present at a later
point (the first field that isn't a FIELDID_FOLLOWS code is treated as
the attribute ID) */
#define FIELDID_FOLLOWS -8
typedef struct {
/* Information on the overall attribute. These fields are only set
for overall attribute definitions */
const BYTE FAR_BSS *oid; /* OID for this attribute */
/* Information on this particular field in the attribute. The fieldType
is the field as defined (e.g. SEQUENCE, INTEGER), the
fieldEncodingType is the field as encoded: 0 if it's the same as the
field type or the tag if it's a tagged field. The default tagging
is to use implicit tags (e.g. [ 0 ] IMPLICIT SEQUENCE) with a field of
type fieldType and encoding of type fieldEncodedType. If FL_EXPLICIT
is set it's an explicitly tagged field and both fields are used for
the encoding */
const CRYPT_ATTRIBUTE_TYPE fieldID; /* Magic ID for this field */
#ifndef NDEBUG
const char *description; /* Text description */
#endif /* NDEBUG */
const int fieldType; /* ASN.1 tag/type for this field */
const int fieldEncodedType; /* ASN.1 tag for field as encoded */
/* General status information */
const long flags; /* Status and information flags */
/* Information to allow validity checking for this field */
const int lowRange; /* Min/max allowed if numeric/boolean */
const int highRange; /* Min/max length if string */
const long defaultValue; /* Default value if FL_DEFAULT set */
/* Extra data needed to process this field, either a pointer to an
alternative encoding table or a pointer to the validation function to
allow extended validity checking */
const void *extraData;
} ATTRIBUTE_INFO;
/* When using a debugger that isn't capable of displaying the symbolic name
for an enumerated type we allocate a text string describing the field
which is being processed, this makes it easier to track down the point in
a certificate where cryptlib finds a problem */
#ifndef NDEBUG
#define MKDESC( text ) text,
#else
#define MKDESC( text )
#endif /* NDEBUG */
/* The validation function used to perform additional validation on fields */
typedef CHECK_RETVAL STDC_NONNULL_ARG( ( 1 ) ) \
int ( *VALIDATION_FUNCTION )( const ATTRIBUTE_LIST *attributeListPtr );
/* Look up an ATTRIBUTE_INFO entry based on an OID */
CHECK_RETVAL STDC_NONNULL_ARG( ( 2 ) ) \
const ATTRIBUTE_INFO *oidToAttribute( IN_ENUM( ATTRIBUTE ) \
const ATTRIBUTE_TYPE attributeType,
IN_BUFFER( oidLength ) const BYTE *oid,
IN_LENGTH const int oidLength );
/* Select the appropriate attribute info table for encoding/type checking,
and get its size */
CHECK_RETVAL_PTR \
const ATTRIBUTE_INFO *selectAttributeInfo( IN_ENUM( ATTRIBUTE ) \
const ATTRIBUTE_TYPE attributeType );
CHECK_RETVAL_RANGE( 0, MAX_INTLENGTH_SHORT ) \
int sizeofAttributeInfo( IN_ENUM( ATTRIBUTE ) const ATTRIBUTE_TYPE attributeType );
/* Get the encoded tag for a field */
CHECK_RETVAL_RANGE( MAX_ERROR, MAX_TAG ) STDC_NONNULL_ARG( ( 1 ) ) \
int getFieldEncodedTag( const ATTRIBUTE_INFO *attributeInfoPtr );
/* Get the attribute and attributeID for a field ID */
CHECK_RETVAL \
const ATTRIBUTE_INFO *fieldIDToAttribute( IN_ENUM( ATTRIBUTE ) \
const ATTRIBUTE_TYPE attributeType,
IN_ATTRIBUTE \
const CRYPT_ATTRIBUTE_TYPE fieldID,
IN_ATTRIBUTE_OPT \
const CRYPT_ATTRIBUTE_TYPE subFieldID,
OUT_OPT_ATTRIBUTE_Z \
CRYPT_ATTRIBUTE_TYPE *attributeID );
/* Find the start of an attribute from an arbitrary position in an attribute
list */
CHECK_RETVAL_PTR \
ATTRIBUTE_LIST *findAttributeStart( IN_OPT const ATTRIBUTE_LIST *attributeListPtr );
/* Write an attribute field */
CHECK_RETVAL STDC_NONNULL_ARG( ( 2 ) ) \
int writeAttributeField( INOUT_OPT STREAM *stream,
INOUT ATTRIBUTE_LIST *attributeListPtr,
IN_RANGE( 0, 5 ) const int complianceLevel );
#endif /* _CERTATTR_DEFINED */
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -