mirror of
https://git.libssh.org/projects/libssh.git
synced 2025-11-30 13:01:23 +03:00
pki_crypto.c: plug ecdsa_sig->[r,s] bignum leaks
Per ecdsa(3ssl), ECDSA_SIG_new does allocate its 'r' and 's' bignum fields. Fix a bug where the initial 'r' and 's' bignums were being overwritten with newly-allocated bignums, resulting in a memory leak. BUG: https://red.libssh.org/issues/175 Signed-off-by: Jon Simons <jon@jonsimons.org> Reviewed-by: Andreas Schneider <asn@cryptomilk.org>
This commit is contained in:
committed by
Andreas Schneider
parent
a48711ae7e
commit
4745d652b5
@@ -25,6 +25,7 @@
|
|||||||
#include "libssh/libgcrypt.h"
|
#include "libssh/libgcrypt.h"
|
||||||
|
|
||||||
bignum make_string_bn(ssh_string string);
|
bignum make_string_bn(ssh_string string);
|
||||||
|
void make_string_bn_inplace(ssh_string string, bignum bnout);
|
||||||
ssh_string make_bignum_string(bignum num);
|
ssh_string make_bignum_string(bignum num);
|
||||||
void ssh_print_bignum(const char *which,bignum num);
|
void ssh_print_bignum(const char *which,bignum num);
|
||||||
|
|
||||||
|
|||||||
@@ -81,6 +81,15 @@ bignum make_string_bn(ssh_string string){
|
|||||||
return bn;
|
return bn;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void make_string_bn_inplace(ssh_string string, bignum bnout) {
|
||||||
|
unsigned int len = ssh_string_len(string);
|
||||||
|
#ifdef HAVE_LIBGCRYPT
|
||||||
|
#error "unsupported"
|
||||||
|
#elif defined HAVE_LIBCRYPTO
|
||||||
|
bignum_bin2bn(string->data, len, bnout);
|
||||||
|
#endif
|
||||||
|
}
|
||||||
|
|
||||||
/* prints the bignum on stderr */
|
/* prints the bignum on stderr */
|
||||||
void ssh_print_bignum(const char *which, bignum num) {
|
void ssh_print_bignum(const char *which, bignum num) {
|
||||||
#ifdef HAVE_LIBGCRYPT
|
#ifdef HAVE_LIBGCRYPT
|
||||||
|
|||||||
@@ -1421,7 +1421,7 @@ ssh_signature pki_signature_from_blob(const ssh_key pubkey,
|
|||||||
ssh_print_hexa("r", ssh_string_data(r), ssh_string_len(r));
|
ssh_print_hexa("r", ssh_string_data(r), ssh_string_len(r));
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
sig->ecdsa_sig->r = make_string_bn(r);
|
make_string_bn_inplace(r, sig->ecdsa_sig->r);
|
||||||
ssh_string_burn(r);
|
ssh_string_burn(r);
|
||||||
ssh_string_free(r);
|
ssh_string_free(r);
|
||||||
if (sig->ecdsa_sig->r == NULL) {
|
if (sig->ecdsa_sig->r == NULL) {
|
||||||
@@ -1442,7 +1442,7 @@ ssh_signature pki_signature_from_blob(const ssh_key pubkey,
|
|||||||
ssh_print_hexa("s", ssh_string_data(s), ssh_string_len(s));
|
ssh_print_hexa("s", ssh_string_data(s), ssh_string_len(s));
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
sig->ecdsa_sig->s = make_string_bn(s);
|
make_string_bn_inplace(s, sig->ecdsa_sig->s);
|
||||||
ssh_string_burn(s);
|
ssh_string_burn(s);
|
||||||
ssh_string_free(s);
|
ssh_string_free(s);
|
||||||
if (sig->ecdsa_sig->s == NULL) {
|
if (sig->ecdsa_sig->s == NULL) {
|
||||||
|
|||||||
Reference in New Issue
Block a user