void rx_identity_populate(struct rx_identity *identity, rx_identity_kind kind, char *displayName, void *enameData, size_t enameLength) { memset(identity, 0, sizeof(struct rx_identity)); identity->kind = kind; identity->displayName = rxi_Alloc(strlen(displayName)+1); memcpy(identity->displayName, displayName, strlen(displayName)+1); rx_opaque_populate(&identity->exportedName, enameData, enameLength); }
static struct afsconf_typedKey * keyFromKeytab(int kvno, afsconf_keyType type, int subtype, const char *keytab, const char *princ) { int retval; krb5_principal principal; krb5_keyblock *key; krb5_context context; struct rx_opaque buffer; struct afsconf_typedKey *typedKey; krb5_init_context(&context); retval = krb5_parse_name(context, princ, &principal); if (retval) { afs_com_err("asetkey", retval, "while parsing AFS principal"); exit(1); } if (type == afsconf_rxkad) { retval = krb5_kt_read_service_key(context, (char *)keytab, principal, kvno, ENCTYPE_DES_CBC_CRC, &key); if (retval == KRB5_KT_NOTFOUND) retval = krb5_kt_read_service_key(context, (char *)keytab, principal, kvno, ENCTYPE_DES_CBC_MD5, &key); if (retval == KRB5_KT_NOTFOUND) retval = krb5_kt_read_service_key(context, (char *)keytab, principal, kvno, ENCTYPE_DES_CBC_MD4, &key); } else if (type == afsconf_rxkad_krb5) { retval = krb5_kt_read_service_key(context, (char *)keytab, principal, kvno, subtype, &key); } else { retval=AFSCONF_BADKEY; } if (retval == KRB5_KT_NOTFOUND) { char * princname = NULL; krb5_unparse_name(context, principal, &princname); if (type == afsconf_rxkad) { afs_com_err("asetkey", retval, "for keytab entry with Principal %s, kvno %u, " "DES-CBC-CRC/MD5/MD4", princname ? princname : princ, kvno); } else { afs_com_err("asetkey", retval, "for keytab entry with Principal %s, kvno %u", princname ? princname : princ, kvno); } exit(1); } if (retval != 0) { afs_com_err("asetkey", retval, "while extracting AFS service key"); exit(1); } if (type == afsconf_rxkad && deref_key_length(key) != 8) { fprintf(stderr, "Key length should be 8, but is really %u!\n", (unsigned int)deref_key_length(key)); exit(1); } rx_opaque_populate(&buffer, deref_key_contents(key), deref_key_length(key)); typedKey = afsconf_typedKey_new(type, kvno, subtype, &buffer); rx_opaque_freeContents(&buffer); krb5_free_principal(context, principal); krb5_free_keyblock(context, key); return typedKey; }