Commit Graph
100 Commits
Author SHA1 Message Date
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
Andrew Ayer bec9e7f318 Add parse_options helper for parsing cmd line args 2014-06-29 13:49:10 -07:00
Andrew Ayer f3390ff7ff Initial implementation of 'git-crypt status'
'git-crypt status' tells you which files are and aren't encrypted and
detects other problems with your git-crypt setup.

'git-crypt status -f' can be used to re-stage files that were incorrectly
staged unencrypted.

The UI needs work, and it needs to also output the overall repository
status (such as, is git-crypt even configured yet?), but this is a
good start.
2014-06-26 23:03:30 -07:00
Andrew Ayer e6bb66b93a Add touch_file() utility function 2014-06-26 23:03:30 -07:00
Andrew Ayer 38b43a4415 Make 'add-collab' safe with filenames starting with '-' 2014-06-26 23:03:30 -07:00
Andrew Ayer 20c0b18fa2 Add a minor TODO comment 2014-06-26 23:03:30 -07:00
Andrew Ayer 188a8c15fc Minor pedantic changes to I/O code
Don't bother checking for !in because the gcount() check is quite
sufficient and having both checks was confusing.

Make some variables const because they can be.
2014-06-26 23:03:30 -07:00
Andrew Ayer dcea03f0d7 Finish implementing Windows utility functions
This completes Windows support, except for the build system and
documentation.
2014-06-15 12:07:22 -07:00
Andrew Ayer 6e43b2a1cd New exec_command() that takes command as array instead of string
This abstracts away the details of argument quoting, which differs
between Unix and Windows.

Also replace all uses of the system() library call with exec_command().
Although system() exists on Windows, it executes the command via cmd.exe,
which has ridiculous escaping rules.
2014-06-12 21:23:04 -07:00
Andrew Ayer 0774ed018c Lay groundwork for Windows support
Move Unix-specific code to util-unix.cpp, and place Windows equivalents
in util-win32.cpp.  Most of the Windows functions are just stubs at
the moment, and we need a build system that works on Windows.
2014-06-12 21:23:02 -07:00
Andrew Ayer 22323bc3a5 In README, use HTTPS URI for git-crypt's website 2014-06-02 17:27:43 -07:00
Andrew Ayer d43a26ab0d Document Debian package building in INSTALL file 2014-04-01 21:54:45 -07:00
Andrew Ayer 8c77209d40 Fix include guards to not start with _
Since such names are reserved, technically.
2014-04-01 16:18:28 -07:00
Andrew Ayer b3e843cfc4 Fix include guards to not start with _
Since such names are reserved, technically.
2014-04-01 16:17:22 -07:00
Andrew Ayer 7b2604e79e Document git-crypt's new mailing lists in the README 2014-04-01 09:57:40 -07:00
Andrew Ayer 7fe8443238 Minor tidy-up of INSTALL file 2014-03-31 21:31:49 -07:00
Andrew Ayer 7687d11219 Initial GPG support
Run 'git-crypt add-collab KEYID' to authorize the holder of the given
GPG secret key to access the encrypted files.  The secret git-crypt key
will be encrypted with the corresponding GPG public key and stored in the
root of the Git repository under .git-crypt/keys.

After cloning a repo with encrypted files, run 'git-crypt unlock'
(with no arguments) to use a secret key in your GPG keyring to unlock
the repository.

Multiple collaborators are supported, however commands to list the
collaborators ('git-crypt ls-collabs') and to remove a collaborator
('git-crypt rm-collab') are not yet supported.
2014-03-28 14:02:25 -07:00
Andrew Ayer 2b5e4a752e Plug a file descriptor leak if fork() fails
(Not that we really care if that happens ;-) but it's good to be correct.)
2014-03-28 13:54:18 -07:00
Andrew Ayer b2bdc11330 Fix a typo in an error message 2014-03-28 13:53:12 -07:00
Andrew Ayer df838947a0 Use successful_exit() helper for testing system() return value 2014-03-28 13:52:33 -07:00
Andrew Ayer cd5f3534aa Rename some functions instead of overloading them
It's more clear this way.
2014-03-28 13:51:10 -07:00
Andrew Ayer 6a454b1fa1 Major revamp: new key paradigm, groundwork for GPG support
The active key is now stored in .git/git-crypt/key instead of being
stored outside the repo.  This will facilitate GPG support, where the
user may never interact directly with a key file.  It's also more
convenient, because it means you don't have to keep the key file
around in a fixed location (which can't be moved without breaking
git-crypt).

