Commit Graph
100 Commits
Author SHA1 Message Date
Andrew Ayer bc7e55b68f Prepare 0.5.0 release 2015-05-30 19:53:04 -07:00
Andrew Ayer f56911726a Makefile: refine man page rules
Rename HAS_DOCBOOK option to ENABLE_MAN.

Allow xsltproc to fetch the Docbook stylesheet from the Internet if it's
not installed locally.  This will hopefully make it easier for folks
to build the man page.
2015-05-30 19:52:29 -07:00
Andrew Ayer 9bbd39c491 Add instructions for building man page to INSTALL 2015-05-30 19:09:17 -07:00
Andrew Ayer 5dc55c3b2a Makefile: refine man page rules 2015-05-30 19:09:01 -07:00
Andrew Ayer ba250b87ad Add copyright notice to Makefile 2015-05-30 19:09:01 -07:00
Andrew Ayer 83b58eafa7 Overhaul Makefile
Support building the man page, but only if HAS_DOCBOOK variable set to "yes"
2015-05-30 19:09:01 -07:00
Andrew Ayer b4569ae6c1 Add man page 2015-05-28 21:24:16 -07:00
Andrew Ayer 0a2e633d7f Recommend Git 1.8.5 or newer for best performance
Since older versions of Git have to spawn a separate
check-attr process for every file in the repository,
which is slow.
2015-05-25 15:26:32 -07:00
Andrew Ayer ca98d1aed1 Minor README tweaks 2015-05-25 15:25:44 -07:00
Andrew Ayer 4acb4205eb git_version: cache the Git version
(to avoid repeated invocations of `git version`)
2015-05-24 18:58:13 -07:00
Andrew Ayer 1988ee3819 Speed up lock/unlock by using single git check-attr process
Previously, lock/unlock needed to spawn a separate `git check-attr`
process for every single file in the repository (whether encrypted
or not).  This was extremely inefficient, especially on Windows.

Now, git-crypt spawns a single `git check-attr` process and communicates
with it over stdin.  In a repository with thousands of files, this
results in a speedup of nearly 100x.

This relies on the --stdin and -z options to `git check-attr`, which
were only added in Git 1.8.5 (released 27 Nov 2013).  With older versions
of Git, git-crypt falls back to the old and slower code.
2015-05-24 18:55:58 -07:00
Andrew Ayer 44f70e6b48 Add Coprocess class
It provides a convenient way to spawn a process and read from/write to
its stdin/stdout.
2015-05-24 18:54:11 -07:00
Andrew Ayer 3db6271492 Re-license parse_options under X11 license 2015-05-17 14:38:12 -07:00
Andrew Ayer c279a6a20a Add helpers to faciliate Git version comparison
This will be useful as we start to gate code on the version of Git that's installed.
2015-05-16 21:10:44 -07:00
Andrew Ayer 439bcd852d Write a helper function to get the version of Git
This will be useful as we start to gate code on the version of Git that's installed.

A lot of code out in the wild seems to assume that the output of `git version`
is "git version $VERSION", so I'm assuming it's safe for git-crypt to rely
on that too.
2015-05-14 22:23:21 -07:00
Andrew Ayer 7880b30e8c Update INSTALL file
Streamline the instructions a bit.  Mention the Debian/Ubuntu and
RHEL/CentOS packages for each dependency.
2015-04-24 20:53:19 -07:00
Andrew Ayer 3104508adf Add --trusted option to gpg-add-user
If this option is specified, then the GPG users are added even
if their keys are not trusted by GPG.

