rugged 1.0.0 → 1.2.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- checksums.yaml +4 -4
- data/LICENSE +1 -0
- data/README.md +3 -3
- data/ext/rugged/rugged.c +7 -4
- data/ext/rugged/rugged_commit.c +1 -1
- data/ext/rugged/rugged_config.c +1 -1
- data/ext/rugged/rugged_object.c +1 -1
- data/ext/rugged/rugged_remote.c +32 -2
- data/ext/rugged/rugged_repo.c +13 -3
- data/lib/rugged/commit.rb +17 -4
- data/lib/rugged/repository.rb +7 -8
- data/lib/rugged/submodule_collection.rb +4 -4
- data/lib/rugged/version.rb +1 -1
- data/vendor/libgit2/CMakeLists.txt +41 -74
- data/vendor/libgit2/COPYING +109 -1
- data/vendor/libgit2/cmake/{Modules/AddCFlagIfSupported.cmake → AddCFlagIfSupported.cmake} +0 -0
- data/vendor/libgit2/cmake/{Modules/EnableWarnings.cmake → EnableWarnings.cmake} +0 -0
- data/vendor/libgit2/cmake/{Modules/FindCoreFoundation.cmake → FindCoreFoundation.cmake} +0 -0
- data/vendor/libgit2/cmake/{Modules/FindGSSAPI.cmake → FindGSSAPI.cmake} +0 -0
- data/vendor/libgit2/cmake/{Modules/FindGSSFramework.cmake → FindGSSFramework.cmake} +0 -0
- data/vendor/libgit2/cmake/{Modules/FindHTTP_Parser.cmake → FindHTTP_Parser.cmake} +0 -0
- data/vendor/libgit2/cmake/{Modules/FindIconv.cmake → FindIconv.cmake} +0 -0
- data/vendor/libgit2/cmake/{Modules/FindPCRE.cmake → FindPCRE.cmake} +0 -0
- data/vendor/libgit2/cmake/{Modules/FindPCRE2.cmake → FindPCRE2.cmake} +0 -0
- data/vendor/libgit2/cmake/{Modules/FindPkgLibraries.cmake → FindPkgLibraries.cmake} +0 -0
- data/vendor/libgit2/cmake/{Modules/FindSecurity.cmake → FindSecurity.cmake} +0 -0
- data/vendor/libgit2/cmake/{Modules/FindStatNsec.cmake → FindStatNsec.cmake} +0 -0
- data/vendor/libgit2/cmake/Findfutimens.cmake +14 -0
- data/vendor/libgit2/cmake/{Modules/FindmbedTLS.cmake → FindmbedTLS.cmake} +0 -0
- data/vendor/libgit2/cmake/{Modules/IdeSplitSources.cmake → IdeSplitSources.cmake} +0 -0
- data/vendor/libgit2/cmake/{Modules/PkgBuildConfig.cmake → PkgBuildConfig.cmake} +0 -0
- data/vendor/libgit2/cmake/{Modules/SanitizeBool.cmake → SanitizeBool.cmake} +0 -0
- data/vendor/libgit2/cmake/{Modules/SelectGSSAPI.cmake → SelectGSSAPI.cmake} +18 -26
- data/vendor/libgit2/cmake/{Modules/SelectHTTPSBackend.cmake → SelectHTTPSBackend.cmake} +29 -32
- data/vendor/libgit2/cmake/{Modules/SelectHashes.cmake → SelectHashes.cmake} +21 -28
- data/vendor/libgit2/deps/chromium-zlib/CMakeLists.txt +101 -0
- data/vendor/libgit2/deps/http-parser/CMakeLists.txt +4 -3
- data/vendor/libgit2/deps/ntlmclient/CMakeLists.txt +24 -10
- data/vendor/libgit2/deps/ntlmclient/compat.h +0 -27
- data/vendor/libgit2/deps/ntlmclient/crypt.h +14 -9
- data/vendor/libgit2/deps/ntlmclient/crypt_commoncrypto.c +20 -20
- data/vendor/libgit2/deps/ntlmclient/crypt_commoncrypto.h +3 -3
- data/vendor/libgit2/deps/ntlmclient/crypt_mbedtls.c +37 -36
- data/vendor/libgit2/deps/ntlmclient/crypt_mbedtls.h +4 -3
- data/vendor/libgit2/deps/ntlmclient/crypt_openssl.c +178 -51
- data/vendor/libgit2/deps/ntlmclient/crypt_openssl.h +74 -5
- data/vendor/libgit2/deps/ntlmclient/ntlm.c +164 -135
- data/vendor/libgit2/deps/ntlmclient/ntlm.h +13 -9
- data/vendor/libgit2/deps/ntlmclient/ntlmclient.h +16 -3
- data/vendor/libgit2/deps/ntlmclient/unicode.h +10 -4
- data/vendor/libgit2/deps/ntlmclient/unicode_builtin.c +16 -27
- data/vendor/libgit2/deps/ntlmclient/unicode_builtin.h +20 -0
- data/vendor/libgit2/deps/ntlmclient/unicode_iconv.c +28 -52
- data/vendor/libgit2/deps/ntlmclient/unicode_iconv.h +22 -0
- data/vendor/libgit2/deps/ntlmclient/util.c +15 -1
- data/vendor/libgit2/deps/ntlmclient/util.h +2 -1
- data/vendor/libgit2/deps/pcre/LICENCE +93 -0
- data/vendor/libgit2/deps/pcre/pcre.h +2 -2
- data/vendor/libgit2/deps/pcre/pcre_compile.c +29 -17
- data/vendor/libgit2/deps/pcre/pcre_jit_compile.c +4 -4
- data/vendor/libgit2/deps/pcre/pcreposix.c +2 -3
- data/vendor/libgit2/deps/zlib/CMakeLists.txt +6 -5
- data/vendor/libgit2/deps/zlib/deflate.c +1 -0
- data/vendor/libgit2/include/git2/annotated_commit.h +1 -1
- data/vendor/libgit2/include/git2/apply.h +2 -0
- data/vendor/libgit2/include/git2/attr.h +89 -0
- data/vendor/libgit2/include/git2/blame.h +95 -42
- data/vendor/libgit2/include/git2/blob.h +31 -3
- data/vendor/libgit2/include/git2/branch.h +25 -0
- data/vendor/libgit2/include/git2/cert.h +42 -5
- data/vendor/libgit2/include/git2/checkout.h +28 -12
- data/vendor/libgit2/include/git2/commit.h +35 -19
- data/vendor/libgit2/include/git2/common.h +33 -6
- data/vendor/libgit2/include/git2/config.h +1 -1
- data/vendor/libgit2/include/git2/deprecated.h +248 -8
- data/vendor/libgit2/include/git2/diff.h +35 -20
- data/vendor/libgit2/include/git2/errors.h +8 -7
- data/vendor/libgit2/include/git2/filter.h +57 -17
- data/vendor/libgit2/include/git2/graph.h +20 -2
- data/vendor/libgit2/include/git2/index.h +4 -5
- data/vendor/libgit2/include/git2/indexer.h +2 -1
- data/vendor/libgit2/include/git2/odb.h +44 -20
- data/vendor/libgit2/include/git2/pack.h +1 -1
- data/vendor/libgit2/include/git2/patch.h +8 -0
- data/vendor/libgit2/include/git2/rebase.h +25 -1
- data/vendor/libgit2/include/git2/refs.h +9 -5
- data/vendor/libgit2/include/git2/remote.h +59 -6
- data/vendor/libgit2/include/git2/repository.h +95 -52
- data/vendor/libgit2/include/git2/revparse.h +5 -5
- data/vendor/libgit2/include/git2/status.h +115 -59
- data/vendor/libgit2/include/git2/strarray.h +6 -10
- data/vendor/libgit2/include/git2/submodule.h +9 -0
- data/vendor/libgit2/include/git2/sys/commit_graph.h +174 -0
- data/vendor/libgit2/include/git2/sys/filter.h +49 -28
- data/vendor/libgit2/include/git2/sys/midx.h +74 -0
- data/vendor/libgit2/include/git2/sys/odb_backend.h +7 -0
- data/vendor/libgit2/include/git2/sys/transport.h +1 -0
- data/vendor/libgit2/include/git2/tag.h +12 -0
- data/vendor/libgit2/include/git2/transport.h +1 -1
- data/vendor/libgit2/include/git2/tree.h +2 -14
- data/vendor/libgit2/include/git2/types.h +9 -0
- data/vendor/libgit2/include/git2/version.h +3 -3
- data/vendor/libgit2/include/git2/worktree.h +1 -0
- data/vendor/libgit2/src/CMakeLists.txt +77 -44
- data/vendor/libgit2/src/alloc.c +21 -8
- data/vendor/libgit2/src/allocators/failalloc.c +92 -0
- data/vendor/libgit2/src/allocators/failalloc.h +23 -0
- data/vendor/libgit2/src/allocators/stdalloc.c +41 -10
- data/vendor/libgit2/src/allocators/win32_leakcheck.c +118 -0
- data/vendor/libgit2/src/allocators/{win32_crtdbg.h → win32_leakcheck.h} +3 -3
- data/vendor/libgit2/src/annotated_commit.c +21 -9
- data/vendor/libgit2/src/apply.c +21 -8
- data/vendor/libgit2/src/array.h +11 -11
- data/vendor/libgit2/src/assert_safe.h +58 -0
- data/vendor/libgit2/src/attr.c +181 -74
- data/vendor/libgit2/src/attr_file.c +92 -42
- data/vendor/libgit2/src/attr_file.h +32 -11
- data/vendor/libgit2/src/attrcache.c +44 -40
- data/vendor/libgit2/src/attrcache.h +4 -5
- data/vendor/libgit2/src/blame.c +28 -15
- data/vendor/libgit2/src/blame_git.c +6 -3
- data/vendor/libgit2/src/blob.c +46 -24
- data/vendor/libgit2/src/branch.c +87 -37
- data/vendor/libgit2/src/buffer.c +339 -27
- data/vendor/libgit2/src/buffer.h +153 -2
- data/vendor/libgit2/src/cache.c +3 -24
- data/vendor/libgit2/src/cache.h +7 -7
- data/vendor/libgit2/src/cc-compat.h +10 -2
- data/vendor/libgit2/src/checkout.c +97 -98
- data/vendor/libgit2/src/cherrypick.c +8 -2
- data/vendor/libgit2/src/clone.c +104 -29
- data/vendor/libgit2/src/commit.c +41 -28
- data/vendor/libgit2/src/commit_graph.c +1209 -0
- data/vendor/libgit2/src/commit_graph.h +162 -0
- data/vendor/libgit2/src/commit_list.c +46 -0
- data/vendor/libgit2/src/commit_list.h +2 -0
- data/vendor/libgit2/src/common.h +26 -2
- data/vendor/libgit2/src/config.c +40 -22
- data/vendor/libgit2/src/config_cache.c +9 -4
- data/vendor/libgit2/src/config_entries.c +35 -27
- data/vendor/libgit2/src/config_file.c +25 -8
- data/vendor/libgit2/src/config_parse.c +5 -7
- data/vendor/libgit2/src/config_snapshot.c +2 -1
- data/vendor/libgit2/src/crlf.c +16 -6
- data/vendor/libgit2/src/date.c +4 -3
- data/vendor/libgit2/src/delta.c +1 -1
- data/vendor/libgit2/src/describe.c +11 -4
- data/vendor/libgit2/src/diff.c +23 -19
- data/vendor/libgit2/src/diff_driver.c +21 -17
- data/vendor/libgit2/src/diff_file.c +5 -7
- data/vendor/libgit2/src/diff_generate.c +56 -28
- data/vendor/libgit2/src/diff_parse.c +2 -3
- data/vendor/libgit2/src/diff_print.c +81 -65
- data/vendor/libgit2/src/diff_stats.c +19 -16
- data/vendor/libgit2/src/diff_tform.c +13 -13
- data/vendor/libgit2/src/diff_xdiff.c +4 -2
- data/vendor/libgit2/src/diff_xdiff.h +1 -1
- data/vendor/libgit2/src/errors.c +26 -19
- data/vendor/libgit2/src/features.h.in +5 -1
- data/vendor/libgit2/src/fetch.c +7 -2
- data/vendor/libgit2/src/fetchhead.c +8 -4
- data/vendor/libgit2/src/filebuf.c +9 -7
- data/vendor/libgit2/src/filter.c +209 -113
- data/vendor/libgit2/src/filter.h +24 -5
- data/vendor/libgit2/src/futils.c +8 -8
- data/vendor/libgit2/src/futils.h +4 -4
- data/vendor/libgit2/src/graph.c +64 -9
- data/vendor/libgit2/src/hash/sha1/collisiondetect.c +3 -3
- data/vendor/libgit2/src/hash/sha1/common_crypto.c +3 -3
- data/vendor/libgit2/src/hash/sha1/generic.h +1 -1
- data/vendor/libgit2/src/hash/sha1/mbedtls.c +12 -12
- data/vendor/libgit2/src/hash/sha1/openssl.c +3 -3
- data/vendor/libgit2/src/hash/sha1/sha1dc/sha1.c +0 -2
- data/vendor/libgit2/src/hash/sha1/win32.c +15 -11
- data/vendor/libgit2/src/hash.c +16 -13
- data/vendor/libgit2/src/hash.h +1 -1
- data/vendor/libgit2/src/hashsig.c +23 -10
- data/vendor/libgit2/src/ident.c +13 -3
- data/vendor/libgit2/src/idxmap.c +0 -22
- data/vendor/libgit2/src/ignore.c +35 -19
- data/vendor/libgit2/src/index.c +126 -84
- data/vendor/libgit2/src/index.h +1 -1
- data/vendor/libgit2/src/indexer.c +60 -36
- data/vendor/libgit2/src/integer.h +79 -2
- data/vendor/libgit2/src/iterator.c +40 -28
- data/vendor/libgit2/src/iterator.h +1 -1
- data/vendor/libgit2/src/khash.h +2 -11
- data/vendor/libgit2/src/{settings.c → libgit2.c} +125 -49
- data/vendor/libgit2/src/libgit2.h +15 -0
- data/vendor/libgit2/src/mailmap.c +23 -10
- data/vendor/libgit2/src/map.h +3 -3
- data/vendor/libgit2/src/merge.c +108 -46
- data/vendor/libgit2/src/merge.h +2 -1
- data/vendor/libgit2/src/merge_driver.c +19 -13
- data/vendor/libgit2/src/merge_file.c +15 -9
- data/vendor/libgit2/src/message.c +3 -1
- data/vendor/libgit2/src/midx.c +879 -0
- data/vendor/libgit2/src/midx.h +110 -0
- data/vendor/libgit2/src/mwindow.c +214 -95
- data/vendor/libgit2/src/mwindow.h +3 -3
- data/vendor/libgit2/src/net.c +133 -4
- data/vendor/libgit2/src/net.h +16 -2
- data/vendor/libgit2/src/netops.c +6 -4
- data/vendor/libgit2/src/netops.h +2 -2
- data/vendor/libgit2/src/notes.c +10 -10
- data/vendor/libgit2/src/object.c +24 -15
- data/vendor/libgit2/src/odb.c +298 -57
- data/vendor/libgit2/src/odb.h +16 -2
- data/vendor/libgit2/src/odb_loose.c +31 -21
- data/vendor/libgit2/src/odb_mempack.c +3 -1
- data/vendor/libgit2/src/odb_pack.c +391 -114
- data/vendor/libgit2/src/oid.c +7 -4
- data/vendor/libgit2/src/pack-objects.c +83 -69
- data/vendor/libgit2/src/pack.c +383 -150
- data/vendor/libgit2/src/pack.h +44 -9
- data/vendor/libgit2/src/patch.c +14 -7
- data/vendor/libgit2/src/patch_generate.c +3 -5
- data/vendor/libgit2/src/patch_parse.c +6 -3
- data/vendor/libgit2/src/path.c +102 -57
- data/vendor/libgit2/src/path.h +79 -6
- data/vendor/libgit2/src/pathspec.c +12 -11
- data/vendor/libgit2/src/pool.c +34 -22
- data/vendor/libgit2/src/pool.h +9 -1
- data/vendor/libgit2/src/posix.c +43 -12
- data/vendor/libgit2/src/posix.h +9 -0
- data/vendor/libgit2/src/proxy.c +2 -0
- data/vendor/libgit2/src/push.c +2 -0
- data/vendor/libgit2/src/reader.c +10 -6
- data/vendor/libgit2/src/rebase.c +95 -49
- data/vendor/libgit2/src/refdb.c +165 -13
- data/vendor/libgit2/src/refdb.h +69 -0
- data/vendor/libgit2/src/refdb_fs.c +144 -152
- data/vendor/libgit2/src/reflog.c +21 -20
- data/vendor/libgit2/src/refs.c +151 -231
- data/vendor/libgit2/src/refs.h +2 -20
- data/vendor/libgit2/src/refspec.c +80 -44
- data/vendor/libgit2/src/regexp.c +2 -2
- data/vendor/libgit2/src/remote.c +312 -121
- data/vendor/libgit2/src/remote.h +2 -1
- data/vendor/libgit2/src/repository.c +351 -189
- data/vendor/libgit2/src/repository.h +23 -29
- data/vendor/libgit2/src/reset.c +7 -6
- data/vendor/libgit2/src/revert.c +8 -2
- data/vendor/libgit2/src/revparse.c +19 -13
- data/vendor/libgit2/src/revwalk.c +35 -20
- data/vendor/libgit2/src/runtime.c +162 -0
- data/vendor/libgit2/src/runtime.h +62 -0
- data/vendor/libgit2/src/{refdb_fs.h → settings.h} +3 -11
- data/vendor/libgit2/src/signature.c +6 -5
- data/vendor/libgit2/src/sortedcache.c +2 -3
- data/vendor/libgit2/src/sortedcache.h +10 -8
- data/vendor/libgit2/src/stash.c +7 -3
- data/vendor/libgit2/src/status.c +9 -4
- data/vendor/libgit2/src/strarray.c +64 -0
- data/vendor/libgit2/src/streams/mbedtls.c +14 -17
- data/vendor/libgit2/src/streams/mbedtls.h +1 -1
- data/vendor/libgit2/src/streams/openssl.c +113 -207
- data/vendor/libgit2/src/streams/openssl.h +9 -1
- data/vendor/libgit2/src/streams/openssl_dynamic.c +309 -0
- data/vendor/libgit2/src/streams/openssl_dynamic.h +348 -0
- data/vendor/libgit2/src/streams/openssl_legacy.c +203 -0
- data/vendor/libgit2/src/streams/openssl_legacy.h +63 -0
- data/vendor/libgit2/src/streams/registry.c +10 -9
- data/vendor/libgit2/src/streams/socket.c +6 -2
- data/vendor/libgit2/src/streams/stransport.c +6 -3
- data/vendor/libgit2/src/streams/tls.c +5 -3
- data/vendor/libgit2/src/submodule.c +134 -66
- data/vendor/libgit2/src/submodule.h +9 -9
- data/vendor/libgit2/src/sysdir.c +8 -26
- data/vendor/libgit2/src/sysdir.h +0 -11
- data/vendor/libgit2/src/tag.c +49 -11
- data/vendor/libgit2/src/thread.c +140 -0
- data/vendor/libgit2/src/thread.h +479 -0
- data/vendor/libgit2/src/threadstate.c +83 -0
- data/vendor/libgit2/src/threadstate.h +24 -0
- data/vendor/libgit2/src/trace.c +2 -2
- data/vendor/libgit2/src/trace.h +17 -13
- data/vendor/libgit2/src/transaction.c +21 -9
- data/vendor/libgit2/src/transport.c +3 -3
- data/vendor/libgit2/src/transports/auth.c +1 -1
- data/vendor/libgit2/src/transports/auth_negotiate.c +11 -4
- data/vendor/libgit2/src/transports/auth_ntlm.c +10 -6
- data/vendor/libgit2/src/transports/credential.c +17 -7
- data/vendor/libgit2/src/transports/credential_helpers.c +2 -0
- data/vendor/libgit2/src/transports/git.c +1 -3
- data/vendor/libgit2/src/transports/http.c +19 -17
- data/vendor/libgit2/src/transports/http.h +1 -0
- data/vendor/libgit2/src/transports/httpclient.c +84 -42
- data/vendor/libgit2/src/transports/httpclient.h +1 -1
- data/vendor/libgit2/src/transports/local.c +5 -5
- data/vendor/libgit2/src/transports/smart.c +14 -9
- data/vendor/libgit2/src/transports/smart.h +1 -1
- data/vendor/libgit2/src/transports/smart_protocol.c +11 -5
- data/vendor/libgit2/src/transports/ssh.c +51 -17
- data/vendor/libgit2/src/transports/winhttp.c +156 -88
- data/vendor/libgit2/src/tree.c +100 -77
- data/vendor/libgit2/src/tree.h +1 -0
- data/vendor/libgit2/src/tsort.c +0 -2
- data/vendor/libgit2/src/unix/map.c +3 -1
- data/vendor/libgit2/src/unix/posix.h +16 -1
- data/vendor/libgit2/src/unix/pthread.h +2 -1
- data/vendor/libgit2/src/utf8.c +150 -0
- data/vendor/libgit2/src/utf8.h +52 -0
- data/vendor/libgit2/src/util.c +74 -183
- data/vendor/libgit2/src/util.h +33 -39
- data/vendor/libgit2/src/vector.c +23 -19
- data/vendor/libgit2/src/vector.h +4 -2
- data/vendor/libgit2/src/win32/findfile.c +4 -2
- data/vendor/libgit2/src/win32/git2.rc +18 -3
- data/vendor/libgit2/src/win32/map.c +1 -1
- data/vendor/libgit2/src/win32/msvc-compat.h +9 -1
- data/vendor/libgit2/src/win32/path_w32.c +23 -25
- data/vendor/libgit2/src/win32/path_w32.h +0 -1
- data/vendor/libgit2/src/win32/posix_w32.c +77 -1
- data/vendor/libgit2/src/win32/precompiled.h +0 -1
- data/vendor/libgit2/src/win32/reparse.h +4 -4
- data/vendor/libgit2/src/win32/thread.c +24 -15
- data/vendor/libgit2/src/win32/thread.h +1 -1
- data/vendor/libgit2/src/win32/w32_buffer.c +3 -3
- data/vendor/libgit2/src/win32/w32_common.h +18 -9
- data/vendor/libgit2/src/win32/{w32_crtdbg_stacktrace.c → w32_leakcheck.c} +269 -33
- data/vendor/libgit2/src/win32/w32_leakcheck.h +222 -0
- data/vendor/libgit2/src/win32/w32_util.h +6 -6
- data/vendor/libgit2/src/worktree.c +37 -15
- data/vendor/libgit2/src/zstream.c +1 -1
- metadata +56 -38
- data/vendor/libgit2/cmake/Modules/CheckPrototypeDefinition.c.in +0 -29
- data/vendor/libgit2/cmake/Modules/CheckPrototypeDefinition.cmake +0 -96
- data/vendor/libgit2/src/allocators/win32_crtdbg.c +0 -118
- data/vendor/libgit2/src/buf_text.c +0 -316
- data/vendor/libgit2/src/buf_text.h +0 -122
- data/vendor/libgit2/src/global.c +0 -361
- data/vendor/libgit2/src/global.h +0 -41
- data/vendor/libgit2/src/thread-utils.c +0 -58
- data/vendor/libgit2/src/thread-utils.h +0 -246
- data/vendor/libgit2/src/win32/w32_crtdbg_stacktrace.h +0 -127
- data/vendor/libgit2/src/win32/w32_stack.c +0 -188
- data/vendor/libgit2/src/win32/w32_stack.h +0 -140
|
@@ -9,13 +9,82 @@
|
|
|
9
9
|
#ifndef PRIVATE_CRYPT_OPENSSL_H__
|
|
10
10
|
#define PRIVATE_CRYPT_OPENSSL_H__
|
|
11
11
|
|
|
12
|
-
#
|
|
12
|
+
#ifndef CRYPT_OPENSSL_DYNAMIC
|
|
13
|
+
# include <openssl/des.h>
|
|
14
|
+
# include <openssl/hmac.h>
|
|
15
|
+
#endif
|
|
13
16
|
|
|
14
17
|
/* OpenSSL 1.1.0 uses opaque structs, we'll reuse these. */
|
|
15
|
-
#if OPENSSL_VERSION_NUMBER < 0x10100000L
|
|
16
|
-
|
|
17
|
-
#
|
|
18
|
-
|
|
18
|
+
#if defined(OPENSSL_VERSION_NUMBER) && OPENSSL_VERSION_NUMBER < 0x10100000L
|
|
19
|
+
# define HMAC_CTX struct hmac_ctx_st
|
|
20
|
+
#endif
|
|
21
|
+
|
|
22
|
+
#ifdef CRYPT_OPENSSL_DYNAMIC
|
|
23
|
+
typedef unsigned char DES_cblock[8];
|
|
24
|
+
typedef unsigned char const_DES_cblock[8];
|
|
25
|
+
|
|
26
|
+
typedef unsigned long DES_LONG;
|
|
27
|
+
|
|
28
|
+
typedef struct DES_ks {
|
|
29
|
+
union {
|
|
30
|
+
DES_cblock cblock;
|
|
31
|
+
DES_LONG deslong[2];
|
|
32
|
+
} ks[16];
|
|
33
|
+
} DES_key_schedule;
|
|
34
|
+
|
|
35
|
+
#define DES_ENCRYPT 1
|
|
36
|
+
|
|
37
|
+
typedef void EVP_MD;
|
|
38
|
+
typedef void ENGINE;
|
|
39
|
+
typedef void EVP_PKEY_CTX;
|
|
40
|
+
|
|
41
|
+
#define HMAC_MAX_MD_CBLOCK 128
|
|
42
|
+
|
|
43
|
+
typedef struct env_md_ctx_st EVP_MD_CTX;
|
|
44
|
+
struct env_md_ctx_st {
|
|
45
|
+
const EVP_MD *digest;
|
|
46
|
+
ENGINE *engine;
|
|
47
|
+
unsigned long flags;
|
|
48
|
+
void *md_data;
|
|
49
|
+
EVP_PKEY_CTX *pctx;
|
|
50
|
+
int (*update) (EVP_MD_CTX *ctx, const void *data, size_t count);
|
|
51
|
+
};
|
|
52
|
+
|
|
53
|
+
typedef struct hmac_ctx_st {
|
|
54
|
+
const EVP_MD *md;
|
|
55
|
+
EVP_MD_CTX md_ctx;
|
|
56
|
+
EVP_MD_CTX i_ctx;
|
|
57
|
+
EVP_MD_CTX o_ctx;
|
|
58
|
+
unsigned int key_length;
|
|
59
|
+
unsigned char key[HMAC_MAX_MD_CBLOCK];
|
|
60
|
+
} HMAC_CTX;
|
|
19
61
|
#endif
|
|
20
62
|
|
|
63
|
+
struct ntlm_crypt_ctx {
|
|
64
|
+
HMAC_CTX *hmac;
|
|
65
|
+
|
|
66
|
+
void *openssl_handle;
|
|
67
|
+
|
|
68
|
+
void (*des_ecb_encrypt_fn)(const_DES_cblock *input, DES_cblock *output, DES_key_schedule *ks, int enc);
|
|
69
|
+
int (*des_set_key_fn)(const_DES_cblock *key, DES_key_schedule *schedule);
|
|
70
|
+
|
|
71
|
+
unsigned long (*err_get_error_fn)(void);
|
|
72
|
+
const char *(*err_lib_error_string_fn)(unsigned long e);
|
|
73
|
+
|
|
74
|
+
const EVP_MD *(*evp_md5_fn)(void);
|
|
75
|
+
|
|
76
|
+
HMAC_CTX *(*hmac_ctx_new_fn)(void);
|
|
77
|
+
int (*hmac_ctx_reset_fn)(HMAC_CTX *ctx);
|
|
78
|
+
void (*hmac_ctx_free_fn)(HMAC_CTX *ctx);
|
|
79
|
+
void (*hmac_ctx_cleanup_fn)(HMAC_CTX *ctx);
|
|
80
|
+
|
|
81
|
+
int (*hmac_init_ex_fn)(HMAC_CTX *ctx, const void *key, int key_len, const EVP_MD *md, ENGINE *impl);
|
|
82
|
+
int (*hmac_update_fn)(HMAC_CTX *ctx, const unsigned char *data, size_t len);
|
|
83
|
+
int (*hmac_final_fn)(HMAC_CTX *ctx, unsigned char *md, unsigned int *len);
|
|
84
|
+
|
|
85
|
+
unsigned char *(*md4_fn)(const unsigned char *d, size_t n, unsigned char *md);
|
|
86
|
+
|
|
87
|
+
int (*rand_bytes_fn)(unsigned char *buf, int num);
|
|
88
|
+
};
|
|
89
|
+
|
|
21
90
|
#endif /* PRIVATE_CRYPT_OPENSSL_H__ */
|
|
@@ -9,7 +9,6 @@
|
|
|
9
9
|
#include <stdlib.h>
|
|
10
10
|
#include <stdint.h>
|
|
11
11
|
#include <string.h>
|
|
12
|
-
#include <assert.h>
|
|
13
12
|
#include <errno.h>
|
|
14
13
|
#include <ctype.h>
|
|
15
14
|
#include <unistd.h>
|
|
@@ -24,6 +23,18 @@
|
|
|
24
23
|
#include "compat.h"
|
|
25
24
|
#include "util.h"
|
|
26
25
|
|
|
26
|
+
#define NTLM_ASSERT_ARG(expr) do { \
|
|
27
|
+
if (!(expr)) \
|
|
28
|
+
return NTLM_CLIENT_ERROR_INVALID_INPUT; \
|
|
29
|
+
} while(0)
|
|
30
|
+
|
|
31
|
+
#define NTLM_ASSERT(ntlm, expr) do { \
|
|
32
|
+
if (!(expr)) { \
|
|
33
|
+
ntlm_client_set_errmsg(ntlm, "internal error: " #expr); \
|
|
34
|
+
return -1; \
|
|
35
|
+
} \
|
|
36
|
+
} while(0)
|
|
37
|
+
|
|
27
38
|
unsigned char ntlm_client_signature[] = NTLM_SIGNATURE;
|
|
28
39
|
|
|
29
40
|
static bool supports_unicode(ntlm_client *ntlm)
|
|
@@ -47,24 +58,25 @@ ntlm_client *ntlm_client_init(ntlm_client_flags flags)
|
|
|
47
58
|
{
|
|
48
59
|
ntlm_client *ntlm = NULL;
|
|
49
60
|
|
|
50
|
-
if ((ntlm =
|
|
61
|
+
if ((ntlm = calloc(1, sizeof(ntlm_client))) == NULL)
|
|
51
62
|
return NULL;
|
|
52
63
|
|
|
53
|
-
memset(ntlm, 0, sizeof(ntlm_client));
|
|
54
|
-
|
|
55
64
|
ntlm->flags = flags;
|
|
56
65
|
|
|
57
|
-
if ((ntlm->hmac_ctx = ntlm_hmac_ctx_init()) == NULL ||
|
|
58
|
-
(ntlm->unicode_ctx = ntlm_unicode_ctx_init(ntlm)) == NULL) {
|
|
59
|
-
ntlm_hmac_ctx_free(ntlm->hmac_ctx);
|
|
60
|
-
ntlm_unicode_ctx_free(ntlm->unicode_ctx);
|
|
61
|
-
free(ntlm);
|
|
62
|
-
return NULL;
|
|
63
|
-
}
|
|
64
|
-
|
|
65
66
|
return ntlm;
|
|
66
67
|
}
|
|
67
68
|
|
|
69
|
+
#define ENSURE_INITIALIZED(ntlm) \
|
|
70
|
+
do { \
|
|
71
|
+
if (!(ntlm)->unicode_initialized) \
|
|
72
|
+
(ntlm)->unicode_initialized = ntlm_unicode_init((ntlm)); \
|
|
73
|
+
if (!(ntlm)->crypt_initialized) \
|
|
74
|
+
(ntlm)->crypt_initialized = ntlm_crypt_init((ntlm)); \
|
|
75
|
+
if (!(ntlm)->unicode_initialized || \
|
|
76
|
+
!(ntlm)->crypt_initialized) \
|
|
77
|
+
return -1; \
|
|
78
|
+
} while(0)
|
|
79
|
+
|
|
68
80
|
void ntlm_client_set_errmsg(ntlm_client *ntlm, const char *errmsg)
|
|
69
81
|
{
|
|
70
82
|
ntlm->state = NTLM_STATE_ERROR;
|
|
@@ -73,7 +85,9 @@ void ntlm_client_set_errmsg(ntlm_client *ntlm, const char *errmsg)
|
|
|
73
85
|
|
|
74
86
|
const char *ntlm_client_errmsg(ntlm_client *ntlm)
|
|
75
87
|
{
|
|
76
|
-
|
|
88
|
+
if (!ntlm)
|
|
89
|
+
return "internal error";
|
|
90
|
+
|
|
77
91
|
return ntlm->errmsg ? ntlm->errmsg : "no error";
|
|
78
92
|
}
|
|
79
93
|
|
|
@@ -83,7 +97,7 @@ int ntlm_client_set_version(
|
|
|
83
97
|
uint8_t minor,
|
|
84
98
|
uint16_t build)
|
|
85
99
|
{
|
|
86
|
-
|
|
100
|
+
NTLM_ASSERT_ARG(ntlm);
|
|
87
101
|
|
|
88
102
|
ntlm->host_version.major = major;
|
|
89
103
|
ntlm->host_version.minor = minor;
|
|
@@ -95,20 +109,25 @@ int ntlm_client_set_version(
|
|
|
95
109
|
return 0;
|
|
96
110
|
}
|
|
97
111
|
|
|
112
|
+
#define reset(ptr) do { free(ptr); ptr = NULL; } while(0)
|
|
113
|
+
|
|
114
|
+
static void free_hostname(ntlm_client *ntlm)
|
|
115
|
+
{
|
|
116
|
+
reset(ntlm->hostname);
|
|
117
|
+
reset(ntlm->hostdomain);
|
|
118
|
+
reset(ntlm->hostname_utf16);
|
|
119
|
+
ntlm->hostname_utf16_len = 0;
|
|
120
|
+
}
|
|
121
|
+
|
|
98
122
|
int ntlm_client_set_hostname(
|
|
99
123
|
ntlm_client *ntlm,
|
|
100
124
|
const char *hostname,
|
|
101
125
|
const char *domain)
|
|
102
126
|
{
|
|
103
|
-
|
|
127
|
+
NTLM_ASSERT_ARG(ntlm);
|
|
128
|
+
ENSURE_INITIALIZED(ntlm);
|
|
104
129
|
|
|
105
|
-
|
|
106
|
-
free(ntlm->hostdomain);
|
|
107
|
-
free(ntlm->hostname_utf16);
|
|
108
|
-
|
|
109
|
-
ntlm->hostname = NULL;
|
|
110
|
-
ntlm->hostdomain = NULL;
|
|
111
|
-
ntlm->hostname_utf16 = NULL;
|
|
130
|
+
free_hostname(ntlm);
|
|
112
131
|
|
|
113
132
|
if (hostname && (ntlm->hostname = strdup(hostname)) == NULL) {
|
|
114
133
|
ntlm_client_set_errmsg(ntlm, "out of memory");
|
|
@@ -123,7 +142,7 @@ int ntlm_client_set_hostname(
|
|
|
123
142
|
if (hostname && supports_unicode(ntlm) && !ntlm_unicode_utf8_to_16(
|
|
124
143
|
&ntlm->hostname_utf16,
|
|
125
144
|
&ntlm->hostname_utf16_len,
|
|
126
|
-
ntlm
|
|
145
|
+
ntlm,
|
|
127
146
|
hostname,
|
|
128
147
|
strlen(hostname)))
|
|
129
148
|
return -1;
|
|
@@ -134,30 +153,25 @@ int ntlm_client_set_hostname(
|
|
|
134
153
|
static void free_credentials(ntlm_client *ntlm)
|
|
135
154
|
{
|
|
136
155
|
if (ntlm->password)
|
|
137
|
-
|
|
156
|
+
ntlm_memzero(ntlm->password, strlen(ntlm->password));
|
|
138
157
|
|
|
139
158
|
if (ntlm->password_utf16)
|
|
140
|
-
|
|
141
|
-
|
|
142
|
-
|
|
143
|
-
|
|
144
|
-
|
|
145
|
-
|
|
146
|
-
|
|
147
|
-
|
|
148
|
-
|
|
149
|
-
|
|
150
|
-
|
|
151
|
-
|
|
152
|
-
ntlm->
|
|
153
|
-
ntlm->
|
|
154
|
-
ntlm->
|
|
155
|
-
ntlm->
|
|
156
|
-
|
|
157
|
-
ntlm->username_utf16 = NULL;
|
|
158
|
-
ntlm->username_upper_utf16 = NULL;
|
|
159
|
-
ntlm->userdomain_utf16 = NULL;
|
|
160
|
-
ntlm->password_utf16 = NULL;
|
|
159
|
+
ntlm_memzero(ntlm->password_utf16, ntlm->password_utf16_len);
|
|
160
|
+
|
|
161
|
+
reset(ntlm->username);
|
|
162
|
+
reset(ntlm->username_upper);
|
|
163
|
+
reset(ntlm->userdomain);
|
|
164
|
+
reset(ntlm->password);
|
|
165
|
+
|
|
166
|
+
reset(ntlm->username_utf16);
|
|
167
|
+
reset(ntlm->username_upper_utf16);
|
|
168
|
+
reset(ntlm->userdomain_utf16);
|
|
169
|
+
reset(ntlm->password_utf16);
|
|
170
|
+
|
|
171
|
+
ntlm->username_utf16_len = 0;
|
|
172
|
+
ntlm->username_upper_utf16_len = 0;
|
|
173
|
+
ntlm->userdomain_utf16_len = 0;
|
|
174
|
+
ntlm->password_utf16_len = 0;
|
|
161
175
|
}
|
|
162
176
|
|
|
163
177
|
int ntlm_client_set_credentials(
|
|
@@ -166,7 +180,8 @@ int ntlm_client_set_credentials(
|
|
|
166
180
|
const char *domain,
|
|
167
181
|
const char *password)
|
|
168
182
|
{
|
|
169
|
-
|
|
183
|
+
NTLM_ASSERT_ARG(ntlm);
|
|
184
|
+
ENSURE_INITIALIZED(ntlm);
|
|
170
185
|
|
|
171
186
|
free_credentials(ntlm);
|
|
172
187
|
|
|
@@ -187,7 +202,7 @@ int ntlm_client_set_credentials(
|
|
|
187
202
|
if (!ntlm_unicode_utf8_to_16(
|
|
188
203
|
&ntlm->username_utf16,
|
|
189
204
|
&ntlm->username_utf16_len,
|
|
190
|
-
ntlm
|
|
205
|
+
ntlm,
|
|
191
206
|
ntlm->username,
|
|
192
207
|
strlen(ntlm->username)))
|
|
193
208
|
return -1;
|
|
@@ -195,7 +210,7 @@ int ntlm_client_set_credentials(
|
|
|
195
210
|
if (!ntlm_unicode_utf8_to_16(
|
|
196
211
|
&ntlm->username_upper_utf16,
|
|
197
212
|
&ntlm->username_upper_utf16_len,
|
|
198
|
-
ntlm
|
|
213
|
+
ntlm,
|
|
199
214
|
ntlm->username_upper,
|
|
200
215
|
strlen(ntlm->username_upper)))
|
|
201
216
|
return -1;
|
|
@@ -204,7 +219,7 @@ int ntlm_client_set_credentials(
|
|
|
204
219
|
if (domain && supports_unicode(ntlm) && !ntlm_unicode_utf8_to_16(
|
|
205
220
|
&ntlm->userdomain_utf16,
|
|
206
221
|
&ntlm->userdomain_utf16_len,
|
|
207
|
-
ntlm
|
|
222
|
+
ntlm,
|
|
208
223
|
ntlm->userdomain,
|
|
209
224
|
strlen(ntlm->userdomain)))
|
|
210
225
|
return -1;
|
|
@@ -214,7 +229,8 @@ int ntlm_client_set_credentials(
|
|
|
214
229
|
|
|
215
230
|
int ntlm_client_set_target(ntlm_client *ntlm, const char *target)
|
|
216
231
|
{
|
|
217
|
-
|
|
232
|
+
NTLM_ASSERT_ARG(ntlm);
|
|
233
|
+
ENSURE_INITIALIZED(ntlm);
|
|
218
234
|
|
|
219
235
|
free(ntlm->target);
|
|
220
236
|
free(ntlm->target_utf16);
|
|
@@ -231,7 +247,7 @@ int ntlm_client_set_target(ntlm_client *ntlm, const char *target)
|
|
|
231
247
|
if (supports_unicode(ntlm) && !ntlm_unicode_utf8_to_16(
|
|
232
248
|
&ntlm->target_utf16,
|
|
233
249
|
&ntlm->target_utf16_len,
|
|
234
|
-
ntlm
|
|
250
|
+
ntlm,
|
|
235
251
|
ntlm->target,
|
|
236
252
|
strlen(ntlm->target)))
|
|
237
253
|
return -1;
|
|
@@ -242,14 +258,16 @@ int ntlm_client_set_target(ntlm_client *ntlm, const char *target)
|
|
|
242
258
|
|
|
243
259
|
int ntlm_client_set_nonce(ntlm_client *ntlm, uint64_t nonce)
|
|
244
260
|
{
|
|
245
|
-
|
|
261
|
+
NTLM_ASSERT_ARG(ntlm);
|
|
262
|
+
|
|
246
263
|
ntlm->nonce = nonce;
|
|
247
264
|
return 0;
|
|
248
265
|
}
|
|
249
266
|
|
|
250
267
|
int ntlm_client_set_timestamp(ntlm_client *ntlm, uint64_t timestamp)
|
|
251
268
|
{
|
|
252
|
-
|
|
269
|
+
NTLM_ASSERT_ARG(ntlm);
|
|
270
|
+
|
|
253
271
|
ntlm->timestamp = timestamp;
|
|
254
272
|
return 0;
|
|
255
273
|
}
|
|
@@ -260,6 +278,9 @@ static inline bool write_buf(
|
|
|
260
278
|
const unsigned char *buf,
|
|
261
279
|
size_t len)
|
|
262
280
|
{
|
|
281
|
+
if (!len)
|
|
282
|
+
return true;
|
|
283
|
+
|
|
263
284
|
if (out->len - out->pos < len) {
|
|
264
285
|
ntlm_client_set_errmsg(ntlm, "out of buffer space");
|
|
265
286
|
return false;
|
|
@@ -474,7 +495,7 @@ static inline bool read_string_unicode(
|
|
|
474
495
|
size_t out_len;
|
|
475
496
|
int ret = ntlm_unicode_utf16_to_8(out,
|
|
476
497
|
&out_len,
|
|
477
|
-
ntlm
|
|
498
|
+
ntlm,
|
|
478
499
|
(char *)&message->buf[message->pos],
|
|
479
500
|
string_len);
|
|
480
501
|
|
|
@@ -592,7 +613,9 @@ int ntlm_client_negotiate(
|
|
|
592
613
|
size_t hostname_offset = 0;
|
|
593
614
|
uint32_t flags = 0;
|
|
594
615
|
|
|
595
|
-
|
|
616
|
+
NTLM_ASSERT_ARG(out);
|
|
617
|
+
NTLM_ASSERT_ARG(out_len);
|
|
618
|
+
NTLM_ASSERT_ARG(ntlm);
|
|
596
619
|
|
|
597
620
|
*out = NULL;
|
|
598
621
|
*out_len = 0;
|
|
@@ -648,13 +671,11 @@ int ntlm_client_negotiate(
|
|
|
648
671
|
return -1;
|
|
649
672
|
}
|
|
650
673
|
|
|
651
|
-
if ((ntlm->negotiate.buf =
|
|
674
|
+
if ((ntlm->negotiate.buf = calloc(1, ntlm->negotiate.len)) == NULL) {
|
|
652
675
|
ntlm_client_set_errmsg(ntlm, "out of memory");
|
|
653
676
|
return -1;
|
|
654
677
|
}
|
|
655
678
|
|
|
656
|
-
memset(ntlm->negotiate.buf, 0, ntlm->negotiate.len);
|
|
657
|
-
|
|
658
679
|
if (!write_buf(ntlm, &ntlm->negotiate,
|
|
659
680
|
ntlm_client_signature, sizeof(ntlm_client_signature)) ||
|
|
660
681
|
!write_int32(ntlm, &ntlm->negotiate, 1) ||
|
|
@@ -677,20 +698,22 @@ int ntlm_client_negotiate(
|
|
|
677
698
|
return -1;
|
|
678
699
|
|
|
679
700
|
if (hostname_len > 0) {
|
|
680
|
-
|
|
701
|
+
NTLM_ASSERT(ntlm, hostname_offset == ntlm->negotiate.pos);
|
|
702
|
+
|
|
681
703
|
if (!write_buf(ntlm, &ntlm->negotiate,
|
|
682
704
|
(const unsigned char *)ntlm->hostname, hostname_len))
|
|
683
705
|
return -1;
|
|
684
706
|
}
|
|
685
707
|
|
|
686
708
|
if (domain_len > 0) {
|
|
687
|
-
|
|
709
|
+
NTLM_ASSERT(ntlm, domain_offset == ntlm->negotiate.pos);
|
|
710
|
+
|
|
688
711
|
if (!write_buf(ntlm, &ntlm->negotiate,
|
|
689
712
|
(const unsigned char *)ntlm->hostdomain, domain_len))
|
|
690
713
|
return -1;
|
|
691
714
|
}
|
|
692
715
|
|
|
693
|
-
|
|
716
|
+
NTLM_ASSERT(ntlm, ntlm->negotiate.pos == ntlm->negotiate.len);
|
|
694
717
|
|
|
695
718
|
ntlm->state = NTLM_STATE_CHALLENGE;
|
|
696
719
|
|
|
@@ -712,7 +735,10 @@ int ntlm_client_set_challenge(
|
|
|
712
735
|
uint32_t name_offset, info_offset = 0;
|
|
713
736
|
bool unicode, has_target_info = false;
|
|
714
737
|
|
|
715
|
-
|
|
738
|
+
NTLM_ASSERT_ARG(ntlm);
|
|
739
|
+
NTLM_ASSERT_ARG(challenge_msg || !challenge_msg_len);
|
|
740
|
+
|
|
741
|
+
ENSURE_INITIALIZED(ntlm);
|
|
716
742
|
|
|
717
743
|
if (ntlm->state != NTLM_STATE_NEGOTIATE &&
|
|
718
744
|
ntlm->state != NTLM_STATE_CHALLENGE) {
|
|
@@ -941,6 +967,7 @@ static void des_key_from_password(
|
|
|
941
967
|
|
|
942
968
|
static inline bool generate_lm_hash(
|
|
943
969
|
ntlm_des_block out[2],
|
|
970
|
+
ntlm_client *ntlm,
|
|
944
971
|
const char *password)
|
|
945
972
|
{
|
|
946
973
|
/* LM encrypts this known plaintext using the password as a key */
|
|
@@ -969,8 +996,8 @@ static inline bool generate_lm_hash(
|
|
|
969
996
|
des_key_from_password(&key1, keystr1, keystr1_len);
|
|
970
997
|
des_key_from_password(&key2, keystr2, keystr2_len);
|
|
971
998
|
|
|
972
|
-
return ntlm_des_encrypt(&out[0], &plaintext, &key1) &&
|
|
973
|
-
ntlm_des_encrypt(&out[1], &plaintext, &key2);
|
|
999
|
+
return ntlm_des_encrypt(&out[0], ntlm, &plaintext, &key1) &&
|
|
1000
|
+
ntlm_des_encrypt(&out[1], ntlm, &plaintext, &key2);
|
|
974
1001
|
}
|
|
975
1002
|
|
|
976
1003
|
static void des_keys_from_lm_hash(ntlm_des_block out[3], ntlm_des_block lm_hash[2])
|
|
@@ -995,16 +1022,16 @@ static bool generate_lm_response(ntlm_client *ntlm)
|
|
|
995
1022
|
ntlm_des_block *challenge = (ntlm_des_block *)&ntlm->challenge.nonce;
|
|
996
1023
|
|
|
997
1024
|
/* Generate the LM hash from the password */
|
|
998
|
-
if (!generate_lm_hash(lm_hash, ntlm->password))
|
|
1025
|
+
if (!generate_lm_hash(lm_hash, ntlm, ntlm->password))
|
|
999
1026
|
return false;
|
|
1000
1027
|
|
|
1001
1028
|
/* Convert that LM hash to three DES keys */
|
|
1002
1029
|
des_keys_from_lm_hash(key, lm_hash);
|
|
1003
1030
|
|
|
1004
1031
|
/* Finally, encrypt the challenge with each of these keys */
|
|
1005
|
-
if (!ntlm_des_encrypt(&lm_response[0], challenge, &key[0]) ||
|
|
1006
|
-
!ntlm_des_encrypt(&lm_response[1], challenge, &key[1]) ||
|
|
1007
|
-
!ntlm_des_encrypt(&lm_response[2], challenge, &key[2]))
|
|
1032
|
+
if (!ntlm_des_encrypt(&lm_response[0], ntlm, challenge, &key[0]) ||
|
|
1033
|
+
!ntlm_des_encrypt(&lm_response[1], ntlm, challenge, &key[1]) ||
|
|
1034
|
+
!ntlm_des_encrypt(&lm_response[2], ntlm, challenge, &key[2]))
|
|
1008
1035
|
return false;
|
|
1009
1036
|
|
|
1010
1037
|
memcpy(&ntlm->lm_response[0], lm_response[0], 8);
|
|
@@ -1023,12 +1050,13 @@ static bool generate_ntlm_hash(
|
|
|
1023
1050
|
if (ntlm->password && !ntlm_unicode_utf8_to_16(
|
|
1024
1051
|
&ntlm->password_utf16,
|
|
1025
1052
|
&ntlm->password_utf16_len,
|
|
1026
|
-
ntlm
|
|
1053
|
+
ntlm,
|
|
1027
1054
|
ntlm->password,
|
|
1028
1055
|
strlen(ntlm->password)))
|
|
1029
1056
|
return false;
|
|
1030
1057
|
|
|
1031
1058
|
return ntlm_md4_digest(out,
|
|
1059
|
+
ntlm,
|
|
1032
1060
|
(const unsigned char *)ntlm->password_utf16,
|
|
1033
1061
|
ntlm->password_utf16_len);
|
|
1034
1062
|
}
|
|
@@ -1049,9 +1077,9 @@ static bool generate_ntlm_response(ntlm_client *ntlm)
|
|
|
1049
1077
|
des_key_from_password(&key[2], &ntlm_hash[14], 2);
|
|
1050
1078
|
|
|
1051
1079
|
/* Finally, encrypt the challenge with each of these keys */
|
|
1052
|
-
if (!ntlm_des_encrypt(&ntlm_response[0], challenge, &key[0]) ||
|
|
1053
|
-
!ntlm_des_encrypt(&ntlm_response[1], challenge, &key[1]) ||
|
|
1054
|
-
!ntlm_des_encrypt(&ntlm_response[2], challenge, &key[2]))
|
|
1080
|
+
if (!ntlm_des_encrypt(&ntlm_response[0], ntlm, challenge, &key[0]) ||
|
|
1081
|
+
!ntlm_des_encrypt(&ntlm_response[1], ntlm, challenge, &key[1]) ||
|
|
1082
|
+
!ntlm_des_encrypt(&ntlm_response[2], ntlm, challenge, &key[2]))
|
|
1055
1083
|
return false;
|
|
1056
1084
|
|
|
1057
1085
|
memcpy(&ntlm->ntlm_response[0], ntlm_response[0], 8);
|
|
@@ -1082,16 +1110,15 @@ static bool generate_ntlm2_hash(
|
|
|
1082
1110
|
target_len = ntlm->target_utf16_len;
|
|
1083
1111
|
}
|
|
1084
1112
|
|
|
1085
|
-
if (!
|
|
1086
|
-
!
|
|
1087
|
-
!ntlm_hmac_md5_update(ntlm
|
|
1088
|
-
!
|
|
1089
|
-
!ntlm_hmac_md5_final(out, &out_len, ntlm->hmac_ctx)) {
|
|
1113
|
+
if (!ntlm_hmac_md5_init(ntlm, ntlm_hash, sizeof(ntlm_hash)) ||
|
|
1114
|
+
!ntlm_hmac_md5_update(ntlm, username, username_len) ||
|
|
1115
|
+
!ntlm_hmac_md5_update(ntlm, target, target_len) ||
|
|
1116
|
+
!ntlm_hmac_md5_final(out, &out_len, ntlm)) {
|
|
1090
1117
|
ntlm_client_set_errmsg(ntlm, "failed to create HMAC-MD5");
|
|
1091
1118
|
return false;
|
|
1092
1119
|
}
|
|
1093
1120
|
|
|
1094
|
-
|
|
1121
|
+
NTLM_ASSERT(ntlm, out_len == NTLM_NTLM2_HASH_LEN);
|
|
1095
1122
|
return true;
|
|
1096
1123
|
}
|
|
1097
1124
|
|
|
@@ -1104,43 +1131,36 @@ static bool generate_ntlm2_challengehash(
|
|
|
1104
1131
|
{
|
|
1105
1132
|
size_t out_len = 16;
|
|
1106
1133
|
|
|
1107
|
-
if (!
|
|
1108
|
-
!
|
|
1109
|
-
|
|
1110
|
-
!
|
|
1111
|
-
(const unsigned char *)&ntlm->challenge.nonce, 8) ||
|
|
1112
|
-
!ntlm_hmac_md5_update(ntlm->hmac_ctx, blob, blob_len) ||
|
|
1113
|
-
!ntlm_hmac_md5_final(out, &out_len, ntlm->hmac_ctx)) {
|
|
1134
|
+
if (!ntlm_hmac_md5_init(ntlm, ntlm2_hash, NTLM_NTLM2_HASH_LEN) ||
|
|
1135
|
+
!ntlm_hmac_md5_update(ntlm, (const unsigned char *)&ntlm->challenge.nonce, 8) ||
|
|
1136
|
+
!ntlm_hmac_md5_update(ntlm, blob, blob_len) ||
|
|
1137
|
+
!ntlm_hmac_md5_final(out, &out_len, ntlm)) {
|
|
1114
1138
|
ntlm_client_set_errmsg(ntlm, "failed to create HMAC-MD5");
|
|
1115
1139
|
return false;
|
|
1116
1140
|
}
|
|
1117
1141
|
|
|
1118
|
-
|
|
1142
|
+
NTLM_ASSERT(ntlm, out_len == 16);
|
|
1119
1143
|
return true;
|
|
1120
1144
|
}
|
|
1121
1145
|
|
|
1122
1146
|
static bool generate_lm2_response(ntlm_client *ntlm,
|
|
1123
1147
|
unsigned char ntlm2_hash[NTLM_NTLM2_HASH_LEN])
|
|
1124
1148
|
{
|
|
1125
|
-
unsigned char lm2_challengehash[16];
|
|
1149
|
+
unsigned char lm2_challengehash[16] = {0};
|
|
1126
1150
|
size_t lm2_len = 16;
|
|
1127
1151
|
uint64_t local_nonce;
|
|
1128
1152
|
|
|
1129
|
-
local_nonce =
|
|
1153
|
+
local_nonce = ntlm_htonll(ntlm->nonce);
|
|
1130
1154
|
|
|
1131
|
-
if (!
|
|
1132
|
-
!
|
|
1133
|
-
|
|
1134
|
-
!
|
|
1135
|
-
(const unsigned char *)&ntlm->challenge.nonce, 8) ||
|
|
1136
|
-
!ntlm_hmac_md5_update(ntlm->hmac_ctx,
|
|
1137
|
-
(const unsigned char *)&local_nonce, 8) ||
|
|
1138
|
-
!ntlm_hmac_md5_final(lm2_challengehash, &lm2_len, ntlm->hmac_ctx)) {
|
|
1155
|
+
if (!ntlm_hmac_md5_init(ntlm, ntlm2_hash, NTLM_NTLM2_HASH_LEN) ||
|
|
1156
|
+
!ntlm_hmac_md5_update(ntlm, (const unsigned char *)&ntlm->challenge.nonce, 8) ||
|
|
1157
|
+
!ntlm_hmac_md5_update(ntlm, (const unsigned char *)&local_nonce, 8) ||
|
|
1158
|
+
!ntlm_hmac_md5_final(lm2_challengehash, &lm2_len, ntlm)) {
|
|
1139
1159
|
ntlm_client_set_errmsg(ntlm, "failed to create HMAC-MD5");
|
|
1140
1160
|
return false;
|
|
1141
1161
|
}
|
|
1142
1162
|
|
|
1143
|
-
|
|
1163
|
+
NTLM_ASSERT(ntlm, lm2_len == 16);
|
|
1144
1164
|
|
|
1145
1165
|
memcpy(&ntlm->lm_response[0], lm2_challengehash, 16);
|
|
1146
1166
|
memcpy(&ntlm->lm_response[16], &local_nonce, 8);
|
|
@@ -1164,7 +1184,7 @@ static bool generate_nonce(ntlm_client *ntlm)
|
|
|
1164
1184
|
if (ntlm->nonce)
|
|
1165
1185
|
return true;
|
|
1166
1186
|
|
|
1167
|
-
if (!ntlm_random_bytes(
|
|
1187
|
+
if (!ntlm_random_bytes(buf, ntlm, 8))
|
|
1168
1188
|
return false;
|
|
1169
1189
|
|
|
1170
1190
|
memcpy(&ntlm->nonce, buf, sizeof(uint64_t));
|
|
@@ -1177,7 +1197,7 @@ static bool generate_ntlm2_response(ntlm_client *ntlm)
|
|
|
1177
1197
|
uint32_t signature;
|
|
1178
1198
|
uint64_t timestamp, nonce;
|
|
1179
1199
|
unsigned char ntlm2_hash[NTLM_NTLM2_HASH_LEN];
|
|
1180
|
-
unsigned char challengehash[16];
|
|
1200
|
+
unsigned char challengehash[16] = {0};
|
|
1181
1201
|
unsigned char *blob;
|
|
1182
1202
|
|
|
1183
1203
|
if (!generate_timestamp(ntlm) ||
|
|
@@ -1198,8 +1218,8 @@ static bool generate_ntlm2_response(ntlm_client *ntlm)
|
|
|
1198
1218
|
|
|
1199
1219
|
/* the blob's integer values are in network byte order */
|
|
1200
1220
|
signature = htonl(0x01010000);
|
|
1201
|
-
timestamp =
|
|
1202
|
-
nonce =
|
|
1221
|
+
timestamp = ntlm_htonll(ntlm->timestamp);
|
|
1222
|
+
nonce = ntlm_htonll(ntlm->nonce);
|
|
1203
1223
|
|
|
1204
1224
|
/* construct the blob */
|
|
1205
1225
|
memcpy(&blob[0], &signature, 4);
|
|
@@ -1234,7 +1254,11 @@ int ntlm_client_response(
|
|
|
1234
1254
|
uint32_t flags = 0;
|
|
1235
1255
|
bool unicode;
|
|
1236
1256
|
|
|
1237
|
-
|
|
1257
|
+
NTLM_ASSERT_ARG(out);
|
|
1258
|
+
NTLM_ASSERT_ARG(out_len);
|
|
1259
|
+
NTLM_ASSERT_ARG(ntlm);
|
|
1260
|
+
|
|
1261
|
+
ENSURE_INITIALIZED(ntlm);
|
|
1238
1262
|
|
|
1239
1263
|
*out = NULL;
|
|
1240
1264
|
*out_len = 0;
|
|
@@ -1334,13 +1358,11 @@ int ntlm_client_response(
|
|
|
1334
1358
|
return -1;
|
|
1335
1359
|
}
|
|
1336
1360
|
|
|
1337
|
-
if ((ntlm->response.buf =
|
|
1361
|
+
if ((ntlm->response.buf = calloc(1, ntlm->response.len)) == NULL) {
|
|
1338
1362
|
ntlm_client_set_errmsg(ntlm, "out of memory");
|
|
1339
1363
|
return -1;
|
|
1340
1364
|
}
|
|
1341
1365
|
|
|
1342
|
-
memset(ntlm->response.buf, 0, ntlm->response.len);
|
|
1343
|
-
|
|
1344
1366
|
if (!write_buf(ntlm, &ntlm->response,
|
|
1345
1367
|
ntlm_client_signature, sizeof(ntlm_client_signature)) ||
|
|
1346
1368
|
!write_int32(ntlm, &ntlm->response, 3) ||
|
|
@@ -1359,7 +1381,7 @@ int ntlm_client_response(
|
|
|
1359
1381
|
!write_buf(ntlm, &ntlm->response, session, session_len))
|
|
1360
1382
|
return -1;
|
|
1361
1383
|
|
|
1362
|
-
|
|
1384
|
+
NTLM_ASSERT(ntlm, ntlm->response.pos == ntlm->response.len);
|
|
1363
1385
|
|
|
1364
1386
|
ntlm->state = NTLM_STATE_COMPLETE;
|
|
1365
1387
|
|
|
@@ -1371,41 +1393,48 @@ int ntlm_client_response(
|
|
|
1371
1393
|
|
|
1372
1394
|
void ntlm_client_reset(ntlm_client *ntlm)
|
|
1373
1395
|
{
|
|
1374
|
-
|
|
1375
|
-
|
|
1376
|
-
ntlm_unicode_ctx *unicode_ctx;
|
|
1377
|
-
|
|
1378
|
-
assert(ntlm);
|
|
1396
|
+
if (!ntlm)
|
|
1397
|
+
return;
|
|
1379
1398
|
|
|
1380
|
-
|
|
1381
|
-
free(ntlm->challenge.target_info);
|
|
1382
|
-
free(ntlm->challenge.target);
|
|
1383
|
-
free(ntlm->challenge.target_domain);
|
|
1384
|
-
free(ntlm->challenge.target_domain_dns);
|
|
1385
|
-
free(ntlm->challenge.target_server);
|
|
1386
|
-
free(ntlm->challenge.target_server_dns);
|
|
1387
|
-
free(ntlm->response.buf);
|
|
1399
|
+
ntlm->state = NTLM_STATE_NEGOTIATE;
|
|
1388
1400
|
|
|
1389
|
-
|
|
1390
|
-
free(ntlm->hostname_utf16);
|
|
1391
|
-
free(ntlm->hostdomain);
|
|
1401
|
+
free_hostname(ntlm);
|
|
1392
1402
|
|
|
1393
|
-
|
|
1394
|
-
free(ntlm->target_utf16);
|
|
1403
|
+
memset(&ntlm->host_version, 0, sizeof(ntlm_version));
|
|
1395
1404
|
|
|
1396
|
-
|
|
1405
|
+
reset(ntlm->target);
|
|
1406
|
+
reset(ntlm->target_utf16);
|
|
1407
|
+
ntlm->target_utf16_len = 0;
|
|
1397
1408
|
|
|
1398
1409
|
free_credentials(ntlm);
|
|
1399
1410
|
|
|
1400
|
-
|
|
1401
|
-
|
|
1402
|
-
unicode_ctx = ntlm->unicode_ctx;
|
|
1411
|
+
ntlm->nonce = 0;
|
|
1412
|
+
ntlm->timestamp = 0;
|
|
1403
1413
|
|
|
1404
|
-
memset(ntlm, 0,
|
|
1414
|
+
memset(ntlm->lm_response, 0, NTLM_LM_RESPONSE_LEN);
|
|
1415
|
+
ntlm->lm_response_len = 0;
|
|
1405
1416
|
|
|
1406
|
-
ntlm->
|
|
1407
|
-
ntlm->
|
|
1408
|
-
|
|
1417
|
+
memset(ntlm->ntlm_response, 0, NTLM_NTLM_RESPONSE_LEN);
|
|
1418
|
+
ntlm->ntlm_response_len = 0;
|
|
1419
|
+
|
|
1420
|
+
reset(ntlm->ntlm2_response);
|
|
1421
|
+
ntlm->ntlm2_response_len = 0;
|
|
1422
|
+
|
|
1423
|
+
reset(ntlm->negotiate.buf);
|
|
1424
|
+
ntlm->negotiate.pos = 0;
|
|
1425
|
+
ntlm->negotiate.len = 0;
|
|
1426
|
+
|
|
1427
|
+
reset(ntlm->response.buf);
|
|
1428
|
+
ntlm->response.pos = 0;
|
|
1429
|
+
ntlm->response.len = 0;
|
|
1430
|
+
|
|
1431
|
+
free(ntlm->challenge.target_info);
|
|
1432
|
+
free(ntlm->challenge.target);
|
|
1433
|
+
free(ntlm->challenge.target_domain);
|
|
1434
|
+
free(ntlm->challenge.target_domain_dns);
|
|
1435
|
+
free(ntlm->challenge.target_server);
|
|
1436
|
+
free(ntlm->challenge.target_server_dns);
|
|
1437
|
+
memset(&ntlm->challenge, 0, sizeof(ntlm_challenge));
|
|
1409
1438
|
}
|
|
1410
1439
|
|
|
1411
1440
|
void ntlm_client_free(ntlm_client *ntlm)
|
|
@@ -1413,10 +1442,10 @@ void ntlm_client_free(ntlm_client *ntlm)
|
|
|
1413
1442
|
if (!ntlm)
|
|
1414
1443
|
return;
|
|
1415
1444
|
|
|
1416
|
-
|
|
1445
|
+
ntlm_crypt_shutdown(ntlm);
|
|
1446
|
+
ntlm_unicode_shutdown(ntlm);
|
|
1417
1447
|
|
|
1418
|
-
|
|
1419
|
-
ntlm_unicode_ctx_free(ntlm->unicode_ctx);
|
|
1448
|
+
ntlm_client_reset(ntlm);
|
|
1420
1449
|
|
|
1421
1450
|
free(ntlm);
|
|
1422
1451
|
}
|