/*
* Create a mapping between FR_TYPE_* and valid FR_DER_TAG_*'s
*/
-static const bool *fr_type_to_der_tags[] = {
- [FR_TYPE_MAX] = NULL,
- [FR_TYPE_BOOL] = (bool []){[FR_DER_TAG_BOOLEAN] = true,
- [FR_DER_TAG_INTEGER] = true,
- [FR_DER_TAG_NULL] = true,
- [FR_DER_TAG_MAX] = false},
- [FR_TYPE_UINT8] = (bool []){[FR_DER_TAG_INTEGER] = true,
- [FR_DER_TAG_ENUMERATED] = true,
- [FR_DER_TAG_MAX] = false},
- [FR_TYPE_UINT16] = (bool []){[FR_DER_TAG_INTEGER] = true,
- [FR_DER_TAG_ENUMERATED] = true,
- [FR_DER_TAG_MAX] = false},
- [FR_TYPE_UINT32] = (bool []){[FR_DER_TAG_INTEGER] = true,
- [FR_DER_TAG_ENUMERATED] = true,
- [FR_DER_TAG_MAX] = false},
- [FR_TYPE_UINT64] = (bool []){[FR_DER_TAG_INTEGER] = true,
- [FR_DER_TAG_ENUMERATED] = true,
- [FR_DER_TAG_MAX] = false},
- [FR_TYPE_INT8] = (bool []){[FR_DER_TAG_INTEGER] = true,
- [FR_DER_TAG_ENUMERATED] = true,
- [FR_DER_TAG_MAX] = false},
- [FR_TYPE_INT16] = (bool []){[FR_DER_TAG_INTEGER] = true,
- [FR_DER_TAG_ENUMERATED] = true,
- [FR_DER_TAG_MAX] = false},
- [FR_TYPE_INT32] = (bool []){[FR_DER_TAG_INTEGER] = true,
- [FR_DER_TAG_ENUMERATED] = true,
- [FR_DER_TAG_MAX] = false},
- [FR_TYPE_INT64] = (bool []){[FR_DER_TAG_INTEGER] = true,
- [FR_DER_TAG_ENUMERATED] = true,
- [FR_DER_TAG_MAX] = false},
- [FR_TYPE_OCTETS] = (bool []){[FR_DER_TAG_BITSTRING] = true,
- [FR_DER_TAG_OCTETSTRING] = true,
- [FR_DER_TAG_MAX] = false},
- [FR_TYPE_STRING] = (bool []){[FR_DER_TAG_OID] = true,
- [FR_DER_TAG_UTF8_STRING] = true,
- [FR_DER_TAG_PRINTABLE_STRING] = true,
- [FR_DER_TAG_T61_STRING] = true,
- [FR_DER_TAG_IA5_STRING] = true,
- [FR_DER_TAG_VISIBLE_STRING] = true,
- [FR_DER_TAG_GENERAL_STRING] = true,
- [FR_DER_TAG_UNIVERSAL_STRING] = true,
- [FR_DER_TAG_MAX] = false},
- [FR_TYPE_DATE] = (bool []){[FR_DER_TAG_UTC_TIME] = true,
- [FR_DER_TAG_GENERALIZED_TIME] = true,
- [FR_DER_TAG_MAX] = false},
- [FR_TYPE_TLV] = (bool []){[FR_DER_TAG_SEQUENCE] = true,
- [FR_DER_TAG_SET] = true,
- [FR_DER_TAG_MAX] = false},
- [FR_TYPE_STRUCT] = (bool []){[FR_DER_TAG_BITSTRING] = true,
- [FR_DER_TAG_SEQUENCE] = true,
- [FR_DER_TAG_SET] = true,
- [FR_DER_TAG_MAX] = false},
- [FR_TYPE_GROUP] = (bool []){[FR_DER_TAG_SEQUENCE] = true,
- [FR_DER_TAG_SET] = true,
- [FR_DER_TAG_MAX] = false}
+static const bool *fr_type_to_der_tags[FR_DER_TAG_MAX] = {
+ [FR_TYPE_BOOL] = (bool [FR_DER_TAG_MAX]) {
+ [FR_DER_TAG_BOOLEAN] = true,
+ [FR_DER_TAG_INTEGER] = true,
+ [FR_DER_TAG_NULL] = true,
+ },
+ [FR_TYPE_UINT8] = (bool [FR_DER_TAG_MAX]) {
+ [FR_DER_TAG_INTEGER] = true,
+ [FR_DER_TAG_ENUMERATED] = true,
+ },
+ [FR_TYPE_UINT16] = (bool [FR_DER_TAG_MAX]) {
+ [FR_DER_TAG_INTEGER] = true,
+ [FR_DER_TAG_ENUMERATED] = true,
+ },
+ [FR_TYPE_UINT32] = (bool [FR_DER_TAG_MAX]) {
+ [FR_DER_TAG_INTEGER] = true,
+ [FR_DER_TAG_ENUMERATED] = true,
+ },
+ [FR_TYPE_UINT64] = (bool [FR_DER_TAG_MAX]) {
+ [FR_DER_TAG_INTEGER] = true,
+ [FR_DER_TAG_ENUMERATED] = true,
+ },
+ [FR_TYPE_INT8] = (bool [FR_DER_TAG_MAX]) {
+ [FR_DER_TAG_INTEGER] = true,
+ [FR_DER_TAG_ENUMERATED] = true,
+ },
+ [FR_TYPE_INT16] = (bool [FR_DER_TAG_MAX]) {
+ [FR_DER_TAG_INTEGER] = true,
+ [FR_DER_TAG_ENUMERATED] = true,
+ },
+ [FR_TYPE_INT32] = (bool [FR_DER_TAG_MAX]) {
+ [FR_DER_TAG_INTEGER] = true,
+ [FR_DER_TAG_ENUMERATED] = true,
+ },
+ [FR_TYPE_INT64] = (bool [FR_DER_TAG_MAX]) {
+ [FR_DER_TAG_INTEGER] = true,
+ [FR_DER_TAG_ENUMERATED] = true,
+ },
+ [FR_TYPE_OCTETS] = (bool [FR_DER_TAG_MAX]) {
+ [FR_DER_TAG_BITSTRING] = true,
+ [FR_DER_TAG_OCTETSTRING] = true,
+ },
+ [FR_TYPE_STRING] = (bool [FR_DER_TAG_MAX]) {
+ [FR_DER_TAG_OID] = true,
+ [FR_DER_TAG_UTF8_STRING] = true,
+ [FR_DER_TAG_PRINTABLE_STRING] = true,
+ [FR_DER_TAG_T61_STRING] = true,
+ [FR_DER_TAG_IA5_STRING] = true,
+ [FR_DER_TAG_VISIBLE_STRING] = true,
+ [FR_DER_TAG_GENERAL_STRING] = true,
+ [FR_DER_TAG_UNIVERSAL_STRING] = true,
+ },
+ [FR_TYPE_DATE] = (bool [FR_DER_TAG_MAX]) {
+ [FR_DER_TAG_UTC_TIME] = true,
+ [FR_DER_TAG_GENERALIZED_TIME] = true,
+ },
+ [FR_TYPE_TLV] = (bool [FR_DER_TAG_MAX]) {
+ [FR_DER_TAG_SEQUENCE] = true,
+ [FR_DER_TAG_SET] = true,
+ },
+ [FR_TYPE_STRUCT] = (bool [FR_DER_TAG_MAX]) {
+ [FR_DER_TAG_BITSTRING] = true,
+ [FR_DER_TAG_SEQUENCE] = true,
+ [FR_DER_TAG_SET] = true,
+ },
+ [FR_TYPE_GROUP] = (bool [FR_DER_TAG_MAX]) {
+ [FR_DER_TAG_SEQUENCE] = true,
+ [FR_DER_TAG_SET] = true,
+ },
};
/*
*/
#define fr_der_decode_enumerated fr_der_decode_integer
-static fr_der_tag_decode_t tag_funcs[] = {
+static fr_der_tag_decode_t tag_funcs[FR_DER_TAG_MAX] = {
[FR_DER_TAG_BOOLEAN] = { .constructed = FR_DER_TAG_PRIMITIVE, .decode = fr_der_decode_boolean },
[FR_DER_TAG_INTEGER] = { .constructed = FR_DER_TAG_PRIMITIVE, .decode = fr_der_decode_integer },
[FR_DER_TAG_BITSTRING] = { .constructed = FR_DER_TAG_PRIMITIVE, .decode = fr_der_decode_bitstring },
[FR_DER_TAG_GENERAL_STRING] = { .constructed = FR_DER_TAG_PRIMITIVE, .decode = fr_der_decode_general_string },
[FR_DER_TAG_UNIVERSAL_STRING] = { .constructed = FR_DER_TAG_PRIMITIVE,
.decode = fr_der_decode_universal_string },
-
- [UINT8_MAX] = { .constructed = FR_DER_TAG_PRIMITIVE, .decode = NULL },
};
static ssize_t fr_der_decode_string(TALLOC_CTX *ctx, fr_pair_list_t *out, fr_dict_attr_t const *parent, fr_dbuff_t *in,
*
* Note: Multi-byte tags would mean having a tag number that is greater than 30 (0x1E) (since tag
* 31 would indicate a multi-byte tag). For most use-cases, this should not be needed, since all
- * of the basic ASN.1 types are tagged under 30, and if a CHOICE type were to have over 30 options
+ * of the basic ASN.1 types have values under 30, and if a CHOICE type were to have over 30 options
* (meaning a multi-byte tag would be needed), that would be a very complex CHOICE type that
* should probably be simplified.
*/
*tag = fr_der_flag_der_type(parent);
}
- if ((*tag > NUM_ELEMENTS(tag_funcs)) || (*tag == FR_DER_TAG_INVALID)) {
+ if ((*tag >= NUM_ELEMENTS(tag_funcs)) || (*tag == FR_DER_TAG_INVALID)) {
fr_strerror_printf("Unknown tag %" PRIu64, *tag);
return -1;
}