metze/heimdal/wip.git
4 years agoRevert "travis: Use ccache to speed up builds"
Nicolas Williams [Sat, 25 Apr 2020 00:05:07 +0000 (19:05 -0500)]
Revert "travis: Use ccache to speed up builds"

This reverts commit 37dee9bbc3cefdbe772ef68881f54ac743fd8715, which did
not help speed up Travis-CI builds.

4 years agotravis: Use ccache to speed up builds
Nicolas Williams [Fri, 24 Apr 2020 22:38:02 +0000 (17:38 -0500)]
travis: Use ccache to speed up builds

4 years agotravis: Show valgrind output in log
Nicolas Williams [Fri, 24 Apr 2020 02:47:28 +0000 (21:47 -0500)]
travis: Show valgrind output in log

This might cause logs to get large.  We might need to post the logs to
some URI.

4 years agotravis: Allow CI config to make check-valgrind
Nicolas Williams [Fri, 24 Apr 2020 01:54:50 +0000 (20:54 -0500)]
travis: Allow CI config to make check-valgrind

Setting MAKE_CHECK_SUFFIX=-valgrind in the environment will cause Travis
to make check-valgrind.

4 years agokadmin: fix leak
Nicolas Williams [Fri, 24 Apr 2020 01:45:02 +0000 (20:45 -0500)]
kadmin: fix leak

4 years agoroken: fix valgrind leak noise
Nicolas Williams [Fri, 24 Apr 2020 01:44:32 +0000 (20:44 -0500)]
roken: fix valgrind leak noise

4 years agohx509: Fix hx509_context_free() leak
Nicolas Williams [Thu, 23 Apr 2020 23:31:14 +0000 (18:31 -0500)]
hx509: Fix hx509_context_free() leak

4 years agoMove error functions from krb5 to base
Nicolas Williams [Thu, 23 Apr 2020 19:30:42 +0000 (14:30 -0500)]
Move error functions from krb5 to base

4 years agoMove lib/krb5/error_string.c to lib/base/
Nicolas Williams [Thu, 23 Apr 2020 18:26:25 +0000 (13:26 -0500)]
Move lib/krb5/error_string.c to lib/base/

This commit contains only renames.

4 years agoMove KDC audit functionality to lib/base/
Nicolas Williams [Tue, 3 Mar 2020 21:24:46 +0000 (15:24 -0600)]
Move KDC audit functionality to lib/base/

4 years agohx509: Add hx509.conf support
Nicolas Williams [Tue, 3 Mar 2020 04:33:07 +0000 (22:33 -0600)]
hx509: Add hx509.conf support

Just like krb5.conf, but hx509.conf, with all the same default locations
on Windows, OS X, and elsewhere, and HX509_CONFIG as the environment
variable equivalent of KRB5_CONFIG.

4 years agoMove more config file code from krb5 to base
Nicolas Williams [Tue, 3 Mar 2020 04:26:17 +0000 (22:26 -0600)]
Move more config file code from krb5 to base

4 years agocom_err: make error_table_name() thread-safe
Nicolas Williams [Tue, 3 Mar 2020 21:28:54 +0000 (15:28 -0600)]
com_err: make error_table_name() thread-safe

4 years agogss: pass mechanism error tokens through SPNEGO
Luke Howard [Tue, 21 Apr 2020 23:35:14 +0000 (09:35 +1000)]
gss: pass mechanism error tokens through SPNEGO

Fix for issue #486 based on a patch by Nico Williams.

A GSS-API acceptor can return an error token to be sent to the initiator. Our
SPNEGO implementation discarded these when sending a SPNEGO reject response.
This patch fixes the SPNEGO acceptor to convey those in the SPNEGO response.

The SPNEGO initiator is also updated to not bail out early on receiving a
SPNEGO reject response from the acceptor, but instead pass the response token
(if any) to gss_init_sec_context(). A reject response with no response token
will continue to return an error.

4 years agohcrypto: trim number of trials in prime number generation
Luke Howard [Sun, 12 Apr 2020 10:39:16 +0000 (20:39 +1000)]
hcrypto: trim number of trials in prime number generation

Reduce the number of trials when generating RSA keys by calling
mp_prime_rabin_miller_trials() with the number of desired bits.

See libtom/libtommath#482.

4 years agohcrypto: make libtommath v1.2.0 work with Heimdal
Luke Howard [Sun, 12 Apr 2020 08:38:00 +0000 (18:38 +1000)]
hcrypto: make libtommath v1.2.0 work with Heimdal

4 years agohcrypto: import libtommath v1.2.0
Luke Howard [Sun, 12 Apr 2020 08:37:13 +0000 (18:37 +1000)]
hcrypto: import libtommath v1.2.0

