ASN1_OCTETSTRING);
static int
-is_salt_present(const void *p)
+is_value_present(const void *p)
{
const krb5_key_data *val = p;
return (val->key_data_length[1] != 0);
}
DEFCOUNTEDTYPE(krbsalt_salt, krb5_key_data, key_data_contents[1],
key_data_length[1], ui2_octetstring);
-DEFOPTIONALTYPE(krbsalt_salt_if_present, is_salt_present, NULL, krbsalt_salt);
+DEFOPTIONALTYPE(krbsalt_salt_if_present, is_value_present, NULL, krbsalt_salt);
DEFFIELD(krbsalt_0, krb5_key_data, key_data_type[1], 0, int16);
DEFCTAGGEDTYPE(krbsalt_1, 1, krbsalt_salt_if_present);
static const struct atype_info *krbsalt_fields[] = {
};
DEFSEQTYPE(encryptionkey, krb5_key_data, encryptionkey_fields);
-DEFCTAGGEDTYPE(key_data_0, 0, krbsalt);
+static int
+is_salt_present(const void *p)
+{
+ const krb5_key_data *val = p;
+ return val->key_data_ver > 1;
+}
+static void
+no_salt(void *p)
+{
+ krb5_key_data *val = p;
+ val->key_data_ver = 1;
+}
+DEFOPTIONALTYPE(key_data_salt_if_present, is_salt_present, no_salt, krbsalt);
+DEFCTAGGEDTYPE(key_data_0, 0, key_data_salt_if_present);
DEFCTAGGEDTYPE(key_data_1, 1, encryptionkey);
#if 0 /* We don't support this field currently. */
DEFCTAGGEDTYPE(key_data_2, 2, s2kparams),
/* Set kvno and key_data_ver in each key_data element. */
for (i = 0; i < p->n_key_data; i++) {
p->key_data[i].key_data_kvno = p->kvno;
- p->key_data[i].key_data_ver =
- (p->key_data[i].key_data_length[1] == 0) ? 1 : 2;
+ /* The decoder sets key_data_ver to 1 if no salt is present, but leaves
+ * it at 0 if salt is present. */
+ if (p->key_data[i].key_data_ver == 0)
+ p->key_data[i].key_data_ver = 2;
}
*out = p->key_data;