diff options
-rw-r--r-- | src/curve25519.c | 20 | ||||
-rw-r--r-- | src/pki.c | 17 | ||||
-rw-r--r-- | src/pki_crypto.c | 31 | ||||
-rw-r--r-- | src/pki_ed25519_common.c | 11 | ||||
-rw-r--r-- | src/pki_gcrypt.c | 25 | ||||
-rw-r--r-- | src/pki_mbedcrypto.c | 13 | ||||
-rw-r--r-- | tests/unittests/torture_pki_ed25519.c | 6 | ||||
-rw-r--r-- | tests/unittests/torture_session_keys.c | 4 |
8 files changed, 97 insertions, 30 deletions
diff --git a/src/curve25519.c b/src/curve25519.c index c13b3604..d2517551 100644 --- a/src/curve25519.c +++ b/src/curve25519.c @@ -377,12 +377,12 @@ void ssh_server_curve25519_init(ssh_session session){ */ static SSH_PACKET_CALLBACK(ssh_packet_server_curve25519_init){ /* ECDH keys */ - ssh_string q_c_string; - ssh_string q_s_string; + ssh_string q_c_string = NULL; + ssh_string q_s_string = NULL; ssh_string server_pubkey_blob = NULL; /* SSH host keys (rsa,dsa,ecdsa) */ - ssh_key privkey; + ssh_key privkey = NULL; enum ssh_digest_e digest = SSH_DIGEST_AUTO; ssh_string sig_blob = NULL; int rc; @@ -402,7 +402,6 @@ static SSH_PACKET_CALLBACK(ssh_packet_server_curve25519_init){ SSH_FATAL, "Incorrect size for server Curve25519 public key: %zu", ssh_string_len(q_c_string)); - SSH_STRING_FREE(q_c_string); goto error; } @@ -460,12 +459,17 @@ static SSH_PACKET_CALLBACK(ssh_packet_server_curve25519_init){ /* add ecdh public key */ q_s_string = ssh_string_new(CURVE25519_PUBKEY_SIZE); if (q_s_string == NULL) { + ssh_set_error_oom(session); goto error; } - ssh_string_fill(q_s_string, - session->next_crypto->curve25519_server_pubkey, - CURVE25519_PUBKEY_SIZE); + rc = ssh_string_fill(q_s_string, + session->next_crypto->curve25519_server_pubkey, + CURVE25519_PUBKEY_SIZE); + if (rc < 0) { + ssh_set_error(session, SSH_FATAL, "Could not copy public key"); + goto error; + } rc = ssh_buffer_add_ssh_string(session->out_buffer, q_s_string); SSH_STRING_FREE(q_s_string); @@ -508,6 +512,8 @@ static SSH_PACKET_CALLBACK(ssh_packet_server_curve25519_init){ return SSH_PACKET_USED; error: + SSH_STRING_FREE(q_c_string); + SSH_STRING_FREE(q_s_string); ssh_buffer_reinit(session->out_buffer); session->session_state=SSH_SESSION_STATE_ERROR; return SSH_PACKET_USED; @@ -2238,8 +2238,12 @@ int ssh_pki_export_signature_blob(const ssh_signature sig, return SSH_ERROR; } - ssh_string_fill(str, ssh_buffer_get(buf), ssh_buffer_get_len(buf)); + rc = ssh_string_fill(str, ssh_buffer_get(buf), ssh_buffer_get_len(buf)); SSH_BUFFER_FREE(buf); + if (rc < 0) { + SSH_STRING_FREE(str); + return SSH_ERROR; + } *sig_blob = str; @@ -2558,7 +2562,10 @@ ssh_string ssh_pki_do_sign(ssh_session session, if (session_id == NULL) { return NULL; } - ssh_string_fill(session_id, crypto->session_id, crypto->digest_len); + rc = ssh_string_fill(session_id, crypto->session_id, crypto->digest_len); + if (rc < 0) { + goto end; + } /* Fill the input */ sign_input = ssh_buffer_new(); @@ -2619,7 +2626,11 @@ ssh_string ssh_pki_do_sign_agent(ssh_session session, if (session_id == NULL) { return NULL; } - ssh_string_fill(session_id, crypto->session_id, crypto->digest_len); + rc = ssh_string_fill(session_id, crypto->session_id, crypto->digest_len); + if (rc < 0) { + SSH_STRING_FREE(session_id); + return NULL; + } sig_buf = ssh_buffer_new(); if (sig_buf == NULL) { diff --git a/src/pki_crypto.c b/src/pki_crypto.c index 08409209..3c3e0a40 100644 --- a/src/pki_crypto.c +++ b/src/pki_crypto.c @@ -840,7 +840,11 @@ ssh_string pki_private_key_to_pem(const ssh_key key, goto err; } - ssh_string_fill(blob, buf->data, buf->length); + rc = ssh_string_fill(blob, buf->data, buf->length); + if (rc < 0) { + goto err; + } + BIO_free(mem); return blob; @@ -1411,6 +1415,7 @@ static ssh_string pki_dsa_signature_to_blob(const ssh_signature sig) const unsigned char *raw_sig_data = NULL; size_t raw_sig_len; + int rc; DSA_SIG *dsa_sig; @@ -1467,7 +1472,11 @@ static ssh_string pki_dsa_signature_to_blob(const ssh_signature sig) return NULL; } - ssh_string_fill(sig_blob, buffer, 40); + rc = ssh_string_fill(sig_blob, buffer, 40); + if (rc < 0) { + SSH_STRING_FREE(sig_blob); + return NULL; + } return sig_blob; @@ -1544,7 +1553,10 @@ static ssh_string pki_ecdsa_signature_to_blob(const ssh_signature sig) goto error; } - ssh_string_fill(sig_blob, ssh_buffer_get(buf), ssh_buffer_get_len(buf)); + rc = ssh_string_fill(sig_blob, ssh_buffer_get(buf), ssh_buffer_get_len(buf)); + if (rc < 0) { + goto error; + } SSH_STRING_FREE(r); SSH_STRING_FREE(s); @@ -1554,6 +1566,7 @@ static ssh_string pki_ecdsa_signature_to_blob(const ssh_signature sig) return sig_blob; error: + SSH_STRING_FREE(sig_blob); SSH_STRING_FREE(r); SSH_STRING_FREE(s); ECDSA_SIG_free(ecdsa_sig); @@ -1698,7 +1711,11 @@ static int pki_signature_from_dsa_blob(UNUSED_PARAM(const ssh_key pubkey), if (r == NULL) { goto error; } - ssh_string_fill(r, ssh_string_data(sig_blob), 20); + rc = ssh_string_fill(r, ssh_string_data(sig_blob), 20); + if (rc < 0) { + SSH_STRING_FREE(r); + goto error; + } pr = ssh_make_string_bn(r); ssh_string_burn(r); @@ -1711,7 +1728,11 @@ static int pki_signature_from_dsa_blob(UNUSED_PARAM(const ssh_key pubkey), if (s == NULL) { goto error; } - ssh_string_fill(s, (char *)ssh_string_data(sig_blob) + 20, 20); + rc = ssh_string_fill(s, (char *)ssh_string_data(sig_blob) + 20, 20); + if (rc < 0) { + SSH_STRING_FREE(s); + goto error; + } ps = ssh_make_string_bn(s); ssh_string_burn(s); diff --git a/src/pki_ed25519_common.c b/src/pki_ed25519_common.c index 9db14dac..7aa05269 100644 --- a/src/pki_ed25519_common.c +++ b/src/pki_ed25519_common.c @@ -214,6 +214,7 @@ int pki_ed25519_public_key_to_blob(ssh_buffer buffer, ssh_key key) ssh_string pki_ed25519_signature_to_blob(ssh_signature sig) { ssh_string sig_blob; + int rc; #ifdef HAVE_OPENSSL_ED25519 /* When using the OpenSSL implementation, the signature is stored in raw_sig @@ -235,11 +236,15 @@ ssh_string pki_ed25519_signature_to_blob(ssh_signature sig) } #ifdef HAVE_OPENSSL_ED25519 - ssh_string_fill(sig_blob, ssh_string_data(sig->raw_sig), - ssh_string_len(sig->raw_sig)); + rc = ssh_string_fill(sig_blob, ssh_string_data(sig->raw_sig), + ssh_string_len(sig->raw_sig)); #else - ssh_string_fill(sig_blob, sig->ed25519_sig, ED25519_SIG_LEN); + rc = ssh_string_fill(sig_blob, sig->ed25519_sig, ED25519_SIG_LEN); #endif + if (rc < 0) { + SSH_STRING_FREE(sig_blob); + return NULL; + } return sig_blob; } diff --git a/src/pki_gcrypt.c b/src/pki_gcrypt.c index 0373cdae..7f8b140e 100644 --- a/src/pki_gcrypt.c +++ b/src/pki_gcrypt.c @@ -1781,6 +1781,7 @@ ssh_string pki_signature_to_blob(const ssh_signature sig) gcry_sexp_t sexp; size_t size = 0; ssh_string sig_blob = NULL; + int rc; switch(sig->type) { case SSH_KEYTYPE_DSS: @@ -1828,7 +1829,11 @@ ssh_string pki_signature_to_blob(const ssh_signature sig) return NULL; } - ssh_string_fill(sig_blob, buffer, 40); + rc = ssh_string_fill(sig_blob, buffer, 40); + if (rc < 0) { + SSH_STRING_FREE(sig_blob); + return NULL; + } break; case SSH_KEYTYPE_RSA: sexp = gcry_sexp_find_token(sig->rsa_sig, "s", 0); @@ -1845,13 +1850,16 @@ ssh_string pki_signature_to_blob(const ssh_signature sig) if (sig_blob == NULL) { return NULL; } - ssh_string_fill(sig_blob, discard_const_p(char, s), size); - + rc = ssh_string_fill(sig_blob, discard_const_p(char, s), size); gcry_sexp_release(sexp); + if (rc < 0) { + SSH_STRING_FREE(sig_blob); + return NULL; + } break; case SSH_KEYTYPE_ED25519: - sig_blob = pki_ed25519_signature_to_blob(sig); - break; + sig_blob = pki_ed25519_signature_to_blob(sig); + break; case SSH_KEYTYPE_ECDSA_P256: case SSH_KEYTYPE_ECDSA_P384: case SSH_KEYTYPE_ECDSA_P521: @@ -1860,7 +1868,6 @@ ssh_string pki_signature_to_blob(const ssh_signature sig) ssh_string R; ssh_string S; ssh_buffer b; - int rc; b = ssh_buffer_new(); if (b == NULL) { @@ -1901,9 +1908,13 @@ ssh_string pki_signature_to_blob(const ssh_signature sig) return NULL; } - ssh_string_fill(sig_blob, + rc = ssh_string_fill(sig_blob, ssh_buffer_get(b), ssh_buffer_get_len(b)); SSH_BUFFER_FREE(b); + if (rc < 0) { + SSH_STRING_FREE(sig_blob); + return NULL; + } break; } #endif diff --git a/src/pki_mbedcrypto.c b/src/pki_mbedcrypto.c index cac357f8..720fe1de 100644 --- a/src/pki_mbedcrypto.c +++ b/src/pki_mbedcrypto.c @@ -845,8 +845,13 @@ ssh_string pki_signature_to_blob(const ssh_signature sig) return NULL; } - ssh_string_fill(sig_blob, ssh_buffer_get(b), ssh_buffer_get_len(b)); + rc = ssh_string_fill(sig_blob, ssh_buffer_get(b), ssh_buffer_get_len(b)); SSH_BUFFER_FREE(b); + if (rc < 0) { + SSH_STRING_FREE(sig_blob); + return NULL; + } + break; } case SSH_KEYTYPE_ED25519: @@ -1089,9 +1094,13 @@ static ssh_string rsa_do_sign_hash(const unsigned char *digest, return NULL; } - ssh_string_fill(sig_blob, sig, slen); + ok = ssh_string_fill(sig_blob, sig, slen); explicit_bzero(sig, slen); SAFE_FREE(sig); + if (ok < 0) { + SSH_STRING_FREE(sig_blob); + return NULL; + } return sig_blob; } diff --git a/tests/unittests/torture_pki_ed25519.c b/tests/unittests/torture_pki_ed25519.c index 07ccfd67..ff59b190 100644 --- a/tests/unittests/torture_pki_ed25519.c +++ b/tests/unittests/torture_pki_ed25519.c @@ -796,7 +796,8 @@ static void torture_pki_ed25519_verify(void **state){ assert_true(rc == SSH_OK); assert_non_null(pubkey); - ssh_string_fill(blob, ref_signature, ED25519_SIG_LEN); + rc = ssh_string_fill(blob, ref_signature, ED25519_SIG_LEN); + assert_int_equal(rc, 0); sig = pki_signature_from_blob(pubkey, blob, SSH_KEYTYPE_ED25519, SSH_DIGEST_AUTO); assert_non_null(sig); @@ -853,7 +854,8 @@ static void torture_pki_ed25519_verify_bad(void **state){ /* alter signature and expect false result */ for (i=0; i < ED25519_SIG_LEN; ++i){ - ssh_string_fill(blob, ref_signature, ED25519_SIG_LEN); + rc = ssh_string_fill(blob, ref_signature, ED25519_SIG_LEN); + assert_int_equal(rc, 0); ((uint8_t *)ssh_string_data(blob))[i] ^= 0xff; sig = pki_signature_from_blob(pubkey, blob, SSH_KEYTYPE_ED25519, SSH_DIGEST_AUTO); assert_non_null(sig); diff --git a/tests/unittests/torture_session_keys.c b/tests/unittests/torture_session_keys.c index f220e010..6ae58831 100644 --- a/tests/unittests/torture_session_keys.c +++ b/tests/unittests/torture_session_keys.c @@ -68,7 +68,9 @@ static void torture_session_keys(UNUSED_PARAM(void **state)) int rc; k_string = ssh_string_new(32); - ssh_string_fill(k_string, key, 32); + rc = ssh_string_fill(k_string, key, 32); + assert_int_equal(rc, 0); + test_crypto.shared_secret = ssh_make_string_bn(k_string); rc = ssh_generate_session_keys(&session); |