4 years agoProperly implement neg_mechs & GM_USE_MG_CRED (fix)
Nicolas Williams [Wed, 22 Apr 2020 00:51:55 +0000 (19:51 -0500)]
Properly implement neg_mechs & GM_USE_MG_CRED (fix)

4 years agoBetter support for "non-standard" GSS mechs (fix)
Nicolas Williams [Wed, 22 Apr 2020 00:51:16 +0000 (19:51 -0500)]
Better support for "non-standard" GSS mechs (fix)

4 years agogss: remove gss_release_cred_by_mech()
Luke Howard [Sun, 19 Apr 2020 23:29:22 +0000 (09:29 +1000)]
gss: remove gss_release_cred_by_mech()

gss_release_cred_by_mech() was previously used by SPNEGO's implementation of
gss_set_neg_mechs(). This is now implemented in the mechanism glue. As we never
shipped gss_release_cred_by_mech(), it is safe to remove it and its exported
symbol.

4 years agoProperly implement neg_mechs & GM_USE_MG_CRED
Nicolas Williams [Sun, 19 Apr 2020 03:15:00 +0000 (22:15 -0500)]
Properly implement neg_mechs & GM_USE_MG_CRED

SPNEGO was already using union creds.  Now make the mechglue know about
it, delete all of the cred-related SPNEGO stubs that are now not called
(lib/gssapi/spnego/cred_stubs.c), and implement gss_get/set_neg_mechs()
by storing the OID set in the union cred.

This commit was essentially authored as much if not more by Luke Howard
<lukeh at padl.com> as much as by the listed author.

4 years agogss: intern OID before adding to OID set
Luke Howard [Tue, 21 Apr 2020 04:54:18 +0000 (14:54 +1000)]
gss: intern OID before adding to OID set

gss_add_oid_set_member() should according to RFC2744 add a copy of the OID to
the set; the current implementation just stored a pointer (which may not be
stable). As we have _gss_intern_oid(), call that before adding.

4 years agoAdd gss_duplicate_oid_set()
Nicolas Williams [Sun, 19 Apr 2020 02:32:45 +0000 (21:32 -0500)]
Add gss_duplicate_oid_set()

4 years agoBetter support for "non-standard" GSS mechs
Nicolas Williams [Fri, 17 Apr 2020 03:53:22 +0000 (22:53 -0500)]
Better support for "non-standard" GSS mechs

If an initial security context token doesn't have a standard header per
RFC2743 then try all mechanisms until one succeeds or all fail.

We still try to guess NTLMSSP, raw Kerberos, and SPNEGO, from tasting
the initial security context token.

4 years agogss: fix gss_decapsulate_token() return codes
Luke Howard [Fri, 17 Apr 2020 01:11:43 +0000 (11:11 +1000)]
gss: fix gss_decapsulate_token() return codes

gss_decapsulate_token() should return GSS_S_BAD_MECH if the mechanism did not
match the expected one, and GSS_S_DEFECTIVE_TOKEN if the token could not be
parsed for some other reason, rather than GSS_S_FAILURE in both cases

4 years agogss: GSS_KRB5_IMPORT_RFC4121_CONTEXT_X / _gss_mg_import_rfc4121_context()
Luke Howard [Tue, 14 Apr 2020 02:36:09 +0000 (12:36 +1000)]
gss: GSS_KRB5_IMPORT_RFC4121_CONTEXT_X / _gss_mg_import_rfc4121_context()

Add a new private interface (accessed through _gss_mg_import_rfc4121_context())
through which a skeletal krb5 mechanism context can be created, suitable for
RFC4121 message protection and PRF services.

4 years agogss: honor allocated_ctx in gss_{exchange,query}_meta_data
Luke Howard [Thu, 16 Apr 2020 07:20:43 +0000 (07:20 +0000)]
gss: honor allocated_ctx in gss_{exchange,query}_meta_data

The NegoEx gss_{exchange,query}_meta_data functions set allocated_ctx but never
did anything with it. Use it to determine whether we should free the context
handle on error.

4 years agogss: free user keytab before resolving system keytab
Luke Howard [Thu, 16 Apr 2020 07:19:35 +0000 (07:19 +0000)]
gss: free user keytab before resolving system keytab

get_client_keytab() leaked the user keytab if it resolved but we could not find
the client principal. Free it before trying the system keytab.

4 years agogss: don't leak client_cred in test_context
Luke Howard [Thu, 16 Apr 2020 07:13:16 +0000 (07:13 +0000)]
gss: don't leak client_cred in test_context

Don't leak client credential handle in test_context.

4 years agogss: allow source/target to be null on export/import
Luke Howard [Tue, 14 Apr 2020 02:34:44 +0000 (12:34 +1000)]
gss: allow source/target to be null on export/import

Allow the source and target names to be NULL when exporting or importing a
security context for the krb5 mechanism. This will be used in the future to
support skeletal contexts that only provide RFC4121 message protection
services.

