| Commit message (Collapse) | Author | Age |
| |
|
|
|
|
|
|
| |
Generated with
sed -i 's|Copyright.*Andre Noll.*|SPDX-License-Identifier: GPL-2.0 */|g' *.c *.h
followed by manually tweaking the result a bit. No license change intended.
|
| |\
| |
| |
| |
| |
| |
| |
| |
| |
| | |
Remove support for PEM keys
A single patch which removes support for old style PEM keys. The old key
format has been deprecated since paraslash-0.7.3, released in March 2024.
* refs/heads/t/rm_pem:
Remove support for PEM private keys.
|
| | |
| |
| |
| |
| | |
This gets us rid of a couple of hand-written parsers, which can only be a
good thing. The shortstat says it all...
|
| |/
|
|
|
|
| |
This simplifies configure.ac because we can now get rid of the
NO_OPENSSL_THREAD_STOP and RSA_set0_key defines. openssl-1.1 is still
supported.
|
| |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| |
openssl-1.1 and later have OPENSSL_thread_stop() and RSA_set0_key(). We
plan to drop support for openssl-1.0 so that we can get rid of the autoconf
checks which create the preprocessor macros HAVE_OPENSSL_THREAD_STOP and
HAVE_RSA_SET0_KEY that indicate whether these functions exist. In fact,
there is already a commit in a (currently experimental) git branch which
removes the checks. Running autoconf on this branch, then switching to a
different branch, then running make(1) fails on systems with openssl-1.1 or
later because the macros are undefined, hence openssl-1.0 is assumed.
This is only an inconvenience and no bug, because the user is supposed
to re-run ./autogen.sh after switching to a different revision if the
checkout modifies autoconf related files such as configure.ac. However,
inverting the semantics of those macros, as implemented in this
commit, is simple enough and works around this inconvenience
nicely. On openssl-1.1 or later the new NO_OPENSSL_THREAD_STOP and
NO_RSA_SET0_KEY variables will be unset regardless of the branch that
was checked out when autoconf was run.
So let's merge this early, it'll save pain, time and energy.
|
| |\
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| | |
The series first drops the para_upgrade_db executable because it is no longer
needed. This removes the penultimate user of the sha1 infrastructure. The
remaining commits deal with the last user: the handshake between para_client
and para_server. Since paraslash-0.7.0, client and server employ sha256
by default, but fall back to sha1 in order to stay compatible to old 0.6.x
versions. After this series, server and client always employ sha256 as the
hash algorithm, breaking compatibility with 0.6.x clients. As a result,
the sha1 hash algorithm is no longer used anywhere, so the corresponding
infrastructure is no longer needed. This gets rid of a fair amount of code.
* refs/heads/t/rm_sha1:
Rename hash2 -> hash.
Remove sha1.
Remove para_upgrade_db.
aft: Compare the full hash, not just the first 20 bytes.
|
| | |
| |
| |
| |
| | |
Now that sha1 is no longer supported, the hash2 naming has become meaningless.
Rename it back to "hash".
|
| | |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| | |
Server and client prefer sha256 in the authentication protocol since
paraslash-0.7.0, while 0.6.x clients and servers only know about sha1. This
patch drops the compatibility code which enabled old clients to connect to
new servers and vice versa.
Now the client code no longer checks whether the sha256 feature is supported,
but requests and uses the feature unconditionally. The server still announces
the sha256 feature and accepts the corresponding feature request, but uses
sha256 unconditionally.
With this approach older 0.7.x clients are still compatible to current
server versions and current clients can still talk to servers running older
0.7.x versions.
|
| |/
|
|
|
|
| |
This leak happens only with openssl-1.1, where we call RSA_free() which does
not free the coefficient for the Chinese remainder theorem we extracted from
the key file.
|
| |
|
|
| |
Every .c file includes it anyway.
|
| |\
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| | |
The series starts with a few cleanups and crypto-backend tweaks to
beat the openssl specific code into shape for the main objective:
the switch of the RSA encryption and decryption routines to the
high-level EVP API. This has become necessary because the old RSA
API functions have been deprecated in openssl-3.
This merge conflicted against commit a18458cff51c (No longer check
for CRYPTO_cleanup_all_ex_data()). The resolution is to remove the
checks which that commit removed and to add the checks which commit
0485079436ad (openssl: Use the EVP library for RSA public encryption)
of this series introduced.
Cooking for four months.
* refs/heads/t/openssl-3:
openssl: Reactivate openssl warnings.
openssl: Use the EVP library for RSA private decryption.
openssl: Use the EVP library for RSA public encryption.
apc_priv_decrypt: Let the callee allocate the buffer.
apc_pub_encrypt: Let the callee allocate the buffer.
openssl: Assume that openssl allocation functions functions succeed.
openssl: Introduce openssl_perror().
openssl: Don't pass pointers to RSA structures around.
openssl: Kill rsa coefficient computations.
client: Check buffer size returned by apc_priv_decrypt().
|
| | |
| |
| |
| |
| |
| | |
This is the counterpart of the previous commit which converted the
public RSA encryption. We employ the HAVE_OSSL_PARAM macro again to
distinguish between the openssl-1 and openssl-3 cases.
|
| | |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| | |
Many functions related to RSA have been deprecated in openssl-3. Users
of the deprecated API are expected to switch to the high-level
cryptographic functions of the EVP library which ships together
with openssl.
Since openssl-1.0 is still supported and even openssl-1.1 lacks some
of the features we need for EVP, for example OSSL_PARAM_construct_BN(),
we check for this symbol at configure time and use #ifdefs in openssl.c
to compile the code conditionally depending on the value of the new
HAVE_OSSL_PARAM preprocessor macro. The code should work with both
old and new openssl versions.
apc_get_pubkey() used to call RSA_size() to obtain the key size in
bytes for the return value, but RSA_size() is one of the functions
that got deprecated in openssl-3. So modify read_public_key() to
return the number of bits of the modulus (rather than the constant
one), and use 1/8 of this number as the return value.
|
| | |
| |
| |
| |
| |
| |
| | |
This complements the previous commit which made the analogous
change for public encryption. Passing char ** instead of char * to
apc_priv_decrypt() allows us to get rid of the magic 1024 constant
in client_common.c.
|
| | |
| |
| |
| |
| |
| |
| |
| |
| |
| | |
Change the encryption routine of the apc API to allocate a suitably
sized buffer itself. Currently, the caller has to guess the size of the
buffer to pass to the function and we reuse our 4k handshake buffer for
that. While 4k is is plenty at the moment, that may change, and it's
always better to use the exact size if it is readily available. This
is the case here because the required buffer size is just the number
of bits of the modulus of the key.
|
| | |
| |
| |
| |
| |
| |
| | |
We do the same thing with malloc() and friends, so replace error
checking by assertions whenever OOM is the only possible error reason.
Also add assertions for EVP_MD_CTX_new(), whose return value was not
checked at all.
|
| | |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| | |
Openssl has a decent error reporting framework, but we only employ
it if get_random_bytes_or_die() fails. This patch abstracts out a
new helper which prints the error string of the earliest error code
from the thread's error queue. We make the helper return -E_OPENSSL
unconditionally as this simplifies callers a bit.
Only get_random_bytes_or_die() calls the new helper for now but
additional callers will be added in subsequent commits.
|
| | |
| |
| |
| |
| |
| | |
The RSA structure has been made opaque in openssl-3. As a preparation
for not using this structure any more, pass pointers to the containing
asymmetric key structure instead.
|
| | |
| |
| |
| |
| | |
There's no need to pre-compute the two exponents for the Chinese
Remainder Theorem calculations as openssl will do that for us.
|
| |/
|
|
|
|
|
| |
Recent openssl versions no longer declare this unless the openssl API
compatibility version is set explicitly, in which case it gets defined
as a macro which does nothing. Either way, the check in configure.ac
and the call in openssl.c can go away.
|
| |
|
|
|
|
| |
The order of the bignums stored in the private key is n, e, d, iqmp, p,
q. We read the bignums in this order, so assign the members of the RSA
structure in the same order. This does not really matter, but still..
|
| |
|
|
|
|
| |
The pointers to private key structures are all called "priv", but for
their public counterparts we often use "key" rather than "pub". Fix
that to improve readability.
|
| |
|
|
|
| |
The new name encodes the format of the key in the function name just
like the counterpart read_pem_private_key() does.
|
| |
|
|
| |
This makes clear that the function is only used for public encryption.
|
| |
|
|
|
|
| |
The API of this function is documented in crypt.h while the comment
in openssl.c describes openssl specific implementation details which
do not need doxygen annotations.
|
| |
|
|
|
| |
This is easy to do and gets rid of some warnings about depreciated APIs
(which got deactivated in the previous commit, but still).
|
| |
|
|
|
|
|
| |
Just because it's shorter and matches the naming of the new allocators
we are about to introduce. The bulk of this patch was created with
sed -i 's/para_malloc/alloc/g' *.c *.h yy/mp.y
|
| |
|
|
|
|
| |
This adds a second hash function which will replace sha1. Both openssl
and libgcrypt support sha256, so it is easy to do. There are no users
of the new functions so far, so this patch has no effect yet.
|
| |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| |
Without this, valgrind --leak-check=full --show-leak-kinds=all
complains about four memory blocks reachable at exit, see below.
The first leak is fixed by the new call to ERR_remove_thread_state(),
which frees the error queue of the current thread. To squash the
other three, the call to EVP_cleanup() is needed to remove all of
openssl's internal ciphers and digests.
To make this work on both openssl-1.0 and for openssl-1.1, we need
to add additional header checks for configure.
---
==2818== 12 bytes in 1 blocks are still reachable in loss record 1 of 4
==2818== at 0x40355EE: malloc (vg_replace_malloc.c:309)
==2818== by 0x41B887C: CRYPTO_malloc (in /usr/local/lib/libcrypto.so.1.0.0)
==2818== by 0x42459B7: lh_insert (in /usr/local/lib/libcrypto.so.1.0.0)
==2818== by 0x4248542: int_thread_set_item (in /usr/local/lib/libcrypto.so.1.0.0)
==2818== by 0x4249920: ERR_get_state (in /usr/local/lib/libcrypto.so.1.0.0)
==2818== by 0x424A255: ERR_put_error (in /usr/local/lib/libcrypto.so.1.0.0)
==2818== by 0x4222EF6: RSA_padding_check_PKCS1_OAEP_mgf1 (in /usr/local/lib/libcrypto.so.1.0.0)
==2818== by 0x422306A: RSA_padding_check_PKCS1_OAEP (in /usr/local/lib/libcrypto.so.1.0.0)
==2818== by 0x421F921: RSA_eay_private_decrypt (in /usr/local/lib/libcrypto.so.1.0.0)
==2818== by 0x804F2E9: apc_priv_decrypt (openssl.c:206)
==2818== by 0x804DB59: client_post_select (client_common.c:321)
==2818== by 0x804CC57: call_post_select (sched.c:80)
==2818== by 0x804CC57: sched_post_select (sched.c:106)
==2818== by 0x804CC57: schedule (sched.c:159)
==2818==
==2818== 64 bytes in 1 blocks are still reachable in loss record 2 of 4
==2818== at 0x40355EE: malloc (vg_replace_malloc.c:309)
==2818== by 0x41B887C: CRYPTO_malloc (in /usr/local/lib/libcrypto.so.1.0.0)
==2818== by 0x4245643: lh_new (in /usr/local/lib/libcrypto.so.1.0.0)
==2818== by 0x424811F: int_thread_get (in /usr/local/lib/libcrypto.so.1.0.0)
==2818== by 0x4248511: int_thread_set_item (in /usr/local/lib/libcrypto.so.1.0.0)
==2818== by 0x4249920: ERR_get_state (in /usr/local/lib/libcrypto.so.1.0.0)
==2818== by 0x424A255: ERR_put_error (in /usr/local/lib/libcrypto.so.1.0.0)
==2818== by 0x4222EF6: RSA_padding_check_PKCS1_OAEP_mgf1 (in /usr/local/lib/libcrypto.so.1.0.0)
==2818== by 0x422306A: RSA_padding_check_PKCS1_OAEP (in /usr/local/lib/libcrypto.so.1.0.0)
==2818== by 0x421F921: RSA_eay_private_decrypt (in /usr/local/lib/libcrypto.so.1.0.0)
==2818== by 0x804F2E9: apc_priv_decrypt (openssl.c:206)
==2818== by 0x804DB59: client_post_select (client_common.c:321)
==2818==
==2818== 96 bytes in 1 blocks are still reachable in loss record 3 of 4
==2818== at 0x40355EE: malloc (vg_replace_malloc.c:309)
==2818== by 0x41B887C: CRYPTO_malloc (in /usr/local/lib/libcrypto.so.1.0.0)
==2818== by 0x4245628: lh_new (in /usr/local/lib/libcrypto.so.1.0.0)
==2818== by 0x424811F: int_thread_get (in /usr/local/lib/libcrypto.so.1.0.0)
==2818== by 0x4248511: int_thread_set_item (in /usr/local/lib/libcrypto.so.1.0.0)
==2818== by 0x4249920: ERR_get_state (in /usr/local/lib/libcrypto.so.1.0.0)
==2818== by 0x424A255: ERR_put_error (in /usr/local/lib/libcrypto.so.1.0.0)
==2818== by 0x4222EF6: RSA_padding_check_PKCS1_OAEP_mgf1 (in /usr/local/lib/libcrypto.so.1.0.0)
==2818== by 0x422306A: RSA_padding_check_PKCS1_OAEP (in /usr/local/lib/libcrypto.so.1.0.0)
==2818== by 0x421F921: RSA_eay_private_decrypt (in /usr/local/lib/libcrypto.so.1.0.0)
==2818== by 0x804F2E9: apc_priv_decrypt (openssl.c:206)
==2818== by 0x804DB59: client_post_select (client_common.c:321)
==2818==
==2818== 400 bytes in 1 blocks are still reachable in loss record 4 of 4
==2818== at 0x40355EE: malloc (vg_replace_malloc.c:309)
==2818== by 0x41B887C: CRYPTO_malloc (in /usr/local/lib/libcrypto.so.1.0.0)
==2818== by 0x424988C: ERR_get_state (in /usr/local/lib/libcrypto.so.1.0.0)
==2818== by 0x424A255: ERR_put_error (in /usr/local/lib/libcrypto.so.1.0.0)
==2818== by 0x4222EF6: RSA_padding_check_PKCS1_OAEP_mgf1 (in /usr/local/lib/libcrypto.so.1.0.0)
==2818== by 0x422306A: RSA_padding_check_PKCS1_OAEP (in /usr/local/lib/libcrypto.so.1.0.0)
==2818== by 0x421F921: RSA_eay_private_decrypt (in /usr/local/lib/libcrypto.so.1.0.0)
==2818== by 0x804F2E9: apc_priv_decrypt (openssl.c:206)
==2818== by 0x804DB59: client_post_select (client_common.c:321)
==2818== by 0x804CC57: call_post_select (sched.c:80)
==2818== by 0x804CC57: sched_post_select (sched.c:106)
==2818== by 0x804CC57: schedule (sched.c:159)
==2818== by 0x804AB2D: main (client.c:656)
|
| |\
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| | |
A medium sized series which teaches both crypto backends about the
RFC4716 key format, which has become the default for ssh-keygen as
of openssh-7.8.
Was cooking for almost a year.
* refs/heads/t/ssh:
manual: Instruct the user to create RFC4716 keys.
openssl: Add support for RFC4716 keys
openssl: Move get_private_key() down.
gcrypt: Add support for RFC4716 private keys.
crypt: Rename decoding functions.
gcrypt: Introduce read_openssh_bignum().
gcrypt: Factor out read_pem_rsa_params().
gcrypt: Let read_bignum() return bits, not bytes.
gcrypt: Let decode_key() return blob size through additional argument.
gcrypt: Drop unnecessary arguments of decode_key().
|
| | |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| | |
The decode_private_key() helper of gcrypt.c base64-decodes the key
but does not read the RSA bignums. It is thus independent of gcrypt
and openssl. To add support for RFC4716 keys to the openssl backend,
we need to move it to crypt_common.c, making it a crypo backend
function. That is, non-static and declared in crypt_backend.h. The
patch also documents the function using doxgen comments.
With decode_private_key() and find_openssh_bignum_offset() to
our disposal, supporting RFC4716 keys is simple. We only need to
initialize the openssl-specific rsa structure with the six bignums
stored in a private RFC4716 key. This is implemented in the new
read_private_rsa_params() which calls the existing read_bignum()
six times.
The fields of the rsa structure are exposed to applications in
openssl-1.0, but the structure was made opaque in openssl-1.1. We
use the existing HAVE_RSA_SET0_KEY macro to decide whether or not
we must use the accessor functions of openssl-1.1 to initialize the
rsa structure.
|
| | |
| |
| |
| |
| |
| |
| | |
Prep patch for supporting RFC4716 keys. The function now comes after
read_bignum() and thus may call it.
Pure code movement, no actual changes.
|
| | |
| |
| |
| |
| |
| |
| |
| | |
decode_ssh_key() and decode_key() operate on public and private keys
respectively. This should be obvious from the naming. Also, the
two functions will soon be grouped together in the same file. The
inconsistent naming would even increase the possible confusion,
so it's better to rename the functions now.
|
| |/
|
|
|
|
| |
FreeBSD 12 does not seem to have it. This is not fatal since omitting
the call to CRYPTO_cleanup_all_ex_data() just results in a harmless
memory leak at exit.
|
| |
|
|
|
| |
If an error occurs while reading the second bignum we leak the memory
allocated for the first bignum.
|
| |
|
|
|
|
|
|
|
|
| |
This plugs a few harmless memory leaks in the openssl crypto
backend. The leaks occur on exit and are only reported by valgrind
if it is run with --leak-check=full --show-leak-kinds=all.
The gcrypt backend has similar problems, but there is no way to
provide a similar patch for libgrypt. The newly added comment in
gcrypt.c explains why.
|
| |
|
|
|
|
|
|
|
|
|
| |
This renames the functions and constants of the public crypto API
which deal with RSA to have the common "apc" (asymmetric pubkey
cryptosystem) prefix. This hides RSA as an implementation detail
and makes it clear that the functions/constants are related to apc.
Pure renaming, no semantic change. The only other changes are a new
comment to crypt.h and a \ref statement in the doxygen comment of
apc_free_pubkey().
|
| |
|
|
|
|
|
|
|
|
|
|
| |
The openssl and grypt implementations of this function share quite
some code. This patch factors out the common code into the new
decode_ssh_key() helper of crypt_common.c. Both implementations are
changed to call the new helper.
As a side effect of this change, all callers of is_ssh_rsa_key()
and check_ssh_key_header() now reside in crypt_common.c, so we can
make these two functions static and remove their declarations from
crypt_backend.h.
|
|
|
The old name made sense back when we had only one crypto backend. These
days paraslash can be compiled against either openssl or gcrypt,
so the new name makes it clear that the file is only compiled in if
the openssl library was selected as the crypto backend.
|