#include <stdio.h>
#include <krb5.h>
#include <kcm.h>
static void
add_cred(krb5_context context)
{
krb5_error_code ret;
krb5_storage *request, *response;
krb5_data response_data;
krb5_data data;
#if 0
char password[512];
if (UI_UTIL_read_pw_string(password, sizeof(password),
"Password:", 0) != 1)
errx(1, "failed reading password");
#endif
ret = krb5_kcm_storage_request(context, KCM_OP_ADD_NTLM_CRED, &request);
if (ret)
krb5_err(context, 1, ret, "krb5_kcm_storage_request");
krb5_store_stringz(request, "lha");
krb5_store_stringz(request, "BUILTIN");
data.data = "\xac\x8e\x65\x7f\x83\xdf\x82\xbe\xea\x5d\x43\xbd\xaf\x78\x0\xcc";
data.length = 16;
krb5_store_data(request, data);
ret = krb5_kcm_call(context, request, &response, &response_data);
if (ret)
krb5_err(context, 1, ret, "krb5_kcm_call");
krb5_storage_free(request);
krb5_storage_free(response);
krb5_data_free(&response_data);
}
static void
list_cred(krb5_context context)
{
krb5_error_code ret;
krb5_storage *request, *response;
krb5_data response_data;
ret = krb5_kcm_storage_request(context, KCM_OP_GET_NTLM_USER_LIST, &request);
if (ret)
krb5_err(context, 1, ret, "krb5_kcm_storage_request");
ret = krb5_kcm_call(context, request, &response, &response_data);
if (ret)
krb5_err(context, 1, ret, "krb5_kcm_call");
while (1) {
uint32_t morep;
char *user = NULL, *domain = NULL;
ret = krb5_ret_uint32(response, &morep);
if (ret)
krb5_err(context, ret, 1, "ret: morep");
if (morep == 0)
break;
ret = krb5_ret_stringz(response, &user);
if (ret)
krb5_err(context, ret, 1, "ret: user");
ret = krb5_ret_stringz(response, &domain);
if (ret)
krb5_err(context, ret, 1, "ret: domain");
printf("user: %s domain: %s\n", user, domain);
}
krb5_storage_free(request);
krb5_storage_free(response);
krb5_data_free(&response_data);
}
int
main(int argc, char **argv)
{
krb5_error_code ret;
krb5_context context;
ret = krb5_init_context(&context);
if (ret)
errx(1, "krb5_init_context");
list_cred(context);
add_cred(context);
krb5_free_context(context);
return 0;
}