/*
* Copyright (c) 2008, 2009, 2010, 2011, 2012, 2013, 2014, 2015, 2016, 2017,
* 2018, 2019, 2020
* Jonathan Schleifer <js@nil.im>
*
* All rights reserved.
*
* This file is part of ObjFW. It may be distributed under the terms of the
* Q Public License 1.0, which can be found in the file LICENSE.QPL included in
* the packaging of this file.
*
* Alternatively, it may be distributed under the terms of the GNU General
* Public License, either version 2 or 3, which can be found in the file
* LICENSE.GPLv2 or LICENSE.GPLv3 respectively included in the packaging of this
* file.
*/
#import "OFObject.h"
OF_ASSUME_NONNULL_BEGIN
/** @file */
@class OFData;
/**
* @brief ASN.1 tag class.
*/
typedef enum {
/** Universal */
OF_ASN1_TAG_CLASS_UNIVERSAL = 0x0,
/** Application */
OF_ASN1_TAG_CLASS_APPLICATION = 0x1,
/** Context specific */
OF_ASN1_TAG_CLASS_CONTEXT_SPECIFIC = 0x2,
/** Private */
OF_ASN1_TAG_CLASS_PRIVATE = 0x3
} of_asn1_tag_class_t;
/**
* @brief ASN.1 tag number.
*/
typedef enum {
/** Boolean */
OF_ASN1_TAG_NUMBER_BOOLEAN = 0x01,
/** Integer */
OF_ASN1_TAG_NUMBER_INTEGER = 0x02,
/** Bit string */
OF_ASN1_TAG_NUMBER_BIT_STRING = 0x03,
/** Octet string */
OF_ASN1_TAG_NUMBER_OCTET_STRING = 0x04,
/** Null */
OF_ASN1_TAG_NUMBER_NULL = 0x05,
/** Object Identifier */
OF_ASN1_TAG_NUMBER_OBJECT_IDENTIFIER = 0x06,
/** Enumerated */
OF_ASN1_TAG_NUMBER_ENUMERATED = 0x0A,
/** UTF-8 string */
OF_ASN1_TAG_NUMBER_UTF8_STRING = 0x0C,
/** Sequence */
OF_ASN1_TAG_NUMBER_SEQUENCE = 0x10,
/** Set */
OF_ASN1_TAG_NUMBER_SET = 0x11,
/** NumericString */
OF_ASN1_TAG_NUMBER_NUMERIC_STRING = 0x12,
/** PrintableString */
OF_ASN1_TAG_NUMBER_PRINTABLE_STRING = 0x13,
/** IA5String */
OF_ASN1_TAG_NUMBER_IA5_STRING = 0x16
} of_asn1_tag_number_t;
/**
* @brief A class representing an ASN.1 value.
*/
OF_SUBCLASSING_RESTRICTED
@interface OFASN1Value: OFObject
{
of_asn1_tag_class_t _tagClass;
of_asn1_tag_number_t _tagNumber;
bool _constructed;
OFData *_DEREncodedContents;
}
/**
* @brief The tag class of the value's type.
*/
@property (readonly, nonatomic) of_asn1_tag_class_t tagClass;
/**
* @brief The tag number of the value's type.
*/
@property (readonly, nonatomic) of_asn1_tag_number_t tagNumber;
/**
* @brief Whether the value if of a constructed type.
*/
@property (readonly, nonatomic, getter=isConstructed) bool constructed;
/**
* @brief The DER-encoded contents octets of the value.
*/
@property (readonly, nonatomic) OFData *DEREncodedContents;
/**
* @brief Creates a new ASN.1 value with the specified arguments.
*
* @param tagClass The tag class of the value's type
* @param tagNumber The tag number of the value's type
* @param constructed Whether the value if of a constructed type
* @param DEREncodedContents The DER-encoded contents octets of the value.
* @return A new ASN.1 value
*/
+ (instancetype)valueWithTagClass: (of_asn1_tag_class_t)tagClass
tagNumber: (of_asn1_tag_number_t)tagNumber
constructed: (bool)constructed
DEREncodedContents: (OFData *)DEREncodedContents;
- (instancetype)init OF_UNAVAILABLE;
/**
* @brief Initializes an already allocated ASN.1 value with the specified
* arguments.
*
* @param tagClass The tag class of the value's type
* @param tagNumber The tag number of the value's type
* @param constructed Whether the value if of a constructed type
* @param DEREncodedContents The DER-encoded contents octets of the value.
* @return An initialized ASN.1 value
*/
- (instancetype)initWithTagClass: (of_asn1_tag_class_t)tagClass
tagNumber: (of_asn1_tag_number_t)tagNumber
constructed: (bool)constructed
DEREncodedContents: (OFData *)DEREncodedContents
OF_DESIGNATED_INITIALIZER;
@end
OF_ASSUME_NONNULL_END