4 years agogss: fix typo regression in setting minor_status
Luke Howard [Thu, 16 Apr 2020 00:44:04 +0000 (10:44 +1000)]
gss: fix typo regression in setting minor_status

_gss_secure_release_buffer_set() patch changed minor_status to 0, not
*minor_status as correct. No behavioural change as
_gss_secure_release_buffer_set() would have set it anyway, but obviously this
was unintentional.

4 years agoImprove coverage script a bit
Nicolas Williams [Wed, 15 Apr 2020 23:48:26 +0000 (18:48 -0500)]
Improve coverage script a bit

4 years agogss: use _gss_secure_release_buffer_[set]
Luke Howard [Wed, 15 Apr 2020 06:20:06 +0000 (16:20 +1000)]
gss: use _gss_secure_release_buffer_[set]

Use new helper APIs for securely zeroing and releasing buffers and buffer sets.

4 years agogss: add _gss_secure_release_buffer_set()
Luke Howard [Wed, 15 Apr 2020 06:11:42 +0000 (16:11 +1000)]
gss: add _gss_secure_release_buffer_set()

Add _gss_secure_release_buffer_set() helper function for zeroing buffer set
contents before release.

4 years agogss: add _gss_secure_release_buffer()
Luke Howard [Wed, 15 Apr 2020 05:59:01 +0000 (15:59 +1000)]
gss: add _gss_secure_release_buffer()

Add _gss_secure_release_buffer() helper function that zeros buffer

4 years agokrb5: allow NULL authenticator in krb5_auth_con_free()
Luke Howard [Tue, 14 Apr 2020 02:37:56 +0000 (12:37 +1000)]
krb5: allow NULL authenticator in krb5_auth_con_free()

When freeing an auth context, allow the authenticator to be NULL. Useful for
freeing partially allocated authentication context.

4 years agoFix Coveralls badge to master branch
Nicolas Williams [Wed, 15 Apr 2020 01:48:19 +0000 (20:48 -0500)]
Fix Coveralls badge to master branch

4 years agoRecover coverage data on more files
Nicolas Williams [Wed, 15 Apr 2020 00:23:39 +0000 (19:23 -0500)]
Recover coverage data on more files

4 years agokrb5: always zero elastic storage
Luke Howard [Tue, 14 Apr 2020 22:58:27 +0000 (08:58 +1000)]
krb5: always zero elastic storage

Elastic storage (returned from krb5_storage_emem()) often contains secret keys.
Ensure memory is zeroed on free using memset_s() rather than memset().

4 years agoAdd Coveralls badge to README.md
Nicolas Williams [Tue, 14 Apr 2020 22:03:05 +0000 (17:03 -0500)]
Add Coveralls badge to README.md

4 years agoSend coverage data from Travis to Coveralls
Nicolas Williams [Tue, 14 Apr 2020 10:04:00 +0000 (05:04 -0500)]
Send coverage data from Travis to Coveralls

4 years agokrb5: use memset_s() in krb5_free_keyblock_contents()
Luke Howard [Tue, 14 Apr 2020 10:21:09 +0000 (20:21 +1000)]
krb5: use memset_s() in krb5_free_keyblock_contents()

krb5_free_keyblock_contents() should use memset_s() to ensure that the key is
zero'd before freeing

4 years agogss: check for replays in test_context
Luke Howard [Tue, 14 Apr 2020 10:02:59 +0000 (20:02 +1000)]
gss: check for replays in test_context

Add GSS_C_REPLAY_FLAG to the default set of flags in test_context.

4 years agogss: don't use heim_assert() in test_context
Luke Howard [Tue, 14 Apr 2020 07:27:55 +0000 (17:27 +1000)]
gss: don't use heim_assert() in test_context

Use errx() rather than heim_assert() in test_context

4 years agogss: make gss_compare_name comply with RFC2743
Luke Howard [Tue, 14 Apr 2020 04:46:32 +0000 (14:46 +1000)]
gss: make gss_compare_name comply with RFC2743

Anonymous names should always compare FALSE in GSS_Compare_name(). If the names
are being compared at the mechglue layer then we should check for
GSS_C_NT_ANONYMOUS.

4 years agogss: add tests for importing and exporting contexts
Luke Howard [Tue, 14 Apr 2020 02:33:25 +0000 (12:33 +1000)]
gss: add tests for importing and exporting contexts

Add the --export-import-context flag to test_context, for validating that
security contexts round-trip through GSS_Export_sec_context() and
GSS_Import_sec_context().

4 years agogss: allow gss_set_sec_context_option() to allocate a context
Luke Howard [Tue, 14 Apr 2020 02:36:55 +0000 (12:36 +1000)]
gss: allow gss_set_sec_context_option() to allocate a context

