svcparams[nparams] = rdata_ptr;
if (rdata_remaining < 4)
- return LDNS_WIREPARSE_ERR_GENERAL;
+ return LDNS_WIREPARSE_ERR_SVCPARAM_BROKEN_RDATA;
svcbparam_len = sldns_read_uint16(rdata_ptr + 2);
rdata_remaining -= 4;
rdata_ptr += 4;
if (rdata_remaining < svcbparam_len)
- return LDNS_WIREPARSE_ERR_GENERAL;
+ return LDNS_WIREPARSE_ERR_SVCPARAM_BROKEN_RDATA;
rdata_remaining -= svcbparam_len;
rdata_ptr += svcbparam_len;
return LDNS_WIREPARSE_ERR_SVCB_TOO_MANY_PARAMS;
}
- /* In draft-ietf-dnsop-svcb-https-05 Section 7:
+ /* In draft-ietf-dnsop-svcb-https-06 Section 7:
*
* In wire format, the keys are represented by their numeric
* values in network byte order, concatenated in ascending order.
,sizeof(uint8_t*)
,sldns_str2wire_svcparam_key_cmp);
- /* In draft-ietf-dnsop-svcb-https-05 Section 7:
+ /* In draft-ietf-dnsop-svcb-https-06 Section 7:
*
* Keys (...) MUST NOT appear more than once.
*
if (mandatory) {
/* Divide by sizeof(uint16_t)*/
- uint16_t mandatory_len = sldns_read_uint16(mandatory + 2) / sizeof(uint16_t);
+ uint16_t mandatory_nkeys = sldns_read_uint16(mandatory + 2) / sizeof(uint16_t);
/* Guaranteed by sldns_str2wire_svcparam_key_value */
- assert(mandatory_len > 0);
+ assert(mandatory_nkeys > 0);
- for (i = 0; i < mandatory_len; i++) {
+ for (i = 0; i < mandatory_nkeys; i++) {
uint16_t mandatory_key = sldns_read_uint16(mandatory
+ 2 * sizeof(uint16_t)
+ i * sizeof(uint16_t));
rdata_len -= label_len;
rdata += label_len;
}
+ /* The root label is one more character, so smaller
+ * than 1 + 1 means no Svcparam Keys */
assert(*rdata == 0);
if (rdata_len < 2)
return LDNS_WIREPARSE_ERR_OK;
return LDNS_WIREPARSE_ERR_OK;
}
-static uint16_t
+static int
sldns_str2wire_svcparam_key_lookup(const char *key, size_t key_len)
{
char buf[64];
return LDNS_WIREPARSE_ERR_OK;
}
- return LDNS_WIREPARSE_ERR_SVCB_PORT_UNKNOWN_KEY;
+ return LDNS_WIREPARSE_ERR_SVCB_PORT_VALUE_SYNTAX;
}
static int
if (val[i] == ',')
count += 1;
if (count > SVCB_MAX_COMMA_SEPARATED_VALUES) {
- return LDNS_WIREPARSE_ERR_SVCB_IPV4_TOO_MANY_KEYS;
+ return LDNS_WIREPARSE_ERR_SVCB_IPV4_TOO_MANY_ADDRESSES;
}
}
if (val[i] == ',')
count += 1;
if (count > SVCB_MAX_COMMA_SEPARATED_VALUES) {
- return LDNS_WIREPARSE_ERR_SVCB_IPV6_TOO_MANY_KEYS;
+ return LDNS_WIREPARSE_ERR_SVCB_IPV6_TOO_MANY_ADDRESSES;
}
}
*rd_len = 4;
while (1) {
+ int svcparamkey;
+
if (!(next_key = strchr(val, ','))) {
- sldns_write_uint16(rd + *rd_len,
- sldns_str2wire_svcparam_key_lookup(val, val_len));
+ svcparamkey = sldns_str2wire_svcparam_key_lookup(val, val_len);
+
+ if (svcparamkey < 0) {
+ return LDNS_WIREPARSE_ERR_SVCB_UNKNOWN_KEY;
+ }
+
+ sldns_write_uint16(rd + *rd_len, svcparamkey);
*rd_len += 2;
break;
} else {
+ svcparamkey = sldns_str2wire_svcparam_key_lookup(val, next_key - val);
+
+ if (svcparamkey < 0) {
+ return LDNS_WIREPARSE_ERR_SVCB_UNKNOWN_KEY;
+ }
+
sldns_write_uint16(rd + *rd_len,
- sldns_str2wire_svcparam_key_lookup(val, next_key - val));
+ svcparamkey);
*rd_len += 2;
}
key_dst += 1;
}
- /* In draft-ietf-dnsop-svcb-https-05 Section 7:
+ /* In draft-ietf-dnsop-svcb-https-06 Section 7:
*
* "In wire format, the keys are represented by their numeric
* values in network byte order, concatenated in ascending order."
*/
qsort((void *)(rd + 4), count, sizeof(uint16_t), sldns_network_uint16_cmp);
- /* In draft-ietf-dnsop-svcb-https-05 Section 8
+ /* In draft-ietf-dnsop-svcb-https-06 Section 8
* automatically mandatory MUST NOT appear in its own value-list
*/
if (sldns_read_uint16(rd + 4) == SVCB_KEY_MANDATORY)
/* The source is already properly unescaped, this double unescaping is purely to allow for
* comma's in comma seperated alpn lists.
+ *
+ * In draft-ietf-dnsop-svcb-https-06 Section 7:
+ * To enable simpler parsing, this SvcParamValue MUST NOT contain escape sequences.
*/
static size_t
sldns_str2wire_svcbparam_parse_copy_unescaped(uint8_t *dst,
const char *val, uint8_t* rd, size_t* rd_len)
{
size_t str_len;
- uint16_t svcparamkey = sldns_str2wire_svcparam_key_lookup(key, key_len);
+ int svcparamkey = sldns_str2wire_svcparam_key_lookup(key, key_len);
if (svcparamkey < 0) {
return LDNS_WIREPARSE_ERR_SVCB_UNKNOWN_KEY;
"Keys in SvcParam mandatory MUST be unique" },
{ LDNS_WIREPARSE_ERR_SVCB_MANDATORY_IN_MANDATORY,
"mandatory MUST not be included as mandatory parameter" },
- { LDNS_WIREPARSE_ERR_SVCB_PORT_UNKNOWN_KEY,
+ { LDNS_WIREPARSE_ERR_SVCB_PORT_VALUE_SYNTAX,
"Could not parse port SvcParamValue" },
- { LDNS_WIREPARSE_ERR_SVCB_IPV4_TOO_MANY_KEYS,
+ { LDNS_WIREPARSE_ERR_SVCB_IPV4_TOO_MANY_ADDRESSES,
"Too many IPv4 addresses in ipv4hint" },
- { LDNS_WIREPARSE_ERR_SVCB_IPV6_TOO_MANY_KEYS,
+ { LDNS_WIREPARSE_ERR_SVCB_IPV6_TOO_MANY_ADDRESSES,
"Too many IPv6 addresses in ipv6hint" },
{ LDNS_WIREPARSE_ERR_SVCB_ALPN_KEY_TOO_LARGE,
"Alpn strings need to be smaller than 255 chars"},
{ LDNS_WIREPARSE_ERR_SVCB_NO_DEFAULT_ALPN_VALUE,
"No-default-alpn should not have a value" },
+ { LDNS_WIREPARSE_ERR_SVCPARAM_BROKEN_RDATA,
+ "General SVCParam error" },
{ 0, NULL }
};
sldns_lookup_table* sldns_wireparse_errors = sldns_wireparse_errors_data;
};
sldns_lookup_table* sldns_tsig_errors = sldns_tsig_errors_data;
-/* draft-ietf-dnsop-svcb-https-04: 6. Initial SvcParamKeys */
+/* draft-ietf-dnsop-svcb-https-06: 6. Initial SvcParamKeys */
const char *svcparamkey_strs[] = {
"mandatory", "alpn", "no-default-alpn", "port",
"ipv4hint", "ech", "ipv6hint"