Commit Graph

16 Commits

Author SHA1 Message Date
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
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
477983f4bc Ensure memsets of sensitive memory aren't optimized away 2014-07-23 19:32:30 -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
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
df838947a0 Use successful_exit() helper for testing system() return value 2014-03-28 13:52:33 -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
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
Andrew Ayer
490b7143b1 Update copyright notice to include OpenSSL linking exception 2013-03-05 12:02:49 -08:00
Andrew Ayer
d3dcc7da64 Set a safe umask before creating temporary files
Although glibc's implementation of mkstemp creates temporary files with
a safe (i.e. 0600) mode, POSIX does not mandate any particular mode.  So
to ensure maximum cross-platform safety, we must set a umask of 0077
before calling mkstemp.
2013-01-03 15:23:35 -08:00
Andrew Ayer
a2e3d160bd Add README and copyright notices 2012-11-29 11:03:45 -08:00
Andrew Ayer
0dcf864798 When encrypting, use temporary file if file gets too big 2012-07-16 16:57:05 -07:00
Andrew Ayer
6e3dd5a8d3 Initial version 2012-07-06 15:38:40 -07:00