The prototype for gss_set_sec_context_option() allows it to return a new
context, however this was not implemented. This functionality is required by
GSS_KRB5_IMPORT_RFC4121_CONTEXT_X.

4 years agogss: add support for gss_duplicate_cred() in SPNEGO
Luke Howard [Mon, 13 Apr 2020 10:53:35 +0000 (20:53 +1000)]
gss: add support for gss_duplicate_cred() in SPNEGO

The SPNEGO dispatch table does not include gss_duplicate_cred(). It can call
directly into the mechglue because a SPNEGO credential is a mechglue
credential.

4 years agogss: remove superfluous SPNEGO cred wrappers
Luke Howard [Mon, 13 Apr 2020 10:51:44 +0000 (20:51 +1000)]
gss: remove superfluous SPNEGO cred wrappers

SPNEGO credentials are mechglue credentials. SPNEGO credential wrapper
functions can be replaced with direct calls into the mechglue, unless a
specific check is required to avoid infinite recursion (as is the case where
the mechglue enumerates all mechanism when passed a null credential handle).

4 years agogss: fix test_acquire_cred usage description
Luke Howard [Mon, 13 Apr 2020 03:53:44 +0000 (13:53 +1000)]
gss: fix test_acquire_cred usage description

4 years agogss: fix downlevel Windows interop regression
Luke Howard [Thu, 9 Apr 2020 12:51:30 +0000 (22:51 +1000)]
gss: fix downlevel Windows interop regression

The recent changes to SPNEGO removed support for GSS_C_PEER_HAS_UPDATED_SPNEGO,
through which the Kerberos mechanism could indicate to SPNEGO that the peer did
not suffer from SPNEGO conformance bugs present in some versions of Windows.*

This patch restores this workaround, documented in [MS-SPNG] Appendix A <7>
Section 3.1.5.1. Whilst improving interoperability with these admittedly now
unsupported versions of Windows, it does introduce a risk that Kerberos with
pre-AES ciphers could be negotiated in lieu of a stronger and more preferred
mechanism.

Note: this patch inverts the mechanism interface from
GSS_C_PEER_HAS_UPDATED_SPNEGO to GSS_C_INQ_PEER_HAS_BUGGY_SPNEGO, so that new
mechanisms (which did not ship with these older versions of Windows) are not
required to implement it.

* Windows 2000, Windows 2003, and Windows XP

4 years agogss: remove GSS_C_MA_AUTH_INIT_ANON from krb5 mech
Luke Howard [Sun, 12 Apr 2020 23:42:29 +0000 (09:42 +1000)]
gss: remove GSS_C_MA_AUTH_INIT_ANON from krb5 mech

Pending integration of #551, the krb5 mechanism does not support
GSS_C_ANON_FLAG. Remove the GSS_C_MA_AUTH_INIT_ANON mechanism attribute until
such time it does.

4 years agogss: order SPNEGO proposed mechs by req_flags
Luke Howard [Tue, 7 Apr 2020 02:39:43 +0000 (12:39 +1000)]
gss: order SPNEGO proposed mechs by req_flags

Sort the list of mechanisms proposed by the initiator so that mechanisms are
preferred by their advertised support for GSS flags. For example, if
GSS_C_MUTUAL_FLAG is requested, a mechanism that offers GSS_C_MA_AUTH_TARG will
be preferred over one that doesn't. The flag/mechanism attribute combinations
are also assigned a weight (mutual trumps anonymous, for example).

4 years agoroken: add mergesort_r()
Luke Howard [Tue, 7 Apr 2020 03:49:27 +0000 (13:49 +1000)]
roken: add mergesort_r()

Add mergesort_r() as a stable sort function that can be used by other
components of Heimdal. Note that there is no standardized prototype for this
function, however it appears that both FreeBSD and glibc would adopt the glibc
convention (where the private data argument appears last). See:

    https://bugs.freebsd.org/bugzilla/show_bug.cgi?id=214248

4 years agogss: __gss_c_attr_stream_sizes_oid_desc declspec
Luke Howard [Sat, 11 Apr 2020 00:04:43 +0000 (10:04 +1000)]
gss: __gss_c_attr_stream_sizes_oid_desc declspec

__gss_c_attr_stream_sizes_oid_desc was tagged with GSSAPI_LIB_FUNCTION instead
of GSSAPI_LIB_VARIABLE; whilst the macro expansion is identical, fix for
cleanliness

4 years agogss: fix copy/paste error in gss_destroy_cred()
Luke Howard [Sat, 11 Apr 2020 00:02:09 +0000 (10:02 +1000)]
gss: fix copy/paste error in gss_destroy_cred()

gss_destroy_cred() was missing a calling convention, instead had the import
declaration twice

