↓
|
shishi_krberror_build
|
57
|
85
|
127
|
krberror.c
|
int
shishi_krberror_build (Shishi * handle, Shishi_asn1 krberror)
{
char *t;
size_t tmplen = sizeof (t);
char *tmp;
int32_t errc;
uint32_t usec;
int rc;
rc = shishi_krberror_ctime (handle, krberror, &t);
if (rc != SHISHI_OK &&
rc != SHISHI_ASN1_NO_ELEMENT && rc != SHISHI_ASN1_NO_VALUE)
return rc;
free (t);
if (rc == SHISHI_ASN1_NO_VALUE)
{
rc = shishi_krberror_remove_ctime (handle, krberror);
if (rc != SHISHI_OK)
return rc;
}
rc = shishi_krberror_cusec (handle, krberror, &usec);
if (rc != SHISHI_OK &&
rc != SHISHI_ASN1_NO_ELEMENT && rc != SHISHI_ASN1_NO_VALUE)
return rc;
if (rc == SHISHI_ASN1_NO_VALUE)
{
rc = shishi_krberror_remove_cusec (handle, krberror);
if (rc != SHISHI_OK)
return rc;
}
rc = shishi_krberror_crealm (handle, krberror, &tmp, &tmplen);
if (rc != SHISHI_OK &&
rc != SHISHI_ASN1_NO_ELEMENT && rc != SHISHI_ASN1_NO_VALUE)
return rc;
if (rc == SHISHI_OK)
free (tmp);
if (rc == SHISHI_ASN1_NO_VALUE)
{
rc = shishi_krberror_remove_crealm (handle, krberror);
if (rc != SHISHI_OK)
return rc;
}
rc = shishi_krberror_client (handle, krberror, &tmp, &tmplen);
if (rc != SHISHI_OK &&
rc != SHISHI_ASN1_NO_ELEMENT && rc != SHISHI_ASN1_NO_VALUE)
return rc;
if (rc == SHISHI_OK)
free (tmp);
if (rc == SHISHI_ASN1_NO_VALUE || (rc == SHISHI_OK && tmplen == 0))
{
rc = shishi_krberror_remove_cname (handle, krberror);
if (rc != SHISHI_OK)
return rc;
}
rc = shishi_krberror_realm (handle, krberror, &tmp, &tmplen);
if (rc != SHISHI_OK && rc != SHISHI_ASN1_NO_VALUE)
return rc;
if (rc == SHISHI_OK)
free (tmp);
if (rc == SHISHI_ASN1_NO_VALUE)
{
rc = shishi_krberror_set_realm (handle, krberror, "");
if (rc != SHISHI_OK)
return rc;
}
rc = shishi_krberror_server (handle, krberror, &tmp, &tmplen);
if (rc != SHISHI_OK && rc != SHISHI_ASN1_NO_VALUE)
return rc;
if (rc == SHISHI_OK)
free (tmp);
if (rc == SHISHI_ASN1_NO_VALUE || tmplen == 0)
{
rc = shishi_krberror_remove_sname (handle, krberror);
if (rc != SHISHI_OK)
return rc;
}
rc = shishi_krberror_edata (handle, krberror, &tmp, &tmplen);
if (rc != SHISHI_OK &&
rc != SHISHI_ASN1_NO_ELEMENT && rc != SHISHI_ASN1_NO_VALUE)
return rc;
if (rc == SHISHI_OK)
free (tmp);
if (rc == SHISHI_ASN1_NO_VALUE || (rc == SHISHI_OK && tmplen == 0))
{
rc = shishi_krberror_remove_edata (handle, krberror);
if (rc != SHISHI_OK)
return rc;
}
rc = shishi_krberror_errorcode (handle, krberror, &errc);
if (rc != SHISHI_OK && rc != SHISHI_ASN1_NO_VALUE)
return rc;
if (rc == SHISHI_ASN1_NO_VALUE)
{
rc = shishi_krberror_errorcode_set (handle, krberror,
SHISHI_KRB_ERR_GENERIC);
if (rc != SHISHI_OK)
return rc;
}
rc = shishi_krberror_etext (handle, krberror, &tmp, &tmplen);
if (rc != SHISHI_OK &&
rc != SHISHI_ASN1_NO_ELEMENT && rc != SHISHI_ASN1_NO_VALUE)
return rc;
if (rc == SHISHI_OK)
free (tmp);
if (rc == SHISHI_ASN1_NO_VALUE || (rc == SHISHI_OK && tmplen == 0))
{
if (shishi_krberror_errorcode_fast (handle, krberror) ==
SHISHI_KRB_ERR_GENERIC)
rc = shishi_krberror_set_etext (handle, krberror,
"Uninitialized error");
else
rc = shishi_krberror_remove_etext (handle, krberror);
if (rc != SHISHI_OK)
return rc;
}
return SHISHI_OK;
}
|
↓
|
shishi_cfg
|
43
|
138
|
234
|
cfg.c
|
int
shishi_cfg (Shishi * handle, const char *option)
{
char *opt = option ? xstrdup (option) : NULL;
char *p = opt;
char *value;
int res;
size_t i;
while (p != NULL && *p != '\0')
{
switch (getsubopt (&p, (char *const *) _shishi_opts, &value))
{
case KDC_TIMEOUT_OPTION:
if (value && atoi (value) > 0)
handle->kdctimeout = atoi (value);
else if (value)
shishi_warn (handle, "Invalid KDC timeout value: `%s'", value);
else
shishi_warn (handle, "Missing KDC timeout value");
break;
case KDC_RETRIES_OPTION:
if (value && atoi (value) > 0)
handle->kdcretries = atoi (value);
else if (value)
shishi_warn (handle, "Invalid KDC retries value: `%s'", value);
else
shishi_warn (handle, "Missing KDC retries value");
break;
case TICKET_LIFE_OPTION:
{
time_t now = time (NULL);
time_t then = shishi_get_date (value, &now);
int diff = difftime (then, now);
if (value && then != -1 && diff > 0)
handle->ticketlife = diff;
else if (diff <= 0 && diff + 60 * 60 * 24 > 0)
/* Hack to support "17:00" as always meaning the next 17:00. */
handle->ticketlife = 60 * 60 * 24 + diff;
else if (diff <= 0)
shishi_warn (handle, "Negative ticket life date: `%s'", value);
else if (then == -1)
shishi_warn (handle, "Invalid ticket life date: `%s'", value);
else
shishi_warn (handle, "Missing ticket life value");
}
break;
case RENEW_LIFE_OPTION:
{
time_t now = time (NULL);
time_t then = shishi_get_date (value, &now);
int diff = difftime (then, now);
if (value && then != -1 && diff > 0)
handle->renewlife = diff;
else if (diff <= 0)
shishi_warn (handle, "Negative renew life date: `%s'", value);
else if (then == -1)
shishi_warn (handle, "Invalid renew life date: `%s'", value);
else
shishi_warn (handle, "Missing renew life value");
}
break;
case REALM_KDC_OPTION:
{
struct Shishi_realminfo *ri;
char *realm = NULL;
char *protstr;
int transport = UDP;
int add_realm = 1;
realm = xstrdup (value);
for (i = 0; i < handle->nrealminfos; i++)
if (strcmp (realm, handle->realminfos[i].name) == 0)
{
if (handle->realminfos[i].nkdcaddresses > 0 ||
handle->realminfos[i].kdcaddresses)
{
free (handle->realminfos[i].kdcaddresses);
handle->realminfos[i].kdcaddresses = NULL;
handle->realminfos[i].nkdcaddresses = 0;
ri = &handle->realminfos[i];
add_realm = 0;
}
break;
}
if (add_realm)
{
handle->realminfos = xrealloc (handle->realminfos,
(handle->nrealminfos + 1) *
sizeof (*handle->realminfos));
memset (&handle->realminfos[handle->nrealminfos], 0,
sizeof (handle->realminfos[handle->nrealminfos]));
handle->realminfos[handle->nrealminfos].name = realm;
ri = &handle->realminfos[handle->nrealminfos];
handle->nrealminfos++;
}
if ((protstr = strchr (p, '/')))
{
*protstr = '\0';
protstr++;
if (strcasecmp (protstr, "udp") == 0)
transport = UDP;
else if (strcasecmp (protstr, "tcp") == 0)
transport = TCP;
else if (strcasecmp (protstr, "tls") == 0)
transport = TLS;
else
shishi_warn (handle,
"Ignoring unknown KDC transport: %s",
protstr);
}
ri->kdcaddresses = xrealloc (ri->kdcaddresses,
(ri->nkdcaddresses + 1) *
sizeof (*ri->kdcaddresses));
ri->kdcaddresses[ri->nkdcaddresses].transport = transport;
ri->kdcaddresses[ri->nkdcaddresses].hostname = xstrdup (p);
if ((protstr = strchr (value, ':')))
{
*protstr = '\0';
protstr++;
ri->kdcaddresses[ri->nkdcaddresses].port = protstr;
}
else
ri->kdcaddresses[ri->nkdcaddresses].port = NULL;
ri->nkdcaddresses++;
p = NULL; /* Done with suboptions. */
}
break;
case SERVER_REALM_OPTION:
{
struct Shishi_realminfo *ri;
char *subopts, *part, *next;
if (!p || (*p == 0))
{
shishi_warn (handle, "Empty server-realm for '%s'.", value);
break;
}
ri = _shishi_realminfo_new (handle, xstrdup (value));
part = subopts = xstrdup (p); /* List of patterns. */
while (part && *part)
{
next = strchr (part, ',');
if (next)
*(next++) = '\0';
ri->serverwildcards = xrealloc (ri->serverwildcards,
++ri->nserverwildcards *
sizeof (*ri->serverwildcards));
ri->serverwildcards[ri->nserverwildcards - 1] = xstrdup (part);
part = next;
}
p = NULL; /* Done with suboptions. */
}
break;
case DEFAULT_REALM_OPTION:
handle->default_realm = xstrdup (value);
break;
case DEFAULT_PRINCIPAL_OPTION:
handle->default_principal = xstrdup (value);
break;
case CLIENT_KDC_ETYPES_OPTION:
res = shishi_cfg_clientkdcetype_set (handle, value);
if (res != SHISHI_OK)
goto out;
break;
case AUTHORIZATION_TYPES_OPTION:
res = shishi_cfg_authorizationtype_set (handle, value);
if (res != SHISHI_OK)
goto out;
break;
case STRINGPROCESS_OPTION:
free (handle->stringprocess);
handle->stringprocess = xstrdup (value);
break;
case QUICK_RANDOM:
_shishi_quick_random ();
break;
case VERBOSE_OPTION:
handle->verbose = value && atoi (value) ? atoi (value) :
~0 & ~VERBOSES;
break;
case VERBOSE_CRYPTO_NOISE_OPTION:
handle->verbose |= SHISHI_VERBOSE_CRYPTO_NOISE;
break;
case VERBOSE_CRYPTO_OPTION:
handle->verbose |= SHISHI_VERBOSE_CRYPTO;
break;
case VERBOSE_ASN1_OPTION:
handle->verbose |= SHISHI_VERBOSE_ASN1;
break;
case VERBOSE_NOISE_OPTION:
handle->verbose |= SHISHI_VERBOSE_NOISE;
break;
case -1:
if (!value)
break;
/* fall through */
default:
shishi_warn (handle, "Unknown option: `%s'", value);
break;
}
}
res = SHISHI_OK;
out:
free (opt);
return res;
}
|
↓
|
shishi_tkts_add_ccache_mem
|
31
|
102
|
189
|
tktccache.c
|
int
shishi_tkts_add_ccache_mem (Shishi * handle,
const char *data, size_t len, Shishi_tkts * tkts)
{
int rc = SHISHI_OK;
struct ccache ccache;
if (VERBOSENOISE (handle))
{
printf ("ccache len %d (0x%x)\n", len, len);
_shishi_hexprint (data, len);
}
rc = ccache_parse (data, len, &ccache);
if (rc < 0)
return SHISHI_CCACHE_ERROR;
if (VERBOSENOISE (handle))
ccache_print (&ccache);
while (ccache.credentialslen)
{
struct ccache_credential cred;
Shishi_tkt *tkt;
Shishi_asn1 ticket;
size_t n;
rc = ccache_parse_credential (ccache.credentials,
ccache.credentialslen, &cred, &n);
if (rc < 0)
return SHISHI_CCACHE_ERROR;
if (VERBOSENOISE (handle))
ccache_print_credential (&cred);
/* Sanity check credential first. */
if (shishi_cipher_keylen (cred.key.keytype) != cred.key.keylen)
continue;
ticket = shishi_der2asn1_ticket (handle, cred.ticket.data,
cred.ticket.length);
if (!ticket)
continue;
/* Let's create a new ticket... */
rc = shishi_tkt (handle, &tkt);
if (rc != SHISHI_OK)
return rc;
shishi_tkt_ticket_set (tkt, ticket);
{
const char *cname[CCACHE_MAX_COMPONENTS + 1];
size_t i;
for (i = 0; i < cred.client.num_components
&& i < CCACHE_MAX_COMPONENTS; i++)
cname[i] = cred.client.components[i].data;
cname[i] = NULL;
rc = shishi_kdcrep_crealm_set (handle,
shishi_tkt_kdcrep (tkt),
cred.client.realm.data);
if (rc != SHISHI_OK)
return rc;
rc = shishi_kdcrep_cname_set (handle,
shishi_tkt_kdcrep (tkt),
cred.client.name_type, cname);
if (rc != SHISHI_OK)
return rc;
}
{
char *sname[CCACHE_MAX_COMPONENTS + 1];
size_t i;
for (i = 0; i < cred.server.num_components
&& i < CCACHE_MAX_COMPONENTS; i++)
sname[i] = cred.server.components[i].data;
sname[i] = NULL;
rc = shishi_enckdcreppart_srealm_set (handle,
shishi_tkt_enckdcreppart (tkt),
cred.server.realm.data);
if (rc != SHISHI_OK)
return rc;
rc = shishi_enckdcreppart_sname_set (handle,
shishi_tkt_enckdcreppart (tkt),
cred.server.name_type, sname);
if (rc != SHISHI_OK)
return rc;
}
rc = shishi_tkt_flags_set (tkt, cred.tktflags);
if (rc != SHISHI_OK)
return rc;
rc = shishi_enckdcreppart_authtime_set
(handle,
shishi_tkt_enckdcreppart (tkt),
shishi_generalize_time (handle, cred.authtime));
if (rc != SHISHI_OK)
return rc;
rc = shishi_enckdcreppart_starttime_set
(handle,
shishi_tkt_enckdcreppart (tkt),
cred.starttime ? shishi_generalize_time (handle, cred.starttime)
: NULL);
if (rc != SHISHI_OK)
return rc;
rc = shishi_enckdcreppart_endtime_set
(handle,
shishi_tkt_enckdcreppart (tkt),
shishi_generalize_time (handle, cred.endtime));
if (rc != SHISHI_OK)
return rc;
rc = shishi_enckdcreppart_renew_till_set
(handle,
shishi_tkt_enckdcreppart (tkt),
cred.renew_till ? shishi_generalize_time (handle, cred.renew_till)
: NULL);
if (rc != SHISHI_OK)
return rc;
{
uint32_t nonce = 0;
rc = shishi_enckdcreppart_nonce_set (handle,
shishi_tkt_enckdcreppart (tkt),
nonce);
if (rc != SHISHI_OK)
return rc;
}
rc = shishi_kdcrep_set_ticket (handle, shishi_tkt_kdcrep (tkt),
shishi_tkt_ticket (tkt));
if (rc != SHISHI_OK)
return rc;
rc = shishi_kdcrep_set_enc_part (handle, shishi_tkt_kdcrep (tkt),
0, 0, "", 0);
if (rc != SHISHI_OK)
return rc;
/* Add key. */
{
Shishi_key *key;
rc = shishi_key (handle, &key);
if (rc != SHISHI_OK)
return rc;
shishi_key_type_set (key, cred.key.keytype);
shishi_key_value_set (key, cred.key.keyvalue);
rc = shishi_tkt_key_set (tkt, key);
if (rc != SHISHI_OK)
return rc;
shishi_key_done (key);
}
/* Add new ticket to the set... */
rc = shishi_tkts_add (tkts, tkt);
if (rc != SHISHI_OK)
return rc;
ccache.credentials += n;
ccache.credentialslen -= n;
}
#if 0
{
char *data;
size_t len;
rc = shishi_tkts_to_ccache_mem (handle, tkts, &data, &len);
printf ("gaah res %d\n", rc);
}
#endif
return rc;
}
|
↓
|
parse_credential
|
27
|
80
|
116
|
ccache.c
|
static int
parse_credential (const char **data, size_t * len,
struct ccache_credential *out)
{
uint32_t num_address;
uint32_t num_authdata;
int rc;
rc = parse_principal (data, len, &out->client);
if (rc < 0)
return rc;
/* Make sure the last component is zero terminated. This limits the
next name-type to 2^24 bytes. */
if (*len > 0 && **(char **) data != '\0')
return -1;
rc = parse_principal (data, len, &out->server);
if (rc < 0)
return rc;
/* Make sure the last component is zero terminated. This limits the
next key-type to lower 1 byte. */
if (*len > 0 && **(char **) data != '\0')
return -1;
rc = get_uint16 (data, len, &out->key.keytype);
if (rc < 0)
return rc;
rc = get_uint16 (data, len, &out->key.etype);
if (rc < 0)
return rc;
rc = get_uint16 (data, len, &out->key.keylen);
if (rc < 0)
return rc;
if (*len < out->key.keylen)
return -1;
out->key.keyvalue = (char *) *data;
*data += out->key.keylen;
*len -= out->key.keylen;
rc = get_uint32 (data, len, &out->authtime);
if (rc < 0)
return rc;
rc = get_uint32 (data, len, &out->starttime);
if (rc < 0)
return rc;
rc = get_uint32 (data, len, &out->endtime);
if (rc < 0)
return rc;
rc = get_uint32 (data, len, &out->renew_till);
if (rc < 0)
return rc;
rc = get_uint8 (data, len, &out->is_skey);
if (rc < 0)
return rc;
rc = get_uint32_swapped (data, len, &out->tktflags);
if (rc < 0)
return rc;
rc = get_uint32 (data, len, &num_address);
if (rc < 0)
return rc;
for (; num_address; num_address--)
{
/* XXX Don't just skip data. */
rc = skip_address (data, len);
if (rc < 0)
return rc;
}
rc = get_uint32 (data, len, &num_authdata);
if (rc < 0)
return rc;
for (; num_authdata; num_authdata--)
{
/* XXX Don't just skip data. */
rc = skip_authdata (data, len);
if (rc < 0)
return rc;
}
rc = get_uint32 (data, len, &out->ticket.length);
if (rc < 0)
return rc;
if (*len < out->ticket.length)
return -1;
out->ticket.data = (char *) *data;
*data += out->ticket.length;
*len -= out->ticket.length;
rc = get_uint32 (data, len, &out->second_ticket.length);
if (rc < 0)
return rc;
if (*len < out->second_ticket.length)
return -1;
out->second_ticket.data = (char *) *data;
*data += out->second_ticket.length;
*len -= out->second_ticket.length;
return 0;
}
|
↓
|
shishi_tkt_pretty_print
|
26
|
75
|
102
|
tkt.c
|
void
shishi_tkt_pretty_print (Shishi_tkt * tkt, FILE * fh)
{
char *buf;
char *p;
size_t buflen;
int keytype, etype;
uint32_t flags;
int res;
time_t t;
time_t now = time (NULL);
res = shishi_tkt_clientrealm (tkt, &buf, &buflen);
if (res == SHISHI_OK)
{
fprintf (fh, "%s:\n", buf);
free (buf);
}
else
fprintf (fh, ":\n");
t = shishi_tkt_authctime (tkt);
fprintf (fh, _("Authtime:\t%s"), ctime (&t));
t = shishi_tkt_startctime (tkt);
if (t != (time_t) - 1)
{
p = ctime (&t);
p[strlen (p) - 1] = '\0';
fprintf (fh, _("Starttime:\t%s"), p);
if (t > now)
fprintf (fh, " NOT YET VALID");
fprintf (fh, "\n");
}
t = shishi_tkt_endctime (tkt);
if (t != (time_t) - 1)
{
p = ctime (&t);
p[strlen (p) - 1] = '\0';
fprintf (fh, _("Endtime:\t%s"), p);
if (t < now)
fprintf (fh, " EXPIRED");
fprintf (fh, "\n");
}
t = shishi_tkt_renew_tillc (tkt);
if (t != (time_t) - 1)
fprintf (fh, _("Renewable till:\t%s"), ctime (&t));
res = shishi_tkt_server (tkt, &buf, NULL);
if (res == SHISHI_OK)
{
res = shishi_ticket_get_enc_part_etype (tkt->handle, tkt->ticket,
&keytype);
if (res == SHISHI_OK)
fprintf (fh, _("Server:\t\t%s key %s (%d)\n"), buf,
shishi_cipher_name (keytype), keytype);
free (buf);
}
res = shishi_tkt_keytype (tkt, &keytype);
if (res == SHISHI_OK)
res = shishi_kdcrep_get_enc_part_etype (tkt->handle, tkt->kdcrep, &etype);
if (res == SHISHI_OK)
fprintf (fh, _("Ticket key:\t%s (%d) protected by %s (%d)\n"),
shishi_cipher_name (keytype), keytype,
shishi_cipher_name (etype), etype);
res = shishi_tkt_flags (tkt, &flags);
if (res == SHISHI_OK && flags)
{
fprintf (fh, _("Ticket flags:\t"));
if (shishi_tkt_forwardable_p (tkt))
fprintf (fh, "FORWARDABLE ");
if (shishi_tkt_forwarded_p (tkt))
fprintf (fh, "FORWARDED ");
if (shishi_tkt_proxiable_p (tkt))
fprintf (fh, "PROXIABLE ");
if (shishi_tkt_proxy_p (tkt))
fprintf (fh, "PROXY ");
if (shishi_tkt_may_postdate_p (tkt))
fprintf (fh, "MAYPOSTDATE ");
if (shishi_tkt_postdated_p (tkt))
fprintf (fh, "POSTDATED ");
if (shishi_tkt_invalid_p (tkt))
fprintf (fh, "INVALID ");
if (shishi_tkt_renewable_p (tkt))
fprintf (fh, "RENEWABLE ");
if (shishi_tkt_initial_p (tkt))
fprintf (fh, "INITIAL ");
if (shishi_tkt_pre_authent_p (tkt))
fprintf (fh, "PREAUTHENT ");
if (shishi_tkt_hw_authent_p (tkt))
fprintf (fh, "HWAUTHENT ");
if (shishi_tkt_transited_policy_checked_p (tkt))
fprintf (fh, "TRANSITEDPOLICYCHECKED ");
if (shishi_tkt_ok_as_delegate_p (tkt))
fprintf (fh, "OKASDELEGATE ");
fprintf (fh, "(%d)\n", flags);
}
}
|
↓
|
shishi_keys_add_keytab_mem
|
24
|
104
|
201
|
keytab.c
|
int
shishi_keys_add_keytab_mem (Shishi * handle,
const char *data, size_t len, Shishi_keys * keys)
{
int rc;
uint16_t file_format_version;
size_t entrystartpos;
uint16_t num_components; /* sub 1 if version 0x501 */
size_t i;
Shishi_key *key;
if (VERBOSENOISE (handle))
{
printf ("keytab len %d (0x%x)\n", len, len);
_shishi_hexprint (data, len);
}
/* Check file format. */
file_format_version = (data[0] << 8) | data[1];
if (VERBOSENOISE (handle))
printf ("keytab file_format_version %04X\n", file_format_version);
if (file_format_version != 0x0501 && file_format_version != 0x0502)
return SHISHI_KEYTAB_ERROR;
/* Check file integrity first, to avoid error-checking below. */
entrystartpos = 2;
while (entrystartpos < len)
{
int32_t size = data[entrystartpos] << 24 | data[entrystartpos + 1] << 16
| data[entrystartpos + 2] << 8 | data[entrystartpos + 3];
entrystartpos += 4;
if (VERBOSENOISE (handle))
{
printf ("keytab size %d (%x)\n", size, size);
printf ("keytab pos %d < %d\n", entrystartpos + size, len);
}
if (entrystartpos + size > len)
return SHISHI_KEYTAB_ERROR;
/* Go to next entry... */
entrystartpos += size;
}
if (entrystartpos != len)
return SHISHI_KEYTAB_ERROR;
rc = shishi_key (handle, &key);
if (rc != SHISHI_OK)
return rc;
entrystartpos = 2;
while (entrystartpos < len)
{
size_t pos = entrystartpos;
uint16_t size = data[pos] << 24 | data[pos + 1] << 16
| data[pos + 2] << 8 | data[pos + 3];
pos += 4;
if (VERBOSENOISE (handle))
printf ("keytab size %d (%x)\n", size, size);
/* Num_components */
num_components = data[pos] << 8 | data[pos + 1];
pos += 2;
if (file_format_version == 0x0501)
num_components--;
/* Realm */
{
uint16_t realmlen = data[pos] << 8 | data[pos + 1];
char *realm = xstrndup (&data[pos + 2], realmlen);;
pos += 2 + realmlen;
shishi_key_realm_set (key, realm);
free (realm);
}
/* Principal components. */
{
char *name = NULL;
size_t namelen = 0;
for (i = 0; i < num_components; i++)
{
size_t l;
l = data[pos] << 8 | data[pos + 1];
pos += 2;
name = xrealloc (name, namelen + l + 1);
memcpy (name + namelen, &data[pos], l);
name[namelen + l] = '/';
namelen += l + 1;
pos += l;
}
name[namelen - 1] = '\0';
shishi_key_principal_set (key, name);
free (name);
}
/* Name_type */
{
uint32_t name_type /* not present if version 0x501 */
= data[pos] << 24 | data[pos + 1] << 16
| data[pos + 2] << 8 | data[pos + 3];
pos += 4;
if (VERBOSENOISE (handle))
printf ("keytab nametype %d (0x%08x)\n", name_type, name_type);
}
/* Timestamp */
{
uint32_t timestamp =
((data[pos] << 24) & 0xFF000000)
| ((data[pos + 1] << 16) & 0xFF0000)
| ((data[pos + 2] << 8) & 0xFF00) | ((data[pos + 3] & 0xFF));
time_t t = timestamp;
pos += 4;
if (VERBOSENOISE (handle))
printf ("keytab timestamp %u (0x%08ux)\n", timestamp, timestamp);
shishi_key_timestamp_set (key, t);
}
/* keyvno8 */
{
uint8_t vno8 = data[pos++];
if (VERBOSENOISE (handle))
printf ("keytab kvno8 %d (0x%02x)\n", vno8, vno8);
shishi_key_version_set (key, vno8);
}
/* key, keytype */
{
uint32_t keytype = data[pos] << 8 | data[pos + 1];
pos += 2;
if (VERBOSENOISE (handle))
printf ("keytab keytype %d (0x%x)\n", keytype, keytype);
shishi_key_type_set (key, keytype);
}
/* key, length and data */
{
uint16_t keylen = data[pos] << 8 | data[pos + 1];
pos += 2;
if (VERBOSENOISE (handle))
printf ("keytab keylen %d (0x%x) eq? %d\n", keylen, keylen,
shishi_key_length (key));
if (VERBOSENOISE (handle))
_shishi_hexprint (data + pos, keylen);
shishi_key_value_set (key, data + pos);
pos += keylen;
}
if (pos - entrystartpos < (size_t) size + 4)
{
uint32_t vno /* only present if >= 4 bytes left in entry */
= data[pos] << 24 | data[pos + 1] << 16
| data[pos + 2] << 8 | data[pos + 3];
pos += 4;
if (VERBOSENOISE (handle))
printf ("keytab kvno %d (0x%08x)\n", vno, vno);
shishi_key_version_set (key, vno);
}
if (VERBOSECRYPTONOISE (handle))
shishi_key_print (handle, stdout, key);
rc = shishi_keys_add (keys, key);
if (rc != SHISHI_OK)
goto done;
/* Go to next entry... */
entrystartpos += size + 4;
}
rc = SHISHI_OK;
done:
shishi_key_done (key);
return rc;
}
|
↓
|
_shishi_sendrecv_tls1
|
22
|
75
|
141
|
starttls.c
|
static int
_shishi_sendrecv_tls1 (Shishi * handle,
int sockfd,
gnutls_session session,
const char *indata, size_t inlen,
char **outdata, size_t * outlen,
size_t timeout, bool have_cas)
{
int ret;
ssize_t bytes_sent, bytes_read;
char extbuf[STARTTLS_LEN + 1];
static size_t session_data_size = 0;
static void *session_data = NULL;
char tmpbuf[4];
unsigned int status;
bytes_sent = write (sockfd, STARTTLS_CLIENT_REQUEST, STARTTLS_LEN);
if (bytes_sent != STARTTLS_LEN)
return SHISHI_SENDTO_ERROR;
bytes_read = read (sockfd, extbuf, sizeof (extbuf));
if (bytes_read != STARTTLS_LEN ||
memcmp (extbuf, STARTTLS_SERVER_ACCEPT, STARTTLS_LEN) != 0)
return SHISHI_RECVFROM_ERROR;
gnutls_transport_set_ptr (session, (gnutls_transport_ptr)
(unsigned long) sockfd);
if (session_data_size > 0)
gnutls_session_set_data (session, session_data, session_data_size);
ret = gnutls_handshake (session);
if (ret < 0)
{
shishi_error_printf (handle, "TLS handshake failed (%d): %s",
ret, gnutls_strerror (ret));
return SHISHI_RECVFROM_ERROR;
}
if (gnutls_session_is_resumed (session) != 0)
shishi_error_printf (handle, "TLS handshake completed (resumed)");
else
shishi_error_printf (handle, "TLS handshake completed (not resumed)");
if (have_cas)
{
ret = gnutls_certificate_verify_peers2 (session, &status);
if (ret != 0 || status != 0)
{
shishi_error_printf (handle,
"TLS verification of CA failed (%d/%d)", ret,
status);
return SHISHI_RECVFROM_ERROR;
}
/* XXX: We need to verify the CA cert further here. */
}
if (session_data_size == 0)
{
ret = gnutls_session_get_data (session, NULL, &session_data_size);
if (ret < 0)
{
shishi_error_printf (handle, "TLS gsgd(1) failed (%d): %s",
ret, gnutls_strerror (ret));
return SHISHI_RECVFROM_ERROR;
}
session_data = xmalloc (session_data_size);
ret = gnutls_session_get_data (session, session_data,
&session_data_size);
if (ret < 0)
{
shishi_error_printf (handle, "TLS gsgd(2) failed (%d): %s",
ret, gnutls_strerror (ret));
return SHISHI_RECVFROM_ERROR;
}
}
tmpbuf[3] = inlen & 0xFF;
tmpbuf[2] = (inlen >> 8) & 0xFF;
tmpbuf[1] = (inlen >> 16) & 0xFF;
tmpbuf[0] = (inlen >> 24) & 0xFF;
bytes_sent = gnutls_record_send (session, tmpbuf, 4);
if (bytes_sent != 4)
{
shishi_error_printf (handle, "Bad TLS write (%d < 4)", bytes_sent);
return SHISHI_SENDTO_ERROR;
}
bytes_sent = gnutls_record_send (session, indata, inlen);
if (bytes_sent != (ssize_t) inlen)
{
shishi_error_printf (handle, "Bad TLS write (%d < %d)",
bytes_sent, inlen);
return SHISHI_SENDTO_ERROR;
}
bytes_read = gnutls_record_recv (session, tmpbuf, 4);
if (bytes_read != 4)
{
shishi_error_printf (handle, "Bad TLS read (%d < 4)", bytes_read);
return SHISHI_SENDTO_ERROR;
}
/* XXX sanities input. */
*outlen = C2I (tmpbuf);
*outdata = xmalloc (*outlen);
bytes_read = gnutls_record_recv (session, *outdata, *outlen);
if (bytes_read == 0)
{
shishi_error_printf (handle, "Peer has closed the TLS connection");
free (*outdata);
return SHISHI_RECVFROM_ERROR;
}
else if (bytes_read < 0)
{
shishi_error_printf (handle, "TLS Error (%d): %s",
ret, gnutls_strerror (ret));
free (*outdata);
return SHISHI_RECVFROM_ERROR;
}
else if (bytes_read != (ssize_t) * outlen)
{
shishi_error_printf (handle, "TLS Read error (%d != %d)",
*outlen, bytes_read);
free (*outdata);
return SHISHI_RECVFROM_ERROR;
}
do
ret = gnutls_bye (session, GNUTLS_SHUT_RDWR);
while (ret == GNUTLS_E_INTERRUPTED || ret == GNUTLS_E_AGAIN);
if (ret != GNUTLS_E_SUCCESS)
shishi_error_printf (handle, "TLS Disconnected failed (%d): %s",
ret, gnutls_strerror (ret));
return SHISHI_OK;
}
|
↓
|
des_string_to_key
|
22
|
117
|
179
|
crypto-des.c
|
static int
des_string_to_key (Shishi * handle,
const char *string,
size_t stringlen,
const char *salt,
size_t saltlen, const char *parameter, Shishi_key * outkey)
{
char *s;
int n_s;
int odd;
char tempkey[8];
char *p;
int i, j;
char temp, temp2;
int res;
if (VERBOSECRYPTO (handle))
{
printf ("des_string_to_key (string, salt)\n");
printf ("\t ;; String:\n");
_shishi_escapeprint (string, stringlen);
_shishi_hexprint (string, stringlen);
printf ("\t ;; Salt:\n");
_shishi_escapeprint (salt, saltlen);
_shishi_hexprint (salt, saltlen);
}
if (VERBOSECRYPTONOISE (handle))
{
printf ("odd = 1;\n");
printf ("s = string | salt;\n");
printf ("tempstring = 0; /* 56-bit string */\n");
printf ("pad(s); /* with nulls to 8 byte boundary */\n");
}
odd = 1;
n_s = stringlen + saltlen;
if ((n_s % 8) != 0)
n_s += 8 - n_s % 8;
s = xmalloc (n_s);
memcpy (s, string, stringlen);
if (saltlen > 0)
memcpy (s + stringlen, salt, saltlen);
memset (s + stringlen + saltlen, 0, n_s - stringlen - saltlen);
memset (tempkey, 0, sizeof (tempkey)); /* tempkey = NULL; */
if (VERBOSECRYPTONOISE (handle))
{
printf ("\t ;; s = pad(string|salt):\n");
_shishi_escapeprint (s, n_s);
_shishi_hexprint (s, n_s);
}
for (i = 0; i < n_s / 8; i++)
{
if (VERBOSECRYPTONOISE (handle))
{
printf ("for (8byteblock in s) {\n");
printf ("\t ;; loop iteration %d\n", i);
printf ("\t ;; 8byteblock:\n");
_shishi_escapeprint (&s[i * 8], 8);
_shishi_hexprint (&s[i * 8], 8);
_shishi_binprint (&s[i * 8], 8);
printf ("56bitstring = removeMSBits(8byteblock);\n");
}
for (j = 0; j < 8; j++)
s[i * 8 + j] = s[i * 8 + j] & ~0x80;
if (VERBOSECRYPTONOISE (handle))
{
printf ("\t ;; 56bitstring:\n");
_shishi_bin7print (&s[i * 8], 8);
printf ("if (odd == 0) reverse(56bitstring);\t ;; odd=%d\n", odd);
}
if (odd == 0)
{
for (j = 0; j < 4; j++)
{
temp = s[i * 8 + j];
temp =
((temp >> 6) & 0x01) |
((temp >> 4) & 0x02) |
((temp >> 2) & 0x04) |
((temp) & 0x08) |
((temp << 2) & 0x10) |
((temp << 4) & 0x20) | ((temp << 6) & 0x40);
temp2 = s[i * 8 + 7 - j];
temp2 =
((temp2 >> 6) & 0x01) |
((temp2 >> 4) & 0x02) |
((temp2 >> 2) & 0x04) |
((temp2) & 0x08) |
((temp2 << 2) & 0x10) |
((temp2 << 4) & 0x20) | ((temp2 << 6) & 0x40);
s[i * 8 + j] = temp2;
s[i * 8 + 7 - j] = temp;
}
if (VERBOSECRYPTONOISE (handle))
{
printf ("reverse(56bitstring)\n");
printf ("\t ;; 56bitstring after reverse\n");
_shishi_bin7print (&s[i * 8], 8);
}
}
odd = !odd;
if (VERBOSECRYPTONOISE (handle))
{
printf ("odd = ! odd\n");
printf ("tempstring = tempstring XOR 56bitstring;\n");
}
/* tempkey = tempkey XOR 8byteblock; */
for (j = 0; j < 8; j++)
tempkey[j] ^= s[i * 8 + j];
if (VERBOSECRYPTONOISE (handle))
{
printf ("\t ;; tempstring\n");
_shishi_bin7print (tempkey, 8);
}
}
for (j = 0; j < 8; j++)
tempkey[j] = tempkey[j] << 1;
if (VERBOSECRYPTONOISE (handle))
{
printf ("for (8byteblock in s) {\n");
printf ("}\n");
printf ("\t ;; for loop terminated\n");
printf ("\t ;; tempstring as 64bitblock\n");
_shishi_hexprint (tempkey, 8);
_shishi_binprint (tempkey, 8);
printf ("/* add parity as low bit of each byte */\n");
printf ("tempkey = key_correction(add_parity_bits(tempstring));\n");
}
des_key_correction (handle, tempkey);
if (VERBOSECRYPTONOISE (handle))
{
printf ("\t ;; tempkey\n");
_shishi_escapeprint (tempkey, 8);
_shishi_hexprint (tempkey, 8);
_shishi_binprint (tempkey, 8);
printf ("key = key_correction(DES-CBC-check(s,tempkey));\n");
}
memcpy (s, string, stringlen);
if (saltlen > 0)
memcpy (s + stringlen, salt, saltlen);
memset (s + stringlen + saltlen, 0, n_s - stringlen - saltlen);
res = shishi_des_cbc_mac (handle, tempkey, tempkey, s, n_s, &p);
if (res != SHISHI_OK)
return res;
free (s);
memcpy (tempkey, p, 8);
free (p);
des_key_correction (handle, tempkey);
if (VERBOSECRYPTO (handle))
{
printf ("\t ;; key\n");
_shishi_escapeprint (tempkey, 8);
_shishi_hexprint (tempkey, 8);
_shishi_binprint (tempkey, 8);
}
shishi_key_value_set (outkey, tempkey);
return SHISHI_OK;
}
|
↓
|
shishi_tkt_to_ccache_mem
|
21
|
86
|
149
|
tktccache.c
|
int
shishi_tkt_to_ccache_mem (Shishi * handle,
Shishi_tkt * tkt, char **data, size_t * len)
{
#if 0
struct ccache_credential cred;
char tmp[1024];
size_t i;
int rc;
memset (&cred, 0, sizeof (cred));
rc = shishi_asn1_to_der (handle, shishi_tkt_ticket (tkt),
&cred.ticket.data, &cred.ticket.length);
if (rc != SHISHI_OK)
return rc;
/* Sanity check credential first. */
if (shishi_key_length (shishi_tkt_key (tkt)) > CCACHE_MAX_KEYLEN)
return SHISHI_CCACHE_ERROR;
rc = shishi_asn1_read (handle, shishi_tkt_kdcrep (tkt), "crealm",
&cred.client.realm.data, &cred.client.realm.length);
if (rc != SHISHI_OK)
return rc;
rc = shishi_asn1_read (handle, shishi_tkt_enckdcreppart (tkt), "srealm",
&cred.server.realm.data, &cred.server.realm.length);
if (rc != SHISHI_OK)
return rc;
return SHISHI_OK;
#if 0
{
char *cname[CCACHE_MAX_COMPONENTS + 1];
size_t i;
for (i = 0; i < cred.client.num_components
&& i < CCACHE_MAX_COMPONENTS; i++)
cname[i] = cred.client.components[i].data;
cname[i] = NULL;
rc = shishi_kdcrep_crealm_set (handle,
shishi_tkt_kdcrep (tkt),
cred.client.realm.data);
if (rc != SHISHI_OK)
return rc;
rc = shishi_kdcrep_cname_set (handle,
shishi_tkt_kdcrep (tkt),
cred.client.name_type, cname);
if (rc != SHISHI_OK)
return rc;
}
{
char *sname[CCACHE_MAX_COMPONENTS + 1];
size_t i;
for (i = 0; i < cred.server.num_components
&& i < CCACHE_MAX_COMPONENTS; i++)
sname[i] = cred.server.components[i].data;
sname[i] = NULL;
rc = shishi_enckdcreppart_srealm_set (handle,
shishi_tkt_enckdcreppart (tkt),
cred.server.realm.data);
if (rc != SHISHI_OK)
return rc;
rc = shishi_enckdcreppart_sname_set (handle,
shishi_tkt_enckdcreppart (tkt),
cred.server.name_type, sname);
if (rc != SHISHI_OK)
return rc;
}
#endif
rc = shishi_tkt_flags (tkt, &cred.tktflags);
if (rc != SHISHI_OK)
return rc;
{
time_t t;
rc = shishi_ctime (handle, shishi_tkt_enckdcreppart (tkt),
"authtime", &t);
if (rc != SHISHI_OK)
return rc;
cred.authtime = t;
}
{
time_t t;
rc = shishi_ctime (handle, shishi_tkt_enckdcreppart (tkt),
"starttime", &t);
if (rc == SHISHI_ASN1_NO_ELEMENT)
cred.starttime = 0;
else if (rc != SHISHI_OK)
return rc;
cred.starttime = t;
}
{
time_t t;
rc = shishi_ctime (handle, shishi_tkt_enckdcreppart (tkt), "endtime", &t);
if (rc != SHISHI_OK)
return rc;
cred.endtime = t;
}
{
time_t t;
rc = shishi_ctime (handle, shishi_tkt_enckdcreppart (tkt),
"renew-till", &t);
if (rc == SHISHI_ASN1_NO_ELEMENT)
cred.renew_till = 0;
else if (rc != SHISHI_OK)
return rc;
cred.renew_till = t;
}
cred.key.keylen = shishi_key_length (shishi_tkt_key (tkt));
cred.key.keytype = shishi_key_type (shishi_tkt_key (tkt));
memcpy (cred.key.storage, shishi_key_value (shishi_tkt_key (tkt)),
shishi_key_length (shishi_tkt_key (tkt)));
cred.key.keyvalue = &cred.key.storage[0];
i = 1024;
rc = ccache_pack_credential (&cred, tmp, &i);
printf ("rc %d len %d\n", rc, i);
{
struct ccache_credential foo;
size_t n;
rc = ccache_parse_credential (tmp, i, &foo, &n);
if (rc < 0)
return SHISHI_CCACHE_ERROR;
printf ("packed:");
ccache_print_credential (&foo);
}
_shishi_escapeprint (tmp, i);
#endif
return SHISHI_CCACHE_ERROR;
}
|
↓
|
shishi_kdcrep_get_ticket
|
21
|
75
|
111
|
kdcrep.c
|
int
shishi_kdcrep_get_ticket (Shishi * handle,
Shishi_asn1 kdcrep, Shishi_asn1 * ticket)
{
char *buf;
char *format;
size_t buflen;
int res;
size_t i, n;
/* there's GOT to be an easier way to do this */
*ticket = shishi_ticket (handle);
if (!*ticket)
return SHISHI_ASN1_ERROR;
res = shishi_asn1_read (handle, kdcrep, "ticket.tkt-vno", &buf, &buflen);
if (res != SHISHI_OK)
goto error;
res = shishi_asn1_write (handle, *ticket, "tkt-vno", buf, buflen);
free (buf);
if (res != SHISHI_OK)
goto error;
res = shishi_asn1_read (handle, kdcrep, "ticket.realm", &buf, &buflen);
if (res != SHISHI_OK)
goto error;
res = shishi_asn1_write (handle, *ticket, "realm", buf, buflen);
free (buf);
if (res != SHISHI_OK)
goto error;
res = shishi_asn1_read (handle, kdcrep, "ticket.sname.name-type",
&buf, &buflen);
if (res != SHISHI_OK)
goto error;
res = shishi_asn1_write (handle, *ticket, "sname.name-type", buf, buflen);
free (buf);
if (res != SHISHI_OK)
goto error;
res = shishi_asn1_number_of_elements (handle, kdcrep,
"ticket.sname.name-string", &n);
if (res != SHISHI_OK)
goto error;
for (i = 1; i <= n; i++)
{
res = shishi_asn1_write (handle, *ticket, "sname.name-string",
"NEW", 1);
if (res != SHISHI_OK)
goto error;
format = xasprintf ("ticket.sname.name-string.?%d", i);
res = shishi_asn1_read (handle, kdcrep, format, &buf, &buflen);
free (format);
if (res != SHISHI_OK)
goto error;
format = xasprintf ("sname.name-string.?%d", i);
res = shishi_asn1_write (handle, *ticket, format, buf, buflen);
free (format);
free (buf);
if (res != SHISHI_OK)
goto error;
}
res = shishi_asn1_read (handle, kdcrep, "ticket.enc-part.etype",
&buf, &buflen);
if (res != SHISHI_OK)
goto error;
res = shishi_asn1_write (handle, *ticket, "enc-part.etype", buf, buflen);
free (buf);
if (res != SHISHI_OK)
goto error;
res = shishi_asn1_read (handle, kdcrep, "ticket.enc-part.kvno",
&buf, &buflen);
if (res != SHISHI_OK && res != SHISHI_ASN1_NO_ELEMENT)
goto error;
if (res == SHISHI_ASN1_NO_ELEMENT)
res = shishi_asn1_write (handle, *ticket, "enc-part.kvno", NULL, 0);
else
{
res = shishi_asn1_write (handle, *ticket, "enc-part.kvno", buf, buflen);
free (buf);
}
if (res != SHISHI_OK)
goto error;
res = shishi_asn1_read (handle, kdcrep, "ticket.enc-part.cipher",
&buf, &buflen);
if (res != SHISHI_OK)
goto error;
res = shishi_asn1_write (handle, *ticket, "enc-part.cipher", buf, buflen);
free (buf);
if (res != SHISHI_OK)
goto error;
return SHISHI_OK;
error:
shishi_asn1_done (handle, *ticket);
return res;
}
|
↓
|
shishi_apreq_get_ticket
|
21
|
74
|
110
|
apreq.c
|
int
shishi_apreq_get_ticket (Shishi * handle,
Shishi_asn1 apreq, Shishi_asn1 * ticket)
{
char *buf;
char *format;
size_t buflen, i, n;
int res;
/* there's GOT to be an easier way to do this */
*ticket = shishi_ticket (handle);
if (!*ticket)
return SHISHI_ASN1_ERROR;
res = shishi_asn1_read (handle, apreq, "ticket.tkt-vno", &buf, &buflen);
if (res != SHISHI_OK)
goto error;
res = shishi_asn1_write (handle, *ticket, "tkt-vno", buf, buflen);
free (buf);
if (res != SHISHI_OK)
goto error;
res = shishi_asn1_read (handle, apreq, "ticket.realm", &buf, &buflen);
if (res != SHISHI_OK)
goto error;
res = shishi_asn1_write (handle, *ticket, "realm", buf, buflen);
free (buf);
if (res != SHISHI_OK)
goto error;
res = shishi_asn1_read (handle, apreq, "ticket.sname.name-type",
&buf, &buflen);
if (res != SHISHI_OK)
goto error;
res = shishi_asn1_write (handle, *ticket, "sname.name-type", buf, buflen);
free (buf);
if (res != SHISHI_OK)
goto error;
res = shishi_asn1_number_of_elements (handle, apreq,
"ticket.sname.name-string", &n);
if (res != SHISHI_OK)
goto error;
for (i = 1; i <= n; i++)
{
res = shishi_asn1_write (handle, *ticket, "sname.name-string",
"NEW", 1);
if (res != SHISHI_OK)
goto error;
asprintf (&format, "ticket.sname.name-string.?%d", i);
res = shishi_asn1_read (handle, apreq, format, &buf, &buflen);
free (format);
if (res != SHISHI_OK)
goto error;
asprintf (&format, "sname.name-string.?%d", i);
res = shishi_asn1_write (handle, *ticket, format, buf, buflen);
free (format);
free (buf);
if (res != SHISHI_OK)
goto error;
}
res = shishi_asn1_read (handle, apreq, "ticket.enc-part.etype",
&buf, &buflen);
if (res != SHISHI_OK)
goto error;
res = shishi_asn1_write (handle, *ticket, "enc-part.etype", buf, buflen);
free (buf);
if (res != SHISHI_OK)
goto error;
res = shishi_asn1_read (handle, apreq, "ticket.enc-part.kvno",
&buf, &buflen);
if (res != SHISHI_OK && res != SHISHI_ASN1_NO_ELEMENT)
goto error;
if (res == SHISHI_ASN1_NO_ELEMENT)
res = shishi_asn1_write (handle, *ticket, "enc-part.kvno", NULL, 0);
else
{
res = shishi_asn1_write (handle, *ticket, "enc-part.kvno", buf, buflen);
free (buf);
}
if (res != SHISHI_OK)
goto error;
res = shishi_asn1_read (handle, apreq, "ticket.enc-part.cipher",
&buf, &buflen);
if (res != SHISHI_OK)
goto error;
res = shishi_asn1_write (handle, *ticket, "enc-part.cipher", buf, buflen);
free (buf);
if (res != SHISHI_OK)
goto error;
return SHISHI_OK;
error:
shishi_asn1_done (handle, *ticket);
return res;
}
|
↓
|
act_hint_on_kdcreq
|
21
|
48
|
99
|
tkts.c
|
static int
act_hint_on_kdcreq (Shishi * handle,
Shishi_tkts_hint * hint, Shishi_asn1 kdcreq)
{
time_t starttime = hint->starttime ? hint->starttime : time (NULL);
time_t endtime = hint->endtime ? hint->endtime :
starttime + handle->ticketlife;
time_t renew_till = hint->renew_till ? hint->renew_till :
starttime + handle->renewlife;
int rc;
if (hint->starttime)
{
rc = shishi_asn1_write (handle, kdcreq, "req-body.from",
shishi_generalize_time (handle, starttime), 0);
if (rc != SHISHI_OK)
{
shishi_error_printf (handle, "Cannot set starttime: %s",
shishi_strerror (rc));
return rc;
}
}
if (hint->endtime)
{
rc = shishi_asn1_write (handle, kdcreq, "req-body.till",
shishi_generalize_time (handle, endtime), 0);
if (rc != SHISHI_OK)
{
shishi_error_printf (handle, "Cannot set endtime: %s",
shishi_strerror (rc));
return rc;
}
}
if (hint->tktflags & SHISHI_TICKETFLAGS_FORWARDABLE)
{
rc = shishi_kdcreq_options_add (handle, kdcreq,
SHISHI_KDCOPTIONS_FORWARDABLE);
if (rc != SHISHI_OK)
goto done;
}
if (hint->tktflags & SHISHI_TICKETFLAGS_FORWARDED)
{
rc = shishi_kdcreq_options_add (handle, kdcreq,
SHISHI_KDCOPTIONS_FORWARDED);
if (rc != SHISHI_OK)
goto done;
}
if (hint->tktflags & SHISHI_TICKETFLAGS_RENEWABLE)
{
rc = shishi_kdcreq_options_add (handle, kdcreq,
SHISHI_KDCOPTIONS_RENEWABLE);
if (rc != SHISHI_OK)
goto done;
rc = shishi_asn1_write (handle, kdcreq, "req-body.rtime",
shishi_generalize_time (handle, renew_till), 0);
if (rc != SHISHI_OK)
{
shishi_error_printf (handle, "Cannot set renewtill: %s",
shishi_strerror (rc));
return rc;
}
}
if (hint->tktflags & SHISHI_TICKETFLAGS_PROXIABLE)
{
rc = shishi_kdcreq_options_add (handle, kdcreq,
SHISHI_KDCOPTIONS_PROXIABLE);
if (rc != SHISHI_OK)
goto done;
}
if (hint->tktflags & SHISHI_TICKETFLAGS_PROXY)
{
rc = shishi_kdcreq_options_add (handle, kdcreq,
SHISHI_KDCOPTIONS_PROXY);
if (rc != SHISHI_OK)
goto done;
}
if (hint->etype)
{
rc = shishi_kdcreq_set_etype (handle, kdcreq, &hint->etype, 1);
if (rc != SHISHI_OK)
goto done;
}
return SHISHI_OK;
done:
shishi_error_printf (handle, "Cannot set KDC Options: %s",
shishi_strerror (rc));
return rc;
}
|
↓
|
shishi_apreq_set_ticket
|
20
|
69
|
100
|
apreq.c
|
int
shishi_apreq_set_ticket (Shishi * handle, Shishi_asn1 apreq,
Shishi_asn1 ticket)
{
int res;
char *format;
char *buf;
size_t buflen, i, n;
res = shishi_asn1_read (handle, ticket, "tkt-vno", &buf, &buflen);
if (res != SHISHI_OK)
return res;
res = shishi_asn1_write (handle, apreq, "ticket.tkt-vno", buf, buflen);
free (buf);
if (res != SHISHI_OK)
return res;
res = shishi_asn1_read (handle, ticket, "realm", &buf, &buflen);
if (res != SHISHI_OK)
return res;
res = shishi_asn1_write (handle, apreq, "ticket.realm", buf, buflen);
free (buf);
if (res != SHISHI_OK)
return res;
res = shishi_asn1_read (handle, ticket, "sname.name-type", &buf, &buflen);
if (res != SHISHI_OK)
return res;
res = shishi_asn1_write (handle, apreq, "ticket.sname.name-type",
buf, buflen);
free (buf);
if (res != SHISHI_OK)
return res;
res = shishi_asn1_number_of_elements (handle, ticket,
"sname.name-string", &n);
if (res != SHISHI_OK)
return res;
for (i = 1; i <= n; i++)
{
res = shishi_asn1_write (handle, apreq,
"ticket.sname.name-string", "NEW", 1);
if (res != SHISHI_OK)
return res;
asprintf (&format, "sname.name-string.?%d", i);
res = shishi_asn1_read (handle, ticket, format, &buf, &buflen);
free (format);
if (res != SHISHI_OK)
return res;
asprintf (&format, "ticket.sname.name-string.?%d", i);
res = shishi_asn1_write (handle, apreq, format, buf, buflen);
free (format);
free (buf);
if (res != SHISHI_OK)
return res;
}
res = shishi_asn1_read (handle, ticket, "enc-part.etype", &buf, &buflen);
if (res != SHISHI_OK)
return res;
res = shishi_asn1_write (handle, apreq, "ticket.enc-part.etype",
buf, buflen);
free (buf);
if (res != SHISHI_OK)
return res;
res = shishi_asn1_read (handle, ticket, "enc-part.kvno", &buf, &buflen);
if (res != SHISHI_OK && res != SHISHI_ASN1_NO_ELEMENT)
return res;
if (res == SHISHI_ASN1_NO_ELEMENT)
res = shishi_asn1_write (handle, apreq, "ticket.enc-part.kvno", NULL, 0);
else
{
res = shishi_asn1_write (handle, apreq, "ticket.enc-part.kvno",
buf, buflen);
free (buf);
}
if (res != SHISHI_OK)
return res;
res = shishi_asn1_read (handle, ticket, "enc-part.cipher", &buf, &buflen);
if (res != SHISHI_OK)
return res;
res = shishi_asn1_write (handle, apreq, "ticket.enc-part.cipher",
buf, buflen);
free (buf);
if (res != SHISHI_OK)
return res;
return SHISHI_OK;
}
|
↓
|
shishi_key_parse
|
20
|
51
|
88
|
diskio.c
|
int
shishi_key_parse (Shishi * handle, FILE * fh, Shishi_key ** key)
{
int lno = 0;
char line[BUFSIZE];
char *b64buffer;
char armorbegin[BUFSIZE];
char armorend[BUFSIZE];
int in_key = 0, in_body = 0;
int res;
Shishi_key *lkey = NULL;
sprintf (armorbegin, HEADERBEG, "KEY");
sprintf (armorend, HEADEREND, "KEY");
while (fgets (line, sizeof (line), fh))
{
lno++;
line[sizeof (line) - 1] = '\0';
if (!*line || line[strlen (line) - 1] != '\n')
{
fprintf (stderr, "input line %u too long or missing LF\n", lno);
continue;
}
line[strlen (line) - 1] = '\0';
if (VERBOSENOISE (handle))
printf ("line %d read %ld bytes: %s\n", lno, strlen (line), line);
if (!in_key)
{
in_key = strncmp (line, armorbegin, strlen (armorbegin)) == 0;
if (in_key)
{
res = shishi_key (handle, &lkey);
if (res != SHISHI_OK)
return res;
}
continue;
}
if (strcmp (line, armorend) == 0)
break;
if (in_body)
{
int ok =
base64_decode_alloc (line, strlen (line), &b64buffer, NULL);
if (!ok)
return SHISHI_BASE64_ERROR;
shishi_key_value_set (lkey, b64buffer);
}
else
{
if (strcmp (line, "") == 0 || strcmp (line, " ") == 0)
in_body = 1;
if (strncmp (line, "Keytype: ", strlen ("Keytype: ")) == 0)
{
int type;
if (sscanf (line, "Keytype: %d (", &type) == 1)
shishi_key_type_set (lkey, type);
}
else if (strncmp (line, "Key-Version-Number: ",
strlen ("Key-Version-Number: ")) == 0)
{
int type;
if (sscanf (line, "Key-Version-Number: %d", &type) == 1)
shishi_key_version_set (lkey, type);
}
else if (strncmp (line, "Realm: ", strlen ("Realm: ")) == 0)
{
shishi_key_realm_set (lkey, line + strlen ("Realm: "));
}
else if (strncmp (line, "Principal: ", strlen ("Principal: ")) == 0)
{
shishi_key_principal_set (lkey, line + strlen ("Principal: "));
}
}
}
if (!lkey)
return SHISHI_OK;
*key = lkey;
return SHISHI_OK;
}
|
↓
|
_shishi_sendrecv_tls
|
19
|
68
|
131
|
starttls.c
|
int
_shishi_sendrecv_tls (Shishi * handle,
struct addrinfo *ai,
const char *indata, size_t inlen,
char **outdata, size_t * outlen)
{
gnutls_session session;
gnutls_anon_client_credentials anoncred;
gnutls_certificate_credentials x509cred;
int sockfd;
int ret, outerr;
const char *cafile = shishi_x509ca_default_file (handle);
const char *certfile = shishi_x509cert_default_file (handle);
const char *keyfile = shishi_x509key_default_file (handle);
bool have_cas = false;
sockfd = socket (ai->ai_family, ai->ai_socktype, ai->ai_protocol);
if (sockfd < 0)
{
shishi_error_set (handle, strerror (errno));
return SHISHI_SOCKET_ERROR;
}
if (connect (sockfd, ai->ai_addr, ai->ai_addrlen) != 0)
{
shishi_error_set (handle, strerror (errno));
close (sockfd);
return SHISHI_BIND_ERROR;
}
ret = gnutls_init (&session, GNUTLS_CLIENT);
if (ret != GNUTLS_E_SUCCESS)
{
shishi_error_printf (handle, "TLS init failed (%d): %s",
ret, gnutls_strerror (ret));
return SHISHI_CRYPTO_ERROR;
}
ret = gnutls_priority_set_direct (session, "NORMAL:+ANON-DH", NULL);
if (ret != GNUTLS_E_SUCCESS)
{
shishi_error_printf (handle, "TLS psd failed (%d): %s",
ret, gnutls_strerror (ret));
return SHISHI_CRYPTO_ERROR;
}
ret = gnutls_anon_allocate_client_credentials (&anoncred);
if (ret != GNUTLS_E_SUCCESS)
{
shishi_error_printf (handle, "TLS aacs failed (%d): %s",
ret, gnutls_strerror (ret));
return SHISHI_CRYPTO_ERROR;
}
ret = gnutls_credentials_set (session, GNUTLS_CRD_ANON, anoncred);
if (ret != GNUTLS_E_SUCCESS)
{
shishi_error_printf (handle, "TLS cs failed (%d): %s",
ret, gnutls_strerror (ret));
return SHISHI_CRYPTO_ERROR;
}
ret = gnutls_certificate_allocate_credentials (&x509cred);
if (ret != GNUTLS_E_SUCCESS)
{
shishi_error_printf (handle, "TLS cac failed (%d): %s",
ret, gnutls_strerror (ret));
return SHISHI_CRYPTO_ERROR;
}
ret = gnutls_certificate_set_x509_trust_file (x509cred, cafile,
GNUTLS_X509_FMT_PEM);
if (ret != GNUTLS_E_SUCCESS && ret != GNUTLS_E_FILE_ERROR)
{
shishi_error_printf (handle, "TLS csxtf failed (%d): %s",
ret, gnutls_strerror (ret));
return SHISHI_CRYPTO_ERROR;
}
else if (ret == GNUTLS_E_SUCCESS)
{
shishi_error_printf (handle, "Loaded CA certificate");
have_cas = true;
}
ret = gnutls_certificate_set_x509_key_file (x509cred, certfile,
keyfile, GNUTLS_X509_FMT_PEM);
if (ret != GNUTLS_E_SUCCESS && ret != GNUTLS_E_FILE_ERROR)
{
shishi_error_printf (handle, "TLS csxkf failed (%d): %s",
ret, gnutls_strerror (ret));
return SHISHI_CRYPTO_ERROR;
}
else if (ret == GNUTLS_E_SUCCESS)
shishi_error_printf (handle, "Loaded client certificate");
ret = gnutls_credentials_set (session, GNUTLS_CRD_CERTIFICATE, x509cred);
if (ret != GNUTLS_E_SUCCESS)
{
shishi_error_printf (handle, "TLS cs X.509 failed (%d): %s",
ret, gnutls_strerror (ret));
return SHISHI_CRYPTO_ERROR;
}
/* Core part. */
outerr = _shishi_sendrecv_tls1 (handle, sockfd, session, indata, inlen,
outdata, outlen, handle->kdctimeout,
have_cas);
ret = shutdown (sockfd, SHUT_RDWR);
if (ret != 0)
{
shishi_error_printf (handle, "Shutdown failed (%d): %s",
ret, strerror (errno));
if (outerr == SHISHI_OK)
outerr = SHISHI_CLOSE_ERROR;
}
ret = close (sockfd);
if (ret != 0)
{
shishi_error_printf (handle, "Close failed (%d): %s",
ret, strerror (errno));
if (outerr == SHISHI_OK)
outerr = SHISHI_CLOSE_ERROR;
}
gnutls_deinit (session);
gnutls_anon_free_client_credentials (anoncred);
return outerr;
}
|
↓
|
pack_credential
|
19
|
62
|
89
|
ccache.c
|
static int
pack_credential (struct ccache_credential *cred, char **out, size_t * len)
{
int rc;
rc = pack_principal (&cred->client, out, len);
if (rc < 0)
return rc;
rc = pack_principal (&cred->server, out, len);
if (rc < 0)
return rc;
rc = put_uint16 (cred->key.keytype, out, len);
if (rc < 0)
return rc;
rc = put_uint16 (cred->key.etype, out, len);
if (rc < 0)
return rc;
rc = put_uint16 (cred->key.keylen, out, len);
if (rc < 0)
return rc;
if (*len < cred->key.keylen)
return -1;
memcpy (*out, cred->key.keyvalue, cred->key.keylen);
*out += cred->key.keylen;
*len -= cred->key.keylen;
rc = put_uint32 (cred->authtime, out, len);
if (rc < 0)
return rc;
rc = put_uint32 (cred->starttime, out, len);
if (rc < 0)
return rc;
rc = put_uint32 (cred->endtime, out, len);
if (rc < 0)
return rc;
rc = put_uint32 (cred->renew_till, out, len);
if (rc < 0)
return rc;
rc = put_uint8 (0, out, len);
if (rc < 0)
return rc;
rc = put_uint32_swapped (cred->tktflags, out, len);
if (rc < 0)
return rc;
/* XXX Write addresses. */
rc = put_uint32 (0, out, len);
if (rc < 0)
return rc;
/* XXX Write auth-data. */
rc = put_uint32 (0, out, len);
if (rc < 0)
return rc;
rc = put_uint32 (cred->ticket.length, out, len);
if (rc < 0)
return rc;
if (*len < cred->ticket.length)
return -1;
memcpy (*out, cred->ticket.data, cred->ticket.length);
*out += cred->ticket.length;
*len -= cred->ticket.length;
rc = put_uint32 (cred->second_ticket.length, out, len);
if (rc < 0)
return rc;
if (*len < cred->second_ticket.length)
return -1;
memcpy (*out, cred->second_ticket.data, cred->second_ticket.length);
*out += cred->second_ticket.length;
*len -= cred->second_ticket.length;
return 0;
}
|
↓
|
init_read
|
19
|
33
|
50
|
init.c
|
static int
init_read (Shishi * handle,
const char *tktsfile,
const char *systemcfgfile, const char *usercfgfile)
{
int rc = SHISHI_OK;
/* XXX Is this the correct place for this? */
maybe_install_usercfg (handle);
if (!systemcfgfile)
systemcfgfile = shishi_cfg_default_systemfile (handle);
if (*systemcfgfile)
rc = shishi_cfg_from_file (handle, systemcfgfile);
if (rc == SHISHI_FOPEN_ERROR)
shishi_warn (handle, "%s: %s", systemcfgfile, strerror (errno));
if (rc != SHISHI_OK && rc != SHISHI_FOPEN_ERROR)
return rc;
if (!usercfgfile)
usercfgfile = shishi_cfg_default_userfile (handle);
if (*usercfgfile)
rc = shishi_cfg_from_file (handle, usercfgfile);
if (rc == SHISHI_FOPEN_ERROR)
shishi_warn (handle, "%s: %s", usercfgfile, strerror (errno));
if (rc != SHISHI_OK && rc != SHISHI_FOPEN_ERROR)
return rc;
if (!tktsfile)
tktsfile = shishi_tkts_default_file (handle);
if (!handle->tkts)
rc = shishi_tkts (handle, &handle->tkts);
if (rc != SHISHI_OK)
return rc;
if (*tktsfile)
rc = shishi_tkts_from_file (handle->tkts, tktsfile);
if (rc == SHISHI_FOPEN_ERROR)
shishi_verbose (handle, "%s: %s", tktsfile, strerror (errno));
if (rc != SHISHI_OK && rc != SHISHI_FOPEN_ERROR)
return rc;
if (VERBOSENOISE (handle))
shishi_cfg_print (handle, stderr);
return SHISHI_OK;
}
|
↓
|
shishi_tkt_match_p
|
19
|
19
|
38
|
tkts.c
|
int
shishi_tkt_match_p (Shishi_tkt * tkt, Shishi_tkts_hint * hint)
{
if (hint->server && !shishi_tkt_server_p (tkt, hint->server))
return 0;
if (hint->client && !shishi_tkt_client_p (tkt, hint->client))
return 0;
if (!(hint->flags & SHISHI_TKTSHINTFLAGS_ACCEPT_EXPIRED) &&
!shishi_tkt_valid_now_p (tkt))
return 0;
if ((hint->tktflags & SHISHI_TICKETFLAGS_FORWARDABLE) &&
!shishi_tkt_forwardable_p (tkt))
return 0;
if ((hint->tktflags & SHISHI_TICKETFLAGS_FORWARDED) &&
!shishi_tkt_forwarded_p (tkt))
return 0;
if ((hint->tktflags & SHISHI_TICKETFLAGS_RENEWABLE) &&
!shishi_tkt_renewable_p (tkt))
return 0;
if ((hint->tktflags & SHISHI_TICKETFLAGS_PROXIABLE) &&
!shishi_tkt_proxiable_p (tkt))
return 0;
if ((hint->tktflags & SHISHI_TICKETFLAGS_PROXY) &&
!shishi_tkt_proxy_p (tkt))
return 0;
if (hint->etype && !shishi_tkt_keytype_p (tkt, hint->etype))
return 0;
return 1;
}
|
↓
|
shishi_resolv
|
18
|
66
|
133
|
resolv.c
|
Shishi_dns
shishi_resolv (const char *zone, uint16_t querytype)
{
char host[256];
dns_packet_t packet;
int len, qdcount, ancount, an, n;
unsigned char *eom, *scan;
Shishi_dns *reply, first;
uint16_t type, class, ttl;
if (zone == NULL || *zone == '\0')
return NULL;
switch (querytype)
{
case SHISHI_DNS_TXT:
case SHISHI_DNS_SRV:
break;
default:
return NULL;
}
/* do the actual query */
if ((len = res_query (zone, C_IN, querytype, packet.buf, MAX_PACKET)) < 0
|| len < (int) sizeof (HEADER))
return NULL;
/* we got a valid result, containing two types of records - packet
* and answer .. we have to skip over the packet records */
/* no. of packets, no. of answers */
qdcount = ntohs (packet.hdr.qdcount);
ancount = ntohs (packet.hdr.ancount);
/* end of the returned message */
eom = (unsigned char *) (packet.buf + len);
/* our current location */
scan = (unsigned char *) (packet.buf + sizeof (HEADER));
/* skip over the packet records */
while (qdcount > 0 && scan < eom)
{
qdcount--;
if ((len = dn_expand (packet.buf, eom, scan, host, 256)) < 0)
return NULL;
scan = (unsigned char *) (scan + len + QFIXEDSZ);
}
/* create an array to store the replies in */
reply = xcalloc (ancount, sizeof (Shishi_dns));
an = 0;
/* loop through the answer buffer and extract SRV records */
while (ancount > 0 && scan < eom)
{
ancount--;
len = dn_expand (packet.buf, eom, scan, host, 256);
if (len < 0)
{
for (n = 0; n < an; n++)
free (reply[n]);
free (reply);
return NULL;
}
scan += len;
/* extract the various parts of the record */
GETSHORT (type, scan);
GETSHORT (class, scan);
GETLONG (ttl, scan);
GETSHORT (len, scan);
/* skip records we're not interested in */
if (type != querytype)
{
scan = (unsigned char *) (scan + len);
continue;
}
/* create a new reply structure to save it in */
reply[an] = xmalloc (sizeof (*reply[0]));
reply[an]->type = type;
reply[an]->class = class;
reply[an]->ttl = ttl;
reply[an]->next = NULL;
/* type-specific processing */
switch (type)
{
case SHISHI_DNS_TXT:
reply[an]->rr = txt_rr (packet, eom, &scan);
break;
case SHISHI_DNS_SRV:
reply[an]->rr = srv_rr (packet, eom, &scan);
break;
default:
scan = (unsigned char *) (scan + len);
continue;
}
/* fell short, we're done */
if (reply[an]->rr == NULL)
{
free (reply[an]);
reply[an] = NULL;
break;
}
/* on to the next one */
an++;
}
/* sort srv records them */
if (querytype == SHISHI_DNS_SRV)
qsort (reply, an, sizeof (Shishi_dns), srv_compare);
/* build a linked list out of the array elements */
for (n = 0; n < an - 1; n++)
reply[n]->next = reply[n + 1];
first = reply[0];
free (reply);
return first;
}
|
↓
|
shishi_kdcrep_set_ticket
|
18
|
68
|
98
|
kdcrep.c
|
int
shishi_kdcrep_set_ticket (Shishi * handle, Shishi_asn1 kdcrep,
Shishi_asn1 ticket)
{
int res = SHISHI_OK;
char *format;
char *buf;
size_t buflen;
size_t i, n;
res = shishi_asn1_read (handle, ticket, "tkt-vno", &buf, &buflen);
if (res != SHISHI_OK)
return res;
res = shishi_asn1_write (handle, kdcrep, "ticket.tkt-vno", buf, buflen);
free (buf);
if (res != SHISHI_OK)
return res;
res = shishi_asn1_read (handle, ticket, "realm", &buf, &buflen);
if (res != SHISHI_OK)
return res;
res = shishi_asn1_write (handle, kdcrep, "ticket.realm", buf, buflen);
free (buf);
if (res != SHISHI_OK)
return res;
res = shishi_asn1_read (handle, ticket, "sname.name-type", &buf, &buflen);
if (res != SHISHI_OK)
return res;
res = shishi_asn1_write (handle, kdcrep, "ticket.sname.name-type",
buf, buflen);
free (buf);
if (res != SHISHI_OK)
return res;
res = shishi_asn1_number_of_elements (handle, ticket,
"sname.name-string", &n);
if (res != SHISHI_OK)
return res;
for (i = 1; i <= n; i++)
{
res = shishi_asn1_write (handle, kdcrep,
"ticket.sname.name-string", "NEW", 1);
if (res != SHISHI_OK)
return res;
format = xasprintf ("sname.name-string.?%d", i);
res = shishi_asn1_read (handle, ticket, format, &buf, &buflen);
free (format);
if (res != SHISHI_OK)
return res;
format = xasprintf ("ticket.sname.name-string.?%d", i);
res = shishi_asn1_write (handle, kdcrep, format, buf, buflen);
free (format);
free (buf);
if (res != SHISHI_OK)
return res;
}
res = shishi_asn1_read (handle, ticket, "enc-part.etype", &buf, &buflen);
if (res != SHISHI_OK)
return res;
res = shishi_asn1_write (handle, kdcrep, "ticket.enc-part.etype",
buf, buflen);
free (buf);
if (res != SHISHI_OK)
return res;
res = shishi_asn1_read (handle, ticket, "enc-part.kvno", &buf, &buflen);
if (res != SHISHI_OK)
res = shishi_asn1_write (handle, kdcrep, "ticket.enc-part.kvno", NULL, 0);
else
{
res = shishi_asn1_write (handle, kdcrep, "ticket.enc-part.kvno",
buf, buflen);
free (buf);
}
if (res != SHISHI_OK)
return res;
res = shishi_asn1_read (handle, ticket, "enc-part.cipher", &buf, &buflen);
if (res != SHISHI_OK)
return res;
res = shishi_asn1_write (handle, kdcrep, "ticket.enc-part.cipher",
buf, buflen);
free (buf);
if (res != SHISHI_OK)
return res;
return SHISHI_OK;
}
|
↓
|
_shishi_kdcreq
|
18
|
60
|
102
|
kdcreq.c
|
static Shishi_asn1
_shishi_kdcreq (Shishi * handle, int as)
{
int res;
Shishi_asn1 node;
const char *servicebuf[3];
uint32_t nonce;
if (as)
node = shishi_asn1_asreq (handle);
else
node = shishi_asn1_tgsreq (handle);
if (!node)
return NULL;
res = shishi_asn1_write (handle, node, "pvno",
SHISHI_KDCREQ_DEFAULT_PVNO,
SHISHI_KDCREQ_DEFAULT_PVNO_LEN);
if (res != SHISHI_OK)
goto error;
if (as)
res = shishi_asn1_write (handle, node, "msg-type",
SHISHI_AS_REQ_DEFAULT_MSG_TYPE,
SHISHI_AS_REQ_DEFAULT_MSG_TYPE_LEN);
else
res = shishi_asn1_write (handle, node, "msg-type",
SHISHI_TGS_REQ_DEFAULT_MSG_TYPE,
SHISHI_TGS_REQ_DEFAULT_MSG_TYPE_LEN);
if (res != SHISHI_OK)
goto error;
res = shishi_asn1_write (handle, node, "req-body.kdc-options",
SHISHI_KDCREQ_DEFAULT_REQ_BODY_KDC_OPTIONS,
SHISHI_KDCREQ_DEFAULT_REQ_BODY_KDC_OPTIONS_LEN);
if (res != SHISHI_OK)
goto error;
if (as)
res = shishi_kdcreq_set_cname (handle, node, SHISHI_NT_PRINCIPAL,
shishi_principal_default (handle));
else
res = shishi_asn1_write (handle, node, "req-body.cname", NULL, 0);
if (res != SHISHI_OK)
goto error;
res = shishi_kdcreq_set_realm (handle, node, shishi_realm_default (handle));
if (res != SHISHI_OK)
goto error;
servicebuf[0] = "krbtgt";
servicebuf[1] = shishi_realm_default (handle);
servicebuf[2] = NULL;
res = shishi_kdcreq_set_sname (handle, node,
SHISHI_NT_PRINCIPAL, servicebuf);
if (res != SHISHI_OK)
goto error;
res = shishi_asn1_write (handle, node, "req-body.sname.name-type",
SHISHI_KDCREQ_DEFAULT_REQ_BODY_SNAME_NAME_TYPE,
SHISHI_KDCREQ_DEFAULT_REQ_BODY_SNAME_NAME_TYPE_LEN);
if (res != SHISHI_OK)
goto error;
res = shishi_asn1_write (handle, node, "req-body.till",
shishi_generalize_time (handle,
time (NULL) +
handle->ticketlife), 0);
if (res != SHISHI_OK)
goto error;
shishi_randomize (handle, 0, &nonce, sizeof (nonce));
nonce &= 0x7FFFFFFF; /* XXX fix _libtasn1_convert_integer. */
res = shishi_kdcreq_nonce_set (handle, node, nonce);
if (res != SHISHI_OK)
goto error;
res = shishi_kdcreq_set_etype (handle, node, handle->clientkdcetypes,
handle->nclientkdcetypes);
if (res != SHISHI_OK)
goto error;
res = shishi_asn1_write (handle, node, "req-body.addresses", NULL, 0);
if (res != SHISHI_OK)
goto error;
res = shishi_asn1_write (handle, node,
"req-body.enc-authorization-data", NULL, 0);
if (res != SHISHI_OK)
goto error;
res =
shishi_asn1_write (handle, node, "req-body.additional-tickets", NULL, 0);
if (res != SHISHI_OK)
goto error;
return node;
error:
shishi_asn1_done (handle, node);
return NULL;
}
|
↓
|
shishi_tkts_get_tgt
|
17
|
50
|
87
|
tkts.c
|
Shishi_tkt *
shishi_tkts_get_tgt (Shishi_tkts * tkts, Shishi_tkts_hint * hint)
{
Shishi_tkts_hint lochint;
Shishi_as *as;
Shishi_tkt *tgt;
int rc;
/* XXX cross-realm operation */
memset (&lochint, 0, sizeof (lochint));
asprintf (&lochint.server, "krbtgt/%s", hint->serverrealm ?
hint->serverrealm : shishi_realm_default (tkts->handle));
set_tgtflags_based_on_hint (hint, &lochint);
tgt = shishi_tkts_find (tkts, &lochint);
free (lochint.server);
lochint.server = NULL;
if (tgt)
return tgt;
if (hint->flags & SHISHI_TKTSHINTFLAGS_NON_INTERACTIVE)
return NULL;
again:
rc = shishi_as (tkts->handle, &as);
if (rc == SHISHI_OK)
rc = act_hint_on_kdcreq (tkts->handle, &lochint, shishi_as_req (as));
if (rc == SHISHI_OK)
rc = do_preauth (tkts, &lochint, as);
if (rc == SHISHI_OK)
rc = shishi_as_req_build (as);
if (rc == SHISHI_OK)
rc = shishi_as_sendrecv_hint (as, &lochint);
if (rc == SHISHI_OK)
rc = shishi_as_rep_process (as, NULL, lochint.passwd);
if (rc == SHISHI_GOT_KRBERROR
&& shishi_krberror_errorcode_fast (tkts->handle,
shishi_as_krberror (as))
== SHISHI_KDC_ERR_PREAUTH_REQUIRED)
{
bool retry = false;
rc = recover_preauth (tkts, as, &lochint, &retry);
if (rc != SHISHI_OK)
return NULL;
if (retry)
{
shishi_as_done (as);
goto again;
}
shishi_error_printf (tkts->handle, "Unsupported pre-auth required");
return NULL;
}
if (rc != SHISHI_OK)
{
shishi_error_printf (tkts->handle,
"AS exchange failed: %s\n%s\n",
shishi_strerror (rc), shishi_error (tkts->handle));
return NULL;
}
/* XXX free lochint members */
tgt = shishi_as_tkt (as);
if (!tgt)
{
shishi_error_printf (tkts->handle, "No ticket in AS-REP");
return NULL;
}
if (VERBOSENOISE (tkts->handle))
{
printf ("Received ticket granting ticket:\n");
shishi_tkt_pretty_print (tgt, stdout);
}
rc = shishi_tkts_add (tkts, tgt);
if (rc != SHISHI_OK)
printf ("Could not add ticket: %s", shishi_strerror (rc));
return tgt;
}
|
↓
|
recover_preauth_info
|
17
|
48
|
93
|
tkts.c
|
static int
recover_preauth_info (Shishi_tkts * tkts,
Shishi_as * as,
Shishi_tkts_hint * lochint,
Shishi_asn1 einfos, bool isinfo2, bool * retry)
{
size_t foundpos = SIZE_MAX;
size_t i, n;
int rc;
shishi_verbose (tkts->handle, "Found INFO-ETYPE(2) pre-auth hints");
if (VERBOSEASN1 (tkts->handle))
{
if (isinfo2)
shishi_etype_info2_print (tkts->handle, stdout, einfos);
else
shishi_etype_info_print (tkts->handle, stdout, einfos);
}
if (lochint->preauthetype)
{
shishi_verbose (tkts->handle, "Pre-auth data already specified");
return SHISHI_OK;
}
rc = shishi_asn1_number_of_elements (tkts->handle, einfos, "", &n);
if (rc != SHISHI_OK)
return rc;
for (i = 1; i <= n; i++)
{
char *format;
int32_t etype;
format = xasprintf ("?%d.etype", i);
rc = shishi_asn1_read_int32 (tkts->handle, einfos, format, &etype);
free (format);
if (rc == SHISHI_OK)
{
size_t j;
shishi_verbose (tkts->handle, "Server has etype %d", etype);
for (j = 0; j < tkts->handle->nclientkdcetypes; j++)
{
if (etype == tkts->handle->clientkdcetypes[j])
{
if (j < foundpos && VERBOSENOISE (tkts->handle))
{
shishi_verbose (tkts->handle, "New best etype %d",
etype);
/* XXX mem leak. */
format = xasprintf ("?%d.salt", i);
rc = shishi_asn1_read (tkts->handle, einfos, format,
&lochint->preauthsalt,
&lochint->preauthsaltlen);
free (format);
if (rc != SHISHI_OK && rc != SHISHI_ASN1_NO_ELEMENT)
return rc;
if (isinfo2)
{
format = xasprintf ("?%d.s2kparams", i);
rc = shishi_asn1_read (tkts->handle, einfos, format,
&lochint->preauths2kparams,
&lochint->preauths2kparamslen);
free (format);
if (rc != SHISHI_OK && rc != SHISHI_ASN1_NO_ELEMENT)
return rc;
}
}
foundpos = MIN (foundpos, j);
}
}
}
}
if (foundpos != SIZE_MAX)
{
lochint->preauthetype = tkts->handle->clientkdcetypes[foundpos];
shishi_verbose (tkts->handle, "Best pre-auth etype was %d",
lochint->preauthetype);
*retry = true;
}
return SHISHI_OK;
}
|
↓
|
shishi_cfg_from_file
|
17
|
30
|
51
|
cfg.c
|
int
shishi_cfg_from_file (Shishi * handle, const char *cfg)
{
char *line = NULL;
size_t len = 0;
FILE *fh;
if (cfg == NULL)
return SHISHI_OK;
fh = fopen (cfg, "r");
if (fh == NULL)
return SHISHI_FOPEN_ERROR;
while (!feof (fh))
{
ssize_t n = getline (&line, &len, fh);
char *p = line;
char *q;
if (n <= 0)
/* End of file or error. */
break;
while (strlen (p) > 0 && (p[strlen (p) - 1] == '\n' ||
p[strlen (p) - 1] == '\r'))
p[strlen (p) - 1] = '\0';
while (*p && strchr (" \t\r\n", *p))
p++;
if (*p == '\0' || *p == '#')
continue;
q = strchr (p, ' ');
if (q && (strchr (p, '=') == NULL || q < strchr (p, '=')))
*q = '=';
shishi_cfg (handle, p);
}
free (line);
if (ferror (fh))
shishi_error_printf (handle, "Error reading configuration file");
if (fclose (fh) != 0)
return SHISHI_IO_ERROR;
return SHISHI_OK;
}
|
↓
|
arcfour_hmac_encrypt
|
16
|
78
|
144
|
crypto-rc4.c
|
static int
arcfour_hmac_encrypt (Shishi * handle,
Shishi_key * key,
int keyusage,
const char *iv,
size_t ivlen,
char **ivout, size_t * ivoutlen,
const char *in, size_t inlen, char **out,
size_t * outlen)
{
int export = shishi_key_type (key) == SHISHI_ARCFOUR_HMAC_EXP;
int arcfourkeyusage = arcfour_keyusage (keyusage);
char L40[14] = "fortybits";
uint8_t T[4];
char *K1 = NULL;
char K2[16];
char *K3 = NULL;
char *pt = NULL;
size_t ptlen;
char *ct = NULL;
char *cksum = NULL;
int offset;
int err;
T[0] = arcfourkeyusage & 0xFF;
T[1] = (arcfourkeyusage >> 8) & 0xFF;
T[2] = (arcfourkeyusage >> 16) & 0xFF;
T[3] = (arcfourkeyusage >> 24) & 0xFF;
memcpy (L40 + 10, T, 4);
if (export)
offset = 0;
else
offset = 10;
if (VERBOSECRYPTONOISE (handle))
{
puts ("k1pt");
_shishi_hexprint (L40 + offset, 14 - offset);
}
err = shishi_hmac_md5 (handle,
shishi_key_value (key), shishi_key_length (key),
L40 + offset, 14 - offset, &K1);
if (err)
goto done;
if (VERBOSECRYPTONOISE (handle))
{
puts ("k1");
_shishi_hexprint (K1, 16);
}
memcpy (K2, K1, 16);
if (export)
memset (K1 + 7, 0xAB, 9);
if (VERBOSECRYPTONOISE (handle))
{
puts ("k1");
_shishi_hexprint (K1, 16);
puts ("k2");
_shishi_hexprint (K2, 16);
}
/* Note that in ENCRYPT of draft-brezak-win2k-krb-rc4-hmac-04.txt change:
*
* edata.Checksum = HMAC (K2, edata);
*
* into
*
* edata.Checksum = HMAC (K2, concat(edata.Confounder, edata.Data));
*
* otherwise it will not work. Compare DECRYPT where the later is
* taken from. Another interpretation would be to HMAC a zeroized
* checksum field, like certain other cipher suites do, but that
* does not interoperate.
*
*/
ptlen = 8 + inlen;
pt = xmalloc (ptlen);
err = shishi_randomize (handle, 0, pt, 8);
if (err)
goto done;
memcpy (pt + 8, in, inlen);
if (VERBOSECRYPTONOISE (handle))
{
puts ("random");
_shishi_hexprint (pt, 8);
}
err = shishi_hmac_md5 (handle, K2, 16, pt, ptlen, &cksum);
if (err)
goto done;
if (VERBOSECRYPTONOISE (handle))
{
puts ("cksum");
_shishi_hexprint (cksum, 16);
}
err = shishi_hmac_md5 (handle, K1, 16, cksum, 16, &K3);
if (err)
goto done;
if (VERBOSECRYPTONOISE (handle))
{
puts ("k3");
_shishi_hexprint (K3, 16);
}
err = shishi_arcfour (handle, 0, K3, 16, iv, ivout, pt, ptlen, &ct);
if (err)
goto done;
if (VERBOSECRYPTONOISE (handle))
{
puts ("ct");
_shishi_hexprint (ct, ptlen);
}
*outlen = 16 + ptlen;
*out = xmalloc (*outlen);
memcpy (*out, cksum, 16);
memcpy (*out + 16, ct, ptlen);
if (ivoutlen)
/* size = sbox[256] + int8_t i + int8_t j */
*ivoutlen = 256 + 2 * 8;
err = SHISHI_OK;
done:
free (cksum);
free (K3);
free (pt);
free (ct);
free (K1);
return err;
}
|
↓
|
shishi_prompt_password
|
16
|
59
|
104
|
password.c
|
int
shishi_prompt_password (Shishi * handle, char **s, const char *format, ...)
{
char *p;
va_list ap;
if (handle->prompt_passwd)
{
int ret;
va_start (ap, format);
ret = handle->prompt_passwd (handle, s, format, ap);
va_end (ap);
return ret;
}
#ifdef HAVE_LIBIDN
if (VERBOSE (handle))
{
printf ("Libstringprep thinks your locale is `%s'.\n",
stringprep_locale_charset ());
}
#endif
va_start (ap, format);
vprintf (format, ap);
fflush (stdout);
va_end (ap);
p = getpass ("");
*s = xstrdup (p);
printf ("\n");
if (VERBOSENOISE (handle))
{
size_t i;
printf ("Read password (length %d): ", strlen (*s));
for (i = 0; i < strlen (*s); i++)
printf ("%02x ", (*s)[i] & 0xFF);
printf ("\n");
}
if (handle->stringprocess
&& strcasecmp (handle->stringprocess, "none") != 0)
#ifdef HAVE_LIBIDN
{
if (strcasecmp (handle->stringprocess, "stringprep") == 0)
p = stringprep_locale_to_utf8 (*s);
else
p = stringprep_convert (*s, handle->stringprocess,
stringprep_locale_charset ());
if (p)
{
free (*s);
*s = p;
}
else
shishi_warn (handle, "Charset conversion of password failed");
if (VERBOSENOISE (handle))
{
size_t i;
printf ("Password converted to %s (length %d): ",
strcasecmp (handle->stringprocess, "stringprep") == 0 ?
"UTF-8" : handle->stringprocess, strlen (*s));
for (i = 0; i < strlen (*s); i++)
printf ("%02x ", (*s)[i] & 0xFF);
printf ("\n");
}
if (strcasecmp (handle->stringprocess, "stringprep") == 0)
{
int rc;
rc = stringprep_profile (*s, &p, "SASLprep", 0);
if (rc == SHISHI_OK)
{
free (*s);
*s = p;
}
else
shishi_warn (handle, "Stringprep conversion of password failed");
if (VERBOSENOISE (handle))
{
size_t i;
printf ("Stringprep'ed password (length %d): ", strlen (*s));
for (i = 0; i < strlen (*s); i++)
printf ("%02x ", (*s)[i] & 0xFF);
printf ("\n");
}
}
}
#else
shishi_warn (handle, "Password string processing (%s) disabled",
handle->stringprocess);
#endif
return SHISHI_OK;
}
|
↓
|
shishi_apreq
|
16
|
48
|
95
|
apreq.c
|
Shishi_asn1
shishi_apreq (Shishi * handle)
{
Shishi_asn1 node;
int res;
node = shishi_asn1_apreq (handle);
if (!node)
goto error;
res = shishi_asn1_write (handle, node, "pvno",
SHISHI_APREQ_DEFAULT_PVNO,
SHISHI_APREQ_DEFAULT_PVNO_LEN);
if (res != SHISHI_OK)
goto error;
res = shishi_asn1_write (handle, node, "msg-type",
SHISHI_APREQ_DEFAULT_MSG_TYPE,
SHISHI_APREQ_DEFAULT_MSG_TYPE_LEN);
if (res != SHISHI_OK)
goto error;
res = shishi_asn1_write (handle, node, "ap-options",
SHISHI_APREQ_DEFAULT_AP_OPTIONS,
SHISHI_APREQ_DEFAULT_AP_OPTIONS_LEN);
if (res != SHISHI_OK)
goto error;
res = shishi_asn1_write (handle, node, "ticket.tkt-vno",
SHISHI_APREQ_DEFAULT_TICKET_TKT_VNO,
SHISHI_APREQ_DEFAULT_TICKET_TKT_VNO_LEN);
if (res != SHISHI_OK)
goto error;
res = shishi_asn1_write (handle, node, "ticket.realm",
SHISHI_APREQ_DEFAULT_TICKET_REALM,
SHISHI_APREQ_DEFAULT_TICKET_REALM_LEN);
if (res != SHISHI_OK)
goto error;
res = shishi_asn1_write (handle, node, "ticket.realm",
SHISHI_APREQ_DEFAULT_TICKET_REALM,
SHISHI_APREQ_DEFAULT_TICKET_REALM_LEN);
if (res != SHISHI_OK)
goto error;
res = shishi_asn1_write (handle, node, "ticket.sname.name-type",
SHISHI_APREQ_DEFAULT_TICKET_SNAME_NAME_TYPE,
SHISHI_APREQ_DEFAULT_TICKET_SNAME_NAME_TYPE_LEN);
if (res != SHISHI_OK)
goto error;
res = shishi_asn1_write (handle, node, "ticket.enc-part.etype",
SHISHI_APREQ_DEFAULT_TICKET_ENC_PART_ETYPE,
SHISHI_APREQ_DEFAULT_TICKET_ENC_PART_ETYPE_LEN);
if (res != SHISHI_OK)
goto error;
res = shishi_asn1_write (handle, node, "ticket.enc-part.kvno",
SHISHI_APREQ_DEFAULT_TICKET_ENC_PART_KVNO,
SHISHI_APREQ_DEFAULT_TICKET_ENC_PART_KVNO_LEN);
if (res != SHISHI_OK)
goto error;
res = shishi_asn1_write (handle, node, "ticket.enc-part.cipher",
SHISHI_APREQ_DEFAULT_TICKET_ENC_PART_CIPHER,
SHISHI_APREQ_DEFAULT_TICKET_ENC_PART_CIPHER_LEN);
if (res != SHISHI_OK)
goto error;
res = shishi_asn1_write (handle, node, "authenticator.etype",
SHISHI_APREQ_DEFAULT_AUTHENTICATOR_ETYPE,
SHISHI_APREQ_DEFAULT_AUTHENTICATOR_ETYPE_LEN);
if (res != SHISHI_OK)
goto error;
res = shishi_asn1_write (handle, node, "authenticator.kvno",
SHISHI_APREQ_DEFAULT_AUTHENTICATOR_KVNO,
SHISHI_APREQ_DEFAULT_AUTHENTICATOR_KVNO_LEN);
if (res != SHISHI_OK)
goto error;
res = shishi_asn1_write (handle, node, "authenticator.cipher",
SHISHI_APREQ_DEFAULT_AUTHENTICATOR_CIPHER,
SHISHI_APREQ_DEFAULT_AUTHENTICATOR_CIPHER_LEN);
if (res != SHISHI_OK)
goto error;
return node;
error:
if (node)
shishi_asn1_done (handle, node);
return NULL;
}
|
↓
|
shishi_principal_name
|
16
|
47
|
63
|
principal.c
|
int
shishi_principal_name (Shishi * handle,
Shishi_asn1 namenode,
const char *namefield, char **out, size_t * outlen)
{
char *format;
size_t i, j, n;
char *name = NULL;
size_t namelen = 0;
int res;
asprintf (&format, "%s.name-string", namefield);
res = shishi_asn1_number_of_elements (handle, namenode, format, &n);
free (format);
if (res != SHISHI_OK)
return res;
for (i = 1; i <= n; i++)
{
char *tmp;
size_t tmplen;
size_t safetmplen;
asprintf (&format, "%s.name-string.?%ld", namefield, i);
res = shishi_asn1_read (handle, namenode, format, &tmp, &tmplen);
free (format);
if (res != SHISHI_OK)
return res;
safetmplen = tmplen;
for (j = 0; j < tmplen; j++)
if (tmp[j] == '@' || tmp[j] == '/' || tmp[j] == '\\')
safetmplen++;
if (i < n)
safetmplen++;
name = xrealloc (name, namelen + safetmplen);
for (j = 0; j < tmplen; j++)
{
if (tmp[j] == '@' || tmp[j] == '/' || tmp[j] == '\\')
name[namelen++] = '\\';
name[namelen++] = tmp[j];
}
if (i < n)
name[namelen++] = '/';
free (tmp);
}
name = xrealloc (name, namelen + 1);
name[namelen] = '\0';
if (out)
*out = name;
else
free (name);
if (outlen)
*outlen = namelen;
return SHISHI_OK;
}
|
↓
|
shishi_parse_name
|
16
|
32
|
60
|
principal.c
|
int
shishi_parse_name (Shishi * handle, const char *name,
char **principal, char **realm)
{
const char *p = name;
const char *q;
int escaped = 0;
if (!name)
{
shishi_error_printf (handle, "Name is NULL\n");
return SHISHI_INVALID_PRINCIPAL_NAME;
}
while (*p && (*p != '@' || escaped))
if (escaped)
escaped = 0;
else if (*p++ == '\\')
escaped = 1;
if (escaped)
{
shishi_error_printf (handle,
"Principal ended with escape character: %s\n",
name);
return SHISHI_INVALID_PRINCIPAL_NAME;
}
if (principal)
{
*principal = xstrndup (name, p - name + 1);
(*principal)[p - name] = '\0';
}
if (*p)
{
q = ++p;
while (*q)
if (escaped)
escaped = 0;
else if (*q++ == '\\')
escaped = 1;
if (escaped)
{
shishi_error_printf (handle,
"Realm ended with escape character: %s\n",
name);
return SHISHI_INVALID_PRINCIPAL_NAME;
}
if (realm)
*realm = xstrdup (p);
}
else if (realm)
*realm = NULL;
return SHISHI_OK;
}
|
↓
|
arcfour_hmac_decrypt
|
15
|
70
|
120
|
crypto-rc4.c
|
static int
arcfour_hmac_decrypt (Shishi * handle,
Shishi_key * key,
int keyusage,
const char *iv,
size_t ivlen,
char **ivout, size_t * ivoutlen,
const char *in, size_t inlen, char **out,
size_t * outlen)
{
int export = shishi_key_type (key) == SHISHI_ARCFOUR_HMAC_EXP;
int arcfourkeyusage = arcfour_keyusage (keyusage);
char L40[14] = "fortybits";
uint8_t T[4];
char *K1 = NULL;
char K2[16];
char *K3 = NULL;
char *cksum = NULL;
char *pt = NULL;
int offset;
int err;
T[0] = arcfourkeyusage & 0xFF;
T[1] = (arcfourkeyusage >> 8) & 0xFF;
T[2] = (arcfourkeyusage >> 16) & 0xFF;
T[3] = (arcfourkeyusage >> 24) & 0xFF;
memcpy (L40 + 10, T, 4);
if (export)
offset = 0;
else
offset = 10;
if (VERBOSECRYPTONOISE (handle))
{
puts ("k1pt");
_shishi_hexprint (L40 + offset, 14 - offset);
}
err = shishi_hmac_md5 (handle,
shishi_key_value (key), shishi_key_length (key),
L40 + offset, 14 - offset, &K1);
if (err)
goto done;
if (VERBOSECRYPTONOISE (handle))
{
puts ("k1");
_shishi_hexprint (K1, 16);
}
memcpy (K2, K1, 16);
if (export)
memset (K1 + 7, 0xAB, 9);
if (VERBOSECRYPTONOISE (handle))
{
puts ("k1");
_shishi_hexprint (K1, 16);
puts ("k2");
_shishi_hexprint (K2, 16);
}
err = shishi_hmac_md5 (handle, K1, 16, in, 16, &K3);
if (err)
goto done;
if (VERBOSECRYPTONOISE (handle))
{
puts ("k3");
_shishi_hexprint (K3, 16);
}
err =
shishi_arcfour (handle, 1, K3, 16, iv, ivout, in + 16, inlen - 16, &pt);
if (err)
goto done;
if (VERBOSECRYPTONOISE (handle))
{
puts ("cksum pt");
_shishi_hexprint (pt, inlen - 16);
}
err = shishi_hmac_md5 (handle, K2, 16, pt, inlen - 16, &cksum);
if (err)
goto done;
if (VERBOSECRYPTONOISE (handle))
{
puts ("cksum");
_shishi_hexprint (cksum, 16);
puts ("cksumin");
_shishi_hexprint (in, 16);
}
if (memcmp (cksum, in, 16) != 0)
{
err = SHISHI_CRYPTO_ERROR;
goto done;
}
*outlen = inlen - 16 - 8;
*out = xmalloc (*outlen);
memcpy (*out, pt + 8, inlen - 16 - 8);
if (ivoutlen)
/* size = sbox[256] + int8_t i + int8_t j */
*ivoutlen = 256 + 2 * 8;
err = SHISHI_OK;
done:
free (cksum);
free (K3);
free (K1);
free (pt);
return err;
}
|
↓
|
shishi_enckdcreppart_populate_encticketpart
|
15
|
43
|
70
|
enckdcreppart.c
|
int
shishi_enckdcreppart_populate_encticketpart (Shishi * handle,
Shishi_asn1 enckdcreppart,
Shishi_asn1 encticketpart)
{
char *buf;
size_t buflen;
int res;
res = shishi_asn1_read (handle, encticketpart, "flags", &buf, &buflen);
if (res != SHISHI_OK)
return SHISHI_ASN1_ERROR;
res = shishi_asn1_write (handle, enckdcreppart, "flags", buf, buflen);
free (buf);
if (res != SHISHI_OK)
return SHISHI_ASN1_ERROR;
res = shishi_asn1_read (handle, encticketpart, "authtime", &buf, &buflen);
if (res != SHISHI_OK)
return SHISHI_ASN1_ERROR;
res = shishi_asn1_write (handle, enckdcreppart, "authtime", buf, buflen);
free (buf);
if (res != SHISHI_OK)
return SHISHI_ASN1_ERROR;
res = shishi_asn1_read (handle, encticketpart, "starttime", &buf, &buflen);
if (res != SHISHI_OK && res != SHISHI_ASN1_NO_ELEMENT)
return SHISHI_ASN1_ERROR;
if (res == SHISHI_ASN1_NO_ELEMENT)
res = shishi_asn1_write (handle, enckdcreppart, "starttime", NULL, 0);
else
{
res = shishi_asn1_write (handle, enckdcreppart, "starttime",
buf, buflen);
free (buf);
}
if (res != SHISHI_OK)
return SHISHI_ASN1_ERROR;
res = shishi_asn1_read (handle, encticketpart, "endtime", &buf, &buflen);
if (res != SHISHI_OK)
return SHISHI_ASN1_ERROR;
res = shishi_asn1_write (handle, enckdcreppart, "endtime", buf, buflen);
free (buf);
if (res != SHISHI_OK)
return SHISHI_ASN1_ERROR;
res = shishi_asn1_read (handle, encticketpart, "renew-till", &buf, &buflen);
if (res != SHISHI_OK && res != SHISHI_ASN1_NO_ELEMENT)
return SHISHI_ASN1_ERROR;
if (res == SHISHI_ASN1_NO_ELEMENT)
res = shishi_asn1_write (handle, enckdcreppart, "renew-till", NULL, 0);
else
{
res = shishi_asn1_write (handle, enckdcreppart,
"renew-till", buf, buflen);
free (buf);
}
if (res != SHISHI_OK)
return SHISHI_ASN1_ERROR;
/* XXX copy caddr too */
return SHISHI_OK;
}
|
↓
|
_shishi_simplified_encrypt
|
15
|
42
|
83
|
crypto.c
|
int
_shishi_simplified_encrypt (Shishi * handle,
Shishi_key * key,
int keyusage,
const char *iv, size_t ivlen,
char **ivout, size_t * ivoutlen,
const char *in, size_t inlen,
char **out, size_t * outlen)
{
int res;
int padzerolen = 0;
if ((shishi_key_type (key) == SHISHI_DES3_CBC_HMAC_SHA1_KD ||
shishi_key_type (key) == SHISHI_DES_CBC_CRC ||
shishi_key_type (key) == SHISHI_DES_CBC_MD4 ||
shishi_key_type (key) == SHISHI_DES_CBC_MD5) && (inlen % 8) != 0)
while (((inlen + padzerolen) % 8) != 0)
padzerolen++;
if (keyusage != 0)
{
char *pt = NULL, *ct = NULL, *hmac = NULL;
int blen = shishi_cipher_blocksize (shishi_key_type (key));
size_t ctlen, ptlen, hmaclen;
Shishi_key *privacykey = NULL, *integritykey = NULL;
ptlen = inlen + blen + padzerolen;
pt = xmalloc (ptlen);
res = shishi_randomize (handle, 0, pt, blen);
if (res != SHISHI_OK)
goto done;
memcpy (pt + blen, in, inlen);
memset (pt + blen + inlen, 0, padzerolen);
res = _shishi_simplified_derivekey (handle, key, keyusage,
SHISHI_DERIVEKEYMODE_PRIVACY,
&privacykey);
if (res != SHISHI_OK)
goto done;
res = _shishi_simplified_dencrypt (handle, privacykey,
iv, ivlen, ivout,
ivoutlen, pt, ptlen, &ct, &ctlen, 0);
if (res != SHISHI_OK)
goto done;
res = _shishi_simplified_derivekey (handle, key, keyusage,
SHISHI_DERIVEKEYMODE_INTEGRITY,
&integritykey);
if (res != SHISHI_OK)
goto done;
res = simplified_hmac (handle, integritykey, pt, ptlen,
&hmac, &hmaclen);
if (res != SHISHI_OK)
goto done;
*outlen = ctlen + hmaclen;
*out = xmalloc (*outlen);
memcpy (*out, ct, ctlen);
memcpy (*out + ctlen, hmac, hmaclen);
done:
if (privacykey)
shishi_key_done (privacykey);
if (integritykey)
shishi_key_done (integritykey);
free (hmac);
free (ct);
free (pt);
}
else
{
res = _shishi_simplified_dencrypt (handle, key, iv, ivlen,
ivout, ivoutlen,
in, inlen, out, outlen, 0);
}
return res;
}
|
↓
|
shishi_as_rep_process
|
15
|
42
|
79
|
as.c
|
int
shishi_as_rep_process (Shishi_as * as, Shishi_key * key, const char *password)
{
Shishi_asn1 ticket, kdcreppart;
int res;
if (VERBOSE (as->handle))
printf ("Processing AS-REQ and AS-REP...\n");
if (VERBOSEASN1 (as->handle))
shishi_kdcreq_print (as->handle, stdout, as->asreq);
if (VERBOSEASN1 (as->handle))
shishi_kdcrep_print (as->handle, stdout, as->asrep);
if (key == NULL && password == NULL)
{
char *passwd;
char *user;
size_t userlen;
res = shishi_asreq_clientrealm (as->handle, as->asreq, &user, &userlen);
if (res != SHISHI_OK)
{
shishi_error_printf (as->handle, "Could not extract cname and "
"realm from AS-REQ: %s\n",
shishi_strerror (res));
return res;
}
res = shishi_prompt_password (as->handle, &passwd,
"Enter password for `%s': ", user);
free (user);
if (res != SHISHI_OK)
{
shishi_error_printf (as->handle, "Reading password failed: %s\n",
shishi_strerror (res));
return res;
}
res = shishi_as_process (as->handle, as->asreq, as->asrep,
passwd, &kdcreppart);
free (passwd);
}
else if (key == NULL)
res = shishi_as_process (as->handle, as->asreq, as->asrep,
password, &kdcreppart);
else
res = shishi_kdc_process (as->handle, as->asreq, as->asrep, key,
SHISHI_KEYUSAGE_ENCASREPPART, &kdcreppart);
if (res != SHISHI_OK)
return res;
if (VERBOSE (as->handle))
printf ("Got EncKDCRepPart...\n");
if (VERBOSEASN1 (as->handle))
shishi_enckdcreppart_print (as->handle, stdout, kdcreppart);
res = shishi_kdcrep_get_ticket (as->handle, as->asrep, &ticket);
if (res != SHISHI_OK)
{
shishi_error_printf (as->handle,
"Could not extract ticket from AS-REP: %s",
shishi_error (as->handle));
return res;
}
if (VERBOSE (as->handle))
printf ("Got Ticket...\n");
if (VERBOSEASN1 (as->handle))
shishi_ticket_print (as->handle, stdout, ticket);
/* XXX */
as->tkt = shishi_tkt2 (as->handle, ticket, kdcreppart, as->asrep);
return SHISHI_OK;
}
|
↓
|
shishi_tgs_process
|
15
|
33
|
64
|
kdc.c
|
int
shishi_tgs_process (Shishi * handle,
Shishi_asn1 tgsreq,
Shishi_asn1 tgsrep,
Shishi_asn1 authenticator,
Shishi_asn1 oldenckdcreppart, Shishi_asn1 * enckdcreppart)
{
Shishi_key *tktkey;
Shishi_key *subkey;
int use_subkey;
int etype;
int res;
res = shishi_kdcrep_get_enc_part_etype (handle, tgsrep, &etype);
if (res != SHISHI_OK)
return res;
res = shishi_authenticator_get_subkey (handle, authenticator, &subkey);
use_subkey = (res != SHISHI_ASN1_NO_ELEMENT);
if (res != SHISHI_OK && res != SHISHI_ASN1_NO_ELEMENT)
return res;
res = shishi_enckdcreppart_get_key (handle, oldenckdcreppart, &tktkey);
if (res != SHISHI_OK)
return res;
if (etype != shishi_key_type (use_subkey ? subkey : tktkey))
res = SHISHI_TGSREP_BAD_KEYTYPE;
else
res = shishi_kdc_process (handle, tgsreq, tgsrep,
use_subkey ? subkey : tktkey,
use_subkey ?
SHISHI_KEYUSAGE_ENCTGSREPPART_AUTHENTICATOR_KEY
: SHISHI_KEYUSAGE_ENCTGSREPPART_SESSION_KEY,
enckdcreppart);
/* Entire if statement to work around buggy KDCs. */
if (use_subkey && (res == SHISHI_CRYPTO_ERROR ||
res == SHISHI_TGSREP_BAD_KEYTYPE))
{
int tmpres;
/* Try again using key from ticket instead of subkey */
if (etype != shishi_key_type (tktkey))
tmpres = SHISHI_TGSREP_BAD_KEYTYPE;
else
tmpres = shishi_kdc_process (handle, tgsreq, tgsrep, tktkey,
SHISHI_KEYUSAGE_ENCTGSREPPART_SESSION_KEY,
enckdcreppart);
/* if bug workaround code didn't help, return original error. */
if (tmpres != SHISHI_OK)
return res;
shishi_warn (handle, "KDC bug: Reply encrypted using wrong key.");
res = tmpres;
}
if (res != SHISHI_OK)
return res;
return SHISHI_OK;
}
|
↓
|
shishi_priv
|
14
|
49
|
72
|
priv.c
|
int
shishi_priv (Shishi * handle, Shishi_priv ** priv)
{
Shishi_priv *lpriv;
struct timeval tv;
char *usec;
int rc;
*priv = xcalloc (1, sizeof (**priv));
lpriv = *priv;
lpriv->handle = handle;
rc = shishi_key (handle, &lpriv->key);
if (rc != SHISHI_OK)
return rc;
lpriv->priv = shishi_asn1_priv (handle);
if (lpriv->priv == NULL)
return SHISHI_ASN1_ERROR;
rc = shishi_asn1_write (handle, lpriv->priv, "pvno", "5", 0);
if (rc != SHISHI_OK)
return rc;
rc = shishi_asn1_write (handle, lpriv->priv, "msg-type", "21", 0);
if (rc != SHISHI_OK)
return rc;
rc = shishi_asn1_write (handle, lpriv->priv, "enc-part.kvno", "0", 0);
if (rc != SHISHI_OK)
return rc;
lpriv->encprivpart = shishi_asn1_encprivpart (handle);
if (lpriv->priv == NULL)
return SHISHI_ASN1_ERROR;
rc = shishi_asn1_write (handle, lpriv->encprivpart, "timestamp",
shishi_generalize_time (handle, time (NULL)), 0);
if (rc != SHISHI_OK)
return rc;
rc = gettimeofday (&tv, NULL);
if (rc != 0)
return SHISHI_GETTIMEOFDAY_ERROR;
usec = xasprintf ("%ld", tv.tv_usec % 1000000);
rc = shishi_asn1_write (handle, lpriv->encprivpart, "usec", usec, 0);
free (usec);
if (rc != SHISHI_OK)
return rc;
rc = shishi_asn1_write (handle, lpriv->encprivpart, "seq-number", NULL, 0);
if (rc != SHISHI_OK)
return rc;
rc = shishi_asn1_write (handle, lpriv->encprivpart, "s-address.addr-type",
/* directional */
"3", 0);
if (rc != SHISHI_OK)
return rc;
rc = shishi_asn1_write (handle, lpriv->encprivpart, "s-address.address",
/* sender */
"\x00\x00\x00\x00", 4);
if (rc != SHISHI_OK)
return rc;
rc = shishi_asn1_write (handle, lpriv->encprivpart, "r-address", NULL, 0);
if (rc != SHISHI_OK)
return rc;
return SHISHI_OK;
}
|
↓
|
shishi_krberror_pretty_print
|
14
|
43
|
81
|
krberror.c
|
int
shishi_krberror_pretty_print (Shishi * handle, FILE * fh,
Shishi_asn1 krberror)
{
char *buf;
size_t len;
int res;
if (VERBOSEASN1 (handle))
shishi_krberror_print (handle, fh, krberror);
if (shishi_krberror_errorcode_fast (handle, krberror) ==
SHISHI_KRB_ERR_GENERIC)
{
fprintf (fh, "Generic error from server:\n");
res = shishi_krberror_etext (handle, krberror, &buf, &len);
if (res == SHISHI_OK && len > 0)
{
buf[len] = '\0';
fprintf (fh, "%s\n", buf);
free (buf);
}
}
else
{
fprintf (fh, "Error code from server:\n%s\n",
shishi_krberror_message (handle, krberror));
res = shishi_krberror_etext (handle, krberror, &buf, &len);
if (res == SHISHI_OK && len > 0)
{
buf[len] = '\0';
fprintf (fh, "Additional error message from server:\n%s\n", buf);
free (buf);
}
if (shishi_krberror_errorcode_fast (handle, krberror) ==
SHISHI_KDC_ERR_PREAUTH_REQUIRED)
{
Shishi_asn1 pas;
size_t i, n;
res = shishi_krberror_methoddata (handle, krberror, &pas);
if (res != SHISHI_OK)
return res;
if (VERBOSEASN1 (handle))
shishi_methoddata_print (handle, stdout, pas);
res = shishi_asn1_number_of_elements (handle, pas, "", &n);
if (res == SHISHI_OK)
{
fprintf (fh, "Types of PA-DATA in KRB-ERROR: ");
for (i = 1; i <= n; i++)
{
char *format = xasprintf ("?%ld.padata-type", i);
int32_t padatatype;
if (i > 1)
fprintf (fh, ", ");
res = shishi_asn1_read_int32 (handle, pas, format,
&padatatype);
if (res == SHISHI_OK)
printf ("%d", padatatype);
free (format);
}
fprintf (fh, ".\n");
}
shishi_asn1_done (handle, pas);
}
}
return SHISHI_OK;
}
|
↓
|
shishi_kdcreq_add_padata_preauth
|
13
|
46
|
68
|
kdcreq.c
|
int
shishi_kdcreq_add_padata_preauth (Shishi * handle,
Shishi_asn1 kdcreq, Shishi_key * key)
{
char *der, *data;
size_t derlen, datalen;
Shishi_asn1 pa;
struct timeval tv;
int rc;
Shishi_asn1 ed;
pa = shishi_asn1_pa_enc_ts_enc (handle);
if (!pa)
return SHISHI_ASN1_ERROR;
rc = gettimeofday (&tv, NULL);
if (rc != 0)
return SHISHI_GETTIMEOFDAY_ERROR;
rc = shishi_asn1_write (handle, pa, "patimestamp",
shishi_generalize_time (handle, tv.tv_sec),
SHISHI_GENERALIZEDTIME_LENGTH);
if (rc != SHISHI_OK)
return rc;
rc = shishi_asn1_write_integer (handle, pa, "pausec", tv.tv_usec);
if (rc != SHISHI_OK)
return rc;
rc = shishi_asn1_to_der (handle, pa, &der, &derlen);
if (rc != SHISHI_OK)
return rc;
rc = shishi_encrypt (handle, key, SHISHI_KEYUSAGE_ASREQ_PA_ENC_TIMESTAMP,
der, derlen, &data, &datalen);
free (der);
if (rc != SHISHI_OK)
return rc;
ed = shishi_asn1_encrypteddata (handle);
if (!ed)
return SHISHI_ASN1_ERROR;
rc = shishi_asn1_write_integer (handle, ed, "etype", shishi_key_type (key));
if (rc != SHISHI_OK)
return rc;
rc = shishi_asn1_write (handle, ed, "cipher", data, datalen);
if (rc != SHISHI_OK)
return rc;
rc = shishi_asn1_write (handle, ed, "kvno", NULL, 0);
if (rc != SHISHI_OK)
return rc;
rc = shishi_asn1_to_der (handle, ed, &der, &derlen);
free (data);
if (rc != SHISHI_OK)
return rc;
rc = shishi_kdcreq_add_padata (handle, kdcreq, SHISHI_PA_ENC_TIMESTAMP,
der, derlen);
free (der);
if (rc != SHISHI_OK)
return rc;
return rc;
}
|
↓
|
libgcrypt_dencrypt
|
13
|
43
|
83
|
low-crypto.c
|
static int
libgcrypt_dencrypt (Shishi * handle, int algo, int flags, int mode,
int decryptp,
const char *key, size_t keylen,
const char *iv,
char **ivout, const char *in, size_t inlen, char **out)
{
size_t ivlen = gcry_cipher_get_algo_blklen (algo);
gcry_cipher_hd_t ch;
gpg_error_t err;
err = gcry_cipher_open (&ch, algo, mode, flags);
if (err != GPG_ERR_NO_ERROR)
{
shishi_error_printf (handle, "Libgcrypt cipher open failed");
shishi_error_set (handle, gpg_strerror (err));
return SHISHI_CRYPTO_INTERNAL_ERROR;
}
err = gcry_cipher_setkey (ch, key, keylen);
if (err != GPG_ERR_NO_ERROR)
{
shishi_error_printf (handle, "Libgcrypt setkey failed");
shishi_error_set (handle, gpg_strerror (err));
return SHISHI_CRYPTO_INTERNAL_ERROR;
}
err = gcry_cipher_setiv (ch, iv, ivlen);
if (err != GPG_ERR_NO_ERROR)
{
shishi_error_printf (handle, "Libgcrypt setiv failed");
shishi_error_set (handle, gpg_strerror (err));
return SHISHI_CRYPTO_INTERNAL_ERROR;
}
*out = xmalloc (inlen);
if (decryptp)
err = gcry_cipher_decrypt (ch, (unsigned char *) *out, inlen,
(const unsigned char *) in, inlen);
else
err = gcry_cipher_encrypt (ch, (unsigned char *) *out, inlen,
(const unsigned char *) in, inlen);
if (err != GPG_ERR_NO_ERROR)
{
shishi_error_printf (handle, "Libgcrypt ciphering failed");
shishi_error_set (handle, gpg_strerror (err));
return SHISHI_CRYPTO_INTERNAL_ERROR;
}
if (ivout)
{
size_t ivdiff, ivpos = 0;
*ivout = xmalloc (ivlen);
if (flags & GCRY_CIPHER_CBC_CTS)
{
/* XXX what is the output iv for CBC-CTS mode?
but is this value useful at all for that mode anyway?
Mostly it is DES apps that want the updated iv, so this is ok. */
if (inlen % ivlen)
ivdiff = ivlen + inlen % ivlen;
else
ivdiff = ivlen + ivlen;
if (inlen >= ivdiff)
ivpos = inlen - ivdiff;
}
else
ivpos = inlen - ivlen;
if (decryptp)
memcpy (*ivout, in + ivpos, inlen >= ivlen ? ivlen : inlen);
else
memcpy (*ivout, *out + ivpos, inlen >= ivlen ? ivlen : inlen);
}
gcry_cipher_close (ch);
return SHISHI_OK;
}
|
↓
|
shishi_authorize_k5login
|
13
|
39
|
73
|
authorize.c
|
int
shishi_authorize_k5login (Shishi * handle, const char *principal,
const char *authzname)
{
#if HAVE_PWD_H && HAVE_GETPWNAM
struct passwd *pwd;
struct stat sta;
FILE *fic;
char *ficname;
char *line = NULL;
size_t linelength = 0;
int authorized = 0;
pwd = getpwnam (authzname);
if (pwd == NULL || pwd->pw_dir == NULL)
return 0;
asprintf (&ficname, "%s/%s", pwd->pw_dir, ".k5login");
if (stat (ficname, &sta) != 0)
{
/* File .k5login does not exist. */
free (ficname);
return 0;
}
/* Owner should be acting user, or root. */
if ((sta.st_uid != pwd->pw_uid) && (sta.st_uid != 0))
{
free (ficname);
return 0;
}
/* Write access is forbidden for group and world. */
if ((sta.st_mode & S_IWGRP) || (sta.st_mode & S_IWOTH))
{
free (ficname);
return 0;
}
fic = fopen (ficname, "r");
if (fic == NULL)
{
free (ficname);
return 0;
}
while (!feof (fic))
{
char *p;
if (getline (&line, &linelength, fic) == -1)
break;
p = strchr (line, '\n');
if (p)
*p = '\0';
if (strcmp (principal, line) == 0)
{
authorized = 1;
break;
}
}
fclose (fic);
free (ficname);
free (line);
return authorized;
#else
return 0;
#endif
}
|
↓
|
sendrecv_host
|
13
|
31
|
60
|
netio.c
|
static int
sendrecv_host (Shishi * handle,
int transport, const char *host, const char *port,
const char *indata, size_t inlen,
char **outdata, size_t * outlen)
{
struct addrinfo hints;
struct addrinfo *ai;
int rc;
memset (&hints, 0, sizeof (hints));
if (transport == TCP || transport == TLS)
hints.ai_socktype = SOCK_STREAM;
else
hints.ai_socktype = SOCK_DGRAM;
hints.ai_flags = AI_ADDRCONFIG;
if (port == NULL)
port = "88";
rc = getaddrinfo (host, port, &hints, &ai);
if (rc != 0)
{
shishi_error_printf (handle, "Cannot find host %s", host);
return SHISHI_KDC_NOT_KNOWN_FOR_REALM;
}
do
{
char nodename[NI_MAXHOST];
size_t j = 0;
rc = getnameinfo (ai->ai_addr, ai->ai_addrlen,
nodename, sizeof (nodename), NULL, 0, NI_NUMERICHOST);
shishi_verbose (handle, "Sending to %s (%s) port %s transport %s",
host, rc == 0 ? nodename : "unknown address", port,
_shishi_transport2string (transport));
do
{
if (transport == TCP)
rc = sendrecv_tcp (handle, ai, indata, inlen, outdata, outlen);
#ifdef USE_STARTTLS
else if (transport == TLS)
rc = _shishi_sendrecv_tls (handle, ai, indata, inlen,
outdata, outlen);
#endif
else
rc = sendrecv_udp (handle, ai, indata, inlen, outdata, outlen);
if (rc != SHISHI_OK)
shishi_verbose (handle, "Error sending to KDC: %s",
shishi_strerror (rc));
}
while (rc == SHISHI_KDC_TIMEOUT && ++j < handle->kdcretries);
}
while (rc != SHISHI_OK && (ai = ai->ai_next));
return rc;
}
|
↓
|
shishi_keys_for_serverrealm_in_file
|
13
|
22
|
44
|
keys.c
|
Shishi_key *
shishi_keys_for_serverrealm_in_file (Shishi * handle,
const char *filename,
const char *server, const char *realm)
{
Shishi_key *key = NULL;
FILE *fh;
int res;
fh = fopen (filename, "r");
if (fh == NULL)
return NULL;
res = SHISHI_OK;
while (!feof (fh))
{
res = shishi_key_parse (handle, fh, &key);
if (res != SHISHI_OK || key == NULL)
break;
if (VERBOSENOISE (handle))
{
printf ("Read key:\n");
shishi_key_print (handle, stdout, key);
}
if ((!server ||
(shishi_key_principal (key) &&
strcmp (server, shishi_key_principal (key)) == 0)) &&
(!realm ||
(shishi_key_realm (key) &&
strcmp (realm, shishi_key_realm (key)) == 0)))
break;
shishi_key_done (key);
key = NULL;
}
res = fclose (fh);
if (res != 0)
return NULL;
return key;
}
|
↓
|
_shishi_binprint
|
13
|
19
|
23
|
utils.c
|
void
_shishi_binprint (const char *str, int len)
{
int i;
printf ("\t ;; ");
for (i = 0; i < len; i++)
{
printf ("%d%d%d%d%d%d%d%d ",
str[i] & 0x80 ? 1 : 0,
str[i] & 0x40 ? 1 : 0,
str[i] & 0x20 ? 1 : 0,
str[i] & 0x10 ? 1 : 0,
str[i] & 0x08 ? 1 : 0,
str[i] & 0x04 ? 1 : 0,
str[i] & 0x02 ? 1 : 0, str[i] & 0x01 ? 1 : 0);
if ((i + 1) % 3 == 0)
printf (" ");
if ((i + 1) % 6 == 0 && i + 1 < len)
printf ("\n\t ;; ");
}
puts ("");
}
|
↓
|
_shishi_simplified_dencrypt
|
12
|
35
|
72
|
crypto.c
|
int
_shishi_simplified_dencrypt (Shishi * handle,
Shishi_key * key,
const char *iv, size_t ivlen,
char **ivout, size_t * ivoutlen,
const char *in, size_t inlen,
char **out, size_t * outlen, int decryptp)
{
int rc;
char *pt;
size_t ptlen;
size_t padzerolen = 0;
if ((inlen % 8) != 0)
while (((inlen + padzerolen) % 8) != 0)
padzerolen++;
ptlen = inlen + padzerolen;
if (padzerolen)
{
pt = xmalloc (ptlen);
memcpy (pt, in, inlen);
memset (pt + inlen, 0, padzerolen);
}
else
pt = (char *) in;
switch (shishi_key_type (key))
{
case SHISHI_DES_CBC_CRC:
case SHISHI_DES_CBC_MD4:
case SHISHI_DES_CBC_MD5:
case SHISHI_DES_CBC_NONE:
rc = shishi_des (handle, decryptp, shishi_key_value (key),
iv, ivout, pt, ptlen, out);
if (ivoutlen)
*ivoutlen = 8;
if (outlen)
*outlen = ptlen;
break;
case SHISHI_DES3_CBC_HMAC_SHA1_KD:
case SHISHI_DES3_CBC_NONE:
rc = shishi_3des (handle, decryptp, shishi_key_value (key),
iv, ivout, pt, inlen + padzerolen, out);
if (ivoutlen)
*ivoutlen = 8;
if (outlen)
*outlen = ptlen;
break;
case SHISHI_AES128_CTS_HMAC_SHA1_96:
case SHISHI_AES256_CTS_HMAC_SHA1_96:
rc = shishi_aes_cts (handle, decryptp,
shishi_key_value (key), shishi_key_length (key),
iv, ivout, in, inlen, out);
if (ivoutlen)
*ivoutlen = 16;
if (outlen)
*outlen = inlen;
break;
default:
rc = SHISHI_CRYPTO_ERROR;
}
if (padzerolen)
free (pt);
return rc;
}
|
↓
|
shishi_safe
|
12
|
43
|
63
|
safe.c
|
int
shishi_safe (Shishi * handle, Shishi_safe ** safe)
{
Shishi_safe *lsafe;
struct timeval tv;
char *usec;
int rc;
*safe = xcalloc (1, sizeof (**safe));
lsafe = *safe;
lsafe->handle = handle;
rc = shishi_key (handle, &lsafe->key);
if (rc != SHISHI_OK)
return rc;
lsafe->safe = shishi_asn1_krbsafe (handle);
if (lsafe->safe == NULL)
return SHISHI_ASN1_ERROR;
rc = shishi_asn1_write (handle, lsafe->safe, "pvno", "5", 0);
if (rc != SHISHI_OK)
return rc;
rc = shishi_asn1_write (handle, lsafe->safe, "msg-type", "20", 0);
if (rc != SHISHI_OK)
return rc;
rc = shishi_asn1_write (handle, lsafe->safe, "safe-body.seq-number",
NULL, 0);
if (rc != SHISHI_OK)
return rc;
rc = gettimeofday (&tv, NULL);
if (rc != 0)
return SHISHI_GETTIMEOFDAY_ERROR;
asprintf (&usec, "%ld", tv.tv_usec % 1000000);
rc = shishi_asn1_write (handle, lsafe->safe, "safe-body.usec", usec, 0);
free (usec);
if (rc != SHISHI_OK)
return rc;
rc = shishi_asn1_write (handle, lsafe->safe, "safe-body.timestamp",
shishi_generalize_time (handle, time (NULL)), 0);
if (rc != SHISHI_OK)
return rc;
rc = shishi_asn1_write (handle, lsafe->safe, "safe-body.s-address.addr-type", "3", 0); /* directional */
if (rc != SHISHI_OK)
return rc;
rc = shishi_asn1_write (handle, lsafe->safe, "safe-body.s-address.address", "\x00\x00\x00\x00", 4); /* sender */
if (rc != SHISHI_OK)
return rc;
rc = shishi_asn1_write (handle, lsafe->safe, "safe-body.r-address",
NULL, 0);
if (rc != SHISHI_OK)
return rc;
return SHISHI_OK;
}
|
↓
|
parse_principal
|
12
|
34
|
54
|
ccache.c
|
static int
parse_principal (const char **data, size_t * len,
struct ccache_principal *out)
{
size_t n;
int rc;
rc = get_uint32 (data, len, &out->name_type);
if (rc < 0)
return rc;
rc = get_uint32 (data, len, &out->num_components);
if (rc < 0)
return rc;
if (out->num_components >= CCACHE_MAX_COMPONENTS)
return -1;
rc = get_uint32 (data, len, &out->realm.length);
if (rc < 0)
return rc;
if (*len < out->realm.length)
return -1;
out->realm.data = (char *) *data;
*data += out->realm.length;
*len -= out->realm.length;
/* Make sure realm will be zero terminated. This limits component
lengths to 2^24 bytes. */
if (**(char **) data != '\0')
return -1;
for (n = 0; n < out->num_components; n++)
{
rc = get_uint32 (data, len, &out->components[n].length);
if (rc < 0)
return rc;
if (*len < out->components[n].length)
return -1;
out->components[n].data = (char *) *data;
*data += out->components[n].length;
*len -= out->components[n].length;
/* Make sure component is zero terminated. This limits the
length of the next component to 2^24 bytes. Note that you'll
have to test after the last component elsewhere. */
if (*len > 0 && **(char **) data != '\0')
return -1;
}
return 0;
}
|
↓
|
shishi_ap_req_build
|
12
|
31
|
74
|
ap.c
|
int
shishi_ap_req_build (Shishi_ap * ap)
{
int res;
int cksumtype;
if (VERBOSE (ap->handle))
printf ("Building AP-REQ...\n");
if (VERBOSEASN1 (ap->handle))
{
shishi_ticket_print (ap->handle, stdout, shishi_tkt_ticket (ap->tkt));
shishi_key_print (ap->handle, stdout, shishi_tkt_key (ap->tkt));
}
res = shishi_apreq_set_ticket (ap->handle, ap->apreq,
shishi_tkt_ticket (ap->tkt));
if (res != SHISHI_OK)
{
shishi_error_printf (ap->handle, "Could not set ticket in AP-REQ: %s\n",
shishi_error (ap->handle));
return res;
}
cksumtype = shishi_ap_authenticator_cksumtype (ap);
if (ap->authenticatorcksumraw && ap->authenticatorcksumrawlen > 0)
res = shishi_authenticator_set_cksum (ap->handle, ap->authenticator,
cksumtype,
ap->authenticatorcksumraw,
ap->authenticatorcksumrawlen);
else if (cksumtype == SHISHI_NO_CKSUMTYPE)
res = shishi_authenticator_add_cksum (ap->handle, ap->authenticator,
shishi_tkt_key (ap->tkt),
ap->authenticatorcksumkeyusage,
ap->authenticatorcksumdata,
ap->authenticatorcksumdatalen);
else
res = shishi_authenticator_add_cksum_type (ap->handle, ap->authenticator,
shishi_tkt_key (ap->tkt),
ap->authenticatorcksumkeyusage,
cksumtype,
ap->authenticatorcksumdata,
ap->authenticatorcksumdatalen);
if (res != SHISHI_OK)
{
shishi_error_printf (ap->handle,
"Could not add checksum to authenticator: %s\n",
shishi_error (ap->handle));
return res;
}
if (VERBOSE (ap->handle))
printf ("Got Authenticator...\n");
if (VERBOSEASN1 (ap->handle))
shishi_authenticator_print (ap->handle, stdout, ap->authenticator);
res = shishi_apreq_add_authenticator (ap->handle, ap->apreq,
shishi_tkt_key (ap->tkt),
ap->authenticatorkeyusage,
ap->authenticator);
if (res != SHISHI_OK)
{
shishi_error_printf (ap->handle, "Could not set authenticator: %s\n",
shishi_error (ap->handle));
return res;
}
if (VERBOSEASN1 (ap->handle))
shishi_apreq_print (ap->handle, stdout, ap->apreq);
return SHISHI_OK;
}
|
↓
|
set_tgtflags_based_on_hint
|
12
|
24
|
43
|
tkts.c
|
static void
set_tgtflags_based_on_hint (Shishi_tkts_hint * tkthint,
Shishi_tkts_hint * tgthint)
{
if (tkthint->tktflags & SHISHI_TICKETFLAGS_FORWARDABLE)
tgthint->tktflags |= SHISHI_TICKETFLAGS_FORWARDABLE;
if (tkthint->tktflags & SHISHI_TICKETFLAGS_FORWARDED)
tgthint->tktflags |= SHISHI_TICKETFLAGS_FORWARDABLE;
if (tkthint->tktflags & SHISHI_TICKETFLAGS_PROXIABLE)
tgthint->tktflags |= SHISHI_TICKETFLAGS_PROXIABLE;
if (tkthint->tktflags & SHISHI_TICKETFLAGS_PROXY)
tgthint->tktflags |= SHISHI_TICKETFLAGS_PROXIABLE;
if (tkthint->tktflags & SHISHI_TICKETFLAGS_RENEWABLE)
tgthint->tktflags |= SHISHI_TICKETFLAGS_RENEWABLE;
if (tkthint->kdcoptions & SHISHI_KDCOPTIONS_RENEW)
tgthint->tktflags |= SHISHI_TICKETFLAGS_RENEWABLE;
if (tkthint->endtime)
tgthint->endtime = tkthint->endtime;
if (tkthint->passwd)
tgthint->passwd = tkthint->passwd;
if (tkthint->preauthetype)
tgthint->preauthetype = tkthint->preauthetype;
if (tkthint->preauthsalt)
{
tgthint->preauthsalt = tkthint->preauthsalt;
tgthint->preauthsaltlen = tkthint->preauthsaltlen;
}
if (tkthint->preauths2kparams)
{
tgthint->preauths2kparams = tkthint->preauths2kparams;
tgthint->preauths2kparamslen = tkthint->preauths2kparamslen;
}
}
|
↓
|
_shishi_bin7print
|
12
|
18
|
22
|
utils.c
|
void
_shishi_bin7print (const char *str, int len)
{
int i;
printf ("\t ;; ");
for (i = 0; i < len; i++)
{
printf ("%d%d%d%d%d%d%d ",
str[i] & 0x40 ? 1 : 0,
str[i] & 0x20 ? 1 : 0,
str[i] & 0x10 ? 1 : 0,
str[i] & 0x08 ? 1 : 0,
str[i] & 0x04 ? 1 : 0,
str[i] & 0x02 ? 1 : 0, str[i] & 0x01 ? 1 : 0);
if ((i + 1) % 3 == 0)
printf (" ");
if ((i + 1) % 6 == 0 && i + 1 < len)
printf ("\n\t ;; ");
}
puts ("");
}
|
↓
|
shishi_as_derive_salt
|
11
|
46
|
67
|
kdc.c
|
int
shishi_as_derive_salt (Shishi * handle,
Shishi_asn1 asreq,
Shishi_asn1 asrep, char **salt, size_t * saltlen)
{
size_t i, n;
char *format;
int res;
res = shishi_asn1_number_of_elements (handle, asrep, "padata", &n);
if (res == SHISHI_ASN1_NO_ELEMENT)
n = 0;
else if (res != SHISHI_OK)
return res;
for (i = 1; i <= n; i++)
{
int patype;
asprintf (&format, "padata.?%ld.padata-type", i);
res = shishi_asn1_read_int32 (handle, asrep, format, &patype);
free (format);
if (res != SHISHI_OK)
return res;
if (patype == SHISHI_PA_PW_SALT)
{
asprintf (&format, "padata.?%ld.padata-value", i);
res = shishi_asn1_read (handle, asrep, format, salt, saltlen);
free (format);
if (res != SHISHI_OK)
return res;
return SHISHI_OK;
}
}
res = shishi_kdcreq_realm (handle, asreq, salt, saltlen);
if (res != SHISHI_OK)
return res;
res = shishi_asn1_number_of_elements (handle, asreq,
"req-body.cname.name-string", &n);
if (res != SHISHI_OK)
return res;
for (i = 1; i <= n; i++)
{
char *tmp;
size_t tmplen;
asprintf (&format, "req-body.cname.name-string.?%ld", i);
res = shishi_asn1_read (handle, asreq, format, &tmp, &tmplen);
free (format);
if (res != SHISHI_OK)
return res;
*saltlen += tmplen;
*salt = xrealloc (*salt, *saltlen + 1);
memcpy (*salt + *saltlen - tmplen, tmp, tmplen);
(*salt)[*saltlen] = '\0';
free (tmp);
}
return SHISHI_OK;
}
|
↓
|
shishi_kdcrep_decrypt
|
11
|
39
|
70
|
kdcrep.c
|
int
shishi_kdcrep_decrypt (Shishi * handle,
Shishi_asn1 kdcrep,
Shishi_key * key,
int keyusage, Shishi_asn1 * enckdcreppart)
{
int res;
int i;
char *buf;
size_t buflen;
char *cipher;
size_t cipherlen;
int etype;
res = shishi_kdcrep_get_enc_part_etype (handle, kdcrep, &etype);
if (res != SHISHI_OK)
return res;
if (etype != shishi_key_type (key))
return SHISHI_KDCREP_BAD_KEYTYPE;
res = shishi_asn1_read (handle, kdcrep, "enc-part.cipher",
&cipher, &cipherlen);
if (res != SHISHI_OK)
return res;
res = shishi_decrypt (handle, key, keyusage,
cipher, cipherlen, &buf, &buflen);
free (cipher);
if (res != SHISHI_OK)
{
shishi_error_printf (handle,
"KDCRep decryption failed, wrong password?");
return res;
}
/* The crypto is so 1980; no length indicator. Trim off pad bytes
until we can parse it. */
for (i = 0; i < 8; i++)
{
if (VERBOSEASN1 (handle))
printf ("Trying with %d pad in enckdcrep...\n", i);
*enckdcreppart = shishi_der2asn1_encasreppart (handle, &buf[0],
buflen - i);
if (*enckdcreppart != NULL)
break;
*enckdcreppart = shishi_der2asn1_enctgsreppart (handle, &buf[0],
buflen - i);
if (*enckdcreppart != NULL)
break;
*enckdcreppart = shishi_der2asn1_enckdcreppart (handle, &buf[0],
buflen - i);
if (*enckdcreppart != NULL)
break;
}
free (buf);
if (*enckdcreppart == NULL)
{
shishi_error_printf (handle, "Could not DER decode EncKDCRepPart. "
"Password probably correct (decrypt ok) though\n");
return SHISHI_ASN1_ERROR;
}
return SHISHI_OK;
}
|
↓
|
shishi_tkts_get_tgs
|
11
|
31
|
51
|
tkts.c
|
Shishi_tkt *
shishi_tkts_get_tgs (Shishi_tkts * tkts,
Shishi_tkts_hint * hint, Shishi_tkt * tgt)
{
Shishi_tgs *tgs;
Shishi_tkt *tkt;
int rc;
rc = shishi_tgs (tkts->handle, &tgs);
shishi_tgs_tgtkt_set (tgs, tgt);
if (rc == SHISHI_OK)
rc = act_hint_on_kdcreq (tkts->handle, hint, shishi_tgs_req (tgs));
if (rc == SHISHI_OK)
rc = shishi_tgs_set_server (tgs, hint->server);
if (rc == SHISHI_OK)
rc = shishi_tgs_req_build (tgs);
if (rc == SHISHI_OK)
rc = shishi_tgs_sendrecv_hint (tgs, hint);
if (rc == SHISHI_OK)
rc = shishi_tgs_rep_process (tgs);
if (rc != SHISHI_OK)
{
shishi_error_printf (tkts->handle,
"TGS exchange failed: %s\n%s\n",
shishi_strerror (rc), shishi_error (tkts->handle));
if (rc == SHISHI_GOT_KRBERROR)
shishi_krberror_pretty_print (tkts->handle, stdout,
shishi_tgs_krberror (tgs));
return NULL;
}
tkt = shishi_tgs_tkt (tgs);
if (!tkt)
{
shishi_error_printf (tkts->handle, "No ticket in TGS-REP?!: %s",
shishi_error (tkts->handle));
return NULL;
}
if (VERBOSENOISE (tkts->handle))
{
printf ("Received ticket:\n");
shishi_tkt_pretty_print (tkt, stdout);
}
rc = shishi_tkts_add (tkts, tkt);
if (rc != SHISHI_OK)
printf ("Could not add ticket: %s", shishi_strerror (rc));
return tkt;
}
|
|
recover_preauth
|
10
|
45
|
96
|
tkts.c
|
|
sendrecv_tcp
|
10
|
55
|
92
|
netio.c
|
|
shishi_dr
|
10
|
45
|
74
|
crypto.c
|
|
shishi_as_check_cname
|
10
|
36
|
57
|
kdc.c
|
|
shishi_authenticator
|
10
|
35
|
73
|
authenticator.c
|
|
maybe_install_usercfg
|
10
|
34
|
55
|
init.c
|
|
_shishi_kdcreq_input
|
10
|
32
|
62
|
diskio.c
|
|
_shishi_read_armored_data
|
10
|
32
|
61
|
diskio.c
|
|
shishi_key_print
|
10
|
31
|
48
|
diskio.c
|
|
_shishi_kdcrep_input
|
10
|
30
|
61
|
diskio.c
|
|
_shishi_enckdcreppart_input
|
10
|
29
|
65
|
diskio.c
|
|
_shishi_simplified_derivekey
|
10
|
28
|
57
|
crypto.c
|
|
shishi_kdcreq_build
|
10
|
25
|
48
|
kdcreq.c
|
|
shishi_as_sendrecv_hint
|
10
|
22
|
35
|
as.c
|
|
_shishi_escapeprint
|
9
|
9
|
15
|
utils.c
|
|
shishi_n_fold
|
9
|
53
|
100
|
crypto.c
|
|
shishi_kdcreq_sendrecv_hint
|
9
|
40
|
78
|
kdc.c
|
|
shishi_kdc_copy_cname
|
9
|
35
|
50
|
kdc.c
|
|
shishi_priv_process
|
9
|
33
|
57
|
priv.c
|
|
shishi_apreq_decrypt
|
9
|
32
|
58
|
apreq.c
|
|
shishi_aprep_decrypt
|
9
|
32
|
58
|
aprep.c
|
|
shishi_ticket_decrypt
|
9
|
32
|
57
|
ticket.c
|
|
pack_principal
|
9
|
30
|
42
|
ccache.c
|
|
shishi_tgs_req_build
|
9
|
26
|
54
|
tgs.c
|
|
shishi_kdc_check_nonce_1
|
9
|
22
|
48
|
kdc.c
|
|
shishi_priv_from_file
|
9
|
21
|
34
|
priv.c
|
|
shishi_priv_to_file
|
9
|
21
|
34
|
priv.c
|
|
shishi_safe_from_file
|
9
|
21
|
34
|
safe.c
|
|
shishi_kdcreq_from_file
|
9
|
21
|
34
|
kdcreq.c
|
|
shishi_apreq_from_file
|
9
|
21
|
34
|
apreq.c
|
|
shishi_safe_to_file
|
9
|
21
|
34
|
safe.c
|
|
shishi_authenticator_from_file
|
9
|
21
|
34
|
authenticator.c
|
|
shishi_encapreppart_from_file
|
9
|
21
|
34
|
encapreppart.c
|
|
shishi_kdcrep_from_file
|
9
|
21
|
34
|
kdcrep.c
|
|
shishi_aprep_from_file
|
9
|
21
|
34
|
aprep.c
|
|
shishi_kdcreq_to_file
|
9
|
21
|
34
|
kdcreq.c
|
|
shishi_krberror_from_file
|
9
|
21
|
34
|
krberror.c
|
|
shishi_apreq_to_file
|
9
|
21
|
34
|
apreq.c
|
|
shishi_authenticator_to_file
|
9
|
21
|
34
|
authenticator.c
|
|
shishi_asn1_read
|
9
|
21
|
41
|
asn1.c
|
|
shishi_kdcrep_to_file
|
9
|
21
|
34
|
kdcrep.c
|
|
shishi_encapreppart_to_file
|
9
|
21
|
34
|
encapreppart.c
|
|
shishi_aprep_to_file
|
9
|
21
|
34
|
aprep.c
|
|
shishi_krberror_to_file
|
9
|
21
|
34
|
krberror.c
|
|
shishi_tgs_sendrecv_hint
|
9
|
20
|
35
|
tgs.c
|
|
des_verify
|
8
|
38
|
70
|
crypto-des.c
|
|
key_to_keytab_entry
|
8
|
84
|
122
|
keytab.c
|
|
sendrecv_udp
|
8
|
43
|
71
|
netio.c
|
|
arcfour_hmac_md5_checksum
|
8
|
42
|
75
|
crypto-rc4.c
|
|
main
|
8
|
37
|
69
|
ccache.c
|
|
shishi_tkt
|
8
|
31
|
69
|
tkt.c
|
|
shishi_ap_req_process_keyusage
|
8
|
30
|
70
|
ap.c
|
|
shishi_encrypt_ivupdate_etype
|
8
|
29
|
63
|
crypto.c
|
|
shishi_encapreppart
|
8
|
28
|
60
|
encapreppart.c
|
|
shishi_aprep_verify
|
8
|
26
|
60
|
aprep.c
|
|
_shishi_simplified_decrypt
|
8
|
26
|
61
|
crypto.c
|
|
_shishi_priv_input
|
8
|
24
|
48
|
diskio.c
|
|
_shishi_safe_input
|
8
|
24
|
48
|
diskio.c
|
|
_shishi_krberror_input
|
8
|
24
|
49
|
diskio.c
|
|
_shishi_authenticator_input
|
8
|
24
|
49
|
diskio.c
|
|
_shishi_encapreppart_input
|
8
|
24
|
50
|
diskio.c
|
|
_shishi_aprep_input
|
8
|
24
|
48
|
diskio.c
|
|
_shishi_apreq_input
|
8
|
24
|
48
|
diskio.c
|
|
shishi_tgs_rep_build
|
8
|
23
|
45
|
tgs.c
|
|
shishi_as_rep_build
|
8
|
23
|
46
|
as.c
|
|
shishi_tgs_rep_process
|
8
|
22
|
46
|
tgs.c
|
|
_shishi_ticket_input
|
8
|
22
|
43
|
diskio.c
|
|
do_preauth
|
8
|
21
|
49
|
tkts.c
|
|
shishi_realm_for_server_file
|
8
|
21
|
34
|
realm.c
|
|
shishi_realm_for_server_dns
|
8
|
19
|
33
|
realm.c
|
|
des_decrypt_verify
|
8
|
38
|
78
|
crypto-des.c
|
|
shishi_authorized_p
|
7
|
27
|
52
|
authorize.c
|
|
des3_string_to_key
|
7
|
37
|
65
|
crypto-3des.c
|
|
aes_string_to_key
|
7
|
35
|
65
|
crypto-aes.c
|
|
shishi_principal_name_realm
|
7
|
30
|
60
|
principal.c
|
|
shishi_done
|
7
|
30
|
49
|
init.c
|
|
shishi_asn1_to_der_field
|
7
|
29
|
61
|
asn1.c
|
|
rot13
|
7
|
28
|
51
|
crypto.c
|
|
shishi_tgs
|
7
|
27
|
50
|
tgs.c
|
|
shishi_tkts_print_for_service
|
7
|
26
|
50
|
tkts.c
|
|
shishi_tkts_read
|
7
|
25
|
43
|
tkts.c
|
|
shishi_aprep
|
7
|
23
|
46
|
aprep.c
|
|
ocadd
|
7
|
21
|
33
|
crypto.c
|
|
shishi_krberror
|
7
|
21
|
41
|
krberror.c
|
|
shishi_keys_from_file
|
7
|
21
|
37
|
keys.c
|
|
shishi_kdc_process
|
7
|
20
|
54
|
kdc.c
|
|
shishi_tkts_find
|
7
|
19
|
30
|
tkts.c
|
|
srv_compare
|
7
|
16
|
25
|
resolv.c
|
|
shishi_cipher_parse
|
7
|
16
|
21
|
crypto.c
|
|
shishi_ap_rep_verify
|
7
|
16
|
30
|
ap.c
|
|
shishi_init_server_with_paths
|
7
|
11
|
19
|
init.c
|
|
shishi_realm_default_guess
|
7
|
11
|
21
|
realm.c
|
|
shishi_tkt_key
|
7
|
10
|
24
|
tkt.c
|
|
shishi_init_server
|
6
|
9
|
18
|
init.c
|
|
arcfour_keyusage
|
6
|
7
|
63
|
crypto-rc4.c
|
|
init_handle
|
6
|
41
|
73
|
init.c
|
|
armor_data
|
6
|
30
|
56
|
diskio.c
|
|
shishi_cfg_print
|
6
|
27
|
35
|
cfg.c
|
|
shishi_principal_name_set
|
6
|
27
|
42
|
principal.c
|
|
shishi_as
|
6
|
25
|
46
|
as.c
|
|
shishi_decrypt_ivupdate_etype
|
6
|
25
|
57
|
crypto.c
|
|
shishi_kdcreq_get_padata
|
6
|
25
|
40
|
kdcreq.c
|
|
shishi_cfg_authorizationtype_set
|
6
|
24
|
39
|
cfg.c
|
|
shishi_cfg_clientkdcetype_set
|
6
|
24
|
38
|
cfg.c
|
|
shishi_encticketpart
|
6
|
24
|
45
|
encticketpart.c
|
|
shishi_ticket_sname_set
|
6
|
23
|
37
|
ticket.c
|
|
shishi_tkt_lastreq
|
6
|
23
|
38
|
tkt.c
|
|
shishi_safe_build
|
6
|
22
|
36
|
safe.c
|
|
shishi_tkts_write
|
6
|
21
|
46
|
tkts.c
|
|
shishi_enckdcreppart_sname_set
|
6
|
21
|
38
|
enckdcreppart.c
|
|
simplified_hmac_verify
|
6
|
21
|
37
|
crypto.c
|
|
ccache_pack
|
6
|
19
|
28
|
ccache.c
|
|
_shishi_kdcrep
|
6
|
18
|
36
|
kdcrep.c
|
|
shishi_keys_to_file
|
6
|
16
|
27
|
keys.c
|
|
shishi_tkt_lastreq_pretty_print
|
6
|
16
|
28
|
tkt.c
|
|
shishi_key_to_file
|
6
|
16
|
26
|
diskio.c
|
|
shishi_tkts_expire
|
6
|
12
|
27
|
tkts.c
|
|
shishi_asn1_read_optional
|
5
|
8
|
17
|
asn1.c
|
|
des_encrypt_checksum
|
5
|
28
|
51
|
crypto-des.c
|
|
shishi_des_cbc_mac
|
5
|
26
|
50
|
low-crypto.c
|
|
shishi_aprep_enc_part_add
|
5
|
25
|
51
|
aprep.c
|
|
des3_random_to_key
|
5
|
24
|
45
|
crypto-3des.c
|
|
shishi_ap_nosubkey
|
5
|
24
|
47
|
ap.c
|
|
des_checksum
|
5
|
23
|
40
|
crypto-des.c
|
|
shishi_safe_verify
|
5
|
22
|
35
|
safe.c
|
|
shishi_as_check_crealm
|
5
|
22
|
43
|
kdc.c
|
|
shishi_verify
|
5
|
22
|
44
|
crypto.c
|
|
shishi_checksum
|
5
|
21
|
45
|
crypto.c
|
|
shishi_authenticator_add_authorizationdata
|
5
|
20
|
37
|
authenticator.c
|
|
shishi_kdcreq_add_padata
|
5
|
20
|
31
|
kdcreq.c
|
|
shishi_authenticator_authorizationdata
|
5
|
19
|
33
|
authenticator.c
|
|
shishi_kdcreq_set_etype
|
5
|
18
|
27
|
kdcreq.c
|
|
shishi_as_process
|
5
|
18
|
34
|
kdc.c
|
|
shishi_encapreppart_time_copy
|
5
|
18
|
29
|
encapreppart.c
|
|
ccache_parse
|
5
|
18
|
28
|
ccache.c
|
|
sendrecv_srv3
|
5
|
18
|
35
|
netio.c
|
|
shishi_derive_default_salt
|
5
|
17
|
31
|
principal.c
|
|
shishi_encapreppart_get_key
|
5
|
17
|
29
|
encapreppart.c
|
|
shishi_tkts_get
|
5
|
16
|
30
|
tkts.c
|
|
shishi_ap_req_decode
|
5
|
15
|
29
|
ap.c
|
|
sendrecv_static
|
5
|
15
|
30
|
netio.c
|
|
sendrecv_srv2
|
5
|
15
|
30
|
netio.c
|
|
shishi_enckdcreppart
|
5
|
15
|
25
|
enckdcreppart.c
|
|
des3none_dencrypt
|
5
|
14
|
42
|
crypto-3des.c
|
|
shishi_key_from_base64
|
5
|
14
|
31
|
key.c
|
|
shishi_kdcreq_get_padata_tgs
|
5
|
14
|
25
|
kdcreq.c
|
|
shishi_kdcrep_set_enc_part
|
5
|
13
|
25
|
kdcrep.c
|
|
des_set_odd_key_parity
|
5
|
13
|
18
|
crypto-des.c
|
|
shishi_apreq_set_authenticator
|
5
|
13
|
26
|
apreq.c
|
|
shishi_ticket_set_enc_part
|
5
|
13
|
25
|
ticket.c
|
|
shishi_tkt_key_set
|
5
|
13
|
24
|
tkt.c
|
|
des_set_odd_key_parity
|
5
|
13
|
18
|
crypto-3des.c
|
|
shishi_keys_done
|
5
|
12
|
19
|
keys.c
|
|
shishi_tkts_remove
|
5
|
12
|
27
|
tkts.c
|
|
shishi_pbkdf2_sha1
|
5
|
11
|
24
|
low-crypto.c
|
|
_shishi_hexprint
|
5
|
11
|
16
|
utils.c
|
|
shishi_kdc_sendrecv_hint
|
5
|
11
|
27
|
netio.c
|
|
raw_des_checksum1
|
4
|
29
|
53
|
crypto-des.c
|
|
raw_des_checksum0
|
4
|
26
|
47
|
crypto-des.c
|
|
shishi_principal_default_guess
|
4
|
9
|
15
|
principal.c
|
|
shishi_ap_string2option
|
4
|
9
|
16
|
ap.c
|
|
shishi_ap_authenticator_cksumdata
|
4
|
7
|
13
|
ap.c
|
|
_shishi_transport2string
|
4
|
7
|
12
|
cfg.c
|
|
shishi_tkts_done
|
4
|
7
|
14
|
tkts.c
|
|
shishi_der_msgtype
|
4
|
3
|
9
|
asn1.c
|
|
shishi_keys_to_keytab_mem
|
4
|
22
|
41
|
keytab.c
|
|
shishi_string_to_key
|
4
|
21
|
46
|
crypto.c
|
|
shishi_key_value_set
|
4
|
2
|
8
|
key.c
|
|
shishi_principal_set
|
4
|
19
|
33
|
principal.c
|
|
shishi_dk
|
4
|
19
|
36
|
crypto.c
|
|
shishi_ticket_set_server
|
4
|
19
|
31
|
ticket.c
|
|
shishi_random_to_key
|
4
|
18
|
39
|
crypto.c
|
|
shishi_priv_build
|
4
|
18
|
36
|
priv.c
|
|
shishi_enckdcreppart_server_set
|
4
|
18
|
31
|
enckdcreppart.c
|
|
shishi_key_from_name
|
4
|
17
|
36
|
key.c
|
|
shishi_authenticator_get_subkey
|
4
|
16
|
29
|
authenticator.c
|
|
shishi_der2asn1_kdcreq
|
4
|
16
|
32
|
asn1.c
|
|
shishi_enckdcreppart_get_key
|
4
|
15
|
26
|
enckdcreppart.c
|
|
shishi_encticketpart_get_key
|
4
|
15
|
26
|
encticketpart.c
|
|
shishi_asn1_read_bitstring
|
4
|
15
|
30
|
asn1.c
|
|
shishi_asn1_read_int32
|
4
|
15
|
26
|
asn1.c
|
|
shishi_key_random
|
4
|
14
|
24
|
key.c
|
|
skip_authdata
|
4
|
14
|
22
|
ccache.c
|
|
skip_address
|
4
|
14
|
22
|
ccache.c
|
|
shishi_tkts_to_file
|
4
|
13
|
23
|
tkts.c
|
|
_shishi_asn1_init
|
4
|
13
|
28
|
asn1.c
|
|
shishi_tkts_from_file
|
4
|
13
|
23
|
tkts.c
|
|
shishi_ap_rep_build
|
4
|
13
|
27
|
ap.c
|
|
shishi_krberror_methoddata
|
4
|
13
|
26
|
krberror.c
|
|
shishi_encasreppart
|
4
|
12
|
20
|
enckdcreppart.c
|
|
shishi_tgs_req_process
|
4
|
12
|
21
|
tgs.c
|
|
shishi_checksum_parse
|
4
|
11
|
17
|
crypto.c
|
|
shishi_authenticator_add_cksum_type
|
4
|
11
|
28
|
authenticator.c
|
|
shishi_authorization_parse
|
4
|
11
|
19
|
authorize.c
|
|
shishi_tkt_renew_tillc
|
4
|
11
|
19
|
tkt.c
|
|
shishi_tkt_startctime
|
4
|
11
|
19
|
tkt.c
|
|
shishi_cfg_default_userdirectory
|
4
|
10
|
19
|
cfg.c
|
|
des_key_correction
|
4
|
10
|
19
|
crypto-des.c
|
|
shishi_asn1_read_inline
|
4
|
10
|
20
|
asn1.c
|
|
shishi_verbose
|
3
|
15
|
32
|
error.c
|
|
shishi_checksum_name
|
3
|
9
|
15
|
crypto.c
|
|
shishi_asn1_number_of_elements
|
3
|
9
|
19
|
asn1.c
|
|
write_binary_file
|
3
|
9
|
16
|
keytab.c
|
|
shishi_cipher_name
|
3
|
9
|
15
|
crypto.c
|
|
shishi_key_from_string
|
3
|
9
|
23
|
key.c
|
|
shishi_kdc_copy_nonce
|
3
|
9
|
17
|
kdc.c
|
|
shishi_tkts_from_ccache_file
|
3
|
9
|
19
|
tktccache.c
|
|
shishi_tkts_from_ccache_mem
|
3
|
9
|
20
|
tktccache.c
|
|
shishi_keys_from_keytab_file
|
3
|
9
|
19
|
keytab.c
|
|
shishi_keys_from_keytab_mem
|
3
|
9
|
20
|
keytab.c
|
|
shishi_strerror
|
3
|
9
|
16
|
error.c
|
|
shishi_krberror_errorcode_message
|
3
|
9
|
16
|
krberror.c
|
|
shishi_authenticator_subkey
|
3
|
9
|
16
|
authenticator.c
|
|
shishi_get_date
|
3
|
9
|
19
|
utils.c
|
|
shishi_authenticator_set_subkey
|
3
|
8
|
20
|
authenticator.c
|
|
shishi_ap_req_der
|
3
|
8
|
15
|
ap.c
|
|
shishi_tgs_set_realmserver
|
3
|
8
|
16
|
tgs.c
|
|
shishi_authenticator_set_cksum
|
3
|
8
|
20
|
authenticator.c
|
|
shishi_krberror_remove_sname
|
3
|
8
|
16
|
krberror.c
|
|
shishi_authenticator_cksum
|
3
|
8
|
20
|
authenticator.c
|
|
shishi_tkt_flags_set
|
3
|
8
|
17
|
tkt.c
|
|
shishi_kdcreq_set_realmserver
|
3
|
8
|
16
|
kdcreq.c
|
|
shishi_priv_set_enc_part
|
3
|
8
|
19
|
priv.c
|
|
shishi_ap_tktoptionsasn1usage
|
3
|
8
|
25
|
ap.c
|
|
shishi_ap_etype_tktoptionsdata
|
3
|
8
|
19
|
ap.c
|
|
null_decrypt
|
3
|
8
|
19
|
crypto-null.c
|
|
shishi_safe_set_cksum
|
3
|
8
|
17
|
safe.c
|
|
shishi_ap_tktoptionsraw
|
3
|
8
|
18
|
ap.c
|
|
shishi_safe_cksum
|
3
|
8
|
17
|
safe.c
|
|
shishi_enckdcreppart_srealmserver_set
|
3
|
8
|
17
|
enckdcreppart.c
|
|
shishi_ap_tktoptionsdata
|
3
|
8
|
18
|
ap.c
|
|
shishi_krberror_der
|
3
|
8
|
16
|
krberror.c
|
|
shishi_ap_tktoptions
|
3
|
8
|
16
|
ap.c
|
|
shishi_tkt_serverrealm_set
|
3
|
8
|
18
|
tkt.c
|
|
shishi_tkt_clientrealm_set
|
3
|
8
|
19
|
tkt.c
|
|
shishi_kdcrep_crealmserver_set
|
3
|
8
|
17
|
kdcrep.c
|
|
shishi_key_from_value
|
3
|
8
|
16
|
key.c
|
|
null_encrypt
|
3
|
8
|
19
|
crypto-null.c
|
|
shishi_aprep_enc_part_set
|
3
|
8
|
17
|
aprep.c
|
|
shishi_encticketpart_transited_set
|
3
|
8
|
20
|
encticketpart.c
|
|
shishi_encticketpart_cname_set
|
3
|
8
|
19
|
encticketpart.c
|
|
shishi_ticket_srealmserver_set
|
3
|
8
|
17
|
ticket.c
|
|
shishi_ap_rep_verify_der
|
3
|
8
|
15
|
ap.c
|
|
shishi_enckdcreppart_key_set
|
3
|
8
|
18
|
enckdcreppart.c
|
|
shishi_ap_rep_der
|
3
|
8
|
15
|
ap.c
|
|
_shishi_verify
|
3
|
7
|
11
|
crypto.c
|
|
_shishi_checksum
|
3
|
7
|
11
|
crypto.c
|
|
shishi_checksum_cksumlen
|
3
|
7
|
11
|
crypto.c
|
|
shishi_checksum_supported_p
|
3
|
7
|
11
|
crypto.c
|
|
_shishi_cipher_decrypt
|
3
|
7
|
11
|
crypto.c
|
|
shishi_krberror_ctime_set
|
3
|
7
|
16
|
krberror.c
|
|
_shishi_cipher_encrypt
|
3
|
7
|
11
|
crypto.c
|
|
_shishi_realminfo
|
3
|
7
|
11
|
cfg.c
|
|
_shishi_cipher_string_to_key
|
3
|
7
|
11
|
crypto.c
|
|
_shishi_cipher_random_to_key
|
3
|
7
|
11
|
crypto.c
|
|
shishi_cipher_defaultcksumtype
|
3
|
7
|
11
|
crypto.c
|
|
shishi_cipher_randomlen
|
3
|
7
|
11
|
crypto.c
|
|
shishi_cipher_keylen
|
3
|
7
|
11
|
crypto.c
|
|
shishi_randomize
|
3
|
7
|
15
|
low-crypto.c
|
|
shishi_cipher_confoundersize
|
3
|
7
|
11
|
crypto.c
|
|
shishi_cipher_blocksize
|
3
|
7
|
11
|
crypto.c
|
|
shishi_cipher_supported_p
|
3
|
7
|
11
|
crypto.c
|
|
shishi_hostkeys_default_file
|
3
|
7
|
14
|
hostkeys.c
|
|
shishi_enckdcreppart_renew_till_set
|
3
|
7
|
17
|
enckdcreppart.c
|
|
shishi_tkts_add
|
3
|
7
|
15
|
tkts.c
|
|
shishi_enckdcreppart_starttime_set
|
3
|
7
|
17
|
enckdcreppart.c
|
|
shishi_tkt_valid_at_time_p
|
3
|
6
|
12
|
tkt.c
|
|
shishi_asn1_done
|
3
|
5
|
14
|
asn1.c
|
|
shishi_error_set
|
3
|
5
|
13
|
error.c
|
|
shishi_init_with_paths
|
3
|
4
|
12
|
init.c
|
|
shishi_check_version
|
3
|
3
|
8
|
version.c
|
|
shishi_init
|
3
|
3
|
10
|
init.c
|
|
shishi_tkts_nth
|
3
|
3
|
8
|
tkts.c
|
|
shishi_tkts_default
|
3
|
3
|
9
|
tkts.c
|
|
shishi_keys_nth
|
3
|
3
|
8
|
keys.c
|
|
shishi_tkts_to_ccache_mem
|
3
|
18
|
33
|
tktccache.c
|
|
shishi_kdcrep_add_enc_part
|
3
|
17
|
37
|
kdcrep.c
|
|
shishi_kdc_check_nonce
|
3
|
17
|
36
|
kdc.c
|
|
arcfour_hmac_string_to_key
|
3
|
17
|
32
|
crypto-rc4.c
|
|
shishi_ticket_add_enc_part
|
3
|
17
|
38
|
ticket.c
|
|
shishi_apreq_add_authenticator
|
3
|
16
|
36
|
apreq.c
|
|
der2asn1
|
3
|
13
|
27
|
asn1.c
|
|
_shishi_simplified_checksum
|
3
|
12
|
29
|
crypto.c
|
|
shishi_ap_set_tktoptionsasn1usage
|
3
|
12
|
26
|
ap.c
|
|
shishi_kdcreq_add_padata_tgs
|
3
|
12
|
24
|
kdcreq.c
|
|
shishi_time
|
3
|
12
|
23
|
gztime.c
|
|
gss_des_checksum
|
3
|
11
|
24
|
crypto-des.c
|
|
shishi_kdcreq_tillc
|
3
|
11
|
19
|
kdcreq.c
|
|
shishi_asn1_write_bitstring
|
3
|
11
|
30
|
asn1.c
|
|
shishi_ticket
|
3
|
11
|
22
|
ticket.c
|
|
shishi_kdc_copy_crealm
|
3
|
11
|
19
|
kdc.c
|
|
_shishi_save_data
|
3
|
11
|
19
|
diskio.c
|
|
shishi_tkt_endctime
|
3
|
11
|
19
|
tkt.c
|
|
shishi_tkt_authctime
|
3
|
11
|
19
|
tkt.c
|
|
shishi_tkt_lastreqc
|
3
|
11
|
19
|
tkt.c
|
|
shishi_authenticator_add_random_subkey
|
3
|
10
|
19
|
authenticator.c
|
|
shishi_ap
|
3
|
10
|
23
|
ap.c
|
|
shishi_apreq_options_remove
|
3
|
10
|
19
|
apreq.c
|
|
shishi_apreq_options_add
|
3
|
10
|
18
|
apreq.c
|
|
shishi_tkt_flags_add
|
3
|
10
|
18
|
tkt.c
|
|
shishi_keys_to_keytab_file
|
3
|
10
|
18
|
keytab.c
|
|
shishi_arcfour
|
3
|
10
|
25
|
low-crypto.c
|
|
shishi_aprep_enc_part_make
|
3
|
10
|
28
|
aprep.c
|
|
shishi_keys_print
|
3
|
10
|
17
|
keys.c
|
|
shishi_keys_add
|
3
|
10
|
20
|
keys.c
|
|
shishi_encticketpart_key_set
|
3
|
10
|
20
|
encticketpart.c
|
|
shishi_kdcreq_options_add
|
3
|
10
|
19
|
kdcreq.c
|
|
shishi_ap_etype
|
3
|
10
|
25
|
ap.c
|
|
shishi_ap_option2string
|
2
|
10
|
26
|
ap.c
|
|
shishi_warn
|
2
|
13
|
29
|
error.c
|
|
shishi_info
|
2
|
13
|
29
|
error.c
|
|
_shishi_realminfo_new
|
2
|
9
|
19
|
cfg.c
|
|
shishi_tkt_clientrealm_p
|
2
|
9
|
17
|
tkt.c
|
|
des_random_to_key
|
2
|
9
|
20
|
crypto-des.c
|
|
shishi_tkt_client_p
|
2
|
9
|
17
|
tkt.c
|
|
shishi_crypto_decrypt
|
2
|
9
|
22
|
crypto-ctx.c
|
|
shishi_crypto_encrypt
|
2
|
9
|
22
|
crypto-ctx.c
|
|
put_uint32
|
2
|
8
|
12
|
ccache.c
|
|
shishi_tkt_server_p
|
2
|
8
|
16
|
tkt.c
|
|
shishi_asn1_write_int32
|
2
|
8
|
15
|
asn1.c
|
|
shishi_asn1_write_uint32
|
2
|
8
|
15
|
asn1.c
|
|
shishi_tkts_add_ccache_file
|
2
|
8
|
17
|
tktccache.c
|
|
shishi_ap_set_tktoptionsraw
|
2
|
8
|
21
|
ap.c
|
|
shishi_tkts_new
|
2
|
8
|
20
|
tkts.c
|
|
shishi_keys_add_keytab_file
|
2
|
8
|
17
|
keytab.c
|
|
shishi_ap_set_tktoptionsdata
|
2
|
8
|
20
|
ap.c
|
|
shishi_ctime
|
2
|
8
|
16
|
gztime.c
|
|
put_uint32_swapped
|
2
|
8
|
12
|
ccache.c
|
|
shishi_authenticator_add_random_subkey_etype
|
2
|
8
|
18
|
authenticator.c
|
|
shishi_asn1_empty_p
|
2
|
7
|
13
|
asn1.c
|
|
shishi_kdcreq_etype
|
2
|
7
|
14
|
kdcreq.c
|
|
get_uint32_swapped
|
2
|
7
|
12
|
ccache.c
|
|
get_uint32
|
2
|
7
|
12
|
ccache.c
|
|
asn1_new
|
2
|
7
|
15
|
asn1.c
|
|
get_uint16
|
2
|
7
|
11
|
ccache.c
|
|
get_uint8
|
2
|
7
|
11
|
ccache.c
|
|
shishi_ap_set_tktoptions
|
2
|
7
|
16
|
ap.c
|
|
shishi_tkt_decrypt
|
2
|
7
|
14
|
tkt.c
|
|
shishi_asn1_msgtype
|
2
|
6
|
13
|
asn1.c
|
|
put_uint16
|
2
|
6
|
10
|
ccache.c
|
|
shishi_realm_default
|
2
|
6
|
13
|
realm.c
|
|
shishi_tkts_default_file
|
2
|
6
|
14
|
tkts.c
|
|
shishi_tgs_set_realm
|
2
|
6
|
16
|
tgs.c
|
|
shishi_tkts_default_ccache
|
2
|
6
|
14
|
tktccache.c
|
|
shishi_tgs_set_server
|
2
|
6
|
16
|
tgs.c
|
|
shishi_principal_default
|
2
|
6
|
13
|
principal.c
|
|
ccache_pack_credential
|
2
|
6
|
13
|
ccache.c
|
|
shishi_key_from_random
|
2
|
6
|
15
|
key.c
|
|
shishi_as_rep_der_set
|
2
|
6
|
14
|
as.c
|
|
shishi_tkts_default_ccache_guess
|
2
|
6
|
15
|
tktccache.c
|
|
ccache_parse_credential
|
2
|
6
|
13
|
ccache.c
|
|
shishi_asn1_write
|
2
|
6
|
16
|
asn1.c
|
|
shishi_priv_encprivpart_der_set
|
2
|
6
|
14
|
priv.c
|
|
shishi_resolv_free
|
2
|
6
|
13
|
resolv.c
|
|
_shishi_tls_init
|
2
|
6
|
15
|
starttls.c
|
|
shishi_priv_priv_der_set
|
2
|
6
|
14
|
priv.c
|
|
shishi_tgs_req_der_set
|
2
|
6
|
14
|
tgs.c
|
|
shishi_safe_safe_der_set
|
2
|
6
|
14
|
safe.c
|
|
shishi_hmac_sha1
|
2
|
6
|
14
|
low-crypto.c
|
|
shishi_as_req_der_set
|
2
|
6
|
14
|
as.c
|
|
shishi_hmac_md5
|
2
|
6
|
14
|
low-crypto.c
|
|
shishi_md5
|
2
|
6
|
12
|
low-crypto.c
|
|
shishi_ap_rep_verify_asn1
|
2
|
6
|
13
|
ap.c
|
|
shishi_ap_rep_asn1
|
2
|
6
|
13
|
ap.c
|
|
shishi_md4
|
2
|
6
|
12
|
low-crypto.c
|
|
shishi_ap_rep_der_set
|
2
|
6
|
14
|
ap.c
|
|
xtime
|
2
|
6
|
14
|
utils.c
|
|
shishi_tkt_keytype_p
|
2
|
6
|
13
|
tkt.c
|
|
shishi_ap_req_asn1
|
2
|
6
|
13
|
ap.c
|
|
shishi_tkt_keytype_fast
|
2
|
6
|
13
|
tkt.c
|
|
shishi_krberror_errorcode_set
|
2
|
5
|
12
|
krberror.c
|
|
shishi_krberror_susec_set
|
2
|
5
|
12
|
krberror.c
|
|
shishi_krberror_susec
|
2
|
5
|
12
|
krberror.c
|
|
shishi_authenticator_remove_subkey
|
2
|
5
|
12
|
authenticator.c
|
|
shishi_ticket_realm_set
|
2
|
5
|
12
|
ticket.c
|
|
shishi_krberror_stime_set
|
2
|
5
|
13
|
krberror.c
|
|
shishi_krberror_remove_cusec
|
2
|
5
|
11
|
krberror.c
|
|
shishi_krberror_cusec_set
|
2
|
5
|
12
|
krberror.c
|
|
shishi_krberror_cusec
|
2
|
5
|
12
|
krberror.c
|
|
shishi_kdcrep_clear_padata
|
2
|
5
|
11
|
kdcrep.c
|
|
put_uint8
|
2
|
5
|
9
|
ccache.c
|
|
shishi_krberror_remove_ctime
|
2
|
5
|
11
|
krberror.c
|
|
shishi_authenticator_clear_authorizationdata
|
2
|
5
|
13
|
authenticator.c
|
|
shishi_krberror_server_set
|
2
|
5
|
12
|
krberror.c
|
|
shishi_krberror_set_sname
|
2
|
5
|
14
|
krberror.c
|
|
shishi_krberror_server
|
2
|
5
|
13
|
krberror.c
|
|
shishi_krberror_set_realm
|
2
|
5
|
12
|
krberror.c
|
|
shishi_authenticator_remove_cksum
|
2
|
5
|
13
|
authenticator.c
|
|
shishi_apreq_options_set
|
2
|
5
|
12
|
apreq.c
|
|
shishi_encprivpart_set_user_data
|
2
|
5
|
14
|
priv.c
|
|
shishi_krberror_client_set
|
2
|
5
|
12
|
krberror.c
|
|
shishi_kdcreq_set_server
|
2
|
5
|
12
|
kdcreq.c
|
|
shishi_encprivpart_user_data
|
2
|
5
|
14
|
priv.c
|
|
shishi_krberror_remove_cname
|
2
|
5
|
11
|
krberror.c
|
|
shishi_kdcreq_set_sname
|
2
|
5
|
14
|
kdcreq.c
|
|
shishi_authenticator_seqnumber_set
|
2
|
5
|
14
|
authenticator.c
|
|
shishi_tgs_krberror_der
|
2
|
5
|
11
|
tgs.c
|
|
shishi_krberror_set_cname
|
2
|
5
|
14
|
krberror.c
|
|
shishi_authenticator_seqnumber_remove
|
2
|
5
|
12
|
authenticator.c
|
|
shishi_safe_set_user_data
|
2
|
5
|
14
|
safe.c
|
|
shishi_krberror_client
|
2
|
5
|
13
|
krberror.c
|
|
shishi_kdcreq_set_realm
|
2
|
5
|
12
|
kdcreq.c
|
|
shishi_authenticator_seqnumber_get
|
2
|
5
|
14
|
authenticator.c
|
|
shishi_cfg_default_systemfile
|
2
|
5
|
11
|
cfg.c
|
|
shishi_safe_user_data
|
2
|
5
|
14
|
safe.c
|
|
arcfour_hmac_random_to_key
|
2
|
5
|
15
|
crypto-rc4.c
|
|
shishi_as_krberror_der
|
2
|
5
|
11
|
as.c
|
|
shishi_krberror_set_crealm
|
2
|
5
|
12
|
krberror.c
|
|
shishi_authenticator_cusec_set
|
2
|
5
|
12
|
authenticator.c
|
|
shishi_tkts_default_file_guess
|
2
|
5
|
11
|
tkts.c
|
|
shishi_encapreppart_seqnumber_set
|
2
|
5
|
14
|
encapreppart.c
|
|
shishi_krberror_remove_crealm
|
2
|
5
|
11
|
krberror.c
|
|
shishi_authenticator_cusec_get
|
2
|
5
|
12
|
authenticator.c
|
|
shishi_encapreppart_seqnumber_remove
|
2
|
5
|
12
|
encapreppart.c
|
|
shishi_authenticator_ctime_set
|
2
|
5
|
13
|
authenticator.c
|
|
shishi_encapreppart_seqnumber_get
|
2
|
5
|
14
|
encapreppart.c
|
|
shishi_as_rep_der
|
2
|
5
|
11
|
as.c
|
|
shishi_kdcreq_set_cname
|
2
|
5
|
13
|
kdcreq.c
|
|
shishi_encapreppart_cusec_set
|
2
|
5
|
12
|
encapreppart.c
|
|
shishi_authenticator_client_set
|
2
|
5
|
13
|
authenticator.c
|
|
shishi_tgs_rep_der
|
2
|
5
|
11
|
tgs.c
|
|
shishi_encapreppart_cusec_get
|
2
|
5
|
12
|
encapreppart.c
|
|
shishi_kdcreq_nonce_set
|
2
|
5
|
11
|
kdcreq.c
|
|
shishi_authenticator_set_cname
|
2
|
5
|
15
|
authenticator.c
|
|
shishi_kdcreq_nonce
|
2
|
5
|
11
|
kdcreq.c
|
|
shishi_encapreppart_ctime_set
|
2
|
5
|
13
|
encapreppart.c
|
|
shishi_kdcrep_client_set
|
2
|
5
|
12
|
kdcrep.c
|
|
shishi_authenticator_set_crealm
|
2
|
5
|
13
|
authenticator.c
|
|
shishi_enckdcreppart_srealm_set
|
2
|
5
|
13
|
enckdcreppart.c
|
|
shishi_kdcrep_cname_set
|
2
|
5
|
13
|
kdcrep.c
|
|
shishi_encticketpart_endtime_set
|
2
|
5
|
14
|
encticketpart.c
|
|
shishi_priv_encprivpart_der
|
2
|
5
|
11
|
priv.c
|
|
shishi_kdcrep_crealm_set
|
2
|
5
|
12
|
kdcrep.c
|
|
shishi_encticketpart_authtime_set
|
2
|
5
|
14
|
encticketpart.c
|
|
shishi_enckdcreppart_endtime_set
|
2
|
5
|
14
|
enckdcreppart.c
|
|
shishi_realm_for_server
|
2
|
5
|
11
|
realm.c
|
|
shishi_priv_priv_der
|
2
|
5
|
11
|
priv.c
|
|
shishi_tgs_req_der
|
2
|
5
|
11
|
tgs.c
|
|
shishi_enckdcreppart_authtime_set
|
2
|
5
|
14
|
enckdcreppart.c
|
|
shishi_safe_safe_der
|
2
|
5
|
11
|
safe.c
|
|
shishi_encticketpart_crealm_set
|
2
|
5
|
12
|
encticketpart.c
|
|
shishi_enckdcreppart_flags_set
|
2
|
5
|
12
|
enckdcreppart.c
|
|
shishi_as_req_der
|
2
|
5
|
11
|
as.c
|
|
shishi_tkt_build
|
2
|
5
|
12
|
tkt.c
|
|
shishi_enckdcreppart_nonce_set
|
2
|
5
|
12
|
enckdcreppart.c
|
|
shishi_encticketpart_flags_set
|
2
|
5
|
12
|
encticketpart.c
|
|
shishi_xalloc_die
|
2
|
5
|
9
|
utils.c
|
|
shishi_as_req_build
|
2
|
5
|
11
|
as.c
|
|
shishi_keys_remove
|
2
|
5
|
13
|
keys.c
|
|
shishi_krberror_remove_edata
|
2
|
5
|
11
|
krberror.c
|
|
shishi_krberror_set_edata
|
2
|
5
|
12
|
krberror.c
|
|
shishi_kdcreq_clear_padata
|
2
|
5
|
11
|
kdcreq.c
|
|
shishi_kdcreq_options_set
|
2
|
5
|
13
|
kdcreq.c
|
|
shishi_krberror_remove_etext
|
2
|
5
|
11
|
krberror.c
|
|
shishi_ap_key
|
2
|
5
|
15
|
ap.c
|
|
shishi_authenticator_add_subkey
|
2
|
5
|
16
|
authenticator.c
|
|
shishi_krberror_set_etext
|
2
|
5
|
12
|
krberror.c
|
|
shishi_key_realm_set
|
2
|
4
|
9
|
key.c
|
|
shishi_krberror_errorcode_fast
|
2
|
4
|
10
|
krberror.c
|
|
shishi_tkts_default_file_set
|
2
|
4
|
9
|
tkts.c
|
|
shishi_realm_default_set
|
2
|
4
|
9
|
realm.c
|
|
shishi_tkts_default_ccache_set
|
2
|
4
|
9
|
tktccache.c
|
|
shishi_principal_default_set
|
2
|
4
|
9
|
principal.c
|
|
shishi_ap_req_der_set
|
2
|
4
|
10
|
ap.c
|
|
shishi_key_principal_set
|
2
|
4
|
9
|
key.c
|
|
shishi_hostkeys_default_file_set
|
2
|
4
|
9
|
hostkeys.c
|
|
shishi_x509ca_default_file_set
|
2
|
4
|
9
|
pki.c
|
|
sendrecv_srv
|
2
|
4
|
12
|
netio.c
|
|
_shishi_crypto_init
|
2
|
4
|
10
|
low-crypto.c
|
|
aes256_random_to_key
|
2
|
4
|
11
|
crypto-aes.c
|
|
shishi_x509key_default_file_set
|
2
|
4
|
9
|
pki.c
|
|
aes128_random_to_key
|
2
|
4
|
11
|
crypto-aes.c
|
|
shishi_x509cert_default_file_set
|
2
|
4
|
9
|
pki.c
|
|
shishi_x509ca_default_file
|
2
|
3
|
8
|
pki.c
|
|
shishi_ap_req_set
|
2
|
3
|
7
|
ap.c
|
|
shishi_ap_authenticator_set
|
2
|
3
|
7
|
ap.c
|
|
shishi_cfg_clientkdcetype_fast
|
2
|
3
|
8
|
cfg.c
|
|
shishi_cfg_default_userfile
|
2
|
3
|
9
|
cfg.c
|
|
shishi_tgs_krberror_set
|
2
|
3
|
7
|
tgs.c
|
|
shishi_as_krberror_set
|
2
|
3
|
7
|
as.c
|
|
shishi_authorize_strcmp
|
2
|
3
|
9
|
authorize.c
|
|
shishi_as_rep_set
|
2
|
3
|
7
|
as.c
|
|
md5_checksum
|
2
|
3
|
11
|
crypto-md.c
|
|
gcd
|
2
|
3
|
8
|
crypto.c
|
|
md4_checksum
|
2
|
3
|
11
|
crypto-md.c
|
|
shishi_priv_encprivpart_set
|
2
|
3
|
7
|
priv.c
|
|
shishi_tkt_encticketpart_set
|
2
|
3
|
7
|
tkt.c
|
|
shishi_tkt_enckdcreppart_set
|
2
|
3
|
7
|
tkt.c
|
|
shishi_x509key_default_file
|
2
|
3
|
8
|
pki.c
|
|
shishi_tkt_ticket_set
|
2
|
3
|
7
|
tkt.c
|
|
shishi_error
|
2
|
3
|
8
|
error.c
|
|
shishi_priv_priv_set
|
2
|
3
|
7
|
priv.c
|
|
shishi_tgs_req_set
|
2
|
3
|
7
|
tgs.c
|
|
shishi_safe_safe_set
|
2
|
3
|
7
|
safe.c
|
|
shishi_as_req_set
|
2
|
3
|
7
|
as.c
|
|
shishi_tkt_done
|
2
|
3
|
7
|
tkt.c
|
|
shishi_x509cert_default_file
|
2
|
3
|
8
|
pki.c
|
|
shishi_ap_encapreppart_set
|
2
|
3
|
7
|
ap.c
|
|
shishi_ap_rep_set
|
2
|
3
|
7
|
ap.c
|
|
ccache_print_credential
|
2
|
24
|
26
|
ccache.c
|
|
shishi_tkts_size
|
2
|
2
|
5
|
tkts.c
|
|
srv_rr
|
2
|
17
|
27
|
resolv.c
|
|
shishi_crypto
|
2
|
12
|
25
|
crypto-ctx.c
|
|
shishi_encticketpart_authctime
|
2
|
11
|
20
|
encticketpart.c
|
|
armor_asn1
|
2
|
10
|
19
|
diskio.c
|
|
ccache_print_principal
|
2
|
10
|
17
|
ccache.c
|
|
shishi_error_printf
|
2
|
10
|
18
|
error.c
|
|
shishi_der2asn1
|
2
|
23
|
56
|
asn1.c
|
|
shishi_keys_for_localservicerealm_in_file
|
1
|
9
|
21
|
keys.c
|
|
shishi_tkts_get_for_localservicepasswd
|
1
|
9
|
19
|
tkts.c
|
|
shishi_generalize_ctime
|
1
|
8
|
18
|
gztime.c
|
|
shishi_crc
|
1
|
7
|
13
|
low-crypto.c
|
|
shishi_tkts_find_for_clientserver
|
1
|
7
|
15
|
tkts.c
|
|
txt_rr
|
1
|
7
|
13
|
resolv.c
|
|
shishi_ap_done
|
1
|
7
|
11
|
ap.c
|
|
shishi_tkts_get_for_clientserver
|
1
|
7
|
15
|
tkts.c
|
|
shishi_tkt2
|
1
|
7
|
16
|
tkt.c
|
|
shishi_server_for_local_service
|
1
|
6
|
14
|
principal.c
|
|
shishi_key_copy
|
1
|
6
|
10
|
key.c
|
|
shishi_tgs_done
|
1
|
6
|
10
|
tgs.c
|
|
shishi_as_done
|
1
|
5
|
9
|
as.c
|
|
shishi_keys
|
1
|
5
|
11
|
keys.c
|
|
_shishi_print_armored_data
|
1
|
5
|
16
|
diskio.c
|
|
ccache_print
|
1
|
4
|
8
|
ccache.c
|
|
shishi_generalize_time
|
1
|
4
|
11
|
gztime.c
|
|
shishi_key
|
1
|
4
|
10
|
key.c
|
|
shishi_priv_done
|
1
|
4
|
8
|
priv.c
|
|
shishi_kdcreq_renew_p
|
1
|
3
|
9
|
kdcreq.c
|
|
shishi_tkt_ok_as_delegate_p
|
1
|
3
|
9
|
tkt.c
|
|
shishi_kdcreq_enc_tkt_in_skey_p
|
1
|
3
|
9
|
kdcreq.c
|
|
shishi_tkt_transited_policy_checked_p
|
1
|
3
|
9
|
tkt.c
|
|
shishi_kdcreq_renewable_ok_p
|
1
|
3
|
9
|
kdcreq.c
|
|
shishi_kdcreq_disable_transited_check_p
|
1
|
3
|
9
|
kdcreq.c
|
|
shishi_tkt_hw_authent_p
|
1
|
3
|
9
|
tkt.c
|
|
shishi_kdcreq_renewable_p
|
1
|
3
|
9
|
kdcreq.c
|
|
shishi_tkt_pre_authent_p
|
1
|
3
|
9
|
tkt.c
|
|
shishi_kdcreq_postdated_p
|
1
|
3
|
9
|
kdcreq.c
|
|
shishi_tkt_initial_p
|
1
|
3
|
9
|
tkt.c
|
|
shishi_kdcreq_allow_postdate_p
|
1
|
3
|
9
|
kdcreq.c
|
|
shishi_tkt_renewable_p
|
1
|
3
|
9
|
tkt.c
|
|
shishi_kdcreq_proxy_p
|
1
|
3
|
9
|
kdcreq.c
|
|
shishi_tkt_invalid_p
|
1
|
3
|
9
|
tkt.c
|
|
shishi_kdcreq_proxiable_p
|
1
|
3
|
9
|
kdcreq.c
|
|
shishi_tkt_postdated_p
|
1
|
3
|
9
|
tkt.c
|
|
shishi_kdcreq_forwarded_p
|
1
|
3
|
9
|
kdcreq.c
|
|
shishi_tkt_may_postdate_p
|
1
|
3
|
9
|
tkt.c
|
|
shishi_kdcreq_forwardable_p
|
1
|
3
|
9
|
kdcreq.c
|
|
shishi_tkt_proxy_p
|
1
|
3
|
9
|
tkt.c
|
|
shishi_tkt_proxiable_p
|
1
|
3
|
9
|
tkt.c
|
|
shishi_tkt_forwarded_p
|
1
|
3
|
9
|
tkt.c
|
|
shishi_tkt_forwardable_p
|
1
|
3
|
9
|
tkt.c
|
|
shishi_ap_authenticator_cksumraw_set
|
1
|
3
|
11
|
ap.c
|
|
shishi_apreq_mutual_required_p
|
1
|
3
|
9
|
apreq.c
|
|
shishi_apreq_use_session_key_p
|
1
|
3
|
9
|
apreq.c
|
|
shishi_cfg_userdirectory_file
|
1
|
3
|
9
|
cfg.c
|
|
shishi_key_done
|
1
|
3
|
7
|
key.c
|
|
shishi_ticket_get_enc_part_etype
|
1
|
3
|
10
|
ticket.c
|
|
shishi_crypto_close
|
1
|
3
|
7
|
crypto-ctx.c
|
|
shishi_tkts
|
1
|
3
|
9
|
tkts.c
|
|
shishi_tkt_expired_p
|
1
|
3
|
8
|
tkt.c
|
|
shishi_safe_done
|
1
|
3
|
7
|
safe.c
|
|
shishi_kdcreq_validate_p
|
1
|
3
|
9
|
kdcreq.c
|
|
shishi_ap_authenticator_cksumdata_set
|
1
|
2
|
9
|
ap.c
|
|
shishi_generalize_now
|
1
|
2
|
7
|
gztime.c
|
|
shishi_cfg_clientkdcetype
|
1
|
2
|
6
|
cfg.c
|
|
simplified_hmac
|
1
|
2
|
11
|
crypto.c
|
|
shishi_der2asn1_padata
|
1
|
1
|
5
|
asn1.c
|
|
shishi_tkt_keytype
|
1
|
1
|
6
|
tkt.c
|
|
shishi_x509cert_default_file_guess
|
1
|
1
|
5
|
pki.c
|
|
shishi_tgsrep
|
1
|
1
|
5
|
kdcrep.c
|
|
shishi_krberror_errorcode
|
1
|
1
|
6
|
krberror.c
|
|
shishi_krberror_print
|
1
|
1
|
5
|
krberror.c
|
|
shishi_keys_size
|
1
|
1
|
5
|
keys.c
|
|
shishi_krberror_stime
|
1
|
1
|
5
|
krberror.c
|
|
shishi_asn1_to_der
|
1
|
1
|
6
|
asn1.c
|
|
shishi_key_realm
|
1
|
1
|
5
|
key.c
|
|
des_md5_verify
|
1
|
1
|
11
|
crypto-des.c
|
|
shishi_asrep
|
1
|
1
|
5
|
kdcrep.c
|
|
des_md4_verify
|
1
|
1
|
11
|
crypto-des.c
|
|
shishi_hostkeys_for_server
|
1
|
1
|
7
|
hostkeys.c
|
|
shishi_tkts_find_for_server
|
1
|
1
|
6
|
tkts.c
|
|
shishi_asn1_encprivpart
|
1
|
1
|
5
|
asn1.c
|
|
null_string_to_key
|
1
|
1
|
8
|
crypto-null.c
|
|
shishi_asn1_priv
|
1
|
1
|
5
|
asn1.c
|
|
shishi_krberror_ctime
|
1
|
1
|
5
|
krberror.c
|
|
shishi_asn1_krbsafe
|
1
|
1
|
5
|
asn1.c
|
|
shishi_kdcreq_options
|
1
|
1
|
6
|
kdcreq.c
|
|
shishi_ap_req
|
1
|
1
|
5
|
ap.c
|
|
shishi_ticket_realm_get
|
1
|
1
|
6
|
ticket.c
|
|
shishi_asn1_krberror
|
1
|
1
|
5
|
asn1.c
|
|
des_md5_checksum
|
1
|
1
|
10
|
crypto-des.c
|
|
shishi_authenticator_add_cksum
|
1
|
1
|
12
|
authenticator.c
|
|
shishi_prompt_password_callback_get
|
1
|
1
|
5
|
password.c
|
|
des_md4_checksum
|
1
|
1
|
10
|
crypto-des.c
|
|
shishi_asn1_encasreppart
|
1
|
1
|
5
|
asn1.c
|
|
shishi_ap_authenticator
|
1
|
1
|
5
|
ap.c
|
|
des_crc_checksum
|
1
|
1
|
10
|
crypto-des.c
|
|
shishi_asn1_enckdcreppart
|
1
|
1
|
5
|
asn1.c
|
|
shishi_apreq_get_authenticator_etype
|
1
|
1
|
6
|
apreq.c
|
|
null_random_to_key
|
1
|
1
|
6
|
crypto-null.c
|
|
aes256_decrypt
|
1
|
1
|
11
|
crypto-aes.c
|
|
shishi_ap_authenticator_cksumtype_set
|
1
|
1
|
5
|
ap.c
|
|
shishi_asn1_authenticator
|
1
|
1
|
5
|
asn1.c
|
|
shishi_ap_authenticator_cksumtype
|
1
|
1
|
5
|
ap.c
|
|
shishi_asn1_encticketpart
|
1
|
1
|
5
|
asn1.c
|
|
shishi_asn1_ticket
|
1
|
1
|
5
|
asn1.c
|
|
shishi_tgs_sendrecv
|
1
|
1
|
5
|
tgs.c
|
|
shishi_asn1_encapreppart
|
1
|
1
|
5
|
asn1.c
|
|
shishi_asn1_aprep
|
1
|
1
|
5
|
asn1.c
|
|
shishi_kdcreq_till
|
1
|
1
|
6
|
kdcreq.c
|
|
shishi_asn1_apreq
|
1
|
1
|
5
|
asn1.c
|
|
shishi_tkts_print
|
1
|
1
|
5
|
tkts.c
|
|
shishi_authenticator_clientrealm
|
1
|
1
|
10
|
authenticator.c
|
|
shishi_krberror_realm
|
1
|
1
|
6
|
krberror.c
|
|
shishi_as_sendrecv
|
1
|
1
|
5
|
as.c
|
|
shishi_asn1_tgsrep
|
1
|
1
|
5
|
asn1.c
|
|
shishi_tgs_tkt_set
|
1
|
1
|
5
|
tgs.c
|
|
shishi_asn1_tgsreq
|
1
|
1
|
5
|
asn1.c
|
|
shishi_ap_tkt_set
|
1
|
1
|
5
|
ap.c
|
|
shishi_authenticator_client
|
1
|
1
|
8
|
authenticator.c
|
|
shishi_tkt_flags
|
1
|
1
|
6
|
tkt.c
|
|
aes256_encrypt
|
1
|
1
|
11
|
crypto-aes.c
|
|
shishi_tgs_tkt
|
1
|
1
|
5
|
tgs.c
|
|
shishi_ap_tkt
|
1
|
1
|
5
|
ap.c
|
|
shishi_asn1_asrep
|
1
|
1
|
5
|
asn1.c
|
|
shishi_asn1_asreq
|
1
|
1
|
5
|
asn1.c
|
|
shishi_apreq_options
|
1
|
1
|
5
|
apreq.c
|
|
shishi_prompt_password_callback_set
|
1
|
1
|
6
|
password.c
|
|
shishi_asn1_etype_info2
|
1
|
1
|
5
|
asn1.c
|
|
shishi_kdcreq_server
|
1
|
1
|
7
|
kdcreq.c
|
|
shishi_tkt_server
|
1
|
1
|
5
|
tkt.c
|
|
shishi_as_tkt_set
|
1
|
1
|
5
|
as.c
|
|
shishi_asn1_etype_info
|
1
|
1
|
5
|
asn1.c
|
|
shishi_as_tkt
|
1
|
1
|
5
|
as.c
|
|
shishi_tgs_krberror
|
1
|
1
|
5
|
tgs.c
|
|
shishi_priv_enc_part_etype
|
1
|
1
|
6
|
priv.c
|
|
shishi_tkt_realm
|
1
|
1
|
5
|
tkt.c
|
|
shishi_asn1_methoddata
|
1
|
1
|
5
|
asn1.c
|
|
shishi_aes_cts
|
1
|
1
|
10
|
low-crypto.c
|
|
shishi_key_principal
|
1
|
1
|
5
|
key.c
|
|
shishi_asn1_padata
|
1
|
1
|
5
|
asn1.c
|
|
shishi_kdcreq_realm_get
|
1
|
1
|
7
|
kdcreq.c
|
|
shishi_asn1_encrypteddata
|
1
|
1
|
5
|
asn1.c
|
|
shishi_kdcreq_realm
|
1
|
1
|
7
|
kdcreq.c
|
|
shishi_3des
|
1
|
1
|
10
|
low-crypto.c
|
|
_shishi_tls_done
|
1
|
1
|
7
|
starttls.c
|
|
shishi_asn1_pa_enc_ts_enc
|
1
|
1
|
5
|
asn1.c
|
|
shishi_as_krberror
|
1
|
1
|
5
|
as.c
|
|
shishi_tkt_clientrealm
|
1
|
1
|
8
|
tkt.c
|
|
_des3_decrypt
|
1
|
1
|
12
|
crypto-3des.c
|
|
shishi_kdc_sendrecv
|
1
|
1
|
8
|
netio.c
|
|
shishi_asreq_clientrealm
|
1
|
1
|
10
|
kdcreq.c
|
|
shishi_priv_read
|
1
|
1
|
5
|
priv.c
|
|
aes128_decrypt
|
1
|
1
|
11
|
crypto-aes.c
|
|
shishi_des
|
1
|
1
|
9
|
low-crypto.c
|
|
shishi_krberror_crealm
|
1
|
1
|
6
|
krberror.c
|
|
shishi_priv_parse
|
1
|
1
|
5
|
priv.c
|
|
_shishi_quick_random
|
1
|
1
|
5
|
low-crypto.c
|
|
shishi_kdcreq_client
|
1
|
1
|
7
|
kdcreq.c
|
|
shishi_enckdcreppart_read
|
1
|
1
|
6
|
diskio.c
|
|
lcm
|
1
|
1
|
5
|
crypto.c
|
|
shishi_enckdcreppart_parse
|
1
|
1
|
6
|
diskio.c
|
|
shishi_tkt_client
|
1
|
1
|
6
|
tkt.c
|
|
shishi_authenticator_ctime
|
1
|
1
|
6
|
authenticator.c
|
|
shishi_x509ca_default_file_guess
|
1
|
1
|
5
|
pki.c
|
|
shishi_encticketpart_clientrealm
|
1
|
1
|
10
|
encticketpart.c
|
|
arcfour_hmac_exp_decrypt
|
1
|
1
|
13
|
crypto-rc4.c
|
|
shishi_aprep_get_enc_part_etype
|
1
|
1
|
6
|
aprep.c
|
|
shishi_asn1_write_integer
|
1
|
1
|
6
|
asn1.c
|
|
shishi_kdcrep_get_enc_part_etype
|
1
|
1
|
6
|
kdcrep.c
|
|
des_none_decrypt
|
1
|
1
|
12
|
crypto-des.c
|
|
arcfour_hmac_exp_encrypt
|
1
|
1
|
14
|
crypto-rc4.c
|
|
shishi_keys_for_server_in_file
|
1
|
1
|
6
|
keys.c
|
|
shishi_encticketpart_client
|
1
|
1
|
8
|
encticketpart.c
|
|
shishi_priv_save
|
1
|
1
|
5
|
priv.c
|
|
des_md5_decrypt
|
1
|
1
|
13
|
crypto-des.c
|
|
shishi_tgs_rep
|
1
|
1
|
5
|
tgs.c
|
|
shishi_safe_read
|
1
|
1
|
5
|
safe.c
|
|
des_md4_decrypt
|
1
|
1
|
13
|
crypto-des.c
|
|
shishi_priv_print
|
1
|
1
|
5
|
priv.c
|
|
shishi_ticket_read
|
1
|
1
|
5
|
diskio.c
|
|
shishi_safe_parse
|
1
|
1
|
5
|
safe.c
|
|
shishi_ticket_parse
|
1
|
1
|
5
|
diskio.c
|
|
des_crc_decrypt
|
1
|
1
|
14
|
crypto-des.c
|
|
shishi_encapreppart_ctime
|
1
|
1
|
6
|
encapreppart.c
|
|
shishi_encticketpart_authtime
|
1
|
1
|
8
|
encticketpart.c
|
|
_des3_encrypt
|
1
|
1
|
12
|
crypto-3des.c
|
|
aes128_encrypt
|
1
|
1
|
11
|
crypto-aes.c
|
|
shishi_error_set_outputtype
|
1
|
1
|
5
|
error.c
|
|
shishi_error_outputtype
|
1
|
1
|
5
|
error.c
|
|
shishi_kdcreq_read
|
1
|
1
|
5
|
kdcreq.c
|
|
shishi_asn1_read_integer
|
1
|
1
|
6
|
asn1.c
|
|
des3_checksum
|
1
|
1
|
10
|
crypto-3des.c
|
|
shishi_resolv
|
1
|
1
|
5
|
resolv.c
|
|
shishi_asn1_read_uint32
|
1
|
1
|
6
|
asn1.c
|
|
shishi_apreq_read
|
1
|
1
|
5
|
apreq.c
|
|
shishi_kdcreq_parse
|
1
|
1
|
5
|
kdcreq.c
|
|
shishi_safe_save
|
1
|
1
|
5
|
safe.c
|
|
shishi_authenticator_read
|
1
|
1
|
6
|
authenticator.c
|
|
shishi_priv_encprivpart
|
1
|
1
|
5
|
priv.c
|
|
shishi_key_length
|
1
|
1
|
5
|
key.c
|
|
shishi_tkt_encticketpart
|
1
|
1
|
5
|
tkt.c
|
|
shishi_apreq_parse
|
1
|
1
|
5
|
apreq.c
|
|
shishi_safe_print
|
1
|
1
|
5
|
safe.c
|
|
shishi_key_name
|
1
|
1
|
5
|
key.c
|
|
shishi_tkt_kdcrep
|
1
|
1
|
5
|
tkt.c
|
|
shishi_authenticator_parse
|
1
|
1
|
6
|
authenticator.c
|
|
des_none_encrypt
|
1
|
1
|
12
|
crypto-des.c
|
|
shishi_key_timestamp_set
|
1
|
1
|
5
|
key.c
|
|
shishi_as_rep
|
1
|
1
|
5
|
as.c
|
|
des_md5_encrypt
|
1
|
1
|
13
|
crypto-des.c
|
|
shishi_encapreppart_read
|
1
|
1
|
6
|
encapreppart.c
|
|
shishi_kdcrep_read
|
1
|
1
|
5
|
kdcrep.c
|
|
shishi_error_clear
|
1
|
1
|
5
|
error.c
|
|
shishi_key_timestamp
|
1
|
1
|
5
|
key.c
|
|
shishi_tkt_enckdcreppart
|
1
|
1
|
5
|
tkt.c
|
|
shishi_encticketpart_print
|
1
|
1
|
7
|
diskio.c
|
|
aes256_checksum
|
1
|
1
|
10
|
crypto-aes.c
|
|
shishi_aprep_read
|
1
|
1
|
5
|
aprep.c
|
|
shishi_ticket_print
|
1
|
1
|
5
|
diskio.c
|
|
des_md4_encrypt
|
1
|
1
|
13
|
crypto-des.c
|
|
shishi_kdcreq_save
|
1
|
1
|
5
|
kdcreq.c
|
|
shishi_ticket_save
|
1
|
1
|
5
|
diskio.c
|
|
shishi_kdcrep_parse
|
1
|
1
|
5
|
kdcrep.c
|
|
shishi_encapreppart_parse
|
1
|
1
|
6
|
encapreppart.c
|
|
aes128_checksum
|
1
|
1
|
10
|
crypto-aes.c
|
|
shishi_krberror_read
|
1
|
1
|
5
|
krberror.c
|
|
shishi_key_version_set
|
1
|
1
|
5
|
key.c
|
|
shishi_kdcreq_sendrecv
|
1
|
1
|
6
|
kdc.c
|
|
shishi_enckdcreppart_save
|
1
|
1
|
6
|
diskio.c
|
|
shishi_aprep_parse
|
1
|
1
|
5
|
aprep.c
|
|
des_crc_encrypt
|
1
|
1
|
13
|
crypto-des.c
|
|
shishi_apreq_save
|
1
|
1
|
5
|
apreq.c
|
|
shishi_kdcreq_print
|
1
|
1
|
5
|
kdcreq.c
|
|
shishi_enckdcreppart_print
|
1
|
1
|
7
|
diskio.c
|
|
shishi_tkt_ticket
|
1
|
1
|
5
|
tkt.c
|
|
shishi_key_version
|
1
|
1
|
5
|
key.c
|
|
shishi_decrypt
|
1
|
1
|
11
|
crypto.c
|
|
shishi_krberror_parse
|
1
|
1
|
5
|
krberror.c
|
|
shishi_etype_info2_print
|
1
|
1
|
6
|
diskio.c
|
|
shishi_priv_priv
|
1
|
1
|
5
|
priv.c
|
|
shishi_decrypt_iv
|
1
|
1
|
12
|
crypto.c
|
|
shishi_tgs_req
|
1
|
1
|
5
|
tgs.c
|
|
shishi_authenticator_save
|
1
|
1
|
6
|
authenticator.c
|
|
shishi_apreq_print
|
1
|
1
|
5
|
apreq.c
|
|
shishi_decrypt_ivupdate
|
1
|
1
|
14
|
crypto.c
|
|
shishi_etype_info_print
|
1
|
1
|
6
|
diskio.c
|
|
shishi_tgsreq
|
1
|
1
|
5
|
kdcreq.c
|
|
shishi_encticketpart_crealm
|
1
|
1
|
8
|
encticketpart.c
|
|
shishi_decrypt_etype
|
1
|
1
|
12
|
crypto.c
|
|
shishi_safe_safe
|
1
|
1
|
5
|
safe.c
|
|
shishi_methoddata_print
|
1
|
1
|
6
|
diskio.c
|
|
shishi_decrypt_iv_etype
|
1
|
1
|
13
|
crypto.c
|
|
shishi_priv_key_set
|
1
|
1
|
5
|
priv.c
|
|
aes256_string_to_key
|
1
|
1
|
11
|
crypto-aes.c
|
|
shishi_tgs_ap
|
1
|
1
|
5
|
tgs.c
|
|
shishi_x509key_default_file_guess
|
1
|
1
|
5
|
pki.c
|
|
shishi_padata_print
|
1
|
1
|
5
|
diskio.c
|
|
shishi_authenticator_print
|
1
|
1
|
7
|
authenticator.c
|
|
shishi_asreq
|
1
|
1
|
5
|
kdcreq.c
|
|
shishi_safe_key_set
|
1
|
1
|
5
|
safe.c
|
|
shishi_priv_key
|
1
|
1
|
5
|
priv.c
|
|
aes128_string_to_key
|
1
|
1
|
11
|
crypto-aes.c
|
|
shishi_encrypt
|
1
|
1
|
11
|
crypto.c
|
|
shishi_key_value
|
1
|
1
|
5
|
key.c
|
|
shishi_krberror_message
|
1
|
1
|
6
|
krberror.c
|
|
shishi_hostkeys_for_localservice
|
1
|
1
|
5
|
hostkeys.c
|
|
shishi_tkts_get_for_server
|
1
|
1
|
6
|
tkts.c
|
|
shishi_encrypt_iv
|
1
|
1
|
12
|
crypto.c
|
|
shishi_asn1_print
|
1
|
1
|
5
|
asn1.c
|
|
shishi_tgs_tgtkt_set
|
1
|
1
|
5
|
tgs.c
|
|
shishi_server
|
1
|
1
|
5
|
init.c
|
|
shishi_encrypt_ivupdate
|
1
|
1
|
14
|
crypto.c
|
|
shishi_der2asn1_encapreppart
|
1
|
1
|
6
|
asn1.c
|
|
shishi_safe_key
|
1
|
1
|
5
|
safe.c
|
|
shishi_der2asn1_aprep
|
1
|
1
|
5
|
asn1.c
|
|
shishi_encrypt_etype
|
1
|
1
|
13
|
crypto.c
|
|
shishi_der2asn1_apreq
|
1
|
1
|
5
|
asn1.c
|
|
shishi_ap_encapreppart
|
1
|
1
|
5
|
ap.c
|
|
shishi_tkt_valid_now_p
|
1
|
1
|
5
|
tkt.c
|
|
shishi_der2asn1_encprivpart
|
1
|
1
|
6
|
asn1.c
|
|
shishi_key_type_set
|
1
|
1
|
5
|
key.c
|
|
shishi_kdcrep_save
|
1
|
1
|
5
|
kdcrep.c
|
|
shishi_der2asn1_priv
|
1
|
1
|
5
|
asn1.c
|
|
shishi_encrypt_iv_etype
|
1
|
1
|
13
|
crypto.c
|
|
shishi_encapreppart_save
|
1
|
1
|
6
|
encapreppart.c
|
|
shishi_tgs_tgtkt
|
1
|
1
|
5
|
tgs.c
|
|
shishi_der2asn1_krbsafe
|
1
|
1
|
5
|
asn1.c
|
|
shishi_der2asn1_krberror
|
1
|
1
|
5
|
asn1.c
|
|
shishi_tkt_renew_till
|
1
|
1
|
7
|
tkt.c
|
|
shishi_hostkeys_for_localservicerealm
|
1
|
1
|
7
|
hostkeys.c
|
|
shishi_der2asn1_authenticator
|
1
|
1
|
7
|
asn1.c
|
|
shishi_aprep_save
|
1
|
1
|
5
|
aprep.c
|
|
shishi_der2asn1_enckdcreppart
|
1
|
1
|
7
|
asn1.c
|
|
shishi
|
1
|
1
|
5
|
init.c
|
|
shishi_as_req
|
1
|
1
|
5
|
as.c
|
|
shishi_tkts_default_to_file
|
1
|
1
|
5
|
tkts.c
|
|
shishi_tkt_endtime
|
1
|
1
|
6
|
tkt.c
|
|
shishi_der2asn1_enctgsreppart
|
1
|
1
|
7
|
asn1.c
|
|
shishi_der2asn1_encasreppart
|
1
|
1
|
6
|
asn1.c
|
|
shishi_ticket_server
|
1
|
1
|
6
|
ticket.c
|
|
shishi_der2asn1_kdcrep
|
1
|
1
|
5
|
asn1.c
|
|
shishi_key_type
|
1
|
1
|
5
|
key.c
|
|
shishi_tkt_starttime
|
1
|
1
|
7
|
tkt.c
|
|
shishi_der2asn1_tgsrep
|
1
|
1
|
5
|
asn1.c
|
|
shishi_kdcrep_print
|
1
|
1
|
5
|
kdcrep.c
|
|
shishi_der2asn1_asrep
|
1
|
1
|
5
|
asn1.c
|
|
shishi_tkt_authtime
|
1
|
1
|
6
|
tkt.c
|
|
des3none_decrypt
|
1
|
1
|
11
|
crypto-3des.c
|
|
shishi_der2asn1_tgsreq
|
1
|
1
|
5
|
asn1.c
|
|
shishi_krberror_save
|
1
|
1
|
5
|
krberror.c
|
|
shishi_der2asn1_asreq
|
1
|
1
|
5
|
asn1.c
|
|
shishi_encapreppart_print
|
1
|
1
|
7
|
encapreppart.c
|
|
shishi_der2asn1_encticketpart
|
1
|
1
|
7
|
asn1.c
|
|
shishi_krberror_edata
|
1
|
1
|
6
|
krberror.c
|
|
shishi_ap_rep
|
1
|
1
|
5
|
ap.c
|
|
shishi_der2asn1_ticket
|
1
|
1
|
5
|
asn1.c
|
|
shishi_aprep_print
|
1
|
1
|
5
|
aprep.c
|
|
shishi_der2asn1_etype_info2
|
1
|
1
|
6
|
asn1.c
|
|
shishi_der2asn1_etype_info
|
1
|
1
|
5
|
asn1.c
|
|
shishi_der2asn1_methoddata
|
1
|
1
|
6
|
asn1.c
|
|
shishi_hostkeys_for_serverrealm
|
1
|
1
|
7
|
hostkeys.c
|
|
shishi_krberror_etext
|
1
|
1
|
6
|
krberror.c
|
|
shishi_ap_req_process
|
1
|
1
|
6
|
ap.c
|
|
des3none_encrypt
|
1
|
1
|
11
|
crypto-3des.c
|