OM_uint32 GSSAPI_CALLCONV gssspi_acquire_cred_with_password(OM_uint32 *minor, const gss_name_t desired_name, const gss_buffer_t password, OM_uint32 time_req, const gss_OID_set desired_mechs, gss_cred_usage_t cred_usage, gss_cred_id_t *output_cred_handle, gss_OID_set *actual_mechs, OM_uint32 *time_rec) { OM_uint32 major, tmpMinor; major = gssEapAcquireCred(minor, desired_name, time_req, desired_mechs, cred_usage, output_cred_handle, actual_mechs, time_rec); if (GSS_ERROR(major)) goto cleanup; major = gssEapSetCredPassword(minor, *output_cred_handle, password); if (GSS_ERROR(major)) goto cleanup; cleanup: if (GSS_ERROR(major)) gssEapReleaseCred(&tmpMinor, output_cred_handle); return major; }
OM_uint32 gssEapResolveInitiatorCred(OM_uint32 *minor, const gss_cred_id_t cred, const gss_name_t targetName #ifndef HAVE_MOONSHOT_GET_IDENTITY GSSEAP_UNUSED #endif , gss_cred_id_t *pResolvedCred) { OM_uint32 major, tmpMinor; gss_cred_id_t resolvedCred = GSS_C_NO_CREDENTIAL; if (cred == GSS_C_NO_CREDENTIAL) { major = gssEapAcquireCred(minor, GSS_C_NO_NAME, GSS_C_INDEFINITE, GSS_C_NO_OID_SET, GSS_C_INITIATE, &resolvedCred, NULL, NULL); if (GSS_ERROR(major)) goto cleanup; } else { if ((cred->flags & CRED_FLAG_INITIATE) == 0) { major = GSS_S_NO_CRED; *minor = GSSEAP_CRED_USAGE_MISMATCH; goto cleanup; } major = gssEapDuplicateCred(minor, cred, &resolvedCred); if (GSS_ERROR(major)) goto cleanup; } if ((resolvedCred->flags & CRED_FLAG_RESOLVED) == 0) { #ifdef HAVE_MOONSHOT_GET_IDENTITY major = libMoonshotResolveInitiatorCred(minor, resolvedCred, targetName); if (major == GSS_S_CRED_UNAVAIL) #endif major = staticIdentityFileResolveInitiatorCred(minor, resolvedCred); if (GSS_ERROR(major) && major != GSS_S_CRED_UNAVAIL) goto cleanup; /* If we have a caller-supplied password, the credential is resolved. */ if ((resolvedCred->flags & CRED_FLAG_PASSWORD) == 0) { major = GSS_S_CRED_UNAVAIL; *minor = GSSEAP_NO_DEFAULT_CRED; goto cleanup; } resolvedCred->flags |= CRED_FLAG_RESOLVED; } *pResolvedCred = resolvedCred; resolvedCred = GSS_C_NO_CREDENTIAL; major = GSS_S_COMPLETE; *minor = 0; cleanup: gssEapReleaseCred(&tmpMinor, &resolvedCred); return major; }