4 years agoExpand tokens in gss cred store "ccache" value
Nicolas Williams [Wed, 18 Mar 2020 18:37:13 +0000 (13:37 -0500)]
Expand tokens in gss cred store "ccache" value

This is needed so that sshd and such can get make practical use of the
"ccache" key in GSS cred stores.

This commit only changes the store path, not the acquisition path.

4 years agoList FILE collection even when KRB5CCNAME is a sub
Nicolas Williams [Wed, 18 Mar 2020 05:43:01 +0000 (00:43 -0500)]
List FILE collection even when KRB5CCNAME is a sub

Setting KRB5CCNAME=/tmp/krb5cc_${UID}+${princ} should not prevent
listing the FILE collection.

4 years agohcrypto: Fix Makefile build race
Nicolas Williams [Wed, 18 Mar 2020 00:46:37 +0000 (19:46 -0500)]
hcrypto: Fix Makefile build race

4 years agokrb5: Use sqlite3_close(), not v2
Nicolas Williams [Wed, 18 Mar 2020 00:45:51 +0000 (19:45 -0500)]
krb5: Use sqlite3_close(), not v2

4 years agokrb5: Fix kinit harder
Nicolas Williams [Sat, 14 Mar 2020 02:36:00 +0000 (21:36 -0500)]
krb5: Fix kinit harder

The previous fixes for using `krb5_cc_default_for()` weren't quite
correct.

4 years agokrb5: Allow rename of empty FILE ccaches
Nicolas Williams [Sat, 14 Mar 2020 16:25:46 +0000 (11:25 -0500)]
krb5: Allow rename of empty FILE ccaches

4 years agogss: Sometimes set KRB5CCNAME when not overwriting
Nicolas Williams [Fri, 13 Mar 2020 23:43:00 +0000 (18:43 -0500)]
gss: Sometimes set KRB5CCNAME when not overwriting

4 years agogss: Fix default cache preference
Nicolas Williams [Fri, 13 Mar 2020 23:14:17 +0000 (18:14 -0500)]
gss: Fix default cache preference

4 years agoFix Appveyor Windows build
Nicolas Williams [Fri, 13 Mar 2020 03:58:13 +0000 (22:58 -0500)]
Fix Appveyor Windows build

4 years agogss: Prefer the default ccache when user_realm
Nicolas Williams [Thu, 12 Mar 2020 22:58:53 +0000 (17:58 -0500)]
gss: Prefer the default ccache when user_realm

gss_store_cred_into*() will now switch the new cred cache to be the
primary/default cred cache when

 - the caller requested it and,
 - if the caller passed in a user name, the creds' principal is the best
   principal for the named user.

A principal is the best principal for a user when the principal has just
one component, the component is the user's username, and the realm is
the configured user_realm.

4 years agokinit: Prefer the default ccache when user_realm
Nicolas Williams [Thu, 12 Mar 2020 22:57:16 +0000 (17:57 -0500)]
kinit: Prefer the default ccache when user_realm

If using the new --cache-default-for option, use the real default if the
principal is the best principal for the user.

A principal is the best principal for a user when the principal has just
one component, the component is the user's username, and the realm is
the configured user_realm.

4 years agokinit: Add --cache-default-for flag (fix check-cc)
Nicolas Williams [Thu, 12 Mar 2020 16:46:47 +0000 (11:46 -0500)]
kinit: Add --cache-default-for flag (fix check-cc)

4 years agoFix warnings (some bugs, some spurious)
Nicolas Williams [Thu, 12 Mar 2020 05:42:33 +0000 (00:42 -0500)]
Fix warnings (some bugs, some spurious)

Many spurious VC warnings not quieted though.

4 years agokrb5: Make FILE ccache type a collection type!
Nicolas Williams [Wed, 11 Mar 2020 18:42:30 +0000 (13:42 -0500)]
krb5: Make FILE ccache type a collection type!

4 years agokrb5: Restore FILE as the default ccache type
Nicolas Williams [Wed, 11 Mar 2020 18:42:03 +0000 (13:42 -0500)]
krb5: Restore FILE as the default ccache type

4 years agogsskrb5: Add unique ccache k/v for cred store
Nicolas Williams [Wed, 11 Mar 2020 18:40:35 +0000 (13:40 -0500)]
gsskrb5: Add unique ccache k/v for cred store

This will allow sshd and such to be configured to request unique ccache
names.

4 years agokrb5: Add krb5_set_config() for test_cc
Nicolas Williams [Wed, 11 Mar 2020 18:40:02 +0000 (13:40 -0500)]
krb5: Add krb5_set_config() for test_cc

4 years agoRevert cccol changes to kinit
Nicolas Williams [Thu, 12 Mar 2020 15:57:25 +0000 (10:57 -0500)]
Revert cccol changes to kinit

