rugged 1.4.5 → 1.5.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/README.md +34 -2
- data/ext/rugged/extconf.rb +1 -0
- data/ext/rugged/rugged.c +16 -0
- data/ext/rugged/rugged.h +4 -0
- data/ext/rugged/rugged_remote.c +10 -10
- data/ext/rugged/rugged_repo.c +2 -7
- data/ext/rugged/rugged_settings.c +5 -0
- data/lib/rugged/tree.rb +4 -0
- data/lib/rugged/version.rb +1 -1
- data/vendor/libgit2/CMakeLists.txt +16 -3
- data/vendor/libgit2/COPYING +40 -0
- data/vendor/libgit2/cmake/AddClarTest.cmake +7 -0
- data/vendor/libgit2/cmake/FindPCRE.cmake +3 -4
- data/vendor/libgit2/cmake/FindPCRE2.cmake +1 -1
- data/vendor/libgit2/cmake/SelectHTTPSBackend.cmake +1 -1
- data/vendor/libgit2/cmake/SelectHashes.cmake +62 -14
- data/vendor/libgit2/deps/ntlmclient/crypt_openssl.c +3 -1
- data/vendor/libgit2/include/git2/branch.h +2 -2
- data/vendor/libgit2/include/git2/common.h +11 -0
- data/vendor/libgit2/include/git2/config.h +6 -6
- data/vendor/libgit2/include/git2/deprecated.h +2 -0
- data/vendor/libgit2/include/git2/errors.h +17 -3
- data/vendor/libgit2/include/git2/merge.h +1 -1
- data/vendor/libgit2/include/git2/status.h +5 -2
- data/vendor/libgit2/include/git2/sys/remote.h +15 -0
- data/vendor/libgit2/include/git2/sys/transport.h +9 -5
- data/vendor/libgit2/include/git2/version.h +27 -6
- data/vendor/libgit2/src/CMakeLists.txt +104 -214
- data/vendor/libgit2/src/README.md +12 -0
- data/vendor/libgit2/src/cli/CMakeLists.txt +53 -0
- data/vendor/libgit2/src/cli/README.md +26 -0
- data/vendor/libgit2/src/cli/cli.h +20 -0
- data/vendor/libgit2/src/cli/cmd.c +21 -0
- data/vendor/libgit2/src/cli/cmd.h +33 -0
- data/vendor/libgit2/src/cli/cmd_cat_file.c +204 -0
- data/vendor/libgit2/src/cli/cmd_clone.c +176 -0
- data/vendor/libgit2/src/cli/cmd_hash_object.c +135 -0
- data/vendor/libgit2/src/cli/cmd_help.c +86 -0
- data/vendor/libgit2/src/cli/error.h +51 -0
- data/vendor/libgit2/src/cli/main.c +106 -0
- data/vendor/libgit2/src/cli/opt.c +669 -0
- data/vendor/libgit2/src/cli/opt.h +349 -0
- data/vendor/libgit2/src/cli/opt_usage.c +194 -0
- data/vendor/libgit2/src/cli/opt_usage.h +35 -0
- data/vendor/libgit2/src/cli/progress.c +345 -0
- data/vendor/libgit2/src/cli/progress.h +117 -0
- data/vendor/libgit2/src/cli/sighandler.h +20 -0
- data/vendor/libgit2/src/cli/unix/sighandler.c +36 -0
- data/vendor/libgit2/src/cli/win32/precompiled.h +3 -0
- data/vendor/libgit2/src/cli/win32/sighandler.c +37 -0
- data/vendor/libgit2/src/features.h.in +9 -0
- data/vendor/libgit2/src/libgit2/CMakeLists.txt +131 -0
- data/vendor/libgit2/src/{blob.c → libgit2/blob.c} +1 -1
- data/vendor/libgit2/src/{branch.c → libgit2/branch.c} +14 -9
- data/vendor/libgit2/src/{commit_graph.c → libgit2/commit_graph.c} +20 -17
- data/vendor/libgit2/src/{commit_graph.h → libgit2/commit_graph.h} +1 -1
- data/vendor/libgit2/src/libgit2/common.h +55 -0
- data/vendor/libgit2/src/{config.c → libgit2/config.c} +2 -2
- data/vendor/libgit2/src/{describe.c → libgit2/describe.c} +1 -1
- data/vendor/libgit2/src/{diff_xdiff.c → libgit2/diff_xdiff.c} +1 -0
- data/vendor/libgit2/src/{errors.h → libgit2/errors.h} +1 -2
- data/vendor/libgit2/src/{filter.c → libgit2/filter.c} +31 -1
- data/vendor/libgit2/src/{index.c → libgit2/index.c} +6 -6
- data/vendor/libgit2/src/{indexer.c → libgit2/indexer.c} +2 -2
- data/vendor/libgit2/src/{iterator.c → libgit2/iterator.c} +3 -3
- data/vendor/libgit2/src/{libgit2.c → libgit2/libgit2.c} +5 -0
- data/vendor/libgit2/src/{midx.c → libgit2/midx.c} +20 -23
- data/vendor/libgit2/src/{midx.h → libgit2/midx.h} +2 -1
- data/vendor/libgit2/src/{mwindow.c → libgit2/mwindow.c} +9 -9
- data/vendor/libgit2/src/{mwindow.h → libgit2/mwindow.h} +1 -1
- data/vendor/libgit2/src/{netops.c → libgit2/netops.c} +0 -1
- data/vendor/libgit2/src/{object.c → libgit2/object.c} +1 -0
- data/vendor/libgit2/src/{odb.c → libgit2/odb.c} +2 -2
- data/vendor/libgit2/src/{oid.c → libgit2/oid.c} +2 -21
- data/vendor/libgit2/src/{oid.h → libgit2/oid.h} +35 -2
- data/vendor/libgit2/src/{oidmap.c → libgit2/oidmap.c} +1 -1
- data/vendor/libgit2/src/{pack.c → libgit2/pack.c} +24 -18
- data/vendor/libgit2/src/{pack.h → libgit2/pack.h} +3 -2
- data/vendor/libgit2/src/{path.c → libgit2/path.c} +1 -0
- data/vendor/libgit2/src/{rebase.c → libgit2/rebase.c} +11 -1
- data/vendor/libgit2/src/{refdb_fs.c → libgit2/refdb_fs.c} +6 -2
- data/vendor/libgit2/src/{remote.c → libgit2/remote.c} +1 -1
- data/vendor/libgit2/src/{remote.h → libgit2/remote.h} +1 -1
- data/vendor/libgit2/src/{repository.c → libgit2/repository.c} +1 -0
- data/vendor/libgit2/src/{tag.c → libgit2/tag.c} +15 -5
- data/vendor/libgit2/src/{transports → libgit2/transports}/httpclient.c +1 -1
- data/vendor/libgit2/src/{transports → libgit2/transports}/smart.c +12 -0
- data/vendor/libgit2/src/{transports → libgit2/transports}/ssh.c +91 -326
- data/vendor/libgit2/src/{tree-cache.c → libgit2/tree-cache.c} +1 -1
- data/vendor/libgit2/src/{tree.c → libgit2/tree.c} +16 -23
- data/vendor/libgit2/src/{tree.h → libgit2/tree.h} +1 -1
- data/vendor/libgit2/src/util/CMakeLists.txt +74 -0
- data/vendor/libgit2/src/{allocators → util/allocators}/failalloc.h +1 -1
- data/vendor/libgit2/src/{allocators → util/allocators}/stdalloc.h +1 -1
- data/vendor/libgit2/src/{allocators → util/allocators}/win32_leakcheck.h +1 -1
- data/vendor/libgit2/src/{array.h → util/array.h} +1 -1
- data/vendor/libgit2/src/{assert_safe.h → util/assert_safe.h} +16 -0
- data/vendor/libgit2/src/{date.c → util/date.c} +4 -3
- data/vendor/libgit2/src/{filebuf.c → util/filebuf.c} +1 -1
- data/vendor/libgit2/src/{filebuf.h → util/filebuf.h} +1 -1
- data/vendor/libgit2/src/{fs_path.c → util/fs_path.c} +17 -11
- data/vendor/libgit2/src/{fs_path.h → util/fs_path.h} +1 -1
- data/vendor/libgit2/src/{futils.c → util/futils.c} +44 -2
- data/vendor/libgit2/src/{futils.h → util/futils.h} +2 -1
- data/vendor/libgit2/src/{common.h → util/git2_util.h} +13 -59
- data/vendor/libgit2/src/util/hash/builtin.c +53 -0
- data/vendor/libgit2/src/{hash/sha1/openssl.h → util/hash/builtin.h} +6 -6
- data/vendor/libgit2/src/{hash/sha1 → util/hash}/collisiondetect.c +1 -1
- data/vendor/libgit2/src/{hash/sha1 → util/hash}/collisiondetect.h +3 -3
- data/vendor/libgit2/src/{hash/sha1 → util/hash}/common_crypto.c +55 -0
- data/vendor/libgit2/src/{hash/sha1 → util/hash}/common_crypto.h +11 -3
- data/vendor/libgit2/src/{hash/sha1 → util/hash}/mbedtls.c +46 -0
- data/vendor/libgit2/src/{hash/sha1 → util/hash}/mbedtls.h +14 -4
- data/vendor/libgit2/src/util/hash/openssl.c +194 -0
- data/vendor/libgit2/src/util/hash/openssl.h +45 -0
- data/vendor/libgit2/src/util/hash/rfc6234/sha.h +355 -0
- data/vendor/libgit2/src/util/hash/rfc6234/sha224-256.c +601 -0
- data/vendor/libgit2/src/util/hash/sha.h +70 -0
- data/vendor/libgit2/src/util/hash/win32.c +549 -0
- data/vendor/libgit2/src/util/hash/win32.h +60 -0
- data/vendor/libgit2/src/{hash.c → util/hash.c} +17 -1
- data/vendor/libgit2/src/{hash.h → util/hash.h} +5 -3
- data/vendor/libgit2/src/{map.h → util/map.h} +1 -1
- data/vendor/libgit2/src/{net.c → util/net.c} +0 -1
- data/vendor/libgit2/src/{net.h → util/net.h} +1 -1
- data/vendor/libgit2/src/{pool.h → util/pool.h} +1 -1
- data/vendor/libgit2/src/{posix.h → util/posix.h} +1 -1
- data/vendor/libgit2/src/{pqueue.h → util/pqueue.h} +1 -1
- data/vendor/libgit2/src/{rand.c → util/rand.c} +7 -3
- data/vendor/libgit2/src/{rand.h → util/rand.h} +1 -1
- data/vendor/libgit2/src/{regexp.h → util/regexp.h} +1 -1
- data/vendor/libgit2/src/{runtime.c → util/runtime.c} +1 -1
- data/vendor/libgit2/src/{runtime.h → util/runtime.h} +1 -1
- data/vendor/libgit2/src/{sortedcache.h → util/sortedcache.h} +1 -1
- data/vendor/libgit2/src/{str.h → util/str.h} +1 -1
- data/vendor/libgit2/src/{strmap.h → util/strmap.h} +1 -1
- data/vendor/libgit2/src/{thread.c → util/thread.c} +1 -1
- data/vendor/libgit2/src/{tsort.c → util/tsort.c} +1 -1
- data/vendor/libgit2/src/{unix → util/unix}/map.c +1 -1
- data/vendor/libgit2/src/{unix → util/unix}/posix.h +1 -1
- data/vendor/libgit2/src/{unix → util/unix}/realpath.c +1 -1
- data/vendor/libgit2/src/{utf8.c → util/utf8.c} +1 -1
- data/vendor/libgit2/src/{utf8.h → util/utf8.h} +1 -1
- data/vendor/libgit2/src/{util.c → util/util.c} +1 -1
- data/vendor/libgit2/src/{util.h → util/util.h} +1 -1
- data/vendor/libgit2/src/{varint.h → util/varint.h} +1 -1
- data/vendor/libgit2/src/{vector.h → util/vector.h} +1 -1
- data/vendor/libgit2/src/{wildmatch.h → util/wildmatch.h} +1 -1
- data/vendor/libgit2/src/{win32 → util/win32}/dir.h +1 -1
- data/vendor/libgit2/src/{win32 → util/win32}/error.h +1 -1
- data/vendor/libgit2/src/{win32 → util/win32}/findfile.h +1 -1
- data/vendor/libgit2/src/{win32 → util/win32}/map.c +1 -1
- data/vendor/libgit2/src/{win32 → util/win32}/path_w32.h +1 -1
- data/vendor/libgit2/src/{win32 → util/win32}/posix.h +1 -1
- data/vendor/libgit2/src/{win32 → util/win32}/posix_w32.c +1 -1
- data/vendor/libgit2/src/util/win32/precompiled.c +1 -0
- data/vendor/libgit2/src/{win32 → util/win32}/precompiled.h +1 -1
- data/vendor/libgit2/src/{win32 → util/win32}/thread.h +1 -1
- data/vendor/libgit2/src/{win32 → util/win32}/utf-conv.h +1 -1
- data/vendor/libgit2/src/{win32 → util/win32}/w32_buffer.h +1 -1
- data/vendor/libgit2/src/{win32 → util/win32}/w32_leakcheck.h +1 -1
- data/vendor/libgit2/src/{win32 → util/win32}/w32_util.h +1 -1
- data/vendor/libgit2/src/{zstream.h → util/zstream.h} +1 -1
- metadata +390 -361
- data/vendor/libgit2/src/hash/sha1/generic.c +0 -300
- data/vendor/libgit2/src/hash/sha1/generic.h +0 -19
- data/vendor/libgit2/src/hash/sha1/openssl.c +0 -59
- data/vendor/libgit2/src/hash/sha1/win32.c +0 -333
- data/vendor/libgit2/src/hash/sha1/win32.h +0 -128
- data/vendor/libgit2/src/hash/sha1.h +0 -40
- /data/vendor/libgit2/src/{win32 → cli/win32}/precompiled.c +0 -0
- /data/vendor/libgit2/src/{annotated_commit.c → libgit2/annotated_commit.c} +0 -0
- /data/vendor/libgit2/src/{annotated_commit.h → libgit2/annotated_commit.h} +0 -0
- /data/vendor/libgit2/src/{apply.c → libgit2/apply.c} +0 -0
- /data/vendor/libgit2/src/{apply.h → libgit2/apply.h} +0 -0
- /data/vendor/libgit2/src/{attr.c → libgit2/attr.c} +0 -0
- /data/vendor/libgit2/src/{attr.h → libgit2/attr.h} +0 -0
- /data/vendor/libgit2/src/{attr_file.c → libgit2/attr_file.c} +0 -0
- /data/vendor/libgit2/src/{attr_file.h → libgit2/attr_file.h} +0 -0
- /data/vendor/libgit2/src/{attrcache.c → libgit2/attrcache.c} +0 -0
- /data/vendor/libgit2/src/{attrcache.h → libgit2/attrcache.h} +0 -0
- /data/vendor/libgit2/src/{blame.c → libgit2/blame.c} +0 -0
- /data/vendor/libgit2/src/{blame.h → libgit2/blame.h} +0 -0
- /data/vendor/libgit2/src/{blame_git.c → libgit2/blame_git.c} +0 -0
- /data/vendor/libgit2/src/{blame_git.h → libgit2/blame_git.h} +0 -0
- /data/vendor/libgit2/src/{blob.h → libgit2/blob.h} +0 -0
- /data/vendor/libgit2/src/{branch.h → libgit2/branch.h} +0 -0
- /data/vendor/libgit2/src/{buf.c → libgit2/buf.c} +0 -0
- /data/vendor/libgit2/src/{buf.h → libgit2/buf.h} +0 -0
- /data/vendor/libgit2/src/{cache.c → libgit2/cache.c} +0 -0
- /data/vendor/libgit2/src/{cache.h → libgit2/cache.h} +0 -0
- /data/vendor/libgit2/src/{checkout.c → libgit2/checkout.c} +0 -0
- /data/vendor/libgit2/src/{checkout.h → libgit2/checkout.h} +0 -0
- /data/vendor/libgit2/src/{cherrypick.c → libgit2/cherrypick.c} +0 -0
- /data/vendor/libgit2/src/{clone.c → libgit2/clone.c} +0 -0
- /data/vendor/libgit2/src/{clone.h → libgit2/clone.h} +0 -0
- /data/vendor/libgit2/src/{commit.c → libgit2/commit.c} +0 -0
- /data/vendor/libgit2/src/{commit.h → libgit2/commit.h} +0 -0
- /data/vendor/libgit2/src/{commit_list.c → libgit2/commit_list.c} +0 -0
- /data/vendor/libgit2/src/{commit_list.h → libgit2/commit_list.h} +0 -0
- /data/vendor/libgit2/src/{config.h → libgit2/config.h} +0 -0
- /data/vendor/libgit2/src/{config_backend.h → libgit2/config_backend.h} +0 -0
- /data/vendor/libgit2/src/{config_cache.c → libgit2/config_cache.c} +0 -0
- /data/vendor/libgit2/src/{config_entries.c → libgit2/config_entries.c} +0 -0
- /data/vendor/libgit2/src/{config_entries.h → libgit2/config_entries.h} +0 -0
- /data/vendor/libgit2/src/{config_file.c → libgit2/config_file.c} +0 -0
- /data/vendor/libgit2/src/{config_mem.c → libgit2/config_mem.c} +0 -0
- /data/vendor/libgit2/src/{config_parse.c → libgit2/config_parse.c} +0 -0
- /data/vendor/libgit2/src/{config_parse.h → libgit2/config_parse.h} +0 -0
- /data/vendor/libgit2/src/{config_snapshot.c → libgit2/config_snapshot.c} +0 -0
- /data/vendor/libgit2/src/{crlf.c → libgit2/crlf.c} +0 -0
- /data/vendor/libgit2/src/{delta.c → libgit2/delta.c} +0 -0
- /data/vendor/libgit2/src/{delta.h → libgit2/delta.h} +0 -0
- /data/vendor/libgit2/src/{diff.c → libgit2/diff.c} +0 -0
- /data/vendor/libgit2/src/{diff.h → libgit2/diff.h} +0 -0
- /data/vendor/libgit2/src/{diff_driver.c → libgit2/diff_driver.c} +0 -0
- /data/vendor/libgit2/src/{diff_driver.h → libgit2/diff_driver.h} +0 -0
- /data/vendor/libgit2/src/{diff_file.c → libgit2/diff_file.c} +0 -0
- /data/vendor/libgit2/src/{diff_file.h → libgit2/diff_file.h} +0 -0
- /data/vendor/libgit2/src/{diff_generate.c → libgit2/diff_generate.c} +0 -0
- /data/vendor/libgit2/src/{diff_generate.h → libgit2/diff_generate.h} +0 -0
- /data/vendor/libgit2/src/{diff_parse.c → libgit2/diff_parse.c} +0 -0
- /data/vendor/libgit2/src/{diff_parse.h → libgit2/diff_parse.h} +0 -0
- /data/vendor/libgit2/src/{diff_print.c → libgit2/diff_print.c} +0 -0
- /data/vendor/libgit2/src/{diff_stats.c → libgit2/diff_stats.c} +0 -0
- /data/vendor/libgit2/src/{diff_stats.h → libgit2/diff_stats.h} +0 -0
- /data/vendor/libgit2/src/{diff_tform.c → libgit2/diff_tform.c} +0 -0
- /data/vendor/libgit2/src/{diff_tform.h → libgit2/diff_tform.h} +0 -0
- /data/vendor/libgit2/src/{diff_xdiff.h → libgit2/diff_xdiff.h} +0 -0
- /data/vendor/libgit2/src/{email.c → libgit2/email.c} +0 -0
- /data/vendor/libgit2/src/{email.h → libgit2/email.h} +0 -0
- /data/vendor/libgit2/src/{errors.c → libgit2/errors.c} +0 -0
- /data/vendor/libgit2/src/{fetch.c → libgit2/fetch.c} +0 -0
- /data/vendor/libgit2/src/{fetch.h → libgit2/fetch.h} +0 -0
- /data/vendor/libgit2/src/{fetchhead.c → libgit2/fetchhead.c} +0 -0
- /data/vendor/libgit2/src/{fetchhead.h → libgit2/fetchhead.h} +0 -0
- /data/vendor/libgit2/src/{filter.h → libgit2/filter.h} +0 -0
- /data/vendor/libgit2/src/{win32 → libgit2}/git2.rc +0 -0
- /data/vendor/libgit2/src/{graph.c → libgit2/graph.c} +0 -0
- /data/vendor/libgit2/src/{hashsig.c → libgit2/hashsig.c} +0 -0
- /data/vendor/libgit2/src/{ident.c → libgit2/ident.c} +0 -0
- /data/vendor/libgit2/src/{idxmap.c → libgit2/idxmap.c} +0 -0
- /data/vendor/libgit2/src/{idxmap.h → libgit2/idxmap.h} +0 -0
- /data/vendor/libgit2/src/{ignore.c → libgit2/ignore.c} +0 -0
- /data/vendor/libgit2/src/{ignore.h → libgit2/ignore.h} +0 -0
- /data/vendor/libgit2/src/{index.h → libgit2/index.h} +0 -0
- /data/vendor/libgit2/src/{indexer.h → libgit2/indexer.h} +0 -0
- /data/vendor/libgit2/src/{iterator.h → libgit2/iterator.h} +0 -0
- /data/vendor/libgit2/src/{libgit2.h → libgit2/libgit2.h} +0 -0
- /data/vendor/libgit2/src/{mailmap.c → libgit2/mailmap.c} +0 -0
- /data/vendor/libgit2/src/{mailmap.h → libgit2/mailmap.h} +0 -0
- /data/vendor/libgit2/src/{merge.c → libgit2/merge.c} +0 -0
- /data/vendor/libgit2/src/{merge.h → libgit2/merge.h} +0 -0
- /data/vendor/libgit2/src/{merge_driver.c → libgit2/merge_driver.c} +0 -0
- /data/vendor/libgit2/src/{merge_driver.h → libgit2/merge_driver.h} +0 -0
- /data/vendor/libgit2/src/{merge_file.c → libgit2/merge_file.c} +0 -0
- /data/vendor/libgit2/src/{message.c → libgit2/message.c} +0 -0
- /data/vendor/libgit2/src/{netops.h → libgit2/netops.h} +0 -0
- /data/vendor/libgit2/src/{notes.c → libgit2/notes.c} +0 -0
- /data/vendor/libgit2/src/{notes.h → libgit2/notes.h} +0 -0
- /data/vendor/libgit2/src/{object.h → libgit2/object.h} +0 -0
- /data/vendor/libgit2/src/{object_api.c → libgit2/object_api.c} +0 -0
- /data/vendor/libgit2/src/{odb.h → libgit2/odb.h} +0 -0
- /data/vendor/libgit2/src/{odb_loose.c → libgit2/odb_loose.c} +0 -0
- /data/vendor/libgit2/src/{odb_mempack.c → libgit2/odb_mempack.c} +0 -0
- /data/vendor/libgit2/src/{odb_pack.c → libgit2/odb_pack.c} +0 -0
- /data/vendor/libgit2/src/{offmap.c → libgit2/offmap.c} +0 -0
- /data/vendor/libgit2/src/{offmap.h → libgit2/offmap.h} +0 -0
- /data/vendor/libgit2/src/{oidarray.c → libgit2/oidarray.c} +0 -0
- /data/vendor/libgit2/src/{oidarray.h → libgit2/oidarray.h} +0 -0
- /data/vendor/libgit2/src/{oidmap.h → libgit2/oidmap.h} +0 -0
- /data/vendor/libgit2/src/{pack-objects.c → libgit2/pack-objects.c} +0 -0
- /data/vendor/libgit2/src/{pack-objects.h → libgit2/pack-objects.h} +0 -0
- /data/vendor/libgit2/src/{parse.c → libgit2/parse.c} +0 -0
- /data/vendor/libgit2/src/{parse.h → libgit2/parse.h} +0 -0
- /data/vendor/libgit2/src/{patch.c → libgit2/patch.c} +0 -0
- /data/vendor/libgit2/src/{patch.h → libgit2/patch.h} +0 -0
- /data/vendor/libgit2/src/{patch_generate.c → libgit2/patch_generate.c} +0 -0
- /data/vendor/libgit2/src/{patch_generate.h → libgit2/patch_generate.h} +0 -0
- /data/vendor/libgit2/src/{patch_parse.c → libgit2/patch_parse.c} +0 -0
- /data/vendor/libgit2/src/{patch_parse.h → libgit2/patch_parse.h} +0 -0
- /data/vendor/libgit2/src/{path.h → libgit2/path.h} +0 -0
- /data/vendor/libgit2/src/{pathspec.c → libgit2/pathspec.c} +0 -0
- /data/vendor/libgit2/src/{pathspec.h → libgit2/pathspec.h} +0 -0
- /data/vendor/libgit2/src/{proxy.c → libgit2/proxy.c} +0 -0
- /data/vendor/libgit2/src/{proxy.h → libgit2/proxy.h} +0 -0
- /data/vendor/libgit2/src/{push.c → libgit2/push.c} +0 -0
- /data/vendor/libgit2/src/{push.h → libgit2/push.h} +0 -0
- /data/vendor/libgit2/src/{reader.c → libgit2/reader.c} +0 -0
- /data/vendor/libgit2/src/{reader.h → libgit2/reader.h} +0 -0
- /data/vendor/libgit2/src/{refdb.c → libgit2/refdb.c} +0 -0
- /data/vendor/libgit2/src/{refdb.h → libgit2/refdb.h} +0 -0
- /data/vendor/libgit2/src/{reflog.c → libgit2/reflog.c} +0 -0
- /data/vendor/libgit2/src/{reflog.h → libgit2/reflog.h} +0 -0
- /data/vendor/libgit2/src/{refs.c → libgit2/refs.c} +0 -0
- /data/vendor/libgit2/src/{refs.h → libgit2/refs.h} +0 -0
- /data/vendor/libgit2/src/{refspec.c → libgit2/refspec.c} +0 -0
- /data/vendor/libgit2/src/{refspec.h → libgit2/refspec.h} +0 -0
- /data/vendor/libgit2/src/{repo_template.h → libgit2/repo_template.h} +0 -0
- /data/vendor/libgit2/src/{repository.h → libgit2/repository.h} +0 -0
- /data/vendor/libgit2/src/{reset.c → libgit2/reset.c} +0 -0
- /data/vendor/libgit2/src/{revert.c → libgit2/revert.c} +0 -0
- /data/vendor/libgit2/src/{revparse.c → libgit2/revparse.c} +0 -0
- /data/vendor/libgit2/src/{revwalk.c → libgit2/revwalk.c} +0 -0
- /data/vendor/libgit2/src/{revwalk.h → libgit2/revwalk.h} +0 -0
- /data/vendor/libgit2/src/{settings.h → libgit2/settings.h} +0 -0
- /data/vendor/libgit2/src/{signature.c → libgit2/signature.c} +0 -0
- /data/vendor/libgit2/src/{signature.h → libgit2/signature.h} +0 -0
- /data/vendor/libgit2/src/{stash.c → libgit2/stash.c} +0 -0
- /data/vendor/libgit2/src/{status.c → libgit2/status.c} +0 -0
- /data/vendor/libgit2/src/{status.h → libgit2/status.h} +0 -0
- /data/vendor/libgit2/src/{strarray.c → libgit2/strarray.c} +0 -0
- /data/vendor/libgit2/src/{stream.h → libgit2/stream.h} +0 -0
- /data/vendor/libgit2/src/{streams → libgit2/streams}/mbedtls.c +0 -0
- /data/vendor/libgit2/src/{streams → libgit2/streams}/mbedtls.h +0 -0
- /data/vendor/libgit2/src/{streams → libgit2/streams}/openssl.c +0 -0
- /data/vendor/libgit2/src/{streams → libgit2/streams}/openssl.h +0 -0
- /data/vendor/libgit2/src/{streams → libgit2/streams}/openssl_dynamic.c +0 -0
- /data/vendor/libgit2/src/{streams → libgit2/streams}/openssl_dynamic.h +0 -0
- /data/vendor/libgit2/src/{streams → libgit2/streams}/openssl_legacy.c +0 -0
- /data/vendor/libgit2/src/{streams → libgit2/streams}/openssl_legacy.h +0 -0
- /data/vendor/libgit2/src/{streams → libgit2/streams}/registry.c +0 -0
- /data/vendor/libgit2/src/{streams → libgit2/streams}/registry.h +0 -0
- /data/vendor/libgit2/src/{streams → libgit2/streams}/socket.c +0 -0
- /data/vendor/libgit2/src/{streams → libgit2/streams}/socket.h +0 -0
- /data/vendor/libgit2/src/{streams → libgit2/streams}/stransport.c +0 -0
- /data/vendor/libgit2/src/{streams → libgit2/streams}/stransport.h +0 -0
- /data/vendor/libgit2/src/{streams → libgit2/streams}/tls.c +0 -0
- /data/vendor/libgit2/src/{streams → libgit2/streams}/tls.h +0 -0
- /data/vendor/libgit2/src/{submodule.c → libgit2/submodule.c} +0 -0
- /data/vendor/libgit2/src/{submodule.h → libgit2/submodule.h} +0 -0
- /data/vendor/libgit2/src/{sysdir.c → libgit2/sysdir.c} +0 -0
- /data/vendor/libgit2/src/{sysdir.h → libgit2/sysdir.h} +0 -0
- /data/vendor/libgit2/src/{tag.h → libgit2/tag.h} +0 -0
- /data/vendor/libgit2/src/{threadstate.c → libgit2/threadstate.c} +0 -0
- /data/vendor/libgit2/src/{threadstate.h → libgit2/threadstate.h} +0 -0
- /data/vendor/libgit2/src/{trace.c → libgit2/trace.c} +0 -0
- /data/vendor/libgit2/src/{trace.h → libgit2/trace.h} +0 -0
- /data/vendor/libgit2/src/{trailer.c → libgit2/trailer.c} +0 -0
- /data/vendor/libgit2/src/{transaction.c → libgit2/transaction.c} +0 -0
- /data/vendor/libgit2/src/{transaction.h → libgit2/transaction.h} +0 -0
- /data/vendor/libgit2/src/{transport.c → libgit2/transport.c} +0 -0
- /data/vendor/libgit2/src/{transports → libgit2/transports}/auth.c +0 -0
- /data/vendor/libgit2/src/{transports → libgit2/transports}/auth.h +0 -0
- /data/vendor/libgit2/src/{transports → libgit2/transports}/auth_negotiate.c +0 -0
- /data/vendor/libgit2/src/{transports → libgit2/transports}/auth_negotiate.h +0 -0
- /data/vendor/libgit2/src/{transports → libgit2/transports}/auth_ntlm.c +0 -0
- /data/vendor/libgit2/src/{transports → libgit2/transports}/auth_ntlm.h +0 -0
- /data/vendor/libgit2/src/{transports → libgit2/transports}/credential.c +0 -0
- /data/vendor/libgit2/src/{transports → libgit2/transports}/credential_helpers.c +0 -0
- /data/vendor/libgit2/src/{transports → libgit2/transports}/git.c +0 -0
- /data/vendor/libgit2/src/{transports → libgit2/transports}/http.c +0 -0
- /data/vendor/libgit2/src/{transports → libgit2/transports}/http.h +0 -0
- /data/vendor/libgit2/src/{transports → libgit2/transports}/httpclient.h +0 -0
- /data/vendor/libgit2/src/{transports → libgit2/transports}/local.c +0 -0
- /data/vendor/libgit2/src/{transports → libgit2/transports}/smart.h +0 -0
- /data/vendor/libgit2/src/{transports → libgit2/transports}/smart_pkt.c +0 -0
- /data/vendor/libgit2/src/{transports → libgit2/transports}/smart_protocol.c +0 -0
- /data/vendor/libgit2/src/{transports → libgit2/transports}/ssh.h +0 -0
- /data/vendor/libgit2/src/{transports → libgit2/transports}/winhttp.c +0 -0
- /data/vendor/libgit2/src/{tree-cache.h → libgit2/tree-cache.h} +0 -0
- /data/vendor/libgit2/src/{userdiff.h → libgit2/userdiff.h} +0 -0
- /data/vendor/libgit2/src/{worktree.c → libgit2/worktree.c} +0 -0
- /data/vendor/libgit2/src/{worktree.h → libgit2/worktree.h} +0 -0
- /data/vendor/libgit2/src/{xdiff → libgit2/xdiff}/git-xdiff.h +0 -0
- /data/vendor/libgit2/src/{xdiff → libgit2/xdiff}/xdiff.h +0 -0
- /data/vendor/libgit2/src/{xdiff → libgit2/xdiff}/xdiffi.c +0 -0
- /data/vendor/libgit2/src/{xdiff → libgit2/xdiff}/xdiffi.h +0 -0
- /data/vendor/libgit2/src/{xdiff → libgit2/xdiff}/xemit.c +0 -0
- /data/vendor/libgit2/src/{xdiff → libgit2/xdiff}/xemit.h +0 -0
- /data/vendor/libgit2/src/{xdiff → libgit2/xdiff}/xhistogram.c +0 -0
- /data/vendor/libgit2/src/{xdiff → libgit2/xdiff}/xinclude.h +0 -0
- /data/vendor/libgit2/src/{xdiff → libgit2/xdiff}/xmacros.h +0 -0
- /data/vendor/libgit2/src/{xdiff → libgit2/xdiff}/xmerge.c +0 -0
- /data/vendor/libgit2/src/{xdiff → libgit2/xdiff}/xpatience.c +0 -0
- /data/vendor/libgit2/src/{xdiff → libgit2/xdiff}/xprepare.c +0 -0
- /data/vendor/libgit2/src/{xdiff → libgit2/xdiff}/xprepare.h +0 -0
- /data/vendor/libgit2/src/{xdiff → libgit2/xdiff}/xtypes.h +0 -0
- /data/vendor/libgit2/src/{xdiff → libgit2/xdiff}/xutils.c +0 -0
- /data/vendor/libgit2/src/{xdiff → libgit2/xdiff}/xutils.h +0 -0
- /data/vendor/libgit2/src/{alloc.c → util/alloc.c} +0 -0
- /data/vendor/libgit2/src/{alloc.h → util/alloc.h} +0 -0
- /data/vendor/libgit2/src/{allocators → util/allocators}/failalloc.c +0 -0
- /data/vendor/libgit2/src/{allocators → util/allocators}/stdalloc.c +0 -0
- /data/vendor/libgit2/src/{allocators → util/allocators}/win32_leakcheck.c +0 -0
- /data/vendor/libgit2/src/{bitvec.h → util/bitvec.h} +0 -0
- /data/vendor/libgit2/src/{cc-compat.h → util/cc-compat.h} +0 -0
- /data/vendor/libgit2/src/{date.h → util/date.h} +0 -0
- /data/vendor/libgit2/src/{hash/sha1 → util/hash}/sha1dc/sha1.c +0 -0
- /data/vendor/libgit2/src/{hash/sha1 → util/hash}/sha1dc/sha1.h +0 -0
- /data/vendor/libgit2/src/{hash/sha1 → util/hash}/sha1dc/ubc_check.c +0 -0
- /data/vendor/libgit2/src/{hash/sha1 → util/hash}/sha1dc/ubc_check.h +0 -0
- /data/vendor/libgit2/src/{integer.h → util/integer.h} +0 -0
- /data/vendor/libgit2/src/{khash.h → util/khash.h} +0 -0
- /data/vendor/libgit2/src/{pool.c → util/pool.c} +0 -0
- /data/vendor/libgit2/src/{posix.c → util/posix.c} +0 -0
- /data/vendor/libgit2/src/{pqueue.c → util/pqueue.c} +0 -0
- /data/vendor/libgit2/src/{regexp.c → util/regexp.c} +0 -0
- /data/vendor/libgit2/src/{sortedcache.c → util/sortedcache.c} +0 -0
- /data/vendor/libgit2/src/{str.c → util/str.c} +0 -0
- /data/vendor/libgit2/src/{strmap.c → util/strmap.c} +0 -0
- /data/vendor/libgit2/src/{strnlen.h → util/strnlen.h} +0 -0
- /data/vendor/libgit2/src/{thread.h → util/thread.h} +0 -0
- /data/vendor/libgit2/src/{unix → util/unix}/pthread.h +0 -0
- /data/vendor/libgit2/src/{varint.c → util/varint.c} +0 -0
- /data/vendor/libgit2/src/{vector.c → util/vector.c} +0 -0
- /data/vendor/libgit2/src/{wildmatch.c → util/wildmatch.c} +0 -0
- /data/vendor/libgit2/src/{win32 → util/win32}/dir.c +0 -0
- /data/vendor/libgit2/src/{win32 → util/win32}/error.c +0 -0
- /data/vendor/libgit2/src/{win32 → util/win32}/findfile.c +0 -0
- /data/vendor/libgit2/src/{win32 → util/win32}/mingw-compat.h +0 -0
- /data/vendor/libgit2/src/{win32 → util/win32}/msvc-compat.h +0 -0
- /data/vendor/libgit2/src/{win32 → util/win32}/path_w32.c +0 -0
- /data/vendor/libgit2/src/{win32 → util/win32}/reparse.h +0 -0
- /data/vendor/libgit2/src/{win32 → util/win32}/thread.c +0 -0
- /data/vendor/libgit2/src/{win32 → util/win32}/utf-conv.c +0 -0
- /data/vendor/libgit2/src/{win32 → util/win32}/version.h +0 -0
- /data/vendor/libgit2/src/{win32 → util/win32}/w32_buffer.c +0 -0
- /data/vendor/libgit2/src/{win32 → util/win32}/w32_common.h +0 -0
- /data/vendor/libgit2/src/{win32 → util/win32}/w32_leakcheck.c +0 -0
- /data/vendor/libgit2/src/{win32 → util/win32}/w32_util.c +0 -0
- /data/vendor/libgit2/src/{win32 → util/win32}/win32-compat.h +0 -0
- /data/vendor/libgit2/src/{zstream.c → util/zstream.c} +0 -0
@@ -0,0 +1,549 @@
|
|
1
|
+
/*
|
2
|
+
* Copyright (C) the libgit2 contributors. All rights reserved.
|
3
|
+
*
|
4
|
+
* This file is part of libgit2, distributed under the GNU GPL v2 with
|
5
|
+
* a Linking Exception. For full terms see the included COPYING file.
|
6
|
+
*/
|
7
|
+
|
8
|
+
#include "win32.h"
|
9
|
+
|
10
|
+
#include "runtime.h"
|
11
|
+
|
12
|
+
#include <wincrypt.h>
|
13
|
+
#include <strsafe.h>
|
14
|
+
|
15
|
+
#define GIT_HASH_CNG_DLL_NAME "bcrypt.dll"
|
16
|
+
|
17
|
+
/* BCRYPT_SHA1_ALGORITHM */
|
18
|
+
#define GIT_HASH_CNG_SHA1_TYPE L"SHA1"
|
19
|
+
#define GIT_HASH_CNG_SHA256_TYPE L"SHA256"
|
20
|
+
|
21
|
+
/* BCRYPT_OBJECT_LENGTH */
|
22
|
+
#define GIT_HASH_CNG_HASH_OBJECT_LEN L"ObjectLength"
|
23
|
+
|
24
|
+
/* BCRYPT_HASH_REUSEABLE_FLAGS */
|
25
|
+
#define GIT_HASH_CNG_HASH_REUSABLE 0x00000020
|
26
|
+
|
27
|
+
/* Definitions */
|
28
|
+
|
29
|
+
/* CryptoAPI is available for hashing on Windows XP and newer. */
|
30
|
+
struct cryptoapi_provider {
|
31
|
+
HCRYPTPROV handle;
|
32
|
+
};
|
33
|
+
|
34
|
+
/*
|
35
|
+
* CNG (bcrypt.dll) is significantly more performant than CryptoAPI and is
|
36
|
+
* preferred, however it is only available on Windows 2008 and newer and
|
37
|
+
* must therefore be dynamically loaded, and we must inline constants that
|
38
|
+
* would not exist when building in pre-Windows 2008 environments.
|
39
|
+
*/
|
40
|
+
|
41
|
+
/* Function declarations for CNG */
|
42
|
+
typedef NTSTATUS (WINAPI *cng_open_algorithm_provider_fn)(
|
43
|
+
HANDLE /* BCRYPT_ALG_HANDLE */ *phAlgorithm,
|
44
|
+
LPCWSTR pszAlgId,
|
45
|
+
LPCWSTR pszImplementation,
|
46
|
+
DWORD dwFlags);
|
47
|
+
|
48
|
+
typedef NTSTATUS (WINAPI *cng_get_property_fn)(
|
49
|
+
HANDLE /* BCRYPT_HANDLE */ hObject,
|
50
|
+
LPCWSTR pszProperty,
|
51
|
+
PUCHAR pbOutput,
|
52
|
+
ULONG cbOutput,
|
53
|
+
ULONG *pcbResult,
|
54
|
+
ULONG dwFlags);
|
55
|
+
|
56
|
+
typedef NTSTATUS (WINAPI *cng_create_hash_fn)(
|
57
|
+
HANDLE /* BCRYPT_ALG_HANDLE */ hAlgorithm,
|
58
|
+
HANDLE /* BCRYPT_HASH_HANDLE */ *phHash,
|
59
|
+
PUCHAR pbHashObject, ULONG cbHashObject,
|
60
|
+
PUCHAR pbSecret,
|
61
|
+
ULONG cbSecret,
|
62
|
+
ULONG dwFlags);
|
63
|
+
|
64
|
+
typedef NTSTATUS (WINAPI *cng_finish_hash_fn)(
|
65
|
+
HANDLE /* BCRYPT_HASH_HANDLE */ hHash,
|
66
|
+
PUCHAR pbOutput,
|
67
|
+
ULONG cbOutput,
|
68
|
+
ULONG dwFlags);
|
69
|
+
|
70
|
+
typedef NTSTATUS (WINAPI *cng_hash_data_fn)(
|
71
|
+
HANDLE /* BCRYPT_HASH_HANDLE */ hHash,
|
72
|
+
PUCHAR pbInput,
|
73
|
+
ULONG cbInput,
|
74
|
+
ULONG dwFlags);
|
75
|
+
|
76
|
+
typedef NTSTATUS (WINAPI *cng_destroy_hash_fn)(
|
77
|
+
HANDLE /* BCRYPT_HASH_HANDLE */ hHash);
|
78
|
+
|
79
|
+
typedef NTSTATUS (WINAPI *cng_close_algorithm_provider_fn)(
|
80
|
+
HANDLE /* BCRYPT_ALG_HANDLE */ hAlgorithm,
|
81
|
+
ULONG dwFlags);
|
82
|
+
|
83
|
+
struct cng_provider {
|
84
|
+
/* DLL for CNG */
|
85
|
+
HINSTANCE dll;
|
86
|
+
|
87
|
+
/* Function pointers for CNG */
|
88
|
+
cng_open_algorithm_provider_fn open_algorithm_provider;
|
89
|
+
cng_get_property_fn get_property;
|
90
|
+
cng_create_hash_fn create_hash;
|
91
|
+
cng_finish_hash_fn finish_hash;
|
92
|
+
cng_hash_data_fn hash_data;
|
93
|
+
cng_destroy_hash_fn destroy_hash;
|
94
|
+
cng_close_algorithm_provider_fn close_algorithm_provider;
|
95
|
+
|
96
|
+
HANDLE /* BCRYPT_ALG_HANDLE */ sha1_handle;
|
97
|
+
DWORD sha1_object_size;
|
98
|
+
|
99
|
+
HANDLE /* BCRYPT_ALG_HANDLE */ sha256_handle;
|
100
|
+
DWORD sha256_object_size;
|
101
|
+
};
|
102
|
+
|
103
|
+
typedef struct {
|
104
|
+
git_hash_win32_provider_t type;
|
105
|
+
|
106
|
+
union {
|
107
|
+
struct cryptoapi_provider cryptoapi;
|
108
|
+
struct cng_provider cng;
|
109
|
+
} provider;
|
110
|
+
} hash_win32_provider;
|
111
|
+
|
112
|
+
/* Hash provider definition */
|
113
|
+
|
114
|
+
static hash_win32_provider hash_provider = {0};
|
115
|
+
|
116
|
+
/* Hash initialization */
|
117
|
+
|
118
|
+
/* Initialize CNG, if available */
|
119
|
+
GIT_INLINE(int) cng_provider_init(void)
|
120
|
+
{
|
121
|
+
char dll_path[MAX_PATH];
|
122
|
+
DWORD dll_path_len, size_len;
|
123
|
+
|
124
|
+
/* Only use CNG on Windows 2008 / Vista SP1 or better (Windows 6.0 SP1) */
|
125
|
+
if (!git_has_win32_version(6, 0, 1)) {
|
126
|
+
git_error_set(GIT_ERROR_SHA, "CryptoNG is not supported on this platform");
|
127
|
+
return -1;
|
128
|
+
}
|
129
|
+
|
130
|
+
/* Load bcrypt.dll explicitly from the system directory */
|
131
|
+
if ((dll_path_len = GetSystemDirectory(dll_path, MAX_PATH)) == 0 ||
|
132
|
+
dll_path_len > MAX_PATH ||
|
133
|
+
StringCchCat(dll_path, MAX_PATH, "\\") < 0 ||
|
134
|
+
StringCchCat(dll_path, MAX_PATH, GIT_HASH_CNG_DLL_NAME) < 0 ||
|
135
|
+
(hash_provider.provider.cng.dll = LoadLibrary(dll_path)) == NULL) {
|
136
|
+
git_error_set(GIT_ERROR_SHA, "CryptoNG library could not be loaded");
|
137
|
+
return -1;
|
138
|
+
}
|
139
|
+
|
140
|
+
/* Load the function addresses */
|
141
|
+
if ((hash_provider.provider.cng.open_algorithm_provider = (cng_open_algorithm_provider_fn)((void *)GetProcAddress(hash_provider.provider.cng.dll, "BCryptOpenAlgorithmProvider"))) == NULL ||
|
142
|
+
(hash_provider.provider.cng.get_property = (cng_get_property_fn)((void *)GetProcAddress(hash_provider.provider.cng.dll, "BCryptGetProperty"))) == NULL ||
|
143
|
+
(hash_provider.provider.cng.create_hash = (cng_create_hash_fn)((void *)GetProcAddress(hash_provider.provider.cng.dll, "BCryptCreateHash"))) == NULL ||
|
144
|
+
(hash_provider.provider.cng.finish_hash = (cng_finish_hash_fn)((void *)GetProcAddress(hash_provider.provider.cng.dll, "BCryptFinishHash"))) == NULL ||
|
145
|
+
(hash_provider.provider.cng.hash_data = (cng_hash_data_fn)((void *)GetProcAddress(hash_provider.provider.cng.dll, "BCryptHashData"))) == NULL ||
|
146
|
+
(hash_provider.provider.cng.destroy_hash = (cng_destroy_hash_fn)((void *)GetProcAddress(hash_provider.provider.cng.dll, "BCryptDestroyHash"))) == NULL ||
|
147
|
+
(hash_provider.provider.cng.close_algorithm_provider = (cng_close_algorithm_provider_fn)((void *)GetProcAddress(hash_provider.provider.cng.dll, "BCryptCloseAlgorithmProvider"))) == NULL) {
|
148
|
+
FreeLibrary(hash_provider.provider.cng.dll);
|
149
|
+
|
150
|
+
git_error_set(GIT_ERROR_OS, "CryptoNG functions could not be loaded");
|
151
|
+
return -1;
|
152
|
+
}
|
153
|
+
|
154
|
+
/* Load the SHA1 algorithm */
|
155
|
+
if (hash_provider.provider.cng.open_algorithm_provider(&hash_provider.provider.cng.sha1_handle, GIT_HASH_CNG_SHA1_TYPE, NULL, GIT_HASH_CNG_HASH_REUSABLE) < 0 ||
|
156
|
+
hash_provider.provider.cng.get_property(hash_provider.provider.cng.sha1_handle, GIT_HASH_CNG_HASH_OBJECT_LEN, (PBYTE)&hash_provider.provider.cng.sha1_object_size, sizeof(DWORD), &size_len, 0) < 0) {
|
157
|
+
git_error_set(GIT_ERROR_OS, "algorithm provider could not be initialized");
|
158
|
+
goto on_error;
|
159
|
+
}
|
160
|
+
|
161
|
+
/* Load the SHA256 algorithm */
|
162
|
+
if (hash_provider.provider.cng.open_algorithm_provider(&hash_provider.provider.cng.sha256_handle, GIT_HASH_CNG_SHA256_TYPE, NULL, GIT_HASH_CNG_HASH_REUSABLE) < 0 ||
|
163
|
+
hash_provider.provider.cng.get_property(hash_provider.provider.cng.sha256_handle, GIT_HASH_CNG_HASH_OBJECT_LEN, (PBYTE)&hash_provider.provider.cng.sha256_object_size, sizeof(DWORD), &size_len, 0) < 0) {
|
164
|
+
git_error_set(GIT_ERROR_OS, "algorithm provider could not be initialized");
|
165
|
+
goto on_error;
|
166
|
+
}
|
167
|
+
|
168
|
+
hash_provider.type = GIT_HASH_WIN32_CNG;
|
169
|
+
return 0;
|
170
|
+
|
171
|
+
on_error:
|
172
|
+
if (hash_provider.provider.cng.sha1_handle)
|
173
|
+
hash_provider.provider.cng.close_algorithm_provider(hash_provider.provider.cng.sha1_handle, 0);
|
174
|
+
|
175
|
+
if (hash_provider.provider.cng.sha256_handle)
|
176
|
+
hash_provider.provider.cng.close_algorithm_provider(hash_provider.provider.cng.sha256_handle, 0);
|
177
|
+
|
178
|
+
if (hash_provider.provider.cng.dll)
|
179
|
+
FreeLibrary(hash_provider.provider.cng.dll);
|
180
|
+
|
181
|
+
return -1;
|
182
|
+
}
|
183
|
+
|
184
|
+
GIT_INLINE(void) cng_provider_shutdown(void)
|
185
|
+
{
|
186
|
+
if (hash_provider.type == GIT_HASH_WIN32_INVALID)
|
187
|
+
return;
|
188
|
+
|
189
|
+
hash_provider.provider.cng.close_algorithm_provider(hash_provider.provider.cng.sha1_handle, 0);
|
190
|
+
hash_provider.provider.cng.close_algorithm_provider(hash_provider.provider.cng.sha256_handle, 0);
|
191
|
+
FreeLibrary(hash_provider.provider.cng.dll);
|
192
|
+
|
193
|
+
hash_provider.type = GIT_HASH_WIN32_INVALID;
|
194
|
+
}
|
195
|
+
|
196
|
+
/* Initialize CryptoAPI */
|
197
|
+
GIT_INLINE(int) cryptoapi_provider_init(void)
|
198
|
+
{
|
199
|
+
if (!CryptAcquireContext(&hash_provider.provider.cryptoapi.handle, NULL, 0, PROV_RSA_AES, CRYPT_VERIFYCONTEXT)) {
|
200
|
+
git_error_set(GIT_ERROR_OS, "legacy hash context could not be started");
|
201
|
+
return -1;
|
202
|
+
}
|
203
|
+
|
204
|
+
hash_provider.type = GIT_HASH_WIN32_CRYPTOAPI;
|
205
|
+
return 0;
|
206
|
+
}
|
207
|
+
|
208
|
+
GIT_INLINE(void) cryptoapi_provider_shutdown(void)
|
209
|
+
{
|
210
|
+
if (hash_provider.type == GIT_HASH_WIN32_INVALID)
|
211
|
+
return;
|
212
|
+
|
213
|
+
CryptReleaseContext(hash_provider.provider.cryptoapi.handle, 0);
|
214
|
+
|
215
|
+
hash_provider.type = GIT_HASH_WIN32_INVALID;
|
216
|
+
}
|
217
|
+
|
218
|
+
static void hash_provider_shutdown(void)
|
219
|
+
{
|
220
|
+
if (hash_provider.type == GIT_HASH_WIN32_CNG)
|
221
|
+
cng_provider_shutdown();
|
222
|
+
else if (hash_provider.type == GIT_HASH_WIN32_CRYPTOAPI)
|
223
|
+
cryptoapi_provider_shutdown();
|
224
|
+
}
|
225
|
+
|
226
|
+
static int hash_provider_init(void)
|
227
|
+
{
|
228
|
+
int error = 0;
|
229
|
+
|
230
|
+
if (hash_provider.type != GIT_HASH_WIN32_INVALID)
|
231
|
+
return 0;
|
232
|
+
|
233
|
+
if ((error = cng_provider_init()) < 0)
|
234
|
+
error = cryptoapi_provider_init();
|
235
|
+
|
236
|
+
if (!error)
|
237
|
+
error = git_runtime_shutdown_register(hash_provider_shutdown);
|
238
|
+
|
239
|
+
return error;
|
240
|
+
}
|
241
|
+
|
242
|
+
git_hash_win32_provider_t git_hash_win32_provider(void)
|
243
|
+
{
|
244
|
+
return hash_provider.type;
|
245
|
+
}
|
246
|
+
|
247
|
+
int git_hash_win32_set_provider(git_hash_win32_provider_t provider)
|
248
|
+
{
|
249
|
+
if (provider == hash_provider.type)
|
250
|
+
return 0;
|
251
|
+
|
252
|
+
hash_provider_shutdown();
|
253
|
+
|
254
|
+
if (provider == GIT_HASH_WIN32_CNG)
|
255
|
+
return cng_provider_init();
|
256
|
+
else if (provider == GIT_HASH_WIN32_CRYPTOAPI)
|
257
|
+
return cryptoapi_provider_init();
|
258
|
+
|
259
|
+
git_error_set(GIT_ERROR_SHA, "unsupported win32 provider");
|
260
|
+
return -1;
|
261
|
+
}
|
262
|
+
|
263
|
+
/* CryptoAPI: available in Windows XP and newer */
|
264
|
+
|
265
|
+
GIT_INLINE(int) hash_cryptoapi_init(git_hash_win32_ctx *ctx)
|
266
|
+
{
|
267
|
+
if (ctx->ctx.cryptoapi.valid)
|
268
|
+
CryptDestroyHash(ctx->ctx.cryptoapi.hash_handle);
|
269
|
+
|
270
|
+
if (!CryptCreateHash(hash_provider.provider.cryptoapi.handle, ctx->algorithm, 0, 0, &ctx->ctx.cryptoapi.hash_handle)) {
|
271
|
+
ctx->ctx.cryptoapi.valid = 0;
|
272
|
+
git_error_set(GIT_ERROR_OS, "legacy hash implementation could not be created");
|
273
|
+
return -1;
|
274
|
+
}
|
275
|
+
|
276
|
+
ctx->ctx.cryptoapi.valid = 1;
|
277
|
+
return 0;
|
278
|
+
}
|
279
|
+
|
280
|
+
GIT_INLINE(int) hash_cryptoapi_update(git_hash_win32_ctx *ctx, const void *_data, size_t len)
|
281
|
+
{
|
282
|
+
const BYTE *data = (BYTE *)_data;
|
283
|
+
|
284
|
+
GIT_ASSERT(ctx->ctx.cryptoapi.valid);
|
285
|
+
|
286
|
+
while (len > 0) {
|
287
|
+
DWORD chunk = (len > MAXDWORD) ? MAXDWORD : (DWORD)len;
|
288
|
+
|
289
|
+
if (!CryptHashData(ctx->ctx.cryptoapi.hash_handle, data, chunk, 0)) {
|
290
|
+
git_error_set(GIT_ERROR_OS, "legacy hash data could not be updated");
|
291
|
+
return -1;
|
292
|
+
}
|
293
|
+
|
294
|
+
data += chunk;
|
295
|
+
len -= chunk;
|
296
|
+
}
|
297
|
+
|
298
|
+
return 0;
|
299
|
+
}
|
300
|
+
|
301
|
+
GIT_INLINE(int) hash_cryptoapi_final(unsigned char *out, git_hash_win32_ctx *ctx)
|
302
|
+
{
|
303
|
+
DWORD len = ctx->algorithm == CALG_SHA_256 ? GIT_HASH_SHA256_SIZE : GIT_HASH_SHA1_SIZE;
|
304
|
+
int error = 0;
|
305
|
+
|
306
|
+
GIT_ASSERT(ctx->ctx.cryptoapi.valid);
|
307
|
+
|
308
|
+
if (!CryptGetHashParam(ctx->ctx.cryptoapi.hash_handle, HP_HASHVAL, out, &len, 0)) {
|
309
|
+
git_error_set(GIT_ERROR_OS, "legacy hash data could not be finished");
|
310
|
+
error = -1;
|
311
|
+
}
|
312
|
+
|
313
|
+
CryptDestroyHash(ctx->ctx.cryptoapi.hash_handle);
|
314
|
+
ctx->ctx.cryptoapi.valid = 0;
|
315
|
+
|
316
|
+
return error;
|
317
|
+
}
|
318
|
+
|
319
|
+
GIT_INLINE(void) hash_ctx_cryptoapi_cleanup(git_hash_win32_ctx *ctx)
|
320
|
+
{
|
321
|
+
if (ctx->ctx.cryptoapi.valid)
|
322
|
+
CryptDestroyHash(ctx->ctx.cryptoapi.hash_handle);
|
323
|
+
}
|
324
|
+
|
325
|
+
GIT_INLINE(int) hash_sha1_cryptoapi_ctx_init_init(git_hash_win32_ctx *ctx)
|
326
|
+
{
|
327
|
+
ctx->algorithm = CALG_SHA1;
|
328
|
+
return hash_cryptoapi_init(ctx);
|
329
|
+
}
|
330
|
+
|
331
|
+
GIT_INLINE(int) hash_sha256_cryptoapi_ctx_init(git_hash_win32_ctx *ctx)
|
332
|
+
{
|
333
|
+
ctx->algorithm = CALG_SHA_256;
|
334
|
+
return hash_cryptoapi_init(ctx);
|
335
|
+
}
|
336
|
+
|
337
|
+
/* CNG: Available in Windows Server 2008 and newer */
|
338
|
+
|
339
|
+
GIT_INLINE(int) hash_sha1_cng_ctx_init(git_hash_win32_ctx *ctx)
|
340
|
+
{
|
341
|
+
if ((ctx->ctx.cng.hash_object = git__malloc(hash_provider.provider.cng.sha1_object_size)) == NULL)
|
342
|
+
return -1;
|
343
|
+
|
344
|
+
if (hash_provider.provider.cng.create_hash(hash_provider.provider.cng.sha1_handle, &ctx->ctx.cng.hash_handle, ctx->ctx.cng.hash_object, hash_provider.provider.cng.sha1_object_size, NULL, 0, 0) < 0) {
|
345
|
+
git__free(ctx->ctx.cng.hash_object);
|
346
|
+
|
347
|
+
git_error_set(GIT_ERROR_OS, "sha1 implementation could not be created");
|
348
|
+
return -1;
|
349
|
+
}
|
350
|
+
|
351
|
+
ctx->algorithm = CALG_SHA1;
|
352
|
+
return 0;
|
353
|
+
}
|
354
|
+
|
355
|
+
GIT_INLINE(int) hash_sha256_cng_ctx_init(git_hash_win32_ctx *ctx)
|
356
|
+
{
|
357
|
+
if ((ctx->ctx.cng.hash_object = git__malloc(hash_provider.provider.cng.sha256_object_size)) == NULL)
|
358
|
+
return -1;
|
359
|
+
|
360
|
+
if (hash_provider.provider.cng.create_hash(hash_provider.provider.cng.sha256_handle, &ctx->ctx.cng.hash_handle, ctx->ctx.cng.hash_object, hash_provider.provider.cng.sha256_object_size, NULL, 0, 0) < 0) {
|
361
|
+
git__free(ctx->ctx.cng.hash_object);
|
362
|
+
|
363
|
+
git_error_set(GIT_ERROR_OS, "sha256 implementation could not be created");
|
364
|
+
return -1;
|
365
|
+
}
|
366
|
+
|
367
|
+
ctx->algorithm = CALG_SHA_256;
|
368
|
+
return 0;
|
369
|
+
}
|
370
|
+
|
371
|
+
GIT_INLINE(int) hash_cng_init(git_hash_win32_ctx *ctx)
|
372
|
+
{
|
373
|
+
BYTE hash[GIT_HASH_SHA256_SIZE];
|
374
|
+
ULONG size = ctx->algorithm == CALG_SHA_256 ? GIT_HASH_SHA256_SIZE : GIT_HASH_SHA1_SIZE;
|
375
|
+
|
376
|
+
if (!ctx->ctx.cng.updated)
|
377
|
+
return 0;
|
378
|
+
|
379
|
+
/* CNG needs to be finished to restart */
|
380
|
+
if (hash_provider.provider.cng.finish_hash(ctx->ctx.cng.hash_handle, hash, size, 0) < 0) {
|
381
|
+
git_error_set(GIT_ERROR_OS, "hash implementation could not be finished");
|
382
|
+
return -1;
|
383
|
+
}
|
384
|
+
|
385
|
+
ctx->ctx.cng.updated = 0;
|
386
|
+
|
387
|
+
return 0;
|
388
|
+
}
|
389
|
+
|
390
|
+
GIT_INLINE(int) hash_cng_update(git_hash_win32_ctx *ctx, const void *_data, size_t len)
|
391
|
+
{
|
392
|
+
PBYTE data = (PBYTE)_data;
|
393
|
+
|
394
|
+
while (len > 0) {
|
395
|
+
ULONG chunk = (len > ULONG_MAX) ? ULONG_MAX : (ULONG)len;
|
396
|
+
|
397
|
+
if (hash_provider.provider.cng.hash_data(ctx->ctx.cng.hash_handle, data, chunk, 0) < 0) {
|
398
|
+
git_error_set(GIT_ERROR_OS, "hash could not be updated");
|
399
|
+
return -1;
|
400
|
+
}
|
401
|
+
|
402
|
+
data += chunk;
|
403
|
+
len -= chunk;
|
404
|
+
}
|
405
|
+
|
406
|
+
return 0;
|
407
|
+
}
|
408
|
+
|
409
|
+
GIT_INLINE(int) hash_cng_final(unsigned char *out, git_hash_win32_ctx *ctx)
|
410
|
+
{
|
411
|
+
ULONG size = ctx->algorithm == CALG_SHA_256 ? GIT_HASH_SHA256_SIZE : GIT_HASH_SHA1_SIZE;
|
412
|
+
|
413
|
+
if (hash_provider.provider.cng.finish_hash(ctx->ctx.cng.hash_handle, out, size, 0) < 0) {
|
414
|
+
git_error_set(GIT_ERROR_OS, "hash could not be finished");
|
415
|
+
return -1;
|
416
|
+
}
|
417
|
+
|
418
|
+
ctx->ctx.cng.updated = 0;
|
419
|
+
|
420
|
+
return 0;
|
421
|
+
}
|
422
|
+
|
423
|
+
GIT_INLINE(void) hash_ctx_cng_cleanup(git_hash_win32_ctx *ctx)
|
424
|
+
{
|
425
|
+
hash_provider.provider.cng.destroy_hash(ctx->ctx.cng.hash_handle);
|
426
|
+
git__free(ctx->ctx.cng.hash_object);
|
427
|
+
}
|
428
|
+
|
429
|
+
/* Indirection between CryptoAPI and CNG */
|
430
|
+
|
431
|
+
GIT_INLINE(int) hash_sha1_win32_ctx_init(git_hash_win32_ctx *ctx)
|
432
|
+
{
|
433
|
+
GIT_ASSERT_ARG(hash_provider.type);
|
434
|
+
|
435
|
+
memset(ctx, 0x0, sizeof(git_hash_win32_ctx));
|
436
|
+
return (hash_provider.type == GIT_HASH_WIN32_CNG) ? hash_sha1_cng_ctx_init(ctx) : hash_sha1_cryptoapi_ctx_init_init(ctx);
|
437
|
+
}
|
438
|
+
|
439
|
+
GIT_INLINE(int) hash_sha256_win32_ctx_init(git_hash_win32_ctx *ctx)
|
440
|
+
{
|
441
|
+
GIT_ASSERT_ARG(hash_provider.type);
|
442
|
+
|
443
|
+
memset(ctx, 0x0, sizeof(git_hash_win32_ctx));
|
444
|
+
return (hash_provider.type == GIT_HASH_WIN32_CNG) ? hash_sha256_cng_ctx_init(ctx) : hash_sha256_cryptoapi_ctx_init(ctx);
|
445
|
+
}
|
446
|
+
|
447
|
+
GIT_INLINE(int) hash_win32_init(git_hash_win32_ctx *ctx)
|
448
|
+
{
|
449
|
+
return (hash_provider.type == GIT_HASH_WIN32_CNG) ? hash_cng_init(ctx) : hash_cryptoapi_init(ctx);
|
450
|
+
}
|
451
|
+
|
452
|
+
GIT_INLINE(int) hash_win32_update(git_hash_win32_ctx *ctx, const void *data, size_t len)
|
453
|
+
{
|
454
|
+
return (hash_provider.type == GIT_HASH_WIN32_CNG) ? hash_cng_update(ctx, data, len) : hash_cryptoapi_update(ctx, data, len);
|
455
|
+
}
|
456
|
+
|
457
|
+
GIT_INLINE(int) hash_win32_final(unsigned char *out, git_hash_win32_ctx *ctx)
|
458
|
+
{
|
459
|
+
GIT_ASSERT_ARG(ctx);
|
460
|
+
return (hash_provider.type == GIT_HASH_WIN32_CNG) ? hash_cng_final(out, ctx) : hash_cryptoapi_final(out, ctx);
|
461
|
+
}
|
462
|
+
|
463
|
+
GIT_INLINE(void) hash_win32_cleanup(git_hash_win32_ctx *ctx)
|
464
|
+
{
|
465
|
+
if (hash_provider.type == GIT_HASH_WIN32_CNG)
|
466
|
+
hash_ctx_cng_cleanup(ctx);
|
467
|
+
else if(hash_provider.type == GIT_HASH_WIN32_CRYPTOAPI)
|
468
|
+
hash_ctx_cryptoapi_cleanup(ctx);
|
469
|
+
}
|
470
|
+
|
471
|
+
#ifdef GIT_SHA1_WIN32
|
472
|
+
|
473
|
+
int git_hash_sha1_global_init(void)
|
474
|
+
{
|
475
|
+
return hash_provider_init();
|
476
|
+
}
|
477
|
+
|
478
|
+
int git_hash_sha1_ctx_init(git_hash_sha1_ctx *ctx)
|
479
|
+
{
|
480
|
+
GIT_ASSERT_ARG(ctx);
|
481
|
+
return hash_sha1_win32_ctx_init(&ctx->win32);
|
482
|
+
}
|
483
|
+
|
484
|
+
int git_hash_sha1_init(git_hash_sha1_ctx *ctx)
|
485
|
+
{
|
486
|
+
GIT_ASSERT_ARG(ctx);
|
487
|
+
return hash_win32_init(&ctx->win32);
|
488
|
+
}
|
489
|
+
|
490
|
+
int git_hash_sha1_update(git_hash_sha1_ctx *ctx, const void *data, size_t len)
|
491
|
+
{
|
492
|
+
GIT_ASSERT_ARG(ctx);
|
493
|
+
return hash_win32_update(&ctx->win32, data, len);
|
494
|
+
}
|
495
|
+
|
496
|
+
int git_hash_sha1_final(unsigned char *out, git_hash_sha1_ctx *ctx)
|
497
|
+
{
|
498
|
+
GIT_ASSERT_ARG(ctx);
|
499
|
+
return hash_win32_final(out, &ctx->win32);
|
500
|
+
}
|
501
|
+
|
502
|
+
void git_hash_sha1_ctx_cleanup(git_hash_sha1_ctx *ctx)
|
503
|
+
{
|
504
|
+
if (!ctx)
|
505
|
+
return;
|
506
|
+
hash_win32_cleanup(&ctx->win32);
|
507
|
+
}
|
508
|
+
|
509
|
+
#endif
|
510
|
+
|
511
|
+
#ifdef GIT_SHA256_WIN32
|
512
|
+
|
513
|
+
int git_hash_sha256_global_init(void)
|
514
|
+
{
|
515
|
+
return hash_provider_init();
|
516
|
+
}
|
517
|
+
|
518
|
+
int git_hash_sha256_ctx_init(git_hash_sha256_ctx *ctx)
|
519
|
+
{
|
520
|
+
GIT_ASSERT_ARG(ctx);
|
521
|
+
return hash_sha256_win32_ctx_init(&ctx->win32);
|
522
|
+
}
|
523
|
+
|
524
|
+
int git_hash_sha256_init(git_hash_sha256_ctx *ctx)
|
525
|
+
{
|
526
|
+
GIT_ASSERT_ARG(ctx);
|
527
|
+
return hash_win32_init(&ctx->win32);
|
528
|
+
}
|
529
|
+
|
530
|
+
int git_hash_sha256_update(git_hash_sha256_ctx *ctx, const void *data, size_t len)
|
531
|
+
{
|
532
|
+
GIT_ASSERT_ARG(ctx);
|
533
|
+
return hash_win32_update(&ctx->win32, data, len);
|
534
|
+
}
|
535
|
+
|
536
|
+
int git_hash_sha256_final(unsigned char *out, git_hash_sha256_ctx *ctx)
|
537
|
+
{
|
538
|
+
GIT_ASSERT_ARG(ctx);
|
539
|
+
return hash_win32_final(out, &ctx->win32);
|
540
|
+
}
|
541
|
+
|
542
|
+
void git_hash_sha256_ctx_cleanup(git_hash_sha256_ctx *ctx)
|
543
|
+
{
|
544
|
+
if (!ctx)
|
545
|
+
return;
|
546
|
+
hash_win32_cleanup(&ctx->win32);
|
547
|
+
}
|
548
|
+
|
549
|
+
#endif
|
@@ -0,0 +1,60 @@
|
|
1
|
+
/*
|
2
|
+
* Copyright (C) the libgit2 contributors. All rights reserved.
|
3
|
+
*
|
4
|
+
* This file is part of libgit2, distributed under the GNU GPL v2 with
|
5
|
+
* a Linking Exception. For full terms see the included COPYING file.
|
6
|
+
*/
|
7
|
+
|
8
|
+
#ifndef INCLUDE_hash_win32_h__
|
9
|
+
#define INCLUDE_hash_win32_h__
|
10
|
+
|
11
|
+
#include "hash/sha.h"
|
12
|
+
|
13
|
+
#include <wincrypt.h>
|
14
|
+
|
15
|
+
typedef enum {
|
16
|
+
GIT_HASH_WIN32_INVALID = 0,
|
17
|
+
GIT_HASH_WIN32_CRYPTOAPI,
|
18
|
+
GIT_HASH_WIN32_CNG
|
19
|
+
} git_hash_win32_provider_t;
|
20
|
+
|
21
|
+
struct git_hash_win32_cryptoapi_ctx {
|
22
|
+
bool valid;
|
23
|
+
HCRYPTHASH hash_handle;
|
24
|
+
};
|
25
|
+
|
26
|
+
struct git_hash_win32_cng_ctx {
|
27
|
+
bool updated;
|
28
|
+
HANDLE /* BCRYPT_HASH_HANDLE */ hash_handle;
|
29
|
+
PBYTE hash_object;
|
30
|
+
};
|
31
|
+
|
32
|
+
typedef struct {
|
33
|
+
ALG_ID algorithm;
|
34
|
+
|
35
|
+
union {
|
36
|
+
struct git_hash_win32_cryptoapi_ctx cryptoapi;
|
37
|
+
struct git_hash_win32_cng_ctx cng;
|
38
|
+
} ctx;
|
39
|
+
} git_hash_win32_ctx;
|
40
|
+
|
41
|
+
/*
|
42
|
+
* Gets/sets the current hash provider (cng or cryptoapi). This is only
|
43
|
+
* for testing purposes.
|
44
|
+
*/
|
45
|
+
git_hash_win32_provider_t git_hash_win32_provider(void);
|
46
|
+
int git_hash_win32_set_provider(git_hash_win32_provider_t provider);
|
47
|
+
|
48
|
+
#ifdef GIT_SHA1_WIN32
|
49
|
+
struct git_hash_sha1_ctx {
|
50
|
+
git_hash_win32_ctx win32;
|
51
|
+
};
|
52
|
+
#endif
|
53
|
+
|
54
|
+
#ifdef GIT_SHA256_WIN32
|
55
|
+
struct git_hash_sha256_ctx {
|
56
|
+
git_hash_win32_ctx win32;
|
57
|
+
};
|
58
|
+
#endif
|
59
|
+
|
60
|
+
#endif
|
@@ -9,7 +9,11 @@
|
|
9
9
|
|
10
10
|
int git_hash_global_init(void)
|
11
11
|
{
|
12
|
-
|
12
|
+
if (git_hash_sha1_global_init() < 0 ||
|
13
|
+
git_hash_sha256_global_init() < 0)
|
14
|
+
return -1;
|
15
|
+
|
16
|
+
return 0;
|
13
17
|
}
|
14
18
|
|
15
19
|
int git_hash_ctx_init(git_hash_ctx *ctx, git_hash_algorithm_t algorithm)
|
@@ -20,6 +24,9 @@ int git_hash_ctx_init(git_hash_ctx *ctx, git_hash_algorithm_t algorithm)
|
|
20
24
|
case GIT_HASH_ALGORITHM_SHA1:
|
21
25
|
error = git_hash_sha1_ctx_init(&ctx->ctx.sha1);
|
22
26
|
break;
|
27
|
+
case GIT_HASH_ALGORITHM_SHA256:
|
28
|
+
error = git_hash_sha256_ctx_init(&ctx->ctx.sha256);
|
29
|
+
break;
|
23
30
|
default:
|
24
31
|
git_error_set(GIT_ERROR_INTERNAL, "unknown hash algorithm");
|
25
32
|
error = -1;
|
@@ -35,6 +42,9 @@ void git_hash_ctx_cleanup(git_hash_ctx *ctx)
|
|
35
42
|
case GIT_HASH_ALGORITHM_SHA1:
|
36
43
|
git_hash_sha1_ctx_cleanup(&ctx->ctx.sha1);
|
37
44
|
return;
|
45
|
+
case GIT_HASH_ALGORITHM_SHA256:
|
46
|
+
git_hash_sha256_ctx_cleanup(&ctx->ctx.sha256);
|
47
|
+
return;
|
38
48
|
default:
|
39
49
|
/* unreachable */ ;
|
40
50
|
}
|
@@ -45,6 +55,8 @@ int git_hash_init(git_hash_ctx *ctx)
|
|
45
55
|
switch (ctx->algorithm) {
|
46
56
|
case GIT_HASH_ALGORITHM_SHA1:
|
47
57
|
return git_hash_sha1_init(&ctx->ctx.sha1);
|
58
|
+
case GIT_HASH_ALGORITHM_SHA256:
|
59
|
+
return git_hash_sha256_init(&ctx->ctx.sha256);
|
48
60
|
default:
|
49
61
|
/* unreachable */ ;
|
50
62
|
}
|
@@ -58,6 +70,8 @@ int git_hash_update(git_hash_ctx *ctx, const void *data, size_t len)
|
|
58
70
|
switch (ctx->algorithm) {
|
59
71
|
case GIT_HASH_ALGORITHM_SHA1:
|
60
72
|
return git_hash_sha1_update(&ctx->ctx.sha1, data, len);
|
73
|
+
case GIT_HASH_ALGORITHM_SHA256:
|
74
|
+
return git_hash_sha256_update(&ctx->ctx.sha256, data, len);
|
61
75
|
default:
|
62
76
|
/* unreachable */ ;
|
63
77
|
}
|
@@ -71,6 +85,8 @@ int git_hash_final(unsigned char *out, git_hash_ctx *ctx)
|
|
71
85
|
switch (ctx->algorithm) {
|
72
86
|
case GIT_HASH_ALGORITHM_SHA1:
|
73
87
|
return git_hash_sha1_final(out, &ctx->ctx.sha1);
|
88
|
+
case GIT_HASH_ALGORITHM_SHA256:
|
89
|
+
return git_hash_sha256_final(out, &ctx->ctx.sha256);
|
74
90
|
default:
|
75
91
|
/* unreachable */ ;
|
76
92
|
}
|
@@ -8,9 +8,9 @@
|
|
8
8
|
#ifndef INCLUDE_hash_h__
|
9
9
|
#define INCLUDE_hash_h__
|
10
10
|
|
11
|
-
#include "
|
11
|
+
#include "git2_util.h"
|
12
12
|
|
13
|
-
#include "hash/
|
13
|
+
#include "hash/sha.h"
|
14
14
|
|
15
15
|
typedef struct {
|
16
16
|
void *data;
|
@@ -19,12 +19,14 @@ typedef struct {
|
|
19
19
|
|
20
20
|
typedef enum {
|
21
21
|
GIT_HASH_ALGORITHM_NONE = 0,
|
22
|
-
GIT_HASH_ALGORITHM_SHA1
|
22
|
+
GIT_HASH_ALGORITHM_SHA1,
|
23
|
+
GIT_HASH_ALGORITHM_SHA256
|
23
24
|
} git_hash_algorithm_t;
|
24
25
|
|
25
26
|
typedef struct git_hash_ctx {
|
26
27
|
union {
|
27
28
|
git_hash_sha1_ctx sha1;
|
29
|
+
git_hash_sha256_ctx sha256;
|
28
30
|
} ctx;
|
29
31
|
git_hash_algorithm_t algorithm;
|
30
32
|
} git_hash_ctx;
|