Make argv arrays const
Makefile: avoid use of non-standard $^
Pull out openssl code into separate `crypto-openssl.cpp` file

This will allow the use of different crypto libraries in the future.

Modified-by: Andrew Ayer <agwa@andrewayer.name>

  * Don't include openssl/err.h from git-crypt.cpp
  * Fix whitespace and other style to conform to project conventions
  * Remove unnecessary operators from Aes_ctr_encryptor
  * Rename crypto_init to init_crypto, for consistency with init_std_streams()
Use auto_ptr instead of explicit memory management
Make Aes_impl and Hmac_impl private member classes
Wipe AES key from memory after using it
Simplify CTR code
Ensure memsets of sensitive memory aren't optimized away
Factor out some common code into a helper function
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.
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.
Remove stubs for profile support

Multiple key support provides the functionality I was planning to provide
with profiles.
Set 'required' option on Git filter to true

This signals to Git that the filter must complete successfully for the
content to be usable.
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.
Avoid possible undefined behavior with empty std::vector

In particular, &bytes[0] is undefined if bytes is empty.
Display helpful information when smudge detects an unencrypted file
Raise an error if legacy key file has trailing data
status: properly detect files encrypted with alternative key names
add-gpg-key: add -n/--no-commit option to inhibit committing
Remove a TODO comment

I've decided not to do it