struct ldap_seqof_key_data {
krb5_int32 mkvno; /* Master key version number */
- krb5_int16 kvno; /* kvno of key_data elements (all the same) */
+ krb5_ui_2 kvno; /* kvno of key_data elements (all the same) */
struct _krb5_key_data *key_data;
krb5_int16 n_key_data;
};
*/
typedef struct _krb5_key_data {
krb5_int16 key_data_ver; /* Version */
- krb5_int16 key_data_kvno; /* Key Version */
+ krb5_ui_2 key_data_kvno; /* Key Version */
krb5_int16 key_data_type[2]; /* Array of types */
krb5_ui_2 key_data_length[2]; /* Array of lengths */
krb5_octet * key_data_contents[2]; /* Array of pointers */
if (!xdr_krb5_int16(xdrs, &objp->key_data_ver)) {
return (FALSE);
}
- if (!xdr_krb5_int16(xdrs, &objp->key_data_kvno)) {
+ if (!xdr_krb5_ui_2(xdrs, &objp->key_data_kvno)) {
return (FALSE);
}
if (!xdr_krb5_int16(xdrs, &objp->key_data_type[0])) {
if (!xdr_krb5_int16(xdrs, &objp->key_data_ver))
return(FALSE);
- if (!xdr_krb5_int16(xdrs, &objp->key_data_kvno))
+ if (!xdr_krb5_ui_2(xdrs, &objp->key_data_kvno))
return(FALSE);
if (!xdr_krb5_int16(xdrs, &objp->key_data_type[0]))
return(FALSE);
krb5_key_data *kp = &ent->key_data[j];
kdbe_key_t *kv = &ULOG_ENTRY_KEYVAL(update, i, j);
kp->key_data_ver = (krb5_int16)kv->k_ver;
- kp->key_data_kvno = (krb5_int16)kv->k_kvno;
+ kp->key_data_kvno = (krb5_ui_2)kv->k_kvno;
if (kp->key_data_ver > 2) {
return EINVAL; /* XXX ? */
}
old_kvno = krb5_db_get_key_data_kvno(context, n_key_data, key_data);
if (new_kvno < old_kvno + 1)
new_kvno = old_kvno + 1;
+ /* Wrap from 65535 to 1; we can only store 16-bit kvno values in key_data,
+ * and we assign special meaning to kvno 0. */
+ if (new_kvno == (1 << 16))
+ new_kvno = 1;
/* Add new keys to the front of the list. */
if (password != NULL) {
IMPORT_TYPE(int32, krb5_int32);
DEFINTTYPE(int16, krb5_int16);
+DEFINTTYPE(uint16, krb5_ui_2);
DEFCOUNTEDSTRINGTYPE(ui2_octetstring, unsigned char *, krb5_ui_2,
k5_asn1_encode_bytestring, k5_asn1_decode_bytestring,
DEFINT_IMMEDIATE(one, 1, ASN1_BAD_FORMAT);
DEFCTAGGEDTYPE(ldap_key_seq_0, 0, one);
DEFCTAGGEDTYPE(ldap_key_seq_1, 1, one);
-DEFFIELD(ldap_key_seq_2, ldap_seqof_key_data, kvno, 2, int16);
+DEFFIELD(ldap_key_seq_2, ldap_seqof_key_data, kvno, 2, uint16);
DEFFIELD(ldap_key_seq_3, ldap_seqof_key_data, mkvno, 3, int32);
DEFCNFIELD(ldap_key_seq_4, ldap_seqof_key_data, key_data, n_key_data, 4,
cseqof_key_data);
if (!ldap_xdr_krb5_int16(xdrs, &objp->key_data_ver))
return(FALSE);
- if (!ldap_xdr_krb5_int16(xdrs, &objp->key_data_kvno))
+ if (!ldap_xdr_krb5_ui_2(xdrs, &objp->key_data_kvno))
return(FALSE);
if (!ldap_xdr_krb5_int16(xdrs, &objp->key_data_type[0]))
return(FALSE);