rugged 1.0.0 → 1.2.0
Sign up to get free protection for your applications and to get access to all the features.
- 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
|
}
|