In addition, if a full fingerprint, prefixed by 0x, is specified,
it is assumed to be trusted, regardless of its trust level in the
GPG trustdb.
2015-03-31 20:24:13 -07:00
Andrew Ayer ad71c7ffae FIx GPG key lookup with with-fingerprint enabled in gpg.conf
When the with-fingerprint option is enabled, the gpg command invoked by
git-crypt to look up a GPG user ID returns a fingerprint for both primary
keys and sub-keys.  Previously, this misled git-crypt into thinking that
the user ID matched more than one public key.  Now, git-crypt ignores
fingerprints for sub-keys.
2015-03-31 19:41:19 -07:00
Andrew Ayer 3ce5c83b2d Wrap long lines in README 2015-03-17 15:08:58 -07:00
Andrew Ayer 6d6e96f82b Clarify security section in README 2015-03-17 15:08:35 -07:00
Andrew Ayer c3ab393f17 Add notes to the README about symlinks, sub-modules 2015-03-15 13:55:18 -07:00
Andrew Ayer 6abf9c6956 Ignore non-files when running git ls-files
Non-files (symlinks and gitlinks (used by sub-modules)) cannot be
encrypted, so we shouldn't try messing with them.  This fixes `git-crypt
status` when used on a repository with sub-modules or symlinks when the
path to the sub-module or symlink has the git-crypt attribute (which
can happen inadvertently when using wildcards in .gitattributes).
2015-03-15 13:34:31 -07:00
Andrew Ayer ede1461563 Makefile: create destination directories in make install 2015-03-10 08:29:31 -07:00
Andrew Ayer 1b3f13643c Use opendir/readdir instead of scandir
scandir is a relatively recent addition to POSIX and is not available on
older versions of Mac OS X.  opendir/readdir should be more portable.
2015-02-26 22:51:40 -08:00
Andrew Ayer 8c130d3a00 Fix syntax error in commands.cpp 2015-02-09 11:42:22 -08:00
Andrew Ayer 012d78e1fe Add "do not edit" comment to .git-crypt/.gitattributes file 2015-02-09 11:37:50 -08:00
Andrew Ayer 99d4408f9e README: Add note about GitHub for Mac breakage 2015-02-09 11:37:19 -08:00
Andrew Ayer c2de1e2194 Add --force option to 'git-crypt lock'
It will force a lock even if working directory is unclean.  Useful
for deconfiguring git-crypt if you've accidentally unlocked with the
wrong key or gotten into a similarly sticky situation.
2015-02-07 13:27:58 -08:00
Andrew Ayer 85635ae0b1 touch_file, remove_file: ignore non-existent files 2015-02-07 13:22:30 -08:00
Andrew Ayer 18d3cfeca9 Remove some dead code 2015-02-07 12:57:52 -08:00
Andrew Ayer 0c8dae2375 Only run git_deconfig if Git configuration exists
This will let us run 'git lock' even if no filters are configured.

This logic is more complicated than I would like because running
'git config --remove-section' on a non-existent section results in
a noisy error (with text printed to stderr and an exit code of 128)
instead of a quiet error like the other 'git config' commands.
2015-02-07 12:54:07 -08:00
Andrew Ayer fc583c7d4f Add helper to get exit status of command 2015-02-07 12:43:17 -08:00
Andrew Ayer c850d65242 Change "unconfigure" to "deconfigure" 2015-02-07 12:15:53 -08:00
Andrew Ayer f5d36f0008 Fix wording of 'git-crypt lock' error message.
Thanks to Elliot Saba.
2015-02-07 08:52:07 -08:00
Andrew Ayer 1ca8f89602 Prepare for 0.4.2 release 2015-01-31 19:20:05 -08:00
Andrew Ayer 5fd36a7ac5 Increase minimum supported Git version to 1.7.2
Previously, git-crypt claimed to support Git as old as 1.6.0 (albeit
with degraded operation).  However, this has not been true for some time,
since Git 1.6.0 does not support the --porcelain option to `git status`.

Since Git 1.7.2 was the first version of Git to support filters with
`git blame`, was released almost five years ago (in July 2010), and is
even in Debian Squeeze, it seems like a good minimum version to require.
2015-01-27 21:26:51 -08:00
Andrew Ayer d5670c9552 Force Git to check out files by touching their mtimes
Starting with Git 2.2.2, `git checkout -f HEAD` no longer checks out
files if their mtimes haven't changed.  This causes files to remain
encrypted in the work tree after running `git-crypt unlock`, and to
remain decrypted after running `git-crypt lock`'.

To fix this, git-crypt now figures out what files are encrypted (by
checking `git check-attr` on every file output by `git ls-files`),
touches those files, and then runs `git checkout` on them.
2015-01-27 21:15:07 -08:00
Andrew Ayer 2d2053296f Fix placement of quotes in an error message 2015-01-27 21:06:29 -08:00
Andrew Ayer 216aa27009 Add helper function to get attribute name for a given key 2015-01-27 21:04:58 -08:00
Andrew Ayer 02c52ab21a Disable message about unimplemented ls-gpg-users command 2015-01-27 21:04:22 -08:00
Andrew Ayer 849401d733 Update for git-crypt 0.4.1 2015-01-07 20:23:28 -08:00
Andrew Ayer 12881f65fd Add 'git-crypt version' command 2015-01-07 20:23:07 -08:00
Andrew Ayer b7c608da25 Add .gitattributes file to .git-crypt dir to prevent encryption
Previously, if you had a .gitattributes file in the root of your
repository that matched `*`, the files under .git-crypt would also be
encrypted, rendering the repository un-decryptable, unless you explicitly
excluded the .git-crypt directory, which was easy to overlook.

Now, `git-crypt add-gpg-user` automatically adds a .gitattributes file
to the .git-crypt directory to prevent its encryption.

IMPORTANT: If you are currently using GPG mode to encrypt an entire
repository, it is strongly advised that you upgrade git-crypt and then
do the following to ensure that the files inside .git-crypt are stored
properly:

 1. Remove existing key files: `rm .git-crypt/keys/*/0/*`
 2. Re-add GPG user(s): `git-crypt add-gpg-user GPG_USER_ID ...`
2015-01-02 10:35:57 -08:00
Andrew Ayer 9cb1ad3c33 Add some helpers for getting paths to state directories 2015-01-02 10:30:47 -08:00
Andrew Ayer 1b1715b5ec README: use https URLs for mailing lists 2014-11-26 09:42:10 -08:00
Andrew Ayer 2b0cc1b5ac Update README, NEWS, write release notes for 0.4 2014-11-16 17:29:17 -08:00
Andrew Ayer 3d53bce1a8 Add .gitattributes file to ignore .git files when creating archive 2014-11-16 17:29:09 -08:00
Andrew Ayer be237fe27d Fix formatting in NEWS.md 2014-11-16 17:25:02 -08:00
Andrew Ayer 6520746bce Update 'git-crypt help' message
Documented new arguments to 'git-crypt migrate-key' and adjusted spacing.
2014-11-15 20:31:01 -08:00
Andrew Ayer 3bf7d8e512 migrate-key: take separate arguments for old key and new key
I don't want to encourage people to overwrite their old keys
until they've successfully unlocked their repository with the
migrated key.
2014-11-15 20:30:35 -08:00
Andrew Ayer bd262f6126 Add documentation for multiple keys 2014-11-15 18:06:36 -08:00
Andrew Ayer cf990dc9df Minor formatting updates to README 2014-11-15 18:06:23 -08:00
Andrew Ayer e70d067b48 Rearrange a couple paragraphs in the README 2014-09-21 12:00:31 -07:00
Andrew Ayer 4796a1e288 Clarify some wording in README 2014-09-21 12:00:31 -07:00
Andrew Ayer e4d1091e97 Rename add-gpg-key command, etc. to add-gpg-user, etc.
While writing the documention, I found that "GPG user" was less confusing
terminology than "GPG key," since you aren't really adding a "key"
to git-crypt, and git-crypt already uses "key" to refer to other concepts
(cf. the -k/--key-name options).
2014-09-21 12:00:31 -07:00
Andrew Ayer 04906c5355 Write a usage message for every command
You can run 'git-crypt help COMMAND' to see it.
2014-09-21 12:00:31 -07:00
Andrew Ayer 24fff1ce6f Document experimental Windows support 2014-09-21 12:00:31 -07:00
Andrew Ayer acc3d2ecb3 Fix capitalization of git-crypt in INSTALL.md 2014-09-21 12:00:31 -07:00
Andrew Ayer 9e340b510d Document GPG mode in README 2014-09-21 12:00:31 -07:00
Andrew Ayer 0538d111fc Usage message: refer to gpg key argument as "user ID" not "key ID"
This is the terminology that the gpg man page uses.
2014-09-21 12:00:31 -07:00
Andrew Ayer 746bb5def3 Remove unlink_internal_key function
I think it's simpler this way.
2014-09-21 12:00:31 -07:00
Andrew Ayer 16c4a827c0 Error message if you try to lock repository that's not locked 2014-09-21 12:00:31 -07:00
Andrew Ayer 3799a23aa7 Add missing argument when throwing System_error 2014-09-21 12:00:31 -07:00
Andrew Ayer e9e90fc873 For consistency, always use NULL internally to represent the default key 2014-09-21 12:00:31 -07:00
Andrew Ayer 88e8e3a265 Display error if both -k and -a options passed to git-crypt lock 2014-09-21 12:00:31 -07:00
Andrew Ayer 690dba2f14 Add multi-platform remove_file helper
And use it for deleting internal keys
2014-09-21 12:00:31 -07:00
Andrew Ayer 70879eaf57 Tweak git-crypt usage message
* Change the wording for 'git-crypt lock'.
 * Move 'git-crypt lock' to 'Common commands' section since it's
   common to both GPG and symmetric mode.
 * Reduce whitespace in the output so it fits in 80 characters.
2014-09-21 12:00:31 -07:00
Andrew Ayer 42aa7db245 Credit Michael Schout in THANKS file 2014-09-21 12:00:31 -07:00
Andrew Ayer 316e194f84 README: document problems with Atlassian SourceTree 2014-09-21 12:00:31 -07:00
Andrew Ayer 8460d00bbf README: add notes about gitattributes 2014-09-21 12:00:31 -07:00
Andrew Ayer 4495af1274 README: update security and limitations sections 2014-09-21 12:00:31 -07:00
Andrew Ayer 9c190a5a89 Add CONTRIBUTING and THANKS files 2014-09-09 09:00:35 -07:00
Andrew Ayer 9f59cc23b9 Merge branch 'revamp' into 'master'
Conflicts:
	Makefile
2014-09-06 19:32:55 -07:00
Andrew Ayer 725f442ce4 Remove a TODO comment
I've decided not to do it
2014-09-06 17:25:31 -07:00
Andrew Ayer adaea41d4e add-gpg-key: add -n/--no-commit option to inhibit committing 2014-09-06 17:25:05 -07:00
Andrew Ayer e37566f180 status: properly detect files encrypted with alternative key names 2014-09-06 15:43:00 -07:00
Andrew Ayer 10622f6dcc Raise an error if legacy key file has trailing data 2014-09-06 14:59:16 -07:00
Andrew Ayer f50feec2dd Display helpful information when smudge detects an unencrypted file 2014-09-06 14:59:12 -07:00
Andrew Ayer 8b159b543f Avoid possible undefined behavior with empty std::vector
In particular, &bytes[0] is undefined if bytes is empty.
2014-08-18 14:12:34 -07:00
Andrew Ayer b07f49b9b3 smudge: if file is not encrypted, just copy through clear text
Since Git consults the checked-out .gitattributes instead of the
.gitattributes in effect at the time the file was committed, Git
may invoke the smudge filter on old versions of a file that were
committed without encryption.
2014-08-06 19:04:17 -07:00
Andrew Ayer 07231c1630 Set 'required' option on Git filter to true
This signals to Git that the filter must complete successfully for the
content to be usable.
2014-08-02 21:34:17 -07:00
Andrew Ayer da25322dbc Remove stubs for profile support
Multiple key support provides the functionality I was planning to provide
with profiles.
2014-08-02 21:23:52 -07:00
Andrew Ayer 47e810d592 Write and use create_protected_file() helper
Instead of using umask to ensure sensitive files are created with
restrictive permissions, git-crypt now does:

	create_protected_file(filename);
	std::ofstream out(filename);
	// ...

create_protected_file can have different Unix and Windows implementations.
create_protected_file should be easier to implement on Windows than a
umask equivalent, and this pattern keeps the amount of platform-specific
code to a minimum and avoids #ifdefs.
2014-08-02 21:18:28 -07:00
Andrew Ayer 01f152b746 Check HMAC in smudge and diff commands
Git-crypt's position has always been that authentication is best left
to Git, since 1) Git provides immutable history based on SHA-1 hashes
as well as GPG-signed commits and tags, and 2) git-crypt can't be used
safely anyways unless the overall integrity of your repository is assured.

But, since git-crypt already has easy access to a (truncated) HMAC of the
file when decrypting, there's really no reason why git-crypt shouldn't
just verify it and provide an additional layer of protection.
2014-08-02 21:17:17 -07:00
Andrew Ayer 9e791d97ee Factor out some common code into a helper function 2014-07-23 19:55:50 -07:00
Andrew Ayer 477983f4bc Ensure memsets of sensitive memory aren't optimized away 2014-07-23 19:32:30 -07:00
Andrew Ayer 23ff272f7d Simplify CTR code 2014-07-23 19:23:39 -07:00
Andrew Ayer 8de40f40b3 Wipe AES key from memory after using it 2014-07-23 19:23:39 -07:00
Andrew Ayer 22bae167b0 Make Aes_impl and Hmac_impl private member classes 2014-07-23 19:23:39 -07:00
Andrew Ayer 0210fd7541 Use auto_ptr instead of explicit memory management 2014-07-23 19:23:39 -07:00
Andrew Ayer f6e3b63a93 Makefile: avoid use of non-standard $^ 2014-07-07 21:49:12 -07:00
Andrew Ayer d417f97f8e Make argv arrays const 2014-07-05 14:22:55 -07:00
Andrew Ayer 3d0e7570ed Update usage message 2014-07-05 11:46:58 -07:00
Andrew Ayer 3fe85bc928 Rename add-collab, etc. to add-gpg-key, etc.
Since GPG support might be used by a single user and not necessarily
among collaborators.
2014-07-05 11:46:51 -07:00
Andrew Ayer 2ba7f0e374 unlock: decrypt all possible keys when using GPG
It's no longer necessary to specify the -k option to unlock when
using GPG.  unlock will automatically decrypt all keys which the user
can access.
2014-07-02 22:12:18 -07:00
Andrew Ayer f03d972937 Add get_directory_contents utility function 2014-07-02 22:10:09 -07:00
Andrew Ayer 4af0a0cfc1 Avoid unsafe integer signedness conversions when loading key file 2014-07-02 22:09:13 -07:00
Andrew Ayer 3511033f7f Make key files extensible, store key name in key file
Storing the key name in the key file makes it unnecessary to pass the
--key-name option to git-crypt unlock.

This breaks compatibility with post-revamp keys.  On the plus side,
keys are now extensible so in the future it will be easier to make
changes to the format without breaking compatibility.
2014-06-29 22:10:04 -07:00
Andrew Ayer 3c8273cd4b Add .gpg filename extension to in-repo encrypted keys
This will help distinguish keys encrypted with GPG from keys encrypted by
other means.  (For example, a future version of git-crypt might support
passphrase-encrypted keys.)
2014-06-29 16:14:16 -07:00
Andrew Ayer 1afa71183e Initial implementation of multiple key support
The init, export-key, add-collab, and unlock commands now
take an optional -k (equivalently, --key-name) option to
specify an alternative key.  Files can be encrypted with
the alternative key by specifying the git-crypt-KEYNAME filter
in .gitattributes.  Alternative key support makes it possible
to encrypt different files with different keys.

Note that the -k option to unlock is temporary.  Unlock
will eventually auto-detect the name of the key you're
unlocking, either by looking in the symmetric key file,
or by scanning the .git-crypt/keys directory.

Note that the layout of the .git/git-crypt and .git-crypt
directories has changed as follows:

 * .git/git-crypt/key is now .git/git-crypt/keys/default
 * .git-crypt/keys is now .git-crypt/keys/default
2014-06-29 16:00:27 -07:00