'git-crypt init' now takes no arguments and is used only when initializing
git-crypt for the very first time.  It generates a brand-new key, so
there's no longer a separate keygen step.

To export the key (for conveyance to another system or to a collaborator),
run 'git-crypt export-key FILENAME'.

To decrypt an existing repo using an exported key, run 'git-crypt unlock
KEYFILE'.  After running unlock, you can delete the key file you passed
to unlock.

Key files now use a new format that supports key versioning (which will
facilitate secure revocation in the future).

I've made these changes as backwards-compatible as possible.  Repos
already configured with git-crypt will continue to work without changes.
However, 'git-crypt unlock' expects a new format key.  You can use
the 'git-crypt migrate-key KEYFILE' command to migrate old keys to the
new format.

Note that old repos won't be able to use the new commands, like
export-key, or the future GPG support.  To migrate an old repo, migrate
its key file and then unlock the repo using the unlock command, as
described above.

While making these changes, I cleaned up the code significantly, adding
better error handling and improving robustness.

Next up: GPG support.
2014-03-23 11:40:29 -07:00
Andrew Ayer 2f02161042 Add utility functions for big-endian int storage
Use instead of htonl().
2014-03-22 11:41:18 -07:00
Andrew Ayer 73bf395b3b Makefile: add DESTDIR support to 'make install' 2014-01-04 10:51:12 -08:00
Andrew Ayer 34432e915e Use OpenSSL's RNG instead of /dev/random
Rationale:

 * /dev/random blocks unpredictably on Linux, leading to slow
   key generation.
 * OpenSSL's RNG is more cross-platform than /dev/(u)random.
   Some platforms might not have a (u)random device, or worse,
   have a /dev/(u)random that produces insecure random numbers
   (like Cygwin, apparently).
2013-12-30 14:37:21 -08:00
Andrew Ayer d1aad00a59 Load OpenSSL error strings in main()
So we can report errors from OpenSSL.
2013-12-30 14:33:51 -08:00
Andrew Ayer cbc2c6d388 Add missing return statement in main() 2013-12-30 14:33:31 -08:00
Andrew Ayer 9f20b8719c Fix a typo in a comment 2013-04-28 09:38:05 -07:00
Andrew Ayer 33f6d73a0c Improve usability of 'git-crypt keygen'
* Display message asking user to move the mouse, etc. to generate more
   entropy.
 * Disable buffering on the fstream so we don't read more randomness
   than we have to.
 * Refuse to overwrite an existing key file.
2013-04-28 09:36:17 -07:00
Andrew Ayer 9654cb6044 Tweak wording in README 2013-04-27 18:09:07 -07:00
Andrew Ayer 4d94b44be1 Enhance documentation
Add NEWS file, spin installation instructions into INSTALL file, and add
useful information from the git-crypt website to the README.
2013-04-05 17:00:03 -07:00
Andrew Ayer 2b936c74f1 Escape arguments to filter commands
This will allow both the path to git-crypt and the path to the key file
to contain arbitrary characters, notably spaces.
2013-04-04 18:53:03 -07:00
Andrew Ayer b10fbcd299 Fix 'git-crypt init' for newer versions of Git
At some point between Git 1.7.1 and Git 1.8.1.3, both 'git reset' and
'git status' stopped noticing that files were modified after their
smudge filter changed.  Consequentially, 'git reset --hard HEAD' would
not decrypt existing encrypted files in the repo.

This commit changes 'git-crypt init' to use 'git checkout -f HEAD
/top/of/repo' instead, which does the job.
2013-04-04 17:43:38 -07:00