4 years agokdc: kx509.c fix build failures
Jeffrey Altman [Sun, 8 Mar 2020 14:28:37 +0000 (10:28 -0400)]
kdc: kx509.c fix build failures

bcb5ed28fbe25d3b207d17ddd2f420f938a4ef03 ("kdc/kx509.c: clean up
krb5_get_error_message strings used for mk_error_resp") introduced a
build failure.  'context' is not a local variable but a field in the
kx509_req_context.

Change-Id: I38a8a9b1a19c3370dfc039d6e09445425936c32b

4 years agokdc/kx509.c: clean up krb5_get_error_message strings used for mk_error_resp
Daria Phoebe Brashear [Fri, 10 Jan 2020 18:12:57 +0000 (13:12 -0500)]
kdc/kx509.c: clean up krb5_get_error_message strings used for mk_error_resp

mk_error_response expects the strings it builds will need to be freed but
not those passed in; krb5_get_error_message generates a string which needs to
be freed. keep track of and free those strings.

4 years agolib/base log_file should free filename in all cases
Daria Phoebe Brashear [Thu, 5 Mar 2020 23:58:41 +0000 (18:58 -0500)]
lib/base log_file should free filename in all cases

once we've used the filename we built, free it before exit

4 years agohdb: don't use lock_file name after free in open_lock_file
Daria Phoebe Brashear [Mon, 13 Jan 2020 04:53:02 +0000 (23:53 -0500)]
hdb: don't use lock_file name after free in open_lock_file

4 years agolib/kadm5 kadm5_c_randkey_principal allow keyblock cleanup on error
Daria Phoebe Brashear [Fri, 10 Jan 2020 18:08:43 +0000 (13:08 -0500)]
lib/kadm5 kadm5_c_randkey_principal allow keyblock cleanup on error

the code to perform cleanup is present but an overzealous goto out
precludes it from being called. break from our for loop in event of error
and allow cleanup to take place

4 years agokrb5_mk_ncred: clean enc_krb_cred_part before use
Daria Phoebe Brashear [Fri, 10 Jan 2020 17:58:09 +0000 (12:58 -0500)]
krb5_mk_ncred: clean enc_krb_cred_part before use

the early exit case can try to free enc_krb_cred_part, which will be
stack garbage. clear it before it's used.

4 years agokdc kx509: avoid double free of cprinc and s in check_authz
Daria Phoebe Brashear [Fri, 10 Jan 2020 17:51:20 +0000 (12:51 -0500)]
kdc kx509: avoid double free of cprinc and s in check_authz

on error from der_parse_heim_old we early exit via out, which frees
s and cprinc; we should not do so a second time unless we explicitly
NULL the pointers but there is no value in doing so.

4 years agokrb5: Init mutex of anon MEMORY ccaches
Nicolas Williams [Wed, 4 Mar 2020 20:11:42 +0000 (14:11 -0600)]
krb5: Init mutex of anon MEMORY ccaches

4 years agokrb5: Improve cccol sub naming; add gss_store_cred_into2()
Nicolas Williams [Thu, 23 Jan 2020 01:18:14 +0000 (19:18 -0600)]
krb5: Improve cccol sub naming; add gss_store_cred_into2()

 - Formalize the TYPE:collection_name:subsidiary_name naming scheme for
   ccaches in ccache collections
    - KEYRING: ccaches are weird because they have one more optional field: the
      "anchor", so rather than just assume a naming convention everywhere, we
      add new functions as well
 - Add krb5_cc_{resolve,default}_sub() that allows one to specify a
   "subsidiary" ccache name in a collection separately from the
   collection name
 - Add krb5_cc_{resolve,default}_for() which take a principal name,
   unparse it, and use it as the subsidiary ccache name (with colons
   replaced)
 - Make kinit use the new interfaces
 - Add missing DIR ccache iteration functionality
 - Revamps test_cc
 - Add krb5_cc_get_collection() and krb5_cc_get_subsidiary()
 - Bump the ccops SPI version number
 - Add gss_store_cred_into2()
 - Make MEMORY:anonymous not linked into the global MEMORY ccache
   collection, and uses this for delegated cred handles

TBD:

 - Split this up into a krb5 change and gss mech_krb5 change?
 - Add krb5_cc_init_and_store() utility, per Greg's suggestion?

4 years agoroken: Add mkdtemp()
Nicolas Williams [Fri, 24 Jan 2020 06:24:52 +0000 (00:24 -0600)]
roken: Add mkdtemp()

4 years agoroken: Add base32
Nicolas Williams [Tue, 14 Jan 2020 01:46:13 +0000 (19:46 -0600)]
roken: Add base32

4 years agoappveyor: Minor improvements for debugging
Nicolas Williams [Mon, 2 Mar 2020 16:52:39 +0000 (10:52 -0600)]
appveyor: Minor improvements for debugging

4 years agohdb: Fix memory leak in hdb_generate_key_set()
Nicolas Williams [Sun, 1 Mar 2020 03:32:26 +0000 (21:32 -0600)]
hdb: Fix memory leak in hdb_generate_key_set()

4 years agoMove some infra bits of lib/krb5/ to lib/base/ (2)
Nicolas Williams [Tue, 25 Feb 2020 00:50:01 +0000 (18:50 -0600)]
Move some infra bits of lib/krb5/ to lib/base/ (2)

This is the second of two commits in a series that must be picked together.

This series of two commits moves parts of lib/krb5/ infrastructure
functionality to lib/base/, leaving behind wrappers.

Some parts of libkrb5 are entirely generic or easily made so, and could
be useful in various parts of Heimdal that are not specific to the krb5
API, such as:

 - lib/gssapi/  (especially since the integration of NegoEx)
 - lib/hx509/
 - bx509d       (which should really move out of kdc/)

For the above we need to move these bits of lib/krb5/:

 - lib/krb5/config_file.c   (all of it, leaving forwardings behind)
 - lib/krb5/config_reg.c    (all of it)
 - lib/krb5/plugin.c        (all of it, leaving forwardings behind)
 - lib/krb5/log.c           (all of it, ditto)
 - lib/krb5/heim_err.et     (all of it)

And because of those two, these too must also move:

 - lib/krb5/expand_path.c   (all of it, leaving forwardings behind)
 - lib/krb5/warn.c          (just the warning functions, ditto)

The changes to the moved files are mostly quite straightforward and are
best reviewed with --word-diff=color.

We're also creating a heim_context and a heim API to go with it.  But
it's as thin as possible, with as little state as necessary to enable
this move.  Functions for dealing with error messages use callbacks.

Moving plugin.c does have one knock-on effect on all users of the old
krb5 plugin API (which remains), which is that a global search and
replace of struct krb5_plugin_data to struct heim_plugin_data was
needed, though the layout and size of that structure doesn't change, so
the ABI doesn't either.

As well, we now build lib/vers/ and lib/com_err/ before lib/base/ so as
to be able to move lib/krb5/heim_err.et to lib/base/ so that we can make
use of HEIM_ERR_* in lib/base/, specifically in the files that moved.

Once this is all done we'll be able to use config files and plugins in
lib/hx509/, we'll be able to move bx509d out of kdc/, and so on.

Most if not all of the new functions in lib/base/ are Heimdal-private,
thus calling conventions for them are not declared.

Status:

 - builds and passes CIs (Travis, Appveyor)
 - ran make check-valgrind and no new leaks or other memory errors
 - ready for review

HOW TO REVIEW:

     $ # Review file moves:
     $ git log --stat -n1 HEAD^
     $
     $ # Review changes to moved files using --word-diff=color
     $ git log -p -b -w --word-diff=color HEAD^..HEAD   \
               lib/base/config_file.c                   \
               lib/base/config_reg.c                    \
               lib/base/expand_path.c                   \
               lib/base/warn.c                          \
               lib/krb5/config_file.c                   \
               lib/krb5/config_reg.c                    \
               lib/krb5/expand_path.c                   \
               lib/krb5/warn.c
     $
     $ # Review the whole thing, possibly adding -b and/or -w, and
     $ # maybe --word-diff=color:
     $ git log -p origin/master..HEAD
     $ git log -p -b -w origin/master..HEAD
     $ git log -p -b -w --word-diff=color origin/master..HEAD

TBD (future commits):

 - make lib/gssapi use the new heimbase functions
 - move kx509/bx509d common code to lib/hx509/ or other approp. location
 - move bx509d out of kdc/

4 years agoMove some infra bits of lib/krb5/ to lib/base/ (1)
Nicolas Williams [Wed, 26 Feb 2020 05:25:51 +0000 (23:25 -0600)]
Move some infra bits of lib/krb5/ to lib/base/ (1)

This is the first of two commits in a series that must be picked
together.

This series of two commits moves parts of lib/krb5/ infrastructure
functionality to lib/base/, leaving behind wrappers.

This commit only renames files to enable git log/diff/blame to follow
the renames: to help future code archeology, and to make reviewing these
two commits easier.

The next commit in this series ensures that the moved files have the
correct content (i.e., defining heim APIs instead of krb5 APIs), and
will create files in lib/krb5 with the same names and krb5 API wrappers
around the new heim API functions.

The next commit also explains the motivation, which, briefly, is to:

 - remove krb5 API usage from lib/gssapi/,
 - enable the use of configuration and plugins in lib/hx509/
   (as well as lib/gssapi/ and future projects),

and

 - enable the further disentanglement of bx509d from kdc/.

4 years agogss: initialize mech output parameters in mechglue
Luke Howard [Mon, 2 Mar 2020 06:10:11 +0000 (17:10 +1100)]
gss: initialize mech output parameters in mechglue

Initialize mechanism output parameters before calling mechanism
GSS_Accept_sec_context(), to behave robustly with poorly implemented mechanisms
that may return before initializing them.

4 years agogss: plug leak in test_negoex_mech
Luke Howard [Mon, 2 Mar 2020 06:15:33 +0000 (17:15 +1100)]
gss: plug leak in test_negoex_mech

test_negoex_mech should free the result of calling decode_GSSAPIContextToken()

4 years agogss: initialize output params in test_negoex_mech
Luke Howard [Mon, 2 Mar 2020 06:08:31 +0000 (17:08 +1100)]
gss: initialize output params in test_negoex_mech

test_negoex_mech, being a simple test mechanism ported from MIT that was not
designed to be particularly robust, failed to initialize various output
parameters such as the source name. On Heimdal this triggered an invalid read
because the mechglue did not initialize those variables before calling the
mechanism. This commit fixes this.

4 years agotgs-req: strip forwardable and proxiable if the server is disallowed
Isaac Boukris [Sat, 18 Jan 2020 13:47:02 +0000 (14:47 +0100)]
tgs-req: strip forwardable and proxiable if the server is disallowed

4 years agogss: add mechanism-force-mechListMIC hook to SPNEGO
Luke Howard [Tue, 4 Feb 2020 05:39:34 +0000 (16:39 +1100)]
gss: add mechanism-force-mechListMIC hook to SPNEGO

NTLM erroneously requires a mechListMIC at the SPNEGO layer if an internal MIC
in the NTLM protocol was used. Add a private interface between SPNEGO and the
Samba NTLM mechanism to allow the mechanism to signal that a mechListMIC is
required even if it otherwise would not be.

This interface is the same as that supported by MIT.

Note that only the Samba NTLM mechanism currently implements this feature, it
is not implemented by the Heimdal NTLM mechanism (which does not support NTLM
authenticate message MICs).

4 years agogss: don't explicitly reorder krb5 to front of spnego
Luke Howard [Sun, 29 Dec 2019 09:45:03 +0000 (20:45 +1100)]
gss: don't explicitly reorder krb5 to front of spnego

Previously krb5 was tried explicitly, but now the internal mech list is
reordered so that krb5 is first, this should no longer be required. This
permits an application to specify another mechanism as preferred over krb5
using gss_set_neg_mechs().

4 years agogss: harmonize negState with RFC 4178
Luke Howard [Tue, 14 Jan 2020 02:06:51 +0000 (13:06 +1100)]
gss: harmonize negState with RFC 4178

RFC 4178 4.2.2 uses the field name negState rather than negResult in
NegTokenResp, to denote the negotiation state. Harmonize with this, also
replacing the underscores in accept-completed and accepet-incomplete to match
the RFC.

4 years agogss: harmonize SPNEGO with [MS-SPNG]
Luke Howard [Wed, 1 Jan 2020 00:25:16 +0000 (11:25 +1100)]
gss: harmonize SPNEGO with [MS-SPNG]

In [MS-SPNG], the Microsoft extension is defined as NegTokenInit2 rather than
NegTokenInitWin. Harmonize with the specification.

4 years agogss: don't generate mechListMIC in SPNEGO if it is safe to omit it
Luke Howard [Wed, 1 Jan 2020 11:32:46 +0000 (22:32 +1100)]
gss: don't generate mechListMIC in SPNEGO if it is safe to omit it

4 years agogss: port NegoEx implementation from MIT
Luke Howard [Mon, 30 Dec 2019 02:34:10 +0000 (13:34 +1100)]
gss: port NegoEx implementation from MIT

An implementation of draft-zhu-negoex-04 for MIT Kerberos was developed in
2011. This has been recently integrated, with many fixes from Greg Hudson. This
commit ports it to Heimdal. The implementation has been interoperability tested
with MIT Kerberos and Windows, using the GSS EAP mechanism developed as part of
the Moonshot project.

The SPNEGO code was also updated to import the state machine from Apple which
improves mechListMIC processing and avoids discarding initial context tokens
generated during mechanism probing, that can be used for optimistic tokens.

Finally, to aid in testing, the GSS-API mechanism glue configuration file can
be changed using the environment variable GSS_MECH_CONFIG. This environment
variable name, along with the format of the configuration file, is compatible
with MIT (although it would be difficult for a single mechanism binary to
support both implementations).

4 years agogss: remove SPNEGO name wrappers
Luke Howard [Thu, 2 Jan 2020 05:30:42 +0000 (16:30 +1100)]
gss: remove SPNEGO name wrappers

Wrapping GSS names at the SPNEGO level serves no purpose; remove it and return
mechglue names directly. This required a small change to the NTLM mechanism to
allow NULL names to be passed to its release name function.